Files
OpenNoodl/dev-docs/tasks/phase-9-styles-overhaul/STYLE-002-element-configs/MVP2-FIX-AND-RETEST.md
Tara West 5c8aa4af2f feat(styles): Complete MVP2 - ElementConfigs system with node integration
Implements MVP2 of the ElementConfigs system, applying default styles to newly created nodes.

 Completed:
- ElementConfigRegistry with singleton pattern
- 5 node configs (Button, Text, Group, TextInput, Image)
- 28 total style variants defined
- Integration in router.tsx for app startup
- Unit tests for registry

 Validated:
- Button node: 100% defaults applied correctly
- Text node: Partial defaults applied (fontSize, color work)
- System initializes successfully at startup

⚠️ Known Issues:
- Text lineHeight and fontWeight not fully applied (likely interaction with legacy text style system)
- Requires cache clear (npm run clean:all) for changes to take effect

📝 Documentation:
- MVP2 validation report with test results
- Detailed changelog of implementation steps

🚀 Next: MVP3 will add variant selector UI in Property Panel

Ref: STYLE-002 Phase 9
2026-01-15 22:45:34 +01:00

11 KiB

MVP2 Fix & Re-Test Guide

Date: 15 janvier 2026 21:24
Status: 🔧 Fix Applied - Ready for Testing


🐛 Problem Identified

Le système ElementConfigs n'était jamais initialisé au démarrage de l'app à cause d'imports asynchrones dans index.ts qui ne se terminaient jamais.

Symptômes observés:

  • Aucun log [ElementConfigs] dans la console
  • Propriété _variant absente des nodes
  • Tokens non résolus (affichage de px bruts au lieu de var(--token))
  • Defaults pas appliqués aux nouveaux nodes

Fix Appliqué

Fichier modifié: packages/noodl-editor/src/editor/src/models/ElementConfigs/index.ts

Avant (Cassé):

export function initElementConfigs(): void {
  import('./configs').then(({ ButtonConfig, TextConfig, ... }) => {
    import('./ElementConfigRegistry').then(({ ElementConfigRegistry }) => {
      // Code jamais exécuté car async
    });
  });
}

Après (Corrigé):

import { ButtonConfig, TextConfig, GroupConfig, TextInputConfig, ImageConfig } from './configs';
import { ElementConfigRegistry } from './ElementConfigRegistry';

export function initElementConfigs(): void {
  console.log('[ElementConfigs] Initializing element configs...');

  // Imports synchrones - s'exécutent immédiatement
  ElementConfigRegistry.instance.register(ButtonConfig);
  ElementConfigRegistry.instance.register(TextConfig);
  ElementConfigRegistry.instance.register(GroupConfig);
  ElementConfigRegistry.instance.register(TextInputConfig);
  ElementConfigRegistry.instance.register(ImageConfig);

  console.log('[ElementConfigs] ✅ Initialized with', ElementConfigRegistry.instance.getCount(), 'configs');
  console.log('[ElementConfigs] Registered node types:', summary.nodeTypes);
}

🧪 Guide de Test - Projet Existant

⚠️ IMPORTANT: Limitation Connue

Le hook d'application de defaults ne s'applique qu'aux NOUVEAUX nodes créés avec Object.keys(parameters).length === 0.

Cela signifie:

  • Les nodes que tu vas créer MAINTENANT auront les defaults
  • Les nodes déjà existants dans ton projet NE SERONT PAS affectés (c'est normal)

📋 Procédure de Test

Étape 1: Lancer l'App (2 min)

npm run dev

⚠️ ATTENDRE que l'app soit complètement lancée avant d'ouvrir la console.

Étape 2: Vérifier la Console (CRITIQUE)

Ouvrir DevTools: Cmd+Option+I (Mac) ou Ctrl+Shift+I (Windows)

Chercher ces logs au démarrage:

[ElementConfigs] Initializing element configs...
[ElementConfigRegistry] Registered config for net.noodl.visual.button (6 variants)
[ElementConfigRegistry] Registered config for net.noodl.visual.text (10 variants)
[ElementConfigRegistry] Registered config for Group (7 variants)
[ElementConfigRegistry] Registered config for net.noodl.controls.textinput (2 variants)
[ElementConfigRegistry] Registered config for net.noodl.visual.image (3 variants)
[ElementConfigs] ✅ Initialized with 5 configs
[ElementConfigs] Registered node types: [...]

Si ces logs n'apparaissent PAS:

  • Le fix n'a pas fonctionné
  • ⚠️ Peut-être un problème de cache résiduel
  • 📝 Documenter l'erreur et me la transmettre

Si ces logs apparaissent:

  • Le système est initialisé correctement
  • 🚀 Passer à l'étape 3

Étape 3: Ouvrir Projet & Créer Page/Composant (2 min)

  1. Ouvrir un projet existant
  2. Créer une NOUVELLE page ou composant (vierge)
  3. Ouvrir cette page dans l'éditeur

Pourquoi une nouvelle page?

  • Les nodes existants ont déjà des parameters, le hook ne s'applique pas
  • Une page vierge garantit des nodes neufs

Étape 4: Test Individuel des Nodes (20 min)

Pour chaque type de node, faire ce test complet:

A. Button

Créer un nouveau Button (drag & drop depuis le panneau de gauche)

Dans le Property Panel (panneau de droite), vérifier:

Propriété Valeur Attendue Statut
paddingTop var(--space-2) ou ~8px [ ]
paddingLeft var(--space-4) ou ~16px [ ]
fontSize var(--text-sm) ou ~14px [ ]
borderRadius var(--radius-md) ou ~4-6px [ ]
backgroundColor var(--primary) ou couleur [ ]
_variant primary [ ]

📸 Dans le Preview:

  • Le button doit avoir du padding visible
  • Des coins arrondis
  • Une couleur de fond
  • Pas un bouton plat sans style

Console log attendu:

[ElementConfigRegistry] Applied defaults to net.noodl.visual.button (node <id>)

B. Text 🆕 (Avec Bug Fix)

Créer un nouveau Text (drag & drop)

Dans le Property Panel, vérifier:

Propriété Valeur Attendue Statut
width auto (PAS 100% !) [ ]
flexShrink 1 [ ]
fontSize var(--text-base) ou ~16px [ ]
_variant body [ ]

⚠️ Note: Tu ne verras peut-être pas flexShrink dans le Property Panel standard - c'est OK, il est appliqué en interne.

🧪 Test Critique du Bug Fix:

  1. Créer un Group
  2. Dans les propriétés du Group, chercher flexDirection et le mettre à row
  3. Ajouter DEUX Text elements comme enfants du Group
  4. Mettre du texte dans chaque Text (ex: "Hello" et "World")

Résultat attendu:

  • SUCCÈS: Les deux textes sont visibles côte à côte, ils partagent l'espace
  • ÉCHEC: Un texte déborde à droite et n'est pas visible

Console log attendu:

[ElementConfigRegistry] Applied defaults to net.noodl.visual.text (node <id>)

C. Group 📦

Créer un nouveau Group

Dans le Property Panel, vérifier:

Propriété Valeur Attendue Statut
display flex [ ]
flexDirection column [ ]
_variant default [ ]

Console log attendu:

[ElementConfigRegistry] Applied defaults to Group (node <id>)

D. TextInput 📝

Créer un nouveau TextInput

Dans le Property Panel, vérifier:

Propriété Valeur Attendue Statut
paddingTop Token ou ~8px [ ]
paddingLeft Token ou ~12px [ ]
borderWidth Token ou ~1px [ ]
borderRadius Token ou ~4px [ ]
_variant default [ ]

📸 Dans le Preview:

  • L'input doit avoir du padding
  • Un border visible
  • Des coins arrondis

Console log attendu:

[ElementConfigRegistry] Applied defaults to net.noodl.controls.textinput (node <id>)

E. Image 🖼️

Créer une nouvelle Image

Dans le Property Panel, vérifier:

Propriété Valeur Attendue Statut
width auto [ ]
height auto [ ]
objectFit cover (possiblement) [ ]
_variant default [ ]

Note: objectFit peut ne pas être visible selon la config - c'est OK.

Console log attendu:

[ElementConfigRegistry] Applied defaults to net.noodl.visual.image (node <id>)

Checklist de Validation Finale

Initialisation

  • App démarre sans erreur
  • Console affiche [ElementConfigs] ✅ Initialized with 5 configs
  • 5 logs de registration (Button, Text, Group, TextInput, Image)

Création de Nodes

  • Button créé avec styles par défaut visibles
  • Text créé avec width: auto et flexShrink: 1
  • Group créé avec display: flex et flexDirection: column
  • TextInput créé avec border, padding, et border-radius
  • Image créée avec dimensions auto

Propriété _variant

  • Chaque nouveau node a une propriété _variant définie
  • Les valeurs sont cohérentes: primary, default, body, etc.

Bug Fix Text (CRITIQUE)

  • Deux Text elements dans un Group en row sont tous deux visibles
  • Ils partagent l'espace équitablement
  • Pas de débordement à droite

Logs Console

  • Log d'initialisation présent au démarrage
  • Log "Applied defaults" pour chaque nouveau node créé
  • Aucune erreur rouge dans la console

🚨 Si Ça Ne Marche Toujours Pas

Scénario 1: Pas de logs d'initialisation

Diagnostic: Le fix n'a pas été appliqué correctement ou cache résiduel

Actions:

  1. Vérifier que le fichier ElementConfigs/index.ts a bien été modifié
  2. Re-run npm run clean:all
  3. Redémarrer l'app
  4. Si toujours rien, vérifier les erreurs TypeScript à la compilation

Scénario 2: Logs présents, mais pas de defaults appliqués

Diagnostic: Le hook dans NodeGraphNode ne se déclenche pas

Causes possibles:

  • Les nodes que tu testes ont déjà des parameters (pas vides)
  • Tu dupli ques des nodes existants au lieu d'en créer de nouveaux
  • Le projet est ancien avec des overrides

Solution:

  • Créer une page/composant complètement vierge
  • Drag & drop des nodes NEUFS depuis la library
  • Ne pas dupliquer des nodes existants

Scénario 3: Defaults appliqués mais pas de _variant visible

Diagnostic: Le property panel ne montre pas les propriétés système (préfixées _)

C'est normal! Les propriétés _variant, _size, etc. sont des propriétés système qui peuvent ne pas apparaître dans le property panel standard.

Vérification alternative:

  1. Ouvrir DevTools Console
  2. Sélectionner un node
  3. Dans la console, taper: ProjectModel.instance.getActiveComponent().selectedNodes[0].parameters
  4. Vérifier que _variant est présent dans l'objet

🎯 Résultat Attendu

Si tous les tests passent:

  • MVP2 est VALIDÉ
  • Le système ElementConfigs est OPÉRATIONNEL
  • Les defaults sont appliqués automatiquement aux nouveaux nodes
  • Le bug Text sizing est corrigé
  • 🚀 Prêt pour MVP3 (VariantSelector UI)

Si des tests échouent:

  • 📝 Documenter précisément quel test échoue
  • 📸 Screenshot de l'erreur console si applicable
  • 🔧 Investiguer et corriger avant MVP3

📊 Rapport de Test

Remplir après les tests:

Date du test: ___
Testeur: ___

Résumé

  • Initialisation: /
  • Button: /
  • Text: /
  • Group: /
  • TextInput: /
  • Image: /
  • Bug Fix Text: /

Notes / Problèmes Trouvés:

[Ajouter tes observations ici]

Statut Final:

  • MVP2 VALIDÉ - Prêt pour MVP3
  • MVP2 BLOQUÉ - Problèmes à corriger

Créé par: Cline
Date: 15 janvier 2026 21:24