diff --git a/templates/play.html b/templates/play.html
index 5d14cb78..fb68b1be 100644
--- a/templates/play.html
+++ b/templates/play.html
@@ -796,10 +796,32 @@
// l'éditeur — contourne la contrainte de clé étrangère de
// target_element_id, qui empêche d'y stocker un sentinel comme
// EVENT_ROW_ID directement (voir screens/flow/ensure_flow_schema.py).
+ //
+ // data-element-id N'EST PAS unique quand l'élément vit dans un
+ // Répéteur : chaque ligne rejoue le MÊME modèle, donc le MÊME
+ // data-element-id se répète à l'identique sur chaque ligne (voir
+ // render_repeater.py, seul data-row-id — posé sur .repeaterItem,
+ // l'englobant — distingue réellement une ligne d'une autre). Un
+ // simple document.querySelector('[data-element-id]') global
+ // prendrait toujours la PREMIÈRE ligne, jamais la bonne — sans
+ // rapport avec l'événement reçu. Quand l'événement transmet aussi
+ // une ligne (row_id), la recherche est donc scopée à L'INTÉRIEUR de
+ // ce .repeaterItem précis ; sinon (élément fixe, ou événement sans
+ // paramètre de ligne), recherche globale comme avant.
const resolvedElementId = node.target_element_from_event
? (window.lastEventParams ? window.lastEventParams.element_id : null)
: node.target_element_id;
- const targetEl = resolvedElementId ? document.querySelector('[data-element-id="' + resolvedElementId + '"]') : null;
+ const resolvedRowId = node.target_element_from_event && window.lastEventParams
+ ? window.lastEventParams.row_id : null;
+ let targetEl = null;
+ if (resolvedElementId != null) {
+ if (resolvedRowId != null) {
+ const rowEl = document.querySelector('.repeaterItem[data-row-id="' + resolvedRowId + '"]');
+ targetEl = rowEl ? rowEl.querySelector('[data-element-id="' + resolvedElementId + '"]') : null;
+ } else {
+ targetEl = document.querySelector('[data-element-id="' + resolvedElementId + '"]');
+ }
+ }
if (targetEl) applyElementProperty(targetEl, node.element_property, node.element_value);
return Promise.resolve();
} else if (node.action_type === 'declencher_evenement' && node.target_custom_event_id) {