PageSourceSearch

https://multi-toolkit.com/_next/static/chunks/app/layout-230445ef4c0c5672.js

js multi-toolkit.com collected 2026-10-02 01:36:38 UTC 59,007 bytes, 15 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7177],{5973:e=>{e.exports={overlay:"CommandPalette_overlay__DYe88",fadeIn:"CommandPalette_fadeIn__zXYO1",palette:"CommandPalette_palette__EmlaM",slideIn:"CommandPalette_slideIn__pWmV_",searchBox:"CommandPalette_searchBox__qHNt1",input:"CommandPalette_input__D0xzQ",results:"CommandPalette_results__iRctQ",resultItem:"CommandPalette_resultItem__HJpow",selected:"CommandPalette_selected__s8EsX",iconWrapper:"CommandPalette_iconWrapper__yvEZZ",info:"CommandPalette_info__PdnIS",name:"CommandPalette_name__DCIwq",description:"CommandPalette_description__7sYqi",shortcut:"CommandPalette_shortcut__mSUhx",key:"CommandPalette_key__OV1Lg",footer:"CommandPalette_footer__usaFW",hint:"CommandPalette_hint__MXiIX"}},6048:(e,t,r)=>{"use strict";r.d(t,{FocusModeProvider:()=>n,Z:()=>l});var a=r(95155),i=r(12115);let o=(0,i.createContext)({focusMode:!1,toggleFocusMode:()=>{}});function n({children:e}){let[t,r]=(0,i.useState)(!1);return(0,i.useEffect)(()=>{let e="true"===localStorage.getItem("pref_focusMode");r(e),e&&document.documentElement.setAttribute("data-focus-mode","true")},[]),(0,a.jsx)(o.Provider,{value:{focusMode:t,toggleFocusMode:()=>{r(e=>{let t=!e;return localStorage.setItem("pref_focusMode",t?"true":"false"),t?document.documentElement.setAttribute("data-focus-mode","true"):document.documentElement.removeAttribute("data-focus-mode"),t})}},children:e})}let l=()=>(0,i.useContext)(o)},7752:(e,t,r)=>{"use strict";r.d(t,{ToastProvider:()=>p,d:()=>m});var a=r(95155),i=r(39092),o=r(12115),n=r(52484),l=r(13545),s=r(68822),c=r(33210);let d=(0,o.createContext)(),p=({children:e})=>{let[t,r]=(0,o.useState)([]),p=e=>{r(t=>t.filter(t=>t.id!==e))};return(0,a.jsxs)(d.Provider,{value:{showToast:(e,t="info")=>{let a=Math.random().toString(36).substr(2,9);r(r=>[...r,{id:a,message:e,type:t}]),setTimeout(()=>p(a),3e3)}},children:[e,(0,a.jsx)("div",{style:{position:"fixed",bottom:"2rem",right:"2rem",zIndex:9999,display:"flex",flexDirection:"column",gap:"0.75rem",pointerEvents:"none"},className:"jsx-c33dd495a2cf1131",children:t.map(e=>(0,a.jsxs)("div",{style:{padding:"1rem 1.25rem",borderRadius:"0.75rem",minWidth:"250px",display:"flex",alignItems:"center",gap:"0.75rem",animation:"slideIn 0.3s ease-out",pointerEvents:"auto",background:"var(--card-bg)",border:"1px solid var(--glass-border)",boxShadow:"0 8px 32px rgba(15,23,42,0.18)",borderLeft:`4px solid ${"success"===e.type?"#4caf50":"error"===e.type?"#f44336":"#0F766E"}`},className:"jsx-c33dd495a2cf1131 glass",children:["success"===e.type?(0,a.jsx)(n.A,{size:18,color:"#4caf50"}):"error"===e.type?(0,a.jsx)(l.A,{size:18,color:"#f44336"}):(0,a.jsx)(s.A,{size:18,color:"#0F766E"}),(0,a.jsx)("span",{style:{fontSize:"0.9rem",color:"var(--foreground)"},className:"jsx-c33dd495a2cf1131",children:e.message}),(0,a.jsx)("button",{onClick:()=>p(e.id),style:{marginLeft:"auto",background:"none",border:"none",color:"var(--text-dim)",cursor:"pointer"},className:"jsx-c33dd495a2cf1131",children:(0,a.jsx)(c.A,{size:14})})]},e.id))}),(0,a.jsx)(i,{id:"c33dd495a2cf1131",children:"@keyframes slideIn{from{transform:translatex(100%);opacity:0}to{transform:translatex(0);opacity:1}}"})]})},m=()=>(0,o.useContext)(d)},13229:(e,t,r)=>{"use strict";r.d(t,{default:()=>y});var a=r(95155),i=r(12115),o=r(94290),n=r(31885),l=r(3424),s=r(96035),c=r(94514),d=r(33210),p=r(62173),m=r.n(p),u=r(41463);let g="5262d5a7-544d-4594-8361-de0e5ea1d41b",f=u.env.NEXT_PUBLIC_FEEDBACK_WORKER_URL||"",h=u.env.NEXT_PUBLIC_TURNSTILE_SITE_KEY||"",b=[{id:"rating",label:"Rating",icon:o.A,placeholder:"What did you think of this tool?"},{id:"suggestion",label:"Idea",icon:n.A,placeholder:"Suggest a tool or an improvement…"},{id:"bug",label:"Bug",icon:l.A,placeholder:"What went wrong? Steps to reproduce help a lot."}];function y(){let[e,t]=(0,i.useState)(!1),[r,n]=(0,i.useState)(!1),[l,p]=(0,i.useState)("rating"),[u,y]=(0,i.useState)(0),[C,v]=(0,i.useState)(""),[x,N]=(0,i.useState)(""),[S,k]=(0,i.useState)(""),[w,j]=(0,i.useState)(!1),[D,_]=(0,i.useState)(""),[F,T]=(0,i.useState)(!1),P=(0,i.useRef)(null),E=(0,i.useRef)(""),A=(0,i.useRef)(null);if((0,i.useEffect)(()=>t(!0),[]),(0,i.useEffect)(()=>
1{if(!r||!h)return;let e=!1,t=()=>{!e&&P.current&&window.turnstile&&null===A.current&&(A.current=window.turnstile.render(P.current,{sitekey:h,callback:e=>{E.current=e},"error-callback":()=>{E.current=""},"expired-callback":()=>{E.current=""}}))};if(window.turnstile)t();else if(document.getElementById("cf-turnstile-script")){let e=setInterval(()=>{window.turnstile&&(clearInterval(e),t())},200);return()=>clearInterval(e)}else{let e=document.createElement("script");e.id="cf-turnstile-script",e.src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit",e.async=!0,e.defer=!0,e.onload=t,document.head.appendChild(e)}return()=>{e=!0}},[r]),(0,i.useEffect)(()=>{if(!r){if(null!==A.current&&window.turnstile)try{window.turnstile.remove(A.current)}catch{}A.current=null,E.current=""}},[r]),(0,i.useEffect)(()=>{if(!r)return;let e=e=>{"Escape"===e.key&&n(!1)};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[r]),!e)return null;let O=b.find(e=>e.id===l)||b[0],I=()=>{p("rating"),y(0),v(""),N(""),k(""),_(""),T(!1),j(!1)},J=()=>{n(!1),setTimeout(I,200)},L=async()=>{if(_(""),"rating"===l&&!u&&!C.trim())return void _("Pick a star rating or add a comment.");if("rating"!==l&&!C.trim())return void _("Please add a few words so we can act on it.");if(x&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(x))return void _("That email address looks invalid.");if(S)return void T(!0);let e=(document.title||"").replace(/\s*[—|].*$/,"").trim(),t=window.location.href,r="rating"===l&&u?`${u}/5`:"";if(g){j(!0);try{let a=await fetch("https://api.web3forms.com/submit",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({access_key:g,subject:`[Multi-Toolkit ${l}] ${e||"site"}`,from_name:"Multi-Toolkit Feedback",type:l,rating:r,tool:e,url:t,message:C.trim()||"(no comment)",email:x.trim(),botcheck:""})}),i=await a.json().catch(()=>({}));if(!a.ok||!i.success){_(i.message||"Something went wrong. Please try again."),j(!1);return}T(!0)}catch{_("Could not reach the server. Please try again."),j(!1)}return}if(f){j(!0);try{let r=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:l,tool:e,url:t,rating:"rating"===l?u:"",comment:C.trim(),email:x.trim(),hp:S,turnstileToken:E.current})}),a=await r.json().catch(()=>({}));if(!r.ok){_(a.error||"Something went wrong. Please try again."),j(!1);return}T(!0)}catch{_("Could not reach the server. Please try again."),j(!1)}return}let a=`[Multi-Toolkit ${l}] ${e||"site"}`,i=[r?`Rating: ${r}`:"",`Tool: ${e}`,`URL: ${t}`,"",C].filter(Boolean).join("\n");window.location.href=`mailto:[email protected]?subject=${encodeURIComponent(a)}&body=${encodeURIComponent(i)}`,T(!0)};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("button",{type:"button",className:m().trigger,onClick:()=>n(!0),"aria-haspopup":"dialog","aria-label":"Send feedback",children:[(0,a.jsx)(s.A,{size:16,"aria-hidden":"true"}),(0,a.jsx)("span",{children:"Feedback"})]}),r&&(0,a.jsx)("div",{className:m().overlay,onClick:J,role:"presentation",children:(0,a.jsx)("div",{className:m().card,role:"dialog","aria-modal":"true","aria-label":"Send feedback",onClick:e=>e.stopPropagation(),children:F?(0,a.jsxs)("div",{className:m().done,children:[(0,a.jsx)("div",{className:m().doneIcon,children:(0,a.jsx)(c.A,{size:26,"aria-hidden":"true"})}),(0,a.jsx)("p",{className:m().doneTitle,children:"Thank you"}),(0,a.jsx)("p",{className:m().doneText,children:g||f?"Your feedback is on its way to the team.":"Your email draft is ready to send."}),(0,a.jsx)("button",{type:"button",className:m().submit,style:{marginTop:"1.1rem"},onClick:J,children:"Close"})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:m().head,children:[(0,a.jsx)("h2",{className:m().title,children:"Send feedback"}),(0,a.jsx)("button",{type:"button",className:m().close,onClick:J,"aria-label":"Close",children:(0,a.jsx)(d.A,{size:16,"aria-hidden":"true"})})]}),(0,a.jsx)("div",{className:m().segRow,role:"tablist","aria-label":"Feedback type",children:b.map(e=>{let t=e.icon;return(0,a.jsxs)("button",{type:"button",role:"tab","aria-selected":l===e.id,className:`${m().seg} ${l===e.id?m().segOn:""}`,onClick:()=>{p(e.id),_("")},children:[(0,a.jsx)(t,{size:14,"aria-hidden":"true"}),(0,a.jsx)("span",{children:e.label})]},e.id)})}),"rating"===l&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:m().label,children:"Your rating"}),(0,a.jsx)("div",{className:m().stars,role:"radiogroup","aria-label":"Star rating",children:[1,2,3,4,5].map(e=>(0,a.jsx)("button",{type:"button",role:"radio","aria-checked":u===e,"aria-label":`${e} star${1===e?"":"s"}`,className:`${m().star} ${e<=u?m().starOn:""}`,onClick:()=>y(e),children:(0,a.jsx)(o.A,{size:26,fill:e<=u?"currentColor":"none","aria-hidden":"true"})},e))})]}),(0,a.jsx)("span",{className:m().label,children:"suggestion"===l?"Your idea":"bug"===l?"What happened":"Comment (optional)"}),(0,a.jsx)("textarea",{id:"mt-fb-comment",name:"comment",className:m().textarea,value:C,onChange:e=>v(e.target.value),placeholder:O.placeholder,maxLength:2e3}),(0,a.jsx)("span",{className:m().label,children:"Email (optional — for a reply)"}),(0,a.jsx)("input",{id:"mt-fb-email",name:"email",className:m().input,type:"email",value:x,onChange:e=>N(e.target.value),placeholder:"[email protected]",autoComplete:"email"}),(0,a.jsx)("input",{name:"website",className:m().hp,tabIndex:-1,autoComplete:"off","aria-hidden":"true",value:S,onChange:e=>k(e.target.value),placeholder:"Leave this empty"}),h&&(0,a.jsx)("div",{ref:P,className:m().turnstile}),D&&(0,a.jsx)("p",{className:m().error,children:D}),(0,a.jsx)("button",{type:"button",className:m().submit,onClick:L,disabled:w,children:w?"Sending…":"Send feedback"}),(0,a.jsx)("p",{className:m().hint,children:"This is the one thing we send off your device. No account needed."})]})})})]})}},30502:(e,t,r)=>{"use strict";r.d(t,{D:()=>s,ThemeProvider:()=>l});var a=r(95155),i=r(12115),o=r(37980);let n=(0,i.createContext)(),l=({children:e})=>{let[t,r]=(0,i.useState)("nordic");return(0,i.useEffect)(()=>{let e=o.l.load("theme","nordic");r(e),document.documentElement.setAttribute("data-theme",e)},[]),(0,a.jsx)(n.Provider,{value:{theme:t,changeTheme:e=>{r(e),o.l.save("theme",e),document.documentElement.setAttribute("data-theme",e)}},children:e})},s=()=>(0,i.useContext)(n)},34431:(e,t,r)=>{Promise.resolve().then(r.t.bind(r,42593,23)),Promise.resolve().then(r.t.bind(r,47064,23)),Promise.resolve().then(r.t.bind(r,58187,23)),Promise.resolve().then(r.bind(r,13229)),Promise.resolve().then(r.bind(r,50323)),Promise.resolve().then(r.bind(r,83990)),Promise.resolve().then(r.bind(r,64662)),Promise.resolve().then(r.bind(r,65206)),Promise.resolve().then(r.bind(r,94306)),Promise.resolve().then(r.bind(r,69968)),Promise.resolve().then(r.bind(r,6048)),Promise.resolve().then(r.bind(r,30502)),Promise.resolve().then(r.bind(r,7752)),Promise.resolve().then(r.t.bind(r,52782,23))},37980:(e,t,r)=>{"use strict";r.d(t,{l:()=>a});class a{static save(e,t){try{let r=JSON.stringify(t);localStorage.setItem(`multitoolkit_${e}`,r)}catch(e){console.error("Failed to save to localStorage",e)}}static load(e,t=null){try{let r=localStorage.getItem(`multitoolkit_${e}`);return r?JSON.parse(r):t}catch(e){return console.error("Failed to load from localStorage",e),t}}static clear(e){localStorage.removeItem(`multitoolkit_${e}`)}}},50323:(e,t,r)=>{"use strict";r.d(t,{default:()=>l});var a=r(12115),i=r(73321);let o=[/^\/$/,/^\/blog/,/^\/categories/,/^\/collections/,/^\/learn/,/^\/for-/,/^\/kits/,/^\/tools$/],n="mt_recent";function l(){let e=(0,i.usePathname)();return(0,a.useEffect)(()=>
1{if(!e||o.some(t=>t.test(e)))return;let t=setTimeout(()=>{try{let t=(document.title||"").split("—")[0].split("|")[0].trim();(!t||t.length>60)&&(t=e.replace(/^\//,""));let r=localStorage.getItem(n),a=r?JSON.parse(r):[],i=[{href:e,name:t,ts:Date.now()},...a.filter(t=>t.href!==e)].slice(0,8);localStorage.setItem(n,JSON.stringify(i))}catch{}},400);return()=>clearTimeout(t)},[e]),null}},52782:()=>{},62173:e=>{e.exports={trigger:"FeedbackWidget_trigger__guSsV",overlay:"FeedbackWidget_overlay__637IE",card:"FeedbackWidget_card__SUGPe",head:"FeedbackWidget_head__Pvn8P",title:"FeedbackWidget_title__eCiz2",close:"FeedbackWidget_close__sMlys",segRow:"FeedbackWidget_segRow__WVF_3",seg:"FeedbackWidget_seg__Od1K9",segOn:"FeedbackWidget_segOn__V_OG6",label:"FeedbackWidget_label__7JeDs",stars:"FeedbackWidget_stars__t0yS0",star:"FeedbackWidget_star__Ujc6o",starOn:"FeedbackWidget_starOn__Lx15D",textarea:"FeedbackWidget_textarea__T0eSU",input:"FeedbackWidget_input__IhOHY",hp:"FeedbackWidget_hp__ZapCq",turnstile:"FeedbackWidget_turnstile__25G4i",submit:"FeedbackWidget_submit__DXjNL",error:"FeedbackWidget_error__KKcz5",hint:"FeedbackWidget_hint__nqmOw",done:"FeedbackWidget_done__hMwN8",doneIcon:"FeedbackWidget_doneIcon__4L4H3",doneTitle:"FeedbackWidget_doneTitle__DJf_w",doneText:"FeedbackWidget_doneText__KJ_dg"}},64662:(e,t,r)=>{"use strict";r.d(t,{default:()=>p});var a=r(95155),i=r(12115),o=r(73321),n=r(79075);let l="pwa_ios_modal_shown";function s(){return"undefined"!=typeof navigator&&/iPad|iPhone|iPod/.test(navigator.userAgent)}function c(){return window.matchMedia("(display-mode: standalone)").matches||"standalone"in navigator&&!0===navigator.standalone}let d=[{num:"1",icon:(0,a.jsxs)("svg",{width:"28",height:"28",viewBox:"0 0 28 28",fill:"none","aria-hidden":!0,children:[(0,a.jsx)("rect",{width:"28",height:"28",rx:"6",fill:"#1d4ed8",fillOpacity:".15"}),(0,a.jsx)("path",{d:"M14 6v10m0-10-3 3m3-3 3 3M8 18h12",stroke:"#60a5fa",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})]}),text:"Tap the Share button",sub:"The square with an arrow at the bottom of Safari"},{num:"2",icon:(0,a.jsxs)("svg",{width:"28",height:"28",viewBox:"0 0 28 28",fill:"none","aria-hidden":!0,children:[(0,a.jsx)("rect",{width:"28",height:"28",rx:"6",fill:"#0F766E",fillOpacity:".15"}),(0,a.jsx)("rect",{x:"7",y:"10",width:"14",height:"11",rx:"2",stroke:"#5FBFB2",strokeWidth:"1.8"}),(0,a.jsx)("path",{d:"M11 10V9a3 3 0 0 1 6 0v1M14 14v3",stroke:"#5FBFB2",strokeWidth:"1.8",strokeLinecap:"round"})]}),text:'Tap "Add to Home Screen"',sub:"Scroll down in the share sheet to find it"},{num:"3",icon:(0,a.jsxs)("svg",{width:"28",height:"28",viewBox:"0 0 28 28",fill:"none","aria-hidden":!0,children:[(0,a.jsx)("rect",{width:"28",height:"28",rx:"6",fill:"#065f46",fillOpacity:".2"}),(0,a.jsx)("path",{d:"M8 14l4 4 8-8",stroke:"#34d399",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]}),text:'Tap "Add" to confirm',sub:"The app icon will appear on your Home Screen"}];function p(){let e=(0,o.usePathname)(),t=(0,n.R)(e),[r,p]=(0,i.useState)(!1);function m(){try{sessionStorage.setItem(l,"1")}catch{}p(!1)}return((0,i.useEffect)(()=>{let e=()=>{s()&&!c()&&p(!0)};if(window.addEventListener("open-ios-install",e),!s()||c()||function(){try{return!!sessionStorage.getItem(l)}catch{return!1}}())return()=>window.removeEventListener("open-ios-install",e);let t=setTimeout(()=>p(!0),8e3);return()=>{clearTimeout(t),window.removeEventListener("open-ios-install",e)}},[]),r)?(0,a.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"Add to Home Screen",onClick:e=>{e.target===e.currentTarget&&m()},style:{position:"fixed",inset:0,zIndex:1e4,background:"rgba(0,0,0,0.65)",display:"flex",alignItems:"flex-end",justifyContent:"center",padding:"1rem",backdropFilter:"blur(4px)",animation:"ios-fade-in 0.2s ease"},children:[(0,a.jsx)("style",{children:`
2        @keyframes ios-fade-in {
3          from { opacity: 0; }
4          to   { opacity: 1; }
5        }
6        @keyframes ios-slide-up {
7          from { transform: translateY(2rem); opacity: 0; }
8          to   { transform: translateY(0); opacity: 1; }
9        }
10      `}),(0,a.jsxs)("div",{style:{background:"var(--card-bg)",border:"1px solid var(--glass-border)",borderRadius:"1.25rem",padding:"1.5rem",width:"100%",maxWidth:"380px",boxShadow:"0 20px 60px rgba(15,23,42,0.25)",animation:"ios-sli
10de-up 0.28s ease"},children:[(0,a.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"1.25rem"},children:[(0,a.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem"},children:[(0,a.jsx)("img",{src:t.icon,alt:"",width:40,height:40,style:{borderRadius:"0.6rem"},onError:e=>{e.currentTarget.src="/icons/main/icon-96.png"}}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{style:{fontWeight:700,fontSize:"0.95rem",color:"var(--foreground)"},children:"Add to Home Screen"}),(0,a.jsxs)("div",{style:{fontSize:"0.75rem",color:"var(--text-dim)",marginTop:"0.1rem"},children:["Install ",t.name," like an app"]})]})]}),(0,a.jsx)("button",{onClick:m,"aria-label":"Close",style:{background:"none",border:"none",color:"var(--text-dim)",cursor:"pointer",fontSize:"1.25rem",lineHeight:1,padding:"0.25rem"},children:"\xd7"})]}),(0,a.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.875rem"},children:d.map((e,t)=>(0,a.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",gap:"0.875rem"},children:[e.icon,(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{style:{fontSize:"0.875rem",fontWeight:600,color:"var(--foreground)"},children:e.text}),(0,a.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-dim)",marginTop:"0.15rem",lineHeight:1.45},children:e.sub})]})]},t))}),(0,a.jsx)("div",{style:{marginTop:"1.25rem",padding:"0.6rem 0.875rem",background:"var(--glass-hover)",borderRadius:"0.625rem",fontSize:"0.78rem",color:"var(--text-dim)",textAlign:"center",lineHeight:1.5},children:"Works offline after install — no App Store needed"}),(0,a.jsx)("button",{onClick:m,style:{marginTop:"0.875rem",width:"100%",padding:"0.65rem",background:"transparent",border:"1px solid var(--glass-border)",borderRadius:"0.625rem",color:"var(--text-dim)",fontSize:"0.85rem",cursor:"pointer"},children:"Maybe later"})]})]}):null}},65206:(e,t,r)=>{"use strict";r.d(t,{default:()=>n});var a=r(12115),i=r(73321),o=r(79075);function n(){let e=(0,i.usePathname)();return(0,a.useEffect)(()=>{let t=(0,o.R)(e),r=t.name,a=t.slug?`/icons/${t.slug}/apple-touch-icon.png`:"/icons/main/apple-touch-icon.png",i=document.querySelector('meta[name="apple-mobile-web-app-title"]');i||((i=document.createElement("meta")).setAttribute("name","apple-mobile-web-app-title"),document.head.appendChild(i)),i.setAttribute("content",r);let n=document.querySelector('link[rel="apple-touch-icon"]');n||((n=document.createElement("link")).setAttribute("rel","apple-touch-icon"),document.head.appendChild(n)),n.setAttribute("href",a)},[e]),null}},69968:(e,t,r)=>{"use strict";r.d(t,{default:()=>f});var a=r(95155),i=r(12115),o=r(36999),n=r(51900),l=r(24371),s=r(60241),c=r(62861),d=r(9921),p=r(30502),m=r(6048),u=r(79014),g=r.n(u);function f(){let[e,t]=(0,i.useState)(!1),[r,u]=(0,i.useState)(!1),{theme:f,changeTheme:h}=(0,p.D)(),{focusMode:b,toggleFocusMode:y}=(0,m.Z)();(0,i.useEffect)(()=>{let e=()=>t(window.scrollY>400);window.addEventListener("scroll",e,{passive:!0});let r=/iPad|iPhone|iPod/.test(navigator.userAgent),a=window.matchMedia("(display-mode: standalone)").matches||"standalone"in navigator&&!0===navigator.standalone;return u(r&&!a),()=>window.removeEventListener("scroll",e)},[]);let C="nordic"===f;return(0,a.jsxs)("div",{className:g().stack,"aria-label":"Page utilities",children:[(0,a.jsx)("button",{className:g().btn,onClick:()=>h(C?"midnight":"nordic"),"aria-label":C?"Switch to dark mode":"Switch to light mode",title:C?"Dark mode":"Light mode",children:C?(0,a.jsx)(o.A,{size:17}):(0,a.jsx)(n.A,{size:17})}),(0,a.jsx)("button",{className:`${g().btn} ${b?g().btnActive:""}`,onClick:y,"aria-label":b?"Exit focus mode":"Focus mode: hide FAQ and related sections","aria-pressed":b,title:b?"Exit focus mode":"Focus mode",children:b?(0,a.jsx)(l.A,{size:17}):(0,a.jsx)(s.A,{size:17})}),r&&(0,a.jsx)("button",{className:g().btn,onClick:()=>window.dispatchEvent(new Event("open-ios-install")),"aria-label":"Add this tool to your Home Screen",title:"Add to Home Screen",children:(0,a.jsx)(c.A,{size:17})}),(0,a.jsx)("button",{className:`${g().btn} ${g().goTop} ${e?g().goTopVisible:""}`,onClick:()=>window.scrollTo({top:0,behavior:"smooth"}),"aria-label":"Back to top",title:"Back to top",children:(0,a.jsx)(d.A,{size:18})})]})}},79014:e=>{e.exports={stack:"FloatingActions_stack__V866L",btn:"FloatingActions_btn__dJGbx",btnActive:"FloatingActions_btnActive__iYzxd",goTop:"FloatingActions_goTop__l_j8T",goTopVisible:"FloatingActions_goTopVisible__XQNYh"}},79075:(e,t,r)=>{"use strict";r.d(t,{R:()=>o});let a=[{slug:"json-tools",appDir:"json-tools",name:"JSON Tools",shortName:"JSON Tools",description:"Complete JSON toolkit: formatter, validator, minifier, converters and more.",brandColor:"#22c55e",category:"utilities",priority:1,offlineCapable:!0},{slug:"json-tools/formatter",appDir:"json-tools/formatter",name:"JSON Formatter",shortName:"JSON Fmt",description:"Format and pretty-print JSON with syntax highlighting. Free JSON beautifier.",brandColor:"#22c55e",category:"utilities",priority:1,offlineCapable:!0},{slug:"json-tools/validator",appDir:"json-tools/validator",name:"JSON Validator",shortName:"JSON Valid",description:"Validate JSON syntax online. Instantly check if your JSON is valid.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"json-tools/minifier",appDir:"json-tools/minifier",name:"JSON Minifier",shortName:"JSON Min",description:"Minify and compress JSON to reduce file size. Free online JSON compressor.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"json-tools/to-xml",appDir:"json-tools/to-xml",name:"JSON to XML",shortName:"JSON→XML",description:"Convert JSON to XML format online. Free JSON to XML converter.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"json-tools/to-yaml",appDir:"json-tools/to-yaml",name:"JSON to YAML",shortName:"JSON→YAML",de
10scription:"Convert JSON to YAML format online. Free JSON to YAML converter.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"json-tools/to-csv",appDir:"json-tools/to-csv",name:"JSON to CSV",shortName:"JSON→CSV",description:"Convert JSON arrays to CSV format online. Free JSON to CSV converter.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"json-tools/to-typescript",appDir:"json-tools/to-typescript",name:"JSON to TypeScript",shortName:"JSON→TS",description:"Generate TypeScript interfaces from JSON automatically.",brandColor:"#22c55e",category:"utilities",priority:3,offlineCapable:!0},{slug:"json-tools/to-java",appDir:"json-tools/to-java",name:"JSON to Java",shortName:"JSON→Java",description:"Generate Java POJO classes from JSON. Free online JSON to Java converter.",brandColor:"#22c55e",category:"utilities",priority:3,offlineCapable:!0},{slug:"json-tools/to-python",appDir:"json-tools/to-python",name:"JSON to Python",shortName:"JSON→Py",description:"Convert JSON to Python dataclass or dict. Free online converter.",brandColor:"#22c55e",category:"utilities",priority:3,offlineCapable:!0},{slug:"json-tools/tree-viewer",appDir:"json-tools/tree-viewer",name:"JSON Tree Viewer",shortName:"JSON Tree",description:"Visualise JSON as an interactive collapsible tree. Free JSON explorer.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"json-tools/repair",appDir:"json-tools/repair",name:"JSON Repair",shortName:"JSON Repair",description:"Fix broken or malformed JSON automatically. Free online JSON fixer.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"json-tools/schema-generator",appDir:"json-tools/schema-generator",name:"JSON Schema Generator",shortName:"JSON Schema",description:"Generate JSON Schema from a JSON object automatically.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"json-tools/api-tester",appDir:"json-tools/api-tester",name:"API Tester",shortName:"API Tester",description:"Test REST APIs in your browser. Send GET, PO
10ST, PUT and DELETE requests.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!1},{slug:"json-tools/jsonpath",appDir:"json-tools/jsonpath",name:"JSONPath Explorer",shortName:"JSONPath",description:"Query JSON using JSONPath expressions online. Free JSONPath tester.",brandColor:"#22c55e",category:"utilities",priority:3,offlineCapable:!0},{slug:"editor",appDir:"(tools)/editor",name:"JSON Editor",shortName:"JSON Editor",description:"Full-featured JSON editor with formatting, validation and syntax highlighting.",brandColor:"#22c55e",category:"utilities",priority:1,offlineCapable:!0},{slug:"diff",appDir:"(tools)/diff",name:"JSON Diff",shortName:"JSON Diff",description:"Compare two JSON objects side-by-side and highlight differences.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"query",appDir:"(tools)/query",name:"JSONPath Query",shortName:"JSONPath",description:"Filter and extract data from JSON using JSONPath query expressions.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"visualize",appDir:"(tools)/visualize",name:"JSON to Chart",shortName:"JSON Chart",description:"Visualise JSON data as charts and graphs. Free online data visualizer.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"validate",appDir:"(tools)/validate",name:"JSON Schema Validator",shortName:"Schema Val",description:"Validate JSON against a JSON Schema definition. Free online schema validator.",brandColor:"#22c55e",category:"utilities",priority:2,offlineCapable:!0},{slug:"generate",appDir:"(tools)/generate",name:"Mock JSON Generator",shortName:"Mock JSON",description:"Generate realistic mock JSON test data instantly. Free fake data generator.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!0},{slug:"replace",appDir:"(tools)/replace",name:"Regex Replace",shortName:"Regex Rpl",description:"Test regex patterns and apply live replacements on text. Free regex tester.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!0},{slug:"utils",appDir:"(tools)/utils",name:"Developer Utilities",shortName:"Dev Utils",description:"Base64, URL encoding, hash generation and other developer utilities.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!0},{slug:"convert",appDir:"(tools)/convert",name:"Data Converter",shortName:"Converter",description:"Convert between JSON, CSV, XML, YAML and other data formats.",brandColor:"#64748b",category:"utilities",priority:2,offlineCapable:!0},{slug:"secret-generator",appDir:"(tools)/secret-generator",name:"Secret Generator",shortName:"Secret Gen",description:"Generate secure API keys, secrets, passwords and random tokens.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!0},{slug:"forge",appDir:"(tools)/forge",name:"Asset Forge",shortName:"Forge",description:"Generate mock data, placeholder text and test images for design and dev.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!0},{slug:"text-lab",appDir:"(tools)/text-lab",name:"Text Laboratory",shortName:"Text Lab",description:"Five text modules: transform, extract, sort, analyse and clean text.",brandColor:"#f59e0b",category:"utilities",priority:2,offlineCapable:!0},{slug:"pdf-lab",appDir:"pdf-lab",name:"PDF Lab",shortName:"PDF Lab",description:"Free browser-based PDF editor. Annotate, sign, highlight and draw on PDFs.",brandColor:"#ef4444",category:"utilities",priority:1,offlineCapable:!0},{slug:"pdf-compressor",appDir:"pdf-compressor",name:"PDF Compressor",shortName:"PDF Compress",description:"Compress PDF files to reduce size. No upload, 100% in your browser.",brandColor:"#ef4444",category:"utilities",priority:1,offlineCapable:!0},{slug:"pdf-merger",appDir:"pdf-merger",name:"PDF Merger",shortName:"PDF Merge",description:"Merge multiple PDF files into one. Free online PDF combiner.",brandColor:"#ef4444",category:"utilities",priority:1,offlineCapable:!0},{slug:"pdf-splitter",appDir:"pdf-splitter",name:"PDF Splitter",shortName:"PDF Split",description:"Split PDF pages, extract a range or rotate pages. Free online tool.",brandColor:"#ef4444",category:"utilities",priority:2,offlineCapable:!0},{slug:"pdf-to-jpg",appDir:"pdf-to-jpg",name:"PDF to JPG",shortName:"PDF→JPG",description:"Convert PDF pages to JPG or PNG images. Free online converter.",brandColor:"#ef4444",category:"utilities",priority:1,offlineCapable:!0},{slug:"image-compressor",appDir:"image-compressor",name:"Image Compressor",shortName:"Img Compress",description:"Compress JPG, PNG and WebP images in your browser. Free image optimizer.",brandColor:"#3b82f6",category:"utilities",priority:1,offlineCapable:!0},{slug:"image-resizer",appDir:"image-resizer",name:"Image Resizer",shortName:"Img Resizer",description:"Resize images to exact dimensions online. Free image resizer, no upload.",brandColor:"#3b82f6",category:"utilities",priority:1,offlineCapable:!0},{slug:"image-cropper",appDir:"image-cropper",name:"Image Cropper",shortName:"Img Cropper",description:"Crop images with aspect ratio presets. Free online image cropper.",brandColor:"#3b82f6",category:"utilities",priority:2,offlineCapable:!0},{slug:"image-marker",appDir:"image-marker",name:"Image Marker",shortName:"Img Marker",description:"Annotate and mark up images with arrows, shapes and text.",brandColor:"#3b82f6",category:"utilities",priority:2,offlineCapable:!0},{slug:"vision",appDir:"vision",name:"Vision Lab",shortName:"Vision Lab",description:"AI-powered photo editor and image processing studio in your browser.",brandColor:"#3b82f6",category:"utilities",priority:2,offlineCapable:!1},{slug:"text-compare",appDir:"text-compare",name:"Universal Text Compare",shortName:"Text Compare",description:"Compare two texts, contracts or code online with diff highlights.",brandColor:"#5FBFB2",category:"utilities",priority:1,offlineCapable:!0}
10,{slug:"word-counter",appDir:"word-counter",name:"Word Counter",shortName:"Word Count",description:"Count words, characters, sentences and paragraphs. Free online word counter.",brandColor:"#f59e0b",category:"utilities",priority:1,offlineCapable:!0},{slug:"case-converter",appDir:"case-converter",name:"Case Converter",shortName:"Case Conv",description:"Convert text to uppercase, lowercase, title case and sentence case.",brandColor:"#f59e0b",category:"utilities",priority:1,offlineCapable:!0},{slug:"lorem-ipsum",appDir:"lorem-ipsum",name:"Lorem Ipsum Generator",shortName:"Lorem Ipsum",description:"Generate lorem ipsum placeholder text for design and development.",brandColor:"#f59e0b",category:"utilities",priority:2,offlineCapable:!0},{slug:"typing-test",appDir:"typing-test",name:"Typing Speed Test",shortName:"Typing Test",description:"Test your typing speed in WPM and accuracy. Free online typing test.",brandColor:"#f59e0b",category:"utilities",priority:2,offlineCapable:!0},{slug:"ai-text-summarizer",appDir:"ai-text-summarizer",name:"AI Text Summarizer",shortName:"Summarize",description:"Summarize any text into a TL;DR, key points or headline with on-device AI.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!1},{slug:"ai-pdf-summarizer",appDir:"ai-pdf-summarizer",name:"AI PDF Summarizer",shortName:"PDF Summary",description:"Summarize any PDF privately — text extracted and summarized in your browser.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!1},{slug:"ai-translator",appDir:"ai-translator",name:"AI Translator",shortName:"Translate",description:"Private on-device translation between 20+ languages with built-in AI.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!1},{slug:"ai-email-writer",appDir:"ai-email-writer",name:"AI Email & Letter Writer",shortName:"Email Writer",description:"Draft emails and letters from a prompt with on-device AI — pick type, tone and length.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!1},{slug:"ai-grammar-checker",appDir:"ai-grammar-checker",name:"AI Grammar & Spell Checker",shortName:"Grammar",description:"Fix grammar, spelling and punctuation with on-device AI while preserving tone.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!1},{slug:"base64",appDir:"base64",name:"Base64 Encoder",shortName:"Base64",description:"Encode and decode Base64 text and files online. Free Base64 converter.",brandColor:"#0F766E",category:"utilities",priority:1,offlineCapable:!0},{slug:"url-encoder",appDir:"url-encoder",name:"URL Encoder",shortName:"URL Encode",description:"URL encode and decode text. Free online URL encoder and decoder.",brandColor:"#0F766E",category:"utilities",priority:1,offlineCapable:!0},{slug:"jwt-decoder",appDir:"jwt-decoder",name:"JWT Decoder",shortName:"JWT Decode",description:"Decode and inspect JWT tokens online. Free JWT debugger and parser.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!0},{slug:"timestamp-converter",appDir:"timestamp-converter",name:"Timestamp Converter",shortName:"Timestamp",description:"Convert Unix timestamps to readable dates and vice versa.",brandColor:"#0F766E",category:"utilities",priority:1,offlineCapable:!0},{slug:"color-picker",appDir:"color-picker",name:"Color Picker",shortName:"Color Pick",description:"Pick colors and convert between HEX, RGB, HSL and HSV.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!0},{slug:"contrast-checker",appDir:"contrast-checker",name:"Contrast Checker",shortName:"Contrast",description:"Check WCAG colour contrast ratios for accessibility compliance.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!0},{slug:"html-minifier",appDir:"html-minifier",name:"HTML Minifier",shortName:"HTML Min",description:"Minify HTML to reduce page load time. Free online HTML compressor.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"css-minifier",appDir:"css-minifier",name:"CSS Minifier",shortName:"CSS Min",description:"Minify CSS to reduce file size. Free online CSS compressor.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"js-minifier",appDir:"js-minifier",name:"JS Minifier",shortName:"JS Min",description:"Minify JavaScript to reduce bundle size. Free online JS compressor.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"meta-tag-generator",appDir:"meta-tag-generator",name:"Meta Tag Generator",shortName:"Meta Tags",description:"Generate SEO meta tags, Open Graph and Twitter Card markup.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!0},{slug:"robots-txt-generator",appDir:"robots-txt-generator",name:"Robots.txt Generator",shortName:"Robots.txt",description:"Generate a robots.txt file for your website. Free SEO robots builder.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!0},{slug:"utm-builder",appDir:"utm-builder",name:"UTM Builder",shortName:"UTM Build",description:"Build UTM tracking URLs for Google Analytics campaigns.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!0},{slug:"link-checker",appDir:"link-checker",name:"Link Checker",shortName:"Link Check",description:"Check if a URL is working and get HTTP status codes. Free link checker.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!1},{slug:"link-monitor",appDir:"link-monitor",name:"Website Link Monitor",shortName:"Link Monitor",description:"Monitor all links on a webpage and track their HTTP status.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!1},{slug:"currency-converter",appDir:"currency-converter",name:"Currency Converter",shortName:"Currency",de
10scription:"Convert between 150+ currencies with live exchange rates.",brandColor:"#64748b",category:"utilities",priority:1,offlineCapable:!1},{slug:"unit-converter",appDir:"unit-converter",name:"Unit Converter",shortName:"Unit Conv",description:"Convert between units of length, weight, temperature, volume and more.",brandColor:"#64748b",category:"utilities",priority:2,offlineCapable:!0},{slug:"timezone-converter",appDir:"timezone-converter",name:"Timezone Converter",shortName:"Timezone",description:"Convert times between world time zones. Free timezone meeting planner.",brandColor:"#64748b",category:"utilities",priority:2,offlineCapable:!0},{slug:"hijri-converter",appDir:"hijri-converter",name:"Hijri Converter",shortName:"Hijri Conv",description:"Convert between Hijri (Islamic) and Gregorian calendar dates.",brandColor:"#14b8a6",category:"utilities",priority:2,offlineCapable:!0},{slug:"qr-generator",appDir:"qr-generator",name:"QR Code Generator",shortName:"QR Gen",description:"Generate QR codes for URLs, text, WiFi and more. Free online QR maker.",brandColor:"#64748b",category:"utilities",priority:1,offlineCapable:!0},{slug:"bmi-calculator",appDir:"bmi-calculator",name:"BMI Calculator",shortName:"BMI Calc",description:"Calculate your BMI and healthy weight range. Free Body Mass Index calculator.",brandColor:"#f97316",category:"utilities",priority:1,offlineCapable:!0},{slug:"age-calculator",appDir:"age-calculator",name:"Age Calculator",shortName:"Age Calc",description:"Calculate your exact age in years, months and days.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"percentage-calculator",appDir:"percentage-calculator",name:"Percentage Calculator",shortName:"Percentage",description:"Calculate percentages, percentage change and percentage of a total.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"discount-calculator",appDir:"discount-calculator",name:"Discount Calculator",shortName:"Discount",description:"Calculate discounted price and savings. Free online sale price calculator.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"loan-calculator",appDir:"loan-calculator",name:"Loan Calculator",shortName:"Loan Calc",description:"Calculate monthly loan repayments, interest and total cost.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"compound-interest-calculator",appDir:"compound-interest-calculator",name:"Compound Interest Calculator",shortName:"Compound Int",description:"Calculate compound interest growth over time. Free investment calculator.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"profit-margin-calculator",appDir:"profit-margin-calculator",name:"Profit Margin Calculator",shortName:"Margin Calc",description:"Calculate gross and net profit margin percentage. Free business tool.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"break-even-calculator",appDir:"break-even-calculator",name:"Break-Even Calculator",shortName:"Break-Even",description:"Calculate your break-even point in units and revenue.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"pricing-calculator",appDir:"pricing-calculator",name:"Pricing Calculator",shortName:"Pricing",description:"Calculate optimal pricing based on costs, margins and markups.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"shopify-profit-calculator",appDir:"shopify-profit-calculator",name:"Shopify Profit Calculator",shortName:"Shopify Calc",description:"Calculate true Shopify profit after all fees. Free Shopify margin calculator.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"amazon-fba-calculator",appDir:"amazon-fba-calculator",name:"Amazon FBA Calculator",shortName:"FBA Calc",description:"Calculate Amazon FBA fees and net profit per unit.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"gst-calculator",appDir:"gst-calculator",name:"GST Calculator",shortName:"GST Calc",description:"Calculate GST inclusive and exclusive prices. Free online GST calculator.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"vat-calculator",appDir:"vat-calculator",name:"VAT Calculator",shortName:"VAT Calc",description:"Calculate VAT inclusive and exclusive prices. Free online VAT calculator.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"salary-calculator",appDir:"salary-calculator",name:"Salary Calculator",shortName:"Salary Calc",description:"Calculate net take-home salary after deductions. Free salary calculator.",brandColor:"#f97316",category:"utilities",priority:2,offlineCapable:!0},{slug:"leave-calculator",appDir:"leave-calculator",name:"Leave Calculator",shortName:"Leave Calc",description:"Calculate annual leave entitlement and remaining days.",brandColor:"#f97316",category:"utilities",priority:3,offlineCapable:!0},{slug:"end-of-service-calculator",appDir:"end-of-service-calculator",name:"End of Service Calculator",shortName:"EOS Calc",description:"Calculate end-of-service gratuity and benefits. Free EOS calculator.",brandColor:"#f97316",category:"utilities",priority:3,offlineCapable:!0},{slug:"ewa-calculator",appDir:"ewa-calculator",name:"EWA Bill Calculator",shortName:"EWA Calc",description:"Calculate Bahrain EWA electricity and water bills.",brandColor:"#14b8a6",category:"utilities",priority:3,offlineCapable:!0},{slug:"working-days-calculator",appDir:"working-days-calculator",name:"Working Days Calculator",shortName:"Work Days",description:"Count working days between two dates, excluding weekends and holidays.",brandColor:"#f97316",category:"utilities",priority:3,offlineCapable:!0},{slug:"visa-duration-calculator",appDir:"visa-duration-calculator",name:"Visa Duration Calculator",shortName:"Visa Calc",description:"Calculate visa expiry and duration of stay. Free visa duration tracker.",brandColor:"#f97316",category:"utilities",priority:3,offlineCapable:!0},{slug:"prayer-times",appDir:"prayer-times",name:"Prayer Times",shortName:"Prayer",description:"Accurate prayer times for your location. Daily s
10alah times.",brandColor:"#14b8a6",category:"lifestyle",priority:2,offlineCapable:!1},{slug:"qibla-finder",appDir:"qibla-finder",name:"Qibla Finder",shortName:"Qibla",description:"Find the Qibla direction from your location. Free online Qibla compass.",brandColor:"#14b8a6",category:"lifestyle",priority:2,offlineCapable:!1},{slug:"zakat-calculator",appDir:"zakat-calculator",name:"Zakat Calculator",shortName:"Zakat",description:"Calculate your Zakat obligation on savings, gold and investments.",brandColor:"#14b8a6",category:"utilities",priority:2,offlineCapable:!0},{slug:"zakat-on-gold",appDir:"zakat-on-gold",name:"Zakat on Gold",shortName:"Zakat Gold",description:"Calculate Zakat on gold holdings. Free Islamic gold zakat calculator.",brandColor:"#14b8a6",category:"utilities",priority:3,offlineCapable:!0},{slug:"zakat-on-crypto",appDir:"zakat-on-crypto",name:"Zakat on Crypto",shortName:"Zakat Crypto",description:"Calculate Zakat on cryptocurrency holdings.",brandColor:"#14b8a6",category:"utilities",priority:3,offlineCapable:!1},{slug:"nisab-calculator",appDir:"nisab-calculator",name:"Nisab Calculator",shortName:"Nisab",description:"Calculate the Nisab threshold for Zakat eligibility.",brandColor:"#14b8a6",category:"utilities",priority:3,offlineCapable:!0},{slug:"hijri-converter",appDir:"hijri-converter",name:"Hijri Converter",shortName:"Hijri Conv",description:"Convert between Hijri (Islamic) and Gregorian calendar dates.",brandColor:"#14b8a6",category:"utilities",priority:2,offlineCapable:!0},{slug:"hijri-calendar",appDir:"hijri-calendar",name:"Hijri Calendar",shortName:"Hijri Cal",description:"Islamic Hijri calendar with Gregorian dates and holy events.",brandColor:"#14b8a6",category:"utilities",priority:2,offlineCapable:!0},{slug:"ramadan-calendar",appDir:"ramadan-calendar",name:"Ramadan Calendar",shortName:"Ramadan Cal",description:"30-day Ramadan fasting schedule with Suhoor and Iftar timings.",brandColor:"#14b8a6",category:"utilities",priority:2,offlineCapable:!0},{slug:"tasbih-counter",appDir:"tasbih-counter",name:"Tasbih Counter",shortName:"Tasbih",description:"Digital Tasbih & Dhikr counter with sound, haptics and Tasbih Fatimah.",brandColor:"#14b8a6",category:"lifestyle",priority:2,offlineCapable:!0},{slug:"today-hijri-date",appDir:"today-hijri-date/[location]",name:"Today's Hijri Date",shortName:"Hijri Date",description:"Today's Hijri date with Gregorian equivalent.",brandColor:"#14b8a6",category:"utilities",priority:3,offlineCapable:!0},{slug:"notes",appDir:"notes",name:"Notes",shortName:"Notes",description:"Fast browser notepad with auto-save. Your notes stay private on your device.",brandColor:"#2C9D91",category:"productivity",priority:2,offlineCapable:!0},{slug:"refreshflow",appDir:"refreshflow",name:"RefreshFlow",shortName:"RefreshFlow",description:"Auto-refresh any webpage on a timer. Free browser tab refresher.",brandColor:"#2C9D91",category:"productivity",priority:3,offlineCapable:!0},{slug:"ui-ux-pro-max",appDir:"ui-ux-pro-max",name:"UI/UX Pro Max",shortName:"UI/UX Pro",de
10scription:"Professional UI/UX design utilities and resources in one place.",brandColor:"#2C9D91",category:"productivity",priority:3,offlineCapable:!0},{slug:"flappy-bird",appDir:"flappy-bird",name:"Flappy Bird",shortName:"Flappy Bird",description:"Play Flappy Bird online free. Classic tap-to-fly browser game.",brandColor:"#ec4899",category:"games",priority:3,offlineCapable:!0},{slug:"pong",appDir:"pong",name:"Pong",shortName:"Pong",description:"Play Pong online free. Classic arcade game in your browser.",brandColor:"#ec4899",category:"games",priority:3,offlineCapable:!0},{slug:"f1",appDir:"f1",name:"F1 Hub",shortName:"F1 Hub",description:"Live F1 standings, race results, driver and team statistics.",brandColor:"#0ea5e9",category:"sports",priority:2,offlineCapable:!1},{slug:"football",appDir:"football",name:"Football Hub",shortName:"Football",description:"Football league tables, fixtures and World Cup 2026 coverage.",brandColor:"#0ea5e9",category:"sports",priority:2,offlineCapable:!1},{slug:"bahrain",appDir:"bahrain",name:"Bahrain Hub",shortName:"Bahrain",description:"Bahrain information hub: news, government, business, culture and sports.",brandColor:"#14b8a6",category:"utilities",priority:2,offlineCapable:!1},{slug:"dns-lookup",appDir:"dns-lookup",name:"DNS Lookup & Checker",shortName:"DNS Lookup",description:"Query DNS records, compare resolvers and check DNSSEC in your browser.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!1},{slug:"date-time-calculator",appDir:"date-time-calculator",name:"Date & Time Calculator",shortName:"Date Calc",description:"Date difference, add/subtract, business days, countdown and working hours.",brandColor:"#5FBFB2",category:"utilities",priority:2,offlineCapable:!0},{slug:"whois-lookup",appDir:"whois-lookup",name:"WHOIS Lookup",shortName:"WHOIS",description:"Check a domain registrar, expiry, name servers and status via RDAP.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!1},{slug:"ssl-checker",appDir:"ssl-checker",name:"SSL Certificate Checker",shortName:"SSL Check",description:"Check a domain SSL/TLS certificate issuer, expiry and covered domains.",brandColor:"#16a34a",category:"utilities",priority:2,offlineCapable:!1},{slug:"http-header-checker",appDir:"http-header-checker",name:"HTTP Header & Redirect Checker",shortName:"HTTP Check",description:"Check a URL HTTP status, redirect chain, response headers and security grade.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!1},{slug:"what-is-my-ip",appDir:"what-is-my-ip",name:"What Is My IP Address",shortName:"My IP",description:"See your public IP address, location, ISP and network at a glance.",brandColor:"#0F766E",category:"utilities",priority:2,offlineCapable:!1},{slug:"gold-rate",appDir:"gold-rate",name:"Gold Rate Today",shortName:"Gold Rate",description:"Live 24K & 22K gold prices per gram, tola and ounce, by country.",brandColor:"#d4a843",category:"finance",priority:2,offlineCapable:!1},{slug:"remittance",appDir:"remittance",name:"Remittance Rates",shortName:"Remittance",description:"Live Gulf-to-home remittance rates — see what your family receives.",brandColor:"#0ea472",category:"finance",priority:2,offlineCapable:!1},{slug:"silver-rate",appDir:"silver-rate",name:"Silver Rate Today",shortName:"Silver Rate",description:"Live 999 & 925 sterling silver prices per gram, tola and ounce, by country.",brandColor:"#94a3b8",category:"finance",priority:2,offlineCapable:!1},{slug:"resume-builder",appDir:"resume-builder",name:"AI Resume Builder",shortName:"Resume",description:"Build a free, ATS-friendly resume with AI writing and one-click PDF.",brandColor:"#6d5efc",category:"productivity",priority:2,offlineCapable:!1}],i={slug:null,name:"Multi-Toolkit",icon:"/icons/main/icon-96.png"};function o(e){let t=(e||"/").replace(/^\/+|\/+$/g,"");if(!t)return i;let r=a.find(e=>e.slug===t);return r?{slug:r.slug,name:r.shortName||r.name,icon:`/icons/${r.slug}/icon-96.png`}:i}},83990:(e,t,r)=>{"use strict";r.d(t,{default:()=>m});var a=r(95155),i=r(12115),o=r(73321),n=r(79075);let l="pwa_install_dismissed",s="pwa_install_done";function c(){return window.matchMedia("(display-mode: standalone)").matches}function d(){try{let e=parseInt(localStorage.getItem(l)??"0",10);return Date.now()-e<6048e5}catch{return!1}}function p(){try{return!!localStorage.getItem(s)}catch{return!1}}function m(){let e=(0,o.usePathname)(),t=(0,n.R)(e),[r,m]=(0,i.useState)(!1),[u,g]=(0,i.useState)(!1),f=(0,i.useRef)(null),h=(0,i.useRef)(null);if((0,i.useEffect)(()=>
10{if("undefined"!=typeof navigator&&/iPad|iPhone|iPod/.test(navigator.userAgent)||c()||p()||d())return;let e=function(){try{let e="pwa_view_count",t=parseInt(sessionStorage.getItem(e)??"0",10)+1;return sessionStorage.setItem(e,String(t)),t}catch{return 0}}(),t=()=>{d()||p()||c()||m(!0)};e>=2?h.current=setTimeout(t,3e3):h.current=setTimeout(t,3e4);let r=window.matchMedia("(display-mode: standalone)"),a=e=>{e.matches&&g(!0)};r.addEventListener("change",a);let i=e=>{e.preventDefault(),f.current=e};return window.addEventListener("beforeinstallprompt",i),()=>{clearTimeout(h.current),window.removeEventListener("beforeinstallprompt",i),r.removeEventListener("change",a)}},[]),u)return null;async function b(){let e=f.current;if(!e)return;e.prompt();let{outcome:r}=await e.userChoice;if("accepted"===r){try{localStorage.setItem(s,"1")}catch{}"undefined"!=typeof gtag&&gtag("event","pwa_install",{tool_slug:t.slug??"main"}),m(!1)}f.current=null}if(!r)return null;let y=t.name,C=t.icon;return(0,a.jsxs)("div",{role:"dialog","aria-label":`Install ${y}`,style:{position:"fixed",bottom:"1.25rem",left:"50%",transform:"translateX(-50%)",width:"calc(100% - 2rem)",maxWidth:"440px",zIndex:9999,background:"var(--card-bg)",border:"1px solid var(--glass-border)",borderRadius:"1rem",padding:"1rem 1.25rem",display:"flex",alignItems:"center",gap:"0.875rem",boxShadow:"0 8px 32px rgba(15,23,42,0.18)",animation:"pwa-slide-up 0.3s ease"},children:[(0,a.jsx)("style",{children:`
11        @keyframes pwa-slide-up {
12          from { opacity: 0; transform: translateX(-50%) translateY(1rem); }
13          to   { opacity: 1; transform: translateX(-50%) translateY(0); }
14        }
15      `}),(0,a.jsx)("img",{src:C,alt:"",width:44,height:44,style:{borderRadius:"0.6rem",flexShrink:0},onError:e=>{e.currentTarget.src="/icons/main/icon-96.png"}}),(0,a.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,a.jsxs)("div",{style:{fontWeight:700,fontSize:"0.9rem",color:"var(--foreground)",lineHeight:1.2},children:["Install ",y]}),(0,a.jsx)("div",{style:{fontSize:"0.78rem",color:"var(--text-dim)",marginTop:"0.15rem"},children:"Works offline \xb7 No app store needed"})]}),(0,a.jsx)("button",{onClick:b,style:{background:"var(--accent)",color:"#fff",border:"none",borderRadius:"0.5rem",padding:"0.45rem 1rem",fontSize:"0.82rem",fontWeight:700,cursor:"pointer",flexShrink:0,whiteSpace:"nowrap"},children:"Install"}),(0,a.jsx)("button",{onClick:function(){try{localStorage.setItem(l,String(Date.now()))}catch{}m(!1)},"aria-label":"Dismiss install prompt",style:{background:"none",border:"none",color:"var(--text-dim)",cursor:"pointer",fontSize:"1.1rem",lineHeight:1,padding:"0.25rem",flexShrink:0},children:"\xd7"})]})}},94306:(e,t,r)=>{"use strict";r.d(t,{default:()=>F});var a=r(95155),i=r(12115),o=r(73321),n=r(76498),l=r(48368),s=r(24318),c=r(33591),d=r(24338),p=r(76809),m=r(92451),u=r(51058),g=r(86901),f=r(4066),h=r(6489),b=r(60241),y=r(32211),C=r(33024),v=r(10762),x=r(5973),N=r(30502),S=r(5176);function k(e,t){if(!t)return 0;let r=e.toLowerCase().trim(),a=t.toLowerCase();if(!r)return 0;if(a===r)return 100;if(a.startsWith(r))return 90;if(a.includes(r))return 75;if(a.split(/\s+/).some(e=>e.startsWith(r)))return 65;let i=0;for(let e=0;e<a.length&&i<r.length;e++)a[e]===r[i]&&i++;return i===r.length?30+Math.round(i/a.length*20):15*([...r].filter(e=>a.includes(e)).length/r.length>=.7)}let w={finance:n.A,pdf:l.A,image:s.A,json:c.A,dev:c.A,text:d.A,seo:p.A,islamic:m.A,calculator:u.A,utility:g.A,games:f.A},j=[{id:"theme_midnight",name:"Theme: Midnight Glass",description:"Deep space indigo theme",icon:h.A,group:"Theme"},{id:"theme_cyberpunk",name:"Theme: Cyberpunk Neon",description:"High-contrast neon theme",icon:h.A,group:"Theme"},{id:"theme_nordic",name:"Theme: Nordic Frost",description:"Clean light theme",icon:h.A,group:"Theme"},{id:"theme_forest",name:"Theme: Forest Depth",description:"Organic green theme",icon:h.A,group:"Theme"},{id:"theme_coffee",name:"Theme: Coffee Brew",description:"Warm earthy theme",icon:h.A,group:"Theme"},{id:"cmd_format",name:"Format JSON",description:"Pretty-print editor content",icon:d.A,group:"Editor",shortcut:["F"]},{id:"cmd_minify",name:"Minify JSON",description:"Compress editor content",icon:b.A,group:"Editor",shortcut:["M"]}
15,{id:"cmd_sort",name:"Sort Keys",description:"Alphabetize object keys",icon:y.A,group:"Editor",shortcut:["S"]},{id:"cmd_flatten",name:"Flatten JSON",description:"Flatten nested structure",icon:C.A,group:"Editor",shortcut:["L"]}],D=["/salary-calculator","/vat-calculator","/pdf-compressor","/image-compressor","/json-tools","/bahrain","/ewa-calculator","/loan-calculator","/word-counter"].map(e=>S.It.find(t=>t.href===e)).filter(Boolean);function _(e){let t=S.R6[e.category];return{id:e.href,name:e.name,description:e.tagline||e.description||"",icon:w[e.category]||g.A,href:e.href,group:t?.label||"Tools",isTool:!0,catColor:t?.color,catBg:t?.bg,badge:e.badge}}function F(){let[e,t]=(0,i.useState)(!1),[r,n]=(0,i.useState)(""),[l,s]=(0,i.useState)(0),c=(0,o.useRouter)(),{changeTheme:d}=(0,N.D)(),p=(0,i.useRef)(null);(0,i.useEffect)(()=>{let e=e=>{(e.ctrlKey||e.metaKey)&&"k"===e.key.toLowerCase()&&(e.preventDefault(),t(e=>!e)),"Escape"===e.key&&t(!1)};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),(0,i.useEffect)(()=>{e&&(n(""),s(0),setTimeout(()=>p.current?.focus(),10))},[e]);let m=(0,i.useMemo)(()=>{let e=r.trim();if(!e)return[...D.map(_),...j.filter(e=>"Theme"===e.group)];let t=(function(e,t=10,r=15){return e.trim()?S.It.map(t=>{let r=2*k(e,t.name),a=1.2*k(e,t.tagline),i=.8*k(e,t.description??""),o=.7*k(e,S.R6[t.category]?.label??""),n=(t.aliases??[]).map(t=>1.5*k(e,t)).reduce((e,t)=>Math.max(e,t),0);return{tool:t,score:r+a+i+o+n}}).filter(e=>e.score>=r).sort((e,t)=>t.score-e.score).slice(0,t).map(e=>e.tool):[]})(e,8,15).map(_),a=e.toLowerCase();return[...t,...j.filter(e=>e.name.toLowerCase().includes(a)||e.description.toLowerCase().includes(a)||(e.group||"").toLowerCase().includes(a))]},[r]);(0,i.useEffect)(()=>{s(0)},[r]);let u=e=>{e.href?c.push(e.href):e.id.startsWith("theme_")?d(e.id.replace("theme_","")):e.id.startsWith("cmd_")&&window.dispatchEvent(new CustomEvent("multitoolkit-command",{detail:e.id})),t(!1)},g=(0,i.useMemo)(()=>{let e={};return m.forEach(t=>{let r=t.group||"Tools";e[r]||(e[r]=[]),e[r].push(t)}),e},[m]);if(!e)return null;let f=0;return(0,a.jsx)("div",{className:x.overlay,onClick:()=>t(!1),children:(0,a.jsxs)("div",{className:x.palette,onClick:e=>e.stopPropagation(),children:[(0,a.jsxs)("div",{className:x.searchBox,children:[(0,a.jsx)(v.A,{size:20,color:"var(--accent)"}),(0,a.jsx)("input",{ref:p,className:x.input,placeholder:"Search 60+ tools, themes, commands…",value:r,onChange:e=>n(e.target.value),onKeyDown:e=>{"ArrowDown"===e.key?(e.preventDefault(),s(e=>(e+1)%Math.max(m.length,1))):"ArrowUp"===e.key?(e.preventDefault(),s(e=>(e-1+Math.max(m.length,1))%Math.max(m.length,1))):"Enter"===e.key&&m[l]&&u(m[l])},"aria-label":"Search tools and commands",autoComplete:"off",spellCheck:"false"}),r&&(0,a.jsx)("button",{onClick:()=>{n(""),s(0),p.current?.focus()},style:{background:"none",border:"none",color:"var(--text-dim)",cursor:"pointer",padding:"0.25rem",display:"flex",alignItems:"center"},"aria-label":"Clear search",children:"✕"})]}),(0,a.jsxs)("div",{className:x.results,children:[!r.trim()&&(0,a.jsx)("div",{style:{padding:"0.4rem 1rem 0.2rem",fontSize:"0.65rem",fontWeight:700,color:"var(--text-dim)",textTransform:"uppercase",letterSpacing:"0.06em"},children:"Popular Tools"}),Object.entries(g).map(([e,t])=>(0,a.jsxs)("div",{children:[r.trim()&&(0,a.jsx)("div",{style:{padding:"0.4rem 1rem 0.2rem",fontSize:"0.65rem",fontWeight:700,color:"var(--text-dim)",textTransform:"uppercase",letterSpacing:"0.06em"},children:e}),t.map(e=>{let t=f++,r=e.icon;return(0,a.jsxs)("div",{className:`${x.resultItem} ${t===l?x.selected:""}`,onMouseEnter:()=>s(t),onClick:()=>u(e),children:[(0,a.jsx)("div",{className:x.iconWrapper,style:e.catColor?{background:e.catBg,color:e.catColor}:{},children:(0,a.jsx)(r,{size:18})}),(0,a.jsxs)("div",{className:x.info,children:[(0,a.jsx)("span",{className:x.name,children:e.name}),(0,a.jsx)("span",{className:x.description,children:e.description})]}),(0,a.jsxs)("div",{className:x.shortcut,children:["new"===e.badge&&(0,a.jsx)("span",{style:{fontSize:"0.6rem",fontWeight:700,background:"rgba(34,197,94,0.15)",color:"#22c55e",border:"1px solid rgba(34,197,94,0.3)",borderRadius:"0.2rem",padding:"0.08rem 0.3rem"},children:"NEW"}),e.shortcut?.map(e=>(0,a.jsx)("span",{className:x.key,children:e},e))]})]},e.id)})]},e)),0===m.length&&r.trim()&&(0,a.jsxs)("div",{style:{padding:"2rem",textAlign:"center",color:"var(--text-dim)"},children:["No tools found for “",r,"”"]})]}),(0,a.jsxs)("div",{className:x.footer,children:[(0,a.jsxs)("div",{className:x.hint,children:[(0,a.jsx)("b",{children:"↑↓"})," navigate"]}),(0,a.jsxs)("div",{className:x.hint,children:[(0,a.jsx)("b",{children:"Enter"})," open"]}),(0,a.jsxs)("div",{className:x.hint,children:[(0,a.jsx)("b",{children:"ESC"})," close"]}),(0,a.jsxs)("div",{className:x.hint,style:{marginLeft:"auto",opacity:.5},children:[m.length," results"]})]})]})})}}},e=>{e.O(0,[4466,1681,5254,5176,8441,5838,7358],()=>e(e.s=34431)),_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.