{"id":2057,"date":"2025-05-06T11:02:40","date_gmt":"2025-05-06T10:02:40","guid":{"rendered":"https:\/\/prontosolucoes.pt\/?page_id=2057"},"modified":"2026-10-09T15:16:53","modified_gmt":"2026-10-09T14:16:53","slug":"plumber-in-porto","status":"publish","type":"page","link":"https:\/\/prontosolucoes.pt\/pt\/plumber-in-porto\/","title":{"rendered":"Canalizador no Porto  \nDispon\u00edvel 24h para emerg\u00eancias"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2057\" class=\"elementor elementor-2057\">\n\t\t\t\t<div class=\"elementor-element elementor-element-47e4722 e-con-full e-flex e-con e-parent\" data-id=\"47e4722\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b5f1f69 elementor-widget elementor-widget-html\" data-id=\"b5f1f69\" 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<!-- PRONTO | Homepage Hero Content + Booking Lab Bar -->\r\n<div id=\"pronto-home-hero-content\" class=\"pronto-home-hero-content\">\r\n  <style>\r\n    #pronto-home-hero-content {\r\n      --pronto-navy: #0F2B49;\r\n      --pronto-yellow: #E1A134;\r\n      --pronto-white: #FFFFFF;\r\n    }\r\n\r\n    #pronto-home-hero-content.pronto-home-hero-content {\r\n      width: min(100%, 860px);\r\n      margin: 0 auto;\r\n      padding-left: 24px;\r\n      padding-right: 24px;\r\n      box-sizing: border-box;\r\n      text-align: center;\r\n    }\r\n    #pronto-home-hero-content .phc-title {\r\n      margin: 0 0 20px;\r\n      color: var(--pronto-white);\r\n      font: 800 54px\/1.05 \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n      letter-spacing: -1px;\r\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.38), 0 8px 22px rgba(0, 0, 0, 0.32);\r\n      transform: translateY(-12px);\r\n    }\r\n\r\n    #pronto-home-hero-content .phc-subtitle {\r\n      margin: 0 auto 36px;\r\n      max-width: 660px;\r\n      color: var(--pronto-white);\r\n      font: 500 18px\/1.45 \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n      text-shadow: 0 1px 3px rgba(0, 0, 0, 0.34);\r\n    }\r\n    #pronto-home-hero-content .phb-button {\r\n      width: min(100%, 760px);\r\n      margin: 0 auto;\r\n      display: grid;\r\n      grid-template-columns: minmax(0, 1fr) auto;\r\n      align-items: center;\r\n      gap: 12px;\r\n      border: 1px solid rgba(255, 255, 255, 0.50);\r\n      border-radius: 18px;\r\n      padding: 12px;\r\n      box-sizing: border-box;\r\n      background: rgba(255, 255, 255, 0.22);\r\n      -webkit-backdrop-filter: blur(18px) saturate(170%);\r\n              backdrop-filter: blur(18px) saturate(170%);\r\n      box-shadow: 0 16px 38px rgba(0, 0, 0, 0.22);\r\n      cursor: pointer;\r\n      text-align: left;\r\n      appearance: none;\r\n      transition: transform 180ms ease, box-shadow 180ms ease;\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-button:hover {\r\n      transform: translateY(-1px);\r\n      box-shadow: 0 18px 42px rgba(0, 0, 0, 0.26);\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-button:focus-visible {\r\n      outline: 3px solid rgba(225, 161, 52, 0.55);\r\n      outline-offset: 3px;\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-query {\r\n      min-height: 58px;\r\n      display: grid;\r\n      grid-template-columns: minmax(0, 1fr) auto minmax(140px, 0.42fr);\r\n      align-items: center;\r\n      border-radius: 14px;\r\n      background: rgba(255, 255, 255, 0.90);\r\n      -webkit-backdrop-filter: blur(10px) saturate(150%);\r\n              backdrop-filter: blur(10px) saturate(150%);\r\n      border: 1px solid rgba(255, 255, 255, 0.62);\r\n      color: var(--pronto-navy);\r\n      overflow: hidden;\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-main,\r\n    #pronto-home-hero-content .phb-location {\r\n      min-height: 58px;\r\n      display: flex;\r\n      align-items: center;\r\n      background: transparent;\r\n      color: var(--pronto-navy);\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-main {\r\n      gap: 11px;\r\n      min-width: 0;\r\n      padding: 0 20px;\r\n      font: 700 16px\/1.2 \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-main-label {\r\n      white-space: nowrap;\r\n      overflow: hidden;\r\n      text-overflow: ellipsis;\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-main-text-mobile {\r\n      display: none;\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-divider {\r\n      width: 1px;\r\n      height: 30px;\r\n      background: rgba(15, 43, 73, 0.20);\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-location {\r\n      justify-content: center;\r\n      gap: 8px;\r\n      padding: 0 18px;\r\n      font: 800 15px\/1.2 \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n      white-space: nowrap;\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-search-icon,\r\n    #pronto-home-hero-content .phb-location-icon {\r\n      flex: 0 0 auto;\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-action {\r\n      min-height: 58px;\r\n      display: inline-flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      border-radius: 14px;\r\n      padding: 0 26px;\r\n      background: #D99425;\r\n      color: #FFFFFF;\r\n      font: 800 15px\/1 \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n      white-space: nowrap;\r\n      text-shadow: 0 1px 1px rgba(0, 0, 0, 0.18);\r\n      box-shadow: 0 9px 22px rgba(225, 161, 52, 0.30);\r\n    }\r\n\r\n    #pronto-home-hero-content .phb-action-arrow {\r\n      display: none;\r\n    }\r\n    @media (min-width: 641px) and (max-width: 900px) {\r\n      #pronto-home-hero-content.pronto-home-hero-content {\r\n        width: min(100%, 820px);\r\n        padding-left: clamp(28px, 5vw, 44px);\r\n        padding-right: clamp(28px, 5vw, 44px);\r\n      }\r\n\r\n      #pronto-home-hero-content .phc-title {\r\n        max-width: 700px;\r\n        margin-left: auto;\r\n        margin-right: auto;\r\n        font-size: clamp(40px, 6vw, 48px);\r\n        line-height: 1.06;\r\n        transform: translateY(-6px);\r\n      }\r\n\r\n      #pronto-home-hero-content .phc-subtitle {\r\n        max-width: 580px;\r\n        margin-bottom: 30px;\r\n        font-size: 16px;\r\n        line-height: 1.42;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-button {\r\n        width: min(100%, 680px);\r\n        gap: 10px;\r\n        padding: 10px;\r\n        border-radius: 17px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-query {\r\n        min-height: 54px;\r\n        grid-template-columns: minmax(0, 1fr) auto minmax(118px, 0.36fr);\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-main,\r\n      #pronto-home-hero-content .phb-location {\r\n        min-height: 54px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-main {\r\n        padding: 0 16px;\r\n        font-size: 15px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-location {\r\n        padding: 0 14px;\r\n        font-size: 14px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-action {\r\n        min-height: 54px;\r\n        padding: 0 22px;\r\n        font-size: 14px;\r\n      }\r\n    }\r\n    @media (max-width: 640px) {\r\n      #pronto-home-hero-content.pronto-home-hero-content {\r\n        width: min(100%, 390px);\r\n        padding-top: 18px;\r\n        padding-left: 14px;\r\n        padding-right: 14px;\r\n        box-sizing: border-box;\r\n      }\r\n\r\n      #pronto-home-hero-content .phc-title {\r\n        max-width: 330px;\r\n        margin: 0 auto 12px;\r\n        font-size: 30px;\r\n        line-height: 1.08;\r\n        letter-spacing: -0.6px;\r\n        transform: none;\r\n      }\r\n\r\n      #pronto-home-hero-content .phc-subtitle {\r\n        max-width: 310px;\r\n        margin-bottom: 18px;\r\n        font-size: 14px;\r\n        line-height: 1.38;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-button {\r\n        width: min(94%, 350px);\r\n        margin-left: auto;\r\n        margin-right: auto;\r\n        grid-template-columns: minmax(0, 1fr) auto;\r\n        gap: 7px;\r\n        padding: 7px;\r\n        border-radius: 16px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-query {\r\n        min-height: 42px;\r\n        grid-template-columns: minmax(0, 1fr) auto minmax(78px, auto);\r\n        border-radius: 12px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-main,\r\n      #pronto-home-hero-content .phb-location {\r\n        min-height: 42px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-main {\r\n        gap: 6px;\r\n        padding: 0 9px;\r\n        font-size: 12.5px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-main-label {\r\n        font-size: 0;\r\n        line-height: 1;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-main-text-desktop {\r\n        display: none;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-main-text-mobile {\r\n        display: inline;\r\n        font: 700 11.5px\/1.12 \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n        letter-spacing: -0.15px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-divider {\r\n        height: 22px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-location {\r\n        gap: 4px;\r\n        padding: 0 8px;\r\n        font-size: 12.3px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-search-icon,\r\n      #pronto-home-hero-content .phb-location-icon {\r\n        width: 16px;\r\n        height: 16px;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-action {\r\n        min-width: 42px;\r\n        min-height: 42px;\r\n        padding: 0;\r\n        border-radius: 12px;\r\n        font-size: 0;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-action-text {\r\n        display: none;\r\n      }\r\n\r\n      #pronto-home-hero-content .phb-action-arrow {\r\n        display: inline;\r\n        font: 900 22px\/1 \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n      }\r\n    }\r\n  <\/style>\r\n\r\n  <h1 class=\"phc-title\">24h Plumbing Repairs in Porto<\/h1>\r\n\r\n  <p class=\"phc-subtitle\">Fast help for leaks, blocked drains, toilets, sinks and other urgent plumbing issues in Porto.<\/p>\r\n\r\n  <button type=\"button\"\r\n          class=\"phb-button pronto-precall cta-hero-booking pp-service-plumbing\"\r\n          aria-label=\"Open booking flow\">\r\n    <span class=\"phb-query\">\r\n      <span class=\"phb-main\">\r\n        <span class=\"phb-main-label\">\r\n          <span class=\"phb-main-text-desktop\">What do you need help with?<\/span>\r\n          <span class=\"phb-main-text-mobile\">How can we help?<\/span>\r\n        <\/span>\r\n      <\/span>\r\n\r\n      <span class=\"phb-divider\" aria-hidden=\"true\"><\/span>\r\n\r\n      <span class=\"phb-location\">\r\n        <svg class=\"phb-location-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n          <path d=\"M12 21C12 21 5.5 14.75 5.5 9.5C5.5 5.91 8.41 3 12 3C15.59 3 18.5 5.91 18.5 9.5C18.5 14.75 12 21 12 21Z\" stroke=\"#0F2B49\" stroke-width=\"2.4\" stroke-linejoin=\"round\"><\/path>\r\n          <circle cx=\"12\" cy=\"9.5\" r=\"2.2\" stroke=\"#0F2B49\" stroke-width=\"2.2\"><\/circle>\r\n        <\/svg>\r\n        <span id=\"pronto-hero-bar-location-text\">Zip Code<\/span>\r\n      <\/span>\r\n    <\/span>\r\n\r\n    <span class=\"phb-action\">\r\n      <span class=\"phb-action-text\">Get Help Now<\/span>\r\n      <span class=\"phb-action-arrow\" aria-hidden=\"true\">\u2192<\/span>\r\n    <\/span>\r\n  <\/button>\r\n\r\n  <script>\r\n    (() => {\r\n      \"use strict\";\r\n\r\n      function runHeroLocationHint() {\r\n        const locationText = document.getElementById(\"pronto-hero-bar-location-text\");\r\n\r\n        if (!locationText) return;\r\n\r\n        function cleanLocation(value) {\r\n          const text = String(value || \"\")\r\n            .trim()\r\n            .replace(\/\\s+\/g, \" \");\r\n\r\n          if (!text) return \"\";\r\n          if (text === \"-\") return \"\";\r\n          if (text.length > 48) return \"\";\r\n\r\n          return text;\r\n        }\r\n\r\n        function resolveHeroBackendUrl(pathname) {\r\n          const fromGlobal = String(window.PRONTO_BOOKING_SUBMIT_URL || \"\").trim();\r\n          const overlay = document.getElementById(\"pronto-precall-overlay\");\r\n          const fromOverlay = overlay\r\n            ? String(overlay.getAttribute(\"data-submit-url\") || \"\").trim()\r\n            : \"\";\r\n          const seedUrl = fromGlobal || fromOverlay;\r\n\r\n          if (seedUrl) {\r\n            try {\r\n              const submitUrl = new URL(seedUrl, window.location.href);\r\n              return new URL(pathname, `${submitUrl.origin}\/`).toString();\r\n            } catch (error) {}\r\n          }\r\n\r\n          return pathname;\r\n        }\r\n\r\n        function applyHeroLocation(value) {\r\n          const cleaned = cleanLocation(value);\r\n          locationText.textContent = cleaned || \"Area\";\r\n        }\r\n\r\n        applyHeroLocation(\"Area\");\r\n\r\n        fetch(resolveHeroBackendUrl(\"\/address\/booking-hero-area-hint\"), {\r\n          method: \"GET\",\r\n          headers: {\r\n            \"Accept\": \"application\/json\"\r\n          }\r\n        })\r\n          .then((response) => response.json())\r\n          .then((data) => {\r\n            if (!data || data.ok !== true) return;\r\n\r\n            applyHeroLocation(data.display_area);\r\n          })\r\n          .catch(() => {\r\n            applyHeroLocation(\"Area\");\r\n          });\r\n      }\r\n\r\n      if (document.readyState === \"loading\") {\r\n        document.addEventListener(\"DOMContentLoaded\", runHeroLocationHint, { once: true });\r\n      } else {\r\n        runHeroLocationHint();\r\n      }\r\n    })();\r\n  <\/script>\r\n<\/div>\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-d6b8247 e-con-full e-flex e-con e-parent\" data-id=\"d6b8247\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2b5944d elementor-widget elementor-widget-html\" data-id=\"2b5944d\" 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>\r\n  .pronto-plumber-card-section {\r\n    width: 100%;\r\n    max-width: none;\r\n    margin: 0 auto;\r\n    padding: 10px 0 8px;\r\n    background: #F0F6FE;\r\n  }\r\n\r\n  .pronto-plumber-card-section > h2 {\r\n    margin: 0 20px 34px;\r\n    color: #0F2B49;\r\n    font-family: \"Montserrat\", sans-serif;\r\n    font-size: 36px;\r\n    font-weight: 700;\r\n    line-height: 1.08;\r\n    letter-spacing: -0.03em;\r\n    text-align: center;\r\n  }\r\n\r\n  .pronto-plumber-card-section > p {\r\n    margin: 0 20px 22px;\r\n    color: #0F2B49;\r\n    font-size: 16px;\r\n    font-weight: 700;\r\n    line-height: 1.5;\r\n    text-align: center;\r\n  }\r\n\r\n  @media (max-width: 767px) {\r\n    .pronto-plumber-card-section > h2 {\r\n      margin: 0 16px 36px;\r\n      font-size: clamp(2rem, 8vw, 2.6rem);\r\n      line-height: 1.1;\r\n      letter-spacing: -0.03em;\r\n    }\r\n\r\n    .pronto-plumber-card-section > p {\r\n      margin: 0 20px 24px;\r\n      font-size: 16px;\r\n      font-weight: 700;\r\n      line-height: 1.5;\r\n    }\r\n  }\r\n\r\n  .pronto-plumber-card-grid {\r\n    width: min(calc(100% - 48px), 1220px);\r\n    max-width: 1220px;\r\n    margin: 0 auto;\r\n    display: grid;\r\n    grid-template-columns: repeat(3, minmax(0, 1fr));\r\n    gap: 18px;\r\n  }\r\n\r\n  .pronto-plumber-card {\r\n    position: relative;\r\n    min-height: clamp(330px, 30vw, 405px);\r\n    border: 0;\r\n    border-radius: 14px;\r\n    overflow: hidden;\r\n    text-decoration: none;\r\n    color: #ffffff;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    width: 100%;\r\n    padding: 0;\r\n    background-position: center;\r\n    background-size: cover;\r\n    background-repeat: no-repeat;\r\n    box-shadow: none;\r\n    transform: scale(1);\r\n    transform-origin: center center;\r\n    transition: transform 0.28s ease, box-shadow 0.28s ease;\r\n    will-change: transform;\r\n    font: inherit;\r\n    text-align: inherit;\r\n    cursor: pointer;\r\n    appearance: none;\r\n    -webkit-appearance: none;\r\n  }\r\n\r\n  .pronto-plumber-card::before {\r\n    content: \"\";\r\n    position: absolute;\r\n    inset: 0;\r\n    background: rgba(0, 0, 0, 0.58);\r\n    z-index: 1;\r\n  }\r\n\r\n  .pronto-plumber-card:hover {\r\n    z-index: 4;\r\n    transform: scale(1.035);\r\n    box-shadow: 0 18px 38px rgba(15, 43, 70, 0.28);\r\n  }\r\n\r\n  .pronto-plumber-card:focus-visible {\r\n    outline: 3px solid rgba(225, 161, 52, 0.95);\r\n    outline-offset: 4px;\r\n  }\r\n\r\n  .pronto-plumber-card-content {\r\n    position: relative;\r\n    z-index: 2;\r\n    width: 100%;\r\n    padding: 28px 24px;\r\n    text-align: center;\r\n  }\r\n\r\n  .pronto-plumber-card-title {\r\n    font-size: 26px;\r\n    line-height: 1.18;\r\n    font-weight: 800;\r\n    color: #ffffff;\r\n    margin: 0 0 34px;\r\n    text-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);\r\n  }\r\n\r\n  .pronto-plumber-card-title {\r\n    display: block;\r\n    font-size: 26px;\r\n    line-height: 1.18;\r\n    font-weight: 800;\r\n    color: #ffffff;\r\n    margin: 0 0 34px;\r\n    text-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);\r\n  }\r\n\r\n  .pronto-plumber-card-text {\r\n    display: block;\r\n    font-size: 17px;\r\n    line-height: 1.55;\r\n    font-weight: 700;\r\n    color: #ffffff;\r\n    margin: 0 0 24px;\r\n    text-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);\r\n  }\r\n\r\n  .pronto-plumber-card-button {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    min-height: 40px;\r\n    padding: 10px 22px;\r\n    border-radius: 12px;\r\n    background: #E1A134;\r\n    color: #ffffff;\r\n    font-size: 16px;\r\n    line-height: 1;\r\n    font-weight: 800;\r\n    text-decoration: none;\r\n    box-shadow: 0 8px 18px rgba(0, 0, 0, 0.18);\r\n    transition: background 0.22s ease, transform 0.22s ease;\r\n  }\r\n\r\n  .pronto-plumber-card:hover .pronto-plumber-card-button {\r\n    background: #D97706;\r\n    transform: translateY(-1px);\r\n  }\r\n\r\n  .pronto-plumber-card-drain {\r\n    background-image: url(\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2026\/04\/desentupimento-no-porto-desentupir-lava-loica.webp\");\r\n  }\r\n\r\n  .pronto-plumber-card-leak {\r\n    background-image: url(\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2026\/04\/canalizador-no-porto-reparacao-de-canalizacao.webp\");\r\n  }\r\n\r\n  .pronto-plumber-card-fixtures {\r\n    background-image: url(\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2026\/04\/canalizador-no-porto-ferramentas-de-canalizacao.webp\");\r\n  }\r\n\r\n  @media (max-width: 1180px) {\r\n    .pronto-plumber-card-grid {\r\n      width: min(calc(100% - 36px), 1080px);\r\n      gap: 16px;\r\n    }\r\n\r\n    .pronto-plumber-card {\r\n      min-height: 350px;\r\n    }\r\n\r\n    .pronto-plumber-card-title {\r\n      font-size: 22px;\r\n      margin-bottom: 24px;\r\n    }\r\n\r\n    .pronto-plumber-card-text {\r\n      font-size: 15px;\r\n      line-height: 1.48;\r\n    }\r\n\r\n    .pronto-plumber-card-button {\r\n      font-size: 14px;\r\n      padding: 10px 18px;\r\n    }\r\n  }\r\n\r\n  @media (max-width: 900px) {\r\n    .pronto-plumber-card-grid {\r\n      width: min(calc(100% - 28px), 660px);\r\n      grid-template-columns: 1fr;\r\n      gap: 16px;\r\n    }\r\n\r\n    .pronto-plumber-card {\r\n      min-height: 330px;\r\n    }\r\n\r\n    .pronto-plumber-card:hover {\r\n      transform: scale(1.018);\r\n    }\r\n  }\r\n\r\n  @media (max-width: 480px) {\r\n    .pronto-plumber-card-grid {\r\n      width: min(calc(100% - 22px), 440px);\r\n      gap: 14px;\r\n    }\r\n\r\n    .pronto-plumber-card {\r\n      min-height: 315px;\r\n    }\r\n\r\n    .pronto-plumber-card-content {\r\n      padding: 24px 18px;\r\n    }\r\n\r\n    .pronto-plumber-card-title {\r\n      font-size: 23px;\r\n      margin-bottom: 22px;\r\n    }\r\n\r\n    .pronto-plumber-card-text {\r\n      font-size: 15px;\r\n      line-height: 1.45;\r\n      margin-bottom: 22px;\r\n    }\r\n\r\n    .pronto-plumber-card-button {\r\n      max-width: 100%;\r\n      font-size: 14px;\r\n      line-height: 1.2;\r\n      padding: 11px 16px;\r\n      white-space: normal;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<div class=\"pronto-plumber-card-section\">\r\n  <h2>\r\n    Need Help Fast? We've Got You Covered\r\n  <\/h2>\r\n\r\n  <p>\r\n    Certified plumber in Porto ready when you need them\r\n  <\/p>\r\n\r\n  <div class=\"pronto-plumber-card-grid\">\r\n    <button type=\"button\" class=\"pronto-plumber-card pronto-plumber-card-drain pronto-precall pp-service-plumbing pp-problemset-drain cta-plumbing-card-drain\">\r\n      <span class=\"pronto-plumber-card-content\">\r\n        <span class=\"pronto-plumber-card-title\">24h Drain Unblocking<\/span>\r\n        <span class=\"pronto-plumber-card-text\">Blocked kitchen, toilet, or<br>bathroom? Our team responds 24\/7<br>to clear all drain and sewer<br>blockages fast and safely<\/span>\r\n        <span class=\"pronto-plumber-card-button\">Request Service<\/span>\r\n      <\/span>\r\n    <\/button>\r\n\r\n    <button type=\"button\" class=\"pronto-plumber-card pronto-plumber-card-leak pronto-precall pp-service-plumbing pp-problemset-leak cta-plumbing-card-leak\">\r\n      <span class=\"pronto-plumber-card-content\">\r\n        <span class=\"pronto-plumber-card-title\">Leak Detection &amp;<br>Pipe Repair<\/span>\r\n        <span class=\"pronto-plumber-card-text\">From visible leaks to hidden pipe<br>bursts, we locate and fix plumbing<br>issues quickly to prevent water<br>damage and mold<\/span>\r\n        <span class=\"pronto-plumber-card-button\">Request Service<\/span>\r\n      <\/span>\r\n    <\/button>\r\n\r\n    <button type=\"button\" class=\"pronto-plumber-card pronto-plumber-card-fixtures pronto-precall pp-service-plumbing pp-problemset-fixture cta-plumbing-card-fixtures\">\r\n      <span class=\"pronto-plumber-card-content\">\r\n        <span class=\"pronto-plumber-card-title\">Toilet, Tap &amp; Shower<br>Repairs<\/span>\r\n        <span class=\"pronto-plumber-card-text\">Dripping taps, running toilets, or<br>broken showers? We repair or<br>replace all plumbing fixtures with<br>fast turnaround.<\/span>\r\n        <span class=\"pronto-plumber-card-button\">Request Service<\/span>\r\n      <\/span>\r\n    <\/button>\r\n  <\/div>\r\n<\/div>\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-183aa49 e-con-full e-flex e-con e-parent\" data-id=\"183aa49\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d575ca6 elementor-widget elementor-widget-html\" data-id=\"d575ca6\" 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>\r\n  body .elementor-widget-html:has([data-cta=\"benefits-cta\"]),\r\n  body .elementor-widget-html:has([data-cta=\"benefits-cta\"]) > .elementor-widget-container,\r\n  body .e-con:has([data-cta=\"benefits-cta\"]),\r\n  body .e-con-inner:has([data-cta=\"benefits-cta\"]) {\r\n    --padding-top: 0px !important;\r\n    --padding-right: 0px !important;\r\n    --padding-bottom: 0px !important;\r\n    --padding-left: 0px !important;\r\n    --gap: 0px !important;\r\n    margin: 0 !important;\r\n    padding: 0 !important;\r\n    gap: 0 !important;\r\n    background: #EEF6FD !important;\r\n  }\r\n  section:has([data-cta=\"benefits-cta\"]) {\r\n    box-sizing: border-box;\r\n    width: 100%;\r\n    padding: 42px 64px 64px;\r\n    display: grid;\r\n    grid-template-columns: minmax(0, 1.08fr) minmax(320px, 0.92fr);\r\n    gap: 72px;\r\n    align-items: start;\r\n    background: #EEF6FD;\r\n    font-family: \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) * {\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type {\r\n    min-width: 0;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > h2 {\r\n    max-width: 470px;\r\n    margin: 0;\r\n    color: #0F2B49;\r\n    font-family: \"Montserrat\", sans-serif;\r\n    font-size: 36px;\r\n    font-weight: 700;\r\n    line-height: 1.08;\r\n    letter-spacing: -0.03em;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div {\r\n    display: grid;\r\n    grid-template-columns: repeat(3, minmax(0, 1fr));\r\n    gap: 24px;\r\n    margin-top: 52px;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div {\r\n    min-width: 0;\r\n    text-align: center;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div > img {\r\n    display: block;\r\n    width: auto;\r\n    height: 54px;\r\n    max-width: 64px;\r\n    margin: 0 auto;\r\n    object-fit: contain;\r\n    position: relative;\r\n    z-index: 1;\r\n    transform: translateY(0) scale(1);\r\n    transform-origin: center;\r\n    transition:\r\n      transform 0.25s ease,\r\n      filter 0.25s ease;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div:nth-child(2) > img,\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div:nth-child(3) > img {\r\n    filter:\r\n      brightness(0)\r\n      saturate(100%)\r\n      invert(27%)\r\n      sepia(50%)\r\n      saturate(2573%)\r\n      hue-rotate(175deg)\r\n      brightness(25%)\r\n      contrast(71%);\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div > img:hover {\r\n    transform: translateY(-4px) scale(1.08);\r\n    filter: drop-shadow(0 6px 6px rgba(15, 43, 73, 0.18));\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div:nth-child(2) > img:hover,\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div:nth-child(3) > img:hover {\r\n    filter:\r\n      brightness(0)\r\n      saturate(100%)\r\n      invert(27%)\r\n      sepia(50%)\r\n      saturate(2573%)\r\n      hue-rotate(175deg)\r\n      brightness(25%)\r\n      contrast(71%)\r\n      drop-shadow(0 6px 6px rgba(15, 43, 73, 0.18));\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div > h3 {\r\n    min-height: 46px;\r\n    margin: 18px 0 0;\r\n    display: flex;\r\n    align-items: flex-start;\r\n    justify-content: center;\r\n    color: #1A365D;\r\n    font-size: 17px;\r\n    font-weight: 700;\r\n    line-height: 1.08;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div > p {\r\n    margin: 19px 0 0;\r\n    color: #4A5568;\r\n    font-size: 14px;\r\n    font-weight: 600;\r\n    line-height: 1.55;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:last-of-type {\r\n    min-width: 0;\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    padding-top: 7px;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:last-of-type > figure {\r\n    width: 100%;\r\n    max-width: 350px;\r\n    margin: 0;\r\n    text-align: center;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:last-of-type > figure > img {\r\n    display: block;\r\n    width: 100%;\r\n    aspect-ratio: 3 \/ 2;\r\n    object-fit: cover;\r\n    border-radius: 18px;\r\n    box-shadow: rgba(0, 0, 0, 0.28) 0 2px 10px 0;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) > div:last-of-type > figure > figcaption {\r\n    margin-top: 20px;\r\n    color: #1A365D;\r\n    font-size: 16px;\r\n    font-weight: 600;\r\n    line-height: 1.45;\r\n  }\r\n\r\n  section:has([data-cta=\"benefits-cta\"]) .pronto-benefits-button-html {\r\n    margin-top: 25px;\r\n    text-align: center;\r\n  }\r\n\r\n  .pronto-benefits-button-html .cta-benefits-cta {\r\n    appearance: none;\r\n    box-sizing: border-box;\r\n    display: inline-block;\r\n    padding: 12px 24px;\r\n    border: 0;\r\n    border-radius: 14px;\r\n    background: #E1A134;\r\n    color: #FFFFFF;\r\n    fill: #FFFFFF;\r\n    font-family: \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n    font-size: 18px;\r\n    font-weight: 800;\r\n    line-height: 1;\r\n    text-align: center;\r\n    text-decoration: none;\r\n    cursor: pointer;\r\n    box-shadow: rgba(0, 0, 0, 0.5) 0px 0px 10px 0px;\r\n    transition: all 0.3s ease;\r\n  }\r\n\r\n  .pronto-benefits-button-html .cta-benefits-cta:hover {\r\n    background: #D97706;\r\n    transform: scale(1.03);\r\n  }\r\n\r\n  .pronto-benefits-button-html .elementor-button-content-wrapper {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    gap: 8px;\r\n  }\r\n\r\n  .pronto-benefits-button-html .elementor-button-icon {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n  }\r\n\r\n  .pronto-benefits-button-html .elementor-button-icon svg {\r\n    width: 15px;\r\n    height: 15px;\r\n    fill: currentColor;\r\n  }\r\n\r\n  @media (max-width: 767px) {\r\n    section:has([data-cta=\"benefits-cta\"]) {\r\n      display: block;\r\n      padding: 46px 16px 54px;\r\n    }\r\n\r\n    section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > h2 {\r\n      max-width: none;\r\n      margin: 0 auto;\r\n      font-family: \"Montserrat\", sans-serif;\r\n      font-size: 28px;\r\n      font-weight: 700;\r\n      line-height: 1.1;\r\n      letter-spacing: -0.03em;\r\n      text-align: center;\r\n    }\r\n\r\n    section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > h2 br {\r\n      display: none;\r\n    }\r\n\r\n    section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div {\r\n      gap: 10px;\r\n      margin-top: 50px;\r\n    }\r\n\r\n    section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div > img {\r\n      height: 48px;\r\n      max-width: 56px;\r\n    }\r\n\r\n    section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div > h3 {\r\n      min-height: 38px;\r\n      margin-top: 20px;\r\n      font-size: 15px;\r\n      line-height: 1.05;\r\n    }\r\n\r\n    section:has([data-cta=\"benefits-cta\"]) > div:first-of-type > div > div > p {\r\n      margin-top: 27px;\r\n      font-size: 14px;\r\n      font-weight: 600;\r\n      line-height: 1.5;\r\n    }\r\n\r\n    section:has([data-cta=\"benefits-cta\"]) > div:last-of-type {\r\n      margin-top: 42px;\r\n      padding-top: 0;\r\n    }\r\n\r\n    section:has([data-cta=\"benefits-cta\"]) > div:last-of-type > figure {\r\n      max-width: none;\r\n    }\r\n\r\n    section:has([data-cta=\"benefits-cta\"]) > div:last-of-type > figure > figcaption {\r\n      margin-top: 20px;\r\n      font-size: 16px;\r\n      line-height: 1.5;\r\n    }\r\n\r\n    section:has([data-cta=\"benefits-cta\"]) .pronto-benefits-button-html {\r\n      margin-top: 24px;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<section>\r\n  <div>\r\n    <h2>\r\n      The ideal combination<br>\r\n      of speed and<br>\r\n      customer service\r\n    <\/h2>\r\n\r\n    <div>\r\n      <div>\r\n        <img decoding=\"async\"\r\n          src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2025\/05\/energy-icon.svg\"\r\n          alt=\"\"\r\n        >\r\n\r\n        <h3>\r\n          Fast response\r\n        <\/h3>\r\n\r\n        <p>\r\n          Under 1h arrival,<br>\r\n          day or night\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div>\r\n        <img decoding=\"async\"\r\n          src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2025\/05\/24-hours-phone-support-icon.svg\"\r\n          alt=\"\"\r\n        >\r\n\r\n        <h3>\r\n          24\/7<br>\r\n          Availability\r\n        <\/h3>\r\n\r\n        <p>\r\n          Direct contact, no<br>\r\n          call centers\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div>\r\n        <img decoding=\"async\"\r\n          src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2025\/05\/verify-verified-check-icon.svg\"\r\n          alt=\"\"\r\n        >\r\n\r\n        <h3>\r\n          certified pros\r\n        <\/h3>\r\n\r\n        <p>\r\n          Verified local<br>\r\n          plumbers\r\n        <\/p>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div>\r\n    <figure>\r\n      <img decoding=\"async\"\r\n        src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2025\/04\/20250425_2219_Tool-Van-Ready_remix_01jsqd1ft7ej4t80t3pemyxsxe.webp\"\r\n        alt=\"\"\r\n      >\r\n\r\n      <figcaption>\r\n        Fast, trusted and professional services\r\n      <\/figcaption>\r\n    <\/figure>\r\n\r\n    <div class=\"pronto-benefits-button-html\">\r\n      <button\r\n        type=\"button\"\r\n        class=\"cta-benefits-cta pronto-precall pp-service-plumbing\"\r\n        data-cta=\"benefits-cta\"\r\n      >\r\n        <span class=\"elementor-button-content-wrapper\">\r\n          <span class=\"elementor-button-icon\">\r\n            <svg\r\n              aria-hidden=\"true\"\r\n              class=\"e-font-icon-svg e-far-arrow-alt-circle-right\"\r\n              viewBox=\"0 0 512 512\"\r\n              xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\r\n            >\r\n              <path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path>\r\n            <\/svg>\r\n          <\/span>\r\n\r\n          <span class=\"elementor-button-text\">\r\n            Request Help Now\r\n          <\/span>\r\n        <\/span>\r\n      <\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\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-255cda0 e-con-full e-flex e-con e-parent\" data-id=\"255cda0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5af3ce0 elementor-widget elementor-widget-html\" data-id=\"5af3ce0\" 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<section id=\"pronto-reviews-premium\" class=\"pronto-reviews-premium\">\r\n  <style>\r\n    #pronto-reviews-premium {\r\n      --pronto-navy: #0F2B46;\r\n      --pronto-muted: #667085;\r\n      --pronto-card: #FFFFFF;\r\n      --pronto-bg: #F0F6FE;\r\n      --pronto-border: rgba(15, 43, 70, 0.08);\r\n      --pronto-shadow:\r\n        0 6px 14px rgba(15, 43, 70, 0.12),\r\n        0 2px 4px rgba(15, 43, 70, 0.06);\r\n      --pronto-star: #00B67A;\r\n\r\n      width: 100%;\r\n      padding: 72px 20px;\r\n      background: var(--pronto-bg);\r\n      box-sizing: border-box;\r\n      overflow: hidden;\r\n    }\r\n\r\n    #pronto-reviews-premium * {\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    #pronto-reviews-premium {\r\n      display: block;\r\n      margin: 0;\r\n    }\r\n\r\n    .elementor-widget-html:has(#pronto-reviews-premium),\r\n    .elementor-widget-html:has(#pronto-reviews-premium) > .elementor-widget-container,\r\n    .elementor-element:has(#pronto-reviews-premium),\r\n    .e-con:has(#pronto-reviews-premium) {\r\n      background-color: #F0F6FE !important;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-reviews-viewport {\r\n      width: 100%;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-reviews-title {\r\n      margin: 0 0 44px;\r\n      color: #0F2B49 !important;\r\n      font-family: \"Montserrat\", sans-serif;\r\n      font-size: 36px;\r\n      font-weight: 700;\r\n      line-height: 1.08;\r\n      letter-spacing: -0.03em;\r\n      text-align: center;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-reviews-track {\r\n      display: grid;\r\n      grid-template-columns: repeat(3, minmax(0, 1fr));\r\n      gap: 24px;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-review-card {\r\n      min-height: 190px;\r\n      padding: 24px;\r\n      background: var(--pronto-card);\r\n      border: 1px solid var(--pronto-border);\r\n      border-radius: 22px;\r\n      box-shadow: var(--pronto-shadow);\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-review-card-clone {\r\n      display: none;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-review-top {\r\n      display: grid;\r\n      grid-template-columns: 48px 1fr;\r\n      gap: 18px;\r\n      align-items: start;\r\n      margin-bottom: 16px;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-review-avatar {\r\n      width: 48px;\r\n      height: 48px;\r\n      border-radius: 999px;\r\n      object-fit: cover;\r\n      display: block;\r\n      background: #EDF1F5;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-review-stars {\r\n      display: flex;\r\n      gap: 3px;\r\n      margin: 2px 0 13px;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-star-box {\r\n      width: 30px;\r\n      height: 30px;\r\n      display: inline-flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      background: var(--pronto-star);\r\n      color: #FFFFFF;\r\n      border-radius: 0;\r\n      font-size: 18px;\r\n      font-weight: 800;\r\n      line-height: 1;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-review-meta {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 12px;\r\n      flex-wrap: wrap;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-review-name {\r\n      color: #0F2B49;\r\n      font-family: \"Montserrat\", sans-serif;\r\n      font-size: 16px;\r\n      font-weight: 700;\r\n      line-height: 1.35;\r\n      letter-spacing: 0;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-review-location {\r\n      display: inline-flex;\r\n      align-items: center;\r\n      gap: 7px;\r\n      color: var(--pronto-muted);\r\n      font-family: \"Montserrat\", sans-serif;\r\n      font-size: 14px;\r\n      font-weight: 500;\r\n      line-height: 1.5;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-review-location svg {\r\n      width: 18px;\r\n      height: 18px;\r\n      flex: 0 0 18px;\r\n      stroke: currentColor;\r\n    }\r\n\r\n    #pronto-reviews-premium .pronto-review-text {\r\n      margin: 0;\r\n      color: #0F2B49;\r\n      font-family: \"Montserrat\", sans-serif;\r\n      font-size: 0.95rem;\r\n      font-weight: 600;\r\n      line-height: 1.6;\r\n      letter-spacing: 0;\r\n    }\r\n\r\n    @media (max-width: 1024px) {\r\n      #pronto-reviews-premium {\r\n        padding: 58px 0;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-reviews-title {\r\n        padding: 0 20px;\r\n        margin-bottom: 44px;\r\n        font-size: 36px;\r\n        line-height: 1.08;\r\n        white-space: normal;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-reviews-inner {\r\n        width: 100%;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-reviews-viewport {\r\n        width: 100%;\r\n        overflow-x: auto;\r\n        overflow-y: hidden;\r\n        scroll-snap-type: x mandatory;\r\n        scrollbar-width: none;\r\n        -ms-overflow-style: none;\r\n        -webkit-overflow-scrolling: touch;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-reviews-viewport::-webkit-scrollbar {\r\n        display: none;\r\n      }\r\n\r\n      #pronto-reviews-premium.pronto-carousel-ready .pronto-reviews-viewport {\r\n        scroll-behavior: smooth;\r\n      }\r\n\r\n      #pronto-reviews-premium.pronto-carousel-reset .pronto-reviews-viewport {\r\n        scroll-behavior: auto;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-reviews-track {\r\n        display: flex;\r\n        width: max-content;\r\n        gap: 18px;\r\n        padding: 0 20px 16px;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-review-card {\r\n        flex: 0 0 min(82vw, 430px);\r\n        scroll-snap-align: start;\r\n        box-shadow: 0 8px 22px rgba(15, 43, 70, 0.055);\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-review-card-clone {\r\n        display: block;\r\n      }\r\n    }\r\n\r\n    @media (max-width: 520px) {\r\n      #pronto-reviews-premium .pronto-reviews-title {\r\n        padding: 0 12px;\r\n        margin-bottom: 30px;\r\n        font-size: clamp(2rem, 8vw, 2.6rem);\r\n        line-height: 1.1;\r\n        letter-spacing: -0.03em;\r\n        white-space: normal;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-review-card {\r\n        flex-basis: 86vw;\r\n        min-height: 185px;\r\n        padding: 21px;\r\n        border-radius: 20px;\r\n        box-shadow:\r\n          0 5px 12px rgba(15, 43, 70, 0.10),\r\n          0 2px 4px rgba(15, 43, 70, 0.05);\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-review-top {\r\n        grid-template-columns: 44px 1fr;\r\n        gap: 14px;\r\n        margin-bottom: 20px;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-review-avatar {\r\n        width: 44px;\r\n        height: 44px;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-star-box {\r\n        width: 25px;\r\n        height: 25px;\r\n        font-size: 15px;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-review-name {\r\n        font-size: 16px;\r\n        line-height: 1.35;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-review-location {\r\n        font-size: 14px;\r\n      }\r\n\r\n      #pronto-reviews-premium .pronto-review-text {\r\n        font-size: 0.95rem;\r\n        font-weight: 600;\r\n        line-height: 1.6;\r\n      }\r\n    }\r\n\r\n    @media (prefers-reduced-motion: reduce) {\r\n      #pronto-reviews-premium.pronto-carousel-ready .pronto-reviews-viewport {\r\n        scroll-behavior: auto;\r\n      }\r\n    }\r\n  <\/style>\r\n\r\n  <div class=\"pronto-reviews-inner\">\r\n    <h2 class=\"pronto-reviews-title\">What Porto Locals Are Saying<\/h2>\r\n\r\n    <div class=\"pronto-reviews-viewport\">\r\n      <div class=\"pronto-reviews-track\" aria-label=\"Customer reviews from Porto locals\">\r\n      <article class=\"pronto-review-card\">\r\n        <div class=\"pronto-review-top\">\r\n          <img decoding=\"async\" class=\"pronto-review-avatar\" src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2021\/03\/mike.webp\" alt=\"Rui from Le\u00e7a da Palmeira\" loading=\"lazy\">\r\n          <div>\r\n            <div class=\"pronto-review-stars\" aria-label=\"5 out of 5 stars\">\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n            <\/div>\r\n            <div class=\"pronto-review-meta\">\r\n              <span class=\"pronto-review-name\">Rui<\/span>\r\n              <span class=\"pronto-review-location\">\r\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                  <path d=\"M12 21s7-5.2 7-12a7 7 0 1 0-14 0c0 6.8 7 12 7 12Z\" stroke-width=\"2\"><\/path>\r\n                  <path d=\"M12 11.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z\" stroke-width=\"2\"><\/path>\r\n                <\/svg>\r\n                Le\u00e7a da Palmeira\r\n              <\/span>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <p class=\"pronto-review-text\">Booked by WhatsApp. Super smooth and polite technician.<\/p>\r\n      <\/article>\r\n\r\n      <article class=\"pronto-review-card\">\r\n        <div class=\"pronto-review-top\">\r\n          <img decoding=\"async\" class=\"pronto-review-avatar\" src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2020\/09\/ava-woman-4.webp\" alt=\"Beatriz from Campanh\u00e3\" loading=\"lazy\">\r\n          <div>\r\n            <div class=\"pronto-review-stars\" aria-label=\"5 out of 5 stars\">\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n            <\/div>\r\n            <div class=\"pronto-review-meta\">\r\n              <span class=\"pronto-review-name\">Beatriz<\/span>\r\n              <span class=\"pronto-review-location\">\r\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                  <path d=\"M12 21s7-5.2 7-12a7 7 0 1 0-14 0c0 6.8 7 12 7 12Z\" stroke-width=\"2\"><\/path>\r\n                  <path d=\"M12 11.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z\" stroke-width=\"2\"><\/path>\r\n                <\/svg>\r\n                Campanh\u00e3\r\n              <\/span>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <p class=\"pronto-review-text\">They arrived under one hour during the blackout - lifesaver!<\/p>\r\n      <\/article>\r\n\r\n      <article class=\"pronto-review-card\">\r\n        <div class=\"pronto-review-top\">\r\n          <img decoding=\"async\" class=\"pronto-review-avatar\" src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2020\/09\/man-with-beard-smiling-avatar.webp\" alt=\"Carlos from Matosinhos\" loading=\"lazy\">\r\n          <div>\r\n            <div class=\"pronto-review-stars\" aria-label=\"5 out of 5 stars\">\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n            <\/div>\r\n            <div class=\"pronto-review-meta\">\r\n              <span class=\"pronto-review-name\">Carlos<\/span>\r\n              <span class=\"pronto-review-location\">\r\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                  <path d=\"M12 21s7-5.2 7-12a7 7 0 1 0-14 0c0 6.8 7 12 7 12Z\" stroke-width=\"2\"><\/path>\r\n                  <path d=\"M12 11.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z\" stroke-width=\"2\"><\/path>\r\n                <\/svg>\r\n                Matosinhos\r\n              <\/span>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <p class=\"pronto-review-text\">Booking was easy on WhatsApp. Technician arrived right on time and fixed a bad leak under the bathroom sink.<\/p>\r\n      <\/article>\r\n\r\n      <article class=\"pronto-review-card\">\r\n        <div class=\"pronto-review-top\">\r\n          <img decoding=\"async\" class=\"pronto-review-avatar\" src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2020\/09\/ava-man-1.webp\" alt=\"Filipe from Cedofeita\" loading=\"lazy\">\r\n          <div>\r\n            <div class=\"pronto-review-stars\" aria-label=\"5 out of 5 stars\">\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n            <\/div>\r\n            <div class=\"pronto-review-meta\">\r\n              <span class=\"pronto-review-name\">Filipe<\/span>\r\n              <span class=\"pronto-review-location\">\r\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                  <path d=\"M12 21s7-5.2 7-12a7 7 0 1 0-14 0c0 6.8 7 12 7 12Z\" stroke-width=\"2\"><\/path>\r\n                  <path d=\"M12 11.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z\" stroke-width=\"2\"><\/path>\r\n                <\/svg>\r\n                Cedofeita\r\n              <\/span>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <p class=\"pronto-review-text\">The electrician explained everything and didn\u2019t rush. Honest guy.<\/p>\r\n      <\/article>\r\n\r\n      <article class=\"pronto-review-card\">\r\n        <div class=\"pronto-review-top\">\r\n          <img decoding=\"async\" class=\"pronto-review-avatar\" src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2020\/09\/ava-woman-3.webp\" alt=\"Ana from Paranhos\" loading=\"lazy\">\r\n          <div>\r\n            <div class=\"pronto-review-stars\" aria-label=\"5 out of 5 stars\">\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n            <\/div>\r\n            <div class=\"pronto-review-meta\">\r\n              <span class=\"pronto-review-name\">Ana<\/span>\r\n              <span class=\"pronto-review-location\">\r\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                  <path d=\"M12 21s7-5.2 7-12a7 7 0 1 0-14 0c0 6.8 7 12 7 12Z\" stroke-width=\"2\"><\/path>\r\n                  <path d=\"M12 11.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z\" stroke-width=\"2\"><\/path>\r\n                <\/svg>\r\n                Paranhos\r\n              <\/span>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <p class=\"pronto-review-text\">They fixed a plumbing emergency without charging extra for the weekend.<\/p>\r\n      <\/article>\r\n\r\n      <article class=\"pronto-review-card\">\r\n        <div class=\"pronto-review-top\">\r\n          <img decoding=\"async\" class=\"pronto-review-avatar\" src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2020\/09\/ava-woman-1.webp\" alt=\"Mariana from S\u00e3o Jo\u00e3o\" loading=\"lazy\">\r\n          <div>\r\n            <div class=\"pronto-review-stars\" aria-label=\"5 out of 5 stars\">\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n              <span class=\"pronto-star-box\">\u2605<\/span>\r\n            <\/div>\r\n            <div class=\"pronto-review-meta\">\r\n              <span class=\"pronto-review-name\">Mariana<\/span>\r\n              <span class=\"pronto-review-location\">\r\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                  <path d=\"M12 21s7-5.2 7-12a7 7 0 1 0-14 0c0 6.8 7 12 7 12Z\" stroke-width=\"2\"><\/path>\r\n                  <path d=\"M12 11.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z\" stroke-width=\"2\"><\/path>\r\n                <\/svg>\r\n                S\u00e3o Jo\u00e3o\r\n              <\/span>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <p class=\"pronto-review-text\">Called them for a blocked kitchen sink. Super polite and got it sorted quickly without mess.<\/p>\r\n      <\/article>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <script>\r\n    (function () {\r\n      var section = document.getElementById(\"pronto-reviews-premium\");\r\n\r\n      if (!section) {\r\n        return;\r\n      }\r\n\r\n      var viewport = section.querySelector(\".pronto-reviews-viewport\");\r\n      var track = section.querySelector(\".pronto-reviews-track\");\r\n\r\n      if (!viewport || !track || track.dataset.prontoCarouselLoaded === \"1\") {\r\n        return;\r\n      }\r\n\r\n      track.dataset.prontoCarouselLoaded = \"1\";\r\n\r\n      var mediaQuery = window.matchMedia(\"(max-width: 1024px)\");\r\n      var reduceMotionQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n      var hasEntered = false;\r\n      var hasStarted = false;\r\n      var currentIndex = 0;\r\n      var originalCount = 0;\r\n      var positions = [];\r\n      var slideTimer = null;\r\n      var resumeTimer = null;\r\n      var resizeTimer = null;\r\n      var slideDuration = 760;\r\n      var pauseDuration = 2300;\r\n      var userPauseDuration = 4200;\r\n\r\n      function getOriginalCards() {\r\n        return Array.prototype.slice.call(track.querySelectorAll(\".pronto-review-card:not(.pronto-review-card-clone)\"));\r\n      }\r\n\r\n      function createClones() {\r\n        if (track.dataset.prontoCarouselCloned === \"1\") {\r\n          return;\r\n        }\r\n\r\n        var originalCards = getOriginalCards();\r\n\r\n        originalCards.forEach(function (card) {\r\n          var clone = card.cloneNode(true);\r\n          clone.setAttribute(\"aria-hidden\", \"true\");\r\n          clone.classList.add(\"pronto-review-card-clone\");\r\n          track.appendChild(clone);\r\n        });\r\n\r\n        track.dataset.prontoCarouselCloned = \"1\";\r\n      }\r\n\r\n      function getCardScrollPosition(card) {\r\n        return card.getBoundingClientRect().left - viewport.getBoundingClientRect().left + viewport.scrollLeft;\r\n      }\r\n\r\n      function measurePositions() {\r\n        var originalCards = getOriginalCards();\r\n        var firstClone = track.querySelector(\".pronto-review-card-clone\");\r\n\r\n        if (!originalCards.length || !firstClone) {\r\n          return false;\r\n        }\r\n\r\n        positions = originalCards.map(function (card) {\r\n          return getCardScrollPosition(card);\r\n        });\r\n\r\n        positions.push(getCardScrollPosition(firstClone));\r\n        originalCount = originalCards.length;\r\n\r\n        return positions.length > 1;\r\n      }\r\n\r\n      function clearSlideTimer() {\r\n        window.clearTimeout(slideTimer);\r\n      }\r\n\r\n      function isCarouselAllowed() {\r\n        return hasEntered && mediaQuery.matches && !reduceMotionQuery.matches;\r\n      }\r\n\r\n      function moveToIndex(index, smooth) {\r\n        if (!positions[index] && positions[index] !== 0) {\r\n          return;\r\n        }\r\n\r\n        if (smooth) {\r\n          section.classList.remove(\"pronto-carousel-reset\");\r\n          viewport.scrollTo({\r\n            left: positions[index],\r\n            behavior: \"smooth\"\r\n          });\r\n          return;\r\n        }\r\n\r\n        section.classList.add(\"pronto-carousel-reset\");\r\n        viewport.scrollLeft = positions[index];\r\n\r\n        window.requestAnimationFrame(function () {\r\n          section.classList.remove(\"pronto-carousel-reset\");\r\n        });\r\n      }\r\n\r\n      function scheduleNextSlide(delay) {\r\n        clearSlideTimer();\r\n\r\n        if (!isCarouselAllowed()) {\r\n          return;\r\n        }\r\n\r\n        slideTimer = window.setTimeout(function () {\r\n          slideToNextCard();\r\n        }, delay);\r\n      }\r\n\r\n      function slideToNextCard() {\r\n        if (!isCarouselAllowed()) {\r\n          return;\r\n        }\r\n\r\n        var nextIndex = currentIndex + 1;\r\n\r\n        moveToIndex(nextIndex, true);\r\n        currentIndex = nextIndex;\r\n\r\n        slideTimer = window.setTimeout(function () {\r\n          if (currentIndex >= originalCount) {\r\n            currentIndex = 0;\r\n            moveToIndex(0, false);\r\n          }\r\n\r\n          scheduleNextSlide(pauseDuration);\r\n        }, slideDuration);\r\n      }\r\n\r\n      function startCarousel() {\r\n        if (!isCarouselAllowed()) {\r\n          section.classList.remove(\"pronto-carousel-ready\", \"pronto-carousel-reset\");\r\n          return;\r\n        }\r\n\r\n        createClones();\r\n\r\n        window.requestAnimationFrame(function () {\r\n          if (!measurePositions()) {\r\n            return;\r\n          }\r\n\r\n          section.classList.add(\"pronto-carousel-ready\");\r\n\r\n          if (!hasStarted) {\r\n            hasStarted = true;\r\n            currentIndex = 0;\r\n            moveToIndex(0, false);\r\n          } else if (currentIndex >= originalCount) {\r\n            currentIndex = 0;\r\n            moveToIndex(0, false);\r\n          } else {\r\n            moveToIndex(currentIndex, false);\r\n          }\r\n\r\n          scheduleNextSlide(pauseDuration);\r\n        });\r\n      }\r\n\r\n      function refreshCarousel() {\r\n        if (!hasStarted) {\r\n          return;\r\n        }\r\n\r\n        window.clearTimeout(resizeTimer);\r\n\r\n        resizeTimer = window.setTimeout(function () {\r\n          if (!isCarouselAllowed()) {\r\n            return;\r\n          }\r\n\r\n          window.requestAnimationFrame(function () {\r\n            if (!measurePositions()) {\r\n              return;\r\n            }\r\n\r\n            if (currentIndex >= originalCount) {\r\n              currentIndex = 0;\r\n            }\r\n\r\n            moveToIndex(currentIndex, false);\r\n          });\r\n        }, 180);\r\n      }\r\n\r\n      function pauseAfterUserInteraction() {\r\n        if (!section.classList.contains(\"pronto-carousel-ready\")) {\r\n          return;\r\n        }\r\n\r\n        clearSlideTimer();\r\n        window.clearTimeout(resumeTimer);\r\n\r\n        resumeTimer = window.setTimeout(function () {\r\n          if (!isCarouselAllowed()) {\r\n            return;\r\n          }\r\n\r\n          scheduleNextSlide(1200);\r\n        }, userPauseDuration);\r\n      }\r\n\r\n      function observeSection() {\r\n        if (!(\"IntersectionObserver\" in window)) {\r\n          hasEntered = true;\r\n          startCarousel();\r\n          return;\r\n        }\r\n\r\n        var observer = new IntersectionObserver(function (entries) {\r\n          entries.forEach(function (entry) {\r\n            if (!entry.isIntersecting || hasEntered) {\r\n              return;\r\n            }\r\n\r\n            hasEntered = true;\r\n            startCarousel();\r\n            observer.disconnect();\r\n          });\r\n        }, {\r\n          threshold: 0.25\r\n        });\r\n\r\n        observer.observe(section);\r\n      }\r\n\r\n      viewport.addEventListener(\"touchstart\", pauseAfterUserInteraction, { passive: true });\r\n      viewport.addEventListener(\"pointerdown\", pauseAfterUserInteraction);\r\n      viewport.addEventListener(\"wheel\", pauseAfterUserInteraction, { passive: true });\r\n      window.addEventListener(\"resize\", refreshCarousel);\r\n\r\n      observeSection();\r\n    })();\r\n  <\/script>\r\n<\/section>\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-5b0c2cf e-con-full e-flex e-con e-parent\" data-id=\"5b0c2cf\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-109ae24 elementor-widget elementor-widget-html\" data-id=\"109ae24\" 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<section\r\n    class=\"ps-trusted-work-section\"\r\n    aria-labelledby=\"ps-trusted-work-title\"\r\n    data-ps-trusted-work\r\n>\r\n    <div class=\"ps-trusted-work-inner\">\r\n        <div class=\"ps-trusted-work-visual\">\r\n            <h2\r\n                class=\"ps-trusted-work-title\"\r\n                id=\"ps-trusted-work-title\"\r\n            >\r\n                Trusted Local Experts in Plumbing Repairs\r\n            <\/h2>\r\n\r\n            <div class=\"ps-trusted-work-media\">\r\n                <img\r\n                    src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2026\/07\/plumber-in-porto.webp\"\r\n                    alt=\"Professional plumber carrying out a plumbing repair in Porto\"\r\n                    loading=\"lazy\"\r\n                    decoding=\"async\"\r\n                >\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"ps-trusted-work-content\">\r\n            <p class=\"ps-trusted-work-copy\">\r\n                <strong>Pronto Solu\u00e7\u00f5es<\/strong> connects you with certified\r\n                electricians and plumbers in Porto. From urgent repairs to\r\n                routine services, we deliver trusted home services backed by\r\n                our numbers.\r\n            <\/p>\r\n\r\n            <a\r\n                class=\"ps-trusted-work-link\"\r\n                href=\"https:\/\/prontosolucoes.pt\/about\/\"\r\n            >\r\n                <span data-ps-trusted-link-text>Learn more<\/span>\r\n                <span aria-hidden=\"true\">\u2192<\/span>\r\n            <\/a>\r\n\r\n            <div class=\"ps-trusted-counter-grid\">\r\n                <div class=\"ps-trusted-counter-box\">\r\n                    <strong class=\"ps-trusted-counter\">\r\n                        <span\r\n                            class=\"ps-trusted-counter-number\"\r\n                            data-target=\"970\"\r\n                        >\r\n                            970\r\n                        <\/span><span\r\n                            class=\"ps-trusted-counter-suffix\"\r\n                            data-ps-trusted-jobs-suffix\r\n                        >+<\/span>\r\n                    <\/strong>\r\n\r\n                    <p data-ps-trusted-jobs-label>\r\n                        Jobs Completed\r\n                    <\/p>\r\n                <\/div>\r\n\r\n                <div class=\"ps-trusted-counter-box\">\r\n                    <strong class=\"ps-trusted-counter\">\r\n                        <span\r\n                            class=\"ps-trusted-counter-number\"\r\n                            data-target=\"20\"\r\n                        >\r\n                            20\r\n                        <\/span><span\r\n                            class=\"ps-trusted-counter-suffix\"\r\n                            data-ps-trusted-response-suffix\r\n                        > min<\/span>\r\n                    <\/strong>\r\n\r\n                    <p data-ps-trusted-response-label>\r\n                        Quick Response\r\n                    <\/p>\r\n                <\/div>\r\n\r\n                <div class=\"ps-trusted-counter-box\">\r\n                    <strong class=\"ps-trusted-counter\">\r\n                        <span\r\n                            class=\"ps-trusted-counter-number\"\r\n                            data-target=\"98\"\r\n                        >\r\n                            98\r\n                        <\/span><span\r\n                            class=\"ps-trusted-counter-suffix\"\r\n                            data-ps-trusted-first-visit-suffix\r\n                        >%<\/span>\r\n                    <\/strong>\r\n\r\n                    <p data-ps-trusted-first-visit-label>\r\n                        Fixed on First Visit\r\n                    <\/p>\r\n                <\/div>\r\n\r\n                <div class=\"ps-trusted-counter-box\">\r\n                    <strong class=\"ps-trusted-counter\">\r\n                        <span\r\n                            class=\"ps-trusted-counter-number\"\r\n                            data-target=\"10\"\r\n                        >\r\n                            10\r\n                        <\/span><span\r\n                            class=\"ps-trusted-counter-suffix\"\r\n                            data-ps-trusted-experience-suffix\r\n                        >+ Years<\/span>\r\n                    <\/strong>\r\n\r\n                    <p data-ps-trusted-experience-label>\r\n                        Avg. Technician Experience\r\n                    <\/p>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n<\/section>\r\n\r\n<style>\r\n    body .elementor-widget-html:has(.ps-trusted-work-section),\r\n    body .elementor-widget-html:has(.ps-trusted-work-section)\r\n        > .elementor-widget-container {\r\n        margin: 0 !important;\r\n        padding: 0 !important;\r\n    }\r\n\r\n    body .e-con:has(\r\n        > .elementor-widget-html\r\n        .ps-trusted-work-section\r\n    ),\r\n    body .e-con:has(\r\n        > .e-con-inner\r\n        > .elementor-widget-html\r\n        .ps-trusted-work-section\r\n    ),\r\n    body .e-con > .e-con-inner:has(\r\n        > .elementor-widget-html\r\n        .ps-trusted-work-section\r\n    ) {\r\n        --padding-top: 0px !important;\r\n        --padding-right: 0px !important;\r\n        --padding-bottom: 0px !important;\r\n        --padding-left: 0px !important;\r\n        --gap: 0px !important;\r\n        width: 100% !important;\r\n        max-width: none !important;\r\n        margin: 0 !important;\r\n        padding: 0 !important;\r\n        gap: 0 !important;\r\n    }\r\n\r\n    .ps-trusted-work-section {\r\n        width: 100%;\r\n        margin: 0;\r\n        padding: 88px 24px;\r\n        background: #FAFBFC;\r\n        font-family: \"Montserrat\", sans-serif;\r\n    }\r\n\r\n    .ps-trusted-work-inner {\r\n        display: grid;\r\n        grid-template-columns:\r\n            minmax(0, 1fr)\r\n            minmax(0, 1fr);\r\n        align-items: stretch;\r\n        gap: clamp(48px, 6vw, 76px);\r\n        width: 100%;\r\n        max-width: 1180px;\r\n        margin: 0 auto;\r\n    }\r\n\r\n    .ps-trusted-work-title {\r\n        max-width: 520px;\r\n        margin: 0;\r\n        color: #0F2B49;\r\n        font-family: \"Montserrat\", sans-serif;\r\n        font-size: 36px;\r\n        font-weight: 700;\r\n        letter-spacing: -0.03em;\r\n        line-height: 1.08;\r\n    }\r\n\r\n    .ps-trusted-work-media {\r\n        width: 100%;\r\n        margin-top: 32px;\r\n        overflow: hidden;\r\n        aspect-ratio: 3 \/ 2;\r\n        border-radius: 18px;\r\n        background: #e7eaed;\r\n    }\r\n\r\n    .ps-trusted-work-media img {\r\n        display: block;\r\n        width: 100%;\r\n        height: 100%;\r\n        object-fit: cover;\r\n        object-position: center center;\r\n    }\r\n\r\n    .ps-trusted-work-content {\r\n        display: flex;\r\n        flex-direction: column;\r\n        justify-content: center;\r\n        padding-top: 0;\r\n    }\r\n\r\n    .ps-trusted-work-copy {\r\n        max-width: 580px;\r\n        margin: 0;\r\n        color: #0F2B49;\r\n        font-family: \"Montserrat\", sans-serif;\r\n        font-size: 17px;\r\n        font-weight: 500;\r\n        line-height: 1.7;\r\n    }\r\n\r\n    .ps-trusted-work-copy strong {\r\n        font-weight: 700;\r\n    }\r\n\r\n    .ps-trusted-work-link {\r\n        display: inline-flex;\r\n        width: fit-content;\r\n        max-width: max-content;\r\n        align-items: center;\r\n        gap: 8px;\r\n        margin-top: 16px;\r\n        padding-bottom: 4px;\r\n        border-bottom: 2px solid #E1A134;\r\n        color: #0F2B49;\r\n        font-family: \"Montserrat\", sans-serif;\r\n        font-size: 15px;\r\n        font-weight: 700;\r\n        line-height: 1.2;\r\n        text-decoration: none;\r\n        transition:\r\n            color 0.2s ease,\r\n            gap 0.2s ease;\r\n    }\r\n\r\n    .ps-trusted-work-link:hover,\r\n    .ps-trusted-work-link:focus-visible {\r\n        gap: 12px;\r\n        color: #d97706;\r\n    }\r\n\r\n    .ps-trusted-work-link:focus-visible {\r\n        outline: 3px solid rgba(225, 161, 52, 0.24);\r\n        outline-offset: 4px;\r\n    }\r\n\r\n    .ps-trusted-counter-grid {\r\n        display: grid;\r\n        grid-template-columns:\r\n            repeat(2, minmax(0, 1fr));\r\n        gap: 16px;\r\n        width: 100%;\r\n        margin-top: 28px;\r\n    }\r\n\r\n    .ps-trusted-counter-box {\r\n        display: flex;\r\n        min-width: 0;\r\n        min-height: 122px;\r\n        flex-direction: column;\r\n        align-items: center;\r\n        justify-content: center;\r\n        padding: 22px 14px;\r\n        border: 1px solid rgba(15, 43, 73, 0.12);\r\n        border-radius: 12px;\r\n        background: #ffffff;\r\n        box-shadow:\r\n            0 8px 14px -7px rgba(15, 43, 73, 0.28),\r\n            0 3px 6px -3px rgba(15, 43, 73, 0.16);\r\n        text-align: center;\r\n        transition:\r\n            box-shadow 0.25s ease,\r\n            transform 0.25s ease;\r\n    }\r\n\r\n    .ps-trusted-counter-box:hover {\r\n        box-shadow:\r\n            0 11px 18px -8px rgba(15, 43, 73, 0.32),\r\n            0 4px 8px -3px rgba(15, 43, 73, 0.18);\r\n        transform: translateY(-3px);\r\n    }\r\n\r\n    .ps-trusted-counter {\r\n        display: block;\r\n        margin: 0;\r\n        color: #E1A134;\r\n        font-family: \"Montserrat\", sans-serif;\r\n        font-size: 36px;\r\n        font-weight: 700;\r\n        letter-spacing: -0.03em;\r\n        line-height: 1;\r\n        white-space: nowrap;\r\n    }\r\n\r\n    .ps-trusted-counter-box p {\r\n        margin: 10px 0 0;\r\n        color: #0F2B46;\r\n        font-family: \"Montserrat\", sans-serif;\r\n        font-size: 14px;\r\n        font-weight: 500;\r\n        line-height: 1.3;\r\n    }\r\n\r\n    @media (min-width: 901px) {\r\n        .ps-trusted-work-content {\r\n            align-self: center;\r\n        }\r\n    }\r\n\r\n    @media (max-width: 900px) {\r\n        .ps-trusted-work-section {\r\n            padding: 72px 20px;\r\n        }\r\n\r\n        .ps-trusted-work-inner {\r\n            grid-template-columns: 1fr;\r\n            gap: 38px;\r\n        }\r\n\r\n        .ps-trusted-work-visual,\r\n        .ps-trusted-work-content {\r\n            width: 100%;\r\n            max-width: 720px;\r\n            margin: 0 auto;\r\n        }\r\n\r\n        .ps-trusted-work-content {\r\n            padding-top: 0;\r\n        }\r\n    }\r\n\r\n    @media (max-width: 767px) {\r\n        .ps-trusted-work-section {\r\n            padding: 56px 16px;\r\n        }\r\n\r\n        .ps-trusted-work-inner {\r\n            gap: 30px;\r\n        }\r\n\r\n        .ps-trusted-work-title {\r\n            max-width: 420px;\r\n            margin: 0 auto;\r\n            font-size: clamp(2rem, 8vw, 2.6rem);\r\n            line-height: 1.1;\r\n            text-align: center;\r\n        }\r\n\r\n        .ps-trusted-work-media {\r\n            margin-top: 26px;\r\n            border-radius: 16px;\r\n        }\r\n\r\n        .ps-trusted-work-copy {\r\n            font-size: 16px;\r\n            line-height: 1.65;\r\n        }\r\n\r\n        .ps-trusted-counter-grid {\r\n            gap: 12px;\r\n            margin-top: 24px;\r\n        }\r\n\r\n        .ps-trusted-counter-box {\r\n            min-height: 116px;\r\n            padding: 18px 10px;\r\n            border-radius: 9px;\r\n        }\r\n\r\n        .ps-trusted-counter {\r\n            font-size: 30px;\r\n        }\r\n\r\n        .ps-trusted-counter-box p {\r\n            max-width: 130px;\r\n            margin-top: 9px;\r\n            font-size: 12px;\r\n            line-height: 1.3;\r\n        }\r\n    }\r\n\r\n    @media (max-width: 380px) {\r\n        .ps-trusted-counter-grid {\r\n            gap: 10px;\r\n        }\r\n\r\n        .ps-trusted-counter-box {\r\n            padding-right: 8px;\r\n            padding-left: 8px;\r\n        }\r\n\r\n        .ps-trusted-counter {\r\n            font-size: 27px;\r\n        }\r\n    }\r\n<\/style>\r\n\r\n<script>\r\n    (function () {\r\n        const sections = document.querySelectorAll(\r\n            \"[data-ps-trusted-work]\"\r\n        );\r\n\r\n        if (!sections.length) {\r\n            return;\r\n        }\r\n\r\n        const canonicalLink = document.querySelector(\r\n            'link[rel=\"canonical\"]'\r\n        );\r\n\r\n        let canonicalPath = \"\";\r\n\r\n        if (canonicalLink && canonicalLink.href) {\r\n            canonicalPath = new URL(\r\n                canonicalLink.href,\r\n                window.location.origin\r\n            ).pathname;\r\n        }\r\n\r\n        const isPortuguese =\r\n            \/^\\\/pt(?:\\\/|$)\/.test(window.location.pathname) ||\r\n            \/^\\\/pt(?:\\\/|$)\/.test(canonicalPath);\r\n\r\n        const COPY = {\r\n            en: {\r\n                title:\r\n                    \"Trusted Local Experts in Plumbing Repairs\",\r\n                description:\r\n                    \"connects you with certified electricians and plumbers in Porto. From urgent repairs to routine services, we deliver trusted home services backed by our numbers.\",\r\n                learnMore: \"Learn more\",\r\n                jobs: \"Jobs Completed\",\r\n                response: \"Quick Response\",\r\n                firstVisit: \"Fixed on First Visit\",\r\n                jobsSuffix: \"+\",\r\n                responseSuffix: \" min\",\r\n                firstVisitSuffix: \"%\",\r\n                experienceSuffix: \"+ Years\",\r\n                experience: \"Avg. Technician Experience\"\r\n            },\r\n            pt: {\r\n                title:\r\n                    \"Profissionais locais de confian\u00e7a para repara\u00e7\u00f5es de canaliza\u00e7\u00e3o\",\r\n                description:\r\n                    \"liga-o a eletricistas e canalizadores certificados no Porto. Desde repara\u00e7\u00f5es urgentes a servi\u00e7os de manuten\u00e7\u00e3o, disponibilizamos servi\u00e7os de confian\u00e7a para a sua casa, comprovados pelos nossos resultados.\",\r\n                learnMore: \"Saiba mais\",\r\n                jobs: \"Trabalhos Conclu\u00eddos\",\r\n                response: \"Resposta r\u00e1pida\",\r\n                firstVisit: \"Resolvido \u00e0 primeira visita\",\r\n                jobsSuffix: \"+\",\r\n                responseSuffix: \" min\",\r\n                firstVisitSuffix: \"%\",\r\n                experienceSuffix: \"+ Anos\",\r\n                experience: \"Experi\u00eancia m\u00e9dia dos t\u00e9cnicos\"\r\n            }\r\n        };\r\n\r\n        const copy = isPortuguese\r\n            ? COPY.pt\r\n            : COPY.en;\r\n\r\n        sections.forEach((section) => {\r\n            const titleEl = section.querySelector(\r\n                \".ps-trusted-work-title\"\r\n            );\r\n\r\n            const copyEl = section.querySelector(\r\n                \".ps-trusted-work-copy\"\r\n            );\r\n\r\n            const linkTextEl = section.querySelector(\r\n                \"[data-ps-trusted-link-text]\"\r\n            );\r\n\r\n            const jobsLabelEl = section.querySelector(\r\n                \"[data-ps-trusted-jobs-label]\"\r\n            );\r\n\r\n            const responseLabelEl = section.querySelector(\r\n                \"[data-ps-trusted-response-label]\"\r\n            );\r\n\r\n            const firstVisitLabelEl = section.querySelector(\r\n                \"[data-ps-trusted-first-visit-label]\"\r\n            );\r\n\r\n            const jobsSuffixEl = section.querySelector(\r\n                \"[data-ps-trusted-jobs-suffix]\"\r\n            );\r\n\r\n            const responseSuffixEl = section.querySelector(\r\n                \"[data-ps-trusted-response-suffix]\"\r\n            );\r\n\r\n            const firstVisitSuffixEl = section.querySelector(\r\n                \"[data-ps-trusted-first-visit-suffix]\"\r\n            );\r\n\r\n            const experienceSuffixEl = section.querySelector(\r\n                \"[data-ps-trusted-experience-suffix]\"\r\n            );\r\n\r\n            const experienceLabelEl = section.querySelector(\r\n                \"[data-ps-trusted-experience-label]\"\r\n            );\r\n\r\n            if (titleEl) {\r\n                titleEl.textContent = copy.title;\r\n            }\r\n\r\n            if (copyEl) {\r\n                copyEl.innerHTML =\r\n                    \"<strong>Pronto Solu\u00e7\u00f5es<\/strong> \" +\r\n                    copy.description;\r\n            }\r\n\r\n            if (linkTextEl) {\r\n                linkTextEl.textContent = copy.learnMore;\r\n            }\r\n\r\n            if (jobsLabelEl) {\r\n                jobsLabelEl.textContent = copy.jobs;\r\n            }\r\n\r\n            if (responseLabelEl) {\r\n                responseLabelEl.textContent = copy.response;\r\n            }\r\n\r\n            if (firstVisitLabelEl) {\r\n                firstVisitLabelEl.textContent =\r\n                    copy.firstVisit;\r\n            }\r\n\r\n            if (jobsSuffixEl) {\r\n                jobsSuffixEl.textContent =\r\n                    copy.jobsSuffix;\r\n            }\r\n\r\n            if (responseSuffixEl) {\r\n                responseSuffixEl.textContent =\r\n                    copy.responseSuffix;\r\n            }\r\n\r\n            if (firstVisitSuffixEl) {\r\n                firstVisitSuffixEl.textContent =\r\n                    copy.firstVisitSuffix;\r\n            }\r\n\r\n            if (experienceSuffixEl) {\r\n                experienceSuffixEl.textContent =\r\n                    copy.experienceSuffix;\r\n            }\r\n\r\n            if (experienceLabelEl) {\r\n                experienceLabelEl.textContent =\r\n                    copy.experience;\r\n            }\r\n        });\r\n\r\n        const reducedMotion =\r\n            window.matchMedia &&\r\n            window.matchMedia(\r\n                \"(prefers-reduced-motion: reduce)\"\r\n            ).matches;\r\n\r\n        if (\r\n            reducedMotion ||\r\n            !(\"IntersectionObserver\" in window)\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        const duration = 1400;\r\n\r\n        const animateCounter = (counter) => {\r\n            const target = Number(\r\n                counter.getAttribute(\"data-target\")\r\n            );\r\n\r\n            if (!Number.isFinite(target)) {\r\n                return;\r\n            }\r\n\r\n            const startTime = performance.now();\r\n            let previousValue = -1;\r\n\r\n            counter.textContent = \"0\";\r\n\r\n            const update = (currentTime) => {\r\n                const progress = Math.min(\r\n                    (currentTime - startTime) \/ duration,\r\n                    1\r\n                );\r\n\r\n                const currentValue = Math.round(\r\n                    target * progress\r\n                );\r\n\r\n                if (currentValue !== previousValue) {\r\n                    counter.textContent =\r\n                        `${currentValue}`;\r\n\r\n                    previousValue = currentValue;\r\n                }\r\n\r\n                if (progress < 1) {\r\n                    requestAnimationFrame(update);\r\n                } else {\r\n                    counter.textContent =\r\n                        `${target}`;\r\n                }\r\n            };\r\n\r\n            requestAnimationFrame(update);\r\n        };\r\n\r\n        const observer = new IntersectionObserver(\r\n            (entries) => {\r\n                entries.forEach((entry) => {\r\n                    if (\r\n                        entry.isIntersecting &&\r\n                        entry.target.dataset.animated !== \"true\"\r\n                    ) {\r\n                        entry.target.dataset.animated = \"true\";\r\n\r\n                        const counters =\r\n                            entry.target.querySelectorAll(\r\n                                \".ps-trusted-counter-number\"\r\n                            );\r\n\r\n                        counters.forEach((counter) => {\r\n                            animateCounter(counter);\r\n                        });\r\n\r\n                        observer.unobserve(entry.target);\r\n                    }\r\n                });\r\n            },\r\n            {\r\n                threshold: 0.35\r\n            }\r\n        );\r\n\r\n        sections.forEach((section) => {\r\n            const grid = section.querySelector(\r\n                \".ps-trusted-counter-grid\"\r\n            );\r\n\r\n            if (!grid) {\r\n                return;\r\n            }\r\n\r\n            const counters = grid.querySelectorAll(\r\n                \".ps-trusted-counter-number\"\r\n            );\r\n\r\n            counters.forEach((counter) => {\r\n                counter.textContent = \"0\";\r\n            });\r\n\r\n            observer.observe(grid);\r\n        });\r\n    })();\r\n<\/script>\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-12564edc e-con-full e-flex e-con e-parent\" data-id=\"12564edc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-101a32b8 elementor-widget elementor-widget-html\" data-id=\"101a32b8\" 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<!--\r\n  PRONTO SOLU\u00c7\u00d5ES | Option B Coverage Map \u2022 Plumbing \u2022 EN\r\n  1 Elementor HTML widget. CAOP 2025 geometry retained for the active service areas,\r\n  loaded from \/wp-content\/uploads\/pronto-coverage\/coverage-municipalities-caop2025-v1.json.\r\n  Leaflet 1.9.4 is self-hosted in \/wp-content\/uploads\/pronto-coverage\/leaflet-1.9.4\/.\r\n  City buttons select\/highlight. The permanent links below are ordinary crawlable HTML anchors.\r\n  Publish the same widget on the EN source hub; TranslatePress serves the \/pt\/ version.\r\n  Both locale link lists exist in initial HTML; the appropriate list is shown by page language.\r\n  Active areas follow Pronto's preferred commercial order.\r\n-->\r\n<section class=\"ps-coverage\" id=\"psCoverageSection\" data-ps-lang=\"auto\" data-carto-basemap-key=\"cb1_2dmm_2_865a8aa2b1f7ba1f9601899a\" aria-labelledby=\"psCoverageTitle\">\r\n  <div class=\"ps-coverage__inner\">\r\n    <div class=\"ps-coverage__heading\">\r\n      <h2 class=\"ps-coverage__title\" id=\"psCoverageTitle\" data-ps-copy=\"title\">Plumbers across Greater Porto<\/h2>\r\n      <p class=\"ps-coverage__intro\" data-ps-copy=\"intro\">Select a municipality on the map to see its local plumbing service page.<\/p>\r\n    <\/div>\r\n    <div class=\"ps-coverage__areas\" aria-label=\"Select municipality\" data-ps-aria-copy=\"areasLabel\">\r\n      <button class=\"ps-coverage__area\" type=\"button\" data-ps-area=\"Porto\" aria-pressed=\"false\">Porto<\/button>\r\n      <button class=\"ps-coverage__area\" type=\"button\" data-ps-area=\"Matosinhos\" aria-pressed=\"false\">Matosinhos<\/button>\r\n      <button class=\"ps-coverage__area\" type=\"button\" data-ps-area=\"Vila Nova de Gaia\" aria-pressed=\"false\">Vila Nova de Gaia<\/button>\r\n      <button class=\"ps-coverage__area\" type=\"button\" data-ps-area=\"Gondomar\" aria-pressed=\"false\">Gondomar<\/button>\r\n      <button class=\"ps-coverage__area\" type=\"button\" data-ps-area=\"Maia\" aria-pressed=\"false\">Maia<\/button>\r\n      <button class=\"ps-coverage__area\" type=\"button\" data-ps-area=\"Valongo\" aria-pressed=\"false\">Valongo<\/button>\r\n    <\/div>\r\n    <div class=\"ps-coverage__map-shell\">\r\n      <div class=\"ps-coverage__map\" id=\"psCoverageMap\" role=\"region\" aria-label=\"Interactive map of Pronto Solu\u00e7\u00f5es service areas\"><\/div>\r\n      <div class=\"ps-coverage__loading\" id=\"psCoverageLoading\" aria-live=\"polite\">\r\n        <span class=\"ps-coverage__spinner\" aria-hidden=\"true\"><\/span>\r\n        <span data-ps-copy=\"loading\">Loading map\u2026<\/span>\r\n      <\/div>\r\n    <\/div>\r\n    <p class=\"ps-coverage__error\" id=\"psCoverageError\" role=\"status\" hidden>The map could not be loaded. You can still use the municipality links below.<\/p>\r\n    <div class=\"ps-coverage__selection\" id=\"psCoverageSelection\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\r\n      <div class=\"ps-coverage__selection-copy\">\r\n        <h3 class=\"ps-coverage__selection-title\" id=\"psCoverageSelectionTitle\">Select a municipality<\/h3>\r\n        <p class=\"ps-coverage__selection-text\" id=\"psCoverageSelectionText\">Choose an area above or on the map to see the corresponding service.<\/p>\r\n      <\/div>\r\n      <a class=\"ps-coverage__selection-action\" id=\"psCoverageSelectionLink\" hidden>\r\n        View plumbing service &rarr;\r\n      <\/a>\r\n    <\/div>\r\n    <nav class=\"ps-coverage__destinations\" data-ps-links-lang=\"en\" translate=\"no\" aria-label=\"Direct links to plumbing services by municipality\">\r\n      <div class=\"ps-coverage__destination-list\">\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Porto\" href=\"https:\/\/prontosolucoes.pt\/plumber-in-porto\/\">Plumber in Porto<\/a>\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Matosinhos\" href=\"https:\/\/prontosolucoes.pt\/en\/matosinhos\/plumber\/\">Plumber in Matosinhos<\/a>\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Vila Nova de Gaia\" href=\"https:\/\/prontosolucoes.pt\/en\/vila-nova-de-gaia\/plumber\/\">Plumber in Vila Nova de Gaia<\/a>\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Gondomar\" href=\"https:\/\/prontosolucoes.pt\/en\/gondomar\/plumber\/\">Plumber in Gondomar<\/a>\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Maia\" href=\"https:\/\/prontosolucoes.pt\/en\/maia\/plumber\/\">Plumber in Maia<\/a>\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Valongo\" href=\"https:\/\/prontosolucoes.pt\/en\/valongo\/plumber\/\">Plumber in Valongo<\/a>\r\n      <\/div>\r\n    <\/nav>\r\n    <nav class=\"ps-coverage__destinations\" data-ps-links-lang=\"pt\" translate=\"no\" aria-label=\"Ver todos os servi\u00e7os por concelho\">\r\n      <p class=\"ps-coverage__destinations-heading\">Ver todos os servi\u00e7os por concelho<\/p>\r\n      <div class=\"ps-coverage__destination-list\">\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Porto\" href=\"https:\/\/prontosolucoes.pt\/pt\/plumber-in-porto\/\">Canalizador no Porto<\/a>\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Matosinhos\" href=\"https:\/\/prontosolucoes.pt\/matosinhos\/canalizador\/\">Canalizador em Matosinhos<\/a>\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Vila Nova de Gaia\" href=\"https:\/\/prontosolucoes.pt\/vila-nova-de-gaia\/canalizador\/\">Canalizador em Vila Nova de Gaia<\/a>\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Gondomar\" href=\"https:\/\/prontosolucoes.pt\/gondomar\/canalizador\/\">Canalizador em Gondomar<\/a>\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Maia\" href=\"https:\/\/prontosolucoes.pt\/maia\/canalizador\/\">Canalizador na Maia<\/a>\r\n        <a class=\"ps-coverage__direct-link\" data-ps-destination=\"Valongo\" href=\"https:\/\/prontosolucoes.pt\/valongo\/canalizador\/\">Canalizador em Valongo<\/a>\r\n      <\/div>\r\n    <\/nav>\r\n  <\/div>\r\n<\/section>\r\n<style>\r\n  #psCoverageSection,\r\n  #psCoverageSection *{\r\n    box-sizing:border-box;\r\n  }\r\n\r\n  #psCoverageSection{\r\n    width:100%;\r\n    padding:clamp(28px, 5vw, 58px) clamp(16px, 3vw, 30px);\r\n    background:transparent;\r\n    color:#0F2B46;\r\n    font-family:\"Montserrat\", sans-serif;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__inner{\r\n    width:100%;\r\n    max-width:1180px;\r\n    margin:0 auto;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__heading{\r\n    max-width:720px;\r\n    margin:0 auto 20px;\r\n    text-align:center;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__eyebrow{\r\n    margin:0 0 8px;\r\n    color:#2563EB;\r\n    font-size:12px;\r\n    line-height:1.25;\r\n    font-weight:800;\r\n    letter-spacing:.11em;\r\n    text-transform:uppercase;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__title{\r\n    margin:0;\r\n    color:#0F2B49;\r\n    font-size:36px;\r\n    line-height:1.08;\r\n    font-weight:700;\r\n    letter-spacing:-.03em;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__intro{\r\n    margin:12px auto 0;\r\n    max-width:620px;\r\n    color:#0F2B49;\r\n    font-size:1.02rem;\r\n    line-height:1.72;\r\n    font-weight:500;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__areas{\r\n    display:flex;\r\n    flex-wrap:wrap;\r\n    gap:8px;\r\n    margin:0 0 14px;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__area{\r\n    min-height:36px;\r\n    margin:0;\r\n    padding:8px 13px;\r\n    border:1px solid rgba(15,43,73,.24);\r\n    border-radius:11px;\r\n    background:#F8FAFF;\r\n    color:#0F2B49;\r\n    font:inherit;\r\n    font-size:13px;\r\n    line-height:1;\r\n    font-weight:750;\r\n    cursor:pointer;\r\n    box-shadow:none;\r\n    transition:\r\n      background-color .16s ease,\r\n      border-color .16s ease,\r\n      color .16s ease,\r\n      transform .16s ease;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__area:hover,\r\n  #psCoverageSection .ps-coverage__area:focus-visible{\r\n    border-color:#0F2B49;\r\n    background:rgba(15,43,73,.06);\r\n    color:#0F2B49;\r\n    outline:none;\r\n    transform:translateY(-1px);\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__area[aria-pressed=\"true\"]{\r\n    border-color:#0F2B49;\r\n    background:#0F2B49;\r\n    color:#FFFFFF;\r\n  }\r\n  #psCoverageSection .ps-coverage__map-shell{\r\n    position:relative;\r\n    width:100%;\r\n    height:clamp(320px, 43vw, 440px);\r\n    overflow:hidden;\r\n    border:1px solid rgba(15,43,70,.12);\r\n    border-radius:20px;\r\n    background:#F4F7F5;\r\n    box-shadow:0 14px 36px rgba(15,43,70,.08);\r\n    isolation:isolate;\r\n    contain:layout paint;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__map{\r\n    position:relative;\r\n    z-index:1;\r\n    width:100%;\r\n    height:100%;\r\n    background:#F4F7F5;\r\n    font-family:inherit;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__loading{\r\n    position:absolute;\r\n    z-index:2;\r\n    inset:0;\r\n    display:flex;\r\n    align-items:center;\r\n    justify-content:center;\r\n    gap:10px;\r\n    padding:20px;\r\n    background:#F4F7F5;\r\n    color:#536579;\r\n    font-size:13px;\r\n    font-weight:700;\r\n    transition:opacity .2s ease, visibility .2s ease;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__loading.is-hidden{\r\n    opacity:0;\r\n    visibility:hidden;\r\n    pointer-events:none;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__spinner{\r\n    width:18px;\r\n    height:18px;\r\n    border:2px solid rgba(37,99,235,.18);\r\n    border-top-color:#2563EB;\r\n    border-radius:999px;\r\n    animation:psCoverageSpin .75s linear infinite;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__error{\r\n    margin:12px 0 0;\r\n    padding:12px 14px;\r\n    border:1px solid rgba(185,28,28,.18);\r\n    border-radius:12px;\r\n    background:#FEF2F2;\r\n    color:#7F1D1D;\r\n    font-size:13px;\r\n    line-height:1.45;\r\n    font-weight:700;\r\n  }\r\n\r\n  #psCoverageSection .leaflet-container{\r\n    width:100%;\r\n    height:100%;\r\n    background:#F4F7F5;\r\n    font-family:inherit;\r\n  }\r\n\r\n  #psCoverageSection .leaflet-tile-pane{\r\n    opacity:.93;\r\n  }\r\n\r\n  \/* Tiles overlap by 1px (see initialiseMap). Leaflet's default plus-lighter blending would add the\r\n     overlapping pixel twice and draw a bright line on every tile edge, so these tiles blend normally. *\/\r\n  #psCoverageSection .leaflet-container img.leaflet-tile{\r\n    mix-blend-mode:normal;\r\n  }\r\n\r\n  #psCoverageSection .leaflet-interactive{\r\n    outline:none;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__map-label{\r\n    margin:0;\r\n    padding:0;\r\n    border:0;\r\n    background:transparent;\r\n    box-shadow:none;\r\n    color:#0F2B46;\r\n    font-size:12px;\r\n    line-height:1.1;\r\n    font-weight:850;\r\n    text-align:center;\r\n    text-shadow:\r\n      0 1px 0 rgba(255,255,255,.95),\r\n      0 0 4px rgba(255,255,255,.82);\r\n    pointer-events:none;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__map-label::before{\r\n    display:none;\r\n  }\r\n\r\n  #psCoverageSection .leaflet-control-attribution{\r\n    margin:0;\r\n    padding:2px 5px;\r\n    border-radius:7px 0 0 0;\r\n    background:rgba(255,255,255,.78);\r\n    color:rgba(15,43,70,.62);\r\n    font-size:8px;\r\n    line-height:1.2;\r\n    white-space:nowrap;\r\n  }\r\n\r\n  #psCoverageSection .leaflet-control-attribution a{\r\n    color:rgba(15,43,70,.72);\r\n    text-decoration:none;\r\n  }\r\n\r\n  #psCoverageSection .leaflet-popup-content-wrapper{\r\n    padding:0;\r\n    overflow:hidden;\r\n    border-radius:14px;\r\n    box-shadow:0 14px 34px rgba(15,43,70,.16);\r\n    transition:transform .16s ease, box-shadow .16s ease;\r\n  }\r\n\r\n  #psCoverageSection .leaflet-popup-tip-container{\r\n    transition:transform .16s ease;\r\n  }\r\n\r\n  #psCoverageSection .leaflet-popup:hover .leaflet-popup-content-wrapper,\r\n  #psCoverageSection .leaflet-popup:focus-within .leaflet-popup-content-wrapper{\r\n    transform:translateY(-2px);\r\n    box-shadow:0 18px 38px rgba(15,43,70,.22);\r\n  }\r\n\r\n  #psCoverageSection .leaflet-popup:hover .leaflet-popup-tip-container,\r\n  #psCoverageSection .leaflet-popup:focus-within .leaflet-popup-tip-container{\r\n    transform:translateY(-2px);\r\n  }\r\n\r\n  #psCoverageSection .leaflet-popup-content{\r\n    min-width:170px;\r\n    margin:0;\r\n    color:#0F2B46;\r\n    font-family:inherit;\r\n    line-height:1.4;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__popup-link{\r\n    display:block;\r\n    padding:14px 16px;\r\n    color:#0F2B46;\r\n    text-decoration:none;\r\n    cursor:pointer;\r\n    transition:background-color .16s ease, transform .1s ease;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__popup-link:hover,\r\n  #psCoverageSection .ps-coverage__popup-link:focus-visible{\r\n    background:rgba(37,99,235,.06);\r\n    color:#0F2B46;\r\n    text-decoration:none;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__popup-link:focus-visible{\r\n    outline:2px solid #2563EB;\r\n    outline-offset:-2px;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__popup-link:active{\r\n    background:rgba(37,99,235,.10);\r\n    transform:scale(.985);\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__popup-arrow{\r\n    display:inline-block;\r\n    margin-left:5px;\r\n    transition:transform .16s ease;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__popup-link:hover .ps-coverage__popup-arrow,\r\n  #psCoverageSection .ps-coverage__popup-link:focus-visible .ps-coverage__popup-arrow{\r\n    transform:translateX(4px);\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__popup-link:active .ps-coverage__popup-arrow{\r\n    transform:translateX(6px);\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__popup-kicker{\r\n    display:block;\r\n    margin-bottom:3px;\r\n    color:#2563EB;\r\n    font-size:10px;\r\n    line-height:1.2;\r\n    font-weight:850;\r\n    letter-spacing:.08em;\r\n    text-transform:uppercase;\r\n  }\r\n\r\n  #psCoverageSection .ps-coverage__popup-name{\r\n    display:block;\r\n    color:#0F2B46;\r\n    font-size:14px;\r\n    line-height:1.25;\r\n    font-weight:850;\r\n  }\r\n\r\n  @keyframes psCoverageSpin{\r\n    to{\r\n      transform:rotate(360deg);\r\n    }\r\n  }\r\n\r\n  @media (max-width: 767px){\r\n    #psCoverageSection{\r\n      padding:30px 14px;\r\n    }\r\n\r\n    #psCoverageSection .ps-coverage__heading{\r\n      margin-bottom:16px;\r\n    }\r\n\r\n    #psCoverageSection .ps-coverage__title{\r\n      font-size:clamp(2rem, 8vw, 2.6rem);\r\n      line-height:1.1;\r\n    }\r\n\r\n    #psCoverageSection .ps-coverage__areas{\r\n      gap:7px;\r\n    }\r\n\r\n    #psCoverageSection .ps-coverage__area{\r\n      min-height:34px;\r\n      padding:8px 11px;\r\n      font-size:12px;\r\n    }\r\n\r\n    #psCoverageSection .ps-coverage__map-shell{\r\n      height:300px;\r\n      border-radius:16px;\r\n    }\r\n\r\n    #psCoverageSection .ps-coverage__map-label{\r\n      font-size:10px;\r\n    }\r\n\r\n    #psCoverageSection .leaflet-control-attribution{\r\n      max-width:100%;\r\n      overflow:hidden;\r\n      font-size:8px;\r\n      text-overflow:ellipsis;\r\n    }\r\n  }\r\n\r\n  @media (prefers-reduced-motion: reduce){\r\n    #psCoverageSection .ps-coverage__area,\r\n    #psCoverageSection .ps-coverage__loading{\r\n      transition:none;\r\n    }\r\n\r\n    #psCoverageSection .ps-coverage__spinner{\r\n      animation:none;\r\n    }\r\n  }\r\n\r\n  \/* OPTION B: selected municipality and permanent crawlable links *\/\r\n  #psCoverageSection .ps-coverage__selection {\r\n    display:flex;\r\n    align-items:center;\r\n    justify-content:space-between;\r\n    flex-wrap:wrap;\r\n    gap:14px;\r\n    margin-top:15px;\r\n    padding:18px 20px;\r\n    border:1px solid rgba(37,99,235,.16);\r\n    border-radius:16px;\r\n    background:#F8FAFF;\r\n  }\r\n  #psCoverageSection .ps-coverage__selection-copy { flex:1 1 240px; min-width:0; }\r\n  #psCoverageSection .ps-coverage__selection-title {\r\n    margin:0;\r\n    color:#0F2B46;\r\n    font-size:19px;\r\n    line-height:1.3;\r\n    font-weight:850;\r\n  }\r\n  #psCoverageSection .ps-coverage__selection-text {\r\n    margin:6px 0 0;\r\n    color:#536579;\r\n    font-size:14px;\r\n    line-height:1.5;\r\n  }\r\n  #psCoverageSection .ps-coverage__selection-action {\r\n    display:inline-flex;\r\n    align-items:center;\r\n    justify-content:center;\r\n    min-height:46px;\r\n    padding:12px 17px;\r\n    border-radius:14px;\r\n    background:#0F2B49;\r\n    color:#FFF;\r\n    font-size:16px;\r\n    font-weight:800;\r\n    line-height:1.25;\r\n    text-align:center;\r\n    text-decoration:none;\r\n    transition:background-color .16s ease;\r\n  }\r\n  #psCoverageSection .ps-coverage__selection-action:hover,\r\n  #psCoverageSection .ps-coverage__selection-action:focus-visible {\r\n    background:#0C2440;\r\n    color:#FFF;\r\n    outline:2px solid #0C2440;\r\n    outline-offset:3px;\r\n  }\r\n  #psCoverageSection .ps-coverage__selection-action[hidden] { display:none; }\r\n  #psCoverageSection .ps-coverage__destinations { margin:18px 0 0; }\r\n  #psCoverageSection .ps-coverage__destinations-heading {\r\n    margin:0 0 9px;\r\n    color:#536579;\r\n    font-size:12px;\r\n    font-weight:800;\r\n    letter-spacing:.025em;\r\n  }\r\n  #psCoverageSection .ps-coverage__destination-list {\r\n    display:flex;\r\n    flex-wrap:wrap;\r\n    gap:8px 16px;\r\n  }\r\n  #psCoverageSection .ps-coverage__direct-link {\r\n    display:inline-block;\r\n    color:#1746A2;\r\n    font-size:13px;\r\n    line-height:1.6;\r\n    font-weight:650;\r\n    text-decoration:underline;\r\n    text-underline-offset:3px;\r\n  }\r\n  #psCoverageSection .ps-coverage__direct-link:hover,\r\n  #psCoverageSection .ps-coverage__direct-link:focus-visible {\r\n    color:#0F2B46;\r\n    text-decoration-thickness:2px;\r\n  }\r\n  @media (max-width:767px) {\r\n    #psCoverageSection .ps-coverage__selection { padding:16px; }\r\n    #psCoverageSection .ps-coverage__selection-title { font-size:17px; }\r\n    #psCoverageSection .ps-coverage__selection-action { width:100%; }\r\n    #psCoverageSection .ps-coverage__destination-list { gap:8px 12px; }\r\n  }\r\n\r\n  \/* TranslatePress fallback without JavaScript: show links for the document language. *\/\r\n  #psCoverageSection [data-ps-links-lang=\"pt\"] { display:none; }\r\n  html[lang^=\"pt\"] #psCoverageSection [data-ps-links-lang=\"pt\"] { display:block; }\r\n  html[lang^=\"pt\"] #psCoverageSection [data-ps-links-lang=\"en\"] { display:none; }\r\n  #psCoverageSection [data-ps-links-lang][hidden] { display:none !important; }\r\n<\/style>\r\n\r\n<script>\r\n  (function () {\r\n    \"use strict\";\r\n\r\n    const section = document.getElementById(\"psCoverageSection\");\r\n\r\n    if (!section || section.dataset.psCoverageReady === \"true\") {\r\n      return;\r\n    }\r\n\r\n    section.dataset.psCoverageReady = \"true\";\r\n\r\n    \/\/ Self-hosted assets: Leaflet 1.9.4 and the CAOP 2025 geometry, uploaded to wp-content\/uploads.\r\n    const assetBase = \"\/wp-content\/uploads\/pronto-coverage\/\";\r\n    const geojsonUrl = assetBase + \"coverage-municipalities-caop2025-v1.json\";\r\n\r\n    const mapElement = document.getElementById(\"psCoverageMap\");\r\n    const loadingElement = document.getElementById(\"psCoverageLoading\");\r\n    const errorElement = document.getElementById(\"psCoverageError\");\r\n    const areaButtons = Array.from(section.querySelectorAll(\"[data-ps-area]\"));\r\n    const selectionTitle = section.querySelector(\"#psCoverageSelectionTitle\");\r\n    const selectionText = section.querySelector(\"#psCoverageSelectionText\");\r\n    const selectionLink = section.querySelector(\"#psCoverageSelectionLink\");\r\n    const linksByArea = Object.create(null);\r\n    const documentLanguage = (document.documentElement.lang || \"\").toLowerCase();\r\n    const isPortuguese = section.dataset.psLang === \"pt\" || (section.dataset.psLang !== \"en\" && (documentLanguage.startsWith(\"pt\") || \/^\\\/pt(?:\\\/|$)\/.test(window.location.pathname)));\r\n    \/\/ Both language-specific link sets are in the static HTML for crawler discovery.\r\n    \/\/ Only the current page language's real anchors are used by the selection panel.\r\n    const activeLang = isPortuguese ? \"pt\" : \"en\";\r\n    section.querySelectorAll(\"[data-ps-links-lang]\").forEach(function (nav) {\r\n      nav.hidden = nav.getAttribute(\"data-ps-links-lang\") !== activeLang;\r\n    });\r\n    section.querySelectorAll('[data-ps-links-lang=\"' + activeLang + '\"] a[data-ps-destination][href]')\r\n      .forEach(function (anchor) {\r\n        linksByArea[anchor.getAttribute(\"data-ps-destination\")] = anchor;\r\n      });\r\n\r\n    const copy = isPortuguese\r\n      ? {\r\n          eyebrow: \"\u00c1reas de cobertura\",\r\n          title: \"Canalizadores no Grande Porto\",\r\n          intro: \"Escolhe um concelho no mapa para veres a p\u00e1gina de canaliza\u00e7\u00e3o da tua zona.\",\r\n          loading: \"A carregar mapa\u2026\",\r\n          error: \"N\u00e3o foi poss\u00edvel carregar o mapa. Podes continuar pelos links dos concelhos abaixo.\",\r\n          mapLabel: \"Mapa interativo das \u00e1reas de cobertura da Pronto Solu\u00e7\u00f5es\",\r\n          areasLabel: \"Selecionar munic\u00edpio\",\r\n          popupKicker: \"Servi\u00e7o de canaliza\u00e7\u00e3o\",\r\n          selectedIntro: \"Consulta os servi\u00e7os de canaliza\u00e7\u00e3o para esta zona.\",\r\n          selectedAction: \"Ver canalizador nesta zona \u2192\"\r\n        }\r\n      : {\r\n          eyebrow: \"Service areas\",\r\n          title: \"Plumbers across Greater Porto\",\r\n          intro: \"Select a municipality on the map to see its local plumbing service page.\",\r\n          loading: \"Loading map\u2026\",\r\n          error: \"The map could not be loaded. You can still use the municipality links below.\",\r\n          mapLabel: \"Interactive map of Pronto Solu\u00e7\u00f5es service areas\",\r\n          areasLabel: \"Select municipality\",\r\n          popupKicker: \"Plumbing service\",\r\n          selectedIntro: \"Explore our plumbing services for this area.\",\r\n          selectedAction: \"View local plumber page \u2192\"\r\n        };\r\n\r\n    const areaTitles = isPortuguese\r\n      ? {\r\n          \"Porto\": \"Canalizador no Porto\",\r\n          \"Matosinhos\": \"Canalizador em Matosinhos\",\r\n          \"Vila Nova de Gaia\": \"Canalizador em Vila Nova de Gaia\",\r\n          \"Gondomar\": \"Canalizador em Gondomar\",\r\n          \"Maia\": \"Canalizador na Maia\",\r\n          \"Valongo\": \"Canalizador em Valongo\"\r\n        }\r\n      : {\r\n          \"Porto\": \"Plumber in Porto\",\r\n          \"Matosinhos\": \"Plumber in Matosinhos\",\r\n          \"Vila Nova de Gaia\": \"Plumber in Vila Nova de Gaia\",\r\n          \"Gondomar\": \"Plumber in Gondomar\",\r\n          \"Maia\": \"Plumber in Maia\",\r\n          \"Valongo\": \"Plumber in Valongo\"\r\n        };\r\n    section.querySelectorAll(\"[data-ps-copy]\").forEach(function (element) {\r\n      const key = element.getAttribute(\"data-ps-copy\");\r\n\r\n      if (copy[key]) {\r\n        element.textContent = copy[key];\r\n      }\r\n    });\r\n\r\n    section.querySelectorAll(\"[data-ps-aria-copy]\").forEach(function (element) {\r\n      const key = element.getAttribute(\"data-ps-aria-copy\");\r\n\r\n      if (copy[key]) {\r\n        element.setAttribute(\"aria-label\", copy[key]);\r\n      }\r\n    });\r\n\r\n    mapElement.setAttribute(\"aria-label\", copy.mapLabel);\r\n    errorElement.textContent = copy.error;\r\n\r\n    let map = null;\r\n    let mapStarted = false;\r\n    let activeArea = \"\";\r\n    let pendingArea = \"\";\r\n    let geojsonPromise = null;\r\n    const layersByArea = {};\r\n\r\n    function loadLeaflet() {\r\n      if (window.psCoverageLeafletPromise) {\r\n        return window.psCoverageLeafletPromise;\r\n      }\r\n\r\n      if (window.L) {\r\n        return Promise.resolve(window.L);\r\n      }\r\n\r\n      const stylesheetUrl = assetBase + \"leaflet-1.9.4\/leaflet.css\";\r\n      const scriptUrl = assetBase + \"leaflet-1.9.4\/leaflet.js\";\r\n\r\n      \/\/ The map must not initialise before Leaflet's CSS has applied, or it draws unstyled.\r\n      const stylesheetReady = new Promise(function (resolve, reject) {\r\n        let stylesheet = document.querySelector('link[href=\"' + stylesheetUrl + '\"]');\r\n\r\n        if (stylesheet && stylesheet.sheet) {\r\n          resolve();\r\n          return;\r\n        }\r\n\r\n        if (!stylesheet) {\r\n          stylesheet = document.createElement(\"link\");\r\n          stylesheet.rel = \"stylesheet\";\r\n          stylesheet.href = stylesheetUrl;\r\n          stylesheet.integrity = \"sha256-p4NxAoJBhIIN+hmNHrzRCf9tD\/miZyoHS5obTRR9BMY=\";\r\n          stylesheet.crossOrigin = \"anonymous\";\r\n        }\r\n\r\n        stylesheet.addEventListener(\"load\", function () {\r\n          resolve();\r\n        }, { once: true });\r\n        stylesheet.addEventListener(\"error\", function () {\r\n          reject(new Error(\"leaflet_css_failed\"));\r\n        }, { once: true });\r\n\r\n        if (!stylesheet.parentNode) {\r\n          document.head.appendChild(stylesheet);\r\n        }\r\n      });\r\n\r\n      const scriptReady = new Promise(function (resolve, reject) {\r\n        const existingScript = document.querySelector('script[src=\"' + scriptUrl + '\"]');\r\n\r\n        function finishLoading() {\r\n          if (window.L) {\r\n            resolve(window.L);\r\n          } else {\r\n            reject(new Error(\"leaflet_unavailable\"));\r\n          }\r\n        }\r\n\r\n        if (existingScript) {\r\n          existingScript.addEventListener(\"load\", finishLoading, { once: true });\r\n          existingScript.addEventListener(\"error\", function () {\r\n            reject(new Error(\"leaflet_failed\"));\r\n          }, { once: true });\r\n          return;\r\n        }\r\n\r\n        const script = document.createElement(\"script\");\r\n        script.src = scriptUrl;\r\n        script.integrity = \"sha256-20nQCchB9co0qIjJZRGuk2\/Z9VM+kNiyxNV1lvTlZBo=\";\r\n        script.crossOrigin = \"anonymous\";\r\n        script.async = true;\r\n        script.addEventListener(\"load\", finishLoading, { once: true });\r\n        script.addEventListener(\"error\", function () {\r\n          reject(new Error(\"leaflet_failed\"));\r\n        }, { once: true });\r\n        document.head.appendChild(script);\r\n      });\r\n\r\n      window.psCoverageLeafletPromise = Promise.all([stylesheetReady, scriptReady]).then(function (results) {\r\n        return results[1];\r\n      });\r\n\r\n      return window.psCoverageLeafletPromise;\r\n    }\r\n\r\n    function loadGeojson() {\r\n      if (!geojsonPromise) {\r\n        geojsonPromise = fetch(geojsonUrl).then(function (response) {\r\n          if (!response.ok) {\r\n            throw new Error(\"geojson_failed\");\r\n          }\r\n\r\n          return response.json();\r\n        });\r\n      }\r\n\r\n      return geojsonPromise;\r\n    }\r\n\r\n    function featureName(feature) {\r\n      if (!feature || !feature.properties) {\r\n        return \"\";\r\n      }\r\n\r\n      return feature.properties.key || feature.properties.name || \"\";\r\n    }\r\n\r\n    function defaultStyle() {\r\n      return {\r\n        color: \"#2563EB\",\r\n        weight: 2,\r\n        opacity: 1,\r\n        fillColor: \"#60A5FA\",\r\n        fillOpacity: 0.2\r\n      };\r\n    }\r\n\r\n    function activeStyle() {\r\n      return {\r\n        color: \"#1746A2\",\r\n        weight: 3,\r\n        opacity: 1,\r\n        fillColor: \"#3B82F6\",\r\n        fillOpacity: 0.43\r\n      };\r\n    }\r\n\r\n    function hoverStyle() {\r\n      return {\r\n        color: \"#1D4ED8\",\r\n        weight: 2.6,\r\n        opacity: 1,\r\n        fillColor: \"#60A5FA\",\r\n        fillOpacity: 0.33\r\n      };\r\n    }\r\n\r\n    function popupContent(areaName) {\r\n      const destination = linksByArea[areaName];\r\n      const link = document.createElement(\"a\");\r\n      const kicker = document.createElement(\"span\");\r\n      const name = document.createElement(\"strong\");\r\n      const arrow = document.createElement(\"span\");\r\n\r\n      link.className = \"ps-coverage__popup-link\";\r\n      link.href = destination.href;\r\n\r\n      kicker.className = \"ps-coverage__popup-kicker\";\r\n      kicker.textContent = copy.popupKicker;\r\n\r\n      name.className = \"ps-coverage__popup-name\";\r\n      name.textContent = areaName;\r\n\r\n      arrow.className = \"ps-coverage__popup-arrow\";\r\n      arrow.setAttribute(\"aria-hidden\", \"true\");\r\n      arrow.textContent = \"\u2192\";\r\n\r\n      name.appendChild(arrow);\r\n      link.appendChild(kicker);\r\n      link.appendChild(name);\r\n\r\n      return link;\r\n    }\r\n\r\n    function updateSelectedPanel(areaName) {\r\n      const anchor = linksByArea[areaName];\r\n      selectionTitle.textContent = areaTitles[areaName] || areaName;\r\n      selectionText.textContent = copy.selectedIntro;\r\n\r\n      if (anchor) {\r\n        selectionLink.href = anchor.href;\r\n        selectionLink.textContent = copy.selectedAction;\r\n        selectionLink.hidden = false;\r\n      } else {\r\n        selectionLink.hidden = true;\r\n        selectionLink.removeAttribute(\"href\");\r\n      }\r\n    }\r\n\r\n    function setActiveArea(areaName, openPopup) {\r\n      \/\/ Update the panel immediately, even before Leaflet has finished loading.\r\n      activeArea = areaName;\r\n      areaButtons.forEach(function (button) {\r\n        const isActive = button.getAttribute(\"data-ps-area\") === activeArea;\r\n        button.setAttribute(\"aria-pressed\", isActive ? \"true\" : \"false\");\r\n      });\r\n      updateSelectedPanel(areaName);\r\n\r\n      if (!layersByArea[areaName]) {\r\n        pendingArea = areaName;\r\n        startMap();\r\n        return;\r\n      }\r\n\r\n      Object.keys(layersByArea).forEach(function (name) {\r\n        layersByArea[name].setStyle(name === activeArea ? activeStyle() : defaultStyle());\r\n      });\r\n\r\n      const activeLayer = layersByArea[activeArea];\r\n      activeLayer.bringToFront();\r\n\r\n      if (openPopup) {\r\n        activeLayer.bindPopup(popupContent(activeArea), {\r\n          closeButton: false,\r\n          autoPan: true,\r\n          offset: [0, -4]\r\n        });\r\n        activeLayer.openPopup();\r\n      }\r\n    }\r\n\r\n    function initialiseMap(geojson) {\r\n      map = window.L.map(mapElement, {\r\n        zoomControl: false,\r\n        attributionControl: true,\r\n        scrollWheelZoom: false,\r\n        doubleClickZoom: false,\r\n        boxZoom: false,\r\n        keyboard: true,\r\n        dragging: false,\r\n        touchZoom: false,\r\n        zoomSnap: 0.25,\r\n        zoomDelta: 0.25\r\n      });\r\n\r\n      map.attributionControl.setPrefix(false);\r\n\r\n      const cartoBasemapKey = (section.dataset.cartoBasemapKey || \"\").trim();\r\n      const sharedTileOptions = {\r\n        minZoom: 8,\r\n        maxZoom: 19,\r\n        updateWhenIdle: true,\r\n        keepBuffer: 1,\r\n        crossOrigin: true\r\n      };\r\n      \/\/ Each tile is drawn 1px larger than its grid cell, so neighbouring tiles overlap by 1px and no gap can open\r\n      \/\/ at fractional zoom (zoomSnap 0.25). Needs the mix-blend-mode:normal rule in the <style> block: with Leaflet's\r\n      \/\/ default plus-lighter blending the overlapping pixel is added twice and draws a bright line on every tile edge.\r\n      const OverlappingTileLayer = window.L.TileLayer.extend({\r\n        _initTile: function (tile) {\r\n          window.L.TileLayer.prototype._initTile.call(this, tile);\r\n\r\n          const tileSize = this.getTileSize();\r\n          tile.style.width = tileSize.x + 1 + \"px\";\r\n          tile.style.height = tileSize.y + 1 + \"px\";\r\n        }\r\n      });\r\n      let baseTiles;\r\n\r\n      if (cartoBasemapKey) {\r\n        baseTiles = new OverlappingTileLayer(\r\n          \"https:\/\/{s}.basemaps.cartocdn.com\/rastertiles\/voyager_nolabels\/{z}\/{x}\/{y}{r}.png?key=\" +\r\n            encodeURIComponent(cartoBasemapKey),\r\n          Object.assign({}, sharedTileOptions, {\r\n            subdomains: \"abcd\",\r\n            attribution: '&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a> &copy; <a href=\"https:\/\/carto.com\/attributions\">CARTO<\/a>'\r\n          })\r\n        );\r\n      } else {\r\n        baseTiles = new OverlappingTileLayer(\r\n          \"https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png\",\r\n          Object.assign({}, sharedTileOptions, {\r\n            subdomains: \"abc\",\r\n            attribution: '&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a>'\r\n          })\r\n        );\r\n      }\r\n      baseTiles.addTo(map);\r\n\r\n      const geojsonLayer = window.L.geoJSON(geojson, {\r\n        style: defaultStyle,\r\n        onEachFeature: function (feature, layer) {\r\n          const areaName = featureName(feature);\r\n\r\n          if (!areaName) {\r\n            return;\r\n          }\r\n\r\n          layersByArea[areaName] = layer;\r\n\r\n          layer.bindTooltip(areaName, {\r\n            permanent: true,\r\n            direction: \"center\",\r\n            className: \"ps-coverage__map-label\"\r\n          });\r\n\r\n          layer.on(\"click\", function () {\r\n            setActiveArea(areaName, true);\r\n          });\r\n\r\n          layer.on(\"mouseover\", function () {\r\n            if (activeArea !== areaName) {\r\n              layer.setStyle(hoverStyle());\r\n            }\r\n          });\r\n\r\n          layer.on(\"mouseout\", function () {\r\n            layer.setStyle(activeArea === areaName ? activeStyle() : defaultStyle());\r\n          });\r\n        }\r\n      }).addTo(map);\r\n\r\n      function fitMap() {\r\n        const isMobile = window.matchMedia(\"(max-width: 767px)\").matches;\r\n        const padding = isMobile ? [22, 22] : [10, 10];\r\n\r\n        map.invalidateSize();\r\n        map.fitBounds(geojsonLayer.getBounds(), {\r\n          padding: padding,\r\n          animate: false\r\n        });\r\n      }\r\n\r\n      window.requestAnimationFrame(fitMap);\r\n\r\n      if (window.ResizeObserver) {\r\n        let resizeFrame = null;\r\n        const resizeObserver = new ResizeObserver(function () {\r\n          if (resizeFrame) {\r\n            window.cancelAnimationFrame(resizeFrame);\r\n          }\r\n\r\n          resizeFrame = window.requestAnimationFrame(fitMap);\r\n        });\r\n\r\n        resizeObserver.observe(mapElement);\r\n      } else {\r\n        window.addEventListener(\"resize\", fitMap, { passive: true });\r\n      }\r\n\r\n      loadingElement.classList.add(\"is-hidden\");\r\n\r\n      if (pendingArea && layersByArea[pendingArea]) {\r\n        const areaToOpen = pendingArea;\r\n        pendingArea = \"\";\r\n        setActiveArea(areaToOpen, true);\r\n      }\r\n    }\r\n\r\n    function showMapError() {\r\n      loadingElement.classList.add(\"is-hidden\");\r\n      errorElement.hidden = false;\r\n    }\r\n\r\n    function startMap() {\r\n      if (mapStarted) {\r\n        return;\r\n      }\r\n\r\n      mapStarted = true;\r\n      Promise.all([loadLeaflet(), loadGeojson()])\r\n        .then(function (results) {\r\n          initialiseMap(results[1]);\r\n        })\r\n        .catch(showMapError);\r\n    }\r\n\r\n    areaButtons.forEach(function (button) {\r\n      button.addEventListener(\"click\", function () {\r\n        setActiveArea(button.getAttribute(\"data-ps-area\"), true);\r\n      });\r\n\r\n      button.addEventListener(\"mouseenter\", function () {\r\n        const areaName = button.getAttribute(\"data-ps-area\");\r\n\r\n        if (layersByArea[areaName] && activeArea !== areaName) {\r\n          layersByArea[areaName].setStyle(hoverStyle());\r\n        }\r\n      });\r\n\r\n      button.addEventListener(\"mouseleave\", function () {\r\n        const areaName = button.getAttribute(\"data-ps-area\");\r\n\r\n        if (layersByArea[areaName]) {\r\n          layersByArea[areaName].setStyle(activeArea === areaName ? activeStyle() : defaultStyle());\r\n        }\r\n      });\r\n    });\r\n\r\n    if (\"IntersectionObserver\" in window) {\r\n      const mapObserver = new IntersectionObserver(function (entries) {\r\n        if (entries.some(function (entry) { return entry.isIntersecting; })) {\r\n          mapObserver.disconnect();\r\n          startMap();\r\n        }\r\n      }, {\r\n        rootMargin: \"300px 0px\"\r\n      });\r\n\r\n      mapObserver.observe(section);\r\n    } else {\r\n      startMap();\r\n    }\r\n  })();\r\n<\/script>\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-be27c36 e-con-full e-flex e-con e-parent\" data-id=\"be27c36\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d524bd0 elementor-widget elementor-widget-html\" data-id=\"d524bd0\" 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>\r\n.ps-faq-clean {\r\n  background: #f2f4f3;\r\n  padding: 72px 20px 56px;\r\n  font-family: \"Montserrat\", sans-serif;\r\n  color: #0F2B49;\r\n}\r\n\r\n.ps-faq-clean__wrap {\r\n  max-width: 980px;\r\n  margin: 0 auto;\r\n}\r\n\r\n.ps-faq-clean__title {\r\n  margin: 0 0 44px;\r\n  color: #0F2B49;\r\n  text-align: center;\r\n  font-family: \"Montserrat\", sans-serif;\r\n  font-size: 36px;\r\n  line-height: 1.08;\r\n  letter-spacing: -0.03em;\r\n  font-weight: 700;\r\n}\r\n\r\n.ps-faq-clean__list {\r\n  display: grid;\r\n  gap: 18px;\r\n}\r\n\r\n.ps-faq-clean__item {\r\n  background: #ffffff;\r\n  border: 1px solid #d9ddda;\r\n  border-radius: 18px;\r\n  overflow: hidden;\r\n  box-shadow: 0 2px 8px rgba(15, 43, 73, 0.06), 0 1px 2px rgba(15, 43, 73, 0.04);\r\n  transition: box-shadow 0.18s ease, border-color 0.18s ease;\r\n}\r\n\r\n.ps-faq-clean__item:hover {\r\n  box-shadow: 0 6px 16px rgba(15, 43, 73, 0.10), 0 2px 6px rgba(15, 43, 73, 0.05);\r\n}\r\n\r\n.ps-faq-clean__item[hidden] {\r\n  display: none !important;\r\n}\r\n\r\n.ps-faq-clean__extras {\r\n  margin-top: -18px;\r\n  display: grid;\r\n  gap: 18px;\r\n  max-height: 0;\r\n  opacity: 0;\r\n  overflow: hidden;\r\n  transition: max-height 0.34s ease, opacity 0.22s ease, margin-top 0.34s ease;\r\n  will-change: max-height, opacity;\r\n}\r\n\r\n.ps-faq-clean__extras.is-open {\r\n  margin-top: 0;\r\n  max-height: 2200px;\r\n  opacity: 1;\r\n}\r\n\r\n.ps-faq-clean__trigger {\r\n  width: 100%;\r\n  border: 0;\r\n  background: transparent;\r\n  padding: 18px 24px;\r\n  display: grid;\r\n  grid-template-columns: minmax(0, 1fr) auto;\r\n  gap: 18px;\r\n  align-items: center;\r\n  text-align: left;\r\n  cursor: pointer;\r\n}\r\n\r\n.ps-faq-clean__trigger:focus-visible {\r\n  outline: 3px solid rgba(16, 35, 59, 0.14);\r\n  outline-offset: -3px;\r\n}\r\n\r\n.ps-faq-clean__question {\r\n  display: block;\r\n  color: #0F2B49;\r\n  font-family: \"Montserrat\", sans-serif;\r\n  font-size: 16px;\r\n  line-height: 1.35;\r\n  font-weight: 700;\r\n}\r\n\r\n.ps-faq-clean__toggle {\r\n  width: 42px;\r\n  height: 42px;\r\n  border: 1px solid #d1d5d2;\r\n  border-radius: 999px;\r\n  background: #ffffff;\r\n  position: relative;\r\n  flex: 0 0 42px;\r\n}\r\n\r\n.ps-faq-clean__toggle::before,\r\n.ps-faq-clean__toggle::after {\r\n  content: \"\";\r\n  position: absolute;\r\n  top: 50%;\r\n  left: 50%;\r\n  width: 14px;\r\n  height: 2px;\r\n  background: #0F2B49;\r\n  border-radius: 999px;\r\n  transform: translate(-50%, -50%);\r\n  transition: transform 0.22s ease, opacity 0.22s ease;\r\n}\r\n\r\n.ps-faq-clean__toggle::after {\r\n  transform: translate(-50%, -50%) rotate(90deg);\r\n}\r\n\r\n.ps-faq-clean__item.is-open .ps-faq-clean__toggle::after {\r\n  opacity: 0;\r\n  transform: translate(-50%, -50%) rotate(90deg) scaleX(0.2);\r\n}\r\n\r\n.ps-faq-clean__answer {\r\n  display: grid;\r\n  grid-template-rows: 0fr;\r\n  transition: grid-template-rows 0.28s ease;\r\n}\r\n\r\n.ps-faq-clean__item.is-open .ps-faq-clean__answer {\r\n  grid-template-rows: 1fr;\r\n}\r\n\r\n.ps-faq-clean__answer-inner {\r\n  overflow: hidden;\r\n  padding: 0 24px;\r\n}\r\n\r\n.ps-faq-clean__item.is-open .ps-faq-clean__answer-inner {\r\n  padding-bottom: 22px;\r\n}\r\n\r\n.ps-faq-clean__answer-inner p {\r\n  margin: 0;\r\n  color: #0F2B49;\r\n  font-family: \"Montserrat\", sans-serif;\r\n  font-size: 1.02rem;\r\n  line-height: 1.72;\r\n  font-weight: 500;\r\n}\r\n\r\n.ps-faq-clean__footer {\r\n  display: flex;\r\n  justify-content: center;\r\n  margin-top: 28px;\r\n}\r\n\r\n.ps-faq-clean__more {\r\n  width: auto;\r\n  min-width: 0;\r\n  min-height: 50px;\r\n  padding: 14px 28px;\r\n  border: 0;\r\n  border-radius: 20px;\r\n  background: #0F2B49;\r\n  color: #ffffff;\r\n  font-family: \"Montserrat\", sans-serif;\r\n  font-size: 1rem;\r\n  line-height: 1;\r\n  font-weight: 700;\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  cursor: pointer;\r\n  transition: transform 0.18s ease, opacity 0.18s ease;\r\n}\r\n\r\n.ps-faq-clean__more:hover {\r\n  transform: translateY(-1px);\r\n  background: #0c2440;\r\n}\r\n\r\n.ps-faq-clean__more:focus-visible {\r\n  outline: 3px solid rgba(16, 35, 59, 0.18);\r\n  outline-offset: 2px;\r\n}\r\n\r\n.ps-faq-clean__item.is-open {\r\n  border-color: #E1A134 !important;\r\n  box-shadow: inset 0 0 0 1px #E1A134;\r\n}\r\n\r\n@media (max-width: 767px) {\r\n  .ps-faq-clean {\r\n    padding: 54px 16px 42px;\r\n  }\r\n\r\n  .ps-faq-clean__title {\r\n    margin-bottom: 30px;\r\n    font-size: clamp(2rem, 8vw, 2.6rem);\r\n    line-height: 1.1;\r\n  }\r\n\r\n  .ps-faq-clean__trigger {\r\n    padding: 18px 18px;\r\n    gap: 14px;\r\n  }\r\n\r\n  .ps-faq-clean__question {\r\n    font-size: 1rem;\r\n    line-height: 1.3;\r\n  }\r\n\r\n  .ps-faq-clean__toggle {\r\n    width: 38px;\r\n    height: 38px;\r\n    flex-basis: 38px;\r\n  }\r\n\r\n  .ps-faq-clean__answer-inner {\r\n    padding: 0 18px;\r\n  }\r\n\r\n  .ps-faq-clean__item.is-open .ps-faq-clean__answer-inner {\r\n    padding-bottom: 18px;\r\n  }\r\n\r\n  .ps-faq-clean__more {\r\n    width: auto;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<section class=\"ps-faq-clean\" aria-labelledby=\"ps-faq-home-title\">\r\n  <div class=\"ps-faq-clean__wrap\">\r\n    <h2 class=\"ps-faq-clean__title\" id=\"ps-faq-home-title\">Frequently asked questions<\/h2>\r\n\r\n    <div class=\"ps-faq-clean__list\">\r\n      <article class=\"ps-faq-clean__item is-open\">\r\n        <button class=\"ps-faq-clean__trigger\" type=\"button\" aria-expanded=\"true\">\r\n          <span class=\"ps-faq-clean__question\">How much does a plumber in Porto cost?<\/span>\r\n          <span class=\"ps-faq-clean__toggle\" aria-hidden=\"true\"><\/span>\r\n        <\/button>\r\n        <div class=\"ps-faq-clean__answer\">\r\n          <div class=\"ps-faq-clean__answer-inner\">\r\n            <p>The cost of a plumber in Porto depends on the type of fault, the urgency, the time required, and whether any parts are needed. A simple repair, such as fixing a dripping tap or a running toilet, usually costs less than a hidden leak or a more serious blockage. For a clearer estimate, it helps to describe the issue and your area in Porto.<\/p>\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n\r\n      <article class=\"ps-faq-clean__item\">\r\n        <button class=\"ps-faq-clean__trigger\" type=\"button\" aria-expanded=\"false\">\r\n          <span class=\"ps-faq-clean__question\">When should I call a plumber in Porto urgently?<\/span>\r\n          <span class=\"ps-faq-clean__toggle\" aria-hidden=\"true\"><\/span>\r\n        <\/button>\r\n        <div class=\"ps-faq-clean__answer\">\r\n          <div class=\"ps-faq-clean__answer-inner\">\r\n            <p>You should call a plumber in Porto urgently when water is leaking without stopping, damp is spreading, the toilet will not drain, wastewater is backing up, or there is a risk of damage to floors, walls, or the neighbour\u2019s ceiling. Acting early usually helps reduce damage and repair costs.<\/p>\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n\r\n      <article class=\"ps-faq-clean__item\">\r\n        <button class=\"ps-faq-clean__trigger\" type=\"button\" aria-expanded=\"false\">\r\n          <span class=\"ps-faq-clean__question\">What services does a plumber in Porto provide?<\/span>\r\n          <span class=\"ps-faq-clean__toggle\" aria-hidden=\"true\"><\/span>\r\n        <\/button>\r\n        <div class=\"ps-faq-clean__answer\">\r\n          <div class=\"ps-faq-clean__answer-inner\">\r\n            <p>A plumber in Porto can deal with leaks, blockages, dripping taps, running toilets, low water pressure, blocked traps, bad smells, water heater issues, and other common plumbing faults. <a href=\"https:\/\/prontosolucoes.pt\/\">Pronto Solu\u00e7\u00f5es<\/a> handles both small repairs and urgent plumbing problems in apartments, houses, and commercial spaces.<\/p>\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n\r\n      <div class=\"ps-faq-clean__extras\">\r\n        <article class=\"ps-faq-clean__item ps-faq-clean__item--extra\">\r\n          <button class=\"ps-faq-clean__trigger\" type=\"button\" aria-expanded=\"false\">\r\n            <span class=\"ps-faq-clean__question\">Does a plumber in Porto deal with blockages, leaks, and toilets?<\/span>\r\n            <span class=\"ps-faq-clean__toggle\" aria-hidden=\"true\"><\/span>\r\n          <\/button>\r\n          <div class=\"ps-faq-clean__answer\">\r\n            <div class=\"ps-faq-clean__answer-inner\">\r\n              <p>Yes, a plumber in Porto deals with <a href=\"https:\/\/prontosolucoes.pt\/desentupimento-no-porto\">blocked drains and blockages<\/a>, water leaks, and toilet faults. These are some of the most common problems in homes and apartments in Porto, especially in older buildings where the plumbing system may already be showing signs of wear.<\/p>\r\n            <\/div>\r\n          <\/div>\r\n        <\/article>\r\n\r\n      <article class=\"ps-faq-clean__item ps-faq-clean__item--extra\">\r\n        <button class=\"ps-faq-clean__trigger\" type=\"button\" aria-expanded=\"false\">\r\n          <span class=\"ps-faq-clean__question\">How quickly can a plumber in Porto arrive?<\/span>\r\n          <span class=\"ps-faq-clean__toggle\" aria-hidden=\"true\"><\/span>\r\n        <\/button>\r\n        <div class=\"ps-faq-clean__answer\">\r\n          <div class=\"ps-faq-clean__answer-inner\">\r\n            <p>The arrival time of a plumber in Porto depends on your location, traffic, team availability, and how urgent the situation is. Whenever possible, urgent requests in Porto and nearby areas are prioritised to reduce the risk of greater damage.<\/p>\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n\r\n      <article class=\"ps-faq-clean__item ps-faq-clean__item--extra\">\r\n        <button class=\"ps-faq-clean__trigger\" type=\"button\" aria-expanded=\"false\">\r\n          <span class=\"ps-faq-clean__question\">Does a plumber in Porto work in older apartments?<\/span>\r\n          <span class=\"ps-faq-clean__toggle\" aria-hidden=\"true\"><\/span>\r\n        <\/button>\r\n        <div class=\"ps-faq-clean__answer\">\r\n          <div class=\"ps-faq-clean__answer-inner\">\r\n            <p>Yes, a plumber in Porto often works in older apartments, where worn pipes, ageing connections, low pressure, and recurring blockages are common. In older Porto buildings, it is especially important to understand whether the issue is isolated or linked to the wider system.<\/p>\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n\r\n      <article class=\"ps-faq-clean__item ps-faq-clean__item--extra\">\r\n        <button class=\"ps-faq-clean__trigger\" type=\"button\" aria-expanded=\"false\">\r\n          <span class=\"ps-faq-clean__question\">What are the signs that I need a plumber in Porto?<\/span>\r\n          <span class=\"ps-faq-clean__toggle\" aria-hidden=\"true\"><\/span>\r\n        <\/button>\r\n        <div class=\"ps-faq-clean__answer\">\r\n          <div class=\"ps-faq-clean__answer-inner\">\r\n            <p>The most common signs that you need a plumber in Porto are water leaking where it should not, slow drains, sewage smells, dripping taps, a toilet that keeps running, and damp marks on walls or ceilings. Even when the issue looks small, it is better to solve it early.<\/p>\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n\r\n      <article class=\"ps-faq-clean__item ps-faq-clean__item--extra\">\r\n        <button class=\"ps-faq-clean__trigger\" type=\"button\" aria-expanded=\"false\">\r\n          <span class=\"ps-faq-clean__question\">What should I do before a plumber in Porto arrives?<\/span>\r\n          <span class=\"ps-faq-clean__toggle\" aria-hidden=\"true\"><\/span>\r\n        <\/button>\r\n        <div class=\"ps-faq-clean__answer\">\r\n          <div class=\"ps-faq-clean__answer-inner\">\r\n            <p>Before a plumber in Porto arrives, try to shut off the water to the affected area or close the main valve, move items away from the area, and dry excess water if it is safe to do so. It also helps to take a photo or video of the problem to speed up the first assessment. For public water and wastewater information in Porto, you can also consult <a href=\"https:\/\/aguasdoporto.pt\/\" target=\"_blank\" rel=\"noopener\">\u00c1guas e Energia do Porto<\/a>.<\/p>\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n\r\n      <article class=\"ps-faq-clean__item ps-faq-clean__item--extra\">\r\n        <button class=\"ps-faq-clean__trigger\" type=\"button\" aria-expanded=\"false\">\r\n          <span class=\"ps-faq-clean__question\">Why does the same pipe keep getting blocked?<\/span>\r\n          <span class=\"ps-faq-clean__toggle\" aria-hidden=\"true\"><\/span>\r\n        <\/button>\r\n        <div class=\"ps-faq-clean__answer\">\r\n          <div class=\"ps-faq-clean__answer-inner\">\r\n            <p>When the same pipe keeps getting blocked, there is usually an underlying cause such as grease buildup, trapped debris, poor pipe slope, old pipework, or incorrect use of the drain. In those cases, it is not enough to relieve the symptom, the cause needs to be identified properly.<\/p>\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n\r\n        <article class=\"ps-faq-clean__item ps-faq-clean__item--extra\">\r\n          <button class=\"ps-faq-clean__trigger\" type=\"button\" aria-expanded=\"false\">\r\n            <span class=\"ps-faq-clean__question\">Do I need a plumber or an electrician?<\/span>\r\n            <span class=\"ps-faq-clean__toggle\" aria-hidden=\"true\"><\/span>\r\n          <\/button>\r\n          <div class=\"ps-faq-clean__answer\">\r\n            <div class=\"ps-faq-clean__answer-inner\">\r\n              <p>If the problem involves leaks, pipes, toilets, taps, water pressure, or blocked drains, you usually need a plumber in Porto. If the issue involves sockets, circuit breakers, lighting, power loss, or the electrical panel, you may need an <a href=\"https:\/\/prontosolucoes.pt\/electrician-in-porto\/\">electrician in Porto<\/a> instead.<\/p>\r\n            <\/div>\r\n          <\/div>\r\n        <\/article>\r\n        \r\n        <article class=\"ps-faq-clean__item ps-faq-clean__item--extra\">\r\n          <button class=\"ps-faq-clean__trigger\" type=\"button\" aria-expanded=\"false\">\r\n            <span class=\"ps-faq-clean__question\">Can I ask for an estimate before calling a plumber in Porto?<\/span>\r\n            <span class=\"ps-faq-clean__toggle\" aria-hidden=\"true\"><\/span>\r\n          <\/button>\r\n          <div class=\"ps-faq-clean__answer\">\r\n            <div class=\"ps-faq-clean__answer-inner\">\r\n              <p>Yes, you can ask for an indication before calling a plumber in Porto, especially if you can explain the issue clearly or send photos. In some situations, the final cost can only be confirmed after the fault is inspected on site, particularly when the cause is hidden.<\/p>\r\n            <\/div>\r\n          <\/div>\r\n        <\/article>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"ps-faq-clean__footer\">\r\n      <button class=\"ps-faq-clean__more\" type=\"button\" aria-expanded=\"false\">View more questions<\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n  var sections = document.querySelectorAll(\".ps-faq-clean\");\r\n\r\n  sections.forEach(function (section) {\r\n    var items = Array.from(section.querySelectorAll(\".ps-faq-clean__item\"));\r\n    var extraItems = Array.from(section.querySelectorAll(\".ps-faq-clean__item--extra\"));\r\n    var extrasWrap = section.querySelector(\".ps-faq-clean__extras\");\r\n    var moreButton = section.querySelector(\".ps-faq-clean__more\");\r\n    var expanded = false;\r\n\r\n    function closeAllItems() {\r\n      items.forEach(function (item) {\r\n        item.classList.remove(\"is-open\");\r\n\r\n        var trigger = item.querySelector(\".ps-faq-clean__trigger\");\r\n        if (trigger) {\r\n          trigger.setAttribute(\"aria-expanded\", \"false\");\r\n        }\r\n      });\r\n    }\r\n\r\n    function syncMoreButton() {\r\n      if (!moreButton) return;\r\n\r\n      if (extraItems.length === 0 || expanded) {\r\n        moreButton.hidden = true;\r\n        return;\r\n      }\r\n\r\n      moreButton.hidden = false;\r\n      moreButton.textContent = \"View more questions\";\r\n      moreButton.setAttribute(\"aria-expanded\", \"false\");\r\n    }\r\n\r\n    items.forEach(function (item) {\r\n      var trigger = item.querySelector(\".ps-faq-clean__trigger\");\r\n\r\n      if (!trigger) return;\r\n\r\n      trigger.addEventListener(\"click\", function () {\r\n        var isOpen = item.classList.contains(\"is-open\");\r\n\r\n        closeAllItems();\r\n\r\n        if (!isOpen) {\r\n          item.classList.add(\"is-open\");\r\n          trigger.setAttribute(\"aria-expanded\", \"true\");\r\n        }\r\n      });\r\n    });\r\n\r\n    if (moreButton && extrasWrap) {\r\n      moreButton.addEventListener(\"click\", function () {\r\n        if (expanded) return;\r\n\r\n        expanded = true;\r\n        extrasWrap.classList.add(\"is-open\");\r\n        moreButton.style.display = \"none\";\r\n      });\r\n    }\r\n\r\n    if (extrasWrap) {\r\n      extrasWrap.classList.remove(\"is-open\");\r\n    }\r\n\r\n    syncMoreButton();\r\n  });\r\n});\r\n<\/script>\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-dfab8a1 e-con-full e-flex e-con e-parent\" data-id=\"dfab8a1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2af2b80 elementor-widget elementor-widget-html\" data-id=\"2af2b80\" 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>\r\n  body .elementor-widget-html:has([data-cta=\"final-call\"]),\r\n  body .elementor-widget-html:has([data-cta=\"final-call\"]) > .elementor-widget-container,\r\n  body .e-con:has([data-cta=\"final-call\"]),\r\n  body .e-con-inner:has([data-cta=\"final-call\"]) {\r\n    --padding-top: 0px !important;\r\n    --padding-right: 0px !important;\r\n    --padding-bottom: 0px !important;\r\n    --padding-left: 0px !important;\r\n    --gap: 0px !important;\r\n    margin: 0 !important;\r\n    padding: 0 !important;\r\n    gap: 0 !important;\r\n    background: #0E0D0B !important;\r\n  }\r\n  section:has([data-cta=\"final-call\"]) {\r\n    box-sizing: border-box;\r\n    width: 100%;\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    background: #0E0D0B;\r\n    overflow: hidden;\r\n    font-family: \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n  }\r\n\r\n  section:has([data-cta=\"final-call\"]) * {\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  section:has([data-cta=\"final-call\"]) > div:first-of-type {\r\n    min-width: 0;\r\n    padding: 18px 38px 28px;\r\n    display: flex;\r\n    flex-direction: column;\r\n    justify-content: center;\r\n    color: #FFFFFF;\r\n  }\r\n\r\n  section:has([data-cta=\"final-call\"]) > div:first-of-type > h2 {\r\n    margin: 0;\r\n    color: #FFFFFF;\r\n    font-family: \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n    font-size: 40px;\r\n    font-weight: 700;\r\n    line-height: 1.08;\r\n    letter-spacing: -0.02em;\r\n  }\r\n\r\n  section:has([data-cta=\"final-call\"]) > div:first-of-type > p:first-of-type {\r\n    margin: 42px 0 0;\r\n    color: #FFFFFF;\r\n    font-size: 18px;\r\n    font-weight: 700;\r\n    line-height: 1.65;\r\n  }\r\n\r\n  section:has([data-cta=\"final-call\"]) > div:first-of-type > p:first-of-type strong {\r\n    font-weight: 800;\r\n  }\r\n\r\n  section:has([data-cta=\"final-call\"]) > div:first-of-type > p:first-of-type em {\r\n    font-style: italic;\r\n  }\r\n\r\n  section:has([data-cta=\"final-call\"]) > div:first-of-type > p:last-of-type {\r\n    margin: 22px 0 0;\r\n    color: #FFFFFF;\r\n    font-size: 16px;\r\n    font-weight: 700;\r\n    line-height: 1.5;\r\n  }\r\n\r\n  section:has([data-cta=\"final-call\"]) .pronto-final-button-html {\r\n    margin-top: 40px;\r\n    text-align: center;\r\n  }\r\n\r\n  .pronto-final-button-html .cta-final-call {\r\n    appearance: none;\r\n    box-sizing: border-box;\r\n    display: inline-block;\r\n    padding: 12px 24px;\r\n    border: 0;\r\n    border-radius: 14px;\r\n    background: #E1A134;\r\n    color: #FFFFFF;\r\n    fill: #FFFFFF;\r\n    font-family: \"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\r\n    font-size: 18px;\r\n    font-weight: 800;\r\n    line-height: 1;\r\n    text-align: center;\r\n    text-decoration: none;\r\n    cursor: pointer;\r\n    box-shadow: rgba(0, 0, 0, 0.5) 0px 0px 10px 0px;\r\n    transition: all 0.3s ease;\r\n  }\r\n\r\n  .pronto-final-button-html .cta-final-call:hover {\r\n    background: #D97706;\r\n    transform: scale(1.03);\r\n  }\r\n\r\n  .pronto-final-button-html .elementor-button-content-wrapper {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    gap: 8px;\r\n  }\r\n\r\n  .pronto-final-button-html .elementor-button-icon {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n  }\r\n\r\n  .pronto-final-button-html .elementor-button-icon svg {\r\n    width: 15px;\r\n    height: 15px;\r\n    fill: currentColor;\r\n  }\r\n\r\n  section:has([data-cta=\"final-call\"]) > div:last-of-type {\r\n    min-width: 0;\r\n    padding: 14px 28px 14px 0;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n  }\r\n\r\n  section:has([data-cta=\"final-call\"]) > div:last-of-type > img {\r\n    display: block;\r\n    width: 100%;\r\n    max-width: 470px;\r\n    height: auto;\r\n    border-radius: 16px;\r\n    object-fit: cover;\r\n  }\r\n\r\n  @media (max-width: 767px) {\r\n    section:has([data-cta=\"final-call\"]) {\r\n      display: block;\r\n    }\r\n\r\n    section:has([data-cta=\"final-call\"]) > div:first-of-type {\r\n      padding: 12px 24px 0;\r\n    }\r\n\r\n    section:has([data-cta=\"final-call\"]) > div:first-of-type > h2 {\r\n      font-size: 36px;\r\n      line-height: 1.18;\r\n      letter-spacing: -0.02em;\r\n      text-align: left;\r\n    }\r\n\r\n    section:has([data-cta=\"final-call\"]) > div:first-of-type > p:first-of-type {\r\n      margin-top: 42px;\r\n      font-size: 18px;\r\n      font-weight: 700;\r\n      line-height: 1.7;\r\n      text-align: left;\r\n    }\r\n\r\n    section:has([data-cta=\"final-call\"]) > div:first-of-type > p:last-of-type {\r\n      margin-top: 22px;\r\n      font-size: 16px;\r\n      font-weight: 700;\r\n      line-height: 1.5;\r\n      white-space: nowrap;\r\n      text-align: left;\r\n    }\r\n\r\n    section:has([data-cta=\"final-call\"]) .pronto-final-button-html {\r\n      margin-top: 40px;\r\n      text-align: center;\r\n    }\r\n\r\n    section:has([data-cta=\"final-call\"]) > div:last-of-type {\r\n      padding: 40px 24px 0;\r\n    }\r\n\r\n    section:has([data-cta=\"final-call\"]) > div:last-of-type > img {\r\n      width: 100%;\r\n      max-width: none;\r\n      height: auto;\r\n      border-radius: 12px;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<section>\r\n  <div>\r\n    <h2>\r\n      Need a Plumber in<br>\r\n      Porto Right Now?\r\n    <\/h2>\r\n\r\n    <p>\r\n      Fast, professional help <strong><em>24\/7<\/em><\/strong> in every Porto neighborhood\r\n    <\/p>\r\n\r\n    <p>\r\n      NO HIDDEN FEES, NO HASSLE\r\n    <\/p>\r\n\r\n    <div class=\"pronto-final-button-html\">\r\n      <button\r\n        type=\"button\"\r\n        class=\"cta-final-call pronto-precall pp-service-plumbing\"\r\n        data-cta=\"final-call\"\r\n      >\r\n        <span class=\"elementor-button-content-wrapper\">\r\n          <span class=\"elementor-button-icon\">\r\n            <svg\r\n              aria-hidden=\"true\"\r\n              class=\"e-font-icon-svg e-far-arrow-alt-circle-right\"\r\n              viewBox=\"0 0 512 512\"\r\n              xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\r\n            >\r\n              <path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path>\r\n            <\/svg>\r\n          <\/span>\r\n\r\n          <span class=\"elementor-button-text\">\r\n            Plumbing Help\r\n          <\/span>\r\n        <\/span>\r\n      <\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div>\r\n    <img decoding=\"async\"\r\n      src=\"https:\/\/prontosolucoes.pt\/wp-content\/uploads\/2026\/04\/pronto-technicians-network-footer.webp\"\r\n      alt=\"equipa t\u00e9cnica canaliza\u00e7\u00e3o e eletricidade Porto pronto solu\u00e7\u00f5es rede t\u00e9cnicos profissionais\"\r\n    >\r\n  <\/div>\r\n<\/section>\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":"<p>24h Plumbing Repairs in Porto Fast help for leaks, blocked drains, toilets, sinks and other urgent plumbing issues in Porto. What do you need help with? How can we help? Zip Code Get Help Now \u2192 Need Help Fast? We&#8217;ve Got You Covered Certified plumber in Porto ready when you need them 24h Drain Unblocking [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2801,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2057","page","type-page","status-publish","has-post-thumbnail","hentry"],"blocksy_meta":{"has_hero_section":"disabled","styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8},"content_style_source":"inherit","content_style":"wide","vertical_spacing_source":"custom","content_area_spacing":"none"},"_links":{"self":[{"href":"https:\/\/prontosolucoes.pt\/pt\/wp-json\/wp\/v2\/pages\/2057","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prontosolucoes.pt\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/prontosolucoes.pt\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/prontosolucoes.pt\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prontosolucoes.pt\/pt\/wp-json\/wp\/v2\/comments?post=2057"}],"version-history":[{"count":14,"href":"https:\/\/prontosolucoes.pt\/pt\/wp-json\/wp\/v2\/pages\/2057\/revisions"}],"predecessor-version":[{"id":7718,"href":"https:\/\/prontosolucoes.pt\/pt\/wp-json\/wp\/v2\/pages\/2057\/revisions\/7718"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prontosolucoes.pt\/pt\/wp-json\/wp\/v2\/media\/2801"}],"wp:attachment":[{"href":"https:\/\/prontosolucoes.pt\/pt\/wp-json\/wp\/v2\/media?parent=2057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}