' +
+ renderNavbar() +
+ renderTicker() +
+ renderHero() +
+ renderJourney() +
+ renderDestinations(6) +
+ renderLifestyle() +
+ renderVisas() +
+ renderVoices() +
+ renderFaq() +
+ renderFooter() +
+ "
"
+ );
+ }
+
+ function pageExplore() {
+ return (
+ '
-
-
+
+ 离线镜像 · 样式与结构同步官网 H5 · 数据为本机快照 · 完整互动请打开 nomadweb.nomadro.com
+
+
←
diff --git a/redmini/release/nomadro.css b/redmini/release/nomadro.css
new file mode 100644
index 0000000..8a5206b
--- /dev/null
+++ b/redmini/release/nomadro.css
@@ -0,0 +1,12011 @@
+/* Mirror of frontend/src/app/globals.css (Chrome61 sanitized for XHS offline) */
+/* ===== CSS Variables & Reset ===== */
+:root {
+ --bg-primary: #0a0e17;
+ --bg-secondary: #111827;
+ --bg-card: rgba(17, 24, 39, 0.7);
+ --bg-glass: rgba(255, 255, 255, 0.05);
+ --text-primary: #f1f5f9;
+ --text-secondary: #94a3b8;
+ --text-muted: #64748b;
+ --accent-1: #FF6B6B;
+ --accent-2: #FFE66D;
+ --accent-3: #4ECDC4;
+ --accent-4: #A78BFA;
+ --gradient-main: linear-gradient(135deg, #FF6B6B, #FFE66D, #4ECDC4);
+ --gradient-text: linear-gradient(135deg, #FF6B6B 0%, #FFE66D 50%, #4ECDC4 100%);
+ --shadow-glow: 0 0 40px rgba(78, 205, 196, 0.15);
+ --shadow-card: 0 8px 32px rgba(0, 0, 0, 0.3);
+ --border-glass: 1px solid rgba(255, 255, 255, 0.08);
+ --radius-sm: 8px;
+ --radius-md: 16px;
+ --radius-lg: 24px;
+ --radius-xl: 32px;
+ --font-display: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", sans-serif;
+ --font-body: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", sans-serif;
+ --nav-height: 72px;
+ --transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+[data-theme="light"] {
+ --bg-primary: #f8fafc;
+ --bg-secondary: #ffffff;
+ --bg-card: rgba(255, 255, 255, 0.85);
+ --bg-glass: rgba(0, 0, 0, 0.03);
+ --text-primary: #0f172a;
+ --text-secondary: #475569;
+ --text-muted: #94a3b8;
+ --shadow-glow: 0 0 40px rgba(78, 205, 196, 0.1);
+ --shadow-card: 0 8px 32px rgba(0, 0, 0, 0.08);
+ --border-glass: 1px solid rgba(0, 0, 0, 0.06);
+}
+
+/*
+ * MUST stay in @layer base. Unlayered * { padding:0; margin:0 } beats
+ * Tailwind @layer utilities (px-12 / mx-auto), which zeroed ebook paper
+ * padding and broke reader centering.
+ */
+
+ *, *::before, *::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+
+
+html {
+ scroll-behavior: smooth;
+ scroll-padding-top: var(--nav-height);
+}
+
+/* Ebook routes: don't steal sticky chrome or pad for main nav */
+
+
+body {
+ font-family: var(--font-body);
+ background: var(--bg-primary);
+ color: var(--text-primary);
+ line-height: 1.6;
+ overflow-x: hidden;
+ transition: background var(--transition), color var(--transition);
+}
+
+/*
+ * ?????? overflow-x: hidden|clip ???? sticky ??
+ *????????????????? ?? ??????????
+ * ebook ?? html/body ?? visible?
+ */
+
+
+
+a {
+ text-decoration: none;
+ color: inherit;
+}
+
+img { max-width: 100%; display: block; }
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 24px;
+}
+
+/* ===== Particle Canvas ===== */
+#particle-canvas {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 0;
+ pointer-events: none;
+}
+
+/* ===== Navbar ===== */
+.navbar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: var(--nav-height);
+ z-index: 1000;
+ transition: all var(--transition);
+ background: transparent;
+}
+
+.navbar.scrolled {
+ background: rgba(10, 14, 23, 0.85);
+ backdrop-filter: blur(20px);
+ border-bottom: var(--border-glass);
+ box-shadow: 0 4px 30px rgba(0, 0, 0, 0.2);
+}
+
+[data-theme="light"] .navbar.scrolled {
+ background: rgba(248, 250, 252, 0.9);
+}
+
+.nav-container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 24px;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ gap: 16px;
+}
+
+.nav-container > .logo {
+ flex-shrink: 0;
+}
+
+.nav-container > .nav-links {
+ flex: 1;
+ justify-content: center;
+ min-width: 0;
+}
+
+.nav-utils {
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ gap: 8px;
+ margin-left: auto;
+ flex-shrink: 0;
+}
+
+.nav-utils .nav-lang-btn,
+.nav-utils .nav-cta,
+.nav-utils .nav-notify {
+ flex-shrink: 0;
+}
+
+.nav-utils .nav-cta {
+ width: 36px;
+ height: 36px;
+ font-size: 1.05rem;
+}
+
+.nav-notify-guest {
+ opacity: 0.85;
+}
+
+.logo {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-family: var(--font-display);
+ font-weight: 800;
+ font-size: 1.35rem;
+ letter-spacing: -0.02em;
+}
+
+.logo span {
+ background: linear-gradient(135deg, #FF6B6B, #FFE66D, #4ECDC4);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.logo-icon {
+ width: 36px;
+ height: 36px;
+ animation: logoSpin 20s linear infinite;
+ flex-shrink: 0;
+}
+
+@keyframes logoSpin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+.nav-links {
+ display: flex;
+ gap: 8px;
+}
+
+.nav-links a {
+ padding: 8px 16px;
+ border-radius: var(--radius-sm);
+ font-size: 0.9rem;
+ font-weight: 500;
+ color: var(--text-secondary);
+ transition: all var(--transition);
+}
+
+.nav-links a:hover {
+ color: var(--text-primary);
+ background: var(--bg-glass);
+}
+
+.nav-cta {
+ width: 44px;
+ height: 44px;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.2rem;
+ transition: all var(--transition);
+ backdrop-filter: blur(10px);
+}
+
+.nav-cta:hover {
+ transform: scale(1.1);
+ box-shadow: var(--shadow-glow);
+}
+
+.mobile-menu-btn {
+ display: none;
+ flex-direction: column;
+ gap: 5px;
+ background: none;
+ border: none;
+ cursor: pointer;
+ padding: 8px;
+}
+
+.mobile-menu-btn span {
+ display: block;
+ width: 24px;
+ height: 2px;
+ background: var(--text-primary);
+ border-radius: 2px;
+ transition: all 0.3s ease;
+ transform-origin: center;
+}
+
+.mobile-menu-btn.open span:nth-child(1) {
+ transform: translateY(7px) rotate(45deg);
+}
+
+.mobile-menu-btn.open span:nth-child(2) {
+ opacity: 0;
+ transform: scaleX(0);
+}
+
+.mobile-menu-btn.open span:nth-child(3) {
+ transform: translateY(-7px) rotate(-45deg);
+}
+
+/* ===== Hero ===== */
+.hero {
+ position: relative;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding: calc(var(--nav-height) + 52px) 24px 80px;
+ z-index: 1;
+ overflow: hidden;
+}
+
+.hero-bg-shapes {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ z-index: 0;
+}
+
+.hero-inner {
+ position: relative;
+ z-index: 1;
+ width: 100%;
+ max-width: 1200px;
+ margin: 0 auto;
+}
+
+.hero-top {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ align-items: center;
+ gap: 32px 48px;
+}
+
+.hero-content {
+ min-width: 0;
+}
+
+.hero-bottom {
+ margin-top: 40px;
+}
+
+.hero-visual {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ width: 100%;
+ overflow: visible;
+}
+
+.globe-container {
+ position: relative;
+ width: 100%;
+ max-width: 400px;
+ margin: 0 auto;
+ overflow: visible;
+}
+
+.hero-bg-shapes .shape {
+ position: absolute;
+ border-radius: 50%;
+ filter: blur(80px);
+ opacity: 0.4;
+ animation: floatShape 8s ease-in-out infinite;
+}
+
+.shape-1 {
+ width: 400px;
+ height: 400px;
+ background: var(--accent-1);
+ top: 10%;
+ left: -10%;
+ animation-delay: 0s;
+}
+
+.shape-2 {
+ width: 300px;
+ height: 300px;
+ background: var(--accent-3);
+ top: 50%;
+ right: -5%;
+ animation-delay: -3s;
+}
+
+.shape-3 {
+ width: 250px;
+ height: 250px;
+ background: var(--accent-2);
+ bottom: 10%;
+ left: 30%;
+ animation-delay: -5s;
+}
+
+@keyframes floatShape {
+ 0%, 100% { transform: translate(0, 0) scale(1); }
+ 33% { transform: translate(30px, -30px) scale(1.05); }
+ 66% { transform: translate(-20px, 20px) scale(0.95); }
+}
+
+.hero-badge {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 8px 20px;
+ border-radius: 100px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 24px;
+ backdrop-filter: blur(10px);
+}
+
+.badge-dot {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background: #22c55e;
+ animation: pulse 2s ease-in-out infinite;
+}
+
+@keyframes pulse {
+ 0%, 100% { opacity: 1; transform: scale(1); }
+ 50% { opacity: 0.5; transform: scale(1.5); }
+}
+
+.hero-title {
+ font-family: var(--font-display);
+ font-size: clamp(2.5rem, 5vw, 4rem);
+ font-weight: 800;
+ line-height: 1.15;
+ margin-bottom: 20px;
+ letter-spacing: -0.02em;
+}
+
+.gradient-text {
+ background: var(--gradient-text);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ background-size: 200% auto;
+ animation: gradientShift 4s ease-in-out infinite;
+}
+
+@keyframes gradientShift {
+ 0%, 100% { background-position: 0% center; }
+ 50% { background-position: 100% center; }
+}
+
+.hero-subtitle {
+ font-size: 1.1rem;
+ color: var(--text-secondary);
+ margin-bottom: 0;
+ max-width: 480px;
+ line-height: 1.8;
+}
+
+.hero-actions {
+ display: flex;
+ gap: 16px;
+ margin-bottom: 32px;
+ flex-wrap: wrap;
+}
+
+.btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 14px 28px;
+ border-radius: var(--radius-md);
+ font-weight: 600;
+ font-size: 0.95rem;
+ cursor: pointer;
+ border: none;
+ transition: all var(--transition);
+ font-family: inherit;
+}
+
+.btn-primary {
+ background: var(--gradient-main);
+ color: #0a0e17;
+ box-shadow: 0 4px 20px rgba(255, 107, 107, 0.3);
+}
+
+.btn-primary:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 30px rgba(255, 107, 107, 0.4);
+}
+
+.btn-ghost {
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ color: var(--text-primary);
+ backdrop-filter: blur(10px);
+}
+
+.btn-ghost:hover {
+ background: rgba(255, 255, 255, 0.1);
+ transform: translateY(-2px);
+}
+
+.hero-stats {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+ padding: 24px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+}
+
+.stat-item {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.stat-number {
+ font-family: var(--font-display);
+ font-size: 2rem;
+ font-weight: 800;
+ background: var(--gradient-text);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.stat-label {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ white-space: nowrap;
+}
+
+.stat-divider {
+ width: 1px;
+ height: 40px;
+ background: var(--border-glass);
+}
+
+/* Globe Visual */
+.globe-svg {
+ width: 100%;
+ height: auto;
+ animation: globeFloat 6s ease-in-out infinite;
+}
+
+@keyframes globeFloat {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(-15px); }
+}
+
+.orbit-ring {
+ animation: orbitSpin 20s linear infinite;
+ transform-origin: center;
+}
+
+.orbit-ring-2 {
+ animation-direction: reverse;
+ animation-duration: 15s;
+}
+
+@keyframes orbitSpin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+.continent {
+ animation: continentPulse 4s ease-in-out infinite;
+}
+
+.pulse-dot {
+ animation: dotPulse 2s ease-in-out infinite;
+}
+
+.pulse-dot:nth-child(2) { animation-delay: 0.5s; }
+.pulse-dot:nth-child(3) { animation-delay: 1s; }
+.pulse-dot:nth-child(4) { animation-delay: 1.5s; }
+
+@keyframes dotPulse {
+ 0%, 100% { r: 5; opacity: 1; }
+ 50% { r: 8; opacity: 0.6; }
+}
+
+.flight-path {
+ animation: dashMove 3s linear infinite;
+}
+
+@keyframes dashMove {
+ to { stroke-dashoffset: -20; }
+}
+
+.floating-cards .float-card {
+ position: absolute;
+ padding: 10px 16px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ font-size: 0.8rem;
+ font-weight: 600;
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+ animation: cardFloat 4s ease-in-out infinite;
+ white-space: nowrap;
+}
+
+.float-card small {
+ display: block;
+ font-weight: 400;
+ color: var(--text-muted);
+ font-size: 0.7rem;
+ margin-top: 2px;
+}
+
+.fc-1 { top: 5%; right: -8%; animation-delay: 0s; }
+.fc-2 { top: 38%; left: -14%; animation-delay: -1.5s; }
+.fc-3 { bottom: 10%; right: -2%; animation-delay: -3s; }
+
+@keyframes cardFloat {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(-10px); }
+}
+
+.scroll-indicator {
+ position: absolute;
+ bottom: 30px;
+ left: 50%;
+ transform: translateX(-50%);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+ color: var(--text-muted);
+ font-size: 0.8rem;
+ animation: bounce 2s ease-in-out infinite;
+}
+
+.scroll-arrow svg {
+ opacity: 0.5;
+}
+
+@keyframes bounce {
+ 0%, 100% { transform: translateX(-50%) translateY(0); }
+ 50% { transform: translateX(-50%) translateY(8px); }
+}
+
+/* ===== Sections ===== */
+.section {
+ position: relative;
+ padding: 100px 0;
+ z-index: 1;
+ content-visibility: auto;
+ contain-intrinsic-size: auto 480px;
+}
+
+.section-header {
+ text-align: center;
+ margin-bottom: 60px;
+}
+
+.section-tag {
+ display: inline-block;
+ padding: 6px 16px;
+ border-radius: 100px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ font-size: 0.75rem;
+ font-weight: 600;
+ letter-spacing: 0.1em;
+ color: var(--accent-3);
+ margin-bottom: 16px;
+}
+
+.section-header h2 {
+ font-family: var(--font-display);
+ font-size: clamp(2rem, 4vw, 2.75rem);
+ font-weight: 800;
+ margin-bottom: 12px;
+ letter-spacing: -0.02em;
+}
+
+.section-header p {
+ color: var(--text-secondary);
+ font-size: 1.05rem;
+ max-width: 500px;
+ margin: 0 auto;
+}
+
+/* ===== Destinations ===== */
+.dest-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+}
+
+.dest-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ overflow: hidden;
+ transition: all var(--transition);
+ backdrop-filter: blur(20px);
+ cursor: pointer;
+}
+
+.dest-card:hover {
+ transform: translateY(-8px);
+ box-shadow: var(--shadow-glow);
+ border-color: rgba(78, 205, 196, 0.3);
+}
+
+.dest-img {
+ position: relative;
+ height: 180px;
+ background: linear-gradient(
+ 135deg,
+ hsl(var(--hue, 170), 60%, 20%),
+ hsl(calc(var(--hue, 170) + 40), 50%, 30%)
+ );
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+}
+
+.dest-img::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: radial-gradient(circle at 30% 70%, rgba(255,255,255,0.1), transparent);
+}
+
+.dest-emoji {
+ font-size: 4rem;
+ animation: emojiBounce 3s ease-in-out infinite;
+ filter: drop-shadow(0 4px 12px rgba(0,0,0,0.3));
+}
+
+@keyframes emojiBounce {
+ 0%, 100% { transform: scale(1) rotate(0deg); }
+ 50% { transform: scale(1.1) rotate(5deg); }
+}
+
+.dest-overlay {
+ position: absolute;
+ bottom: 12px;
+ left: 12px;
+}
+
+.dest-tag {
+ padding: 4px 12px;
+ border-radius: 100px;
+ background: rgba(0, 0, 0, 0.5);
+ backdrop-filter: blur(10px);
+ font-size: 0.7rem;
+ color: #fff;
+}
+
+.dest-body {
+ padding: 20px;
+}
+
+.dest-body h3 {
+ font-family: var(--font-display);
+ font-size: 1.15rem;
+ font-weight: 700;
+ margin-bottom: 8px;
+}
+
+.dest-body > p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 16px;
+ line-height: 1.6;
+}
+
+.dest-meta {
+ display: flex;
+ gap: 12px;
+ flex-wrap: wrap;
+ margin-bottom: 12px;
+}
+
+.dest-meta span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ padding: 4px 8px;
+ background: var(--bg-glass);
+ border-radius: var(--radius-sm);
+}
+
+.dest-rating {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 0.85rem;
+}
+
+.stars { font-size: 0.75rem; }
+
+/* ===== Timeline ===== */
+.lifestyle {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.03), transparent);
+}
+
+.timeline {
+ position: relative;
+ max-width: 700px;
+ margin: 0 auto;
+}
+
+.timeline-line {
+ position: absolute;
+ left: 50%;
+ top: 0;
+ bottom: 0;
+ width: 4px;
+ transform: translateX(-50%);
+}
+
+.timeline-svg-line {
+ animation: dashFlow 2s linear infinite;
+}
+
+@keyframes dashFlow {
+ to { stroke-dashoffset: -14; }
+}
+
+.timeline-item {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+ margin-bottom: 40px;
+ position: relative;
+}
+
+.timeline-item:nth-child(even) {
+ flex-direction: row-reverse;
+}
+
+.timeline-item:nth-child(even) .timeline-card {
+ text-align: right;
+}
+
+.timeline-time {
+ flex: 0 0 100px;
+ text-align: center;
+ font-weight: 700;
+ font-size: 0.9rem;
+ color: var(--accent-2);
+ font-family: var(--font-display);
+}
+
+.timeline-card {
+ flex: 1;
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+ position: relative;
+}
+
+.timeline-card:hover {
+ transform: scale(1.02);
+ box-shadow: var(--shadow-glow);
+}
+
+.timeline-icon {
+ font-size: 2rem;
+ margin-bottom: 8px;
+}
+
+.timeline-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.1rem;
+ margin-bottom: 6px;
+}
+
+.timeline-card p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+/* ===== Charts ===== */
+.data-section {
+ background: linear-gradient(180deg, transparent, rgba(255, 107, 107, 0.02), transparent);
+}
+
+.charts-grid {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 24px;
+}
+
+.chart-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 28px;
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.chart-card:hover {
+ box-shadow: var(--shadow-glow);
+}
+
+.chart-card h3 {
+ font-family: var(--font-display);
+ font-size: 1rem;
+ margin-bottom: 20px;
+}
+
+.chart-wrap {
+ position: relative;
+ height: 280px;
+}
+
+.chart-radar {
+ height: 300px;
+}
+
+.chart-wide {
+ grid-column: span 2;
+}
+
+/* ===== Tools ===== */
+.tools-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+}
+
+.tool-card {
+ position: relative;
+ padding: 32px 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+ overflow: hidden;
+}
+
+.tool-card::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 3px;
+ background: var(--gradient-main);
+ transform: scaleX(0);
+ transition: transform var(--transition);
+}
+
+.tool-card:hover::before {
+ transform: scaleX(1);
+}
+
+.tool-card:hover {
+ transform: translateY(-6px);
+ box-shadow: var(--shadow-glow);
+}
+
+.tool-icon-wrap {
+ width: 48px;
+ height: 48px;
+ color: var(--accent-3);
+ margin-bottom: 12px;
+ opacity: 0.6;
+}
+
+.tool-emoji {
+ font-size: 2rem;
+ display: block;
+ margin-bottom: 12px;
+}
+
+.tool-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.1rem;
+ margin-bottom: 8px;
+}
+
+.tool-card > p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 16px;
+}
+
+.tool-tags {
+ display: flex;
+ gap: 6px;
+ flex-wrap: wrap;
+}
+
+.tool-tags span {
+ padding: 3px 10px;
+ border-radius: 100px;
+ font-size: 0.7rem;
+ background: var(--bg-glass);
+ color: var(--text-muted);
+ border: var(--border-glass);
+}
+
+/* ===== Community ===== */
+.testimonials {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+ margin-bottom: 60px;
+}
+
+.testimonial-card {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.testimonial-card:hover {
+ transform: translateY(-4px);
+ box-shadow: var(--shadow-glow);
+}
+
+.testimonial-avatar {
+ font-size: 2.5rem;
+ margin-bottom: 16px;
+}
+
+.testimonial-stars {
+ font-size: 0.8rem;
+ margin-bottom: 12px;
+}
+
+.testimonial-content p {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ line-height: 1.7;
+ margin-bottom: 20px;
+ font-style: italic;
+}
+
+.testimonial-author strong {
+ display: block;
+ font-size: 0.9rem;
+ margin-bottom: 2px;
+}
+
+.testimonial-author span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.cta-banner {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 40px;
+ padding: 48px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ position: relative;
+ overflow: hidden;
+}
+
+.cta-banner::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: var(--gradient-main);
+ opacity: 0.05;
+}
+
+.cta-content {
+ position: relative;
+ z-index: 1;
+}
+
+.cta-content h2 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin-bottom: 8px;
+}
+
+.cta-content p {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+}
+
+.cta-form {
+ display: flex;
+ gap: 12px;
+ position: relative;
+ z-index: 1;
+ flex-shrink: 0;
+}
+
+.cta-form input {
+ padding: 14px 20px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.9rem;
+ width: 280px;
+ outline: none;
+ transition: all var(--transition);
+}
+
+.cta-form input:focus {
+ border-color: var(--accent-3);
+ box-shadow: 0 0 0 3px rgba(78, 205, 196, 0.15);
+}
+
+.cta-form input::placeholder {
+ color: var(--text-muted);
+}
+
+/* ===== Footer ===== */
+.footer {
+ position: relative;
+ z-index: 1;
+ padding: 60px 0 30px;
+ border-top: var(--border-glass);
+ background: var(--bg-secondary);
+}
+
+.footer-grid {
+ display: grid;
+ grid-template-columns: 2fr 1fr 1fr 1fr;
+ gap: 40px;
+ margin-bottom: 40px;
+}
+
+.footer-brand p {
+ color: var(--text-secondary);
+ font-size: 0.85rem;
+ margin: 16px 0;
+ max-width: 280px;
+}
+
+.social-links {
+ display: flex;
+ gap: 12px;
+}
+
+.social-links a {
+ width: 40px;
+ height: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 50%;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ font-size: 1rem;
+ transition: all var(--transition);
+}
+
+.social-links a:hover {
+ transform: translateY(-3px);
+ background: var(--accent-3);
+ color: #0a0e17;
+}
+
+.footer-links h4 {
+ font-family: var(--font-display);
+ font-size: 0.9rem;
+ margin-bottom: 16px;
+ color: var(--text-primary);
+}
+
+.footer-links a {
+ display: block;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ padding: 6px 0;
+ transition: color var(--transition);
+}
+
+.footer-links a:hover {
+ color: var(--accent-3);
+}
+
+.footer-bottom {
+ text-align: center;
+ padding-top: 30px;
+ border-top: var(--border-glass);
+}
+
+.footer-bottom p {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.footer-emoji-bar {
+ margin-top: 12px;
+ font-size: 1.2rem;
+ letter-spacing: 8px;
+ animation: emojiScroll 10s linear infinite;
+}
+
+@keyframes emojiScroll {
+ 0%, 100% { letter-spacing: 8px; }
+ 50% { letter-spacing: 16px; }
+}
+
+/* ===== Toast ===== */
+.toast {
+ position: fixed;
+ bottom: 30px;
+ right: 30px;
+ padding: 16px 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ backdrop-filter: blur(20px);
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ box-shadow: var(--shadow-card);
+ transform: translateY(100px);
+ opacity: 0;
+ transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
+ z-index: 2000;
+}
+
+.toast.show {
+ transform: translateY(0);
+ opacity: 1;
+}
+
+/* ===== Reveal Animation ===== */
+.reveal {
+ opacity: 0;
+ transform: translateY(30px);
+ transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.reveal.visible {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+/* Sub-pages use SiteShell, not HomeClient ? ensure content is never stuck hidden */
+:not(.home-flow) .reveal {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+:not(.home-flow) .reveal.visible {
+ transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* Deferred kits: once mounted, never stay invisible if JS timing races */
+[data-deferred="ready"] .reveal {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+.deferred-skeleton {
+ height: 120px;
+ margin: 24px auto;
+ max-width: 1200px;
+ border-radius: var(--radius-xl);
+ background: linear-gradient(90deg, rgba(255,255,255,0.03), rgba(255,255,255,0.07), rgba(255,255,255,0.03));
+ background-size: 200% 100%;
+ animation: deferredShimmer 1.2s ease-in-out infinite;
+}
+
+@keyframes deferredShimmer {
+ 0% { background-position: 100% 0; }
+ 100% { background-position: -100% 0; }
+}
+
+.focus-streak {
+ text-align: center;
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin: -4px 0 12px;
+}
+
+.focus-streak b {
+ color: var(--accent-3);
+ font-size: 1.1rem;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .reveal {
+ opacity: 1;
+ transform: none;
+ transition: none;
+ }
+ .deferred-skeleton { animation: none; }
+ .loader-ring,
+ .loader-progress { animation: none !important; }
+}
+
+/* ===== Responsive ===== */
+@media (max-width: 1024px) {
+ .hero-top {
+ grid-template-columns: 1fr;
+ text-align: center;
+ gap: 28px;
+ }
+
+ .hero-subtitle { margin: 0 auto; max-width: 100%; }
+ .hero-actions { justify-content: center; }
+ .hero-stats { justify-content: center; }
+ .hero-visual { order: -1; }
+ .globe-container { max-width: 280px; }
+ .floating-cards .float-card { display: none; }
+
+ .dest-grid { grid-template-columns: repeat(2, 1fr); }
+ .tools-grid { grid-template-columns: repeat(2, 1fr); }
+ .testimonials { grid-template-columns: 1fr; }
+ .footer-grid { grid-template-columns: repeat(2, 1fr); }
+}
+
+@media (max-width: 768px) {
+ .nav-links {
+ display: none;
+ flex-direction: column;
+ position: absolute;
+ top: var(--nav-height);
+ left: 0;
+ right: 0;
+ background: var(--bg-secondary);
+ padding: 20px;
+ border-bottom: var(--border-glass);
+ opacity: 0;
+ transform: translateY(-8px);
+ pointer-events: none;
+ transition: all 0.3s ease;
+ }
+ .nav-links.open {
+ display: flex;
+ opacity: 1;
+ transform: translateY(0);
+ pointer-events: auto;
+ }
+
+ .mobile-menu-btn { display: flex; }
+
+ .hero-stats {
+ flex-direction: column;
+ gap: 16px;
+ }
+
+ .stat-divider {
+ width: 40px;
+ height: 1px;
+ }
+
+ .dest-grid { grid-template-columns: 1fr; }
+ .charts-grid { grid-template-columns: 1fr; }
+ .chart-wide { grid-column: span 1; }
+ .tools-grid { grid-template-columns: 1fr; }
+
+ .timeline-item,
+ .timeline-item:nth-child(even) {
+ flex-direction: column;
+ text-align: center;
+ }
+
+ .timeline-item:nth-child(even) .timeline-card {
+ text-align: center;
+ }
+
+ .timeline-line { display: none; }
+ .timeline-time { flex: none; }
+
+ .cta-banner {
+ flex-direction: column;
+ text-align: center;
+ padding: 32px 24px;
+ }
+
+ .cta-form {
+ flex-direction: column;
+ width: 100%;
+ }
+
+ .cta-form input { width: 100%; }
+
+ .footer-grid { grid-template-columns: 1fr; }
+}
+
+/* ===== Loader ===== */
+.loader {
+ position: fixed;
+ inset: 0;
+ z-index: 9999;
+ background: var(--bg-primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: opacity 0.6s ease, visibility 0.6s ease;
+}
+
+.loader.hidden,
+.loader.loader-done {
+ opacity: 0;
+ visibility: hidden;
+ pointer-events: none;
+}
+
+.loader-inner {
+ text-align: center;
+}
+
+.loader-globe {
+ width: 80px;
+ height: 80px;
+ margin-bottom: 16px;
+}
+
+.loader-ring {
+ animation: loaderSpin 1.5s linear infinite;
+ transform-origin: center;
+}
+
+@keyframes loaderSpin {
+ to { transform: rotate(360deg); }
+}
+
+.loader-text {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ font-weight: 800;
+ background: var(--gradient-text);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ margin-bottom: 20px;
+}
+
+.loader-bar {
+ width: 200px;
+ height: 3px;
+ background: var(--bg-glass);
+ border-radius: 3px;
+ overflow: hidden;
+ margin: 0 auto;
+}
+
+.loader-progress {
+ height: 100%;
+ background: var(--gradient-main);
+ border-radius: 3px;
+ animation: loaderProgress 1.8s ease-in-out forwards;
+}
+
+@keyframes loaderProgress {
+ from { width: 0; }
+ to { width: 100%; }
+}
+
+/* ===== Ticker ===== */
+.ticker-bar {
+ position: fixed;
+ top: var(--nav-height);
+ left: 0;
+ right: 0;
+ z-index: 999;
+ background: rgba(10, 14, 23, 0.9);
+ backdrop-filter: blur(10px);
+ border-bottom: var(--border-glass);
+ overflow: hidden;
+ height: 32px;
+}
+
+[data-theme="light"] .ticker-bar {
+ background: rgba(248, 250, 252, 0.95);
+}
+
+.ticker-track {
+ display: flex;
+ gap: 60px;
+ animation: tickerScroll 30s linear infinite;
+ white-space: nowrap;
+ padding: 6px 0;
+}
+
+.ticker-track span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ flex-shrink: 0;
+}
+
+@keyframes tickerScroll {
+ from { transform: translateX(0); }
+ to { transform: translateX(-50%); }
+}
+
+/* Adjust hero for ticker */
+.hero {
+ padding-top: calc(var(--nav-height) + 52px);
+}
+
+/* ===== Typewriter ===== */
+.typewriter-cursor {
+ color: var(--accent-3);
+ animation: blink 1s step-end infinite;
+ font-weight: 300;
+}
+
+@keyframes blink {
+ 50% { opacity: 0; }
+}
+
+/* ===== Map Section ===== */
+.map-section {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.02), transparent);
+}
+
+.map-wrapper {
+ display: grid;
+ grid-template-columns: 1.4fr 1fr;
+ gap: 32px;
+ align-items: stretch;
+}
+
+.map-svg-container {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 24px;
+ backdrop-filter: blur(20px);
+ overflow: hidden;
+}
+
+.world-map {
+ width: 100%;
+ height: auto;
+}
+
+.map-pin {
+ cursor: pointer;
+ transition: transform 0.3s ease;
+}
+
+.map-pin:hover {
+ transform: scale(1.3);
+}
+
+.map-pin.active circle:nth-child(2) {
+ fill: #fff;
+}
+
+.pin-pulse {
+ animation: pinPulse 2s ease-in-out infinite;
+}
+
+@keyframes pinPulse {
+ 0%, 100% { r: 20; opacity: 0.3; }
+ 50% { r: 28; opacity: 0.1; }
+}
+
+.map-info-panel {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+ backdrop-filter: blur(20px);
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ min-height: 300px;
+ transition: all var(--transition);
+}
+
+.map-info-default {
+ text-align: center;
+ color: var(--text-muted);
+}
+
+.map-info-icon {
+ font-size: 3rem;
+ display: block;
+ margin-bottom: 16px;
+}
+
+.map-info-default h3 {
+ font-family: var(--font-display);
+ color: var(--text-primary);
+ margin-bottom: 8px;
+}
+
+.map-info-city {
+ animation: fadeInUp 0.4s ease;
+}
+
+.map-info-city .city-emoji {
+ font-size: 3.5rem;
+ margin-bottom: 12px;
+}
+
+.map-info-city h3 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin-bottom: 8px;
+}
+
+.map-info-city .city-desc {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin-bottom: 20px;
+ line-height: 1.6;
+}
+
+.map-info-stats {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 12px;
+}
+
+.map-stat {
+ padding: 12px;
+ background: var(--bg-glass);
+ border-radius: var(--radius-md);
+ text-align: center;
+ font-size: 0.85rem;
+}
+
+.map-stat strong {
+ display: block;
+ font-size: 1.1rem;
+ color: var(--accent-3);
+ margin-bottom: 2px;
+}
+
+@keyframes fadeInUp {
+ from { opacity: 0; transform: translateY(15px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* ===== Destination Filters ===== */
+.dest-filters {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ margin-bottom: 32px;
+ flex-wrap: wrap;
+}
+
+.filter-search {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 10px 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ flex: 1;
+ min-width: 200px;
+ max-width: 280px;
+}
+
+.filter-search svg {
+ color: var(--text-muted);
+ flex-shrink: 0;
+}
+
+.filter-search input {
+ background: none;
+ border: none;
+ outline: none;
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.9rem;
+ width: 100%;
+}
+
+.filter-search input::placeholder {
+ color: var(--text-muted);
+}
+
+.filter-tags {
+ display: flex;
+ gap: 8px;
+ flex-wrap: wrap;
+}
+
+.filter-btn {
+ padding: 8px 16px;
+ border-radius: 100px;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-secondary);
+ font-family: inherit;
+ font-size: 0.8rem;
+ cursor: pointer;
+ transition: all var(--transition);
+ white-space: nowrap;
+}
+
+.filter-btn:hover,
+.filter-btn.active {
+ background: var(--accent-3);
+ color: #0a0e17;
+ border-color: var(--accent-3);
+}
+
+.filter-sort select {
+ padding: 10px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.85rem;
+ cursor: pointer;
+ outline: none;
+}
+
+.dest-card.hidden-card {
+ display: none;
+}
+
+.dest-empty {
+ text-align: center;
+ padding: 60px 20px;
+ color: var(--text-muted);
+ font-size: 1.1rem;
+}
+
+/* ===== Visa Section ===== */
+.visa-section {
+ background: linear-gradient(180deg, transparent, rgba(255, 230, 109, 0.02), transparent);
+}
+
+.visa-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+}
+
+.visa-card {
+ position: relative;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.visa-card:hover {
+ transform: translateY(-6px);
+ box-shadow: var(--shadow-glow);
+ border-color: rgba(255, 230, 109, 0.3);
+}
+
+.visa-flag {
+ font-size: 2.5rem;
+ margin-bottom: 12px;
+}
+
+.visa-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.1rem;
+ margin-bottom: 12px;
+}
+
+.visa-badge {
+ display: inline-block;
+ padding: 4px 12px;
+ border-radius: 100px;
+ font-size: 0.7rem;
+ font-weight: 600;
+ margin-bottom: 16px;
+}
+
+.visa-badge.easy { background: rgba(78, 205, 196, 0.2); color: var(--accent-3); }
+.visa-badge.hot { background: rgba(255, 107, 107, 0.2); color: var(--accent-1); }
+.visa-badge.budget { background: rgba(255, 230, 109, 0.2); color: var(--accent-2); }
+.visa-badge.new { background: rgba(167, 139, 250, 0.2); color: var(--accent-4); }
+.visa-badge.pioneer { background: rgba(96, 165, 250, 0.2); color: #60A5FA; }
+
+.visa-details {
+ list-style: none;
+ margin-bottom: 20px;
+}
+
+.visa-details li {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ padding: 6px 0;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
+}
+
+.visa-progress {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.progress-bar {
+ flex: 1;
+ height: 6px;
+ background: var(--bg-glass);
+ border-radius: 3px;
+ overflow: hidden;
+}
+
+.progress-fill {
+ height: 100%;
+ background: var(--gradient-main);
+ border-radius: 3px;
+ transition: width 1s ease;
+}
+
+.progress-label {
+ white-space: nowrap;
+ font-weight: 600;
+ color: var(--accent-3);
+}
+
+/* ===== FAQ ===== */
+.faq-section {
+ background: linear-gradient(180deg, transparent, rgba(167, 139, 250, 0.02), transparent);
+}
+
+.faq-list {
+ max-width: 800px;
+ margin: 0 auto;
+}
+
+.faq-item {
+ margin-bottom: 12px;
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ overflow: hidden;
+ background: var(--bg-card);
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.faq-item.active {
+ border-color: rgba(78, 205, 196, 0.3);
+ box-shadow: var(--shadow-glow);
+}
+
+.faq-question {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 20px 24px;
+ background: none;
+ border: none;
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.95rem;
+ font-weight: 600;
+ cursor: pointer;
+ text-align: left;
+ transition: color var(--transition);
+}
+
+.faq-question:hover {
+ color: var(--accent-3);
+}
+
+.faq-chevron {
+ flex-shrink: 0;
+ transition: transform 0.3s ease;
+ color: var(--text-muted);
+}
+
+.faq-item.active .faq-chevron {
+ transform: rotate(180deg);
+ color: var(--accent-3);
+}
+
+.faq-answer {
+ max-height: 0;
+ overflow: hidden;
+ transition: max-height 0.4s ease, padding 0.4s ease;
+}
+
+.faq-item.active .faq-answer {
+ max-height: 300px;
+}
+
+.faq-answer p {
+ padding: 0 24px 20px;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ line-height: 1.7;
+}
+
+/* ===== Modal ===== */
+.modal-overlay {
+ position: fixed;
+ inset: 0;
+ z-index: 3000;
+ background: rgba(0, 0, 0, 0.6);
+ backdrop-filter: blur(8px);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 24px;
+ opacity: 0;
+ visibility: hidden;
+ transition: all 0.3s ease;
+}
+
+.modal-overlay.open {
+ opacity: 1;
+ visibility: visible;
+}
+
+.modal {
+ background: var(--bg-secondary);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ max-width: 560px;
+ width: 100%;
+ max-height: 85vh;
+ overflow-y: auto;
+ position: relative;
+ transform: scale(0.9) translateY(20px);
+ transition: transform 0.3s ease;
+}
+
+.modal-overlay.open .modal {
+ transform: scale(1) translateY(0);
+}
+
+.modal-close {
+ position: absolute;
+ top: 16px;
+ right: 16px;
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ cursor: pointer;
+ font-size: 1rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all var(--transition);
+ z-index: 1;
+}
+
+.modal-close:hover {
+ background: var(--accent-1);
+ color: #fff;
+}
+
+.modal-hero {
+ height: 200px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 5rem;
+ position: relative;
+}
+
+.modal-hero::after {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(transparent 50%, var(--bg-secondary));
+}
+
+.modal-body {
+ padding: 24px 32px 32px;
+}
+
+.modal-body h2 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin-bottom: 8px;
+}
+
+.modal-body .modal-tag {
+ display: inline-block;
+ padding: 4px 12px;
+ border-radius: 100px;
+ background: var(--bg-glass);
+ font-size: 0.75rem;
+ color: var(--accent-3);
+ margin-bottom: 16px;
+}
+
+.modal-body p {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ line-height: 1.7;
+ margin-bottom: 24px;
+}
+
+.modal-stats {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 12px;
+ margin-bottom: 24px;
+}
+
+.modal-stat {
+ text-align: center;
+ padding: 16px 8px;
+ background: var(--bg-glass);
+ border-radius: var(--radius-md);
+}
+
+.modal-stat .stat-emoji {
+ font-size: 1.5rem;
+ display: block;
+ margin-bottom: 4px;
+}
+
+.modal-stat strong {
+ display: block;
+ font-size: 1rem;
+ margin-bottom: 2px;
+}
+
+.modal-stat span {
+ font-size: 0.7rem;
+ color: var(--text-muted);
+}
+
+.modal-highlights h4 {
+ font-size: 0.9rem;
+ margin-bottom: 12px;
+}
+
+.modal-highlights ul {
+ list-style: none;
+}
+
+.modal-highlights li {
+ padding: 8px 0;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
+}
+
+/* ===== Back to Top ===== */
+.back-to-top {
+ position: fixed;
+ bottom: 30px;
+ left: 30px;
+ width: 48px;
+ height: 48px;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-card);
+ backdrop-filter: blur(20px);
+ color: var(--text-primary);
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ opacity: 0;
+ visibility: hidden;
+ transform: translateY(20px);
+ transition: all var(--transition);
+ z-index: 1000;
+ box-shadow: var(--shadow-card);
+}
+
+.back-to-top.visible {
+ opacity: 1;
+ visibility: visible;
+ transform: translateY(0);
+}
+
+.back-to-top:hover {
+ background: var(--accent-3);
+ color: #0a0e17;
+ transform: translateY(-4px);
+}
+
+/* ===== Nav Active ===== */
+.nav-links a.active {
+ color: var(--accent-3);
+ background: rgba(78, 205, 196, 0.1);
+}
+
+/* ===== Responsive additions ===== */
+@media (max-width: 1024px) {
+ .map-wrapper { grid-template-columns: 1fr; }
+ .visa-grid { grid-template-columns: repeat(2, 1fr); }
+}
+
+@media (max-width: 768px) {
+ .ticker-bar { display: none; }
+ .hero { padding-top: calc(var(--nav-height) + 20px); }
+ .dest-filters { flex-direction: column; align-items: stretch; }
+ .filter-search { max-width: none; }
+ .filter-tags { justify-content: center; }
+ .visa-grid { grid-template-columns: 1fr; }
+ .modal-stats { grid-template-columns: 1fr; }
+ .back-to-top { bottom: 20px; left: 20px; }
+}
+
+/* ===== Calculator ===== */
+.calculator-section {
+ background: linear-gradient(180deg, transparent, rgba(167, 139, 250, 0.02), transparent);
+}
+
+.calculator-wrapper {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 32px;
+ align-items: start;
+}
+
+.calculator-form {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+ backdrop-filter: blur(20px);
+}
+
+.calc-field {
+ margin-bottom: 24px;
+}
+
+.calc-field label {
+ display: block;
+ font-weight: 600;
+ font-size: 0.9rem;
+ margin-bottom: 10px;
+}
+
+.calc-field select,
+.calc-field input[type="range"] {
+ width: 100%;
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.9rem;
+}
+
+.calc-options {
+ display: flex;
+ gap: 8px;
+}
+
+.calc-option {
+ flex: 1;
+ padding: 10px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-secondary);
+ font-family: inherit;
+ font-size: 0.85rem;
+ cursor: pointer;
+ transition: all var(--transition);
+}
+
+.calc-option.active,
+.calc-option:hover {
+ background: var(--accent-3);
+ color: #0a0e17;
+ border-color: var(--accent-3);
+}
+
+.calculator-result {
+ min-height: 400px;
+}
+
+.result-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+ backdrop-filter: blur(20px);
+}
+
+.result-header {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ margin-bottom: 28px;
+}
+
+.result-header h3 {
+ font-family: var(--font-display);
+ font-size: 1.3rem;
+}
+
+.result-header p {
+ color: var(--text-muted);
+ font-size: 0.85rem;
+}
+
+.breakdown-item {
+ display: grid;
+ grid-template-columns: 100px 1fr 80px;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 12px;
+ font-size: 0.85rem;
+}
+
+.breakdown-bar {
+ height: 8px;
+ background: var(--bg-glass);
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.breakdown-fill {
+ height: 100%;
+ background: var(--gradient-main);
+ border-radius: 4px;
+ transition: width 0.8s ease;
+}
+
+.result-total {
+ display: flex;
+ justify-content: space-between;
+ margin-top: 24px;
+ padding-top: 24px;
+ border-top: var(--border-glass);
+}
+
+.result-total strong {
+ display: block;
+ font-size: 1.5rem;
+ font-family: var(--font-display);
+}
+
+.result-total span {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.result-placeholder {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 400px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ color: var(--text-muted);
+ text-align: center;
+ gap: 16px;
+}
+
+/* ===== Blog ===== */
+.blog-section {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.02), transparent);
+}
+
+.blog-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+}
+
+.blog-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 28px;
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.blog-card:hover {
+ transform: translateY(-6px);
+ box-shadow: var(--shadow-glow);
+}
+
+.blog-emoji {
+ font-size: 2.5rem;
+ margin-bottom: 12px;
+}
+
+.blog-meta {
+ display: flex;
+ gap: 16px;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ margin-bottom: 12px;
+}
+
+.blog-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.1rem;
+ margin-bottom: 10px;
+ line-height: 1.4;
+}
+
+.blog-card p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.6;
+ margin-bottom: 16px;
+}
+
+.blog-tags {
+ display: flex;
+ gap: 6px;
+ flex-wrap: wrap;
+ margin-bottom: 16px;
+}
+
+.blog-tag {
+ padding: 3px 10px;
+ border-radius: 100px;
+ font-size: 0.7rem;
+ background: var(--bg-glass);
+ color: var(--accent-3);
+ border: var(--border-glass);
+}
+
+.blog-read-more {
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--accent-3);
+ transition: color var(--transition);
+}
+
+.blog-read-more:hover {
+ color: var(--accent-1);
+}
+
+/* ===== Compare Bar ===== */
+.compare-bar {
+ position: fixed;
+ bottom: 30px;
+ right: 30px;
+ z-index: 1500;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 16px 24px;
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+ display: flex;
+ align-items: center;
+ gap: 16px;
+}
+
+.compare-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.85rem;
+}
+
+.compare-table th,
+.compare-table td {
+ padding: 12px;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
+}
+
+.compare-table th {
+ text-align: center;
+}
+
+.compare-table td:first-child {
+ color: var(--text-muted);
+}
+
+.compare-table td:not(:first-child) {
+ text-align: center;
+}
+
+@media (max-width: 1024px) {
+ .calculator-wrapper { grid-template-columns: 1fr; }
+ .blog-grid { grid-template-columns: repeat(2, 1fr); }
+}
+
+@media (max-width: 768px) {
+ .blog-grid { grid-template-columns: 1fr; }
+ .compare-bar { left: 16px; right: 16px; bottom: 16px; flex-wrap: wrap; justify-content: center; }
+}
+
+/* ===== Auth Page ===== */
+.auth-page {
+ min-height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 40px 24px;
+ position: relative;
+ z-index: 1;
+}
+
+.auth-card {
+ width: 100%;
+ max-width: 420px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 40px;
+ backdrop-filter: blur(20px);
+}
+
+.auth-back {
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 24px;
+ display: inline-block;
+}
+
+.auth-header {
+ text-align: center;
+ margin-bottom: 28px;
+}
+
+.auth-header h1 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin: 12px 0 6px;
+}
+
+.auth-header p {
+ color: var(--text-muted);
+ font-size: 0.9rem;
+}
+
+.auth-tabs {
+ display: flex;
+ gap: 8px;
+ margin-bottom: 24px;
+}
+
+.auth-tabs button {
+ flex: 1;
+ padding: 10px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-secondary);
+ font-family: inherit;
+ cursor: pointer;
+ transition: all var(--transition);
+}
+
+.auth-tabs button.active {
+ background: var(--accent-3);
+ color: #0a0e17;
+ border-color: var(--accent-3);
+}
+
+.auth-form .calc-field input {
+ width: 100%;
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.9rem;
+ outline: none;
+}
+
+.auth-error {
+ color: var(--accent-1);
+ font-size: 0.85rem;
+ margin-bottom: 12px;
+}
+
+.auth-divider {
+ text-align: center;
+ margin: 20px 0;
+ color: var(--text-muted);
+ font-size: 0.8rem;
+ position: relative;
+}
+
+.auth-divider::before,
+.auth-divider::after {
+ content: '';
+ position: absolute;
+ top: 50%;
+ width: 40%;
+ height: 1px;
+ background: var(--border-glass);
+}
+
+.auth-divider::before { left: 0; }
+.auth-divider::after { right: 0; }
+
+.auth-hint {
+ text-align: center;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ margin-top: 16px;
+}
+
+/* ===== Detail Pages ===== */
+.detail-page {
+ min-height: 100vh;
+ padding: calc(var(--nav-height) + 40px) 24px 80px;
+ max-width: 800px;
+ margin: 0 auto;
+ position: relative;
+ z-index: 1;
+}
+
+.detail-nav {
+ margin-bottom: 32px;
+}
+
+.detail-nav a {
+ color: var(--accent-3);
+ font-size: 0.9rem;
+ font-weight: 500;
+}
+
+.blog-detail-header {
+ margin-bottom: 40px;
+}
+
+.blog-detail-emoji {
+ font-size: 4rem;
+ margin-bottom: 16px;
+ display: block;
+}
+
+.blog-detail-header h1 {
+ font-family: var(--font-display);
+ font-size: clamp(1.75rem, 4vw, 2.5rem);
+ line-height: 1.3;
+ margin: 16px 0;
+}
+
+.blog-detail-content {
+ line-height: 1.8;
+ color: var(--text-secondary);
+}
+
+.blog-detail-content h2 {
+ font-family: var(--font-display);
+ color: var(--text-primary);
+ font-size: 1.3rem;
+ margin: 32px 0 12px;
+}
+
+.blog-detail-content h3 {
+ color: var(--text-primary);
+ font-size: 1.1rem;
+ margin: 24px 0 8px;
+}
+
+.blog-detail-content p {
+ margin-bottom: 12px;
+}
+
+.blog-detail-content li {
+ margin-left: 20px;
+ margin-bottom: 6px;
+}
+
+.dest-detail-hero {
+ height: 240px;
+ border-radius: var(--radius-xl);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 32px;
+}
+
+.dest-detail-emoji {
+ font-size: 6rem;
+}
+
+.dest-detail-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ margin-bottom: 16px;
+}
+
+.dest-detail-top h1 {
+ font-family: var(--font-display);
+ font-size: 2rem;
+ margin-top: 8px;
+}
+
+.dest-detail-desc {
+ color: var(--text-secondary);
+ line-height: 1.7;
+ margin-bottom: 24px;
+}
+
+/* ===== Nav User ===== */
+.nav-notify {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ font-size: 1rem;
+ text-decoration: none;
+}
+
+.nav-user {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 6px 12px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: 100px;
+ font-size: 0.85rem;
+}
+
+.nav-user-name {
+ max-width: 80px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.nav-user-avatar-img {
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ object-fit: cover;
+ flex-shrink: 0;
+}
+
+.nav-logout {
+ background: none;
+ border: none;
+ color: var(--text-muted);
+ cursor: pointer;
+ font-size: 0.75rem;
+ padding: 2px 4px;
+}
+
+.nav-logout:hover { color: var(--accent-1); }
+
+.nav-login-btn {
+ padding: 8px 20px;
+ border-radius: 100px;
+ background: var(--gradient-main);
+ color: #0a0e17;
+ font-weight: 600;
+ font-size: 0.85rem;
+ transition: transform var(--transition);
+}
+
+.nav-login-btn:hover { transform: scale(1.05); }
+
+.blog-card {
+ text-decoration: none;
+ color: inherit;
+ display: block;
+}
+
+@media (max-width: 768px) {
+ .nav-user-name { display: none; }
+}
+
+/* ===== Profile Page ===== */
+.profile-page {
+ max-width: 900px;
+ margin: 0 auto;
+ padding: calc(var(--nav-height) + 40px) 24px 80px;
+ position: relative;
+ z-index: 1;
+}
+
+.profile-header {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ margin-bottom: 40px;
+ flex-wrap: wrap;
+}
+
+.profile-avatar {
+ font-size: 4rem;
+ width: 80px;
+ height: 80px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: var(--bg-glass);
+ border-radius: 50%;
+ border: var(--border-glass);
+}
+
+.profile-avatar-wrap {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+}
+
+.profile-avatar-img {
+ width: 80px;
+ height: 80px;
+ border-radius: 50%;
+ object-fit: cover;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+}
+
+.profile-avatar-upload {
+ font-size: 0.75rem;
+ color: var(--accent-3);
+ cursor: pointer;
+ opacity: 0.9;
+}
+
+.profile-avatar-upload:hover {
+ opacity: 1;
+ text-decoration: underline;
+}
+
+.profile-info { flex: 1; }
+.profile-info h1 {
+ font-family: var(--font-display);
+ font-size: 1.75rem;
+ margin-bottom: 4px;
+}
+.profile-info p { color: var(--text-muted); font-size: 0.9rem; }
+
+.profile-level {
+ display: inline-block;
+ margin-top: 8px;
+ padding: 4px 14px;
+ border-radius: 100px;
+ background: rgba(78, 205, 196, 0.15);
+ color: var(--accent-3);
+ font-size: 0.8rem;
+ font-weight: 600;
+}
+
+.profile-badges-row {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-top: 8px;
+ align-items: center;
+}
+
+.profile-badges-row .profile-level {
+ margin-top: 0;
+}
+
+.profile-vip-badge {
+ display: inline-block;
+ padding: 4px 12px;
+ border-radius: 100px;
+ background: rgba(255, 193, 7, 0.18);
+ color: #e6b800;
+ font-size: 0.8rem;
+ font-weight: 600;
+}
+
+.profile-stats-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 16px;
+ margin-bottom: 48px;
+}
+
+.profile-connect-block {
+ margin-bottom: 48px;
+}
+
+.profile-connect-title {
+ font-size: 0.95rem;
+ font-weight: 600;
+ margin: 0 0 12px;
+ color: var(--text-muted);
+ letter-spacing: 0.02em;
+}
+
+.profile-connect-stats {
+ margin-bottom: 0;
+ grid-template-columns: repeat(3, 1fr);
+}
+
+.profile-stat-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 24px 16px;
+ text-align: center;
+ backdrop-filter: blur(20px);
+}
+
+a.profile-stat-link {
+ display: block;
+ color: inherit;
+ text-decoration: none;
+ transition: border-color 0.2s ease, transform 0.2s ease;
+}
+
+a.profile-stat-link:hover {
+ border-color: var(--accent, #e8a87c);
+ transform: translateY(-2px);
+}
+
+.profile-stat-card strong {
+ display: block;
+ font-size: 1.75rem;
+ font-family: var(--font-display);
+ margin: 8px 0 4px;
+}
+
+.profile-stat-card span:last-child {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.profile-link {
+ color: var(--accent-3);
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+
+.profile-favorites h2,
+.profile-quick h2 {
+ font-family: var(--font-display);
+ font-size: 1.25rem;
+ margin-bottom: 20px;
+}
+
+.profile-fav-grid {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 16px;
+ margin-bottom: 48px;
+}
+
+.profile-fav-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.profile-fav-card:hover {
+ border-color: rgba(78, 205, 196, 0.3);
+ transform: translateY(-2px);
+}
+
+.profile-fav-card a { text-decoration: none; color: inherit; }
+.fav-emoji { font-size: 2rem; display: block; margin-bottom: 8px; }
+.profile-fav-card h3 { font-size: 1rem; margin-bottom: 4px; }
+.profile-fav-card p { font-size: 0.8rem; color: var(--text-muted); }
+
+.profile-empty {
+ text-align: center;
+ padding: 60px 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ margin-bottom: 48px;
+}
+
+.profile-empty p { color: var(--text-muted); margin: 12px 0 20px; }
+.profile-loading { color: var(--text-muted); padding: 40px; text-align: center; }
+
+.profile-quick-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 12px;
+}
+
+.quick-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-align: center;
+ font-size: 0.9rem;
+ font-weight: 500;
+ transition: all var(--transition);
+ text-decoration: none;
+ color: inherit;
+}
+
+.quick-card:hover {
+ background: var(--accent-3);
+ color: #0a0e17;
+ transform: translateY(-2px);
+}
+
+/* ===== Not Found & Loading ===== */
+.not-found-page,
+.page-loading {
+ min-height: 80vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ position: relative;
+ z-index: 1;
+ gap: 16px;
+}
+
+.not-found-emoji { font-size: 5rem; }
+.not-found-page h1 {
+ font-family: var(--font-display);
+ font-size: 4rem;
+ background: var(--gradient-text);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+.not-found-page p { color: var(--text-muted); }
+
+.page-loading-spinner {
+ width: 48px;
+ height: 48px;
+ border: 3px solid var(--bg-glass);
+ border-top-color: var(--accent-3);
+ border-radius: 50%;
+ animation: spin 0.8s linear infinite;
+}
+
+@keyframes spin { to { transform: rotate(360deg); } }
+.page-loading p { color: var(--text-muted); }
+
+@media (max-width: 768px) {
+ .profile-stats-grid { grid-template-columns: repeat(2, 1fr); }
+ .profile-fav-grid { grid-template-columns: 1fr; }
+ .profile-quick-grid { grid-template-columns: repeat(2, 1fr); }
+}
+
+/* ===== Global Search ===== */
+.search-trigger {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 8px 14px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-muted);
+ font-size: 0.8rem;
+ cursor: pointer;
+ transition: all var(--transition);
+ position: fixed;
+ top: calc(var(--nav-height) + 44px);
+ right: 24px;
+ z-index: 998;
+ backdrop-filter: blur(10px);
+}
+
+.search-trigger:hover {
+ border-color: var(--accent-3);
+ color: var(--text-primary);
+}
+
+.search-trigger kbd {
+ padding: 2px 6px;
+ border-radius: 4px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ font-size: 0.7rem;
+ font-family: inherit;
+}
+
+.search-overlay {
+ position: fixed;
+ inset: 0;
+ z-index: 5000;
+ background: rgba(0, 0, 0, 0.6);
+ backdrop-filter: blur(8px);
+ display: flex;
+ align-items: flex-start;
+ justify-content: center;
+ padding-top: 15vh;
+}
+
+.search-modal {
+ width: 100%;
+ max-width: 560px;
+ background: var(--bg-secondary);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ overflow: hidden;
+ box-shadow: var(--shadow-card);
+ animation: searchIn 0.2s ease;
+}
+
+@keyframes searchIn {
+ from { opacity: 0; transform: scale(0.95) translateY(-10px); }
+ to { opacity: 1; transform: scale(1) translateY(0); }
+}
+
+.search-input-wrap {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 16px 20px;
+ border-bottom: var(--border-glass);
+}
+
+.search-input-wrap input {
+ flex: 1;
+ background: none;
+ border: none;
+ outline: none;
+ color: var(--text-primary);
+ font-size: 1rem;
+ font-family: inherit;
+}
+
+.search-input-wrap button {
+ padding: 4px 8px;
+ border-radius: 4px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ color: var(--text-muted);
+ font-size: 0.7rem;
+ cursor: pointer;
+}
+
+.search-results {
+ max-height: 360px;
+ overflow-y: auto;
+ padding: 8px;
+}
+
+.search-result {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ width: 100%;
+ padding: 12px 16px;
+ border: none;
+ background: none;
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ text-align: left;
+ color: inherit;
+ font-family: inherit;
+ transition: background var(--transition);
+}
+
+.search-result:hover,
+.search-result.active {
+ background: var(--bg-glass);
+}
+
+.search-result-emoji { font-size: 1.5rem; flex-shrink: 0; }
+
+.search-result-text {
+ flex: 1;
+ min-width: 0;
+}
+
+.search-result-text strong {
+ display: block;
+ font-size: 0.9rem;
+ margin-bottom: 2px;
+}
+
+.search-result-text span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: block;
+}
+
+.search-result-type {
+ font-size: 0.7rem;
+ padding: 3px 8px;
+ border-radius: 100px;
+ background: rgba(78, 205, 196, 0.15);
+ color: var(--accent-3);
+ flex-shrink: 0;
+}
+
+.search-empty {
+ padding: 32px;
+ text-align: center;
+ color: var(--text-muted);
+ font-size: 0.9rem;
+}
+
+.search-hints {
+ padding: 24px;
+ text-align: center;
+ color: var(--text-muted);
+ font-size: 0.8rem;
+ line-height: 2;
+}
+
+/* ===== Trip Planner ===== */
+.trip-section {
+ background: linear-gradient(180deg, transparent, rgba(255, 107, 107, 0.02), transparent);
+}
+
+.trip-wrapper {
+ display: grid;
+ grid-template-columns: 320px 1fr;
+ gap: 32px;
+ align-items: start;
+}
+
+.trip-form {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 28px;
+ backdrop-filter: blur(20px);
+ position: sticky;
+ top: calc(var(--nav-height) + 20px);
+}
+
+.trip-form h3 {
+ font-family: var(--font-display);
+ margin-bottom: 20px;
+}
+
+.trip-timeline {
+ min-height: 300px;
+}
+
+.trip-empty {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 300px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ color: var(--text-muted);
+ gap: 12px;
+}
+
+.trip-route {
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ margin-bottom: 24px;
+}
+
+.trip-stop {
+ display: flex;
+ align-items: flex-start;
+ gap: 16px;
+ position: relative;
+}
+
+.trip-stop-dot {
+ font-size: 1.5rem;
+ width: 48px;
+ height: 48px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: 50%;
+ flex-shrink: 0;
+ z-index: 1;
+}
+
+.trip-stop-line {
+ position: absolute;
+ left: 23px;
+ top: 48px;
+ width: 2px;
+ height: calc(100% - 16px);
+ background: linear-gradient(to bottom, var(--accent-3), var(--accent-1));
+ opacity: 0.3;
+}
+
+.trip-stop-card {
+ flex: 1;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 16px 20px;
+ margin-bottom: 16px;
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.trip-stop-card:hover {
+ border-color: rgba(78, 205, 196, 0.3);
+}
+
+.trip-stop-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+}
+
+.trip-remove {
+ background: none;
+ border: none;
+ color: var(--text-muted);
+ cursor: pointer;
+ font-size: 0.8rem;
+ padding: 4px;
+}
+
+.trip-remove:hover { color: var(--accent-1); }
+
+.trip-stop-controls {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+}
+
+.trip-stop-controls input {
+ width: 50px;
+ padding: 4px 8px;
+ border-radius: var(--radius-sm);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ text-align: center;
+}
+
+.trip-stop-cost {
+ margin-left: auto;
+ font-weight: 700;
+ color: var(--accent-3);
+}
+
+.trip-summary {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+ padding: 20px 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ flex-wrap: wrap;
+}
+
+.trip-summary-stat {
+ text-align: center;
+}
+
+.trip-summary-stat span {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ margin-bottom: 4px;
+}
+
+.trip-summary-stat strong {
+ font-family: var(--font-display);
+ font-size: 1.25rem;
+}
+
+@media (max-width: 1024px) {
+ .trip-wrapper { grid-template-columns: 1fr; }
+ .trip-form { position: static; }
+ .search-trigger { top: auto; bottom: 80px; right: 16px; }
+}
+
+@media (max-width: 768px) {
+ .search-trigger span,
+ .search-trigger kbd { display: none; }
+}
+
+/* ===== Scroll Progress ===== */
+.scroll-progress {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 3px;
+ z-index: 9999;
+ background: rgba(255, 255, 255, 0.04);
+}
+
+.scroll-progress-bar {
+ height: 100%;
+ background: linear-gradient(90deg, #FF6B6B, #FFE66D, #4ECDC4);
+ transition: width 0.1s linear;
+ box-shadow: 0 0 12px rgba(78, 205, 196, 0.5);
+}
+
+/* ===== Toast Stack ===== */
+.toast-stack {
+ position: fixed;
+ bottom: 30px;
+ left: 50%;
+ transform: translateX(-50%);
+ z-index: 10000;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ pointer-events: none;
+}
+
+.toast-stack .toast {
+ position: relative;
+ bottom: auto;
+ left: auto;
+ transform: translateY(20px);
+ opacity: 0;
+ animation: toastIn 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
+ pointer-events: auto;
+}
+
+.toast-stack .toast.show { opacity: 1; transform: translateY(0); }
+
+.toast-action {
+ margin-left: 0.35rem;
+ padding: 0.25rem 0.55rem;
+ border-radius: var(--radius-sm, 6px);
+ background: rgba(255, 255, 255, 0.08);
+ color: var(--accent, #4ecdc4);
+ font-size: 0.85rem;
+ font-weight: 600;
+ text-decoration: none;
+ white-space: nowrap;
+}
+.toast-action:hover {
+ background: rgba(255, 255, 255, 0.14);
+}
+
+@keyframes toastIn {
+ from { opacity: 0; transform: translateY(20px) scale(0.95); }
+ to { opacity: 1; transform: translateY(0) scale(1); }
+}
+
+.toast-info { border-color: rgba(78, 205, 196, 0.3); }
+.toast-error { border-color: rgba(255, 107, 107, 0.3); }
+
+/* ===== Destination Matcher ===== */
+.matcher-fab {
+ position: fixed;
+ bottom: 30px;
+ left: 30px;
+ z-index: 1400;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 12px 20px;
+ background: linear-gradient(135deg, rgba(255, 107, 107, 0.9), rgba(78, 205, 196, 0.9));
+ border: none;
+ border-radius: 50px;
+ color: #fff;
+ font-family: inherit;
+ font-weight: 600;
+ font-size: 0.9rem;
+ cursor: pointer;
+ box-shadow: 0 8px 32px rgba(255, 107, 107, 0.3);
+ transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
+ backdrop-filter: blur(10px);
+}
+
+.matcher-fab:hover {
+ transform: translateY(-3px) scale(1.03);
+ box-shadow: 0 12px 40px rgba(255, 107, 107, 0.4);
+}
+
+.matcher-fab-icon { font-size: 1.2rem; }
+
+.matcher-modal {
+ max-width: 560px;
+ width: 95%;
+ overflow: hidden;
+ padding: 0;
+}
+
+.matcher-progress {
+ height: 4px;
+ background: rgba(255, 255, 255, 0.06);
+}
+
+.matcher-progress-bar {
+ height: 100%;
+ background: linear-gradient(90deg, #FF6B6B, #FFE66D, #4ECDC4);
+ transition: width 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.matcher-body {
+ padding: 36px 32px 28px;
+ min-height: 420px;
+}
+
+.matcher-step-meta {
+ text-align: center;
+ margin-bottom: 28px;
+}
+
+.matcher-step-meta h2 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin: 12px 0 8px;
+}
+
+.matcher-step-meta p {
+ color: var(--text-muted);
+ font-size: 0.9rem;
+}
+
+.matcher-options {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.matcher-option {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding: 16px 20px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ cursor: pointer;
+ transition: all 0.25s ease;
+ font-family: inherit;
+ color: var(--text-primary);
+ text-align: left;
+}
+
+.matcher-option:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.08);
+ transform: translateX(6px);
+}
+
+.matcher-option-emoji { font-size: 1.8rem; flex-shrink: 0; }
+
+.matcher-option strong {
+ display: block;
+ font-size: 1rem;
+ margin-bottom: 2px;
+}
+
+.matcher-option span {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.matcher-option-arrow {
+ margin-left: auto;
+ opacity: 0.3;
+ transition: all 0.2s;
+ flex-shrink: 0;
+}
+
+.matcher-option:hover .matcher-option-arrow {
+ opacity: 1;
+ transform: translateX(4px);
+}
+
+.matcher-back {
+ margin-top: 20px;
+ background: none;
+ border: none;
+ color: var(--text-muted);
+ font-family: inherit;
+ cursor: pointer;
+ font-size: 0.85rem;
+ padding: 8px 0;
+}
+
+.matcher-back:hover { color: var(--text-primary); }
+
+.matcher-step,
+.matcher-results {
+ animation: matcherSlide 0.35s ease forwards;
+}
+
+.matcher-forward { animation-name: matcherSlide; }
+.matcher-back { animation-name: matcherSlideBack; }
+
+@keyframes matcherSlide {
+ from { opacity: 0; transform: translateX(30px); }
+ to { opacity: 1; transform: translateX(0); }
+}
+
+@keyframes matcherSlideBack {
+ from { opacity: 0; transform: translateX(-30px); }
+ to { opacity: 1; transform: translateX(0); }
+}
+
+.matcher-result-list {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ margin-bottom: 20px;
+}
+
+.matcher-result-card {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) auto;
+ gap: 10px;
+ padding: 12px 12px 12px 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ color: inherit;
+ transition: all 0.25s ease;
+ align-items: center;
+}
+
+.matcher-result-main {
+ display: grid;
+ grid-template-columns: auto auto 1fr auto;
+ grid-template-rows: auto auto;
+ gap: 4px 12px;
+ align-items: center;
+ text-decoration: none;
+ color: inherit;
+ min-width: 0;
+}
+
+.matcher-add-btn {
+ flex-shrink: 0;
+ padding: 8px 12px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--accent-2);
+ font-size: 0.8rem;
+ font-weight: 600;
+ cursor: pointer;
+ white-space: nowrap;
+}
+.matcher-add-btn:hover {
+ border-color: var(--accent-2);
+ background: color-mix(in srgb, var(--accent-2) 12%, transparent);
+}
+
+.matcher-option.selected {
+ border-color: rgba(78, 205, 196, 0.55);
+ box-shadow: 0 0 0 1px rgba(78, 205, 196, 0.25);
+}
+
+.matcher-result-card:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ transform: translateY(-2px);
+ box-shadow: var(--shadow-card);
+}
+
+.matcher-result-card.top {
+ border-color: rgba(255, 230, 109, 0.4);
+ background: linear-gradient(135deg, rgba(255, 107, 107, 0.06), rgba(78, 205, 196, 0.06));
+}
+
+.matcher-result-rank { font-size: 1.2rem; grid-row: span 2; }
+.matcher-result-emoji { font-size: 2rem; grid-row: span 2; }
+
+.matcher-result-info strong {
+ display: block;
+ font-size: 1rem;
+}
+
+.matcher-result-info span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.matcher-result-score {
+ grid-column: 4;
+ grid-row: 1;
+ text-align: right;
+ font-size: 0.75rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+.matcher-score-bar {
+ width: 80px;
+ height: 4px;
+ background: rgba(255, 255, 255, 0.08);
+ border-radius: 2px;
+ margin-bottom: 4px;
+ overflow: hidden;
+}
+
+.matcher-score-fill {
+ height: 100%;
+ background: linear-gradient(90deg, #FF6B6B, #4ECDC4);
+ border-radius: 2px;
+ transition: width 0.8s ease;
+}
+
+.matcher-result-tags {
+ grid-column: 3 / -1;
+ display: flex;
+ gap: 12px;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.matcher-actions {
+ display: flex;
+ gap: 12px;
+ justify-content: center;
+}
+
+.dest-matcher-btn {
+ margin-top: 16px;
+}
+
+.hero-matcher-btn {
+ cursor: pointer;
+}
+
+/* ===== Compare Modal Enhanced ===== */
+.compare-modal {
+ max-width: 900px;
+ width: 95%;
+}
+
+.compare-modal-body { padding: 36px 32px; }
+
+.compare-modal-header {
+ text-align: center;
+ margin-bottom: 28px;
+}
+
+.compare-modal-header h2 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin: 8px 0;
+}
+
+.compare-cards {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
+ gap: 16px;
+ margin-bottom: 32px;
+}
+
+.compare-city-card {
+ text-align: center;
+ padding: 24px 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ position: relative;
+ transition: all 0.3s ease;
+}
+
+.compare-city-card.winner {
+ border-color: rgba(255, 230, 109, 0.5);
+ background: linear-gradient(180deg, rgba(255, 230, 109, 0.08), transparent);
+}
+
+.compare-winner-badge {
+ position: absolute;
+ top: -10px;
+ left: 50%;
+ transform: translateX(-50%);
+ background: linear-gradient(135deg, #FF6B6B, #FFE66D);
+ color: #0a0e17;
+ font-size: 0.7rem;
+ font-weight: 700;
+ padding: 4px 12px;
+ border-radius: 20px;
+ white-space: nowrap;
+}
+
+.compare-city-emoji { font-size: 2.5rem; display: block; margin-bottom: 8px; }
+
+.compare-city-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.1rem;
+}
+
+.compare-city-country {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.compare-score-ring {
+ position: relative;
+ width: 80px;
+ height: 80px;
+ margin: 16px auto;
+}
+
+.compare-score-ring svg { width: 100%; height: 100%; }
+
+.compare-score-num {
+ position: absolute;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 1.2rem;
+}
+
+.compare-city-link {
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ text-decoration: none;
+}
+
+.compare-city-link:hover { text-decoration: underline; }
+
+.compare-metrics { display: flex; flex-direction: column; gap: 20px; }
+
+.compare-metric-row {
+ display: grid;
+ grid-template-columns: 100px 1fr;
+ gap: 16px;
+ align-items: start;
+}
+
+.compare-metric-label {
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ padding-top: 4px;
+}
+
+.compare-metric-bars { display: flex; flex-direction: column; gap: 8px; }
+
+.compare-bar-item { flex: 1; }
+
+.compare-bar-header {
+ display: flex;
+ justify-content: space-between;
+ font-size: 0.8rem;
+ margin-bottom: 4px;
+}
+
+.compare-best { color: var(--accent-3); font-weight: 600; }
+
+.compare-bar-track {
+ height: 8px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.compare-bar-fill {
+ height: 100%;
+ background: rgba(255, 255, 255, 0.15);
+ border-radius: 4px;
+ transition: width 0.8s cubic-bezier(0.34, 1.56, 0.64, 1);
+ animation: barGrow 0.8s ease forwards;
+}
+
+.compare-bar-fill.best {
+ background: linear-gradient(90deg, #FF6B6B, #4ECDC4);
+}
+
+@keyframes barGrow {
+ from { width: 0 !important; }
+}
+
+/* ===== Timezone Board ===== */
+.timezone-section {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.03), transparent);
+}
+
+.tz-home-clock {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 32px;
+ padding: 28px 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ margin-bottom: 28px;
+ flex-wrap: wrap;
+}
+
+.tz-home-time { display: flex; align-items: center; gap: 16px; }
+
+.tz-live-dot {
+ width: 10px;
+ height: 10px;
+ background: #4ECDC4;
+ border-radius: 50%;
+ animation: pulse 2s infinite;
+}
+
+@keyframes pulse {
+ 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(78, 205, 196, 0.4); }
+ 50% { opacity: 0.8; box-shadow: 0 0 0 8px rgba(78, 205, 196, 0); }
+}
+
+.tz-home-label { font-size: 0.9rem; color: var(--text-muted); }
+
+.tz-home-digits {
+ font-family: var(--font-display);
+ font-size: 2rem;
+ font-weight: 700;
+ font-variant-numeric: tabular-nums;
+}
+
+.tz-seconds {
+ font-size: 1rem;
+ color: var(--text-muted);
+ font-weight: 400;
+}
+
+.tz-work-slider {
+ flex: 1;
+ min-width: 240px;
+}
+
+.tz-work-slider label {
+ display: block;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 12px;
+}
+
+.tz-slider-row {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ font-size: 0.8rem;
+ color: var(--text-muted);
+ margin-bottom: 8px;
+}
+
+.tz-slider-row input[type="range"] {
+ flex: 1;
+ accent-color: var(--accent-3);
+}
+
+.tz-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 16px;
+}
+
+.tz-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ transition: all 0.3s ease;
+}
+
+.tz-card:hover {
+ border-color: rgba(78, 205, 196, 0.3);
+ transform: translateY(-3px);
+}
+
+.tz-card.working {
+ border-color: rgba(78, 205, 196, 0.4);
+ box-shadow: 0 0 20px rgba(78, 205, 196, 0.1);
+}
+
+.tz-card-header {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 16px;
+}
+
+.tz-card-emoji { font-size: 1.5rem; }
+
+.tz-card-header strong {
+ display: block;
+ font-size: 0.95rem;
+}
+
+.tz-card-header span {
+ font-size: 0.7rem;
+ color: var(--text-muted);
+}
+
+.tz-overlap-badge {
+ margin-left: auto;
+ font-size: 0.7rem;
+ font-weight: 600;
+ padding: 3px 10px;
+ border-radius: 20px;
+}
+
+.tz-overlap-badge.excellent { background: rgba(78, 205, 196, 0.2); color: #4ECDC4; }
+.tz-overlap-badge.good { background: rgba(255, 230, 109, 0.2); color: #FFE66D; }
+.tz-overlap-badge.fair { background: rgba(255, 165, 0, 0.2); color: #ffa500; }
+.tz-overlap-badge.poor { background: rgba(255, 107, 107, 0.2); color: #FF6B6B; }
+
+.tz-analog {
+ position: relative;
+ width: 100px;
+ height: 100px;
+ margin: 0 auto 12px;
+}
+
+.tz-analog svg { width: 100%; height: 100%; }
+
+.tz-digital {
+ position: absolute;
+ bottom: -4px;
+ left: 50%;
+ transform: translateX(-50%);
+ font-family: var(--font-display);
+ font-size: 0.85rem;
+ font-weight: 600;
+ font-variant-numeric: tabular-nums;
+}
+
+.tz-overlap-bar {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ margin-bottom: 8px;
+}
+
+.tz-overlap-track {
+ flex: 1;
+ height: 6px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 3px;
+ overflow: hidden;
+}
+
+.tz-overlap-fill {
+ height: 100%;
+ border-radius: 3px;
+ transition: width 0.6s ease;
+}
+
+.tz-overlap-fill.excellent { background: #4ECDC4; }
+.tz-overlap-fill.good { background: #FFE66D; }
+.tz-overlap-fill.fair { background: #ffa500; }
+.tz-overlap-fill.poor { background: #FF6B6B; }
+
+.tz-status {
+ text-align: center;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+/* ===== Keyboard Shortcuts ===== */
+.shortcuts-modal {
+ max-width: 480px;
+ width: 95%;
+}
+
+.shortcuts-body {
+ padding: 36px 32px;
+ text-align: center;
+}
+
+.shortcuts-body h2 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin: 8px 0;
+}
+
+.shortcuts-body p {
+ color: var(--text-muted);
+ font-size: 0.9rem;
+ margin-bottom: 24px;
+}
+
+.shortcuts-grid {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ text-align: left;
+}
+
+.shortcut-item {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 12px 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+}
+
+.shortcut-icon { font-size: 1.2rem; }
+.shortcut-label { flex: 1; font-size: 0.9rem; }
+
+.shortcut-keys {
+ display: flex;
+ gap: 4px;
+}
+
+.shortcut-keys kbd,
+.shortcuts-body kbd {
+ display: inline-block;
+ padding: 3px 8px;
+ background: rgba(255, 255, 255, 0.08);
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ border-radius: 6px;
+ font-family: inherit;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+
+@media (max-width: 768px) {
+ .matcher-fab .matcher-fab-text { display: none; }
+ .matcher-fab { padding: 14px; border-radius: 50%; bottom: 90px; left: 16px; }
+ .compare-metric-row { grid-template-columns: 1fr; }
+ .tz-home-clock { flex-direction: column; text-align: center; }
+ .matcher-result-card { grid-template-columns: 1fr; }
+ .matcher-result-main { grid-template-columns: auto 1fr; }
+ .matcher-result-score { grid-column: 2; grid-row: 2; }
+ .matcher-result-tags { grid-column: 1 / -1; }
+ .matcher-add-btn { width: 100%; }
+}
+
+/* ===== Visa Filters Enhancement ===== */
+.visa-filters {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+ flex-wrap: wrap;
+ margin-bottom: 28px;
+}
+
+.visa-card {
+ transition: all 0.3s ease;
+}
+
+.visa-card:hover {
+ transform: translateY(-4px);
+ border-color: rgba(255, 230, 109, 0.3);
+}
+
+.tool-card {
+ transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.tool-card:hover {
+ transform: translateY(-6px);
+ border-color: rgba(78, 205, 196, 0.3);
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.2);
+}
+
+/* ===== Section Nav ===== */
+.section-nav {
+ position: fixed;
+ right: 20px;
+ top: 50%;
+ transform: translateY(-50%) translateX(60px);
+ z-index: 1300;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ opacity: 0;
+ transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
+ pointer-events: none;
+}
+
+.section-nav.visible {
+ opacity: 1;
+ transform: translateY(-50%) translateX(0);
+ pointer-events: auto;
+}
+
+.section-nav-dot {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 8px 12px 8px 10px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: 50px;
+ cursor: pointer;
+ transition: all 0.25s ease;
+ font-family: inherit;
+ color: var(--text-muted);
+ backdrop-filter: blur(16px);
+ justify-content: flex-end;
+}
+
+.section-nav-dot:hover,
+.section-nav-dot.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ color: var(--text-primary);
+ background: rgba(78, 205, 196, 0.1);
+ transform: translateX(-4px);
+}
+
+.section-nav-dot.active {
+ box-shadow: 0 0 16px rgba(78, 205, 196, 0.2);
+}
+
+.section-nav-emoji { font-size: 1rem; }
+
+.section-nav-label {
+ font-size: 0.75rem;
+ font-weight: 500;
+ max-width: 0;
+ overflow: hidden;
+ white-space: nowrap;
+ transition: max-width 0.3s ease;
+}
+
+.section-nav-dot:hover .section-nav-label,
+.section-nav-dot.active .section-nav-label {
+ max-width: 60px;
+}
+
+/* ===== Currency Converter ===== */
+.currency-section {
+ background: linear-gradient(180deg, transparent, rgba(255, 230, 109, 0.02), transparent);
+}
+
+.currency-wrapper {
+ display: grid;
+ grid-template-columns: 1.2fr 1fr;
+ gap: 24px;
+ align-items: start;
+}
+
+.currency-card {
+ padding: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.currency-input-group label,
+.currency-result label,
+.currency-to-select label {
+ display: block;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 10px;
+}
+
+.currency-input-row {
+ display: flex;
+ gap: 12px;
+}
+
+.currency-input-row input {
+ flex: 1;
+ padding: 14px 18px;
+ font-size: 1.5rem;
+ font-family: var(--font-display);
+ font-weight: 700;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+}
+
+.currency-input-row select {
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ cursor: pointer;
+}
+
+.currency-swap {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 48px;
+ height: 48px;
+ margin: 20px auto;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--accent-3);
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.currency-swap:hover {
+ background: rgba(78, 205, 196, 0.15);
+ transform: rotate(180deg);
+}
+
+.currency-swap.swapping {
+ transform: rotate(360deg);
+}
+
+.currency-result {
+ text-align: center;
+ padding: 24px;
+ background: rgba(78, 205, 196, 0.06);
+ border-radius: var(--radius-lg);
+ margin-bottom: 20px;
+}
+
+.currency-result-display {
+ display: flex;
+ align-items: baseline;
+ justify-content: center;
+ gap: 10px;
+ margin: 12px 0 8px;
+}
+
+.currency-result-flag { font-size: 2rem; }
+
+.currency-result-amount {
+ font-family: var(--font-display);
+ font-size: 2.5rem;
+ font-weight: 800;
+ background: linear-gradient(135deg, #FF6B6B, #4ECDC4);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.currency-result-code {
+ font-size: 1rem;
+ color: var(--text-muted);
+ font-weight: 600;
+}
+
+.currency-rate-hint {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.currency-chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.currency-chip {
+ padding: 8px 14px;
+ border-radius: 50px;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-secondary);
+ font-family: inherit;
+ font-size: 0.8rem;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.currency-chip:hover,
+.currency-chip.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.12);
+ color: var(--accent-3);
+}
+
+.currency-presets {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.currency-presets h3 {
+ font-family: var(--font-display);
+ margin-bottom: 4px;
+}
+
+.currency-presets-desc {
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 20px;
+}
+
+.currency-preset-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 10px;
+ margin-bottom: 20px;
+}
+
+.currency-preset-card {
+ padding: 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ text-align: left;
+ font-family: inherit;
+ color: inherit;
+ transition: all 0.25s ease;
+}
+
+.currency-preset-card:hover {
+ border-color: rgba(255, 230, 109, 0.4);
+ transform: translateY(-2px);
+}
+
+.preset-emoji {
+ font-size: 1.5rem;
+ display: block;
+ margin-bottom: 8px;
+}
+
+.currency-preset-card strong {
+ display: block;
+ font-size: 0.9rem;
+ margin-bottom: 4px;
+}
+
+.currency-preset-card span:last-child {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.currency-tip {
+ display: flex;
+ gap: 10px;
+ padding: 14px;
+ background: rgba(255, 230, 109, 0.06);
+ border-radius: var(--radius-md);
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+/* ===== Nomad Score ===== */
+.nomad-score-section {
+ background: linear-gradient(180deg, transparent, rgba(167, 139, 250, 0.03), transparent);
+}
+
+.nomad-score-card {
+ max-width: 560px;
+ margin: 0 auto;
+ padding: 36px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.nomad-quiz-progress {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+ margin-bottom: 20px;
+}
+
+.nomad-quiz-dot {
+ width: 40px;
+ height: 4px;
+ border-radius: 2px;
+ background: rgba(255, 255, 255, 0.08);
+ transition: all 0.3s ease;
+}
+
+.nomad-quiz-dot.filled { background: var(--accent-3); }
+.nomad-quiz-dot.current { box-shadow: 0 0 8px rgba(78, 205, 196, 0.5); }
+
+.nomad-quiz-step {
+ display: block;
+ text-align: center;
+ font-size: 0.8rem;
+ color: var(--text-muted);
+ margin-bottom: 12px;
+}
+
+.nomad-quiz h3 {
+ text-align: center;
+ font-family: var(--font-display);
+ font-size: 1.25rem;
+ margin-bottom: 24px;
+}
+
+.nomad-quiz-options {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.nomad-quiz-option {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 16px 20px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ cursor: pointer;
+ font-family: inherit;
+ color: var(--text-primary);
+ text-align: left;
+ transition: all 0.25s ease;
+}
+
+.nomad-quiz-option:hover {
+ border-color: rgba(167, 139, 250, 0.4);
+ background: rgba(167, 139, 250, 0.08);
+ transform: translateX(6px);
+}
+
+.nomad-quiz-option span:first-child { font-size: 1.5rem; }
+
+.nomad-quiz.animating {
+ opacity: 0;
+ transform: translateX(-20px);
+ transition: all 0.3s ease;
+}
+
+.nomad-result {
+ text-align: center;
+}
+
+.nomad-score-ring {
+ position: relative;
+ width: 140px;
+ height: 140px;
+ margin: 0 auto 20px;
+}
+
+.nomad-score-ring svg { width: 100%; height: 100%; }
+
+.nomad-score-arc {
+ transition: stroke-dasharray 1s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.nomad-score-center {
+ position: absolute;
+ inset: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.nomad-score-center strong {
+ font-family: var(--font-display);
+ font-size: 2.5rem;
+ font-weight: 800;
+ color: var(--score-color, var(--accent-3));
+}
+
+.nomad-score-center span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.nomad-level-label {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin-bottom: 8px;
+}
+
+.nomad-level-desc {
+ color: var(--text-muted);
+ font-size: 0.9rem;
+ margin-bottom: 24px;
+ max-width: 360px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.nomad-result-actions {
+ display: flex;
+ gap: 12px;
+ justify-content: center;
+}
+
+/* ===== Lifestyle Interactive ===== */
+.lifestyle-layout {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 40px;
+ align-items: start;
+}
+
+.timeline-item {
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.timeline-item.active .timeline-card {
+ border-color: rgba(78, 205, 196, 0.5);
+ background: rgba(78, 205, 196, 0.08);
+ transform: scale(1.02);
+ box-shadow: 0 8px 32px rgba(78, 205, 196, 0.15);
+}
+
+.timeline-item.active .timeline-time {
+ color: var(--accent-3);
+ font-weight: 700;
+}
+
+.lifestyle-detail-card {
+ position: sticky;
+ top: 100px;
+ padding: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ text-align: center;
+}
+
+.lifestyle-detail-icon {
+ font-size: 3rem;
+ display: block;
+ margin-bottom: 12px;
+}
+
+.lifestyle-detail-time {
+ font-size: 0.85rem;
+ color: var(--text-muted);
+}
+
+.lifestyle-detail-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin: 12px 0;
+}
+
+.lifestyle-detail-card p {
+ color: var(--text-secondary);
+ line-height: 1.7;
+ margin-bottom: 20px;
+}
+
+.lifestyle-tip {
+ display: flex;
+ gap: 10px;
+ padding: 16px;
+ background: rgba(255, 230, 109, 0.08);
+ border-radius: var(--radius-md);
+ text-align: left;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 20px;
+}
+
+.lifestyle-dots {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+}
+
+.lifestyle-dot {
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ border: none;
+ background: rgba(255, 255, 255, 0.15);
+ cursor: pointer;
+ transition: all 0.2s ease;
+ padding: 0;
+}
+
+.lifestyle-dot.active {
+ background: var(--accent-3);
+ transform: scale(1.3);
+}
+
+/* ===== Destination Detail Enhanced ===== */
+.dest-detail-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ margin: 24px 0;
+}
+
+.dest-depth-loading {
+ color: var(--text-muted);
+ font-size: 0.9rem;
+ margin: 0 0 1rem;
+}
+
+.dest-detail-extras {
+ display: grid;
+ grid-template-columns: 1.2fr 1fr;
+ gap: 20px;
+ margin: 28px 0;
+}
+
+.dest-depth-block {
+ margin: 28px 0;
+ padding: 22px 0;
+ border-top: 1px solid color-mix(in srgb, var(--text-muted) 22%, transparent);
+}
+
+.dest-depth-block h3 {
+ font-size: 1.05rem;
+ margin-bottom: 12px;
+}
+
+.dest-depth-muted {
+ color: var(--text-muted);
+ font-size: 0.92rem;
+ margin-top: 8px;
+}
+
+.dest-depth-tags {
+ margin-top: 10px;
+ font-size: 0.9rem;
+}
+
+.dest-depth-list {
+ margin: 10px 0 0;
+ padding-left: 1.1rem;
+ display: grid;
+ gap: 6px;
+}
+
+.dest-cost-grid {
+ display: grid;
+ gap: 8px;
+ max-width: 420px;
+}
+
+.dest-cost-row {
+ display: flex;
+ justify-content: space-between;
+ gap: 16px;
+ padding: 8px 0;
+ border-bottom: 1px dashed color-mix(in srgb, var(--text-muted) 25%, transparent);
+}
+
+.dest-pros-cons {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 24px;
+}
+
+.dest-review-grid {
+ display: grid;
+ gap: 14px;
+}
+
+.dest-review-grid blockquote {
+ margin: 0;
+ padding: 14px 0;
+ border-top: 1px solid color-mix(in srgb, var(--text-muted) 18%, transparent);
+}
+
+.dest-review-grid footer {
+ margin-top: 8px;
+ color: var(--text-muted);
+ font-size: 0.85rem;
+}
+
+@media (max-width: 720px) {
+ .dest-pros-cons { grid-template-columns: 1fr; }
+}
+
+.dest-radar-card {
+ padding: 24px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+
+.dest-radar-card h3 {
+ font-size: 1rem;
+ margin-bottom: 16px;
+}
+
+.dest-radar-row {
+ display: grid;
+ grid-template-columns: 80px 1fr 36px;
+ gap: 10px;
+ align-items: center;
+ margin-bottom: 10px;
+}
+
+.dest-radar-label {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.dest-radar-track {
+ height: 8px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.dest-radar-fill {
+ height: 100%;
+ background: linear-gradient(90deg, #FF6B6B, #4ECDC4);
+ border-radius: 4px;
+ transition: width 0.8s ease;
+}
+
+.dest-radar-val {
+ font-size: 0.8rem;
+ font-weight: 600;
+ text-align: right;
+ color: var(--accent-3);
+}
+
+.dest-info-cards {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.dest-info-mini {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+}
+
+.dest-info-mini span:first-child { font-size: 1.5rem; }
+
+.dest-info-mini strong {
+ display: block;
+ font-size: 0.85rem;
+}
+
+.dest-info-mini span:last-child {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.dest-related {
+ margin-top: 32px;
+ padding-top: 28px;
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
+}
+
+.dest-related h3 {
+ margin-bottom: 16px;
+}
+
+.dest-related-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+ gap: 12px;
+}
+
+.dest-related-card {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+ transition: all 0.25s ease;
+}
+
+.dest-related-card:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ transform: translateY(-2px);
+}
+
+.dest-related-card span:first-child { font-size: 1.8rem; }
+
+.dest-related-card strong {
+ display: block;
+ font-size: 0.9rem;
+}
+
+.dest-related-card span:last-child {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+/* ===== Blog Reading Progress ===== */
+.blog-reading-progress {
+ position: fixed;
+ top: 3px;
+ left: 0;
+ right: 0;
+ height: 3px;
+ z-index: 9998;
+ background: rgba(255, 255, 255, 0.04);
+}
+
+.blog-reading-bar {
+ height: 100%;
+ background: linear-gradient(90deg, #A78BFA, #4ECDC4);
+ transition: width 0.1s linear;
+}
+
+.blog-reading-pct {
+ position: fixed;
+ top: 12px;
+ right: 20px;
+ z-index: 9998;
+ font-size: 0.7rem;
+ font-weight: 600;
+ color: var(--accent-3);
+ background: var(--bg-card);
+ padding: 4px 10px;
+ border-radius: 20px;
+ border: var(--border-glass);
+}
+
+/* ===== Map Actions ===== */
+.map-info-actions {
+ display: flex;
+ gap: 10px;
+ margin-top: 16px;
+}
+
+.btn-sm {
+ padding: 8px 16px !important;
+ font-size: 0.8rem !important;
+}
+
+/* ===== Profile Trip ===== */
+.profile-trip {
+ margin: 40px 0;
+}
+
+.profile-trip h2 {
+ font-family: var(--font-display);
+ margin-bottom: 20px;
+}
+
+.profile-trip-list {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 20px;
+}
+
+.profile-trip-item {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 14px 0;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
+}
+
+.profile-trip-item:last-of-type { border-bottom: none; }
+
+.trip-item-num {
+ width: 28px;
+ height: 28px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(78, 205, 196, 0.15);
+ border-radius: 50%;
+ font-size: 0.75rem;
+ font-weight: 700;
+ color: var(--accent-3);
+}
+
+.profile-trip-total {
+ padding: 16px 0 12px;
+ font-size: 0.9rem;
+ color: var(--text-muted);
+ text-align: center;
+}
+
+@media (max-width: 1024px) {
+ .currency-wrapper { grid-template-columns: 1fr; }
+ .lifestyle-layout { grid-template-columns: 1fr; }
+ .lifestyle-detail-card { position: static; }
+ .dest-detail-extras { grid-template-columns: 1fr; }
+ .section-nav { display: none; }
+}
+
+@media (max-width: 768px) {
+ .currency-preset-grid { grid-template-columns: 1fr; }
+ .currency-result-amount { font-size: 1.8rem; }
+}
+
+/* ===== Cost Compare ===== */
+.cost-compare-section {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.03), transparent);
+}
+
+.cost-compare-card {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.cost-compare-selectors {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ margin-bottom: 28px;
+}
+
+.cost-compare-select label {
+ display: block;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 10px;
+}
+
+.cost-city-chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.cost-city-chip {
+ padding: 8px 14px;
+ border-radius: 50px;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-secondary);
+ font-family: inherit;
+ font-size: 0.85rem;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.cost-city-chip:hover,
+.cost-city-chip.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.12);
+ color: var(--accent-3);
+}
+
+.cost-compare-select select {
+ width: 100%;
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ cursor: pointer;
+}
+
+.cost-compare-bars {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ margin-bottom: 24px;
+}
+
+.cost-bar-label {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 8px;
+ font-size: 0.9rem;
+}
+
+.cost-bar-track {
+ height: 12px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 6px;
+ overflow: hidden;
+}
+
+.cost-bar-fill {
+ height: 100%;
+ border-radius: 6px;
+ transition: width 0.8s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.cost-bar-fill.home {
+ background: linear-gradient(90deg, #FF6B6B, #FFE66D);
+}
+
+.cost-bar-fill.dest {
+ background: rgba(255, 255, 255, 0.2);
+}
+
+.cost-bar-fill.dest.cheaper {
+ background: linear-gradient(90deg, #4ECDC4, #6ee7b7);
+}
+
+.cost-compare-result {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding: 20px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+
+.cost-compare-result.saving {
+ background: rgba(78, 205, 196, 0.08);
+ border-color: rgba(78, 205, 196, 0.3);
+}
+
+.cost-result-emoji { font-size: 2rem; }
+
+.cost-compare-result strong {
+ display: block;
+ font-family: var(--font-display);
+ font-size: 1.15rem;
+ margin-bottom: 4px;
+}
+
+.cost-compare-result p {
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin: 0;
+}
+
+/* ===== Tools Filters ===== */
+.tools-filters {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+ flex-wrap: wrap;
+ margin-bottom: 28px;
+}
+
+.tool-links {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin: 10px 0;
+}
+
+.tool-link {
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ text-decoration: none;
+ padding: 4px 10px;
+ background: rgba(78, 205, 196, 0.08);
+ border-radius: 20px;
+ transition: all 0.2s ease;
+}
+
+.tool-link:hover {
+ background: rgba(78, 205, 196, 0.2);
+}
+
+.tool-link-static {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+ padding: 4px 10px;
+ background: var(--bg-glass);
+ border-radius: 20px;
+}
+
+/* ===== Blog Tables ===== */
+.blog-table-wrap {
+ overflow-x: auto;
+ margin: 20px 0;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+}
+
+.blog-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.9rem;
+}
+
+.blog-table th,
+.blog-table td {
+ padding: 12px 16px;
+ text-align: left;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
+}
+
+.blog-table th {
+ background: rgba(78, 205, 196, 0.08);
+ font-weight: 600;
+ color: var(--accent-3);
+}
+
+.blog-table tr:last-child td { border-bottom: none; }
+
+.blog-table tr:hover td {
+ background: rgba(255, 255, 255, 0.02);
+}
+
+/* ===== Cookie Consent ===== */
+.cookie-consent {
+ position: fixed;
+ bottom: 24px;
+ left: 50%;
+ transform: translateX(-50%);
+ z-index: 9000;
+ width: min(560px, calc(100% - 32px));
+ animation: toastIn 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.cookie-consent-inner {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 16px 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+}
+
+.cookie-emoji { font-size: 1.5rem; flex-shrink: 0; }
+
+.cookie-consent-inner p {
+ flex: 1;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin: 0;
+ line-height: 1.5;
+}
+
+.cookie-consent-inner a {
+ color: var(--accent-3);
+ margin-left: 4px;
+}
+
+@media (max-width: 768px) {
+ .cookie-consent-inner {
+ flex-wrap: wrap;
+ justify-content: center;
+ text-align: center;
+ }
+ .cost-compare-card { padding: 20px; }
+ .nav-links.open {
+ animation: menuSlide 0.3s ease;
+ }
+}
+
+@keyframes menuSlide {
+ from { opacity: 0; transform: translateY(-10px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* ===== Visa Wizard ===== */
+.visa-wizard {
+ margin-top: 48px;
+ padding: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.visa-wizard-header {
+ text-align: center;
+ margin-bottom: 28px;
+}
+
+.visa-wizard-header h3 {
+ font-size: 1.5rem;
+ margin: 12px 0 8px;
+}
+
+.visa-wizard-header p {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+}
+
+.visa-wizard-steps {
+ display: flex;
+ justify-content: center;
+ gap: 32px;
+ margin-bottom: 28px;
+}
+
+.wizard-step-dot {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 6px;
+ opacity: 0.4;
+ transition: opacity 0.3s;
+}
+
+.wizard-step-dot span {
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(255, 255, 255, 0.06);
+ border: 2px solid rgba(255, 255, 255, 0.1);
+ font-weight: 600;
+ font-size: 0.85rem;
+}
+
+.wizard-step-dot small {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+
+.wizard-step-dot.active { opacity: 1; }
+.wizard-step-dot.active span {
+ border-color: var(--accent-3);
+ background: rgba(78, 205, 196, 0.15);
+ color: var(--accent-3);
+}
+
+.wizard-step-dot.done span {
+ background: var(--accent-3);
+ color: #0a0e17;
+ border-color: var(--accent-3);
+}
+
+.wizard-options {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 12px;
+ margin-bottom: 24px;
+}
+
+.wizard-option {
+ padding: 16px 20px;
+ background: rgba(255, 255, 255, 0.03);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+ cursor: pointer;
+ transition: all 0.25s;
+ text-align: left;
+}
+
+.wizard-option:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.06);
+}
+
+.wizard-option.selected {
+ border-color: var(--accent-3);
+ background: rgba(78, 205, 196, 0.12);
+ box-shadow: 0 0 20px rgba(78, 205, 196, 0.15);
+}
+
+.wizard-nav {
+ display: flex;
+ justify-content: center;
+ gap: 12px;
+}
+
+.wizard-result-cards {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
+ gap: 16px;
+ margin-bottom: 20px;
+}
+
+.wizard-result-card {
+ position: relative;
+ padding: 20px;
+ background: rgba(255, 255, 255, 0.03);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: var(--radius-lg);
+ transition: transform 0.3s;
+}
+
+.wizard-result-card.winner {
+ border-color: var(--accent-2);
+ background: rgba(255, 230, 109, 0.06);
+}
+
+.wizard-winner-badge {
+ position: absolute;
+ top: -10px;
+ right: 12px;
+ font-size: 0.75rem;
+ padding: 4px 10px;
+ background: linear-gradient(135deg, #FFE66D, #FF6B6B);
+ color: #0a0e17;
+ border-radius: 20px;
+ font-weight: 600;
+}
+
+.wizard-result-top {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 12px;
+}
+
+.wizard-result-flag { font-size: 2rem; }
+
+.wizard-result-card h4 {
+ font-size: 1rem;
+ margin-bottom: 4px;
+}
+
+.wizard-match-score {
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+.wizard-result-card ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.wizard-result-card li {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ padding: 4px 0;
+}
+
+.wizard-result-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin-top: 12px;
+}
+
+.wizard-empty-wrap {
+ text-align: center;
+}
+
+.wizard-empty {
+ text-align: center;
+ color: var(--text-secondary);
+ padding: 20px;
+}
+
+/* ===== Coworking Guide ===== */
+.coworking-section {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.03));
+}
+
+.coworking-controls {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 28px;
+}
+
+.coworking-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.coworking-sort {
+ padding: 8px 14px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.85rem;
+ cursor: pointer;
+}
+
+.coworking-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+ gap: 20px;
+}
+
+.coworking-card {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s, box-shadow 0.3s;
+}
+
+.coworking-card:hover {
+ transform: translateY(-4px);
+ box-shadow: var(--shadow-card);
+}
+
+.coworking-card-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 12px;
+}
+
+.coworking-emoji { font-size: 1.8rem; }
+
+.coworking-rating {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ font-size: 0.8rem;
+ gap: 2px;
+}
+
+.coworking-wifi { color: var(--accent-3); }
+
+.coworking-card h3 {
+ font-size: 1.15rem;
+ margin-bottom: 4px;
+}
+
+.coworking-city {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 10px;
+}
+
+.coworking-price {
+ font-size: 1.1rem;
+ font-weight: 700;
+ color: var(--accent-2);
+ margin-bottom: 12px;
+}
+
+.coworking-perks {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin-bottom: 14px;
+}
+
+.coworking-perk {
+ font-size: 0.75rem;
+ padding: 4px 10px;
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 20px;
+ color: var(--text-secondary);
+}
+
+.coworking-link {
+ font-size: 0.85rem;
+ color: var(--accent-3);
+ font-weight: 500;
+}
+
+/* ===== FAQ Toolbar ===== */
+.faq-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 24px;
+}
+
+.faq-search-wrap {
+ position: relative;
+ flex: 1;
+ min-width: 240px;
+ max-width: 480px;
+}
+
+.faq-search-icon {
+ position: absolute;
+ left: 14px;
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 0.9rem;
+ pointer-events: none;
+}
+
+.faq-search {
+ width: 100%;
+ padding: 12px 40px 12px 40px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+}
+
+.faq-search:focus {
+ outline: none;
+ border-color: rgba(78, 205, 196, 0.5);
+}
+
+.faq-search-clear {
+ position: absolute;
+ right: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+ padding: 4px 8px;
+}
+
+.faq-toolbar-actions {
+ display: flex;
+ gap: 8px;
+}
+
+.btn-sm {
+ padding: 8px 14px !important;
+ font-size: 0.8rem !important;
+}
+
+.faq-empty {
+ text-align: center;
+ color: var(--text-secondary);
+ padding: 32px;
+}
+
+/* ===== Blog Filters ===== */
+.blog-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ justify-content: center;
+ margin-bottom: 28px;
+}
+
+/* ===== Share Button ===== */
+.share-dropdown {
+ position: relative;
+}
+
+.share-trigger { font-size: 0.85rem; }
+
+.share-backdrop {
+ position: fixed;
+ inset: 0;
+ z-index: 100;
+}
+
+.share-menu {
+ position: absolute;
+ top: calc(100% + 8px);
+ right: 0;
+ z-index: 101;
+ min-width: 160px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+ overflow: hidden;
+ animation: toastIn 0.2s ease;
+}
+
+.share-menu button {
+ display: block;
+ width: 100%;
+ padding: 12px 16px;
+ background: none;
+ border: none;
+ color: var(--text-primary);
+ font-size: 0.85rem;
+ text-align: left;
+ cursor: pointer;
+ transition: background 0.2s;
+}
+
+.share-menu button:hover {
+ background: rgba(78, 205, 196, 0.1);
+}
+
+.share-btn-compact {
+ background: rgba(255, 255, 255, 0.06);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: var(--radius-md);
+ padding: 8px 12px;
+ font-size: 1rem;
+ cursor: pointer;
+ transition: all 0.2s;
+}
+
+.share-btn-compact:hover {
+ background: rgba(78, 205, 196, 0.12);
+ border-color: rgba(78, 205, 196, 0.3);
+}
+
+/* ===== Blog Related ===== */
+.blog-related {
+ margin-top: 48px;
+ padding-top: 32px;
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
+}
+
+.blog-related h2 {
+ font-size: 1.3rem;
+ margin-bottom: 20px;
+}
+
+.blog-related-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
+ gap: 16px;
+}
+
+.blog-related-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ transition: transform 0.3s;
+}
+
+.blog-related-card:hover {
+ transform: translateY(-3px);
+}
+
+.blog-related-emoji { font-size: 2rem; display: block; margin-bottom: 8px; }
+
+.blog-related-card h3 {
+ font-size: 1rem;
+ margin-bottom: 8px;
+}
+
+.blog-related-card p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 10px;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+}
+
+.detail-nav {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+/* ===== Profile Badges ===== */
+.profile-badges {
+ margin: 32px 0;
+}
+
+.profile-badges h2 {
+ font-size: 1.2rem;
+ margin-bottom: 16px;
+}
+
+.badge-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
+ gap: 12px;
+}
+
+.badge-card {
+ padding: 16px;
+ text-align: center;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ transition: transform 0.3s;
+}
+
+.badge-card.earned {
+ border-color: rgba(255, 230, 109, 0.3);
+ background: rgba(255, 230, 109, 0.05);
+}
+
+.badge-card.locked {
+ opacity: 0.45;
+ filter: grayscale(0.5);
+}
+
+.badge-card.earned:hover {
+ transform: scale(1.04);
+}
+
+.badge-emoji {
+ font-size: 2rem;
+ display: block;
+ margin-bottom: 6px;
+}
+
+.badge-card strong {
+ display: block;
+ font-size: 0.85rem;
+ margin-bottom: 4px;
+}
+
+.badge-card small {
+ font-size: 0.7rem;
+ color: var(--text-secondary);
+}
+
+/* ===== Auth Enhancements ===== */
+.auth-bg-shapes {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ overflow: hidden;
+}
+
+.auth-shape {
+ position: absolute;
+ font-size: 3rem;
+ opacity: 0.08;
+ animation: authFloat 8s ease-in-out infinite;
+}
+
+.auth-shape-1 { top: 15%; left: 10%; animation-delay: 0s; }
+.auth-shape-2 { top: 60%; right: 15%; animation-delay: -3s; font-size: 2.5rem; }
+.auth-shape-3 { bottom: 20%; left: 30%; animation-delay: -5s; font-size: 2rem; }
+
+@keyframes authFloat {
+ 0%, 100% { transform: translateY(0) rotate(0deg); }
+ 50% { transform: translateY(-20px) rotate(5deg); }
+}
+
+.auth-logo-emoji {
+ font-size: 3rem;
+ display: block;
+ animation: authPulse 2s ease-in-out infinite;
+}
+
+@keyframes authPulse {
+ 0%, 100% { transform: scale(1); }
+ 50% { transform: scale(1.08); }
+}
+
+.auth-pwd-wrap {
+ position: relative;
+}
+
+.auth-pwd-wrap input {
+ width: 100%;
+ padding-right: 44px;
+}
+
+.auth-pwd-toggle {
+ position: absolute;
+ right: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+ background: none;
+ border: none;
+ cursor: pointer;
+ font-size: 1rem;
+ padding: 4px;
+}
+
+.auth-pwd-hint {
+ margin-top: 6px;
+ font-size: 0.78rem;
+ color: var(--text-muted);
+}
+
+.auth-submit {
+ width: 100%;
+}
+
+.auth-loading {
+ display: inline-block;
+ animation: authPulse 1s ease-in-out infinite;
+}
+
+/* ===== 404 Enhancements ===== */
+.not-found-compass {
+ position: relative;
+ width: 120px;
+ height: 120px;
+ margin: 0 auto 24px;
+}
+
+.compass-ring {
+ font-size: 5rem;
+ display: block;
+ animation: compassSpin 6s linear infinite;
+}
+
+.compass-plane {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ font-size: 1.8rem;
+ animation: planeOrbit 4s ease-in-out infinite;
+}
+
+@keyframes compassSpin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+@keyframes planeOrbit {
+ 0%, 100% { transform: translate(-50%, -50%) translateX(30px); }
+ 50% { transform: translate(-50%, -50%) translateX(-30px); }
+}
+
+.not-found-title {
+ font-size: 5rem;
+ background: linear-gradient(135deg, var(--accent-1), var(--accent-2), var(--accent-3));
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.not-found-sub {
+ color: var(--text-secondary);
+ margin-bottom: 24px;
+}
+
+.not-found-actions {
+ display: flex;
+ gap: 12px;
+ justify-content: center;
+ flex-wrap: wrap;
+}
+
+@media (max-width: 768px) {
+ .visa-wizard { padding: 20px; }
+ .visa-wizard-steps { gap: 16px; }
+ .wizard-step-dot small { display: none; }
+ .coworking-controls { flex-direction: column; align-items: stretch; }
+ .faq-toolbar { flex-direction: column; }
+ .faq-search-wrap { max-width: 100%; }
+ .badge-grid { grid-template-columns: repeat(3, 1fr); }
+ .season-grid { grid-template-columns: repeat(3, 1fr); }
+ .packing-filters { flex-direction: column; align-items: stretch; }
+ .nomad-tips { left: 12px; right: 12px; bottom: 80px; max-width: none; }
+}
+
+/* ===== Packing Checklist ===== */
+.packing-card {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.packing-progress { margin-bottom: 24px; }
+
+.packing-progress-info {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 10px;
+ font-size: 0.9rem;
+}
+
+.packing-progress-info strong { font-size: 1.4rem; }
+.packing-count { margin-left: auto; color: var(--text-secondary); }
+
+.packing-bar {
+ height: 8px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.packing-bar-fill {
+ height: 100%;
+ background: linear-gradient(90deg, var(--accent-1), var(--accent-3));
+ border-radius: 4px;
+ transition: width 0.4s ease;
+}
+
+.packing-ready {
+ margin-top: 10px;
+ color: var(--accent-3);
+ font-weight: 600;
+ text-align: center;
+}
+
+.packing-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ align-items: center;
+ margin-bottom: 20px;
+}
+
+.packing-actions {
+ margin-left: auto;
+ display: flex;
+ gap: 6px;
+}
+
+.packing-list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.packing-item {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 12px 14px;
+ background: rgba(255, 255, 255, 0.03);
+ border: 1px solid rgba(255, 255, 255, 0.06);
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ transition: all 0.25s;
+}
+
+.packing-item:hover {
+ border-color: rgba(78, 205, 196, 0.3);
+ background: rgba(78, 205, 196, 0.05);
+}
+
+.packing-item.checked {
+ opacity: 0.65;
+ border-color: rgba(78, 205, 196, 0.35);
+}
+
+.packing-item.checked .packing-label {
+ text-decoration: line-through;
+ color: var(--text-secondary);
+}
+
+.packing-item input { display: none; }
+
+.packing-check {
+ width: 22px;
+ height: 22px;
+ border-radius: 6px;
+ border: 2px solid rgba(255, 255, 255, 0.2);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.75rem;
+ color: #0a0e17;
+ flex-shrink: 0;
+ transition: all 0.2s;
+}
+
+.packing-item.checked .packing-check {
+ background: var(--accent-3);
+ border-color: var(--accent-3);
+}
+
+.packing-emoji { font-size: 1.2rem; }
+.packing-label { font-size: 0.9rem; flex: 1; }
+.arrival-meetup-link {
+ margin-left: auto;
+ color: var(--accent, #4ecdc4);
+ text-decoration: none;
+ font-weight: 600;
+ padding: 0 0.25rem;
+}
+.arrival-meetup-link:hover { text-decoration: underline; }
+
+/* ===== Season Guide ===== */
+.season-card {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.season-cities {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 24px;
+ justify-content: center;
+}
+
+.season-city-btn {
+ padding: 8px 14px;
+ background: rgba(255, 255, 255, 0.04);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: 20px;
+ color: var(--text-primary);
+ font-size: 0.85rem;
+ cursor: pointer;
+ transition: all 0.25s;
+}
+
+.season-city-btn:hover,
+.season-city-btn.active {
+ border-color: var(--accent-3);
+ background: rgba(78, 205, 196, 0.12);
+}
+
+.season-header-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 16px;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+}
+
+.season-header-row h3 { font-size: 1.3rem; margin-bottom: 4px; }
+.season-header-row p { color: var(--text-secondary); font-size: 0.9rem; }
+
+.season-grid {
+ display: grid;
+ grid-template-columns: repeat(6, 1fr);
+ gap: 10px;
+ margin-bottom: 20px;
+}
+
+.season-month {
+ position: relative;
+ padding: 14px 8px;
+ text-align: center;
+ background: rgba(255, 255, 255, 0.03);
+ border: 1px solid color-mix(in srgb, var(--season-color) 40%, transparent);
+ border-radius: var(--radius-md);
+ border-top: 3px solid var(--season-color);
+ transition: transform 0.2s;
+}
+
+.season-month:hover { transform: translateY(-2px); }
+
+.season-month.now {
+ box-shadow: 0 0 16px color-mix(in srgb, var(--season-color) 30%, transparent);
+}
+
+.season-month-emoji { display: block; font-size: 1.2rem; margin-bottom: 4px; }
+.season-month strong { display: block; font-size: 0.9rem; }
+.season-month small { color: var(--text-secondary); font-size: 0.7rem; }
+
+.season-now-tag {
+ position: absolute;
+ top: -8px;
+ right: -4px;
+ font-size: 0.65rem;
+ padding: 2px 6px;
+ background: var(--accent-1);
+ color: #fff;
+ border-radius: 8px;
+ font-weight: 600;
+}
+
+.season-legend {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+ justify-content: center;
+}
+
+.season-legend-item {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+}
+
+.season-legend-item i {
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ display: inline-block;
+}
+
+/* ===== Testimonial Carousel ===== */
+.testimonial-carousel {
+ max-width: 680px;
+ margin: 0 auto 40px;
+ text-align: center;
+}
+
+.testimonial-featured {
+ padding: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ animation: toastIn 0.4s ease;
+}
+
+.testimonial-featured .testimonial-avatar {
+ font-size: 3rem;
+ margin-bottom: 12px;
+}
+
+.testimonial-featured p {
+ font-size: 1.1rem;
+ line-height: 1.7;
+ margin: 12px 0 16px;
+}
+
+.testimonial-dots {
+ display: flex;
+ justify-content: center;
+ gap: 8px;
+ margin-top: 16px;
+}
+
+.testimonial-dot {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ border: none;
+ background: rgba(255, 255, 255, 0.2);
+ cursor: pointer;
+ padding: 0;
+ transition: all 0.3s;
+}
+
+.testimonial-dot.active {
+ width: 24px;
+ border-radius: 4px;
+ background: var(--accent-3);
+}
+
+/* ===== Nomad Tips ===== */
+.nomad-tips {
+ position: fixed;
+ bottom: 100px;
+ left: 24px;
+ z-index: 8500;
+ max-width: 340px;
+ display: flex;
+ align-items: flex-start;
+ gap: 12px;
+ padding: 16px 18px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+ animation: toastIn 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.nomad-tips-emoji { font-size: 1.5rem; flex-shrink: 0; }
+
+.nomad-tips-body strong {
+ display: block;
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ margin-bottom: 4px;
+}
+
+.nomad-tips-body p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin: 0;
+ line-height: 1.45;
+ animation: toastIn 0.3s ease;
+}
+
+.nomad-tips-link {
+ display: inline-block;
+ margin-top: 8px;
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ text-decoration: none;
+}
+
+.nomad-tips-link:hover {
+ text-decoration: underline;
+}
+
+.nomad-tips-close {
+ position: absolute;
+ top: 8px;
+ right: 10px;
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+ font-size: 0.85rem;
+ padding: 2px 6px;
+}
+
+.nomad-tips-dots {
+ position: absolute;
+ bottom: 8px;
+ right: 16px;
+ display: flex;
+ gap: 4px;
+}
+
+.nomad-tips-dots span {
+ width: 5px;
+ height: 5px;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.2);
+}
+
+.nomad-tips-dots span.active { background: var(--accent-3); }
+
+
+/* ===== Spin Globe ===== */
+.spin-card {
+ max-width: 520px;
+ margin: 0 auto;
+ padding: 40px 28px;
+ text-align: center;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.spin-orb {
+ position: relative;
+ width: 140px;
+ height: 140px;
+ margin: 0 auto 20px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.spin-emoji {
+ font-size: 4rem;
+ position: relative;
+ z-index: 2;
+ transition: transform 0.1s;
+}
+
+.spin-orb.spinning .spin-emoji {
+ animation: spinBounce 0.18s ease infinite;
+}
+
+@keyframes spinBounce {
+ 0%, 100% { transform: scale(1) rotate(-4deg); }
+ 50% { transform: scale(1.12) rotate(4deg); }
+}
+
+.spin-orb-ring {
+ position: absolute;
+ inset: 0;
+ border-radius: 50%;
+ border: 2px dashed rgba(78, 205, 196, 0.35);
+ animation: compassSpin 12s linear infinite;
+}
+
+.spin-orb-ring-2 {
+ inset: 12px;
+ border-style: solid;
+ border-color: rgba(255, 230, 109, 0.25);
+ animation-direction: reverse;
+ animation-duration: 8s;
+}
+
+.spin-orb.spinning .spin-orb-ring {
+ animation-duration: 1.2s;
+ border-color: var(--accent-3);
+}
+
+.spin-city-name {
+ font-size: 1.5rem;
+ margin-bottom: 8px;
+}
+
+.spin-hint {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin-bottom: 20px;
+}
+
+.spin-btn { min-width: 200px; }
+
+.spin-result {
+ margin-top: 8px;
+ animation: toastIn 0.4s ease;
+}
+
+.spin-result-tag {
+ color: var(--accent-2);
+ font-weight: 600;
+ margin-bottom: 10px;
+}
+
+.spin-result-meta {
+ display: flex;
+ justify-content: center;
+ gap: 14px;
+ flex-wrap: wrap;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 12px;
+}
+
+.spin-result-desc {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ line-height: 1.6;
+ margin-bottom: 18px;
+}
+
+.spin-result-actions {
+ display: flex;
+ gap: 10px;
+ justify-content: center;
+ flex-wrap: wrap;
+}
+
+/* ===== Flight Cost ===== */
+.flight-card {
+ display: grid;
+ grid-template-columns: 1.1fr 0.9fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.flight-form {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+
+.flight-arrow {
+ text-align: center;
+ font-size: 1.4rem;
+ color: var(--accent-3);
+ opacity: 0.7;
+}
+
+.flight-result {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding: 24px;
+ background: rgba(78, 205, 196, 0.06);
+ border: 1px solid rgba(78, 205, 196, 0.15);
+ border-radius: var(--radius-lg);
+}
+
+.flight-route {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 12px;
+ font-weight: 600;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+}
+
+.flight-plane {
+ animation: planeOrbit 3s ease-in-out infinite;
+}
+
+.flight-nums {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 14px;
+}
+
+.flight-nums div {
+ text-align: center;
+}
+
+.flight-nums small {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-bottom: 4px;
+}
+
+.flight-nums strong {
+ font-size: 1.25rem;
+}
+
+.flight-total {
+ grid-column: 1 / -1;
+ padding-top: 10px;
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
+}
+
+.flight-total strong {
+ font-size: 1.75rem;
+}
+
+.flight-note {
+ margin-top: 16px;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ text-align: center;
+}
+
+/* ===== Nomad Events ===== */
+.events-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ justify-content: center;
+ margin-bottom: 28px;
+}
+
+.events-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+ gap: 20px;
+}
+
+.event-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s, box-shadow 0.3s;
+}
+
+.event-card:hover {
+ transform: translateY(-4px);
+ box-shadow: var(--shadow-card);
+}
+
+.event-card-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 12px;
+}
+
+.event-emoji { font-size: 2rem; }
+
+.event-badge {
+ font-size: 0.75rem;
+ padding: 4px 10px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 20px;
+ color: var(--text-secondary);
+}
+
+.event-badge.online {
+ background: rgba(78, 205, 196, 0.12);
+ color: var(--accent-3);
+}
+
+.event-card h3 {
+ font-size: 1.05rem;
+ margin-bottom: 6px;
+}
+
+.event-date {
+ font-size: 0.85rem;
+ color: var(--accent-2);
+ margin-bottom: 8px;
+}
+
+.event-desc {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.5;
+ margin-bottom: 14px;
+}
+
+/* ===== Legal / Privacy ===== */
+.legal-page {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: calc(var(--nav-height) + 40px) 24px 80px;
+ position: relative;
+ z-index: 1;
+}
+
+.legal-content .section-tag { margin-bottom: 12px; display: inline-block; }
+
+.legal-content h1 {
+ font-size: 2rem;
+ margin-bottom: 8px;
+}
+
+.legal-updated {
+ color: var(--text-secondary);
+ font-size: 0.85rem;
+ margin-bottom: 32px;
+}
+
+.legal-content section {
+ margin-bottom: 28px;
+}
+
+.legal-content h2 {
+ font-size: 1.2rem;
+ margin-bottom: 10px;
+ color: var(--accent-3);
+}
+
+.legal-content p {
+ color: var(--text-secondary);
+ line-height: 1.7;
+}
+
+.legal-content a { color: var(--accent-3); }
+
+@media (max-width: 768px) {
+ .flight-card { grid-template-columns: 1fr; }
+ .spin-card { padding: 28px 20px; }
+}
+
+/* ===== Daily Quote ===== */
+.quote-section { padding-top: 40px; padding-bottom: 40px; }
+
+.quote-card {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: 36px 32px;
+ text-align: center;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ position: relative;
+ overflow: hidden;
+}
+
+.quote-card::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(135deg, rgba(255,107,107,0.06), rgba(78,205,196,0.08));
+ pointer-events: none;
+}
+
+.quote-emoji {
+ font-size: 2.5rem;
+ display: block;
+ margin-bottom: 12px;
+ position: relative;
+}
+
+.quote-card blockquote {
+ font-family: var(--font-display);
+ font-size: clamp(1.15rem, 2.5vw, 1.5rem);
+ font-weight: 600;
+ line-height: 1.6;
+ margin: 0 0 20px;
+ position: relative;
+}
+
+.quote-footer {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 16px;
+ flex-wrap: wrap;
+ position: relative;
+}
+
+/* ===== Wifi Work Score ===== */
+.wifi-layout {
+ display: grid;
+ grid-template-columns: 1.2fr 0.8fr;
+ gap: 24px;
+}
+
+.wifi-picker {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.wifi-meter {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+ margin-top: 20px;
+ flex-wrap: wrap;
+}
+
+.wifi-meter-ring {
+ width: 120px;
+ height: 120px;
+ border-radius: 50%;
+ border: 4px solid var(--wifi-color);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 0 24px color-mix(in srgb, var(--wifi-color) 35%, transparent);
+ flex-shrink: 0;
+}
+
+.wifi-meter-ring strong {
+ font-size: 1.8rem;
+ line-height: 1;
+}
+
+.wifi-meter-ring small {
+ color: var(--text-secondary);
+ font-size: 0.75rem;
+}
+
+.wifi-meter-info h3 {
+ font-size: 1.3rem;
+ margin-bottom: 6px;
+}
+
+.wifi-level {
+ font-weight: 700;
+ font-size: 1rem;
+ display: block;
+ margin-bottom: 8px;
+}
+
+.wifi-meter-info p {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin-bottom: 10px;
+}
+
+.wifi-link {
+ color: var(--accent-3);
+ font-size: 0.85rem;
+}
+
+.wifi-rank {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.wifi-rank h4 {
+ margin-bottom: 14px;
+ font-size: 1rem;
+}
+
+.wifi-rank ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.wifi-rank li {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 10px 12px;
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ transition: background 0.2s;
+ font-size: 0.9rem;
+}
+
+.wifi-rank li:hover,
+.wifi-rank li.active {
+ background: rgba(78, 205, 196, 0.1);
+}
+
+.wifi-rank-num {
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ background: rgba(255,255,255,0.08);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.75rem;
+ font-weight: 700;
+}
+
+.wifi-rank-speed {
+ margin-left: auto;
+ font-weight: 600;
+ font-size: 0.85rem;
+}
+
+/* ===== Savings Goal ===== */
+.savings-card {
+ display: grid;
+ grid-template-columns: 1.1fr 0.9fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.savings-form {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+
+.savings-result {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 20px;
+ padding: 20px;
+ background: rgba(78, 205, 196, 0.05);
+ border-radius: var(--radius-lg);
+}
+
+.savings-ring {
+ width: 140px;
+ height: 140px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.savings-ring-inner {
+ width: 110px;
+ height: 110px;
+ border-radius: 50%;
+ background: var(--bg-card);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.savings-ring-inner strong {
+ font-size: 1.8rem;
+}
+
+.savings-ring-inner small {
+ color: var(--text-secondary);
+ font-size: 0.75rem;
+}
+
+.savings-stats {
+ text-align: center;
+ width: 100%;
+}
+
+.savings-stats > div {
+ margin-bottom: 12px;
+}
+
+.savings-stats small {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-bottom: 2px;
+}
+
+.savings-stats strong {
+ font-size: 1.3rem;
+}
+
+.savings-hint {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ line-height: 1.5;
+ margin-top: 8px;
+}
+
+@media (max-width: 768px) {
+ .wifi-layout,
+ .savings-card {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* ===== Jet Lag ===== */
+.jetlag-card {
+ display: grid;
+ grid-template-columns: 1fr 1.1fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.jetlag-form { display: flex; flex-direction: column; gap: 16px; }
+
+.jetlag-result {
+ padding: 24px;
+ background: rgba(167, 139, 250, 0.06);
+ border: 1px solid rgba(167, 139, 250, 0.15);
+ border-radius: var(--radius-lg);
+}
+
+.jetlag-diff {
+ text-align: center;
+ margin-bottom: 20px;
+}
+
+.jetlag-emoji { font-size: 2.5rem; display: block; margin-bottom: 8px; }
+.jetlag-diff strong { font-size: 1.8rem; display: block; }
+.jetlag-diff small { color: var(--text-secondary); font-size: 0.85rem; }
+
+.jetlag-recovery {
+ text-align: center;
+ margin-bottom: 16px;
+ padding-bottom: 16px;
+ border-bottom: 1px solid rgba(255,255,255,0.06);
+}
+
+.jetlag-recovery span {
+ display: block;
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ margin-bottom: 4px;
+}
+
+.jetlag-recovery strong { font-size: 1.5rem; }
+
+.jetlag-note {
+ margin-top: 8px;
+ font-size: 0.8rem;
+ color: var(--accent-2);
+}
+
+.jetlag-tips {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.jetlag-tips li {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ padding: 6px 0;
+ line-height: 1.45;
+}
+
+/* ===== Housing ===== */
+.housing-cities {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ justify-content: center;
+ margin-bottom: 24px;
+}
+
+.housing-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+ gap: 12px;
+}
+
+.housing-header h3 { font-size: 1.2rem; }
+
+.housing-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 18px;
+}
+
+.housing-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s;
+}
+
+.housing-card:hover { transform: translateY(-4px); }
+
+.housing-card-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+}
+
+.housing-emoji { font-size: 1.8rem; }
+.housing-price { font-size: 0.85rem; color: var(--accent-2); font-weight: 600; }
+.housing-card h4 { font-size: 1.05rem; margin-bottom: 6px; }
+.housing-best { font-size: 0.85rem; color: var(--text-secondary); margin-bottom: 12px; }
+
+.housing-pros { display: flex; flex-wrap: wrap; gap: 6px; }
+.housing-pro {
+ font-size: 0.75rem;
+ padding: 4px 10px;
+ background: rgba(255,255,255,0.05);
+ border-radius: 20px;
+ color: var(--text-secondary);
+}
+
+/* ===== Phrasebook ===== */
+.phrase-card {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.phrase-lang {
+ text-align: center;
+ font-weight: 600;
+ margin-bottom: 20px;
+ color: var(--accent-3);
+}
+
+.phrase-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+ gap: 12px;
+}
+
+.phrase-item {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 4px;
+ padding: 14px 16px;
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.08);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ cursor: pointer;
+ text-align: left;
+ transition: all 0.25s;
+}
+
+.phrase-item:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.08);
+ transform: translateY(-2px);
+}
+
+.phrase-item strong { font-size: 1rem; }
+.phrase-pinyin { font-size: 0.75rem; color: var(--accent-3); }
+.phrase-zh { font-size: 0.85rem; color: var(--text-secondary); }
+
+/* ===== Feedback Widget ===== */
+.pwa-install-hint {
+ position: fixed;
+ left: 16px;
+ right: 16px;
+ bottom: 24px;
+ z-index: 8700;
+ max-width: 420px;
+ margin: 0 auto;
+ padding: 14px 16px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
+}
+
+.pwa-install-hint p {
+ margin: 0 0 10px;
+ font-size: 0.9rem;
+}
+
+.pwa-install-actions {
+ display: flex;
+ gap: 8px;
+}
+
+.feedback-fab {
+ position: fixed;
+ bottom: 100px;
+ right: 24px;
+ z-index: 8600;
+ width: 48px;
+ height: 48px;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-card);
+ backdrop-filter: blur(16px);
+ font-size: 1.3rem;
+ cursor: pointer;
+ box-shadow: var(--shadow-card);
+ transition: transform 0.25s;
+}
+
+.feedback-fab:hover { transform: scale(1.08); }
+
+.feedback-modal { max-width: 420px; }
+
+.feedback-body {
+ padding: 8px 4px 4px;
+ text-align: center;
+}
+
+.feedback-body h2 { margin: 12px 0 8px; font-size: 1.4rem; }
+.feedback-body > p { color: var(--text-secondary); font-size: 0.9rem; margin-bottom: 20px; }
+
+.feedback-types {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+ margin-bottom: 14px;
+ flex-wrap: wrap;
+}
+
+.feedback-textarea {
+ width: 100%;
+ padding: 14px;
+ margin-bottom: 14px;
+ background: rgba(255,255,255,0.04);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+ resize: vertical;
+ font-family: inherit;
+}
+
+.feedback-textarea:focus {
+ outline: none;
+ border-color: rgba(78, 205, 196, 0.5);
+}
+
+@media (max-width: 768px) {
+ .jetlag-card { grid-template-columns: 1fr; }
+ .feedback-fab { bottom: 160px; right: 16px; }
+}
+
+/* ===== Insurance ===== */
+.insurance-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 18px;
+}
+
+.insurance-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ cursor: pointer;
+ transition: transform 0.3s, border-color 0.3s;
+}
+
+.insurance-card:hover { transform: translateY(-3px); }
+.insurance-card.selected {
+ border-color: var(--accent-3);
+ box-shadow: 0 0 20px rgba(78, 205, 196, 0.15);
+}
+
+.insurance-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+}
+
+.insurance-emoji { font-size: 1.8rem; }
+.insurance-price { font-size: 0.85rem; color: var(--accent-2); font-weight: 600; }
+.insurance-card h3 { font-size: 1.05rem; margin-bottom: 6px; }
+.insurance-best { font-size: 0.85rem; color: var(--accent-3); margin-bottom: 10px; }
+
+.insurance-cover {
+ list-style: none;
+ padding: 0;
+ margin: 0 0 12px;
+}
+
+.insurance-cover li {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ padding: 3px 0;
+}
+
+.insurance-note {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ line-height: 1.45;
+}
+
+.insurance-picked {
+ display: inline-block;
+ margin-top: 10px;
+ font-size: 0.75rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+/* ===== Expense Tracker ===== */
+.expense-card {
+ display: grid;
+ grid-template-columns: 0.95fr 1.05fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.expense-form { display: flex; flex-direction: column; gap: 14px; }
+.expense-cats { display: flex; flex-wrap: wrap; gap: 6px; }
+
+.expense-total {
+ text-align: center;
+ margin-bottom: 16px;
+}
+
+.expense-total small {
+ display: block;
+ color: var(--text-secondary);
+ font-size: 0.8rem;
+ margin-bottom: 4px;
+}
+
+.expense-total strong { font-size: 2rem; }
+
+.expense-bars { margin-bottom: 16px; }
+
+.expense-bar-row {
+ display: grid;
+ grid-template-columns: 70px 1fr 70px;
+ gap: 8px;
+ align-items: center;
+ margin-bottom: 8px;
+ font-size: 0.8rem;
+}
+
+.expense-bar {
+ height: 6px;
+ background: rgba(255,255,255,0.06);
+ border-radius: 3px;
+ overflow: hidden;
+}
+
+.expense-bar i {
+ display: block;
+ height: 100%;
+ background: linear-gradient(90deg, var(--accent-1), var(--accent-3));
+ border-radius: 3px;
+}
+
+.expense-list {
+ list-style: none;
+ padding: 0;
+ margin: 0 0 12px;
+ max-height: 280px;
+ overflow-y: auto;
+}
+
+.expense-list li {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 10px 0;
+ border-bottom: 1px solid rgba(255,255,255,0.05);
+ font-size: 0.9rem;
+}
+
+.expense-list li div { flex: 1; min-width: 0; }
+.expense-list li strong { display: block; }
+.expense-list li small { color: var(--text-secondary); font-size: 0.75rem; }
+.expense-amt { color: var(--accent-2); }
+.expense-del {
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+ padding: 4px 8px;
+}
+.expense-empty {
+ text-align: center;
+ color: var(--text-secondary);
+ padding: 20px !important;
+ border: none !important;
+ justify-content: center;
+}
+
+/* ===== SIM Guide ===== */
+.sim-city-title {
+ text-align: center;
+ font-size: 1.15rem;
+ margin-bottom: 20px;
+}
+
+.sim-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
+ gap: 16px;
+}
+
+.sim-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s;
+}
+
+.sim-card:hover { transform: translateY(-3px); }
+.sim-emoji { font-size: 1.8rem; display: block; margin-bottom: 8px; }
+.sim-card h4 { font-size: 1.05rem; margin-bottom: 10px; }
+
+.sim-meta {
+ display: flex;
+ justify-content: space-between;
+ gap: 8px;
+ font-size: 0.85rem;
+ margin-bottom: 10px;
+ flex-wrap: wrap;
+}
+
+.sim-price { color: var(--accent-2); font-weight: 600; }
+.sim-card p { font-size: 0.85rem; color: var(--text-secondary); line-height: 1.45; }
+
+/* ===== About ===== */
+.about-list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.about-list li {
+ padding: 8px 0;
+ color: var(--text-secondary);
+ line-height: 1.5;
+}
+
+.about-actions {
+ display: flex;
+ gap: 12px;
+ flex-wrap: wrap;
+ margin-top: 32px;
+}
+
+@media (max-width: 768px) {
+ .expense-card { grid-template-columns: 1fr; }
+ .expense-bar-row { grid-template-columns: 60px 1fr 60px; }
+}
+
+/* ===== Tax Day Counter ===== */
+.tax-card {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.tax-meter {
+ display: flex;
+ gap: 28px;
+ align-items: center;
+ margin-bottom: 24px;
+ flex-wrap: wrap;
+}
+
+.tax-ring {
+ width: 140px;
+ height: 140px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.tax-risk-warn { background: conic-gradient(#FFE66D var(--pct, 50%), rgba(255,255,255,0.08) 0) !important; }
+.tax-risk-high { background: conic-gradient(#FF6B6B var(--pct, 50%), rgba(255,255,255,0.08) 0) !important; }
+
+.tax-ring-inner {
+ width: 110px;
+ height: 110px;
+ border-radius: 50%;
+ background: var(--bg-card);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.tax-ring-inner strong { font-size: 1.8rem; }
+.tax-ring-inner small { color: var(--text-secondary); font-size: 0.75rem; }
+
+.tax-stats {
+ flex: 1;
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 12px;
+ min-width: 240px;
+}
+
+.tax-stats > div small {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-bottom: 2px;
+}
+
+.tax-stats > div strong { font-size: 1.2rem; }
+.tax-danger { color: #FF6B6B; }
+.tax-hint {
+ grid-column: 1 / -1;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin: 4px 0 0;
+}
+
+.tax-form {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+ margin-bottom: 20px;
+ padding-top: 16px;
+ border-top: 1px solid rgba(255,255,255,0.06);
+}
+
+.tax-log {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ max-height: 220px;
+ overflow-y: auto;
+}
+
+.tax-log li {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 8px 0;
+ border-bottom: 1px solid rgba(255,255,255,0.05);
+ font-size: 0.9rem;
+}
+
+.tax-log li button {
+ margin-left: auto;
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+}
+
+.tax-empty {
+ justify-content: center;
+ color: var(--text-secondary);
+ border: none !important;
+}
+
+/* ===== Arrival Checklist ===== */
+.arrival-card {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.arrival-progress {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 20px;
+ margin-bottom: 24px;
+ flex-wrap: wrap;
+}
+
+.arrival-progress h3 { font-size: 1.15rem; margin-bottom: 4px; }
+.arrival-progress p { color: var(--text-secondary); font-size: 0.9rem; }
+
+.arrival-days {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 18px;
+}
+
+.arrival-day h4 {
+ font-size: 0.95rem;
+ color: var(--accent-3);
+ margin-bottom: 10px;
+}
+
+.arrival-day ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+/* ===== Cafe Guide ===== */
+.cafe-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 16px;
+}
+
+.cafe-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s;
+}
+
+.cafe-card:hover { transform: translateY(-3px); }
+
+.cafe-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 10px;
+ margin-bottom: 10px;
+}
+
+.cafe-top h4 { font-size: 1.05rem; }
+.cafe-vibe {
+ font-size: 0.75rem;
+ padding: 4px 8px;
+ background: rgba(255,230,109,0.12);
+ color: var(--accent-2);
+ border-radius: 12px;
+ white-space: nowrap;
+}
+
+.cafe-tags {
+ display: flex;
+ gap: 10px;
+ flex-wrap: wrap;
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ margin-bottom: 8px;
+}
+
+.cafe-card p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.45;
+}
+
+/* ===== Onboarding ===== */
+.onboard-card {
+ position: fixed;
+ bottom: 24px;
+ left: 50%;
+ transform: translateX(-50%);
+ z-index: 9200;
+ width: min(380px, calc(100% - 32px));
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+ animation: toastIn 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
+ text-align: center;
+}
+
+.onboard-skip {
+ position: absolute;
+ top: 10px;
+ right: 12px;
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+ font-size: 0.8rem;
+}
+
+.onboard-emoji { font-size: 2rem; display: block; margin-bottom: 8px; }
+.onboard-step strong { display: block; font-size: 1.15rem; margin-bottom: 6px; }
+.onboard-step p { color: var(--text-secondary); font-size: 0.9rem; margin-bottom: 14px; }
+
+.onboard-dots {
+ display: flex;
+ justify-content: center;
+ gap: 6px;
+ margin-bottom: 14px;
+}
+
+.onboard-dots span {
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: rgba(255,255,255,0.2);
+}
+
+.onboard-dots span.active {
+ width: 18px;
+ border-radius: 4px;
+ background: var(--accent-3);
+}
+
+@media (max-width: 768px) {
+ .tax-stats { grid-template-columns: 1fr 1fr 1fr; }
+ .onboard-card { bottom: 90px; }
+}
+
+/* ===== Power Plug ===== */
+.plug-card {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.plug-hero {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 16px;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+}
+
+.plug-city { font-size: 1.3rem; font-weight: 700; }
+
+.plug-types { display: flex; gap: 8px; flex-wrap: wrap; }
+
+.plug-type {
+ padding: 6px 12px;
+ background: rgba(78, 205, 196, 0.12);
+ color: var(--accent-3);
+ border-radius: 20px;
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+
+.plug-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 14px;
+ margin-bottom: 16px;
+}
+
+.plug-grid div {
+ padding: 14px;
+ background: rgba(255,255,255,0.03);
+ border-radius: var(--radius-md);
+}
+
+.plug-grid small {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-bottom: 4px;
+}
+
+.plug-grid strong { font-size: 0.95rem; }
+
+.plug-tip {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ line-height: 1.5;
+}
+
+/* ===== Emergency ===== */
+.emergency-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 14px;
+}
+
+.emergency-card {
+ display: flex;
+ gap: 14px;
+ padding: 18px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+}
+
+.emergency-emoji { font-size: 1.8rem; }
+.emergency-card h4 { font-size: 0.9rem; margin-bottom: 4px; color: var(--text-secondary); }
+.emergency-value { font-size: 1.1rem; display: block; margin-bottom: 4px; }
+.emergency-card p { font-size: 0.8rem; color: var(--text-secondary); margin: 0; }
+
+.emergency-disclaimer {
+ text-align: center;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-top: 16px;
+}
+
+/* ===== City Notes ===== */
+.notes-card {
+ display: grid;
+ grid-template-columns: 220px 1fr;
+ gap: 20px;
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ min-height: 360px;
+}
+
+.notes-sidebar {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ border-right: 1px solid rgba(255,255,255,0.06);
+ padding-right: 12px;
+}
+
+.notes-city {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 10px 12px;
+ background: transparent;
+ border: 1px solid transparent;
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ cursor: pointer;
+ font-size: 0.9rem;
+ text-align: left;
+}
+
+.notes-city:hover,
+.notes-city.active {
+ background: rgba(78, 205, 196, 0.1);
+ border-color: rgba(78, 205, 196, 0.25);
+}
+
+.notes-dot {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background: var(--accent-3);
+}
+
+.notes-count {
+ margin-top: auto;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ padding: 8px 4px 0;
+}
+
+.notes-editor h3 { font-size: 1.15rem; margin-bottom: 12px; }
+
+.notes-textarea {
+ width: 100%;
+ padding: 14px;
+ background: rgba(255,255,255,0.03);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+ font-family: inherit;
+ resize: vertical;
+ line-height: 1.55;
+ margin-bottom: 12px;
+}
+
+.notes-textarea:focus {
+ outline: none;
+ border-color: rgba(78, 205, 196, 0.45);
+}
+
+.notes-actions { display: flex; gap: 10px; }
+
+/* ===== Focus Timer ===== */
+.focus-card {
+ max-width: 420px;
+ margin: 0 auto;
+ padding: 36px 28px;
+ text-align: center;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.focus-ring {
+ width: 180px;
+ height: 180px;
+ border-radius: 50%;
+ margin: 0 auto 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.focus-ring-inner {
+ width: 148px;
+ height: 148px;
+ border-radius: 50%;
+ background: var(--bg-card);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.focus-ring-inner strong {
+ font-size: 2.4rem;
+ font-variant-numeric: tabular-nums;
+ letter-spacing: 0.02em;
+}
+
+.focus-ring-inner small {
+ color: var(--text-secondary);
+ font-size: 0.85rem;
+ margin-top: 4px;
+}
+
+.focus-presets {
+ display: flex;
+ justify-content: center;
+ gap: 8px;
+ margin-bottom: 18px;
+}
+
+.focus-actions {
+ display: flex;
+ justify-content: center;
+ gap: 10px;
+}
+
+.focus-done {
+ margin-top: 14px;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+@media (max-width: 768px) {
+ .plug-grid { grid-template-columns: 1fr; }
+ .notes-card { grid-template-columns: 1fr; }
+ .notes-sidebar {
+ flex-direction: row;
+ flex-wrap: wrap;
+ border-right: none;
+ border-bottom: 1px solid rgba(255,255,255,0.06);
+ padding-right: 0;
+ padding-bottom: 12px;
+ }
+ .notes-count { width: 100%; margin-top: 4px; }
+}
+
+/* ===== Tools Hub ===== */
+.tools-hub-page {
+ padding: calc(var(--nav-height) + 40px) 0 80px;
+ position: relative;
+ z-index: 1;
+}
+
+.tools-hub-page .section-header h1 {
+ font-size: clamp(1.8rem, 4vw, 2.4rem);
+ margin: 12px 0 8px;
+}
+
+.tools-hub-toolbar {
+ margin: 28px auto 32px;
+ max-width: 900px;
+}
+
+.tools-hub-search {
+ width: 100%;
+ padding: 14px 18px;
+ margin-bottom: 14px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.95rem;
+}
+
+.tools-hub-search:focus {
+ outline: none;
+ border-color: rgba(78, 205, 196, 0.5);
+}
+
+.tools-hub-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ justify-content: center;
+}
+
+.tools-hub-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 16px;
+}
+
+.tools-hub-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.25s, border-color 0.25s;
+ display: flex;
+ flex-direction: column;
+}
+
+.tools-hub-card:hover {
+ transform: translateY(-4px);
+ border-color: rgba(78, 205, 196, 0.35);
+}
+
+.tools-hub-emoji { font-size: 1.8rem; margin-bottom: 8px; }
+.tools-hub-card h3 { font-size: 1.05rem; margin-bottom: 6px; }
+.tools-hub-card p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.45;
+ flex: 1;
+ margin-bottom: 12px;
+}
+
+.tools-hub-go {
+ font-size: 0.85rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+.section-nav-tools {
+ text-decoration: none;
+ color: inherit;
+ border: 1px dashed rgba(78, 205, 196, 0.35) !important;
+}
+
+/* ===== ATM Guide ===== */
+.atm-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 16px;
+}
+
+.atm-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s;
+}
+
+.atm-card:hover { transform: translateY(-3px); }
+.atm-emoji { font-size: 1.8rem; display: block; margin-bottom: 8px; }
+.atm-card h4 { font-size: 1.05rem; margin-bottom: 8px; }
+.atm-card p { font-size: 0.85rem; color: var(--text-secondary); line-height: 1.5; }
+
+/* ===== Changelog ===== */
+.changelog-list { margin: 28px 0; }
+
+.changelog-item {
+ padding: 20px 0;
+ border-bottom: 1px solid rgba(255,255,255,0.06);
+}
+
+.changelog-meta {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 12px;
+}
+
+.changelog-meta time {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+.changelog-tag {
+ font-size: 0.75rem;
+ padding: 3px 10px;
+ background: rgba(78, 205, 196, 0.12);
+ color: var(--accent-3);
+ border-radius: 12px;
+ font-weight: 600;
+}
+
+.changelog-item ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.changelog-item li {
+ position: relative;
+ padding: 6px 0 6px 16px;
+ color: var(--text-secondary);
+ line-height: 1.5;
+ font-size: 0.95rem;
+}
+
+.changelog-item li::before {
+ content: "\2022";
+ position: absolute;
+ left: 0;
+ color: var(--accent-3);
+}
+
+/* ===== Tools Strip ===== */
+.tools-strip {
+ padding: 12px 0 28px;
+ position: relative;
+ z-index: 1;
+}
+
+.tools-strip-inner {
+ padding: 18px 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+}
+
+.tools-strip-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 14px;
+ gap: 12px;
+}
+
+.tools-strip-head strong { font-size: 0.95rem; }
+.tools-strip-head a {
+ font-size: 0.85rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+.tools-strip-list {
+ display: grid;
+ grid-template-columns: repeat(8, 1fr);
+ gap: 8px;
+}
+
+.tools-strip-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 4px;
+ padding: 12px 6px;
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.06);
+ border-radius: var(--radius-md);
+ transition: all 0.2s;
+ text-align: center;
+}
+
+.tools-strip-item:hover {
+ border-color: rgba(78, 205, 196, 0.35);
+ background: rgba(78, 205, 196, 0.08);
+ transform: translateY(-2px);
+}
+
+.tools-strip-item span { font-size: 1.3rem; }
+.tools-strip-item small {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+
+@media (max-width: 900px) {
+ .tools-strip-list { grid-template-columns: repeat(4, 1fr); }
+}
+
+@media (max-width: 480px) {
+ .tools-strip-list { grid-template-columns: repeat(4, 1fr); }
+}
+
+
+/* ===== Runway Calculator ===== */
+.runway-card {
+ display: grid;
+ grid-template-columns: minmax(220px, 280px) 1fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+}
+.runway-pulse { animation: runwayPulse 0.45s ease; }
+@keyframes runwayPulse {
+ 0% { transform: scale(1); }
+ 50% { transform: scale(1.01); box-shadow: var(--shadow-glow); }
+ 100% { transform: scale(1); }
+}
+.runway-meter { text-align: center; }
+.runway-ring {
+ width: 168px;
+ height: 168px;
+ border-radius: 50%;
+ margin: 0 auto 16px;
+ display: grid;
+ place-items: center;
+}
+.runway-ring-inner {
+ width: 128px;
+ height: 128px;
+ border-radius: 50%;
+ background: var(--bg-secondary);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+.runway-ring-inner strong {
+ font-family: var(--font-display);
+ font-size: 2.4rem;
+ line-height: 1;
+}
+.runway-ring-inner small { color: var(--text-muted); margin-top: 4px; }
+.runway-level span {
+ font-weight: 700;
+ font-size: 1.05rem;
+}
+.runway-level p {
+ color: var(--text-secondary);
+ font-size: 0.88rem;
+ margin-top: 6px;
+ line-height: 1.45;
+}
+.runway-form {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.runway-form > label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.runway-form > label > span {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.runway-form input[type=number],
+.meeting-controls select {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+ font-size: 1rem;
+}
+.runway-dests small {
+ display: block;
+ color: var(--text-muted);
+ margin-bottom: 8px;
+}
+.runway-dest-list {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.runway-dest {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 2px;
+ padding: 10px;
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.08);
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ transition: all 0.2s;
+ text-align: left;
+ color: inherit;
+}
+.runway-dest:hover,
+.runway-dest.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.08);
+}
+.runway-dest em { font-style: normal; font-weight: 600; font-size: 0.88rem; }
+.runway-dest small { color: var(--text-muted); }
+.runway-summary {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 12px;
+ padding: 12px;
+ background: rgba(255,255,255,0.03);
+ border-radius: var(--radius-md);
+}
+.runway-summary small { color: var(--text-muted); display: block; }
+.runway-summary strong { font-size: 1.1rem; }
+.runway-milestones {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 8px;
+ margin-top: 4px;
+}
+.runway-ms {
+ text-align: center;
+ opacity: 0.35;
+ transition: opacity 0.25s;
+}
+.runway-ms.on { opacity: 1; }
+.runway-ms i {
+ display: block;
+ height: 4px;
+ border-radius: 4px;
+ background: var(--accent-3);
+ margin-bottom: 6px;
+}
+.runway-ms span { font-size: 0.75rem; color: var(--text-secondary); }
+
+/* ===== Meeting Window ===== */
+.meeting-card {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+.meeting-controls {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 14px 18px;
+}
+.meeting-controls label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.meeting-controls label > span {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.meeting-range {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 8px;
+ align-items: center;
+}
+.meeting-range em {
+ grid-column: 1 / -1;
+ font-style: normal;
+ font-size: 0.9rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+.meeting-range input[type=range] {
+ width: 100%;
+ accent-color: var(--accent-3);
+}
+.meeting-score {
+ padding: 16px 18px;
+ border-radius: var(--radius-md);
+ border: 1px solid;
+ background: rgba(255,255,255,0.03);
+ display: flex;
+ flex-wrap: wrap;
+ align-items: baseline;
+ gap: 10px 14px;
+}
+.meeting-score strong {
+ font-family: var(--font-display);
+ font-size: 1.8rem;
+}
+.meeting-score > span { font-weight: 700; }
+.meeting-score p {
+ flex: 1 1 100%;
+ color: var(--text-secondary);
+ font-size: 0.92rem;
+ margin: 0;
+}
+.meeting-legend {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 14px;
+ margin-bottom: 10px;
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+}
+.meeting-legend i {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ border-radius: 2px;
+ margin-right: 6px;
+ vertical-align: middle;
+}
+.meeting-legend .m-home { background: rgba(167, 139, 250, 0.7); }
+.meeting-legend .m-peer { background: rgba(255, 230, 109, 0.7); }
+.meeting-legend .m-both { background: #4ECDC4; }
+.meeting-bars {
+ display: grid;
+ grid-template-columns: repeat(24, 1fr);
+ gap: 3px;
+ min-height: 56px;
+}
+.meeting-cell {
+ border-radius: 4px;
+ background: rgba(255,255,255,0.05);
+ position: relative;
+ transition: transform 0.15s, background 0.15s;
+ min-height: 48px;
+}
+.meeting-cell.home { background: rgba(167, 139, 250, 0.28); }
+.meeting-cell.peer { background: rgba(255, 230, 109, 0.22); }
+.meeting-cell.home.peer { background: rgba(78, 205, 196, 0.25); }
+.meeting-cell.overlap {
+ background: linear-gradient(180deg, #4ECDC4, #3db8b0);
+ box-shadow: 0 0 12px rgba(78, 205, 196, 0.35);
+}
+.meeting-cell:hover { transform: translateY(-2px); }
+.meeting-cell span {
+ position: absolute;
+ bottom: 4px;
+ left: 0;
+ right: 0;
+ text-align: center;
+ font-size: 0.65rem;
+ color: var(--text-muted);
+}
+.meeting-axis {
+ display: flex;
+ justify-content: space-between;
+ margin-top: 8px;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+/* Tools hub featured */
+.tools-featured {
+ margin: 8px 0 28px;
+ padding: 18px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+}
+.tools-featured-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 14px;
+ gap: 12px;
+}
+.tools-featured-head span {
+ font-size: 0.85rem;
+ color: var(--accent-3);
+}
+.tools-featured-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 10px;
+}
+.tools-featured-card {
+ display: flex;
+ gap: 12px;
+ align-items: flex-start;
+ padding: 14px;
+ border-radius: var(--radius-md);
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.06);
+ transition: all 0.2s;
+}
+.tools-featured-card:hover {
+ border-color: rgba(78, 205, 196, 0.35);
+ background: rgba(78, 205, 196, 0.08);
+ transform: translateY(-2px);
+}
+.tools-featured-card > span { font-size: 1.5rem; line-height: 1; }
+.tools-featured-card h3 {
+ font-size: 0.95rem;
+ margin-bottom: 4px;
+}
+.tools-featured-card p {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ margin: 0;
+}
+
+@media (max-width: 900px) {
+ .runway-card { grid-template-columns: 1fr; }
+ .runway-dest-list { grid-template-columns: repeat(2, 1fr); }
+ .meeting-controls { grid-template-columns: 1fr; }
+ .tools-featured-grid { grid-template-columns: repeat(2, 1fr); }
+}
+@media (max-width: 560px) {
+ .tools-featured-grid { grid-template-columns: 1fr; }
+ .meeting-bars { gap: 2px; }
+ .meeting-cell { min-height: 36px; }
+}
+
+
+/* ===== Daylight Work Hours ===== */
+.daylight-card {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+.daylight-controls {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+.daylight-controls label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ max-width: 320px;
+}
+.daylight-controls label > span,
+.bag-extra > span {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.daylight-controls select {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+}
+.daylight-months {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+}
+.daylight-month {
+ padding: 6px 10px;
+ border-radius: 999px;
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ color: var(--text-secondary);
+ cursor: pointer;
+ font-size: 0.8rem;
+ transition: all 0.2s;
+}
+.daylight-month:hover,
+.daylight-month.active {
+ color: var(--text-primary);
+ border-color: rgba(255, 230, 109, 0.45);
+ background: rgba(255, 230, 109, 0.12);
+}
+.daylight-sky {
+ position: relative;
+ height: 72px;
+ border-radius: var(--radius-md);
+ background: linear-gradient(90deg, #0b1224, #1a2744 40%, #2a1f3d 70%, #0b1224);
+ overflow: hidden;
+ border: 1px solid rgba(255,255,255,0.06);
+}
+.daylight-band {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ background: linear-gradient(180deg, rgba(255,230,109,0.45), rgba(255,107,107,0.15));
+}
+.daylight-deep {
+ position: absolute;
+ top: 18px;
+ bottom: 18px;
+ background: rgba(78, 205, 196, 0.55);
+ border-radius: 6px;
+ box-shadow: 0 0 16px rgba(78, 205, 196, 0.35);
+}
+.daylight-markers {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+}
+.daylight-markers span {
+ position: absolute;
+ bottom: 6px;
+ transform: translateX(-50%);
+ font-size: 0.65rem;
+ color: rgba(241,245,249,0.7);
+}
+.daylight-stats {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 10px;
+ margin-top: 12px;
+}
+.daylight-stats small {
+ display: block;
+ color: var(--text-muted);
+ font-size: 0.75rem;
+}
+.daylight-stats strong {
+ font-family: var(--font-display);
+ font-size: 1.25rem;
+}
+.daylight-tips {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 12px;
+}
+.daylight-tip {
+ display: flex;
+ gap: 12px;
+ padding: 14px;
+ border-radius: var(--radius-md);
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.06);
+}
+.daylight-tip > span { font-size: 1.4rem; }
+.daylight-tip strong { display: block; margin-bottom: 4px; font-size: 0.95rem; }
+.daylight-tip p { margin: 0; color: var(--text-secondary); font-size: 0.85rem; line-height: 1.45; }
+
+/* ===== Bag Weight ===== */
+.bag-card {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 18px;
+}
+.bag-gauge {
+ height: 10px;
+ border-radius: 999px;
+ background: rgba(255,255,255,0.08);
+ overflow: hidden;
+}
+.bag-gauge-fill {
+ height: 100%;
+ border-radius: 999px;
+ transition: width 0.35s ease, background 0.25s;
+}
+.bag-meter-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+ gap: 12px;
+ margin-top: 10px;
+}
+.bag-meter-row strong {
+ font-family: var(--font-display);
+ font-size: 1.8rem;
+}
+.bag-meter-row small { color: var(--text-muted); }
+.bag-status { font-weight: 700; }
+.bag-tip { color: var(--text-secondary); font-size: 0.9rem; margin: 6px 0 0; }
+.bag-limits {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 8px;
+}
+.bag-limit {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 4px;
+ padding: 10px 6px;
+ border-radius: var(--radius-md);
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ cursor: pointer;
+ color: inherit;
+ transition: all 0.2s;
+}
+.bag-limit:hover,
+.bag-limit.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.1);
+}
+.bag-limit em { font-style: normal; font-size: 0.8rem; font-weight: 600; }
+.bag-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.bag-item {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 12px;
+ border-radius: var(--radius-md);
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ cursor: pointer;
+ color: inherit;
+ text-align: left;
+ transition: all 0.2s;
+}
+.bag-item:hover { transform: translateY(-1px); }
+.bag-item.on {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.1);
+}
+.bag-item > span { font-size: 1.25rem; }
+.bag-item strong { display: block; font-size: 0.88rem; }
+.bag-item small { color: var(--text-muted); }
+.bag-item i {
+ margin-left: auto;
+ font-style: normal;
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ display: grid;
+ place-items: center;
+ background: rgba(255,255,255,0.08);
+ font-size: 0.75rem;
+}
+.bag-item.on i { background: var(--accent-3); color: #0a0e17; font-weight: 700; }
+.bag-extra {
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ gap: 12px;
+ align-items: center;
+}
+.bag-extra input[type=range] { width: 100%; accent-color: var(--accent-3); }
+.bag-extra em { font-style: normal; font-weight: 600; color: var(--accent-3); min-width: 3.5rem; text-align: right; }
+
+@media (max-width: 900px) {
+ .daylight-tips { grid-template-columns: 1fr; }
+ .daylight-stats { grid-template-columns: repeat(2, 1fr); }
+ .bag-grid { grid-template-columns: repeat(2, 1fr); }
+ .bag-limits { grid-template-columns: repeat(2, 1fr); }
+}
+@media (max-width: 560px) {
+ .bag-grid { grid-template-columns: 1fr; }
+ .bag-extra { grid-template-columns: 1fr; }
+}
+
+
+/* ===== Visa Stay Countdown ===== */
+.visa-stay-card {
+ display: grid;
+ grid-template-columns: minmax(220px, 280px) 1fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+}
+.visa-stay-meter { text-align: center; }
+.visa-stay-ring {
+ width: 168px;
+ height: 168px;
+ border-radius: 50%;
+ margin: 0 auto 16px;
+ display: grid;
+ place-items: center;
+}
+.visa-stay-ring-inner {
+ width: 128px;
+ height: 128px;
+ border-radius: 50%;
+ background: var(--bg-secondary);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+.visa-stay-ring-inner strong {
+ font-family: var(--font-display);
+ font-size: 2.6rem;
+ line-height: 1;
+}
+.visa-stay-ring-inner small { color: var(--text-muted); margin-top: 4px; }
+.visa-stay-level span { font-weight: 700; font-size: 1.05rem; }
+.visa-stay-level p {
+ color: var(--text-secondary);
+ font-size: 0.88rem;
+ margin-top: 6px;
+ line-height: 1.45;
+}
+.visa-stay-form {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.visa-stay-form > label,
+.workspot-controls > label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.visa-stay-form > label > span,
+.workspot-controls > label > span {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.visa-stay-form input,
+.visa-stay-form select,
+.workspot-controls select {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+ font-size: 1rem;
+}
+.visa-stay-hint {
+ margin: 0;
+ font-size: 0.85rem;
+ color: var(--accent-3);
+}
+.visa-stay-stats {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 10px;
+ padding: 12px;
+ background: rgba(255,255,255,0.03);
+ border-radius: var(--radius-md);
+}
+.visa-stay-stats small { display: block; color: var(--text-muted); }
+.visa-stay-stats strong { font-size: 1.05rem; }
+
+/* ===== Work Spot Cost ===== */
+.workspot-card {
+ display: grid;
+ grid-template-columns: 1fr 1.1fr;
+ gap: 22px;
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+}
+.workspot-controls {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.workspot-controls input[type=range],
+.visa-stay-form input[type=range] {
+ width: 100%;
+ accent-color: var(--accent-3);
+}
+.workspot-modes {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.workspot-mode {
+ padding: 10px 8px;
+ border-radius: var(--radius-md);
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ color: inherit;
+ cursor: pointer;
+ font-weight: 600;
+ font-size: 0.85rem;
+ transition: all 0.2s;
+}
+.workspot-mode:hover,
+.workspot-mode.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.1);
+}
+.workspot-result {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.workspot-hero {
+ padding: 18px;
+ border-radius: var(--radius-md);
+ background: linear-gradient(135deg, rgba(78,205,196,0.12), rgba(255,107,107,0.08));
+ border: 1px solid rgba(255,255,255,0.08);
+}
+.workspot-hero small { color: var(--text-muted); display: block; }
+.workspot-hero strong {
+ font-family: var(--font-display);
+ font-size: 2.2rem;
+ display: block;
+ margin: 4px 0 6px;
+}
+.workspot-hero > span { font-weight: 600; font-size: 0.92rem; }
+.workspot-compare {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.workspot-compare > div {
+ padding: 12px;
+ border-radius: var(--radius-md);
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.06);
+ transition: all 0.2s;
+}
+.workspot-compare > div.on {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.1);
+}
+.workspot-compare small { display: block; color: var(--text-muted); font-size: 0.75rem; }
+.workspot-compare strong { display: block; margin: 4px 0; font-size: 1.05rem; }
+.workspot-compare em {
+ font-style: normal;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ line-height: 1.35;
+}
+.workspot-tip {
+ margin: 0;
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ line-height: 1.45;
+}
+
+@media (max-width: 900px) {
+ .visa-stay-card,
+ .workspot-card { grid-template-columns: 1fr; }
+ .workspot-compare { grid-template-columns: 1fr; }
+ .visa-stay-stats { grid-template-columns: 1fr; }
+}
+
+
+/* ===== First Month Cost ===== */
+.firstmonth-card {
+ display: grid;
+ grid-template-columns: 0.9fr 1.2fr;
+ gap: 22px;
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+}
+.firstmonth-controls {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.firstmonth-controls > label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.firstmonth-controls > label > span {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.firstmonth-controls select {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+}
+.firstmonth-housing {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.firstmonth-chip {
+ padding: 10px 8px;
+ border-radius: var(--radius-md);
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ color: inherit;
+ cursor: pointer;
+ font-weight: 600;
+ font-size: 0.85rem;
+ transition: all 0.2s;
+}
+.firstmonth-chip:hover,
+.firstmonth-chip.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.1);
+}
+.firstmonth-check {
+ flex-direction: row !important;
+ align-items: center;
+ gap: 10px !important;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+}
+.firstmonth-total {
+ padding: 18px;
+ border-radius: var(--radius-md);
+ background: linear-gradient(135deg, rgba(255,107,107,0.12), rgba(78,205,196,0.1));
+ border: 1px solid rgba(255,255,255,0.08);
+ margin-bottom: 14px;
+}
+.firstmonth-total small { color: var(--text-muted); display: block; }
+.firstmonth-total strong {
+ font-family: var(--font-display);
+ font-size: 2.2rem;
+ display: block;
+ margin: 4px 0 6px;
+}
+.firstmonth-total span { font-size: 0.85rem; color: var(--text-secondary); }
+.firstmonth-bars { display: flex; flex-direction: column; gap: 10px; }
+.firstmonth-bar-row {
+ display: grid;
+ grid-template-columns: 110px 1fr 72px;
+ gap: 10px;
+ align-items: center;
+ font-size: 0.88rem;
+}
+.firstmonth-bar-track {
+ height: 8px;
+ border-radius: 999px;
+ background: rgba(255,255,255,0.08);
+ overflow: hidden;
+}
+.firstmonth-bar-track i {
+ display: block;
+ height: 100%;
+ border-radius: 999px;
+ background: linear-gradient(90deg, #FF6B6B, #4ECDC4);
+}
+.firstmonth-bar-row em {
+ font-style: normal;
+ text-align: right;
+ font-weight: 600;
+ color: var(--text-secondary);
+}
+
+/* ===== Data Budget ===== */
+.data-budget-card {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 18px;
+}
+.data-budget-gauge {
+ height: 10px;
+ border-radius: 999px;
+ background: rgba(255,255,255,0.08);
+ overflow: hidden;
+}
+.data-budget-fill {
+ height: 100%;
+ border-radius: 999px;
+ background: linear-gradient(90deg, #4ECDC4, #A78BFA);
+ transition: width 0.3s ease;
+}
+.data-budget-hero {
+ display: flex;
+ align-items: baseline;
+ gap: 8px;
+ margin-top: 10px;
+}
+.data-budget-hero strong {
+ font-family: var(--font-display);
+ font-size: 2.2rem;
+}
+.data-budget-hero span { color: var(--text-muted); }
+.data-budget-plan {
+ margin: 6px 0 0;
+ color: var(--text-secondary);
+ font-size: 0.92rem;
+}
+.data-budget-plan b { color: var(--accent-3); }
+.data-budget-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.data-budget-item {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 12px;
+ border-radius: var(--radius-md);
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ cursor: pointer;
+ color: inherit;
+ text-align: left;
+ transition: all 0.2s;
+}
+.data-budget-item:hover { transform: translateY(-1px); }
+.data-budget-item.on {
+ border-color: rgba(167, 139, 250, 0.45);
+ background: rgba(167, 139, 250, 0.12);
+}
+.data-budget-item > span { font-size: 1.25rem; }
+.data-budget-item strong { display: block; font-size: 0.88rem; }
+.data-budget-item small { color: var(--text-muted); }
+.data-budget-item i {
+ margin-left: auto;
+ font-style: normal;
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ display: grid;
+ place-items: center;
+ background: rgba(255,255,255,0.08);
+ font-size: 0.75rem;
+}
+.data-budget-item.on i { background: #A78BFA; color: #0a0e17; font-weight: 700; }
+.data-budget-sliders {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 14px;
+}
+.data-budget-sliders label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.data-budget-sliders input[type=range] {
+ width: 100%;
+ accent-color: #A78BFA;
+}
+
+@media (max-width: 900px) {
+ .firstmonth-card { grid-template-columns: 1fr; }
+ .data-budget-grid { grid-template-columns: repeat(2, 1fr); }
+ .data-budget-sliders { grid-template-columns: 1fr; }
+ .firstmonth-bar-row { grid-template-columns: 1fr; gap: 4px; }
+ .firstmonth-bar-row em { text-align: left; }
+}
+@media (max-width: 560px) {
+ .data-budget-grid { grid-template-columns: 1fr; }
+}
+
+
+/* ===== Shared kit cards (batch tools) ===== */
+.kit-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.kit-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; align-items: end; }
+.kit-field { display: flex; flex-direction: column; gap: 6px; }
+.kit-field > span { font-size: 0.85rem; color: var(--text-secondary); }
+.kit-field input, .kit-field select {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+}
+.kit-field input[type=range] { accent-color: var(--accent-3); padding: 0; border: 0; background: transparent; }
+.kit-stat { text-align: right; }
+.kit-stat strong { font-family: var(--font-display); font-size: 1.8rem; display: block; }
+.kit-stat small { color: var(--text-muted); }
+.kit-bar { height: 8px; border-radius: 999px; background: rgba(255,255,255,0.08); overflow: hidden; }
+.kit-bar i { display: block; height: 100%; background: linear-gradient(90deg,#4ECDC4,#A78BFA); border-radius: 999px; }
+.kit-actions { display: flex; flex-wrap: wrap; gap: 8px; }
+.kit-grid-3 { display: grid; grid-template-columns: repeat(3,1fr); gap: 8px; }
+.kit-grid-3 > div, .kit-list-item {
+ padding: 12px;
+ border-radius: var(--radius-md);
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.06);
+}
+.kit-grid-3 small { display: block; color: var(--text-muted); font-size: 0.75rem; }
+.kit-grid-3 strong { font-size: 1rem; }
+.kit-note { margin: 0; color: var(--text-secondary); font-size: 0.9rem; line-height: 1.45; }
+.kit-note b { color: var(--accent-3); }
+.kit-chips { display: flex; flex-wrap: wrap; gap: 8px; }
+.kit-chips.wrap { gap: 8px; }
+.kit-chip {
+ padding: 8px 12px;
+ border-radius: 999px;
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ color: inherit;
+ cursor: pointer;
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+.kit-chip:hover, .kit-chip.active {
+ border-color: rgba(78,205,196,0.4);
+ background: rgba(78,205,196,0.1);
+}
+.kit-hero { display: flex; gap: 14px; align-items: flex-start; padding: 14px; border-radius: var(--radius-md); background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06); }
+.kit-hero > span { font-size: 2rem; line-height: 1; }
+.kit-hero small { color: var(--text-muted); display: block; }
+.kit-hero strong { display: block; font-size: 1.25rem; margin: 4px 0; }
+.kit-hero p { margin: 0; color: var(--text-secondary); font-size: 0.88rem; }
+.kit-list { display: flex; flex-direction: column; gap: 8px; }
+.kit-list-item { display: flex; gap: 12px; align-items: flex-start; text-align: left; }
+.kit-list-item > span { font-size: 1.25rem; }
+.kit-list-item strong { display: block; font-size: 0.92rem; }
+.kit-list-item small { color: var(--text-secondary); font-size: 0.8rem; }
+.kit-list-item.btnish { width: 100%; cursor: pointer; color: inherit; transition: all 0.2s; }
+.kit-list-item.btnish.on { border-color: rgba(78,205,196,0.4); background: rgba(78,205,196,0.1); }
+.kit-list-item i { margin-left: auto; font-style: normal; opacity: 0.7; }
+
+/* Weekend */
+.weekend-card, .deposit-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+.weekend-controls { display: flex; flex-direction: column; gap: 12px; }
+.weekend-controls label, .deposit-fields label { display: flex; flex-direction: column; gap: 6px; }
+.weekend-controls span, .deposit-fields span { font-size: 0.85rem; color: var(--text-secondary); }
+.weekend-controls select, .deposit-fields input {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+}
+.weekend-energy { display: flex; flex-wrap: wrap; gap: 8px; }
+.weekend-chip {
+ padding: 8px 12px; border-radius: 999px; border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03); color: inherit; cursor: pointer; font-weight: 600; font-size: 0.85rem;
+}
+.weekend-chip.active, .weekend-chip:hover { border-color: rgba(255,230,109,0.45); background: rgba(255,230,109,0.12); }
+.weekend-hero { display: flex; gap: 16px; padding: 18px; border-radius: var(--radius-md); background: linear-gradient(135deg, rgba(255,107,107,0.12), rgba(78,205,196,0.1)); }
+.weekend-emoji { font-size: 2.6rem; }
+.weekend-hero small { color: var(--text-muted); }
+.weekend-hero h3 { margin: 4px 0 8px; font-size: 1.35rem; }
+.weekend-hero p { margin: 0 0 6px; color: var(--text-secondary); }
+.weekend-hero em { font-style: normal; color: var(--accent-3); font-weight: 600; }
+.weekend-list { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
+.weekend-mini {
+ padding: 8px 10px; border-radius: var(--radius-md); border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03); color: inherit; cursor: pointer; font-size: 0.8rem;
+}
+.weekend-mini.on { border-color: rgba(78,205,196,0.4); background: rgba(78,205,196,0.1); }
+
+/* Deposit */
+.deposit-top { display: grid; grid-template-columns: 1.2fr 1fr; gap: 14px; }
+.deposit-gauge { height: 8px; border-radius: 999px; background: rgba(255,255,255,0.08); overflow: hidden; margin-bottom: 8px; }
+.deposit-gauge i { display: block; height: 100%; border-radius: 999px; }
+.deposit-meta strong { font-size: 1.6rem; margin-right: 8px; }
+.deposit-meta span { color: var(--text-secondary); font-size: 0.9rem; }
+.deposit-fields { display: grid; gap: 10px; }
+.deposit-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
+.deposit-item {
+ display: flex; gap: 10px; align-items: flex-start; text-align: left; padding: 12px;
+ border-radius: var(--radius-md); border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03); color: inherit; cursor: pointer;
+}
+.deposit-item.on { border-color: rgba(78,205,196,0.4); background: rgba(78,205,196,0.1); }
+.deposit-item strong { display: block; font-size: 0.88rem; }
+.deposit-item small { color: var(--text-secondary); font-size: 0.75rem; }
+.deposit-item i { margin-left: auto; font-style: normal; }
+.deposit-actions { display: flex; gap: 8px; flex-wrap: wrap; }
+
+@media (max-width: 900px) {
+ .kit-row, .deposit-top, .deposit-grid, .kit-grid-3 { grid-template-columns: 1fr; }
+ .kit-stat { text-align: left; }
+}
+
+/* ===== Move Plan Hub (/plan) ===== */
+.plan-page {
+ padding: 100px 0 80px;
+ min-height: 70vh;
+}
+.plan-loading {
+ color: var(--text-secondary);
+ padding: 48px 0;
+}
+.plan-hero {
+ margin-bottom: 28px;
+}
+.plan-hero p {
+ max-width: 640px;
+ color: var(--text-secondary);
+ margin: 8px 0 20px;
+ line-height: 1.6;
+}
+.plan-title-input {
+ display: block;
+ width: 100%;
+ max-width: 720px;
+ background: transparent;
+ border: none;
+ border-bottom: 1px solid transparent;
+ color: var(--text-primary);
+ font-size: clamp(1.8rem, 4vw, 2.6rem);
+ font-weight: 700;
+ letter-spacing: -0.02em;
+ padding: 4px 0;
+ margin: 8px 0 0;
+}
+.plan-title-input:focus {
+ outline: none;
+ border-bottom-color: var(--accent-2);
+}
+.plan-meta-row {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+}
+.plan-meta-field {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+}
+.plan-meta-field input {
+ min-width: 180px;
+ padding: 10px 12px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-card);
+ color: var(--text-primary);
+}
+.plan-stats {
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
+ gap: 12px;
+ margin-bottom: 20px;
+}
+.plan-stat {
+ padding: 16px 18px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.plan-stat span {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+.plan-stat strong {
+ font-size: 1.25rem;
+}
+.plan-warn-text { color: var(--accent-1) !important; }
+.plan-alert {
+ margin-bottom: 20px;
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: 1px solid color-mix(in srgb, var(--accent-1) 40%, transparent);
+ background: color-mix(in srgb, var(--accent-1) 12%, transparent);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+ line-height: 1.5;
+}
+.plan-layout {
+ display: grid;
+ grid-template-columns: minmax(0, 1.6fr) minmax(280px, 0.9fr);
+ gap: 24px;
+ align-items: start;
+}
+.plan-panel {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 22px 24px;
+ margin-bottom: 20px;
+ backdrop-filter: blur(16px);
+}
+.plan-panel h2 {
+ font-size: 1.1rem;
+ margin: 0;
+}
+.plan-panel-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ flex-wrap: wrap;
+ margin-bottom: 16px;
+}
+.plan-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+}
+.plan-empty {
+ text-align: center;
+ padding: 40px 16px;
+ color: var(--text-secondary);
+}
+.plan-empty-icon { font-size: 2.8rem; display: block; margin-bottom: 8px; }
+.plan-empty .btn { margin-top: 12px; }
+.plan-timeline {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+.plan-stop {
+ display: grid;
+ grid-template-columns: 44px 1fr;
+ gap: 12px;
+}
+.plan-stop-rail {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+.plan-stop-dot {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ display: grid;
+ place-items: center;
+ background: var(--bg-secondary, rgba(255,255,255,0.06));
+ border: var(--border-glass);
+ font-size: 1.2rem;
+ flex-shrink: 0;
+}
+.plan-stop-line {
+ width: 2px;
+ flex: 1;
+ min-height: 24px;
+ background: linear-gradient(to bottom, var(--accent-2), transparent);
+ opacity: 0.5;
+ margin: 4px 0;
+}
+.plan-stop-body {
+ padding-bottom: 22px;
+}
+.plan-stop-top {
+ display: flex;
+ justify-content: space-between;
+ gap: 12px;
+ align-items: flex-start;
+}
+.plan-stop-top strong a {
+ color: var(--text-primary);
+ text-decoration: none;
+}
+.plan-stop-top strong a:hover { color: var(--accent-2); }
+.plan-stop-country { font-weight: 500; color: var(--text-secondary); }
+.plan-stop-range {
+ display: block;
+ margin-top: 4px;
+ font-size: 0.8rem;
+ color: var(--accent-2);
+}
+.plan-stop-tools {
+ display: flex;
+ gap: 4px;
+}
+.plan-stop-tools button {
+ width: 28px;
+ height: 28px;
+ border-radius: 8px;
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--text-secondary);
+ cursor: pointer;
+}
+.plan-stop-tools button:disabled { opacity: 0.35; cursor: not-allowed; }
+.plan-stop-tools button:not(:disabled):hover {
+ color: var(--text-primary);
+ border-color: var(--accent-2);
+}
+.plan-remove:hover { color: var(--accent-1) !important; }
+.plan-stop-controls {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 10px;
+ margin: 10px 0;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+}
+.plan-stop-controls input {
+ width: 56px;
+ margin: 0 6px;
+ padding: 6px 8px;
+ border-radius: 8px;
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--text-primary);
+}
+.plan-stop-cost {
+ font-weight: 700;
+ color: var(--text-primary);
+}
+.plan-stop-unit { font-size: 0.8rem; }
+.plan-note {
+ width: 100%;
+ resize: vertical;
+ min-height: 56px;
+ padding: 10px 12px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--text-primary);
+ font: inherit;
+ line-height: 1.45;
+}
+.plan-visa {
+ margin: 8px 0 0;
+ font-size: 0.82rem;
+ color: var(--text-secondary);
+ line-height: 1.45;
+}
+.plan-visa.warn {
+ color: var(--accent-1);
+}
+.plan-compare-wrap { overflow-x: auto; }
+.plan-compare {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.88rem;
+}
+.plan-compare th,
+.plan-compare td {
+ text-align: left;
+ padding: 10px 8px;
+ border-bottom: 1px solid color-mix(in srgb, var(--text-secondary) 20%, transparent);
+}
+.plan-compare th { color: var(--text-secondary); font-weight: 500; }
+.plan-ready-pill {
+ font-size: 0.8rem;
+ color: var(--accent-2);
+}
+.plan-ready-bar {
+ height: 6px;
+ border-radius: 99px;
+ background: color-mix(in srgb, var(--text-secondary) 20%, transparent);
+ margin-bottom: 16px;
+ overflow: hidden;
+}
+.plan-ready-bar > div {
+ height: 100%;
+ border-radius: inherit;
+ background: linear-gradient(90deg, var(--accent-1), var(--accent-2));
+ transition: width 0.25s ease;
+}
+.plan-check-group { margin-bottom: 14px; }
+.plan-check-group h3 {
+ font-size: 0.78rem;
+ text-transform: uppercase;
+ letter-spacing: 0.04em;
+ color: var(--text-secondary);
+ margin: 0 0 8px;
+}
+.plan-check-group ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+.plan-check-group label {
+ display: flex;
+ gap: 10px;
+ align-items: flex-start;
+ cursor: pointer;
+ font-size: 0.9rem;
+}
+.plan-check-group input { margin-top: 3px; accent-color: var(--accent-2); }
+.plan-check-group strong { display: block; font-weight: 600; }
+.plan-check-group small {
+ display: block;
+ color: var(--text-secondary);
+ font-size: 0.75rem;
+ margin-top: 2px;
+}
+.plan-side .btn { width: 100%; margin-top: 8px; }
+
+@media (max-width: 960px) {
+ .plan-stats { grid-template-columns: repeat(2, 1fr); }
+ .plan-layout { grid-template-columns: 1fr; }
+}
+@media (max-width: 520px) {
+ .plan-stats { grid-template-columns: 1fr 1fr; }
+ .plan-page { padding-top: 88px; }
+}
+
+/* ===== Compare page + modal actions ===== */
+.compare-modal-actions,
+.compare-page-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ justify-content: flex-end;
+ margin-top: 24px;
+ padding-top: 16px;
+ border-top: 1px solid color-mix(in srgb, var(--text-secondary) 18%, transparent);
+}
+.compare-page {
+ padding: 100px 0 80px;
+ min-height: 70vh;
+}
+.compare-page-hero {
+ margin-bottom: 24px;
+}
+.compare-page-hero h1 {
+ font-size: clamp(1.8rem, 4vw, 2.4rem);
+ margin: 8px 0;
+}
+.compare-page-hero p {
+ max-width: 560px;
+ color: var(--text-secondary);
+ line-height: 1.6;
+}
+.compare-pick-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
+ gap: 10px;
+}
+.compare-pick-chip {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 2px;
+ padding: 12px;
+ border-radius: var(--radius-lg);
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--text-primary);
+ cursor: pointer;
+ text-align: left;
+ transition: border-color 0.2s, background 0.2s;
+}
+.compare-pick-chip span { font-size: 1.4rem; }
+.compare-pick-chip strong { font-size: 0.92rem; }
+.compare-pick-chip small {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+.compare-pick-chip:hover { border-color: var(--accent-2); }
+.compare-pick-chip.on {
+ border-color: var(--accent-2);
+ background: color-mix(in srgb, var(--accent-2) 12%, transparent);
+}
+.compare-page-empty { margin-top: 12px; }
+@media (max-width: 700px) {
+ .compare-modal-actions,
+ .compare-page-actions { justify-content: stretch; }
+ .compare-modal-actions .btn,
+ .compare-page-actions .btn { flex: 1; }
+}
+
+/* ===== Plan cloud sync + profile hub ===== */
+.plan-sync-row {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 10px;
+ margin: 0 0 16px;
+}
+.plan-sync-pill {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 6px 12px;
+ border-radius: 999px;
+ font-size: 0.8rem;
+ border: var(--border-glass);
+ color: var(--text-secondary);
+ text-decoration: none;
+}
+.plan-sync-pill.synced { color: var(--accent-2); border-color: color-mix(in srgb, var(--accent-2) 40%, transparent); }
+.plan-sync-pill.syncing { color: var(--accent-3, #FFE66D); }
+.plan-sync-pill.offline { color: var(--accent-1); }
+.profile-section-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ flex-wrap: wrap;
+ margin-bottom: 12px;
+}
+.profile-section-head h2 { margin: 0; }
+.profile-plan-meta {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px 16px;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 12px;
+ padding-bottom: 12px;
+ border-bottom: 1px solid color-mix(in srgb, var(--text-secondary) 18%, transparent);
+}
+.profile-trip-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-top: 12px;
+}
+.dest-months-pick {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ padding: 8px 10px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+}
+.dest-months-pick input {
+ width: 48px;
+ padding: 4px 6px;
+ border-radius: 6px;
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--text-primary);
+}
+.dest-plan-hints {
+ margin: 12px 0 4px;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+
+/* ===== Plan visas + ICS ===== */
+.plan-alert-visa {
+ border-color: color-mix(in srgb, #FFE66D 45%, transparent);
+ background: color-mix(in srgb, #FFE66D 10%, transparent);
+}
+.plan-stop-visas {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin-top: 8px;
+}
+.plan-visa-chip {
+ font-size: 0.75rem;
+ padding: 4px 8px;
+ border-radius: 999px;
+ border: var(--border-glass);
+ color: var(--text-secondary);
+ background: color-mix(in srgb, var(--accent-2) 8%, transparent);
+}
+.plan-visa-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 12px;
+}
+.plan-visa-card {
+ padding: 14px;
+ border-radius: var(--radius-lg);
+ border: var(--border-glass);
+ background: color-mix(in srgb, var(--bg-card) 80%, transparent);
+}
+.plan-visa-card header {
+ display: flex;
+ gap: 10px;
+ align-items: flex-start;
+ margin-bottom: 10px;
+}
+.plan-visa-card header span { font-size: 1.5rem; }
+.plan-visa-card strong { display: block; font-size: 0.95rem; }
+.plan-visa-card small {
+ color: var(--text-secondary);
+ font-size: 0.75rem;
+}
+.plan-visa-card ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ font-size: 0.82rem;
+ color: var(--text-secondary);
+}
+.plan-visa-card p {
+ margin: 8px 0 0;
+ font-size: 0.8rem;
+ color: var(--accent-2);
+}
+.plan-visa-missing {
+ margin: 12px 0 0;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.5;
+}
+
+/* ===== Product discovery polish ===== */
+.trip-hero-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ justify-content: center;
+ margin-top: 14px;
+}
+.auth-sync-note {
+ margin: 0 0 16px;
+ padding: 10px 14px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: color-mix(in srgb, var(--accent-2) 10%, transparent);
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.5;
+}
+.auth-sync-note a {
+ color: var(--accent-2);
+ margin-left: 4px;
+}
+.auth-redirect-card {
+ margin: 0 0 18px;
+ padding: 12px 14px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: color-mix(in srgb, var(--accent-2) 8%, transparent);
+}
+.auth-redirect-merge {
+ margin: 0 0 8px;
+ font-size: 0.82rem;
+ color: var(--text-secondary);
+ line-height: 1.45;
+}
+.auth-redirect-dest {
+ margin: 0;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 8px;
+ font-size: 0.88rem;
+ color: var(--text-secondary);
+}
+.auth-redirect-badge {
+ display: inline-flex;
+ align-items: center;
+ padding: 4px 10px;
+ border-radius: 999px;
+ background: color-mix(in srgb, var(--accent-2) 18%, transparent);
+ color: var(--accent-2);
+ font-weight: 600;
+ font-size: 0.85rem;
+}
+.auth-demo-btn {
+ width: 100%;
+}
+.auth-google {
+ display: flex;
+ justify-content: center;
+ margin-bottom: 12px;
+ min-height: 44px;
+}
+.auth-google.is-disabled {
+ pointer-events: none;
+ opacity: 0.55;
+}
+.join-pay-note {
+ margin-top: 10px;
+ font-size: 0.85rem;
+}
+.tools-core-banner {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 12px;
+ margin: 0 0 28px;
+}
+.tools-core-banner-secondary {
+ margin-top: -12px;
+}
+.tools-core-card {
+ display: flex;
+ gap: 12px;
+ align-items: center;
+ padding: 16px 18px;
+ border-radius: var(--radius-xl);
+ border: var(--border-glass);
+ background: var(--bg-card);
+ text-decoration: none;
+ color: inherit;
+ transition: border-color 0.2s, transform 0.2s;
+}
+.tools-core-card:hover {
+ border-color: var(--accent-2);
+ transform: translateY(-2px);
+}
+.tools-core-card span { font-size: 1.6rem; }
+.tools-core-card strong { display: block; font-size: 0.95rem; }
+.tools-core-card p {
+ margin: 2px 0 0;
+ font-size: 0.78rem;
+ color: var(--text-secondary);
+}
+@media (max-width: 800px) {
+ .tools-core-banner { grid-template-columns: 1fr; }
+}
+
+/* ===== Lang toggle + H5 polish (PWA / i18n) ===== */
+.nav-lang-btn {
+ min-width: 44px;
+ min-height: 36px;
+ padding: 6px 12px;
+ border-radius: 10px;
+ border: var(--border-glass);
+ background: color-mix(in srgb, var(--bg-card) 80%, transparent);
+ color: var(--text-primary);
+ font-size: 0.8rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: border-color 0.2s, background 0.2s;
+}
+.nav-lang-btn:hover {
+ border-color: var(--accent-2);
+}
+.nav-mobile-extras {
+ display: none;
+ flex-direction: column;
+ gap: 12px;
+ margin-top: 12px;
+ padding-top: 12px;
+ border-top: var(--border-glass);
+}
+
+@media (max-width: 768px) {
+ .nav-login-desktop,
+ .nav-user-desktop { display: none; }
+ .nav-mobile-extras { display: flex; }
+ .nav-mobile-extras .nav-login-btn {
+ text-align: center;
+ display: block;
+ }
+ .nav-utils { gap: 6px; }
+ .nav-utils .nav-lang-btn {
+ min-width: 40px;
+ padding: 6px 8px;
+ }
+
+ .plan-page,
+ .compare-page,
+ .tools-hub-page {
+ padding-top: calc(var(--nav-height) + 16px);
+ padding-bottom: calc(48px + env(safe-area-inset-bottom, 0px));
+ }
+ .plan-panel-head { align-items: flex-start; }
+ .plan-actions { width: 100%; }
+ .plan-actions .btn { flex: 1 1 auto; min-height: 40px; }
+ .plan-meta-field input { min-width: 0; width: 100%; }
+ .plan-compare-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
+ .compare-pick-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 8px;
+ }
+ .compare-cards {
+ grid-template-columns: 1fr !important;
+ }
+ .hero-actions,
+ .trip-hero-actions {
+ flex-direction: column;
+ align-items: stretch;
+ }
+ .hero-actions .btn,
+ .trip-hero-actions .btn {
+ width: 100%;
+ justify-content: center;
+ }
+ .compare-bar,
+ .matcher-fab {
+ bottom: calc(16px + env(safe-area-inset-bottom, 0px)) !important;
+ }
+ .section-nav {
+ padding-bottom: env(safe-area-inset-bottom, 0px);
+ }
+ .auth-card {
+ margin: 16px;
+ width: auto;
+ }
+}
+
+@supports (padding: max(0px)) {
+ .navbar {
+ padding-left: max(16px, env(safe-area-inset-left));
+ padding-right: max(16px, env(safe-area-inset-right));
+ }
+}
+
+/* ===== Journey path (homepage funnel) ===== */
+.journey-strip {
+ padding: 48px 0 32px;
+}
+.journey-head {
+ margin-bottom: 28px;
+}
+.journey-rail {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 16px;
+ position: relative;
+}
+.journey-step {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+}
+.journey-connector {
+ display: none;
+}
+.journey-card {
+ height: 100%;
+ padding: 20px 18px;
+ border-radius: var(--radius-xl);
+ border: var(--border-glass);
+ background: var(--bg-card);
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ transition: border-color 0.2s, transform 0.2s;
+}
+.journey-card:hover {
+ border-color: var(--accent-2);
+ transform: translateY(-2px);
+}
+.journey-card-top {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 4px;
+}
+.journey-n {
+ font-size: 0.75rem;
+ font-weight: 700;
+ letter-spacing: 0.08em;
+ color: var(--accent-2);
+}
+.journey-emoji { font-size: 1.5rem; }
+.journey-card h3 {
+ margin: 0;
+ font-size: 1.05rem;
+}
+.journey-card p {
+ margin: 0;
+ flex: 1;
+ font-size: 0.85rem;
+ line-height: 1.5;
+ color: var(--text-secondary);
+}
+.journey-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-top: 10px;
+}
+@media (max-width: 960px) {
+ .journey-rail { grid-template-columns: repeat(2, minmax(0, 1fr)); }
+}
+@media (max-width: 560px) {
+ .journey-strip { padding: 32px 0 20px; }
+ .journey-rail { grid-template-columns: 1fr; }
+}
+
+/* ===== Homepage flow (shorter scroll) ===== */
+.home-flow .section-compact {
+ padding: 64px 0;
+}
+.home-flow .section-compact .section-header {
+ margin-bottom: 36px;
+}
+.home-flow .trip-section.section-compact {
+ padding-bottom: 48px;
+}
+
+.dest-compare-hint {
+ text-align: center;
+ margin: -24px 0 20px;
+ padding: 10px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: color-mix(in srgb, var(--accent-2) 10%, transparent);
+ font-size: 0.88rem;
+ color: var(--text-secondary);
+}
+
+.dest-card {
+ position: relative;
+}
+.dest-card-link {
+ display: block;
+ text-decoration: none;
+ color: inherit;
+}
+.compare-check {
+ position: absolute;
+ top: 12px;
+ right: 12px;
+ z-index: 2;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: 50%;
+ width: 36px;
+ height: 36px;
+ cursor: pointer;
+ font-size: 0.85rem;
+ display: grid;
+ place-items: center;
+ transition: background 0.2s, transform 0.2s;
+}
+.compare-check.on {
+ background: var(--accent-3);
+ color: #0a0e17;
+ font-weight: 700;
+}
+.dest-card-actions {
+ padding: 0 16px 16px;
+ display: flex;
+ gap: 8px;
+ align-items: center;
+ justify-content: space-between;
+}
+.dest-expand-wrap {
+ text-align: center;
+ margin-top: 24px;
+}
+.map-browse-link { margin-top: 12px; }
+.visa-plan-cta { margin-top: 8px; }
+.faq-plan-hint {
+ text-align: center;
+ margin-top: 28px;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+}
+.faq-plan-hint a {
+ color: var(--accent-2);
+ margin-left: 4px;
+}
+
+.compare-bar-meta {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ min-width: 72px;
+}
+.compare-bar-meta strong { font-size: 0.95rem; }
+.compare-bar-hint {
+ font-size: 0.72rem;
+ color: var(--text-secondary);
+ white-space: nowrap;
+}
+
+@media (max-width: 768px) {
+ .home-flow .section-compact { padding: 48px 0; }
+ .compare-bar {
+ left: 12px;
+ right: 12px;
+ bottom: calc(12px + env(safe-area-inset-bottom, 0px));
+ flex-wrap: wrap;
+ justify-content: space-between;
+ padding: 12px 14px;
+ gap: 8px;
+ }
+ .compare-bar .btn { flex: 1; min-width: 0; }
+}
+
+/* ===== Next Stop / Meetups / Community (NomadCNA ? nomadro) ===== */
+
+.next-stop-page,
+.meetups-page,
+.community-page,
+.community-detail-page,
+.tool-runner-page {
+ padding: 100px 0 80px;
+ min-height: 60vh;
+}
+
+.next-stop-layout {
+ display: grid;
+ grid-template-columns: 280px 1fr;
+ gap: 28px;
+ align-items: start;
+}
+
+.next-stop-filters {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ position: sticky;
+ top: 96px;
+}
+
+.next-stop-filter-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 18px;
+ backdrop-filter: blur(16px);
+}
+
+.next-stop-filter-card label {
+ display: block;
+ font-size: 0.85rem;
+ font-weight: 600;
+ margin-bottom: 10px;
+}
+
+.next-stop-filter-card input[type="range"] {
+ width: 100%;
+ accent-color: var(--accent-3);
+}
+
+.next-stop-value {
+ display: block;
+ margin-top: 8px;
+ font-size: 0.9rem;
+ color: var(--accent-2);
+}
+
+.next-stop-chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.next-stop-hero {
+ display: flex;
+ justify-content: space-between;
+ gap: 24px;
+ padding: 28px;
+ margin-bottom: 24px;
+ border-radius: var(--radius-xl);
+ background: linear-gradient(135deg, rgba(78, 205, 196, 0.12), rgba(167, 139, 250, 0.12));
+ border: var(--border-glass);
+}
+
+.next-stop-badge {
+ display: inline-block;
+ font-size: 0.75rem;
+ font-weight: 700;
+ letter-spacing: 0.08em;
+ color: var(--accent-3);
+ margin-bottom: 8px;
+}
+
+.next-stop-hero h2 {
+ font-family: var(--font-display);
+ font-size: 1.75rem;
+ margin-bottom: 8px;
+}
+
+.next-stop-hero h2 small {
+ font-size: 1rem;
+ color: var(--text-secondary);
+ font-weight: 500;
+}
+
+.next-stop-reasons {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin: 12px 0 16px;
+}
+
+.next-stop-reason {
+ font-size: 0.75rem;
+ padding: 4px 10px;
+ border-radius: 999px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+}
+
+.next-stop-hero-actions {
+ display: flex;
+ gap: 12px;
+ flex-wrap: wrap;
+}
+
+.next-stop-score-ring {
+ flex-shrink: 0;
+ width: 88px;
+ height: 88px;
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ background: var(--bg-card);
+ border: 2px solid var(--accent-3);
+}
+
+.next-stop-score-ring strong {
+ font-size: 1.5rem;
+ line-height: 1;
+ background: var(--gradient-text);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+}
+
+.next-stop-score-ring span {
+ font-size: 0.7rem;
+ color: var(--text-muted);
+}
+
+.next-stop-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 16px;
+}
+
+.next-stop-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 16px;
+ transition: transform 0.2s, border-color 0.2s;
+}
+
+.next-stop-card:hover {
+ transform: translateY(-3px);
+ border-color: rgba(78, 205, 196, 0.35);
+}
+
+.next-stop-card-head {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 8px;
+}
+
+.next-stop-card-head em {
+ margin-left: auto;
+ font-style: normal;
+ font-weight: 700;
+ color: var(--accent-2);
+}
+
+.next-stop-card-actions {
+ display: flex;
+ justify-content: space-between;
+ margin-top: 12px;
+ font-size: 0.85rem;
+}
+
+.next-stop-card-actions button {
+ background: none;
+ border: none;
+ color: var(--accent-3);
+ cursor: pointer;
+}
+
+.next-stop-routes,
+.next-stop-meetups {
+ margin-top: 40px;
+}
+
+.next-stop-route-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
+ gap: 16px;
+ margin-top: 16px;
+}
+
+.next-stop-route-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 20px;
+}
+
+.next-stop-route-stops {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin: 12px 0;
+}
+
+.next-stop-route-stops a {
+ font-size: 0.85rem;
+ padding: 4px 10px;
+ border-radius: 999px;
+ background: var(--bg-glass);
+}
+
+.next-stop-route-card footer {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ flex-wrap: wrap;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+.next-stop-meetups-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 12px;
+}
+
+.next-stop-meetup-row {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.next-stop-meetup-chip {
+ display: flex;
+ gap: 12px;
+ padding: 14px 16px;
+ border-radius: var(--radius-md);
+ background: var(--bg-card);
+ border: var(--border-glass);
+}
+
+.meetups-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 24px;
+}
+
+.meetups-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+ gap: 20px;
+}
+
+.meetup-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 22px;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.meetup-card-top {
+ display: flex;
+ gap: 12px;
+}
+
+.meetup-emoji {
+ font-size: 2rem;
+}
+
+.meetup-meta,
+.meetup-venue {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+.meetup-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+}
+
+.meetup-tag {
+ font-size: 0.72rem;
+ padding: 3px 8px;
+ border-radius: 999px;
+ background: var(--bg-glass);
+}
+
+.meetup-footer {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+ flex-wrap: wrap;
+ margin-top: auto;
+ padding-top: 8px;
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+}
+
+.meetup-city-link {
+ font-size: 0.85rem;
+ color: var(--accent-3);
+}
+
+.btn-sm {
+ padding: 6px 14px;
+ font-size: 0.8rem;
+}
+
+.btn.is-done {
+ opacity: 0.65;
+}
+
+.community-banner {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 20px;
+ padding: 24px 28px;
+ margin-bottom: 28px;
+ border-radius: var(--radius-xl);
+ background: linear-gradient(135deg, rgba(255, 107, 107, 0.1), rgba(78, 205, 196, 0.1));
+ border: var(--border-glass);
+}
+
+.community-featured {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 24px;
+ margin-bottom: 24px;
+}
+
+.community-pinned {
+ font-size: 0.75rem;
+ color: var(--accent-2);
+}
+
+.community-toolbar {
+ margin-bottom: 20px;
+}
+
+.community-list {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+
+.community-card {
+ display: block;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 20px;
+ transition: border-color 0.2s, transform 0.2s;
+}
+
+.community-card:hover {
+ border-color: rgba(167, 139, 250, 0.35);
+ transform: translateX(4px);
+}
+
+.community-card-head {
+ display: flex;
+ gap: 12px;
+ margin-bottom: 8px;
+}
+
+.community-meta {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.community-excerpt {
+ color: var(--text-secondary);
+ margin-bottom: 12px;
+}
+
+.community-card footer {
+ display: flex;
+ gap: 12px;
+ font-size: 0.8rem;
+ color: var(--text-muted);
+ flex-wrap: wrap;
+}
+
+.community-tag {
+ padding: 2px 8px;
+ border-radius: 999px;
+ background: var(--bg-glass);
+}
+
+.community-detail {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+ margin-bottom: 24px;
+}
+
+.community-detail-cat {
+ font-size: 0.75rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+.community-replies {
+ margin-top: 24px;
+}
+
+.community-reply {
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ padding: 16px;
+ margin-bottom: 12px;
+}
+
+.community-reply-head {
+ display: flex;
+ justify-content: space-between;
+ font-size: 0.85rem;
+ margin-bottom: 8px;
+}
+
+.community-replies-preview blockquote {
+ margin: 10px 0;
+ padding-left: 12px;
+ border-left: 3px solid var(--accent-3);
+ color: var(--text-secondary);
+}
+
+.community-reply-hint {
+ text-align: center;
+ padding: 32px;
+ color: var(--text-secondary);
+}
+
+.tool-runner-head {
+ margin-bottom: 24px;
+}
+
+.tool-runner-head h1 {
+ font-family: var(--font-display);
+ font-size: 2rem;
+}
+
+.tool-runner-exits {
+ margin: 1.25rem 0 0.5rem;
+}
+
+.tool-loading {
+ padding: 48px;
+ text-align: center;
+ color: var(--text-muted);
+}
+
+@media (max-width: 1024px) {
+ .next-stop-layout { grid-template-columns: 1fr; }
+ .next-stop-filters { position: static; }
+ .next-stop-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
+}
+
+@media (max-width: 640px) {
+ .next-stop-grid { grid-template-columns: 1fr; }
+ .next-stop-hero { flex-direction: column; }
+ .community-banner { flex-direction: column; align-items: flex-start; }
+}
+
+/* ===== Dating / Chat / Join / Live / Digital ===== */
+
+.dating-page,
+.chat-page,
+.chat-thread-page,
+.join-page,
+.live-page,
+.digital-page {
+ padding: 100px 0 80px;
+ min-height: 60vh;
+}
+
+.dating-gate,
+.join-paid,
+.digital-gate,
+.live-gate {
+ text-align: center;
+ padding: 48px 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ max-width: 480px;
+ margin: 0 auto;
+}
+
+.dating-intents {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 16px;
+}
+
+.dating-quota {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ margin-bottom: 20px;
+}
+
+.dating-quota a {
+ color: var(--accent-3);
+}
+
+.dating-empty,
+.gigs-empty,
+.notif-empty {
+ text-align: center;
+ padding: 1.5rem 0 0.5rem;
+}
+
+.dating-empty-actions,
+.notif-empty-links,
+.join-paid-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.65rem;
+ justify-content: center;
+ margin-top: 1rem;
+}
+
+.join-vip-badge {
+ margin-top: 0.75rem;
+ display: inline-block;
+ padding: 0.35rem 0.9rem;
+ border-radius: 999px;
+ background: rgba(255, 193, 7, 0.15);
+ color: #e6b800;
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+
+.gigs-applied {
+ color: var(--accent-3);
+ font-weight: 600;
+ margin: 0.5rem 0 0;
+}
+
+.dating-card {
+ max-width: 420px;
+ margin: 0 auto;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 28px;
+ text-align: center;
+}
+
+.dating-deck {
+ position: relative;
+ max-width: 420px;
+ margin: 0 auto;
+ min-height: 360px;
+ touch-action: none;
+ user-select: none;
+}
+
+.dating-card-next {
+ position: absolute;
+ inset: 0;
+ transform: scale(0.96);
+ opacity: 0.55;
+ pointer-events: none;
+ z-index: 0;
+}
+
+.dating-card-top {
+ position: relative;
+ z-index: 1;
+ cursor: grab;
+ will-change: transform;
+}
+
+.dating-card-top.dragging {
+ cursor: grabbing;
+}
+
+.dating-card-top.fly-left {
+ animation: dating-fly-left 0.22s ease-in forwards;
+}
+.dating-card-top.fly-right {
+ animation: dating-fly-right 0.22s ease-in forwards;
+}
+.dating-card-top.fly-up {
+ animation: dating-fly-up 0.22s ease-in forwards;
+}
+
+@keyframes dating-fly-left {
+ to { transform: translate(-140%, 20px) rotate(-18deg); opacity: 0; }
+}
+@keyframes dating-fly-right {
+ to { transform: translate(140%, 20px) rotate(18deg); opacity: 0; }
+}
+@keyframes dating-fly-up {
+ to { transform: translate(0, -140%) rotate(-4deg); opacity: 0; }
+}
+
+.dating-stamp {
+ position: absolute;
+ top: 24px;
+ padding: 6px 12px;
+ border: 3px solid;
+ border-radius: 8px;
+ font-weight: 800;
+ letter-spacing: 0.08em;
+ pointer-events: none;
+ z-index: 2;
+}
+.dating-stamp.like {
+ left: 18px;
+ color: #3dd68c;
+ border-color: #3dd68c;
+ transform: rotate(-12deg);
+}
+.dating-stamp.nope {
+ right: 18px;
+ color: #ff6b6b;
+ border-color: #ff6b6b;
+ transform: rotate(12deg);
+}
+.dating-stamp.super {
+ left: 50%;
+ top: 18px;
+ transform: translateX(-50%) rotate(-6deg);
+ color: #ffe66d;
+ border-color: #ffe66d;
+}
+
+.dating-swipe-hint {
+ text-align: center;
+ color: var(--text-muted);
+ font-size: 0.85rem;
+ margin: 0.25rem 0 0.75rem;
+}
+
+.dating-card-photo {
+ font-size: 4rem;
+ margin-bottom: 12px;
+}
+
+.member-photo-img {
+ width: 96px;
+ height: 96px;
+ border-radius: 50%;
+ object-fit: cover;
+ display: block;
+ margin: 0 auto;
+}
+
+.dating-meta {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin-bottom: 12px;
+}
+
+.dating-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ justify-content: center;
+ margin: 16px 0;
+}
+
+.dating-view-profile {
+ display: inline-block;
+ margin-top: 4px;
+ font-size: 0.85rem;
+ color: var(--accent, #e8a87c);
+ text-decoration: none;
+ pointer-events: auto;
+ position: relative;
+ z-index: 2;
+}
+
+.dating-view-profile:hover {
+ text-decoration: underline;
+}
+
+.dating-actions {
+ display: flex;
+ justify-content: center;
+ gap: 20px;
+ margin-top: 20px;
+}
+
+.dating-btn {
+ width: 56px;
+ height: 56px;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ font-size: 1.4rem;
+ cursor: pointer;
+ transition: transform 0.15s;
+}
+
+.dating-btn:hover { transform: scale(1.08); }
+.dating-btn.like { border-color: rgba(255, 107, 107, 0.5); }
+.dating-btn.super { border-color: rgba(255, 230, 109, 0.5); }
+
+.dating-match-modal {
+ position: fixed;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.6);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 2000;
+ padding: 24px;
+}
+
+.dating-match-box {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+ text-align: center;
+ max-width: 360px;
+}
+
+.dating-match-actions {
+ display: flex;
+ gap: 12px;
+ justify-content: center;
+ margin-top: 20px;
+}
+
+.chat-list {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.chat-list-item {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 16px 18px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ transition: border-color 0.2s;
+}
+
+.chat-list-item:hover { border-color: rgba(78, 205, 196, 0.35); }
+.chat-list-item.unread { border-color: rgba(78, 205, 196, 0.45); }
+
+.community-compose {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ margin-top: 24px;
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+
+.community-compose textarea {
+ padding: 12px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ min-height: 80px;
+}
+
+.community-compose-foot {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+}
+
+.community-compose-count,
+.community-compose-hint {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.community-compose-hint {
+ margin: 0;
+}
+
+.gigs-page { padding: 100px 0 80px; min-height: 60vh; }
+
+.join-card select {
+ padding: 10px 14px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+}
+
+.video-embed {
+ position: relative;
+ padding-bottom: 56.25%;
+ height: 0;
+ margin-top: 24px;
+ border-radius: var(--radius-lg);
+ overflow: hidden;
+}
+
+.video-embed iframe {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+ border: 0;
+}
+
+.report-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 24px;
+ margin-top: 24px;
+}
+
+.report-rank { list-style: none; padding: 0; }
+.report-rank li {
+ display: grid;
+ grid-template-columns: 24px 1fr auto auto;
+ gap: 12px;
+ padding: 10px 0;
+ border-bottom: var(--border-glass);
+ align-items: center;
+}
+
+.member-map-grid, .member-map-list {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
+ gap: 12px;
+}
+
+.member-map-item {
+ display: flex;
+ gap: 10px;
+ align-items: center;
+ padding: 12px;
+ background: var(--bg-glass);
+ border-radius: var(--radius-md);
+}
+
+.member-loc-link {
+ color: inherit;
+ text-decoration: none;
+}
+.member-loc-link:hover {
+ color: var(--accent, #4ecdc4);
+ text-decoration: underline;
+}
+
+.weather-strip { margin-top: 32px; }
+.weather-cards { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 12px; }
+.weather-card {
+ padding: 12px 16px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ min-width: 100px;
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+ text-decoration: none;
+ color: inherit;
+ transition: border-color 0.15s ease, transform 0.15s ease;
+}
+a.weather-card:hover {
+ border-color: rgba(78, 205, 196, 0.35);
+ transform: translateY(-1px);
+}
+
+.ai-reply {
+ margin-top: 24px;
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+
+.ai-suggestions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 16px;
+}
+
+.feedback-more-link {
+ margin-top: 12px;
+ text-align: center;
+ font-size: 0.85rem;
+}
+
+.feedback-more-link a {
+ color: var(--text-muted);
+}
+
+.ai-cities { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
+
+.notif-toolbar { display: flex; gap: 8px; flex-wrap: wrap; }
+.notif-pref-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 10px 0;
+ border-bottom: var(--border-glass);
+}
+
+.nav-notify-badge {
+ position: absolute;
+ top: -4px;
+ right: -4px;
+ font-size: 0.65rem;
+ font-style: normal;
+ background: var(--accent-1);
+ color: #fff;
+ border-radius: 999px;
+ padding: 1px 5px;
+}
+
+.nav-notify { position: relative; }
+
+.newsletter-strip {
+ margin-top: 48px;
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ text-align: center;
+}
+
+.newsletter-form {
+ display: flex;
+ gap: 10px;
+ justify-content: center;
+ margin-top: 12px;
+ flex-wrap: wrap;
+}
+
+.newsletter-form input {
+ min-width: 220px;
+ padding: 10px 14px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+}
+
+.newsletter-note {
+ margin-top: 10px;
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+@media (max-width: 768px) {
+ .report-grid { grid-template-columns: 1fr; }
+}
+
+.dating-likes-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 16px;
+ margin-top: 24px;
+}
+
+.dating-like-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ text-align: center;
+}
+
+.dating-like-photo { font-size: 2.5rem; margin-bottom: 8px; }
+
+.chat-avatar { font-size: 1.75rem; }
+.chat-avatar-img {
+ width: 44px;
+ height: 44px;
+ border-radius: 50%;
+ object-fit: cover;
+ flex-shrink: 0;
+}
+.chat-unread {
+ margin-left: auto;
+ font-style: normal;
+ background: var(--accent-1);
+ color: #fff;
+ font-size: 0.75rem;
+ padding: 2px 8px;
+ border-radius: 999px;
+}
+
+.chat-thread-wrap {
+ display: flex;
+ flex-direction: column;
+ min-height: calc(100vh - 120px);
+}
+
+.chat-thread-peer {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ padding: 12px 0;
+ margin-bottom: 8px;
+ border-bottom: var(--border-glass);
+}
+
+.chat-thread-peer-link {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ text-decoration: none;
+ color: inherit;
+ min-width: 0;
+}
+
+.chat-thread-peer-link strong {
+ display: block;
+}
+
+.chat-thread-peer-link .dating-meta {
+ margin: 0;
+}
+
+.chat-thread-messages {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ padding: 20px 0;
+ overflow-y: auto;
+}
+
+.chat-bubble {
+ max-width: 75%;
+ padding: 12px 16px;
+ border-radius: var(--radius-lg);
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ align-self: flex-start;
+}
+
+.chat-bubble.mine {
+ align-self: flex-end;
+ background: rgba(78, 205, 196, 0.15);
+ border-color: rgba(78, 205, 196, 0.35);
+}
+
+.chat-compose {
+ display: flex;
+ gap: 10px;
+ padding-top: 16px;
+ border-top: var(--border-glass);
+}
+
+.chat-compose input {
+ flex: 1;
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+}
+
+.join-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 24px;
+}
+
+.join-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 28px;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.join-card label {
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+
+.join-card input,
+.join-card textarea {
+ padding: 10px 14px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+}
+
+.join-card-vip {
+ background: linear-gradient(135deg, rgba(255, 230, 109, 0.08), rgba(78, 205, 196, 0.08));
+}
+
+.join-perks {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+}
+
+.join-perks li { margin-bottom: 8px; }
+.join-login-hint { font-size: 0.85rem; margin-top: 8px; }
+.join-paid { display: flex; flex-direction: column; gap: 16px; align-items: center; }
+
+.live-page { padding: 0; min-height: 100vh; display: flex; flex-direction: column; }
+.live-toolbar {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding: 12px 20px;
+ background: var(--bg-card);
+ border-bottom: var(--border-glass);
+ flex-wrap: wrap;
+}
+.live-layout-btns { margin-left: auto; display: flex; gap: 6px; }
+.live-external-links {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 10px;
+ padding: 10px 20px;
+ background: var(--bg-card);
+ border-bottom: var(--border-glass);
+}
+.live-iframe-hint {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+.live-schedule-banner,
+.live-schedule {
+ padding: 8px 20px;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ background: var(--bg-card);
+ border-bottom: var(--border-glass);
+}
+.live-schedule {
+ padding: 0;
+ border: none;
+ background: transparent;
+ margin-bottom: 0.5rem;
+}
+.live-stage {
+ flex: 1;
+ display: grid;
+ min-height: 0;
+}
+.live-stage.layout-split { grid-template-columns: 1fr 380px; }
+.live-stage.layout-video { grid-template-columns: 1fr; }
+.live-stage.layout-chat { grid-template-columns: 1fr; }
+.live-iframe { width: 100%; height: 100%; border: none; min-height: 400px; }
+.live-video { background: #000; }
+.live-chat { border-left: var(--border-glass); }
+
+.digital-hero {
+ margin-bottom: 32px;
+}
+
+.digital-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
+ gap: 20px;
+}
+
+.digital-card {
+ display: block;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ transition: transform 0.2s, border-color 0.2s;
+}
+
+.digital-card:hover {
+ transform: translateY(-4px);
+ border-color: rgba(167, 139, 250, 0.35);
+}
+
+.digital-card-vip {
+ background: linear-gradient(135deg, rgba(255, 230, 109, 0.1), rgba(78, 205, 196, 0.1));
+}
+
+.digital-card-emoji { font-size: 2.5rem; display: block; margin-bottom: 12px; }
+
+.digital-module {
+ margin-bottom: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 24px;
+}
+
+.digital-lesson-list {
+ list-style: none;
+ padding: 0;
+ margin: 16px 0 0;
+}
+
+.digital-lesson-list li a {
+ display: flex;
+ justify-content: space-between;
+ padding: 12px 0;
+ border-bottom: var(--border-glass);
+ font-size: 0.95rem;
+}
+
+.digital-lesson-list li a.digital-lesson-locked {
+ opacity: 0.85;
+}
+
+.digital-lesson-list li a.digital-lesson-locked:hover .digital-lesson-meta {
+ color: var(--accent-3);
+}
+
+.digital-lesson-meta {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.digital-lesson {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+}
+
+.digital-lesson-body {
+ margin: 24px 0;
+ color: var(--text-secondary);
+ line-height: 1.7;
+}
+
+.digital-lesson-nav {
+ display: flex;
+ justify-content: space-between;
+ gap: 12px;
+ margin-top: 32px;
+}
+
+.digital-jobs-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+ gap: 20px;
+}
+
+.digital-job-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 22px;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.digital-job-company,
+.digital-job-meta {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+.meetup-footer-actions {
+ display: flex;
+ gap: 8px;
+ flex-wrap: wrap;
+}
+
+.meetup-live-btn {
+ background: var(--bg-glass);
+ color: var(--accent-3);
+}
+
+@media (max-width: 768px) {
+ .join-grid { grid-template-columns: 1fr; }
+ .live-toolbar {
+ padding: 10px 12px;
+ gap: 8px;
+ }
+ .live-toolbar strong {
+ flex: 1 1 100%;
+ font-size: 0.95rem;
+ }
+ .live-layout-btns {
+ margin-left: 0;
+ width: 100%;
+ justify-content: flex-start;
+ }
+ .live-external-links {
+ padding: 8px 12px;
+ }
+ .live-stage {
+ min-height: 50vh;
+ }
+ .live-stage.layout-split { grid-template-columns: 1fr; }
+ .live-iframe { min-height: 50vh; }
+ .live-chat { border-left: none; border-top: var(--border-glass); }
+}
+
+/* -- Feature rings / progressive IA -- */
+.nav-group {
+ position: relative;
+}
+.nav-group-btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ padding: 8px 14px;
+ border: none;
+ border-radius: var(--radius-sm);
+ background: transparent;
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all var(--transition);
+}
+.nav-group-btn:hover,
+.nav-group.open .nav-group-btn,
+.nav-group.is-active .nav-group-btn {
+ color: var(--text-primary);
+ background: var(--bg-glass);
+}
+.nav-group-caret {
+ font-size: 0.65rem;
+ opacity: 0.7;
+}
+.nav-group-panel {
+ display: none;
+ position: absolute;
+ top: calc(100% + 8px);
+ left: 0;
+ min-width: 200px;
+ padding: 8px;
+ border-radius: var(--radius-md);
+ background: rgba(10, 14, 23, 0.95);
+ border: var(--border-glass);
+ backdrop-filter: blur(16px);
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35);
+ flex-direction: column;
+ gap: 2px;
+ z-index: 50;
+}
+.nav-group.open .nav-group-panel {
+ display: flex;
+}
+.nav-group-panel a {
+ display: block;
+ padding: 10px 12px;
+ border-radius: var(--radius-sm);
+ color: var(--text-secondary);
+ font-size: 0.88rem;
+ white-space: nowrap;
+}
+.nav-group-panel a:hover,
+.nav-group-panel a.active {
+ color: var(--text-primary);
+ background: var(--bg-glass);
+}
+[data-theme="light"] .nav-group-panel {
+ background: rgba(248, 250, 252, 0.98);
+}
+
+.ring-next {
+ margin: 48px 0 24px;
+ padding: 28px 0 8px;
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
+}
+.ring-next-head {
+ margin-bottom: 16px;
+}
+.ring-next-tag {
+ display: inline-block;
+ font-size: 0.72rem;
+ letter-spacing: 0.12em;
+ color: var(--accent-3, #4ecdc4);
+ margin-bottom: 6px;
+}
+.ring-next-head h2 {
+ font-size: 1.25rem;
+ margin: 0;
+}
+.ring-next-grid {
+ display: grid;
+ gap: 12px;
+}
+.ring-next-n2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+}
+.ring-next-n3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+.ring-next-card {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 16px 18px;
+ border-radius: var(--radius-lg);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ transition: transform 0.2s ease, border-color 0.2s ease;
+}
+.ring-next-card:hover {
+ transform: translateY(-2px);
+ border-color: rgba(78, 205, 196, 0.35);
+}
+.ring-next-emoji {
+ font-size: 1.5rem;
+ flex-shrink: 0;
+}
+.ring-next-card strong {
+ display: block;
+ font-size: 0.98rem;
+}
+.ring-next-card p {
+ margin: 4px 0 0;
+ font-size: 0.82rem;
+ color: var(--text-secondary);
+ line-height: 1.4;
+}
+.ring-next-go {
+ margin-left: auto;
+ opacity: 0.45;
+ font-size: 1.1rem;
+}
+.home-ring-wrap {
+ padding-bottom: 8px;
+}
+.journey-rail-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+.footer-grid-rings {
+ grid-template-columns: 1.4fr repeat(4, minmax(0, 1fr));
+ gap: 28px;
+}
+.tools-featured-grid-compact {
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+}
+.tools-hub-more {
+ display: flex;
+ justify-content: center;
+ margin: 28px 0 8px;
+}
+
+@media (max-width: 900px) {
+ .nav-group-panel {
+ position: static;
+ display: none;
+ min-width: 0;
+ box-shadow: none;
+ background: transparent;
+ border: none;
+ padding: 4px 0 8px 12px;
+ backdrop-filter: none;
+ }
+ .nav-group.open .nav-group-panel {
+ display: flex;
+ }
+ .ring-next-n2,
+ .ring-next-n3,
+ .journey-rail-3 {
+ grid-template-columns: 1fr;
+ }
+ .footer-grid-rings {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+@media (max-width: 560px) {
+ .footer-grid-rings {
+ grid-template-columns: 1fr;
+ }
+}
+
+.search-ring-hints {
+ padding: 8px 4px 12px;
+}
+.search-ring-label {
+ font-size: 0.8rem;
+ letter-spacing: 0.06em;
+ color: var(--text-muted);
+ margin: 0 0 12px;
+}
+.search-ring-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 8px;
+}
+.search-ring-chip {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 6px;
+ padding: 12px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ cursor: pointer;
+ text-align: left;
+ transition: border-color 0.2s ease, transform 0.2s ease;
+}
+.search-ring-chip:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ transform: translateY(-1px);
+}
+.search-ring-chip span {
+ font-size: 1.2rem;
+}
+.search-ring-chip strong {
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+.search-hints-kbd {
+ margin: 14px 0 0;
+ font-size: 0.78rem;
+ color: var(--text-muted);
+}
+@media (max-width: 640px) {
+ .search-ring-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+.meetups-login-hint {
+ margin: 8px 0 0;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+}
+.meetups-login-hint a {
+ color: var(--accent-3, #4ecdc4);
+ text-decoration: underline;
+}
+
+/* ===== Recently viewed + AI history + profile RSVPs ===== */
+.recently-viewed {
+ padding: 2.5rem 0 1rem;
+}
+.recently-viewed.compact {
+ padding: 1.25rem 0;
+ margin-top: 1.5rem;
+}
+.recently-viewed-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 1rem;
+ margin-bottom: 1rem;
+ flex-wrap: wrap;
+}
+.recently-viewed-head h2 {
+ margin: 0.25rem 0 0;
+ font-size: 1.35rem;
+}
+.recently-viewed.compact .recently-viewed-head h2 {
+ font-size: 1.15rem;
+}
+.recently-viewed-actions {
+ display: flex;
+ gap: 0.5rem;
+ flex-wrap: wrap;
+}
+.recently-viewed-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+ gap: 0.75rem;
+}
+.recently-viewed-card {
+ display: flex;
+ gap: 0.75rem;
+ align-items: center;
+ padding: 0.85rem 1rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+ transition: transform 0.2s ease, border-color 0.2s ease;
+}
+.recently-viewed-card:hover {
+ transform: translateY(-2px);
+ border-color: color-mix(in srgb, var(--accent) 40%, transparent);
+}
+.recently-viewed-emoji {
+ font-size: 1.6rem;
+ line-height: 1;
+}
+.recently-viewed-card strong {
+ display: block;
+ font-size: 0.95rem;
+}
+.recently-viewed-country {
+ color: var(--text-muted);
+ font-weight: 500;
+}
+.recently-viewed-card p {
+ margin: 0.15rem 0 0;
+ font-size: 0.78rem;
+ color: var(--text-muted);
+}
+.recently-viewed-compare {
+ margin-top: 1rem;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ align-items: center;
+}
+
+.ai-history {
+ margin-top: 2rem;
+}
+.ai-history-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+.ai-history-head h2 {
+ margin: 0;
+ font-size: 1.1rem;
+}
+.ai-history-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+.ai-history-item {
+ width: 100%;
+ text-align: left;
+ padding: 0.85rem 1rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: inherit;
+ cursor: pointer;
+ transition: border-color 0.2s ease;
+}
+.ai-history-item:hover {
+ border-color: color-mix(in srgb, var(--accent) 35%, transparent);
+}
+.ai-history-item strong {
+ display: block;
+ margin-bottom: 0.25rem;
+}
+.ai-history-item span {
+ font-size: 0.82rem;
+ color: var(--text-muted);
+}
+
+.profile-rsvps {
+ margin-top: 2rem;
+}
+.profile-rsvp-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.65rem;
+}
+.profile-rsvp-card {
+ display: flex;
+ align-items: center;
+ gap: 0.85rem;
+ padding: 0.85rem 1rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+}
+.profile-rsvp-card span {
+ font-size: 1.5rem;
+}
+.profile-rsvp-card strong {
+ display: block;
+}
+.profile-rsvp-card p {
+ margin: 0.15rem 0 0;
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+.profile-rsvp-card .btn {
+ margin-left: auto;
+}
+
+.profile-rsvp-actions {
+ margin-left: auto;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.4rem;
+ justify-content: flex-end;
+}
+
+.profile-rsvp-actions .btn {
+ margin-left: 0;
+}
+
+.compare-history {
+ margin: 0 0 1.5rem;
+ padding: 1rem 1.15rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+.compare-history-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+.compare-history-head h2 {
+ margin: 0;
+ font-size: 1rem;
+}
+.compare-history-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+.compare-history-chip {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ width: 100%;
+ text-align: left;
+ padding: 0.7rem 0.9rem;
+ background: transparent;
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: inherit;
+ cursor: pointer;
+}
+.compare-history-chip:hover {
+ border-color: color-mix(in srgb, var(--accent) 40%, transparent);
+}
+.compare-history-chip span {
+ font-size: 0.88rem;
+}
+.compare-history-chip strong {
+ font-size: 0.78rem;
+ color: var(--accent-3, #4ecdc4);
+ white-space: nowrap;
+}
+.search-recent-inline {
+ margin-bottom: 1rem;
+}
+.profile-section-actions {
+ display: flex;
+ gap: 0.5rem;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+/* ===== Digest + watch later ===== */
+.nomad-digest {
+ margin: 1.75rem 0;
+ padding: 1.25rem 1.35rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+.nomad-digest-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 1rem;
+ margin-bottom: 1rem;
+ flex-wrap: wrap;
+}
+.nomad-digest-head h2 {
+ margin: 0.2rem 0 0;
+ font-size: 1.2rem;
+}
+.nomad-digest-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
+ gap: 0.75rem;
+}
+.nomad-digest-card {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+ padding: 0.9rem 1rem;
+ background: color-mix(in srgb, var(--bg-body) 55%, transparent);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+ transition: transform 0.2s ease, border-color 0.2s ease;
+}
+.nomad-digest-card:hover {
+ transform: translateY(-2px);
+ border-color: color-mix(in srgb, var(--accent) 40%, transparent);
+}
+.nomad-digest-card strong {
+ font-size: 1.25rem;
+}
+.nomad-digest-card span {
+ font-size: 0.85rem;
+}
+.nomad-digest-card small {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.nomad-digest-recent {
+ margin-top: 1rem;
+}
+.nomad-digest-recent > span {
+ display: block;
+ margin-bottom: 0.5rem;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+}
+.nomad-digest-chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.45rem;
+}
+.nomad-digest.compact {
+ margin: 1rem 0 0.25rem;
+ padding: 1rem 1.15rem;
+}
+.nomad-digest.compact h2 {
+ font-size: 1.05rem;
+}
+.nomad-digest.compact .section-desc {
+ margin-bottom: 0;
+ font-size: 0.9rem;
+}
+
+.plan-stop-links {
+ margin: 0.35rem 0 0.55rem;
+}
+.plan-city-meetup {
+ font-size: 0.85rem;
+ color: var(--accent);
+ text-decoration: none;
+}
+.plan-city-meetup:hover {
+ text-decoration: underline;
+}
+
+.meetup-peers {
+ margin-top: 0.85rem;
+ padding-top: 0.75rem;
+ border-top: var(--border-glass);
+}
+.meetup-peers-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.5rem;
+ margin-bottom: 0.5rem;
+ font-size: 0.9rem;
+ color: var(--text-muted);
+}
+.meetup-peers-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 0.4rem;
+}
+.meetup-peers-list li {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.5rem;
+}
+.meetup-peers-list a {
+ text-decoration: none;
+ color: inherit;
+ display: flex;
+ flex-direction: column;
+ gap: 0.1rem;
+ min-width: 0;
+}
+.meetup-peers-list strong {
+ font-size: 0.92rem;
+}
+.meetup-peers-list span {
+ font-size: 0.78rem;
+ color: var(--text-muted);
+}
+
+.live-exit {
+ padding: 1.25rem 0 2rem;
+}
+
+.watch-later-panel {
+ margin-bottom: 1.5rem;
+ padding: 1rem 1.15rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+.watch-later-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+.watch-later-head h2 {
+ margin: 0;
+ font-size: 1.05rem;
+}
+.watch-later-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.45rem;
+}
+.watch-later-chip {
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ gap: 0.65rem;
+ align-items: center;
+ padding: 0.65rem 0.85rem;
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+}
+.watch-later-chip:hover {
+ border-color: color-mix(in srgb, var(--accent) 35%, transparent);
+}
+.watch-later-chip small {
+ color: var(--text-muted);
+ font-size: 0.75rem;
+}
+.video-card-wrap {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+.video-card-wrap > a {
+ text-decoration: none;
+ color: inherit;
+}
+.video-card-wrap > .btn {
+ align-self: flex-start;
+}
+
+.saved-gigs-panel {
+ margin-bottom: 1.5rem;
+ padding: 1rem 1.15rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+.saved-gigs-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+.saved-gigs-head h2 {
+ margin: 0;
+ font-size: 1.05rem;
+}
+.saved-gigs-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+}
+.saved-gig-chip {
+ display: flex;
+ flex-direction: column;
+ gap: 0.15rem;
+ padding: 0.55rem 0.8rem;
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+ max-width: 220px;
+}
+.saved-gig-chip:hover {
+ border-color: color-mix(in srgb, var(--accent) 35%, transparent);
+}
+.saved-gig-chip small {
+ color: var(--text-muted);
+ font-size: 0.75rem;
+}
+.gig-card-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 0.75rem;
+ margin-bottom: 0.5rem;
+}
+.gig-card-top h3 {
+ margin: 0;
+}
+
+.saved-jobs-panel {
+ margin-bottom: 1.5rem;
+ padding: 1rem 1.15rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+.saved-jobs-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+.saved-jobs-head h2 {
+ margin: 0;
+ font-size: 1.05rem;
+}
+.saved-jobs-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+}
+.saved-job-chip {
+ display: flex;
+ flex-direction: column;
+ gap: 0.15rem;
+ padding: 0.55rem 0.8rem;
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+ max-width: 240px;
+}
+.saved-job-chip:hover {
+ border-color: color-mix(in srgb, var(--accent) 35%, transparent);
+}
+.saved-job-chip small {
+ color: var(--text-muted);
+ font-size: 0.75rem;
+}
+.jobs-toolbar {
+ margin-bottom: 1.25rem;
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
diff --git a/redmini/release/styles.css b/redmini/release/styles.css
deleted file mode 100644
index 63e3d4c..0000000
--- a/redmini/release/styles.css
+++ /dev/null
@@ -1,277 +0,0 @@
-:root {
- --bg: #0b0a10;
- --bg2: #14121c;
- --card: rgba(255, 255, 255, 0.06);
- --card2: rgba(255, 255, 255, 0.09);
- --text: #f4f0ea;
- --muted: #9a94a8;
- --accent: #f0c674;
- --accent2: #7dd3c7;
- --danger: #f07178;
- --border: rgba(255, 255, 255, 0.1);
- --safe-b: env(safe-area-inset-bottom, 0px);
- --safe-t: env(safe-area-inset-top, 0px);
- --tab-h: 64px;
- --top-h: 56px;
-}
-
-*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
-html, body {
- height: 100%;
- background: var(--bg);
- color: var(--text);
- font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
- -webkit-font-smoothing: antialiased;
- -webkit-tap-highlight-color: transparent;
-}
-button, input, select, textarea { font: inherit; color: inherit; }
-button { border: 0; background: none; cursor: pointer; }
-.is-hidden { display: none !important; }
-
-#app {
- min-height: 100%;
- min-height: 100vh;
- padding-top: calc(var(--top-h) + var(--safe-t));
- padding-bottom: calc(var(--tab-h) + var(--safe-b) + 8px);
-}
-
-.top-chrome {
- position: fixed; top: 0; left: 0; right: 0; z-index: 40;
- height: calc(var(--top-h) + var(--safe-t));
- padding: var(--safe-t) 14px 0;
- display: flex; align-items: center; justify-content: space-between;
- background: rgba(11, 10, 16, 0.92);
- backdrop-filter: blur(14px);
- border-bottom: 1px solid var(--border);
-}
-.top-left { display: flex; align-items: center; gap: 8px; }
-.top-brand { font-weight: 700; font-size: 16px; letter-spacing: 0.4px; }
-.top-sub { font-size: 11px; color: var(--muted); margin-top: 1px; }
-.icon-btn {
- width: 34px; height: 34px; border-radius: 10px;
- background: var(--card); color: var(--text); font-size: 16px;
-}
-.chip {
- padding: 6px 10px; border-radius: 999px; font-size: 12px;
- background: rgba(240, 198, 116, 0.15); color: var(--accent);
- border: 1px solid rgba(240, 198, 116, 0.35);
-}
-
-.main { padding: 12px 14px 20px; max-width: 720px; margin: 0 auto; }
-
-.tabbar {
- position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
- height: calc(var(--tab-h) + var(--safe-b));
- padding: 6px 6px var(--safe-b);
- display: flex; background: rgba(16, 14, 24, 0.96);
- border-top: 1px solid var(--border);
- backdrop-filter: blur(14px);
-}
-.tab {
- flex: 1; display: flex; flex-direction: column; align-items: center; gap: 2px;
- color: var(--muted); font-size: 10px; padding: 6px 0;
-}
-.tab span { font-size: 18px; line-height: 1; }
-.tab.is-active { color: var(--accent); }
-
-.hero {
- position: relative; overflow: hidden; border-radius: 22px;
- padding: 22px 18px 20px;
- background:
- radial-gradient(500px 220px at 0% 0%, rgba(240, 198, 116, 0.22), transparent 55%),
- radial-gradient(420px 200px at 100% 0%, rgba(125, 211, 199, 0.16), transparent 50%),
- linear-gradient(165deg, #15121d, #0e0c14 70%);
- border: 1px solid var(--border);
- margin-bottom: 16px;
-}
-.hero-badge {
- display: inline-block; font-size: 11px; color: var(--accent2);
- background: rgba(125, 211, 199, 0.12); padding: 4px 8px; border-radius: 999px;
- margin-bottom: 10px;
-}
-.hero h1 { font-size: 28px; line-height: 1.2; font-weight: 760; margin-bottom: 8px; }
-.hero p { color: var(--muted); font-size: 13px; line-height: 1.55; }
-.hero-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
-.btn {
- display: inline-flex; align-items: center; justify-content: center;
- padding: 10px 14px; border-radius: 999px; font-size: 13px; font-weight: 600;
- background: var(--accent); color: #1a1520;
-}
-.btn.ghost {
- background: transparent; color: var(--text);
- border: 1px solid var(--border);
-}
-.btn.sm { padding: 7px 11px; font-size: 12px; }
-
-.section { margin: 18px 0 8px; }
-.section-head {
- display: flex; align-items: baseline; justify-content: space-between;
- margin-bottom: 10px;
-}
-.section-head h2 { font-size: 16px; font-weight: 700; }
-.section-head .more { font-size: 12px; color: var(--accent); }
-
-.stats {
- display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; margin: 14px 0;
-}
-.stat {
- background: var(--card); border: 1px solid var(--border); border-radius: 14px;
- padding: 10px 6px; text-align: center;
-}
-.stat b { display: block; color: var(--accent); font-size: 16px; }
-.stat span { display: block; margin-top: 3px; color: var(--muted); font-size: 10px; }
-
-.ring-grid, .card-grid { display: grid; gap: 10px; }
-.ring-grid { grid-template-columns: 1fr 1fr; }
-.ring-card, .card {
- background: var(--card); border: 1px solid var(--border); border-radius: 16px;
- padding: 14px; text-align: left;
-}
-.ring-card .emoji, .card .emoji { font-size: 22px; display: block; margin-bottom: 8px; }
-.ring-card strong, .card strong { display: block; font-size: 14px; margin-bottom: 4px; }
-.ring-card span, .card .desc, .meta {
- display: block; color: var(--muted); font-size: 12px; line-height: 1.45;
-}
-
-.list { display: flex; flex-direction: column; gap: 10px; }
-.list-item {
- display: flex; gap: 12px; align-items: flex-start;
- background: var(--card); border: 1px solid var(--border); border-radius: 16px;
- padding: 12px 14px; text-align: left; width: 100%;
-}
-.list-item .lead {
- width: 42px; height: 42px; border-radius: 12px; flex-shrink: 0;
- display: flex; align-items: center; justify-content: center;
- background: var(--card2); font-size: 22px;
-}
-.list-item .body { flex: 1; min-width: 0; }
-.list-item .title { font-size: 14px; font-weight: 650; }
-.list-item .meta { margin-top: 4px; }
-.fav-dot { color: var(--accent); font-size: 12px; margin-left: 6px; }
-
-.chips { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
-.chip-btn {
- padding: 7px 12px; border-radius: 999px; font-size: 12px;
- background: var(--card); border: 1px solid var(--border); color: var(--muted);
-}
-.chip-btn.is-on { color: #1a1520; background: var(--accent); border-color: var(--accent); }
-
-.detail-hero {
- border-radius: 20px; padding: 18px; margin-bottom: 14px;
- background: linear-gradient(160deg, rgba(240,198,116,.18), transparent 55%), var(--bg2);
- border: 1px solid var(--border);
-}
-.detail-hero .emoji { font-size: 36px; }
-.detail-hero h1 { font-size: 24px; margin: 8px 0 4px; }
-.kv {
- display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin: 12px 0;
-}
-.kv .cell {
- background: var(--card); border-radius: 14px; padding: 12px; border: 1px solid var(--border);
-}
-.kv .k { color: var(--muted); font-size: 11px; }
-.kv .v { display: block; margin-top: 4px; font-size: 16px; font-weight: 700; color: var(--accent); }
-
-.hl { display: flex; flex-wrap: wrap; gap: 8px; margin: 8px 0 14px; }
-.hl span {
- font-size: 12px; padding: 6px 10px; border-radius: 999px;
- background: rgba(125, 211, 199, 0.1); color: #b7efe6;
-}
-
-.article {
- background: var(--card); border: 1px solid var(--border); border-radius: 16px;
- padding: 16px; line-height: 1.7; font-size: 14px; color: #e8e2f4;
- white-space: pre-wrap;
-}
-.article h2, .article h3 { color: var(--text); margin: 14px 0 8px; font-size: 16px; }
-.article p { margin: 0 0 10px; }
-.article ul, .article ol { padding-left: 18px; margin-bottom: 10px; }
-.article li { margin: 4px 0; }
-.article table { width: 100%; border-collapse: collapse; font-size: 12px; margin: 10px 0; }
-.article th, .article td { border: 1px solid var(--border); padding: 6px 8px; text-align: left; }
-
-.form {
- background: var(--card); border: 1px solid var(--border); border-radius: 16px; padding: 14px;
-}
-.field { margin-bottom: 12px; }
-.field label { display: block; font-size: 12px; color: var(--muted); margin-bottom: 6px; }
-.field input, .field select, .field textarea {
- width: 100%; padding: 10px 12px; border-radius: 12px;
- background: rgba(0,0,0,.25); border: 1px solid var(--border);
-}
-.check-list { display: flex; flex-direction: column; gap: 8px; }
-.check-item {
- display: flex; align-items: center; gap: 10px;
- background: var(--card); border: 1px solid var(--border); border-radius: 14px;
- padding: 12px 14px; text-align: left; width: 100%;
-}
-.check-item.is-on { border-color: rgba(240,198,116,.5); background: rgba(240,198,116,.08); }
-.check-box {
- width: 20px; height: 20px; border-radius: 6px; border: 1.5px solid var(--muted);
- display: flex; align-items: center; justify-content: center; font-size: 12px;
-}
-.check-item.is-on .check-box { background: var(--accent); border-color: var(--accent); color: #1a1520; }
-
-.lifestyle {
- display: flex; gap: 8px; overflow-x: auto; padding-bottom: 4px; -webkit-overflow-scrolling: touch;
-}
-.life-card {
- min-width: 140px; flex-shrink: 0;
- background: var(--card); border: 1px solid var(--border); border-radius: 16px;
- padding: 12px; text-align: left;
-}
-.life-card.is-on { border-color: var(--accent); }
-.life-detail {
- margin-top: 10px; padding: 12px; border-radius: 14px;
- background: rgba(240,198,116,.08); color: #e8dfc8; font-size: 13px; line-height: 1.55;
-}
-
-.note {
- margin: 10px 0 14px; padding: 10px 12px; border-radius: 12px;
- background: rgba(240,198,116,.1); color: #e8d7a8; font-size: 12px; line-height: 1.5;
-}
-.empty { text-align: center; color: var(--muted); padding: 28px 10px; font-size: 13px; }
-
-.map-board {
- position: relative; height: 220px; border-radius: 18px; overflow: hidden;
- background:
- radial-gradient(circle at 20% 40%, rgba(125,211,199,.15), transparent 30%),
- radial-gradient(circle at 70% 35%, rgba(240,198,116,.12), transparent 28%),
- linear-gradient(180deg, #17141f, #0f0d15);
- border: 1px solid var(--border); margin-bottom: 12px;
-}
-.map-pin {
- position: absolute; transform: translate(-50%, -100%);
- font-size: 18px; filter: drop-shadow(0 2px 4px rgba(0,0,0,.5));
-}
-.map-pin span {
- display: block; margin-top: 2px; font-size: 9px; color: var(--text);
- background: rgba(0,0,0,.45); padding: 1px 4px; border-radius: 4px; white-space: nowrap;
-}
-
-.sheet { position: fixed; inset: 0; z-index: 60; }
-.sheet-mask { position: absolute; inset: 0; background: rgba(0,0,0,.55); }
-.sheet-panel {
- position: absolute; left: 0; right: 0; bottom: 0;
- max-height: 78%; overflow: auto;
- background: #16131e; border-radius: 20px 20px 0 0;
- padding: 10px 16px calc(20px + var(--safe-b));
- border-top: 1px solid var(--border);
-}
-.sheet-handle {
- width: 42px; height: 4px; border-radius: 99px; background: rgba(255,255,255,.2);
- margin: 4px auto 14px;
-}
-
-.compare-pick { display: flex; gap: 8px; margin-bottom: 10px; }
-.compare-pick select { flex: 1; padding: 10px; border-radius: 12px; background: rgba(0,0,0,.25); border: 1px solid var(--border); }
-.compare-table { width: 100%; border-collapse: collapse; font-size: 12px; }
-.compare-table th, .compare-table td { border-bottom: 1px solid var(--border); padding: 10px 6px; text-align: left; }
-.compare-table th { color: var(--muted); font-weight: 500; }
-
-.quote {
- background: var(--card); border-left: 3px solid var(--accent);
- border-radius: 0 14px 14px 0; padding: 12px 14px; margin-bottom: 10px;
-}
-.quote p { font-size: 13px; line-height: 1.55; }
-.quote .who { margin-top: 8px; color: var(--muted); font-size: 12px; }
diff --git a/redmini/scripts/assemble.py b/redmini/scripts/assemble.py
index 6ab24ea..020c456 100644
--- a/redmini/scripts/assemble.py
+++ b/redmini/scripts/assemble.py
@@ -1,6 +1,7 @@
#!/usr/bin/env python3
-"""Copy tool/ into release/ and embed src/data.js (no network)."""
+"""Copy tool/ + src/data.js into release/ for XHS zip (H5 mirror)."""
from __future__ import annotations
+
import shutil
from pathlib import Path
@@ -9,14 +10,30 @@ TOOL = ROOT / "tool"
SRC_DATA = ROOT / "src" / "data.js"
RELEASE = ROOT / "release"
+FILES = (
+ "index.html",
+ "app.js",
+ "nomadro.css",
+ "xhs-bridge.js",
+)
+
def main() -> int:
if RELEASE.exists():
shutil.rmtree(RELEASE)
RELEASE.mkdir(parents=True)
- for name in ("index.html", "styles.css", "app.js", "xhs-bridge.js"):
- shutil.copy2(TOOL / name, RELEASE / name)
+ for name in FILES:
+ src = TOOL / name
+ if not src.exists():
+ print(f"missing {src}")
+ return 1
+ shutil.copy2(src, RELEASE / name)
+ if not SRC_DATA.exists():
+ print(f"missing {SRC_DATA} — run: python scripts/build_data.py")
+ return 1
shutil.copy2(SRC_DATA, RELEASE / "data.js")
+ # keep a copy in tool/ for local preview
+ shutil.copy2(SRC_DATA, TOOL / "data.js")
print(f"assembled {RELEASE}")
return 0
diff --git a/redmini/scripts/build_data.py b/redmini/scripts/build_data.py
index 7f40da3..e46c1ae 100644
--- a/redmini/scripts/build_data.py
+++ b/redmini/scripts/build_data.py
@@ -34,13 +34,13 @@ def main() -> int:
"meetups": len(meetups),
"blog": len(m.BLOG_POSTS),
"faqs": len(m.FAQS),
+ "total_nomads": "35.6M",
+ "countries": 195,
+ "satisfaction": 87,
+ "avg_cost": sum(d["cost"] for d in m.DESTINATIONS) // max(1, len(m.DESTINATIONS)) // 100,
+ "active_today": 127,
},
- "ticker": [
- "🌏 全球数字游民正在路上",
- "📋 签证政策实时整理(离线快照)",
- "🎉 同城活动与社区讨论可先浏览",
- "🎓 游民学院免费课时可学",
- ],
+ "ticker": m.TICKER_MESSAGES,
"rings": {
"explore": [
{"id": "destinations", "emoji": "🌴", "title": "目的地", "desc": "发现下一座城市"},
diff --git a/redmini/scripts/sync_h5_css.py b/redmini/scripts/sync_h5_css.py
new file mode 100644
index 0000000..6a39a56
--- /dev/null
+++ b/redmini/scripts/sync_h5_css.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python3
+"""Sync frontend/src/app/globals.css -> redmini/tool/nomadro.css (Chrome 61 sanitize)."""
+from __future__ import annotations
+
+import re
+from pathlib import Path
+
+ROOT = Path(__file__).resolve().parents[2]
+SRC = ROOT / "frontend" / "src" / "app" / "globals.css"
+OUT = ROOT / "redmini" / "tool" / "nomadro.css"
+
+
+def unwrap_layers(text: str) -> str:
+ while True:
+ m = re.search(r"@layer\s+[\w-]+\s*\{", text)
+ if not m:
+ break
+ start = m.start()
+ i = m.end()
+ depth = 1
+ while i < len(text) and depth:
+ if text[i] == "{":
+ depth += 1
+ elif text[i] == "}":
+ depth -= 1
+ i += 1
+ text = text[:start] + text[m.end() : i - 1] + text[i:]
+ return text
+
+
+def main() -> int:
+ src = SRC.read_text(encoding="utf-8")
+ src = re.sub(
+ r"html:has\(\[data-ebook-root\]\)[^{]*\{(?:[^{}]|\{[^{}]*\})*\}",
+ "",
+ src,
+ )
+ src = re.sub(
+ r"html:has\(\[data-ebook-root\]\)\s+body\s*\{(?:[^{}]|\{[^{}]*\})*\}",
+ "",
+ src,
+ )
+ src = unwrap_layers(src)
+ src = src.replace("var(--font-outfit), ", "").replace(", var(--font-outfit)", "")
+ OUT.write_text(
+ "/* Mirror of frontend/src/app/globals.css — synced for XHS offline H5 */\n" + src,
+ encoding="utf-8",
+ )
+ print(f"wrote {OUT} ({OUT.stat().st_size} bytes) open={src.count('{')} close={src.count('}')}")
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/redmini/src/data.js b/redmini/src/data.js
index 1d0587b..3c841db 100644
--- a/redmini/src/data.js
+++ b/redmini/src/data.js
@@ -1 +1 @@
-window.NOMADRO_DATA = {"brand": "nomadro", "tagline": "用一行代码环游世界", "offlineNote": "小红书小程序无法联网。本包为官网内容离线镜像,收藏/计划仅保存在本机。完整互动请打开 nomadweb.nomadro.com", "site": "https://nomadweb.nomadro.com", "stats": {"destinations": 12, "visas": 12, "meetups": 12, "blog": 10, "faqs": 6}, "ticker": ["🌏 全球数字游民正在路上", "📋 签证政策实时整理(离线快照)", "🎉 同城活动与社区讨论可先浏览", "🎓 游民学院免费课时可学"], "rings": {"explore": [{"id": "destinations", "emoji": "🌴", "title": "目的地", "desc": "发现下一座城市"}, {"id": "visas", "emoji": "📋", "title": "签证指南", "desc": "远程友好签证"}, {"id": "matcher", "emoji": "🎯", "title": "智能匹配", "desc": "按预算气候排序"}, {"id": "compare", "emoji": "⚖️", "title": "城市对比", "desc": "并排看成本网速"}], "connect": [{"id": "meetups", "emoji": "🎉", "title": "游民活动", "desc": "同城与线上"}, {"id": "community", "emoji": "💬", "title": "社区讨论", "desc": "签证住宿经验"}, {"id": "voices", "emoji": "🗣️", "title": "游民心声", "desc": "真实旅居评价"}], "grow": [{"id": "digital", "emoji": "🎓", "title": "游民学院", "desc": "远程工作课程"}, {"id": "blog", "emoji": "📝", "title": "博客", "desc": "指南与攻略"}, {"id": "tools", "emoji": "🧰", "title": "工具箱", "desc": "费用估算等"}, {"id": "faq", "emoji": "❓", "title": "常见问题", "desc": "启动资金与保险"}]}, "lifestyle": [{"key": "morning", "emoji": "🌅", "title": "清晨", "body": "咖啡馆开机,时区对齐,列出今日三件交付。"}, {"key": "work", "emoji": "💻", "title": "深度工作", "body": "联合办公或家中安静角落,异步协作优先。"}, {"key": "explore", "emoji": "🚶", "title": "探索城市", "body": "傍晚散步、夜市与同城 meetup。"}, {"key": "collab", "emoji": "🤝", "title": "协作", "body": "和同行交换签证与住宿情报。"}, {"key": "social", "emoji": "🌙", "title": "社交", "body": "社区圆桌、兴趣局,或安静充电。"}], "planChecklist": [{"id": "visa", "label": "确认签证/停留天数"}, {"id": "flight", "label": "预订机票"}, {"id": "housing", "label": "首周短租/酒店"}, {"id": "sim", "label": "当地 SIM / eSIM"}, {"id": "cowork", "label": "踩点联合办公"}, {"id": "insurance", "label": "国际医疗保险"}, {"id": "budget", "label": "写下月预算"}, {"id": "meetup", "label": "报名一场同城活动"}], "destinations": [{"id": "1", "slug": "bali", "name": "巴厘岛", "country": "印尼", "emoji": "🏝️", "tag": "东南亚 · 热带天堂", "description": "乌布的数字游民社区闻名全球,稻田间的 Co-working Space 和瑜伽文化让这里成为游民圣地。", "region": "sea", "cost": 4500, "speed": 85, "temperature": 28, "rating": 9.2, "hue": 170, "nomads_count": "12,000+", "highlights": ["🏄 冲浪与海滩生活", "🧘 瑜伽冥想文化", "💰 东南亚性价比之王", "🌴 热带气候全年温暖"], "map_x": 720, "map_y": 310}, {"id": "2", "slug": "lisbon", "name": "里斯本", "country": "葡萄牙", "emoji": "🌊", "tag": "欧洲 · 海滨明珠", "description": "D7 签证友好,阳光海岸与悠久历史的完美融合,欧洲数字游民的首选基地。", "region": "europe", "cost": 9000, "speed": 120, "temperature": 22, "rating": 9.5, "hue": 220, "nomads_count": "8,500+", "highlights": ["📋 D7 签证门槛低", "☀️ 300天阳光", "🎵 Fado 音乐文化", "🚋 复古有轨电车"], "map_x": 430, "map_y": 195}, {"id": "3", "slug": "chiangmai", "name": "清迈", "country": "泰国", "emoji": "🏔️", "tag": "东南亚 · 文化古城", "description": "数字游民大本营,咖啡文化与夜市生活的天堂,全球性价比最高的游民城市。", "region": "sea", "cost": 3800, "speed": 95, "temperature": 30, "rating": 9.4, "hue": 45, "nomads_count": "15,000+", "highlights": ["☕ 咖啡馆文化浓厚", "🏮 夜市与寺庙", "💰 月生活费最低", "🤝 游民社区最活跃"], "map_x": 700, "map_y": 240}, {"id": "4", "slug": "mexico", "name": "墨西哥城", "country": "墨西哥", "emoji": "🌃", "tag": "拉美 · 活力之都", "description": "艺术、美食与科技交织,时区便利对接北美市场,拉美最具活力的游民城市。", "region": "latam", "cost": 6500, "speed": 75, "temperature": 18, "rating": 8.8, "hue": 300, "nomads_count": "5,200+", "highlights": ["🎨 街头艺术天堂", "🌮 世界美食之都", "🕐 北美时区友好", "💃 丰富夜生活"], "map_x": 220, "map_y": 240}, {"id": "5", "slug": "barcelona", "name": "巴塞罗那", "country": "西班牙", "emoji": "🏖️", "tag": "欧洲 · 地中海", "description": "高迪建筑与创业生态并存,Nomad Visa 政策领先,地中海生活的理想之选。", "region": "europe", "cost": 10500, "speed": 150, "temperature": 20, "rating": 9.1, "hue": 130, "nomads_count": "6,800+", "highlights": ["🏛️ 高迪建筑奇迹", "🏖️ 地中海海滩", "📋 Nomad Visa 便利", "🍷 美食与夜生活"], "map_x": 460, "map_y": 200}, {"id": "6", "slug": "tokyo", "name": "东京", "country": "日本", "emoji": "🗼", "tag": "亚洲 · 现代都市", "description": "极致效率与安全,适合追求高品质生活的远程工作者,亚洲科技之都。", "region": "asia", "cost": 12000, "speed": 200, "temperature": 15, "rating": 8.6, "hue": 10, "nomads_count": "4,100+", "highlights": ["🚄 极致公共交通", "🛡️ 全球最安全城市", "📶 网速亚洲第一", "🍣 美食文化巅峰"], "map_x": 820, "map_y": 210}, {"id": "7", "slug": "berlin", "name": "柏林", "country": "德国", "emoji": "🎨", "tag": "欧洲 · 创意之都", "description": "开放的创业与开源氛围,租金相对西欧友好,夜生活与艺术场景极具吸引力。", "region": "europe", "cost": 9800, "speed": 140, "temperature": 12, "rating": 8.9, "hue": 250, "nomads_count": "7,200+", "highlights": ["🎨 艺术与街头文化", "💻 创业生态活跃", "🚲 骑行友好", "🍺 社交场景丰富"], "map_x": 500, "map_y": 160}, {"id": "8", "slug": "dali", "name": "大理", "country": "中国", "emoji": "🏔️", "tag": "国内 · 慢生活", "description": "苍山洱海之间的内容创作者聚集地,生活节奏慢、社交松弛,适合深度创作与试住。", "region": "asia", "cost": 4200, "speed": 80, "temperature": 18, "rating": 8.7, "hue": 190, "nomads_count": "3,600+", "highlights": ["📷 内容创作友好", "🏞️ 自然风光", "🍵 咖啡馆密集", "🏡 合租成本低"], "map_x": 730, "map_y": 220}, {"id": "9", "slug": "seoul", "name": "首尔", "country": "韩国", "emoji": "🏙️", "tag": "亚洲 · 潮流都市", "description": "高速网络与深夜城市活力并存,适合对接东亚市场与产品迭代。", "region": "asia", "cost": 11000, "speed": 220, "temperature": 14, "rating": 8.5, "hue": 330, "nomads_count": "3,200+", "highlights": ["📶 全球顶尖网速", "🍜 美食与便利店文化", "🛍️ 潮流消费", "🚇 地铁覆盖极强"], "map_x": 800, "map_y": 200}, {"id": "10", "slug": "medellin", "name": "麦德林", "country": "哥伦比亚", "emoji": "🌺", "tag": "拉美 · 春城", "description": "四季如春、生活成本友好,英语游民社区成熟,适合北美时区远程工作。", "region": "latam", "cost": 5200, "speed": 90, "temperature": 23, "rating": 9.0, "hue": 140, "nomads_count": "6,400+", "highlights": ["🌤️ 四季如春", "💰 高性价比", "🕐 北美时区", "🤝 社区活动密集"], "map_x": 260, "map_y": 300}, {"id": "11", "slug": "dubai", "name": "迪拜", "country": "阿联酋", "emoji": "🏙️", "tag": "中东 · 枢纽都市", "description": "免税与签证便利吸引远程高收入人群,国际航班枢纽,适合中东/欧亚跳板。", "region": "asia", "cost": 14000, "speed": 180, "temperature": 32, "rating": 8.4, "hue": 40, "nomads_count": "4,800+", "highlights": ["🧾 税务友好", "✈️ 航线枢纽", "🏗️ 现代基础设施", "🌐 多元国际社区"], "map_x": 600, "map_y": 240}, {"id": "12", "slug": "tbilisi", "name": "第比利斯", "country": "格鲁吉亚", "emoji": "🍷", "tag": "欧亚 · 税务友好", "description": "1% 小企业税与远程友好签证,旧城氛围浓厚,东欧游民新基地。", "region": "europe", "cost": 4800, "speed": 70, "temperature": 16, "rating": 8.8, "hue": 15, "nomads_count": "5,100+", "highlights": ["🧾 1% 小企业税", "🏰 旧城与温泉", "🍷 葡萄酒文化", "💰 低生活成本"], "map_x": 560, "map_y": 190}], "visas": [{"id": "1", "country": "葡萄牙", "flag": "🇵🇹", "name": "葡萄牙 D7 签证", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "2年,可续签", "income_req": "€760/月", "approval_time": "3-6 个月", "extra": "🏥 可享欧盟医疗", "difficulty": 35, "difficulty_label": "简单"}, {"id": "2", "country": "西班牙", "flag": "🇪🇸", "name": "西班牙 Nomad Visa", "badge": "🔥 热门", "badge_type": "hot", "duration": "1年,可续3年", "income_req": "€2,160/月", "approval_time": "1-3 个月", "extra": "🌍 可申根区旅行", "difficulty": 45, "difficulty_label": "中等"}, {"id": "3", "country": "印尼", "flag": "🇮🇩", "name": "印尼 B211A 签证", "badge": "💰 低成本", "badge_type": "budget", "duration": "60天,可延期", "income_req": "约 ¥2,000", "approval_time": "5-10 天", "extra": "🏝️ 适合巴厘岛旅居", "difficulty": 25, "difficulty_label": "简单"}, {"id": "4", "country": "泰国", "flag": "🇹🇭", "name": "泰国 LTR 签证", "badge": "🆕 新政策", "badge_type": "new", "duration": "10年", "income_req": "$80,000/年", "approval_time": "1-2 个月", "extra": "✈️ 多次入境", "difficulty": 60, "difficulty_label": "中等"}, {"id": "5", "country": "墨西哥", "flag": "🇲🇽", "name": "墨西哥 Temporary Resident", "badge": "💰 低成本", "badge_type": "budget", "duration": "1-4年", "income_req": "$2,500/月", "approval_time": "2-4 周", "extra": "🌮 北美时区友好", "difficulty": 30, "difficulty_label": "简单"}, {"id": "6", "country": "爱沙尼亚", "flag": "🇪🇪", "name": "爱沙尼亚 DNV", "badge": "🚀 先锋", "badge_type": "pioneer", "duration": "1年", "income_req": "€3,504/月", "approval_time": "2-4 周", "extra": "💻 全球首个数字游民签证", "difficulty": 40, "difficulty_label": "中等"}, {"id": "7", "country": "格鲁吉亚", "flag": "🇬🇪", "name": "格鲁吉亚 Remotely from Georgia", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "1年", "income_req": "$2,000/月", "approval_time": "约 10 天", "extra": "🧾 可搭配小企业 1% 税", "difficulty": 28, "difficulty_label": "简单"}, {"id": "8", "country": "阿联酋", "flag": "🇦🇪", "name": "迪拜 Virtual Working Programme", "badge": "🔥 热门", "badge_type": "hot", "duration": "1年", "income_req": "$3,500/月", "approval_time": "2-4 周", "extra": "✈️ 中东航线枢纽", "difficulty": 42, "difficulty_label": "中等"}, {"id": "9", "country": "哥伦比亚", "flag": "🇨🇴", "name": "哥伦比亚 V Visa (Digital Nomad)", "badge": "💰 低成本", "badge_type": "budget", "duration": "最长 2 年", "income_req": "约 3× 最低工资", "approval_time": "2-6 周", "extra": "🌺 适合麦德林春城", "difficulty": 32, "difficulty_label": "简单"}, {"id": "10", "country": "韩国", "flag": "🇰🇷", "name": "韩国 Workation Visa (C-3-8)", "badge": "🆕 新政策", "badge_type": "new", "duration": "最长 2 年", "income_req": "约 $65,000/年", "approval_time": "1-2 个月", "extra": "🏙️ 对接首尔与济州", "difficulty": 55, "difficulty_label": "中等"}, {"id": "11", "country": "德国", "flag": "🇩🇪", "name": "德国 Freelance / Self-employment", "badge": "🚀 先锋", "badge_type": "pioneer", "duration": "1-3年", "income_req": "需商业计划与客户证明", "approval_time": "2-4 个月", "extra": "🎨 适合柏林自由职业", "difficulty": 65, "difficulty_label": "较难"}, {"id": "12", "country": "泰国", "flag": "🇹🇭", "name": "泰国 DTV 签证", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "最长 5 年(多次入境)", "income_req": "约 50 万泰铢存款证明", "approval_time": "2-6 周", "extra": "🤝 远程工作友好", "difficulty": 38, "difficulty_label": "中等"}], "faqs": [{"id": "1", "question": "💰 做数字游民需要多少启动资金?", "order": 1, "answer": "建议准备 3-6 个月的生活费作为缓冲。以东南亚为例,¥15,000-30,000 即可开始。包括机票、首月住宿、签证费用和应急资金。欧洲目的地建议准备 ¥50,000 以上。"}, {"id": "2", "question": "📶 如何确保远程工作的网络稳定?", "order": 2, "answer": "选择网络评分高的城市,入住前用 Speedtest 测试。备用方案:本地 SIM 卡热点、随身 WiFi 设备、附近 Co-working Space。推荐携带 USB 网卡和 VPN 作为双保险。"}, {"id": "3", "question": "🏥 旅居期间的保险怎么办?", "order": 3, "answer": "推荐 SafetyWing 或 World Nomads 等国际医疗保险,月费约 $40-80,覆盖全球(部分国家除外)。长期旅居者可考虑目的地国家的本地保险,费用更低、报销更方便。"}, {"id": "4", "question": "🧾 税务问题如何处理?", "order": 4, "answer": "税务居民身份取决于居住天数(通常 183 天规则)。建议咨询专业税务顾问,了解双重征税协定。很多游民选择税务友好的国家(如葡萄牙、格鲁吉亚)作为基地。"}, {"id": "5", "question": "👨👩👧 可以带娃一起做数字游民吗?", "order": 5, "answer": "完全可以!巴厘岛、清迈、里斯本都有成熟的数字游民家庭社区。关键是选择教育资源丰富、医疗条件好的目的地,以及保持稳定的工作节奏,给孩子规律的生活。"}, {"id": "6", "question": "🤝 如何快速融入当地游民社区?", "order": 6, "answer": "加入 Nomad List、Facebook 群组和本地 Meetup 活动。入住游民友好的 Co-living 空间,参加每周的 Coworking 社交日。大部分游民社区非常开放,主动打招呼就能结识朋友。"}], "testimonials": [{"id": "1", "avatar": "👩💻", "content": "在清迈住了 8 个月,月花费不到 4000 元,但生活质量比国内一线城市高太多了。每天早上骑摩托去咖啡馆,这种感觉无法形容。", "author": "小林", "role": "前端开发 · 清迈 🇹🇭", "rating": 5}, {"id": "2", "avatar": "👨🎨", "content": "里斯本的 D7 签证让我在欧洲有了基地。白天在 Alfama 区的共享办公空间工作,周末去 Sintra 徒步,完美平衡。", "author": "Marco", "role": "UI 设计师 · 里斯本 🇵🇹", "rating": 5}, {"id": "3", "avatar": "🧑💼", "content": "带着家人做数字游民听起来疯狂,但在巴厘岛乌布,孩子们上国际学校,我和妻子远程工作,这是我们做过最正确的决定。", "author": "张家", "role": "产品经理 · 巴厘岛 🇮🇩", "rating": 5}, {"id": "4", "avatar": "👩🎨", "content": "麦德林四季如春,英语社区很活跃。我用北美时区接单,下午还能去公园运动,效率反而更高。", "author": "Sofia", "role": "自由职业设计 · 麦德林 🇨🇴", "rating": 5}, {"id": "5", "avatar": "👨💻", "content": "第比利斯生活成本低,还能开本地公司走 1% 税。旧城咖啡馆写代码,周末去卡兹别吉徒步,节奏很舒服。", "author": "Devon", "role": "DevOps · 第比利斯 🇬🇪", "rating": 5}, {"id": "6", "avatar": "📷", "content": "大理适合慢创作。合租便宜、风景治愈,但要主动找同频伙伴,别只待在民宿里。", "author": "Lina", "role": "内容创作者 · 大理 🇨🇳", "rating": 4}, {"id": "7", "avatar": "🧑🚀", "content": "柏林创业氛围强,开源 meetup 特别多。冬天冷、德语门槛真实存在,但找到圈子后很值得。", "author": "Ken", "role": "数据分析 · 柏林 🇩🇪", "rating": 4}, {"id": "8", "avatar": "🏙️", "content": "迪拜当跳板很香:航班方便、签证路径清晰。夏天太热,建议把深度工作时间放在室内联合办公。", "author": "Omar", "role": "增长顾问 · 迪拜 🇦🇪", "rating": 4}], "tools": [{"id": "1", "emoji": "💼", "name": "远程协作", "description": "Slack · Notion · Figma · Zoom", "tags": ["团队", "设计", "沟通"], "category": "work"}, {"id": "2", "emoji": "✈️", "name": "旅行规划", "description": "Skyscanner · Nomad List · SafetyWing", "tags": ["机票", "签证", "保险"], "category": "travel"}, {"id": "3", "emoji": "💳", "name": "财务管理", "description": "Wise · Revolut · Xero · 多币种账户", "tags": ["汇款", "记账", "税务"], "category": "finance"}, {"id": "4", "emoji": "🤝", "name": "社群网络", "description": "Nomad List · Remote Year · 本地 Meetup", "tags": ["社交", "活动", "合租"], "category": "connect"}, {"id": "5", "emoji": "🏥", "name": "健康保障", "description": "SafetyWing · World Nomads · 运动 App", "tags": ["保险", "健身", "心理"], "category": "health"}, {"id": "6", "emoji": "📚", "name": "持续学习", "description": "Coursera · Duolingo · 当地语言班", "tags": ["技能", "语言", "文化"], "category": "learn"}], "blog": [{"id": "1", "slug": "chiangmai-guide-2026", "title": "清迈数字游民完全指南 2026", "excerpt": "从签证到住宿,从咖啡馆到 Co-working,一篇搞定清迈旅居。", "emoji": "🏔️", "author": "nomadro", "published_at": "2026-01-15", "read_time": 8, "tags": ["清迈", "指南", "东南亚"]}, {"id": "2", "slug": "portugal-d7-visa", "title": "葡萄牙 D7 签证申请全攻略", "excerpt": "手把手教你申请欧洲最受欢迎的远程工作签证。", "emoji": "🇵🇹", "author": "nomadro", "published_at": "2026-02-03", "read_time": 12, "tags": ["签证", "葡萄牙", "欧洲"]}, {"id": "3", "slug": "nomad-tax-basics", "title": "数字游民税务入门:你需要知道的 5 件事", "excerpt": "183 天规则、双重征税、税务居民身份——一文理清。", "emoji": "🧾", "author": "nomadro", "published_at": "2026-02-20", "read_time": 10, "tags": ["税务", "法律", "指南"]}, {"id": "4", "slug": "medellin-spring-city", "title": "麦德林春城试住 30 天笔记", "excerpt": "时区、安全区、联合办公与西语社区初体验。", "emoji": "🌺", "author": "Sofia", "published_at": "2026-03-05", "read_time": 9, "tags": ["麦德林", "拉美", "试住"]}, {"id": "5", "slug": "tbilisi-tax-base", "title": "第比利斯当税务基地靠谱吗?", "excerpt": "远程签证、小企业税与旧城生活成本实测。", "emoji": "🍷", "author": "Devon", "published_at": "2026-03-18", "read_time": 11, "tags": ["格鲁吉亚", "税务", "欧洲"]}, {"id": "6", "slug": "dali-slow-create", "title": "大理慢创作:合租、网速与社群", "excerpt": "国内游民城市怎么住得久又不散漫。", "emoji": "🏔️", "author": "Lina", "published_at": "2026-04-02", "read_time": 7, "tags": ["大理", "内容", "国内"]}, {"id": "7", "slug": "berlin-startup-nomad", "title": "柏林自由职业与开源社群指南", "excerpt": "签证路径、共享办公与每周活动清单。", "emoji": "🎨", "author": "Ken", "published_at": "2026-04-20", "read_time": 10, "tags": ["柏林", "创业", "开源"]}, {"id": "8", "slug": "dubai-hub-month", "title": "迪拜一个月跳板旅居怎么排期", "excerpt": "签证、炎热季节、航班中转与办公点选择。", "emoji": "🏙️", "author": "Omar", "published_at": "2026-05-01", "read_time": 8, "tags": ["迪拜", "中东", "枢纽"]}, {"id": "9", "slug": "seoul-workation", "title": "首尔 Workation:网速、便利与成本", "excerpt": "C-3-8 签证与江南区办公踩点。", "emoji": "🏙️", "author": "Yuki", "published_at": "2026-05-16", "read_time": 9, "tags": ["首尔", "韩国", "网速"]}, {"id": "10", "slug": "first-month-checklist", "title": "旅居第一月清单:从落地到稳定输出", "excerpt": "SIM、短租、联合办公、社群与预算五步走。", "emoji": "✅", "author": "nomadro", "published_at": "2026-06-01", "read_time": 6, "tags": ["清单", "新手", "落地"]}], "blogContent": {"chiangmai-guide-2026": "## 为什么选择清迈?\n\n清迈是公认的全球数字游民之都。低廉的生活成本、完善的 Co-working 生态、友善的本地人和丰富的文化活动,让它成为新手游民的最佳起点。\n\n## 签证方案\n\n- **旅游签**:落地签 15 天,或提前办旅游签 60 天\n- **DTV 签证**:2024 年推出的 Destination Thailand Visa,适合远程工作者\n- **学生签/精英签**:长期旅居的进阶选择\n\n## 住宿推荐\n\n| 区域 | 月租 | 特点 |\n|------|------|------|\n| Nimman | ¥2,500-4,000 | 咖啡馆、餐厅、年轻人多 |\n| Old City | ¥1,500-3,000 | 文化氛围浓,步行可达寺庙 |\n| Hang Dong | ¥2,000-3,500 | 安静,适合深度工作 |\n\n## 最佳 Co-working\n\n1. **Punspace** — Nimman 区经典,日票 ¥60\n2. **CAMP** — Maya 商场顶楼,免费(消费即可)\n3. **Hub53** — 安静专业,月票 ¥800\n\n## 月均预算\n\n- 住宿:¥2,500\n- 餐饮:¥1,200\n- 交通:¥300(租摩托)\n- Co-working:¥400\n- 其他:¥400\n- **合计:约 ¥3,800-4,500**\n\n## 实用 Tips\n\n☕ 推荐咖啡馆:Ristr8to(世界冠军)、Graph One Nimman\n🏍️ 租摩托月费约 ¥400,注意戴头盔\n📱 推荐 AIS 或 TrueMove 无限流量套餐\n🤝 每周四有 Nomad Meetup,关注 Facebook 群组", "portugal-d7-visa": "## D7 签证是什么?\n\n葡萄牙 D7 签证(Passive Income Visa)最初为退休者设计,但因收入要求低、审批相对简单,成为数字游民进入欧盟的最佳通道之一。\n\n## 申请条件\n\n- 月收入不低于 **€760**(葡萄牙最低工资)\n- 银行存款建议 **€9,120+**(12个月生活费)\n- 无犯罪记录\n- 葡萄牙本地银行账户\n- 健康保险\n\n## 申请流程\n\n1. **准备材料**(2-4 周)\n - 护照、照片、收入证明、银行流水\n - 葡萄牙税号(NIF)\n - 住宿证明(租房合同或酒店预订)\n\n2. **递交申请**\n - 在中国:葡萄牙驻华使馆\n - 或入境葡萄牙后转居留许可\n\n3. **等待审批**(3-6 个月)\n\n4. **登陆葡萄牙**\n - 领取居留卡\n - 登记住址\n\n## 费用预算\n\n- 签证费:约 €90\n- 律师费(可选):€500-1,500\n- NIF + 银行开户:€200-300\n- 首月生活费:€800-1,200\n\n## 里斯本生活成本\n\n- 一居室公寓:€800-1,200/月\n- Co-working:€150-250/月\n- 餐饮:€300-500/月\n- **月均总花费:€1,200-1,800**\n\n## 常见问题\n\n**Q: D7 可以工作吗?**\nA: 可以远程为海外雇主工作,但不能在葡萄牙本地公司就职。\n\n**Q: 5年后能拿护照吗?**\nA: 满足居住要求后可以申请永居或入籍。", "nomad-tax-basics": "## 1. 什么是税务居民?\n\n大多数国家用 **183 天规则** 判定税务居民:在一个自然年内居住超过 183 天,即成为该国税务居民,需在该国申报全球收入。\n\n## 2. 双重征税怎么办?\n\n如果两个国家都认为你是税务居民,查 **双边税收协定**(DTA)。中国已与 100+ 国家签署 DTA,可避免重复缴税。\n\n## 3. 数字游民常见税务策略\n\n| 策略 | 说明 | 适合人群 |\n|------|------|----------|\n| 零税务居民 | 不在任何国家住满 183 天 | 短期旅居者 |\n| 税务友好国 | 葡萄牙 NHR、格鲁吉亚 1% 税 | 长期旅居者 |\n| 原籍国申报 | 回国期间申报 | 兼职游民 |\n\n## 4. 中国税务居民注意\n\n- 中国公民默认是中国税务居民(全球征税)\n- 海外收入也需申报(可抵免境外已缴税)\n- 建议咨询专业税务师\n\n## 5. 实用建议\n\n1. 📋 记录每个国家的入境/出境日期\n2. 🧾 保留所有收入凭证和银行流水\n3. 🏦 使用 Wise 等工具便于跨境汇款记录\n4. 👨💼 收入超过一定金额建议聘请税务顾问\n5. 📱 推荐工具:Xero(记账)、TaxScouts(报税)", "medellin-spring-city": "## 为什么麦德林?\n\n四季如春、生活成本可控,且贴近北美时区,适合接美加客户。Laureles / El Poblado 是游民常见落脚区。\n\n## 30 天试住建议\n\n1. 前 7 天住短租,实测网速与噪音\n2. 办本地 SIM,备份热点\n3. 参加 2 场线下 meetup,验证社区匹配度\n4. 确定联合办公月票再签长租\n\n## 预算参考(月)\n\n- 住宿:¥2,000–3,500\n- 餐饮:¥1,200–1,800\n- 交通:¥300–500\n- 办公:¥400–800", "tbilisi-tax-base": "## 远程签证 + 小企业税\n\n格鲁吉亚对远程工作者友好,许多人会评估本地公司与 1% 税路径(需自行核实最新政策)。\n\n## 生活感受\n\n旧城与 Vake 区咖啡馆多,适合深度工作;冬季偏冷,夏天舒服。\n\n## 注意\n\n- 银行开户与本地手机号流程可能变动\n- 税务方案务必咨询持证顾问\n- 把「试住 30 天」和「税务落地」分开决策", "dali-slow-create": "## 适合谁\n\n内容创作者、独立开发者、想放慢节奏但仍保持产出的人。\n\n## 实操建议\n\n- 合租优先选稳定 WiFi 与独立工作桌\n- 用固定作息对抗「度假感」\n- 主动加入本地创作者局,避免社交孤岛\n\n## 成本\n\n月生活费常可控制在 ¥3,500–5,000,视合租与出行频率而定。", "berlin-startup-nomad": "## 柏林为什么吸引游民\n\n开源、设计、创业活动密度高,共享办公选择多。\n\n## 落地要点\n\n- 提前规划居留/自由职业路径\n- 冬天日照短,准备补光与室内运动\n- 德语不是必须,但能明显提升生活便利\n\n## 每周节奏\n\n2 天联合办公 + 1 场 meetup + 周末短途,比纯咖啡馆更稳。", "dubai-hub-month": "## 适合当跳板\n\n国际航班密集,签证路径相对清晰,适合中东/欧亚中转月。\n\n## 炎热季节\n\n夏季高温,深度工作尽量安排在空调联合办公;户外活动放早晚。\n\n## 预算\n\n整体偏高,建议按「枢纽月」而非「低成本旅居」来规划。", "seoul-workation": "## 网速与便利\n\n首尔网速与城市便利度极强,适合需要高频协作的产品/工程角色。\n\n## 成本与节奏\n\n住宿与餐饮成本接近一线城市;用便利店与共享办公控制变量。\n\n## 签证\n\n关注 Workation / 相关短期远程路径的最新材料要求。", "first-month-checklist": "## 落地五步\n\n1. **连接**:落地办 SIM,测公寓与办公点网速\n2. **住处**:先短租 7–14 天,再决定长租\n3. **办公**:固定 1 个主点 + 2 个备份咖啡馆\n4. **社群**:报名 1 场 meetup,加 1 个本地群\n5. **预算**:用第一周真实账单校准月预算\n\n## 输出稳定\n\n每天保护 4 小时深度工作,旅行探索放在下午后段。"}, "meetups": [{"id": "online-roundtable", "title": "远程工作节奏圆桌", "city": "线上", "destination_slug": "", "emoji": "🎙️", "date": "2026-09-12", "time": "20:00", "venue": "nomadro 线上活动厅", "description": "聊聊异步协作、时区管理和旅居城市选择。登录后可 RSVP,活动前会收到提醒。", "mode": "online", "access_level": "public", "rsvp_count": 38, "max_attendees": 80, "organizer": "nomadro 社区", "tags": ["远程", "协作", "新手友好"], "is_upcoming": true}, {"id": "chiangmai-cowork", "title": "清迈联合办公下午茶", "city": "清迈", "destination_slug": "chiangmai", "emoji": "☕", "date": "2026-09-18", "time": "15:00", "venue": "Nimman 区 Co-working", "description": "一起办公、分享签证经验和住宿踩坑。线下为主,也开放线上旁听链接。", "mode": "hybrid", "access_level": "public", "rsvp_count": 14, "max_attendees": 24, "organizer": "清迈游民小组", "tags": ["线下", "社交", "东南亚"], "is_upcoming": true}, {"id": "lisbon-sunset", "title": "里斯本日落漫步", "city": "里斯本", "destination_slug": "lisbon", "emoji": "🌅", "date": "2026-09-22", "time": "18:30", "venue": "Miradouro 观景点集合", "description": "工作一周后,和同城游民一起看日落、交换欧洲签证情报。", "mode": "offline", "access_level": "public", "rsvp_count": 9, "max_attendees": 16, "organizer": "Lisbon Nomads", "tags": ["欧洲", "户外", "社交"], "is_upcoming": true}, {"id": "bali-surf-morning", "title": "巴厘岛晨间冲浪 + 办公", "city": "巴厘岛", "destination_slug": "bali", "emoji": "🏄", "date": "2026-10-05", "time": "07:00", "venue": "Canggu Beach", "description": "早起冲浪,10 点回咖啡馆集中办公。适合想体验 Work-Life 平衡的游民。", "mode": "offline", "access_level": "public", "rsvp_count": 11, "max_attendees": 20, "organizer": "Bali Remote Crew", "tags": ["运动", "生活方式"], "is_upcoming": true}, {"id": "tokyo-tax-talk", "title": "日本税务与居留线上分享", "city": "线上", "destination_slug": "tokyo", "emoji": "🧾", "date": "2026-10-12", "time": "19:30", "venue": "线上直播", "description": "特邀长期旅居日本的游民分享税务申报、保险和银行开户经验(非法律建议)。", "mode": "online", "access_level": "members", "rsvp_count": 52, "max_attendees": 120, "organizer": "nomadro 社区", "tags": ["税务", "日本", "干货"], "is_upcoming": true}, {"id": "berlin-opensource", "title": "柏林开源与 DevOps 夜谈", "city": "柏林", "destination_slug": "berlin", "emoji": "🖥️", "date": "2026-09-28", "time": "19:00", "venue": "Kreuzberg Co-working", "description": "分享自托管、CI 与远程团队协作实践,会后可继续社交。", "mode": "hybrid", "access_level": "public", "rsvp_count": 22, "max_attendees": 40, "organizer": "Berlin Remote", "tags": ["开源", "技术", "欧洲"], "is_upcoming": true}, {"id": "dali-create-walk", "title": "大理洱海创作散步", "city": "大理", "destination_slug": "dali", "emoji": "📷", "date": "2026-10-02", "time": "16:00", "venue": "才村码头集合", "description": "边走边拍,分享内容选题与变现路径,适合创作者与慢旅居者。", "mode": "offline", "access_level": "public", "rsvp_count": 8, "max_attendees": 18, "organizer": "大理创作者局", "tags": ["内容", "户外", "国内"], "is_upcoming": true}, {"id": "medellin-spanish", "title": "麦德林西语咖啡局", "city": "麦德林", "destination_slug": "medellin", "emoji": "☕", "date": "2026-10-08", "time": "10:30", "venue": "Laureles 咖啡馆", "description": "初级西语练习 + 安全区与租房情报交换,新手友好。", "mode": "offline", "access_level": "public", "rsvp_count": 16, "max_attendees": 20, "organizer": "Medellín Nomads", "tags": ["语言", "拉美", "社交"], "is_upcoming": true}, {"id": "seoul-night-office", "title": "首尔深夜联合办公", "city": "首尔", "destination_slug": "seoul", "emoji": "🌃", "date": "2026-10-15", "time": "21:00", "venue": "江南共享办公", "description": "适合东亚时区冲刺交付的游民,自带电脑即可。", "mode": "offline", "access_level": "public", "rsvp_count": 12, "max_attendees": 25, "organizer": "Seoul Workation", "tags": ["办公", "韩国", "效率"], "is_upcoming": true}, {"id": "dubai-hub-brunch", "title": "迪拜枢纽早午餐", "city": "迪拜", "destination_slug": "dubai", "emoji": "🥂", "date": "2026-10-18", "time": "11:00", "venue": "Downtown 咖啡厅", "description": "中转游民见面:签证、航班与下一站城市选择。", "mode": "offline", "access_level": "public", "rsvp_count": 10, "max_attendees": 16, "organizer": "Dubai Hub Crew", "tags": ["中东", "社交", "跳板"], "is_upcoming": true}, {"id": "tbilisi-tax-cafe", "title": "第比利斯税务咖啡聊", "city": "第比利斯", "destination_slug": "tbilisi", "emoji": "🍷", "date": "2026-10-22", "time": "15:00", "venue": "Vake 区咖啡馆", "description": "交流远程签证与本地公司实务(非正式法律意见),会后可徒步旧城。", "mode": "offline", "access_level": "members", "rsvp_count": 19, "max_attendees": 22, "organizer": "Tbilisi Base", "tags": ["税务", "欧洲", "干货"], "is_upcoming": true}, {"id": "mexico-food-walk", "title": "墨西哥城街头美食漫步", "city": "墨西哥城", "destination_slug": "mexico", "emoji": "🌮", "date": "2026-10-26", "time": "17:30", "venue": "Roma Norte 集合", "description": "边吃边聊北美时区接单与安全出行经验。", "mode": "offline", "access_level": "public", "rsvp_count": 13, "max_attendees": 18, "organizer": "CDMX Nomads", "tags": ["美食", "拉美", "社交"], "is_upcoming": true}], "discussions": [{"id": "visa-sea-2026", "title": "2026 东南亚长期停留签证怎么选?", "excerpt": "泰国 DTV、马来西亚 DE Rantau、印尼第二家园……大家最近实际办下来体验如何?", "author": "小林", "author_emoji": "🧳", "category": "签证", "reply_count": 23, "like_count": 47, "is_pinned": true, "created_at": "2026-08-20", "tags": ["签证", "东南亚"]}, {"id": "async-remote", "title": "异步团队怎么写日报才不烦人?", "excerpt": "我们团队跨 5 个时区,想收集团队节奏模板和工具推荐。", "author": "Marco", "author_emoji": "💻", "category": "远程工作", "reply_count": 15, "like_count": 31, "is_pinned": false, "created_at": "2026-08-22", "tags": ["远程", "协作"]}, {"id": "coliving-tips", "title": "第一次租 Coliving 必问房东的 10 个问题", "excerpt": "押金、网速、清洁、访客政策……欢迎补充你的踩坑经历。", "author": "阿静", "author_emoji": "🏡", "category": "住宿", "reply_count": 19, "like_count": 56, "is_pinned": false, "created_at": "2026-08-25", "tags": ["住宿", "经验"]}, {"id": "health-insurance", "title": "数字游民国际医疗保险对比", "excerpt": "SafetyWing、Genki、本地险……按年龄段和目的地聊聊性价比。", "author": "Yuki", "author_emoji": "🏥", "category": "安全", "reply_count": 11, "like_count": 28, "is_pinned": false, "created_at": "2026-08-27", "tags": ["保险", "安全"]}, {"id": "meetup-feedback", "title": "你希望 nomadro 线下活动开在哪些城市?", "excerpt": "我们在规划 Q4 活动路线,投票 + 留言告诉我们你的城市!", "author": "nomadro", "author_emoji": "🌍", "category": "社区", "reply_count": 34, "like_count": 72, "is_pinned": true, "created_at": "2026-08-28", "tags": ["活动", "投票"]}, {"id": "medellin-safety", "title": "麦德林哪些街区适合第一次长住?", "excerpt": "Laureles / Poblado / Envigado 的网速、噪音和夜间出行体验求分享。", "author": "Sofia", "author_emoji": "🌺", "category": "住宿", "reply_count": 17, "like_count": 41, "created_at": "2026-08-30", "tags": ["麦德林", "安全"]}, {"id": "tbilisi-bank", "title": "第比利斯开户与收美元的实操经验", "excerpt": "需要本地号码吗?Wise 能不能直接用?求最新流程。", "author": "Devon", "author_emoji": "🍷", "category": "财务", "reply_count": 14, "like_count": 36, "created_at": "2026-09-01", "tags": ["格鲁吉亚", "银行"]}, {"id": "berlin-winter", "title": "柏林冬天怎么保持产出和社交?", "excerpt": "日照短、天气冷,有没有室内运动 + meetup 推荐。", "author": "Ken", "author_emoji": "🎨", "category": "生活方式", "reply_count": 9, "like_count": 22, "created_at": "2026-09-02", "tags": ["柏林", "健康"]}, {"id": "dali-wifi", "title": "大理合租找房:网速坑位合集", "excerpt": "哪些区域光纤稳定?有没有房东靠谱名单。", "author": "Lina", "author_emoji": "📷", "category": "住宿", "reply_count": 21, "like_count": 48, "created_at": "2026-09-03", "tags": ["大理", "网速"]}, {"id": "dubai-summer", "title": "迪拜夏天还能正常远程办公吗?", "excerpt": "空调联合办公、作息调整和预算增加幅度求真实数据。", "author": "Omar", "author_emoji": "🏙️", "category": "生活方式", "reply_count": 8, "like_count": 19, "created_at": "2026-09-04", "tags": ["迪拜", "气候"]}, {"id": "seoul-visa", "title": "韩国 Workation 签证材料清单核对", "excerpt": "收入证明、保险、行程……有人最近过签吗?", "author": "Yuki", "author_emoji": "🇰🇷", "category": "签证", "reply_count": 12, "like_count": 33, "created_at": "2026-09-05", "tags": ["韩国", "签证"]}, {"id": "cowork-month-pass", "title": "各城市联合办公月票性价比对比", "excerpt": "清迈 / 里斯本 / 柏林 / 麦德林,欢迎贴价目与座位体验。", "author": "Alex", "author_emoji": "🚀", "category": "远程工作", "reply_count": 26, "like_count": 61, "created_at": "2026-09-06", "tags": ["办公", "成本"]}], "discussionDetails": {"visa-sea-2026": [{"id": "r1", "author": "阿Ken", "author_emoji": "🇹🇭", "content": "DTV 刚办下来,材料比想象中简单,关键是银行流水和远程工作证明。", "created_at": "2026-08-21", "like_count": 12}, {"id": "r2", "author": "Sara", "author_emoji": "🇲🇾", "content": "DE Rantau 审批大概 3 周,适合想待吉隆坡的。", "created_at": "2026-08-21", "like_count": 8}, {"id": "r3", "author": "Yuki", "author_emoji": "🇮🇩", "content": "巴厘岛短期用 B211A 足够,长期再看第二家园成本是否划算。", "created_at": "2026-08-22", "like_count": 6}], "async-remote": [{"id": "r1", "author": "Devon", "author_emoji": "🕐", "content": "我们用 Loom 录屏 + 简短文字摘要,比长日报友好很多。", "created_at": "2026-08-23", "like_count": 9}, {"id": "r2", "author": "Alex", "author_emoji": "🚀", "content": "模板三要素:昨天完成 / 今天计划 / 卡点,别写散文。", "created_at": "2026-08-23", "like_count": 11}], "coliving-tips": [{"id": "r1", "author": "小林", "author_emoji": "🧳", "content": "一定要问清押金退还条件和网速实测截图,别只看宣传。", "created_at": "2026-08-26", "like_count": 14}], "medellin-safety": [{"id": "r1", "author": "Alex", "author_emoji": "🌮", "content": "第一次建议 Laureles,生活成本与便利平衡;夜间少拿手机逛街。", "created_at": "2026-08-31", "like_count": 10}], "tbilisi-bank": [{"id": "r1", "author": "Omar", "author_emoji": "🏙️", "content": "先办本地 SIM 再去银行,材料准备护照+地址证明更顺利。", "created_at": "2026-09-01", "like_count": 7}], "dali-wifi": [{"id": "r1", "author": "阿静", "author_emoji": "🏡", "content": "才村/喜洲合租差别大,入住前用手机热点对照测速最靠谱。", "created_at": "2026-09-03", "like_count": 9}], "cowork-month-pass": [{"id": "r1", "author": "Marco", "author_emoji": "💻", "content": "里斯本月票大约 €150–250;清迈很多空间 ¥600–1000 就够用。", "created_at": "2026-09-06", "like_count": 15}], "health-insurance": [{"id": "r1", "author": "Sofia", "author_emoji": "🏥", "content": "30 岁以下 SafetyWing 够用;有慢性病建议加本地门诊险。", "created_at": "2026-08-28", "like_count": 10}, {"id": "r2", "author": "Ken", "author_emoji": "🇯🇵", "content": "在日本长期停留我叠了本地国民健康保险,报销更稳。", "created_at": "2026-08-28", "like_count": 7}], "meetup-feedback": [{"id": "r1", "author": "Lina", "author_emoji": "📷", "content": "大理 + 清迈希望能固定每月一场创作局。", "created_at": "2026-08-29", "like_count": 18}, {"id": "r2", "author": "Omar", "author_emoji": "🏙️", "content": "迪拜适合枢纽月见面,建议放周末早午餐。", "created_at": "2026-08-29", "like_count": 9}], "berlin-winter": [{"id": "r1", "author": "Devon", "author_emoji": "🖥️", "content": "冬天把联合办公当社交主场,再加一周一次室内攀岩/跑步局。", "created_at": "2026-09-02", "like_count": 11}], "dubai-summer": [{"id": "r1", "author": "Nina", "author_emoji": "🍷", "content": "夏天基本只在空调空间办公,预算里把交通和水电预留高一点。", "created_at": "2026-09-04", "like_count": 6}], "seoul-visa": [{"id": "r1", "author": "Jin", "author_emoji": "🇰🇷", "content": "最近材料重点是收入证明和保险;审批大约 3–6 周,建议提前办。", "created_at": "2026-09-05", "like_count": 8}]}, "course": [{"title": "启程:远程工作基础", "lessons": [{"title": "什么是数字游民", "duration": "8 分钟", "free": true}, {"title": "异步协作入门", "duration": "12 分钟", "free": true}, {"title": "时区与会议管理", "duration": "15 分钟", "free": false}]}, {"title": "签证与税务", "lessons": [{"title": "东南亚长期签证概览", "duration": "18 分钟", "free": false}, {"title": "183 天规则与税务居民", "duration": "14 分钟", "free": false}]}, {"title": "Homelab 与连接", "lessons": [{"title": "把家装进一个机柜", "duration": "20 分钟", "free": false}, {"title": "无论在哪都能连回家", "duration": "16 分钟", "free": false}]}], "lessons": {"0-0": {"title": "什么是数字游民", "moduleIndex": 0, "lessonIndex": 0, "duration": "8 分钟", "free": true, "content": "数字游民是一种工作方式:产出不绑定在某个地理坐标上。你可以在任何有网络的地方完成交付。"}, "0-1": {"title": "异步协作入门", "moduleIndex": 0, "lessonIndex": 1, "duration": "12 分钟", "free": true, "content": "异步沟通不是「随时在线」,而是「明确预期」:写清楚截止时间、交付物和决策人。"}, "0-2": {"title": "时区与会议管理", "moduleIndex": 0, "lessonIndex": 2, "duration": "15 分钟", "free": false, "content": "用 overlap 窗口安排会议,非重叠时段留给深度工作。工具箱里的「会议黄金时段」可以帮你算。"}, "1-0": {"title": "东南亚长期签证概览", "moduleIndex": 1, "lessonIndex": 0, "duration": "18 分钟", "free": false, "content": "泰国 DTV、马来西亚 DE Rantau、印尼第二家园……各国有不同的门槛与材料清单。"}, "1-1": {"title": "183 天规则与税务居民", "moduleIndex": 1, "lessonIndex": 1, "duration": "14 分钟", "free": false, "content": "多数国家用 183 天判定税务居民。用 nomadro 税居天数工具追踪停留。"}, "2-0": {"title": "把家装进一个机柜", "moduleIndex": 2, "lessonIndex": 0, "duration": "20 分钟", "free": false, "content": "Homelab 让你在旅途中拥有可控的 NAS、VPN 和开发环境。"}, "2-1": {"title": "无论在哪都能连回家", "moduleIndex": 2, "lessonIndex": 1, "duration": "16 分钟", "free": false, "content": "WireGuard + 动态 DNS,把家里的服务安全暴露给在外的你。"}}, "jobs": [{"id": "j1", "title": "Senior Frontend Engineer", "company": "Remote First Co", "location": "全球远程", "type": "全职", "salary": "$80k–120k", "tags": ["React", "TypeScript", "远程"], "url": "/gigs"}, {"id": "j2", "title": "DevOps / SRE", "company": "Nomad Labs", "location": "欧洲时区", "type": "合同", "salary": "€60–90/h", "tags": ["K8s", "AWS", "异步"], "url": "/gigs"}, {"id": "j3", "title": "内容运营(中文)", "company": "nomadro", "location": "东南亚友好", "type": "兼职", "salary": "面议", "tags": ["社区", "写作", "游民"], "url": "/gigs"}, {"id": "j4", "title": "Product Designer", "company": "Atlantic Remote", "location": "欧盟时区 ±3h", "type": "全职", "salary": "€55k–75k", "tags": ["Figma", "B2B", "远程"], "url": "/gigs"}, {"id": "j5", "title": "Growth Marketer", "company": "Hub Ventures", "location": "中东/欧洲友好", "type": "合同", "salary": "$4k–6k/月", "tags": ["SEO", "内容", "增长"], "url": "/gigs"}, {"id": "j6", "title": "Backend Engineer (Python)", "company": "Latam Cloud", "location": "北美时区", "type": "全职", "salary": "$90k–130k", "tags": ["Python", "FastAPI", "Postgres"], "url": "/gigs"}, {"id": "j7", "title": "Community Manager", "company": "nomadro", "location": "全球远程", "type": "兼职", "salary": "¥8k–12k/月", "tags": ["社区", "活动", "中英"], "url": "/gigs"}, {"id": "j8", "title": "Mobile Engineer (iOS/Android)", "company": "Seoul Soft", "location": "东亚时区", "type": "全职", "salary": "$70k–100k", "tags": ["Flutter", "移动端"], "url": "/gigs"}]};
+window.NOMADRO_DATA = {"brand": "nomadro", "tagline": "用一行代码环游世界", "offlineNote": "小红书小程序无法联网。本包为官网内容离线镜像,收藏/计划仅保存在本机。完整互动请打开 nomadweb.nomadro.com", "site": "https://nomadweb.nomadro.com", "stats": {"destinations": 12, "visas": 12, "meetups": 12, "blog": 10, "faqs": 6, "total_nomads": "35.6M", "countries": 195, "satisfaction": 87, "avg_cost": 79, "active_today": 127}, "ticker": ["🌴 小林 刚刚抵达清迈", "💻 Marco 在里斯本完成了 Sprint", "✈️ 今日新增 127 位游民出发", "🏝️ 巴厘岛 Co-working 今日 89% 满座", "📶 清迈平均网速 95Mbps", "🌅 东京远程工作者满意度 9.1", "🌺 Sofia 在麦德林办完本地 SIM", "🍷 Devon 把下一站设为第比利斯", "🎨 Ken 报名柏林开源 Meetup", "🏙️ Omar 从迪拜中转飞往里斯本", "📷 Lina 在大理发布本周创作日志", "🇰🇷 Yuki 实测首尔联合办公 220Mbps"], "rings": {"explore": [{"id": "destinations", "emoji": "🌴", "title": "目的地", "desc": "发现下一座城市"}, {"id": "visas", "emoji": "📋", "title": "签证指南", "desc": "远程友好签证"}, {"id": "matcher", "emoji": "🎯", "title": "智能匹配", "desc": "按预算气候排序"}, {"id": "compare", "emoji": "⚖️", "title": "城市对比", "desc": "并排看成本网速"}], "connect": [{"id": "meetups", "emoji": "🎉", "title": "游民活动", "desc": "同城与线上"}, {"id": "community", "emoji": "💬", "title": "社区讨论", "desc": "签证住宿经验"}, {"id": "voices", "emoji": "🗣️", "title": "游民心声", "desc": "真实旅居评价"}], "grow": [{"id": "digital", "emoji": "🎓", "title": "游民学院", "desc": "远程工作课程"}, {"id": "blog", "emoji": "📝", "title": "博客", "desc": "指南与攻略"}, {"id": "tools", "emoji": "🧰", "title": "工具箱", "desc": "费用估算等"}, {"id": "faq", "emoji": "❓", "title": "常见问题", "desc": "启动资金与保险"}]}, "lifestyle": [{"key": "morning", "emoji": "🌅", "title": "清晨", "body": "咖啡馆开机,时区对齐,列出今日三件交付。"}, {"key": "work", "emoji": "💻", "title": "深度工作", "body": "联合办公或家中安静角落,异步协作优先。"}, {"key": "explore", "emoji": "🚶", "title": "探索城市", "body": "傍晚散步、夜市与同城 meetup。"}, {"key": "collab", "emoji": "🤝", "title": "协作", "body": "和同行交换签证与住宿情报。"}, {"key": "social", "emoji": "🌙", "title": "社交", "body": "社区圆桌、兴趣局,或安静充电。"}], "planChecklist": [{"id": "visa", "label": "确认签证/停留天数"}, {"id": "flight", "label": "预订机票"}, {"id": "housing", "label": "首周短租/酒店"}, {"id": "sim", "label": "当地 SIM / eSIM"}, {"id": "cowork", "label": "踩点联合办公"}, {"id": "insurance", "label": "国际医疗保险"}, {"id": "budget", "label": "写下月预算"}, {"id": "meetup", "label": "报名一场同城活动"}], "destinations": [{"id": "1", "slug": "bali", "name": "巴厘岛", "country": "印尼", "emoji": "🏝️", "tag": "东南亚 · 热带天堂", "description": "乌布的数字游民社区闻名全球,稻田间的 Co-working Space 和瑜伽文化让这里成为游民圣地。", "region": "sea", "cost": 4500, "speed": 85, "temperature": 28, "rating": 9.2, "hue": 170, "nomads_count": "12,000+", "highlights": ["🏄 冲浪与海滩生活", "🧘 瑜伽冥想文化", "💰 东南亚性价比之王", "🌴 热带气候全年温暖"], "map_x": 720, "map_y": 310}, {"id": "2", "slug": "lisbon", "name": "里斯本", "country": "葡萄牙", "emoji": "🌊", "tag": "欧洲 · 海滨明珠", "description": "D7 签证友好,阳光海岸与悠久历史的完美融合,欧洲数字游民的首选基地。", "region": "europe", "cost": 9000, "speed": 120, "temperature": 22, "rating": 9.5, "hue": 220, "nomads_count": "8,500+", "highlights": ["📋 D7 签证门槛低", "☀️ 300天阳光", "🎵 Fado 音乐文化", "🚋 复古有轨电车"], "map_x": 430, "map_y": 195}, {"id": "3", "slug": "chiangmai", "name": "清迈", "country": "泰国", "emoji": "🏔️", "tag": "东南亚 · 文化古城", "description": "数字游民大本营,咖啡文化与夜市生活的天堂,全球性价比最高的游民城市。", "region": "sea", "cost": 3800, "speed": 95, "temperature": 30, "rating": 9.4, "hue": 45, "nomads_count": "15,000+", "highlights": ["☕ 咖啡馆文化浓厚", "🏮 夜市与寺庙", "💰 月生活费最低", "🤝 游民社区最活跃"], "map_x": 700, "map_y": 240}, {"id": "4", "slug": "mexico", "name": "墨西哥城", "country": "墨西哥", "emoji": "🌃", "tag": "拉美 · 活力之都", "description": "艺术、美食与科技交织,时区便利对接北美市场,拉美最具活力的游民城市。", "region": "latam", "cost": 6500, "speed": 75, "temperature": 18, "rating": 8.8, "hue": 300, "nomads_count": "5,200+", "highlights": ["🎨 街头艺术天堂", "🌮 世界美食之都", "🕐 北美时区友好", "💃 丰富夜生活"], "map_x": 220, "map_y": 240}, {"id": "5", "slug": "barcelona", "name": "巴塞罗那", "country": "西班牙", "emoji": "🏖️", "tag": "欧洲 · 地中海", "description": "高迪建筑与创业生态并存,Nomad Visa 政策领先,地中海生活的理想之选。", "region": "europe", "cost": 10500, "speed": 150, "temperature": 20, "rating": 9.1, "hue": 130, "nomads_count": "6,800+", "highlights": ["🏛️ 高迪建筑奇迹", "🏖️ 地中海海滩", "📋 Nomad Visa 便利", "🍷 美食与夜生活"], "map_x": 460, "map_y": 200}, {"id": "6", "slug": "tokyo", "name": "东京", "country": "日本", "emoji": "🗼", "tag": "亚洲 · 现代都市", "description": "极致效率与安全,适合追求高品质生活的远程工作者,亚洲科技之都。", "region": "asia", "cost": 12000, "speed": 200, "temperature": 15, "rating": 8.6, "hue": 10, "nomads_count": "4,100+", "highlights": ["🚄 极致公共交通", "🛡️ 全球最安全城市", "📶 网速亚洲第一", "🍣 美食文化巅峰"], "map_x": 820, "map_y": 210}, {"id": "7", "slug": "berlin", "name": "柏林", "country": "德国", "emoji": "🎨", "tag": "欧洲 · 创意之都", "description": "开放的创业与开源氛围,租金相对西欧友好,夜生活与艺术场景极具吸引力。", "region": "europe", "cost": 9800, "speed": 140, "temperature": 12, "rating": 8.9, "hue": 250, "nomads_count": "7,200+", "highlights": ["🎨 艺术与街头文化", "💻 创业生态活跃", "🚲 骑行友好", "🍺 社交场景丰富"], "map_x": 500, "map_y": 160}, {"id": "8", "slug": "dali", "name": "大理", "country": "中国", "emoji": "🏔️", "tag": "国内 · 慢生活", "description": "苍山洱海之间的内容创作者聚集地,生活节奏慢、社交松弛,适合深度创作与试住。", "region": "asia", "cost": 4200, "speed": 80, "temperature": 18, "rating": 8.7, "hue": 190, "nomads_count": "3,600+", "highlights": ["📷 内容创作友好", "🏞️ 自然风光", "🍵 咖啡馆密集", "🏡 合租成本低"], "map_x": 730, "map_y": 220}, {"id": "9", "slug": "seoul", "name": "首尔", "country": "韩国", "emoji": "🏙️", "tag": "亚洲 · 潮流都市", "description": "高速网络与深夜城市活力并存,适合对接东亚市场与产品迭代。", "region": "asia", "cost": 11000, "speed": 220, "temperature": 14, "rating": 8.5, "hue": 330, "nomads_count": "3,200+", "highlights": ["📶 全球顶尖网速", "🍜 美食与便利店文化", "🛍️ 潮流消费", "🚇 地铁覆盖极强"], "map_x": 800, "map_y": 200}, {"id": "10", "slug": "medellin", "name": "麦德林", "country": "哥伦比亚", "emoji": "🌺", "tag": "拉美 · 春城", "description": "四季如春、生活成本友好,英语游民社区成熟,适合北美时区远程工作。", "region": "latam", "cost": 5200, "speed": 90, "temperature": 23, "rating": 9.0, "hue": 140, "nomads_count": "6,400+", "highlights": ["🌤️ 四季如春", "💰 高性价比", "🕐 北美时区", "🤝 社区活动密集"], "map_x": 260, "map_y": 300}, {"id": "11", "slug": "dubai", "name": "迪拜", "country": "阿联酋", "emoji": "🏙️", "tag": "中东 · 枢纽都市", "description": "免税与签证便利吸引远程高收入人群,国际航班枢纽,适合中东/欧亚跳板。", "region": "asia", "cost": 14000, "speed": 180, "temperature": 32, "rating": 8.4, "hue": 40, "nomads_count": "4,800+", "highlights": ["🧾 税务友好", "✈️ 航线枢纽", "🏗️ 现代基础设施", "🌐 多元国际社区"], "map_x": 600, "map_y": 240}, {"id": "12", "slug": "tbilisi", "name": "第比利斯", "country": "格鲁吉亚", "emoji": "🍷", "tag": "欧亚 · 税务友好", "description": "1% 小企业税与远程友好签证,旧城氛围浓厚,东欧游民新基地。", "region": "europe", "cost": 4800, "speed": 70, "temperature": 16, "rating": 8.8, "hue": 15, "nomads_count": "5,100+", "highlights": ["🧾 1% 小企业税", "🏰 旧城与温泉", "🍷 葡萄酒文化", "💰 低生活成本"], "map_x": 560, "map_y": 190}], "visas": [{"id": "1", "country": "葡萄牙", "flag": "🇵🇹", "name": "葡萄牙 D7 签证", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "2年,可续签", "income_req": "€760/月", "approval_time": "3-6 个月", "extra": "🏥 可享欧盟医疗", "difficulty": 35, "difficulty_label": "简单"}, {"id": "2", "country": "西班牙", "flag": "🇪🇸", "name": "西班牙 Nomad Visa", "badge": "🔥 热门", "badge_type": "hot", "duration": "1年,可续3年", "income_req": "€2,160/月", "approval_time": "1-3 个月", "extra": "🌍 可申根区旅行", "difficulty": 45, "difficulty_label": "中等"}, {"id": "3", "country": "印尼", "flag": "🇮🇩", "name": "印尼 B211A 签证", "badge": "💰 低成本", "badge_type": "budget", "duration": "60天,可延期", "income_req": "约 ¥2,000", "approval_time": "5-10 天", "extra": "🏝️ 适合巴厘岛旅居", "difficulty": 25, "difficulty_label": "简单"}, {"id": "4", "country": "泰国", "flag": "🇹🇭", "name": "泰国 LTR 签证", "badge": "🆕 新政策", "badge_type": "new", "duration": "10年", "income_req": "$80,000/年", "approval_time": "1-2 个月", "extra": "✈️ 多次入境", "difficulty": 60, "difficulty_label": "中等"}, {"id": "5", "country": "墨西哥", "flag": "🇲🇽", "name": "墨西哥 Temporary Resident", "badge": "💰 低成本", "badge_type": "budget", "duration": "1-4年", "income_req": "$2,500/月", "approval_time": "2-4 周", "extra": "🌮 北美时区友好", "difficulty": 30, "difficulty_label": "简单"}, {"id": "6", "country": "爱沙尼亚", "flag": "🇪🇪", "name": "爱沙尼亚 DNV", "badge": "🚀 先锋", "badge_type": "pioneer", "duration": "1年", "income_req": "€3,504/月", "approval_time": "2-4 周", "extra": "💻 全球首个数字游民签证", "difficulty": 40, "difficulty_label": "中等"}, {"id": "7", "country": "格鲁吉亚", "flag": "🇬🇪", "name": "格鲁吉亚 Remotely from Georgia", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "1年", "income_req": "$2,000/月", "approval_time": "约 10 天", "extra": "🧾 可搭配小企业 1% 税", "difficulty": 28, "difficulty_label": "简单"}, {"id": "8", "country": "阿联酋", "flag": "🇦🇪", "name": "迪拜 Virtual Working Programme", "badge": "🔥 热门", "badge_type": "hot", "duration": "1年", "income_req": "$3,500/月", "approval_time": "2-4 周", "extra": "✈️ 中东航线枢纽", "difficulty": 42, "difficulty_label": "中等"}, {"id": "9", "country": "哥伦比亚", "flag": "🇨🇴", "name": "哥伦比亚 V Visa (Digital Nomad)", "badge": "💰 低成本", "badge_type": "budget", "duration": "最长 2 年", "income_req": "约 3× 最低工资", "approval_time": "2-6 周", "extra": "🌺 适合麦德林春城", "difficulty": 32, "difficulty_label": "简单"}, {"id": "10", "country": "韩国", "flag": "🇰🇷", "name": "韩国 Workation Visa (C-3-8)", "badge": "🆕 新政策", "badge_type": "new", "duration": "最长 2 年", "income_req": "约 $65,000/年", "approval_time": "1-2 个月", "extra": "🏙️ 对接首尔与济州", "difficulty": 55, "difficulty_label": "中等"}, {"id": "11", "country": "德国", "flag": "🇩🇪", "name": "德国 Freelance / Self-employment", "badge": "🚀 先锋", "badge_type": "pioneer", "duration": "1-3年", "income_req": "需商业计划与客户证明", "approval_time": "2-4 个月", "extra": "🎨 适合柏林自由职业", "difficulty": 65, "difficulty_label": "较难"}, {"id": "12", "country": "泰国", "flag": "🇹🇭", "name": "泰国 DTV 签证", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "最长 5 年(多次入境)", "income_req": "约 50 万泰铢存款证明", "approval_time": "2-6 周", "extra": "🤝 远程工作友好", "difficulty": 38, "difficulty_label": "中等"}], "faqs": [{"id": "1", "question": "💰 做数字游民需要多少启动资金?", "order": 1, "answer": "建议准备 3-6 个月的生活费作为缓冲。以东南亚为例,¥15,000-30,000 即可开始。包括机票、首月住宿、签证费用和应急资金。欧洲目的地建议准备 ¥50,000 以上。"}, {"id": "2", "question": "📶 如何确保远程工作的网络稳定?", "order": 2, "answer": "选择网络评分高的城市,入住前用 Speedtest 测试。备用方案:本地 SIM 卡热点、随身 WiFi 设备、附近 Co-working Space。推荐携带 USB 网卡和 VPN 作为双保险。"}, {"id": "3", "question": "🏥 旅居期间的保险怎么办?", "order": 3, "answer": "推荐 SafetyWing 或 World Nomads 等国际医疗保险,月费约 $40-80,覆盖全球(部分国家除外)。长期旅居者可考虑目的地国家的本地保险,费用更低、报销更方便。"}, {"id": "4", "question": "🧾 税务问题如何处理?", "order": 4, "answer": "税务居民身份取决于居住天数(通常 183 天规则)。建议咨询专业税务顾问,了解双重征税协定。很多游民选择税务友好的国家(如葡萄牙、格鲁吉亚)作为基地。"}, {"id": "5", "question": "👨👩👧 可以带娃一起做数字游民吗?", "order": 5, "answer": "完全可以!巴厘岛、清迈、里斯本都有成熟的数字游民家庭社区。关键是选择教育资源丰富、医疗条件好的目的地,以及保持稳定的工作节奏,给孩子规律的生活。"}, {"id": "6", "question": "🤝 如何快速融入当地游民社区?", "order": 6, "answer": "加入 Nomad List、Facebook 群组和本地 Meetup 活动。入住游民友好的 Co-living 空间,参加每周的 Coworking 社交日。大部分游民社区非常开放,主动打招呼就能结识朋友。"}], "testimonials": [{"id": "1", "avatar": "👩💻", "content": "在清迈住了 8 个月,月花费不到 4000 元,但生活质量比国内一线城市高太多了。每天早上骑摩托去咖啡馆,这种感觉无法形容。", "author": "小林", "role": "前端开发 · 清迈 🇹🇭", "rating": 5}, {"id": "2", "avatar": "👨🎨", "content": "里斯本的 D7 签证让我在欧洲有了基地。白天在 Alfama 区的共享办公空间工作,周末去 Sintra 徒步,完美平衡。", "author": "Marco", "role": "UI 设计师 · 里斯本 🇵🇹", "rating": 5}, {"id": "3", "avatar": "🧑💼", "content": "带着家人做数字游民听起来疯狂,但在巴厘岛乌布,孩子们上国际学校,我和妻子远程工作,这是我们做过最正确的决定。", "author": "张家", "role": "产品经理 · 巴厘岛 🇮🇩", "rating": 5}, {"id": "4", "avatar": "👩🎨", "content": "麦德林四季如春,英语社区很活跃。我用北美时区接单,下午还能去公园运动,效率反而更高。", "author": "Sofia", "role": "自由职业设计 · 麦德林 🇨🇴", "rating": 5}, {"id": "5", "avatar": "👨💻", "content": "第比利斯生活成本低,还能开本地公司走 1% 税。旧城咖啡馆写代码,周末去卡兹别吉徒步,节奏很舒服。", "author": "Devon", "role": "DevOps · 第比利斯 🇬🇪", "rating": 5}, {"id": "6", "avatar": "📷", "content": "大理适合慢创作。合租便宜、风景治愈,但要主动找同频伙伴,别只待在民宿里。", "author": "Lina", "role": "内容创作者 · 大理 🇨🇳", "rating": 4}, {"id": "7", "avatar": "🧑🚀", "content": "柏林创业氛围强,开源 meetup 特别多。冬天冷、德语门槛真实存在,但找到圈子后很值得。", "author": "Ken", "role": "数据分析 · 柏林 🇩🇪", "rating": 4}, {"id": "8", "avatar": "🏙️", "content": "迪拜当跳板很香:航班方便、签证路径清晰。夏天太热,建议把深度工作时间放在室内联合办公。", "author": "Omar", "role": "增长顾问 · 迪拜 🇦🇪", "rating": 4}], "tools": [{"id": "1", "emoji": "💼", "name": "远程协作", "description": "Slack · Notion · Figma · Zoom", "tags": ["团队", "设计", "沟通"], "category": "work"}, {"id": "2", "emoji": "✈️", "name": "旅行规划", "description": "Skyscanner · Nomad List · SafetyWing", "tags": ["机票", "签证", "保险"], "category": "travel"}, {"id": "3", "emoji": "💳", "name": "财务管理", "description": "Wise · Revolut · Xero · 多币种账户", "tags": ["汇款", "记账", "税务"], "category": "finance"}, {"id": "4", "emoji": "🤝", "name": "社群网络", "description": "Nomad List · Remote Year · 本地 Meetup", "tags": ["社交", "活动", "合租"], "category": "connect"}, {"id": "5", "emoji": "🏥", "name": "健康保障", "description": "SafetyWing · World Nomads · 运动 App", "tags": ["保险", "健身", "心理"], "category": "health"}, {"id": "6", "emoji": "📚", "name": "持续学习", "description": "Coursera · Duolingo · 当地语言班", "tags": ["技能", "语言", "文化"], "category": "learn"}], "blog": [{"id": "1", "slug": "chiangmai-guide-2026", "title": "清迈数字游民完全指南 2026", "excerpt": "从签证到住宿,从咖啡馆到 Co-working,一篇搞定清迈旅居。", "emoji": "🏔️", "author": "nomadro", "published_at": "2026-01-15", "read_time": 8, "tags": ["清迈", "指南", "东南亚"]}, {"id": "2", "slug": "portugal-d7-visa", "title": "葡萄牙 D7 签证申请全攻略", "excerpt": "手把手教你申请欧洲最受欢迎的远程工作签证。", "emoji": "🇵🇹", "author": "nomadro", "published_at": "2026-02-03", "read_time": 12, "tags": ["签证", "葡萄牙", "欧洲"]}, {"id": "3", "slug": "nomad-tax-basics", "title": "数字游民税务入门:你需要知道的 5 件事", "excerpt": "183 天规则、双重征税、税务居民身份——一文理清。", "emoji": "🧾", "author": "nomadro", "published_at": "2026-02-20", "read_time": 10, "tags": ["税务", "法律", "指南"]}, {"id": "4", "slug": "medellin-spring-city", "title": "麦德林春城试住 30 天笔记", "excerpt": "时区、安全区、联合办公与西语社区初体验。", "emoji": "🌺", "author": "Sofia", "published_at": "2026-03-05", "read_time": 9, "tags": ["麦德林", "拉美", "试住"]}, {"id": "5", "slug": "tbilisi-tax-base", "title": "第比利斯当税务基地靠谱吗?", "excerpt": "远程签证、小企业税与旧城生活成本实测。", "emoji": "🍷", "author": "Devon", "published_at": "2026-03-18", "read_time": 11, "tags": ["格鲁吉亚", "税务", "欧洲"]}, {"id": "6", "slug": "dali-slow-create", "title": "大理慢创作:合租、网速与社群", "excerpt": "国内游民城市怎么住得久又不散漫。", "emoji": "🏔️", "author": "Lina", "published_at": "2026-04-02", "read_time": 7, "tags": ["大理", "内容", "国内"]}, {"id": "7", "slug": "berlin-startup-nomad", "title": "柏林自由职业与开源社群指南", "excerpt": "签证路径、共享办公与每周活动清单。", "emoji": "🎨", "author": "Ken", "published_at": "2026-04-20", "read_time": 10, "tags": ["柏林", "创业", "开源"]}, {"id": "8", "slug": "dubai-hub-month", "title": "迪拜一个月跳板旅居怎么排期", "excerpt": "签证、炎热季节、航班中转与办公点选择。", "emoji": "🏙️", "author": "Omar", "published_at": "2026-05-01", "read_time": 8, "tags": ["迪拜", "中东", "枢纽"]}, {"id": "9", "slug": "seoul-workation", "title": "首尔 Workation:网速、便利与成本", "excerpt": "C-3-8 签证与江南区办公踩点。", "emoji": "🏙️", "author": "Yuki", "published_at": "2026-05-16", "read_time": 9, "tags": ["首尔", "韩国", "网速"]}, {"id": "10", "slug": "first-month-checklist", "title": "旅居第一月清单:从落地到稳定输出", "excerpt": "SIM、短租、联合办公、社群与预算五步走。", "emoji": "✅", "author": "nomadro", "published_at": "2026-06-01", "read_time": 6, "tags": ["清单", "新手", "落地"]}], "blogContent": {"chiangmai-guide-2026": "## 为什么选择清迈?\n\n清迈是公认的全球数字游民之都。低廉的生活成本、完善的 Co-working 生态、友善的本地人和丰富的文化活动,让它成为新手游民的最佳起点。\n\n## 签证方案\n\n- **旅游签**:落地签 15 天,或提前办旅游签 60 天\n- **DTV 签证**:2024 年推出的 Destination Thailand Visa,适合远程工作者\n- **学生签/精英签**:长期旅居的进阶选择\n\n## 住宿推荐\n\n| 区域 | 月租 | 特点 |\n|------|------|------|\n| Nimman | ¥2,500-4,000 | 咖啡馆、餐厅、年轻人多 |\n| Old City | ¥1,500-3,000 | 文化氛围浓,步行可达寺庙 |\n| Hang Dong | ¥2,000-3,500 | 安静,适合深度工作 |\n\n## 最佳 Co-working\n\n1. **Punspace** — Nimman 区经典,日票 ¥60\n2. **CAMP** — Maya 商场顶楼,免费(消费即可)\n3. **Hub53** — 安静专业,月票 ¥800\n\n## 月均预算\n\n- 住宿:¥2,500\n- 餐饮:¥1,200\n- 交通:¥300(租摩托)\n- Co-working:¥400\n- 其他:¥400\n- **合计:约 ¥3,800-4,500**\n\n## 实用 Tips\n\n☕ 推荐咖啡馆:Ristr8to(世界冠军)、Graph One Nimman\n🏍️ 租摩托月费约 ¥400,注意戴头盔\n📱 推荐 AIS 或 TrueMove 无限流量套餐\n🤝 每周四有 Nomad Meetup,关注 Facebook 群组", "portugal-d7-visa": "## D7 签证是什么?\n\n葡萄牙 D7 签证(Passive Income Visa)最初为退休者设计,但因收入要求低、审批相对简单,成为数字游民进入欧盟的最佳通道之一。\n\n## 申请条件\n\n- 月收入不低于 **€760**(葡萄牙最低工资)\n- 银行存款建议 **€9,120+**(12个月生活费)\n- 无犯罪记录\n- 葡萄牙本地银行账户\n- 健康保险\n\n## 申请流程\n\n1. **准备材料**(2-4 周)\n - 护照、照片、收入证明、银行流水\n - 葡萄牙税号(NIF)\n - 住宿证明(租房合同或酒店预订)\n\n2. **递交申请**\n - 在中国:葡萄牙驻华使馆\n - 或入境葡萄牙后转居留许可\n\n3. **等待审批**(3-6 个月)\n\n4. **登陆葡萄牙**\n - 领取居留卡\n - 登记住址\n\n## 费用预算\n\n- 签证费:约 €90\n- 律师费(可选):€500-1,500\n- NIF + 银行开户:€200-300\n- 首月生活费:€800-1,200\n\n## 里斯本生活成本\n\n- 一居室公寓:€800-1,200/月\n- Co-working:€150-250/月\n- 餐饮:€300-500/月\n- **月均总花费:€1,200-1,800**\n\n## 常见问题\n\n**Q: D7 可以工作吗?**\nA: 可以远程为海外雇主工作,但不能在葡萄牙本地公司就职。\n\n**Q: 5年后能拿护照吗?**\nA: 满足居住要求后可以申请永居或入籍。", "nomad-tax-basics": "## 1. 什么是税务居民?\n\n大多数国家用 **183 天规则** 判定税务居民:在一个自然年内居住超过 183 天,即成为该国税务居民,需在该国申报全球收入。\n\n## 2. 双重征税怎么办?\n\n如果两个国家都认为你是税务居民,查 **双边税收协定**(DTA)。中国已与 100+ 国家签署 DTA,可避免重复缴税。\n\n## 3. 数字游民常见税务策略\n\n| 策略 | 说明 | 适合人群 |\n|------|------|----------|\n| 零税务居民 | 不在任何国家住满 183 天 | 短期旅居者 |\n| 税务友好国 | 葡萄牙 NHR、格鲁吉亚 1% 税 | 长期旅居者 |\n| 原籍国申报 | 回国期间申报 | 兼职游民 |\n\n## 4. 中国税务居民注意\n\n- 中国公民默认是中国税务居民(全球征税)\n- 海外收入也需申报(可抵免境外已缴税)\n- 建议咨询专业税务师\n\n## 5. 实用建议\n\n1. 📋 记录每个国家的入境/出境日期\n2. 🧾 保留所有收入凭证和银行流水\n3. 🏦 使用 Wise 等工具便于跨境汇款记录\n4. 👨💼 收入超过一定金额建议聘请税务顾问\n5. 📱 推荐工具:Xero(记账)、TaxScouts(报税)", "medellin-spring-city": "## 为什么麦德林?\n\n四季如春、生活成本可控,且贴近北美时区,适合接美加客户。Laureles / El Poblado 是游民常见落脚区。\n\n## 30 天试住建议\n\n1. 前 7 天住短租,实测网速与噪音\n2. 办本地 SIM,备份热点\n3. 参加 2 场线下 meetup,验证社区匹配度\n4. 确定联合办公月票再签长租\n\n## 预算参考(月)\n\n- 住宿:¥2,000–3,500\n- 餐饮:¥1,200–1,800\n- 交通:¥300–500\n- 办公:¥400–800", "tbilisi-tax-base": "## 远程签证 + 小企业税\n\n格鲁吉亚对远程工作者友好,许多人会评估本地公司与 1% 税路径(需自行核实最新政策)。\n\n## 生活感受\n\n旧城与 Vake 区咖啡馆多,适合深度工作;冬季偏冷,夏天舒服。\n\n## 注意\n\n- 银行开户与本地手机号流程可能变动\n- 税务方案务必咨询持证顾问\n- 把「试住 30 天」和「税务落地」分开决策", "dali-slow-create": "## 适合谁\n\n内容创作者、独立开发者、想放慢节奏但仍保持产出的人。\n\n## 实操建议\n\n- 合租优先选稳定 WiFi 与独立工作桌\n- 用固定作息对抗「度假感」\n- 主动加入本地创作者局,避免社交孤岛\n\n## 成本\n\n月生活费常可控制在 ¥3,500–5,000,视合租与出行频率而定。", "berlin-startup-nomad": "## 柏林为什么吸引游民\n\n开源、设计、创业活动密度高,共享办公选择多。\n\n## 落地要点\n\n- 提前规划居留/自由职业路径\n- 冬天日照短,准备补光与室内运动\n- 德语不是必须,但能明显提升生活便利\n\n## 每周节奏\n\n2 天联合办公 + 1 场 meetup + 周末短途,比纯咖啡馆更稳。", "dubai-hub-month": "## 适合当跳板\n\n国际航班密集,签证路径相对清晰,适合中东/欧亚中转月。\n\n## 炎热季节\n\n夏季高温,深度工作尽量安排在空调联合办公;户外活动放早晚。\n\n## 预算\n\n整体偏高,建议按「枢纽月」而非「低成本旅居」来规划。", "seoul-workation": "## 网速与便利\n\n首尔网速与城市便利度极强,适合需要高频协作的产品/工程角色。\n\n## 成本与节奏\n\n住宿与餐饮成本接近一线城市;用便利店与共享办公控制变量。\n\n## 签证\n\n关注 Workation / 相关短期远程路径的最新材料要求。", "first-month-checklist": "## 落地五步\n\n1. **连接**:落地办 SIM,测公寓与办公点网速\n2. **住处**:先短租 7–14 天,再决定长租\n3. **办公**:固定 1 个主点 + 2 个备份咖啡馆\n4. **社群**:报名 1 场 meetup,加 1 个本地群\n5. **预算**:用第一周真实账单校准月预算\n\n## 输出稳定\n\n每天保护 4 小时深度工作,旅行探索放在下午后段。"}, "meetups": [{"id": "online-roundtable", "title": "远程工作节奏圆桌", "city": "线上", "destination_slug": "", "emoji": "🎙️", "date": "2026-09-12", "time": "20:00", "venue": "nomadro 线上活动厅", "description": "聊聊异步协作、时区管理和旅居城市选择。登录后可 RSVP,活动前会收到提醒。", "mode": "online", "access_level": "public", "rsvp_count": 38, "max_attendees": 80, "organizer": "nomadro 社区", "tags": ["远程", "协作", "新手友好"], "is_upcoming": true}, {"id": "chiangmai-cowork", "title": "清迈联合办公下午茶", "city": "清迈", "destination_slug": "chiangmai", "emoji": "☕", "date": "2026-09-18", "time": "15:00", "venue": "Nimman 区 Co-working", "description": "一起办公、分享签证经验和住宿踩坑。线下为主,也开放线上旁听链接。", "mode": "hybrid", "access_level": "public", "rsvp_count": 14, "max_attendees": 24, "organizer": "清迈游民小组", "tags": ["线下", "社交", "东南亚"], "is_upcoming": true}, {"id": "lisbon-sunset", "title": "里斯本日落漫步", "city": "里斯本", "destination_slug": "lisbon", "emoji": "🌅", "date": "2026-09-22", "time": "18:30", "venue": "Miradouro 观景点集合", "description": "工作一周后,和同城游民一起看日落、交换欧洲签证情报。", "mode": "offline", "access_level": "public", "rsvp_count": 9, "max_attendees": 16, "organizer": "Lisbon Nomads", "tags": ["欧洲", "户外", "社交"], "is_upcoming": true}, {"id": "bali-surf-morning", "title": "巴厘岛晨间冲浪 + 办公", "city": "巴厘岛", "destination_slug": "bali", "emoji": "🏄", "date": "2026-10-05", "time": "07:00", "venue": "Canggu Beach", "description": "早起冲浪,10 点回咖啡馆集中办公。适合想体验 Work-Life 平衡的游民。", "mode": "offline", "access_level": "public", "rsvp_count": 11, "max_attendees": 20, "organizer": "Bali Remote Crew", "tags": ["运动", "生活方式"], "is_upcoming": true}, {"id": "tokyo-tax-talk", "title": "日本税务与居留线上分享", "city": "线上", "destination_slug": "tokyo", "emoji": "🧾", "date": "2026-10-12", "time": "19:30", "venue": "线上直播", "description": "特邀长期旅居日本的游民分享税务申报、保险和银行开户经验(非法律建议)。", "mode": "online", "access_level": "members", "rsvp_count": 52, "max_attendees": 120, "organizer": "nomadro 社区", "tags": ["税务", "日本", "干货"], "is_upcoming": true}, {"id": "berlin-opensource", "title": "柏林开源与 DevOps 夜谈", "city": "柏林", "destination_slug": "berlin", "emoji": "🖥️", "date": "2026-09-28", "time": "19:00", "venue": "Kreuzberg Co-working", "description": "分享自托管、CI 与远程团队协作实践,会后可继续社交。", "mode": "hybrid", "access_level": "public", "rsvp_count": 22, "max_attendees": 40, "organizer": "Berlin Remote", "tags": ["开源", "技术", "欧洲"], "is_upcoming": true}, {"id": "dali-create-walk", "title": "大理洱海创作散步", "city": "大理", "destination_slug": "dali", "emoji": "📷", "date": "2026-10-02", "time": "16:00", "venue": "才村码头集合", "description": "边走边拍,分享内容选题与变现路径,适合创作者与慢旅居者。", "mode": "offline", "access_level": "public", "rsvp_count": 8, "max_attendees": 18, "organizer": "大理创作者局", "tags": ["内容", "户外", "国内"], "is_upcoming": true}, {"id": "medellin-spanish", "title": "麦德林西语咖啡局", "city": "麦德林", "destination_slug": "medellin", "emoji": "☕", "date": "2026-10-08", "time": "10:30", "venue": "Laureles 咖啡馆", "description": "初级西语练习 + 安全区与租房情报交换,新手友好。", "mode": "offline", "access_level": "public", "rsvp_count": 16, "max_attendees": 20, "organizer": "Medellín Nomads", "tags": ["语言", "拉美", "社交"], "is_upcoming": true}, {"id": "seoul-night-office", "title": "首尔深夜联合办公", "city": "首尔", "destination_slug": "seoul", "emoji": "🌃", "date": "2026-10-15", "time": "21:00", "venue": "江南共享办公", "description": "适合东亚时区冲刺交付的游民,自带电脑即可。", "mode": "offline", "access_level": "public", "rsvp_count": 12, "max_attendees": 25, "organizer": "Seoul Workation", "tags": ["办公", "韩国", "效率"], "is_upcoming": true}, {"id": "dubai-hub-brunch", "title": "迪拜枢纽早午餐", "city": "迪拜", "destination_slug": "dubai", "emoji": "🥂", "date": "2026-10-18", "time": "11:00", "venue": "Downtown 咖啡厅", "description": "中转游民见面:签证、航班与下一站城市选择。", "mode": "offline", "access_level": "public", "rsvp_count": 10, "max_attendees": 16, "organizer": "Dubai Hub Crew", "tags": ["中东", "社交", "跳板"], "is_upcoming": true}, {"id": "tbilisi-tax-cafe", "title": "第比利斯税务咖啡聊", "city": "第比利斯", "destination_slug": "tbilisi", "emoji": "🍷", "date": "2026-10-22", "time": "15:00", "venue": "Vake 区咖啡馆", "description": "交流远程签证与本地公司实务(非正式法律意见),会后可徒步旧城。", "mode": "offline", "access_level": "members", "rsvp_count": 19, "max_attendees": 22, "organizer": "Tbilisi Base", "tags": ["税务", "欧洲", "干货"], "is_upcoming": true}, {"id": "mexico-food-walk", "title": "墨西哥城街头美食漫步", "city": "墨西哥城", "destination_slug": "mexico", "emoji": "🌮", "date": "2026-10-26", "time": "17:30", "venue": "Roma Norte 集合", "description": "边吃边聊北美时区接单与安全出行经验。", "mode": "offline", "access_level": "public", "rsvp_count": 13, "max_attendees": 18, "organizer": "CDMX Nomads", "tags": ["美食", "拉美", "社交"], "is_upcoming": true}], "discussions": [{"id": "visa-sea-2026", "title": "2026 东南亚长期停留签证怎么选?", "excerpt": "泰国 DTV、马来西亚 DE Rantau、印尼第二家园……大家最近实际办下来体验如何?", "author": "小林", "author_emoji": "🧳", "category": "签证", "reply_count": 23, "like_count": 47, "is_pinned": true, "created_at": "2026-08-20", "tags": ["签证", "东南亚"]}, {"id": "async-remote", "title": "异步团队怎么写日报才不烦人?", "excerpt": "我们团队跨 5 个时区,想收集团队节奏模板和工具推荐。", "author": "Marco", "author_emoji": "💻", "category": "远程工作", "reply_count": 15, "like_count": 31, "is_pinned": false, "created_at": "2026-08-22", "tags": ["远程", "协作"]}, {"id": "coliving-tips", "title": "第一次租 Coliving 必问房东的 10 个问题", "excerpt": "押金、网速、清洁、访客政策……欢迎补充你的踩坑经历。", "author": "阿静", "author_emoji": "🏡", "category": "住宿", "reply_count": 19, "like_count": 56, "is_pinned": false, "created_at": "2026-08-25", "tags": ["住宿", "经验"]}, {"id": "health-insurance", "title": "数字游民国际医疗保险对比", "excerpt": "SafetyWing、Genki、本地险……按年龄段和目的地聊聊性价比。", "author": "Yuki", "author_emoji": "🏥", "category": "安全", "reply_count": 11, "like_count": 28, "is_pinned": false, "created_at": "2026-08-27", "tags": ["保险", "安全"]}, {"id": "meetup-feedback", "title": "你希望 nomadro 线下活动开在哪些城市?", "excerpt": "我们在规划 Q4 活动路线,投票 + 留言告诉我们你的城市!", "author": "nomadro", "author_emoji": "🌍", "category": "社区", "reply_count": 34, "like_count": 72, "is_pinned": true, "created_at": "2026-08-28", "tags": ["活动", "投票"]}, {"id": "medellin-safety", "title": "麦德林哪些街区适合第一次长住?", "excerpt": "Laureles / Poblado / Envigado 的网速、噪音和夜间出行体验求分享。", "author": "Sofia", "author_emoji": "🌺", "category": "住宿", "reply_count": 17, "like_count": 41, "created_at": "2026-08-30", "tags": ["麦德林", "安全"]}, {"id": "tbilisi-bank", "title": "第比利斯开户与收美元的实操经验", "excerpt": "需要本地号码吗?Wise 能不能直接用?求最新流程。", "author": "Devon", "author_emoji": "🍷", "category": "财务", "reply_count": 14, "like_count": 36, "created_at": "2026-09-01", "tags": ["格鲁吉亚", "银行"]}, {"id": "berlin-winter", "title": "柏林冬天怎么保持产出和社交?", "excerpt": "日照短、天气冷,有没有室内运动 + meetup 推荐。", "author": "Ken", "author_emoji": "🎨", "category": "生活方式", "reply_count": 9, "like_count": 22, "created_at": "2026-09-02", "tags": ["柏林", "健康"]}, {"id": "dali-wifi", "title": "大理合租找房:网速坑位合集", "excerpt": "哪些区域光纤稳定?有没有房东靠谱名单。", "author": "Lina", "author_emoji": "📷", "category": "住宿", "reply_count": 21, "like_count": 48, "created_at": "2026-09-03", "tags": ["大理", "网速"]}, {"id": "dubai-summer", "title": "迪拜夏天还能正常远程办公吗?", "excerpt": "空调联合办公、作息调整和预算增加幅度求真实数据。", "author": "Omar", "author_emoji": "🏙️", "category": "生活方式", "reply_count": 8, "like_count": 19, "created_at": "2026-09-04", "tags": ["迪拜", "气候"]}, {"id": "seoul-visa", "title": "韩国 Workation 签证材料清单核对", "excerpt": "收入证明、保险、行程……有人最近过签吗?", "author": "Yuki", "author_emoji": "🇰🇷", "category": "签证", "reply_count": 12, "like_count": 33, "created_at": "2026-09-05", "tags": ["韩国", "签证"]}, {"id": "cowork-month-pass", "title": "各城市联合办公月票性价比对比", "excerpt": "清迈 / 里斯本 / 柏林 / 麦德林,欢迎贴价目与座位体验。", "author": "Alex", "author_emoji": "🚀", "category": "远程工作", "reply_count": 26, "like_count": 61, "created_at": "2026-09-06", "tags": ["办公", "成本"]}], "discussionDetails": {}, "course": [{"title": "启程:远程工作基础", "lessons": [{"title": "什么是数字游民", "duration": "8 分钟", "free": true}, {"title": "异步协作入门", "duration": "12 分钟", "free": true}, {"title": "时区与会议管理", "duration": "15 分钟", "free": false}]}, {"title": "签证与税务", "lessons": [{"title": "东南亚长期签证概览", "duration": "18 分钟", "free": false}, {"title": "183 天规则与税务居民", "duration": "14 分钟", "free": false}]}, {"title": "Homelab 与连接", "lessons": [{"title": "把家装进一个机柜", "duration": "20 分钟", "free": false}, {"title": "无论在哪都能连回家", "duration": "16 分钟", "free": false}]}], "lessons": {"0-0": {"title": "什么是数字游民", "moduleIndex": 0, "lessonIndex": 0, "duration": "8 分钟", "free": true, "content": "数字游民是一种工作方式:产出不绑定在某个地理坐标上。你可以在任何有网络的地方完成交付。"}, "0-1": {"title": "异步协作入门", "moduleIndex": 0, "lessonIndex": 1, "duration": "12 分钟", "free": true, "content": "异步沟通不是「随时在线」,而是「明确预期」:写清楚截止时间、交付物和决策人。"}, "0-2": {"title": "时区与会议管理", "moduleIndex": 0, "lessonIndex": 2, "duration": "15 分钟", "free": false, "content": "用 overlap 窗口安排会议,非重叠时段留给深度工作。工具箱里的「会议黄金时段」可以帮你算。"}, "1-0": {"title": "东南亚长期签证概览", "moduleIndex": 1, "lessonIndex": 0, "duration": "18 分钟", "free": false, "content": "泰国 DTV、马来西亚 DE Rantau、印尼第二家园……各国有不同的门槛与材料清单。"}, "1-1": {"title": "183 天规则与税务居民", "moduleIndex": 1, "lessonIndex": 1, "duration": "14 分钟", "free": false, "content": "多数国家用 183 天判定税务居民。用 nomadro 税居天数工具追踪停留。"}, "2-0": {"title": "把家装进一个机柜", "moduleIndex": 2, "lessonIndex": 0, "duration": "20 分钟", "free": false, "content": "Homelab 让你在旅途中拥有可控的 NAS、VPN 和开发环境。"}, "2-1": {"title": "无论在哪都能连回家", "moduleIndex": 2, "lessonIndex": 1, "duration": "16 分钟", "free": false, "content": "WireGuard + 动态 DNS,把家里的服务安全暴露给在外的你。"}}, "jobs": [{"id": "j1", "title": "Senior Frontend Engineer", "company": "Remote First Co", "location": "全球远程", "type": "全职", "salary": "$80k–120k", "tags": ["React", "TypeScript", "远程"], "url": "/gigs"}, {"id": "j2", "title": "DevOps / SRE", "company": "Nomad Labs", "location": "欧洲时区", "type": "合同", "salary": "€60–90/h", "tags": ["K8s", "AWS", "异步"], "url": "/gigs"}, {"id": "j3", "title": "内容运营(中文)", "company": "nomadro", "location": "东南亚友好", "type": "兼职", "salary": "面议", "tags": ["社区", "写作", "游民"], "url": "/gigs"}, {"id": "j4", "title": "Product Designer", "company": "Atlantic Remote", "location": "欧盟时区 ±3h", "type": "全职", "salary": "€55k–75k", "tags": ["Figma", "B2B", "远程"], "url": "/gigs"}, {"id": "j5", "title": "Growth Marketer", "company": "Hub Ventures", "location": "中东/欧洲友好", "type": "合同", "salary": "$4k–6k/月", "tags": ["SEO", "内容", "增长"], "url": "/gigs"}, {"id": "j6", "title": "Backend Engineer (Python)", "company": "Latam Cloud", "location": "北美时区", "type": "全职", "salary": "$90k–130k", "tags": ["Python", "FastAPI", "Postgres"], "url": "/gigs"}, {"id": "j7", "title": "Community Manager", "company": "nomadro", "location": "全球远程", "type": "兼职", "salary": "¥8k–12k/月", "tags": ["社区", "活动", "中英"], "url": "/gigs"}, {"id": "j8", "title": "Mobile Engineer (iOS/Android)", "company": "Seoul Soft", "location": "东亚时区", "type": "全职", "salary": "$70k–100k", "tags": ["Flutter", "移动端"], "url": "/gigs"}]};
diff --git a/redmini/tool/app.js b/redmini/tool/app.js
index 0692e53..0e6d5a1 100644
--- a/redmini/tool/app.js
+++ b/redmini/tool/app.js
@@ -1,40 +1,22 @@
+/**
+ * nomadro XHS offline mirror
+ * Reuses the same CSS classes / visual structure as frontend H5 (localhost:3000).
+ * No network — data from window.NOMADRO_DATA.
+ */
(function () {
"use strict";
- var DATA = window.NOMADRO_DATA || {};
- var Bridge = window.XhsBridge || window.NomadroXhs || null;
+ var D = window.NOMADRO_DATA || {};
+ var Bridge = window.XhsBridge;
var FAV_KEY = "nomadro_xhs_favs";
- var PLAN_KEY = "nomadro_xhs_plan";
- var CHECK_KEY = "nomadro_xhs_checklist";
- var RECENT_KEY = "nomadro_xhs_recent";
-
- var state = {
- tab: "home",
- stack: [],
- favs: [],
- plan: [],
- checklist: {},
- recent: [],
- region: "all",
- lifeIdx: 0,
- compareA: "",
- compareB: "",
- matchBudget: 6000,
- matchClimate: "any",
- matchRegion: "all",
- };
-
- var main = document.getElementById("main");
- var topBrand = document.getElementById("top-brand");
- var topSub = document.getElementById("top-sub");
- var btnBack = document.getElementById("btn-back");
- var tabbar = document.getElementById("tabbar");
- var sheet = document.getElementById("sheet");
- var sheetBody = document.getElementById("sheet-body");
-
- function on(el, ev, fn) {
- if (el) el.addEventListener(ev, fn);
- }
+ var root = document.getElementById("app-root");
+ var backBtn = document.getElementById("xhs-back");
+ var route = { name: "home", params: {} };
+ var favs = [];
+ var destFilter = "all";
+ var destSort = "rating";
+ var destSearch = "";
+ var visaFilter = "all";
function esc(s) {
return String(s == null ? "" : s)
@@ -44,762 +26,861 @@
.replace(/"/g, """);
}
- function stars(n) {
- var s = "";
- var i;
- for (i = 0; i < 5; i++) s += i < Math.round(n || 0) ? "★" : "☆";
- return s;
+ function on(el, ev, fn) {
+ if (el) el.addEventListener(ev, fn);
}
- function storageGet(key, fallback) {
- if (Bridge && typeof Bridge.getLocalData === "function") {
- return Bridge.getLocalData(key).then(function (v) {
- return v == null ? fallback : v;
- });
+ function storageGet(key, fb) {
+ if (Bridge && Bridge.getLocalData) {
+ return Bridge.getLocalData(key).then(function (v) { return v == null ? fb : v; });
}
try {
var raw = localStorage.getItem(key);
- return Promise.resolve(raw ? JSON.parse(raw) : fallback);
+ return Promise.resolve(raw ? JSON.parse(raw) : fb);
} catch (e) {
- return Promise.resolve(fallback);
+ return Promise.resolve(fb);
}
}
function storageSet(key, val) {
- if (Bridge && typeof Bridge.setLocalData === "function") {
- return Bridge.setLocalData(key, val);
- }
- try {
- localStorage.setItem(key, JSON.stringify(val));
- return Promise.resolve(true);
- } catch (e) {
- return Promise.resolve(false);
- }
+ if (Bridge && Bridge.setLocalData) return Bridge.setLocalData(key, val);
+ try { localStorage.setItem(key, JSON.stringify(val)); } catch (e) {}
+ return Promise.resolve(true);
}
- function destBySlug(slug) {
- var list = DATA.destinations || [];
- var i;
- for (i = 0; i < list.length; i++) if (list[i].slug === slug) return list[i];
- return null;
- }
-
- function isFav(slug) {
- return state.favs.indexOf(slug) >= 0;
- }
-
- function toggleFav(slug) {
- var i = state.favs.indexOf(slug);
- if (i >= 0) state.favs.splice(i, 1);
- else state.favs.push(slug);
- storageSet(FAV_KEY, state.favs);
+ function go(name, params) {
+ route = { name: name, params: params || {} };
render();
- }
-
- function pushRecent(slug) {
- var next = [slug].concat(state.recent.filter(function (s) { return s !== slug; })).slice(0, 8);
- state.recent = next;
- storageSet(RECENT_KEY, next);
- }
-
- function setChrome(title, sub, showBack) {
- topBrand.textContent = title || "nomadro";
- topSub.textContent = sub || "离线镜像";
- if (showBack) btnBack.classList.remove("is-hidden");
- else btnBack.classList.add("is-hidden");
- }
-
- function goTab(tab) {
- state.tab = tab;
- state.stack = [];
- Array.prototype.forEach.call(tabbar.querySelectorAll(".tab"), function (btn) {
- btn.classList.toggle("is-active", btn.getAttribute("data-tab") === tab);
- });
- render();
- }
-
- function openView(view, params) {
- state.stack.push({ view: view, params: params || {} });
- render();
- }
-
- function goBack() {
- if (state.stack.length) {
- state.stack.pop();
- render();
- return;
- }
- goTab("home");
- }
-
- function currentRoute() {
- if (state.stack.length) return state.stack[state.stack.length - 1];
- return { view: state.tab, params: {} };
- }
-
- function openSheet(html) {
- sheetBody.innerHTML = html;
- sheet.classList.remove("is-hidden");
- }
-
- function closeSheet() {
- sheet.classList.add("is-hidden");
- sheetBody.innerHTML = "";
- }
-
- function mdLite(src) {
- var text = String(src || "");
- text = esc(text);
- text = text.replace(/^### (.*)$/gm, "
$1 ");
- text = text.replace(/^## (.*)$/gm, "
$1 ");
- text = text.replace(/\*\*(.+?)\*\*/g, "
$1 ");
- text = text.replace(/^- (.*)$/gm, "
$1 ");
- text = text.replace(/(
.*<\/li>\n?)+/g, function (m) {
- return "";
- });
- text = text.replace(/\n\n/g, "");
- return "
" + text + "
";
- }
-
- /* ---------- views ---------- */
-
- function viewHome() {
- setChrome("nomadro", "用一行代码环游世界", false);
- var stats = DATA.stats || {};
- var dests = (DATA.destinations || []).slice().sort(function (a, b) { return (b.rating || 0) - (a.rating || 0); }).slice(0, 4);
- var voices = (DATA.testimonials || []).slice(0, 3);
- var life = DATA.lifestyle || [];
- var lifeActive = life[state.lifeIdx] || life[0];
- var ticker = (DATA.ticker || []).join(" · ");
-
- return (
- '' +
- '🌏 全球数字游民正在路上
' +
- "用一行代码 环游世界 " +
- "" + esc(DATA.offlineNote || "") + "
" +
- '' +
- '从城市开始 ' +
- '🎯 智能匹配 ' +
- "
" +
- " " +
- (ticker ? '' + esc(ticker) + "
" : "") +
- '' +
- '
' + (stats.destinations || "—") + " 目的地
" +
- '
' + (stats.visas || "—") + " 签证
" +
- '
' + (stats.meetups || "—") + " 活动
" +
- '
' + (stats.blog || "—") + " 文章
" +
- "
" +
- '
⚡ 三环路径 ' +
- '
' +
- '🧭 探索 Explore 目的地 · 签证 · 匹配 ' +
- '🤝 连接 Connect 活动 · 社区 · 心声 ' +
- '🌱 成长 Grow 学院 · 博客 · 工具 ' +
- '🗓️ 旅居计划 离线清单与收藏 ' +
- "
" +
- '
🌴 热门目的地 全部 → ' +
- '
' + dests.map(destCard).join("") + "
" +
- '
🗓️ 游民一天 ' +
- '
' +
- life.map(function (item, idx) {
- return '' +
- '' + esc(item.emoji) + " " + esc(item.title) + " ";
- }).join("") +
- "
" +
- (lifeActive ? '
' + esc(lifeActive.body) + "
" : "") +
- "
" +
- '
🗣️ 游民心声 更多 → ' +
- voices.map(function (t) {
- return '
' + esc(t.avatar || "") + " " + esc(t.content) + '
' +
- esc(t.author) + " · " + esc(t.role) + " · " + stars(t.rating) + "
";
- }).join("") +
- "
"
- );
- }
-
- function destCard(d) {
- return (
- '' +
- '' + esc(d.emoji || "🌍") + "
" +
- '' + esc(d.name) +
- (isFav(d.slug) ? '★ ' : "") +
- '
' + esc(d.country) + " · ¥" + (d.cost || "—") + "/月 · ★" + (d.rating || "—") +
- '
' + esc(d.tag || d.tagline || "") + "
"
- );
- }
-
- function viewExploreHub() {
- setChrome("探索", "Discover where to go", false);
- var rings = (DATA.rings && DATA.rings.explore) || [];
- return (
- '探索环:发现去哪。离线可浏览目的地、签证,并做本地智能匹配。
' +
- '' +
- rings.map(function (r) {
- return '' +
- esc(r.emoji) + " " + esc(r.title) + " " + esc(r.desc) + " ";
- }).join("") +
- "
" +
- '
🗺️ 游民地图快照 ' + mapBoard() + "
"
- );
- }
-
- function mapBoard() {
- var list = DATA.destinations || [];
- var pins = list.map(function (d) {
- var left = Math.max(8, Math.min(92, ((d.map_x || 500) / 900) * 100));
- var top = Math.max(12, Math.min(88, ((d.map_y || 220) / 400) * 100));
- return '' + esc(d.emoji || "📍") + "" + esc(d.name) + " ";
- }).join("");
- return '' + pins + "
";
- }
-
- function viewDestinations() {
- setChrome("目的地", "Top nomad cities", true);
- var regions = [
- { id: "all", label: "全部" },
- { id: "sea", label: "东南亚" },
- { id: "europe", label: "欧洲" },
- { id: "asia", label: "东亚" },
- { id: "latam", label: "拉美" },
- ];
- var list = (DATA.destinations || []).filter(function (d) {
- return state.region === "all" || d.region === state.region;
- });
- return (
- '' +
- regions.map(function (r) {
- return '' + r.label + " ";
- }).join("") +
- "
" +
- '' + list.map(destCard).join("") + "
"
- );
- }
-
- function viewDestination(params) {
- var d = destBySlug(params.slug);
- if (!d) return '未找到城市
';
- pushRecent(d.slug);
- setChrome(d.name, d.country, true);
- var fav = isFav(d.slug);
- return (
- '' +
- '
' + esc(d.emoji || "🌍") + "
" +
- "
" + esc(d.name) + " " +
- '
' + esc(d.tag) + " · " + esc(d.nomads_count || "") + " 游民
" +
- "
" + esc(d.description) + "
" +
- '
' +
- '' + (fav ? "取消收藏" : "收藏城市") + " " +
- '加入计划 ' +
- "
" +
- "
" +
- '' +
- '
月生活费
¥' + (d.cost || "—") + " " +
- '
网速
' + (d.speed || "—") + " Mbps " +
- '
均温
' + (d.temperature || "—") + "°C " +
- '
评分
' + (d.rating || "—") + " " +
- "
" +
- '' + (d.highlights || []).map(function (h) { return "" + esc(h) + " "; }).join("") + "
" +
- '
接下来 ' +
- '' +
- '📋 签证指南 查远程友好签证 ' +
- '🎉 同城活动 先线下遇见 ' +
- "
"
- );
- }
-
- function viewVisas() {
- setChrome("签证指南", "Remote-friendly visas", true);
- return (
- '离线快照,政策可能变动。出发前请再核对官网。
' +
- '' +
- (DATA.visas || []).map(function (v) {
- return '
' + esc(v.flag || "🛂") + '
' +
- '
' + esc(v.name) + " · " + esc(v.badge) + "
" +
- '
' + esc(v.duration) + " · 收入 " + esc(v.income_req) + " · 审批 " + esc(v.approval_time) + "
" +
- '
' + esc(v.extra) + " · 难度 " + esc(v.difficulty_label) + "
" +
- "
";
- }).join("") +
- "
"
- );
- }
-
- function viewMatcher() {
- setChrome("智能匹配", "Find your city", true);
- var scored = scoreDestinations();
- return (
- '" +
- '
推荐结果 ' +
- scored.slice(0, 6).map(function (item) {
- var d = item.d;
- return '
' +
- '' + esc(d.emoji) + '
' + esc(d.name) +
- ' · 匹配 ' + item.score + '
¥' + d.cost + "/月 · " + d.speed + "Mbps · ★" + d.rating +
- "
";
- }).join("") +
- "
"
- );
- }
-
- function opt(v, label, cur) {
- return '" + label + " ";
- }
-
- function scoreDestinations() {
- var budget = Number(state.matchBudget) || 999999;
- return (DATA.destinations || []).map(function (d) {
- var score = 50;
- if (d.cost <= budget) score += 25;
- else score -= Math.min(30, (d.cost - budget) / 400);
- if (state.matchRegion !== "all" && d.region !== state.matchRegion) score -= 40;
- var t = d.temperature || 20;
- if (state.matchClimate === "warm" && t >= 24) score += 15;
- if (state.matchClimate === "mild" && t >= 16 && t < 24) score += 15;
- if (state.matchClimate === "cool" && t <= 16) score += 15;
- score += (d.rating || 0) * 3;
- score += Math.min(15, (d.speed || 0) / 15);
- return { d: d, score: Math.round(score) };
- }).sort(function (a, b) { return b.score - a.score; });
- }
-
- function viewCompare() {
- setChrome("城市对比", "Side by side", true);
- var list = DATA.destinations || [];
- if (!state.compareA && list[0]) state.compareA = list[0].slug;
- if (!state.compareB && list[1]) state.compareB = list[1].slug;
- var a = destBySlug(state.compareA) || list[0];
- var b = destBySlug(state.compareB) || list[1];
- var options = list.map(function (d) {
- return '' + esc(d.name) + " ";
- }).join("");
- return (
- '' +
- '' + options.replace('value="' + esc(a.slug) + '"', 'value="' + esc(a.slug) + '" selected') + " " +
- '' + options.replace('value="' + esc(b.slug) + '"', 'value="' + esc(b.slug) + '" selected') + " " +
- "
" +
- '' +
- row("城市", (a.emoji || "") + " " + a.name, (b.emoji || "") + " " + b.name) +
- row("国家", a.country, b.country) +
- row("月生活费", "¥" + a.cost, "¥" + b.cost) +
- row("网速", a.speed + " Mbps", b.speed + " Mbps") +
- row("均温", a.temperature + "°C", b.temperature + "°C") +
- row("评分", a.rating, b.rating) +
- row("游民规模", a.nomads_count, b.nomads_count) +
- "
"
- );
- }
-
- function row(k, a, b) {
- return "" + esc(k) + " " + esc(a) + " " + esc(b) + " ";
- }
-
- function viewConnectHub() {
- setChrome("连接", "Meet fellow nomads", false);
- var rings = (DATA.rings && DATA.rings.connect) || [];
- return (
- '连接环:遇见同行。离线可浏览活动与讨论;报名/发帖请到网页版。
' +
- '' +
- rings.map(function (r) {
- return '' +
- esc(r.emoji) + " " + esc(r.title) + " " + esc(r.desc) + " ";
- }).join("") +
- "
"
- );
- }
-
- function viewMeetups() {
- setChrome("游民活动", "Events snapshot", true);
- return (
- '' +
- (DATA.meetups || []).map(function (m) {
- return '
' + esc(m.emoji || "🎉") + '
' +
- '
' + esc(m.title) + "
" +
- '
' + esc(m.city) + " · " + esc(m.date) + " " + esc(m.time || "") + " · " +
- esc(m.venue || "") + "
" +
- '
' + esc(m.description || "") + "
" +
- '
' + (m.rsvp_count || 0) + "/" + (m.max_attendees || "—") + " · " +
- esc((m.tags || []).join(" · ")) + "
" +
- "
";
- }).join("") +
- "
"
- );
- }
-
- function viewCommunity() {
- setChrome("社区讨论", "Offline threads", true);
- return (
- '' +
- (DATA.discussions || []).map(function (d) {
- return '
' +
- '' + esc(d.author_emoji || "💬") + '
' +
- '
' + (d.is_pinned ? "📌 " : "") + esc(d.title) + "
" +
- '
' + esc(d.excerpt) + "
" +
- '
' + esc(d.author) + " · " + (d.reply_count || 0) + " 回复 · ♥ " + (d.like_count || 0) + "
" +
- "
";
- }).join("") +
- "
"
- );
- }
-
- function viewDiscussion(params) {
- var list = DATA.discussions || [];
- var d = null;
- var i;
- for (i = 0; i < list.length; i++) if (list[i].id === params.id) d = list[i];
- if (!d) return '讨论不存在
';
- setChrome("讨论", d.category || "community", true);
- var detail = (DATA.discussionDetails && DATA.discussionDetails[d.id]) || null;
- var replies = (detail && detail.replies) || [];
- return (
- '' +
- "
" + esc(d.title) + " " +
- '
' + esc(d.author) + " · " + esc(d.created_at || "") + "
" +
- "
" + esc(d.excerpt) + "
" +
- "
" +
- (replies.length
- ? '
回复 ' +
- replies.map(function (r) {
- return '
' + esc(r.content || r.body || "") + '
' +
- esc(r.author || "") + "
";
- }).join("") + "
"
- : '离线包仅含帖子摘要。完整回复请到网页版社区。
')
- );
- }
-
- function viewVoices() {
- setChrome("游民心声", "Real stories", true);
- return (DATA.testimonials || []).map(function (t) {
- return '' + esc(t.avatar || "") + " " + esc(t.content) + '
' +
- esc(t.author) + " · " + esc(t.role) + " · " + stars(t.rating) + "
";
- }).join("");
- }
-
- function viewGrowHub() {
- setChrome("成长", "Learn on the road", false);
- var rings = (DATA.rings && DATA.rings.grow) || [];
- return (
- '成长环:路上做事。学院、博客与工具均可离线浏览。
' +
- '' +
- rings.map(function (r) {
- return '' +
- esc(r.emoji) + " " + esc(r.title) + " " + esc(r.desc) + " ";
- }).join("") +
- "
"
- );
- }
-
- function viewDigital() {
- setChrome("游民学院", "Digital academy", true);
- var modules = DATA.course || [];
- return modules.map(function (mod, mi) {
- return '
' + esc(mod.title) + " " +
- (mod.lessons || []).map(function (les, li) {
- var key = mi + "-" + li;
- return '
' +
- '' + (les.free ? "🆓" : "🔒") + '
' +
- '
' + esc(les.title) + "
" +
- '
' + esc(les.duration) + (les.free ? " · 免费" : " · 网页版 VIP") + "
" +
- "
";
- }).join("") + "
";
- }).join("");
- }
-
- function viewLesson(params) {
- var lesson = (DATA.lessons || {})[params.key];
- if (!lesson) return '课程不存在
';
- setChrome(lesson.title, "Lesson", true);
- return (
- '' +
- "
" + esc(lesson.title) + " " +
- '
' + esc(lesson.duration) + (lesson.free ? " · 免费" : " · VIP 内容离线摘要") + "
" +
- "
" +
- '' + esc(lesson.content || "") + "
"
- );
- }
-
- function viewBlog() {
- setChrome("博客", "Guides & stories", true);
- return (
- '' +
- (DATA.blog || []).map(function (b) {
- return '
' +
- '' + esc(b.emoji || "📝") + '
' +
- '
' + esc(b.title) + "
" +
- '
' + esc(b.excerpt) + "
" +
- '
' + esc(b.author) + " · " + esc(b.published_at) + " · " + (b.read_time || "?") + " 分钟
" +
- "
";
- }).join("") +
- "
"
- );
- }
-
- function viewBlogDetail(params) {
- var list = DATA.blog || [];
- var b = null;
- var i;
- for (i = 0; i < list.length; i++) if (list[i].slug === params.slug) b = list[i];
- if (!b) return '文章不存在
';
- setChrome("博客", b.slug, true);
- var content = (DATA.blogContent && DATA.blogContent[b.slug]) || b.excerpt || "";
- return (
- '' +
- '
' + esc(b.emoji || "📝") + "
" +
- "
" + esc(b.title) + " " +
- '
' + esc(b.author) + " · " + esc(b.published_at) + " · " +
- (b.read_time || "?") + " 分钟 · " + esc((b.tags || []).join(" · ")) + "
" +
- "
" +
- '' + mdLite(content) + " "
- );
- }
-
- function viewTools() {
- setChrome("工具箱", "Offline utilities", true);
- return (
- '
实用工具 ' +
- '
' +
- '🧮 月费用估算 住宿+餐饮+交通 ' +
- '✅ 落地清单 第一月 checklist ' +
- "
" +
- '
推荐软件栈 ' +
- (DATA.tools || []).map(function (t) {
- return '
' + esc(t.emoji) + '
' +
- '
' + esc(t.name) + "
" +
- '
' + esc(t.description) + "
" +
- '
' + esc((t.tags || []).join(" · ")) + "
";
- }).join("") +
- "
"
- );
- }
-
- function viewCalc() {
- setChrome("月费用估算", "Cost calculator", true);
- return (
- '"
- );
- }
-
- function viewFaq() {
- setChrome("常见问题", "FAQ", true);
- return (DATA.faqs || []).map(function (f) {
- return '' + esc(f.question) + "
" +
- esc(f.answer) + "
";
- }).join("");
- }
-
- function viewPlan() {
- setChrome("旅居计划", "Offline plan", true);
- var checks = DATA.planChecklist || [];
- var planCities = state.plan.map(function (slug) {
- var d = destBySlug(slug);
- if (!d) return "";
- return destCard(d);
- }).join("");
- return (
- '计划与清单仅保存在本机(小红书 Storage / localStorage)。
' +
- '
计划中的城市 ' +
- (planCities || '
还没有城市,去目的地页点「加入计划」
') +
- "
" +
- '
落地清单 ' +
- checks.map(function (c) {
- var on = !!state.checklist[c.id];
- return '' +
- '' + (on ? "✓" : "") + " " + esc(c.label) + " ";
- }).join("") +
- "
"
- );
- }
-
- function viewMine() {
- setChrome("我的", "Favorites & plan", false);
- var favCards = state.favs.map(function (slug) {
- var d = destBySlug(slug);
- return d ? destCard(d) : "";
- }).join("");
- var recent = state.recent.map(function (slug) {
- var d = destBySlug(slug);
- return d ? destCard(d) : "";
- }).join("");
- return (
- '' + esc(DATA.offlineNote || "") + "
" +
- '' +
- '🗓️ 旅居计划 清单与城市 ' +
- '🎯 智能匹配 重算推荐 ' +
- "
" +
- '
我的收藏 ' +
- (favCards || '
暂无收藏
') + "
" +
- '
最近浏览 ' +
- (recent || '
还没有浏览记录
') + "
" +
- '
关于 ' +
- '
品牌 nomadro — 数字游民旅居平台离线镜像。
' +
- '
完整功能:' + esc(DATA.site || "https://nomadweb.nomadro.com") + "
"
- );
- }
-
- function render() {
- var route = currentRoute();
- var html = "";
- switch (route.view) {
- case "home": html = viewHome(); break;
- case "explore": html = viewExploreHub(); break;
- case "connect": html = viewConnectHub(); break;
- case "grow": html = viewGrowHub(); break;
- case "mine": html = viewMine(); break;
- case "destinations": html = viewDestinations(); break;
- case "destination": html = viewDestination(route.params); break;
- case "visas": html = viewVisas(); break;
- case "matcher": html = viewMatcher(); break;
- case "compare": html = viewCompare(); break;
- case "meetups": html = viewMeetups(); break;
- case "community": html = viewCommunity(); break;
- case "discussion": html = viewDiscussion(route.params); break;
- case "voices": html = viewVoices(); break;
- case "digital": html = viewDigital(); break;
- case "lesson": html = viewLesson(route.params); break;
- case "blog": html = viewBlog(); break;
- case "blog-detail": html = viewBlogDetail(route.params); break;
- case "tools": html = viewTools(); break;
- case "calc": html = viewCalc(); break;
- case "faq": html = viewFaq(); break;
- case "plan": html = viewPlan(); break;
- default: html = viewHome();
- }
- main.innerHTML = html;
- bindDynamic();
window.scrollTo(0, 0);
}
- function bindDynamic() {
- Array.prototype.forEach.call(main.querySelectorAll("[data-go]"), function (el) {
- on(el, "click", function () { goTab(el.getAttribute("data-go")); });
- });
- Array.prototype.forEach.call(main.querySelectorAll("[data-open]"), function (el) {
- on(el, "click", function () {
- var view = el.getAttribute("data-open");
- var params = {};
- if (el.getAttribute("data-slug")) params.slug = el.getAttribute("data-slug");
- if (el.getAttribute("data-id")) params.id = el.getAttribute("data-id");
- if (el.getAttribute("data-key")) params.key = el.getAttribute("data-key");
- openView(view, params);
- });
- });
- Array.prototype.forEach.call(main.querySelectorAll("[data-region]"), function (el) {
- on(el, "click", function () {
- state.region = el.getAttribute("data-region");
- render();
- });
- });
- Array.prototype.forEach.call(main.querySelectorAll("[data-life]"), function (el) {
- on(el, "click", function () {
- state.lifeIdx = Number(el.getAttribute("data-life")) || 0;
- render();
- });
- });
- Array.prototype.forEach.call(main.querySelectorAll("[data-fav]"), function (el) {
- on(el, "click", function () { toggleFav(el.getAttribute("data-fav")); });
- });
- Array.prototype.forEach.call(main.querySelectorAll("[data-plan-add]"), function (el) {
- on(el, "click", function () {
- var slug = el.getAttribute("data-plan-add");
- if (state.plan.indexOf(slug) < 0) state.plan.push(slug);
- storageSet(PLAN_KEY, state.plan);
- openSheet("已加入旅居计划。 可在「我的 → 旅居计划」查看。
" +
- '好的 ');
- on(document.getElementById("sheet-ok"), "click", closeSheet);
- });
- });
- Array.prototype.forEach.call(main.querySelectorAll("[data-check]"), function (el) {
- on(el, "click", function () {
- var id = el.getAttribute("data-check");
- state.checklist[id] = !state.checklist[id];
- storageSet(CHECK_KEY, state.checklist);
- render();
- });
- });
+ function destBySlug(slug) {
+ var list = D.destinations || [];
+ for (var i = 0; i < list.length; i++) if (list[i].slug === slug) return list[i];
+ return null;
+ }
- var mRun = document.getElementById("m-run");
- if (mRun) {
- on(mRun, "click", function () {
- var b = document.getElementById("m-budget");
- var c = document.getElementById("m-climate");
- var r = document.getElementById("m-region");
- state.matchBudget = Number(b && b.value) || 6000;
- state.matchClimate = (c && c.value) || "any";
- state.matchRegion = (r && r.value) || "all";
- render();
+ function isFav(slug) { return favs.indexOf(slug) >= 0; }
+
+ function toggleFav(slug) {
+ var i = favs.indexOf(slug);
+ if (i >= 0) favs.splice(i, 1); else favs.push(slug);
+ storageSet(FAV_KEY, favs);
+ render();
+ }
+
+ function logoSvg(id) {
+ return (
+ '' +
+ ' ' +
+ ' ' +
+ ' ' +
+ '' +
+ ' ' +
+ " "
+ );
+ }
+
+ /* ===== chrome shared with H5 ===== */
+
+ function renderNavbar() {
+ return (
+ '' +
+ '" +
+ " "
+ );
+ }
+
+ function renderTicker() {
+ var msgs = D.ticker || [];
+ if (!msgs.length) return "";
+ return (
+ '' +
+ msgs.concat(msgs).map(function (m) {
+ return '' + esc(m) + " ";
+ }).join("") +
+ "
"
+ );
+ }
+
+ function renderHero() {
+ var stats = D.stats || {};
+ return (
+ '' +
+ '' +
+ '' +
+ '
' +
+ '
' +
+ '
nomadro · ' +
+ esc(stats.total_nomads || "35.6M") + " 全球数字游民正在路上
" +
+ '
用一行代码环游世界 🌏 ' +
+ '
|
' +
+ "
" +
+ '
' +
+ '
' +
+ '
' +
+ "" +
+ ' ' +
+ ' ' +
+ " " +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ '' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ " " +
+ ' ' +
+ " " +
+ '
' +
+ '
🏝️ BaliWiFi 98Mbps
' +
+ '
☕ Lisbon€800/mo
' +
+ '
🏔️ Chiang Mai⭐ 4.9
' +
+ "
" +
+ "
" +
+ "
" +
+ "
" +
+ '
' +
+ '
' +
+ '
🎯 智能匹配去哪 ' +
+ '
从城市开始 ' +
+ "
" +
+ "
" +
+ "
" +
+ '向下滚动
' +
+ " "
+ );
+ }
+
+ function renderJourney() {
+ return (
+ '' +
+ '' +
+ '" +
+ '
' +
+ '' +
+ '
01 🌍
' +
+ "
探索 目的地、签证与智能匹配
" +
+ '
开始探索
' +
+ "
" +
+ '' +
+ '
02 🤝
' +
+ "
连接 活动、社区与游民心声
" +
+ '
去连接
' +
+ "
" +
+ '' +
+ '
03 🚀
' +
+ "
成长 学院、博客与工具箱
" +
+ '
去成长
' +
+ "
" +
+ " " +
+ "
" +
+ " "
+ );
+ }
+
+ function filteredDests() {
+ var list = (D.destinations || []).slice();
+ if (destFilter !== "all") list = list.filter(function (d) { return d.region === destFilter; });
+ if (destSearch) {
+ var q = destSearch.toLowerCase();
+ list = list.filter(function (d) {
+ return String(d.name).toLowerCase().indexOf(q) >= 0 || String(d.country).toLowerCase().indexOf(q) >= 0;
});
}
+ if (destSort === "cost-asc") list.sort(function (a, b) { return a.cost - b.cost; });
+ else if (destSort === "cost-desc") list.sort(function (a, b) { return b.cost - a.cost; });
+ else if (destSort === "speed") list.sort(function (a, b) { return b.speed - a.speed; });
+ else list.sort(function (a, b) { return b.rating - a.rating; });
+ return list;
+ }
- var cmpA = document.getElementById("cmp-a");
- var cmpB = document.getElementById("cmp-b");
- if (cmpA) on(cmpA, "change", function () { state.compareA = cmpA.value; render(); });
- if (cmpB) on(cmpB, "change", function () { state.compareB = cmpB.value; render(); });
+ function destCard(d) {
+ var hue = d.hue || 170;
+ return (
+ '' +
+ '' +
+ '' +
+ '
' + esc(d.emoji) + "
" +
+ '
' + esc(d.tag) + "
" +
+ "
" +
+ '' +
+ "
" + esc(d.name) + ", " + esc(d.country) +
+ (isFav(d.slug) ? " ★" : "") + " " +
+ "
" + esc(d.description) + "
" +
+ '
' +
+ "💰 ¥" + Number(d.cost).toLocaleString() + " " +
+ "📶 " + d.speed + "Mbps " +
+ "🌡️ " + d.temperature + "°C " +
+ "
" +
+ '
' +
+ "⭐".repeat(Math.max(1, Math.round((d.rating || 8) / 2))) +
+ " " + d.rating + "
" +
+ "
" +
+ " " +
+ " "
+ );
+ }
+
+ function renderDestinations(limit) {
+ var list = filteredDests();
+ var visible = typeof limit === "number" ? list.slice(0, limit) : list;
+ var filters = [
+ { key: "all", label: "全部" },
+ { key: "sea", label: "东南亚" },
+ { key: "europe", label: "欧洲" },
+ { key: "latam", label: "拉美" },
+ { key: "asia", label: "东亚" },
+ ];
+ return (
+ '' +
+ '' +
+ '" +
+ '
' +
+ '
' +
+ ' ' +
+ "
" +
+ '
' +
+ filters.map(function (f) {
+ return '' + f.label + " ";
+ }).join("") +
+ "
" +
+ '
' +
+ '评分 " +
+ '费用低→高 " +
+ '费用高→低 " +
+ '网速 " +
+ "
" +
+ "
" +
+ '
' + visible.map(destCard).join("") + "
" +
+ (typeof limit === "number" && list.length > limit
+ ? '
查看全部 ' + list.length + " 座城市
"
+ : "") +
+ "
" +
+ " "
+ );
+ }
+
+ function renderVisas() {
+ var list = (D.visas || []).slice();
+ if (visaFilter === "easy") list = list.filter(function (v) { return v.difficulty <= 35; });
+ else if (visaFilter === "medium") list = list.filter(function (v) { return v.difficulty > 35 && v.difficulty <= 55; });
+ else if (visaFilter === "budget") list = list.filter(function (v) { return v.badge_type === "budget"; });
+ var filters = [
+ { key: "all", label: "🌏 全部" },
+ { key: "easy", label: "✅ 简单" },
+ { key: "medium", label: "📋 中等" },
+ { key: "budget", label: "💰 低成本" },
+ ];
+ return (
+ '' +
+ '' +
+ '" +
+ '
' +
+ filters.map(function (f) {
+ return '' + f.label + " ";
+ }).join("") +
+ "
" +
+ '
' +
+ list.map(function (v, i) {
+ return (
+ '
' +
+ '
' + esc(v.flag) + "
" +
+ "
" + esc(v.name) + " " +
+ '
' + esc(v.badge) + "
" +
+ '
' +
+ "📅 " + esc(v.duration) + " " +
+ "💰 " + esc(v.income_req) + " " +
+ "⏱️ " + esc(v.approval_time) + " " +
+ "" + esc(v.extra) + " " +
+ " " +
+ '
难度 ' +
+ '
' +
+ "
" + esc(v.difficulty_label) + " " +
+ "
" +
+ "
"
+ );
+ }).join("") +
+ "
" +
+ "
" +
+ " "
+ );
+ }
+
+ function renderVoices() {
+ return (
+ '' +
+ '' +
+ '' +
+ '
' +
+ (D.testimonials || []).map(function (t) {
+ return (
+ '
' +
+ '' + esc(t.avatar) + "
" +
+ "" + esc(t.content) + "
" +
+ '' + esc(t.author) + " " + esc(t.role) + "
" +
+ " "
+ );
+ }).join("") +
+ "
" +
+ "
" +
+ " "
+ );
+ }
+
+ function renderLifestyle() {
+ var items = D.lifestyle || [];
+ return (
+ '' +
+ '' +
+ '' +
+ '
' +
+ items.map(function (it, idx) {
+ return (
+ '
' +
+ '' + esc(it.emoji) + " " +
+ "" + esc(it.title) + " " +
+ '' + esc(it.body) + "
" +
+ " "
+ );
+ }).join("") +
+ "
" +
+ "
" +
+ " "
+ );
+ }
+
+ function renderFaq() {
+ return (
+ '' +
+ '' +
+ '' +
+ '
' +
+ (D.faqs || []).map(function (f) {
+ return (
+ '
' +
+ "" + esc(f.question) + " " +
+ "" + esc(f.answer) + "
" +
+ " "
+ );
+ }).join("") +
+ "
" +
+ "
" +
+ " "
+ );
+ }
+
+ function renderFooter() {
+ return (
+ '"
+ );
+ }
+
+ function pageHome() {
+ return (
+ '' +
+ renderNavbar() +
+ renderTicker() +
+ renderHero() +
+ renderJourney() +
+ renderDestinations(6) +
+ renderLifestyle() +
+ renderVisas() +
+ renderVoices() +
+ renderFaq() +
+ renderFooter() +
+ "
"
+ );
+ }
+
+ function pageExplore() {
+ return (
+ '' +
+ renderNavbar() +
+ '
" +
+ renderDestinations() +
+ renderFooter() +
+ "
"
+ );
+ }
+
+ function pageDestination(slug) {
+ var d = destBySlug(slug);
+ if (!d) return '';
+ return (
+ '' +
+ renderNavbar() +
+ '
' +
+ '
← 目的地 ' +
+ '
' +
+ '
' + esc(d.emoji) + "
" +
+ "
" + esc(d.name) + " · " + esc(d.country) + " " +
+ '
' + esc(d.tag) + " · " + esc(d.nomads_count) + " 游民
" +
+ "
" + esc(d.description) + "
" +
+ '
' +
+ '' +
+ (isFav(d.slug) ? "取消收藏" : "收藏") + " " +
+ '同城活动 ' +
+ "
" +
+ "
" +
+ '
' +
+ "💰 ¥" + Number(d.cost).toLocaleString() + "/月 " +
+ "📶 " + d.speed + "Mbps " +
+ "🌡️ " + d.temperature + "°C " +
+ "⭐ " + d.rating + " " +
+ "
" +
+ '
' +
+ (d.highlights || []).map(function (h) {
+ return '' + esc(h) + " ";
+ }).join("") +
+ "
" +
+ "
" +
+ renderFooter() +
+ "
"
+ );
+ }
+
+ function pageConnect() {
+ return (
+ '' + renderNavbar() +
+ '
" + renderFooter() + "
"
+ );
+ }
+
+ function pageMeetups() {
+ return (
+ '' + renderNavbar() +
+ '
' +
+ '' +
+ '
' +
+ (D.meetups || []).map(function (m) {
+ return (
+ '
' +
+ '
' + esc(m.emoji || "🎉") + "
" +
+ "
" + esc(m.title) + " " +
+ "
" + esc(m.description) + "
" +
+ '
' + esc(m.city) + " " + esc(m.date) + " " + esc(m.time || "") +
+ " " + (m.rsvp_count || 0) + " 人
" +
+ "
"
+ );
+ }).join("") +
+ "
" + renderFooter() + "
"
+ );
+ }
+
+ function pageCommunity() {
+ return (
+ '' + renderNavbar() +
+ '
' +
+ '' +
+ '
' +
+ (D.discussions || []).map(function (d) {
+ return (
+ '
' +
+ "
" + (d.is_pinned ? "📌 " : "") + esc(d.title) + " " +
+ "
" + esc(d.excerpt) + "
" +
+ '
' + esc(d.author) + " " +
+ (d.reply_count || 0) + " 回复 ♥ " + (d.like_count || 0) + "
" +
+ "
"
+ );
+ }).join("") +
+ "
" + renderFooter() + "
"
+ );
+ }
+
+ function pageGrow() {
+ return (
+ '' + renderNavbar() +
+ '
" + renderFooter() + "
"
+ );
+ }
+
+ function pageDigital() {
+ var modules = D.course || [];
+ return (
+ '' + renderNavbar() +
+ '
' +
+ '' +
+ modules.map(function (mod, mi) {
+ return (
+ '" +
+ '
"
+ );
+ }).join("") +
+ "
" + renderFooter() + "
"
+ );
+ }
+
+ function pageBlog() {
+ return (
+ '' + renderNavbar() +
+ '
" + renderFooter() + "
"
+ );
+ }
+
+ function pageBlogDetail(slug) {
+ var b = null;
+ var list = D.blog || [];
+ for (var i = 0; i < list.length; i++) if (list[i].slug === slug) b = list[i];
+ if (!b) return '';
+ var content = (D.blogContent && D.blogContent[slug]) || b.excerpt || "";
+ return (
+ '' + renderNavbar() +
+ '
' +
+ '
← 博客 ' +
+ '" +
+ '
' +
+ esc(content) +
+ " " +
+ "
" + renderFooter() + "
"
+ );
+ }
+
+ function pageTools() {
+ return (
+ '' + renderNavbar() +
+ '
" + renderFooter() + "
"
+ );
+ }
+
+ function pageMatcher() {
+ var budget = 6000;
+ var scored = (D.destinations || []).map(function (d) {
+ var score = 40 + (d.rating || 0) * 4 + Math.min(20, (d.speed || 0) / 10);
+ if (d.cost <= budget) score += 20; else score -= 10;
+ return { d: d, score: Math.round(score) };
+ }).sort(function (a, b) { return b.score - a.score; });
+ return (
+ '' + renderNavbar() +
+ '
' +
+ '' +
+ '
' + scored.map(function (item) {
+ return destCard(item.d).replace("", " · 匹配 " + item.score + "");
+ }).join("") + "
" +
+ "
" + renderFooter() + "
"
+ );
+ }
+
+ function pageCompare() {
+ var list = D.destinations || [];
+ var a = list[0] || {};
+ var b = list[1] || {};
+ return (
+ '' + renderNavbar() +
+ '
' +
+ '' +
+ '
' +
+ (a.slug ? destCard(a) : "") +
+ (b.slug ? destCard(b) : "") +
+ "
" +
+ '
' +
+ '
' +
+ "指标 " + esc(a.name) + " " + esc(b.name) + " " +
+ "月费 ¥" + a.cost + " ¥" + b.cost + " " +
+ "网速 " + a.speed + " " + b.speed + " " +
+ "均温 " + a.temperature + " " + b.temperature + " " +
+ "评分 " + a.rating + " " + b.rating + " " +
+ "
" +
+ "
" + renderFooter() + "
"
+ );
+ }
+
+ function pageMine() {
+ var cards = favs.map(function (slug) {
+ var d = destBySlug(slug);
+ return d ? destCard(d) : "";
+ }).join("");
+ return (
+ '' + renderNavbar() +
+ '
' +
+ '" +
+ '
收藏的城市 ' +
+ '
' + (cards || '
还没有收藏
') + "
" +
+ "
" + renderFooter() + "
"
+ );
+ }
+
+ function pageVisasOnly() {
+ return '' + renderNavbar() +
+ '
' + renderVisas() + "
" + renderFooter() + "
";
+ }
+
+ function pageVoicesOnly() {
+ return '' + renderNavbar() +
+ '
' + renderVoices() + "
" + renderFooter() + "
";
+ }
+
+ function pageFaqOnly() {
+ return '' + renderNavbar() +
+ '
' + renderFaq() + "
" + renderFooter() + "
";
+ }
+
+ function render() {
+ var html = "";
+ switch (route.name) {
+ case "home": html = pageHome(); break;
+ case "explore": html = pageExplore(); break;
+ case "destination": html = pageDestination(route.params.slug); break;
+ case "connect": html = pageConnect(); break;
+ case "meetups": html = pageMeetups(); break;
+ case "community": html = pageCommunity(); break;
+ case "voices": html = pageVoicesOnly(); break;
+ case "grow": html = pageGrow(); break;
+ case "digital": html = pageDigital(); break;
+ case "blog": html = pageBlog(); break;
+ case "blog-detail": html = pageBlogDetail(route.params.slug); break;
+ case "tools": html = pageTools(); break;
+ case "matcher": html = pageMatcher(); break;
+ case "compare": html = pageCompare(); break;
+ case "visas": html = pageVisasOnly(); break;
+ case "faq": html = pageFaqOnly(); break;
+ case "mine": html = pageMine(); break;
+ default: html = pageHome();
+ }
+ root.innerHTML = html;
+ backBtn.className = "xhs-back" + (route.name === "home" ? "" : " is-on");
+ bind();
+ startTypewriter();
+ }
+
+ function bind() {
+ Array.prototype.forEach.call(document.querySelectorAll("[data-nav]"), function (el) {
+ on(el, "click", function (e) {
+ e.preventDefault();
+ go(el.getAttribute("data-nav"));
+ });
+ });
+ Array.prototype.forEach.call(document.querySelectorAll("[data-dest]"), function (el) {
+ on(el, "click", function (e) {
+ e.preventDefault();
+ go("destination", { slug: el.getAttribute("data-dest") });
+ });
+ });
+ Array.prototype.forEach.call(document.querySelectorAll("[data-blog]"), function (el) {
+ on(el, "click", function (e) {
+ e.preventDefault();
+ go("blog-detail", { slug: el.getAttribute("data-blog") });
+ });
+ });
+ Array.prototype.forEach.call(document.querySelectorAll("[data-dest-filter]"), function (el) {
+ on(el, "click", function () {
+ destFilter = el.getAttribute("data-dest-filter");
+ render();
+ });
+ });
+ Array.prototype.forEach.call(document.querySelectorAll("[data-visa-filter]"), function (el) {
+ on(el, "click", function () {
+ visaFilter = el.getAttribute("data-visa-filter");
+ render();
+ });
+ });
+ Array.prototype.forEach.call(document.querySelectorAll("[data-fav]"), function (el) {
+ on(el, "click", function () { toggleFav(el.getAttribute("data-fav")); });
+ });
+ Array.prototype.forEach.call(document.querySelectorAll("[data-scroll]"), function (el) {
+ on(el, "click", function (e) {
+ e.preventDefault();
+ var id = el.getAttribute("data-scroll");
+ var node = document.getElementById(id);
+ if (node) node.scrollIntoView({ behavior: "smooth", block: "start" });
+ });
+ });
+ var search = document.getElementById("dest-search");
+ if (search) {
+ on(search, "change", function () { destSearch = search.value || ""; render(); });
+ on(search, "keydown", function (e) {
+ if (e.key === "Enter") { destSearch = search.value || ""; render(); }
+ });
+ }
+ var sort = document.getElementById("dest-sort");
+ if (sort) on(sort, "change", function () { destSort = sort.value; render(); });
var cRun = document.getElementById("c-run");
if (cRun) {
on(cRun, "click", function () {
- function n(id) { var el = document.getElementById(id); return Number(el && el.value) || 0; }
- var total = n("c-house") + n("c-food") + n("c-trans") + n("c-cowork") + n("c-other");
+ function n(id) {
+ var el = document.getElementById(id);
+ return Number(el && el.value) || 0;
+ }
var out = document.getElementById("c-out");
- if (out) out.textContent = "预估月开销约 ¥" + total + "(离线估算,仅供参考)";
+ if (out) out.textContent = "预估月开销约 ¥" + (n("c-house") + n("c-food") + n("c-other"));
});
}
}
- function bindChrome() {
- Array.prototype.forEach.call(tabbar.querySelectorAll(".tab"), function (btn) {
- on(btn, "click", function () { goTab(btn.getAttribute("data-tab")); });
- });
- on(btnBack, "click", goBack);
- on(document.getElementById("btn-offline"), "click", function () {
- openSheet(
- "离线说明 " +
- "" + esc(DATA.offlineNote || "") + "
" +
- '知道了 '
- );
- on(document.getElementById("sheet-ok"), "click", closeSheet);
- });
- on(document.getElementById("sheet-mask"), "click", closeSheet);
+ var typeTimer = null;
+ function startTypewriter() {
+ var el = document.getElementById("typewriter");
+ if (!el) return;
+ var PHRASES = [
+ "数字游民不是逃离生活,而是用科技重新定义生活。",
+ "在巴厘岛写代码,在里斯本开会议,在清迈看日落 ☀️",
+ "世界那么大,你的办公室可以在任何地方 🌍",
+ "远程工作 + 全球旅居 = 无限可能 ✨",
+ ];
+ var phraseIdx = 0, charIdx = 0, deleting = false;
+ if (typeTimer) clearTimeout(typeTimer);
+ function type() {
+ var current = PHRASES[phraseIdx];
+ if (!deleting) {
+ el.textContent = current.substring(0, charIdx + 1);
+ charIdx++;
+ if (charIdx === current.length) { deleting = true; typeTimer = setTimeout(type, 2500); return; }
+ typeTimer = setTimeout(type, 60);
+ } else {
+ el.textContent = current.substring(0, charIdx - 1);
+ charIdx--;
+ if (charIdx === 0) { deleting = false; phraseIdx = (phraseIdx + 1) % PHRASES.length; }
+ typeTimer = setTimeout(type, 30);
+ }
+ }
+ typeTimer = setTimeout(type, 400);
}
- function boot() {
- bindChrome();
- Promise.all([
- storageGet(FAV_KEY, []),
- storageGet(PLAN_KEY, []),
- storageGet(CHECK_KEY, {}),
- storageGet(RECENT_KEY, []),
- ]).then(function (vals) {
- state.favs = Array.isArray(vals[0]) ? vals[0] : [];
- state.plan = Array.isArray(vals[1]) ? vals[1] : [];
- state.checklist = vals[2] && typeof vals[2] === "object" ? vals[2] : {};
- state.recent = Array.isArray(vals[3]) ? vals[3] : [];
- render();
- });
+ function parseHash() {
+ var h = (location.hash || "#/").replace(/^#\/?/, "");
+ var parts = h.split("/");
+ if (!parts[0] || parts[0] === "") return go("home");
+ if (parts[0] === "destination" && parts[1]) return go("destination", { slug: parts[1] });
+ if (parts[0] === "blog" && parts[1]) return go("blog-detail", { slug: parts[1] });
+ return go(parts[0]);
}
- boot();
+ on(backBtn, "click", function () {
+ if (history.length > 1) history.back();
+ else go("home");
+ });
+ on(window, "hashchange", parseHash);
+
+ // enrich stats like H5 API
+ if (!D.stats) D.stats = {};
+ D.stats.total_nomads = D.stats.total_nomads || "35.6M";
+ D.stats.countries = D.stats.countries || 195;
+ D.stats.satisfaction = D.stats.satisfaction || 87;
+
+ storageGet(FAV_KEY, []).then(function (v) {
+ favs = Array.isArray(v) ? v : [];
+ if (location.hash && location.hash.length > 2) parseHash();
+ else render();
+ });
})();
diff --git a/redmini/tool/data.js b/redmini/tool/data.js
index 1d0587b..3c841db 100644
--- a/redmini/tool/data.js
+++ b/redmini/tool/data.js
@@ -1 +1 @@
-window.NOMADRO_DATA = {"brand": "nomadro", "tagline": "用一行代码环游世界", "offlineNote": "小红书小程序无法联网。本包为官网内容离线镜像,收藏/计划仅保存在本机。完整互动请打开 nomadweb.nomadro.com", "site": "https://nomadweb.nomadro.com", "stats": {"destinations": 12, "visas": 12, "meetups": 12, "blog": 10, "faqs": 6}, "ticker": ["🌏 全球数字游民正在路上", "📋 签证政策实时整理(离线快照)", "🎉 同城活动与社区讨论可先浏览", "🎓 游民学院免费课时可学"], "rings": {"explore": [{"id": "destinations", "emoji": "🌴", "title": "目的地", "desc": "发现下一座城市"}, {"id": "visas", "emoji": "📋", "title": "签证指南", "desc": "远程友好签证"}, {"id": "matcher", "emoji": "🎯", "title": "智能匹配", "desc": "按预算气候排序"}, {"id": "compare", "emoji": "⚖️", "title": "城市对比", "desc": "并排看成本网速"}], "connect": [{"id": "meetups", "emoji": "🎉", "title": "游民活动", "desc": "同城与线上"}, {"id": "community", "emoji": "💬", "title": "社区讨论", "desc": "签证住宿经验"}, {"id": "voices", "emoji": "🗣️", "title": "游民心声", "desc": "真实旅居评价"}], "grow": [{"id": "digital", "emoji": "🎓", "title": "游民学院", "desc": "远程工作课程"}, {"id": "blog", "emoji": "📝", "title": "博客", "desc": "指南与攻略"}, {"id": "tools", "emoji": "🧰", "title": "工具箱", "desc": "费用估算等"}, {"id": "faq", "emoji": "❓", "title": "常见问题", "desc": "启动资金与保险"}]}, "lifestyle": [{"key": "morning", "emoji": "🌅", "title": "清晨", "body": "咖啡馆开机,时区对齐,列出今日三件交付。"}, {"key": "work", "emoji": "💻", "title": "深度工作", "body": "联合办公或家中安静角落,异步协作优先。"}, {"key": "explore", "emoji": "🚶", "title": "探索城市", "body": "傍晚散步、夜市与同城 meetup。"}, {"key": "collab", "emoji": "🤝", "title": "协作", "body": "和同行交换签证与住宿情报。"}, {"key": "social", "emoji": "🌙", "title": "社交", "body": "社区圆桌、兴趣局,或安静充电。"}], "planChecklist": [{"id": "visa", "label": "确认签证/停留天数"}, {"id": "flight", "label": "预订机票"}, {"id": "housing", "label": "首周短租/酒店"}, {"id": "sim", "label": "当地 SIM / eSIM"}, {"id": "cowork", "label": "踩点联合办公"}, {"id": "insurance", "label": "国际医疗保险"}, {"id": "budget", "label": "写下月预算"}, {"id": "meetup", "label": "报名一场同城活动"}], "destinations": [{"id": "1", "slug": "bali", "name": "巴厘岛", "country": "印尼", "emoji": "🏝️", "tag": "东南亚 · 热带天堂", "description": "乌布的数字游民社区闻名全球,稻田间的 Co-working Space 和瑜伽文化让这里成为游民圣地。", "region": "sea", "cost": 4500, "speed": 85, "temperature": 28, "rating": 9.2, "hue": 170, "nomads_count": "12,000+", "highlights": ["🏄 冲浪与海滩生活", "🧘 瑜伽冥想文化", "💰 东南亚性价比之王", "🌴 热带气候全年温暖"], "map_x": 720, "map_y": 310}, {"id": "2", "slug": "lisbon", "name": "里斯本", "country": "葡萄牙", "emoji": "🌊", "tag": "欧洲 · 海滨明珠", "description": "D7 签证友好,阳光海岸与悠久历史的完美融合,欧洲数字游民的首选基地。", "region": "europe", "cost": 9000, "speed": 120, "temperature": 22, "rating": 9.5, "hue": 220, "nomads_count": "8,500+", "highlights": ["📋 D7 签证门槛低", "☀️ 300天阳光", "🎵 Fado 音乐文化", "🚋 复古有轨电车"], "map_x": 430, "map_y": 195}, {"id": "3", "slug": "chiangmai", "name": "清迈", "country": "泰国", "emoji": "🏔️", "tag": "东南亚 · 文化古城", "description": "数字游民大本营,咖啡文化与夜市生活的天堂,全球性价比最高的游民城市。", "region": "sea", "cost": 3800, "speed": 95, "temperature": 30, "rating": 9.4, "hue": 45, "nomads_count": "15,000+", "highlights": ["☕ 咖啡馆文化浓厚", "🏮 夜市与寺庙", "💰 月生活费最低", "🤝 游民社区最活跃"], "map_x": 700, "map_y": 240}, {"id": "4", "slug": "mexico", "name": "墨西哥城", "country": "墨西哥", "emoji": "🌃", "tag": "拉美 · 活力之都", "description": "艺术、美食与科技交织,时区便利对接北美市场,拉美最具活力的游民城市。", "region": "latam", "cost": 6500, "speed": 75, "temperature": 18, "rating": 8.8, "hue": 300, "nomads_count": "5,200+", "highlights": ["🎨 街头艺术天堂", "🌮 世界美食之都", "🕐 北美时区友好", "💃 丰富夜生活"], "map_x": 220, "map_y": 240}, {"id": "5", "slug": "barcelona", "name": "巴塞罗那", "country": "西班牙", "emoji": "🏖️", "tag": "欧洲 · 地中海", "description": "高迪建筑与创业生态并存,Nomad Visa 政策领先,地中海生活的理想之选。", "region": "europe", "cost": 10500, "speed": 150, "temperature": 20, "rating": 9.1, "hue": 130, "nomads_count": "6,800+", "highlights": ["🏛️ 高迪建筑奇迹", "🏖️ 地中海海滩", "📋 Nomad Visa 便利", "🍷 美食与夜生活"], "map_x": 460, "map_y": 200}, {"id": "6", "slug": "tokyo", "name": "东京", "country": "日本", "emoji": "🗼", "tag": "亚洲 · 现代都市", "description": "极致效率与安全,适合追求高品质生活的远程工作者,亚洲科技之都。", "region": "asia", "cost": 12000, "speed": 200, "temperature": 15, "rating": 8.6, "hue": 10, "nomads_count": "4,100+", "highlights": ["🚄 极致公共交通", "🛡️ 全球最安全城市", "📶 网速亚洲第一", "🍣 美食文化巅峰"], "map_x": 820, "map_y": 210}, {"id": "7", "slug": "berlin", "name": "柏林", "country": "德国", "emoji": "🎨", "tag": "欧洲 · 创意之都", "description": "开放的创业与开源氛围,租金相对西欧友好,夜生活与艺术场景极具吸引力。", "region": "europe", "cost": 9800, "speed": 140, "temperature": 12, "rating": 8.9, "hue": 250, "nomads_count": "7,200+", "highlights": ["🎨 艺术与街头文化", "💻 创业生态活跃", "🚲 骑行友好", "🍺 社交场景丰富"], "map_x": 500, "map_y": 160}, {"id": "8", "slug": "dali", "name": "大理", "country": "中国", "emoji": "🏔️", "tag": "国内 · 慢生活", "description": "苍山洱海之间的内容创作者聚集地,生活节奏慢、社交松弛,适合深度创作与试住。", "region": "asia", "cost": 4200, "speed": 80, "temperature": 18, "rating": 8.7, "hue": 190, "nomads_count": "3,600+", "highlights": ["📷 内容创作友好", "🏞️ 自然风光", "🍵 咖啡馆密集", "🏡 合租成本低"], "map_x": 730, "map_y": 220}, {"id": "9", "slug": "seoul", "name": "首尔", "country": "韩国", "emoji": "🏙️", "tag": "亚洲 · 潮流都市", "description": "高速网络与深夜城市活力并存,适合对接东亚市场与产品迭代。", "region": "asia", "cost": 11000, "speed": 220, "temperature": 14, "rating": 8.5, "hue": 330, "nomads_count": "3,200+", "highlights": ["📶 全球顶尖网速", "🍜 美食与便利店文化", "🛍️ 潮流消费", "🚇 地铁覆盖极强"], "map_x": 800, "map_y": 200}, {"id": "10", "slug": "medellin", "name": "麦德林", "country": "哥伦比亚", "emoji": "🌺", "tag": "拉美 · 春城", "description": "四季如春、生活成本友好,英语游民社区成熟,适合北美时区远程工作。", "region": "latam", "cost": 5200, "speed": 90, "temperature": 23, "rating": 9.0, "hue": 140, "nomads_count": "6,400+", "highlights": ["🌤️ 四季如春", "💰 高性价比", "🕐 北美时区", "🤝 社区活动密集"], "map_x": 260, "map_y": 300}, {"id": "11", "slug": "dubai", "name": "迪拜", "country": "阿联酋", "emoji": "🏙️", "tag": "中东 · 枢纽都市", "description": "免税与签证便利吸引远程高收入人群,国际航班枢纽,适合中东/欧亚跳板。", "region": "asia", "cost": 14000, "speed": 180, "temperature": 32, "rating": 8.4, "hue": 40, "nomads_count": "4,800+", "highlights": ["🧾 税务友好", "✈️ 航线枢纽", "🏗️ 现代基础设施", "🌐 多元国际社区"], "map_x": 600, "map_y": 240}, {"id": "12", "slug": "tbilisi", "name": "第比利斯", "country": "格鲁吉亚", "emoji": "🍷", "tag": "欧亚 · 税务友好", "description": "1% 小企业税与远程友好签证,旧城氛围浓厚,东欧游民新基地。", "region": "europe", "cost": 4800, "speed": 70, "temperature": 16, "rating": 8.8, "hue": 15, "nomads_count": "5,100+", "highlights": ["🧾 1% 小企业税", "🏰 旧城与温泉", "🍷 葡萄酒文化", "💰 低生活成本"], "map_x": 560, "map_y": 190}], "visas": [{"id": "1", "country": "葡萄牙", "flag": "🇵🇹", "name": "葡萄牙 D7 签证", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "2年,可续签", "income_req": "€760/月", "approval_time": "3-6 个月", "extra": "🏥 可享欧盟医疗", "difficulty": 35, "difficulty_label": "简单"}, {"id": "2", "country": "西班牙", "flag": "🇪🇸", "name": "西班牙 Nomad Visa", "badge": "🔥 热门", "badge_type": "hot", "duration": "1年,可续3年", "income_req": "€2,160/月", "approval_time": "1-3 个月", "extra": "🌍 可申根区旅行", "difficulty": 45, "difficulty_label": "中等"}, {"id": "3", "country": "印尼", "flag": "🇮🇩", "name": "印尼 B211A 签证", "badge": "💰 低成本", "badge_type": "budget", "duration": "60天,可延期", "income_req": "约 ¥2,000", "approval_time": "5-10 天", "extra": "🏝️ 适合巴厘岛旅居", "difficulty": 25, "difficulty_label": "简单"}, {"id": "4", "country": "泰国", "flag": "🇹🇭", "name": "泰国 LTR 签证", "badge": "🆕 新政策", "badge_type": "new", "duration": "10年", "income_req": "$80,000/年", "approval_time": "1-2 个月", "extra": "✈️ 多次入境", "difficulty": 60, "difficulty_label": "中等"}, {"id": "5", "country": "墨西哥", "flag": "🇲🇽", "name": "墨西哥 Temporary Resident", "badge": "💰 低成本", "badge_type": "budget", "duration": "1-4年", "income_req": "$2,500/月", "approval_time": "2-4 周", "extra": "🌮 北美时区友好", "difficulty": 30, "difficulty_label": "简单"}, {"id": "6", "country": "爱沙尼亚", "flag": "🇪🇪", "name": "爱沙尼亚 DNV", "badge": "🚀 先锋", "badge_type": "pioneer", "duration": "1年", "income_req": "€3,504/月", "approval_time": "2-4 周", "extra": "💻 全球首个数字游民签证", "difficulty": 40, "difficulty_label": "中等"}, {"id": "7", "country": "格鲁吉亚", "flag": "🇬🇪", "name": "格鲁吉亚 Remotely from Georgia", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "1年", "income_req": "$2,000/月", "approval_time": "约 10 天", "extra": "🧾 可搭配小企业 1% 税", "difficulty": 28, "difficulty_label": "简单"}, {"id": "8", "country": "阿联酋", "flag": "🇦🇪", "name": "迪拜 Virtual Working Programme", "badge": "🔥 热门", "badge_type": "hot", "duration": "1年", "income_req": "$3,500/月", "approval_time": "2-4 周", "extra": "✈️ 中东航线枢纽", "difficulty": 42, "difficulty_label": "中等"}, {"id": "9", "country": "哥伦比亚", "flag": "🇨🇴", "name": "哥伦比亚 V Visa (Digital Nomad)", "badge": "💰 低成本", "badge_type": "budget", "duration": "最长 2 年", "income_req": "约 3× 最低工资", "approval_time": "2-6 周", "extra": "🌺 适合麦德林春城", "difficulty": 32, "difficulty_label": "简单"}, {"id": "10", "country": "韩国", "flag": "🇰🇷", "name": "韩国 Workation Visa (C-3-8)", "badge": "🆕 新政策", "badge_type": "new", "duration": "最长 2 年", "income_req": "约 $65,000/年", "approval_time": "1-2 个月", "extra": "🏙️ 对接首尔与济州", "difficulty": 55, "difficulty_label": "中等"}, {"id": "11", "country": "德国", "flag": "🇩🇪", "name": "德国 Freelance / Self-employment", "badge": "🚀 先锋", "badge_type": "pioneer", "duration": "1-3年", "income_req": "需商业计划与客户证明", "approval_time": "2-4 个月", "extra": "🎨 适合柏林自由职业", "difficulty": 65, "difficulty_label": "较难"}, {"id": "12", "country": "泰国", "flag": "🇹🇭", "name": "泰国 DTV 签证", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "最长 5 年(多次入境)", "income_req": "约 50 万泰铢存款证明", "approval_time": "2-6 周", "extra": "🤝 远程工作友好", "difficulty": 38, "difficulty_label": "中等"}], "faqs": [{"id": "1", "question": "💰 做数字游民需要多少启动资金?", "order": 1, "answer": "建议准备 3-6 个月的生活费作为缓冲。以东南亚为例,¥15,000-30,000 即可开始。包括机票、首月住宿、签证费用和应急资金。欧洲目的地建议准备 ¥50,000 以上。"}, {"id": "2", "question": "📶 如何确保远程工作的网络稳定?", "order": 2, "answer": "选择网络评分高的城市,入住前用 Speedtest 测试。备用方案:本地 SIM 卡热点、随身 WiFi 设备、附近 Co-working Space。推荐携带 USB 网卡和 VPN 作为双保险。"}, {"id": "3", "question": "🏥 旅居期间的保险怎么办?", "order": 3, "answer": "推荐 SafetyWing 或 World Nomads 等国际医疗保险,月费约 $40-80,覆盖全球(部分国家除外)。长期旅居者可考虑目的地国家的本地保险,费用更低、报销更方便。"}, {"id": "4", "question": "🧾 税务问题如何处理?", "order": 4, "answer": "税务居民身份取决于居住天数(通常 183 天规则)。建议咨询专业税务顾问,了解双重征税协定。很多游民选择税务友好的国家(如葡萄牙、格鲁吉亚)作为基地。"}, {"id": "5", "question": "👨👩👧 可以带娃一起做数字游民吗?", "order": 5, "answer": "完全可以!巴厘岛、清迈、里斯本都有成熟的数字游民家庭社区。关键是选择教育资源丰富、医疗条件好的目的地,以及保持稳定的工作节奏,给孩子规律的生活。"}, {"id": "6", "question": "🤝 如何快速融入当地游民社区?", "order": 6, "answer": "加入 Nomad List、Facebook 群组和本地 Meetup 活动。入住游民友好的 Co-living 空间,参加每周的 Coworking 社交日。大部分游民社区非常开放,主动打招呼就能结识朋友。"}], "testimonials": [{"id": "1", "avatar": "👩💻", "content": "在清迈住了 8 个月,月花费不到 4000 元,但生活质量比国内一线城市高太多了。每天早上骑摩托去咖啡馆,这种感觉无法形容。", "author": "小林", "role": "前端开发 · 清迈 🇹🇭", "rating": 5}, {"id": "2", "avatar": "👨🎨", "content": "里斯本的 D7 签证让我在欧洲有了基地。白天在 Alfama 区的共享办公空间工作,周末去 Sintra 徒步,完美平衡。", "author": "Marco", "role": "UI 设计师 · 里斯本 🇵🇹", "rating": 5}, {"id": "3", "avatar": "🧑💼", "content": "带着家人做数字游民听起来疯狂,但在巴厘岛乌布,孩子们上国际学校,我和妻子远程工作,这是我们做过最正确的决定。", "author": "张家", "role": "产品经理 · 巴厘岛 🇮🇩", "rating": 5}, {"id": "4", "avatar": "👩🎨", "content": "麦德林四季如春,英语社区很活跃。我用北美时区接单,下午还能去公园运动,效率反而更高。", "author": "Sofia", "role": "自由职业设计 · 麦德林 🇨🇴", "rating": 5}, {"id": "5", "avatar": "👨💻", "content": "第比利斯生活成本低,还能开本地公司走 1% 税。旧城咖啡馆写代码,周末去卡兹别吉徒步,节奏很舒服。", "author": "Devon", "role": "DevOps · 第比利斯 🇬🇪", "rating": 5}, {"id": "6", "avatar": "📷", "content": "大理适合慢创作。合租便宜、风景治愈,但要主动找同频伙伴,别只待在民宿里。", "author": "Lina", "role": "内容创作者 · 大理 🇨🇳", "rating": 4}, {"id": "7", "avatar": "🧑🚀", "content": "柏林创业氛围强,开源 meetup 特别多。冬天冷、德语门槛真实存在,但找到圈子后很值得。", "author": "Ken", "role": "数据分析 · 柏林 🇩🇪", "rating": 4}, {"id": "8", "avatar": "🏙️", "content": "迪拜当跳板很香:航班方便、签证路径清晰。夏天太热,建议把深度工作时间放在室内联合办公。", "author": "Omar", "role": "增长顾问 · 迪拜 🇦🇪", "rating": 4}], "tools": [{"id": "1", "emoji": "💼", "name": "远程协作", "description": "Slack · Notion · Figma · Zoom", "tags": ["团队", "设计", "沟通"], "category": "work"}, {"id": "2", "emoji": "✈️", "name": "旅行规划", "description": "Skyscanner · Nomad List · SafetyWing", "tags": ["机票", "签证", "保险"], "category": "travel"}, {"id": "3", "emoji": "💳", "name": "财务管理", "description": "Wise · Revolut · Xero · 多币种账户", "tags": ["汇款", "记账", "税务"], "category": "finance"}, {"id": "4", "emoji": "🤝", "name": "社群网络", "description": "Nomad List · Remote Year · 本地 Meetup", "tags": ["社交", "活动", "合租"], "category": "connect"}, {"id": "5", "emoji": "🏥", "name": "健康保障", "description": "SafetyWing · World Nomads · 运动 App", "tags": ["保险", "健身", "心理"], "category": "health"}, {"id": "6", "emoji": "📚", "name": "持续学习", "description": "Coursera · Duolingo · 当地语言班", "tags": ["技能", "语言", "文化"], "category": "learn"}], "blog": [{"id": "1", "slug": "chiangmai-guide-2026", "title": "清迈数字游民完全指南 2026", "excerpt": "从签证到住宿,从咖啡馆到 Co-working,一篇搞定清迈旅居。", "emoji": "🏔️", "author": "nomadro", "published_at": "2026-01-15", "read_time": 8, "tags": ["清迈", "指南", "东南亚"]}, {"id": "2", "slug": "portugal-d7-visa", "title": "葡萄牙 D7 签证申请全攻略", "excerpt": "手把手教你申请欧洲最受欢迎的远程工作签证。", "emoji": "🇵🇹", "author": "nomadro", "published_at": "2026-02-03", "read_time": 12, "tags": ["签证", "葡萄牙", "欧洲"]}, {"id": "3", "slug": "nomad-tax-basics", "title": "数字游民税务入门:你需要知道的 5 件事", "excerpt": "183 天规则、双重征税、税务居民身份——一文理清。", "emoji": "🧾", "author": "nomadro", "published_at": "2026-02-20", "read_time": 10, "tags": ["税务", "法律", "指南"]}, {"id": "4", "slug": "medellin-spring-city", "title": "麦德林春城试住 30 天笔记", "excerpt": "时区、安全区、联合办公与西语社区初体验。", "emoji": "🌺", "author": "Sofia", "published_at": "2026-03-05", "read_time": 9, "tags": ["麦德林", "拉美", "试住"]}, {"id": "5", "slug": "tbilisi-tax-base", "title": "第比利斯当税务基地靠谱吗?", "excerpt": "远程签证、小企业税与旧城生活成本实测。", "emoji": "🍷", "author": "Devon", "published_at": "2026-03-18", "read_time": 11, "tags": ["格鲁吉亚", "税务", "欧洲"]}, {"id": "6", "slug": "dali-slow-create", "title": "大理慢创作:合租、网速与社群", "excerpt": "国内游民城市怎么住得久又不散漫。", "emoji": "🏔️", "author": "Lina", "published_at": "2026-04-02", "read_time": 7, "tags": ["大理", "内容", "国内"]}, {"id": "7", "slug": "berlin-startup-nomad", "title": "柏林自由职业与开源社群指南", "excerpt": "签证路径、共享办公与每周活动清单。", "emoji": "🎨", "author": "Ken", "published_at": "2026-04-20", "read_time": 10, "tags": ["柏林", "创业", "开源"]}, {"id": "8", "slug": "dubai-hub-month", "title": "迪拜一个月跳板旅居怎么排期", "excerpt": "签证、炎热季节、航班中转与办公点选择。", "emoji": "🏙️", "author": "Omar", "published_at": "2026-05-01", "read_time": 8, "tags": ["迪拜", "中东", "枢纽"]}, {"id": "9", "slug": "seoul-workation", "title": "首尔 Workation:网速、便利与成本", "excerpt": "C-3-8 签证与江南区办公踩点。", "emoji": "🏙️", "author": "Yuki", "published_at": "2026-05-16", "read_time": 9, "tags": ["首尔", "韩国", "网速"]}, {"id": "10", "slug": "first-month-checklist", "title": "旅居第一月清单:从落地到稳定输出", "excerpt": "SIM、短租、联合办公、社群与预算五步走。", "emoji": "✅", "author": "nomadro", "published_at": "2026-06-01", "read_time": 6, "tags": ["清单", "新手", "落地"]}], "blogContent": {"chiangmai-guide-2026": "## 为什么选择清迈?\n\n清迈是公认的全球数字游民之都。低廉的生活成本、完善的 Co-working 生态、友善的本地人和丰富的文化活动,让它成为新手游民的最佳起点。\n\n## 签证方案\n\n- **旅游签**:落地签 15 天,或提前办旅游签 60 天\n- **DTV 签证**:2024 年推出的 Destination Thailand Visa,适合远程工作者\n- **学生签/精英签**:长期旅居的进阶选择\n\n## 住宿推荐\n\n| 区域 | 月租 | 特点 |\n|------|------|------|\n| Nimman | ¥2,500-4,000 | 咖啡馆、餐厅、年轻人多 |\n| Old City | ¥1,500-3,000 | 文化氛围浓,步行可达寺庙 |\n| Hang Dong | ¥2,000-3,500 | 安静,适合深度工作 |\n\n## 最佳 Co-working\n\n1. **Punspace** — Nimman 区经典,日票 ¥60\n2. **CAMP** — Maya 商场顶楼,免费(消费即可)\n3. **Hub53** — 安静专业,月票 ¥800\n\n## 月均预算\n\n- 住宿:¥2,500\n- 餐饮:¥1,200\n- 交通:¥300(租摩托)\n- Co-working:¥400\n- 其他:¥400\n- **合计:约 ¥3,800-4,500**\n\n## 实用 Tips\n\n☕ 推荐咖啡馆:Ristr8to(世界冠军)、Graph One Nimman\n🏍️ 租摩托月费约 ¥400,注意戴头盔\n📱 推荐 AIS 或 TrueMove 无限流量套餐\n🤝 每周四有 Nomad Meetup,关注 Facebook 群组", "portugal-d7-visa": "## D7 签证是什么?\n\n葡萄牙 D7 签证(Passive Income Visa)最初为退休者设计,但因收入要求低、审批相对简单,成为数字游民进入欧盟的最佳通道之一。\n\n## 申请条件\n\n- 月收入不低于 **€760**(葡萄牙最低工资)\n- 银行存款建议 **€9,120+**(12个月生活费)\n- 无犯罪记录\n- 葡萄牙本地银行账户\n- 健康保险\n\n## 申请流程\n\n1. **准备材料**(2-4 周)\n - 护照、照片、收入证明、银行流水\n - 葡萄牙税号(NIF)\n - 住宿证明(租房合同或酒店预订)\n\n2. **递交申请**\n - 在中国:葡萄牙驻华使馆\n - 或入境葡萄牙后转居留许可\n\n3. **等待审批**(3-6 个月)\n\n4. **登陆葡萄牙**\n - 领取居留卡\n - 登记住址\n\n## 费用预算\n\n- 签证费:约 €90\n- 律师费(可选):€500-1,500\n- NIF + 银行开户:€200-300\n- 首月生活费:€800-1,200\n\n## 里斯本生活成本\n\n- 一居室公寓:€800-1,200/月\n- Co-working:€150-250/月\n- 餐饮:€300-500/月\n- **月均总花费:€1,200-1,800**\n\n## 常见问题\n\n**Q: D7 可以工作吗?**\nA: 可以远程为海外雇主工作,但不能在葡萄牙本地公司就职。\n\n**Q: 5年后能拿护照吗?**\nA: 满足居住要求后可以申请永居或入籍。", "nomad-tax-basics": "## 1. 什么是税务居民?\n\n大多数国家用 **183 天规则** 判定税务居民:在一个自然年内居住超过 183 天,即成为该国税务居民,需在该国申报全球收入。\n\n## 2. 双重征税怎么办?\n\n如果两个国家都认为你是税务居民,查 **双边税收协定**(DTA)。中国已与 100+ 国家签署 DTA,可避免重复缴税。\n\n## 3. 数字游民常见税务策略\n\n| 策略 | 说明 | 适合人群 |\n|------|------|----------|\n| 零税务居民 | 不在任何国家住满 183 天 | 短期旅居者 |\n| 税务友好国 | 葡萄牙 NHR、格鲁吉亚 1% 税 | 长期旅居者 |\n| 原籍国申报 | 回国期间申报 | 兼职游民 |\n\n## 4. 中国税务居民注意\n\n- 中国公民默认是中国税务居民(全球征税)\n- 海外收入也需申报(可抵免境外已缴税)\n- 建议咨询专业税务师\n\n## 5. 实用建议\n\n1. 📋 记录每个国家的入境/出境日期\n2. 🧾 保留所有收入凭证和银行流水\n3. 🏦 使用 Wise 等工具便于跨境汇款记录\n4. 👨💼 收入超过一定金额建议聘请税务顾问\n5. 📱 推荐工具:Xero(记账)、TaxScouts(报税)", "medellin-spring-city": "## 为什么麦德林?\n\n四季如春、生活成本可控,且贴近北美时区,适合接美加客户。Laureles / El Poblado 是游民常见落脚区。\n\n## 30 天试住建议\n\n1. 前 7 天住短租,实测网速与噪音\n2. 办本地 SIM,备份热点\n3. 参加 2 场线下 meetup,验证社区匹配度\n4. 确定联合办公月票再签长租\n\n## 预算参考(月)\n\n- 住宿:¥2,000–3,500\n- 餐饮:¥1,200–1,800\n- 交通:¥300–500\n- 办公:¥400–800", "tbilisi-tax-base": "## 远程签证 + 小企业税\n\n格鲁吉亚对远程工作者友好,许多人会评估本地公司与 1% 税路径(需自行核实最新政策)。\n\n## 生活感受\n\n旧城与 Vake 区咖啡馆多,适合深度工作;冬季偏冷,夏天舒服。\n\n## 注意\n\n- 银行开户与本地手机号流程可能变动\n- 税务方案务必咨询持证顾问\n- 把「试住 30 天」和「税务落地」分开决策", "dali-slow-create": "## 适合谁\n\n内容创作者、独立开发者、想放慢节奏但仍保持产出的人。\n\n## 实操建议\n\n- 合租优先选稳定 WiFi 与独立工作桌\n- 用固定作息对抗「度假感」\n- 主动加入本地创作者局,避免社交孤岛\n\n## 成本\n\n月生活费常可控制在 ¥3,500–5,000,视合租与出行频率而定。", "berlin-startup-nomad": "## 柏林为什么吸引游民\n\n开源、设计、创业活动密度高,共享办公选择多。\n\n## 落地要点\n\n- 提前规划居留/自由职业路径\n- 冬天日照短,准备补光与室内运动\n- 德语不是必须,但能明显提升生活便利\n\n## 每周节奏\n\n2 天联合办公 + 1 场 meetup + 周末短途,比纯咖啡馆更稳。", "dubai-hub-month": "## 适合当跳板\n\n国际航班密集,签证路径相对清晰,适合中东/欧亚中转月。\n\n## 炎热季节\n\n夏季高温,深度工作尽量安排在空调联合办公;户外活动放早晚。\n\n## 预算\n\n整体偏高,建议按「枢纽月」而非「低成本旅居」来规划。", "seoul-workation": "## 网速与便利\n\n首尔网速与城市便利度极强,适合需要高频协作的产品/工程角色。\n\n## 成本与节奏\n\n住宿与餐饮成本接近一线城市;用便利店与共享办公控制变量。\n\n## 签证\n\n关注 Workation / 相关短期远程路径的最新材料要求。", "first-month-checklist": "## 落地五步\n\n1. **连接**:落地办 SIM,测公寓与办公点网速\n2. **住处**:先短租 7–14 天,再决定长租\n3. **办公**:固定 1 个主点 + 2 个备份咖啡馆\n4. **社群**:报名 1 场 meetup,加 1 个本地群\n5. **预算**:用第一周真实账单校准月预算\n\n## 输出稳定\n\n每天保护 4 小时深度工作,旅行探索放在下午后段。"}, "meetups": [{"id": "online-roundtable", "title": "远程工作节奏圆桌", "city": "线上", "destination_slug": "", "emoji": "🎙️", "date": "2026-09-12", "time": "20:00", "venue": "nomadro 线上活动厅", "description": "聊聊异步协作、时区管理和旅居城市选择。登录后可 RSVP,活动前会收到提醒。", "mode": "online", "access_level": "public", "rsvp_count": 38, "max_attendees": 80, "organizer": "nomadro 社区", "tags": ["远程", "协作", "新手友好"], "is_upcoming": true}, {"id": "chiangmai-cowork", "title": "清迈联合办公下午茶", "city": "清迈", "destination_slug": "chiangmai", "emoji": "☕", "date": "2026-09-18", "time": "15:00", "venue": "Nimman 区 Co-working", "description": "一起办公、分享签证经验和住宿踩坑。线下为主,也开放线上旁听链接。", "mode": "hybrid", "access_level": "public", "rsvp_count": 14, "max_attendees": 24, "organizer": "清迈游民小组", "tags": ["线下", "社交", "东南亚"], "is_upcoming": true}, {"id": "lisbon-sunset", "title": "里斯本日落漫步", "city": "里斯本", "destination_slug": "lisbon", "emoji": "🌅", "date": "2026-09-22", "time": "18:30", "venue": "Miradouro 观景点集合", "description": "工作一周后,和同城游民一起看日落、交换欧洲签证情报。", "mode": "offline", "access_level": "public", "rsvp_count": 9, "max_attendees": 16, "organizer": "Lisbon Nomads", "tags": ["欧洲", "户外", "社交"], "is_upcoming": true}, {"id": "bali-surf-morning", "title": "巴厘岛晨间冲浪 + 办公", "city": "巴厘岛", "destination_slug": "bali", "emoji": "🏄", "date": "2026-10-05", "time": "07:00", "venue": "Canggu Beach", "description": "早起冲浪,10 点回咖啡馆集中办公。适合想体验 Work-Life 平衡的游民。", "mode": "offline", "access_level": "public", "rsvp_count": 11, "max_attendees": 20, "organizer": "Bali Remote Crew", "tags": ["运动", "生活方式"], "is_upcoming": true}, {"id": "tokyo-tax-talk", "title": "日本税务与居留线上分享", "city": "线上", "destination_slug": "tokyo", "emoji": "🧾", "date": "2026-10-12", "time": "19:30", "venue": "线上直播", "description": "特邀长期旅居日本的游民分享税务申报、保险和银行开户经验(非法律建议)。", "mode": "online", "access_level": "members", "rsvp_count": 52, "max_attendees": 120, "organizer": "nomadro 社区", "tags": ["税务", "日本", "干货"], "is_upcoming": true}, {"id": "berlin-opensource", "title": "柏林开源与 DevOps 夜谈", "city": "柏林", "destination_slug": "berlin", "emoji": "🖥️", "date": "2026-09-28", "time": "19:00", "venue": "Kreuzberg Co-working", "description": "分享自托管、CI 与远程团队协作实践,会后可继续社交。", "mode": "hybrid", "access_level": "public", "rsvp_count": 22, "max_attendees": 40, "organizer": "Berlin Remote", "tags": ["开源", "技术", "欧洲"], "is_upcoming": true}, {"id": "dali-create-walk", "title": "大理洱海创作散步", "city": "大理", "destination_slug": "dali", "emoji": "📷", "date": "2026-10-02", "time": "16:00", "venue": "才村码头集合", "description": "边走边拍,分享内容选题与变现路径,适合创作者与慢旅居者。", "mode": "offline", "access_level": "public", "rsvp_count": 8, "max_attendees": 18, "organizer": "大理创作者局", "tags": ["内容", "户外", "国内"], "is_upcoming": true}, {"id": "medellin-spanish", "title": "麦德林西语咖啡局", "city": "麦德林", "destination_slug": "medellin", "emoji": "☕", "date": "2026-10-08", "time": "10:30", "venue": "Laureles 咖啡馆", "description": "初级西语练习 + 安全区与租房情报交换,新手友好。", "mode": "offline", "access_level": "public", "rsvp_count": 16, "max_attendees": 20, "organizer": "Medellín Nomads", "tags": ["语言", "拉美", "社交"], "is_upcoming": true}, {"id": "seoul-night-office", "title": "首尔深夜联合办公", "city": "首尔", "destination_slug": "seoul", "emoji": "🌃", "date": "2026-10-15", "time": "21:00", "venue": "江南共享办公", "description": "适合东亚时区冲刺交付的游民,自带电脑即可。", "mode": "offline", "access_level": "public", "rsvp_count": 12, "max_attendees": 25, "organizer": "Seoul Workation", "tags": ["办公", "韩国", "效率"], "is_upcoming": true}, {"id": "dubai-hub-brunch", "title": "迪拜枢纽早午餐", "city": "迪拜", "destination_slug": "dubai", "emoji": "🥂", "date": "2026-10-18", "time": "11:00", "venue": "Downtown 咖啡厅", "description": "中转游民见面:签证、航班与下一站城市选择。", "mode": "offline", "access_level": "public", "rsvp_count": 10, "max_attendees": 16, "organizer": "Dubai Hub Crew", "tags": ["中东", "社交", "跳板"], "is_upcoming": true}, {"id": "tbilisi-tax-cafe", "title": "第比利斯税务咖啡聊", "city": "第比利斯", "destination_slug": "tbilisi", "emoji": "🍷", "date": "2026-10-22", "time": "15:00", "venue": "Vake 区咖啡馆", "description": "交流远程签证与本地公司实务(非正式法律意见),会后可徒步旧城。", "mode": "offline", "access_level": "members", "rsvp_count": 19, "max_attendees": 22, "organizer": "Tbilisi Base", "tags": ["税务", "欧洲", "干货"], "is_upcoming": true}, {"id": "mexico-food-walk", "title": "墨西哥城街头美食漫步", "city": "墨西哥城", "destination_slug": "mexico", "emoji": "🌮", "date": "2026-10-26", "time": "17:30", "venue": "Roma Norte 集合", "description": "边吃边聊北美时区接单与安全出行经验。", "mode": "offline", "access_level": "public", "rsvp_count": 13, "max_attendees": 18, "organizer": "CDMX Nomads", "tags": ["美食", "拉美", "社交"], "is_upcoming": true}], "discussions": [{"id": "visa-sea-2026", "title": "2026 东南亚长期停留签证怎么选?", "excerpt": "泰国 DTV、马来西亚 DE Rantau、印尼第二家园……大家最近实际办下来体验如何?", "author": "小林", "author_emoji": "🧳", "category": "签证", "reply_count": 23, "like_count": 47, "is_pinned": true, "created_at": "2026-08-20", "tags": ["签证", "东南亚"]}, {"id": "async-remote", "title": "异步团队怎么写日报才不烦人?", "excerpt": "我们团队跨 5 个时区,想收集团队节奏模板和工具推荐。", "author": "Marco", "author_emoji": "💻", "category": "远程工作", "reply_count": 15, "like_count": 31, "is_pinned": false, "created_at": "2026-08-22", "tags": ["远程", "协作"]}, {"id": "coliving-tips", "title": "第一次租 Coliving 必问房东的 10 个问题", "excerpt": "押金、网速、清洁、访客政策……欢迎补充你的踩坑经历。", "author": "阿静", "author_emoji": "🏡", "category": "住宿", "reply_count": 19, "like_count": 56, "is_pinned": false, "created_at": "2026-08-25", "tags": ["住宿", "经验"]}, {"id": "health-insurance", "title": "数字游民国际医疗保险对比", "excerpt": "SafetyWing、Genki、本地险……按年龄段和目的地聊聊性价比。", "author": "Yuki", "author_emoji": "🏥", "category": "安全", "reply_count": 11, "like_count": 28, "is_pinned": false, "created_at": "2026-08-27", "tags": ["保险", "安全"]}, {"id": "meetup-feedback", "title": "你希望 nomadro 线下活动开在哪些城市?", "excerpt": "我们在规划 Q4 活动路线,投票 + 留言告诉我们你的城市!", "author": "nomadro", "author_emoji": "🌍", "category": "社区", "reply_count": 34, "like_count": 72, "is_pinned": true, "created_at": "2026-08-28", "tags": ["活动", "投票"]}, {"id": "medellin-safety", "title": "麦德林哪些街区适合第一次长住?", "excerpt": "Laureles / Poblado / Envigado 的网速、噪音和夜间出行体验求分享。", "author": "Sofia", "author_emoji": "🌺", "category": "住宿", "reply_count": 17, "like_count": 41, "created_at": "2026-08-30", "tags": ["麦德林", "安全"]}, {"id": "tbilisi-bank", "title": "第比利斯开户与收美元的实操经验", "excerpt": "需要本地号码吗?Wise 能不能直接用?求最新流程。", "author": "Devon", "author_emoji": "🍷", "category": "财务", "reply_count": 14, "like_count": 36, "created_at": "2026-09-01", "tags": ["格鲁吉亚", "银行"]}, {"id": "berlin-winter", "title": "柏林冬天怎么保持产出和社交?", "excerpt": "日照短、天气冷,有没有室内运动 + meetup 推荐。", "author": "Ken", "author_emoji": "🎨", "category": "生活方式", "reply_count": 9, "like_count": 22, "created_at": "2026-09-02", "tags": ["柏林", "健康"]}, {"id": "dali-wifi", "title": "大理合租找房:网速坑位合集", "excerpt": "哪些区域光纤稳定?有没有房东靠谱名单。", "author": "Lina", "author_emoji": "📷", "category": "住宿", "reply_count": 21, "like_count": 48, "created_at": "2026-09-03", "tags": ["大理", "网速"]}, {"id": "dubai-summer", "title": "迪拜夏天还能正常远程办公吗?", "excerpt": "空调联合办公、作息调整和预算增加幅度求真实数据。", "author": "Omar", "author_emoji": "🏙️", "category": "生活方式", "reply_count": 8, "like_count": 19, "created_at": "2026-09-04", "tags": ["迪拜", "气候"]}, {"id": "seoul-visa", "title": "韩国 Workation 签证材料清单核对", "excerpt": "收入证明、保险、行程……有人最近过签吗?", "author": "Yuki", "author_emoji": "🇰🇷", "category": "签证", "reply_count": 12, "like_count": 33, "created_at": "2026-09-05", "tags": ["韩国", "签证"]}, {"id": "cowork-month-pass", "title": "各城市联合办公月票性价比对比", "excerpt": "清迈 / 里斯本 / 柏林 / 麦德林,欢迎贴价目与座位体验。", "author": "Alex", "author_emoji": "🚀", "category": "远程工作", "reply_count": 26, "like_count": 61, "created_at": "2026-09-06", "tags": ["办公", "成本"]}], "discussionDetails": {"visa-sea-2026": [{"id": "r1", "author": "阿Ken", "author_emoji": "🇹🇭", "content": "DTV 刚办下来,材料比想象中简单,关键是银行流水和远程工作证明。", "created_at": "2026-08-21", "like_count": 12}, {"id": "r2", "author": "Sara", "author_emoji": "🇲🇾", "content": "DE Rantau 审批大概 3 周,适合想待吉隆坡的。", "created_at": "2026-08-21", "like_count": 8}, {"id": "r3", "author": "Yuki", "author_emoji": "🇮🇩", "content": "巴厘岛短期用 B211A 足够,长期再看第二家园成本是否划算。", "created_at": "2026-08-22", "like_count": 6}], "async-remote": [{"id": "r1", "author": "Devon", "author_emoji": "🕐", "content": "我们用 Loom 录屏 + 简短文字摘要,比长日报友好很多。", "created_at": "2026-08-23", "like_count": 9}, {"id": "r2", "author": "Alex", "author_emoji": "🚀", "content": "模板三要素:昨天完成 / 今天计划 / 卡点,别写散文。", "created_at": "2026-08-23", "like_count": 11}], "coliving-tips": [{"id": "r1", "author": "小林", "author_emoji": "🧳", "content": "一定要问清押金退还条件和网速实测截图,别只看宣传。", "created_at": "2026-08-26", "like_count": 14}], "medellin-safety": [{"id": "r1", "author": "Alex", "author_emoji": "🌮", "content": "第一次建议 Laureles,生活成本与便利平衡;夜间少拿手机逛街。", "created_at": "2026-08-31", "like_count": 10}], "tbilisi-bank": [{"id": "r1", "author": "Omar", "author_emoji": "🏙️", "content": "先办本地 SIM 再去银行,材料准备护照+地址证明更顺利。", "created_at": "2026-09-01", "like_count": 7}], "dali-wifi": [{"id": "r1", "author": "阿静", "author_emoji": "🏡", "content": "才村/喜洲合租差别大,入住前用手机热点对照测速最靠谱。", "created_at": "2026-09-03", "like_count": 9}], "cowork-month-pass": [{"id": "r1", "author": "Marco", "author_emoji": "💻", "content": "里斯本月票大约 €150–250;清迈很多空间 ¥600–1000 就够用。", "created_at": "2026-09-06", "like_count": 15}], "health-insurance": [{"id": "r1", "author": "Sofia", "author_emoji": "🏥", "content": "30 岁以下 SafetyWing 够用;有慢性病建议加本地门诊险。", "created_at": "2026-08-28", "like_count": 10}, {"id": "r2", "author": "Ken", "author_emoji": "🇯🇵", "content": "在日本长期停留我叠了本地国民健康保险,报销更稳。", "created_at": "2026-08-28", "like_count": 7}], "meetup-feedback": [{"id": "r1", "author": "Lina", "author_emoji": "📷", "content": "大理 + 清迈希望能固定每月一场创作局。", "created_at": "2026-08-29", "like_count": 18}, {"id": "r2", "author": "Omar", "author_emoji": "🏙️", "content": "迪拜适合枢纽月见面,建议放周末早午餐。", "created_at": "2026-08-29", "like_count": 9}], "berlin-winter": [{"id": "r1", "author": "Devon", "author_emoji": "🖥️", "content": "冬天把联合办公当社交主场,再加一周一次室内攀岩/跑步局。", "created_at": "2026-09-02", "like_count": 11}], "dubai-summer": [{"id": "r1", "author": "Nina", "author_emoji": "🍷", "content": "夏天基本只在空调空间办公,预算里把交通和水电预留高一点。", "created_at": "2026-09-04", "like_count": 6}], "seoul-visa": [{"id": "r1", "author": "Jin", "author_emoji": "🇰🇷", "content": "最近材料重点是收入证明和保险;审批大约 3–6 周,建议提前办。", "created_at": "2026-09-05", "like_count": 8}]}, "course": [{"title": "启程:远程工作基础", "lessons": [{"title": "什么是数字游民", "duration": "8 分钟", "free": true}, {"title": "异步协作入门", "duration": "12 分钟", "free": true}, {"title": "时区与会议管理", "duration": "15 分钟", "free": false}]}, {"title": "签证与税务", "lessons": [{"title": "东南亚长期签证概览", "duration": "18 分钟", "free": false}, {"title": "183 天规则与税务居民", "duration": "14 分钟", "free": false}]}, {"title": "Homelab 与连接", "lessons": [{"title": "把家装进一个机柜", "duration": "20 分钟", "free": false}, {"title": "无论在哪都能连回家", "duration": "16 分钟", "free": false}]}], "lessons": {"0-0": {"title": "什么是数字游民", "moduleIndex": 0, "lessonIndex": 0, "duration": "8 分钟", "free": true, "content": "数字游民是一种工作方式:产出不绑定在某个地理坐标上。你可以在任何有网络的地方完成交付。"}, "0-1": {"title": "异步协作入门", "moduleIndex": 0, "lessonIndex": 1, "duration": "12 分钟", "free": true, "content": "异步沟通不是「随时在线」,而是「明确预期」:写清楚截止时间、交付物和决策人。"}, "0-2": {"title": "时区与会议管理", "moduleIndex": 0, "lessonIndex": 2, "duration": "15 分钟", "free": false, "content": "用 overlap 窗口安排会议,非重叠时段留给深度工作。工具箱里的「会议黄金时段」可以帮你算。"}, "1-0": {"title": "东南亚长期签证概览", "moduleIndex": 1, "lessonIndex": 0, "duration": "18 分钟", "free": false, "content": "泰国 DTV、马来西亚 DE Rantau、印尼第二家园……各国有不同的门槛与材料清单。"}, "1-1": {"title": "183 天规则与税务居民", "moduleIndex": 1, "lessonIndex": 1, "duration": "14 分钟", "free": false, "content": "多数国家用 183 天判定税务居民。用 nomadro 税居天数工具追踪停留。"}, "2-0": {"title": "把家装进一个机柜", "moduleIndex": 2, "lessonIndex": 0, "duration": "20 分钟", "free": false, "content": "Homelab 让你在旅途中拥有可控的 NAS、VPN 和开发环境。"}, "2-1": {"title": "无论在哪都能连回家", "moduleIndex": 2, "lessonIndex": 1, "duration": "16 分钟", "free": false, "content": "WireGuard + 动态 DNS,把家里的服务安全暴露给在外的你。"}}, "jobs": [{"id": "j1", "title": "Senior Frontend Engineer", "company": "Remote First Co", "location": "全球远程", "type": "全职", "salary": "$80k–120k", "tags": ["React", "TypeScript", "远程"], "url": "/gigs"}, {"id": "j2", "title": "DevOps / SRE", "company": "Nomad Labs", "location": "欧洲时区", "type": "合同", "salary": "€60–90/h", "tags": ["K8s", "AWS", "异步"], "url": "/gigs"}, {"id": "j3", "title": "内容运营(中文)", "company": "nomadro", "location": "东南亚友好", "type": "兼职", "salary": "面议", "tags": ["社区", "写作", "游民"], "url": "/gigs"}, {"id": "j4", "title": "Product Designer", "company": "Atlantic Remote", "location": "欧盟时区 ±3h", "type": "全职", "salary": "€55k–75k", "tags": ["Figma", "B2B", "远程"], "url": "/gigs"}, {"id": "j5", "title": "Growth Marketer", "company": "Hub Ventures", "location": "中东/欧洲友好", "type": "合同", "salary": "$4k–6k/月", "tags": ["SEO", "内容", "增长"], "url": "/gigs"}, {"id": "j6", "title": "Backend Engineer (Python)", "company": "Latam Cloud", "location": "北美时区", "type": "全职", "salary": "$90k–130k", "tags": ["Python", "FastAPI", "Postgres"], "url": "/gigs"}, {"id": "j7", "title": "Community Manager", "company": "nomadro", "location": "全球远程", "type": "兼职", "salary": "¥8k–12k/月", "tags": ["社区", "活动", "中英"], "url": "/gigs"}, {"id": "j8", "title": "Mobile Engineer (iOS/Android)", "company": "Seoul Soft", "location": "东亚时区", "type": "全职", "salary": "$70k–100k", "tags": ["Flutter", "移动端"], "url": "/gigs"}]};
+window.NOMADRO_DATA = {"brand": "nomadro", "tagline": "用一行代码环游世界", "offlineNote": "小红书小程序无法联网。本包为官网内容离线镜像,收藏/计划仅保存在本机。完整互动请打开 nomadweb.nomadro.com", "site": "https://nomadweb.nomadro.com", "stats": {"destinations": 12, "visas": 12, "meetups": 12, "blog": 10, "faqs": 6, "total_nomads": "35.6M", "countries": 195, "satisfaction": 87, "avg_cost": 79, "active_today": 127}, "ticker": ["🌴 小林 刚刚抵达清迈", "💻 Marco 在里斯本完成了 Sprint", "✈️ 今日新增 127 位游民出发", "🏝️ 巴厘岛 Co-working 今日 89% 满座", "📶 清迈平均网速 95Mbps", "🌅 东京远程工作者满意度 9.1", "🌺 Sofia 在麦德林办完本地 SIM", "🍷 Devon 把下一站设为第比利斯", "🎨 Ken 报名柏林开源 Meetup", "🏙️ Omar 从迪拜中转飞往里斯本", "📷 Lina 在大理发布本周创作日志", "🇰🇷 Yuki 实测首尔联合办公 220Mbps"], "rings": {"explore": [{"id": "destinations", "emoji": "🌴", "title": "目的地", "desc": "发现下一座城市"}, {"id": "visas", "emoji": "📋", "title": "签证指南", "desc": "远程友好签证"}, {"id": "matcher", "emoji": "🎯", "title": "智能匹配", "desc": "按预算气候排序"}, {"id": "compare", "emoji": "⚖️", "title": "城市对比", "desc": "并排看成本网速"}], "connect": [{"id": "meetups", "emoji": "🎉", "title": "游民活动", "desc": "同城与线上"}, {"id": "community", "emoji": "💬", "title": "社区讨论", "desc": "签证住宿经验"}, {"id": "voices", "emoji": "🗣️", "title": "游民心声", "desc": "真实旅居评价"}], "grow": [{"id": "digital", "emoji": "🎓", "title": "游民学院", "desc": "远程工作课程"}, {"id": "blog", "emoji": "📝", "title": "博客", "desc": "指南与攻略"}, {"id": "tools", "emoji": "🧰", "title": "工具箱", "desc": "费用估算等"}, {"id": "faq", "emoji": "❓", "title": "常见问题", "desc": "启动资金与保险"}]}, "lifestyle": [{"key": "morning", "emoji": "🌅", "title": "清晨", "body": "咖啡馆开机,时区对齐,列出今日三件交付。"}, {"key": "work", "emoji": "💻", "title": "深度工作", "body": "联合办公或家中安静角落,异步协作优先。"}, {"key": "explore", "emoji": "🚶", "title": "探索城市", "body": "傍晚散步、夜市与同城 meetup。"}, {"key": "collab", "emoji": "🤝", "title": "协作", "body": "和同行交换签证与住宿情报。"}, {"key": "social", "emoji": "🌙", "title": "社交", "body": "社区圆桌、兴趣局,或安静充电。"}], "planChecklist": [{"id": "visa", "label": "确认签证/停留天数"}, {"id": "flight", "label": "预订机票"}, {"id": "housing", "label": "首周短租/酒店"}, {"id": "sim", "label": "当地 SIM / eSIM"}, {"id": "cowork", "label": "踩点联合办公"}, {"id": "insurance", "label": "国际医疗保险"}, {"id": "budget", "label": "写下月预算"}, {"id": "meetup", "label": "报名一场同城活动"}], "destinations": [{"id": "1", "slug": "bali", "name": "巴厘岛", "country": "印尼", "emoji": "🏝️", "tag": "东南亚 · 热带天堂", "description": "乌布的数字游民社区闻名全球,稻田间的 Co-working Space 和瑜伽文化让这里成为游民圣地。", "region": "sea", "cost": 4500, "speed": 85, "temperature": 28, "rating": 9.2, "hue": 170, "nomads_count": "12,000+", "highlights": ["🏄 冲浪与海滩生活", "🧘 瑜伽冥想文化", "💰 东南亚性价比之王", "🌴 热带气候全年温暖"], "map_x": 720, "map_y": 310}, {"id": "2", "slug": "lisbon", "name": "里斯本", "country": "葡萄牙", "emoji": "🌊", "tag": "欧洲 · 海滨明珠", "description": "D7 签证友好,阳光海岸与悠久历史的完美融合,欧洲数字游民的首选基地。", "region": "europe", "cost": 9000, "speed": 120, "temperature": 22, "rating": 9.5, "hue": 220, "nomads_count": "8,500+", "highlights": ["📋 D7 签证门槛低", "☀️ 300天阳光", "🎵 Fado 音乐文化", "🚋 复古有轨电车"], "map_x": 430, "map_y": 195}, {"id": "3", "slug": "chiangmai", "name": "清迈", "country": "泰国", "emoji": "🏔️", "tag": "东南亚 · 文化古城", "description": "数字游民大本营,咖啡文化与夜市生活的天堂,全球性价比最高的游民城市。", "region": "sea", "cost": 3800, "speed": 95, "temperature": 30, "rating": 9.4, "hue": 45, "nomads_count": "15,000+", "highlights": ["☕ 咖啡馆文化浓厚", "🏮 夜市与寺庙", "💰 月生活费最低", "🤝 游民社区最活跃"], "map_x": 700, "map_y": 240}, {"id": "4", "slug": "mexico", "name": "墨西哥城", "country": "墨西哥", "emoji": "🌃", "tag": "拉美 · 活力之都", "description": "艺术、美食与科技交织,时区便利对接北美市场,拉美最具活力的游民城市。", "region": "latam", "cost": 6500, "speed": 75, "temperature": 18, "rating": 8.8, "hue": 300, "nomads_count": "5,200+", "highlights": ["🎨 街头艺术天堂", "🌮 世界美食之都", "🕐 北美时区友好", "💃 丰富夜生活"], "map_x": 220, "map_y": 240}, {"id": "5", "slug": "barcelona", "name": "巴塞罗那", "country": "西班牙", "emoji": "🏖️", "tag": "欧洲 · 地中海", "description": "高迪建筑与创业生态并存,Nomad Visa 政策领先,地中海生活的理想之选。", "region": "europe", "cost": 10500, "speed": 150, "temperature": 20, "rating": 9.1, "hue": 130, "nomads_count": "6,800+", "highlights": ["🏛️ 高迪建筑奇迹", "🏖️ 地中海海滩", "📋 Nomad Visa 便利", "🍷 美食与夜生活"], "map_x": 460, "map_y": 200}, {"id": "6", "slug": "tokyo", "name": "东京", "country": "日本", "emoji": "🗼", "tag": "亚洲 · 现代都市", "description": "极致效率与安全,适合追求高品质生活的远程工作者,亚洲科技之都。", "region": "asia", "cost": 12000, "speed": 200, "temperature": 15, "rating": 8.6, "hue": 10, "nomads_count": "4,100+", "highlights": ["🚄 极致公共交通", "🛡️ 全球最安全城市", "📶 网速亚洲第一", "🍣 美食文化巅峰"], "map_x": 820, "map_y": 210}, {"id": "7", "slug": "berlin", "name": "柏林", "country": "德国", "emoji": "🎨", "tag": "欧洲 · 创意之都", "description": "开放的创业与开源氛围,租金相对西欧友好,夜生活与艺术场景极具吸引力。", "region": "europe", "cost": 9800, "speed": 140, "temperature": 12, "rating": 8.9, "hue": 250, "nomads_count": "7,200+", "highlights": ["🎨 艺术与街头文化", "💻 创业生态活跃", "🚲 骑行友好", "🍺 社交场景丰富"], "map_x": 500, "map_y": 160}, {"id": "8", "slug": "dali", "name": "大理", "country": "中国", "emoji": "🏔️", "tag": "国内 · 慢生活", "description": "苍山洱海之间的内容创作者聚集地,生活节奏慢、社交松弛,适合深度创作与试住。", "region": "asia", "cost": 4200, "speed": 80, "temperature": 18, "rating": 8.7, "hue": 190, "nomads_count": "3,600+", "highlights": ["📷 内容创作友好", "🏞️ 自然风光", "🍵 咖啡馆密集", "🏡 合租成本低"], "map_x": 730, "map_y": 220}, {"id": "9", "slug": "seoul", "name": "首尔", "country": "韩国", "emoji": "🏙️", "tag": "亚洲 · 潮流都市", "description": "高速网络与深夜城市活力并存,适合对接东亚市场与产品迭代。", "region": "asia", "cost": 11000, "speed": 220, "temperature": 14, "rating": 8.5, "hue": 330, "nomads_count": "3,200+", "highlights": ["📶 全球顶尖网速", "🍜 美食与便利店文化", "🛍️ 潮流消费", "🚇 地铁覆盖极强"], "map_x": 800, "map_y": 200}, {"id": "10", "slug": "medellin", "name": "麦德林", "country": "哥伦比亚", "emoji": "🌺", "tag": "拉美 · 春城", "description": "四季如春、生活成本友好,英语游民社区成熟,适合北美时区远程工作。", "region": "latam", "cost": 5200, "speed": 90, "temperature": 23, "rating": 9.0, "hue": 140, "nomads_count": "6,400+", "highlights": ["🌤️ 四季如春", "💰 高性价比", "🕐 北美时区", "🤝 社区活动密集"], "map_x": 260, "map_y": 300}, {"id": "11", "slug": "dubai", "name": "迪拜", "country": "阿联酋", "emoji": "🏙️", "tag": "中东 · 枢纽都市", "description": "免税与签证便利吸引远程高收入人群,国际航班枢纽,适合中东/欧亚跳板。", "region": "asia", "cost": 14000, "speed": 180, "temperature": 32, "rating": 8.4, "hue": 40, "nomads_count": "4,800+", "highlights": ["🧾 税务友好", "✈️ 航线枢纽", "🏗️ 现代基础设施", "🌐 多元国际社区"], "map_x": 600, "map_y": 240}, {"id": "12", "slug": "tbilisi", "name": "第比利斯", "country": "格鲁吉亚", "emoji": "🍷", "tag": "欧亚 · 税务友好", "description": "1% 小企业税与远程友好签证,旧城氛围浓厚,东欧游民新基地。", "region": "europe", "cost": 4800, "speed": 70, "temperature": 16, "rating": 8.8, "hue": 15, "nomads_count": "5,100+", "highlights": ["🧾 1% 小企业税", "🏰 旧城与温泉", "🍷 葡萄酒文化", "💰 低生活成本"], "map_x": 560, "map_y": 190}], "visas": [{"id": "1", "country": "葡萄牙", "flag": "🇵🇹", "name": "葡萄牙 D7 签证", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "2年,可续签", "income_req": "€760/月", "approval_time": "3-6 个月", "extra": "🏥 可享欧盟医疗", "difficulty": 35, "difficulty_label": "简单"}, {"id": "2", "country": "西班牙", "flag": "🇪🇸", "name": "西班牙 Nomad Visa", "badge": "🔥 热门", "badge_type": "hot", "duration": "1年,可续3年", "income_req": "€2,160/月", "approval_time": "1-3 个月", "extra": "🌍 可申根区旅行", "difficulty": 45, "difficulty_label": "中等"}, {"id": "3", "country": "印尼", "flag": "🇮🇩", "name": "印尼 B211A 签证", "badge": "💰 低成本", "badge_type": "budget", "duration": "60天,可延期", "income_req": "约 ¥2,000", "approval_time": "5-10 天", "extra": "🏝️ 适合巴厘岛旅居", "difficulty": 25, "difficulty_label": "简单"}, {"id": "4", "country": "泰国", "flag": "🇹🇭", "name": "泰国 LTR 签证", "badge": "🆕 新政策", "badge_type": "new", "duration": "10年", "income_req": "$80,000/年", "approval_time": "1-2 个月", "extra": "✈️ 多次入境", "difficulty": 60, "difficulty_label": "中等"}, {"id": "5", "country": "墨西哥", "flag": "🇲🇽", "name": "墨西哥 Temporary Resident", "badge": "💰 低成本", "badge_type": "budget", "duration": "1-4年", "income_req": "$2,500/月", "approval_time": "2-4 周", "extra": "🌮 北美时区友好", "difficulty": 30, "difficulty_label": "简单"}, {"id": "6", "country": "爱沙尼亚", "flag": "🇪🇪", "name": "爱沙尼亚 DNV", "badge": "🚀 先锋", "badge_type": "pioneer", "duration": "1年", "income_req": "€3,504/月", "approval_time": "2-4 周", "extra": "💻 全球首个数字游民签证", "difficulty": 40, "difficulty_label": "中等"}, {"id": "7", "country": "格鲁吉亚", "flag": "🇬🇪", "name": "格鲁吉亚 Remotely from Georgia", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "1年", "income_req": "$2,000/月", "approval_time": "约 10 天", "extra": "🧾 可搭配小企业 1% 税", "difficulty": 28, "difficulty_label": "简单"}, {"id": "8", "country": "阿联酋", "flag": "🇦🇪", "name": "迪拜 Virtual Working Programme", "badge": "🔥 热门", "badge_type": "hot", "duration": "1年", "income_req": "$3,500/月", "approval_time": "2-4 周", "extra": "✈️ 中东航线枢纽", "difficulty": 42, "difficulty_label": "中等"}, {"id": "9", "country": "哥伦比亚", "flag": "🇨🇴", "name": "哥伦比亚 V Visa (Digital Nomad)", "badge": "💰 低成本", "badge_type": "budget", "duration": "最长 2 年", "income_req": "约 3× 最低工资", "approval_time": "2-6 周", "extra": "🌺 适合麦德林春城", "difficulty": 32, "difficulty_label": "简单"}, {"id": "10", "country": "韩国", "flag": "🇰🇷", "name": "韩国 Workation Visa (C-3-8)", "badge": "🆕 新政策", "badge_type": "new", "duration": "最长 2 年", "income_req": "约 $65,000/年", "approval_time": "1-2 个月", "extra": "🏙️ 对接首尔与济州", "difficulty": 55, "difficulty_label": "中等"}, {"id": "11", "country": "德国", "flag": "🇩🇪", "name": "德国 Freelance / Self-employment", "badge": "🚀 先锋", "badge_type": "pioneer", "duration": "1-3年", "income_req": "需商业计划与客户证明", "approval_time": "2-4 个月", "extra": "🎨 适合柏林自由职业", "difficulty": 65, "difficulty_label": "较难"}, {"id": "12", "country": "泰国", "flag": "🇹🇭", "name": "泰国 DTV 签证", "badge": "⭐ 推荐", "badge_type": "easy", "duration": "最长 5 年(多次入境)", "income_req": "约 50 万泰铢存款证明", "approval_time": "2-6 周", "extra": "🤝 远程工作友好", "difficulty": 38, "difficulty_label": "中等"}], "faqs": [{"id": "1", "question": "💰 做数字游民需要多少启动资金?", "order": 1, "answer": "建议准备 3-6 个月的生活费作为缓冲。以东南亚为例,¥15,000-30,000 即可开始。包括机票、首月住宿、签证费用和应急资金。欧洲目的地建议准备 ¥50,000 以上。"}, {"id": "2", "question": "📶 如何确保远程工作的网络稳定?", "order": 2, "answer": "选择网络评分高的城市,入住前用 Speedtest 测试。备用方案:本地 SIM 卡热点、随身 WiFi 设备、附近 Co-working Space。推荐携带 USB 网卡和 VPN 作为双保险。"}, {"id": "3", "question": "🏥 旅居期间的保险怎么办?", "order": 3, "answer": "推荐 SafetyWing 或 World Nomads 等国际医疗保险,月费约 $40-80,覆盖全球(部分国家除外)。长期旅居者可考虑目的地国家的本地保险,费用更低、报销更方便。"}, {"id": "4", "question": "🧾 税务问题如何处理?", "order": 4, "answer": "税务居民身份取决于居住天数(通常 183 天规则)。建议咨询专业税务顾问,了解双重征税协定。很多游民选择税务友好的国家(如葡萄牙、格鲁吉亚)作为基地。"}, {"id": "5", "question": "👨👩👧 可以带娃一起做数字游民吗?", "order": 5, "answer": "完全可以!巴厘岛、清迈、里斯本都有成熟的数字游民家庭社区。关键是选择教育资源丰富、医疗条件好的目的地,以及保持稳定的工作节奏,给孩子规律的生活。"}, {"id": "6", "question": "🤝 如何快速融入当地游民社区?", "order": 6, "answer": "加入 Nomad List、Facebook 群组和本地 Meetup 活动。入住游民友好的 Co-living 空间,参加每周的 Coworking 社交日。大部分游民社区非常开放,主动打招呼就能结识朋友。"}], "testimonials": [{"id": "1", "avatar": "👩💻", "content": "在清迈住了 8 个月,月花费不到 4000 元,但生活质量比国内一线城市高太多了。每天早上骑摩托去咖啡馆,这种感觉无法形容。", "author": "小林", "role": "前端开发 · 清迈 🇹🇭", "rating": 5}, {"id": "2", "avatar": "👨🎨", "content": "里斯本的 D7 签证让我在欧洲有了基地。白天在 Alfama 区的共享办公空间工作,周末去 Sintra 徒步,完美平衡。", "author": "Marco", "role": "UI 设计师 · 里斯本 🇵🇹", "rating": 5}, {"id": "3", "avatar": "🧑💼", "content": "带着家人做数字游民听起来疯狂,但在巴厘岛乌布,孩子们上国际学校,我和妻子远程工作,这是我们做过最正确的决定。", "author": "张家", "role": "产品经理 · 巴厘岛 🇮🇩", "rating": 5}, {"id": "4", "avatar": "👩🎨", "content": "麦德林四季如春,英语社区很活跃。我用北美时区接单,下午还能去公园运动,效率反而更高。", "author": "Sofia", "role": "自由职业设计 · 麦德林 🇨🇴", "rating": 5}, {"id": "5", "avatar": "👨💻", "content": "第比利斯生活成本低,还能开本地公司走 1% 税。旧城咖啡馆写代码,周末去卡兹别吉徒步,节奏很舒服。", "author": "Devon", "role": "DevOps · 第比利斯 🇬🇪", "rating": 5}, {"id": "6", "avatar": "📷", "content": "大理适合慢创作。合租便宜、风景治愈,但要主动找同频伙伴,别只待在民宿里。", "author": "Lina", "role": "内容创作者 · 大理 🇨🇳", "rating": 4}, {"id": "7", "avatar": "🧑🚀", "content": "柏林创业氛围强,开源 meetup 特别多。冬天冷、德语门槛真实存在,但找到圈子后很值得。", "author": "Ken", "role": "数据分析 · 柏林 🇩🇪", "rating": 4}, {"id": "8", "avatar": "🏙️", "content": "迪拜当跳板很香:航班方便、签证路径清晰。夏天太热,建议把深度工作时间放在室内联合办公。", "author": "Omar", "role": "增长顾问 · 迪拜 🇦🇪", "rating": 4}], "tools": [{"id": "1", "emoji": "💼", "name": "远程协作", "description": "Slack · Notion · Figma · Zoom", "tags": ["团队", "设计", "沟通"], "category": "work"}, {"id": "2", "emoji": "✈️", "name": "旅行规划", "description": "Skyscanner · Nomad List · SafetyWing", "tags": ["机票", "签证", "保险"], "category": "travel"}, {"id": "3", "emoji": "💳", "name": "财务管理", "description": "Wise · Revolut · Xero · 多币种账户", "tags": ["汇款", "记账", "税务"], "category": "finance"}, {"id": "4", "emoji": "🤝", "name": "社群网络", "description": "Nomad List · Remote Year · 本地 Meetup", "tags": ["社交", "活动", "合租"], "category": "connect"}, {"id": "5", "emoji": "🏥", "name": "健康保障", "description": "SafetyWing · World Nomads · 运动 App", "tags": ["保险", "健身", "心理"], "category": "health"}, {"id": "6", "emoji": "📚", "name": "持续学习", "description": "Coursera · Duolingo · 当地语言班", "tags": ["技能", "语言", "文化"], "category": "learn"}], "blog": [{"id": "1", "slug": "chiangmai-guide-2026", "title": "清迈数字游民完全指南 2026", "excerpt": "从签证到住宿,从咖啡馆到 Co-working,一篇搞定清迈旅居。", "emoji": "🏔️", "author": "nomadro", "published_at": "2026-01-15", "read_time": 8, "tags": ["清迈", "指南", "东南亚"]}, {"id": "2", "slug": "portugal-d7-visa", "title": "葡萄牙 D7 签证申请全攻略", "excerpt": "手把手教你申请欧洲最受欢迎的远程工作签证。", "emoji": "🇵🇹", "author": "nomadro", "published_at": "2026-02-03", "read_time": 12, "tags": ["签证", "葡萄牙", "欧洲"]}, {"id": "3", "slug": "nomad-tax-basics", "title": "数字游民税务入门:你需要知道的 5 件事", "excerpt": "183 天规则、双重征税、税务居民身份——一文理清。", "emoji": "🧾", "author": "nomadro", "published_at": "2026-02-20", "read_time": 10, "tags": ["税务", "法律", "指南"]}, {"id": "4", "slug": "medellin-spring-city", "title": "麦德林春城试住 30 天笔记", "excerpt": "时区、安全区、联合办公与西语社区初体验。", "emoji": "🌺", "author": "Sofia", "published_at": "2026-03-05", "read_time": 9, "tags": ["麦德林", "拉美", "试住"]}, {"id": "5", "slug": "tbilisi-tax-base", "title": "第比利斯当税务基地靠谱吗?", "excerpt": "远程签证、小企业税与旧城生活成本实测。", "emoji": "🍷", "author": "Devon", "published_at": "2026-03-18", "read_time": 11, "tags": ["格鲁吉亚", "税务", "欧洲"]}, {"id": "6", "slug": "dali-slow-create", "title": "大理慢创作:合租、网速与社群", "excerpt": "国内游民城市怎么住得久又不散漫。", "emoji": "🏔️", "author": "Lina", "published_at": "2026-04-02", "read_time": 7, "tags": ["大理", "内容", "国内"]}, {"id": "7", "slug": "berlin-startup-nomad", "title": "柏林自由职业与开源社群指南", "excerpt": "签证路径、共享办公与每周活动清单。", "emoji": "🎨", "author": "Ken", "published_at": "2026-04-20", "read_time": 10, "tags": ["柏林", "创业", "开源"]}, {"id": "8", "slug": "dubai-hub-month", "title": "迪拜一个月跳板旅居怎么排期", "excerpt": "签证、炎热季节、航班中转与办公点选择。", "emoji": "🏙️", "author": "Omar", "published_at": "2026-05-01", "read_time": 8, "tags": ["迪拜", "中东", "枢纽"]}, {"id": "9", "slug": "seoul-workation", "title": "首尔 Workation:网速、便利与成本", "excerpt": "C-3-8 签证与江南区办公踩点。", "emoji": "🏙️", "author": "Yuki", "published_at": "2026-05-16", "read_time": 9, "tags": ["首尔", "韩国", "网速"]}, {"id": "10", "slug": "first-month-checklist", "title": "旅居第一月清单:从落地到稳定输出", "excerpt": "SIM、短租、联合办公、社群与预算五步走。", "emoji": "✅", "author": "nomadro", "published_at": "2026-06-01", "read_time": 6, "tags": ["清单", "新手", "落地"]}], "blogContent": {"chiangmai-guide-2026": "## 为什么选择清迈?\n\n清迈是公认的全球数字游民之都。低廉的生活成本、完善的 Co-working 生态、友善的本地人和丰富的文化活动,让它成为新手游民的最佳起点。\n\n## 签证方案\n\n- **旅游签**:落地签 15 天,或提前办旅游签 60 天\n- **DTV 签证**:2024 年推出的 Destination Thailand Visa,适合远程工作者\n- **学生签/精英签**:长期旅居的进阶选择\n\n## 住宿推荐\n\n| 区域 | 月租 | 特点 |\n|------|------|------|\n| Nimman | ¥2,500-4,000 | 咖啡馆、餐厅、年轻人多 |\n| Old City | ¥1,500-3,000 | 文化氛围浓,步行可达寺庙 |\n| Hang Dong | ¥2,000-3,500 | 安静,适合深度工作 |\n\n## 最佳 Co-working\n\n1. **Punspace** — Nimman 区经典,日票 ¥60\n2. **CAMP** — Maya 商场顶楼,免费(消费即可)\n3. **Hub53** — 安静专业,月票 ¥800\n\n## 月均预算\n\n- 住宿:¥2,500\n- 餐饮:¥1,200\n- 交通:¥300(租摩托)\n- Co-working:¥400\n- 其他:¥400\n- **合计:约 ¥3,800-4,500**\n\n## 实用 Tips\n\n☕ 推荐咖啡馆:Ristr8to(世界冠军)、Graph One Nimman\n🏍️ 租摩托月费约 ¥400,注意戴头盔\n📱 推荐 AIS 或 TrueMove 无限流量套餐\n🤝 每周四有 Nomad Meetup,关注 Facebook 群组", "portugal-d7-visa": "## D7 签证是什么?\n\n葡萄牙 D7 签证(Passive Income Visa)最初为退休者设计,但因收入要求低、审批相对简单,成为数字游民进入欧盟的最佳通道之一。\n\n## 申请条件\n\n- 月收入不低于 **€760**(葡萄牙最低工资)\n- 银行存款建议 **€9,120+**(12个月生活费)\n- 无犯罪记录\n- 葡萄牙本地银行账户\n- 健康保险\n\n## 申请流程\n\n1. **准备材料**(2-4 周)\n - 护照、照片、收入证明、银行流水\n - 葡萄牙税号(NIF)\n - 住宿证明(租房合同或酒店预订)\n\n2. **递交申请**\n - 在中国:葡萄牙驻华使馆\n - 或入境葡萄牙后转居留许可\n\n3. **等待审批**(3-6 个月)\n\n4. **登陆葡萄牙**\n - 领取居留卡\n - 登记住址\n\n## 费用预算\n\n- 签证费:约 €90\n- 律师费(可选):€500-1,500\n- NIF + 银行开户:€200-300\n- 首月生活费:€800-1,200\n\n## 里斯本生活成本\n\n- 一居室公寓:€800-1,200/月\n- Co-working:€150-250/月\n- 餐饮:€300-500/月\n- **月均总花费:€1,200-1,800**\n\n## 常见问题\n\n**Q: D7 可以工作吗?**\nA: 可以远程为海外雇主工作,但不能在葡萄牙本地公司就职。\n\n**Q: 5年后能拿护照吗?**\nA: 满足居住要求后可以申请永居或入籍。", "nomad-tax-basics": "## 1. 什么是税务居民?\n\n大多数国家用 **183 天规则** 判定税务居民:在一个自然年内居住超过 183 天,即成为该国税务居民,需在该国申报全球收入。\n\n## 2. 双重征税怎么办?\n\n如果两个国家都认为你是税务居民,查 **双边税收协定**(DTA)。中国已与 100+ 国家签署 DTA,可避免重复缴税。\n\n## 3. 数字游民常见税务策略\n\n| 策略 | 说明 | 适合人群 |\n|------|------|----------|\n| 零税务居民 | 不在任何国家住满 183 天 | 短期旅居者 |\n| 税务友好国 | 葡萄牙 NHR、格鲁吉亚 1% 税 | 长期旅居者 |\n| 原籍国申报 | 回国期间申报 | 兼职游民 |\n\n## 4. 中国税务居民注意\n\n- 中国公民默认是中国税务居民(全球征税)\n- 海外收入也需申报(可抵免境外已缴税)\n- 建议咨询专业税务师\n\n## 5. 实用建议\n\n1. 📋 记录每个国家的入境/出境日期\n2. 🧾 保留所有收入凭证和银行流水\n3. 🏦 使用 Wise 等工具便于跨境汇款记录\n4. 👨💼 收入超过一定金额建议聘请税务顾问\n5. 📱 推荐工具:Xero(记账)、TaxScouts(报税)", "medellin-spring-city": "## 为什么麦德林?\n\n四季如春、生活成本可控,且贴近北美时区,适合接美加客户。Laureles / El Poblado 是游民常见落脚区。\n\n## 30 天试住建议\n\n1. 前 7 天住短租,实测网速与噪音\n2. 办本地 SIM,备份热点\n3. 参加 2 场线下 meetup,验证社区匹配度\n4. 确定联合办公月票再签长租\n\n## 预算参考(月)\n\n- 住宿:¥2,000–3,500\n- 餐饮:¥1,200–1,800\n- 交通:¥300–500\n- 办公:¥400–800", "tbilisi-tax-base": "## 远程签证 + 小企业税\n\n格鲁吉亚对远程工作者友好,许多人会评估本地公司与 1% 税路径(需自行核实最新政策)。\n\n## 生活感受\n\n旧城与 Vake 区咖啡馆多,适合深度工作;冬季偏冷,夏天舒服。\n\n## 注意\n\n- 银行开户与本地手机号流程可能变动\n- 税务方案务必咨询持证顾问\n- 把「试住 30 天」和「税务落地」分开决策", "dali-slow-create": "## 适合谁\n\n内容创作者、独立开发者、想放慢节奏但仍保持产出的人。\n\n## 实操建议\n\n- 合租优先选稳定 WiFi 与独立工作桌\n- 用固定作息对抗「度假感」\n- 主动加入本地创作者局,避免社交孤岛\n\n## 成本\n\n月生活费常可控制在 ¥3,500–5,000,视合租与出行频率而定。", "berlin-startup-nomad": "## 柏林为什么吸引游民\n\n开源、设计、创业活动密度高,共享办公选择多。\n\n## 落地要点\n\n- 提前规划居留/自由职业路径\n- 冬天日照短,准备补光与室内运动\n- 德语不是必须,但能明显提升生活便利\n\n## 每周节奏\n\n2 天联合办公 + 1 场 meetup + 周末短途,比纯咖啡馆更稳。", "dubai-hub-month": "## 适合当跳板\n\n国际航班密集,签证路径相对清晰,适合中东/欧亚中转月。\n\n## 炎热季节\n\n夏季高温,深度工作尽量安排在空调联合办公;户外活动放早晚。\n\n## 预算\n\n整体偏高,建议按「枢纽月」而非「低成本旅居」来规划。", "seoul-workation": "## 网速与便利\n\n首尔网速与城市便利度极强,适合需要高频协作的产品/工程角色。\n\n## 成本与节奏\n\n住宿与餐饮成本接近一线城市;用便利店与共享办公控制变量。\n\n## 签证\n\n关注 Workation / 相关短期远程路径的最新材料要求。", "first-month-checklist": "## 落地五步\n\n1. **连接**:落地办 SIM,测公寓与办公点网速\n2. **住处**:先短租 7–14 天,再决定长租\n3. **办公**:固定 1 个主点 + 2 个备份咖啡馆\n4. **社群**:报名 1 场 meetup,加 1 个本地群\n5. **预算**:用第一周真实账单校准月预算\n\n## 输出稳定\n\n每天保护 4 小时深度工作,旅行探索放在下午后段。"}, "meetups": [{"id": "online-roundtable", "title": "远程工作节奏圆桌", "city": "线上", "destination_slug": "", "emoji": "🎙️", "date": "2026-09-12", "time": "20:00", "venue": "nomadro 线上活动厅", "description": "聊聊异步协作、时区管理和旅居城市选择。登录后可 RSVP,活动前会收到提醒。", "mode": "online", "access_level": "public", "rsvp_count": 38, "max_attendees": 80, "organizer": "nomadro 社区", "tags": ["远程", "协作", "新手友好"], "is_upcoming": true}, {"id": "chiangmai-cowork", "title": "清迈联合办公下午茶", "city": "清迈", "destination_slug": "chiangmai", "emoji": "☕", "date": "2026-09-18", "time": "15:00", "venue": "Nimman 区 Co-working", "description": "一起办公、分享签证经验和住宿踩坑。线下为主,也开放线上旁听链接。", "mode": "hybrid", "access_level": "public", "rsvp_count": 14, "max_attendees": 24, "organizer": "清迈游民小组", "tags": ["线下", "社交", "东南亚"], "is_upcoming": true}, {"id": "lisbon-sunset", "title": "里斯本日落漫步", "city": "里斯本", "destination_slug": "lisbon", "emoji": "🌅", "date": "2026-09-22", "time": "18:30", "venue": "Miradouro 观景点集合", "description": "工作一周后,和同城游民一起看日落、交换欧洲签证情报。", "mode": "offline", "access_level": "public", "rsvp_count": 9, "max_attendees": 16, "organizer": "Lisbon Nomads", "tags": ["欧洲", "户外", "社交"], "is_upcoming": true}, {"id": "bali-surf-morning", "title": "巴厘岛晨间冲浪 + 办公", "city": "巴厘岛", "destination_slug": "bali", "emoji": "🏄", "date": "2026-10-05", "time": "07:00", "venue": "Canggu Beach", "description": "早起冲浪,10 点回咖啡馆集中办公。适合想体验 Work-Life 平衡的游民。", "mode": "offline", "access_level": "public", "rsvp_count": 11, "max_attendees": 20, "organizer": "Bali Remote Crew", "tags": ["运动", "生活方式"], "is_upcoming": true}, {"id": "tokyo-tax-talk", "title": "日本税务与居留线上分享", "city": "线上", "destination_slug": "tokyo", "emoji": "🧾", "date": "2026-10-12", "time": "19:30", "venue": "线上直播", "description": "特邀长期旅居日本的游民分享税务申报、保险和银行开户经验(非法律建议)。", "mode": "online", "access_level": "members", "rsvp_count": 52, "max_attendees": 120, "organizer": "nomadro 社区", "tags": ["税务", "日本", "干货"], "is_upcoming": true}, {"id": "berlin-opensource", "title": "柏林开源与 DevOps 夜谈", "city": "柏林", "destination_slug": "berlin", "emoji": "🖥️", "date": "2026-09-28", "time": "19:00", "venue": "Kreuzberg Co-working", "description": "分享自托管、CI 与远程团队协作实践,会后可继续社交。", "mode": "hybrid", "access_level": "public", "rsvp_count": 22, "max_attendees": 40, "organizer": "Berlin Remote", "tags": ["开源", "技术", "欧洲"], "is_upcoming": true}, {"id": "dali-create-walk", "title": "大理洱海创作散步", "city": "大理", "destination_slug": "dali", "emoji": "📷", "date": "2026-10-02", "time": "16:00", "venue": "才村码头集合", "description": "边走边拍,分享内容选题与变现路径,适合创作者与慢旅居者。", "mode": "offline", "access_level": "public", "rsvp_count": 8, "max_attendees": 18, "organizer": "大理创作者局", "tags": ["内容", "户外", "国内"], "is_upcoming": true}, {"id": "medellin-spanish", "title": "麦德林西语咖啡局", "city": "麦德林", "destination_slug": "medellin", "emoji": "☕", "date": "2026-10-08", "time": "10:30", "venue": "Laureles 咖啡馆", "description": "初级西语练习 + 安全区与租房情报交换,新手友好。", "mode": "offline", "access_level": "public", "rsvp_count": 16, "max_attendees": 20, "organizer": "Medellín Nomads", "tags": ["语言", "拉美", "社交"], "is_upcoming": true}, {"id": "seoul-night-office", "title": "首尔深夜联合办公", "city": "首尔", "destination_slug": "seoul", "emoji": "🌃", "date": "2026-10-15", "time": "21:00", "venue": "江南共享办公", "description": "适合东亚时区冲刺交付的游民,自带电脑即可。", "mode": "offline", "access_level": "public", "rsvp_count": 12, "max_attendees": 25, "organizer": "Seoul Workation", "tags": ["办公", "韩国", "效率"], "is_upcoming": true}, {"id": "dubai-hub-brunch", "title": "迪拜枢纽早午餐", "city": "迪拜", "destination_slug": "dubai", "emoji": "🥂", "date": "2026-10-18", "time": "11:00", "venue": "Downtown 咖啡厅", "description": "中转游民见面:签证、航班与下一站城市选择。", "mode": "offline", "access_level": "public", "rsvp_count": 10, "max_attendees": 16, "organizer": "Dubai Hub Crew", "tags": ["中东", "社交", "跳板"], "is_upcoming": true}, {"id": "tbilisi-tax-cafe", "title": "第比利斯税务咖啡聊", "city": "第比利斯", "destination_slug": "tbilisi", "emoji": "🍷", "date": "2026-10-22", "time": "15:00", "venue": "Vake 区咖啡馆", "description": "交流远程签证与本地公司实务(非正式法律意见),会后可徒步旧城。", "mode": "offline", "access_level": "members", "rsvp_count": 19, "max_attendees": 22, "organizer": "Tbilisi Base", "tags": ["税务", "欧洲", "干货"], "is_upcoming": true}, {"id": "mexico-food-walk", "title": "墨西哥城街头美食漫步", "city": "墨西哥城", "destination_slug": "mexico", "emoji": "🌮", "date": "2026-10-26", "time": "17:30", "venue": "Roma Norte 集合", "description": "边吃边聊北美时区接单与安全出行经验。", "mode": "offline", "access_level": "public", "rsvp_count": 13, "max_attendees": 18, "organizer": "CDMX Nomads", "tags": ["美食", "拉美", "社交"], "is_upcoming": true}], "discussions": [{"id": "visa-sea-2026", "title": "2026 东南亚长期停留签证怎么选?", "excerpt": "泰国 DTV、马来西亚 DE Rantau、印尼第二家园……大家最近实际办下来体验如何?", "author": "小林", "author_emoji": "🧳", "category": "签证", "reply_count": 23, "like_count": 47, "is_pinned": true, "created_at": "2026-08-20", "tags": ["签证", "东南亚"]}, {"id": "async-remote", "title": "异步团队怎么写日报才不烦人?", "excerpt": "我们团队跨 5 个时区,想收集团队节奏模板和工具推荐。", "author": "Marco", "author_emoji": "💻", "category": "远程工作", "reply_count": 15, "like_count": 31, "is_pinned": false, "created_at": "2026-08-22", "tags": ["远程", "协作"]}, {"id": "coliving-tips", "title": "第一次租 Coliving 必问房东的 10 个问题", "excerpt": "押金、网速、清洁、访客政策……欢迎补充你的踩坑经历。", "author": "阿静", "author_emoji": "🏡", "category": "住宿", "reply_count": 19, "like_count": 56, "is_pinned": false, "created_at": "2026-08-25", "tags": ["住宿", "经验"]}, {"id": "health-insurance", "title": "数字游民国际医疗保险对比", "excerpt": "SafetyWing、Genki、本地险……按年龄段和目的地聊聊性价比。", "author": "Yuki", "author_emoji": "🏥", "category": "安全", "reply_count": 11, "like_count": 28, "is_pinned": false, "created_at": "2026-08-27", "tags": ["保险", "安全"]}, {"id": "meetup-feedback", "title": "你希望 nomadro 线下活动开在哪些城市?", "excerpt": "我们在规划 Q4 活动路线,投票 + 留言告诉我们你的城市!", "author": "nomadro", "author_emoji": "🌍", "category": "社区", "reply_count": 34, "like_count": 72, "is_pinned": true, "created_at": "2026-08-28", "tags": ["活动", "投票"]}, {"id": "medellin-safety", "title": "麦德林哪些街区适合第一次长住?", "excerpt": "Laureles / Poblado / Envigado 的网速、噪音和夜间出行体验求分享。", "author": "Sofia", "author_emoji": "🌺", "category": "住宿", "reply_count": 17, "like_count": 41, "created_at": "2026-08-30", "tags": ["麦德林", "安全"]}, {"id": "tbilisi-bank", "title": "第比利斯开户与收美元的实操经验", "excerpt": "需要本地号码吗?Wise 能不能直接用?求最新流程。", "author": "Devon", "author_emoji": "🍷", "category": "财务", "reply_count": 14, "like_count": 36, "created_at": "2026-09-01", "tags": ["格鲁吉亚", "银行"]}, {"id": "berlin-winter", "title": "柏林冬天怎么保持产出和社交?", "excerpt": "日照短、天气冷,有没有室内运动 + meetup 推荐。", "author": "Ken", "author_emoji": "🎨", "category": "生活方式", "reply_count": 9, "like_count": 22, "created_at": "2026-09-02", "tags": ["柏林", "健康"]}, {"id": "dali-wifi", "title": "大理合租找房:网速坑位合集", "excerpt": "哪些区域光纤稳定?有没有房东靠谱名单。", "author": "Lina", "author_emoji": "📷", "category": "住宿", "reply_count": 21, "like_count": 48, "created_at": "2026-09-03", "tags": ["大理", "网速"]}, {"id": "dubai-summer", "title": "迪拜夏天还能正常远程办公吗?", "excerpt": "空调联合办公、作息调整和预算增加幅度求真实数据。", "author": "Omar", "author_emoji": "🏙️", "category": "生活方式", "reply_count": 8, "like_count": 19, "created_at": "2026-09-04", "tags": ["迪拜", "气候"]}, {"id": "seoul-visa", "title": "韩国 Workation 签证材料清单核对", "excerpt": "收入证明、保险、行程……有人最近过签吗?", "author": "Yuki", "author_emoji": "🇰🇷", "category": "签证", "reply_count": 12, "like_count": 33, "created_at": "2026-09-05", "tags": ["韩国", "签证"]}, {"id": "cowork-month-pass", "title": "各城市联合办公月票性价比对比", "excerpt": "清迈 / 里斯本 / 柏林 / 麦德林,欢迎贴价目与座位体验。", "author": "Alex", "author_emoji": "🚀", "category": "远程工作", "reply_count": 26, "like_count": 61, "created_at": "2026-09-06", "tags": ["办公", "成本"]}], "discussionDetails": {}, "course": [{"title": "启程:远程工作基础", "lessons": [{"title": "什么是数字游民", "duration": "8 分钟", "free": true}, {"title": "异步协作入门", "duration": "12 分钟", "free": true}, {"title": "时区与会议管理", "duration": "15 分钟", "free": false}]}, {"title": "签证与税务", "lessons": [{"title": "东南亚长期签证概览", "duration": "18 分钟", "free": false}, {"title": "183 天规则与税务居民", "duration": "14 分钟", "free": false}]}, {"title": "Homelab 与连接", "lessons": [{"title": "把家装进一个机柜", "duration": "20 分钟", "free": false}, {"title": "无论在哪都能连回家", "duration": "16 分钟", "free": false}]}], "lessons": {"0-0": {"title": "什么是数字游民", "moduleIndex": 0, "lessonIndex": 0, "duration": "8 分钟", "free": true, "content": "数字游民是一种工作方式:产出不绑定在某个地理坐标上。你可以在任何有网络的地方完成交付。"}, "0-1": {"title": "异步协作入门", "moduleIndex": 0, "lessonIndex": 1, "duration": "12 分钟", "free": true, "content": "异步沟通不是「随时在线」,而是「明确预期」:写清楚截止时间、交付物和决策人。"}, "0-2": {"title": "时区与会议管理", "moduleIndex": 0, "lessonIndex": 2, "duration": "15 分钟", "free": false, "content": "用 overlap 窗口安排会议,非重叠时段留给深度工作。工具箱里的「会议黄金时段」可以帮你算。"}, "1-0": {"title": "东南亚长期签证概览", "moduleIndex": 1, "lessonIndex": 0, "duration": "18 分钟", "free": false, "content": "泰国 DTV、马来西亚 DE Rantau、印尼第二家园……各国有不同的门槛与材料清单。"}, "1-1": {"title": "183 天规则与税务居民", "moduleIndex": 1, "lessonIndex": 1, "duration": "14 分钟", "free": false, "content": "多数国家用 183 天判定税务居民。用 nomadro 税居天数工具追踪停留。"}, "2-0": {"title": "把家装进一个机柜", "moduleIndex": 2, "lessonIndex": 0, "duration": "20 分钟", "free": false, "content": "Homelab 让你在旅途中拥有可控的 NAS、VPN 和开发环境。"}, "2-1": {"title": "无论在哪都能连回家", "moduleIndex": 2, "lessonIndex": 1, "duration": "16 分钟", "free": false, "content": "WireGuard + 动态 DNS,把家里的服务安全暴露给在外的你。"}}, "jobs": [{"id": "j1", "title": "Senior Frontend Engineer", "company": "Remote First Co", "location": "全球远程", "type": "全职", "salary": "$80k–120k", "tags": ["React", "TypeScript", "远程"], "url": "/gigs"}, {"id": "j2", "title": "DevOps / SRE", "company": "Nomad Labs", "location": "欧洲时区", "type": "合同", "salary": "€60–90/h", "tags": ["K8s", "AWS", "异步"], "url": "/gigs"}, {"id": "j3", "title": "内容运营(中文)", "company": "nomadro", "location": "东南亚友好", "type": "兼职", "salary": "面议", "tags": ["社区", "写作", "游民"], "url": "/gigs"}, {"id": "j4", "title": "Product Designer", "company": "Atlantic Remote", "location": "欧盟时区 ±3h", "type": "全职", "salary": "€55k–75k", "tags": ["Figma", "B2B", "远程"], "url": "/gigs"}, {"id": "j5", "title": "Growth Marketer", "company": "Hub Ventures", "location": "中东/欧洲友好", "type": "合同", "salary": "$4k–6k/月", "tags": ["SEO", "内容", "增长"], "url": "/gigs"}, {"id": "j6", "title": "Backend Engineer (Python)", "company": "Latam Cloud", "location": "北美时区", "type": "全职", "salary": "$90k–130k", "tags": ["Python", "FastAPI", "Postgres"], "url": "/gigs"}, {"id": "j7", "title": "Community Manager", "company": "nomadro", "location": "全球远程", "type": "兼职", "salary": "¥8k–12k/月", "tags": ["社区", "活动", "中英"], "url": "/gigs"}, {"id": "j8", "title": "Mobile Engineer (iOS/Android)", "company": "Seoul Soft", "location": "东亚时区", "type": "全职", "salary": "$70k–100k", "tags": ["Flutter", "移动端"], "url": "/gigs"}]};
diff --git a/redmini/tool/index.html b/redmini/tool/index.html
index a1d639d..8186bd2 100644
--- a/redmini/tool/index.html
+++ b/redmini/tool/index.html
@@ -3,40 +3,49 @@
- nomadro · 数字游民
-
+
+ nomadro · 数字游民旅居指南
+
+
-
-
-
-
-
-
- 🏠 首页
- 🧭 探索
- 🤝 连接
- 🌱 成长
- 👤 我的
-
-
-
-
-
-
+
+ 离线镜像 · 样式与结构同步官网 H5 · 数据为本机快照 · 完整互动请打开 nomadweb.nomadro.com
+
+
←
diff --git a/redmini/tool/nomadro.css b/redmini/tool/nomadro.css
new file mode 100644
index 0000000..8a5206b
--- /dev/null
+++ b/redmini/tool/nomadro.css
@@ -0,0 +1,12011 @@
+/* Mirror of frontend/src/app/globals.css (Chrome61 sanitized for XHS offline) */
+/* ===== CSS Variables & Reset ===== */
+:root {
+ --bg-primary: #0a0e17;
+ --bg-secondary: #111827;
+ --bg-card: rgba(17, 24, 39, 0.7);
+ --bg-glass: rgba(255, 255, 255, 0.05);
+ --text-primary: #f1f5f9;
+ --text-secondary: #94a3b8;
+ --text-muted: #64748b;
+ --accent-1: #FF6B6B;
+ --accent-2: #FFE66D;
+ --accent-3: #4ECDC4;
+ --accent-4: #A78BFA;
+ --gradient-main: linear-gradient(135deg, #FF6B6B, #FFE66D, #4ECDC4);
+ --gradient-text: linear-gradient(135deg, #FF6B6B 0%, #FFE66D 50%, #4ECDC4 100%);
+ --shadow-glow: 0 0 40px rgba(78, 205, 196, 0.15);
+ --shadow-card: 0 8px 32px rgba(0, 0, 0, 0.3);
+ --border-glass: 1px solid rgba(255, 255, 255, 0.08);
+ --radius-sm: 8px;
+ --radius-md: 16px;
+ --radius-lg: 24px;
+ --radius-xl: 32px;
+ --font-display: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", sans-serif;
+ --font-body: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", sans-serif;
+ --nav-height: 72px;
+ --transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+[data-theme="light"] {
+ --bg-primary: #f8fafc;
+ --bg-secondary: #ffffff;
+ --bg-card: rgba(255, 255, 255, 0.85);
+ --bg-glass: rgba(0, 0, 0, 0.03);
+ --text-primary: #0f172a;
+ --text-secondary: #475569;
+ --text-muted: #94a3b8;
+ --shadow-glow: 0 0 40px rgba(78, 205, 196, 0.1);
+ --shadow-card: 0 8px 32px rgba(0, 0, 0, 0.08);
+ --border-glass: 1px solid rgba(0, 0, 0, 0.06);
+}
+
+/*
+ * MUST stay in @layer base. Unlayered * { padding:0; margin:0 } beats
+ * Tailwind @layer utilities (px-12 / mx-auto), which zeroed ebook paper
+ * padding and broke reader centering.
+ */
+
+ *, *::before, *::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+
+
+html {
+ scroll-behavior: smooth;
+ scroll-padding-top: var(--nav-height);
+}
+
+/* Ebook routes: don't steal sticky chrome or pad for main nav */
+
+
+body {
+ font-family: var(--font-body);
+ background: var(--bg-primary);
+ color: var(--text-primary);
+ line-height: 1.6;
+ overflow-x: hidden;
+ transition: background var(--transition), color var(--transition);
+}
+
+/*
+ * ?????? overflow-x: hidden|clip ???? sticky ??
+ *????????????????? ?? ??????????
+ * ebook ?? html/body ?? visible?
+ */
+
+
+
+a {
+ text-decoration: none;
+ color: inherit;
+}
+
+img { max-width: 100%; display: block; }
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 24px;
+}
+
+/* ===== Particle Canvas ===== */
+#particle-canvas {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 0;
+ pointer-events: none;
+}
+
+/* ===== Navbar ===== */
+.navbar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: var(--nav-height);
+ z-index: 1000;
+ transition: all var(--transition);
+ background: transparent;
+}
+
+.navbar.scrolled {
+ background: rgba(10, 14, 23, 0.85);
+ backdrop-filter: blur(20px);
+ border-bottom: var(--border-glass);
+ box-shadow: 0 4px 30px rgba(0, 0, 0, 0.2);
+}
+
+[data-theme="light"] .navbar.scrolled {
+ background: rgba(248, 250, 252, 0.9);
+}
+
+.nav-container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 24px;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ gap: 16px;
+}
+
+.nav-container > .logo {
+ flex-shrink: 0;
+}
+
+.nav-container > .nav-links {
+ flex: 1;
+ justify-content: center;
+ min-width: 0;
+}
+
+.nav-utils {
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ gap: 8px;
+ margin-left: auto;
+ flex-shrink: 0;
+}
+
+.nav-utils .nav-lang-btn,
+.nav-utils .nav-cta,
+.nav-utils .nav-notify {
+ flex-shrink: 0;
+}
+
+.nav-utils .nav-cta {
+ width: 36px;
+ height: 36px;
+ font-size: 1.05rem;
+}
+
+.nav-notify-guest {
+ opacity: 0.85;
+}
+
+.logo {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-family: var(--font-display);
+ font-weight: 800;
+ font-size: 1.35rem;
+ letter-spacing: -0.02em;
+}
+
+.logo span {
+ background: linear-gradient(135deg, #FF6B6B, #FFE66D, #4ECDC4);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.logo-icon {
+ width: 36px;
+ height: 36px;
+ animation: logoSpin 20s linear infinite;
+ flex-shrink: 0;
+}
+
+@keyframes logoSpin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+.nav-links {
+ display: flex;
+ gap: 8px;
+}
+
+.nav-links a {
+ padding: 8px 16px;
+ border-radius: var(--radius-sm);
+ font-size: 0.9rem;
+ font-weight: 500;
+ color: var(--text-secondary);
+ transition: all var(--transition);
+}
+
+.nav-links a:hover {
+ color: var(--text-primary);
+ background: var(--bg-glass);
+}
+
+.nav-cta {
+ width: 44px;
+ height: 44px;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.2rem;
+ transition: all var(--transition);
+ backdrop-filter: blur(10px);
+}
+
+.nav-cta:hover {
+ transform: scale(1.1);
+ box-shadow: var(--shadow-glow);
+}
+
+.mobile-menu-btn {
+ display: none;
+ flex-direction: column;
+ gap: 5px;
+ background: none;
+ border: none;
+ cursor: pointer;
+ padding: 8px;
+}
+
+.mobile-menu-btn span {
+ display: block;
+ width: 24px;
+ height: 2px;
+ background: var(--text-primary);
+ border-radius: 2px;
+ transition: all 0.3s ease;
+ transform-origin: center;
+}
+
+.mobile-menu-btn.open span:nth-child(1) {
+ transform: translateY(7px) rotate(45deg);
+}
+
+.mobile-menu-btn.open span:nth-child(2) {
+ opacity: 0;
+ transform: scaleX(0);
+}
+
+.mobile-menu-btn.open span:nth-child(3) {
+ transform: translateY(-7px) rotate(-45deg);
+}
+
+/* ===== Hero ===== */
+.hero {
+ position: relative;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding: calc(var(--nav-height) + 52px) 24px 80px;
+ z-index: 1;
+ overflow: hidden;
+}
+
+.hero-bg-shapes {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ z-index: 0;
+}
+
+.hero-inner {
+ position: relative;
+ z-index: 1;
+ width: 100%;
+ max-width: 1200px;
+ margin: 0 auto;
+}
+
+.hero-top {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ align-items: center;
+ gap: 32px 48px;
+}
+
+.hero-content {
+ min-width: 0;
+}
+
+.hero-bottom {
+ margin-top: 40px;
+}
+
+.hero-visual {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ width: 100%;
+ overflow: visible;
+}
+
+.globe-container {
+ position: relative;
+ width: 100%;
+ max-width: 400px;
+ margin: 0 auto;
+ overflow: visible;
+}
+
+.hero-bg-shapes .shape {
+ position: absolute;
+ border-radius: 50%;
+ filter: blur(80px);
+ opacity: 0.4;
+ animation: floatShape 8s ease-in-out infinite;
+}
+
+.shape-1 {
+ width: 400px;
+ height: 400px;
+ background: var(--accent-1);
+ top: 10%;
+ left: -10%;
+ animation-delay: 0s;
+}
+
+.shape-2 {
+ width: 300px;
+ height: 300px;
+ background: var(--accent-3);
+ top: 50%;
+ right: -5%;
+ animation-delay: -3s;
+}
+
+.shape-3 {
+ width: 250px;
+ height: 250px;
+ background: var(--accent-2);
+ bottom: 10%;
+ left: 30%;
+ animation-delay: -5s;
+}
+
+@keyframes floatShape {
+ 0%, 100% { transform: translate(0, 0) scale(1); }
+ 33% { transform: translate(30px, -30px) scale(1.05); }
+ 66% { transform: translate(-20px, 20px) scale(0.95); }
+}
+
+.hero-badge {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 8px 20px;
+ border-radius: 100px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 24px;
+ backdrop-filter: blur(10px);
+}
+
+.badge-dot {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background: #22c55e;
+ animation: pulse 2s ease-in-out infinite;
+}
+
+@keyframes pulse {
+ 0%, 100% { opacity: 1; transform: scale(1); }
+ 50% { opacity: 0.5; transform: scale(1.5); }
+}
+
+.hero-title {
+ font-family: var(--font-display);
+ font-size: clamp(2.5rem, 5vw, 4rem);
+ font-weight: 800;
+ line-height: 1.15;
+ margin-bottom: 20px;
+ letter-spacing: -0.02em;
+}
+
+.gradient-text {
+ background: var(--gradient-text);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ background-size: 200% auto;
+ animation: gradientShift 4s ease-in-out infinite;
+}
+
+@keyframes gradientShift {
+ 0%, 100% { background-position: 0% center; }
+ 50% { background-position: 100% center; }
+}
+
+.hero-subtitle {
+ font-size: 1.1rem;
+ color: var(--text-secondary);
+ margin-bottom: 0;
+ max-width: 480px;
+ line-height: 1.8;
+}
+
+.hero-actions {
+ display: flex;
+ gap: 16px;
+ margin-bottom: 32px;
+ flex-wrap: wrap;
+}
+
+.btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 14px 28px;
+ border-radius: var(--radius-md);
+ font-weight: 600;
+ font-size: 0.95rem;
+ cursor: pointer;
+ border: none;
+ transition: all var(--transition);
+ font-family: inherit;
+}
+
+.btn-primary {
+ background: var(--gradient-main);
+ color: #0a0e17;
+ box-shadow: 0 4px 20px rgba(255, 107, 107, 0.3);
+}
+
+.btn-primary:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 30px rgba(255, 107, 107, 0.4);
+}
+
+.btn-ghost {
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ color: var(--text-primary);
+ backdrop-filter: blur(10px);
+}
+
+.btn-ghost:hover {
+ background: rgba(255, 255, 255, 0.1);
+ transform: translateY(-2px);
+}
+
+.hero-stats {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+ padding: 24px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+}
+
+.stat-item {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.stat-number {
+ font-family: var(--font-display);
+ font-size: 2rem;
+ font-weight: 800;
+ background: var(--gradient-text);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.stat-label {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ white-space: nowrap;
+}
+
+.stat-divider {
+ width: 1px;
+ height: 40px;
+ background: var(--border-glass);
+}
+
+/* Globe Visual */
+.globe-svg {
+ width: 100%;
+ height: auto;
+ animation: globeFloat 6s ease-in-out infinite;
+}
+
+@keyframes globeFloat {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(-15px); }
+}
+
+.orbit-ring {
+ animation: orbitSpin 20s linear infinite;
+ transform-origin: center;
+}
+
+.orbit-ring-2 {
+ animation-direction: reverse;
+ animation-duration: 15s;
+}
+
+@keyframes orbitSpin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+.continent {
+ animation: continentPulse 4s ease-in-out infinite;
+}
+
+.pulse-dot {
+ animation: dotPulse 2s ease-in-out infinite;
+}
+
+.pulse-dot:nth-child(2) { animation-delay: 0.5s; }
+.pulse-dot:nth-child(3) { animation-delay: 1s; }
+.pulse-dot:nth-child(4) { animation-delay: 1.5s; }
+
+@keyframes dotPulse {
+ 0%, 100% { r: 5; opacity: 1; }
+ 50% { r: 8; opacity: 0.6; }
+}
+
+.flight-path {
+ animation: dashMove 3s linear infinite;
+}
+
+@keyframes dashMove {
+ to { stroke-dashoffset: -20; }
+}
+
+.floating-cards .float-card {
+ position: absolute;
+ padding: 10px 16px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ font-size: 0.8rem;
+ font-weight: 600;
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+ animation: cardFloat 4s ease-in-out infinite;
+ white-space: nowrap;
+}
+
+.float-card small {
+ display: block;
+ font-weight: 400;
+ color: var(--text-muted);
+ font-size: 0.7rem;
+ margin-top: 2px;
+}
+
+.fc-1 { top: 5%; right: -8%; animation-delay: 0s; }
+.fc-2 { top: 38%; left: -14%; animation-delay: -1.5s; }
+.fc-3 { bottom: 10%; right: -2%; animation-delay: -3s; }
+
+@keyframes cardFloat {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(-10px); }
+}
+
+.scroll-indicator {
+ position: absolute;
+ bottom: 30px;
+ left: 50%;
+ transform: translateX(-50%);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+ color: var(--text-muted);
+ font-size: 0.8rem;
+ animation: bounce 2s ease-in-out infinite;
+}
+
+.scroll-arrow svg {
+ opacity: 0.5;
+}
+
+@keyframes bounce {
+ 0%, 100% { transform: translateX(-50%) translateY(0); }
+ 50% { transform: translateX(-50%) translateY(8px); }
+}
+
+/* ===== Sections ===== */
+.section {
+ position: relative;
+ padding: 100px 0;
+ z-index: 1;
+ content-visibility: auto;
+ contain-intrinsic-size: auto 480px;
+}
+
+.section-header {
+ text-align: center;
+ margin-bottom: 60px;
+}
+
+.section-tag {
+ display: inline-block;
+ padding: 6px 16px;
+ border-radius: 100px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ font-size: 0.75rem;
+ font-weight: 600;
+ letter-spacing: 0.1em;
+ color: var(--accent-3);
+ margin-bottom: 16px;
+}
+
+.section-header h2 {
+ font-family: var(--font-display);
+ font-size: clamp(2rem, 4vw, 2.75rem);
+ font-weight: 800;
+ margin-bottom: 12px;
+ letter-spacing: -0.02em;
+}
+
+.section-header p {
+ color: var(--text-secondary);
+ font-size: 1.05rem;
+ max-width: 500px;
+ margin: 0 auto;
+}
+
+/* ===== Destinations ===== */
+.dest-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+}
+
+.dest-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ overflow: hidden;
+ transition: all var(--transition);
+ backdrop-filter: blur(20px);
+ cursor: pointer;
+}
+
+.dest-card:hover {
+ transform: translateY(-8px);
+ box-shadow: var(--shadow-glow);
+ border-color: rgba(78, 205, 196, 0.3);
+}
+
+.dest-img {
+ position: relative;
+ height: 180px;
+ background: linear-gradient(
+ 135deg,
+ hsl(var(--hue, 170), 60%, 20%),
+ hsl(calc(var(--hue, 170) + 40), 50%, 30%)
+ );
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+}
+
+.dest-img::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: radial-gradient(circle at 30% 70%, rgba(255,255,255,0.1), transparent);
+}
+
+.dest-emoji {
+ font-size: 4rem;
+ animation: emojiBounce 3s ease-in-out infinite;
+ filter: drop-shadow(0 4px 12px rgba(0,0,0,0.3));
+}
+
+@keyframes emojiBounce {
+ 0%, 100% { transform: scale(1) rotate(0deg); }
+ 50% { transform: scale(1.1) rotate(5deg); }
+}
+
+.dest-overlay {
+ position: absolute;
+ bottom: 12px;
+ left: 12px;
+}
+
+.dest-tag {
+ padding: 4px 12px;
+ border-radius: 100px;
+ background: rgba(0, 0, 0, 0.5);
+ backdrop-filter: blur(10px);
+ font-size: 0.7rem;
+ color: #fff;
+}
+
+.dest-body {
+ padding: 20px;
+}
+
+.dest-body h3 {
+ font-family: var(--font-display);
+ font-size: 1.15rem;
+ font-weight: 700;
+ margin-bottom: 8px;
+}
+
+.dest-body > p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 16px;
+ line-height: 1.6;
+}
+
+.dest-meta {
+ display: flex;
+ gap: 12px;
+ flex-wrap: wrap;
+ margin-bottom: 12px;
+}
+
+.dest-meta span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ padding: 4px 8px;
+ background: var(--bg-glass);
+ border-radius: var(--radius-sm);
+}
+
+.dest-rating {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 0.85rem;
+}
+
+.stars { font-size: 0.75rem; }
+
+/* ===== Timeline ===== */
+.lifestyle {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.03), transparent);
+}
+
+.timeline {
+ position: relative;
+ max-width: 700px;
+ margin: 0 auto;
+}
+
+.timeline-line {
+ position: absolute;
+ left: 50%;
+ top: 0;
+ bottom: 0;
+ width: 4px;
+ transform: translateX(-50%);
+}
+
+.timeline-svg-line {
+ animation: dashFlow 2s linear infinite;
+}
+
+@keyframes dashFlow {
+ to { stroke-dashoffset: -14; }
+}
+
+.timeline-item {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+ margin-bottom: 40px;
+ position: relative;
+}
+
+.timeline-item:nth-child(even) {
+ flex-direction: row-reverse;
+}
+
+.timeline-item:nth-child(even) .timeline-card {
+ text-align: right;
+}
+
+.timeline-time {
+ flex: 0 0 100px;
+ text-align: center;
+ font-weight: 700;
+ font-size: 0.9rem;
+ color: var(--accent-2);
+ font-family: var(--font-display);
+}
+
+.timeline-card {
+ flex: 1;
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+ position: relative;
+}
+
+.timeline-card:hover {
+ transform: scale(1.02);
+ box-shadow: var(--shadow-glow);
+}
+
+.timeline-icon {
+ font-size: 2rem;
+ margin-bottom: 8px;
+}
+
+.timeline-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.1rem;
+ margin-bottom: 6px;
+}
+
+.timeline-card p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+/* ===== Charts ===== */
+.data-section {
+ background: linear-gradient(180deg, transparent, rgba(255, 107, 107, 0.02), transparent);
+}
+
+.charts-grid {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 24px;
+}
+
+.chart-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 28px;
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.chart-card:hover {
+ box-shadow: var(--shadow-glow);
+}
+
+.chart-card h3 {
+ font-family: var(--font-display);
+ font-size: 1rem;
+ margin-bottom: 20px;
+}
+
+.chart-wrap {
+ position: relative;
+ height: 280px;
+}
+
+.chart-radar {
+ height: 300px;
+}
+
+.chart-wide {
+ grid-column: span 2;
+}
+
+/* ===== Tools ===== */
+.tools-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+}
+
+.tool-card {
+ position: relative;
+ padding: 32px 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+ overflow: hidden;
+}
+
+.tool-card::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 3px;
+ background: var(--gradient-main);
+ transform: scaleX(0);
+ transition: transform var(--transition);
+}
+
+.tool-card:hover::before {
+ transform: scaleX(1);
+}
+
+.tool-card:hover {
+ transform: translateY(-6px);
+ box-shadow: var(--shadow-glow);
+}
+
+.tool-icon-wrap {
+ width: 48px;
+ height: 48px;
+ color: var(--accent-3);
+ margin-bottom: 12px;
+ opacity: 0.6;
+}
+
+.tool-emoji {
+ font-size: 2rem;
+ display: block;
+ margin-bottom: 12px;
+}
+
+.tool-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.1rem;
+ margin-bottom: 8px;
+}
+
+.tool-card > p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 16px;
+}
+
+.tool-tags {
+ display: flex;
+ gap: 6px;
+ flex-wrap: wrap;
+}
+
+.tool-tags span {
+ padding: 3px 10px;
+ border-radius: 100px;
+ font-size: 0.7rem;
+ background: var(--bg-glass);
+ color: var(--text-muted);
+ border: var(--border-glass);
+}
+
+/* ===== Community ===== */
+.testimonials {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+ margin-bottom: 60px;
+}
+
+.testimonial-card {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.testimonial-card:hover {
+ transform: translateY(-4px);
+ box-shadow: var(--shadow-glow);
+}
+
+.testimonial-avatar {
+ font-size: 2.5rem;
+ margin-bottom: 16px;
+}
+
+.testimonial-stars {
+ font-size: 0.8rem;
+ margin-bottom: 12px;
+}
+
+.testimonial-content p {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ line-height: 1.7;
+ margin-bottom: 20px;
+ font-style: italic;
+}
+
+.testimonial-author strong {
+ display: block;
+ font-size: 0.9rem;
+ margin-bottom: 2px;
+}
+
+.testimonial-author span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.cta-banner {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 40px;
+ padding: 48px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ position: relative;
+ overflow: hidden;
+}
+
+.cta-banner::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: var(--gradient-main);
+ opacity: 0.05;
+}
+
+.cta-content {
+ position: relative;
+ z-index: 1;
+}
+
+.cta-content h2 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin-bottom: 8px;
+}
+
+.cta-content p {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+}
+
+.cta-form {
+ display: flex;
+ gap: 12px;
+ position: relative;
+ z-index: 1;
+ flex-shrink: 0;
+}
+
+.cta-form input {
+ padding: 14px 20px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.9rem;
+ width: 280px;
+ outline: none;
+ transition: all var(--transition);
+}
+
+.cta-form input:focus {
+ border-color: var(--accent-3);
+ box-shadow: 0 0 0 3px rgba(78, 205, 196, 0.15);
+}
+
+.cta-form input::placeholder {
+ color: var(--text-muted);
+}
+
+/* ===== Footer ===== */
+.footer {
+ position: relative;
+ z-index: 1;
+ padding: 60px 0 30px;
+ border-top: var(--border-glass);
+ background: var(--bg-secondary);
+}
+
+.footer-grid {
+ display: grid;
+ grid-template-columns: 2fr 1fr 1fr 1fr;
+ gap: 40px;
+ margin-bottom: 40px;
+}
+
+.footer-brand p {
+ color: var(--text-secondary);
+ font-size: 0.85rem;
+ margin: 16px 0;
+ max-width: 280px;
+}
+
+.social-links {
+ display: flex;
+ gap: 12px;
+}
+
+.social-links a {
+ width: 40px;
+ height: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 50%;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ font-size: 1rem;
+ transition: all var(--transition);
+}
+
+.social-links a:hover {
+ transform: translateY(-3px);
+ background: var(--accent-3);
+ color: #0a0e17;
+}
+
+.footer-links h4 {
+ font-family: var(--font-display);
+ font-size: 0.9rem;
+ margin-bottom: 16px;
+ color: var(--text-primary);
+}
+
+.footer-links a {
+ display: block;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ padding: 6px 0;
+ transition: color var(--transition);
+}
+
+.footer-links a:hover {
+ color: var(--accent-3);
+}
+
+.footer-bottom {
+ text-align: center;
+ padding-top: 30px;
+ border-top: var(--border-glass);
+}
+
+.footer-bottom p {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.footer-emoji-bar {
+ margin-top: 12px;
+ font-size: 1.2rem;
+ letter-spacing: 8px;
+ animation: emojiScroll 10s linear infinite;
+}
+
+@keyframes emojiScroll {
+ 0%, 100% { letter-spacing: 8px; }
+ 50% { letter-spacing: 16px; }
+}
+
+/* ===== Toast ===== */
+.toast {
+ position: fixed;
+ bottom: 30px;
+ right: 30px;
+ padding: 16px 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ backdrop-filter: blur(20px);
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ box-shadow: var(--shadow-card);
+ transform: translateY(100px);
+ opacity: 0;
+ transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
+ z-index: 2000;
+}
+
+.toast.show {
+ transform: translateY(0);
+ opacity: 1;
+}
+
+/* ===== Reveal Animation ===== */
+.reveal {
+ opacity: 0;
+ transform: translateY(30px);
+ transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.reveal.visible {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+/* Sub-pages use SiteShell, not HomeClient ? ensure content is never stuck hidden */
+:not(.home-flow) .reveal {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+:not(.home-flow) .reveal.visible {
+ transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* Deferred kits: once mounted, never stay invisible if JS timing races */
+[data-deferred="ready"] .reveal {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+.deferred-skeleton {
+ height: 120px;
+ margin: 24px auto;
+ max-width: 1200px;
+ border-radius: var(--radius-xl);
+ background: linear-gradient(90deg, rgba(255,255,255,0.03), rgba(255,255,255,0.07), rgba(255,255,255,0.03));
+ background-size: 200% 100%;
+ animation: deferredShimmer 1.2s ease-in-out infinite;
+}
+
+@keyframes deferredShimmer {
+ 0% { background-position: 100% 0; }
+ 100% { background-position: -100% 0; }
+}
+
+.focus-streak {
+ text-align: center;
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin: -4px 0 12px;
+}
+
+.focus-streak b {
+ color: var(--accent-3);
+ font-size: 1.1rem;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .reveal {
+ opacity: 1;
+ transform: none;
+ transition: none;
+ }
+ .deferred-skeleton { animation: none; }
+ .loader-ring,
+ .loader-progress { animation: none !important; }
+}
+
+/* ===== Responsive ===== */
+@media (max-width: 1024px) {
+ .hero-top {
+ grid-template-columns: 1fr;
+ text-align: center;
+ gap: 28px;
+ }
+
+ .hero-subtitle { margin: 0 auto; max-width: 100%; }
+ .hero-actions { justify-content: center; }
+ .hero-stats { justify-content: center; }
+ .hero-visual { order: -1; }
+ .globe-container { max-width: 280px; }
+ .floating-cards .float-card { display: none; }
+
+ .dest-grid { grid-template-columns: repeat(2, 1fr); }
+ .tools-grid { grid-template-columns: repeat(2, 1fr); }
+ .testimonials { grid-template-columns: 1fr; }
+ .footer-grid { grid-template-columns: repeat(2, 1fr); }
+}
+
+@media (max-width: 768px) {
+ .nav-links {
+ display: none;
+ flex-direction: column;
+ position: absolute;
+ top: var(--nav-height);
+ left: 0;
+ right: 0;
+ background: var(--bg-secondary);
+ padding: 20px;
+ border-bottom: var(--border-glass);
+ opacity: 0;
+ transform: translateY(-8px);
+ pointer-events: none;
+ transition: all 0.3s ease;
+ }
+ .nav-links.open {
+ display: flex;
+ opacity: 1;
+ transform: translateY(0);
+ pointer-events: auto;
+ }
+
+ .mobile-menu-btn { display: flex; }
+
+ .hero-stats {
+ flex-direction: column;
+ gap: 16px;
+ }
+
+ .stat-divider {
+ width: 40px;
+ height: 1px;
+ }
+
+ .dest-grid { grid-template-columns: 1fr; }
+ .charts-grid { grid-template-columns: 1fr; }
+ .chart-wide { grid-column: span 1; }
+ .tools-grid { grid-template-columns: 1fr; }
+
+ .timeline-item,
+ .timeline-item:nth-child(even) {
+ flex-direction: column;
+ text-align: center;
+ }
+
+ .timeline-item:nth-child(even) .timeline-card {
+ text-align: center;
+ }
+
+ .timeline-line { display: none; }
+ .timeline-time { flex: none; }
+
+ .cta-banner {
+ flex-direction: column;
+ text-align: center;
+ padding: 32px 24px;
+ }
+
+ .cta-form {
+ flex-direction: column;
+ width: 100%;
+ }
+
+ .cta-form input { width: 100%; }
+
+ .footer-grid { grid-template-columns: 1fr; }
+}
+
+/* ===== Loader ===== */
+.loader {
+ position: fixed;
+ inset: 0;
+ z-index: 9999;
+ background: var(--bg-primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: opacity 0.6s ease, visibility 0.6s ease;
+}
+
+.loader.hidden,
+.loader.loader-done {
+ opacity: 0;
+ visibility: hidden;
+ pointer-events: none;
+}
+
+.loader-inner {
+ text-align: center;
+}
+
+.loader-globe {
+ width: 80px;
+ height: 80px;
+ margin-bottom: 16px;
+}
+
+.loader-ring {
+ animation: loaderSpin 1.5s linear infinite;
+ transform-origin: center;
+}
+
+@keyframes loaderSpin {
+ to { transform: rotate(360deg); }
+}
+
+.loader-text {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ font-weight: 800;
+ background: var(--gradient-text);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ margin-bottom: 20px;
+}
+
+.loader-bar {
+ width: 200px;
+ height: 3px;
+ background: var(--bg-glass);
+ border-radius: 3px;
+ overflow: hidden;
+ margin: 0 auto;
+}
+
+.loader-progress {
+ height: 100%;
+ background: var(--gradient-main);
+ border-radius: 3px;
+ animation: loaderProgress 1.8s ease-in-out forwards;
+}
+
+@keyframes loaderProgress {
+ from { width: 0; }
+ to { width: 100%; }
+}
+
+/* ===== Ticker ===== */
+.ticker-bar {
+ position: fixed;
+ top: var(--nav-height);
+ left: 0;
+ right: 0;
+ z-index: 999;
+ background: rgba(10, 14, 23, 0.9);
+ backdrop-filter: blur(10px);
+ border-bottom: var(--border-glass);
+ overflow: hidden;
+ height: 32px;
+}
+
+[data-theme="light"] .ticker-bar {
+ background: rgba(248, 250, 252, 0.95);
+}
+
+.ticker-track {
+ display: flex;
+ gap: 60px;
+ animation: tickerScroll 30s linear infinite;
+ white-space: nowrap;
+ padding: 6px 0;
+}
+
+.ticker-track span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ flex-shrink: 0;
+}
+
+@keyframes tickerScroll {
+ from { transform: translateX(0); }
+ to { transform: translateX(-50%); }
+}
+
+/* Adjust hero for ticker */
+.hero {
+ padding-top: calc(var(--nav-height) + 52px);
+}
+
+/* ===== Typewriter ===== */
+.typewriter-cursor {
+ color: var(--accent-3);
+ animation: blink 1s step-end infinite;
+ font-weight: 300;
+}
+
+@keyframes blink {
+ 50% { opacity: 0; }
+}
+
+/* ===== Map Section ===== */
+.map-section {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.02), transparent);
+}
+
+.map-wrapper {
+ display: grid;
+ grid-template-columns: 1.4fr 1fr;
+ gap: 32px;
+ align-items: stretch;
+}
+
+.map-svg-container {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 24px;
+ backdrop-filter: blur(20px);
+ overflow: hidden;
+}
+
+.world-map {
+ width: 100%;
+ height: auto;
+}
+
+.map-pin {
+ cursor: pointer;
+ transition: transform 0.3s ease;
+}
+
+.map-pin:hover {
+ transform: scale(1.3);
+}
+
+.map-pin.active circle:nth-child(2) {
+ fill: #fff;
+}
+
+.pin-pulse {
+ animation: pinPulse 2s ease-in-out infinite;
+}
+
+@keyframes pinPulse {
+ 0%, 100% { r: 20; opacity: 0.3; }
+ 50% { r: 28; opacity: 0.1; }
+}
+
+.map-info-panel {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+ backdrop-filter: blur(20px);
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ min-height: 300px;
+ transition: all var(--transition);
+}
+
+.map-info-default {
+ text-align: center;
+ color: var(--text-muted);
+}
+
+.map-info-icon {
+ font-size: 3rem;
+ display: block;
+ margin-bottom: 16px;
+}
+
+.map-info-default h3 {
+ font-family: var(--font-display);
+ color: var(--text-primary);
+ margin-bottom: 8px;
+}
+
+.map-info-city {
+ animation: fadeInUp 0.4s ease;
+}
+
+.map-info-city .city-emoji {
+ font-size: 3.5rem;
+ margin-bottom: 12px;
+}
+
+.map-info-city h3 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin-bottom: 8px;
+}
+
+.map-info-city .city-desc {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin-bottom: 20px;
+ line-height: 1.6;
+}
+
+.map-info-stats {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 12px;
+}
+
+.map-stat {
+ padding: 12px;
+ background: var(--bg-glass);
+ border-radius: var(--radius-md);
+ text-align: center;
+ font-size: 0.85rem;
+}
+
+.map-stat strong {
+ display: block;
+ font-size: 1.1rem;
+ color: var(--accent-3);
+ margin-bottom: 2px;
+}
+
+@keyframes fadeInUp {
+ from { opacity: 0; transform: translateY(15px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* ===== Destination Filters ===== */
+.dest-filters {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ margin-bottom: 32px;
+ flex-wrap: wrap;
+}
+
+.filter-search {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 10px 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ flex: 1;
+ min-width: 200px;
+ max-width: 280px;
+}
+
+.filter-search svg {
+ color: var(--text-muted);
+ flex-shrink: 0;
+}
+
+.filter-search input {
+ background: none;
+ border: none;
+ outline: none;
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.9rem;
+ width: 100%;
+}
+
+.filter-search input::placeholder {
+ color: var(--text-muted);
+}
+
+.filter-tags {
+ display: flex;
+ gap: 8px;
+ flex-wrap: wrap;
+}
+
+.filter-btn {
+ padding: 8px 16px;
+ border-radius: 100px;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-secondary);
+ font-family: inherit;
+ font-size: 0.8rem;
+ cursor: pointer;
+ transition: all var(--transition);
+ white-space: nowrap;
+}
+
+.filter-btn:hover,
+.filter-btn.active {
+ background: var(--accent-3);
+ color: #0a0e17;
+ border-color: var(--accent-3);
+}
+
+.filter-sort select {
+ padding: 10px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.85rem;
+ cursor: pointer;
+ outline: none;
+}
+
+.dest-card.hidden-card {
+ display: none;
+}
+
+.dest-empty {
+ text-align: center;
+ padding: 60px 20px;
+ color: var(--text-muted);
+ font-size: 1.1rem;
+}
+
+/* ===== Visa Section ===== */
+.visa-section {
+ background: linear-gradient(180deg, transparent, rgba(255, 230, 109, 0.02), transparent);
+}
+
+.visa-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+}
+
+.visa-card {
+ position: relative;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.visa-card:hover {
+ transform: translateY(-6px);
+ box-shadow: var(--shadow-glow);
+ border-color: rgba(255, 230, 109, 0.3);
+}
+
+.visa-flag {
+ font-size: 2.5rem;
+ margin-bottom: 12px;
+}
+
+.visa-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.1rem;
+ margin-bottom: 12px;
+}
+
+.visa-badge {
+ display: inline-block;
+ padding: 4px 12px;
+ border-radius: 100px;
+ font-size: 0.7rem;
+ font-weight: 600;
+ margin-bottom: 16px;
+}
+
+.visa-badge.easy { background: rgba(78, 205, 196, 0.2); color: var(--accent-3); }
+.visa-badge.hot { background: rgba(255, 107, 107, 0.2); color: var(--accent-1); }
+.visa-badge.budget { background: rgba(255, 230, 109, 0.2); color: var(--accent-2); }
+.visa-badge.new { background: rgba(167, 139, 250, 0.2); color: var(--accent-4); }
+.visa-badge.pioneer { background: rgba(96, 165, 250, 0.2); color: #60A5FA; }
+
+.visa-details {
+ list-style: none;
+ margin-bottom: 20px;
+}
+
+.visa-details li {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ padding: 6px 0;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
+}
+
+.visa-progress {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.progress-bar {
+ flex: 1;
+ height: 6px;
+ background: var(--bg-glass);
+ border-radius: 3px;
+ overflow: hidden;
+}
+
+.progress-fill {
+ height: 100%;
+ background: var(--gradient-main);
+ border-radius: 3px;
+ transition: width 1s ease;
+}
+
+.progress-label {
+ white-space: nowrap;
+ font-weight: 600;
+ color: var(--accent-3);
+}
+
+/* ===== FAQ ===== */
+.faq-section {
+ background: linear-gradient(180deg, transparent, rgba(167, 139, 250, 0.02), transparent);
+}
+
+.faq-list {
+ max-width: 800px;
+ margin: 0 auto;
+}
+
+.faq-item {
+ margin-bottom: 12px;
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ overflow: hidden;
+ background: var(--bg-card);
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.faq-item.active {
+ border-color: rgba(78, 205, 196, 0.3);
+ box-shadow: var(--shadow-glow);
+}
+
+.faq-question {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 20px 24px;
+ background: none;
+ border: none;
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.95rem;
+ font-weight: 600;
+ cursor: pointer;
+ text-align: left;
+ transition: color var(--transition);
+}
+
+.faq-question:hover {
+ color: var(--accent-3);
+}
+
+.faq-chevron {
+ flex-shrink: 0;
+ transition: transform 0.3s ease;
+ color: var(--text-muted);
+}
+
+.faq-item.active .faq-chevron {
+ transform: rotate(180deg);
+ color: var(--accent-3);
+}
+
+.faq-answer {
+ max-height: 0;
+ overflow: hidden;
+ transition: max-height 0.4s ease, padding 0.4s ease;
+}
+
+.faq-item.active .faq-answer {
+ max-height: 300px;
+}
+
+.faq-answer p {
+ padding: 0 24px 20px;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ line-height: 1.7;
+}
+
+/* ===== Modal ===== */
+.modal-overlay {
+ position: fixed;
+ inset: 0;
+ z-index: 3000;
+ background: rgba(0, 0, 0, 0.6);
+ backdrop-filter: blur(8px);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 24px;
+ opacity: 0;
+ visibility: hidden;
+ transition: all 0.3s ease;
+}
+
+.modal-overlay.open {
+ opacity: 1;
+ visibility: visible;
+}
+
+.modal {
+ background: var(--bg-secondary);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ max-width: 560px;
+ width: 100%;
+ max-height: 85vh;
+ overflow-y: auto;
+ position: relative;
+ transform: scale(0.9) translateY(20px);
+ transition: transform 0.3s ease;
+}
+
+.modal-overlay.open .modal {
+ transform: scale(1) translateY(0);
+}
+
+.modal-close {
+ position: absolute;
+ top: 16px;
+ right: 16px;
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ cursor: pointer;
+ font-size: 1rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all var(--transition);
+ z-index: 1;
+}
+
+.modal-close:hover {
+ background: var(--accent-1);
+ color: #fff;
+}
+
+.modal-hero {
+ height: 200px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 5rem;
+ position: relative;
+}
+
+.modal-hero::after {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(transparent 50%, var(--bg-secondary));
+}
+
+.modal-body {
+ padding: 24px 32px 32px;
+}
+
+.modal-body h2 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin-bottom: 8px;
+}
+
+.modal-body .modal-tag {
+ display: inline-block;
+ padding: 4px 12px;
+ border-radius: 100px;
+ background: var(--bg-glass);
+ font-size: 0.75rem;
+ color: var(--accent-3);
+ margin-bottom: 16px;
+}
+
+.modal-body p {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ line-height: 1.7;
+ margin-bottom: 24px;
+}
+
+.modal-stats {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 12px;
+ margin-bottom: 24px;
+}
+
+.modal-stat {
+ text-align: center;
+ padding: 16px 8px;
+ background: var(--bg-glass);
+ border-radius: var(--radius-md);
+}
+
+.modal-stat .stat-emoji {
+ font-size: 1.5rem;
+ display: block;
+ margin-bottom: 4px;
+}
+
+.modal-stat strong {
+ display: block;
+ font-size: 1rem;
+ margin-bottom: 2px;
+}
+
+.modal-stat span {
+ font-size: 0.7rem;
+ color: var(--text-muted);
+}
+
+.modal-highlights h4 {
+ font-size: 0.9rem;
+ margin-bottom: 12px;
+}
+
+.modal-highlights ul {
+ list-style: none;
+}
+
+.modal-highlights li {
+ padding: 8px 0;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
+}
+
+/* ===== Back to Top ===== */
+.back-to-top {
+ position: fixed;
+ bottom: 30px;
+ left: 30px;
+ width: 48px;
+ height: 48px;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-card);
+ backdrop-filter: blur(20px);
+ color: var(--text-primary);
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ opacity: 0;
+ visibility: hidden;
+ transform: translateY(20px);
+ transition: all var(--transition);
+ z-index: 1000;
+ box-shadow: var(--shadow-card);
+}
+
+.back-to-top.visible {
+ opacity: 1;
+ visibility: visible;
+ transform: translateY(0);
+}
+
+.back-to-top:hover {
+ background: var(--accent-3);
+ color: #0a0e17;
+ transform: translateY(-4px);
+}
+
+/* ===== Nav Active ===== */
+.nav-links a.active {
+ color: var(--accent-3);
+ background: rgba(78, 205, 196, 0.1);
+}
+
+/* ===== Responsive additions ===== */
+@media (max-width: 1024px) {
+ .map-wrapper { grid-template-columns: 1fr; }
+ .visa-grid { grid-template-columns: repeat(2, 1fr); }
+}
+
+@media (max-width: 768px) {
+ .ticker-bar { display: none; }
+ .hero { padding-top: calc(var(--nav-height) + 20px); }
+ .dest-filters { flex-direction: column; align-items: stretch; }
+ .filter-search { max-width: none; }
+ .filter-tags { justify-content: center; }
+ .visa-grid { grid-template-columns: 1fr; }
+ .modal-stats { grid-template-columns: 1fr; }
+ .back-to-top { bottom: 20px; left: 20px; }
+}
+
+/* ===== Calculator ===== */
+.calculator-section {
+ background: linear-gradient(180deg, transparent, rgba(167, 139, 250, 0.02), transparent);
+}
+
+.calculator-wrapper {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 32px;
+ align-items: start;
+}
+
+.calculator-form {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+ backdrop-filter: blur(20px);
+}
+
+.calc-field {
+ margin-bottom: 24px;
+}
+
+.calc-field label {
+ display: block;
+ font-weight: 600;
+ font-size: 0.9rem;
+ margin-bottom: 10px;
+}
+
+.calc-field select,
+.calc-field input[type="range"] {
+ width: 100%;
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.9rem;
+}
+
+.calc-options {
+ display: flex;
+ gap: 8px;
+}
+
+.calc-option {
+ flex: 1;
+ padding: 10px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-secondary);
+ font-family: inherit;
+ font-size: 0.85rem;
+ cursor: pointer;
+ transition: all var(--transition);
+}
+
+.calc-option.active,
+.calc-option:hover {
+ background: var(--accent-3);
+ color: #0a0e17;
+ border-color: var(--accent-3);
+}
+
+.calculator-result {
+ min-height: 400px;
+}
+
+.result-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+ backdrop-filter: blur(20px);
+}
+
+.result-header {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ margin-bottom: 28px;
+}
+
+.result-header h3 {
+ font-family: var(--font-display);
+ font-size: 1.3rem;
+}
+
+.result-header p {
+ color: var(--text-muted);
+ font-size: 0.85rem;
+}
+
+.breakdown-item {
+ display: grid;
+ grid-template-columns: 100px 1fr 80px;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 12px;
+ font-size: 0.85rem;
+}
+
+.breakdown-bar {
+ height: 8px;
+ background: var(--bg-glass);
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.breakdown-fill {
+ height: 100%;
+ background: var(--gradient-main);
+ border-radius: 4px;
+ transition: width 0.8s ease;
+}
+
+.result-total {
+ display: flex;
+ justify-content: space-between;
+ margin-top: 24px;
+ padding-top: 24px;
+ border-top: var(--border-glass);
+}
+
+.result-total strong {
+ display: block;
+ font-size: 1.5rem;
+ font-family: var(--font-display);
+}
+
+.result-total span {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.result-placeholder {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 400px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ color: var(--text-muted);
+ text-align: center;
+ gap: 16px;
+}
+
+/* ===== Blog ===== */
+.blog-section {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.02), transparent);
+}
+
+.blog-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+}
+
+.blog-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 28px;
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.blog-card:hover {
+ transform: translateY(-6px);
+ box-shadow: var(--shadow-glow);
+}
+
+.blog-emoji {
+ font-size: 2.5rem;
+ margin-bottom: 12px;
+}
+
+.blog-meta {
+ display: flex;
+ gap: 16px;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ margin-bottom: 12px;
+}
+
+.blog-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.1rem;
+ margin-bottom: 10px;
+ line-height: 1.4;
+}
+
+.blog-card p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.6;
+ margin-bottom: 16px;
+}
+
+.blog-tags {
+ display: flex;
+ gap: 6px;
+ flex-wrap: wrap;
+ margin-bottom: 16px;
+}
+
+.blog-tag {
+ padding: 3px 10px;
+ border-radius: 100px;
+ font-size: 0.7rem;
+ background: var(--bg-glass);
+ color: var(--accent-3);
+ border: var(--border-glass);
+}
+
+.blog-read-more {
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--accent-3);
+ transition: color var(--transition);
+}
+
+.blog-read-more:hover {
+ color: var(--accent-1);
+}
+
+/* ===== Compare Bar ===== */
+.compare-bar {
+ position: fixed;
+ bottom: 30px;
+ right: 30px;
+ z-index: 1500;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 16px 24px;
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+ display: flex;
+ align-items: center;
+ gap: 16px;
+}
+
+.compare-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.85rem;
+}
+
+.compare-table th,
+.compare-table td {
+ padding: 12px;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
+}
+
+.compare-table th {
+ text-align: center;
+}
+
+.compare-table td:first-child {
+ color: var(--text-muted);
+}
+
+.compare-table td:not(:first-child) {
+ text-align: center;
+}
+
+@media (max-width: 1024px) {
+ .calculator-wrapper { grid-template-columns: 1fr; }
+ .blog-grid { grid-template-columns: repeat(2, 1fr); }
+}
+
+@media (max-width: 768px) {
+ .blog-grid { grid-template-columns: 1fr; }
+ .compare-bar { left: 16px; right: 16px; bottom: 16px; flex-wrap: wrap; justify-content: center; }
+}
+
+/* ===== Auth Page ===== */
+.auth-page {
+ min-height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 40px 24px;
+ position: relative;
+ z-index: 1;
+}
+
+.auth-card {
+ width: 100%;
+ max-width: 420px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 40px;
+ backdrop-filter: blur(20px);
+}
+
+.auth-back {
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 24px;
+ display: inline-block;
+}
+
+.auth-header {
+ text-align: center;
+ margin-bottom: 28px;
+}
+
+.auth-header h1 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin: 12px 0 6px;
+}
+
+.auth-header p {
+ color: var(--text-muted);
+ font-size: 0.9rem;
+}
+
+.auth-tabs {
+ display: flex;
+ gap: 8px;
+ margin-bottom: 24px;
+}
+
+.auth-tabs button {
+ flex: 1;
+ padding: 10px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-secondary);
+ font-family: inherit;
+ cursor: pointer;
+ transition: all var(--transition);
+}
+
+.auth-tabs button.active {
+ background: var(--accent-3);
+ color: #0a0e17;
+ border-color: var(--accent-3);
+}
+
+.auth-form .calc-field input {
+ width: 100%;
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ font-size: 0.9rem;
+ outline: none;
+}
+
+.auth-error {
+ color: var(--accent-1);
+ font-size: 0.85rem;
+ margin-bottom: 12px;
+}
+
+.auth-divider {
+ text-align: center;
+ margin: 20px 0;
+ color: var(--text-muted);
+ font-size: 0.8rem;
+ position: relative;
+}
+
+.auth-divider::before,
+.auth-divider::after {
+ content: '';
+ position: absolute;
+ top: 50%;
+ width: 40%;
+ height: 1px;
+ background: var(--border-glass);
+}
+
+.auth-divider::before { left: 0; }
+.auth-divider::after { right: 0; }
+
+.auth-hint {
+ text-align: center;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ margin-top: 16px;
+}
+
+/* ===== Detail Pages ===== */
+.detail-page {
+ min-height: 100vh;
+ padding: calc(var(--nav-height) + 40px) 24px 80px;
+ max-width: 800px;
+ margin: 0 auto;
+ position: relative;
+ z-index: 1;
+}
+
+.detail-nav {
+ margin-bottom: 32px;
+}
+
+.detail-nav a {
+ color: var(--accent-3);
+ font-size: 0.9rem;
+ font-weight: 500;
+}
+
+.blog-detail-header {
+ margin-bottom: 40px;
+}
+
+.blog-detail-emoji {
+ font-size: 4rem;
+ margin-bottom: 16px;
+ display: block;
+}
+
+.blog-detail-header h1 {
+ font-family: var(--font-display);
+ font-size: clamp(1.75rem, 4vw, 2.5rem);
+ line-height: 1.3;
+ margin: 16px 0;
+}
+
+.blog-detail-content {
+ line-height: 1.8;
+ color: var(--text-secondary);
+}
+
+.blog-detail-content h2 {
+ font-family: var(--font-display);
+ color: var(--text-primary);
+ font-size: 1.3rem;
+ margin: 32px 0 12px;
+}
+
+.blog-detail-content h3 {
+ color: var(--text-primary);
+ font-size: 1.1rem;
+ margin: 24px 0 8px;
+}
+
+.blog-detail-content p {
+ margin-bottom: 12px;
+}
+
+.blog-detail-content li {
+ margin-left: 20px;
+ margin-bottom: 6px;
+}
+
+.dest-detail-hero {
+ height: 240px;
+ border-radius: var(--radius-xl);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 32px;
+}
+
+.dest-detail-emoji {
+ font-size: 6rem;
+}
+
+.dest-detail-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ margin-bottom: 16px;
+}
+
+.dest-detail-top h1 {
+ font-family: var(--font-display);
+ font-size: 2rem;
+ margin-top: 8px;
+}
+
+.dest-detail-desc {
+ color: var(--text-secondary);
+ line-height: 1.7;
+ margin-bottom: 24px;
+}
+
+/* ===== Nav User ===== */
+.nav-notify {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ font-size: 1rem;
+ text-decoration: none;
+}
+
+.nav-user {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 6px 12px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: 100px;
+ font-size: 0.85rem;
+}
+
+.nav-user-name {
+ max-width: 80px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.nav-user-avatar-img {
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ object-fit: cover;
+ flex-shrink: 0;
+}
+
+.nav-logout {
+ background: none;
+ border: none;
+ color: var(--text-muted);
+ cursor: pointer;
+ font-size: 0.75rem;
+ padding: 2px 4px;
+}
+
+.nav-logout:hover { color: var(--accent-1); }
+
+.nav-login-btn {
+ padding: 8px 20px;
+ border-radius: 100px;
+ background: var(--gradient-main);
+ color: #0a0e17;
+ font-weight: 600;
+ font-size: 0.85rem;
+ transition: transform var(--transition);
+}
+
+.nav-login-btn:hover { transform: scale(1.05); }
+
+.blog-card {
+ text-decoration: none;
+ color: inherit;
+ display: block;
+}
+
+@media (max-width: 768px) {
+ .nav-user-name { display: none; }
+}
+
+/* ===== Profile Page ===== */
+.profile-page {
+ max-width: 900px;
+ margin: 0 auto;
+ padding: calc(var(--nav-height) + 40px) 24px 80px;
+ position: relative;
+ z-index: 1;
+}
+
+.profile-header {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ margin-bottom: 40px;
+ flex-wrap: wrap;
+}
+
+.profile-avatar {
+ font-size: 4rem;
+ width: 80px;
+ height: 80px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: var(--bg-glass);
+ border-radius: 50%;
+ border: var(--border-glass);
+}
+
+.profile-avatar-wrap {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+}
+
+.profile-avatar-img {
+ width: 80px;
+ height: 80px;
+ border-radius: 50%;
+ object-fit: cover;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+}
+
+.profile-avatar-upload {
+ font-size: 0.75rem;
+ color: var(--accent-3);
+ cursor: pointer;
+ opacity: 0.9;
+}
+
+.profile-avatar-upload:hover {
+ opacity: 1;
+ text-decoration: underline;
+}
+
+.profile-info { flex: 1; }
+.profile-info h1 {
+ font-family: var(--font-display);
+ font-size: 1.75rem;
+ margin-bottom: 4px;
+}
+.profile-info p { color: var(--text-muted); font-size: 0.9rem; }
+
+.profile-level {
+ display: inline-block;
+ margin-top: 8px;
+ padding: 4px 14px;
+ border-radius: 100px;
+ background: rgba(78, 205, 196, 0.15);
+ color: var(--accent-3);
+ font-size: 0.8rem;
+ font-weight: 600;
+}
+
+.profile-badges-row {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-top: 8px;
+ align-items: center;
+}
+
+.profile-badges-row .profile-level {
+ margin-top: 0;
+}
+
+.profile-vip-badge {
+ display: inline-block;
+ padding: 4px 12px;
+ border-radius: 100px;
+ background: rgba(255, 193, 7, 0.18);
+ color: #e6b800;
+ font-size: 0.8rem;
+ font-weight: 600;
+}
+
+.profile-stats-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 16px;
+ margin-bottom: 48px;
+}
+
+.profile-connect-block {
+ margin-bottom: 48px;
+}
+
+.profile-connect-title {
+ font-size: 0.95rem;
+ font-weight: 600;
+ margin: 0 0 12px;
+ color: var(--text-muted);
+ letter-spacing: 0.02em;
+}
+
+.profile-connect-stats {
+ margin-bottom: 0;
+ grid-template-columns: repeat(3, 1fr);
+}
+
+.profile-stat-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 24px 16px;
+ text-align: center;
+ backdrop-filter: blur(20px);
+}
+
+a.profile-stat-link {
+ display: block;
+ color: inherit;
+ text-decoration: none;
+ transition: border-color 0.2s ease, transform 0.2s ease;
+}
+
+a.profile-stat-link:hover {
+ border-color: var(--accent, #e8a87c);
+ transform: translateY(-2px);
+}
+
+.profile-stat-card strong {
+ display: block;
+ font-size: 1.75rem;
+ font-family: var(--font-display);
+ margin: 8px 0 4px;
+}
+
+.profile-stat-card span:last-child {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.profile-link {
+ color: var(--accent-3);
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+
+.profile-favorites h2,
+.profile-quick h2 {
+ font-family: var(--font-display);
+ font-size: 1.25rem;
+ margin-bottom: 20px;
+}
+
+.profile-fav-grid {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 16px;
+ margin-bottom: 48px;
+}
+
+.profile-fav-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.profile-fav-card:hover {
+ border-color: rgba(78, 205, 196, 0.3);
+ transform: translateY(-2px);
+}
+
+.profile-fav-card a { text-decoration: none; color: inherit; }
+.fav-emoji { font-size: 2rem; display: block; margin-bottom: 8px; }
+.profile-fav-card h3 { font-size: 1rem; margin-bottom: 4px; }
+.profile-fav-card p { font-size: 0.8rem; color: var(--text-muted); }
+
+.profile-empty {
+ text-align: center;
+ padding: 60px 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ margin-bottom: 48px;
+}
+
+.profile-empty p { color: var(--text-muted); margin: 12px 0 20px; }
+.profile-loading { color: var(--text-muted); padding: 40px; text-align: center; }
+
+.profile-quick-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 12px;
+}
+
+.quick-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-align: center;
+ font-size: 0.9rem;
+ font-weight: 500;
+ transition: all var(--transition);
+ text-decoration: none;
+ color: inherit;
+}
+
+.quick-card:hover {
+ background: var(--accent-3);
+ color: #0a0e17;
+ transform: translateY(-2px);
+}
+
+/* ===== Not Found & Loading ===== */
+.not-found-page,
+.page-loading {
+ min-height: 80vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ position: relative;
+ z-index: 1;
+ gap: 16px;
+}
+
+.not-found-emoji { font-size: 5rem; }
+.not-found-page h1 {
+ font-family: var(--font-display);
+ font-size: 4rem;
+ background: var(--gradient-text);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+.not-found-page p { color: var(--text-muted); }
+
+.page-loading-spinner {
+ width: 48px;
+ height: 48px;
+ border: 3px solid var(--bg-glass);
+ border-top-color: var(--accent-3);
+ border-radius: 50%;
+ animation: spin 0.8s linear infinite;
+}
+
+@keyframes spin { to { transform: rotate(360deg); } }
+.page-loading p { color: var(--text-muted); }
+
+@media (max-width: 768px) {
+ .profile-stats-grid { grid-template-columns: repeat(2, 1fr); }
+ .profile-fav-grid { grid-template-columns: 1fr; }
+ .profile-quick-grid { grid-template-columns: repeat(2, 1fr); }
+}
+
+/* ===== Global Search ===== */
+.search-trigger {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 8px 14px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-muted);
+ font-size: 0.8rem;
+ cursor: pointer;
+ transition: all var(--transition);
+ position: fixed;
+ top: calc(var(--nav-height) + 44px);
+ right: 24px;
+ z-index: 998;
+ backdrop-filter: blur(10px);
+}
+
+.search-trigger:hover {
+ border-color: var(--accent-3);
+ color: var(--text-primary);
+}
+
+.search-trigger kbd {
+ padding: 2px 6px;
+ border-radius: 4px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ font-size: 0.7rem;
+ font-family: inherit;
+}
+
+.search-overlay {
+ position: fixed;
+ inset: 0;
+ z-index: 5000;
+ background: rgba(0, 0, 0, 0.6);
+ backdrop-filter: blur(8px);
+ display: flex;
+ align-items: flex-start;
+ justify-content: center;
+ padding-top: 15vh;
+}
+
+.search-modal {
+ width: 100%;
+ max-width: 560px;
+ background: var(--bg-secondary);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ overflow: hidden;
+ box-shadow: var(--shadow-card);
+ animation: searchIn 0.2s ease;
+}
+
+@keyframes searchIn {
+ from { opacity: 0; transform: scale(0.95) translateY(-10px); }
+ to { opacity: 1; transform: scale(1) translateY(0); }
+}
+
+.search-input-wrap {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 16px 20px;
+ border-bottom: var(--border-glass);
+}
+
+.search-input-wrap input {
+ flex: 1;
+ background: none;
+ border: none;
+ outline: none;
+ color: var(--text-primary);
+ font-size: 1rem;
+ font-family: inherit;
+}
+
+.search-input-wrap button {
+ padding: 4px 8px;
+ border-radius: 4px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ color: var(--text-muted);
+ font-size: 0.7rem;
+ cursor: pointer;
+}
+
+.search-results {
+ max-height: 360px;
+ overflow-y: auto;
+ padding: 8px;
+}
+
+.search-result {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ width: 100%;
+ padding: 12px 16px;
+ border: none;
+ background: none;
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ text-align: left;
+ color: inherit;
+ font-family: inherit;
+ transition: background var(--transition);
+}
+
+.search-result:hover,
+.search-result.active {
+ background: var(--bg-glass);
+}
+
+.search-result-emoji { font-size: 1.5rem; flex-shrink: 0; }
+
+.search-result-text {
+ flex: 1;
+ min-width: 0;
+}
+
+.search-result-text strong {
+ display: block;
+ font-size: 0.9rem;
+ margin-bottom: 2px;
+}
+
+.search-result-text span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: block;
+}
+
+.search-result-type {
+ font-size: 0.7rem;
+ padding: 3px 8px;
+ border-radius: 100px;
+ background: rgba(78, 205, 196, 0.15);
+ color: var(--accent-3);
+ flex-shrink: 0;
+}
+
+.search-empty {
+ padding: 32px;
+ text-align: center;
+ color: var(--text-muted);
+ font-size: 0.9rem;
+}
+
+.search-hints {
+ padding: 24px;
+ text-align: center;
+ color: var(--text-muted);
+ font-size: 0.8rem;
+ line-height: 2;
+}
+
+/* ===== Trip Planner ===== */
+.trip-section {
+ background: linear-gradient(180deg, transparent, rgba(255, 107, 107, 0.02), transparent);
+}
+
+.trip-wrapper {
+ display: grid;
+ grid-template-columns: 320px 1fr;
+ gap: 32px;
+ align-items: start;
+}
+
+.trip-form {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 28px;
+ backdrop-filter: blur(20px);
+ position: sticky;
+ top: calc(var(--nav-height) + 20px);
+}
+
+.trip-form h3 {
+ font-family: var(--font-display);
+ margin-bottom: 20px;
+}
+
+.trip-timeline {
+ min-height: 300px;
+}
+
+.trip-empty {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 300px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ color: var(--text-muted);
+ gap: 12px;
+}
+
+.trip-route {
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ margin-bottom: 24px;
+}
+
+.trip-stop {
+ display: flex;
+ align-items: flex-start;
+ gap: 16px;
+ position: relative;
+}
+
+.trip-stop-dot {
+ font-size: 1.5rem;
+ width: 48px;
+ height: 48px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: 50%;
+ flex-shrink: 0;
+ z-index: 1;
+}
+
+.trip-stop-line {
+ position: absolute;
+ left: 23px;
+ top: 48px;
+ width: 2px;
+ height: calc(100% - 16px);
+ background: linear-gradient(to bottom, var(--accent-3), var(--accent-1));
+ opacity: 0.3;
+}
+
+.trip-stop-card {
+ flex: 1;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 16px 20px;
+ margin-bottom: 16px;
+ backdrop-filter: blur(20px);
+ transition: all var(--transition);
+}
+
+.trip-stop-card:hover {
+ border-color: rgba(78, 205, 196, 0.3);
+}
+
+.trip-stop-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+}
+
+.trip-remove {
+ background: none;
+ border: none;
+ color: var(--text-muted);
+ cursor: pointer;
+ font-size: 0.8rem;
+ padding: 4px;
+}
+
+.trip-remove:hover { color: var(--accent-1); }
+
+.trip-stop-controls {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+}
+
+.trip-stop-controls input {
+ width: 50px;
+ padding: 4px 8px;
+ border-radius: var(--radius-sm);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ text-align: center;
+}
+
+.trip-stop-cost {
+ margin-left: auto;
+ font-weight: 700;
+ color: var(--accent-3);
+}
+
+.trip-summary {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+ padding: 20px 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ flex-wrap: wrap;
+}
+
+.trip-summary-stat {
+ text-align: center;
+}
+
+.trip-summary-stat span {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ margin-bottom: 4px;
+}
+
+.trip-summary-stat strong {
+ font-family: var(--font-display);
+ font-size: 1.25rem;
+}
+
+@media (max-width: 1024px) {
+ .trip-wrapper { grid-template-columns: 1fr; }
+ .trip-form { position: static; }
+ .search-trigger { top: auto; bottom: 80px; right: 16px; }
+}
+
+@media (max-width: 768px) {
+ .search-trigger span,
+ .search-trigger kbd { display: none; }
+}
+
+/* ===== Scroll Progress ===== */
+.scroll-progress {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 3px;
+ z-index: 9999;
+ background: rgba(255, 255, 255, 0.04);
+}
+
+.scroll-progress-bar {
+ height: 100%;
+ background: linear-gradient(90deg, #FF6B6B, #FFE66D, #4ECDC4);
+ transition: width 0.1s linear;
+ box-shadow: 0 0 12px rgba(78, 205, 196, 0.5);
+}
+
+/* ===== Toast Stack ===== */
+.toast-stack {
+ position: fixed;
+ bottom: 30px;
+ left: 50%;
+ transform: translateX(-50%);
+ z-index: 10000;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ pointer-events: none;
+}
+
+.toast-stack .toast {
+ position: relative;
+ bottom: auto;
+ left: auto;
+ transform: translateY(20px);
+ opacity: 0;
+ animation: toastIn 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
+ pointer-events: auto;
+}
+
+.toast-stack .toast.show { opacity: 1; transform: translateY(0); }
+
+.toast-action {
+ margin-left: 0.35rem;
+ padding: 0.25rem 0.55rem;
+ border-radius: var(--radius-sm, 6px);
+ background: rgba(255, 255, 255, 0.08);
+ color: var(--accent, #4ecdc4);
+ font-size: 0.85rem;
+ font-weight: 600;
+ text-decoration: none;
+ white-space: nowrap;
+}
+.toast-action:hover {
+ background: rgba(255, 255, 255, 0.14);
+}
+
+@keyframes toastIn {
+ from { opacity: 0; transform: translateY(20px) scale(0.95); }
+ to { opacity: 1; transform: translateY(0) scale(1); }
+}
+
+.toast-info { border-color: rgba(78, 205, 196, 0.3); }
+.toast-error { border-color: rgba(255, 107, 107, 0.3); }
+
+/* ===== Destination Matcher ===== */
+.matcher-fab {
+ position: fixed;
+ bottom: 30px;
+ left: 30px;
+ z-index: 1400;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 12px 20px;
+ background: linear-gradient(135deg, rgba(255, 107, 107, 0.9), rgba(78, 205, 196, 0.9));
+ border: none;
+ border-radius: 50px;
+ color: #fff;
+ font-family: inherit;
+ font-weight: 600;
+ font-size: 0.9rem;
+ cursor: pointer;
+ box-shadow: 0 8px 32px rgba(255, 107, 107, 0.3);
+ transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
+ backdrop-filter: blur(10px);
+}
+
+.matcher-fab:hover {
+ transform: translateY(-3px) scale(1.03);
+ box-shadow: 0 12px 40px rgba(255, 107, 107, 0.4);
+}
+
+.matcher-fab-icon { font-size: 1.2rem; }
+
+.matcher-modal {
+ max-width: 560px;
+ width: 95%;
+ overflow: hidden;
+ padding: 0;
+}
+
+.matcher-progress {
+ height: 4px;
+ background: rgba(255, 255, 255, 0.06);
+}
+
+.matcher-progress-bar {
+ height: 100%;
+ background: linear-gradient(90deg, #FF6B6B, #FFE66D, #4ECDC4);
+ transition: width 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.matcher-body {
+ padding: 36px 32px 28px;
+ min-height: 420px;
+}
+
+.matcher-step-meta {
+ text-align: center;
+ margin-bottom: 28px;
+}
+
+.matcher-step-meta h2 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin: 12px 0 8px;
+}
+
+.matcher-step-meta p {
+ color: var(--text-muted);
+ font-size: 0.9rem;
+}
+
+.matcher-options {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.matcher-option {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding: 16px 20px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ cursor: pointer;
+ transition: all 0.25s ease;
+ font-family: inherit;
+ color: var(--text-primary);
+ text-align: left;
+}
+
+.matcher-option:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.08);
+ transform: translateX(6px);
+}
+
+.matcher-option-emoji { font-size: 1.8rem; flex-shrink: 0; }
+
+.matcher-option strong {
+ display: block;
+ font-size: 1rem;
+ margin-bottom: 2px;
+}
+
+.matcher-option span {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.matcher-option-arrow {
+ margin-left: auto;
+ opacity: 0.3;
+ transition: all 0.2s;
+ flex-shrink: 0;
+}
+
+.matcher-option:hover .matcher-option-arrow {
+ opacity: 1;
+ transform: translateX(4px);
+}
+
+.matcher-back {
+ margin-top: 20px;
+ background: none;
+ border: none;
+ color: var(--text-muted);
+ font-family: inherit;
+ cursor: pointer;
+ font-size: 0.85rem;
+ padding: 8px 0;
+}
+
+.matcher-back:hover { color: var(--text-primary); }
+
+.matcher-step,
+.matcher-results {
+ animation: matcherSlide 0.35s ease forwards;
+}
+
+.matcher-forward { animation-name: matcherSlide; }
+.matcher-back { animation-name: matcherSlideBack; }
+
+@keyframes matcherSlide {
+ from { opacity: 0; transform: translateX(30px); }
+ to { opacity: 1; transform: translateX(0); }
+}
+
+@keyframes matcherSlideBack {
+ from { opacity: 0; transform: translateX(-30px); }
+ to { opacity: 1; transform: translateX(0); }
+}
+
+.matcher-result-list {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ margin-bottom: 20px;
+}
+
+.matcher-result-card {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) auto;
+ gap: 10px;
+ padding: 12px 12px 12px 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ color: inherit;
+ transition: all 0.25s ease;
+ align-items: center;
+}
+
+.matcher-result-main {
+ display: grid;
+ grid-template-columns: auto auto 1fr auto;
+ grid-template-rows: auto auto;
+ gap: 4px 12px;
+ align-items: center;
+ text-decoration: none;
+ color: inherit;
+ min-width: 0;
+}
+
+.matcher-add-btn {
+ flex-shrink: 0;
+ padding: 8px 12px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--accent-2);
+ font-size: 0.8rem;
+ font-weight: 600;
+ cursor: pointer;
+ white-space: nowrap;
+}
+.matcher-add-btn:hover {
+ border-color: var(--accent-2);
+ background: color-mix(in srgb, var(--accent-2) 12%, transparent);
+}
+
+.matcher-option.selected {
+ border-color: rgba(78, 205, 196, 0.55);
+ box-shadow: 0 0 0 1px rgba(78, 205, 196, 0.25);
+}
+
+.matcher-result-card:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ transform: translateY(-2px);
+ box-shadow: var(--shadow-card);
+}
+
+.matcher-result-card.top {
+ border-color: rgba(255, 230, 109, 0.4);
+ background: linear-gradient(135deg, rgba(255, 107, 107, 0.06), rgba(78, 205, 196, 0.06));
+}
+
+.matcher-result-rank { font-size: 1.2rem; grid-row: span 2; }
+.matcher-result-emoji { font-size: 2rem; grid-row: span 2; }
+
+.matcher-result-info strong {
+ display: block;
+ font-size: 1rem;
+}
+
+.matcher-result-info span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.matcher-result-score {
+ grid-column: 4;
+ grid-row: 1;
+ text-align: right;
+ font-size: 0.75rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+.matcher-score-bar {
+ width: 80px;
+ height: 4px;
+ background: rgba(255, 255, 255, 0.08);
+ border-radius: 2px;
+ margin-bottom: 4px;
+ overflow: hidden;
+}
+
+.matcher-score-fill {
+ height: 100%;
+ background: linear-gradient(90deg, #FF6B6B, #4ECDC4);
+ border-radius: 2px;
+ transition: width 0.8s ease;
+}
+
+.matcher-result-tags {
+ grid-column: 3 / -1;
+ display: flex;
+ gap: 12px;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.matcher-actions {
+ display: flex;
+ gap: 12px;
+ justify-content: center;
+}
+
+.dest-matcher-btn {
+ margin-top: 16px;
+}
+
+.hero-matcher-btn {
+ cursor: pointer;
+}
+
+/* ===== Compare Modal Enhanced ===== */
+.compare-modal {
+ max-width: 900px;
+ width: 95%;
+}
+
+.compare-modal-body { padding: 36px 32px; }
+
+.compare-modal-header {
+ text-align: center;
+ margin-bottom: 28px;
+}
+
+.compare-modal-header h2 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin: 8px 0;
+}
+
+.compare-cards {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
+ gap: 16px;
+ margin-bottom: 32px;
+}
+
+.compare-city-card {
+ text-align: center;
+ padding: 24px 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ position: relative;
+ transition: all 0.3s ease;
+}
+
+.compare-city-card.winner {
+ border-color: rgba(255, 230, 109, 0.5);
+ background: linear-gradient(180deg, rgba(255, 230, 109, 0.08), transparent);
+}
+
+.compare-winner-badge {
+ position: absolute;
+ top: -10px;
+ left: 50%;
+ transform: translateX(-50%);
+ background: linear-gradient(135deg, #FF6B6B, #FFE66D);
+ color: #0a0e17;
+ font-size: 0.7rem;
+ font-weight: 700;
+ padding: 4px 12px;
+ border-radius: 20px;
+ white-space: nowrap;
+}
+
+.compare-city-emoji { font-size: 2.5rem; display: block; margin-bottom: 8px; }
+
+.compare-city-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.1rem;
+}
+
+.compare-city-country {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.compare-score-ring {
+ position: relative;
+ width: 80px;
+ height: 80px;
+ margin: 16px auto;
+}
+
+.compare-score-ring svg { width: 100%; height: 100%; }
+
+.compare-score-num {
+ position: absolute;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 1.2rem;
+}
+
+.compare-city-link {
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ text-decoration: none;
+}
+
+.compare-city-link:hover { text-decoration: underline; }
+
+.compare-metrics { display: flex; flex-direction: column; gap: 20px; }
+
+.compare-metric-row {
+ display: grid;
+ grid-template-columns: 100px 1fr;
+ gap: 16px;
+ align-items: start;
+}
+
+.compare-metric-label {
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ padding-top: 4px;
+}
+
+.compare-metric-bars { display: flex; flex-direction: column; gap: 8px; }
+
+.compare-bar-item { flex: 1; }
+
+.compare-bar-header {
+ display: flex;
+ justify-content: space-between;
+ font-size: 0.8rem;
+ margin-bottom: 4px;
+}
+
+.compare-best { color: var(--accent-3); font-weight: 600; }
+
+.compare-bar-track {
+ height: 8px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.compare-bar-fill {
+ height: 100%;
+ background: rgba(255, 255, 255, 0.15);
+ border-radius: 4px;
+ transition: width 0.8s cubic-bezier(0.34, 1.56, 0.64, 1);
+ animation: barGrow 0.8s ease forwards;
+}
+
+.compare-bar-fill.best {
+ background: linear-gradient(90deg, #FF6B6B, #4ECDC4);
+}
+
+@keyframes barGrow {
+ from { width: 0 !important; }
+}
+
+/* ===== Timezone Board ===== */
+.timezone-section {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.03), transparent);
+}
+
+.tz-home-clock {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 32px;
+ padding: 28px 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ margin-bottom: 28px;
+ flex-wrap: wrap;
+}
+
+.tz-home-time { display: flex; align-items: center; gap: 16px; }
+
+.tz-live-dot {
+ width: 10px;
+ height: 10px;
+ background: #4ECDC4;
+ border-radius: 50%;
+ animation: pulse 2s infinite;
+}
+
+@keyframes pulse {
+ 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(78, 205, 196, 0.4); }
+ 50% { opacity: 0.8; box-shadow: 0 0 0 8px rgba(78, 205, 196, 0); }
+}
+
+.tz-home-label { font-size: 0.9rem; color: var(--text-muted); }
+
+.tz-home-digits {
+ font-family: var(--font-display);
+ font-size: 2rem;
+ font-weight: 700;
+ font-variant-numeric: tabular-nums;
+}
+
+.tz-seconds {
+ font-size: 1rem;
+ color: var(--text-muted);
+ font-weight: 400;
+}
+
+.tz-work-slider {
+ flex: 1;
+ min-width: 240px;
+}
+
+.tz-work-slider label {
+ display: block;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 12px;
+}
+
+.tz-slider-row {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ font-size: 0.8rem;
+ color: var(--text-muted);
+ margin-bottom: 8px;
+}
+
+.tz-slider-row input[type="range"] {
+ flex: 1;
+ accent-color: var(--accent-3);
+}
+
+.tz-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 16px;
+}
+
+.tz-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ transition: all 0.3s ease;
+}
+
+.tz-card:hover {
+ border-color: rgba(78, 205, 196, 0.3);
+ transform: translateY(-3px);
+}
+
+.tz-card.working {
+ border-color: rgba(78, 205, 196, 0.4);
+ box-shadow: 0 0 20px rgba(78, 205, 196, 0.1);
+}
+
+.tz-card-header {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 16px;
+}
+
+.tz-card-emoji { font-size: 1.5rem; }
+
+.tz-card-header strong {
+ display: block;
+ font-size: 0.95rem;
+}
+
+.tz-card-header span {
+ font-size: 0.7rem;
+ color: var(--text-muted);
+}
+
+.tz-overlap-badge {
+ margin-left: auto;
+ font-size: 0.7rem;
+ font-weight: 600;
+ padding: 3px 10px;
+ border-radius: 20px;
+}
+
+.tz-overlap-badge.excellent { background: rgba(78, 205, 196, 0.2); color: #4ECDC4; }
+.tz-overlap-badge.good { background: rgba(255, 230, 109, 0.2); color: #FFE66D; }
+.tz-overlap-badge.fair { background: rgba(255, 165, 0, 0.2); color: #ffa500; }
+.tz-overlap-badge.poor { background: rgba(255, 107, 107, 0.2); color: #FF6B6B; }
+
+.tz-analog {
+ position: relative;
+ width: 100px;
+ height: 100px;
+ margin: 0 auto 12px;
+}
+
+.tz-analog svg { width: 100%; height: 100%; }
+
+.tz-digital {
+ position: absolute;
+ bottom: -4px;
+ left: 50%;
+ transform: translateX(-50%);
+ font-family: var(--font-display);
+ font-size: 0.85rem;
+ font-weight: 600;
+ font-variant-numeric: tabular-nums;
+}
+
+.tz-overlap-bar {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ margin-bottom: 8px;
+}
+
+.tz-overlap-track {
+ flex: 1;
+ height: 6px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 3px;
+ overflow: hidden;
+}
+
+.tz-overlap-fill {
+ height: 100%;
+ border-radius: 3px;
+ transition: width 0.6s ease;
+}
+
+.tz-overlap-fill.excellent { background: #4ECDC4; }
+.tz-overlap-fill.good { background: #FFE66D; }
+.tz-overlap-fill.fair { background: #ffa500; }
+.tz-overlap-fill.poor { background: #FF6B6B; }
+
+.tz-status {
+ text-align: center;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+/* ===== Keyboard Shortcuts ===== */
+.shortcuts-modal {
+ max-width: 480px;
+ width: 95%;
+}
+
+.shortcuts-body {
+ padding: 36px 32px;
+ text-align: center;
+}
+
+.shortcuts-body h2 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin: 8px 0;
+}
+
+.shortcuts-body p {
+ color: var(--text-muted);
+ font-size: 0.9rem;
+ margin-bottom: 24px;
+}
+
+.shortcuts-grid {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ text-align: left;
+}
+
+.shortcut-item {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 12px 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+}
+
+.shortcut-icon { font-size: 1.2rem; }
+.shortcut-label { flex: 1; font-size: 0.9rem; }
+
+.shortcut-keys {
+ display: flex;
+ gap: 4px;
+}
+
+.shortcut-keys kbd,
+.shortcuts-body kbd {
+ display: inline-block;
+ padding: 3px 8px;
+ background: rgba(255, 255, 255, 0.08);
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ border-radius: 6px;
+ font-family: inherit;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+
+@media (max-width: 768px) {
+ .matcher-fab .matcher-fab-text { display: none; }
+ .matcher-fab { padding: 14px; border-radius: 50%; bottom: 90px; left: 16px; }
+ .compare-metric-row { grid-template-columns: 1fr; }
+ .tz-home-clock { flex-direction: column; text-align: center; }
+ .matcher-result-card { grid-template-columns: 1fr; }
+ .matcher-result-main { grid-template-columns: auto 1fr; }
+ .matcher-result-score { grid-column: 2; grid-row: 2; }
+ .matcher-result-tags { grid-column: 1 / -1; }
+ .matcher-add-btn { width: 100%; }
+}
+
+/* ===== Visa Filters Enhancement ===== */
+.visa-filters {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+ flex-wrap: wrap;
+ margin-bottom: 28px;
+}
+
+.visa-card {
+ transition: all 0.3s ease;
+}
+
+.visa-card:hover {
+ transform: translateY(-4px);
+ border-color: rgba(255, 230, 109, 0.3);
+}
+
+.tool-card {
+ transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.tool-card:hover {
+ transform: translateY(-6px);
+ border-color: rgba(78, 205, 196, 0.3);
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.2);
+}
+
+/* ===== Section Nav ===== */
+.section-nav {
+ position: fixed;
+ right: 20px;
+ top: 50%;
+ transform: translateY(-50%) translateX(60px);
+ z-index: 1300;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ opacity: 0;
+ transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
+ pointer-events: none;
+}
+
+.section-nav.visible {
+ opacity: 1;
+ transform: translateY(-50%) translateX(0);
+ pointer-events: auto;
+}
+
+.section-nav-dot {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 8px 12px 8px 10px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: 50px;
+ cursor: pointer;
+ transition: all 0.25s ease;
+ font-family: inherit;
+ color: var(--text-muted);
+ backdrop-filter: blur(16px);
+ justify-content: flex-end;
+}
+
+.section-nav-dot:hover,
+.section-nav-dot.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ color: var(--text-primary);
+ background: rgba(78, 205, 196, 0.1);
+ transform: translateX(-4px);
+}
+
+.section-nav-dot.active {
+ box-shadow: 0 0 16px rgba(78, 205, 196, 0.2);
+}
+
+.section-nav-emoji { font-size: 1rem; }
+
+.section-nav-label {
+ font-size: 0.75rem;
+ font-weight: 500;
+ max-width: 0;
+ overflow: hidden;
+ white-space: nowrap;
+ transition: max-width 0.3s ease;
+}
+
+.section-nav-dot:hover .section-nav-label,
+.section-nav-dot.active .section-nav-label {
+ max-width: 60px;
+}
+
+/* ===== Currency Converter ===== */
+.currency-section {
+ background: linear-gradient(180deg, transparent, rgba(255, 230, 109, 0.02), transparent);
+}
+
+.currency-wrapper {
+ display: grid;
+ grid-template-columns: 1.2fr 1fr;
+ gap: 24px;
+ align-items: start;
+}
+
+.currency-card {
+ padding: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.currency-input-group label,
+.currency-result label,
+.currency-to-select label {
+ display: block;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 10px;
+}
+
+.currency-input-row {
+ display: flex;
+ gap: 12px;
+}
+
+.currency-input-row input {
+ flex: 1;
+ padding: 14px 18px;
+ font-size: 1.5rem;
+ font-family: var(--font-display);
+ font-weight: 700;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+}
+
+.currency-input-row select {
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ cursor: pointer;
+}
+
+.currency-swap {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 48px;
+ height: 48px;
+ margin: 20px auto;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--accent-3);
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.currency-swap:hover {
+ background: rgba(78, 205, 196, 0.15);
+ transform: rotate(180deg);
+}
+
+.currency-swap.swapping {
+ transform: rotate(360deg);
+}
+
+.currency-result {
+ text-align: center;
+ padding: 24px;
+ background: rgba(78, 205, 196, 0.06);
+ border-radius: var(--radius-lg);
+ margin-bottom: 20px;
+}
+
+.currency-result-display {
+ display: flex;
+ align-items: baseline;
+ justify-content: center;
+ gap: 10px;
+ margin: 12px 0 8px;
+}
+
+.currency-result-flag { font-size: 2rem; }
+
+.currency-result-amount {
+ font-family: var(--font-display);
+ font-size: 2.5rem;
+ font-weight: 800;
+ background: linear-gradient(135deg, #FF6B6B, #4ECDC4);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.currency-result-code {
+ font-size: 1rem;
+ color: var(--text-muted);
+ font-weight: 600;
+}
+
+.currency-rate-hint {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.currency-chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.currency-chip {
+ padding: 8px 14px;
+ border-radius: 50px;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-secondary);
+ font-family: inherit;
+ font-size: 0.8rem;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.currency-chip:hover,
+.currency-chip.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.12);
+ color: var(--accent-3);
+}
+
+.currency-presets {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.currency-presets h3 {
+ font-family: var(--font-display);
+ margin-bottom: 4px;
+}
+
+.currency-presets-desc {
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 20px;
+}
+
+.currency-preset-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 10px;
+ margin-bottom: 20px;
+}
+
+.currency-preset-card {
+ padding: 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ text-align: left;
+ font-family: inherit;
+ color: inherit;
+ transition: all 0.25s ease;
+}
+
+.currency-preset-card:hover {
+ border-color: rgba(255, 230, 109, 0.4);
+ transform: translateY(-2px);
+}
+
+.preset-emoji {
+ font-size: 1.5rem;
+ display: block;
+ margin-bottom: 8px;
+}
+
+.currency-preset-card strong {
+ display: block;
+ font-size: 0.9rem;
+ margin-bottom: 4px;
+}
+
+.currency-preset-card span:last-child {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.currency-tip {
+ display: flex;
+ gap: 10px;
+ padding: 14px;
+ background: rgba(255, 230, 109, 0.06);
+ border-radius: var(--radius-md);
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+/* ===== Nomad Score ===== */
+.nomad-score-section {
+ background: linear-gradient(180deg, transparent, rgba(167, 139, 250, 0.03), transparent);
+}
+
+.nomad-score-card {
+ max-width: 560px;
+ margin: 0 auto;
+ padding: 36px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.nomad-quiz-progress {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+ margin-bottom: 20px;
+}
+
+.nomad-quiz-dot {
+ width: 40px;
+ height: 4px;
+ border-radius: 2px;
+ background: rgba(255, 255, 255, 0.08);
+ transition: all 0.3s ease;
+}
+
+.nomad-quiz-dot.filled { background: var(--accent-3); }
+.nomad-quiz-dot.current { box-shadow: 0 0 8px rgba(78, 205, 196, 0.5); }
+
+.nomad-quiz-step {
+ display: block;
+ text-align: center;
+ font-size: 0.8rem;
+ color: var(--text-muted);
+ margin-bottom: 12px;
+}
+
+.nomad-quiz h3 {
+ text-align: center;
+ font-family: var(--font-display);
+ font-size: 1.25rem;
+ margin-bottom: 24px;
+}
+
+.nomad-quiz-options {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.nomad-quiz-option {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 16px 20px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ cursor: pointer;
+ font-family: inherit;
+ color: var(--text-primary);
+ text-align: left;
+ transition: all 0.25s ease;
+}
+
+.nomad-quiz-option:hover {
+ border-color: rgba(167, 139, 250, 0.4);
+ background: rgba(167, 139, 250, 0.08);
+ transform: translateX(6px);
+}
+
+.nomad-quiz-option span:first-child { font-size: 1.5rem; }
+
+.nomad-quiz.animating {
+ opacity: 0;
+ transform: translateX(-20px);
+ transition: all 0.3s ease;
+}
+
+.nomad-result {
+ text-align: center;
+}
+
+.nomad-score-ring {
+ position: relative;
+ width: 140px;
+ height: 140px;
+ margin: 0 auto 20px;
+}
+
+.nomad-score-ring svg { width: 100%; height: 100%; }
+
+.nomad-score-arc {
+ transition: stroke-dasharray 1s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.nomad-score-center {
+ position: absolute;
+ inset: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.nomad-score-center strong {
+ font-family: var(--font-display);
+ font-size: 2.5rem;
+ font-weight: 800;
+ color: var(--score-color, var(--accent-3));
+}
+
+.nomad-score-center span {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.nomad-level-label {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin-bottom: 8px;
+}
+
+.nomad-level-desc {
+ color: var(--text-muted);
+ font-size: 0.9rem;
+ margin-bottom: 24px;
+ max-width: 360px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.nomad-result-actions {
+ display: flex;
+ gap: 12px;
+ justify-content: center;
+}
+
+/* ===== Lifestyle Interactive ===== */
+.lifestyle-layout {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 40px;
+ align-items: start;
+}
+
+.timeline-item {
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.timeline-item.active .timeline-card {
+ border-color: rgba(78, 205, 196, 0.5);
+ background: rgba(78, 205, 196, 0.08);
+ transform: scale(1.02);
+ box-shadow: 0 8px 32px rgba(78, 205, 196, 0.15);
+}
+
+.timeline-item.active .timeline-time {
+ color: var(--accent-3);
+ font-weight: 700;
+}
+
+.lifestyle-detail-card {
+ position: sticky;
+ top: 100px;
+ padding: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ text-align: center;
+}
+
+.lifestyle-detail-icon {
+ font-size: 3rem;
+ display: block;
+ margin-bottom: 12px;
+}
+
+.lifestyle-detail-time {
+ font-size: 0.85rem;
+ color: var(--text-muted);
+}
+
+.lifestyle-detail-card h3 {
+ font-family: var(--font-display);
+ font-size: 1.5rem;
+ margin: 12px 0;
+}
+
+.lifestyle-detail-card p {
+ color: var(--text-secondary);
+ line-height: 1.7;
+ margin-bottom: 20px;
+}
+
+.lifestyle-tip {
+ display: flex;
+ gap: 10px;
+ padding: 16px;
+ background: rgba(255, 230, 109, 0.08);
+ border-radius: var(--radius-md);
+ text-align: left;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 20px;
+}
+
+.lifestyle-dots {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+}
+
+.lifestyle-dot {
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ border: none;
+ background: rgba(255, 255, 255, 0.15);
+ cursor: pointer;
+ transition: all 0.2s ease;
+ padding: 0;
+}
+
+.lifestyle-dot.active {
+ background: var(--accent-3);
+ transform: scale(1.3);
+}
+
+/* ===== Destination Detail Enhanced ===== */
+.dest-detail-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ margin: 24px 0;
+}
+
+.dest-depth-loading {
+ color: var(--text-muted);
+ font-size: 0.9rem;
+ margin: 0 0 1rem;
+}
+
+.dest-detail-extras {
+ display: grid;
+ grid-template-columns: 1.2fr 1fr;
+ gap: 20px;
+ margin: 28px 0;
+}
+
+.dest-depth-block {
+ margin: 28px 0;
+ padding: 22px 0;
+ border-top: 1px solid color-mix(in srgb, var(--text-muted) 22%, transparent);
+}
+
+.dest-depth-block h3 {
+ font-size: 1.05rem;
+ margin-bottom: 12px;
+}
+
+.dest-depth-muted {
+ color: var(--text-muted);
+ font-size: 0.92rem;
+ margin-top: 8px;
+}
+
+.dest-depth-tags {
+ margin-top: 10px;
+ font-size: 0.9rem;
+}
+
+.dest-depth-list {
+ margin: 10px 0 0;
+ padding-left: 1.1rem;
+ display: grid;
+ gap: 6px;
+}
+
+.dest-cost-grid {
+ display: grid;
+ gap: 8px;
+ max-width: 420px;
+}
+
+.dest-cost-row {
+ display: flex;
+ justify-content: space-between;
+ gap: 16px;
+ padding: 8px 0;
+ border-bottom: 1px dashed color-mix(in srgb, var(--text-muted) 25%, transparent);
+}
+
+.dest-pros-cons {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 24px;
+}
+
+.dest-review-grid {
+ display: grid;
+ gap: 14px;
+}
+
+.dest-review-grid blockquote {
+ margin: 0;
+ padding: 14px 0;
+ border-top: 1px solid color-mix(in srgb, var(--text-muted) 18%, transparent);
+}
+
+.dest-review-grid footer {
+ margin-top: 8px;
+ color: var(--text-muted);
+ font-size: 0.85rem;
+}
+
+@media (max-width: 720px) {
+ .dest-pros-cons { grid-template-columns: 1fr; }
+}
+
+.dest-radar-card {
+ padding: 24px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+
+.dest-radar-card h3 {
+ font-size: 1rem;
+ margin-bottom: 16px;
+}
+
+.dest-radar-row {
+ display: grid;
+ grid-template-columns: 80px 1fr 36px;
+ gap: 10px;
+ align-items: center;
+ margin-bottom: 10px;
+}
+
+.dest-radar-label {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.dest-radar-track {
+ height: 8px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.dest-radar-fill {
+ height: 100%;
+ background: linear-gradient(90deg, #FF6B6B, #4ECDC4);
+ border-radius: 4px;
+ transition: width 0.8s ease;
+}
+
+.dest-radar-val {
+ font-size: 0.8rem;
+ font-weight: 600;
+ text-align: right;
+ color: var(--accent-3);
+}
+
+.dest-info-cards {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.dest-info-mini {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+}
+
+.dest-info-mini span:first-child { font-size: 1.5rem; }
+
+.dest-info-mini strong {
+ display: block;
+ font-size: 0.85rem;
+}
+
+.dest-info-mini span:last-child {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.dest-related {
+ margin-top: 32px;
+ padding-top: 28px;
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
+}
+
+.dest-related h3 {
+ margin-bottom: 16px;
+}
+
+.dest-related-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+ gap: 12px;
+}
+
+.dest-related-card {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 16px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+ transition: all 0.25s ease;
+}
+
+.dest-related-card:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ transform: translateY(-2px);
+}
+
+.dest-related-card span:first-child { font-size: 1.8rem; }
+
+.dest-related-card strong {
+ display: block;
+ font-size: 0.9rem;
+}
+
+.dest-related-card span:last-child {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+/* ===== Blog Reading Progress ===== */
+.blog-reading-progress {
+ position: fixed;
+ top: 3px;
+ left: 0;
+ right: 0;
+ height: 3px;
+ z-index: 9998;
+ background: rgba(255, 255, 255, 0.04);
+}
+
+.blog-reading-bar {
+ height: 100%;
+ background: linear-gradient(90deg, #A78BFA, #4ECDC4);
+ transition: width 0.1s linear;
+}
+
+.blog-reading-pct {
+ position: fixed;
+ top: 12px;
+ right: 20px;
+ z-index: 9998;
+ font-size: 0.7rem;
+ font-weight: 600;
+ color: var(--accent-3);
+ background: var(--bg-card);
+ padding: 4px 10px;
+ border-radius: 20px;
+ border: var(--border-glass);
+}
+
+/* ===== Map Actions ===== */
+.map-info-actions {
+ display: flex;
+ gap: 10px;
+ margin-top: 16px;
+}
+
+.btn-sm {
+ padding: 8px 16px !important;
+ font-size: 0.8rem !important;
+}
+
+/* ===== Profile Trip ===== */
+.profile-trip {
+ margin: 40px 0;
+}
+
+.profile-trip h2 {
+ font-family: var(--font-display);
+ margin-bottom: 20px;
+}
+
+.profile-trip-list {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 20px;
+}
+
+.profile-trip-item {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 14px 0;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
+}
+
+.profile-trip-item:last-of-type { border-bottom: none; }
+
+.trip-item-num {
+ width: 28px;
+ height: 28px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(78, 205, 196, 0.15);
+ border-radius: 50%;
+ font-size: 0.75rem;
+ font-weight: 700;
+ color: var(--accent-3);
+}
+
+.profile-trip-total {
+ padding: 16px 0 12px;
+ font-size: 0.9rem;
+ color: var(--text-muted);
+ text-align: center;
+}
+
+@media (max-width: 1024px) {
+ .currency-wrapper { grid-template-columns: 1fr; }
+ .lifestyle-layout { grid-template-columns: 1fr; }
+ .lifestyle-detail-card { position: static; }
+ .dest-detail-extras { grid-template-columns: 1fr; }
+ .section-nav { display: none; }
+}
+
+@media (max-width: 768px) {
+ .currency-preset-grid { grid-template-columns: 1fr; }
+ .currency-result-amount { font-size: 1.8rem; }
+}
+
+/* ===== Cost Compare ===== */
+.cost-compare-section {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.03), transparent);
+}
+
+.cost-compare-card {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.cost-compare-selectors {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ margin-bottom: 28px;
+}
+
+.cost-compare-select label {
+ display: block;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin-bottom: 10px;
+}
+
+.cost-city-chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.cost-city-chip {
+ padding: 8px 14px;
+ border-radius: 50px;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-secondary);
+ font-family: inherit;
+ font-size: 0.85rem;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.cost-city-chip:hover,
+.cost-city-chip.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.12);
+ color: var(--accent-3);
+}
+
+.cost-compare-select select {
+ width: 100%;
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ font-family: inherit;
+ cursor: pointer;
+}
+
+.cost-compare-bars {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ margin-bottom: 24px;
+}
+
+.cost-bar-label {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 8px;
+ font-size: 0.9rem;
+}
+
+.cost-bar-track {
+ height: 12px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 6px;
+ overflow: hidden;
+}
+
+.cost-bar-fill {
+ height: 100%;
+ border-radius: 6px;
+ transition: width 0.8s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.cost-bar-fill.home {
+ background: linear-gradient(90deg, #FF6B6B, #FFE66D);
+}
+
+.cost-bar-fill.dest {
+ background: rgba(255, 255, 255, 0.2);
+}
+
+.cost-bar-fill.dest.cheaper {
+ background: linear-gradient(90deg, #4ECDC4, #6ee7b7);
+}
+
+.cost-compare-result {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding: 20px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+
+.cost-compare-result.saving {
+ background: rgba(78, 205, 196, 0.08);
+ border-color: rgba(78, 205, 196, 0.3);
+}
+
+.cost-result-emoji { font-size: 2rem; }
+
+.cost-compare-result strong {
+ display: block;
+ font-family: var(--font-display);
+ font-size: 1.15rem;
+ margin-bottom: 4px;
+}
+
+.cost-compare-result p {
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ margin: 0;
+}
+
+/* ===== Tools Filters ===== */
+.tools-filters {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+ flex-wrap: wrap;
+ margin-bottom: 28px;
+}
+
+.tool-links {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin: 10px 0;
+}
+
+.tool-link {
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ text-decoration: none;
+ padding: 4px 10px;
+ background: rgba(78, 205, 196, 0.08);
+ border-radius: 20px;
+ transition: all 0.2s ease;
+}
+
+.tool-link:hover {
+ background: rgba(78, 205, 196, 0.2);
+}
+
+.tool-link-static {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+ padding: 4px 10px;
+ background: var(--bg-glass);
+ border-radius: 20px;
+}
+
+/* ===== Blog Tables ===== */
+.blog-table-wrap {
+ overflow-x: auto;
+ margin: 20px 0;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+}
+
+.blog-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.9rem;
+}
+
+.blog-table th,
+.blog-table td {
+ padding: 12px 16px;
+ text-align: left;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
+}
+
+.blog-table th {
+ background: rgba(78, 205, 196, 0.08);
+ font-weight: 600;
+ color: var(--accent-3);
+}
+
+.blog-table tr:last-child td { border-bottom: none; }
+
+.blog-table tr:hover td {
+ background: rgba(255, 255, 255, 0.02);
+}
+
+/* ===== Cookie Consent ===== */
+.cookie-consent {
+ position: fixed;
+ bottom: 24px;
+ left: 50%;
+ transform: translateX(-50%);
+ z-index: 9000;
+ width: min(560px, calc(100% - 32px));
+ animation: toastIn 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.cookie-consent-inner {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 16px 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+}
+
+.cookie-emoji { font-size: 1.5rem; flex-shrink: 0; }
+
+.cookie-consent-inner p {
+ flex: 1;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin: 0;
+ line-height: 1.5;
+}
+
+.cookie-consent-inner a {
+ color: var(--accent-3);
+ margin-left: 4px;
+}
+
+@media (max-width: 768px) {
+ .cookie-consent-inner {
+ flex-wrap: wrap;
+ justify-content: center;
+ text-align: center;
+ }
+ .cost-compare-card { padding: 20px; }
+ .nav-links.open {
+ animation: menuSlide 0.3s ease;
+ }
+}
+
+@keyframes menuSlide {
+ from { opacity: 0; transform: translateY(-10px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* ===== Visa Wizard ===== */
+.visa-wizard {
+ margin-top: 48px;
+ padding: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.visa-wizard-header {
+ text-align: center;
+ margin-bottom: 28px;
+}
+
+.visa-wizard-header h3 {
+ font-size: 1.5rem;
+ margin: 12px 0 8px;
+}
+
+.visa-wizard-header p {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+}
+
+.visa-wizard-steps {
+ display: flex;
+ justify-content: center;
+ gap: 32px;
+ margin-bottom: 28px;
+}
+
+.wizard-step-dot {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 6px;
+ opacity: 0.4;
+ transition: opacity 0.3s;
+}
+
+.wizard-step-dot span {
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(255, 255, 255, 0.06);
+ border: 2px solid rgba(255, 255, 255, 0.1);
+ font-weight: 600;
+ font-size: 0.85rem;
+}
+
+.wizard-step-dot small {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+
+.wizard-step-dot.active { opacity: 1; }
+.wizard-step-dot.active span {
+ border-color: var(--accent-3);
+ background: rgba(78, 205, 196, 0.15);
+ color: var(--accent-3);
+}
+
+.wizard-step-dot.done span {
+ background: var(--accent-3);
+ color: #0a0e17;
+ border-color: var(--accent-3);
+}
+
+.wizard-options {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 12px;
+ margin-bottom: 24px;
+}
+
+.wizard-option {
+ padding: 16px 20px;
+ background: rgba(255, 255, 255, 0.03);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+ cursor: pointer;
+ transition: all 0.25s;
+ text-align: left;
+}
+
+.wizard-option:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.06);
+}
+
+.wizard-option.selected {
+ border-color: var(--accent-3);
+ background: rgba(78, 205, 196, 0.12);
+ box-shadow: 0 0 20px rgba(78, 205, 196, 0.15);
+}
+
+.wizard-nav {
+ display: flex;
+ justify-content: center;
+ gap: 12px;
+}
+
+.wizard-result-cards {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
+ gap: 16px;
+ margin-bottom: 20px;
+}
+
+.wizard-result-card {
+ position: relative;
+ padding: 20px;
+ background: rgba(255, 255, 255, 0.03);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: var(--radius-lg);
+ transition: transform 0.3s;
+}
+
+.wizard-result-card.winner {
+ border-color: var(--accent-2);
+ background: rgba(255, 230, 109, 0.06);
+}
+
+.wizard-winner-badge {
+ position: absolute;
+ top: -10px;
+ right: 12px;
+ font-size: 0.75rem;
+ padding: 4px 10px;
+ background: linear-gradient(135deg, #FFE66D, #FF6B6B);
+ color: #0a0e17;
+ border-radius: 20px;
+ font-weight: 600;
+}
+
+.wizard-result-top {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 12px;
+}
+
+.wizard-result-flag { font-size: 2rem; }
+
+.wizard-result-card h4 {
+ font-size: 1rem;
+ margin-bottom: 4px;
+}
+
+.wizard-match-score {
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+.wizard-result-card ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.wizard-result-card li {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ padding: 4px 0;
+}
+
+.wizard-result-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin-top: 12px;
+}
+
+.wizard-empty-wrap {
+ text-align: center;
+}
+
+.wizard-empty {
+ text-align: center;
+ color: var(--text-secondary);
+ padding: 20px;
+}
+
+/* ===== Coworking Guide ===== */
+.coworking-section {
+ background: linear-gradient(180deg, transparent, rgba(78, 205, 196, 0.03));
+}
+
+.coworking-controls {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 28px;
+}
+
+.coworking-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.coworking-sort {
+ padding: 8px 14px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.85rem;
+ cursor: pointer;
+}
+
+.coworking-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+ gap: 20px;
+}
+
+.coworking-card {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s, box-shadow 0.3s;
+}
+
+.coworking-card:hover {
+ transform: translateY(-4px);
+ box-shadow: var(--shadow-card);
+}
+
+.coworking-card-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 12px;
+}
+
+.coworking-emoji { font-size: 1.8rem; }
+
+.coworking-rating {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ font-size: 0.8rem;
+ gap: 2px;
+}
+
+.coworking-wifi { color: var(--accent-3); }
+
+.coworking-card h3 {
+ font-size: 1.15rem;
+ margin-bottom: 4px;
+}
+
+.coworking-city {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 10px;
+}
+
+.coworking-price {
+ font-size: 1.1rem;
+ font-weight: 700;
+ color: var(--accent-2);
+ margin-bottom: 12px;
+}
+
+.coworking-perks {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin-bottom: 14px;
+}
+
+.coworking-perk {
+ font-size: 0.75rem;
+ padding: 4px 10px;
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 20px;
+ color: var(--text-secondary);
+}
+
+.coworking-link {
+ font-size: 0.85rem;
+ color: var(--accent-3);
+ font-weight: 500;
+}
+
+/* ===== FAQ Toolbar ===== */
+.faq-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 24px;
+}
+
+.faq-search-wrap {
+ position: relative;
+ flex: 1;
+ min-width: 240px;
+ max-width: 480px;
+}
+
+.faq-search-icon {
+ position: absolute;
+ left: 14px;
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 0.9rem;
+ pointer-events: none;
+}
+
+.faq-search {
+ width: 100%;
+ padding: 12px 40px 12px 40px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+}
+
+.faq-search:focus {
+ outline: none;
+ border-color: rgba(78, 205, 196, 0.5);
+}
+
+.faq-search-clear {
+ position: absolute;
+ right: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+ padding: 4px 8px;
+}
+
+.faq-toolbar-actions {
+ display: flex;
+ gap: 8px;
+}
+
+.btn-sm {
+ padding: 8px 14px !important;
+ font-size: 0.8rem !important;
+}
+
+.faq-empty {
+ text-align: center;
+ color: var(--text-secondary);
+ padding: 32px;
+}
+
+/* ===== Blog Filters ===== */
+.blog-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ justify-content: center;
+ margin-bottom: 28px;
+}
+
+/* ===== Share Button ===== */
+.share-dropdown {
+ position: relative;
+}
+
+.share-trigger { font-size: 0.85rem; }
+
+.share-backdrop {
+ position: fixed;
+ inset: 0;
+ z-index: 100;
+}
+
+.share-menu {
+ position: absolute;
+ top: calc(100% + 8px);
+ right: 0;
+ z-index: 101;
+ min-width: 160px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+ overflow: hidden;
+ animation: toastIn 0.2s ease;
+}
+
+.share-menu button {
+ display: block;
+ width: 100%;
+ padding: 12px 16px;
+ background: none;
+ border: none;
+ color: var(--text-primary);
+ font-size: 0.85rem;
+ text-align: left;
+ cursor: pointer;
+ transition: background 0.2s;
+}
+
+.share-menu button:hover {
+ background: rgba(78, 205, 196, 0.1);
+}
+
+.share-btn-compact {
+ background: rgba(255, 255, 255, 0.06);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: var(--radius-md);
+ padding: 8px 12px;
+ font-size: 1rem;
+ cursor: pointer;
+ transition: all 0.2s;
+}
+
+.share-btn-compact:hover {
+ background: rgba(78, 205, 196, 0.12);
+ border-color: rgba(78, 205, 196, 0.3);
+}
+
+/* ===== Blog Related ===== */
+.blog-related {
+ margin-top: 48px;
+ padding-top: 32px;
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
+}
+
+.blog-related h2 {
+ font-size: 1.3rem;
+ margin-bottom: 20px;
+}
+
+.blog-related-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
+ gap: 16px;
+}
+
+.blog-related-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ transition: transform 0.3s;
+}
+
+.blog-related-card:hover {
+ transform: translateY(-3px);
+}
+
+.blog-related-emoji { font-size: 2rem; display: block; margin-bottom: 8px; }
+
+.blog-related-card h3 {
+ font-size: 1rem;
+ margin-bottom: 8px;
+}
+
+.blog-related-card p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 10px;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+}
+
+.detail-nav {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+/* ===== Profile Badges ===== */
+.profile-badges {
+ margin: 32px 0;
+}
+
+.profile-badges h2 {
+ font-size: 1.2rem;
+ margin-bottom: 16px;
+}
+
+.badge-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
+ gap: 12px;
+}
+
+.badge-card {
+ padding: 16px;
+ text-align: center;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ transition: transform 0.3s;
+}
+
+.badge-card.earned {
+ border-color: rgba(255, 230, 109, 0.3);
+ background: rgba(255, 230, 109, 0.05);
+}
+
+.badge-card.locked {
+ opacity: 0.45;
+ filter: grayscale(0.5);
+}
+
+.badge-card.earned:hover {
+ transform: scale(1.04);
+}
+
+.badge-emoji {
+ font-size: 2rem;
+ display: block;
+ margin-bottom: 6px;
+}
+
+.badge-card strong {
+ display: block;
+ font-size: 0.85rem;
+ margin-bottom: 4px;
+}
+
+.badge-card small {
+ font-size: 0.7rem;
+ color: var(--text-secondary);
+}
+
+/* ===== Auth Enhancements ===== */
+.auth-bg-shapes {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ overflow: hidden;
+}
+
+.auth-shape {
+ position: absolute;
+ font-size: 3rem;
+ opacity: 0.08;
+ animation: authFloat 8s ease-in-out infinite;
+}
+
+.auth-shape-1 { top: 15%; left: 10%; animation-delay: 0s; }
+.auth-shape-2 { top: 60%; right: 15%; animation-delay: -3s; font-size: 2.5rem; }
+.auth-shape-3 { bottom: 20%; left: 30%; animation-delay: -5s; font-size: 2rem; }
+
+@keyframes authFloat {
+ 0%, 100% { transform: translateY(0) rotate(0deg); }
+ 50% { transform: translateY(-20px) rotate(5deg); }
+}
+
+.auth-logo-emoji {
+ font-size: 3rem;
+ display: block;
+ animation: authPulse 2s ease-in-out infinite;
+}
+
+@keyframes authPulse {
+ 0%, 100% { transform: scale(1); }
+ 50% { transform: scale(1.08); }
+}
+
+.auth-pwd-wrap {
+ position: relative;
+}
+
+.auth-pwd-wrap input {
+ width: 100%;
+ padding-right: 44px;
+}
+
+.auth-pwd-toggle {
+ position: absolute;
+ right: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+ background: none;
+ border: none;
+ cursor: pointer;
+ font-size: 1rem;
+ padding: 4px;
+}
+
+.auth-pwd-hint {
+ margin-top: 6px;
+ font-size: 0.78rem;
+ color: var(--text-muted);
+}
+
+.auth-submit {
+ width: 100%;
+}
+
+.auth-loading {
+ display: inline-block;
+ animation: authPulse 1s ease-in-out infinite;
+}
+
+/* ===== 404 Enhancements ===== */
+.not-found-compass {
+ position: relative;
+ width: 120px;
+ height: 120px;
+ margin: 0 auto 24px;
+}
+
+.compass-ring {
+ font-size: 5rem;
+ display: block;
+ animation: compassSpin 6s linear infinite;
+}
+
+.compass-plane {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ font-size: 1.8rem;
+ animation: planeOrbit 4s ease-in-out infinite;
+}
+
+@keyframes compassSpin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+@keyframes planeOrbit {
+ 0%, 100% { transform: translate(-50%, -50%) translateX(30px); }
+ 50% { transform: translate(-50%, -50%) translateX(-30px); }
+}
+
+.not-found-title {
+ font-size: 5rem;
+ background: linear-gradient(135deg, var(--accent-1), var(--accent-2), var(--accent-3));
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.not-found-sub {
+ color: var(--text-secondary);
+ margin-bottom: 24px;
+}
+
+.not-found-actions {
+ display: flex;
+ gap: 12px;
+ justify-content: center;
+ flex-wrap: wrap;
+}
+
+@media (max-width: 768px) {
+ .visa-wizard { padding: 20px; }
+ .visa-wizard-steps { gap: 16px; }
+ .wizard-step-dot small { display: none; }
+ .coworking-controls { flex-direction: column; align-items: stretch; }
+ .faq-toolbar { flex-direction: column; }
+ .faq-search-wrap { max-width: 100%; }
+ .badge-grid { grid-template-columns: repeat(3, 1fr); }
+ .season-grid { grid-template-columns: repeat(3, 1fr); }
+ .packing-filters { flex-direction: column; align-items: stretch; }
+ .nomad-tips { left: 12px; right: 12px; bottom: 80px; max-width: none; }
+}
+
+/* ===== Packing Checklist ===== */
+.packing-card {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.packing-progress { margin-bottom: 24px; }
+
+.packing-progress-info {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 10px;
+ font-size: 0.9rem;
+}
+
+.packing-progress-info strong { font-size: 1.4rem; }
+.packing-count { margin-left: auto; color: var(--text-secondary); }
+
+.packing-bar {
+ height: 8px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.packing-bar-fill {
+ height: 100%;
+ background: linear-gradient(90deg, var(--accent-1), var(--accent-3));
+ border-radius: 4px;
+ transition: width 0.4s ease;
+}
+
+.packing-ready {
+ margin-top: 10px;
+ color: var(--accent-3);
+ font-weight: 600;
+ text-align: center;
+}
+
+.packing-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ align-items: center;
+ margin-bottom: 20px;
+}
+
+.packing-actions {
+ margin-left: auto;
+ display: flex;
+ gap: 6px;
+}
+
+.packing-list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.packing-item {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 12px 14px;
+ background: rgba(255, 255, 255, 0.03);
+ border: 1px solid rgba(255, 255, 255, 0.06);
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ transition: all 0.25s;
+}
+
+.packing-item:hover {
+ border-color: rgba(78, 205, 196, 0.3);
+ background: rgba(78, 205, 196, 0.05);
+}
+
+.packing-item.checked {
+ opacity: 0.65;
+ border-color: rgba(78, 205, 196, 0.35);
+}
+
+.packing-item.checked .packing-label {
+ text-decoration: line-through;
+ color: var(--text-secondary);
+}
+
+.packing-item input { display: none; }
+
+.packing-check {
+ width: 22px;
+ height: 22px;
+ border-radius: 6px;
+ border: 2px solid rgba(255, 255, 255, 0.2);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.75rem;
+ color: #0a0e17;
+ flex-shrink: 0;
+ transition: all 0.2s;
+}
+
+.packing-item.checked .packing-check {
+ background: var(--accent-3);
+ border-color: var(--accent-3);
+}
+
+.packing-emoji { font-size: 1.2rem; }
+.packing-label { font-size: 0.9rem; flex: 1; }
+.arrival-meetup-link {
+ margin-left: auto;
+ color: var(--accent, #4ecdc4);
+ text-decoration: none;
+ font-weight: 600;
+ padding: 0 0.25rem;
+}
+.arrival-meetup-link:hover { text-decoration: underline; }
+
+/* ===== Season Guide ===== */
+.season-card {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.season-cities {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 24px;
+ justify-content: center;
+}
+
+.season-city-btn {
+ padding: 8px 14px;
+ background: rgba(255, 255, 255, 0.04);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: 20px;
+ color: var(--text-primary);
+ font-size: 0.85rem;
+ cursor: pointer;
+ transition: all 0.25s;
+}
+
+.season-city-btn:hover,
+.season-city-btn.active {
+ border-color: var(--accent-3);
+ background: rgba(78, 205, 196, 0.12);
+}
+
+.season-header-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 16px;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+}
+
+.season-header-row h3 { font-size: 1.3rem; margin-bottom: 4px; }
+.season-header-row p { color: var(--text-secondary); font-size: 0.9rem; }
+
+.season-grid {
+ display: grid;
+ grid-template-columns: repeat(6, 1fr);
+ gap: 10px;
+ margin-bottom: 20px;
+}
+
+.season-month {
+ position: relative;
+ padding: 14px 8px;
+ text-align: center;
+ background: rgba(255, 255, 255, 0.03);
+ border: 1px solid color-mix(in srgb, var(--season-color) 40%, transparent);
+ border-radius: var(--radius-md);
+ border-top: 3px solid var(--season-color);
+ transition: transform 0.2s;
+}
+
+.season-month:hover { transform: translateY(-2px); }
+
+.season-month.now {
+ box-shadow: 0 0 16px color-mix(in srgb, var(--season-color) 30%, transparent);
+}
+
+.season-month-emoji { display: block; font-size: 1.2rem; margin-bottom: 4px; }
+.season-month strong { display: block; font-size: 0.9rem; }
+.season-month small { color: var(--text-secondary); font-size: 0.7rem; }
+
+.season-now-tag {
+ position: absolute;
+ top: -8px;
+ right: -4px;
+ font-size: 0.65rem;
+ padding: 2px 6px;
+ background: var(--accent-1);
+ color: #fff;
+ border-radius: 8px;
+ font-weight: 600;
+}
+
+.season-legend {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+ justify-content: center;
+}
+
+.season-legend-item {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+}
+
+.season-legend-item i {
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ display: inline-block;
+}
+
+/* ===== Testimonial Carousel ===== */
+.testimonial-carousel {
+ max-width: 680px;
+ margin: 0 auto 40px;
+ text-align: center;
+}
+
+.testimonial-featured {
+ padding: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ animation: toastIn 0.4s ease;
+}
+
+.testimonial-featured .testimonial-avatar {
+ font-size: 3rem;
+ margin-bottom: 12px;
+}
+
+.testimonial-featured p {
+ font-size: 1.1rem;
+ line-height: 1.7;
+ margin: 12px 0 16px;
+}
+
+.testimonial-dots {
+ display: flex;
+ justify-content: center;
+ gap: 8px;
+ margin-top: 16px;
+}
+
+.testimonial-dot {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ border: none;
+ background: rgba(255, 255, 255, 0.2);
+ cursor: pointer;
+ padding: 0;
+ transition: all 0.3s;
+}
+
+.testimonial-dot.active {
+ width: 24px;
+ border-radius: 4px;
+ background: var(--accent-3);
+}
+
+/* ===== Nomad Tips ===== */
+.nomad-tips {
+ position: fixed;
+ bottom: 100px;
+ left: 24px;
+ z-index: 8500;
+ max-width: 340px;
+ display: flex;
+ align-items: flex-start;
+ gap: 12px;
+ padding: 16px 18px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+ animation: toastIn 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.nomad-tips-emoji { font-size: 1.5rem; flex-shrink: 0; }
+
+.nomad-tips-body strong {
+ display: block;
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ margin-bottom: 4px;
+}
+
+.nomad-tips-body p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin: 0;
+ line-height: 1.45;
+ animation: toastIn 0.3s ease;
+}
+
+.nomad-tips-link {
+ display: inline-block;
+ margin-top: 8px;
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ text-decoration: none;
+}
+
+.nomad-tips-link:hover {
+ text-decoration: underline;
+}
+
+.nomad-tips-close {
+ position: absolute;
+ top: 8px;
+ right: 10px;
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+ font-size: 0.85rem;
+ padding: 2px 6px;
+}
+
+.nomad-tips-dots {
+ position: absolute;
+ bottom: 8px;
+ right: 16px;
+ display: flex;
+ gap: 4px;
+}
+
+.nomad-tips-dots span {
+ width: 5px;
+ height: 5px;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.2);
+}
+
+.nomad-tips-dots span.active { background: var(--accent-3); }
+
+
+/* ===== Spin Globe ===== */
+.spin-card {
+ max-width: 520px;
+ margin: 0 auto;
+ padding: 40px 28px;
+ text-align: center;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.spin-orb {
+ position: relative;
+ width: 140px;
+ height: 140px;
+ margin: 0 auto 20px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.spin-emoji {
+ font-size: 4rem;
+ position: relative;
+ z-index: 2;
+ transition: transform 0.1s;
+}
+
+.spin-orb.spinning .spin-emoji {
+ animation: spinBounce 0.18s ease infinite;
+}
+
+@keyframes spinBounce {
+ 0%, 100% { transform: scale(1) rotate(-4deg); }
+ 50% { transform: scale(1.12) rotate(4deg); }
+}
+
+.spin-orb-ring {
+ position: absolute;
+ inset: 0;
+ border-radius: 50%;
+ border: 2px dashed rgba(78, 205, 196, 0.35);
+ animation: compassSpin 12s linear infinite;
+}
+
+.spin-orb-ring-2 {
+ inset: 12px;
+ border-style: solid;
+ border-color: rgba(255, 230, 109, 0.25);
+ animation-direction: reverse;
+ animation-duration: 8s;
+}
+
+.spin-orb.spinning .spin-orb-ring {
+ animation-duration: 1.2s;
+ border-color: var(--accent-3);
+}
+
+.spin-city-name {
+ font-size: 1.5rem;
+ margin-bottom: 8px;
+}
+
+.spin-hint {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin-bottom: 20px;
+}
+
+.spin-btn { min-width: 200px; }
+
+.spin-result {
+ margin-top: 8px;
+ animation: toastIn 0.4s ease;
+}
+
+.spin-result-tag {
+ color: var(--accent-2);
+ font-weight: 600;
+ margin-bottom: 10px;
+}
+
+.spin-result-meta {
+ display: flex;
+ justify-content: center;
+ gap: 14px;
+ flex-wrap: wrap;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 12px;
+}
+
+.spin-result-desc {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ line-height: 1.6;
+ margin-bottom: 18px;
+}
+
+.spin-result-actions {
+ display: flex;
+ gap: 10px;
+ justify-content: center;
+ flex-wrap: wrap;
+}
+
+/* ===== Flight Cost ===== */
+.flight-card {
+ display: grid;
+ grid-template-columns: 1.1fr 0.9fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.flight-form {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+
+.flight-arrow {
+ text-align: center;
+ font-size: 1.4rem;
+ color: var(--accent-3);
+ opacity: 0.7;
+}
+
+.flight-result {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding: 24px;
+ background: rgba(78, 205, 196, 0.06);
+ border: 1px solid rgba(78, 205, 196, 0.15);
+ border-radius: var(--radius-lg);
+}
+
+.flight-route {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 12px;
+ font-weight: 600;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+}
+
+.flight-plane {
+ animation: planeOrbit 3s ease-in-out infinite;
+}
+
+.flight-nums {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 14px;
+}
+
+.flight-nums div {
+ text-align: center;
+}
+
+.flight-nums small {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-bottom: 4px;
+}
+
+.flight-nums strong {
+ font-size: 1.25rem;
+}
+
+.flight-total {
+ grid-column: 1 / -1;
+ padding-top: 10px;
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
+}
+
+.flight-total strong {
+ font-size: 1.75rem;
+}
+
+.flight-note {
+ margin-top: 16px;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ text-align: center;
+}
+
+/* ===== Nomad Events ===== */
+.events-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ justify-content: center;
+ margin-bottom: 28px;
+}
+
+.events-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+ gap: 20px;
+}
+
+.event-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s, box-shadow 0.3s;
+}
+
+.event-card:hover {
+ transform: translateY(-4px);
+ box-shadow: var(--shadow-card);
+}
+
+.event-card-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 12px;
+}
+
+.event-emoji { font-size: 2rem; }
+
+.event-badge {
+ font-size: 0.75rem;
+ padding: 4px 10px;
+ background: rgba(255, 255, 255, 0.06);
+ border-radius: 20px;
+ color: var(--text-secondary);
+}
+
+.event-badge.online {
+ background: rgba(78, 205, 196, 0.12);
+ color: var(--accent-3);
+}
+
+.event-card h3 {
+ font-size: 1.05rem;
+ margin-bottom: 6px;
+}
+
+.event-date {
+ font-size: 0.85rem;
+ color: var(--accent-2);
+ margin-bottom: 8px;
+}
+
+.event-desc {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.5;
+ margin-bottom: 14px;
+}
+
+/* ===== Legal / Privacy ===== */
+.legal-page {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: calc(var(--nav-height) + 40px) 24px 80px;
+ position: relative;
+ z-index: 1;
+}
+
+.legal-content .section-tag { margin-bottom: 12px; display: inline-block; }
+
+.legal-content h1 {
+ font-size: 2rem;
+ margin-bottom: 8px;
+}
+
+.legal-updated {
+ color: var(--text-secondary);
+ font-size: 0.85rem;
+ margin-bottom: 32px;
+}
+
+.legal-content section {
+ margin-bottom: 28px;
+}
+
+.legal-content h2 {
+ font-size: 1.2rem;
+ margin-bottom: 10px;
+ color: var(--accent-3);
+}
+
+.legal-content p {
+ color: var(--text-secondary);
+ line-height: 1.7;
+}
+
+.legal-content a { color: var(--accent-3); }
+
+@media (max-width: 768px) {
+ .flight-card { grid-template-columns: 1fr; }
+ .spin-card { padding: 28px 20px; }
+}
+
+/* ===== Daily Quote ===== */
+.quote-section { padding-top: 40px; padding-bottom: 40px; }
+
+.quote-card {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: 36px 32px;
+ text-align: center;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ position: relative;
+ overflow: hidden;
+}
+
+.quote-card::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(135deg, rgba(255,107,107,0.06), rgba(78,205,196,0.08));
+ pointer-events: none;
+}
+
+.quote-emoji {
+ font-size: 2.5rem;
+ display: block;
+ margin-bottom: 12px;
+ position: relative;
+}
+
+.quote-card blockquote {
+ font-family: var(--font-display);
+ font-size: clamp(1.15rem, 2.5vw, 1.5rem);
+ font-weight: 600;
+ line-height: 1.6;
+ margin: 0 0 20px;
+ position: relative;
+}
+
+.quote-footer {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 16px;
+ flex-wrap: wrap;
+ position: relative;
+}
+
+/* ===== Wifi Work Score ===== */
+.wifi-layout {
+ display: grid;
+ grid-template-columns: 1.2fr 0.8fr;
+ gap: 24px;
+}
+
+.wifi-picker {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.wifi-meter {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+ margin-top: 20px;
+ flex-wrap: wrap;
+}
+
+.wifi-meter-ring {
+ width: 120px;
+ height: 120px;
+ border-radius: 50%;
+ border: 4px solid var(--wifi-color);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 0 24px color-mix(in srgb, var(--wifi-color) 35%, transparent);
+ flex-shrink: 0;
+}
+
+.wifi-meter-ring strong {
+ font-size: 1.8rem;
+ line-height: 1;
+}
+
+.wifi-meter-ring small {
+ color: var(--text-secondary);
+ font-size: 0.75rem;
+}
+
+.wifi-meter-info h3 {
+ font-size: 1.3rem;
+ margin-bottom: 6px;
+}
+
+.wifi-level {
+ font-weight: 700;
+ font-size: 1rem;
+ display: block;
+ margin-bottom: 8px;
+}
+
+.wifi-meter-info p {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin-bottom: 10px;
+}
+
+.wifi-link {
+ color: var(--accent-3);
+ font-size: 0.85rem;
+}
+
+.wifi-rank {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.wifi-rank h4 {
+ margin-bottom: 14px;
+ font-size: 1rem;
+}
+
+.wifi-rank ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.wifi-rank li {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 10px 12px;
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ transition: background 0.2s;
+ font-size: 0.9rem;
+}
+
+.wifi-rank li:hover,
+.wifi-rank li.active {
+ background: rgba(78, 205, 196, 0.1);
+}
+
+.wifi-rank-num {
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ background: rgba(255,255,255,0.08);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.75rem;
+ font-weight: 700;
+}
+
+.wifi-rank-speed {
+ margin-left: auto;
+ font-weight: 600;
+ font-size: 0.85rem;
+}
+
+/* ===== Savings Goal ===== */
+.savings-card {
+ display: grid;
+ grid-template-columns: 1.1fr 0.9fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.savings-form {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+
+.savings-result {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 20px;
+ padding: 20px;
+ background: rgba(78, 205, 196, 0.05);
+ border-radius: var(--radius-lg);
+}
+
+.savings-ring {
+ width: 140px;
+ height: 140px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.savings-ring-inner {
+ width: 110px;
+ height: 110px;
+ border-radius: 50%;
+ background: var(--bg-card);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.savings-ring-inner strong {
+ font-size: 1.8rem;
+}
+
+.savings-ring-inner small {
+ color: var(--text-secondary);
+ font-size: 0.75rem;
+}
+
+.savings-stats {
+ text-align: center;
+ width: 100%;
+}
+
+.savings-stats > div {
+ margin-bottom: 12px;
+}
+
+.savings-stats small {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-bottom: 2px;
+}
+
+.savings-stats strong {
+ font-size: 1.3rem;
+}
+
+.savings-hint {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ line-height: 1.5;
+ margin-top: 8px;
+}
+
+@media (max-width: 768px) {
+ .wifi-layout,
+ .savings-card {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* ===== Jet Lag ===== */
+.jetlag-card {
+ display: grid;
+ grid-template-columns: 1fr 1.1fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.jetlag-form { display: flex; flex-direction: column; gap: 16px; }
+
+.jetlag-result {
+ padding: 24px;
+ background: rgba(167, 139, 250, 0.06);
+ border: 1px solid rgba(167, 139, 250, 0.15);
+ border-radius: var(--radius-lg);
+}
+
+.jetlag-diff {
+ text-align: center;
+ margin-bottom: 20px;
+}
+
+.jetlag-emoji { font-size: 2.5rem; display: block; margin-bottom: 8px; }
+.jetlag-diff strong { font-size: 1.8rem; display: block; }
+.jetlag-diff small { color: var(--text-secondary); font-size: 0.85rem; }
+
+.jetlag-recovery {
+ text-align: center;
+ margin-bottom: 16px;
+ padding-bottom: 16px;
+ border-bottom: 1px solid rgba(255,255,255,0.06);
+}
+
+.jetlag-recovery span {
+ display: block;
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ margin-bottom: 4px;
+}
+
+.jetlag-recovery strong { font-size: 1.5rem; }
+
+.jetlag-note {
+ margin-top: 8px;
+ font-size: 0.8rem;
+ color: var(--accent-2);
+}
+
+.jetlag-tips {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.jetlag-tips li {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ padding: 6px 0;
+ line-height: 1.45;
+}
+
+/* ===== Housing ===== */
+.housing-cities {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ justify-content: center;
+ margin-bottom: 24px;
+}
+
+.housing-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+ gap: 12px;
+}
+
+.housing-header h3 { font-size: 1.2rem; }
+
+.housing-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 18px;
+}
+
+.housing-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s;
+}
+
+.housing-card:hover { transform: translateY(-4px); }
+
+.housing-card-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+}
+
+.housing-emoji { font-size: 1.8rem; }
+.housing-price { font-size: 0.85rem; color: var(--accent-2); font-weight: 600; }
+.housing-card h4 { font-size: 1.05rem; margin-bottom: 6px; }
+.housing-best { font-size: 0.85rem; color: var(--text-secondary); margin-bottom: 12px; }
+
+.housing-pros { display: flex; flex-wrap: wrap; gap: 6px; }
+.housing-pro {
+ font-size: 0.75rem;
+ padding: 4px 10px;
+ background: rgba(255,255,255,0.05);
+ border-radius: 20px;
+ color: var(--text-secondary);
+}
+
+/* ===== Phrasebook ===== */
+.phrase-card {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.phrase-lang {
+ text-align: center;
+ font-weight: 600;
+ margin-bottom: 20px;
+ color: var(--accent-3);
+}
+
+.phrase-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+ gap: 12px;
+}
+
+.phrase-item {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 4px;
+ padding: 14px 16px;
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.08);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ cursor: pointer;
+ text-align: left;
+ transition: all 0.25s;
+}
+
+.phrase-item:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.08);
+ transform: translateY(-2px);
+}
+
+.phrase-item strong { font-size: 1rem; }
+.phrase-pinyin { font-size: 0.75rem; color: var(--accent-3); }
+.phrase-zh { font-size: 0.85rem; color: var(--text-secondary); }
+
+/* ===== Feedback Widget ===== */
+.pwa-install-hint {
+ position: fixed;
+ left: 16px;
+ right: 16px;
+ bottom: 24px;
+ z-index: 8700;
+ max-width: 420px;
+ margin: 0 auto;
+ padding: 14px 16px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
+}
+
+.pwa-install-hint p {
+ margin: 0 0 10px;
+ font-size: 0.9rem;
+}
+
+.pwa-install-actions {
+ display: flex;
+ gap: 8px;
+}
+
+.feedback-fab {
+ position: fixed;
+ bottom: 100px;
+ right: 24px;
+ z-index: 8600;
+ width: 48px;
+ height: 48px;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-card);
+ backdrop-filter: blur(16px);
+ font-size: 1.3rem;
+ cursor: pointer;
+ box-shadow: var(--shadow-card);
+ transition: transform 0.25s;
+}
+
+.feedback-fab:hover { transform: scale(1.08); }
+
+.feedback-modal { max-width: 420px; }
+
+.feedback-body {
+ padding: 8px 4px 4px;
+ text-align: center;
+}
+
+.feedback-body h2 { margin: 12px 0 8px; font-size: 1.4rem; }
+.feedback-body > p { color: var(--text-secondary); font-size: 0.9rem; margin-bottom: 20px; }
+
+.feedback-types {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+ margin-bottom: 14px;
+ flex-wrap: wrap;
+}
+
+.feedback-textarea {
+ width: 100%;
+ padding: 14px;
+ margin-bottom: 14px;
+ background: rgba(255,255,255,0.04);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+ resize: vertical;
+ font-family: inherit;
+}
+
+.feedback-textarea:focus {
+ outline: none;
+ border-color: rgba(78, 205, 196, 0.5);
+}
+
+@media (max-width: 768px) {
+ .jetlag-card { grid-template-columns: 1fr; }
+ .feedback-fab { bottom: 160px; right: 16px; }
+}
+
+/* ===== Insurance ===== */
+.insurance-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 18px;
+}
+
+.insurance-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ cursor: pointer;
+ transition: transform 0.3s, border-color 0.3s;
+}
+
+.insurance-card:hover { transform: translateY(-3px); }
+.insurance-card.selected {
+ border-color: var(--accent-3);
+ box-shadow: 0 0 20px rgba(78, 205, 196, 0.15);
+}
+
+.insurance-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+}
+
+.insurance-emoji { font-size: 1.8rem; }
+.insurance-price { font-size: 0.85rem; color: var(--accent-2); font-weight: 600; }
+.insurance-card h3 { font-size: 1.05rem; margin-bottom: 6px; }
+.insurance-best { font-size: 0.85rem; color: var(--accent-3); margin-bottom: 10px; }
+
+.insurance-cover {
+ list-style: none;
+ padding: 0;
+ margin: 0 0 12px;
+}
+
+.insurance-cover li {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ padding: 3px 0;
+}
+
+.insurance-note {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ line-height: 1.45;
+}
+
+.insurance-picked {
+ display: inline-block;
+ margin-top: 10px;
+ font-size: 0.75rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+/* ===== Expense Tracker ===== */
+.expense-card {
+ display: grid;
+ grid-template-columns: 0.95fr 1.05fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.expense-form { display: flex; flex-direction: column; gap: 14px; }
+.expense-cats { display: flex; flex-wrap: wrap; gap: 6px; }
+
+.expense-total {
+ text-align: center;
+ margin-bottom: 16px;
+}
+
+.expense-total small {
+ display: block;
+ color: var(--text-secondary);
+ font-size: 0.8rem;
+ margin-bottom: 4px;
+}
+
+.expense-total strong { font-size: 2rem; }
+
+.expense-bars { margin-bottom: 16px; }
+
+.expense-bar-row {
+ display: grid;
+ grid-template-columns: 70px 1fr 70px;
+ gap: 8px;
+ align-items: center;
+ margin-bottom: 8px;
+ font-size: 0.8rem;
+}
+
+.expense-bar {
+ height: 6px;
+ background: rgba(255,255,255,0.06);
+ border-radius: 3px;
+ overflow: hidden;
+}
+
+.expense-bar i {
+ display: block;
+ height: 100%;
+ background: linear-gradient(90deg, var(--accent-1), var(--accent-3));
+ border-radius: 3px;
+}
+
+.expense-list {
+ list-style: none;
+ padding: 0;
+ margin: 0 0 12px;
+ max-height: 280px;
+ overflow-y: auto;
+}
+
+.expense-list li {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 10px 0;
+ border-bottom: 1px solid rgba(255,255,255,0.05);
+ font-size: 0.9rem;
+}
+
+.expense-list li div { flex: 1; min-width: 0; }
+.expense-list li strong { display: block; }
+.expense-list li small { color: var(--text-secondary); font-size: 0.75rem; }
+.expense-amt { color: var(--accent-2); }
+.expense-del {
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+ padding: 4px 8px;
+}
+.expense-empty {
+ text-align: center;
+ color: var(--text-secondary);
+ padding: 20px !important;
+ border: none !important;
+ justify-content: center;
+}
+
+/* ===== SIM Guide ===== */
+.sim-city-title {
+ text-align: center;
+ font-size: 1.15rem;
+ margin-bottom: 20px;
+}
+
+.sim-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
+ gap: 16px;
+}
+
+.sim-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s;
+}
+
+.sim-card:hover { transform: translateY(-3px); }
+.sim-emoji { font-size: 1.8rem; display: block; margin-bottom: 8px; }
+.sim-card h4 { font-size: 1.05rem; margin-bottom: 10px; }
+
+.sim-meta {
+ display: flex;
+ justify-content: space-between;
+ gap: 8px;
+ font-size: 0.85rem;
+ margin-bottom: 10px;
+ flex-wrap: wrap;
+}
+
+.sim-price { color: var(--accent-2); font-weight: 600; }
+.sim-card p { font-size: 0.85rem; color: var(--text-secondary); line-height: 1.45; }
+
+/* ===== About ===== */
+.about-list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.about-list li {
+ padding: 8px 0;
+ color: var(--text-secondary);
+ line-height: 1.5;
+}
+
+.about-actions {
+ display: flex;
+ gap: 12px;
+ flex-wrap: wrap;
+ margin-top: 32px;
+}
+
+@media (max-width: 768px) {
+ .expense-card { grid-template-columns: 1fr; }
+ .expense-bar-row { grid-template-columns: 60px 1fr 60px; }
+}
+
+/* ===== Tax Day Counter ===== */
+.tax-card {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.tax-meter {
+ display: flex;
+ gap: 28px;
+ align-items: center;
+ margin-bottom: 24px;
+ flex-wrap: wrap;
+}
+
+.tax-ring {
+ width: 140px;
+ height: 140px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.tax-risk-warn { background: conic-gradient(#FFE66D var(--pct, 50%), rgba(255,255,255,0.08) 0) !important; }
+.tax-risk-high { background: conic-gradient(#FF6B6B var(--pct, 50%), rgba(255,255,255,0.08) 0) !important; }
+
+.tax-ring-inner {
+ width: 110px;
+ height: 110px;
+ border-radius: 50%;
+ background: var(--bg-card);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.tax-ring-inner strong { font-size: 1.8rem; }
+.tax-ring-inner small { color: var(--text-secondary); font-size: 0.75rem; }
+
+.tax-stats {
+ flex: 1;
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 12px;
+ min-width: 240px;
+}
+
+.tax-stats > div small {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-bottom: 2px;
+}
+
+.tax-stats > div strong { font-size: 1.2rem; }
+.tax-danger { color: #FF6B6B; }
+.tax-hint {
+ grid-column: 1 / -1;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin: 4px 0 0;
+}
+
+.tax-form {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+ margin-bottom: 20px;
+ padding-top: 16px;
+ border-top: 1px solid rgba(255,255,255,0.06);
+}
+
+.tax-log {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ max-height: 220px;
+ overflow-y: auto;
+}
+
+.tax-log li {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 8px 0;
+ border-bottom: 1px solid rgba(255,255,255,0.05);
+ font-size: 0.9rem;
+}
+
+.tax-log li button {
+ margin-left: auto;
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+}
+
+.tax-empty {
+ justify-content: center;
+ color: var(--text-secondary);
+ border: none !important;
+}
+
+/* ===== Arrival Checklist ===== */
+.arrival-card {
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.arrival-progress {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 20px;
+ margin-bottom: 24px;
+ flex-wrap: wrap;
+}
+
+.arrival-progress h3 { font-size: 1.15rem; margin-bottom: 4px; }
+.arrival-progress p { color: var(--text-secondary); font-size: 0.9rem; }
+
+.arrival-days {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 18px;
+}
+
+.arrival-day h4 {
+ font-size: 0.95rem;
+ color: var(--accent-3);
+ margin-bottom: 10px;
+}
+
+.arrival-day ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+/* ===== Cafe Guide ===== */
+.cafe-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 16px;
+}
+
+.cafe-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s;
+}
+
+.cafe-card:hover { transform: translateY(-3px); }
+
+.cafe-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 10px;
+ margin-bottom: 10px;
+}
+
+.cafe-top h4 { font-size: 1.05rem; }
+.cafe-vibe {
+ font-size: 0.75rem;
+ padding: 4px 8px;
+ background: rgba(255,230,109,0.12);
+ color: var(--accent-2);
+ border-radius: 12px;
+ white-space: nowrap;
+}
+
+.cafe-tags {
+ display: flex;
+ gap: 10px;
+ flex-wrap: wrap;
+ font-size: 0.8rem;
+ color: var(--accent-3);
+ margin-bottom: 8px;
+}
+
+.cafe-card p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.45;
+}
+
+/* ===== Onboarding ===== */
+.onboard-card {
+ position: fixed;
+ bottom: 24px;
+ left: 50%;
+ transform: translateX(-50%);
+ z-index: 9200;
+ width: min(380px, calc(100% - 32px));
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ box-shadow: var(--shadow-card);
+ animation: toastIn 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
+ text-align: center;
+}
+
+.onboard-skip {
+ position: absolute;
+ top: 10px;
+ right: 12px;
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+ font-size: 0.8rem;
+}
+
+.onboard-emoji { font-size: 2rem; display: block; margin-bottom: 8px; }
+.onboard-step strong { display: block; font-size: 1.15rem; margin-bottom: 6px; }
+.onboard-step p { color: var(--text-secondary); font-size: 0.9rem; margin-bottom: 14px; }
+
+.onboard-dots {
+ display: flex;
+ justify-content: center;
+ gap: 6px;
+ margin-bottom: 14px;
+}
+
+.onboard-dots span {
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: rgba(255,255,255,0.2);
+}
+
+.onboard-dots span.active {
+ width: 18px;
+ border-radius: 4px;
+ background: var(--accent-3);
+}
+
+@media (max-width: 768px) {
+ .tax-stats { grid-template-columns: 1fr 1fr 1fr; }
+ .onboard-card { bottom: 90px; }
+}
+
+/* ===== Power Plug ===== */
+.plug-card {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.plug-hero {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 16px;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+}
+
+.plug-city { font-size: 1.3rem; font-weight: 700; }
+
+.plug-types { display: flex; gap: 8px; flex-wrap: wrap; }
+
+.plug-type {
+ padding: 6px 12px;
+ background: rgba(78, 205, 196, 0.12);
+ color: var(--accent-3);
+ border-radius: 20px;
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+
+.plug-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 14px;
+ margin-bottom: 16px;
+}
+
+.plug-grid div {
+ padding: 14px;
+ background: rgba(255,255,255,0.03);
+ border-radius: var(--radius-md);
+}
+
+.plug-grid small {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-bottom: 4px;
+}
+
+.plug-grid strong { font-size: 0.95rem; }
+
+.plug-tip {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ line-height: 1.5;
+}
+
+/* ===== Emergency ===== */
+.emergency-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 14px;
+}
+
+.emergency-card {
+ display: flex;
+ gap: 14px;
+ padding: 18px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+}
+
+.emergency-emoji { font-size: 1.8rem; }
+.emergency-card h4 { font-size: 0.9rem; margin-bottom: 4px; color: var(--text-secondary); }
+.emergency-value { font-size: 1.1rem; display: block; margin-bottom: 4px; }
+.emergency-card p { font-size: 0.8rem; color: var(--text-secondary); margin: 0; }
+
+.emergency-disclaimer {
+ text-align: center;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ margin-top: 16px;
+}
+
+/* ===== City Notes ===== */
+.notes-card {
+ display: grid;
+ grid-template-columns: 220px 1fr;
+ gap: 20px;
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+ min-height: 360px;
+}
+
+.notes-sidebar {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ border-right: 1px solid rgba(255,255,255,0.06);
+ padding-right: 12px;
+}
+
+.notes-city {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 10px 12px;
+ background: transparent;
+ border: 1px solid transparent;
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ cursor: pointer;
+ font-size: 0.9rem;
+ text-align: left;
+}
+
+.notes-city:hover,
+.notes-city.active {
+ background: rgba(78, 205, 196, 0.1);
+ border-color: rgba(78, 205, 196, 0.25);
+}
+
+.notes-dot {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background: var(--accent-3);
+}
+
+.notes-count {
+ margin-top: auto;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ padding: 8px 4px 0;
+}
+
+.notes-editor h3 { font-size: 1.15rem; margin-bottom: 12px; }
+
+.notes-textarea {
+ width: 100%;
+ padding: 14px;
+ background: rgba(255,255,255,0.03);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+ font-family: inherit;
+ resize: vertical;
+ line-height: 1.55;
+ margin-bottom: 12px;
+}
+
+.notes-textarea:focus {
+ outline: none;
+ border-color: rgba(78, 205, 196, 0.45);
+}
+
+.notes-actions { display: flex; gap: 10px; }
+
+/* ===== Focus Timer ===== */
+.focus-card {
+ max-width: 420px;
+ margin: 0 auto;
+ padding: 36px 28px;
+ text-align: center;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(20px);
+}
+
+.focus-ring {
+ width: 180px;
+ height: 180px;
+ border-radius: 50%;
+ margin: 0 auto 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.focus-ring-inner {
+ width: 148px;
+ height: 148px;
+ border-radius: 50%;
+ background: var(--bg-card);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.focus-ring-inner strong {
+ font-size: 2.4rem;
+ font-variant-numeric: tabular-nums;
+ letter-spacing: 0.02em;
+}
+
+.focus-ring-inner small {
+ color: var(--text-secondary);
+ font-size: 0.85rem;
+ margin-top: 4px;
+}
+
+.focus-presets {
+ display: flex;
+ justify-content: center;
+ gap: 8px;
+ margin-bottom: 18px;
+}
+
+.focus-actions {
+ display: flex;
+ justify-content: center;
+ gap: 10px;
+}
+
+.focus-done {
+ margin-top: 14px;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+@media (max-width: 768px) {
+ .plug-grid { grid-template-columns: 1fr; }
+ .notes-card { grid-template-columns: 1fr; }
+ .notes-sidebar {
+ flex-direction: row;
+ flex-wrap: wrap;
+ border-right: none;
+ border-bottom: 1px solid rgba(255,255,255,0.06);
+ padding-right: 0;
+ padding-bottom: 12px;
+ }
+ .notes-count { width: 100%; margin-top: 4px; }
+}
+
+/* ===== Tools Hub ===== */
+.tools-hub-page {
+ padding: calc(var(--nav-height) + 40px) 0 80px;
+ position: relative;
+ z-index: 1;
+}
+
+.tools-hub-page .section-header h1 {
+ font-size: clamp(1.8rem, 4vw, 2.4rem);
+ margin: 12px 0 8px;
+}
+
+.tools-hub-toolbar {
+ margin: 28px auto 32px;
+ max-width: 900px;
+}
+
+.tools-hub-search {
+ width: 100%;
+ padding: 14px 18px;
+ margin-bottom: 14px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-size: 0.95rem;
+}
+
+.tools-hub-search:focus {
+ outline: none;
+ border-color: rgba(78, 205, 196, 0.5);
+}
+
+.tools-hub-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ justify-content: center;
+}
+
+.tools-hub-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 16px;
+}
+
+.tools-hub-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.25s, border-color 0.25s;
+ display: flex;
+ flex-direction: column;
+}
+
+.tools-hub-card:hover {
+ transform: translateY(-4px);
+ border-color: rgba(78, 205, 196, 0.35);
+}
+
+.tools-hub-emoji { font-size: 1.8rem; margin-bottom: 8px; }
+.tools-hub-card h3 { font-size: 1.05rem; margin-bottom: 6px; }
+.tools-hub-card p {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.45;
+ flex: 1;
+ margin-bottom: 12px;
+}
+
+.tools-hub-go {
+ font-size: 0.85rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+.section-nav-tools {
+ text-decoration: none;
+ color: inherit;
+ border: 1px dashed rgba(78, 205, 196, 0.35) !important;
+}
+
+/* ===== ATM Guide ===== */
+.atm-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 16px;
+}
+
+.atm-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(16px);
+ transition: transform 0.3s;
+}
+
+.atm-card:hover { transform: translateY(-3px); }
+.atm-emoji { font-size: 1.8rem; display: block; margin-bottom: 8px; }
+.atm-card h4 { font-size: 1.05rem; margin-bottom: 8px; }
+.atm-card p { font-size: 0.85rem; color: var(--text-secondary); line-height: 1.5; }
+
+/* ===== Changelog ===== */
+.changelog-list { margin: 28px 0; }
+
+.changelog-item {
+ padding: 20px 0;
+ border-bottom: 1px solid rgba(255,255,255,0.06);
+}
+
+.changelog-meta {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 12px;
+}
+
+.changelog-meta time {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+.changelog-tag {
+ font-size: 0.75rem;
+ padding: 3px 10px;
+ background: rgba(78, 205, 196, 0.12);
+ color: var(--accent-3);
+ border-radius: 12px;
+ font-weight: 600;
+}
+
+.changelog-item ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.changelog-item li {
+ position: relative;
+ padding: 6px 0 6px 16px;
+ color: var(--text-secondary);
+ line-height: 1.5;
+ font-size: 0.95rem;
+}
+
+.changelog-item li::before {
+ content: "\2022";
+ position: absolute;
+ left: 0;
+ color: var(--accent-3);
+}
+
+/* ===== Tools Strip ===== */
+.tools-strip {
+ padding: 12px 0 28px;
+ position: relative;
+ z-index: 1;
+}
+
+.tools-strip-inner {
+ padding: 18px 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+}
+
+.tools-strip-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 14px;
+ gap: 12px;
+}
+
+.tools-strip-head strong { font-size: 0.95rem; }
+.tools-strip-head a {
+ font-size: 0.85rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+.tools-strip-list {
+ display: grid;
+ grid-template-columns: repeat(8, 1fr);
+ gap: 8px;
+}
+
+.tools-strip-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 4px;
+ padding: 12px 6px;
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.06);
+ border-radius: var(--radius-md);
+ transition: all 0.2s;
+ text-align: center;
+}
+
+.tools-strip-item:hover {
+ border-color: rgba(78, 205, 196, 0.35);
+ background: rgba(78, 205, 196, 0.08);
+ transform: translateY(-2px);
+}
+
+.tools-strip-item span { font-size: 1.3rem; }
+.tools-strip-item small {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+
+@media (max-width: 900px) {
+ .tools-strip-list { grid-template-columns: repeat(4, 1fr); }
+}
+
+@media (max-width: 480px) {
+ .tools-strip-list { grid-template-columns: repeat(4, 1fr); }
+}
+
+
+/* ===== Runway Calculator ===== */
+.runway-card {
+ display: grid;
+ grid-template-columns: minmax(220px, 280px) 1fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+}
+.runway-pulse { animation: runwayPulse 0.45s ease; }
+@keyframes runwayPulse {
+ 0% { transform: scale(1); }
+ 50% { transform: scale(1.01); box-shadow: var(--shadow-glow); }
+ 100% { transform: scale(1); }
+}
+.runway-meter { text-align: center; }
+.runway-ring {
+ width: 168px;
+ height: 168px;
+ border-radius: 50%;
+ margin: 0 auto 16px;
+ display: grid;
+ place-items: center;
+}
+.runway-ring-inner {
+ width: 128px;
+ height: 128px;
+ border-radius: 50%;
+ background: var(--bg-secondary);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+.runway-ring-inner strong {
+ font-family: var(--font-display);
+ font-size: 2.4rem;
+ line-height: 1;
+}
+.runway-ring-inner small { color: var(--text-muted); margin-top: 4px; }
+.runway-level span {
+ font-weight: 700;
+ font-size: 1.05rem;
+}
+.runway-level p {
+ color: var(--text-secondary);
+ font-size: 0.88rem;
+ margin-top: 6px;
+ line-height: 1.45;
+}
+.runway-form {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.runway-form > label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.runway-form > label > span {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.runway-form input[type=number],
+.meeting-controls select {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+ font-size: 1rem;
+}
+.runway-dests small {
+ display: block;
+ color: var(--text-muted);
+ margin-bottom: 8px;
+}
+.runway-dest-list {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.runway-dest {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 2px;
+ padding: 10px;
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.08);
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ transition: all 0.2s;
+ text-align: left;
+ color: inherit;
+}
+.runway-dest:hover,
+.runway-dest.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.08);
+}
+.runway-dest em { font-style: normal; font-weight: 600; font-size: 0.88rem; }
+.runway-dest small { color: var(--text-muted); }
+.runway-summary {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 12px;
+ padding: 12px;
+ background: rgba(255,255,255,0.03);
+ border-radius: var(--radius-md);
+}
+.runway-summary small { color: var(--text-muted); display: block; }
+.runway-summary strong { font-size: 1.1rem; }
+.runway-milestones {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 8px;
+ margin-top: 4px;
+}
+.runway-ms {
+ text-align: center;
+ opacity: 0.35;
+ transition: opacity 0.25s;
+}
+.runway-ms.on { opacity: 1; }
+.runway-ms i {
+ display: block;
+ height: 4px;
+ border-radius: 4px;
+ background: var(--accent-3);
+ margin-bottom: 6px;
+}
+.runway-ms span { font-size: 0.75rem; color: var(--text-secondary); }
+
+/* ===== Meeting Window ===== */
+.meeting-card {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+.meeting-controls {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 14px 18px;
+}
+.meeting-controls label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.meeting-controls label > span {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.meeting-range {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 8px;
+ align-items: center;
+}
+.meeting-range em {
+ grid-column: 1 / -1;
+ font-style: normal;
+ font-size: 0.9rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+.meeting-range input[type=range] {
+ width: 100%;
+ accent-color: var(--accent-3);
+}
+.meeting-score {
+ padding: 16px 18px;
+ border-radius: var(--radius-md);
+ border: 1px solid;
+ background: rgba(255,255,255,0.03);
+ display: flex;
+ flex-wrap: wrap;
+ align-items: baseline;
+ gap: 10px 14px;
+}
+.meeting-score strong {
+ font-family: var(--font-display);
+ font-size: 1.8rem;
+}
+.meeting-score > span { font-weight: 700; }
+.meeting-score p {
+ flex: 1 1 100%;
+ color: var(--text-secondary);
+ font-size: 0.92rem;
+ margin: 0;
+}
+.meeting-legend {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 14px;
+ margin-bottom: 10px;
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+}
+.meeting-legend i {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ border-radius: 2px;
+ margin-right: 6px;
+ vertical-align: middle;
+}
+.meeting-legend .m-home { background: rgba(167, 139, 250, 0.7); }
+.meeting-legend .m-peer { background: rgba(255, 230, 109, 0.7); }
+.meeting-legend .m-both { background: #4ECDC4; }
+.meeting-bars {
+ display: grid;
+ grid-template-columns: repeat(24, 1fr);
+ gap: 3px;
+ min-height: 56px;
+}
+.meeting-cell {
+ border-radius: 4px;
+ background: rgba(255,255,255,0.05);
+ position: relative;
+ transition: transform 0.15s, background 0.15s;
+ min-height: 48px;
+}
+.meeting-cell.home { background: rgba(167, 139, 250, 0.28); }
+.meeting-cell.peer { background: rgba(255, 230, 109, 0.22); }
+.meeting-cell.home.peer { background: rgba(78, 205, 196, 0.25); }
+.meeting-cell.overlap {
+ background: linear-gradient(180deg, #4ECDC4, #3db8b0);
+ box-shadow: 0 0 12px rgba(78, 205, 196, 0.35);
+}
+.meeting-cell:hover { transform: translateY(-2px); }
+.meeting-cell span {
+ position: absolute;
+ bottom: 4px;
+ left: 0;
+ right: 0;
+ text-align: center;
+ font-size: 0.65rem;
+ color: var(--text-muted);
+}
+.meeting-axis {
+ display: flex;
+ justify-content: space-between;
+ margin-top: 8px;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+/* Tools hub featured */
+.tools-featured {
+ margin: 8px 0 28px;
+ padding: 18px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+}
+.tools-featured-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 14px;
+ gap: 12px;
+}
+.tools-featured-head span {
+ font-size: 0.85rem;
+ color: var(--accent-3);
+}
+.tools-featured-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 10px;
+}
+.tools-featured-card {
+ display: flex;
+ gap: 12px;
+ align-items: flex-start;
+ padding: 14px;
+ border-radius: var(--radius-md);
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.06);
+ transition: all 0.2s;
+}
+.tools-featured-card:hover {
+ border-color: rgba(78, 205, 196, 0.35);
+ background: rgba(78, 205, 196, 0.08);
+ transform: translateY(-2px);
+}
+.tools-featured-card > span { font-size: 1.5rem; line-height: 1; }
+.tools-featured-card h3 {
+ font-size: 0.95rem;
+ margin-bottom: 4px;
+}
+.tools-featured-card p {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ margin: 0;
+}
+
+@media (max-width: 900px) {
+ .runway-card { grid-template-columns: 1fr; }
+ .runway-dest-list { grid-template-columns: repeat(2, 1fr); }
+ .meeting-controls { grid-template-columns: 1fr; }
+ .tools-featured-grid { grid-template-columns: repeat(2, 1fr); }
+}
+@media (max-width: 560px) {
+ .tools-featured-grid { grid-template-columns: 1fr; }
+ .meeting-bars { gap: 2px; }
+ .meeting-cell { min-height: 36px; }
+}
+
+
+/* ===== Daylight Work Hours ===== */
+.daylight-card {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+.daylight-controls {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+.daylight-controls label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ max-width: 320px;
+}
+.daylight-controls label > span,
+.bag-extra > span {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.daylight-controls select {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+}
+.daylight-months {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+}
+.daylight-month {
+ padding: 6px 10px;
+ border-radius: 999px;
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ color: var(--text-secondary);
+ cursor: pointer;
+ font-size: 0.8rem;
+ transition: all 0.2s;
+}
+.daylight-month:hover,
+.daylight-month.active {
+ color: var(--text-primary);
+ border-color: rgba(255, 230, 109, 0.45);
+ background: rgba(255, 230, 109, 0.12);
+}
+.daylight-sky {
+ position: relative;
+ height: 72px;
+ border-radius: var(--radius-md);
+ background: linear-gradient(90deg, #0b1224, #1a2744 40%, #2a1f3d 70%, #0b1224);
+ overflow: hidden;
+ border: 1px solid rgba(255,255,255,0.06);
+}
+.daylight-band {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ background: linear-gradient(180deg, rgba(255,230,109,0.45), rgba(255,107,107,0.15));
+}
+.daylight-deep {
+ position: absolute;
+ top: 18px;
+ bottom: 18px;
+ background: rgba(78, 205, 196, 0.55);
+ border-radius: 6px;
+ box-shadow: 0 0 16px rgba(78, 205, 196, 0.35);
+}
+.daylight-markers {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+}
+.daylight-markers span {
+ position: absolute;
+ bottom: 6px;
+ transform: translateX(-50%);
+ font-size: 0.65rem;
+ color: rgba(241,245,249,0.7);
+}
+.daylight-stats {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 10px;
+ margin-top: 12px;
+}
+.daylight-stats small {
+ display: block;
+ color: var(--text-muted);
+ font-size: 0.75rem;
+}
+.daylight-stats strong {
+ font-family: var(--font-display);
+ font-size: 1.25rem;
+}
+.daylight-tips {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 12px;
+}
+.daylight-tip {
+ display: flex;
+ gap: 12px;
+ padding: 14px;
+ border-radius: var(--radius-md);
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.06);
+}
+.daylight-tip > span { font-size: 1.4rem; }
+.daylight-tip strong { display: block; margin-bottom: 4px; font-size: 0.95rem; }
+.daylight-tip p { margin: 0; color: var(--text-secondary); font-size: 0.85rem; line-height: 1.45; }
+
+/* ===== Bag Weight ===== */
+.bag-card {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 18px;
+}
+.bag-gauge {
+ height: 10px;
+ border-radius: 999px;
+ background: rgba(255,255,255,0.08);
+ overflow: hidden;
+}
+.bag-gauge-fill {
+ height: 100%;
+ border-radius: 999px;
+ transition: width 0.35s ease, background 0.25s;
+}
+.bag-meter-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+ gap: 12px;
+ margin-top: 10px;
+}
+.bag-meter-row strong {
+ font-family: var(--font-display);
+ font-size: 1.8rem;
+}
+.bag-meter-row small { color: var(--text-muted); }
+.bag-status { font-weight: 700; }
+.bag-tip { color: var(--text-secondary); font-size: 0.9rem; margin: 6px 0 0; }
+.bag-limits {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 8px;
+}
+.bag-limit {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 4px;
+ padding: 10px 6px;
+ border-radius: var(--radius-md);
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ cursor: pointer;
+ color: inherit;
+ transition: all 0.2s;
+}
+.bag-limit:hover,
+.bag-limit.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.1);
+}
+.bag-limit em { font-style: normal; font-size: 0.8rem; font-weight: 600; }
+.bag-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.bag-item {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 12px;
+ border-radius: var(--radius-md);
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ cursor: pointer;
+ color: inherit;
+ text-align: left;
+ transition: all 0.2s;
+}
+.bag-item:hover { transform: translateY(-1px); }
+.bag-item.on {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.1);
+}
+.bag-item > span { font-size: 1.25rem; }
+.bag-item strong { display: block; font-size: 0.88rem; }
+.bag-item small { color: var(--text-muted); }
+.bag-item i {
+ margin-left: auto;
+ font-style: normal;
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ display: grid;
+ place-items: center;
+ background: rgba(255,255,255,0.08);
+ font-size: 0.75rem;
+}
+.bag-item.on i { background: var(--accent-3); color: #0a0e17; font-weight: 700; }
+.bag-extra {
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ gap: 12px;
+ align-items: center;
+}
+.bag-extra input[type=range] { width: 100%; accent-color: var(--accent-3); }
+.bag-extra em { font-style: normal; font-weight: 600; color: var(--accent-3); min-width: 3.5rem; text-align: right; }
+
+@media (max-width: 900px) {
+ .daylight-tips { grid-template-columns: 1fr; }
+ .daylight-stats { grid-template-columns: repeat(2, 1fr); }
+ .bag-grid { grid-template-columns: repeat(2, 1fr); }
+ .bag-limits { grid-template-columns: repeat(2, 1fr); }
+}
+@media (max-width: 560px) {
+ .bag-grid { grid-template-columns: 1fr; }
+ .bag-extra { grid-template-columns: 1fr; }
+}
+
+
+/* ===== Visa Stay Countdown ===== */
+.visa-stay-card {
+ display: grid;
+ grid-template-columns: minmax(220px, 280px) 1fr;
+ gap: 28px;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+}
+.visa-stay-meter { text-align: center; }
+.visa-stay-ring {
+ width: 168px;
+ height: 168px;
+ border-radius: 50%;
+ margin: 0 auto 16px;
+ display: grid;
+ place-items: center;
+}
+.visa-stay-ring-inner {
+ width: 128px;
+ height: 128px;
+ border-radius: 50%;
+ background: var(--bg-secondary);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+.visa-stay-ring-inner strong {
+ font-family: var(--font-display);
+ font-size: 2.6rem;
+ line-height: 1;
+}
+.visa-stay-ring-inner small { color: var(--text-muted); margin-top: 4px; }
+.visa-stay-level span { font-weight: 700; font-size: 1.05rem; }
+.visa-stay-level p {
+ color: var(--text-secondary);
+ font-size: 0.88rem;
+ margin-top: 6px;
+ line-height: 1.45;
+}
+.visa-stay-form {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.visa-stay-form > label,
+.workspot-controls > label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.visa-stay-form > label > span,
+.workspot-controls > label > span {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.visa-stay-form input,
+.visa-stay-form select,
+.workspot-controls select {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+ font-size: 1rem;
+}
+.visa-stay-hint {
+ margin: 0;
+ font-size: 0.85rem;
+ color: var(--accent-3);
+}
+.visa-stay-stats {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 10px;
+ padding: 12px;
+ background: rgba(255,255,255,0.03);
+ border-radius: var(--radius-md);
+}
+.visa-stay-stats small { display: block; color: var(--text-muted); }
+.visa-stay-stats strong { font-size: 1.05rem; }
+
+/* ===== Work Spot Cost ===== */
+.workspot-card {
+ display: grid;
+ grid-template-columns: 1fr 1.1fr;
+ gap: 22px;
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+}
+.workspot-controls {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.workspot-controls input[type=range],
+.visa-stay-form input[type=range] {
+ width: 100%;
+ accent-color: var(--accent-3);
+}
+.workspot-modes {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.workspot-mode {
+ padding: 10px 8px;
+ border-radius: var(--radius-md);
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ color: inherit;
+ cursor: pointer;
+ font-weight: 600;
+ font-size: 0.85rem;
+ transition: all 0.2s;
+}
+.workspot-mode:hover,
+.workspot-mode.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.1);
+}
+.workspot-result {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.workspot-hero {
+ padding: 18px;
+ border-radius: var(--radius-md);
+ background: linear-gradient(135deg, rgba(78,205,196,0.12), rgba(255,107,107,0.08));
+ border: 1px solid rgba(255,255,255,0.08);
+}
+.workspot-hero small { color: var(--text-muted); display: block; }
+.workspot-hero strong {
+ font-family: var(--font-display);
+ font-size: 2.2rem;
+ display: block;
+ margin: 4px 0 6px;
+}
+.workspot-hero > span { font-weight: 600; font-size: 0.92rem; }
+.workspot-compare {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.workspot-compare > div {
+ padding: 12px;
+ border-radius: var(--radius-md);
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.06);
+ transition: all 0.2s;
+}
+.workspot-compare > div.on {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.1);
+}
+.workspot-compare small { display: block; color: var(--text-muted); font-size: 0.75rem; }
+.workspot-compare strong { display: block; margin: 4px 0; font-size: 1.05rem; }
+.workspot-compare em {
+ font-style: normal;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ line-height: 1.35;
+}
+.workspot-tip {
+ margin: 0;
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ line-height: 1.45;
+}
+
+@media (max-width: 900px) {
+ .visa-stay-card,
+ .workspot-card { grid-template-columns: 1fr; }
+ .workspot-compare { grid-template-columns: 1fr; }
+ .visa-stay-stats { grid-template-columns: 1fr; }
+}
+
+
+/* ===== First Month Cost ===== */
+.firstmonth-card {
+ display: grid;
+ grid-template-columns: 0.9fr 1.2fr;
+ gap: 22px;
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+}
+.firstmonth-controls {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.firstmonth-controls > label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.firstmonth-controls > label > span {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.firstmonth-controls select {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+}
+.firstmonth-housing {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.firstmonth-chip {
+ padding: 10px 8px;
+ border-radius: var(--radius-md);
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ color: inherit;
+ cursor: pointer;
+ font-weight: 600;
+ font-size: 0.85rem;
+ transition: all 0.2s;
+}
+.firstmonth-chip:hover,
+.firstmonth-chip.active {
+ border-color: rgba(78, 205, 196, 0.4);
+ background: rgba(78, 205, 196, 0.1);
+}
+.firstmonth-check {
+ flex-direction: row !important;
+ align-items: center;
+ gap: 10px !important;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+}
+.firstmonth-total {
+ padding: 18px;
+ border-radius: var(--radius-md);
+ background: linear-gradient(135deg, rgba(255,107,107,0.12), rgba(78,205,196,0.1));
+ border: 1px solid rgba(255,255,255,0.08);
+ margin-bottom: 14px;
+}
+.firstmonth-total small { color: var(--text-muted); display: block; }
+.firstmonth-total strong {
+ font-family: var(--font-display);
+ font-size: 2.2rem;
+ display: block;
+ margin: 4px 0 6px;
+}
+.firstmonth-total span { font-size: 0.85rem; color: var(--text-secondary); }
+.firstmonth-bars { display: flex; flex-direction: column; gap: 10px; }
+.firstmonth-bar-row {
+ display: grid;
+ grid-template-columns: 110px 1fr 72px;
+ gap: 10px;
+ align-items: center;
+ font-size: 0.88rem;
+}
+.firstmonth-bar-track {
+ height: 8px;
+ border-radius: 999px;
+ background: rgba(255,255,255,0.08);
+ overflow: hidden;
+}
+.firstmonth-bar-track i {
+ display: block;
+ height: 100%;
+ border-radius: 999px;
+ background: linear-gradient(90deg, #FF6B6B, #4ECDC4);
+}
+.firstmonth-bar-row em {
+ font-style: normal;
+ text-align: right;
+ font-weight: 600;
+ color: var(--text-secondary);
+}
+
+/* ===== Data Budget ===== */
+.data-budget-card {
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 18px;
+}
+.data-budget-gauge {
+ height: 10px;
+ border-radius: 999px;
+ background: rgba(255,255,255,0.08);
+ overflow: hidden;
+}
+.data-budget-fill {
+ height: 100%;
+ border-radius: 999px;
+ background: linear-gradient(90deg, #4ECDC4, #A78BFA);
+ transition: width 0.3s ease;
+}
+.data-budget-hero {
+ display: flex;
+ align-items: baseline;
+ gap: 8px;
+ margin-top: 10px;
+}
+.data-budget-hero strong {
+ font-family: var(--font-display);
+ font-size: 2.2rem;
+}
+.data-budget-hero span { color: var(--text-muted); }
+.data-budget-plan {
+ margin: 6px 0 0;
+ color: var(--text-secondary);
+ font-size: 0.92rem;
+}
+.data-budget-plan b { color: var(--accent-3); }
+.data-budget-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 8px;
+}
+.data-budget-item {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 12px;
+ border-radius: var(--radius-md);
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ cursor: pointer;
+ color: inherit;
+ text-align: left;
+ transition: all 0.2s;
+}
+.data-budget-item:hover { transform: translateY(-1px); }
+.data-budget-item.on {
+ border-color: rgba(167, 139, 250, 0.45);
+ background: rgba(167, 139, 250, 0.12);
+}
+.data-budget-item > span { font-size: 1.25rem; }
+.data-budget-item strong { display: block; font-size: 0.88rem; }
+.data-budget-item small { color: var(--text-muted); }
+.data-budget-item i {
+ margin-left: auto;
+ font-style: normal;
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ display: grid;
+ place-items: center;
+ background: rgba(255,255,255,0.08);
+ font-size: 0.75rem;
+}
+.data-budget-item.on i { background: #A78BFA; color: #0a0e17; font-weight: 700; }
+.data-budget-sliders {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 14px;
+}
+.data-budget-sliders label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+.data-budget-sliders input[type=range] {
+ width: 100%;
+ accent-color: #A78BFA;
+}
+
+@media (max-width: 900px) {
+ .firstmonth-card { grid-template-columns: 1fr; }
+ .data-budget-grid { grid-template-columns: repeat(2, 1fr); }
+ .data-budget-sliders { grid-template-columns: 1fr; }
+ .firstmonth-bar-row { grid-template-columns: 1fr; gap: 4px; }
+ .firstmonth-bar-row em { text-align: left; }
+}
+@media (max-width: 560px) {
+ .data-budget-grid { grid-template-columns: 1fr; }
+}
+
+
+/* ===== Shared kit cards (batch tools) ===== */
+.kit-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.kit-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; align-items: end; }
+.kit-field { display: flex; flex-direction: column; gap: 6px; }
+.kit-field > span { font-size: 0.85rem; color: var(--text-secondary); }
+.kit-field input, .kit-field select {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+}
+.kit-field input[type=range] { accent-color: var(--accent-3); padding: 0; border: 0; background: transparent; }
+.kit-stat { text-align: right; }
+.kit-stat strong { font-family: var(--font-display); font-size: 1.8rem; display: block; }
+.kit-stat small { color: var(--text-muted); }
+.kit-bar { height: 8px; border-radius: 999px; background: rgba(255,255,255,0.08); overflow: hidden; }
+.kit-bar i { display: block; height: 100%; background: linear-gradient(90deg,#4ECDC4,#A78BFA); border-radius: 999px; }
+.kit-actions { display: flex; flex-wrap: wrap; gap: 8px; }
+.kit-grid-3 { display: grid; grid-template-columns: repeat(3,1fr); gap: 8px; }
+.kit-grid-3 > div, .kit-list-item {
+ padding: 12px;
+ border-radius: var(--radius-md);
+ background: rgba(255,255,255,0.03);
+ border: 1px solid rgba(255,255,255,0.06);
+}
+.kit-grid-3 small { display: block; color: var(--text-muted); font-size: 0.75rem; }
+.kit-grid-3 strong { font-size: 1rem; }
+.kit-note { margin: 0; color: var(--text-secondary); font-size: 0.9rem; line-height: 1.45; }
+.kit-note b { color: var(--accent-3); }
+.kit-chips { display: flex; flex-wrap: wrap; gap: 8px; }
+.kit-chips.wrap { gap: 8px; }
+.kit-chip {
+ padding: 8px 12px;
+ border-radius: 999px;
+ border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03);
+ color: inherit;
+ cursor: pointer;
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+.kit-chip:hover, .kit-chip.active {
+ border-color: rgba(78,205,196,0.4);
+ background: rgba(78,205,196,0.1);
+}
+.kit-hero { display: flex; gap: 14px; align-items: flex-start; padding: 14px; border-radius: var(--radius-md); background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06); }
+.kit-hero > span { font-size: 2rem; line-height: 1; }
+.kit-hero small { color: var(--text-muted); display: block; }
+.kit-hero strong { display: block; font-size: 1.25rem; margin: 4px 0; }
+.kit-hero p { margin: 0; color: var(--text-secondary); font-size: 0.88rem; }
+.kit-list { display: flex; flex-direction: column; gap: 8px; }
+.kit-list-item { display: flex; gap: 12px; align-items: flex-start; text-align: left; }
+.kit-list-item > span { font-size: 1.25rem; }
+.kit-list-item strong { display: block; font-size: 0.92rem; }
+.kit-list-item small { color: var(--text-secondary); font-size: 0.8rem; }
+.kit-list-item.btnish { width: 100%; cursor: pointer; color: inherit; transition: all 0.2s; }
+.kit-list-item.btnish.on { border-color: rgba(78,205,196,0.4); background: rgba(78,205,196,0.1); }
+.kit-list-item i { margin-left: auto; font-style: normal; opacity: 0.7; }
+
+/* Weekend */
+.weekend-card, .deposit-card {
+ padding: 22px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(16px);
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+.weekend-controls { display: flex; flex-direction: column; gap: 12px; }
+.weekend-controls label, .deposit-fields label { display: flex; flex-direction: column; gap: 6px; }
+.weekend-controls span, .deposit-fields span { font-size: 0.85rem; color: var(--text-secondary); }
+.weekend-controls select, .deposit-fields input {
+ background: rgba(255,255,255,0.04);
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: var(--radius-sm);
+ color: var(--text-primary);
+ padding: 10px 12px;
+}
+.weekend-energy { display: flex; flex-wrap: wrap; gap: 8px; }
+.weekend-chip {
+ padding: 8px 12px; border-radius: 999px; border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03); color: inherit; cursor: pointer; font-weight: 600; font-size: 0.85rem;
+}
+.weekend-chip.active, .weekend-chip:hover { border-color: rgba(255,230,109,0.45); background: rgba(255,230,109,0.12); }
+.weekend-hero { display: flex; gap: 16px; padding: 18px; border-radius: var(--radius-md); background: linear-gradient(135deg, rgba(255,107,107,0.12), rgba(78,205,196,0.1)); }
+.weekend-emoji { font-size: 2.6rem; }
+.weekend-hero small { color: var(--text-muted); }
+.weekend-hero h3 { margin: 4px 0 8px; font-size: 1.35rem; }
+.weekend-hero p { margin: 0 0 6px; color: var(--text-secondary); }
+.weekend-hero em { font-style: normal; color: var(--accent-3); font-weight: 600; }
+.weekend-list { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
+.weekend-mini {
+ padding: 8px 10px; border-radius: var(--radius-md); border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03); color: inherit; cursor: pointer; font-size: 0.8rem;
+}
+.weekend-mini.on { border-color: rgba(78,205,196,0.4); background: rgba(78,205,196,0.1); }
+
+/* Deposit */
+.deposit-top { display: grid; grid-template-columns: 1.2fr 1fr; gap: 14px; }
+.deposit-gauge { height: 8px; border-radius: 999px; background: rgba(255,255,255,0.08); overflow: hidden; margin-bottom: 8px; }
+.deposit-gauge i { display: block; height: 100%; border-radius: 999px; }
+.deposit-meta strong { font-size: 1.6rem; margin-right: 8px; }
+.deposit-meta span { color: var(--text-secondary); font-size: 0.9rem; }
+.deposit-fields { display: grid; gap: 10px; }
+.deposit-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
+.deposit-item {
+ display: flex; gap: 10px; align-items: flex-start; text-align: left; padding: 12px;
+ border-radius: var(--radius-md); border: 1px solid rgba(255,255,255,0.08);
+ background: rgba(255,255,255,0.03); color: inherit; cursor: pointer;
+}
+.deposit-item.on { border-color: rgba(78,205,196,0.4); background: rgba(78,205,196,0.1); }
+.deposit-item strong { display: block; font-size: 0.88rem; }
+.deposit-item small { color: var(--text-secondary); font-size: 0.75rem; }
+.deposit-item i { margin-left: auto; font-style: normal; }
+.deposit-actions { display: flex; gap: 8px; flex-wrap: wrap; }
+
+@media (max-width: 900px) {
+ .kit-row, .deposit-top, .deposit-grid, .kit-grid-3 { grid-template-columns: 1fr; }
+ .kit-stat { text-align: left; }
+}
+
+/* ===== Move Plan Hub (/plan) ===== */
+.plan-page {
+ padding: 100px 0 80px;
+ min-height: 70vh;
+}
+.plan-loading {
+ color: var(--text-secondary);
+ padding: 48px 0;
+}
+.plan-hero {
+ margin-bottom: 28px;
+}
+.plan-hero p {
+ max-width: 640px;
+ color: var(--text-secondary);
+ margin: 8px 0 20px;
+ line-height: 1.6;
+}
+.plan-title-input {
+ display: block;
+ width: 100%;
+ max-width: 720px;
+ background: transparent;
+ border: none;
+ border-bottom: 1px solid transparent;
+ color: var(--text-primary);
+ font-size: clamp(1.8rem, 4vw, 2.6rem);
+ font-weight: 700;
+ letter-spacing: -0.02em;
+ padding: 4px 0;
+ margin: 8px 0 0;
+}
+.plan-title-input:focus {
+ outline: none;
+ border-bottom-color: var(--accent-2);
+}
+.plan-meta-row {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+}
+.plan-meta-field {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+}
+.plan-meta-field input {
+ min-width: 180px;
+ padding: 10px 12px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-card);
+ color: var(--text-primary);
+}
+.plan-stats {
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
+ gap: 12px;
+ margin-bottom: 20px;
+}
+.plan-stat {
+ padding: 16px 18px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.plan-stat span {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+.plan-stat strong {
+ font-size: 1.25rem;
+}
+.plan-warn-text { color: var(--accent-1) !important; }
+.plan-alert {
+ margin-bottom: 20px;
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: 1px solid color-mix(in srgb, var(--accent-1) 40%, transparent);
+ background: color-mix(in srgb, var(--accent-1) 12%, transparent);
+ color: var(--text-primary);
+ font-size: 0.9rem;
+ line-height: 1.5;
+}
+.plan-layout {
+ display: grid;
+ grid-template-columns: minmax(0, 1.6fr) minmax(280px, 0.9fr);
+ gap: 24px;
+ align-items: start;
+}
+.plan-panel {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 22px 24px;
+ margin-bottom: 20px;
+ backdrop-filter: blur(16px);
+}
+.plan-panel h2 {
+ font-size: 1.1rem;
+ margin: 0;
+}
+.plan-panel-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ flex-wrap: wrap;
+ margin-bottom: 16px;
+}
+.plan-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+}
+.plan-empty {
+ text-align: center;
+ padding: 40px 16px;
+ color: var(--text-secondary);
+}
+.plan-empty-icon { font-size: 2.8rem; display: block; margin-bottom: 8px; }
+.plan-empty .btn { margin-top: 12px; }
+.plan-timeline {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+.plan-stop {
+ display: grid;
+ grid-template-columns: 44px 1fr;
+ gap: 12px;
+}
+.plan-stop-rail {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+.plan-stop-dot {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ display: grid;
+ place-items: center;
+ background: var(--bg-secondary, rgba(255,255,255,0.06));
+ border: var(--border-glass);
+ font-size: 1.2rem;
+ flex-shrink: 0;
+}
+.plan-stop-line {
+ width: 2px;
+ flex: 1;
+ min-height: 24px;
+ background: linear-gradient(to bottom, var(--accent-2), transparent);
+ opacity: 0.5;
+ margin: 4px 0;
+}
+.plan-stop-body {
+ padding-bottom: 22px;
+}
+.plan-stop-top {
+ display: flex;
+ justify-content: space-between;
+ gap: 12px;
+ align-items: flex-start;
+}
+.plan-stop-top strong a {
+ color: var(--text-primary);
+ text-decoration: none;
+}
+.plan-stop-top strong a:hover { color: var(--accent-2); }
+.plan-stop-country { font-weight: 500; color: var(--text-secondary); }
+.plan-stop-range {
+ display: block;
+ margin-top: 4px;
+ font-size: 0.8rem;
+ color: var(--accent-2);
+}
+.plan-stop-tools {
+ display: flex;
+ gap: 4px;
+}
+.plan-stop-tools button {
+ width: 28px;
+ height: 28px;
+ border-radius: 8px;
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--text-secondary);
+ cursor: pointer;
+}
+.plan-stop-tools button:disabled { opacity: 0.35; cursor: not-allowed; }
+.plan-stop-tools button:not(:disabled):hover {
+ color: var(--text-primary);
+ border-color: var(--accent-2);
+}
+.plan-remove:hover { color: var(--accent-1) !important; }
+.plan-stop-controls {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 10px;
+ margin: 10px 0;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+}
+.plan-stop-controls input {
+ width: 56px;
+ margin: 0 6px;
+ padding: 6px 8px;
+ border-radius: 8px;
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--text-primary);
+}
+.plan-stop-cost {
+ font-weight: 700;
+ color: var(--text-primary);
+}
+.plan-stop-unit { font-size: 0.8rem; }
+.plan-note {
+ width: 100%;
+ resize: vertical;
+ min-height: 56px;
+ padding: 10px 12px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--text-primary);
+ font: inherit;
+ line-height: 1.45;
+}
+.plan-visa {
+ margin: 8px 0 0;
+ font-size: 0.82rem;
+ color: var(--text-secondary);
+ line-height: 1.45;
+}
+.plan-visa.warn {
+ color: var(--accent-1);
+}
+.plan-compare-wrap { overflow-x: auto; }
+.plan-compare {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.88rem;
+}
+.plan-compare th,
+.plan-compare td {
+ text-align: left;
+ padding: 10px 8px;
+ border-bottom: 1px solid color-mix(in srgb, var(--text-secondary) 20%, transparent);
+}
+.plan-compare th { color: var(--text-secondary); font-weight: 500; }
+.plan-ready-pill {
+ font-size: 0.8rem;
+ color: var(--accent-2);
+}
+.plan-ready-bar {
+ height: 6px;
+ border-radius: 99px;
+ background: color-mix(in srgb, var(--text-secondary) 20%, transparent);
+ margin-bottom: 16px;
+ overflow: hidden;
+}
+.plan-ready-bar > div {
+ height: 100%;
+ border-radius: inherit;
+ background: linear-gradient(90deg, var(--accent-1), var(--accent-2));
+ transition: width 0.25s ease;
+}
+.plan-check-group { margin-bottom: 14px; }
+.plan-check-group h3 {
+ font-size: 0.78rem;
+ text-transform: uppercase;
+ letter-spacing: 0.04em;
+ color: var(--text-secondary);
+ margin: 0 0 8px;
+}
+.plan-check-group ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+.plan-check-group label {
+ display: flex;
+ gap: 10px;
+ align-items: flex-start;
+ cursor: pointer;
+ font-size: 0.9rem;
+}
+.plan-check-group input { margin-top: 3px; accent-color: var(--accent-2); }
+.plan-check-group strong { display: block; font-weight: 600; }
+.plan-check-group small {
+ display: block;
+ color: var(--text-secondary);
+ font-size: 0.75rem;
+ margin-top: 2px;
+}
+.plan-side .btn { width: 100%; margin-top: 8px; }
+
+@media (max-width: 960px) {
+ .plan-stats { grid-template-columns: repeat(2, 1fr); }
+ .plan-layout { grid-template-columns: 1fr; }
+}
+@media (max-width: 520px) {
+ .plan-stats { grid-template-columns: 1fr 1fr; }
+ .plan-page { padding-top: 88px; }
+}
+
+/* ===== Compare page + modal actions ===== */
+.compare-modal-actions,
+.compare-page-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ justify-content: flex-end;
+ margin-top: 24px;
+ padding-top: 16px;
+ border-top: 1px solid color-mix(in srgb, var(--text-secondary) 18%, transparent);
+}
+.compare-page {
+ padding: 100px 0 80px;
+ min-height: 70vh;
+}
+.compare-page-hero {
+ margin-bottom: 24px;
+}
+.compare-page-hero h1 {
+ font-size: clamp(1.8rem, 4vw, 2.4rem);
+ margin: 8px 0;
+}
+.compare-page-hero p {
+ max-width: 560px;
+ color: var(--text-secondary);
+ line-height: 1.6;
+}
+.compare-pick-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
+ gap: 10px;
+}
+.compare-pick-chip {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 2px;
+ padding: 12px;
+ border-radius: var(--radius-lg);
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--text-primary);
+ cursor: pointer;
+ text-align: left;
+ transition: border-color 0.2s, background 0.2s;
+}
+.compare-pick-chip span { font-size: 1.4rem; }
+.compare-pick-chip strong { font-size: 0.92rem; }
+.compare-pick-chip small {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+.compare-pick-chip:hover { border-color: var(--accent-2); }
+.compare-pick-chip.on {
+ border-color: var(--accent-2);
+ background: color-mix(in srgb, var(--accent-2) 12%, transparent);
+}
+.compare-page-empty { margin-top: 12px; }
+@media (max-width: 700px) {
+ .compare-modal-actions,
+ .compare-page-actions { justify-content: stretch; }
+ .compare-modal-actions .btn,
+ .compare-page-actions .btn { flex: 1; }
+}
+
+/* ===== Plan cloud sync + profile hub ===== */
+.plan-sync-row {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 10px;
+ margin: 0 0 16px;
+}
+.plan-sync-pill {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 6px 12px;
+ border-radius: 999px;
+ font-size: 0.8rem;
+ border: var(--border-glass);
+ color: var(--text-secondary);
+ text-decoration: none;
+}
+.plan-sync-pill.synced { color: var(--accent-2); border-color: color-mix(in srgb, var(--accent-2) 40%, transparent); }
+.plan-sync-pill.syncing { color: var(--accent-3, #FFE66D); }
+.plan-sync-pill.offline { color: var(--accent-1); }
+.profile-section-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ flex-wrap: wrap;
+ margin-bottom: 12px;
+}
+.profile-section-head h2 { margin: 0; }
+.profile-plan-meta {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px 16px;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 12px;
+ padding-bottom: 12px;
+ border-bottom: 1px solid color-mix(in srgb, var(--text-secondary) 18%, transparent);
+}
+.profile-trip-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-top: 12px;
+}
+.dest-months-pick {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ padding: 8px 10px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+}
+.dest-months-pick input {
+ width: 48px;
+ padding: 4px 6px;
+ border-radius: 6px;
+ border: var(--border-glass);
+ background: transparent;
+ color: var(--text-primary);
+}
+.dest-plan-hints {
+ margin: 12px 0 4px;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+
+/* ===== Plan visas + ICS ===== */
+.plan-alert-visa {
+ border-color: color-mix(in srgb, #FFE66D 45%, transparent);
+ background: color-mix(in srgb, #FFE66D 10%, transparent);
+}
+.plan-stop-visas {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin-top: 8px;
+}
+.plan-visa-chip {
+ font-size: 0.75rem;
+ padding: 4px 8px;
+ border-radius: 999px;
+ border: var(--border-glass);
+ color: var(--text-secondary);
+ background: color-mix(in srgb, var(--accent-2) 8%, transparent);
+}
+.plan-visa-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 12px;
+}
+.plan-visa-card {
+ padding: 14px;
+ border-radius: var(--radius-lg);
+ border: var(--border-glass);
+ background: color-mix(in srgb, var(--bg-card) 80%, transparent);
+}
+.plan-visa-card header {
+ display: flex;
+ gap: 10px;
+ align-items: flex-start;
+ margin-bottom: 10px;
+}
+.plan-visa-card header span { font-size: 1.5rem; }
+.plan-visa-card strong { display: block; font-size: 0.95rem; }
+.plan-visa-card small {
+ color: var(--text-secondary);
+ font-size: 0.75rem;
+}
+.plan-visa-card ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ font-size: 0.82rem;
+ color: var(--text-secondary);
+}
+.plan-visa-card p {
+ margin: 8px 0 0;
+ font-size: 0.8rem;
+ color: var(--accent-2);
+}
+.plan-visa-missing {
+ margin: 12px 0 0;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.5;
+}
+
+/* ===== Product discovery polish ===== */
+.trip-hero-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ justify-content: center;
+ margin-top: 14px;
+}
+.auth-sync-note {
+ margin: 0 0 16px;
+ padding: 10px 14px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: color-mix(in srgb, var(--accent-2) 10%, transparent);
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ line-height: 1.5;
+}
+.auth-sync-note a {
+ color: var(--accent-2);
+ margin-left: 4px;
+}
+.auth-redirect-card {
+ margin: 0 0 18px;
+ padding: 12px 14px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: color-mix(in srgb, var(--accent-2) 8%, transparent);
+}
+.auth-redirect-merge {
+ margin: 0 0 8px;
+ font-size: 0.82rem;
+ color: var(--text-secondary);
+ line-height: 1.45;
+}
+.auth-redirect-dest {
+ margin: 0;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 8px;
+ font-size: 0.88rem;
+ color: var(--text-secondary);
+}
+.auth-redirect-badge {
+ display: inline-flex;
+ align-items: center;
+ padding: 4px 10px;
+ border-radius: 999px;
+ background: color-mix(in srgb, var(--accent-2) 18%, transparent);
+ color: var(--accent-2);
+ font-weight: 600;
+ font-size: 0.85rem;
+}
+.auth-demo-btn {
+ width: 100%;
+}
+.auth-google {
+ display: flex;
+ justify-content: center;
+ margin-bottom: 12px;
+ min-height: 44px;
+}
+.auth-google.is-disabled {
+ pointer-events: none;
+ opacity: 0.55;
+}
+.join-pay-note {
+ margin-top: 10px;
+ font-size: 0.85rem;
+}
+.tools-core-banner {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 12px;
+ margin: 0 0 28px;
+}
+.tools-core-banner-secondary {
+ margin-top: -12px;
+}
+.tools-core-card {
+ display: flex;
+ gap: 12px;
+ align-items: center;
+ padding: 16px 18px;
+ border-radius: var(--radius-xl);
+ border: var(--border-glass);
+ background: var(--bg-card);
+ text-decoration: none;
+ color: inherit;
+ transition: border-color 0.2s, transform 0.2s;
+}
+.tools-core-card:hover {
+ border-color: var(--accent-2);
+ transform: translateY(-2px);
+}
+.tools-core-card span { font-size: 1.6rem; }
+.tools-core-card strong { display: block; font-size: 0.95rem; }
+.tools-core-card p {
+ margin: 2px 0 0;
+ font-size: 0.78rem;
+ color: var(--text-secondary);
+}
+@media (max-width: 800px) {
+ .tools-core-banner { grid-template-columns: 1fr; }
+}
+
+/* ===== Lang toggle + H5 polish (PWA / i18n) ===== */
+.nav-lang-btn {
+ min-width: 44px;
+ min-height: 36px;
+ padding: 6px 12px;
+ border-radius: 10px;
+ border: var(--border-glass);
+ background: color-mix(in srgb, var(--bg-card) 80%, transparent);
+ color: var(--text-primary);
+ font-size: 0.8rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: border-color 0.2s, background 0.2s;
+}
+.nav-lang-btn:hover {
+ border-color: var(--accent-2);
+}
+.nav-mobile-extras {
+ display: none;
+ flex-direction: column;
+ gap: 12px;
+ margin-top: 12px;
+ padding-top: 12px;
+ border-top: var(--border-glass);
+}
+
+@media (max-width: 768px) {
+ .nav-login-desktop,
+ .nav-user-desktop { display: none; }
+ .nav-mobile-extras { display: flex; }
+ .nav-mobile-extras .nav-login-btn {
+ text-align: center;
+ display: block;
+ }
+ .nav-utils { gap: 6px; }
+ .nav-utils .nav-lang-btn {
+ min-width: 40px;
+ padding: 6px 8px;
+ }
+
+ .plan-page,
+ .compare-page,
+ .tools-hub-page {
+ padding-top: calc(var(--nav-height) + 16px);
+ padding-bottom: calc(48px + env(safe-area-inset-bottom, 0px));
+ }
+ .plan-panel-head { align-items: flex-start; }
+ .plan-actions { width: 100%; }
+ .plan-actions .btn { flex: 1 1 auto; min-height: 40px; }
+ .plan-meta-field input { min-width: 0; width: 100%; }
+ .plan-compare-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
+ .compare-pick-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 8px;
+ }
+ .compare-cards {
+ grid-template-columns: 1fr !important;
+ }
+ .hero-actions,
+ .trip-hero-actions {
+ flex-direction: column;
+ align-items: stretch;
+ }
+ .hero-actions .btn,
+ .trip-hero-actions .btn {
+ width: 100%;
+ justify-content: center;
+ }
+ .compare-bar,
+ .matcher-fab {
+ bottom: calc(16px + env(safe-area-inset-bottom, 0px)) !important;
+ }
+ .section-nav {
+ padding-bottom: env(safe-area-inset-bottom, 0px);
+ }
+ .auth-card {
+ margin: 16px;
+ width: auto;
+ }
+}
+
+@supports (padding: max(0px)) {
+ .navbar {
+ padding-left: max(16px, env(safe-area-inset-left));
+ padding-right: max(16px, env(safe-area-inset-right));
+ }
+}
+
+/* ===== Journey path (homepage funnel) ===== */
+.journey-strip {
+ padding: 48px 0 32px;
+}
+.journey-head {
+ margin-bottom: 28px;
+}
+.journey-rail {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 16px;
+ position: relative;
+}
+.journey-step {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+}
+.journey-connector {
+ display: none;
+}
+.journey-card {
+ height: 100%;
+ padding: 20px 18px;
+ border-radius: var(--radius-xl);
+ border: var(--border-glass);
+ background: var(--bg-card);
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ transition: border-color 0.2s, transform 0.2s;
+}
+.journey-card:hover {
+ border-color: var(--accent-2);
+ transform: translateY(-2px);
+}
+.journey-card-top {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 4px;
+}
+.journey-n {
+ font-size: 0.75rem;
+ font-weight: 700;
+ letter-spacing: 0.08em;
+ color: var(--accent-2);
+}
+.journey-emoji { font-size: 1.5rem; }
+.journey-card h3 {
+ margin: 0;
+ font-size: 1.05rem;
+}
+.journey-card p {
+ margin: 0;
+ flex: 1;
+ font-size: 0.85rem;
+ line-height: 1.5;
+ color: var(--text-secondary);
+}
+.journey-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-top: 10px;
+}
+@media (max-width: 960px) {
+ .journey-rail { grid-template-columns: repeat(2, minmax(0, 1fr)); }
+}
+@media (max-width: 560px) {
+ .journey-strip { padding: 32px 0 20px; }
+ .journey-rail { grid-template-columns: 1fr; }
+}
+
+/* ===== Homepage flow (shorter scroll) ===== */
+.home-flow .section-compact {
+ padding: 64px 0;
+}
+.home-flow .section-compact .section-header {
+ margin-bottom: 36px;
+}
+.home-flow .trip-section.section-compact {
+ padding-bottom: 48px;
+}
+
+.dest-compare-hint {
+ text-align: center;
+ margin: -24px 0 20px;
+ padding: 10px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: color-mix(in srgb, var(--accent-2) 10%, transparent);
+ font-size: 0.88rem;
+ color: var(--text-secondary);
+}
+
+.dest-card {
+ position: relative;
+}
+.dest-card-link {
+ display: block;
+ text-decoration: none;
+ color: inherit;
+}
+.compare-check {
+ position: absolute;
+ top: 12px;
+ right: 12px;
+ z-index: 2;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: 50%;
+ width: 36px;
+ height: 36px;
+ cursor: pointer;
+ font-size: 0.85rem;
+ display: grid;
+ place-items: center;
+ transition: background 0.2s, transform 0.2s;
+}
+.compare-check.on {
+ background: var(--accent-3);
+ color: #0a0e17;
+ font-weight: 700;
+}
+.dest-card-actions {
+ padding: 0 16px 16px;
+ display: flex;
+ gap: 8px;
+ align-items: center;
+ justify-content: space-between;
+}
+.dest-expand-wrap {
+ text-align: center;
+ margin-top: 24px;
+}
+.map-browse-link { margin-top: 12px; }
+.visa-plan-cta { margin-top: 8px; }
+.faq-plan-hint {
+ text-align: center;
+ margin-top: 28px;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+}
+.faq-plan-hint a {
+ color: var(--accent-2);
+ margin-left: 4px;
+}
+
+.compare-bar-meta {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ min-width: 72px;
+}
+.compare-bar-meta strong { font-size: 0.95rem; }
+.compare-bar-hint {
+ font-size: 0.72rem;
+ color: var(--text-secondary);
+ white-space: nowrap;
+}
+
+@media (max-width: 768px) {
+ .home-flow .section-compact { padding: 48px 0; }
+ .compare-bar {
+ left: 12px;
+ right: 12px;
+ bottom: calc(12px + env(safe-area-inset-bottom, 0px));
+ flex-wrap: wrap;
+ justify-content: space-between;
+ padding: 12px 14px;
+ gap: 8px;
+ }
+ .compare-bar .btn { flex: 1; min-width: 0; }
+}
+
+/* ===== Next Stop / Meetups / Community (NomadCNA ? nomadro) ===== */
+
+.next-stop-page,
+.meetups-page,
+.community-page,
+.community-detail-page,
+.tool-runner-page {
+ padding: 100px 0 80px;
+ min-height: 60vh;
+}
+
+.next-stop-layout {
+ display: grid;
+ grid-template-columns: 280px 1fr;
+ gap: 28px;
+ align-items: start;
+}
+
+.next-stop-filters {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ position: sticky;
+ top: 96px;
+}
+
+.next-stop-filter-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 18px;
+ backdrop-filter: blur(16px);
+}
+
+.next-stop-filter-card label {
+ display: block;
+ font-size: 0.85rem;
+ font-weight: 600;
+ margin-bottom: 10px;
+}
+
+.next-stop-filter-card input[type="range"] {
+ width: 100%;
+ accent-color: var(--accent-3);
+}
+
+.next-stop-value {
+ display: block;
+ margin-top: 8px;
+ font-size: 0.9rem;
+ color: var(--accent-2);
+}
+
+.next-stop-chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.next-stop-hero {
+ display: flex;
+ justify-content: space-between;
+ gap: 24px;
+ padding: 28px;
+ margin-bottom: 24px;
+ border-radius: var(--radius-xl);
+ background: linear-gradient(135deg, rgba(78, 205, 196, 0.12), rgba(167, 139, 250, 0.12));
+ border: var(--border-glass);
+}
+
+.next-stop-badge {
+ display: inline-block;
+ font-size: 0.75rem;
+ font-weight: 700;
+ letter-spacing: 0.08em;
+ color: var(--accent-3);
+ margin-bottom: 8px;
+}
+
+.next-stop-hero h2 {
+ font-family: var(--font-display);
+ font-size: 1.75rem;
+ margin-bottom: 8px;
+}
+
+.next-stop-hero h2 small {
+ font-size: 1rem;
+ color: var(--text-secondary);
+ font-weight: 500;
+}
+
+.next-stop-reasons {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin: 12px 0 16px;
+}
+
+.next-stop-reason {
+ font-size: 0.75rem;
+ padding: 4px 10px;
+ border-radius: 999px;
+ background: var(--bg-glass);
+ border: var(--border-glass);
+}
+
+.next-stop-hero-actions {
+ display: flex;
+ gap: 12px;
+ flex-wrap: wrap;
+}
+
+.next-stop-score-ring {
+ flex-shrink: 0;
+ width: 88px;
+ height: 88px;
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ background: var(--bg-card);
+ border: 2px solid var(--accent-3);
+}
+
+.next-stop-score-ring strong {
+ font-size: 1.5rem;
+ line-height: 1;
+ background: var(--gradient-text);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+}
+
+.next-stop-score-ring span {
+ font-size: 0.7rem;
+ color: var(--text-muted);
+}
+
+.next-stop-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 16px;
+}
+
+.next-stop-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 16px;
+ transition: transform 0.2s, border-color 0.2s;
+}
+
+.next-stop-card:hover {
+ transform: translateY(-3px);
+ border-color: rgba(78, 205, 196, 0.35);
+}
+
+.next-stop-card-head {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 8px;
+}
+
+.next-stop-card-head em {
+ margin-left: auto;
+ font-style: normal;
+ font-weight: 700;
+ color: var(--accent-2);
+}
+
+.next-stop-card-actions {
+ display: flex;
+ justify-content: space-between;
+ margin-top: 12px;
+ font-size: 0.85rem;
+}
+
+.next-stop-card-actions button {
+ background: none;
+ border: none;
+ color: var(--accent-3);
+ cursor: pointer;
+}
+
+.next-stop-routes,
+.next-stop-meetups {
+ margin-top: 40px;
+}
+
+.next-stop-route-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
+ gap: 16px;
+ margin-top: 16px;
+}
+
+.next-stop-route-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 20px;
+}
+
+.next-stop-route-stops {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin: 12px 0;
+}
+
+.next-stop-route-stops a {
+ font-size: 0.85rem;
+ padding: 4px 10px;
+ border-radius: 999px;
+ background: var(--bg-glass);
+}
+
+.next-stop-route-card footer {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ flex-wrap: wrap;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+.next-stop-meetups-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 12px;
+}
+
+.next-stop-meetup-row {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.next-stop-meetup-chip {
+ display: flex;
+ gap: 12px;
+ padding: 14px 16px;
+ border-radius: var(--radius-md);
+ background: var(--bg-card);
+ border: var(--border-glass);
+}
+
+.meetups-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 24px;
+}
+
+.meetups-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+ gap: 20px;
+}
+
+.meetup-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 22px;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.meetup-card-top {
+ display: flex;
+ gap: 12px;
+}
+
+.meetup-emoji {
+ font-size: 2rem;
+}
+
+.meetup-meta,
+.meetup-venue {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+.meetup-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+}
+
+.meetup-tag {
+ font-size: 0.72rem;
+ padding: 3px 8px;
+ border-radius: 999px;
+ background: var(--bg-glass);
+}
+
+.meetup-footer {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+ flex-wrap: wrap;
+ margin-top: auto;
+ padding-top: 8px;
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+}
+
+.meetup-city-link {
+ font-size: 0.85rem;
+ color: var(--accent-3);
+}
+
+.btn-sm {
+ padding: 6px 14px;
+ font-size: 0.8rem;
+}
+
+.btn.is-done {
+ opacity: 0.65;
+}
+
+.community-banner {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 20px;
+ padding: 24px 28px;
+ margin-bottom: 28px;
+ border-radius: var(--radius-xl);
+ background: linear-gradient(135deg, rgba(255, 107, 107, 0.1), rgba(78, 205, 196, 0.1));
+ border: var(--border-glass);
+}
+
+.community-featured {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 24px;
+ margin-bottom: 24px;
+}
+
+.community-pinned {
+ font-size: 0.75rem;
+ color: var(--accent-2);
+}
+
+.community-toolbar {
+ margin-bottom: 20px;
+}
+
+.community-list {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+
+.community-card {
+ display: block;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 20px;
+ transition: border-color 0.2s, transform 0.2s;
+}
+
+.community-card:hover {
+ border-color: rgba(167, 139, 250, 0.35);
+ transform: translateX(4px);
+}
+
+.community-card-head {
+ display: flex;
+ gap: 12px;
+ margin-bottom: 8px;
+}
+
+.community-meta {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.community-excerpt {
+ color: var(--text-secondary);
+ margin-bottom: 12px;
+}
+
+.community-card footer {
+ display: flex;
+ gap: 12px;
+ font-size: 0.8rem;
+ color: var(--text-muted);
+ flex-wrap: wrap;
+}
+
+.community-tag {
+ padding: 2px 8px;
+ border-radius: 999px;
+ background: var(--bg-glass);
+}
+
+.community-detail {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+ margin-bottom: 24px;
+}
+
+.community-detail-cat {
+ font-size: 0.75rem;
+ color: var(--accent-3);
+ font-weight: 600;
+}
+
+.community-replies {
+ margin-top: 24px;
+}
+
+.community-reply {
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ padding: 16px;
+ margin-bottom: 12px;
+}
+
+.community-reply-head {
+ display: flex;
+ justify-content: space-between;
+ font-size: 0.85rem;
+ margin-bottom: 8px;
+}
+
+.community-replies-preview blockquote {
+ margin: 10px 0;
+ padding-left: 12px;
+ border-left: 3px solid var(--accent-3);
+ color: var(--text-secondary);
+}
+
+.community-reply-hint {
+ text-align: center;
+ padding: 32px;
+ color: var(--text-secondary);
+}
+
+.tool-runner-head {
+ margin-bottom: 24px;
+}
+
+.tool-runner-head h1 {
+ font-family: var(--font-display);
+ font-size: 2rem;
+}
+
+.tool-runner-exits {
+ margin: 1.25rem 0 0.5rem;
+}
+
+.tool-loading {
+ padding: 48px;
+ text-align: center;
+ color: var(--text-muted);
+}
+
+@media (max-width: 1024px) {
+ .next-stop-layout { grid-template-columns: 1fr; }
+ .next-stop-filters { position: static; }
+ .next-stop-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
+}
+
+@media (max-width: 640px) {
+ .next-stop-grid { grid-template-columns: 1fr; }
+ .next-stop-hero { flex-direction: column; }
+ .community-banner { flex-direction: column; align-items: flex-start; }
+}
+
+/* ===== Dating / Chat / Join / Live / Digital ===== */
+
+.dating-page,
+.chat-page,
+.chat-thread-page,
+.join-page,
+.live-page,
+.digital-page {
+ padding: 100px 0 80px;
+ min-height: 60vh;
+}
+
+.dating-gate,
+.join-paid,
+.digital-gate,
+.live-gate {
+ text-align: center;
+ padding: 48px 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ max-width: 480px;
+ margin: 0 auto;
+}
+
+.dating-intents {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 16px;
+}
+
+.dating-quota {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ margin-bottom: 20px;
+}
+
+.dating-quota a {
+ color: var(--accent-3);
+}
+
+.dating-empty,
+.gigs-empty,
+.notif-empty {
+ text-align: center;
+ padding: 1.5rem 0 0.5rem;
+}
+
+.dating-empty-actions,
+.notif-empty-links,
+.join-paid-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.65rem;
+ justify-content: center;
+ margin-top: 1rem;
+}
+
+.join-vip-badge {
+ margin-top: 0.75rem;
+ display: inline-block;
+ padding: 0.35rem 0.9rem;
+ border-radius: 999px;
+ background: rgba(255, 193, 7, 0.15);
+ color: #e6b800;
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+
+.gigs-applied {
+ color: var(--accent-3);
+ font-weight: 600;
+ margin: 0.5rem 0 0;
+}
+
+.dating-card {
+ max-width: 420px;
+ margin: 0 auto;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 28px;
+ text-align: center;
+}
+
+.dating-deck {
+ position: relative;
+ max-width: 420px;
+ margin: 0 auto;
+ min-height: 360px;
+ touch-action: none;
+ user-select: none;
+}
+
+.dating-card-next {
+ position: absolute;
+ inset: 0;
+ transform: scale(0.96);
+ opacity: 0.55;
+ pointer-events: none;
+ z-index: 0;
+}
+
+.dating-card-top {
+ position: relative;
+ z-index: 1;
+ cursor: grab;
+ will-change: transform;
+}
+
+.dating-card-top.dragging {
+ cursor: grabbing;
+}
+
+.dating-card-top.fly-left {
+ animation: dating-fly-left 0.22s ease-in forwards;
+}
+.dating-card-top.fly-right {
+ animation: dating-fly-right 0.22s ease-in forwards;
+}
+.dating-card-top.fly-up {
+ animation: dating-fly-up 0.22s ease-in forwards;
+}
+
+@keyframes dating-fly-left {
+ to { transform: translate(-140%, 20px) rotate(-18deg); opacity: 0; }
+}
+@keyframes dating-fly-right {
+ to { transform: translate(140%, 20px) rotate(18deg); opacity: 0; }
+}
+@keyframes dating-fly-up {
+ to { transform: translate(0, -140%) rotate(-4deg); opacity: 0; }
+}
+
+.dating-stamp {
+ position: absolute;
+ top: 24px;
+ padding: 6px 12px;
+ border: 3px solid;
+ border-radius: 8px;
+ font-weight: 800;
+ letter-spacing: 0.08em;
+ pointer-events: none;
+ z-index: 2;
+}
+.dating-stamp.like {
+ left: 18px;
+ color: #3dd68c;
+ border-color: #3dd68c;
+ transform: rotate(-12deg);
+}
+.dating-stamp.nope {
+ right: 18px;
+ color: #ff6b6b;
+ border-color: #ff6b6b;
+ transform: rotate(12deg);
+}
+.dating-stamp.super {
+ left: 50%;
+ top: 18px;
+ transform: translateX(-50%) rotate(-6deg);
+ color: #ffe66d;
+ border-color: #ffe66d;
+}
+
+.dating-swipe-hint {
+ text-align: center;
+ color: var(--text-muted);
+ font-size: 0.85rem;
+ margin: 0.25rem 0 0.75rem;
+}
+
+.dating-card-photo {
+ font-size: 4rem;
+ margin-bottom: 12px;
+}
+
+.member-photo-img {
+ width: 96px;
+ height: 96px;
+ border-radius: 50%;
+ object-fit: cover;
+ display: block;
+ margin: 0 auto;
+}
+
+.dating-meta {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin-bottom: 12px;
+}
+
+.dating-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ justify-content: center;
+ margin: 16px 0;
+}
+
+.dating-view-profile {
+ display: inline-block;
+ margin-top: 4px;
+ font-size: 0.85rem;
+ color: var(--accent, #e8a87c);
+ text-decoration: none;
+ pointer-events: auto;
+ position: relative;
+ z-index: 2;
+}
+
+.dating-view-profile:hover {
+ text-decoration: underline;
+}
+
+.dating-actions {
+ display: flex;
+ justify-content: center;
+ gap: 20px;
+ margin-top: 20px;
+}
+
+.dating-btn {
+ width: 56px;
+ height: 56px;
+ border-radius: 50%;
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ font-size: 1.4rem;
+ cursor: pointer;
+ transition: transform 0.15s;
+}
+
+.dating-btn:hover { transform: scale(1.08); }
+.dating-btn.like { border-color: rgba(255, 107, 107, 0.5); }
+.dating-btn.super { border-color: rgba(255, 230, 109, 0.5); }
+
+.dating-match-modal {
+ position: fixed;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.6);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 2000;
+ padding: 24px;
+}
+
+.dating-match-box {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+ text-align: center;
+ max-width: 360px;
+}
+
+.dating-match-actions {
+ display: flex;
+ gap: 12px;
+ justify-content: center;
+ margin-top: 20px;
+}
+
+.chat-list {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.chat-list-item {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 16px 18px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ transition: border-color 0.2s;
+}
+
+.chat-list-item:hover { border-color: rgba(78, 205, 196, 0.35); }
+.chat-list-item.unread { border-color: rgba(78, 205, 196, 0.45); }
+
+.community-compose {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ margin-top: 24px;
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+
+.community-compose textarea {
+ padding: 12px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ min-height: 80px;
+}
+
+.community-compose-foot {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+}
+
+.community-compose-count,
+.community-compose-hint {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.community-compose-hint {
+ margin: 0;
+}
+
+.gigs-page { padding: 100px 0 80px; min-height: 60vh; }
+
+.join-card select {
+ padding: 10px 14px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+}
+
+.video-embed {
+ position: relative;
+ padding-bottom: 56.25%;
+ height: 0;
+ margin-top: 24px;
+ border-radius: var(--radius-lg);
+ overflow: hidden;
+}
+
+.video-embed iframe {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+ border: 0;
+}
+
+.report-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 24px;
+ margin-top: 24px;
+}
+
+.report-rank { list-style: none; padding: 0; }
+.report-rank li {
+ display: grid;
+ grid-template-columns: 24px 1fr auto auto;
+ gap: 12px;
+ padding: 10px 0;
+ border-bottom: var(--border-glass);
+ align-items: center;
+}
+
+.member-map-grid, .member-map-list {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
+ gap: 12px;
+}
+
+.member-map-item {
+ display: flex;
+ gap: 10px;
+ align-items: center;
+ padding: 12px;
+ background: var(--bg-glass);
+ border-radius: var(--radius-md);
+}
+
+.member-loc-link {
+ color: inherit;
+ text-decoration: none;
+}
+.member-loc-link:hover {
+ color: var(--accent, #4ecdc4);
+ text-decoration: underline;
+}
+
+.weather-strip { margin-top: 32px; }
+.weather-cards { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 12px; }
+.weather-card {
+ padding: 12px 16px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ min-width: 100px;
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+ text-decoration: none;
+ color: inherit;
+ transition: border-color 0.15s ease, transform 0.15s ease;
+}
+a.weather-card:hover {
+ border-color: rgba(78, 205, 196, 0.35);
+ transform: translateY(-1px);
+}
+
+.ai-reply {
+ margin-top: 24px;
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+
+.ai-suggestions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 16px;
+}
+
+.feedback-more-link {
+ margin-top: 12px;
+ text-align: center;
+ font-size: 0.85rem;
+}
+
+.feedback-more-link a {
+ color: var(--text-muted);
+}
+
+.ai-cities { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
+
+.notif-toolbar { display: flex; gap: 8px; flex-wrap: wrap; }
+.notif-pref-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 10px 0;
+ border-bottom: var(--border-glass);
+}
+
+.nav-notify-badge {
+ position: absolute;
+ top: -4px;
+ right: -4px;
+ font-size: 0.65rem;
+ font-style: normal;
+ background: var(--accent-1);
+ color: #fff;
+ border-radius: 999px;
+ padding: 1px 5px;
+}
+
+.nav-notify { position: relative; }
+
+.newsletter-strip {
+ margin-top: 48px;
+ padding: 24px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ text-align: center;
+}
+
+.newsletter-form {
+ display: flex;
+ gap: 10px;
+ justify-content: center;
+ margin-top: 12px;
+ flex-wrap: wrap;
+}
+
+.newsletter-form input {
+ min-width: 220px;
+ padding: 10px 14px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+}
+
+.newsletter-note {
+ margin-top: 10px;
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+@media (max-width: 768px) {
+ .report-grid { grid-template-columns: 1fr; }
+}
+
+.dating-likes-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 16px;
+ margin-top: 24px;
+}
+
+.dating-like-card {
+ padding: 20px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ text-align: center;
+}
+
+.dating-like-photo { font-size: 2.5rem; margin-bottom: 8px; }
+
+.chat-avatar { font-size: 1.75rem; }
+.chat-avatar-img {
+ width: 44px;
+ height: 44px;
+ border-radius: 50%;
+ object-fit: cover;
+ flex-shrink: 0;
+}
+.chat-unread {
+ margin-left: auto;
+ font-style: normal;
+ background: var(--accent-1);
+ color: #fff;
+ font-size: 0.75rem;
+ padding: 2px 8px;
+ border-radius: 999px;
+}
+
+.chat-thread-wrap {
+ display: flex;
+ flex-direction: column;
+ min-height: calc(100vh - 120px);
+}
+
+.chat-thread-peer {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ padding: 12px 0;
+ margin-bottom: 8px;
+ border-bottom: var(--border-glass);
+}
+
+.chat-thread-peer-link {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ text-decoration: none;
+ color: inherit;
+ min-width: 0;
+}
+
+.chat-thread-peer-link strong {
+ display: block;
+}
+
+.chat-thread-peer-link .dating-meta {
+ margin: 0;
+}
+
+.chat-thread-messages {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ padding: 20px 0;
+ overflow-y: auto;
+}
+
+.chat-bubble {
+ max-width: 75%;
+ padding: 12px 16px;
+ border-radius: var(--radius-lg);
+ background: var(--bg-glass);
+ border: var(--border-glass);
+ align-self: flex-start;
+}
+
+.chat-bubble.mine {
+ align-self: flex-end;
+ background: rgba(78, 205, 196, 0.15);
+ border-color: rgba(78, 205, 196, 0.35);
+}
+
+.chat-compose {
+ display: flex;
+ gap: 10px;
+ padding-top: 16px;
+ border-top: var(--border-glass);
+}
+
+.chat-compose input {
+ flex: 1;
+ padding: 12px 16px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+}
+
+.join-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 24px;
+}
+
+.join-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 28px;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.join-card label {
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+
+.join-card input,
+.join-card textarea {
+ padding: 10px 14px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+}
+
+.join-card-vip {
+ background: linear-gradient(135deg, rgba(255, 230, 109, 0.08), rgba(78, 205, 196, 0.08));
+}
+
+.join-perks {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+}
+
+.join-perks li { margin-bottom: 8px; }
+.join-login-hint { font-size: 0.85rem; margin-top: 8px; }
+.join-paid { display: flex; flex-direction: column; gap: 16px; align-items: center; }
+
+.live-page { padding: 0; min-height: 100vh; display: flex; flex-direction: column; }
+.live-toolbar {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding: 12px 20px;
+ background: var(--bg-card);
+ border-bottom: var(--border-glass);
+ flex-wrap: wrap;
+}
+.live-layout-btns { margin-left: auto; display: flex; gap: 6px; }
+.live-external-links {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 10px;
+ padding: 10px 20px;
+ background: var(--bg-card);
+ border-bottom: var(--border-glass);
+}
+.live-iframe-hint {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+.live-schedule-banner,
+.live-schedule {
+ padding: 8px 20px;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+ background: var(--bg-card);
+ border-bottom: var(--border-glass);
+}
+.live-schedule {
+ padding: 0;
+ border: none;
+ background: transparent;
+ margin-bottom: 0.5rem;
+}
+.live-stage {
+ flex: 1;
+ display: grid;
+ min-height: 0;
+}
+.live-stage.layout-split { grid-template-columns: 1fr 380px; }
+.live-stage.layout-video { grid-template-columns: 1fr; }
+.live-stage.layout-chat { grid-template-columns: 1fr; }
+.live-iframe { width: 100%; height: 100%; border: none; min-height: 400px; }
+.live-video { background: #000; }
+.live-chat { border-left: var(--border-glass); }
+
+.digital-hero {
+ margin-bottom: 32px;
+}
+
+.digital-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
+ gap: 20px;
+}
+
+.digital-card {
+ display: block;
+ padding: 28px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ transition: transform 0.2s, border-color 0.2s;
+}
+
+.digital-card:hover {
+ transform: translateY(-4px);
+ border-color: rgba(167, 139, 250, 0.35);
+}
+
+.digital-card-vip {
+ background: linear-gradient(135deg, rgba(255, 230, 109, 0.1), rgba(78, 205, 196, 0.1));
+}
+
+.digital-card-emoji { font-size: 2.5rem; display: block; margin-bottom: 12px; }
+
+.digital-module {
+ margin-bottom: 32px;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 24px;
+}
+
+.digital-lesson-list {
+ list-style: none;
+ padding: 0;
+ margin: 16px 0 0;
+}
+
+.digital-lesson-list li a {
+ display: flex;
+ justify-content: space-between;
+ padding: 12px 0;
+ border-bottom: var(--border-glass);
+ font-size: 0.95rem;
+}
+
+.digital-lesson-list li a.digital-lesson-locked {
+ opacity: 0.85;
+}
+
+.digital-lesson-list li a.digital-lesson-locked:hover .digital-lesson-meta {
+ color: var(--accent-3);
+}
+
+.digital-lesson-meta {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.digital-lesson {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-xl);
+ padding: 32px;
+}
+
+.digital-lesson-body {
+ margin: 24px 0;
+ color: var(--text-secondary);
+ line-height: 1.7;
+}
+
+.digital-lesson-nav {
+ display: flex;
+ justify-content: space-between;
+ gap: 12px;
+ margin-top: 32px;
+}
+
+.digital-jobs-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+ gap: 20px;
+}
+
+.digital-job-card {
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+ padding: 22px;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.digital-job-company,
+.digital-job-meta {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+}
+
+.meetup-footer-actions {
+ display: flex;
+ gap: 8px;
+ flex-wrap: wrap;
+}
+
+.meetup-live-btn {
+ background: var(--bg-glass);
+ color: var(--accent-3);
+}
+
+@media (max-width: 768px) {
+ .join-grid { grid-template-columns: 1fr; }
+ .live-toolbar {
+ padding: 10px 12px;
+ gap: 8px;
+ }
+ .live-toolbar strong {
+ flex: 1 1 100%;
+ font-size: 0.95rem;
+ }
+ .live-layout-btns {
+ margin-left: 0;
+ width: 100%;
+ justify-content: flex-start;
+ }
+ .live-external-links {
+ padding: 8px 12px;
+ }
+ .live-stage {
+ min-height: 50vh;
+ }
+ .live-stage.layout-split { grid-template-columns: 1fr; }
+ .live-iframe { min-height: 50vh; }
+ .live-chat { border-left: none; border-top: var(--border-glass); }
+}
+
+/* -- Feature rings / progressive IA -- */
+.nav-group {
+ position: relative;
+}
+.nav-group-btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ padding: 8px 14px;
+ border: none;
+ border-radius: var(--radius-sm);
+ background: transparent;
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all var(--transition);
+}
+.nav-group-btn:hover,
+.nav-group.open .nav-group-btn,
+.nav-group.is-active .nav-group-btn {
+ color: var(--text-primary);
+ background: var(--bg-glass);
+}
+.nav-group-caret {
+ font-size: 0.65rem;
+ opacity: 0.7;
+}
+.nav-group-panel {
+ display: none;
+ position: absolute;
+ top: calc(100% + 8px);
+ left: 0;
+ min-width: 200px;
+ padding: 8px;
+ border-radius: var(--radius-md);
+ background: rgba(10, 14, 23, 0.95);
+ border: var(--border-glass);
+ backdrop-filter: blur(16px);
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35);
+ flex-direction: column;
+ gap: 2px;
+ z-index: 50;
+}
+.nav-group.open .nav-group-panel {
+ display: flex;
+}
+.nav-group-panel a {
+ display: block;
+ padding: 10px 12px;
+ border-radius: var(--radius-sm);
+ color: var(--text-secondary);
+ font-size: 0.88rem;
+ white-space: nowrap;
+}
+.nav-group-panel a:hover,
+.nav-group-panel a.active {
+ color: var(--text-primary);
+ background: var(--bg-glass);
+}
+[data-theme="light"] .nav-group-panel {
+ background: rgba(248, 250, 252, 0.98);
+}
+
+.ring-next {
+ margin: 48px 0 24px;
+ padding: 28px 0 8px;
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
+}
+.ring-next-head {
+ margin-bottom: 16px;
+}
+.ring-next-tag {
+ display: inline-block;
+ font-size: 0.72rem;
+ letter-spacing: 0.12em;
+ color: var(--accent-3, #4ecdc4);
+ margin-bottom: 6px;
+}
+.ring-next-head h2 {
+ font-size: 1.25rem;
+ margin: 0;
+}
+.ring-next-grid {
+ display: grid;
+ gap: 12px;
+}
+.ring-next-n2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+}
+.ring-next-n3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+.ring-next-card {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 16px 18px;
+ border-radius: var(--radius-lg);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ transition: transform 0.2s ease, border-color 0.2s ease;
+}
+.ring-next-card:hover {
+ transform: translateY(-2px);
+ border-color: rgba(78, 205, 196, 0.35);
+}
+.ring-next-emoji {
+ font-size: 1.5rem;
+ flex-shrink: 0;
+}
+.ring-next-card strong {
+ display: block;
+ font-size: 0.98rem;
+}
+.ring-next-card p {
+ margin: 4px 0 0;
+ font-size: 0.82rem;
+ color: var(--text-secondary);
+ line-height: 1.4;
+}
+.ring-next-go {
+ margin-left: auto;
+ opacity: 0.45;
+ font-size: 1.1rem;
+}
+.home-ring-wrap {
+ padding-bottom: 8px;
+}
+.journey-rail-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+.footer-grid-rings {
+ grid-template-columns: 1.4fr repeat(4, minmax(0, 1fr));
+ gap: 28px;
+}
+.tools-featured-grid-compact {
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+}
+.tools-hub-more {
+ display: flex;
+ justify-content: center;
+ margin: 28px 0 8px;
+}
+
+@media (max-width: 900px) {
+ .nav-group-panel {
+ position: static;
+ display: none;
+ min-width: 0;
+ box-shadow: none;
+ background: transparent;
+ border: none;
+ padding: 4px 0 8px 12px;
+ backdrop-filter: none;
+ }
+ .nav-group.open .nav-group-panel {
+ display: flex;
+ }
+ .ring-next-n2,
+ .ring-next-n3,
+ .journey-rail-3 {
+ grid-template-columns: 1fr;
+ }
+ .footer-grid-rings {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+@media (max-width: 560px) {
+ .footer-grid-rings {
+ grid-template-columns: 1fr;
+ }
+}
+
+.search-ring-hints {
+ padding: 8px 4px 12px;
+}
+.search-ring-label {
+ font-size: 0.8rem;
+ letter-spacing: 0.06em;
+ color: var(--text-muted);
+ margin: 0 0 12px;
+}
+.search-ring-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 8px;
+}
+.search-ring-chip {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 6px;
+ padding: 12px;
+ border-radius: var(--radius-md);
+ border: var(--border-glass);
+ background: var(--bg-glass);
+ color: var(--text-primary);
+ cursor: pointer;
+ text-align: left;
+ transition: border-color 0.2s ease, transform 0.2s ease;
+}
+.search-ring-chip:hover {
+ border-color: rgba(78, 205, 196, 0.4);
+ transform: translateY(-1px);
+}
+.search-ring-chip span {
+ font-size: 1.2rem;
+}
+.search-ring-chip strong {
+ font-size: 0.85rem;
+ font-weight: 600;
+}
+.search-hints-kbd {
+ margin: 14px 0 0;
+ font-size: 0.78rem;
+ color: var(--text-muted);
+}
+@media (max-width: 640px) {
+ .search-ring-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+.meetups-login-hint {
+ margin: 8px 0 0;
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+}
+.meetups-login-hint a {
+ color: var(--accent-3, #4ecdc4);
+ text-decoration: underline;
+}
+
+/* ===== Recently viewed + AI history + profile RSVPs ===== */
+.recently-viewed {
+ padding: 2.5rem 0 1rem;
+}
+.recently-viewed.compact {
+ padding: 1.25rem 0;
+ margin-top: 1.5rem;
+}
+.recently-viewed-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 1rem;
+ margin-bottom: 1rem;
+ flex-wrap: wrap;
+}
+.recently-viewed-head h2 {
+ margin: 0.25rem 0 0;
+ font-size: 1.35rem;
+}
+.recently-viewed.compact .recently-viewed-head h2 {
+ font-size: 1.15rem;
+}
+.recently-viewed-actions {
+ display: flex;
+ gap: 0.5rem;
+ flex-wrap: wrap;
+}
+.recently-viewed-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+ gap: 0.75rem;
+}
+.recently-viewed-card {
+ display: flex;
+ gap: 0.75rem;
+ align-items: center;
+ padding: 0.85rem 1rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+ transition: transform 0.2s ease, border-color 0.2s ease;
+}
+.recently-viewed-card:hover {
+ transform: translateY(-2px);
+ border-color: color-mix(in srgb, var(--accent) 40%, transparent);
+}
+.recently-viewed-emoji {
+ font-size: 1.6rem;
+ line-height: 1;
+}
+.recently-viewed-card strong {
+ display: block;
+ font-size: 0.95rem;
+}
+.recently-viewed-country {
+ color: var(--text-muted);
+ font-weight: 500;
+}
+.recently-viewed-card p {
+ margin: 0.15rem 0 0;
+ font-size: 0.78rem;
+ color: var(--text-muted);
+}
+.recently-viewed-compare {
+ margin-top: 1rem;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ align-items: center;
+}
+
+.ai-history {
+ margin-top: 2rem;
+}
+.ai-history-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+.ai-history-head h2 {
+ margin: 0;
+ font-size: 1.1rem;
+}
+.ai-history-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+.ai-history-item {
+ width: 100%;
+ text-align: left;
+ padding: 0.85rem 1rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: inherit;
+ cursor: pointer;
+ transition: border-color 0.2s ease;
+}
+.ai-history-item:hover {
+ border-color: color-mix(in srgb, var(--accent) 35%, transparent);
+}
+.ai-history-item strong {
+ display: block;
+ margin-bottom: 0.25rem;
+}
+.ai-history-item span {
+ font-size: 0.82rem;
+ color: var(--text-muted);
+}
+
+.profile-rsvps {
+ margin-top: 2rem;
+}
+.profile-rsvp-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.65rem;
+}
+.profile-rsvp-card {
+ display: flex;
+ align-items: center;
+ gap: 0.85rem;
+ padding: 0.85rem 1rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+}
+.profile-rsvp-card span {
+ font-size: 1.5rem;
+}
+.profile-rsvp-card strong {
+ display: block;
+}
+.profile-rsvp-card p {
+ margin: 0.15rem 0 0;
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+.profile-rsvp-card .btn {
+ margin-left: auto;
+}
+
+.profile-rsvp-actions {
+ margin-left: auto;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.4rem;
+ justify-content: flex-end;
+}
+
+.profile-rsvp-actions .btn {
+ margin-left: 0;
+}
+
+.compare-history {
+ margin: 0 0 1.5rem;
+ padding: 1rem 1.15rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+.compare-history-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+.compare-history-head h2 {
+ margin: 0;
+ font-size: 1rem;
+}
+.compare-history-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+.compare-history-chip {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ width: 100%;
+ text-align: left;
+ padding: 0.7rem 0.9rem;
+ background: transparent;
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ color: inherit;
+ cursor: pointer;
+}
+.compare-history-chip:hover {
+ border-color: color-mix(in srgb, var(--accent) 40%, transparent);
+}
+.compare-history-chip span {
+ font-size: 0.88rem;
+}
+.compare-history-chip strong {
+ font-size: 0.78rem;
+ color: var(--accent-3, #4ecdc4);
+ white-space: nowrap;
+}
+.search-recent-inline {
+ margin-bottom: 1rem;
+}
+.profile-section-actions {
+ display: flex;
+ gap: 0.5rem;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+/* ===== Digest + watch later ===== */
+.nomad-digest {
+ margin: 1.75rem 0;
+ padding: 1.25rem 1.35rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+.nomad-digest-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 1rem;
+ margin-bottom: 1rem;
+ flex-wrap: wrap;
+}
+.nomad-digest-head h2 {
+ margin: 0.2rem 0 0;
+ font-size: 1.2rem;
+}
+.nomad-digest-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
+ gap: 0.75rem;
+}
+.nomad-digest-card {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+ padding: 0.9rem 1rem;
+ background: color-mix(in srgb, var(--bg-body) 55%, transparent);
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+ transition: transform 0.2s ease, border-color 0.2s ease;
+}
+.nomad-digest-card:hover {
+ transform: translateY(-2px);
+ border-color: color-mix(in srgb, var(--accent) 40%, transparent);
+}
+.nomad-digest-card strong {
+ font-size: 1.25rem;
+}
+.nomad-digest-card span {
+ font-size: 0.85rem;
+}
+.nomad-digest-card small {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.nomad-digest-recent {
+ margin-top: 1rem;
+}
+.nomad-digest-recent > span {
+ display: block;
+ margin-bottom: 0.5rem;
+ font-size: 0.85rem;
+ color: var(--text-muted);
+}
+.nomad-digest-chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.45rem;
+}
+.nomad-digest.compact {
+ margin: 1rem 0 0.25rem;
+ padding: 1rem 1.15rem;
+}
+.nomad-digest.compact h2 {
+ font-size: 1.05rem;
+}
+.nomad-digest.compact .section-desc {
+ margin-bottom: 0;
+ font-size: 0.9rem;
+}
+
+.plan-stop-links {
+ margin: 0.35rem 0 0.55rem;
+}
+.plan-city-meetup {
+ font-size: 0.85rem;
+ color: var(--accent);
+ text-decoration: none;
+}
+.plan-city-meetup:hover {
+ text-decoration: underline;
+}
+
+.meetup-peers {
+ margin-top: 0.85rem;
+ padding-top: 0.75rem;
+ border-top: var(--border-glass);
+}
+.meetup-peers-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.5rem;
+ margin-bottom: 0.5rem;
+ font-size: 0.9rem;
+ color: var(--text-muted);
+}
+.meetup-peers-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 0.4rem;
+}
+.meetup-peers-list li {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.5rem;
+}
+.meetup-peers-list a {
+ text-decoration: none;
+ color: inherit;
+ display: flex;
+ flex-direction: column;
+ gap: 0.1rem;
+ min-width: 0;
+}
+.meetup-peers-list strong {
+ font-size: 0.92rem;
+}
+.meetup-peers-list span {
+ font-size: 0.78rem;
+ color: var(--text-muted);
+}
+
+.live-exit {
+ padding: 1.25rem 0 2rem;
+}
+
+.watch-later-panel {
+ margin-bottom: 1.5rem;
+ padding: 1rem 1.15rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+.watch-later-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+.watch-later-head h2 {
+ margin: 0;
+ font-size: 1.05rem;
+}
+.watch-later-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.45rem;
+}
+.watch-later-chip {
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ gap: 0.65rem;
+ align-items: center;
+ padding: 0.65rem 0.85rem;
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+}
+.watch-later-chip:hover {
+ border-color: color-mix(in srgb, var(--accent) 35%, transparent);
+}
+.watch-later-chip small {
+ color: var(--text-muted);
+ font-size: 0.75rem;
+}
+.video-card-wrap {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+.video-card-wrap > a {
+ text-decoration: none;
+ color: inherit;
+}
+.video-card-wrap > .btn {
+ align-self: flex-start;
+}
+
+.saved-gigs-panel {
+ margin-bottom: 1.5rem;
+ padding: 1rem 1.15rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+.saved-gigs-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+.saved-gigs-head h2 {
+ margin: 0;
+ font-size: 1.05rem;
+}
+.saved-gigs-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+}
+.saved-gig-chip {
+ display: flex;
+ flex-direction: column;
+ gap: 0.15rem;
+ padding: 0.55rem 0.8rem;
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+ max-width: 220px;
+}
+.saved-gig-chip:hover {
+ border-color: color-mix(in srgb, var(--accent) 35%, transparent);
+}
+.saved-gig-chip small {
+ color: var(--text-muted);
+ font-size: 0.75rem;
+}
+.gig-card-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 0.75rem;
+ margin-bottom: 0.5rem;
+}
+.gig-card-top h3 {
+ margin: 0;
+}
+
+.saved-jobs-panel {
+ margin-bottom: 1.5rem;
+ padding: 1rem 1.15rem;
+ background: var(--bg-card);
+ border: var(--border-glass);
+ border-radius: var(--radius-lg);
+}
+.saved-jobs-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+.saved-jobs-head h2 {
+ margin: 0;
+ font-size: 1.05rem;
+}
+.saved-jobs-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+}
+.saved-job-chip {
+ display: flex;
+ flex-direction: column;
+ gap: 0.15rem;
+ padding: 0.55rem 0.8rem;
+ border: var(--border-glass);
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ color: inherit;
+ max-width: 240px;
+}
+.saved-job-chip:hover {
+ border-color: color-mix(in srgb, var(--accent) 35%, transparent);
+}
+.saved-job-chip small {
+ color: var(--text-muted);
+ font-size: 0.75rem;
+}
+.jobs-toolbar {
+ margin-bottom: 1.25rem;
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
diff --git a/redmini/tool/styles.css b/redmini/tool/styles.css
deleted file mode 100644
index 63e3d4c..0000000
--- a/redmini/tool/styles.css
+++ /dev/null
@@ -1,277 +0,0 @@
-:root {
- --bg: #0b0a10;
- --bg2: #14121c;
- --card: rgba(255, 255, 255, 0.06);
- --card2: rgba(255, 255, 255, 0.09);
- --text: #f4f0ea;
- --muted: #9a94a8;
- --accent: #f0c674;
- --accent2: #7dd3c7;
- --danger: #f07178;
- --border: rgba(255, 255, 255, 0.1);
- --safe-b: env(safe-area-inset-bottom, 0px);
- --safe-t: env(safe-area-inset-top, 0px);
- --tab-h: 64px;
- --top-h: 56px;
-}
-
-*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
-html, body {
- height: 100%;
- background: var(--bg);
- color: var(--text);
- font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
- -webkit-font-smoothing: antialiased;
- -webkit-tap-highlight-color: transparent;
-}
-button, input, select, textarea { font: inherit; color: inherit; }
-button { border: 0; background: none; cursor: pointer; }
-.is-hidden { display: none !important; }
-
-#app {
- min-height: 100%;
- min-height: 100vh;
- padding-top: calc(var(--top-h) + var(--safe-t));
- padding-bottom: calc(var(--tab-h) + var(--safe-b) + 8px);
-}
-
-.top-chrome {
- position: fixed; top: 0; left: 0; right: 0; z-index: 40;
- height: calc(var(--top-h) + var(--safe-t));
- padding: var(--safe-t) 14px 0;
- display: flex; align-items: center; justify-content: space-between;
- background: rgba(11, 10, 16, 0.92);
- backdrop-filter: blur(14px);
- border-bottom: 1px solid var(--border);
-}
-.top-left { display: flex; align-items: center; gap: 8px; }
-.top-brand { font-weight: 700; font-size: 16px; letter-spacing: 0.4px; }
-.top-sub { font-size: 11px; color: var(--muted); margin-top: 1px; }
-.icon-btn {
- width: 34px; height: 34px; border-radius: 10px;
- background: var(--card); color: var(--text); font-size: 16px;
-}
-.chip {
- padding: 6px 10px; border-radius: 999px; font-size: 12px;
- background: rgba(240, 198, 116, 0.15); color: var(--accent);
- border: 1px solid rgba(240, 198, 116, 0.35);
-}
-
-.main { padding: 12px 14px 20px; max-width: 720px; margin: 0 auto; }
-
-.tabbar {
- position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
- height: calc(var(--tab-h) + var(--safe-b));
- padding: 6px 6px var(--safe-b);
- display: flex; background: rgba(16, 14, 24, 0.96);
- border-top: 1px solid var(--border);
- backdrop-filter: blur(14px);
-}
-.tab {
- flex: 1; display: flex; flex-direction: column; align-items: center; gap: 2px;
- color: var(--muted); font-size: 10px; padding: 6px 0;
-}
-.tab span { font-size: 18px; line-height: 1; }
-.tab.is-active { color: var(--accent); }
-
-.hero {
- position: relative; overflow: hidden; border-radius: 22px;
- padding: 22px 18px 20px;
- background:
- radial-gradient(500px 220px at 0% 0%, rgba(240, 198, 116, 0.22), transparent 55%),
- radial-gradient(420px 200px at 100% 0%, rgba(125, 211, 199, 0.16), transparent 50%),
- linear-gradient(165deg, #15121d, #0e0c14 70%);
- border: 1px solid var(--border);
- margin-bottom: 16px;
-}
-.hero-badge {
- display: inline-block; font-size: 11px; color: var(--accent2);
- background: rgba(125, 211, 199, 0.12); padding: 4px 8px; border-radius: 999px;
- margin-bottom: 10px;
-}
-.hero h1 { font-size: 28px; line-height: 1.2; font-weight: 760; margin-bottom: 8px; }
-.hero p { color: var(--muted); font-size: 13px; line-height: 1.55; }
-.hero-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
-.btn {
- display: inline-flex; align-items: center; justify-content: center;
- padding: 10px 14px; border-radius: 999px; font-size: 13px; font-weight: 600;
- background: var(--accent); color: #1a1520;
-}
-.btn.ghost {
- background: transparent; color: var(--text);
- border: 1px solid var(--border);
-}
-.btn.sm { padding: 7px 11px; font-size: 12px; }
-
-.section { margin: 18px 0 8px; }
-.section-head {
- display: flex; align-items: baseline; justify-content: space-between;
- margin-bottom: 10px;
-}
-.section-head h2 { font-size: 16px; font-weight: 700; }
-.section-head .more { font-size: 12px; color: var(--accent); }
-
-.stats {
- display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; margin: 14px 0;
-}
-.stat {
- background: var(--card); border: 1px solid var(--border); border-radius: 14px;
- padding: 10px 6px; text-align: center;
-}
-.stat b { display: block; color: var(--accent); font-size: 16px; }
-.stat span { display: block; margin-top: 3px; color: var(--muted); font-size: 10px; }
-
-.ring-grid, .card-grid { display: grid; gap: 10px; }
-.ring-grid { grid-template-columns: 1fr 1fr; }
-.ring-card, .card {
- background: var(--card); border: 1px solid var(--border); border-radius: 16px;
- padding: 14px; text-align: left;
-}
-.ring-card .emoji, .card .emoji { font-size: 22px; display: block; margin-bottom: 8px; }
-.ring-card strong, .card strong { display: block; font-size: 14px; margin-bottom: 4px; }
-.ring-card span, .card .desc, .meta {
- display: block; color: var(--muted); font-size: 12px; line-height: 1.45;
-}
-
-.list { display: flex; flex-direction: column; gap: 10px; }
-.list-item {
- display: flex; gap: 12px; align-items: flex-start;
- background: var(--card); border: 1px solid var(--border); border-radius: 16px;
- padding: 12px 14px; text-align: left; width: 100%;
-}
-.list-item .lead {
- width: 42px; height: 42px; border-radius: 12px; flex-shrink: 0;
- display: flex; align-items: center; justify-content: center;
- background: var(--card2); font-size: 22px;
-}
-.list-item .body { flex: 1; min-width: 0; }
-.list-item .title { font-size: 14px; font-weight: 650; }
-.list-item .meta { margin-top: 4px; }
-.fav-dot { color: var(--accent); font-size: 12px; margin-left: 6px; }
-
-.chips { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
-.chip-btn {
- padding: 7px 12px; border-radius: 999px; font-size: 12px;
- background: var(--card); border: 1px solid var(--border); color: var(--muted);
-}
-.chip-btn.is-on { color: #1a1520; background: var(--accent); border-color: var(--accent); }
-
-.detail-hero {
- border-radius: 20px; padding: 18px; margin-bottom: 14px;
- background: linear-gradient(160deg, rgba(240,198,116,.18), transparent 55%), var(--bg2);
- border: 1px solid var(--border);
-}
-.detail-hero .emoji { font-size: 36px; }
-.detail-hero h1 { font-size: 24px; margin: 8px 0 4px; }
-.kv {
- display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin: 12px 0;
-}
-.kv .cell {
- background: var(--card); border-radius: 14px; padding: 12px; border: 1px solid var(--border);
-}
-.kv .k { color: var(--muted); font-size: 11px; }
-.kv .v { display: block; margin-top: 4px; font-size: 16px; font-weight: 700; color: var(--accent); }
-
-.hl { display: flex; flex-wrap: wrap; gap: 8px; margin: 8px 0 14px; }
-.hl span {
- font-size: 12px; padding: 6px 10px; border-radius: 999px;
- background: rgba(125, 211, 199, 0.1); color: #b7efe6;
-}
-
-.article {
- background: var(--card); border: 1px solid var(--border); border-radius: 16px;
- padding: 16px; line-height: 1.7; font-size: 14px; color: #e8e2f4;
- white-space: pre-wrap;
-}
-.article h2, .article h3 { color: var(--text); margin: 14px 0 8px; font-size: 16px; }
-.article p { margin: 0 0 10px; }
-.article ul, .article ol { padding-left: 18px; margin-bottom: 10px; }
-.article li { margin: 4px 0; }
-.article table { width: 100%; border-collapse: collapse; font-size: 12px; margin: 10px 0; }
-.article th, .article td { border: 1px solid var(--border); padding: 6px 8px; text-align: left; }
-
-.form {
- background: var(--card); border: 1px solid var(--border); border-radius: 16px; padding: 14px;
-}
-.field { margin-bottom: 12px; }
-.field label { display: block; font-size: 12px; color: var(--muted); margin-bottom: 6px; }
-.field input, .field select, .field textarea {
- width: 100%; padding: 10px 12px; border-radius: 12px;
- background: rgba(0,0,0,.25); border: 1px solid var(--border);
-}
-.check-list { display: flex; flex-direction: column; gap: 8px; }
-.check-item {
- display: flex; align-items: center; gap: 10px;
- background: var(--card); border: 1px solid var(--border); border-radius: 14px;
- padding: 12px 14px; text-align: left; width: 100%;
-}
-.check-item.is-on { border-color: rgba(240,198,116,.5); background: rgba(240,198,116,.08); }
-.check-box {
- width: 20px; height: 20px; border-radius: 6px; border: 1.5px solid var(--muted);
- display: flex; align-items: center; justify-content: center; font-size: 12px;
-}
-.check-item.is-on .check-box { background: var(--accent); border-color: var(--accent); color: #1a1520; }
-
-.lifestyle {
- display: flex; gap: 8px; overflow-x: auto; padding-bottom: 4px; -webkit-overflow-scrolling: touch;
-}
-.life-card {
- min-width: 140px; flex-shrink: 0;
- background: var(--card); border: 1px solid var(--border); border-radius: 16px;
- padding: 12px; text-align: left;
-}
-.life-card.is-on { border-color: var(--accent); }
-.life-detail {
- margin-top: 10px; padding: 12px; border-radius: 14px;
- background: rgba(240,198,116,.08); color: #e8dfc8; font-size: 13px; line-height: 1.55;
-}
-
-.note {
- margin: 10px 0 14px; padding: 10px 12px; border-radius: 12px;
- background: rgba(240,198,116,.1); color: #e8d7a8; font-size: 12px; line-height: 1.5;
-}
-.empty { text-align: center; color: var(--muted); padding: 28px 10px; font-size: 13px; }
-
-.map-board {
- position: relative; height: 220px; border-radius: 18px; overflow: hidden;
- background:
- radial-gradient(circle at 20% 40%, rgba(125,211,199,.15), transparent 30%),
- radial-gradient(circle at 70% 35%, rgba(240,198,116,.12), transparent 28%),
- linear-gradient(180deg, #17141f, #0f0d15);
- border: 1px solid var(--border); margin-bottom: 12px;
-}
-.map-pin {
- position: absolute; transform: translate(-50%, -100%);
- font-size: 18px; filter: drop-shadow(0 2px 4px rgba(0,0,0,.5));
-}
-.map-pin span {
- display: block; margin-top: 2px; font-size: 9px; color: var(--text);
- background: rgba(0,0,0,.45); padding: 1px 4px; border-radius: 4px; white-space: nowrap;
-}
-
-.sheet { position: fixed; inset: 0; z-index: 60; }
-.sheet-mask { position: absolute; inset: 0; background: rgba(0,0,0,.55); }
-.sheet-panel {
- position: absolute; left: 0; right: 0; bottom: 0;
- max-height: 78%; overflow: auto;
- background: #16131e; border-radius: 20px 20px 0 0;
- padding: 10px 16px calc(20px + var(--safe-b));
- border-top: 1px solid var(--border);
-}
-.sheet-handle {
- width: 42px; height: 4px; border-radius: 99px; background: rgba(255,255,255,.2);
- margin: 4px auto 14px;
-}
-
-.compare-pick { display: flex; gap: 8px; margin-bottom: 10px; }
-.compare-pick select { flex: 1; padding: 10px; border-radius: 12px; background: rgba(0,0,0,.25); border: 1px solid var(--border); }
-.compare-table { width: 100%; border-collapse: collapse; font-size: 12px; }
-.compare-table th, .compare-table td { border-bottom: 1px solid var(--border); padding: 10px 6px; text-align: left; }
-.compare-table th { color: var(--muted); font-weight: 500; }
-
-.quote {
- background: var(--card); border-left: 3px solid var(--accent);
- border-radius: 0 14px 14px 0; padding: 12px 14px; margin-bottom: 10px;
-}
-.quote p { font-size: 13px; line-height: 1.55; }
-.quote .who { margin-top: 8px; color: var(--muted); font-size: 12px; }