{"id":4439,"date":"2026-03-12T18:12:46","date_gmt":"2026-03-12T23:12:46","guid":{"rendered":"https:\/\/spacejourney.app\/itinerary-planner\/"},"modified":"2026-06-05T21:39:10","modified_gmt":"2026-06-06T02:39:10","slug":"itinerary-planner","status":"publish","type":"page","link":"https:\/\/spacejourney.app\/en\/itinerary-planner\/","title":{"rendered":"Itinerary Planner"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4439\" class=\"elementor elementor-4439 elementor-1837\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-87cbee1 e-flex e-con-boxed e-con e-parent\" data-id=\"87cbee1\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;video&quot;,&quot;background_video_link&quot;:&quot;https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/24s-Arture-Travel-Video-General-Background.mp4&quot;,&quot;background_play_on_mobile&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-background-video-container\">\n\t\t\t\t\t\t\t<video class=\"elementor-background-video-hosted\" role=\"presentation\" autoplay muted playsinline loop><\/video>\n\t\t\t\t\t<\/div>\t\t<div class=\"elementor-element elementor-element-f979598 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"f979598\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;_animation_delay&quot;:200}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Itinerary Planner<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c799ca1 elementor-widget elementor-widget-text-editor\" data-id=\"c799ca1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Design your perfect adventure in minutes. Add exclusive experiences, organize your days and export the route to your Calendar. Free and stress-free.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3c472f0 e-con-full e-flex e-con e-child\" data-id=\"3c472f0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2714e34 elementor-align-center elementor-mobile-align-center elementor-widget elementor-widget-button\" data-id=\"2714e34\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm elementor-animation-bob\" href=\"#planifica-tu-viaje\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Start planning<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-19e4b01 elementor-align-center elementor-mobile-align-center elementor-widget elementor-widget-button\" data-id=\"19e4b01\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm elementor-animation-bob\" href=\"https:\/\/spacejourney.app\/en\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Platform for travelers<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1f50847 e-flex e-con-boxed e-con e-parent\" data-id=\"1f50847\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;shape_divider_top&quot;:&quot;split&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-shape elementor-shape-top\" aria-hidden=\"true\" data-negative=\"false\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1000 20\" preserveAspectRatio=\"none\">\n\t<path class=\"elementor-shape-fill\" d=\"M0,0v3c0,0,393.8,0,483.4,0c9.2,0,16.6,7.4,16.6,16.6c0-9.1,7.4-16.6,16.6-16.6C606.2,3,1000,3,1000,3V0H0z\"\/>\n<\/svg>\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1cd1e21 elementor-widget elementor-widget-spacer\" data-id=\"1cd1e21\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"planifica-tu-viaje\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3c18922 elementor-widget elementor-widget-shortcode\" data-id=\"3c18922\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">        <!-- Inyectamos CDN directamente para evitar bloqueos del Theme\/Plugins -->\r\n        <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/sortablejs@latest\/Sortable.min.js\"><\/script>\r\n        <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/sweetalert2@11\"><\/script>\r\n\r\n        <!-- CSS del Itinerario (Estilo Solarpunk Premium V2.0) -->\r\n        <style>\r\n            \/* \u2500\u2500 CSS ISOLATION: scoped to #sjItineraryApp \u2500\u2500 *\/\r\n            #sjItineraryApp {\r\n                font-family: 'Outfit', sans-serif;\r\n                box-sizing: border-box;\r\n            }\r\n\r\n            #sjItineraryApp * {\r\n                box-sizing: border-box;\r\n            }\r\n\r\n            :root {\r\n                --sj-primary: #193B33;\r\n                \/* Verde oscuro Space Journey *\/\r\n                --sj-accent: #E5C07B;\r\n                \/* Dorado Space Journey *\/\r\n                --sj-bg: #F4F1EA;\r\n                \/* Arena claro *\/\r\n                --sj-card: #FFFFFF;\r\n                --sj-text: #193B33;\r\n                --sj-text-muted: #57736b;\r\n                --sj-border: rgba(25, 59, 51, 0.08) !important;\r\n                --sj-shadow: 0 4px 12px rgba(25, 59, 51, 0.04);\r\n                --sj-shadow-hover: 0 8px 24px rgba(25, 59, 51, 0.08);\r\n            }\r\n\r\n            #sjItineraryApp .sj-itinerary-wrapper {\r\n                font-family: 'Inter', sans-serif !important;\r\n                display: flex !important;\r\n                flex-direction: column;\r\n                gap: 20px;\r\n                max-width: 1200px;\r\n                margin: 0 auto;\r\n                background: rgba(255, 255, 255, 0.15) !important;\r\n                backdrop-filter: blur(12px);\r\n                -webkit-backdrop-filter: blur(12px);\r\n                border: 1px solid rgba(255, 255, 255, 0.2) !important;\r\n                border-radius: 16px !important;\r\n                min-height: 80vh;\r\n                padding: 25px !important;\r\n                box-shadow: 0 8px 32px 0 rgba(25, 59, 51, 0.05) !important;\r\n            }\r\n\r\n            \/* HEADER DEL CONSTRUCTOR *\/\r\n            #sjItineraryApp .sj-itinerary-header {\r\n                display: flex !important;\r\n                justify-content: space-between;\r\n                align-items: center;\r\n                flex-wrap: wrap;\r\n                gap: 20px;\r\n                width: 100%;\r\n                margin-bottom: 25px;\r\n                \/* Separaci\u00f3n extra debajo del header *\/\r\n            }\r\n\r\n            #sjItineraryApp .sj-trip-banner {\r\n                width: 100%;\r\n                height: 200px;\r\n                border-radius: 16px;\r\n                background-color: rgba(25, 59, 51, 0.05);\r\n                background-size: cover;\r\n                background-position: center;\r\n                display: flex;\r\n                align-items: flex-end;\r\n                padding: 30px;\r\n                box-sizing: border-box;\r\n                position: relative;\r\n                margin-bottom: 30px;\r\n                border: 1px solid var(--sj-border);\r\n            }\r\n\r\n            #sjItineraryApp .sj-trip-banner-content {\r\n                background: rgba(255, 255, 255, 0.85);\r\n                backdrop-filter: blur(10px);\r\n                padding: 15px 25px;\r\n                border-radius: 12px;\r\n                max-width: 100%;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-link {\r\n                background: none;\r\n                border: none;\r\n                cursor: pointer;\r\n                padding: 0;\r\n                margin: 0;\r\n                display: inline-flex;\r\n                align-items: center;\r\n                gap: 5px;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-link:hover {\r\n                color: var(--sj-primary) !important;\r\n                text-decoration: underline;\r\n            }\r\n\r\n            #sjItineraryApp .sj-trip-title-row .sj-trip-input {\r\n                flex-grow: 1;\r\n                min-width: 0;\r\n            }\r\n\r\n            #sjItineraryApp .sj-trip-input {\r\n                width: 100%;\r\n                height: 42px;\r\n                padding: 0 16px !important;\r\n                border: 1px solid rgba(25, 59, 51, 0.15) !important;\r\n                border-radius: 30px !important;\r\n                font-family: inherit !important;\r\n                font-size: 15px;\r\n                color: var(--sj-primary) !important;\r\n                background: #ffffff !important;\r\n                transition: all 0.2s ease;\r\n                box-sizing: border-box;\r\n            }\r\n\r\n            #sjItineraryApp select.sj-trip-input {\r\n                appearance: none !important;\r\n                background-image: url(\"data:image\/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23193B33%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E\");\r\n                background-repeat: no-repeat;\r\n                background-position: right 16px top 50%;\r\n                background-size: 12px auto;\r\n                padding-right: 40px !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-trip-input:focus {\r\n                border-color: var(--sj-primary) !important;\r\n                box-shadow: 0 0 0 3px rgba(25, 59, 51, 0.08) !important;\r\n                outline: none;\r\n            }\r\n\r\n            \/* GRID DE ACCIONES Y CONTENEDORES *\/\r\n            #sjItineraryApp .sj-itinerary-actions-grid {\r\n                display: flex !important;\r\n                flex-direction: column !important;\r\n                gap: 12px;\r\n                width: 100%;\r\n                max-width: 480px;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-row {\r\n                display: flex !important;\r\n                gap: 12px;\r\n                width: 100%;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-row .sj-btn {\r\n                flex: 1 1 0px;\r\n                justify-content: center;\r\n            }\r\n\r\n            \/* BOTONES PILL-SHAPED (Afecta App y Modal de SweetAlert) *\/\r\n            #sjItineraryApp .sj-btn,\r\n            .swal2-popup .sj-btn {\r\n                -webkit-appearance: none !important;\r\n                appearance: none !important;\r\n                height: 42px;\r\n                padding: 0 24px !important;\r\n                border-radius: 30px !important;\r\n                cursor: pointer;\r\n                font-weight: 700;\r\n                font-size: 14px;\r\n                font-family: 'Outfit', sans-serif !important;\r\n                transition: all 0.3s cubic-bezier(0.165, 0.84, 0.44, 1);\r\n                display: inline-flex;\r\n                align-items: center;\r\n                justify-content: center;\r\n                gap: 8px;\r\n                box-sizing: border-box;\r\n                text-decoration: none;\r\n                white-space: nowrap;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-primary,\r\n            .swal2-popup .sj-btn-primary {\r\n                background: linear-gradient(135deg, #AEE2E3, #8FD14F) !important;\r\n                color: #112F24 !important;\r\n                border: none !important;\r\n                box-shadow: 0 4px 12px rgba(143, 209, 79, 0.2) !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-primary:hover,\r\n            .swal2-popup .sj-btn-primary:hover {\r\n                opacity: 0.95 !important;\r\n                transform: translateY(-2px);\r\n                box-shadow: 0 6px 20px rgba(143, 209, 79, 0.35) !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-gold,\r\n            .swal2-popup .sj-btn-gold {\r\n                background: linear-gradient(135deg, #F3D287, #E5C07B) !important;\r\n                color: #193B33 !important;\r\n                border: none !important;\r\n                box-shadow: 0 4px 12px rgba(229, 192, 123, 0.2) !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-gold:hover,\r\n            .swal2-popup .sj-btn-gold:hover {\r\n                opacity: 0.95 !important;\r\n                transform: translateY(-2px);\r\n                box-shadow: 0 6px 20px rgba(229, 192, 123, 0.35) !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-secondary,\r\n            .swal2-popup .sj-btn-secondary {\r\n                background: transparent !important;\r\n                color: var(--sj-primary) !important;\r\n                border: 2px solid var(--sj-primary) !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-secondary:hover,\r\n            .swal2-popup .sj-btn-secondary:hover {\r\n                background: rgba(25, 59, 51, 0.05) !important;\r\n                transform: translateY(-2px);\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-accent,\r\n            .swal2-popup .sj-btn-accent {\r\n                background: transparent !important;\r\n                color: #c2410c !important;\r\n                border: 2px solid #E5C07B !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-accent:hover,\r\n            .swal2-popup .sj-btn-accent:hover {\r\n                background: rgba(229, 192, 123, 0.08) !important;\r\n                transform: translateY(-2px);\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-danger,\r\n            .swal2-popup .sj-btn-danger {\r\n                background: transparent !important;\r\n                color: #ff4d4d !important;\r\n                border: 2px solid #ff4d4d !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-danger:hover,\r\n            .swal2-popup .sj-btn-danger:hover {\r\n                background: rgba(255, 77, 77, 0.04) !important;\r\n                transform: translateY(-1px);\r\n            }\r\n\r\n            \/* Bot\u00f3n de Icono Fijo (No se estira en m\u00f3viles) *\/\r\n            #sjItineraryApp .sj-btn-icon-only,\r\n            .swal2-popup .sj-btn-icon-only {\r\n                width: 42px !important;\r\n                height: 42px !important;\r\n                min-width: 42px !important;\r\n                padding: 0 !important;\r\n                flex-shrink: 0 !important;\r\n                justify-content: center;\r\n                border-radius: 50% !important;\r\n            }\r\n\r\n            \/* Enlace de peligro *\/\r\n            #sjItineraryApp .sj-btn-link-danger {\r\n                background: transparent !important;\r\n                border: none !important;\r\n                color: #ff4d4d !important;\r\n                cursor: pointer;\r\n                font-size: 13px;\r\n                font-weight: 700;\r\n                text-align: center;\r\n                padding: 8px;\r\n                text-decoration: underline;\r\n            }\r\n\r\n            #sjItineraryApp .sj-btn-link-danger:hover {\r\n                color: #cc0000 !important;\r\n            }\r\n\r\n            \/* ESTADO CERO (Zero-State) *\/\r\n            #sjItineraryApp .sj-zero-state {\r\n                display: flex;\r\n                flex-direction: column;\r\n                align-items: center;\r\n                justify-content: center;\r\n                padding: 60px 20px;\r\n                text-align: center;\r\n                background: rgba(255, 255, 255, 0.4);\r\n                border-radius: 16px;\r\n                border: 2px dashed rgba(25, 59, 51, 0.2);\r\n                margin: 40px auto;\r\n                max-width: 600px;\r\n                width: 100%;\r\n            }\r\n\r\n            #sjItineraryApp .sj-zero-state h3 {\r\n                font-family: 'Outfit', sans-serif;\r\n                color: var(--sj-primary);\r\n                margin-bottom: 12px;\r\n                font-size: 24px;\r\n                font-weight: 700;\r\n            }\r\n\r\n            #sjItineraryApp .sj-zero-state p {\r\n                color: var(--sj-text-muted);\r\n                margin-bottom: 24px;\r\n                font-size: 16px;\r\n                max-width: 400px;\r\n            }\r\n\r\n            \/* DISE\u00d1O DE COLUMNAS (D\u00cdAS) *\/\r\n            #sjItineraryApp .sj-days-container {\r\n                display: flex !important;\r\n                gap: 24px;\r\n                overflow-x: auto;\r\n                padding: 12px 4px 24px 4px !important;\r\n                align-items: flex-start;\r\n                scrollbar-width: thin;\r\n                scrollbar-color: rgba(25, 59, 51, 0.2) transparent !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-days-container::-webkit-scrollbar {\r\n                height: 6px;\r\n            }\r\n\r\n            #sjItineraryApp .sj-days-container::-webkit-scrollbar-thumb {\r\n                background-color: rgba(25, 59, 51, 0.2) !important;\r\n                border-radius: 3px !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-day-column {\r\n                background: rgba(255, 255, 255, 0.45) !important;\r\n                \/* Glassmorphism soft but visible *\/\r\n                backdrop-filter: blur(12px);\r\n                -webkit-backdrop-filter: blur(12px);\r\n                border: 1.5px solid rgba(255, 255, 255, 0.45) !important;\r\n                border-radius: 16px !important;\r\n                min-width: 310px;\r\n                max-width: 310px;\r\n                display: flex !important;\r\n                flex-direction: column !important;\r\n                flex-shrink: 0;\r\n                box-shadow: 0 8px 32px 0 rgba(25, 59, 51, 0.06) !important;\r\n                transition: all 0.3s ease;\r\n            }\r\n\r\n            #sjItineraryApp .sj-day-column:hover {\r\n                box-shadow: var(--sj-shadow-hover) !important;\r\n                border-color: rgba(25, 59, 51, 0.12) !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-day-header {\r\n                padding: 16px 20px !important;\r\n                background: transparent !important;\r\n                \/* Soft background *\/\r\n                border-bottom: 2px dashed rgba(25, 59, 51, 0.08);\r\n                color: var(--sj-primary) !important;\r\n                border-radius: 16px 16px 0 0 !important;\r\n                font-family: 'Outfit', sans-serif !important;\r\n                font-weight: 700;\r\n                font-size: 17px;\r\n                display: flex !important;\r\n                justify-content: space-between;\r\n                align-items: center;\r\n            }\r\n\r\n            #sjItineraryApp .sj-day-header .dashicons-trash {\r\n                opacity: 0.6;\r\n                color: var(--sj-text-muted) !important;\r\n                transition: all 0.2s ease;\r\n                font-size: 18px;\r\n                width: 18px;\r\n                height: 18px;\r\n                cursor: pointer;\r\n            }\r\n\r\n            #sjItineraryApp .sj-day-header .dashicons-trash:hover {\r\n                opacity: 1;\r\n                color: #ff4d4d !important;\r\n                transform: scale(1.1);\r\n            }\r\n\r\n            #sjItineraryApp .sj-dropzone {\r\n                padding: 16px !important;\r\n                min-height: 160px;\r\n                display: flex !important;\r\n                flex-direction: column !important;\r\n                gap: 12px;\r\n            }\r\n\r\n            \/* TARJETAS (CARTAS) *\/\r\n            #sjItineraryApp .sj-card-item {\r\n                background: rgba(255, 255, 255, 0.65) !important;\r\n                backdrop-filter: blur(4px);\r\n                -webkit-backdrop-filter: blur(4px);\r\n                border: 1px solid rgba(255, 255, 255, 0.55) !important;\r\n                border-radius: 12px !important;\r\n                padding: 14px 16px !important;\r\n                box-shadow: 0 4px 12px 0 rgba(25, 59, 51, 0.04) !important;\r\n                cursor: grab;\r\n                display: flex !important;\r\n                justify-content: space-between;\r\n                align-items: center;\r\n                position: relative;\r\n                transition: all 0.3s cubic-bezier(0.165, 0.84, 0.44, 1);\r\n            }\r\n\r\n            #sjItineraryApp .sj-card-item:hover {\r\n                transform: translateY(-3px);\r\n                box-shadow: 0 8px 24px rgba(25, 59, 51, 0.08) !important;\r\n                border-color: var(--sj-accent) !important;\r\n                \/* Soft gold glow *\/\r\n            }\r\n\r\n            #sjItineraryApp .sj-card-item:active {\r\n                cursor: grabbing;\r\n            }\r\n\r\n            #sjItineraryApp .sj-card-handle {\r\n                color: #a3b8b0 !important;\r\n                margin-right: 10px;\r\n                cursor: grab;\r\n                display: flex !important;\r\n                align-items: center;\r\n            }\r\n\r\n            #sjItineraryApp .sj-card-content {\r\n                flex-grow: 1;\r\n                min-width: 0;\r\n            }\r\n\r\n            #sjItineraryApp .sj-card-title {\r\n                font-weight: 600;\r\n                color: var(--sj-primary) !important;\r\n                margin: 0 0 5px 0;\r\n                outline: none;\r\n                font-size: 14.5px;\r\n            }\r\n\r\n            #sjItineraryApp .sj-card-actions {\r\n                display: flex !important;\r\n                align-items: center;\r\n                gap: 12px;\r\n                flex-shrink: 0;\r\n                margin-left: 12px;\r\n            }\r\n\r\n            #sjItineraryApp .sj-card-actions .dashicons {\r\n                cursor: pointer;\r\n                font-size: 20px;\r\n                width: 20px;\r\n                height: 20px;\r\n                transition: all 0.2s ease;\r\n            }\r\n\r\n            #sjItineraryApp .sj-card-actions .dashicons-clock {\r\n                color: var(--sj-text-muted) !important;\r\n                opacity: 0.7;\r\n            }\r\n\r\n            #sjItineraryApp .sj-card-actions .dashicons-clock:hover {\r\n                color: var(--sj-primary) !important;\r\n                opacity: 1;\r\n                transform: scale(1.1);\r\n            }\r\n\r\n            #sjItineraryApp .sj-card-actions .dashicons-trash {\r\n                color: #ff4d4d !important;\r\n                opacity: 0.8;\r\n            }\r\n\r\n            #sjItineraryApp .sj-card-actions .dashicons-trash:hover {\r\n                color: #d32f2f !important;\r\n                opacity: 1;\r\n                transform: scale(1.1);\r\n            }\r\n\r\n            \/* Sparkle Upsell *\/\r\n            #sjItineraryApp .sj-sparkle-hint {\r\n                font-size: 11px;\r\n                color: #d97706 !important;\r\n                background: #fef3c7 !important;\r\n                padding: 3px 8px !important;\r\n                border-radius: 6px !important;\r\n                display: inline-block !important;\r\n                margin-top: 6px;\r\n                cursor: pointer;\r\n                font-weight: 600;\r\n                transition: all 0.2s;\r\n            }\r\n\r\n            #sjItineraryApp .sj-sparkle-hint:hover {\r\n                background: #fde68a !important;\r\n            }\r\n\r\n            \/* Time Badges *\/\r\n            #sjItineraryApp .sj-time-badge {\r\n                font-size: 10px;\r\n                padding: 2px 6px !important;\r\n                border-radius: 4px !important;\r\n                display: inline-block !important;\r\n                margin-top: 6px;\r\n                font-weight: 600;\r\n            }\r\n\r\n            #sjItineraryApp .sj-time-morning {\r\n                background: #e0f2fe !important;\r\n                color: #0369a1 !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-time-afternoon {\r\n                background: #ffedd5 !important;\r\n                color: #c2410c !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-time-night {\r\n                background: #ede9fe !important;\r\n                color: #5b21b6 !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-time-exact {\r\n                background: #e2e8f0 !important;\r\n                color: #334155 !important;\r\n            }\r\n\r\n            \/* ESTADO \"GHOST\" CUANDO SE ARRASTRA *\/\r\n            #sjItineraryApp .sortable-ghost {\r\n                opacity: 0.3;\r\n                background: rgba(229, 192, 123, 0.05) !important;\r\n                border: 2px dashed var(--sj-accent) !important;\r\n                box-shadow: none !important;\r\n            }\r\n\r\n            \/* A\u00d1ADIR NUEVA TARJETA *\/\r\n            #sjItineraryApp .sj-add-card-btn {\r\n                background: transparent !important;\r\n                border: 2px dashed rgba(25, 59, 51, 0.15) !important;\r\n                color: var(--sj-text-muted) !important;\r\n                padding: 12px !important;\r\n                text-align: center;\r\n                border-radius: 12px !important;\r\n                cursor: pointer;\r\n                width: calc(100% - 32px);\r\n                margin: 0 16px 16px 16px;\r\n                transition: 0.2s;\r\n                font-weight: 600;\r\n            }\r\n\r\n            #sjItineraryApp .sj-add-card-btn:hover {\r\n                border-color: var(--sj-primary) !important;\r\n                color: var(--sj-primary) !important;\r\n                background: rgba(25, 59, 51, 0.02) !important;\r\n            }\r\n\r\n            \/* COLUMNA FANTASMA A\u00d1ADIR D\u00cdA AL FINAL *\/\r\n            #sjItineraryApp .sj-day-column-add-placeholder {\r\n                background: rgba(255, 255, 255, 0.4) !important;\r\n                border: 2px dashed rgba(25, 59, 51, 0.2) !important;\r\n                border-radius: 16px !important;\r\n                min-width: 310px;\r\n                max-width: 310px;\r\n                min-height: 200px;\r\n                display: flex !important;\r\n                align-items: center;\r\n                justify-content: center;\r\n                cursor: pointer;\r\n                flex-shrink: 0;\r\n                box-shadow: none !important;\r\n                transition: all 0.3s ease;\r\n            }\r\n\r\n            #sjItineraryApp .sj-day-column-add-placeholder:hover {\r\n                border-color: var(--sj-primary) !important;\r\n                background: rgba(255, 255, 255, 0.75) !important;\r\n                transform: translateY(-3px);\r\n                box-shadow: var(--sj-shadow-hover) !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-day-add-placeholder-content {\r\n                text-align: center;\r\n                color: var(--sj-primary) !important;\r\n                padding: 20px !important;\r\n            }\r\n\r\n            #sjItineraryApp .sj-day-add-placeholder-content .dashicons {\r\n                font-size: 32px;\r\n                width: 32px;\r\n                height: 32px;\r\n                margin-bottom: 8px;\r\n                color: var(--sj-accent) !important;\r\n                transition: transform 0.3s ease;\r\n            }\r\n\r\n            #sjItineraryApp .sj-day-column-add-placeholder:hover .sj-day-add-placeholder-content .dashicons {\r\n                transform: scale(1.15);\r\n            }\r\n\r\n            \/* OVERRIDES SWEETALERT2 (Estilo Solarpunk SJ) *\/\r\n            .swal2-popup .swal2-confirm {\r\n                background: linear-gradient(90deg, #AEE2E3, #8FD14F) !important;\r\n                color: #204035 !important;\r\n                font-weight: bold !important;\r\n                border: none !important;\r\n                border-radius: 30px !important;\r\n                padding: 12px 32px !important;\r\n                box-shadow: none !important;\r\n                transition: opacity 0.3s ease !important;\r\n            }\r\n\r\n            .swal2-popup .swal2-confirm:hover {\r\n                opacity: 0.9 !important;\r\n            }\r\n\r\n            .swal2-popup .swal2-cancel {\r\n                background: linear-gradient(90deg, #F3D287, #E5C07B) !important;\r\n                color: #193B33 !important;\r\n                border: none !important;\r\n                font-weight: bold !important;\r\n                border-radius: 30px !important;\r\n                padding: 12px 32px !important;\r\n                box-shadow: none !important;\r\n                transition: all 0.3s ease !important;\r\n            }\r\n\r\n            .swal2-popup .swal2-cancel:hover {\r\n                opacity: 0.9 !important;\r\n                color: #112F24 !important;\r\n            }\r\n\r\n            .sj-planner-filter-select {\r\n                width: 100%;\r\n                padding: 10px 32px 10px 16px;\r\n                border: 1px solid rgba(25, 59, 51, 0.15);\r\n                border-radius: 20px;\r\n                background-color: #f8fafc;\r\n                color: #193B33;\r\n                font-family: 'Outfit', sans-serif;\r\n                font-weight: 600;\r\n                font-size: 14px;\r\n                margin-bottom: 20px;\r\n                cursor: pointer;\r\n            }\r\n            .sj-planner-filter-select:focus {\r\n                outline: none;\r\n                border-color: #E5C07B;\r\n            }\r\n            \r\n            .sj-upsell-link {\r\n                display: inline-block;\r\n                margin-top: 15px;\r\n                color: #E8C57D;\r\n                background: #193B33;\r\n                padding: 8px 16px;\r\n                border-radius: 20px;\r\n                font-weight: 700;\r\n                text-decoration: none;\r\n                font-size: 14px;\r\n                transition: opacity 0.2s;\r\n            }\r\n            .sj-upsell-link:hover {\r\n                opacity: 0.9;\r\n                color: #FFF;\r\n            }\r\n            .sj-upsell-text {\r\n                font-size: 13px;\r\n                color: #57736b;\r\n                margin-top: 12px;\r\n                display: block;\r\n            }\r\n\r\n            .swal2-popup .sj-swal-upsell-btn {\r\n                background: linear-gradient(90deg, #E8C57D, #D4A373) !important;\r\n                color: #204035 !important;\r\n            }\r\n\r\n            .swal2-popup .swal2-close {\r\n                color: #193B33 !important;\r\n                transition: 0.3s !important;\r\n            }\r\n\r\n            .swal2-popup .swal2-close:hover {\r\n                color: #c2410c !important;\r\n            }\r\n\r\n            .swal2-popup .swal2-input,\r\n            .swal2-popup .swal2-select {\r\n                box-sizing: border-box !important;\r\n                width: 90% !important;\r\n                max-width: 90% !important;\r\n                margin: 1em auto !important;\r\n                border-radius: 30px !important;\r\n            }\r\n\r\n            \/* M\u00d3VILES *\/\r\n            \/* M\u00d3VILES *\/\r\n            @media (max-width: 768px) {\r\n                #sjItineraryApp .sj-itinerary-wrapper {\r\n                    flex-direction: column !important;\r\n                    padding: 24px 16px !important;\r\n                    margin: 0 16px !important;\r\n                    width: auto !important;\r\n                }\r\n\r\n                #sjItineraryApp .sj-itinerary-header {\r\n                    flex-direction: column !important;\r\n                    align-items: flex-start;\r\n                    margin-bottom: 20px;\r\n                }\r\n\r\n                #sjItineraryApp .sj-trip-banner {\r\n                    height: 150px;\r\n                    padding: 15px;\r\n                }\r\n\r\n                #sjItineraryApp .sj-days-container {\r\n                    flex-direction: column !important;\r\n                    overflow-x: visible;\r\n                    gap: 16px;\r\n                    width: 100%;\r\n                }\r\n\r\n                #sjItineraryApp .sj-day-column {\r\n                    min-width: 100%;\r\n                    max-width: 100%;\r\n                }\r\n\r\n                #sjItineraryApp .sj-day-column-add-placeholder {\r\n                    min-width: 100%;\r\n                    max-width: 100%;\r\n                    min-height: 60px !important;\r\n                    border-radius: 30px !important;\r\n                    padding: 10px !important;\r\n                    margin-top: 10px;\r\n                    box-sizing: border-box;\r\n                }\r\n\r\n                \/* Agrupaci\u00f3n de botones en m\u00f3viles *\/\r\n                #sjItineraryApp .sj-header-actions {\r\n                    width: 100%;\r\n                    justify-content: space-between;\r\n                }\r\n\r\n                #sjItineraryApp .sj-header-actions .sj-btn {\r\n                    flex-grow: 1;\r\n                    justify-content: center;\r\n                    padding: 0 10px !important;\r\n                    font-size: 13px;\r\n                }\r\n\r\n                #sjItineraryApp .sj-btn:not(.sj-btn-icon-only):not(.sj-btn-row .sj-btn):not(.sj-header-actions .sj-btn) {\r\n                    width: 100%;\r\n                    justify-content: center;\r\n                }\r\n\r\n                #sjItineraryApp .sj-itinerary-actions-grid {\r\n                    max-width: 100%;\r\n                }\r\n            }\r\n\r\n            \/* SwearAlert Customizations para botones *\/\r\n            .sj-swal-actions {\r\n                gap: 15px;\r\n            }\r\n\r\n            .sj-swal-actions .sj-btn {\r\n                margin: 0 !important;\r\n            }\r\n\r\n            \/* Ajustes espec\u00edficos para m\u00f3viles *\/\r\n            @media (max-width: 768px) {\r\n                #sjItineraryApp .sj-itinerary-header {\r\n                    margin-bottom: 35px;\r\n                    \/* Espacio extra cr\u00edtico debajo de los botones en m\u00f3viles *\/\r\n                }\r\n\r\n                #sjItineraryApp .sj-trip-banner {\r\n                    margin-top: 15px;\r\n                }\r\n            }\r\n        <\/style>\r\n\r\n        <!-- HTML ESTRUCTURA -->\r\n        <div class=\"sj-itinerary-wrapper\" id=\"sjItineraryApp\">\r\n            <div class=\"sj-itinerary-header\">\r\n                <!-- Izquierda: Selector de viajes -->\r\n                <div style=\"display:flex; gap:10px; align-items:center; flex-wrap:nowrap; width:100%; max-width:350px;\">\r\n                    <div style=\"position:relative; flex-grow:1;\">\r\n                        <button id=\"sjBtnMyTrips\" class=\"sj-btn\" onclick=\"sjGoToDashboard()\"\r\n                            style=\"display:none; width:100%; justify-content:space-between; align-items:center; background: rgba(255, 255, 255, 0.7); backdrop-filter: blur(10px); border: 1px solid rgba(229, 192, 123, 0.3); color: var(--sj-text); font-weight:600; padding: 10px 15px; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.05); transition: all 0.3s ease;\">\r\n                            <span style=\"display:flex; align-items:center; gap:5px;\"><span\r\n                                    class=\"dashicons dashicons-location-alt\" style=\"color:var(--sj-primary);\"><\/span>\r\n                                My Trips<\/span>\r\n                            <span class=\"dashicons dashicons-grid-view\"\r\n                                style=\"font-size: 16px; color:var(--sj-primary);\"><\/span>\r\n                        <\/button>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- Derecha: Acciones R\u00e1pidas (PLG) -->\r\n                <div class=\"sj-header-actions\" style=\"display:flex; gap:10px; align-items:center; flex-wrap:wrap;\">\r\n                    <button class=\"sj-btn sj-btn-secondary\" onclick=\"sjCreateNewTrip()\"\r\n                        style=\"border:none; background:transparent; font-weight:600; color:var(--sj-text-muted);\">\r\n                        <span class=\"dashicons dashicons-plus\"><\/span> New Trip                    <\/button>\r\n                    <button class=\"sj-btn sj-btn-secondary\" onclick=\"sjSaveItinerary()\"\r\n                        style=\"border:none; background:transparent; font-weight:600; color:var(--sj-text-muted);\">\r\n                        <span class=\"dashicons dashicons-cloud\"><\/span> Save                    <\/button>\r\n                    <button class=\"sj-btn sj-btn-gold\" onclick=\"sjExportToCalendar()\" style=\"padding:0 20px;\">\r\n                        <span class=\"dashicons dashicons-calendar-alt\"><\/span>\r\n                        Export itinerary                    <\/button>\r\n                    <button class=\"sj-btn sj-btn-primary\" onclick=\"sjShareTrip()\" style=\"padding:0 20px;\">\r\n                        <span class=\"dashicons dashicons-share-alt2\"><\/span> Share my route                    <\/button>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- BANNER DEL VIAJE -->\r\n            <div class=\"sj-trip-banner\" id=\"sjTripBanner\" style=\"display:none;\">\r\n                <div class=\"sj-trip-banner-content\">\r\n                    <h1 id=\"sjTripBannerTitle\"\r\n                        style=\"margin:0; font-size:32px; font-weight:800; color:var(--sj-text); line-height:1.2;\"><\/h1>\r\n                    <div style=\"display:flex; gap:15px; margin-top:15px; align-items:center;\">\r\n                        <button class=\"sj-btn-link\" onclick=\"sjOpenTripSettings()\"\r\n                            style=\"font-weight:600; font-size:14px; color:var(--sj-text-muted);\">\r\n                            <span class=\"dashicons dashicons-admin-generic\"\r\n                                style=\"vertical-align:middle; font-size:16px;\"><\/span>\r\n                            Trip settings                        <\/button>\r\n                        <button class=\"sj-btn sj-btn-secondary\" onclick=\"sjAddDay()\"\r\n                            style=\"height:32px; padding:0 15px; font-size:13px; font-weight:600; border-radius:16px;\">\r\n                            <span class=\"dashicons dashicons-plus-alt2\" style=\"font-size:14px; line-height:1.5;\"><\/span>\r\n                            Add Day                        <\/button>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- Contenedor Horizontal de D\u00edas -->\r\n            <div class=\"sj-days-container\" id=\"sjDaysContainer\">\r\n                <!-- Los d\u00edas se inyectan ac\u00e1 por JS -->\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- EL MOTOR JAVASCRIPT -->\r\n        <script>\r\n            document.addEventListener('DOMContentLoaded', function () {\r\n                \/\/ Esperar a que Sortable cargue (Al usar CDN a veces tarda ms)\r\n                function initApp() {\r\n                    if (typeof Sortable === 'undefined') {\r\n                        setTimeout(initApp, 50);\r\n                        return;\r\n                    }\r\n                    sjForceGlassmorphismAncestors();\r\n                    sjLoadItinerary();\r\n                }\r\n                initApp();\r\n            });\r\n\r\n            \/\/ Forzar transparencia de ancestros para que luzca el Glassmorphism\r\n            function sjForceGlassmorphismAncestors() {\r\n                const app = document.getElementById('sjItineraryApp');\r\n                if (app) {\r\n                    let parent = app.parentElement;\r\n                    while (parent && parent.tagName !== 'BODY') {\r\n                        parent.style.setProperty('background', 'transparent', 'important');\r\n                        parent.style.setProperty('background-color', 'transparent', 'important');\r\n                        parent.style.setProperty('background-image', 'none', 'important');\r\n                        parent.style.setProperty('box-shadow', 'none', 'important');\r\n                        parent = parent.parentElement;\r\n                    }\r\n                }\r\n            }\r\n\r\n            \/\/ 1. EL ESTADO GLOBAL (Memoria de Trabajo)\r\n            let sjState = {\r\n                id: 0, \/\/ 0 = Nuevo. Si > 0 = Cargado de BD\r\n                title: \"New Trip\",\r\n                coverImage: \"\",\r\n                cityId: 0,\r\n                startDate: \"\",\r\n                endDate: \"\",\r\n                days: []\r\n            };\r\n\r\n            const isUserLoggedIn = false;\r\n            const ajaxUrl = 'https:\/\/spacejourney.app\/wp-admin\/admin-ajax.php';\r\n            const securityNonce = 'ae7b0b81e2';\r\n            const userMembershipLevel = 0;\r\n            const sjPlannerExperiences = [{\"city\":\"London\",\"slug\":\"london\",\"constellation\":\"European Constellation\",\"country\":\"Mundo\",\"experiences\":[{\"id\":7625,\"title\":\"The Queen&#8217;s Walk | Thames Walk\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-queens-walk-thames-walk\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/ujiiuat1hz0-300x225.jpg\",\"duration\":\"89\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7627,\"title\":\"Kyoto Garden: The Japanese garden in London\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/kyoto-garden-the-japanese-garden-in-london\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/6d3eaf4d-cdae-41e6-977f-4b96a5c7771b-300x225.jpg\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7629,\"title\":\"Little Venice: The quietest walk through London&#8217;s canals\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/little-venice-the-quietest-walk-through-londons-canals\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/unwohpmx8sw-300x200.jpg\",\"duration\":\"89\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7631,\"title\":\"Barbican Conservatory: London&#8217;s solarpunk oasis\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/barbican-conservatory-londons-solarpunk-oasis\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/a318db16-e725-4f25-bc3b-9ce030769be0-300x225.jpg\",\"duration\":\"60\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7633,\"title\":\"St Dunstan in the East: The Garden Among the Ruins\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/st-dunstan-in-the-east-the-garden-among-the-ruins\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/St-Dunstan-in-the-East-London-Main-Wide-Fotorealistic-300x167.jpg\",\"duration\":\"60\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7615,\"title\":\"Primrose Hill | London skyline\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/primrose-hill-london-skyline\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/wkyfavx8uc8-300x199.jpg\",\"duration\":\"8\",\"xp\":\"200\",\"badge\":\"secret\"},{\"id\":7617,\"title\":\"Sky Garden | The forest in the clouds\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/sky-garden-the-forest-in-the-clouds\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/17c5730f-1332-4381-a173-22a93b96f132-300x154.jpg\",\"duration\":\"6\",\"xp\":\"200\",\"badge\":\"secret\"},{\"id\":7619,\"title\":\"St Katharine Docks | The secret port of Tower Bridge\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/st-katharine-docks-the-secret-port-of-tower-bridge\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/00d818a9-8209-4082-9dec-f51769c2e1bb-300x200.jpg\",\"duration\":\"1245\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7621,\"title\":\"BAPS Shri Swaminarayan Mandir | The hidden Hindu temple\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/baps-shri-swaminarayan-mandir-the-hidden-hindu-temple\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/51998c36-df66-46a3-b778-49ec9832d4d5-300x211.jpg\",\"duration\":\"120\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7623,\"title\":\"Leadenhall Market | Diagon Alley at 6:00 am\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/leadenhall-market-diagon-alley-at-600-am\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/dc7uwjrnags-300x200.jpg\",\"duration\":\"45\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7599,\"title\":\"Churchill War Rooms | The freedom bunker\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/churchill-war-rooms-the-freedom-bunker\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/9edc6c0f-961c-4164-ad77-e74ddd4ffc71-300x225.jpg\",\"duration\":\"100\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7601,\"title\":\"Kensington Palace | The garden of royal memories\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/kensington-palace-the-garden-of-royal-memories\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/4bad56a5-3560-4237-99a2-95fe903477ec-300x225.jpg\",\"duration\":\"90\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7603,\"title\":\"Westminster Abbey The whisper of history in stone (Verger Tour)\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/westminster-abbey-the-whisper-of-history-in-stone-verger-tour\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/33334264-300x199.jpeg\",\"duration\":\"120\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7611,\"title\":\"Cutty Sark | The copper giant under the glass\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/cutty-sark-the-copper-giant-under-the-glass\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/o-rjptppb0u-300x145.jpg\",\"duration\":\"2\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7613,\"title\":\"Tower of London: First Access Protocol and Key Ceremony\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/tower-of-london-first-access-protocol-and-key-ceremony\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nsotqaul-4-300x200.jpg\",\"duration\":\"3\",\"xp\":\"400\",\"badge\":\"premium\"}]},{\"city\":\"Mexico City\",\"slug\":\"mexico-city\",\"constellation\":\"Constellation of the Americas\",\"country\":\"Mundo\",\"experiences\":[{\"id\":7250,\"title\":\"The Islands of CU | The campus that is heritage\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-islands-of-cu-the-campus-that-is-heritage\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/12570366-300x200.jpeg\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7252,\"title\":\"Mexico Park | The elliptical oasis of the Countess\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/mexico-park-the-elliptical-oasis-of-the-countess\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/220caf1f-dd6b-4972-bbf2-70818a5f0194-300x169.jpg\",\"duration\":\"60\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7254,\"title\":\"Morisco Kiosk | The geometric jewel of Santa Mar\\u00eda\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/morisco-kiosk-the-geometric-jewel-of-santa-maria\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-kiosko-morisco-la-joya-de-santa-maria-la-ribera-v13d-300x169.jpg\",\"duration\":\"45\",\"xp\":\"80\",\"badge\":\"free\"},{\"id\":7256,\"title\":\"Audiorama Chapultepec | The refuge of silence in CDMX\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/audiorama-chapultepec-the-refuge-of-silence-in-cdmx\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-audiorama-chapultepec-el-refugio-del-silencio-v13d-300x169.jpg\",\"duration\":\"60\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7258,\"title\":\"Roma Green Garden | The urban resilience laboratory\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/roma-green-garden-the-urban-resilience-laboratory\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/94d13783-3836-46ea-9987-eff60fbbf6e3-300x181.jpg\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7240,\"title\":\"Coyoac\\u00e1n: Alleys of Frida\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/coyoacan-alleys-of-frida\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-coyoacan-callejones-frida-mistica-v13d-300x169.jpg\",\"duration\":\"80\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7242,\"title\":\"Vasconcelos Library: The crystal ark in CDMX\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/vasconcelos-library-the-crystal-ark-in-cdmx\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/839ab076-ec89-4620-b8fe-a3baf6ca23ed-300x189.jpg\",\"duration\":\"90\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7244,\"title\":\"Ex-Convent of the Desert of the Lions: The whisper of the forest\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/ex-convent-of-the-desert-of-the-lions-the-whisper-of-the-forest\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-ex-convento-desierto-leones-susurro-bosque-v13d-300x169.jpg\",\"duration\":\"120\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7246,\"title\":\"Plaza de San Jacinto (San \\u00c1ngel): The artists&#8217; garden\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/plaza-de-san-jacinto-san-angel-the-artists-garden\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-plaza-san-jacinto-jardin-artistas-v13d-300x169.jpg\",\"duration\":\"60\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7248,\"title\":\"Plaza de Santo Domingo: The portals of memory\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/plaza-de-santo-domingo-the-portals-of-memory\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-plaza-santo-domingo-portales-memoria-v13d-300x169.jpg\",\"duration\":\"40\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7227,\"title\":\"Templo Mayor: The sacred heart of the Mexica Empire\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/templo-mayor-the-sacred-heart-of-the-mexica-empire\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/gdainznsyfa-300x200.jpg\",\"duration\":\"150\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7232,\"title\":\"Pujol &#038; Quintonil: The Olympus of Mexican haute cuisine\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/pujol-quintonil-the-olympus-of-mexican-haute-cuisine\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/44b9c96e-e14b-484a-984b-3d59d4bb646c-300x113.jpg\",\"duration\":\"210\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7234,\"title\":\"National Museum of Anthropology: The oracle of pre-Hispanic time\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/national-museum-of-anthropology-the-oracle-of-pre-hispanic-time\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/ndxkwolenku-300x212.jpg\",\"duration\":\"180\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7236,\"title\":\"Xochimilco: Private channel protocol and mystique of the chinampas\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/xochimilco-private-channel-protocol-and-mystique-of-the-chinampas\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/12638539-300x200.jpeg\",\"duration\":\"180\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7238,\"title\":\"Teotihuac\\u00e1n: Sunrise Balloon Flight with a View of the Pyramids\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/teotihuacan-sunrise-balloon-flight-with-a-view-of-the-pyramids\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/eo9v20ig3z0-300x200.jpg\",\"duration\":\"240\",\"xp\":\"400\",\"badge\":\"premium\"}]},{\"city\":\"Miami\",\"slug\":\"miami-en\",\"constellation\":\"Constellation of the Americas\",\"country\":\"Mundo\",\"experiences\":[{\"id\":7527,\"title\":\"Lummus Park Miami | The Ocean Drive Neon Garden\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/lummus-park-miami-the-ocean-drive-neon-garden\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/34334889-300x225.jpeg\",\"duration\":\"75\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7529,\"title\":\"Wynwood Pathways Miami | The museum of the streets\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/wynwood-pathways-miami-the-museum-of-the-streets\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-custom-landscape-wynwood-pathways-museo-calles-miami-Wynwood-Walls-colorful-mu-v15-300x169.jpg\",\"duration\":\"120\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7531,\"title\":\"SoundScape Park Miami | Symphony under the palm trees\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/soundscape-park-miami-symphony-under-the-palm-trees\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-pexels-landscape-SoundScape-Park-Miami-Beach-v14-300x169.jpg\",\"duration\":\"60\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7515,\"title\":\"Enchanted Forest Miami | Miami Fairy Forest\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/enchanted-forest-miami-miami-fairy-forest\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-custom-landscape-enchanted-forest-bosque-hadas-miami-live-oak-trees-Spanish-mo-v15-300x169.jpg\",\"duration\":\"45\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7517,\"title\":\"Matheson Hammock Park Miami | The artificial atoll\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/matheson-hammock-park-miami-the-artificial-atoll\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-pexels-landscape-Matheson-Hammock-Park-atoll-po-v14-300x169.jpg\",\"duration\":\"120\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7519,\"title\":\"Alice Wainwright Park Miami | The mangrove viewpoint\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/alice-wainwright-park-miami-the-mangrove-viewpoint\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-pexels-landscape-Alice-Wainwright-Park-Miami-wa-v14-300x169.jpg\",\"duration\":\"60\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7521,\"title\":\"Ancient Spanish Monastery Miami | The mystical labyrinth\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/ancient-spanish-monastery-miami-the-mystical-labyrinth\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-unsplash-landscape-Ancient-Spanish-Monastery-Miam-v14-300x169.jpg\",\"duration\":\"90\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7523,\"title\":\"Vizcaya Museum &#038; Gardens Miami | The rebirth of water\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/vizcaya-museum-gardens-miami-the-rebirth-of-water\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/9ef1ec5c-bdcd-4213-abc2-953e583b8da2-300x199.jpg\",\"duration\":\"150\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7525,\"title\":\"The Kampong Miami | Coconut Grove Botanical Refuge\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-kampong-miami-coconut-grove-botanical-refuge\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-pexels-landscape-The-Kampong-Coconut-Grove-bota-v14-300x169.jpg\",\"duration\":\"120\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7503,\"title\":\"Everglades Airboat | The pulse of the river of grass\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/everglades-airboat-the-pulse-of-the-river-of-grass\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-custom-landscape-everglades-airboat-pulso-rio-hierba-Everglades-airboat-speed-v15-300x169.jpg\",\"duration\":\"120\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7505,\"title\":\"Rubell Museum | The sanctuary of contemporary art\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/rubell-museum-the-sanctuary-of-contemporary-art\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-pexels-landscape-Rubell-Museum-Miami-interior-g-v14-300x169.jpg\",\"duration\":\"150\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7507,\"title\":\"Frost Science Museum | The eye of the ocean\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/frost-science-museum-the-eye-of-the-ocean\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-unsplash-landscape-Frost-Science-Museum-aquarium-v14-300x169.jpg\",\"duration\":\"180\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7509,\"title\":\"Artechouse Miami | The light laboratory\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/artechouse-miami-the-light-laboratory\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-pexels-landscape-Artechouse-Miami-digital-exhib-v14-300x169.jpg\",\"duration\":\"75\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7511,\"title\":\"P\\u00e9rez Art Museum Miami | The Hanging Garden by the Bay\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/perez-art-museum-miami-the-hanging-garden-by-the-bay\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-custom-landscape-perez-art-museum-miami-pamm-jardin-colgante-Perez-Art-Museum-hanging-v15-300x169.jpg\",\"duration\":\"120\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7513,\"title\":\"Superblue Miami | The portal of dimensions\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/superblue-miami-the-portal-of-dimensions\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/miami-unsplash-landscape-Superblue-Miami-immersive-art-v14-300x169.jpg\",\"duration\":\"90\",\"xp\":\"400\",\"badge\":\"premium\"}]},{\"city\":\"New York\",\"slug\":\"new-york-en\",\"constellation\":\"Constellation of the Americas\",\"country\":\"Mundo\",\"experiences\":[{\"id\":7557,\"title\":\"Roosevelt Island Tramway: City Flight over the East River\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/roosevelt-island-tramway-city-flight-over-the-east-river\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-custom-landscape-roosevelt-island-tramway-vuelo-urbano-east-river-Roosevelt-Island-Tramway-v16-300x169.jpg\",\"duration\":\"15\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7559,\"title\":\"Little Island: The Park on the Hudson\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/little-island-the-park-on-the-hudson\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-pexels-landscape-Little-Island-park-Pier-55-New-v14-300x169.jpg\",\"duration\":\"60\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7561,\"title\":\"Staten Island Ferry: New York Harbor Overlook\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/staten-island-ferry-new-york-harbor-overlook\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-custom-landscape-staten-island-ferry-mirador-libertad-Staten-Island-Ferry-Manha-v16-300x169.jpg\",\"duration\":\"60\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7563,\"title\":\"The Vessel: Urban geometry and vertical flow\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-vessel-urban-geometry-and-vertical-flow\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-pexels-landscape-The-Vessel-Hudson-Yards-NYC-v14-300x169.jpg\",\"duration\":\"45\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7545,\"title\":\"The Ramble | The secret forest of Central Park\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-ramble-the-secret-forest-of-central-park\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-pexels-landscape-Central-Park-The-Ramble-forest-v14-300x169.jpg\",\"duration\":\"50\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7547,\"title\":\"Brooklyn Heights Promenade | The city balcony\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/brooklyn-heights-promenade-the-city-balcony\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-pexels-landscape-Brooklyn-Heights-Promenade-vie-v14-300x169.jpg\",\"duration\":\"45\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7549,\"title\":\"Greenacre Park | Midtown&#8217;s Hidden Waterfall\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/greenacre-park-midtowns-hidden-waterfall\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-pexels-landscape-Greenacre-Park-waterfall-v14-300x169.jpg\",\"duration\":\"30\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7551,\"title\":\"The Morgan Library | The knowledge bunker in New York\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-morgan-library-the-knowledge-bunker-in-new-york\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-pexels-landscape-Morgan-Library-McKim-Room-v14-300x169.jpg\",\"duration\":\"60\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7553,\"title\":\"Ford Foundation Atrium | Jungle under glass\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/ford-foundation-atrium-jungle-under-glass\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-unsplash-landscape-Ford-Foundation-Building-garde-v14-300x169.jpg\",\"duration\":\"40\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7555,\"title\":\"The Elevated Acre | The secret garden of Wall Street\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-elevated-acre-the-secret-garden-of-wall-street\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-pexels-landscape-The-Elevated-Acre-park-Wall-St-v14-300x169.jpg\",\"duration\":\"45\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7535,\"title\":\"Helicopter Tour New York | The Skyline Oracle\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/helicopter-tour-new-york-the-skyline-oracle\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-pexels-landscape-Manhattan-aerial-view-helicopt-v14-300x169.jpg\",\"duration\":\"20\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7537,\"title\":\"Guggenheim Museum New York | The spiral of modern art\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/guggenheim-museum-new-york-the-spiral-of-modern-art\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-unsplash-landscape-Guggenheim-Museum-architecture-v14-300x169.jpg\",\"duration\":\"120\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7539,\"title\":\"Le Pavillon New York | Daniel Boulud&#8217;s Edible Garden\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/le-pavillon-new-york-daniel-bouluds-edible-garden\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-unsplash-landscape-Le-Pavillon-restaurant-gourmet-v14-300x169.jpg\",\"duration\":\"150\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7541,\"title\":\"The Met Cloisters New York | Medieval mystique on the Hudson\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-met-cloisters-new-york-medieval-mystique-on-the-hudson\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-pexels-landscape-The-Met-Cloisters-fort-tryon-v14-300x169.jpg\",\"duration\":\"120\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7543,\"title\":\"Summit One Vanderbilt New York | Dive into the clouds\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/summit-one-vanderbilt-new-york-dive-into-the-clouds\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nyc-pexels-landscape-Summit-One-Vanderbilt-mirrors-v14-300x169.jpg\",\"duration\":\"90\",\"xp\":\"400\",\"badge\":\"premium\"}]},{\"city\":\"Paris\",\"slug\":\"paris-en\",\"constellation\":\"European Constellation\",\"country\":\"Mundo\",\"experiences\":[{\"id\":7575,\"title\":\"Eiffel Tower: The Trocad\\u00e9ro viewpoint\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/eiffel-tower-the-trocadero-viewpoint\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/pexels-landscape-Eiffel-Tower-sunrise-beautiful-300x169.jpg\",\"duration\":\"40\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7591,\"title\":\"Canal Saint-Martin: The bohemian artery of Paris\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/canal-saint-martin-the-bohemian-artery-of-paris\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/14348452-300x200.jpeg\",\"duration\":\"120\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7593,\"title\":\"Square du Vert-Galant: The bow of the Ile de la Cit\\u00e9\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/square-du-vert-galant-the-bow-of-the-ile-de-la-cite\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/0b910532-1c1b-4007-8311-58d5496b66d3-300x201.jpg\",\"duration\":\"45\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7595,\"title\":\"Jardin du Luxembourg: The elegance of the Latin Quarter\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/jardin-du-luxembourg-the-elegance-of-the-latin-quarter\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/pexels-landscape-Luxembourg-Palace-Paris-sunny-300x200.jpg\",\"duration\":\"60\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7597,\"title\":\"Promenade Plant\\u00e9e: The elevated garden of Paris\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/promenade-plantee-the-elevated-garden-of-paris\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-promenade-plantee-el-jardin-elevado-de-paris-300x199.jpg\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7581,\"title\":\"Passage des Panoramas: The glass and seal labyrinth\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/passage-des-panoramas-the-glass-and-seal-labyrinth\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-passage-des-panoramas-el-laberinto-de-cristal-y-sellos-300x169.jpg\",\"duration\":\"45\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7583,\"title\":\"Mus\\u00e9e de la Vie Romantique: The garden of ideas\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/musee-de-la-vie-romantique-the-garden-of-ideas\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-musee-de-la-vie-romantique-el-jardin-escondido-de-pigalle-300x169.jpg\",\"duration\":\"50\",\"xp\":\"200\",\"badge\":\"secret\"},{\"id\":7585,\"title\":\"Victor Hugo&#8217;s Maison: The soul of the Place des Vosges\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/victor-hugos-maison-the-soul-of-the-place-des-vosges\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-maison-victor-hugo-paris-place-des-vosges-300x169.jpg\",\"duration\":\"60\",\"xp\":\"250\",\"badge\":\"secret\"},{\"id\":7589,\"title\":\"Ar\\u00e8nes de Lut\\u00e8ce: The echo of Roman Gaul\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/arenes-de-lutece-the-echo-of-roman-gaul\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-arenes-de-lutece-el-eco-de-la-galia-romana-300x169.jpg\",\"duration\":\"45\",\"xp\":\"200\",\"badge\":\"secret\"},{\"id\":7609,\"title\":\"Parc des Buttes-Chaumont | The temple over the abyss\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/parc-des-buttes-chaumont-the-temple-over-the-abyss\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/gznhhbmex7u-300x225.jpg\",\"duration\":\"75\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7565,\"title\":\"Sainte-Chapelle: The medieval reliquary of light\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/sainte-chapelle-the-medieval-reliquary-of-light\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-sainte-chapelle-relicario-luz-medieval-v13b-300x169.jpg\",\"duration\":\"45\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7567,\"title\":\"Dinner on the Seine: The glass and lights cruise in Paris\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/dinner-on-the-seine-the-glass-and-lights-cruise-in-paris\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-cena-sena-crucero-cristal-luces-v13b-300x169.jpg\",\"duration\":\"150\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7569,\"title\":\"Mus\\u00e9e d&#8217;Orsay: Impressionism in the old station\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/musee-dorsay-impressionism-in-the-old-station\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-musee-dorsay-impresionismo-antigua-estacion-v13b-300x169.jpg\",\"duration\":\"90\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7571,\"title\":\"Op\\u00e9ra Garnier: The palace of music and gold in Paris\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/opera-garnier-the-palace-of-music-and-gold-in-paris\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-opera-garnier-palacio-musica-oro-v13b-300x169.jpg\",\"duration\":\"60\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7573,\"title\":\"Paris Catacombs: The Empire of Death\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/paris-catacombs-the-empire-of-death\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/bypass-landscape-catacumbas-paris-imperio-muerte-vip-v13b-300x169.jpg\",\"duration\":\"90\",\"xp\":\"400\",\"badge\":\"premium\"}]},{\"city\":\"Rome\",\"slug\":\"rome\",\"constellation\":\"European Constellation\",\"country\":\"Mundo\",\"experiences\":[{\"id\":6730,\"title\":\"The Gianicolo: Rome&#8217;s panoramic hill\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-gianicolo-romes-panoramic-hill\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Gianicolo-Roma-Horizontal-Space-Journey-300x167.jpg\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":6506,\"title\":\"The Vittoriano: The marble time machine\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-vittoriano-the-marble-time-machine\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/dacdebdqjpk-300x198.jpg\",\"duration\":\"120\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":6508,\"title\":\"The Roman Colosseum: exterior visit\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-roman-colosseum-exterior-visit\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/qh0c7c5gjj8-300x200.jpg\",\"duration\":\"120\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":6510,\"title\":\"The orange garden and the secret key\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-orange-garden-and-the-secret-key\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/Giardino-degli-Aranco-Space-Journey-Horizontal-300x127.jpg\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":6512,\"title\":\"Trastevere: The whisper of the cobblestones\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/trastevere-the-whisper-of-the-cobblestones\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/Trastevere-Space-Journey-Horizontal-300x167.png\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":6701,\"title\":\"Trevi Fountain in silence: The ritual of water\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/trevi-fountain-in-silence-the-ritual-of-water\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/i1lv2yx67gi-300x200.jpg\",\"duration\":\"45\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":6704,\"title\":\"The Pantheon: The portal of light\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-pantheon-the-portal-of-light\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/tlyzsnu8md0-300x200.jpg\",\"duration\":\"60\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":6721,\"title\":\"Parco degli acquedotti: The stone giants\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/parco-degli-acquedotti-the-stone-giants\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/32a1ecbf-d3dc-494c-8531-0a4d04f40382-300x200.jpg\",\"duration\":\"120\",\"xp\":\"200\",\"badge\":\"secret\"},{\"id\":6724,\"title\":\"Via appia antica: The rhythm of eternity\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/via-appia-antica-the-rhythm-of-eternity\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/efa41f36-f333-4dcd-a697-76751cbe0258-300x169.jpg\",\"duration\":\"150\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":6726,\"title\":\"Garbatella: The garden village within Rome\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/garbatella-the-garden-village-within-rome\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/1600e33a-f814-4c1d-8d1b-86fb91c2ad3a-300x225.jpg\",\"duration\":\"105\",\"xp\":\"200\",\"badge\":\"secret\"},{\"id\":6674,\"title\":\"Castel Sant&#8217;Angelo: The secret corridor\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/castel-santangelo-the-secret-corridor\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/292541fe-36cf-4333-9af9-49ae4b425401-300x199.jpg\",\"duration\":\"90\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":6691,\"title\":\"Galleria Borghese: Sculptural perfection\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/galleria-borghese-sculptural-perfection\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/9kngv0hk3au-300x200.jpg\",\"duration\":\"120\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":6695,\"title\":\"Vatican Museums &amp; Sistine Chapel\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/vatican-museums-sistine-chapel\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/si2eyuamw9m-300x115.jpg\",\"duration\":\"180\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":6697,\"title\":\"Colosseum, Roman Forum &amp; Palatine Hill\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/colosseum-roman-forum-palatine-hill\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/3om3q0wtjlm-300x200.jpg\",\"duration\":\"180\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":6732,\"title\":\"The Vittoriano: The look of the chariots\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/en\\\/experiencia\\\/the-vittoriano-the-look-of-the-chariots\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/vt_5jmfufya-300x200.jpg\",\"duration\":\"60\",\"xp\":\"250\",\"badge\":\"premium\"}]}];\r\n\r\n            \/\/ 2. RENDERIZAR LA INTERFAZ\r\n            function sjRenderUI() {\r\n                sjForceGlassmorphismAncestors();\r\n                const container = document.getElementById('sjDaysContainer');\r\n                const banner = document.getElementById('sjTripBanner');\r\n                const titleElem = document.getElementById('sjTripBannerTitle');\r\n\r\n                container.innerHTML = ''; \/\/ Limpiar\r\n\r\n                \/\/ \u00bfTiene cero d\u00edas este viaje en particular?\r\n                const tripHasNoDays = (!sjState.days || sjState.days.length === 0);\r\n\r\n                \/\/ \u00bfEs un usuario sin ning\u00fan viaje guardado en el sistema?\r\n                \/\/ Detectamos esto si el selector de viajes no tiene \"options\" v\u00e1lidas o no existe\r\n                const selector = document.getElementById('sjTripSelector');\r\n                const hasSavedTripsInDB = selector && selector.options.length > 0 && selector.options[0].value !== 'new';\r\n\r\n                \/\/ Logica del Zero-State vs Empty Trip\r\n                if (sjState.isDashboard) {\r\n                    banner.style.display = 'none'; \/\/ Ocultar banner\r\n                    let zeroHtml = '';\r\n\r\n                    if (window.sjAvailableTrips && window.sjAvailableTrips.length > 0) {\r\n                        \/\/ INLINE DASHBOARD (GRID)\r\n                        zeroHtml += '<div style=\"width:100%; max-width:1000px; margin: 20px auto; padding: 0 20px; box-sizing:border-box;\">';\r\n                        zeroHtml += '<div style=\"display:flex; justify-content:space-between; align-items:center; margin-bottom:20px; flex-wrap:wrap; gap:15px;\">';\r\n                        zeroHtml += '<h2 style=\"font-family: \\'Outfit\\', sans-serif; color:var(--sj-primary); margin:0; font-weight:800; font-size:28px;\">My Trips<\/h2>';\r\n                        zeroHtml += '<button class=\"sj-btn sj-btn-primary\" onclick=\"sjCreateNewTrip()\" style=\"border-radius:30px;\"><span class=\"dashicons dashicons-plus-alt2\"><\/span> New Trip<\/button>';\r\n                        zeroHtml += '<\/div>';\r\n\r\n                        zeroHtml += '<div style=\"display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 20px;\">';\r\n\r\n                        window.sjAvailableTrips.forEach((it) => {\r\n                            zeroHtml += `<div onclick=\"sjSwitchTripGrid(${it.id})\" style=\"background: rgba(255, 255, 255, 0.82); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border: 1.5px solid rgba(25, 59, 51, 0.15); border-radius: 16px; padding: 20px; cursor: pointer; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); box-shadow: 0 8px 24px rgba(25, 59, 51, 0.08); display: flex; align-items: center; min-height: 90px;\" onmouseover=\"this.style.transform='translateY(-4px)'; this.style.boxShadow='0 12px 30px rgba(25, 59, 51, 0.15)'; this.style.borderColor='var(--sj-accent)'; this.style.backgroundColor='rgba(255, 255, 255, 0.95)';\" onmouseout=\"this.style.transform='translateY(0)'; this.style.boxShadow='0 8px 24px rgba(25, 59, 51, 0.08)'; this.style.borderColor='rgba(25, 59, 51, 0.15)'; this.style.backgroundColor='rgba(255, 255, 255, 0.82)';\">`;\r\n\r\n                            \/\/ Portada Circular\r\n                            const coverUrl = (it.cover_image || it.coverImage || 'https:\/\/spacejourney.app\/wp-content\/uploads\/2026\/05\/Space-Journey-City-Lab.jpg').trim();\r\n                            zeroHtml += `<div style=\"width: 50px; height: 50px; border-radius: 50%; overflow: hidden; border: 2px solid rgba(229, 192, 123, 0.8); flex-shrink: 0; margin-right: 15px; background: url('${coverUrl}') no-repeat center center; background-size: cover; box-shadow: 0 4px 10px rgba(0,0,0,0.05);\"><\/div>`;\r\n\r\n                            \/\/ Textos de Tarjeta\r\n                            zeroHtml += `<div style=\"display: flex; flex-direction: column; justify-content: center; min-width: 0; flex-grow: 1;\">`;\r\n                            zeroHtml += `<h4 style=\"margin: 0; font-size: 16px; font-weight: 700; color: var(--sj-text); font-family: \\'Outfit\\', sans-serif; line-height:1.3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">${it.title}<\/h4>`;\r\n                            if (it.city_name) {\r\n                                zeroHtml += `<span style=\"font-size: 11px; color: var(--sj-accent); font-weight: 600; margin-top: 3px; text-transform: uppercase; letter-spacing: 0.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">${it.city_name}<\/span>`;\r\n                            }\r\n                            zeroHtml += `<span style=\"font-size: 11px; color: var(--sj-text-muted); font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; margin-top: 5px;\">Open trip &rarr;<\/span>`;\r\n                            zeroHtml += `<\/div>`;\r\n\r\n                            zeroHtml += `<\/div>`;\r\n                        });\r\n\r\n                        zeroHtml += '<\/div>'; \/\/ Cerrar Grid de Viajes\r\n\r\n                        \/\/ BANNER DE MEMBRES\u00cdA ADAPTATIVO (En otra fila abajo, de ancho completo)\r\n                        zeroHtml += '<div style=\"margin-top: 30px; width: 100%;\">';\r\n\r\n                        if (userMembershipLevel === 2) {\r\n                            \/\/ Ultra\r\n                            zeroHtml += `<div style=\"background: linear-gradient(135deg, #112F24 0%, #193B33 100%); border: 2px solid var(--sj-accent); border-radius: 16px; padding: 25px; box-shadow: 0 8px 32px rgba(25, 59, 51, 0.15); display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap;\">`;\r\n                            zeroHtml += `<div style=\"flex: 1; min-width: 280px;\">`;\r\n                            zeroHtml += `<h4 style=\"margin: 0 0 10px 0; font-size: 20px; font-weight: 700; color: #ffffff; font-family: \\'Outfit\\', sans-serif;\">Ultra Planner Active \ud83c\udf1f<\/h4>`;\r\n                            zeroHtml += `<p style=\"margin: 0; font-size: 13.5px; color: #e2e8f0; line-height: 1.5; font-family: \\'Inter\\', sans-serif;\">You are an Ultra traveler! The 100% trip planner is now available, with AI time optimization, interactive dynamic maps, unlimited exports, and all exclusive tools.<\/p>`;\r\n                            zeroHtml += `<\/div>`;\r\n                            zeroHtml += `<div style=\"color: var(--sj-accent); font-weight: 700; font-size: 15px; font-family: \\'Outfit\\', sans-serif; white-space: nowrap; display: flex; align-items: center; gap: 6px;\">`;\r\n                            zeroHtml += `<span class=\"dashicons dashicons-saved\" style=\"color:var(--sj-accent);\"><\/span> Unlocked Features`;\r\n                            zeroHtml += `<\/div>`;\r\n                            zeroHtml += `<\/div>`;\r\n                        } else if (userMembershipLevel === 1) {\r\n                            \/\/ Pass\r\n                            zeroHtml += `<div style=\"background: linear-gradient(135deg, #112F24 0%, #193B33 100%); border: 2px solid var(--sj-accent); border-radius: 16px; padding: 25px; box-shadow: 0 8px 32px rgba(25, 59, 51, 0.15); display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap;\">`;\r\n                            zeroHtml += `<div style=\"flex: 1; min-width: 280px;\">`;\r\n                            zeroHtml += `<h4 style=\"margin: 0 0 10px 0; font-size: 20px; font-weight: 700; color: #ffffff; font-family: \\'Outfit\\', sans-serif;\">Thanks for exploring with the Pass!<\/h4>`;\r\n                            zeroHtml += `<p style=\"margin: 0; font-size: 13.5px; color: #e2e8f0; line-height: 1.5; font-family: \\'Inter\\', sans-serif;\">You have access to unlimited trips and Calendar export. Want more? Upgrade to Ultra to optimize your time with AI, exact hour assignment, and advanced itinerary suggestions.<\/p>`;\r\n                            zeroHtml += `<\/div>`;\r\n                            zeroHtml += `<button onclick=\"window.open(\\'https:\/\/spacejourney.app\/membership-levels\/\\', \\'_blank\\')\" class=\"sj-btn\" style=\"height: 42px; padding: 0 25px; font-weight: 700; border-radius: 30px; background-color: #112a24 !important; border: 2px solid var(--sj-accent) !important; color: var(--sj-accent) !important; box-shadow: 0 4px 12px rgba(17, 42, 36, 0.3); white-space: nowrap; transition: all 0.3s ease;\" onmouseover=\"this.style.backgroundColor='var(--sj-accent)'; this.style.color='#112a24';\" onmouseout=\"this.style.backgroundColor='#112a24'; this.style.color='var(--sj-accent)';\">`;\r\n                            zeroHtml += `Upgrade to Ultra`;\r\n                            zeroHtml += `<\/button>`;\r\n                            zeroHtml += `<\/div>`;\r\n                        } else {\r\n                            \/\/ Free (userMembershipLevel === 0)\r\n                            zeroHtml += `<div style=\"background: linear-gradient(135deg, #112F24 0%, #193B33 100%); border: 2px solid var(--sj-accent); border-radius: 16px; padding: 25px; box-shadow: 0 8px 32px rgba(25, 59, 51, 0.15); display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap;\">`;\r\n                            zeroHtml += `<div style=\"flex: 1; min-width: 280px;\">`;\r\n                            zeroHtml += `<h4 style=\"margin: 0 0 10px 0; font-size: 20px; font-weight: 700; color: #ffffff; font-family: \\'Outfit\\', sans-serif;\">Take your trips to the next level<\/h4>`;\r\n                            zeroHtml += `<p style=\"margin: 0; font-size: 13.5px; color: #e2e8f0; line-height: 1.5; font-family: \\'Inter\\', sans-serif;\">Your Free account lets you save up to 3 trips. Unlock the Pass plan to save unlimited trips and export to Calendar, or upgrade to Ultra to schedule exact times and optimize your route with our AI.<\/p>`;\r\n                            zeroHtml += `<\/div>`;\r\n                            zeroHtml += `<button onclick=\"window.open(\\'https:\/\/spacejourney.app\/membership-levels\/\\', \\'_blank\\')\" class=\"sj-btn\" style=\"height: 42px; padding: 0 25px; font-weight: 700; border-radius: 30px; background-color: #112a24 !important; border: 2px solid var(--sj-accent) !important; color: var(--sj-accent) !important; box-shadow: 0 4px 12px rgba(17, 42, 36, 0.3); white-space: nowrap; transition: all 0.3s ease;\" onmouseover=\"this.style.backgroundColor='var(--sj-accent)'; this.style.color='#112a24';\" onmouseout=\"this.style.backgroundColor='#112a24'; this.style.color='var(--sj-accent)';\">`;\r\n                            zeroHtml += `View Memberships`;\r\n                            zeroHtml += `<\/button>`;\r\n                            zeroHtml += `<\/div>`;\r\n                        }\r\n\r\n                        zeroHtml += '<\/div>'; \/\/ Fin Banner Row\r\n                        zeroHtml += '<\/div>'; \/\/ Fin Contenedor Dashboard\r\n                    } else {\r\n                        \/\/ ZERO-STATE TOTAL (Usuario Nuevo)\r\n                        zeroHtml = `\r\n                    <div class=\"sj-zero-state\">\r\n                        <span class=\"dashicons dashicons-location-alt\" style=\"font-size:48px; color:var(--sj-primary); margin-bottom:15px; opacity:0.8;\"><\/span>\r\n                        <h3>Your next great adventure begins here.<\/h3>\r\n                        <p>Create your first itinerary to discover, save, and organize incredible places.<\/p>\r\n                        <button class=\"sj-btn sj-btn-primary\" onclick=\"sjCreateNewTrip()\" style=\"padding:15px 30px; font-size:16px;\">\r\n                            <span class=\"dashicons dashicons-plus-alt2\"><\/span> Create my first trip                        <\/button>\r\n                    <\/div>\r\n                    `;\r\n                    }\r\n                    container.innerHTML = zeroHtml;\r\n                    return; \/\/ Detener el renderizado\r\n                }\r\n                \r\n                if (tripHasNoDays) {\r\n                    \/\/ EL VIAJE EST\u00c1 VAC\u00cdO (pero s\u00ed estamos viendo uno concreto)\r\n                    banner.style.display = 'flex';\r\n                    titleElem.innerText = sjState.title || \"Untitled\";\r\n                    if (sjState.coverImage) {\r\n                        banner.style.backgroundImage = `url('${sjState.coverImage}')`;\r\n                    } else {\r\n                        banner.style.backgroundImage = 'none';\r\n                    }\r\n\r\n                    \/\/ Bot\u00f3n para a\u00f1adir el primer d\u00eda\r\n                    container.innerHTML = `\r\n                    <div style=\"width:100%; text-align:center; padding: 40px; border: 2px dashed var(--sj-border); border-radius: 16px; margin-top:20px;\">\r\n                        <p style=\"color:var(--sj-text-muted); font-size:16px; margin-bottom:20px;\">This trip has no activities yet.<\/p>\r\n                        <button class=\"sj-btn sj-btn-secondary\" onclick=\"sjAddDay()\">\r\n                            <span class=\"dashicons dashicons-plus\"><\/span> Add Day 1                        <\/button>\r\n                    <\/div>\r\n                `;\r\n                    return; \/\/ Detener el renderizado normal\r\n                }\r\n\r\n                \/\/ Flujo Normal con D\u00edas\r\n                banner.style.display = 'flex';\r\n                titleElem.innerText = sjState.title || \"Untitled\";\r\n\r\n                const fallbackImage = 'https:\/\/spacejourney.app\/wp-content\/uploads\/2026\/05\/Space-Journey-City-Lab.jpg';\r\n                if (sjState.coverImage) {\r\n                    banner.style.backgroundImage = `url('${sjState.coverImage}')`;\r\n                } else {\r\n                    banner.style.backgroundImage = `url('${fallbackImage}')`;\r\n                }\r\n\r\n                sjState.days.forEach((day, dayIndex) => {\r\n                    \/\/ Crear Columna\r\n                    const div = document.createElement('div');\r\n                    div.className = 'sj-day-column';\r\n                    div.setAttribute('data-day-id', day.id);\r\n\r\n                    \/\/ HTML de la Columna y Tarjetas\r\n                    let cardsHtml = day.cards.map(card => {\r\n                        const imgHtml = card.image ?\r\n                            `<img decoding=\"async\" src=\"${card.image}\" style=\"width:40px;height:40px;border-radius:6px;object-fit:cover;flex-shrink:0;\">` :\r\n                            `<div style=\"width:40px;height:40px;border-radius:6px;background:var(--sj-bg);display:flex;align-items:center;justify-content:center;color:var(--sj-accent);flex-shrink:0;\"><span class=\"dashicons dashicons-star-filled\"><\/span><\/div>`;\r\n\r\n                        \/\/ Traducciones din\u00e1micas de bloques de tiempo en base a la RAM\r\n                        let timeBadgeLabel = '';\r\n                        let timeClass = '';\r\n                        if (card.timeMode) {\r\n                            if (card.timeMode === 'morning') { timeBadgeLabel = \"Morning\"; timeClass = 'sj-time-morning'; }\r\n                            else if (card.timeMode === 'afternoon') { timeBadgeLabel = \"Afternoon\"; timeClass = 'sj-time-afternoon'; }\r\n                            else if (card.timeMode === 'night') { timeBadgeLabel = \"Night\"; timeClass = 'sj-time-night'; }\r\n                            else { timeBadgeLabel = card.timeMode; timeClass = 'sj-time-exact'; }\r\n                        }\r\n\r\n                        const timeBadge = card.timeMode ? `<span class=\"sj-time-badge ${timeClass}\">${timeBadgeLabel}<\/span>` : '';\r\n\r\n                        return `\r\n                    <div class=\"sj-card-item\" data-id=\"${card.id}\">\r\n                        <span class=\"sj-card-handle dashicons dashicons-menu\"><\/span>\r\n                        ${imgHtml ? `<div style=\"margin-right:10px; display:flex; align-items:center; flex-shrink:0;\">${imgHtml}<\/div>` : ''}\r\n                        <div class=\"sj-card-content\" style=\"min-width:0; flex-grow:1; display:flex; flex-direction:column; justify-content:center; overflow:hidden;\">\r\n                            <div class=\"sj-card-title\" contenteditable=\"true\" onblur=\"sjUpdateCardTitle('${day.id}', '${card.id}', this.innerText)\" style=\"word-break: break-word; white-space: normal; line-height: 1.2;\">${card.title}<\/div>\r\n                            ${timeBadge}\r\n                        <\/div>\r\n                        <div class=\"sj-card-actions\">\r\n                            <span class=\"dashicons dashicons-clock\" onclick=\"sjSetTimeMode('${day.id}', '${card.id}')\" title=\"Assign time\"><\/span>\r\n                            <span class=\"dashicons dashicons-trash\" onclick=\"sjDeleteCard('${day.id}', '${card.id}')\" title=\"Delete Activity\"><\/span>\r\n                        <\/div>\r\n                    <\/div>\r\n                `}).join('');\r\n\r\n                    div.innerHTML = `\r\n                    <div class=\"sj-day-header\" style=\"align-items:center; display:flex;\">\r\n                        <span contenteditable=\"true\" onblur=\"sjUpdateDayTitle('${day.id}', this.innerText)\" style=\"outline:none; border-bottom:1px dashed rgba(25,59,51,0.2); padding-bottom:2px; flex-grow:1; margin-right:15px; word-break: break-word; line-height: 1.2;\">${day.title}<\/span>\r\n                        <span class=\"dashicons dashicons-trash\" onclick=\"sjDeleteDay('${day.id}')\" title=\"Delete Day\"><\/span>\r\n                    <\/div>\r\n                    <div class=\"sj-dropzone\" id=\"dropzone_${day.id}\" data-day=\"${day.id}\">\r\n                        ${cardsHtml}\r\n                    <\/div>\r\n                    <div class=\"sj-add-card-btn\" onclick=\"sjAddCard('${day.id}')\">+ Add Activity<\/div>\r\n                `;\r\n                    container.appendChild(div);\r\n\r\n                    \/\/ ACTIVAR SORTABLE JS PARA ESTA COLUMNA\r\n                    Sortable.create(document.getElementById(`dropzone_${day.id}`), {\r\n                        group: 'shared', \/\/ Permite arrastrar entre columnas\r\n                        animation: 150,\r\n                        handle: '.sj-card-handle', \/\/ Solo se arrastra desde el \u00edcono (Fundamental para m\u00f3viles)\r\n                        ghostClass: 'sortable-ghost',\r\n                        onEnd: function (evt) {\r\n                            sjHandleDragEnd(evt);\r\n                        }\r\n                    });\r\n                });\r\n\r\n                \/\/ Columna Fantasma \"A\u00f1adir D\u00eda\" al Final (Bot\u00f3n al final)\r\n                const addColumnDiv = document.createElement('div');\r\n                addColumnDiv.className = 'sj-day-column sj-day-column-add-placeholder';\r\n                addColumnDiv.innerHTML = `\r\n                <div class=\"sj-day-add-placeholder-content\">\r\n                    <span class=\"dashicons dashicons-plus-alt2\"><\/span>\r\n                    <div style=\"font-family: 'Outfit', sans-serif; font-weight: 700; font-size: 15px;\">Add Day<\/div>\r\n                <\/div>\r\n            `;\r\n                addColumnDiv.onclick = sjAddDay;\r\n                container.appendChild(addColumnDiv);\r\n            }\r\n\r\n            \/\/ 3. LOGICA DE ARRASTRE\r\n            function sjHandleDragEnd(evt) {\r\n                const oldDayId = evt.from.dataset.day;\r\n                const newDayId = evt.to.dataset.day;\r\n                const oldIndex = evt.oldIndex;\r\n                const newIndex = evt.newIndex;\r\n\r\n                \/\/ Mover en la memoria (JS State)\r\n                const oldDay = sjState.days.find(d => d.id === oldDayId);\r\n                const newDay = sjState.days.find(d => d.id === newDayId);\r\n\r\n                \/\/ Sacar la tarjeta\r\n                const movedCard = oldDay.cards.splice(oldIndex, 1)[0];\r\n                \/\/ Meterla en el nuevo lugar\r\n                newDay.cards.splice(newIndex, 0, movedCard);\r\n\r\n                sjSaveToLocal(); \/\/ Autoguardar temporal\r\n                if (isUserLoggedIn) sjSaveItinerary(true); \/\/ Autoguardar en la nube\r\n            }\r\n\r\n            \/\/ 4. FUNCIONES CRUD B\u00c1SICAS\r\n            function sjAddDay() {\r\n                const newNumber = sjState.days.length + 1;\r\n                const newDayId = `day_${Date.now()}`;\r\n                sjState.days.push({ id: newDayId, title: `Day ${newNumber}`, cards: [] });\r\n                sjRenderUI();\r\n                sjSaveToLocal();\r\n                if (isUserLoggedIn) sjSaveItinerary(true);\r\n\r\n                \/\/ Llevar al usuario hasta el nuevo d\u00eda en el tablero\r\n                sjScrollToDay(newDayId);\r\n            }\r\n\r\n            \/\/ Funci\u00f3n para enfocar y desplazar al nuevo d\u00eda (Micro-interacci\u00f3n de Calma)\r\n            function sjScrollToDay(dayId) {\r\n                setTimeout(() => {\r\n                    const dayColumn = document.querySelector(`.sj-day-column[data-day-id=\"${dayId}\"]`);\r\n                    const container = document.getElementById('sjDaysContainer');\r\n                    if (dayColumn && container) {\r\n                        const isMobile = window.innerWidth <= 768;\r\n                        if (isMobile) {\r\n                            \/\/ En m\u00f3viles, el scroll es vertical\r\n                            dayColumn.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n                        } else {\r\n                            \/\/ En desktop, el scroll es horizontal\r\n                            const containerRect = container.getBoundingClientRect();\r\n                            const columnRect = dayColumn.getBoundingClientRect();\r\n                            const scrollLeft = container.scrollLeft + (columnRect.left - containerRect.left) - (containerRect.width \/ 2) + (columnRect.width \/ 2);\r\n                            container.scrollTo({ left: scrollLeft, behavior: 'smooth' });\r\n                        }\r\n\r\n                        \/\/ Destello dorado de confirmaci\u00f3n en la cabecera\r\n                        const header = dayColumn.querySelector('.sj-day-header');\r\n                        if (header) {\r\n                            header.style.transition = 'background-color 0.3s ease';\r\n                            header.style.backgroundColor = 'rgba(229, 192, 123, 0.25)'; \/\/ Dorado transl\u00facido\r\n                            setTimeout(() => {\r\n                                header.style.backgroundColor = 'transparent';\r\n                            }, 800);\r\n                        }\r\n                    }\r\n                }, 100);\r\n            }\r\n\r\n            function sjUpdateDayTitle(dayId, newTitle) {\r\n                const day = sjState.days.find(d => d.id === dayId);\r\n                if (day && newTitle.trim() !== '') day.title = newTitle.trim();\r\n                sjSaveToLocal();\r\n                if (isUserLoggedIn) sjSaveItinerary(true);\r\n            }\r\n\r\n            \/\/ Se mantiene confirmaci\u00f3n est\u00e9tica con SweetAlert2\r\n            function sjDeleteDay(dayId) {\r\n                Swal.fire({\r\n                    title: \"Delete Day?\",\r\n                    text: \"All activities for this day will be deleted.\",\r\n                    icon: 'warning',\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Yes, delete\",\r\n                    cancelButtonText: \"Cancel\",\r\n                    confirmButtonColor: '#ff4d4d'\r\n                }).then((result) => {\r\n                    if (result.isConfirmed) {\r\n                        sjState.days = sjState.days.filter(d => d.id !== dayId);\r\n                        sjRenderUI();\r\n                        sjSaveToLocal();\r\n                        if (isUserLoggedIn) sjSaveItinerary(true);\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/\/ Funci\u00f3n global para filtrar carruseles\r\n            window.sjFilterExperiences = function() {\r\n                const selectedConstellation = document.getElementById('sjConstellationFilter') ? document.getElementById('sjConstellationFilter').value : 'all';\r\n                const selectedCity = document.getElementById('sjCityFilter') ? document.getElementById('sjCityFilter').value : 'all';\r\n                \r\n                document.querySelectorAll('.sj-planner-city-block').forEach(block => {\r\n                    const blockConstellation = block.getAttribute('data-constellation');\r\n                    const blockCity = block.getAttribute('data-city');\r\n                    \r\n                    const matchConstellation = (selectedConstellation === 'all' || blockConstellation === selectedConstellation);\r\n                    const matchCity = (selectedCity === 'all' || blockCity === selectedCity);\r\n                    \r\n                    if (matchConstellation && matchCity) {\r\n                        block.style.display = 'block';\r\n                    } else {\r\n                        block.style.display = 'none';\r\n                    }\r\n                });\r\n            };\r\n\r\n            \/\/ \u2500\u2500 CARRUSEL DE EXPERIENCIAS \u2500\u2500\r\n            function sjAddCard(dayId) {\r\n                if (!sjPlannerExperiences || sjPlannerExperiences.length === 0) {\r\n                    sjAddCardFreeText(dayId);\r\n                    return;\r\n                }\r\n\r\n                \/\/ Extraer constelaciones \u00fanicas para el filtro\r\n                const constellations = new Set();\r\n                const countries = new Set();\r\n                sjPlannerExperiences.forEach(c => {\r\n                    if (c.constellation) constellations.add(c.constellation);\r\n                    if (c.country) countries.add(c.country);\r\n                });\r\n                \r\n                let filterHtml = '<div style=\"display:flex; gap:10px;\">';\r\n                if (constellations.size > 0) {\r\n                    filterHtml += `<select id=\"sjConstellationFilter\" class=\"sj-planner-filter-select\" style=\"flex:1; padding-right:32px;\" onchange=\"sjFilterExperiences()\">\r\n                        <option value=\"all\">Continents<\/option>`;\r\n                    constellations.forEach(cons => { filterHtml += `<option value=\"${cons}\">${cons}<\/option>`; });\r\n                    filterHtml += `<\/select>`;\r\n                }\r\n                \r\n                const uniqueCities = new Set();\r\n                sjPlannerExperiences.forEach(c => {\r\n                    if (c.city) uniqueCities.add(c.city);\r\n                });\r\n                if (uniqueCities.size > 0) {\r\n                    filterHtml += `<select id=\"sjCityFilter\" class=\"sj-planner-filter-select\" style=\"flex:1; padding-right:32px;\" onchange=\"sjFilterExperiences()\">\r\n                        <option value=\"all\">Cities<\/option>`;\r\n                    uniqueCities.forEach(city => { filterHtml += `<option value=\"${city}\">${city}<\/option>`; });\r\n                    filterHtml += `<\/select>`;\r\n                }\r\n                filterHtml += '<\/div>';\r\n\r\n                \/\/ Construir HTML del carrusel agrupado por ciudad\r\n                let carouselHtml = '<div style=\"max-height:62vh; overflow-y:auto; padding:4px 6px 10px; overflow-x:hidden;\">';\r\n                \r\n                carouselHtml += filterHtml;\r\n\r\n                sjPlannerExperiences.forEach((cityData, index) => {\r\n                    if (!cityData.experiences || cityData.experiences.length === 0) return;\r\n\r\n                    const safeConstellation = cityData.constellation || 'Global';\r\n\r\n                    carouselHtml += `<div class=\"sj-planner-city-block\" data-constellation=\"${safeConstellation}\" data-city=\"${cityData.city}\" style=\"margin-bottom:22px; position:relative;\">\r\n                        <div style=\"display:flex; align-items:center; gap:8px; margin-bottom:12px; padding-bottom:8px;\r\n                                    border-bottom:1px dashed rgba(25,59,51,0.15);\">\r\n                            <span style=\"font-size:13px;\">\ud83d\udccd<\/span>\r\n                            <span style=\"font-family:'Outfit',sans-serif; font-size:13px; font-weight:800;\r\n                                         color:#193B33; text-transform:uppercase; letter-spacing:0.8px;\">\r\n                                ${cityData.city}\r\n                            <\/span>\r\n                        <\/div>\r\n                        \r\n                        <div style=\"position:relative; padding: 0 5px;\">\r\n                            <button onclick=\"document.getElementById('sj-track-${index}').scrollBy({left:-220, behavior:'smooth'})\" \r\n                                style=\"position:absolute; left:0px; top:calc(50% - 20px); transform:translateY(-50%); z-index:2;\r\n                                width:34px; height:34px; border-radius:50%; background:linear-gradient(135deg,#F3D287,#E5C07B);\r\n                                border:none; color:#193B33 !important; box-shadow:0 4px 10px rgba(0,0,0,0.15); cursor:pointer;\r\n                                font-weight:bold; display:flex; align-items:center; justify-content:center; font-size:16px;\">\r\n                                <span class=\"dashicons dashicons-arrow-left-alt2\"><\/span>\r\n                            <\/button>\r\n                            \r\n                            <button onclick=\"document.getElementById('sj-track-${index}').scrollBy({left:220, behavior:'smooth'})\" \r\n                                style=\"position:absolute; right:0px; top:calc(50% - 20px); transform:translateY(-50%); z-index:2;\r\n                                width:34px; height:34px; border-radius:50%; background:linear-gradient(135deg,#F3D287,#E5C07B);\r\n                                border:none; color:#193B33 !important; box-shadow:0 4px 10px rgba(0,0,0,0.15); cursor:pointer;\r\n                                font-weight:bold; display:flex; align-items:center; justify-content:center; font-size:16px;\">\r\n                                <span class=\"dashicons dashicons-arrow-right-alt2\"><\/span>\r\n                            <\/button>\r\n\r\n                            <div id=\"sj-track-${index}\" class=\"sj-planner-track\" style=\"display:flex; gap:12px; overflow-x:auto;\r\n                                scroll-snap-type:x mandatory; padding-bottom:10px; scrollbar-width:none; -ms-overflow-style:none; padding: 0 20px;\">`;\r\n\r\n                    cityData.experiences.forEach(exp => {\r\n                        const badgeIcons   = { free: '\ud83d\udfe2', secret: '\ud83d\udddd\ufe0f', premium: '\ud83d\udc51' };\r\n                        const badgeColors  = { free: '#7BA591', secret: '#E8C57D', premium: '#b8860b' };\r\n                        const badgeLabels  = {\r\n                            free:    'Libre',\r\n                            secret:  'Secret',\r\n                            premium: 'Premium'\r\n                        };\r\n                        const bIcon  = badgeIcons[exp.badge]  || '\ud83d\udfe2';\r\n                        const bColor = badgeColors[exp.badge] || '#7BA591';\r\n                        const bLabel = badgeLabels[exp.badge] || exp.badge;\r\n                        const imgStyle = exp.image\r\n                            ? `background-image:url(${exp.image}); background-size:cover; background-position:center;`\r\n                            : 'background:#e8f0ec;';\r\n\r\n                        const safeTitle = exp.title.replace(\/'\/g, \"\\\\'\").replace(\/\"\/g, '&quot;');\r\n                        const safeUrl   = exp.url;\r\n\r\n                        carouselHtml += `\r\n                            <div class=\"sj-planner-slide\" style=\"flex:0 0 220px; scroll-snap-align:start;\">\r\n                                <div class=\"sj-planner-card\" style=\"background:linear-gradient(160deg,#18241e,#0d1411);\r\n                                    border-radius:14px; border:1px solid rgba(123,165,145,0.2);\r\n                                    box-shadow:0 4px 15px rgba(0,0,0,0.18); overflow:hidden;\r\n                                    display:flex; flex-direction:column; height:100%;\">\r\n                                    <div style=\"height:130px; position:relative; ${imgStyle}\">\r\n                                        <div style=\"position:absolute; inset:0;\r\n                                            background:linear-gradient(to top,rgba(13,20,17,0.85),transparent);\">\r\n                                        <\/div>\r\n                                        <div style=\"position:absolute; top:8px; right:8px; font-size:0.65rem;\r\n                                            font-weight:800; text-transform:uppercase; border-radius:12px; padding:3px 8px;\r\n                                            display:flex; align-items:center; gap:4px;\r\n                                            background:rgba(0,0,0,0.55); color:${bColor};\r\n                                            border:1px solid ${bColor}; backdrop-filter:blur(4px);\">\r\n                                            ${bIcon} ${bLabel}\r\n                                        <\/div>\r\n                                    <\/div>\r\n\r\n                                    <!-- Body -->\r\n                                    <div style=\"padding:12px; flex-grow:1; display:flex; flex-direction:column; gap:6px;\">\r\n                                        <div style=\"font-family:'Outfit',sans-serif; font-size:0.9rem;\r\n                                            font-weight:700; color:#f8fafc; line-height:1.3;\r\n                                            overflow:hidden; display:-webkit-box;\r\n                                            -webkit-line-clamp:2; -webkit-box-orient:vertical;\">\r\n                                            ${exp.title}\r\n                                        <\/div>\r\n                                        <div style=\"display:flex; gap:10px; font-size:0.75rem;\r\n                                            color:#9cb8ad; margin-top:auto; padding-top:8px;\r\n                                            border-top:1px dashed rgba(123,165,145,0.2);\">\r\n                                            <span>\ud83d\udd50 ${exp.duration} min<\/span>\r\n                                            <span>\u2b50 ${exp.xp} XP<\/span>\r\n                                        <\/div>\r\n                                    <\/div>\r\n\r\n                                    <!-- 2 Botones -->\r\n                                    <div style=\"display:flex; gap:6px; padding:0 12px 12px;\">\r\n                                        <button\r\n                                            onclick=\"sjAddExperienceCard('${dayId}', ${exp.id}, '${safeTitle}', '${exp.image}', '${safeUrl}')\"\r\n                                            style=\"flex:1; background:#193B33; color:#E8C57D; border:1px solid rgba(232,197,125,0.4);\r\n                                                border-radius:20px; padding:7px 4px; font-size:0.75rem;\r\n                                                font-weight:700; cursor:pointer; font-family:'Outfit',sans-serif;\r\n                                                transition:background 0.2s;\">\r\n                                            Add                                        <\/button>\r\n                                        <a href=\"${safeUrl}\" target=\"_blank\"\r\n                                            style=\"flex:1; background:rgba(255,255,255,0.06); color:#a3c4b5;\r\n                                                border:1px solid rgba(123,165,145,0.25); border-radius:20px;\r\n                                                padding:7px 4px; font-size:0.75rem; font-weight:700;\r\n                                                text-align:center; text-decoration:none; font-family:'Outfit',sans-serif;\r\n                                                transition:background 0.2s;\">\r\n                                            Discover                                        <\/a>\r\n                                    <\/div>\r\n                                <\/div>\r\n                            <\/div>`;\r\n                    });\r\n\r\n                    carouselHtml += `<\/div><\/div><\/div>`;\r\n                });\r\n\r\n                carouselHtml += '<\/div>';\r\n\r\n                Swal.fire({\r\n                    title: \"What experience do you add?\",\r\n                    html: carouselHtml,\r\n                    showConfirmButton: false,\r\n                    showCancelButton: true,\r\n                    cancelButtonText: \"Enter your activity\",\r\n                    width: '680px',\r\n                    customClass: { popup: 'sj-solarpunk-popup', cancelButton: 'sj-swal-cancel-btn' },\r\n                    didOpen: () => {\r\n                        \/\/ Ocultar scrollbar en tracks internos\r\n                        document.querySelectorAll('.sj-planner-track').forEach(t => {\r\n                            t.style.setProperty('scrollbar-width', 'none');\r\n                        });\r\n                    }\r\n                }).then((result) => {\r\n                    if (result.isDismissed && result.dismiss === Swal.DismissReason.cancel) {\r\n                        sjAddCardFreeText(dayId);\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/\/ A\u00f1adir una experiencia oficial al d\u00eda del itinerario y solicitar bloque de tiempo\r\n            function sjAddExperienceCard(dayId, expId, expTitle, expImage, expUrl) {\r\n                Swal.close();\r\n                const cardObj = {\r\n                    id:         `c_${Date.now()}`,\r\n                    title:      expTitle,\r\n                    image:      expImage,\r\n                    officialId: expId,\r\n                    url:        expUrl\r\n                };\r\n                sjPromptTimeForCard(dayId, cardObj);\r\n            }\r\n\r\n            \/\/ Fallback: actividad libre (texto manual) y bloque de tiempo\r\n            function sjAddCardFreeText(dayId) {\r\n                Swal.fire({\r\n                    title: \"New Free Activity\",\r\n                    input: 'text',\r\n                    inputPlaceholder: \"E.g., Visit the Pantheon\",\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Following\",\r\n                    cancelButtonText: \"Cancel\",\r\n                    confirmButtonColor: '#193B33'\r\n                }).then((result) => {\r\n                    if (result.isConfirmed && result.value) {\r\n                        const cardObj = {\r\n                            id: `c_${Date.now()}`, \r\n                            title: result.value\r\n                        };\r\n                        sjPromptTimeForCard(dayId, cardObj);\r\n                    }\r\n                });\r\n            }\r\n\r\n            function sjPromptTimeForCard(dayId, cardObj) {\r\n                const membershipLevel = 0;\r\n                let htmlContent = '';\r\n                let footerContent = '';\r\n                \r\n                if (membershipLevel >= 1) {\r\n                    htmlContent = `\r\n                        <p style=\"font-size:14px; color:#555; margin-bottom:15px;\">Choose the exact time of your activity<\/p>\r\n                        <input type=\"time\" id=\"sjTimeInput\" class=\"sj-planner-filter-select\" style=\"max-width:200px; margin:0 auto; display:block;\">\r\n                    `;\r\n                } else {\r\n                    htmlContent = `\r\n                        <select id=\"sjTimeInput\" class=\"sj-planner-filter-select\" style=\"max-width:250px; margin:0 auto; display:block;\">\r\n                            <option value=\"morning\">Morning<\/option>\r\n                            <option value=\"afternoon\">Afternoon<\/option>\r\n                            <option value=\"night\">Night<\/option>\r\n                        <\/select>\r\n                    `;\r\n                    footerContent = `\r\n                        <div style=\"text-align:center; width:100%;\">\r\n                            <span class=\"sj-upsell-text\" style=\"display:block; margin-bottom:10px;\">\u2b50 Sync with Calendar and choose exact times with your Pass or Ultra membership.<\/span>\r\n                            <a href=\"https:\/\/spacejourney.app\/membership-levels\/\" target=\"_blank\" class=\"swal2-confirm swal2-styled\" style=\"display:inline-block; text-decoration:none; margin-top:10px; width:auto; font-size:1em; padding:12px 32px; border-radius:30px; font-weight:bold;\">Improve your plan<\/a>\r\n                        <\/div>\r\n                    `;\r\n                }\r\n\r\n                Swal.fire({\r\n                    title: \"Time Block\",\r\n                    html: htmlContent,\r\n                    footer: footerContent,\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"OK\",\r\n                    cancelButtonText: \"Cancel\",\r\n                    confirmButtonColor: '#8FD14F',\r\n                    customClass: { popup: 'sj-solarpunk-popup' },\r\n                    preConfirm: () => {\r\n                        const timeVal = document.getElementById('sjTimeInput').value;\r\n                        if (!timeVal) {\r\n                            Swal.showValidationMessage(\"Choose a time\");\r\n                        }\r\n                        return timeVal;\r\n                    }\r\n                }).then((timeResult) => {\r\n                    if (timeResult.isConfirmed && timeResult.value) {\r\n                        const day = sjState.days.find(d => d.id === dayId);\r\n                        if (!day) return;\r\n                        \r\n                        cardObj.timeMode = timeResult.value;\r\n                        day.cards.push(cardObj);\r\n                        \r\n                        if (typeof sjSortDayCards === 'function') sjSortDayCards(day);\r\n                        \r\n                        sjRenderUI();\r\n                        sjSaveToLocal();\r\n                        if (isUserLoggedIn) sjSaveItinerary(true);\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/\/ Correcci\u00f3n de bug de texto duplicado en edici\u00f3n inline\r\n            function sjUpdateCardTitle(dayId, cardId, newTitle) {\r\n                const day = sjState.days.find(d => d.id === dayId);\r\n                const card = day.cards.find(c => c.id === cardId);\r\n                if (card) card.title = newTitle.trim();\r\n                sjRenderUI(); \/\/ Re-render para evaluar el Sparkle Upsell\r\n                sjSaveToLocal();\r\n                if (isUserLoggedIn) sjSaveItinerary(true);\r\n            }\r\n\r\n            function sjDeleteCard(dayId, cardId) {\r\n                const day = sjState.days.find(d => d.id === dayId);\r\n                if (day) day.cards = day.cards.filter(c => c.id !== cardId);\r\n                sjRenderUI();\r\n                sjSaveToLocal();\r\n                if (isUserLoggedIn) sjSaveItinerary(true);\r\n            }\r\n\r\n            \/\/ 6. FLUJO DE GUARDADO (FREEMIUM VS PREMIUM)\r\n            function sjSaveToLocal() {\r\n                localStorage.setItem('sj_temp_itinerary', JSON.stringify(sjState));\r\n            }\r\n\r\n            \/\/ FUNCION AUXILIAR: ORDENAR TARJETAS POR HORA\r\n            function sjSortDayCards(day) {\r\n                if (!day || !day.cards) return;\r\n                const getTimeWeight = (timeMode) => {\r\n                    if (!timeMode || timeMode === '') return 9999; \/\/ Sin hora va al final\r\n                    if (timeMode === 'morning') return 8 * 60;\r\n                    if (timeMode === 'afternoon') return 14 * 60;\r\n                    if (timeMode === 'night') return 19 * 60;\r\n                    const parts = timeMode.split(':');\r\n                    if (parts.length === 2) return parseInt(parts[0]) * 60 + parseInt(parts[1]);\r\n                    return 9999;\r\n                };\r\n                day.cards.sort((a, b) => getTimeWeight(a.timeMode) - getTimeWeight(b.timeMode));\r\n            }\r\n\r\n            \/\/ BLOQUES DE TIEMPO EDITAR\r\n            function sjSetTimeMode(dayId, cardId) {\r\n                const day = sjState.days.find(d => d.id === dayId);\r\n                const card = day ? day.cards.find(c => c.id === cardId) : null;\r\n                const currentTime = card ? (card.timeMode || '') : '';\r\n                \r\n                const membershipLevel = 0;\r\n                let htmlContent = '';\r\n                let footerContent = '';\r\n                \r\n                if (membershipLevel >= 1) {\r\n                    htmlContent = `\r\n                        <p style=\"font-size:14px; color:#555; margin-bottom:15px;\">Choose the exact time of your activity<\/p>\r\n                        <input type=\"time\" id=\"sjTimeEditInput\" value=\"${currentTime}\" class=\"sj-planner-filter-select\" style=\"max-width:200px; margin:0 auto; display:block;\">\r\n                    `;\r\n                } else {\r\n                    htmlContent = `\r\n                        <select id=\"sjTimeEditInput\" class=\"sj-planner-filter-select\" style=\"max-width:250px; margin:0 auto; display:block;\">\r\n                            <option value=\"morning\" ${currentTime === 'morning' ? 'selected' : ''}>Morning<\/option>\r\n                            <option value=\"afternoon\" ${currentTime === 'afternoon' ? 'selected' : ''}>Afternoon<\/option>\r\n                            <option value=\"night\" ${currentTime === 'night' ? 'selected' : ''}>Night<\/option>\r\n                            <option value=\"\" ${currentTime === '' ? 'selected' : ''}>Unassigned<\/option>\r\n                        <\/select>\r\n                    `;\r\n                    footerContent = `\r\n                        <div style=\"text-align:center; width:100%;\">\r\n                            <span class=\"sj-upsell-text\" style=\"display:block; margin-bottom:10px;\">\u2b50 Sync with Calendar and choose exact times with your Pass or Ultra membership.<\/span>\r\n                            <a href=\"https:\/\/spacejourney.app\/membership-levels\/\" target=\"_blank\" class=\"swal2-confirm swal2-styled\" style=\"display:inline-block; text-decoration:none; margin-top:10px; width:auto; font-size:1em; padding:12px 32px; border-radius:30px; font-weight:bold;\">Improve your plan<\/a>\r\n                        <\/div>\r\n                    `;\r\n                }\r\n\r\n                Swal.fire({\r\n                    title: \"Time Block\",\r\n                    html: htmlContent,\r\n                    footer: footerContent,\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Apply\",\r\n                    cancelButtonText: \"Cancel\",\r\n                    confirmButtonColor: '#8FD14F',\r\n                    customClass: { popup: 'sj-solarpunk-popup' },\r\n                    preConfirm: () => {\r\n                        return document.getElementById('sjTimeEditInput').value;\r\n                    }\r\n                }).then((result) => {\r\n                    if (result.isConfirmed) {\r\n                        const day = sjState.days.find(d => d.id === dayId);\r\n                        const card = day.cards.find(c => c.id === cardId);\r\n                        if (card) card.timeMode = result.value;\r\n                        sjSortDayCards(day);\r\n                        sjRenderUI();\r\n                        sjSaveToLocal();\r\n                        if (isUserLoggedIn) sjSaveItinerary(true);\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/\/ UPSELL PREMIUM (Calendar y PDF)\r\n            function sjPremiumUpsell(action) {\r\n                Swal.fire({\r\n                    title: \"Unlock horological precision\",\r\n                    html: \"With Pass and Ultra memberships you can get the most out of every moment. You will assign specific times and can export your trip to Calendar.\",\r\n                    icon: 'star',\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"View Memberships\",\r\n                    cancelButtonText: \"Later\",\r\n                    customClass: { popup: 'sj-solarpunk-popup', confirmButton: 'swal2-confirm' }\r\n                }).then((res) => {\r\n                    if (res.isConfirmed) {\r\n                        window.location.href = '\/membership-levels\/';\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/\/ CARGA Y SELECTOR DE VIAJES\r\n            function sjFetchSingleItinerary(itineraryId) {\r\n                const loadData = new URLSearchParams();\r\n                loadData.append('action', 'sj_load_itinerary');\r\n                loadData.append('security', securityNonce);\r\n                loadData.append('itinerary_id', itineraryId);\r\n                loadData.append('ts', Date.now()); \/\/ Fallo temporal anti-cach\u00e9 de CDN\/WP\r\n\r\n                fetch(ajaxUrl, { method: 'POST', body: loadData })\r\n                    .then(r => r.text()) \/\/ Primero extraemos el texto para evitar crashes por PHP notices\r\n                    .then(text => {\r\n                        let resLoad;\r\n                        try { resLoad = JSON.parse(text); } catch (ex) { console.error(\"Respuesta no JSON\", text); }\r\n\r\n                        if (resLoad && resLoad.success && resLoad.data.data) {\r\n                            try {\r\n                                const cloudData = JSON.parse(resLoad.data.data);\r\n                                if (cloudData.days) {\r\n                                    sjState = cloudData;\r\n                                    sjState.title = resLoad.data.title || sjState.title;\r\n                                    sjState.id = parseInt(resLoad.data.itinerary_id || itineraryId);\r\n                                    sjState.cityId = resLoad.data.city_id ? parseInt(resLoad.data.city_id) : (sjState.cityId || 0);\r\n                                    sjState.startDate = resLoad.data.start_date || sjState.startDate || '';\r\n                                    sjState.endDate = resLoad.data.end_date || sjState.endDate || '';\r\n                                }\r\n                            } catch (e) { console.error(\"Error parseando Nube interior:\", e); }\r\n                        }\r\n                        sjRenderUI();\r\n                        Swal.close();\r\n                    })\r\n                    .catch(e => {\r\n                        console.error(\"Fetch Error:\", e);\r\n                        sjRenderUI();\r\n                        Swal.close();\r\n                    });\r\n            }\r\n\r\n\r\n            function sjGoToDashboard() {\r\n                localStorage.removeItem('sj_last_active_trip');\r\n                sjState = { id: 0, isDashboard: true, title: \"My Trips\", days: [] };\r\n                sjRenderUI();\r\n            }\r\n\r\n            function sjSwitchTripGrid(id) {\r\n                Swal.close();\r\n                if (id !== 'new') {\r\n                    localStorage.setItem('sj_last_active_trip', id);\r\n                }\r\n                Swal.fire({ title: \"Loading trip...\", allowOutsideClick: false, didOpen: () => { Swal.showLoading(); } });\r\n                sjFetchSingleItinerary(id);\r\n            }\r\n\r\n            function sjSwitchTrip() {\r\n                const selector = document.getElementById('sjTripSelector');\r\n                if (selector && selector.value && selector.value !== 'new') {\r\n                    localStorage.setItem('sj_last_active_trip', selector.value);\r\n                }\r\n                Swal.fire({ title: \"Loading trip...\", allowOutsideClick: false, didOpen: () => { Swal.showLoading(); } });\r\n                sjFetchSingleItinerary(selector.value);\r\n            }\r\n\r\n            function sjOpenTripSettings() {\r\n                Swal.fire({\r\n                    title: \"My trip settings\",\r\n                    html: `\r\n                    <div style=\"text-align:left; margin-bottom:25px;\">\r\n                        <label style=\"font-weight:bold; font-size:14px; margin-bottom:8px; display:block; color:var(--sj-text);\">Trip name<\/label>\r\n                        <input type=\"text\" id=\"sjSettingsTitle\" class=\"sj-trip-input\" style=\"width:100%; font-size:16px; padding:12px; border-radius:12px; border:1px solid var(--sj-border); box-sizing:border-box;\" value=\"${sjState.title}\">\r\n                        <input type=\"hidden\" id=\"sjSettingsCover\" value=\"${sjState.coverImage || ''}\">\r\n                    <\/div>\r\n                    \r\n                    <div style=\"text-align:center; padding-top:20px; border-top:1px solid var(--sj-border);\">\r\n                        <button onclick=\"Swal.close(); sjDeleteCurrentTrip();\" class=\"sj-btn sj-btn-secondary\" style=\"border-color:#ff4d4d; color:#ff4d4d;\">\r\n                            <span class=\"dashicons dashicons-trash\"><\/span> Delete this trip                        <\/button>\r\n                    <\/div>\r\n                `,\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Save Changes\",\r\n                    cancelButtonText: \"Cancel\",\r\n                    customClass: {\r\n                        popup: 'sj-solarpunk-popup',\r\n                        confirmButton: 'sj-btn sj-btn-primary',\r\n                        cancelButton: 'sj-btn sj-btn-gold',\r\n                        actions: 'sj-swal-actions'\r\n                    },\r\n                    buttonsStyling: false,\r\n                    preConfirm: () => {\r\n                        const title = document.getElementById('sjSettingsTitle').value.trim();\r\n                        const cover = document.getElementById('sjSettingsCover').value.trim();\r\n                        if (!title) {\r\n                            Swal.showValidationMessage(\"The name is required.\");\r\n                            return false;\r\n                        }\r\n                        return { title: title, coverImage: cover };\r\n                    }\r\n                }).then((result) => {\r\n                    if (result.isConfirmed) {\r\n                        sjState.title = result.value.title;\r\n                        sjState.coverImage = result.value.coverImage;\r\n                        sjRenderUI();\r\n                        sjSaveToLocal();\r\n                        if (isUserLoggedIn) sjSaveItinerary(true);\r\n\r\n                        \/\/ Actualizar nombre en el selector (si existe)\r\n                        const selector = document.getElementById('sjTripSelector');\r\n                        if (selector) {\r\n                            for (let i = 0; i < selector.options.length; i++) {\r\n                                if (selector.options[i].value == sjState.id) {\r\n                                    selector.options[i].text = sjState.title;\r\n                                    break;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                });\r\n            }\r\n\r\n            function sjCreateNewTrip() {\r\n                const membershipLevel = 0;\r\n                const tripCount = window.sjAvailableTrips ? window.sjAvailableTrips.length : 0;\r\n\r\n                if (!isUserLoggedIn && tripCount >= 1) {\r\n                    Swal.fire({\r\n                        title: \"Sign in to save more\",\r\n                        text: \"You have reached the limit for itineraries without an account. Sign up for free to create more adventures.\",\r\n                        icon: \"info\",\r\n                        showCancelButton: true,\r\n                        confirmButtonText: \"Create Account\",\r\n                        cancelButtonText: \"Cancel\",\r\n                        customClass: { popup: 'sj-solarpunk-popup', confirmButton: 'swal2-confirm', cancelButton: 'swal2-cancel' }\r\n                    }).then((r) => { if (r.isConfirmed) window.location.href = '\/acceso'; });\r\n                    return;\r\n                }\r\n\r\n                if (isUserLoggedIn && membershipLevel === 0 && tripCount >= 2) {\r\n                    sjPremiumUpsell('limit_free');\r\n                    return;\r\n                }\r\n\r\n                if (isUserLoggedIn && membershipLevel === 1 && tripCount >= 6) {\r\n                    sjPremiumUpsell('limit_pass');\r\n                    return;\r\n                }\r\n\r\n                sjState = { id: 0, title: \"New Trip\", coverImage: \"\", days: [] };\r\n                sjRenderUI();\r\n                sjSaveToLocal();\r\n                setTimeout(() => { sjOpenTripSettings(); }, 100);\r\n            }\r\n\r\n            function sjDeleteCurrentTrip() {\r\n                const deletedId = sjState.id;\r\n                if (sjState.id == 0 || !sjState.id) {\r\n                    \/\/ Es un viaje nuevo que ni siquiera est\u00e1 guardado en base de datos.\r\n                    sjCreateNewTrip();\r\n                    Swal.fire(\"Discarded\", \"The current trip was empty and has been reset.\", 'info');\r\n                    return;\r\n                }\r\n\r\n                Swal.fire({\r\n                    title: \"Are you sure?\",\r\n                    text: \"This action will permanently delete the trip from your account.\",\r\n                    icon: 'warning',\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Yes, delete trip\",\r\n                    cancelButtonText: \"Cancel\",\r\n                    confirmButtonColor: '#ff4d4d',\r\n                    customClass: {\r\n                        popup: 'sj-solarpunk-popup',\r\n                        confirmButton: 'sj-btn sj-btn-danger',\r\n                        cancelButton: 'sj-btn sj-btn-secondary',\r\n                        actions: 'sj-swal-actions'\r\n                    },\r\n                    buttonsStyling: false\r\n                }).then((result) => {\r\n                    if (result.isConfirmed) {\r\n                        Swal.fire({ title: \"Deleting...\", allowOutsideClick: false, didOpen: () => { Swal.showLoading(); } });\r\n\r\n                        const formData = new URLSearchParams();\r\n                        formData.append('action', 'sj_delete_itinerary');\r\n                        formData.append('security', securityNonce);\r\n                        formData.append('itinerary_id', sjState.id);\r\n\r\n                        fetch(ajaxUrl, { method: 'POST', body: formData })\r\n                            .then(res => res.json())\r\n                            .then(response => {\r\n                                \/\/ FORZAMOS LA ELIMINACI\u00d3N FRONTEND INCLUSO SI EL BACKEND FALLA\r\n                                \/\/ Esto arregla el bug \"El bot\u00f3n de eliminar no funciona, esa informaci\u00f3n persiste\"\r\n\r\n                                sjState = { id: 0, title: \"New Trip\", days: [] };\r\n                                document.getElementById('sjTripSelector').innerHTML = '';\r\n                                sjRenderUI();\r\n                                localStorage.removeItem('sj_temp_itinerary');\r\n\r\n                                let deletedCache = localStorage.getItem('sj_deleted_trips');\r\n                                let deletedIds = deletedCache ? JSON.parse(deletedCache) : [];\r\n                                if (!deletedIds.includes(parseInt(deletedId))) {\r\n                                    deletedIds.push(parseInt(deletedId));\r\n                                }\r\n                                localStorage.setItem('sj_deleted_trips', JSON.stringify(deletedIds));\r\n\r\n                                if (localStorage.getItem('sj_last_active_trip') == deletedId) {\r\n                                    localStorage.removeItem('sj_last_active_trip');\r\n                                }\r\n\r\n                                if (response.success || (response.data && response.data.message && response.data.message.indexOf('no te pertenece') !== -1)) {\r\n                                    Swal.fire(\"Deleted!\", \"The trip has been successfully deleted.\", 'success').then(() => {\r\n                                        sjLoadItinerary(deletedId);\r\n                                    });\r\n                                } else {\r\n                                    \/\/ Si el backend dio error pero el frontend lo ocult\u00f3, mostramos un warning sutil\r\n                                    Swal.fire(\"Trip Removed\", \"The trip was removed from your view, although the server reported a minor issue.\", 'info').then(() => {\r\n                                        sjLoadItinerary(deletedId);\r\n                                    });\r\n                                }\r\n                            })\r\n                            .catch(e => {\r\n                                console.error('Error SJ:', e);\r\n                                Swal.fire(\"Oops...\", \"Error connecting to the server.\", 'error');\r\n                            });\r\n                    }\r\n                });\r\n            }\r\n\r\n            function sjLoadItinerary(excludeId = null) {\r\n                \/\/ 1. Casos Especiales (Freemium & Clonado PLG)\r\n                const intent = localStorage.getItem('sj_intent');\r\n\r\n                \/\/ CASO A: Clonado de itinerario compartido\r\n                if (intent === 'clone_itinerary') {\r\n                    const cloneToken = localStorage.getItem('sj_clone_token');\r\n                    if (cloneToken) {\r\n                        Swal.fire({ title: \"Cloning adventure...\", allowOutsideClick: false, didOpen: () => { Swal.showLoading(); } });\r\n                        const cloneData = new URLSearchParams();\r\n                        cloneData.append('action', 'sj_clone_shared_itinerary');\r\n                        cloneData.append('security', '4d3e39295e');\r\n                        cloneData.append('token', cloneToken);\r\n                        \r\n                        fetch(ajaxUrl, { method: 'POST', body: cloneData })\r\n                            .then(res => res.json())\r\n                            .then(res => {\r\n                                if (res.success && res.data && res.data.data_json) {\r\n                                    try {\r\n                                        sjState = JSON.parse(res.data.data_json);\r\n                                        sjState.id = 0; \/\/ Forzamos a que sea un viaje nuevo\r\n                                        sjState.title = sjState.title + ' (Clone)';\r\n                                        sjRenderUI();\r\n                                        \r\n                                        localStorage.removeItem('sj_intent');\r\n                                        localStorage.removeItem('sj_clone_token');\r\n                                        \r\n                                        \/\/ Auto-guardar si el usuario ya est\u00e1 conectado\r\n                                        if (isUserLoggedIn) {\r\n                                            sjSaveItinerary(true); \/\/ silencioso\r\n                                            Swal.fire(\"Cloned Itinerary!\", \"The route has been successfully cloned and saved to your account.\", \"success\");\r\n                                        } else {\r\n                                            Swal.fire(\"Cloned Itinerary!\", \"You can edit it right now. Remember to create your account to save it permanently.\", \"success\");\r\n                                        }\r\n                                    } catch(e) {\r\n                                        console.error('Error parsing cloned itinerary:', e);\r\n                                        Swal.fire(\"Oops...\", \"There was an error processing the cloned itinerary.\", \"error\");\r\n                                    }\r\n                                } else {\r\n                                    Swal.fire(\"Oops...\", res.data?.message || \"The itinerary could not be cloned. The link may not be valid.\", \"error\");\r\n                                }\r\n                                localStorage.removeItem('sj_intent');\r\n                                localStorage.removeItem('sj_clone_token');\r\n                            })\r\n                            .catch(e => {\r\n                                console.error('Error cloning:', e);\r\n                                Swal.fire(\"Oops...\", \"Network error when trying to clone the itinerary.\", \"error\");\r\n                                localStorage.removeItem('sj_intent');\r\n                                localStorage.removeItem('sj_clone_token');\r\n                            });\r\n                        return; \/\/ Detenemos la carga normal\r\n                    }\r\n                }\r\n                \/\/ CASO B: Viene de registrarse para guardar su viaje local\r\n                if (intent === 'save_itinerary' && isUserLoggedIn) {\r\n                    let savedData = localStorage.getItem('sj_temp_itinerary');\r\n                    if (savedData) {\r\n                        sjState = JSON.parse(savedData);\r\n                        sjRenderUI();\r\n                        localStorage.removeItem('sj_intent');\r\n                        sjSaveItinerary();\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                \/\/ 2. Si es Guest, usamos su memoria local\r\n                if (!isUserLoggedIn) {\r\n                    let savedData = localStorage.getItem('sj_temp_itinerary');\r\n                    if (savedData) sjState = JSON.parse(savedData);\r\n                    sjRenderUI();\r\n                    return;\r\n                }\r\n\r\n                \/\/ 3. \u00a1EL VIAJERO EST\u00c1 LOGUEADO! -> Halar la Nube.\r\n                Swal.fire({ title: \"Loading itineraries...\", allowOutsideClick: false, didOpen: () => { Swal.showLoading(); } });\r\n\r\n                \/\/ Primero pedimos la lista para poblar el SELECTOR DE VIAJES\r\n                const listData = new URLSearchParams();\r\n                listData.append('action', 'sj_get_user_itineraries');\r\n                listData.append('security', '4d3e39295e'); \/\/ Usamos el nonce del satelite para pedir la lista\r\n                listData.append('ts', Date.now()); \/\/ Contra-medida rigurosa para evitar cach\u00e9s de listado\r\n\r\n                fetch(ajaxUrl, { method: 'POST', body: listData })\r\n                    .then(res => res.text())\r\n                    .then(text => {\r\n                        let resList;\r\n                        try { resList = JSON.parse(text); } catch (ex) { console.error(\"Error de lista\", text); }\r\n\r\n                        if (resList && resList.success) {\r\n                            \/\/ 1. Blacklist Frontend para Evitar Caching Fantasma en Backend\r\n                            let deletedCache = localStorage.getItem('sj_deleted_trips');\r\n                            if (deletedCache) {\r\n                                try {\r\n                                    let deletedIds = JSON.parse(deletedCache);\r\n                                    resList.data = resList.data.filter(it => !deletedIds.includes(parseInt(it.id)));\r\n                                } catch (e) { }\r\n                            }\r\n                            if (excludeId) {\r\n                                resList.data = resList.data.filter(it => parseInt(it.id) !== parseInt(excludeId));\r\n                            }\r\n\r\n                            if (resList.data.length > 0) {\r\n                                window.sjAvailableTrips = resList.data.reverse();\r\n\r\n                                const btnMyTrips = document.getElementById('sjBtnMyTrips');\r\n                                if (btnMyTrips) btnMyTrips.style.display = 'flex';\r\n\r\n                                const btnNewTrip = document.getElementById('sjBtnNewTrip');\r\n                                if (btnNewTrip) btnNewTrip.style.display = 'inline-flex';\r\n\r\n                                const btnResetTrips = document.getElementById('sjBtnResetTrips');\r\n                                if (btnResetTrips) btnResetTrips.style.display = 'inline-flex';\r\n\r\n                                \/\/ Decidir qu\u00e9 viaje cargar. Si hay uno guardado en localStorage y es v\u00e1lido, lo cargamos.\r\n                                \/\/ De lo contrario, nos quedamos en el Dashboard (Grid view).\r\n                                const lastActiveId = localStorage.getItem('sj_last_active_trip');\r\n                                const hasLastActive = lastActiveId && window.sjAvailableTrips.some(it => parseInt(it.id) === parseInt(lastActiveId));\r\n\r\n                                if (hasLastActive) {\r\n                                    sjFetchSingleItinerary(lastActiveId);\r\n                                } else {\r\n                                    sjGoToDashboard();\r\n                                    Swal.close();\r\n                                }\r\n                            } else {\r\n                                \/\/ Est\u00e1 logueado pero no tiene viajes en la BD. Creamos uno limpio o carga local\r\n                                \/\/ Est logueado pero no tiene viajes en la BD. Creamos uno limpio o carga local\r\n                                sjState = { id: 0, title: \"New Trip\", days: [] };\r\n                                window.sjAvailableTrips = [];\r\n                                const btnMyTrips = document.getElementById('sjBtnMyTrips');\r\n                                if (btnMyTrips) {\r\n                                    btnMyTrips.style.display = 'none';\r\n                                }\r\n                                const btnNew = document.getElementById('sjBtnNewTrip');\r\n                                if (btnNew) btnNew.style.display = 'none';\r\n                                const btnReset = document.getElementById('sjBtnResetTrips');\r\n                                if (btnReset) btnReset.style.display = 'none'; \/\/ Si no hay viajes, no hay nada que borrar\r\n\r\n                                sjRenderUI();\r\n                                Swal.close();\r\n                            }\r\n                        } else {\r\n                            sjState = { id: 0, title: \"New Trip\", days: [] };\r\n                            sjRenderUI();\r\n                            Swal.close();\r\n                        }\r\n                    })\r\n                    .catch(e => {\r\n                        console.error(\"Fetch Exception:\", e);\r\n                        let savedData = localStorage.getItem('sj_temp_itinerary');\r\n                        if (savedData) sjState = JSON.parse(savedData);\r\n                        sjRenderUI();\r\n                        Swal.close();\r\n                    });\r\n            }\r\n\r\n            let isSavingNewTrip = false; \/\/ Candado para evitar duplicaci\u00f3n Asincr\u00f3nica de Viajes\r\n\r\n            function sjSaveItinerary(silent = false) {\r\n                sjSaveToLocal(); \/\/ Respaldar siempre local\r\n\r\n                if (!isUserLoggedIn) {\r\n                    if (!silent) {\r\n                        Swal.fire({\r\n                            title: \"Sign in to save\",\r\n                            text: \"Your itinerary is temporarily saved in this browser. To secure it in your account and access it from your phone, you need to register.\",\r\n                            icon: 'warning',\r\n                            confirmButtonText: \"Create free account\",\r\n                            confirmButtonColor: '#193B33'\r\n                        }).then((v) => {\r\n                            if (v.isConfirmed) {\r\n                                localStorage.setItem('sj_intent', 'save_itinerary');\r\n                                window.location.href = '\/acceso';\r\n                            }\r\n                        });\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                \/\/ Si es un viaje nuevo y ya est\u00e1 guardando, lo metemos en cola (Race condition fix)\r\n                if (sjState.id === 0 && isSavingNewTrip) {\r\n                    setTimeout(() => sjSaveItinerary(silent), 500);\r\n                    return;\r\n                }\r\n                if (sjState.id === 0) isSavingNewTrip = true;\r\n\r\n                const formData = new URLSearchParams();\r\n                formData.append('action', 'sj_save_itinerary');\r\n                formData.append('security', securityNonce);\r\n                formData.append('itinerary_id', sjState.id);\r\n                formData.append('title', sjState.title);\r\n                formData.append('itinerary_data', JSON.stringify(sjState));\r\n                formData.append('city_id', sjState.cityId || 0);\r\n                formData.append('start_date', sjState.startDate || '');\r\n                formData.append('end_date', sjState.endDate || '');\r\n\r\n                fetch(ajaxUrl, {\r\n                    method: 'POST',\r\n                    body: formData\r\n                })\r\n                    .then(res => res.json())\r\n                    .then(response => {\r\n                        if (response.success) {\r\n                            sjState.id = response.data.itinerary_id; \/\/ Actualizamos con ID de BD\r\n                            isSavingNewTrip = false; \/\/ Liberamos candado\r\n                            sjSaveToLocal();\r\n                            if (!silent) Swal.fire(\"Saved!\", response.data.message, 'success');\r\n                        } else {\r\n                            isSavingNewTrip = false;\r\n                            if (!silent) Swal.fire(\"Oops...\", response.data.message, 'error');\r\n                        }\r\n                    })\r\n                    .catch(error => {\r\n                        console.error('Error SJ:', error);\r\n                        isSavingNewTrip = false;\r\n                        if (!silent) Swal.fire(\"Oops...\", \"There was a communication failure.\", 'error');\r\n                    });\r\n            }\r\n\r\n            \/\/ 7. EXPORTACI\u00d3N ICS A CALENDAR\r\n            function sjExportToCalendar() {\r\n                if (!isUserLoggedIn) {\r\n                    \/\/ Upsell usual si es invitado\r\n                    sjPremiumUpsell('exportar');\r\n                    return;\r\n                }\r\n\r\n                if (sjState.id === 0) {\r\n                    Swal.fire(\"Not Saved!\", \"First, save your itinerary to your account before exporting it to your calendar.\", 'warning');\r\n                    return;\r\n                }\r\n\r\n                const membershipLevel = 0;\r\n                if (membershipLevel < 1) {\r\n                    sjPremiumUpsell('exportar');\r\n                    return;\r\n                }\r\n\r\n                let htmlContent = '<p style=\"font-size:14px; color:#555;\">Choose the first day of your trip. We will automatically sync all days to your Calendar.<\/p>';\r\n\r\n                Swal.fire({\r\n                    title: \"When does the trip start?\",\r\n                    html: htmlContent,\r\n                    input: 'date',\r\n                    inputAttributes: {\r\n                        'aria-label': \"Select your flight or start date\"\r\n                    },\r\n                    showCancelButton: true,\r\n                    confirmButtonText: '<span class=\"dashicons dashicons-calendar-alt\"><\/span> Download .ics',\r\n                    cancelButtonText: \"Cancel\",\r\n                    confirmButtonColor: '#8FD14F',\r\n                    customClass: { popup: 'sj-solarpunk-popup' },\r\n                    inputValidator: (value) => {\r\n                        if (!value) return \"I need a date to chart the stars!\";\r\n                    }\r\n                }).then((res) => {\r\n                    if (res.isConfirmed && res.value) {\r\n                        sjFireIcsExport(res.value);\r\n                    }\r\n                });\r\n            }\r\n\r\n            function sjFireIcsExport(startDate) {\r\n                Swal.fire({ title: \"Generating file...\", text: \"Building the calendar file.\", allowOutsideClick: false, didOpen: () => { Swal.showLoading(); } });\r\n\r\n                const formData = new URLSearchParams();\r\n                formData.append('action', 'sj_export_ics');\r\n                formData.append('security', securityNonce);\r\n                formData.append('itinerary_id', sjState.id);\r\n                formData.append('start_date', startDate);\r\n\r\n                fetch(ajaxUrl, {\r\n                    method: 'POST',\r\n                    body: formData\r\n                })\r\n                    .then(res => res.json())\r\n                    .then(response => {\r\n                        if (response.success && response.data.ics_data) {\r\n                            \/\/ Decodificar Base64 manteniendo compatibilidad UTF-8 (Tildes y e\u00f1es)\r\n                            const icsString = decodeURIComponent(escape(atob(response.data.ics_data)));\r\n                            const filename = response.data.filename || 'Mi-Viaje-Espacial.ics';\r\n                            const blob = new Blob([icsString], { type: 'text\/calendar;charset=utf-8' });\r\n                            \r\n                            function fallbackDownload(blobData, fname) {\r\n                                const link = document.createElement('a');\r\n                                link.href = window.URL.createObjectURL(blobData);\r\n                                link.download = fname;\r\n                                document.body.appendChild(link);\r\n                                link.click();\r\n                                document.body.removeChild(link);\r\n                                Swal.fire(\"Successful Export!\", \"Find the .ics calendar file in your Downloads and open it so your phone magically schedules the trip.\", 'success');\r\n                            }\r\n\r\n                            if (navigator.share && navigator.canShare) {\r\n                                const file = new File([blob], filename, { type: 'text\/calendar' });\r\n                                if (navigator.canShare({ files: [file] })) {\r\n                                    navigator.share({\r\n                                        title: \"My Space Trip\",\r\n                                        text: \"Here you have the file of your itinerary.\",\r\n                                        files: [file]\r\n                                    }).then(() => {\r\n                                        Swal.fire(\"Successful Export!\", \"Your itinerary has been sent to your calendar.\", 'success');\r\n                                    }).catch(err => {\r\n                                        fallbackDownload(blob, filename);\r\n                                    });\r\n                                } else {\r\n                                    fallbackDownload(blob, filename);\r\n                                }\r\n                            } else {\r\n                                fallbackDownload(blob, filename);\r\n                            }\r\n                        } else {\r\n                            Swal.fire(\"Temporary Error\", response.data ? response.data.message : \"Could not generate the ICS file.\", 'error');\r\n                        }\r\n                    })\r\n                    .catch(error => {\r\n                        console.error('Error ICS SJ:', error);\r\n                        Swal.fire(\"Oops...\", \"There was a communication failure with the server.\", 'error');\r\n                    });\r\n            }\r\n\r\n            \/\/ 8. ELIMINAR VIAJE (DEFINITIVO)\r\n            function sjResetAllTrips() {\r\n                if (!isUserLoggedIn) return;\r\n\r\n                Swal.fire({\r\n                    title: \"Delete ALL your trips?\",\r\n                    text: \"Danger! This action will permanently delete ALL trips from your account. You will not be able to recover them.\",\r\n                    icon: 'error',\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Yes, delete everything\",\r\n                    cancelButtonText: \"Keep them\",\r\n                    confirmButtonColor: '#ff0000'\r\n                }).then((result) => {\r\n                    if (result.isConfirmed) {\r\n                        Swal.fire({ title: \"Annihilating data...\", allowOutsideClick: false, didOpen: () => { Swal.showLoading(); } });\r\n\r\n                        const formData = new URLSearchParams();\r\n                        formData.append('action', 'sj_reset_all_itineraries');\r\n                        formData.append('security', securityNonce);\r\n\r\n                        fetch(ajaxUrl, { method: 'POST', body: formData })\r\n                            .then(res => res.json())\r\n                            .then(response => {\r\n                                if (response.success) {\r\n                                    localStorage.removeItem('sj_temp_itinerary');\r\n                                    Swal.fire(\"Clean Account!\", response.data.message, 'success').then(() => {\r\n                                        \/\/ Forzar reinicio de UI simulando que acabamos de borrar para que lo oculte todo\r\n                                        sjLoadItinerary(sjState.id);\r\n                                    });\r\n                                } else {\r\n                                    Swal.fire(\"Error\", response.data ? response.data.message : \"The operation was not completed.\", 'error');\r\n                                }\r\n                            })\r\n                            .catch(error => {\r\n                                console.error('Error ResetSJ:', error);\r\n                                Swal.fire(\"Oops...\", \"Critical failure when deleting trips.\", 'error');\r\n                            });\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/\/ 10. COMPARTIR VIAJE (ENLACE P\u00daBLICO)\r\n            function sjShareTrip() {\r\n                if (!isUserLoggedIn || sjState.id === 0) {\r\n                    Swal.fire({\r\n                        title: \"Save your adventure!\",\r\n                        text: \"To share your route with friends, you must first click Save to the Cloud to create your web link.\",\r\n                        icon: 'info',\r\n                        confirmButtonText: \"Got it\",\r\n                        confirmButtonColor: '#193B33'\r\n                    });\r\n                    return;\r\n                }\r\n\r\n                Swal.fire({ title: \"Generating magic link...\", allowOutsideClick: false, didOpen: () => { Swal.showLoading(); } });\r\n\r\n                const formData = new URLSearchParams();\r\n                formData.append('action', 'sj_share_itinerary');\r\n                formData.append('security', securityNonce);\r\n                formData.append('itinerary_id', sjState.id);\r\n\r\n                fetch(ajaxUrl, { method: 'POST', body: formData })\r\n                    .then(res => res.json())\r\n                    .then(response => {\r\n                        if (response.success && response.data.share_url) {\r\n                            const shareUrl = response.data.share_url;\r\n                            const shareTitle = sjState.title || \"My Space Journey Itinerary\";\r\n                            const shareText = \"Hi! I found this route on Space Journey and saved it to my planner. Take a look, we could use it as a reference: \ud83d\uddfa\ufe0f\ud83d\ude80\";\r\n\r\n                            \/\/ Cerrar el modal de carga actual\r\n                            Swal.close();\r\n\r\n                            \/\/ Si el motor global de compartir (Snippet 3661) est\u00e1 disponible, \u00fasalo!\r\n                            if (typeof window.sjOpenSharingModal === 'function') {\r\n                                window.sjOpenSharingModal(shareUrl, shareText, shareTitle);\r\n                            } else {\r\n                                \/\/ Fallback nativo o cl\u00e1sico por si el shortcode del motor no est\u00e1 en la p\u00e1gina\r\n                                if (navigator.share) {\r\n                                    navigator.share({\r\n                                        title: shareTitle,\r\n                                        text: shareText,\r\n                                        url: shareUrl,\r\n                                    }).then(() => Swal.close()).catch(() => {\r\n                                        Swal.fire({\r\n                                            title: \"Route Ready to Share!\",\r\n                                            html: `\r\n                                        <p style=\"font-size:14px; color:#555; margin-bottom:15px;\">Your friends will be able to see this itinerary from anywhere by interacting with this link:<\/p>\r\n                                        <input type=\"text\" id=\"sjShareLinkInput\" class=\"sj-trip-input\" value=\"${shareUrl}\" readonly style=\"text-align:center; background:#f0f0f0; margin-bottom:15px; width:90%;\">\r\n                                    `,\r\n                                            confirmButtonText: '<span class=\"dashicons dashicons-admin-page\"><\/span> Copy link',\r\n                                            confirmButtonColor: '#8FD14F',\r\n                                            customClass: { popup: 'sj-solarpunk-popup' },\r\n                                            preConfirm: () => {\r\n                                                const copyText = document.getElementById(\"sjShareLinkInput\");\r\n                                                copyText.select();\r\n                                                document.execCommand(\"copy\");\r\n                                                Swal.showValidationMessage(\"Link copied to clipboard!\");\r\n                                                return false;\r\n                                            }\r\n                                        });\r\n                                    });\r\n                                } else {\r\n                                    Swal.fire({\r\n                                        title: \"Route Ready to Share!\",\r\n                                        html: `\r\n                                    <p style=\"font-size:14px; color:#555; margin-bottom:15px;\">Your friends will be able to see this itinerary from anywhere by interacting with this link:<\/p>\r\n                                    <input type=\"text\" id=\"sjShareLinkInput\" class=\"sj-trip-input\" value=\"${shareUrl}\" readonly style=\"text-align:center; background:#f0f0f0; margin-bottom:15px; width:90%;\">\r\n                                    <button onclick=\"navigator.clipboard.writeText(document.getElementById('sjShareLinkInput').value); Swal.showValidationMessage('\u00a1Copiado el Enlace!');\" style=\"background:#193B33; color:white; border:none; padding:12px 24px; border-radius:30px; font-weight:600; cursor:pointer; font-size:15px; transition:0.3s;\"><span class=\"dashicons dashicons-admin-page\" style=\"vertical-align:middle; margin-right:5px;\"><\/span> Copy Link<\/button>\r\n                                `,\r\n                                        showConfirmButton: false,\r\n                                        showCloseButton: true,\r\n                                        customClass: { popup: 'sj-solarpunk-popup' }\r\n                                    });\r\n                                }\r\n                            }\r\n                        } else {\r\n                            Swal.fire(\"Error\", response.data ? response.data.message : \"Could not generate the link.\", 'error');\r\n                        }\r\n                    })\r\n                    .catch(error => {\r\n                        console.error('Error ShareSJ:', error);\r\n                        Swal.fire(\"Oops...\", \"Critical network failure.\", 'error');\r\n                    });\r\n            }\r\n        <\/script>\r\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e7e0379 e-flex e-con-boxed e-con e-parent\" data-id=\"e7e0379\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;shape_divider_top&quot;:&quot;split&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-shape elementor-shape-top\" aria-hidden=\"true\" data-negative=\"false\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1000 20\" preserveAspectRatio=\"none\">\n\t<path class=\"elementor-shape-fill\" d=\"M0,0v3c0,0,393.8,0,483.4,0c9.2,0,16.6,7.4,16.6,16.6c0-9.1,7.4-16.6,16.6-16.6C606.2,3,1000,3,1000,3V0H0z\"\/>\n<\/svg>\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f3bedb0 elementor-widget elementor-widget-heading\" data-id=\"f3bedb0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">How to organize a trip with our interactive itinerary creator?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-703d7f2 e-flex e-con-boxed e-con e-parent\" data-id=\"703d7f2\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-2168c26 e-con-full e-flex e-con e-child\" data-id=\"2168c26\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-721ffc2 elementor-widget elementor-widget-heading\" data-id=\"721ffc2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">1. Choose your destination and name your adventure.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5f8bc92 elementor-widget elementor-widget-text-editor\" data-id=\"5f8bc92\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Whether you&#8217;re going to Rome, known as the Eternal City, or a more futuristic metropolis like Tokyo, <strong>give your trip a memorable name to start grouping incredible places.<\/strong><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-12d92f0 elementor-widget elementor-widget-heading\" data-id=\"12d92f0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">2. Add hidden days and experiences.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c717dc2 elementor-widget elementor-widget-text-editor\" data-id=\"c717dc2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Our drag-and-drop system allows you to <strong>organize your mornings, afternoons and evenings with precision.<\/strong> You can even browse our traveler platform and search for exclusive locations filtered by the <strong>Solarpunk<\/strong> essence that we love so much at <strong>Space Journey.<\/strong><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-550d039 elementor-widget elementor-widget-heading\" data-id=\"550d039\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">3. Personal care and Export to Calendar.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2c91fcf elementor-widget elementor-widget-text-editor\" data-id=\"2c91fcf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>No trip should exhaust your mental health. <strong>Synchronize your entire route directly to Apple or Google Calendar<\/strong> and dedicate yourself to <strong>enjoying the destination without looking at screens.<\/strong><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6eea7e8 elementor-widget elementor-widget-heading\" data-id=\"6eea7e8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">4. Get additional benefits with Space Journey during your trip.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-610f9e9 elementor-widget elementor-widget-text-editor\" data-id=\"610f9e9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>We <strong>already analyze and curate the ideal experiences for your trip<\/strong>, in each of your destinations. Using Space Journey, you can <strong>obtain Experience Points (XP) and Solar Coins (SC)<\/strong>, which you can use to <strong>redeem virtual and physical benefits with our network of allies.<\/strong> Additionally, you can unlock all the platform&#8217;s features for travelers with <strong>Space Journey Pass and Ultra.<\/strong><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c2ec2a6 e-con-full e-flex e-con e-child\" data-id=\"c2ec2a6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-15c1695 elementor-widget elementor-widget-image\" data-id=\"15c1695\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"683\" height=\"1024\" src=\"https:\/\/spacejourney.app\/wp-content\/uploads\/2026\/03\/cb0qrf8ib4i-683x1024.jpg\" class=\"attachment-large size-large wp-image-4441\" alt=\"Paris - Space Journey\" srcset=\"https:\/\/spacejourney.app\/wp-content\/uploads\/2026\/03\/cb0qrf8ib4i-683x1024.jpg 683w, https:\/\/spacejourney.app\/wp-content\/uploads\/2026\/03\/cb0qrf8ib4i-200x300.jpg 200w, https:\/\/spacejourney.app\/wp-content\/uploads\/2026\/03\/cb0qrf8ib4i-768x1152.jpg 768w, https:\/\/spacejourney.app\/wp-content\/uploads\/2026\/03\/cb0qrf8ib4i.jpg 800w\" sizes=\"(max-width: 683px) 100vw, 683px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-80ef090 e-flex e-con-boxed e-con e-parent\" data-id=\"80ef090\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;shape_divider_top&quot;:&quot;split&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-shape elementor-shape-top\" aria-hidden=\"true\" data-negative=\"false\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1000 20\" preserveAspectRatio=\"none\">\n\t<path class=\"elementor-shape-fill\" d=\"M0,0v3c0,0,393.8,0,483.4,0c9.2,0,16.6,7.4,16.6,16.6c0-9.1,7.4-16.6,16.6-16.6C606.2,3,1000,3,1000,3V0H0z\"\/>\n<\/svg>\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5f8f65a elementor-widget elementor-widget-heading\" data-id=\"5f8f65a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Trip Planner FAQ<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-be35be1 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"be35be1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3615e03 elementor-widget elementor-widget-n-accordion\" data-id=\"3615e03\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;max_items_expended&quot;:&quot;multiple&quot;,&quot;default_state&quot;:&quot;expanded&quot;,&quot;n_accordion_animation_duration&quot;:{&quot;unit&quot;:&quot;ms&quot;,&quot;size&quot;:400,&quot;sizes&quot;:[]}}\" data-widget_type=\"nested-accordion.default\">\n\t\t\t\t\t\t\t<div class=\"e-n-accordion\" aria-label=\"Accordion. Open links with Enter or Space, close with Escape, and navigate with Arrow Keys\">\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-5670\" class=\"e-n-accordion-item\" open>\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"1\" tabindex=\"0\" aria-expanded=\"true\" aria-controls=\"e-n-accordion-item-5670\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> Is it free to plan my trip with Space Journey? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-5670\" class=\"elementor-element elementor-element-c0cb88c e-con-full e-flex e-con e-child\" data-id=\"c0cb88c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-59890a3 elementor-widget elementor-widget-text-editor\" data-id=\"59890a3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Yes, our interactive itinerary creator allows you to design up to 3 trips completely free. By joining our community of Solarpunk travelers, you can save your routes securely in the cloud and share them with friends via a public link at no cost.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-5671\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"2\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-5671\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> Can I export my tourist itinerary to Google Calendar or PDF? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-5671\" class=\"elementor-element elementor-element-dbe1e11 e-flex e-con-boxed e-con e-child\" data-id=\"dbe1e11\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-15de72d elementor-widget elementor-widget-text-editor\" data-id=\"15de72d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Absolutely. The Space Journey trip planner has a premium Export feature that generates a universal (.ics) file. This format allows you to automatically synchronize all days and activities with Google Calendar, Apple Calendar or Outlook, keeping temporary notifications on your mobile to avoid delays and stress during your experience.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-5672\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"3\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-5672\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> What makes this route planner different from other travel engines? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-5672\" class=\"elementor-element elementor-element-2c02907 e-flex e-con-boxed e-con e-child\" data-id=\"2c02907\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f4734e0 elementor-widget elementor-widget-text-editor\" data-id=\"f4734e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Unlike massive planners, Space Journey does not seek to fill you with infinite options that cause paralysis by analysis (Cognitive Overload). Our engine prioritizes curated recommendations focused on the traveler&#8217;s mental well-being, places with climate resilience metrics, and authentic local experiences that support cultural conservation, under a Solarpunk philosophy.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d245352 elementor-widget elementor-widget-html\" data-id=\"d245352\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script type=\"application\/ld+json\">\r\n{\r\n  \"@context\": \"https:\/\/schema.org\",\r\n  \"@graph\": [\r\n    {\r\n      \"@type\": \"SoftwareApplication\",\r\n      \"name\": \"Space Journey Itinerary Planner\",\r\n      \"operatingSystem\": \"Web browser\",\r\n      \"applicationCategory\": \"TravelApplication\",\r\n      \"aggregateRating\": {\r\n        \"@type\": \"AggregateRating\",\r\n        \"ratingValue\": \"4.9\",\r\n        \"ratingCount\": \"184\"\r\n      },\r\n      \"offers\": {\r\n        \"@type\": \"Offer\",\r\n        \"price\": \"0\",\r\n        \"priceCurrency\": \"EUR\"\r\n      },\r\n      \"description\": \"Free, smart travel planner. Drag and drop experiences, save routes to the cloud, export them to Calendar, and share your public itineraries with friends under a Solarpunk and Reduced Cognitive Burden travel philosophy.\",\r\n      \"featureList\": [\r\n        \"Drag and drop travel itinerary builder\",\r\n        \"Export to Google Calendar and Apple Calendar (.ics)\",\r\n        \"Shareable public trip URLs\",\r\n        \"Cloud saving for registered users\"\r\n     ]\r\n    },\r\n    {\r\n      \"@type\": \"FAQPage\",\r\n      \"mainEntity\": [\r\n        {\r\n          \"@type\": \"Question\",\r\n          \"name\": \"Is it free to plan my trip with Space Journey?\",\r\n          \"acceptedAnswer\": {\r\n            \"@type\": \"Answer\",\r\n            \"text\": \"Yes, our interactive itinerary creator allows you to design up to 3 trips completely free. By joining our community, you can save your routes securely in the cloud and share them with friends.\"\r\n          }\r\n        },\r\n        {\r\n          \"@type\": \"Question\",\r\n          \"name\": \"Can I export my tourist itinerary to Google Calendar or PDF?\",\r\n          \"acceptedAnswer\": {\r\n            \"@type\": \"Answer\",\r\n            \"text\": \"Absolutely. Space Journey's travel planner has a premium Export feature that allows you to automatically sync all days and activities with Google Calendar, Apple Calendar, or Outlook.\"\r\n          }\r\n        }\r\n     ]\r\n    }\r\n ]\r\n}\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9eb5452 elementor-align-center elementor-mobile-align-center elementor-fixed elementor-invisible elementor-widget elementor-widget-button\" data-id=\"9eb5452\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;_position&quot;:&quot;fixed&quot;}\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm elementor-animation-bob\" href=\"#elementor-action%3Aaction%3Dpopup%3Aopen%26settings%3DeyJpZCI6NDU1MywidG9nZ2xlIjp0cnVlfQ%3D%3D\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-fingerprint\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M256.12 245.96c-13.25 0-24 10.74-24 24 1.14 72.25-8.14 141.9-27.7 211.55-2.73 9.72 2.15 30.49 23.12 30.49 10.48 0 20.11-6.92 23.09-17.52 13.53-47.91 31.04-125.41 29.48-224.52.01-13.25-10.73-24-23.99-24zm-.86-81.73C194 164.16 151.25 211.3 152.1 265.32c.75 47.94-3.75 95.91-13.37 142.55-2.69 12.98 5.67 25.69 18.64 28.36 13.05 2.67 25.67-5.66 28.36-18.64 10.34-50.09 15.17-101.58 14.37-153.02-.41-25.95 19.92-52.49 54.45-52.34 31.31.47 57.15 25.34 57.62 55.47.77 48.05-2.81 96.33-10.61 143.55-2.17 13.06 6.69 25.42 19.76 27.58 19.97 3.33 26.81-15.1 27.58-19.77 8.28-50.03 12.06-101.21 11.27-152.11-.88-55.8-47.94-101.88-104.91-102.72zm-110.69-19.78c-10.3-8.34-25.37-6.8-33.76 3.48-25.62 31.5-39.39 71.28-38.75 112 .59 37.58-2.47 75.27-9.11 112.05-2.34 13.05 6.31 25.53 19.36 27.89 20.11 3.5 27.07-14.81 27.89-19.36 7.19-39.84 10.5-80.66 9.86-121.33-.47-29.88 9.2-57.88 28-80.97 8.35-10.28 6.79-25.39-3.49-33.76zm109.47-62.33c-15.41-.41-30.87 1.44-45.78 4.97-12.89 3.06-20.87 15.98-17.83 28.89 3.06 12.89 16 20.83 28.89 17.83 11.05-2.61 22.47-3.77 34-3.69 75.43 1.13 137.73 61.5 138.88 134.58.59 37.88-1.28 76.11-5.58 113.63-1.5 13.17 7.95 25.08 21.11 26.58 16.72 1.95 25.51-11.88 26.58-21.11a929.06 929.06 0 0 0 5.89-119.85c-1.56-98.75-85.07-180.33-186.16-181.83zm252.07 121.45c-2.86-12.92-15.51-21.2-28.61-18.27-12.94 2.86-21.12 15.66-18.26 28.61 4.71 21.41 4.91 37.41 4.7 61.6-.11 13.27 10.55 24.09 23.8 24.2h.2c13.17 0 23.89-10.61 24-23.8.18-22.18.4-44.11-5.83-72.34zm-40.12-90.72C417.29 43.46 337.6 1.29 252.81.02 183.02-.82 118.47 24.91 70.46 72.94 24.09 119.37-.9 181.04.14 246.65l-.12 21.47c-.39 13.25 10.03 24.31 23.28 24.69.23.02.48.02.72.02 12.92 0 23.59-10.3 23.97-23.3l.16-23.64c-.83-52.5 19.16-101.86 56.28-139 38.76-38.8 91.34-59.67 147.68-58.86 69.45 1.03 134.73 35.56 174.62 92.39 7.61 10.86 22.56 13.45 33.42 5.86 10.84-7.62 13.46-22.59 5.84-33.43z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Itinerary Planner Design your perfect adventure in minutes. Add exclusive experiences, organize your days and export the route to your Calendar. Free and stress-free. Start planning Platform for travelers How to organize a trip with our interactive itinerary creator? 1. Choose your destination and name your adventure. Whether you&#8217;re going to Rome, known as the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4384,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"pmpro_default_level":"","footnotes":""},"class_list":["post-4439","page","type-page","status-publish","has-post-thumbnail","hentry","pmpro-has-access"],"acf":{"sj_mobile_hero":4385},"_links":{"self":[{"href":"https:\/\/spacejourney.app\/en\/wp-json\/wp\/v2\/pages\/4439","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spacejourney.app\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spacejourney.app\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spacejourney.app\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spacejourney.app\/en\/wp-json\/wp\/v2\/comments?post=4439"}],"version-history":[{"count":38,"href":"https:\/\/spacejourney.app\/en\/wp-json\/wp\/v2\/pages\/4439\/revisions"}],"predecessor-version":[{"id":7793,"href":"https:\/\/spacejourney.app\/en\/wp-json\/wp\/v2\/pages\/4439\/revisions\/7793"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/spacejourney.app\/en\/wp-json\/wp\/v2\/media\/4384"}],"wp:attachment":[{"href":"https:\/\/spacejourney.app\/en\/wp-json\/wp\/v2\/media?parent=4439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}