1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1327],{25918:function(e,t,r){Promise.resolve().then(r.bind(r,38292)),Promise.resolve().then(r.bind(r,36697)),Promise.resolve().then(r.bind(r,28650)),Promise.resolve().then(r.bind(r,10367)),Promise.resolve().then(r.bind(r,84956))},47411:function(e,t,r){"use strict";r.d(t,{Z:function(){return o}});var a=r(2265),n=r(28308);let s=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),i=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,r)=>r?r.toUpperCase():t.toLowerCase()),l=e=>{let t=i(e);return t.charAt(0).toUpperCase()+t.slice(1)};var c=r(38292);let o=(e,t)=>{let r=(0,a.forwardRef)((r,i)=>{let{className:o,...d}=r;return(0,a.createElement)(c.default,{ref:i,iconNode:t,className:(0,n.z)("lucide-".concat(s(l(e))),"lucide-".concat(e),o),...d})});return r.displayName=l(e),r}},31047:function(e,t,r){"use strict";r.d(t,{Z:function(){return a}});let a=(0,r(47411).Z)("calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]])},36697:function(e,t,r){"use strict";r.d(t,{default:function(){return i}});var a=r(57437),n=r(31047),s=r(23664);function i(e){let{url:t}=e,r=(0,s.U0)();return(0,a.jsxs)("a",{href:t,target:"_blank",rel:"noopener noreferrer",onClick:function(){null==r||r.capture("calendar_viewed",{location:"contact_page"})},className:"inline-flex items-center gap-2 px-6 py-3 bg-accent text-white text-sm font-display font-semibold tracking-wide rounded hover:bg-accent-hover transition-colors duration-200",children:[(0,a.jsx)(n.Z,{size:16}),"Book a Free Call"]})}},28650:function(e,t,r){"use strict";r.d(t,{default:function(){return u}});var a=r(57437),n=r(2265),s=r(23664),i=r(47411);let l=(0,i.Z)("circle-check-big",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]),c=(0,i.Z)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]),o=(0,i.Z)("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]),d=(0,i.Z)("send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);function u(){let e=(0,s.U0)(),[t,r]=(0,n.useState)("idle"),[i,u]=(0,n.use
1State)(""),[m,f]=(0,n.useState)({}),p=(0,n.useRef)(!1);function x(){p.current||(p.current=!0,null==e||e.capture("form_started",{form:"contact"}))}async function h(t){t.preventDefault(),p.current||(p.current=!0,null==e||e.capture("form_started",{form:"contact"}));let a=t.currentTarget,n={name:a.elements.namedItem("name").value,email:a.elements.namedItem("email").value,message:a.elements.namedItem("message").value},s=function(e){let t={};return e.name.trim()||(t.name="Name is required"),e.email.trim()?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e.email)||(t.email="Enter a valid email address"):t.email="Email is required",e.message.trim()||(t.message="Message is required"),t}(n);if(Object.keys(s).length>0){f(s),null==e||e.capture("form_error",{form:"contact",reason:"validation",fields:Object.keys(s)});return}f({}),r("loading"),u("");try{let t=await fetch("/api/contact",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)}),a=await t.json();if(!t.ok)throw Error(a.error||"Send failed");null==e||e.capture("form_submitted",{form:"contact"}),window.oaiq&&window.oaiq("measure","custom",{type:"custom"},{custom_event_name:"contact_submitted"}),r("success")}catch(a){let t=a instanceof Error?a.message:"Something went wrong. Please try again or email directly.";u(t),r("error"),null==e||e.capture("form_error",{form:"contact",reason:"submit_failed",error:t})}}if("success"===t)return(0,a.jsxs)("div",{className:"flex flex-col items-center justify-center text-center py-16 px-8 bg-surface rounded-xl border border-border",children:[(0,a.jsx)(l,{size:40,className:"text-accent mb-4"}),(0,a.jsx)("h3",{className:"font-display font-bold text-2xl text-text mb-3",children:"Message sent!"}),(0,a.jsx)("p",{className:"text-muted leading-relaxed max-w-sm",children:"Thanks for reaching out. I'll get back to you within 1â2 business days."})]});let g="w-full px-4 py-3 bg-surface border rounded text-sm text-text placeholder-muted focus:outline-none transition-colors font-body",y="".concat(g," border-border focus:border-accent"),b="".concat(g," border-red-400 focus:border-red-500"),v="block font-body text-xs text-muted tracking-wider uppercase mb-2";return(0,a.jsxs)("form",{onSubmit:h,onFocus:x,onInput:x,noValidate:!0,className:"space-y-5",children:[(0,a.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-5",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("label",{htmlFor:"name",className:v,children:["Name ",(0,a.jsx)("span",{className:"text-accent",children:"*"})]}),(0,a.jsx)("input",{id:"name",name:"name",type:"text",placeholder:"Your full name",className:m.name?b:y,onChange:()=>f(e=>({...e,name:void 0}))}),m.name&&(0,a.jsx)("p",{className:"mt-1.5 text-xs text-red-500",children:m.name})]}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("label",{htmlFor:"email",className:v,children:["Email ",(0,a.jsx)("span",{className:"text-accent",children:"*"})]}),(0,a.jsx)("input",{id:"email",name:"email",type:"email",placeholder:"[email protected]",className:m.email?b:y,autoComplete:"email",onChange:()=>f(e=>({...e,email:void 0}))}),m.email&&(0,a.jsx)("p",{className:"mt-1.5 text-xs text-red-500",children:m.email})]})]}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("label",{htmlFor:"message",className:v,children:["Message ",(0,a.jsx)("span",{className:"text-accent",children:"*"})]}),(0,a.jsx)("textarea",{id:"message",name:"message",rows:6,placeholder:"Tell me about your situation: what you're building, where you're stuck, or what kind of help you're looking for...",className:"".concat(m.message?b:y," resize-none"),onChange:()=>f(e=>({...e,message:void 0}))}),m.message&&(0,a.jsx)("p",{className:"mt-1.5 text-xs text-red-500",children:m.message})]}),"error"===t&&(0,a.jsxs)("div",{className:"flex items-start gap-3 p-4 bg-red-50 border border-red-200 rounded text-sm text-red-700",children:[(0,a.jsx)(c,{size:16,className:"flex-shrink-0 mt-0.5"}),i]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 text-xs text-muted",children:[(0,a.jsx)(o,{size:13,className:"text-accent flex-shrink-0"}),"Your details stay private. I read every message myself and never share your information."]}),(0,a.jsx)("button",{type:"submit",disabled:"loading"===t,className:"w-full inline-flex items-center justify-center gap-2 px-6 py-3.5 bg-accent text-white text-sm font-display font-semibold tracking-wide rounded hover:bg-accent-hover transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed",children:"loading"===t?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin"}),"Sending..."]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(d,{size:16}),"Send Message"]})})]})}},10367:function(e,t,r){"use strict";r.d(t,{default:function(){return s}});var a=r(2265),n=r(23664);function s(){let e=(0,n.U0)(),t=(0,a.useRef)(!1);return(0,a.useEffect)(()=>{e&&!t.current&&(t.current=!0,e.capture("contact_page_viewed"))},[e]),null}},84956:function(e,t,r){"use strict";r.r(t),r.d(t,{default:function(){return c}});var a=r(57437),n=r(2265),s=r(36498),i=r(59498),l=r(93448);function c(e){let{children:t,className:r,trigger:i="scroll",stagger:c=!1,y:o=24,delay:d=0}=e,u=(0,n.useRef)(null);return(0,n.useLayoutEffect)(()=>{let e=u.current;if(!e)return;let t=s.p8.context(()=>{s.p8.matchMedia().add("(prefers-reduced-motion: no-preference)",()=>{let t=e;if(c){let r=s.p8.utils.toArray(e.querySelectorAll("[data-reveal-item]"));t=r.length?r:s.p8.utils.toArray(e.children)}s.p8.set(t,{opacity:0,y:o}),s.p8.to(t,{opacity:1,y:0,duration:.8,ease:"power2.out",delay:d,stagger:c?.12:0,..."scroll"===i?{scrollTrigger:{trigger:e,start:"top 85%",once:!0}}:{}})})},u);return()=>t.revert()},[i,c,o,d]),(0,a.jsx)("div",{ref:u,className:(0,l.cn)(r),children:t})}s.p8.registerPlugin(i.i)},93448:function(e,t,r){"use strict";r.d(t,{cn:function(){return s},p:function(){return i}});var a=r(61994),n=r(53335);function s(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,n.m6)((0,a.W)(t))}function i(e){return new Date(e).toLocaleDateString("en-US",{year:"numeric",month:"long",day:"numeric"})}}},function(e){e.O(0,[922,5878,6137,9956,2764,2971,2117,1744],function(){return e(e.s=25918)}),_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.