{"id":15,"date":"2026-08-11T21:07:48","date_gmt":"2026-08-11T21:07:48","guid":{"rendered":"https:\/\/bestplacestosurfing.com\/?page_id=15"},"modified":"2026-08-18T18:42:57","modified_gmt":"2026-08-18T18:42:57","slug":"home","status":"publish","type":"page","link":"https:\/\/bestplacestosurfing.com\/fr\/","title":{"rendered":"home"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"15\" class=\"elementor elementor-15\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8231049 e-flex e-con-boxed e-con e-parent\" data-id=\"8231049\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a206270 elementor-widget elementor-widget-shortcode\" data-id=\"a206270\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">        <div id=\"bpts-trip-14633\" class=\"bpts-trip-search\" data-destinations=\"https:\/\/bestplacestosurfing.com\/fr\/wp-json\/bpts-trip\/v1\/destinations\" data-spots=\"https:\/\/bestplacestosurfing.com\/fr\/wp-json\/bpts-trip\/v1\/spots\" data-forecast=\"https:\/\/bestplacestosurfing.com\/fr\/wp-json\/bpts-surf\/v1\/forecast\" data-today=\"2026-10-19\" data-airports=\"[{&quot;code&quot;:&quot;GVA&quot;,&quot;city&quot;:&quot;Geneva&quot;,&quot;country&quot;:&quot;Switzerland&quot;,&quot;label&quot;:&quot;Geneva (GVA)&quot;},{&quot;code&quot;:&quot;ZRH&quot;,&quot;city&quot;:&quot;Zurich&quot;,&quot;country&quot;:&quot;Switzerland&quot;,&quot;label&quot;:&quot;Zurich (ZRH)&quot;},{&quot;code&quot;:&quot;BSL&quot;,&quot;city&quot;:&quot;Basel&quot;,&quot;country&quot;:&quot;Switzerland&quot;,&quot;label&quot;:&quot;Basel (BSL)&quot;},{&quot;code&quot;:&quot;LHR&quot;,&quot;city&quot;:&quot;London Heathrow&quot;,&quot;country&quot;:&quot;United Kingdom&quot;,&quot;label&quot;:&quot;London Heathrow (LHR)&quot;},{&quot;code&quot;:&quot;LGW&quot;,&quot;city&quot;:&quot;London Gatwick&quot;,&quot;country&quot;:&quot;United Kingdom&quot;,&quot;label&quot;:&quot;London Gatwick (LGW)&quot;},{&quot;code&quot;:&quot;STN&quot;,&quot;city&quot;:&quot;London Stansted&quot;,&quot;country&quot;:&quot;United Kingdom&quot;,&quot;label&quot;:&quot;London Stansted (STN)&quot;},{&quot;code&quot;:&quot;MAN&quot;,&quot;city&quot;:&quot;Manchester&quot;,&quot;country&quot;:&quot;United Kingdom&quot;,&quot;label&quot;:&quot;Manchester (MAN)&quot;},{&quot;code&quot;:&quot;CDG&quot;,&quot;city&quot;:&quot;Paris Charles de Gaulle&quot;,&quot;country&quot;:&quot;France&quot;,&quot;label&quot;:&quot;Paris Charles de Gaulle (CDG)&quot;},{&quot;code&quot;:&quot;ORY&quot;,&quot;city&quot;:&quot;Paris Orly&quot;,&quot;country&quot;:&quot;France&quot;,&quot;label&quot;:&quot;Paris Orly (ORY)&quot;},{&quot;code&quot;:&quot;BOD&quot;,&quot;city&quot;:&quot;Bordeaux&quot;,&quot;country&quot;:&quot;France&quot;,&quot;label&quot;:&quot;Bordeaux (BOD)&quot;},{&quot;code&quot;:&quot;BIQ&quot;,&quot;city&quot;:&quot;Biarritz&quot;,&quot;country&quot;:&quot;France&quot;,&quot;label&quot;:&quot;Biarritz (BIQ)&quot;},{&quot;code&quot;:&quot;NCE&quot;,&quot;city&quot;:&quot;Nice&quot;,&quot;country&quot;:&quot;France&quot;,&quot;label&quot;:&quot;Nice (NCE)&quot;},{&quot;code&quot;:&quot;LYS&quot;,&quot;city&quot;:&quot;Lyon&quot;,&quot;country&quot;:&quot;France&quot;,&quot;label&quot;:&quot;Lyon (LYS)&quot;},{&quot;code&quot;:&quot;MRS&quot;,&quot;city&quot;:&quot;Marseille&quot;,&quot;country&quot;:&quot;France&quot;,&quot;label&quot;:&quot;Marseille (MRS)&quot;},{&quot;code&quot;:&quot;LIS&quot;,&quot;city&quot;:&quot;Lisbon&quot;,&quot;country&quot;:&quot;Portugal&quot;,&quot;label&quot;:&quot;Lisbon (LIS)&quot;},{&quot;code&quot;:&quot;OPO&quot;,&quot;city&quot;:&quot;Porto&quot;,&quot;country&quot;:&quot;Portugal&quot;,&quot;label&quot;:&quot;Porto (OPO)&quot;},{&quot;code&quot;:&quot;FAO&quot;,&quot;city&quot;:&quot;Faro&quot;,&quot;country&quot;:&quot;Portugal&quot;,&quot;label&quot;:&quot;Faro (FAO)&quot;},{&quot;code&quot;:&quot;MAD&quot;,&quot;city&quot;:&quot;Madrid&quot;,&quot;country&quot;:&quot;Spain&quot;,&quot;label&quot;:&quot;Madrid (MAD)&quot;},{&quot;code&quot;:&quot;BCN&quot;,&quot;city&quot;:&quot;Barcelona&quot;,&quot;country&quot;:&quot;Spain&quot;,&quot;label&quot;:&quot;Barcelona (BCN)&quot;},{&quot;code&quot;:&quot;BIO&quot;,&quot;city&quot;:&quot;Bilbao&quot;,&quot;country&quot;:&quot;Spain&quot;,&quot;label&quot;:&quot;Bilbao (BIO)&quot;},{&quot;code&quot;:&quot;SVQ&quot;,&quot;city&quot;:&quot;Seville&quot;,&quot;country&quot;:&quot;Spain&quot;,&quot;label&quot;:&quot;Seville (SVQ)&quot;},{&quot;code&quot;:&quot;AGP&quot;,&quot;city&quot;:&quot;Malaga&quot;,&quot;country&quot;:&quot;Spain&quot;,&quot;label&quot;:&quot;Malaga (AGP)&quot;},{&quot;code&quot;:&quot;LPA&quot;,&quot;city&quot;:&quot;Gran Canaria&quot;,&quot;country&quot;:&quot;Spain&quot;,&quot;label&quot;:&quot;Gran Canaria (LPA)&quot;},{&quot;code&quot;:&quot;TFS&quot;,&quot;city&quot;:&quot;Tenerife South&quot;,&quot;country&quot;:&quot;Spain&quot;,&quot;label&quot;:&quot;Tenerife South (TFS)&quot;},{&quot;code&quot;:&quot;ACE&quot;,&quot;city&quot;:&quot;Lanzarote&quot;,&quot;country&quot;:&quot;Spain&quot;,&quot;label&quot;:&quot;Lanzarote (ACE)&quot;},{&quot;code&quot;:&quot;FUE&quot;,&quot;city&quot;:&quot;Fuerteventura&quot;,&quot;country&quot;:&quot;Spain&quot;,&quot;label&quot;:&quot;Fuerteventura (FUE)&quot;},{&quot;code&quot;:&quot;AGA&quot;,&quot;city&quot;:&quot;Agadir&quot;,&quot;country&quot;:&quot;Morocco&quot;,&quot;label&quot;:&quot;Agadir (AGA)&quot;},{&quot;code&quot;:&quot;RAK&quot;,&quot;city&quot;:&quot;Marrakech&quot;,&quot;country&quot;:&quot;Morocco&quot;,&quot;label&quot;:&quot;Marrakech (RAK)&quot;},{&quot;code&quot;:&quot;CMN&quot;,&quot;city&quot;:&quot;Casablanca&quot;,&quot;country&quot;:&quot;Morocco&quot;,&quot;label&quot;:&quot;Casablanca (CMN)&quot;},{&quot;code&quot;:&quot;ESU&quot;,&quot;city&quot;:&quot;Essaouira&quot;,&quot;country&quot;:&quot;Morocco&quot;,&quot;label&quot;:&quot;Essaouira (ESU)&quot;},{&quot;code&quot;:&quot;AMS&quot;,&quot;city&quot;:&quot;Amsterdam&quot;,&quot;country&quot;:&quot;Netherlands&quot;,&quot;label&quot;:&quot;Amsterdam (AMS)&quot;},{&quot;code&quot;:&quot;BRU&quot;,&quot;city&quot;:&quot;Brussels&quot;,&quot;country&quot;:&quot;Belgium&quot;,&quot;label&quot;:&quot;Brussels (BRU)&quot;},{&quot;code&quot;:&quot;FRA&quot;,&quot;city&quot;:&quot;Frankfurt&quot;,&quot;country&quot;:&quot;Germany&quot;,&quot;label&quot;:&quot;Frankfurt (FRA)&quot;},{&quot;code&quot;:&quot;MUC&quot;,&quot;city&quot;:&quot;Munich&quot;,&quot;country&quot;:&quot;Germany&quot;,&quot;label&quot;:&quot;Munich (MUC)&quot;},{&quot;code&quot;:&quot;BER&quot;,&quot;city&quot;:&quot;Berlin&quot;,&quot;country&quot;:&quot;Germany&quot;,&quot;label&quot;:&quot;Berlin (BER)&quot;},{&quot;code&quot;:&quot;HAM&quot;,&quot;city&quot;:&quot;Hamburg&quot;,&quot;country&quot;:&quot;Germany&quot;,&quot;label&quot;:&quot;Hamburg (HAM)&quot;},{&quot;code&quot;:&quot;DUS&quot;,&quot;city&quot;:&quot;Dusseldorf&quot;,&quot;country&quot;:&quot;Germany&quot;,&quot;label&quot;:&quot;Dusseldorf (DUS)&quot;},{&quot;code&quot;:&quot;MXP&quot;,&quot;city&quot;:&quot;Milan Malpensa&quot;,&quot;country&quot;:&quot;Italy&quot;,&quot;label&quot;:&quot;Milan Malpensa (MXP)&quot;},{&quot;code&quot;:&quot;LIN&quot;,&quot;city&quot;:&quot;Milan Linate&quot;,&quot;country&quot;:&quot;Italy&quot;,&quot;label&quot;:&quot;Milan Linate (LIN)&quot;},{&quot;code&quot;:&quot;FCO&quot;,&quot;city&quot;:&quot;Rome Fiumicino&quot;,&quot;country&quot;:&quot;Italy&quot;,&quot;label&quot;:&quot;Rome Fiumicino (FCO)&quot;},{&quot;code&quot;:&quot;VCE&quot;,&quot;city&quot;:&quot;Venice&quot;,&quot;country&quot;:&quot;Italy&quot;,&quot;label&quot;:&quot;Venice (VCE)&quot;},{&quot;code&quot;:&quot;NAP&quot;,&quot;city&quot;:&quot;Naples&quot;,&quot;country&quot;:&quot;Italy&quot;,&quot;label&quot;:&quot;Naples (NAP)&quot;},{&quot;code&quot;:&quot;CPH&quot;,&quot;city&quot;:&quot;Copenhagen&quot;,&quot;country&quot;:&quot;Denmark&quot;,&quot;label&quot;:&quot;Copenhagen (CPH)&quot;},{&quot;code&quot;:&quot;OSL&quot;,&quot;city&quot;:&quot;Oslo&quot;,&quot;country&quot;:&quot;Norway&quot;,&quot;label&quot;:&quot;Oslo (OSL)&quot;},{&quot;code&quot;:&quot;ARN&quot;,&quot;city&quot;:&quot;Stockholm&quot;,&quot;country&quot;:&quot;Sweden&quot;,&quot;label&quot;:&quot;Stockholm (ARN)&quot;},{&quot;code&quot;:&quot;DUB&quot;,&quot;city&quot;:&quot;Dublin&quot;,&quot;country&quot;:&quot;Ireland&quot;,&quot;label&quot;:&quot;Dublin (DUB)&quot;},{&quot;code&quot;:&quot;VIE&quot;,&quot;city&quot;:&quot;Vienna&quot;,&quot;country&quot;:&quot;Austria&quot;,&quot;label&quot;:&quot;Vienna (VIE)&quot;},{&quot;code&quot;:&quot;PRG&quot;,&quot;city&quot;:&quot;Prague&quot;,&quot;country&quot;:&quot;Czech Republic&quot;,&quot;label&quot;:&quot;Prague (PRG)&quot;},{&quot;code&quot;:&quot;WAW&quot;,&quot;city&quot;:&quot;Warsaw&quot;,&quot;country&quot;:&quot;Poland&quot;,&quot;label&quot;:&quot;Warsaw (WAW)&quot;},{&quot;code&quot;:&quot;ATH&quot;,&quot;city&quot;:&quot;Athens&quot;,&quot;country&quot;:&quot;Greece&quot;,&quot;label&quot;:&quot;Athens (ATH)&quot;},{&quot;code&quot;:&quot;IST&quot;,&quot;city&quot;:&quot;Istanbul&quot;,&quot;country&quot;:&quot;Turkey&quot;,&quot;label&quot;:&quot;Istanbul (IST)&quot;},{&quot;code&quot;:&quot;DXB&quot;,&quot;city&quot;:&quot;Dubai&quot;,&quot;country&quot;:&quot;United Arab Emirates&quot;,&quot;label&quot;:&quot;Dubai (DXB)&quot;},{&quot;code&quot;:&quot;DOH&quot;,&quot;city&quot;:&quot;Doha&quot;,&quot;country&quot;:&quot;Qatar&quot;,&quot;label&quot;:&quot;Doha (DOH)&quot;},{&quot;code&quot;:&quot;JFK&quot;,&quot;city&quot;:&quot;New York JFK&quot;,&quot;country&quot;:&quot;United States&quot;,&quot;label&quot;:&quot;New York JFK (JFK)&quot;},{&quot;code&quot;:&quot;EWR&quot;,&quot;city&quot;:&quot;Newark&quot;,&quot;country&quot;:&quot;United States&quot;,&quot;label&quot;:&quot;Newark (EWR)&quot;},{&quot;code&quot;:&quot;LAX&quot;,&quot;city&quot;:&quot;Los Angeles&quot;,&quot;country&quot;:&quot;United States&quot;,&quot;label&quot;:&quot;Los Angeles (LAX)&quot;},{&quot;code&quot;:&quot;SFO&quot;,&quot;city&quot;:&quot;San Francisco&quot;,&quot;country&quot;:&quot;United States&quot;,&quot;label&quot;:&quot;San Francisco (SFO)&quot;},{&quot;code&quot;:&quot;MIA&quot;,&quot;city&quot;:&quot;Miami&quot;,&quot;country&quot;:&quot;United States&quot;,&quot;label&quot;:&quot;Miami (MIA)&quot;},{&quot;code&quot;:&quot;BOS&quot;,&quot;city&quot;:&quot;Boston&quot;,&quot;country&quot;:&quot;United States&quot;,&quot;label&quot;:&quot;Boston (BOS)&quot;},{&quot;code&quot;:&quot;HNL&quot;,&quot;city&quot;:&quot;Honolulu&quot;,&quot;country&quot;:&quot;United States&quot;,&quot;label&quot;:&quot;Honolulu (HNL)&quot;},{&quot;code&quot;:&quot;YVR&quot;,&quot;city&quot;:&quot;Vancouver&quot;,&quot;country&quot;:&quot;Canada&quot;,&quot;label&quot;:&quot;Vancouver (YVR)&quot;},{&quot;code&quot;:&quot;YYZ&quot;,&quot;city&quot;:&quot;Toronto&quot;,&quot;country&quot;:&quot;Canada&quot;,&quot;label&quot;:&quot;Toronto (YYZ)&quot;},{&quot;code&quot;:&quot;MEX&quot;,&quot;city&quot;:&quot;Mexico City&quot;,&quot;country&quot;:&quot;Mexico&quot;,&quot;label&quot;:&quot;Mexico City (MEX)&quot;},{&quot;code&quot;:&quot;CUN&quot;,&quot;city&quot;:&quot;Cancun&quot;,&quot;country&quot;:&quot;Mexico&quot;,&quot;label&quot;:&quot;Cancun (CUN)&quot;},{&quot;code&quot;:&quot;SJO&quot;,&quot;city&quot;:&quot;San Jose&quot;,&quot;country&quot;:&quot;Costa Rica&quot;,&quot;label&quot;:&quot;San Jose (SJO)&quot;},{&quot;code&quot;:&quot;LIR&quot;,&quot;city&quot;:&quot;Liberia&quot;,&quot;country&quot;:&quot;Costa Rica&quot;,&quot;label&quot;:&quot;Liberia (LIR)&quot;},{&quot;code&quot;:&quot;PTY&quot;,&quot;city&quot;:&quot;Panama City&quot;,&quot;country&quot;:&quot;Panama&quot;,&quot;label&quot;:&quot;Panama City (PTY)&quot;},{&quot;code&quot;:&quot;LIM&quot;,&quot;city&quot;:&quot;Lima&quot;,&quot;country&quot;:&quot;Peru&quot;,&quot;label&quot;:&quot;Lima (LIM)&quot;},{&quot;code&quot;:&quot;SCL&quot;,&quot;city&quot;:&quot;Santiago&quot;,&quot;country&quot;:&quot;Chile&quot;,&quot;label&quot;:&quot;Santiago (SCL)&quot;},{&quot;code&quot;:&quot;EZE&quot;,&quot;city&quot;:&quot;Buenos Aires&quot;,&quot;country&quot;:&quot;Argentina&quot;,&quot;label&quot;:&quot;Buenos Aires (EZE)&quot;},{&quot;code&quot;:&quot;GRU&quot;,&quot;city&quot;:&quot;Sao Paulo&quot;,&quot;country&quot;:&quot;Brazil&quot;,&quot;label&quot;:&quot;Sao Paulo (GRU)&quot;},{&quot;code&quot;:&quot;GIG&quot;,&quot;city&quot;:&quot;Rio de Janeiro&quot;,&quot;country&quot;:&quot;Brazil&quot;,&quot;label&quot;:&quot;Rio de Janeiro (GIG)&quot;},{&quot;code&quot;:&quot;DPS&quot;,&quot;city&quot;:&quot;Bali Denpasar&quot;,&quot;country&quot;:&quot;Indonesia&quot;,&quot;label&quot;:&quot;Bali Denpasar (DPS)&quot;},{&quot;code&quot;:&quot;CGK&quot;,&quot;city&quot;:&quot;Jakarta&quot;,&quot;country&quot;:&quot;Indonesia&quot;,&quot;label&quot;:&quot;Jakarta (CGK)&quot;},{&quot;code&quot;:&quot;SIN&quot;,&quot;city&quot;:&quot;Singapore&quot;,&quot;country&quot;:&quot;Singapore&quot;,&quot;label&quot;:&quot;Singapore (SIN)&quot;},{&quot;code&quot;:&quot;BKK&quot;,&quot;city&quot;:&quot;Bangkok&quot;,&quot;country&quot;:&quot;Thailand&quot;,&quot;label&quot;:&quot;Bangkok (BKK)&quot;},{&quot;code&quot;:&quot;HKT&quot;,&quot;city&quot;:&quot;Phuket&quot;,&quot;country&quot;:&quot;Thailand&quot;,&quot;label&quot;:&quot;Phuket (HKT)&quot;},{&quot;code&quot;:&quot;MNL&quot;,&quot;city&quot;:&quot;Manila&quot;,&quot;country&quot;:&quot;Philippines&quot;,&quot;label&quot;:&quot;Manila (MNL)&quot;},{&quot;code&quot;:&quot;NRT&quot;,&quot;city&quot;:&quot;Tokyo Narita&quot;,&quot;country&quot;:&quot;Japan&quot;,&quot;label&quot;:&quot;Tokyo Narita (NRT)&quot;},{&quot;code&quot;:&quot;HND&quot;,&quot;city&quot;:&quot;Tokyo Haneda&quot;,&quot;country&quot;:&quot;Japan&quot;,&quot;label&quot;:&quot;Tokyo Haneda (HND)&quot;},{&quot;code&quot;:&quot;SYD&quot;,&quot;city&quot;:&quot;Sydney&quot;,&quot;country&quot;:&quot;Australia&quot;,&quot;label&quot;:&quot;Sydney (SYD)&quot;},{&quot;code&quot;:&quot;MEL&quot;,&quot;city&quot;:&quot;Melbourne&quot;,&quot;country&quot;:&quot;Australia&quot;,&quot;label&quot;:&quot;Melbourne (MEL)&quot;},{&quot;code&quot;:&quot;BNE&quot;,&quot;city&quot;:&quot;Brisbane&quot;,&quot;country&quot;:&quot;Australia&quot;,&quot;label&quot;:&quot;Brisbane (BNE)&quot;},{&quot;code&quot;:&quot;PER&quot;,&quot;city&quot;:&quot;Perth&quot;,&quot;country&quot;:&quot;Australia&quot;,&quot;label&quot;:&quot;Perth (PER)&quot;},{&quot;code&quot;:&quot;AKL&quot;,&quot;city&quot;:&quot;Auckland&quot;,&quot;country&quot;:&quot;New Zealand&quot;,&quot;label&quot;:&quot;Auckland (AKL)&quot;},{&quot;code&quot;:&quot;CPT&quot;,&quot;city&quot;:&quot;Cape Town&quot;,&quot;country&quot;:&quot;South Africa&quot;,&quot;label&quot;:&quot;Cape Town (CPT)&quot;},{&quot;code&quot;:&quot;JNB&quot;,&quot;city&quot;:&quot;Johannesburg&quot;,&quot;country&quot;:&quot;South Africa&quot;,&quot;label&quot;:&quot;Johannesburg (JNB)&quot;}]\" data-results-page=\"0\" data-results-page-url=\"https:\/\/bestplacestosurfing.com\/fr\/surf-trip\/\">\n            <style>\n                #bpts-trip-14633{--bpts-ink:#090909;--bpts-muted:#777;--bpts-line:#e7e7e7;--bpts-soft:#f4f4f4;--bpts-blue:#4353CC;--bpts-hero-image:linear-gradient(135deg,#0b2336 0%,#2f6d86 48%,#07131e 100%);--bpts-full-bleed-width:100%;--bpts-full-bleed-offset:0px;--bpts-vv-top:0px;--bpts-vv-left:0px;--bpts-vv-width:100%;--bpts-vv-height:100dvh;font-family:inherit;color:var(--bpts-ink);width:100%;max-width:100%;min-width:0;overflow:visible}\n                #bpts-trip-14633 *{box-sizing:border-box}\n                #bpts-trip-14633 .bpts-trip-hero{position:relative;width:var(--bpts-full-bleed-width);max-width:none;min-width:0;margin-left:var(--bpts-full-bleed-offset);padding:0 0 42px;border:0;background:#fff;overflow:visible}\n                #bpts-trip-14633 .bpts-trip-hero-media{position:relative;isolation:isolate;min-height:520px;display:flex;align-items:stretch;background-image:linear-gradient(90deg,rgba(3,12,20,.84) 0%,rgba(3,12,20,.57) 43%,rgba(3,12,20,.18) 74%,rgba(3,12,20,.3) 100%),var(--bpts-hero-image);background-position:center;background-size:cover;overflow:hidden}\n                #bpts-trip-14633.bpts-is-results-page .bpts-trip-hero{padding:30px 0;background:#f6f7f9}\n                #bpts-trip-14633.bpts-is-results-page .bpts-trip-hero-media{display:none}\n                #bpts-trip-14633.bpts-is-results-page .bpts-trip-hero>.bpts-search-shell{margin:0 auto;box-shadow:0 10px 34px rgba(16,24,40,.09)}\n                #bpts-trip-14633 .bpts-trip-hero-media:after{content:'';position:absolute;z-index:0;inset:auto -10% -48% 35%;height:75%;background:radial-gradient(ellipse at center,rgba(90,190,224,.28),rgba(90,190,224,0) 70%);pointer-events:none}\n                #bpts-trip-14633 .bpts-trip-hero-inner{position:relative;z-index:1;width:min(1640px,calc(100% - 96px));margin:0 auto;padding:92px 8px 120px;display:grid;grid-template-columns:minmax(0,820px) minmax(240px,390px);gap:60px;align-items:end;justify-content:space-between}\n                #bpts-trip-14633 .bpts-trip-hero-copy{color:#fff;max-width:820px;text-shadow:0 2px 20px rgba(0,0,0,.28)}\n                #bpts-trip-14633 .bpts-trip-hero-eyebrow{margin:0 0 16px;font-size:12px;line-height:1;font-weight:900;letter-spacing:.16em;text-transform:uppercase;color:#fff}\n                #bpts-trip-14633 .bpts-trip-hero-title{margin:0;color:#fff;font-size:clamp(42px,5.1vw,76px);line-height:.98;letter-spacing:-.045em;font-weight:900;max-width:780px}\n                #bpts-trip-14633 .bpts-trip-hero-subtitle{margin:22px 0 0;max-width:660px;color:rgba(255,255,255,.92);font-size:clamp(16px,1.35vw,21px);line-height:1.5;font-weight:550}\n                #bpts-trip-14633 .bpts-trip-hero-proof{justify-self:end;align-self:end;max-width:360px;color:#fff;text-align:right;padding:0 0 14px;text-shadow:0 2px 18px rgba(0,0,0,.35)}\n                #bpts-trip-14633 .bpts-trip-hero-proof span{display:block;margin-bottom:9px;font-size:11px;line-height:1;font-weight:900;letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.78)}\n                #bpts-trip-14633 .bpts-trip-hero-proof strong{display:block;font-size:clamp(18px,1.55vw,25px);line-height:1.2;color:#fff;font-weight:850}\n                #bpts-trip-14633 .bpts-trip-hero-proof small{display:block;margin-top:8px;font-size:14px;line-height:1.4;color:rgba(255,255,255,.84)}\n                #bpts-trip-14633 .bpts-search-shell{background:#fff;border:1px solid #e4e6ea;border-radius:12px;padding:16px 20px;box-shadow:0 12px 35px rgba(16,24,40,.10)}\n                #bpts-trip-14633 .bpts-trip-hero>.bpts-search-shell{position:relative;z-index:5;width:min(1640px,calc(100% - 64px));margin:-54px auto 0;border-radius:0;padding:20px;box-shadow:0 18px 55px rgba(16,24,40,.18)}\n                #bpts-trip-14633 .bpts-trip-hero .bpts-field,#bpts-trip-14633 .bpts-trip-hero .bpts-search-btn{min-height:64px}\n                #bpts-trip-14633 .bpts-search-grid{display:grid;grid-template-columns:1.25fr 1.18fr .9fr 1.25fr .88fr;gap:14px;align-items:stretch}\n                #bpts-trip-14633 .bpts-field{position:relative;min-width:0;background:#f7f7f8;min-height:74px;padding:0 16px;display:grid;grid-template-columns:24px minmax(0,1fr) 18px;align-items:center;gap:12px;border:1px solid #eceef1;border-radius:7px;color:#111;text-align:left;font:inherit}\n                #bpts-trip-14633 button.bpts-field{cursor:pointer}\n                #bpts-trip-14633 button.bpts-field:hover{background:#f2f3f5;border-color:#dfe3e8}\n                #bpts-trip-14633 .bpts-field-icon{width:18px;height:18px;display:flex;align-items:center;justify-content:center;color:#111}\n                #bpts-trip-14633 .bpts-field-icon svg,#bpts-trip-14633 .bpts-modal-search svg{width:18px;height:18px;display:block;stroke:currentColor;stroke-width:1.8;fill:none;stroke-linecap:round;stroke-linejoin:round}\n                #bpts-trip-14633 .bpts-picker-text{min-width:0;display:flex;flex-direction:column;gap:2px}\n                #bpts-trip-14633 .bpts-picker-label{font-size:15px;text-transform:none;letter-spacing:0;color:#111;font-weight:800}\n                #bpts-trip-14633 .bpts-picker-text strong{font-size:12px;line-height:1.3;color:#666;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n                #bpts-trip-14633 .bpts-field select{width:100%;border:0!important;outline:0!important;background:transparent!important;box-shadow:none!important;padding:0!important;margin:0!important;font:inherit;font-size:14px;font-weight:700;color:#111;appearance:none;-webkit-appearance:none;cursor:pointer}\n                #bpts-trip-14633 .bpts-plus{font-size:27px;font-weight:300;line-height:1;color:#222;display:flex;align-items:center;justify-content:center;pointer-events:none}\n                #bpts-trip-14633 .bpts-search-btn{border:0;background:var(--bpts-blue);color:#fff;border-radius:7px;padding:0 22px;font-weight:800;font-size:15px;letter-spacing:.01em;cursor:pointer;min-height:74px;white-space:nowrap;text-transform:uppercase;transition:filter .15s ease,transform .15s ease}\n                #bpts-trip-14633 .bpts-search-btn:hover{filter:brightness(.94)}\n                #bpts-trip-14633 .bpts-search-btn:active{transform:translateY(1px)}\n                #bpts-trip-14633 .bpts-field:focus-visible,#bpts-trip-14633 .bpts-search-btn:focus-visible{outline:3px solid rgba(67,83,204,.34);outline-offset:2px}\n                #bpts-trip-14633 .bpts-modal{display:none;position:fixed;inset:0;z-index:999999;align-items:center;justify-content:center;padding:24px}\n                #bpts-trip-14633 .bpts-modal.is-open{display:flex}\n                #bpts-trip-14633 .bpts-modal-backdrop{position:absolute;inset:0;background:rgba(38,45,58,.48);backdrop-filter:blur(2px)}\n                #bpts-trip-14633 .bpts-modal-card{position:relative;z-index:2;width:min(640px,100%);max-height:min(780px,92vh);overflow:hidden;background:#fff;border-radius:12px;box-shadow:0 24px 70px rgba(16,24,40,.24);display:flex;flex-direction:column;border:1px solid rgba(17,24,39,.06)}\n                #bpts-trip-14633 .bpts-modal-head{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:20px 24px 18px;border-bottom:1px solid #eceef2}\n                #bpts-trip-14633 .bpts-modal-head h3{margin:0;font-size:18px;line-height:1.2;letter-spacing:-.01em;font-weight:800}\n                #bpts-trip-14633 .bpts-modal-kicker{display:none}\n                #bpts-trip-14633 .bpts-modal-close{width:42px;height:42px;border:1px solid #dfe3e8;border-radius:50%;background:#fff;font-size:0;line-height:1;cursor:pointer;color:#111;display:grid;place-items:center;padding:0;flex:0 0 42px;position:relative}.bpts-modal-close:before,.bpts-modal-close:after{content:'';position:absolute;width:17px;height:2px;background:#111;border-radius:2px;left:50%;top:50%;transform-origin:center}.bpts-modal-close:before{transform:translate(-50%,-50%) rotate(45deg)}.bpts-modal-close:after{transform:translate(-50%,-50%) rotate(-45deg)}.bpts-modal-close:hover{background:#f6f7f8}\n                #bpts-trip-14633 .bpts-modal-search{margin:14px 24px 10px;background:#fafbfc;border:1px solid #dfe3e8;border-radius:6px;min-height:46px;padding:0 13px;display:grid;grid-template-columns:22px 1fr;gap:10px;align-items:center}\n                #bpts-trip-14633 .bpts-modal-search:focus-within{background:#fff;border-color:#111}\n                #bpts-trip-14633 .bpts-modal-search input{border:0!important;background:transparent!important;box-shadow:none!important;outline:0!important;padding:0!important;margin:0!important;width:100%;height:52px;font:inherit;font-size:15px;color:#111}\n                #bpts-trip-14633 .bpts-modal-list{overflow:auto;padding:6px 16px 18px;min-height:160px}\n                #bpts-trip-14633 .bpts-modal-tabs{display:flex;justify-content:center;align-items:center;margin:0 24px;border-bottom:1px solid #e5e8ed}.bpts-modal-tab{border:0;background:transparent!important;padding:11px 20px 12px;font:inherit;font-size:12px;font-weight:900;color:var(--bpts-blue);cursor:default;position:relative;min-width:150px;text-align:center}.bpts-modal-tab:hover,.bpts-modal-tab:focus,.bpts-modal-tab:active{background:transparent!important;color:var(--bpts-blue)!important;box-shadow:none!important;outline:0}.bpts-modal-tab.is-active:after{content:'';position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--bpts-blue)}.bpts-list-section{padding:8px 24px 2px;font-size:10px;color:#7b8190;font-weight:700;text-transform:uppercase;letter-spacing:.04em}\n                #bpts-trip-14633 .bpts-modal-list button{width:100%;border:0;border-bottom:1px solid #eef0f3;background:#fff;display:grid;grid-template-columns:52px 1fr auto;gap:12px;align-items:center;padding:10px 4px;border-radius:0;text-align:left;cursor:pointer;color:#111}\n                #bpts-trip-14633 .bpts-modal-list button:hover{background:#fff}\n                #bpts-trip-14633 .bpts-place-code{width:48px;height:40px;border-radius:7px;background:#f3f4f6;display:flex;align-items:center;justify-content:center;font-size:15px;font-weight:900;letter-spacing:.03em}\n                #bpts-trip-14633 .bpts-place-code.bpts-place-flag{font-size:23px;line-height:1;letter-spacing:0}\n                #bpts-trip-14633 .bpts-place-main strong{display:block;font-size:14px}.bpts-place-main span{display:block;font-size:12px;color:#777;margin-top:2px}\n                #bpts-trip-14633 .bpts-place-type{font-size:9px;text-transform:uppercase;letter-spacing:.08em;color:#999;font-weight:800}\n                #bpts-trip-14633 .bpts-list-hint{padding:20px;text-align:center;color:#888;font-size:13px}\n                #bpts-trip-14633 .bpts-calendar-modal{width:min(920px,100%)}\n                #bpts-trip-14633 .bpts-calendar-toolbar{display:grid;grid-template-columns:48px 1fr 48px;gap:12px;align-items:center;margin:14px 24px 6px;padding:12px 14px;border:1px solid #e0e4ea;border-radius:7px}\n                #bpts-trip-14633 .bpts-cal-nav{width:42px;height:42px;border:1px solid #d7dce3;background:#fff;border-radius:8px;font-size:0;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#111;padding:0;margin:auto;position:relative;box-shadow:none}.bpts-cal-nav:before{content:'';width:9px;height:9px;border-top:2px solid #111;border-right:2px solid #111;display:block}.bpts-cal-nav[data-cal-prev]:before{transform:rotate(-135deg);margin-left:4px}.bpts-cal-nav[data-cal-next]:before{transform:rotate(45deg);margin-right:4px}.bpts-cal-nav:hover,.bpts-cal-nav:focus{background:#fff;color:#111;border-color:#111;outline:0;box-shadow:none}\n                #bpts-trip-14633 .bpts-date-summary{text-align:left;padding-left:4px}.bpts-date-summary strong{display:block;font-size:15px}.bpts-date-summary span{display:block;font-size:11px;color:#7b8190;margin-top:3px}\n                #bpts-trip-14633 .bpts-date-summary{position:relative;padding-left:34px}.bpts-date-summary:before{content:'\u25a3';position:absolute;left:5px;top:2px;font-size:18px;color:#111}\n                #bpts-trip-14633 .bpts-calendars{display:grid;grid-template-columns:1fr 1fr;gap:0;padding:12px 24px 20px;overflow:auto}.bpts-month{padding:0 16px}.bpts-month+.bpts-month{border-left:1px solid #e8ebef}\n                #bpts-trip-14633 .bpts-month-title{text-align:center;font-size:16px;font-weight:800;margin:2px 0 14px}\n                #bpts-trip-14633 .bpts-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:0}#bpts-trip-14633 .bpts-days{display:grid;grid-template-columns:repeat(7,1fr);gap:0}\n                #bpts-trip-14633 .bpts-weekdays span{text-align:center;font-size:11px;color:#4c5360;font-weight:700;padding:7px 0;text-transform:none}\n                #bpts-trip-14633 .bpts-day{height:48px;border:0;background:#fff;border-radius:0;cursor:pointer;font:inherit;font-size:13px;font-weight:700;color:#111;position:relative;display:flex;align-items:center;justify-content:center;padding:0;overflow:visible}\n                #bpts-trip-14633 .bpts-day:hover:not(:disabled):not(.is-range):not(.is-start):not(.is-end){background:#f5f6f8}\n                #bpts-trip-14633 .bpts-day:disabled{color:#ccc;cursor:not-allowed}\n                #bpts-trip-14633 .bpts-day.is-range{background:#fff;border-radius:0}\n                #bpts-trip-14633 .bpts-day.is-start,#bpts-trip-14633 .bpts-day.is-end,#bpts-trip-14633 .bpts-day.is-start.is-end{background:#fff}.bpts-day>span{position:relative;z-index:2;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:50%}.bpts-day.is-start>span,.bpts-day.is-end>span{background:#3155d9;color:#fff}\n                #bpts-trip-14633 .bpts-day.is-today:after{content:'';position:absolute;bottom:4px;left:50%;width:4px;height:4px;border-radius:50%;background:currentColor;transform:translateX(-50%)}\n                #bpts-trip-14633 .bpts-calendar-actions{display:flex;justify-content:flex-end;gap:10px;padding:16px 24px 22px;border-top:1px solid #eee}\n                #bpts-trip-14633 .bpts-clear-dates,#bpts-trip-14633 .bpts-apply-dates{min-height:44px;padding:0 18px;border-radius:10px;font:inherit;font-weight:800;cursor:pointer}\n                #bpts-trip-14633 .bpts-clear-dates{background:#fff;border:1px solid #ddd;color:#111}\n                #bpts-trip-14633 .bpts-apply-dates{background:var(--bpts-blue);border:0;color:#fff}\n                #bpts-trip-14633 .bpts-choice-modal{width:min(500px,100%)}\n                #bpts-trip-14633 .bpts-choice-list{padding:14px 18px 8px;display:grid;gap:7px;overflow:auto}\n                #bpts-trip-14633 .bpts-choice{width:100%;border:1px solid #dde2e8;background:#fff;border-radius:7px;padding:12px 14px;display:grid;grid-template-columns:46px 1fr 22px;gap:12px;align-items:center;text-align:left;cursor:pointer;color:#111;font:inherit}\n                #bpts-trip-14633 .bpts-choice:hover{border-color:#b9c0ca;background:#fafbfc}\n                #bpts-trip-14633 [data-choice-list=\"trip\"] .bpts-choice{grid-template-columns:1fr 22px}\n                #bpts-trip-14633 .bpts-choice.is-selected{border-color:var(--bpts-blue);box-shadow:0 0 0 1px var(--bpts-blue)}\n                #bpts-trip-14633 .bpts-choice-icon{width:40px;height:40px;border-radius:9px;display:flex;align-items:center;justify-content:center;font-size:20px;font-weight:800;background:#eef0ff;color:var(--bpts-blue)}\n                #bpts-trip-14633 .bpts-choice[data-choice-value=\"beginner\"] .bpts-choice-icon{background:#eaf8ed;color:#35a853}\n                #bpts-trip-14633 .bpts-choice[data-choice-value=\"intermediate\"] .bpts-choice-icon{background:#fff4d8;color:#f0a600}\n                #bpts-trip-14633 .bpts-choice[data-choice-value=\"advanced\"] .bpts-choice-icon{background:#ffebe5;color:#ed4a2c}\n                #bpts-trip-14633 .bpts-choice-main strong{display:block;font-size:14px;line-height:1.2}.bpts-choice-main span{display:block;margin-top:4px;font-size:12px;line-height:1.35;color:#6f7680}\n                #bpts-trip-14633 .bpts-choice-check{width:18px;height:18px;border:1px solid #cfd3d8;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;font-size:11px}\n                #bpts-trip-14633 .bpts-choice.is-selected .bpts-choice-check{background:var(--bpts-blue);border-color:var(--bpts-blue)}\n                #bpts-trip-14633 .bpts-choice-actions{display:flex;justify-content:flex-end;gap:10px;padding:14px 18px 18px;border-top:1px solid #eee;margin-top:8px}\n                #bpts-trip-14633 .bpts-choice-cancel,#bpts-trip-14633 .bpts-choice-apply{min-width:106px;min-height:42px;border-radius:7px;font:inherit;font-size:13px;font-weight:800;cursor:pointer}\n                #bpts-trip-14633 .bpts-choice-cancel{background:#fff;border:1px solid #dfe2e6;color:#333}.bpts-choice-apply{background:var(--bpts-blue);border:0;color:#fff}\n\n                #bpts-trip-14633 .bpts-results-modal{display:none;position:fixed;inset:0;z-index:999998;align-items:center;justify-content:center;padding:24px}\n                #bpts-trip-14633 .bpts-results-modal.is-open{display:flex}\n                #bpts-trip-14633 .bpts-results-modal-backdrop{position:absolute;inset:0;background:rgba(15,23,42,.62);backdrop-filter:blur(4px)}\n                #bpts-trip-14633 .bpts-results-dialog{position:relative;z-index:2;width:min(1580px,100%);max-height:calc(100vh - 48px);display:flex;flex-direction:column;overflow:hidden;border:1px solid rgba(255,255,255,.2);border-radius:16px;background:#f6f7f9;box-shadow:0 28px 90px rgba(0,0,0,.3)}\n                #bpts-trip-14633 .bpts-results-modal-head{min-height:68px;padding:12px 18px 12px 28px;display:flex;align-items:center;justify-content:space-between;gap:20px;border-bottom:1px solid #e1e4e9;background:#fff}\n                #bpts-trip-14633 .bpts-results-modal-head strong{font-size:17px;line-height:1.2}\n                #bpts-trip-14633 .bpts-results-modal-head span{display:block;margin-top:3px;color:#777;font-size:11px}\n                #bpts-trip-14633 .bpts-results-modal-scroll{min-height:0;flex:1;overflow:auto;overscroll-behavior:contain;padding:30px 0 42px;scrollbar-gutter:stable}\n                #bpts-trip-14633 .bpts-results-modal .bpts-results{margin-top:0}\n                #bpts-trip-14633 .bpts-results-modal.is-page{display:block;position:relative;inset:auto;padding:0;background:#f6f7f9}\n                #bpts-trip-14633 .bpts-results-modal.is-page:not(.is-open){display:none}\n                #bpts-trip-14633 .bpts-results-modal.is-page .bpts-results-modal-backdrop,#bpts-trip-14633 .bpts-results-modal.is-page .bpts-results-modal-head{display:none}\n                #bpts-trip-14633 .bpts-results-modal.is-page .bpts-results-dialog{width:100%;max-height:none;border:0;border-radius:0;background:#f6f7f9;box-shadow:none}\n                #bpts-trip-14633 .bpts-results-modal.is-page .bpts-results-modal-scroll{overflow:visible;padding:38px 0 68px}\n                #bpts-trip-14633 .bpts-error{display:none;margin-top:12px;padding:12px 14px;background:#fff3f3;border:1px solid #ffd3d3;border-radius:10px;font-size:13px}\n                #bpts-trip-14633 .bpts-error.is-open{display:block}\n                #bpts-trip-14633 .bpts-results{margin-top:32px}\n                #bpts-trip-14633 .bpts-error,#bpts-trip-14633 .bpts-results{width:min(1450px,calc(100% - 48px));margin-left:auto;margin-right:auto}\n                #bpts-trip-14633 .bpts-results-head{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:18px}\n                #bpts-trip-14633 .bpts-kicker{font-size:10px;text-transform:uppercase;letter-spacing:.12em;font-weight:900;color:#777;margin-bottom:5px}\n                #bpts-trip-14633 .bpts-results h2{font-size:clamp(25px,3vw,40px);line-height:1.05;margin:0;letter-spacing:-.035em}\n                #bpts-trip-14633 .bpts-summary{font-size:13px;color:#737373;text-align:right}\n                #bpts-trip-14633 .bpts-results-actions{display:flex;align-items:flex-end;justify-content:flex-end;gap:14px}\n                #bpts-trip-14633 .bpts-results-utility{display:flex;justify-content:flex-end;margin:0 0 16px}\n                #bpts-trip-14633 .bpts-clear-results{min-height:42px;padding:0 15px;display:inline-flex;align-items:center;justify-content:center;gap:7px;border:1px solid #d6dae2;border-radius:7px;background:#fff;color:#111;font:inherit;font-size:11px;font-weight:900;text-transform:uppercase;letter-spacing:.035em;white-space:nowrap;cursor:pointer;transition:border-color .15s ease,background .15s ease,color .15s ease}\n                #bpts-trip-14633 .bpts-clear-results:hover{border-color:#4353CC;background:#f5f6ff;color:#4353CC}\n                #bpts-trip-14633 .bpts-clear-results:focus-visible{outline:3px solid rgba(67,83,204,.34);outline-offset:2px}\n                #bpts-trip-14633 .bpts-clear-results-icon{font-size:18px;font-weight:400;line-height:1}\n                #bpts-trip-14633 .bpts-mode-note{margin:0 0 17px;padding:14px 16px;background:#f7f7f7;border-radius:14px;font-size:13px;color:#444;display:none}\n                #bpts-trip-14633 .bpts-mode-note.is-open{display:block}\n                #bpts-trip-14633 .bpts-mode-note.is-low-conditions{border:1px solid #f2d28a;background:#fff8e7;color:#614800}\n                #bpts-trip-14633 .bpts-cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:15px}\n                #bpts-trip-14633 .bpts-card{display:flex;flex-direction:column;border:1px solid var(--bpts-line);border-radius:18px;background:#fff;overflow:hidden;text-decoration:none!important;color:#111!important;transition:transform .18s ease,box-shadow .18s ease;min-height:280px}\n                #bpts-trip-14633 .bpts-card:hover{transform:translateY(-2px);box-shadow:0 14px 35px rgba(0,0,0,.07)}\n                #bpts-trip-14633 .bpts-card-top{padding:17px 17px 13px;border-bottom:1px solid var(--bpts-line);display:flex;justify-content:space-between;gap:12px}\n                #bpts-trip-14633 .bpts-card-place{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#777;font-weight:800;margin-bottom:4px}\n                #bpts-trip-14633 .bpts-card-name{font-size:20px;font-weight:900;line-height:1.1}\n                #bpts-trip-14633 .bpts-score{width:58px;height:58px;border-radius:50%;background:#0a0a0a;color:#fff;display:flex;align-items:center;justify-content:center;flex-direction:column;flex:0 0 auto}\n                #bpts-trip-14633 .bpts-score strong{font-size:18px;line-height:1}.bpts-score span{font-size:8px;opacity:.7;margin-top:2px}\n                #bpts-trip-14633 .bpts-card-body{padding:14px 17px 16px;display:flex;flex-direction:column;gap:10px;flex:1}\n                #bpts-trip-14633 .bpts-pill-row{display:flex;flex-wrap:wrap;gap:6px}\n                #bpts-trip-14633 .bpts-pill{background:#f4f4f4;border-radius:999px;padding:6px 8px;font-size:10px;font-weight:750;color:#444}\n                #bpts-trip-14633 .bpts-metrics{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:2px}\n                #bpts-trip-14633 .bpts-metric{padding:9px 10px;background:#fafafa;border-radius:10px}.bpts-metric span{display:block;font-size:9px;color:#888;text-transform:uppercase;letter-spacing:.06em}.bpts-metric strong{display:block;font-size:13px;margin-top:2px}\n                #bpts-trip-14633 .bpts-card-cta{margin-top:auto;padding-top:10px;font-size:11px;font-weight:900;text-transform:uppercase;letter-spacing:.05em;color:var(--bpts-blue)}\n                #bpts-trip-14633 .bpts-best-match-badge{background:#ecfdf3!important;color:#16a34a!important;}\n                .bpts-result-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 9px;border-radius:999px;background:#f1f2ff;color:var(--bpts-blue);font-size:10px;font-weight:900;text-transform:uppercase;letter-spacing:.04em}\n                #bpts-trip-14633 .bpts-confidence{display:flex;align-items:center;gap:7px;font-size:10px;color:#666;font-weight:700}.bpts-confidence-bar{height:5px;flex:1;min-width:70px;background:#eceef2;border-radius:999px;overflow:hidden}.bpts-confidence-bar i{display:block;height:100%;background:var(--bpts-blue);border-radius:999px}\n                #bpts-trip-14633 .bpts-reasons{display:flex;flex-wrap:wrap;gap:6px;margin-top:2px}.bpts-reason{font-size:10px;padding:6px 8px;border-radius:7px;background:#f7f7f8;color:#454545;font-weight:700}\n                #bpts-trip-14633 .bpts-top-pick{grid-column:1\/-1;display:grid;grid-template-columns:minmax(0,1.4fr) minmax(280px,.7fr);border:1px solid #dde1ff;border-radius:20px;overflow:hidden;background:linear-gradient(135deg,#fff 0%,#fafaff 100%);box-shadow:0 14px 40px rgba(67,83,204,.08);text-decoration:none!important;color:#111!important}\n                #bpts-trip-14633 .bpts-top-pick-main{padding:24px}.bpts-top-pick-side{padding:22px;background:#f6f7ff;display:flex;flex-direction:column;justify-content:center;gap:14px}.bpts-top-pick h3{font-size:30px;line-height:1;margin:8px 0 10px;letter-spacing:-.03em}.bpts-top-pick .bpts-score{background:#0a0a0a}\n                #bpts-trip-14633 .bpts-top-row{display:flex;justify-content:space-between;gap:20px;align-items:flex-start}.bpts-top-sub{font-size:13px;color:#666}.bpts-top-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:18px}.bpts-top-metric{background:#fff;border:1px solid #e8e9f3;border-radius:12px;padding:12px}.bpts-top-metric span{display:block;font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:#858995;font-weight:800}.bpts-top-metric strong{display:block;margin-top:3px;font-size:14px}\n                #bpts-trip-14633 .bpts-loading{padding:28px;text-align:center;border:1px dashed #ddd;border-radius:16px;color:#777;font-size:13px}\n                #bpts-trip-14633 .bpts-empty{padding:30px;text-align:center;background:#f7f7f7;border-radius:16px;color:#555}\n                @media(max-width:1250px){#bpts-trip-14633 .bpts-trip-hero-inner{width:calc(100% - 56px);grid-template-columns:minmax(0,720px) minmax(220px,320px);gap:36px}#bpts-trip-14633 .bpts-trip-hero>.bpts-search-shell{width:calc(100% - 40px);margin-top:-46px}#bpts-trip-14633 .bpts-top-pick{grid-template-columns:1fr}#bpts-trip-14633 .bpts-search-grid{grid-template-columns:repeat(3,1fr)}#bpts-trip-14633 .bpts-search-btn{min-height:62px}#bpts-trip-14633 .bpts-cards{grid-template-columns:repeat(2,1fr)}}\n                @media(max-width:900px){#bpts-trip-14633 .bpts-trip-hero-inner{grid-template-columns:1fr}#bpts-trip-14633 .bpts-trip-hero-proof{display:none}}\n                @media(max-width:760px){#bpts-trip-14633 .bpts-trip-hero{padding-bottom:20px}#bpts-trip-14633 .bpts-trip-hero-media{min-height:410px;background-position:center}#bpts-trip-14633 .bpts-trip-hero-inner{width:100%;padding:64px 22px 82px}#bpts-trip-14633 .bpts-trip-hero-title{font-size:clamp(36px,11vw,48px);line-height:1}#bpts-trip-14633 .bpts-trip-hero-subtitle{margin-top:16px;font-size:16px}#bpts-trip-14633 .bpts-trip-hero>.bpts-search-shell{width:calc(100% - 24px);margin-top:-36px;padding:10px;border-radius:8px}#bpts-trip-14633 .bpts-top-metrics{grid-template-columns:1fr}#bpts-trip-14633 .bpts-top-pick h3{font-size:25px}#bpts-trip-14633 .bpts-search-shell{padding:10px}#bpts-trip-14633 .bpts-search-grid{grid-template-columns:1fr;gap:9px}#bpts-trip-14633 .bpts-field{min-height:58px;padding:0 15px}#bpts-trip-14633 .bpts-search-btn{width:100%;min-height:58px}#bpts-trip-14633 .bpts-results-head{align-items:flex-start;flex-direction:column}#bpts-trip-14633 .bpts-summary{text-align:left}#bpts-trip-14633 .bpts-cards{grid-template-columns:1fr}#bpts-trip-14633 .bpts-modal{padding:10px;align-items:flex-end}#bpts-trip-14633 .bpts-modal-card{border-radius:12px;max-height:88vh}#bpts-trip-14633 .bpts-modal-head{padding:20px 18px 15px}#bpts-trip-14633 .bpts-modal-search{margin:14px 18px 8px}#bpts-trip-14633 .bpts-calendars{grid-template-columns:1fr;padding:8px 10px 18px}.bpts-month{padding:0 4px}#bpts-trip-14633 .bpts-calendars .bpts-month:nth-child(2){display:none}#bpts-trip-14633 .bpts-calendar-toolbar{padding:12px 18px 4px}#bpts-trip-14633 .bpts-calendar-actions{padding:14px 18px 18px}}\n                @media(max-width:760px){#bpts-trip-14633 .bpts-results-actions{width:100%;align-items:stretch;flex-direction:column}#bpts-trip-14633 .bpts-results-utility{justify-content:stretch}#bpts-trip-14633 .bpts-clear-results{width:100%;min-height:48px}}\n                @media(max-width:760px){\n                    body.bpts-trip-picker-open{overflow:hidden!important;overscroll-behavior:none}\n                    #bpts-trip-14633 .bpts-modal{inset:auto;top:var(--bpts-vv-top);left:var(--bpts-vv-left);width:var(--bpts-vv-width);height:var(--bpts-vv-height);max-height:var(--bpts-vv-height);padding:max(10px,env(safe-area-inset-top)) 10px max(10px,env(safe-area-inset-bottom));align-items:flex-end;overflow:hidden;overscroll-behavior:none}\n                    #bpts-trip-14633 .bpts-modal-card{width:100%;max-height:calc(var(--bpts-vv-height) - max(20px,env(safe-area-inset-top)) - max(20px,env(safe-area-inset-bottom)));border-radius:16px;overflow:hidden}\n                    #bpts-trip-14633 .bpts-modal-head,#bpts-trip-14633 .bpts-modal-search,#bpts-trip-14633 .bpts-modal-tabs,#bpts-trip-14633 .bpts-list-section{flex:0 0 auto}\n                    #bpts-trip-14633 .bpts-modal-search input{font-size:16px!important}\n                    #bpts-trip-14633 .bpts-modal-list{flex:1 1 auto;min-height:0;max-height:min(48dvh,420px);overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding-bottom:max(18px,env(safe-area-inset-bottom))}\n                    #bpts-trip-14633 .bpts-modal-list:has(.bpts-list-hint:only-child){flex:0 1 auto;min-height:112px}\n                    #bpts-trip-14633 .bpts-list-hint{padding:34px 18px}\n                    #bpts-trip-14633 .bpts-modal-list button{grid-template-columns:48px minmax(0,1fr) auto;gap:10px;padding:11px 4px}\n                    #bpts-trip-14633 .bpts-place-main{min-width:0}\n                    #bpts-trip-14633 .bpts-place-main strong{white-space:normal;overflow-wrap:anywhere}\n                }\n                @media(max-width:760px){#bpts-trip-14633 .bpts-results-modal{padding:0;align-items:stretch}#bpts-trip-14633 .bpts-results-dialog{width:100%;height:100%;max-height:none;border:0;border-radius:0}#bpts-trip-14633 .bpts-results-modal-head{min-height:62px;padding:10px 12px 10px 18px}#bpts-trip-14633 .bpts-results-modal-scroll{padding:22px 0 30px}#bpts-trip-14633 .bpts-results-modal .bpts-results{width:calc(100% - 28px)}}\n                @media(max-width:760px){#bpts-trip-14633.bpts-is-results-page .bpts-trip-hero{padding:14px 0}#bpts-trip-14633.bpts-is-results-page .bpts-trip-hero>.bpts-search-shell{margin:0 auto}#bpts-trip-14633 .bpts-results-modal.is-page .bpts-results-dialog{height:auto}#bpts-trip-14633 .bpts-results-modal.is-page .bpts-results-modal-scroll{padding:26px 0 46px}}\n            \n                #bpts-trip-14633 .bpts-score.bpts-score-red{background:#E53935!important;color:#fff!important}\n                #bpts-trip-14633 .bpts-score.bpts-score-orange{background:#F59E0B!important;color:#fff!important}\n                #bpts-trip-14633 .bpts-score.bpts-score-yellow{background:#FACC15!important;color:#111!important}\n                #bpts-trip-14633 .bpts-score.bpts-score-green{background:#16A34A!important;color:#fff!important}\n                #bpts-trip-14633 .bpts-score.bpts-score-yellow span{color:#111!important;opacity:.75}\n\n            \n                \/* v2.0.7 \u2014 black result-card title\/header area *\/\n                #bpts-trip-14633 .bpts-result-card .bpts-card-head{\n                    background:#000!important;\n                    color:#fff!important;\n                    padding:20px 22px!important;\n                }\n                #bpts-trip-14633 .bpts-result-card .bpts-card-head h3,\n                #bpts-trip-14633 .bpts-result-card .bpts-card-head h3 a,\n                #bpts-trip-14633 .bpts-result-card .bpts-card-head .bpts-rank,\n                #bpts-trip-14633 .bpts-result-card .bpts-card-head .bpts-location{\n                    color:#fff!important;\n                }\n                #bpts-trip-14633 .bpts-result-card .bpts-card-head a:hover{\n                    color:#fff!important;\n                }\n\n                #bpts-trip-14633 .bpts-card-header{\n                    background:#000!important;\n                    color:#fff!important;\n                }\n                #bpts-trip-14633 .bpts-card-header h3,\n                #bpts-trip-14633 .bpts-card-header a,\n                #bpts-trip-14633 .bpts-card-header [class*=\"rank\"],\n                #bpts-trip-14633 .bpts-card-header [class*=\"location\"]{\n                    color:#fff!important;\n                }\n\n            \n                \n                \/* v2.3.1 \u2014 4-column travel marketplace package grid *\/\n                #bpts-trip-14633 .bpts-destination-result{\n                    background:#fff;\n                    border:1px solid #e1e4ea;\n                    border-radius:24px;\n                    overflow:hidden;\n                    margin:0 0 28px;\n                    box-shadow:0 10px 35px rgba(15,23,42,.05)\n                }\n                #bpts-trip-14633 .bpts-destination-head{\n                    background:#000;\n                    color:#fff;\n                    padding:24px 28px;\n                    display:flex;\n                    align-items:center;\n                    justify-content:space-between;\n                    gap:20px\n                }\n                #bpts-trip-14633 .bpts-destination-rank{\n                    display:block;\n                    font-size:13px;\n                    font-weight:900;\n                    letter-spacing:.07em;\n                    text-transform:uppercase;\n                    color:#c8cbd3;\n                    margin-bottom:6px\n                }\n                #bpts-trip-14633 .bpts-destination-head h3{\n                    margin:0;\n                    color:#fff;\n                    font-size:30px;\n                    line-height:1.05;\n                    font-weight:850\n                }\n                #bpts-trip-14633 .bpts-destination-score-wrap{\n                    display:flex;\n                    align-items:center;\n                    gap:12px;\n                    flex:0 0 auto\n                }\n                #bpts-trip-14633 .bpts-destination-score-label{\n                    font-size:13px;\n                    font-weight:800;\n                    color:#fff;\n                    white-space:nowrap\n                }\n                #bpts-trip-14633 .bpts-destination-body{\n                    padding:28px\n                }\n                #bpts-trip-14633 .bpts-section-title{\n                    margin:0 0 18px;\n                    color:#111;\n                    font-size:13px;\n                    font-weight:900;\n                    letter-spacing:.06em;\n                    text-transform:uppercase\n                }\n\n                #bpts-trip-14633 .bpts-package-grid{\n                    width:100%;\n                    display:grid!important;\n                    grid-template-columns:repeat(4,minmax(0,1fr))!important;\n                    gap:22px!important;\n                    align-items:stretch!important\n                }\n\n                #bpts-trip-14633 article.bpts-package-card{\n                    width:100%!important;\n                    min-width:0!important;\n                    max-width:none!important;\n                    margin:0!important;\n                    padding:0!important;\n                    display:flex!important;\n                    flex-direction:column!important;\n                    grid-template-columns:none!important;\n                    gap:0!important;\n                    align-items:stretch!important;\n                    overflow:hidden!important;\n                    background:#fff!important;\n                    border:1px solid #dfe2e7!important;\n                    border-radius:0!important;\n                    box-shadow:none!important;\n                    color:#111!important;\n                    position:relative!important\n                }\n\n                #bpts-trip-14633 article.bpts-package-card:hover{\n                    transform:none!important;\n                    box-shadow:0 8px 24px rgba(15,23,42,.08)!important\n                }\n\n                #bpts-trip-14633 .bpts-package-card.bpts-package-hidden{\n                    display:none!important\n                }\n\n                #bpts-trip-14633 .bpts-package-media{\n                    width:100%!important;\n                    height:220px!important;\n                    min-height:220px!important;\n                    position:relative!important;\n                    overflow:hidden!important;\n                    background:#eceff2!important\n                }\n                #bpts-trip-14633 .bpts-package-media > .bpts-package-cover-image{\n                    width:100%!important;\n                    height:100%!important;\n                    display:block!important;\n                    object-fit:cover!important;\n                    margin:0!important\n                }\n                #bpts-trip-14633 .bpts-package-image-fallback{\n                    width:100%;\n                    height:100%;\n                    display:flex;\n                    align-items:center;\n                    justify-content:center;\n                    padding:20px;\n                    background:#111;\n                    color:#fff;\n                    text-align:center;\n                    font-size:13px;\n                    font-weight:800\n                }\n\n                #bpts-trip-14633 .bpts-package-heart{\n                    position:absolute!important;\n                    top:12px!important;\n                    left:12px!important;\n                    width:42px!important;\n                    height:42px!important;\n                    min-width:42px!important;\n                    min-height:42px!important;\n                    padding:0!important;\n                    margin:0!important;\n                    display:flex!important;\n                    align-items:center!important;\n                    justify-content:center!important;\n                    border:1px solid rgba(255,255,255,.2)!important;\n                    border-radius:50%!important;\n                    background:rgba(0,0,0,.35)!important;\n                    backdrop-filter:blur(5px);\n                    color:#fff!important;\n                    font-size:22px!important;\n                    line-height:1!important;\n                    z-index:4!important;\n                    cursor:pointer!important\n                }\n                #bpts-trip-14633 .bpts-package-heart.is-saved{\n                    background:#fff!important;\n                    color:#e83b55!important\n                }\n\n                #bpts-trip-14633 .bpts-package-badges{\n                    position:absolute!important;\n                    left:12px!important;\n                    right:12px!important;\n                    bottom:10px!important;\n                    display:flex!important;\n                    gap:6px!important;\n                    flex-wrap:wrap!important;\n                    z-index:3!important\n                }\n                #bpts-trip-14633 .bpts-package-badge{\n                    display:inline-flex!important;\n                    align-items:center!important;\n                    min-height:26px!important;\n                    padding:5px 10px!important;\n                    border-radius:999px!important;\n                    background:#fff!important;\n                    color:#111!important;\n                    font-size:11px!important;\n                    font-weight:700!important;\n                    box-shadow:0 2px 9px rgba(0,0,0,.08)!important\n                }\n\n                #bpts-trip-14633 .bpts-package-content{\n                    min-width:0!important;\n                    flex:1!important;\n                    display:flex!important;\n                    flex-direction:column!important;\n                    padding:15px 18px 18px!important;\n                    background:#fff!important\n                }\n                #bpts-trip-14633 .bpts-package-location{\n                    margin:0 0 8px!important;\n                    color:#747887!important;\n                    font-size:12px!important;\n                    line-height:1.35!important\n                }\n                #bpts-trip-14633 .bpts-package-card h4{\n                    min-height:48px!important;\n                    margin:0 0 10px!important;\n                    color:#111!important;\n                    font-size:17px!important;\n                    line-height:1.38!important;\n                    font-weight:800!important;\n                    display:-webkit-box!important;\n                    -webkit-line-clamp:2!important;\n                    -webkit-box-orient:vertical!important;\n                    overflow:hidden!important\n                }\n                #bpts-trip-14633 .bpts-package-rating{\n                    min-height:26px!important;\n                    margin:0 0 12px!important;\n                    padding:0 0 12px!important;\n                    border-bottom:1px solid #e6e8ec!important;\n                    display:flex!important;\n                    align-items:center!important;\n                    justify-content:flex-end!important;\n                    gap:5px!important;\n                    color:#111!important;\n                    font-size:11px!important;\n                    white-space:nowrap!important\n                }\n                #bpts-trip-14633 .bpts-package-stars{\n                    color:#f1bf28!important;\n                    letter-spacing:0!important;\n                    font-size:14px!important\n                }\n\n                #bpts-trip-14633 .bpts-package-facts{\n                    margin:0 0 17px!important;\n                    display:grid!important;\n                    grid-template-columns:1fr 1fr!important;\n                    gap:10px 12px!important\n                }\n                #bpts-trip-14633 .bpts-package-fact{\n                    min-width:0!important;\n                    display:flex!important;\n                    align-items:center!important;\n                    gap:7px!important;\n                    color:#111!important;\n                    font-size:12px!important;\n                    line-height:1.25!important\n                }\n                #bpts-trip-14633 .bpts-package-fact-icon{\n                    width:19px!important;\n                    min-width:19px!important;\n                    height:19px!important;\n                    display:inline-flex!important;\n                    align-items:center!important;\n                    justify-content:center!important;\n                    color:#111!important;\n                    font-size:14px!important\n                }\n\n                #bpts-trip-14633 .bpts-package-bottom{\n                    margin-top:auto!important;\n                    display:flex!important;\n                    align-items:flex-end!important;\n                    justify-content:space-between!important;\n                    gap:10px!important\n                }\n                #bpts-trip-14633 .bpts-package-from{\n                    margin:0 0 4px!important;\n                    color:#747887!important;\n                    font-size:11px!important\n                }\n                #bpts-trip-14633 .bpts-package-price{\n                    margin:0!important;\n                    color:#111!important;\n                    font-size:24px!important;\n                    line-height:1!important;\n                    font-weight:900!important;\n                    text-align:left!important\n                }\n                #bpts-trip-14633 .bpts-package-btn{\n                    min-height:40px!important;\n                    padding:0 13px!important;\n                    display:inline-flex!important;\n                    align-items:center!important;\n                    justify-content:center!important;\n                    border-radius:8px!important;\n                    background:#4353CC!important;\n                    color:#fff!important;\n                    font-size:11px!important;\n                    font-weight:900!important;\n                    text-decoration:none!important;\n                    white-space:nowrap!important\n                }\n\n                #bpts-trip-14633 .bpts-package-more-wrap{\n                    display:flex!important;\n                    justify-content:center!important;\n                    margin-top:25px!important\n                }\n                #bpts-trip-14633 .bpts-view-more-packages{\n                    min-height:48px!important;\n                    padding:0 26px!important;\n                    border:1px solid #4353CC!important;\n                    border-radius:9px!important;\n                    background:#fff!important;\n                    color:#4353CC!important;\n                    font-size:12px!important;\n                    font-weight:900!important;\n                    cursor:pointer!important\n                }\n                #bpts-trip-14633 .bpts-view-more-packages:hover{\n                    background:#4353CC!important;\n                    color:#fff!important\n                }\n\n                #bpts-trip-14633 .bpts-nearby-wrap{\n                    margin-top:28px!important;\n                    padding-top:22px!important;\n                    border-top:1px solid #eceef2!important\n                }\n                #bpts-trip-14633 .bpts-nearby-spots{\n                    display:flex!important;\n                    flex-wrap:wrap!important;\n                    gap:10px!important\n                }\n                #bpts-trip-14633 .bpts-nearby-spot{\n                    padding:10px 14px!important;\n                    border-radius:10px!important;\n                    background:#f7f7f8!important;\n                    color:#111!important;\n                    font-size:14px!important;\n                    font-weight:800!important;\n                    text-decoration:none!important\n                }\n\n                @media(max-width:1200px){\n                    #bpts-trip-14633 .bpts-package-grid{\n                        grid-template-columns:repeat(3,minmax(0,1fr))!important\n                    }\n                }\n                @media(max-width:900px){\n                    #bpts-trip-14633 .bpts-package-grid{\n                        grid-template-columns:repeat(2,minmax(0,1fr))!important\n                    }\n                }\n                @media(max-width:700px){\n                    #bpts-trip-14633 .bpts-destination-head{\n                        padding:20px!important;\n                        align-items:flex-start!important\n                    }\n                    #bpts-trip-14633 .bpts-destination-head h3{\n                        font-size:24px!important\n                    }\n                    #bpts-trip-14633 .bpts-destination-score-label{\n                        display:none!important\n                    }\n                    #bpts-trip-14633 .bpts-destination-body{\n                        padding:20px!important\n                    }\n                }\n                @media(max-width:560px){\n                    #bpts-trip-14633 .bpts-package-grid{\n                        grid-template-columns:1fr!important\n                    }\n                    #bpts-trip-14633 .bpts-package-media{\n                        height:240px!important\n                    }\n                }\n\n\/* v2.3.1 \u2014 restore clickability on package result links *\/\n                #bpts-trip-14633 .bpts-package-btn,\n                #bpts-trip-14633 .bpts-nearby-spot{\n                    position:relative!important;\n                    z-index:5!important;\n                    pointer-events:auto!important;\n                    cursor:pointer!important;\n                }\n                #bpts-trip-14633 .bpts-destination-result,\n                #bpts-trip-14633 .bpts-destination-body,\n                #bpts-trip-14633 .bpts-package-card,\n                #bpts-trip-14633 .bpts-nearby-wrap,\n                #bpts-trip-14633 .bpts-nearby-spots{\n                    pointer-events:auto!important;\n                }\n                #bpts-trip-14633 .bpts-destination-result::before,\n                #bpts-trip-14633 .bpts-destination-result::after,\n                #bpts-trip-14633 .bpts-package-card::before,\n                #bpts-trip-14633 .bpts-package-card::after{\n                    pointer-events:none!important;\n                }\n\n            \n                \/* v2.3.1 interaction repair *\/\n                #bpts-trip-14633 button,\n                #bpts-trip-14633 a,\n                #bpts-trip-14633 [data-open-picker],\n                #bpts-trip-14633 [data-choice-value],\n                #bpts-trip-14633 [data-airport-code],\n                #bpts-trip-14633 [data-dest-value]{pointer-events:auto!important}\n                #bpts-trip-14633 .bpts-modal-backdrop{pointer-events:auto!important}\n                #bpts-trip-14633 .bpts-modal-card{pointer-events:auto!important}\n\n            \n                #bpts-trip-14633 .bpts-package-heart.is-saved{\n                    background:#fff;color:#E83B55\n                }\n\n            \n                \/* v2.3.1 \u2014 fixed favorite icon *\/\n                #bpts-trip-14633 .bpts-package-heart{\n                    overflow:hidden!important;\n                    font-size:0!important;\n                    line-height:0!important;\n                }\n                #bpts-trip-14633 .bpts-package-heart svg,\n                #bpts-trip-14633 .bpts-package-heart .bpts-package-heart-icon{\n                    width:20px!important;\n                    height:20px!important;\n                    min-width:20px!important;\n                    min-height:20px!important;\n                    max-width:20px!important;\n                    max-height:20px!important;\n                    display:block!important;\n                    margin:0!important;\n                    padding:0!important;\n                    fill:none!important;\n                    stroke:currentColor!important;\n                    stroke-width:1.8!important;\n                    stroke-linecap:round!important;\n                    stroke-linejoin:round!important;\n                    position:static!important;\n                    transform:none!important;\n                }\n                #bpts-trip-14633 .bpts-package-heart.is-saved svg{\n                    fill:currentColor!important;\n                }\n\n            \n                \/* v2.3.1 \u2014 prevent WordPress emoji images from being stretched as cover images *\/\n                #bpts-trip-14633 .bpts-package-badge img.emoji,\n                #bpts-trip-14633 .bpts-package-badge img.wp-smiley,\n                #bpts-trip-14633 .bpts-package-media img.emoji,\n                #bpts-trip-14633 .bpts-package-media img.wp-smiley{\n                    width:1em!important;\n                    height:1em!important;\n                    min-width:1em!important;\n                    min-height:1em!important;\n                    max-width:1em!important;\n                    max-height:1em!important;\n                    display:inline-block!important;\n                    margin:0 .18em 0 0!important;\n                    padding:0!important;\n                    object-fit:contain!important;\n                    vertical-align:-.1em!important;\n                    position:static!important;\n                    transform:none!important;\n                }\n\n            \n                \/* v2.3.1 \u2014 hide surf results below 70 *\/\n                #bpts-trip-14633 .bpts-empty-results{\n                    margin:24px 0;\n                    padding:28px;\n                    border:1px solid #e1e4ea;\n                    border-radius:16px;\n                    background:#fff;\n                    color:#111;\n                    font-size:15px;\n                    line-height:1.6;\n                }\n\n            \n                \/* v2.3.1 \u2014 pill-style View More Packages button *\/\n                #bpts-trip-14633 .bpts-package-more-wrap{\n                    display:flex!important;\n                    justify-content:center!important;\n                    margin-top:28px!important;\n                }\n                #bpts-trip-14633 .bpts-view-more-packages{\n                    min-height:58px!important;\n                    padding:0 28px!important;\n                    display:inline-flex!important;\n                    align-items:center!important;\n                    justify-content:center!important;\n                    gap:14px!important;\n                    border:1px solid #8d8d8d!important;\n                    border-radius:999px!important;\n                    background:#fff!important;\n                    color:#4353CC!important;\n                    font-size:16px!important;\n                    line-height:1!important;\n                    font-weight:500!important;\n                    letter-spacing:0!important;\n                    text-transform:uppercase!important;\n                    cursor:pointer!important;\n                    box-shadow:none!important;\n                    transition:border-color .18s ease,background .18s ease,color .18s ease!important;\n                }\n                #bpts-trip-14633 .bpts-view-more-packages:hover{\n                    background:#fff!important;\n                    color:#4353CC!important;\n                    border-color:#4353CC!important;\n                }\n                #bpts-trip-14633 .bpts-view-more-packages .bpts-more-arrow{\n                    width:18px!important;\n                    height:18px!important;\n                    display:inline-flex!important;\n                    align-items:center!important;\n                    justify-content:center!important;\n                    flex:0 0 18px!important;\n                    transition:transform .18s ease!important;\n                }\n                #bpts-trip-14633 .bpts-view-more-packages .bpts-more-arrow svg{\n                    width:18px!important;\n                    height:18px!important;\n                    display:block!important;\n                    fill:none!important;\n                    stroke:currentColor!important;\n                    stroke-width:1.8!important;\n                    stroke-linecap:round!important;\n                    stroke-linejoin:round!important;\n                }\n\n            \n                #bpts-trip-14633 .bpts-package-card{\n                    animation:bptsPackageReveal .22s ease both;\n                }\n                @keyframes bptsPackageReveal{\n                    from{opacity:0;transform:translateY(10px)}\n                    to{opacity:1;transform:translateY(0)}\n                }\n\n            \n                \/* v2.3.1 \u2014 move View More button beside nearby spots *\/\n                #bpts-trip-14633 .bpts-nearby-row{\n                    display:flex!important;\n                    align-items:flex-start!important;\n                    justify-content:space-between!important;\n                    gap:20px!important;\n                    flex-wrap:wrap!important;\n                }\n                #bpts-trip-14633 .bpts-package-more-wrap{\n                    margin-top:0!important;\n                    margin-left:auto!important;\n                    flex:0 0 auto!important;\n                }\n                @media(max-width:900px){\n                    #bpts-trip-14633 .bpts-nearby-row{\n                        flex-direction:column!important;\n                        align-items:flex-start!important;\n                    }\n                    #bpts-trip-14633 .bpts-package-more-wrap{\n                        margin-left:0!important;\n                    }\n                }\n\n            \n                \/* v2.3.1 \u2014 View More button placement *\/\n                #bpts-trip-14633 .bpts-nearby-row{\n                    width:100%!important;\n                    display:grid!important;\n                    grid-template-columns:1fr auto!important;\n                    align-items:start!important;\n                    gap:24px!important;\n                }\n                #bpts-trip-14633 .bpts-nearby-spots{\n                    min-width:0!important;\n                }\n                #bpts-trip-14633 .bpts-package-more-wrap{\n                    margin:0!important;\n                    align-self:start!important;\n                    justify-self:end!important;\n                }\n                @media(max-width:900px){\n                    #bpts-trip-14633 .bpts-nearby-row{\n                        grid-template-columns:1fr!important;\n                    }\n                    #bpts-trip-14633 .bpts-package-more-wrap{\n                        justify-self:start!important;\n                    }\n                }\n\n            \n                \/* v2.3.1 \u2014 entire package card clickable *\/\n                #bpts-trip-14633 .bpts-package-card[data-package-url]{\n                    cursor:pointer!important;\n                }\n                #bpts-trip-14633 .bpts-package-card[data-package-url]:focus-visible{\n                    outline:3px solid #4353CC!important;\n                    outline-offset:3px!important;\n                }\n\n            \n                \/* v2.3.1 \u2014 people interested counter *\/\n                #bpts-trip-14633 .bpts-package-interest{\n                    display:flex!important;\n                    align-items:center!important;\n                    gap:7px!important;\n                    margin:0 0 15px!important;\n                    padding:10px 0 0!important;\n                    border-top:1px solid #eceef2!important;\n                    color:#747887!important;\n                    font-size:11px!important;\n                    line-height:1.3!important;\n                }\n                #bpts-trip-14633 .bpts-package-interest strong{\n                    color:#111!important;\n                    font-weight:900!important;\n                }\n                #bpts-trip-14633 .bpts-package-interest-icon{\n                    width:18px!important;\n                    height:18px!important;\n                    min-width:18px!important;\n                    display:inline-flex!important;\n                    align-items:center!important;\n                    justify-content:center!important;\n                    color:#4353CC!important;\n                }\n                #bpts-trip-14633 .bpts-package-interest-icon svg{\n                    width:17px!important;\n                    height:17px!important;\n                    display:block!important;\n                    fill:none!important;\n                    stroke:currentColor!important;\n                    stroke-width:1.8!important;\n                    stroke-linecap:round!important;\n                    stroke-linejoin:round!important;\n                }\n\n            <\/style>\n\n            <section class=\"bpts-trip-hero\" style=\"--bpts-hero-image:url(&quot;https:\/\/d14fqx6aetz9ka.cloudfront.net\/wp-content\/uploads\/2022\/07\/29011639\/hero.jpg&quot;);\" aria-label=\"Surf trip search\">\n                <div class=\"bpts-trip-hero-media\">\n                    <div class=\"bpts-trip-hero-inner\">\n                        <div class=\"bpts-trip-hero-copy\">\n                            <p class=\"bpts-trip-hero-eyebrow\">SURF TRIPS WORLDWIDE<\/p>                            <h1 class=\"bpts-trip-hero-title\">Find the best places to surf.<\/h1>                            <p class=\"bpts-trip-hero-subtitle\">Compare live surf forecasts and plan your perfect surf holiday.<\/p>                        <\/div>\n                        <div class=\"bpts-trip-hero-proof\">\n                            <span>Live surf forecast<\/span>\n                            <strong>Choose your dates. Find your wave.<\/strong>\n                            <small>Personalized by destination and surf level.<\/small>\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n            <form class=\"bpts-search-shell\" autocomplete=\"off\" role=\"search\" aria-label=\"Plan your surf trip\">\n                <div class=\"bpts-search-grid\">\n                    <input type=\"hidden\" name=\"origin\" value=\"\">\n\n                    <button class=\"bpts-field bpts-picker-trigger\" type=\"button\" data-open-picker=\"destination\" aria-label=\"Choose destination\">\n                        <span class=\"bpts-field-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 10c0 5-8 11-8 11S4 15 4 10a8 8 0 1 1 16 0Z\"\/><circle cx=\"12\" cy=\"10\" r=\"2.5\"\/><\/svg><\/span>\n                        <span class=\"bpts-picker-text\"><span class=\"bpts-picker-label\">Destination<\/span><strong data-destination-display>Country or region<\/strong><\/span>\n                        <span class=\"bpts-plus\">+<\/span>\n                    <\/button>\n                    <input type=\"hidden\" name=\"destination\" value=\"\">\n\n                    <button class=\"bpts-field bpts-picker-trigger\" type=\"button\" data-open-picker=\"dates\" aria-label=\"Choose travel dates\">\n                        <span class=\"bpts-field-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"\/><path d=\"M16 3v4M8 3v4M3 10h18\"\/><\/svg><\/span>\n                        <span class=\"bpts-picker-text\"><span class=\"bpts-picker-label\">Dates<\/span><strong data-dates-display>Oct 20 \u2013 Oct 26<\/strong><\/span>\n                        <span class=\"bpts-plus\">+<\/span>\n                    <\/button>\n                    <input type=\"hidden\" name=\"start\" value=\"2026-10-20\">\n                    <input type=\"hidden\" name=\"end\" value=\"2026-10-26\">\n\n                    <button class=\"bpts-field bpts-picker-trigger\" type=\"button\" data-open-picker=\"level\" aria-label=\"Choose surf level\">\n                        <span class=\"bpts-field-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M3 17c4.5 0 4.5-3 9-3s4.5 3 9 3\"\/><path d=\"M6 14c1.4-4 4.1-6.5 8-7.5\"\/><\/svg><\/span>\n                        <span class=\"bpts-picker-text\"><span class=\"bpts-picker-label\">Surf level<\/span><strong data-level-display>Intermediate<\/strong><\/span>\n                        <span class=\"bpts-plus\">+<\/span>\n                    <\/button>\n                    <input type=\"hidden\" name=\"level\" value=\"intermediate\">\n\n                    <button class=\"bpts-field bpts-picker-trigger\" type=\"button\" data-open-picker=\"trip\" aria-label=\"Choose type of trip\">\n                        <span class=\"bpts-field-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><rect x=\"4\" y=\"7\" width=\"16\" height=\"13\" rx=\"2\"\/><path d=\"M9 7V5a3 3 0 0 1 6 0v2M8 12v3M16 12v3\"\/><\/svg><\/span>\n                        <span class=\"bpts-picker-text\"><span class=\"bpts-picker-label\">Type of trip<\/span><strong data-trip-display>Already have accommodation<\/strong><\/span>\n                        <span class=\"bpts-plus\">+<\/span>\n                    <\/button>\n                    <input type=\"hidden\" name=\"trip_type\" value=\"accommodation\">\n                    <button class=\"bpts-search-btn\" type=\"submit\">Search<\/button>\n                <\/div>\n            <\/form>\n            <\/section>\n\n            <div class=\"bpts-modal\" data-picker=\"destination\" aria-hidden=\"true\">\n                <div class=\"bpts-modal-backdrop\" data-close-picker><\/div>\n                <div class=\"bpts-modal-card\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Choose destination\">\n                    <div class=\"bpts-modal-head\"><div><span class=\"bpts-modal-kicker\">Destination<\/span><h3>Select destination<\/h3><\/div><button type=\"button\" class=\"bpts-modal-close\" data-close-picker aria-label=\"Close\">\u00d7<\/button><\/div>\n                    <div class=\"bpts-modal-search\"><svg viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"m20 20-3.2-3.2\"\/><\/svg><input type=\"search\" data-destination-search placeholder=\"Search country, region or area\" autocomplete=\"off\"><\/div>\n                    <div class=\"bpts-modal-list\" data-destination-list><div class=\"bpts-list-hint\">Start typing a country or surf region.<\/div><\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"bpts-modal\" data-picker=\"dates\" aria-hidden=\"true\">\n                <div class=\"bpts-modal-backdrop\" data-close-picker><\/div>\n                <div class=\"bpts-modal-card bpts-calendar-modal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Choose travel dates\">\n                    <div class=\"bpts-modal-head\"><div><span class=\"bpts-modal-kicker\">Travel dates<\/span><h3>Select dates<\/h3><\/div><button type=\"button\" class=\"bpts-modal-close\" data-close-picker aria-label=\"Close\">\u00d7<\/button><\/div>\n                    <div class=\"bpts-calendar-toolbar\"><button type=\"button\" class=\"bpts-cal-nav\" data-cal-prev aria-label=\"Previous month\">\u2190<\/button><div class=\"bpts-date-summary\"><strong data-cal-summary>Choose start and end date<\/strong><span>Maximum trip length: 31 days<\/span><\/div><button type=\"button\" class=\"bpts-cal-nav\" data-cal-next aria-label=\"Next month\">\u2192<\/button><\/div>\n                    <div class=\"bpts-calendars\" data-calendars><\/div>\n                    <div class=\"bpts-calendar-actions\"><button type=\"button\" class=\"bpts-clear-dates\" data-clear-dates>Clear<\/button><button type=\"button\" class=\"bpts-apply-dates\" data-apply-dates>Apply dates<\/button><\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"bpts-modal\" data-picker=\"level\" aria-hidden=\"true\">\n                <div class=\"bpts-modal-backdrop\" data-close-picker><\/div>\n                <div class=\"bpts-modal-card bpts-choice-modal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Select surf level\">\n                    <div class=\"bpts-modal-head\"><div><h3>Select surf level<\/h3><\/div><button type=\"button\" class=\"bpts-modal-close\" data-close-picker aria-label=\"Close\">\u00d7<\/button><\/div>\n                    <div class=\"bpts-choice-list\" data-choice-list=\"level\">\n                        <button type=\"button\" class=\"bpts-choice\" data-choice-value=\"beginner\" data-choice-label=\"Beginner\"><span class=\"bpts-choice-icon\">\u2301<\/span><span class=\"bpts-choice-main\"><strong>Beginner<\/strong><span>New to surfing or catching your first green waves.<\/span><\/span><span class=\"bpts-choice-check\">\u2713<\/span><\/button>\n                        <button type=\"button\" class=\"bpts-choice is-selected\" data-choice-value=\"intermediate\" data-choice-label=\"Intermediate\"><span class=\"bpts-choice-icon\">\u2301<\/span><span class=\"bpts-choice-main\"><strong>Intermediate<\/strong><span>Surfing unbroken waves and improving your turns.<\/span><\/span><span class=\"bpts-choice-check\">\u2713<\/span><\/button>\n                        <button type=\"button\" class=\"bpts-choice\" data-choice-value=\"advanced\" data-choice-label=\"Advanced\"><span class=\"bpts-choice-icon\">\u2301<\/span><span class=\"bpts-choice-main\"><strong>Advanced<\/strong><span>Experienced surfer, comfortable in challenging conditions.<\/span><\/span><span class=\"bpts-choice-check\">\u2713<\/span><\/button>\n                    <\/div>\n                    <div class=\"bpts-choice-actions\"><button type=\"button\" class=\"bpts-choice-cancel\" data-close-picker>Cancel<\/button><button type=\"button\" class=\"bpts-choice-apply\" data-choice-apply=\"level\">Apply<\/button><\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"bpts-modal\" data-picker=\"trip\" aria-hidden=\"true\">\n                <div class=\"bpts-modal-backdrop\" data-close-picker><\/div>\n                <div class=\"bpts-modal-card bpts-choice-modal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Select type of trip\">\n                    <div class=\"bpts-modal-head\"><div><h3>Select type of trip<\/h3><\/div><button type=\"button\" class=\"bpts-modal-close\" data-close-picker aria-label=\"Close\">\u00d7<\/button><\/div>\n                    <div class=\"bpts-choice-list\" data-choice-list=\"trip\">\n                        <button type=\"button\" class=\"bpts-choice\" data-choice-value=\"surf-yoga\" data-choice-label=\"Surf &amp; Yoga Camp\"><span class=\"bpts-choice-main\"><strong>Surf &amp; Yoga Camp<\/strong><span>Show surf &amp; yoga packages<\/span><\/span><span class=\"bpts-choice-check\">\u2713<\/span><\/button>\n                        <button type=\"button\" class=\"bpts-choice\" data-choice-value=\"guiding\" data-choice-label=\"Surf Guiding\"><span class=\"bpts-choice-main\"><strong>Surf Guiding<\/strong><span>Show guiding packages<\/span><\/span><span class=\"bpts-choice-check\">\u2713<\/span><\/button>\n                        <button type=\"button\" class=\"bpts-choice is-selected\" data-choice-value=\"accommodation\" data-choice-label=\"Already have accommodation\"><span class=\"bpts-choice-main\"><strong>Already have accommodation<\/strong><span>Show only surf spots \/ forecast<\/span><\/span><span class=\"bpts-choice-check\">\u2713<\/span><\/button>\n                    <\/div>\n                    <div class=\"bpts-choice-actions\"><button type=\"button\" class=\"bpts-choice-cancel\" data-close-picker>Cancel<\/button><button type=\"button\" class=\"bpts-choice-apply\" data-choice-apply=\"trip\">Apply<\/button><\/div>\n                <\/div>\n            <\/div>\n            <div class=\"bpts-error\" role=\"alert\"><\/div>\n            <div class=\"bpts-results-modal\" data-results-modal aria-hidden=\"true\">\n                <div class=\"bpts-results-modal-backdrop\" data-close-results-modal><\/div>\n                <div class=\"bpts-results-dialog\" data-results-dialog role=\"dialog\" aria-modal=\"true\" aria-label=\"Surf trip search results\">\n                    <div class=\"bpts-results-modal-head\">\n                        <div><strong>Your surf trip results<\/strong><span>Compare the best matching surf spots and packages.<\/span><\/div>\n                        <button type=\"button\" class=\"bpts-modal-close\" data-close-results-modal aria-label=\"Close results\">\u00d7<\/button>\n                    <\/div>\n                    <div class=\"bpts-results-modal-scroll\" data-results-scroll>\n                        <section class=\"bpts-results\" aria-live=\"polite\"><\/section>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <script>\n            (function(){\n                const root=document.getElementById(\"bpts-trip-14633\"); if(!root)return;\n\n                const syncFullBleedHero=()=>{\n                    const viewportWidth=document.documentElement.clientWidth;\n                    const rootLeft=root.getBoundingClientRect().left;\n                    root.style.setProperty('--bpts-full-bleed-width',viewportWidth+'px');\n                    root.style.setProperty('--bpts-full-bleed-offset',(-rootLeft)+'px');\n                };\n                syncFullBleedHero();\n                window.addEventListener('resize',syncFullBleedHero,{passive:true});\n                if(window.visualViewport)window.visualViewport.addEventListener('resize',syncFullBleedHero,{passive:true});\n\n                const syncVisualViewport=()=>{\n                    const viewport=window.visualViewport;\n                    const top=viewport?viewport.offsetTop:0;\n                    const left=viewport?viewport.offsetLeft:0;\n                    const width=viewport?viewport.width:window.innerWidth;\n                    const height=viewport?viewport.height:window.innerHeight;\n                    root.style.setProperty('--bpts-vv-top',top+'px');\n                    root.style.setProperty('--bpts-vv-left',left+'px');\n                    root.style.setProperty('--bpts-vv-width',width+'px');\n                    root.style.setProperty('--bpts-vv-height',height+'px');\n                };\n                syncVisualViewport();\n                window.addEventListener('resize',syncVisualViewport,{passive:true});\n                if(window.visualViewport){\n                    window.visualViewport.addEventListener('resize',syncVisualViewport,{passive:true});\n                    window.visualViewport.addEventListener('scroll',syncVisualViewport,{passive:true});\n                }\n\n                const interestAjaxUrl=\"https:\\\/\\\/bestplacestosurfing.com\\\/wp-admin\\\/admin-ajax.php\";\n                const interestNonce=\"6afcec8824\";\n                const form=root.querySelector('form'), destInput=form.elements.destination, results=root.querySelector('.bpts-results'), err=root.querySelector('.bpts-error');\n                const resultsModal=root.querySelector('[data-results-modal]'),resultsDialog=root.querySelector('[data-results-dialog]'),resultsScroll=root.querySelector('[data-results-scroll]');\n                const isResultsPage=root.dataset.resultsPage==='1',resultsPageUrl=root.dataset.resultsPageUrl||'\/surf-trip\/';\n                const endpoints={destinations:root.dataset.destinations,spots:root.dataset.spots,forecast:root.dataset.forecast};\n                const airports=JSON.parse(root.dataset.airports||'[]');\n                const initialSearch={start:form.elements.start.value,end:form.elements.end.value,level:'intermediate',trip:'accommodation'};\n                let aborter=null,destTimer=null,calendarMonth=new Date(),draftStart=form.elements.start.value,draftEnd=form.elements.end.value,draftLevel=form.elements.level.value,draftTrip=form.elements.trip_type.value;\n                calendarMonth=new Date(draftStart+'T12:00:00');calendarMonth.setDate(1);\n                const esc=s=>String(s??'').replace(\/[&<>'\"]\/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;',\"'\":'&#39;','\"':'&quot;'}[c]));\n                const clamp=(n,a,b)=>Math.max(a,Math.min(b,n));\n                const daysBetween=(a,b)=>Math.round((new Date(b+'T12:00:00')-new Date(a+'T12:00:00'))\/86400000);\n                const countryCodeFallbacks={\n                    'albania':'AL','algeria':'DZ','angola':'AO','argentina':'AR','aruba':'AW','australia':'AU','austria':'AT',\n                    'bahamas':'BS','the bahamas':'BS','bangladesh':'BD','barbados':'BB','belgium':'BE','belize':'BZ','benin':'BJ','bermuda':'BM','brazil':'BR','brunei':'BN','bulgaria':'BG',\n                    'cabo verde':'CV','cape verde':'CV','cambodia':'KH','cameroon':'CM','canada':'CA','cayman islands':'KY','chile':'CL','china':'CN','colombia':'CO','comoros':'KM','congo':'CG','republic of the congo':'CG','congo brazzaville':'CG','democratic republic of the congo':'CD','dr congo':'CD','drc':'CD','congo kinshasa':'CD','cook islands':'CK','costa rica':'CR','croatia':'HR','cuba':'CU','curacao':'CW','cyprus':'CY',\n                    'denmark':'DK','djibouti':'DJ','dominica':'DM','dominican republic':'DO',\n                    'ecuador':'EC','egypt':'EG','el salvador':'SV','equatorial guinea':'GQ','eritrea':'ER','estonia':'EE',\n                    'faroe islands':'FO','fiji':'FJ','finland':'FI','france':'FR','french guiana':'GF','french polynesia':'PF',\n                    'gabon':'GA','gambia':'GM','the gambia':'GM','georgia':'GE','germany':'DE','ghana':'GH','gibraltar':'GI','greece':'GR','grenada':'GD','guadeloupe':'GP','guam':'GU','guatemala':'GT','guinea':'GN','guinea bissau':'GW','guyana':'GY',\n                    'haiti':'HT','honduras':'HN','hong kong':'HK',\n                    'iceland':'IS','india':'IN','indonesia':'ID','iran':'IR','iraq':'IQ','ireland':'IE','israel':'IL','italy':'IT','ivory coast':'CI','cote d ivoire':'CI',\n                    'jamaica':'JM','japan':'JP','jordan':'JO',\n                    'kenya':'KE','kiribati':'KI','south korea':'KR','korea':'KR','republic of korea':'KR','north korea':'KP','kuwait':'KW',\n                    'latvia':'LV','lebanon':'LB','liberia':'LR','libya':'LY','lithuania':'LT',\n                    'madagascar':'MG','malaysia':'MY','maldives':'MV','malta':'MT','marshall islands':'MH','martinique':'MQ','mauritania':'MR','mauritius':'MU','mayotte':'YT','mexico':'MX','micronesia':'FM','monaco':'MC','montenegro':'ME','morocco':'MA','mozambique':'MZ','myanmar':'MM','burma':'MM',\n                    'namibia':'NA','nauru':'NR','netherlands':'NL','new caledonia':'NC','new zealand':'NZ','nicaragua':'NI','nigeria':'NG','niue':'NU','northern mariana islands':'MP','norway':'NO',\n                    'oman':'OM',\n                    'pakistan':'PK','palau':'PW','palestine':'PS','panama':'PA','papua new guinea':'PG','peru':'PE','philippines':'PH','poland':'PL','portugal':'PT','puerto rico':'PR',\n                    'qatar':'QA',\n                    'reunion':'RE','romania':'RO','russia':'RU','russian federation':'RU',\n                    'saint barthelemy':'BL','st barthelemy':'BL','saint kitts and nevis':'KN','saint lucia':'LC','saint martin':'MF','saint vincent and the grenadines':'VC','samoa':'WS','sao tome and principe':'ST','saudi arabia':'SA','senegal':'SN','seychelles':'SC','sierra leone':'SL','singapore':'SG','slovenia':'SI','solomon islands':'SB','somalia':'SO','south africa':'ZA','spain':'ES','sri lanka':'LK','sudan':'SD','suriname':'SR','sweden':'SE',\n                    'taiwan':'TW','tanzania':'TZ','thailand':'TH','timor leste':'TL','east timor':'TL','togo':'TG','tonga':'TO','trinidad and tobago':'TT','tunisia':'TN','turkey':'TR','turkiye':'TR','turks and caicos islands':'TC','tuvalu':'TV',\n                    'united arab emirates':'AE','uae':'AE','united kingdom':'GB','uk':'GB','england':'GB','scotland':'GB','wales':'GB','united states':'US','united states of america':'US','usa':'US','us virgin islands':'VI','u s virgin islands':'VI','uruguay':'UY',\n                    'vanuatu':'VU','venezuela':'VE','vietnam':'VN','viet nam':'VN',\n                    'western sahara':'EH','yemen':'YE'\n                };\n                function normalizeCountryName(name){\n                    return String(name||'').normalize('NFD').replace(\/[\\u0300-\\u036f]\/g,'').toLowerCase().replace(\/[^a-z0-9]+\/g,' ').trim().replace(\/\\s+\/g,' ');\n                }\n                function countryFlag(code,country){\n                    code=String(code||'').trim().toUpperCase();\n                    if(!\/^[A-Z]{2}$\/.test(code))code=countryCodeFallbacks[normalizeCountryName(country)]||'';\n                    if(!\/^[A-Z]{2}$\/.test(code))return '\ud83c\udff3\ufe0f';\n                    return String.fromCodePoint(...[...code].map(letter=>127397+letter.charCodeAt(0)));\n                }\n                function error(msg){err.textContent=msg||'';err.classList.toggle('is-open',!!msg)}\n                function openResultsModal(){\n                    resultsModal.classList.add('is-open');\n                    resultsModal.setAttribute('aria-hidden','false');\n                    resultsScroll.scrollTop=0;\n                    if(!isResultsPage)document.documentElement.style.overflow='hidden';\n                }\n                function closeResultsModal(){\n                    resultsModal.classList.remove('is-open');\n                    resultsModal.setAttribute('aria-hidden','true');\n                    if(isResultsPage)return;\n                    if(!root.querySelector('.bpts-modal.is-open'))document.documentElement.style.overflow='';\n                }\n                function clearResultsButton(){return '<button type=\"button\" class=\"bpts-clear-results\" data-clear-results><span class=\"bpts-clear-results-icon\" aria-hidden=\"true\">\u00d7<\/span><span>Clear results<\/span><\/button>'}\n                function clearSearchResults(){\n                    if(aborter){aborter.abort();aborter=null}\n                    error('');\n                    results.innerHTML='';\n                    closeResultsModal();\n                    if(isResultsPage&&window.history&&window.history.replaceState)window.history.replaceState(null,'',resultsPageUrl);\n                    form.reset();\n                    form.elements.origin.value='';\n                    form.elements.destination.value='';\n                    form.elements.start.value=initialSearch.start;\n                    form.elements.end.value=initialSearch.end;\n                    form.elements.level.value=initialSearch.level;\n                    form.elements.trip_type.value=initialSearch.trip;\n                    root.querySelector('[data-destination-display]').textContent='Country or region';\n                    root.querySelector('[data-dates-display]').textContent=niceDate(initialSearch.start)+' \u2013 '+niceDate(initialSearch.end);\n                    root.querySelector('[data-level-display]').textContent='Intermediate';\n                    root.querySelector('[data-trip-display]').textContent='Already have accommodation';\n                    draftStart=initialSearch.start;\n                    draftEnd=initialSearch.end;\n                    draftLevel=initialSearch.level;\n                    draftTrip=initialSearch.trip;\n                    calendarMonth=new Date(initialSearch.start+'T12:00:00');\n                    calendarMonth.setDate(1);\n                    syncChoices('level',draftLevel);\n                    syncChoices('trip',draftTrip);\n                    destinationSearch.value='';\n                    destinationList.innerHTML='<div class=\"bpts-list-hint\">Start typing a country or surf region.<\/div>';\n                    root.querySelectorAll('.bpts-modal.is-open').forEach(closePicker);\n                    form.scrollIntoView({behavior:'smooth',block:'center'});\n                }\n                function openPicker(name){const m=root.querySelector('[data-picker=\"'+name+'\"]');if(!m)return;syncVisualViewport();m.classList.add('is-open');m.setAttribute('aria-hidden','false');document.documentElement.style.overflow='hidden';document.body.classList.add('bpts-trip-picker-open');setTimeout(()=>{const i=m.querySelector('input[type=\"search\"]');if(i)i.focus({preventScroll:true});syncVisualViewport()},80);if(name==='dates'){draftStart=form.elements.start.value;draftEnd=form.elements.end.value;calendarMonth=new Date((draftStart||root.dataset.today)+'T12:00:00');calendarMonth.setDate(1);renderCalendar()}if(name==='level'){draftLevel=form.elements.level.value;syncChoices('level',draftLevel)}if(name==='trip'){draftTrip=form.elements.trip_type.value;syncChoices('trip',draftTrip)}}\n                function closePicker(m){m=m&&m.closest?m.closest('.bpts-modal'):m;if(!m)return;if(m.contains(document.activeElement)&&document.activeElement.blur)document.activeElement.blur();m.classList.remove('is-open');m.setAttribute('aria-hidden','true');if(!root.querySelector('.bpts-modal.is-open'))document.body.classList.remove('bpts-trip-picker-open');if(!root.querySelector('.bpts-modal.is-open')&&(isResultsPage||!resultsModal.classList.contains('is-open')))document.documentElement.style.overflow=''}\n                root.querySelectorAll('[data-open-picker]').forEach(b=>b.addEventListener('click',()=>openPicker(b.dataset.openPicker)));\n                root.querySelectorAll('[data-close-picker]').forEach(b=>b.addEventListener('click',()=>closePicker(b)));\n                root.querySelectorAll('[data-close-results-modal]').forEach(b=>b.addEventListener('click',closeResultsModal));\n                document.addEventListener('keydown',e=>{if(e.key==='Escape'){const m=root.querySelector('.bpts-modal.is-open');if(m)closePicker(m);else if(!isResultsPage&&resultsModal.classList.contains('is-open'))closeResultsModal()}});\n\n                const destinationSearch=root.querySelector('[data-destination-search]'),destinationList=root.querySelector('[data-destination-list]');\n                async function renderDestinations(q){q=(q||'').trim();if(!q){destinationList.innerHTML='<div class=\"bpts-list-hint\">Start typing a country or surf region.<\/div>';return}try{const r=await fetch(endpoints.destinations+'?q='+encodeURIComponent(q),{credentials:'same-origin'});const data=await r.json();if(!r.ok||!Array.isArray(data))throw new Error();destinationList.innerHTML=data.length?data.slice(0,24).map(x=>`<button type=\"button\" data-dest-value=\"${esc(x.value)}\" data-dest-label=\"${esc(x.label)}\"><span class=\"bpts-place-code bpts-place-flag\" aria-hidden=\"true\">${countryFlag(x.countryCode,x.country)}<\/span><span class=\"bpts-place-main\"><strong>${esc(x.label)}<\/strong><span>${esc(x.country||'Surf destination')}<\/span><\/span><span class=\"bpts-place-type\">${esc(x.type)}<\/span><\/button>`).join(''):'<div class=\"bpts-list-hint\">No destination found.<\/div>'}catch(e){destinationList.innerHTML='<div class=\"bpts-list-hint\">Could not load destinations. Please try again.<\/div>'}}\n                destinationSearch.addEventListener('input',()=>{clearTimeout(destTimer);destTimer=setTimeout(()=>renderDestinations(destinationSearch.value),160)});\n                destinationList.addEventListener('click',e=>{const b=e.target.closest('[data-dest-value]');if(!b)return;destInput.value=b.dataset.destValue||'';root.querySelector('[data-destination-display]').textContent=b.dataset.destLabel||b.dataset.destValue;closePicker(b)});\n\n                function syncChoices(kind,value){const list=root.querySelector('[data-choice-list=\"'+kind+'\"]');if(!list)return;list.querySelectorAll('[data-choice-value]').forEach(b=>b.classList.toggle('is-selected',b.dataset.choiceValue===value))}\n                root.querySelectorAll('[data-choice-list]').forEach(list=>list.addEventListener('click',e=>{const b=e.target.closest('[data-choice-value]');if(!b)return;const kind=list.dataset.choiceList;if(kind==='level')draftLevel=b.dataset.choiceValue;else draftTrip=b.dataset.choiceValue;syncChoices(kind,b.dataset.choiceValue)}));\n                root.querySelectorAll('[data-choice-apply]').forEach(btn=>btn.addEventListener('click',()=>{const kind=btn.dataset.choiceApply;if(kind==='level'){form.elements.level.value=draftLevel;const b=root.querySelector('[data-choice-list=\"level\"] [data-choice-value=\"'+draftLevel+'\"]');root.querySelector('[data-level-display]').textContent=b?b.dataset.choiceLabel:'Surf level'}else{form.elements.trip_type.value=draftTrip;const b=root.querySelector('[data-choice-list=\"trip\"] [data-choice-value=\"'+draftTrip+'\"]');root.querySelector('[data-trip-display]').textContent=b?b.dataset.choiceLabel:'Type of trip'}closePicker(btn)}));\n\n                const calWrap=root.querySelector('[data-calendars]'),calSummary=root.querySelector('[data-cal-summary]');\n                const iso=d=>{const y=d.getFullYear(),m=String(d.getMonth()+1).padStart(2,'0'),day=String(d.getDate()).padStart(2,'0');return `${y}-${m}-${day}`};\n                const monthName=d=>new Intl.DateTimeFormat(undefined,{month:'long',year:'numeric'}).format(d);\n                const niceDate=s=>s?new Intl.DateTimeFormat(undefined,{month:'short',day:'numeric'}).format(new Date(s+'T12:00:00')):'';\n                const levelLabels={beginner:'Beginner',intermediate:'Intermediate',advanced:'Advanced'};\n                const tripLabels={'surf-yoga':'Surf & Yoga Camp',guiding:'Surf Guiding',accommodation:'Already have accommodation'};\n                function hydrateSearchFromUrl(params){\n                    if(!isResultsPage||params.get('bpts_trip')!=='1')return false;\n                    const origin=(params.get('origin')||'').trim();\n                    const destination=(params.get('destination')||'').trim();\n                    const requestedStart=(params.get('start')||'').trim();\n                    const requestedEnd=(params.get('end')||'').trim();\n                    const level=levelLabels[params.get('level')]?params.get('level'):'intermediate';\n                    const trip=tripLabels[normalizeTripMode(params.get('trip_type'))]?normalizeTripMode(params.get('trip_type')):'accommodation';\n                    if(!destination)return false;\n\n                    form.elements.origin.value=origin;\n                    form.elements.destination.value=destination;\n                    if(\/^\\d{4}-\\d{2}-\\d{2}$\/.test(requestedStart))form.elements.start.value=requestedStart;\n                    if(\/^\\d{4}-\\d{2}-\\d{2}$\/.test(requestedEnd))form.elements.end.value=requestedEnd;\n                    form.elements.level.value=level;\n                    form.elements.trip_type.value=trip;\n\n                    root.querySelector('[data-destination-display]').textContent=params.get('destination_label')||destination;\n                    root.querySelector('[data-dates-display]').textContent=niceDate(form.elements.start.value)+' \u2013 '+niceDate(form.elements.end.value);\n                    root.querySelector('[data-level-display]').textContent=levelLabels[level];\n                    root.querySelector('[data-trip-display]').textContent=tripLabels[trip];\n\n                    draftStart=form.elements.start.value;\n                    draftEnd=form.elements.end.value;\n                    draftLevel=level;\n                    draftTrip=trip;\n                    calendarMonth=new Date(draftStart+'T12:00:00');\n                    calendarMonth.setDate(1);\n                    syncChoices('level',draftLevel);\n                    syncChoices('trip',draftTrip);\n                    return true;\n                }\n                function currentResultsPageUrl(){\n                    const params=new URLSearchParams();\n                    params.set('bpts_trip','1');\n                    params.set('origin',form.elements.origin.value||'');\n                    params.set('destination',form.elements.destination.value||'');\n                    params.set('destination_label',root.querySelector('[data-destination-display]').textContent||'');\n                    params.set('start',form.elements.start.value||'');\n                    params.set('end',form.elements.end.value||'');\n                    params.set('level',form.elements.level.value||'intermediate');\n                    params.set('trip_type',form.elements.trip_type.value||'accommodation');\n                    const target=new URL(resultsPageUrl,window.location.href);\n                    target.search=params.toString();\n                    return target.toString();\n                }\n                function monthHtml(base){const y=base.getFullYear(),m=base.getMonth(),first=new Date(y,m,1),last=new Date(y,m+1,0),offset=(first.getDay()+6)%7;let days='';for(let i=0;i<offset;i++)days+='<span><\/span>';for(let d=1;d<=last.getDate();d++){const dt=new Date(y,m,d),s=iso(dt),disabled=s<root.dataset.today,cls=['bpts-day'];if(s===root.dataset.today)cls.push('is-today');if(draftStart&&s===draftStart)cls.push('is-start');if(draftEnd&&s===draftEnd)cls.push('is-end');if(draftStart&&draftEnd&&s>draftStart&&s<draftEnd)cls.push('is-range');days+=`<button type=\"button\" class=\"${cls.join(' ')}\" data-day=\"${s}\" ${disabled?'disabled':''}><span>${d}<\/span><\/button>`}return `<div class=\"bpts-month\"><div class=\"bpts-month-title\">${esc(monthName(base))}<\/div><div class=\"bpts-weekdays\"><span>Mon<\/span><span>Tue<\/span><span>Wed<\/span><span>Thu<\/span><span>Fri<\/span><span>Sat<\/span><span>Sun<\/span><\/div><div class=\"bpts-days\">${days}<\/div><\/div>`}\n                function renderCalendar(){const a=new Date(calendarMonth),b=new Date(calendarMonth.getFullYear(),calendarMonth.getMonth()+1,1);calWrap.innerHTML=monthHtml(a)+monthHtml(b);calSummary.textContent=draftStart?(draftEnd?niceDate(draftStart)+' \u2013 '+niceDate(draftEnd):niceDate(draftStart)+' \u2013 choose end date'):'Choose start and end date'}\n                calWrap.addEventListener('click',e=>{\n                        const b=e.target.closest('[data-day]');\n                        if(!b||b.disabled)return;\n                        const s=b.dataset.day;\n                        if(!draftStart||draftEnd){\n                            draftStart=s;draftEnd='';\n                        }else if(s<draftStart){\n                            draftStart=s;draftEnd='';\n                        }else if(daysBetween(draftStart,s)>31){\n                            const capped=new Date(new Date(draftStart+'T12:00:00').getTime()+31*86400000);\n                            draftEnd=iso(capped);\n                        }else{\n                            draftEnd=s;\n                        }\n                        renderCalendar();\n                    });\n                root.querySelector('[data-cal-prev]').addEventListener('click',()=>{calendarMonth=new Date(calendarMonth.getFullYear(),calendarMonth.getMonth()-1,1);if(iso(new Date(calendarMonth.getFullYear(),calendarMonth.getMonth()+1,0))<root.dataset.today)calendarMonth=new Date(new Date(root.dataset.today+'T12:00:00').getFullYear(),new Date(root.dataset.today+'T12:00:00').getMonth(),1);renderCalendar()});\n                root.querySelector('[data-cal-next]').addEventListener('click',()=>{calendarMonth=new Date(calendarMonth.getFullYear(),calendarMonth.getMonth()+1,1);renderCalendar()});\n                root.querySelector('[data-clear-dates]').addEventListener('click',()=>{draftStart='';draftEnd='';renderCalendar()});\n                root.querySelector('[data-apply-dates]').addEventListener('click',e=>{\n                        if(!draftStart||!draftEnd){\n                            calSummary.textContent='Choose both start and end date';\n                            return;\n                        }\n                        form.elements.start.value=draftStart;\n                        form.elements.end.value=draftEnd;\n                        root.querySelector('[data-dates-display]').textContent=niceDate(draftStart)+' \u2013 '+niceDate(draftEnd);\n                        closePicker(e.currentTarget);\n                    });\n\n                function angleDiff(a,b){let d=Math.abs((a||0)-(b||0))%360;return d>180?360-d:d}\n                function levelFit(spotLevel,userLevel){\n                    const l=String(spotLevel||'').toLowerCase();\n                    if(!l)return 65;\n                    if(\/all level|all-level|all levels\/.test(l))return 95;\n                    if(userLevel==='beginner')return l.includes('beginner')?100:((l.includes('intermediate')||l.includes('improver'))?55:30);\n                    if(userLevel==='intermediate')return (l.includes('intermediate')||l.includes('improver'))?100:(l.includes('beginner')?82:((l.includes('advanced')||l.includes('expert'))?76:68));\n                    if(userLevel==='advanced')return (l.includes('advanced')||l.includes('expert'))?100:((l.includes('intermediate')||l.includes('improver'))?84:58);\n                    return 70;\n                }\n                function waveScore(h,p,level){\n                    if(!Number.isFinite(h))return 42;\n                    let idealMin=Number(p.waveIdealMin),idealMax=Number(p.waveIdealMax),max=Number(p.waveMax);\n                    if(!Number.isFinite(idealMin)||!Number.isFinite(idealMax)){\n                        if(level==='beginner'){idealMin=.35;idealMax=1.15;max=1.8}\n                        else if(level==='advanced'){idealMin=1.0;idealMax=2.8;max=4.5}\n                        else{idealMin=.65;idealMax=1.9;max=3.2}\n                    }\n                    if(!Number.isFinite(max))max=Math.max(idealMax+1.2,3);\n                    let score;\n                    if(h>=idealMin&&h<=idealMax)score=100;\n                    else if(h<idealMin)score=clamp(25+(h\/Math.max(.1,idealMin))*70,18,95);\n                    else score=clamp(100-((h-idealMax)\/Math.max(.3,max-idealMax))*70,15,98);\n                    if(level==='beginner'&&h>1.5)score-=30;\n                    if(level==='advanced'&&h<.75)score-=20;\n                    return clamp(score,0,100);\n                }\n                function periodScore(v,p){if(!Number.isFinite(v))return 52;const good=Number(p.periodGood)||9,great=Number(p.periodGreat)||13;if(v>=great)return 100;if(v>=good)return 72+28*((v-good)\/Math.max(.1,great-good));return clamp(32+(v\/Math.max(1,good))*40,25,72)}\n                function dirScore(v,target,goodTol,okayTol){if(!Number.isFinite(v)||!Number.isFinite(Number(target)))return 62;const d=angleDiff(v,Number(target));goodTol=Number(goodTol)||40;okayTol=Number(okayTol)||80;if(d<=goodTol)return 100-(d\/goodTol)*10;if(d<=okayTol)return 90-((d-goodTol)\/Math.max(1,okayTol-goodTol))*38;return clamp(52-(d-okayTol)*.45,18,52)}\n                function windScore(dir,speed,p){if(!Number.isFinite(speed))return 55;let s=dirScore(dir,Number(p.offshoreDir),Number(p.offshoreGoodTol)||45,Number(p.offshoreOkayTol)||90);if(speed<=2)s=Math.max(s,92);else if(speed<=5)s*=1;else if(speed<=8)s*=.82;else if(speed<=12)s*=.64;else s*=.45;return clamp(s,0,100)}\n                function hourComponents(h,p,level,spot){\n                    const wh=Number(h.swellHeight ?? h.waveHeight), per=Number(h.swellPeriod ?? h.wavePeriod), sd=Number(h.swellDirection ?? h.waveDirection), ws=Number(h.windSpeed), wd=Number(h.windDirection);\n                    const wave=waveScore(wh,p,level),period=periodScore(per,p),swell=dirScore(sd,Number(p.swellDir),Number(p.swellGoodTol)||40,Number(p.swellOkayTol)||75),wind=windScore(wd,ws,p),levelScore=levelFit(spot.level,level);\n                    const total=Math.round(wave*.32+period*.18+swell*.18+wind*.22+levelScore*.10);\n                    return {total,wave,period,swell,wind,level:levelScore,height:wh,periodValue:per,windSpeed:ws};\n                }\n                function seasonalScore(spot,start,level){\n                    const month=new Date(start+'T12:00:00').getMonth()+1, season=(spot.bestSeason||'').toLowerCase();\n                    let seasonScore=62;\n                    const winter=[11,12,1,2,3],autumn=[9,10,11],spring=[3,4,5],summer=[6,7,8];\n                    if(\/autumn|fall\/.test(season)&&autumn.includes(month))seasonScore=88;\n                    if(\/winter\/.test(season)&&winter.includes(month))seasonScore=92;\n                    if(\/spring\/.test(season)&&spring.includes(month))seasonScore=84;\n                    if(\/summer\/.test(season)&&summer.includes(month))seasonScore=86;\n                    if(\/autumn to spring|fall to spring|winter swell|north atlantic\/.test(season)&&[9,10,11,12,1,2,3,4].includes(month))seasonScore=91;\n                    const lf=levelFit(spot.level,level);\n                    const quality=Number(spot.dataQuality)||70;\n                    return clamp(Math.round(seasonScore*.68+lf*.25+clamp(quality,30,100)*.07),35,94);\n                }\n                function median(arr){const x=arr.filter(Number.isFinite).sort((a,b)=>a-b);if(!x.length)return null;return x[Math.floor(x.length\/2)]}\n                function fmtDay(iso){if(!iso)return '\u2014';try{return new Intl.DateTimeFormat(undefined,{weekday:'short',month:'short',day:'numeric'}).format(new Date(iso))}catch(e){return String(iso).slice(5,10)}}\n                function fmtTimeOnly(iso){if(!iso)return '\u2014';try{return new Intl.DateTimeFormat(undefined,{hour:'2-digit',minute:'2-digit'}).format(new Date(iso))}catch(e){return String(iso).slice(11,16)}}\n                function bestWindow(scored){\n                    if(!scored.length)return null;\n                    const byTime=[...scored].sort((a,b)=>String(a.h.time).localeCompare(String(b.h.time)));\n                    let best=null;\n                    for(let i=0;i<byTime.length;i++){\n                        const block=byTime.slice(i,i+3);\n                        if(block.length<2)continue;\n                        const date=String(block[0].h.time||'').slice(0,10);\n                        if(block.some(x=>String(x.h.time||'').slice(0,10)!==date))continue;\n                        const avg=block.reduce((s,x)=>s+x.c.total,0)\/block.length;\n                        if(!best||avg>best.avg)best={avg,start:block[0].h.time,end:block[block.length-1].h.time};\n                    }\n                    return best;\n                }\n                function reasonsFrom(c,spot,level){\n                    const out=[];\n                    if(c.wave>=82)out.push('Wave size fits '+level);\n                    if(c.period>=82)out.push('Strong swell period');\n                    if(c.swell>=80)out.push('Good swell direction');\n                    if(c.wind>=80)out.push('Favorable wind');\n                    if(c.level>=90)out.push('Strong level match');\n                    if(!out.length)out.push('Best overall match nearby');\n                    return out.slice(0,3);\n                }\n                function summarizeForecast(data,spot,start,end,level){\n                    const hours=(data&&data.weather&&Array.isArray(data.weather.hours))?data.weather.hours:[];\n                    const selected=hours.filter(h=>{const d=String(h.time||'').slice(0,10);return d>=start&&d<=end});\n                    if(!selected.length)return null;\n                    const p=(data.spot&&data.spot.profile)||spot.profile||{};\n                    const scored=selected.map(h=>({h,c:hourComponents(h,p,level,spot)})).sort((a,b)=>b.c.total-a.c.total);\n                    const top=scored.slice(0,Math.max(4,Math.min(16,Math.ceil(scored.length*.20))));\n                    const score=Math.round(top.reduce((s,x)=>s+x.c.total,0)\/top.length);\n                    const best=top[0];\n                    const byDay={}; selected.forEach(h=>{const d=String(h.time||'').slice(0,10),c=hourComponents(h,p,level,spot);(byDay[d]||(byDay[d]=[])).push(c.total)});\n                    const daily=Object.entries(byDay).map(([date,vals])=>({date,score:Math.round(vals.sort((a,b)=>b-a).slice(0,Math.max(2,Math.ceil(vals.length*.25))).reduce((a,b)=>a+b,0)\/Math.max(1,Math.max(2,Math.ceil(vals.length*.25))))})).sort((a,b)=>b.score-a.score);\n                    const win=bestWindow(selected.map(h=>({h,c:hourComponents(h,p,level,spot)})));\n                    const comps=best.c;\n                    const spread=Math.max(...top.map(x=>x.c.total))-Math.min(...top.map(x=>x.c.total));\n                    const confidence=clamp(Math.round(92-spread*.7+(selected.length>=24?4:0)),55,96);\n                    return {score,wave:median(top.map(x=>x.c.height)),period:median(top.map(x=>x.c.periodValue)),bestTime:best.h.time,bestDay:daily[0]?daily[0].date:null,windowStart:win&&win.start,windowEnd:win&&win.end,confidence,reasons:reasonsFrom(comps,spot,level),live:true,daily:daily.slice(0,7)};\n                }\n                async function forecastSpot(spot,start,end,level){\n                    try{const r=await fetch(endpoints.forecast+'?spot='+encodeURIComponent(spot.slug),{credentials:'same-origin'});if(!r.ok)throw new Error('forecast');const d=await r.json();return summarizeForecast(d,spot,start,end,level)}catch(e){return null}\n                }\n                function fmtBestTime(iso){if(!iso)return '\u2014';try{return new Intl.DateTimeFormat(undefined,{weekday:'short',hour:'2-digit',minute:'2-digit'}).format(new Date(iso))}catch(e){return String(iso).slice(5,16)}}\n                function windowText(r){if(!r.windowStart)return fmtBestTime(r.bestTime);return fmtDay(r.windowStart)+' \u00b7 '+fmtTimeOnly(r.windowStart)+'\u2013'+fmtTimeOnly(r.windowEnd)}\n                function seasonalReasons(spot,level){const out=[];if(levelFit(spot.level,level)>=90)out.push('Strong level match');if(spot.bestSeason)out.push('Season: '+spot.bestSeason);if(spot.bestSwell)out.push('Best swell: '+spot.bestSwell);return out.slice(0,3)}\n                function bptsLevelMatchScore(spotLevel, selectedLevel){\n                    const t=String(spotLevel||'').toLowerCase();\n                    const selected=String(selectedLevel||'').toLowerCase();\n\n                    if(!selected || selected==='any') return 80;\n\n                    if(selected==='beginner'){\n                        if(['beginner','beginners','novice','learning','easy','all levels','beginner to intermediate','beginner\/intermediate'].some(x=>t.includes(x))) return 100;\n                        if(t.includes('intermediate')) return 55;\n                        if(t.includes('advanced') || t.includes('expert')) return 20;\n                        return 65;\n                    }\n\n                    if(selected==='intermediate'){\n                        if(['intermediate','improver','all levels','beginner to intermediate','intermediate to advanced','intermediate\/advanced'].some(x=>t.includes(x))) return 100;\n                        if(t.includes('beginner')) return 65;\n                        if(t.includes('advanced') || t.includes('expert')) return 70;\n                        return 75;\n                    }\n\n                    if(selected==='advanced'){\n                        if(['advanced','expert','intermediate to advanced','intermediate\/advanced','all levels'].some(x=>t.includes(x))) return 100;\n                        if(t.includes('intermediate')) return 70;\n                        if(t.includes('beginner')) return 25;\n                        return 75;\n                    }\n\n                    return 75;\n                }\n\n                function beginnerFriendlyLevel(levelText){\n                    const t=String(levelText||'').toLowerCase();\n                    return ['beginner','beginners','novice','first timer','first-time','learning','easy','all levels'].some(x=>t.includes(x));\n                }\n                function scoreBandClass(score){\n                    score=Number(score)||0;\n                    if(score<40)return 'bpts-score-red';\n                    if(score<60)return 'bpts-score-orange';\n                    if(score<80)return 'bpts-score-yellow';\n                    return 'bpts-score-green';\n                }\n                function card(spot,ranked,mode,level){\n                    const score=ranked.score, place=[spot.region||spot.area,spot.country].filter(Boolean).join(' \u00b7 '),live=ranked.live;\n                    const wave=Number.isFinite(ranked.wave)?ranked.wave.toFixed(1)+' m':'Seasonal';\n                    const period=Number.isFinite(ranked.period)?Math.round(ranked.period)+' sec':(spot.bestSeason||'Historical fit');\n                    const confidence=ranked.confidence||Math.round(60+score*.25);\n                    const reasons=(ranked.reasons||seasonalReasons(spot,level)).map(x=>`<span class=\"bpts-reason\">${esc(x)}<\/span>`).join('');\n                    return `<a class=\"bpts-card\" href=\"${esc(spot.url)}\"><div class=\"bpts-card-top bpts-card-header\"><div><div class=\"bpts-card-place\">#${ranked.rank} \u00b7 ${esc(place)}<\/div><div class=\"bpts-card-name\">${esc(spot.name)}<\/div><\/div><div class=\"bpts-score ${scoreBandClass(score)}\"><strong>${score}<\/strong><span>\/100<\/span><\/div><\/div><div class=\"bpts-card-body\"><div class=\"bpts-pill-row\"><span class=\"bpts-result-badge\">${live?'Live surf score':'Seasonal score'}<\/span>${spot.breakType?`<span class=\"bpts-pill\">${esc(spot.breakType)}<\/span>`:''}<\/div><div class=\"bpts-metrics\"><div class=\"bpts-metric\"><span>${live?'Best wave':'Trip outlook'}<\/span><strong>${esc(wave)}<\/strong><\/div><div class=\"bpts-metric\"><span>${live?'Period':'Best season'}<\/span><strong>${esc(period)}<\/strong><\/div><div class=\"bpts-metric\"><span>${live?'Best day':'Surf level'}<\/span><strong>${live?esc(fmtDay(ranked.bestDay)):esc(spot.level||'\u2014')}<\/strong><\/div><div class=\"bpts-metric\"><span>${live?'Best window':'Level match'}<\/span><strong>${live?esc(windowText(ranked)):Math.round(levelFit(spot.level,level))+'%'}<\/strong><\/div><\/div><div class=\"bpts-confidence\"><span>Confidence ${confidence}%<\/span><span class=\"bpts-confidence-bar\"><i style=\"width:${confidence}%\"><\/i><\/span><\/div><div class=\"bpts-reasons\">${reasons}<\/div><div class=\"bpts-card-cta\">View full forecast \u2192<\/div><\/div><\/a>`;\n                }\n                function topPick(x,level){\n                    const s=x.spot,r=x,live=r.live,place=[s.region||s.area,s.country].filter(Boolean).join(' \u00b7 '),confidence=r.confidence||Math.round(60+r.score*.25),reasons=(r.reasons||seasonalReasons(s,level)).map(v=>`<span class=\"bpts-reason\">${esc(v)}<\/span>`).join('');\n                    return `<a class=\"bpts-top-pick\" href=\"${esc(s.url)}\"><div class=\"bpts-top-pick-main\"><div class=\"bpts-top-row\"><div><span class=\"bpts-result-badge bpts-best-match-badge\">#1 BEST MATCH<\/span><h3>${esc(s.name)}<\/h3><div class=\"bpts-top-sub\">${esc(place)} \u00b7 ${esc(s.level||'Surf spot')}<\/div><\/div><div class=\"bpts-score ${scoreBandClass(r.score)}\"><strong>${r.score}<\/strong><span>\/100<\/span><\/div><\/div><div class=\"bpts-top-metrics\"><div class=\"bpts-top-metric\"><span>${live?'Best day':'Score type'}<\/span><strong>${live?esc(fmtDay(r.bestDay)):'Seasonal outlook'}<\/strong><\/div><div class=\"bpts-top-metric\"><span>${live?'Best surf window':'Best season'}<\/span><strong>${live?esc(windowText(r)):esc(s.bestSeason||'Year-round')}<\/strong><\/div><div class=\"bpts-top-metric\"><span>${live?'Expected surf':'Level match'}<\/span><strong>${live?(Number.isFinite(r.wave)?r.wave.toFixed(1)+' m':'\u2014')+' \u00b7 '+(Number.isFinite(r.period)?Math.round(r.period)+' sec':'\u2014'):Math.round(levelFit(s.level,level))+'%'}<\/strong><\/div><\/div><div class=\"bpts-reasons\" style=\"margin-top:14px\">${reasons}<\/div><\/div><div class=\"bpts-top-pick-side\"><div><strong style=\"font-size:13px\">Forecast confidence<\/strong><div class=\"bpts-confidence\" style=\"margin-top:8px\"><span>${confidence}%<\/span><span class=\"bpts-confidence-bar\"><i style=\"width:${confidence}%\"><\/i><\/span><\/div><\/div><div style=\"font-size:12px;color:#6f7480;line-height:1.45\">${live?'Calculated from wave height, swell period and direction, wind, and your selected surf level.':'Calculated from the spot season profile and your selected surf level because the dates are outside the live forecast window.'}<\/div><div class=\"bpts-card-cta\">Open spot forecast \u2192<\/div><\/div><\/a>`;\n                }\n                \n                \n                function normalizeTripMode(value){\n                    const v=String(value||'').trim().toLowerCase();\n                    if(\n                        v==='surf-yoga' ||\n                        v==='surf & yoga camp' ||\n                        v==='surf and yoga camp' ||\n                        v==='surf-yoga-camp' ||\n                        v==='surfyoga'\n                    ) return 'surf-yoga';\n\n                    if(\n                        v==='guiding' ||\n                        v==='surf guiding' ||\n                        v==='surf-guiding'\n                    ) return 'guiding';\n\n                    if(\n                        v==='already-have-accommodation' ||\n                        v==='already have accommodation' ||\n                        v==='accommodation'\n                    ) return 'accommodation';\n\n                    return v;\n                }\n\nfunction destinationKey(spot){\n                    const region=String(spot.region||'').trim();\n                    const area=String(spot.area||'').trim();\n                    const country=String(spot.country||'').trim();\n\n                    const hay=(region+' '+area).toLowerCase();\n\n                    if(\n                        hay.includes('taghazout') ||\n                        hay.includes('tamraght') ||\n                        hay.includes('aourir') ||\n                        hay.includes('cap ghir') ||\n                        hay.includes('north taghazout') ||\n                        hay.includes('agadir')\n                    ){\n                        return 'Taghazout Bay';\n                    }\n\n                    return region || area || country || 'Surf destination';\n                }\n\n                function filterMinimumSurfScore(ranked){\n                    const all=Array.isArray(ranked)?ranked:[];\n                    const preferred=all.filter(item=>Number(item.score)>=70);\n                    return preferred.length?preferred:all;\n                }\n\n                function destinationGroups(ranked){\n                    ranked=filterMinimumSurfScore(ranked);\n                    const groups={};\n                    ranked.forEach(item=>{\n                        const key=destinationKey(item.spot);\n                        if(!groups[key])groups[key]=[];\n                        groups[key].push(item);\n                    });\n                    return Object.keys(groups).map(key=>{\n                        const items=groups[key].sort((a,b)=>b.score-a.score);\n                        const top=items.slice(0,3);\n                        const score=Math.round(top.reduce((sum,x)=>sum+x.score,0)\/Math.max(1,top.length));\n                        return {name:key,items,score,country:(items[0]&&items[0].spot.country)||''};\n                    }).sort((a,b)=>b.score-a.score);\n                }\n\n                function packageInventory(group,mode){\n                    const n=String(group.name||'').toLowerCase();\n                    const country=String(group.country||'').toLowerCase();\n\n                    if(!(mode==='surf-yoga' && country.includes('morocco') && n.includes('taghazout'))){\n                        return [];\n                    }\n\n                    return [\n                        {\n                            title:'7 jours Surf & yoga entre oc\u00e9an et montagnes dans la baie de Taghazout',\n                            demoInterest:87,\n                            location:'Taghazout \u00b7 C\u00f4te Atlantique Maroc',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/80BNRY.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'5\/5',\n                            reviews:'3',\n                            style:'Independent',\n                            activity:'Surf + Yoga',\n                            nights:'7 days',\n                            level:'All levels',\n                            price:'\u20ac369',\n                            url:'https:\/\/www.decathlontravel.com\/voyages\/sport-surf\/voyage-copie-de-6-jours-surf-yoga-a-tamraght-au-coeur-de-la-baie-de-taghazout-maroc\/TOGRKW'\n                        },\n                        {\n                            title:'Semaine de surf et yoga \u00e0 Tamraght dans la Baie de Taghazout',\n                            demoInterest:142,\n                            location:'Taghazout \u00b7 C\u00f4te Atlantique Maroc',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/JSTNWB.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'4.8\/5',\n                            reviews:'65',\n                            style:'Group',\n                            activity:'Surf + Yoga',\n                            nights:'8 days',\n                            level:'All levels',\n                            price:'\u20ac595',\n                            url:'https:\/\/www.decathlontravel.com\/voyages\/sport-surf\/voyage-semaine-de-surf-dans-la-baie-de-taghazout\/ACMJED'\n                        },\n                        {\n                            title:'5 jours Surf & Yoga tout inclus \u00e0 Tamraght, Taghazout Bay Maroc',\n                            demoInterest:64,\n                            location:'Tamraght \u00b7 Taghazout Bay',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/19QDLW.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'4.9\/5',\n                            reviews:'15',\n                            style:'Independent',\n                            activity:'Surf + Yoga',\n                            nights:'5 days',\n                            level:'All levels',\n                            price:'\u20ac279',\n                            url:'https:\/\/www.decathlontravel.com\/voyages\/sport-surf\/voyage-sejour-de-surf-yoga-taghazout-bay-maroc\/OJOCMK'\n                        },\n                        {\n                            title:'Semaine de surf \u00e0 Tamraght dans la Baie de Taghazout au Maroc',\n                            demoInterest:119,\n                            location:'Taghazout \u00b7 C\u00f4te Atlantique Maroc',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/TV0BHH.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'4.8\/5',\n                            reviews:'33',\n                            style:'Group',\n                            activity:'Surf',\n                            nights:'8 days',\n                            level:'All levels',\n                            price:'\u20ac550',\n                            url:'https:\/\/www.decathlontravel.com\/voyages\/sport-surf\/voyage-semaine-de-surf-dans-la-baie-de-taghazout\/ATEYPS'\n                        },\n                        {\n                            title:'Apprenez \u00e0 surfer sur les spots de Taghazout',\n                            demoInterest:53,\n                            location:'Taghazout \u00b7 C\u00f4te Atlantique Maroc',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/MJPR7Z.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'5\/5',\n                            reviews:'27',\n                            style:'Independent',\n                            activity:'Surf',\n                            nights:'8 days',\n                            level:'All levels',\n                            price:'\u20ac580',\n                            url:'https:\/\/www.decathlontravel.com\/voyages\/sport-surf\/voyage-stage-surf-maroc-apprenez-a-surfer-sur-les-spots-de-taghazout\/CWWGTC'\n                        },\n                        {\n                            title:'6 jours Surf & Yoga \u00e0 Tamraght au c\u0153ur de la baie de Taghazout',\n                            demoInterest:96,\n                            location:'Tamraght \u00b7 Taghazout Bay',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/R8JDB7.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'5\/5',\n                            reviews:'3',\n                            style:'Independent',\n                            activity:'Surf + Yoga',\n                            nights:'6 days',\n                            level:'All levels',\n                            price:'\u20ac339',\n                            url:'https:\/\/www.decathlontravel.com\/voyages\/sport-surf\/voyage-6-jours-surf-yoga-a-tamraght-au-coeur-de-la-baie-de-taghazout-maroc\/IKPVBK'\n                        },\n                        {\n                            title:\"Surf & D\u00e9tente \u00e0 Tamraght : 8 jours face \u00e0 l'Oc\u00e9an (pension compl\u00e8te)\",\n                            demoInterest:41,\n                            location:'Tamraght \u00b7 Taghazout Bay',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/4IKRL1.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'5\/5',\n                            reviews:'20',\n                            style:'Independent',\n                            activity:'Surf',\n                            nights:'8 days',\n                            level:'Beginner',\n                            price:'\u20ac580',\n                            url:'https:\/\/www.decathlontravel.com\/voyages\/sport-surf\/voyage-vacances-surf-au-maroc-sejour-de-8-jours-en-pension-complete\/PZEXLJ'\n                        },\n                        {\n                            title:'Surf & libert\u00e9 \u00e0 Taghazout - niveau d\u00e9butant, premi\u00e8re vague garantie',\n                            demoInterest:128,\n                            location:'Taghazout \u00b7 C\u00f4te Atlantique Maroc',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/7G5BFJ.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'',\n                            reviews:'',\n                            style:'Independent',\n                            activity:'Surf',\n                            nights:'7 days',\n                            level:'Beginner',\n                            price:'\u20ac441',\n                            url:'https:\/\/www.decathlontravel.com\/voyages\/sport-surf\/voyage-stage-de-surf-debutant-a-taghazout-premiere-vague-garantie-en-7-jours\/JFLOAV'\n                        },\n\n                        \/* Hidden demo packages shown after clicking View More *\/\n                        {\n                            title:'8 jours Surf & Yoga \u00e0 Tamraght, Taghazout Bay Maroc',\n                            demoInterest:75,\n                            location:'Tamraght \u00b7 Taghazout Bay',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/R8JDB7.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'4.9\/5',\n                            reviews:'12',\n                            style:'Independent',\n                            activity:'Surf + Yoga',\n                            nights:'8 days',\n                            level:'All levels',\n                            price:'\u20ac530',\n                            url:'https:\/\/tamraghtsurfhouse.com\/'\n                        },\n                        {\n                            title:'7 jours Surf & Yoga \u00e0 Tamraght avec pension compl\u00e8te',\n                            demoInterest:109,\n                            location:'Tamraght \u00b7 Taghazout Bay',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/19QDLW.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'4.8\/5',\n                            reviews:'9',\n                            style:'Independent',\n                            activity:'Surf + Yoga',\n                            nights:'7 days',\n                            level:'Beginner',\n                            price:'\u20ac499',\n                            url:'https:\/\/tamraghtsurfhouse.com\/'\n                        },\n                        {\n                            title:'Surf camp tous niveaux \u00e0 Taghazout Bay \u2013 6 jours',\n                            demoInterest:58,\n                            location:'Taghazout \u00b7 C\u00f4te Atlantique Maroc',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/MJPR7Z.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'4.7\/5',\n                            reviews:'18',\n                            style:'Group',\n                            activity:'Surf',\n                            nights:'6 days',\n                            level:'All levels',\n                            price:'\u20ac420',\n                            url:'https:\/\/tamraghtsurfhouse.com\/'\n                        },\n                        {\n                            title:'S\u00e9jour surf d\u00e9butant \u00e0 Taghazout Bay \u2013 5 jours',\n                            demoInterest:91,\n                            location:'Taghazout \u00b7 C\u00f4te Atlantique Maroc',\n                            image:'https:\/\/media.decathlontravel.com\/assets\/640x0\/TV0BHH.avif',\n                            badges:['\u2764 Best seller','Bons plans'],\n                            rating:'4.9\/5',\n                            reviews:'14',\n                            style:'Independent',\n                            activity:'Surf',\n                            nights:'5 days',\n                            level:'Beginner',\n                            price:'\u20ac315',\n                            url:'https:\/\/tamraghtsurfhouse.com\/'\n                        }\n                    ];\n                }\n\n                function syncSavedTripHearts(){\n                    root.querySelectorAll('.bpts-package-card[data-package-url]').forEach(card=>{\n                        const url=card.getAttribute('data-package-url');\n                        const heart=card.querySelector('.bpts-package-heart');\n                        if(!url || !heart)return;\n                        try{\n                            const key='bpts_interested_'+btoa(unescape(encodeURIComponent(url))).replace(\/=+$\/,'');\n                            const active=localStorage.getItem(key)==='1';\n                            heart.classList.toggle('is-saved',active);\n                            heart.setAttribute('aria-label',active?'Remove saved package':'Save package');\n                            heart.setAttribute('title',active?'Remove saved package':'Save package');\n                        }catch(err){}\n                    });\n                }\n\n                async function loadInterestCounts(){\n                    const nodes=[...root.querySelectorAll('[data-interest-count-for]')];\n                    if(!nodes.length)return;\n\n                    const urls=[...new Set(nodes.map(n=>n.getAttribute('data-interest-count-for')).filter(Boolean))];\n                    if(!urls.length)return;\n\n                    const body=new URLSearchParams();\n                    body.set('action','bpts_trip_interest_get');\n                    body.set('nonce',interestNonce);\n                    urls.forEach(url=>body.append('package_urls[]',url));\n\n                    try{\n                        const res=await fetch(interestAjaxUrl,{\n                            method:'POST',\n                            credentials:'same-origin',\n                            headers:{'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8'},\n                            body:body.toString()\n                        });\n                        const json=await res.json();\n                        if(!json || !json.success || !json.data || !json.data.counts)return;\n\n                        nodes.forEach(node=>{\n                            const url=node.getAttribute('data-interest-count-for');\n                            const count=Number(json.data.counts[url]||0);\n                            const number=node.querySelector('.bpts-interest-number');\n                            if(number && count>0)number.textContent=String(count);\n                        });\n                    }catch(err){}\n                }\n\n                async function toggleTripInterest(card,active){\n                    const url=card?.getAttribute('data-package-url');\n                    if(!url)return;\n\n                    const body=new URLSearchParams();\n                    body.set('action','bpts_trip_interest_toggle');\n                    body.set('nonce',interestNonce);\n                    body.set('package_url',url);\n                    body.set('interest_action',active?'add':'remove');\n\n                    try{\n                        const res=await fetch(interestAjaxUrl,{\n                            method:'POST',\n                            credentials:'same-origin',\n                            headers:{'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8'},\n                            body:body.toString()\n                        });\n                        const json=await res.json();\n                        if(!json || !json.success)return;\n\n                        root.querySelectorAll('[data-interest-count-for]').forEach(node=>{\n                            if(node.getAttribute('data-interest-count-for')===url){\n                                const number=node.querySelector('.bpts-interest-number');\n                                if(number){\n                                    const serverCount=Number(json.data.count||0);\n                                    const currentVisible=Number(number.textContent||0);\n                                    if(serverCount<=1 && currentVisible>serverCount){\n                                        number.textContent=String(Math.max(0,currentVisible+(active?1:-1)));\n                                    }else{\n                                        number.textContent=String(serverCount);\n                                    }\n                                }\n                            }\n                        });\n                    }catch(err){}\n                }\n\n                function packageCardHtml(pkg,pkgIndex,groupIndex){\n                    const hiddenClass=pkgIndex>=8?' bpts-package-hidden':'';\n                    const image=pkg.image\n                        ? `<img decoding=\"async\" class=\"bpts-package-cover-image\" src=\"${esc(pkg.image)}\" alt=\"${esc(pkg.title)}\" loading=\"lazy\">`\n                        : `<div class=\"bpts-package-image-fallback\">${esc(pkg.title)}<\/div>`;\n\n                    const badges=(pkg.badges||[]).slice(0,2)\n                        .map(b=>`<span class=\"bpts-package-badge\">${esc(b)}<\/span>`)\n                        .join('');\n\n                    const rating=pkg.rating\n                        ? `<div class=\"bpts-package-rating\">\n                                <span class=\"bpts-package-stars\">\u2605\u2605\u2605\u2605\u2605<\/span>\n                                <strong>${esc(pkg.rating)}<\/strong>\n                                ${pkg.reviews?`<span>(${esc(pkg.reviews)} reviews)<\/span>`:''}\n                           <\/div>`\n                        : `<div class=\"bpts-package-rating\"><\/div>`;\n\n                    const facts=[\n                        ['\u2659',pkg.style||'Independent'],\n                        ['\u2248',pkg.activity||'Surf'],\n                        ['\u25a1',pkg.nights||'7 days'],\n                        ['\u25d4',pkg.level||'All levels']\n                    ].map(x=>`<div class=\"bpts-package-fact\">\n                                <span class=\"bpts-package-fact-icon\">${x[0]}<\/span>\n                                <span>${esc(x[1])}<\/span>\n                              <\/div>`).join('');\n\n                    return `<article class=\"bpts-package-card${hiddenClass}\" data-package-group=\"${groupIndex}\" data-package-url=\"${esc(pkg.url)}\" role=\"link\" tabindex=\"0\" aria-label=\"View ${esc(pkg.title)}\">\n                        <div class=\"bpts-package-media\">\n                            ${image}\n                            <button class=\"bpts-package-heart\" type=\"button\" aria-label=\"Save package\" title=\"Save package\">\n                                <svg class=\"bpts-package-heart-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n                                    <path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78L12 21.23l8.84-8.84a5.5 5.5 0 0 0 0-7.78Z\"><\/path>\n                                <\/svg>\n                            <\/button>\n                            ${badges?`<div class=\"bpts-package-badges\">${badges}<\/div>`:''}\n                        <\/div>\n                        <div class=\"bpts-package-content\">\n                            <div class=\"bpts-package-location\">${esc(pkg.location||'')}<\/div>\n                            <h4>${esc(pkg.title)}<\/h4>\n                            ${rating}\n                            <div class=\"bpts-package-facts\">${facts}<\/div>\n                            <div class=\"bpts-package-interest\" data-interest-count-for=\"${esc(pkg.url)}\">\n                                <span class=\"bpts-package-interest-icon\" aria-hidden=\"true\">\n                                    <svg viewBox=\"0 0 24 24\">\n                                        <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"><\/path>\n                                        <circle cx=\"9\" cy=\"7\" r=\"4\"><\/circle>\n                                        <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"><\/path>\n                                        <path d=\"M16 3.13a4 4 0 0 1 0 7.75\"><\/path>\n                                    <\/svg>\n                                <\/span>\n                                <span><strong class=\"bpts-interest-number\">${Number(pkg.demoInterest||0)}<\/strong> people interested in this trip<\/span>\n                            <\/div>\n                            <div class=\"bpts-package-bottom\">\n                                <div>\n                                    <div class=\"bpts-package-from\">From<\/div>\n                                    <div class=\"bpts-package-price\">${esc(pkg.price||'')}<\/div>\n                                <\/div>\n                                <a class=\"bpts-package-btn\" href=\"${esc(pkg.url)}\" target=\"_blank\" rel=\"noopener noreferrer\">VIEW TRIP<\/a>\n                            <\/div>\n                        <\/div>\n                    <\/article>`;\n                }\n\n                function destinationPackageCard(group,index,mode){\n                    const packages=packageInventory(group,mode);\n                    const preferred=['Anchor Point','Banana Point',\"Devil's Rock\"];\n                    const ordered=[...group.items].sort((a,b)=>{\n                        const ai=preferred.indexOf(a.spot.name);\n                        const bi=preferred.indexOf(b.spot.name);\n                        if(ai!==-1 || bi!==-1){\n                            if(ai===-1)return 1;\n                            if(bi===-1)return -1;\n                            return ai-bi;\n                        }\n                        return b.score-a.score;\n                    });\n                    const nearby=ordered.slice(0,3).map(x=>\n                        `<a class=\"bpts-nearby-spot\" href=\"${esc(x.spot.url)}\">${esc(x.spot.name)}<\/a>`\n                    ).join('');\n\n                    const moreHtml=packages.length>8\n                        ? `<button class=\"bpts-view-more-packages\" type=\"button\" data-view-more-packages=\"${index}\" data-shown=\"8\" data-total=\"${packages.length}\">\n                                <span class=\"bpts-more-label\">VIEW MORE PACKAGES (${packages.length-8} REMAINING)<\/span>\n                                <span class=\"bpts-more-arrow\" aria-hidden=\"true\">\n                                    <svg viewBox=\"0 0 24 24\">\n                                        <path d=\"M12 4v15\"><\/path>\n                                        <path d=\"m6 13 6 6 6-6\"><\/path>\n                                    <\/svg>\n                                <\/span>\n                           <\/button>`\n                        : ``;\n\n                    const pkgHtml=packages.length\n                        ? `<div class=\"bpts-package-grid\" data-package-grid=\"${index}\">\n                                ${packages.map((pkg,pkgIndex)=>packageCardHtml(pkg,pkgIndex,index)).join('')}\n                           <\/div>`\n                        : `<div class=\"bpts-package-grid\">\n                                <div class=\"bpts-package-card\">\n                                    <div class=\"bpts-package-content\">\n                                        <h4>Packages coming soon<\/h4>\n                                        <div class=\"bpts-package-location\">No matching package has been added for this area yet.<\/div>\n                                    <\/div>\n                                  <\/div>\n                           <\/div>`;\n\n                    return `<section class=\"bpts-destination-result\">\n                        <div class=\"bpts-destination-head\">\n                            <div>\n                                <span class=\"bpts-destination-rank\">#${index+1} \u00b7 ${esc(group.country)}<\/span>\n                                <h3>${esc(group.name)}<\/h3>\n                            <\/div>\n                            <div class=\"bpts-destination-score-wrap\">\n                                <span class=\"bpts-destination-score-label\">Surf score<\/span>\n                                <div class=\"bpts-score ${scoreBandClass(group.score)}\"><strong>${group.score}<\/strong><span>\/100<\/span><\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"bpts-destination-body\">\n                            <div class=\"bpts-section-title\">${mode==='surf-yoga'?'SURF & YOGA PACKAGES':'SURF GUIDING PACKAGES'}<\/div>\n                            ${pkgHtml}\n                            <div class=\"bpts-nearby-wrap\">\n                                <div class=\"bpts-section-title\">Best nearby spots<\/div>\n                                <div class=\"bpts-nearby-row\">\n                                    <div class=\"bpts-nearby-spots\">${nearby}<\/div>\n                                    ${moreHtml?`<div class=\"bpts-package-more-wrap\">${moreHtml}<\/div>`:``}\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/section>`;\n                }\n\n                function packageResults(ranked,mode){\n                    return destinationGroups(ranked).slice(0,12).map((g,i)=>destinationPackageCard(g,i,mode)).join('');\n                }\n\nfunction modeNote(mode,destination){\n                    return '';\n                }\n                async function run(e){\n                    e&&e.preventDefault();error('');\n                    const destination=destInput.value.trim(),start=form.elements.start.value,end=form.elements.end.value,level=form.elements.level.value,mode=normalizeTripMode(form.elements.trip_type.value);\n                    if(!destination){error('Choose a country or region.');openPicker('destination');return}\n                    if(!start||!end){error('Choose your travel dates.');openPicker('dates');return}\n                    if(end<start){error('The end date must be after the start date.');return}\n                    if(daysBetween(start,end)>31){error('Choose a trip of 31 days or less.');return}\n                    const destinationUrl=currentResultsPageUrl();\n                    if(!isResultsPage){window.location.assign(destinationUrl);return}\n                    if(window.history&&window.history.replaceState)window.history.replaceState(null,'',destinationUrl);\n                    if(aborter)aborter.abort();aborter=new AbortController();\n                    openResultsModal();\n                    results.innerHTML='<div class=\"bpts-loading\">Searching your surf spot database\u2026<\/div>';\n                    try{\n                        const url=endpoints.spots+'?destination='+encodeURIComponent(destination)+'&level='+encodeURIComponent(level)+'&limit=30';\n                        const r=await fetch(url,{signal:aborter.signal,credentials:'same-origin'});const data=await r.json();if(!r.ok||!data.ok)throw new Error(data.message||'Search failed.');\n                        let spots=Array.isArray(data.spots)?data.spots:[];\n                        if(!spots.length){results.innerHTML='<div class=\"bpts-results-utility\">'+clearResultsButton()+'<\/div><div class=\"bpts-empty\">No surf spots were found for this destination.<\/div>';return}\n                        const today=root.dataset.today,liveRange=start>=today&&daysBetween(today,start)<=7;\n                        let ranked=[];\n                        if(liveRange){\n                            results.innerHTML='<div class=\"bpts-loading\">Found '+spots.length+' spots. Analysing wave, swell, wind and level match\u2026<\/div>';\n                            const batchSize=5;\n                            for(let i=0;i<spots.length;i+=batchSize){\n                                const batch=spots.slice(i,i+batchSize);\n                                const vals=await Promise.all(batch.map(async spot=>({spot,summary:await forecastSpot(spot,start,end,level)})));\n                                vals.forEach(x=>ranked.push({spot:x.spot,...(x.summary||{score:seasonalScore(x.spot,start,level),live:false,reasons:seasonalReasons(x.spot,level)})}));\n                            }\n                        }else spots.forEach(spot=>ranked.push({spot,score:seasonalScore(spot,start,level),live:false,reasons:seasonalReasons(spot,level)}));\n                        ranked.sort((a,b)=>b.score-a.score||a.spot.name.localeCompare(b.spot.name));ranked.forEach((x,i)=>x.rank=i+1);\n                        const lowConditions=!ranked.some(item=>Number(item.score)>=70);\n                        const top=ranked.slice(0,12),note=lowConditions?'Surf conditions are below ideal for your selected dates. Showing the best available spots, ranked from highest to lowest score.':modeNote(mode,destination),label=mode==='accommodation'?'Best surf spots':'Best surf areas';\n                        const cards=top.slice(1).map(x=>card(x.spot,x,mode,level)).join('');\n                        \n\n                                            ranked=filterMinimumSurfScore(ranked);\n                                            if(mode==='surf-yoga' || mode==='guiding'){\n\n                                                results.innerHTML='<div class=\"bpts-results-utility\">'+clearResultsButton()+'<\/div>'+(note?'<div class=\"bpts-mode-note is-open'+(lowConditions?' is-low-conditions':'')+'\">'+note+'<\/div>':'')+packageResults(ranked,mode);\n                                                resultsScroll.scrollTop=0;\n\n                                                return;\n\n                                            }\n\n                        results.innerHTML=`<div class=\"bpts-results-head\"><div><div class=\"bpts-kicker\">${esc(destination)} \u00b7 ${esc(niceDate(start))} \u2192 ${esc(niceDate(end))} \u00b7 ${esc(level)}<\/div><h2>${label} for your trip<\/h2><\/div><div class=\"bpts-results-actions\"><div class=\"bpts-summary\">${spots.length} matching spots analysed<br>${liveRange?'Live forecast + personalized surf score':'Seasonal trip score + level match'}<\/div>${clearResultsButton()}<\/div><\/div>${note?`<div class=\"bpts-mode-note is-open${lowConditions?' is-low-conditions':''}\">${note}<\/div>`:''}<div class=\"bpts-cards\">${topPick(top[0],level)}${cards}<\/div>`;\n                        resultsScroll.scrollTop=0;\n                    }catch(ex){if(ex.name==='AbortError')return;results.innerHTML='';closeResultsModal();error(ex.message||'We could not complete the search. Please try again.')}\n                }\n                \n                root.addEventListener('click',e=>{\n                    const clear=e.target.closest('[data-clear-results]');\n                    if(clear){\n                        e.preventDefault();\n                        clearSearchResults();\n                        return;\n                    }\n\n                    const more=e.target.closest('[data-view-more-packages]');\n                    if(!more)return;\n                    e.preventDefault();\n                    e.stopPropagation();\n\n                    const groupId=more.getAttribute('data-view-more-packages');\n                    const grid=root.querySelector(`[data-package-grid=\"${groupId}\"]`);\n                    if(!grid)return;\n\n                    const hidden=[...grid.querySelectorAll('.bpts-package-hidden')];\n                    hidden.slice(0,8).forEach(card=>card.classList.remove('bpts-package-hidden'));\n                    syncSavedTripHearts();\n                    loadInterestCounts();\n\n                    const remaining=grid.querySelectorAll('.bpts-package-hidden').length;\n                    const shown=parseInt(more.getAttribute('data-shown')||'8',10)+Math.min(8,hidden.length);\n                    more.setAttribute('data-shown',String(shown));\n\n                    const label=more.querySelector('.bpts-more-label');\n                    if(label){\n                        label.textContent=`VIEW MORE PACKAGES (${remaining} REMAINING)`;\n                    }\n\n                    if(remaining===0){\n                        more.closest('.bpts-package-more-wrap')?.remove();\n                    }\n                });\n\n                root.addEventListener('click',e=>{\n                    const heart=e.target.closest('.bpts-package-heart');\n                    if(!heart)return;\n                    e.preventDefault();\n                    e.stopPropagation();\n                    const active=heart.classList.toggle('is-saved');\n                    heart.setAttribute('aria-label',active?'Remove saved package':'Save package');\n                    heart.setAttribute('title',active?'Remove saved package':'Save package');\n\n                    const card=heart.closest('.bpts-package-card[data-package-url]');\n                    if(card){\n                        const url=card.getAttribute('data-package-url');\n                        try{\n                            const key='bpts_interested_'+btoa(unescape(encodeURIComponent(url))).replace(\/=+$\/,'');\n                            if(active)localStorage.setItem(key,'1');\n                            else localStorage.removeItem(key);\n                        }catch(err){}\n                        toggleTripInterest(card,active);\n                    }\n                });\n\n                \n                root.addEventListener('click',e=>{\n                    const card=e.target.closest('.bpts-package-card[data-package-url]');\n                    if(!card)return;\n\n                    \/\/ Keep interactive elements independent.\n                    if(e.target.closest('a,button,input,select,textarea'))return;\n\n                    const url=card.getAttribute('data-package-url');\n                    if(url){\n                        window.open(url,'_blank','noopener,noreferrer');\n                    }\n                });\n\n                root.addEventListener('keydown',e=>{\n                    const card=e.target.closest('.bpts-package-card[data-package-url]');\n                    if(!card || e.target!==card)return;\n\n                    if(e.key==='Enter' || e.key===' '){\n                        e.preventDefault();\n                        const url=card.getAttribute('data-package-url');\n                        if(url){\n                            window.open(url,'_blank','noopener,noreferrer');\n                        }\n                    }\n                });\n\n                const shouldAutoRun=hydrateSearchFromUrl(new URLSearchParams(window.location.search));\n                form.addEventListener('submit',run);\n                if(shouldAutoRun)setTimeout(()=>run(),0);\n            })();\n            <\/script>\n        <\/div>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f388d1f e-con-full e-flex e-con e-parent\" data-id=\"f388d1f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1ae02fb elementor-widget elementor-widget-shortcode\" data-id=\"1ae02fb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">        <section class=\"bpts-near-you-v2\" id=\"bpts-near-you-1\" data-limit=\"4\">\n            <style>\n            #bpts-near-you-1,#bpts-near-you-1 *{box-sizing:border-box}\n            #bpts-near-you-1{width:100%;padding:74px 0 82px;background:#f6f6f3;color:#111;font-family:Arial,Helvetica,sans-serif}\n            #bpts-near-you-1 .bpts-ny-inner{width:min(1450px,calc(100% - 48px));margin:0 auto}\n            #bpts-near-you-1 .bpts-ny-top{display:flex;align-items:flex-end;justify-content:space-between;gap:28px;margin-bottom:28px}\n            #bpts-near-you-1 .bpts-ny-kicker{margin:0 0 8px;color:#777;font-size:12px;font-weight:800;letter-spacing:1.5px;text-transform:uppercase}\n            #bpts-near-you-1 h2{margin:0;color:#111;font-size:clamp(34px,4vw,52px);line-height:1;letter-spacing:-2px;font-weight:900}\n            #bpts-near-you-1 .bpts-ny-desc{max-width:650px;margin:12px 0 0;color:#727272;font-size:15px;line-height:1.55}\n            #bpts-near-you-1 .bpts-ny-all{color:#111!important;text-decoration:none!important;font-size:13px;font-weight:900;white-space:nowrap}\n            #bpts-near-you-1 .bpts-ny-location{display:flex;align-items:center;justify-content:space-between;gap:18px;margin-bottom:20px;padding:15px 18px;border:1px solid #e3e3e3;border-radius:12px;background:#fff}\n            #bpts-near-you-1 .bpts-ny-location-copy{display:flex;align-items:center;gap:11px;min-width:0}\n            #bpts-near-you-1 .bpts-ny-location-icon{display:flex;align-items:center;justify-content:center;width:38px;height:38px;flex:0 0 38px;border-radius:50%;background:#111;color:#fff;font-size:18px}\n            #bpts-near-you-1 .bpts-ny-location-copy strong{display:block;font-size:13px}.bpts-near-you-v2 .bpts-ny-location-copy span{display:block;margin-top:2px;color:#777;font-size:12px}\n            #bpts-near-you-1 .bpts-ny-location button{border:0;background:transparent;color:#111;font-size:12px;font-weight:900;cursor:pointer}\n            #bpts-near-you-1 .bpts-ny-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:18px}\n            #bpts-near-you-1 .bpts-ny-card{display:block;overflow:hidden;border:1px solid #e4e4e4;border-radius:15px;background:#fff;color:#111!important;text-decoration:none!important;transition:transform .2s ease,box-shadow .2s ease}\n            #bpts-near-you-1 .bpts-ny-card:hover{transform:translateY(-3px);box-shadow:0 14px 32px rgba(0,0,0,.08)}\n            #bpts-near-you-1 .bpts-ny-map{position:relative;height:195px;overflow:hidden;background:#ddd}\n            #bpts-near-you-1 .bpts-ny-map img{width:100%;height:100%;display:block;object-fit:cover}\n            #bpts-near-you-1 .bpts-ny-map:after{content:\"\";position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,.03) 42%,rgba(0,0,0,.62) 100%);pointer-events:none}\n            #bpts-near-you-1 .bpts-ny-rating{position:absolute;z-index:2;top:13px;left:13px;padding:7px 10px;border-radius:999px;background:#111;color:#fff;font-size:10px;font-weight:900;text-transform:uppercase}\n            #bpts-near-you-1 .bpts-ny-map-copy{position:absolute;z-index:2;left:15px;right:15px;bottom:13px;color:#fff}.bpts-near-you-v2 .bpts-ny-map-copy strong{display:block;font-size:16px;font-weight:900}.bpts-near-you-v2 .bpts-ny-map-copy span{font-size:10px;color:rgba(255,255,255,.86)}\n            #bpts-near-you-1 .bpts-ny-body{padding:18px}\n            #bpts-near-you-1 .bpts-ny-place{color:#878787;font-size:10px;font-weight:800;letter-spacing:.7px;text-transform:uppercase}\n            #bpts-near-you-1 .bpts-ny-name{margin:5px 0 17px;font-size:22px;font-weight:900;line-height:1.08}\n            #bpts-near-you-1 .bpts-ny-wave-row{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;margin-bottom:15px}\n            #bpts-near-you-1 .bpts-ny-wave{font-size:34px;font-weight:900;line-height:1}.bpts-near-you-v2 .bpts-ny-wave small{font-size:15px}\n            #bpts-near-you-1 .bpts-ny-swell{text-align:right;color:#666;font-size:11px;line-height:1.4}.bpts-near-you-v2 .bpts-ny-swell strong{color:#111}\n            #bpts-near-you-1 .bpts-ny-details{display:grid;grid-template-columns:1fr 1fr;gap:7px;margin-bottom:13px}\n            #bpts-near-you-1 .bpts-ny-detail{padding:9px;border:1px solid #ececec;border-radius:8px;background:#fafafa}.bpts-near-you-v2 .bpts-ny-detail span{display:block;margin-bottom:3px;color:#929292;font-size:8px;text-transform:uppercase}.bpts-near-you-v2 .bpts-ny-detail strong{font-size:11px}\n            #bpts-near-you-1 .bpts-ny-condition{display:flex;align-items:center;gap:9px;min-height:18px;font-weight:900;white-space:nowrap}\n            #bpts-near-you-1 .bpts-ny-condition-label{font-size:12px;line-height:1;color:var(--condition-color,#8d96a6)}\n            #bpts-near-you-1 .bpts-ny-condition-bars{display:flex;align-items:center;gap:3px}\n            #bpts-near-you-1 .bpts-ny-condition-bars i{display:block;width:18px;height:7px;background:#dfe4eb;border-radius:1px}\n            #bpts-near-you-1 .bpts-ny-condition-bars i.on{background:var(--condition-color,#8d96a6)}\n            #bpts-near-you-1 .bpts-ny-cta{display:flex;align-items:center;justify-content:center;min-height:42px;border-radius:8px;background:#111;color:#fff;font-size:11px;font-weight:900}\n            @media(max-width:1100px){#bpts-near-you-1 .bpts-ny-grid{grid-template-columns:repeat(2,1fr)}}\n            @media(max-width:700px){#bpts-near-you-1{padding:56px 0 62px}#bpts-near-you-1 .bpts-ny-inner{width:calc(100% - 28px)}#bpts-near-you-1 .bpts-ny-top{align-items:flex-start;flex-direction:column}#bpts-near-you-1 .bpts-ny-location{align-items:flex-start;flex-direction:column}#bpts-near-you-1 .bpts-ny-grid{grid-template-columns:1fr}#bpts-near-you-1 .bpts-ny-map{height:225px}}\n            <\/style>\n            <div class=\"bpts-ny-inner\">\n                <div class=\"bpts-ny-top\"><div><p class=\"bpts-ny-kicker\">LIVE SURF DATABASE<\/p><h2>Surf near you<\/h2><p class=\"bpts-ny-desc\">Your location is detected automatically and matched against the full surf-spot database.<\/p><\/div><a class=\"bpts-ny-all\" href=\"https:\/\/bestplacestosurfing.com\/fr\/surf-spots\/\">Explore all surf spots \u2192<\/a><\/div>\n                <div class=\"bpts-ny-location\"><div class=\"bpts-ny-location-copy\"><div class=\"bpts-ny-location-icon\">\u25ce<\/div><div><strong>Nearby surf spots<\/strong><span data-location-copy>Detecting your location\u2026<\/span><\/div><\/div><button type=\"button\" data-location-button>Refresh location<\/button><\/div>\n                <div class=\"bpts-ny-grid\" data-grid><\/div>\n            <\/div>\n            <script>\n            (function(){\n                const root=document.getElementById(\"bpts-near-you-1\");if(!root)return;\n                const grid=root.querySelector('[data-grid]'),btn=root.querySelector('[data-location-button]'),copy=root.querySelector('[data-location-copy]');\n                const ajaxUrl=\"https:\\\/\\\/bestplacestosurfing.com\\\/wp-admin\\\/admin-ajax.php\",forecast=\"https:\\\/\\\/bestplacestosurfing.com\\\/fr\\\/wp-json\\\/bpts-surf\\\/v1\\\/forecast\",limit=4,fallback=[{\"name\":\"Anchor Point\",\"slug\":\"anchor-point\",\"country\":\"Morocco\",\"region\":\"Taghazout\",\"area\":\"Souss-Massa\",\"lat\":30.546,\"lng\":-9.724,\"break_type\":\"Right-hand point break\",\"level\":\"Intermediate to advanced\",\"url\":\"https:\\\/\\\/bestplacestosurfing.com\\\/fr\\\/anchor-point\\\/\",\"map_url\":\"https:\\\/\\\/maps.googleapis.com\\\/maps\\\/api\\\/staticmap?center=30.546,-9.724&zoom=15&size=640x360&scale=2&maptype=satellite&markers=color:red|30.546,-9.724&key=AIzaSyDo7Nm3s_u7fFyZ_VGNhYWf8iizUxzEL5A\",\"wave_text\":\"0.7\\u20131.1m\",\"wave_rating\":4,\"distance_km\":null},{\"name\":\"Banana Point\",\"slug\":\"banana-point\",\"country\":\"Morocco\",\"region\":\"Aourir \\\/ Taghazout Bay\",\"area\":\"Souss-Massa\",\"lat\":30.50221,\"lng\":-9.68346,\"break_type\":\"Right-hand point break\",\"level\":\"Beginner to intermediate\",\"url\":\"https:\\\/\\\/bestplacestosurfing.com\\\/fr\\\/banana-point\\\/\",\"map_url\":\"https:\\\/\\\/maps.googleapis.com\\\/maps\\\/api\\\/staticmap?center=30.50221,-9.68346&zoom=15&size=640x360&scale=2&maptype=satellite&markers=color:red|30.50221,-9.68346&key=AIzaSyDo7Nm3s_u7fFyZ_VGNhYWf8iizUxzEL5A\",\"wave_text\":\"0.7\\u20131.1m\",\"wave_rating\":5,\"distance_km\":null},{\"name\":\"Uluwatu\",\"slug\":\"uluwatu\",\"country\":\"Indonesia\",\"region\":\"Bali\",\"area\":\"Bukit Peninsula\",\"lat\":-8.829,\"lng\":115.084,\"break_type\":\"Left-hand reef system\",\"level\":\"Advanced\",\"url\":\"https:\\\/\\\/bestplacestosurfing.com\\\/fr\\\/uluwatu\\\/\",\"map_url\":\"https:\\\/\\\/maps.googleapis.com\\\/maps\\\/api\\\/staticmap?center=-8.829,115.084&zoom=15&size=640x360&scale=2&maptype=satellite&markers=color:red|-8.829,115.084&key=AIzaSyDo7Nm3s_u7fFyZ_VGNhYWf8iizUxzEL5A\",\"wave_text\":\"1.7\\u20132.5m\",\"wave_rating\":5,\"distance_km\":null},{\"name\":\"Lower Trestles\",\"slug\":\"lower-trestles\",\"country\":\"United States\",\"region\":\"San Clemente\",\"area\":\"California\",\"lat\":33.385,\"lng\":-117.593,\"break_type\":\"Cobblestone reef peak\",\"level\":\"Intermediate to advanced\",\"url\":\"https:\\\/\\\/bestplacestosurfing.com\\\/fr\\\/lower-trestles\\\/\",\"map_url\":\"https:\\\/\\\/maps.googleapis.com\\\/maps\\\/api\\\/staticmap?center=33.385,-117.593&zoom=15&size=640x360&scale=2&maptype=satellite&markers=color:red|33.385,-117.593&key=AIzaSyDo7Nm3s_u7fFyZ_VGNhYWf8iizUxzEL5A\",\"wave_text\":\"0.8\\u20131.2m\",\"wave_rating\":2,\"distance_km\":null}];\n                const esc=v=>String(v??'').replace(\/[&<>\"']\/g,m=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#039;'}[m]));\n                const compass=d=>{if(!Number.isFinite(Number(d)))return '\u2014';return ['N','NE','E','SE','S','SW','W','NW'][Math.round((((Number(d)%360)+360)%360)\/45)%8]};\n                const condition=n=>{const score=Math.max(0,Math.min(5,Number(n)||0));const labels=['UPDATING','VERY POOR','POOR','POOR TO FAIR','FAIR','FAIR TO GOOD'];const colors=['#8d96a6','#d84a3a','#f07825','#f2b90b','#22a879','#0c9364'];return {score,label:labels[score],color:colors[score]};};\n                const rating=n=>condition(n).label;\n                const conditionMarkup=n=>{const c=condition(n);return `<div class=\"bpts-ny-condition\" style=\"--condition-color:${c.color}\"><span class=\"bpts-ny-condition-label\">${esc(c.label)}<\/span><span class=\"bpts-ny-condition-bars\" aria-hidden=\"true\">${[1,2,3,4,5].map(i=>`<i class=\"${i<=c.score?'on':''}\"><\/i>`).join('')}<\/span><\/div>`;};\n                const clamp=(v,min,max)=>Math.max(min,Math.min(max,v));\n                const angleDiff=(a,b)=>{a=Number(a);b=Number(b);if(!Number.isFinite(a)||!Number.isFinite(b))return 180;return Math.abs((((a-b)+540)%360)-180);};\n                function waveSuitability(h,p={}){h=Number(h);if(!Number.isFinite(h))return 35;const min=Number(p.waveMin??.3),idealMin=Number(p.waveIdealMin??.6),idealMax=Number(p.waveIdealMax??1.6),max=Number(p.waveMax??2.5);if(h<min)return clamp(10+(h\/Math.max(min,.01))*35,10,45);if(h<idealMin)return 50+((h-min)\/Math.max(idealMin-min,.01))*50;if(h<=idealMax)return 100;if(h<=max)return 100-((h-idealMax)\/Math.max(max-idealMax,.01))*50;return clamp(50-((h-max)\/Math.max(max,.01))*35,15,50);}\n                function periodSuitability(period,p={}){period=Number(period);if(!Number.isFinite(period))return 45;const good=Number(p.periodGood??10),great=Number(p.periodGreat??13);if(period<6)return 20;if(period<8)return 35+((period-6)\/2)*20;if(period<good)return 55+((period-8)\/Math.max(good-8,.1))*20;if(period<great)return 75+((period-good)\/Math.max(great-good,.1))*25;return 100;}\n                function swellSuitability(dir,p={}){dir=Number(dir);if(!Number.isFinite(dir))return 45;const target=Number(p.swellDir??300),good=Number(p.swellGoodTol??40),okay=Number(p.swellOkayTol??75),diff=angleDiff(dir,target);if(diff<=20)return 100;if(diff<=good)return 100-((diff-20)\/Math.max(good-20,1))*15;if(diff<=okay)return 85-((diff-good)\/Math.max(okay-good,1))*35;return clamp(50-(diff-okay)*.45,15,50);}\n                function windSuitability(dir,speedMs,p={}){dir=Number(dir);const speed=Number(speedMs)*3.6,wind=Number.isFinite(speed)?speed:18;let speedScore=100;if(wind<=8)speedScore=100;else if(wind<=15)speedScore=100-(wind-8)*1.7;else if(wind<=22)speedScore=88-(wind-15)*2.8;else if(wind<=30)speedScore=68-(wind-22)*4;else speedScore=clamp(36-(wind-30)*2,10,36);let dirScore=55;if(Number.isFinite(dir)){const target=Number(p.offshoreDir??80),good=Number(p.offshoreGoodTol??45),okay=Number(p.offshoreOkayTol??90),diff=angleDiff(dir,target);if(diff<=good)dirScore=100;else if(diff<=okay)dirScore=100-((diff-good)\/Math.max(okay-good,1))*40;else dirScore=clamp(45-(diff-okay)*.35,15,45);}let score=speedScore*.58+dirScore*.42;const outside=Number.isFinite(dir)&&angleDiff(dir,Number(p.offshoreDir??80))>Number(p.offshoreOkayTol??90);if(outside&&wind>10)score=Math.min(score,48);if(outside&&wind>20)score=Math.min(score,28);return clamp(score,10,100);}\n                function liveCondition(h,p={}){const period=Number.isFinite(Number(h.swellPeriod))?Number(h.swellPeriod):Number(h.wavePeriod),swellDir=Number.isFinite(Number(h.swellDirection))?Number(h.swellDirection):Number(h.waveDirection);const total=waveSuitability(h.waveHeight,p)*.35+periodSuitability(period,p)*.20+swellSuitability(swellDir,p)*.20+windSuitability(h.windDirection,h.windSpeed,p)*.25;let score=1;if(total>=82)score=5;else if(total>=68)score=4;else if(total>=52)score=3;else if(total>=35)score=2;const c=condition(score);return {...c,total:Math.round(total)};}\n                function card(s){const place=[s.region||s.area,s.country].filter(Boolean).join(' \u00b7 '),map=s.map_url?`<img decoding=\"async\" src=\"${esc(s.map_url)}\" alt=\"Satellite map of ${esc(s.name)}\" loading=\"lazy\">`:'';return `<a class=\"bpts-ny-card\" href=\"${esc(s.url)}\" data-slug=\"${esc(s.slug)}\"><div class=\"bpts-ny-map\">${map}<span class=\"bpts-ny-rating\">${esc(rating(s.wave_rating))}<\/span><div class=\"bpts-ny-map-copy\"><strong>${esc(s.name)}<\/strong><span>${esc(place)}<\/span><\/div><\/div><div class=\"bpts-ny-body\"><div class=\"bpts-ny-place\">${esc(place)}<\/div><div class=\"bpts-ny-name\">${esc(s.name)}<\/div><div class=\"bpts-ny-wave-row\"><div class=\"bpts-ny-wave\"><span data-wave>\u2014<\/span><small>m<\/small><\/div><div class=\"bpts-ny-swell\" data-swell><strong>\u2014<\/strong> \u00b7 \u2014 sec<br>Swell \u2014<\/div><\/div><div class=\"bpts-ny-details\"><div class=\"bpts-ny-detail\"><span>Distance<\/span><strong>${s.distance_km!=null?esc(s.distance_km+' km'):'Nearby'}<\/strong><\/div><div class=\"bpts-ny-detail\"><span>Condition rating<\/span><div data-rating>${conditionMarkup(s.wave_rating)}<\/div><\/div><\/div><div class=\"bpts-ny-cta\">View Full Forecast \u2192<\/div><\/div><\/a>`}\n                function nearest(hours){if(!Array.isArray(hours)||!hours.length)return null;const now=Date.now();return hours.reduce((b,h)=>Math.abs(Date.parse(h.time)-now)<Math.abs(Date.parse(b.time)-now)?h:b,hours[0])}\n                async function hydrate(s){const el=grid.querySelector(`[data-slug=\"${CSS.escape(s.slug)}\"]`);if(!el)return;try{const u=new URL(forecast);u.searchParams.set('spot',s.slug);const r=await fetch(u,{credentials:'same-origin',cache:'no-store'});if(!r.ok)throw 0;const j=await r.json();if(!j||!j.ok)throw 0;const h=nearest(j.weather);if(h){if(Number.isFinite(Number(h.waveHeight))){const min=Math.max(0,Number(h.waveHeight)*.72),max=Math.max(0,Number(h.waveHeight)*1.08);el.querySelector('[data-wave]').textContent=`${min.toFixed(1)}\u2013${max.toFixed(1)}`;}const sh=Number.isFinite(Number(h.swellHeight))?Number(h.swellHeight).toFixed(1)+'m':'\u2014',sp=Number.isFinite(Number(h.swellPeriod))?Math.round(Number(h.swellPeriod)):'\u2014';el.querySelector('[data-swell]').innerHTML=`<strong>${esc(compass(h.swellDirection))}<\/strong> \u00b7 ${esc(sp)} sec<br>Swell ${esc(sh)}`;const c=liveCondition(h,(j.spot&&j.spot.profile)||{}),ratingBox=el.querySelector('[data-rating]'),ratingBadge=el.querySelector('.bpts-ny-rating');if(ratingBox)ratingBox.innerHTML=conditionMarkup(c.score);if(ratingBadge){ratingBadge.textContent=c.label;ratingBadge.style.background=c.color;ratingBadge.title=`Live condition score ${c.total}\/100`;}}}catch(e){}}\n                function render(spots){if(!Array.isArray(spots)||!spots.length)return;grid.innerHTML=spots.map(card).join('');spots.forEach(hydrate)}\n                async function requestNearby(coords){try{const body=new URLSearchParams();body.set('action','bpts_nearby_spots');body.set('limit',String(limit));body.set('lat',String(coords.lat));body.set('lng',String(coords.lng));const r=await fetch(ajaxUrl,{method:'POST',headers:{'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8'},body:body.toString(),credentials:'same-origin',cache:'no-store'});if(!r.ok)throw new Error('HTTP '+r.status);const j=await r.json();const spots=j&&j.success&&j.data&&Array.isArray(j.data.results)?j.data.results:[];if(!spots.length)throw new Error('No spots');render(spots);copy.textContent='Showing the closest surf spots to your current location.';btn.textContent='Refresh location';return true;}catch(e){copy.textContent='Could not update nearby spots. Showing live database spots instead.';btn.textContent='Refresh location';return false;}}\n                function locate(){if(!navigator.geolocation){copy.textContent='Location is not available in this browser. Showing live database spots.';return;}copy.textContent='Detecting your location\u2026';btn.textContent='Finding location\u2026';navigator.geolocation.getCurrentPosition(p=>requestNearby({lat:p.coords.latitude,lng:p.coords.longitude}),e=>{btn.textContent='Use my location';copy.textContent=e&&e.code===1?'Location permission is off. Showing live database spots.':'Could not detect your location. Showing live database spots.';},{enableHighAccuracy:false,timeout:10000,maximumAge:600000});}\n                render(fallback);\n                btn.addEventListener('click',locate);\n                setTimeout(locate,250);\n            })();\n            <\/script>\n        <\/section>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4513646 e-con-full e-flex e-con e-parent\" data-id=\"4513646\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a1909ec elementor-widget elementor-widget-html\" data-id=\"a1909ec\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- BEST PLACES TO SURFING \u2014 SURF HOLIDAYS \/ SEARCH-RESULT CARD DESIGN v3 -->\r\n<section id=\"bpts-surf-holidays\">\r\n\r\n<style>\r\n#bpts-surf-holidays,\r\n#bpts-surf-holidays * {\r\n    box-sizing: border-box;\r\n}\r\n\r\n#bpts-surf-holidays {\r\n    width: 100%;\r\n    padding: 86px 0 92px;\r\n    background: #f6f6f3;\r\n    color: #111;\r\n    font-family: Arial, Helvetica, sans-serif;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-holidays-inner {\r\n    width: min(1450px, calc(100% - 48px));\r\n    margin: 0 auto;\r\n}\r\n\r\n\/* Section header *\/\r\n#bpts-surf-holidays .bpts-holidays-top {\r\n    display: flex;\r\n    align-items: flex-end;\r\n    justify-content: space-between;\r\n    gap: 30px;\r\n    margin-bottom: 34px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-kicker {\r\n    margin: 0 0 8px;\r\n    color: #777;\r\n    font-size: 12px;\r\n    font-weight: 800;\r\n    letter-spacing: 1.5px;\r\n    text-transform: uppercase;\r\n}\r\n\r\n#bpts-surf-holidays h2 {\r\n    margin: 0;\r\n    color: #111 !important;\r\n    font-size: clamp(34px, 4vw, 52px);\r\n    line-height: 1;\r\n    letter-spacing: -2px;\r\n    font-weight: 800;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-description {\r\n    max-width: 680px;\r\n    margin: 12px 0 0;\r\n    color: #777;\r\n    font-size: 15px;\r\n    line-height: 1.6;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-view-all {\r\n    flex-shrink: 0;\r\n    color: #111 !important;\r\n    text-decoration: none !important;\r\n    font-size: 13px;\r\n    font-weight: 800;\r\n}\r\n\r\n\/* Same marketplace grid used in the trip-search results *\/\r\n#bpts-surf-holidays .bpts-package-grid {\r\n    width: 100%;\r\n    display: grid;\r\n    grid-template-columns: repeat(4, minmax(0, 1fr));\r\n    gap: 20px;\r\n    align-items: stretch;\r\n}\r\n\r\n#bpts-surf-holidays article.bpts-package-card {\r\n    width: 100%;\r\n    min-width: 0;\r\n    margin: 0;\r\n    padding: 0;\r\n    display: flex;\r\n    flex-direction: column;\r\n    overflow: hidden;\r\n    position: relative;\r\n    border: 1px solid #dfe2e7;\r\n    border-radius: 0;\r\n    background: #fff;\r\n    color: #111;\r\n    box-shadow: none;\r\n    cursor: pointer;\r\n    transition: box-shadow .2s ease;\r\n}\r\n\r\n#bpts-surf-holidays article.bpts-package-card:hover {\r\n    box-shadow: 0 8px 24px rgba(15, 23, 42, .08);\r\n}\r\n\r\n#bpts-surf-holidays article.bpts-package-card:focus-visible {\r\n    outline: 3px solid #4353CC;\r\n    outline-offset: 3px;\r\n}\r\n\r\n\/* Image *\/\r\n#bpts-surf-holidays .bpts-package-media {\r\n    width: 100%;\r\n    height: 220px;\r\n    min-height: 220px;\r\n    position: relative;\r\n    overflow: hidden;\r\n    background: #eceff2;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-cover-image {\r\n    width: 100%;\r\n    height: 100%;\r\n    display: block;\r\n    object-fit: cover;\r\n    margin: 0;\r\n    transition: transform .35s ease;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-card:hover .bpts-package-cover-image {\r\n    transform: scale(1.025);\r\n}\r\n\r\n\/* Favorite button *\/\r\n#bpts-surf-holidays .bpts-package-heart {\r\n    position: absolute;\r\n    z-index: 4;\r\n    top: 12px;\r\n    left: 12px;\r\n    width: 42px;\r\n    height: 42px;\r\n    min-width: 42px;\r\n    min-height: 42px;\r\n    margin: 0;\r\n    padding: 0;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    overflow: hidden;\r\n    border: 1px solid rgba(255,255,255,.2);\r\n    border-radius: 50%;\r\n    background: rgba(0,0,0,.35);\r\n    backdrop-filter: blur(5px);\r\n    color: #fff;\r\n    cursor: pointer;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-heart svg {\r\n    width: 20px;\r\n    height: 20px;\r\n    display: block;\r\n    fill: none;\r\n    stroke: currentColor;\r\n    stroke-width: 1.8;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-heart.is-saved {\r\n    background: #fff;\r\n    color: #e83b55;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-heart.is-saved svg {\r\n    fill: currentColor;\r\n}\r\n\r\n\/* Image badges *\/\r\n#bpts-surf-holidays .bpts-package-badges {\r\n    position: absolute;\r\n    z-index: 3;\r\n    left: 12px;\r\n    right: 12px;\r\n    bottom: 10px;\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: 6px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-badge {\r\n    min-height: 26px;\r\n    padding: 5px 10px;\r\n    display: inline-flex;\r\n    align-items: center;\r\n    border-radius: 999px;\r\n    background: #fff;\r\n    color: #111;\r\n    box-shadow: 0 2px 9px rgba(0,0,0,.08);\r\n    font-size: 11px;\r\n    font-weight: 700;\r\n}\r\n\r\n\/* Card content *\/\r\n#bpts-surf-holidays .bpts-package-content {\r\n    min-width: 0;\r\n    flex: 1;\r\n    display: flex;\r\n    flex-direction: column;\r\n    padding: 15px 18px 18px;\r\n    background: #fff;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-location {\r\n    margin: 0 0 8px;\r\n    color: #747887;\r\n    font-size: 12px;\r\n    line-height: 1.35;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-card h3 {\r\n    min-height: 48px;\r\n    margin: 0 0 10px;\r\n    color: #111 !important;\r\n    display: -webkit-box;\r\n    overflow: hidden;\r\n    -webkit-line-clamp: 2;\r\n    -webkit-box-orient: vertical;\r\n    font-size: 17px;\r\n    line-height: 1.38;\r\n    font-weight: 800;\r\n}\r\n\r\n\/* Rating row *\/\r\n#bpts-surf-holidays .bpts-package-rating {\r\n    min-height: 26px;\r\n    margin: 0 0 12px;\r\n    padding: 0 0 12px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: flex-end;\r\n    gap: 5px;\r\n    border-bottom: 1px solid #e6e8ec;\r\n    color: #111;\r\n    font-size: 11px;\r\n    white-space: nowrap;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-stars {\r\n    color: #f1bf28;\r\n    font-size: 14px;\r\n    letter-spacing: 0;\r\n}\r\n\r\n\/* 2 \u00d7 2 package facts *\/\r\n#bpts-surf-holidays .bpts-package-facts {\r\n    margin: 0 0 17px;\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 10px 12px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-fact {\r\n    min-width: 0;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 7px;\r\n    color: #111;\r\n    font-size: 12px;\r\n    line-height: 1.25;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-fact-icon {\r\n    width: 19px;\r\n    min-width: 19px;\r\n    height: 19px;\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    color: #111;\r\n    font-size: 14px;\r\n}\r\n\r\n\/* Interested counter *\/\r\n#bpts-surf-holidays .bpts-package-interest {\r\n    margin: 0 0 15px;\r\n    padding: 10px 0 0;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 7px;\r\n    border-top: 1px solid #eceef2;\r\n    color: #747887;\r\n    font-size: 11px;\r\n    line-height: 1.3;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-interest strong {\r\n    color: #111;\r\n    font-weight: 900;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-interest-icon {\r\n    width: 18px;\r\n    height: 18px;\r\n    min-width: 18px;\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    color: #4353CC;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-interest-icon svg {\r\n    width: 17px;\r\n    height: 17px;\r\n    display: block;\r\n    fill: none;\r\n    stroke: currentColor;\r\n    stroke-width: 1.8;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n}\r\n\r\n\/* Price and CTA *\/\r\n#bpts-surf-holidays .bpts-package-bottom {\r\n    margin-top: auto;\r\n    display: flex;\r\n    align-items: flex-end;\r\n    justify-content: space-between;\r\n    gap: 10px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-from {\r\n    margin: 0 0 4px;\r\n    color: #747887;\r\n    font-size: 11px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-price {\r\n    margin: 0;\r\n    color: #111;\r\n    font-size: 24px;\r\n    line-height: 1;\r\n    font-weight: 900;\r\n    text-align: left;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-btn {\r\n    min-height: 40px;\r\n    padding: 0 13px;\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    border-radius: 8px;\r\n    background: #4353CC;\r\n    color: #fff !important;\r\n    font-size: 11px;\r\n    font-weight: 900;\r\n    text-decoration: none !important;\r\n    white-space: nowrap;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-package-btn:hover {\r\n    filter: brightness(.94);\r\n}\r\n\r\n\/* Bottom CTA *\/\r\n#bpts-surf-holidays .bpts-holidays-bottom {\r\n    margin-top: 28px;\r\n    padding: 22px 24px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    gap: 20px;\r\n    border-radius: 12px;\r\n    background: #111;\r\n    color: #fff;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-holidays-bottom strong {\r\n    display: block;\r\n    margin-bottom: 3px;\r\n    font-size: 15px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-holidays-bottom span {\r\n    color: rgba(255,255,255,.72);\r\n    font-size: 12px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-bottom-button {\r\n    min-height: 44px;\r\n    padding: 0 17px;\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    border-radius: 7px;\r\n    background: #fff;\r\n    color: #111 !important;\r\n    text-decoration: none !important;\r\n    font-size: 11px;\r\n    font-weight: 800;\r\n    white-space: nowrap;\r\n}\r\n\r\n@media (max-width: 1100px) {\r\n    #bpts-surf-holidays .bpts-package-grid {\r\n        grid-template-columns: repeat(3, minmax(0, 1fr));\r\n    }\r\n}\r\n\r\n@media (max-width: 850px) {\r\n    #bpts-surf-holidays .bpts-package-grid {\r\n        grid-template-columns: repeat(2, minmax(0, 1fr));\r\n    }\r\n}\r\n\r\n@media (max-width: 700px) {\r\n    #bpts-surf-holidays {\r\n        padding: 60px 0 66px;\r\n    }\r\n\r\n    #bpts-surf-holidays .bpts-holidays-inner {\r\n        width: min(1450px, calc(100% - 28px));\r\n    }\r\n\r\n    #bpts-surf-holidays .bpts-holidays-top {\r\n        align-items: flex-start;\r\n        flex-direction: column;\r\n        gap: 16px;\r\n    }\r\n\r\n    #bpts-surf-holidays .bpts-package-grid {\r\n        grid-template-columns: 1fr;\r\n    }\r\n\r\n    #bpts-surf-holidays .bpts-package-media {\r\n        height: 240px;\r\n        min-height: 240px;\r\n    }\r\n\r\n    #bpts-surf-holidays .bpts-holidays-bottom {\r\n        align-items: flex-start;\r\n        flex-direction: column;\r\n    }\r\n\r\n    #bpts-surf-holidays .bpts-bottom-button {\r\n        width: 100%;\r\n    }\r\n}\r\n<\/style>\r\n\r\n<div class=\"bpts-holidays-inner\">\r\n    <div class=\"bpts-holidays-top\">\r\n        <div>\r\n            <p class=\"bpts-kicker\">Surf travel<\/p>\r\n            <h2>Book your next surf trip<\/h2>\r\n            <p class=\"bpts-description\">Discover surf camps, surf coaching and all-inclusive surf holidays in some of the world's best surf destinations.<\/p>\r\n        <\/div>\r\n        <a href=\"\/surf-camps\/\" class=\"bpts-view-all\">View all surf holidays \u2192<\/a>\r\n    <\/div>\r\n\r\n    <div class=\"bpts-package-grid\">\r\n\r\n        <!-- Morocco -->\r\n        <article class=\"bpts-package-card\" data-package-url=\"\/surf-camps\/morocco\/\" role=\"link\" tabindex=\"0\" aria-label=\"View Surf and Yoga Holiday in Morocco\">\r\n            <div class=\"bpts-package-media\">\r\n                <img decoding=\"async\" class=\"bpts-package-cover-image\" src=\"https:\/\/images.unsplash.com\/photo-1502680390469-be75c86b636f?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\" alt=\"Morocco surf and yoga holiday\" loading=\"lazy\">\r\n                <button class=\"bpts-package-heart\" type=\"button\" aria-label=\"Save package\" title=\"Save package\">\r\n                    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78L12 21.23l8.84-8.84a5.5 5.5 0 0 0 0-7.78Z\"><\/path><\/svg>\r\n                <\/button>\r\n                <div class=\"bpts-package-badges\">\r\n                    <span class=\"bpts-package-badge\">Best seller<\/span>\r\n                    <span class=\"bpts-package-badge\">Surf + Yoga<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"bpts-package-content\">\r\n                <div class=\"bpts-package-location\">Taghazout Bay \u00b7 Morocco<\/div>\r\n                <h3>Surf &amp; Yoga Holiday<\/h3>\r\n                <div class=\"bpts-package-rating\">\r\n                    <span class=\"bpts-package-stars\">\u2605\u2605\u2605\u2605\u2605<\/span>\r\n                    <strong>5\/5<\/strong>\r\n                    <span>(3 reviews)<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-facts\">\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2659<\/span><span>Independent<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2248<\/span><span>Surf + Yoga<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25a1<\/span><span>7 days<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25d4<\/span><span>All levels<\/span><\/div>\r\n                <\/div>\r\n                <div class=\"bpts-package-interest\">\r\n                    <span class=\"bpts-package-interest-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"><\/path><circle cx=\"9\" cy=\"7\" r=\"4\"><\/circle><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"><\/path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"><\/path><\/svg><\/span>\r\n                    <span><strong>47<\/strong> people interested in this trip<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-bottom\">\r\n                    <div><div class=\"bpts-package-from\">From<\/div><div class=\"bpts-package-price\">\u20ac499<\/div><\/div>\r\n                    <a class=\"bpts-package-btn\" href=\"\/surf-camps\/morocco\/\">VIEW TRIP<\/a>\r\n                <\/div>\r\n            <\/div>\r\n        <\/article>\r\n\r\n        <!-- Bali -->\r\n        <article class=\"bpts-package-card\" data-package-url=\"\/surf-camps\/bali\/\" role=\"link\" tabindex=\"0\" aria-label=\"View Bali Surf Coaching Week\">\r\n            <div class=\"bpts-package-media\">\r\n                <img decoding=\"async\" class=\"bpts-package-cover-image\" src=\"https:\/\/images.unsplash.com\/photo-1537996194471-e657df975ab4?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\" alt=\"Bali surf coaching holiday\" loading=\"lazy\">\r\n                <button class=\"bpts-package-heart\" type=\"button\" aria-label=\"Save package\" title=\"Save package\">\r\n                    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78L12 21.23l8.84-8.84a5.5 5.5 0 0 0 0-7.78Z\"><\/path><\/svg>\r\n                <\/button>\r\n                <div class=\"bpts-package-badges\">\r\n                    <span class=\"bpts-package-badge\">Trending<\/span>\r\n                    <span class=\"bpts-package-badge\">Coaching<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"bpts-package-content\">\r\n                <div class=\"bpts-package-location\">Bali \u00b7 Indonesia<\/div>\r\n                <h3>Bali Surf Coaching Week<\/h3>\r\n                <div class=\"bpts-package-rating\">\r\n                    <span class=\"bpts-package-stars\">\u2605\u2605\u2605\u2605\u2605<\/span>\r\n                    <strong>4.8\/5<\/strong>\r\n                    <span>(65 reviews)<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-facts\">\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2659<\/span><span>Group<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2248<\/span><span>Surf coaching<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25a1<\/span><span>7 days<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25d4<\/span><span>Intermediate<\/span><\/div>\r\n                <\/div>\r\n                <div class=\"bpts-package-interest\">\r\n                    <span class=\"bpts-package-interest-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"><\/path><circle cx=\"9\" cy=\"7\" r=\"4\"><\/circle><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"><\/path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"><\/path><\/svg><\/span>\r\n                    <span><strong>32<\/strong> people interested in this trip<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-bottom\">\r\n                    <div><div class=\"bpts-package-from\">From<\/div><div class=\"bpts-package-price\">\u20ac599<\/div><\/div>\r\n                    <a class=\"bpts-package-btn\" href=\"\/surf-camps\/bali\/\">VIEW TRIP<\/a>\r\n                <\/div>\r\n            <\/div>\r\n        <\/article>\r\n\r\n        <!-- Portugal -->\r\n        <article class=\"bpts-package-card\" data-package-url=\"\/surf-camps\/portugal\/\" role=\"link\" tabindex=\"0\" aria-label=\"View Portugal Surf Camp\">\r\n            <div class=\"bpts-package-media\">\r\n                <img decoding=\"async\" class=\"bpts-package-cover-image\" src=\"https:\/\/images.unsplash.com\/photo-1555881400-74d7acaacd8b?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\" alt=\"Portugal surf camp\" loading=\"lazy\">\r\n                <button class=\"bpts-package-heart\" type=\"button\" aria-label=\"Save package\" title=\"Save package\">\r\n                    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78L12 21.23l8.84-8.84a5.5 5.5 0 0 0 0-7.78Z\"><\/path><\/svg>\r\n                <\/button>\r\n                <div class=\"bpts-package-badges\">\r\n                    <span class=\"bpts-package-badge\">Popular<\/span>\r\n                    <span class=\"bpts-package-badge\">Surf camp<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"bpts-package-content\">\r\n                <div class=\"bpts-package-location\">Portugal \u00b7 Atlantic Coast<\/div>\r\n                <h3>Portugal Surf Camp<\/h3>\r\n                <div class=\"bpts-package-rating\">\r\n                    <span class=\"bpts-package-stars\">\u2605\u2605\u2605\u2605\u2605<\/span>\r\n                    <strong>4.9\/5<\/strong>\r\n                    <span>(15 reviews)<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-facts\">\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2659<\/span><span>Group<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2248<\/span><span>Surf lessons<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25a1<\/span><span>5 days<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25d4<\/span><span>All levels<\/span><\/div>\r\n                <\/div>\r\n                <div class=\"bpts-package-interest\">\r\n                    <span class=\"bpts-package-interest-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"><\/path><circle cx=\"9\" cy=\"7\" r=\"4\"><\/circle><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"><\/path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"><\/path><\/svg><\/span>\r\n                    <span><strong>22<\/strong> people interested in this trip<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-bottom\">\r\n                    <div><div class=\"bpts-package-from\">From<\/div><div class=\"bpts-package-price\">\u20ac449<\/div><\/div>\r\n                    <a class=\"bpts-package-btn\" href=\"\/surf-camps\/portugal\/\">VIEW TRIP<\/a>\r\n                <\/div>\r\n            <\/div>\r\n        <\/article>\r\n\r\n        <!-- Costa Rica -->\r\n        <article class=\"bpts-package-card\" data-package-url=\"\/surf-camps\/costa-rica\/\" role=\"link\" tabindex=\"0\" aria-label=\"View Costa Rica Tropical Surf Escape\">\r\n            <div class=\"bpts-package-media\">\r\n                <img decoding=\"async\" class=\"bpts-package-cover-image\" src=\"https:\/\/images.unsplash.com\/photo-1518509562904-e7ef99cdcc86?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\" alt=\"Costa Rica tropical surf holiday\" loading=\"lazy\">\r\n                <button class=\"bpts-package-heart\" type=\"button\" aria-label=\"Save package\" title=\"Save package\">\r\n                    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78L12 21.23l8.84-8.84a5.5 5.5 0 0 0 0-7.78Z\"><\/path><\/svg>\r\n                <\/button>\r\n                <div class=\"bpts-package-badges\">\r\n                    <span class=\"bpts-package-badge\">Adventure<\/span>\r\n                    <span class=\"bpts-package-badge\">Tropical<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"bpts-package-content\">\r\n                <div class=\"bpts-package-location\">Santa Teresa \u00b7 Costa Rica<\/div>\r\n                <h3>Tropical Surf Escape<\/h3>\r\n                <div class=\"bpts-package-rating\">\r\n                    <span class=\"bpts-package-stars\">\u2605\u2605\u2605\u2605\u2605<\/span>\r\n                    <strong>4.9\/5<\/strong>\r\n                    <span>(28 reviews)<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-facts\">\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2659<\/span><span>Small group<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2248<\/span><span>Daily surfing<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25a1<\/span><span>8 days<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25d4<\/span><span>All levels<\/span><\/div>\r\n                <\/div>\r\n                <div class=\"bpts-package-interest\">\r\n                    <span class=\"bpts-package-interest-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"><\/path><circle cx=\"9\" cy=\"7\" r=\"4\"><\/circle><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"><\/path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"><\/path><\/svg><\/span>\r\n                    <span><strong>38<\/strong> people interested in this trip<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-bottom\">\r\n                    <div><div class=\"bpts-package-from\">From<\/div><div class=\"bpts-package-price\">\u20ac749<\/div><\/div>\r\n                    <a class=\"bpts-package-btn\" href=\"\/surf-camps\/costa-rica\/\">VIEW TRIP<\/a>\r\n                <\/div>\r\n            <\/div>\r\n        <\/article>\r\n\r\n        <!-- Sri Lanka -->\r\n        <article class=\"bpts-package-card\" data-package-url=\"\/surf-camps\/sri-lanka\/\" role=\"link\" tabindex=\"0\" aria-label=\"View Sri Lanka Surf and Stay Week\">\r\n            <div class=\"bpts-package-media\">\r\n                <img decoding=\"async\" class=\"bpts-package-cover-image\" src=\"https:\/\/images.unsplash.com\/photo-1586861635167-e5223aadc9fe?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\" alt=\"Sri Lanka surf and stay holiday\" loading=\"lazy\">\r\n                <button class=\"bpts-package-heart\" type=\"button\" aria-label=\"Save package\" title=\"Save package\">\r\n                    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78L12 21.23l8.84-8.84a5.5 5.5 0 0 0 0-7.78Z\"><\/path><\/svg>\r\n                <\/button>\r\n                <div class=\"bpts-package-badges\">\r\n                    <span class=\"bpts-package-badge\">Great value<\/span>\r\n                    <span class=\"bpts-package-badge\">Surf camp<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"bpts-package-content\">\r\n                <div class=\"bpts-package-location\">Weligama \u00b7 Sri Lanka<\/div>\r\n                <h3>Sri Lanka Surf &amp; Stay Week<\/h3>\r\n                <div class=\"bpts-package-rating\">\r\n                    <span class=\"bpts-package-stars\">\u2605\u2605\u2605\u2605\u2605<\/span>\r\n                    <strong>4.8\/5<\/strong>\r\n                    <span>(42 reviews)<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-facts\">\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2659<\/span><span>Group<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2248<\/span><span>Surf lessons<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25a1<\/span><span>7 days<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25d4<\/span><span>Beginner<\/span><\/div>\r\n                <\/div>\r\n                <div class=\"bpts-package-interest\">\r\n                    <span class=\"bpts-package-interest-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"><\/path><circle cx=\"9\" cy=\"7\" r=\"4\"><\/circle><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"><\/path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"><\/path><\/svg><\/span>\r\n                    <span><strong>51<\/strong> people interested in this trip<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-bottom\">\r\n                    <div><div class=\"bpts-package-from\">From<\/div><div class=\"bpts-package-price\">\u20ac399<\/div><\/div>\r\n                    <a class=\"bpts-package-btn\" href=\"\/surf-camps\/sri-lanka\/\">VIEW TRIP<\/a>\r\n                <\/div>\r\n            <\/div>\r\n        <\/article>\r\n\r\n        <!-- Canary Islands -->\r\n        <article class=\"bpts-package-card\" data-package-url=\"\/surf-camps\/canary-islands\/\" role=\"link\" tabindex=\"0\" aria-label=\"View Canary Islands Surf Coaching\">\r\n            <div class=\"bpts-package-media\">\r\n                <img decoding=\"async\" class=\"bpts-package-cover-image\" src=\"https:\/\/images.unsplash.com\/photo-1500530855697-b586d89ba3ee?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\" alt=\"Canary Islands surf coaching holiday\" loading=\"lazy\">\r\n                <button class=\"bpts-package-heart\" type=\"button\" aria-label=\"Save package\" title=\"Save package\">\r\n                    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78L12 21.23l8.84-8.84a5.5 5.5 0 0 0 0-7.78Z\"><\/path><\/svg>\r\n                <\/button>\r\n                <div class=\"bpts-package-badges\">\r\n                    <span class=\"bpts-package-badge\">Year-round<\/span>\r\n                    <span class=\"bpts-package-badge\">Coaching<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"bpts-package-content\">\r\n                <div class=\"bpts-package-location\">Fuerteventura \u00b7 Spain<\/div>\r\n                <h3>Canary Islands Surf Coaching<\/h3>\r\n                <div class=\"bpts-package-rating\">\r\n                    <span class=\"bpts-package-stars\">\u2605\u2605\u2605\u2605\u2605<\/span>\r\n                    <strong>4.7\/5<\/strong>\r\n                    <span>(19 reviews)<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-facts\">\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2659<\/span><span>Small group<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2248<\/span><span>Coaching<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25a1<\/span><span>6 days<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25d4<\/span><span>Intermediate<\/span><\/div>\r\n                <\/div>\r\n                <div class=\"bpts-package-interest\">\r\n                    <span class=\"bpts-package-interest-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"><\/path><circle cx=\"9\" cy=\"7\" r=\"4\"><\/circle><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"><\/path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"><\/path><\/svg><\/span>\r\n                    <span><strong>26<\/strong> people interested in this trip<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-bottom\">\r\n                    <div><div class=\"bpts-package-from\">From<\/div><div class=\"bpts-package-price\">\u20ac529<\/div><\/div>\r\n                    <a class=\"bpts-package-btn\" href=\"\/surf-camps\/canary-islands\/\">VIEW TRIP<\/a>\r\n                <\/div>\r\n            <\/div>\r\n        <\/article>\r\n\r\n        <!-- France -->\r\n        <article class=\"bpts-package-card\" data-package-url=\"\/surf-camps\/france\/\" role=\"link\" tabindex=\"0\" aria-label=\"View French Atlantic Surf Camp\">\r\n            <div class=\"bpts-package-media\">\r\n                <img decoding=\"async\" class=\"bpts-package-cover-image\" src=\"https:\/\/images.unsplash.com\/photo-1528150177508-7cc0c36cda5c?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\" alt=\"French Atlantic surf camp\" loading=\"lazy\">\r\n                <button class=\"bpts-package-heart\" type=\"button\" aria-label=\"Save package\" title=\"Save package\">\r\n                    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78L12 21.23l8.84-8.84a5.5 5.5 0 0 0 0-7.78Z\"><\/path><\/svg>\r\n                <\/button>\r\n                <div class=\"bpts-package-badges\">\r\n                    <span class=\"bpts-package-badge\">Summer<\/span>\r\n                    <span class=\"bpts-package-badge\">Surf camp<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"bpts-package-content\">\r\n                <div class=\"bpts-package-location\">Hossegor \u00b7 France<\/div>\r\n                <h3>French Atlantic Surf Camp<\/h3>\r\n                <div class=\"bpts-package-rating\">\r\n                    <span class=\"bpts-package-stars\">\u2605\u2605\u2605\u2605\u2605<\/span>\r\n                    <strong>4.9\/5<\/strong>\r\n                    <span>(31 reviews)<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-facts\">\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2659<\/span><span>Group<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2248<\/span><span>Surf lessons<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25a1<\/span><span>7 days<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25d4<\/span><span>All levels<\/span><\/div>\r\n                <\/div>\r\n                <div class=\"bpts-package-interest\">\r\n                    <span class=\"bpts-package-interest-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"><\/path><circle cx=\"9\" cy=\"7\" r=\"4\"><\/circle><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"><\/path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"><\/path><\/svg><\/span>\r\n                    <span><strong>35<\/strong> people interested in this trip<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-bottom\">\r\n                    <div><div class=\"bpts-package-from\">From<\/div><div class=\"bpts-package-price\">\u20ac649<\/div><\/div>\r\n                    <a class=\"bpts-package-btn\" href=\"\/surf-camps\/france\/\">VIEW TRIP<\/a>\r\n                <\/div>\r\n            <\/div>\r\n        <\/article>\r\n\r\n        <!-- South Africa -->\r\n        <article class=\"bpts-package-card\" data-package-url=\"\/surf-camps\/south-africa\/\" role=\"link\" tabindex=\"0\" aria-label=\"View South Africa Surf Adventure\">\r\n            <div class=\"bpts-package-media\">\r\n                <img decoding=\"async\" class=\"bpts-package-cover-image\" src=\"https:\/\/images.unsplash.com\/photo-1522441815192-d9f04eb0615c?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\" alt=\"South Africa surf adventure\" loading=\"lazy\">\r\n                <button class=\"bpts-package-heart\" type=\"button\" aria-label=\"Save package\" title=\"Save package\">\r\n                    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78L12 21.23l8.84-8.84a5.5 5.5 0 0 0 0-7.78Z\"><\/path><\/svg>\r\n                <\/button>\r\n                <div class=\"bpts-package-badges\">\r\n                    <span class=\"bpts-package-badge\">Adventure<\/span>\r\n                    <span class=\"bpts-package-badge\">Guiding<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"bpts-package-content\">\r\n                <div class=\"bpts-package-location\">Jeffreys Bay \u00b7 South Africa<\/div>\r\n                <h3>South Africa Surf Adventure<\/h3>\r\n                <div class=\"bpts-package-rating\">\r\n                    <span class=\"bpts-package-stars\">\u2605\u2605\u2605\u2605\u2605<\/span>\r\n                    <strong>4.9\/5<\/strong>\r\n                    <span>(24 reviews)<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-facts\">\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2659<\/span><span>Guided<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u2248<\/span><span>Surf guiding<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25a1<\/span><span>8 days<\/span><\/div>\r\n                    <div class=\"bpts-package-fact\"><span class=\"bpts-package-fact-icon\" aria-hidden=\"true\">\u25d4<\/span><span>Advanced<\/span><\/div>\r\n                <\/div>\r\n                <div class=\"bpts-package-interest\">\r\n                    <span class=\"bpts-package-interest-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"><\/path><circle cx=\"9\" cy=\"7\" r=\"4\"><\/circle><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"><\/path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"><\/path><\/svg><\/span>\r\n                    <span><strong>29<\/strong> people interested in this trip<\/span>\r\n                <\/div>\r\n                <div class=\"bpts-package-bottom\">\r\n                    <div><div class=\"bpts-package-from\">From<\/div><div class=\"bpts-package-price\">\u20ac699<\/div><\/div>\r\n                    <a class=\"bpts-package-btn\" href=\"\/surf-camps\/south-africa\/\">VIEW TRIP<\/a>\r\n                <\/div>\r\n            <\/div>\r\n        <\/article>\r\n    <\/div>\r\n\r\n    <div class=\"bpts-holidays-bottom\">\r\n        <div>\r\n            <strong>Looking for the right surf holiday?<\/strong>\r\n            <span>Browse surf camps by destination, level, duration and package type.<\/span>\r\n        <\/div>\r\n        <a href=\"\/surf-camps\/\" class=\"bpts-bottom-button\">Explore All Surf Holidays \u2192<\/a>\r\n    <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function () {\r\n    \"use strict\";\r\n\r\n    const root = document.getElementById(\"bpts-surf-holidays\");\r\n    if (!root) return;\r\n\r\n    const storageKey = \"bpts-saved-home-packages\";\r\n    let saved = [];\r\n\r\n    try {\r\n        const stored = JSON.parse(window.localStorage.getItem(storageKey) || \"[]\");\r\n        saved = Array.isArray(stored) ? stored : [];\r\n    } catch (error) {\r\n        saved = [];\r\n    }\r\n\r\n    function setHeart(button, active) {\r\n        button.classList.toggle(\"is-saved\", active);\r\n        button.setAttribute(\"aria-pressed\", active ? \"true\" : \"false\");\r\n        button.setAttribute(\"aria-label\", active ? \"Remove saved package\" : \"Save package\");\r\n        button.setAttribute(\"title\", active ? \"Remove saved package\" : \"Save package\");\r\n    }\r\n\r\n    root.querySelectorAll(\".bpts-package-card[data-package-url]\").forEach(function (card) {\r\n        const url = card.getAttribute(\"data-package-url\");\r\n        const heart = card.querySelector(\".bpts-package-heart\");\r\n        if (heart) setHeart(heart, saved.includes(url));\r\n    });\r\n\r\n    root.addEventListener(\"click\", function (event) {\r\n        const heart = event.target.closest(\".bpts-package-heart\");\r\n\r\n        if (heart) {\r\n            event.preventDefault();\r\n            event.stopPropagation();\r\n\r\n            const card = heart.closest(\".bpts-package-card[data-package-url]\");\r\n            if (!card) return;\r\n\r\n            const url = card.getAttribute(\"data-package-url\");\r\n            const index = saved.indexOf(url);\r\n\r\n            if (index === -1) saved.push(url);\r\n            else saved.splice(index, 1);\r\n\r\n            try {\r\n                window.localStorage.setItem(storageKey, JSON.stringify(saved));\r\n            } catch (error) {}\r\n\r\n            setHeart(heart, saved.includes(url));\r\n            return;\r\n        }\r\n\r\n        const card = event.target.closest(\".bpts-package-card[data-package-url]\");\r\n        if (card && !event.target.closest(\"a, button\")) {\r\n            window.location.href = card.getAttribute(\"data-package-url\");\r\n        }\r\n    });\r\n\r\n    root.addEventListener(\"keydown\", function (event) {\r\n        const card = event.target.closest(\".bpts-package-card[data-package-url]\");\r\n        if (!card || event.target !== card) return;\r\n\r\n        if (event.key === \"Enter\" || event.key === \" \") {\r\n            event.preventDefault();\r\n            window.location.href = card.getAttribute(\"data-package-url\");\r\n        }\r\n    });\r\n})();\r\n<\/script>\r\n\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-da3d063 e-con-full e-flex e-con e-parent\" data-id=\"da3d063\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3deccf1 elementor-widget elementor-widget-html\" data-id=\"3deccf1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"bpts-guides\">\r\n\r\n<style>\r\n\r\n\/* =========================================================\r\n   BASE\r\n========================================================= *\/\r\n\r\n#bpts-guides,\r\n#bpts-guides * {\r\n    box-sizing: border-box;\r\n}\r\n\r\n#bpts-guides {\r\n    width: 100%;\r\n    padding: 86px 0 92px;\r\n\r\n    background: #f6f6f3;\r\n    color: #111;\r\n\r\n    font-family:\r\n        Arial,\r\n        Helvetica,\r\n        sans-serif;\r\n}\r\n\r\n#bpts-guides .bpts-guides-inner {\r\n    width: min(\r\n        1450px,\r\n        calc(100% - 48px)\r\n    );\r\n\r\n    margin: 0 auto;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   SECTION HEADER\r\n========================================================= *\/\r\n\r\n#bpts-guides .bpts-guides-top {\r\n    display: flex;\r\n    align-items: flex-end;\r\n    justify-content: space-between;\r\n\r\n    gap: 30px;\r\n\r\n    margin-bottom: 34px;\r\n}\r\n\r\n#bpts-guides .bpts-kicker {\r\n    margin-bottom: 8px;\r\n\r\n    color: #777;\r\n\r\n    font-size: 12px;\r\n    font-weight: 800;\r\n\r\n    letter-spacing: 1.5px;\r\n\r\n    text-transform: uppercase;\r\n}\r\n\r\n#bpts-guides h2 {\r\n    margin: 0;\r\n\r\n    color: #111 !important;\r\n\r\n    font-size: clamp(\r\n        34px,\r\n        4vw,\r\n        52px\r\n    );\r\n\r\n    line-height: 1;\r\n\r\n    letter-spacing: -2px;\r\n\r\n    font-weight: 800;\r\n}\r\n\r\n#bpts-guides .bpts-description {\r\n    max-width: 680px;\r\n\r\n    margin: 12px 0 0;\r\n\r\n    color: #777;\r\n\r\n    font-size: 15px;\r\n\r\n    line-height: 1.6;\r\n}\r\n\r\n#bpts-guides .bpts-view-all {\r\n    flex-shrink: 0;\r\n\r\n    color: #111 !important;\r\n\r\n    text-decoration: none !important;\r\n\r\n    font-size: 13px;\r\n\r\n    font-weight: 800;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   GRID\r\n========================================================= *\/\r\n\r\n#bpts-guides .bpts-guides-grid {\r\n    display: grid;\r\n\r\n    grid-template-columns:\r\n        1.35fr\r\n        1fr\r\n        1fr;\r\n\r\n    grid-template-rows:\r\n        255px\r\n        255px;\r\n\r\n    gap: 18px;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   CARD\r\n========================================================= *\/\r\n\r\n#bpts-guides .bpts-guide-card {\r\n    position: relative;\r\n\r\n    display: block;\r\n\r\n    overflow: hidden;\r\n\r\n    border-radius: 14px;\r\n\r\n    background: #222;\r\n\r\n    color: #fff !important;\r\n\r\n    text-decoration: none !important;\r\n}\r\n\r\n#bpts-guides .bpts-guide-card:first-child {\r\n    grid-row: span 2;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   IMAGE\r\n========================================================= *\/\r\n\r\n#bpts-guides .bpts-guide-card img {\r\n    width: 100%;\r\n    height: 100%;\r\n\r\n    display: block;\r\n\r\n    object-fit: cover;\r\n\r\n    transition:\r\n        transform .45s ease;\r\n}\r\n\r\n#bpts-guides .bpts-guide-card:hover img {\r\n    transform: scale(1.045);\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   OVERLAY\r\n========================================================= *\/\r\n\r\n#bpts-guides .bpts-guide-overlay {\r\n    position: absolute;\r\n    inset: 0;\r\n\r\n    background:\r\n        linear-gradient(\r\n            to top,\r\n            rgba(0,0,0,.88) 0%,\r\n            rgba(0,0,0,.48) 45%,\r\n            rgba(0,0,0,.08) 75%\r\n        );\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   CATEGORY BADGE\r\n========================================================= *\/\r\n\r\n#bpts-guides .bpts-guide-category {\r\n    position: absolute;\r\n\r\n    z-index: 3;\r\n\r\n    top: 14px;\r\n    left: 14px;\r\n\r\n    padding:\r\n        7px\r\n        10px;\r\n\r\n    border-radius: 50px;\r\n\r\n    background:\r\n        rgba(0,0,0,.72);\r\n\r\n    color: #fff;\r\n\r\n    font-size: 10px;\r\n\r\n    font-weight: 800;\r\n\r\n    text-transform: uppercase;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   CONTENT\r\n========================================================= *\/\r\n\r\n#bpts-guides .bpts-guide-content {\r\n    position: absolute;\r\n\r\n    z-index: 3;\r\n\r\n    left: 0;\r\n    right: 0;\r\n    bottom: 0;\r\n\r\n    padding: 23px;\r\n}\r\n\r\n#bpts-guides .bpts-guide-meta {\r\n    margin-bottom: 7px;\r\n\r\n    color:\r\n        rgba(255,255,255,.75);\r\n\r\n    font-size: 10px;\r\n\r\n    font-weight: 700;\r\n\r\n    letter-spacing: .8px;\r\n\r\n    text-transform: uppercase;\r\n}\r\n\r\n#bpts-guides .bpts-guide-title {\r\n    margin: 0 0 8px;\r\n\r\n    color: #fff !important;\r\n\r\n    font-size: 25px;\r\n\r\n    line-height: 1.05;\r\n\r\n    font-weight: 900;\r\n\r\n    letter-spacing: -.8px;\r\n}\r\n\r\n#bpts-guides .bpts-guide-text {\r\n    max-width: 460px;\r\n\r\n    margin: 0;\r\n\r\n    color:\r\n        rgba(255,255,255,.82);\r\n\r\n    font-size: 12px;\r\n\r\n    line-height: 1.45;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   FEATURED GUIDE\r\n========================================================= *\/\r\n\r\n#bpts-guides\r\n.bpts-guide-card:first-child\r\n.bpts-guide-content {\r\n    padding: 30px;\r\n}\r\n\r\n#bpts-guides\r\n.bpts-guide-card:first-child\r\n.bpts-guide-title {\r\n    font-size: 38px;\r\n}\r\n\r\n#bpts-guides\r\n.bpts-guide-card:first-child\r\n.bpts-guide-text {\r\n    font-size: 13px;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   BOTTOM TEXT CTA\r\n========================================================= *\/\r\n\r\n#bpts-guides .bpts-guides-bottom {\r\n    margin-top: 28px;\r\n\r\n    padding:\r\n        22px\r\n        24px;\r\n\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n\r\n    gap: 20px;\r\n\r\n    border:\r\n        1px solid\r\n        #e3e3df;\r\n\r\n    border-radius: 12px;\r\n\r\n    background: #fff;\r\n}\r\n\r\n#bpts-guides .bpts-guides-bottom strong {\r\n    display: block;\r\n\r\n    margin-bottom: 3px;\r\n\r\n    font-size: 15px;\r\n}\r\n\r\n#bpts-guides .bpts-guides-bottom span {\r\n    color: #777;\r\n\r\n    font-size: 12px;\r\n}\r\n\r\n#bpts-guides .bpts-bottom-button {\r\n    min-height: 44px;\r\n\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n\r\n    padding:\r\n        0\r\n        17px;\r\n\r\n    border-radius: 7px;\r\n\r\n    background: #111;\r\n\r\n    color: #fff !important;\r\n\r\n    text-decoration: none !important;\r\n\r\n    font-size: 11px;\r\n\r\n    font-weight: 800;\r\n\r\n    white-space: nowrap;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   TABLET\r\n========================================================= *\/\r\n\r\n@media(max-width:1050px) {\r\n\r\n    #bpts-guides .bpts-guides-grid {\r\n        grid-template-columns:\r\n            1fr\r\n            1fr;\r\n\r\n        grid-template-rows:\r\n            330px\r\n            240px\r\n            240px;\r\n    }\r\n\r\n    #bpts-guides .bpts-guide-card:first-child {\r\n        grid-column: span 2;\r\n        grid-row: auto;\r\n    }\r\n\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   MOBILE\r\n========================================================= *\/\r\n\r\n@media(max-width:700px) {\r\n\r\n    #bpts-guides {\r\n        padding:\r\n            60px\r\n            0\r\n            66px;\r\n    }\r\n\r\n    #bpts-guides .bpts-guides-inner {\r\n        width:\r\n            min(\r\n                100% - 28px,\r\n                1450px\r\n            );\r\n    }\r\n\r\n    #bpts-guides .bpts-guides-top {\r\n        align-items:\r\n            flex-start;\r\n\r\n        flex-direction:\r\n            column;\r\n\r\n        gap: 16px;\r\n    }\r\n\r\n    #bpts-guides .bpts-guides-grid {\r\n        grid-template-columns:\r\n            1fr;\r\n\r\n        grid-template-rows:\r\n            none;\r\n\r\n        gap: 14px;\r\n    }\r\n\r\n    #bpts-guides .bpts-guide-card,\r\n    #bpts-guides .bpts-guide-card:first-child {\r\n        grid-column: auto;\r\n        grid-row: auto;\r\n\r\n        min-height: 290px;\r\n    }\r\n\r\n    #bpts-guides .bpts-guide-card:first-child {\r\n        min-height: 360px;\r\n    }\r\n\r\n    #bpts-guides\r\n    .bpts-guide-card:first-child\r\n    .bpts-guide-title {\r\n        font-size: 32px;\r\n    }\r\n\r\n    #bpts-guides .bpts-guides-bottom {\r\n        align-items:\r\n            flex-start;\r\n\r\n        flex-direction:\r\n            column;\r\n    }\r\n\r\n    #bpts-guides .bpts-bottom-button {\r\n        width: 100%;\r\n    }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n\r\n\r\n<div class=\"bpts-guides-inner\">\r\n\r\n\r\n    <!-- =====================================================\r\n         HEADER\r\n    ====================================================== -->\r\n\r\n    <div class=\"bpts-guides-top\">\r\n\r\n        <div>\r\n\r\n            <div class=\"bpts-kicker\">\r\n                Learn & explore\r\n            <\/div>\r\n\r\n            <h2>\r\n                Surf guides\r\n            <\/h2>\r\n\r\n            <p class=\"bpts-description\">\r\n\r\n                Learn how to read surf forecasts,\r\n                discover new surf destinations and\r\n                improve your understanding of waves,\r\n                wind, swell and tides.\r\n\r\n            <\/p>\r\n\r\n        <\/div>\r\n\r\n\r\n        <a\r\n            href=\"\/surf-guides\/\"\r\n            class=\"bpts-view-all\"\r\n        >\r\n            View all surf guides \u2192\r\n        <\/a>\r\n\r\n    <\/div>\r\n\r\n\r\n\r\n    <!-- =====================================================\r\n         GUIDE GRID\r\n    ====================================================== -->\r\n\r\n    <div class=\"bpts-guides-grid\">\r\n\r\n\r\n        <!-- =================================================\r\n             HOW TO READ SURF FORECAST\r\n        ================================================== -->\r\n\r\n        <a\r\n            href=\"\/surf-guides\/how-to-read-a-surf-forecast\/\"\r\n            class=\"bpts-guide-card\"\r\n        >\r\n\r\n            <img decoding=\"async\"\r\n                src=\"https:\/\/images.unsplash.com\/photo-1502680390469-be75c86b636f?auto=format&fit=crop&w=1400&q=85\"\r\n                alt=\"Surfer reading ocean conditions\"\r\n                loading=\"lazy\"\r\n            >\r\n\r\n\r\n            <div class=\"bpts-guide-overlay\"><\/div>\r\n\r\n\r\n            <span class=\"bpts-guide-category\">\r\n                Surf forecast\r\n            <\/span>\r\n\r\n\r\n            <div class=\"bpts-guide-content\">\r\n\r\n                <div class=\"bpts-guide-meta\">\r\n                    Beginner guide \u00b7 8 min read\r\n                <\/div>\r\n\r\n\r\n                <h3 class=\"bpts-guide-title\">\r\n                    How to read a surf forecast\r\n                <\/h3>\r\n\r\n\r\n                <p class=\"bpts-guide-text\">\r\n\r\n                    Understand wave height, swell period,\r\n                    swell direction, wind and tides so you\r\n                    can choose the best time to surf.\r\n\r\n                <\/p>\r\n\r\n            <\/div>\r\n\r\n        <\/a>\r\n\r\n\r\n\r\n        <!-- =================================================\r\n             MOROCCO\r\n        ================================================== -->\r\n\r\n        <a\r\n            href=\"\/surf-guides\/best-surf-spots-morocco\/\"\r\n            class=\"bpts-guide-card\"\r\n        >\r\n\r\n            <img decoding=\"async\"\r\n                src=\"https:\/\/images.unsplash.com\/photo-1533130061792-64b345e4a833?auto=format&fit=crop&w=900&q=85\"\r\n                alt=\"Morocco surf coastline\"\r\n                loading=\"lazy\"\r\n            >\r\n\r\n\r\n            <div class=\"bpts-guide-overlay\"><\/div>\r\n\r\n\r\n            <span class=\"bpts-guide-category\">\r\n                Destinations\r\n            <\/span>\r\n\r\n\r\n            <div class=\"bpts-guide-content\">\r\n\r\n                <div class=\"bpts-guide-meta\">\r\n                    Morocco \u00b7 Surf guide\r\n                <\/div>\r\n\r\n\r\n                <h3 class=\"bpts-guide-title\">\r\n                    Best surf spots in Morocco\r\n                <\/h3>\r\n\r\n\r\n                <p class=\"bpts-guide-text\">\r\n\r\n                    Explore Taghazout, Imsouane,\r\n                    Safi and Morocco's most famous waves.\r\n\r\n                <\/p>\r\n\r\n            <\/div>\r\n\r\n        <\/a>\r\n\r\n\r\n\r\n        <!-- =================================================\r\n             BEGINNER\r\n        ================================================== -->\r\n\r\n        <a\r\n            href=\"\/surf-guides\/beginner-surf-guide\/\"\r\n            class=\"bpts-guide-card\"\r\n        >\r\n\r\n            <img decoding=\"async\"\r\n                src=\"https:\/\/images.unsplash.com\/photo-1455729552865-3658a5d39692?auto=format&fit=crop&w=900&q=85\"\r\n                alt=\"Beginner surfing lesson\"\r\n                loading=\"lazy\"\r\n            >\r\n\r\n\r\n            <div class=\"bpts-guide-overlay\"><\/div>\r\n\r\n\r\n            <span class=\"bpts-guide-category\">\r\n                Learn to surf\r\n            <\/span>\r\n\r\n\r\n            <div class=\"bpts-guide-content\">\r\n\r\n                <div class=\"bpts-guide-meta\">\r\n                    Beginners \u00b7 Surf basics\r\n                <\/div>\r\n\r\n\r\n                <h3 class=\"bpts-guide-title\">\r\n                    Beginner's guide to surfing\r\n                <\/h3>\r\n\r\n\r\n                <p class=\"bpts-guide-text\">\r\n\r\n                    Learn the essentials before your\r\n                    first surf session.\r\n\r\n                <\/p>\r\n\r\n            <\/div>\r\n\r\n        <\/a>\r\n\r\n\r\n\r\n        <!-- =================================================\r\n             BALI\r\n        ================================================== -->\r\n\r\n        <a\r\n            href=\"\/surf-guides\/best-time-to-surf-bali\/\"\r\n            class=\"bpts-guide-card\"\r\n        >\r\n\r\n            <img decoding=\"async\"\r\n                src=\"https:\/\/images.unsplash.com\/photo-1537996194471-e657df975ab4?auto=format&fit=crop&w=900&q=85\"\r\n                alt=\"Bali surf coastline\"\r\n                loading=\"lazy\"\r\n            >\r\n\r\n\r\n            <div class=\"bpts-guide-overlay\"><\/div>\r\n\r\n\r\n            <span class=\"bpts-guide-category\">\r\n                Bali\r\n            <\/span>\r\n\r\n\r\n            <div class=\"bpts-guide-content\">\r\n\r\n                <div class=\"bpts-guide-meta\">\r\n                    Season guide\r\n                <\/div>\r\n\r\n\r\n                <h3 class=\"bpts-guide-title\">\r\n                    Best time to surf in Bali\r\n                <\/h3>\r\n\r\n\r\n                <p class=\"bpts-guide-text\">\r\n\r\n                    Discover the best months,\r\n                    swell seasons and surf areas in Bali.\r\n\r\n                <\/p>\r\n\r\n            <\/div>\r\n\r\n        <\/a>\r\n\r\n\r\n\r\n        <!-- =================================================\r\n             TIDES\r\n        ================================================== -->\r\n\r\n        <a\r\n            href=\"\/surf-guides\/how-tides-affect-surfing\/\"\r\n            class=\"bpts-guide-card\"\r\n        >\r\n\r\n            <img decoding=\"async\"\r\n                src=\"https:\/\/images.unsplash.com\/photo-1500375592092-40eb2168fd21?auto=format&fit=crop&w=900&q=85\"\r\n                alt=\"Ocean waves and tides\"\r\n                loading=\"lazy\"\r\n            >\r\n\r\n\r\n            <div class=\"bpts-guide-overlay\"><\/div>\r\n\r\n\r\n            <span class=\"bpts-guide-category\">\r\n                Surf knowledge\r\n            <\/span>\r\n\r\n\r\n            <div class=\"bpts-guide-content\">\r\n\r\n                <div class=\"bpts-guide-meta\">\r\n                    Forecast basics\r\n                <\/div>\r\n\r\n\r\n                <h3 class=\"bpts-guide-title\">\r\n                    How tides affect surfing\r\n                <\/h3>\r\n\r\n\r\n                <p class=\"bpts-guide-text\">\r\n\r\n                    Learn why some surf spots work best\r\n                    at low, mid or high tide.\r\n\r\n                <\/p>\r\n\r\n            <\/div>\r\n\r\n        <\/a>\r\n\r\n\r\n    <\/div>\r\n\r\n\r\n\r\n    <!-- =====================================================\r\n         BOTTOM CTA\r\n    ====================================================== -->\r\n\r\n    <div class=\"bpts-guides-bottom\">\r\n\r\n        <div>\r\n\r\n            <strong>\r\n                Want to understand surf conditions better?\r\n            <\/strong>\r\n\r\n            <span>\r\n\r\n                Explore destination guides,\r\n                forecast explanations and surfing tips.\r\n\r\n            <\/span>\r\n\r\n        <\/div>\r\n\r\n\r\n        <a\r\n            href=\"\/surf-guides\/\"\r\n            class=\"bpts-bottom-button\"\r\n        >\r\n            Explore All Guides \u2192\r\n        <\/a>\r\n\r\n    <\/div>\r\n\r\n\r\n<\/div>\r\n\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f79e5b0 e-con-full e-flex e-con e-parent\" data-id=\"f79e5b0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-45f35d2 elementor-widget elementor-widget-html\" data-id=\"45f35d2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"bpts-surf-alerts\">\r\n\r\n<style>\r\n\r\n\/* =========================================================\r\n   BASE\r\n========================================================= *\/\r\n\r\n#bpts-surf-alerts,\r\n#bpts-surf-alerts * {\r\n    box-sizing: border-box;\r\n}\r\n\r\n#bpts-surf-alerts {\r\n    width: 100%;\r\n    padding: 84px 0;\r\n\r\n    background: #f6f6f3;\r\n    color: #fff;\r\n\r\n    font-family:\r\n        Arial,\r\n        Helvetica,\r\n        sans-serif;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-alerts-inner {\r\n    width: min(\r\n        1450px,\r\n        calc(100% - 48px)\r\n    );\r\n\r\n    margin: 0 auto;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   MAIN BOX\r\n========================================================= *\/\r\n\r\n#bpts-surf-alerts .bpts-alert-box {\r\n\r\n    position: relative;\r\n\r\n    overflow: hidden;\r\n\r\n    display: grid;\r\n\r\n    grid-template-columns:\r\n        1.15fr\r\n        .85fr;\r\n\r\n    gap: 60px;\r\n\r\n    align-items: center;\r\n\r\n    padding:\r\n        64px\r\n        68px;\r\n\r\n    border:\r\n        1px solid\r\n        rgba(255,255,255,.13);\r\n\r\n    border-radius: 18px;\r\n\r\n    background:\r\n        linear-gradient(\r\n            135deg,\r\n            #181818 0%,\r\n            #0d0d0d 100%\r\n        );\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   DECORATION\r\n========================================================= *\/\r\n\r\n#bpts-surf-alerts .bpts-alert-box::before {\r\n\r\n    content: \"\";\r\n\r\n    position: absolute;\r\n\r\n    width: 340px;\r\n    height: 340px;\r\n\r\n    right: -130px;\r\n    top: -170px;\r\n\r\n    border:\r\n        1px solid\r\n        rgba(255,255,255,.08);\r\n\r\n    border-radius: 50%;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-alert-box::after {\r\n\r\n    content: \"\";\r\n\r\n    position: absolute;\r\n\r\n    width: 230px;\r\n    height: 230px;\r\n\r\n    right: -55px;\r\n    top: -110px;\r\n\r\n    border:\r\n        1px solid\r\n        rgba(255,255,255,.08);\r\n\r\n    border-radius: 50%;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   CONTENT\r\n========================================================= *\/\r\n\r\n#bpts-surf-alerts .bpts-alert-content {\r\n\r\n    position: relative;\r\n\r\n    z-index: 2;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-kicker {\r\n\r\n    margin-bottom: 10px;\r\n\r\n    color:\r\n        rgba(255,255,255,.60);\r\n\r\n    font-size: 12px;\r\n\r\n    font-weight: 800;\r\n\r\n    letter-spacing: 1.5px;\r\n\r\n    text-transform: uppercase;\r\n}\r\n\r\n#bpts-surf-alerts h2 {\r\n\r\n    max-width: 700px;\r\n\r\n    margin: 0 0 18px;\r\n\r\n    color: #fff !important;\r\n\r\n    font-size: clamp(\r\n        38px,\r\n        4.5vw,\r\n        62px\r\n    );\r\n\r\n    line-height: .98;\r\n\r\n    letter-spacing: -2.5px;\r\n\r\n    font-weight: 800;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-alert-description {\r\n\r\n    max-width: 620px;\r\n\r\n    margin: 0;\r\n\r\n    color:\r\n        rgba(255,255,255,.72);\r\n\r\n    font-size: 15px;\r\n\r\n    line-height: 1.65;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   BENEFITS\r\n========================================================= *\/\r\n\r\n#bpts-surf-alerts .bpts-alert-benefits {\r\n\r\n    margin-top: 25px;\r\n\r\n    display: flex;\r\n\r\n    flex-wrap: wrap;\r\n\r\n    gap: 10px;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-benefit {\r\n\r\n    min-height: 35px;\r\n\r\n    display: inline-flex;\r\n    align-items: center;\r\n\r\n    gap: 7px;\r\n\r\n    padding:\r\n        0\r\n        12px;\r\n\r\n    border:\r\n        1px solid\r\n        rgba(255,255,255,.13);\r\n\r\n    border-radius: 50px;\r\n\r\n    color:\r\n        rgba(255,255,255,.82);\r\n\r\n    font-size: 11px;\r\n\r\n    font-weight: 700;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-benefit-dot {\r\n\r\n    width: 5px;\r\n    height: 5px;\r\n\r\n    border-radius: 50%;\r\n\r\n    background: #fff;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   FORM AREA\r\n========================================================= *\/\r\n\r\n#bpts-surf-alerts .bpts-alert-form-wrap {\r\n\r\n    position: relative;\r\n\r\n    z-index: 2;\r\n\r\n    padding: 27px;\r\n\r\n    border-radius: 14px;\r\n\r\n    background: #fff;\r\n\r\n    color: #111;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-form-title {\r\n\r\n    margin-bottom: 6px;\r\n\r\n    color: #111;\r\n\r\n    font-size: 20px;\r\n\r\n    font-weight: 900;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-form-subtitle {\r\n\r\n    margin-bottom: 19px;\r\n\r\n    color: #777;\r\n\r\n    font-size: 12px;\r\n\r\n    line-height: 1.45;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   FORM\r\n========================================================= *\/\r\n\r\n#bpts-surf-alerts .bpts-alert-form {\r\n\r\n    display: flex;\r\n\r\n    flex-direction: column;\r\n\r\n    gap: 10px;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-alert-form input {\r\n\r\n    width: 100%;\r\n\r\n    height: 53px;\r\n\r\n    padding:\r\n        0\r\n        15px;\r\n\r\n    border:\r\n        1px solid\r\n        #dedede !important;\r\n\r\n    border-radius: 8px;\r\n\r\n    outline: none !important;\r\n\r\n    background: #fff !important;\r\n\r\n    color: #111 !important;\r\n\r\n    font-size: 13px;\r\n\r\n    box-shadow: none !important;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-alert-form input:focus {\r\n\r\n    border-color:\r\n        #111 !important;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-alert-form input::placeholder {\r\n\r\n    color: #999;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-alert-form button {\r\n\r\n    width: 100%;\r\n\r\n    min-height: 53px;\r\n\r\n    border: 0 !important;\r\n\r\n    border-radius: 8px;\r\n\r\n    background: #111 !important;\r\n\r\n    color: #fff !important;\r\n\r\n    font-size: 12px;\r\n\r\n    font-weight: 800;\r\n\r\n    cursor: pointer;\r\n\r\n    transition:\r\n        opacity .2s ease;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-alert-form button:hover {\r\n\r\n    opacity: .86;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   PRIVACY\r\n========================================================= *\/\r\n\r\n#bpts-surf-alerts .bpts-form-note {\r\n\r\n    margin-top: 12px;\r\n\r\n    color: #8b8b8b;\r\n\r\n    font-size: 10px;\r\n\r\n    line-height: 1.45;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   SUCCESS MESSAGE\r\n========================================================= *\/\r\n\r\n#bpts-surf-alerts .bpts-alert-message {\r\n\r\n    display: none;\r\n\r\n    margin-top: 12px;\r\n\r\n    padding:\r\n        11px\r\n        12px;\r\n\r\n    border-radius: 7px;\r\n\r\n    background: #f1f1ef;\r\n\r\n    color: #111;\r\n\r\n    font-size: 11px;\r\n\r\n    font-weight: 700;\r\n}\r\n\r\n#bpts-surf-alerts .bpts-alert-message.is-visible {\r\n\r\n    display: block;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   TABLET\r\n========================================================= *\/\r\n\r\n@media(max-width:1000px) {\r\n\r\n    #bpts-surf-alerts .bpts-alert-box {\r\n\r\n        grid-template-columns: 1fr;\r\n\r\n        gap: 35px;\r\n\r\n        padding:\r\n            50px\r\n            45px;\r\n    }\r\n\r\n    #bpts-surf-alerts .bpts-alert-form-wrap {\r\n\r\n        max-width: 600px;\r\n    }\r\n\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   MOBILE\r\n========================================================= *\/\r\n\r\n@media(max-width:700px) {\r\n\r\n    #bpts-surf-alerts {\r\n\r\n        padding:\r\n            58px\r\n            0;\r\n    }\r\n\r\n    #bpts-surf-alerts .bpts-alerts-inner {\r\n\r\n        width:\r\n            min(\r\n                100% - 28px,\r\n                1450px\r\n            );\r\n    }\r\n\r\n    #bpts-surf-alerts .bpts-alert-box {\r\n\r\n        gap: 28px;\r\n\r\n        padding:\r\n            34px\r\n            22px;\r\n    }\r\n\r\n    #bpts-surf-alerts h2 {\r\n\r\n        font-size: 40px;\r\n\r\n        letter-spacing: -1.8px;\r\n    }\r\n\r\n    #bpts-surf-alerts .bpts-alert-description {\r\n\r\n        font-size: 14px;\r\n    }\r\n\r\n    #bpts-surf-alerts .bpts-alert-form-wrap {\r\n\r\n        padding: 21px;\r\n    }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n\r\n\r\n<div class=\"bpts-alerts-inner\">\r\n\r\n    <div class=\"bpts-alert-box\">\r\n\r\n\r\n        <!-- =================================================\r\n             LEFT CONTENT\r\n        ================================================== -->\r\n\r\n        <div class=\"bpts-alert-content\">\r\n\r\n\r\n            <div class=\"bpts-kicker\">\r\n                Surf alerts\r\n            <\/div>\r\n\r\n\r\n            <h2>\r\n                Know when the waves are worth it.\r\n            <\/h2>\r\n\r\n\r\n            <p class=\"bpts-alert-description\">\r\n\r\n                Get surf forecast updates, swell alerts,\r\n                destination inspiration and new surf guides\r\n                delivered straight to your inbox.\r\n\r\n            <\/p>\r\n\r\n\r\n            <div class=\"bpts-alert-benefits\">\r\n\r\n\r\n                <span class=\"bpts-benefit\">\r\n\r\n                    <span class=\"bpts-benefit-dot\"><\/span>\r\n\r\n                    Swell alerts\r\n\r\n                <\/span>\r\n\r\n\r\n                <span class=\"bpts-benefit\">\r\n\r\n                    <span class=\"bpts-benefit-dot\"><\/span>\r\n\r\n                    Forecast updates\r\n\r\n                <\/span>\r\n\r\n\r\n                <span class=\"bpts-benefit\">\r\n\r\n                    <span class=\"bpts-benefit-dot\"><\/span>\r\n\r\n                    Surf destinations\r\n\r\n                <\/span>\r\n\r\n\r\n                <span class=\"bpts-benefit\">\r\n\r\n                    <span class=\"bpts-benefit-dot\"><\/span>\r\n\r\n                    Surf holiday deals\r\n\r\n                <\/span>\r\n\r\n\r\n            <\/div>\r\n\r\n\r\n        <\/div>\r\n\r\n\r\n\r\n        <!-- =================================================\r\n             RIGHT FORM\r\n        ================================================== -->\r\n\r\n        <div class=\"bpts-alert-form-wrap\">\r\n\r\n\r\n            <div class=\"bpts-form-title\">\r\n                Get surf updates\r\n            <\/div>\r\n\r\n\r\n            <div class=\"bpts-form-subtitle\">\r\n\r\n                Join surfers discovering better\r\n                conditions and new places to surf.\r\n\r\n            <\/div>\r\n\r\n\r\n            <form\r\n                class=\"bpts-alert-form\"\r\n                id=\"bptsAlertForm\"\r\n            >\r\n\r\n\r\n                <input\r\n                    type=\"email\"\r\n                    id=\"bptsAlertEmail\"\r\n                    placeholder=\"Your email address\"\r\n                    required\r\n                >\r\n\r\n\r\n                <button type=\"submit\">\r\n\r\n                    Join Free \u2192\r\n\r\n                <\/button>\r\n\r\n\r\n            <\/form>\r\n\r\n\r\n            <div class=\"bpts-form-note\">\r\n\r\n                No spam. Just useful surf forecasts,\r\n                guides and travel inspiration.\r\n                You can unsubscribe anytime.\r\n\r\n            <\/div>\r\n\r\n\r\n            <div\r\n                class=\"bpts-alert-message\"\r\n                id=\"bptsAlertMessage\"\r\n            >\r\n\r\n                Thanks! Your email has been received.\r\n\r\n            <\/div>\r\n\r\n\r\n        <\/div>\r\n\r\n\r\n    <\/div>\r\n\r\n<\/div>\r\n\r\n\r\n\r\n<script>\r\n\r\n(function () {\r\n\r\n    \"use strict\";\r\n\r\n\r\n    const form =\r\n        document.getElementById(\r\n            \"bptsAlertForm\"\r\n        );\r\n\r\n\r\n    const email =\r\n        document.getElementById(\r\n            \"bptsAlertEmail\"\r\n        );\r\n\r\n\r\n    const message =\r\n        document.getElementById(\r\n            \"bptsAlertMessage\"\r\n        );\r\n\r\n\r\n    if (\r\n        !form ||\r\n        !email ||\r\n        !message\r\n    ) {\r\n\r\n        return;\r\n    }\r\n\r\n\r\n    form.addEventListener(\r\n        \"submit\",\r\n        function(event) {\r\n\r\n\r\n            \/*\r\n             * DEMO FRONTEND ONLY.\r\n             *\r\n             * Later we connect this\r\n             * to your newsletter system.\r\n             *\/\r\n\r\n            event.preventDefault();\r\n\r\n\r\n            const value =\r\n                email\r\n                    .value\r\n                    .trim();\r\n\r\n\r\n            if (!value) {\r\n\r\n                return;\r\n            }\r\n\r\n\r\n            message.classList.add(\r\n                \"is-visible\"\r\n            );\r\n\r\n\r\n            email.value =\r\n                \"\";\r\n\r\n\r\n        }\r\n    );\r\n\r\n\r\n})();\r\n\r\n<\/script>\r\n\r\n\r\n<\/section>\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>Surf travel Book your next surf trip Discover surf camps, surf coaching and all-inclusive surf holidays in some of the world&#8217;s best surf destinations. View all surf holidays \u2192 Best seller Surf + Yoga Taghazout Bay \u00b7 Morocco Surf &amp; Yoga Holiday \u2605\u2605\u2605\u2605\u2605 5\/5 (3 reviews) \u2659Independent \u2248Surf + Yoga \u25a17 days \u25d4All levels 47 &#8230; <a title=\"home\" class=\"read-more\" href=\"https:\/\/bestplacestosurfing.com\/fr\/\" aria-label=\"En savoir plus sur home\">Lire la suite<\/a><\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"iawp_total_views":156,"footnotes":""},"class_list":["post-15","page","type-page","status-publish"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.2 (Yoast SEO v28.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Best Places To Surf - Check Live Surf Forecast For Your Surf Holiday<\/title>\n<meta name=\"description\" content=\"Discover the best places to surf, check live surf forecasts and conditions, and plan your perfect surf holiday at top destinations worldwide.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/bestplacestosurfing.com\/fr\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"home\" \/>\n<meta property=\"og:description\" content=\"Discover the best places to surf, check live surf forecasts and conditions, and plan your perfect surf holiday at top destinations worldwide.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/bestplacestosurfing.com\/fr\/\" \/>\n<meta property=\"og:site_name\" content=\"Best Places To Surf\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-18T18:42:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/images.unsplash.com\/photo-1502680390469-be75c86b636f?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bestplacestosurfing.com\\\/\",\"url\":\"https:\\\/\\\/bestplacestosurfing.com\\\/\",\"name\":\"Best Places To Surf - Check Live Surf Forecast For Your Surf Holiday\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestplacestosurfing.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/bestplacestosurfing.com\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/bestplacestosurfing.com\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/images.unsplash.com\\\/photo-1502680390469-be75c86b636f?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\",\"datePublished\":\"2026-08-11T21:07:48+00:00\",\"dateModified\":\"2026-08-18T18:42:57+00:00\",\"description\":\"Discover the best places to surf, check live surf forecasts and conditions, and plan your perfect surf holiday at top destinations worldwide.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bestplacestosurfing.com\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/bestplacestosurfing.com\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/bestplacestosurfing.com\\\/#primaryimage\",\"url\":\"https:\\\/\\\/images.unsplash.com\\\/photo-1502680390469-be75c86b636f?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\",\"contentUrl\":\"https:\\\/\\\/images.unsplash.com\\\/photo-1502680390469-be75c86b636f?auto=format&amp;fit=crop&amp;w=1000&amp;q=85\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bestplacestosurfing.com\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/bestplacestosurfing.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"home\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bestplacestosurfing.com\\\/#website\",\"url\":\"https:\\\/\\\/bestplacestosurfing.com\\\/\",\"name\":\"Best Places To Surf\",\"description\":\"Best Places To Surf\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/bestplacestosurfing.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Meilleurs Spots de Surf dans le Monde | Surf Forecast en Direct","description":"D\u00e9couvrez les meilleurs spots de surf dans le monde, consultez les pr\u00e9visions et conditions de surf en direct et planifiez votre prochain surf trip.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/bestplacestosurfing.com\/fr\/","og_locale":"fr_FR","og_type":"article","og_title":"home","og_description":"Discover the best places to surf, check live surf forecasts and conditions, and plan your perfect surf holiday at top destinations worldwide.","og_url":"https:\/\/bestplacestosurfing.com\/fr\/","og_site_name":"Best Places To Surf","article_modified_time":"2026-08-18T18:42:57+00:00","og_image":[{"url":"https:\/\/images.unsplash.com\/photo-1502680390469-be75c86b636f?auto=format&amp;fit=crop&amp;w=1000&amp;q=85","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/bestplacestosurfing.com\/","url":"https:\/\/bestplacestosurfing.com\/","name":"Meilleurs Spots de Surf dans le Monde | Surf Forecast en Direct","isPartOf":{"@id":"https:\/\/bestplacestosurfing.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/bestplacestosurfing.com\/#primaryimage"},"image":{"@id":"https:\/\/bestplacestosurfing.com\/#primaryimage"},"thumbnailUrl":"https:\/\/images.unsplash.com\/photo-1502680390469-be75c86b636f?auto=format&amp;fit=crop&amp;w=1000&amp;q=85","datePublished":"2026-08-11T21:07:48+00:00","dateModified":"2026-08-18T18:42:57+00:00","description":"D\u00e9couvrez les meilleurs spots de surf dans le monde, consultez les pr\u00e9visions et conditions de surf en direct et planifiez votre prochain surf trip.","breadcrumb":{"@id":"https:\/\/bestplacestosurfing.com\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/bestplacestosurfing.com\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/bestplacestosurfing.com\/#primaryimage","url":"https:\/\/images.unsplash.com\/photo-1502680390469-be75c86b636f?auto=format&amp;fit=crop&amp;w=1000&amp;q=85","contentUrl":"https:\/\/images.unsplash.com\/photo-1502680390469-be75c86b636f?auto=format&amp;fit=crop&amp;w=1000&amp;q=85"},{"@type":"BreadcrumbList","@id":"https:\/\/bestplacestosurfing.com\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/bestplacestosurfing.com\/"},{"@type":"ListItem","position":2,"name":"home"}]},{"@type":"WebSite","@id":"https:\/\/bestplacestosurfing.com\/#website","url":"https:\/\/bestplacestosurfing.com\/","name":"Best Places To Surf","description":"Best Places To Surf","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/bestplacestosurfing.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"}]}},"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/bestplacestosurfing.com\/fr\/wp-json\/wp\/v2\/pages\/15","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bestplacestosurfing.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bestplacestosurfing.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bestplacestosurfing.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bestplacestosurfing.com\/fr\/wp-json\/wp\/v2\/comments?post=15"}],"version-history":[{"count":171,"href":"https:\/\/bestplacestosurfing.com\/fr\/wp-json\/wp\/v2\/pages\/15\/revisions"}],"predecessor-version":[{"id":2597,"href":"https:\/\/bestplacestosurfing.com\/fr\/wp-json\/wp\/v2\/pages\/15\/revisions\/2597"}],"wp:attachment":[{"href":"https:\/\/bestplacestosurfing.com\/fr\/wp-json\/wp\/v2\/media?parent=15"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}