Cartes
La carte d’offre, la carte de réalisation, la cellule de rôle, les colonnes de prix.
La carte d’offre
Le nom en étiquette, ce que le patron gagne en titre, une phrase, le prix, le bouton, et en bas la scène de l’offre annotée de ses technologies. Au survol, la cellule pâlit, une lueur suit le pointeur et la scène s’approche.
- Emploi
- Présenter une offre : sur l’accueil, et dans la page des offres.
- Moment
- Dans une Grille de classe tr-offres, une carte par offre, dans l’ordre de V3.offres.cartes, et des cellules allumées pour finir la dernière rangée de trois s’il y manque des cartes.
- Jamais
- Avec un prix dans le titre ou sur le bouton. Avec plus de trois annotations. Seule, hors d’une grille.
- Site internet
Un site qui transforme les visites en demandes.
Trouvé sur Google, et simple à mettre à jour vous-même.
À partir de 5 000 €
Voir l’offre - IA et automatisation
Une IA branchée sur votre métier.
Des agents reliés à vos outils préparent le travail, vous validez.
À partir de 8 000 €
Voir l’offre
const offres = await getCollection('offres')
const technos = (id) => offres.find((o) => o.id === id)?.data.technos ?? []
/* Trois colonnes : ce qui manque pour finir la rangée s'allume (aucune cellule avec six offres). */
const ALLUMEES = (3 - (V3.offres.cartes.length % 3)) % 3
<Grille classe="tr-offres">
{ V3.offres.cartes.map((o) => (
<Carte id={ o.id } nom={ o.nom } titre={ o.titre } texte={ o.texte } bouton={ V3.offres.bouton } technos={ technos(o.id) } />
)) }
{ Array.from({ length: ALLUMEES }).map(() => <CelluleAllumee />) }
</Grille>
<!-- L’accueil ne passe pas le prix ; la page des offres le passe (prix={ o.prix }). --> | Classe | Zone | Valeur |
|---|---|---|
| .tr-carte | la carte | flex en colonne, gap 10 px ; data-reveal, data-lueur |
| .tr-carte .tr-etq | le nom | étiquette sans bord ni fond, var(--ink-3) |
| .tr-carte h3 | le gain | margin-top 4 px ; max-width 19ch ; min-height 2.36em, deux lignes réservées pour que les cartes s’alignent |
| .tr-carte > p | la phrase | var(--ink-2), interligne 1.55 |
| .tr-prix | le prix | Inter 600 14,5 px/1.45, chiffres de tableau, var(--ink) ; margin-top 4 px ; il s’affiche, il n’argumente pas |
| .tr-carte .btn | le bouton | au trait, petit, calé à gauche, margin-top 6 px ; aria-label « Voir l’offre » suivi du nom |
| .tr-carte__scene | la scène | 300 px de haut, poussée en bas par margin-top auto, padding-top 16 px ; 220 px sous 480 px ; la scène en contain ; ses annotations ancrées sur les objets du dessin (trame/annotations.ts) : la boîte est alors un conteneur de taille |
| Puce | les annotations | les technos de la fiche, trois au plus, la deuxième en vert ; ancrées sur les objets de l’illustration (ANCRES_OFFRES dans trame/annotations.ts), sinon aux anciennes places, 4 %/8 %, 58 %/18 %, 10 %/84 % ; data-stagger 150 |
| Classe | Zone | Valeur |
|---|---|---|
| .tr-carte:hover, :focus-within | le fond | var(--pale), en 380 ms var(--ease) |
| .tr-carte::before | la lueur | un cercle de 280 px à --mx/--my, var(--grinn) à 38 % fondu à 70 % ; opacité 0 à 1 en 420 ms |
| data-lueur | le pointeur | --mx et --my posés par trame.ts, à la souris seulement : rien au doigt, rien en mouvement réduit |
| .tr-carte:hover .tr-carte__scene | la scène | une illustration v2 : la boîte entière, dessin et annotations, à scale 1.04 en 700 ms var(--ease), pour que les traits restent sur leurs objets ; une ancienne scène : scale(1.06) sur le dessin seul |
| mouvement réduit | sans | ni transition du fond, ni approche de la scène |
La carte de réalisation
L’offre en étiquette, le client en titre, une phrase, puis l’image du cas. Sur l’accueil, depuis le 13 octobre, c’est la vitrine du cas, celle des petites cartes par trois de la page Réalisations (format petite, 16/11, sans puce) ; sans vitrine passée, la photo du produit en service, ou sa réserve tant qu’elle n’est pas fournie (les preuves d’une page d’offre). Quand le cas a sa page et que le client est nommé, toute la carte est le lien, vitrine comprise. La page Réalisations ne l’emploie plus depuis le 12 octobre : elle a la sienne, CarteCas.
- IA et automatisation
Bosco Services
Un assistant lit les demandes d’intervention, retrouve le client dans leur logiciel métier, et prépare la fiche et le devis. Une personne valide.
- E-commerce
Clotilde Davenne
La boutique Shopify d’un domaine de Chablis. Cinq appellations, le retrait au domaine, et les règles de la vente de vin prévues dès le départ.
const realisations = await getCollection('realisations')
const c = realisations.find((r) => r.id === 'clotilde-davenne')
<Grille classe="tr-cas">
<Cas vitrine={ { cas: c, reserve: P.realisations.reserve } } nom={ c.data.client } etiquette="Boutique en ligne"
resume={ c.data.resume } href={ c.data.page ? '/realisations/' + c.id + '/' : null } logo={ c.id } />
</Grille>
<!-- Sans vitrine (les preuves d’une page d’offre) : photo={ c.id }, statut et brief, la réserve photo. --> | Classe | Zone | Valeur |
|---|---|---|
| .tr-cas__it | la carte | flex en colonne, gap 10 px ; data-reveal, data-lueur ; h3 clamp(19px, 1.5vw, 22px) |
| .tr-cas__it .tr-etq | l’offre | sans bord ni fond, var(--ink-3) ; le libellé d’offre de la fiche (V3.realisations.offreLibelle) |
| .tr-cas__it h3 a | le client | couleur héritée ; souligné var(--grinn-deep) au survol, décalé de .18em ; la flèche ↗ suit |
| .tr-cas__lien::after | le lien | inset 0 : toute la cellule est cliquable ; au-dessus de la vitrine (z-index 3) ; au survol, fond var(--pale), lueur, flèche à (3px, -3px) |
| .small | la phrase | interligne 1.5 ; le résumé fixé par V3, sinon celui de la fiche ; rien pour le cas anonyme |
| vitrine | l’image (accueil) | la fiche et P.realisations.reserve ; Vitrine format petite, comme la petite carte de CarteCas (cartes par trois ; celles de l’accueil le sont dès 1000 px) : 16/11, sans puce, le navigateur à 84 % ; 4/3 sous 720 px ; sans accord du client, ni capture ni adresse ; poussée en bas, alignée sur la rangée, 18 px au moins sous la phrase |
| .tr-cas__vit | au survol | survol de la carte ou focus du lien : la matière à 1.08, le cadre soulevé de 6 px (8 px le téléphone) ; une carte sans lien (sur l’accueil : IE Architecture) : au survol de la vitrine seule ; jamais en mouvement réduit |
| photo, statut, brief | sans vitrine | la réserve photo (EmplacementPhoto, 16/10, variante courte) : les preuves d’une page d’offre |
La carte vitrine, le cas en largeur, la petite carte et la cellule d’appel de la page Réalisations sont dans Page Réalisations.
La cellule de rôle
Dans la grille de l’équipe, chaque rôle a sa cellule : un titre, une phrase, et l’illustration du rôle en bas. Quatre rôles, quatre illustrations, sous la photo de groupe.
Le chef de projet
Votre interlocuteur unique, du premier échange au suivi.
Le design UX/UI
Les parcours et les écrans, pensés pour être utiles.
<Grille element="div" classe="tr-equipe">
{/* la cellule tr-equipe__photo d’abord */}
{ V3.equipe.roles.map((r) => (
<Cellule element="div" classe="tr-role">
<h3>{ r.nom }</h3>
<p class="small">{ r.texte }</p>
<Scene nom={ r.scene } />
</Cellule>
)) }
</Grille> | Classe | Zone | Valeur |
|---|---|---|
| .tr-role | la cellule | flex en colonne |
| .tr-role h3 | le rôle | clamp(19px, 1.5vw, 22px) |
| .tr-role .small | la phrase | margin-top 8 px ; interligne 1.5 ; max-width 40ch |
| .tr-role .tr-scene | la scène | poussée en bas par margin-top auto ; padding-top 14 px ; hauteur clamp(180px, 16vw, 220px) ; en contain |
| .tr-equipe | la grille | 1 ; 2 dès 700 px, la photo de groupe sur toute la largeur ; 4 dès 1000 px, la photo toujours sur toute la largeur, en 2/1, et les quatre rôles en rangée dessous |
| illustrations | les quatre | role-chef-de-projet, role-design, role-strategie, role-dev, dans l’ordre de V3.equipe.roles (sa clé scene) : des SVG v2, un outil par métier sur le même socle |
Les colonnes du suivi
Un titre, le prix en Outfit vert profond, une phrase. Trois cellules côte à côte, l’une sous l’autre au téléphone. Le prix s’affiche, il n’argumente pas : il vient de marque.ts.
Un mois offert
Offert après la mise en ligne
Hébergement, sécurité et bugs corrigés. À la fin du mois, un point sur le trafic et une étude SEO.
Vous reprenez la main
0 €
On vous remet le code, les accès et la documentation.
Vous nous le confiez
À partir de 250 € par mois
On continue d’héberger, de sécuriser et de corriger, sans durée d’engagement et avec un mois de préavis.
<Tarifs colonnes={ V3.suivi.colonnes } /> | Classe | Zone | Valeur |
|---|---|---|
| .tr-suivi | la grille | 1 ; 2 dès 700 px ; var(--n) dès 1000 px, --n le nombre de colonnes (4 au plus), posé par Tarifs : 3 pour le suivi ; data-stagger 80, data-lignes |
| .tr-suivi__col | la colonne | flex en colonne, gap 12 px ; h3 clamp(18px, 1.4vw, 21px) |
| .tr-suivi__prix | le prix | Outfit 800 clamp(22px, 1.9vw, 27px)/1.1, -.03em, chiffres de tableau, var(--grinn-deep) |
| .tr-suivi__col .small | la phrase | interligne 1.5 ; poussée en bas par margin-top auto |
| colonnes | les données | V3.suivi.colonnes : titre, prix, texte |
| .tr-suivi__dessin | la scène du suivi | padding 0, la scène en cover à scale(1.2) : une règle de grinn.css qu’aucune page n’emploie ; l’accueil pose le dôme à la place |
La cellule allumée dans une grille
Les engagements font cinq cellules sur quatre colonnes : deux cellules allumées pour finir la rangée. Les offres font six cartes sur trois colonnes : leurs rangées sont pleines, aucune cellule allumée. La cellule allumée est une cellule pâle où cinq carrés verts s’allument l’un après l’autre, puis respirent. Elle est décorative et disparaît sous 600 px.
-
Un devis écrit, et pas de facture surprise
Le devis dit ce qui est compris et ce qui ne l’est pas. Si le projet change en route, on chiffre l’écart avant de s’y mettre.
-
Les clés sont à vous
Le code, les accès, vos comptes de publicité et la documentation vous appartiennent. Vous les récupérez quand vous voulez, et vous partez avec.
-
Un non franc, et une bonne adresse
Si votre budget ou votre projet ne nous correspondent pas, on vous le dit dès le premier échange, et on vous oriente vers quelqu’un de mieux placé.
<Engagements liste={ V3.engagements.liste } />
<!-- Engagements pose une cellule par engagement, puis ce qui manque pour finir la rangée de quatre, deux cellules allumées au plus :
const allumees = Math.min((4 - (liste.length % 4)) % 4, 2)
{ Array.from({ length: allumees }).map(() => <CelluleAllumee />) } --> | Classe | Zone | Valeur |
|---|---|---|
| CelluleAllumee | l’appel | element li par défaut, ou div ; aria-hidden ; en dernier enfant de la grille |
| .tr-cel--allume | la cellule | fond var(--pale), min-height 120 px ; masquée sous 600 px |
| Engagements, Grille tr-offres | où | après les cinq engagements : deux cellules allumées, posées par Engagements (ce qui manque pour finir la rangée de quatre, deux au plus) ; après les six cartes d’offre : aucune cellule allumée, la page pose ce qui manque pour finir la rangée de trois |
Les carrés, leurs positions et leurs durées sont dans Bandes et cellules allumées.
RègleUne carte dit le gain en titre, montre le prix sans l’argumenter, et finit par sa scène ou sa photo.