From 4c60fed0c217601df1c96510c7ccfc91be7d09c6 Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Thu, 4 Jun 2026 21:45:25 +0200 Subject: [PATCH] =?UTF-8?q?feat(etapes):=20vue=20mobile=20liste=20par=20?= =?UTF-8?q?=C3=A9tape?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- src/pages/etapes.py | 69 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/pages/etapes.py b/src/pages/etapes.py index 526e611..87ce041 100644 --- a/src/pages/etapes.py +++ b/src/pages/etapes.py @@ -130,6 +130,74 @@ def build_chart(): ) +# Données par étape, partagées par la vue mobile. +# Chaque item : (libellé, couleur, plage de seuils en texte). +STAGES_MOBILE = [ + ( + "Programmation", + [ + ("Approch", "#7c5cff", "tous montants — publication non réglementaire"), + ], + ), + ( + "Publicité (appel d'offres)", + [ + ( + "Journaux d'annonces légales", + "#f79009", + "de 90 000 € au seuil formalisé", + ), + ("BOAMP", "#1570ef", "à partir de 90 000 €"), + ( + "JOUE — avis de marché", + "#0e9384", + "à partir des seuils formalisés (140 k€ / 216 k€)", + ), + ], + ), + ( + "Attribution", + [ + ("DECP — données essentielles", "#12b76a", "à partir de 40 000 €"), + ("JOUE — avis d'attribution", "#0e9384", "à partir des seuils formalisés"), + ], + ), + ("Contrat", []), + ("Paiement", []), +] + + +def build_mobile(): + blocks = [] + for stage, items in STAGES_MOBILE: + if items: + children = [ + html.Div( + [ + html.I(style={"backgroundColor": color}), + html.Span(label, className="etapes-m-label"), + html.Span(seuil, className="etapes-m-seuil"), + ], + className="etapes-m-item", + ) + for label, color, seuil in items + ] + else: + children = [ + html.Div( + "aucune donnée publiée aujourd'hui", + className="etapes-m-item etapes-m-empty", + ) + ] + blocks.append( + html.Div( + [html.H4(stage, className="etapes-m-stage"), *children], + className="etapes-m-block", + ) + ) + return html.Div(blocks, className="etapes-mobile") + + def build_legend(): items = [ ("Approch", "#7c5cff"), @@ -164,6 +232,7 @@ layout = html.Div( "bas) et par **seuil** (de gauche à droite, en euros hors taxes)." ), build_chart(), + build_mobile(), build_legend(), dcc.Markdown( "**À noter :** l'axe horizontal n'est pas linéaire — les seuils "