{"id":28860,"date":"2025-04-28T18:47:08","date_gmt":"2025-04-28T18:47:08","guid":{"rendered":"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/"},"modified":"2026-09-21T22:08:47","modified_gmt":"2026-09-21T22:08:47","slug":"on-the-water","status":"publish","type":"page","link":"https:\/\/www.visitvirginiabeach.com\/fr\/experiences\/on-the-water\/","title":{"rendered":"Sur l&#8217;eau"},"content":{"rendered":"\n<section class=\"image-heading\" arialabelledby=\"Image Header\"><div class=\"fold-wrap xl video-wrap\"><div class=\"image-container\"><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2025\/04\/042623_Little-Island-Park_0218-lowres.jpg\" alt=\"Two people kayak on calm water under a bright sky, each paddling in a red and yellow kayak labeled &quot;OCEAN KAYAK.&quot; Grassy shoreline is visible in the background.\" width=\"1920\" height=\"1080\" fetchpriority=\"high\"\/><div class=\"overlay-content\"><h1 class=\"extra\">Activit\u00e9s nautiques \u00e0 Virginia Beach<\/h1><\/div><\/div><\/div><div class=\"after-overlay-content page-content-wrap fold-wrap md padded\"><p>Avec 35 miles de littoral bleu \u00e9clatant, dont l\u2019<a href=\"https:\/\/www.visitvirginiabeach.com\/fr\/experiences\/plages-et-regions\/oceanfront\/\">Oceanfront<\/a> et les rives scintillantes de la <a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/beaches-districts\/chesapeake-bay\/\">Chesapeake Bay<\/a>, Virginia Beach est un <a href=\"https:\/\/www.visitvirginiabeach.com\/trip-ideas\/fun-ways-to-get-out-on-the-water-in-virginia-beach\/\" data-type=\"post\" data-id=\"958\">r\u00eave pour les amoureux de l\u2019eau<\/a>. Les 120 miles de rivi\u00e8res vives, de baies paisibles et d\u2019affluents sinueux de la r\u00e9gion offrent mille fa\u00e7ons de trouver ton rythme. <br\/><br\/>Que tu glisses sur un lac en <a href=\"https:\/\/www.visitvirginiabeach.com\/trip-ideas\/explore-va-beach-by-sup-board\/\" data-type=\"post\" data-id=\"1086\">stand-up paddle<\/a>, fendes les vagues sur une <a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/attractions\/atlantic-park\/\" data-type=\"link\" data-id=\"https:\/\/www.visitvirginiabeach.com\/experiences\/attractions\/atlantic-park\/\">planche de surf<\/a> ou prennes le vent dans ta voile, l\u2019eau devient ici ton terrain de jeu. Les p\u00eacheurs peuvent <a href=\"https:\/\/www.visitvirginiabeach.com\/trip-ideas\/so-many-ways-to-fish-in-virginia-beach\/\" data-type=\"post\" data-id=\"1041\">lancer leur ligne<\/a> depuis une jet\u00e9e ou un bateau affr\u00e9t\u00e9, tandis que les amoureux de la nature peuvent observer des dauphins, des oiseaux ou des tortues de mer lors d\u2019une sortie faune sauvage. M\u00eame les toutous sont les bienvenus pour barboter et se d\u00e9gourdir les pattes sur des plages <a href=\"https:\/\/www.visitvirginiabeach.com\/trip-ideas\/things-to-do-with-your-pet-in-virginia-beach\/\" data-type=\"post\" data-id=\"1016\">acceptant les chiens<\/a> : facile d\u2019embarquer toute la famille.  <br\/><br\/><strong> Pars pagayer, remonte ta prise et plonge dans le plaisir sal\u00e9.<\/strong><\/p><\/div><\/section>\n\n<section class=\"mosaic-section mg-top-x2\"><div class=\"title-wrap title-wrap--plus fold flex-nowrap gapped fold-wrap xl padded mg-bottom-x2\"><div class=\"title-content\"><p class=\"alt-font-family size-32 mg-bottom-small\" id=\"related-articles-eyebrow\">D\u00e9couvre<\/p><h2 class=\"color-default\">Fais des \u00e9claboussures \u00e0 Virginia Beach <\/h2><p>Pagaye, navigue, surfe ou mets les voiles : \u00e0 Virginia Beach, c\u2019est facile de passer la journ\u00e9e sur l\u2019eau, quelle que soit ta fa\u00e7on de bouger.<\/p><\/div><\/div><div class=\"fold-wrap xl mosaic-wrap padded boxes\">\n<div class=\"box box--hover\"><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/surfing\/\" class=\"image-border image-border--bottom active-hover active-hover--lemon mg-bottom image-border--lemon\"><figure><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2025\/07\/PHT_SPTMKT17_ECSC-14-800x600.jpg\" alt=\"Un surfeur en combinaison rouge effectue une man&#x153;uvre a&#xE9;rienne sur une vague, avec un bateau visible en arri&#xE8;re-plan par une journ&#xE9;e ensoleill&#xE9;e.\" width=\"400\" height=\"300\" loading=\"lazy\"\/><\/figure><\/a><div class=\"box-info\"><p class=\"box-title size-24 head-font-family font-weight-700\">Surf<\/p><p class=\"size-14\">Attrape la vague parfaite et d\u00e9couvre notre sc\u00e8ne surf l\u00e9gendaire. \u00c0 toi les dix doigts de pied sur la planche ! <\/p><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/surfing\/\" class=\"button has-icon has-icon--after has-icon--tailarrow-right has-icon--bg-lemon-900 mg-top\" aria-label=\"Read more - Surfing\">En savoir plus<\/a><\/div><\/div>\n\n\n\n<div class=\"box box--hover\"><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/fishing\/\" class=\"image-border image-border--bottom active-hover active-hover--emerald mg-bottom image-border--emerald\"><figure><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2025\/02\/2025-ModNost-Fishing-Pier-Father-Son-800x600.jpg\" alt=\"Deux personnes sur un ponton au bord de l&#x2019;oc&#xE9;an, souriantes : l&#x2019;une brandit un poisson fra&#xEE;chement p&#xEA;ch&#xE9; avec une canne &#xE0; p&#xEA;che, tandis que l&#x2019;autre tient une &#xE9;puisette.\" width=\"400\" height=\"300\" loading=\"lazy\"\/><\/figure><\/a><div class=\"box-info\"><p class=\"box-title size-24 head-font-family font-weight-700\">P\u00eache<\/p><p class=\"size-14\">Remonte des aventures de p\u00eache inoubliables sur nos rivages pittoresques et en pleine mer. Tu vas mordre \u00e0 l\u2019hame\u00e7on. <\/p><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/fishing\/\" class=\"button has-icon has-icon--after has-icon--tailarrow-right has-icon--bg-emerald-900 mg-top\" aria-label=\"Read more - Fishing\">En savoir plus<\/a><\/div><\/div>\n\n\n\n<div class=\"box box--hover\"><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/kayaking-sup\/\" class=\"image-border image-border--bottom active-hover active-hover--cyan mg-bottom image-border--cyan\"><figure><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2025\/07\/PH_LSR23_Kayaking-First-Landing-State-Park-1_1-800x600.jpg\" alt=\"Un couple fait du kayak &#xE0; First Landing State Park sur un plan d&#x2019;eau calme entour&#xE9; de verdure, profitant d&#x2019;une journ&#xE9;e ensoleill&#xE9;e avec leurs pagaies et portant des gilets de sauvetage.\" width=\"400\" height=\"300\" loading=\"lazy\"\/><\/figure><\/a><div class=\"box-info\"><p class=\"box-title size-24 head-font-family font-weight-700\">Kayak et SUP<\/p><p class=\"size-14\">Pagaye sur nos voies navigables paisibles, en kayak, en cano\u00eb ou en stand-up paddle.<\/p><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/kayaking-sup\/\" class=\"button has-icon has-icon--after has-icon--tailarrow-right has-icon--bg-cyan-900 mg-top\" aria-label=\"Read more - Kayaking and SUP\">En savoir plus<\/a><\/div><\/div>\n\n\n\n<div class=\"box box--hover\"><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/boat-tours\/\" class=\"image-border image-border--bottom active-hover active-hover--lemon mg-bottom image-border--lemon\"><figure><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2025\/02\/VB_Tiki_Tours_be71cb83-12fe-4aa8-a425-b9c8e873a426-800x600.jpg\" alt=\"Un bateau-bar tiki au toit de chaume flotte sur une voie navigable, s&#x2019;&#xE9;loignant d&#x2019;un ponton pr&#xE8;s d&#x2019;un b&#xE2;timent au bord de l&#x2019;eau.\" width=\"400\" height=\"300\" loading=\"lazy\"\/><\/figure><\/a><div class=\"box-info\"><p class=\"box-title size-24 head-font-family font-weight-700\">Excursions en bateau<\/p><p class=\"size-14\">Oh\u00e9, moussaillon. Embarque pour une sortie en bateau : p\u00eache au large, tour tiki ou croisi\u00e8re d\u2019observation de la faune. <\/p><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/boat-tours\/\" class=\"button has-icon has-icon--after has-icon--tailarrow-right has-icon--bg-lemon-900 mg-top\" aria-label=\"Read more - Boat Tours\">En savoir plus<\/a><\/div><\/div>\n\n\n\n<div class=\"box box--hover\"><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/whale-watching\/\" class=\"image-border image-border--bottom active-hover active-hover--fuchsia mg-bottom image-border--fuchsia\"><figure><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2025\/02\/0X7A9891_6ec2659a-24de-404a-9aac-29a10d5e71b0-scaled-800x600.jpg\" alt=\"Bateau bleu et blanc sur l&#x2019;eau avec les panneaux &#xAB; Whale Trips &#xBB; et &#xAB; Virginia Aquarium &#xBB;, quelques personnes &#xE0; bord, et la skyline de la ville en arri&#xE8;re-plan.\" width=\"400\" height=\"300\" loading=\"lazy\"\/><\/figure><\/a><div class=\"box-info\"><p class=\"box-title size-24 head-font-family font-weight-700\">Observation des baleines<\/p><p class=\"size-14\">Mets les voiles pour une sortie hivernale d\u2019observation des baleines au large de Virginia Beach.<\/p><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/whale-watching\/\" class=\"button has-icon has-icon--after has-icon--tailarrow-right has-icon--bg-fuchsia-900 mg-top\" aria-label=\"Read more - Whale Watching\">En savoir plus<\/a><\/div><\/div>\n\n\n\n<div class=\"box box--hover\"><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/dolphin-tours\/\" class=\"image-border image-border--bottom active-hover active-hover--emerald mg-bottom image-border--emerald\"><figure><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2025\/02\/IMG_4792_3c5e0ebe-5d02-4021-a205-a981b233e74e-1-800x600.jpg\" alt=\"Un dauphin nage rapidement dans une eau bleu-vert, cr&#xE9;ant des &#xE9;claboussures et des ondulations dans son sillage.\" width=\"400\" height=\"300\" loading=\"lazy\"\/><\/figure><\/a><div class=\"box-info\"><p class=\"box-title size-24 head-font-family font-weight-700\">Sorties dauphins<\/p><p class=\"size-14\">Pars en croisi\u00e8re ou pagaye aux c\u00f4t\u00e9s de dauphins joueurs. Les observations sont presque garanties.  <\/p><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/on-the-water\/dolphin-tours\/\" class=\"button has-icon has-icon--after has-icon--tailarrow-right has-icon--bg-emerald-900 mg-top\" aria-label=\"Read more - Dolphin Tours\">En savoir plus<\/a><\/div><\/div>\n<\/div><\/section>\n\n<section class=\"common-slider pd-bottom-x2 pd-top-x2\"><div class=\"splide slide_boxes hide_pagination fold-wrap xl\"><div class=\"fold-wrap padded common-boxes\"><div class=\"title-wrap fold flex-nowrap gapped fold-wrap xl mg-bottom-x2\"><div class=\"title-content\"><p class=\"alt-font-family size-32 color-neo-700 mg-bottom-small eyebrow\">Explore<\/p><h2 class=\"color-default\" id=\"related-articles-heading\">Les meilleures attractions nautiques<\/h2><p>Ces attractions nautiques \u00e0 Virginia Beach te permettent de plonger, de te rafra\u00eechir et de profiter de toutes les joies du littoral.<\/p><\/div><\/div><div class=\"splide__track\"><div class=\"splide__list\">\n<div class=\"splide__slide box\"><a href=\"\/listing\/rudee-tours\/1062\/ \" target=\"_self\" class=\"thumb-link active-hover active-hover--fuchsia\" aria-hidden=\"true\" tabindex=\"-1\"><figure><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2025\/04\/230629_Rudys-Inlet-Fishing_4802-lowres-388x258.jpg\" alt=\"\" width=\"388\" height=\"258\" loading=\"lazy\"\/><figcaption class=\"visually-hidden\">Rudee Tours<\/figcaption><\/figure><\/a><h3 class=\"h5 mg-top\"><a href=\"\/listing\/rudee-tours\/1062\/&#10;%20\" target=\"_self\" class=\"read-more\" aria-label=\"Read more about Rudee Tours, opens in a new tab\">Rudee Tours<\/a><\/h3><p class=\"size-14\">Mets les voiles pour des excursions inoubliables, comme des sorties en bateau d\u2019observation de la faune et des sorties de p\u00eache.<\/p><\/div>\n\n\n\n<div class=\"splide__slide box\"><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/attractions\/atlantic-park\/\" target=\"_self\" class=\"thumb-link active-hover active-hover--fuchsia\" aria-hidden=\"true\" tabindex=\"-1\"><figure><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2026\/07\/DJI_0172-388x258.jpg\" alt=\"\" width=\"388\" height=\"258\" loading=\"lazy\"\/><figcaption class=\"visually-hidden\">Atlantic Park Surf <\/figcaption><\/figure><\/a><h3 class=\"h5 mg-top\"><a href=\"https:\/\/www.visitvirginiabeach.com\/experiences\/attractions\/atlantic-park\/\" target=\"_self\" class=\"read-more\" aria-label=\"Read more about Atlantic Park Surf , opens in a new tab\">Atlantic Park Surf <\/a><\/h3><p class=\"size-14\">Fais des vagues \u00e0 Atlantic Park avec du surf toute l\u2019ann\u00e9e, de bonnes adresses o\u00f9 manger et du fun Oceanfront non-stop.<\/p><\/div>\n\n\n\n<div class=\"splide__slide box\"><a href=\"\/listing\/kayak-dolphin-tours-with-chesapean-outdoors\/605\/ \" target=\"_self\" class=\"thumb-link active-hover active-hover--fuchsia\" aria-hidden=\"true\" tabindex=\"-1\"><figure><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2025\/04\/042023_The-Narrows_1055-Enhanced-NR-lowres-388x258.jpg\" alt=\"\" width=\"388\" height=\"258\" loading=\"lazy\"\/><figcaption class=\"visually-hidden\">Chesapean Outdoors<\/figcaption><\/figure><\/a><h3 class=\"h5 mg-top\"><a href=\"\/listing\/kayak-dolphin-tours-with-chesapean-outdoors\/605\/&#10;%20\" target=\"_self\" class=\"read-more\" aria-label=\"Read more about Chesapean Outdoors, opens in a new tab\">Chesapean Outdoors<\/a><\/h3><p class=\"size-14\">Approche-toi de la nature lors d\u2019une aventure guid\u00e9e en kayak ou en stand-up paddle.<\/p><\/div>\n\n\n\n<div class=\"splide__slide box\"><a href=\"\/listing\/virginia-beach-watersports\/2727\/ \" target=\"_self\" class=\"thumb-link active-hover active-hover--fuchsia\" aria-hidden=\"true\" tabindex=\"-1\"><figure><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2025\/05\/WS1_1792-lowres-388x258.jpg\" alt=\"\" width=\"388\" height=\"258\" loading=\"lazy\"\/><figcaption class=\"visually-hidden\">Virginia Beach Watersports<\/figcaption><\/figure><\/a><h3 class=\"h5 mg-top\"><a href=\"\/listing\/virginia-beach-watersports\/2727\/&#10;%20\" target=\"_self\" class=\"read-more\" aria-label=\"Read more about Virginia Beach Watersports, opens in a new tab\">Virginia Beach Watersports<\/a><\/h3><p class=\"size-14\">Explore les eaux de Virginia Beach en jet-ski, en bateau ponton, en kayak ou lors d\u2019une croisi\u00e8re au coucher du soleil.<\/p><\/div>\n\n\n\n<div class=\"splide__slide box\"><a href=\"\/listing\/pirate-parasail\/1100\/ \" target=\"_self\" class=\"thumb-link active-hover active-hover--fuchsia\" aria-hidden=\"true\" tabindex=\"-1\"><figure><img decoding=\"async\" src=\"https:\/\/www.visitvirginiabeach.com\/wp-content\/uploads\/2025\/02\/parasailing_11ded01c-b00e-4cd5-880e-069b4edd76b4-2-388x258.jpg\" alt=\"\" width=\"388\" height=\"258\" loading=\"lazy\"\/><figcaption class=\"visually-hidden\">Pirate Parasail<\/figcaption><\/figure><\/a><h3 class=\"h5 mg-top\"><a href=\"\/listing\/pirate-parasail\/1100\/&#10;%20\" target=\"_self\" class=\"read-more\" aria-label=\"Read more about Pirate Parasail, opens in a new tab\">Pirate Parasail<\/a><\/h3><p class=\"size-14\">Vis l\u2019adr\u00e9naline en t\u2019\u00e9levant haut au-dessus de l\u2019oc\u00e9an Atlantique et en profitant de la vue. <\/p><\/div>\n<\/div><\/div><div class=\"splide__arrows fold align-items-center gapped flex-shrink-0 flex-grow-0 to-the-right align-self-end\"><button class=\"splide__arrow splide__arrow--prev\">Pr\u00e9c.<\/button><div class=\"fraction-indicator\"><\/div><button class=\"splide__arrow splide__arrow--next\">Suivant<\/button><\/div><\/div><\/div><\/section>\n<style data-miles-ai=\"loading-css\">.miles-ai-mfe:not(.loaded) { position: relative; min-height: 100px; display: flex; align-items: center; justify-content: center; }.miles-ai-mfe:not(.loaded)::after { content: \"\"; position: relative; width: 20px; height: 20px; border: 2px solid #ccc; border-top: 2px solid #333; border-radius: 50%; animation: ai-spin 1s linear infinite; z-index: 1; }@keyframes ai-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }.miles-ai-mfe.loaded::before, .miles-ai-mfe.loaded::after { display: none; }<\/style><style data-miles-ai=\"global-css\">.miles-ai-mfe {\r\n  .miles-ai-search {\r\n    .miles-ai-search-filter-option[data-term=\"VBCC Newsletter\"] { display: none; }\r\n  }\r\n}<\/style><script data-miles-ai=\"global-js\">window.addEventListener('aisearch_unifyFilterKeys', function (event) {\r\n  const filterKeyMappings = {\r\n  '_to_delete': [       \r\n      'Hours of Operation',\r\n      'Happy Hour Times',   \r\n      'Admission Fee Cost',\r\n      'Live Music',\r\n      'Operating Hours'                                                                                                                                                                                                   \r\n    ], \r\n  'Tags': ['post_tag'],\r\n  'Categories': ['category']\r\n};\r\n\r\n  event.detail.mappings = filterKeyMappings;\r\n});<\/script><style data-miles-ai=\"template-css\" data-template=\"listings-with-map\">.miles-ai-template--listings {\r\n  .miles-ai-search {\r\n    --drawer-direction: right;\r\n    --drawer-size: 100%;\r\n    --font-family: var(--font-family-base);\r\n    --background-page: var(--color-white);\r\n    --primary-color: var(--color-fuchsia-900);\r\n    --primary-hover: var(--color-fuchsia-200);\r\n    --text-primary: var(--color-cyan-900);\r\n    --text-secondary: var(--color-black);\r\n    --border-radius: 0;\r\n\r\n    --input-border: var(--color-cyan-900);\r\n    --input-focus: var(--color-cyan-900);\r\n\r\n    \/* helpful base tuning *\/\r\n    --card-padding: 20px;\r\n    --grid-gap: 24px;\r\n    --desktop-grid-gap: 24px;\r\n    --list-item-gap: 20px;\r\n    --list-item-padding: 20px;\r\n    --results-grid-card-size: 260px;\r\n    --results-grid-card-size-desktop: 320px;\r\n\r\n    \/* button system *\/\r\n    --button-bg: var(--color-fuchsia);\r\n    --button-border: var(--color-fuchsia);\r\n    --button-color: var(--color-white);\r\n\r\n    --button-bg-hover: var(--color-fuchsia-200);\r\n    --button-border-hover: var(--color-fuchsia-200);\r\n    --button-color-hover: var(--color-black);\r\n\r\n    --button-bg-active: var(--color-fuchsia);\r\n    --button-border-active: var(--color-fuchsia);\r\n    --button-color-active: var(--color-white);\r\n\r\n    --button-bg-active-hover: var(--color-fuchsia-200);\r\n    --button-border-active-hover: var(--color-fuchsia-200);\r\n    --button-color-active-hover: var(--color-black);\r\n\r\n    max-width: 1680px;\r\n    padding-left: calc(var(--grid-gap)*2);\r\n    padding-right: calc(var(--grid-gap)*2);\r\n    font-size: 16px;\r\n    line-height: 1.5;\r\n  }\r\n\r\n  .miles-ai-search-show-more-button {\r\n    border: none;\r\n    border-bottom: 2px solid rgba(0, 0, 0, 0);\r\n    border-radius: 0;\r\n    justify-content: flex-start;\r\n    background: none;\r\n    padding: 0 0 .3rem 0;\r\n    font-family: var(--head-font-family);\r\n    font-size: 14px;\r\n    font-weight: 400;\r\n    color: var(--primary-color);\r\n    display: inline-flex;\r\n    width: fit-content;\r\n    align-self: flex-start;\r\n    align-items: center;\r\n    gap: 6px;\r\n    cursor: pointer;\r\n\r\n    span {\r\n      display: inline-flex;\r\n      align-items: center;\r\n      color: var(--primary-color);\r\n    }\r\n\r\n    .miles-ai-search-show-more-chevron {\r\n      color: var(--primary-color);\r\n      transition: transform 0.2s ease;\r\n    }\r\n\r\n    &:hover,\r\n    &:focus {\r\n      border-color: var(--primary-hover);\r\n    }\r\n\r\n    &[aria-expanded=\"true\"] .miles-ai-search-show-more-chevron {\r\n      transform: rotate(180deg);\r\n    }\r\n  }\r\n\r\n  .miles-ai-search-component-title {\r\n    h2,\r\n    a {\r\n      color: var(--color-cyan-900);\r\n    }\r\n  }\r\n\r\n  .miles-ai-search-result-card-title {\r\n    font-size: 20px;\r\n    line-height: 1.2;\r\n    font-weight: 700;\r\n  }\r\n\r\n  .miles-ai-search-result-card,\r\n  .miles-ai-search-filter-group {\r\n    font-size: 14px;\r\n    line-height: 1.4;\r\n  }\r\n\r\n  .miles-ai-search__filters-sidebar {\r\n    border: none;\r\n    padding: 16px 26px 16px 16px;\r\n  }\r\n\r\n  .miles-ai-search-drawer-overlay {\r\n    z-index: 1001; \/* to be over leaflet map pane which has 1000 z-index *\/\r\n  }\r\n\r\n  .miles-ai-search__filter-footer--drawer {\r\n    margin-bottom: 3rem; \/* to put footer higher than cookie button on mobile *\/\r\n  }\r\n\r\n  .miles-ai-search__filter-section {\r\n    .miles-ai-search-date-range-filter__inputs {\r\n      display: none;\r\n    }\r\n    .miles-ai-search__filter-section-title {\r\n      font-size: 20px;\r\n    }\r\n    .miles-ai-search-filter-title {\r\n      font-size: 16px;\r\n    }\r\n    .miles-ai-search-filter-label {\r\n      font-size: 14px;\r\n    }\r\n  }\r\n\r\n  .miles-ai-search-result-card {\r\n    border: none;\r\n  }\r\n\r\n  .miles-ai-search__content-type--event {\r\n    .miles-ai-search-result-card-time,\r\n    .miles-ai-search-result-card-teaser {\r\n      display: none;\r\n    }\r\n  }\r\n  \/* result card images *\/\r\n  .miles-ai-search-result-card-image,\r\n  .miles-ai-search-result-card-image img {\r\n    aspect-ratio: 4 \/ 3;\r\n    object-fit: cover;\r\n  }\r\n\r\n  \/* image hover corner arrow (match site pattern) *\/\r\n  .miles-ai-search-result-card {\r\n    .card-detail-row {\r\n      color: var(--text-secondary);\r\n    }\r\n    .miles-ai-search-result-card-image {\r\n      position: relative;\r\n      overflow: hidden;\r\n\r\n      &::selection {\r\n        background: transparent;\r\n      }\r\n\r\n      img {\r\n        display: block;\r\n        border-bottom: 4px solid var(--color-cyan);\r\n      }\r\n\r\n      .miles-ai-search-result-card-image--clickable {\r\n        position: relative;\r\n        display: block;\r\n\r\n        &::before,\r\n        &::after {\r\n          content: \"\";\r\n          position: absolute;\r\n          bottom: 0;\r\n          width: 16px;\r\n          height: 4px;\r\n          background: var(--background-page);\r\n          z-index: 2;\r\n        }\r\n\r\n        &::before {\r\n          left: 0;\r\n        }\r\n\r\n        &::after {\r\n          right: 0;\r\n        }\r\n      }\r\n\r\n      &::after {\r\n        content: \"\";\r\n        position: absolute;\r\n        bottom: -20%;\r\n        right: -20%;\r\n        width: 60px;\r\n        height: 60px;\r\n        background-color: var(--color-cyan);\r\n        clip-path: polygon(100% 0, 0% 100%, 100% 100%);\r\n        transition: bottom 0.3s ease, right 0.3s ease;\r\n        z-index: 2;\r\n      }\r\n\r\n      &::before {\r\n        content: \"\";\r\n        position: absolute;\r\n        bottom: -20%;\r\n        right: -20%;\r\n        width: 60px;\r\n        height: 60px;\r\n        background: url(\"data:image\/svg+xml,%0A%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cpath d='M18.2063 12.2063L18.9156 11.5001L18.2094 10.7938L13.7094 6.29385L13 5.58447L11.5875 7.0001L12.2937 7.70635L15.0875 10.5001H6H5V12.5001H6H15.0844L12.2906 15.2938L11.5875 16.0001L13 17.4157L13.7063 16.7095L18.2063 12.2095V12.2063Z' fill='black'\/%3E%3C\/svg%3E%0A\") no-repeat 90% 90%\/50%;\r\n        z-index: 3;\r\n        transition: bottom 0.3s ease, right 0.3s ease;\r\n      }\r\n\r\n      &:hover::after,\r\n      &:hover::before {\r\n        bottom: 0;\r\n        right: 0;\r\n      }\r\n    }\r\n    .miles-ai-search-result-card-date-wrapper {\r\n      .card-detail-row {\r\n        font-size: 14px;\r\n      }\r\n    }\r\n  }\r\n\r\n  .miles-ai-search-pagination-page-button {\r\n    border: none;\r\n    border-radius: 0;\r\n    background-color: var(--background-page);\r\n    font-family: var(--head-font-family);\r\n    font-size: 16px;\r\n    font-weight: 400;\r\n    color: var(--text-secondary);\r\n    &:hover, &:focus {\r\n      background-color: var(--button-bg-hover);\r\n    }\r\n    &.active:disabled {\r\n      background-color: var(--button-bg-active);\r\n      color: var(--button-color-active);\r\n      opacity: 1;\r\n    }\r\n  }\r\n  .miles-ai-search-pagination-button {\r\n    border-radius: 0;\r\n    border: none;\r\n    background-color: var(--background-page);\r\n    color: var(--text-secondary);\r\n    span {\r\n      color: var(--text-secondary);\r\n    }\r\n    &:disabled {\r\n      display: none;\r\n    }\r\n  }\r\n\r\n  .miles-ai-search-input-wrapper {\r\n    .miles-ai-search-icon {\r\n      display: none !important;\r\n    }\r\n    .miles-ai-search-input {\r\n      border-radius: 32px;\r\n      padding-left: var(--search-input-padding);\r\n      font-size: 13.333px;\r\n      font-weight: normal;\r\n      &:focus-visible {\r\n        border: 2px solid var(--input-focus);\r\n      }\r\n    }\r\n    .miles-ai-search-button--inline {\r\n      background: var(--color-cyan-100);\r\n      border-radius: 32px;\r\n      border-color: var(--color-cyan-100);\r\n      right: .7rem;\r\n      &:hover, &:focus {\r\n        background: var(--color-cyan-900);\r\n        border-color: var(--color-cyan-900);\r\n        .miles-ai-search-button-icon {\r\n          color: var(--color-white);\r\n        }\r\n      }\r\n      .miles-ai-search-button-icon {\r\n        width: 18px !important;\r\n        height: 18px !important;\r\n        scale: .65;\r\n        color: var(--color-default);\r\n\r\n        &:hover, &:focus {\r\n          background: var(--color-cyan-900);\r\n          border-color: var(--color-cyan-900);\r\n          color: var(--color-white);\r\n        }\r\n\r\n        svg {\r\n          overflow: visible;\r\n        }\r\n\r\n        path {\r\n          stroke: currentColor;\r\n          stroke-width: .6;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  \/* display switcher (segmented pill - match live site) *\/\r\n  .miles-ai-search-display-switcher {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    flex-wrap: nowrap;\r\n    justify-content: center;\r\n    gap: 2px;\r\n    padding: 5px;\r\n    border-radius: 20px;\r\n    background-color: var(--color-fuchsia-100);\r\n  }\r\n\r\n  .miles-ai-search-display-switcher__btn {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 6px;\r\n    padding: .4rem 1.5rem .4rem 1.2rem;\r\n\r\n    font-family: var(--head-font-family);\r\n    font-size: 14px;\r\n    font-weight: 500;\r\n\r\n    border: none;\r\n    border-radius: 9999px;\r\n    background-color: transparent;\r\n\r\n    color: var(--text-secondary);\r\n    cursor: pointer;\r\n\r\n    transition: background-color 0.2s ease, color 0.2s ease;\r\n    &:hover, :focus {\r\n      background-color: var(--color-fuchsia-200);\r\n      .miles-ai-search-display-switcher__label, .miles-icon {\r\n        color: var(--text-secondary);\r\n      }\r\n    }\r\n\r\n  }\r\n\r\n  .miles-ai-search-display-switcher__btn--active {\r\n    &:hover, :focus {\r\n      .miles-icon {\r\n        color: var(--text-secondary);\r\n      }\r\n      .miles-ai-search-display-switcher__label {\r\n        color: var(--color-white);\r\n      }\r\n    }\r\n  }\r\n\r\n  .miles-ai-search-display-switcher__btn[aria-pressed=\"true\"] {\r\n    background-color: var(--button-bg);\r\n    color: var(--button-color);\r\n  }\r\n\r\n  .miles-ai-search-display-switcher__btn:not([aria-pressed=\"true\"]):hover {\r\n    color: var(--primary-color);\r\n  }\r\n\r\n  @media screen and (max-width: 450px) {\r\n    .miles-ai-search-results-header:has(.miles-ai-search-results-header__text):has(.miles-ai-search-sort-container):has(.miles-ai-search-display-switcher):not(:has(.miles-ai-search-filter-pills)) {\r\n        grid-template-columns: auto;\r\n        grid-template-rows: 1fr 1fr;\r\n        grid-template-areas: \"sorting switcher\"\r\n                             \"text text\";\r\n    }\r\n}\r\n\r\n  \/* datepicker (air-datepicker) theming *\/\r\n  \/* (existing air-datepicker theming block would be here) *\/\r\n\r\n  \/* react-datepicker theming (actual component in use) *\/\r\n  .react-datepicker {\r\n    border: none;\r\n    border-radius: var(--border-radius);\r\n    background: var(--background-page);\r\n    font-family: var(--head-font-family);\r\n  }\r\n\r\n  .react-datepicker__header {\r\n    background: transparent;\r\n    border-bottom: 1px solid var(--color-cyan-900);\r\n  }\r\n\r\n  .react-datepicker__current-month {\r\n    font-size: 16px;\r\n    font-weight: 600;\r\n    color: var(--text-primary);\r\n  }\r\n\r\n  .react-datepicker__day-name {\r\n    color: var(--text-secondary);\r\n    font-size: 12px;\r\n  }\r\n\r\n  .react-datepicker__day {\r\n    color: var(--text-primary);\r\n    border-radius: 0;\r\n  }\r\n\r\n  .react-datepicker__day:hover {\r\n    background: var(--color-fuchsia-100);\r\n  }\r\n\r\n  .react-datepicker__day--selected,\r\n  .react-datepicker__day--keyboard-selected {\r\n    background: var(--button-bg);\r\n    color: var(--button-color);\r\n  }\r\n\r\n  .react-datepicker__day,\r\n  .react-datepicker__day--selected,\r\n  .react-datepicker__day--keyboard-selected {\r\n    border-radius: 50px;\r\n    padding: 3px 15px;\r\n  }\r\n\r\n  .react-datepicker__day--in-range {\r\n    background: var(--color-fuchsia-100);\r\n  }\r\n\r\n  .react-datepicker__day--disabled {\r\n    color: #ccc;\r\n  }\r\n\r\n  .react-datepicker__navigation-icon::before {\r\n    border-color: var(--text-secondary);\r\n  }\r\n\r\n  \/* make date inputs full width *\/\r\n  .miles-ai-search-date-range-filter__inputs {\r\n    display: block;\r\n    .miles-ai-search-date-range-filter__start-date,\r\n    .miles-ai-search-date-range-filter__end-date {\r\n      margin-bottom: 12px;\r\n    }\r\n    .react-datepicker__input-container {\r\n      border-radius: var(--gap-2);\r\n      border: 0 none;\r\n      padding: var(--gap) var(--gap) var(--gap) 2.5rem;\r\n      width: 100%;\r\n      background: var(--color-cyan-100) url(\"data:image\/svg+xml,%0A%3Csvg width='12' height='12' viewBox='0 0 12 12' fill='none' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cpath d='M4.3125 0.5625V0H3.1875V0.5625V1.5H0.75V3.375V4.5V10.875V12H1.875H10.125H11.25V10.875V4.5V3.375V1.5H8.8125V0.5625V0H7.6875V0.5625V1.5H4.3125V0.5625ZM1.875 4.5H3.75V5.8125H1.875V4.5ZM1.875 6.9375H3.75V8.4375H1.875V6.9375ZM4.875 6.9375H7.125V8.4375H4.875V6.9375ZM8.25 6.9375H10.125V8.4375H8.25V6.9375ZM10.125 5.8125H8.25V4.5H10.125V5.8125ZM10.125 9.5625V10.875H8.25V9.5625H10.125ZM7.125 9.5625V10.875H4.875V9.5625H7.125ZM3.75 9.5625V10.875H1.875V9.5625H3.75ZM7.125 5.8125H4.875V4.5H7.125V5.8125Z' fill='%230A7FAA'\/%3E%3C\/svg%3E%0A\") no-repeat 16px 16px\/14px;\r\n      font-size: 12px;\r\n      color: var(--color-neo-700);\r\n\r\n      textarea {\r\n        border: none;\r\n        padding: 0;\r\n        background-color: var(--color-cyan-100);\r\n        font-family: var(--head-font-family);\r\n      }\r\n    }\r\n  }\r\n\r\n  .leaflet-popup-content-wrapper {\r\n    border-radius: 0;\r\n  }\r\n\r\n  .leaflet-popup-content {\r\n    min-width: 180px;\r\n    margin: 0;\r\n    \r\n    @media screen and (min-width: 400px) {\r\n      min-width: 250px;\r\n    }\r\n  }\r\n\r\n  .leaflet-popup-content {\r\n    .miles-ai-search-result-card {\r\n      width: 100%;\r\n      min-width: 100%;\r\n      border: none;\r\n    }\r\n  }\r\n}\n\n\/* Child template styles *\/\n.miles-ai-mfe[data-template=\"listings-with-map\"] {\r\n  .miles-ai-search {\r\n    @media screen and (min-width: 768px) {\r\n      .miles-ai-search-display-switcher__label {\r\n        position: relative;\r\n        height: auto;\r\n        width: auto;\r\n        margin: unset;\r\n      }\r\n    }\r\n  }\r\n}<\/style><script data-miles-ai=\"template-js\" data-template=\"listings-with-map\">window.addEventListener('aisearch_onMount', function (event) {\r\n  var selector = event.detail && event.detail.selector;\r\n  if (!selector) return;\r\n\r\n  var config = window.milesAI.utils.getConfig(selector);\r\n  if (!config) return;\r\n\r\n  if (window.milesAI.utils.hasType(config, 'event')) {\r\n    window.dispatchEvent(\r\n      new CustomEvent('aisearch_updateConfig', {\r\n        detail: {\r\n          selector: selector,\r\n          searchBehavior: { placeholder: 'Search for events by interest, topic, or idea...' },\r\n          filters: { showDatePicker: true },\r\n          results: { resultLayout: 'list' },\r\n          sorting: { initialSort: 'next_occurrence:asc', sortOptions: [] },\r\n        },\r\n      }),\r\n    );\r\n  }\r\n});\r\n\r\nwindow.addEventListener('aisearch_onTransformResults', function(event) {\r\n  event.detail.results.forEach(function(result) {\r\n    var extras = result.json.extras;\r\n    extras.rankSort = (extras.rank || '').toLowerCase() === 'yes' ? 1 : 0;\r\n  });\r\n});\n\n\/\/ Child template scripts\nwindow.addEventListener(\"aisearch_onMount\", function (event) {\r\n  if (window.location.pathname !== \"\/events\/events-this-weekend\/\") return;\r\n  if (event.detail.selector !== \"#miles-ai-100113\") return;\r\n\r\n  window.dispatchEvent(\r\n    new CustomEvent(\"aisearch_updateConfig\", {\r\n      detail: {\r\n        selector: \"#miles-ai-100113\",\r\n        filters: { dateQuickFilters: [\"thisWeekend\"] },\r\n      },\r\n    })\r\n  );\r\n\r\n  window.dispatchEvent(\r\n    new CustomEvent(\"aisearch_setDateQuickFilter\", {\r\n      detail: { quickFilter: \"thisWeekend\", selector: \"#miles-ai-100113\" },\r\n    })\r\n  );\r\n});\r\n\r\n\/**\r\n * Custom map layout\r\n *\r\n * Renders a Leaflet map with markers for each result that has lat\/lon data.\r\n * Listens for aisearch_onDisplayResults and renders into #aisearch-custom-display-map.\r\n * Uses renderCard() from the event detail to mount real ResultCard components\r\n * inside map popups (with full analytics + click tracking). Cards mount when a\r\n * popup opens, not per marker, and markers are only rebuilt when the plotted\r\n * results change - eager per-marker cards made every date click slow (INP).\r\n *\r\n * DEPENDENCIES:\r\n * - Leaflet (loaded from CDN automatically)\r\n *   https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\r\n *\/\r\n\r\n\/\/ No ampersand characters anywhere in this file, on purpose: WordPress can save a pasted Custom\r\n\/\/ JS field through wptexturize\/kses, which HTML-encodes every ampersand and turns a logical AND\r\n\/\/ into a syntax error. Use `(a || {}).b`, ternaries or nested ifs, and `u00a9` instead.\r\n(function () {\r\n  'use strict';\r\n\r\n  \/\/ ========================================================================\r\n  \/\/ CONFIG\r\n  \/\/ ========================================================================\r\n\r\n  var LEAFLET_CSS = 'https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css';\r\n  var LEAFLET_JS = 'https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js';\r\n\r\n  \/\/ Default map center and zoom (Virginia Beach)\r\n  var DEFAULT_CENTER = [36.85, -75.98];\r\n  var DEFAULT_ZOOM = 11;\r\n\r\n  \/\/ Map container height\r\n  var MAP_HEIGHT = '600px';\r\n\r\n  \/\/ Only render when this layout is active (from aisearch_onDisplayResults)\r\n  var ACTIVE_LAYOUT = 'map';\r\n\r\n  \/\/ Only render for a specific selector (or null for all instances)\r\n  var SELECTOR_FILTER = null;\r\n\r\n  function isOtherInstance(selector) {\r\n    return SELECTOR_FILTER ? selector !== SELECTOR_FILTER : false;\r\n  }\r\n\r\n  \/\/ Max distance (in degrees) from DEFAULT_CENTER to include a marker.\r\n  \/\/ Filters out results with bad or unrelated lat\/lon data.\r\n  \/\/ ~1 degree \u2248 69 miles. Set to null to disable filtering.\r\n  var MAX_DISTANCE = 1;\r\n\r\n  \/\/ Add a \"Map\" toggle to the results layout switcher on mount, so this file works on its own.\r\n  \/\/ aisearch_updateConfig replaces displayOptions wholesale - set this to false on a site whose\r\n  \/\/ CMS config already lists a 'map' display option, or this list will override it.\r\n  var REGISTER_DISPLAY_OPTIONS = false;\r\n  var DISPLAY_OPTIONS = [\r\n    { key: 'grid', label: 'Grid', icon: 'grid' },\r\n    \/\/ The map plots every filtered result, so paging and sorting don't apply to it.\r\n    {\r\n      key: ACTIVE_LAYOUT,\r\n      label: 'Map',\r\n      icon: 'location-dot',\r\n      showPager: false,\r\n      showSorting: false,\r\n    },\r\n  ];\r\n\r\n  \/\/ ========================================================================\r\n  \/\/ STATE\r\n  \/\/ ========================================================================\r\n\r\n  var map = null;\r\n  var markersLayer = null;\r\n  var leafletReady = false;\r\n  var leafletLoading = false;\r\n  var pendingDetail = null;\r\n\r\n  \/\/ ========================================================================\r\n  \/\/ STYLES\r\n  \/\/ ========================================================================\r\n\r\n  function injectStyles() {\r\n    if (document.getElementById('map-demo-styles')) return;\r\n    var style = document.createElement('style');\r\n    style.id = 'map-demo-styles';\r\n    style.textContent =\r\n      '\/* Leaflet popup overrides for ResultCard *\/n' +\r\n      '.leaflet-popup-content-wrapper { padding: 0; border-radius: 12px; overflow: hidden; }n' +\r\n      '.leaflet-popup-content { margin: 0; width: 300px !important; line-height: inherit; }n' +\r\n      '.leaflet-popup-content p { margin: 0; }n' +\r\n      '\/* ResultCard adjustments inside map popup *\/n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-wrap { margin: 0; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card { border: none; border-radius: 0; box-shadow: none; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-content { display: flex; flex-direction: column; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-image { width: 100%; max-height: 160px; overflow: hidden; aspect-ratio: auto; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-image img { width: 100%; height: 160px; object-fit: cover; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-content-wrapper { padding: 12px 14px; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-title { font-size: 0.95rem; line-height: 1.3; margin: 0; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-title a { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-tags { margin-top: 6px; gap: 4px; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-tag { font-size: 0.7rem; padding: 2px 8px; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-teaser { font-size: 0.8rem; -webkit-line-clamp: 2 !important; margin-top: 6px; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-date-wrapper { margin-top: 6px; font-size: 0.8rem; }n' +\r\n      '.miles-ai-search-map-popup-card .card-detail-row { font-size: 0.8rem; margin-top: 2px; }n' +\r\n      '.miles-ai-search-map-popup-card .card-detail-row svg { width: 12px; height: 12px; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-badges { margin-bottom: 4px; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-featured { font-size: 0.7rem; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-buttons { margin-top: 8px; gap: 6px; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-button { font-size: 0.8rem; padding: 6px 12px; }n' +\r\n      '.miles-ai-search-map-popup-card .miles-ai-search-result-card-metadata { padding: 4px 14px 8px; font-size: 0.75rem; }';\r\n    document.head.appendChild(style);\r\n  }\r\n\r\n  \/\/ ========================================================================\r\n  \/\/ LEAFLET LOADING\r\n  \/\/ ========================================================================\r\n\r\n  function loadLeaflet(callback) {\r\n    var link = document.createElement('link');\r\n    link.rel = 'stylesheet';\r\n    link.href = LEAFLET_CSS;\r\n    document.head.appendChild(link);\r\n\r\n    var script = document.createElement('script');\r\n    script.src = LEAFLET_JS;\r\n    script.onload = function () {\r\n      leafletReady = true;\r\n      callback();\r\n    };\r\n    script.onerror = function () {\r\n      console.error('[custom-map] Failed to load Leaflet from:', LEAFLET_JS);\r\n    };\r\n    document.head.appendChild(script);\r\n  }\r\n\r\n  \/\/ ========================================================================\r\n  \/\/ MAP INITIALIZATION\r\n  \/\/ ========================================================================\r\n\r\n  function initMap(container) {\r\n    injectStyles();\r\n    var L = window.L;\r\n    map = L.map(container).setView(DEFAULT_CENTER, DEFAULT_ZOOM);\r\n    L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\r\n      attribution: 'u00a9 OpenStreetMap contributors',\r\n      maxZoom: 18,\r\n    }).addTo(map);\r\n    markersLayer = L.layerGroup().addTo(map);\r\n\r\n    container.style.height = MAP_HEIGHT;\r\n    container.style.width = '100%';\r\n    container.style.borderRadius = '12px';\r\n    container.style.marginTop = '1rem';\r\n    map.invalidateSize();\r\n  }\r\n\r\n  \/\/ ========================================================================\r\n  \/\/ RESULT IDS\r\n  \/\/ ========================================================================\r\n\r\n  var warnedNoUtils = false;\r\n\r\n  \/\/ The id renderCard() looks a result up by. window.milesAI.utils.getResultId is the\r\n  \/\/ component's own answer, but the utils are only there once the host page has loaded the\r\n  \/\/ remote's '.\/publicApi' expose - an older CMS loader, or a page that renders the component\r\n  \/\/ some other way, may not have them. renderCard() strips the `_N` chunk suffix from a raw\r\n  \/\/ content_identifier itself, so that is a working fallback rather than a guess.\r\n  function resultIdFor(result) {\r\n    var utils = (window.milesAI || {}).utils || {};\r\n    if (typeof utils.getResultId === 'function') return utils.getResultId(result);\r\n\r\n    if (!warnedNoUtils) {\r\n      warnedNoUtils = true;\r\n      console.warn(\r\n        '[custom-map] window.milesAI.utils is not available - falling back to each ' +\r\n          \"result's content_identifier. Load the remote's '.\/publicApi' to get getResultId().\",\r\n      );\r\n    }\r\n    if (result.content_identifier) return result.content_identifier;\r\n    var json = result.json || {};\r\n    if (!json.type || json.id == null) return null;\r\n    return json.type + ':' + json.id;\r\n  }\r\n\r\n  \/\/ ========================================================================\r\n  \/\/ MARKER RENDERING\r\n  \/\/ ========================================================================\r\n\r\n  \/\/ Popup cards are mounted lazily, on popupopen, and unmounted on popupclose. Each renderCard()\r\n  \/\/ is a live React ResultCard that re-renders on date and filter changes, so mounting one per\r\n  \/\/ marker up front costs every result's card on every display event, for popups nobody opened.\r\n  var lastSignature = null;\r\n  var latestRenderCard = null;\r\n  var openCard = null; \/\/ { container, cleanup } for the one mounted popup card\r\n\r\n  function unmountOpenCard() {\r\n    if (openCard) {\r\n      openCard.cleanup();\r\n      openCard = null;\r\n    }\r\n  }\r\n\r\n  function addMarker(point) {\r\n    var L = window.L;\r\n    var marker = L.marker([point.lat, point.lon]).addTo(markersLayer);\r\n\r\n    var cardContainer = document.createElement('div');\r\n    cardContainer.className = 'miles-ai-search-map-popup-card';\r\n    marker.bindPopup(cardContainer, { maxWidth: 320, minWidth: 280 });\r\n\r\n    marker.on('popupopen', function (e) {\r\n      unmountOpenCard();\r\n      \/\/ latestRenderCard, not the one from when the marker was made: the newest closure\r\n      \/\/ carries the component's current click\/analytics context.\r\n      openCard = { container: cardContainer, cleanup: latestRenderCard(point.id, cardContainer) };\r\n      \/\/ The card renders after Leaflet measured the empty popup; re-measure once it's in.\r\n      requestAnimationFrame(function () {\r\n        if (e.popup.isOpen()) e.popup.update();\r\n      });\r\n    });\r\n    marker.on('popupclose', function () {\r\n      if ((openCard || {}).container === cardContainer) unmountOpenCard();\r\n    });\r\n  }\r\n\r\n  function renderMarkers(results, renderCard) {\r\n    if (!map || !markersLayer) return;\r\n    latestRenderCard = renderCard;\r\n\r\n    var points = [];\r\n    for (var r = 0; r < results.length; r++) {\r\n      var result = results[r];\r\n      var extras = (result.json || {}).extras || {};\r\n      var lat = extras.lat;\r\n      var lon = extras.lon;\r\n      if (!lat || !lon) continue;\r\n\r\n      \/\/ Skip markers too far from the configured center (bad\/unrelated data)\r\n      if (MAX_DISTANCE) {\r\n        var dLat = Math.abs(lat - DEFAULT_CENTER[0]);\r\n        var dLon = Math.abs(lon - DEFAULT_CENTER[1]);\r\n        if (dLat > MAX_DISTANCE || dLon > MAX_DISTANCE) continue;\r\n      }\r\n\r\n      \/\/ The component's own key for this result - the same one renderCard looks up.\r\n      var id = resultIdFor(result);\r\n      if (!id) continue;\r\n      points.push({ id: id, lat: lat, lon: lon });\r\n    }\r\n\r\n    \/\/ The event re-fires for changes the map doesn't show (pagination, a half-picked date\r\n    \/\/ range, a layout switch). Same markers in the same places: leave the map alone.\r\n    var signature = points\r\n      .map(function (p) {\r\n        return p.id + '@' + p.lat + ',' + p.lon;\r\n      })\r\n      .join('|');\r\n    if (signature === lastSignature) return;\r\n    lastSignature = signature;\r\n\r\n    unmountOpenCard();\r\n    markersLayer.clearLayers();\r\n\r\n    var bounds = [];\r\n    for (var i = 0; i < points.length; i++) {\r\n      addMarker(points[i]);\r\n      bounds.push([points[i].lat, points[i].lon]);\r\n    }\r\n\r\n    if (bounds.length > 0) {\r\n      map.fitBounds(bounds, { padding: [40, 40], maxZoom: 14 });\r\n    }\r\n  }\r\n\r\n  \/\/ ========================================================================\r\n  \/\/ DISPLAY HANDLER\r\n  \/\/ ========================================================================\r\n\r\n  function handleDisplayResults(detail) {\r\n    var container = document.getElementById('aisearch-custom-display-map');\r\n    if (!container) return;\r\n\r\n    \/\/ Without displayOptions the component only renders the mount div while the map layout is\r\n    \/\/ active, so switching away and back hands us a new div. Leaflet can't move maps between\r\n    \/\/ containers: drop the old one and start over on the new div.\r\n    if (map ? map.getContainer() !== container : false) {\r\n      unmountOpenCard();\r\n      map.remove();\r\n      map = null;\r\n      markersLayer = null;\r\n      lastSignature = null;\r\n    }\r\n\r\n    if (!map) {\r\n      initMap(container);\r\n    } else {\r\n      \/\/ The container may have been display:none while another layout was active.\r\n      map.invalidateSize();\r\n    }\r\n\r\n    var results = detail.filteredResults || [];\r\n    renderMarkers(results, detail.renderCard);\r\n  }\r\n\r\n  \/\/ ========================================================================\r\n  \/\/ EVENT LISTENER\r\n  \/\/ ========================================================================\r\n\r\n  window.addEventListener('aisearch_onDisplayResults', function (event) {\r\n    var detail = event.detail;\r\n    if (!detail) return;\r\n\r\n    \/\/ Only render for the map layout\r\n    if (detail.activeLayout !== ACTIVE_LAYOUT) return;\r\n\r\n    \/\/ Optional: only render for specific instance\r\n    if (isOtherInstance(detail.selector)) return;\r\n\r\n    \/\/ Leaflet may already be on the page (the site, or another demo loaded it).\r\n    if (window.L) leafletReady = true;\r\n\r\n    if (!leafletReady) {\r\n      \/\/ Keep only the newest event; load Leaflet once even if more arrive while it loads.\r\n      pendingDetail = detail;\r\n      if (leafletLoading) return;\r\n      leafletLoading = true;\r\n      loadLeaflet(function () {\r\n        if (pendingDetail) {\r\n          handleDisplayResults(pendingDetail);\r\n          pendingDetail = null;\r\n        }\r\n      });\r\n      return;\r\n    }\r\n\r\n    handleDisplayResults(detail);\r\n  });\r\n\r\n  if (REGISTER_DISPLAY_OPTIONS) {\r\n    window.addEventListener('aisearch_onMount', function (event) {\r\n      var selector = (event.detail || {}).selector;\r\n      if (isOtherInstance(selector)) return;\r\n      window.dispatchEvent(\r\n        new CustomEvent('aisearch_updateConfig', {\r\n          detail: { selector: selector, results: { displayOptions: DISPLAY_OPTIONS } },\r\n        }),\r\n      );\r\n    });\r\n  }\r\n})();\r\n\r\n<\/script><div class=\"miles-ai-mfe miles-ai-template--listings-with-map miles-ai-template--listings\" id=\"miles-ai-100155\" data-template=\"listings-with-map\" data-mount-type=\".\/searchMount\" data-config='{&quot;apiEndpoint&quot;:&quot;listings&quot;,&quot;modules&quot;:[&quot;pagination&quot;,&quot;filtering&quot;,&quot;sorting&quot;,&quot;ai-search&quot;,&quot;analytics&quot;],&quot;ui&quot;:{&quot;showAiLogos&quot;:true,&quot;componentTitle&quot;:&quot;Search On The Water Activities in Virginia Beach&quot;},&quot;searchBehavior&quot;:{&quot;placeholder&quot;:&quot;Search&quot;,&quot;mode&quot;:&quot;manual&quot;,&quot;minQueryLength&quot;:4,&quot;showButton&quot;:true,&quot;hideExpiredContent&quot;:true,&quot;buttonText&quot;:&quot;&quot;,&quot;buttonIcon&quot;:&quot;magnifying-glass&quot;,&quot;showQueryAsPill&quot;:true,&quot;showAISummary&quot;:true,&quot;useStreamingSummary&quot;:true},&quot;results&quot;:{&quot;resultLayout&quot;:&quot;Grid&quot;,&quot;showResultsHeader&quot;:true,&quot;customImageFallback&quot;:&quot;\/wp-content\/themes\/virginia-beach\/assets\/images\/profile_default.webp?v=1&quot;,&quot;resultsHeaderText&quot;:&quot;Showing {firstResult} - {lastResult} of {totalResults} {:totalResults}&quot;,&quot;cardClickable&quot;:false,&quot;linkTarget&quot;:&quot;_self&quot;,&quot;showImages&quot;:true,&quot;imageClickable&quot;:true,&quot;showTeasers&quot;:true,&quot;lineClamp&quot;:4,&quot;showRegion&quot;:true,&quot;showScores&quot;:false,&quot;showContentType&quot;:false,&quot;showFeatured&quot;:false,&quot;showCTALink&quot;:false,&quot;listingWebsites&quot;:{&quot;business&quot;:&quot;&quot;,&quot;booking&quot;:&quot;&quot;,&quot;mobile&quot;:&quot;&quot;,&quot;meetings&quot;:&quot;&quot;},&quot;displayOptions&quot;:[{&quot;key&quot;:&quot;list&quot;,&quot;label&quot;:&quot;List View&quot;,&quot;icon&quot;:&quot;list&quot;},{&quot;key&quot;:&quot;map&quot;,&quot;label&quot;:&quot;Map View&quot;,&quot;icon&quot;:&quot;location-dot&quot;,&quot;showPager&quot;:false,&quot;showSorting&quot;:false}]},&quot;filters&quot;:{&quot;dynamicFilters&quot;:true,&quot;collapsibleGroups&quot;:false,&quot;mainFilterLabel&quot;:&quot;Filter Results&quot;,&quot;datesFilterLabel&quot;:&quot;Select your dates&quot;,&quot;filterLogic&quot;:&quot;AND&quot;,&quot;separateRangeSelector&quot;:true,&quot;showInputAndCal&quot;:true,&quot;showFilterResultCount&quot;:false,&quot;showMoreText&quot;:&quot;View All&quot;,&quot;showLessText&quot;:&quot;View Less&quot;,&quot;maxFilterValues&quot;:4,&quot;datePickerOptions&quot;:{&quot;monthsShown&quot;:1},&quot;filtersToShow&quot;:[&quot;Region&quot;,&quot;On the Water&quot;]},&quot;sorting&quot;:{&quot;initialSort&quot;:&quot;rankSort:desc:shuffle&quot;,&quot;sortOptions&quot;:[{&quot;key&quot;:&quot;rankSort&quot;,&quot;label&quot;:&quot;Ranked&quot;,&quot;direction&quot;:&quot;desc&quot;,&quot;nestedSort&quot;:&quot;shuffle&quot;},{&quot;key&quot;:&quot;random&quot;,&quot;label&quot;:&quot;Random&quot;,&quot;direction&quot;:&quot;asc&quot;},{&quot;key&quot;:&quot;title&quot;,&quot;label&quot;:&quot;A to Z&quot;,&quot;direction&quot;:&quot;asc&quot;},{&quot;key&quot;:&quot;title&quot;,&quot;label&quot;:&quot;Z to A&quot;,&quot;direction&quot;:&quot;desc&quot;}]},&quot;pagination&quot;:{&quot;paginationStyle&quot;:&quot;prevNext&quot;,&quot;limit&quot;:2001,&quot;showPageButtons&quot;:true,&quot;showFirstLastButtons&quot;:false,&quot;prevNextIcon&quot;:&quot;arrow&quot;,&quot;nextButtonText&quot;:&quot;&quot;,&quot;prevButtonText&quot;:&quot;&quot;,&quot;visiblePageLinks&quot;:9,&quot;allowResultsPerPageChange&quot;:false,&quot;paginationInfoText&quot;:&quot;&quot;},&quot;responsive&quot;:{&quot;mobile&quot;:{&quot;results&quot;:{&quot;resultLayout&quot;:&quot;list&quot;},&quot;filters&quot;:{&quot;filterLayout&quot;:&quot;drawer&quot;}},&quot;desktop&quot;:{&quot;results&quot;:{&quot;resultLayout&quot;:&quot;grid&quot;},&quot;filters&quot;:{&quot;filterLayout&quot;:&quot;sidebar&quot;}}},&quot;tokenUrl&quot;:&quot;https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/miles-ai-mfe\/v1\/guided-discovery\/token&quot;,&quot;preFilters&quot;:&quot;\\&quot;On the Water\\&quot;&quot;,&quot;type&quot;:[&quot;listing&quot;],&quot;client&quot;:&quot;visit-virginia-beach&quot;,&quot;apiUrl&quot;:&quot;https:\/\/api-search.milesai.net\/api&quot;,&quot;timezone&quot;:&quot;America\/New_York&quot;}' data-meta='{&quot;mountType&quot;:&quot;.\/searchMount&quot;,&quot;instanceKey&quot;:&quot;miles-ai-100155&quot;,&quot;siteEnvironment&quot;:&quot;live&quot;,&quot;template&quot;:&quot;listings-with-map&quot;,&quot;templateLabel&quot;:&quot;Listings with Map&quot;,&quot;templateChain&quot;:[&quot;listings-with-map&quot;,&quot;listings&quot;]}'><\/div><section class=\"ugc-block mg-top-x2\">\n\t<div class=\"fold-sm-up fold-wrap xl padded-sm-up gapped pd-top-x2 pd-bottom-x2 justify-content-center\">\n\t\t<div class=\"content-wrap col-sm-2\">\n\t\t\t<p class=\"alt-font-family size-32 mg-bottom-small color-white\">Trouve plus d\u2019inspiration<\/p>\n\t\t\t<h2 class=\"mg-bottom\">Quelques fa\u00e7ons de profiter du soleil et du grand air, ici, dans le terrain de jeu parfait de la nature.<\/h2>\n\t\t\t<p>D\u00e9couvre quelques images de nos visiteurs qui s\u2019amusent et vivent des aventures en plein air et sur l\u2019eau.<\/p>\n\t\t<\/div>\n\t\t<div class=\"crowdriff-wrap col-sm-4\">\n\t\t\t<script id=\"cr-init__b19fd90de852b941\" src=\"https:\/\/starling.crowdriff.com\/js\/crowdriff.js\" async=\"\"><\/script>\n\t\t<\/div>\n\t<\/div>\n<\/section>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":5,"featured_media":28861,"parent":28078,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"enable_ai_generated_excerpts":true,"ai_model_name":"","ai_prompt_id":"","footnotes":""},"class_list":["post-28860","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"publishpress_future_workflow_manual_trigger":{"enabledWorkflows":[]},"_links":{"self":[{"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/pages\/28860","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/comments?post=28860"}],"version-history":[{"count":5,"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/pages\/28860\/revisions"}],"predecessor-version":[{"id":29855,"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/pages\/28860\/revisions\/29855"}],"up":[{"embeddable":true,"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/pages\/28078"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/media\/28861"}],"wp:attachment":[{"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/media?parent=28860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}