1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7652],{10880:(e,t,a)=>{"use strict";a.d(t,{rT:()=>r});let r=e=>{switch(e){case"kph":return"km/h";case"mph":return"mph";default:return e}}},12188:(e,t,a)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/[citySlug]",function(){return a(43991)}])},18847:(e,t,a)=>{e.exports=a(75808)},29479:(e,t,a)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return m}});let r=a(72687)._(a(14232)),s=a(41413),n=[],l=[],i=!1;function o(e){let t=e(),a={loading:!0,loaded:null,error:null};return a.promise=t.then(e=>(a.loading=!1,a.loaded=e,e)).catch(e=>{throw a.loading=!1,a.error=e,e}),a}class c{constructor(e,t){this._loadFn=e,this._opts=t,this._callbacks=new Set,this._delay=null,this._timeout=null,this.retry()}promise(){return this._res.promise}retry(){this._clearTimeouts(),this._res=this._loadFn(this._opts.loader),this._state={pastDelay:!1,timedOut:!1};let{_res:e,_opts:t}=this;e.loading&&("number"==typeof t.delay&&(0===t.delay?this._state.pastDelay=!0:this._delay=setTimeout(()=>{this._update({pastDelay:!0})},t.delay)),"number"==typeof t.timeout&&(this._timeout=setTimeout(()=>{this._update({timedOut:!0})},t.timeout))),this._res.promise.then(()=>{this._update({}),this._clearTimeouts()}).catch(e=>{this._update({}),this._clearTimeouts()}),this._update({})}_update(e){this._state={...this._state,error:this._res.error,loaded:this._res.loaded,loading:this._res.loading,...e},this._callbacks.forEach(e=>e())}_clearTimeouts(){clearTimeout(this._delay),clearTimeout(this._timeout)}getCurrentValue(){return this._state}subscribe(e){return this._callbacks.add(e),()=>{this._callbacks.delete(e)}}}function d(e){return function(e,t){let a=Object.assign({loader:null,loading:null,delay:200,timeout:null,webpack:null,modules:null},t),n=null;function o(){if(!n){let t=new c(e,a);n={getCurrentValue:t.getCurrentValue.bind(t),subscribe:t.subscribe.bind(t),retry:t.retry.bind(t),promise:t.promise.bind(t)}}return n.promise()}if(!i){let e=a.webpack&&1?a.webpack():a.modules;e&&l.push(t=>{for(let a of e)if(t.includes(a))return o()})}function d(e,t){let l;o(),(l=r.default.useContext(s.LoadableContext))&&Array.isArray(a.modules)&&a.modules.forEach(e=>{l(e)});let i=r.default.useSyncExternalStore(n.subscribe,n.getCurrentValue,n.getCurrentValue);return r.default.useImperativeHandle(t,()=>({retry:n.retry}),[]),r.default.useMemo(()=>{var t;return i.loading||i.error?r.default.createElement(a.loading,{isLoading:i.loading,pastDelay:i.pastDelay,timedOut:i.timedOut,error:i.error,retry:n.retry}):i.loaded?r.default.createElement((t=i.loaded)&&t.default?t.default:t,e):null},[e,i])}return d.preload=()=>o(),d.displayName="LoadableComponent",r.default.forwardRef(d)}(o,e)}function u(e,t){let a=[];for(;e.length;){let r=e.pop();a.push(r(t))}return Promise.all(a).then(()=>{if(e.length)return u(e,t)})}d.preloadAll=()=>new Promise((e,t)=>{u(n).then(e,t)}),d.preloadReady=(e=[])=>new Promise(t=>{let a=()=>(i=!0,t());u(l,e).then(a,a)}),window.__NEXT_PRELOADREADY=d.preloadReady;let m=d},41413:(e,t,a)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"LoadableContext",{enumerable:!0,get:function(){return r}});let r=a(72687)._(a(14232)).default.createContext(null)},43991:(e,t,a)=>{"use strict";a.r(t),a.d(t,{__N_SSP:()=>j,default:()=>w});var r=a(37876),s=a(18847),n=a.n(s),l=a(77328),i=a.n(l),o=a(48230),c=a.n(o),d=a(89099),u=a(14232),m=a(66021);function p({city:e}){let[t,a]=(0,u.useState)(new Date),[s,n]=(0,u.useState)(!0);(0,u.useEffect)(()=>{let e=setInterval(()=>{a(new Date),n(e=>!e)},1e3);return()=>clearInterval(e)},[]);let[l,i]=new Intl.DateTimeFormat("en-US",{hour:"numeric",minute:"2-digit",hour12:!1,timeZone:e.timezone}).format(t).split(":"),o=`${l}${s?":":" "}${i}`;return(0,r.jsxs)("div",{className:"mt-4 text-sm text-gray-600 text-right",children:["The local time in ",e.name," is ",o]})}var h=a(49915),y=a(85392),f=a(74),x=a(93408),g=a(73865);let b=n()(()=>Promise.all([a.e(1808),a.e(9863),a.e(3368),a.e(7707),a.e(8070)]).then(a.bind(a,68070)),{loadableGenerated:{webpack:()=>[68070]},ssr:!1});var j=!0;function w({city:e,networks:t,relatedCities:a}){let s=(0,d.useRouter)(),{t:n}=(0,g.B)();if((0,u.useEffect)(()=>{e&&window.gtag&&window.gtag("event","page_view",{page_title:`${e.name} Train Tracker | trains.fyi`,page_location:window.location.href,page_path:`/${e.slug}/`})},[e]),s.isFallback||!e)return(0,r.jsx)("div",{children:"Loading..."});let l=[{name:n("cities"),href:"/cities",current:!1},{name:e.name,href:`/${e.slug}`,current:!0}],o=t.map(e=>e.name),j=t.length,_=`Track ${j} transit network${1!==j?"s":""} live in ${e.name}${e.state?`, ${e.state}`:""}. See real-time train, light rail, and streetcar positions${o.length>0?` for ${o.slice(0,3).join(", ")}${o.length>3?` and ${o.length-3} more`:""}`:""}.`,v={"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:"https://trains.fyi/"},{"@type":"ListItem",position:2,name:"Cities",item:"https://trains.fyi/cities/"},{"@type":"ListItem",position:3,name:e.name,item:`https://trains.fyi/${e.slug}/`}]},N={"@context":"https://schema.org","@type":"WebPage",name:`${e.name} Train Tracker`,description:_,url:`https://trains.fyi/${e.slug}/`,isPartOf:{"@type":"WebSite",name:"trains.fyi",url:"https://trains.fyi/"},about:{"@type":"City",name:e.name,containedInPlace:e.state?{"@type":"State",name:e.state,containedInPlace:{"@type":"Country",name:e.country}}:{"@type":"Country",name:e.country},geo:{"@type":"GeoCoordinates",latitude:e.map.lat,longitude:e.map.lng}},mainEntity:{"@type":"ItemList",name:`Transit Networks in ${e.name}`,numberOfItems:j,itemListElement:t.map((e,t)=>({"@type":"ListItem",position:t+1,name:e.name,url:`https://trains.fyi/networks/${e.slug}/`}))}},k={"@context":"https://schema.org","@type":"FAQPage",mainEntity:[{"@type":"Question",name:`How does trains.fyi track trains in ${e.name}
1?`,acceptedAnswer:{"@type":"Answer",text:`trains.fyi uses real-time GTFS data published by transit agencies in ${e.name} to show live vehicle positions on the map. Positions update approximately every 30 seconds.`}},{"@type":"Question",name:`Which transit networks are tracked in ${e.name}?`,acceptedAnswer:{"@type":"Answer",text:`We currently track ${j} network${1!==j?"s":""} in ${e.name}: ${o.join(", ")}.`}},{"@type":"Question",name:"Is the train data accurate?",acceptedAnswer:{"@type":"Answer",text:"Train positions come directly from official transit agency data feeds. While we strive for accuracy, real-time data can occasionally have brief delays or gaps."}}]};return(0,r.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,r.jsx)(x.A,{title:`${e.name} Train Tracker`,description:_,canonical:`/${e.slug}/`,image:`/api/og?city=${encodeURIComponent(e.name)}&networks=${encodeURIComponent(o.slice(0,3).join(","))}&count=${j}`,type:"website",keywords:`${e.name} trains, ${e.name} train map, ${e.name} transit tracker, ${e.name} light rail, live trains ${e.name}, ${o.join(", ")}`}),(0,r.jsxs)(i(),{children:[(0,r.jsx)("script",{type:"application/ld+json",dangerouslySetInnerHTML:{__html:JSON.stringify(v)}}),(0,r.jsx)("script",{type:"application/ld+json",dangerouslySetInnerHTML:{__html:JSON.stringify(N)}}),(0,r.jsx)("script",{type:"application/ld+json",dangerouslySetInnerHTML:{__html:JSON.stringify(k)}})]}),(0,r.jsx)(f.A,{}),(0,r.jsxs)("main",{className:"flex-grow",children:[(0,r.jsxs)("div",{className:"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8",children:[(0,r.jsx)("div",{className:"py-4",children:(0,r.jsx)(h.A,{pages:l})}),(0,r.jsxs)("div",{className:"my-8",children:[(0,r.jsx)("h1",{className:"text-5xl text-gray-900 font-bold mb-4",children:n("cityTrainTracker").replace("{name}",e.name)}),(0,r.jsx)("p",{className:"text-xl text-gray-500",children:n("citySubtitle").replace("{name}",e.name)})]})]}),(0,r.jsxs)("div",{className:"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 pb-8",children:[(0,r.jsx)("h2",{className:"text-2xl font-semibold text-gray-900 mb-4",children:n("cityLiveMapH2").replace("{name}",e.name)}),(0,r.jsx)("div",{className:"h-[600px]",children:(0,r.jsx)(b,{citySlug:e.slug,initialCenter:[Number(e.map.lat),Number(e.map.lng)],initialZoom:11,height:600})}),(0,r.jsx)(p,{city:e}),(0,r.jsx)("h2",{className:"text-2xl font-semibold mt-12 text-gray-900 mb-4",children:n("cityNetworksH2").replace("{name}",e.name)}),(0,r.jsx)("div",{className:"grid gap-6 sm:grid-cols-2 lg:grid-cols-3",children:t.map(e=>(0,r.jsx)(m.A,{network:e},e.slug))}),(0,r.jsxs)("section",{className:"mt-16",children:[(0,r.jsx)("h2",{className:"text-2xl font-semibold text-gray-900 mb-4",children:n("cityAboutH2").replace("{name}",e.name)}),(0,r.jsx)("div",{className:"prose prose-gray max-w-none",children:(0,r.jsxs)("p",{className:"text-gray-600",children:[n("cityAboutTracks")," ",j," ",n(1!==j?"cityAboutNetworkPlural":"cityAboutNetworkSingular")," ",e.name,e.state?`, ${e.state}`:"",", ",e.country,".",j>0&&` ${n("cityAboutThisIncludes")} ${o.join(", ")}.`," ",n("cityAboutRealtime")]})}),(0,r.jsxs)("div",{className:"mt-8 space-y-4",children:[(0,r.jsx)("h3",{className:"text-lg font-semibold text-gray-900",children:n("cityFaqH3")}),(0,r.jsxs)("details",{className:"group border border-gray-200 rounded-lg",children:[(0,r.jsxs)("summary",{className:"flex cursor-pointer items-center justify-between p-4 text-gray-900 font-medium",children:[n("cityFaq1Q").replace("{name}",e.name),(0,r.jsx)("span",{className:"ml-2 text-gray-400 group-open:rotate-180 transition-transform",children:"â¼"})]}),(0,r.jsx)("div",{className:"px-4 pb-4 text-gray-600",children:n("cityFaq1A").replace("{name}",e.name)})]}),(0,r.jsxs)("details",{className:"group border border-gray-200 rounded-lg",children:[(0,r.jsxs)("summary",{className:"flex cursor-pointer items-center justify-between p-4 text-gray-900 font-medium",children:[n("cityFaq2Q").replace("{name}",e.name),(0,r.jsx)("span",{className:"ml-2 text-gray-400 group-open:rotate-180 transition-transform",children:"â¼"})]}),(0,r.jsx)("div",{className:"px-4 pb-4 text-gray-600",children:n("cityFaq2A").replace("{count}",j).replace("{s}",1!==j?"s":"").replace("{name}",e.name).replace("{networks}",o.join(", "))})]}),(0,r.jsxs)("details",{className:"group border border-gray-200 rounded-lg",children:[(0,r.jsxs)("summary",{className:"flex cursor-pointer items-center justify-between p-4 text-gray-900 font-medium",children:[n("cityFaq3Q"),(0,r.jsx)("span",{className:"ml-2 text-gray-400 group-open:rotate-180 transition-transform",children:"â¼"})]}),(0,r.jsx)("div",{className:"px-4 pb-4 text-gray-600",children:n("cityFaq3A")})]})]})]}),a.length>0&&(0,r.jsxs)("section",{className:"mt-16",children:[(0,r.jsx)("h2",{className:"text-2xl font-semibold text-gray-900 mb-4",children:n("cityMoreCitiesH2").replace("{country}",e.country)}),(0,r.jsx)("div",{className:"flex flex-wrap gap-2",children:a.map(e=>(0,r.jsx)(c(),{href:`/${e.slug}/`,className:"inline-flex items-center rounded-full bg-gray-100 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-200 transition-colors",children:e.name},e.slug))})]})]})]}),(0,r.jsx)(y.A,{})]})}},49915:(e,t,a)=>{"use strict";a.d(t,{A:()=>i});var r=a(37876),s=a(60570),n=a(48230),l=a.n(n);function i({pages:e}){return(0,r.jsx)("nav",{"aria-label":"Breadcrumb",className:"flex",children:(0,r.jsxs)("ol",{role:"list",className:"flex items-center space-x-4 pt-6",children:[(0,r.jsx)("li",{children:(0,r.jsx)("div",{children:(0,r.jsxs)(l(),{href:"/",className:"text-gray-400 hover:text-gray-500",children:[(0,r.jsx)(s.A,{"aria-hidden":"true",className:"h-5 w-5 flex-shrink-0"}),(0,r.jsx)("span",{className:"sr-only",children:"Home"})]})})}),e.map(e=>(0,r.jsx)("li",{children:(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)("svg",{fill:"currentColor",viewBox:"0 0 20 20","aria-hidden":"true",className:"h-5 w-5 flex-shrink-0 text-gray-300",children:(0,r.jsx)("path",{d:"M5.555 17.776l8-16 .894.448-8 16-.894-.448z"})}),(0,r.jsx)(l(),{href:e.href,"aria-current":e.current?"page":void 0,className:"ml-4 text-sm font-medium text-gray-500 hover:text-gray-700",children:e.name})]})},e.name))]})})}},60570:(e,t,a)=>{"use strict";a.d(t,{A:()=>s});var r=a(14232);let s=r.forwardRef(function({title:e,titleId:t,...a},s){return r.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:s,"aria-labelledby":t},a),e?r.createElement("title",{id:t},e):null,r.createElement("path",{fillRule:"evenodd",d:"M9.293 2.293a1 1 0 0 1 1.414 0l7 7A1 1 0 0 1 17 11h-1v6a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-6H3a1 1 0 0 1-.707-1.707l7-7Z",clipRule:"evenodd"}))})},66021:(e,t,a)=>{"use strict";a.d(t,{A:()=>m});var r=a(37876),s=a(6986),n=a(48230),l=a.n(n),i=a(14232),o=a(48166),c=a(99904),d=a(78240),u=a(10880);let m=({network:e})=>{let{convertSpeed:t,formatSpeed:a}=(0,o.t)(),{trains:n}=(0,d.nC)(),{counts:m}=(0,d.a2)(),p=m[e?.slug]??m[e?.slug?.toLowerCase()]??0,h=(0,i.useMemo)(()=>n?.byAgency&&e&&n.byAgency.get(e.slug.toLowerCase())||[],[n,e]),y=(0,i.useMemo)(()=>{let e=h.filter(e=>e.spd&&e.spd.value);return 0===e.length?null:{value:Math.round(e.reduce((e,a)=>e+t(a.spd.value,a.spd.unit,"kph"),0)/e.length),unit:"kph"}},[h,t]),f=(0,i.useMemo)(()=>{let t=e.cities?.[0];return t?c.L.getCity(t)?.name??null:null},[e]);return(0,r.jsxs)(l(),{href:`/networks/${e.slug}
1/`,className:"flex items-center gap-4 rounded-lg bg-white p-4 shadow-md hover:shadow-lg focus-within:ring-2 focus-within:ring-indigo-500 focus-within:ring-offset-2",children:[(0,r.jsx)("div",{className:"flex h-12 w-12 flex-none items-center justify-center rounded-lg",style:{backgroundColor:e.color},children:(0,r.jsx)(s.A,{className:"h-7 w-7",style:{color:e.textColor||"#ffffff"},"aria-hidden":"true"})}),(0,r.jsxs)("div",{className:"min-w-0 flex-auto",children:[(0,r.jsx)("h3",{className:"truncate text-xl font-medium text-gray-900",children:e.name}),(0,r.jsxs)("p",{className:"mt-1 truncate text-sm text-gray-500",children:[f&&`${f} \xb7 `,p," active train",1!==p?"s":"",null!==y&&` (${a(y.value,(0,u.rT)(y.unit))} avg)`]})]})]})}},75808:(e,t,a)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={default:function(){return c},noSSR:function(){return o}};for(var s in r)Object.defineProperty(t,s,{enumerable:!0,get:r[s]});let n=a(72687);a(37876),a(14232);let l=n._(a(29479));function i(e){return{default:e?.default||e}}function o(e,t){return delete t.webpack,delete t.modules,e(t)}function c(e,t){let a=l.default,r={loading:({error:e,isLoading:t,pastDelay:a})=>null};e instanceof Promise?r.loader=()=>e:"function"==typeof e?r.loader=e:"object"==typeof e&&(r={...r,...e});let s=(r={...r,...t}).loader;return(r.loadableGenerated&&(r={...r,...r.loadableGenerated},delete r.loadableGenerated),"boolean"!=typeof r.ssr||r.ssr)?a({...r,loader:()=>null!=s?s().then(i):Promise.resolve(i(()=>null))}):(delete r.webpack,delete r.modules,o(a,r))}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},77808:(e,t,a)=>{"use strict";a.d(t,{A:()=>s});var r=a(14232);let s=r.forwardRef(function({title:e,titleId:t,...a},s){return r.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:s,"aria-labelledby":t},a),e?r.createElement("title",{id:t},e):null,r.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4.5 10.5 12 3m0 0 7.5 7.5M12 3v18"}))})}},e=>{e.O(0,[6701,3927,2325,3990,8447,5392,636,6593,8792],()=>e(e.s=12188)),_N_E=e.O()}]);
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.