LOADING

document.head.appendChild(style) } function isValidDate(dateString) { const date = new Date(dateString) return !isNaN(date.getTime()) } function insertAfter(newNode, existingNode) { existingNode.parentNode.insertBefore(newNode, existingNode.nextElementSibling) } function awaitForDomElements(selector, timeout = 0) { // logger.log('awaiting for ', selector, timeout ? ` during ${timeout}ms` : ' indefinitely') return new Promise((resolve, reject) => { const elements = document.querySelector(selector) if (elements) resolve(elements) //check if element already exists in the DOM // Create a MutationObserver to observe the DOM const observer = new MutationObserver(mutations => { for (const mutation of mutations) { if (mutation.type === 'childList') { if (document.querySelector(selector)) { resolve(document.querySelector(selector)) observer.disconnect() } } } }) // Start observing the document body for added child nodes observer.observe(document.body, { childList: true, subtree: true, }) if (timeout !== 0) { setTimeout(() => { observer.disconnect() reject(new Error('Element with selector ' + selector + ' not found within ' + timeout + 'ms')) }, timeout) } }) } // *** awaitForFunctionDefinition Promise *** // const awaitForFunctionDefinition = (funcName, timeout = 15000) => { return new Promise((resolve, reject) => { let intervalId // Interval to check if the function is defined intervalId = setInterval(() => { if (typeof window[funcName] === 'function') { clearInterval(intervalId) // Clear the interval resolve(funcName + ' is defined within ' + timeout + 'ms') } }, 500) // Check every 0.5 second // Timeout to stop checking after the specified time setTimeout(() => { clearInterval(intervalId) // Clear the interval if (typeof window[funcName] !== 'function') { reject(new Error(funcName + ' was not defined within ' + timeout + 'ms')) } }, timeout) }) } // *** awaitForVariableDefinition Promise *** // function awaitForVariableDefinition(variableName, timeout = 10000) { return new Promise((resolve, reject) => { let intervalId // Interval to check if the variable is defined intervalId = setInterval(() => { if (typeof window[variableName] !== 'undefined') { clearInterval(intervalId) resolve(variableName + 'is defined within ' + timeout + 'ms') } }, 1000) // Timeout to stop checking after the specified time setTimeout(() => { clearInterval(intervalId) if (typeof window[variableName] === 'undefined') { reject(new Error(variableName + ' was not defined within ' + timeout + 'ms')) } }, timeout) }) } customSnippetCode() })()
document.head.appendChild(style) } function isValidDate(dateString) { const date = new Date(dateString) return !isNaN(date.getTime()) } function insertAfter(newNode, existingNode) { existingNode.parentNode.insertBefore(newNode, existingNode.nextElementSibling) } function awaitForDomElements(selector, timeout = 0) { // logger.log('awaiting for ', selector, timeout ? ` during ${timeout}ms` : ' indefinitely') return new Promise((resolve, reject) => { const elements = document.querySelectorAll(selector) if (elements) resolve(elements) //check if element already exists in the DOM // Create a MutationObserver to observe the DOM const observer = new MutationObserver(mutations => { for (const mutation of mutations) { if (mutation.type === 'childList') { if (document.querySelectorAll(selector)) { resolve(document.querySelectorAll(selector)) observer.disconnect() } } } }) // Start observing the document body for added child nodes observer.observe(document.body, { childList: true, subtree: true, }) if (timeout !== 0) { setTimeout(() => { observer.disconnect() reject(new Error('Element with selector ' + selector + ' not found within ' + timeout + 'ms')) }, timeout) } }) } // *** awaitForFunctionDefinition Promise *** // const awaitForFunctionDefinition = (funcName, timeout = 15000) => { return new Promise((resolve, reject) => { let intervalId // Interval to check if the function is defined intervalId = setInterval(() => { if (typeof window[funcName] === 'function') { clearInterval(intervalId) // Clear the interval resolve(funcName + ' is defined within ' + timeout + 'ms') } }, 500) // Check every 0.5 second // Timeout to stop checking after the specified time setTimeout(() => { clearInterval(intervalId) // Clear the interval if (typeof window[funcName] !== 'function') { reject(new Error(funcName + ' was not defined within ' + timeout + 'ms')) } }, timeout) }) } // *** awaitForVariableDefinition Promise *** // function awaitForVariableDefinition(variableName, timeout = 10000) { return new Promise((resolve, reject) => { let intervalId // Interval to check if the variable is defined intervalId = setInterval(() => { if (typeof window[variableName] !== 'undefined') { clearInterval(intervalId) resolve(variableName + 'is defined within ' + timeout + 'ms') } }, 1000) // Timeout to stop checking after the specified time setTimeout(() => { clearInterval(intervalId) if (typeof window[variableName] === 'undefined') { reject(new Error(variableName + ' was not defined within ' + timeout + 'ms')) } }, timeout) }) } // *** awaitForContentTeamDevTK Load Promise *** // ;(function awaitForContentTeamDevTK(timeout = 10000) { return new Promise((resolve, reject) => { const intervalId = setInterval(() => window._CtDevTk && (clearInterval(intervalId), resolve(window._CtDevTk)), 500) setTimeout(() => (clearInterval(intervalId), reject(new Error('_CtDevTk was not defined within ' + timeout + 'ms'))), timeout) }) })() .then(customSnippetCode) .catch(error => console.error('>>>', error)) })()
Serene Clear Cocoa Beach, Cape Canaveral, Florida
Serene Clear Cocoa Beach, Cape Canaveral, Florida

CRUISE FROM
PORT CANAVERAL

The next Icon of Vacations℠ sails from Port Canaveral — launching your family adventures into a new stratosphere. Blast off for discovery at the Kennedy Space Center, swim with manatees, go museum hopping, or explore world-famous theme parks in Orlando, just a short drive away.

EXPLORE CRUISES FROM PORT CANAVERAL

Mother and Daughter at Thrill Water Park
Mother and Daughter at Thrill Water Park

PERFECT DAY
ADVENTURES

With stops at Perfect Day at CocoCay on every sailing, the best family vacation in the world extends from the ship to our award-winning private island. It’s 20 total waterslides onboard and on shore. Luxurious lounging at Coco Beach Club®. And party-pumping beats at the adults-only Hideaway Beach℠.

EXPLORE PERFECT DAY AT COCOCAY

family splashing jumping waters edge pool star of the seas
family splashing jumping waters edge pool star of the seas

VACATION LIKE AN ICON

star of the seas aerial angle aft night
star of the seas aerial angle aft night
document.head.appendChild(style) } function isValidDate(dateString) { const date = new Date(dateString) return !isNaN(date.getTime()) } function insertAfter(newNode, existingNode) { existingNode.parentNode.insertBefore(newNode, existingNode.nextElementSibling) } function awaitForDomElements(selector, timeout = 0) { // logger.log('awaiting for ', selector, timeout ? ` during ${timeout}ms` : ' indefinitely') return new Promise((resolve, reject) => { const element = document.querySelector(selector) if (element) resolve(element) //check if element already exists in the DOM // Create a MutationObserver to observe the DOM const observer = new MutationObserver(mutations => { for (const mutation of mutations) { if (mutation.type === 'childList') { if (document.querySelector(selector)) { resolve(document.querySelector(selector)) observer.disconnect() } } } }) // Start observing the document body for added child nodes observer.observe(document.body, { childList: true, subtree: true, }) if (timeout !== 0) { setTimeout(() => { observer.disconnect() reject(new Error('Element with selector ' + selector + ' not found within ' + timeout + 'ms')) }, timeout) } }) } // *** awaitForFunctionDefinition Promise *** // const awaitForFunctionDefinition = (funcName, timeout = 15000) => { return new Promise((resolve, reject) => { let intervalId // Interval to check if the function is defined intervalId = setInterval(() => { if (typeof window[funcName] === 'function') { clearInterval(intervalId) // Clear the interval resolve(funcName + ' is defined within ' + timeout + 'ms') } }, 500) // Check every 0.5 second // Timeout to stop checking after the specified time setTimeout(() => { clearInterval(intervalId) // Clear the interval if (typeof window[funcName] !== 'function') { reject(new Error(funcName + ' was not defined within ' + timeout + 'ms')) } }, timeout) }) } // *** awaitForVariableDefinition Promise *** // function awaitForVariableDefinition(variableName, timeout = 10000) { return new Promise((resolve, reject) => { let intervalId // Interval to check if the variable is defined intervalId = setInterval(() => { if (typeof window[variableName] !== 'undefined') { clearInterval(intervalId) resolve(variableName + 'is defined within ' + timeout + 'ms') } }, 1000) // Timeout to stop checking after the specified time setTimeout(() => { clearInterval(intervalId) if (typeof window[variableName] === 'undefined') { reject(new Error(variableName + ' was not defined within ' + timeout + 'ms')) } }, timeout) }) } customSnippetCode() })()

WHAT TO KNOW
BEFORE YOU GO
Star of the Seas® is Orlando’s best family vacation.

The next Icon of Vacations℠, Star of the Seas℠, sails weeklong getaways from Orlando, Florida beginning Summer 2025 from Port Canaveral. Whether your ideal beach getaway involves larger-than-life thrills or unwinding at a peaceful waterfront chill spot, you’ll find it at our award-winning private island Perfect Day at CocoCay. So take your pick from Eastern to Western Caribbean and wander for a weeklong onboard the best family vacation in the world.

document.head.appendChild(style) } function isValidDate(dateString) { const date = new Date(dateString) return !isNaN(date.getTime()) } function insertAfter(newNode, existingNode) { existingNode.parentNode.insertBefore(newNode, existingNode.nextElementSibling) } function awaitForDomElements(selector, timeout = 0) { // logger.log('awaiting for ', selector, timeout ? ` during ${timeout}ms` : ' indefinitely') return new Promise((resolve, reject) => { const elements = document.querySelector(selector) if (elements) resolve(elements) //check if element already exists in the DOM // Create a MutationObserver to observe the DOM const observer = new MutationObserver(mutations => { for (const mutation of mutations) { if (mutation.type === 'childList') { if (document.querySelector(selector)) { resolve(document.querySelector(selector)) observer.disconnect() } } } }) // Start observing the document body for added child nodes observer.observe(document.body, { childList: true, subtree: true, }) if (timeout !== 0) { setTimeout(() => { observer.disconnect() reject(new Error('Element with selector ' + selector + ' not found within ' + timeout + 'ms')) }, timeout) } }) } // *** awaitForFunctionDefinition Promise *** // const awaitForFunctionDefinition = (funcName, timeout = 15000) => { return new Promise((resolve, reject) => { let intervalId // Interval to check if the function is defined intervalId = setInterval(() => { if (typeof window[funcName] === 'function') { clearInterval(intervalId) // Clear the interval resolve(funcName + ' is defined within ' + timeout + 'ms') } }, 500) // Check every 0.5 second // Timeout to stop checking after the specified time setTimeout(() => { clearInterval(intervalId) // Clear the interval if (typeof window[funcName] !== 'function') { reject(new Error(funcName + ' was not defined within ' + timeout + 'ms')) } }, timeout) }) } // *** awaitForVariableDefinition Promise *** // function awaitForVariableDefinition(variableName, timeout = 10000) { return new Promise((resolve, reject) => { let intervalId // Interval to check if the variable is defined intervalId = setInterval(() => { if (typeof window[variableName] !== 'undefined') { clearInterval(intervalId) resolve(variableName + 'is defined within ' + timeout + 'ms') } }, 1000) // Timeout to stop checking after the specified time setTimeout(() => { clearInterval(intervalId) if (typeof window[variableName] === 'undefined') { reject(new Error(variableName + ' was not defined within ' + timeout + 'ms')) } }, timeout) }) } customSnippetCode() })()

Previewing: Promo Dashboard Campaigns

My Personas

code: