{"id":4351,"date":"2026-03-12T18:12:46","date_gmt":"2026-03-12T23:12:46","guid":{"rendered":"https:\/\/spacejourney.app\/planejador-de-viagens\/"},"modified":"2026-06-05T21:38:12","modified_gmt":"2026-06-06T02:38:12","slug":"planejador-de-viagens","status":"publish","type":"page","link":"https:\/\/spacejourney.app\/pt-br\/planejador-de-viagens\/","title":{"rendered":"Planejador de viagens"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4351\" class=\"elementor elementor-4351 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\">Planejador de viagens<\/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>Projete sua aventura perfeita em minutos. Adicione experi\u00eancias exclusivas, organize seus dias e exporte o percurso para seu Calend\u00e1rio. Gratuito e sem estresse.<\/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\">Comece a planejar<\/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\/pt-br\/\" 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\">Plataforma para viajantes<\/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\" id=\"planeje-sua-viagem\" 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                                Minhas Viagens<\/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> Nova Viagem                    <\/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> Salvar                    <\/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                        Exportar roteiro                    <\/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> Compartilhar minha rota                    <\/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                            Configura\u00e7\u00f5es da viagem                        <\/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                            Adicionar Dia                        <\/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: \"Nova Viagem\",\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\":\"Cidade do M\\u00e9xico\",\"slug\":\"cidade-do-mexico\",\"constellation\":\"Constela\\u00e7\\u00e3o das Am\\u00e9ricas\",\"country\":\"Mundo\",\"experiences\":[{\"id\":7251,\"title\":\"As Ilhas da CU | O campus que \\u00e9 patrim\\u00f4nio\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/as-ilhas-da-cu-o-campus-que-e-patrimonio\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/12570366-300x200.jpeg\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7253,\"title\":\"Parque M\\u00e9xico | O o\\u00e1sis el\\u00edptico da Condessa\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/parque-mexico-o-oasis-eliptico-da-condessa\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/220caf1f-dd6b-4972-bbf2-70818a5f0194-300x169.jpg\",\"duration\":\"60\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7255,\"title\":\"Quiosque Morisco | A joia geom\\u00e9trica de Santa Mar\\u00eda\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/quiosque-morisco-a-joia-geometrica-de-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\":7257,\"title\":\"Audiorama Chapultepec | O ref\\u00fagio do sil\\u00eancio no CDMX\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/audiorama-chapultepec-o-refugio-do-silencio-no-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\":7259,\"title\":\"Jardim Verde Roma | O laborat\\u00f3rio de resili\\u00eancia urbana\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/jardim-verde-roma-o-laboratorio-de-resiliencia-urbana\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/94d13783-3836-46ea-9987-eff60fbbf6e3-300x181.jpg\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7241,\"title\":\"Coyoac\\u00e1n: Becos de Frida\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/coyoacan-becos-de-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\":7243,\"title\":\"Biblioteca Vasconcelos: A arca de cristal no CDMX\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/biblioteca-vasconcelos-a-arca-de-cristal-no-cdmx\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/839ab076-ec89-4620-b8fe-a3baf6ca23ed-300x189.jpg\",\"duration\":\"90\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7245,\"title\":\"Ex-Convento do Deserto dos Le\\u00f5es: O sussurro da floresta\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/ex-convento-do-deserto-dos-leoes-o-sussurro-da-floresta\\\/\",\"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\":7247,\"title\":\"Plaza de San Jacinto (San \\u00c1ngel): O jardim dos artistas\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/plaza-de-san-jacinto-san-angel-o-jardim-dos-artistas\\\/\",\"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\":7249,\"title\":\"Plaza de Santo Domingo: Os portais da mem\\u00f3ria\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/plaza-de-santo-domingo-os-portais-da-memoria\\\/\",\"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\":7228,\"title\":\"Templo Mayor: O cora\\u00e7\\u00e3o sagrado do Imp\\u00e9rio Mexicano\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/templo-mayor-o-coracao-sagrado-do-imperio-mexicano\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/gdainznsyfa-300x200.jpg\",\"duration\":\"150\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7233,\"title\":\"Pujol &#038; Quintonil: O Olimpo da alta gastronomia mexicana\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/pujol-quintonil-o-olimpo-da-alta-gastronomia-mexicana\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/44b9c96e-e14b-484a-984b-3d59d4bb646c-300x113.jpg\",\"duration\":\"210\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7235,\"title\":\"Museu Nacional de Antropologia: O or\\u00e1culo da \\u00e9poca pr\\u00e9-hisp\\u00e2nica\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/museu-nacional-de-antropologia-o-oraculo-da-epoca-pre-hispanica\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/ndxkwolenku-300x212.jpg\",\"duration\":\"180\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7237,\"title\":\"Xochimilco: Protocolo de canal privado e m\\u00edstica das chinampas\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/xochimilco-protocolo-de-canal-privado-e-mistica-das-chinampas\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/12638539-300x200.jpeg\",\"duration\":\"180\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7239,\"title\":\"Teotihuac\\u00e1n: voo de bal\\u00e3o ao nascer do sol com vista para as pir\\u00e2mides\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/teotihuacan-voo-de-balao-ao-nascer-do-sol-com-vista-para-as-piramides\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/eo9v20ig3z0-300x200.jpg\",\"duration\":\"240\",\"xp\":\"400\",\"badge\":\"premium\"}]},{\"city\":\"Londres\",\"slug\":\"londres-pt\",\"constellation\":\"Constela\\u00e7\\u00e3o Europeia\",\"country\":\"Mundo\",\"experiences\":[{\"id\":7626,\"title\":\"A caminhada da rainha | Caminhada pelo T\\u00e2misa\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/a-caminhada-da-rainha-caminhada-pelo-tamisa\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/ujiiuat1hz0-300x225.jpg\",\"duration\":\"89\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7628,\"title\":\"Jardim de Kyoto: o jardim japon\\u00eas em Londres\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/jardim-de-kyoto-o-jardim-japones-em-londres\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/6d3eaf4d-cdae-41e6-977f-4b96a5c7771b-300x225.jpg\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7630,\"title\":\"Little Venice: o passeio mais tranquilo pelos canais de Londres\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/little-venice-o-passeio-mais-tranquilo-pelos-canais-de-londres\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/unwohpmx8sw-300x200.jpg\",\"duration\":\"89\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7632,\"title\":\"Conservat\\u00f3rio Barbican: o o\\u00e1sis solarpunk de Londres\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/conservatorio-barbican-o-oasis-solarpunk-de-londres\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/a318db16-e725-4f25-bc3b-9ce030769be0-300x225.jpg\",\"duration\":\"60\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7634,\"title\":\"St Dunstan no Oriente: o jardim entre as ru\\u00ednas\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/st-dunstan-no-oriente-o-jardim-entre-as-ruinas\\\/\",\"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\":7616,\"title\":\"Colina da Pr\\u00edmula | Horizonte de Londres\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/colina-da-primula-horizonte-de-londres\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/wkyfavx8uc8-300x199.jpg\",\"duration\":\"8\",\"xp\":\"200\",\"badge\":\"secret\"},{\"id\":7618,\"title\":\"Jardim do C\\u00e9u | A floresta nas nuvens\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/jardim-do-ceu-a-floresta-nas-nuvens\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/17c5730f-1332-4381-a173-22a93b96f132-300x154.jpg\",\"duration\":\"6\",\"xp\":\"200\",\"badge\":\"secret\"},{\"id\":7620,\"title\":\"Docas de Santa Catarina | O porto secreto da Tower Bridge\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/docas-de-santa-catarina-o-porto-secreto-da-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\":7622,\"title\":\"BAPS Shri Swaminarayan Mandir | O templo hindu escondido\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/baps-shri-swaminarayan-mandir-o-templo-hindu-escondido\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/51998c36-df66-46a3-b778-49ec9832d4d5-300x211.jpg\",\"duration\":\"120\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7624,\"title\":\"Mercado Leadenhall | Beco Diagonal \\u00e0s 6h\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/mercado-leadenhall-beco-diagonal-as-6h\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/dc7uwjrnags-300x200.jpg\",\"duration\":\"45\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7600,\"title\":\"Salas de Guerra de Churchill | O bunker da liberdade\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/salas-de-guerra-de-churchill-o-bunker-da-liberdade\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/9edc6c0f-961c-4164-ad77-e74ddd4ffc71-300x225.jpg\",\"duration\":\"100\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7602,\"title\":\"Pal\\u00e1cio de Kensington | O jardim das mem\\u00f3rias reais\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/palacio-de-kensington-o-jardim-das-memorias-reais\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/4bad56a5-3560-4237-99a2-95fe903477ec-300x225.jpg\",\"duration\":\"90\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7604,\"title\":\"Abadia de Westminster O sussurro da hist\\u00f3ria em pedra (Verger Tour)\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/abadia-de-westminster-o-sussurro-da-historia-em-pedra-verger-tour\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/33334264-300x199.jpeg\",\"duration\":\"120\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7612,\"title\":\"Cutty Sark | O gigante de cobre sob o vidro\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/cutty-sark-o-gigante-de-cobre-sob-o-vidro\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/o-rjptppb0u-300x145.jpg\",\"duration\":\"2\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":7614,\"title\":\"Torre de Londres: Primeiro Protocolo de Acesso e Cerim\\u00f4nia de Chave\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/torre-de-londres-primeiro-protocolo-de-acesso-e-cerimonia-de-chave\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/nsotqaul-4-300x200.jpg\",\"duration\":\"3\",\"xp\":\"400\",\"badge\":\"premium\"}]},{\"city\":\"Miami\",\"slug\":\"miami-pt\",\"constellation\":\"Constela\\u00e7\\u00e3o das Am\\u00e9ricas\",\"country\":\"Mundo\",\"experiences\":[{\"id\":7528,\"title\":\"Parque Lummus Miami | Jardim de n\\u00e9on da Ocean Drive\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/parque-lummus-miami-jardim-de-neon-da-ocean-drive\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/34334889-300x225.jpeg\",\"duration\":\"75\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7530,\"title\":\"Wynwood Caminhos Miami | O museu das ruas\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/wynwood-caminhos-miami-o-museu-das-ruas\\\/\",\"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\":7532,\"title\":\"Parque SoundScape Miami | Sinfonia sob as palmeiras\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/parque-soundscape-miami-sinfonia-sob-as-palmeiras\\\/\",\"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\":7516,\"title\":\"Floresta Encantada Miami | Floresta das Fadas de Miami\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/floresta-encantada-miami-floresta-das-fadas-de-miami\\\/\",\"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\":7518,\"title\":\"Matheson Hammock Park Miami | O atol artificial\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/matheson-hammock-park-miami-o-atol-artificial\\\/\",\"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\":7520,\"title\":\"Parque Alice Wainwright Miami | O mirante do mangue\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/parque-alice-wainwright-miami-o-mirante-do-mangue\\\/\",\"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\":7522,\"title\":\"Antigo Mosteiro Espanhol Miami | O labirinto m\\u00edstico\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/antigo-mosteiro-espanhol-miami-o-labirinto-mistico\\\/\",\"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\":7524,\"title\":\"Museu e Jardins Vizcaya Miami | O renascimento da \\u00e1gua\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/museu-e-jardins-vizcaya-miami-o-renascimento-da-agua\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/9ef1ec5c-bdcd-4213-abc2-953e583b8da2-300x199.jpg\",\"duration\":\"150\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7526,\"title\":\"O Kampong Miami | Ref\\u00fagio Bot\\u00e2nico Coconut Grove\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/o-kampong-miami-refugio-botanico-coconut-grove\\\/\",\"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\":7504,\"title\":\"Aerobarco Everglades | A pulsa\\u00e7\\u00e3o do rio de grama\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/aerobarco-everglades-a-pulsacao-do-rio-de-grama\\\/\",\"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\":7506,\"title\":\"Museu Rubell | O santu\\u00e1rio da arte contempor\\u00e2nea\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/museu-rubell-o-santuario-da-arte-contemporanea\\\/\",\"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\":7508,\"title\":\"Museu da Ci\\u00eancia Frost | O olho do oceano\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/museu-da-ciencia-frost-o-olho-do-oceano\\\/\",\"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\":7510,\"title\":\"Artechouse Miami | O laborat\\u00f3rio de luz\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/artechouse-miami-o-laboratorio-de-luz\\\/\",\"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\":7512,\"title\":\"Museu de Arte P\\u00e9rez Miami | O jardim suspenso \\u00e0 beira da ba\\u00eda\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/museu-de-arte-perez-miami-o-jardim-suspenso-a-beira-da-baia\\\/\",\"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\":7514,\"title\":\"Superazul Miami | O portal das dimens\\u00f5es\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/superazul-miami-o-portal-das-dimensoes\\\/\",\"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\":\"Nova York\",\"slug\":\"nova-york\",\"constellation\":\"Constela\\u00e7\\u00e3o das Am\\u00e9ricas\",\"country\":\"Mundo\",\"experiences\":[{\"id\":7558,\"title\":\"Bonde da Ilha Roosevelt: voo urbano sobre o East River\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/bonde-da-ilha-roosevelt-voo-urbano-sobre-o-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\":7560,\"title\":\"Little Island: O Parque no Hudson\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/little-island-o-parque-no-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\":7562,\"title\":\"Balsa de Staten Island: mirante do porto de Nova York\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/balsa-de-staten-island-mirante-do-porto-de-nova-york\\\/\",\"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\":7564,\"title\":\"O Navio: Geometria urbana e fluxo vertical\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/o-navio-geometria-urbana-e-fluxo-vertical\\\/\",\"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\":7546,\"title\":\"A caminhada | A floresta secreta do Central Park\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/a-caminhada-a-floresta-secreta-do-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\":7548,\"title\":\"Passeio de Brooklyn Heights | A varanda da cidade\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/passeio-de-brooklyn-heights-a-varanda-da-cidade\\\/\",\"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\":7550,\"title\":\"Parque Greenacre | Cachoeira escondida do centro da cidade\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/parque-greenacre-cachoeira-escondida-do-centro-da-cidade\\\/\",\"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\":7552,\"title\":\"A Biblioteca Morgan | O bunker do conhecimento em Nova York\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/a-biblioteca-morgan-o-bunker-do-conhecimento-em-nova-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\":7554,\"title\":\"\\u00c1trio da Funda\\u00e7\\u00e3o Ford | Selva sob vidro\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/atrio-da-fundacao-ford-selva-sob-vidro\\\/\",\"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\":7556,\"title\":\"O Acre Elevado | O jardim secreto de Wall Street\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/o-acre-elevado-o-jardim-secreto-de-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\":7536,\"title\":\"Passeio de helic\\u00f3ptero em Nova York | O Or\\u00e1culo do Horizonte\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/passeio-de-helicoptero-em-nova-york-o-oraculo-do-horizonte\\\/\",\"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\":7538,\"title\":\"Museu Guggenheim Nova York | A espiral da arte moderna\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/museu-guggenheim-nova-york-a-espiral-da-arte-moderna\\\/\",\"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\":7540,\"title\":\"Le Pavillon Nova York | Jardim comest\\u00edvel de Daniel Boulud\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/le-pavillon-nova-york-jardim-comestivel-de-daniel-boulud\\\/\",\"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\":7542,\"title\":\"O Met Cloisters Nova York | M\\u00edstica medieval no Hudson\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/o-met-cloisters-nova-york-mistica-medieval-no-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\":7544,\"title\":\"Summit One Vanderbilt Nova York | Mergulhe nas nuvens\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/summit-one-vanderbilt-nova-york-mergulhe-nas-nuvens\\\/\",\"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-pt\",\"constellation\":\"Constela\\u00e7\\u00e3o Europeia\",\"country\":\"Mundo\",\"experiences\":[{\"id\":7577,\"title\":\"Torre Eiffel: o mirante do Trocad\\u00e9ro\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/torre-eiffel-o-mirante-do-trocadero\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/pexels-landscape-Eiffel-Tower-sunrise-beautiful-300x169.jpg\",\"duration\":\"40\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7592,\"title\":\"Canal Saint-Martin: a art\\u00e9ria bo\\u00eamia de Paris\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/canal-saint-martin-a-arteria-boemia-de-paris\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/14348452-300x200.jpeg\",\"duration\":\"120\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7594,\"title\":\"Square du Vert-Galant: a proa da Ile de la Cit\\u00e9\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/square-du-vert-galant-a-proa-da-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\":7596,\"title\":\"Jardin du Luxembourg: a eleg\\u00e2ncia do Quartier Latin\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/jardin-du-luxembourg-a-elegancia-do-quartier-latin\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/pexels-landscape-Luxembourg-Palace-Paris-sunny-300x200.jpg\",\"duration\":\"60\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":7598,\"title\":\"Promenade Plant\\u00e9e: O jardim elevado de Paris\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/promenade-plantee-o-jardim-elevado-de-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\":7582,\"title\":\"Passage des Panoramas: O labirinto de vidro e selo\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/passage-des-panoramas-o-labirinto-de-vidro-e-selo\\\/\",\"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\":7584,\"title\":\"Mus\\u00e9e de la Vie Romantique: O jardim das ideias\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/musee-de-la-vie-romantique-o-jardim-das-ideias\\\/\",\"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\":7587,\"title\":\"Maison de Victor Hugo: A alma da Place des Vosges\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/maison-de-victor-hugo-a-alma-da-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\":7590,\"title\":\"Ar\\u00e8nes de Lut\\u00e8ce: O eco da G\\u00e1lia Romana\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/arenes-de-lutece-o-eco-da-galia-romana\\\/\",\"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\":7610,\"title\":\"Parque des Buttes-Chaumont | O templo sobre o abismo\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/parque-des-buttes-chaumont-o-templo-sobre-o-abismo\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/gznhhbmex7u-300x225.jpg\",\"duration\":\"75\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":7566,\"title\":\"Sainte-Chapelle: O relic\\u00e1rio medieval da luz\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/sainte-chapelle-o-relicario-medieval-da-luz\\\/\",\"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\":7568,\"title\":\"Jantar no Sena: O cruzeiro de vidro e luzes em Paris\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/jantar-no-sena-o-cruzeiro-de-vidro-e-luzes-em-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\":7570,\"title\":\"Mus\\u00e9e d&#8217;Orsay: Impressionismo na antiga esta\\u00e7\\u00e3o\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/musee-dorsay-impressionismo-na-antiga-estacao\\\/\",\"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\":7572,\"title\":\"\\u00d3pera Garnier: O pal\\u00e1cio da m\\u00fasica e do ouro em Paris\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/opera-garnier-o-palacio-da-musica-e-do-ouro-em-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\":7574,\"title\":\"Catacumbas de Paris: O Imp\\u00e9rio da Morte\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/catacumbas-de-paris-o-imperio-da-morte\\\/\",\"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\":\"Roma\",\"slug\":\"roma-pt\",\"constellation\":\"Constela\\u00e7\\u00e3o Europeia\",\"country\":\"Mundo\",\"experiences\":[{\"id\":6731,\"title\":\"O Gianicolo: a colina panor\\u00e2mica de Roma\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/o-gianicolo-a-colina-panoramica-de-roma\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Gianicolo-Roma-Horizontal-Space-Journey-300x167.jpg\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":6507,\"title\":\"O Vittoriano: A m\\u00e1quina do tempo do m\\u00e1rmore\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/o-vittoriano-a-maquina-do-tempo-do-marmore\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/dacdebdqjpk-300x198.jpg\",\"duration\":\"120\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":6509,\"title\":\"O Coliseu Romano: visita exterior\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/o-coliseu-romano-visita-exterior\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/qh0c7c5gjj8-300x200.jpg\",\"duration\":\"120\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":6511,\"title\":\"O jardim de laranjas e a chave secreta\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/o-jardim-de-laranjas-e-a-chave-secreta\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/Giardino-degli-Aranco-Space-Journey-Horizontal-300x127.jpg\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":6514,\"title\":\"Trastevere: o sussurro dos paralelep\\u00edpedos\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/trastevere-o-sussurro-dos-paralelepipedos\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/Trastevere-Space-Journey-Horizontal-300x167.png\",\"duration\":\"90\",\"xp\":\"100\",\"badge\":\"free\"},{\"id\":6703,\"title\":\"Fontana di Trevi em sil\\u00eancio: O ritual da \\u00e1gua\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/fontana-di-trevi-em-silencio-o-ritual-da-agua\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/i1lv2yx67gi-300x200.jpg\",\"duration\":\"45\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":6705,\"title\":\"O Pante\\u00e3o: O portal da luz\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/o-panteao-o-portal-da-luz\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/tlyzsnu8md0-300x200.jpg\",\"duration\":\"60\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":6723,\"title\":\"Parco degli acquedotti: Os gigantes de pedra\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/parco-degli-acquedotti-os-gigantes-de-pedra\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/32a1ecbf-d3dc-494c-8531-0a4d04f40382-300x200.jpg\",\"duration\":\"120\",\"xp\":\"200\",\"badge\":\"secret\"},{\"id\":6725,\"title\":\"Via appia antica: O ritmo da eternidade\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/via-appia-antica-o-ritmo-da-eternidade\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/efa41f36-f333-4dcd-a697-76751cbe0258-300x169.jpg\",\"duration\":\"150\",\"xp\":\"150\",\"badge\":\"secret\"},{\"id\":6727,\"title\":\"Garbatella: a vila-jardim em Roma\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/garbatella-a-vila-jardim-em-roma\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/1600e33a-f814-4c1d-8d1b-86fb91c2ad3a-300x225.jpg\",\"duration\":\"105\",\"xp\":\"200\",\"badge\":\"secret\"},{\"id\":6675,\"title\":\"Castel Sant&#8217;Angelo: O corredor secreto\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/castel-santangelo-o-corredor-secreto\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/292541fe-36cf-4333-9af9-49ae4b425401-300x199.jpg\",\"duration\":\"90\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":6693,\"title\":\"Galleria Borghese: perfei\\u00e7\\u00e3o escultural\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/galleria-borghese-perfeicao-escultural\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/9kngv0hk3au-300x200.jpg\",\"duration\":\"120\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":6696,\"title\":\"Museus e Museus do Vaticano Capela Sistina\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/museus-e-museus-do-vaticano-capela-sistina\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/si2eyuamw9m-300x115.jpg\",\"duration\":\"180\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":6698,\"title\":\"Coliseu, F\\u00f3rum Romano e Roma Monte Palatino\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/coliseu-forum-romano-e-roma-monte-palatino\\\/\",\"image\":\"https:\\\/\\\/spacejourney.app\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/3om3q0wtjlm-300x200.jpg\",\"duration\":\"180\",\"xp\":\"400\",\"badge\":\"premium\"},{\"id\":6733,\"title\":\"O Vittoriano: O visual das carruagens\",\"url\":\"https:\\\/\\\/spacejourney.app\\\/pt-br\\\/experiencia\\\/o-vittoriano-o-visual-das-carruagens\\\/\",\"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;\">Minhas Viagens<\/h2>';\r\n                        zeroHtml += '<button class=\"sj-btn sj-btn-primary\" onclick=\"sjCreateNewTrip()\" style=\"border-radius:30px;\"><span class=\"dashicons dashicons-plus-alt2\"><\/span> Nova Viagem<\/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;\">Abrir viagem &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;\">Planejador Ultra Ativo \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;\">Voc\u00ea \u00e9 um viajante Ultra! O planejador de viagens 100% j\u00e1 est\u00e1 dispon\u00edvel, com otimiza\u00e7\u00e3o de tempo por IA, mapas din\u00e2micos interativos, exporta\u00e7\u00f5es ilimitadas e todas as ferramentas exclusivas.<\/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> Recursos Desbloqueados`;\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;\">Obrigado por explorar com o Pass!<\/h4>`;\r\n                            zeroHtml += `<p style=\"margin: 0; font-size: 13.5px; color: #e2e8f0; line-height: 1.5; font-family: \\'Inter\\', sans-serif;\">Voc\u00ea tem acesso a viagens ilimitadas e exporta\u00e7\u00e3o para o Calendar. Quer mais? Fa\u00e7a upgrade para o Ultra para otimizar seu tempo com IA, atribui\u00e7\u00e3o de horas exatas e sugest\u00f5es avan\u00e7adas de roteiros.<\/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 += `Fazer upgrade para 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;\">Leve suas viagens ao pr\u00f3ximo n\u00edvel<\/h4>`;\r\n                            zeroHtml += `<p style=\"margin: 0; font-size: 13.5px; color: #e2e8f0; line-height: 1.5; font-family: \\'Inter\\', sans-serif;\">Sua conta Free permite salvar at\u00e9 3 viagens. Desbloqueie o plano Pass para salvar viagens ilimitadas e exportar para o Calendar, ou fa\u00e7a upgrade para Ultra para agendar hor\u00e1rios exatos e otimizar sua rota com nossa IA.<\/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 += `Ver Assinaturas`;\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>Sua pr\u00f3xima grande aventura come\u00e7a aqui.<\/h3>\r\n                        <p>Crie seu primeiro roteiro para descobrir, salvar e organizar lugares incr\u00edveis.<\/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> Criar minha primeira viagem                        <\/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 || \"Sem T\u00edtulo\";\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;\">Esta viagem ainda n\u00e3o tem atividades.<\/p>\r\n                        <button class=\"sj-btn sj-btn-secondary\" onclick=\"sjAddDay()\">\r\n                            <span class=\"dashicons dashicons-plus\"><\/span> Adicionar Dia 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 || \"Sem T\u00edtulo\";\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 = \"Manh\u00e3\"; timeClass = 'sj-time-morning'; }\r\n                            else if (card.timeMode === 'afternoon') { timeBadgeLabel = \"Tarde\"; timeClass = 'sj-time-afternoon'; }\r\n                            else if (card.timeMode === 'night') { timeBadgeLabel = \"Noite\"; 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=\"Atribuir hor\u00e1rio\"><\/span>\r\n                            <span class=\"dashicons dashicons-trash\" onclick=\"sjDeleteCard('${day.id}', '${card.id}')\" title=\"Excluir Atividade\"><\/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=\"Excluir Dia\"><\/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}')\">+ Adicionar Atividade<\/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;\">Adicionar Dia<\/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: `Dia ${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: \"Excluir Dia?\",\r\n                    text: \"Todas as atividades deste dia ser\u00e3o exclu\u00eddas.\",\r\n                    icon: 'warning',\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Sim, excluir\",\r\n                    cancelButtonText: \"Cancelar\",\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\">Continentes<\/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\">Cidades<\/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:  'Segredo',\r\n                            premium: 'Pr\u00eamio'\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                                            Adicionar                                        <\/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                                            Descobrir                                        <\/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: \"Que experi\u00eancia voc\u00ea adiciona?\",\r\n                    html: carouselHtml,\r\n                    showConfirmButton: false,\r\n                    showCancelButton: true,\r\n                    cancelButtonText: \"Insira sua atividade\",\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: \"Nova atividade gratuita\",\r\n                    input: 'text',\r\n                    inputPlaceholder: \"Ex. Visitar o Pante\u00e3o\",\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Seguindo\",\r\n                    cancelButtonText: \"Cancelar\",\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;\">Escolha o hor\u00e1rio exato da sua atividade<\/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\">Manh\u00e3<\/option>\r\n                            <option value=\"afternoon\">Tarde<\/option>\r\n                            <option value=\"night\">Noite<\/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 Sincronize com o Calend\u00e1rio e escolha os hor\u00e1rios exatos com sua assinatura Pass ou Ultra.<\/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;\">Melhore seu plano<\/a>\r\n                        <\/div>\r\n                    `;\r\n                }\r\n\r\n                Swal.fire({\r\n                    title: \"Bloco de Tempo\",\r\n                    html: htmlContent,\r\n                    footer: footerContent,\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"OK\",\r\n                    cancelButtonText: \"Cancelar\",\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(\"Escolha um hor\u00e1rio\");\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;\">Escolha o hor\u00e1rio exato da sua atividade<\/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' : ''}>Manh\u00e3<\/option>\r\n                            <option value=\"afternoon\" ${currentTime === 'afternoon' ? 'selected' : ''}>Tarde<\/option>\r\n                            <option value=\"night\" ${currentTime === 'night' ? 'selected' : ''}>Noite<\/option>\r\n                            <option value=\"\" ${currentTime === '' ? 'selected' : ''}>Sem Atribui\u00e7\u00e3o<\/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 Sincronize com o Calend\u00e1rio e escolha os hor\u00e1rios exatos com sua assinatura Pass ou Ultra.<\/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;\">Melhore seu plano<\/a>\r\n                        <\/div>\r\n                    `;\r\n                }\r\n\r\n                Swal.fire({\r\n                    title: \"Bloco de Tempo\",\r\n                    html: htmlContent,\r\n                    footer: footerContent,\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Aplicar\",\r\n                    cancelButtonText: \"Cancelar\",\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: \"Desbloqueie a precis\u00e3o relojoeira\",\r\n                    html: \"Com as assinaturas Pass e Ultra, voc\u00ea pode aproveitar ao m\u00e1ximo cada momento. Voc\u00ea atribuir\u00e1 hor\u00e1rios espec\u00edficos e poder\u00e1 exportar sua viagem para o Calend\u00e1rio.\",\r\n                    icon: 'star',\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Ver Assinaturas\",\r\n                    cancelButtonText: \"Mais Tarde\",\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: \"Minhas Viagens\", 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: \"Carregando viagem...\", 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: \"Carregando viagem...\", 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: \"Configura\u00e7\u00f5es da minha viagem\",\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);\">Nome da viagem<\/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> Excluir esta viagem                        <\/button>\r\n                    <\/div>\r\n                `,\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Salvar Altera\u00e7\u00f5es\",\r\n                    cancelButtonText: \"Cancelar\",\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(\"O nome \u00e9 obrigat\u00f3rio.\");\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: \"Fa\u00e7a login para economizar mais\",\r\n                        text: \"Voc\u00ea atingiu o limite de itiner\u00e1rios sem conta. Cadastre-se gratuitamente para criar mais aventuras.\",\r\n                        icon: \"info\",\r\n                        showCancelButton: true,\r\n                        confirmButtonText: \"Criar uma conta\",\r\n                        cancelButtonText: \"Cancelar\",\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: \"Nova Viagem\", 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(\"Descartado\", \"A viagem atual estava vazia e foi reiniciada.\", 'info');\r\n                    return;\r\n                }\r\n\r\n                Swal.fire({\r\n                    title: \"Tem certeza?\",\r\n                    text: \"Esta a\u00e7\u00e3o excluir\u00e1 a viagem permanentemente da sua conta.\",\r\n                    icon: 'warning',\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Sim, excluir viagem\",\r\n                    cancelButtonText: \"Cancelar\",\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: \"Excluindo...\", 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: \"Nova Viagem\", 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(\"Exclu\u00eddo!\", \"A viagem foi exclu\u00edda com sucesso.\", '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(\"Viagem Removida\", \"A viagem foi removida da sua visualiza\u00e7\u00e3o, embora o servidor tenha relatado um problema menor.\", '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(\"Ops...\", \"Erro ao conectar ao servidor.\", '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: \"Aventura de clonagem...\", 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(\"Itiner\u00e1rio clonado!\", \"A rota foi clonada e salva com sucesso em sua conta.\", \"success\");\r\n                                        } else {\r\n                                            Swal.fire(\"Itiner\u00e1rio clonado!\", \"Voc\u00ea pode edit\u00e1-lo agora mesmo. Lembre-se de criar sua conta para salv\u00e1-la permanentemente.\", \"success\");\r\n                                        }\r\n                                    } catch(e) {\r\n                                        console.error('Error parsing cloned itinerary:', e);\r\n                                        Swal.fire(\"Ops...\", \"Ocorreu um erro ao processar o itiner\u00e1rio clonado.\", \"error\");\r\n                                    }\r\n                                } else {\r\n                                    Swal.fire(\"Ops...\", res.data?.message || \"O itiner\u00e1rio n\u00e3o p\u00f4de ser clonado. O link pode n\u00e3o ser v\u00e1lido.\", \"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(\"Ops...\", \"Erro de rede ao tentar clonar o itiner\u00e1rio.\", \"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: \"Carregando roteiros...\", 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: \"Nova Viagem\", 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: \"Nova Viagem\", 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: \"Fa\u00e7a login para salvar\",\r\n                            text: \"Seu roteiro est\u00e1 salvo temporariamente neste navegador. Para garanti-lo na sua conta e acess\u00e1-lo do seu celular, voc\u00ea precisa se registrar.\",\r\n                            icon: 'warning',\r\n                            confirmButtonText: \"Crie uma conta gratuita\",\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(\"Salvo!\", response.data.message, 'success');\r\n                        } else {\r\n                            isSavingNewTrip = false;\r\n                            if (!silent) Swal.fire(\"Ops...\", 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(\"Ops...\", \"Houve uma falha de comunica\u00e7\u00e3o.\", '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(\"Falta Salvar!\", \"Primeiro, salve seu roteiro na sua conta antes de export\u00e1-lo para o seu calend\u00e1rio.\", '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;\">Escolha o primeiro dia da sua viagem. Sincronizaremos automaticamente todos os dias no seu Calendar.<\/p>';\r\n\r\n                Swal.fire({\r\n                    title: \"Quando come\u00e7a a viagem?\",\r\n                    html: htmlContent,\r\n                    input: 'date',\r\n                    inputAttributes: {\r\n                        'aria-label': \"Selecione a data do seu voo ou de in\u00edcio\"\r\n                    },\r\n                    showCancelButton: true,\r\n                    confirmButtonText: '<span class=\"dashicons dashicons-calendar-alt\"><\/span> Baixar .ics',\r\n                    cancelButtonText: \"Cancelar\",\r\n                    confirmButtonColor: '#8FD14F',\r\n                    customClass: { popup: 'sj-solarpunk-popup' },\r\n                    inputValidator: (value) => {\r\n                        if (!value) return \"Preciso de uma data para mapear as estrelas!\";\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: \"Gerando arquivo...\", text: \"Construindo o arquivo do calend\u00e1rio.\", 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(\"Exporta\u00e7\u00e3o Bem-sucedida!\", \"Procure o arquivo de calend\u00e1rio .ics nos seus Downloads e abra-o para que seu telefone agende a viagem magicamente.\", '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: \"Minha viagem espacial\",\r\n                                        text: \"Aqui voc\u00ea tem o arquivo do seu itiner\u00e1rio.\",\r\n                                        files: [file]\r\n                                    }).then(() => {\r\n                                        Swal.fire(\"Exporta\u00e7\u00e3o Bem-sucedida!\", \"Seu itiner\u00e1rio foi enviado para sua agenda.\", '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(\"Erro Tempor\u00e1rio\", response.data ? response.data.message : \"N\u00e3o foi poss\u00edvel gerar o arquivo ICS.\", 'error');\r\n                        }\r\n                    })\r\n                    .catch(error => {\r\n                        console.error('Error ICS SJ:', error);\r\n                        Swal.fire(\"Ops...\", \"Houve uma falha de comunica\u00e7\u00e3o com o servidor.\", '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: \"Excluir TODAS as suas viagens?\",\r\n                    text: \"Perigo! Esta a\u00e7\u00e3o excluir\u00e1 permanentemente TODAS as viagens da sua conta. Voc\u00ea n\u00e3o poder\u00e1 recuper\u00e1-las.\",\r\n                    icon: 'error',\r\n                    showCancelButton: true,\r\n                    confirmButtonText: \"Sim, excluir tudo\",\r\n                    cancelButtonText: \"Mant\u00ea-las\",\r\n                    confirmButtonColor: '#ff0000'\r\n                }).then((result) => {\r\n                    if (result.isConfirmed) {\r\n                        Swal.fire({ title: \"Aniquilando dados...\", 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(\"Conta Limpa!\", 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(\"Erro\", response.data ? response.data.message : \"A opera\u00e7\u00e3o n\u00e3o foi conclu\u00edda.\", 'error');\r\n                                }\r\n                            })\r\n                            .catch(error => {\r\n                                console.error('Error ResetSJ:', error);\r\n                                Swal.fire(\"Ops...\", \"Falha cr\u00edtica ao excluir as viagens.\", '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: \"Salve sua aventura!\",\r\n                        text: \"Para compartilhar sua rota com amigos, voc\u00ea deve primeiro clicar em Salvar na nuvem para criar seu link da web.\",\r\n                        icon: 'info',\r\n                        confirmButtonText: \"Entendido\",\r\n                        confirmButtonColor: '#193B33'\r\n                    });\r\n                    return;\r\n                }\r\n\r\n                Swal.fire({ title: \"Gerando link m\u00e1gico...\", 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 || \"Meu Roteiro na Space Journey\";\r\n                            const shareText = \"Ol\u00e1! Encontrei esta rota na Space Journey e a salvei no meu planejador. D\u00ea uma olhada, podemos us\u00e1-la como refer\u00eancia: \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: \"Rota Pronta para Compartilhar!\",\r\n                                            html: `\r\n                                        <p style=\"font-size:14px; color:#555; margin-bottom:15px;\">Seus amigos poder\u00e3o ver este roteiro de qualquer lugar interagindo com este 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> Copiar 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 copiado para a \u00e1rea de transfer\u00eancia!\");\r\n                                                return false;\r\n                                            }\r\n                                        });\r\n                                    });\r\n                                } else {\r\n                                    Swal.fire({\r\n                                        title: \"Rota Pronta para Compartilhar!\",\r\n                                        html: `\r\n                                    <p style=\"font-size:14px; color:#555; margin-bottom:15px;\">Seus amigos poder\u00e3o ver este roteiro de qualquer lugar interagindo com este 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> Copiar 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(\"Erro\", response.data ? response.data.message : \"N\u00e3o foi poss\u00edvel gerar o link.\", 'error');\r\n                        }\r\n                    })\r\n                    .catch(error => {\r\n                        console.error('Error ShareSJ:', error);\r\n                        Swal.fire(\"Ops...\", \"Falha cr\u00edtica de rede.\", '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\">Como organizar uma viagem com nosso criador de roteiro interativo?<\/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. Escolha seu destino e d\u00ea um nome \u00e0 sua aventura.<\/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>Seja voc\u00ea indo para Roma, conhecida como Cidade Eterna, ou para uma metr\u00f3pole mais futurista como T\u00f3quio, <strong>d\u00ea \u00e0 sua viagem um nome memor\u00e1vel para come\u00e7ar a agrupar lugares incr\u00edveis.<\/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. Adicione dias e experi\u00eancias ocultas.<\/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>Nosso sistema de arrastar e soltar permite <strong>organizar suas manh\u00e3s, tardes e noites com precis\u00e3o.<\/strong> Voc\u00ea ainda pode navegar em nossa plataforma de viajantes e pesquisar locais exclusivos filtrados pela ess\u00eancia <strong>Solarpunk<\/strong> que tanto amamos em <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. Cuidados pessoais e exporta\u00e7\u00e3o para calend\u00e1rio.<\/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>Nenhuma viagem deve esgotar sua sa\u00fade mental. <strong>Sincronize todo o seu percurso diretamente com o Apple ou o Google Calendar<\/strong> e dedique-se a <strong>aproveitar o destino sem olhar para as telas.<\/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. Obtenha benef\u00edcios adicionais com o Space Journey durante sua viagem.<\/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>N\u00f3s <strong>j\u00e1 analisamos e selecionamos as experi\u00eancias ideais para sua viagem<\/strong>, em cada um de seus destinos. Usando o Space Journey, voc\u00ea pode <strong>obter pontos de experi\u00eancia (XP) e moedas solares (SC)<\/strong>, que podem ser usados \u200b\u200bpara <strong>resgatar benef\u00edcios virtuais e f\u00edsicos com nossa rede de aliados.<\/strong> Al\u00e9m disso, voc\u00ea pode desbloquear todos os recursos da plataforma para viajantes com o <strong>Space Journey Pass e 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-4352\" alt=\"Paris - Viagem Espacial\" 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\">Perguntas frequentes sobre planejador de viagem<\/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\"> \u00c9 gr\u00e1tis planejar minha viagem com o 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>Sim, nosso criador de itiner\u00e1rio interativo permite que voc\u00ea crie at\u00e9 3 viagens totalmente gratuitas. Ao ingressar na nossa comunidade de viajantes Solarpunk, voc\u00ea pode salvar suas rotas com seguran\u00e7a na nuvem e compartilh\u00e1-las com amigos por meio de um link p\u00fablico, sem nenhum custo.<\/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\"> Posso exportar meu roteiro tur\u00edstico para Google Calendar ou 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>Com certeza. O planejador de viagem da Jornada Espacial possui um recurso de exporta\u00e7\u00e3o premium que gera um arquivo universal (.ics). Este formato permite sincronizar automaticamente todos os dias e atividades com o Google Calendar, Apple Calendar ou Outlook, mantendo notifica\u00e7\u00f5es tempor\u00e1rias no seu celular para evitar atrasos e estresse durante a sua experi\u00eancia.<\/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\"> O que torna este planejador de rotas diferente de outros mecanismos de viagens? <\/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>Ao contr\u00e1rio dos grandes planejadores, a Jornada Espacial n\u00e3o busca preench\u00ea-lo com infinitas op\u00e7\u00f5es que causam paralisia por an\u00e1lise (Sobrecarga Cognitiva). Nosso mecanismo prioriza recomenda\u00e7\u00f5es selecionadas com foco no bem-estar mental do viajante, locais com m\u00e9tricas de resili\u00eancia clim\u00e1tica e experi\u00eancias locais aut\u00eanticas que apoiam a conserva\u00e7\u00e3o cultural, sob uma filosofia Solarpunk.<\/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\": \"Planejador de viagens inteligente e gratuito. Arraste e solte experi\u00eancias, salve rotas na nuvem, exporte-as para o Calendar e compartilhe seus itiner\u00e1rios p\u00fablicos com amigos sob uma filosofia de viagem Solarpunk e Carga Cognitiva Reduzida.\",\r\n      \"featureList\": [\r\n        \"Construtor de itiner\u00e1rio de viagem com recurso de arrastar e soltar\",\r\n        \"Exporta\u00e7\u00e3o para Google Calendar e Apple Calendar (.ics)\",\r\n        \"URLs de viagens p\u00fablicas compartilh\u00e1veis\",\r\n        \"Salvamento na nuvem para usu\u00e1rios registrados\"\r\n      ]\r\n    },\r\n    {\r\n      \"@type\": \"FAQPage\",\r\n      \"mainEntity\": [\r\n        {\r\n          \"@type\": \"Question\",\r\n          \"name\": \"\u00c9 gr\u00e1tis planejar minha viagem com a Space Journey?\",\r\n          \"acceptedAnswer\": {\r\n            \"@type\": \"Answer\",\r\n            \"text\": \"Sim, nosso criador interativo de itiner\u00e1rios permite que voc\u00ea desenhe at\u00e9 3 viagens de forma totalmente gratuita. Ao ingressar em nossa comunidade, voc\u00ea poder\u00e1 salvar suas rotas na nuvem com seguran\u00e7a e compartilh\u00e1-las com os amigos.\"\r\n          }\r\n        },\r\n        {\r\n          \"@type\": \"Question\",\r\n          \"name\": \"Posso exportar meu itiner\u00e1rio tur\u00edstico para o Google Calendar ou PDF?\",\r\n          \"acceptedAnswer\": {\r\n            \"@type\": \"Answer\",\r\n            \"text\": \"Absolutamente. O planejador de viagens da Space Journey possui um recurso premium de Exporta\u00e7\u00e3o que permite sincronizar automaticamente todos os dias e atividades com o Google Calendar, Apple Calendar ou Outlook.\"\r\n          }\r\n        }\r\n      ]\r\n    }\r\n  ]\r\n}\r\n<\/script>\r\n\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%3DeyJpZCI6NDU1NSwidG9nZ2xlIjp0cnVlfQ%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>Planejador de viagens Projete sua aventura perfeita em minutos. Adicione experi\u00eancias exclusivas, organize seus dias e exporte o percurso para seu Calend\u00e1rio. Gratuito e sem estresse. Comece a planejar Plataforma para viajantes Como organizar uma viagem com nosso criador de roteiro interativo? 1. Escolha seu destino e d\u00ea um nome \u00e0 sua aventura. Seja voc\u00ea [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4353,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"pmpro_default_level":"","footnotes":""},"class_list":["post-4351","page","type-page","status-publish","has-post-thumbnail","hentry","pmpro-has-access"],"acf":{"sj_mobile_hero":4394},"_links":{"self":[{"href":"https:\/\/spacejourney.app\/pt-br\/wp-json\/wp\/v2\/pages\/4351","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spacejourney.app\/pt-br\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spacejourney.app\/pt-br\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spacejourney.app\/pt-br\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spacejourney.app\/pt-br\/wp-json\/wp\/v2\/comments?post=4351"}],"version-history":[{"count":48,"href":"https:\/\/spacejourney.app\/pt-br\/wp-json\/wp\/v2\/pages\/4351\/revisions"}],"predecessor-version":[{"id":7790,"href":"https:\/\/spacejourney.app\/pt-br\/wp-json\/wp\/v2\/pages\/4351\/revisions\/7790"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/spacejourney.app\/pt-br\/wp-json\/wp\/v2\/media\/4353"}],"wp:attachment":[{"href":"https:\/\/spacejourney.app\/pt-br\/wp-json\/wp\/v2\/media?parent=4351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}