{"id":15,"date":"2026-08-11T21:07:48","date_gmt":"2026-08-11T21:07:48","guid":{"rendered":"https:\/\/surf-conditions.com\/?page_id=15"},"modified":"2026-08-16T17:41:56","modified_gmt":"2026-08-16T17:41:56","slug":"home-page","status":"publish","type":"page","link":"https:\/\/surf-conditions.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-ae899a2 e-con-full e-flex e-con e-parent\" data-id=\"ae899a2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-40b8fe8 elementor-widget elementor-widget-html\" data-id=\"40b8fe8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- BEST PLACES TO SURFING \u2014 HERO ONLY -->\r\n<style>\r\n\/* Full-bleed breakout from GeneratePress\/Gutenberg *\/\r\n#bpts-photo-hero {\r\n    width: 100vw !important;\r\n    max-width: 100vw !important;\r\n    margin-left: calc(50% - 50vw) !important;\r\n    margin-right: calc(50% - 50vw) !important;\r\n    margin-top: 0 !important;\r\n    margin-bottom: 0 !important;\r\n}\r\n.wp-block-html:has(#bpts-photo-hero),\r\n.entry-content > .wp-block-html:has(#bpts-photo-hero) {\r\n    margin: 0 !important;\r\n    padding: 0 !important;\r\n    max-width: none !important;\r\n}\r\n<\/style>\r\n\r\n<section id=\"bpts-photo-hero\">\r\n\r\n<style>\r\n\r\n#bpts-photo-hero,\r\n#bpts-photo-hero * {\r\n    box-sizing: border-box;\r\n}\r\n\r\n#bpts-photo-hero {\r\n    width: 100%;\r\n    min-height: 680px;\r\n\r\n    position: relative;\r\n\r\n    display: flex;\r\n    align-items: center;\r\n\r\n    overflow: visible;\r\n\r\n    z-index: 50;\r\n\r\n    font-family: Arial, Helvetica, sans-serif;\r\n\r\n    color: #fff;\r\n\r\n    background:\r\n        linear-gradient(\r\n            90deg,\r\n            rgba(0,0,0,.72) 0%,\r\n            rgba(0,0,0,.52) 30%,\r\n            rgba(0,0,0,.20) 55%,\r\n            rgba(0,0,0,.05) 75%,\r\n            rgba(0,0,0,0) 100%\r\n        ),\r\n        url(\"https:\/\/d14fqx6aetz9ka.cloudfront.net\/wp-content\/uploads\/2022\/07\/29011639\/hero.jpg\");\r\n\r\n    background-size: cover;\r\n\r\n    background-position: center 48%;\r\n}\r\n\r\n\r\n\r\n\/* =========================================\r\n   CONTENT\r\n========================================= *\/\r\n\r\n#bpts-photo-hero .bpts-hero-inner {\r\n\r\n    width: 100%;\r\n\r\n    padding:\r\n        80px\r\n        54px;\r\n\r\n    position: relative;\r\n\r\n    z-index: 2;\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-hero-content {\r\n\r\n    width: 620px;\r\n\r\n    position: relative;\r\n\r\n    z-index: 100;\r\n\r\n    max-width: 100%;\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-eyebrow {\r\n\r\n    margin-bottom: 16px;\r\n\r\n    color: rgba(255,255,255,.82);\r\n\r\n    font-size: 13px;\r\n\r\n    font-weight: 800;\r\n\r\n    letter-spacing: 1.8px;\r\n\r\n    text-transform: uppercase;\r\n}\r\n\r\n\r\n#bpts-photo-hero h1 {\r\n\r\n    margin: 0 0 22px;\r\n\r\n    color: #fff !important;\r\n\r\n    font-size: clamp(\r\n        52px,\r\n        5vw,\r\n        82px\r\n    );\r\n\r\n    font-weight: 800;\r\n\r\n    line-height: .96;\r\n\r\n    letter-spacing: -3px;\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-description {\r\n\r\n    max-width: 560px;\r\n\r\n    margin: 0 0 30px;\r\n\r\n    color: rgba(255,255,255,.92);\r\n\r\n    font-size: 17px;\r\n\r\n    line-height: 1.55;\r\n}\r\n\r\n\r\n\/* =========================================\r\n   SEARCH BOX\r\n========================================= *\/\r\n\r\n#bpts-photo-hero .bpts-search-area {\r\n\r\n    width: 590px;\r\n\r\n    max-width: 100%;\r\n\r\n    position: relative;\r\n\r\n    z-index: 20;\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-search {\r\n\r\n    width: 100%;\r\n\r\n    max-width: 100%;\r\n\r\n    display: flex;\r\n\r\n    position: relative;\r\n\r\n    overflow: hidden;\r\n\r\n    background: #fff;\r\n\r\n    border-radius: 9px;\r\n\r\n    box-shadow:\r\n        0 16px 40px\r\n        rgba(0,0,0,.25);\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-search-icon {\r\n\r\n    position: absolute;\r\n\r\n    left: 20px;\r\n    top: 50%;\r\n\r\n    transform:\r\n        translateY(-50%);\r\n\r\n    width: 19px;\r\n    height: 19px;\r\n\r\n    color: #777;\r\n\r\n    pointer-events: none;\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-search-icon svg {\r\n\r\n    width: 100%;\r\n    height: 100%;\r\n\r\n    fill: none;\r\n\r\n    stroke: currentColor;\r\n\r\n    stroke-width: 2;\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-search input {\r\n\r\n    flex: 1;\r\n\r\n    min-width: 0;\r\n\r\n    height: 70px;\r\n\r\n    padding:\r\n        0\r\n        18px\r\n        0\r\n        56px;\r\n\r\n    border: none !important;\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: 15px;\r\n\r\n    box-shadow: none !important;\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-search input::placeholder {\r\n\r\n    color: #8b8b8b;\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-search button {\r\n\r\n    min-width: 130px;\r\n\r\n    border: 0 !important;\r\n\r\n    background: #111 !important;\r\n\r\n    color: #fff !important;\r\n\r\n    font-size: 14px;\r\n\r\n    font-weight: 800;\r\n\r\n    cursor: pointer;\r\n}\r\n\r\n\r\n\/* =========================================\r\n   LIVE DATABASE SEARCH RESULTS\r\n========================================= *\/\r\n\r\n#bpts-photo-hero .bpts-search-results {\r\n    display: none;\r\n    position: absolute;\r\n    top: calc(100% + 8px);\r\n    left: 0;\r\n    width: 100%;\r\n    max-height: min(390px, 52vh);\r\n    overflow-y: auto;\r\n    overscroll-behavior: contain;\r\n    -webkit-overflow-scrolling: touch;\r\n    border: 1px solid rgba(17,17,17,.10);\r\n    border-radius: 12px;\r\n    background: #fff;\r\n    box-shadow: 0 18px 45px rgba(0,0,0,.24);\r\n    color: #111;\r\n    z-index: 2147483000;\r\n    scrollbar-width: thin;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-results.is-open {\r\n    display: block;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-results::-webkit-scrollbar {\r\n    width: 8px;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-results::-webkit-scrollbar-thumb {\r\n    background: #c7ccd4;\r\n    border-radius: 999px;\r\n    border: 2px solid #fff;\r\n}\r\n\r\n#bpts-photo-hero.search-open {\r\n    z-index: 999999 !important;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-result {\r\n    width: 100%;\r\n    min-height: 68px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    gap: 18px;\r\n    padding: 12px 16px;\r\n    border-bottom: 1px solid #eceef2;\r\n    color: #111 !important;\r\n    text-decoration: none !important;\r\n    background: #fff;\r\n    transition: background .15s ease;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-result:last-child {\r\n    border-bottom: 0;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-result:hover,\r\n#bpts-photo-hero .bpts-search-result.is-active {\r\n    background: #f3f5f8;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-result-main {\r\n    min-width: 0;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-result-name {\r\n    display: block;\r\n    color: #111;\r\n    font-size: 15px;\r\n    font-weight: 800;\r\n    line-height: 1.2;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-result-location {\r\n    display: block;\r\n    margin-top: 4px;\r\n    color: #7b8492;\r\n    font-size: 12px;\r\n    line-height: 1.25;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-result-wave {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 7px;\r\n    flex-shrink: 0;\r\n    color: #111;\r\n    font-size: 14px;\r\n    font-weight: 900;\r\n    white-space: nowrap;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-result-bars {\r\n    width: 5px;\r\n    display: flex;\r\n    flex-direction: column-reverse;\r\n    gap: 2px;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-result-bars i {\r\n    display: block;\r\n    width: 5px;\r\n    height: 5px;\r\n    border-radius: 2px;\r\n    background: #d3d7dd;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-result.rating-1 .bpts-search-result-bars i:nth-child(-n+1) { background:#eb5b7d; }\r\n#bpts-photo-hero .bpts-search-result.rating-2 .bpts-search-result-bars i:nth-child(-n+2) { background:#f2c744; }\r\n#bpts-photo-hero .bpts-search-result.rating-3 .bpts-search-result-bars i:nth-child(-n+3) { background:#f0a43a; }\r\n#bpts-photo-hero .bpts-search-result.rating-4 .bpts-search-result-bars i:nth-child(-n+4) { background:#25b48b; }\r\n#bpts-photo-hero .bpts-search-result.rating-5 .bpts-search-result-bars i:nth-child(-n+5) { background:#25b48b; }\r\n\r\n#bpts-photo-hero .bpts-search-message {\r\n    padding: 16px;\r\n    color: #667080;\r\n    font-size: 13px;\r\n    background: #fff;\r\n}\r\n\r\n#bpts-photo-hero .bpts-search-all {\r\n    display: block;\r\n    padding: 13px 16px;\r\n    border-top: 1px solid #eceef2;\r\n    background: #f8f9fb;\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\r\n\/* =========================================\r\n   QUICK LINKS\r\n========================================= *\/\r\n\r\n#bpts-photo-hero .bpts-quick-links {\r\n\r\n    margin-top: 17px;\r\n\r\n    display: flex;\r\n\r\n    flex-wrap: wrap;\r\n\r\n    align-items: center;\r\n\r\n    gap: 10px;\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-quick-label {\r\n\r\n    color: rgba(255,255,255,.78);\r\n\r\n    font-size: 12px;\r\n    font-weight: 700;\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-quick-links a {\r\n\r\n    display: inline-flex;\r\n\r\n    align-items: center;\r\n\r\n    min-height: 35px;\r\n\r\n    padding:\r\n        0\r\n        13px;\r\n\r\n    border:\r\n        0px solid\r\n        rgba(255,255,255,.35);\r\n\r\n    border-radius: 50px;\r\n\r\n    background:\r\n        #000;\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: 700;\r\n\r\n    backdrop-filter:\r\n        blur(6px);\r\n\r\n    transition:\r\n        background .2s ease;\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-quick-links a:hover {\r\n\r\n    background:\r\n        rgba(0,0,0,.48);\r\n}\r\n\r\n\r\n\/* =========================================\r\n   BOTTOM BADGE\r\n========================================= *\/\r\n\r\n#bpts-photo-hero .bpts-hero-badge {\r\n\r\n    position: absolute;\r\n\r\n    right: 25px;\r\n    bottom: 25px;\r\n\r\n    z-index: 3;\r\n\r\n    display: flex;\r\n\r\n    align-items: center;\r\n\r\n    gap: 8px;\r\n\r\n    padding:\r\n        11px\r\n        15px;\r\n\r\n    border-radius: 50px;\r\n\r\n    background:\r\n        rgba(255,255,255,.94);\r\n\r\n    color: #111;\r\n\r\n    font-size: 11px;\r\n\r\n    font-weight: 800;\r\n\r\n    box-shadow:\r\n        0 8px 24px\r\n        rgba(0,0,0,.16);\r\n}\r\n\r\n\r\n#bpts-photo-hero .bpts-badge-dot {\r\n\r\n    width: 7px;\r\n    height: 7px;\r\n\r\n    border-radius: 50%;\r\n\r\n    background: #111;\r\n}\r\n\r\n\r\n\r\n\/* =========================================\r\n   TABLET\r\n========================================= *\/\r\n\r\n@media(max-width:900px) {\r\n\r\n    #bpts-photo-hero {\r\n\r\n        min-height: 650px;\r\n\r\n        background-position:\r\n            62% center;\r\n    }\r\n\r\n\r\n    #bpts-photo-hero .bpts-hero-inner {\r\n\r\n        padding:\r\n            70px\r\n            30px;\r\n    }\r\n\r\n\r\n    #bpts-photo-hero h1 {\r\n\r\n        font-size: 58px;\r\n    }\r\n\r\n}\r\n\r\n\r\n\/* =========================================\r\n   MOBILE\r\n========================================= *\/\r\n\r\n@media(max-width:600px) {\r\n\r\n    #bpts-photo-hero {\r\n\r\n        min-height: 680px;\r\n\r\n        align-items: flex-end;\r\n\r\n        background:\r\n            linear-gradient(\r\n                0deg,\r\n                rgba(0,0,0,.82) 0%,\r\n                rgba(0,0,0,.58) 46%,\r\n                rgba(0,0,0,.14) 76%\r\n            ),\r\n            url(\"https:\/\/d14fqx6aetz9ka.cloudfront.net\/wp-content\/uploads\/2022\/07\/29011639\/hero.jpg\");\r\n\r\n        background-size: cover;\r\n\r\n        background-position:\r\n            58% center;\r\n    }\r\n\r\n\r\n    #bpts-photo-hero .bpts-hero-inner {\r\n\r\n        padding:\r\n            45px\r\n            18px\r\n            35px;\r\n    }\r\n\r\n\r\n    #bpts-photo-hero h1 {\r\n\r\n        font-size: 44px;\r\n\r\n        letter-spacing: -2px;\r\n    }\r\n\r\n\r\n    #bpts-photo-hero .bpts-description {\r\n\r\n        font-size: 14px;\r\n    }\r\n\r\n\r\n    #bpts-photo-hero .bpts-search-area {\r\n\r\n        width: 100%;\r\n    }\r\n\r\n\r\n    #bpts-photo-hero .bpts-search {\r\n\r\n        flex-direction: column;\r\n\r\n        background: transparent;\r\n\r\n        overflow: visible;\r\n\r\n        gap: 8px;\r\n\r\n        box-shadow: none;\r\n    }\r\n\r\n\r\n    #bpts-photo-hero .bpts-search-icon {\r\n\r\n        top: 28px;\r\n    }\r\n\r\n\r\n    #bpts-photo-hero .bpts-search input {\r\n\r\n        width: 100%;\r\n\r\n        flex: none;\r\n\r\n        height: 56px;\r\n\r\n        border-radius:\r\n            8px !important;\r\n    }\r\n\r\n\r\n\r\n    #bpts-photo-hero .bpts-search-results {\r\n        max-height: 300px;\r\n        top: 64px;\r\n    }\r\n\r\n    #bpts-photo-hero .bpts-search button {\r\n\r\n        width: 100%;\r\n\r\n        min-height: 50px;\r\n\r\n        border-radius: 8px;\r\n    }\r\n\r\n\r\n    #bpts-photo-hero .bpts-hero-badge {\r\n\r\n        display: none;\r\n    }\r\n\r\n\r\n    #bpts-photo-hero .bpts-quick-links {\r\n\r\n        margin-top: 14px;\r\n    }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n\r\n\r\n<div class=\"bpts-hero-inner\">\r\n\r\n    <div class=\"bpts-hero-content\">\r\n\r\n\r\n        <div class=\"bpts-eyebrow\">\r\n\r\n            Global Surf Forecast\r\n\r\n        <\/div>\r\n\r\n\r\n        <h1>\r\n\r\n            Find your<br>\r\n\r\n            perfect wave.\r\n\r\n        <\/h1>\r\n\r\n\r\n        <p class=\"bpts-description\">\r\n\r\n            Explore surf forecasts, swell, wind and tides\r\n            for hundreds of surf spots around the world.\r\n\r\n        <\/p>\r\n\r\n\r\n\r\n        <!-- SEARCH -->\r\n\r\n        <div class=\"bpts-search-area\">\r\n\r\n        <div class=\"bpts-search\">\r\n\r\n\r\n            <span class=\"bpts-search-icon\">\r\n\r\n                <svg viewBox=\"0 0 24 24\">\r\n\r\n                    <circle\r\n                        cx=\"11\"\r\n                        cy=\"11\"\r\n                        r=\"7\"\r\n                    ><\/circle>\r\n\r\n                    <path\r\n                        d=\"M20 20l-4-4\"\r\n                    ><\/path>\r\n\r\n                <\/svg>\r\n\r\n            <\/span>\r\n\r\n\r\n            <input\r\n                type=\"search\"\r\n                id=\"bptsHeroPhotoSearch\"\r\n                placeholder=\"Search surf spot, city or country...\"\r\n                autocomplete=\"off\"\r\n            >\r\n\r\n\r\n            <button\r\n                type=\"button\"\r\n                id=\"bptsHeroPhotoSearchButton\"\r\n            >\r\n\r\n                Search\r\n\r\n            <\/button>\r\n\r\n        <\/div>\r\n\r\n        <div\r\n            class=\"bpts-search-results\"\r\n            id=\"bptsHeroPhotoSearchResults\"\r\n            role=\"listbox\"\r\n            aria-label=\"Surf spot search results\"\r\n        ><\/div>\r\n\r\n        <\/div>\r\n\r\n\r\n\r\n        <!-- QUICK DESTINATIONS -->\r\n\r\n        <div class=\"bpts-quick-links\">\r\n\r\n            <span class=\"bpts-quick-label\">\r\n\r\n                Popular:\r\n\r\n            <\/span>\r\n\r\n\r\n            <a href=\"\/surf-forecast\/morocco\/\">\r\n\r\n                Morocco\r\n\r\n            <\/a>\r\n\r\n\r\n            <a href=\"\/surf-forecast\/portugal\/\">\r\n\r\n                Portugal\r\n\r\n            <\/a>\r\n\r\n\r\n            <a href=\"\/surf-forecast\/bali\/\">\r\n\r\n                Bali\r\n\r\n            <\/a>\r\n\r\n\r\n            <a href=\"\/surf-forecast\/california\/\">\r\n\r\n                California\r\n\r\n            <\/a>\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\r\n\r\n<div class=\"bpts-hero-badge\">\r\n\r\n    <span class=\"bpts-badge-dot\"><\/span>\r\n\r\n    300+ surf spots worldwide\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    const input = document.getElementById(\"bptsHeroPhotoSearch\");\r\n    const button = document.getElementById(\"bptsHeroPhotoSearchButton\");\r\n    const results = document.getElementById(\"bptsHeroPhotoSearchResults\");\r\n    const hero = document.getElementById(\"bpts-photo-hero\");\r\n\r\n    if (!input || !button || !results) {\r\n        return;\r\n    }\r\n\r\n    const endpoint = \"\/wp-json\/bpts\/v1\/search\";\r\n    const searchPage = \"\/surf-spots\/search\/\";\r\n\r\n    let timer = null;\r\n    let controller = null;\r\n    let currentItems = [];\r\n    let activeIndex = -1;\r\n\r\n    function escapeHtml(value) {\r\n        return String(value || \"\").replace(\/[&<>\"']\/g, function (char) {\r\n            return {\r\n                \"&\": \"&amp;\",\r\n                \"<\": \"&lt;\",\r\n                \">\": \"&gt;\",\r\n                '\"': \"&quot;\",\r\n                \"'\": \"&#039;\"\r\n            }[char];\r\n        });\r\n    }\r\n\r\n    function closeResults() {\r\n        results.classList.remove(\"is-open\");\r\n        if (hero) hero.classList.remove(\"search-open\");\r\n        results.innerHTML = \"\";\r\n        currentItems = [];\r\n        activeIndex = -1;\r\n        input.setAttribute(\"aria-expanded\", \"false\");\r\n    }\r\n\r\n    function openResults() {\r\n        results.classList.add(\"is-open\");\r\n        if (hero) hero.classList.add(\"search-open\");\r\n        input.setAttribute(\"aria-expanded\", \"true\");\r\n    }\r\n\r\n    function renderResults(items, query) {\r\n        currentItems = Array.isArray(items) ? items.slice(0, 8) : [];\r\n        activeIndex = -1;\r\n\r\n        if (!currentItems.length) {\r\n            results.innerHTML =\r\n                '<div class=\"bpts-search-message\">No matching surf spots found.<\/div>' +\r\n                '<a class=\"bpts-search-all\" href=\"' + searchPage + '?q=' + encodeURIComponent(query) + '\">Search all surf spots \u2192<\/a>';\r\n            openResults();\r\n            return;\r\n        }\r\n\r\n        results.innerHTML = currentItems.map(function (spot, index) {\r\n            const location = [spot.region, spot.country].filter(Boolean).join(\", \");\r\n            const rating = Math.max(0, Math.min(5, parseInt(spot.wave_rating || 0, 10)));\r\n\r\n            return (\r\n                '<a class=\"bpts-search-result rating-' + rating + '\"' +\r\n                ' data-result-index=\"' + index + '\"' +\r\n                ' role=\"option\"' +\r\n                ' href=\"' + escapeHtml(spot.url) + '\">' +\r\n                    '<span class=\"bpts-search-result-main\">' +\r\n                        '<span class=\"bpts-search-result-name\">' + escapeHtml(spot.name) + '<\/span>' +\r\n                        '<span class=\"bpts-search-result-location\">' + escapeHtml(location) + '<\/span>' +\r\n                    '<\/span>' +\r\n                    '<span class=\"bpts-search-result-wave\">' +\r\n                        '<span class=\"bpts-search-result-bars\"><i><\/i><i><\/i><i><\/i><i><\/i><i><\/i><\/span>' +\r\n                        '<span>' + escapeHtml(spot.wave_text || \"\u2014\") + '<\/span>' +\r\n                    '<\/span>' +\r\n                '<\/a>'\r\n            );\r\n        }).join(\"\") +\r\n        '<a class=\"bpts-search-all\" href=\"' + searchPage + '?q=' + encodeURIComponent(query) + '\">See all results \u2192<\/a>';\r\n\r\n        openResults();\r\n    }\r\n\r\n    async function searchDatabase() {\r\n        const value = input.value.trim();\r\n\r\n        if (value.length < 2) {\r\n            closeResults();\r\n            return;\r\n        }\r\n\r\n        if (controller) {\r\n            controller.abort();\r\n        }\r\n\r\n        controller = new AbortController();\r\n        results.innerHTML = '<div class=\"bpts-search-message\">Searching surf spots\u2026<\/div>';\r\n        openResults();\r\n\r\n        try {\r\n            const url = new URL(endpoint, window.location.origin);\r\n            url.searchParams.set(\"q\", value);\r\n\r\n            const response = await fetch(url.toString(), {\r\n                signal: controller.signal,\r\n                credentials: \"same-origin\",\r\n                headers: { \"Accept\": \"application\/json\" }\r\n            });\r\n\r\n            if (!response.ok) {\r\n                throw new Error(\"Search request failed\");\r\n            }\r\n\r\n            const data = await response.json();\r\n            renderResults(data && Array.isArray(data.results) ? data.results : [], value);\r\n\r\n        } catch (error) {\r\n            if (error.name === \"AbortError\") {\r\n                return;\r\n            }\r\n\r\n            results.innerHTML =\r\n                '<div class=\"bpts-search-message\">Search is temporarily unavailable.<\/div>' +\r\n                '<a class=\"bpts-search-all\" href=\"' + searchPage + '?q=' + encodeURIComponent(value) + '\">Open surf spot search \u2192<\/a>';\r\n            openResults();\r\n        }\r\n    }\r\n\r\n    function queueSearch() {\r\n        clearTimeout(timer);\r\n        timer = setTimeout(searchDatabase, 180);\r\n    }\r\n\r\n    function updateActiveResult(nextIndex) {\r\n        const links = results.querySelectorAll(\".bpts-search-result\");\r\n\r\n        links.forEach(function (link) {\r\n            link.classList.remove(\"is-active\");\r\n        });\r\n\r\n        if (!links.length) {\r\n            activeIndex = -1;\r\n            return;\r\n        }\r\n\r\n        if (nextIndex < 0) {\r\n            nextIndex = links.length - 1;\r\n        }\r\n\r\n        if (nextIndex >= links.length) {\r\n            nextIndex = 0;\r\n        }\r\n\r\n        activeIndex = nextIndex;\r\n        links[activeIndex].classList.add(\"is-active\");\r\n        links[activeIndex].scrollIntoView({ block: \"nearest\" });\r\n    }\r\n\r\n    function runSearch() {\r\n        const value = input.value.trim();\r\n\r\n        if (!value) {\r\n            return;\r\n        }\r\n\r\n        const exact = currentItems.find(function (spot) {\r\n            return String(spot.name || \"\").toLowerCase() === value.toLowerCase();\r\n        });\r\n\r\n        if (activeIndex >= 0 && currentItems[activeIndex]) {\r\n            window.location.href = currentItems[activeIndex].url;\r\n            return;\r\n        }\r\n\r\n        if (exact) {\r\n            window.location.href = exact.url;\r\n            return;\r\n        }\r\n\r\n        window.location.href = searchPage + \"?q=\" + encodeURIComponent(value);\r\n    }\r\n\r\n    input.setAttribute(\"role\", \"combobox\");\r\n    input.setAttribute(\"aria-autocomplete\", \"list\");\r\n    input.setAttribute(\"aria-controls\", \"bptsHeroPhotoSearchResults\");\r\n    input.setAttribute(\"aria-expanded\", \"false\");\r\n\r\n    input.addEventListener(\"input\", queueSearch);\r\n\r\n    input.addEventListener(\"focus\", function () {\r\n        if (results.innerHTML.trim()) {\r\n            openResults();\r\n        }\r\n    });\r\n\r\n    input.addEventListener(\"keydown\", function (event) {\r\n        if (event.key === \"ArrowDown\") {\r\n            event.preventDefault();\r\n            updateActiveResult(activeIndex + 1);\r\n            return;\r\n        }\r\n\r\n        if (event.key === \"ArrowUp\") {\r\n            event.preventDefault();\r\n            updateActiveResult(activeIndex - 1);\r\n            return;\r\n        }\r\n\r\n        if (event.key === \"Escape\") {\r\n            closeResults();\r\n            return;\r\n        }\r\n\r\n        if (event.key === \"Enter\") {\r\n            event.preventDefault();\r\n            runSearch();\r\n        }\r\n    });\r\n\r\n    button.addEventListener(\"click\", runSearch);\r\n\r\n    document.addEventListener(\"click\", function (event) {\r\n        if (!event.target.closest(\"#bpts-photo-hero .bpts-search-area\")) {\r\n            closeResults();\r\n        }\r\n    });\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-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:\/\/surf-conditions.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:\\\/\\\/surf-conditions.com\\\/wp-admin\\\/admin-ajax.php\",forecast=\"https:\\\/\\\/surf-conditions.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:\\\/\\\/surf-conditions.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.6\\u20131.0m\",\"wave_rating\":2,\"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:\\\/\\\/surf-conditions.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.6\\u20131.0m\",\"wave_rating\":4,\"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:\\\/\\\/surf-conditions.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.2\\u20131.8m\",\"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:\\\/\\\/surf-conditions.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<section id=\"bpts-surf-holidays\">\r\n\r\n<style>\r\n\r\n\/* =========================================================\r\n   BASE\r\n========================================================= *\/\r\n\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\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-surf-holidays .bpts-holidays-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-surf-holidays .bpts-holidays-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-surf-holidays .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-surf-holidays 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-surf-holidays .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-surf-holidays .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-surf-holidays .bpts-holiday-grid {\r\n    display: grid;\r\n\r\n    grid-template-columns:\r\n        repeat(3, 1fr);\r\n\r\n    gap: 20px;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   CARD\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-holiday-card {\r\n    display: flex;\r\n    flex-direction: column;\r\n\r\n    overflow: hidden;\r\n\r\n    border:\r\n        1px solid\r\n        #e6e6e6;\r\n\r\n    border-radius: 14px;\r\n\r\n    background: #fff;\r\n\r\n    color: #111 !important;\r\n\r\n    text-decoration: none !important;\r\n\r\n    transition:\r\n        transform .22s ease,\r\n        box-shadow .22s ease;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-holiday-card:hover {\r\n    transform:\r\n        translateY(-5px);\r\n\r\n    box-shadow:\r\n        0 16px 38px\r\n        rgba(0,0,0,.09);\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   IMAGE\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-holiday-image {\r\n    position: relative;\r\n\r\n    width: 100%;\r\n    height: 270px;\r\n\r\n    overflow: hidden;\r\n\r\n    background: #ddd;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-holiday-image 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-surf-holidays .bpts-holiday-card:hover img {\r\n    transform:\r\n        scale(1.04);\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   IMAGE OVERLAY\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-holiday-image::after {\r\n    content: \"\";\r\n\r\n    position: absolute;\r\n    inset: 0;\r\n\r\n    pointer-events: none;\r\n\r\n    background:\r\n        linear-gradient(\r\n            180deg,\r\n            rgba(0,0,0,.05) 45%,\r\n            rgba(0,0,0,.38) 100%\r\n        );\r\n\r\n    z-index: 1;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   TOP BADGE\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-holiday-badge {\r\n    position: absolute;\r\n\r\n    z-index: 4;\r\n\r\n    top: 14px;\r\n    left: 14px;\r\n\r\n    min-height: 31px;\r\n\r\n    display: inline-flex;\r\n    align-items: center;\r\n\r\n    padding:\r\n        0\r\n        11px;\r\n\r\n    border-radius: 50px;\r\n\r\n    background:\r\n        rgba(0,0,0,.84);\r\n\r\n    color: #fff;\r\n\r\n    font-size: 10px;\r\n\r\n    font-weight: 900;\r\n\r\n    letter-spacing: .45px;\r\n\r\n    text-transform: uppercase;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   BEST SELLER BADGE\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-best-seller {\r\n    background: #111;\r\n    color: #fff;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-best-seller::before {\r\n    content: \"\u2605\";\r\n\r\n    margin-right: 6px;\r\n\r\n    font-size: 10px;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   TRENDING BADGE\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-trending::before {\r\n    content: \"\u2197\";\r\n\r\n    margin-right: 5px;\r\n\r\n    font-size: 12px;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   LOCATION BADGE\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-location-badge {\r\n    position: absolute;\r\n\r\n    z-index: 4;\r\n\r\n    right: 14px;\r\n    bottom: 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(255,255,255,.95);\r\n\r\n    color: #111;\r\n\r\n    font-size: 10px;\r\n\r\n    font-weight: 800;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   BODY\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-holiday-body {\r\n    padding: 21px;\r\n\r\n    display: flex;\r\n    flex-direction: column;\r\n\r\n    flex: 1;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-holiday-location {\r\n    margin-bottom: 5px;\r\n\r\n    color: #888;\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-surf-holidays .bpts-holiday-title {\r\n    margin: 0 0 10px;\r\n\r\n    color: #111 !important;\r\n\r\n    font-size: 23px;\r\n\r\n    font-weight: 900;\r\n\r\n    line-height: 1.15;\r\n\r\n    letter-spacing: -.6px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-holiday-subtitle {\r\n    margin: 0 0 18px;\r\n\r\n    color: #707070;\r\n\r\n    font-size: 13px;\r\n\r\n    line-height: 1.5;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   FEATURES\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-holiday-features {\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n\r\n    gap: 8px;\r\n\r\n    margin-bottom: 18px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-feature {\r\n    min-height: 31px;\r\n\r\n    display: inline-flex;\r\n    align-items: center;\r\n\r\n    padding:\r\n        0\r\n        10px;\r\n\r\n    border-radius: 50px;\r\n\r\n    background: #f3f3f1;\r\n\r\n    color: #333;\r\n\r\n    font-size: 10px;\r\n\r\n    font-weight: 700;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   SOCIAL PROOF BOX\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-social-proof {\r\n    margin-bottom: 18px;\r\n\r\n    padding:\r\n        12px\r\n        13px;\r\n\r\n    display: flex;\r\n    flex-direction: column;\r\n\r\n    gap: 9px;\r\n\r\n    border:\r\n        1px solid\r\n        #e8e8e5;\r\n\r\n    border-radius: 9px;\r\n\r\n    background:\r\n        #fafaf8;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   SOCIAL PROOF ROW\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-proof-row {\r\n    display: flex;\r\n    align-items: center;\r\n\r\n    gap: 9px;\r\n\r\n    color: #555;\r\n\r\n    font-size: 11px;\r\n\r\n    line-height: 1.35;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-proof-row strong {\r\n    color: #111;\r\n\r\n    font-weight: 800;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   PROOF ICON\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-proof-icon {\r\n    width: 27px;\r\n    height: 27px;\r\n\r\n    flex: 0 0 27px;\r\n\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n\r\n    border-radius: 50%;\r\n\r\n    background: #111;\r\n\r\n    color: #fff;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-proof-icon svg {\r\n    width: 13px;\r\n    height: 13px;\r\n\r\n    fill: none;\r\n\r\n    stroke:\r\n        currentColor;\r\n\r\n    stroke-width: 2;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   BOOKINGS ICON\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays\r\n.bpts-proof-bookings\r\n.bpts-proof-icon {\r\n    font-size: 12px;\r\n\r\n    font-weight: 900;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   LIVE DOT\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-live-booking {\r\n    display: inline-flex;\r\n    align-items: center;\r\n\r\n    gap: 5px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-live-dot {\r\n    width: 5px;\r\n    height: 5px;\r\n\r\n    border-radius: 50%;\r\n\r\n    background: #111;\r\n\r\n    animation:\r\n        bptsPulse\r\n        1.8s\r\n        infinite;\r\n}\r\n\r\n@keyframes bptsPulse {\r\n\r\n    0% {\r\n        opacity: 1;\r\n    }\r\n\r\n    50% {\r\n        opacity: .35;\r\n    }\r\n\r\n    100% {\r\n        opacity: 1;\r\n    }\r\n\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   INTERESTED PEOPLE AVATARS\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-interest-wrap {\r\n    display: flex;\r\n    align-items: center;\r\n\r\n    gap: 8px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-mini-avatars {\r\n    display: flex;\r\n    align-items: center;\r\n\r\n    padding-left: 3px;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-mini-avatar {\r\n    width: 24px;\r\n    height: 24px;\r\n\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n\r\n    margin-left: -6px;\r\n\r\n    border:\r\n        2px solid\r\n        #fafaf8;\r\n\r\n    border-radius: 50%;\r\n\r\n    background: #111;\r\n\r\n    color: #fff;\r\n\r\n    font-size: 7px;\r\n\r\n    font-weight: 900;\r\n}\r\n\r\n#bpts-surf-holidays\r\n.bpts-mini-avatar:first-child {\r\n    margin-left: 0;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   PRICE ROW\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-price-row {\r\n    margin-top: auto;\r\n\r\n    display: flex;\r\n    align-items: flex-end;\r\n    justify-content: space-between;\r\n\r\n    gap: 16px;\r\n\r\n    padding-top: 17px;\r\n\r\n    border-top:\r\n        1px solid\r\n        #eeeeee;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-price-label {\r\n    display: block;\r\n\r\n    margin-bottom: 3px;\r\n\r\n    color: #888;\r\n\r\n    font-size: 9px;\r\n\r\n    text-transform: uppercase;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-price {\r\n    color: #111;\r\n\r\n    font-size: 27px;\r\n\r\n    font-weight: 900;\r\n\r\n    line-height: 1;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-price small {\r\n    font-size: 12px;\r\n\r\n    font-weight: 700;\r\n\r\n    color: #777;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   PACKAGE BUTTON\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-package-button {\r\n    min-height: 43px;\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        15px;\r\n\r\n    border-radius: 7px;\r\n\r\n    background: #111;\r\n\r\n    color: #fff;\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   BOTTOM CTA\r\n========================================================= *\/\r\n\r\n#bpts-surf-holidays .bpts-holidays-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-radius: 12px;\r\n\r\n    background: #111;\r\n\r\n    color: #fff;\r\n}\r\n\r\n#bpts-surf-holidays .bpts-holidays-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-surf-holidays .bpts-holidays-bottom span {\r\n    color:\r\n        rgba(255,255,255,.72);\r\n\r\n    font-size: 12px;\r\n}\r\n\r\n#bpts-surf-holidays .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: #fff;\r\n\r\n    color: #111 !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-surf-holidays .bpts-holiday-grid {\r\n        grid-template-columns:\r\n            repeat(2, 1fr);\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-holidays {\r\n        padding:\r\n            60px\r\n            0\r\n            66px;\r\n    }\r\n\r\n    #bpts-surf-holidays .bpts-holidays-inner {\r\n        width:\r\n            min(\r\n                100% - 28px,\r\n                1450px\r\n            );\r\n    }\r\n\r\n    #bpts-surf-holidays .bpts-holidays-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-surf-holidays .bpts-holiday-grid {\r\n        grid-template-columns:\r\n            1fr;\r\n    }\r\n\r\n    #bpts-surf-holidays .bpts-holiday-image {\r\n        height: 250px;\r\n    }\r\n\r\n    #bpts-surf-holidays .bpts-holidays-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-surf-holidays .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-holidays-inner\">\r\n\r\n\r\n    <!-- =====================================================\r\n         SECTION HEADER\r\n    ====================================================== -->\r\n\r\n    <div class=\"bpts-holidays-top\">\r\n\r\n        <div>\r\n\r\n            <div class=\"bpts-kicker\">\r\n                Surf travel\r\n            <\/div>\r\n\r\n            <h2>\r\n                Book your next surf trip\r\n            <\/h2>\r\n\r\n            <p class=\"bpts-description\">\r\n\r\n                Discover surf camps, surf coaching and\r\n                all-inclusive surf holidays in some of\r\n                the world's best surf destinations.\r\n\r\n            <\/p>\r\n\r\n        <\/div>\r\n\r\n\r\n        <a\r\n            href=\"\/surf-camps\/\"\r\n            class=\"bpts-view-all\"\r\n        >\r\n            View all surf holidays \u2192\r\n        <\/a>\r\n\r\n    <\/div>\r\n\r\n\r\n\r\n    <!-- =====================================================\r\n         PACKAGE GRID\r\n    ====================================================== -->\r\n\r\n    <div class=\"bpts-holiday-grid\">\r\n\r\n\r\n        <!-- =================================================\r\n             MOROCCO\r\n        ================================================== -->\r\n\r\n        <a\r\n            href=\"\/surf-camps\/morocco\/\"\r\n            class=\"bpts-holiday-card\"\r\n        >\r\n\r\n            <div class=\"bpts-holiday-image\">\r\n\r\n                <img decoding=\"async\"\r\n                    src=\"https:\/\/images.unsplash.com\/photo-1502680390469-be75c86b636f?auto=format&fit=crop&w=1000&q=85\"\r\n                    alt=\"Morocco surf holiday\"\r\n                    loading=\"lazy\"\r\n                >\r\n\r\n\r\n                <span\r\n                    class=\"\r\n                        bpts-holiday-badge\r\n                        bpts-best-seller\r\n                    \"\r\n                >\r\n                    Best Seller\r\n                <\/span>\r\n\r\n\r\n                <span class=\"bpts-location-badge\">\r\n                    Morocco\r\n                <\/span>\r\n\r\n            <\/div>\r\n\r\n\r\n            <div class=\"bpts-holiday-body\">\r\n\r\n                <div class=\"bpts-holiday-location\">\r\n                    Taghazout Bay \u00b7 Morocco\r\n                <\/div>\r\n\r\n\r\n                <h3 class=\"bpts-holiday-title\">\r\n                    Surf & Yoga Holiday\r\n                <\/h3>\r\n\r\n\r\n                <p class=\"bpts-holiday-subtitle\">\r\n\r\n                    A complete surf escape with daily\r\n                    surf sessions, yoga, accommodation\r\n                    and meals.\r\n\r\n                <\/p>\r\n\r\n\r\n                <div class=\"bpts-holiday-features\">\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        7 days\r\n                    <\/span>\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        Surf coaching\r\n                    <\/span>\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        Yoga\r\n                    <\/span>\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        Meals included\r\n                    <\/span>\r\n\r\n                <\/div>\r\n\r\n\r\n\r\n                <!-- =========================================\r\n                     SOCIAL PROOF\r\n\r\n                     DEMO COUNTS:\r\n                     Replace these with real data later.\r\n                ========================================== -->\r\n\r\n                <div class=\"bpts-social-proof\">\r\n\r\n\r\n                    <!-- INTEREST -->\r\n\r\n                    <div class=\"bpts-proof-row\">\r\n\r\n                        <span class=\"bpts-proof-icon\">\r\n\r\n                            <svg viewBox=\"0 0 24 24\">\r\n\r\n                                <path\r\n                                    d=\"M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6S2 12 2 12z\"\r\n                                ><\/path>\r\n\r\n                                <circle\r\n                                    cx=\"12\"\r\n                                    cy=\"12\"\r\n                                    r=\"2.5\"\r\n                                ><\/circle>\r\n\r\n                            <\/svg>\r\n\r\n                        <\/span>\r\n\r\n\r\n                        <div class=\"bpts-interest-wrap\">\r\n\r\n                            <div class=\"bpts-mini-avatars\">\r\n\r\n                                <span class=\"bpts-mini-avatar\">\r\n                                    A\r\n                                <\/span>\r\n\r\n                                <span class=\"bpts-mini-avatar\">\r\n                                    M\r\n                                <\/span>\r\n\r\n                                <span class=\"bpts-mini-avatar\">\r\n                                    +45\r\n                                <\/span>\r\n\r\n                            <\/div>\r\n\r\n\r\n                            <span>\r\n\r\n                                <strong>\r\n                                    47 people\r\n                                <\/strong>\r\n\r\n                                interested in this trip\r\n\r\n                            <\/span>\r\n\r\n                        <\/div>\r\n\r\n                    <\/div>\r\n\r\n\r\n\r\n                    <!-- BOOKINGS -->\r\n\r\n                    <div\r\n                        class=\"\r\n                            bpts-proof-row\r\n                            bpts-proof-bookings\r\n                        \"\r\n                    >\r\n\r\n                        <span class=\"bpts-proof-icon\">\r\n                            \u2197\r\n                        <\/span>\r\n\r\n                        <span class=\"bpts-live-booking\">\r\n\r\n                            <span class=\"bpts-live-dot\"><\/span>\r\n\r\n                            <span>\r\n\r\n                                <strong>\r\n                                    8 bookings\r\n                                <\/strong>\r\n\r\n                                in the last 24 hours\r\n\r\n                            <\/span>\r\n\r\n                        <\/span>\r\n\r\n                    <\/div>\r\n\r\n\r\n                <\/div>\r\n\r\n\r\n\r\n                <!-- PRICE -->\r\n\r\n                <div class=\"bpts-price-row\">\r\n\r\n                    <div>\r\n\r\n                        <span class=\"bpts-price-label\">\r\n                            From\r\n                        <\/span>\r\n\r\n                        <div class=\"bpts-price\">\r\n\r\n                            \u20ac499\r\n\r\n                            <small>\r\n                                \/ person\r\n                            <\/small>\r\n\r\n                        <\/div>\r\n\r\n                    <\/div>\r\n\r\n\r\n                    <span class=\"bpts-package-button\">\r\n                        View Package \u2192\r\n                    <\/span>\r\n\r\n                <\/div>\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-camps\/bali\/\"\r\n            class=\"bpts-holiday-card\"\r\n        >\r\n\r\n            <div class=\"bpts-holiday-image\">\r\n\r\n                <img decoding=\"async\"\r\n                    src=\"https:\/\/images.unsplash.com\/photo-1537996194471-e657df975ab4?auto=format&fit=crop&w=1000&q=85\"\r\n                    alt=\"Bali surf holiday\"\r\n                    loading=\"lazy\"\r\n                >\r\n\r\n\r\n                <span\r\n                    class=\"\r\n                        bpts-holiday-badge\r\n                        bpts-trending\r\n                    \"\r\n                >\r\n                    Trending\r\n                <\/span>\r\n\r\n\r\n                <span class=\"bpts-location-badge\">\r\n                    Bali\r\n                <\/span>\r\n\r\n            <\/div>\r\n\r\n\r\n            <div class=\"bpts-holiday-body\">\r\n\r\n                <div class=\"bpts-holiday-location\">\r\n                    Bali \u00b7 Indonesia\r\n                <\/div>\r\n\r\n\r\n                <h3 class=\"bpts-holiday-title\">\r\n                    Bali Surf Coaching Week\r\n                <\/h3>\r\n\r\n\r\n                <p class=\"bpts-holiday-subtitle\">\r\n\r\n                    Improve your surfing with guided\r\n                    sessions and coaching near Bali's\r\n                    famous surf breaks.\r\n\r\n                <\/p>\r\n\r\n\r\n                <div class=\"bpts-holiday-features\">\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        7 days\r\n                    <\/span>\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        Coaching\r\n                    <\/span>\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        Accommodation\r\n                    <\/span>\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        Equipment\r\n                    <\/span>\r\n\r\n                <\/div>\r\n\r\n\r\n\r\n                <!-- SOCIAL PROOF -->\r\n\r\n                <div class=\"bpts-social-proof\">\r\n\r\n\r\n                    <div class=\"bpts-proof-row\">\r\n\r\n                        <span class=\"bpts-proof-icon\">\r\n\r\n                            <svg viewBox=\"0 0 24 24\">\r\n\r\n                                <path\r\n                                    d=\"M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6S2 12 2 12z\"\r\n                                ><\/path>\r\n\r\n                                <circle\r\n                                    cx=\"12\"\r\n                                    cy=\"12\"\r\n                                    r=\"2.5\"\r\n                                ><\/circle>\r\n\r\n                            <\/svg>\r\n\r\n                        <\/span>\r\n\r\n\r\n                        <div class=\"bpts-interest-wrap\">\r\n\r\n                            <div class=\"bpts-mini-avatars\">\r\n\r\n                                <span class=\"bpts-mini-avatar\">\r\n                                    S\r\n                                <\/span>\r\n\r\n                                <span class=\"bpts-mini-avatar\">\r\n                                    J\r\n                                <\/span>\r\n\r\n                                <span class=\"bpts-mini-avatar\">\r\n                                    +30\r\n                                <\/span>\r\n\r\n                            <\/div>\r\n\r\n\r\n                            <span>\r\n\r\n                                <strong>\r\n                                    32 people\r\n                                <\/strong>\r\n\r\n                                interested in this trip\r\n\r\n                            <\/span>\r\n\r\n                        <\/div>\r\n\r\n                    <\/div>\r\n\r\n\r\n\r\n                    <div\r\n                        class=\"\r\n                            bpts-proof-row\r\n                            bpts-proof-bookings\r\n                        \"\r\n                    >\r\n\r\n                        <span class=\"bpts-proof-icon\">\r\n                            \u2197\r\n                        <\/span>\r\n\r\n\r\n                        <span class=\"bpts-live-booking\">\r\n\r\n                            <span class=\"bpts-live-dot\"><\/span>\r\n\r\n                            <span>\r\n\r\n                                <strong>\r\n                                    5 bookings\r\n                                <\/strong>\r\n\r\n                                in the last 24 hours\r\n\r\n                            <\/span>\r\n\r\n                        <\/span>\r\n\r\n                    <\/div>\r\n\r\n\r\n                <\/div>\r\n\r\n\r\n\r\n                <div class=\"bpts-price-row\">\r\n\r\n                    <div>\r\n\r\n                        <span class=\"bpts-price-label\">\r\n                            From\r\n                        <\/span>\r\n\r\n\r\n                        <div class=\"bpts-price\">\r\n\r\n                            \u20ac599\r\n\r\n                            <small>\r\n                                \/ person\r\n                            <\/small>\r\n\r\n                        <\/div>\r\n\r\n                    <\/div>\r\n\r\n\r\n                    <span class=\"bpts-package-button\">\r\n                        View Package \u2192\r\n                    <\/span>\r\n\r\n                <\/div>\r\n\r\n            <\/div>\r\n\r\n        <\/a>\r\n\r\n\r\n\r\n        <!-- =================================================\r\n             PORTUGAL\r\n        ================================================== -->\r\n\r\n        <a\r\n            href=\"\/surf-camps\/portugal\/\"\r\n            class=\"bpts-holiday-card\"\r\n        >\r\n\r\n            <div class=\"bpts-holiday-image\">\r\n\r\n                <img decoding=\"async\"\r\n                    src=\"https:\/\/images.unsplash.com\/photo-1555881400-74d7acaacd8b?auto=format&fit=crop&w=1000&q=85\"\r\n                    alt=\"Portugal surf camp\"\r\n                    loading=\"lazy\"\r\n                >\r\n\r\n\r\n                <span class=\"bpts-holiday-badge\">\r\n                    Popular\r\n                <\/span>\r\n\r\n\r\n                <span class=\"bpts-location-badge\">\r\n                    Portugal\r\n                <\/span>\r\n\r\n            <\/div>\r\n\r\n\r\n            <div class=\"bpts-holiday-body\">\r\n\r\n                <div class=\"bpts-holiday-location\">\r\n                    Portugal\r\n                <\/div>\r\n\r\n\r\n                <h3 class=\"bpts-holiday-title\">\r\n                    Portugal Surf Camp\r\n                <\/h3>\r\n\r\n\r\n                <p class=\"bpts-holiday-subtitle\">\r\n\r\n                    Stay close to the Atlantic coast\r\n                    with daily surfing and accommodation\r\n                    included.\r\n\r\n                <\/p>\r\n\r\n\r\n                <div class=\"bpts-holiday-features\">\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        5 days\r\n                    <\/span>\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        Surf lessons\r\n                    <\/span>\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        Accommodation\r\n                    <\/span>\r\n\r\n                    <span class=\"bpts-feature\">\r\n                        Equipment\r\n                    <\/span>\r\n\r\n                <\/div>\r\n\r\n\r\n\r\n                <!-- SOCIAL PROOF -->\r\n\r\n                <div class=\"bpts-social-proof\">\r\n\r\n\r\n                    <div class=\"bpts-proof-row\">\r\n\r\n                        <span class=\"bpts-proof-icon\">\r\n\r\n                            <svg viewBox=\"0 0 24 24\">\r\n\r\n                                <path\r\n                                    d=\"M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6S2 12 2 12z\"\r\n                                ><\/path>\r\n\r\n                                <circle\r\n                                    cx=\"12\"\r\n                                    cy=\"12\"\r\n                                    r=\"2.5\"\r\n                                ><\/circle>\r\n\r\n                            <\/svg>\r\n\r\n                        <\/span>\r\n\r\n\r\n                        <div class=\"bpts-interest-wrap\">\r\n\r\n                            <div class=\"bpts-mini-avatars\">\r\n\r\n                                <span class=\"bpts-mini-avatar\">\r\n                                    L\r\n                                <\/span>\r\n\r\n                                <span class=\"bpts-mini-avatar\">\r\n                                    R\r\n                                <\/span>\r\n\r\n                                <span class=\"bpts-mini-avatar\">\r\n                                    +20\r\n                                <\/span>\r\n\r\n                            <\/div>\r\n\r\n\r\n                            <span>\r\n\r\n                                <strong>\r\n                                    22 people\r\n                                <\/strong>\r\n\r\n                                interested in this trip\r\n\r\n                            <\/span>\r\n\r\n                        <\/div>\r\n\r\n                    <\/div>\r\n\r\n\r\n\r\n                    <div\r\n                        class=\"\r\n                            bpts-proof-row\r\n                            bpts-proof-bookings\r\n                        \"\r\n                    >\r\n\r\n                        <span class=\"bpts-proof-icon\">\r\n                            \u2197\r\n                        <\/span>\r\n\r\n\r\n                        <span class=\"bpts-live-booking\">\r\n\r\n                            <span class=\"bpts-live-dot\"><\/span>\r\n\r\n                            <span>\r\n\r\n                                <strong>\r\n                                    3 bookings\r\n                                <\/strong>\r\n\r\n                                in the last 24 hours\r\n\r\n                            <\/span>\r\n\r\n                        <\/span>\r\n\r\n                    <\/div>\r\n\r\n\r\n                <\/div>\r\n\r\n\r\n\r\n                <div class=\"bpts-price-row\">\r\n\r\n                    <div>\r\n\r\n                        <span class=\"bpts-price-label\">\r\n                            From\r\n                        <\/span>\r\n\r\n\r\n                        <div class=\"bpts-price\">\r\n\r\n                            \u20ac449\r\n\r\n                            <small>\r\n                                \/ person\r\n                            <\/small>\r\n\r\n                        <\/div>\r\n\r\n                    <\/div>\r\n\r\n\r\n                    <span class=\"bpts-package-button\">\r\n                        View Package \u2192\r\n                    <\/span>\r\n\r\n                <\/div>\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-holidays-bottom\">\r\n\r\n        <div>\r\n\r\n            <strong>\r\n                Looking for the right surf holiday?\r\n            <\/strong>\r\n\r\n            <span>\r\n\r\n                Browse surf camps by destination,\r\n                level, duration and package type.\r\n\r\n            <\/span>\r\n\r\n        <\/div>\r\n\r\n\r\n        <a\r\n            href=\"\/surf-camps\/\"\r\n            class=\"bpts-bottom-button\"\r\n        >\r\n            Explore All Surf Holidays \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-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-65176\" class=\"bpts-trip-search\" data-destinations=\"https:\/\/surf-conditions.com\/fr\/wp-json\/bpts-trip\/v1\/destinations\" data-spots=\"https:\/\/surf-conditions.com\/fr\/wp-json\/bpts-trip\/v1\/spots\" data-forecast=\"https:\/\/surf-conditions.com\/fr\/wp-json\/bpts-surf\/v1\/forecast\" data-today=\"2026-08-16\" 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;}]\">\n            <style>\n                #bpts-trip-65176{--bpts-ink:#090909;--bpts-muted:#777;--bpts-line:#e7e7e7;--bpts-soft:#f4f4f4;--bpts-blue:#4353CC;font-family:inherit;color:var(--bpts-ink);width:100%}\n                #bpts-trip-65176 *{box-sizing:border-box}\n                #bpts-trip-65176 .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-65176 .bpts-search-grid{display:grid;grid-template-columns:1.05fr 1.18fr 1.18fr .9fr 1.25fr .88fr;gap:14px;align-items:stretch}\n                #bpts-trip-65176 .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-65176 button.bpts-field{cursor:pointer}\n                #bpts-trip-65176 button.bpts-field:hover{background:#f2f3f5;border-color:#dfe3e8}\n                #bpts-trip-65176 .bpts-field-icon{width:18px;height:18px;display:flex;align-items:center;justify-content:center;color:#111}\n                #bpts-trip-65176 .bpts-field-icon svg,#bpts-trip-65176 .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-65176 .bpts-picker-text{min-width:0;display:flex;flex-direction:column;gap:2px}\n                #bpts-trip-65176 .bpts-picker-label{font-size:15px;text-transform:none;letter-spacing:0;color:#111;font-weight:800}\n                #bpts-trip-65176 .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-65176 .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-65176 .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-65176 .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-65176 .bpts-search-btn:hover{filter:brightness(.94)}\n                #bpts-trip-65176 .bpts-search-btn:active{transform:translateY(1px)}\n                #bpts-trip-65176 .bpts-modal{display:none;position:fixed;inset:0;z-index:999999;align-items:center;justify-content:center;padding:24px}\n                #bpts-trip-65176 .bpts-modal.is-open{display:flex}\n                #bpts-trip-65176 .bpts-modal-backdrop{position:absolute;inset:0;background:rgba(38,45,58,.48);backdrop-filter:blur(2px)}\n                #bpts-trip-65176 .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-65176 .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-65176 .bpts-modal-head h3{margin:0;font-size:18px;line-height:1.2;letter-spacing:-.01em;font-weight:800}\n                #bpts-trip-65176 .bpts-modal-kicker{display:none}\n                #bpts-trip-65176 .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-65176 .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-65176 .bpts-modal-search:focus-within{background:#fff;border-color:#111}\n                #bpts-trip-65176 .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-65176 .bpts-modal-list{overflow:auto;padding:6px 16px 18px;min-height:160px}\n                #bpts-trip-65176 .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-65176 .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-65176 .bpts-modal-list button:hover{background:#fff}\n                #bpts-trip-65176 .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-65176 .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-65176 .bpts-place-type{font-size:9px;text-transform:uppercase;letter-spacing:.08em;color:#999;font-weight:800}\n                #bpts-trip-65176 .bpts-list-hint{padding:20px;text-align:center;color:#888;font-size:13px}\n                #bpts-trip-65176 .bpts-calendar-modal{width:min(920px,100%)}\n                #bpts-trip-65176 .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-65176 .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-65176 .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-65176 .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-65176 .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-65176 .bpts-month-title{text-align:center;font-size:16px;font-weight:800;margin:2px 0 14px}\n                #bpts-trip-65176 .bpts-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:0}#bpts-trip-65176 .bpts-days{display:grid;grid-template-columns:repeat(7,1fr);gap:0}\n                #bpts-trip-65176 .bpts-weekdays span{text-align:center;font-size:11px;color:#4c5360;font-weight:700;padding:7px 0;text-transform:none}\n                #bpts-trip-65176 .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-65176 .bpts-day:hover:not(:disabled):not(.is-range):not(.is-start):not(.is-end){background:#f5f6f8}\n                #bpts-trip-65176 .bpts-day:disabled{color:#ccc;cursor:not-allowed}\n                #bpts-trip-65176 .bpts-day.is-range{background:#fff;border-radius:0}\n                #bpts-trip-65176 .bpts-day.is-start,#bpts-trip-65176 .bpts-day.is-end,#bpts-trip-65176 .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-65176 .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-65176 .bpts-calendar-actions{display:flex;justify-content:flex-end;gap:10px;padding:16px 24px 22px;border-top:1px solid #eee}\n                #bpts-trip-65176 .bpts-clear-dates,#bpts-trip-65176 .bpts-apply-dates{min-height:44px;padding:0 18px;border-radius:10px;font:inherit;font-weight:800;cursor:pointer}\n                #bpts-trip-65176 .bpts-clear-dates{background:#fff;border:1px solid #ddd;color:#111}\n                #bpts-trip-65176 .bpts-apply-dates{background:var(--bpts-blue);border:0;color:#fff}\n                #bpts-trip-65176 .bpts-choice-modal{width:min(500px,100%)}\n                #bpts-trip-65176 .bpts-choice-list{padding:14px 18px 8px;display:grid;gap:7px;overflow:auto}\n                #bpts-trip-65176 .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-65176 .bpts-choice:hover{border-color:#b9c0ca;background:#fafbfc}\n                #bpts-trip-65176 [data-choice-list=\"trip\"] .bpts-choice{grid-template-columns:1fr 22px}\n                #bpts-trip-65176 .bpts-choice.is-selected{border-color:var(--bpts-blue);box-shadow:0 0 0 1px var(--bpts-blue)}\n                #bpts-trip-65176 .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-65176 .bpts-choice[data-choice-value=\"beginner\"] .bpts-choice-icon{background:#eaf8ed;color:#35a853}\n                #bpts-trip-65176 .bpts-choice[data-choice-value=\"intermediate\"] .bpts-choice-icon{background:#fff4d8;color:#f0a600}\n                #bpts-trip-65176 .bpts-choice[data-choice-value=\"advanced\"] .bpts-choice-icon{background:#ffebe5;color:#ed4a2c}\n                #bpts-trip-65176 .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-65176 .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-65176 .bpts-choice.is-selected .bpts-choice-check{background:var(--bpts-blue);border-color:var(--bpts-blue)}\n                #bpts-trip-65176 .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-65176 .bpts-choice-cancel,#bpts-trip-65176 .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-65176 .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-65176 .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-65176 .bpts-error.is-open{display:block}\n                #bpts-trip-65176 .bpts-results{margin-top:32px}\n                #bpts-trip-65176 .bpts-results-head{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:18px}\n                #bpts-trip-65176 .bpts-kicker{font-size:10px;text-transform:uppercase;letter-spacing:.12em;font-weight:900;color:#777;margin-bottom:5px}\n                #bpts-trip-65176 .bpts-results h2{font-size:clamp(25px,3vw,40px);line-height:1.05;margin:0;letter-spacing:-.035em}\n                #bpts-trip-65176 .bpts-summary{font-size:13px;color:#737373;text-align:right}\n                #bpts-trip-65176 .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-65176 .bpts-mode-note.is-open{display:block}\n                #bpts-trip-65176 .bpts-cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:15px}\n                #bpts-trip-65176 .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-65176 .bpts-card:hover{transform:translateY(-2px);box-shadow:0 14px 35px rgba(0,0,0,.07)}\n                #bpts-trip-65176 .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-65176 .bpts-card-place{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#777;font-weight:800;margin-bottom:4px}\n                #bpts-trip-65176 .bpts-card-name{font-size:20px;font-weight:900;line-height:1.1}\n                #bpts-trip-65176 .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-65176 .bpts-score strong{font-size:18px;line-height:1}.bpts-score span{font-size:8px;opacity:.7;margin-top:2px}\n                #bpts-trip-65176 .bpts-card-body{padding:14px 17px 16px;display:flex;flex-direction:column;gap:10px;flex:1}\n                #bpts-trip-65176 .bpts-pill-row{display:flex;flex-wrap:wrap;gap:6px}\n                #bpts-trip-65176 .bpts-pill{background:#f4f4f4;border-radius:999px;padding:6px 8px;font-size:10px;font-weight:750;color:#444}\n                #bpts-trip-65176 .bpts-metrics{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:2px}\n                #bpts-trip-65176 .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-65176 .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-65176 .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-65176 .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-65176 .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-65176 .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-65176 .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-65176 .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-65176 .bpts-loading{padding:28px;text-align:center;border:1px dashed #ddd;border-radius:16px;color:#777;font-size:13px}\n                #bpts-trip-65176 .bpts-empty{padding:30px;text-align:center;background:#f7f7f7;border-radius:16px;color:#555}\n                @media(max-width:1250px){#bpts-trip-65176 .bpts-top-pick{grid-template-columns:1fr}#bpts-trip-65176 .bpts-search-grid{grid-template-columns:repeat(3,1fr)}#bpts-trip-65176 .bpts-search-btn{min-height:62px}#bpts-trip-65176 .bpts-cards{grid-template-columns:repeat(2,1fr)}}\n                @media(max-width:760px){#bpts-trip-65176 .bpts-top-metrics{grid-template-columns:1fr}#bpts-trip-65176 .bpts-top-pick h3{font-size:25px}#bpts-trip-65176 .bpts-search-shell{padding:10px}#bpts-trip-65176 .bpts-search-grid{grid-template-columns:1fr;gap:9px}#bpts-trip-65176 .bpts-field{min-height:58px;padding:0 15px}#bpts-trip-65176 .bpts-search-btn{width:100%;min-height:58px}#bpts-trip-65176 .bpts-results-head{align-items:flex-start;flex-direction:column}#bpts-trip-65176 .bpts-summary{text-align:left}#bpts-trip-65176 .bpts-cards{grid-template-columns:1fr}#bpts-trip-65176 .bpts-modal{padding:10px;align-items:flex-end}#bpts-trip-65176 .bpts-modal-card{border-radius:12px;max-height:88vh}#bpts-trip-65176 .bpts-modal-head{padding:20px 18px 15px}#bpts-trip-65176 .bpts-modal-search{margin:14px 18px 8px}#bpts-trip-65176 .bpts-calendars{grid-template-columns:1fr;padding:8px 10px 18px}.bpts-month{padding:0 4px}#bpts-trip-65176 .bpts-calendars .bpts-month:nth-child(2){display:none}#bpts-trip-65176 .bpts-calendar-toolbar{padding:12px 18px 4px}#bpts-trip-65176 .bpts-calendar-actions{padding:14px 18px 18px}}\n            \n                #bpts-trip-65176 .bpts-score.bpts-score-red{background:#E53935!important;color:#fff!important}\n                #bpts-trip-65176 .bpts-score.bpts-score-orange{background:#F59E0B!important;color:#fff!important}\n                #bpts-trip-65176 .bpts-score.bpts-score-yellow{background:#FACC15!important;color:#111!important}\n                #bpts-trip-65176 .bpts-score.bpts-score-green{background:#16A34A!important;color:#fff!important}\n                #bpts-trip-65176 .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-65176 .bpts-result-card .bpts-card-head{\n                    background:#000!important;\n                    color:#fff!important;\n                    padding:20px 22px!important;\n                }\n                #bpts-trip-65176 .bpts-result-card .bpts-card-head h3,\n                #bpts-trip-65176 .bpts-result-card .bpts-card-head h3 a,\n                #bpts-trip-65176 .bpts-result-card .bpts-card-head .bpts-rank,\n                #bpts-trip-65176 .bpts-result-card .bpts-card-head .bpts-location{\n                    color:#fff!important;\n                }\n                #bpts-trip-65176 .bpts-result-card .bpts-card-head a:hover{\n                    color:#fff!important;\n                }\n\n                #bpts-trip-65176 .bpts-card-header{\n                    background:#000!important;\n                    color:#fff!important;\n                }\n                #bpts-trip-65176 .bpts-card-header h3,\n                #bpts-trip-65176 .bpts-card-header a,\n                #bpts-trip-65176 .bpts-card-header [class*=\"rank\"],\n                #bpts-trip-65176 .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-65176 .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-65176 .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-65176 .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-65176 .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-65176 .bpts-destination-score-wrap{\n                    display:flex;\n                    align-items:center;\n                    gap:12px;\n                    flex:0 0 auto\n                }\n                #bpts-trip-65176 .bpts-destination-score-label{\n                    font-size:13px;\n                    font-weight:800;\n                    color:#fff;\n                    white-space:nowrap\n                }\n                #bpts-trip-65176 .bpts-destination-body{\n                    padding:28px\n                }\n                #bpts-trip-65176 .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-65176 .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-65176 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-65176 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-65176 .bpts-package-card.bpts-package-hidden{\n                    display:none!important\n                }\n\n                #bpts-trip-65176 .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-65176 .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-65176 .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-65176 .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-65176 .bpts-package-heart.is-saved{\n                    background:#fff!important;\n                    color:#e83b55!important\n                }\n\n                #bpts-trip-65176 .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-65176 .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-65176 .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-65176 .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-65176 .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-65176 .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-65176 .bpts-package-stars{\n                    color:#f1bf28!important;\n                    letter-spacing:0!important;\n                    font-size:14px!important\n                }\n\n                #bpts-trip-65176 .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-65176 .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-65176 .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-65176 .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-65176 .bpts-package-from{\n                    margin:0 0 4px!important;\n                    color:#747887!important;\n                    font-size:11px!important\n                }\n                #bpts-trip-65176 .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-65176 .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-65176 .bpts-package-more-wrap{\n                    display:flex!important;\n                    justify-content:center!important;\n                    margin-top:25px!important\n                }\n                #bpts-trip-65176 .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-65176 .bpts-view-more-packages:hover{\n                    background:#4353CC!important;\n                    color:#fff!important\n                }\n\n                #bpts-trip-65176 .bpts-nearby-wrap{\n                    margin-top:28px!important;\n                    padding-top:22px!important;\n                    border-top:1px solid #eceef2!important\n                }\n                #bpts-trip-65176 .bpts-nearby-spots{\n                    display:flex!important;\n                    flex-wrap:wrap!important;\n                    gap:10px!important\n                }\n                #bpts-trip-65176 .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-65176 .bpts-package-grid{\n                        grid-template-columns:repeat(3,minmax(0,1fr))!important\n                    }\n                }\n                @media(max-width:900px){\n                    #bpts-trip-65176 .bpts-package-grid{\n                        grid-template-columns:repeat(2,minmax(0,1fr))!important\n                    }\n                }\n                @media(max-width:700px){\n                    #bpts-trip-65176 .bpts-destination-head{\n                        padding:20px!important;\n                        align-items:flex-start!important\n                    }\n                    #bpts-trip-65176 .bpts-destination-head h3{\n                        font-size:24px!important\n                    }\n                    #bpts-trip-65176 .bpts-destination-score-label{\n                        display:none!important\n                    }\n                    #bpts-trip-65176 .bpts-destination-body{\n                        padding:20px!important\n                    }\n                }\n                @media(max-width:560px){\n                    #bpts-trip-65176 .bpts-package-grid{\n                        grid-template-columns:1fr!important\n                    }\n                    #bpts-trip-65176 .bpts-package-media{\n                        height:240px!important\n                    }\n                }\n\n\/* v2.3.1 \u2014 restore clickability on package result links *\/\n                #bpts-trip-65176 .bpts-package-btn,\n                #bpts-trip-65176 .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-65176 .bpts-destination-result,\n                #bpts-trip-65176 .bpts-destination-body,\n                #bpts-trip-65176 .bpts-package-card,\n                #bpts-trip-65176 .bpts-nearby-wrap,\n                #bpts-trip-65176 .bpts-nearby-spots{\n                    pointer-events:auto!important;\n                }\n                #bpts-trip-65176 .bpts-destination-result::before,\n                #bpts-trip-65176 .bpts-destination-result::after,\n                #bpts-trip-65176 .bpts-package-card::before,\n                #bpts-trip-65176 .bpts-package-card::after{\n                    pointer-events:none!important;\n                }\n\n            \n                \/* v2.3.1 interaction repair *\/\n                #bpts-trip-65176 button,\n                #bpts-trip-65176 a,\n                #bpts-trip-65176 [data-open-picker],\n                #bpts-trip-65176 [data-choice-value],\n                #bpts-trip-65176 [data-airport-code],\n                #bpts-trip-65176 [data-dest-value]{pointer-events:auto!important}\n                #bpts-trip-65176 .bpts-modal-backdrop{pointer-events:auto!important}\n                #bpts-trip-65176 .bpts-modal-card{pointer-events:auto!important}\n\n            \n                #bpts-trip-65176 .bpts-package-heart.is-saved{\n                    background:#fff;color:#E83B55\n                }\n\n            \n                \/* v2.3.1 \u2014 fixed favorite icon *\/\n                #bpts-trip-65176 .bpts-package-heart{\n                    overflow:hidden!important;\n                    font-size:0!important;\n                    line-height:0!important;\n                }\n                #bpts-trip-65176 .bpts-package-heart svg,\n                #bpts-trip-65176 .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-65176 .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-65176 .bpts-package-badge img.emoji,\n                #bpts-trip-65176 .bpts-package-badge img.wp-smiley,\n                #bpts-trip-65176 .bpts-package-media img.emoji,\n                #bpts-trip-65176 .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-65176 .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-65176 .bpts-package-more-wrap{\n                    display:flex!important;\n                    justify-content:center!important;\n                    margin-top:28px!important;\n                }\n                #bpts-trip-65176 .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-65176 .bpts-view-more-packages:hover{\n                    background:#fff!important;\n                    color:#4353CC!important;\n                    border-color:#4353CC!important;\n                }\n                #bpts-trip-65176 .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-65176 .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-65176 .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-65176 .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-65176 .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-65176 .bpts-nearby-row{\n                        flex-direction:column!important;\n                        align-items:flex-start!important;\n                    }\n                    #bpts-trip-65176 .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-65176 .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-65176 .bpts-nearby-spots{\n                    min-width:0!important;\n                }\n                #bpts-trip-65176 .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-65176 .bpts-nearby-row{\n                        grid-template-columns:1fr!important;\n                    }\n                    #bpts-trip-65176 .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-65176 .bpts-package-card[data-package-url]{\n                    cursor:pointer!important;\n                }\n                #bpts-trip-65176 .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-65176 .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-65176 .bpts-package-interest strong{\n                    color:#111!important;\n                    font-weight:900!important;\n                }\n                #bpts-trip-65176 .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-65176 .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            <form class=\"bpts-search-shell\" autocomplete=\"off\">\n                <div class=\"bpts-search-grid\">\n                    <button class=\"bpts-field bpts-picker-trigger\" type=\"button\" data-open-picker=\"airport\" aria-label=\"Choose departure airport\">\n                        <span class=\"bpts-field-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M3 11.5 21 4l-7.5 18-2.2-8.3L3 11.5Z\"\/><path d=\"m11.3 13.7 4.1-4.1\"\/><\/svg><\/span>\n                        <span class=\"bpts-picker-text\"><span class=\"bpts-picker-label\">From airport<\/span><strong data-origin-display>Choose airport<\/strong><\/span>\n                        <span class=\"bpts-plus\">+<\/span>\n                    <\/button>\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>Ao\u00fbt 17 \u2013 Ao\u00fbt 23<\/strong><\/span>\n                        <span class=\"bpts-plus\">+<\/span>\n                    <\/button>\n                    <input type=\"hidden\" name=\"start\" value=\"2026-08-17\">\n                    <input type=\"hidden\" name=\"end\" value=\"2026-08-23\">\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\n            <div class=\"bpts-modal\" data-picker=\"airport\" 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 departure airport\">\n                    <div class=\"bpts-modal-head\"><div><span class=\"bpts-modal-kicker\">Departure<\/span><h3>Select departure airport<\/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-airport-search placeholder=\"Search airport, city or country...\" autocomplete=\"off\"><\/div>\n                    <div class=\"bpts-modal-tabs\"><button type=\"button\" class=\"bpts-modal-tab is-active\" tabindex=\"-1\">AIRPORTS<\/button><\/div>\n                    <div class=\"bpts-list-section\">Popular airports<\/div>\n                    <div class=\"bpts-modal-list\" data-airport-list><\/div>\n                <\/div>\n            <\/div>\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            <section class=\"bpts-results\" aria-live=\"polite\"><\/section>\n\n            <script>\n            (function(){\n                const root=document.getElementById(\"bpts-trip-65176\"); if(!root)return;\n\n                const interestAjaxUrl=\"https:\\\/\\\/surf-conditions.com\\\/wp-admin\\\/admin-ajax.php\";\n                const interestNonce=\"73faa42a81\";\n                const form=root.querySelector('form'), destInput=form.elements.destination, results=root.querySelector('.bpts-results'), err=root.querySelector('.bpts-error');\n                const endpoints={destinations:root.dataset.destinations,spots:root.dataset.spots,forecast:root.dataset.forecast};\n                const airports=JSON.parse(root.dataset.airports||'[]');\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                function error(msg){err.textContent=msg||'';err.classList.toggle('is-open',!!msg)}\n                function openPicker(name){const m=root.querySelector('[data-picker=\"'+name+'\"]');if(!m)return;m.classList.add('is-open');m.setAttribute('aria-hidden','false');document.documentElement.style.overflow='hidden';setTimeout(()=>{const i=m.querySelector('input[type=\"search\"]');if(i)i.focus()},50);if(name==='airport')renderAirports('');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;m.classList.remove('is-open');m.setAttribute('aria-hidden','true');if(!root.querySelector('.bpts-modal.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                document.addEventListener('keydown',e=>{if(e.key==='Escape'){const m=root.querySelector('.bpts-modal.is-open');if(m)closePicker(m)}});\n\n                const airportSearch=root.querySelector('[data-airport-search]'),airportList=root.querySelector('[data-airport-list]');\n                function renderAirports(q){q=(q||'').trim().toLowerCase();let list=airports.filter(a=>!q||[a.code,a.city,a.country,a.label].join(' ').toLowerCase().includes(q)).slice(0,28);airportList.innerHTML=list.length?list.map(a=>`<button type=\"button\" data-airport-code=\"${esc(a.code)}\" data-airport-label=\"${esc(a.label)}\"><span class=\"bpts-place-code\">${esc(a.code)}<\/span><span class=\"bpts-place-main\"><strong>${esc(a.city)}<\/strong><span>${esc(a.country)}<\/span><\/span><span class=\"bpts-place-type\">Airport<\/span><\/button>`).join(''):'<div class=\"bpts-list-hint\">No airport found. Try a city or IATA code.<\/div>'}\n                airportSearch.addEventListener('input',()=>renderAirports(airportSearch.value));\n                airportList.addEventListener('click',e=>{const b=e.target.closest('[data-airport-code]');if(!b)return;form.elements.origin.value=b.dataset.airportCode;root.querySelector('[data-origin-display]').textContent=b.dataset.airportLabel;closePicker(b)});\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\">${x.type==='country'?'\ud83c\udf0d':x.type==='region'?'\u2316':'\u2022'}<\/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                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                    return (ranked||[]).filter(item=>Number(item.score)>=70);\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                    if(aborter)aborter.abort();aborter=new AbortController();\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-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 top=ranked.slice(0,12),note=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(!ranked.length){\n                                                results.innerHTML='<div class=\"bpts-empty-results\"><strong>No surf spots scored 70 or higher for these dates and filters.<\/strong><br>Try different dates, another destination, or another surf level.<\/div>';\n                                                return;\n                                            }\n                                            if(mode==='surf-yoga' || mode==='guiding'){\n\n                                                results.innerHTML=packageResults(ranked,mode);\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-summary\">${spots.length} matching spots analysed<br>${liveRange?'Live forecast + personalized surf score':'Seasonal trip score + level match'}<\/div><\/div>${note?`<div class=\"bpts-mode-note is-open\">${note}<\/div>`:''}<div class=\"bpts-cards\">${topPick(top[0],level)}${cards}<\/div>`;\n                        results.scrollIntoView({behavior:'smooth',block:'start'});\n                    }catch(ex){if(ex.name==='AbortError')return;results.innerHTML='';error(ex.message||'We could not complete the search. Please try again.')}\n                }\n                \n                root.addEventListener('click',e=>{\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\nform.addEventListener('submit',run);\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-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>Global Surf Forecast Find your perfect wave. Explore surf forecasts, swell, wind and tides for hundreds of surf spots around the world. Search Popular: Morocco Portugal Bali California 300+ surf spots worldwide 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 &#8230; <a title=\"home\" class=\"read-more\" href=\"https:\/\/surf-conditions.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":{"footnotes":""},"class_list":["post-15","page","type-page","status-publish"],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/surf-conditions.com\/fr\/wp-json\/wp\/v2\/pages\/15","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/surf-conditions.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/surf-conditions.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/surf-conditions.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/surf-conditions.com\/fr\/wp-json\/wp\/v2\/comments?post=15"}],"version-history":[{"count":140,"href":"https:\/\/surf-conditions.com\/fr\/wp-json\/wp\/v2\/pages\/15\/revisions"}],"predecessor-version":[{"id":2550,"href":"https:\/\/surf-conditions.com\/fr\/wp-json\/wp\/v2\/pages\/15\/revisions\/2550"}],"wp:attachment":[{"href":"https:\/\/surf-conditions.com\/fr\/wp-json\/wp\/v2\/media?parent=15"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}