Aller au contenu
Démarrer un projet
Menu

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
SpécimenDeux cartes dans une grille tr-offres : Site internet et IA, leurs technos lues dans les fiches, et le prix tel que la page des offres le pose (l’accueil ne le passe pas).
Appelsrc/components/trame/Carte.astro
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 }). -->
L’anatomie
ClasseZoneValeur
.tr-cartela carteflex en colonne, gap 10 px ; data-reveal, data-lueur
.tr-carte .tr-etqle nométiquette sans bord ni fond, var(--ink-3)
.tr-carte h3le gainmargin-top 4 px ; max-width 19ch ; min-height 2.36em, deux lignes réservées pour que les cartes s’alignent
.tr-carte > pla phrasevar(--ink-2), interligne 1.55
.tr-prixle prixInter 600 14,5 px/1.45, chiffres de tableau, var(--ink) ; margin-top 4 px ; il s’affiche, il n’argumente pas
.tr-carte .btnle boutonau trait, petit, calé à gauche, margin-top 6 px ; aria-label « Voir l’offre » suivi du nom
.tr-carte__scenela scène300 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
Puceles annotationsles 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
Le survol
ClasseZoneValeur
.tr-carte:hover, :focus-withinle fondvar(--pale), en 380 ms var(--ease)
.tr-carte::beforela lueurun cercle de 280 px à --mx/--my, var(--grinn) à 38 % fondu à 70 % ; opacité 0 à 1 en 420 ms
data-lueurle 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__scenela scèneune 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éduitsansni 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.

SpécimenDeux cas de l’accueil, chacun avec sa vitrine : Bosco Services, nommé, l’accord du client donné, lié à sa page (toute la carte est le lien, vitrine comprise), sa vitrine en réserve, « Capture à fournir » ; Clotilde Davenne, liée à sa page, sa capture dans sa vitrine.
Appelsrc/components/trame/Cas.astro
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. -->
ClasseZoneValeur
.tr-cas__itla carteflex en colonne, gap 10 px ; data-reveal, data-lueur ; h3 clamp(19px, 1.5vw, 22px)
.tr-cas__it .tr-etql’offresans bord ni fond, var(--ink-3) ; le libellé d’offre de la fiche (V3.realisations.offreLibelle)
.tr-cas__it h3 ale clientcouleur héritée ; souligné var(--grinn-deep) au survol, décalé de .18em ; la flèche ↗ suit
.tr-cas__lien::afterle lieninset 0 : toute la cellule est cliquable ; au-dessus de la vitrine (z-index 3) ; au survol, fond var(--pale), lueur, flèche à (3px, -3px)
.smallla phraseinterligne 1.5 ; le résumé fixé par V3, sinon celui de la fiche ; rien pour le cas anonyme
vitrinel’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__vitau survolsurvol 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, briefsans vitrinela 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.

SpécimenDeux des quatre rôles de l’accueil, avec leur scène, dans une grille tr-equipe, sans la photo.
Appelsrc/pages/index.astro
<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>
ClasseZoneValeur
.tr-rolela celluleflex en colonne
.tr-role h3le rôleclamp(19px, 1.5vw, 22px)
.tr-role .smallla phrasemargin-top 8 px ; interligne 1.5 ; max-width 40ch
.tr-role .tr-scenela scènepoussée en bas par margin-top auto ; padding-top 14 px ; hauteur clamp(180px, 16vw, 220px) ; en contain
.tr-equipela grille1 ; 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
illustrationsles quatrerole-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.

SpécimenLes trois colonnes du suivi de l’accueil.
Appelsrc/components/trame/Tarifs.astro
<Tarifs colonnes={ V3.suivi.colonnes } />
ClasseZoneValeur
.tr-suivila grille1 ; 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__colla colonneflex en colonne, gap 12 px ; h3 clamp(18px, 1.4vw, 21px)
.tr-suivi__prixle prixOutfit 800 clamp(22px, 1.9vw, 27px)/1.1, -.03em, chiffres de tableau, var(--grinn-deep)
.tr-suivi__col .smallla phraseinterligne 1.5 ; poussée en bas par margin-top auto
colonnesles donnéesV3.suivi.colonnes : titre, prix, texte
.tr-suivi__dessinla scène du suivipadding 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.

  1. 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.

  2. 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.

  3. 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é.

SpécimenLes trois derniers engagements, numérotés comme sur l’accueil, et une cellule allumée qui ferme la rangée de quatre.
Appelsrc/components/trame/CelluleAllumee.astro
<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 />) } -->
ClasseZoneValeur
CelluleAllumeel’appelelement li par défaut, ou div ; aria-hidden ; en dernier enfant de la grille
.tr-cel--allumela cellulefond var(--pale), min-height 120 px ; masquée sous 600 px
Engagements, Grille tr-offresoù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.