Conventions du projet
Règles à suivre pour tout code ou toute page ajoutée à tlr_core ou à un module TLR. Elles reprennent le fichier CLAUDE.md à la racine de la ressource. Retour au sommaire.
Langue et écriture
- Tout est en français : code, commentaires, libellés de l'interface, messages, documentation.
- Aucun caractère tiret dans les textes, les libellés et les commentaires. Remplacez le par une virgule, un point ou deux points. Dans les mots composés, écrivez les mots séparés (« au dessus », « vous même »). Pour un commentaire Lua, qui commence forcément par deux tirets, gardez le commentaire mais pas de tiret dans son texte.
- Les listes de la documentation commencent par « * ».
- Les montants sont des entiers en centimes, affichés avec
FormatMoneyou en dollars dans les formulaires.
Tests
- Tests hors jeu en Lua 5.4 :
lua tests/run.luadepuis le dossier de la ressource. - À lancer après toute modification de
shared/ou d'un domaine testé. - La logique vérifiable va dans
shared/, en Lua pur sans native, avec son fichiertests/test_<domaine>.lua. - Ce qui demande le jeu est signalé « à vérifier en jeu » dans la documentation du domaine et dans docs/TESTS.md.
Interface NUI
- HTML, CSS et JS vanilla dans
web/, modules ES, sans bundler nipackage.json. Pas de Tailwind, React, GSAP ni autre dépendance. - Aucune ressource externe : pas de CDN, pas de polices ni d'icônes distantes. Polices dans
web/fonts/<domaine>/, bibliothèques dansweb/vendor/, images dansweb/img/. Icônes en SVG locaux, jamais d'emoji comme icône. - Couleurs, rayons, espacements et polices uniquement par les variables de
web/css/tokens.css(fond, surfaces, texte, texte secondaire, accent, lignes, couleurs d'état ok, warn, bad et info...). Aucune couleur en dur : sinon elle ignore les thèmes. - Sept thèmes redéfinissent ces variables dans
web/css/themes.css:crepuscule(par défaut),cuir,journal(clair),saint_denis,new_austin,roanoke,sang. Tout écran reste lisible dans les sept. Une nouvelle variable reçoit une valeur dans chaque thème. - Fond de page transparent : le jeu est visible derrière.
- Réutiliser les composants existants (
.btn,.input,.field,.pill,.alert, tableaux...) avant d'en créer ; un nouveau composant porte le préfixe de son domaine. - Clavier et souris partout, style de focus clavier toujours visible, Échap ferme l'écran.
- Animations courtes sur
transformetopacityseulement, respect de la préférence « mouvement réduit » du système. - Direction artistique : Ouest américain de 1899, papier, cuir, laiton, encre ; panel admin sobre et dense.
Fichiers et manifeste
- Tout nouveau fichier doit être déclaré dans
fxmanifest.lua(blocfilespour la NUI,shared_scripts,server_scripts,client_scriptspour le Lua). Les motifs existants couvrent déjàweb/css/*.cssetweb/js/**; un nouveau sous dossier ou type de fichier demande une ligne. - Une nouvelle feuille de style est aussi liée dans
web/index.html. - Les fichiers de
config/appartiennent au propriétaire du serveur : le code ne les réécrit jamais.
Base de données
- Les migrations se déclarent avec
TLR.Migrations.add({ id, name, sql }), avec un numéro réservé au domaine. - Une migration publiée n'est jamais modifiée : pour changer une table, ajoutez une nouvelle migration.
- Requêtes préparées avec paramètres, jamais de concaténation de valeurs venues d'un joueur.
Sécurité du code serveur
- Le serveur décide de tout : le client et la page ne font que demander.
- Toute action de l'interface passe par
TLR.RPC.registeravec un schéma et une permission. Refus par défaut. - Chaque action sensible est écrite au journal avec
TLR.Log.write. - Chaque opération d'argent porte un
opIdunique pour ne jamais être appliquée deux fois.
Voir aussi l'architecture et Créer un module externe.
Source : tlr_core/docs/guide/dev_conventions.md