Référence technique

Framework CSS

Classes utilitaires, composants et tokens de design disponibles dans tous les modules — sans import supplémentaire.

🎨 Ces classes font partie du standard de normalisation. Consulte aussi la section CSS de la normalisation → pour les règles de soumission au Store.

Principe

Le framework CSS d'OpenOverlay est injecté automatiquement par le dashboard dans toutes les interfaces admin des modules via admin/admin.css. Aucun import CSS n'est nécessaire dans les fichiers des modules : les classes sont disponibles dès que le module est chargé.

Cela garantit la cohérence visuelle entre tous les modules — même provenant d'auteurs différents — et évite les duplications de styles entre modules.

Règle absolue — Ne jamais utiliser style="" dans les templates JS des modules pour les couleurs, tailles, marges et visibilité couverts par ce framework. Utiliser les classes utilitaires ou les custom properties CSS (--ma-variable) pour les valeurs dynamiques.

Variables CSS

Les tokens de design sont accessibles via var(--nom) dans les CSS de tes modules. Ils garantissent que ton module s'adapte automatiquement à l'apparence du dashboard.

VariableValeur par défautUsage
--bg#0c0c10Fond général de la page
--surface#1e1e2aFond des panneaux principaux
--surface2#252535Fond secondaire, blocs internes
--surface3#2e2e42Fond tertiaire, survol
--borderrgba(255,255,255,0.08)Bordures discrètes
--text#f0eeffTexte principal
--muted#7c7a99Texte secondaire, labels
--purple#7c5cfcCouleur principale de marque
--accent#7c5cfcAlias de --purple
--accent2#c9b8ffAccent clair, liens, emphases
--green#00c896Succès, actif, positif
--red#ff4040Erreur, danger, suppression
--yellow#f0a000Avertissement, attention
--radius14pxArrondi standard des composants
Couleurs dynamiques — Pour une couleur issue de la config du module (choisie par le streamer), passe-la via une custom property locale : el.style.setProperty('--dot-color', cfg.color) et utilise .ma-classe { background: var(--dot-color); } dans le CSS du module. Ne pas écrire de fallback dans le var() : si une valeur par défaut est nécessaire, l'appliquer aussi via setProperty() avant le premier rendu.

Composants de base

Les composants du dashboard sont disponibles directement dans les templates JS des modules. Ils constituent la base de toute interface admin.

Cards

.card + .card-header + .card-body — carte avec entête et corps. C'est le conteneur principal de tout panneau d'administration.

Boutons

.btn — bouton de base. Variantes de couleur : .btn-primary, .btn-secondary, .btn-danger (rouge), .btn-ghost (transparent). Tailles : .btn-sm (compact), .btn-xs (encore plus compact).

Champs de formulaire

.field + label + input / select / textarea — structure standard d'un champ de saisie avec son label.

Badge

.badge — étiquette colorée inline. Combinable avec .badge-green, .badge-red, .badge-muted, .badge-purple.

Exemple minimal

<div class="card">
  <div class="card-header">Titre de section</div>
  <div class="card-body">
    <div class="field">
      <label>Nom</label>
      <input type="text" id="cfg-name">
    </div>
    <div class="field">
      <label>Couleur</label>
      <input type="color" id="cfg-color">
    </div>
  </div>
</div>

Modificateurs de card

Ces classes s'ajoutent sur .card ou .card-body pour adapter l'apparence à des contextes spécifiques.

ClasseEffet
.card--mb-smmargin-bottom: 12px — cards empilées avec espacement réduit
.card--warnBordure orange atténuée — état expiré, avertissement
.card--premiumBordure violette atténuée — fonctionnalité Nexus / premium
.card--accentBordure gauche violette épaisse — mise en avant, information clé
.card-body--flushpadding: 0 — listes ou tableaux bord-à-bord
.card-body--centerCentré, padding généreux — états vides, messages d'état
.card-body--loosePadding agrandi (24px 28px) — contenu aéré
.card-body--no-toppadding-top: 0 — supprime l'espace haut du corps

Texte & couleurs

Classes utilitaires de typographie et de couleur. À utiliser directement dans les templates HTML des modules.

ClasseEffet
.text-mutedcolor: var(--muted) — texte secondaire, labels
.text-greencolor: var(--green) — succès, actif
.text-redcolor: var(--red) — erreur, danger
.text-yellowcolor: var(--yellow) — avertissement
.text-purplecolor: var(--purple) — accent violet
.text-emcolor: var(--text) — emphase dans un contexte muted
.text-smfont-size: 13px
.text-xsfont-size: 12px
.text-xxsfont-size: 11px
.text-centertext-align: center
.text-righttext-align: right
.text-accent2color: var(--accent2) — liens, emphases violet clair
.text-italicfont-style: italic
.nowrapwhite-space: nowrap — empêche le retour à la ligne
.monofont-family: monospace — code, valeurs techniques
.fw-boldfont-weight: 600 — texte en gras
.fw-normalfont-weight: 400 — texte normal (pour annuler un gras hérité)

Espacement

Classes de marge courtes pour espacer les éléments sans inline style. Préfixes : mb- (margin-bottom), mt- (margin-top), ml- (margin-left).

ClasseEffet
.mb-4margin-bottom: 4px
.mb-6margin-bottom: 6px
.mb-8margin-bottom: 8px
.mb-10margin-bottom: 10px
.mb-12margin-bottom: 12px
.mb-14margin-bottom: 14px
.mb-16margin-bottom: 16px
.mb-20margin-bottom: 20px
.mt-4margin-top: 4px
.mt-6margin-top: 6px
.mt-8margin-top: 8px
.mt-10margin-top: 10px
.mt-12margin-top: 12px
.mt-16margin-top: 16px
.mt-20margin-top: 20px
.ml-6margin-left: 6px
.ml-8margin-left: 8px
.ml-10margin-left: 10px
.m-0margin: 0 — supprime toutes les marges
.py-8padding-top: 8px; padding-bottom: 8px — padding vertical
.min-w-90min-width: 90px
.min-w-100min-width: 100px
.min-w-120min-width: 120px
.min-w-220min-width: 220px

Exemple combiné : <p class="text-sm text-muted mb-8">...</p> applique simultanément les trois utilitaires.

Flex & visibilité

Composants flex et utilitaires de mise en page pour organiser les éléments sans écrire de CSS ad hoc.

ClasseEffet
.row-flexdisplay: flex; align-items: center; gap: 10px
.row-flex--betweendisplay: flex; align-items: center; justify-content: space-between; gap: 12px
.row-flex--wrapidem .row-flex avec flex-wrap: wrap
.flex-coldisplay: flex; flex-direction: column; gap: 6px; align-items: flex-start
.flex-col--lgidem .flex-col avec gap agrandi
.gap-6gap: 6px
.gap-8gap: 8px
.flex-1flex: 1 — occupe l'espace restant
.shrink-0flex-shrink: 0 — empêche la réduction
.min-w-0min-width: 0 — évite le débordement flex
.hiddendisplay: none !important — toggle de visibilité JS

Toggle de visibilité

Pour afficher ou masquer un élément depuis JS, utiliser classList.toggle('hidden', condition) plutôt que de modifier style.display directement.

// Correct
wrap.classList.toggle('hidden', !cfg.showSection);

// Interdit
wrap.style.display = cfg.showSection ? 'flex' : 'none';

Pour les éléments qui ont besoin de display: flex ou display: block quand ils sont affichés, utiliser le pattern .visible dans le CSS du module :

/* Dans mods/{id}/admin.css */
.mon-element { display: none; }
.mon-element.visible { display: flex; }
// Dans admin.js
el.classList.toggle('visible', condition);

Composants de page

Composants spécifiques au dashboard disponibles dans tous les modules pour des besoins courants (URL d'activation, tags, barres de progression, historique…).

ClasseUsage
.code-previewBloc monospace pour URL ou code d'activation — fond --surface2, texte violet, radius 6px
.tag-chipPastille / pill pour tags ou étiquettes — fond --surface2, texte --muted, 11px, radius 99px
.tags-rowConteneur flex-wrap pour un groupe de .tag-chip
.nexus-bannerBandeau violet — display: flex between, padding 10px 14px, fond violet 12%, bordure --purple
.nexus-login-rowLigne de connexion Nexus — flex row aligné, gap standard
.nexus-login-inputInput de saisie Nexus — styles visuels spécifiques à la connexion compte
.progress-trackPiste de progression — flex: 1, hauteur 4px, fond --border
.progress-fillRemplissage de progression — hauteur 100%, fond --accent, transition: width
.history-rowLigne d'historique — flex row, gap 12px, padding 10px 16px, bordure basse
.list-spacedListe avec espacement vertical régulier entre items
.mod-metaMéta-info module — 11px, --muted, margin-left 8px (version, auteur, date)
.border-top-sepSéparateur visuel — bordure en haut + padding-top 12px
.field--smChamp de formulaire compact (hauteur réduite, font-size 12px)
.filename-hintIndication de nom de fichier — monospace, --muted, tronqué
.hint--spacedVariante de .hint avec marge-top pour l'aérer
.store-mod-iconIcône de mod dans le Store — dimensions et border-radius normalisés
.btn-xsBouton très compact (padding réduit, font-size 11px)
.icon-lgIcône grande taille (1.4rem–1.6rem)

Exemple — barre de progression

<div class="row-flex mb-8">
  <span class="text-sm text-muted">Installation…</span>
  <div class="progress-track">
    <div class="progress-fill" style="width: 60%"></div>
  </div>
</div>
style="width: X%" sur .progress-fill est l'un des rares usages légitimes de l'inline style : la largeur est une valeur numérique dynamique mise à jour en JS et n'a pas de classe correspondante dans le framework.

Bonnes pratiques

Cinq règles à respecter pour que ton module soit cohérent avec le dashboard et accepté au Store.

  1. Pas de style="" dans les templates — Aucune propriété visuelle (couleur, taille, marge, visibilité) ne doit passer par un attribut inline dans le HTML généré dynamiquement. Les rares exceptions légitimes sont documentées explicitement (ex : style="width: X%" sur .progress-fill pour une valeur numérique purement dynamique).
  2. Couleurs dynamiques via custom properties — Quand une couleur vient de la config, ne pas l'écrire directement dans style="", et ne pas mettre de fallback dans le var() :
    // Correct — passe la valeur (et la valeur par défaut) via setProperty()
    el.style.setProperty('--dot-color', cfg.color ?? '#888888');
    
    // Dans mods/{id}/admin.css — pas de fallback dans var()
    .ma-classe { background: var(--dot-color); }
    
    // Interdit — fallback CSS
    .ma-classe { background: var(--dot-color, #888); }
    
    // Interdit — inline style direct
    el.style.background = cfg.color;
  3. Toggle via classList — Basculer la visibilité par classe, jamais par style.display :
    // Correct
    el.classList.toggle('hidden', !condition);
    
    // Interdit
    el.style.display = condition ? 'flex' : 'none';
  4. Préférer les utilitaires aux classes one-shot — Combiner les classes existantes plutôt que d'en créer de nouvelles pour un seul usage :
    <!-- Correct -->
    <p class="text-sm text-muted mb-8">…</p>
    
    <!-- Interdit -->
    <p style="font-size:13px;color:var(--muted);margin-bottom:8px">…</p>
  5. Pas de fallback dans var() — Dans les fichiers mods/{id}/admin.css, utiliser var(--x) uniquement, sans valeur de repli. Si une valeur par défaut est nécessaire (notamment pour les CSS custom properties dynamiques), la définir via el.style.setProperty() en JS avant le premier rendu :
    // Avant le premier rendu — définit la valeur par défaut
    el.style.setProperty('--dot-color', cfg.color ?? '#888888');
    
    // Dans mods/{id}/admin.css — sans fallback
    .mon-element { background: var(--dot-color); }
    
    // Interdit dans admin.css
    .mon-element { background: var(--dot-color, #888); }
  6. Ne pas redéfinir les classes du framework — Ne pas réécrire .card, .btn, .field ou n'importe quelle classe du dashboard dans mods/{id}/admin.css. Ajouter uniquement des classes spécifiques au module, idéalement préfixées par l'id du module (ex : .ticker-preview).

Téléchargement

Ces fichiers sont générés automatiquement depuis admin/admin.css et mis à jour à chaque release d'OpenOverlay. Utiles pour consulter l'intégralité du framework hors ligne ou pour un éditeur avec autocomplétion.

  • oo-mod-framework.css — version complète commentée, lisible. Idéale pour consulter le détail de chaque classe.
  • oo-mod-framework.min.css — version minifiée, prête pour production ou pour vérification de taille.
Ces fichiers sont en lecture seule. N'inclus pas ces fichiers dans ton module — ils sont déjà injectés par le dashboard. Les utiliser localement uniquement à titre de référence.