PageSourceSearch

https://www.thetraveler.org/about/

html thetraveler.org collected 2026-09-24 21:12:59 UTC 89,100 bytes, 2,133 lines download raw bytes

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 [&amp;&gt;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 [&amp;_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>&copy;2026&nbsp;<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.