1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/terms-C0mcfCST.js","assets/vendor-query-0_4gCfr-.js","assets/rolldown-runtime-xSXa1GVp.js","assets/vendor-icons-1FD7P_zV.js","assets/SiteLayout-DQAH5-Yk.js","assets/vendor-ui-C5sMF9xr.js","assets/vendor-react-Bi2_JvNP.js","assets/vendor-router-Bc4Fkt2J.js","assets/reset-password-C3KvpLsL.js","assets/auth-client-Bbhu0btW.js","assets/vendor-supabase-nFlLzQbT.js","assets/privacy-C6ZlWcmZ.js","assets/pricing-Ci39t107.js","assets/edge-BtTExtI5.js","assets/login-D9uZukZ2.js","assets/license-CXJW_bQx.js","assets/features-DzGmL29v.js","assets/download-B3wVBJrf.js","assets/contact-C0RnQuQ4.js","assets/account-B1r-92kZ.js","assets/use-session-CYqkMnEG.js","assets/routes-C4LfsIR2.js","assets/blog.index-CBMe_B5m.js","assets/blog.test-localhost-on-mobile-B1EOr57V.js","assets/BlogPost-D5P3_Nfx.js","assets/blog.mobileready-vs-chrome-devtools-CnDJXHp1.js","assets/blog.iphone-simulator-in-browser-6FL4t-a9.js","assets/blog.how-to-test-website-on-mobile-Bl235vnq.js","assets/blog.google-mobile-friendly-test-alternative-D7LM1b9s.js","assets/blog.captcha-help-mobile-testing-Dblakzzk.js","assets/blog.best-mobile-emulator-for-chrome-BarJDMU5.js"])))=>i.map(i=>d[i]); 2import{n as Te}from"./rolldown-runtime-xSXa1GVp.js";import{F as Ie}from"./vendor-icons-1FD7P_zV.js";import{t as Ce}from"./vendor-react-Bi2_JvNP.js";import{C as Oe,S as $e,_ as Ae,a as ke,b as Le,c as De,d as je,f as Fe,g as Ne,h as Be,i as ze,l as He,m as Ue,n as Je,o as g,p as Ge,r as Ve,s as u,t as We,v as qe,w as me,x as Ye,y as de}from"./vendor-router-Bc4Fkt2J.js";import{n as Xe,r as Qe,t as Ze}from"./vendor-query-0_4gCfr-.js";import{n as y,t as Ke}from"./vendor-supabase-nFlLzQbT.js";import{n as et}from"./vendor-ui-C5sMF9xr.js";var tt="__TSS_CONTEXT",ce=Symbol.for("TSS_SERVER_FUNCTION"),ve="application/x-tss-framed",T={JSON:0,CHUNK:1,END:2,ERROR:3},mr=`${ve}; v=1`,ot=/;\s*v=(\d+)/;function rt(e){const t=e.match(ot);return t?parseInt(t[1],10):void 0}function nt(e){const t=rt(e);if(t!==void 0&&t!==1)throw new Error(`Incompatible framed protocol version: server=${t}, client=1. Please ensure client and server are using compatible versions.`)}var _e=()=>window.__TSS_START_OPTIONS__;function at(){return[..._e()?.serializationAdapters?.map(Ae)??[],...Ue]}var he=new TextDecoder,it=new Uint8Array(0),ge=16*1024*1024,ue=32*1024*1024,ye=1024,be=1e5;function st(e){const t=new Map,o=new Map,r=new Set;let n=!1,c=null,x=0,_;const d=new ReadableStream({start(a){_=a},cancel(){n=!0;try{c?.cancel()}catch{}t.forEach(a=>{try{a.error(new Error("Framed response cancelled"))}catch{}}),t.clear(),o.clear(),r.clear()}});function b(a){const f=o.get(a);if(f)return f;if(r.has(a))return new ReadableStream({start(w){w.close()}});if(o.size>=ye)throw new Error(`Too many raw streams in framed response (max ${ye})`);const i=new ReadableStream({start(w){t.set(a,w)},cancel(){r.add(a),t.delete(a),o.delete(a)}});return o.set(a,i),i}function R(a){return b(a),t.get(a)}return(async()=>{const a=e.getReader();c=a;const f=[];let i=0;function w(){if(i<9)return null;const l=f[0];if(l.length>=9)return{type:l[0],streamId:(l[1]<<24|l[2]<<16|l[3]<<8|l[4])>>>0,length:(l[5]<<24|l[6]<<16|l[7]<<8|l[8])>>>0};const p=new Uint8Array(9);let E=0,v=9;for(let m=0;m<f.length&&v>0;m++){const S=f[m],I=Math.min(S.length,v);p.set(S.subarray(0,I),E),E+=I,v-=I}return{type:p[0],streamId:(p[1]<<24|p[2]<<16|p[3]<<8|p[4])>>>0,length:(p[5]<<24|p[6]<<16|p[7]<<8|p[8])>>>0}}function C(l){if(l===0)return it;const p=new Uint8Array(l);let E=0,v=l;for(;v>0&&f.length>0;){const m=f[0];if(!m)break;const S=Math.min(m.length,v);p.set(m.subarray(0,S),E),E+=S,v-=S,S===m.length?f.shift():f[0]=m.subarray(S)}return i-=l,p}try{for(;;){const{done:l,value:p}=await a.read();if(n||l)break;if(p){if(i+p.length>ue)throw new Error(`Framed response buffer exceeded ${ue} bytes`);for(f.push(p),i+=p.length;;){const E=w();if(!E)break;const{type:v,streamId:m,length:S}=E;if(v!==T.JSON&&v!==T.CHUNK&&v!==T.END&&v!==T.ERROR)throw new Error(`Unknown frame type: ${v}`);if(v===T.JSON){if(m!==0)throw new Error("Invalid JSON frame streamId (expected 0)")}else if(m===0)throw new Error("Invalid raw frame streamId (expected non-zero)");if(S>ge)throw new Error(`Frame payload too large: ${S} bytes (max ${ge})`);const I=9+S;if(i<I)break;if(++x>
2be)throw new Error(`Too many frames in framed response (max ${be})`);C(9);const M=C(S);switch(v){case T.JSON:try{_.enqueue(he.decode(M))}catch{}break;case T.CHUNK:{const P=R(m);P&&P.enqueue(M);break}case T.END:{const P=R(m);if(r.add(m),P){try{P.close()}catch{}t.delete(m)}break}case T.ERROR:{const P=R(m);if(r.add(m),P){const Me=he.decode(M);P.error(new Error(Me)),t.delete(m)}break}}}}}if(i!==0)throw new Error("Incomplete frame at end of framed response");try{_.close()}catch{}t.forEach(l=>{try{l.close()}catch{}}),t.clear()}catch(l){try{_.error(l)}catch{}t.forEach(p=>{try{p.error(l)}catch{}}),t.clear()}finally{try{a.releaseLock()}catch{}c=null}})(),{getOrCreateStream:b,jsonChunks:d}}var N=null,lt=null;function O(e){lt=e}async function pe(e){e.length>0&&await Promise.allSettled(e)}var ct=Object.prototype.hasOwnProperty;function Re(e){for(const t in e)if(ct.call(e,t))return!0;return!1}async function pt(e,t,o){N||(N=at());const r=t[0],n=r.fetch??o,c=r.data instanceof FormData?"formData":"payload",x=r.headers?new Headers(r.headers):new Headers;if(x.set("x-tsr-serverFn","true"),c==="payload"&&x.set("accept",`${ve}, application/x-ndjson, application/json`),r.method==="GET"){if(c==="formData")throw new Error("FormData is not supported with GET requests");const d=await Se(r);if(d!==void 0){const b=$e({payload:d});e.includes("?")?e+=`&${b}`:e+=`?${b}`}}let _;if(r.method==="POST"){const d=await mt(r);d?.contentType&&x.set("content-type",d.contentType),_=d?.body}return await dt(async()=>n(e,{method:r.method,headers:x,signal:r.signal,body:_}))}async function Se(e){let t=!1;const o={};if(e.data!==void 0&&(t=!0,o.data=e.data),e.context&&Re(e.context)&&(t=!0,o.context=e.context),t)return xe(o)}async function xe(e){return JSON.stringify(await Promise.resolve(qe(e,{plugins:N})))}async function mt(e){if(e.data instanceof FormData){let o;return e.context&&Re(e.context)&&(o=await xe(e.context)),o!==void 0&&e.data.set(tt,o),{body:e.data}}const t=await Se(e);if(t)return{body:t,contentType:"application/json"}}async function dt(e){let t;try{t=await e()}catch(r){if(r instanceof Response)t=r;else throw console.log(r),r}if(t.headers.get("x-tss-raw")==="true")return t;const o=t.headers.get("content-type");if(o||me(),t.headers.get("x-tss-serialized")){let r;if(o.includes("application/x-tss-framed")){if(nt(o),!t.body)throw new Error("No response body for framed response");const{getOrCreateStream:n,jsonChunks:c}=st(t.body),x=[Be(n),...N||[]],_=new Map;r=await ht({jsonStream:c,onMessage:d=>de(d,{refs:_,plugins:x}),onError(d,b){console.error(d,b)}})}else if(o.includes("application/json")){const n=await t.json(),c=[];O(c);try{r=de(n,{plugins:N})}finally{O(null)}await pe(c)}if(r||me(),r instanceof Error)throw r;return r}if(o.includes("application/json")){const r=await t.json(),n=Le(r);if(n)throw n;if(Oe(r))throw r;return r}if(!t.ok)throw new Error(await t.text());return t}async function ht({jsonStream:e,onMessage:t,onError:o}){const r=e.getReader(),{value:n,done:c}=await r.read();if(c||!n)throw new Error("Stream ended before first object");const x=JSON.parse(n);let _=!1;const d=(async()=>{try{for(;;){const{value:a,done:f}=await r.read();if(f)break;
2if(a)try{const i=[];O(i);try{t(JSON.parse(a))}finally{O(null)}await pe(i)}catch(i){o?.(`Invalid JSON: ${a}`,i)}}}catch(a){_||o?.("Stream processing error:",a)}})();let b;const R=[];O(R);try{b=t(x)}catch(a){throw O(null),_=!0,r.cancel().catch(()=>{}),a}return O(null),await pe(R),Promise.resolve(b).catch(()=>{_=!0,r.cancel().catch(()=>{})}),d.finally(()=>{try{r.releaseLock()}catch{}}),b}function gt(e){const t="/_serverFn/"+e;return Object.assign((...n)=>{const c=_e()?.serverFns?.fetch;return pt(t,n,c??fetch)},{url:t,serverFnMeta:{id:e},[ce]:!0})}var ut=Ne({key:"$TSS/serverfn",test:e=>typeof e!="function"||!(ce in e)?!1:!!e[ce],toSerializable:({serverFnMeta:e})=>({functionId:e.id}),fromSerializable:({functionId:e})=>gt(e)}),$=(e,t)=>{const o={type:"request",...t||e},r=n=>$({},Object.assign(o,{validator:n,inputValidator:n}));return{options:o,middleware:n=>$({},Object.assign(o,{middleware:n})),validator:r,inputValidator:r,client:n=>$({},Object.assign(o,{client:n})),server:n=>$({},Object.assign(o,{server:n}))}};function Pe(e,t){for(let o=0,r=t.length;o<r;o++){const n=t[o];e.has(n)||(e.add(n),n.extends&&Pe(e,n.extends))}}var yt=e=>({getOptions:async()=>{const t=await e();if(t.serializationAdapters){const o=new Set;Pe(o,t.serializationAdapters),t.serializationAdapters=Array.from(o)}return t},createMiddleware:$});function bt(){if(typeof window>"u")return;const e=location.hostname,t=["lovableproject.com","lovableproject-dev.com","lovable.app","gpt-eng.com","gptengineer.run"].some(i=>e===i||e.endsWith("."+i))?e.match(new RegExp("^(?:id-preview(?:-[a-z0-9]+)?|project)--([0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})(?:-dev)?(?=\\.|$)","i"))?.[1]??e.match(new RegExp("^([0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})(?=[.-])","i"))?.[1]:void 0,o=window.parent&&window.parent!==window;if(!t||!o)return localStorage;const r=e.endsWith(".lovableproject-dev.com")||e.endsWith(".gpt-eng.com"),n=r?/^https:\/\/([a-z0-9-]+\.)*(lovable\.dev|gptengineer\.app)$|^http:\/\/localhost:3000$/:/^https:\/\/([a-z0-9-]+\.)*(lovable\.dev|gptengineer\.app)$/,c=location.ancestorOrigins&&location.ancestorOrigins[0]||(document.referrer?new URL(document.referrer).origin:""),x=c&&n.test(c)?[c]:r?["https://lovable.dev","http://localhost:3000"]:["https://lovable.dev"],_="lovable-preview-auth:result",d=2e3,b=()=>Math.random().toString(36).slice(2)+Date.now().toString(36),R=(i,w,C)=>new Promise(l=>{const p=b();let E=!1,v;const m=M=>{E||(E=!0,clearTimeout(v),window.removeEventListener("message",S),l(M))},S=M=>{if(x.indexOf(M.origin)<0)return;const P=M.data;P&&P.type===_&&P.requestId===p&&m(P)};window.addEventListener("message",S);const I={type:i,requestId:p,projectId:t,key:w};C!==void 0&&(I.value=C);for(const M of x)window.parent.postMessage(I,M);v=setTimeout(()=>m(null),d)});let a=!0;const f=250;return{getItem:async i=>{let w=await R("lovable-preview-auth:get",i);return!w&&a&&(await new Promise(C=>setTimeout(C,f)),w=await R("lovable-preview-auth:get",i)),a=!1,w&&w.ok&&typeof w.value=="string"?w.value===""?(localStorage.removeItem(i),null):w.value:localStorage.getItem(i)},setItem:(i,w)=>(localStorage.setItem(i,w),R("lovable-preview-auth:set",i,w).then(()=>{})),removeItem:i=>(localStorage.removeItem(i),R("lovable-preview-auth:remove",i).then(()=>{}))}}function ft(e){return e.startsWith("sb_publishable_")||e.startsWith("sb_secret_")}function wt(e){return(t,o)=>{const r=new Headers(typeof Request<"u"&&t instanceof Request?t.headers:void 0);return o?.headers&&new Headers(o.headers).forEach((n,c)=>r.set(c,n)),ft(e)&&r.get("Authorization")===`Bearer ${e}`&&r.delete("Authorization"),r.set("apikey",e),fetch(t,{...o,headers:r})}}function vt(){const e="https://lzmithvessxurbxlyyzr.supabase.co",t="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imx6bWl0aHZlc3N4dXJieGx5eXpyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODI4MjU4NjIsImV4cCI6MjA5ODQwMTg2Mn0.552K-wBM0khEWhuP_sEUaIoTSpcXBdEOWabrJDvAfFo";return Ke(e,t,{global:{fetch:wt(t)},auth:{storage:bt(),persistSession:!0,autoRefreshToken:!0}})}var H,_t=new Proxy({},{get(e,t,o){return H||(H=vt()),Reflect.get(H,t,o)}}),Rt=$({type:"function"}).client(async({next:e})=>{const{data:t}=await _t.auth.getSession(),o=t.session?.access_token;return e({headers:o?{Authorization:`Bearer ${o}`}:{}})}),St=$(),fe=yt(()=>({functionMiddleware:[Rt],requestMiddleware:[St]}));var s=Qe(),xt=({...e})=>(0,s.jsx)(et,{className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...e}),Pt="/assets/styles-CpgRDnt7.css";function Et(e,t={}){typeof window>"u"||window.__appErrorEvents?.captureException?.(e,{source:"react_error_boundary",route:window.location.pathname,...t},{mechanism:"react_error_boundary",handled:!1,severity:"error"})}var B=Te(Ie(),1),z="https://webmobileready.com";function Mt(){if(typeof window>"u")return"/login";const e=window.location.hostname;return`${e==="localhost"||e==="127.0.0.1"?window.location.origin:z}/login`}function Tt(){return(0,s.jsx)("div",{className:"flex min-h-screen items-center justify-center bg-background px-4",children:(0,s.jsxs)("div",{className:"max-w-md text-center",children:[(0,s.jsx)("h1",{className:"text-7xl font-bold text-foreground",children:"404"}),(0,s.jsx)("h2",{className:"mt-4 text-xl font-semibold text-foreground",children:"Page not found"}),(0,s.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"The page you're looking for doesn't exist or has been moved."}),(0,s.jsx)("div",{className:"mt-6",children:(0,s.jsx)(He,{to:"/",className:"btn-primary",children:"Go home"})})]})})}function It(e){const t=e instanceof Error?`${e.message} ${e.stack??""}`:String(e);return/Failed to fetch dynamically imported module|Importing a module script failed|ChunkLoadError|error loading dynamically imported module/i.test(t)}function Ct({error:e,reset:t}){console.error(e);const o=je();return(0,B.useEffect)(()=>
2{if(Et(e,{boundary:"tanstack_root_error_component"}),typeof window<"u"&&It(e)){const r="__mr_chunk_reload__";sessionStorage.getItem(r)||(sessionStorage.setItem(r,"1"),window.location.reload())}},[e]),(0,s.jsx)("div",{className:"flex min-h-screen items-center justify-center bg-background px-4",children:(0,s.jsxs)("div",{className:"max-w-md text-center",children:[(0,s.jsx)("h1",{className:"text-xl font-semibold tracking-tight text-foreground",children:"This page didn't load"}),(0,s.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"Something went wrong on our end. You can try refreshing or head back home."}),(0,s.jsxs)("div",{className:"mt-6 flex flex-wrap justify-center gap-2",children:[(0,s.jsx)("button",{onClick:()=>{o.invalidate(),t()},className:"btn-primary",children:"Try again"}),(0,s.jsx)("a",{href:"/",className:"btn-ghost",children:"Go home"})]})]})})}var h=De()({beforeLoad:({location:e})=>{if(e.pathname.startsWith("/lovable/"))return;const t=e.search,o=typeof t.error=="string"?t.error:"",r=typeof t.error_description=="string"?t.error_description:"",n=e.hash??"";if(/access_denied|cancel|denied|oauth|google/i.test(`${o} ${r} ${n}`)&&e.pathname!=="/login")throw Ye({href:`${z}/login`,replace:!0})},head:()=>({meta:[{charSet:"utf-8"},{name:"viewport",content:"width=device-width, initial-scale=1"},{name:"theme-color",content:"#1a73e8"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@webmobileready"},{property:"og:site_name",content:"MobileReady"},{property:"og:type",content:"website"},{property:"og:locale",content:"en_US"},{title:"MobileReady"},{property:"og:title",content:"MobileReady"},{name:"twitter:title",content:"MobileReady"},{name:"description",content:"The one-click smartphone and tablet simulator for your browser. Preview any website on iPhone 15, Galaxy S22, Pixel 6, iPad Air and 70+ realistic device frames"},{property:"og:description",content:"The one-click smartphone and tablet simulator for your browser. Preview any website on iPhone 15, Galaxy S22, Pixel 6, iPad Air and 70+ realistic device frames"},{name:"twitter:description",content:"The one-click smartphone and tablet simulator for your browser. Preview any website on iPhone 15, Galaxy S22, Pixel 6, iPad Air and 70+ realistic device frames"},{property:"og:image",content:"https://storage.googleapis.com/gpt-engineer-file-uploads/attachments/og-images/84c737d5-05b4-4f89-b377-1cff5740240f"},{name:"twitter:image",content:"https://storage.googleapis.com/gpt-engineer-file-uploads/attachments/og-images/84c737d5-05b4-4f89-b377-1cff5740240f"}],links:[{rel:"stylesheet",href:Pt},{rel:"icon",href:"/favicon.ico",type:"image/x-icon"},{rel:"preload",as:"image",href:"/img/hero-devices-1280.webp",imageSrcSet:"/img/hero-devices-800.webp 800w, /img/hero-devices-1280.webp 1280w",imageSizes:"(max-width: 768px) 100vw, 1024px",fetchPriority:"high"}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"Organization",name:"MobileReady",url:"https://webmobileready.com",logo:"https://webmobileready.com/favicon.ico",sameAs:[]})}]}),shellComponent:Ot,component:$t,notFoundComponent:Tt,errorComponent:Ct});function Ot({children:e}){return(0,s.jsxs)("html",{lang:"en",children:[(0,s.jsxs)("head",{children:[(0,s.jsx)("script",{dangerouslySetInnerHTML:{__html:` 3 (function () { 4 try { 5 var search = new URLSearchParams(window.location.search); 6 var hash = new URLSearchParams(window.location.hash.replace(/^#/, "")); 7 var error = search.get("error") || hash.get("error") || ""; 8 var description = search.get("error_description") || hash.get("error_description") || ""; 9 var host = window.location.hostname; 10 var isLocalhost = host === "localhost" || host === "127.0.0.1"; 11 var loginUrl = (isLocalhost ? window.location.origin : "https://webmobileready.com") + "/login"; 12 var hasOAuthTokens = Boolean(search.get("code") || search.get("access_token") || hash.get("access_token") || hash.get("refresh_token"));
13 var isOAuthError = /access_denied|cancel|denied|oauth|google/i.test(error + " " + description); 14 var isWrongHostedReturn = !isLocalhost && window.location.origin !== "https://webmobileready.com"; 15 if (isOAuthError && window.location.pathname !== "/login") { 16 window.location.replace(loginUrl); 17 return; 18 } 19 if (hasOAuthTokens && isWrongHostedReturn) { 20 window.location.replace("https://webmobileready.com/account/" + window.location.search + window.location.hash); 21 } 22 } catch (_) {} 23 })(); 24 `}}),(0,s.jsx)(Je,{})]}),(0,s.jsxs)("body",{children:[e,(0,s.jsx)(xt,{richColors:!0,position:"top-center"}),(0,s.jsx)(We,{})]})]})}function $t(){const{queryClient:e}=h.useRouteContext();return(0,B.useEffect)(()=>{if(typeof window>"u")return;const t=new URLSearchParams(window.location.search),o=new URLSearchParams(window.location.hash.replace(/^#/,"")),r=t.get("error")||o.get("error"),n=t.get("error_description")||o.get("error_description"),c=!!(t.get("code")||t.get("access_token")||o.get("access_token")||o.get("refresh_token")),x=r==="access_denied"||/oauth|google|access_denied|denied|cancel/i.test(`${r??""} ${n??""}`),_=window.location.origin!==z&&window.location.hostname!=="localhost"&&window.location.hostname!=="127.0.0.1";if(x&&window.location.pathname!=="/login"){window.location.replace(Mt());return}if(c&&_){window.location.replace(`${z}/account/${window.location.search}${window.location.hash}`);return}sessionStorage.removeItem("__mr_chunk_reload__");const d=b=>{const R="reason"in b?b.reason:b.error??b.message,a=R instanceof Error?`${R.message} ${R.stack??""}`:String(R);if(/Failed to fetch dynamically imported module|Importing a module script failed|ChunkLoadError/i.test(a)){const f="__mr_chunk_reload__";sessionStorage.getItem(f)||(sessionStorage.setItem(f,"1"),window.location.reload())}};return window.addEventListener("error",d),window.addEventListener("unhandledrejection",d),()=>{window.removeEventListener("error",d),window.removeEventListener("unhandledrejection",d)}},[]),(0,s.jsx)(Ze,{client:e,children:(0,s.jsx)(ke,{})})}var At=()=>y(()=>import("./terms-C0mcfCST.js"),__vite__mapDeps([0,1,2,3,4,5,6,7])),kt=u("/terms")({head:()=>({meta:[{title:"Terms of Service â MobileReady"},{name:"description",content:"The terms governing your use of the MobileReady browser extension, website, and subscription plans."},{property:"og:title",content:"Terms of Service â MobileReady"},{property:"og:description",content:"Read the terms that apply when using MobileReady."},{property:"og:url",content:"https://webmobileready.com/terms"}],links:[{rel:"canonical",href:"https://webmobileready.com/terms"}]}),component:g(At,"component")}),Lt=()=>y(()=>import("./reset-password-C3KvpLsL.js"),__vite__mapDeps([8,1,2,3,4,5,6,7,9,10])),Dt=u("/reset-password")({head:()=>({meta:[{title:"Reset password â MobileReady"},{name:"description",content:"Choose a new password for your MobileReady account."},{name:"robots",content:"noindex, follow"}]}),component:g(Lt,"component")}),jt=()=>y(()=>import("./privacy-C6ZlWcmZ.js"),__vite__mapDeps([11,1,2,3,4,5,6,7])),Ft=u("/privacy")({head:()=>({meta:[{title:"Privacy Policy â MobileReady"},{name:"description",content:"How MobileReady collects, uses, and protects your information when you use our browser extension and website."},{property:"og:title",content:"Privacy Policy â MobileReady"},{property:"og:description",content:"Learn how MobileReady handles your data."},{property:"og:url",content:"https://webmobileready.com/privacy"}],links:[{rel:"canonical",href:"https://webmobileready.com/privacy"}]}),component:g(jt,"component")}),Nt=[{q:"Can I try the extension before buying?",a:"Yes. Install the free version and start simulating devices instantly. The free plan includes 15 devices with some advanced options locked. Upgrade anytime from your account."},{q:"What payment methods can I use?",a:"Credit and debit cards, Apple Pay, Google Pay, and PayPal. All transactions are processed through Stripe."},{q:"Is the payment secure?",a:"Yes. Payments are handled by Stripe, certified to PCI DSS Level 1. Card details are never stored on our servers."},{q:"How do I cancel my subscription?",a:"Cancel anytime from your account page. Access remains active until the end of the current billing period."},{q:"Will my subscription be auto-renewed?",a:"Yes, subscriptions renew automatically. You can turn off auto-renew or change plans whenever you like."},{q:"Are refunds possible?",a:"Refunds are available within 7 days of payment for annual subscriptions only. Monthly subscriptions are not eligible for refunds."},{q:"Can I cancel anytime?",a:"Yes â your plan stays active until the end of the billing period, and you can downgrade to Free with no penalty."},{q:"Do you offer team or agency pricing?",a:"The Expert Team plan includes 5 seats. For larger teams, contact us for volume pricing."},{q:"Which browsers are supported?",a:"Chrome, Firefox, Safari and Internet Explorer. Your subscription works across all of them."}],Bt=()=>y(()=>import("./pricing-Ci39t107.js"),__vite__mapDeps([12,1,2,3,4,5,6,7,9,10,13])),zt=u("/pricing")({head:()=>({meta:[{title:"Pricing â Free, Pro & Team Plans | MobileReady"},{name:"description",content:"Simple plans for MobileReady. Free forever, Professional from $4.92/mo yearly, Expert Team with seats and priority support."},{property:"og:title",content:"MobileReady Pricing â Plans from free to team"},{property:"og:description",content:"Free, Professional and Expert Team plans. Monthly or yearly billing, cancel anytime."},{property:"og:url",content:"https://webmobileready.com/pricing"}],links:[{rel:"canonical",href:"https://webmobileready.com/pricing"}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"FAQPage",mainEntity:Nt.map(e=>
24({"@type":"Question",name:e.q,acceptedAnswer:{"@type":"Answer",text:e.a}}))})}]}),component:g(Bt,"component")}),Ht=()=>y(()=>import("./login-D9uZukZ2.js"),__vite__mapDeps([14,1,2,3,4,5,6,7,9,10])),Ut=u("/login")({validateSearch:e=>({next:typeof e.next=="string"?e.next:void 0}),head:()=>({meta:[{title:"Sign in â MobileReady"},{name:"description",content:"Sign in to your MobileReady account to manage your subscription, sync device presets across browsers, and access your team seats."},{name:"robots",content:"noindex, follow"}]}),component:g(Ht,"component")}),Jt=()=>y(()=>import("./license-CXJW_bQx.js"),__vite__mapDeps([15,1,2,3,4,5,6,7])),Gt=u("/license")({head:()=>({meta:[{title:"License Agreement â MobileReady"},{name:"description",content:"End User License Agreement for the MobileReady browser extension across Chrome, Firefox, Safari, and Internet Explorer / Edge."},{property:"og:title",content:"License Agreement â MobileReady"},{property:"og:description",content:"The EULA governing use of the MobileReady extension."},{property:"og:url",content:"https://webmobileready.com/license"}],links:[{rel:"canonical",href:"https://webmobileready.com/license"}]}),component:g(Jt,"component")}),Vt=()=>y(()=>import("./features-DzGmL29v.js"),__vite__mapDeps([16,1,2,3,4,5,6,7])),Wt=u("/features")({head:()=>({meta:[{title:"Features â Device Simulator & Inspector | MobileReady"},{name:"description",content:"70+ iPhone, iPad, Pixel and Galaxy frames, HD screenshots with annotations, alignment rulers, color picker, inspector and live CSS editor."},{property:"og:title",content:"MobileReady Features â Everything in one browser extension"},{property:"og:description",content:"Device simulation, HD captures, design tools, inspector and live styling â the complete responsive testing toolkit."},{property:"og:url",content:"https://webmobileready.com/features"}],links:[{rel:"canonical",href:"https://webmobileready.com/features"}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"SoftwareApplication",name:"MobileReady",applicationCategory:"DeveloperApplication",operatingSystem:"Chrome, Firefox, Safari, Edge",url:"https://webmobileready.com/features",description:"Browser extension for testing responsive websites on 70+ real device frames with HD screenshots, alignment rulers, element inspector and live CSS editor.",featureList:["70+ iPhone, iPad, Pixel and Galaxy device frames","One-click device switching","Touch gestures and scroll simulation","HD screenshots with device frames","Full-page scrollshots","Screenshot annotation tool","Alignment rulers with pixel measurements","Element inspector and CSS specs","Color hex picker","Live CSS styling editor","Presentation mode for client demos","Shareable preview links","Team preset library"],offers:{"@type":"Offer",price:"0",priceCurrency:"USD"},aggregateRating:{"@type":"AggregateRating",ratingValue:"4.8",ratingCount:"120",bestRating:"5",worstRating:"1"}})}]}),component:g(Vt,"component")}),qt=()=>y(()=>import("./download-B3wVBJrf.js"),__vite__mapDeps([17,1,2,3,4,5,6,7])),Yt=u("/download")({head:()=>({meta:[{title:"Download MobileReady â Chrome, Firefox, Safari & Edge Extension"},{name:"description",content:"Install the MobileReady mobile simulator extension free for Chrome, Firefox, Safari and Edge. Your account and presets sync across every browser."},{property:"og:title",content:"Install MobileReady for your browser"},{property:"og:description",content:"Free install for Chrome, Firefox, Safari and Edge."},{property:"og:url",content:"https://webmobileready.com/download"}],links:[{rel:"canonical",href:"https://webmobileready.com/download"}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"SoftwareApplication",name:"MobileReady",applicationCategory:"BrowserApplication",operatingSystem:"Chrome, Firefox, Safari, Edge",url:"https://webmobileready.com/download",downloadUrl:"https://webmobileready.com/download",description:"Free mobile and tablet device simulator browser extension. Install for Chrome, Firefox, Safari or Edge and sync y
24our presets across browsers.",offers:{"@type":"Offer",price:"0",priceCurrency:"USD"},aggregateRating:{"@type":"AggregateRating",ratingValue:"4.8",ratingCount:"120",bestRating:"5",worstRating:"1"}})},{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"FAQPage",mainEntity:[{"@type":"Question",name:"Which browsers does MobileReady support?",acceptedAnswer:{"@type":"Answer",text:"MobileReady is available for Chrome, Edge and other Chromium-based browsers (Brave, Arc), plus Firefox. Safari support is coming soon."}},{"@type":"Question",name:"Is the MobileReady extension free?",acceptedAnswer:{"@type":"Answer",text:"Yes. The free plan includes 15 devices and core simulation features. Paid plans unlock the full 70+ device library, HD screenshots and advanced design tools."}},{"@type":"Question",name:"Do my settings sync across browsers?",acceptedAnswer:{"@type":"Answer",text:"Yes. Sign in with your MobileReady account and your presets, favorites and device configurations sync across every browser where the extension is installed."}}]})}]}),component:g(qt,"component")}),Xt=()=>y(()=>import("./contact-C0RnQuQ4.js"),__vite__mapDeps([18,1,2,3,4,5,6,7])),Qt=u("/contact")({head:()=>({meta:[{title:"Contact MobileReady â Get in Touch"},{name:"description",content:"Reach the MobileReady team for support, billing, team rollouts and enterprise pricing. We reply within 24 hours."},{property:"og:title",content:"Contact MobileReady"},{property:"og:description",content:"Send us a message â we reply within 24 hours."},{property:"og:url",content:"https://webmobileready.com/contact"}],links:[{rel:"canonical",href:"https://webmobileready.com/contact"}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"ContactPage",url:"https://webmobileready.com/contact",name:"Contact MobileReady",description:"Contact the MobileReady team for support, billing questions, team rollouts and enterprise pricing.",mainEntity:{"@type":"Organization",name:"MobileReady",url:"https://webmobileready.com",contactPoint:{"@type":"ContactPoint",contactType:"customer support",availableLanguage:["English"],url:"https://webmobileready.com/contact"}}})}]}),component:g(Xt,"component")}),Zt=()=>y(()=>import("./account-B1r-92kZ.js"),__vite__mapDeps([19,1,2,3,4,5,6,7,20,9,10,13])),Kt=u("/account")({head:()=>({meta:[{title:"My account â MobileReady"},{name:"description",content:"Manage your MobileReady subscription, devices and billing."},{name:"robots",content:"noindex, nofollow"}]}),component:g(Zt,"component")});var eo="92c3a518-c7db-497f-8906-67aed1d6730f",to="3771f3d6-f7eb-4ecb-af6c-f7fcca222b39",oo="/__l5e/assets-v1/92c3a518-c7db-497f-8906-67aed1d6730f/hero-devices-new.png",ro="a/v1/3771f3d6-f7eb-4ecb-af6c-f7fcca222b39/92c3a518-c7db-497f-8906-67aed1d6730f/hero-devices-new.png",no="hero-devices-new.png",ao=259610,io="image/png",so="2026-06-30T14:55:30Z",we={version:1,asset_id:eo,project_id:to,url:oo,r2_key:ro,original_filename:no,size:ao,content_type:io,created_at:so},lo=()=>y(()=>import("./routes-C4LfsIR2.js"),__vite__mapDeps([21,1,2,3,4,5,6,7])),co=u("/")({head:()=>({meta:[{title:"MobileReady â Mobile & Tablet Simulator Browser Extension"},{name:"description",content:"Test responsive sites on 70+ realistic iPhone, iPad, Pixel and Galaxy frames in one click. Free Chrome, Firefox, Safari & Edge extension."},{name:"keywords",content:"mobile simulator, responsive design tester, chrome extension, device emulator, iphone simulator, tablet preview, screenshot tool"},{property:"og:title",content:"MobileReady â Mobile & Tablet Simulator Browser Extension"},{property:"og:description",content:"Preview any website on iPhone, iPad, Pixel and Galaxy device frames in one click. HD screenshots, alignment rulers, element inspector â free to install."},{property:"og:url",content:"https://webmobileready.com/"},{property:"og:image",content:we.url},{name:"twitter:title",content:"MobileReady â Mobile & Tablet Simulator Extension"},{name:"twitter:description",content:"One-click responsive testing for Chrome, Firefox, Safari & Edge. 70+ real device frames, HD captures, inspector tools."},{name:"twitter:image",content:we.url}],links:[{rel:"canonical",href:"https://webmobileready.com/"}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"SoftwareApplication",name:"MobileReady",applicationCategory:"DeveloperApplication",operatingSystem:"Chrome, Firefox, Safari, Edge",url:"https://webmobileready.com/",de
24scription:"Mobile and tablet device simulator browser extension for testing responsive websites, capturing HD screenshots, and presenting client demos.",offers:[{"@type":"Offer",name:"Free",price:"0",priceCurrency:"USD"},{"@type":"Offer",name:"Professional",price:"7.95",priceCurrency:"USD"},{"@type":"Offer",name:"Expert Solo",price:"9.95",priceCurrency:"USD"},{"@type":"Offer",name:"Expert Team",price:"19.95",priceCurrency:"USD"}],aggregateRating:{"@type":"AggregateRating",ratingValue:"4.8",ratingCount:"120",bestRating:"5",worstRating:"1"}})}]}),component:g(lo,"component")}),po=()=>y(()=>import("./blog.index-CBMe_B5m.js"),__vite__mapDeps([22,1,2,3,4,5,6,7])),mo=u("/blog/")({head:()=>({meta:[{title:"MobileReady Blog â Mobile Testing & Responsive Design"},{name:"description",content:"Hands-on guides for testing websites on mobile: emulators, iPhone simulators, localhost previews and responsive design tips."},{property:"og:title",content:"MobileReady Blog â Mobile Testing & Responsive Design"},{property:"og:description",content:"Guides for testing websites on mobile devices, emulators, and responsive design workflows."},{property:"og:url",content:"https://webmobileready.com/blog"},{property:"og:type",content:"website"}],links:[{rel:"canonical",href:"https://webmobileready.com/blog"}]}),component:g(po,"component")}),U="How to Test Localhost on a Real Mobile Device (5 Ways That Work)",ho="/assets/blog-localhost-mobile-CeA_4G_F.webp",go=()=>y(()=>import("./blog.test-localhost-on-mobile-B1EOr57V.js"),__vite__mapDeps([23,1,2,3,24,4,5,6,7])),A="https://webmobileready.com/blog/test-localhost-on-mobile",J="Your dev server runs on localhost, but you need to test it on your phone. Here are five reliable ways to test localhost on mobile â from LAN tricks to ngrok tunnels.",G="https://webmobileready.com"+ho,uo=u("/blog/test-localhost-on-mobile")({head:()=>({meta:[{title:U},{name:"description",content:J},{name:"keywords",content:"test localhost on mobile, localhost on phone, access localhost from mobile, ngrok localhost mobile, test local website on phone, localhost mobile testing"},{property:"og:title",content:U},{property:"og:description",content:J},{property:"og:url",content:A},{property:"og:type",content:"article"},{property:"og:image",content:G},{property:"og:image:alt",content:"Developer's night desk with a laptop showing a code editor and a smartphone displaying a localhost preview over USB â a practical setup for testing local dev servers on mobile"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:image",content:G},{name:"twitter:image:alt",content:"Testing localhost on mobile â laptop code editor with a phone previewing the local dev server"}],links:[{rel:"canonical",href:A}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"Article",headline:U,description:J,image:[G],url:A,author:{"@type":"Organization",name:"MobileReady",url:"https://webmobileready.com"},publisher:{"@type":"Organization",name:"MobileReady",logo:{"@type":"ImageObject",url:"https://webmobileready.com/favicon.ico"}},datePublished:"2026-06-17",dateModified:"2026-06-17",mainEntityOfPage:{"@type":"WebPage","@id":A}})},{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:"https://webmobileready.com/"},{"@type":"ListItem",position:2,name:"Blog",item:"https://webmobileready.com/blog"},{"@type":"ListItem",position:3,name:"Test Localhost on Mobile",item:A}]})}]}),component:g(go,"component")}),Ee="/assets/blog-mobile-emulator-I7gW_eSr.webp",yo=()=>y(()=>import("./blog.mobileready-vs-chrome-devtools-CnDJXHp1.js"),__vite__mapDeps([25,1,2,3,4,5,6,7])),V="https://webmobileready.com"+Ee,bo=u("/blog/mobileready-vs-chrome-devtools")({head:()=>({meta:[{title:"MobileReady vs Chrome DevTools â Best Mobile Simulator & View Extension"},{name:"description",content:"Compare MobileReady and Chrome DevTools Device Mode. See why developers choose MobileReady for realistic device frames, HD screenshots, alignment rulers, and one-click mobile simulation on 70+ devices."},{name:"keywords",content:"mobile view extension, mobile simulator, chrome devtools vs mobile simulator, responsive design tester, mobile emulator browser extension, device frame simulator"},{property:"og:title",content:"MobileReady vs Chrome DevTools â Best Mobile Simulator & View Extension"},{property:"og:description",content:"Side-by-side comparison of MobileReady and Chrome DevTools for mobile simulation, screenshots, and responsive testing."},{property:"og:url",content:"https://webmobileready.com/blog/mobileready-vs-chrome-devtools"},{property:"og:type",content:"article"},{property:"og:image",content:V},{property:"og:image:alt",content:"MobileReady Chrome extension side by side with Chrome DevTools Device Mode â a MacBook screen previewing google.com/store across four mobile device frames (iPhone 15, iPhone SE, Galaxy S24 Ultra, Galaxy Z Flip5)"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:image",content:V},{name:"twitter:image:alt",content:"MobileReady vs Chrome DevTools comparison â four realistic mobile device frames rendered by the MobileReady extension"}],links:[{rel:"canonical",href:"https://webmobileready.com/blog/mobileready-vs-chrome-devtools"}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"Article",headline:"MobileReady vs Chrome DevTools â A Comparison Guide",description:"Compare MobileReady and Chrome DevTools Device Mode for mobile simulation, screenshots, and responsive design testing.",image:[V],url:"https://webmobileready.com/blog/mobileready-vs-chrome-devtools",author:{"@type":"Organization",name:"MobileReady",url:"https://webmobileready.com"},publisher:{"@type":"Organization",name:"MobileReady",logo:{"@type":"ImageObject",url:"https://webmobileready.com/favicon.ico"}},datePublished:"2026-02-15",dateModified:"2026-02-15",mainEntityOfPage:{"@type":"WebPage","@id":"https://webmobileready.com/blog/mobileready-vs-chrome-devtools"}})},{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:"https://webmobileready.com/"},{"@type":"ListItem",position:2,name:"Blog",item:"https://webmobileready.com/blog"},{"@type":"ListItem",position:3,name:"MobileReady vs Chrome DevTools",item:"https://webmobileready.com/blog/mobileready-vs-chrome-devtools"}]})}]}),component:g(yo,"component")}),W="iPhone Simulator Online: Preview iOS in Your Browser",fo="/assets/blog-iphone-simulator-DGJ8tz1r.webp",wo=()=>y(()=>import("./blog.iphone-simulator-in-browser-6FL4t-a9.js"),__vite__mapDeps([26,1,2,3,24,4,5,6,7])),k="https://webmobileready.com/blog/iphone-simulator-in-browser",q="Run an iPhone simulator online â no Mac, no Xcode, no spare phone. Preview any website on iPhone 15, 14 or SE in Chrome, Edge or Firefox in one click.",Y="https://webmobileready.com"+fo,vo=u("/blog/iphone-simulator-in-browser")({head:()=>({meta:[{title:W},{name:"description",content:q},{name:"keywords",content:"iphone simulator online, iphone emulator online, ios simulator online, iphone simulator browser, iphone emulator chrome, virtual iphone, simulate iphone on windows, preview website on iphone"},{property:"og:title",content:W},{property:"og:description",content:q},{property:"og:url",content:k},{property:"og:type",content:"article"},{property:"og:image",content:Y},{property:"og:image:alt",content:"MacBook Pro running an iPhone simulator inside Chrome â a single iPhone 15 frame previewing a live website using the MobileReady extension"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:image",content:Y},{name:"twitter:image:alt",content:"iPhone simulator in the browser â iPhone 15 preview rendered on a MacBook by the MobileReady extension"}],links:[{rel:"canonical",href:k}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"Article",headline:W,description:q,image:[Y],url:k,author:{"@type":"Organization",name:"MobileReady",url:"https://webmobileready.com"},publisher:{"@type":"Organization",name:"MobileReady",logo:{"@type":"ImageObject",url:"https://webmobileready.com/favicon.ico"}},datePublished:"2026-04-22",dateModified:"2026-09-04",mainEntityOfPage:{"@type":"WebPage","@id":k}})},{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:"https://webmobileready.com/"},{"@type":"ListItem",position:2,name:"Blog",item:"https://webmobileready.com/blog"},{"@type":"ListItem",position:3,name:"iPhone Simulator Online",item:k}]})},{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"HowTo",name:"How to run an iPhone simulator in your browser",description:"Preview any website inside a realistic iPhone frame using a browser extension, without a Mac or Xcode.",totalTime:"PT1M",step:[{"@type":"HowToStep",name:"Install a mobile simulator extension",text:"Add MobileReady to Chrome, Edge, Firefox or Safari.",url:"https://webmobileready.com/download"},{"@type":"HowToStep",name:"Open the site you want to check",text:"Load your page in a normal browser tab."},{"@type":"HowToStep",name:"Launch the simulator",text:"Click the extension icon to wrap the tab in a device frame."}
24,{"@type":"HowToStep",name:"Pick an iPhone model",text:"Choose iPhone 15 Pro, iPhone 14, iPhone SE or any other frame."},{"@type":"HowToStep",name:"Test the page",text:"Scroll, tap buttons and submit forms at true iPhone viewport width."}]})}]}),component:g(wo,"component")}),X="How to Test a Website on Mobile: 6 Ways That Work",_o="/assets/blog-test-mobile-BQ35GWSn.webp",Ro=()=>y(()=>import("./blog.how-to-test-website-on-mobile-Bl235vnq.js"),__vite__mapDeps([27,1,2,3,24,4,5,6,7])),L="https://webmobileready.com/blog/how-to-test-website-on-mobile",Q="Six practical ways to test your website on mobile â free browser simulators, device frames, localhost previews and real iPhone or Android testing. No device drawer needed.",Z="https://webmobileready.com"+_o,So=u("/blog/how-to-test-website-on-mobile")({head:()=>({meta:[{title:X},{name:"description",content:Q},{name:"keywords",content:"test website on mobile, how to test website on mobile, mobile testing, responsive testing, mobile browser test, test my site on iphone"},{property:"og:title",content:X},{property:"og:description",content:Q},{property:"og:url",content:L},{property:"og:type",content:"article"},{property:"og:image",content:Z},{property:"og:image:alt",content:"Designer at a cafe testing a website on an iPhone with the same page open on a MacBook nearby â a practical mobile website testing workflow"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:image",content:Z},{name:"twitter:image:alt",content:"How to test a website on mobile â real iPhone and laptop testing setup at a cafe"}],links:[{rel:"canonical",href:L}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"Article",headline:X,description:Q,image:[Z],url:L,author:{"@type":"Organization",name:"MobileReady",url:"https://webmobileready.com"},publisher:{"@type":"Organization",name:"MobileReady",logo:{"@type":"ImageObject",url:"https://webmobileready.com/favicon.ico"}},datePublished:"2026-03-12",dateModified:"2026-09-04",mainEntityOfPage:{"@type":"WebPage","@id":L}})},{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:"https://webmobileready.com/"},{"@type":"ListItem",position:2,name:"Blog",item:"https://webmobileready.com/blog"},{"@type":"ListItem",position:3,name:"How to Test a Website on Mobile",item:L}]})}]}),component:g(Ro,"component")}),K="Google Killed the Mobile-Friendly Test. Here's What to Use Instead.",xo="/assets/blog-mobile-friendly-test-0RSPsFc0.webp",Po=()=>y(()=>import("./blog.google-mobile-friendly-test-alternative-D7LM1b9s.js"),__vite__mapDeps([28,1,2,3,24,4,5,6,7])),D="https://webmobileready.com/blog/google-mobile-friendly-test-alternative",ee="Google retired its Mobile-Friendly Test in 2023. Here's how to check if your site is mobile-friendly in 2026, what Google actually looks at, and which tools replace it.",te="https://webmobileready.com"+xo,Eo=u("/blog/google-mobile-friendly-test-alternative")({head:()=>({meta:[{title:K},{name:"description",content:ee},{name:"keywords",content:"google mobile-friendly test, mobile friendly test alternative, mobile friendly checker, is my site mobile friendly, mobile usability test"},{property:"og:title",content:K},{property:"og:description",content:ee},{property:"og:url",content:D},{property:"og:type",content:"article"},{property:"og:image",content:te},{property:"og:image:alt",content:"Person holding an iPhone displaying a webpage while a laptop shows the same site in the background â a hands-on mobile-friendly check replacing Google's retired Mobile-Friendly Test"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:image",content:te},{name:"twitter:image:alt",content:"Google Mobile-Friendly Test alternative â testing a page on a real iPhone next to a laptop"}],links:[{rel:"canonical",href:D}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"Article",headline:K,description:ee,image:[te],url:D,author:{"@type":"Organization",name:"MobileReady",url:"https://webmobileready.com"},publisher:{"@type":"Organization",name:"MobileReady",logo:{"@type":"ImageObject",url:"https://webmobileready.com/favicon.ico"}},datePublished:"2026-01-28",dateModified:"2026-01-28",mainEntityOfPage:{"@type":"WebPage","@id":D}})},{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:"https://webmobileready.com/"},{"@type":"ListItem",position:2,name:"Blog",item:"https://webmobileready.com/blog"},{"@type":"ListItem",position:3,name:"Mobile-Friendly Test Alternative",item:D}]})}]}),component:g(Po,"component")}),oe="Captcha Help: Test Mobile Layouts Without Captchas Blocking You",Mo="/assets/blog-captcha-help-vzB437jL.webp",To=()=>y(()=>import("./blog.captcha-help-mobile-testing-Dblakzzk.js"),__vite__mapDeps([29,1,2,3,24,4,5,6,7])),j="https://webmobileready.com/blog/captcha-help-mobile-testing",re="Captchas often break on mobile viewports and block responsive QA. Here's what the Captcha Help button does, why we built it, and how to use it while testing.",ne="https://webmobileready.com"+Mo,Io=u("/blog/captcha-help-mobile-testing")({head:()=>({meta:[{title:oe},{name:"description",content:re},{name:"keywords",content:"captcha mobile testing, captcha blocking responsive test, disable captcha in preview, recaptcha mobile issues, cloudflare turnstile mobile, mobile simulator captcha"},{property:"og:title",content:oe},{property:"og:description",content:re},{property:"og:url",content:j},{property:"og:type",content:"article"},{property:"og:image",content:ne},{property:"og:image:alt",content:"A phone showing a website blocked by a human-verification challenge next to a laptop showing the same page rendering normally"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:image",content:ne},{name:"twitter:image:alt",content:"Captcha challenge covering a mobile layout during responsive testing"}],links:[{rel:"canonical",href:j}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"Article",headline:oe,description:re,image:[ne],url:j,author:{"@type":"Organization",name:"MobileReady",url:"https://webmobileready.com"},publisher:{"@type":"Organization",name:"MobileReady",logo:{"@type":"ImageObject",url:"https://webmobileready.com/favicon.ico"}},datePublished:"2026-09-05",dateModified:"2026-09-05",mainEntityOfPage:{"@type":"WebPage","@id":j}})},{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:"https://webmobileready.com/"},{"@type":"ListItem",position:2,name:"Blog",item:"https://webmobileready.com/blog"},{"@type":"ListItem",position:3,name:"Captcha Help",item:j}]})}]}),component:g(To,"component")}),ae="The Best Mobile Emulator for Chrome in 2026",Co=()=>y(()=>import("./blog.best-mobile-emulator-for-chrome-BarJDMU5.js"),__vite__mapDeps([30,1,2,3,24,4,5,6,7])),F="https://webmobileready.com/blog/best-mobile-emulator-for-chrome",ie="DevTools, Responsively, MobileReady, BrowserStack â an honest comparison of the mobile emulators Chrome developers actually use, with pros, cons, and pricing.",se="https://webmobileready.com"+Ee,Oo=u("/blog/best-mobile-emulator-for-chrome")({head:()=>({meta:[{title:ae},{name:"description",content:ie},{name:"keywords",content:"mobile emulator, best mobile emulator, chrome mobile emulator, mobile emulator chrome extension, responsive design tester, mobile browser emulator"},{property:"og:title",content:ae},{property:"og:description",content:ie},{property:"og:url",content:F},{property:"og:type",content:"article"},{property:"og:image",content:se},{property:"og:image:alt",content:"Four mobile emulators for Chrome running side by side â iPhone 15, iPhone SE, Galaxy S24 Ultra and Galaxy Z Flip5 â previewing the same website in the MobileReady extension"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:image",content:se},{name:"twitter:image:alt",content:"Best mobile emulator for Chrome â four device frames rendering the same page inside the MobileReady extension"}],links:[{rel:"canonical",href:F}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"Article",headline:ae,description:ie,image:[se],url:F,author:{"@type":"Organization",name:"MobileReady",url:"https://webmobileready.com"},publisher:{"@type":"Organization",name:"MobileReady",logo:{"@type":"ImageObject",url:"https://webmobileready.com/favicon.ico"}},datePublished:"2026-05-08",dateModified:"2026-05-08",mainEntityOfPage:{"@type":"WebPage","@id":F}})},{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:"https://webmobileready.com/"},{"@type":"ListItem",position:2,name:"Blog",item:"https://webmobileready.com/blog"},{"@type":"ListItem",position:3,name:"Best Mobile Emulator for Chrome",item:F}]})}]}),component:g(Co,"component")}),$o=kt.update({id:"/terms",path:"/terms",getParentRoute:()=>h}),Ao=Dt.update({id:"/reset-password",path:"/reset-password",getParentRoute:()=>h}),ko=Ft.update({id:"/privacy",path:"/privacy",getParentRoute:()=>h}),Lo=zt.update({id:"/pricing",path:"/pricing",getParentRoute:()=>h}),Do=Ut.update({id:"/login",path:"/login",getParentRoute:()=>h}),jo=Gt.update({id:"/license",path:"/license",getParentRoute:()=>h}),Fo=Wt.update({id:"/features",path:"/features",getParentRoute:()=>h}),No=Yt.update({id:"/download",path:"/download",getParentRoute:()=>h}),Bo=Qt.update({id:"/contact",path:"/contact",getParentRoute:()=>h}),zo=Kt.update({id:"/account",path:"/account",getParentRoute:()=>h}),Ho=co.update({id:"/",path:"/",getParentRoute:()=>h}),Uo=mo.update({id:"/blog/",path:"/blog/",getParentRoute:()=>h}),Jo=uo.update({id:"/blog/test-localhost-on-mobile",path:"/blog/test-localhost-on-mobile",getParentRoute:()=>h}),Go=bo.update({id:"/blog/mobileready-vs-chrome-devtools",path:"/blog/mobileready-vs-chrome-devtools",getParentRoute:()=>h}),Vo=vo.update({id:"/blog/iphone-simulator-in-browser",path:"/blog/iphone-simulator-in-browser",getParentRoute:()=>h}),Wo=So.update({id:"/blog/how-to-test-website-on-mobile",path:"/blog/how-to-test-website-on-mobile",getParentRoute:()=>h}),qo=Eo.update({id:"/blog/google-mobile-friendly-test-alternative",path:"/blog/google-mobile-friendly-test-alternative",getParentRoute:()=>h}),Yo=Io.update({id:"/blog/captcha-help-mobile-testing",path:"/blog/captcha-help-mobile-testing",getParentRoute:()=>h}),Xo={IndexRoute:Ho,AccountRoute:zo,ContactRoute:Bo,DownloadRoute:No,FeaturesRoute:Fo,LicenseRoute:jo,LoginRoute:Do,PricingRoute:Lo,PrivacyRoute:ko,ResetPasswordRoute:Ao,TermsRoute:$o,BlogBestMobileEmulatorForChromeRoute:Oo.update({id:"/blog/best-mobile-emulator-for-chrome",path:"/blog/best-mobile-emulator-for-chrome",getParentRoute:()=>h}),BlogCaptchaHelpMobileTestingRoute:Yo,BlogGoogleMobileFriendlyTestAlternativeRoute:qo,BlogHowToTestWebsiteOnMobileRoute:Wo,BlogIphoneSimulatorInBrowserRoute:Vo,BlogMobilereadyVsChromeDevtoolsRoute:Go,BlogTestLocalhostOnMobileRoute:Jo,BlogIndexRoute:Uo},Qo=h._addFileChildren(Xo),Zo=()=>ze({routeTree:Qo,context:{queryClient:new Xe},scrollRestoration:!0,defaultPreloadStaleTime:0});async function Ko(){const e=await Zo();let t;if(fe){const o=await fe.getOptions();o.serializationAdapters=o.serializationAdapters??[],window.__TSS_START_OPTIONS__=o,t=o.serializationAdapters,e.options.defaultSsr=o.defaultSsr}else t=[],window.__TSS_START_OPTIONS__={serializationAdapters:t};
24return t.push(ut),e.options.serializationAdapters&&t.push(...e.options.serializationAdapters),e.update({basepath:"",serializationAdapters:t}),e.stores.matchesId.get().length||await Ge(e),e}var er=Ko;async function tr(){const e=await er();return window.$_TSR?.h(),e}var le;function or(){return le||(le=tr()),(0,s.jsx)(Fe,{promise:le,children:e=>(0,s.jsx)(Ve,{router:e})})}var rr=Ce();(0,B.startTransition)(()=>{(0,rr.hydrateRoot)(document,(0,s.jsx)(B.StrictMode,{children:(0,s.jsx)(or,{})}))});export{K as a,fo as c,ho as d,U as f,xo as i,W as l,Mo as n,_o as o,Nt as p,oe as r,X as s,ae as t,Ee as u};
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.