{"id":2445,"date":"2026-05-06T13:33:26","date_gmt":"2026-05-06T11:33:26","guid":{"rendered":"https:\/\/labienveillance.fr\/?page_id=2445"},"modified":"2026-05-06T15:11:58","modified_gmt":"2026-05-06T13:11:58","slug":"elementor-2445","status":"publish","type":"page","link":"https:\/\/labienveillance.fr\/?page_id=2445","title":{"rendered":"Devis estimatif salle de bain"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2445\" class=\"elementor elementor-2445\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3140f1a e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"3140f1a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3e17cd3 elementor-widget elementor-widget-html\" data-id=\"3e17cd3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"jlmDoucheAppRoot\"><\/div>\r\n\r\n<script>\r\n(function () {\r\n  var root = document.getElementById(\"jlmDoucheAppRoot\");\r\n  if (!root) return;\r\n\r\n  var ADMIN_CODE = \"Loli424720\";\r\n\r\n  function clone(o) { return JSON.parse(JSON.stringify(o)); }\r\n  function escapeHtml(s) {\r\n    return String(s == null ? \"\" : s)\r\n      .replace(\/&\/g,\"&amp;\").replace(\/<\/g,\"&lt;\").replace(\/>\/g,\"&gt;\").replace(\/\"\/g,\"&quot;\");\r\n  }\r\n  function deepMerge(target, source) {\r\n    Object.keys(source || {}).forEach(function(key) {\r\n      if (source[key] && typeof source[key] === \"object\" && !Array.isArray(source[key])) {\r\n        if (!target[key] || typeof target[key] !== \"object\") target[key] = {};\r\n        deepMerge(target[key], source[key]);\r\n      } else { target[key] = source[key]; }\r\n    });\r\n    return target;\r\n  }\r\n  function money(n) { return Number(n||0).toLocaleString(\"fr-FR\")+\" \u20ac\"; }\r\n\r\n  function getAjaxUrl() {\r\n    return (window.JLM_DOUCHE_WP && window.JLM_DOUCHE_WP.ajaxUrl) || \"\/wp-admin\/admin-ajax.php\";\r\n  }\r\n  function getNonce() {\r\n    return (window.JLM_DOUCHE_WP && window.JLM_DOUCHE_WP.nonce) || \"\";\r\n  }\r\n  function isWpAdmin() {\r\n    return window.JLM_DOUCHE_WP && window.JLM_DOUCHE_WP.isAdmin;\r\n  }\r\n\r\n  async function wpLoadConfig() {\r\n    try {\r\n      var r = await fetch(getAjaxUrl() + \"?action=jlm_load_douche_config\", { credentials: \"same-origin\" });\r\n      var j = await r.json();\r\n      if (j && j.success && j.data && j.data.config) {\r\n        var parsed = JSON.parse(j.data.config);\r\n        cfg = deepMerge(clone(DEF), parsed);\r\n      }\r\n    } catch(e) {}\r\n  }\r\n\r\n  async function wpSaveConfig() {\r\n    try {\r\n      var formData = new FormData();\r\n      formData.append(\"action\", \"jlm_save_douche_config\");\r\n      formData.append(\"nonce\", getNonce());\r\n      formData.append(\"config\", JSON.stringify(cfg));\r\n      var r = await fetch(getAjaxUrl(), { method: \"POST\", credentials: \"same-origin\", body: formData });\r\n      var j = await r.json();\r\n      return !!(j && j.success);\r\n    } catch(e) { return false; }\r\n  }\r\n\r\n  var DEF = {\r\n    companyLine: \"La Bienveillance \u2014 Devis estimatif salle de bain\",\r\n    contactUrl: \"#contact\",\r\n    contactLabel: \"CONTACTEZ-NOUS\",\r\n    comments: {\r\n      home:\"\",intro_bain:\"\",avant_apres:\"\",fenetre:\"\",implantation:\"\",taille_bac:\"\",\r\n      modele:\"\",verre:\"\",robinetterie:\"\",forfaits:\"\",garanties_douche:\"\",aides_douche:\"\",\r\n      recap_douche:\"\",price_douche:\"\",proposition_sdb:\"\",habillage_murs:\"\",sol_antiderapant:\"\",\r\n      meubles:\"\",porte_coulissante:\"\",seche_serviettes:\"\",solutions_wc:\"\",recap_global:\"\",\r\n      garanties_global:\"\",aides_global:\"\",price_global:\"\",final_total:\"\"\r\n    },\r\n    prices: {\r\n      prixBase: 0,\r\n      base: { fixe:1200, fixe_volet:1450, fixe_volet_angle:1750, coulissante:1890,\r\n              coulissante_angle:2190, pivotante:1690, pivotante_angle:1990, deux_pivotantes:2290 },\r\n      verre: { transparent:0, depoli:180 },\r\n      robinetterie: { non:0, oui:390 },\r\n      habillageMursM2:120, solAntiderapant:990, meubles:1590, porteCoulissante:990,\r\n      secheServiettes:790, wcSureleve:0, wcSuspenduHabillage:0, wcBroyeurSilencieux:0,\r\n      forfaitMachineLaver:0, forfaitLavabo:0, forfaitBidet:0\r\n    },\r\n    images: {\r\n      logo:                         { url:\"https:\/\/laseptiemecom.wpcomstaging.com\/wp-content\/uploads\/2026\/03\/logomakr-0c1pju.png\" },\r\n      avant_photo_1:                { url:\"https:\/\/via.placeholder.com\/900x700?text=Avant+1\" },\r\n      avant_photo_2:                { url:\"https:\/\/via.placeholder.com\/900x700?text=Avant+2\" },\r\n      apres_photo_1:                { url:\"https:\/\/via.placeholder.com\/900x700?text=Apres+1\" },\r\n      apres_photo_2:                { url:\"https:\/\/via.placeholder.com\/900x700?text=Apres+2\" },\r\n      apres_photo_3:                { url:\"https:\/\/via.placeholder.com\/900x700?text=Apres+3\" },\r\n      apres_photo_4:                { url:\"https:\/\/via.placeholder.com\/900x700?text=Apres+4\" },\r\n      fenetre_oui:                  { url:\"https:\/\/via.placeholder.com\/800x800?text=Fenetre+oui\" },\r\n      fenetre_non:                  { url:\"https:\/\/via.placeholder.com\/800x800?text=Pas+de+fenetre\" },\r\n      \/* === NOUVELLES : r\u00e9serv\u00e9es page 7 (modele) selon pr\u00e9sence fen\u00eatre === *\/\r\n      fenetre_paroi_fixe:           { url:\"https:\/\/via.placeholder.com\/1200x675?text=Paroi+fixe+avec+fenetre\" },\r\n      fenetre_paroi_fixe_volet:     { url:\"https:\/\/via.placeholder.com\/1200x675?text=Paroi+fixe+%2B+volet+avec+fenetre\" },\r\n      implantation_angle:           { url:\"https:\/\/via.placeholder.com\/800x800?text=Implantation+angle\" },\r\n      implantation_niche:           { url:\"https:\/\/via.placeholder.com\/800x800?text=Implantation+niche\" },\r\n      modele_fixe:                  { url:\"https:\/\/via.placeholder.com\/1200x675?text=Paroi+fixe\" },\r\n      modele_fixe_volet:            { url:\"https:\/\/via.placeholder.com\/1200x675?text=Fixe+%2B+volet\" },\r\n      modele_fixe_volet_angle:      { url:\"https:\/\/via.placeholder.com\/1200x675?text=Fixe+%2B+volet+%2B+angle+fixe\" },\r\n      modele_coulissante:           { url:\"https:\/\/via.placeholder.com\/1200x675?text=Paroi+coulissante\" },\r\n      modele_coulissante_angle:     { url:\"https:\/\/via.placeholder.com\/1200x675?text=Coulissante+%2B+angle+fixe\" },\r\n      modele_pivotante:             { url:\"https:\/\/via.placeholder.com\/1200x675?text=Porte+pivotante\" },\r\n      modele_pivotante_angle:       { url:\"https:\/\/via.placeholder.com\/1200x675?text=Pivotante+%2B+angle+fixe\" },\r\n      modele_deux_pivotantes:       { url:\"https:\/\/via.placeholder.com\/1200x675?text=2+portes+pivotantes\" },\r\n      verre_transparent:            { url:\"https:\/\/via.placeholder.com\/800x800?text=Verre+transparent\" },\r\n      verre_depoli:                 { url:\"https:\/\/via.placeholder.com\/800x800?text=Verre+depoli\" },\r\n      robinetterie_oui:             { url:\"https:\/\/via.placeholder.com\/800x800?text=Deplacement+robinetterie+Oui\" },\r\n      robinetterie_non:             { url:\"https:\/\/via.placeholder.com\/800x800?text=Deplacement+robinetterie+Non\" },\r\n      proposition_sdb_photo:        { url:\"https:\/\/via.placeholder.com\/1200x800?text=Renovation+salle+de+bain\" },\r\n      habillage_murs_1:             { url:\"https:\/\/via.placeholder.com\/900x700?text=Habillage+mur+1\" },\r\n      habillage_murs_2:             { url:\"https:\/\/via.placeholder.com\/900x700?text=Habillage+mur+2\" },\r\n      sol_antiderapant_ex1:         { url:\"https:\/\/via.placeholder.com\/900x700?text=Sol+antiderapant+1\" },\r\n      sol_antiderapant_ex2:         { url:\"https:\/\/via.placeholder.com\/900x700?text=Sol+antiderapant+2\" },\r\n      meubles_ex1:                  { url:\"https:\/\/via.placeholder.com\/900x700?text=Meuble+1\" },\r\n      meubles_ex2:                  { url:\"https:\/\/via.placeholder.com\/900x700?text=Meuble+2\" },\r\n      meubles_ex3:                  { url:\"https:\/\/via.placeholder.com\/900x700?text=Meuble+3\" },\r\n      meubles_ex4:                  { url:\"https:\/\/via.placeholder.com\/900x700?text=Meuble+4\" },\r\n      porte_coulissante_photo:      { url:\"https:\/\/via.placeholder.com\/900x700?text=Porte+coulissante\" },\r\n      seche_serviettes_photo:       { url:\"https:\/\/via.placeholder.com\/900x700?text=Seche-serviettes\" },\r\n      wc_sureleve_photo:            { url:\"https:\/\/via.placeholder.com\/900x700?text=WC+sureleve\" },\r\n      wc_suspendu_habillage_photo:  { url:\"https:\/\/via.placeholder.com\/900x700?text=WC+suspendu+avec+habillage\" },\r\n      wc_broyeur_silencieux_photo:  { url:\"https:\/\/via.placeholder.com\/900x700?text=WC+broyeur+silencieux\" },\r\n      garanties_photo_1:            { url:\"https:\/\/via.placeholder.com\/900x700?text=Garanties+1\" },\r\n      garanties_photo_2:            { url:\"https:\/\/via.placeholder.com\/900x700?text=Garanties+2\" }\r\n    }\r\n  };\r\n\r\n  var cfg = clone(DEF);\r\n  var adminUnlocked = false;\r\n  var app = null;\r\n\r\n  function getImg(key) { return cfg.images[key] ? cfg.images[key].url : \"\"; }\r\n  function setImageUrl(key, val) {\r\n    if (!cfg.images[key]) cfg.images[key]={url:\"\"};\r\n    cfg.images[key].url = String(val||\"\").trim();\r\n  }\r\n\r\n  var initialState = {\r\n    step:0, msg:\"\", showAlert:false, fenetre:\"\", implantation:\"\",\r\n    bacLongueur:120, bacLargeur:90, modele:\"\", verre:\"\",\r\n    forfaitMachineLaver:false, forfaitLavabo:false, forfaitBidet:false,\r\n    robinetterie:\"\", habillageMurs:\"\", habillageMursM2:0,\r\n    solAntiderapant:\"\", meubles:\"\", porteCoulissante:\"\", secheServiettes:\"\", solutionWc:\"\"\r\n  };\r\n  var state = clone(initialState);\r\n\r\n  function steps() {\r\n    return [\"home\",\"intro_bain\",\"avant_apres\",\"fenetre\",\"implantation\",\"taille_bac\",\r\n            \"modele\",\"verre\",\"robinetterie\",\"forfaits\",\"garanties_douche\",\"aides_douche\",\r\n            \"recap_douche\",\"price_douche\",\"proposition_sdb\",\"habillage_murs\",\"sol_antiderapant\",\r\n            \"meubles\",\"porte_coulissante\",\"seche_serviettes\",\"solutions_wc\",\r\n            \"recap_global\",\"price_global\",\"final_total\"];\r\n  }\r\n\r\n  function availableModeles() {\r\n    if (state.fenetre===\"oui\") return [\r\n      {key:\"fixe\",label:\"Paroi fixe\",img:\"fenetre_paroi_fixe\"},\r\n      {key:\"fixe_volet\",label:\"Paroi fixe + volet\",img:\"fenetre_paroi_fixe_volet\"}\r\n    ];\r\n    return [\r\n      {key:\"fixe\",label:\"Paroi fixe\",img:\"modele_fixe\"},\r\n      {key:\"fixe_volet\",label:\"Paroi fixe + volet\",img:\"modele_fixe_volet\"},\r\n      {key:\"fixe_volet_angle\",label:\"Fixe + volet + angle fixe\",img:\"modele_fixe_volet_angle\"},\r\n      {key:\"coulissante\",label:\"Paroi coulissante\",img:\"modele_coulissante\"},\r\n      {key:\"coulissante_angle\",label:\"Paroi coulissante + angle fixe\",img:\"modele_coulissante_angle\"},\r\n      {key:\"pivotante\",label:\"Porte pivotante\",img:\"modele_pivotante\"},\r\n      {key:\"pivotante_angle\",label:\"Porte pivotante + angle fixe\",img:\"modele_pivotante_angle\"},\r\n      {key:\"deux_pivotantes\",label:\"2 portes pivotantes\",img:\"modele_deux_pivotantes\"}\r\n    ];\r\n  }\r\n\r\n  function normalizeState() {\r\n    var ok = availableModeles().some(function(m){ return m.key===state.modele; });\r\n    if (!ok) state.modele=\"\";\r\n  }\r\n\r\n  function calcBreakdown() {\r\n    normalizeState();\r\n    var p = cfg.prices;\r\n    var douche = Number(p.prixBase||0)\r\n      + Number((p.base||{})[state.modele]||0)\r\n      + Number((p.verre||{})[state.verre]||0)\r\n      + Number((p.robinetterie||{})[state.robinetterie]||0)\r\n      + (state.forfaitMachineLaver?Number(p.forfaitMachineLaver||0):0)\r\n      + (state.forfaitLavabo?Number(p.forfaitLavabo||0):0)\r\n      + (state.forfaitBidet?Number(p.forfaitBidet||0):0);\r\n    var amenagements =\r\n      (state.habillageMurs===\"oui\"?Number(state.habillageMursM2||0)*Number(p.habillageMursM2||0):0)\r\n      + (state.solAntiderapant===\"oui\"?Number(p.solAntiderapant||0):0)\r\n      + (state.meubles===\"oui\"?Number(p.meubles||0):0)\r\n      + (state.porteCoulissante===\"oui\"?Number(p.porteCoulissante||0):0)\r\n      + (state.secheServiettes===\"oui\"?Number(p.secheServiettes||0):0);\r\n    var solutionWc = Number(p[state.solutionWc]||0);\r\n    return { douche:douche, amenagements:amenagements, solutionWc:solutionWc, total:douche+amenagements+solutionWc };\r\n  }\r\n\r\n  function validate(page) {\r\n    var v = {\r\n      fenetre:\"MERCI D'INDIQUER S'IL Y A UNE FEN\u00caTRE DANS LE PROLONGEMENT DE LA FUTURE PAROI\",\r\n      implantation:\"MERCI DE CHOISIR UNE IMPLANTATION\",\r\n      modele:\"MERCI DE CHOISIR UN MOD\u00c8LE\",\r\n      verre:\"MERCI DE CHOISIR UN TYPE DE VERRE\",\r\n      robinetterie:\"MERCI D'INDIQUER OUI OU NON POUR LE D\u00c9PLACEMENT DE ROBINETTERIE\",\r\n      habillage_murs:\"MERCI D'INDIQUER OUI OU NON POUR L'HABILLAGE DES MURS\",\r\n      sol_antiderapant:\"MERCI D'INDIQUER OUI OU NON POUR LE SOL ANTID\u00c9RAPANT\",\r\n      meubles:\"MERCI D'INDIQUER OUI OU NON POUR LES MEUBLES\",\r\n      porte_coulissante:\"MERCI D'INDIQUER OUI OU NON POUR LA PORTE COULISSANTE\",\r\n      seche_serviettes:\"MERCI D'INDIQUER OUI OU NON POUR LE S\u00c8CHE-SERVIETTES\",\r\n      solutions_wc:\"MERCI DE CHOISIR UNE SOLUTION WC\"\r\n    };\r\n    var stateKeys = {\r\n      fenetre:state.fenetre, implantation:state.implantation, modele:state.modele,\r\n      verre:state.verre, robinetterie:state.robinetterie, habillage_murs:state.habillageMurs,\r\n      sol_antiderapant:state.solAntiderapant, meubles:state.meubles,\r\n      porte_coulissante:state.porteCoulissante, seche_serviettes:state.secheServiettes,\r\n      solutions_wc:state.solutionWc\r\n    };\r\n    if (v[page] && !stateKeys[page]) return v[page];\r\n    if (page===\"taille_bac\") {\r\n      if (!Number.isInteger(Number(state.bacLongueur))||Number(state.bacLongueur)<=0) return \"MERCI D'INDIQUER UNE LONGUEUR VALIDE\";\r\n      if (!Number.isInteger(Number(state.bacLargeur))||Number(state.bacLargeur)<=0) return \"MERCI D'INDIQUER UNE LARGEUR VALIDE\";\r\n    }\r\n    return \"\";\r\n  }\r\n\r\n  function recapDoucheLines() {\r\n    var out=[];\r\n    if (state.fenetre) out.push(\"Fen\u00eatre dans le prolongement de la paroi : \"+(state.fenetre===\"oui\"?\"oui\":\"non\"));\r\n    if (state.implantation) out.push(\"Implantation : \"+state.implantation);\r\n    out.push(\"Receveur : \"+Number(state.bacLongueur||0)+\" x \"+Number(state.bacLargeur||0)+\" cm\");\r\n    if (state.modele) out.push(\"Mod\u00e8le : \"+state.modele);\r\n    if (state.verre) out.push(\"Verre : \"+state.verre);\r\n    if (state.robinetterie) out.push(\"Robinetterie d\u00e9plac\u00e9e : \"+state.robinetterie);\r\n    if (state.forfaitMachineLaver) out.push(\"D\u00e9placement machine \u00e0 laver : Oui\");\r\n    if (state.forfaitLavabo) out.push(\"D\u00e9placement lavabo : Oui\");\r\n    if (state.forfaitBidet) out.push(\"D\u00e9pose bidet : Oui\");\r\n    return out;\r\n  }\r\n\r\n  function recapGlobalLines() {\r\n    var out=recapDoucheLines();\r\n    if (state.habillageMurs) out.push(\"Habillage murs : \"+state.habillageMurs);\r\n    if (state.habillageMurs===\"oui\") out.push(\"Surface : \"+Number(state.habillageMursM2||0)+\" m\u00b2\");\r\n    if (state.solAntiderapant) out.push(\"Sol antid\u00e9rapant : \"+state.solAntiderapant);\r\n    if (state.meubles) out.push(\"Meubles : \"+state.meubles);\r\n    if (state.porteCoulissante) out.push(\"Porte coulissante : \"+state.porteCoulissante);\r\n    if (state.secheServiettes) out.push(\"S\u00e8che-serviettes : \"+state.secheServiettes);\r\n    if (state.solutionWc) out.push(\"Solution WC : \"+state.solutionWc);\r\n    return out;\r\n  }\r\n\r\n  function showComment(key) {\r\n    var t=(cfg.comments[key]||\"\").trim();\r\n    if (!t) return \"\";\r\n    return '<div class=\"commentWrap\"><button type=\"button\" class=\"commentToggle\" data-comment-open=\"'+escapeHtml(key)+'\"><span class=\"commentToggleIcon\">\u2726<\/span> Conseils<\/button><\/div>';\r\n  }\r\n  function choice(key,label,img,selected) {\r\n    return '<div class=\"choice '+(selected?'sel':'')+'\" data-choice=\"'+escapeHtml(key)+'\">'+\r\n      '<div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(img)+'\" alt=\"'+escapeHtml(label)+'\"><\/div>'+\r\n      '<div class=\"label\">'+escapeHtml(label)+'<\/div><\/div>';\r\n  }\r\n  function bigYesNo(selected,label,key) {\r\n    return '<button type=\"button\" class=\"bigCheck '+(selected?\"sel\":\"\")+'\" data-bigcheck=\"'+escapeHtml(key)+'\">'+escapeHtml(label)+'<\/button>';\r\n  }\r\n\r\n  function renderPage() {\r\n    normalizeState();\r\n    var id=steps()[state.step];\r\n    var bd=calcBreakdown();\r\n\r\n    if (id===\"home\") return '<div class=\"card\"><div class=\"h1 h1Large\">BONJOUR<\/div><div class=\"txt txtLarge\">Bienvenue.<br><br>En quelques \u00e9tapes simples, obtenez une estimation claire de votre future salle de bain.<br><br>Visite technique gratuite et sans engagement.<\/div>'+showComment(\"home\")+'<\/div>';\r\n\r\n    if (id===\"intro_bain\") return '<div class=\"card\"><div class=\"h2\">VOTRE PROJET SALLE DE BAIN<\/div><div class=\"txt txtLarge\">Parce que votre s\u00e9curit\u00e9 et votre confort sont notre priorit\u00e9, nous vous accompagnons dans le remplacement de votre baignoire par une douche s\u00e9curis\u00e9e, adapt\u00e9e \u00e0 votre quotidien.<br><br>Pas d\\'inqui\u00e9tude pour les travaux : dans la grande majorit\u00e9 des cas, tout est termin\u00e9 en une seule journ\u00e9e, avec un chantier propre et sans mauvaise surprise.<\/div>'+showComment(\"intro_bain\")+'<\/div>';\r\n\r\n    \/* === PAGE 3\/24 : 2 Avant colonne gauche, 2 Apr\u00e8s colonne droite === *\/\r\n    if (id===\"avant_apres\") return '<div class=\"card\"><div class=\"h2\">AVANT \/ APR\u00c8S<\/div><div class=\"txt txtLarge\">D\u00e9couvrez plusieurs exemples de transformation de salle de bain.<\/div><div class=\"grid avantApresGrid\">'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"avant_photo_1\"))+'\" alt=\"Avant 1\"><\/div><div class=\"label\">Avant<\/div><\/div>'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"apres_photo_1\"))+'\" alt=\"Apr\u00e8s 1\"><\/div><div class=\"label\">Apr\u00e8s<\/div><\/div>'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"avant_photo_2\"))+'\" alt=\"Avant 2\"><\/div><div class=\"label\">Avant<\/div><\/div>'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"apres_photo_2\"))+'\" alt=\"Apr\u00e8s 2\"><\/div><div class=\"label\">Apr\u00e8s<\/div><\/div>'+\r\n      '<\/div>'+showComment(\"avant_apres\")+'<\/div>';\r\n\r\n    \/* === PAGE 4\/24 : nouvelle question fen\u00eatre === *\/\r\n    if (id===\"fenetre\") return '<div class=\"card\"><div class=\"h2\">Y A-T-IL UNE FEN\u00caTRE DANS LE PROLONGEMENT DE LA FUTURE PAROI ?<\/div><div class=\"txt txtLarge\">Cliquez sur une image pour choisir.<\/div><div class=\"grid\">'+choice(\"oui\",\"Oui\",getImg(\"fenetre_oui\"),state.fenetre===\"oui\")+choice(\"non\",\"Non\",getImg(\"fenetre_non\"),state.fenetre===\"non\")+'<\/div>'+showComment(\"fenetre\")+'<\/div>';\r\n\r\n    if (id===\"implantation\") return '<div class=\"card\"><div class=\"h2\">IMPLANTATION<\/div><div class=\"txt txtLarge\">Choisissez l\\'implantation de votre douche.<\/div><div class=\"grid\">'+choice(\"angle\",\"En angle\",getImg(\"implantation_angle\"),state.implantation===\"angle\")+choice(\"niche\",\"En niche\",getImg(\"implantation_niche\"),state.implantation===\"niche\")+'<\/div>'+showComment(\"implantation\")+'<\/div>';\r\n\r\n    if (id===\"taille_bac\") {\r\n      var bL=Math.max(1,Number(state.bacLongueur||1)),bW=Math.max(1,Number(state.bacLargeur||1));\r\n      var mx=Math.max(bL,bW),mp=320;\r\n      var sW=Math.max(90,Math.round((bL\/mx)*mp)),sH=Math.max(90,Math.round((bW\/mx)*mp));\r\n      return '<div class=\"card\"><div class=\"h2\">TAILLE SOUHAIT\u00c9E DU RECEVEUR EXTRA PLAT<\/div><div class=\"txt\">Indiquez les dimensions souhait\u00e9es.<\/div>'+\r\n        '<div class=\"sizeGrid\"><div class=\"sizeBox\"><label class=\"lbl sizeLbl\">Longueur<\/label><div class=\"unitInputWrap unitInputWrapLarge\"><input class=\"num bigInput\" type=\"number\" min=\"1\" step=\"1\" inputmode=\"numeric\" value=\"'+Number(state.bacLongueur||0)+'\" data-act=\"bacLongueurInput\"><span class=\"unitFix unitFixLarge\">cm<\/span><\/div><\/div>'+\r\n        '<div class=\"sizeBox\"><label class=\"lbl sizeLbl\">Largeur<\/label><div class=\"unitInputWrap unitInputWrapLarge\"><input class=\"num bigInput\" type=\"number\" min=\"1\" step=\"1\" inputmode=\"numeric\" value=\"'+Number(state.bacLargeur||0)+'\" data-act=\"bacLargeurInput\"><span class=\"unitFix unitFixLarge\">cm<\/span><\/div><\/div><\/div>'+\r\n        '<div class=\"bacSchemaWrap\"><div class=\"bacSchemaTitle\">Sch\u00e9ma proportionnel du receveur<\/div><div class=\"bacSchemaStage\"><div class=\"bacSchemaBox\"><div class=\"bacSchemaRect\" style=\"width:'+sW+'px;height:'+sH+'px;\"><div class=\"bacSchemaLabel bacSchemaLabelTop\">'+bL+' cm<\/div><div class=\"bacSchemaLabel bacSchemaLabelSide\">'+bW+' cm<\/div><\/div><\/div><\/div><\/div>'+showComment(\"taille_bac\")+'<\/div>';\r\n    }\r\n\r\n    \/* === PAGE 7\/24 : utilise les nouvelles images si fen\u00eatre=oui === *\/\r\n    if (id===\"modele\") {\r\n      var mods=availableModeles();\r\n      return '<div class=\"card\"><div class=\"h2\">MOD\u00c8LE DE PAROI<\/div><div class=\"txt\">Choisissez votre mod\u00e8le.<\/div><div class=\"modeleGrid\">'+\r\n        mods.map(function(m){ return '<div class=\"choice '+(state.modele===m.key?'sel':'')+'\" data-choice=\"'+escapeHtml(m.key)+'\"><div class=\"media media169\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(m.img))+'\" alt=\"'+escapeHtml(m.label)+'\"><\/div><div class=\"label\">'+escapeHtml(m.label)+'<\/div><\/div>'; }).join(\"\")+\r\n        '<\/div>'+showComment(\"modele\")+'<\/div>';\r\n    }\r\n\r\n    if (id===\"verre\") return '<div class=\"card\"><div class=\"h2\">TYPE DE VERRE<\/div><div class=\"txt\">Choisissez votre finition.<\/div><div class=\"grid\">'+choice(\"transparent\",\"Verre transparent\",getImg(\"verre_transparent\"),state.verre===\"transparent\")+choice(\"depoli\",\"Verre d\u00e9poli\",getImg(\"verre_depoli\"),state.verre===\"depoli\")+'<\/div>'+showComment(\"verre\")+'<\/div>';\r\n\r\n    if (id===\"robinetterie\") return '<div class=\"card\"><div class=\"h2\">D\u00c9PLACEMENT DE LA ROBINETTERIE<\/div><div class=\"txt\">Indiquez si un d\u00e9placement est n\u00e9cessaire.<\/div><div class=\"grid\">'+choice(\"oui\",\"Oui\",getImg(\"robinetterie_oui\"),state.robinetterie===\"oui\")+choice(\"non\",\"Non\",getImg(\"robinetterie_non\"),state.robinetterie===\"non\")+'<\/div>'+showComment(\"robinetterie\")+'<\/div>';\r\n\r\n    if (id===\"forfaits\") return '<div class=\"card\"><div class=\"h2\">FORFAITS SUPPL\u00c9MENTAIRES DE MAIN D\\'\u0152UVRE<\/div><div class=\"txt\">S\u00e9lectionnez les forfaits n\u00e9cessaires \u00e0 votre projet.<\/div><div class=\"optionList\">'+\r\n      '<label class=\"toggleRow\"><input type=\"checkbox\" data-act=\"toggleMachineLaver\" '+(state.forfaitMachineLaver?\"checked\":\"\")+'>  <span>Forfait d\u00e9placement machine \u00e0 laver<\/span><\/label>'+\r\n      '<label class=\"toggleRow\"><input type=\"checkbox\" data-act=\"toggleLavabo\" '+(state.forfaitLavabo?\"checked\":\"\")+'>  <span>Forfait d\u00e9placement lavabo<\/span><\/label>'+\r\n      '<label class=\"toggleRow\"><input type=\"checkbox\" data-act=\"toggleBidet\" '+(state.forfaitBidet?\"checked\":\"\")+'>  <span>Forfait d\u00e9pose bidet<\/span><\/label>'+\r\n      '<\/div>'+showComment(\"forfaits\")+'<\/div>';\r\n\r\n    if (id===\"garanties_douche\") return '<div class=\"card\"><div class=\"h2\">GARANTIES<\/div><div class=\"smallPhotoGrid2\">'+\r\n      '<div class=\"smallPhotoCell\"><div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"garanties_photo_1\"))+'\" alt=\"Garanties 1\"><\/div><\/div><\/div>'+\r\n      '<div class=\"smallPhotoCell\"><div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"garanties_photo_2\"))+'\" alt=\"Garanties 2\"><\/div><\/div><\/div>'+\r\n      '<\/div><div class=\"guaranteeBig\">GARANTIE SUR LA FOURNITURE ET LA POSE<br><br>VISITE TECHNIQUE GRATUITE ET SANS ENGAGEMENT<\/div>'+showComment(\"garanties_douche\")+'<\/div>';\r\n\r\n    if (id===\"aides_douche\") return '<div class=\"card\"><div class=\"h2\">LES AIDES<\/div><div class=\"aidesOnlyText\">Nous vous conseillons de vous rendre dans la rubrique \u00ab\\u00a0aides\\u00a0\u00bb de notre site ou vous trouverez tous les informations n\u00e9cessaires.<br><br>Le conseiller technique pourra vous guider et vous aider \u00e0 constituer votre dossier.<\/div>'+showComment(\"aides_douche\")+'<\/div>';\r\n\r\n    if (id===\"recap_douche\") return '<div class=\"card\"><div class=\"h2\">R\u00c9CAPITULATIF DOUCHE S\u00c9CURIS\u00c9E<\/div><div class=\"recap\"><ul>'+recapDoucheLines().map(function(x){ return \"<li>\"+escapeHtml(x)+\"<\/li>\"; }).join(\"\")+'<\/ul><\/div>'+showComment(\"recap_douche\")+'<\/div>';\r\n\r\n    if (id===\"price_douche\") return '<div class=\"card\"><div class=\"h2\">VOTRE PRIX ESTIMATIF FINAL POUR LE REMPLACEMENT DE VOTRE BAIGNOIRE PAR UNE DOUCHE S\u00c9CURIS\u00c9E<\/div><div class=\"price\"><div class=\"big\">'+money(bd.douche)+'<\/div><div style=\"font-size:15px;color:rgba(255,255,255,.88);margin-top:8px;font-weight:700\">Estimation TTC pos\u00e9e<\/div><\/div><div class=\"finalPriceText\"><p>Ce prix est une estimation tr\u00e8s proche du r\u00e9el.<\/p><p>Il sera confirm\u00e9 lors de la visite, gratuite et sans engagement, du conseiller technique.<\/p><\/div>'+showComment(\"price_douche\")+'<\/div>';\r\n\r\n    if (id===\"proposition_sdb\") return '<div class=\"card\"><div class=\"h2\">ET SI VOUS EN PROFITIEZ ?<\/div><div class=\"txt txtLarge\">Et si vous en profitiez pour donner un coup de neuf \u00e0 toute votre salle de bain\\u00a0? Vous trouverez dans les prochaines pages toutes les options disponibles pour une r\u00e9novation compl\u00e8te, \u00e0 votre rythme et selon vos envies.<\/div><div class=\"propositionPhotoWrap\"><div class=\"propositionPhotoCardFull\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"proposition_sdb_photo\"))+'\" alt=\"R\u00e9novation salle de bain\"><\/div><\/div>'+showComment(\"proposition_sdb\")+'<\/div>';\r\n\r\n    if (id===\"habillage_murs\") return '<div class=\"card\"><div class=\"h2\">HABILLAGE DES MURS<\/div><div class=\"txt\">Habillage hors espace de douche \u2014 Dalles murales<\/div><div class=\"grid avantApresGrid\">'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"habillage_murs_1\"))+'\" alt=\"Habillage 1\"><\/div><div class=\"label\">Exemple<\/div><\/div>'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"habillage_murs_2\"))+'\" alt=\"Habillage 2\"><\/div><div class=\"label\">Exemple<\/div><\/div>'+\r\n      '<\/div><div class=\"recap\" style=\"margin-top:18px\"><div style=\"font-size:16px;line-height:1.9;text-align:left;max-width:780px;margin:0 auto\">\u2022 Mati\u00e8re SPC<br>\u2022 Clipsable et \u00e9tanche<br>\u2022 \u00c9paisseur 4 mm<br>\u2022 Garantie 10 ans<\/div><\/div><div class=\"bigCheckWrap\">'+bigYesNo(state.habillageMurs===\"oui\",\"OUI\",\"habillage_murs_oui\")+bigYesNo(state.habillageMurs===\"non\",\"NON\",\"habillage_murs_non\")+'<\/div>'+\r\n      (state.habillageMurs===\"oui\"?'<div class=\"measure\" style=\"margin-top:18px\"><div class=\"bigVal\">'+Number(state.habillageMursM2||0)+' m\u00b2<\/div><div style=\"max-width:520px;margin:16px auto 0\"><label class=\"lbl\" style=\"text-align:center;font-size:16px;margin-bottom:10px\">Surface \u00e0 habiller hors espace douche<\/label><div class=\"unitInputWrap unitInputWrapLarge\"><input class=\"num bigInput\" type=\"number\" min=\"0\" step=\"1\" inputmode=\"numeric\" value=\"'+Number(state.habillageMursM2||0)+'\" data-act=\"habillageMursInput\"><span class=\"unitFix unitFixLarge\">m\u00b2<\/span><\/div><\/div><div class=\"choiceBigInfo\">COULEUR \u00c0 D\u00c9FINIR AVEC LE CONSEILLER LORS DE LA VISITE TECHNIQUE<\/div><\/div>':'')+\r\n      showComment(\"habillage_murs\")+'<\/div>';\r\n\r\n    if (id===\"sol_antiderapant\") return '<div class=\"card\"><div class=\"h2\">SOL ANTID\u00c9RAPANT<\/div><div class=\"txt\">Option sols antid\u00e9rapants : finition R10 AKW<\/div><div class=\"grid avantApresGrid\">'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"sol_antiderapant_ex1\"))+'\" alt=\"Sol 1\"><\/div><div class=\"label\">Exemple<\/div><\/div>'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"sol_antiderapant_ex2\"))+'\" alt=\"Sol 2\"><\/div><div class=\"label\">Exemple<\/div><\/div>'+\r\n      '<\/div><div class=\"recap\" style=\"margin-top:18px\"><div style=\"font-size:16px;line-height:1.9;text-align:left;max-width:780px;margin:0 auto\">\u2022 Clipsable \u2022 \u00c9tanche \u2022 Sous-couche EVA 1 mm \u2022 \u00c9paisseur 5 mm \u2022 Garantie 15 ans<\/div><\/div><div class=\"bigCheckWrap\">'+bigYesNo(state.solAntiderapant===\"oui\",\"OUI\",\"sol_oui\")+bigYesNo(state.solAntiderapant===\"non\",\"NON\",\"sol_non\")+'<\/div>'+\r\n      (state.solAntiderapant===\"oui\"?'<div class=\"choiceBigInfo\">COULEUR \u00c0 D\u00c9FINIR AVEC LE CONSEILLER LORS DE LA VISITE TECHNIQUE<\/div>':'')+showComment(\"sol_antiderapant\")+'<\/div>';\r\n\r\n    if (id===\"meubles\") return '<div class=\"card\"><div class=\"h2\">MEUBLES<\/div><div class=\"txt\">Mod\u00e8le et couleur \u00e0 d\u00e9finir avec le conseiller.<\/div><div class=\"grid meublesGrid\">'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"meubles_ex1\"))+'\" alt=\"Meuble 1\"><\/div><div class=\"label\">Exemple<\/div><\/div>'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"meubles_ex2\"))+'\" alt=\"Meuble 2\"><\/div><div class=\"label\">Exemple<\/div><\/div>'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"meubles_ex3\"))+'\" alt=\"Meuble 3\"><\/div><div class=\"label\">Exemple<\/div><\/div>'+\r\n      '<div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"meubles_ex4\"))+'\" alt=\"Meuble 4\"><\/div><div class=\"label\">Exemple<\/div><\/div>'+\r\n      '<\/div><div class=\"bigCheckWrap\">'+bigYesNo(state.meubles===\"oui\",\"OUI\",\"meubles_oui\")+bigYesNo(state.meubles===\"non\",\"NON\",\"meubles_non\")+'<\/div>'+\r\n      (state.meubles===\"oui\"?'<div class=\"choiceBigInfo\">MOD\u00c8LE ET COULEUR \u00c0 D\u00c9FINIR AVEC LE CONSEILLER LORS DE LA VISITE TECHNIQUE<\/div>':'')+showComment(\"meubles\")+'<\/div>';\r\n\r\n    if (id===\"porte_coulissante\") return '<div class=\"card\"><div class=\"h2\">PORTE COULISSANTE SUR RAIL<\/div><div class=\"txt\">Mod\u00e8le \u00e0 d\u00e9finir avec le conseiller.<\/div><div class=\"smallSinglePhotoWrap\" style=\"margin-top:18px\"><div class=\"smallSinglePhotoCard\"><div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"porte_coulissante_photo\"))+'\" alt=\"Porte coulissante\"><\/div><div class=\"label\">Exemple<\/div><\/div><\/div><\/div><div class=\"recap\" style=\"margin-top:18px\"><div style=\"font-size:16px;line-height:1.9;text-align:left;max-width:780px;margin:0 auto\">\u2022 Fourniture et installation compl\u00e8te<br>\u2022 Rail silencieux avec accessoires inclus<br>\u2022 R\u00e9glages pr\u00e9cis et finitions soign\u00e9es<\/div><\/div><div class=\"bigCheckWrap\">'+bigYesNo(state.porteCoulissante===\"oui\",\"OUI\",\"porte_coulissante_oui\")+bigYesNo(state.porteCoulissante===\"non\",\"NON\",\"porte_coulissante_non\")+'<\/div>'+\r\n      (state.porteCoulissante===\"oui\"?'<div class=\"choiceBigInfo\">MOD\u00c8LE ET COULEUR \u00c0 D\u00c9FINIR AVEC LE CONSEILLER LORS DE LA VISITE TECHNIQUE<\/div>':'')+showComment(\"porte_coulissante\")+'<\/div>';\r\n\r\n    if (id===\"seche_serviettes\") return '<div class=\"card\"><div class=\"h2\">S\u00c8CHE-SERVIETTES HAUT CONFORT<\/div><div class=\"txt\">Mod\u00e8le \u00e0 d\u00e9finir avec le conseiller.<\/div><div class=\"smallSinglePhotoWrap\" style=\"margin-top:18px\"><div class=\"smallSinglePhotoCard\"><div class=\"fixedCard\"><div class=\"media\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"seche_serviettes_photo\"))+'\" alt=\"S\u00e8che-serviettes\"><\/div><div class=\"label\">Exemple<\/div><\/div><\/div><\/div><div class=\"recap\" style=\"margin-top:18px\"><div style=\"font-size:16px;line-height:1.9;text-align:left;max-width:780px;margin:0 auto\">\u2022 Design performant adapt\u00e9 \u00e0 votre salle de bain<br>\u2022 Mod\u00e8le au choix : \u00e9lectrique, mixte ou eau chaude<br>\u2022 Installation compl\u00e8te et mise en service<\/div><\/div><div class=\"bigCheckWrap\">'+bigYesNo(state.secheServiettes===\"oui\",\"OUI\",\"seche_oui\")+bigYesNo(state.secheServiettes===\"non\",\"NON\",\"seche_non\")+'<\/div>'+\r\n      (state.secheServiettes===\"oui\"?'<div class=\"choiceBigInfo\">MOD\u00c8LE ET COULEUR \u00c0 D\u00c9FINIR AVEC LE CONSEILLER LORS DE LA VISITE TECHNIQUE<\/div>':'')+showComment(\"seche_serviettes\")+'<\/div>';\r\n\r\n    if (id===\"solutions_wc\") return '<div class=\"card\"><div class=\"h2\">NOS SOLUTIONS WC<\/div><div class=\"txt\">Choisissez la solution WC adapt\u00e9e \u00e0 votre projet.<\/div><div class=\"grid wcGrid3\">'+\r\n      choice(\"wcSureleve\",\"WC sur\u00e9lev\u00e9\",getImg(\"wc_sureleve_photo\"),state.solutionWc===\"wcSureleve\")+\r\n      choice(\"wcSuspenduHabillage\",\"WC suspendu avec habillage\",getImg(\"wc_suspendu_habillage_photo\"),state.solutionWc===\"wcSuspenduHabillage\")+\r\n      choice(\"wcBroyeurSilencieux\",\"WC broyeur silencieux\",getImg(\"wc_broyeur_silencieux_photo\"),state.solutionWc===\"wcBroyeurSilencieux\")+\r\n      '<\/div><div class=\"wcNonWrap\"><button type=\"button\" class=\"wcNonBtn '+(state.solutionWc===\"non\"?\"sel\":\"\")+'\" data-choice=\"non\">NON<\/button><\/div>'+showComment(\"solutions_wc\")+'<\/div>';\r\n\r\n    if (id===\"recap_global\") return '<div class=\"card\"><div class=\"h2\">R\u00c9CAPITULATIF COMPLET<\/div><div class=\"recap\"><ul>'+recapGlobalLines().map(function(x){ return \"<li>\"+escapeHtml(x)+\"<\/li>\"; }).join(\"\")+'<\/ul><\/div>'+showComment(\"recap_global\")+'<\/div>';\r\n\r\n    if (id===\"price_global\") return '<div class=\"card\"><div class=\"h2\">DEVIS ESTIMATIF DE LA REMISE \u00c0 NIVEAU DE VOTRE SALLE DE BAIN<\/div><div class=\"recap priceBreakdown\">'+\r\n      '<div class=\"priceLine\"><span>Prix de la douche s\u00e9curis\u00e9e<\/span><strong>'+money(bd.douche)+'<\/strong><\/div>'+\r\n      '<div class=\"priceLine\"><span>Prix des am\u00e9nagements salle de bain<\/span><strong>'+money(bd.amenagements)+'<\/strong><\/div>'+\r\n      (state.solutionWc&&state.solutionWc!==\"non\"?'<div class=\"priceLine\"><span>Prix de la solution WC<\/span><strong>'+money(bd.solutionWc)+'<\/strong><\/div>':'')+\r\n      '<\/div>'+showComment(\"price_global\")+'<\/div>';\r\n\r\n    if (id===\"final_total\") return '<div class=\"card\"><div class=\"h2\">PRIX ESTIMATIF DE L\\'ENSEMBLE DES TRAVAUX<\/div><div class=\"price\"><div class=\"big\">'+money(bd.total)+'<\/div><div style=\"font-size:15px;color:rgba(255,255,255,.88);margin-top:8px;font-weight:700\">Estimation TTC pos\u00e9e<\/div><\/div><div class=\"finalPriceText\"><p>Ce prix est une estimation tr\u00e8s proche de la r\u00e9alit\u00e9.<\/p><p>Les mati\u00e8res, les couleurs et le prix seront valid\u00e9s lors de la visite gratuite et sans engagement du conseiller technique.<\/p><p>Le devis d\u00e9finitif sera confirm\u00e9 apr\u00e8s cette visite technique.<\/p><\/div><div class=\"nav\" style=\"margin-top:18px\"><a class=\"btn pri\" href=\"'+escapeHtml(cfg.contactUrl)+'\">'+escapeHtml(cfg.contactLabel)+'<\/a><\/div>'+showComment(\"final_total\")+'<\/div>';\r\n\r\n    return '<div class=\"card\"><div class=\"txt\">Page inconnue.<\/div><\/div>';\r\n  }\r\n\r\n  function renderCommentField(key,label) {\r\n    return '<div class=\"hr\"><\/div><label class=\"lbl\">'+escapeHtml(label)+'<\/label><textarea class=\"ta\" id=\"comment_'+escapeHtml(key)+'\">'+escapeHtml(cfg.comments[key]||\"\")+'<\/textarea>';\r\n  }\r\n  function renderImageField(key,label) {\r\n    var url=((cfg.images[key]||{}).url||\"\");\r\n    var inputId = key===\"logo\" ? \"boLogo\" : \"img_\"+key;\r\n    return '<div class=\"hr\"><\/div><label class=\"lbl\">'+escapeHtml(label)+' \u2014 URL<\/label>'+\r\n      '<input class=\"inp\" type=\"text\" inputmode=\"url\" id=\"'+escapeHtml(inputId)+'\" value=\"'+escapeHtml(url)+'\">'+\r\n      '<div class=\"boPreviewWrap\">'+(url?'<img decoding=\"async\" class=\"boPreview\" src=\"'+escapeHtml(url)+'\" alt=\"'+escapeHtml(label)+'\" onerror=\"this.style.display=\\'none\\'\">':'<div class=\"boPreview boPreviewEmpty\">Aucun aper\u00e7u<\/div>')+'<\/div>';\r\n  }\r\n\r\n  function renderBO() {\r\n    if (!adminUnlocked) return \"\";\r\n    var p=cfg.prices;\r\n    return '<div class=\"boOverlay\" id=\"boOverlay\">'+\r\n      '<div class=\"bo\">'+\r\n        '<div class=\"boHead\"><strong>Back Office \u2014 La Bienveillance Douche<\/strong>'+\r\n          '<div class=\"boHeadRight\"><button class=\"btn\" data-act=\"closeBo\">Fermer<\/button><\/div>'+\r\n        '<\/div>'+\r\n        '<div class=\"boBody\">'+\r\n          '<fieldset class=\"fs\"><legend>Global<\/legend>'+\r\n            '<label class=\"lbl\">Ligne d\\'en-t\u00eate<\/label><input class=\"inp\" type=\"text\" id=\"boCompanyLine\" value=\"'+escapeHtml(cfg.companyLine)+'\">'+\r\n            '<label class=\"lbl\" style=\"margin-top:10px\">URL bouton contact<\/label><input class=\"inp\" type=\"text\" id=\"boContactUrl\" value=\"'+escapeHtml(cfg.contactUrl)+'\">'+\r\n            '<label class=\"lbl\" style=\"margin-top:10px\">Texte bouton contact<\/label><input class=\"inp\" type=\"text\" id=\"boContactLabel\" value=\"'+escapeHtml(cfg.contactLabel)+'\">'+\r\n          '<\/fieldset>'+\r\n          '<fieldset class=\"fs\"><legend>Logo<\/legend>'+renderImageField(\"logo\",\"Logo\")+'<\/fieldset>'+\r\n          '<fieldset class=\"fs\"><legend>Prix<\/legend>'+\r\n            '<div><label class=\"lbl\">Prix de base<\/label><input class=\"num\" id=\"boPrixBase\" type=\"number\" value=\"'+p.prixBase+'\"><\/div><div class=\"hr\"><\/div>'+\r\n            '<div class=\"row2\"><div><label class=\"lbl\">Paroi fixe<\/label><input class=\"num\" id=\"boPrixFixe\" type=\"number\" value=\"'+p.base.fixe+'\"><\/div><div><label class=\"lbl\">Fixe + volet<\/label><input class=\"num\" id=\"boPrixFixeVolet\" type=\"number\" value=\"'+p.base.fixe_volet+'\"><\/div><\/div>'+\r\n            '<div class=\"row2\" style=\"margin-top:10px\"><div><label class=\"lbl\">Fixe + volet + angle<\/label><input class=\"num\" id=\"boPrixFixeVoletAngle\" type=\"number\" value=\"'+p.base.fixe_volet_angle+'\"><\/div><div><label class=\"lbl\">Paroi coulissante<\/label><input class=\"num\" id=\"boPrixCoulissante\" type=\"number\" value=\"'+p.base.coulissante+'\"><\/div><\/div>'+\r\n            '<div class=\"row2\" style=\"margin-top:10px\"><div><label class=\"lbl\">Coulissante + angle<\/label><input class=\"num\" id=\"boPrixCoulissanteAngle\" type=\"number\" value=\"'+p.base.coulissante_angle+'\"><\/div><div><label class=\"lbl\">Porte pivotante<\/label><input class=\"num\" id=\"boPrixPivotante\" type=\"number\" value=\"'+p.base.pivotante+'\"><\/div><\/div>'+\r\n            '<div class=\"row2\" style=\"margin-top:10px\"><div><label class=\"lbl\">Pivotante + angle<\/label><input class=\"num\" id=\"boPrixPivotanteAngle\" type=\"number\" value=\"'+p.base.pivotante_angle+'\"><\/div><div><label class=\"lbl\">2 portes pivotantes<\/label><input class=\"num\" id=\"boPrixDeuxPivotantes\" type=\"number\" value=\"'+p.base.deux_pivotantes+'\"><\/div><\/div>'+\r\n            '<div class=\"row2\" style=\"margin-top:10px\"><div><label class=\"lbl\">Verre transparent<\/label><input class=\"num\" id=\"boVerreTransparent\" type=\"number\" value=\"'+p.verre.transparent+'\"><\/div><div><label class=\"lbl\">Verre d\u00e9poli<\/label><input class=\"num\" id=\"boVerreDepoli\" type=\"number\" value=\"'+p.verre.depoli+'\"><\/div><\/div>'+\r\n            '<div class=\"row2\" style=\"margin-top:10px\"><div><label class=\"lbl\">Robinetterie non<\/label><input class=\"num\" id=\"boRobNon\" type=\"number\" value=\"'+p.robinetterie.non+'\"><\/div><div><label class=\"lbl\">Robinetterie oui<\/label><input class=\"num\" id=\"boRobOui\" type=\"number\" value=\"'+p.robinetterie.oui+'\"><\/div><\/div>'+\r\n            '<div class=\"row2\" style=\"margin-top:10px\"><div><label class=\"lbl\">Habillage murs \/ m\u00b2<\/label><input class=\"num\" id=\"boHabillageMursM2Prix\" type=\"number\" value=\"'+p.habillageMursM2+'\"><\/div><div><label class=\"lbl\">Sol antid\u00e9rapant<\/label><input class=\"num\" id=\"boSolAntiderapantPrix\" type=\"number\" value=\"'+p.solAntiderapant+'\"><\/div><\/div>'+\r\n            '<div class=\"row2\" style=\"margin-top:10px\"><div><label class=\"lbl\">Meubles<\/label><input class=\"num\" id=\"boMeublesPrix\" type=\"number\" value=\"'+p.meubles+'\"><\/div><div><label class=\"lbl\">Porte coulissante<\/label><input class=\"num\" id=\"boPorteCoulissantePrix\" type=\"number\" value=\"'+p.porteCoulissante+'\"><\/div><\/div>'+\r\n            '<div class=\"row2\" style=\"margin-top:10px\"><div><label class=\"lbl\">S\u00e8che-serviettes<\/label><input class=\"num\" id=\"boSecheServiettesPrix\" type=\"number\" value=\"'+p.secheServiettes+'\"><\/div><div><label class=\"lbl\">Forfait machine \u00e0 laver<\/label><input class=\"num\" id=\"boForfaitMachineLaverPrix\" type=\"number\" value=\"'+p.forfaitMachineLaver+'\"><\/div><\/div>'+\r\n            '<div class=\"row2\" style=\"margin-top:10px\"><div><label class=\"lbl\">Forfait lavabo<\/label><input class=\"num\" id=\"boForfaitLavaboPrix\" type=\"number\" value=\"'+p.forfaitLavabo+'\"><\/div><div><label class=\"lbl\">Forfait bidet<\/label><input class=\"num\" id=\"boForfaitBidetPrix\" type=\"number\" value=\"'+p.forfaitBidet+'\"><\/div><\/div>'+\r\n            '<div class=\"row2\" style=\"margin-top:10px\"><div><label class=\"lbl\">WC sur\u00e9lev\u00e9<\/label><input class=\"num\" id=\"boWcSurelevePrix\" type=\"number\" value=\"'+p.wcSureleve+'\"><\/div><div><label class=\"lbl\">WC suspendu + habillage<\/label><input class=\"num\" id=\"boWcSuspenduHabillagePrix\" type=\"number\" value=\"'+p.wcSuspenduHabillage+'\"><\/div><\/div>'+\r\n            '<div class=\"row2\" style=\"margin-top:10px\"><div><label class=\"lbl\">WC broyeur silencieux<\/label><input class=\"num\" id=\"boWcBroyeurSilencieuxPrix\" type=\"number\" value=\"'+p.wcBroyeurSilencieux+'\"><\/div><div><\/div><\/div>'+\r\n          '<\/fieldset>'+\r\n          '<fieldset class=\"fs\"><legend>Commentaires \"Conseils\"<\/legend>'+\r\n            renderCommentField(\"home\",\"Accueil\")+renderCommentField(\"intro_bain\",\"Intro bain\")+renderCommentField(\"avant_apres\",\"Avant \/ Apr\u00e8s\")+renderCommentField(\"fenetre\",\"Fen\u00eatre\")+renderCommentField(\"implantation\",\"Implantation\")+renderCommentField(\"taille_bac\",\"Taille bac\")+renderCommentField(\"modele\",\"Mod\u00e8le\")+renderCommentField(\"verre\",\"Verre\")+renderCommentField(\"robinetterie\",\"Robinetterie\")+renderCommentField(\"forfaits\",\"Forfaits\")+renderCommentField(\"garanties_douche\",\"Garanties douche\")+renderCommentField(\"aides_douche\",\"Aides douche\")+renderCommentField(\"recap_douche\",\"R\u00e9cap douche\")+renderCommentField(\"price_douche\",\"Prix douche\")+renderCommentField(\"proposition_sdb\",\"Proposition SDB\")+renderCommentField(\"habillage_murs\",\"Habillage murs\")+renderCommentField(\"sol_antiderapant\",\"Sol antid\u00e9rapant\")+renderCommentField(\"meubles\",\"Meubles\")+renderCommentField(\"porte_coulissante\",\"Porte coulissante\")+renderCommentField(\"seche_serviettes\",\"S\u00e8che-serviettes\")+renderCommentField(\"solutions_wc\",\"Solutions WC\")+renderCommentField(\"recap_global\",\"R\u00e9cap global\")+renderCommentField(\"garanties_global\",\"Garanties global\")+renderCommentField(\"aides_global\",\"Aides global\")+renderCommentField(\"price_global\",\"Prix global\")+renderCommentField(\"final_total\",\"Prix final total\")+\r\n          '<\/fieldset>'+\r\n          '<fieldset class=\"fs\"><legend>URLs images<\/legend>'+\r\n            renderImageField(\"avant_photo_1\",\"Photo avant 1\")+renderImageField(\"avant_photo_2\",\"Photo avant 2\")+renderImageField(\"apres_photo_1\",\"Photo apr\u00e8s 1\")+renderImageField(\"apres_photo_2\",\"Photo apr\u00e8s 2\")+renderImageField(\"apres_photo_3\",\"Photo apr\u00e8s 3 (non affich\u00e9e p.3)\")+renderImageField(\"apres_photo_4\",\"Photo apr\u00e8s 4 (non affich\u00e9e p.3)\")+renderImageField(\"fenetre_oui\",\"Fen\u00eatre oui\")+renderImageField(\"fenetre_non\",\"Pas de fen\u00eatre\")+\r\n            renderImageField(\"fenetre_paroi_fixe\",\"Paroi fixe avec fen\u00eatre (page 7)\")+renderImageField(\"fenetre_paroi_fixe_volet\",\"Paroi fixe + volet avec fen\u00eatre (page 7)\")+\r\n            renderImageField(\"implantation_angle\",\"Implantation angle\")+renderImageField(\"implantation_niche\",\"Implantation niche\")+renderImageField(\"modele_fixe\",\"Paroi fixe\")+renderImageField(\"modele_fixe_volet\",\"Fixe + volet\")+renderImageField(\"modele_fixe_volet_angle\",\"Fixe + volet + angle\")+renderImageField(\"modele_coulissante\",\"Paroi coulissante\")+renderImageField(\"modele_coulissante_angle\",\"Coulissante + angle\")+renderImageField(\"modele_pivotante\",\"Porte pivotante\")+renderImageField(\"modele_pivotante_angle\",\"Pivotante + angle\")+renderImageField(\"modele_deux_pivotantes\",\"2 portes pivotantes\")+renderImageField(\"verre_transparent\",\"Verre transparent\")+renderImageField(\"verre_depoli\",\"Verre d\u00e9poli\")+renderImageField(\"robinetterie_oui\",\"Robinetterie oui\")+renderImageField(\"robinetterie_non\",\"Robinetterie non\")+renderImageField(\"proposition_sdb_photo\",\"Photo proposition SDB\")+renderImageField(\"habillage_murs_1\",\"Habillage murs 1\")+renderImageField(\"habillage_murs_2\",\"Habillage murs 2\")+renderImageField(\"sol_antiderapant_ex1\",\"Sol antid\u00e9rapant 1\")+renderImageField(\"sol_antiderapant_ex2\",\"Sol antid\u00e9rapant 2\")+renderImageField(\"meubles_ex1\",\"Meubles 1\")+renderImageField(\"meubles_ex2\",\"Meubles 2\")+renderImageField(\"meubles_ex3\",\"Meubles 3\")+renderImageField(\"meubles_ex4\",\"Meubles 4\")+renderImageField(\"porte_coulissante_photo\",\"Porte coulissante\")+renderImageField(\"seche_serviettes_photo\",\"S\u00e8che-serviettes\")+renderImageField(\"wc_sureleve_photo\",\"WC sur\u00e9lev\u00e9\")+renderImageField(\"wc_suspendu_habillage_photo\",\"WC suspendu + habillage\")+renderImageField(\"wc_broyeur_silencieux_photo\",\"WC broyeur silencieux\")+renderImageField(\"garanties_photo_1\",\"Garanties 1\")+renderImageField(\"garanties_photo_2\",\"Garanties 2\")+\r\n          '<\/fieldset>'+\r\n        '<\/div>'+\r\n        '<div class=\"boActions\">'+\r\n          '<button class=\"btn\" data-act=\"closeBo\">Fermer<\/button>'+\r\n          '<button class=\"btn pri\" data-act=\"saveBo\">Enregistrer<\/button>'+\r\n        '<\/div>'+\r\n      '<\/div>'+\r\n    '<\/div>';\r\n  }\r\n\r\n  function saveBOToCfg() {\r\n    var fv = function(id){ var n=app.querySelector(id); return n?n.value:null; };\r\n    var fn = function(id){ var v=fv(id); return v!==null?Number(v||0):null; };\r\n    if (fv(\"#boCompanyLine\")!==null) cfg.companyLine=fv(\"#boCompanyLine\");\r\n    if (fv(\"#boContactUrl\")!==null)  cfg.contactUrl=fv(\"#boContactUrl\");\r\n    if (fv(\"#boContactLabel\")!==null) cfg.contactLabel=fv(\"#boContactLabel\");\r\n    var priceMap = {\r\n      boPrixBase:\"prixBase\", boPrixFixe:\"base.fixe\", boPrixFixeVolet:\"base.fixe_volet\",\r\n      boPrixFixeVoletAngle:\"base.fixe_volet_angle\", boPrixCoulissante:\"base.coulissante\",\r\n      boPrixCoulissanteAngle:\"base.coulissante_angle\", boPrixPivotante:\"base.pivotante\",\r\n      boPrixPivotanteAngle:\"base.pivotante_angle\", boPrixDeuxPivotantes:\"base.deux_pivotantes\",\r\n      boVerreTransparent:\"verre.transparent\", boVerreDepoli:\"verre.depoli\",\r\n      boRobNon:\"robinetterie.non\", boRobOui:\"robinetterie.oui\",\r\n      boHabillageMursM2Prix:\"habillageMursM2\", boSolAntiderapantPrix:\"solAntiderapant\",\r\n      boMeublesPrix:\"meubles\", boPorteCoulissantePrix:\"porteCoulissante\",\r\n      boSecheServiettesPrix:\"secheServiettes\", boWcSurelevePrix:\"wcSureleve\",\r\n      boWcSuspenduHabillagePrix:\"wcSuspenduHabillage\", boWcBroyeurSilencieuxPrix:\"wcBroyeurSilencieux\",\r\n      boForfaitMachineLaverPrix:\"forfaitMachineLaver\", boForfaitLavaboPrix:\"forfaitLavabo\",\r\n      boForfaitBidetPrix:\"forfaitBidet\"\r\n    };\r\n    Object.keys(priceMap).forEach(function(id) {\r\n      var v=fn(\"#\"+id); if (v===null) return;\r\n      var path=priceMap[id].split(\".\");\r\n      if (path.length===1) cfg.prices[path[0]]=v;\r\n      else cfg.prices[path[0]][path[1]]=v;\r\n    });\r\n    var imgKeys=[\"logo\",\"avant_photo_1\",\"avant_photo_2\",\"apres_photo_1\",\"apres_photo_2\",\"apres_photo_3\",\"apres_photo_4\",\r\n      \"fenetre_oui\",\"fenetre_non\",\"fenetre_paroi_fixe\",\"fenetre_paroi_fixe_volet\",\r\n      \"implantation_angle\",\"implantation_niche\",\"modele_fixe\",\"modele_fixe_volet\",\"modele_fixe_volet_angle\",\"modele_coulissante\",\"modele_coulissante_angle\",\"modele_pivotante\",\"modele_pivotante_angle\",\"modele_deux_pivotantes\",\"verre_transparent\",\"verre_depoli\",\"robinetterie_oui\",\"robinetterie_non\",\"proposition_sdb_photo\",\"habillage_murs_1\",\"habillage_murs_2\",\"sol_antiderapant_ex1\",\"sol_antiderapant_ex2\",\"meubles_ex1\",\"meubles_ex2\",\"meubles_ex3\",\"meubles_ex4\",\"porte_coulissante_photo\",\"seche_serviettes_photo\",\"wc_sureleve_photo\",\"wc_suspendu_habillage_photo\",\"wc_broyeur_silencieux_photo\",\"garanties_photo_1\",\"garanties_photo_2\"];\r\n    imgKeys.forEach(function(k){\r\n      var inputId=k===\"logo\"?\"#boLogo\":\"#img_\"+k;\r\n      var v=fv(inputId); if (v!==null) setImageUrl(k,v);\r\n    });\r\n    Object.keys(DEF.comments).forEach(function(k){\r\n      var v=fv(\"#comment_\"+k); if (v!==null) cfg.comments[k]=v;\r\n    });\r\n  }\r\n\r\n  function renderCommentModal() {\r\n    return '<div class=\"commentModalOverlay\" id=\"commentModalOverlay\">'+\r\n      '<div class=\"commentModal\" role=\"dialog\" aria-modal=\"true\">'+\r\n        '<div class=\"commentModalHead\">'+\r\n          '<div><div class=\"commentModalEyebrow\">La Bienveillance<\/div><div class=\"commentModalTitle\">Conseils<\/div><\/div>'+\r\n          '<button type=\"button\" class=\"commentModalX\" data-comment-close=\"1\">\u00d7<\/button>'+\r\n        '<\/div>'+\r\n        '<div class=\"commentModalBody\" id=\"commentModalBody\"><\/div>'+\r\n        '<div class=\"commentModalActions\"><button type=\"button\" class=\"btn pri\" data-comment-close=\"1\">Fermer<\/button><\/div>'+\r\n      '<\/div><\/div>';\r\n  }\r\n  function openCommentModal(key) {\r\n    var txt=(cfg.comments[key]||\"\").trim(); if (!txt) return;\r\n    var ov=document.getElementById(\"commentModalOverlay\"),bd=document.getElementById(\"commentModalBody\");\r\n    if (!ov||!bd) return;\r\n    bd.innerHTML=escapeHtml(txt).replace(\/\\n\/g,\"<br>\");\r\n    ov.classList.add(\"show\"); document.body.classList.add(\"jlmNoScroll\");\r\n  }\r\n  function closeCommentModal() {\r\n    var ov=document.getElementById(\"commentModalOverlay\"),bd=document.getElementById(\"commentModalBody\");\r\n    if (ov) ov.classList.remove(\"show\"); if (bd) bd.innerHTML=\"\";\r\n    document.body.classList.remove(\"jlmNoScroll\");\r\n  }\r\n\r\n  function render() {\r\n    normalizeState();\r\n    var ids=steps();\r\n    if (state.step>ids.length-1) state.step=ids.length-1;\r\n    var cur=ids[state.step];\r\n    var progress=Math.round(((state.step+1)\/ids.length)*100);\r\n\r\n    app.innerHTML=\r\n      '<div class=\"top\">'+\r\n        '<div class=\"brand\">'+\r\n          '<div class=\"logo\"><img decoding=\"async\" src=\"'+escapeHtml(getImg(\"logo\"))+'\" alt=\"Logo\"><\/div>'+\r\n          '<div><div class=\"small\">'+escapeHtml(cfg.companyLine)+'<\/div><\/div>'+\r\n        '<\/div>'+\r\n        '<div class=\"progress\"><div class=\"pill\">'+(state.step+1)+' \/ '+ids.length+'<\/div><div class=\"bar\"><i style=\"width:'+progress+'%\"><\/i><\/div><\/div>'+\r\n      '<\/div>'+\r\n      '<div class=\"alertBand '+(state.showAlert?\"show\":\"\")+'\">'+(state.msg||\"MERCI DE FAIRE UN CHOIX AVANT DE CONTINUER\")+'<\/div>'+\r\n      renderPage()+\r\n      '<div class=\"nav\">'+\r\n        '<button class=\"btn reset\" data-act=\"reset\">R\u00c9INITIALISER<\/button>'+\r\n        '<button class=\"btn\" data-act=\"prev\" '+(state.step===0?\"disabled\":\"\")+'>RETOUR<\/button>'+\r\n        (cur===\"final_total\"?\"\":'<button class=\"btn pri\" data-act=\"next\">SUIVANT<\/button>')+\r\n      '<\/div>'+\r\n      renderBO()+\r\n      renderCommentModal();\r\n\r\n    app.querySelectorAll(\"[data-choice]\").forEach(function(el) {\r\n      el.addEventListener(\"click\", function() {\r\n        var k=el.getAttribute(\"data-choice\");\r\n        if (cur===\"fenetre\"){ state.fenetre=k; state.modele=\"\"; }\r\n        if (cur===\"implantation\") state.implantation=k;\r\n        if (cur===\"modele\") state.modele=k;\r\n        if (cur===\"verre\") state.verre=k;\r\n        if (cur===\"robinetterie\") state.robinetterie=k;\r\n        if (cur===\"solutions_wc\") state.solutionWc=k;\r\n        state.msg=\"\"; state.showAlert=false; render();\r\n      });\r\n    });\r\n    app.querySelectorAll(\"[data-bigcheck]\").forEach(function(btn) {\r\n      btn.addEventListener(\"click\", function() {\r\n        var k=btn.getAttribute(\"data-bigcheck\");\r\n        if (k===\"habillage_murs_oui\") state.habillageMurs=\"oui\";\r\n        if (k===\"habillage_murs_non\"){ state.habillageMurs=\"non\"; state.habillageMursM2=0; }\r\n        if (k===\"sol_oui\") state.solAntiderapant=\"oui\";\r\n        if (k===\"sol_non\") state.solAntiderapant=\"non\";\r\n        if (k===\"meubles_oui\") state.meubles=\"oui\";\r\n        if (k===\"meubles_non\") state.meubles=\"non\";\r\n        if (k===\"porte_coulissante_oui\") state.porteCoulissante=\"oui\";\r\n        if (k===\"porte_coulissante_non\") state.porteCoulissante=\"non\";\r\n        if (k===\"seche_oui\") state.secheServiettes=\"oui\";\r\n        if (k===\"seche_non\") state.secheServiettes=\"non\";\r\n        state.msg=\"\"; state.showAlert=false; render();\r\n      });\r\n    });\r\n    var bacL=app.querySelector('[data-act=\"bacLongueurInput\"]');\r\n    if (bacL) bacL.addEventListener(\"input\",function(){ state.bacLongueur=parseInt(bacL.value||\"0\")||0; render(); });\r\n    var bacW=app.querySelector('[data-act=\"bacLargeurInput\"]');\r\n    if (bacW) bacW.addEventListener(\"input\",function(){ state.bacLargeur=parseInt(bacW.value||\"0\")||0; render(); });\r\n    app.querySelectorAll('[data-act=\"habillageMursInput\"]').forEach(function(inp){\r\n      inp.addEventListener(\"input\",function(){ state.habillageMursM2=parseInt(inp.value||\"0\")||0; });\r\n      inp.addEventListener(\"change\",function(){ render(); });\r\n    });\r\n    var mac=app.querySelector('[data-act=\"toggleMachineLaver\"]');\r\n    if (mac) mac.addEventListener(\"change\",function(){ state.forfaitMachineLaver=!!mac.checked; render(); });\r\n    var lav=app.querySelector('[data-act=\"toggleLavabo\"]');\r\n    if (lav) lav.addEventListener(\"change\",function(){ state.forfaitLavabo=!!lav.checked; render(); });\r\n    var bid=app.querySelector('[data-act=\"toggleBidet\"]');\r\n    if (bid) bid.addEventListener(\"change\",function(){ state.forfaitBidet=!!bid.checked; render(); });\r\n    app.querySelectorAll('[data-act=\"reset\"]').forEach(function(btn){\r\n      btn.addEventListener(\"click\",function(){\r\n        if (window.confirm(\"R\u00e9initialiser le configurateur ?\")){ state=clone(initialState); closeCommentModal(); render(); }\r\n      });\r\n    });\r\n    app.querySelectorAll('[data-act=\"next\"]').forEach(function(btn){\r\n      btn.addEventListener(\"click\",function(){\r\n        var err=validate(steps()[state.step]);\r\n        if (err){ state.msg=err; state.showAlert=true; render(); return; }\r\n        if (state.step<steps().length-1){ closeCommentModal(); state.step++; state.msg=\"\"; state.showAlert=false; render(); }\r\n      });\r\n    });\r\n    app.querySelectorAll('[data-act=\"prev\"]').forEach(function(btn){\r\n      btn.addEventListener(\"click\",function(){\r\n        if (state.step>0){ closeCommentModal(); state.step--; state.msg=\"\"; state.showAlert=false; render(); }\r\n      });\r\n    });\r\n    app.querySelectorAll(\"[data-comment-open]\").forEach(function(btn){\r\n      btn.addEventListener(\"click\",function(){ openCommentModal(btn.getAttribute(\"data-comment-open\")); });\r\n    });\r\n    app.querySelectorAll(\"[data-comment-close]\").forEach(function(btn){\r\n      btn.addEventListener(\"click\",function(){ closeCommentModal(); });\r\n    });\r\n    var mo=document.getElementById(\"commentModalOverlay\");\r\n    if (mo) mo.addEventListener(\"click\",function(e){ if (e.target===mo) closeCommentModal(); });\r\n    app.querySelectorAll('[data-act=\"closeBo\"]').forEach(function(btn){\r\n      btn.addEventListener(\"click\",function(){\r\n        var bo=document.getElementById(\"boOverlay\");\r\n        if (bo) bo.classList.remove(\"show\");\r\n      });\r\n    });\r\n    app.querySelectorAll('[data-act=\"saveBo\"]').forEach(function(btn){\r\n      btn.addEventListener(\"click\", async function(){\r\n        saveBOToCfg();\r\n        var ok = await wpSaveConfig();\r\n        var bo=document.getElementById(\"boOverlay\");\r\n        if (bo) bo.classList.remove(\"show\");\r\n        render();\r\n        alert(ok ? \"\u2713 Configuration enregistr\u00e9e dans WordPress.\" : \"\u26a0 Enregistrement local uniquement (non connect\u00e9 en admin).\");\r\n      });\r\n    });\r\n    var logo=app.querySelector(\".logo\");\r\n    if (logo) logo.addEventListener(\"dblclick\",function(e){\r\n      e.preventDefault(); e.stopPropagation();\r\n      if (!adminUnlocked) {\r\n        var code=window.prompt(\"Code d'acc\u00e8s Back Office :\"); if (code===null) return;\r\n        if (String(code||\"\").trim()!==ADMIN_CODE){ alert(\"Code incorrect.\"); return; }\r\n        adminUnlocked=true; render();\r\n        var bo=document.getElementById(\"boOverlay\");\r\n        if (bo) bo.classList.add(\"show\");\r\n      } else {\r\n        var bo2=document.getElementById(\"boOverlay\");\r\n        if (bo2) bo2.classList.toggle(\"show\");\r\n      }\r\n    });\r\n    setTimeout(function(){\r\n      var bo=document.getElementById(\"boOverlay\");\r\n      if (!bo) return;\r\n      bo.querySelectorAll(\"input,textarea\").forEach(function(el){\r\n        el.setAttribute(\"autocomplete\",\"off\");\r\n        el.addEventListener(\"paste\",function(e){ e.stopPropagation(); },true);\r\n        el.addEventListener(\"keydown\",function(e){ e.stopPropagation(); },true);\r\n        el.addEventListener(\"keyup\",function(e){ e.stopPropagation(); },true);\r\n        el.addEventListener(\"cut\",function(e){ e.stopPropagation(); },true);\r\n        el.addEventListener(\"copy\",function(e){ e.stopPropagation(); },true);\r\n        el.style.pointerEvents=\"auto\";\r\n        el.style.userSelect=\"text\";\r\n        el.style.webkitUserSelect=\"text\";\r\n      });\r\n    }, 100);\r\n  }\r\n\r\n  var styleNode = document.createElement(\"style\");\r\n  styleNode.textContent = `\r\n:root{--bg:#071327;--bg2:#050C19;--bd:rgba(255,255,255,.14);--txt:#fff;--muted:rgba(255,255,255,.78);--orange:#F97316;--orange2:#EA580C;--danger1:#DC2626;--danger2:#F97316}\r\nbody.jlmNoScroll{overflow:hidden}\r\n#jlmDoucheAppRoot *{box-sizing:border-box}\r\n#jlmDoucheAppRoot{font-family:Arial,Helvetica,sans-serif;color:var(--txt);background:radial-gradient(1200px 560px at 15% 0%,rgba(249,115,22,.18),transparent 60%),radial-gradient(1000px 700px at 85% 10%,rgba(59,130,246,.12),transparent 60%),linear-gradient(180deg,var(--bg),var(--bg2) 58%,#040A14);border-radius:20px;padding:14px 10px 18px;overflow:hidden}\r\n#jlmDoucheAppRoot .app{width:100%;max-width:1120px;margin:0 auto}\r\n#jlmDoucheAppRoot .top{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 2px 2px;margin-bottom:4px}\r\n#jlmDoucheAppRoot .brand{display:flex;align-items:center;gap:8px;min-width:0}\r\n#jlmDoucheAppRoot .logo{width:138px;height:138px;border-radius:18px;border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.05);display:flex;align-items:center;justify-content:center;overflow:hidden;flex:0 0 auto;padding:8px;cursor:pointer}\r\n#jlmDoucheAppRoot .logo img{width:100%;height:100%;object-fit:contain;display:block}\r\n#jlmDoucheAppRoot .small{font-size:9px;color:var(--muted);line-height:1.05;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\r\n#jlmDoucheAppRoot .progress{display:flex;align-items:center;gap:5px;min-width:120px;flex:0 1 220px}\r\n#jlmDoucheAppRoot .pill{font-size:9px;padding:3px 6px;border-radius:999px;border:1px solid rgba(255,255,255,.10);background:rgba(255,255,255,.04)}\r\n#jlmDoucheAppRoot .bar{height:5px;flex:1;border-radius:999px;border:1px solid rgba(255,255,255,.10);background:rgba(255,255,255,.04);overflow:hidden}\r\n#jlmDoucheAppRoot .bar i{display:block;height:100%;width:0%;background:linear-gradient(90deg,var(--orange),#FDBA74)}\r\n#jlmDoucheAppRoot .alertBand{display:none;width:100%;margin:0 0 10px;padding:14px 18px;border-radius:18px;background:linear-gradient(90deg,var(--danger1),var(--danger2));color:#fff;font-size:18px;font-weight:800;text-align:center;box-shadow:0 18px 40px rgba(0,0,0,.24)}\r\n#jlmDoucheAppRoot .alertBand.show{display:block}\r\n#jlmDoucheAppRoot .card{background:linear-gradient(180deg,rgba(255,255,255,.06),rgba(255,255,255,.035));border:1px solid var(--bd);border-radius:24px;padding:18px 16px;box-shadow:0 20px 50px rgba(0,0,0,.28)}\r\n#jlmDoucheAppRoot .h1,#jlmDoucheAppRoot .h2{text-align:center;margin:2px 0 10px}\r\n#jlmDoucheAppRoot .h1{font-size:34px}\r\n#jlmDoucheAppRoot .h1Large{font-size:46px}\r\n#jlmDoucheAppRoot .h2{font-size:25px}\r\n#jlmDoucheAppRoot .txt{max-width:980px;margin:0 auto;text-align:center;line-height:1.7;font-size:16px;color:rgba(255,255,255,.94)}\r\n#jlmDoucheAppRoot .txtLarge{font-size:22px;line-height:1.9;max-width:1020px;font-weight:700}\r\n#jlmDoucheAppRoot .grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-top:14px}\r\n#jlmDoucheAppRoot .choice,#jlmDoucheAppRoot .fixedCard{border-radius:22px;border:1px solid rgba(255,255,255,.12);background:linear-gradient(180deg,rgba(255,255,255,.06),rgba(255,255,255,.035));overflow:hidden;box-shadow:0 10px 24px rgba(0,0,0,.14)}\r\n#jlmDoucheAppRoot .choice{cursor:pointer;transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease;position:relative}\r\n#jlmDoucheAppRoot .choice:hover{transform:translateY(-4px);border-color:rgba(249,115,22,.55);box-shadow:0 16px 34px rgba(0,0,0,.22)}\r\n#jlmDoucheAppRoot .choice.sel{border-color:rgba(249,115,22,.92);box-shadow:0 0 0 2px rgba(249,115,22,.22) inset,0 16px 34px rgba(0,0,0,.22)}\r\n#jlmDoucheAppRoot .choice.sel:after{content:\"\u2713\";position:absolute;top:10px;right:12px;width:34px;height:34px;border-radius:999px;display:flex;align-items:center;justify-content:center;background:linear-gradient(180deg,var(--orange),var(--orange2));color:#fff;font-weight:900;font-size:18px}\r\n#jlmDoucheAppRoot .media{aspect-ratio:1\/1;background:rgba(255,255,255,.03);display:flex;align-items:center;justify-content:center}\r\n#jlmDoucheAppRoot .media img{width:100%;height:100%;object-fit:contain;display:block;background:rgba(255,255,255,.03)}\r\n#jlmDoucheAppRoot .media169{aspect-ratio:16\/9}\r\n#jlmDoucheAppRoot .label{padding:12px 12px 14px;text-align:center;font-size:15px;font-weight:700}\r\n#jlmDoucheAppRoot .avantApresGrid{grid-template-columns:repeat(2,minmax(0,1fr))}\r\n#jlmDoucheAppRoot .avantApresGrid6{grid-template-columns:repeat(3,minmax(0,1fr))}\r\n#jlmDoucheAppRoot .meublesGrid{grid-template-columns:repeat(2,minmax(0,1fr))}\r\n#jlmDoucheAppRoot .measure{max-width:980px;margin:10px auto 0;text-align:center}\r\n#jlmDoucheAppRoot .bigVal{font-size:32px;font-weight:800;margin-top:6px}\r\n#jlmDoucheAppRoot .recap{max-width:980px;margin:16px auto 0;border-radius:20px;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.16);padding:16px;text-align:center}\r\n#jlmDoucheAppRoot .recap ul{display:inline-block;text-align:left;line-height:1.7;margin:0;padding-left:18px}\r\n#jlmDoucheAppRoot .guaranteeBig{max-width:980px;margin:16px auto 0;text-align:center;font-size:30px;line-height:1.45;font-weight:900}\r\n#jlmDoucheAppRoot .price{text-align:center;margin-top:12px}\r\n#jlmDoucheAppRoot .price .big{font-size:52px;font-weight:900}\r\n#jlmDoucheAppRoot .commentWrap{max-width:980px;margin:18px auto 0;text-align:center}\r\n#jlmDoucheAppRoot .commentToggle{appearance:none;border:1px solid rgba(249,115,22,.48);background:linear-gradient(180deg,rgba(249,115,22,.22),rgba(234,88,12,.16)),rgba(255,255,255,.06);color:#fff;border-radius:999px;padding:11px 18px;font-size:14px;font-weight:700;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease;box-shadow:0 10px 30px rgba(0,0,0,.16),inset 0 1px 0 rgba(255,255,255,.08)}\r\n#jlmDoucheAppRoot .commentToggle:hover{transform:translateY(-2px);border-color:rgba(249,115,22,.72)}\r\n#jlmDoucheAppRoot .commentToggleIcon{margin-right:8px;opacity:.95}\r\n#jlmDoucheAppRoot .commentModalOverlay{position:fixed;inset:0;background:rgba(2,8,18,.64);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;padding:22px;z-index:1000000}\r\n#jlmDoucheAppRoot .commentModalOverlay.show{display:flex}\r\n#jlmDoucheAppRoot .commentModal{position:relative;width:min(760px,100%);max-height:min(84vh,820px);overflow:auto;border-radius:28px;border:1px solid rgba(255,255,255,.14);background:radial-gradient(900px 320px at 0% 0%,rgba(249,115,22,.16),transparent 55%),radial-gradient(700px 280px at 100% 0%,rgba(59,130,246,.10),transparent 58%),linear-gradient(180deg,rgba(11,18,32,.96),rgba(8,16,29,.98));box-shadow:0 30px 80px rgba(0,0,0,.46)}\r\n#jlmDoucheAppRoot .commentModalHead{position:relative;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:18px 20px 16px;border-bottom:1px solid rgba(255,255,255,.10)}\r\n#jlmDoucheAppRoot .commentModalEyebrow{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:rgba(255,255,255,.62);margin-bottom:6px}\r\n#jlmDoucheAppRoot .commentModalTitle{font-size:28px;font-weight:900;line-height:1.1}\r\n#jlmDoucheAppRoot .commentModalX{appearance:none;border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.06);color:#fff;width:44px;height:44px;border-radius:999px;font-size:26px;line-height:1;cursor:pointer;flex:0 0 auto}\r\n#jlmDoucheAppRoot .commentModalBody{position:relative;padding:24px 22px 12px;color:#fff;text-align:center;font-weight:700;line-height:1.9;font-size:18px}\r\n#jlmDoucheAppRoot .commentModalActions{padding:0 22px 22px;display:flex;justify-content:center}\r\n#jlmDoucheAppRoot .nav{display:flex;gap:12px;justify-content:center;align-items:center;flex-wrap:wrap;margin-top:18px}\r\n#jlmDoucheAppRoot .btn{appearance:none;border:1px solid rgba(255,255,255,.16);background:rgba(255,255,255,.06);color:#fff;border-radius:999px;padding:12px 18px;font-size:14px;font-weight:700;cursor:pointer;min-width:150px;text-decoration:none}\r\n#jlmDoucheAppRoot .btn.pri{background:linear-gradient(180deg,var(--orange),var(--orange2));border-color:rgba(249,115,22,.65)}\r\n#jlmDoucheAppRoot .btn.reset{margin-right:26px;background:rgba(255,255,255,.04)}\r\n#jlmDoucheAppRoot .optionList{max-width:760px;margin:18px auto 0;display:grid;gap:12px}\r\n#jlmDoucheAppRoot .toggleRow{display:flex;align-items:center;gap:12px;padding:16px 18px;border-radius:18px;border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.05);cursor:pointer}\r\n#jlmDoucheAppRoot .toggleRow input{width:22px;height:22px}\r\n#jlmDoucheAppRoot .toggleRow span{font-size:16px;font-weight:700}\r\n#jlmDoucheAppRoot .bigCheckWrap{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;max-width:760px;margin:18px auto 0}\r\n#jlmDoucheAppRoot .bigCheck{appearance:none;border:2px solid rgba(255,255,255,.18);background:rgba(255,255,255,.05);color:#fff;border-radius:22px;min-height:84px;font-size:24px;font-weight:900;cursor:pointer}\r\n#jlmDoucheAppRoot .bigCheck.sel{border-color:rgba(249,115,22,.95);background:linear-gradient(180deg,rgba(249,115,22,.20),rgba(234,88,12,.12));box-shadow:0 0 0 2px rgba(249,115,22,.16) inset}\r\n#jlmDoucheAppRoot .boOverlay{position:fixed;inset:0;background:rgba(0,0,0,.62);display:none;z-index:999999}\r\n#jlmDoucheAppRoot .boOverlay.show{display:block}\r\n#jlmDoucheAppRoot .bo{position:absolute;inset:5%;background:#0B1220;border:1px solid rgba(255,255,255,.14);border-radius:22px;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 24px 60px rgba(0,0,0,.35)}\r\n#jlmDoucheAppRoot .boHead{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 14px;border-bottom:1px solid rgba(255,255,255,.10);background:rgba(255,255,255,.04)}\r\n#jlmDoucheAppRoot .boHeadRight{display:flex;align-items:center;gap:14px}\r\n#jlmDoucheAppRoot .boBody{overflow:auto;padding:14px}\r\n#jlmDoucheAppRoot .fs{border:1px solid rgba(255,255,255,.14);border-radius:18px;padding:12px;margin-bottom:12px;background:rgba(255,255,255,.03)}\r\n#jlmDoucheAppRoot .fs legend{padding:0 8px;color:rgba(255,255,255,.86);font-size:13px;font-weight:700}\r\n#jlmDoucheAppRoot .lbl{display:block;font-size:12px;color:rgba(255,255,255,.78);margin-bottom:6px;text-align:left}\r\n#jlmDoucheAppRoot .inp,#jlmDoucheAppRoot .ta,#jlmDoucheAppRoot .num{width:100%;border-radius:12px;border:1px solid rgba(255,255,255,.16);background:rgba(255,255,255,.06);color:#fff;padding:10px;outline:none;cursor:text;pointer-events:auto!important;-webkit-user-select:text!important;user-select:text!important}\r\n#jlmDoucheAppRoot .ta{min-height:82px;resize:vertical}\r\n#jlmDoucheAppRoot .boActions{display:flex;align-items:center;gap:10px;justify-content:flex-end;flex-wrap:wrap;padding:12px 14px;border-top:1px solid rgba(255,255,255,.10);background:rgba(255,255,255,.03)}\r\n#jlmDoucheAppRoot .row2{display:grid;grid-template-columns:1fr 1fr;gap:10px}\r\n#jlmDoucheAppRoot .hr{height:1px;background:rgba(255,255,255,.10);margin:10px 0}\r\n#jlmDoucheAppRoot .unitInputWrap{display:flex;align-items:center;gap:10px}\r\n#jlmDoucheAppRoot .unitInputWrap .num{flex:1;text-align:center;font-size:22px}\r\n#jlmDoucheAppRoot .unitFix{flex:0 0 auto;min-width:68px;padding:12px 14px;border-radius:12px;border:1px solid rgba(255,255,255,.16);background:rgba(255,255,255,.06);color:#fff;font-size:20px;font-weight:900;text-align:center}\r\n#jlmDoucheAppRoot .unitInputWrapLarge{gap:14px}\r\n#jlmDoucheAppRoot .unitInputWrapLarge .num{min-height:76px}\r\n#jlmDoucheAppRoot .unitFixLarge{min-width:94px;min-height:76px;display:flex;align-items:center;justify-content:center;font-size:28px;border-radius:18px;border:2px solid rgba(249,115,22,.5);background:rgba(255,255,255,.08)}\r\n#jlmDoucheAppRoot .bigInput{font-size:32px;font-weight:900;text-align:center;padding:18px;border-radius:18px;border:2px solid rgba(249,115,22,.5);background:rgba(255,255,255,.08)}\r\n#jlmDoucheAppRoot .choiceBigInfo{max-width:900px;margin:22px auto 0;text-align:center;font-size:28px;line-height:1.35;font-weight:900;color:#fff}\r\n#jlmDoucheAppRoot .smallSinglePhotoWrap{display:flex;justify-content:center;margin:18px auto 0}\r\n#jlmDoucheAppRoot .smallSinglePhotoCard{width:min(340px,100%)}\r\n#jlmDoucheAppRoot .smallPhotoGrid2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;max-width:760px;margin:18px auto 0}\r\n#jlmDoucheAppRoot .smallPhotoCell{display:flex}\r\n#jlmDoucheAppRoot .smallPhotoCell .fixedCard{width:100%}\r\n#jlmDoucheAppRoot .finalPriceText{max-width:900px;margin:18px auto 0;text-align:center;color:rgba(255,255,255,.96)}\r\n#jlmDoucheAppRoot .finalPriceText p{margin:0 0 14px;font-size:24px;line-height:1.55;font-weight:800}\r\n#jlmDoucheAppRoot .wcGrid3{grid-template-columns:repeat(3,minmax(0,1fr))}\r\n#jlmDoucheAppRoot .wcNonWrap{display:flex;justify-content:center;margin:22px auto 0}\r\n#jlmDoucheAppRoot .wcNonBtn{appearance:none;min-width:260px;min-height:88px;padding:18px 26px;border-radius:22px;border:2px solid rgba(255,255,255,.22);background:rgba(255,255,255,.06);color:#fff;font-size:30px;font-weight:900;cursor:pointer}\r\n#jlmDoucheAppRoot .wcNonBtn.sel{border-color:rgba(249,115,22,.95);background:linear-gradient(180deg,rgba(249,115,22,.20),rgba(234,88,12,.12));box-shadow:0 0 0 2px rgba(249,115,22,.16) inset}\r\n#jlmDoucheAppRoot .aidesOnlyText{max-width:980px;margin:18px auto 0;text-align:center;color:rgba(255,255,255,.98);font-size:24px;line-height:1.7;font-weight:800}\r\n#jlmDoucheAppRoot .modeleGrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-top:18px}\r\n#jlmDoucheAppRoot .sizeGrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px;max-width:900px;margin:20px auto 0}\r\n#jlmDoucheAppRoot .sizeBox{border-radius:22px;border:1px solid rgba(255,255,255,.12);background:linear-gradient(180deg,rgba(255,255,255,.06),rgba(255,255,255,.035));padding:18px}\r\n#jlmDoucheAppRoot .sizeLbl{text-align:center;font-size:18px;margin-bottom:12px;color:#fff;font-weight:800}\r\n#jlmDoucheAppRoot .priceBreakdown{text-align:left;max-width:820px}\r\n#jlmDoucheAppRoot .priceLine{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:14px 0;border-bottom:1px solid rgba(255,255,255,.10);font-size:20px}\r\n#jlmDoucheAppRoot .priceLine:last-child{border-bottom:0}\r\n#jlmDoucheAppRoot .bacSchemaWrap{max-width:980px;margin:26px auto 0;padding:18px;border-radius:22px;border:1px solid rgba(255,255,255,.12);background:linear-gradient(180deg,rgba(255,255,255,.06),rgba(255,255,255,.035))}\r\n#jlmDoucheAppRoot .bacSchemaTitle{text-align:center;font-size:20px;font-weight:900;margin-bottom:18px}\r\n#jlmDoucheAppRoot .bacSchemaStage{display:flex;justify-content:center;align-items:center;min-height:380px}\r\n#jlmDoucheAppRoot .bacSchemaBox{width:100%;display:flex;justify-content:center;align-items:center}\r\n#jlmDoucheAppRoot .bacSchemaRect{position:relative;border:4px solid rgba(249,115,22,.9);border-radius:18px;background:linear-gradient(180deg,rgba(255,255,255,.14),rgba(255,255,255,.06)),rgba(255,255,255,.06);box-shadow:0 18px 40px rgba(0,0,0,.22),inset 0 0 0 1px rgba(255,255,255,.08)}\r\n#jlmDoucheAppRoot .bacSchemaRect:before{content:\"\";position:absolute;inset:10px;border-radius:12px;border:1px dashed rgba(255,255,255,.22)}\r\n#jlmDoucheAppRoot .bacSchemaLabel{position:absolute;font-weight:900;color:#fff;background:rgba(5,12,25,.9);border:1px solid rgba(255,255,255,.14);border-radius:999px;padding:8px 12px;font-size:14px;white-space:nowrap}\r\n#jlmDoucheAppRoot .bacSchemaLabelTop{top:-18px;left:50%;transform:translateX(-50%)}\r\n#jlmDoucheAppRoot .bacSchemaLabelSide{top:50%;right:-18px;transform:translate(100%,-50%)}\r\n#jlmDoucheAppRoot .propositionPhotoWrap{max-width:900px;margin:22px auto 0}\r\n#jlmDoucheAppRoot .propositionPhotoCard{border-radius:22px;border:1px solid rgba(255,255,255,.12);background:linear-gradient(180deg,rgba(255,255,255,.06),rgba(255,255,255,.035));overflow:hidden;box-shadow:0 10px 24px rgba(0,0,0,.14)}\r\n#jlmDoucheAppRoot .propositionPhotoCardFull{border-radius:22px;border:2px solid rgba(249,115,22,.4);overflow:hidden;box-shadow:0 20px 50px rgba(0,0,0,.28),0 0 0 1px rgba(249,115,22,.1) inset;margin:0 auto;max-width:100%}\r\n#jlmDoucheAppRoot .propositionPhotoCardFull img{width:100%;display:block;object-fit:cover;border-radius:20px}\r\n#jlmDoucheAppRoot .boPreviewWrap{margin-top:10px}\r\n#jlmDoucheAppRoot .boPreview{width:160px;height:100px;object-fit:contain;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);border-radius:12px;display:block}\r\n#jlmDoucheAppRoot .boPreviewEmpty{display:flex;align-items:center;justify-content:center;color:rgba(255,255,255,.55);font-size:12px}\r\n@media (max-width:700px){#jlmDoucheAppRoot .row2,#jlmDoucheAppRoot .sizeGrid{grid-template-columns:1fr}}\r\n@media (max-width:560px){\r\n  #jlmDoucheAppRoot .grid,#jlmDoucheAppRoot .avantApresGrid,#jlmDoucheAppRoot .avantApresGrid6,#jlmDoucheAppRoot .meublesGrid,#jlmDoucheAppRoot .bigCheckWrap,#jlmDoucheAppRoot .modeleGrid{grid-template-columns:1fr}\r\n  #jlmDoucheAppRoot .logo{width:108px;height:108px}\r\n  #jlmDoucheAppRoot .alertBand{font-size:16px}\r\n  #jlmDoucheAppRoot .guaranteeBig{font-size:22px}\r\n  #jlmDoucheAppRoot .commentModalTitle{font-size:23px}\r\n  #jlmDoucheAppRoot .commentModalBody{font-size:16px;line-height:1.8}\r\n  #jlmDoucheAppRoot .choiceBigInfo{font-size:22px}\r\n  #jlmDoucheAppRoot .smallPhotoGrid2{grid-template-columns:1fr}\r\n  #jlmDoucheAppRoot .finalPriceText p{font-size:20px}\r\n  #jlmDoucheAppRoot .bigInput{font-size:26px;padding:16px}\r\n  #jlmDoucheAppRoot .unitFixLarge{font-size:22px;min-width:78px;min-height:68px}\r\n  #jlmDoucheAppRoot .wcGrid3{grid-template-columns:1fr}\r\n  #jlmDoucheAppRoot .wcNonBtn{width:100%;min-width:0;font-size:24px;min-height:76px}\r\n  #jlmDoucheAppRoot .aidesOnlyText{font-size:22px}\r\n  #jlmDoucheAppRoot .txtLarge{font-size:18px}\r\n  #jlmDoucheAppRoot .h1Large{font-size:36px}\r\n  #jlmDoucheAppRoot .priceLine{font-size:17px;align-items:flex-start;flex-direction:column}\r\n  #jlmDoucheAppRoot .bacSchemaStage{min-height:280px}\r\n  #jlmDoucheAppRoot .bacSchemaLabel{font-size:12px;padding:6px 10px}\r\n  #jlmDoucheAppRoot .boHeadRight{flex-direction:column;align-items:flex-end;gap:6px}\r\n}\r\n`;\r\n\r\n  root.appendChild(styleNode);\r\n  app = document.createElement(\"div\");\r\n  app.className = \"app\";\r\n  root.appendChild(app);\r\n\r\n  function hotkey(e) {\r\n    var isA = (e.code===\"KeyA\")||(String(e.key||\"\").toLowerCase()===\"a\");\r\n    if (e.ctrlKey && e.altKey && isA) {\r\n      e.preventDefault(); e.stopPropagation();\r\n      if (!adminUnlocked) {\r\n        var code = window.prompt(\"Code d'acc\u00e8s Back Office :\"); if (code===null) return;\r\n        if (String(code||\"\").trim()!==ADMIN_CODE){ alert(\"Code incorrect.\"); return; }\r\n        adminUnlocked=true; render();\r\n        var bo=document.getElementById(\"boOverlay\");\r\n        if (bo) bo.classList.add(\"show\");\r\n        return;\r\n      }\r\n      var bo2=document.getElementById(\"boOverlay\");\r\n      if (bo2) bo2.classList.toggle(\"show\");\r\n    }\r\n    if (e.key===\"Escape\") {\r\n      var bo3=document.getElementById(\"boOverlay\");\r\n      if (bo3&&bo3.classList.contains(\"show\")){ bo3.classList.remove(\"show\"); e.preventDefault(); return; }\r\n      var cm=document.getElementById(\"commentModalOverlay\");\r\n      if (cm&&cm.classList.contains(\"show\")){ closeCommentModal(); e.preventDefault(); }\r\n    }\r\n  }\r\n  window.addEventListener(\"keydown\", hotkey, true);\r\n  document.addEventListener(\"keydown\", hotkey, true);\r\n\r\n  wpLoadConfig().then(function() { render(); });\r\n\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2445","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Devis estimatif salle de bain - Bien vieillir chez soi<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/labienveillance.fr\/?page_id=2445\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Devis estimatif salle de bain - Bien vieillir chez soi\" \/>\n<meta property=\"og:url\" content=\"https:\/\/labienveillance.fr\/?page_id=2445\" \/>\n<meta property=\"og:site_name\" content=\"Bien vieillir chez soi\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-06T13:11:58+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"20 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/labienveillance.fr\/?page_id=2445\",\"url\":\"https:\/\/labienveillance.fr\/?page_id=2445\",\"name\":\"Devis estimatif salle de bain - Bien vieillir chez soi\",\"isPartOf\":{\"@id\":\"https:\/\/labienveillance.fr\/#website\"},\"datePublished\":\"2026-05-06T11:33:26+00:00\",\"dateModified\":\"2026-05-06T13:11:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/labienveillance.fr\/?page_id=2445#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/labienveillance.fr\/?page_id=2445\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/labienveillance.fr\/?page_id=2445#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/labienveillance.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Devis estimatif salle de bain\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/labienveillance.fr\/#website\",\"url\":\"https:\/\/labienveillance.fr\/\",\"name\":\"Bien vieillir chez soi\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/labienveillance.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/labienveillance.fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/labienveillance.fr\/#organization\",\"name\":\"Bien vieillir chez soi\",\"url\":\"https:\/\/labienveillance.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/labienveillance.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/labienveillance.fr\/wp-content\/uploads\/2025\/09\/LogoMakr-0C1PJU-1.png\",\"contentUrl\":\"https:\/\/labienveillance.fr\/wp-content\/uploads\/2025\/09\/LogoMakr-0C1PJU-1.png\",\"width\":199,\"height\":110,\"caption\":\"Bien vieillir chez soi\"},\"image\":{\"@id\":\"https:\/\/labienveillance.fr\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Devis estimatif salle de bain - Bien vieillir chez soi","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/labienveillance.fr\/?page_id=2445","og_locale":"fr_FR","og_type":"article","og_title":"Devis estimatif salle de bain - Bien vieillir chez soi","og_url":"https:\/\/labienveillance.fr\/?page_id=2445","og_site_name":"Bien vieillir chez soi","article_modified_time":"2026-05-06T13:11:58+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"20 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/labienveillance.fr\/?page_id=2445","url":"https:\/\/labienveillance.fr\/?page_id=2445","name":"Devis estimatif salle de bain - Bien vieillir chez soi","isPartOf":{"@id":"https:\/\/labienveillance.fr\/#website"},"datePublished":"2026-05-06T11:33:26+00:00","dateModified":"2026-05-06T13:11:58+00:00","breadcrumb":{"@id":"https:\/\/labienveillance.fr\/?page_id=2445#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/labienveillance.fr\/?page_id=2445"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/labienveillance.fr\/?page_id=2445#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/labienveillance.fr\/"},{"@type":"ListItem","position":2,"name":"Devis estimatif salle de bain"}]},{"@type":"WebSite","@id":"https:\/\/labienveillance.fr\/#website","url":"https:\/\/labienveillance.fr\/","name":"Bien vieillir chez soi","description":"","publisher":{"@id":"https:\/\/labienveillance.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/labienveillance.fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/labienveillance.fr\/#organization","name":"Bien vieillir chez soi","url":"https:\/\/labienveillance.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/labienveillance.fr\/#\/schema\/logo\/image\/","url":"https:\/\/labienveillance.fr\/wp-content\/uploads\/2025\/09\/LogoMakr-0C1PJU-1.png","contentUrl":"https:\/\/labienveillance.fr\/wp-content\/uploads\/2025\/09\/LogoMakr-0C1PJU-1.png","width":199,"height":110,"caption":"Bien vieillir chez soi"},"image":{"@id":"https:\/\/labienveillance.fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/labienveillance.fr\/index.php?rest_route=\/wp\/v2\/pages\/2445","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/labienveillance.fr\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/labienveillance.fr\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/labienveillance.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/labienveillance.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2445"}],"version-history":[{"count":9,"href":"https:\/\/labienveillance.fr\/index.php?rest_route=\/wp\/v2\/pages\/2445\/revisions"}],"predecessor-version":[{"id":2459,"href":"https:\/\/labienveillance.fr\/index.php?rest_route=\/wp\/v2\/pages\/2445\/revisions\/2459"}],"wp:attachment":[{"href":"https:\/\/labienveillance.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}