{"id":9029,"date":"2025-08-14T16:29:16","date_gmt":"2025-08-14T20:29:16","guid":{"rendered":"https:\/\/handymananddesigns.com\/?page_id=9029"},"modified":"2025-12-10T16:06:34","modified_gmt":"2025-12-10T21:06:34","slug":"ask-a-handyman","status":"publish","type":"page","link":"https:\/\/handymananddesigns.com\/fr\/ask-a-handyman","title":{"rendered":"Demandez \u00e0 un bricoleur"},"content":{"rendered":"<div id=\"hadAskApp\">\r\n<style>\r\nhtml,body{background:#fafafa;margin:0;padding:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Helvetica,Arial,sans-serif}\r\nhtml.had-card-active #hadHero {display: block;}\r\n\r\n\/* VISIBILITY FLIP: class-driven *\/\r\nhtml.had-card-active .answer-card { display: block; }\r\nhtml.had-card-active .ask-box     { display: none;  }\r\n:root{ \r\n  --gap:16px; \r\n  --fade-ms:420ms; \r\n  --had-bd: #bdb4b4;\r\n}\r\n.uploadIMG {border: 1px solid #ccc; border-radius: 10px; width: 312px; height: 202px; overflow: hidden; background: #ffffff url(https:\/\/handymananddesigns.com\/wp-content\/uploads\/icons\/icon-photo.gif) no-repeat center;}\r\n.had-ai-diff {display: none;}\r\n.had-wrap {display: grid; grid-template-columns: 1fr 340px; gap: var(--gap);max-width:1300px;margin:0 auto; padding: 10px 32px 190px;}\r\n.main-grid{display: block; position: relative;}\r\n.intHead {display: none;}\r\n.toolContain {width: 100%; overflow: hidden; padding: 0; margin: 0 auto 25px;}\r\n.toolLeft {width: 32%; display: inline-table; margin: 0; padding: 0; float: left; text-align: left;}\r\n.toolLeft img {margin: 0; max-width: 350px; width: 100%; border-radius: 8px;}\r\n.toolRight {width: 68%; display: inline-table; margin: 0; padding: 0; color: #3a3a3a; float: left; text-align: left;}\r\n.toolRight p {padding: 0 35px; margin: 0 0 10px;}\r\n.toolRight h3 {padding: 0 35px; margin: 0 0 10px; font-weight: bold;}\r\n.toolHead {font-size: 24px;}\r\n.how-it-works {color: #777;}\r\n.how-it-works p {padding: 15px 5px 5px; margin: 0;}\r\n.ulHelps {margin: 0; padding: 0 0 0 25px; list-style: none;}\r\n.ulHelps li {display: grid; grid-template-columns: max-content 1fr; gap: 10px;}\r\n.ulHelps li div {display: flex; align-items: center;}\r\n.ulHelps li img {background: url(https:\/\/handymananddesigns.com\/wp-content\/uploads\/icons\/icon-helpers.gif) no-repeat; width: 42px; height: 52px; margin-right: 10px; opacity: .8;}\r\n.topLine div {padding: 0;}\r\n\r\n.answer-body h3 {font-weight: 700; font-size: 24px;}\r\n.answer-body p {}\r\n.answer-body ol {padding: 0 0 15px;}\r\n.answer-body ol li {padding: 0 0 10px 5px;}\r\n.answer-body ol li::marker {font-weight: bold;}\r\n.answer-body ul {padding: 0 0 15px;}\r\n.answer-body ul li {padding: 0 0 10px 5px;}\r\n.lineHead {border-bottom: 1px dotted #333; width: 50%; margin: 0 auto 30px;}\r\n\r\n.copy-mode .toolRight,\r\n.copy-mode .toolLeft {display: none !important;}\r\n.copy-mode #diffRightImg {display: none!important;}\r\n.copy-mode #diffTopImg {display: block!important;}\r\n.copy-mode #hadResetAllBtn,\r\n.copy-mode .answer-actions,\r\n.copy-mode .had-toolbar {display: none !important;}\r\n\r\n\r\n#hadHero {display: none;}\r\n#hadUploadPreview {position: relative; display: inline-table; height: 200px; width: 310px;}\r\n#hadUploadPreview img {width: 310px; height: 200px; object-fit: cover; border-radius: 10px;}\r\n\r\n#hadUploadPreview #hadUploadRemove {position: absolute; top: 0; right: 0; background: #000; color: #fff; border: none; border-radius: 0 0 0 5px; width: 45px; min-width: 35px; height: 35px; font-size: 36px; cursor: pointer; line-height: 20px; padding: 0 5px 0 6px; opacity: .3; font-weight: 100;}\r\n\r\nlabel.upload-btn {position: relative;}\r\n.mainDesk {display: block;}\r\n.mainMobile {display: none; max-width: 1200px; margin: 0 auto; padding: 15px 0 5px;}\r\n.mainMobile img {border-radius: 10px;}\r\n\r\n.signWrap {position: relative; height: auto; clear: both; z-index: 2; padding: 10px 0 0;}\r\n.signSect {position: absolute; bottom: 30px; left: 353px; width: 33%; height: 500px; display: block; color: #fff;}\r\n.signSect h2 {font-size: 80px; font-weight: 900; letter-spacing: -1px; margin-top: 0;}\r\n.signSect p {margin: 0 0 10px 2px; padding: 0; font-size: 20px;}\r\n.signDiv {position: absolute; top: -28px; left: 0; right: 0; width: 100%; background: url('https:\/\/handymananddesigns.com\/wp-content\/uploads\/2017\/05\/page-add-3.gif') no-repeat top center; height: 30px;}\r\n\r\n#hadAskApp {background: #f5f5f5;}\r\n.entry-content {background: none; padding-bottom: 0;}\r\n.tipDay {background-color: #f5f5f5;}\r\n#hadAskBtn {opacity: 1; background: #fa9d1c; color: #121212; font-weight: 700; border: none; border-radius: 12px; padding: 14px 18px; width: 100%; display: block; cursor: pointer; margin: 8px auto 0; font-size: 25px;}\r\n#hadAskBtn:hover {background: #fbb657;}\r\n.ask-box {display: block; background: #fff; border: 1px solid var(--had-bd); border-radius: 12px; padding: 15px 15px 16px; margin: 0 0 12px 0; box-shadow: 0 8px 20px rgba(0,0,0,.0)}\r\n.ask-head {display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px}\r\n.fieldwrap{position:relative}\r\n.fieldwrap textarea {width: 100%; min-height: 120px; resize: vertical; padding: 10px 54px 26px 12px; border: 1px solid #c7c7c7; box-shadow: none; font: inherit; border-radius: 10px !important;\r\n -moz-border-radius: 10px!important;\r\n -webkit-border-radius: 10px !important;\r\n}\r\n.counter{position: absolute; right: 12px; bottom: 10px; font-size: 12px; color: #666; pointer-events: none;}\r\n.ask-actions{display:block; margin-bottom: 15px}\r\n.upload-btn{display: inline-flex; align-items: center; gap: 8px; font-size: 13px; cursor: pointer;}\r\n.upload-btn input{display: none;}\r\n.btn{appearance: none; border: 1px solid #e0e0e0; background: #f7f7f7; border-radius: 10px; padding: 10px 12px; font-size: 14px; cursor: pointer;}\r\n.btn[disabled] {opacity: .5; cursor: default;}\r\n.upload-preview{margin-top: 10px;}\r\n.upload-preview img{max-width: 100%; height: auto; border-radius: 10px; display: block;}\r\n\r\n.answer-card{display: none; position: relative; background: #fff; border: 1px solid var(--had-bd); border-radius: 12px; padding: 16px 16px 20px; box-shadow: 0 8px 20px rgba(0,0,0,.04)}\r\n.answer-body {margin-top: 12px;}\r\n.answer-body p {line-height: 1.6;}\r\n.tileTit {font-weight: bold; text-align: center;}\r\n#diffTopImg {display:none; max-width: 100%; height: auto; border-radius: 10px; margin: 0 0 12px 0;}\r\n#hadHero img {width: 100%; height: auto; border-radius: 10px; display:block; border: 1px solid var(--had-bd); margin: 0 0 15px;}\r\n\r\n#diffRightImg {display: block; max-width: 100%; height: auto; border-radius: 10px; opacity: 0; transition: opacity .25s ease}\r\n#diffRightImg.show{opacity: 1;}\r\n\r\n.fade-cover{position:absolute;inset:0;background:#fff;opacity:0;pointer-events:none;transition:opacity var(--fade-ms) ease}\r\n.fading .fade-cover{opacity:1}\r\n\r\n.had-disclaimer {color: #777; font-size: 16px; margin-top: 10px; margin-left: 5px;}\r\n.rail {display: flex; flex-direction: column;gap:12px}\r\n.rail-search {display: flex; margin: 0;}\r\n.rail-search .wrap {position:relative;flex:1}\r\n.rail-search input {width:100%; padding:10px 52px 10px 12px; border: 1px solid var(--had-bd); border-radius: 10px!important; background: #fff;}\r\n.had-search-btn {position:absolute;right:6px;top:50%;transform:translateY(-50%);cursor:pointer;background:url(https:\/\/handymananddesigns.com\/wp-content\/uploads\/icons\/icon-ask-handyman.png) no-repeat -7px -120px;min-width:40px;display:inline-table;width:40px;height:40px;border:0;background-color:transparent;z-index:2}\r\n.had-search-btn.loading{opacity:.6;cursor:default}\r\n.tile {padding-left: 0; margin-bottom: 10px;display:grid;grid-template-columns:100px 1fr;align-items:center;gap:10px;border: 1px solid var(--had-bd);border-radius:12px;overflow:hidden;cursor:pointer;background:#fff;position:relative; min-height: 90px;}\r\n.tile img {display:block;width: 113px; height:88px;object-fit:cover;border-radius: 0!important;}\r\n.tile h4 {margin: 0 10px 5px 0; font-size: 16px; line-height: 1.25; font-weight: bold;}\r\n.tile.is-selected{pointer-events:none}\r\n.tile.is-selected::after {content:\"\";position:absolute;inset:0;background:rgba(0,0,0,.15)}\r\n.tile:hover {background:rgba(0,0,0,.05)}\r\n.rail-controls {display: flex; flex-direction: column; gap: 8px; margin: 0;}\r\n.btn-rail {appearance: none; border: 1px solid var(--had-bd); background: #fff;border-radius:10px;padding:10px 12px;font-size:14px;cursor:pointer}\r\n.btn-rail:hover {background: #d9d9d9;}\r\n.btn-rail[disabled] {opacity: .5; cursor: not-allowed; }\r\n.btn-rail[disabled]:hover {background: #fff;}\r\n#hadFixesNone {opacity: .5; background: #fff; cursor: not-allowed; }\r\n#hadFixesNone:hover {background: #fff;}\r\n\r\n\/* Auto-visibility for Reset button: hidden by default; visible when card is open *\/\r\n#hadResetAllBtn {display: none!important;}\r\nhtml.had-card-active #hadResetAllBtn {display: block !important; text-align: center; margin: 15px auto; font-size: 18px; background: #e5e5e5; width: 100%; padding: 10px; border-radius: 10px; border: 1px solid var(--had-bd);}\r\n\r\n.had-dnd-zone {display: grid; grid-template-columns: max-content 1fr; gap: 16px; text-align: left; padding: 18px 16px; border: 2px dashed #cfcfcf; border-radius: 14px; background: #f3f3f3; cursor: pointer; user-select: none;}\r\n.had-dnd-zone .dnd-txt {display: inline-table; font-weight: 700; letter-spacing: .4px; margin: 0; text-transform: uppercase; padding: 0 0 7px 10px; line-height: 21px; font-size: 18px;}\r\n.had-dnd-zone .dnd-txt span {font-size: 12px; opacity: .85;}\r\n.had-dnd-zone .dnd-icon {width: 65px; height: 65px; display: block; margin: 0 auto 6px auto; opacity: .7;}\r\n.had-dnd-zone:hover {background: #f7f7f9;}\r\n.dnd-hover {outline: 2px dashed #bbb; background: #f9f9ff;}\r\nlabel.upload-btn {display: block;}\r\nlabel.upload-btn input[type=\"file\"] {position: absolute; left: -9999px; width: 1px; height: 1px; opacity: 0;}\r\n\r\n.had-loading {position:absolute;inset:0;display:block;align-items:flex-start;justify-content:center;background:#fff;z-index:9999;opacity:0;visibility:hidden;pointer-events:none;transition:opacity 280ms ease,visibility 0s linear 280ms; border-radius: 10px; border: 1px solid var(--had-bd); min-height: 1000px;}\r\n.had-loading.show {opacity:1;visibility:visible;pointer-events:auto;transition:opacity 280ms ease;}\r\n\r\nlabel.upload-btn {display: block;}\r\n.had-toolbar .had-icon.is-disabled {opacity: 0.4; pointer-events: none;}\r\n.had-toolbar {display:flex;justify-content:flex-end;margin: 2px 0 0; gap: 5px;}\r\n.had-icon {opacity: .5; cursor:pointer; height: 40px; width: 40px; margin: 0; padding: 0; display: block; background: url(https:\/\/handymananddesigns.com\/wp-content\/uploads\/icons\/icon-ask-handyman.png) no-repeat; min-width: 40px; \r\n    transform-origin: center center;\r\n    transition: transform 0.15s ease-out, opacity 0.15s ease-out;\r\n}\r\n.had-icon:focus, .had-icon:hover {opacity: 1;\r\n    transition: all 0.2s ease-out;\r\n    -moz-transition: all 0.2s ease-out;\r\n    -webkit-transition: all 0.2s ease-out;\r\n    -o-transition: all 0.2s ease-out;\r\n    -ms-transform: scale(1.1, 1.1);\r\n    -webkit-transform: scale(1.1, 1.1);\r\n    transform: scale(1.1, 1.1);\r\n}\r\n#iconEmail {background-position: -7px 0px;}\r\n#iconCopy {background-position: -7px -40px;}\r\n#iconPrint {background-position: -7px -80px;}\r\n#iconShare {background-position: -7px -160px;}\r\n#blogTop div {position: absolute; top: 0; z-index: 1; left: 0; right: 0; width: 100%; background: url(https:\/\/handymananddesigns.com\/wp-content\/uploads\/line-5.gif) no-repeat bottom center; height: 46px; pointer-events: none;}\r\n.ans-grid {display: block;}\r\n.quiz {diplay: block; overflow: hidden; width: 340px; height: 280px; border: 1px solid var(--had-bd); border-radius: 10px; margin-bottom: 2px;}\r\n.quiz:hover img {opacity: .9;\r\n    transition: all 0.2s ease-out;\r\n    -moz-transition: all 0.2s ease-out;\r\n    -webkit-transition: all 0.2s ease-out;\r\n    -o-transition: all 0.2s ease-out;\r\n    -ms-transform: scale(1.05, 1.05);\r\n    -webkit-transform: scale(1.05, 1.05);\r\n    transform: scale(1.05, 1.05);\r\n}\r\n.rail h3 {border: 1px solid var(--had-bd); gap: 10px; border-radius: 12px; margin: 0; text-align: center; padding: 25px 0; font-size: 22px !important; font-weight: bold; background: #ffffff;}\r\n.had-ask-title {font-size: 60px; line-height: 1.1; margin: 0 0 8px; font-weight: 800; text-align: center;}\r\n#had-ask-sub {font-size: 30px; margin: 0 0 10px 2px; text-align: center;}\r\n\r\n@media (max-width: 1590px) {\r\n  .had-wrap {padding: 20px 0 190px; max-width: 1200px;}\r\n  .signSect {display: block; color: #2c2d2e; position: relative; bottom: 0; left: 0; right: 0; width: 100%; max-width: 1310px; margin: 0 auto; height: auto; border: none; padding: 0 40px 0; border-radius: 10px;}\r\n  .signDiv {display: none;}\r\n  .had-ask-title {font-size: 40px; font-weight: 900; letter-spacing: -1px;}\r\n  #had-ask-sub {margin: 0 0 10px 2px; padding: 0; font-size: 20px;}\r\n  .quiz {display: none;}\r\n  .mainDesk {display: none;}\r\n  .mainMobile {display: block;}\r\n  #signContain {height: auto; background: #f5f5f5; overflow: hidden; padding: 5px 0 5px 0;}\r\n  #signCon {display: none;}\r\n  .signImg {display: none;}\r\n  .signSect h2 {font-size: 50px;}\r\n  .topLine {display: none;}\r\n  .botLine {display: none;}\r\n}\r\n\r\n@media (max-width: 1250px) {\r\n  .mainMobile {padding: 15px 20px 0;}\r\n  .had-wrap {padding: 5px 20px 190px;}\r\n}\r\n\r\n@media (max-width:1024px) { \r\n  .uploadIMG {width: 100%; max-width: 100%; min-width: 312px;}\r\n  .had-wrap {grid-template-columns: 1fr;}\r\n  .main-grid {position: relative;}\r\n  #hadFixesList {display: grid; grid-template-columns: 1fr 1fr; gap: 12px;}\r\n  .tile {margin-bottom: 0;}\r\n  #had-ask-sub {font-size: 18px; text-align: left; margin-bottom: 0;}\r\n  .ask-box {padding: 15px 15px 10px; margin: 0 0 6px 0;}\r\n  .rail {border: 1px solid var(--had-bd); border-radius: 10px; padding: 15px; background: #fff;}\r\n  .rail h3 {background: none; border: none; font-size: 30px!important; margin: 0; padding: 10px 0 17px;}\r\n}\r\n\r\n@media (max-width: 728px) {\r\n  .had-dnd-zone {grid-template-columns: 1fr;}\r\n}\r\n\r\n@media (max-width: 500px) {\r\n  .rail-search {margin: 0 0 6px;}\r\n  .rail-controls {margin-top: 7px;}\r\n  #mainDiv {font-size: 17px;}\r\n  .toolLeft {width: 100%; float: none; text-align: center; margin-bottom: 15px;}\r\n  .toolRight {width: 100%; float: none;}\r\n  .toolRight p {padding: 0;}\r\n  .toolRight h3 {padding: 0;}\r\n  #hadFixesList {grid-template-columns: 1fr;}\r\n  .rail {gap: 6px; padding: 0 15px; border: none; background: none;}\r\n  .rail h3 {margin-bottom: 6px;}\r\n  .had-ask-title {font-size: 32px; font-weight: 700; letter-spacing: -1px; text-align: left; margin: 0 0 5px;}\r\n  .had-wrap {padding: 0 0 190px;}\r\n  .ask-box {background: none; border: none; margin: 0;}\r\n  .signSect {padding: 0 15px 0;}\r\n  .mainMobile {padding: 15px 15px 0;}\r\n  .ulHelps {padding: 0 0 0 6px;}\r\n  .ulHelps li img {float: left;}\r\n  .ulHelps li {padding-bottom: 10px;}\r\n  .how-it-works h3 {margin-bottom: 12px;}\r\n  .had-disclaimer {text-align: left; padding: 0 5px;}\r\n}\r\n<\/style>\r\n<style>\r\n.signSect {bottom: 90px;}\r\n<\/style>\r\n\r\n<div style=\"position: relative; width: 100%; height: 1px;\">\r\n  <div id=\"blogTop\">\r\n    <div><\/div>\r\n  <\/div>\r\n<\/div>\r\n  <div class=\"signImg mainDesk\">\r\n    <img src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-feature.jpg\" alt=\"Image de pr\u00e9sentation Ask a Handyman (bureau)\" width=\"1920\" height=\"500\" class=\"alignnone size-full wp-image-10853\" decoding=\"async\" fetchpriority=\"high\" srcset=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-feature.jpg 1920w, https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-feature-768x200.jpg 768w, https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-feature-1536x400.jpg 1536w, https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-feature-480x125.jpg 480w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/>\r\n  <\/div>\r\n  <div class=\"mainMobile\">\r\n    <img src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-mobile-feature.jpg\" alt=\"Image de pr\u00e9sentation Ask a Handyman (mobile)\" width=\"1200\" height=\"500\" class=\"alignnone size-full wp-image-10857\" decoding=\"async\" fetchpriority=\"high\" srcset=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-mobile-feature.jpg 1200w, https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-mobile-feature-768x320.jpg 768w, https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-mobile-feature-480x200.jpg 480w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/>\r\n  <\/div>\r\n\r\n<div class=\"signWrap\">\r\n  <div class=\"signSect\" id=\"handyman-odd-jobs\">\r\n    <h1 class=\"had-ask-title\">Demandez \u00e0 un Handyman<\/h1>\r\n    <p id=\"had-ask-sub\">Des r\u00e9ponses pratiques pour des probl\u00e8mes r\u00e9els. T\u00e9l\u00e9versez une photo, d\u00e9crivez votre probl\u00e8me, recevez une <b>r\u00e9ponse&nbsp;bricolage&nbsp;amicale&nbsp;IA<\/b>**<\/p>\r\n  <\/div>\r\n\r\n  <div class=\"signDiv\"><\/div>\r\n  <div class=\"topLine\" style=\"width: 100%; margin: 0 auto 0;\">\r\n    <div><img alt=\"ic\u00f4ne d\u2019information d\u2019en-t\u00eate\" border=\"0\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/headers\/header-en-diy-helper.gif\" style=\"max-width: 533px; width: 100%; margin: 0 auto 5px; display: block;\" width=\"533\" height=\"154\" \/><\/div>\r\n  <\/div>\r\n<\/div>\r\n<div class=\"had-wrap\" id=\"hadRoot\">\r\n\r\n<!-- Main Column -->\r\n<main class=\"leftCol\">\r\n<div class=\"main-grid\">\r\n<div>\r\n<div class=\"ask-box\">\r\n  <div class=\"ask-actions\">\r\n    <label class=\"upload-btn\">\r\n      <input accept=\"image\/*\" id=\"hadUpload\" type=\"file\"\/>\r\n  <div aria-label=\"T\u00e9l\u00e9verser une photo ou glisser-d\u00e9poser\" class=\"had-dnd-zone\" role=\"button\">\r\n    <!-- --- Photo Preview --- -->\r\n    <div class=\"uploadIMG\">\r\n      <div id=\"hadUploadPreview\" style=\"display:none;\">\r\n        <button type=\"button\" id=\"hadUploadRemove\" aria-label=\"Retirer la photo\">\u00d7<\/button>\r\n        <img alt=\"Aper\u00e7u\" \/>\r\n      <\/div>\r\n    <\/div>\r\n    <!-- --- END Photo Preview --- -->\r\n    <div style=\"display: flex; align-items: center;\">     \r\n      <div style=\"float: left;\">\r\n        <svg aria-hidden=\"true\" class=\"dnd-icon\" viewbox=\"0 0 24 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\r\n          <path d=\"M12 5l3 3h-2v5h-2V8H9l3-3zm-7 9v3h14v-3h2v5H3v-5h2z\"><\/path>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"dnd-txt\">T\u00c9L\u00c9VERSER UNE PHOTO ou GLISSER &amp; D\u00c9POSER<br>\r\n        <span>JPG\/GIF\/PNG Moins de 4&nbsp;MB<\/span>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n    <\/label>    \r\n  <\/div>\r\n  <div class=\"fieldwrap\">\r\n    <textarea id=\"hadQ\" maxlength=\"300\" placeholder=\"D\u00e9crivez votre probl\u00e8me de bricolage...\"><\/textarea>\r\n    <div class=\"counter\"><span id=\"hadCount\">0<\/span>\/300<\/div>\r\n  <\/div>\r\n  <button class=\"btn\" disabled=\"\" id=\"hadAskBtn\" type=\"button\">Obtenir une r\u00e9ponse<\/button>\r\n<script>\r\nif (!window.hadAskOriginalLabel) {\r\n  var btn = document.getElementById(\"hadAskBtn\");\r\n  if (btn) window.hadAskOriginalLabel = btn.textContent;\r\n}\r\n<\/script>\r\n\r\n\r\n\r\n\r\n<!-- How it works help -->\r\n<div class=\"how-it-works\">\r\n  <p><b>Notre IA Handyman<\/b> offre des <i>suggestions rapides de bricolage<\/i> pour vous aider \u00e0 d\u00e9marrer \u2014 mais \u00e7a reste un outil, alors v\u00e9rifiez toujours l\u2019information avant de vous lancer. Comment \u00e7a fonctionne?<\/p>\r\n  <ul class=\"ulHelps\">\r\n    <li>\r\n      <div><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/2017\/05\/spacing.gif\" width=\"42\" height=\"52\" style=\"background-position: 0 7px;\"><\/div>\r\n      <div>Optionnel : t\u00e9l\u00e9versez une photo de votre projet ou probl\u00e8me de bricolage.<\/div>\r\n    <\/li>\r\n    <li>\r\n      <div><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/2017\/05\/spacing.gif\" width=\"42\" height=\"52\" style=\"background-position: 0 -44px;\"><\/div> \r\n      <div>D\u00e9crivez ce que vous essayez de r\u00e9parer ou construire.<\/div>\r\n    <\/li>\r\n    <li>\r\n      <div><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/2017\/05\/spacing.gif\" width=\"42\" height=\"52\" style=\"background-position: 0 -96px;\"><\/div>\r\n      <div>Recevez des conseils rapides et pratiques de notre IA de handyman.<\/div>\r\n    <\/li>\r\n  <\/ul>\r\n\r\n    <div class=\"had-disclaimer\">**Les conseils sur cette page sont fournis \u00e0 titre g\u00e9n\u00e9ral seulement et pourraient ne pas correspondre exactement \u00e0 votre situation. Utilisez-les \u00e0 vos propres risques. Suivez toujours les consignes de s\u00e9curit\u00e9 et les codes locaux. En cas de doute, consultez un&nbsp;<b>professionnel.<\/b>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<img alt=\"Difficult\u00e9 bricolage (banni\u00e8re mobile)\" id=\"diffTopImg\"\/>\r\n<div id=\"hadHero\"><\/div>\r\n\r\n<article class=\"answer-card\" id=\"answerCard\">\r\n  <div aria-hidden=\"true\" class=\"fade-cover\"><\/div>\r\n  <div class=\"ans-grid\">\r\n    <div id=\"target\">\r\n      <header class=\"answer-head\">\r\n        <h2 class=\"tileTit\" id=\"ansTitle\"><\/h2>\r\n      <\/header>\r\n      <section class=\"answer-body\" id=\"hadResult\"><\/section>\r\n    <\/div>\r\n  <\/div>\r\n  <div aria-label=\"Actions rapides\" class=\"had-toolbar\" style=\"justify-content:center;margin-top:10px;\">\r\n    <button class=\"had-icon\" id=\"iconEmail\" title=\"Courriel\" type=\"button\" onclick=\"return (window.hadOpenEmail ? window.hadOpenEmail() : false);\"><\/button>\r\n    <button class=\"had-icon\" id=\"iconCopy\" title=\"Copier\" type=\"button\"><\/button>\r\n    <button class=\"had-icon\" id=\"iconPrint\" title=\"Imprimer\" type=\"button\"><\/button>\r\n    <button class=\"had-icon\" id=\"iconShare\" title=\"Partager\" type=\"button\"><\/button>\r\n  <\/div>\r\n<\/article>\r\n\r\n  <div class=\"answer-actions\">\r\n    <button aria-label=\"R\u00e9initialiser les r\u00e9sultats et les tuiles\" id=\"hadResetAllBtn\" type=\"button\">R\u00e9initialiser la page<\/button>\r\n  <\/div>\r\n<\/div>\r\n<div aria-hidden=\"true\" class=\"had-loading\" id=\"hadLoading\">\r\n  <img loading=\"lazy\" decoding=\"async\" alt=\"Chargement\" height=\"302\" src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/icons\/loading-screen.gif\" style=\"display:block;margin: 50px auto 0 auto; opacity: .3;\" width=\"300\"\/>\r\n<\/div>\r\n<\/div>\r\n\r\n<\/main>\r\n<aside class=\"rail\">\r\n  <a class=\"quiz\" href=\"#\" rel=\"dofollow noopener\" target=\"_self\">\r\n    <picture id=\"hadQuizBanner\">\r\n      <source media=\"(max-width: 600px)\" srcset=\"MOBILE_BANNER_URL\"\/>\r\n      <img decoding=\"async\" height=\"280\" loading=\"lazy\" src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/buttons\/button-diy-quiz-en-1.jpg\" width=\"340\"\/>\r\n    <\/picture>\r\n  <\/a>\r\n  <h3>R\u00e9ponses populaires<\/h3>\r\n  <div class=\"rail-search\">\r\n    <div class=\"wrap\">\r\n      <input id=\"hadSearch\" placeholder=\"Chercher dans les r\u00e9ponses pass\u00e9es...\" type=\"text\"\/>\r\n      <button class=\"had-search-btn\" id=\"hadSearchBtn\" title=\"Chercher\" type=\"button\"><\/button>\r\n    <\/div>\r\n  <\/div>\r\n  <div id=\"hadFixesList\"><\/div>\r\n  <div class=\"rail-controls\">\r\n    <button class=\"btn-rail\" id=\"hadFixesMore\" type=\"button\">Voir plus<\/button>\r\n    <button class=\"btn-rail\" disabled=\"\" id=\"hadFixesNone\" style=\"display:none\" type=\"button\">Aucun autre \u00e9l\u00e9ment<\/button>\r\n    <button class=\"btn-rail\" disabled=\"\" id=\"hadFixesReset\" type=\"button\">R\u00e9initialiser le menu<\/button>\r\n  <\/div>\r\n<\/aside>\r\n<\/div>\r\n<!-- end div -->\r\n<\/div>\r\n<style>\r\n#quote-display, #time-display {\r\n  margin: 0 0;\r\n  padding: 0;\r\n  text-align: center;\r\n  background: none;\r\n}\r\n#quote-display p, #time-display p {\r\n  margin: 0;\r\n  font-size: 16px;\r\n  color: #ffffff;\r\n  }\r\n#quote-display h3 {\r\n  color: #ffffff;\r\n  font-size: 48px;\r\n  font-weight: bold;\r\n  font-style: italic;\r\n  margin: 0;\r\n  padding: 5px 0 5px;\r\n}\r\n\r\n.tipWrap {position: relative; height: 1px;}\r\n.tipDay {background-color: unset; pointer-events: none; position: absolute; bottom: 0; right: 0; left: 0; background-image: url(https:\/\/handymananddesigns.com\/wp-content\/uploads\/line-tiip-of-day.png); width: 100%; height: 181px; overflow: hidden; background-position: center;}\r\n.tipBot {background-image: url(https:\/\/handymananddesigns.com\/wp-content\/uploads\/line-orange-shadow-1.png); background-position: center; position: absolute; top: 0; left: 0; width: 100%; z-index: 1; height: 57px;}\r\n.tipBot img {max-height: 57px; max-width: 100%; width: 100%; margin: 0; display: inline-table; }\r\n\r\n.calc-grid {width: 85%; max-width: 1800px; display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); margin: 85px auto 60px; gap: 3rem;}\r\n.calc-grid a{display: block; opacity: .7;}\r\n.calc-grid a:hover{opacity: 1; -ms-transform: scale(1.1, 1.1);transition: all 0.2s ease-out;\r\n    -moz-transition: all 0.2s ease-out;\r\n    -webkit-transition: all 0.2s ease-out;\r\n    -o-transition: all 0.2s ease-out;\r\n     transform: scale(1.05, 1.05);}\r\n.calc-item {text-align: center;}\r\n\r\n@media (max-width:1340px){\r\n  #quote-display h3 {font-size: 42px;}\r\n}\r\n\r\n@media (max-width: 768px){\r\n  #quote-display {padding: 0 20px;}\r\n  #quote-display h3 {font-size: 32px;}\r\n  .tipDay {background-size: 1400px; background-position: center; height: 130px;}\r\n  .tipBot {background-size: 870px 58px; height: 56px;}\r\n  .calc-grid {margin: 75px auto 45px;}\r\n  .calc-grid a{opacity: 1;}\r\n}\r\n<\/style>\r\n\r\n<div class=\"tipWrap\">\r\n  <div class=\"tipDay\">\r\n    <img loading=\"lazy\" decoding=\"async\" style=\"max-width: 100%; width: 100%; margin: 0; display: inline-table;\" src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/spacing-50x50.gif\" border=\"0\" height=\"181\" width=\"1920\" alt=\"Tip of the Day heading\">\r\n  <\/div>\r\n<\/div>\r\n<div style=\"background: #ff9a2e; width: 100%; height: auto; padding: 0 0 30px;\">\r\n\r\n  <div id=\"quote-display\"><\/div>\r\n  <div id=\"time-display\"><\/div>\r\n<\/div>\r\n<div style=\"line-height: 0; position: relative; width: 100%; height: 1px;\">  \r\n  <div class=\"tipBot\"><img src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/spacing-50x50.gif\" border=\"0\" height=\"57\" width=\"1920\" alt=\"Line Top Shadow\" decoding=\"async\" loading=\"lazy\" \/>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- Cards -->\r\n<div class=\"calc-grid\">\r\n  <div class=\"calc-item\">\r\n    <a target=\"_self\" rel=\"dofollow noopener\"><img decoding=\"async\" src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/buttons\/button-page-handyman-quiz.gif\" border=\"0\" height=\"204\" width=\"423\" alt=\"Handyman or hopeful? Take the Handyman Quiz\" loading=\"lazy\" \/><\/a>\r\n  <\/div>\r\n  <div class=\"calc-item\">\r\n    <a href=\"https:\/\/handymananddesigns.com\/your-handy-calculation-station\" target=\"_self\" rel=\"dofollow noopener\"><img decoding=\"async\" src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/buttons\/button-page-handy-calculation-station.gif\" border=\"0\" height=\"204\" width=\"423\" alt=\"Your handy calculation station\" loading=\"lazy\" \/><\/a>\r\n  <\/div>\r\n  <div class=\"calc-item\">\r\n    <a href=\"https:\/\/handymananddesigns.com\/ask-a-handyman\" target=\"_self\" rel=\"dofollow noopener\"><img decoding=\"async\" src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/buttons\/button-page-ask-a-handyman.gif\" border=\"0\" height=\"204\" width=\"423\" alt=\"Ask a Handyman\" loading=\"lazy\" \/><\/a>\r\n  <\/div>\r\n  <div class=\"calc-item\">\r\n    <a target=\"_self\" rel=\"dofollow noopener\"><img decoding=\"async\" src=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/buttons\/button-page-what-type-diyer.gif\" border=\"0\" height=\"204\" width=\"423\" alt=\"What type of DIYer are you\" loading=\"lazy\" \/><\/a>\r\n  <\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<script>\r\n    \/\/ List of 30 quotes (replace with your own)\r\n    const quotes = [\r\n\"Mesure deux fois, coupe une fois. - Vieille r\u00e8gle de charpentier\",\r\n\"Une bonne fondation est la cl\u00e9 d\u2019un b\u00e2timent solide.\",\r\n\"La s\u00e9curit\u00e9 d\u2019abord, la construction ensuite.\",\r\n\"De bons outils font du bon travail.\",\r\n\"Planifie ton travail, puis travaille ton plan.\",\r\n\"Chaque clou compte dans une structure solide.\",\r\n\"La pr\u00e9cision est la marque d\u2019un grand savoir-faire.\",\r\n\"Une surface bien nivel\u00e9e fait gagner du temps et des efforts.\",\r\n\"Le b\u00e9ton durcit mieux avec de la patience.\",\r\n\"Garde ton espace de travail propre pour de meilleurs r\u00e9sultats.\",\r\n\"Un angle juste vaut son pesant d\u2019or.\",\r\n\"Le travail d\u2019\u00e9quipe construit des projets plus solides.\",\r\n\"V\u00e9rifie tes mesures avant de couler.\",\r\n\"Une lame bien aff\u00fbt\u00e9e coupe plus proprement et plus s\u00e9curitairement.\",\r\n\"Un bon design commence par une bonne planification.\",\r\n\"Prot\u00e8ge tes mains, elles construisent ton avenir.\",\r\n\"La ventilation est essentielle dans chaque construction.\",\r\n\"Utilise le bon attache pour le travail.\",\r\n\"Poser du gypse, c\u2019est un art, pas juste une t\u00e2che.\",\r\n\"La m\u00e9t\u00e9o peut faire ou d\u00e9faire une journ\u00e9e de construction.\",\r\n\"Inspecte ton travail avant d\u2019avancer.\",\r\n\"Une structure solide supporte chaque maison de r\u00eave.\",\r\n\"La peinture prot\u00e8ge autant qu\u2019elle embellit.\",\r\n\"Connais bien tes mat\u00e9riaux, de fond en comble.\",\r\n\"Une main stable b\u00e2tit des \u0153uvres durables.\",\r\n\"Une toiture bien faite garde l\u2019eau dehors.\",\r\n\"Le temps pass\u00e9 \u00e0 niveler n\u2019est jamais perdu.\",\r\n\"Chaque brique raconte une histoire d\u2019effort.\",\r\n\"Innover oui, mais respecte les bases de la construction.\",\r\n\"Finis fort pour laisser une impression durable.\"\r\n    ];\r\n\r\n\/\/ Function to get the current day in the user's local timezone\r\nfunction getLocalDay() {\r\n    const now = new Date();\r\n    return Math.floor(now.getTime() \/ (1000 * 60 * 60 * 24)); \/\/ Days since epoch in local time\r\n}\r\n\r\n\/\/ Function to display the quote based on the current day\r\nfunction displayQuote() {\r\n    const dayIndex = getLocalDay() % quotes.length; \/\/ Cycle through 0 to 29\r\n    const quoteDisplay = document.getElementById('quote-display');\r\n    quoteDisplay.innerHTML = `<h3>\"${quotes[dayIndex]}\"<\/h3>`;\r\n}\r\n\r\n\/\/ Function to update and display the local time, day, and date\r\nfunction updateTimeDisplay() {\r\n    const now = new Date();\r\n    const days = ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'];\r\n    const months = ['Janvier', 'F\u00e9vrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Ao\u00fbt', 'Septembre', 'Octobre', 'Novembre', 'D\u00e9cembre'];\r\n\r\n    const dayName = days[now.getDay()];\r\n    const monthName = months[now.getMonth()];\r\n    const dayNum = now.getDate();\r\n    const year = now.getFullYear();\r\n\r\n    \/\/ Quebec French does NOT use ordinal suffix styling like st\/nd\/rd\/th, so it is removed\r\n    let daySuffix = '';\r\n\r\n    \/\/ Format time (12-hour with AM\/PM)\r\n    let hours = now.getHours();\r\n    const minutes = now.getMinutes().toString().padStart(2, '0');\r\n    const ampm = hours >= 12 ? 'pm' : 'am';\r\n    hours = hours % 12;\r\n    hours = hours ? hours : 12; \/\/ Handle midnight (0) as 12\r\n    const timeStr = `${hours}:${minutes}${ampm}`;\r\n\r\n    const timeDisplay = document.getElementById('time-display');\r\n    timeDisplay.innerHTML = `<p>${dayName}, ${dayNum} ${monthName} ${year}, ${timeStr}: <b>Ton&nbsp;Conseil&nbsp;pratique&nbsp;du&nbsp;jour<\/b><\/p>`;\r\n}\r\n\r\n\/\/ Initial display\r\ndisplayQuote();\r\nupdateTimeDisplay();\r\n\r\n\/\/ Update time every second\r\nsetInterval(updateTimeDisplay, 1000);\r\n<\/script>\r\n\r\n\r\n\r\n\r\n<script>\r\n\/\/ __HAD_RESET_DELEGATED__\r\n(function(){\r\n  if (window.__HAD_RESET_DELEGATED__) return; window.__HAD_RESET_DELEGATED__ = true;\r\n  function byId(id){ return document.getElementById(id); }\r\n  function rmBanner(img){\r\n    if (!img) return;\r\n    try{\r\n      img.classList.remove(\"show\",\"loading\",\"fading\");\r\n      img.removeAttribute(\"src\"); img.removeAttribute(\"srcset\"); img.removeAttribute(\"sizes\");\r\n      img.hidden = true; img.style.display = \"none\";\r\n    }catch(_){}\r\n  }\r\n  function flipToAsk(){\r\n    try{\r\n      document.documentElement.classList.remove('had-card-active'); var ac = byId('answerCard'); if (ac){ try{ ac.style.removeProperty('display'); ac.hidden = false; }catch(_){ } }\r\n      document.querySelectorAll('.ask-box').forEach(function(n){ try{ n.style.removeProperty('display'); n.hidden = false; }catch(_){ } });\r\n    }catch(_){}\r\n  }\r\n  function localReset(){\r\n    try{\r\n      var ans = byId(\"hadResult\") || byId(\"hadAnswer\") || byId(\"answer\");\r\n      if (ans) ans.innerHTML = \"\";\r\n      var tTitle = byId(\"ansTitle\"); if (tTitle) tTitle.textContent = \"\";\r\n      var tQ = byId(\"ansQuestion\"); if (tQ) tQ.textContent = \"\";\r\n      var t = byId(\"hadQ\"); if (t) { t.value = \"\"; try { t.dispatchEvent(new Event(\"input\", {bubbles:true})); } catch(_) {} }\r\n      var c = byId(\"hadCount\") || document.querySelector(\".counter\"); if (c) { c.textContent = \"0\"; }\r\n      var b = byId(\"hadAskBtn\"); if (b) { try { b.disabled = true; } catch(_){ } }\r\n      try{ window.hadLatestDataURL = \"\"; if (window.top) window.top.hadLatestDataURL = \"\"; }catch(_){}\r\n      var hero = byId(\"hadHero\"); if (hero) { hero.innerHTML = \"\"; hero.style.backgroundImage = \"\"; hero.classList.remove(\"show\",\"loading\",\"fading\"); }\r\n      rmBanner(byId(\"diffTopImg\"));\r\n      rmBanner(byId(\"diffRightImg\"));\r\n      document.querySelectorAll(\".tile.is-selected, .tile.selected, .tile.is-active, .tile.active, [aria-selected='true']\").forEach(function(el){\r\n        el.classList.remove(\"is-selected\",\"selected\",\"is-active\",\"active\");\r\n        try{ el.removeAttribute(\"aria-selected\"); }catch(_){}\r\n      });\r\n\r\n\/\/ --- ADDED for small photo preview---\r\nvar prev = byId(\"hadUploadPreview\");\r\nif (prev) { \r\n  prev.style.display = \"none\"; \r\n  var im = prev.querySelector(\"img\"); \r\n  if (im) im.src = \"\"; \r\n}\r\n\/\/ --- END ADD ---\r\n\r\n      flipToAsk();\r\n    }catch(e){}\r\n  }\r\n  function runResetFlow(ev){\r\n    ev.preventDefault();\r\n    try{ if (typeof window.hadResetAll === \"function\") { window.hadResetAll(); } }catch(_){}\r\n    try{ document.dispatchEvent(new Event(\"had:reset\")); }catch(_){}\r\n    localReset();\r\n    var tilesReset = byId(\"hadFixesReset\");\r\n    if (tilesReset){ try{ tilesReset.click(); }catch(_){ } }\r\n  }\r\n  document.addEventListener(\"click\", function(e){\r\n    var btn = e.target && e.target.closest ? e.target.closest(\"#hadResetAllBtn\") : null;\r\n    if (btn){ runResetFlow(e); }\r\n  }, true);\r\n})();\r\n<\/script>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<script>\r\n(function(){\r\n  if (window.__HAD_UPLOAD_SOLID__) return; window.__HAD_UPLOAD_SOLID__ = true;\r\n  function byId(id){ return document.getElementById(id); }\r\nfunction setHero(src){\r\n  const hero = document.getElementById('hadHero');\r\n  if (!hero) return;\r\n  hero.innerHTML = '';\r\n  if (!src) return;\r\n\r\n  const img = document.createElement('img');\r\n  img.alt = 'DIY hero';\r\n  img.decoding = 'async';\r\n  img.loading = 'eager';\r\n  img.src = src;\r\n\r\n  \/\/ Detect if this is a base64 image; if so, try to pull the uploaded URL from WordPress uploads\r\n  let origin = '';\r\n  if (\/^data:image\\\/\/.test(src)) {\r\n    \/\/ If WordPress already has a latestDataURLUpload stored globally (after upload), use it\r\n    try {\r\n      origin = window.hadLatestUploadURL || '';\r\n    } catch(_) {}\r\n  } else if (src.includes('uploads')) {\r\n    origin = src;\r\n  }\r\n\r\n  \/\/ Fallback to base URL if nothing better found\r\n  if (!origin) origin = src;\r\n  img.setAttribute('data-origin', origin);\r\n\r\n  hero.appendChild(img);\r\n}\r\n  function downscaleToDataURL(file, maxW, cb){\r\n    try{\r\n      var fr = new FileReader();\r\n      fr.onerror = function(){ cb(new Error('read')); };\r\n      fr.onload = function(e){\r\n        try{\r\n          var im = new Image();\r\n          im.onload = function(){\r\n            try{\r\n              var w = im.naturalWidth||im.width||0, h = im.naturalHeight||im.height||0;\r\n              if (w > maxW){ h = Math.round(h * (maxW \/ w)); w = maxW; }\r\n              if (!w || !h){ return cb(new Error('dim')); }\r\n              var c = document.createElement('canvas'); c.width = w; c.height = h;\r\n              var g = c.getContext('2d'); g.drawImage(im, 0, 0, w, h);\r\n              var url = c.toDataURL('image\/jpeg', 0.85);\r\n              cb(null, url);\r\n            }catch(err){ cb(err); }\r\n          };\r\n          im.onerror = function(){ cb(new Error('img')); };\r\n          im.src = e.target && e.target.result ? String(e.target.result) : '';\r\n        }catch(err){ cb(err); }\r\n      };\r\n      fr.readAsDataURL(file);\r\n    }catch(err){ cb(err); }\r\n  }\r\n  function ensureInput(){\r\n    var inp = byId('hadUpload');\r\n    if (!inp){\r\n      var btn = byId('hadUploadBtn');\r\n      if (btn && btn.parentNode){\r\n        inp = document.createElement('input');\r\n        inp.type = 'file'; inp.id = 'hadUpload'; inp.accept = 'image\/*';\r\n        inp.style.position = 'absolute'; inp.style.left = '-9999px'; inp.style.width='1px'; inp.style.height='1px'; inp.style.opacity='0';\r\n        btn.parentNode.insertBefore(inp, btn.nextSibling);\r\n      }\r\n    }\r\n    return inp;\r\n  }\r\n  function renewInput(){\r\n    var old = byId('hadUpload');\r\n    if (!old || !old.parentNode) return ensureInput();\r\n    var nu = document.createElement('input');\r\n    nu.type = 'file'; nu.id = 'hadUpload'; nu.accept = 'image\/*';\r\n    nu.style.position='absolute'; nu.style.left='-9999px'; nu.style.width='1px'; nu.style.height='1px'; nu.style.opacity='0';\r\n    old.parentNode.replaceChild(nu, old);\r\n    return nu;\r\n  }\r\n  function attachChange(inp){\r\n    if (!inp || inp.__had_change__) return;\r\n    inp.__had_change__ = true;\r\n    inp.addEventListener('change', function(){\r\n      var f = (inp.files && inp.files[0]) || null;\r\n      if (!f) return;\r\n      downscaleToDataURL(f, 1024, function(err, dataURL){\r\n        var url = (!err && dataURL) ? dataURL : null;\r\n        if (!url){\r\n          try{\r\n            var fr = new FileReader();\r\n            fr.onload = function(e2){\r\n              var raw = e2.target && e2.target.result ? String(e2.target.result) : '';\r\n              try { window.hadLatestDataURL = raw; } catch(_){}\r\n              try { if (window.top) window.top.hadLatestDataURL = raw; } catch(_){}\r\n              setHero(raw);\r\n              var ref = renewInput(); attachChange(ref);\r\n            };\r\n            fr.readAsDataURL(f);\r\n            return;\r\n          }catch(_){}\r\n        }\r\ntry { window.hadLatestDataURL = url; } catch(_){}\r\ntry { if (window.top) window.top.hadLatestDataURL = url; } catch(_){}\r\n\r\n\/\/ If server returned a real upload URL (WordPress), prefer that over base64\r\nif (typeof url === 'string' && url.includes('\/uploads\/')) {\r\n  try { window.hadLatestUploadURL = url; } catch(_){}\r\n} else {\r\n  \/\/ Try to get final upload URL from API response if available\r\n  try {\r\n    const lastFetch = window.__hadLastVisionResponse__;\r\n    if (lastFetch && lastFetch.url && lastFetch.url.includes('\/uploads\/')) {\r\n      window.hadLatestUploadURL = lastFetch.url;\r\n    } else {\r\n      window.hadLatestUploadURL = '';\r\n    }\r\n  } catch(_) {\r\n    window.hadLatestUploadURL = '';\r\n  }\r\n}\r\n    setHero(url);\r\n    window.hadSmallPreviewUpdate(url);   \/\/ *** ADD THIS LINE ***\r\n    var ref2 = renewInput(); attachChange(ref2);\r\n\r\n      });\r\n    }, false);\r\n  }\r\n  function bind(){\r\n    var btn = byId('hadUploadBtn');\r\n    var inp = ensureInput();\r\n    if (btn && !btn.__had_open__){\r\n      btn.__had_open__ = true;\r\n      var open = function(ev){\r\n        try{ ev.stopPropagation(); }catch(_){}\r\n        \/\/ Do NOT preventDefault; keep gesture for programmatic click\r\n        try{ var cur = byId('hadUpload') || inp; if (cur) cur.click(); }catch(_){}\r\n        return false;\r\n      };\r\n      btn.addEventListener('pointerdown', open, true);\r\n      btn.addEventListener('click', open, true);\r\n      btn.addEventListener('touchstart', open, true);\r\n    }\r\n    attachChange(inp);\r\n  }\r\n  function rebind(){ bind(); }\r\n  if (document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', rebind, false); }\r\n  else { rebind(); }\r\n  document.addEventListener('click', function(ev){\r\n    var el = ev.target && ev.target.closest ? ev.target.closest('.tile') : null;\r\n    if (el){ setTimeout(rebind, 0); }\r\n  }, true);\r\n  document.addEventListener('had:reset', function(){\r\n    try{ var h = byId('hadHero'); if (h) h.innerHTML=''; }catch(_){}\r\n    setTimeout(rebind, 0);\r\n  }, false);\r\n})();\r\n\r\n<\/script>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<script>\r\n\/\/ __HAD_CARD_FLIP_CORE__\r\n(function(){\r\n  if (window.__HAD_CARD_FLIP_CORE__) return; window.__HAD_CARD_FLIP_CORE__ = true;\r\n  function setCardMode(on){ try{ document.documentElement.classList.toggle('had-card-active', !!on); }catch(_){}} \r\n  \/\/ Expose a helper for PHP\/tiles to call explicitly\r\n  window.hadFlipToCard = function(){ setCardMode(true); };\r\n  \/\/ Observe the answer card for content so tiles\/AI\/Vision all trigger the flip even if they don't call our helper\r\n  document.addEventListener('DOMContentLoaded', function(){\r\n    try{\r\n      var ac = document.getElementById('answerCard');\r\n      if (!ac) return;\r\n      var mo = new MutationObserver(function(){\r\n        try{\r\n          var hasContent = false;\r\n          var res = ac.querySelector('#hadResult, #answer, #hadAnswer');\r\n          if (res && res.innerHTML && res.innerHTML.trim() !== '') hasContent = true;\r\n          if (!hasContent){\r\n            var hero = ac.querySelector('#hadHero img');\r\n            if (hero && (hero.getAttribute('src')||'').trim() !== '') hasContent = true;\r\n          }\r\n          if (hasContent) setCardMode(true);\r\n        }catch(_){}\r\n      });\r\n      mo.observe(ac, { childList: true, subtree: true, attributes: true, attributeFilter: ['src','style','class'] });\r\n    }catch(_){}\r\n  }, false);\r\n  \/\/ Flip back on reset (handled elsewhere to cleanup; ensure class removal too)\r\n  document.addEventListener('had:reset', function(){ setCardMode(false); }, false);\r\n})();\r\n<\/script>\r\n<script>\r\n\/\/ __HAD_CARD_FLIP_MIN__\r\n(function(){\r\n  if (window.__HAD_CARD_FLIP_MIN__) return; window.__HAD_CARD_FLIP_MIN__ = true;\r\n  function setCardMode(on){ try{ document.documentElement.classList.toggle('had-card-active', !!on); }catch(_){}} \r\n  window.hadFlipToCard = function(){ setCardMode(true); };\r\n  document.addEventListener('had:reset', function(){ setCardMode(false); }, false);\r\n  \/\/ Delegated tile flip (clean fallback in case tile code doesn't call renderAnswer immediately)\r\n  })();\r\n<\/script>\r\n<script id=\"had-loading-min\">\r\n(function(){\r\n  if (window.__HAD_LOADING_MIN__) return; window.__HAD_LOADING_MIN__ = true;\r\n\r\n  \/\/ ================================\r\n  \/\/ LOADER DURATIONS \u2014 EDIT HERE\r\n  \/\/ ================================\r\n  \/\/ Tiles (article clicks)\r\n  var HAD_LOADER_TILE_MS = 3000;\r\n  \/\/ Standard AI (no photo)\r\n  var HAD_LOADER_AI_STANDARD_MS = 8000;\r\n  \/\/ Vision AI (photo attached)\r\n  var HAD_LOADER_AI_VISION_MS = 30000;  var __hadTimer = null;\r\n  function byId(id){ return document.getElementById(id); }\r\n\r\n  \/\/ Core: show for ms, then auto-hide\r\n  window.show = function(ms){\r\n    var el = byId('hadLoading'); if (!el) return;\r\n    if (__hadTimer){ try{ clearTimeout(__hadTimer); }catch(_){ } __hadTimer = null; }\r\n    el.classList.add('show');\r\n    __hadTimer = setTimeout(function(){ try{ el.classList.remove('show'); }catch(_){ } __hadTimer=null; }, ms);\r\n  };\r\n\r\n  function isVision(){\r\n    try{\r\n      var v = (window.top && window.top.hadLatestDataURL) ? String(window.top.hadLatestDataURL) : \"\";\r\n      return \/^data:image\\\/\/.test(v);\r\n    }catch(_){ return false; }\r\n  }\r\n\r\n  \/\/ Tiles: always HAD_LOADER_TILE_MS\r\n  document.addEventListener('pointerdown', function(e){\r\n    var t = e.target && e.target.closest ? e.target.closest('#hadFixesList a, #hadFixesList button, #hadFixesList .tile') : null;\r\n    if (t){ window.show(HAD_LOADER_TILE_MS); }\r\n  }, true);\r\n\r\n  \/\/ Ask button: Vision vs Standard\r\n  document.addEventListener('click', function(e){\r\n    var btn = e.target && e.target.closest ? e.target.closest('#hadAskBtn') : null;\r\n    if (btn){\r\n      var ms = isVision() ? HAD_LOADER_AI_VISION_MS : HAD_LOADER_AI_STANDARD_MS;\r\n      \/\/ Defer until after handlers so we don't interfere\r\n      setTimeout(function(){ window.show(ms); }, 0);\r\n    }\r\n  }, true);\r\n\r\n  \/\/ Keyboard submit: Ctrl\/Cmd+Enter in textarea \u2014 Vision vs Standard\r\n  document.addEventListener('keydown', function(e){\r\n    var t = e.target && e.target.closest ? e.target.closest('#hadQ') : null;\r\n    var isSubmit = t && (e.key === 'Enter' || e.keyCode === 13) && (e.metaKey || e.ctrlKey);\r\n    if (isSubmit){\r\n      var ms = isVision() ? HAD_LOADER_AI_VISION_MS : HAD_LOADER_AI_STANDARD_MS;\r\n      window.show(ms);\r\n    }\r\n  }, true);\r\n})();\r\n<\/script>\r\n<script>\r\n(function(){\r\n  if (window.__HAD_TOAST_LOADED__) return;\r\n  window.__HAD_TOAST_LOADED__ = true;\r\n\r\n  window.toast = function(msg){\r\n    let t = document.getElementById('hadToast');\r\n    if (!t) {\r\n      t = document.createElement('div');\r\n      t.id = 'hadToast';\r\n      t.setAttribute('role', 'status');\r\n      t.setAttribute('aria-live', 'polite');\r\n      t.style.position = 'fixed';\r\n      t.style.left = '50%';\r\n      t.style.bottom = '24px';\r\n      t.style.transform = 'translateX(-50%)';\r\n      t.style.background = '#111';\r\n      t.style.color = '#fff';\r\n      t.style.padding = '10px 14px';\r\n      t.style.borderRadius = '10px';\r\n      t.style.boxShadow = '0 6px 18px rgba(0,0,0,.2)';\r\n      t.style.fontSize = '14px';\r\n      t.style.opacity = '0';\r\n      t.style.pointerEvents = 'none';\r\n      t.style.transition = 'opacity .2s ease, transform .2s ease';\r\n      t.style.zIndex = '99999';\r\n      document.body.appendChild(t);\r\n    }\r\n    t.textContent = msg;\r\n    t.classList.add('show');\r\n    t.style.opacity = '1';\r\n    t.style.transform = 'translateX(-50%) translateY(-6px)';\r\n    clearTimeout(t.__tmr);\r\n    t.__tmr = setTimeout(() => {\r\n      t.style.opacity = '0';\r\n      t.style.transform = 'translateX(-50%)';\r\n    }, 3000);\r\n  };\r\n})();\r\n<\/script>\r\n\r\n<script>\r\nfunction hadRunShareAction(action) {\r\nconst title = document.getElementById(\"ansTitle\")?.textContent || \"Ask a Handyman\";\r\nconst html = document.getElementById(\"hadResult\")?.innerHTML || \"\";\r\nconst heroImg = document.querySelector(\"#hadHero img\")?.src || \"\";\r\nconst bannerImg = document.getElementById(\"diffTopImg\")?.src || \"\";\r\n\r\n\r\nfetch('\/wp-json\/had\/v1\/copy-tool', {\r\nmethod: \"POST\",\r\nheaders: { \"Content-Type\": \"application\/json\" },\r\nbody: JSON.stringify({\r\naction: action,\r\ntitle: title,\r\nhtml: html,\r\nhero_url: heroImg,\r\ndifficulty_banner: bannerImg,\r\nsource: \"ask-ui\"\r\n})\r\n})\r\n.then(res => {\r\nif (!res.ok) throw new Error(\"HTTP \" + res.status);\r\nreturn res.json();\r\n})\r\n.then(data => {\r\nif (!data || data.status !== \"ok\") throw new Error(\"Bad response\");\r\n\r\n\r\nif (action === \"copy\") {\r\nconst el = document.createElement(\"div\");\r\nel.innerHTML = data.html || \"(empty)\";\r\nel.style.position = \"absolute\";\r\nel.style.left = \"-9999px\";\r\ndocument.body.appendChild(el);\r\n\r\n\r\nconst range = document.createRange();\r\nrange.selectNodeContents(el);\r\nconst sel = window.getSelection();\r\nsel.removeAllRanges();\r\nsel.addRange(range);\r\ndocument.execCommand(\"copy\");\r\ndocument.body.removeChild(el);\r\n\r\n\r\nif (data.toast) toast(data.toast);\r\n}\r\n})\r\n.catch(err => {\r\ntoast(\"Copy failed: \" + err.message);\r\n});\r\n}\r\n\r\n\r\ndocument.getElementById(\"iconCopy\")?.addEventListener(\"click\", () => hadRunShareAction(\"copy\"));\r\n<\/script>\r\n\r\n\r\n\r\n<script>\r\ndocument.getElementById('iconPrint')?.addEventListener('click', function () {\r\n  const htmlLang = document.documentElement.lang || '';\r\n  const lang = htmlLang.toLowerCase().startsWith('fr') ? 'fr' : 'en';\r\n\r\n  let id = null;\r\n  let diff = null;\r\n\r\n  \/\/ 1. Try selected tile\r\n  const tile = document.querySelector('.tile.is-selected[data-id]');\r\n  if (tile) {\r\n    id = tile.getAttribute('data-id');\r\n  }\r\n\r\n  \/\/ 2. AI fallback\r\n  if (!id) {\r\n    const ai = document.querySelector('.answer-card');\r\n    if (ai) {\r\n      id = ai.classList.contains('vision') ? 'vis-721014' : 'std-483920';\r\n\r\n      \/\/ NEW: detect difficulty class\r\n      const match = Array.from(ai.classList).find(c => c.startsWith('diff-'));\r\n      if (match) diff = match.replace('diff-', '');\r\n    }\r\n  }\r\n\r\n  \/\/ 3. Final fallback\r\n  if (!id) id = 'std-483920';\r\n\r\n  \/\/ Build print URL\r\n  let url = `\/wp-json\/had\/v1\/print?id=${id}&lang=${lang}`;\r\n  if (diff) url += `&diff=${diff}`;\r\n\r\n  \/\/ Open print window and close it after printing\r\n  const newTab = window.open(url, '_blank');\r\n\r\n  const timer = setInterval(() => {\r\n    if (newTab.closed) clearInterval(timer);\r\n    try {\r\n      if (newTab.document.readyState === 'complete') {\r\n        newTab.focus();\r\n      }\r\n    } catch (e) {}\r\n  }, 500);\r\n});\r\n<\/script>\r\n\r\n\r\n<script>\r\nfunction hadOpenEmail() {\r\n  try {\r\n    const modal = document.getElementById('hadEmailModal');\r\n    if (!modal) return false;\r\n\r\n    const htmlLang = document.documentElement.lang || '';\r\n    const lang = htmlLang.toLowerCase().startsWith('fr') ? 'fr' : 'en';\r\n\r\n    const tile = document.querySelector('.tile.is-selected[data-id]');\r\n    const isTile = !!tile;\r\n    let id;\r\n\r\n    if (isTile) {\r\n      id = tile.getAttribute('data-id');\r\n      sessionStorage.removeItem('had_ai_temp_id');\r\n    } else {\r\n      const ai = document.querySelector('.answer-card');\r\n      if (ai) {\r\n        const tempId = sessionStorage.getItem('had_ai_temp_id');\r\n        id = tempId || (ai.classList.contains('vision') ? 'vis-721014' : 'std-483920');\r\n      }\r\n    }\r\n    if (!id) id = 'std-483920';\r\n\r\n    function openModal(finalId) {\r\n      const iframe = modal.querySelector('iframe');\r\n      if (iframe)\r\n        iframe.src = `${window.location.origin}\/wp-json\/had3\/v1\/email?id=${finalId}&lang=${lang}`;\r\n      modal.style.display = 'flex';\r\n    }\r\n\r\n    if (!isTile) {\r\n      const aiCard = document.querySelector('.answer-card');\r\n      if (aiCard) {\r\n\r\n        \/\/ --- HERO IMAGE DETECTION (new path) ---\r\n        let hero = '';\r\n        const heroImg = document.querySelector('#hadHero img');\r\n        if (window.hadLatestUploadURL && window.hadLatestUploadURL.includes('uploads\/')) {\r\n          hero = window.hadLatestUploadURL;\r\n          console.log('Hero from global upload URL:', hero);\r\n        } else if (heroImg) {\r\n          const src = heroImg.getAttribute('src') || '';\r\n          if (src.includes('uploads')) {\r\n            hero = src;\r\n            console.log('Hero detected from DOM:', hero);\r\n          }\r\n        }\r\n\r\n        \/\/ --- DIFFICULTY DETECTION ---\r\n        let diff = 'effortless';\r\n        const diffMatch =\r\n          aiCard.outerHTML.match(\/Difficulty[^:]*[:>]\\s*<\\\/?\\w*>\\s*([A-Za-z]+)\/i) ||\r\n          aiCard.outerHTML.match(\/Difficulty[^:]*[:>]\\s*([A-Za-z]+)\/i);\r\n\r\n        if (diffMatch && diffMatch[1]) diff = diffMatch[1].toLowerCase().trim();\r\n\r\n        \/\/ --- CLEAN DESKTOP BANNERS ---\r\n        let cleanHtml = aiCard.outerHTML;\r\n        cleanHtml = cleanHtml.replace(\/<[^>]*>\\s*DIY\\s*difficulty\\s*desktop\\s*banner[^<]*<\\\/[^>]*>\/gi, '');\r\n        cleanHtml = cleanHtml.replace(\/<img[^>]*desktop[^>]*>\/gi, '');\r\n        cleanHtml = cleanHtml.replace(\/<p>\\s*<\\\/p>\/gi, '');\r\n\r\n        \/\/ --- SAVE AI TRANSIENT ---\r\n        fetch('\/wp-json\/had3\/v1\/save-ai', {\r\n          method: 'POST',\r\n          headers: { 'Content-Type': 'application\/json' },\r\n          body: JSON.stringify({\r\n            hero_url: hero,\r\n            content_html: cleanHtml,\r\n            difficulty_slug: diff\r\n          })\r\n        })\r\n          .then(r => r.json())\r\n          .then(d => {\r\n            if (d && d.id) {\r\n              sessionStorage.setItem('had_ai_temp_id', d.id);\r\n              openModal(d.id);\r\n            } else {\r\n              openModal(id);\r\n            }\r\n          })\r\n          .catch(() => openModal(id));\r\n\r\n        return false;\r\n      }\r\n    }\r\n\r\n    openModal(id);\r\n    return false;\r\n  } catch {\r\n    return false;\r\n  }\r\n}\r\n<\/script>\r\n\r\n\r\n\r\n<!-- Next -->\r\n<script>\r\n(function(){\r\n  function hadCloseEmailModal(){\r\n    var m = document.getElementById('hadEmailModal');\r\n    if (!m) return;\r\n    m.style.display = 'none';\r\n    var iframe = m.querySelector('iframe');\r\n    if (iframe) iframe.src = 'about:blank';\r\n  }\r\n  window.hadCloseEmailModal = hadCloseEmailModal;\r\n\r\n  window.addEventListener('message', function(ev){\r\n    if (!ev || !ev.data || !ev.data.type) return;\r\n\r\n    if (ev.data.type === 'emailCancel') {\r\n      hadCloseEmailModal();\r\n    }\r\n  });\r\n})();\r\n<\/script>\r\n\r\n\r\n<script>\r\n(function(){\r\n  if (window.__HAD_NATIVE_SHARE_ATTACHED__) return; window.__HAD_NATIVE_SHARE_ATTACHED__ = true;\r\n\r\n  function byId(id){ return document.getElementById(id); }\r\n\r\n  async function hadRunShare(){\r\n    const title = byId('ansTitle')?.textContent || 'Ask a Handyman';\r\n    const excerpt = document.querySelector('#hadResult p')?.textContent || '';\r\n    const heroImg = document.querySelector('#hadHero img')?.src || '';\r\n    const slug = document.body.getAttribute('data-had-article-id') || '';\r\n    const lang = (document.documentElement.lang||'en').toLowerCase().startsWith('fr') ? 'fr' : 'en';\r\n\r\n    try {\r\n      const r = await fetch('\/wp-json\/had\/v1\/share-tool', {\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application\/json' },\r\n        body: JSON.stringify({ title, excerpt, hero_url: heroImg, slug, lang })\r\n      });\r\n      if (!r.ok) throw new Error('HTTP '+r.status);\r\n      const data = await r.json();\r\n      if (!data || data.status !== 'success') throw new Error('Invalid response');\r\n      const links = data.links || {};\r\n\r\n      const shareData = {\r\n        title: title,\r\n        text: excerpt || title,\r\n        url: links.copy || 'https:\/\/handymananddesigns.com\/ask-a-handyman'\r\n      };\r\n\r\n      if (navigator.share) {\r\n        try {\r\n          await navigator.share(shareData);\r\n          toast(lang==='fr'?'Partag\u00e9 avec succ\u00e8s!':'Shared successfully!');\r\n        } catch (err) {\r\n          if (err && err.name !== 'AbortError') toast('Share failed: '+err.message);\r\n        }\r\n      } else {\r\n        \/\/ Fallback to copy if native share unsupported\r\n        try {\r\n          await navigator.clipboard.writeText(shareData.url);\r\n          toast(lang==='fr'?'Lien copi\u00e9!':'Link copied!');\r\n        } catch(_){ toast('Copy failed'); }\r\n      }\r\n\r\n    } catch (err) {\r\n      toast('Share failed: '+err.message);\r\n    }\r\n  }\r\n\r\n  document.getElementById('iconShare')?.addEventListener('click', hadRunShare);\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function(){\r\n  \/\/ --- Globals for small preview ---\r\n  let smallPreview, smallImg, smallRemoveBtn;\r\n\r\n  \/\/ Called by BIG upload engine whenever it finishes loading an image\r\n  window.hadSmallPreviewUpdate = function(dataURL){\r\n    try {\r\n      if (!smallPreview || !smallImg) return;\r\n      if (!dataURL) return;\r\n\r\n      smallImg.src = dataURL;\r\n      smallPreview.style.display = \"block\";\r\n    } catch(_){}\r\n  };\r\n\r\n  \/\/ Clear preview + hero + globals\r\n  window.hadSmallPreviewClear = function(){\r\n    try {\r\n      if (smallPreview) smallPreview.style.display = \"none\";\r\n      if (smallImg) smallImg.src = \"\";\r\n\r\n      \/\/ Clear big engine globals\r\n      try { window.hadLatestDataURL = \"\"; } catch(_){}\r\n      try { window.hadLatestUploadURL = \"\"; } catch(_){}\r\n\r\n      \/\/ Clear hero\r\n      const hero = document.getElementById(\"hadHero\");\r\n      if (hero) hero.innerHTML = \"\";\r\n\r\n      \/\/ Clear actual file input (which may have been renewed)\r\n      const realInput = document.getElementById(\"hadUpload\");\r\n      if (realInput) realInput.value = \"\";\r\n    } catch(_){}\r\n  };\r\n\r\n  \/\/ Attach change listener to the current input (even after renewInput)\r\n  window.hadSmallPreviewBindInput = function(inp){\r\n    if (!inp) return;\r\n    inp.addEventListener(\"change\", function(e){\r\n      const file = e.target.files && e.target.files[0];\r\n      if (!file) return;\r\n\r\n      \/\/ We DO NOT read the file here.\r\n      \/\/ The BIG upload engine will call hadSmallPreviewUpdate() after downscaleToDataURL()\r\n      \/\/ So here we ONLY wait for big engine to handle it.\r\n\r\n      \/\/ Small preview will appear once big engine fires hadSmallPreviewUpdate()\r\n    });\r\n  };\r\n\r\n  \/\/ Init once DOM is ready\r\n  document.addEventListener(\"DOMContentLoaded\", function(){\r\n    smallPreview = document.getElementById(\"hadUploadPreview\");\r\n    smallImg = smallPreview ? smallPreview.querySelector(\"img\") : null;\r\n    smallRemoveBtn = document.getElementById(\"hadUploadRemove\");\r\n\r\n    \/\/ Bind remove button\r\n    if (smallRemoveBtn) {\r\n      smallRemoveBtn.addEventListener(\"click\", function(e){\r\n        e.preventDefault();\r\n        window.hadSmallPreviewClear();\r\n      });\r\n    }\r\n\r\n    \/\/ Bind to original input\r\n    const initialInput = document.getElementById(\"hadUpload\");\r\n    if (initialInput){\r\n      window.hadSmallPreviewBindInput(initialInput);\r\n    }\r\n\r\n    \/\/ Watch for input being replaced by big engine\r\n    const observer = new MutationObserver(() => {\r\n      const fresh = document.getElementById(\"hadUpload\");\r\n      if (fresh) window.hadSmallPreviewBindInput(fresh);\r\n    });\r\n    observer.observe(document.body, { childList: true, subtree: true });\r\n  });\r\n})();\r\n<\/script>\r\n\r\n\r\n\r\n<script>\r\n(function(){\r\n\r\n  function applyAIBanner(){\r\n    try {\r\n      var dTop = document.getElementById(\"diffTopImg\");\r\n      if (!dTop) return;\r\n\r\n      \/\/ Always show the banner when AI answer is rendered\r\n      dTop.style.display = \"block\";\r\n      dTop.hidden = false;\r\n\r\n      \/\/ Find AI difficulty number\r\n      var el = document.querySelector(\".had-ai-diff\");\r\n      if (!el) return;\r\n\r\n      var rating = parseInt((el.textContent || \"\").trim(), 10);\r\n      if (!rating || rating < 1 || rating > 6) return;\r\n\r\n      \/\/ Map rating \u2192 slug\r\n      var map = {\r\n        1: \"effortless\",\r\n        2: \"manageable\",\r\n        3: \"moderate\",\r\n        4: \"challenging\",\r\n        5: \"advanced\",\r\n        6: \"professional\"\r\n      };\r\n\r\n      var slug = map[rating];\r\n      if (!slug) return;\r\n\r\n      \/\/ Build mobile banner URL\r\n      var base = \"https:\/\/handymananddesigns.com\/wp-content\/uploads\/\";\r\n      var url = base + \"handymananddesigns-ask-a-handyman-difficulty-\" +\r\n                rating + \"-mobile-\" + slug + \".jpg\";\r\n\r\n      \/\/ Apply banner\r\n      dTop.src = url;\r\n      dTop.style.display = \"block\";\r\n      dTop.hidden = false;\r\n\r\n    } catch(e){\r\n      console.warn(\"AI banner failed:\", e);\r\n    }\r\n  }\r\n\r\n\r\n  \/\/ Watches for AI rendering inside the answer card\r\n  var target = document.getElementById(\"answerCard\");\r\n  if (target) {\r\n    var obs = new MutationObserver(applyAIBanner);\r\n    obs.observe(target, { childList: true, subtree: true });\r\n  }\r\n\r\n\r\n  \/\/ Hide banner ONLY when Reset Page button is clicked\r\n  document.addEventListener(\"click\", function(ev){\r\n    if (ev.target && ev.target.id === \"hadResetAllBtn\") {\r\n      var dTop = document.getElementById(\"diffTopImg\");\r\n      if (dTop) {\r\n        dTop.style.display = \"none\";\r\n        dTop.hidden = true;\r\n        dTop.src = \"\";\r\n      }\r\n    }\r\n  }, true);\r\n\r\n})();\r\n<\/script>\r\n\r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n    const zone = document.querySelector(\".had-dnd-zone\");\r\n    if (!zone) return;\r\n\r\n    \/\/ Basic highlight on drag-over\r\n    function addHighlight() {\r\n        zone.style.outline = \"2px dashed #888\";\r\n        zone.style.outlineOffset = \"4px\";\r\n        zone.style.backgroundColor = \"rgba(0,0,0,0.03)\";\r\n    }\r\n    function removeHighlight() {\r\n        zone.style.outline = \"\";\r\n        zone.style.outlineOffset = \"\";\r\n        zone.style.backgroundColor = \"\";\r\n    }\r\n\r\n    \/\/ Prevent default browser behavior\r\n    [\"dragenter\",\"dragover\",\"dragleave\",\"drop\"].forEach(evt => {\r\n        zone.addEventListener(evt, function (e) {\r\n            e.preventDefault();\r\n            e.stopPropagation();\r\n        });\r\n    });\r\n\r\n    zone.addEventListener(\"dragenter\", addHighlight);\r\n    zone.addEventListener(\"dragover\", addHighlight);\r\n    zone.addEventListener(\"dragleave\", removeHighlight);\r\n\r\n    zone.addEventListener(\"drop\", function (e) {\r\n        removeHighlight();\r\n\r\n        const dt = e.dataTransfer;\r\n        if (!dt || !dt.files || !dt.files.length) return;\r\n\r\n        const file = dt.files[0];\r\n        if (!file) return;\r\n\r\n        \/\/ Feed file into the real <input id=\"hadUpload\">\r\n        const input = document.getElementById(\"hadUpload\");\r\n        if (!input) return;\r\n\r\n        \/\/ Create a DataTransfer so we can assign to input.files\r\n        const transfer = new DataTransfer();\r\n        transfer.items.add(file);\r\n        input.files = transfer.files;\r\n\r\n        \/\/ Trigger the same event as manual upload\r\n        input.dispatchEvent(new Event(\"change\", { bubbles: true }));\r\n    });\r\n});\r\n<\/script>\r\n\r\n<script>\r\n(function(){\r\n  if (window.__HAD_AFF_SLUG_WATCH__) return;\r\n  window.__HAD_AFF_SLUG_WATCH__ = true;\r\n\r\n  function isSlugCandidate(node){\r\n    if (!node || node.nodeType !== 1 || node.tagName !== 'DIV') return false;\r\n    if (node.attributes.length > 0) return false; \/\/ only plain <div>...<\/div>\r\n    var txt = (node.textContent || '').trim();\r\n    if (!txt) return false;\r\n    if (!\/^[a-z0-9-]+$\/i.test(txt)) return false;\r\n    return true;\r\n  }\r\n\r\n  function transform(container){\r\n    if (!container) return;\r\n    var nodes = container.querySelectorAll('div');\r\n    nodes.forEach(function(node){\r\n      if (!isSlugCandidate(node)) return;\r\n      if (node.dataset && node.dataset.hadAffLoaded === '1') return;\r\n\r\n      var slug = (node.textContent || '').trim();\r\n      node.dataset.hadAffLoaded = '1';\r\n\r\n      var placeholder = node;\r\n\r\n      fetch('\/wp-json\/had3\/v1\/affiliate?slug=' + encodeURIComponent(slug))\r\n        .then(function(r){ return r.text(); })\r\n        .then(function(html){\r\n          if (!html) return;\r\n          placeholder.outerHTML = html;\r\n        })\r\n        .catch(function(){\r\n          \/\/ On error, keep slug unchanged\r\n        });\r\n    });\r\n  }\r\n\r\n  function initWatch(){\r\n    var container = document.getElementById('hadResult');\r\n    if (!container) return;\r\n\r\n    transform(container);\r\n\r\n    var mo = new MutationObserver(function(){\r\n      transform(container);\r\n    });\r\n    mo.observe(container, { childList: true, subtree: true });\r\n  }\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', initWatch, { once: true });\r\n  } else {\r\n    initWatch();\r\n  }\r\n})();\r\n<\/script>\r\n<div id=\"hadEmailModal\" style=\"display:none; position:fixed; top:0; left:0; right:0; bottom:0; z-index:9999; background:rgba(0,0,0,0.5); justify-content:center; align-items:center;\">\r\n  <div style=\"background:#fff; border-radius:10px; overflow:hidden; width:420px; max-width:100%; box-shadow:0 10px 30px rgba(0,0,0,0.2);\">\r\n    <iframe src=\"\" style=\"border:none; width:100%; height:300px;\"><\/iframe>\r\n  <\/div>\r\n<\/div>\r\n","protected":false},"excerpt":{"rendered":"Demandez \u00e0 un Handyman Des r\u00e9ponses pratiques pour des probl\u00e8mes r\u00e9els. T\u00e9l\u00e9versez une photo, d\u00e9crivez votre probl\u00e8me, recevez une r\u00e9ponse&nbsp;bricolage&nbsp;amicale&nbsp;IA** \u00d7 T\u00c9L\u00c9VERSER UNE PHOTO ou GLISSER &amp; D\u00c9POSER JPG\/GIF\/PNG Moins de 4&nbsp;MB 0\/300 Obtenir une r\u00e9ponse Notre IA Handyman offre des suggestions rapides de bricolage pour vous aider \u00e0 d\u00e9marrer \u2014 mais \u00e7a reste un [&hellip;]","protected":false},"author":2,"featured_media":10544,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"fullwidth.php","meta":{"footnotes":""},"class_list":["post-9029","page","type-page","status-publish","has-post-thumbnail","hentry"],"translation":{"provider":"WPGlobus","version":"3.0.0","language":"fr","enabled_languages":["en","fr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Demandez \u00e0 un bricoleur | Handyman And Designs<\/title>\n<meta name=\"description\" content=\"T\u00e9l\u00e9versez une photo, montrez ce qu\u2019il y a \u00e0 r\u00e9parer et obtenez une solution de bricolage sign\u00e9e Handyman et Conceptions\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/handymananddesigns.com\/ask-a-handyman\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Demandez \u00e0 un bricoleur | Handyman And Designs\" \/>\n<meta property=\"og:description\" content=\"T\u00e9l\u00e9versez une photo, montrez ce qu\u2019il y a \u00e0 r\u00e9parer et obtenez une solution de bricolage sign\u00e9e Handyman et Conceptions\" \/>\n<meta property=\"og:url\" content=\"https:\/\/handymananddesigns.com\/ask-a-handyman\" \/>\n<meta property=\"og:site_name\" content=\"Handyman And Designs\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/HandymanAndDesignscom-1917753401876321\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-10T21:06:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-share-en.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/handymananddesigns.com\/ask-a-handyman\",\"url\":\"https:\/\/handymananddesigns.com\/ask-a-handyman\",\"name\":\"Demandez \u00e0 un bricoleur | Handyman And Designs\",\"isPartOf\":{\"@id\":\"https:\/\/handymananddesigns.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/handymananddesigns.com\/ask-a-handyman#primaryimage\"},\"image\":{\"@id\":\"https:\/\/handymananddesigns.com\/ask-a-handyman#primaryimage\"},\"thumbnailUrl\":\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-share-en.jpg\",\"datePublished\":\"2025-08-14T20:29:16+00:00\",\"dateModified\":\"2025-12-10T21:06:34+00:00\",\"description\":\"T\u00e9l\u00e9versez une photo, montrez ce qu\u2019il y a \u00e0 r\u00e9parer et obtenez une solution de bricolage sign\u00e9e Handyman et Conceptions\",\"breadcrumb\":{\"@id\":\"https:\/\/handymananddesigns.com\/ask-a-handyman#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/handymananddesigns.com\/ask-a-handyman\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/handymananddesigns.com\/ask-a-handyman#primaryimage\",\"url\":\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-share-en.jpg\",\"contentUrl\":\"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-share-en.jpg\",\"width\":1200,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/handymananddesigns.com\/ask-a-handyman#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/handymananddesigns.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ask a Handyman\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/handymananddesigns.com\/#website\",\"url\":\"https:\/\/handymananddesigns.com\/\",\"name\":\"Handyman And Designs\",\"description\":\"Petits et moyens boulots et conceptions!\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/handymananddesigns.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Demandez \u00e0 un bricoleur | Handyman And Designs","description":"T\u00e9l\u00e9versez une photo, montrez ce qu\u2019il y a \u00e0 r\u00e9parer et obtenez une solution de bricolage sign\u00e9e Handyman et Conceptions","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:\/\/handymananddesigns.com\/ask-a-handyman","og_locale":"fr_FR","og_type":"article","og_title":"Demandez \u00e0 un bricoleur | Handyman And Designs","og_description":"T\u00e9l\u00e9versez une photo, montrez ce qu\u2019il y a \u00e0 r\u00e9parer et obtenez une solution de bricolage sign\u00e9e Handyman et Conceptions","og_url":"https:\/\/handymananddesigns.com\/ask-a-handyman","og_site_name":"Handyman And Designs","article_publisher":"https:\/\/www.facebook.com\/HandymanAndDesignscom-1917753401876321","article_modified_time":"2025-12-10T21:06:34+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-share-en.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/handymananddesigns.com\/ask-a-handyman","url":"https:\/\/handymananddesigns.com\/ask-a-handyman","name":"Demandez \u00e0 un bricoleur | Handyman And Designs","isPartOf":{"@id":"https:\/\/handymananddesigns.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/handymananddesigns.com\/ask-a-handyman#primaryimage"},"image":{"@id":"https:\/\/handymananddesigns.com\/ask-a-handyman#primaryimage"},"thumbnailUrl":"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-share-en.jpg","datePublished":"2025-08-14T20:29:16+00:00","dateModified":"2025-12-10T21:06:34+00:00","description":"T\u00e9l\u00e9versez une photo, montrez ce qu\u2019il y a \u00e0 r\u00e9parer et obtenez une solution de bricolage sign\u00e9e Handyman et Conceptions","breadcrumb":{"@id":"https:\/\/handymananddesigns.com\/ask-a-handyman#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/handymananddesigns.com\/ask-a-handyman"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/handymananddesigns.com\/ask-a-handyman#primaryimage","url":"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-share-en.jpg","contentUrl":"https:\/\/handymananddesigns.com\/wp-content\/uploads\/handymananddesigns-ask-a-handyman-share-en.jpg","width":1200,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/handymananddesigns.com\/ask-a-handyman#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/handymananddesigns.com\/"},{"@type":"ListItem","position":2,"name":"Ask a Handyman"}]},{"@type":"WebSite","@id":"https:\/\/handymananddesigns.com\/#website","url":"https:\/\/handymananddesigns.com\/","name":"Handyman And Designs","description":"Petits et moyens boulots et conceptions!","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/handymananddesigns.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"}]}},"_links":{"self":[{"href":"https:\/\/handymananddesigns.com\/fr\/wp-json\/wp\/v2\/pages\/9029","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/handymananddesigns.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/handymananddesigns.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/handymananddesigns.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/handymananddesigns.com\/fr\/wp-json\/wp\/v2\/comments?post=9029"}],"version-history":[{"count":5,"href":"https:\/\/handymananddesigns.com\/fr\/wp-json\/wp\/v2\/pages\/9029\/revisions"}],"predecessor-version":[{"id":9031,"href":"https:\/\/handymananddesigns.com\/fr\/wp-json\/wp\/v2\/pages\/9029\/revisions\/9031"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/handymananddesigns.com\/fr\/wp-json\/wp\/v2\/media\/10544"}],"wp:attachment":[{"href":"https:\/\/handymananddesigns.com\/fr\/wp-json\/wp\/v2\/media?parent=9029"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}