{"id":28817,"date":"2025-05-14T20:08:20","date_gmt":"2025-05-14T20:08:20","guid":{"rendered":"https:\/\/www.visitvirginiabeach.com\/experiences\/attractions\/attractions-en-interieur\/"},"modified":"2026-09-11T23:48:56","modified_gmt":"2026-09-11T23:48:56","slug":"attractions-en-interieur","status":"publish","type":"page","link":"https:\/\/www.visitvirginiabeach.com\/fr\/experiences\/attractions\/attractions-en-interieur\/","title":{"rendered":"Attractions en int\u00e9rieur"},"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\/05\/144_3_3398_jpeg_7f8d84d6-c5df-40b7-a147-ec0812869f47-min-scaled.jpg\" alt=\"Two skydivers practice indoor skydiving in a wind tunnel, while spectators watch from behind a glass barrier.\" width=\"1920\" height=\"1080\" fetchpriority=\"high\"\/><div class=\"overlay-content\"><h1 class=\"extra\">Attractions en int\u00e9rieur \u00e0 Virginia Beach<\/h1><\/div><\/div><\/div><div class=\"after-overlay-content page-content-wrap fold-wrap md padded\"><p>M\u00eame si nous avons la chance d\u2019avoir des <a href=\"https:\/\/www.visitvirginiabeach.com\/fr\/experiences\/plages-et-regions\/\" data-type=\"page\" data-id=\"14327\">kilom\u00e8tres de sable dor\u00e9<\/a> et des journ\u00e9es le plus souvent ensoleill\u00e9es, M\u00e8re Nature a aussi ses sautes d\u2019humeur \u2014 m\u00eame \u00e0 Virginia Beach. Heureusement, les activit\u00e9s ne manquent pas pour te garder au chaud, au sec et bien occup\u00e9, m\u00eame quand la m\u00e9t\u00e9o n\u2019est pas digne d\u2019une carte postale. D\u00e9couvre ces articles consacr\u00e9s aux activit\u00e9s en int\u00e9rieur \u00e0 Virginia Beach, puis utilise l\u2019annuaire personnalis\u00e9 ci-dessous pour organiser ta journ\u00e9e.  <\/p><\/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\">Plongez plus profond\u00e9ment<\/p><h2 class=\"color-default\" id=\"related-articles-heading\">Du fun en int\u00e9rieur<\/h2><p>M\u00eame quand le ciel est couvert, \u00e0 Virginia Beach, le fun est toujours au rendez-vous.<\/p><\/div><\/div><div class=\"splide__track\"><div class=\"splide__list\">\n<div class=\"splide__slide box\"><a href=\"\/trip-ideas\/the-best-things-to-do-in-virginia-beach-on-a-rainy-day\/\" 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\/144_3_5838_jpeg_00ff2fce-5648-4560-9c3c-28a7452db50c-388x258.jpg\" alt=\"\" width=\"388\" height=\"258\" loading=\"lazy\"\/><figcaption class=\"visually-hidden\">Les meilleures activit\u00e9s \u00e0 faire \u00e0 Virginia Beach un jour de pluie<\/figcaption><\/figure><\/a><h3 class=\"h5 mg-top\"><a href=\"https:\/\/www.visitvirginiabeach.com\/trip-ideas\/the-best-things-to-do-in-virginia-beach-on-a-rainy-day\/\" target=\"_self\" class=\"read-more\" aria-label=\"Read more about The Best Things to Do in Virginia Beach on a Rainy Day, opens in a new tab\">Les meilleures activit\u00e9s \u00e0 faire \u00e0 Virginia Beach un jour de pluie<\/a><\/h3><p class=\"size-14\">Des parcs d\u2019aventure aux escape games et plus encore, d\u00e9couvre le meilleur des activit\u00e9s en int\u00e9rieur.<\/p><\/div>\n\n\n\n<div class=\"splide__slide box\"><a href=\"\/trip-ideas\/indoor-activities-that-are-as-good-as-being-outside\/\" 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\/06\/Apex-MC-388x258.jpg\" alt=\"\" width=\"388\" height=\"258\" loading=\"lazy\"\/><figcaption class=\"visually-hidden\">Des activit\u00e9s en int\u00e9rieur aussi bien qu\u2019en plein air<\/figcaption><\/figure><\/a><h3 class=\"h5 mg-top\"><a href=\"\/trip-ideas\/indoor-activities-that-are-as-good-as-being-outside\/\" target=\"_self\" class=\"read-more\" aria-label=\"Read more about Indoor Activities That are as Good as Being Outside, opens in a new tab\">Des activit\u00e9s en int\u00e9rieur aussi bien qu\u2019en plein air<\/a><\/h3><p class=\"size-14\">Le plaisir brille toujours dans ces aventures en int\u00e9rieur pour tous les \u00e2ges.<\/p><\/div>\n\n\n\n<div class=\"splide__slide box\"><a href=\"\/trip-ideas\/vb-cold-comforts-family-friendly-indoor-fun\/\" 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\/MOCA_629_5b69f82f-6d04-4f0e-b7e0-3416789de6f1.jpg\" alt=\"\" width=\"388\" height=\"258\" loading=\"lazy\"\/><figcaption class=\"visually-hidden\">Du fun en int\u00e9rieur en famille \u00e0 Virginia Beach<\/figcaption><\/figure><\/a><h3 class=\"h5 mg-top\"><a href=\"https:\/\/www.visitvirginiabeach.com\/trip-ideas\/vb-cold-comforts-family-friendly-indoor-fun\/\" target=\"_self\" class=\"read-more\" aria-label=\"Read more about Family-Friendly Indoor Fun in Virginia Beach, opens in a new tab\">Du fun en int\u00e9rieur en famille \u00e0 Virginia Beach<\/a><\/h3><p class=\"size-14\">Il fait froid et humide dehors ? Voici comment garder la famille au chaud, au sec et souriante. <\/p><\/div>\n\n\n\n<div class=\"splide__slide box\"><a href=\"\/trip-ideas\/where-to-find-the-best-shopping-in-virginia-beach\/\" 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\/WS1_2576-lowres-388x258.jpg\" alt=\"\" width=\"388\" height=\"258\" loading=\"lazy\"\/><figcaption class=\"visually-hidden\">O\u00f9 trouver les meilleures boutiques \u00e0 Virginia Beach<\/figcaption><\/figure><\/a><h3 class=\"h5 mg-top\"><a href=\"https:\/\/www.visitvirginiabeach.com\/trip-ideas\/where-to-find-the-best-shopping-in-virginia-beach\/\" target=\"_self\" class=\"read-more\" aria-label=\"Read more about Where to Find the Best Shopping in Virginia Beach, opens in a new tab\">O\u00f9 trouver les meilleures boutiques \u00e0 Virginia Beach<\/a><\/h3><p class=\"size-14\">Virginia Beach t\u2019ouvre les portes d\u2019un paradis du shopping en bord de mer, rempli de trouvailles uniques et de superbes tr\u00e9sors. <\/p><\/div>\n\n\n\n<div class=\"splide__slide box\"><a href=\"\/trip-ideas\/10-restaurants-for-a-romantic-night-out-in-virginia-beach\/\" 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\/Esoteric_2_eb67dd3e-6f05-4997-908f-47d12e9ef11a-1-388x258.jpg\" alt=\"\" width=\"388\" height=\"258\" loading=\"lazy\"\/><figcaption class=\"visually-hidden\">10 restaurants pour une soir\u00e9e romantique \u00e0 Virginia Beach<\/figcaption><\/figure><\/a><h3 class=\"h5 mg-top\"><a href=\"\/trip-ideas\/10-restaurants-for-a-romantic-night-out-in-virginia-beach\/\" target=\"_self\" class=\"read-more\" aria-label=\"Read more about 10 Restaurants for a Romantic Night Out in Virginia Beach, opens in a new tab\">10 restaurants pour une soir\u00e9e romantique \u00e0 Virginia Beach<\/a><\/h3><p class=\"size-14\">Que ce soit ton premier rendez-vous ou ton 1\u202f001e, choisir un restaurant romantique est un \u00e9l\u00e9ment cl\u00e9. <\/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><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);\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-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\">\/\/ ============================================================\r\n  \/\/ Find the instance element and config by selector or template.\r\n  \/\/ ============================================================\r\n  function findInstance(selector) {\r\n    var el = document.querySelector(selector);\r\n    if (!el) return null;\r\n    try {\r\n      return {\r\n        el: el,\r\n        config: JSON.parse(el.getAttribute('data-config')),\r\n        template: el.getAttribute('data-template'),\r\n      };\r\n    } catch (e) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  \/\/ ============================================================\r\n  \/\/ Mount handler \u2014 fires once per instance\r\n  \/\/ ============================================================\r\n  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 instance = findInstance(selector);\r\n    if (!instance) return;\r\n\r\n    var config = {};\r\n\r\n    \/\/ Event type\r\n    if (instance.config.type === 'event') {\r\n      config.searchBehavior = { placeholder: 'Search for events by interest, topic, or idea...' };\r\n      config.filters = Object.assign(config.filters || {}, { showDatePicker: true });\r\n      config.results = Object.assign(config.results || {}, { resultLayout: \"list\" });\r\n      config.sorting = {\r\n        initialSort: 'next_occurrence:asc',\r\n        sortOptions: []\r\n      };\r\n    }\r\n\r\n    if (Object.keys(config).length > 0) {\r\n      config.selector = selector;\r\n      window.dispatchEvent(new CustomEvent('aisearch_updateConfig', { detail: config }));\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\n\/**\r\n * Custom Display Multi-Layout Template\r\n *\/\r\n\r\n\/\/ ========================================================================\r\n\/\/ CONFIG\r\n\/\/ ========================================================================\r\n\r\nvar LEAFLET_CSS = 'https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css';\r\nvar LEAFLET_JS = 'https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js';\r\n\r\n\/\/ Default map center and zoom (Virginia Beach)\r\nvar DEFAULT_CENTER = [36.85, -75.98];\r\nvar DEFAULT_ZOOM = 11;\r\n\r\n\/\/ Map container height\r\nvar MAP_HEIGHT = '600px';\r\n\r\n\/\/ Max distance in degrees from DEFAULT_CENTER to include a marker (~1 degree \u2248 69 miles).\r\n\/\/ Skips results with bad\/erroneous lat\/lon outside the Virginia Beach area.\r\nvar MAX_DISTANCE = 1;\r\n\r\n\/\/ Only render for a specific selector (or null for all instances)\r\nvar SELECTOR_FILTER = null;\r\n\r\n\/\/ ========================================================================\r\n\/\/ STATE\r\n\/\/ ========================================================================\r\n\r\nvar map = null;\r\nvar markersLayer = null;\r\nvar leafletReady = false;\r\nvar pendingDetail = null;\r\nvar popupCleanups = [];\r\n\r\n\/\/ ========================================================================\r\n\/\/ MAP INITIALIZATION\r\n\/\/ ========================================================================\r\n\r\nfunction injectTileFix() {\r\n    if (document.getElementById('leaflet-tile-fix')) return;\r\n    var style = document.createElement('style');\r\n    style.id = 'leaflet-tile-fix';\r\n    \/\/ Override any site CSS that constrains img dimensions (e.g. max-width: 100%).\r\n    \/\/ Leaflet tiles are <img> elements with absolute positioning and must not be constrained.\r\n    style.textContent = '.leaflet-container img { max-width: none !important; max-height: none !important; width: auto !important; min-width: unset !important; }';\r\n    document.head.appendChild(style);\r\n}\r\n\r\nfunction initMap(container, onReady) {\r\n    var L = window.L;\r\n    injectTileFix();\r\n    container.style.height = MAP_HEIGHT;\r\n    container.style.width = '100%';\r\n    \/\/ tap: false fixes iOS Safari touch handling conflicts in Leaflet\r\n    map = L.map(container, { tap: false }).setView(DEFAULT_CENTER, DEFAULT_ZOOM);\r\n    L.tileLayer('https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\r\n        attribution: '&copy; <a href=\"http:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a>',\r\n        maxZoom: 19,\r\n        detectRetina: false\r\n    }).addTo(map);\r\n    markersLayer = L.layerGroup().addTo(map);\r\n    map.invalidateSize();\r\n    onReady();\r\n}\r\n\r\n\/\/ ========================================================================\r\n\/\/ LAYOUT RENDER FUNCTIONS\r\n\/\/ ========================================================================\r\n\r\nfunction placeMarkers(detail) {\r\n    var L = window.L;\r\n    markersLayer.clearLayers();\r\n\r\n    popupCleanups.forEach(function (cleanup) { cleanup(); });\r\n    popupCleanups.length = 0;\r\n\r\n    var results = detail.filteredResults || [];\r\n    var bounds = [];\r\n\r\n    results.forEach(function (result) {\r\n        var lat = result && result.json && result.json.extras && result.json.extras.lat;\r\n        var lon = result && result.json && result.json.extras && result.json.extras.lon;\r\n        if (!lat || !lon) return;\r\n\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) return;\r\n        }\r\n\r\n        var id = result.content_identifier || result.id || String((result.json || {}).id);\r\n        var marker = L.marker([lat, lon]).addTo(markersLayer);\r\n\r\n        var popupEl = document.createElement('div');\r\n\r\n        try {\r\n            var cleanup = detail.renderCard(id, popupEl);\r\n            if (cleanup) popupCleanups.push(cleanup);\r\n        } catch (e) {\r\n            popupEl.innerHTML = '<div style=\"padding:8px\">' + (result.json && result.json.title ? result.json.title : 'View') + '<\/div>';\r\n        }\r\n\r\n        marker.bindPopup(popupEl);\r\n        bounds.push([lat, lon]);\r\n    });\r\n\r\n    if (bounds.length) {\r\n        map.fitBounds(bounds, { padding: [40, 40], maxZoom: 16 });\r\n    }\r\n}\r\n\r\nfunction renderMapLayout(container, detail) {\r\n    if (!map) {\r\n        initMap(container, function () { placeMarkers(detail); });\r\n    } else {\r\n        map.invalidateSize();\r\n        placeMarkers(detail);\r\n    }\r\n}\r\n\r\n\/\/ ========================================================================\r\n\/\/ LAYOUT REGISTRY\r\n\/\/ Map layout keys to their render functions.\r\n\/\/ Container convention: #aisearch-custom-display-{key}\r\n\/\/ To add a layout: define a render function and add an entry here.\r\n\/\/ ========================================================================\r\n\r\nvar layouts = {\r\n    'map': renderMapLayout,\r\n    \/\/ 'otherDisplayKey': renderCustomLayout\r\n};\r\n\r\n\/\/ ========================================================================\r\n\/\/ LEAFLET LOADING\r\n\/\/ ========================================================================\r\n\r\nfunction loadLeaflet(callback) {\r\n    var cssReady = false;\r\n    var jsReady = false;\r\n\r\n    function onBothReady() {\r\n        \/\/ One rAF ensures the CSS has been applied to the DOM before Leaflet\r\n        \/\/ reads any computed styles during map initialization.\r\n        requestAnimationFrame(function () { callback(); });\r\n    }\r\n\r\n    function check() {\r\n        if (cssReady && jsReady) onBothReady();\r\n    }\r\n\r\n    var link = document.createElement('link');\r\n    link.rel = 'stylesheet';\r\n    link.href = LEAFLET_CSS;\r\n    link.onload = function () { cssReady = true; check(); };\r\n    link.onerror = function () { cssReady = true; check(); }; \/\/ don't block on CSS failure\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 () { leafletReady = true; jsReady = true; check(); };\r\n    script.onerror = function () {\r\n        console.error('[vvb-map] Failed to load Leaflet from:', LEAFLET_JS);\r\n    };\r\n    document.head.appendChild(script);\r\n}\r\n\r\n\/\/ ========================================================================\r\n\/\/ DISPLAY HANDLER\r\n\/\/ ========================================================================\r\n\r\nfunction handleDisplayResults(detail) {\r\n    var handler = layouts[detail.activeLayout];\r\n    if (!handler) return;\r\n\r\n    var containerId = 'aisearch-custom-display-' + detail.activeLayout;\r\n    var root = detail.selector ? document.querySelector(detail.selector) : document;\r\n    var container = (root || document).querySelector('#' + containerId);\r\n    if (!container) return;\r\n\r\n    handler(container, detail);\r\n}\r\n\r\n\/\/ ========================================================================\r\n\/\/ EVENT LISTENER\r\n\/\/ ========================================================================\r\n\r\nwindow.addEventListener('aisearch_onDisplayResults', function (event) {\r\n    var detail = event.detail;\r\n    if (!detail) return;\r\n\r\n    if (!layouts[detail.activeLayout]) return;\r\n\r\n    if (SELECTOR_FILTER && detail.selector !== SELECTOR_FILTER) return;\r\n\r\n    if (typeof window.L !== 'undefined') {\r\n        leafletReady = true;\r\n    }\r\n\r\n    if (!leafletReady) {\r\n        pendingDetail = detail;\r\n        if (!document.querySelector('script[src=\"' + LEAFLET_JS + '\"]')) {\r\n            loadLeaflet(function () {\r\n                if (pendingDetail) {\r\n                    handleDisplayResults(pendingDetail);\r\n                    pendingDetail = null;\r\n                }\r\n            });\r\n        }\r\n        return;\r\n    }\r\n\r\n    handleDisplayResults(detail);\r\n});\r\n<\/script><div class=\"miles-ai-mfe miles-ai-template--listings-with-map miles-ai-template--listings\" id=\"miles-ai-1\" data-template=\"listings-with-map\" 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;Explore Indoor Activities&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;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;:2000,&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;preFilters&quot;:&quot;\\&quot;Indoor Attractions\\&quot; AND \\&quot;Indoor Attractions\\&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;}'><\/div>\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":4,"featured_media":28818,"parent":28423,"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-28817","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"publishpress_future_action":{"enabled":false,"date":"2026-09-19 03:09:36","action":"change-status","newStatus":"draft","terms":[],"taxonomy":"translation_priority","extraData":[]},"publishpress_future_workflow_manual_trigger":{"enabledWorkflows":[]},"_links":{"self":[{"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/pages\/28817","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\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/comments?post=28817"}],"version-history":[{"count":11,"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/pages\/28817\/revisions"}],"predecessor-version":[{"id":28859,"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/pages\/28817\/revisions\/28859"}],"up":[{"embeddable":true,"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/pages\/28423"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/media\/28818"}],"wp:attachment":[{"href":"https:\/\/www.visitvirginiabeach.com\/fr\/wp-json\/wp\/v2\/media?parent=28817"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}