1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2230],{4095:(e,t,r)=>{"use strict";r.d(t,{z:()=>u});var n=r(51469),s=r(14405),a=r(27933);function i(e){return"number"==typeof e?e:parseFloat(e)}var c=r(12115),l=r(24866),o=r(28245),d=r(62321);function u(e,t={}){let{isStatic:r}=(0,c.useContext)(l.Q),m=()=>(0,n.S)(e)?e.get():e;if(r)return(0,d.G)(m);let g=(0,o.d)(m());return(0,c.useInsertionEffect)(()=>(function(e,t,r){let c,l=e.get(),o=null,d=l,u="string"==typeof l?l.replace(/[\d.-]/g,""):void 0,m=()=>{o&&(o.stop(),o=null)},g=()=>{m(),o=new s.s({keyframes:[i(e.get()),i(d)],velocity:e.getVelocity(),type:"spring",restDelta:.001,restSpeed:.01,...r,onUpdate:c})};if(e.attach((e,t)=>{d=e,c=e=>{var r,n;return t((r=e,(n=u)?r+n:r))},a.Gt.postRender(g)},m),(0,n.S)(t)){let r=t.on("change",t=>{var r,n;return e.set((r=t,(n=u)?r+n:r))}),n=e.on("destroy",r);return()=>{r(),n()}}return m})(g,e,t),[g,JSON.stringify(t)]),g}},5772:(e,t,r)=>{"use strict";r.d(t,{default:()=>s.a});var n=r(97651),s=r.n(n)},14209:(e,t,r)=>{"use strict";r.d(t,{z:()=>a});var n=r(95155),s=r(40980);function a({eyebrow:e,title:t,description:r,align:a="start",children:i,className:c}){return(0,n.jsx)("header",{className:(0,s.cn)("border-b border-border/60 bg-background",c),children:(0,n.jsx)("div",{className:"container-tight section",children:(0,n.jsxs)("div",{className:(0,s.cn)("max-w-3xl","center"===a&&"mx-auto text-center"),children:[(0,n.jsx)("p",{className:"eyebrow mb-4",children:e}),(0,n.jsx)("h1",{className:"font-[family-name:var(--font-inter-tight)] text-[clamp(2.5rem,6vw,4.5rem)] font-semibold leading-[1.05] tracking-tight",children:t}),r&&(0,n.jsx)("p",{className:"mt-6 max-w-2xl text-lg text-muted-foreground sm:text-xl",children:r}),i&&(0,n.jsx)("div",{className:"mt-8",children:i})]})})})}},14898:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>w});var n=r(95155),s=r(12115),a=r(41678),i=r(5772),c=r(98500),l=r.n(c),o=r(28713),d=r(45160),u=r(89239),m=r(44071),g=r(86901),f=r(97810),p=r(22164),h=r(67233),v=r(14209),x=r(51377),b=r(64154);function y(e){return e.tags.some(e=>/\bAI\b/i.test(e))}function j({project:e}){return(0,n.jsxs)(a.P.div,{whileHover:{y:-6},transition:{type:"spring",stiffness:300,damping:25},className:"group relative flex h-full flex-col overflow-hidden rounded-xl border bg-card",children:[(0,n.jsx)(l(),{href:`/projects/${e.slug}`,"aria-label":e.title,className:"absolute inset-0 z-10"}),(0,n.jsxs)("div",{className:"relative aspect-[16/10] overflow-hidden bg-muted",children:[e.image_url?(0,n.jsx)(i.default,{src:e.image_url,alt:e.title,fill:!0,className:"object-cover transition-transform duration-500 group-hover:scale-105",sizes:"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"}):(0,n.jsx)("div",{className:"h-full w-full bg-gradient-to-br from-primary/20 to-purple-500/20"}),e.featured_metric&&(0,n.jsxs)("div",{className:"pointer-events-none absolute right-3 top-3 flex items-center gap-1.5 rounded-full bg-primary/90 px-3 py-1.5 text-sm text-primary-foreground shadow-md backdrop-blur-sm",children:[(0,n.jsx)(m.A,{className:"h-3 w-3"}),(0,n.jsx)("span",{className:"font-semibold",children:e.featured_metric.value})]}),(y(e)||e.has_case_study&&e.case_study_published)&&(0,n.jsxs)("div",{className:"pointer-events-none absolute left-3 top-3 flex flex-col items-start gap-1.5",children:[y(e)&&(0,n.jsxs)(d.E,{className:"bg-primary/90 text-xs text-primary-foreground",children:[(0,n.jsx)(g.A,{className:"mr-1 h-3 w-3"}),"AI"]}),e.has_case_study&&e.case_study_published&&(0,n.jsxs)(d.E,{variant:"secondary",className:"bg-white/90 text-xs text-black",children:[(0,n.jsx)(f.A,{className:"mr-1 h-3 w-3"}),"Case Study"]})]})]}),(0,n.jsxs)("div",{className:"flex flex-1 flex-col p-5",children:[(0,n.jsx)("h3",{className:"mb-2 line-clamp-1 text-lg font-semibold tracking-tight transition-colors group-hover:text-primary",children:e.title}),(0,n.jsx)("p",{className:"mb-4 line-clamp-2 text-sm text-muted-foreground",children:e.description}),(0,n.jsxs)("div",{className:"mt-auto flex items-center justify-between gap-3",children:[(0,n.jsxs)("div",{className:"flex flex-1 flex-wrap gap-1.5",children:[e.tags.slice(0,3).map(e=>(0,n.jsx)(d.E,{variant:"secondary",className:"text-xs",children:e},e)),e.tags.length>3&&(0,n.jsxs)(d.E,{variant:"outline",className:"text-xs",children:["+",e.tags.length-3]})]}),(0,n.jsxs)("div",{className:"relative z-20 flex items-center gap-1.5",children:[e.live_url&&(0,n.jsx)(u.$,{size:"icon",variant:"ghost",className:"h-8 w-8",asChild:!0,children:(0,n.jsx)("a",{href:e.live_url,target:"_blank",rel:"noopener noreferrer",title:"View live demo",onClick:t=>{t.stopPropagation(),(0,b.$m)("cta_click",{cta_label:"demo",cta_location:"project-card",project_slug:e.slug})},children:(0,n.jsx)(p.A,{className:"h-4 w-4"})})}),e.github_url&&(0,n.jsx)(u.$,{size:"icon",variant:"ghost",className:"h-8 w-8",asChild:!0,children:(0,n.jsx)("a",{href:e.github_url,target:"_blank",rel:"noopener noreferrer",title:"View source code",onClick:t=>{t.stopPropagation(),(0,b.$m)("cta_click",{cta_label:"github",cta_location:"project-card",project_slug:e.slug})},children:(0,n.jsx)(h.A,{className:"h-4 w-4"})})})]})]})]})]})}
1function w(){let[e,t]=(0,s.useState)([]),[r,a]=(0,s.useState)(!0);return(0,s.useEffect)(()=>{!async function(){let e=(0,o.U)(),{data:r}=await e.from("projects").select("*").order("display_order",{ascending:!0});t(r||[]),a(!1)}()},[]),(0,n.jsxs)("div",{className:"min-h-screen",children:[(0,n.jsx)(v.z,{eyebrow:"Selected work",title:"Work",description:"A selection of recent work across enterprise digital commerce, AI tooling, and design."}),(0,n.jsx)("section",{className:"section",children:(0,n.jsx)("div",{className:"container-tight",children:r?(0,n.jsx)("div",{className:"py-16 text-center",children:(0,n.jsx)("p",{className:"text-muted-foreground",children:"Loading projects..."})}):0===e.length?(0,n.jsx)("div",{className:"py-16 text-center",children:(0,n.jsx)("p",{className:"text-muted-foreground",children:"No projects found."})}):(0,n.jsx)(x.JX,{className:"grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3",children:e.map(e=>(0,n.jsx)(x.Tc,{className:"h-full",children:(0,n.jsx)(j,{project:e})},e.id))})})})]})}},22164:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(78340).A)("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]])},28713:(e,t,r)=>{"use strict";r.d(t,{U:()=>s});var n=r(60959);function s(){return(0,n.createBrowserClient)("https://wsbdcrzzrknollrnvsbg.supabase.co","eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6IndzYmRjcnp6cmtub2xscm52c2JnIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjUxNTE3OTUsImV4cCI6MjA4MDcyNzc5NX0.yz6ofR2KgDd30hJ0YJxlLjfqmt_AuG2t4nZELMxyGew")}},32832:(e,t,r)=>{Promise.resolve().then(r.bind(r,14898))},40980:(e,t,r)=>{"use strict";r.d(t,{cn:()=>a});var n=r(29722),s=r(622);function a(...e){return(0,s.QP)((0,n.$)(e))}r(41463)},44071:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(78340).A)("trending-up",[["path",{d:"M16 7h6v6",key:"box55l"}],["path",{d:"m22 7-8.5 8.5-5-5L2 17",key:"1t1m79"}]])},45160:(e,t,r)=>{"use strict";r.d(t,{E:()=>l});var n=r(95155);r(12115);var s=r(42442),a=r(18460),i=r(40980);let c=(0,a.F)("inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"}},defaultVariants:{variant:"default"}});function l({className:e,variant:t,asChild:r=!1,...a}){let l=r?s.DX:"span";return(0,n.jsx)(l,{"data-slot":"badge",className:(0,i.cn)(c({variant:t}),e),...a})}},51377:(e,t,r)=>{"use strict";r.d(t,{JX:()=>g,LJ:()=>h,RT:()=>p,Tc:()=>f,dG:()=>d,db:()=>v,kQ:()=>u});var n=r(95155),s=r(12115),a=r(61792),i=r(41678),c=r(66341),l=r(62321),o=r(4095);function d({children:e,className:t="",delay:r=0,duration:c=.5,direction:l="up",distance:o=40,once:d=!0}){let u=(0,s.useRef)(null),m=(0,a.W)(u,{once:d,margin:"-100px"}),g=(()=>{switch(l){case"up":return{y:o,x:0};case"down":return{y:-o,x:0};case"left":return{x:o,y:0};case"right":return{x:-o,y:0};default:return{x:0,y:0}}})();return(0,n.jsx)(i.P.div,{ref:u,className:t,initial:{opacity:0,...g},animate:m?{opacity:1,x:0,y:0}:{opacity:0,...g},transition:{duration:c,delay:r,ease:[.21,.47,.32,.98]},children:e})}function u({children:e,className:t="",speed:r=.5}){let[a,i]=(0,s.useState)(!1);return((0,s.useEffect)(()=>{let e=window.matchMedia("(min-width: 1024px) and (prefers-reduced-motion: no-preference)"),t=()=>i(e.matches);return t(),e.addEventListener("change",t),()=>e.removeEventListener("change",t)},[]),a)?(0,n.jsx)(m,{className:t,speed:r,children:e}):(0,n.jsx)("div",{className:t,children:e})}function m({children:e,className:t="",speed:r=.5}){let a=(0,s.useRef)(null),{scrollYProgress:d}=(0,c.L)({target:a,offset:["start end","end start"]}),u=(0,l.G)(d,[0,1],[0,200*r]),m=(0,o.z)(u,{damping:30,stiffness:100});return(0,n.jsx)(i.P.div,{ref:a,className:t,style:{y:m},children:e})}function g({children:e,className:t="",staggerDelay:r=.1,delayChildren:c=0}){let l=(0,s.useRef)(null),o=(0,a.W)(l,{once:!0,margin:"-100px"});return(0,n.jsx)(i.P.div,{ref:l,className:t,initial:"hidden",animate:o?"visible":"hidden",variants:{hidden:{},visible:{transition:{staggerChildren:r,delayChildren:c}}},children:e})}function f({children:e,className:t="",direction:r="up"}){return(0,n.jsx)(i.P.div,{className:t,variants:(()=>{let e={y:30};switch(r){case"down":e={y:-30};break;case"left":e={x:30};break;case"right":e={x:-30};break;case"none":e={y:0}}return{hidden:{opacity:0,...e},visible:{opacity:1,x:0,y:0,transition:{duration:.5,ease:[.21,.47,.32,.98]}}}})(),children:e})}function p({text:e,className:t="",delay:r=0,staggerDelay:c=.03}){let l=(0,s.useRef)(null),o=(0,a.W)(l,{once:!0,margin:"-100px"}),d=e.split(" ");return(0,n.jsx)(i.P.span,{ref:l,className:`inline-block ${t}`,initial:"hidden",animate:o?"visible":"hidden",variants:{hidden:{},visible:{transition:{staggerChildren:c,delayChildren:r}}},children:d.map((e,t)=>(0,n.jsx)("span",{className:"inline-block whitespace-nowrap mr-[0.25em]",children:e.split("").map((e,t)=>(0,n.jsx)(i.P.span,{className:"inline-block",variants:{hidden:{opacity:0,y:20},visible:{opacity:1,y:0,transition:{duration:.4,ease:[.21,.47,.32,.98]}}},children:e},t))},t))})}function h({children:e,className:t="",amplitude:r=10,duration:s=3}){return(0,n.jsx)(i.P.div,{className:t,animate:{y:[-r,r,-r]},transition:{duration:s,repeat:1/0,ease:"easeInOut"},children:e})}function v({children:e,className:t="",strength:r=.3}){let a=(0,s.useRef)(null),c=(0,o.z)(0,{stiffness:300,damping:20}),l=(0,o.z)(0,{stiffness:300,damping:20});return(0,n.jsx)(i.P.div,{ref:a,className:t,style:{x:c,y:l},onMouseMove:e=>{if(!a.current)return;let t=a.current.getBoundingClientRect(),n=t.left+t.width/2,s=t.top+t.height/2,i=(e.clientX-n)*r,o=(e.clientY-s)*r;c.set(i),l.set(o)},onMouseLeave:()=>{c.set(0),l.set(0)},children:e})}},61792:(e,t,r)=>{"use strict";r.d(t,{W:()=>i});var n=r(12115),s=r(58392);let a={some:0,all:1};function i(e,{root:t,margin:r,amount:c,once:l=!1,initial:o=!1}={}
1){let[d,u]=(0,n.useState)(o);return(0,n.useEffect)(()=>{if(!e.current||l&&d)return;let n={root:t&&t.current||void 0,margin:r,amount:c};return function(e,t,{root:r,margin:n,amount:i="some"}={}){let c=(0,s.K)(e),l=new WeakMap,o=new IntersectionObserver(e=>{e.forEach(e=>{let r=l.get(e.target);if(!!r!==e.isIntersecting)if(e.isIntersecting){let r=t(e.target,e);"function"==typeof r?l.set(e.target,r):o.unobserve(e.target)}else"function"==typeof r&&(r(e),l.delete(e.target))})},{root:r,rootMargin:n,threshold:"number"==typeof i?i:a[i]});return c.forEach(e=>o.observe(e)),()=>o.disconnect()}(e.current,()=>(u(!0),l?void 0:()=>u(!1)),n)},[t,e,r,l,c]),d}},64154:(e,t,r)=>{"use strict";r.d(t,{$m:()=>a,N1:()=>i,P_:()=>o,Up:()=>c,kq:()=>l,ue:()=>d});let n="etomco:utm";function s(e,t={}){let r=function(){try{let e=window.sessionStorage.getItem(n);if(!e)return{};return JSON.parse(e)}catch{return{}}}(),a={...t,...r.source?{utm_source:r.source}:{},...r.medium?{utm_medium:r.medium}:{},...r.campaign?{utm_campaign:r.campaign}:{}};"function"==typeof window.gtag?window.gtag("event",e,a):(window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:e,...a}))}function a(e,t){s(e,t)}function i(e={}){s("newsletter_signup",{event_category:"engagement",method:e.source||"website"})}function c(){s("contact_submit",{event_category:"engagement"})}function l(e,t){s("cta_click",{event_category:"engagement",cta_label:e,cta_location:t})}function o(e){e.campaign&&s("email_landing",{event_category:"campaign",utm_campaign:e.campaign,utm_source:e.source,utm_medium:e.medium,utm_content:e.content})}function d(e){let t=new URLSearchParams(e),r={},s=!1;for(let e of["source","medium","campaign","content","term"]){let n=t.get(`utm_${e}`);n&&(r[e]=n,s=!0)}if(!s)return null;try{window.sessionStorage.setItem(n,JSON.stringify(r))}catch{}return r}},67233:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(78340).A)("github",[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]])},86901:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(78340).A)("sparkles",[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}
1],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]])},89239:(e,t,r)=>{"use strict";r.d(t,{$:()=>l,r:()=>c});var n=r(95155);r(12115);var s=r(42442),a=r(18460),i=r(40980);let c=(0,a.F)("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all cursor-pointer disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-sm":"size-8","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function l({className:e,variant:t,size:r,asChild:a=!1,...l}){let o=a?s.DX:"button";return(0,n.jsx)(o,{"data-slot":"button",className:(0,i.cn)(c({variant:t,size:r,className:e})),...l})}},97651:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={default:function(){return d},getImageProps:function(){return o}};for(var s in n)Object.defineProperty(t,s,{enumerable:!0,get:n[s]});let a=r(73623),i=r(95413),c=r(38437),l=a._(r(36095));function o(e){let{props:t}=(0,i.getImgProps)(e,{defaultLoader:l.default,imgConf:{deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[16,32,48,64,96,128,256,384],qualities:[75],path:"/_next/image",loader:"default",dangerouslyAllowSVG:!0,unoptimized:!1}});for(let[e,r]of Object.entries(t))void 0===r&&delete t[e];return{props:t}}let d=c.Image},97810:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(78340).A)("book-open",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]])}},e=>{e.O(0,[8409,8500,1678,8437,7828,4766,8301,8441,6511,7358],()=>e(e.s=32832)),_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.