1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,33525,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"warnOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}},88143,(e,t,i)=>{"use strict";function r({widthInt:e,heightInt:t,blurWidth:i,blurHeight:r,blurDataURL:o,objectFit:a}){let s=i?40*i:e,n=r?40*r:t,l=s&&n?`viewBox='0 0 ${s} ${n}'`:"";return`%3Csvg xmlns='http://www.w3.org/2000/svg' ${l}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${l?"none":"contain"===a?"xMidYMid":"cover"===a?"xMidYMid slice":"none"}' style='filter: url(%23b);' href='${o}'/%3E%3C/svg%3E`}Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"getImageBlurSvg",{enumerable:!0,get:function(){return r}})},87690,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});var r={VALID_LOADERS:function(){return a},imageConfigDefault:function(){return s}};for(var o in r)Object.defineProperty(i,o,{enumerable:!0,get:r[o]});let a=["default","imgix","cloudinary","akamai","custom"],s={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],path:"/_next/image",loader:"default",loaderFile:"",domains:[],disableStaticImages:!1,minimumCacheTTL:14400,formats:["image/webp"],maximumRedirects:3,dangerouslyAllowLocalIP:!1,dangerouslyAllowSVG:!1,contentSecurityPolicy:"script-src 'none'; frame-src 'none'; sandbox;",contentDispositionType:"attachment",localPatterns:void 0,remotePatterns:[],qualities:[75],unoptimized:!1}},8927,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"getImgProps",{enumerable:!0,get:function(){return c}}),e.r(33525);let r=e.r(43369),o=e.r(88143),a=e.r(87690),s=["-moz-initial","fill","none","scale-down",void 0];function n(e){return void 0!==e.default}function l(e){return void 0===e?e:"number"==typeof e?Number.isFinite(e)?e:NaN:"string"==typeof e&&/^[0-9]+$/.test(e)?parseInt(e,10):NaN}function c({src:e,sizes:t,unoptimized:i=!1,priority:c=!1,preload:d=!1,loading:p,className:u,quality:m,width:g,height:f,fill:h=!1,style:b,overrideSrc:y,onLoad:v,onLoadingComplete:w,placeholder:x="empty",blurDataURL:j,fetchPriority:I,decoding:N="async",layout:k,objectFit:S,objectPosition:P,lazyBoundary:A,lazyRoot:M,...E},C){var D;let _,O,T,{imgConf:R,showAltText:z,blurComplete:W,defaultLoader:L}=C,$=R||a.imageConfigDefault;if("allSizes"in $)_=$;else{let e=[...$.deviceSizes,...$.imageSizes].sort((e,t)=>e-t),t=$.deviceSizes.sort((e,t)=>e-t),i=$.qualities?.sort((e,t)=>e-t);_={...$,allSizes:e,deviceSizes:t,qualities:i}}if(void 0===L)throw Object.defineProperty(Error("images.loaderFile detected but the file is missing default export.\nRead more: https://nextjs.org/docs/messages/invalid-images-config"),"__NEXT_ERROR_CODE",{value:"E163",enumerable:!1,configurable:!0});let B=E.loader||L;delete E.loader,delete E.srcSet;let U="__next_img_default"in B;if(U){if("custom"===_.loader)throw Object.defineProperty(Error(`Image with src "${e}" is missing "loader" prop. 2Read more: https://nextjs.org/docs/messages/next-image-missing-loader`),"__NEXT_ERROR_CODE",{value:"E252",enumerable:!1,configurable:!0})}else{let e=B;B=t=>{let{config:i,...r}=t;return e(r)}}if(k){"fill"===k&&(h=!0);let e={intrinsic:{maxWidth:"100%",height:"auto"},responsive:{width:"100%",height:"auto"}}[k];e&&(b={...b,...e});let i={responsive:"100vw",fill:"100vw"}[k];i&&!t&&(t=i)}let F="",q=l(g),G=l(f);if((D=e)&&"object"==typeof D&&(n(D)||void 0!==D.src)){let t=n(e)?e.default:e;if(!t.src)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(t)}
2`),"__NEXT_ERROR_CODE",{value:"E460",enumerable:!1,configurable:!0});if(!t.height||!t.width)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(t)}`),"__NEXT_ERROR_CODE",{value:"E48",enumerable:!1,configurable:!0});if(O=t.blurWidth,T=t.blurHeight,j=j||t.blurDataURL,F=t.src,!h)if(q||G){if(q&&!G){let e=q/t.width;G=Math.round(t.height*e)}else if(!q&&G){let e=G/t.height;q=Math.round(t.width*e)}}else q=t.width,G=t.height}let J=!c&&!d&&("lazy"===p||void 0===p);(!(e="string"==typeof e?e:F)||e.startsWith("data:")||e.startsWith("blob:"))&&(i=!0,J=!1),_.unoptimized&&(i=!0),U&&!_.dangerouslyAllowSVG&&e.split("?",1)[0].endsWith(".svg")&&(i=!0);let H=l(m),Z=Object.assign(h?{position:"absolute",height:"100%",width:"100%",left:0,top:0,right:0,bottom:0,objectFit:S,objectPosition:P}:{},z?{}:{color:"transparent"},b),K=W||"empty"===x?null:"blur"===x?`url("data:image/svg+xml;charset=utf-8,${(0,o.getImageBlurSvg)({widthInt:q,heightInt:G,blurWidth:O,blurHeight:T,blurDataURL:j||"",objectFit:Z.objectFit})}")`:`url("${x}")`,V=s.includes(Z.objectFit)?"fill"===Z.objectFit?"100% 100%":"cover":Z.objectFit,Q=K?{backgroundSize:V,backgroundPosition:Z.objectPosition||"50% 50%",backgroundRepeat:"no-repeat",backgroundImage:K}:{},Y=function({config:e,src:t,unoptimized:i,width:o,quality:a,sizes:s,loader:n}){if(i){let e=(0,r.getDeploymentId)();if(t.startsWith("/")&&!t.startsWith("//")&&e){let i=t.includes("?")?"&":"?";t=`${t}${i}dpl=${e}`}return{src:t,srcSet:void 0,sizes:void 0}}let{widths:l,kind:c}=function({deviceSizes:e,allSizes:t},i,r){if(r){let i=/(^|\s)(1?\d?\d)vw/g,o=[];for(let e;e=i.exec(r);)o.push(parseInt(e[2]));if(o.length){let i=.01*Math.min(...o);return{widths:t.filter(t=>t>=e[0]*i),kind:"w"}}return{widths:t,kind:"w"}}return"number"!=typeof i?{widths:e,kind:"w"}:{widths:[...new Set([i,2*i].map(e=>t.find(t=>t>=e)||t[t.length-1]))],kind:"x"}}(e,o,s),d=l.length-1;return{sizes:s||"w"!==c?s:"100vw",srcSet:l.map((i,r)=>`${n({config:e,src:t,quality:a,width:i})} ${"w"===c?i:r+1}${c}`).join(", "),src:n({config:e,src:t,quality:a,width:l[d]})}}({config:_,src:e,unoptimized:i,width:q,quality:H,sizes:t,loader:B}),X=J?"lazy":p;return{props:{...E,loading:X,fetchPriority:I,width:q,height:G,decoding:N,className:u,style:{...Z,...Q},sizes:Y.sizes,srcSet:Y.srcSet,src:y||Y.src},meta:{unoptimized:i,preload:d||c,placeholder:x,fill:h}}}},98879,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"default",{enumerable:!0,get:function(){return n}});let r=e.r(71645),o="undefined"==typeof window,a=o?()=>{}:r.useLayoutEffect,s=o?()=>{}:r.useEffect;function n(e){let{headManager:t,reduceComponentsToState:i}=e;function n(){if(t&&t.mountedInstances){let e=r.Children.toArray(Array.from(t.mountedInstances).filter(Boolean));t.updateHead(i(e))}}return o&&(t?.mountedInstances?.add(e.children),n()),a(()=>(t?.mountedInstances?.add(e.children),()=>{t?.mountedInstances?.delete(e.children)})),a(()=>(t&&(t._pendingUpdate=n),()=>{t&&(t._pendingUpdate=n)})),s(()=>(t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null),()=>{t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null)})),null}},25633,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});var r={default:function(){return f},defaultHead:function(){return p}};for(var o in r)Object.defineProperty(i,o,{enumerable:!0,get:r[o]});let a=e.r(55682),s=e.r(90809),n=e.r(43476),l=s._(e.r(71645)),c=a._(e.r(98879)),d=e.r(42732);function p(){return[(0,n.jsx)("meta",{charSet:"utf-8"},"charset"),(0,n.jsx)("meta",{name:"viewport",content:"width=device-width"},"viewport")]}function u(e,t){return"string"==typeof t||"number"==typeof t?e:t.type===l.default.Fragment?e.concat(l.default.Children.toArray(t.props.children).reduce((e,t)=>"string"==typeof t||"number"==typeof t?e:e.concat(t),[])):e.concat(t)}e.r(33525);let m=["name","httpEquiv","charSet","itemProp"];function g(e){let t,i,r,o;return e.reduce(u,[]).reverse().concat(p().reverse()).filter((t=new Set,i=new Set,r=new Set,o={},e=>{let a=!0,s=!1;if(e.key&&"number"!=typeof e.key&&e.key.indexOf("$")>0){s=!0;let i=e.key.slice(e.key.indexOf("$")+1);t.has(i)?a=!1:t.add(i)}switch(e.type){case"title":case"base":i.has(e.type)?a=!1:i.add(e.type);break;case"meta":for(let t=0,i=m.length;t<i;t++){let i=m[t];if(e.props.hasOwnProperty(i))if("charSet"===i)r.has(i)?a=!1:r.add(i);else{let t=e.props[i],r=o[i]||new Set;("name"!==i||!s)&&r.has(t)?a=!1:(r.add(t),o[i]=r)}}}return a})).reverse().map((e,t)=>{let i=e.key||t;return l.default.cloneElement(e,{key:i})})}let f=function({children:e}){let t=(0,l.useContext)(d.HeadManagerContext);return(0,n.jsx)(c.default,{reduceComponentsToState:g,headManager:t,children:e})};("function"==typeof i.default||"object"==typeof i.default&&null!==i.default)&&void 0===i.default.__esModule&&(Object.defineProperty(i.default,"__esMo
2dule",{value:!0}),Object.assign(i.default,i),t.exports=i.default)},18556,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"ImageConfigContext",{enumerable:!0,get:function(){return a}});let r=e.r(55682)._(e.r(71645)),o=e.r(87690),a=r.default.createContext(o.imageConfigDefault)},65856,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"RouterContext",{enumerable:!0,get:function(){return r}});let r=e.r(55682)._(e.r(71645)).default.createContext(null)},70965,(e,t,i)=>{"use strict";function r(e,t){let i=e||75;return t?.qualities?.length?t.qualities.reduce((e,t)=>Math.abs(t-i)<Math.abs(e-i)?t:e,0):i}Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"findClosestQuality",{enumerable:!0,get:function(){return r}})},1948,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"default",{enumerable:!0,get:function(){return s}});let r=e.r(70965),o=e.r(43369);function a({config:e,src:t,width:i,quality:a}){if(t.startsWith("/")&&t.includes("?")&&e.localPatterns?.length===1&&"**"===e.localPatterns[0].pathname&&""===e.localPatterns[0].search)throw Object.defineProperty(Error(`Image with src "${t}" is using a query string which is not configured in images.localPatterns. 3Read more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`),"__NEXT_ERROR_CODE",{value:"E871",enumerable:!1,configurable:!0});let s=(0,r.findClosestQuality)(a,e),n=(0,o.getDeploymentId)();return`${e.path}?url=${encodeURIComponent(t)}&w=${i}&q=${s}${t.startsWith("/")&&n?`&dpl=${n}`:""}`}a.__next_img_default=!0;let s=a},18581,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"useMergedRef",{enumerable:!0,get:function(){return o}});let r=e.r(71645);function o(e,t){let i=(0,r.useRef)(null),o=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=i.current;e&&(i.current=null,e());let t=o.current;t&&(o.current=null,t())}else e&&(i.current=a(e,r)),t&&(o.current=a(t,r))},[e,t])}function a(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let i=e(t);return"function"==typeof i?i:()=>e(null)}}("function"==typeof i.default||"object"==typeof i.default&&null!==i.default)&&void 0===i.default.__esModule&&(Object.defineProperty(i.default,"__esModule",{value:!0}),Object.assign(i.default,i),t.exports=i.default)},5500,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"Image",{enumerable:!0,get:function(){return w}});let r=e.r(55682),o=e.r(90809),a=e.r(43476),s=o._(e.r(71645)),n=r._(e.r(74080)),l=r._(e.r(25633)),c=e.r(8927),d=e.r(87690),p=e.r(18556);e.r(33525);let u=e.r(65856),m=r._(e.r(1948)),g=e.r(18581),f={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],qualities:[75],path:"/_next/image",loader:"default",dangerouslyAllowSVG:!0,unoptimized:!1};function h(e,t,i,r,o,a,s){let n=e?.src;e&&e["data-loaded-src"]!==n&&(e["data-loaded-src"]=n,("decode"in e?e.decode():Promise.resolve()).catch(()=>{}).then(()=>{if(e.parentElement&&e.isConnected){if("empty"!==t&&o(!0),i?.current){let t=new Event("load");Object.defineProperty(t,"target",{writable:!1,value:e});let r=!1,o=!1;i.current({...t,nativeEvent:t,currentTarget:e,target:e,isDefaultPrevented:()=>r,isPropagationStopped:()=>o,persist:()=>{},preventDefault:()=>{r=!0,t.preventDefault()},stopPropagation:()=>{o=!0,t.stopPropagation()}})}r?.current&&r.current(e)}}))}function b(e){return s.use?{fetchPriority:e}:{fetchpriority:e}}"undefined"==typeof window&&(globalThis.__NEXT_IMAGE_IMPORTED=!0);let y=(0,s.forwardRef)(({src:e,srcSet:t,sizes:i,height:r,width:o,decoding:n,className:l,style:c,fetchPriority:d,placeholder:p,loading:u,unoptimized:m,fill:f,onLoadRef:y,onLoadingCompleteRef:v,setBlurComplete:w,setShowAltText:x,sizesInput:j,onLoad:I,onError:N,...k},S)=>{let P=(0,s.useCallback)(e=>{e&&(N&&(e.src=e.src),e.complete&&h(e,p,y,v,w,m,j))},[e,p,y,v,w,N,m,j]),A=(0,g.useMergedRef)(S,P);return(0,a.jsx)("img",{...k,...b(d),loading:u,width:o,height:r,decoding:n,"data-nimg":f?"fill":"1",className:l,style:c,sizes:i,srcSet:t,src:e,ref:A,onLoad:e=>{h(e.currentTarget,p,y,v,w,m,j)},onError:e=>{x(!0),"empty"!==p&&w(!0),N&&N(e)}})});function v({isAppRouter:e,imgAttributes:t}){let i={as:"image",imageSrcSet:t.srcSet,imageSizes:t.sizes,crossOrigin:t.crossOrigin,referrerPolicy:t.referrerPolicy,...b(t.fetchPriority)};return e&&n.default.preload?(n.default.preload(t.src,i),null):(0,a.jsx)(l.default,{children:(0,a.jsx)("link",{rel:"preload",href:t.srcSet?void 0:t.src,...i},"__nimg-"+t.src+t.srcSet+t.sizes)})}let w=(0,s.forwardRef)((e,t)=>{let i=(0,s.useContext)(u.RouterContext),r=(0,s.useContext)(p.ImageConfigContext),o=(0,s.useMemo)(()=>{let e=f||r||d.imageConfigDefault,t=[...e.deviceSizes,...e.imageSizes].sort((e,t)=>
3e-t),i=e.deviceSizes.sort((e,t)=>e-t),o=e.qualities?.sort((e,t)=>e-t);return{...e,allSizes:t,deviceSizes:i,qualities:o,localPatterns:"undefined"==typeof window?r?.localPatterns:e.localPatterns}},[r]),{onLoad:n,onLoadingComplete:l}=e,g=(0,s.useRef)(n);(0,s.useEffect)(()=>{g.current=n},[n]);let h=(0,s.useRef)(l);(0,s.useEffect)(()=>{h.current=l},[l]);let[b,w]=(0,s.useState)(!1),[x,j]=(0,s.useState)(!1),{props:I,meta:N}=(0,c.getImgProps)(e,{defaultLoader:m.default,imgConf:o,blurComplete:b,showAltText:x});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(y,{...I,unoptimized:N.unoptimized,placeholder:N.placeholder,fill:N.fill,onLoadRef:g,onLoadingCompleteRef:h,setBlurComplete:w,setShowAltText:j,sizesInput:e.sizes,ref:t}),N.preload?(0,a.jsx)(v,{isAppRouter:!i,imgAttributes:I}):null]})});("function"==typeof i.default||"object"==typeof i.default&&null!==i.default)&&void 0===i.default.__esModule&&(Object.defineProperty(i.default,"__esModule",{value:!0}),Object.assign(i.default,i),t.exports=i.default)},98183,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});var r={assign:function(){return l},searchParamsToUrlQuery:function(){return a},urlQueryToSearchParams:function(){return n}};for(var o in r)Object.defineProperty(i,o,{enumerable:!0,get:r[o]});function a(e){let t={};for(let[i,r]of e.entries()){let e=t[i];void 0===e?t[i]=r:Array.isArray(e)?e.push(r):t[i]=[e,r]}return t}function s(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function n(e){let t=new URLSearchParams;for(let[i,r]of Object.entries(e))if(Array.isArray(r))for(let e of r)t.append(i,s(e));else t.set(i,s(r));return t}function l(e,...t){for(let i of t){for(let t of i.keys())e.delete(t);for(let[t,r]of i.entries())e.append(t,r)}return e}},95057,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});var r={formatUrl:function(){return n},formatWithValidation:function(){return c},urlObjectKeys:function(){return l}};for(var o in r)Object.defineProperty(i,o,{enumerable:!0,get:r[o]});let a=e.r(90809)._(e.r(98183)),s=/https?|ftp|gopher|file/;function n(e){let{auth:t,hostname:i}=e,r=e.protocol||"",o=e.pathname||"",n=e.hash||"",l=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:i&&(c=t+(~i.indexOf(":")?`[${i}]`:i),e.port&&(c+=":"+e.port)),l&&"object"==typeof l&&(l=String(a.urlQueryToSearchParams(l)));let d=e.search||l&&`?${l}`||"";return r&&!r.endsWith(":")&&(r+=":"),e.slashes||(!r||s.test(r))&&!1!==c?(c="//"+(c||""),o&&"/"!==o[0]&&(o="/"+o)):c||(c=""),n&&"#"!==n[0]&&(n="#"+n),d&&"?"!==d[0]&&(d="?"+d),o=o.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${r}${c}${o}${d}${n}`}let l=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return n(e)}},18967,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});var r={DecodeError:function(){return b},MiddlewareNotFoundError:function(){return x},MissingStaticPage:function(){return w},NormalizeError:function(){return y},PageNotFoundError:function(){return v},SP:function(){return f},ST:function(){return h},WEB_VITALS:function(){return a},execOnce:function(){return s},getDisplayName:function(){return p},getLocationOrigin:function(){return c},getURL:function(){return d},isAbsoluteUrl:function(){return l},isResSent:function(){return u},loadGetInitialProps:function(){return g},normalizeRepeatedSlashes:function(){return m},stringifyError:function(){return j}};for(var o in r)Object.defineProperty(i,o,{enumerable:!0,get:r[o]});let a=["CLS","FCP","FID","INP","LCP","TTFB"];function s(e){let t,i=!1;return(...r)=>(i||(i=!0,t=e(...r)),t)}let n=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,l=e=>n.test(e);function c(){let{protocol:e,hostname:t,port:i}=window.location;return`${e}//${t}${i?":"+i:""}`}function d(){let{href:e}=window.location,t=c();return e.substring(t.length)}function p(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function u(e){return e.finished||e.headersSent}function m(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function g(e,t){let i=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await g(t.Component,t.ctx)}:{};let r=await e.getInitialProps(t);if(i&&u(i))return r;if(!r)throw Object.defineProperty(Error(`"${p(e)}.getInitialProps()" should resolve to an object. But found "${r}
3" instead.`),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return r}let f="undefined"!=typeof performance,h=f&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class b extends Error{}class y extends Error{}class v extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class w extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class x extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function j(e){return JSON.stringify({message:e.message,stack:e.stack})}},73668,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"isLocalURL",{enumerable:!0,get:function(){return a}});let r=e.r(18967),o=e.r(52817);function a(e){if(!(0,r.isAbsoluteUrl)(e))return!0;try{let t=(0,r.getLocationOrigin)(),i=new URL(e,t);return i.origin===t&&(0,o.hasBasePath)(i.pathname)}catch(e){return!1}}},84508,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"errorOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}},22016,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});var r={default:function(){return b},useLinkStatus:function(){return v}};for(var o in r)Object.defineProperty(i,o,{enumerable:!0,get:r[o]});let a=e.r(90809),s=e.r(43476),n=a._(e.r(71645)),l=e.r(95057),c=e.r(8372),d=e.r(18581),p=e.r(18967),u=e.r(5550);e.r(33525);let m=e.r(91949),g=e.r(73668),f=e.r(9396);function h(e){return"string"==typeof e?e:(0,l.formatUrl)(e)}function b(t){var i;let r,o,a,[l,b]=(0,n.useOptimistic)(m.IDLE_LINK_STATUS),v=(0,n.useRef)(null),{href:w,as:x,children:j,prefetch:I=null,passHref:N,replace:k,shallow:S,scroll:P,onClick:A,onMouseEnter:M,onTouchStart:E,legacyBehavior:C=!1,onNavigate:D,ref:_,unstable_dynamicOnHover:O,...T}=t;r=j,C&&("string"==typeof r||"number"==typeof r)&&(r=(0,s.jsx)("a",{children:r}));let R=n.default.useContext(c.AppRouterContext),z=!1!==I,W=!1!==I?null===(i=I)||"auto"===i?f.FetchStrategy.PPR:f.FetchStrategy.Full:f.FetchStrategy.PPR,{href:L,as:$}=n.default.useMemo(()=>{let e=h(w);return{href:e,as:x?h(x):e}},[w,x]);if(C){if(r?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});o=n.default.Children.only(r)}let B=C?o&&"object"==typeof o&&o.ref:_,U=n.default.useCallback(e=>(null!==R&&(v.current=(0,m.mountLinkInstance)(e,L,R,W,z,b)),()=>{v.current&&((0,m.unmountLinkForCurrentNavigation)(v.current),v.current=null),(0,m.unmountPrefetchableInstance)(e)}),[z,L,R,W,b]),F={ref:(0,d.useMergedRef)(U,B),onClick(t){C||"function"!=typeof A||A(t),C&&o.props&&"function"==typeof o.props.onClick&&o.props.onClick(t),!R||t.defaultPrevented||function(t,i,r,o,a,s,l){if("undefined"!=typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,g.isLocalURL)(i)){a&&(t.preventDefault(),location.replace(i));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:p}=e.r(99781);n.default.startTransition(()=>{p(r||i,a?"replace":"push",s??!0,o.current)})}}(t,L,$,v,k,P,D)},onMouseEnter(e){C||"function"!=typeof M||M(e),C&&o.props&&"function"==typeof o.props.onMouseEnter&&o.props.onMouseEnter(e),R&&z&&(0,m.onNavigationIntent)(e.currentTarget,!0===O)},onTouchStart:function(e){C||"function"!=typeof E||E(e),C&&o.props&&"function"==typeof o.props.onTouchStart&&o.props.onTouchStart(e),R&&z&&(0,m.onNavigationIntent)(e.currentTarget,!0===O)}};return(0,p.isAbsoluteUrl)($)?F.href=$:C&&!N&&("a"!==o.type||"href"in o.props)||(F.href=(0,u.addBasePath)($)),a=C?n.default.cloneElement(o,F):(0,s.jsx)("a",{...T,...F,children:r}),(0,s.jsx)(y.Provider,{value:l,children:a})}e.r(84508);let y=(0,n.createContext)(m.IDLE_LINK_STATUS),v=()=>(0,n.useContext)(y);("function"==typeof i.default||"object"==typeof i.default&&null!==i.default)&&void 0===i.default.__esModule&&(Object.defineProperty(i.default,"__esMo
3dule",{value:!0}),Object.assign(i.default,i),t.exports=i.default)},94909,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});var r={default:function(){return d},getImageProps:function(){return c}};for(var o in r)Object.defineProperty(i,o,{enumerable:!0,get:r[o]});let a=e.r(55682),s=e.r(8927),n=e.r(5500),l=a._(e.r(1948));function c(e){let{props:t}=(0,s.getImgProps)(e,{defaultLoader:l.default,imgConf:{deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],qualities:[75],path:"/_next/image",loader:"default",dangerouslyAllowSVG:!0,unoptimized:!1}});for(let[e,i]of Object.entries(t))void 0===i&&delete t[e];return{props:t}}let d=n.Image},57688,(e,t,i)=>{t.exports=e.r(94909)},52683,e=>{"use strict";var t=e.i(43476),i=e.i(71645);let r=["AI Tools","Developer APIs","Image Processing","E-commerce","Real-time Apps","DevOps & Tools","CMS & Content","Analytics & Monitoring","Authentication & Security","Data & Database"],o=[{id:"netflix",name:"Netflix",description:"Using Node.js for part of their backend / API services; improved startup time.",category:"Developer APIs",website:"https://netflix.com",logo:"/logos/netflix.svg",article:{overview:"Netflix, the world's leading streaming service, made a significant technological shift by adopting Node.js for their user interface and certain backend services. This transition was part of their move away from a monolithic architecture to a more flexible, microservices-based approach.",techStack:"Netflix leverages Node.js alongside a diverse technology stack that includes Java for core services, React for the user interface, and various AWS services for cloud infrastructure. Node.js particularly shines in their client-side architecture and API layer, where its event-driven, non-blocking I/O model helps handle millions of concurrent connections efficiently.",impact:"The adoption of Node.js has had a remarkable impact on Netflix's development velocity and application performance. They reported significant improvements in startup time, with the initial startup time reduced by 70%. The switch to Node.js also enabled better code sharing between server and client, improving development efficiency.",features:["Microservices architecture powered by Node.js for better scalability","Universal JavaScript applications for improved performance","Event-driven architecture for handling millions of concurrent streams","Real-time analytics and monitoring capabilities","Efficient content delivery and adaptive streaming"]}},{id:"trello",name:"Trello",description:"The server side of Trello was built with Node.js to support real-time updates.",category:"Real-time Apps",website:"https://trello.com",logo:"/logos/trello.svg"},{id:"paypal",name:"PayPal",description:"Migrated parts of its backend stack to Node.js (from Java) to unify frontend + backend language.",category:"E-commerce",website:"https://paypal.com",logo:"/logos/paypal.svg",article:{overview:"PayPal made a strategic decision to migrate from a traditional Java-based stack to Node.js for their web applications. This move was driven by the need for faster development cycles and better performance in handling concurrent connections for their payment processing systems.",techStack:"PayPal's Node.js implementation works alongside their existing Java infrastructure, with Node.js primarily handling the web-facing components. They use Express.js for routing, their own open-source Kraken.js framework for structure, and various internal tools built specifically for large-scale Node.js deployment.",impact:"The migration to Node.js resulted in remarkable improvements: application development time was reduced by 2x, the codebase was reduced by 33%, and they achieved 35% faster page load times. These improvements directly translated to better user experience and development efficiency.",features:["Unified JavaScript development across frontend and backend","Custom-built Kraken.js framework for enterprise-scale applications","Real-time payment processing capabilities","High-performance API endpoints","Advanced security implementations for financial transactions"]}},{id:"linkedin",name:"LinkedIn",description:"Moved their mobile-app backend from Ruby to Node.js.",category:"Developer APIs",website:"https://linkedin.com",logo:"/logos/linkedin.svg"},{id:"walmart",name:"Walmart",description:"Uses Node.js especially in their e-commerce/online platform infrastru
3cture.",category:"E-commerce",website:"https://walmart.com",logo:"/logos/walmart.svg",article:{overview:"Walmart, one of the world's largest retailers, made a strategic move to Node.js to power their e-commerce platform. This decision was driven by the need to handle massive scale during peak shopping periods like Black Friday, while maintaining high performance and reliability.",techStack:"Walmart's Node.js implementation is part of a sophisticated microservices architecture. They use HAPI.js for their API framework, React for the frontend, and various custom-built tools for monitoring and deployment. Their stack is designed to handle enormous traffic spikes while maintaining sub-second response times.",impact:"The adoption of Node.js has transformed Walmart's online presence. During Black Friday, their platform successfully handled over 20,000 requests per second with zero downtime. The event-driven architecture of Node.js has been crucial in managing inventory updates, price changes, and order processing at massive scale.",features:["High-performance e-commerce platform","Real-time inventory management","Dynamic pricing system","Mobile app backend services","Integrated online-to-store services"]}},{id:"uber",name:"Uber",description:"Node.js plays a role in its backend, especially for handling many concurrent real-time operations.",category:"Real-time Apps",website:"https://uber.com",logo:"/logos/uber.svg",article:{overview:"Uber, the global ride-sharing platform, relies heavily on Node.js for handling its massive real-time operations. The platform processes millions of trips daily, requiring a robust system that can handle real-time location updates, matching algorithms, and payment processing simultaneously.",techStack:"Uber's technology stack includes Node.js for many of its critical microservices, especially those handling real-time features. They use a combination of Node.js with Redis for real-time data, MySQL for persistent storage, and their own open-source projects like Ringpop for scaling Node.js applications.",impact:"Node.js has been crucial in Uber's ability to scale globally. Its event-driven architecture has enabled Uber to handle millions of real-time geolocation updates and trip requests efficiently. The platform processes over 20 billion trips annually, with Node.js playing a vital role in this scale.",features:["Real-time driver and rider matching system","Geolocation tracking and updates","Trip fare calculation and dynamic pricing","Payment processing integration","Real-time analytics and monitoring"]}},{id:"nasa",name:"NASA",description:"They've used Node.js for certain systems to simplify their stack and improve performance.",category:"Developer APIs",website:"https://nasa.gov",logo:"/logos/nasa.svg",article:{overview:"NASA's adoption of Node.js marks a significant modernization in their data management and space exploration systems. The space agency uses Node.js for various critical applications, including their EVA (Extravehicular Activity) database, which manages data about spacewalks and mission-critical operations.",techStack:"NASA's Node.js implementation is part of a modern tech stack that includes cloud services, real-time data processing systems, and various open-source technologies. They particularly leverage Node.js's ability to handle real-time data streams from space missions and ground control systems.",impact:"The implementation of Node.js has helped NASA improve their data processing capabilities and system reliability. One notable example is the significant reduction in development time and improved data access speed for their EVA system, which was moved from a legacy system to a Node.js-based solution.",features:["Real-time space mission data processing","EVA (spacewalk) database management","Integration with legacy space systems","High-performance API endpoints for public data access","Scalable architecture for handling mission-critical operations"]}},{id:"rocketchat",name:"Rocket.Chat",description:"Real-time chat / collaboration platform built with Node.js + TypeScript + MongoDB.",category:"Real-time Apps",website:"https://rocket.chat",logo:"/logos/rocketchat.svg",openSource:!0},{id:"ishotaphoto",name:"I Shot A Photo",description:"I Shot A Photo â an AI-powered photo service built with Node.js that automatically prepares official document photos for government compliance. This innovative platform ensures your photos meet passport, visa, and ID requirements with professional-grade processing, offering a fast and free solution for users worldwide.",category:"AI Tools",website:"https://ishotaphoto.com",logo:"/face.png",featured:!0,article:{overview:"I Shot A Photo is an innovative AI-powered photo service that revolutionizes the way people obtain official document photos. The platform leverages Node.js and advanced AI technologies to automatically process and validate photos for various government documents, ensuring they meet strict compliance requirements.",techStack:"The service is built on a modern tech stack with Node.js at its core. It uses Express.js for the web framework, Sharp for high-performance image processing, and various AI/ML libraries for face detection and image analysis. The system employs Next.js for the frontend, providing a seamless user experience with server-side rendering capabilities.",impact:"By automating the document photo preparation process, I Shot A Photo has made it significantly easier and more cost-effective for users worldwide to obtain compliant photos for official documents. The service processes thousands of photos daily, helping users save time and money compared to traditional photo studios.",features:["AI-powered face detection and positioning","Automatic background removal and replacement","Multiple document format support (passports, visas, IDs)","Professional-grade image processing","Real-time val
3idation against government requirements","International standards compliance checking"]}},{id:"socketio",name:"Socket.io",description:"Socket.io is a real-time communication library for Node.js that enables bidirectional event-based communication between web clients and servers. Widely used for chat applications, live notifications, and collaborative tools, Socket.io provides reliable real-time functionality with automatic fallbacks and reconnection capabilities.",category:"Real-time Apps",website:"https://socket.io",logo:"/logos/socketio.svg",openSource:!0},{id:"strapi",name:"Strapi",description:"Strapi is a leading open-source headless CMS built with Node.js that provides developers with a flexible and customizable content management system. With its powerful API generation, role-based access control, and extensive plugin ecosystem, Strapi enables rapid development of modern web applications and digital experiences.",category:"Developer APIs",website:"https://strapi.io",logo:"/logos/strapi.svg",openSource:!0},{id:"showprices",name:"showprices",description:"A curated directory of travel platforms, blogs, and services trusted by explorers across the globe. Compare tickets, master visa paperwork, and stay inspired with field-tested resources.",category:"CMS & Content",website:"https://showprices.ru",logo:"/logos/showprices.svg"},{id:"ghost",name:"Ghost",description:"Ghost is a modern publishing platform built with Node.js, designed specifically for professional publishers, bloggers, and content creators. Featuring a clean, distraction-free editor, built-in SEO tools, and powerful membership features, Ghost provides everything needed to build and monetize a successful publication.",category:"E-commerce",website:"https://ghost.org",logo:"/logos/ghost.svg",openSource:!0},{id:"parse-server",name:"Parse Server",description:"Parse Server is an open-source backend framework built with Node.js that provides a complete backend solution for mobile and web applications. With features like user authentication, push notifications, file storage, and real-time subscriptions, Parse Server simplifies backend development and scales effortlessly.",category:"Developer APIs",website:"https://parseplatform.org",logo:"/logos/parse.svg",openSource:!0},{id:"botpress",name:"Botpress",description:"Botpress is a conversational AI platform built with Node.js that enables developers to create, deploy, and manage intelligent chatbots and virtual assistants. With its visual flow builder, natural language understanding, and multi-channel deployment capabilities, Botpress makes AI-powered conversations accessible to businesses of all sizes.",category:"AI Tools",website:"https://botpress.com",logo:"/logos/botpress.svg"},{id:"n8n",name:"n8n",description:"n8n is a powerful workflow automation tool built with Node.js that allows users to connect different services and automate complex business processes. With its visual workflow editor, extensive integrations, and self-hosted capabilities, n8n enables teams to streamline operations and reduce manual work through intelligent automation.",category:"Developer APIs",website:"https://n8n.io",logo:"/logos/n8n.svg",openSource:!0},{id:"directus",name:"Directus",description:"Directus is an open-source data platform built with Node.js that provides a real-time API and intuitive admin app for any SQL database. With its flexible data modeling, role-based permissions, and extensive customization options, Directus serves as both a headless CMS and a powerful database management tool.",category:"Developer APIs",website:"https://directus.io",logo:"/logos/directus.svg",openSource:!0},{id:"sharp",name:"Sharp",description:"Sharp is a high-performance image processing library for Node.js that provides fast, efficient image manipulation capabilities. Widely used for resizing, cropping, format conversion, and applying filters, Sharp powers many image processing applications and services with its optimized native bindings and comprehensive API. It's the backbone of services like I Shot A Photo for professional document photo processing.",category:"Image Processing",website:"https://sharp.pixelplumbing.com",logo:"/logos/sharp.svg",openSource:!0},{id:"express",name:"Express.js",description:"Express.js is the most popular web framework for Node.js, providing a minimal and flexible foundation for building web applications and APIs. With its robust routing system, middleware support, and extensive ecosystem, Express.js has become the standard choice for Node.js web development, powering countless applications worldwide.",category:"Developer APIs",website:"https://expressjs.com",logo:"/logos/express.svg",openSource:!0},{id:"nextjs",name:"Next.js",description:"Next.js is a React framework built with Node.js that enables developers to build fast, SEO-friendly web applications with server-side rendering and static site generation. With features like automatic code splitting, API routes, and built-in optimization, Next.js has become the go-to choice for modern React applications.",category:"Developer APIs",website:"https://nextjs.org",logo:"/logos/nextjs.svg",openSource:!0},{id:"prisma",name:"Prisma",description:"Prisma is a modern database toolkit for Node.js that provides type-safe database access, query building, and schema management. With its intuitive API, automatic migrations, and excellent Type
3Script support, Prisma simplifies database operations and helps developers build reliable, scalable applications with confidence.",category:"Developer APIs",website:"https://prisma.io",logo:"/logos/prisma.svg",openSource:!0},{id:"nodemailer",name:"Nodemailer",description:"Nodemailer is a popular email sending library for Node.js applications that provides a simple and reliable way to send emails programmatically. With support for various email services, HTML templates, attachments, and advanced features like delivery tracking, Nodemailer is essential for applications requiring email functionality.",category:"Developer APIs",website:"https://nodemailer.com",logo:"/logos/nodemailer.svg",openSource:!0},{id:"multer",name:"Multer",description:"Multer is a Node.js middleware for handling multipart/form-data, primarily used for file uploads in web applications. With its simple API, memory and disk storage options, and file filtering capabilities, Multer makes it easy to implement robust file upload functionality in Express.js applications.",category:"Image Processing",website:"https://github.com/expressjs/multer",logo:"/logos/multer.svg",openSource:!0},{id:"bull",name:"Bull",description:"Bull is a Redis-based queue system for Node.js that provides powerful job processing capabilities for background tasks. With features like job scheduling, retry mechanisms, and monitoring dashboards, Bull helps developers build scalable applications that can handle heavy workloads and complex processing requirements efficiently.",category:"Developer APIs",website:"https://github.com/OptimalBits/bull",logo:"/logos/bull.svg",openSource:!0},{id:"pm2",name:"PM2",description:"PM2 is a production process manager for Node.js applications that provides advanced process management capabilities. With features like load balancing, monitoring, clustering, and automatic restarts, PM2 ensures your Node.js applications run reliably in production environments with minimal downtime.",category:"DevOps & Tools",website:"https://pm2.keymetrics.io",logo:"/logos/pm2.svg",openSource:!0},{id:"nodemon",name:"Nodemon",description:"Nodemon is a utility that monitors for any changes in your source code and automatically restarts your Node.js application. Perfect for development environments, Nodemon eliminates the need to manually restart your server every time you make changes, significantly improving the development workflow.",category:"DevOps & Tools",website:"https://nodemon.io",logo:"/logos/nodemon.svg",openSource:!0},{id:"webpack",name:"Webpack",description:"Webpack is a powerful module bundler for JavaScript applications that transforms and bundles your code for production. With its extensive plugin ecosystem, code splitting capabilities, and optimization features, Webpack has become the standard tool for building modern web applications with Node.js.",category:"DevOps & Tools",website:"https://webpack.js.org",logo:"/logos/webpack.svg",openSource:!0},{id:"jest",name:"Jest",description:"Jest is a delightful JavaScript testing framework with a focus on simplicity and developer experience. With built-in mocking, code coverage, and snapshot testing capabilities, Jest makes it easy to write comprehensive tests for your Node.js applications and ensures code reliability.",category:"DevOps & Tools",website:"https://jestjs.io",logo:"/logos/jest.svg",openSource:!0},{id:"passport",name:"Passport",description:"Passport is a comprehensive authentication middleware for Node.js that provides a simple, unobtrusive way to implement authentication strategies. With support for over 500 authentication strategies including OAuth, OpenID, and local authentication, Passport simplifies the implementation of secure authentication systems.",category:"Authentication & Security",website:"https://passportjs.org",logo:"/logos/passport.svg",openSource:!0},{id:"jsonwebtoken",name:"JSON Web Token",description:"JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. This Node.js library provides a simple way to create, verify, and decode JWTs, making it easy to implement stateless authentication and secure data exchange in web applications.",category:"Authentication & Security",website:"https://github.com/auth0/node-jsonwebtoken",logo:"/logos/jwt.svg",openSource:!0},{id:"mongoose",name:"Mongoose",description:"Mongoose is an elegant MongoDB object modeling tool designed to work in an asynchronous environment. With its sc
3hema-based approach, built-in type casting, validation, and query building, Mongoose simplifies MongoDB operations and provides a more structured way to work with NoSQL databases in Node.js applications.",category:"Data & Database",website:"https://mongoosejs.com",logo:"/logos/mongoose.svg",openSource:!0},{id:"sequelize",name:"Sequelize",description:"Sequelize is a promise-based Node.js ORM for Postgres, MySQL, MariaDB, SQLite, and Microsoft SQL Server. With its powerful query interface, migrations, and associations, Sequelize provides a robust solution for working with relational databases while maintaining type safety and code organization.",category:"Data & Database",website:"https://sequelize.org",logo:"/logos/sequelize.svg",openSource:!0},{id:"redis",name:"Redis",description:"Redis is an in-memory data structure store that can be used as a database, cache, and message broker. The Node.js Redis client provides a fast and reliable way to interact with Redis servers, enabling applications to leverage Redis's high-performance capabilities for caching, session storage, and real-time features.",category:"Data & Database",website:"https://redis.io",logo:"/logos/redis.svg",openSource:!0},{id:"winston",name:"Winston",description:"Winston is a simple and universal logging library for Node.js applications that supports multiple transports and log levels. With its flexible configuration options and support for various output formats, Winston helps developers implement comprehensive logging strategies for monitoring and debugging applications.",category:"Analytics & Monitoring",website:"https://github.com/winstonjs/winston",logo:"/logos/winston.svg",openSource:!0},{id:"sentry",name:"Sentry",description:"Sentry is an error tracking and performance monitoring platform that helps developers identify and fix issues in their Node.js applications. With its real-time error reporting, performance monitoring, and release tracking, Sentry provides comprehensive insights into application health and user experience.",category:"Analytics & Monitoring",website:"https://sentry.io",logo:"/logos/sentry.svg"},{id:"stripe",name:"Stripe",description:"Stripe is a comprehensive payment processing platform that provides APIs for accepting payments online. The Node.js SDK makes it easy to integrate Stripe's payment functionality into applications, enabling developers to accept credit cards, digital wallets, and other payment methods securely.",category:"E-commerce",website:"https://stripe.com",logo:"/logos/stripe.svg"},{id:"shopify",name:"Shopify",description:"Shopify is a leading e-commerce platform that provides APIs for building custom storefronts and applications. The Node.js SDK enables developers to integrate with Shopify's platform, manage products, process orders, and build powerful e-commerce solutions.",category:"E-commerce",website:"https://shopify.dev",logo:"/logos/shopify.svg"},{id:"contentful",name:"Contentful",description:"Contentful is a headless content management platform that provides APIs for managing and delivering content across multiple channels. The Node.js SDK makes it easy to integrate Contentful's content management capabilities into applications, enabling developers to build content-rich experiences.",category:"CMS & Content",website:"https://contentful.com",logo:"/logos/contentful.svg"},{id:"openai",name:"OpenAI",description:"OpenAI provides powerful AI APIs including GPT models, DALL-E, and Whisper for building intelligent applications. The Node.js SDK makes it easy to integrate OpenAI's AI capabilities into applications, enabling developers to build chatbots, content generators, and other AI-powered features. Similar AI-powered services like I Shot A Photo demonstrate the practical applications of AI in specialized domains.",category:"AI Tools",website:"https://openai.com",logo:"/logos/openai.svg"},{id:"tensorflow",name:"TensorFlow.js",description:"TensorFlow.js is a JavaScript library for training and deploying machine learning models in the browser and on Node.js. With its comprehensive API and pre-trained models, TensorFlow.js enables developers to build AI-powered a
3pplications without requiring extensive machine learning expertise. It powers innovative services like I Shot A Photo for automated document photo processing.",category:"AI Tools",website:"https://tensorflow.org/js",logo:"/logos/tensorflow.svg",openSource:!0},{id:"puppeteer",name:"Puppeteer",description:"Puppeteer is a Node.js library that provides a high-level API to control Chrome or Chromium browsers programmatically. With its powerful automation capabilities, Puppeteer is widely used for web scraping, testing, PDF generation, and building automated browser-based applications.",category:"DevOps & Tools",website:"https://pptr.dev",logo:"/logos/puppeteer.svg",openSource:!0}];function a(){return(0,t.jsxs)("div",{className:"text-center py-8 px-4 bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800",children:[(0,t.jsxs)("h1",{className:"text-3xl md:text-4xl font-bold text-gray-900 dark:text-white mb-4",children:["Discover Amazing Apps and Libraries Built with"," ",(0,t.jsx)("span",{className:"text-blue-600 dark:text-blue-400",children:"Node.js"})]}),(0,t.jsx)("p",{className:"text-lg text-gray-600 dark:text-gray-300 mb-6 max-w-2xl mx-auto leading-relaxed",children:"Explore innovative applications, powerful APIs, and cutting-edge tools built with the Node.js ecosystem."}),(0,t.jsxs)("div",{className:"flex flex-wrap justify-center gap-6 text-sm text-gray-500 dark:text-gray-400",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),(0,t.jsx)("span",{children:"30+ Applications"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("span",{children:"10 Categories"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-purple-500 rounded-full"}),(0,t.jsx)("span",{children:"Open Source & Commercial"})]})]})]})}var s=e.i(57688),n=e.i(22016);let l=function(e,t){try{let i=new URL(e),r={utm_source:"nodejsru",utm_medium:"referral",utm_campaign:"app-directory",...t||{}};for(let[e,t]of Object.entries(r))i.searchParams.has(e)||i.searchParams.set(e,t);return i.toString()}catch{return e}};function c({app:e}){return(0,t.jsxs)("div",{className:"bg-gradient-to-r from-blue-600 via-purple-600 to-indigo-600 rounded-2xl shadow-2xl p-6 text-white mb-8 relative overflow-hidden",children:[(0,t.jsx)("div",{className:"absolute inset-0 bg-black/10"}),(0,t.jsxs)("div",{className:"relative z-10 flex flex-col md:flex-row items-center gap-6",children:[(0,t.jsx)("div",{className:"w-20 h-20 flex-shrink-0",children:(0,t.jsx)(s.default,{src:e.logo,alt:`${e.name} logo`,width:80,height:80,className:"rounded-xl object-contain bg-white/10 backdrop-blur-sm p-2",onError:e=>{e.currentTarget.src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8cmVjdCB3aWR0aD0iODAiIGhlaWdodD0iODAiIHJ4PSIxMCIgZmlsbD0iI0YzRjRGNiIvPgogIDxzdmcgeD0iMjAiIHk9IjIwIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSI+CiAgICA8cGF0aCBkPSJNMjAgMTRDMTguNSAxNCAxNyAxNSAxNyAxOEMxOSAyMiAyMSAyMiAyMCAyMkMyMSAyMiAyMyAyMiAyMCAyMkMyMyAyMCAyMSAxOCAxNyAxOEMxNyAxOCAxOC41IDE0IDIwIDE0Wk0zNSAzM0gyNVYyOUgzNVYzM1pNMjUgMjJIMzVWMTdIMjVWMjJaIiBmaWxsPSIjOUNBM0QzIi8+CiAgPC9zdmc+Cjwvc3ZnPgo="}})}),(0,t.jsxs)("div",{className:"flex-1 text-center md:text-left",children:[(0,t.jsxs)("div",{className:"flex items-center justify-center md:justify-start gap-2 mb-3",children:[(0,t.jsx)("span",{className:"inline-block px-3 py-1 text-xs font-semibold bg-white/20 backdrop-blur-sm text-white rounded-full",children:"â Featured"}),(0,t.jsx)("span",{className:"inline-block px-3 py-1 text-xs font-semibold bg-white/20 backdrop-blur-sm text-white rounded-full",children:e.category})]}),(0,t.jsx)("h2",{className:"text-2xl font-bold mb-3",children:e.name}),(0,t.jsxs)("div",{className:"text-sm opacity-90 leading-relaxed mb-4 max-w-xl",children:[e.description,(0,t.jsx)(n.default,{href:`/apps/${e.id}`,className:"text-white/80 hover:text-white font-medium ml-1 transition-colors duration-200",children:"Learn more"})]}),(0,t.jsxs)("a",{href:l(e.website),target:"_blank",rel:"noopener",className:"inline-flex items-center bg-white/20 backdrop-blur-sm hover:bg-white/30 text-white font-semibold px-5 py-2.5 rounded-lg transition-all duration-200 hover:scale-105",children:["AI visa & passport photo maker â ",e.name,(0,t.jsx)("svg",{className:"w-4 h-4 ml-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})})]})]})]})]})}function d({selectedCategory:e,onCategoryChange:i}){return(0,t.jsxs)("div",{className:"flex flex-wrap gap-2 mb-6",children:[(0,t.jsx)("button",{onClick:()=>i("All"),className:`px-4 py-2 rounded-full text-sm font-medium transition-all duration-200 ${"All"===e?"bg-blue-600 text-white shadow-lg shadow-blue-600/25":"bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600 hover:scale-105"}`,children:"All Categories"}),r.map(r=>(0,t.jsx)("button",{onClick:()=>i(r),className:`px-4 py-2 rounded-full text-sm font-medium transition-all duration-200 ${e===r?"bg-blue-600 text-white shadow-lg shadow-blue-600/25":"bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600 hover:scale-105"}`,children:r},r))]})}function p({app:e}){return(0,t.jsxs)("div",{className:"group bg-white dark:bg-gray-800 rounded-xl shadow-sm hover:shadow-xl transition-all duration-300 p-5 border border-gray-200/50 dark:border-gray-700/50 hover:border-blue-200 dark:hover:border-blue-600/50 hover:-translate-y-1",children:[(0,t.jsxs)("div",{className:"flex items-start mb-4",children:[(0,t.jsx)("div",{className:"w-14 h-14 mr-4 flex-shrink-0",children:(0,t.jsx)(s.default,{src:e.logo,alt:`${e.name} logo`,width:56,height:56,className:"rounded-lg object-contain group-hover:scale-110 transition-transform duration-200",onError:e=>{e.currentTarget.src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHZpZXdCb3g9IjAgMCA1NiA1NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8
3cmVjdCB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHJ4PSI4IiBmaWxsPSIjRjNGNEY2Ii8+CiAgPHN2ZyB4PSIxMiIgeT0iMTIiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIiBmaWxsPSJub25lIj4KICAgIDxwYXRoIGQ9Ik0xNiAxMkMxNC41IDEyIDEzIDEzIDEzIDE2QzE1IDIwIDE3IDIwIDE2IDIwQzE3IDIwIDE5IDIwIDE2IDIwQzE5IDE4IDE3IDE2IDEzIDE2QzEzIDE2IDE0LjUgMTIgMTYgMTJaTTI4IDI2SDE4VjIySDI4VjI2Wk0xOCAxOEgyOFYxNEgxOFYxOFoiIGZpbGw9IiM5Q0EzRDMiLz4KICA8L3N2Zz4KPC9zdmc+Cg=="}})}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-gray-900 dark:text-white group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors duration-200 truncate",children:e.name}),(0,t.jsxs)("div",{className:"flex items-center gap-2 mt-1",children:[(0,t.jsx)("span",{className:"inline-block px-2 py-1 text-xs font-medium bg-blue-50 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 rounded-md",children:e.category}),e.openSource&&(0,t.jsx)("span",{className:"inline-block px-2 py-1 text-xs font-medium bg-green-50 dark:bg-green-900/30 text-green-700 dark:text-green-300 rounded-md",children:"Open Source"})]})]})]}),(0,t.jsxs)("div",{className:"text-gray-600 dark:text-gray-300 text-sm leading-relaxed mb-4 line-clamp-3",children:[e.description,(0,t.jsx)(n.default,{href:`/apps/${e.id}`,className:"text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 font-medium ml-1 transition-colors duration-200",children:"Learn more"})]}),(0,t.jsxs)("a",{href:l(e.website),target:"_blank",rel:"noopener",className:"inline-flex items-center text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 font-medium text-sm transition-colors duration-200 group-hover:translate-x-1",children:["ishotaphoto"===e.id?"AI visa & passport photo maker â I Shot A Photo":"armorsound"===e.id?"Explore audio equipment reviews and guides":"Visit Website",(0,t.jsx)("svg",{className:"w-4 h-4 ml-1 transition-transform duration-200 group-hover:translate-x-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})})]})]})}function u(){let[e,r]=(0,i.useState)("All"),s=o.find(e=>e.featured),n="All"===e?o.filter(e=>!e.featured):o.filter(t=>t.category===e&&!t.featured);return(0,t.jsxs)("div",{className:"min-h-screen bg-gray-50 dark:bg-gray-900",children:[(0,t.jsx)(a,{}),(0,t.jsxs)("main",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8",children:[s&&(0,t.jsx)(c,{app:s}),(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsx)("h2",{className:"text-2xl font-bold text-gray-900 dark:text-white mb-3",children:"Explore Node.js Applications"}),(0,t.jsx)("p",{className:"text-gray-600 dark:text-gray-300 mb-4",children:"Discover powerful applications and tools built with Node.js across different categories."}),(0,t.jsx)(d,{selectedCategory:e,onCategoryChange:r})]}),(0,t.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5",children:n.map(e=>(0,t.jsx)(p,{app:e},e.id))}),0===n.length&&(0,t.jsx)("div",{className:"text-center py-12",children:(0,t.jsx)("p",{className:"text-gray-500 dark:text-gray-400 text-lg",children:"No applications found in this category."})})]}),(0,t.jsx)("footer",{className:"bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700 py-8 mt-12",children:(0,t.jsx)("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8",children:(0,t.jsxs)("div",{className:"text-center",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-gray-900 dark:text-white mb-4",children:"Node.js Directory"}),(0,t.jsx)("p",{className:"text-gray-600 dark:text-gray-300 mb-6",children:"Showcasing the best applications and tools built with Node.js"}),(0,t.jsxs)("div",{className:"flex flex-wrap justify-center gap-6 text-sm",children:[(0,t.jsx)("a",{href:"https://nodejs.org",target:"_blank",rel:"noopener",className:"text-blue-600 dark:text-blue-400 hover:underline",children:"Node.js Official"}),(0,t.jsx)("a",{href:"https://npmjs.com",target:"_blank",rel:"noopener",className:"text-blue-600 dar
3k:text-blue-400 hover:underline",children:"npm Registry"}),(0,t.jsx)("a",{href:"https://github.com/nodejs",target:"_blank",rel:"noopener",className:"text-blue-600 dark:text-blue-400 hover:underline",children:"GitHub"})]})]})})})]})}e.s(["default",()=>u],52683)}]);
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.