(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[453],{6450:function(e,t,r){Promise.resolve().then(r.bind(r,1179)),Promise.resolve().then(r.bind(r,1995)),Promise.resolve().then(r.t.bind(r,2972,23))},1179:function(e,t,r){"use strict";r.d(t,{ScrollToTop:function(){return a}});var i=r(2265),n=r(9376);function a(){let e=(0,n.usePathname)();return(0,i.useEffect)(()=>{window.scrollTo(0,0)},[e]),null}},5974:function(e,t,r){"use strict";r.d(t,{C:function(){return s}});var i=r(7437),n=r(535),a=r(4508);let o=(0,n.j)("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function s(e){let{className:t,variant:r,...n}=e;return(0,i.jsx)("div",{className:(0,a.cn)(o({variant:r}),t),...n})}},6070:function(e,t,r){"use strict";r.d(t,{Ol:function(){return s},SZ:function(){return c},Zb:function(){return o},aY:function(){return d},ll:function(){return l}});var i=r(7437),n=r(2265),a=r(4508);let o=n.forwardRef((e,t)=>{let{className:r,...n}=e;return(0,i.jsx)("div",{ref:t,className:(0,a.cn)("rounded-lg border bg-card text-card-foreground shadow-sm",r),...n})});o.displayName="Card";let s=n.forwardRef((e,t)=>{let{className:r,...n}=e;return(0,i.jsx)("div",{ref:t,className:(0,a.cn)("flex flex-col space-y-1.5 p-6",r),...n})});s.displayName="CardHeader";let l=n.forwardRef((e,t)=>{let{className:r,...n}=e;return(0,i.jsx)("div",{ref:t,className:(0,a.cn)("text-2xl font-semibold leading-none tracking-tight",r),...n})});l.displayName="CardTitle";let c=n.forwardRef((e,t)=>{let{className:r,...n}=e;return(0,i.jsx)("div",{ref:t,className:(0,a.cn)("text-sm text-muted-foreground",r),...n})});c.displayName="CardDescription";let d=n.forwardRef((e,t)=>{let{className:r,...n}=e;return(0,i.jsx)("div",{ref:t,className:(0,a.cn)("p-6 pt-0",r),...n})});d.displayName="CardContent",n.forwardRef((e,t)=>{let{className:r,...n}=e;return(0,i.jsx)("div",{ref:t,className:(0,a.cn)("flex items-center p-6 pt-0",r),...n})}).displayName="CardFooter"},1995:function(e,t,r){"use strict";r.d(t,{PortfolioGrid:function(){return v}});var i=r(7437),n=r(2265),a=r(8239),o=r(8819),s=r(6070),l=r(5974),c=r(9202),d=r(3388),u=r(5330),f=r(3247),p=r(6362),m=r(7648);let g=[{id:"all",label:"All Work",icon:null},{id:"websites",label:"Websites",icon:c.Z},{id:"apps",label:"Apps",icon:d.Z},{id:"software",label:"Software",icon:u.Z},{id:"audits",label:"Audits",icon:f.Z}],h=[{id:"follow-thru",category:"apps",title:"Productivity Task Management App",description:"Task management and productivity app with AI scheduling, gamified progress tracking, and life balance analytics.",image:"/images/f4f63362-a302-410b-bad8.jpeg",tags:["iOS","Swift","App Store"],link:"https://Elev8tech.tech",imagePosition:"object-left-top"},{id:"above-all",category:"websites",title:"Maintenance Solutions",description:"Commercial and residential maintenance company website featuring plumbing solutions, construction services, and emergency response systems.",image:"/images/ae09e0c4-3e2a-4b65-a38d.jpeg",tags:["Next.js","Vercel","Forms"],link:"https://aboveallmaintenancerepair.com/",imagePosition:"object-top"},{id:"ttb-verifier",category:"software",title:"TTB Label Verifier Software",description:"AI-powered compliance software for alcohol label verification with automated approval system. Designed for US Treasury hackathon.",image:"/images/ttb-label-verifier-full.jpeg",tags:["AI","Compliance","Hackathon"],imagePosition:"object-top"},{id:"oc-mentors",category:"apps",title:"Tutoring App for UCI",description:"Tutoring platform made to help tutors and students at UCI connect for academic success, featuring tutor search, scheduling, and progress tracking.",image:"/images/oc-mentors-tutors.jpeg",tags:["Mobile App","React Native","Education"],link:"https://linktr.ee/ocmentors",imagePosition:"object-top"},{id:"sentiment-analysis",category:"software",title:"Sentiment Analysis Software",description:"AI-powered text analysis software that detects sentiment with neutral, negative, and positive classifications. Built for U-Mich Flint.",image:"/images/sentiment-analysis-full.jpeg",tags:["AI/ML","Python","NLP"],imagePosition:"object-center"},{id:"zed-windows",category:"websites",title:"ZED Windows & Doors",description:"Premium window and door replacement website with elegant serif typography and conversion-focused design.",image:"/images/729c460b-0673-4893-8c79.jpeg",tags:["Next.js","Responsive","SEO"],link:"https://demo-kzmfxi967qu1h3wb3i9g.vusercontent.net",imagePosition:"object-top"},{id:"d3vine-trinity",category:"websites",title:"D3vine Trinity",description:"Spiritual wellness and healing services platform with elegant burgundy aesthetic and booking system.",image:"/images/f88a4feb-b921-4c4d-8553.jpeg",tags:["Next.js","Booking","E-commerce"],imagePosition:"object-top"},{id:"seo-audit",category:"audits",title:"SEO & Performance Audits",description:"Comprehensive website audits covering SEO, performance, accessibility, and conversion optimization.",image:"/seo-audit-dashboard-with-analytics-charts.jpg",tags:["SEO","Performance","Analytics"],imagePosition:"object-center"}];function v(){let[e,t]=(0,n.useState)("all"),[r,c]=(0,o.YD)({triggerOnce:!0,threshold:.1}),d="all"===e?h:h.filter(t=>t.category===e);return(0,i.jsx)("section",{ref:r,className:"py-24 border-b border-border",children:(0,i.jsxs)("div",{className:"container mx-auto px-4",children:[(0,i.jsx)("div",{className:"flex flex-wrap justify-center gap-3 mb-12",children:g.map(r=>(0,i.jsxs)("button",{onClick:()=>t(r.id),className:"flex items-center gap-2 px-4 py-2 rounded-full font-medium text-sm transition-all duration-300 ".concat(e===r.id?"bg-primary text-white":"bg-muted/50 text-muted-foreground hover:bg-muted"),children:[r.icon&&(0,i.jsx)(r.icon,{className:"h-4 w-4"}),r.label]},r.id))}),(0,i.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:d.map((e,t)=>{let r=e.link?m.default:"div",n=e.link?{href:e.link,target:"_blank",rel:"noopener noreferrer",className:"block h-full"}:{className:"h-full"};return(0,i.jsx)(a.E.div,{initial:{opacity:0,y:20},animate:c?{opacity:1,y:0}:{opacity:0,y:20},transition:{duration:.5,delay:.05*t},children:(0,i.jsx)(r,{...n,children:(0,i.jsxs)(s.Zb,{className:"group h-full overflow-hidden bg-card border-border hover:border-primary/50 transition-all duration-300 cursor-pointer flex flex-col",children:[(0,i.jsxs)("div",{className:"relative w-full aspect-[16/10] overflow-hidden bg-muted",children:[(0,i.jsx)("img",{src:e.image||"/placeholder.svg",alt:e.title,className:"w-full h-full object-cover ".concat(e.imagePosition||"object-center"," transition-transform duration-500 group-hover:scale-105")}),(0,i.jsx)("div",{className:"absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"}),e.link&&(0,i.jsx)("div",{className:"absolute top-4 right-4 p-2 rounded-full bg-white/10 backdrop-blur-sm opacity-0 group-hover:opacity-100 transition-opacity",children:(0,i.jsx)(p.Z,{className:"h-4 w-4 text-white"})})]}),(0,i.jsxs)("div",{className:"p-6 flex-1 flex flex-col",children:[(0,i.jsx)("div",{className:"flex flex-wrap gap-2 mb-3",children:e.tags.map((e,t)=>(0,i.jsx)(l.C,{variant:"secondary",className:"text-xs bg-primary/10 text-primary border-primary/20",children:e},t))}),(0,i.jsx)("h3",{className:"text-xl font-bold text-foreground mb-2 group-hover:text-primary transition-colors",children:e.title}),(0,i.jsx)("p",{className:"text-sm text-muted-foreground line-clamp-2",children:e.description})]})]})})},e.id)})}),0===d.length&&(0,i.jsx)("div",{className:"text-center py-16",children:(0,i.jsx)("p",{className:"text-muted-foreground",children:"No projects found in this category."})})]})})}},4508:function(e,t,r){"use strict";r.d(t,{cn:function(){return a}});var i=r(1994),n=r(3335);function a(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,n.m6)((0,i.W)(t))}},5330:function(e,t,r){"use strict";r.d(t,{Z:function(){return i}});let i=(0,r(9205).Z)("CodeXml",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]])},6362:function(e,t,r){"use strict";r.d(t,{Z:function(){return i}});let i=(0,r(9205).Z)("ExternalLink",[["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"}]])},9202:function(e,t,r){"use strict";r.d(t,{Z:function(){return i}});let i=(0,r(9205).Z)("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]])},3247:function(e,t,r){"use strict";r.d(t,{Z:function(){return i}});let i=(0,r(9205).Z)("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]])},3388:function(e,t,r){"use strict";r.d(t,{Z:function(){return i}});let i=(0,r(9205).Z)("Smartphone",[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]])},7648:function(e,t,r){"use strict";r.d(t,{default:function(){return n.a}});var i=r(2972),n=r.n(i)},9376:function(e,t,r){"use strict";var i=r(5475);r.o(i,"usePathname")&&r.d(t,{usePathname:function(){return i.usePathname}}),r.o(i,"useRouter")&&r.d(t,{useRouter:function(){return i.useRouter}})},535:function(e,t,r){"use strict";r.d(t,{j:function(){return o}});var i=r(1994);let n=e=>"boolean"==typeof e?`${e}`:0===e?"0":e,a=i.W,o=(e,t)=>r=>{var i;if((null==t?void 0:t.variants)==null)return a(e,null==r?void 0:r.class,null==r?void 0:r.className);let{variants:o,defaultVariants:s}=t,l=Object.keys(o).map(e=>{let t=null==r?void 0:r[e],i=null==s?void 0:s[e];if(null===t)return null;let a=n(t)||n(i);return o[e][a]}),c=r&&Object.entries(r).reduce((e,t)=>{let[r,i]=t;return void 0===i||(e[r]=i),e},{});return a(e,l,null==t?void 0:null===(i=t.compoundVariants)||void 0===i?void 0:i.reduce((e,t)=>{let{class:r,className:i,...n}=t;return Object.entries(n).every(e=>{let[t,r]=e;return Array.isArray(r)?r.includes({...s,...c}[t]):({...s,...c})[t]===r})?[...e,r,i]:e},[]),null==r?void 0:r.class,null==r?void 0:r.className)}},8819:function(e,t,r){"use strict";r.d(t,{YD:function(){return d}});var i,n,a=r(2265),o=Object.defineProperty,s=new Map,l=new WeakMap,c=0;function d(){var e;let{threshold:t,delay:r,trackVisibility:n,rootMargin:o,root:d,triggerOnce:u,skip:f,initialInView:p,fallbackInView:m,onChange:g}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},[h,v]=a.useState(null),b=a.useRef(g),y=a.useRef(p),[x,w]=a.useState({inView:!!p,entry:void 0});b.current=g,a.useEffect(()=>{let e;if(void 0===y.current&&(y.current=p),!f&&h)return e=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:i;if(void 0===window.IntersectionObserver&&void 0!==n){let i=e.getBoundingClientRect();return t(n,{isIntersecting:n,target:e,intersectionRatio:"number"==typeof r.threshold?r.threshold:0,time:0,boundingClientRect:i,intersectionRect:i,rootBounds:i}),()=>{}}let{id:a,observer:o,elements:d}=function(e){let t=Object.keys(e).sort().filter(t=>void 0!==e[t]).map(t=>{var r;return"".concat(t,"_").concat("root"===t?(r=e.root)?(l.has(r)||(c+=1,l.set(r,c.toString())),l.get(r)):"0":e[t])}).toString(),r=s.get(t);if(!r){let i;let n=new Map,a=new IntersectionObserver(t=>{t.forEach(t=>{var r;let a=t.isIntersecting&&i.some(e=>t.intersectionRatio>=e);e.trackVisibility&&void 0===t.isVisible&&(t.isVisible=a),null==(r=n.get(t.target))||r.forEach(e=>{e(a,t)})})},e);i=a.thresholds||(Array.isArray(e.threshold)?e.threshold:[e.threshold||0]),r={id:t,observer:a,elements:n},s.set(t,r)}return r}(r),u=d.get(e)||[];return d.has(e)||d.set(e,u),u.push(t),o.observe(e),function(){u.splice(u.indexOf(t),1),0===u.length&&(d.delete(e),o.unobserve(e)),0===d.size&&(o.disconnect(),s.delete(a))}}(h,(t,r)=>{let i=y.current;y.current=t,(void 0!==i||t)&&(w({inView:t,entry:r}),b.current&&b.current(t,r),r.isIntersecting&&u&&e&&(e(),e=void 0))},{root:d,rootMargin:o,threshold:t,trackVisibility:n,delay:r},m),()=>{e&&e()}},[Array.isArray(t)?t.toString():t,h,d,o,u,f,n,m,r]);let j=null==(e=x.entry)?void 0:e.target,k=a.useRef(void 0);h||!j||u||f||k.current===j||(k.current=j,w({inView:!!p,entry:void 0}),y.current=p);let N=[v,x.inView,x.entry];return N.ref=N[0],N.inView=N[1],N.entry=N[2],N}a.Component,null!=(null!=(n=a.useInsertionEffect)?n:a.useLayoutEffect)||a.useEffect}},function(e){e.O(0,[972,590,239,971,117,744],function(){return e(e.s=6450)}),_N_E=e.O()}]);