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.
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.
| Variable | Valeur par défaut | Usage |
|---|---|---|
--bg | #0c0c10 | Fond général de la page |
--surface | #1e1e2a | Fond des panneaux principaux |
--surface2 | #252535 | Fond secondaire, blocs internes |
--surface3 | #2e2e42 | Fond tertiaire, survol |
--border | rgba(255,255,255,0.08) | Bordures discrètes |
--text | #f0eeff | Texte principal |
--muted | #7c7a99 | Texte secondaire, labels |
--purple | #7c5cfc | Couleur principale de marque |
--accent | #7c5cfc | Alias de --purple |
--accent2 | #c9b8ff | Accent clair, liens, emphases |
--green | #00c896 | Succès, actif, positif |
--red | #ff4040 | Erreur, danger, suppression |
--yellow | #f0a000 | Avertissement, attention |
--radius | 14px | Arrondi standard des composants |
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.
| Classe | Effet |
|---|---|
.card--mb-sm | margin-bottom: 12px — cards empilées avec espacement réduit |
.card--warn | Bordure orange atténuée — état expiré, avertissement |
.card--premium | Bordure violette atténuée — fonctionnalité Nexus / premium |
.card--accent | Bordure gauche violette épaisse — mise en avant, information clé |
.card-body--flush | padding: 0 — listes ou tableaux bord-à-bord |
.card-body--center | Centré, padding généreux — états vides, messages d'état |
.card-body--loose | Padding agrandi (24px 28px) — contenu aéré |
.card-body--no-top | padding-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.
| Classe | Effet |
|---|---|
.text-muted | color: var(--muted) — texte secondaire, labels |
.text-green | color: var(--green) — succès, actif |
.text-red | color: var(--red) — erreur, danger |
.text-yellow | color: var(--yellow) — avertissement |
.text-purple | color: var(--purple) — accent violet |
.text-em | color: var(--text) — emphase dans un contexte muted |
.text-sm | font-size: 13px |
.text-xs | font-size: 12px |
.text-xxs | font-size: 11px |
.text-center | text-align: center |
.text-right | text-align: right |
.text-accent2 | color: var(--accent2) — liens, emphases violet clair |
.text-italic | font-style: italic |
.nowrap | white-space: nowrap — empêche le retour à la ligne |
.mono | font-family: monospace — code, valeurs techniques |
.fw-bold | font-weight: 600 — texte en gras |
.fw-normal | font-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).
| Classe | Effet |
|---|---|
.mb-4 | margin-bottom: 4px |
.mb-6 | margin-bottom: 6px |
.mb-8 | margin-bottom: 8px |
.mb-10 | margin-bottom: 10px |
.mb-12 | margin-bottom: 12px |
.mb-14 | margin-bottom: 14px |
.mb-16 | margin-bottom: 16px |
.mb-20 | margin-bottom: 20px |
.mt-4 | margin-top: 4px |
.mt-6 | margin-top: 6px |
.mt-8 | margin-top: 8px |
.mt-10 | margin-top: 10px |
.mt-12 | margin-top: 12px |
.mt-16 | margin-top: 16px |
.mt-20 | margin-top: 20px |
.ml-6 | margin-left: 6px |
.ml-8 | margin-left: 8px |
.ml-10 | margin-left: 10px |
.m-0 | margin: 0 — supprime toutes les marges |
.py-8 | padding-top: 8px; padding-bottom: 8px — padding vertical |
.min-w-90 | min-width: 90px |
.min-w-100 | min-width: 100px |
.min-w-120 | min-width: 120px |
.min-w-220 | min-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.
| Classe | Effet |
|---|---|
.row-flex | display: flex; align-items: center; gap: 10px |
.row-flex--between | display: flex; align-items: center; justify-content: space-between; gap: 12px |
.row-flex--wrap | idem .row-flex avec flex-wrap: wrap |
.flex-col | display: flex; flex-direction: column; gap: 6px; align-items: flex-start |
.flex-col--lg | idem .flex-col avec gap agrandi |
.gap-6 | gap: 6px |
.gap-8 | gap: 8px |
.flex-1 | flex: 1 — occupe l'espace restant |
.shrink-0 | flex-shrink: 0 — empêche la réduction |
.min-w-0 | min-width: 0 — évite le débordement flex |
.hidden | display: 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…).
| Classe | Usage |
|---|---|
.code-preview | Bloc monospace pour URL ou code d'activation — fond --surface2, texte violet, radius 6px |
.tag-chip | Pastille / pill pour tags ou étiquettes — fond --surface2, texte --muted, 11px, radius 99px |
.tags-row | Conteneur flex-wrap pour un groupe de .tag-chip |
.nexus-banner | Bandeau violet — display: flex between, padding 10px 14px, fond violet 12%, bordure --purple |
.nexus-login-row | Ligne de connexion Nexus — flex row aligné, gap standard |
.nexus-login-input | Input de saisie Nexus — styles visuels spécifiques à la connexion compte |
.progress-track | Piste de progression — flex: 1, hauteur 4px, fond --border |
.progress-fill | Remplissage de progression — hauteur 100%, fond --accent, transition: width |
.history-row | Ligne d'historique — flex row, gap 12px, padding 10px 16px, bordure basse |
.list-spaced | Liste avec espacement vertical régulier entre items |
.mod-meta | Méta-info module — 11px, --muted, margin-left 8px (version, auteur, date) |
.border-top-sep | Séparateur visuel — bordure en haut + padding-top 12px |
.field--sm | Champ de formulaire compact (hauteur réduite, font-size 12px) |
.filename-hint | Indication de nom de fichier — monospace, --muted, tronqué |
.hint--spaced | Variante de .hint avec marge-top pour l'aérer |
.store-mod-icon | Icône de mod dans le Store — dimensions et border-radius normalisés |
.btn-xs | Bouton très compact (padding réduit, font-size 11px) |
.icon-lg | Icô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.
-
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-fillpour une valeur numérique purement dynamique). -
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 levar():// 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; -
Toggle via
classList— Basculer la visibilité par classe, jamais parstyle.display:// Correct el.classList.toggle('hidden', !condition); // Interdit el.style.display = condition ? 'flex' : 'none'; -
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> -
Pas de fallback dans
var()— Dans les fichiersmods/{id}/admin.css, utiliservar(--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 viael.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); } -
Ne pas redéfinir les classes du framework — Ne pas réécrire
.card,.btn,.fieldou n'importe quelle classe du dashboard dansmods/{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.