Source de vérité

Venacity Design System

Tous les composants, variables et animations partagés dans l'écosystème VNCT, dans la nouvelle direction artistique irisée (rose → violet → cyan, glassmorphism, fond animé). Showroom interactif — toggle dark / light et rejoue les animations pour voir le système réagir en direct.

v2.5.0-f9acb3fa

Démarrage

Utilisation

Le DS v2 est servi sous le chemin versionné /v2/ et consommé de façon centralisée par chaque service VNCT (plus de copie locale). Le paramètre ?v= vient du champ version de /version.json, au format semver-hash (ex. 2.1.1-4f3a9c21) : le hash de contenu change dès qu'un fichier v2 change, donc Cloudflare ne peut plus servir une copie périmée — même sans bump semver. La string est opaque pour les apps : elles la recopient telle quelle.

<link rel="stylesheet" href="https://design.vena.city/v2/vnct-design-system.css?v=2.1.1-4f3a9c21">
<script src="https://design.vena.city/v2/vnct-common.js?v=2.1.1-4f3a9c21"></script>

Exemple documentaire — le hash réel varie à chaque changement des fichiers v2 ; il est récupéré dynamiquement via /version.json, jamais recopié à la main.

Contrat d'intégration complet (helper de version, placeholders, checklist) sur MIGRATION.md.

Section 1

Fondations

Les tokens visuels qui composent le système : couleurs, typographie, espacements, radius, ombres et easings. Tout dérive de variables CSS résolues à l'exécution selon le thème actif (data-theme) et l'accent (data-accent).

Couleurs 16 tokens

--accent reste une couleur plate (rose en sombre, cyan en clair). La signature irisée rose → violet → cyan est portée par le gradient --gradient-iris et les utilitaires .vnct-iris-text / .vnct-iris-fill / .vnct-iris-border (le titre ci-dessus en est un exemple).

Typographie échelle ~1.25

--text-5xl
Aa Display
--text-4xl
Aa Hero
--text-3xl
Aa H1
--text-2xl
Aa H2
--text-xl
Aa H3
--text-lg
Aa Lead
--text-base
Aa Paragraphe (16px)
--text-sm
Aa Secondaire
--text-xs
Aa Légende

Espacements échelle 4px

Border radius 6 niveaux

--radius-sm · 8px
--radius-md · 14px
--radius-lg · 18px
--radius-xl · 22px
--radius-2xl · 28px
--radius-full · 999px

Ombres / néon 3 + 3 niveaux

--shadow-elevation-1
--shadow-elevation-2
--shadow-elevation-3
--neon-shadow-sm
--neon-shadow-md
--neon-shadow-lg

Easings / durées 4 courbes

--ease-smooth
--ease-spring
--ease-out-expo
linear

Durées : --duration-fast (150ms) · --duration-normal (250ms) · --duration-slow (400ms)

Section 2

Composants existants

Composants déjà déployés dans l'écosystème VNCT.

Boutons primary · secondary · ghost · danger

Cards

Card standard

Conteneur classique

Contenu de la card. Texte d'exemple sur plusieurs lignes pour illustrer la mise en forme du body.

Card interactive

Avec hover effect

Cette card réagit au hover (élévation + bordure accent).

Inputs / Forms

Ce champ est requis.

Callouts v1.0.3

Info. Information neutre ou contextuelle utile à l'utilisateur.
Success. Action effectuée avec succès, état positif confirmé.
Warning. Attention requise — action à vérifier ou conséquence non triviale.
Danger. Erreur critique ou action irréversible — confirmer avant de continuer.

Toasts success · error · warning · info

Progress bars

Animation déclenchée par le bouton Rejouer.

Beta banners

Cette fonctionnalité est en beta — merci de remonter tout problème via Sema.

Animations d'apparition 8 délais staggered

vnct-appear--hero
vnct-appear (delay 0.1s)
vnct-appear (delay 0.2s)
vnct-appear (delay 0.3s)
vnct-appear--subtle (delay 0.4s)
vnct-appear (delay 0.5s)

Stagger automatique avec .vnct-stagger sur le parent (jusqu'à 12 enfants).

Modals JS

API : VNCT.Modal.open({ title, body, isHtml?, footer? }) et VNCT.Modal.close(). Esc et clic overlay ferment automatiquement.

FAB & Késako auto-monté Déprécié 2.1.0

Déprécié depuis 2.1.0. Remplacé par le header flottant + le menu overflow « … » et la modale VNCT.Feedback. Toujours supporté (auto-monté), retrait prévu en v3. Voir Chrome applicatif.

Le FAB (Floating Action Button) est monté automatiquement par vnct-common.js sur chaque page. Il propose un menu à trois entrées : Késako (présentation du service), Signaler un bug et Suggestion. Les deux derniers ouvrent un formulaire qui pousse vers Sema avec fallback webhook Discord.

Pour personnaliser le contenu de Késako, déclare un <template data-kesako-content> n'importe où dans la page. Son innerHTML sera injecté dans la modal Késako quand l'utilisateur clique. Sans template, un fallback générique s'affiche.

<template data-kesako-content>
  <p>Bienvenue sur <strong>MonService</strong> !</p>
  <p>Description courte de ce que fait l'outil et comment l'utiliser.</p>

  <hr style="margin-top: var(--space-5); border: none; border-top: 1px solid var(--border-default);">
  <p style="margin-top: var(--space-4); color: var(--text-secondary); font-weight: var(--font-medium);">🔍 Pour les curieux</p>
  <p style="margin-top: var(--space-3); color: var(--text-muted); font-size: var(--text-sm);">
    Détails techniques, mentions de l'écosystème, lien vers Atlas, etc.
  </p>

  <div style="margin-top: var(--space-5); display: flex; justify-content: center;">
    <button class="vnct-btn vnct-btn--primary" onclick="VNCT.Modal.close()">Compris !</button>
  </div>
</template>

À configurer côté service : VNCT.config.serviceName, VNCT.config.serviceVersion, VNCT.config.devReportUrl.

Hero landing v1.3.0

ServiceOS

Tagline du service en une phrase courte et claire.

Logo en clamp(2.5rem, 6vw, 3.75rem), suffixe accent dans <span>. Pattern extrait des services en v1.3.0 — remplace .atlas-hero__logo, .lyra .logo, etc.

Lore — origine du nom v1.3.0

D'où vient le nom ?

Lyra est la constellation de la lyre d'Orphée, le musicien légendaire dont la musique transcendait toutes les barrières. Un lien musical sur une plateforme ne devrait pas y rester prisonnier. Lyra prend un lien depuis n'importe quel service de streaming et le rend accessible sur tous les autres. Une musique, un lien, toutes les plateformes. Partage musical universel.

Convention : <em> pour les mots d'inspiration (couleur accent), <strong> pour le nom du service. Pattern unifié — remplace .atlas-lore, .lyra-lore, etc.

Steps — comment ça marche v1.5.0

1

Première étape

Description courte de la première étape, deux à trois lignes max.

2

Deuxième étape

Le service prend le relais et fait l'opération principale qui le caractérise.

3

Troisième étape

Résultat final livré à l'utilisateur, avec mention de ce qu'il peut en faire.

Cards numérotées en grille 3 colonnes (1 colonne sur mobile). Container .vnct-steps + items .vnct-step avec __number / __icon / __title / __desc. Pattern extrait de Lyra / Kayros / Calyx en v1.5.0.

Tags / Pills v1.5.0

Cas d'usage 1 Cas d'usage 2 Cas d'usage 3 Cas d'usage 4 Cas d'usage 5

Pills horizontales pour énumérer des cas d'usage / publics-cibles. Container .vnct-tags (flex wrap centré) + items .vnct-tag. Pattern extrait de Lyra / Kayros / Calyx / Strata en v1.5.0.

Trust card v1.5.0

Sans compte. Sans tracking.

Encart de réassurance — privacy, no-tracking, RGPD, etc. Centré, max 640px de large.

Encart de confiance avec icône SVG centrée + titre + description. .vnct-trust + __icon / __title / __desc. Pattern extrait de Lyra / Myco en v1.5.0.

Nouveau — 2.1.0

Chrome applicatif façon Maât

Le nouveau chrome des apps VNCT : un header flottant ancré dans le flux (pas de sticky), un menu overflow « … », un segmented control, une pilule de compte irisée et une modale de feedback unifiée. Ce pattern remplace le FAB, la nav desktop, le header mobile et le footer historiques (désormais dépréciés — voir Section 2, retrait prévu en v3).

Header flottant .vnct-header

Deux variantes. Statique : marque (avec sa partie irisée .vnct-iris-text) + libellé contextuel + une action ghost. Applicative : pilule de compte, pastille de bascule thème et menu « … » fonctionnel. Les headers ci-dessous sont encapsulés dans des cartes de démo — ce n'est pas le vrai header de la page.

Variante statique

Service Nouvelle analyse

Variante applicative — le menu « … » est fonctionnel (clique dessus)

Service

Ancré dans le flux (position: relative), z-index: var(--z-header) (800), padding safe-area. Largeur bornée par .vnct-header__inner (surcharge --vnct-header-max).

Segmented control .vnct-seg · tablist

Sélecteur façon pilule (role="tablist" + aria-selected). Utilisé en tête de la modale Feedback pour basculer entre les deux modes. Clique pour basculer le segment actif.

Le segment actif porte aria-selected="true" (fond --accent, encre lisible en dark ET light). Roving tabindex géré côté service (ou par la modale Feedback).

Account chip .vnct-account-chip

Pilule de compte irisée (conventions Cardo). Deux états : bouton « Se connecter » (invite interactive) et badge « Connecté·e » (non interactif, --badge). La forme vient de .vnct-account-chip, la surface irisée + l'encre sombre de .vnct-iris-fill (à composer dans le markup).

Convention Cardo — écriture inclusive obligatoire sur les libellés (« Connecté·e »). Halo irisé au survol sur l'état interactif uniquement ; le badge garde son ombre lavande de repos.

Feedback VNCT.Feedback API publique

Modale unifiée « Signaler ou proposer » à deux onglets, ouvrable de n'importe où via VNCT.Feedback.open() — y compris sur une page sans header ni menu. Les boutons ci-dessous l'ouvrent en vrai.

API publique — remplace le couplage à l'API privée VNCT.FAB._handleAction. Options : kind ('bug' | 'suggestion', onglet initial), copy (surcharge partielle des libellés par onglet), context (hook optionnel () => ({ label, data }) qui affiche une case opt-in pour joindre le contexte de la page).

Envoi via VNCT.Sema.submit() (endpoint /api/public/report, fallback webhook Discord). Sur ce showroom aucun devReportUrl n'est configuré : le bouton « Envoyer » ne poste rien (retour d'erreur).

Échelle z-index tokens --z-*

Échelle tokenisée dans :root : les composants n'inventent plus de z-index en dur, ils consomment ces tokens.

TokenValeurUsage
--z-canvas0Canvas animé du fond (.vnct-bg)
--z-vignette1Vignette radiale (body::after)
--z-content2Contenu de page (main / nav / header / footer)
--z-header800Header flottant + son menu overflow
--z-fab900FAB (menu = --z-fab − 1, scrim = − 2)
--z-modal1000Modales (.vnct-modal-overlay)
--z-toast2000Toasts, au-dessus de tout

Piège résolu : le header porte --z-header (800), au-dessus du contenu de page (2) — les services retirent leurs hacks z-index: 800 codés en dur (ex. Lyra). Un éventuel écran de login plein écran reste hors de cette échelle, géré par le service concerné.

Section 3

Composants additionnels

Composants migrés depuis le playground v0.x — disponibles à partir de la v1.0.3 du design system.

Checkbox / Radio / Toggle nouveau



Slider nouveau

Tabs nouveau

Contenu du panneau Aperçu — vue synthétique avec les infos principales.
Contenu du panneau Détails — toutes les propriétés détaillées.
Contenu du panneau Historique — timeline des changements.

Accordion nouveau

Contenu du premier item, ouvert par défaut.
Contenu du deuxième item.
Contenu du troisième item, plus long pour montrer la transition de hauteur. Texte additionnel pour étaler le contenu.

Stepper nouveau

Compte
Profil
3Préférences
4Confirmation

Tooltip nouveau

Tooltip court Explication contextuelle

Pills / Badges nouveau

Default Accent Success Warning Danger Solid

Status dots nouveau

Online Offline Idle Neutral Live (pulse)

Skeleton nouveau

Empty state nouveau

Aucun résultat

Pattern à utiliser quand une liste, une recherche ou une vue est vide. Personnalise le titre, la description et l'action principale selon le contexte.

Composé de vnct-empty__icon, __title et __desc. Ajoute un bouton VNCT en bas si une action est pertinente.

Tables nouveau

ServiceStatusVersionDomaine
AtlasOnlinev2.1.0atlas.vena.city
AxisOnlinev1.2.0axis.vena.city
SemaIdlev0.9.3sema.vena.city

Avatars nouveau

LE LE LE LE

AS BJ CK +5

Dividers nouveau



Section

Scrollbar custom nouveau

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium.

Code blocks nouveau

Texte avec code inline à l'intérieur d'un paragraphe.

// Exemple de bloc de code
const hello = (name) => {
  return `Bonjour ${name}`;
};

Animations supplémentaires nouveau

spin

bounce

glow

float

Section 4

Matrice d'états

Combinatoire des composants × variantes pour vérifier rapidement la cohérence visuelle.

ComposantDefaultHover/ActiveDisabledDanger
Bouton
Pill Default Accent Disabled Danger
Input
Status Neutral Online Idle Offline