1<!DOCTYPE html> 2<html lang="en" data-color-scheme="light" class="scroll-smooth"> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 7 <title>About</title> 8 9 <meta name="HandheldFriendly" content="True" /> 10 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 11 12 <meta name="theme-color" content="#1a87d0"> 13 <meta name="ghost-theme" content="Brief 1.4.0"> 14 15 <link rel="preconnect" href="https://fonts.googleapis.com"> 16 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 17 18 19 20 21 22 23 <link href="https://fonts.googleapis.com/css2?family=Geist:wght@400;700&display=swap" rel="stylesheet"> 24 25 26 27 28 <link rel="stylesheet" type="text/css" href="https://www.thetraveler.org/assets/built/app.css?v=JlCZ-TxmQAXehDTp" /> 29 30
30<script> 31 let preferredTheme = localStorage.getItem('PREFERRED_COLOR_SCHEME') || `light`; 32 document.documentElement.setAttribute('data-color-scheme', preferredTheme); 33 34 // Global values needed 35 const themeGlobal = { 36 siteUrl: 'https://www.thetraveler.org', 37 currentPage: parseInt(''), 38 nextPage: parseInt(''), 39 nextPageLink: '', 40 maxPages: parseInt(''), 41 lastPage: `` === `` ? true : false, 42 postsPerPage: parseInt('15'), 43 total: parseInt('') 44 } 45 46 function hexToRgb(hexColor) { 47 if (hexColor.slice(0, 1) === '#') { hexColor = hexColor.slice(1); } 48 if (hexColor.length === 3) { hexColor = hexColor.split('').map(function (hex) { return hex + hex;}).join(''); } 49 const r = parseInt(hexColor.substr(0,2),16); 50 const g = parseInt(hexColor.substr(2,2),16); 51 const b = parseInt(hexColor.substr(4,2),16); 52 53 return [r,g,b] 54 } 55 56 // Get contrast color; 57 function getColorContrast(hexColor) { 58 const rgb = hexToRgb(hexColor); 59 let yiq = ((rgb[0] * 299) + (rgb[1] * 587) + (rgb[2] * 114)) / 1000; 60 const colorContrast = (yiq >= 128) ? 'dark' : 'light'; 61 62 // return 63 return colorContrast 64 }; 65 66 function hexToHsl(hexColor) { 67 const rgb = hexToRgb(hexColor); 68 69 // Make r, g, and b fractions of 1 70 const r = rgb[0]/255; 71 const g = rgb[1]/255; 72 const b = rgb[2]/255; 73 74 const max = Math.max(r, g, b), min = Math.min(r, g, b); 75 let h, s, l = (max + min) / 2; 76 if ( max == min ) { h = s = 0; } else { 77 let d = max - min; 78 s = l > 0.5 ? d / (2 - max - min) : d / (max + min); 79 switch(max){ 80 case r: h = (g - b) / d + (g < b ? 6 : 0); break; 81 case g: h = (b - r) / d + 2; break; 82 case b: h = (r - g) / d + 4; break; 83 } 84 h /= 6; 85 } 86 87 return [Math.round(h * 360),Math.round(s * 100),Math.round(l * 100)] 88 } 89 90 function setBrandHSL(hex) { 91 const colorHsl = hexToHsl(hex) 92 document.documentElement.style.setProperty('--color-brand-hsl', `${colorHsl[0]} ${colorHsl[1]}% ${colorHsl[2]}%`); 93 document.documentElement.style.setProperty('--color-brand-contrast', getColorContrast(hex) === 'dark' ? `hsl(${colorHsl[0]} ${colorHsl[1]}% 5%)` : `hsl(${colorHsl[0]} ${colorHsl[1]}% 98%)`); 94 } 95 96 setBrandHSL("#1a87d0"); 97</script>
97 98 99 100
100<script> 101 (function () { 102 var hrefRe = /\/public\/cards\.min\.css/; 103 function swap(link){ 104 var href = link.href; 105 link.remove(); 106 var preload = document.createElement('link'); 107 preload.rel = 'preload'; preload.as = 'style'; preload.href = href; 108 var sheet = document.createElement('link'); 109 sheet.rel = 'stylesheet'; sheet.href = href; sheet.media = 'print'; 110 sheet.onload = function(){ this.media = 'all'; }; 111 document.head.append(preload, sheet); 112 } 113 // If already present, swap immediately; else observe for it 114 var existing = Array.from(document.head.querySelectorAll('link[rel="stylesheet"]')) 115 .find(function(l){ return hrefRe.test(l.getAttribute('href') || ''); }); 116 if (existing) { swap(existing); return; } 117 var mo = new MutationObserver(function(){ 118 var el = Array.from(document.head.querySelectorAll('link[rel="stylesheet"]')) 119 .find(function(l){ return hrefRe.test(l.getAttribute('href') || ''); }); 120 if (!el) return; 121 mo.disconnect(); swap(el); 122 }); 123 mo.observe(document.head, {childList:true, subtree:true}); 124 })(); 125 </script>
125 126 127 <link rel="icon" href="https://storage.ghost.io/c/af/2f/af2f1cc4-cdb2-43b2-8f1c-19528fe4b50c/content/images/size/w256h256/format/png/2025/09/ico.svg" type="image/png"> 128 <link rel="canonical" href="https://www.thetraveler.org/about/"> 129 <meta name="referrer" content="no-referrer-when-downgrade"> 130 131 <meta property="og:site_name" content="The Traveler"> 132 <meta property="og:type" content="website"> 133 <meta property="og:title" content="About"> 134 <meta property="og:description" content="The Traveler is a global hub of travel knowledge built for readers who want to understand the world in full context. 135Each guide is researched in depth, written with care, and designed to show how destinations truly live, change, and connect. 136 137We combine storytelling and research to create travel content"> 138 <meta property="og:url" content="https://www.thetraveler.org/about/"> 139 <meta property="og:image" content="https://storage.ghost.io/c/af/2f/af2f1cc4-cdb2-43b2-8f1c-19528fe4b50c/content/images/size/w1200/2024/04/corfu-greece-1.webp"> 140 <meta property="article:published_time" content="2024-02-27T16:45:24.000Z"> 141 <meta property="article:modified_time" content="2025-11-11T04:17:31.000Z"> 142 <meta property="article:publisher" content="https://www.facebook.com/thetravelernetwork"> 143 <meta name="twitter:card" content="summary_large_image"> 144 <meta name="twitter:title" content="About"> 145 <meta name="twitter:description" content="The Traveler is a global hub of travel knowledge built for readers who want to understand the world in full context. 146Each guide is researched in depth, written with care, and designed to show how destinations truly live, change, and connect. 147 148We combine storytelling and research to create travel content"> 149 <meta name="twitter:url" content="https://www.thetraveler.org/about/"> 150 <meta name="twitter:image" content="https://storage.ghost.io/c/af/2f/af2f1cc4-cdb2-43b2-8f1c-19528fe4b50c/content/images/size/w1200/2024/04/corfu-greece.webp"> 151 <meta name="twitter:label1" content="Written by"> 152 <meta name="twitter:data1" content="Alex Cornici"> 153 <meta name="twitter:site" content="@thetraveler_org"> 154 <meta property="og:image:width" content="1200"> 155 <meta property="og:image:height" content="745"> 156 157
157<script type="application/ld+json"> 158{ 159 "@context": "https://schema.org", 160 "@type": "Article", 161 "publisher": { 162 "@type": "Organization", 163 "name": "The Traveler", 164 "url": "https://www.thetraveler.org/", 165 "logo": { 166 "@type": "ImageObject", 167 "url": "https://storage.ghost.io/c/af/2f/af2f1cc4-cdb2-43b2-8f1c-19528fe4b50c/content/images/2026/08/logo-1.png" 168 } 169 }, 170 "author": { 171 "@type": "Person", 172 "name": "Alex Cornici", 173 "image": { 174 "@type": "ImageObject", 175 "url": "https://storage.ghost.io/c/af/2f/af2f1cc4-cdb2-43b2-8f1c-19528fe4b50c/content/images/2024/08/alex-profile.jpg", 176 "width": 463, 177 "height": 461 178 }, 179 "url": "https://www.thetraveler.org/author/alex/", 180 "sameAs": [ 181 "https://bsky.app/profile/alexcornici.bsky.social", 182 "https://www.linkedin.com/in/alexcornici" 183 ] 184 }, 185 "headline": "About", 186 "url": "https://www.thetraveler.org/about/", 187 "datePublished": "2024-02-27T16:45:24.000Z", 188 "dateModified": "2025-11-11T04:17:31.000Z", 189 "description": "The Traveler is a global hub of travel knowledge built for readers who want to understand the world in full context.\nEach guide is researched in depth, written with care, and designed to show how destinations truly live, change, and connect.\n\nWe combine storytelling and research to create travel content that goes beyond highlights and headlines. From cultural districts and architecture to local traditions and natural spaces, every article helps you see the layers behind each place.\n\nThe Traveler", 190 "mainEntityOfPage": "https://www.thetraveler.org/about/" 191} 192 </script>
192 193 194 <meta name="generator" content="Ghost 6.65"> 195 <link rel="alternate" type="application/rss+xml" title="The Traveler" href="https://www.thetraveler.org/rss/"> 196
196<script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.71/umd/portal.min.js" data-i18n="true" data-ghost="https://www.thetraveler.org/" data-key="51bfddc7c3915fb10d2c789f29" data-api="https://the-traveler.ghost.io/ghost/api/content/" data-locale="en" crossorigin="anonymous"></script>
196<style id="gh-members-styles">.gh-post-upgrade-cta-content, 197.gh-post-upgrade-cta { 198 display: flex; 199 flex-direction: column; 200 align-items: center; 201 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 202 text-align: center; 203 width: 100%; 204 color: #ffffff; 205 font-size: 16px; 206} 207 208.gh-post-upgrade-cta-content { 209 border-radius: 8px; 210 padding: 40px 4vw; 211} 212 213.gh-post-upgrade-cta h2 { 214 color: #ffffff; 215 font-size: 28px; 216 letter-spacing: -0.2px; 217 margin: 0; 218 padding: 0; 219} 220 221.gh-post-upgrade-cta p { 222 margin: 20px 0 0; 223 padding: 0; 224} 225 226.gh-post-upgrade-cta small { 227 font-size: 16px; 228 letter-spacing: -0.2px; 229} 230 231.gh-post-upgrade-cta a { 232 color: #ffffff; 233 cursor: pointer; 234 font-weight: 500; 235 box-shadow: none; 236 text-decoration: underline; 237} 238 239.gh-post-upgrade-cta a:hover { 240 color: #ffffff; 241 opacity: 0.8; 242 box-shadow: none; 243 text-decoration: underline; 244} 245 246.gh-post-upgrade-cta a.gh-btn { 247 display: block; 248 background: #ffffff; 249 text-decoration: none; 250 margin: 28px 0 0; 251 padding: 8px 18px; 252 border-radius: 4px; 253 font-size: 16px; 254 font-weight: 600; 255} 256 257.gh-post-upgrade-cta a.gh-btn:hover { 258 opacity: 0.92; 259}</style> 260
260<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/sodo-search.min.js" data-key="51bfddc7c3915fb10d2c789f29" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://the-traveler.ghost.io/" data-locale="en" crossorigin="anonymous"></script>
260 261 262 <link href="https://www.thetraveler.org/webmentions/receive/" rel="webmention"> 263
263<script defer src="/public/cards.min.js?v=ShRHxgy4po8zN-Wf"></script>
263 264 <link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=WwnU9jw5ancNC8Gc"> 265
265<script defer src="/public/member-attribution.min.js?v=AKG4hWena9j3yX3I"></script>
265 266
266<script defer src="/public/ghost-stats.min.js?v=vFcCUf6ZQ0Hyhc8h" data-stringify-payload="false" data-datasource="analytics_events" data-storage="localStorage" data-host="https://www.thetraveler.org/.ghost/analytics/api/v1/page_hit" tb_site_uuid="af2f1cc4-cdb2-43b2-8f1c-19528fe4b50c" tb_post_uuid="4b24cef2-d8dc-4fce-b29a-987f61449f07" tb_post_type="page" tb_member_uuid="undefined" tb_member_status="undefined" tb_gift_link=""></script>
266<style>:root {--ghost-accent-color: #1a87d0;}</style> 267 <meta name="bm-site-verification" content="cd59e8e3ca031ee9d8a2d44f7b17e98d4fbeccf3">
268<script data-cfasync="false" src="https://cmp.gatekeeperconsent.com/min.js"></script>
vendor: 1 bytes, line 268
268
269<script data-cfasync="false" src="https://the.gatekeeperconsent.com/cmp.min.js"></script>
269 270
271<script async src="//www.ezojs.com/ezoic/sa.min.js"></script>
vendor: 1 bytes, line 271
271
272<script> 273 window.ezstandalone = window.ezstandalone || {}; 274 ezstandalone.cmd = ezstandalone.cmd || []; 275</script>
vendor: 1 bytes, line 275
275
276<script src="//ezoicanalytics.com/analytics.js"></script>
276 277
278<script> 279 window.ezstandalone = window.ezstandalone || {}; 280 ezstandalone.cmd = ezstandalone.cmd || []; 281ezstandalone.cmd.push(function () { 282 ezstandalone.showAds(101); 283 }); 284</script>
284 285 286<meta name="ezoic-site-verification" content="aqWFfvmDDaUCmms5il1qTgY8oLCHEH" /> 287 288 289<!-- Allow ad engines to measure/insert inside the article & avoid clipping --> 290<style> 291/* Core article containers */ 292.entry-content, 293.post-content, 294.gh-content, 295.ghost-content, /* keep for safety on older posts */ 296.content-framed { 297 contain: none !important; 298 content-visibility: visible !important; 299 overflow: visible !important; 300} 301 302/* If theme uses data-no-overflow, force it to allow ads */ 303.ghost-content[data-no-overflow], 304.gh-content[data-no-overflow]{ 305 overflow: visible !important; 306 contain: none !important; 307 content-visibility: visible !important; 308} 309 310/* Ensure parents don't clip ad iframes */ 311.content-framed, 312.post-main, 313.max-w-content { 314 overflow: visible !important; 315} 316 317/* Prevent clipping + allow full-width iframes inside article */ 318.gh-content, 319.article-body, 320.js-article-body { overflow: visible !important; } 321 322.in-article-anchor iframe { 323 display: block; 324 width: 100%; 325 max-width: 100%; 326} 327</style> 328 329<meta name="robots" content="max-image-preview:large"> 330
331<script> 332(function () { 333 window.dataLayer = window.dataLayer || []; 334 335 window.gtag = function () { 336 dataLayer.push(arguments); 337 }; 338 339 function loadGoogleAnalytics() { 340 if (window.__gaLoaded) return; 341 window.__gaLoaded = true; 342 343 var script = document.createElement('script'); 344 script.async = true; 345 script.src = 'https://www.googletagmanager.com/gtag/js?id=G-F41E6MX1GV'; 346 document.head.appendChild(script); 347 348 gtag('js', new Date()); 349 gtag('config', 'G-F41E6MX1GV'); 350 } 351 352 window.addEventListener('load', function () { 353 if ('requestIdleCallback' in window) { 354 requestIdleCallback(loadGoogleAnalytics, { timeout: 2000 }); 355 } else { 356 setTimeout(loadGoogleAnalytics, 1000); 357 } 358 }); 359})(); 360</script>
360 361 362<!-- Sticky sidebar --> 363<style> 364.sidebar { height: auto; position: sticky; top: 5rem; } 365</style> 366 367<!-- Simple referrer blocker / redirect -->
368<script> 369document.addEventListener('DOMContentLoaded', function() { 370 var blockedReferrers = ['trafficpeak.io', 'trafficheap.com', 'trafficheap.cc']; 371 var referrer = document.referrer || ''; 372 if (blockedReferrers.some(function(domain){ return referrer.includes(domain); })) { 373 window.location.href = 'https://www.thetraveler.org/resource-intensive-page/'; 374 } 375}); 376</script>
376 377 378<!-- Pinterest verify --> 379<meta name="p:domain_verify" content="d4849b7bb2c2e9c7852dee674fa89627"/> 380 381<!-- Ahrefs analytics -->
382<script src="https://analytics.ahrefs.com/analytics.js" data-key="PylJ3M54T9ai4wPhHooKkw" async></script>
382 383 384<!-- Post layout grid --> 385<style> 386.post-shell{display:grid;grid-template-columns:1fr;gap:2rem} 387@media (min-width:1024px){ 388 .post-shell{grid-template-columns:minmax(0,1fr) 320px;align-items:start} 389 .post-aside{position:sticky;top:6rem} 390} 391.post-main{min-width:0} 392</style> 393 394<!-- TOC styling --> 395<style> 396#toc-card .toc-list ul{margin:0;padding:0} 397#toc-card .toc-list li{margin:.25rem 0;line-height:1.5} 398#toc-card .toc-list > ul{list-style: disc; padding-left: 1.25rem;} 399#toc-card .toc-list > ul > li > ul{list-style: circle; padding-left: 1.1rem;} 400#toc-card .toc-list .toc-level-3 > a{font-size:.95em; opacity:.9} 401#toc-card .toc-list a{text-decoration:none;border-bottom:1px dashed transparent} 402#toc-card .toc-list a:hover{border-bottom-color:currentColor} 403#toc-card .toc-details>summary{list-style:none} 404#toc-card .toc-details>summary::-webkit-details-marker{display:none} 405#toc-card .toc-details>summary::after{content:'â¾';float:right;transition:transform .2s} 406#toc-card .toc-details[open]>summary::after{transform:rotate(180deg)} 407@media (max-width:640px){#toc-card{padding:.75rem}} 408</style> 409 410<!-- Affiliate disclaimer styles --> 411<style> 412.post-template .ads-disclaimer, 413.post-template .prose .ads-disclaimer{ 414 font-size:.80em; line-height:1.45; font-style:italic; color:#555; 415 margin:0 0 12px; padding:0 0 10px; border-bottom:1px solid #e5e5e5; 416} 417.post-template .ads-disclaimer a{ font-style:normal; text-decoration:underline; text-underline-offset:2px; } 418html[data-color-scheme="dark"] .post-template .ads-disclaimer{ color:#bbb; border-bottom-color:#333; } 419</style> 420 421<!-- Content framing + mobile tweaks --> 422<style> 423.post-template .content-framed{ border:0; padding-left:0; padding-right:0 } 424@media (max-width:640px){ 425 .post-template .post-shell{ padding-left:0!important; padding-right:0!important } 426 .post-template .post-main > .max-w-content{ max-width:none!important; width:100% } 427 .post-template .gh-content.prose{ max-width:none; width:100%; padding-left:0; padding-right:0 } 428 .post-template .content-framed{ border:0; padding-left:0; padding-right:0 } 429} 430@media (min-width:1024px){ 431 .post-template .content-framed{ 432 border-left:1px solid var(--brd,#e5e5e5); 433 border-right:1px solid var(--brd,#e5e5e5); 434 padding-left:12px; padding-right:12px 435 } 436 html[data-color-scheme="dark"] .post-template .content-framed{ border-color:#333 } 437} 438</style> 439 440<!-- Mobile spacing for disclaimer + TOC --> 441<style> 442@media (max-width:640px){ 443 .post-template .ads-disclaimer{ margin-left:12px!important; margin-right:12px!important } 444 .post-template #toc-card{ margin-left:12px!important; margin-right:12px!important } 445} 446</style> 447 448<!-- Mobile: add side space to the sidebar only --> 449<style> 450@media (max-width:640px){ 451 .post-template .post-aside{ padding-left:12px; padding-right:12px } 452} 453</style> 454 455<!-- Hide subscribe card on HOME (mobile) --> 456<style> 457@media (max-width:640px){ 458 .home-template [data-sidebar-subscribe]{ display:none!important } 459} 460</style> 461 462<!-- Hide HOME H2 above subscribe card --> 463<style> 464@media (max-width:640px){ 465 .home-template h2.uppercase.font-semibold.text-sm.mb-2:has(+ [data-sidebar-subscribe]){ display:none!important } 466} 467</style> 468 469<!-- Dark-mode logo list inversion --> 470<style> 471 [data-color-scheme="dark"] [data-logo-list] { filter: invert(1); } 472</style> 473 474<!-- Socials guard -->
475<script> 476 window.socials = window.socials || {}; 477 window.socials.bluesky = 'https://bsky.app/profile/alexcornici.bsky.social'; 478</script>
478 479 480<!-- External links: open in new tab, safe rel (includes .gh-content) -->
481<script> 482document.addEventListener("DOMContentLoaded", function () { 483 var scopes = document.querySelectorAll( 484 'header a, nav a, main a, footer a, .gh-content a, .ghost-content a' 485 ); 486 487 scopes.forEach(function(link){ 488 try { 489 if (link.closest('[data-ad], .ad, [class*="ad-"], [id^="mv-"], [class*="mediavine"]')) return; 490 491 var href = link.getAttribute('href') || ''; 492 if (!href) return; 493 494 var isExternal = link.hostname && link.hostname !== location.hostname; 495 if (!isExternal) return; 496 497 link.setAttribute('target', '_blank'); 498 499 var current = (link.getAttribute('rel') || '').split(/\s+/).filter(Boolean); 500 var rel = new Set(current); 501 rel.add('noopener'); rel.add('noreferrer'); 502 503 var isDoFollow = link.hasAttribute('data-dofollow'); 504 if (!isDoFollow && !rel.has('sponsored')) rel.add('nofollow'); 505 506 link.setAttribute('rel', Array.from(rel).join(' ')); 507 } catch(e){} 508 }); 509}); 510</script>
510 511 512
513<script data-noptimize="1" data-cfasync="false" data-wpfc-render="false"> 514 (function () { 515 var script = document.createElement("script"); 516 script.async = 1; 517 script.src = 'https://tp-em.com/MzA4MTMx.js?t=308131'; 518 document.head.appendChild(script); 519 })(); 520</script>
520 521 522<!-- ======== /SITE HEADER INJECTION ======== --> 523 524<meta name="p:domain_verify" content="85abf7122b5d5741b5769f267de7f480"/> 525 526<style> 527p + ul { 528 margin-top: 0; 529} 530</style> 531 532<meta name="google-site-verification" content="ohf5O_7Nj9rFk2x064c490hoQbx8wxzPNq8WxWUyAj8" /> 533 534<style> 535/* ===== More news block ===== */ 536 537.news-more { 538 margin: 18px 0 26px; 539 padding-bottom: 12px; 540 border-bottom: 1px solid rgba(0,0,0,.06); 541} 542 543.news-more__label { 544 margin: 0 0 8px; 545 font-size: 12px; 546 letter-spacing: .04em; 547 text-transform: uppercase; 548 opacity: .7; 549} 550 551.news-more__list { 552 margin: 0; 553 padding-left: 18px; 554} 555 556.news-more__item { 557 margin: 6px 0; 558 line-height: 1.35; 559} 560 561/* ===== Link styling with strong selectors ===== */ 562 563.prose .news-more__link, 564.entry-content .news-more__link, 565.post-content .news-more__link { 566 color: inherit !important; 567 text-decoration-line: underline; 568 text-decoration-thickness: 0.8px !important; 569 text-underline-offset: 2px; 570 text-decoration-color: currentColor; 571 -webkit-text-fill-color: currentColor; 572} 573 574.prose .news-more__link:hover, 575.entry-content .news-more__link:hover, 576.post-content .news-more__link:hover { 577 text-decoration-thickness: 1.4px !important; 578} 579</style> 580 581<style> 582/* ===== Smart related guides block ===== */ 583 584.related-guides { 585 margin: 18px 0 26px; 586 padding-bottom: 12px; 587 border-bottom: 1px solid rgba(0,0,0,.06); 588} 589 590.related-guides__label { 591 margin: 0 0 8px; 592 font-size: 12px; 593 letter-spacing: .04em; 594 text-transform: uppercase; 595 opacity: .7; 596} 597 598.related-guides__list { 599 margin: 0; 600 padding-left: 18px; 601} 602 603.related-guides__item { 604 margin: 6px 0; 605 line-height: 1.35; 606} 607 608/* Strong selectors so theme prose styles donât override */ 609 610.prose .related-guides__link, 611.entry-content .related-guides__link, 612.post-content .related-guides__link { 613 color: inherit !important; 614 text-decoration-line: underline; 615 text-decoration-thickness: 0.8px !important; 616 text-underline-offset: 2px; 617 text-decoration-color: currentColor; 618 -webkit-text-fill-color: currentColor; 619} 620 621.prose .related-guides__link:hover, 622.entry-content .related-guides__link:hover, 623.post-content .related-guides__link:hover { 624 text-decoration-thickness: 1.4px !important; 625} 626</style> 627 628<style> 629 630/* Hide the dynamically generated favicon Ghost loads */ 631.kg-bookmark-icon { 632 display: none; 633} 634 635/* Align metadata nicely */ 636.kg-bookmark-metadata { 637 display: flex; 638 align-items: center; 639} 640 641/* Insert a static icon instead of Ghost-generated ones */ 642.kg-bookmark-metadata::before { 643 content: ""; 644 display: inline-block; 645 width: 16px; 646 height: 16px; 647 margin-right: 6px; 648 background-image: url("/content/images/icon/ico.svg"); 649 background-size: contain; 650 background-repeat: no-repeat; 651 background-position: center; 652 flex-shrink: 0; 653} 654 655</style> 656 657<style> 658.google-news-link { 659 display: inline-flex; 660 align-items: center; 661 gap: 6px; 662 font-size: 13px; 663 font-weight: 600; 664 color: inherit !important; 665 text-decoration: underline; 666} 667 668.google-news-link img { 669 width: 16px; 670 height: 16px; 671 object-fit: contain; 672 display: block; 673} 674</style> 675 </head> 676 <body class="page-template page-about subpixel-antialiased relative overflow-x-hidden bg-bgr text-typ" 677 x-data="{ menuOpen: false }" :class="menuOpen ? 'overflow-hidden' : 'overflow-y-auto'" 678 data-user="visitor" 679 @keydown.escape="menuOpen = false" @keydown.cmk.k="document.querySelector('[data-ghost-search]').click()" 680 x-init="navigator.platform.includes('Win') && document.body.classList.add('is-win')" 681 > 682 <a class="sr-only" href="#main">Skip to content</a> 683 684 685 <header class="site-header sticky top-0 z-1100 px-5 sm:px-6 bg-bgr text-typ whitespace-nowrap text-sm" data-header> 686 <div class="max-w-container mx-auto py-4 md:py-6 flex items-center justify-center gap-2 relative"> 687 688 <div class="flex-1 flex justify-start" data-header-brand> 689 <a href="https://www.thetraveler.org" aria-label="The Traveler" data-brand> 690 <img 691 src="https://storage.ghost.io/c/af/2f/af2f1cc4-cdb2-43b2-8f1c-19528fe4b50c/content/images/2026/08/logo-1.png" 692 width="195" 693 height="28" 694 alt="The Traveler" 695 loading="eager" 696 decoding="async" 697 fetchpriority="low" 698 class="site-logo-light h-(--logo-h-mobile) w-(--logo-w-mobile) md:h-(--logo-h-desktop) md:w-(--logo-w-desktop)" 699 /> 700 701 <img 702 src="https://storage.ghost.io/c/af/2f/af2f1cc4-cdb2-43b2-8f1c-19528fe4b50c/content/images/2026/08/logo-dark.png" 703 width="195" 704 height="28" 705 alt="The Traveler" 706 loading="eager" 707 decoding="async" 708 fetchpriority="low" 709 class="site-logo-dark h-(--logo-h-mobile) w-(--logo-w-mobile) md:h-(--logo-h-desktop) md:w-(--logo-w-desktop)" 710 /> 711 712 <style> 713 /* Light mode */ 714 .site-logo-light { 715 display: block; 716 } 717 718 .site-logo-dark { 719 display: none; 720 } 721 722 /* Dark mode */ 723 html[data-color-scheme="dark"] .site-logo-light { 724 display: none; 725 } 726 727 html[data-color-scheme="dark"] .site-logo-dark { 728 display: block; 729 } 730 </style> 731 </a> 732 </div> 733 734 <nav class="relative hidden md:flex justify-center" data-nav="header"> 735 <ul class="flex gap-0.5"> 736 <li class="nav-home flex items-center relative hover:bg-bgr-tone rounded-btn" 737 data-label="Home" data-slug="home" data-length="4"> 738 <a class="w-full flex px-4 py-2 rounded-btn" href="https://www.thetraveler.org/" 739 >
740 <span>Home</span> 741 </a> 742 </li> 743 <li class="nav-the-network flex items-center relative hover:bg-bgr-tone rounded-btn" 744 data-label="The Network" data-slug="the-network" data-length="11"> 745 <a class="w-full flex px-4 py-2 rounded-btn" href="https://www.thetraveler.org/network/" 746 > 747 <span>The Network</span> 748 </a> 749 </li> 750 <li class="nav-contact flex items-center relative hover:bg-bgr-tone rounded-btn" 751 data-label="Contact" data-slug="contact" data-length="7"> 752 <a class="w-full flex px-4 py-2 rounded-btn" href="mailto:[email protected]" 753 > 754 <span>Contact</span> 755 </a> 756 </li> 757</ul> 758 </nav> 759 760 <div class="flex gap-1 md:gap-2 items-center" data-header-actions> 761 <button class="flex gap-0.5 p-0.5 border border-brd text-typ-tone rounded-btn hover:bg-bgr-tone" aria-label="Toggle color scheme" 762 data-color-scheme-toggle @click="toggleColorScheme(event)"> 763 <span data-theme="light" class="px-1.5 py-[3px] opacity-50 rounded-btn"> 764 <i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-sun size-4 stroke-2" role="presentation"> 765 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-sun-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 766 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 767 <path d="M12 19a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> 768 <path d="M18.313 16.91l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.218 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> 769 <path d="M7.007 16.993a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> 770 <path d="M4 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> 771 <path d="M21 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> 772 <path d="M6.213 4.81l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.217 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> 773 <path d="M19.107 4.893a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> 774 <path d="M12 2a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> 775 <path d="M12 7a5 5 0 1 1 -4.995 5.217l-.005 -.217l.005 -.217a5 5 0 0 1 4.995 -4.783z" stroke-width="0" fill="currentColor" /> 776</svg> 777</i> </span> 778 <span data-theme="dark" class="px-1.5 py-[3px] opacity-50 rounded-btn"> 779 <i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-moon size-4 stroke-2" role="presentation"> 780 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-moon-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 781 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 782 <path d="M12 1.992a10 10 0 1 0 9.236 13.838c.341 -.82 -.476 -1.644 -1.298 -1.31a6.5 6.5 0 0 1 -6.864 -10.787l.077 -.08c.551 -.63 .113 -1.653 -.758 -1.653h-.266l-.068 -.006l-.06 -.002z" stroke-width="0" fill="currentColor" /> 783</svg> 784</i> </span> 785</button> 786 <button class="flex items-center justify-center rounded-full size-8 md:size-9 hover:bg-bgr-tone cursor-pointer" 787 data-ghost-search 788 title="Search" 789 aria-label="Search"> 790 <i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-search w-5 h-5 stroke-2 fill-bgr-tone [&>svg]:fill-inherit stroke-2" role="presentation"> 791 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-search" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 792 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 793 <circle cx="10" cy="10" r="7" /> 794 <line x1="21" y1="21" x2="15" y2="15" /> 795</svg> 796 797 798 799</i> </button> 800 801 802 <button class="flex flex-col items-center gap-1 size-8 p-1 md:p-2 md:size-9 justify-center rounded-full group md:hidden transition-transform hover:bg-bgr-tone" 803 data-menu-toggle aria-label="Menu toggle" aria-expanded="false" aria-haspopup="true" aria-controls="menu" 804 @click="menuOpen = !menuOpen" :aria-expanded="menuOpen.toString()">
805 <span class="relative pointer-events-none h-0.5 rounded-xs bg-typ-tone w-4 transition-transform" 806 :class="menuOpen ? 'rotate-45 translate-y-[3px]' : ''"></span> 807 <span class="relative pointer-events-none h-0.5 rounded-xs bg-typ-tone w-4 transition-transform" 808 :class="menuOpen ? '-rotate-45 -translate-y-[3px]' : ''"></span> 809 </button> 810 811 <a href="/subscribe/" data-portal="subscribe" data-header-subscribe 812 class="hidden sm:flex items-center gap-1 bg-brand font-medium text-brand-contrast px-4 py-1.5 rounded-btn md:px-5 md:py-2 transition hover:ring-[3px] hover:ring-brand/20"> 813 <span>Subscribe</span> 814 </a> 815 </div> 816 817 </div> 818</header> 819 820 <div class="sticky shadow-xl z-100 top-[64px] md:top-[84px] w-full text-sm bg-bgr text-typ-tone py-4 border-t border-brd hidden md:hidden!" 821 :class="menuOpen ? 'block!' : 'hidden'" data-menu id="menu" 822> 823 <div class="px-5 sm:px-6 flex flex-col gap-3 items-start"> 824 <nav class="font-medium" data-nav="mobile"> 825 <ul class="flex flex-col gap-1"> 826 <li class="nav-home flex flex-wrap relative" 827 data-label="Home" data-slug="home" data-length="4"> 828 <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.thetraveler.org/" 829 > 830 <span>Home</span> 831 </a> 832 </li> 833 <li class="nav-the-network flex flex-wrap relative" 834 data-label="The Network" data-slug="the-network" data-length="11"> 835 <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.thetraveler.org/network/" 836 > 837 <span>The Network</span> 838 </a> 839 </li> 840 <li class="nav-contact flex flex-wrap relative" 841 data-label="Contact" data-slug="contact" data-length="7"> 842 <a class="flex py-0.5 rounded-theme hover:text-brand" href="mailto:[email protected]" 843 > 844 <span>Contact</span> 845 </a> 846 </li> 847</ul> 848 </nav> 849 850 <a href="/subscribe/" data-portal="subscribe" 851 class="flex sm:hidden items-center gap-1 bg-brand font-medium text-brand-contrast px-4 py-1.5 rounded-btn md:px-5 md:py-2 transition hover:ring-[3px] hover:ring-brand/20"> 852 <span>Subscribe</span> 853 </a> 854 </div> 855</div> 856 <main class="main" id="main" data-class="font-mono font-serif font-sans"> 857 858 <section class="px-5 sm:px-6 mb-6" data-page-hero> 859 <div class="max-w-2xl py-16 mx-auto flex flex-col gap-4 md:gap-8"> 860 <div class="text-center max-w-content mx-auto flex items-center flex-1 flex-col gap-4 md:gap-6 justify-center items-center text-center"> 861 <h1 class="font-semibold tracking-tight text-2xl sm:text-3xl md:font-medium md:text-4xl lg:text-5xl">About</h1> 862 </div> 863 </div> 864 </section> 865 866 <article class="post no-image ghost-content prose md:prose-lg prose-theme"> 867 <p>The Traveler is a global hub of travel knowledge built for readers who want to understand the world in full context.<br>Each guide is researched in depth, written with care, and designed to show how destinations truly live, change, and connect.</p><p>We combine storytelling and research to create travel content that goes beyond highlights and headlines. From cultural districts and architecture to local traditions and natural spaces, every article helps you see the layers behind each place.</p><p>The Traveler is independent and growing city by city, country by country. It is an ever-expanding atlas shaped by curiosity and accuracy.</p><p>Subscribe to explore new destinations as theyâre published and stay connected with a community that values depth, authenticity, and discovery.</p><p><strong>Office Location</strong>:</p><p>Olbia, 07026 Province of Sassari, Italy</p><hr> 868 </article> 869 870 </main> 871 872
872<script> 873if ('fonts' in document) { 874 document.fonts.ready.then(function(){ document.documentElement.classList.add('fonts-ready'); }); 875} 876</script>
876 877 878 879 <footer class="px-5 sm:px-6 bg-bgr-tone mt-16 sm:bg-bgr " data-footer> 880 <div class="max-w-container mx-auto"> 881 <div class="relative overflow-hidden flex flex-col items-center gap-6 bg-bgr-tone rounded-theme py-12 sm:px-8" data-footer-top> 882 <div class="flex flex-col items-center text-center gap-3 max-w-md" data-footer-brand> 883 <a href="https://www.thetraveler.org" data-brand> 884 <img 885 src="https://storage.ghost.io/c/af/2f/af2f1cc4-cdb2-43b2-8f1c-19528fe4b50c/content/images/2026/08/logo-1.png" 886 width="195" 887 height="28" 888 alt="The Traveler" 889 loading="lazy" 890 decoding="" 891 fetchpriority="" 892 class="site-logo-light h-(--logo-h-mobile) w-(--logo-w-mobile) md:h-(--logo-h-desktop) md:w-(--logo-w-desktop)" 893 /> 894 895 <img 896 src="https://storage.ghost.io/c/af/2f/af2f1cc4-cdb2-43b2-8f1c-19528fe4b50c/content/images/2026/08/logo-dark.png" 897 width="195" 898 height="28" 899 alt="The Traveler" 900 loading="lazy" 901 decoding="" 902 fetchpriority="" 903 class="site-logo-dark h-(--logo-h-mobile) w-(--logo-w-mobile) md:h-(--logo-h-desktop) md:w-(--logo-w-desktop)" 904 /> 905 906 <style> 907 /* Light mode */ 908 .site-logo-light { 909 display: block; 910 } 911 912 .site-logo-dark { 913 display: none; 914 } 915 916 /* Dark mode */ 917 html[data-color-scheme="dark"] .site-logo-light { 918 display: none; 919 } 920 921 html[data-color-scheme="dark"] .site-logo-dark { 922 display: block; 923 } 924 </style> 925 </a> 926 927 <p id="footer-label" class="text-typ-tone mb-2">A Global Hub of Travel Knowledge</p> 928 929 <form class="group relative flex flex-col items-start w-full max-w-sm" data-members-form="subscribe" data-style="" > 930 931 <fieldset class="w-full bg-bgr border border-brd flex flex-wrap rounded-btn bg-bgr p-[5px] focus-within:border-brand focus-within:ring-4 focus-within:ring-brand/20 text-sm"> 932 <legend class="sr-only">Subscribe form</legend> 933 934 935 <input data-members-email class="text-sm bg-bgr text-typ flex-2 py-2 rounded-btn border-none focus:ring-0" 936 type="email" autocomplete="email" placeholder="Your email address" 937 aria-label="Your email address" required aria-required="true"/> 938 939 <button class="flex-1 px-4 py-2 bg-brand text-brand-contrast font-medium rounded-btn md:px-6 hover:ring-[3px] hover:ring-brand/20 cursor-pointer" type="submit" > 940 <span class="hidden group-[.loading]:flex items-center justify-center"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-loader size-5 [&_svg]:animate-spin stroke-2 stroke-2" role="presentation"> 941 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-loader-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3a9 9 0 1 0 9 9" /></svg> 942</i></span> 943 <span class="group-[.loading]:hidden">Subscribe</span> 944 </button> 945 </fieldset> 946 947 948 <div data-notification class="absolute z-1000 opacity-0 invisible group-[.success]:opacity-100 group-[.success]:visible group-[.success]:translate-y-0 group-[.error]:opacity-100 group-[.error]:visible group-[.error]:translate-y-0 left-0 -bottom-16 text-sm text-left font-medium leading-none flex items-center w-full max-w-md rounded-[6px] gap-2 bg-white text-black p-2 transition-all -translate-y-4 shadow-notification"> 949 <div class="hidden group-[.success]:flex items-center gap-2 flex-1"> 950 <i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-success size-6 text-success ml-1 stroke-2" role="presentation"> 951 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" class="icon icon-tabler icons-tabler-filled icon-tabler-circle-check"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M17 3.34a10 10 0 1 1 -14.995 8.984l-.005 -.324l.005 -.324a10 10 0 0 1 14.995 -8.336zm-1.293 5.953a1 1 0 0 0 -1.32 -.083l-.094 .083l-3.293 3.292l-1.293 -1.292l-.094 -.083a1 1 0 0 0 -1.403 1.403l.083 .094l2 2l.094 .083a1 1 0 0 0 1.226 0l.094 -.083l4 -4l.083 -.094a1 1 0 0 0 -.083 -1.32z" /></svg> 952</i> <p>Great! Check your inbox and click the link.</p> 953 </div> 954 <div class="hidden group-[.error]:flex items-center gap-2 flex-1"> 955 <i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-error size-6 text-error ml-1 stroke-2" role="presentation"> 956 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" class="icon icon-tabler icons-tabler-filled icon-tabler-exclamation-circle"><path stroke="none" d="M0 0h24v24H0z" fill="none"/>
956<path d="M17 3.34a10 10 0 1 1 -15 8.66l.005 -.324a10 10 0 0 1 14.995 -8.336m-5 11.66a1 1 0 0 0 -1 1v.01a1 1 0 0 0 2 0v-.01a1 1 0 0 0 -1 -1m0 -7a1 1 0 0 0 -1 1v4a1 1 0 0 0 2 0v-4a1 1 0 0 0 -1 -1" /></svg> 957</i> <p>Sorry, something went wrong. Please try again.</p> 958 </div> 959 <button type="button" class="flex items-center justify-center size-8 opacity-25 hover:opacity-50 cursor-pointer" 960 @click="$el.parentNode.classList.add('opacity-0', 'invisible', '-translate-y-4');$el.parentNode.parentNode.classList.remove('success', 'error')"> 961 <i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-ghost-close size-4 stroke-2" role="presentation"> 962 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="gh-portal-closeicon" alt="Close" data-testid="close-popup"><defs><style>.a{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.2px !important;}</style></defs><path class="a" d="M.75 23.249l22.5-22.5M23.25 23.249L.75.749"></path></svg> 963</i> </button> 964 </div> 965 966 </form> 967 </div> 968 969 <hr class="border-none h-[1px] w-full max-w-xs my-2 bg-linear-to-r from-transparent via-brd to-transparent"/> 970 971 <nav class="" data-footer-nav="secondary"> 972 <ul class="relative flex flex-wrap items-center justify-center gap-3 text-typ text-sm z-10"> 973 <li class="nav-about nav-current flex flex-row relative" 974 data-label="About" data-slug="about" data-length="5"> 975 <a class="flex hover:text-typ-tone" href="https://www.thetraveler.org/about/" 976 > 977 <span>About</span> 978 </a> 979 </li> 980 <li class="nav-dmca flex flex-row relative" 981 data-label="DMCA" data-slug="dmca" data-length="4"> 982 <a class="flex hover:text-typ-tone" href="https://www.thetraveler.org/copyright-dmca-trademark-infringement/" 983 > 984 <span>DMCA</span> 985 </a> 986 </li> 987 <li class="nav-privacy-policy flex flex-row relative" 988 data-label="Privacy Policy" data-slug="privacy-policy" data-length="14"> 989 <a class="flex hover:text-typ-tone" href="https://www.thetraveler.org/privacy-policy/" 990 > 991 <span>Privacy Policy</span> 992 </a> 993 </li> 994 <li class="nav-affiliate-policy flex flex-row relative" 995 data-label="Affiliate Policy" data-slug="affiliate-policy" data-length="16"> 996 <a class="flex hover:text-typ-tone" href="https://www.thetraveler.org/affiliate-disclosure-and-policy/" 997 > 998 <span>Affiliate Policy</span> 999 </a> 1000 </li> 1001 <li class="nav-image-policy flex flex-row relative" 1002 data-label="Image Policy" data-slug="image-policy" data-length="12"> 1003 <a class="flex hover:text-typ-tone" href="https://www.thetraveler.org/image-policy-and-disclaimer/" 1004 > 1005 <span>Image Policy</span> 1006 </a> 1007 </li> 1008</ul> 1009 </nav> 1010 1011 1012<nav class="relative flex flex-wrap items-center gap-3 text-typ-tone text-sm z-10" data-socials="footer" x-data="socials"> 1013 1014 <a href="https://www.facebook.com/thetravelernetwork" class="hover:text-typ" aria-label="Facebook"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-facebook size-4 stroke-2 stroke-2" role="presentation"> 1015 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-facebook" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1016 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1017 <path d="M7 10v4h3v7h4v-7h3l1 -4h-4v-2a1 1 0 0 1 1 -1h3v-4h-3a5 5 0 0 0 -5 5v2h-3" /> 1018</svg> 1019 1020 1021 1022</i><span class="hidden">Facebook</span></a> 1023 1024 <a href="https://x.com/thetraveler_org" class="hover:text-typ" aria-label="Twitter"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-x size-4 stroke-2 stroke-2" role="presentation"> 1025 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-x" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1026 <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> 1027 <path d="M4 4l11.733 16h4.267l-11.733 -16z"></path> 1028 <path d="M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772"></path> 1029</svg> 1030</i><span class="hidden">Twitter</span></a> 1031 1032 <a :href="bluesky" :class="bluesky && 'block!'" class="hidden hover:text-typ" aria-label="Bluesky"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-bluesky size-4 stroke-2 stroke-2" role="presentation"> 1033 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-bluesky"> 1034 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1035 <path d="M6.335 5.144c-1.654 -1.199 -4.335 -2.127 -4.335 .826c0 .59 .35 4.953 .556 5.661c.713 2.463 3.13 2.75 5.444 2.369c-4.045 .665 -4.889 3.208 -2.667 5.41c1.03 1.018 1.913 1.59 2.667 1.59c2 0 3.134 -2.769 3.5 -3.5c.333 -.667 .5 -1.167 .5 -1.5c0 .333 .167 .833 .5 1.5c.366 .731 1.5 3.5 3.5 3.5c.754 0 1.637 -.571 2.667 -1.59c2.222 -2.203 1.378 -4.746 -2.667 -5.41c2.314 .38 4.73 .094 5.444 -2.369c.206 -.708 .556 -5.072 .556 -5.661c0 -2.953 -2.68 -2.025 -4.335 -.826c-2.293 1.662 -4.76 5.048 -5.665 6.856c-.905 -1.808 -3.372 -5.194 -5.665 -6.856z" /> 1036</svg> 1037</i><span class="hidden">Bluesky</span></a> 1038 1039 <a :href="discord" :class="discord && 'block!'" class="hidden hover:text-typ" aria-label="Discord"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-discord size-4 stroke-2 stroke-2" role="presentation"> 1040 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-discord"> 1041 <path stroke="none" d="M0 0h24v24H0z" fill="none" /> 1042 <path d="M8 12a1 1 0 1 0 2 0a1 1 0 0 0 -2 0" /> 1043 <path d="M14 12a1 1 0 1 0 2 0a1 1 0 0 0 -2 0" /> 1044 <path d="M15.5 17c0 1 1.5 3 2 3c1.5 0 2.833 -1.667 3.5 -3c.667 -1.667 .5 -5.833 -1.5 -11.5c-1.457 -1.015 -3 -1.34 -4.5 -1.5l-.972 1.923a11.913 11.913 0 0 0 -4.053 0l-.975 -1.923c-1.5 .16 -3.043 .485 -4.5 1.5c-2 5.667 -2.167 9.833 -1.5 11.5c.667 1.333 2 3 3.5 3c.5 0 2 -2 2 -3" /> 1045 <path d="M7 16.5c3.5 1 6.5 1 10 0" /> 1046</svg> 1047</i><span class="hidden">Discord</span></a> 1048 1049 <a :href="github" :class="github && 'block!'" class="hidden hover:text-typ" aria-label="Github"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-github size-4 stroke-2 stroke-2" role="presentation"> 1050 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-github" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
1051 <desc>Download more icon variants from https://tabler-icons.io/i/brand-github</desc> 1052 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1053 <path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /> 1054</svg> 1055 1056 1057 1058</i><span class="hidden">Github</span></a> 1059 1060 <a :href="instagram" :class="instagram && 'block!'" class="hidden hover:text-typ" aria-label="Instagram"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-instagram size-4 stroke-2 stroke-2" role="presentation"> 1061 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-instagram" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1062 <desc>Download more icon variants from https://tabler-icons.io/i/brand-instagram</desc> 1063 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1064 <rect x="4" y="4" width="16" height="16" rx="4" /> 1065 <circle cx="12" cy="12" r="3" /> 1066 <line x1="16.5" y1="7.5" x2="16.5" y2="7.501" /> 1067</svg> 1068 1069 1070 1071</i><span class="hidden">Instagram</span></a> 1072 1073 <a :href="linkedin" :class="linkedin && 'block!'" class="hidden hover:text-typ" aria-label="Linkedin"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-linkedin size-4 stroke-2 stroke-2" role="presentation"> 1074 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-linkedin" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1075 <path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"></path> 1076 <rect x="2" y="9" width="4" height="12"></rect> 1077 <circle cx="4" cy="4" r="2"></circle> 1078</svg> 1079</i><span class="hidden">Linkedin</span></a> 1080 1081 <a :href="mastodon" :class="mastodon && 'block!'" class="hidden hover:text-typ" aria-label="Mastodon"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-mastodon size-4 stroke-2 stroke-2" role="presentation"> 1082 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-mastodon"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M18.648 15.254c-1.816 1.763 -6.648 1.626 -6.648 1.626a18.262 18.262 0 0 1 -3.288 -.256c1.127 1.985 4.12 2.81 8.982 2.475c-1.945 2.013 -13.598 5.257 -13.668 -7.636l-.026 -1.154c0 -3.036 .023 -4.115 1.352 -5.633c1.671 -1.91 6.648 -1.666 6.648 -1.666s4.977 -.243 6.648 1.667c1.329 1.518 1.352 2.597 1.352 5.633s-.456 4.074 -1.352 4.944z" /><path d="M12 11.204v-2.926c0 -1.258 -.895 -2.278 -2 -2.278s-2 1.02 -2 2.278v4.722m4 -4.722c0 -1.258 .895 -2.278 2 -2.278s2 1.02 2 2.278v4.722" /></svg> 1083</i><span class="hidden">Mastodon</span></a> 1084 1085 <a :href="pinterest" :class="pinterest && 'block!'" class="hidden hover:text-typ" aria-label="Pinterest"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-pinterest size-4 stroke-2 stroke-2" role="presentation"> 1086 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-pinterest" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1087 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1088 <line x1="8" y1="20" x2="12" y2="11" /> 1089 <path d="M10.7 14c.437 1.263 1.43 2 2.55 2c2.071 0 3.75 -1.554 3.75 -4a5 5 0 1 0 -9.7 1.7" /> 1090 <circle cx="12" cy="12" r="9" /> 1091</svg> 1092 1093 1094 1095</i><span class="hidden">Pinterest</span></a> 1096 1097 <a :href="reddit" :class="reddit && 'block!'" class="hidden hover:text-typ" aria-label="Reddit"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-reddit size-4 stroke-2 stroke-2" role="presentation"> 1098 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-reddit" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1099 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1100 <path d="M12 8c2.648 0 5.028 .826 6.675 2.14a2.5 2.5 0 0 1 2.326 4.36c0 3.59 -4.03 6.5 -9 6.5c-4.875 0 -8.845 -2.8 -9 -6.294l-1 -.206a2.5 2.5 0 0 1 2.326 -4.36c1.646
1100-1.313 4.026 -2.14 6.674 -2.14z" /> 1101 <path d="M12 8l1 -5l6 1" /> 1102 <circle cx="19" cy="4" r="1" /> 1103 <circle cx="9" cy="13" r=".5" fill="currentColor" /> 1104 <circle cx="15" cy="13" r=".5" fill="currentColor" /> 1105 <path d="M10 17c.667 .333 1.333 .5 2 .5s1.333 -.167 2 -.5" /> 1106</svg> 1107 1108 1109 1110</i><span class="hidden">Reddit</span></a> 1111 1112 <a :href="telegram" :class="telegram && 'block!'" class="hidden hover:text-typ" aria-label="Telegram"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-telegram size-4 stroke-2 stroke-2" role="presentation"> 1113 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-telegram" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1114 <desc>Download more icon variants from https://tabler-icons.io/i/brand-telegram</desc> 1115 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1116 <path d="M15 10l-4 4l6 6l4 -16l-18 7l4 2l2 6l3 -4" /> 1117</svg> 1118 1119 1120 1121</i><span class="hidden">Telegram</span></a> 1122 1123 <a :href="threads" :class="threads && 'block!'" class="hidden hover:text-typ" aria-label="Threads"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-threads size-4 stroke-2 stroke-2" role="presentation"> 1124 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-threads"> 1125 <path stroke="none" d="M0 0h24v24H0z" fill="none" /> 1126 <path d="M19 7.5c-1.333 -3 -3.667 -4.5 -7 -4.5c-5 0 -8 2.5 -8 9s3.5 9 8 9s7 -3 7 -5s-1 -5 -7 -5c-2.5 0 -3 1.25 -3 2.5c0 1.5 1 2.5 2.5 2.5c2.5 0 3.5 -1.5 3.5 -5s-2 -4 -3 -4s-1.833 .333 -2.5 1" /> 1127</svg> 1128</i><span class="hidden">Threads</span></a> 1129 1130 <a :href="tiktok" :class="tiktok && 'block!'" class="hidden hover:text-typ" aria-label="Tiktok"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-tiktok size-4 stroke-2 stroke-2" role="presentation"> 1131 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-tiktok" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1132 <desc>Download more icon variants from https://tabler-icons.io/i/brand-tiktok</desc> 1133 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1134 <path d="M9 12a4 4 0 1 0 4 4v-12a5 5 0 0 0 5 5" /> 1135</svg> 1136 1137 1138 1139</i><span class="hidden">Tiktok</span></a> 1140 1141 <a :href="whatsapp" :class="whatsapp && 'block!'" class="hidden hover:text-typ" aria-label="Whatsapp"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-whatsapp size-4 stroke-2 stroke-2" role="presentation"> 1142 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-whatsapp" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1143 <desc>Download more icon variants from https://tabler-icons.io/i/brand-whatsapp</desc> 1144 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1145 <path d="M3 21l1.65 -3.8a9 9 0 1 1 3.4 2.9l-5.05 .9" /> 1146 <path d="M9 10a0.5 .5 0 0 0 1 0v-1a0.5 .5 0 0 0 -1 0v1a5 5 0 0 0 5 5h1a0.5 .5 0 0 0 0 -1h-1a0.5 .5 0 0 0 0 1" /> 1147</svg> 1148 1149 1150 1151</i><span class="hidden">Whatsapp</span></a> 1152 1153 <a :href="youtube" :class="youtube && 'block!'" class="hidden hover:text-typ" aria-label="Youtube"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-brand-youtube size-4 stroke-2 stroke-2" role="presentation"> 1154 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-youtube" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1155 <desc>Download more icon variants from https://tabler-icons.io/i/brand-youtube</desc> 1156 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1157 <rect x="3" y="5" width="18" height="14" rx="4" /> 1158 <path d="M10 9l5 3l-5 3z" /> 1159</svg> 1160 1161 1162 1163</i><span class="hidden">Youtube</span></a> 1164 1165 <a :href="rss" :class="rss && 'block!'" class="hidden hover:text-typ" aria-label="RSS"><i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-rss size-4 stroke-2 stroke-2" role="presentation"> 1166 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-rss" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1167 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1168 <circle cx="5" cy="19" r="1" /> 1169 <path d="M4 4a16 16 0 0 1 16 16" /> 1170 <path d="M4 11a9 9 0 0 1 9 9" /> 1171</svg> 1172 1173 1174 1175</i><span class="hidden">RSS</span></a> 1176 1177</nav> 1178 1179
1180 <span data-footer-bg class="absolute -bottom-[0.14em] -left-[0.075em] text-center hidden font-semibold sm:block text-[clamp(5rem,4rem+5vw,8rem)] leading-none bg-linear-to-t from-brd to-bgr-tone text-transparent bg-clip-text z-0 opacity-75 whitespace-nowrap">The Traveler</span> 1181 </div> 1182 1183 <div class="py-4 md:py-6 flex flex-wrap justify-center items-center text-center gap-2 relative border-t border-brd sm:border-none" data-footer-bottom> 1184 <div class="text-sm text-typ-tone"> 1185 <span data-footer-date>©2026 <a class="hover:text-typ" href="https://www.thetraveler.org">The Traveler</a>.</span> 1186 </div> 1187 1188 <button class="flex gap-0.5 p-0.5 border border-brd text-typ-tone rounded-btn hover:bg-bgr-tone" aria-label="Toggle color scheme" 1189 data-color-scheme-toggle @click="toggleColorScheme(event)"> 1190 <span data-theme="light" class="px-1.5 py-[3px] opacity-50 rounded-btn"> 1191 <i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-sun size-4 stroke-2" role="presentation"> 1192 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-sun-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1193 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1194 <path d="M12 19a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> 1195 <path d="M18.313 16.91l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.218 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> 1196 <path d="M7.007 16.993a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> 1197 <path d="M4 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> 1198 <path d="M21 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> 1199 <path d="M6.213 4.81l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.217 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> 1200 <path d="M19.107 4.893a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> 1201 <path d="M12 2a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> 1202 <path d="M12 7a5 5 0 1 1 -4.995 5.217l-.005 -.217l.005 -.217a5 5 0 0 1 4.995 -4.783z" stroke-width="0" fill="currentColor" /> 1203</svg> 1204</i> </span> 1205 <span data-theme="dark" class="px-1.5 py-[3px] opacity-50 rounded-btn"> 1206 <i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-moon size-4 stroke-2" role="presentation"> 1207 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-moon-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1208 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1209 <path d="M12 1.992a10 10 0 1 0 9.236 13.838c.341 -.82 -.476 -1.644 -1.298 -1.31a6.5 6.5 0 0 1 -6.864 -10.787l.077 -.08c.551 -.63 .113 -1.653 -.758 -1.653h-.266l-.068 -.006l-.06 -.002z" stroke-width="0" fill="currentColor" /> 1210</svg> 1211</i> </span> 1212</button> </div> 1213 </div> 1214</footer> 1215 1216
1216<script> 1217 (function(){ 1218 var loaded=false, fired=false; 1219 function loadApp(){ 1220 if (loaded) return; loaded=true; 1221 var s=document.createElement('script'); 1222 s.type='module'; 1223 s.src='https://www.thetraveler.org/assets/built/app.js?v=rn7y5L7vvppn7rJM'; 1224 document.body.appendChild(s); 1225 } 1226 ['pointerdown','touchstart','scroll','keydown'].forEach(function(ev){ 1227 window.addEventListener(ev,function(){ if(fired) return; fired=true; loadApp(); }, {once:true, passive:true}); 1228 }); 1229 setTimeout(loadApp, 1500); 1230 })(); 1231 </script>
1231 1232 1233 <template data-toggle-template x-init="renderSubmenus()"> 1234 <button class="ml-1" data-class="rotate-180" title="Menu toggle" aria-label="Menu toggle" 1235 aria-controls="" aria-expanded="false" @click="toggleSubmenu(event)" 1236 > 1237 <i class="icon [&_svg]:h-[inherit] [&_svg]:w-[inherit] [&_svg]:[stroke-width:inherit] icon-chevron-down size-4 stroke-2 stroke-2" role="presentation"> 1238 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-down" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1239 <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> 1240 <polyline points="6 9 12 15 18 9"></polyline> 1241</svg> 1242</i> </button> 1243 </template> 1244
1244<script> 1245 function renderSubmenus() { 1246 const navItems = document.querySelectorAll('[data-nav] li') 1247 const subItems = document.querySelectorAll('.is-subitem') 1248 const mobileClass = "hidden flex flex-col basis-full items-start" 1249 const desktopClass = "z-50 min-w-[calc(100%+24px)] absolute top-0 flex flex-col gap-0.5 shadow-2xl rounded-theme bg-bgr py-2 px-1.5 -ml-2 mt-11 opacity-0 invisible translate-y-1 transition-all" 1250 1251 // Remove '-' signs 1252 subItems.forEach(item => { 1253 const itemName = item.querySelector('a span') 1254 itemName.innerText = itemName.innerText.slice(1) 1255 }); 1256 1257 // Add subitems in place 1258 let subMenu, hasItems 1259 navItems.forEach((item, index) => { 1260 if (item.classList.contains('is-subitem') && !navItems[index - 1].classList.contains('is-subitem')) { 1261 navItems[index - 1].classList.add('is-mainitem'); 1262 navItems[index - 1].setAttribute('x-on:click.outside', 'closeSubmenus(event)') 1263 } 1264 subMenu = item.classList.contains('is-subitem') ? subMenu : document.createElement('ul'); 1265 if (item.classList.contains('is-subitem')) { 1266 subMenu.appendChild(item) 1267 subMenu.setAttribute('data-submenu', '') 1268 subMenu.getAttribute('id') === null ? subMenu.setAttribute('id', navItems[index - 1].getAttribute('data-slug')) : '' 1269 const menuType = subMenu.closest('nav').getAttribute('data-nav') 1270 subMenu.classList = menuType === 'header' ? desktopClass : mobileClass 1271 } else { 1272 item.appendChild(subMenu) 1273 } 1274 }); 1275 1276 const dropdownMenus = document.querySelectorAll('[data-nav] .is-mainitem') 1277 const toggle = document.querySelector('[data-toggle-template]'); 1278 1279 dropdownMenus.forEach(menu => { 1280 const toggleBtn = toggle.content.firstElementChild.cloneNode(true); 1281 toggleBtn.setAttribute('aria-controls', menu.getAttribute('data-slug')) 1282 menu.insertBefore(toggleBtn, menu.children[1]); 1283 }); 1284 } 1285 </script>
1285 1286 1287
1287<script> 1288 window.socials = { 1289 bluesky: '', 1290 discord: '', 1291 github: '', 1292 instagram: '', 1293 linkedin: '', 1294 mastodon: '', 1295 pinterest: '', 1296 reddit: '', 1297 telegram: '', 1298 threads: '', 1299 tiktok: '', 1300 whatsapp: '', 1301 youtube: '', 1302 rss: '/rss' 1303 } 1304 1305 document.addEventListener('alpine:init', () => { 1306 Alpine.data('socials', () => (window.socials)) 1307 }) 1308 </script>
1308 1309 1310 1311
1311<script> 1312document.addEventListener("DOMContentLoaded", function () { 1313 // Scope to your site UI/content; do NOT touch potential ad slots 1314 var scopes = document.querySelectorAll( 1315 'header a, nav a, main a, footer a, .ghost-content a, .gh-content a' 1316 ); 1317 1318 scopes.forEach(function(link){ 1319 try { 1320 // Skip if inside common ad containers 1321 if (link.closest('[data-ad], .ad, [class*="ad-"], [id^="mv-"], [class*="mediavine"]')) return; 1322 1323 var href = link.getAttribute('href') || ''; 1324 if (!href) return; 1325 1326 var isExternal = link.hostname && link.hostname !== location.hostname; 1327 if (!isExternal) return; 1328 1329 // Always open external links in new tab 1330 link.setAttribute('target', '_blank'); 1331 1332 // Merge existing rel with safety tokens; preserve sponsored if present 1333 var current = (link.getAttribute('rel') || '').split(/\s+/).filter(Boolean); 1334 var rel = new Set(current); 1335 rel.add('noopener'); rel.add('noreferrer'); 1336 1337 // Only add nofollow when not explicitly dofollow and not sponsored 1338 var isDoFollow = link.hasAttribute('data-dofollow'); 1339 if (!isDoFollow && !rel.has('sponsored')) rel.add('nofollow'); 1340 1341 link.setAttribute('rel', Array.from(rel).join(' ')); 1342 } catch(e){} 1343 }); 1344}); 1345</script>
1345 1346
1347<script> 1348(function () { 1349 // Only run on post pages tagged "news" 1350 var body = document.body; 1351 if (!body || !body.classList.contains('post-template') || !body.classList.contains('tag-news')) return; 1352 1353 // Helpers 1354 function sel(q){return document.querySelector(q);} 1355 function selAll(q){return document.querySelectorAll(q);} 1356 function meta(name){var el=sel('meta[name="'+name+'"]');return el?el.content||'':'';} 1357 function prop(p){var el=sel('meta[property="'+p+'"]');return el?el.content||'':'';} 1358 function attr(q,a){var el=sel(q);return el?el.getAttribute(a)||'':'';} 1359 1360 // Keywords 1361 var kw = []; 1362 var internalKw = meta('news:keywords'); 1363 if (internalKw && internalKw.trim()) { 1364 internalKw.split(',').forEach(function(k){ 1365 var v=(k||'').trim(); 1366 if (!v) return; 1367 if (/^\s*news\s*$/i.test(v)) return; 1368 if (kw.indexOf(v) === -1) kw.push(v); 1369 }); 1370 } else { 1371 selAll('.tag-list__item, .post-card__tag').forEach(function(el){ 1372 var name=(el.getAttribute('aria-label')||el.textContent||'').trim(); 1373 if (!name) return; 1374 if (/^\s*(news|trending news)\s*$/i.test(name)) return; 1375 if (kw.indexOf(name)===-1) kw.push(name); 1376 }); 1377 } 1378 1379 // Core fields 1380 var headline = prop('og:title') || document.title; 1381 var description = prop('og:description') || meta('description') || ''; 1382 var published = prop('article:published_time') || ''; 1383 var modified = prop('article:modified_time') || published; 1384 var image = prop('og:image') || ''; 1385 var canonical = attr('link[rel="canonical"]','href') || location.href; 1386 var siteName = prop('og:site_name') || 'The Traveler'; 1387 var siteIcon = attr('link[rel="icon"]','href') || ''; 1388 1389 // Author 1390 var author = [{ 1391 "@type": "Person", 1392 "name": "Alex Cornici", 1393 "url": "https://www.thetraveler.org/author/alex/" 1394 }]; 1395 1396 // NewsArticle 1397 var data = { 1398 "@context": "https://schema.org", 1399 "@type": "NewsArticle", 1400 "headline": headline, 1401 "description": description, 1402 "datePublished": published, 1403 "dateModified": modified, 1404 "author": author, 1405 "publisher": { 1406 "@type": "Organization", 1407 "name": siteName, 1408 "logo": siteIcon ? { "@type":"ImageObject", "url": siteIcon } : undefined 1409 }, 1410 "image": image ? [ image ] : undefined, 1411 "mainEntityOfPage": { "@type":"WebPage", "@id": canonical }, 1412 "articleSection": "News" 1413 }; 1414 if (kw.length) data.keywords = kw; 1415 1416 // Clean empties 1417 (function clean(o){ 1418 Object.keys(o).forEach(function(k){ 1419 var v=o[k]; 1420 if (v===''||v==null||(Array.isArray(v)&&v.length===0)) delete o[k]; 1421 else if (typeof v==='object'&&!Array.isArray(v)){clean(v);if(!Object.keys(v).length)delete o[k];} 1422 }); 1423 })(data); 1424 1425 // Inject JSON-LD 1426 var s=document.createElement('script'); 1427 s.type='application/ld+json'; 1428 s.text=JSON.stringify(data); 1429 document.head.appendChild(s); 1430})(); 1431</script>
1431 1432
1433<script> 1434document.addEventListener('DOMContentLoaded', function () { 1435 if (!document.body.classList.contains('post-template')) return; 1436 1437 var article = document.querySelector('.ghost-content'); 1438 var tocCard = document.getElementById('toc-card'); 1439 var tocNav = document.getElementById('post-toc'); 1440 if (!article || !tocCard || !tocNav) return; 1441 1442 var headings = article.querySelectorAll('h2, h3'); 1443 if (!headings.length) { tocCard.style.display = 'none'; return; } 1444 1445 var used = new Set(); 1446 function slugify(s){ 1447 return (s||'').toLowerCase().trim() 1448 .replace(/[^\w\s-]/g,'').replace(/\s+/g,'-').replace(/-+/g,'-').slice(0,60) || 'section'; 1449 } 1450 headings.forEach(function(h){ 1451 if (!h.id) { 1452 var base = slugify(h.textContent), id = base, i = 2; 1453 while (used.has(id) || document.getElementById(id)) id = base + '-' + (i++); 1454 h.id = id; used.add(id); 1455 } 1456 }); 1457 1458 var rootUL = document.createElement('ul'); 1459 var currentUL = rootUL, lastLevel = 2; 1460 headings.forEach(function(h){ 1461 var level = parseInt(h.tagName.substr(1),10); 1462 if (level > lastLevel) { 1463 var newUL = document.createElement('ul'); 1464 var lastLI = currentUL.lastElementChild; 1465 if (lastLI) lastLI.appendChild(newUL); 1466 currentUL = newUL; 1467 } else if (level < lastLevel) { 1468 currentUL = currentUL.parentElement && currentUL.parentElement.closest('ul') ? currentUL.parentElement.closest('ul') : rootUL; 1469 } 1470 lastLevel = level; 1471 1472 var li = document.createElement('li'); 1473 li.className = 'toc-level-' + level; 1474 var a = document.createElement('a'); 1475 a.href = '#' + h.id; 1476 a.textContent = h.textContent.trim(); 1477 li.appendChild(a); 1478 currentUL.appendChild(li); 1479 }); 1480 tocNav.appendChild(rootUL); 1481 1482 var header = document.querySelector('.header'); 1483 var headerOffset = (header ? header.offsetHeight : 80) + 10;
1484 headings.forEach(function(h){ h.style.scrollMarginTop = headerOffset + 'px'; }); 1485 1486 tocNav.addEventListener('click', function(e){ 1487 if (e.target.tagName.toLowerCase() !== 'a') return; 1488 e.preventDefault(); 1489 var id = e.target.getAttribute('href').slice(1); 1490 var el = document.getElementById(id); 1491 if (!el) return; 1492 window.scrollTo({ top: el.getBoundingClientRect().top + window.pageYOffset - headerOffset, behavior: 'smooth' }); 1493 }); 1494}); 1495</script>
1495 1496 1497<style> 1498 [data-color-scheme="dark"] [data-logo-list] { filter: invert(1); } 1499</style> 1500 1501<!-- Guard this so it never throws -->
1502<script> 1503 window.socials = window.socials || {}; 1504 window.socials.bluesky = 'https://bsky.app/profile/alexcornici.bsky.social'; 1505</script>
1505 1506 1507<!-- FORCE in-article anchors (now includes .ghost-content) -->
1508<script> 1509(function () { 1510 function ready(fn){/in/.test(document.readyState)?setTimeout(ready,9,fn):fn();} 1511 1512 ready(function () { 1513 var body = document.querySelector('.ghost-content, .gh-content, .article-body, .js-article-body, #post-content'); 1514 if (!body) return; 1515 var blocks = Array.from(body.querySelectorAll('p, h2, h3, ul, ol, blockquote, figure')); 1516 if (!blocks.length) return; 1517 1518 [2, 6, 10].forEach(function(i, n){ 1519 if (!blocks[i]) return; 1520 var anchor = document.createElement('div'); 1521 anchor.className = 'in-article-anchor growads-anchor'; 1522 anchor.setAttribute('data-ga-slot', 'in-article-' + (n+1)); 1523 anchor.style.minHeight = '1px'; 1524 anchor.style.margin = '20px 0'; 1525 blocks[i].after(anchor); 1526 }); 1527 1528 try { 1529 if (window.growads && typeof window.growads.refresh === 'function') { 1530 window.growads.refresh(); 1531 } else if (window.growads && typeof window.growads.scan === 'function') { 1532 window.growads.scan(); 1533 } 1534 } catch(e){} 1535 }); 1536})(); 1537</script>
1537 1538
1539<script> 1540document.addEventListener('DOMContentLoaded', function() { 1541 document.querySelectorAll('a[href*="tpo.lv"]').forEach(link => { 1542 if (!link.rel.includes('sponsored')) { 1543 link.rel = 'sponsored noreferrer'; 1544 } 1545 if (!link.target || link.target !== '_blank') { 1546 link.target = '_blank'; 1547 } 1548 }); 1549}); 1550</script>
1550 1551 1552<!-- ================== Floating TOC Launcher (EDIT ME) ================== --> 1553<!-- Desktop: anchored to content column. Mobile: fixed. Debounced iOS-safe toggle. --> 1554<style> 1555 :root { --backtotop-offset: 30vh; } /* ~30% above bottom on desktop */ 1556 @media (max-width: 640px) { :root { --backtotop-offset: 26vh; } } /* higher on mobile */ 1557 1558 #floating-toc { all: unset; } 1559 /* Hidden until scrolled */ 1560 #floating-toc details.fltoc { 1561 display: none; 1562 position: fixed; 1563 right: 16px; /* mobile & small screens use viewport right */ 1564 bottom: var(--backtotop-offset); 1565 z-index: 2147483647; margin: 0; 1566 } 1567 #floating-toc details.fltoc.show { display: block; } 1568 1569 /* On desktop, override horizontal position via JS (left: Xpx) */ 1570 @media (min-width: 1024px) { 1571 #floating-toc details.fltoc.fltoc--content-anchor { 1572 right: auto; /* JS sets left */ 1573 left: 16px; /* fallback */ 1574 } 1575 } 1576 1577 /* White circular arrow button (matches your old Back-to-Top) */ 1578 #floating-toc .fltoc__btn { 1579 list-style: none; 1580 width: 44px; height: 44px; border-radius: 9999px; 1581 border: 1px solid rgba(0,0,0,.12); 1582 background: #fff; color: #000; 1583 display: flex; align-items: center; justify-content: center; 1584 font-size: 18px; line-height: 1; cursor: pointer; 1585 box-shadow: 0 6px 18px rgba(0,0,0,.12); 1586 outline-offset: 2px; 1587 } 1588 html[data-color-scheme="dark"] #floating-toc .fltoc__btn { 1589 background:#111; color:#eee; border-color: rgba(255,255,255,.16); 1590 } 1591 1592 /* Slide-up panel above the button */ 1593 #floating-toc .fltoc__panel { 1594 position: fixed; 1595 right: 16px; /* mobile default */ 1596 bottom: calc(var(--backtotop-offset) + 64px); 1597 width: min(92vw, 420px); 1598 max-height: 60vh; overflow: auto; 1599 background: #fff; border: 1px solid #e6e6e6; 1600 border-radius: 12px; padding: 10px 10px 12px 10px; 1601 box-shadow: 0 14px 34px rgba(0,0,0,.18); 1602 } 1603 html[data-color-scheme="dark"] #floating-toc .fltoc__panel { background:#0b0b0b; border-color:#333; } 1604 1605 /* On desktop, align panel horizontally with the button (use left) */ 1606 @media (min-width: 1024px) { 1607 #floating-toc .fltoc__panel.fltoc__panel--content { right: auto; left: 16px; } 1608 } 1609 1610 #floating-toc .fltoc__hdr { display:flex; align-items:center; justify-content:space-between; margin-bottom:8px; } 1611 #floating-toc .fltoc__title { font-size:14px; color:#111; font-weight:600; } 1612 html[data-color-scheme="dark"] #floating-toc .fltoc__title { color:#eee; } 1613 1614 #floating-toc .fltoc__close { 1615 border:0; background:#f4f4f4; color:#333; font-size:14px; border-radius:8px; padding:4px 8px; cursor:pointer; 1616 } 1617 html[data-color-scheme="dark"] #floating-toc .fltoc__close { background:#1a1a1a; color:#ddd; } 1618 1619 #floating-toc .fltoc__grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:6px; } 1620 #floating-toc .fltoc__link { 1621 display:block; font-size:13px; text-align:center; padding:8px; border:1px solid #ddd; 1622 border-radius:8px; background:#fafafa; color:#0056b3; text-decoration:none; 1623 } 1624 html[data-color-scheme="dark"] #floating-toc .fltoc__link { background:#111; border-color:#2a2a2a; color:#93c5fd; } 1625 #floating-toc .fltoc__link[data-level="3"] { opacity:.9; font-size:12.5px; } 1626 1627 #floating-toc .fltoc__safe { height: calc(8px + env(safe-area-inset-bottom, 0)); } 1628</style> 1629 1630<nav id="floating-toc" aria-label="Article sections"></nav> 1631
1632<script> 1633(function(){ 1634 if (!document.body.classList.contains('post-template')) return; 1635 1636 document.addEventListener('DOMContentLoaded', init); 1637 1638 function init(){ 1639 var tocContainer = document.getElementById('post-toc'); 1640 var article = document.querySelector('.ghost-content, .gh-content, .article-body, .js-article-body, #post-content'); 1641 if (!tocContainer && !article) return; 1642 1643 // Build links from #post-toc; fallback to headings 1644 var links = []; 1645 if (tocContainer && tocContainer.querySelector('a')) { 1646 links = Array.from(tocContainer.querySelectorAll('a')).map(function(a){ 1647 var href = a.getAttribute('href') || ''; 1648 if (!href || href[0] !== '#') return null; 1649 var text = (a.textContent || '').trim(); 1650 var levelMatch = a.parentElement && String(a.parentElement.className||'').match(/toc-level-(\d)/); 1651 var level = levelMatch ? levelMatch[1] : '2'; 1652 return { href: href, text: text, level: level }; 1653 }).filter(Boolean); 1654 } else if (article) { 1655 var used = new Set(); 1656 function slugify(s){ 1657 return (s||'').toLowerCase().trim() 1658 .replace(/[^\w\s-]/g,'').replace(/\s+/g,'-').replace(/-+/g,'-').slice(0,60) || 'section'; 1659 } 1660 var hs = article.querySelectorAll('h2, h3'); 1661 hs.forEach(function(h){ 1662 if (!h.id) { 1663 var base = slugify(h.textContent), id = base, i = 2; 1664 while (used.has(id) || document.getElementById(id)) id = base + '-' + (i++); 1665 h.id = id; used.add(id); 1666 } 1667 links.push({ href:'#'+h.id, text:(h.textContent||'').trim(), level: h.tagName.slice(1) }); 1668 }); 1669 } 1670 if (!links.length) return; 1671 1672 // Header offset similar to the TOC script 1673 var header = document.querySelector('.header'); 1674 var headerOffset = (header ? header.offsetHeight : 80) + 10; 1675 1676 // Build floating UI 1677 var host = document.getElementById('floating-toc'); 1678 var details = document.createElement('details'); 1679 details.className = 'fltoc fltoc--content-anchor'; 1680 1681 var summary = document.createElement('summary'); 1682 summary.className = 'fltoc__btn'; 1683 summary.title = 'Open table of contents'; 1684 summary.setAttribute('aria-label','Open table of contents'); 1685 summary.textContent = 'â'; 1686 1687 var panel = document.createElement('div'); 1688 panel.className = 'fltoc__panel fltoc__panel--content'; 1689 panel.setAttribute('role','dialog'); 1690 panel.setAttribute('aria-label','Table of contents'); 1691 1692 var hdr = document.createElement('div'); 1693 hdr.className = 'fltoc__hdr'; 1694 1695 var title = document.createElement('strong'); 1696 title.className = 'fltoc__title'; 1697 title.textContent = 'Jump to'; 1698 1699 var closeBtn = document.createElement('button'); 1700 closeBtn.className = 'fltoc__close'; 1701 closeBtn.type = 'button'; 1702 closeBtn.setAttribute('aria-label','Close'); 1703 closeBtn.textContent = 'â'; 1704 1705 hdr.appendChild(title); 1706 hdr.appendChild(closeBtn); 1707 1708 var grid = document.createElement('div'); 1709 grid.className = 'fltoc__grid'; 1710 1711 links.forEach(function(lk){ 1712 var a = document.createElement('a'); 1713 a.className = 'fltoc__link'; 1714 a.href = lk.href; 1715 a.textContent = lk.text; 1716 a.setAttribute('data-level', lk.level || '2'); 1717 grid.appendChild(a); 1718 }); 1719 1720 var safe = document.createElement('div'); 1721 safe.className = 'fltoc__safe'; 1722 1723 panel.appendChild(hdr); 1724 panel.appendChild(grid); 1725 panel.appendChild(safe); 1726 1727 details.appendChild(summary); 1728 details.appendChild(panel); 1729 host.appendChild(details); 1730 1731 // ===== Robust open/close (fixes iOS double-fire) ===== 1732 var lastToggleAt = 0; 1733 function requestToggle(force){ 1734 var now = Date.now(); 1735 if (now - lastToggleAt < 350) return; // debounce double events 1736 lastToggleAt = now; 1737 toggleOpen(force); 1738 } 1739 function toggleOpen(force){ 1740 if (typeof force === 'boolean') details.open = force; 1741 else details.open = !details.open; 1742 if (details.open) ensurePanelFullyVisible(); 1743 } 1744 1745 // Only use click (mouse/desktop) and touchend (mobile). No touchstart/pointer*. 1746 function onClick(e){ e.preventDefault(); e.stopPropagation(); requestToggle(); } 1747 function onTouchEnd(e){ e.preventDefault(); e.stopPropagation(); requestToggle(); setTimeout(function(){ try{ summary.blur(); }catch(_){} }, 0); } 1748 1749 summary.addEventListener('click', onClick, { passive:false }); 1750 summary.addEventListener('touchend', onTouchEnd, { passive:false }); 1751 1752 // Close button 1753 closeBtn.addEventListener('click', function(e){ 1754 e.preventDefault(); 1755 requestToggle(false); 1756 setTimeout(function(){ try{ summary.blur(); }catch(_){} }, 0); 1757 }); 1758 1759 // Show button after scrolling 600px 1760 var showAt = 600; 1761 function toggleBtn(){ 1762 if (window.pageYOffset > showAt) details.classList.add('show'); 1763 else details.classList.remove('show'); 1764 } 1765 window.addEventListener('scroll', toggleBtn, { passive:true }); 1766 toggleBtn(); 1767 1768 // Smooth scroll on selection and close the panel 1769 grid.addEventListener('click', function(e){ 1770 var a = e.target.closest('a'); 1771 if (!a) return; 1772 var id = (a.getAttribute('href') || '').slice(1); 1773 var el = document.getElementById(id); 1774 if (!el) return; 1775 1776 e.preventDefault(); 1777 var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 1778 var top = el.getBoundingClientRect().top + window.pageYOffset - headerOffset; 1779 window.scrollTo({ top: top, behavior: reduce ? 'auto' : 'smooth' }); 1780 1781 // Close and refresh tap target after navigation (helps iOS) 1782 setTimeout(function(){ 1783 requestToggle(false); 1784 try{ summary.blur(); }catch(_){} 1785 var parent = details.parentNode; 1786 if (parent) { parent.removeChild(details); parent.appendChild(details); } 1787 }, 80); 1788 1789 // Brief highlight 1790 var prev = el.style.boxShadow; 1791 el.style.transition = 'box-shadow .25s ease'; 1792 el.style.boxShadow = '0 0 0 3px #2563eb'; 1793 setTimeout(function(){ el.style.boxShadow = prev || ''; }, 900); 1794 }, { passive:false }); 1795 1796 // Ensure the whole panel is visible in the viewport (mobile) 1797 function ensurePanelFullyVisible(){ 1798 requestAnimationFrame(function(){ 1799 try{
1800 var vv = window.visualViewport; 1801 var vh = vv ? vv.height : Math.max(document.documentElement.clientHeight, window.innerHeight || 0); 1802 var margin = 12; 1803 panel.style.setProperty('--extra-bottom', '0px'); 1804 panel.style.bottom = 'calc(var(--backtotop-offset) + 64px + var(--extra-bottom, 0px))'; 1805 var rect = panel.getBoundingClientRect(); 1806 var hidden = rect.bottom - (vh - margin); 1807 if (hidden > 0) { 1808 panel.style.setProperty('--extra-bottom', hidden + 'px'); 1809 panel.style.bottom = 'calc(var(--backtotop-offset) + 64px + var(--extra-bottom, 0px))'; 1810 } 1811 }catch(_){} 1812 }); 1813 } 1814 1815 // Desktop positioning: anchor to the right edge of the content column 1816 var contentEl = document.querySelector('.post-main') || 1817 document.querySelector('.content-framed') || 1818 document.querySelector('.max-w-content') || 1819 document.querySelector('.ghost-content'); 1820 1821 function placeDesktop(){ 1822 if (window.matchMedia('(min-width: 1024px)').matches && contentEl) { 1823 var rect = contentEl.getBoundingClientRect(); 1824 var btnWidth = 44; 1825 var gap = 12; 1826 var left = Math.max(12, Math.min(rect.right - btnWidth - gap, window.innerWidth - btnWidth - 12)); 1827 details.style.left = left + 'px'; 1828 panel.style.left = left + 'px'; 1829 } else { 1830 details.style.left = ''; 1831 panel.style.left = ''; 1832 } 1833 } 1834 placeDesktop(); 1835 1836 function onViewportChange(){ 1837 placeDesktop(); 1838 if (details.open) ensurePanelFullyVisible(); 1839 } 1840 window.addEventListener('resize', onViewportChange, { passive:true }); 1841 if (window.visualViewport) { 1842 visualViewport.addEventListener('resize', onViewportChange, { passive:true }); 1843 visualViewport.addEventListener('scroll', onViewportChange, { passive:true }); 1844 } 1845 var mo = new MutationObserver(function(){ onViewportChange(); }); 1846 mo.observe(document.body, { childList:true, subtree:true }); 1847 } 1848})(); 1849</script>
1849 1850<!-- ================== /Floating TOC Launcher ================== --> 1851
1852<script> 1853document.addEventListener("DOMContentLoaded", function () { 1854 const affiliateUrl = "https://www.travelpayouts.com/?marker=533334"; 1855 const scopes = document.querySelectorAll(".gh-content, .ghost-content, article, main"); 1856 1857 scopes.forEach(scope => { 1858 let linked = false; 1859 1860 const walker = document.createTreeWalker(scope, NodeFilter.SHOW_TEXT, { 1861 acceptNode(node) { 1862 if (linked) return NodeFilter.FILTER_REJECT; 1863 if (!node.nodeValue || !/travelpayouts/i.test(node.nodeValue)) { 1864 return NodeFilter.FILTER_REJECT; 1865 } 1866 1867 const parent = node.parentElement; 1868 if (!parent) return NodeFilter.FILTER_REJECT; 1869 1870 // Avoid replacing inside links or headings 1871 if (parent.closest("a, script, style, code, pre, h1, h2, h3, h4, h5, h6")) { 1872 return NodeFilter.FILTER_REJECT; 1873 } 1874 1875 return NodeFilter.FILTER_ACCEPT; 1876 } 1877 }); 1878 1879 const firstNode = walker.nextNode(); 1880 if (!firstNode) return; 1881 1882 const html = firstNode.nodeValue.replace( 1883 /\b(travelpayouts)\b/i, 1884 `<a href="${affiliateUrl}" target="_blank" rel="sponsored noreferrer noopener">$1</a>` 1885 ); 1886 1887 const span = document.createElement("span"); 1888 span.innerHTML = html; 1889 firstNode.parentNode.replaceChild(span, firstNode); 1890 linked = true; 1891 }); 1892}); 1893</script>
1893 1894 1895<!-- ================== /Transform TravelPayouts to link ================== --> 1896 1897<!-- 1898 THE TRAVELER â SPIN THE WHEEL POPUP 1899 1900 WHERE TO PASTE 1901 Ghost Admin â Settings â Code injection â Site footer. 1902 Paste this whole block. It loads on every page of the site. 1903 1904 BEHAVIOUR 1905 - Appears 15 seconds after the page is opened. 1906 - Shows at most once per 24 hours, whether it was clicked or dismissed. 1907 - Never appears on the spin page itself. 1908 - The timer only counts while the tab is actually visible, so a tab left 1909 open in the background does not burn the one showing it gets per day. 1910 - Closes on Escape, on the backdrop, and on the à button. 1911 1912 EDIT THE SETTINGS BLOCK AT THE TOP OF THE SCRIPT to change the wording, 1913 the delay, the frequency, or the destination URL. 1914 1915 ONE THING TO CHECK BEFORE YOU PUBLISH 1916 The CTA promises a chance to win a free vacation, so at least one code in 1917 the wheel's config has to land on a vacation segment ("2 Weeks Cruise 1918 Vacation" is index 3, "Jackpot â Dream Vacation" is index 6). In the sample 1919 config the winning codes land on 0 and 4, so as written the popup would be 1920 promising something no code can reach. Either point a code at 3 or 6, or 1921 change the CTA to name what can actually be won. 1922--> 1923 1924<style> 1925 .tt-pop-root { 1926 --tt-pop-ink: #172b32; 1927 --tt-pop-paper: #fffdf8; 1928 --tt-pop-muted: #66777d; 1929 --tt-pop-teal: #1f706f; 1930 --tt-pop-teal-dark: #155755; 1931 --tt-pop-coral: #e97756; 1932 --tt-pop-gold: #e2af4f;
1933 align-items: center; 1934 display: flex; 1935 inset: 0; 1936 justify-content: center; 1937 opacity: 0; 1938 padding: 20px; 1939 pointer-events: none; 1940 position: fixed; 1941 transition: opacity .28s ease; 1942 z-index: 2147483000; 1943 } 1944 1945 .tt-pop-root.is-open { 1946 opacity: 1; 1947 pointer-events: auto; 1948 } 1949 1950 .tt-pop-backdrop { 1951 background: rgba(12, 24, 28, .62); 1952 inset: 0; 1953 position: absolute; 1954 } 1955 1956 .tt-pop-card { 1957 background: var(--tt-pop-paper); 1958 border-radius: 22px; 1959 box-shadow: 0 30px 80px rgba(12, 24, 28, .38); 1960 color: var(--tt-pop-ink); 1961 display: grid; 1962 gap: 22px; 1963 grid-template-columns: 150px minmax(0, 1fr); 1964 max-width: 540px; 1965 padding: 30px 32px; 1966 position: relative; 1967 transform: translateY(14px) scale(.97); 1968 transition: transform .28s cubic-bezier(.2,.8,.3,1); 1969 width: 100%; 1970 } 1971 1972 .tt-pop-root.is-open .tt-pop-card { 1973 transform: translateY(0) scale(1); 1974 } 1975 1976 .tt-pop-close { 1977 appearance: none; 1978 background: transparent; 1979 border: 0; 1980 border-radius: 50%; 1981 color: var(--tt-pop-muted); 1982 cursor: pointer; 1983 font-size: 22px; 1984 height: 34px; 1985 line-height: 1; 1986 position: absolute; 1987 right: 8px; 1988 top: 8px; 1989 width: 34px; 1990 } 1991 1992 .tt-pop-close:hover { 1993 background: rgba(23, 43, 50, .07); 1994 color: var(--tt-pop-ink); 1995 } 1996 1997 .tt-pop-wheel { 1998 align-self: center; 1999 animation: tt-pop-turn 14s linear infinite; 2000 aspect-ratio: 1; 2001 background: 2002 radial-gradient(circle at center, var(--tt-pop-paper) 0 17%, transparent 17.5%), 2003 conic-gradient( 2004 from -22.5deg, 2005 #1f706f 0deg 45deg, 2006 #e97756 45deg 90deg, 2007 #e2af4f 90deg 135deg, 2008 #6a9f96 135deg 180deg, 2009 #1f706f 180deg 225deg, 2010 #e97756 225deg 270deg, 2011 #e2af4f 270deg 315deg, 2012 #6a9f96 315deg 360deg 2013 ); 2014 border: 6px solid var(--tt-pop-paper); 2015 border-radius: 50%; 2016 box-shadow: 0 0 0 2px var(--tt-pop-ink), 0 12px 26px rgba(23, 43, 50, .22); 2017 width: 100%; 2018 } 2019 2020 @keyframes tt-pop-turn { 2021 to { transform: rotate(360deg); } 2022 } 2023 2024 .tt-pop-body { 2025 align-self: center; 2026 min-width: 0; 2027 } 2028 2029 .tt-pop-kicker { 2030 color: var(--tt-pop-coral); 2031 display: block; 2032 font-size: 13px; 2033 font-weight: 700; 2034 margin-bottom: 8px; 2035 } 2036 2037 .tt-pop-title { 2038 color: var(--tt-pop-ink); 2039 font-family: Georgia, "Times New Roman", serif; 2040 font-size: 27px; 2041 font-weight: 500; 2042 letter-spacing: -0.02em; 2043 line-height: 1.18; 2044 margin: 0 0 10px; 2045 } 2046 2047 .tt-pop-text { 2048 color: var(--tt-pop-muted); 2049 font-size: 15px; 2050 line-height: 1.6; 2051 margin: 0 0 18px; 2052 } 2053 2054 .tt-pop-cta { 2055 background: var(--tt-pop-teal); 2056 border-radius: 12px; 2057 color: #fff !important; 2058 display: inline-block; 2059 font-size: 15px; 2060 font-weight: 700; 2061 padding: 14px 24px; 2062 text-decoration: none !important; 2063 transition: background .2s ease, transform .2s ease; 2064 } 2065 2066 .tt-pop-cta:hover { 2067 background: var(--tt-pop-teal-dark); 2068 transform: translateY(-1px); 2069 } 2070 2071 .tt-pop-cta:focus-visible, 2072 .tt-pop-close:focus-visible { 2073 outline: 3px solid var(--tt-pop-gold); 2074 outline-offset: 3px; 2075 } 2076 2077 .tt-pop-dismiss { 2078 appearance: none; 2079 background: none; 2080 border: 0; 2081 color: var(--tt-pop-muted); 2082 cursor: pointer; 2083 display: block; 2084 font: inherit; 2085 font-size: 13px; 2086 margin-top: 12px; 2087 padding: 0; 2088 text-decoration: underline; 2089 } 2090 2091 @media (max-width: 520px) { 2092 .tt-pop-root { 2093 align-items: flex-end; 2094 padding: 0; 2095 } 2096 2097 .tt-pop-card { 2098 border-radius: 20px 20px 0 0; 2099 gap: 16px; 2100 grid-template-columns: 88px minmax(0, 1fr); 2101 max-width: none; 2102 padding: 26px 22px 30px; 2103 } 2104 2105 .tt-pop-title { 2106 font-size: 22px; 2107 } 2108 } 2109 2110 @media (prefers-reduced-motion: reduce) { 2111 .tt-pop-root, 2112 .tt-pop-card, 2113 .tt-pop-cta { 2114 transition-duration: .01ms !important; 2115 } 2116 2117 .tt-pop-wheel { 2118 animation: none; 2119 } 2120 } 2121 2122 @media (prefers-color-scheme: dark) { 2123 .tt-pop-root { 2124 --tt-pop-paper: #16252a; 2125 --tt-pop-ink: #eaf1ef; 2126 --tt-pop-muted: #adbbb8; 2127 } 2128 } 2129</style> 2130 </body> 2131</html> 2132 2133
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.