From 3052a7e909cbc425a8d674db7f8e2001947f0771 Mon Sep 17 00:00:00 2001 From: ordinarthur <@arthurbarre.js@gmail.com> Date: Sun, 10 May 2026 14:48:17 +0200 Subject: [PATCH] feat(landing): brand "Rubis.pro" + corrections copy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Brand : suffixe `sur l'ongle` → `.pro` (attaché, muted, non italique). Propagé partout via `` — header/footer landing, topbar/sidebar SPA, login/signup/onboarding. Renforce l'identification brand requise par Google OAuth (gem seul jugé trop générique). - Hero : dots groupés avec leur label (inline-flex) — ne se baladent plus en début de ligne au flex wrap. Ajout d'un topbar mock "Rubis.pro · Tableau de bord" en haut de la carte hero pour identifier le mock comme un vrai dashboard. `DSO` → `DSO*`. - Stats : "Trois chiffres qui devraient vous fâcher" → "Trois chiffres exorbitants". Sous-titre remplacé par "Et vous faites sûrement partie intégrante de ces enquêtes." (plus direct, moins gratuit). - Promise : "Votre temps vaut plus que ça" → "Votre temps est plus précieux". Réécriture de l'amorce ("votre boîte / lundis soirs" → "votre entreprise / journées"). Ajout d'une ligne italique "Parfois moins, si votre plan par défaut est bien réglé". - HowItWorks : Step 01 — suppression de "à la caisse" et de ", RIB" (l'OCR ne lit pas le RIB en V1). Step 03 — "La machine fait le reste" → "L'algorithme fait le reste". - Gamification : suppression de "Pas un PDF abscons" (jargon inutile) et de "Et oui, on garde un classement amical" (le classement n'est pas en V1). `DSO` → `DSO*`. - Footnotes : ajout de la définition DSO (Days Sales Outstanding) sous celle d'OCR. Co-Authored-By: Claude Opus 4.7 --- .../src/components/sections/Footnotes.tsx | 8 ++- .../src/components/sections/Gamification.tsx | 4 +- apps/landing/src/components/sections/Hero.tsx | 50 ++++++++++++------- .../src/components/sections/HowItWorks.tsx | 4 +- .../src/components/sections/Promise.tsx | 7 ++- .../landing/src/components/sections/Stats.tsx | 5 +- packages/ui/src/components/Brand.tsx | 20 +++----- 7 files changed, 57 insertions(+), 41 deletions(-) diff --git a/apps/landing/src/components/sections/Footnotes.tsx b/apps/landing/src/components/sections/Footnotes.tsx index 2ccc8e0..f54be66 100644 --- a/apps/landing/src/components/sections/Footnotes.tsx +++ b/apps/landing/src/components/sections/Footnotes.tsx @@ -1,13 +1,19 @@ export function Footnotes() { return ( ); diff --git a/apps/landing/src/components/sections/Gamification.tsx b/apps/landing/src/components/sections/Gamification.tsx index c696e44..f5fbf63 100644 --- a/apps/landing/src/components/sections/Gamification.tsx +++ b/apps/landing/src/components/sections/Gamification.tsx @@ -16,7 +16,7 @@ export function Gamification() {

À chaque relance que Rubis envoie à votre place, vous gagnez un rubis. À la fin du mois, vous voyez exactement combien d'heures vous avez récupérées. Pas un graphique - de DSO. Pas un PDF abscons. Du temps. Concret. + de DSO*. Du temps. Concret.

@@ -35,7 +35,7 @@ export function Gamification() {

- Et oui, on garde un classement amical. Les meilleurs utilisateurs libèrent{" "} + Les meilleurs utilisateurs libèrent{" "} 30 heures par mois. Plus de quoi prendre un long week-end. Toutes les 4 semaines.

diff --git a/apps/landing/src/components/sections/Hero.tsx b/apps/landing/src/components/sections/Hero.tsx index a47ccfd..68ecf73 100644 --- a/apps/landing/src/components/sections/Hero.tsx +++ b/apps/landing/src/components/sections/Hero.tsx @@ -1,4 +1,4 @@ -import { Button, Eyebrow, Gem, cn } from "@rubis/ui"; +import { Brand, Button, Eyebrow, Gem, cn } from "@rubis/ui"; import { Check } from "lucide-react"; const APP_URL = "https://app.rubis.pro"; @@ -52,10 +52,14 @@ export function Hero() { 30 jours gratuits puis Free 5 factures - - Hébergement souverain - - Made in France 🇫🇷 + + + Hébergement souverain + + + + Made in France 🇫🇷 + @@ -68,22 +72,31 @@ export function Hero() {
- {/* Hero rubis */} -
- -
-
- 124 rubis -
-
- ≈ 24 h 48 que vous n'avez pas passées à relancer. + {/* Topbar mock — identifie la carte comme un dashboard Rubis.pro, + pas juste un widget de chiffres flottants. */} +
+ + + Tableau de bord + +
+ +
+ {/* Hero rubis */} +
+ +
+
+ 124 rubis +
+
+ ≈ 24 h 48 que vous n'avez pas passées à relancer. +
-
{/* KPIs */}
@@ -100,7 +113,7 @@ export function Hero() {
- DSO + DSO*
38 j @@ -135,6 +148,7 @@ export function Hero() {
+
{/* Badge flottant — relatif au wrapper carte (max-w 480) */} diff --git a/apps/landing/src/components/sections/HowItWorks.tsx b/apps/landing/src/components/sections/HowItWorks.tsx index f138c98..c285cc6 100644 --- a/apps/landing/src/components/sections/HowItWorks.tsx +++ b/apps/landing/src/components/sections/HowItWorks.tsx @@ -17,7 +17,7 @@ export function HowItWorks() { @@ -47,7 +47,7 @@ export function HowItWorks() { Pendant que vous travaillez, Rubis envoie les emails au moment prévu, suit qui a ouvert, qui n'a pas répondu, et avant chaque relance vous demande discrètement par email : « Cette facture a-t-elle été réglée ? ». Vous répondez en deux secondes. - La machine fait le reste. + L'algorithme fait le reste.

} > diff --git a/apps/landing/src/components/sections/Promise.tsx b/apps/landing/src/components/sections/Promise.tsx index 34fbfc5..42a073c 100644 --- a/apps/landing/src/components/sections/Promise.tsx +++ b/apps/landing/src/components/sections/Promise.tsx @@ -7,14 +7,14 @@ export function Promise() {
Notre conviction
- Votre temps vaut plus que ça. + Votre temps est plus précieux.

- Vous n'avez pas créé votre boîte pour passer vos lundis soirs à rédiger des + Vous n'avez pas créé votre entreprise pour passer vos journées à rédiger des relances polies. Pendant que vous écrivez "je me permets un petit rappel concernant…", vous ne facturez pas, vous ne vendez pas, vous ne créez pas.

@@ -24,6 +24,9 @@ export function Promise() { moins de 3. Soit 5 heures de votre vie récupérées. Toutes les semaines. Pour toujours.

+

+ Parfois moins, si votre plan par défaut est bien réglé. +

diff --git a/apps/landing/src/components/sections/Stats.tsx b/apps/landing/src/components/sections/Stats.tsx index 074c946..a3c3e69 100644 --- a/apps/landing/src/components/sections/Stats.tsx +++ b/apps/landing/src/components/sections/Stats.tsx @@ -25,11 +25,10 @@ export function Stats() {
L'état des paiements en France

- Trois chiffres qui devraient vous fâcher. + Trois chiffres exorbitants.

- Si vous lisez ça, vous avez probablement une facture impayée à l'heure où on parle. - Vous n'êtes pas un cas isolé. + Et vous faites sûrement partie intégrante de ces enquêtes.

diff --git a/packages/ui/src/components/Brand.tsx b/packages/ui/src/components/Brand.tsx index ae338c7..574a179 100644 --- a/packages/ui/src/components/Brand.tsx +++ b/packages/ui/src/components/Brand.tsx @@ -2,8 +2,11 @@ import { cn } from "../lib/cn.js"; import { Gem } from "./Gem.js"; /** - * Lockup horizontal : ◆ + "Rubis" (+ optionnel "sur l'ongle" en suffixe italique muted). - * À utiliser dans les headers, le sidebar, les emails. + * Lockup horizontal : ◆ + "Rubis" (+ optionnel suffixe ".pro" muted, attaché + * au wordmark sans espace). À utiliser dans les headers, le sidebar, les + * emails. Le suffixe rend le mark identifiant (cf. exigence Google OAuth : + * un logo doit "identifier la marque de manière unique" — la gem seule + * est trop générique). * * Architecture : on s'appuie sur le composant SVG — pas de PNG, pas * de border externe. La pierre EST le logo. Plus rien ne casse à l'export @@ -13,7 +16,7 @@ import { Gem } from "./Gem.js"; * Cf. /docs/marque.md §2 et le pattern de la landing. */ type BrandProps = { - /** Affiche le suffixe "sur l'ongle" en italique muted. */ + /** Affiche le suffixe ".pro" attaché au wordmark, en couleur muted. */ withSuffix?: boolean; /** * Taille de la gem en pixels. Default 22 (lockup) ou 32 (onlyImage). @@ -54,16 +57,7 @@ export function Brand({ Rubis - {withSuffix && ( - - sur l'ongle - - )} + {withSuffix && .pro} );