{"id":5586,"date":"2026-10-11T02:32:05","date_gmt":"2026-10-11T02:32:05","guid":{"rendered":"https:\/\/housefly.com\/services\/hvac\/"},"modified":"2026-10-11T02:32:05","modified_gmt":"2026-10-11T02:32:05","slug":"hvac","status":"publish","type":"page","link":"https:\/\/housefly.com\/es\/services\/hvac\/","title":{"rendered":"HVAC"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"5586\" class=\"elementor elementor-5586\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-464c961 e-con-full e-flex e-con e-parent\" data-id=\"464c961\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4efcae1 elementor-widget elementor-widget-html\" data-id=\"4efcae1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style id=\"hfc-css\">\n.hfc,.hfc *{box-sizing:border-box}.hfc{font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;color:#0b172a;position:relative;width:100vw;max-width:100vw;margin-left:calc(50% - 50vw);background:#fff;text-align:left}\n.hfc-hero{position:relative;width:100%;margin-top:calc(-1 * var(--hf-header-h, 88px));padding:calc(84px + var(--hf-header-h, 88px)) 24px 64px;text-align:center;color:#fff;\n background:linear-gradient(180deg,rgba(11,23,42,.40),rgba(11,23,42,.84)),url(\"https:\/\/housefly.com\/account\/front_assets\/pro-hero-hv.jpg\") 62% 30%\/cover no-repeat,#0b172a}\n.hfc-ey{font-size:20px;font-weight:800;letter-spacing:3px;text-transform:uppercase;color:#41C7F5!important;margin:0}.hfc-lead{color:rgba(255,255,255,.92)!important}#hfc .hfc-hero .hfc-ey{color:#41C7F5!important;-webkit-text-fill-color:#41C7F5}\n.hfc-h1{font-size:60px;font-weight:800;letter-spacing:-1.5px;line-height:1.04;margin:12px 0 14px;color:#fff}.hfc-h1 span{background:linear-gradient(90deg,#41C7F5,#5cd67a);-webkit-background-clip:text;background-clip:text;color:transparent}\n.hfc-lead{font-size:18px;line-height:1.55;max-width:600px;margin:0 auto;color:rgba(255,255,255,.92)}\n.hfc-srch{max-width:660px;margin:28px auto 0;display:flex;align-items:center;background:#fff;border:1.5px solid #40C9F3;border-radius:999px;padding:7px 7px 7px 22px;box-shadow:0 0 0 6px rgba(64,201,243,.16),0 24px 60px -18px rgba(0,0,0,.45)}\n.hfc-srch svg{flex:none;color:#94a3b8;margin-right:10px}\n.hfc-srch input{flex:1;border:0!important;outline:0;font:500 17px Inter,sans-serif;padding:12px 0!important;color:#16233A;min-width:0;background:transparent!important;box-shadow:none!important;height:auto;border-radius:0}\n.hfc-srch input::placeholder{color:#8CA0B8}\n.hfc .hfc-srch button,.hfc .hfc-srch button:focus{flex:none;border:0;border-radius:999px;background:#40C9F3;color:#fff;font:700 16px Inter,sans-serif;padding:14px 30px;cursor:pointer;transition:background .15s}\n.hfc .hfc-srch button:hover{background:#2ED87A;color:#fff}\n.hfc-btn{display:inline-flex;align-items:center;justify-content:center;background:#41C7F5;color:#0b172a!important;font-weight:800;font-size:15px;border-radius:11px;padding:14px 22px;border:0;cursor:pointer;font-family:inherit;text-decoration:none!important;line-height:1.1}\n.hfc-btn:disabled{opacity:.55;cursor:default}\n.hfc-pop{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin:20px auto 0;max-width:660px}\n.hfc .hfc-pop button{display:inline-flex;align-items:center;border-radius:999px;background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.28);padding:9px 16px;font:600 15px Inter,sans-serif;color:#eaf2fa;cursor:pointer;transition:all .15s;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}\n.hfc-wrap{max-width:1240px;margin:0 auto;padding:0 29px}\n.hfc-lay{display:grid;grid-template-columns:minmax(0,1fr) 508px;gap:32px;align-items:stretch;padding:40px 0 58px}.hfc-box{position:relative;align-self:stretch}.hfc-box .hfc-nb{position:relative;top:0}\n.hfc-stp{display:flex;align-items:center;gap:11px;margin:0 0 13px}.hfc-stp i{font-style:normal;width:31px;height:31px;border-radius:5px;background:#0b172a;color:#41C7F5;font-weight:800;font-size:15px;display:flex;align-items:center;justify-content:center;flex:none}\n.hfc-stp h3{margin:0;font-size:22px;font-weight:800;letter-spacing:-.3px;color:#0b172a}.hfc-stp span{margin-left:auto;font-size:14px;color:#5a6b85}\n.hfc-blk{margin-bottom:31px}\n.hfc-lay>*,.hfc-sv>*,.hfc-aog>*{min-width:0}.hfc-sv{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:9px}\n.hfc-card{display:flex;gap:11px;align-items:center;border:1.5px solid #e3e9f1;border-radius:13px;padding:13px;background:#fff;cursor:pointer;text-align:left;font-family:inherit;width:100%;transition:border-color .15s,box-shadow .15s}\n.hfc-card:hover{border-color:#9fd6ee}.hfc-card.on{border-color:#29ABE2;background:#eef8fd;box-shadow:0 0 0 3px rgba(41,171,226,.15)}\n.hfc-ic{width:40px;height:40px;border-radius:5px;background:#f2f6fa;display:flex;align-items:center;justify-content:center;font-size:20px;flex:none}\n.hfc-card h4{margin:0;font-size:15px;font-weight:800;color:#0b172a;line-height:1.2}.hfc-card p{margin:2px 0 0;font-size:14px;color:#5a6b85;line-height:1.35}\n.hfc-more{display:flex;justify-content:center;align-items:center;gap:7px;border:1.5px dashed #9fd6ee;border-radius:11px;padding:13px;color:#1580b8;font-weight:800;font-size:14px;margin-top:9px;background:#fff;width:100%;cursor:pointer;font-family:inherit}\n.hfc-more span{font-weight:600;color:#5a6b85}\n.hfc-cat{margin-top:16px}.hfc-cat h5{margin:0 0 7px;font-size:14px;font-weight:800;letter-spacing:1.2px;text-transform:uppercase;color:#29ABE2}\n.hfc-aog{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:9px}\n.hfc-ao{display:flex;justify-content:space-between;align-items:center;gap:9px;border:1.5px solid #e3e9f1;border-radius:11px;padding:13px 14px;font-size:14px;font-weight:700;background:#fff;color:#0b172a;cursor:pointer;font-family:inherit;text-align:left;width:100%}\n.hfc-ao b{color:#1f9d55;white-space:nowrap;font-weight:800}.hfc-ao small{font-size:14px;font-weight:600;color:#5a6b85}.hfc-ao.on{border-color:#5cd67a;background:#effbf2}.hfc-ao:disabled{opacity:.45;cursor:default}\n.hfc-note{font-size:14px;color:#5a6b85;margin:0 0 11px}\n.hfc-nb{background:linear-gradient(160deg,#16243a,#0b172a 60%);border:1px solid rgba(65,199,245,.18);border-radius:17px;padding:22px;color:#fff;box-shadow:0 24px 50px rgba(11,23,42,.28)}\n.hfc-nb .t{font-size:23px;font-weight:800;letter-spacing:-.4px;line-height:1.15}\n.hfc-pill{display:inline-block;margin-top:8px;font-size:14px;font-weight:700;color:#8fe0ff;border:1px solid rgba(65,199,245,.4);background:rgba(65,199,245,.1);border-radius:77px;padding:5px 10px}\n.hfc-inc{border:1.5px solid rgba(255,255,255,.16);border-radius:9px;margin-top:12px}.hfc-inc button{display:flex;justify-content:space-between;width:100%;background:none;border:0;color:#fff;padding:12px 14px;font:800 14px Inter,sans-serif;letter-spacing:1.4px;cursor:pointer}\n.hfc-inc button span{color:#41C7F5}.hfc-inc ul{margin:0;padding:0 14px 11px 28px;font-size:14px;line-height:1.5;color:#d7e2ef}.hfc-inc li{margin:3px 0}\n.hfc-lbl{font-size:14px;font-weight:800;letter-spacing:1.4px;text-transform:uppercase;color:#9fb0c6;margin:12px 0 6px}\n.hfc-seg{display:grid;grid-template-columns:1fr 1fr;gap:8px}.hfc-seg.c3{grid-template-columns:repeat(3,1fr)}.hfc-seg.c4{grid-template-columns:1fr 1fr}\n.hfc-seg button{border:1.5px solid rgba(255,255,255,.2);border-radius:9px;padding:10px 6px;text-align:center;font:700 14px Inter,sans-serif;color:#fff;background:transparent;cursor:pointer}\n.hfc-seg button.on{border-color:#41C7F5;background:rgba(65,199,245,.14);color:#8fe0ff}\n.hfc-step{display:grid;grid-template-columns:40px 1fr 40px;gap:8px}.hfc-step button,.hfc-step div{border:1.5px solid rgba(255,255,255,.22);border-radius:9px;height:40px;display:flex;align-items:center;justify-content:center;font:800 15px Inter,sans-serif;color:#fff;background:transparent}\n.hfc-step button{cursor:pointer}.hfc-step button:disabled{opacity:.35;cursor:default}.hfc-step div{border-color:#41C7F5;color:#8fe0ff;font-size:15px}.hfc-step div small{font-size:14px;font-weight:600;margin-left:5px;opacity:.8}\n.hfc-rooms{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.hfc-rooms>div{border:1.5px solid rgba(255,255,255,.2);border-radius:9px;padding:9px 5px;text-align:center;font-weight:700;font-size:14px}\n.hfc-mini{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:5px}.hfc-mini button{width:25px;height:25px;border-radius:6px;border:1.5px solid rgba(255,255,255,.25);background:transparent;color:#8fe0ff;font:800 14px Inter,sans-serif;cursor:pointer}\n.hfc-mini button:disabled{opacity:.3;cursor:default}.hfc-mini b{font-size:19px;min-width:17px}\n.hfc-ex{border-top:1px solid rgba(255,255,255,.14);margin-top:14px;padding-top:5px}\n.hfc-li{display:flex;align-items:center;gap:8px;font-size:14px;padding:5px 0;color:#d7e2ef}.hfc-li span{flex:1}.hfc-li b{color:#5cd67a}.hfc-li .hfc-mini{margin:0}.hfc-li .hfc-mini b{font-size:14px}\n.hfc-li .x{background:none;border:0;color:#8a9bb2;font-size:14px;cursor:pointer;padding:0 2px}\n.hfc-foot{display:flex;align-items:center;justify-content:space-between;gap:9px;border-top:1px solid rgba(255,255,255,.14);margin-top:14px;padding-top:12px}\n.hfc-price{font-size:31px;font-weight:800;color:#5cd67a;letter-spacing:-.5px;line-height:1.05}.hfc-price.na{font-size:14px;color:#ffcf70}.hfc-foot p{margin:3px 0 0;font-size:14px;color:#9fb0c6}\n.hfc-ft{font-size:14px;color:#8a9bb2;text-align:center;margin-top:11px}.hfc-err{font-size:14px;color:#ffcf70;text-align:center;margin-top:8px}\n.hfc-bar{display:none}\n.hfc button{font-family:inherit;text-transform:none;box-shadow:none;outline:none;min-height:0;line-height:1.2}\n.hfc button{white-space:normal;word-break:normal}.hfc .hfc-card h4{color:#0b172a!important}.hfc .hfc-card p{color:#5a6b85!important;font-size:14px!important}.hfc .hfc-card{color:#0b172a!important}.hfc-card>span:last-child{flex:1;min-width:0}.hfc-ao>span{min-width:0}\n.hfc .hfc-card:hover,.hfc .hfc-card:focus{background:#fff;color:#0b172a}.hfc .hfc-card.on:hover,.hfc .hfc-card.on:focus{background:#eef8fd}\n.hfc .hfc-ao:hover,.hfc .hfc-ao:focus{background:#fff;color:#0b172a;border-color:#9fd6ee}.hfc .hfc-ao.on:hover,.hfc .hfc-ao.on:focus{background:#effbf2;border-color:#5cd67a}\n.hfc .hfc-more:hover,.hfc .hfc-more:focus{background:#f4f9fd;color:#1580b8}\n.hfc .hfc-btn:hover,.hfc .hfc-btn:focus{background:#6dd5f8;color:#0b172a}\n.hfc .hfc-seg button:hover,.hfc .hfc-seg button:focus{background:rgba(255,255,255,.06);color:#fff}.hfc .hfc-seg button.on:hover,.hfc .hfc-seg button.on:focus{background:rgba(65,199,245,.14);color:#8fe0ff}\n.hfc .hfc-step button:hover,.hfc .hfc-step button:focus,.hfc .hfc-mini button:hover,.hfc .hfc-mini button:focus{background:rgba(255,255,255,.08);color:#8fe0ff}\n.hfc .hfc-inc button:hover,.hfc .hfc-inc button:focus,.hfc .hfc-li .x:hover,.hfc .hfc-li .x:focus{background:none;color:#fff}\n.hfc .hfc-pop button:hover,.hfc .hfc-pop button:focus{background:rgba(64,201,243,.22);border-color:#40C9F3;color:#fff}\n.hfc-mini button{padding:0;display:inline-flex;align-items:center;justify-content:center}.hfc-step button{padding:0}\n@media(max-width:1100px){.hfc-lay{grid-template-columns:minmax(0,1fr) 454px;gap:22px}}\n@media(max-width:900px){.hfc-lay{grid-template-columns:minmax(0,1fr)}.hfc-box{position:static}.hfc-box .hfc-nb{position:static!important;width:auto!important}}\n@media(max-width:767px){.hfc-rooms{gap:5px}.hfc-rooms>div{padding:8px 2px;font-size:14px}.hfc-mini{gap:3px}.hfc-mini button{width:22px;height:22px;font-size:14px}.hfc-mini b{font-size:15px;min-width:11px}.hfc-li{gap:5px;font-size:14px}.hfc-li .hfc-mini b{font-size:14px}}\n@media(max-width:767px){.hfc-hero{padding:calc(48px + var(--hf-header-h, 70px)) 16px 40px;background-image:linear-gradient(180deg,rgba(11,23,42,.55),rgba(11,23,42,.9)),url(\"https:\/\/housefly.com\/account\/front_assets\/pro-hero-hv.jpg\")}\n.hfc-ey{font-size:15px;letter-spacing:1.8px}.hfc-h1{font-size:38px;letter-spacing:-1px}.hfc-lead{font-size:16px}\n.hfc-srch{margin-top:22px;padding:5px 5px 5px 16px}.hfc-srch svg{display:none}.hfc-srch input{font-size:16px;padding:10px 0!important}.hfc .hfc-srch button,.hfc .hfc-srch button:focus{padding:12px 16px;font-size:14px}.hfc-pop{gap:6px;margin-top:16px}.hfc .hfc-pop button{padding:8px 13px;font-size:14px}\n.hfc-wrap{padding:0 14px}.hfc-lay{gap:23px;padding:25px 0 0}.hfc-stp h3{font-size:18px}.hfc-sv,.hfc-aog{grid-template-columns:minmax(0,1fr)}\n.hfc-nb{padding:15px;border-radius:14px}.hfc-nb .t{font-size:19px}.hfc-price{font-size:25px}.hfc-btn{font-size:14px;padding:13px 16px}\n.hfc-bar{display:flex;position:sticky;bottom:0;z-index:5;justify-content:space-between;align-items:center;gap:11px;background:#0b172a;color:#fff;padding:11px 14px;margin:22px -14px 0;border-radius:14px 14px 0 0}\n.hfc-bar b{font-size:20px;color:#5cd67a;display:block}.hfc-bar small{display:block;color:#9fb0c6;font-size:14px}}\n@media(max-width:767px){.hfc-mini button{width:30px;height:30px}.hfc-step button,.hfc-step div{height:44px}}\n<\/style>\n<style id=\"hfc-css2\">\n.hfc .hfc-sv{align-items:start}\n.hfc-cw{border:1.5px solid #e3e9f1;border-radius:13px;background:#fff;transition:border-color .15s,box-shadow .15s;min-width:0}\n.hfc-cw:hover{border-color:#9fd6ee}.hfc-cw.on{border-color:#29ABE2;box-shadow:0 0 0 3px rgba(41,171,226,.15)}\n.hfc .hfc-cw>.hfc-card{border:0!important;box-shadow:none!important;border-radius:12px;position:relative;padding-right:40px}\n.hfc .hfc-cw.on>.hfc-card{background:#eef8fd}.hfc .hfc-cw.on>.hfc-card:not(:last-child){border-radius:12px 12px 0 0}\n.hfc-ck{position:absolute;top:12px;right:12px;width:22px;height:22px;border-radius:6px;border:1.5px solid #c9d6e4;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:800;color:#fff;background:#fff}\n.hfc-cw.on .hfc-ck{background:#29ABE2;border-color:#29ABE2}\n.hfc-opt{padding:4px 14px 14px;border-top:1px solid #e3e9f1}\n.hfc-opt .ol{font-size:14px;font-weight:800;letter-spacing:1.1px;text-transform:uppercase;color:#5a6b85;margin:12px 0 7px}\n.hfc-opt .os{display:flex;flex-wrap:wrap;gap:7px}\n.hfc .hfc-opt .os button{flex:1 1 auto;border:1.5px solid #dbe4ee;border-radius:10px;padding:9px 10px;font:700 14px Inter,sans-serif;color:#0b172a;background:#fff;cursor:pointer;text-align:center}\n.hfc .hfc-opt .os button.on,.hfc .hfc-opt .os button.on:hover{border-color:#29ABE2;background:#eef8fd;color:#0b6c99}\n.hfc .hfc-opt .os button:hover,.hfc .hfc-opt .os button:focus{background:#f6f9fc;color:#0b172a}.hfc .hfc-opt .os button small{font-size:14px;font-weight:600;color:#1f9d55}\n.hfc-opt .orw{display:flex;align-items:center;gap:10px;padding:6px 0;font-size:15px;color:#0b172a}.hfc-opt .orw>span{flex:1;min-width:0}\n.hfc-opt .orw small{display:block;font-size:14px;color:#5a6b85}\n.hfc-opt .om{display:flex;align-items:center;gap:8px;flex:none}\n.hfc .hfc-opt .om button{width:32px;height:32px;border-radius:8px;border:1.5px solid #c9d6e4;background:#fff;color:#1580b8;font:800 18px Inter,sans-serif;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}\n.hfc .hfc-opt .om button:hover,.hfc .hfc-opt .om button:focus{background:#f2f8fc;color:#1580b8}\n.hfc .hfc-opt .om button:disabled{opacity:.35;cursor:default}\n.hfc-opt .om b{min-width:22px;text-align:center;font-size:16px;color:#0b172a}.hfc-opt .om b.z{color:#94a3b8}\n.hfc-opt .ost{display:flex;align-items:center;gap:8px}.hfc-opt .ost .ov{flex:1;text-align:center;border:1.5px solid #dbe4ee;border-radius:10px;padding:7px 6px;font-weight:800;font-size:15px;color:#0b172a}\n.hfc-opt .ost .ov small{font-weight:600;color:#5a6b85;margin-left:5px;font-size:14px}\n.hfc-opt .orm{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px}.hfc-opt .orm>div{border:1.5px solid #dbe4ee;border-radius:10px;padding:8px 4px;text-align:center;font-size:14px;font-weight:700;color:#0b172a}\n.hfc-opt .orm .om{justify-content:center;margin-top:5px}\n.hfc-opt .oh{font-size:14px;color:#c2410c;margin:8px 0 0}\n.hfc .hfc-opt .oi{display:flex;justify-content:space-between;width:100%;background:none;border:0;padding:12px 0 0;font:800 14px Inter,sans-serif;letter-spacing:1.1px;color:#1580b8;cursor:pointer;text-transform:uppercase}\n.hfc .hfc-opt .oi:hover,.hfc .hfc-opt .oi:focus{background:none;color:#1580b8}\n.hfc-opt ul{margin:6px 0 0;padding-left:20px;font-size:14px;line-height:1.45;color:#3d4d66}\n.hfc-nb .t{font-size:23px}\n.hfc-nb .hfc-emp{font-size:15px;color:#9fb0c6;margin:12px 0 4px;line-height:1.45}\n.hfc-nb .hfc-ln{display:flex;gap:10px;align-items:flex-start;padding:11px 0;border-bottom:1px solid rgba(255,255,255,.1);font-size:15px;color:#fff}\n.hfc-nb .hfc-ln:last-child{border-bottom:0}.hfc-nb .hfc-ln>span{flex:1;min-width:0;font-weight:700;line-height:1.3}\n.hfc-nb .hfc-ln small{display:block;font-weight:500;font-size:14px;color:#9fb0c6;margin-top:2px}\n.hfc-nb .hfc-ln b{color:#5cd67a;white-space:nowrap;font-size:15px}.hfc-nb .hfc-ln b.q{color:#ffcf70}\n.hfc .hfc-nb .x,.hfc .hfc-nb .x:hover,.hfc .hfc-nb .x:focus{border:0!important;box-shadow:none!important;background:none!important;min-width:0;width:auto;height:auto;padding:0 2px;color:#8a9bb2;font-size:18px;line-height:1}.hfc .hfc-nb .x:hover{color:#fff}\n.hfc .hfc-nb .hfc-ln .x{background:none;border:0;color:#8a9bb2;font-size:18px;cursor:pointer;padding:0 2px;line-height:1}\n.hfc .hfc-nb .hfc-ln .x:hover,.hfc .hfc-nb .hfc-ln .x:focus{background:none;color:#fff}\n.hfc-nb .hfc-lns{margin-top:6px;max-height:52vh;overflow-y:auto}\n.hfc-sv{grid-auto-flow:row dense}.hfc-cw.wide{grid-column:1\/-1}.hfc-cw.wide .hfc-card h4{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.hfc-cw.wide .hfc-opt{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);column-gap:28px}.hfc-cw.wide .hfc-opt>.ol,.hfc-cw.wide .hfc-opt>.os,.hfc-cw.wide .hfc-opt>.ost,.hfc-cw.wide .hfc-opt>.orm,.hfc-cw.wide .hfc-opt>.oh,.hfc-cw.wide .hfc-opt>.oi,.hfc-cw.wide .hfc-opt>ul{grid-column:1\/-1}\n.hfc-cat{margin-top:26px}.hfc-cat .hfc-stp{margin-bottom:12px}\n.hfc-nb .hfc-sg{border-bottom:1px solid rgba(255,255,255,.1);padding:4px 0 8px}.hfc-nb .hfc-sg:last-child{border-bottom:0}\n.hfc-nb .hfc-sg .hfc-ln{border-bottom:0;padding:8px 0}.hfc-nb .hfc-row{padding:6px 0 6px 12px!important;border-left:2px solid rgba(65,199,245,.35)}\n.hfc-nb .hfc-sh{display:flex;align-items:center;gap:10px;padding:10px 0 4px;font-weight:800;font-size:15px;color:#fff}.hfc-nb .hfc-sh>span{flex:1}\n.hfc-bs{display:flex;align-items:center;gap:7px;flex:none}\n.hfc .hfc-bs button{width:28px;height:28px;border-radius:8px;border:1.5px solid rgba(255,255,255,.28);background:transparent;color:#8fe0ff;font:800 16px Inter,sans-serif;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}\n.hfc .hfc-bs button:hover,.hfc .hfc-bs button:focus{background:rgba(255,255,255,.08);color:#8fe0ff}.hfc .hfc-bs button:disabled{opacity:.3;cursor:default}\n.hfc-bs b{min-width:20px;text-align:center;color:#fff!important;font-size:15px}\n.hfc .hfc-sm{background:none;border:0;padding:2px 0;color:#41C7F5;font:700 14px Inter,sans-serif;cursor:pointer}.hfc .hfc-sm:hover,.hfc .hfc-sm:focus{background:none;color:#8fe0ff}\n.hfc-dsc{font-size:14px;line-height:1.5;color:#c9d6e6;padding:4px 0 6px}.hfc-dsc p{margin:0 0 4px}.hfc-dsc ul{margin:0;padding-left:18px}\n\/* HF-2026-10-10v: the hero subtext on ONE line (two at most on phones); the pills ONE row, never wider than the search bar *\/\n.hfc .hfc-hero .hfc-lead{max-width:none;white-space:nowrap}\n.hfc .hfc-pop{flex-wrap:nowrap;overflow:hidden;max-width:660px;width:100%}.hfc .hfc-pop button{flex:none;white-space:nowrap}\n@media(max-width:767px){.hfc .hfc-opt .om button{width:34px;height:34px}.hfc .hfc-hero .hfc-lead{white-space:normal;max-width:350px;font-size:16px}}\n<\/style>\n<!-- ================= HOUSE FLY \u2014 SMOKE SPLIT HERO + GLASS BOOKING CELL (production template, 2026-07-16) =================\n     Left: header + smoke service pills. Right: frosted-glass booking cell (live check-zip pricing, Book -> autobook -> cart).\n     Generated per page from pc-memory\/smoke-hero-template.html \u2014 edit the template, regenerate, redeploy. -->\n<style>\n@keyframes hfHeroKenBurns{0%{transform:scale(1) translate(0%,0%)}50%{transform:scale(1.06) translate(-1.5%,0.5%)}100%{transform:scale(1.10) translate(1.5%,-0.5%)}}\n@media (prefers-reduced-motion: reduce){.hfsk-hero::before{animation:none !important}}\nbody{overflow-x:hidden}\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961::before,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961::after{\n  max-height:none !important;min-height:0 !important;height:auto !important;\n  background-image:none !important;background-color:transparent !important;\n  flex-direction:column !important;align-items:stretch !important;justify-content:flex-start !important;\n  padding:0 !important;overflow:visible !important;border-radius:0 !important;box-shadow:none !important}\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961::before,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961::after{display:none !important;background:transparent !important;content:none !important}\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-4efcae1 .elementor-widget-container{display:block !important;width:100% !important}\n.hfsk-root{display:block;width:100%}\n.hfsk-root,.hfsk-root *{box-sizing:border-box}\n\/* ===== hero: full-bleed smoke split ===== *\/\n.hfsk-hero{position:relative;background:#10161f;overflow:hidden;isolation:isolate;color:#fff;\n  width:100vw;max-width:100vw;margin-left:calc(50% - 50vw);\n  margin-top:calc(-1 * var(--hf-header-h, 88px));\n  padding:calc(56px + var(--hf-header-h, 88px)) 40px 72px;\n  font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif}\n.hfsk-hero::before{content:\"\";position:absolute;top:0;left:0;right:0;bottom:0;background:url('https:\/\/housefly.com\/wp-content\/uploads\/2026\/03\/hero-cleaning-3-1536x864.webp') center\/cover no-repeat;opacity:.45;animation:hfHeroKenBurns 28s ease-in-out infinite alternate;will-change:transform;z-index:-2}\n.hfsk-hero::after{content:\"\";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(115deg,rgba(13,20,31,.92) 0%,rgba(13,20,31,.72) 45%,rgba(13,20,31,.55) 100%);z-index:-1;pointer-events:none}\n@media (max-width:1024px){.hfsk-hero::before{background-image:url('https:\/\/housefly.com\/wp-content\/uploads\/2026\/03\/hero-cleaning-3-1024x576.webp')}}\n.hfsk-cols{position:relative;z-index:2;max-width:1220px;margin:0 auto;display:grid;grid-template-columns:1.05fr 1fr;gap:56px;align-items:center}\n.hfsk-left{text-align:left}\n.hfsk-ey{font-size:clamp(16px,1.6vw,21px);font-weight:800;letter-spacing:.22em;color:#40C9F3;text-transform:uppercase;margin:0 0 12px;line-height:1.2}\n.hfsk-h1{font-size:clamp(34px,4.4vw,56px);font-weight:900;line-height:1.05;letter-spacing:-1.5px;margin:0 0 12px;color:#fff}\n.hfsk-h1 span{background:linear-gradient(90deg,#40C9F3,#2ED87A);-webkit-background-clip:text;background-clip:text;color:transparent}\n.hfsk-sub{color:rgba(201,214,230,.82);font-size:16.5px;font-weight:300;line-height:1.55;max-width:460px;margin:0 0 30px}\n.hfsk-rowlabel{font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.85);margin:0 0 12px}\n.hfsk-pills{display:flex;flex-wrap:wrap;gap:10px}\n#hfskCats{margin-bottom:24px}\n.hfsk-pill{display:inline-flex;align-items:center;font-family:inherit;font-size:14px;font-weight:700;color:#dfe9f5;\n  background:linear-gradient(180deg,rgba(255,255,255,.09),rgba(255,255,255,.02));border:1.5px solid rgba(255,255,255,.2);\n  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-radius:999px;padding:11px 19px;cursor:pointer;transition:all .16s}\n.hfsk-pill:hover:not(.on){border-color:rgba(255,255,255,.48)}\n.hfsk-pill.on{border-color:#40C9F3;background:linear-gradient(180deg,rgba(35,210,255,.26),rgba(35,210,255,.09));color:#fff;box-shadow:0 0 0 4px rgba(35,210,255,.14),0 12px 30px -12px rgba(35,210,255,.5)}\n.hfsk-pill:focus{outline:none}\n.hfsk-pill:focus-visible{outline:2px solid #40C9F3;outline-offset:2px}\n.hfsk-divider{max-width:420px;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.18),transparent);margin:2px 0 20px}\n#hfskSubs{display:flex;flex-direction:column;gap:10px}\n.hfsk-pills.fixedrow{flex-wrap:nowrap}\n.hfsk-pills.fixedrow .hfsk-pill{min-width:0;justify-content:center;white-space:nowrap}\n@media (max-width:480px){.hfsk-pills.fixedrow .hfsk-pill{flex:1 1 0;font-size:clamp(9.5px,2.9vw,12.5px);padding:9px 4px;min-height:33px}}\n@media (max-width:480px){.hfsk-pills.fixedrow.compact .hfsk-pill{white-space:nowrap;font-size:clamp(9px,2.55vw,12.5px);padding:9px 2px;min-height:33px}}\n\/* ===== glass booking cell ===== *\/\n.hfsk-glass{background:rgba(20,29,43,.62);border:1px solid rgba(255,255,255,.16);border-radius:22px;\n  backdrop-filter:blur(22px);-webkit-backdrop-filter:blur(22px);\n  box-shadow:0 40px 110px -30px rgba(0,0,0,.8),inset 0 1px 0 rgba(255,255,255,.09);\n  padding:24px 26px 22px;max-width:520px;margin-left:auto;color:#fff;text-align:left;font-family:'Inter',-apple-system,sans-serif}\n.hfsk-glass *{box-sizing:border-box}\n.g-top{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:16px}\n.g-top h3{font-size:23px;font-weight:800;letter-spacing:-.5px;color:#fff;margin:0;font-family:inherit}\n.g-badge{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:700;color:#7FE3FF;background:rgba(35,210,255,.14);border:1px solid rgba(35,210,255,.3);padding:4px 10px;border-radius:99px;margin-top:8px}\n.g-zip{flex:none;width:150px;text-align:left}\n.g-zip label{display:block;font-size:10px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#8fb3d0;margin-bottom:6px;padding-left:2px}\n.g-zipbox{position:relative;display:flex;align-items:center;height:42px;background:rgba(255,255,255,.07);border:1.5px solid rgba(255,255,255,.22);border-radius:12px;padding:0 12px;transition:border-color .15s}\n.g-zipbox:focus-within{border-color:#40C9F3}.g-zipbox.bad{border-color:#ff8f8f}\n.g-zipbox .pin{position:absolute;left:12px;font-size:14px;line-height:1}\n.g-zipbox input{width:100%;height:100%;padding:0;margin:0;text-align:center;border:none;background:transparent;font-family:inherit;font-size:16px;font-weight:800;color:#fff;outline:none;letter-spacing:2px;line-height:normal;box-shadow:none}\n.g-inc{border:1px solid rgba(255,255,255,.14);border-radius:13px;overflow:hidden;margin-bottom:15px;background:rgba(255,255,255,.03)}\n.g-inc>button{width:100%;display:flex;align-items:center;justify-content:space-between;background:transparent;border:none;padding:11px 14px;font-family:inherit;font-size:12.5px;font-weight:800;color:#dfe9f5;cursor:pointer;letter-spacing:.04em}\n.g-inc .car{transition:transform .2s;color:#40C9F3}.g-inc.open .car{transform:rotate(180deg)}\n.g-inc ul{list-style:none;max-height:0;overflow:hidden;transition:max-height .28s;padding:0 16px;margin:0}\n.g-inc.open ul{max-height:420px;padding:2px 16px 12px}\n.g-inc li{font-size:12.5px;color:rgba(223,233,245,.92);padding:4px 0 4px 20px;position:relative;line-height:1.5}\n.g-inc li::before{content:\"\";position:absolute;left:2px;top:11px;width:6px;height:6px;border-radius:50%;background:#2ED87A}\n.g-inc li.you::before{background:#40C9F3}\n.g-inc li.na::before{background:#ff9b9b}\n.g-inc li b{color:#fff;font-weight:800}\n.g-q{margin-bottom:14px}.g-q:last-child{margin-bottom:0}\n.g-q>label{display:block;font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:#8fa6c0;margin-bottom:8px}\n.g-seg{display:flex;flex-wrap:wrap;gap:7px}\n.g-seg button{flex:1 1 0;min-width:0;font-family:inherit;font-size:13px;font-weight:700;color:#fff;background:rgba(255,255,255,.05);border:1.5px solid rgba(255,255,255,.18);border-radius:10px;padding:10px 8px;cursor:pointer;transition:all .15s;white-space:nowrap}\n.g-seg button.on{border-color:#40C9F3;background:rgba(35,210,255,.12);color:#7FE3FF;box-shadow:0 0 0 3px rgba(35,210,255,.12)}\n.g-seg.four button{flex:1 1 46%}\n.g-step{display:flex;align-items:center;gap:8px}\n.g-step button{width:42px;height:40px;flex:none;border-radius:10px;border:1.5px solid rgba(255,255,255,.22);background:rgba(255,255,255,.06);color:#40C9F3;font-size:21px;font-weight:700;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center;transition:all .15s}\n.g-step button:hover:not(:disabled){border-color:#40C9F3}.g-step button:disabled{opacity:.3;cursor:not-allowed}\n.g-step .val{flex:1;text-align:center;height:40px;display:flex;align-items:center;justify-content:center;border:1.5px solid rgba(64,201,243,.55);background:rgba(35,210,255,.09);border-radius:10px;font-size:14.5px;font-weight:800;color:#7FE3FF;letter-spacing:.2px}\n.g-step .val span{font-size:11px;font-weight:600;color:#8fa6c0;margin-left:5px}\n.g-rooms{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}\n.g-rooms.two{grid-template-columns:repeat(2,minmax(0,1fr))}\n.g-rc{background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.13);border-radius:12px;padding:10px 8px;text-align:center}\n.g-rc .rl{font-size:16.5px;font-weight:700;color:#fff;line-height:1.2;min-height:26px;display:flex;align-items:center;justify-content:center}\n.g-rc .rs{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:6px}\n.g-rc .rs button{width:28px;height:28px;border-radius:8px;border:1.5px solid rgba(255,255,255,.22);background:rgba(255,255,255,.06);font-size:17px;font-weight:700;color:#40C9F3;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center}\n.g-rc .rs button:disabled{opacity:.3;cursor:not-allowed}\n.g-rc .rs .v{font-size:24px;line-height:1;font-weight:800;color:#fff;min-width:20px}\n.g-itemhead{display:flex;justify-content:space-between;font-size:10px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:#6d8199;padding:0 2px 7px}\n.g-item .lbl{min-width:0}\n.g-item{display:flex;align-items:center;justify-content:space-between;gap:10px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.13);border-radius:13px;padding:10px 13px;margin-bottom:8px;transition:all .15s}\n.g-item:last-child{margin-bottom:0}\n.g-item.picked{border-color:rgba(64,201,243,.6);background:rgba(35,210,255,.09)}\n.g-item .lbl{font-size:13.5px;font-weight:700;color:#fff;line-height:1.3}\n.g-item .rs{display:flex;align-items:center;gap:9px;flex:none}\n.g-item .rs button{width:30px;height:30px;border-radius:9px;border:1.5px solid rgba(255,255,255,.25);background:rgba(255,255,255,.06);font-size:17px;font-weight:700;color:#40C9F3;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center}\n.g-item .rs button:disabled{opacity:.3;cursor:not-allowed}\n.g-item .rs .v{font-size:16px;font-weight:800;color:#fff;min-width:16px;text-align:center}\n.g-note{font-size:11px;color:#8fa6c0;margin-top:8px;line-height:1.5}\n.g-foot{margin-top:16px;padding-top:15px;border-top:1px solid rgba(255,255,255,.12)}\n.g-row{display:flex;align-items:center;justify-content:space-between;gap:14px}\n.g-pr{text-align:left}\n.g-price{font-size:32px;font-weight:900;letter-spacing:-1.2px;color:#2ED87A;line-height:1}\n.g-price.na{font-size:15px;color:#ff9b9b;font-weight:700;letter-spacing:0}\n.g-est{font-size:11.5px;color:#8fa6c0;margin-top:5px}\n.g-book{flex:none;background:#23D2FF;color:#0F1923;border:none;border-radius:13px;padding:15px 26px;font-family:inherit;font-size:15.5px;font-weight:800;cursor:pointer;box-shadow:0 14px 34px -12px rgba(35,210,255,.6);transition:filter .15s;white-space:nowrap}\n.g-book:hover,.g-book:focus,.g-book:active{background:#23D2FF !important;color:#0F1923 !important;filter:brightness(1.06);outline:none}\n.g-book:disabled{opacity:.45;cursor:not-allowed}\n\/* WP theme sets a red\/pink global button:hover \u2014 pin every control in this block to our palette *\/\n.hfsk-root button:hover,.hfsk-root button:focus,.hfsk-root button:active{color:inherit}\n.hfsk-pill:hover,.hfsk-pill:focus,.hfsk-pill:active{background:linear-gradient(180deg,rgba(255,255,255,.09),rgba(255,255,255,.02)) !important;color:#dfe9f5 !important}\n.hfsk-pill.on:hover,.hfsk-pill.on:focus,.hfsk-pill.on:active{background:linear-gradient(180deg,rgba(35,210,255,.26),rgba(35,210,255,.09)) !important;color:#fff !important}\n.g-seg button:hover,.g-seg button:focus,.g-seg button:active{background:rgba(255,255,255,.08) !important;color:#fff !important;outline:none}\n.g-seg button.on:hover,.g-seg button.on:focus,.g-seg button.on:active{background:rgba(35,210,255,.12) !important;color:#7FE3FF !important}\n.g-step button:hover,.g-step button:focus,.g-step button:active{background:rgba(255,255,255,.1) !important;color:#40C9F3 !important;outline:none}\n.g-item .rs button:hover,.g-item .rs button:focus,.g-item .rs button:active{background:rgba(255,255,255,.12) !important;color:#40C9F3 !important;outline:none}\n.g-rc .rs button:hover,.g-rc .rs button:focus,.g-rc .rs button:active{background:rgba(255,255,255,.12) !important;color:#40C9F3 !important;outline:none}\n.g-inc>button:hover,.g-inc>button:focus,.g-inc>button:active{background:rgba(255,255,255,.04) !important;color:#dfe9f5 !important;outline:none}\n.g-fine{font-size:10.5px;color:#6d8199;margin-top:12px;text-align:center}\n\/* flooring extras: pattern preview, stain picker *\/\n.g-flprev{display:flex;align-items:center;gap:10px;margin-top:9px}\n.g-flprev img{width:96px;height:64px;object-fit:cover;border-radius:9px;border:1px solid rgba(255,255,255,.18);background:#fff}\n.g-flprev span{font-size:12px;color:#8fa6c0}\n.g-flstain{display:flex;align-items:center;gap:10px;margin-top:2px}\n.g-flstain img{width:44px;height:44px;object-fit:cover;border-radius:9px;border:1px solid rgba(255,255,255,.22);flex:none}\n.g-select{flex:1;min-width:0;height:42px;padding:0 12px;border-radius:10px;background:rgba(255,255,255,.07);border:1.5px solid rgba(255,255,255,.22);color:#fff;font-family:inherit;font-size:13.5px;font-weight:600;outline:none;appearance:auto;-webkit-appearance:menulist}\n.g-select:focus{border-color:#40C9F3}\n.g-select option{color:#0F1923;background:#fff}\n@media (max-width:980px){\n  .hfsk-hero{padding:calc(34px + var(--hf-header-h, 88px)) 18px 56px}\n  \/* minmax(0,1fr): a bare 1fr track grows to the cell's min-content and the\n     hero's overflow:hidden clips it off the right edge of small phones *\/\n  .hfsk-cols{grid-template-columns:minmax(0,1fr);gap:32px}\n  .hfsk-cols>*{min-width:0;max-width:100%}\n  .hfsk-glass{margin:0 auto;width:100%;max-width:520px}\n  .hfsk-sub{margin-bottom:22px}\n  .hfsk-pills{gap:8px}\n  .hfsk-pill{font-size:12.5px;padding:9px 14px}\n}\n@media (max-width:480px){\n  .hfsk-glass{padding:20px 18px 18px}\n  .g-price{font-size:26px}\n  .g-book{padding:13px 18px;font-size:14px}\n  .g-row{gap:10px}\n  .g-zip{width:132px}\n  .g-top h3{font-size:20px}\n  \/* compress-only-when-needed: identical at 390px+, shrinks on smaller phones *\/\n  .g-seg button{white-space:normal}\n  .hfsk-pills.fixedrow .hfsk-pill{white-space:normal;text-align:center;line-height:1.15}\n  .g-rc{padding:10px 5px}\n  .g-rc .rl{font-size:clamp(13px,4.2vw,16.5px)}\n  .g-rc .rs{gap:5px}\n  .g-rc .rs button{width:26px;height:26px}\n  .g-rc .rs .v{min-width:16px;font-size:22px}\n}\n<\/style>\n\n<div class=\"hfc\" id=\"hfc\">\n<section class=\"hfc-hero\"><div class=\"hfc-ey\">HVAC Services<\/div><h1 class=\"hfc-h1\">Book Trusted <span>HVAC Pros<\/span><\/h1>\n<p class=\"hfc-lead\">Search for what you need or pick a service below, and see your price as you go<\/p>\n<form class=\"hfc-srch\" id=\"hfcSearch\" role=\"search\" autocomplete=\"off\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"m20 20-3.5-3.5\"\/><\/svg><input id=\"hfcQ\" type=\"text\" placeholder=\"Search for what you need\" aria-label=\"What do you need done?\"><button type=\"submit\">Get My Price<\/button><\/form>\n<div class=\"hfc-pop\"><button type=\"button\" data-hq=\"AC repair\">AC Repair<\/button><button type=\"button\" data-hq=\"AC tune-up\">AC Tune-Up<\/button><button type=\"button\" data-hq=\"Furnace tune-up\">Furnace<\/button><button type=\"button\" data-hq=\"Duct cleaning\">Ducts<\/button><button type=\"button\" data-hq=\"Thermostat install\">Thermostat<\/button><\/div><\/section>\n<div class=\"hfc-wrap\"><div class=\"hfc-lay\" id=\"hfcLay\">\n<div class=\"hfc-left\"><div class=\"hfc-blk\" id=\"hfcS1\"><div class=\"hfc-stp\"><h3>Most popular<\/h3><\/div><div class=\"hfc-sv\" id=\"hfcMain\"><\/div><div id=\"hfcAll\" hidden><\/div><button type=\"button\" class=\"hfc-more\" id=\"hfcMore\"><\/button><\/div>\n<\/div>\n<div class=\"hfc-box\" id=\"hfcBox\"><div class=\"hfc-nb\" id=\"hfcNb\"><\/div><\/div>\n<div class=\"hfc-bar\" id=\"hfcBar\"><div><b id=\"hfcBarP\">&hellip;<\/b><small id=\"hfcBarS\"><\/small><\/div><button type=\"button\" class=\"hfc-btn\" id=\"hfcBarB\">Book It<\/button><\/div>\n<\/div><\/div><\/div>\n\n\n\n<!-- ================= END HOUSE FLY SMOKE HERO ================= -->\n\n<!-- HF deep-link preselect 2026-08-17 (live) -->\n<script>\n(function(){\n  var q = new URLSearchParams(window.location.search);\n  var svc = q.get('hf_svc'), task = q.get('hf_task');\n  if(!svc && !task) return;\n  var tries = 0;\n  function norm(s){return (s||'').replace(\/\\s+\/g,' ').trim().toLowerCase()}\n  function findPill(label){\n    var pills = [].slice.call(document.querySelectorAll('button.hfsk-pill'));\n    var n = norm(label);\n    return pills.find(function(p){return norm(p.textContent)===n}) ||\n           pills.find(function(p){return norm(p.textContent).indexOf(n)===0}) ||\n           pills.find(function(p){return n.indexOf(norm(p.textContent))===0});\n  }\n  function go(){\n    tries++;\n    var pills = document.querySelectorAll('button.hfsk-pill');\n    if(!pills.length){ if(tries<40) return setTimeout(go,250); return; }\n    var s = svc && findPill(svc);\n    if(s && s.className.indexOf('on')<0){ s.click(); }\n    setTimeout(function(){\n      var t = task && findPill(task);\n      if(t && t.className.indexOf('on')<0){ t.click(); }\n    }, s ? 400 : 0);\n  }\n  if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',function(){setTimeout(go,300)});\n  else setTimeout(go,300);\n})();\n<\/script><script id=\"hfc-js\" data-no-defer=\"1\" data-no-optimize=\"1\" data-no-minify=\"1\">\n(function(){\n  var D = {\"slug\": \"hvac\", \"st\": \"HVAC\", \"items\": [{\"qdef\": null, \"pstep\": null, \"key\": \"hv_diagnostic\", \"t\": \"menu\", \"name\": \"HVAC Diagnostic and Repair Visit\", \"icon\": \"\ud83d\udd0d\", \"desc\": \"An HVAC tech at the house to find out why the system\", \"full\": \"An HVAC tech at the house to find out why the system is not cooling, not heating, not turning on, freezing up, leaking water or making a noise: pressures, temperatures, electrical and controls checked, the fault found and a flat-rate repair quoted on the spot. When the fix is one of our listed repairs the pro adds it from the price book and this visit fee is credited toward it.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 89.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-DIAG\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"hv_system\", \"label\": \"System\", \"options\": [\"Central AC\", \"Gas furnace\", \"Heat pump\", \"Ductless mini split\", \"Boiler\", \"Not sure\"], \"add\": {}}, {\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_capacitor\", \"t\": \"menu\", \"name\": \"Capacitor Replacement\", \"icon\": \"\ud83d\udd0b\", \"desc\": \"The number one AC repair\", \"full\": \"The number one AC repair: the run capacitor that starts the compressor and fan replaced with a new rated part, the old one tested and recycled, the system started and amp draws checked. Parts and labor.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 229.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-CAP\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"cap_type\", \"label\": \"Capacitor\", \"options\": [\"Dual run capacitor\", \"Single run or start capacitor\"], \"add\": {}}, {\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_contactor\", \"t\": \"menu\", \"name\": \"Contactor Replacement\", \"icon\": \"\u26a1\", \"desc\": \"The relay that switches the outdoor unit\", \"full\": \"The relay that switches the outdoor unit on, pitted or stuck from years of cycling, replaced with a new one, wiring and the low-voltage control checked. Parts and labor.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 219.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-CONTACTOR\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_fan_motor\", \"t\": \"menu\", \"name\": \"Condenser Fan Motor Replacement\", \"icon\": \"\ud83c\udf00\", \"desc\": \"The outdoor fan motor that stopped turning or runs hot replaced\", \"full\": \"The outdoor fan motor that stopped turning or runs hot replaced with a matched motor and capacitor, the blade re-pitched or replaced, the unit run and checked. Parts and labor.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 479.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-FANMOTOR\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"fm_blade\", \"label\": \"Fan blade\", \"options\": [\"Reuse the existing blade\", \"New fan blade\"], \"add\": {\"New fan blade\": 69.99}}, {\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_blower\", \"t\": \"menu\", \"name\": \"Blower Motor Replacement\", \"icon\": \"\ud83c\udf2c\", \"desc\": \"The indoor blower motor that moves the air through the ducts\", \"full\": \"The indoor blower motor that moves the air through the ducts replaced, the wheel cleaned and balanced, speeds set, airflow checked at the registers. Parts and labor.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 599.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-BLOWER\", \"variants\": [{\"key\": \"psc\", \"label\": \"Standard PSC blower motor\", \"price\": 599.99}, {\"key\": \"ecm\", \"label\": \"Variable speed ECM blower motor\", \"price\": 1099.99}], \"rows\": false, \"variant_q\": \"Which motor?\", \"variant_default\": \"Standard PSC blower motor\", \"rank\": 50, \"questions\": [{\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_refrigerant\", \"t\": \"menu\", \"name\": \"Refrigerant Recharge\", \"icon\": \"\u2744\", \"desc\": \"The system weighed in to the manufacturer charge by the tech\", \"full\": \"The system weighed in to the manufacturer charge by the tech, superheat and subcooling checked so it is charged right and not just topped off. Priced per pound of refrigerant added; most residential systems take two to five.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"unit\", \"unit_label\": \"lb\", \"price\": 89.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HV-REFRIG\", \"variants\": [{\"key\": \"r410a\", \"label\": \"R-410A\", \"price\": 89.99}, {\"key\": \"r32\", \"label\": \"R-32 or R-454B, new systems\", \"price\": 99.99}, {\"key\": \"r22\", \"label\": \"R-22, older systems\", \"price\": 169.99}], \"rows\": false, \"variant_q\": \"Which refrigerant does the unit use? (it is on the outdoor unit label)\", \"variant_default\": \"R-410A\", \"rank\": 50, \"questions\": [{\"key\": \"rf_leak\", \"label\": \"Leak check\", \"options\": [\"Just the recharge\", \"Add an electronic leak search\"], \"add\": {\"Add an electronic leak search\": 149.99}}, {\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_leak\", \"t\": \"menu\", \"name\": \"Refrigerant Leak Search and Repair\", \"icon\": \"\ud83d\udca7\", \"desc\": \"The system pressure tested with nitrogen and an electronic\", \"full\": \"The system pressure tested with nitrogen and an electronic sniffer, the leak found, and the repair made where it is: a Schrader core, a flare, a valve, or a brazed joint on the coil or line. Refrigerant to bring it back up is its own line.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 249.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-LEAK\", \"variants\": [{\"key\": \"search\", \"label\": \"Leak search only\", \"price\": 249.99}, {\"key\": \"fitting\", \"label\": \"Search plus a repair at a fitting, core or valve\", \"price\": 449.99}, {\"key\": \"braze\", \"label\": \"Search plus a brazed repair on a coil or line\", \"price\": 749.99}], \"rows\": false, \"variant_q\": \"What do you need?\", \"variant_default\": \"Leak search only\", \"rank\": 50, \"questions\": [{\"key\": \"lk_recharge\", \"label\": \"Recharge after the repair\", \"options\": [\"Not yet\", \"Yes, recharge up to 3 lb of R-410A\"], \"add\": {\"Yes, recharge up to 3 lb of R-410A\": 249.99}}, {\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_evap_coil\", \"t\": \"menu\", \"name\": \"Evaporator Coil Replacement\", \"icon\": \"\ud83e\uddca\", \"desc\": \"The indoor coil that is leaking or rotted out replaced\", \"full\": \"The indoor coil that is leaking or rotted out replaced: refrigerant recovered, the coil swapped and brazed in, the line set flushed, a new filter drier, vacuum pulled and the system recharged. Labor and refrigerant are the base price; add the coil if it is out of warranty.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 649.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-EVAPCOIL\", \"variants\": [{\"key\": \"t2\", \"label\": \"1.5 to 2.5 ton\", \"price\": 649.99}, {\"key\": \"t3\", \"label\": \"3 to 3.5 ton\", \"price\": 749.99}, {\"key\": \"t4\", \"label\": \"4 to 5 ton\", \"price\": 849.99}], \"rows\": false, \"variant_q\": \"How big is the system? (tonnage is on the outdoor unit label)\", \"variant_default\": \"1.5 to 2.5 ton\", \"rank\": 50, \"questions\": [{\"key\": \"ec_parts\", \"label\": \"The coil\", \"options\": [\"Under manufacturer warranty, labor and refrigerant only\", \"Out of warranty, we supply the coil\"], \"add\": {\"Out of warranty, we supply the coil\": 599.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_condensate\", \"t\": \"menu\", \"name\": \"Condensate Drain Line Clearing\", \"icon\": \"\ud83d\udeb0\", \"desc\": \"The clogged drain that is dripping water out of the air handler\", \"full\": \"The clogged drain that is dripping water out of the air handler or tripping the system off: the line blown and vacuumed clear, the trap and pan cleaned, treated so the algae does not come straight back. The number one summer call.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 169.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-DRAIN\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"cd_pump\", \"label\": \"Condensate pump\", \"options\": [\"No pump, or it is fine\", \"Replace the condensate pump\"], \"add\": {\"Replace the condensate pump\": 149.99}}, {\"key\": \"cd_float\", \"label\": \"Overflow protection\", \"options\": [\"Leave as is\", \"Add a float safety switch\"], \"add\": {\"Add a float safety switch\": 89.99}}, {\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_line_set\", \"t\": \"menu\", \"name\": \"Refrigerant Line Set Replacement\", \"icon\": \"\ud83d\udd27\", \"desc\": \"The copper lines between the outdoor unit and the indoor coil\", \"full\": \"The copper lines between the outdoor unit and the indoor coil replaced and insulated, brazed in with nitrogen, vacuumed and recharged. For a line set that is leaking, kinked or the wrong size for a new system.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 899.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-LINESET\", \"variants\": [{\"key\": \"l25\", \"label\": \"Up to 25 ft\", \"price\": 899.99}, {\"key\": \"l50\", \"label\": \"26 to 50 ft\", \"price\": 1299.99}], \"rows\": false, \"variant_q\": \"How long is the run?\", \"variant_default\": \"Up to 25 ft\", \"rank\": 50, \"questions\": [{\"key\": \"ls_access\", \"label\": \"Access\", \"options\": [\"Open run, attic, crawl space or exterior wall\", \"Inside a finished wall or ceiling\"], \"add\": {\"Inside a finished wall or ceiling\": 299.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_igniter\", \"t\": \"menu\", \"name\": \"Furnace Igniter or Flame Sensor Replacement\", \"icon\": \"\ud83d\udd25\", \"desc\": \"The furnace that clicks but will not light\", \"full\": \"The furnace that clicks but will not light, or lights and shuts right back off: the hot surface igniter, flame sensor, thermocouple or pilot assembly replaced, the burners cleaned and the sequence run through. Parts and labor.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 229.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-IGNITER\", \"variants\": [{\"key\": \"igniter\", \"label\": \"Hot surface igniter\", \"price\": 229.99}, {\"key\": \"sensor\", \"label\": \"Flame sensor, clean or replace\", \"price\": 169.99}, {\"key\": \"thermo\", \"label\": \"Thermocouple or pilot assembly\", \"price\": 219.99}], \"rows\": false, \"variant_q\": \"Which part?\", \"variant_default\": \"Hot surface igniter\", \"rank\": 50, \"questions\": [{\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_control_board\", \"t\": \"menu\", \"name\": \"Control Board Replacement\", \"icon\": \"\ud83d\udcbb\", \"desc\": \"The circuit board that runs the furnace\", \"full\": \"The circuit board that runs the furnace, air handler or heat pump replaced with the OEM board, the dip switches and wiring matched, the fault codes cleared and the system cycled. Parts and labor.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 499.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-BOARD\", \"variants\": [{\"key\": \"furnace\", \"label\": \"Furnace control board\", \"price\": 499.99}, {\"key\": \"defrost\", \"label\": \"Heat pump defrost or AC control board\", \"price\": 449.99}, {\"key\": \"comm\", \"label\": \"Communicating or variable speed board\", \"price\": 899.99}], \"rows\": false, \"variant_q\": \"Which board?\", \"variant_default\": \"Furnace control board\", \"rank\": 50, \"questions\": [{\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_inducer\", \"t\": \"menu\", \"name\": \"Inducer Motor Replacement\", \"icon\": \"\ud83d\udca8\", \"desc\": \"The draft inducer that has to spin up\", \"full\": \"The draft inducer that has to spin up before the furnace will light, grinding or dead, replaced with a new assembly, the pressure switch tubing and vent checked. Parts and labor.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 649.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-INDUCER\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_switches\", \"t\": \"menu\", \"name\": \"Pressure Switch or Limit Switch Replacement\", \"icon\": \"\ud83d\udea8\", \"desc\": \"The safety switch that is locking the furnace out replaced\", \"full\": \"The safety switch that is locking the furnace out replaced: the pressure switch that proves the vent, the high limit or rollout switch that trips on heat, or the blower door switch. The reason it tripped checked too. Parts and labor.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 219.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-SWITCH\", \"variants\": [{\"key\": \"pressure\", \"label\": \"Pressure switch\", \"price\": 219.99}, {\"key\": \"limit\", \"label\": \"High limit or rollout switch\", \"price\": 199.99}, {\"key\": \"door\", \"label\": \"Door or safety switch\", \"price\": 149.99}], \"rows\": false, \"variant_q\": \"Which switch?\", \"variant_default\": \"Pressure switch\", \"rank\": 50, \"questions\": [{\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_gas_valve\", \"t\": \"menu\", \"name\": \"Furnace Gas Valve Replacement\", \"icon\": \"\ud83d\udee2\", \"desc\": \"The gas valve that will not open or leaks replaced with the OEM\", \"full\": \"The gas valve that will not open or leaks replaced with the OEM valve, the manifold pressure set, every joint leak tested and the burners checked. Parts and labor.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 449.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-GASVALVE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"hv_when\", \"label\": \"When\", \"options\": [\"Next available\", \"Same day\", \"Evening, weekend or holiday\"], \"add\": {\"Same day\": 59.99, \"Evening, weekend or holiday\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_thermostat\", \"t\": \"menu\", \"name\": \"Thermostat Installation\", \"icon\": \"\ud83c\udf21\", \"desc\": \"The old thermostat off, the new one wired\", \"full\": \"The old thermostat off, the new one wired, mounted level and programmed, the heat and cool stages tested, and for a smart thermostat the app set up on your phone before the pro leaves.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"unit\", \"unit_label\": \"thermostat\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HV-TSTAT\", \"variants\": [{\"key\": \"basic\", \"label\": \"Standard or programmable, you supply it\", \"price\": 149.99}, {\"key\": \"smart_byo\", \"label\": \"Smart thermostat, you supply it (Nest, Ecobee)\", \"price\": 199.99}, {\"key\": \"smart_ours\", \"label\": \"Smart thermostat, we supply it\", \"price\": 429.99}], \"rows\": false, \"variant_q\": \"Which thermostat?\", \"variant_default\": \"Standard or programmable, you supply it\", \"rank\": 50, \"questions\": [{\"key\": \"ts_cwire\", \"label\": \"Wiring\", \"options\": [\"The existing wires are enough\", \"Needs a C-wire run or an adapter\"], \"add\": {\"Needs a C-wire run or an adapter\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_ac_tuneup\", \"t\": \"menu\", \"name\": \"AC Tune-Up\", \"icon\": \"\u2705\", \"desc\": \"The spring visit every HVAC company sells\", \"full\": \"The spring visit every HVAC company sells: refrigerant pressures and temperatures checked, the condenser coil rinsed, capacitor and contactor tested, amp draws, the drain line flushed, the filter checked, the thermostat calibrated and a written report of what is wearing out. One system.\", \"section\": \"Maintenance\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-ACTUNE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"hv_count\", \"label\": \"How many systems?\", \"options\": [\"One system\", \"Two systems\"], \"add\": {\"Two systems\": 99.99}}, {\"key\": \"at_coil\", \"label\": \"Condenser coil\", \"options\": [\"Standard rinse\", \"Deep chemical coil clean\"], \"add\": {\"Deep chemical coil clean\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_furnace_tuneup\", \"t\": \"menu\", \"name\": \"Furnace Tune-Up\", \"icon\": \"\ud83d\udd25\", \"desc\": \"The fall visit: burners cleaned\", \"full\": \"The fall visit: burners cleaned, the heat exchanger inspected for cracks, the igniter, flame sensor, gas pressure and venting checked, a carbon monoxide test, the blower cleaned, the filter checked and a written report. One system.\", \"section\": \"Maintenance\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-FURNTUNE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"ft_fuel\", \"label\": \"Fuel\", \"options\": [\"Gas furnace\", \"Electric furnace or heat pump\", \"Oil furnace\"], \"add\": {\"Oil furnace\": 99.99}}, {\"key\": \"hv_count\", \"label\": \"How many systems?\", \"options\": [\"One system\", \"Two systems\"], \"add\": {\"Two systems\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_full_tuneup\", \"t\": \"menu\", \"name\": \"Full System Tune-Up, Heating and Cooling\", \"icon\": \"\ud83c\udf1e\", \"desc\": \"Both sides of the system in one visit\", \"full\": \"Both sides of the system in one visit: the AC tune-up and the furnace or heat pump tune-up back to back, one report, one trip charge. The right pick before a season change or a home sale.\", \"section\": \"Maintenance\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 249.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-FULLTUNE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"hv_count\", \"label\": \"How many systems?\", \"options\": [\"One system\", \"Two systems\"], \"add\": {\"Two systems\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_maint_plan\", \"t\": \"menu\", \"name\": \"Annual Maintenance Plan, Two Visits\", \"icon\": \"\ud83d\udcc5\", \"desc\": \"What the national brands sell as a membership\", \"full\": \"What the national brands sell as a membership: a spring AC tune-up and a fall heating tune-up for the year ahead, booked now with the first visit and the second scheduled when the season turns. One system; add a second if the house has two.\", \"section\": \"Maintenance\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 249.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-PLAN\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"mp_systems\", \"label\": \"How many systems?\", \"options\": [\"One system\", \"Two systems\"], \"add\": {\"Two systems\": 199.99}}, {\"key\": \"mp_first\", \"label\": \"First visit\", \"options\": [\"Cooling tune-up first\", \"Heating tune-up first\"], \"add\": {}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_minisplit_clean\", \"t\": \"menu\", \"name\": \"Mini Split Deep Cleaning and Service\", \"icon\": \"\ud83e\udee7\", \"desc\": \"Each wall head bagged and pressure washed in place\", \"full\": \"Each wall head bagged and pressure washed in place: the blower wheel, coil and drain pan stripped of the mold and dust that ductless units build up, the filters cleaned, the outdoor unit checked and the charge verified. Priced per indoor head.\", \"section\": \"Maintenance\", \"unit\": \"unit\", \"unit_label\": \"head\", \"price\": 179.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HV-MSCLEAN\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"ms_outdoor\", \"label\": \"Outdoor unit\", \"options\": [\"Check only\", \"Rinse and service the outdoor unit too\"], \"add\": {\"Rinse and service the outdoor unit too\": 69.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_evap_clean\", \"t\": \"menu\", \"name\": \"Evaporator Coil Cleaning\", \"icon\": \"\ud83e\uddfd\", \"desc\": \"The indoor coil that is matted with dust and mold\", \"full\": \"The indoor coil that is matted with dust and mold, cutting the airflow and the cooling, cleaned with a coil cleaner in place or pulled and cleaned when it is too far gone, the pan and drain cleared with it.\", \"section\": \"Maintenance\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 299.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-EVAPCLEAN\", \"variants\": [{\"key\": \"inplace\", \"label\": \"Clean in place\", \"price\": 299.99}, {\"key\": \"pull\", \"label\": \"Pull and clean\", \"price\": 599.99}], \"rows\": false, \"variant_q\": \"How bad is it?\", \"variant_default\": \"Clean in place\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_blower_clean\", \"t\": \"menu\", \"name\": \"Blower Wheel and Housing Cleaning\", \"icon\": \"\ud83e\uddf9\", \"desc\": \"The blower pulled, the wheel and housing scrubbed clean\", \"full\": \"The blower pulled, the wheel and housing scrubbed clean of the dust cake that unbalances it and chokes the airflow, the motor checked and everything reinstalled and run.\", \"section\": \"Maintenance\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 249.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-BLOWERCLEAN\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_inspection\", \"t\": \"menu\", \"name\": \"HVAC System Inspection and Report\", \"icon\": \"\ud83d\udccb\", \"desc\": \"For a home purchase or a sale\", \"full\": \"For a home purchase or a sale: the age, condition, refrigerant charge, heat exchanger, ductwork and remaining life of every system written up with photos, so you know what you are buying or what the buyer will find.\", \"section\": \"Maintenance\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 179.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-INSPECT\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"hv_count\", \"label\": \"How many systems?\", \"options\": [\"One system\", \"Two systems\"], \"add\": {\"Two systems\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_duct_clean\", \"t\": \"menu\", \"name\": \"Air Duct Cleaning\", \"icon\": \"\ud83c\udf2b\", \"desc\": \"Every supply and return duct cleaned with a negative-air machine\", \"full\": \"Every supply and return duct cleaned with a negative-air machine and agitation whips, the registers pulled and washed, the trunk lines and plenum vacuumed, the blower compartment cleaned. Priced by the number of vents in the house.\", \"section\": \"Air Quality & Ducts\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 299.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-DUCTCLEAN\", \"variants\": [{\"key\": \"v10\", \"label\": \"Up to 10 vents\", \"price\": 299.99}, {\"key\": \"v20\", \"label\": \"11 to 20 vents\", \"price\": 449.99}, {\"key\": \"v30\", \"label\": \"21 to 30 vents\", \"price\": 649.99}, {\"key\": \"v31\", \"label\": \"Over 30 vents\", \"price\": 899.99}], \"rows\": false, \"variant_q\": \"How many vents and returns in the house?\", \"variant_default\": \"11 to 20 vents\", \"rank\": 50, \"questions\": [{\"key\": \"dc_systems\", \"label\": \"How many systems?\", \"options\": [\"One system\", \"Two systems\"], \"add\": {\"Two systems\": 199.99}}, {\"key\": \"dc_sanitize\", \"label\": \"Sanitizing\", \"options\": [\"Cleaning only\", \"Add an antimicrobial fog\"], \"add\": {\"Add an antimicrobial fog\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_dryer_vent\", \"t\": \"menu\", \"name\": \"Dryer Vent Cleaning\", \"icon\": \"\ud83e\uddfa\", \"desc\": \"The dryer pulled, the vent run brushed and vacuumed end to end\", \"full\": \"The dryer pulled, the vent run brushed and vacuumed end to end, the exterior cap cleared, the connection re-sealed and airflow checked. A packed dryer vent is a fire and a dryer that takes two cycles.\", \"section\": \"Air Quality & Ducts\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-DRYERVENT\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"dv_exit\", \"label\": \"Where does it exit?\", \"options\": [\"Through a wall\", \"Through the roof\"], \"add\": {\"Through the roof\": 49.99}}, {\"key\": \"dv_length\", \"label\": \"Run\", \"options\": [\"Under 15 ft\", \"Long run, over 15 ft\"], \"add\": {\"Long run, over 15 ft\": 49.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_duct_repair\", \"t\": \"menu\", \"name\": \"Ductwork Repair or Replacement\", \"icon\": \"\ud83d\udee0\", \"desc\": \"A crushed, torn, disconnected or rodent-chewed duct run replaced\", \"full\": \"A crushed, torn, disconnected or rodent-chewed duct run replaced or re-hung, the joints mastic sealed and the insulation redone. Priced per run; a whole-house re-duct is a custom quote.\", \"section\": \"Air Quality & Ducts\", \"unit\": \"unit\", \"unit_label\": \"run\", \"price\": 299.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HV-DUCTREPAIR\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"dr_material\", \"label\": \"Duct\", \"options\": [\"Flex duct\", \"Sheet metal\"], \"add\": {\"Sheet metal\": 99.99}}, {\"key\": \"dr_access\", \"label\": \"Access\", \"options\": [\"Attic, crawl space or basement\", \"Inside a finished wall or ceiling\"], \"add\": {\"Inside a finished wall or ceiling\": 149.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_uv_light\", \"t\": \"menu\", \"name\": \"UV Light Installation\", \"icon\": \"\ud83d\udca1\", \"desc\": \"A germicidal UV light mounted at the indoor coil\", \"full\": \"A germicidal UV light mounted at the indoor coil to stop the mold and biofilm that grows on it, or an air-stream UV system in the return to treat the air itself, wired to the blower and labeled with the bulb date.\", \"section\": \"Air Quality & Ducts\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 449.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-UV\", \"variants\": [{\"key\": \"coil\", \"label\": \"Coil UV light\", \"price\": 449.99}, {\"key\": \"air\", \"label\": \"Air stream UV system\", \"price\": 699.99}], \"rows\": false, \"variant_q\": \"Which kind?\", \"variant_default\": \"Coil UV light\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_purifier\", \"t\": \"menu\", \"name\": \"Whole-Home Air Purifier Installation\", \"icon\": \"\ud83c\udf43\", \"desc\": \"An air cleaner installed in the ductwork so every room gets\", \"full\": \"An air cleaner installed in the ductwork so every room gets it: a bipolar ionizer in the supply, a REME Halo style in-duct unit, or an electronic or HEPA media cabinet on the return. Wired, tested, filters explained.\", \"section\": \"Air Quality & Ducts\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 749.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-PURIFIER\", \"variants\": [{\"key\": \"ion\", \"label\": \"Bipolar ionizer (iWave type)\", \"price\": 749.99}, {\"key\": \"reme\", \"label\": \"In-duct REME Halo type\", \"price\": 1099.99}, {\"key\": \"media\", \"label\": \"Electronic or HEPA media air cleaner cabinet\", \"price\": 1499.99}], \"rows\": false, \"variant_q\": \"Which system?\", \"variant_default\": \"Bipolar ionizer (iWave type)\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_humidifier\", \"t\": \"menu\", \"name\": \"Whole-House Humidifier or Dehumidifier Installation\", \"icon\": \"\ud83d\udca6\", \"desc\": \"A humidifier cut into the supply plenum and plumbed to a water\", \"full\": \"A humidifier cut into the supply plenum and plumbed to a water line with its own humidistat for the dry winter air, or a whole-house dehumidifier ducted in for a sticky house. Installed, wired, set and tested.\", \"section\": \"Air Quality & Ducts\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 699.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-HUMID\", \"variants\": [{\"key\": \"bypass\", \"label\": \"Bypass humidifier\", \"price\": 699.99}, {\"key\": \"fan\", \"label\": \"Fan-powered or steam humidifier\", \"price\": 1299.99}, {\"key\": \"dehum\", \"label\": \"Whole-house dehumidifier\", \"price\": 2499.99}], \"rows\": false, \"variant_q\": \"Which unit?\", \"variant_default\": \"Bypass humidifier\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_filter_cab\", \"t\": \"menu\", \"name\": \"Media Filter Cabinet Upgrade\", \"icon\": \"\ud83d\udce6\", \"desc\": \"The one-inch filter slot replaced with a four- or five-inch media\", \"full\": \"The one-inch filter slot replaced with a four- or five-inch media filter cabinet at the air handler, so the filter lasts six months to a year, catches far more and the blower breathes easier. First filter included.\", \"section\": \"Air Quality & Ducts\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 499.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-FILTERCAB\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_boiler_tuneup\", \"t\": \"menu\", \"name\": \"Boiler Tune-Up and Safety Check\", \"icon\": \"\ud83d\udec1\", \"desc\": \"The boiler fired and checked\", \"full\": \"The boiler fired and checked: burners and heat exchanger cleaned, the pressure relief, expansion tank, circulator and zone valves checked, the system bled and a combustion and carbon monoxide test done. Gas or oil.\", \"section\": \"Heating\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 249.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-BOILERTUNE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"bt_fuel\", \"label\": \"Fuel\", \"options\": [\"Gas boiler\", \"Oil boiler\"], \"add\": {\"Oil boiler\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_q_ac\", \"t\": \"quote\", \"name\": \"Central AC Replacement\", \"icon\": \"\ud83c\udfe0\", \"desc\": \"A new condenser and matched indoor coil sized to the house\", \"full\": \"A new condenser and matched indoor coil sized to the house with a real load calculation, the line set and pad checked, the system installed, vacuumed, charged, commissioned and registered for the warranty, the old unit hauled away. A specialist calls back with the quote.\", \"section\": \"New Systems\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 4999.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-Q-AC\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_q_furnace\", \"t\": \"quote\", \"name\": \"Furnace Replacement\", \"icon\": \"\ud83d\udd25\", \"desc\": \"A new gas or electric furnace matched to the house\", \"full\": \"A new gas or electric furnace matched to the house and the existing ducts, installed with new venting, a new filter cabinet, the gas and electrical connections and a full combustion test, the old furnace hauled away. Quoted after a look at the house.\", \"section\": \"New Systems\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 3999.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-Q-FURNACE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_q_heat_pump\", \"t\": \"quote\", \"name\": \"Heat Pump Replacement\", \"icon\": \"\ud83d\udd04\", \"desc\": \"A new heat pump system, heating and cooling from one outdoor\", \"full\": \"A new heat pump system, heating and cooling from one outdoor unit, sized to the house and matched to a new air handler or coil, installed, commissioned and registered. Includes the rebate paperwork where the utility offers one. Quoted after a look at the house.\", \"section\": \"New Systems\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 6499.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-Q-HEATPUMP\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_q_full\", \"t\": \"quote\", \"name\": \"Full System Replacement, Heating and Cooling\", \"icon\": \"\ud83c\udfd7\", \"desc\": \"The whole system at once\", \"full\": \"The whole system at once: a new condenser, furnace or air handler and coil, matched and sized together, installed in a day with the old equipment gone. The best price per piece of equipment. Quoted after a look at the house.\", \"section\": \"New Systems\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 9499.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-Q-FULL\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_q_minisplit\", \"t\": \"quote\", \"name\": \"Ductless Mini Split Installation\", \"icon\": \"\ud83e\udee7\", \"desc\": \"A ductless system for a garage, addition, sunroom\", \"full\": \"A ductless system for a garage, addition, sunroom, bonus room or a whole house with no ducts: one outdoor unit and one to five wall or ceiling heads, line sets run and hidden, the electrical and a disconnect added, commissioned. Quoted by the number of zones.\", \"section\": \"New Systems\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 2999.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-Q-MINISPLIT\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_q_compressor\", \"t\": \"quote\", \"name\": \"Compressor Replacement\", \"icon\": \"\u2699\", \"desc\": \"The compressor in the outdoor unit replaced instead of the whole\", \"full\": \"The compressor in the outdoor unit replaced instead of the whole condenser, usually because the part is still under the manufacturer's ten-year warranty: recovered, swapped, brazed, a new drier, vacuumed and recharged. Quoted once the model and warranty are confirmed.\", \"section\": \"New Systems\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 1999.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-Q-COMPRESSOR\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_q_heat_exchanger\", \"t\": \"quote\", \"name\": \"Heat Exchanger Replacement\", \"icon\": \"\ud83e\uddf1\", \"desc\": \"A cracked heat exchanger replaced in a furnace\", \"full\": \"A cracked heat exchanger replaced in a furnace that is otherwise worth keeping, usually under the manufacturer's warranty on the part. Quoted against the price of a new furnace so you can pick.\", \"section\": \"New Systems\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 1999.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-Q-HEATEXCH\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_q_ducts\", \"t\": \"quote\", \"name\": \"New Ductwork or Whole-Home Duct Sealing\", \"icon\": \"\ud83e\uddf5\", \"desc\": \"A whole house re-ducted, ducts added to rooms\", \"full\": \"A whole house re-ducted, ducts added to rooms that never had them, or the existing system sealed from the inside (Aeroseal style) and tested for leakage. Quoted after a look at the attic and crawl space.\", \"section\": \"New Systems\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 2499.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-Q-DUCTS\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_q_zoning\", \"t\": \"quote\", \"name\": \"Zoning System Installation\", \"icon\": \"\ud83c\udf9b\", \"desc\": \"Motorized dampers, a zone control board and a thermostat per zone\", \"full\": \"Motorized dampers, a zone control board and a thermostat per zone added to the existing system so the upstairs and downstairs, or the bedrooms and the living room, are heated and cooled on their own. Quoted after a look at the ducts.\", \"section\": \"New Systems\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 2499.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-Q-ZONING\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_q_boiler\", \"t\": \"quote\", \"name\": \"Boiler Replacement\", \"icon\": \"\ud83d\udec1\", \"desc\": \"A new gas or oil boiler piped to the existing radiators\", \"full\": \"A new gas or oil boiler piped to the existing radiators or radiant loops, with new venting, controls and expansion tank, the old boiler removed. Quoted after a look at the system.\", \"section\": \"New Systems\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 5999.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-Q-BOILER\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_filter_ao\", \"t\": \"menu\", \"name\": \"Filter replacement\", \"icon\": \"\ud83e\uddfb\", \"desc\": \"The air filter swapped for a fresh one, the slot cleaned\", \"full\": \"The air filter swapped for a fresh one, the slot cleaned, the size written on the cabinet so you know it. You supply it or we bring the right size.\", \"section\": \"Maintenance\", \"unit\": \"unit\", \"unit_label\": \"filter\", \"price\": 39.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HV-AO-FILTER\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"fl_supply\", \"label\": \"Filter\", \"options\": [\"You supply the filter\", \"We supply a standard 1 inch filter\", \"We supply a 4 or 5 inch media filter\"], \"add\": {\"We supply a standard 1 inch filter\": 29.99, \"We supply a 4 or 5 inch media filter\": 69.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_coil_clean_ao\", \"t\": \"menu\", \"name\": \"Condenser coil deep clean\", \"icon\": \"\ud83e\uddfd\", \"desc\": \"The outdoor coil foamed with a coil cleaner and rinsed\", \"full\": \"The outdoor coil foamed with a coil cleaner and rinsed from the inside out, the fins straightened, the debris cleared from the base. Drops the head pressure and the power bill.\", \"section\": \"Maintenance\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 129.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-COILCLEAN\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_drain_flush_ao\", \"t\": \"menu\", \"name\": \"Condensate drain flush and treatment\", \"icon\": \"\ud83d\udeb0\", \"desc\": \"The drain line blown\", \"full\": \"The drain line blown out, the trap cleared and a tablet or treatment added so the algae does not clog it again this season.\", \"section\": \"Maintenance\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 89.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-DRAIN\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_float_ao\", \"t\": \"menu\", \"name\": \"Float safety switch\", \"icon\": \"\ud83d\udedf\", \"desc\": \"A float switch on the drain line or pan\", \"full\": \"A float switch on the drain line or pan that shuts the system off before a clog floods the ceiling. The cheapest insurance in the house.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 129.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-FLOAT\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_pump_ao\", \"t\": \"menu\", \"name\": \"Condensate pump replacement\", \"icon\": \"\ud83d\udca7\", \"desc\": \"The small pump that lifts the condensate to a drain\", \"full\": \"The small pump that lifts the condensate to a drain, dead or overflowing, replaced and tested with the float and tubing.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 249.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-PUMP\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_hardstart_ao\", \"t\": \"menu\", \"name\": \"Hard start kit\", \"icon\": \"\ud83d\ude80\", \"desc\": \"A start capacitor and relay added to an older compressor\", \"full\": \"A start capacitor and relay added to an older compressor that struggles or hums on start, so it kicks on clean and stops tripping the breaker.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 229.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-HARDSTART\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_surge_ao\", \"t\": \"menu\", \"name\": \"HVAC surge protector\", \"icon\": \"\ud83d\udee1\", \"desc\": \"A surge protector at the outdoor unit disconnect\", \"full\": \"A surge protector at the outdoor unit disconnect so a lightning strike or a utility surge takes the protector and not the control board or compressor.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 299.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-SURGE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_disconnect_ao\", \"t\": \"menu\", \"name\": \"Disconnect box and whip replacement\", \"icon\": \"\ud83d\udd0c\", \"desc\": \"The corroded or melted outdoor disconnect box and the whip\", \"full\": \"The corroded or melted outdoor disconnect box and the whip to the unit replaced, properly fused and sealed. Often the real reason the AC quit.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 249.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-DISCONNECT\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_pad_ao\", \"t\": \"menu\", \"name\": \"Condenser pad leveling or replacement\", \"icon\": \"\ud83e\uddf1\", \"desc\": \"The outdoor unit lifted and the pad re-leveled\", \"full\": \"The outdoor unit lifted and the pad re-leveled, or a new composite pad set, so the compressor oil stays where it belongs and the line set stops stressing.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-PAD\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"pd_new\", \"label\": \"Pad\", \"options\": [\"Level the existing pad\", \"New composite pad\"], \"add\": {\"New composite pad\": 99.99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_uv_bulb_ao\", \"t\": \"menu\", \"name\": \"UV bulb replacement\", \"icon\": \"\ud83d\udca1\", \"desc\": \"The UV lamp in an existing coil light or air purifier replaced\", \"full\": \"The UV lamp in an existing coil light or air purifier replaced on its yearly schedule, the fixture cleaned and the date marked.\", \"section\": \"Air Quality & Ducts\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 149.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-UVBULB\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_register_ao\", \"t\": \"menu\", \"name\": \"Register or grille replacement\", \"icon\": \"\ud83d\udd32\", \"desc\": \"A bent, painted-shut or rusted supply register or return grille\", \"full\": \"A bent, painted-shut or rusted supply register or return grille swapped for a new one that matches, sealed to the boot.\", \"section\": \"Air Quality & Ducts\", \"unit\": \"unit\", \"unit_label\": \"register\", \"price\": 44.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HV-AO-REGISTER\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_sanitize_ao\", \"t\": \"menu\", \"name\": \"Duct sanitizing fog\", \"icon\": \"\ud83e\uddeb\", \"desc\": \"An EPA-registered antimicrobial fogged through the duct system\", \"full\": \"An EPA-registered antimicrobial fogged through the duct system after a cleaning to knock down mold, bacteria and the musty smell.\", \"section\": \"Air Quality & Ducts\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 99.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-SANITIZE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_dryer_vent_ao\", \"t\": \"menu\", \"name\": \"Dryer vent cleaning\", \"icon\": \"\ud83e\uddfa\", \"desc\": \"The dryer vent brushed and vacuumed end to end\", \"full\": \"The dryer vent brushed and vacuumed end to end while we are there, the exterior cap cleared.\", \"section\": \"Air Quality & Ducts\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 129.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-DRYERVENT\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_tstat_swap_ao\", \"t\": \"menu\", \"name\": \"Thermostat swap, you supply it\", \"icon\": \"\ud83c\udf21\", \"desc\": \"Your new thermostat wired in place of the old one\", \"full\": \"Your new thermostat wired in place of the old one, set up and tested, the app paired if it is a smart one.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"unit\", \"unit_label\": \"thermostat\", \"price\": 129.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HV-AO-TSTAT\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_smart_setup_ao\", \"t\": \"menu\", \"name\": \"Smart thermostat app and Wi-Fi setup\", \"icon\": \"\ud83d\udcf1\", \"desc\": \"An installed smart thermostat connected to your Wi-Fi\", \"full\": \"An installed smart thermostat connected to your Wi-Fi, the app set up on your phone, schedules and away modes explained.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 49.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-SMARTSETUP\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_refrigerant_ao\", \"t\": \"menu\", \"name\": \"Refrigerant top off, R-410A\", \"icon\": \"\u2744\", \"desc\": \"A pound of R-410A added with the pressures and subcooling checked\", \"full\": \"A pound of R-410A added with the pressures and subcooling checked. For a system that is a little low, not one that is empty. Per pound.\", \"section\": \"Repair & Diagnostics\", \"unit\": \"unit\", \"unit_label\": \"lb\", \"price\": 99.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"HV-AO-REFRIG\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_co_test_ao\", \"t\": \"menu\", \"name\": \"Carbon monoxide and combustion safety test\", \"icon\": \"\ud83d\udea8\", \"desc\": \"A combustion analyzer on the furnace or boiler flue and a CO\", \"full\": \"A combustion analyzer on the furnace or boiler flue and a CO reading at every register and in the house, with the numbers on the report.\", \"section\": \"Maintenance\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 79.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-COTEST\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"hv_haul_ao\", \"t\": \"menu\", \"name\": \"Old unit or parts haul away\", \"icon\": \"\ud83d\ude9b\", \"desc\": \"The old parts, a window unit\", \"full\": \"The old parts, a window unit, a condensate pump or a dead thermostat hauled off and recycled; a whole condenser or furnace is the bigger option.\", \"section\": \"Extras\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 99.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"HV-AO-HAUL\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"ha_what\", \"label\": \"What goes?\", \"options\": [\"Parts or a window unit\", \"A condenser, air handler or furnace\"], \"add\": {\"A condenser, air handler or furnace\": 99.99}}]}], \"extras\": [], \"main\": [\"hv_diagnostic\", \"hv_ac_tuneup\", \"hv_furnace_tuneup\", \"hv_duct_clean\", \"hv_thermostat\", \"hv_full_tuneup\"], \"sections\": [\"Repair & Diagnostics\", \"Maintenance\", \"Air Quality & Ducts\", \"Heating\", \"New Systems\", \"Extras\"]};\n  var APP = '\/account', QUOTE = APP + '\/customer\/booking-assistant\/quote', CART = APP + '\/customer\/booking-assistant\/create-cart', ZIP = '70124';\n  var SQ_HOUSE = ['Up to 1,000 sq ft','1,001 - 2,000','2,001 - 3,000','3,001 - 4,000','4,001 - 5,000'], SQ_APT = ['Up to 1,000 sq ft','1,001 - 2,000','2,001 - 3,000'];\n  var I = {}, X = {};\n  D.items.forEach(function(o){ I[o.key] = o; }); (D.extras || []).forEach(function(a){ X[a.key] = a; });\n  var st = { sel: [], c: {}, ex: {}, all: true, inc: {}, desc: {} };\n  var q = { busy: false, res: [], groups: [], seq: 0, err: '' };\n  function $(id){ return document.getElementById(id); }\n  function esc(t){ return String(t == null ? '' : t).replace(\/[&<>\"]\/g, function(c){ return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]; }); }\n  function money(n){ return '$' + Number(n).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}); }\n  function dur(h){ var m = Math.round((Number(h) || 0) * 60), dd = Math.floor(m \/ 480), r = m % 480, hh = Math.floor(r \/ 60), mm = r % 60, p = []; if (dd) p.push(dd + ' day' + (dd > 1 ? 's' : '')); if (hh) p.push(hh + ' hr'); if (mm) p.push(mm + ' min'); return p.join(' ') || '0 min'; }\n  function unitTxt(o){ if (o.unit === 'sqft') return '\/ sq ft'; if (o.unit === 'hour') return '\/ hour'; if (o.unit === 'unit' && o.unit_label) return '\/ ' + o.unit_label; return ''; }\n  function on(k){ return st.sel.indexOf(k) >= 0; }\n  function nOf(o){ return o.unit === 'sqft' ? 'sq ft' : (o.unit === 'hour' ? 'hour' : (o.unit_label || '')); }\n  function pl(o, n){ return n > 1 && (o.unit === 'unit' || o.unit === 'hour') && !\/(ft|s)$\/.test(nOf(o)) ? 's' : ''; }\n  \/\/ per service settings, created with its defaults the first time it is added\n  function cf(o){\n    if (st.c[o.key]) return st.c[o.key];\n    var c = {};\n    if (o.t === 'visit') c = { often: 'One Time', freq: 'Weekly', prop: 0, sq: 1, beds: 1, full: 1, half: 0, cleaners: 1, hours: 2 };\n    else if (o.t === 'legacy') (o.fields || []).forEach(function(f){ if (f.t === 'seg') c[f.n] = f.def != null ? f.def : f.opts[0]; else if (f.t === 'num') c[f.n] = f.def; else if (f.t === 'list') c[f.n] = f.def || 0; else if (f.t === 'items') c.items = f.items.map(function(_, i){ return i === 0 ? 1 : 0; }); });\n    else { c.qty = o.qdef || o.min_qty || 1; c.ans = {}; (o.questions || []).forEach(function(qq){ c.ans[qq.key] = qq.options[0]; }); if ((o.variants || []).length){ var dv = o.variants.filter(function(x){ return x.key === o.variant_default || x.label === o.variant_default; })[0]; c.variant = (dv || o.variants[0]).key; if (o.rows){ c.rows = {}; o.variants.forEach(function(x){ c.rows[x.key] = 0; }); } \/* HF-2026-10-10z (Chris): nothing is picked for the customer, every count starts at 0 *\/ } }\n    st.c[o.key] = c; return c;\n  }\n  function shown(o, f){ if (!f.when) return true; var v = cf(o); for (var k in f.when){ if (f.when[k].indexOf(v[k]) < 0) return false; } return true; }\n  function rowsSum(o){ var c = cf(o), n = 0; for (var k in c.rows) n += c.rows[k]; return n; }\n  \/\/ a service with counted rows needs at least one row above 0 before it can be priced\n  function empty(o){\n    if (o.t === 'legacy'){ var f = (o.fields || []).filter(function(x){ return x.t === 'items'; })[0]; return !!f && !cf(o).items.some(function(n){ return n > 0; }); }\n    if (o.rows) return rowsSum(o) <= 0;\n    return false;\n  }\n  function hintOf(o){\n    if (o.hint) return o.hint;\n    if (o.t === 'quote') return 'custom quote';\n    if ((o.variants || []).length){ var ps = o.variants.map(function(x){ return x.price; }).filter(function(x){ return x > 0; }); if (ps.length) return 'from ' + money(Math.min.apply(null, ps)) + (o.unit !== 'flat' ? ' ' + unitTxt(o) : ''); }\n    return o.price > 0 ? money(o.price) + (o.unit !== 'flat' ? ' ' + unitTxt(o) : '') : 'see price';\n  }\n  \/\/ ---- the options under a picked card (white, on the left) ----\n  function ob(k, name, val, opts){ return '<div class=\"os\">' + opts.map(function(x){ return '<button type=\"button\" data-k=\"' + k + '\" data-fs=\"' + esc(name) + '\" data-v=\"' + esc(x) + '\"' + (x === val ? ' class=\"on\"' : '') + '>' + esc(x) + '<\/button>'; }).join('') + '<\/div>'; }\n  function om(k, name, val, min, max){ return '<div class=\"om\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"-1\"' + (val <= min ? ' disabled' : '') + ' aria-label=\"Less\">\u2212<\/button><b' + (val ? '' : ' class=\"z\"') + '>' + val + '<\/b><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"1\"' + (val >= max ? ' disabled' : '') + ' aria-label=\"More\">+<\/button><\/div>'; }\n  function ost(k, name, disp, unit, lo, hi){ return '<div class=\"ost\"><div class=\"om\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"-1\"' + (lo ? ' disabled' : '') + ' aria-label=\"Less\">\u2212<\/button><\/div><div class=\"ov\">' + esc(disp) + (unit ? '<small>' + esc(unit) + '<\/small>' : '') + '<\/div><div class=\"om\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"1\"' + (hi ? ' disabled' : '') + ' aria-label=\"More\">+<\/button><\/div><\/div>'; }\n  function lbl(t){ return '<div class=\"ol\">' + esc(t) + '<\/div>'; }\n  function optsHTML(o){\n    var c = cf(o), k = o.key, h = '';\n    if (o.t === 'visit'){\n      if (o.recurring){ h += lbl('How often?') + ob(k, 'often', c.often, ['One Time', 'Recurring']); if (c.often === 'Recurring') h += lbl('How frequently?') + ob(k, 'freq', c.freq, ['Weekly', 'Bi-Weekly', 'Monthly']); }\n      if (o.hourly){ var mx = c.often === 'Recurring' ? 4 : 8; if (c.hours > mx) c.hours = mx;\n        h += lbl('How many cleaners?') + ob(k, 'cleaners', c.cleaners === 2 ? '2 Cleaners' : '1 Cleaner', ['1 Cleaner', '2 Cleaners']);\n        h += lbl('How many hours?') + ost(k, 'hours', c.hours, 'hr' + (c.hours > 1 ? 's' : ''), c.hours <= 1, c.hours >= mx);\n      } else { var sl = c.prop ? SQ_APT : SQ_HOUSE; if (c.sq > sl.length - 1) c.sq = sl.length - 1;\n        h += lbl('Type of property') + ob(k, 'prop', c.prop ? 'Apartment \/ Condo' : 'House \/ Townhouse', ['House \/ Townhouse', 'Apartment \/ Condo']);\n        h += lbl('Square feet') + ost(k, 'sq', sl[c.sq].replace(' sq ft', ''), 'sq ft', c.sq <= 0, c.sq >= sl.length - 1);\n        h += lbl('Bedrooms & bathrooms') + '<div class=\"orm\"><div>Bedrooms' + om(k, 'beds', c.beds, 1, 9) + '<\/div><div>Full Baths' + om(k, 'full', c.full, 1, 9) + '<\/div><div>Half Baths' + om(k, 'half', c.half, 0, 9) + '<\/div><\/div>';\n      }\n    } else if (o.t === 'legacy'){\n      (o.fields || []).forEach(function(f){\n        if (!shown(o, f)) return;\n        if (f.t === 'seg') h += lbl(f.label) + ob(k, f.n, c[f.n], f.opts);\n        else if (f.t === 'num') h += lbl(f.label) + ost(k, f.n, Number(c[f.n]).toLocaleString('en-US'), f.unit + (f.unit && c[f.n] > 1 && !\/ft$\/.test(f.unit) ? 's' : ''), c[f.n] <= f.min, c[f.n] >= f.max);\n        else if (f.t === 'list') h += lbl(f.label) + ost(k, f.n, f.vals[c[f.n]], f.unit, c[f.n] <= 0, c[f.n] >= f.vals.length - 1);\n        else if (f.t === 'items') h += lbl(f.label) + f.items.map(function(it, i){ return '<div class=\"orw\"><span>' + esc(it) + '<\/span>' + om(k, 'it:' + i, c.items[i], 0, 20) + '<\/div>'; }).join('');\n      });\n    } else if (o.t === 'menu'){\n      if (o.rows) h += lbl(o.variant_q || 'How many?') + o.variants.map(function(x){ return '<div class=\"orw\"><span>' + esc(x.label) + '<small>' + money(x.price) + ' each<\/small><\/span>' + om(k, 'row:' + x.key, c.rows[x.key] || 0, 0, o.max_qty || 20) + '<\/div>'; }).join('');\n      else {\n        if ((o.variants || []).length){ var cv = o.variants.filter(function(x){ return x.key === c.variant; })[0] || o.variants[0];\n          h += lbl(o.variant_q || 'Which one?') + '<div class=\"os\">' + o.variants.map(function(x){ return '<button type=\"button\" data-k=\"' + k + '\" data-var=\"' + esc(x.key) + '\"' + (x.key === cv.key ? ' class=\"on\"' : '') + '>' + esc(x.label) + '<\/button>'; }).join('') + '<\/div>'; }\n        if (o.unit !== 'flat'){ var lab = nOf(o) + pl(o, c.qty); h += lbl('How many?') + ost(k, 'qty', Number(c.qty).toLocaleString('en-US'), lab, c.qty <= o.min_qty, c.qty >= o.max_qty); }\n        (o.questions || []).forEach(function(qq){ h += lbl(qq.label) + '<div class=\"os\">' + qq.options.map(function(x){ var ad = (qq.add || {})[x]; return '<button type=\"button\" data-k=\"' + k + '\" data-q=\"' + esc(qq.key) + '\" data-v=\"' + esc(x) + '\"' + (c.ans[qq.key] === x ? ' class=\"on\"' : '') + '>' + esc(x) + (ad ? ' <small>+' + money(ad).replace('.00', '') + '<\/small>' : '') + '<\/button>'; }).join('') + '<\/div>'; });\n      }\n    }\n    if (empty(o)) h += '<p class=\"oh\">Add at least one to see your price.<\/p>';\n    if ((o.inc || []).length) h += '<button type=\"button\" class=\"oi\" data-k=\"' + k + '\" data-tog=\"inc\">What is included <span>' + (st.inc[k] ? '\u25b4' : '\u25be') + '<\/span><\/button>' + (st.inc[k] ? '<ul>' + o.inc.map(function(i){ return '<li>' + esc(i) + '<\/li>'; }).join('') + '<\/ul>' : '');\n    return h ? '<div class=\"hfc-opt\">' + h + '<\/div>' : '';\n  }\n  function cardHTML(o){\n    var s = on(o.key), op = s ? optsHTML(o) : '';\n    \/\/ HF-2026-10-10x (Chris): a picked card with options spans both columns and pushes the others down\n    return '<div class=\"hfc-cw' + (s ? ' on' : '') + (op ? ' wide' : '') + '\"><button type=\"button\" class=\"hfc-card' + (s ? ' on' : '') + '\" data-svc=\"' + o.key + '\" aria-pressed=\"' + (s ? 'true' : 'false') + '\"><span class=\"hfc-ic\">' + o.icon + '<\/span><span><h4>' + esc(o.name) + '<\/h4><p>' + esc(o.desc) + (o.desc ? ' \u00b7 ' : '') + hintOf(o) + '<\/p><\/span><span class=\"hfc-ck\">' + (s ? '\u2713' : '') + '<\/span><\/button>' + op + '<\/div>';\n  }\n  function hostVisit(){ for (var i = 0; i < st.sel.length; i++){ var o = I[st.sel[i]]; if (o.t === 'visit' && !o.hourly) return o; } return null; }\n  function renderLeft(){\n    $('hfcMain').innerHTML = D.main.map(function(k){ return cardHTML(I[k]); }).join('');\n    var rest = D.items.filter(function(o){ return D.main.indexOf(o.key) < 0; });\n    \/\/ HF-2026-10-10x (Chris): no numbered steps; \"Most popular\" on top, then every category\n    $('hfcAll').hidden = false;\n    $('hfcAll').innerHTML = D.sections.map(function(sec){\n      var it = rest.filter(function(o){ return o.section === sec; }); if (!it.length) return '';\n      return '<div class=\"hfc-cat\"><div class=\"hfc-stp\"><h3>' + esc(sec) + '<\/h3><\/div><div class=\"hfc-sv\">' + it.map(cardHTML).join('') + '<\/div><\/div>';\n    }).join('');\n    var mb = $('hfcMore'); if (mb) mb.hidden = true;\n    var s2 = $('hfcS2'); if (s2){ s2.hidden = !(D.extras || []).length;\n      if (!s2.hidden){ var hv = hostVisit();\n        $('hfcAo').innerHTML = D.extras.map(function(a){ return '<button type=\"button\" class=\"hfc-ao' + (st.ex[a.key] && hv ? ' on' : '') + '\" data-ex=\"' + a.key + '\"' + (hv ? '' : ' disabled') + '><span>' + esc(a.name) + '<\/span><b>' + money(a.price) + (a.unit !== 'flat' ? ' <small>' + unitTxt(a) + '<\/small>' : '') + '<\/b><\/button>'; }).join('');\n        var nt = $('hfcAoNote'); nt.hidden = !!hv; nt.textContent = 'These ride along with a home cleaning visit. Pick Whole Home, Deep Clean, Move In \/ Out or Airbnb above to add them.';\n        var am = $('hfcAoMore'); if (am) am.hidden = true; } }\n  }\n  \/\/ ---- engine calls: which services price together ----\n  function menuSel(o){ var c = cf(o), m = { key: o.key, qty: 1, variant: null, answers: {} };\n    if (o.rows){ m.qty = rowsSum(o); m.answers = { rows: o.variants.filter(function(x){ return c.rows[x.key] > 0; }).map(function(x){ return x.key + ':' + c.rows[x.key]; }).join(',') }; }\n    else { m.qty = o.unit === 'flat' ? 1 : c.qty; m.variant = (o.variants || []).length ? c.variant : null; for (var qk in (c.ans || {})) m.answers[qk] = c.ans[qk]; }\n    return m; }\n  function groups(){\n    var g = [], menus = [], hv = hostVisit();\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'menu' && !empty(o)) menus.push(o); });\n    if (hv) g.push({ k: 'visit', host: hv, aos: menus, ex: Object.keys(st.ex).filter(function(x){ return st.ex[x]; }) });\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'visit' && o.hourly) g.push({ k: 'visit', host: o, aos: [], ex: [] }); });\n    if (!hv && menus.length) g.push({ k: 'menu', host: menus[0], aos: menus.slice(1), ex: [] });\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'legacy' && !empty(o)) g.push({ k: 'legacy', host: o, aos: [], ex: [] }); });\n    return g;\n  }\n  function selection(gr){\n    var o = gr.host, c = cf(o), p = { service_type: D.st, zip: ZIP, zipcode: ZIP };\n    if (gr.k === 'visit'){\n      p.cleaningType = 'House Cleaning'; p.houseCleaningType = o.hct;\n      if (o.recurring){ p.recurring = c.often; if (c.often === 'Recurring') p.frequency = c.freq; } else p.recurring = 'One Time';\n      if (o.hourly){ p.cleaners = c.cleaners === 2 ? '2 Cleaners' : '1 Cleaner'; p.hours = c.hours + ' HR'; }\n      else { var sl = c.prop ? SQ_APT : SQ_HOUSE; p.propertyType = c.prop ? 'Apartment \/ Condo' : 'House \/ Townhouse'; p.sqft = sl[c.sq]; p.bedrooms = String(c.beds); p.fullBaths = String(c.full); p.halfBaths = String(c.half); }\n    } else if (gr.k === 'legacy'){\n      for (var k in o.sel) p[k] = o.sel[k];\n      (o.fields || []).forEach(function(f){\n        if (!shown(o, f)) return;\n        if (f.t === 'seg'){ var val = c[f.n]; p[f.p] = f.pv ? f.pv[val] : val; if (f.p2 && f.pv2 && f.pv2[val]) p[f.p2] = f.pv2[val]; }\n        else if (f.t === 'num') p[f.p] = String(c[f.n]);\n        else if (f.t === 'list') p[f.p] = f.vals[c[f.n]];\n        else if (f.t === 'items'){ var sel = {}, parts = []; f.items.forEach(function(it, i){ var n = c.items[i] || 0; if (n > 0){ sel[it] = n; parts.push(n + ' x ' + it); } }); p[f.pj] = JSON.stringify(sel); p[f.pt] = parts.join(', '); }\n      });\n    } else {\n      var m = menuSel(o); p.menu_json = JSON.stringify({ key: o.key, code: o.code, qty: m.qty, variant: m.variant, answers: m.answers, name: o.name, extras_only: false }); p.service_code = o.code;\n    }\n    var aos = gr.aos.map(menuSel).concat(gr.ex.map(function(x){ return { key: x, qty: 1 }; }));\n    if (aos.length) p.addons_json = JSON.stringify(aos);\n    return p;\n  }\n  function post(url, body, again){\n    var h = { 'Content-Type': 'application\/json', 'Accept': 'application\/json', 'X-Requested-With': 'XMLHttpRequest' };\n    var t = document.querySelector('meta[name=\"csrf-token\"]'); if (t) h['X-CSRF-TOKEN'] = t.getAttribute('content');\n    \/\/ a price answers in well under a second; one that hangs (about 1 in 60 through the load balancer) is cut at 6 s and\n    \/\/ tried again, twice at most, so the box never sits on \"\u2026\" (cart posts are never retried)\n    var quote = url === QUOTE, ac = (quote && window.AbortController) ? new AbortController() : null, tm = ac ? setTimeout(function(){ ac.abort(); }, 6000) : null;\n    return fetch(url, { method: 'POST', headers: h, credentials: 'same-origin', body: JSON.stringify(body), signal: ac ? ac.signal : undefined }).then(function(r){ clearTimeout(tm); if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); })\n      .catch(function(e){ clearTimeout(tm); if (quote && (again || 0) < 2) return post(url, body, (again || 0) + 1); throw e; });\n  }\n  var timer = null;\n  function reprice(){\n    q.busy = true; q.err = ''; renderBox(); clearTimeout(timer);\n    timer = setTimeout(function(){\n      var my = ++q.seq, gs = groups();\n      if (!gs.length){ q.busy = false; q.groups = []; q.res = []; renderBox(); return; }\n      Promise.all(gs.map(function(g){ return post(QUOTE, selection(g)); })).then(function(rs){ if (my !== q.seq) return; q.groups = gs; q.res = rs; q.busy = false; renderBox(); })\n        .catch(function(){ if (my !== q.seq) return; q.busy = false; q.groups = []; q.res = []; q.err = 'We could not load a price. Please try again.'; renderBox(); });\n    }, 220);\n  }\n  \/\/ ---- the navy box: only what was added ----\n  function subOf(o){\n    var c = cf(o), sl;\n    if (o.t === 'visit'){ if (o.hourly) return (c.cleaners === 2 ? '2 cleaners' : '1 cleaner') + ' \u00b7 ' + c.hours + ' hr' + (c.hours > 1 ? 's' : '') + (c.often === 'Recurring' ? ' \u00b7 ' + c.freq : '');\n      sl = c.prop ? SQ_APT : SQ_HOUSE; return (c.often === 'Recurring' ? c.freq : 'One time') + ' \u00b7 ' + sl[c.sq].replace(' sq ft', '') + ' sq ft \u00b7 ' + c.beds + ' bd \u00b7 ' + c.full + (c.half ? '.5' : '') + ' ba'; }\n    if (o.t === 'legacy'){ var out = [];\n      (o.fields || []).forEach(function(f){ if (!shown(o, f)) return;\n        if (f.t === 'items') f.items.forEach(function(it, i){ if (c.items[i] > 0) out.push(c.items[i] + ' \u00d7 ' + it); });\n        else if (f.t === 'num') out.push(Number(c[f.n]).toLocaleString('en-US') + ' ' + f.unit + (c[f.n] > 1 && f.unit && !\/ft$\/.test(f.unit) ? 's' : ''));\n        else if (f.t === 'list') out.push(f.vals[c[f.n]] + (f.unit ? ' ' + f.unit : ''));\n        else if (f.t === 'seg') out.push(c[f.n]); });\n      return out.join(' \u00b7 '); }\n    if (o.t === 'quote') return 'Homer builds your quote in chat';\n    if (o.rows) return o.variants.filter(function(x){ return c.rows[x.key] > 0; }).map(function(x){ return c.rows[x.key] + ' \u00d7 ' + x.label; }).join(', ');\n    var v = (o.variants || []).filter(function(x){ return x.key === c.variant; })[0], bits = [];\n    if (v) bits.push(v.label); if (o.unit !== 'flat') bits.push(Number(c.qty).toLocaleString('en-US') + ' ' + nOf(o) + pl(o, c.qty));\n    (o.questions || []).forEach(function(qq){ var a = (c.ans || {})[qq.key]; if (a && a !== qq.options[0]) bits.push(\/^(yes|no)$\/i.test(a) ? qq.label.replace(\/\\?$\/, '') + ': ' + a : a); });\n    return bits.join(' \u00b7 ');\n  }\n  function bst(k, fn, n, min, max){ return '<div class=\"hfc-bs\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(fn) + '\" data-d=\"-1\"' + (n <= min ? ' disabled' : '') + ' aria-label=\"Less\">\u2212<\/button><b>' + Number(n).toLocaleString('en-US') + '<\/b><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(fn) + '\" data-d=\"1\"' + (n >= max ? ' disabled' : '') + ' aria-label=\"More\">+<\/button><\/div>'; }\n  function xb(k){ return '<button type=\"button\" class=\"x\" data-rm=\"' + esc(k) + '\" aria-label=\"Remove\">\u00d7<\/button>'; }\n  function moreOf(o){ var t = o.full || ((o.inc || []).length ? '' : o.desc); if (!t && !(o.inc || []).length) return '';\n    return '<button type=\"button\" class=\"hfc-sm\" data-k=\"' + o.key + '\" data-tog=\"desc\">' + (st.desc[o.key] ? 'See less \u25b4' : 'See more \u25be') + '<\/button>' + (st.desc[o.key] ? '<div class=\"hfc-dsc\">' + (t ? '<p>' + esc(t) + '<\/p>' : '') + ((o.inc || []).length ? '<ul>' + o.inc.map(function(i){ return '<li>' + esc(i) + '<\/li>'; }).join('') + '<\/ul>' : '') + '<\/div>' : ''); }\n  \/\/ HF-2026-10-10x (Chris): every item is its own row with its amount (\u2212 n +) and price; \"See more\" opens the description\n  function groupHTML(o, price, pending){\n    var c = cf(o), P = function(v){ return v != null && !pending ? '<b>' + money(v) + '<\/b>' : '<b>&hellip;<\/b>'; }, h = '<div class=\"hfc-sg\">';\n    if (o.t === 'quote') return h + '<div class=\"hfc-ln\"><span>' + esc(o.name) + '<small>Homer builds your quote in chat<\/small><\/span><b class=\"q\">Custom quote<\/b>' + xb(o.key) + '<\/div>' + moreOf(o) + '<\/div>';\n    if (o.rows){\n      h += '<div class=\"hfc-sh\"><span>' + esc(o.name) + '<\/span>' + xb(o.key) + '<\/div>';\n      o.variants.forEach(function(x){ var n = c.rows[x.key] || 0; if (n <= 0) return;\n        h += '<div class=\"hfc-ln hfc-row\"><span>' + esc(x.label) + '<small>' + money(x.price) + ' each<\/small><\/span>' + bst(o.key, 'row:' + x.key, n, 0, o.max_qty || 20) + P(pending ? null : (function(v){ var nc = Math.round((v + 0.01) \/ 5) * 5 - 0.01; return (nc > 0 && Math.abs(nc - v) < 2.6) ? Math.round(nc * 100) \/ 100 : v; })(Math.round(x.price * n * 100) \/ 100)) + '<\/div>'; });\n      if (empty(o)) h += '<div class=\"hfc-ln hfc-row\"><span><small>Add at least one on the left<\/small><\/span><\/div>';\n    } else {\n      var stp = (o.t === 'menu' && o.unit !== 'flat') ? bst(o.key, 'qty', c.qty, o.min_qty, o.max_qty) : '';\n      h += '<div class=\"hfc-ln\"><span>' + esc(o.name) + '<small>' + esc(subOf(o)) + '<\/small><\/span>' + stp + P(price) + xb(o.key) + '<\/div>';\n    }\n    return h + moreOf(o) + '<\/div>';\n  }\n  function lineHTML(name, sub, price, k){ return '<div class=\"hfc-ln\"><span>' + esc(name) + (sub ? '<small>' + esc(sub) + '<\/small>' : '') + '<\/span>' + price + (k ? '<button type=\"button\" class=\"x\" data-rm=\"' + esc(k) + '\" aria-label=\"Remove\">\u00d7<\/button>' : '') + '<\/div>'; }\n  function renderBox(){\n    var h = '<div class=\"t\">Your services<\/div>', ok = true, total = 0, mins = 0, any = false, na = false, quotes = [];\n    var pending = q.busy || (q.groups.length !== groups().length);\n    if (!st.sel.length) h += '<p class=\"hfc-emp\">Pick one or more services on the left. Everything you add shows here with its price.<\/p>';\n    var lines = '';\n    var priced = {};\n    q.groups.forEach(function(g, i){ var r = q.res[i] || {};\n      if (!r.available){ na = true; ok = false; return; }\n      if (r.needs_quote || !(r.price > 0)){ ok = false; return; }\n      any = true; total += Number(r.price); mins += Number(r.duration) || 0;\n      var aol = r.addons || [], aoSum = 0; aol.forEach(function(l){ aoSum += Number(l.price) || 0; });\n      \/\/ HF-2026-10-11a: every line carries its own engine price and the total is their sum (no rounding on a line)\n      var base = Math.round((r.price - aoSum) * 100) \/ 100;\n      priced[g.host.key] = base;\n      aol.forEach(function(l){ priced[l.key] = Math.round(Number(l.price) * 100) \/ 100; });\n    });\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'quote') quotes.push(o); lines += groupHTML(o, priced[k], pending); });\n    Object.keys(st.ex).forEach(function(x){ if (st.ex[x] && hostVisit()) lines += lineHTML(X[x].name, 'With your home cleaning', priced[x] != null && !pending ? '<b>' + money(priced[x]) + '<\/b>' : '<b>&hellip;<\/b>', 'ex:' + x); });\n    if (lines) h += '<div class=\"hfc-lns\">' + lines + '<\/div>';\n    var onlyQ = st.sel.length && quotes.length === st.sel.length, canBook = !pending && any && ok && !q.err;\n    var ptxt = onlyQ ? 'Custom quote' : (!st.sel.length ? '$0.00' : (pending ? '&hellip;' : (na ? 'Not available yet' : (any ? money(total) : '&hellip;'))));\n    var btn = onlyQ ? 'Get My Quote' : 'Book It';\n    h += '<div class=\"hfc-foot\"><div><div class=\"hfc-price' + (na || onlyQ ? ' na' : '') + '\" id=\"hfcP\">' + ptxt + '<\/div><p>' + (canBook ? 'est. duration: ' + dur(mins) : (onlyQ ? 'Homer builds your quote in chat' : '')) + '<\/p><\/div><button type=\"button\" class=\"hfc-btn\" id=\"hfcBook\"' + (canBook || onlyQ ? '' : ' disabled') + '>' + btn + '<\/button><\/div>';\n    if (quotes.length && !onlyQ) h += '<div class=\"hfc-err\">' + esc(quotes.map(function(o){ return o.name; }).join(', ')) + ' ' + (quotes.length > 1 ? 'are' : 'is') + ' priced by custom quote. Book the rest, then ask Homer for the quote.<\/div>';\n    if (q.err) h += '<div class=\"hfc-err\">' + esc(q.err) + '<\/div>';\n    h += '<div class=\"hfc-ft\">Upfront price \u00b7 free cancellation up to 24 hours before service<\/div>';\n    $('hfcNb').innerHTML = h;\n    $('hfcBarP').innerHTML = ptxt;\n    $('hfcBarS').textContent = st.sel.length ? st.sel.length + ' service' + (st.sel.length > 1 ? 's' : '') : 'Pick a service';\n    $('hfcBarB').disabled = !(canBook || onlyQ); $('hfcBarB').textContent = btn;\n  }\n  function ask(text){\n    try { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'hf_hero_select', hf_kind: 'query', hf_value: text }); } catch (e) {}\n    if (typeof window.hfOpenConcierge === 'function'){ window.hfOpenConcierge({ type: 'query', q: text, big: true }); return; }\n    window.location.href = APP + '\/customer\/ai-booking?embed=1&panel=1&full=1&q=' + encodeURIComponent(text);\n  }\n  function busyBtns(t){ [$('hfcBook'), $('hfcBarB')].forEach(function(b){ if (b){ b.disabled = true; b.textContent = t; } }); }\n  function book(){\n    var quotes = st.sel.filter(function(k){ return I[k].t === 'quote'; });\n    if (quotes.length && quotes.length === st.sel.length){ ask('I need a quote for ' + quotes.map(function(k){ return I[k].name; }).join(' and ')); return; }\n    var gs = q.groups, rs = q.res; if (!gs.length) return;\n    busyBtns('Adding to your cart\u2026');\n    try { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'hf_card_book', hf_service: st.sel.map(function(k){ return I[k].name; }).join(', '), hf_zip: ZIP }); } catch (e) {}\n    var i = 0, last = null;\n    function fail(m){ q.err = m || 'We could not add this to your cart. Please try again.'; renderBox(); }\n    function next(){\n      if (i >= gs.length){ window.location.href = (last && last.redirect) || (APP + '\/customer\/services\/cart'); return; }\n      var g = gs[i], r = rs[i], p = selection(g);\n      p.price = r.price; p.duration = r.duration; p.provider_id = r.provider_id; p.last_category_id = r.last_category_id; p.sacf_id = r.sacf_id || null;\n      p.line_title = ((g.aos.length || g.ex.length) ? '' : r.summary) || g.host.name; \/\/ with extras on the line, each extra gets its own row, so the host line is just its own name p.append = i > 0 ? 1 : 0;\n      if (r.job_items && r.job_items.length) p.job_items = r.job_items;\n      if (r.addons && r.addons.length){ p.addons_json = JSON.stringify(r.addons); var tt = {}; r.addons.forEach(function(l){ if (l.code) tt[l.code] = l.name + ((Number(l.qty) || 1) > 1 ? ' \u00d7 ' + l.qty : ''); }); p.line_titles = JSON.stringify(tt); }\n      post(CART, p).then(function(d){\n        if (d && d.success){ last = d; i++; next(); return; }\n        if (d && d.code === 'quote_only'){ ask('I need a quote for ' + g.host.name); return; }\n        if (d && d.code === 'one_pro_per_booking'){ fail(g.host.name + ' is done by a different pro, so it books separately. Book the rest first, then add it.'); return; }\n        fail(d && d.message);\n      }).catch(function(){ fail(); });\n    }\n    next();\n  }\n  function toggle(k){\n    var o = I[k]; if (!o) return;\n    if (on(k)) st.sel.splice(st.sel.indexOf(k), 1);\n    else { if (o.t === 'visit') st.sel = st.sel.filter(function(x){ return I[x].t !== 'visit'; }); st.sel.push(k); cf(o); }\n    renderLeft(); reprice();\n  }\n  function onClick(e){\n    var t = e.target.closest ? e.target.closest('button') : null; if (!t || !$('hfc').contains(t)) return;\n    if (t.getAttribute('data-hq')){ ask(t.getAttribute('data-hq')); return; }\n    if (t.getAttribute('data-svc')){ toggle(t.getAttribute('data-svc')); return; }\n    var rm = t.getAttribute('data-rm');\n    if (rm){ if (rm.indexOf('ex:') === 0) st.ex[rm.slice(3)] = 0; else if (on(rm)) st.sel.splice(st.sel.indexOf(rm), 1); renderLeft(); reprice(); return; }\n    if (t.getAttribute('data-ex')){ var xk = t.getAttribute('data-ex'); st.ex[xk] = st.ex[xk] ? 0 : 1; renderLeft(); reprice(); return; }\n    if (t.id === 'hfcMore'){ st.all = !st.all; renderLeft(); if (!st.all) $('hfcS1').scrollIntoView({ behavior: 'smooth', block: 'start' }); return; }\n    if (t.id === 'hfcBook' || t.id === 'hfcBarB'){ book(); return; }\n    var o = I[t.getAttribute('data-k')]; if (!o) return; var c = cf(o);\n    if (t.getAttribute('data-tog') === 'inc'){ st.inc[o.key] = !st.inc[o.key]; renderLeft(); return; }\n    if (t.getAttribute('data-tog') === 'desc'){ st.desc[o.key] = !st.desc[o.key]; renderBox(); return; }\n    var fs = t.getAttribute('data-fs');\n    if (fs){ var val = t.getAttribute('data-v');\n      if (o.t === 'visit'){ if (fs === 'prop') c.prop = val === 'Apartment \/ Condo' ? 1 : 0; else if (fs === 'cleaners') c.cleaners = val === '2 Cleaners' ? 2 : 1; else c[fs] = val; }\n      else c[fs] = val;\n      renderLeft(); reprice(); return; }\n    if (t.getAttribute('data-var')){ c.variant = t.getAttribute('data-var'); renderLeft(); reprice(); return; }\n    if (t.getAttribute('data-q')){ c.ans[t.getAttribute('data-q')] = t.getAttribute('data-v'); renderLeft(); reprice(); return; }\n    var fn = t.getAttribute('data-fn'), d = parseInt(t.getAttribute('data-d'), 10); if (!fn) return;\n    if (o.t === 'visit'){\n      if (fn === 'beds' || fn === 'full') c[fn] = Math.max(1, Math.min(9, c[fn] + d)); else if (fn === 'half') c.half = Math.max(0, Math.min(9, c.half + d));\n      else if (fn === 'sq') c.sq = Math.max(0, c.sq + d); else if (fn === 'hours') c.hours = Math.max(1, Math.min(c.often === 'Recurring' ? 4 : 8, c.hours + d));\n    } else if (fn.indexOf('it:') === 0){ var ii = parseInt(fn.slice(3), 10); c.items[ii] = Math.max(0, Math.min(20, (c.items[ii] || 0) + d)); }\n    else if (fn.indexOf('row:') === 0){ var rk = fn.slice(4); c.rows[rk] = Math.max(0, Math.min(o.max_qty || 20, (c.rows[rk] || 0) + d));\n      if ($('hfcNb').contains(t) && rowsSum(o) <= 0 && on(o.key)) st.sel.splice(st.sel.indexOf(o.key), 1); } \/\/ the last row taken to 0 in the box takes the service off\n    else if (fn === 'qty'){ var sp = o.pstep || o.step || 1; c.qty = Math.max(o.min_qty, Math.min(o.max_qty, d > 0 ? Math.floor(c.qty \/ sp) * sp + sp : Math.ceil(c.qty \/ sp) * sp - sp)); }\n    else { var f = (o.fields || []).filter(function(x){ return x.n === fn; })[0]; if (!f) return;\n      if (f.t === 'num') c[fn] = Math.max(f.min, Math.min(f.max, c[fn] + d * f.step)); else if (f.t === 'list') c[fn] = Math.max(0, Math.min(f.vals.length - 1, c[fn] + d)); }\n    renderLeft(); reprice();\n  }\n  \/\/ HF-2026-10-10o (Chris): the booking box stays in view while the left side scrolls, never above the white section's\n  \/\/ top and never below the end of the selections (a WP wrapper's overflow breaks CSS sticky, so it is pinned by hand).\n  function pin(){\n    var col = $('hfcBox'), nb = $('hfcNb'); if (!col || !nb) return;\n    if (window.innerWidth <= 900){ nb.style.position = ''; nb.style.top = ''; nb.style.left = ''; nb.style.width = ''; return; }\n    var hh = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--hf-header-h'), 10) || 88, T = hh + 16;\n    var r = col.getBoundingClientRect(), h = nb.offsetHeight;\n    if (h + T + 16 > window.innerHeight) T = window.innerHeight - 16 - h;\n    if (r.top >= T || r.height <= h + 2){ nb.style.position = 'relative'; nb.style.top = '0px'; nb.style.left = ''; nb.style.width = ''; }\n    else if (r.bottom - h <= T){ nb.style.position = 'absolute'; nb.style.top = (r.height - h) + 'px'; nb.style.left = '0px'; nb.style.width = r.width + 'px'; }\n    else { nb.style.position = 'fixed'; nb.style.top = T + 'px'; nb.style.left = r.left + 'px'; nb.style.width = r.width + 'px'; }\n  }\n  var pinQ = false; function pinSoon(){ if (pinQ) return; pinQ = true; requestAnimationFrame(function(){ pinQ = false; pin(); }); }\n  \/\/ the pills stay one row: the last ones are hidden until the row fits the search bar's width\n  function fitPills(){ var p = document.querySelector('#hfc .hfc-pop'); if (!p) return; var bs = [].slice.call(p.children), w = p.clientWidth, gap = 8;\n    bs.forEach(function(b){ b.style.display = ''; });\n    for (var n = bs.length; n > 1; n--){ var t = 0; for (var i = 0; i < n; i++) t += bs[i].offsetWidth + (i ? gap : 0); if (t <= w) break; bs[n - 1].style.display = 'none'; } }\n  function boot(){\n    if (!$('hfc')) return;\n    fitPills(); window.addEventListener('resize', fitPills); if (document.fonts && document.fonts.ready) document.fonts.ready.then(fitPills);\n    window.addEventListener('scroll', pinSoon, { passive: true }); window.addEventListener('resize', pinSoon);\n    if (window.MutationObserver) new MutationObserver(pinSoon).observe($('hfcLay'), { childList: true, subtree: true });\n    document.addEventListener('click', onClick);\n    $('hfcSearch').addEventListener('submit', function(e){ e.preventDefault(); ask(($('hfcQ').value || '').replace(\/^\\s+|\\s+$\/g, '') || 'I need help with my home'); });\n    \/\/ HF-2026-10-10z (Chris): no service is pre-selected on any page; the customer picks\n    renderLeft(); reprice();\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot); else boot();\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7509952 e-con-full e-flex e-con e-parent\" data-id=\"7509952\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-aadaed2 elementor-widget elementor-widget-html\" data-id=\"aadaed2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- hf: cleaning cards grid retired 2026-07-16 - replaced by hero booking cell in container 464c961. Restore from wp option hf_cleaning_3435_backup_20260716b -->\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-eade1a6 e-con-full e-flex e-con e-parent\" data-id=\"eade1a6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2ebfeba elementor-widget elementor-widget-html\" data-id=\"2ebfeba\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- hf: Pressure Washing + Trash Haul Away info sections retired 2026-07-16; services live in the hero tabs. Restore from wp option hf_cleaning_3435_backup_20260716_preTrim -->\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2adfbb7 e-con-full e-flex e-con e-parent\" data-id=\"2adfbb7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e818acb elementor-widget elementor-widget-html\" data-id=\"e818acb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>#hf-optimized-faqs{display:none!important}<\/style>\n<!-- cleaning-HIW-from-parent-671577f-2026-05-29 -->\n<style>\n.hf-svc-hiw{max-width:1200px;margin:0 auto;padding:42px 24px;font-family:'Inter',-apple-system,sans-serif;text-align:center}\n.hf-svc-hiw *{box-sizing:border-box}\n.hf-svc-hiw-label{font-size:26px;font-weight:700;letter-spacing:3px;text-transform:uppercase;color:#40C9F3;margin-bottom:12px}\n.hf-svc-hiw h2{font-size:clamp(28px,4vw,42px);font-weight:800;color:#2D3E50;margin:0 0 12px}\n.hf-svc-hiw-sub{font-size:17px;color:#6b7d93;max-width:560px;margin:0 auto 48px;line-height:1.6}\n.hf-svc-steps{display:grid;grid-template-columns:repeat(3,1fr);gap:32px;position:relative}\n.hf-svc-steps::before{content:'';position:absolute;top:36px;left:12%;right:12%;height:2px;background:linear-gradient(90deg,#2ED87A,#40C9F3);z-index:0}\n.hf-svc-step{position:relative;z-index:1}\n.hf-svc-step-num{width:72px;height:72px;border-radius:50%;background:#fff;border:2px solid #eef2f6;display:flex;align-items:center;justify-content:center;margin:0 auto 16px;font-size:13px;font-weight:700;color:#fff;position:relative}\n.hf-svc-step-num-inner{width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center}\n.hf-sn-1 .hf-svc-step-num-inner{background:#2ED87A}\n.hf-sn-2 .hf-svc-step-num-inner{background:#40C9F3}\n.hf-sn-3 .hf-svc-step-num-inner{background:#3D4F6F}\n.hf-sn-4 .hf-svc-step-num-inner{background:#2ED87A}\n.hf-svc-step-num svg{width:26px;height:26px;fill:#fff}\n.hf-svc-step h3{font-size:16px;font-weight:700;color:#2D3E50;margin:0 0 8px}\n.hf-svc-step p{font-size:13px;color:#6b7d93;line-height:1.5;margin:0}\n\n\n.hf-svc-trust2 img:hover{opacity:1}\n@media(max-width:768px){\n  \/* hf-svc-hiw-mobile-stack-2026-05-28: mirror home hf-hiw2 mobile stack layout *\/\n  \/* hf-svc-hiw-mobile-top-gap-2026-05-29: breathing room above HIW section under svc-grid *\/\n  .hf-svc-hiw{padding:64px 18px 28px}\n  .hf-svc-hiw-label{font-size:25px;letter-spacing:2px;margin-bottom:12px}\n  .hf-svc-hiw h2{font-size:26px;line-height:1.2;margin-bottom:10px}\n  .hf-svc-hiw-sub{font-size:14px;max-width:340px;margin:0 auto 32px}\n  .hf-svc-steps{grid-template-columns:1fr;gap:0;padding:0 0 0 6px;position:relative;margin-bottom:0}\n  .hf-svc-steps::before{display:block;top:27px;bottom:27px;left:31px;right:auto;width:2px;height:auto;background:linear-gradient(180deg,#2ED87A,#40C9F3,#3D4F6F);border-radius:2px}\n  .hf-svc-step{display:grid;grid-template-columns:64px 1fr;grid-template-rows:auto auto;column-gap:18px;row-gap:6px;align-items:start;text-align:left;padding-bottom:28px}\n  .hf-svc-step:last-child{padding-bottom:0}\n  .hf-svc-step-num{grid-column:1;grid-row:1 \/ span 2;width:54px;height:54px;margin:0;justify-self:start;margin-left:4px;box-shadow:0 4px 12px rgba(41,171,226,.18)}\n  .hf-svc-step-num-inner{width:42px;height:42px}\n  .hf-svc-step-num svg{width:20px;height:20px}\n  .hf-svc-step h3{grid-column:2;grid-row:1;font-size:16.5px;font-weight:700;color:#40C9F3;margin:0;padding-top:4px;line-height:1.25}\n  .hf-svc-step p{grid-column:2;grid-row:2;font-size:13.5px;color:#000;line-height:1.55;margin:0;padding-top:2px}\n}\n<\/style><div class=\"hf-svc-hiw\">\n  <div class=\"hf-svc-hiw-label\">HOW IT WORKS<\/div>\n  <h2>From Selection to Done in Just a Few Taps<\/h2>\n  <p class=\"hf-svc-hiw-sub\">No phone tag. No guessing games. One upfront price, hand-matched pros, and total peace of mind.<\/p>\n  <div class=\"hf-svc-steps\">\n    <div class=\"hf-svc-step hf-sn-1\">\n      <div class=\"hf-svc-step-num\"><div class=\"hf-svc-step-num-inner\"><svg viewBox=\"0 0 24 24\"><path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0016 9.5 6.5 6.5 0 109.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"><\/path><\/svg><\/div><\/div>\n      <h3>Select Your Service<\/h3>\n      <p>Pick your service, set the details, and see your real upfront price instantly.<\/p>\n    <\/div>\n    <div class=\"hf-svc-step hf-sn-2\">\n      <div class=\"hf-svc-step-num\"><div class=\"hf-svc-step-num-inner\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z\"><\/path><\/svg><\/div><\/div>\n      <h3>Schedule The Job<\/h3>\n      <p>Select the day and time best for you and checkout with any of our secure payment options.<\/p>\n    <\/div>\n    <div class=\"hf-svc-step hf-sn-3\">\n      <div class=\"hf-svc-step-num\"><div class=\"hf-svc-step-num-inner\"><svg viewBox=\"0 0 24 24\"><path d=\"M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm-2 16l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z\"><\/path><\/svg><\/div><\/div>\n      <h3>Sit Back And Relax<\/h3>\n      <p>House Fly takes care of all pro-matching, scheduling, communication, and payments.<\/p>\n    <\/div>\n    \n  <\/div>\n  <\/div>\n\n<!-- cleaning-Common-Questions-from-parent-68f9d25-2026-05-29 -->\n<div class=\"hf-cq\">\n  <div class=\"hf-cq-head\">\n    <div class=\"hf-cq-eyebrow\">Common Questions<\/div>\n    <h2 class=\"hf-cq-title\">Ask Homer Anything<\/h2>\n    <p class=\"hf-cq-sub\">Select a question to start a chat with Homer.<\/p>\n  <\/div>\n  <div class=\"hf-cq-chips\">\n    <button type=\"button\" class=\"hf-cq-chip\" onclick=\"hfCqAsk(this, &quot;What is your cancellation policy?&quot;)\">\n      <span class=\"hf-cq-q\">What&rsquo;s the cancellation policy?<\/span>\n      <span class=\"hf-cq-arrow\">&#8599;<\/span>\n    <\/button>\n    <button type=\"button\" class=\"hf-cq-chip\" onclick=\"hfCqAsk(this, &quot;Can I book a same-day service?&quot;)\">\n      <span class=\"hf-cq-q\">Same-day booking?<\/span>\n      <span class=\"hf-cq-arrow\">&#8599;<\/span>\n    <\/button>\n    <button type=\"button\" class=\"hf-cq-chip\" onclick=\"hfCqAsk(this, &quot;What payment methods do you accept?&quot;)\">\n      <span class=\"hf-cq-q\">Payment methods?<\/span>\n      <span class=\"hf-cq-arrow\">&#8599;<\/span>\n    <\/button>\n  <\/div>\n<\/div>\n\n<style>\n\/* Match Simple-by-Design header proportions (.hf-hiw2-eyebrow\/.hf-hiw2-title\/.hf-hiw2-sub) *\/\n\/* hf-cq-bottom-gap-2026-05-29: separation from \"We're here to help\" section *\/\n.hf-cq { font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; max-width: 1140px; margin: 0 auto; padding: 60px 24px 56px; color: #000; box-sizing: border-box; }\n.hf-cq * { box-sizing: border-box; }\n.hf-cq-head { text-align: center; margin-bottom: 48px; }\n.hf-cq-eyebrow { font-size: 27.5px; font-weight: 800; letter-spacing: 2.5px; text-transform: uppercase; color: #29ABE2; margin: 0 0 14px; line-height: 1.1; font-family: inherit; }\n.hf-cq-title { font-size: 38px; font-weight: 800; color: #000; line-height: 1.18; margin: 0 0 14px; letter-spacing: -0.5px; font-family: inherit; }\n.hf-cq-sub { font-size: 16px; color: #000; max-width: 520px; margin: 0 auto; line-height: 1.6; font-family: inherit; }\n\n\/* Chips \u2014 no card wrapper, sit directly on the page background *\/\n.hf-cq-chips { display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; max-width: 680px; margin: 0 auto; padding: 0 16px; }\n.hf-cq-chip { background: #F1F5F9; border: 1px solid #E2E8F0; border-radius: 99px; padding: 12px 20px; font-size: 14px; color: #1E293B; font-weight: 600; cursor: pointer; transition: all .15s; font-family: inherit; display: inline-flex; align-items: center; gap: 8px; }\n.hf-cq-chip:hover { background: #E0F2FE; border-color: #7DD3FC; color: #0C4A6E; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(64,201,243,0.18); }\n.hf-cq-chip:active { transform: translateY(0); }\n.hf-cq-chip.hf-cq-loading { opacity: 0.65; cursor: wait; }\n.hf-cq-arrow { color: #94A3B8; font-size: 12px; }\n.hf-cq-chip:hover .hf-cq-arrow { color: #29ABE2; }\n\n\/* \"View All FAQs \u2192\" Elementor button widget #0ce9e01 \u2014 turn link blue *\/\n.elementor-element-0ce9e01 .elementor-button,\n.elementor-element-0ce9e01 .elementor-button-text,\n.elementor-element-0ce9e01 .elementor-button .elementor-button-text { color: #29ABE2 !important; }\n.elementor-element-0ce9e01 .elementor-button:hover .elementor-button-text { color: #0891B2 !important; }\n\n\/* Hide snippet 3650's invisible-but-present accordion on homepage (was set earlier) *\/\nbody.home #hf-optimized-faqs, body.page-id-2229 #hf-optimized-faqs, body.page-id-538 #hf-optimized-faqs { display: none !important; }\n\n\/* Mobile \u2014 match SBD breakpoints *\/\n@media (max-width: 900px) {\n  .hf-cq { padding: 50px 20px 44px; }\n  .hf-cq-head { margin-bottom: 36px; }\n  .hf-cq-eyebrow { font-size: 25px; letter-spacing: 2px; margin-bottom: 12px; }\n  .hf-cq-sub { font-size: 14px; max-width: 340px; }\n}\n@media (max-width: 700px) {\n  .hf-cq { padding: 40px 18px 36px; }\n  .hf-cq-eyebrow { font-size: 22px; letter-spacing: 1.8px; }\n  .hf-cq-title { font-size: 28px; }\n  .hf-cq-chips { gap: 10px; }\n  .hf-cq-chip { padding: 10px 16px; font-size: 13px; }\n}\n<\/style>\n\n<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"How does House Fly work for booking home services?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"House Fly is a concierge home services platform serving the Greater New Orleans area. Chat with Homer, pick your date and time, and pay upfront. A local home services pro arrives and completes the work. Transparent pricing, instant booking, and a real rep manages the job from start to finish.\"}},{\"@type\":\"Question\",\"name\":\"Are there any hidden fees with House Fly?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"No. The service fee is built into the upfront price shown when you book, so there are no surprise charges at checkout or after service. The price you see is the price you pay. Payments are processed securely through Stripe with no extra processing fees added at checkout.\"}},{\"@type\":\"Question\",\"name\":\"What is House Fly's cancellation policy?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"You can cancel any House Fly booking for free up to 24 hours before the scheduled appointment and receive a full refund. Cancellations inside the 24-hour window may incur a small fee depending on the service. Reschedule any time by chatting with Homer or contacting House Fly support.\"}},{\"@type\":\"Question\",\"name\":\"Can I book same-day home services with House Fly?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. Most House Fly home services have same-day or next-day availability across the Greater New Orleans coverage area. Available time slots appear in real time when you book through Homer. Emergency services like plumbing leaks are often dispatched within a couple of hours of booking.\"}},{\"@type\":\"Question\",\"name\":\"What payment methods does House Fly accept?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"House Fly accepts all major credit cards, Apple Pay, and PayPal. All payments are processed securely through Stripe's PCI-compliant infrastructure. Your card is charged only when you confirm the booking. You can save a payment method to your account for one-tap rebooking on future services.\"}},{\"@type\":\"Question\",\"name\":\"How does House Fly choose its home services pros?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"House Fly hand-selects local home services pros through a diligence process that includes reviewing each pro's Google Business Profile, customer reviews, and operating history. We work only with pros that demonstrate a strong track record of quality work in their local area.\"}}]}<\/script>\n\n<script>\n(function(){\n  function getInput(){\n    var f = document.getElementById('hfCcFrame');\n    try { return f && f.contentDocument && f.contentDocument.querySelector('#hfAiSearchInput'); }\n    catch(e){ return null; }\n  }\n  function inject(q, btn, tries){\n    var input = getInput();\n    if (input) {\n      try {\n        input.value = q;\n        input.dispatchEvent(new Event('input', {bubbles:true}));\n        var form = input.form || document.getElementById('hfCcFrame').contentDocument.getElementById('hfAiSearchForm');\n        if (form) {\n          if (typeof form.requestSubmit === 'function') form.requestSubmit();\n          else form.dispatchEvent(new Event('submit', {bubbles:true, cancelable:true}));\n        }\n      } catch(e){}\n      if (btn) btn.classList.remove('hf-cq-loading');\n      return;\n    }\n    if (tries > 0) setTimeout(function(){ inject(q, btn, tries - 1); }, 300);\n    else if (btn) btn.classList.remove('hf-cq-loading');\n  }\n  window.hfCqAsk = function(btn, q){\n    if (btn && btn.classList) btn.classList.add('hf-cq-loading');\n    var launcher = document.getElementById('hfCcLauncher');\n    if (launcher) launcher.click();\n    setTimeout(function(){ inject(q, btn, 20); }, 400);\n  };\n})();\n<\/script>\n<!-- cleaning-Help-from-parent-7f6a459-2026-05-29 -->\n<style>\n.hf-contact{font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;width:100%;background:linear-gradient(180deg,#f8fbfd 0%,#f1f6fb 100%);padding:48px 20px;text-align:center}\n.hf-contact *{box-sizing:border-box;margin:0;padding:0}\n.hf-contact-inner{max-width:520px;margin:0 auto}\n.hf-contact-heading{font-size:30px;font-weight:800;color:#000;margin:0 0 10px;line-height:1.2;letter-spacing:-.3px}\n.hf-contact-sub{font-size:15px;color:#000;margin:0 auto 26px;max-width:340px;line-height:1.5}\n\n.hf-chat-cta{display:inline-flex;align-items:center;justify-content:center;gap:10px;background:#29ABE2;color:#fff;font-weight:700;font-size:16px;padding:16px 36px;border-radius:12px;border:0;cursor:pointer;text-decoration:none;box-shadow:0 10px 28px rgba(41,171,226,.32);font-family:inherit;line-height:1;transition:transform .2s,box-shadow .2s;position:relative;margin-bottom:24px}\n.hf-chat-cta{-webkit-tap-highlight-color:rgba(46,216,122,.3)}.hf-chat-cta:hover{transform:translateY(-2px);box-shadow:0 14px 32px rgba(46,216,122,.4);background:#2ED87A;color:#fff}.hf-chat-cta:active,.hf-chat-cta:focus,.hf-chat-cta:focus-visible{background:#29ABE2!important;color:#fff!important;outline:2px solid #29ABE2!important;outline-offset:2px;-webkit-tap-highlight-color:transparent}\/* hf-cta-no-red-2026-05-24 *\/\n.hf-chat-cta svg{width:20px;height:20px;fill:#fff}\n.hf-chat-cta-dot{position:absolute;top:13px;right:18px;width:8px;height:8px;border-radius:50%;background:#2ED87A;box-shadow:0 0 0 4px rgba(46,216,122,.25);animation:hfPulse 2s infinite}\n@keyframes hfPulse{0%,100%{box-shadow:0 0 0 4px rgba(46,216,122,.25)}50%{box-shadow:0 0 0 8px rgba(46,216,122,.10)}}\n\n.hf-contact-divider{display:flex;align-items:center;gap:12px;color:#8a9ab0;font-size:11px;letter-spacing:1.8px;text-transform:uppercase;font-weight:700;margin-bottom:18px}\n.hf-contact-divider::before,.hf-contact-divider::after{content:\"\";flex:1;height:1px;background:#d8e0ea}\n\n.hf-contact-links{display:flex;flex-direction:column;gap:10px}\n.hf-contact-link{display:flex;align-items:center;gap:14px;padding:16px 22px;border-radius:14px;color:#fff;text-decoration:none;transition:transform .2s,box-shadow .2s;font-size:15px;font-weight:600;line-height:1.2}\n.hf-contact-link:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(0,0,0,.18);color:#fff;text-decoration:none}\n.hf-contact-link .ic{width:36px;height:36px;border-radius:10px;background:rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;flex-shrink:0}\n.hf-contact-link .ic svg{width:20px;height:20px;fill:#fff}\n.hf-contact-link .lbl{font-weight:700;font-size:15px;color:#fff}\n.hf-contact-link .inf{margin-left:auto;font-weight:700;font-size:15px;color:#fff;letter-spacing:.2px}\n\n.hf-cc-call{background:linear-gradient(135deg,#2ED87A 0%,#24b866 100%)}\n.hf-cc-text{background:linear-gradient(135deg,#40C9F3 0%,#2ba8d4 100%)}\n.hf-cc-email{background:linear-gradient(135deg,#3D4F6F 0%,#2f3e58 100%)}\n\n@media (max-width:600px){\n  .hf-contact{padding:40px 16px}\n  .hf-contact-heading{font-size:26px}\n  .hf-contact-sub{font-size:14px;margin-bottom:22px}\n  .hf-chat-cta{padding:15px 30px;font-size:15px;margin-bottom:20px}\n  .hf-contact-link{padding:14px 18px}\n  .hf-contact-link .lbl{font-size:14px}\n  .hf-contact-link .inf{font-size:14px}\n}\n@media (max-width:380px){\n  .hf-contact-heading{font-size:22px}\n  .hf-contact-link{padding:13px 14px;gap:10px}\n  .hf-contact-link .ic{width:32px;height:32px}\n  .hf-contact-link .ic svg{width:18px;height:18px}\n  .hf-contact-link .lbl{font-size:13px}\n  .hf-contact-link .inf{font-size:13px;letter-spacing:0}\n}\n\n@media (min-width: 768px) {\n  \/* hf-help-desktop-grid-2026-05-28: 3 square cards side-by-side on wide viewports *\/\n  .hf-contact-inner { max-width: 1000px; }\n  .hf-contact-links { flex-direction: row; gap: 20px; align-items: stretch; }\n  .hf-contact-link {\n    flex: 1 1 0;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    text-align: center;\n    padding: 36px 24px;\n    gap: 16px;\n    min-height: 230px;\n    border-radius: 20px;\n  }\n  .hf-contact-link .ic {\n    width: 64px;\n    height: 64px;\n    border-radius: 50%;\n  }\n  .hf-contact-link .ic svg { width: 28px; height: 28px; }\n  .hf-contact-link .lbl { font-size: 22px; font-weight: 800; }\n  .hf-contact-link .lbl::after { content: ' Us'; }\n  .hf-contact-link .inf { margin-left: 0; font-size: 15px; font-weight: 500; opacity: .95; letter-spacing: .2px; }\n}\n<\/style>\n<div class=\"hf-contact\">\n  <div class=\"hf-contact-inner\">\n    <h2 class=\"hf-contact-heading\">We're Here to Help<\/h2>\n    <p class=\"hf-contact-sub\">Reach out however works best for you.<\/p>\n\n    <button type=\"button\" class=\"hf-chat-cta\" onclick=\"var l=document.getElementById('hfCcLauncher');if(l){l.click();}\">\n      <svg viewBox=\"0 0 24 24\"><path d=\"M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z\"\/><\/svg>\n      Chat with Homer\n      <span class=\"hf-chat-cta-dot\"><\/span>\n    <\/button>\n\n    <div class=\"hf-contact-divider\">Or Reach Us<\/div>\n\n    <div class=\"hf-contact-links\">\n      <a class=\"hf-contact-link hf-cc-call\" href=\"tel:5044207359\" data-wpel-link=\"internal\" rel=\"follow\">\n        <div class=\"ic\"><svg viewBox=\"0 0 24 24\"><path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"\/><\/svg><\/div>\n        <span class=\"lbl\">Call<\/span>\n        <span class=\"inf\">504-420-7359<\/span>\n      <\/a>\n      <a class=\"hf-contact-link hf-cc-text\" href=\"sms:5044207359\" data-wpel-link=\"internal\" rel=\"follow\">\n        <div class=\"ic\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z\"\/><\/svg><\/div>\n        <span class=\"lbl\">Text<\/span>\n        <span class=\"inf\">504-420-7359<\/span>\n      <\/a>\n      <a class=\"hf-contact-link hf-cc-email\" href=\"mailto:help@housefly.com\">\n        <div class=\"ic\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z\"\/><\/svg><\/div>\n        <span class=\"lbl\">Email<\/span>\n        <span class=\"inf\">help@housefly.com<\/span>\n      <\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":0,"featured_media":0,"parent":538,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5586","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.6 (Yoast SEO v28.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>HVAC Repair and Maintenance | Book Local Pros | House Fly<\/title>\n<meta name=\"description\" content=\"Book HVAC Services with House Fly. See your real upfront price for every service and book online in minutes.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/housefly.com\/es\/services\/hvac\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HVAC\" \/>\n<meta property=\"og:description\" content=\"Book HVAC Services with House Fly. See your real upfront price for every service and book online in minutes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/housefly.com\/es\/services\/hvac\/\" \/>\n<meta property=\"og:site_name\" content=\"House Fly\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/houseflyapp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@houseflyapp\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Reparaci\u00f3n y mantenimiento de aire acondicionado | Reserva pros locales | House Fly","description":"Book HVAC Services with House Fly. See your real upfront price for every service and book online in minutes.","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:\/\/housefly.com\/es\/services\/hvac\/","og_locale":"es_MX","og_type":"article","og_title":"HVAC","og_description":"Book HVAC Services with House Fly. See your real upfront price for every service and book online in minutes.","og_url":"https:\/\/housefly.com\/es\/services\/hvac\/","og_site_name":"House Fly","article_publisher":"https:\/\/www.facebook.com\/houseflyapp","twitter_card":"summary_large_image","twitter_site":"@houseflyapp","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/housefly.com\/services\/hvac\/","url":"https:\/\/housefly.com\/services\/hvac\/","name":"Reparaci\u00f3n y mantenimiento de aire acondicionado | Reserva pros locales | House Fly","isPartOf":{"@id":"https:\/\/housefly.com\/#website"},"datePublished":"2026-10-11T02:32:05+00:00","description":"Book HVAC Services with House Fly. See your real upfront price for every service and book online in minutes.","breadcrumb":{"@id":"https:\/\/housefly.com\/services\/hvac\/#breadcrumb"},"inLanguage":"es-MX","potentialAction":[{"@type":"ReadAction","target":["https:\/\/housefly.com\/services\/hvac\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/housefly.com\/services\/hvac\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/housefly.com\/"},{"@type":"ListItem","position":2,"name":"Services","item":"https:\/\/housefly.com\/services\/"},{"@type":"ListItem","position":3,"name":"HVAC"}]},{"@type":"WebSite","@id":"https:\/\/housefly.com\/#website","url":"https:\/\/housefly.com\/","name":"House Fly","description":"App M\u00f3vil de Servicios para el Hogar Bajo Demanda","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/housefly.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es-MX"}]}},"_links":{"self":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/5586","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/comments?post=5586"}],"version-history":[{"count":0,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/5586\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/538"}],"wp:attachment":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/media?parent=5586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}