{"version":3,"file":"ship-FRJvzLQv.js","sources":["../../../scripts/components/products/details/ship-features.vue","../../../scripts/components/products/details/ship-page.vue","../../../scripts/entry-points/ship.ts"],"sourcesContent":["<template>\r\n    <div class=\"product-features -narrow mt-2\">\r\n        <ul>\r\n            <li v-for=\"feature in shipFeatures\" :key=\"feature\">\r\n                <i :class=\"shipFeatureIconMap.get(`ship-${feature}`) || 'icon-check-ut'\"></i>\r\n                {{ feature }}\r\n            </li>\r\n        </ul>\r\n    </div>\r\n</template>\r\n\r\n\r\n<script setup lang=\"ts\">\r\n    import { PropType } from \"vue\";\r\n\r\n    defineProps({\r\n        shipFeatures: {\r\n            type: Array as PropType<string[]>,\r\n            default: undefined\r\n        }\r\n    });\r\n\r\n    const shipFeatureIconMap = new Map([\r\n        [\"ship-24-hour Room Service\"        , \"icon-room-service\" ],\r\n        [\"ship-All-Inclusive\"               , \"icon-all-inclusive\"],\r\n        [\"ship-Beauty Salon\"                , \"icon-salon\"        ],\r\n        [\"ship-Broadway-style Entertainment\", \"icon-disco\"        ],\r\n        [\"ship-Butler Service\"              , \"icon-butler\"       ],\r\n        [\"ship-Casino\"                      , \"icon-casino\"       ],\r\n        [\"ship-Child Care/Babysitting\"      , \"icon-babysitting\"  ],\r\n        [\"ship-Children's Play room\"        , \"icon-children2\"    ],\r\n        [\"ship-Children's Pool\"             , \"icon-pool\"         ],\r\n        [\"ship-Complimentary Wi-Fi Access\"  , \"icon-connection\"   ],\r\n        [\"ship-Cooking Classes\"             , \"icon-cooking\"      ],\r\n        [\"ship-Elevators\"                   , \"icon-elevator\"     ],\r\n        [\"ship-Fitness Center\"              , \"icon-fitness\"      ],\r\n        [\"ship-Fitness Classes\"             , \"icon-fitness\"      ],\r\n        [\"ship-Formal Nights\"               , \"icon-new-dress\"    ],\r\n        [\"ship-Hot Tub\"                     , \"icon-jacuzzi1\"     ],\r\n        [\"ship-Kosher Meals\"                , \"icon-kosher-food\"  ],\r\n        [\"ship-Laundry/Dry Cleaning\"        , \"icon-laundry\"      ],\r\n        [\"ship-Library\"                     , \"icon-library\"      ],\r\n        [\"ship-Movie Theatre\"               , \"icon-popcorn\"      ],\r\n        [\"ship-Onboard Weddings\"            , \"icon-wedding\"      ],\r\n        [\"ship-Self Service Laundromat\"     , \"icon-laundry\"      ],\r\n        [\"ship-Showroom\"                    , \"icon-theater\"      ],\r\n        [\"ship-Single Occupancy Cabins\"     , \"icon-user\"         ],\r\n        [\"ship-Spa\"                         , \"icon-spa\"          ],\r\n        [\"ship-Specialty Restaurants\"       , \"icon-restaurant\"   ],\r\n        [\"ship-Supervised Youth Program\"    , \"icon-children2\"    ],\r\n        [\"ship-Swimming Pool\"               , \"icon-pool\"         ],\r\n        [\"ship-Water Sports Platform\"       , \"icon-water-sports\" ],\r\n        [\"ship-Wheelchair Accessible Cabins\", \"icon-wheelchair\"   ]\r\n    ]);\r\n</script>\r\n","<template>\r\n    <div v-if=\"isReady\" ref=\"ship-page\" class=\"product-detail ship-page\">\r\n        <div class=\"extra-wide top-splash mb-4\">\r\n            <button class=\"wl-heartable -save-this -top-right d-none d-lg-block\" data-wl-type=\"cruise\" :data-wl-id=\"heartableUrl\" :data-wl-title=\"ship.shipName\"></button>\r\n            <div class=\"-logo text-center\">\r\n                <img v-if=\"logoUrl\" :src=\"logoUrl\" alt=\"Logo\">\r\n                <h3 class=\"mt-1 mb-0\" v-html=\"ship.shipName\"></h3>\r\n            </div>\r\n            <div class=\"position-relative\">\r\n                <button class=\"wl-heartable -top-right d-lg-none\" data-wl-type=\"cruise\" :data-wl-id=\"heartableUrl\" :data-wl-title=\"ship.shipName\" aria-label=\"Save to Wanderlist\"></button>\r\n            </div>\r\n            <img v-if=\"ship.featuredImageUrl\" :src=\"ship.featuredImageUrl\" width=\"100%\" class=\"top-image\" :alt=\"ship.featuredImageCaption\" :title=\"ship.featuredImageCaption\">\r\n        </div>\r\n        <div class=\"container mb-6\">\r\n            <div class=\"product-detail-overview\">\r\n                <div class=\"-info\">\r\n                    <h1 v-html=\"ship.shipName\"></h1>\r\n                    <a :href=\"brandUrl\"><b v-html=\"ship.supplierName\"></b></a>\r\n\r\n                    <div v-if=\"ship.passengerCount\" class=\"mt-2\">Passenger Capacity: <b v-html=\"ship.passengerCount\"></b></div>\r\n                    <div v-if=\"ship.crewCount\" class=\"mt-1\">Crew: <b v-html=\"ship.crewCount\"></b></div>\r\n\r\n                    <div v-if=\"ship.description\" class=\"mt-2\" v-html=\"ship.description\"></div>\r\n                    <ship-features-component v-if=\"ship.shipFeatures.length\" :ship-features=\"ship.shipFeatures\"></ship-features-component>\r\n                    <a v-if=\"!isNetworkUser() && !isEmbeddedMode()\" id=\"advisor-catalog-link\" class=\"mt-2 btn btn-primary-emphasis btn-sm d-block\" :href=\"advisorCatalogLink\" v-html=\"findAnAdvisorLabel\"></a>\r\n                </div>\r\n                <div class=\"-gallery mt-5 mt-md-0\">\r\n                    <image-gallery-component v-if=\"ship.galleryImages && ship.galleryImages.length\"\r\n                                             :gallery-data=\"ship.galleryImages\"\r\n                                             :product-id=\"ship.id.toString()\"\r\n                                             :product-name=\"ship.shipName\"\r\n                                             :product-type=\"ProductType.SHIPS\"></image-gallery-component>\r\n                    <button class=\"wl-heartable -save-this mt-3\" data-wl-type=\"cruise\" :data-wl-id=\"heartableUrl\" :data-wl-title=\"ship.shipName\" aria-label=\"Save to Wanderlist\"></button>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <div id=\"detail-tabs\"></div>\r\n        <div v-if=\"showTabBlock\" class=\"container d-none d-md-block\">\r\n            <ul class=\"tab-nav-container\">\r\n                <li v-if=\"productCardCollection.productCards.length\" id=\"tab-products\"><button @click=\"showTab('products')\">Sailings</button></li>\r\n                <li v-if=\"showShipInfo\" id=\"tab-ship-info\"><button @click=\"showTab('ship-info')\">Ship Info</button></li>\r\n                <li v-if=\"ship.deckPlansUrl\" id=\"tab-deck-plans\" class=\"d-none d-md-block\"><button @click=\"showTab('deck-plans')\">Deck Plans</button></li>\r\n                <li v-if=\"ship.stateroomsUrl\" id=\"tab-staterooms\" class=\"d-none d-md-block\"><button @click=\"showTab('staterooms')\">Staterooms</button></li>\r\n                <li v-if=\"ship.publicAreasUrl\" id=\"tab-public-areas\" class=\"d-none d-md-block\"><button @click=\"showTab('public-areas')\">Public Areas</button></li>\r\n                <li v-if=\"ship.reviewsCount > 0\" id=\"tab-reviews\"><button @click=\"showTab('reviews')\">Reviews &amp; Recommendations</button></li>\r\n            </ul>\r\n        </div>\r\n        <div v-if=\"showTabBlock\" class=\"slab -tab-slab\">\r\n            <div class=\"container\">\r\n                <ul class=\"tab-content\">\r\n                    <li v-if=\"productCardCollection.productCards.length\" id=\"tc-products\">\r\n                        <button class=\"tab-nav\" @click=\"showTab('products')\">Sailings</button>\r\n                        <div class=\"-container\">\r\n                            <h4 class=\"tab-title\">Sailings</h4>\r\n                            <product-cards-component v-if=\"productCardCollection.productCards.length\" :content=\"productCardCollection\" class=\"slab py-0\"></product-cards-component>\r\n                        </div>\r\n                    </li>\r\n                    <li v-if=\"showShipInfo\" id=\"tc-ship-info\">\r\n                        <button class=\"tab-nav\" @click=\"showTab('ship-info')\">Ship Info</button>\r\n                        <div class=\"-container\">\r\n                            <h4 class=\"tab-title\">Ship Info</h4>\r\n                            <div class=\"ship-info\">\r\n                                <div v-if=\"ship.yearLaunched\">Inaugural Sailing: <b v-html=\"ship.yearLaunched\"></b></div>\r\n                                <div v-if=\"ship.yearRefurbished\">Renovated: <b v-html=\"ship.yearRefurbished\"></b></div>\r\n                                <div v-if=\"ship.tonnage\">Tonnage: <b v-html=\"ship.tonnage\"></b></div>\r\n                                <div v-if=\"ship.deckCount\">Public Decks: <b v-html=\"ship.deckCount\"></b></div>\r\n                            </div>\r\n                            <div v-if=\"ship.whatIsIncluded\" class=\"mt-2\">\r\n                                <b>Included</b><br />\r\n                                <div v-html=\"ship.whatIsIncluded\"></div>\r\n                            </div>\r\n                            <div v-if=\"ship.whatIsNotIncluded\" class=\"mt-2\">\r\n                                <b>Not Included</b><br />\r\n                                <div v-html=\"ship.whatIsNotIncluded\"></div>\r\n                            </div>\r\n                        </div>\r\n                    </li>\r\n                    <li v-if=\"ship.deckPlansUrl\" id=\"tc-deck-plans\" class=\"d-none d-md-block\">\r\n                        <button class=\"tab-nav\" @click=\"showTab('deck-plans')\">Deck Plans</button>\r\n                        <div class=\"-container\">\r\n                            <div class=\"alsek-wrapper\">\r\n                                <iframe :src=\"ship.deckPlansUrl\" width=\"100%\" frameborder=\"0\" title=\"Deck Plans\"></iframe>\r\n                            </div>\r\n                        </div>\r\n                    </li>\r\n                    <li v-if=\"ship.stateroomsUrl\" id=\"tc-staterooms\" class=\"d-none d-md-block\">\r\n                        <button class=\"tab-nav\" @click=\"showTab('staterooms')\">Staterooms</button>\r\n                        <div class=\"-container\">\r\n                            <div class=\"alsek-wrapper\">\r\n                                <iframe :src=\"ship.stateroomsUrl\" width=\"100%\" frameborder=\"0\" title=\"Staterooms\"></iframe>\r\n                            </div>\r\n                        </div>\r\n                    </li>\r\n                    <li v-if=\"ship.publicAreasUrl\" id=\"tc-public-areas\" class=\"d-none d-md-block\">\r\n                        <button class=\"tab-nav\" @click=\"showTab('public-areas')\">Public Areas</button>\r\n                        <div class=\"-container\">\r\n                            <div class=\"alsek-wrapper\">\r\n                                <iframe :src=\"ship.publicAreasUrl\" width=\"100%\" frameborder=\"0\" title=\"Public Areas\"></iframe>\r\n                            </div>\r\n                        </div>\r\n                    </li>\r\n                    <li v-if=\"ship.reviewsCount > 0\" id=\"tc-reviews\">\r\n                        <button class=\"tab-nav\" @click=\"showTab('reviews')\">Reviews &amp; Recommendations</button>\r\n                        <div class=\"-container\">\r\n                            <h4 class=\"tab-title\">Reviews &amp; Recommendations</h4>\r\n                            <product-reviews-component :company-id=\"ship.id\" :product-type=\"ProductType.SHIPS\" :reviews-data=\"reviewsData\"></product-reviews-component>\r\n                        </div>\r\n                    </li>\r\n                </ul>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    <LogoSplash v-else />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n    import ProductReviewsComponent from \"components/products/details/product-reviews.vue\";\r\n    import ShipFeaturesComponent from \"components/products/details/ship-features.vue\";\r\n    import ProductCardsComponent from \"components/products/product-cards.vue\";\r\n    import ImageGalleryComponent from \"components/shared/image-gallery.vue\";\r\n    import LogoSplash from \"components/shared/logo-splash.vue\";\r\n    import { DotCMSBrandPageResponse } from \"interfaces/responses/dotcms-responses\";\r\n    import { ShipDetailsResponse } from \"interfaces/responses/product-detail-responses\";\r\n    import { ProductCards, ProductCardSearchResult } from \"interfaces/card\";\r\n    import { ProductQuery } from \"interfaces/cms\";\r\n    import { ShipDetail } from \"interfaces/cruise\";\r\n    import { ProductType } from \"interfaces/enums\";\r\n    import { GalleryItem } from \"interfaces/image\";\r\n    import { getCmsContent } from \"services/api/cms\";\r\n    import { getShipDetails, getSupplierDetails } from \"services/api/products\";\r\n    import { isNetworkUser } from \"services/auth/user-info\";\r\n    import { baseImageUrl } from \"services/cms/cms\";\r\n    import { sanitizeUserGeneratedContent } from \"services/helpers/html\";\r\n    import { hydrateImageGallery } from \"services/helpers/images\";\r\n    import { toastError } from \"services/helpers/toasts\";\r\n    import { isEmbeddedMode } from \"services/layout/environment\";\r\n    import { getProductCards, getViewAllLabel } from \"services/product-cards\";\r\n    import { enableHearts } from \"services/wanderlist\";\r\n    import { cobrandLink, getPlural, isCobranded, slugify } from \"virtuoso-shared-web-ui\";\r\n    import { nextTick, ref, useTemplateRef } from \"vue\";\r\n\r\n    const props = defineProps({\r\n        shipId: {\r\n            type: Number,\r\n            default: undefined\r\n        }\r\n    });\r\n\r\n    const advisorCatalogLink = cobrandLink(\"/travel/advisors\");\r\n    const brandUrl = ref(\"\");\r\n    const findAnAdvisorLabel = (isCobranded()) ? \"Contact Travel Advisor\" : \"Find a Travel Advisor\";\r\n    const heartableUrl = ref(\"\");\r\n    const isReady = ref(false);\r\n    const logoUrl = ref(\"\");\r\n    const productCardCollection = ref<ProductCards>({} as ProductCards);\r\n    const reviewsData = ref({});\r\n    const ship = ref<ShipDetail>({} as ShipDetail);\r\n    const shipPageRef = useTemplateRef(\"ship-page\");\r\n    const showShipInfo = ref(false);\r\n    const showTabBlock = ref(false);\r\n\r\n    function defaultFirstTabName(): string {\r\n        // Which bottom tab should be selected by default, after the product query returns\r\n        if (productCardCollection.value.productCards.length) {\r\n            return \"products\"; \r\n        }\r\n        if (showShipInfo.value) {\r\n            return \"ship-info\";\r\n        }\r\n        if (ship.value.deckPlansUrl) {\r\n            return \"deck-plans\";\r\n        }\r\n        if (ship.value.stateroomsUrl) {\r\n            return \"staterooms\";\r\n        }\r\n        if (ship.value.publicAreasUrl) {\r\n            return \"public-areas\";\r\n        }\r\n        if (ship.value.reviewsCount > 0) {\r\n            return \"reviews\";\r\n        }\r\n        return \"\";\r\n    }\r\n    function loadShip(): void {\r\n        getShipDetails(props.shipId).then((resultShip: ShipDetailsResponse) => {\r\n            if (resultShip && resultShip.shipName && resultShip.supplierName) {\r\n                const thisShip: ShipDetail = {\r\n                    crewCount: resultShip.crewCount || null,\r\n                    deckCount: resultShip.deckCount || null,\r\n                    deckPlansUrl: resultShip.deckPlanUrl || \"\",\r\n                    description: resultShip.shipDescription || \"\",\r\n                    featuredImageCaption: \"\", // Populated below\r\n                    featuredImageUrl: \"\", // Populated below\r\n                    galleryImages: [], // Populated below\r\n                    id: resultShip.masterEntityId,\r\n                    passengerCount: resultShip.passengerCount || null,\r\n                    publicAreasUrl: resultShip.publicAreaUrl || \"\",\r\n                    reviewsCount: resultShip.totalActiveReviews || 0,\r\n                    reviewsPercent: resultShip.totalRecommendedPercent || 0,\r\n                    shipFeatures: resultShip.shipFeatures || [],\r\n                    shipName: resultShip.shipName,\r\n                    stateroomsUrl: resultShip.stateRoomUrl || \"\",\r\n                    supplierId: resultShip.supplierMasterEntityId,\r\n                    supplierName: resultShip.supplierName,\r\n                    tonnage: resultShip.tonnage || null,\r\n                    whatIsIncluded: \"\",\r\n                    whatIsNotIncluded: \"\",\r\n                    yearLaunched: resultShip.yearLaunched || null,\r\n                    yearRefurbished: resultShip.yearRefurbished || null\r\n                };\r\n\r\n                // Logo lookup from dotCMS, fallback to the supplier API\r\n                getCmsContent<DotCMSBrandPageResponse[]>({\r\n                    contentTypes: [\"BrandPage\"],\r\n                    depth: 1,\r\n                    limit: 1,\r\n                    queryClauses: [\r\n                        `+(BrandPage.supplierId:${thisShip.supplierId})`,\r\n                        `+(BrandPage.supplierType:cruise)`\r\n                    ]\r\n                }).then((cmsJSON) => { // There isn't necessarily a dotCMS page for every supplier\r\n                    if (cmsJSON?.length) {\r\n                        logoUrl.value = (cmsJSON[0].logo) ? baseImageUrl + cmsJSON[0].logo : \"\";\r\n                    }\r\n                }, () => {\r\n                    // Reject is fine, fall through to the next then()\r\n                }).then(() => {\r\n                    if (logoUrl.value === \"\") {\r\n                        getSupplierDetails(thisShip.supplierId).then((supplierJSON) => {\r\n                            if (supplierJSON && supplierJSON.name) {\r\n                                logoUrl.value = supplierJSON.logoImageUrl;\r\n                            }\r\n                        }, () => {\r\n                            // Well, I guess they don't get a logo. Shouldn't happen.\r\n                        });\r\n                    }\r\n                });\r\n\r\n\r\n                // Images -- first image is the featured image\r\n                let galleryImages: GalleryItem[] = [];\r\n                if (resultShip.imageLibraryItems && resultShip.imageLibraryItems.length) {\r\n                    galleryImages = hydrateImageGallery(resultShip.imageLibraryItems);\r\n                    thisShip.featuredImageUrl = galleryImages[0].image;\r\n                    thisShip.featuredImageCaption = galleryImages[0].description;\r\n                }\r\n                thisShip.galleryImages = galleryImages;\r\n\r\n\r\n                // What's (Not) Included\r\n                if (resultShip.whatIsIncludedItems) {\r\n                    if (resultShip.whatIsIncludedItems?.length > 1) {\r\n                        let theItems = \"\";\r\n                        resultShip.whatIsIncludedItems.forEach((item: string) => {\r\n                            theItems += `<li>${item}</li>`;\r\n                        });\r\n                        thisShip.whatIsIncluded = `<ul>${theItems}</ul>`;\r\n                    } else {\r\n                        thisShip.whatIsIncluded = sanitizeUserGeneratedContent(resultShip.whatIsIncludedItems[0]);\r\n                    }\r\n                }\r\n\r\n                if (resultShip.whatIsNotIncludedItems) {\r\n                    if (resultShip.whatIsNotIncludedItems?.length > 1) {\r\n                        let theItems = \"\";\r\n                        resultShip.whatIsNotIncludedItems.forEach((item: string) => {\r\n                            theItems += `<li>${item}</li>`;\r\n                        });\r\n                        thisShip.whatIsNotIncluded = `<ul>${theItems}</ul>`;\r\n                    } else {\r\n                        thisShip.whatIsNotIncluded = sanitizeUserGeneratedContent(resultShip.whatIsNotIncludedItems[0]);\r\n                    }\r\n                }\r\n\r\n\r\n                // Sailings\r\n                const sailingCards: ProductCards = {\r\n                    productCards: [],\r\n                    productType: ProductType.CRUISES,\r\n                    viewAllLink: cobrandLink(`/travel/luxury-cruises/search#cruiseLines=${encodeURIComponent(resultShip.supplierName)}&ships=${encodeURIComponent(resultShip.shipName)}`),\r\n                    viewAllText: \"See More Sailings\"\r\n                };\r\n\r\n                const productQuery: ProductQuery = {\r\n                    rowsLimit: 6,\r\n                    selectedFacets: [\r\n                        {\r\n                            category: \"all_cruise_ships\",\r\n                            name: resultShip.shipName,\r\n                            selected: true\r\n                        }\r\n                    ]\r\n                };\r\n\r\n                getProductCards(ProductType.CRUISES, productQuery).then((prods: ProductCardSearchResult) => {\r\n                    sailingCards.productCards = prods.productCards;\r\n                    sailingCards.viewAllText = getViewAllLabel(ProductType.SHIPS, prods.totalResults, productQuery.rowsLimit);\r\n                    productCardCollection.value = sailingCards;\r\n                    showFirstTab(); // We delay opening the first tab until we know if we have sailings or not\r\n                });\r\n\r\n\r\n                ship.value = thisShip;\r\n                heartableUrl.value = `https://www.virtuoso.com/travel/luxury-cruises/ships/${props.shipId}/${slugify(thisShip.shipName)}`;\r\n                brandUrl.value = cobrandLink(`/travel/luxury-cruises/cruise-lines/${thisShip.supplierId}/${slugify(thisShip.supplierName)}`);\r\n                showShipInfo.value = !!(thisShip.deckCount || thisShip.tonnage || thisShip.yearLaunched || thisShip.yearRefurbished);\r\n\r\n                if (thisShip.reviewsCount > 0) {\r\n                    // passed to reviews component\r\n                    reviewsData.value = {\r\n                        percent: `<b>${thisShip.reviewsPercent}% Recommended</b>`,\r\n                        count: `<b>${thisShip.reviewsCount} Review${getPlural(thisShip.reviewsCount)}</b>`\r\n                    };\r\n                }\r\n\r\n                isReady.value = true;\r\n\r\n                nextTick(() => {\r\n                    enableHearts(shipPageRef.value);\r\n                });\r\n\r\n            } else {\r\n                redirectOnError();\r\n            }\r\n        }, () => redirectOnError());\r\n    }\r\n\r\n    function redirectOnError(): void {\r\n        toastError(\"Error retrieving data\");\r\n        setTimeout(() => { location.href = cobrandLink(`/travel/luxury-cruises`); }, 3000);\r\n    }\r\n\r\n    function showFirstTab(): void {\r\n        const firstTabName = defaultFirstTabName();\r\n        if (firstTabName) {\r\n            showTabBlock.value = true;\r\n            nextTick(() => {\r\n                showTab(firstTabName, true);\r\n            });\r\n        }\r\n    }\r\n\r\n    function showTab(tabName: string, preventJump = false): void {\r\n        document.querySelector(\".tab-nav-container .-active\")?.classList.remove(\"-active\");\r\n        document.querySelector(\".tab-content .-active\")?.classList.remove(\"-active\");\r\n        document.getElementById(`tab-${tabName}`).classList.add(\"-active\");\r\n        document.getElementById(`tc-${tabName}`).classList.add(\"-active\");\r\n\r\n        if (!preventJump) {\r\n            document.getElementById(`tc-${tabName}`)?.scrollIntoView();\r\n        }\r\n    }\r\n\r\n    loadShip();\r\n</script>\r\n","import ShipPageComponent from \"components/products/details/ship-page.vue\";\r\nimport { cobrandLink } from \"virtuoso-shared-web-ui\";\r\nimport { createApp } from \"vue\";\r\nimport { mountApp } from \"vue-app\";\r\n\r\n\r\nif (window.VIRTUOSO.shipId) {\r\n    const app = createApp(ShipPageComponent,\r\n        {\r\n            shipId: window.VIRTUOSO.shipId\r\n        });\r\n    mountApp(app, \"page-app\");\r\n\r\n} else {\r\n    console.error(\"Ship ID not provided\");\r\n    location.href = cobrandLink(`/travel/luxury-cruises/`);\r\n}\r\n"],"names":["shipFeatureIconMap","props","__props","advisorCatalogLink","cobrandLink","brandUrl","ref","findAnAdvisorLabel","isCobranded","heartableUrl","isReady","logoUrl","productCardCollection","reviewsData","ship","shipPageRef","useTemplateRef","showShipInfo","showTabBlock","defaultFirstTabName","loadShip","getShipDetails","resultShip","thisShip","getCmsContent","cmsJSON","baseImageUrl","getSupplierDetails","supplierJSON","galleryImages","hydrateImageGallery","_a","theItems","item","sanitizeUserGeneratedContent","_b","sailingCards","ProductType","productQuery","getProductCards","prods","getViewAllLabel","showFirstTab","slugify","getPlural","nextTick","enableHearts","redirectOnError","toastError","firstTabName","showTab","tabName","preventJump","_c","app","createApp","ShipPageComponent","mountApp"],"mappings":"kjCAsBU,MAAAA,MAAyB,IAAI,CAC/B,CAAC,4BAAqC,mBAAoB,EAC1D,CAAC,qBAAqC,oBAAoB,EAC1D,CAAC,oBAAqC,YAAoB,EAC1D,CAAC,oCAAqC,YAAoB,EAC1D,CAAC,sBAAqC,aAAoB,EAC1D,CAAC,cAAqC,aAAoB,EAC1D,CAAC,8BAAqC,kBAAoB,EAC1D,CAAC,4BAAqC,gBAAoB,EAC1D,CAAC,uBAAqC,WAAoB,EAC1D,CAAC,kCAAqC,iBAAoB,EAC1D,CAAC,uBAAqC,cAAoB,EAC1D,CAAC,iBAAqC,eAAoB,EAC1D,CAAC,sBAAqC,cAAoB,EAC1D,CAAC,uBAAqC,cAAoB,EAC1D,CAAC,qBAAqC,gBAAoB,EAC1D,CAAC,eAAqC,eAAoB,EAC1D,CAAC,oBAAqC,kBAAoB,EAC1D,CAAC,4BAAqC,cAAoB,EAC1D,CAAC,eAAqC,cAAoB,EAC1D,CAAC,qBAAqC,cAAoB,EAC1D,CAAC,wBAAqC,cAAoB,EAC1D,CAAC,+BAAqC,cAAoB,EAC1D,CAAC,gBAAqC,cAAoB,EAC1D,CAAC,+BAAqC,WAAoB,EAC1D,CAAC,WAAqC,UAAoB,EAC1D,CAAC,6BAAqC,iBAAoB,EAC1D,CAAC,gCAAqC,gBAAoB,EAC1D,CAAC,qBAAqC,WAAoB,EAC1D,CAAC,6BAAqC,mBAAoB,EAC1D,CAAC,oCAAqC,iBAAoB,CAAA,CAC7D,8+DCyFD,MAAMC,EAAQC,EAORC,EAAqBC,EAAY,kBAAkB,EACnDC,EAAWC,EAAI,EAAE,EACjBC,EAAsBC,IAAiB,yBAA2B,wBAClEC,EAAeH,EAAI,EAAE,EACrBI,EAAUJ,EAAI,EAAK,EACnBK,EAAUL,EAAI,EAAE,EAChBM,EAAwBN,EAAkB,CAAA,CAAkB,EAC5DO,EAAcP,EAAI,CAAA,CAAE,EACpBQ,EAAOR,EAAgB,CAAA,CAAgB,EACvCS,EAAcC,EAAe,WAAW,EACxCC,EAAeX,EAAI,EAAK,EACxBY,EAAeZ,EAAI,EAAK,EAE9B,SAASa,GAA8B,CAE/B,OAAAP,EAAsB,MAAM,aAAa,OAClC,WAEPK,EAAa,MACN,YAEPH,EAAK,MAAM,aACJ,aAEPA,EAAK,MAAM,cACJ,aAEPA,EAAK,MAAM,eACJ,eAEPA,EAAK,MAAM,aAAe,EACnB,UAEJ,EACX,CACA,SAASM,GAAiB,CACtBC,GAAepB,EAAM,MAAM,EAAE,KAAMqB,GAAoC,SACnE,GAAIA,GAAcA,EAAW,UAAYA,EAAW,aAAc,CAC9D,MAAMC,EAAuB,CACzB,UAAWD,EAAW,WAAa,KACnC,UAAWA,EAAW,WAAa,KACnC,aAAcA,EAAW,aAAe,GACxC,YAAaA,EAAW,iBAAmB,GAC3C,qBAAsB,GACtB,iBAAkB,GAClB,cAAe,CAAC,EAChB,GAAIA,EAAW,eACf,eAAgBA,EAAW,gBAAkB,KAC7C,eAAgBA,EAAW,eAAiB,GAC5C,aAAcA,EAAW,oBAAsB,EAC/C,eAAgBA,EAAW,yBAA2B,EACtD,aAAcA,EAAW,cAAgB,CAAC,EAC1C,SAAUA,EAAW,SACrB,cAAeA,EAAW,cAAgB,GAC1C,WAAYA,EAAW,uBACvB,aAAcA,EAAW,aACzB,QAASA,EAAW,SAAW,KAC/B,eAAgB,GAChB,kBAAmB,GACnB,aAAcA,EAAW,cAAgB,KACzC,gBAAiBA,EAAW,iBAAmB,IAAA,EAIVE,GAAA,CACrC,aAAc,CAAC,WAAW,EAC1B,MAAO,EACP,MAAO,EACP,aAAc,CACV,0BAA0BD,EAAS,UAAU,IAC7C,kCACJ,CAAA,CACH,EAAE,KAAME,GAAY,CACbA,GAAA,MAAAA,EAAS,SACDd,EAAA,MAASc,EAAQ,CAAC,EAAE,KAAQC,EAAeD,EAAQ,CAAC,EAAE,KAAO,GACzE,EACD,IAAM,CAAA,CAER,EAAE,KAAK,IAAM,CACNd,EAAQ,QAAU,IAClBgB,GAAmBJ,EAAS,UAAU,EAAE,KAAMK,GAAiB,CACvDA,GAAgBA,EAAa,OAC7BjB,EAAQ,MAAQiB,EAAa,aACjC,EACD,IAAM,CAAA,CAER,CACL,CACH,EAID,IAAIC,EAA+B,CAAA,EAUnC,GATIP,EAAW,mBAAqBA,EAAW,kBAAkB,SAC7CO,EAAAC,EAAoBR,EAAW,iBAAiB,EACvDC,EAAA,iBAAmBM,EAAc,CAAC,EAAE,MACpCN,EAAA,qBAAuBM,EAAc,CAAC,EAAE,aAErDN,EAAS,cAAgBM,EAIrBP,EAAW,oBACP,KAAAS,EAAAT,EAAW,sBAAX,YAAAS,EAAgC,QAAS,EAAG,CAC5C,IAAIC,EAAW,GACJV,EAAA,oBAAoB,QAASW,GAAiB,CACrDD,GAAY,OAAOC,CAAI,OAAA,CAC1B,EACQV,EAAA,eAAiB,OAAOS,CAAQ,OAAA,MAEzCT,EAAS,eAAiBW,EAA6BZ,EAAW,oBAAoB,CAAC,CAAC,EAIhG,GAAIA,EAAW,uBACP,KAAAa,EAAAb,EAAW,yBAAX,YAAAa,EAAmC,QAAS,EAAG,CAC/C,IAAIH,EAAW,GACJV,EAAA,uBAAuB,QAASW,GAAiB,CACxDD,GAAY,OAAOC,CAAI,OAAA,CAC1B,EACQV,EAAA,kBAAoB,OAAOS,CAAQ,OAAA,MAE5CT,EAAS,kBAAoBW,EAA6BZ,EAAW,uBAAuB,CAAC,CAAC,EAMtG,MAAMc,EAA6B,CAC/B,aAAc,CAAC,EACf,YAAaC,EAAY,QACzB,YAAajC,EAAY,6CAA6C,mBAAmBkB,EAAW,YAAY,CAAC,UAAU,mBAAmBA,EAAW,QAAQ,CAAC,EAAE,EACpK,YAAa,mBAAA,EAGXgB,EAA6B,CAC/B,UAAW,EACX,eAAgB,CACZ,CACI,SAAU,mBACV,KAAMhB,EAAW,SACjB,SAAU,EACd,CACJ,CAAA,EAGJiB,GAAgBF,EAAY,QAASC,CAAY,EAAE,KAAME,GAAmC,CACxFJ,EAAa,aAAeI,EAAM,aAClCJ,EAAa,YAAcK,GAAgBJ,EAAY,MAAOG,EAAM,aAAcF,EAAa,SAAS,EACxG1B,EAAsB,MAAQwB,EACjBM,GAAA,CAChB,EAGD5B,EAAK,MAAQS,EACAd,EAAA,MAAQ,wDAAwDR,EAAM,MAAM,IAAI0C,EAAQpB,EAAS,QAAQ,CAAC,GAC9GlB,EAAA,MAAQD,EAAY,uCAAuCmB,EAAS,UAAU,IAAIoB,EAAQpB,EAAS,YAAY,CAAC,EAAE,EAC9GN,EAAA,MAAQ,CAAC,EAAEM,EAAS,WAAaA,EAAS,SAAWA,EAAS,cAAgBA,EAAS,iBAEhGA,EAAS,aAAe,IAExBV,EAAY,MAAQ,CAChB,QAAS,MAAMU,EAAS,cAAc,oBACtC,MAAO,MAAMA,EAAS,YAAY,UAAUqB,EAAUrB,EAAS,YAAY,CAAC,MAAA,GAIpFb,EAAQ,MAAQ,GAEhBmC,EAAS,IAAM,CACXC,EAAa/B,EAAY,KAAK,CAAA,CACjC,CAAA,MAGegC,GACpB,EACD,IAAMA,EAAA,CAAiB,CAC9B,CAEA,SAASA,GAAwB,CAC7BC,GAAW,uBAAuB,EAClC,WAAW,IAAM,CAAW,SAAA,KAAO5C,EAAY,wBAAwB,GAAM,GAAI,CACrF,CAEA,SAASsC,GAAqB,CAC1B,MAAMO,EAAe9B,IACjB8B,IACA/B,EAAa,MAAQ,GACrB2B,EAAS,IAAM,CACXK,EAAQD,EAAc,EAAI,CAAA,CAC7B,EAET,CAES,SAAAC,EAAQC,EAAiBC,EAAc,GAAa,YACzDrB,EAAA,SAAS,cAAc,6BAA6B,IAApD,MAAAA,EAAuD,UAAU,OAAO,YACxEI,EAAA,SAAS,cAAc,uBAAuB,IAA9C,MAAAA,EAAiD,UAAU,OAAO,WAClE,SAAS,eAAe,OAAOgB,CAAO,EAAE,EAAE,UAAU,IAAI,SAAS,EACjE,SAAS,eAAe,MAAMA,CAAO,EAAE,EAAE,UAAU,IAAI,SAAS,EAE3DC,IACDC,EAAA,SAAS,eAAe,MAAMF,CAAO,EAAE,IAAvC,MAAAE,EAA0C,gBAElD,CAES,OAAAjC,y4KC5Vb,GAAI,OAAO,SAAS,OAAQ,CACxB,MAAMkC,EAAMC,GAAUC,GAClB,CACI,OAAQ,OAAO,SAAS,MAC5B,CAAA,EACJC,GAASH,EAAK,UAAU,CAE5B,MACI,QAAQ,MAAM,sBAAsB,EAC3B,SAAA,KAAOlD,EAAY,yBAAyB"}