PageSourceSearch

https://trains.fyi/_next/static/chunks/pages/index-cfda7451994cb3ff.js?dpl=dpl_5vQSvZVhuinF4HqkBsmkPs3cGsp5

js trains.fyi collected 2026-09-24 09:54:22 UTC 5,697 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3332],{17689:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>u});var l=r(37876),a=r(18847),n=r.n(a),i=r(74),s=r(93408);let o=n()(()=>Promise.all([r.e(7334),r.e(1808),r.e(9863),r.e(3368),r.e(4938),r.e(8511),r.e(5750),r.e(9408),r.e(7336)]).then(r.bind(r,27336)),{loadableGenerated:{webpack:()=>[27336]},ssr:!1,loading:()=>(0,l.jsx)("div",{className:"flex h-full w-full items-center justify-center bg-[#eaeef2]",children:(0,l.jsx)("p",{className:"text-sm font-medium text-gray-500",children:"Loading live train map…"})})});function u(){return(0,l.jsxs)("div",{className:"flex h-dvh flex-col overflow-hidden bg-white",children:[(0,l.jsx)(s.A,{title:"trains.fyi — Track any train, anywhere",description:"Live positions for passenger trains around the world. Amtrak, VIA, SNCF, DB, JR, and 60+ more networks on one real-time map. Free on iPhone, iPad, and Apple TV.",canonical:"/",image:"/social.png",type:"website",keywords:"live train map, real-time train tracking, passenger trains, Amtrak tracker, VIA Rail tracker, train locations, world train map, rail transit app"}),(0,l.jsx)("div",{className:"relative z-20 shrink-0",children:(0,l.jsx)(i.A,{})}),(0,l.jsxs)("main",{className:"relative isolate min-h-0 flex-1",children:[(0,l.jsx)("h1",{className:"sr-only",children:"Live world train map"}),(0,l.jsx)("section",{"aria-label":"Live world train map",className:"h-full w-full",children:(0,l.jsx)(o,{})})]})]})}},18847:(e,t,r)=>{e.exports=r(75808)},29479:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return f}});let l=r(72687)._(r(14232)),a=r(41413),n=[],i=[],s=!1;function o(e){let t=e(),r={loading:!0,loaded:null,error:null};return r.promise=t.then(e=>(r.loading=!1,r.loaded=e,e)).catch(e=>{throw r.loading=!1,r.error=e,e}),r}class u{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 r=Object.assign({loader:null,loading:null,delay:200,timeout:null,webpack:null,modules:null},t),n=null;function o(){if(!n){let t=new u(e,r);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(!s){let e=r.webpack&&1?r.webpack():r.modules;e&&i.push(t=>{for(let r of e)if(t.includes(r))return o()})}function d(e,t){let i;o(),(i=l.default.useContext(a.LoadableContext))&&Array.isArray(r.modules)&&r.modules.forEach(e=>{i(e)});let s=l.default.useSyncExternalStore(n.subscribe,n.getCurrentValue,n.getCurrentValue);return l.default.useImperativeHandle(t,()=>({retry:n.retry}),[]),l.default.useMemo(()=>{var t;return s.loading||s.error?l.default.createElement(r.loading,{isLoading:s.loading,pastDelay:s.pastDelay,timedOut:s.timedOut,error:s.error,retry:n.retry}):s.loaded?l.default.createElement((t=s.loaded)&&t.default?t.default:t,e):null},[e,s])}return d.preload=()=>o(),d.displayName="LoadableComponent",l.default.forwardRef(d)}(o,e)}function c(e,t){let r=[];for(;e.length;){let l=e.pop();r.push(l(t))}return Promise.all(r).then(()=>{if(e.length)return c(e,t)})}d.preloadAll=()=>new Promise((e,t)=>
1{c(n).then(e,t)}),d.preloadReady=(e=[])=>new Promise(t=>{let r=()=>(s=!0,t());c(i,e).then(r,r)}),window.__NEXT_PRELOADREADY=d.preloadReady;let f=d},41413:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"LoadableContext",{enumerable:!0,get:function(){return l}});let l=r(72687)._(r(14232)).default.createContext(null)},42936:(e,t,r)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/",function(){return r(17689)}])},75808:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l={default:function(){return u},noSSR:function(){return o}};for(var a in l)Object.defineProperty(t,a,{enumerable:!0,get:l[a]});let n=r(72687);r(37876),r(14232);let i=n._(r(29479));function s(e){return{default:e?.default||e}}function o(e,t){return delete t.webpack,delete t.modules,e(t)}function u(e,t){let r=i.default,l={loading:({error:e,isLoading:t,pastDelay:r})=>null};e instanceof Promise?l.loader=()=>e:"function"==typeof e?l.loader=e:"object"==typeof e&&(l={...l,...e});let a=(l={...l,...t}).loader;return(l.loadableGenerated&&(l={...l,...l.loadableGenerated},delete l.loadableGenerated),"boolean"!=typeof l.ssr||l.ssr)?r({...l,loader:()=>null!=a?a().then(s):Promise.resolve(s(()=>null))}):(delete l.webpack,delete l.modules,o(r,l))}("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)}},e=>{e.O(0,[6701,3927,2325,3990,8447,636,6593,8792],()=>e(e.s=42936)),_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.