PageSourceSearch

https://joaotome.com/assets/V2-B01u3Ykd.js

js joaotome.com collected 2026-09-24 18:12:31 UTC 46,319 bytes, 50 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ThisWeekInNET-B68PPVpz.js","assets/index-OZBwOq0W.js","assets/index-CAwBdAmG.css","assets/Footer-Bl-kUtxI.js","assets/skeleton-Be61UwyG.js","assets/SectionLink-CYLVaZpO.js","assets/Experience-Def4GMEG.js","assets/cloudflare-logo-Bq6yJob5.js","assets/InteractiveGlobe-Ck4trIOw.js","assets/Contact-BpmKIAdT.js","assets/Closing-BO8NN_5W.js"])))=>i.map(i=>d[i]);
2import{c as y,a as e,L as M,r as d,_ as v,u as oe}from"./index-OZBwOq0W.js";import{u as le,V as ne}from"./V2Navbar-Cd57qlL5.js";import{b as p,E as w,F as ie}from"./Footer-Bl-kUtxI.js";import{P as de,B as ce}from"./ParticleCloud-Bb5yXpKz.js";import{S as U,C as O}from"./skeleton-Be61UwyG.js";import{u as he,p as H}from"./useWritingFeed-DXzNVr5y.js";import{C as me}from"./chart-no-axes-column-FB2Fie-w.js";/**
3 * @license lucide-react v0.462.0 - ISC
4 *
5 * This source code is licensed under the ISC license.
6 * See the LICENSE file in the root directory of this source tree.
7 */const re=y("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/**
8 * @license lucide-react v0.462.0 - ISC
9 *
10 * This source code is licensed under the ISC license.
11 * See the LICENSE file in the root directory of this source tree.
12 */const ue=y("CalendarDays",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}],["path",{d:"M8 14h.01",key:"6423bh"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M16 14h.01",key:"1gbofw"}],["path",{d:"M8 18h.01",key:"lrp35t"}],["path",{d:"M12 18h.01",key:"mhygvu"}],["path",{d:"M16 18h.01",key:"kzsmim"}]]);/**
13 * @license lucide-react v0.462.0 - ISC
14 *
15 * This source code is licensed under the ISC license.
16 * See the LICENSE file in the root directory of this source tree.
17 */const fe=y("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/**
18 * @license lucide-react v0.462.0 - ISC
19 *
20 * This source code is licensed under the ISC license.
21 * See the LICENSE file in the root directory of this source tree.
22 */const xe=y("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/**
23 * @license lucide-react v0.462.0 - ISC
24 *
25 * This source code is licensed under the ISC license.
26 * See the LICENSE file in the root directory of this source tree.
27 */const pe=y("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);/**
28 * @license lucide-react v0.462.0 - ISC
29 *
30 * This source code is licensed under the ISC license.
31 * See the LICENSE file in the root directory of this source tree.
32 */const ge=y("MicVocal",[["path",{d:"m11 7.601-5.994 8.19a1 1 0 0 0 .1 1.298l.817.818a1 1 0 0 0 1.314.087L15.09 12",key:"80a601"}],["path",{d:"M16.5 21.174C15.5 20.5 14.372 20 13 20c-2.058 0-3.928 2.356-6 2-2.072-.356-2.775-3.369-1.5-4.5",key:"j0ngtp"}],["circle",{cx:"16",cy:"7",r:"5",key:"d08jfb"}]]);/**
33 * @license lucide-react v0.462.0 - ISC
34 *
35 * This source code is licensed under the ISC license.
36 * See the LICENSE file in the root directory of this source tree.
37 */const be=y("Quote",[["path",{d:"M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z",key:"rib7q0"}],["path",{d:"M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z",key:"1ymkrd"}]]);/**
38 * @license lucide-react v0.462.0 - ISC
39 *
40 * This source code is licensed under the ISC license.
41 * See the LICENSE file in the root directory of this source tree.
42 */const G=y("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/**
43 * @license lucide-react v0.462.0 - ISC
44 *
45 * This source code is licensed under the ISC license.
46 * See the LICENSE file in the root directory of this source tree.
47 */const ve=y("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]),ye=()=>e.jsxs("section",{id:"home",className:"relative flex items-center justify-center px-5 sm:px-6 pt-28 pb-12 md:pt-36 md:pb-16 overflow-hidden",children:[e.jsx("div",{className:"absolute inset-0 -z-10 bg-gradient-to-b from-background via-secondary/20 to-background"}),e.jsxs("div",{className:"max-w-5xl w-full mx-auto grid grid-cols-1 md:grid-cols-[0.7fr_1.3fr] gap-6 md:gap-12 items-center",children:[e.jsx(p,{animation:"fade-in",className:"flex justify-center md:justify-end",children:e.jsxs("div",{className:"relative w-36 h-36 sm:w-44 sm:h-44 md:w-60 md:h-60 flex items-center justify-center",children:[e.jsx(de,{className:"absolute inset-0 z-0"}
47),e.jsx(ce,{src:"/lovable-uploads/c56bf43d-7e36-430b-a1e2-613d3d7fe9a3.png",alt:"João Tomé"})]})}),e.jsxs("div",{className:"text-center md:text-left",children:[e.jsx(p,{animation:"fade-in-delay-1",children:e.jsx("h1",{className:"text-4xl md:text-5xl lg:text-6xl font-serif font-bold mb-3 text-foreground",children:"João Tomé"})}),e.jsx(p,{animation:"fade-in-delay-2",children:e.jsx("div",{className:"mb-5",children:e.jsx("h2",{className:"text-lg md:text-xl font-medium text-muted-foreground",children:"Journalist by training, data editor and storyteller by trade."})})}),e.jsxs(p,{animation:"fade-in-delay-3",children:[e.jsx("p",{className:"text-base text-foreground mb-3 leading-relaxed max-w-lg",children:"I turn Internet data into stories, conversations, and tools people can explore."}),e.jsx("p",{className:"text-sm text-muted-foreground mb-6 leading-relaxed max-w-lg",children:"Now an Internet Data Research Editor at IPinfo, since August 2026. Previously at Cloudflare, from 2021 to July 2026, following almost two decades in Portuguese journalism."}),e.jsxs("div",{className:"flex flex-wrap justify-center md:justify-start gap-2 mb-8",children:[e.jsx("span",{className:"chip bg-cloudflare/10 text-foreground",children:"Technology"}),e.jsx("span",{className:"chip bg-madeInTech/10 text-foreground",children:"Data Storytelling"}),e.jsx("span",{className:"chip bg-dinheiroVivo/10 text-foreground",children:"Podcasting"}),e.jsx("span",{className:"chip",children:"Journalism"})]}),e.jsxs("div",{className:"flex flex-wrap justify-center md:justify-start gap-3 mb-6",children:[e.jsx(M,{to:"/about",className:"px-5 py-2 rounded-full bg-foreground text-background text-sm font-medium hover:opacity-80 transition-opacity",children:"About me"}),e.jsx(M,{to:"/writing",className:"px-5 py-2 rounded-full border border-border text-foreground text-sm font-medium hover:bg-secondary transition-colors",children:"All writing"})]}),e.jsxs("div",{className:"flex flex-wrap justify-center md:justify-start gap-4",children:[e.jsxs("a",{href:"https://emot.substack.com",target:"_blank",rel:"noopener noreferrer",className:"text-xs text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1.5",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-orange-400 inline-block"}),"Substack"]}),e.jsxs("a",{href:"https://x.com/emot",target:"_blank",rel:"noopener noreferrer",className:"text-xs text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1.5",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-foreground inline-block"}),"X"]}),e.jsxs("a",{href:"https://www.linkedin.com/in/joaotome1/",target:"_blank",rel:"noopener noreferrer",className:"text-xs text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1.5",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-blue-600 inline-block"}),"LinkedIn"]}),e.jsxs("a",{href:"https://blog.cloudflare.com/author/joao-tome/",target:"_blank",rel:"noopener noreferrer",className:"text-xs text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1.5",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-cloudflare inline-block"}),"Cloudflare Blog"]}),e.jsxs("a",{href:"https://emot.medium.com",target:"_blank",rel:"noopener noreferrer",className:"text-xs text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1.5",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-green-500 inline-block"}),"Medium"]})]})]})]})]})]}),K="https://focus-life.pages.dev/",I="joaotome-perspective-quotes",z="joaotome-perspective-facts",Y="joaotome-perspective-visits";function je(s){const t=String(s.getMonth()+1).padStart(2,"0"),a=String(s.getDate()).padStart(2,"0");return{month:t,dateKey:`${t}-${a}`}}function ke(s){let t=2166136261;for(let a=0;a<s.length;a+=1)t^=s.charCodeAt(a),t=Math.imul(t,16777619);return t>>>0}function A(s){try{const t=JSON.parse(window.localStorage.getItem(s)??"[]");return Array.isArray(t)?t.filter(a=>typeof a=="string"):[]}catch{return[]}}function L(s,t,a){try{const r=[t,...A(s).filter(l=>l!==t)].slice(0,a);window.localStorage.setItem(s,JSON.stringify(r))}catch{}}function we(){try{const s=Number(window.localStorage.getItem(Y)??"0"),t=Number.isFinite(s)?s+1:1;return window.localStorage.setItem(Y,String(t)),t}catch{return Date.now()}}function P(s,t,a,r){if(!s.length)return;const l=s.filter(u=>u.id!==r&&!t.includes(u.id)),c=l.length?l:s.filter(u=>u.id!==r),i=c.length?c:s;return i[ke(a)%i.length]}const Ne=()=>
47{const[s,t]=d.useState([]),[a,r]=d.useState([]),[l,c]=d.useState(),[i,u]=d.useState(),[j,C]=d.useState(!0),[n,o]=d.useState(!1),[h,g]=d.useState(0),[_,D]=d.useState(0),f=d.useMemo(()=>new Date,[]),{month:$,dateKey:x}=d.useMemo(()=>je(f),[f]),N=d.useMemo(()=>f.toLocaleDateString("en-GB",{day:"numeric",month:"long"}),[f]);d.useEffect(()=>{const m=new AbortController;async function b(){try{const[T,Q]=await Promise.all([fetch("/focus-life/quotes.json",{signal:m.signal}),fetch(`/focus-life/on-this-day/${$}.json`,{signal:m.signal})]);if(!T.ok||!Q.ok)throw new Error("Perspective data could not be loaded.");const V=await T.json(),R=(await Q.json()).facts.filter(ae=>ae.date===x);if(!V.quotes.length||!R.length)throw new Error("Perspective data is incomplete.");const J=we(),B=P(V.quotes,A(I),`${x}:quote:${J}`),F=P(R,A(z),`${x}:fact:${J}`);t(V.quotes),r(R),c(B),u(F),B&&L(I,B.id,24),F&&L(z,F.id,10)}catch(T){T.name!=="AbortError"&&o(!0)}finally{m.signal.aborted||C(!1)}}return b(),()=>m.abort()},[x,$]);const E=()=>{const m=h+1,b=P(s,A(I),`${x}:quote-button:${m}`,l==null?void 0:l.id);b&&(c(b),L(I,b.id,24),g(m))},k=()=>{const m=_+1,b=P(a,A(z),`${x}:fact-button:${m}`,i==null?void 0:i.id);b&&(u(b),L(z,b.id,10),D(m))};return e.jsx("section",{id:"perspective",className:"px-5 py-14 sm:px-6 sm:py-20",children:e.jsxs("div",{className:"mx-auto max-w-5xl",children:[e.jsx(p,{children:e.jsxs("div",{className:"mb-8 max-w-2xl",children:[e.jsx("p",{className:"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-cloudflare",children:"A thought for today"}),e.jsx("h2",{className:"mb-2 font-serif text-3xl font-bold text-foreground",children:"One idea. One moment in history."}),e.jsx("p",{className:"text-sm leading-relaxed text-muted-foreground",children:"A daily pairing from science, technology, culture, history and the arts."})]})}),e.jsx("div",{className:"rounded-2xl border border-border/70 bg-secondary/35 p-2 dark:bg-secondary/30 sm:p-4",children:j?e.jsxs("div",{className:"grid gap-3 md:grid-cols-2","aria-label":"Loading today’s perspective",children:[e.jsx("div",{className:"h-[28rem] animate-pulse rounded-xl bg-background/70 sm:h-[30rem]"}),e.jsx("div",{className:"h-[28rem] animate-pulse rounded-xl bg-background/70 sm:h-[30rem]"})]}):n||!l||!i?e.jsxs("div",{className:"rounded-xl bg-background p-8 text-center dark:bg-card",children:[e.jsx("p",{className:"mb-3 text-sm text-muted-foreground",children:"Today’s perspective is taking a little longer to arrive."}),e.jsxs("a",{className:"inline-flex items-center gap-1.5 text-sm font-medium text-cloudflare hover:underline",href:K,target:"_blank",rel:"noopener noreferrer",children:["Explore Focus & Life ",e.jsx(w,{size:14})]})]}):e.jsxs("div",{className:"grid gap-3 md:grid-cols-2",children:[e.jsxs("article",{className:"flex h-[28rem] flex-col overflow-hidden rounded-xl border border-border/60 bg-background p-5 dark:bg-card sm:h-[30rem] sm:p-6",children:[e.jsxs("div",{className:"mb-5 flex items-center justify-between gap-3",children:[e.jsxs("span",{className:"inline-flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground",children:[e.jsx(be,{size:15,className:"text-cloudflare","aria-hidden":"true"})," Quote"]}),e.jsx("span",{className:"rounded-full bg-secondary px-2.5 py-1 text-xs capitalize text-muted-foreground",children:l.category})]}),e.jsxs("div",{className:"flex min-h-0 flex-1 animate-fade-in flex-col overflow-y-auto overscroll-contain pr-2","aria-live":"polite",children:[e.jsxs("blockquote",{className:"mb-5 font-serif text-xl leading-relaxed text-foreground sm:text-2xl",children:["“",l.quote,"”"]}),e.jsxs("div",{className:"mt-auto",children:[e.jsx("p",{className:"text-sm font-semibold text-foreground",children:l.author}),e.jsxs("a",{href:l.url,target:"_blank",rel:"noopener noreferrer",className:"mt-1 inline-flex items-start gap-1 text-xs leading-relaxed text-muted-foreground hover:text-cloudflare",children:[e.jsx("span",{children:l.source}),e.jsx(w,{size:11,className:"mt-0.5 shrink-0","aria-hidden":"true"})]})]})]},l.id),e.jsxs("button",{type:"button",onClick:E,className:"mt-6 inline-flex w-fit items-center gap-2 rounded-full border border-border px-3.5 py-2 text-sm font-medium text-foreground transition-colors hover:border-cloudflare/50 hover:text-cloudflare focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",children:[e.jsx(G,{size:14,"aria-hidden":"true"})," Another quote"]})]}),e.jsxs("article",{className:"flex h-[28rem] flex-col overflow-hidden rounded-xl border border-border/60 bg-background p-5 dark:bg-card sm:h-[30rem] sm:p-6",children:[e.jsxs("div",{className:"mb-5 flex items-center justify-between gap-3",children:[e.jsxs("span",{className:"inline-flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground",children:[e.jsx(ue,{size:15,className:"text-cloudflare","aria-hidden":"true"})," On this day"]}),e.jsx("time",{dateTime:x,className:"rounded-full bg-secondary px-2.5 py-1 text-xs text-muted-foreground",children:N})]}),e.jsxs("div",{className:"flex min-h-0 flex-1 animate-fade-in flex-col overflow-y-auto overscroll-contain pr-2","aria-live":"polite",children:[e.jsx("p",{className:"mb-2 font-serif text-3xl font-bold text-cloudflare",children:i.year>0?i.year:"Annual observance"}),e.jsx("h3",{className:"mb-2 text-lg font-semibold leading-snug text-foreground",children:i.title}),e.jsx("p",{className:"text-base leading-relaxed text-foreground
47/90",children:i.text}),e.jsxs("div",{className:"mt-auto pt-5 text-xs text-muted-foreground",children:[e.jsxs("a",{href:i.url,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 hover:text-cloudflare",children:[i.source," ",e.jsx(w,{size:11,"aria-hidden":"true"})]}),i.license?e.jsxs("span",{children:[" · ",i.license]}):null]})]},i.id),e.jsxs("button",{type:"button",onClick:k,className:"mt-6 inline-flex w-fit items-center gap-2 rounded-full border border-border px-3.5 py-2 text-sm font-medium text-foreground transition-colors hover:border-cloudflare/50 hover:text-cloudflare focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",children:[e.jsx(G,{size:14,"aria-hidden":"true"})," Another fact"]})]})]})}),e.jsxs("div",{className:"mt-5 flex flex-col gap-2 text-sm sm:flex-row sm:items-center sm:justify-between",children:[e.jsx("p",{className:"text-muted-foreground",children:"From Focus & Life, a knowledge library I built."}),e.jsxs("a",{href:K,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1.5 font-medium text-foreground hover:text-cloudflare",children:["Explore the full library ",e.jsx(re,{size:14,"aria-hidden":"true"})]})]})]})})},Z=(s,t)=>t||new Date(s).toLocaleDateString("en-US",{month:"short",year:"numeric"}),X={cloudflare:{bg:"bg-cloudflare/10 text-cloudflare",label:"Cloudflare"},substack:{bg:"bg-orange-500/10 text-orange-500",label:"Substack"},medium:{bg:"bg-green-600/10 text-green-600",label:"Medium"},journalism:{bg:"bg-sky-500/10 text-sky-600 dark:text-sky-400",label:"Journalism archive"}},q={newspapers:"Newspapers","news-tv":"News TV"},ee=({source:s})=>e.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full font-medium shrink-0 ${X[s].bg}`,children:X[s].label}),te=6,Me=10,W=5,Ce=5,_e=()=>{const{items:s,loading:t}=he(),[a,r]=d.useState(te),[l,c]=d.useState(W),i=s.slice(0,a),u=a<s.length,j=H.slice(0,l),C=l<H.length;return e.jsx("section",{id:"writing",className:"py-14 sm:py-20 px-5 sm:px-6",children:e.jsxs("div",{className:"max-w-3xl mx-auto",children:[e.jsx(p,{children:e.jsxs("div",{className:"mb-10 flex flex-col sm:flex-row sm:items-end sm:justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-3xl font-serif font-bold text-foreground mb-1",children:"Latest Writing"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["From"," ",e.jsx("a",{href:"https://blog.cloudflare.com/author/joao-tome/",target:"_blank",rel:"noopener noreferrer",className:"hover:text-cloudflare underline underline-offset-4 transition-colors",children:"Cloudflare Blog"}),", ",e.jsx("a",{href:"https://emot.substack.com",target:"_blank",rel:"noopener noreferrer",className:"hover:text-foreground underline underline-offset-4 transition-colors",children:"Substack"}),", ",e.jsx("a",{href:"https://emot.medium.com",target:"_blank",rel:"noopener noreferrer",className:"hover:text-foreground underline underline-offset-4 transition-colors",children:"Medium"}),", and a ",e.jsx("a",{href:"https://joao-tome.weebly.com/artigosrecentes.html",target:"_blank",rel:"noopener noreferrer",className:"hover:text-foreground underline underline-offset-4 transition-colors",children:"Portuguese journalism archive"}),"."]})]}),e.jsxs(M,{to:"/writing",className:"text-sm text-muted-foreground hover:text-foreground transition-colors whitespace-nowrap flex items-center gap-1",children:["Full archive ",e.jsx(w,{size:13})]})]})}),e.jsx("div",{className:"rounded-2xl border border-border/70 bg-secondary/35 dark:bg-zinc-900 dark:border-zinc-700/70 p-2 sm:p-4",children:e.jsx("div",{className:"divide-y divide-border/70",children:t?Array.from({length:te}).map((n,o)=>e.jsxs("div",{className:"flex items-center justify-between gap-4 py-4 px-2 sm:px-3",children:[e.jsx(U,{className:"h-4 w-2/3"}),e.jsx(U,{className:"h-4 w-20"})]},o)):i.map(n=>e.jsxs("a",{href:n.link,target:"_blank",rel:"noopener noreferrer",className:"flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 py-4 px-2 sm:px-3 group rounded-lg hover:bg-background/60 dark:hover:bg-zinc-800/80 transition-colors",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("span",{className:"text-foreground group-hover:text-cloudflare transition-colors text-sm sm:text-base leading-snug",children:n.title}),n.category&&e.jsx("span",{className:"block mt-1 text-xs text-muted-foreground sm:hidden",children:q[n.category]})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0 pt-0.5 sm:pt-0",children:[e.jsx("span",{className:"hidden sm:inline",children:e.jsx(ee,{source:n.source})}),n.category&&e.jsx("span",{className:"hidden sm:inline text-xs px-2 py-0.5 rounded-full font-medium bg-secondary text-muted-foreground",children:q[n.category]}),e.jsx("span",{className:"text-muted-foreground text-sm whitespace-nowrap",children:Z(n.pubDate,n.dateLabel)}),e.jsx(w,{size:13,className:"text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity hidden sm:inline"})]})]},n.link))})}),!t&&e.jsxs("div",{className:"mt-6 flex items-center justify-between",children:[u?e.jsxs("button",{onClick:()=>r(n=>n+Me),className:"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors",children:["Show more ",e.jsx(O,{size:15})]}):e.jsx("span",{}),e.jsx(M,{to:"/writing",className:"text-sm text-cloudflare hover:underline underline-offset-4",children:"View full archive →"})]}),e.jsxs("div",{className:"mt-16",children:[e.jsx(p,{children:e.jsxs("div",{className:"mb-7",children:[e.jsx("p",{className:"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-cloudflare",children:"From the Cloudflare Blog"}),e.jsx("h3",{className:"mb-1 font-serif text-2xl font-bold text-foreground",children:"Popular writing"}),e.jsx("p",{className:"text-sm leading-relaxed text-muted-foreground",children:"A top five selected from my Cloudflare Blog writing, including Offline Celebrations, Total Eclipse of the Internet and Typo Traps. Show more for the extended list."})]})}),e.jsx("div",{className:"rounded-2xl border border-border/70 bg-secondary/35 p-2 dark:bg-zinc-900 dark:border-zinc-700/70 sm:p-4",children:e.jsx("div",{className:"divide-y divide-border/70",children:j.map(n=>e.jsxs("a",{href:n.link,target:"_blank",rel:"noopener noreferrer",className:"group flex flex-col sm:flex-row items-start justify-between gap-3 rounded-lg px-2 py-4 transition-colors hover:bg-background/60 dark:hover:bg-zinc-800/80 sm:items-center sm:px-3",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("span",{className:"text-sm leading-snug text-foreground transition-colors group-hover:text-cloudflare sm:text-base",children:n.title}),n.category&&e.jsx("span",{className:"block mt-1 text-xs text-muted-foreground sm:hidden",children:q[n.category]})]}),e.jsxs("div",{className:"flex shrink-0 items-center gap-2 pt-0.5 sm:pt-0",children:[e.jsx("span",{className:"hidden sm:inline",children:e.jsx(ee,{source:n.source})}),n.category&&e.jsx("span",{className:"hidden sm:inline text-xs px-2 py-0.5 rounded-full font-medium bg-secondary text-muted-foreground",children:q[n.category]}),e.jsx("span",{className:"whitespace-nowrap text-sm text-muted-foreground",children:Z(n.pubDate,n.dateLabel)}),e.jsx(w,{size:13,className:"hidden text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 sm:inline"})]})]},n.link))})}),e.jsxs("div",{className:"mt-6 flex items-center justify-between",children:[C?e.jsxs("button",{type:"button",onClick:()=>c(n=>Math.min(n+Ce,H.length)),className:"inline-flex items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground",children:["Show more ",e.jsx(O,{size:15})]}):l>W?e.jsxs("button",{type:"button",onClick:()=>c(W),className:"inline-flex items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground",children:["Show less ",e.jsx(O,{size:15,className:"rotate-180"})]}):e.jsx("span",{}),e.jsx(M,{to:"/writing",className:"text-sm text-cloudflare hover:underline underline-offset-4",children:"Browse all writing →"})]})]})]})})},S=[{title:"This Week in NET",desc:"Cloudflare's weekly show on Internet trends, security, and technology. 200+ episodes, produced and hosted from 2022 to 2026.",url:"https://thisweekinnet.com",tags:["Podcast","Editorial","Cloudflare"],group:"cloudflare",type:"podcast"},{title:"Cloudflare Blog",desc:"Data-led reporting and analysis of Internet trends, traffic shifts, security incidents, AI, and major global events. 80+ published posts.",url:"https://blog.cloudflare.com/author/joao-tome/",tags:["Writing","Data Storytelling","Internet Trends"],group:"cloudflare"},{title:"Made in Tech",desc:"Portuguese-language tech podcast covering innovation, careers, and the Internet. Co-hosted with Dinheiro Vivo, reaching thousands of listeners in Portugal.",url:"https://www.podchaser.com/podcasts/dinheiro-vivo-made-in-tech-pod-1581233",tags:["Podcast","Portuguese"],group:"personal",type:"podcast"},{title:"Focus & Life",desc:"A source-aware knowledge library of quotations, ideas and historical moments across science, technology, literature, philosophy, art and music.",url:"https://focus-life.pages.dev/",tags:["Knowledge Library","Culture","History"],group:"personal"}
47,{title:"Radar Display",desc:"Cloudflare's globe-based real-time visualization platform — showing live Internet traffic, attacks, and trends. Product manager and lead data editor.",url:"https://radar.cloudflare.com/display/traffic-patterns",tags:["Product","Data Visualization","Cloudflare Radar"],group:"cloudflare"},{title:"World Cup 2026 Dashboard",desc:"How the 2026 World Cup moved the Internet — real-time traffic shifts, country-by-country breakdowns, and match-day patterns.",url:"https://worldcup-2026-dashboard.pages.dev",tags:["Data Storytelling","Internet Trends"],group:"personal"},{title:"2026 Eclipse Internet Traffic Tracker",desc:"An interactive analysis of Internet traffic during the 12 August 2026 total solar eclipse, using country and regional Cloudflare Radar data.",url:"https://eclipse2026.joaotome.com/",tags:["Data Storytelling","Cloudflare Radar","Internet Traffic"],group:"personal"},{title:"Are summer nights getting warmer?",desc:"A city-by-city comparison of May–August 2026 temperatures, overnight minimums, and historical baselines across Europe and North America.",url:"https://temperatures-trends.joaotome.com/",tags:["Data Storytelling","Climate","Interactive Dashboard"],group:"personal"},{title:"Europe online, Europe together?",desc:"A historical comparison of online social-network use and weekly social contact by age, using Eurostat and European Social Survey data.",url:"https://joaotome.com/europe-online-social-ties.html",tags:["Data Storytelling","Social Research","Interactive Dashboard"],group:"personal"},{title:"Ask Emot",desc:"An AI agent trained on my work and writing — answers questions about Internet trends, Cloudflare data, and my background.",url:"https://ask-emot.joaotome.workers.dev",tags:["AI Agent","Cloudflare Workers"],group:"personal"},{title:"Casa Magia",desc:"A Harry Potter-themed site of book covers and games — a creative project made for my kid.",url:"https://casamagia.org",tags:["Creative","Family"],group:"personal"},{title:"Time Capsule",desc:"A site for writing messages meant for the future — exploring memory, privacy, and delayed communication.",url:"https://timecapsule.thebookoflives.org",tags:["Creative","Editorial"],group:"personal"},{title:"Starlink World Penetration",desc:"An interactive map tracking where Starlink traffic is growing — built from Cloudflare Radar data.",url:"https://starlink-traffic-map-2026.pages.dev",tags:["Data Visualization","Cloudflare Radar"],group:"cloudflare"},{title:"Hacker News CF Board",desc:"A live board surfacing Cloudflare-related posts and discussions on Hacker News in real time.",url:"https://hn-cloudflare-board-v2.pages.dev",tags:["Real-time","Editorial Tool"],group:"cloudflare"},{title:"Socials & Blog Analytics",desc:"Internal dashboards tracking performance of the Cloudflare Blog and social channels — used by the comms team.",tags:["Analytics","Internal"],group:"cloudflare",private:!0}],$e=["https://eclipse2026.joaotome.com/","https://temperatures-trends.joaotome.com/","https://joaotome.com/europe-online-social-ties.html","https://worldcup-2026-dashboard.pages.dev","https://focus-life.pages.dev/","https://timecapsule.thebookoflives.org","https://casamagia.org"],Ee=()=>{const[s,t]=d.useState("selected"),a=s==="selected"?$e.flatMap(r=>S.filter(l=>{var c;return((c=l.url)==null?void 0:c.replace(/\/$/,""))===r.replace(/\/$/,"")})):s==="all"?S:s==="podcasts"?S.filter(r=>r.type==="podcast"):S.filter(r=>r.group===s);return e.jsx("section",{id:"projects",className:"py-14 sm:py-20 px-5 sm:px-6",children:e.jsxs("div",{className:"max-w-5xl mx-auto",children:[e.jsx(p,{children:e.jsxs("div",{className:"mb-10",children:[e.jsx("h2",{className:"text-3xl font-serif font-bold text-foreground mb-2",children:"Projects"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-6",children:"Selected projects across podcasts, data storytelling, editorial products, and experiments."}),e.jsx("div",{className:"flex gap-2 flex-wrap",children:["selected","all","podcasts","personal","cloudflare"].map(r=>e.jsx("button",{onClick:()=>t(r),"aria-pressed":s===r,className:`px-4 min-h-11 rounded-full text-sm font-medium transition-colors ${s===r?"bg-foreground text-background":"bg-secondary text-muted-foreground hover:text-foreground"}
47`,children:r==="selected"?"Selected":r==="all"?"All":r==="podcasts"?"Podcasts":r==="personal"?"Personal":"At Cloudflare"},r))})]})}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4",children:a.map(r=>r.url?e.jsx("a",{href:r.url,target:"_blank",rel:"noopener noreferrer",className:"group flex flex-col h-full p-5 rounded-xl border border-border bg-background dark:bg-card hover:border-cloudflare/40 transition-colors",children:e.jsx(se,{project:r})},r.title):e.jsx("div",{className:"flex flex-col h-full p-5 rounded-xl border border-border bg-background dark:bg-card opacity-70",children:e.jsx(se,{project:r})},r.title))}),s==="selected"&&e.jsxs("button",{type:"button",onClick:()=>t("all"),className:"mt-5 min-h-11 text-sm text-muted-foreground hover:text-foreground",children:["See all projects (",S.length,") →"]})]})})},se=({project:s})=>e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-start justify-between gap-2 mb-2",children:[e.jsx("h3",{className:"font-semibold text-foreground text-sm group-hover:text-cloudflare transition-colors leading-snug",children:s.title}),s.private?e.jsx(pe,{size:13,className:"text-muted-foreground shrink-0 mt-0.5"}):e.jsx(w,{size:13,className:"text-muted-foreground shrink-0 mt-0.5 opacity-0 group-hover:opacity-100 transition-opacity"})]}),e.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed flex-1 mb-3",children:s.desc}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:s.tags.map(t=>e.jsx("span",{className:"text-xs px-2 py-0.5 rounded-full bg-secondary text-muted-foreground",children:t},t))})]}),Se=[{icon:me,label:"Data Storytelling",desc:"Internet trends into multimedia narratives — 80+ Cloudflare posts, cited by CNN, NYT, BBC."},{icon:ge,label:"Podcasting & Shows",desc:"Host of This Week in NET and Made in Tech — 200+ English and Portuguese episodes."},{icon:ve,label:"Builder",desc:"Dashboards, AI agents, and editorial tools shipped with LLM-assisted workflows."},{icon:xe,label:"Journalism",desc:"Two decades as editor, presenter, and coordinator across print, TV, and digital."}],Ae=()=>e.jsx("section",{id:"about-teaser",className:"py-14 sm:py-20 px-5 sm:px-6 bg-secondary/20 dark:bg-secondary/10",children:e.jsxs("div",{className:"max-w-5xl mx-auto",children:[e.jsx(p,{children:e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4 mb-8",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-3xl font-serif font-bold text-foreground mb-1",children:"About"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Data Editor · Storyteller · Journalist"})]}),e.jsxs("div",{className:"flex items-center gap-3 shrink-0",children:[e.jsxs("a",{href:"/resume-joao-tome.pdf",download:!0,className:"inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-cloudflare text-white hover:bg-cloudflare/90 transition-colors text-sm font-medium",children:[e.jsx(fe,{size:14}),"Resume"]}),e.jsxs(M,{to:"/about",className:"inline-flex items-center gap-1.5 px-4 py-2 rounded-lg border border-border bg-background hover:border-cloudflare hover:text-cloudflare transition-colors text-sm font-medium whitespace-nowrap",children:["Full profile ",e.jsx(re,{size:14})]})]})]})}),e.jsxs(p,{children:[e.jsxs("p",{className:"text-muted-foreground leading-relaxed max-w-3xl mb-4",children:["From 2021 to July 2026, I led storytelling and data editing at Cloudflare, turning complex Internet trends into clear narratives and interactive experiences. I was the product manager for Radar Display — Cloudflare's globe-based visualization platform — and hosted the weekly show ",e.jsx("a",{href:"https://thisweekinnet.com",target:"_blank",rel:"noopener noreferrer",className:"text-foreground underline underline-offset-4 hover:text-cloudflare transition-colors",children:"This Week in NET"}),"."]}),e.jsx("p",{className:"text-muted-foreground leading-relaxed max-w-3xl mb-10",children:"With over two decades in journalism — covering technology, cinema, and the automotive industry as editor, presenter, and podcast host — my analysis has been cited by CNN, the New York Times, BBC, and others. I'm also a fluent builder: I've shipped data dashboards, AI agents, editorial products, and interactive tools, mostly using LLM-assisted development workflows."}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4",children:Se.map(({icon:s,label:t,desc:a})=>e.jsxs("div",{className:"flex flex-col gap-2 p-4 rounded-xl border border-border bg-background dark:bg-card",children:[e.jsxs("div",{className:"flex items-center gap-2 text-foreground",children:[e.jsx(s,{size:16,className:"text-cloudflare shrink-0"}),e.jsx("span",{className:"font-semibold text-sm",children:t})]}),e.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:a})]},t))})]})]})});function Te(s){const t=[[242,70,105,"#dda28d"],[317,64,145,"#e6c583"],[385,65,120,"#a5bbb0"],[457,67,100,"#d7a6a0"],[615,85,137,"#e4c982"],[704,72,177,"#b0c3bc"],[780,92,152,"#dea98b"],[877,89,115,"#b5c7cb"]];function a([o,h,g,_],D){const f=278-g,$=Math.max(2,Math.floor(h/24));let x="";for(let N=0;N<Math.floor((g-28)/31);N++)for(let E=0;E<$;E++){const k=o+12+E*(h-24)/$,m=f+20+N*31;x+=`<g><rect x="${k-2}" y="${m-2}" width="16" height="22" fill="#eee5d4"/><rect x="${k}" y="${m}" width="12" height="18" fill="#486169"/><path d="M${k+6} ${m}v18m-6-9h12" stroke="#e6ded0" stroke-width="1.4"/><path d="M${k-3} ${m+21}h18" stroke="#6c7c76" stroke-width="2"/>${N===1?`<path d="M${k-4} ${m+17}v8h20v-8m-15 0v8m5-8v8m5-8v8" fill="none" stroke="#465452" stroke-width="1"/>`:""}</g>`}return`<g class="lisbon-building" style="--arrival:${D*85}ms"><path d="M${o+h} ${f}l9-8v${g}l-9 8" fill="#7a8277"/><rect x="${o}" y="${f}" width="${h}" height="${g}" fill="${_}"/><path d="M${o-4} ${f}l12-17h${h-13}l9 17z" fill="#b57457"/><path d="M${o+8} ${f-17}h${h-13}l9 17" fill="none" stroke="#d39770" stroke-width="3"/><rect x="${o+h-18}" y="${f-28}" width="7" height="17" fill="#e5d2b5"/><path d="M${o-2} ${f+3}h${h+4}M${o} 270h${h}" stroke="#f0e4d0" stroke-width="5"/>${x}<rect x="${o+h/2-8}" y="255" width="16" height="23" rx="6" fill="#506461"/></g>`}const r='<g class="lisbon-building" style="--arrival:420ms">
47<path d="M524 278V159h73v119" fill="#e6d8bd"/><path d="M520 160l41-24 40 24" fill="#f4e9d3"/><path d="M536 139v-24h49v24" fill="#d7c6a7"/><path d="M533 115c0-46 55-46 55 0z" fill="#92aaa3"/><path d="M561 78V61m-5 7h10" stroke="#748b82" stroke-width="3"/><path d="M540 278v-67a21 21 0 0 1 42 0v67" fill="#647a78"/><path d="M524 171h73m-63 0v100m54-100v100" stroke="#f5ebd7" stroke-width="6"/><circle cx="561" cy="157" r="6" fill="#82928a"/></g>';s.innerHTML=`<div class="lisbon-signoff"><span>From Lisbon, with curiosity.</span><button type="button" class="lisbon-replay" aria-label="Replay the Lisbon animation">Replay</button></div><svg class="lisbon-art" viewBox="0 0 980 330" role="img" aria-labelledby="lisbon-title"><title id="lisbon-title">Lisbon-inspired pastel buildings, a domed church, terracotta roofs, and a yellow tram</title><defs><pattern id="lisbon-paving" width="24" height="10" patternUnits="userSpaceOnUse"><path d="M0 5Q6 0 12 5T24 5" stroke="#89938c" stroke-width="1" fill="none" opacity=".35"/></pattern></defs><circle class="lisbon-sun" cx="758" cy="67" r="32" fill="#e8be77" opacity=".55"/><path d="M0 246Q145 160 286 220T590 205T980 205V291H0Z" fill="currentColor" opacity=".045"/>${t.map(a).join("")}${r}<path d="M0 279H980V309H0Z" fill="url(#lisbon-paving)"/><path d="M0 298H980M0 302H980" stroke="#92988e" stroke-width="1" opacity=".6"/><g class="lisbon-tram"><path d="M434 283h107v-48q0-8-8-8h-83q-8 0-8 8z" fill="#e3b747"/><path d="M439 252h102v16H439z" fill="#f5e9c8"/><rect x="447" y="233" width="18" height="20" rx="2" fill="#486169"/><rect x="470" y="233" width="18" height="20" rx="2" fill="#486169"/><rect x="493" y="233" width="18" height="20" rx="2" fill="#486169"/><rect x="517" y="234" width="16" height="42" rx="2" fill="#526e70"/><path d="M437 226h103" stroke="#52605b" stroke-width="5"/><path d="M477 224l17-19 16 19" fill="none" stroke="#52605b" stroke-width="2"/><circle cx="456" cy="287" r="7" fill="#43524f"/><circle cx="523" cy="287" r="7" fill="#43524f"/><circle cx="444" cy="273" r="3" fill="#fff1b4"/><text x="478" y="278" font-family="Georgia,serif" font-size="12" fill="#4d5147">28</text></g><path d="M0 316Q200 308 400 318T980 315" stroke="#86afbc" stroke-width="2" fill="none" opacity=".5"/></svg>`;const l=s.querySelector("svg");l.setAttribute("viewBox","0 0 980 420"),l.querySelector("title").textContent="An illustrated Lisbon: Ponte 25 de Abril, Torre de Belém, Pastéis de Belém, a tram, and ceramic tributes to Barcelos and Caldas da Rainha. A composed scene, not a geographical map.";const c=`<g class="lisbon-bridge" fill="none" stroke="#ad6451" stroke-linejoin="round"><title>Ponte 25 de Abril</title><path d="M0 122H980" stroke-width="6"/><path d="M0 132H980" stroke-width="2"/><path d="M207 145V39h22v106M751 145V39h22v106" stroke-width="7"/><path d="M207 58h22m-22 23h22m-22 24h22m522-47h22m-22 23h22m-22 24h22" stroke-width="4"/><path d="M0 104Q130 102 218 35Q490 192 762 35Q860 101 980 104" stroke-width="3"/>${Array.from({length:27},(o,h)=>{const g=239+h*19,_=35+78*(1-Math.pow((g-490)/272,2));return`<path d="M${g} ${_}V120" stroke-width="1"/>`}).join("")}<path d="M0 124l15 8 15-8 15 8 15-8 15 8 15-8 15 8 15-8 15 8 15-8 15 8 15-8" stroke-width="1"/></g>`;l.querySelector("defs").insertAdjacentHTML("afterend",c);const i=[...l.querySelectorAll(":scope > .lisbon-building")];i[i.length-1].remove();const u=`<g class="lisbon-building" style="--arrival:160ms" stroke="#b2a48a" stroke-width="1"><title>Torre de Belém</title><path d="M47 280v-52l26-18h125l27 18v52z" fill="#dbcbb0"/><path d="M92 229V113h79v116" fill="#e8dcc5"/><path d="M171 113l15-9v125h-15" fill="#c8b99c"/><path d="M87 113V99h10v7h10v-7h10v7h10v-7h10v7h10v-7h10v7h10v-7h10v14z" fill="#eee3cd"/><path d="M91 145h81m-81 30h81m-81 29h81" stroke="#b8a88a" stroke-width="3"/><path d="M87 191h89v13H87z" fill="#f3e7cd"/>${[105,128,151].map(o=>`<path d="M${o} 191v-11a6 6 0 0 1 12 0v11" fill="#727d73"/><path d="M${o} 131v-9h10v9m-10 35v-10h10v10" fill="#6d786e"/>`).join("")}<path d="M111 228v-14h35v14" fill="#66756b"/><path d="M47 232h177v11H47z" fill="#ece1c9"/>${[55,195].map(o=>`<g><path d="M${o} 242v-39h19v39" fill="#eee1c4"/><path d="M${o-3} 204q0-15 12-20q12 5 12 20z" fill="#d3c2a2"/><path d="M${o+9} 184v-8"/><path d="M${o+7} 217v9h5v-9z" fill="#687568"/></g>`).join("")}
47<path d="M77 264v-9h10v9m18 0v-9h10v9m18 0v-9h10v9m18 0v-9h10v9" fill="#748075"/><path d="M40 281h192" stroke-width="4"/></g>`,j=`<g class="lisbon-building" style="--arrival:540ms"><title>Pastéis de Belém, an illustrated blue-and-white shopfront</title><path d="M530 278V167h80v111" fill="#f1e7d3" stroke="#c6bba4"/><path d="M526 168l10-12h69l10 12" fill="#b6795a"/><path d="M532 178h76v19h-76z" fill="#2f6484"/><text x="570" y="186" text-anchor="middle" fill="#fff7df" font-size="6" font-family="Georgia,serif">PASTÉIS DE BELÉM</text><text x="570" y="193" text-anchor="middle" fill="#fff7df" font-size="4.5">DESDE 1837</text>${[540,565,590].map(o=>`<path d="M${o} 260v-44a9 9 0 0 1 18 0v44z" fill="#355e71"/><path d="M${o-1} 225h20" stroke="#efe4cb" stroke-width="2"/>`).join("")}<path d="M530 266h80v12h-80z" fill="#376b8a"/>${Array.from({length:10},(o,h)=>`<path d="M${533+h*8} 267l3 5-3 5-3-5z" fill="#eee6d7"/>`).join("")}</g>`,C=`<g class="lisbon-keepsakes" style="--arrival:850ms"><title>Portuguese keepsakes: Galo de Barcelos, pastéis, and Zé Povinho from Caldas da Rainha</title><ellipse cx="795" cy="369" rx="131" ry="10" fill="#526565" opacity=".1"/>
48  <g transform="translate(685 286)"><title>Galo de Barcelos</title><path d="M28 57C-4 45-2 9 13 10C8 32 31 32 29 7C50 12 52 35 37 46" fill="#243737"/><path d="M24 59q-7-18 7-27q7-4 9-20q2-10 12-8q14 3 6 17q-9 11-4 24q-5 25-30 14" fill="#233333"/><path d="M43 7q-7-13 0-13q6 0 6 7q4-13 9-9q5 3-1 11q13-2 10 5l-12 5" fill="#be4c39"/><path d="M59 15l13 5-13 4" fill="#ddb357"/><circle cx="53" cy="13" r="2.5" fill="#fff5d6"/><circle cx="54" cy="13" r="1" fill="#233333"/><path d="M54 25q9 12 1 13q-9-2-1-13" fill="#c94e3c"/><path d="M34 59v15m10-16v16m-18 0h25" stroke="#c99443" stroke-width="3"/><path d="M25 40q0-8 7-5q7-5 7 3q0 5-8 11q-6-5-6-9" fill="#d95342"/>${[0,1,2].map(o=>`<circle cx="${12+o*5}" cy="${24+o*6}" r="2.5" fill="${["#edc75f","#80b8b2","#f7e9ca"][o]}"/>`).join("")}<ellipse cx="37" cy="78" rx="22" ry="4" fill="#568b80"/></g>
49  <g transform="translate(777 337)"><title>Pastéis de Belém on a blue-and-white plate</title><ellipse cx="12" cy="26" rx="38" ry="10" fill="#3b7496"/><ellipse cx="12" cy="24" rx="33" ry="7" fill="#f0e7d6"/>${[-8,14,31].map((o,h)=>`<path d="M${o-10} ${12+h%2*4}l3 12h15l4-12z" fill="#bd8541"/><ellipse cx="${o+1}" cy="${12+h%2*4}" rx="11" ry="5" fill="#e9ba54"/><path d="M${o-5} ${11+h%2*4}l5-2 4 3-3 2z" fill="#9b602f"/>`).join("")}</g>
50  <g transform="translate(852 283)"><title>Zé Povinho, a ceramic tribute to Caldas da Rainha</title><ellipse cx="21" cy="82" rx="30" ry="5" fill="#6c8b68"/><path d="M1 72l5-34h34l7 34z" fill="#76583b"/><path d="M7 41l13 20 18-21" fill="#ece0c8"/><path d="M9 73l-2 8h16l1-8m12 0v8h17l-7-8" fill="#343d35"/><ellipse cx="25" cy="26" rx="17" ry="19" fill="#d5a276"/><path d="M8 24q-6 16 5 22l2-17m24-7q10 18-4 25l-2-18" fill="#4b4535"/><path d="M6 14q3-20 26-16q12 1 13 16z" fill="#423f32"/><ellipse cx="24" cy="15" rx="26" ry="5" fill="#514b36"/><circle cx="20" cy="26" r="1.4" fill="#3d3b32"/><circle cx="31" cy="26" r="1.4" fill="#3d3b32"/><path d="M24 27l-3 6h8m-13 5q10-7 19 0" stroke="#71503a" stroke-width="2" fill="none"/><path d="M5 47l16 12 17-14m-1 1l-4-9" stroke="#c89166" stroke-width="9" stroke-linecap="round" fill="none"/><path d="M1 45l9 8m24-6 7-8" stroke="#826143" stroke-width="12"/></g></g>`;l.insertAdjacentHTML("beforeend",`<path d="M0 316h980v96H0z" fill="#83afb5" opacity=".07"/><path d="M25 343q130-8 260 0t260 0m-460 23q100-7 200 0t240 0" fill="none" stroke="#83aeb4" opacity=".35"/>${u}${j}${C}`);const n=document.createElement("p");n.className="lisbon-caption",n.textContent="Lisboa à beira do Tejo. With a little of Barcelos and Caldas da Rainha.",s.append(n)}function Ie(){const s=d.useRef(null);return d.useEffect(()=>{const t=s.current;if(!t)return;const a=window.matchMedia("(prefers-reduced-motion: reduce)");let r=null;const l=()=>{t.dataset.drawn!=="true"&&(Te(t),t.dataset.drawn="true",r=t.querySelector("button"),r==null||r.addEventListener("click",c))},c=()=>{l(),t.classList.remove("is-waiting","is-arriving"),!a.matches&&(t.offsetWidth,t.classList.add("is-arriving"))};let i;return"IntersectionObserver"in window&&!a.matches?(t.classList.add("is-waiting"),i=new IntersectionObserver(u=>{u.some(j=>j.isIntersecting)&&(c(),i==null||i.disconnect())},{rootMargin:"800px 0px",threshold:.01}),i.observe(t)):c(),a.addEventListener("change",c),()=>{i==null||i.disconnect(),a.removeEventListener("change",c),r==null||r.removeEventListener("click",c),t.classList.remove("is-waiting","is-arriving"),delete t.dataset.drawn,t.replaceChildren()}},[]),e.jsx("section",{ref:s,className:"lisbon-scene","aria-label":"An illustrated farewell from Lisbon"})}const ze=d.lazy(()=>v(()=>import("./ThisWeekInNET-B68PPVpz.js"),__vite__mapDeps([0,1,2,3,4,5]))),Le=d.lazy(()=>v(()=>import("./Experience-Def4GMEG.js"),__vite__mapDeps([6,1,2,3,5,7]))),Pe=d.lazy(()=>v(()=>import("./InteractiveGlobe-Ck4trIOw.js"),__vite__mapDeps([8,1,2,3,5]))),qe=d.lazy(()=>v(()=>import("./Contact-BpmKIAdT.js"),__vite__mapDeps([9,1,2,3,5]))),De=d.lazy(()=>v(()=>import("./Closing-BO8NN_5W.js"),__vite__mapDeps([10,1,2,3]))),Je=()=>{const s=oe();return le({title:"João Tomé | Data Editor, Writer, Storyteller",description:"João Tomé is an Internet Data Research Editor at IPinfo, writer, storyteller, and former Cloudflare host of This Week in NET, based in Lisbon, Portugal.",canonicalPath:"/"}),d.useEffect(()=>{const t=()=>
50{v(()=>import("./ThisWeekInNET-B68PPVpz.js"),__vite__mapDeps([0,1,2,3,4,5])),v(()=>import("./Experience-Def4GMEG.js"),__vite__mapDeps([6,1,2,3,5,7])),v(()=>import("./Contact-BpmKIAdT.js"),__vite__mapDeps([9,1,2,3,5])),v(()=>import("./Closing-BO8NN_5W.js"),__vite__mapDeps([10,1,2,3]))},a=typeof window.requestIdleCallback=="function"?window.requestIdleCallback(t,{timeout:2e3}):window.setTimeout(t,1200);return()=>{typeof window.cancelIdleCallback=="function"&&typeof a=="number"?window.cancelIdleCallback(a):window.clearTimeout(a)}},[]),d.useEffect(()=>{if(s.hash){const t=s.hash.slice(1),a=(r=0)=>{const l=document.getElementById(t);l?l.scrollIntoView({behavior:"smooth"}):r<10&&setTimeout(()=>a(r+1),100)};a()}},[s.hash]),e.jsxs("div",{className:"min-h-screen",children:[e.jsx(ne,{}),e.jsxs("main",{children:[e.jsx(ye,{}),e.jsx(_e,{}),e.jsx(Ee,{}),e.jsx(d.Suspense,{fallback:e.jsx("div",{className:"py-20"}),children:e.jsx(ze,{})}),e.jsx(d.Suspense,{fallback:e.jsx("div",{className:"py-20"}),children:e.jsx(Le,{})}),e.jsx(Ne,{}),e.jsx(d.Suspense,{fallback:e.jsx("div",{className:"py-20"}),children:e.jsx(Pe,{})}),e.jsx(Ae,{}),e.jsx(d.Suspense,{fallback:e.jsx("div",{className:"py-20"}),children:e.jsx(qe,{})}),e.jsx(d.Suspense,{fallback:e.jsx("div",{className:"py-12"}),children:e.jsx(De,{})})]}),e.jsx(Ie,{}),e.jsx(ie,{})]})};export{Je as default};

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.