{"id":2087,"date":"2026-07-31T12:40:52","date_gmt":"2026-07-31T12:40:52","guid":{"rendered":"https:\/\/kiavikprint.com\/?page_id=2087"},"modified":"2026-07-31T13:03:39","modified_gmt":"2026-07-31T13:03:39","slug":"configuration-kiavik-print","status":"publish","type":"page","link":"https:\/\/kiavikprint.com\/en\/configuration-kiavik-print\/","title":{"rendered":"Configuration Kiavik Print"},"content":{"rendered":"\n[et_pb_section fb_built=\u00a0\u00bb1&Prime; theme_builder_area=\u00a0\u00bbpost_content\u00a0\u00bb _builder_version=\u00a0\u00bb4.27.7&Prime; _module_preset=\u00a0\u00bbdefault\u00a0\u00bb background_color=\u00a0\u00bb#000000&Prime; hover_enabled=\u00a0\u00bb0&Prime; sticky_enabled=\u00a0\u00bb0&Prime;][et_pb_row _builder_version=\u00a0\u00bb4.27.7&Prime; _module_preset=\u00a0\u00bbdefault\u00a0\u00bb theme_builder_area=\u00a0\u00bbpost_content\u00a0\u00bb][et_pb_column _builder_version=\u00a0\u00bb4.27.7&Prime; _module_preset=\u00a0\u00bbdefault\u00a0\u00bb type=\u00a0\u00bb4_4&Prime; theme_builder_area=\u00a0\u00bbpost_content\u00a0\u00bb][et_pb_text _builder_version=\u00a0\u00bb4.27.7&Prime; _module_preset=\u00a0\u00bbdefault\u00a0\u00bb theme_builder_area=\u00a0\u00bbpost_content\u00a0\u00bb hover_enabled=\u00a0\u00bb0&Prime; sticky_enabled=\u00a0\u00bb0&Prime; header_font=\u00a0\u00bbExo 2|||on|||||\u00a0\u00bb header_text_color=\u00a0\u00bb#FFFFFF\u00a0\u00bb header_font_size=\u00a0\u00bb60px\u00a0\u00bb header_text_align=\u00a0\u00bbcenter\u00a0\u00bb]<h1>Configurateur Kiavik Print<\/h1>[\/et_pb_text][et_pb_code _builder_version=\u00a0\u00bb4.27.7&Prime; _module_preset=\u00a0\u00bbdefault\u00a0\u00bb theme_builder_area=\u00a0\u00bbpost_content\u00a0\u00bb hover_enabled=\u00a0\u00bb0&Prime; sticky_enabled=\u00a0\u00bb0&Prime;]<!-- ===================== BLOC CONFIGURATEUR KIAVIK - HAUTEUR DE PLAFOND ===================== -->\r\n<div id=\"kiavik-config-wrap\" style=\"max-width:1000px;margin:40px auto;padding:30px 20px;font-family:Arial,Helvetica,sans-serif;background:#0a0a0a;border-radius:14px;\">\r\n\r\n  <div style=\"text-align:right;margin-bottom:10px;\">\r\n    <span id=\"kiavik-lang-fr\" style=\"cursor:pointer;font-size:12px;font-weight:700;color:#3ddc6f;padding:4px 8px;border-radius:4px;background:#1a2e22;\">FR<\/span>\r\n    <span id=\"kiavik-lang-en\" style=\"cursor:pointer;font-size:12px;font-weight:700;color:#888;padding:4px 8px;border-radius:4px;\">EN<\/span>\r\n  <\/div>\r\n\r\n  <p style=\"text-align:center;font-size:13px;font-weight:700;color:#3ddc6f;letter-spacing:2px;text-transform:uppercase;margin-bottom:8px;\">Kiavik Vertical Print<\/p>\r\n  <h3 id=\"kiavik-t-titre\" style=\"text-align:center;font-size:24px;font-weight:700;color:#fff;margin-bottom:6px;\">\r\n    Configurez votre Kiavik selon la hauteur de votre plafond\r\n  <\/h3>\r\n  <p id=\"kiavik-t-soustitre\" style=\"text-align:center;color:#999;font-size:15px;margin-bottom:20px;\">\r\n    De 0 \u00e0 4 m, par paliers de 10 cm, en combinant les rallonges modulaires.\r\n  <\/p>\r\n\r\n  <!-- INPUT -->\r\n  <div style=\"display:flex;flex-direction:column;align-items:center;gap:14px;margin-bottom:14px;\">\r\n    <label id=\"kiavik-t-label-plafond\" for=\"kiavik-hauteur-input\" style=\"font-weight:600;color:#ddd;font-size:15px;\">\r\n      Entrez la hauteur exacte de votre plafond (cm)\r\n    <\/label>\r\n    <div style=\"display:flex;gap:10px;align-items:center;\">\r\n      <input type=\"number\" id=\"kiavik-hauteur-input\" min=\"124\" max=\"400\" step=\"1\" value=\"245\"\r\n        style=\"width:110px;font-size:22px;font-weight:700;text-align:center;padding:8px 6px;border:2px solid #c8a96a;border-radius:8px;color:#fff;background:#1a1a1a;\">\r\n      <span style=\"font-size:16px;color:#999;\">cm<\/span>\r\n      <div id=\"kiavik-calc-btn\" style=\"cursor:pointer;background:#c8a96a;color:#1a1a1a;padding:10px 18px;border-radius:8px;font-size:14px;font-weight:600;user-select:none;\">Calculer<\/div>\r\n    <\/div>\r\n    <input type=\"range\" id=\"kiavik-hauteur\" min=\"124\" max=\"400\" step=\"1\" value=\"245\"\r\n      style=\"width:90%;max-width:500px;accent-color:#c8a96a;margin-top:4px;\">\r\n    <div id=\"kiavik-diff-sous-curseur\" style=\"display:none;font-size:22px;font-weight:900;color:#3ddc6f;text-align:center;margin-top:6px;letter-spacing:.3px;\"><\/div>\r\n  <\/div>\r\n\r\n  <!-- VISUEL -->\r\n  <div style=\"display:flex;gap:30px;align-items:flex-end;justify-content:center;flex-wrap:wrap;margin-bottom:30px;\">\r\n\r\n    <!-- rectangle mur (hauteur = plafond) -->\r\n    <div style=\"display:flex;flex-direction:column;align-items:center;flex-shrink:0;\">\r\n      <div id=\"kiavik-t-plafond-label\" style=\"font-size:10px;font-weight:700;letter-spacing:1px;color:#999;margin-bottom:4px;\">PLAFOND<\/div>\r\n      <div id=\"kiavik-mur\" style=\"position:relative;width:180px;background:linear-gradient(135deg,#1c1c1c 0 10px,#161616 10px 20px);border:2px solid #444;border-radius:2px;transition:height .35s ease, width .35s ease;box-sizing:border-box;\">\r\n\r\n      <!-- rectangle zone imprimable Kiavik, \u00e0 l'int\u00e9rieur du mur (moiti\u00e9 gauche) -->\r\n      <div id=\"kiavik-zone-impr\" style=\"position:absolute;left:20px;width:90px;background:rgba(61,220,111,.10);border:2px solid #3ddc6f;border-radius:2px;transition:bottom .35s ease, height .35s ease;display:flex;align-items:center;justify-content:center;;box-sizing:border-box\">\r\n        <span id=\"kiavik-zone-impr-label\" style=\"font-size:11px;font-weight:800;color:#3ddc6f;text-align:center;line-height:1.3;white-space:pre-line;\"><\/span>\r\n      <\/div>\r\n\r\n      <!-- bande s\u00e9chage Kiavik (23cm), en haut de la zone imprimable -->\r\n      <div id=\"kiavik-bande-sechage\" style=\"position:absolute;left:20px;width:90px;background:repeating-linear-gradient(45deg,rgba(230,150,80,.30) 0 4px,rgba(230,150,80,.10) 4px 8px);border:1px dashed #e09650;border-radius:2px;transition:bottom .35s ease, height .35s ease;display:flex;align-items:center;justify-content:center;;box-sizing:border-box\">\r\n        <span id=\"kiavik-t-sechage-visuel\" style=\"font-size:9px;font-weight:700;color:#e09650;\">S\u00c9CHAGE 23cm<\/span>\r\n      <\/div>\r\n\r\n      <!-- bande marge basse Kiavik (35cm fixe) -->\r\n      <div id=\"kiavik-bande-marge\" style=\"position:absolute;left:20px;width:90px;bottom:0;background:repeating-linear-gradient(45deg,rgba(150,150,150,.18) 0 4px,rgba(150,150,150,.06) 4px 8px);border:1px dashed #777;border-radius:2px;display:flex;align-items:center;justify-content:center;;box-sizing:border-box\">\r\n        <span id=\"kiavik-t-marge-visuel\" style=\"font-size:9px;font-weight:700;color:#aaa;\">MARGE 35cm<\/span>\r\n      <\/div>\r\n\r\n      <!-- ===== Concurrent (masqu\u00e9 par d\u00e9faut) ===== -->\r\n      <div id=\"kiavik-zone-impr-conc\" style=\"display:none;position:absolute;right:20px;width:90px;background:rgba(230,70,70,.10);border:2px solid #e64646;border-radius:2px;transition:bottom .35s ease, height .35s ease;align-items:center;justify-content:center;;box-sizing:border-box\">\r\n        <span id=\"kiavik-zone-impr-conc-label\" style=\"font-size:11px;font-weight:800;color:#e64646;text-align:center;line-height:1.3;white-space:pre-line;\"><\/span>\r\n      <\/div>\r\n      <div id=\"kiavik-bande-sechage-conc\" style=\"display:none;position:absolute;right:20px;width:90px;background:repeating-linear-gradient(45deg,rgba(230,150,80,.30) 0 4px,rgba(230,150,80,.10) 4px 8px);border:1px dashed #e09650;border-radius:2px;transition:bottom .35s ease, height .35s ease;align-items:center;justify-content:center;;box-sizing:border-box\"><\/div>\r\n      <div id=\"kiavik-bande-marge-conc\" style=\"display:none;position:absolute;right:20px;width:90px;bottom:0;background:repeating-linear-gradient(45deg,rgba(150,150,150,.18) 0 4px,rgba(150,150,150,.06) 4px 8px);border:1px dashed #777;border-radius:2px;align-items:center;justify-content:center;;box-sizing:border-box\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- r\u00e9sultats -->\r\n    <div style=\"min-width:260px;max-width:340px;background:#161616;border:1px solid #2a2a2a;border-radius:10px;padding:20px;\">\r\n      <div id=\"kiavik-t-config-recommandee\" style=\"font-size:13px;color:#999;text-transform:uppercase;letter-spacing:.5px;margin-bottom:10px;\">Configuration recommand\u00e9e<\/div>\r\n      <div id=\"kiavik-combo\" style=\"font-size:16px;font-weight:700;color:#fff;margin-bottom:14px;line-height:1.5;\"><\/div>\r\n\r\n      <div style=\"display:flex;justify-content:space-between;padding:6px 0;border-top:1px solid #2a2a2a;\">\r\n        <span id=\"kiavik-t-hauteur-mat\" style=\"color:#999;font-size:14px;\">Hauteur du m\u00e2t<\/span>\r\n        <span id=\"kiavik-mat-h\" style=\"font-weight:700;font-size:14px;color:#fff;\">\u2014<\/span>\r\n      <\/div>\r\n      <div style=\"display:flex;justify-content:space-between;padding:6px 0;border-top:1px solid #2a2a2a;\">\r\n        <span id=\"kiavik-t-marge-basse\" style=\"color:#aaa;font-size:14px;\">Marge basse fixe<\/span>\r\n        <span style=\"font-weight:700;font-size:14px;color:#ccc;\">35 cm<\/span>\r\n      <\/div>\r\n      <div style=\"display:flex;justify-content:space-between;padding:6px 0;border-top:1px solid #2a2a2a;\">\r\n        <span id=\"kiavik-t-zone-sechage\" style=\"color:#999;font-size:14px;\">Zone s\u00e9chage lampe<\/span>\r\n        <span style=\"font-weight:700;font-size:14px;color:#e09650;\">23 cm<\/span>\r\n      <\/div>\r\n      <div style=\"display:flex;justify-content:space-between;padding:8px 0 0 0;border-top:2px solid #444;margin-top:4px;\">\r\n        <span id=\"kiavik-t-kiavik-impr\" style=\"color:#fff;font-size:14.5px;font-weight:700;\">Kiavik \u2014 Hauteur imprimable<\/span>\r\n        <span id=\"kiavik-impr-h\" style=\"font-weight:800;font-size:16px;color:#3ddc6f;\">\u2014<\/span>\r\n      <\/div>\r\n\r\n      <div id=\"kiavik-ligne-concurrent\" style=\"display:none;justify-content:space-between;padding:8px 0 0 0;border-top:1px dashed #444;margin-top:8px;\">\r\n        <span id=\"kiavik-nom-concurrent\" style=\"color:#e64646;font-size:14.5px;font-weight:700;\">Concurrent \u2014 Hauteur imprimable<\/span>\r\n        <span id=\"kiavik-impr-conc-h\" style=\"font-weight:800;font-size:16px;color:#e64646;\">\u2014<\/span>\r\n      <\/div>\r\n\r\n      <div id=\"kiavik-jump-transparence\" style=\"display:none;cursor:pointer;text-align:center;margin-top:10px;font-size:12px;color:#6fa8e0;font-weight:600;text-decoration:underline;\">\u2193 Voir le d\u00e9tail du calcul<\/div>\r\n\r\n      <div id=\"kiavik-t-toujours-23\" style=\"margin-top:16px;padding-top:14px;border-top:1px dashed #2a2a2a;font-size:12.5px;color:#6fa8e0;font-weight:600;text-align:center;line-height:1.5;\">\r\n        \u2713 Toujours \u2264 23 cm du plafond, quelle que soit sa hauteur\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- encart mise en avant : rallonges de s\u00e9rie Kiavik -->\r\n  <div style=\"max-width:700px;margin:0 auto 24px;background:linear-gradient(135deg,#1a1f17,#161c14);border:1px solid #3ddc6f;border-radius:10px;padding:18px 22px;\">\r\n    <div style=\"display:flex;align-items:center;gap:14px;\">\r\n      <div style=\"font-size:28px;line-height:1;flex-shrink:0;\">\ud83c\udfc6<\/div>\r\n      <div id=\"kiavik-t-encart1\" style=\"font-size:14px;color:#dde;line-height:1.5;\">\r\n        <strong style=\"color:#3ddc6f;\">Ch\u00e2ssis renforc\u00e9 et 6 rallonges de s\u00e9rie<\/strong> (100, 110, 50, 40, 30, 20 cm) : Kiavik est livr\u00e9 d'office avec tout ce qu'il faut pour s'adapter \u00e0 n'importe quelle hauteur de plafond \u2014 la machine la plus polyvalente du march\u00e9.\r\n      <\/div>\r\n    <\/div>\r\n    <div style=\"display:flex;align-items:center;gap:14px;margin-top:12px;padding-top:12px;border-top:1px dashed rgba(61,220,111,.25);\">\r\n      <div style=\"font-size:22px;line-height:1;flex-shrink:0;\">\u2b50<\/div>\r\n      <div id=\"kiavik-t-encart2\" style=\"font-size:14px;color:#dde;line-height:1.5;\">\r\n        <strong style=\"color:#3ddc6f;\">Son secret :<\/strong> la t\u00eate d'impression peut d\u00e9passer le m\u00e2t principal de 10&nbsp;cm pour toujours venir se coller au plafond, quelle que soit sa hauteur exacte.\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- formulaire concurrent (visible directement) -->\r\n  <div id=\"kiavik-form-comparatif\" style=\"display:block;max-width:680px;margin:0 auto 30px;background:#1a1212;border:1px solid #3a2222;border-radius:10px;padding:20px;\">\r\n    <div id=\"kiavik-t-specs-titre\" style=\"font-size:13px;color:#e64646;font-weight:700;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px;text-align:center;\">Specs de la machine concurrente<\/div>\r\n    <div id=\"kiavik-t-specs-sous\" style=\"font-size:11.5px;color:#888;text-align:center;margin-bottom:16px;\">\r\n      Donn\u00e9es issues des documentations commerciales des fabricants \u2014 modifiables si besoin.\r\n    <\/div>\r\n\r\n    <div style=\"margin-bottom:16px;\">\r\n      <label id=\"kiavik-t-selectionnez\" style=\"font-size:12.5px;color:#bbb;display:block;margin-bottom:8px;text-align:center;\">S\u00e9lectionnez votre machine actuelle (fabricant d'origine)<\/label>\r\n      <div id=\"kiavik-marque-grid\" style=\"display:flex;gap:10px;justify-content:center;flex-wrap:wrap;\">\r\n        <div id=\"kiavik-t-chargement\" style=\"font-size:12px;color:#666;padding:20px;\">Chargement des machines\u2026<\/div>\r\n      <\/div>\r\n      <div id=\"kiavik-autres-modeles-wrap\" style=\"display:none;margin-top:12px;justify-content:center;align-items:center;gap:10px;flex-wrap:wrap;\">\r\n        <label id=\"kiavik-t-ou-choisissez\" for=\"kiavik-autres-modeles\" style=\"font-size:12px;color:#bbb;\">Ou choisissez un autre mod\u00e8le<\/label>\r\n        <select id=\"kiavik-autres-modeles\" style=\"padding:8px 12px;border:1px solid #444;border-radius:6px;font-size:13px;background:#111;color:#fff;max-width:240px;\">\r\n          <option id=\"kiavik-t-autres-modeles-opt\" value=\"\">\u2014 Autres mod\u00e8les \u2014<\/option>\r\n        <\/select>\r\n        <span id=\"kiavik-t-enregistre-par\" style=\"font-size:11px;color:#777;font-style:italic;\">(enregistr\u00e9 par un utilisateur)<\/span>\r\n      <\/div>\r\n    <\/div>\r\n    <input type=\"hidden\" id=\"kiavik-conc-marque\" value=\"\">\r\n\r\n    <div id=\"kiavik-valider-btn\" style=\"cursor:pointer;background:#e64646;color:#fff;padding:10px;border-radius:8px;font-size:14px;font-weight:700;text-align:center;user-select:none;margin-bottom:16px;\">\u2713 Valider ma machine<\/div>\r\n\r\n    <div id=\"kiavik-nom-libre-wrap\" style=\"display:none;align-items:center;gap:10px;margin-bottom:16px;\">\r\n      <label id=\"kiavik-t-nom-modele\" for=\"kiavik-conc-nom-libre\" style=\"font-size:12.5px;color:#bbb;white-space:nowrap;flex-shrink:0;\">Nom \/ mod\u00e8le de votre machine<\/label>\r\n      <input type=\"text\" id=\"kiavik-conc-nom-libre\" placeholder=\"ex: Caldera WallJet 3200, machine sans marque visible, etc.\" style=\"flex:1;padding:8px;border:1px solid #444;border-radius:6px;font-size:14px;box-sizing:border-box;background:#111;color:#fff;min-width:0;\">\r\n    <\/div>\r\n\r\n    <div id=\"kiavik-conc-resultat\" style=\"margin:4px 0 18px;font-size:15px;color:#ccc;text-align:center;line-height:1.7;\"><\/div>\r\n\r\n    <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px;\">\r\n      <div>\r\n        <label id=\"kiavik-t-chassis-base\" style=\"font-size:12.5px;color:#bbb;display:block;margin-bottom:4px;min-height:32px;\">Hauteur ch\u00e2ssis de base (cm)<\/label>\r\n        <input type=\"number\" id=\"kiavik-conc-base\" value=\"120\" style=\"width:100%;padding:7px;border:1px solid #444;border-radius:6px;font-size:14px;box-sizing:border-box;background:#111;color:#fff;\">\r\n      <\/div>\r\n      <div>\r\n        <label id=\"kiavik-t-rallonges-label\" style=\"font-size:12.5px;color:#bbb;display:block;margin-bottom:4px;min-height:32px;\">Rallonges (cm, s\u00e9par\u00e9es par virgule)<\/label>\r\n        <input type=\"text\" id=\"kiavik-conc-rallonges\" value=\"50,30\" style=\"width:100%;padding:7px;border:1px solid #444;border-radius:6px;font-size:14px;box-sizing:border-box;background:#111;color:#fff;\">\r\n      <\/div>\r\n      <div>\r\n        <label id=\"kiavik-t-marge-basse-label\" style=\"font-size:12.5px;color:#bbb;display:block;margin-bottom:4px;min-height:32px;\">Marge basse fixe (cm)<\/label>\r\n        <input type=\"number\" id=\"kiavik-conc-marge\" value=\"35\" style=\"width:100%;padding:7px;border:1px solid #444;border-radius:6px;font-size:14px;box-sizing:border-box;background:#111;color:#fff;\">\r\n      <\/div>\r\n      <div>\r\n        <label id=\"kiavik-t-marge-haute-label\" style=\"font-size:12.5px;color:#bbb;display:block;margin-bottom:4px;min-height:32px;\">Marge haute \/ s\u00e9chage (cm)<\/label>\r\n        <input type=\"number\" id=\"kiavik-conc-sechage\" value=\"23\" style=\"width:100%;padding:7px;border:1px solid #444;border-radius:6px;font-size:14px;box-sizing:border-box;background:#111;color:#fff;\">\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div id=\"kiavik-valider-confirm\" style=\"display:none;margin-top:10px;font-size:12.5px;color:#3ddc6f;text-align:center;\"><\/div>\r\n  <\/div>\r\n\r\n\r\n  <p id=\"kiavik-t-explication\" style=\"text-align:center;color:#888;font-size:12.5px;max-width:620px;margin:0 auto;\">\r\n    La t\u00eate d'impression coulisse jusqu'\u00e0 10&nbsp;cm au-dessus du m\u00e2t pour toujours atteindre le plafond, quelle que soit sa hauteur exacte. Sur cette hauteur totale, une marge fixe de 35&nbsp;cm en bas et 23&nbsp;cm de s\u00e9chage \u00e0 la lampe en haut d\u00e9limitent la zone r\u00e9ellement imprimable.\r\n  <\/p>\r\n\r\n  <!-- ===== STATISTIQUES : graphique 4 courbes, mis \u00e0 jour \u00e0 la validation ===== -->\r\n  <div style=\"margin-top:36px;padding-top:28px;border-top:1px solid #222;\">\r\n    <h4 id=\"kiavik-t-stats-titre\" style=\"text-align:center;font-size:19px;font-weight:700;color:#fff;margin-bottom:6px;\">\r\n      Kiavik imprime plus haut, sur (presque) toute la plage de plafonds\r\n    <\/h4>\r\n    <p id=\"kiavik-t-stats-sous\" style=\"text-align:center;color:#999;font-size:13px;margin-bottom:18px;\">\r\n      Hauteur d'impression utile selon la hauteur du plafond, de 150 cm \u00e0 4 m.\r\n      <span id=\"kiavik-chart-note\" style=\"display:none;color:#777;\">La courbe d'une machine se met \u00e0 jour apr\u00e8s validation de sa configuration ci-dessus.<\/span>\r\n    <\/p>\r\n\r\n    <div style=\"display:flex;gap:14px;align-items:stretch;flex-wrap:wrap;\">\r\n      <div id=\"kiavik-stat-badge-wrap\" style=\"display:flex;flex-direction:column;gap:8px;flex:0 0 140px;\"><\/div>\r\n\r\n      <div style=\"position:relative;height:300px;flex:1 1 420px;background:#111;border:1px solid #2a2a2a;border-radius:10px;padding:16px;\">\r\n        <canvas id=\"kiavik-chart-canvas\"><\/canvas>\r\n      <\/div>\r\n    <\/div>\r\n    <div style=\"max-width:560px;margin:20px auto 0;background:#161616;border:1px solid #2a2a2a;border-radius:10px;padding:14px 18px;display:flex;align-items:center;gap:12px;\">\r\n      <div style=\"font-size:22px;line-height:1;flex-shrink:0;\">\ud83d\udd0d<\/div>\r\n      <div id=\"kiavik-t-transparence\" style=\"font-size:13px;color:#bbb;line-height:1.5;\">\r\n        <strong style=\"color:#fff;\">Transparence des calculs :<\/strong> calcul\u00e9 sur la meilleure configuration possible pour chaque machine. Donn\u00e9es concurrentes issues des documentations commerciales des fabricants, modifiables et validables ci-dessus.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- tableau de transparence : d\u00e9tail du calcul pour Kiavik et la machine active -->\r\n    <div style=\"margin-top:16px;overflow-x:auto;\">\r\n      <table style=\"width:100%;max-width:560px;margin:0 auto;border-collapse:collapse;font-size:12.5px;\">\r\n        <thead>\r\n          <tr style=\"border-bottom:1px solid #333;\">\r\n            <th id=\"kiavik-t-etape-calcul\" style=\"text-align:left;padding:7px 8px;color:#999;font-weight:600;\">\u00c9tape du calcul<\/th>\r\n            <th style=\"text-align:right;padding:7px 8px;color:#3ddc6f;font-weight:700;\">Kiavik<\/th>\r\n            <th id=\"kiavik-transp-th-conc\" style=\"text-align:right;padding:7px 8px;color:#e64646;font-weight:700;\">Concurrent<\/th>\r\n          <\/tr>\r\n        <\/thead>\r\n        <tbody id=\"kiavik-transparence-body\" style=\"color:#ddd;\"><\/tbody>\r\n      <\/table>\r\n      <p id=\"kiavik-t-legende-coulisse\" style=\"font-size:10.5px;color:#666;max-width:560px;margin:8px auto 0;text-align:center;\">\r\n        * La capacit\u00e9 de la t\u00eate \u00e0 d\u00e9passer le m\u00e2t (course de coulisse) varie selon chaque machine \u2014 c'est elle qui permet d'ajuster finement la hauteur sous plafond.\r\n      <\/p>\r\n      <div id=\"kiavik-transp-resume\" style=\"max-width:560px;margin:16px auto 0;background:#161616;border:1px solid #2a2a2a;border-radius:10px;padding:14px 18px;\"><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/Chart.js\/4.4.0\/chart.umd.min.js\"><\/script>\r\n\r\n<script>\r\n(function(){\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ TRADUCTIONS \u2014 dictionnaire FR\/EN. Un seul calcul, deux jeux de textes.\r\n  \/\/ ===========================================================================\r\n  var LANGUE_ACTUELLE = 'fr';\r\n\r\n  var TRADUCTIONS = {\r\n    fr: {\r\n      titre: 'Configurez votre Kiavik selon la hauteur de votre plafond',\r\n      soustitre: 'De 0 \u00e0 4 m, par paliers de 10 cm, en combinant les rallonges modulaires.',\r\n      labelPlafond: 'Entrez la hauteur exacte de votre plafond (cm)',\r\n      calculer: 'Calculer',\r\n      plafondVisuel: 'PLAFOND',\r\n      sechageVisuel: 'S\u00c9CHAGE 23cm',\r\n      margeVisuel: 'MARGE 35cm',\r\n      configRecommandee: 'Configuration recommand\u00e9e',\r\n      hauteurMat: 'Hauteur du m\u00e2t',\r\n      margeBasse: 'Marge basse fixe',\r\n      zoneSechage: 'Zone s\u00e9chage lampe',\r\n      kiavikImpr: 'Kiavik \u2014 Hauteur imprimable',\r\n      voirDetail: '\u2193 Voir le d\u00e9tail du calcul',\r\n      toujours23: '\u2713 Toujours \u2264 23 cm du plafond, quelle que soit sa hauteur',\r\n      encart1: '<strong style=\"color:#3ddc6f;\">Ch\u00e2ssis renforc\u00e9 et 6 rallonges de s\u00e9rie<\/strong> (100, 110, 50, 40, 30, 20 cm) : Kiavik est livr\u00e9 d\\'office avec tout ce qu\\'il faut pour s\\'adapter \u00e0 n\\'importe quelle hauteur de plafond \u2014 la machine la plus polyvalente du march\u00e9.',\r\n      encart2: '<strong style=\"color:#3ddc6f;\">Son secret :<\/strong> la t\u00eate d\\'impression peut d\u00e9passer le m\u00e2t principal de 10&nbsp;cm pour toujours venir se coller au plafond, quelle que soit sa hauteur exacte.',\r\n      specsTitre: 'Specs de la machine concurrente',\r\n      specsSous: 'Donn\u00e9es issues des documentations commerciales des fabricants \u2014 modifiables si besoin.',\r\n      selectionnez: 'S\u00e9lectionnez votre machine actuelle (fabricant d\\'origine)',\r\n      chargement: 'Chargement des machines\u2026',\r\n      ouChoisissez: 'Ou choisissez un autre mod\u00e8le',\r\n      autresModelesOpt: '\u2014 Autres mod\u00e8les \u2014',\r\n      enregistrePar: '(enregistr\u00e9 par un utilisateur)',\r\n      validerMachine: '\u2713 Valider ma machine',\r\n      nomModele: 'Nom \/ mod\u00e8le de votre machine',\r\n      nomModelePlaceholder: 'ex: Caldera WallJet 3200, machine sans marque visible, etc.',\r\n      chassisBase: 'Hauteur ch\u00e2ssis de base (cm)',\r\n      rallongesLabel: 'Rallonges (cm, s\u00e9par\u00e9es par virgule)',\r\n      margeBasseLabel: 'Marge basse fixe (cm)',\r\n      margeHauteLabel: 'Marge haute \/ s\u00e9chage (cm)',\r\n      explication: 'La t\u00eate d\\'impression coulisse jusqu\\'\u00e0 10&nbsp;cm au-dessus du m\u00e2t pour toujours atteindre le plafond, quelle que soit sa hauteur exacte. Sur cette hauteur totale, une marge fixe de 35&nbsp;cm en bas et 23&nbsp;cm de s\u00e9chage \u00e0 la lampe en haut d\u00e9limitent la zone r\u00e9ellement imprimable.',\r\n      statsTitre: 'Kiavik imprime plus haut, sur (presque) toute la plage de plafonds',\r\n      statsSous: 'Hauteur d\\'impression utile selon la hauteur du plafond, de 150 cm \u00e0 4 m.',\r\n      chartNote: 'La courbe d\\'une machine se met \u00e0 jour apr\u00e8s validation de sa configuration ci-dessus.',\r\n      transparence: '<strong style=\"color:#fff;\">Transparence des calculs :<\/strong> calcul\u00e9 sur la meilleure configuration possible pour chaque machine. Donn\u00e9es concurrentes issues des documentations commerciales des fabricants, modifiables et validables ci-dessus.',\r\n      etapeCalcul: '\u00c9tape du calcul',\r\n      legendeCoulisse: '* La capacit\u00e9 de la t\u00eate \u00e0 d\u00e9passer le m\u00e2t (course de coulisse) varie selon chaque machine \u2014 c\\'est elle qui permet d\\'ajuster finement la hauteur sous plafond.',\r\n      chassisSeul: 'Ch\u00e2ssis seul',\r\n      autreSaisie: 'Autre \/ saisie manuelle',\r\n      valeurModifiable: 'Valeur modifiable selon votre configuration',\r\n      modifieCliquez: 'Modifi\u00e9 \u2014 cliquez sur \"Valider ma machine\" pour mettre \u00e0 jour le comparatif',\r\n      cliquezVoir: 'Cliquez sur \"Valider ma machine\" pour voir le comparatif',\r\n      egalite: '\u00e0 \u00e9galit\u00e9',\r\n      kiavikImprimeDePlus: function(diff){ return 'Kiavik imprime ' + diff + ' cm de plus'; },\r\n      concurrentImprimeDePlus: function(nom, diff){ return nom + ' imprime ' + diff + ' cm de plus'; },\r\n      kiavikImprimePourcent: function(pct){ return 'Kiavik Vertical Print : jusqu\\'\u00e0 +' + pct + '% de hauteur d\\'impression en plus que la concurrence'; },\r\n      concurrentImprimePourcent: function(nom, pct){ return nom + ' imprime ' + pct + '% de plus que Kiavik'; },\r\n      configEnregistree: '\u2713 Configuration enregistr\u00e9e, merci !',\r\n      hauteurPlafondSaisie: 'Hauteur de plafond saisie',\r\n      chassisRallongesUtilise: 'Ch\u00e2ssis + rallonges (m\u00e2t) utilis\u00e9',\r\n      depassementTete: 'D\u00e9passement t\u00eate du m\u00e2t *',\r\n      hauteurImprReelle: '= Hauteur imprimable r\u00e9elle',\r\n      kiavikRallongesUtilisees: function(nom, combo){ return '<strong style=\"color:#3ddc6f;\">Kiavik<\/strong> \u2014 rallonges utilis\u00e9es : ' + combo; },\r\n      concurrentRallongesUtilisees: function(nom, combo){ return '<strong style=\"color:#e64646;\">' + nom + '<\/strong> \u2014 rallonges utilis\u00e9es : ' + combo; },\r\n      aucuneChassisSeul: 'aucune (ch\u00e2ssis seul)',\r\n      cmImprimables: function(v){ return v + ' cm imprimables'; },\r\n      hauteurPlafondAxe: 'Hauteur du plafond',\r\n      hauteurImprAxe: 'Hauteur imprimable (cm)',\r\n      vsLabel: 'vs '\r\n    },\r\n    en: {\r\n      titre: 'Configure your Kiavik based on your ceiling height',\r\n      soustitre: 'From 0 to 4 m, in 10 cm increments, by combining modular extensions.',\r\n      labelPlafond: 'Enter the exact height of your ceiling (cm)',\r\n      calculer: 'Calculate',\r\n      plafondVisuel: 'CEILING',\r\n      sechageVisuel: 'DRYING 23cm',\r\n      margeVisuel: 'MARGIN 35cm',\r\n      configRecommandee: 'Recommended configuration',\r\n      hauteurMat: 'Mast height',\r\n      margeBasse: 'Fixed bottom margin',\r\n      zoneSechage: 'Lamp drying zone',\r\n      kiavikImpr: 'Kiavik \u2014 Printable height',\r\n      voirDetail: '\u2193 See calculation details',\r\n      toujours23: '\u2713 Always \u2264 23 cm from ceiling, whatever its height',\r\n      encart1: '<strong style=\"color:#3ddc6f;\">Reinforced frame and 6 standard extensions<\/strong> (100, 110, 50, 40, 30, 20 cm): Kiavik comes ready out of the box to adapt to any ceiling height \u2014 the most versatile machine on the market.',\r\n      encart2: '<strong style=\"color:#3ddc6f;\">Its secret:<\/strong> the print head can extend 10&nbsp;cm beyond the main mast to always reach the ceiling, whatever its exact height.',\r\n      specsTitre: 'Competitor machine specs',\r\n      specsSous: 'Data from manufacturers\\' commercial documentation \u2014 editable if needed.',\r\n      selectionnez: 'Select your current machine (original manufacturer)',\r\n      chargement: 'Loading machines\u2026',\r\n      ouChoisissez: 'Or choose another model',\r\n      autresModelesOpt: '\u2014 Other models \u2014',\r\n      enregistrePar: '(registered by a user)',\r\n      validerMachine: '\u2713 Validate my machine',\r\n      nomModele: 'Name \/ model of your machine',\r\n      nomModelePlaceholder: 'e.g.: Caldera WallJet 3200, machine with no visible brand, etc.',\r\n      chassisBase: 'Base frame height (cm)',\r\n      rallongesLabel: 'Extensions (cm, comma-separated)',\r\n      margeBasseLabel: 'Fixed bottom margin (cm)',\r\n      margeHauteLabel: 'Top margin \/ drying (cm)',\r\n      explication: 'The print head slides up to 10&nbsp;cm above the mast to always reach the ceiling, whatever its exact height. Within this total height, a fixed margin of 35&nbsp;cm at the bottom and 23&nbsp;cm of lamp drying at the top define the actual printable zone.',\r\n      statsTitre: 'Kiavik prints higher across (almost) the entire ceiling range',\r\n      statsSous: 'Useful printing height based on ceiling height, from 150 cm to 4 m.',\r\n      chartNote: 'A machine\\'s curve updates after validating its configuration above.',\r\n      transparence: '<strong style=\"color:#fff;\">Calculation transparency:<\/strong> calculated on the best possible configuration for each machine. Competitor data from manufacturers\\' commercial documentation, editable and validatable above.',\r\n      etapeCalcul: 'Calculation step',\r\n      legendeCoulisse: '* The head\\'s ability to extend beyond the mast (slide travel) varies by machine \u2014 this is what allows fine adjustment of the height under the ceiling.',\r\n      chassisSeul: 'Frame only',\r\n      autreSaisie: 'Other \/ manual entry',\r\n      valeurModifiable: 'Value editable according to your configuration',\r\n      modifieCliquez: 'Modified \u2014 click \"Validate my machine\" to update the comparison',\r\n      cliquezVoir: 'Click \"Validate my machine\" to see the comparison',\r\n      egalite: 'tied',\r\n      kiavikImprimeDePlus: function(diff){ return 'Kiavik prints ' + diff + ' cm more'; },\r\n      concurrentImprimeDePlus: function(nom, diff){ return nom + ' prints ' + diff + ' cm more'; },\r\n      kiavikImprimePourcent: function(pct){ return 'Kiavik Vertical Print: up to +' + pct + '% more printing height than the competition'; },\r\n      concurrentImprimePourcent: function(nom, pct){ return nom + ' prints ' + pct + '% more than Kiavik'; },\r\n      configEnregistree: '\u2713 Configuration saved, thank you!',\r\n      hauteurPlafondSaisie: 'Entered ceiling height',\r\n      chassisRallongesUtilise: 'Frame + extensions (mast) used',\r\n      depassementTete: 'Head extension beyond mast *',\r\n      hauteurImprReelle: '= Actual printable height',\r\n      kiavikRallongesUtilisees: function(nom, combo){ return '<strong style=\"color:#3ddc6f;\">Kiavik<\/strong> \u2014 extensions used: ' + combo; },\r\n      concurrentRallongesUtilisees: function(nom, combo){ return '<strong style=\"color:#e64646;\">' + nom + '<\/strong> \u2014 extensions used: ' + combo; },\r\n      aucuneChassisSeul: 'none (frame only)',\r\n      cmImprimables: function(v){ return v + ' cm printable'; },\r\n      hauteurPlafondAxe: 'Ceiling height',\r\n      hauteurImprAxe: 'Printable height (cm)',\r\n      vsLabel: 'vs '\r\n    }\r\n  };\r\n\r\n  function t(cle){\r\n    var val = TRADUCTIONS[LANGUE_ACTUELLE][cle];\r\n    return val !== undefined ? val : TRADUCTIONS.fr[cle];\r\n  }\r\n\r\n  \/\/ applique les traductions \u00e0 tous les \u00e9l\u00e9ments statiques identifi\u00e9s par id\r\n  function appliquerTraductionsStatiques(){\r\n    var map = {\r\n      'kiavik-t-titre': 'titre',\r\n      'kiavik-t-soustitre': 'soustitre',\r\n      'kiavik-t-label-plafond': 'labelPlafond',\r\n      'kiavik-calc-btn': 'calculer',\r\n      'kiavik-t-plafond-label': 'plafondVisuel',\r\n      'kiavik-t-sechage-visuel': 'sechageVisuel',\r\n      'kiavik-t-marge-visuel': 'margeVisuel',\r\n      'kiavik-t-config-recommandee': 'configRecommandee',\r\n      'kiavik-t-hauteur-mat': 'hauteurMat',\r\n      'kiavik-t-marge-basse': 'margeBasse',\r\n      'kiavik-t-zone-sechage': 'zoneSechage',\r\n      'kiavik-t-kiavik-impr': 'kiavikImpr',\r\n      'kiavik-jump-transparence': 'voirDetail',\r\n      'kiavik-t-toujours-23': 'toujours23',\r\n      'kiavik-t-encart1': 'encart1',\r\n      'kiavik-t-encart2': 'encart2',\r\n      'kiavik-t-specs-titre': 'specsTitre',\r\n      'kiavik-t-specs-sous': 'specsSous',\r\n      'kiavik-t-selectionnez': 'selectionnez',\r\n      'kiavik-t-chargement': 'chargement',\r\n      'kiavik-t-ou-choisissez': 'ouChoisissez',\r\n      'kiavik-t-autres-modeles-opt': 'autresModelesOpt',\r\n      'kiavik-t-enregistre-par': 'enregistrePar',\r\n      'kiavik-valider-btn': 'validerMachine',\r\n      'kiavik-t-nom-modele': 'nomModele',\r\n      'kiavik-t-chassis-base': 'chassisBase',\r\n      'kiavik-t-rallonges-label': 'rallongesLabel',\r\n      'kiavik-t-marge-basse-label': 'margeBasseLabel',\r\n      'kiavik-t-marge-haute-label': 'margeHauteLabel',\r\n      'kiavik-t-explication': 'explication',\r\n      'kiavik-t-stats-titre': 'statsTitre',\r\n      'kiavik-t-transparence': 'transparence',\r\n      'kiavik-t-etape-calcul': 'etapeCalcul',\r\n      'kiavik-t-legende-coulisse': 'legendeCoulisse'\r\n    };\r\n    Object.keys(map).forEach(function(id){\r\n      var el = document.getElementById(id);\r\n      if (el) el.innerHTML = t(map[id]);\r\n    });\r\n\r\n    \/\/ cas particuliers : statsSous a un <span> imbriqu\u00e9 (chart-note) \u00e0 pr\u00e9server\r\n    var statsSousEl = document.getElementById('kiavik-t-stats-sous');\r\n    if (statsSousEl){\r\n      var noteEl = document.getElementById('kiavik-chart-note');\r\n      var noteDisplay = noteEl ? noteEl.style.display : 'none';\r\n      statsSousEl.innerHTML = t('statsSous') + ' <span id=\"kiavik-chart-note\" style=\"display:' + noteDisplay + ';color:#777;\">' + t('chartNote') + '<\/span>';\r\n    }\r\n\r\n    \/\/ placeholder du champ nom libre\r\n    var nomLibreEl = document.getElementById('kiavik-conc-nom-libre');\r\n    if (nomLibreEl) nomLibreEl.placeholder = t('nomModelePlaceholder');\r\n  }\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ BLOC DE CONFIGURATION CENTRAL \u2014 toutes les valeurs modifiables sont ici.\r\n  \/\/ ===========================================================================\r\n  var CONFIG = {\r\n    webhookUrl: 'https:\/\/n8n.dtsconception.fr\/webhook\/a6c0cfde-2a15-4250-b0b2-3de05c342dcf', \/\/ laisser '' pour d\u00e9sactiver l'envoi\r\n    csvUrl: 'https:\/\/docs.google.com\/spreadsheets\/d\/1ufFXz9jlet-McuWR5g6JUF7rh-jfTGhbG4XORCVYJ4o\/export?format=csv', \/\/ Google Sheet publi\u00e9e en CSV\r\n\r\n    kiavik: {\r\n      base: 124,                          \/\/ hauteur du ch\u00e2ssis (cm)\r\n      rallonges: [100, 110, 20, 30, 40, 50], \/\/ rallonges de s\u00e9rie (cm)\r\n      coulisseTete: 10,                   \/\/ marge de coulisse de la t\u00eate au-dessus du m\u00e2t (cm)\r\n      margeBasse: 35,                     \/\/ marge fixe en bas (cm)\r\n      sechage: 23                         \/\/ zone de s\u00e9chage lampe en haut (cm)\r\n    },\r\n\r\n    \/\/ charg\u00e9 dynamiquement depuis la Google Sheet (CONFIG.csvUrl) au d\u00e9marrage de la page\r\n    concurrents: {},\r\n\r\n    plageGraphique: { min: 150, max: 400, pas: 10 } \/\/ plage utilis\u00e9e pour le graphique et les statistiques\r\n  };\r\n\r\n  \/\/ palette de couleurs assign\u00e9e automatiquement aux machines charg\u00e9es depuis la Sheet\r\n  var PALETTE_COULEURS = ['#e64646', '#e0a850', '#6fa8e0', '#a05ce6', '#e64690', '#46c9e6', '#a8e046', '#e6a846', '#9046e6', '#46e6a8'];\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ CHARGEMENT DYNAMIQUE DES MACHINES CONCURRENTES (Google Sheet en CSV)\r\n  \/\/ ===========================================================================\r\n\r\n  \/\/ parseur CSV simple, g\u00e8re les champs entre guillemets contenant des virgules (ex: \"100,110,20\")\r\n  function parserCSV(texte){\r\n    var lignes = texte.replace(\/\\r\\n\/g, '\\n').split('\\n').filter(function(l){ return l.trim().length > 0; });\r\n    return lignes.map(function(ligne){\r\n      var champs = [];\r\n      var champActuel = '';\r\n      var dansGuillemets = false;\r\n      for (var i = 0; i < ligne.length; i++){\r\n        var car = ligne[i];\r\n        if (car === '\"'){\r\n          dansGuillemets = !dansGuillemets;\r\n        } else if (car === ',' && !dansGuillemets){\r\n          champs.push(champActuel);\r\n          champActuel = '';\r\n        } else {\r\n          champActuel += car;\r\n        }\r\n      }\r\n      champs.push(champActuel);\r\n      return champs;\r\n    });\r\n  }\r\n\r\n  function chargerMachinesDepuisSheet(callback){\r\n    if (!CONFIG.csvUrl){ callback(); return; }\r\n    fetch(CONFIG.csvUrl)\r\n      .then(function(res){ return res.text(); })\r\n      .then(function(texte){\r\n        var lignes = parserCSV(texte);\r\n        var entetes = lignes[0].map(function(h){ return h.trim().toLowerCase(); });\r\n        var idx = {\r\n          cle: entetes.indexOf('cle'),\r\n          label: entetes.indexOf('label'),\r\n          base: entetes.indexOf('base'),\r\n          rallonges: entetes.indexOf('rallonges'),\r\n          coulisse: entetes.indexOf('coulisse_tete'),\r\n          marge: entetes.indexOf('marge_basse'),\r\n          sechage: entetes.indexOf('sechage'),\r\n          image: entetes.indexOf('image_url')\r\n        };\r\n\r\n        for (var i = 1; i < lignes.length; i++){\r\n          var l = lignes[i];\r\n          if (!l[idx.cle]) continue;\r\n          var cle = l[idx.cle].trim();\r\n          CONFIG.concurrents[cle] = {\r\n            label: (l[idx.label] || cle).trim(),\r\n            base: parseFloat(l[idx.base]) || 0,\r\n            rallonges: (l[idx.rallonges] || '').split(',').map(function(s){ return parseFloat(s.trim()); }).filter(function(n){ return !isNaN(n) && n > 0; }),\r\n            coulisseTete: parseFloat(l[idx.coulisse]) || 0,\r\n            margeBasse: parseFloat(l[idx.marge]) || 0,\r\n            sechage: parseFloat(l[idx.sechage]) || 0,\r\n            image: (l[idx.image] || '').trim(),\r\n            couleur: PALETTE_COULEURS[(i-1) % PALETTE_COULEURS.length],\r\n            ordre: i - 1\r\n          };\r\n        }\r\n        callback();\r\n      })\r\n      .catch(function(err){\r\n        console.error('Kiavik - erreur chargement Sheet machines concurrentes:', err);\r\n        callback(); \/\/ on continue quand m\u00eame, avec une liste vide\r\n      });\r\n  }\r\n\r\n  var comparatifActif = true; \/\/ le bloc concurrent est toujours visible d\u00e9sormais, plus de toggle\r\n  var dejaValide = false;\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ CALCULS G\u00c9N\u00c9RIQUES \u2014 utilis\u00e9s \u00e0 la fois par Kiavik et par les concurrents.\r\n  \/\/ ===========================================================================\r\n\r\n  \/\/ toutes les hauteurs de m\u00e2t atteignables avec un jeu de rallonges donn\u00e9\r\n  function hauteursAtteignables(base, rallonges){\r\n    var totaux = {};\r\n    var n = rallonges.length;\r\n    for (var mask = 0; mask < (1 << n); mask++){\r\n      var somme = 0, combo = [];\r\n      for (var i = 0; i < n; i++){\r\n        if (mask & (1 << i)){ somme += rallonges[i]; combo.push(rallonges[i]); }\r\n      }\r\n      var total = base + somme;\r\n      if (!totaux[total] || combo.length < totaux[total].combo.length){\r\n        totaux[total] = { total: total, combo: combo };\r\n      }\r\n    }\r\n    return Object.keys(totaux).map(function(k){ return totaux[k]; }).sort(function(a,b){ return a.total - b.total; });\r\n  }\r\n\r\n  \/\/ plus grand m\u00e2t atteignable tel que (plafond - m\u00e2t) <= coulisseTete (la t\u00eate comble l'\u00e9cart r\u00e9siduel)\r\n  function meilleurMatPourPlafond(hauteurs, plafond, coulisseTete){\r\n    var meilleur = hauteurs[0];\r\n    for (var i = 0; i < hauteurs.length; i++){\r\n      if (hauteurs[i].total <= plafond) meilleur = hauteurs[i];\r\n      else break;\r\n    }\r\n    return meilleur;\r\n  }\r\n\r\n  \/\/ hauteur d'impression utile pour Kiavik \u00e0 un plafond donn\u00e9\r\n  var HAUTEURS_KIAVIK = hauteursAtteignables(CONFIG.kiavik.base, CONFIG.kiavik.rallonges);\r\n  function imprKiavik(plafond){\r\n    return Math.max(0, plafond - CONFIG.kiavik.sechage - CONFIG.kiavik.margeBasse);\r\n  }\r\n  function matKiavik(plafond){\r\n    return meilleurMatPourPlafond(HAUTEURS_KIAVIK, plafond, CONFIG.kiavik.coulisseTete);\r\n  }\r\n\r\n  \/\/ hauteur d'impression utile pour une machine g\u00e9n\u00e9rique (concurrent), tenant compte de SA coulisse t\u00eate\r\n  function imprConcurrent(base, rallonges, coulisseTete, margeBasse, sechage, plafond){\r\n    var hauteurs = hauteursAtteignables(base, rallonges).map(function(h){ return h.total; });\r\n    var matMax = plafond - 0; \/\/ le m\u00e2t peut aller jusqu'au plafond moins ce que la coulisse comble\r\n    var meilleur = base;\r\n    for (var i = 0; i < hauteurs.length; i++){\r\n      \/\/ la coulisse comble jusqu'\u00e0 coulisseTete cm : m\u00e2t valide si (plafond - m\u00e2t) <= coulisseTete\r\n      if (plafond - hauteurs[i] >= 0 && plafond - hauteurs[i] <= coulisseTete) meilleur = Math.max(meilleur, hauteurs[i]);\r\n      else if (hauteurs[i] <= plafond) meilleur = Math.max(meilleur, hauteurs[i]);\r\n    }\r\n    return Math.max(0, meilleur - margeBasse - sechage);\r\n  }\r\n\r\n  \/\/ m\u00e2t retenu pour une machine g\u00e9n\u00e9rique (concurrent), m\u00eame logique que imprConcurrent mais renvoie le m\u00e2t brut\r\n  function matConcurrent(base, rallonges, coulisseTete, plafond){\r\n    var hauteurs = hauteursAtteignables(base, rallonges).map(function(h){ return h.total; });\r\n    var meilleur = base;\r\n    for (var i = 0; i < hauteurs.length; i++){\r\n      if (plafond - hauteurs[i] >= 0 && plafond - hauteurs[i] <= coulisseTete) meilleur = Math.max(meilleur, hauteurs[i]);\r\n      else if (hauteurs[i] <= plafond) meilleur = Math.max(meilleur, hauteurs[i]);\r\n    }\r\n    return meilleur;\r\n  }\r\n\r\n  \/\/ renvoie le combo de rallonges (liste de cm) correspondant au m\u00e2t retenu pour le concurrent\r\n  function comboConcurrent(base, rallonges, matRetenu){\r\n    var hauteurs = hauteursAtteignables(base, rallonges);\r\n    for (var i = 0; i < hauteurs.length; i++){\r\n      if (hauteurs[i].total === matRetenu) return hauteurs[i].combo;\r\n    }\r\n    return [];\r\n  }\r\n\r\n  function imprConcurrentParCle(cle, plafond){\r\n    var c = CONFIG.concurrents[cle];\r\n    return imprConcurrent(c.base, c.rallonges, c.coulisseTete, c.margeBasse, c.sechage, plafond);\r\n  }\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ R\u00c9F\u00c9RENCES DOM \u2014 configurateur principal\r\n  \/\/ ===========================================================================\r\n  var slider = document.getElementById('kiavik-hauteur');\r\n  var numInput = document.getElementById('kiavik-hauteur-input');\r\n  var calcBtn = document.getElementById('kiavik-calc-btn');\r\n  var murEl = document.getElementById('kiavik-mur');\r\n  var zoneImprEl = document.getElementById('kiavik-zone-impr');\r\n  var zoneImprLabelEl = document.getElementById('kiavik-zone-impr-label');\r\n  var bandeSechageEl = document.getElementById('kiavik-bande-sechage');\r\n  var bandeMargeEl = document.getElementById('kiavik-bande-marge');\r\n  var comboEl = document.getElementById('kiavik-combo');\r\n  var matHEl = document.getElementById('kiavik-mat-h');\r\n  var imprHEl = document.getElementById('kiavik-impr-h');\r\n  var diffSousCurseurEl = document.getElementById('kiavik-diff-sous-curseur');\r\n\r\n  var PX_PAR_CM = 0.85; \/\/ \u00e9chelle visuelle : 1cm de plafond = 0.85px\r\n\r\n  function update(source){\r\n    var plafond = parseInt((source === 'num' ? numInput.value : slider.value), 10);\r\n    if (isNaN(plafond)) return;\r\n    if (plafond < CONFIG.kiavik.base) plafond = CONFIG.kiavik.base;\r\n    if (plafond > 400) plafond = 400;\r\n\r\n    numInput.value = plafond;\r\n    slider.value = plafond;\r\n\r\n    var res = matKiavik(plafond);\r\n    var hauteurImpressionUtile = imprKiavik(plafond);\r\n\r\n    if (res.combo.length === 0){\r\n      comboEl.textContent = t('chassisSeul') + ' (' + CONFIG.kiavik.base + ' cm)';\r\n    } else {\r\n      var counts = {};\r\n      res.combo.forEach(function(v){ counts[v] = (counts[v]||0)+1; });\r\n      var parts = [(LANGUE_ACTUELLE === 'en' ? 'Frame ' : 'Ch\u00e2ssis ') + CONFIG.kiavik.base + ' cm'];\r\n      Object.keys(counts).sort(function(a,b){return b-a;}).forEach(function(k){\r\n        var n = counts[k];\r\n        parts.push((n>1? n+' x ':'') + '+' + k + ' cm');\r\n      });\r\n      comboEl.textContent = parts.join('  \u00b7  ');\r\n    }\r\n\r\n    matHEl.textContent = res.total + ' cm';\r\n    imprHEl.textContent = Math.max(0, hauteurImpressionUtile) + ' cm';\r\n\r\n    var murPx = plafond * PX_PAR_CM;\r\n    murEl.style.height = murPx + 'px';\r\n\r\n    var margeBassePx = CONFIG.kiavik.margeBasse * PX_PAR_CM;\r\n    var sechagePx = CONFIG.kiavik.sechage * PX_PAR_CM;\r\n    var zoneImprPx = Math.max(0, murPx - margeBassePx - sechagePx);\r\n\r\n    zoneImprEl.style.bottom = margeBassePx + 'px';\r\n    zoneImprEl.style.height = zoneImprPx + 'px';\r\n    zoneImprLabelEl.textContent = 'KIAVIK\\n' + Math.max(0, hauteurImpressionUtile) + ' cm\\nimprimables';\r\n\r\n    \/\/ ajustement purement visuel : la bande affich\u00e9e est raccourcie de 4cm pour \u00e9viter\r\n    \/\/ qu'elle ne semble d\u00e9passer le sommet du mur \u00e0 l'\u00e9cran (le calcul r\u00e9el n'est pas modifi\u00e9)\r\n    var sechagePxVisuel = Math.max(0, sechagePx - (4 * PX_PAR_CM));\r\n    bandeSechageEl.style.bottom = (margeBassePx + zoneImprPx) + 'px';\r\n    bandeSechageEl.style.height = sechagePxVisuel + 'px';\r\n\r\n    bandeMargeEl.style.height = margeBassePx + 'px';\r\n\r\n    if (comparatifActif && dejaValide){\r\n      calculerEtAfficherComparatif();\r\n    }\r\n  }\r\n\r\n  slider.addEventListener('input', function(){ update('slider'); });\r\n  numInput.addEventListener('input', function(){ update('num'); });\r\n  calcBtn.addEventListener('click', function(){ update('num'); });\r\n  numInput.addEventListener('keydown', function(e){ if (e.key === 'Enter') update('num'); });\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ COMPARATIF CONCURRENT\r\n  \/\/ ===========================================================================\r\n  var formComp = document.getElementById('kiavik-form-comparatif');\r\n  var resultatEl = document.getElementById('kiavik-conc-resultat');\r\n  var concBaseInput = document.getElementById('kiavik-conc-base');\r\n  var concRallongesInput = document.getElementById('kiavik-conc-rallonges');\r\n  var concMargeInput = document.getElementById('kiavik-conc-marge');\r\n  var concSechageInput = document.getElementById('kiavik-conc-sechage');\r\n\r\n  var zoneImprConcEl = document.getElementById('kiavik-zone-impr-conc');\r\n  var bandeSechageConcEl = document.getElementById('kiavik-bande-sechage-conc');\r\n  var bandeMargeConcEl = document.getElementById('kiavik-bande-marge-conc');\r\n  var marqueGridEl = document.getElementById('kiavik-marque-grid');\r\n  var autresModelesWrapEl = document.getElementById('kiavik-autres-modeles-wrap');\r\n  var autresModelesSelect = document.getElementById('kiavik-autres-modeles');\r\n  var marqueHiddenInput = document.getElementById('kiavik-conc-marque');\r\n  var nomLibreInput = document.getElementById('kiavik-conc-nom-libre');\r\n  var nomLibreWrapEl = document.getElementById('kiavik-nom-libre-wrap');\r\n  var ligneConcurrentEl = document.getElementById('kiavik-ligne-concurrent');\r\n  var jumpTransparenceEl = document.getElementById('kiavik-jump-transparence');\r\n  var nomConcurrentEl = document.getElementById('kiavik-nom-concurrent');\r\n  var imprConcHEl = document.getElementById('kiavik-impr-conc-h');\r\n  var validerBtn = document.getElementById('kiavik-valider-btn');\r\n  var validerConfirmEl = document.getElementById('kiavik-valider-confirm');\r\n\r\n  \/\/ construit le tableau d\u00e9taillant, \u00e9tape par \u00e9tape, le calcul pour Kiavik et la machine concurrente active\r\n  function dessinerTableauTransparence(plafond, concBase, concRallonges, concCoulisse, concMarge, concSechage, nomMarque, pourcentage, diffTxt){\r\n    var tbody = document.getElementById('kiavik-transparence-body');\r\n    var thConc = document.getElementById('kiavik-transp-th-conc');\r\n    var resumeEl = document.getElementById('kiavik-transp-resume');\r\n    if (!tbody) return;\r\n\r\n    thConc.textContent = nomMarque;\r\n\r\n    var matK = matKiavik(plafond);\r\n    var matKTotal = matK.total;\r\n    var ecartKiavikBrut = Math.max(0, plafond - matKTotal);\r\n    var coulisseKiavikUtilisee = Math.min(ecartKiavikBrut, CONFIG.kiavik.coulisseTete);\r\n    var videKiavik = Math.max(0, ecartKiavikBrut - CONFIG.kiavik.coulisseTete);\r\n    var imprK = imprKiavik(plafond);\r\n\r\n    var matC = matConcurrent(concBase, concRallonges, concCoulisse, plafond);\r\n    var ecartConcBrut = Math.max(0, plafond - matC);\r\n    var coulisseConcUtilisee = Math.min(ecartConcBrut, concCoulisse);\r\n    var videConc = Math.max(0, ecartConcBrut - concCoulisse);\r\n    var imprC = imprConcurrent(concBase, concRallonges, concCoulisse, concMarge, concSechage, plafond);\r\n\r\n    function ligne(label, valK, valC){\r\n      return '<tr style=\"border-bottom:1px solid #222;\">' +\r\n        '<td style=\"padding:6px 8px;color:#999;\">' + label + '<\/td>' +\r\n        '<td style=\"text-align:right;padding:6px 8px;color:#3ddc6f;font-weight:600;\">' + valK + '<\/td>' +\r\n        '<td style=\"text-align:right;padding:6px 8px;color:#e64646;font-weight:600;\">' + valC + '<\/td>' +\r\n        '<\/tr>';\r\n    }\r\n\r\n    var html = '';\r\n    html += ligne(t('hauteurPlafondSaisie'), plafond + ' cm', plafond + ' cm');\r\n    html += ligne(t('chassisRallongesUtilise'), matKTotal + ' cm', matC + ' cm');\r\n    html += ligne(t('depassementTete'), coulisseKiavikUtilisee + ' cm (max ' + CONFIG.kiavik.coulisseTete + ')', coulisseConcUtilisee + ' cm (max ' + concCoulisse + ')');\r\n    html += ligne('\u2212 ' + t('margeBasse'), '\u2212' + CONFIG.kiavik.margeBasse + ' cm', '\u2212' + concMarge + ' cm');\r\n    html += ligne('\u2212 ' + t('zoneSechage'), '\u2212' + CONFIG.kiavik.sechage + ' cm', '\u2212' + concSechage + ' cm');\r\n    html += '<tr style=\"border-top:2px solid #444;\">' +\r\n      '<td style=\"padding:8px 8px;color:#fff;font-weight:700;\">' + t('hauteurImprReelle') + '<\/td>' +\r\n      '<td style=\"text-align:right;padding:8px 8px;color:#3ddc6f;font-weight:800;\">' + imprK + ' cm<\/td>' +\r\n      '<td style=\"text-align:right;padding:8px 8px;color:#e64646;font-weight:800;\">' + imprC + ' cm<\/td>' +\r\n      '<\/tr>';\r\n\r\n    tbody.innerHTML = html;\r\n\r\n    \/\/ r\u00e9sum\u00e9 synth\u00e9tique sous le tableau : rallonges utilis\u00e9es + \u00e9cart en %\r\n    if (resumeEl){\r\n      var combolKTxt = matK.combo.length ? matK.combo.join(' + ') + ' cm' : t('aucuneChassisSeul');\r\n      var comboCArr = comboConcurrent(concBase, concRallonges, matC);\r\n      var comboCTxt = comboCArr.length ? comboCArr.join(' + ') + ' cm' : t('aucuneChassisSeul');\r\n\r\n      var pourcentageTxt = pourcentage !== null ? (Math.abs(pourcentage) + '%') : '\u2014';\r\n      var pourcentageCouleur = (typeof pourcentage === 'number' && pourcentage < 0) ? '#e64646' : '#3ddc6f';\r\n\r\n      resumeEl.innerHTML =\r\n        '<div style=\"display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;font-size:12.5px;color:#bbb;margin-bottom:10px;\">' +\r\n          '<span>' + t('kiavikRallongesUtilisees')(null, combolKTxt) + '<\/span>' +\r\n          '<span>' + t('concurrentRallongesUtilisees')(nomMarque, comboCTxt) + '<\/span>' +\r\n        '<\/div>' +\r\n        '<div style=\"text-align:center;font-size:20px;font-weight:900;color:' + pourcentageCouleur + ';\">' + diffTxt + '<\/div>';\r\n    }\r\n  }\r\n\r\n  function calculerEtAfficherComparatif(){\r\n    dejaValide = true;\r\n    var plafond = parseInt(numInput.value, 10) || 245;\r\n    var concBase = parseFloat(concBaseInput.value) || 0;\r\n    var concRallonges = concRallongesInput.value.split(',').map(function(s){ return parseFloat(s.trim()); }).filter(function(n){ return !isNaN(n) && n > 0; });\r\n    var concMarge = parseFloat(concMargeInput.value) || 0;\r\n    var concSechage = parseFloat(concSechageInput.value) || 0;\r\n    \/\/ coulisse t\u00eate du concurrent s\u00e9lectionn\u00e9 si connue, sinon valeur par d\u00e9faut prudente de 8cm\r\n    var concCoulisse = (marqueHiddenInput.value && CONFIG.concurrents[marqueHiddenInput.value]) ? CONFIG.concurrents[marqueHiddenInput.value].coulisseTete : 8;\r\n\r\n    var imprConc = imprConcurrent(concBase, concRallonges, concCoulisse, concMarge, concSechage, plafond);\r\n    var imprKiavikVal = imprKiavik(plafond);\r\n\r\n    var nomMarque = (marqueHiddenInput.value && CONFIG.concurrents[marqueHiddenInput.value]) ? CONFIG.concurrents[marqueHiddenInput.value].label : (nomLibreInput.value.trim() || 'Concurrent');\r\n\r\n    var diff = imprKiavikVal - imprConc;\r\n    var pourcentage = imprConc > 0 ? Math.round((diff \/ imprConc) * 100) : null;\r\n    var diffTxt;\r\n    if (diff === 0){\r\n      diffTxt = t('egalite');\r\n    } else if (pourcentage === null){\r\n      diffTxt = diff > 0 ? t('kiavikImprimeDePlus')(diff) : t('concurrentImprimeDePlus')(nomMarque, Math.abs(diff));\r\n    } else if (diff > 0){\r\n      diffTxt = t('kiavikImprimePourcent')(pourcentage);\r\n    } else {\r\n      diffTxt = t('concurrentImprimePourcent')(nomMarque, Math.abs(pourcentage));\r\n    }\r\n\r\n    diffSousCurseurEl.style.display = 'block';\r\n    diffSousCurseurEl.style.color = diff >= 0 ? '#3ddc6f' : '#e64646';\r\n    diffSousCurseurEl.textContent = diffTxt;\r\n\r\n    ligneConcurrentEl.style.display = 'flex';\r\n    nomConcurrentEl.textContent = nomMarque + ' \u2014 Hauteur imprimable';\r\n    imprConcHEl.textContent = imprConc + ' cm';\r\n    jumpTransparenceEl.style.display = 'block';\r\n\r\n    resultatEl.innerHTML = '';\r\n\r\n    var murPx = parseFloat(murEl.style.height) || 0;\r\n    var margeConcPx = concMarge * PX_PAR_CM;\r\n    var sechageConcPx = concSechage * PX_PAR_CM;\r\n    var imprConcPx = Math.max(0, imprConc * PX_PAR_CM);\r\n\r\n    zoneImprConcEl.style.display = 'flex';\r\n    bandeSechageConcEl.style.display = 'flex';\r\n    bandeMargeConcEl.style.display = 'flex';\r\n\r\n    bandeMargeConcEl.style.height = margeConcPx + 'px';\r\n    zoneImprConcEl.style.bottom = margeConcPx + 'px';\r\n    zoneImprConcEl.style.height = imprConcPx + 'px';\r\n    document.getElementById('kiavik-zone-impr-conc-label').textContent = nomMarque.toUpperCase() + '\\n' + imprConc + ' cm\\nimprimables';\r\n    bandeSechageConcEl.style.bottom = (margeConcPx + imprConcPx) + 'px';\r\n    bandeSechageConcEl.style.height = Math.max(0, sechageConcPx - (4 * PX_PAR_CM)) + 'px';\r\n\r\n    dessinerTableauTransparence(plafond, concBase, concRallonges, concCoulisse, concMarge, concSechage, nomMarque, pourcentage, diffTxt);\r\n  }\r\n\r\n  function activerComparatif(){\r\n    if (comparatifActif) return;\r\n    comparatifActif = true;\r\n    formComp.style.display = 'block';\r\n    murEl.style.width = '260px';\r\n    resultatEl.innerHTML = '<span style=\"color:#888;\">' + t('valeurModifiable') + '<\/span>';\r\n  }\r\n\r\n  function desactiverComparatif(){\r\n    comparatifActif = false;\r\n    dejaValide = false;\r\n    formComp.style.display = 'none';\r\n    murEl.style.width = '180px';\r\n    zoneImprConcEl.style.display = 'none';\r\n    bandeSechageConcEl.style.display = 'none';\r\n    bandeMargeConcEl.style.display = 'none';\r\n    resultatEl.innerHTML = '';\r\n    diffSousCurseurEl.style.display = 'none';\r\n    ligneConcurrentEl.style.display = 'none';\r\n    validerConfirmEl.style.display = 'none';\r\n    jumpTransparenceEl.style.display = 'none';\r\n  }\r\n\r\n  function invaliderResultat(message){\r\n    dejaValide = false;\r\n    resultatEl.innerHTML = '<span style=\"color:#e64646;font-weight:600;\">' + message + '<\/span>';\r\n    zoneImprConcEl.style.display = 'none';\r\n    bandeSechageConcEl.style.display = 'none';\r\n    bandeMargeConcEl.style.display = 'none';\r\n    ligneConcurrentEl.style.display = 'none';\r\n    diffSousCurseurEl.style.display = 'none';\r\n    validerConfirmEl.style.display = 'none';\r\n    jumpTransparenceEl.style.display = 'none';\r\n  }\r\n\r\n  [concBaseInput, concRallongesInput, concMargeInput, concSechageInput, nomLibreInput].forEach(function(input){\r\n    input.addEventListener('input', function(){\r\n      invaliderResultat(t('modifieCliquez'));\r\n    });\r\n  });\r\n\r\n  \/\/ applique la s\u00e9lection d'une machine (cl\u00e9 de CONFIG.concurrents) aux champs du formulaire\r\n  function selectionnerMachine(cle){\r\n    marqueHiddenInput.value = cle;\r\n    if (cle && CONFIG.concurrents[cle]){\r\n      var m = CONFIG.concurrents[cle];\r\n      concBaseInput.value = m.base;\r\n      concRallongesInput.value = m.rallonges.join(',');\r\n      concMargeInput.value = m.margeBasse;\r\n      concSechageInput.value = m.sechage;\r\n      nomLibreWrapEl.style.display = 'none';\r\n    } else {\r\n      \/\/ saisie manuelle : le nom libre devient pertinent (sert \u00e0 identifier une machine pas encore r\u00e9pertori\u00e9e)\r\n      nomLibreWrapEl.style.display = 'flex';\r\n    }\r\n    invaliderResultat(t('cliquezVoir'));\r\n  }\r\n\r\n  \/\/ construit les vignettes (5 premi\u00e8res machines de la Sheet, par ordre d'apparition) + le s\u00e9lecteur pour le reste\r\n  function genererVignettesEtSelecteur(){\r\n    var cles = Object.keys(CONFIG.concurrents).sort(function(a,b){\r\n      return CONFIG.concurrents[a].ordre - CONFIG.concurrents[b].ordre;\r\n    });\r\n\r\n    var clesVignettes = cles.slice(0, 4);\r\n    var clesSelecteur = cles.slice(4);\r\n\r\n    marqueGridEl.innerHTML = '';\r\n\r\n    clesVignettes.forEach(function(cle){\r\n      var m = CONFIG.concurrents[cle];\r\n      var card = document.createElement('div');\r\n      card.className = 'kiavik-marque-card';\r\n      card.setAttribute('data-marque', cle);\r\n      card.style.cssText = 'cursor:pointer;border:2px solid #444;border-radius:8px;padding:8px;width:100px;text-align:center;background:#111;';\r\n      card.innerHTML =\r\n        (m.image ? '<img decoding=\"async\" src=\"' + m.image + '\" style=\"width:100%;height:70px;object-fit:contain;border-radius:4px;background:#fff;\">' : '<div style=\"height:70px;display:flex;align-items:center;justify-content:center;color:#666;font-size:24px;\">?<\/div>') +\r\n        '<div style=\"font-size:11px;color:#ddd;font-weight:600;margin-top:6px;\">' + m.label + '<\/div>';\r\n      card.addEventListener('click', function(){\r\n        document.querySelectorAll('.kiavik-marque-card').forEach(function(c){ c.style.borderColor = '#444'; });\r\n        card.style.borderColor = '#e64646';\r\n        if (autresModelesSelect) autresModelesSelect.value = '';\r\n        selectionnerMachine(cle);\r\n      });\r\n      marqueGridEl.appendChild(card);\r\n    });\r\n\r\n    \/\/ carte \"Autre \/ saisie manuelle\" toujours pr\u00e9sente en dernier\r\n    var autreCard = document.createElement('div');\r\n    autreCard.className = 'kiavik-marque-card';\r\n    autreCard.setAttribute('data-marque', '');\r\n    autreCard.style.cssText = 'cursor:pointer;border:2px solid #444;border-radius:8px;padding:8px;width:100px;text-align:center;background:#111;display:flex;flex-direction:column;align-items:center;justify-content:center;';\r\n    autreCard.innerHTML = '<div style=\"font-size:24px;color:#666;\">\u270e<\/div><div style=\"font-size:11px;color:#ddd;font-weight:600;margin-top:6px;\">' + t('autreSaisie') + '<\/div>';\r\n    autreCard.addEventListener('click', function(){\r\n      document.querySelectorAll('.kiavik-marque-card').forEach(function(c){ c.style.borderColor = '#444'; });\r\n      autreCard.style.borderColor = '#e64646';\r\n      if (autresModelesSelect) autresModelesSelect.value = '';\r\n      selectionnerMachine('');\r\n    });\r\n    marqueGridEl.appendChild(autreCard);\r\n\r\n    \/\/ s\u00e9lecteur pour les machines au-del\u00e0 des 5 premi\u00e8res (juste le label, pour en ajouter facilement au fil du temps)\r\n    if (clesSelecteur.length > 0){\r\n      autresModelesWrapEl.style.display = 'flex';\r\n      autresModelesSelect.innerHTML = '<option value=\"\">\u2014 Autres mod\u00e8les \u2014<\/option>';\r\n      clesSelecteur.forEach(function(cle){\r\n        var opt = document.createElement('option');\r\n        opt.value = cle;\r\n        opt.textContent = CONFIG.concurrents[cle].label;\r\n        autresModelesSelect.appendChild(opt);\r\n      });\r\n      autresModelesSelect.addEventListener('change', function(){\r\n        if (!autresModelesSelect.value) return;\r\n        document.querySelectorAll('.kiavik-marque-card').forEach(function(c){ c.style.borderColor = '#444'; });\r\n        selectionnerMachine(autresModelesSelect.value);\r\n      });\r\n    } else {\r\n      autresModelesWrapEl.style.display = 'none';\r\n    }\r\n  }\r\n\r\n  validerBtn.addEventListener('click', function(){\r\n    calculerEtAfficherComparatif();\r\n    mettreAJourCourbeApresValidation();\r\n\r\n    var plafond = parseInt(numInput.value, 10) || 0;\r\n    var res = matKiavik(plafond);\r\n    var payload = {\r\n      timestamp: new Date().toISOString(),\r\n      plafond_cm: plafond,\r\n      kiavik: {\r\n        mat_cm: res.total,\r\n        combo: res.combo,\r\n        hauteur_impression_utile_cm: imprKiavik(plafond)\r\n      },\r\n      concurrent: comparatifActif ? {\r\n        nom_modele_saisi: nomLibreInput.value.trim() || null,\r\n        fabricant_oem_selectionne: (marqueHiddenInput.value && CONFIG.concurrents[marqueHiddenInput.value]) ? CONFIG.concurrents[marqueHiddenInput.value].label : 'non s\u00e9lectionn\u00e9 (saisie manuelle)',\r\n        base_cm: parseFloat(concBaseInput.value) || null,\r\n        rallonges_cm: concRallongesInput.value,\r\n        marge_basse_cm: parseFloat(concMargeInput.value) || null,\r\n        sechage_cm: parseFloat(concSechageInput.value) || null\r\n      } : null\r\n    };\r\n\r\n    if (CONFIG.webhookUrl){\r\n      fetch(CONFIG.webhookUrl, {\r\n        method: 'POST',\r\n        headers: {'Content-Type': 'application\/json'},\r\n        body: JSON.stringify(payload)\r\n      }).catch(function(err){ console.error('Webhook Kiavik:', err); });\r\n    } else {\r\n      console.log('Kiavik - payload (webhook non configur\u00e9):', payload);\r\n    }\r\n\r\n    validerConfirmEl.style.display = 'block';\r\n    validerConfirmEl.textContent = t('configEnregistree');\r\n  });\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ GRAPHIQUE : une courbe par machine charg\u00e9e depuis la Sheet, mises \u00e0 jour\r\n  \/\/ individuellement \u00e0 la validation de la machine concern\u00e9e.\r\n  \/\/ ===========================================================================\r\n  var chartNoteEl = document.getElementById('kiavik-chart-note');\r\n  var statBadgeWrapEl = document.getElementById('kiavik-stat-badge-wrap');\r\n  var chartInstance = null;\r\n  var CONFIGS_GRAPHIQUE = {}; \/\/ copies mutables, construites apr\u00e8s le chargement de la Sheet\r\n\r\n  function pourcentageVs(cle){\r\n    var c = CONFIGS_GRAPHIQUE[cle];\r\n    var total = 0, ok = 0;\r\n    var plage = CONFIG.plageGraphique;\r\n    for (var p = plage.min; p <= plage.max; p += plage.pas){\r\n      total++;\r\n      var k = imprKiavik(p);\r\n      var v = imprConcurrent(c.base, c.rallonges, c.coulisseTete, c.margeBasse, c.sechage, p);\r\n      if (k >= v) ok++;\r\n    }\r\n    return Math.round((ok\/total)*1000)\/10;\r\n  }\r\n\r\n  function dessinerBadges(){\r\n    statBadgeWrapEl.innerHTML = '';\r\n    Object.keys(CONFIGS_GRAPHIQUE).sort(function(a,b){ return CONFIGS_GRAPHIQUE[a].ordre - CONFIGS_GRAPHIQUE[b].ordre; }).forEach(function(cle){\r\n      var badge = document.createElement('div');\r\n      badge.style.cssText = 'background:#161616;border:1px solid #3ddc6f;border-radius:8px;padding:8px 10px;text-align:center;';\r\n      badge.innerHTML = '<div style=\"font-size:16px;font-weight:800;color:#3ddc6f;\">' + pourcentageVs(cle) + '%<\/div>' +\r\n        '<div style=\"font-size:10px;color:#999;\">' + t('vsLabel') + CONFIGS_GRAPHIQUE[cle].label + '<\/div>';\r\n      statBadgeWrapEl.appendChild(badge);\r\n    });\r\n  }\r\n\r\n  function dessinerGraphique(){\r\n    var plage = CONFIG.plageGraphique;\r\n    var labels = [];\r\n    for (var p = plage.min; p <= plage.max; p += plage.pas){\r\n      labels.push(p + ' cm');\r\n    }\r\n\r\n    var dataKiavik = [];\r\n    for (var p2 = plage.min; p2 <= plage.max; p2 += plage.pas){\r\n      dataKiavik.push(imprKiavik(p2));\r\n    }\r\n\r\n    var datasets = [\r\n      { label: 'Kiavik', data: dataKiavik, borderColor: '#3ddc6f', backgroundColor: 'rgba(61,220,111,.12)', borderWidth: 3, pointRadius: 0, tension: 0.15, fill: true }\r\n    ];\r\n\r\n    Object.keys(CONFIGS_GRAPHIQUE).sort(function(a,b){ return CONFIGS_GRAPHIQUE[a].ordre - CONFIGS_GRAPHIQUE[b].ordre; }).forEach(function(cle){\r\n      var c = CONFIGS_GRAPHIQUE[cle];\r\n      var data = [];\r\n      for (var p3 = plage.min; p3 <= plage.max; p3 += plage.pas){\r\n        data.push(imprConcurrent(c.base, c.rallonges, c.coulisseTete, c.margeBasse, c.sechage, p3));\r\n      }\r\n      datasets.push({ label: c.label, data: data, borderColor: c.couleur, borderWidth: 2, pointRadius: 0, borderDash: [5,4], tension: 0.15 });\r\n    });\r\n\r\n    dessinerBadges();\r\n\r\n    var ctx = document.getElementById('kiavik-chart-canvas').getContext('2d');\r\n    if (chartInstance) chartInstance.destroy();\r\n    chartInstance = new Chart(ctx, {\r\n      type: 'line',\r\n      data: { labels: labels, datasets: datasets },\r\n      options: {\r\n        responsive: true,\r\n        maintainAspectRatio: false,\r\n        interaction: { mode: 'index', intersect: false },\r\n        plugins: {\r\n          legend: { labels: { color: '#ccc', font: { size: 12 } } },\r\n          tooltip: { callbacks: { label: function(ctx){ return ctx.dataset.label + ' : ' + t('cmImprimables')(ctx.parsed.y); } } }\r\n        },\r\n        scales: {\r\n          x: { ticks: { color: '#888', maxRotation: 0, autoSkip: true }, grid: { color: '#222' }, title: { display: true, text: t('hauteurPlafondAxe'), color: '#999' } },\r\n          y: { ticks: { color: '#888' }, grid: { color: '#222' }, title: { display: true, text: t('hauteurImprAxe'), color: '#999' } }\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ au clic Valider : si une machine connue (issue de la Sheet) est s\u00e9lectionn\u00e9e, on met \u00e0 jour SA courbe\r\n  \/\/ avec les valeurs temporaires actuellement saisies (les autres restent inchang\u00e9es)\r\n  function mettreAJourCourbeApresValidation(){\r\n    var key = marqueHiddenInput.value;\r\n    if (key && CONFIGS_GRAPHIQUE[key]){\r\n      CONFIGS_GRAPHIQUE[key].base = parseFloat(concBaseInput.value) || CONFIGS_GRAPHIQUE[key].base;\r\n      CONFIGS_GRAPHIQUE[key].rallonges = concRallongesInput.value.split(',').map(function(s){ return parseFloat(s.trim()); }).filter(function(n){ return !isNaN(n) && n > 0; });\r\n      CONFIGS_GRAPHIQUE[key].margeBasse = parseFloat(concMargeInput.value) || CONFIGS_GRAPHIQUE[key].margeBasse;\r\n      CONFIGS_GRAPHIQUE[key].sechage = parseFloat(concSechageInput.value) || CONFIGS_GRAPHIQUE[key].sechage;\r\n      chartNoteEl.style.display = 'none';\r\n      dessinerGraphique();\r\n    } else {\r\n      chartNoteEl.style.display = 'inline';\r\n    }\r\n  }\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ BASCULE DE LANGUE FR\/EN\r\n  \/\/ ===========================================================================\r\n  var langFrEl = document.getElementById('kiavik-lang-fr');\r\n  var langEnEl = document.getElementById('kiavik-lang-en');\r\n\r\n  function changerLangue(langue){\r\n    if (LANGUE_ACTUELLE === langue) return;\r\n    LANGUE_ACTUELLE = langue;\r\n    langFrEl.style.color = langue === 'fr' ? '#3ddc6f' : '#888';\r\n    langFrEl.style.background = langue === 'fr' ? '#1a2e22' : 'transparent';\r\n    langEnEl.style.color = langue === 'en' ? '#3ddc6f' : '#888';\r\n    langEnEl.style.background = langue === 'en' ? '#1a2e22' : 'transparent';\r\n\r\n    appliquerTraductionsStatiques();\r\n    genererVignettesEtSelecteur(); \/\/ r\u00e9g\u00e9n\u00e8re la carte \"Autre\/saisie manuelle\" traduite\r\n    dessinerGraphique(); \/\/ axes, tooltip, badges traduits\r\n    update('num'); \/\/ recalcule le combo Kiavik dans la langue active\r\n\r\n    \/\/ si un comparatif \u00e9tait d\u00e9j\u00e0 affich\u00e9, le rejouer dans la nouvelle langue\r\n    if (dejaValide) calculerEtAfficherComparatif();\r\n  }\r\n\r\n  langFrEl.addEventListener('click', function(){ changerLangue('fr'); });\r\n  langEnEl.addEventListener('click', function(){ changerLangue('en'); });\r\n\r\n  appliquerTraductionsStatiques();\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ INITIALISATION : on charge la Sheet, puis on construit l'UI d\u00e9pendante\r\n  \/\/ ===========================================================================\r\n  jumpTransparenceEl.addEventListener('click', function(){\r\n    var cible = document.getElementById('kiavik-transp-resume');\r\n    if (cible) cible.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n  });\r\n\r\n  chargerMachinesDepuisSheet(function(){\r\n    genererVignettesEtSelecteur();\r\n    CONFIGS_GRAPHIQUE = JSON.parse(JSON.stringify(CONFIG.concurrents));\r\n    dessinerGraphique();\r\n    resultatEl.innerHTML = '<span style=\"color:#888;\">' + t('valeurModifiable') + '<\/span>';\r\n    murEl.style.width = '260px';\r\n    update('num');\r\n  });\r\n})();\r\n<\/script>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section]\n","protected":false},"excerpt":{"rendered":"<p>Configurateur Kiavik Print<!-- ===================== BLOC CONFIGURATEUR KIAVIK - HAUTEUR DE PLAFOND ===================== -->\r\n<div id=\"kiavik-config-wrap\" style=\"max-width:1000px;margin:40px auto;padding:30px 20px;font-family:Arial,Helvetica,sans-serif;background:#0a0a0a;border-radius:14px;\">\r\n\r\n  <div style=\"text-align:right;margin-bottom:10px;\">\r\n    <span id=\"kiavik-lang-fr\" style=\"cursor:pointer;font-size:12px;font-weight:700;color:#3ddc6f;padding:4px 8px;border-radius:4px;background:#1a2e22;\">FR<\/span>\r\n    <span id=\"kiavik-lang-en\" style=\"cursor:pointer;font-size:12px;font-weight:700;color:#888;padding:4px 8px;border-radius:4px;\">EN<\/span>\r\n  <\/div>\r\n\r\n  <p style=\"text-align:center;font-size:13px;font-weight:700;color:#3ddc6f;letter-spacing:2px;text-transform:uppercase;margin-bottom:8px;\">Kiavik Vertical Print<\/p>\r\n  <h3 id=\"kiavik-t-titre\" style=\"text-align:center;font-size:24px;font-weight:700;color:#fff;margin-bottom:6px;\">\r\n    Configurez votre Kiavik selon la hauteur de votre plafond\r\n  <\/h3>\r\n  <p id=\"kiavik-t-soustitre\" style=\"text-align:center;color:#999;font-size:15px;margin-bottom:20px;\">\r\n    De 0 \u00e0 4 m, par paliers de 10 cm, en combinant les rallonges modulaires.\r\n  <\/p>\r\n\r\n  <!-- INPUT -->\r\n  <div style=\"display:flex;flex-direction:column;align-items:center;gap:14px;margin-bottom:14px;\">\r\n    <label id=\"kiavik-t-label-plafond\" for=\"kiavik-hauteur-input\" style=\"font-weight:600;color:#ddd;font-size:15px;\">\r\n      Entrez la hauteur exacte de votre plafond (cm)\r\n    <\/label>\r\n    <div style=\"display:flex;gap:10px;align-items:center;\">\r\n      <input type=\"number\" id=\"kiavik-hauteur-input\" min=\"124\" max=\"400\" step=\"1\" value=\"245\"\r\n        style=\"width:110px;font-size:22px;font-weight:700;text-align:center;padding:8px 6px;border:2px solid #c8a96a;border-radius:8px;color:#fff;background:#1a1a1a;\">\r\n      <span style=\"font-size:16px;color:#999;\">cm<\/span>\r\n      <div id=\"kiavik-calc-btn\" style=\"cursor:pointer;background:#c8a96a;color:#1a1a1a;padding:10px 18px;border-radius:8px;font-size:14px;font-weight:600;user-select:none;\">Calculer<\/div>\r\n    <\/div>\r\n    <input type=\"range\" id=\"kiavik-hauteur\" min=\"124\" max=\"400\" step=\"1\" value=\"245\"\r\n      style=\"width:90%;max-width:500px;accent-color:#c8a96a;margin-top:4px;\">\r\n    <div id=\"kiavik-diff-sous-curseur\" style=\"display:none;font-size:22px;font-weight:900;color:#3ddc6f;text-align:center;margin-top:6px;letter-spacing:.3px;\"><\/div>\r\n  <\/div>\r\n\r\n  <!-- VISUEL -->\r\n  <div style=\"display:flex;gap:30px;align-items:flex-end;justify-content:center;flex-wrap:wrap;margin-bottom:30px;\">\r\n\r\n    <!-- rectangle mur (hauteur = plafond) -->\r\n    <div style=\"display:flex;flex-direction:column;align-items:center;flex-shrink:0;\">\r\n      <div id=\"kiavik-t-plafond-label\" style=\"font-size:10px;font-weight:700;letter-spacing:1px;color:#999;margin-bottom:4px;\">PLAFOND<\/div>\r\n      <div id=\"kiavik-mur\" style=\"position:relative;width:180px;background:linear-gradient(135deg,#1c1c1c 0 10px,#161616 10px 20px);border:2px solid #444;border-radius:2px;transition:height .35s ease, width .35s ease;box-sizing:border-box;\">\r\n\r\n      <!-- rectangle zone imprimable Kiavik, \u00e0 l'int\u00e9rieur du mur (moiti\u00e9 gauche) -->\r\n      <div id=\"kiavik-zone-impr\" style=\"position:absolute;left:20px;width:90px;background:rgba(61,220,111,.10);border:2px solid #3ddc6f;border-radius:2px;transition:bottom .35s ease, height .35s ease;display:flex;align-items:center;justify-content:center;;box-sizing:border-box\">\r\n        <span id=\"kiavik-zone-impr-label\" style=\"font-size:11px;font-weight:800;color:#3ddc6f;text-align:center;line-height:1.3;white-space:pre-line;\"><\/span>\r\n      <\/div>\r\n\r\n      <!-- bande s\u00e9chage Kiavik (23cm), en haut de la zone imprimable -->\r\n      <div id=\"kiavik-bande-sechage\" style=\"position:absolute;left:20px;width:90px;background:repeating-linear-gradient(45deg,rgba(230,150,80,.30) 0 4px,rgba(230,150,80,.10) 4px 8px);border:1px dashed #e09650;border-radius:2px;transition:bottom .35s ease, height .35s ease;display:flex;align-items:center;justify-content:center;;box-sizing:border-box\">\r\n        <span id=\"kiavik-t-sechage-visuel\" style=\"font-size:9px;font-weight:700;color:#e09650;\">S\u00c9CHAGE 23cm<\/span>\r\n      <\/div>\r\n\r\n      <!-- bande marge basse Kiavik (35cm fixe) -->\r\n      <div id=\"kiavik-bande-marge\" style=\"position:absolute;left:20px;width:90px;bottom:0;background:repeating-linear-gradient(45deg,rgba(150,150,150,.18) 0 4px,rgba(150,150,150,.06) 4px 8px);border:1px dashed #777;border-radius:2px;display:flex;align-items:center;justify-content:center;;box-sizing:border-box\">\r\n        <span id=\"kiavik-t-marge-visuel\" style=\"font-size:9px;font-weight:700;color:#aaa;\">MARGE 35cm<\/span>\r\n      <\/div>\r\n\r\n      <!-- ===== Concurrent (masqu\u00e9 par d\u00e9faut) ===== -->\r\n      <div id=\"kiavik-zone-impr-conc\" style=\"display:none;position:absolute;right:20px;width:90px;background:rgba(230,70,70,.10);border:2px solid #e64646;border-radius:2px;transition:bottom .35s ease, height .35s ease;align-items:center;justify-content:center;;box-sizing:border-box\">\r\n        <span id=\"kiavik-zone-impr-conc-label\" style=\"font-size:11px;font-weight:800;color:#e64646;text-align:center;line-height:1.3;white-space:pre-line;\"><\/span>\r\n      <\/div>\r\n      <div id=\"kiavik-bande-sechage-conc\" style=\"display:none;position:absolute;right:20px;width:90px;background:repeating-linear-gradient(45deg,rgba(230,150,80,.30) 0 4px,rgba(230,150,80,.10) 4px 8px);border:1px dashed #e09650;border-radius:2px;transition:bottom .35s ease, height .35s ease;align-items:center;justify-content:center;;box-sizing:border-box\"><\/div>\r\n      <div id=\"kiavik-bande-marge-conc\" style=\"display:none;position:absolute;right:20px;width:90px;bottom:0;background:repeating-linear-gradient(45deg,rgba(150,150,150,.18) 0 4px,rgba(150,150,150,.06) 4px 8px);border:1px dashed #777;border-radius:2px;align-items:center;justify-content:center;;box-sizing:border-box\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- r\u00e9sultats -->\r\n    <div style=\"min-width:260px;max-width:340px;background:#161616;border:1px solid #2a2a2a;border-radius:10px;padding:20px;\">\r\n      <div id=\"kiavik-t-config-recommandee\" style=\"font-size:13px;color:#999;text-transform:uppercase;letter-spacing:.5px;margin-bottom:10px;\">Configuration recommand\u00e9e<\/div>\r\n      <div id=\"kiavik-combo\" style=\"font-size:16px;font-weight:700;color:#fff;margin-bottom:14px;line-height:1.5;\"><\/div>\r\n\r\n      <div style=\"display:flex;justify-content:space-between;padding:6px 0;border-top:1px solid #2a2a2a;\">\r\n        <span id=\"kiavik-t-hauteur-mat\" style=\"color:#999;font-size:14px;\">Hauteur du m\u00e2t<\/span>\r\n        <span id=\"kiavik-mat-h\" style=\"font-weight:700;font-size:14px;color:#fff;\">\u2014<\/span>\r\n      <\/div>\r\n      <div style=\"display:flex;justify-content:space-between;padding:6px 0;border-top:1px solid #2a2a2a;\">\r\n        <span id=\"kiavik-t-marge-basse\" style=\"color:#aaa;font-size:14px;\">Marge basse fixe<\/span>\r\n        <span style=\"font-weight:700;font-size:14px;color:#ccc;\">35 cm<\/span>\r\n      <\/div>\r\n      <div style=\"display:flex;justify-content:space-between;padding:6px 0;border-top:1px solid #2a2a2a;\">\r\n        <span id=\"kiavik-t-zone-sechage\" style=\"color:#999;font-size:14px;\">Zone s\u00e9chage lampe<\/span>\r\n        <span style=\"font-weight:700;font-size:14px;color:#e09650;\">23 cm<\/span>\r\n      <\/div>\r\n      <div style=\"display:flex;justify-content:space-between;padding:8px 0 0 0;border-top:2px solid #444;margin-top:4px;\">\r\n        <span id=\"kiavik-t-kiavik-impr\" style=\"color:#fff;font-size:14.5px;font-weight:700;\">Kiavik \u2014 Hauteur imprimable<\/span>\r\n        <span id=\"kiavik-impr-h\" style=\"font-weight:800;font-size:16px;color:#3ddc6f;\">\u2014<\/span>\r\n      <\/div>\r\n\r\n      <div id=\"kiavik-ligne-concurrent\" style=\"display:none;justify-content:space-between;padding:8px 0 0 0;border-top:1px dashed #444;margin-top:8px;\">\r\n        <span id=\"kiavik-nom-concurrent\" style=\"color:#e64646;font-size:14.5px;font-weight:700;\">Concurrent \u2014 Hauteur imprimable<\/span>\r\n        <span id=\"kiavik-impr-conc-h\" style=\"font-weight:800;font-size:16px;color:#e64646;\">\u2014<\/span>\r\n      <\/div>\r\n\r\n      <div id=\"kiavik-jump-transparence\" style=\"display:none;cursor:pointer;text-align:center;margin-top:10px;font-size:12px;color:#6fa8e0;font-weight:600;text-decoration:underline;\">\u2193 Voir le d\u00e9tail du calcul<\/div>\r\n\r\n      <div id=\"kiavik-t-toujours-23\" style=\"margin-top:16px;padding-top:14px;border-top:1px dashed #2a2a2a;font-size:12.5px;color:#6fa8e0;font-weight:600;text-align:center;line-height:1.5;\">\r\n        \u2713 Toujours \u2264 23 cm du plafond, quelle que soit sa hauteur\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- encart mise en avant : rallonges de s\u00e9rie Kiavik -->\r\n  <div style=\"max-width:700px;margin:0 auto 24px;background:linear-gradient(135deg,#1a1f17,#161c14);border:1px solid #3ddc6f;border-radius:10px;padding:18px 22px;\">\r\n    <div style=\"display:flex;align-items:center;gap:14px;\">\r\n      <div style=\"font-size:28px;line-height:1;flex-shrink:0;\">\ud83c\udfc6<\/div>\r\n      <div id=\"kiavik-t-encart1\" style=\"font-size:14px;color:#dde;line-height:1.5;\">\r\n        <strong style=\"color:#3ddc6f;\">Ch\u00e2ssis renforc\u00e9 et 6 rallonges de s\u00e9rie<\/strong> (100, 110, 50, 40, 30, 20 cm) : Kiavik est livr\u00e9 d'office avec tout ce qu'il faut pour s'adapter \u00e0 n'importe quelle hauteur de plafond \u2014 la machine la plus polyvalente du march\u00e9.\r\n      <\/div>\r\n    <\/div>\r\n    <div style=\"display:flex;align-items:center;gap:14px;margin-top:12px;padding-top:12px;border-top:1px dashed rgba(61,220,111,.25);\">\r\n      <div style=\"font-size:22px;line-height:1;flex-shrink:0;\">\u2b50<\/div>\r\n      <div id=\"kiavik-t-encart2\" style=\"font-size:14px;color:#dde;line-height:1.5;\">\r\n        <strong style=\"color:#3ddc6f;\">Son secret :<\/strong> la t\u00eate d'impression peut d\u00e9passer le m\u00e2t principal de 10&nbsp;cm pour toujours venir se coller au plafond, quelle que soit sa hauteur exacte.\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- formulaire concurrent (visible directement) -->\r\n  <div id=\"kiavik-form-comparatif\" style=\"display:block;max-width:680px;margin:0 auto 30px;background:#1a1212;border:1px solid #3a2222;border-radius:10px;padding:20px;\">\r\n    <div id=\"kiavik-t-specs-titre\" style=\"font-size:13px;color:#e64646;font-weight:700;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px;text-align:center;\">Specs de la machine concurrente<\/div>\r\n    <div id=\"kiavik-t-specs-sous\" style=\"font-size:11.5px;color:#888;text-align:center;margin-bottom:16px;\">\r\n      Donn\u00e9es issues des documentations commerciales des fabricants \u2014 modifiables si besoin.\r\n    <\/div>\r\n\r\n    <div style=\"margin-bottom:16px;\">\r\n      <label id=\"kiavik-t-selectionnez\" style=\"font-size:12.5px;color:#bbb;display:block;margin-bottom:8px;text-align:center;\">S\u00e9lectionnez votre machine actuelle (fabricant d'origine)<\/label>\r\n      <div id=\"kiavik-marque-grid\" style=\"display:flex;gap:10px;justify-content:center;flex-wrap:wrap;\">\r\n        <div id=\"kiavik-t-chargement\" style=\"font-size:12px;color:#666;padding:20px;\">Chargement des machines\u2026<\/div>\r\n      <\/div>\r\n      <div id=\"kiavik-autres-modeles-wrap\" style=\"display:none;margin-top:12px;justify-content:center;align-items:center;gap:10px;flex-wrap:wrap;\">\r\n        <label id=\"kiavik-t-ou-choisissez\" for=\"kiavik-autres-modeles\" style=\"font-size:12px;color:#bbb;\">Ou choisissez un autre mod\u00e8le<\/label>\r\n        <select id=\"kiavik-autres-modeles\" style=\"padding:8px 12px;border:1px solid #444;border-radius:6px;font-size:13px;background:#111;color:#fff;max-width:240px;\">\r\n          <option id=\"kiavik-t-autres-modeles-opt\" value=\"\">\u2014 Autres mod\u00e8les \u2014<\/option>\r\n        <\/select>\r\n        <span id=\"kiavik-t-enregistre-par\" style=\"font-size:11px;color:#777;font-style:italic;\">(enregistr\u00e9 par un utilisateur)<\/span>\r\n      <\/div>\r\n    <\/div>\r\n    <input type=\"hidden\" id=\"kiavik-conc-marque\" value=\"\">\r\n\r\n    <div id=\"kiavik-valider-btn\" style=\"cursor:pointer;background:#e64646;color:#fff;padding:10px;border-radius:8px;font-size:14px;font-weight:700;text-align:center;user-select:none;margin-bottom:16px;\">\u2713 Valider ma machine<\/div>\r\n\r\n    <div id=\"kiavik-nom-libre-wrap\" style=\"display:none;align-items:center;gap:10px;margin-bottom:16px;\">\r\n      <label id=\"kiavik-t-nom-modele\" for=\"kiavik-conc-nom-libre\" style=\"font-size:12.5px;color:#bbb;white-space:nowrap;flex-shrink:0;\">Nom \/ mod\u00e8le de votre machine<\/label>\r\n      <input type=\"text\" id=\"kiavik-conc-nom-libre\" placeholder=\"ex: Caldera WallJet 3200, machine sans marque visible, etc.\" style=\"flex:1;padding:8px;border:1px solid #444;border-radius:6px;font-size:14px;box-sizing:border-box;background:#111;color:#fff;min-width:0;\">\r\n    <\/div>\r\n\r\n    <div id=\"kiavik-conc-resultat\" style=\"margin:4px 0 18px;font-size:15px;color:#ccc;text-align:center;line-height:1.7;\"><\/div>\r\n\r\n    <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px;\">\r\n      <div>\r\n        <label id=\"kiavik-t-chassis-base\" style=\"font-size:12.5px;color:#bbb;display:block;margin-bottom:4px;min-height:32px;\">Hauteur ch\u00e2ssis de base (cm)<\/label>\r\n        <input type=\"number\" id=\"kiavik-conc-base\" value=\"120\" style=\"width:100%;padding:7px;border:1px solid #444;border-radius:6px;font-size:14px;box-sizing:border-box;background:#111;color:#fff;\">\r\n      <\/div>\r\n      <div>\r\n        <label id=\"kiavik-t-rallonges-label\" style=\"font-size:12.5px;color:#bbb;display:block;margin-bottom:4px;min-height:32px;\">Rallonges (cm, s\u00e9par\u00e9es par virgule)<\/label>\r\n        <input type=\"text\" id=\"kiavik-conc-rallonges\" value=\"50,30\" style=\"width:100%;padding:7px;border:1px solid #444;border-radius:6px;font-size:14px;box-sizing:border-box;background:#111;color:#fff;\">\r\n      <\/div>\r\n      <div>\r\n        <label id=\"kiavik-t-marge-basse-label\" style=\"font-size:12.5px;color:#bbb;display:block;margin-bottom:4px;min-height:32px;\">Marge basse fixe (cm)<\/label>\r\n        <input type=\"number\" id=\"kiavik-conc-marge\" value=\"35\" style=\"width:100%;padding:7px;border:1px solid #444;border-radius:6px;font-size:14px;box-sizing:border-box;background:#111;color:#fff;\">\r\n      <\/div>\r\n      <div>\r\n        <label id=\"kiavik-t-marge-haute-label\" style=\"font-size:12.5px;color:#bbb;display:block;margin-bottom:4px;min-height:32px;\">Marge haute \/ s\u00e9chage (cm)<\/label>\r\n        <input type=\"number\" id=\"kiavik-conc-sechage\" value=\"23\" style=\"width:100%;padding:7px;border:1px solid #444;border-radius:6px;font-size:14px;box-sizing:border-box;background:#111;color:#fff;\">\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div id=\"kiavik-valider-confirm\" style=\"display:none;margin-top:10px;font-size:12.5px;color:#3ddc6f;text-align:center;\"><\/div>\r\n  <\/div>\r\n\r\n\r\n  <p id=\"kiavik-t-explication\" style=\"text-align:center;color:#888;font-size:12.5px;max-width:620px;margin:0 auto;\">\r\n    La t\u00eate d'impression coulisse jusqu'\u00e0 10&nbsp;cm au-dessus du m\u00e2t pour toujours atteindre le plafond, quelle que soit sa hauteur exacte. Sur cette hauteur totale, une marge fixe de 35&nbsp;cm en bas et 23&nbsp;cm de s\u00e9chage \u00e0 la lampe en haut d\u00e9limitent la zone r\u00e9ellement imprimable.\r\n  <\/p>\r\n\r\n  <!-- ===== STATISTIQUES : graphique 4 courbes, mis \u00e0 jour \u00e0 la validation ===== -->\r\n  <div style=\"margin-top:36px;padding-top:28px;border-top:1px solid #222;\">\r\n    <h4 id=\"kiavik-t-stats-titre\" style=\"text-align:center;font-size:19px;font-weight:700;color:#fff;margin-bottom:6px;\">\r\n      Kiavik imprime plus haut, sur (presque) toute la plage de plafonds\r\n    <\/h4>\r\n    <p id=\"kiavik-t-stats-sous\" style=\"text-align:center;color:#999;font-size:13px;margin-bottom:18px;\">\r\n      Hauteur d'impression utile selon la hauteur du plafond, de 150 cm \u00e0 4 m.\r\n      <span id=\"kiavik-chart-note\" style=\"display:none;color:#777;\">La courbe d'une machine se met \u00e0 jour apr\u00e8s validation de sa configuration ci-dessus.<\/span>\r\n    <\/p>\r\n\r\n    <div style=\"display:flex;gap:14px;align-items:stretch;flex-wrap:wrap;\">\r\n      <div id=\"kiavik-stat-badge-wrap\" style=\"display:flex;flex-direction:column;gap:8px;flex:0 0 140px;\"><\/div>\r\n\r\n      <div style=\"position:relative;height:300px;flex:1 1 420px;background:#111;border:1px solid #2a2a2a;border-radius:10px;padding:16px;\">\r\n        <canvas id=\"kiavik-chart-canvas\"><\/canvas>\r\n      <\/div>\r\n    <\/div>\r\n    <div style=\"max-width:560px;margin:20px auto 0;background:#161616;border:1px solid #2a2a2a;border-radius:10px;padding:14px 18px;display:flex;align-items:center;gap:12px;\">\r\n      <div style=\"font-size:22px;line-height:1;flex-shrink:0;\">\ud83d\udd0d<\/div>\r\n      <div id=\"kiavik-t-transparence\" style=\"font-size:13px;color:#bbb;line-height:1.5;\">\r\n        <strong style=\"color:#fff;\">Transparence des calculs :<\/strong> calcul\u00e9 sur la meilleure configuration possible pour chaque machine. Donn\u00e9es concurrentes issues des documentations commerciales des fabricants, modifiables et validables ci-dessus.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- tableau de transparence : d\u00e9tail du calcul pour Kiavik et la machine active -->\r\n    <div style=\"margin-top:16px;overflow-x:auto;\">\r\n      <table style=\"width:100%;max-width:560px;margin:0 auto;border-collapse:collapse;font-size:12.5px;\">\r\n        <thead>\r\n          <tr style=\"border-bottom:1px solid #333;\">\r\n            <th id=\"kiavik-t-etape-calcul\" style=\"text-align:left;padding:7px 8px;color:#999;font-weight:600;\">\u00c9tape du calcul<\/th>\r\n            <th style=\"text-align:right;padding:7px 8px;color:#3ddc6f;font-weight:700;\">Kiavik<\/th>\r\n            <th id=\"kiavik-transp-th-conc\" style=\"text-align:right;padding:7px 8px;color:#e64646;font-weight:700;\">Concurrent<\/th>\r\n          <\/tr>\r\n        <\/thead>\r\n        <tbody id=\"kiavik-transparence-body\" style=\"color:#ddd;\"><\/tbody>\r\n      <\/table>\r\n      <p id=\"kiavik-t-legende-coulisse\" style=\"font-size:10.5px;color:#666;max-width:560px;margin:8px auto 0;text-align:center;\">\r\n        * La capacit\u00e9 de la t\u00eate \u00e0 d\u00e9passer le m\u00e2t (course de coulisse) varie selon chaque machine \u2014 c'est elle qui permet d'ajuster finement la hauteur sous plafond.\r\n      <\/p>\r\n      <div id=\"kiavik-transp-resume\" style=\"max-width:560px;margin:16px auto 0;background:#161616;border:1px solid #2a2a2a;border-radius:10px;padding:14px 18px;\"><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/Chart.js\/4.4.0\/chart.umd.min.js\"><\/script>\r\n\r\n<script>\r\n(function(){\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ TRADUCTIONS \u2014 dictionnaire FR\/EN. Un seul calcul, deux jeux de textes.\r\n  \/\/ ===========================================================================\r\n  var LANGUE_ACTUELLE = 'fr';\r\n\r\n  var TRADUCTIONS = {\r\n    fr: {\r\n      titre: 'Configurez votre Kiavik selon la hauteur de votre plafond',\r\n      soustitre: 'De 0 \u00e0 4 m, par paliers de 10 cm, en combinant les rallonges modulaires.',\r\n      labelPlafond: 'Entrez la hauteur exacte de votre plafond (cm)',\r\n      calculer: 'Calculer',\r\n      plafondVisuel: 'PLAFOND',\r\n      sechageVisuel: 'S\u00c9CHAGE 23cm',\r\n      margeVisuel: 'MARGE 35cm',\r\n      configRecommandee: 'Configuration recommand\u00e9e',\r\n      hauteurMat: 'Hauteur du m\u00e2t',\r\n      margeBasse: 'Marge basse fixe',\r\n      zoneSechage: 'Zone s\u00e9chage lampe',\r\n      kiavikImpr: 'Kiavik \u2014 Hauteur imprimable',\r\n      voirDetail: '\u2193 Voir le d\u00e9tail du calcul',\r\n      toujours23: '\u2713 Toujours \u2264 23 cm du plafond, quelle que soit sa hauteur',\r\n      encart1: '<strong style=\"color:#3ddc6f;\">Ch\u00e2ssis renforc\u00e9 et 6 rallonges de s\u00e9rie<\/strong> (100, 110, 50, 40, 30, 20 cm) : Kiavik est livr\u00e9 d\\'office avec tout ce qu\\'il faut pour s\\'adapter \u00e0 n\\'importe quelle hauteur de plafond \u2014 la machine la plus polyvalente du march\u00e9.',\r\n      encart2: '<strong style=\"color:#3ddc6f;\">Son secret :<\/strong> la t\u00eate d\\'impression peut d\u00e9passer le m\u00e2t principal de 10&nbsp;cm pour toujours venir se coller au plafond, quelle que soit sa hauteur exacte.',\r\n      specsTitre: 'Specs de la machine concurrente',\r\n      specsSous: 'Donn\u00e9es issues des documentations commerciales des fabricants \u2014 modifiables si besoin.',\r\n      selectionnez: 'S\u00e9lectionnez votre machine actuelle (fabricant d\\'origine)',\r\n      chargement: 'Chargement des machines\u2026',\r\n      ouChoisissez: 'Ou choisissez un autre mod\u00e8le',\r\n      autresModelesOpt: '\u2014 Autres mod\u00e8les \u2014',\r\n      enregistrePar: '(enregistr\u00e9 par un utilisateur)',\r\n      validerMachine: '\u2713 Valider ma machine',\r\n      nomModele: 'Nom \/ mod\u00e8le de votre machine',\r\n      nomModelePlaceholder: 'ex: Caldera WallJet 3200, machine sans marque visible, etc.',\r\n      chassisBase: 'Hauteur ch\u00e2ssis de base (cm)',\r\n      rallongesLabel: 'Rallonges (cm, s\u00e9par\u00e9es par virgule)',\r\n      margeBasseLabel: 'Marge basse fixe (cm)',\r\n      margeHauteLabel: 'Marge haute \/ s\u00e9chage (cm)',\r\n      explication: 'La t\u00eate d\\'impression coulisse jusqu\\'\u00e0 10&nbsp;cm au-dessus du m\u00e2t pour toujours atteindre le plafond, quelle que soit sa hauteur exacte. Sur cette hauteur totale, une marge fixe de 35&nbsp;cm en bas et 23&nbsp;cm de s\u00e9chage \u00e0 la lampe en haut d\u00e9limitent la zone r\u00e9ellement imprimable.',\r\n      statsTitre: 'Kiavik imprime plus haut, sur (presque) toute la plage de plafonds',\r\n      statsSous: 'Hauteur d\\'impression utile selon la hauteur du plafond, de 150 cm \u00e0 4 m.',\r\n      chartNote: 'La courbe d\\'une machine se met \u00e0 jour apr\u00e8s validation de sa configuration ci-dessus.',\r\n      transparence: '<strong style=\"color:#fff;\">Transparence des calculs :<\/strong> calcul\u00e9 sur la meilleure configuration possible pour chaque machine. Donn\u00e9es concurrentes issues des documentations commerciales des fabricants, modifiables et validables ci-dessus.',\r\n      etapeCalcul: '\u00c9tape du calcul',\r\n      legendeCoulisse: '* La capacit\u00e9 de la t\u00eate \u00e0 d\u00e9passer le m\u00e2t (course de coulisse) varie selon chaque machine \u2014 c\\'est elle qui permet d\\'ajuster finement la hauteur sous plafond.',\r\n      chassisSeul: 'Ch\u00e2ssis seul',\r\n      autreSaisie: 'Autre \/ saisie manuelle',\r\n      valeurModifiable: 'Valeur modifiable selon votre configuration',\r\n      modifieCliquez: 'Modifi\u00e9 \u2014 cliquez sur \"Valider ma machine\" pour mettre \u00e0 jour le comparatif',\r\n      cliquezVoir: 'Cliquez sur \"Valider ma machine\" pour voir le comparatif',\r\n      egalite: '\u00e0 \u00e9galit\u00e9',\r\n      kiavikImprimeDePlus: function(diff){ return 'Kiavik imprime ' + diff + ' cm de plus'; },\r\n      concurrentImprimeDePlus: function(nom, diff){ return nom + ' imprime ' + diff + ' cm de plus'; },\r\n      kiavikImprimePourcent: function(pct){ return 'Kiavik Vertical Print : jusqu\\'\u00e0 +' + pct + '% de hauteur d\\'impression en plus que la concurrence'; },\r\n      concurrentImprimePourcent: function(nom, pct){ return nom + ' imprime ' + pct + '% de plus que Kiavik'; },\r\n      configEnregistree: '\u2713 Configuration enregistr\u00e9e, merci !',\r\n      hauteurPlafondSaisie: 'Hauteur de plafond saisie',\r\n      chassisRallongesUtilise: 'Ch\u00e2ssis + rallonges (m\u00e2t) utilis\u00e9',\r\n      depassementTete: 'D\u00e9passement t\u00eate du m\u00e2t *',\r\n      hauteurImprReelle: '= Hauteur imprimable r\u00e9elle',\r\n      kiavikRallongesUtilisees: function(nom, combo){ return '<strong style=\"color:#3ddc6f;\">Kiavik<\/strong> \u2014 rallonges utilis\u00e9es : ' + combo; },\r\n      concurrentRallongesUtilisees: function(nom, combo){ return '<strong style=\"color:#e64646;\">' + nom + '<\/strong> \u2014 rallonges utilis\u00e9es : ' + combo; },\r\n      aucuneChassisSeul: 'aucune (ch\u00e2ssis seul)',\r\n      cmImprimables: function(v){ return v + ' cm imprimables'; },\r\n      hauteurPlafondAxe: 'Hauteur du plafond',\r\n      hauteurImprAxe: 'Hauteur imprimable (cm)',\r\n      vsLabel: 'vs '\r\n    },\r\n    en: {\r\n      titre: 'Configure your Kiavik based on your ceiling height',\r\n      soustitre: 'From 0 to 4 m, in 10 cm increments, by combining modular extensions.',\r\n      labelPlafond: 'Enter the exact height of your ceiling (cm)',\r\n      calculer: 'Calculate',\r\n      plafondVisuel: 'CEILING',\r\n      sechageVisuel: 'DRYING 23cm',\r\n      margeVisuel: 'MARGIN 35cm',\r\n      configRecommandee: 'Recommended configuration',\r\n      hauteurMat: 'Mast height',\r\n      margeBasse: 'Fixed bottom margin',\r\n      zoneSechage: 'Lamp drying zone',\r\n      kiavikImpr: 'Kiavik \u2014 Printable height',\r\n      voirDetail: '\u2193 See calculation details',\r\n      toujours23: '\u2713 Always \u2264 23 cm from ceiling, whatever its height',\r\n      encart1: '<strong style=\"color:#3ddc6f;\">Reinforced frame and 6 standard extensions<\/strong> (100, 110, 50, 40, 30, 20 cm): Kiavik comes ready out of the box to adapt to any ceiling height \u2014 the most versatile machine on the market.',\r\n      encart2: '<strong style=\"color:#3ddc6f;\">Its secret:<\/strong> the print head can extend 10&nbsp;cm beyond the main mast to always reach the ceiling, whatever its exact height.',\r\n      specsTitre: 'Competitor machine specs',\r\n      specsSous: 'Data from manufacturers\\' commercial documentation \u2014 editable if needed.',\r\n      selectionnez: 'Select your current machine (original manufacturer)',\r\n      chargement: 'Loading machines\u2026',\r\n      ouChoisissez: 'Or choose another model',\r\n      autresModelesOpt: '\u2014 Other models \u2014',\r\n      enregistrePar: '(registered by a user)',\r\n      validerMachine: '\u2713 Validate my machine',\r\n      nomModele: 'Name \/ model of your machine',\r\n      nomModelePlaceholder: 'e.g.: Caldera WallJet 3200, machine with no visible brand, etc.',\r\n      chassisBase: 'Base frame height (cm)',\r\n      rallongesLabel: 'Extensions (cm, comma-separated)',\r\n      margeBasseLabel: 'Fixed bottom margin (cm)',\r\n      margeHauteLabel: 'Top margin \/ drying (cm)',\r\n      explication: 'The print head slides up to 10&nbsp;cm above the mast to always reach the ceiling, whatever its exact height. Within this total height, a fixed margin of 35&nbsp;cm at the bottom and 23&nbsp;cm of lamp drying at the top define the actual printable zone.',\r\n      statsTitre: 'Kiavik prints higher across (almost) the entire ceiling range',\r\n      statsSous: 'Useful printing height based on ceiling height, from 150 cm to 4 m.',\r\n      chartNote: 'A machine\\'s curve updates after validating its configuration above.',\r\n      transparence: '<strong style=\"color:#fff;\">Calculation transparency:<\/strong> calculated on the best possible configuration for each machine. Competitor data from manufacturers\\' commercial documentation, editable and validatable above.',\r\n      etapeCalcul: 'Calculation step',\r\n      legendeCoulisse: '* The head\\'s ability to extend beyond the mast (slide travel) varies by machine \u2014 this is what allows fine adjustment of the height under the ceiling.',\r\n      chassisSeul: 'Frame only',\r\n      autreSaisie: 'Other \/ manual entry',\r\n      valeurModifiable: 'Value editable according to your configuration',\r\n      modifieCliquez: 'Modified \u2014 click \"Validate my machine\" to update the comparison',\r\n      cliquezVoir: 'Click \"Validate my machine\" to see the comparison',\r\n      egalite: 'tied',\r\n      kiavikImprimeDePlus: function(diff){ return 'Kiavik prints ' + diff + ' cm more'; },\r\n      concurrentImprimeDePlus: function(nom, diff){ return nom + ' prints ' + diff + ' cm more'; },\r\n      kiavikImprimePourcent: function(pct){ return 'Kiavik Vertical Print: up to +' + pct + '% more printing height than the competition'; },\r\n      concurrentImprimePourcent: function(nom, pct){ return nom + ' prints ' + pct + '% more than Kiavik'; },\r\n      configEnregistree: '\u2713 Configuration saved, thank you!',\r\n      hauteurPlafondSaisie: 'Entered ceiling height',\r\n      chassisRallongesUtilise: 'Frame + extensions (mast) used',\r\n      depassementTete: 'Head extension beyond mast *',\r\n      hauteurImprReelle: '= Actual printable height',\r\n      kiavikRallongesUtilisees: function(nom, combo){ return '<strong style=\"color:#3ddc6f;\">Kiavik<\/strong> \u2014 extensions used: ' + combo; },\r\n      concurrentRallongesUtilisees: function(nom, combo){ return '<strong style=\"color:#e64646;\">' + nom + '<\/strong> \u2014 extensions used: ' + combo; },\r\n      aucuneChassisSeul: 'none (frame only)',\r\n      cmImprimables: function(v){ return v + ' cm printable'; },\r\n      hauteurPlafondAxe: 'Ceiling height',\r\n      hauteurImprAxe: 'Printable height (cm)',\r\n      vsLabel: 'vs '\r\n    }\r\n  };\r\n\r\n  function t(cle){\r\n    var val = TRADUCTIONS[LANGUE_ACTUELLE][cle];\r\n    return val !== undefined ? val : TRADUCTIONS.fr[cle];\r\n  }\r\n\r\n  \/\/ applique les traductions \u00e0 tous les \u00e9l\u00e9ments statiques identifi\u00e9s par id\r\n  function appliquerTraductionsStatiques(){\r\n    var map = {\r\n      'kiavik-t-titre': 'titre',\r\n      'kiavik-t-soustitre': 'soustitre',\r\n      'kiavik-t-label-plafond': 'labelPlafond',\r\n      'kiavik-calc-btn': 'calculer',\r\n      'kiavik-t-plafond-label': 'plafondVisuel',\r\n      'kiavik-t-sechage-visuel': 'sechageVisuel',\r\n      'kiavik-t-marge-visuel': 'margeVisuel',\r\n      'kiavik-t-config-recommandee': 'configRecommandee',\r\n      'kiavik-t-hauteur-mat': 'hauteurMat',\r\n      'kiavik-t-marge-basse': 'margeBasse',\r\n      'kiavik-t-zone-sechage': 'zoneSechage',\r\n      'kiavik-t-kiavik-impr': 'kiavikImpr',\r\n      'kiavik-jump-transparence': 'voirDetail',\r\n      'kiavik-t-toujours-23': 'toujours23',\r\n      'kiavik-t-encart1': 'encart1',\r\n      'kiavik-t-encart2': 'encart2',\r\n      'kiavik-t-specs-titre': 'specsTitre',\r\n      'kiavik-t-specs-sous': 'specsSous',\r\n      'kiavik-t-selectionnez': 'selectionnez',\r\n      'kiavik-t-chargement': 'chargement',\r\n      'kiavik-t-ou-choisissez': 'ouChoisissez',\r\n      'kiavik-t-autres-modeles-opt': 'autresModelesOpt',\r\n      'kiavik-t-enregistre-par': 'enregistrePar',\r\n      'kiavik-valider-btn': 'validerMachine',\r\n      'kiavik-t-nom-modele': 'nomModele',\r\n      'kiavik-t-chassis-base': 'chassisBase',\r\n      'kiavik-t-rallonges-label': 'rallongesLabel',\r\n      'kiavik-t-marge-basse-label': 'margeBasseLabel',\r\n      'kiavik-t-marge-haute-label': 'margeHauteLabel',\r\n      'kiavik-t-explication': 'explication',\r\n      'kiavik-t-stats-titre': 'statsTitre',\r\n      'kiavik-t-transparence': 'transparence',\r\n      'kiavik-t-etape-calcul': 'etapeCalcul',\r\n      'kiavik-t-legende-coulisse': 'legendeCoulisse'\r\n    };\r\n    Object.keys(map).forEach(function(id){\r\n      var el = document.getElementById(id);\r\n      if (el) el.innerHTML = t(map[id]);\r\n    });\r\n\r\n    \/\/ cas particuliers : statsSous a un <span> imbriqu\u00e9 (chart-note) \u00e0 pr\u00e9server\r\n    var statsSousEl = document.getElementById('kiavik-t-stats-sous');\r\n    if (statsSousEl){\r\n      var noteEl = document.getElementById('kiavik-chart-note');\r\n      var noteDisplay = noteEl ? noteEl.style.display : 'none';\r\n      statsSousEl.innerHTML = t('statsSous') + ' <span id=\"kiavik-chart-note\" style=\"display:' + noteDisplay + ';color:#777;\">' + t('chartNote') + '<\/span>';\r\n    }\r\n\r\n    \/\/ placeholder du champ nom libre\r\n    var nomLibreEl = document.getElementById('kiavik-conc-nom-libre');\r\n    if (nomLibreEl) nomLibreEl.placeholder = t('nomModelePlaceholder');\r\n  }\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ BLOC DE CONFIGURATION CENTRAL \u2014 toutes les valeurs modifiables sont ici.\r\n  \/\/ ===========================================================================\r\n  var CONFIG = {\r\n    webhookUrl: 'https:\/\/n8n.dtsconception.fr\/webhook\/a6c0cfde-2a15-4250-b0b2-3de05c342dcf', \/\/ laisser '' pour d\u00e9sactiver l'envoi\r\n    csvUrl: 'https:\/\/docs.google.com\/spreadsheets\/d\/1ufFXz9jlet-McuWR5g6JUF7rh-jfTGhbG4XORCVYJ4o\/export?format=csv', \/\/ Google Sheet publi\u00e9e en CSV\r\n\r\n    kiavik: {\r\n      base: 124,                          \/\/ hauteur du ch\u00e2ssis (cm)\r\n      rallonges: [100, 110, 20, 30, 40, 50], \/\/ rallonges de s\u00e9rie (cm)\r\n      coulisseTete: 10,                   \/\/ marge de coulisse de la t\u00eate au-dessus du m\u00e2t (cm)\r\n      margeBasse: 35,                     \/\/ marge fixe en bas (cm)\r\n      sechage: 23                         \/\/ zone de s\u00e9chage lampe en haut (cm)\r\n    },\r\n\r\n    \/\/ charg\u00e9 dynamiquement depuis la Google Sheet (CONFIG.csvUrl) au d\u00e9marrage de la page\r\n    concurrents: {},\r\n\r\n    plageGraphique: { min: 150, max: 400, pas: 10 } \/\/ plage utilis\u00e9e pour le graphique et les statistiques\r\n  };\r\n\r\n  \/\/ palette de couleurs assign\u00e9e automatiquement aux machines charg\u00e9es depuis la Sheet\r\n  var PALETTE_COULEURS = ['#e64646', '#e0a850', '#6fa8e0', '#a05ce6', '#e64690', '#46c9e6', '#a8e046', '#e6a846', '#9046e6', '#46e6a8'];\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ CHARGEMENT DYNAMIQUE DES MACHINES CONCURRENTES (Google Sheet en CSV)\r\n  \/\/ ===========================================================================\r\n\r\n  \/\/ parseur CSV simple, g\u00e8re les champs entre guillemets contenant des virgules (ex: \"100,110,20\")\r\n  function parserCSV(texte){\r\n    var lignes = texte.replace(\/\\r\\n\/g, '\\n').split('\\n').filter(function(l){ return l.trim().length > 0; });\r\n    return lignes.map(function(ligne){\r\n      var champs = [];\r\n      var champActuel = '';\r\n      var dansGuillemets = false;\r\n      for (var i = 0; i < ligne.length; i++){\r\n        var car = ligne[i];\r\n        if (car === '\"'){\r\n          dansGuillemets = !dansGuillemets;\r\n        } else if (car === ',' && !dansGuillemets){\r\n          champs.push(champActuel);\r\n          champActuel = '';\r\n        } else {\r\n          champActuel += car;\r\n        }\r\n      }\r\n      champs.push(champActuel);\r\n      return champs;\r\n    });\r\n  }\r\n\r\n  function chargerMachinesDepuisSheet(callback){\r\n    if (!CONFIG.csvUrl){ callback(); return; }\r\n    fetch(CONFIG.csvUrl)\r\n      .then(function(res){ return res.text(); })\r\n      .then(function(texte){\r\n        var lignes = parserCSV(texte);\r\n        var entetes = lignes[0].map(function(h){ return h.trim().toLowerCase(); });\r\n        var idx = {\r\n          cle: entetes.indexOf('cle'),\r\n          label: entetes.indexOf('label'),\r\n          base: entetes.indexOf('base'),\r\n          rallonges: entetes.indexOf('rallonges'),\r\n          coulisse: entetes.indexOf('coulisse_tete'),\r\n          marge: entetes.indexOf('marge_basse'),\r\n          sechage: entetes.indexOf('sechage'),\r\n          image: entetes.indexOf('image_url')\r\n        };\r\n\r\n        for (var i = 1; i < lignes.length; i++){\r\n          var l = lignes[i];\r\n          if (!l[idx.cle]) continue;\r\n          var cle = l[idx.cle].trim();\r\n          CONFIG.concurrents[cle] = {\r\n            label: (l[idx.label] || cle).trim(),\r\n            base: parseFloat(l[idx.base]) || 0,\r\n            rallonges: (l[idx.rallonges] || '').split(',').map(function(s){ return parseFloat(s.trim()); }).filter(function(n){ return !isNaN(n) && n > 0; }),\r\n            coulisseTete: parseFloat(l[idx.coulisse]) || 0,\r\n            margeBasse: parseFloat(l[idx.marge]) || 0,\r\n            sechage: parseFloat(l[idx.sechage]) || 0,\r\n            image: (l[idx.image] || '').trim(),\r\n            couleur: PALETTE_COULEURS[(i-1) % PALETTE_COULEURS.length],\r\n            ordre: i - 1\r\n          };\r\n        }\r\n        callback();\r\n      })\r\n      .catch(function(err){\r\n        console.error('Kiavik - erreur chargement Sheet machines concurrentes:', err);\r\n        callback(); \/\/ on continue quand m\u00eame, avec une liste vide\r\n      });\r\n  }\r\n\r\n  var comparatifActif = true; \/\/ le bloc concurrent est toujours visible d\u00e9sormais, plus de toggle\r\n  var dejaValide = false;\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ CALCULS G\u00c9N\u00c9RIQUES \u2014 utilis\u00e9s \u00e0 la fois par Kiavik et par les concurrents.\r\n  \/\/ ===========================================================================\r\n\r\n  \/\/ toutes les hauteurs de m\u00e2t atteignables avec un jeu de rallonges donn\u00e9\r\n  function hauteursAtteignables(base, rallonges){\r\n    var totaux = {};\r\n    var n = rallonges.length;\r\n    for (var mask = 0; mask < (1 << n); mask++){\r\n      var somme = 0, combo = [];\r\n      for (var i = 0; i < n; i++){\r\n        if (mask & (1 << i)){ somme += rallonges[i]; combo.push(rallonges[i]); }\r\n      }\r\n      var total = base + somme;\r\n      if (!totaux[total] || combo.length < totaux[total].combo.length){\r\n        totaux[total] = { total: total, combo: combo };\r\n      }\r\n    }\r\n    return Object.keys(totaux).map(function(k){ return totaux[k]; }).sort(function(a,b){ return a.total - b.total; });\r\n  }\r\n\r\n  \/\/ plus grand m\u00e2t atteignable tel que (plafond - m\u00e2t) <= coulisseTete (la t\u00eate comble l'\u00e9cart r\u00e9siduel)\r\n  function meilleurMatPourPlafond(hauteurs, plafond, coulisseTete){\r\n    var meilleur = hauteurs[0];\r\n    for (var i = 0; i < hauteurs.length; i++){\r\n      if (hauteurs[i].total <= plafond) meilleur = hauteurs[i];\r\n      else break;\r\n    }\r\n    return meilleur;\r\n  }\r\n\r\n  \/\/ hauteur d'impression utile pour Kiavik \u00e0 un plafond donn\u00e9\r\n  var HAUTEURS_KIAVIK = hauteursAtteignables(CONFIG.kiavik.base, CONFIG.kiavik.rallonges);\r\n  function imprKiavik(plafond){\r\n    return Math.max(0, plafond - CONFIG.kiavik.sechage - CONFIG.kiavik.margeBasse);\r\n  }\r\n  function matKiavik(plafond){\r\n    return meilleurMatPourPlafond(HAUTEURS_KIAVIK, plafond, CONFIG.kiavik.coulisseTete);\r\n  }\r\n\r\n  \/\/ hauteur d'impression utile pour une machine g\u00e9n\u00e9rique (concurrent), tenant compte de SA coulisse t\u00eate\r\n  function imprConcurrent(base, rallonges, coulisseTete, margeBasse, sechage, plafond){\r\n    var hauteurs = hauteursAtteignables(base, rallonges).map(function(h){ return h.total; });\r\n    var matMax = plafond - 0; \/\/ le m\u00e2t peut aller jusqu'au plafond moins ce que la coulisse comble\r\n    var meilleur = base;\r\n    for (var i = 0; i < hauteurs.length; i++){\r\n      \/\/ la coulisse comble jusqu'\u00e0 coulisseTete cm : m\u00e2t valide si (plafond - m\u00e2t) <= coulisseTete\r\n      if (plafond - hauteurs[i] >= 0 && plafond - hauteurs[i] <= coulisseTete) meilleur = Math.max(meilleur, hauteurs[i]);\r\n      else if (hauteurs[i] <= plafond) meilleur = Math.max(meilleur, hauteurs[i]);\r\n    }\r\n    return Math.max(0, meilleur - margeBasse - sechage);\r\n  }\r\n\r\n  \/\/ m\u00e2t retenu pour une machine g\u00e9n\u00e9rique (concurrent), m\u00eame logique que imprConcurrent mais renvoie le m\u00e2t brut\r\n  function matConcurrent(base, rallonges, coulisseTete, plafond){\r\n    var hauteurs = hauteursAtteignables(base, rallonges).map(function(h){ return h.total; });\r\n    var meilleur = base;\r\n    for (var i = 0; i < hauteurs.length; i++){\r\n      if (plafond - hauteurs[i] >= 0 && plafond - hauteurs[i] <= coulisseTete) meilleur = Math.max(meilleur, hauteurs[i]);\r\n      else if (hauteurs[i] <= plafond) meilleur = Math.max(meilleur, hauteurs[i]);\r\n    }\r\n    return meilleur;\r\n  }\r\n\r\n  \/\/ renvoie le combo de rallonges (liste de cm) correspondant au m\u00e2t retenu pour le concurrent\r\n  function comboConcurrent(base, rallonges, matRetenu){\r\n    var hauteurs = hauteursAtteignables(base, rallonges);\r\n    for (var i = 0; i < hauteurs.length; i++){\r\n      if (hauteurs[i].total === matRetenu) return hauteurs[i].combo;\r\n    }\r\n    return [];\r\n  }\r\n\r\n  function imprConcurrentParCle(cle, plafond){\r\n    var c = CONFIG.concurrents[cle];\r\n    return imprConcurrent(c.base, c.rallonges, c.coulisseTete, c.margeBasse, c.sechage, plafond);\r\n  }\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ R\u00c9F\u00c9RENCES DOM \u2014 configurateur principal\r\n  \/\/ ===========================================================================\r\n  var slider = document.getElementById('kiavik-hauteur');\r\n  var numInput = document.getElementById('kiavik-hauteur-input');\r\n  var calcBtn = document.getElementById('kiavik-calc-btn');\r\n  var murEl = document.getElementById('kiavik-mur');\r\n  var zoneImprEl = document.getElementById('kiavik-zone-impr');\r\n  var zoneImprLabelEl = document.getElementById('kiavik-zone-impr-label');\r\n  var bandeSechageEl = document.getElementById('kiavik-bande-sechage');\r\n  var bandeMargeEl = document.getElementById('kiavik-bande-marge');\r\n  var comboEl = document.getElementById('kiavik-combo');\r\n  var matHEl = document.getElementById('kiavik-mat-h');\r\n  var imprHEl = document.getElementById('kiavik-impr-h');\r\n  var diffSousCurseurEl = document.getElementById('kiavik-diff-sous-curseur');\r\n\r\n  var PX_PAR_CM = 0.85; \/\/ \u00e9chelle visuelle : 1cm de plafond = 0.85px\r\n\r\n  function update(source){\r\n    var plafond = parseInt((source === 'num' ? numInput.value : slider.value), 10);\r\n    if (isNaN(plafond)) return;\r\n    if (plafond < CONFIG.kiavik.base) plafond = CONFIG.kiavik.base;\r\n    if (plafond > 400) plafond = 400;\r\n\r\n    numInput.value = plafond;\r\n    slider.value = plafond;\r\n\r\n    var res = matKiavik(plafond);\r\n    var hauteurImpressionUtile = imprKiavik(plafond);\r\n\r\n    if (res.combo.length === 0){\r\n      comboEl.textContent = t('chassisSeul') + ' (' + CONFIG.kiavik.base + ' cm)';\r\n    } else {\r\n      var counts = {};\r\n      res.combo.forEach(function(v){ counts[v] = (counts[v]||0)+1; });\r\n      var parts = [(LANGUE_ACTUELLE === 'en' ? 'Frame ' : 'Ch\u00e2ssis ') + CONFIG.kiavik.base + ' cm'];\r\n      Object.keys(counts).sort(function(a,b){return b-a;}).forEach(function(k){\r\n        var n = counts[k];\r\n        parts.push((n>1? n+' x ':'') + '+' + k + ' cm');\r\n      });\r\n      comboEl.textContent = parts.join('  \u00b7  ');\r\n    }\r\n\r\n    matHEl.textContent = res.total + ' cm';\r\n    imprHEl.textContent = Math.max(0, hauteurImpressionUtile) + ' cm';\r\n\r\n    var murPx = plafond * PX_PAR_CM;\r\n    murEl.style.height = murPx + 'px';\r\n\r\n    var margeBassePx = CONFIG.kiavik.margeBasse * PX_PAR_CM;\r\n    var sechagePx = CONFIG.kiavik.sechage * PX_PAR_CM;\r\n    var zoneImprPx = Math.max(0, murPx - margeBassePx - sechagePx);\r\n\r\n    zoneImprEl.style.bottom = margeBassePx + 'px';\r\n    zoneImprEl.style.height = zoneImprPx + 'px';\r\n    zoneImprLabelEl.textContent = 'KIAVIK\\n' + Math.max(0, hauteurImpressionUtile) + ' cm\\nimprimables';\r\n\r\n    \/\/ ajustement purement visuel : la bande affich\u00e9e est raccourcie de 4cm pour \u00e9viter\r\n    \/\/ qu'elle ne semble d\u00e9passer le sommet du mur \u00e0 l'\u00e9cran (le calcul r\u00e9el n'est pas modifi\u00e9)\r\n    var sechagePxVisuel = Math.max(0, sechagePx - (4 * PX_PAR_CM));\r\n    bandeSechageEl.style.bottom = (margeBassePx + zoneImprPx) + 'px';\r\n    bandeSechageEl.style.height = sechagePxVisuel + 'px';\r\n\r\n    bandeMargeEl.style.height = margeBassePx + 'px';\r\n\r\n    if (comparatifActif && dejaValide){\r\n      calculerEtAfficherComparatif();\r\n    }\r\n  }\r\n\r\n  slider.addEventListener('input', function(){ update('slider'); });\r\n  numInput.addEventListener('input', function(){ update('num'); });\r\n  calcBtn.addEventListener('click', function(){ update('num'); });\r\n  numInput.addEventListener('keydown', function(e){ if (e.key === 'Enter') update('num'); });\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ COMPARATIF CONCURRENT\r\n  \/\/ ===========================================================================\r\n  var formComp = document.getElementById('kiavik-form-comparatif');\r\n  var resultatEl = document.getElementById('kiavik-conc-resultat');\r\n  var concBaseInput = document.getElementById('kiavik-conc-base');\r\n  var concRallongesInput = document.getElementById('kiavik-conc-rallonges');\r\n  var concMargeInput = document.getElementById('kiavik-conc-marge');\r\n  var concSechageInput = document.getElementById('kiavik-conc-sechage');\r\n\r\n  var zoneImprConcEl = document.getElementById('kiavik-zone-impr-conc');\r\n  var bandeSechageConcEl = document.getElementById('kiavik-bande-sechage-conc');\r\n  var bandeMargeConcEl = document.getElementById('kiavik-bande-marge-conc');\r\n  var marqueGridEl = document.getElementById('kiavik-marque-grid');\r\n  var autresModelesWrapEl = document.getElementById('kiavik-autres-modeles-wrap');\r\n  var autresModelesSelect = document.getElementById('kiavik-autres-modeles');\r\n  var marqueHiddenInput = document.getElementById('kiavik-conc-marque');\r\n  var nomLibreInput = document.getElementById('kiavik-conc-nom-libre');\r\n  var nomLibreWrapEl = document.getElementById('kiavik-nom-libre-wrap');\r\n  var ligneConcurrentEl = document.getElementById('kiavik-ligne-concurrent');\r\n  var jumpTransparenceEl = document.getElementById('kiavik-jump-transparence');\r\n  var nomConcurrentEl = document.getElementById('kiavik-nom-concurrent');\r\n  var imprConcHEl = document.getElementById('kiavik-impr-conc-h');\r\n  var validerBtn = document.getElementById('kiavik-valider-btn');\r\n  var validerConfirmEl = document.getElementById('kiavik-valider-confirm');\r\n\r\n  \/\/ construit le tableau d\u00e9taillant, \u00e9tape par \u00e9tape, le calcul pour Kiavik et la machine concurrente active\r\n  function dessinerTableauTransparence(plafond, concBase, concRallonges, concCoulisse, concMarge, concSechage, nomMarque, pourcentage, diffTxt){\r\n    var tbody = document.getElementById('kiavik-transparence-body');\r\n    var thConc = document.getElementById('kiavik-transp-th-conc');\r\n    var resumeEl = document.getElementById('kiavik-transp-resume');\r\n    if (!tbody) return;\r\n\r\n    thConc.textContent = nomMarque;\r\n\r\n    var matK = matKiavik(plafond);\r\n    var matKTotal = matK.total;\r\n    var ecartKiavikBrut = Math.max(0, plafond - matKTotal);\r\n    var coulisseKiavikUtilisee = Math.min(ecartKiavikBrut, CONFIG.kiavik.coulisseTete);\r\n    var videKiavik = Math.max(0, ecartKiavikBrut - CONFIG.kiavik.coulisseTete);\r\n    var imprK = imprKiavik(plafond);\r\n\r\n    var matC = matConcurrent(concBase, concRallonges, concCoulisse, plafond);\r\n    var ecartConcBrut = Math.max(0, plafond - matC);\r\n    var coulisseConcUtilisee = Math.min(ecartConcBrut, concCoulisse);\r\n    var videConc = Math.max(0, ecartConcBrut - concCoulisse);\r\n    var imprC = imprConcurrent(concBase, concRallonges, concCoulisse, concMarge, concSechage, plafond);\r\n\r\n    function ligne(label, valK, valC){\r\n      return '<tr style=\"border-bottom:1px solid #222;\">' +\r\n        '<td style=\"padding:6px 8px;color:#999;\">' + label + '<\/td>' +\r\n        '<td style=\"text-align:right;padding:6px 8px;color:#3ddc6f;font-weight:600;\">' + valK + '<\/td>' +\r\n        '<td style=\"text-align:right;padding:6px 8px;color:#e64646;font-weight:600;\">' + valC + '<\/td>' +\r\n        '<\/tr>';\r\n    }\r\n\r\n    var html = '';\r\n    html += ligne(t('hauteurPlafondSaisie'), plafond + ' cm', plafond + ' cm');\r\n    html += ligne(t('chassisRallongesUtilise'), matKTotal + ' cm', matC + ' cm');\r\n    html += ligne(t('depassementTete'), coulisseKiavikUtilisee + ' cm (max ' + CONFIG.kiavik.coulisseTete + ')', coulisseConcUtilisee + ' cm (max ' + concCoulisse + ')');\r\n    html += ligne('\u2212 ' + t('margeBasse'), '\u2212' + CONFIG.kiavik.margeBasse + ' cm', '\u2212' + concMarge + ' cm');\r\n    html += ligne('\u2212 ' + t('zoneSechage'), '\u2212' + CONFIG.kiavik.sechage + ' cm', '\u2212' + concSechage + ' cm');\r\n    html += '<tr style=\"border-top:2px solid #444;\">' +\r\n      '<td style=\"padding:8px 8px;color:#fff;font-weight:700;\">' + t('hauteurImprReelle') + '<\/td>' +\r\n      '<td style=\"text-align:right;padding:8px 8px;color:#3ddc6f;font-weight:800;\">' + imprK + ' cm<\/td>' +\r\n      '<td style=\"text-align:right;padding:8px 8px;color:#e64646;font-weight:800;\">' + imprC + ' cm<\/td>' +\r\n      '<\/tr>';\r\n\r\n    tbody.innerHTML = html;\r\n\r\n    \/\/ r\u00e9sum\u00e9 synth\u00e9tique sous le tableau : rallonges utilis\u00e9es + \u00e9cart en %\r\n    if (resumeEl){\r\n      var combolKTxt = matK.combo.length ? matK.combo.join(' + ') + ' cm' : t('aucuneChassisSeul');\r\n      var comboCArr = comboConcurrent(concBase, concRallonges, matC);\r\n      var comboCTxt = comboCArr.length ? comboCArr.join(' + ') + ' cm' : t('aucuneChassisSeul');\r\n\r\n      var pourcentageTxt = pourcentage !== null ? (Math.abs(pourcentage) + '%') : '\u2014';\r\n      var pourcentageCouleur = (typeof pourcentage === 'number' && pourcentage < 0) ? '#e64646' : '#3ddc6f';\r\n\r\n      resumeEl.innerHTML =\r\n        '<div style=\"display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;font-size:12.5px;color:#bbb;margin-bottom:10px;\">' +\r\n          '<span>' + t('kiavikRallongesUtilisees')(null, combolKTxt) + '<\/span>' +\r\n          '<span>' + t('concurrentRallongesUtilisees')(nomMarque, comboCTxt) + '<\/span>' +\r\n        '<\/div>' +\r\n        '<div style=\"text-align:center;font-size:20px;font-weight:900;color:' + pourcentageCouleur + ';\">' + diffTxt + '<\/div>';\r\n    }\r\n  }\r\n\r\n  function calculerEtAfficherComparatif(){\r\n    dejaValide = true;\r\n    var plafond = parseInt(numInput.value, 10) || 245;\r\n    var concBase = parseFloat(concBaseInput.value) || 0;\r\n    var concRallonges = concRallongesInput.value.split(',').map(function(s){ return parseFloat(s.trim()); }).filter(function(n){ return !isNaN(n) && n > 0; });\r\n    var concMarge = parseFloat(concMargeInput.value) || 0;\r\n    var concSechage = parseFloat(concSechageInput.value) || 0;\r\n    \/\/ coulisse t\u00eate du concurrent s\u00e9lectionn\u00e9 si connue, sinon valeur par d\u00e9faut prudente de 8cm\r\n    var concCoulisse = (marqueHiddenInput.value && CONFIG.concurrents[marqueHiddenInput.value]) ? CONFIG.concurrents[marqueHiddenInput.value].coulisseTete : 8;\r\n\r\n    var imprConc = imprConcurrent(concBase, concRallonges, concCoulisse, concMarge, concSechage, plafond);\r\n    var imprKiavikVal = imprKiavik(plafond);\r\n\r\n    var nomMarque = (marqueHiddenInput.value && CONFIG.concurrents[marqueHiddenInput.value]) ? CONFIG.concurrents[marqueHiddenInput.value].label : (nomLibreInput.value.trim() || 'Concurrent');\r\n\r\n    var diff = imprKiavikVal - imprConc;\r\n    var pourcentage = imprConc > 0 ? Math.round((diff \/ imprConc) * 100) : null;\r\n    var diffTxt;\r\n    if (diff === 0){\r\n      diffTxt = t('egalite');\r\n    } else if (pourcentage === null){\r\n      diffTxt = diff > 0 ? t('kiavikImprimeDePlus')(diff) : t('concurrentImprimeDePlus')(nomMarque, Math.abs(diff));\r\n    } else if (diff > 0){\r\n      diffTxt = t('kiavikImprimePourcent')(pourcentage);\r\n    } else {\r\n      diffTxt = t('concurrentImprimePourcent')(nomMarque, Math.abs(pourcentage));\r\n    }\r\n\r\n    diffSousCurseurEl.style.display = 'block';\r\n    diffSousCurseurEl.style.color = diff >= 0 ? '#3ddc6f' : '#e64646';\r\n    diffSousCurseurEl.textContent = diffTxt;\r\n\r\n    ligneConcurrentEl.style.display = 'flex';\r\n    nomConcurrentEl.textContent = nomMarque + ' \u2014 Hauteur imprimable';\r\n    imprConcHEl.textContent = imprConc + ' cm';\r\n    jumpTransparenceEl.style.display = 'block';\r\n\r\n    resultatEl.innerHTML = '';\r\n\r\n    var murPx = parseFloat(murEl.style.height) || 0;\r\n    var margeConcPx = concMarge * PX_PAR_CM;\r\n    var sechageConcPx = concSechage * PX_PAR_CM;\r\n    var imprConcPx = Math.max(0, imprConc * PX_PAR_CM);\r\n\r\n    zoneImprConcEl.style.display = 'flex';\r\n    bandeSechageConcEl.style.display = 'flex';\r\n    bandeMargeConcEl.style.display = 'flex';\r\n\r\n    bandeMargeConcEl.style.height = margeConcPx + 'px';\r\n    zoneImprConcEl.style.bottom = margeConcPx + 'px';\r\n    zoneImprConcEl.style.height = imprConcPx + 'px';\r\n    document.getElementById('kiavik-zone-impr-conc-label').textContent = nomMarque.toUpperCase() + '\\n' + imprConc + ' cm\\nimprimables';\r\n    bandeSechageConcEl.style.bottom = (margeConcPx + imprConcPx) + 'px';\r\n    bandeSechageConcEl.style.height = Math.max(0, sechageConcPx - (4 * PX_PAR_CM)) + 'px';\r\n\r\n    dessinerTableauTransparence(plafond, concBase, concRallonges, concCoulisse, concMarge, concSechage, nomMarque, pourcentage, diffTxt);\r\n  }\r\n\r\n  function activerComparatif(){\r\n    if (comparatifActif) return;\r\n    comparatifActif = true;\r\n    formComp.style.display = 'block';\r\n    murEl.style.width = '260px';\r\n    resultatEl.innerHTML = '<span style=\"color:#888;\">' + t('valeurModifiable') + '<\/span>';\r\n  }\r\n\r\n  function desactiverComparatif(){\r\n    comparatifActif = false;\r\n    dejaValide = false;\r\n    formComp.style.display = 'none';\r\n    murEl.style.width = '180px';\r\n    zoneImprConcEl.style.display = 'none';\r\n    bandeSechageConcEl.style.display = 'none';\r\n    bandeMargeConcEl.style.display = 'none';\r\n    resultatEl.innerHTML = '';\r\n    diffSousCurseurEl.style.display = 'none';\r\n    ligneConcurrentEl.style.display = 'none';\r\n    validerConfirmEl.style.display = 'none';\r\n    jumpTransparenceEl.style.display = 'none';\r\n  }\r\n\r\n  function invaliderResultat(message){\r\n    dejaValide = false;\r\n    resultatEl.innerHTML = '<span style=\"color:#e64646;font-weight:600;\">' + message + '<\/span>';\r\n    zoneImprConcEl.style.display = 'none';\r\n    bandeSechageConcEl.style.display = 'none';\r\n    bandeMargeConcEl.style.display = 'none';\r\n    ligneConcurrentEl.style.display = 'none';\r\n    diffSousCurseurEl.style.display = 'none';\r\n    validerConfirmEl.style.display = 'none';\r\n    jumpTransparenceEl.style.display = 'none';\r\n  }\r\n\r\n  [concBaseInput, concRallongesInput, concMargeInput, concSechageInput, nomLibreInput].forEach(function(input){\r\n    input.addEventListener('input', function(){\r\n      invaliderResultat(t('modifieCliquez'));\r\n    });\r\n  });\r\n\r\n  \/\/ applique la s\u00e9lection d'une machine (cl\u00e9 de CONFIG.concurrents) aux champs du formulaire\r\n  function selectionnerMachine(cle){\r\n    marqueHiddenInput.value = cle;\r\n    if (cle && CONFIG.concurrents[cle]){\r\n      var m = CONFIG.concurrents[cle];\r\n      concBaseInput.value = m.base;\r\n      concRallongesInput.value = m.rallonges.join(',');\r\n      concMargeInput.value = m.margeBasse;\r\n      concSechageInput.value = m.sechage;\r\n      nomLibreWrapEl.style.display = 'none';\r\n    } else {\r\n      \/\/ saisie manuelle : le nom libre devient pertinent (sert \u00e0 identifier une machine pas encore r\u00e9pertori\u00e9e)\r\n      nomLibreWrapEl.style.display = 'flex';\r\n    }\r\n    invaliderResultat(t('cliquezVoir'));\r\n  }\r\n\r\n  \/\/ construit les vignettes (5 premi\u00e8res machines de la Sheet, par ordre d'apparition) + le s\u00e9lecteur pour le reste\r\n  function genererVignettesEtSelecteur(){\r\n    var cles = Object.keys(CONFIG.concurrents).sort(function(a,b){\r\n      return CONFIG.concurrents[a].ordre - CONFIG.concurrents[b].ordre;\r\n    });\r\n\r\n    var clesVignettes = cles.slice(0, 4);\r\n    var clesSelecteur = cles.slice(4);\r\n\r\n    marqueGridEl.innerHTML = '';\r\n\r\n    clesVignettes.forEach(function(cle){\r\n      var m = CONFIG.concurrents[cle];\r\n      var card = document.createElement('div');\r\n      card.className = 'kiavik-marque-card';\r\n      card.setAttribute('data-marque', cle);\r\n      card.style.cssText = 'cursor:pointer;border:2px solid #444;border-radius:8px;padding:8px;width:100px;text-align:center;background:#111;';\r\n      card.innerHTML =\r\n        (m.image ? '<img decoding=\"async\" src=\"' + m.image + '\" style=\"width:100%;height:70px;object-fit:contain;border-radius:4px;background:#fff;\">' : '<div style=\"height:70px;display:flex;align-items:center;justify-content:center;color:#666;font-size:24px;\">?<\/div>') +\r\n        '<div style=\"font-size:11px;color:#ddd;font-weight:600;margin-top:6px;\">' + m.label + '<\/div>';\r\n      card.addEventListener('click', function(){\r\n        document.querySelectorAll('.kiavik-marque-card').forEach(function(c){ c.style.borderColor = '#444'; });\r\n        card.style.borderColor = '#e64646';\r\n        if (autresModelesSelect) autresModelesSelect.value = '';\r\n        selectionnerMachine(cle);\r\n      });\r\n      marqueGridEl.appendChild(card);\r\n    });\r\n\r\n    \/\/ carte \"Autre \/ saisie manuelle\" toujours pr\u00e9sente en dernier\r\n    var autreCard = document.createElement('div');\r\n    autreCard.className = 'kiavik-marque-card';\r\n    autreCard.setAttribute('data-marque', '');\r\n    autreCard.style.cssText = 'cursor:pointer;border:2px solid #444;border-radius:8px;padding:8px;width:100px;text-align:center;background:#111;display:flex;flex-direction:column;align-items:center;justify-content:center;';\r\n    autreCard.innerHTML = '<div style=\"font-size:24px;color:#666;\">\u270e<\/div><div style=\"font-size:11px;color:#ddd;font-weight:600;margin-top:6px;\">' + t('autreSaisie') + '<\/div>';\r\n    autreCard.addEventListener('click', function(){\r\n      document.querySelectorAll('.kiavik-marque-card').forEach(function(c){ c.style.borderColor = '#444'; });\r\n      autreCard.style.borderColor = '#e64646';\r\n      if (autresModelesSelect) autresModelesSelect.value = '';\r\n      selectionnerMachine('');\r\n    });\r\n    marqueGridEl.appendChild(autreCard);\r\n\r\n    \/\/ s\u00e9lecteur pour les machines au-del\u00e0 des 5 premi\u00e8res (juste le label, pour en ajouter facilement au fil du temps)\r\n    if (clesSelecteur.length > 0){\r\n      autresModelesWrapEl.style.display = 'flex';\r\n      autresModelesSelect.innerHTML = '<option value=\"\">\u2014 Autres mod\u00e8les \u2014<\/option>';\r\n      clesSelecteur.forEach(function(cle){\r\n        var opt = document.createElement('option');\r\n        opt.value = cle;\r\n        opt.textContent = CONFIG.concurrents[cle].label;\r\n        autresModelesSelect.appendChild(opt);\r\n      });\r\n      autresModelesSelect.addEventListener('change', function(){\r\n        if (!autresModelesSelect.value) return;\r\n        document.querySelectorAll('.kiavik-marque-card').forEach(function(c){ c.style.borderColor = '#444'; });\r\n        selectionnerMachine(autresModelesSelect.value);\r\n      });\r\n    } else {\r\n      autresModelesWrapEl.style.display = 'none';\r\n    }\r\n  }\r\n\r\n  validerBtn.addEventListener('click', function(){\r\n    calculerEtAfficherComparatif();\r\n    mettreAJourCourbeApresValidation();\r\n\r\n    var plafond = parseInt(numInput.value, 10) || 0;\r\n    var res = matKiavik(plafond);\r\n    var payload = {\r\n      timestamp: new Date().toISOString(),\r\n      plafond_cm: plafond,\r\n      kiavik: {\r\n        mat_cm: res.total,\r\n        combo: res.combo,\r\n        hauteur_impression_utile_cm: imprKiavik(plafond)\r\n      },\r\n      concurrent: comparatifActif ? {\r\n        nom_modele_saisi: nomLibreInput.value.trim() || null,\r\n        fabricant_oem_selectionne: (marqueHiddenInput.value && CONFIG.concurrents[marqueHiddenInput.value]) ? CONFIG.concurrents[marqueHiddenInput.value].label : 'non s\u00e9lectionn\u00e9 (saisie manuelle)',\r\n        base_cm: parseFloat(concBaseInput.value) || null,\r\n        rallonges_cm: concRallongesInput.value,\r\n        marge_basse_cm: parseFloat(concMargeInput.value) || null,\r\n        sechage_cm: parseFloat(concSechageInput.value) || null\r\n      } : null\r\n    };\r\n\r\n    if (CONFIG.webhookUrl){\r\n      fetch(CONFIG.webhookUrl, {\r\n        method: 'POST',\r\n        headers: {'Content-Type': 'application\/json'},\r\n        body: JSON.stringify(payload)\r\n      }).catch(function(err){ console.error('Webhook Kiavik:', err); });\r\n    } else {\r\n      console.log('Kiavik - payload (webhook non configur\u00e9):', payload);\r\n    }\r\n\r\n    validerConfirmEl.style.display = 'block';\r\n    validerConfirmEl.textContent = t('configEnregistree');\r\n  });\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ GRAPHIQUE : une courbe par machine charg\u00e9e depuis la Sheet, mises \u00e0 jour\r\n  \/\/ individuellement \u00e0 la validation de la machine concern\u00e9e.\r\n  \/\/ ===========================================================================\r\n  var chartNoteEl = document.getElementById('kiavik-chart-note');\r\n  var statBadgeWrapEl = document.getElementById('kiavik-stat-badge-wrap');\r\n  var chartInstance = null;\r\n  var CONFIGS_GRAPHIQUE = {}; \/\/ copies mutables, construites apr\u00e8s le chargement de la Sheet\r\n\r\n  function pourcentageVs(cle){\r\n    var c = CONFIGS_GRAPHIQUE[cle];\r\n    var total = 0, ok = 0;\r\n    var plage = CONFIG.plageGraphique;\r\n    for (var p = plage.min; p <= plage.max; p += plage.pas){\r\n      total++;\r\n      var k = imprKiavik(p);\r\n      var v = imprConcurrent(c.base, c.rallonges, c.coulisseTete, c.margeBasse, c.sechage, p);\r\n      if (k >= v) ok++;\r\n    }\r\n    return Math.round((ok\/total)*1000)\/10;\r\n  }\r\n\r\n  function dessinerBadges(){\r\n    statBadgeWrapEl.innerHTML = '';\r\n    Object.keys(CONFIGS_GRAPHIQUE).sort(function(a,b){ return CONFIGS_GRAPHIQUE[a].ordre - CONFIGS_GRAPHIQUE[b].ordre; }).forEach(function(cle){\r\n      var badge = document.createElement('div');\r\n      badge.style.cssText = 'background:#161616;border:1px solid #3ddc6f;border-radius:8px;padding:8px 10px;text-align:center;';\r\n      badge.innerHTML = '<div style=\"font-size:16px;font-weight:800;color:#3ddc6f;\">' + pourcentageVs(cle) + '%<\/div>' +\r\n        '<div style=\"font-size:10px;color:#999;\">' + t('vsLabel') + CONFIGS_GRAPHIQUE[cle].label + '<\/div>';\r\n      statBadgeWrapEl.appendChild(badge);\r\n    });\r\n  }\r\n\r\n  function dessinerGraphique(){\r\n    var plage = CONFIG.plageGraphique;\r\n    var labels = [];\r\n    for (var p = plage.min; p <= plage.max; p += plage.pas){\r\n      labels.push(p + ' cm');\r\n    }\r\n\r\n    var dataKiavik = [];\r\n    for (var p2 = plage.min; p2 <= plage.max; p2 += plage.pas){\r\n      dataKiavik.push(imprKiavik(p2));\r\n    }\r\n\r\n    var datasets = [\r\n      { label: 'Kiavik', data: dataKiavik, borderColor: '#3ddc6f', backgroundColor: 'rgba(61,220,111,.12)', borderWidth: 3, pointRadius: 0, tension: 0.15, fill: true }\r\n    ];\r\n\r\n    Object.keys(CONFIGS_GRAPHIQUE).sort(function(a,b){ return CONFIGS_GRAPHIQUE[a].ordre - CONFIGS_GRAPHIQUE[b].ordre; }).forEach(function(cle){\r\n      var c = CONFIGS_GRAPHIQUE[cle];\r\n      var data = [];\r\n      for (var p3 = plage.min; p3 <= plage.max; p3 += plage.pas){\r\n        data.push(imprConcurrent(c.base, c.rallonges, c.coulisseTete, c.margeBasse, c.sechage, p3));\r\n      }\r\n      datasets.push({ label: c.label, data: data, borderColor: c.couleur, borderWidth: 2, pointRadius: 0, borderDash: [5,4], tension: 0.15 });\r\n    });\r\n\r\n    dessinerBadges();\r\n\r\n    var ctx = document.getElementById('kiavik-chart-canvas').getContext('2d');\r\n    if (chartInstance) chartInstance.destroy();\r\n    chartInstance = new Chart(ctx, {\r\n      type: 'line',\r\n      data: { labels: labels, datasets: datasets },\r\n      options: {\r\n        responsive: true,\r\n        maintainAspectRatio: false,\r\n        interaction: { mode: 'index', intersect: false },\r\n        plugins: {\r\n          legend: { labels: { color: '#ccc', font: { size: 12 } } },\r\n          tooltip: { callbacks: { label: function(ctx){ return ctx.dataset.label + ' : ' + t('cmImprimables')(ctx.parsed.y); } } }\r\n        },\r\n        scales: {\r\n          x: { ticks: { color: '#888', maxRotation: 0, autoSkip: true }, grid: { color: '#222' }, title: { display: true, text: t('hauteurPlafondAxe'), color: '#999' } },\r\n          y: { ticks: { color: '#888' }, grid: { color: '#222' }, title: { display: true, text: t('hauteurImprAxe'), color: '#999' } }\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ au clic Valider : si une machine connue (issue de la Sheet) est s\u00e9lectionn\u00e9e, on met \u00e0 jour SA courbe\r\n  \/\/ avec les valeurs temporaires actuellement saisies (les autres restent inchang\u00e9es)\r\n  function mettreAJourCourbeApresValidation(){\r\n    var key = marqueHiddenInput.value;\r\n    if (key && CONFIGS_GRAPHIQUE[key]){\r\n      CONFIGS_GRAPHIQUE[key].base = parseFloat(concBaseInput.value) || CONFIGS_GRAPHIQUE[key].base;\r\n      CONFIGS_GRAPHIQUE[key].rallonges = concRallongesInput.value.split(',').map(function(s){ return parseFloat(s.trim()); }).filter(function(n){ return !isNaN(n) && n > 0; });\r\n      CONFIGS_GRAPHIQUE[key].margeBasse = parseFloat(concMargeInput.value) || CONFIGS_GRAPHIQUE[key].margeBasse;\r\n      CONFIGS_GRAPHIQUE[key].sechage = parseFloat(concSechageInput.value) || CONFIGS_GRAPHIQUE[key].sechage;\r\n      chartNoteEl.style.display = 'none';\r\n      dessinerGraphique();\r\n    } else {\r\n      chartNoteEl.style.display = 'inline';\r\n    }\r\n  }\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ BASCULE DE LANGUE FR\/EN\r\n  \/\/ ===========================================================================\r\n  var langFrEl = document.getElementById('kiavik-lang-fr');\r\n  var langEnEl = document.getElementById('kiavik-lang-en');\r\n\r\n  function changerLangue(langue){\r\n    if (LANGUE_ACTUELLE === langue) return;\r\n    LANGUE_ACTUELLE = langue;\r\n    langFrEl.style.color = langue === 'fr' ? '#3ddc6f' : '#888';\r\n    langFrEl.style.background = langue === 'fr' ? '#1a2e22' : 'transparent';\r\n    langEnEl.style.color = langue === 'en' ? '#3ddc6f' : '#888';\r\n    langEnEl.style.background = langue === 'en' ? '#1a2e22' : 'transparent';\r\n\r\n    appliquerTraductionsStatiques();\r\n    genererVignettesEtSelecteur(); \/\/ r\u00e9g\u00e9n\u00e8re la carte \"Autre\/saisie manuelle\" traduite\r\n    dessinerGraphique(); \/\/ axes, tooltip, badges traduits\r\n    update('num'); \/\/ recalcule le combo Kiavik dans la langue active\r\n\r\n    \/\/ si un comparatif \u00e9tait d\u00e9j\u00e0 affich\u00e9, le rejouer dans la nouvelle langue\r\n    if (dejaValide) calculerEtAfficherComparatif();\r\n  }\r\n\r\n  langFrEl.addEventListener('click', function(){ changerLangue('fr'); });\r\n  langEnEl.addEventListener('click', function(){ changerLangue('en'); });\r\n\r\n  appliquerTraductionsStatiques();\r\n\r\n  \/\/ ===========================================================================\r\n  \/\/ INITIALISATION : on charge la Sheet, puis on construit l'UI d\u00e9pendante\r\n  \/\/ ===========================================================================\r\n  jumpTransparenceEl.addEventListener('click', function(){\r\n    var cible = document.getElementById('kiavik-transp-resume');\r\n    if (cible) cible.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n  });\r\n\r\n  chargerMachinesDepuisSheet(function(){\r\n    genererVignettesEtSelecteur();\r\n    CONFIGS_GRAPHIQUE = JSON.parse(JSON.stringify(CONFIG.concurrents));\r\n    dessinerGraphique();\r\n    resultatEl.innerHTML = '<span style=\"color:#888;\">' + t('valeurModifiable') + '<\/span>';\r\n    murEl.style.width = '260px';\r\n    update('num');\r\n  });\r\n})();\r\n<\/script><\/p>\n","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"1080","footnotes":""},"class_list":["post-2087","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Configuration Kiavik Print - Kiavik Vertical Print<\/title>\n<meta name=\"description\" content=\"Configurez votre Kiavik print selon la hauteur de votre plafond. Faites vos tests pour la hauteur de vos murs, et voir quelle imprimante est la mieux adapt\u00e9e du march\u00e9.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kiavikprint.com\/en\/configuration-kiavik-print\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Configuration Kiavik Print - Kiavik Vertical Print\" \/>\n<meta property=\"og:description\" content=\"Configurez votre Kiavik print selon la hauteur de votre plafond. Faites vos tests pour la hauteur de vos murs, et voir quelle imprimante est la mieux adapt\u00e9e du march\u00e9.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kiavikprint.com\/en\/configuration-kiavik-print\/\" \/>\n<meta property=\"og:site_name\" content=\"Kiavik Vertical Print\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-31T13:03:39+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/configuration-kiavik-print\\\/\",\"url\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/configuration-kiavik-print\\\/\",\"name\":\"Configuration Kiavik Print - Kiavik Vertical Print\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/#website\"},\"datePublished\":\"2026-07-31T12:40:52+00:00\",\"dateModified\":\"2026-07-31T13:03:39+00:00\",\"description\":\"Configurez votre Kiavik print selon la hauteur de votre plafond. Faites vos tests pour la hauteur de vos murs, et voir quelle imprimante est la mieux adapt\u00e9e du march\u00e9.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/configuration-kiavik-print\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/kiavikprint.com\\\/en\\\/configuration-kiavik-print\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/configuration-kiavik-print\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Configuration Kiavik Print\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/\",\"name\":\"Kiavik Vertical Print\",\"description\":\"Wall Printing Solutions in France\",\"publisher\":{\"@id\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/#organization\",\"name\":\"Kiavik Vertical Print\",\"url\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/kiavikprint.com\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/fav.jpg\",\"contentUrl\":\"https:\\\/\\\/kiavikprint.com\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/fav.jpg\",\"width\":512,\"height\":512,\"caption\":\"Kiavik Vertical Print\"},\"image\":{\"@id\":\"https:\\\/\\\/kiavikprint.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.instagram.com\\\/kiavik_vertical_print\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Configuration Kiavik Print - Kiavik Vertical Print","description":"Configurez votre Kiavik print selon la hauteur de votre plafond. Faites vos tests pour la hauteur de vos murs, et voir quelle imprimante est la mieux adapt\u00e9e du march\u00e9.","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:\/\/kiavikprint.com\/en\/configuration-kiavik-print\/","og_locale":"en_US","og_type":"article","og_title":"Configuration Kiavik Print - Kiavik Vertical Print","og_description":"Configurez votre Kiavik print selon la hauteur de votre plafond. Faites vos tests pour la hauteur de vos murs, et voir quelle imprimante est la mieux adapt\u00e9e du march\u00e9.","og_url":"https:\/\/kiavikprint.com\/en\/configuration-kiavik-print\/","og_site_name":"Kiavik Vertical Print","article_modified_time":"2026-07-31T13:03:39+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/kiavikprint.com\/en\/configuration-kiavik-print\/","url":"https:\/\/kiavikprint.com\/en\/configuration-kiavik-print\/","name":"Configuration Kiavik Print - Kiavik Vertical Print","isPartOf":{"@id":"https:\/\/kiavikprint.com\/en\/#website"},"datePublished":"2026-07-31T12:40:52+00:00","dateModified":"2026-07-31T13:03:39+00:00","description":"Configurez votre Kiavik print selon la hauteur de votre plafond. Faites vos tests pour la hauteur de vos murs, et voir quelle imprimante est la mieux adapt\u00e9e du march\u00e9.","breadcrumb":{"@id":"https:\/\/kiavikprint.com\/en\/configuration-kiavik-print\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kiavikprint.com\/en\/configuration-kiavik-print\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/kiavikprint.com\/en\/configuration-kiavik-print\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kiavikprint.com\/en\/"},{"@type":"ListItem","position":2,"name":"Configuration Kiavik Print"}]},{"@type":"WebSite","@id":"https:\/\/kiavikprint.com\/en\/#website","url":"https:\/\/kiavikprint.com\/en\/","name":"Kiavik Vertical Print","description":"Wall Printing Solutions in France","publisher":{"@id":"https:\/\/kiavikprint.com\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kiavikprint.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/kiavikprint.com\/en\/#organization","name":"Kiavik Vertical Print","url":"https:\/\/kiavikprint.com\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/kiavikprint.com\/en\/#\/schema\/logo\/image\/","url":"https:\/\/kiavikprint.com\/wp-content\/uploads\/2024\/08\/fav.jpg","contentUrl":"https:\/\/kiavikprint.com\/wp-content\/uploads\/2024\/08\/fav.jpg","width":512,"height":512,"caption":"Kiavik Vertical Print"},"image":{"@id":"https:\/\/kiavikprint.com\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.instagram.com\/kiavik_vertical_print\/"]}]}},"_links":{"self":[{"href":"https:\/\/kiavikprint.com\/en\/wp-json\/wp\/v2\/pages\/2087","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kiavikprint.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/kiavikprint.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/kiavikprint.com\/en\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/kiavikprint.com\/en\/wp-json\/wp\/v2\/comments?post=2087"}],"version-history":[{"count":5,"href":"https:\/\/kiavikprint.com\/en\/wp-json\/wp\/v2\/pages\/2087\/revisions"}],"predecessor-version":[{"id":2093,"href":"https:\/\/kiavikprint.com\/en\/wp-json\/wp\/v2\/pages\/2087\/revisions\/2093"}],"wp:attachment":[{"href":"https:\/\/kiavikprint.com\/en\/wp-json\/wp\/v2\/media?parent=2087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}