PageSourceSearch

https://www.connorlove.com/_next/static/chunks/pages/about-635fd79985935f4f.js

js connorlove.com collected 2026-10-06 13:36:01 UTC 33,908 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[521],{5173:function(e,n,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/about",function(){return t(8211)}])},8493:function(e,n,t){"use strict";t.d(n,{Z:function(){return h}});var s=t(5893),i=t(512),r=t(3844),a=t.n(r),o=t(4903),l=t(7294),c=t(5829),d=t(6038),u=t(6805),p=(e,n)=>{(0,u.L)(()=>{let t=d.p8.context(()=>{let t=new c.Z(e.current,{types:"chars",tagName:"span",charClass:n.char});return t.chars.forEach((e,n)=>{e.style.setProperty("--i",n)}),()=>{t.kill()}},e);return()=>t.kill()},[])},h=function(e){let{children:n}=e,t=(0,l.useRef)(),r=(0,o.Z)(t);return p(t,a()),(0,s.jsx)("span",{ref:t,className:(0,i.Z)(a().title,r&&a().visible),"aria-hidden":"true",children:n})}},8211:function(e,n,t){"use strict";t.r(n),t.d(n,{default:function(){return et}});var s=t(5893),i=t(7294),r=t(5675),a=t.n(r),o=t(512),l=t(6038),c=t(2253),d=t.n(c),u=t(255),p=t(6805),h=t(8353),m=function(){let e=(0,i.useRef)(),n=(0,h.iP)(),t=(0,u.Z)(),r=(0,i.useRef)(),c=(0,i.useMemo)(()=>document.querySelector("main"),[]),m=()=>l.p8.context(()=>{l.p8.set(r.current,{yPercent:t?0:-10}),l.p8.to(r.current,{yPercent:20,scrollTrigger:{trigger:e.current,start:"top top",end:"bottom+=".concat(.35*n.height),scrub:!0,scroller:c,invalidateOnRefresh:!0}})});return(0,p.L)(()=>{let e=m();return()=>e.kill()},[n.height,t]),(0,s.jsxs)("section",{ref:e,className:(0,o.Z)(d().root,"layout-block-inner"),children:[(0,s.jsx)("header",{className:d().titleContainer,children:(0,s.jsx)("h1",{className:(0,o.Z)(d().title,"h2"),children:"I build fast, clean, scalable web applications."})}),(0,s.jsx)("div",{className:d().wrapper,children:(0,s.jsx)("div",{ref:r,className:d().imageContainer,children:(0,s.jsx)(a(),{priority:!0,quality:100,src:"/connor/back.webp",sizes:"100%",fill:!0,alt:"Connor Love Back"})})})]})},v=t(3766),x=t(398),g=t.n(x),f=function(){let e=(0,u.Z)();return(0,s.jsxs)("section",{className:(0,o.Z)(g().root,"layout-grid-inner"),children:[(0,s.jsx)("div",{className:g().title,children:e?(0,s.jsxs)(v.Z,{children:[(0,s.jsx)("p",{className:"h3",children:"I build for the web with a focus on"}),(0,s.jsxs)("p",{className:"h3",children:[(0,s.jsx)("span",{className:"medium",children:"performance"}),", ",(0,s.jsx)("span",{className:"medium",children:"clarity"}),","]}),(0,s.jsxs)("p",{className:"h3",children:["and ",(0,s.jsx)("span",{className:"medium",children:"how things feel"})," to use."]})]},"mobile-queto"):(0,s.jsxs)(v.Z,{children:[(0,s.jsx)("p",{className:"h3",children:"I build for the web with a focus on"}),(0,s.jsxs)("p",{className:"h3",children:[(0,s.jsx)("span",{className:"medium",children:"performance"}),", ",(0,s.jsx)("span",{className:"medium",children:"clarity"}),", and"]}),(0,s.jsxs)("p",{className:"h3",children:[(0,s.jsx)("span",{className:"medium",children:"how things feel"})," to use."]})]},"desktop-queto")}),(0,s.jsx)("div",{className:(0,o.Z)(g().text,"p-l",g().myStory),children:(0,s.jsx)(v.Z,{children:(0,s.jsx)("span",{children:"About"})})}),(0,s.jsx)("div",{className:g().desc,children:e?(0,s.jsxs)(v.Z,{children:[(0,s.jsx)("p",{className:"h6",children:"I'm Connor, a creative developer focused on building modern"}),(0,s.jsx)("p",{className:"h6",children:"web applications that balance design and engineering."}),(0,s.jsx)("p",{className:"h6",children:"My work centers around performance, interaction, and"}),(0,s.jsx)("p",{className:"h6",children:"creating experiences that feel smooth and intentional."}),(0,s.jsx)("p",{className:(0,o.Z)(g().paddingTop,"h6"),children:"I've built projects ranging from interactive interfaces to"}),(0,s.jsx)("p",{className:"h6",children:"full-stack applications, always focusing on clean systems"}),(0,s.jsx)("p",{className:"h6",children:"and long-term scalability."}),(0,s.jsx)("p",{className:(0,o.Z)(g().paddingTop,"h6"),children:"Outside of coding, I spend time exploring design, refining"}),(0,s.jsx)("p",{className:"h6",children:"details, and pushing my work to feel more polished"}),(0,s.jsx)("p",{className:"h6",children:"and thoughtful."}),(0,s.jsx)("p",{className:(0,o.Z)(g().paddingTop,"h6"),children:"Connor Love."})]},"desktop-overview"):(0,s.jsxs)(v.Z,{children:[(0,s.jsx)("p",{className:"h6",children:"I'm Connor, a creative developer focused on building"}),(0,s.jsx)("p",{className:"h6",children:"modern web applications that balance design and"}),(0,s.jsx)("p",{className:"h6",children:"engineering. My work centers around performance,"}),(0,s.jsx)("p",{className:"h6",children:"interaction, and creating experiences that feel smooth"}),(0,s.jsx)("p",{className:"h6",children:"and intentional."}),(0,s.jsx)("p",{className:(0,o.Z)(g().paddingTop,"h6"),children:"I've built projects ranging from interactive interfaces"}),(0,s.jsx)("p",{className:"h6",children:"to full-stack applications, al
1ways focusing on clean"}),(0,s.jsx)("p",{className:"h6",children:"systems and long-term scalability."}),(0,s.jsx)("p",{className:(0,o.Z)(g().paddingTop,"h6"),children:"Outside of coding, I spend time exploring design and"}),(0,s.jsx)("p",{className:"h6",children:"refining details to make my work feel more polished"}),(0,s.jsx)("p",{className:"h6",children:"and thoughtful."}),(0,s.jsx)("p",{className:(0,o.Z)(g().paddingTop,"h6"),children:"Connor Love."})]},"mobile-overview")})]})},y=t(3901),j=t.n(y),b=t(8493),_=t(5355),N=t(9477),w=t(3751),C=t(4771),T=t(6493),S=t(2473),k=t(6701),I=t(9034),R=t(5697),Z=t.n(R),P=t(8175);(0,I.e)({RoundedBoxGeometry:P.k});let L={x:0,y:0,z:1},q={x:0,y:0,z:0};function D(e){let{roughness:n,color:t,isSphere:i,text:r}=e;return(0,s.jsxs)(w.G,{children:[(0,s.jsx)(M,{roughness:n,color:t,isSphere:i,text:r}),(0,s.jsx)(C.qA,{files:i?"/other/warehouse.hdr":"/other/studio_small_09_1k.hdr",blur:1})]})}function M(e){let{roughness:n,color:t,isSphere:r,text:a}=e,{camera:o,mesh:l,scene:c,texture:d}=function(){let e=(0,i.useRef)(),n=(0,i.useRef)(),[t,s]=(0,i.useMemo)(()=>[new N.Scene,new N.WebGLRenderTarget(window.innerWidth,window.innerHeight)],[]);return(0,I.F)(i=>{let{clock:r,gl:a}=i,o=r.getElapsedTime();e.current&&n.current&&(n.current.rotation.y=o,a.setRenderTarget(s),a.render(t,e.current),a.setRenderTarget(null))}),{camera:e,mesh:n,scene:t,texture:null==s?void 0:s.texture}}();return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("perspectiveCamera",{aspect:1,far:20,fov:75,near:1,position:[0,0,5],ref:o}),r?(0,s.jsx)(T.aL,{args:[1.8,32,32],ref:l,children:(0,s.jsx)(E,{isSphere:r,texture:d,color:t,roughness:n})}):(0,s.jsxs)("mesh",{ref:l,children:[(0,s.jsx)("roundedBoxGeometry",{attach:"geometry",args:[2.7,2.7,2.7,7,.2]}),(0,s.jsx)(E,{isSphere:r,texture:d,color:t,roughness:n})]}),c&&(0,I.h)((0,s.jsx)(S.x,{scale:[.7,1.5,1],fontSize:r?1:.8,children:a}),c)]})}function E(e){let{roughness:n,color:t,texture:r,isSphere:a}=e;N.Cache.enabled=!0;let[o,l,c]=(0,k.mE)(["/other/noise1.png","/other/peakpx.jpg","/other/noise2.png"]),d=e=>{e.minFilter=N.NearestFilter,e.wrapS=e.wrapT=N.MirroredRepeatWrapping};d(o),d(l),d(c);let{baseMap:u,heightVolumeMap:p}={baseMap:l,heightVolumeMap:a?o:c},[h]=(0,i.useState)(()=>({time:{value:0},volumeColor:{value:new N.Color(t)},baseMap:{value:u},heightVolumeMap:{value:p},iterations:{value:48},smoothing:{value:.02},rayDirPos:{value:L},rayOrigPos:{value:q},uRepeats:{value:a?{x:5,y:4}:{x:1,y:1}},uTextSpeed:{value:.3},uHasTexture:{value:!!r},uTexture:{value:r},uUseTextAnimation:{value:!0}}));(0,I.F)(e=>{let{clock:n}=e;h.time.value=1+.05*n.elapsedTime});let m=e=>{e.uniforms={...e.uniforms,...h},e.vertexShader="\n      varying vec3 v_pos;\n      varying vec3 v_dir;\n      varying vec2 vUv;\n\n    ".concat(e.vertexShader),e.vertexShader=e.vertexShader.replace(/void main\(\) {/,e=>"".concat(e,"\n        vUv = uv;\n        vNormal = normal;\n\n        vec3 newPosition = position;\n        gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0
1);\n        ")),e.fragmentShader="\n      #define FLIP vec2(1., -1.)\n\n      uniform vec3 volumeColor;\n      uniform sampler2D baseMap;\n      uniform sampler2D heightVolumeMap;\n      uniform int iterations;\n      uniform float smoothing;\n      uniform float time;\n      uniform vec3 rayDirPos;\n      uniform vec3 rayOrigPos;\n\n      uniform bool uHasTexture;\n      uniform vec2 uRepeats;\n      uniform sampler2D uTexture;\n      uniform float uTextSpeed;\n      uniform float uTime;\n      uniform bool uUseTextAnimation;\n\n      varying vec3 v_pos;\n      varying vec3 v_dir;\n      varying vec2 vUv;\n\n    ".concat(e.fragmentShader),e.fragmentShader=e.fragmentShader.replace(/void main\(\) {/,e=>"".concat("\nvec3 mod289(vec3 x) {\n   return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec2 mod289(vec2 x) {\n   return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec3 permute(vec3 x) {\n   return mod289(((x*34.0)+1.0)*x);\n}\n\n#define noiseFactor 0.2\n\nfloat snoise(vec2 v) {\n const vec4 C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439);\n vec2 i  = floor(v + dot(v, C.yy));\n vec2 x0 = v - i + dot(i, C.xx);\n\n vec2 i1;\n i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);\n vec4 x12 = x0.xyxy + C.xxzz;\n x12.xy -= i1;\n\n i = mod289(i);\n vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0)) + i.x + vec3(0.0, i1.x, 1.0));\n\n vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0);\n m = m*m;\n m = m*m;\n\n vec3 x = 2.0 * fract(p * C.www) - 1.0;\n vec3 h = abs(x) - 0.5;\n vec3 ox = floor(x + 0.5);\n vec3 a0 = x - ox;\n\n m *= 1.79284291400159 - 0.85373472095314 * (a0*a0 + h*h);\n\n vec3 g;\n g.x  = a0.x  * x0.x  + h.x  * x0.y;\n g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n return noiseFactor * dot(m, g);\n}","\n\n\n      /**\n      * @param rayOrigin - Point on sphere\n      * @param rayDir - Normalized ray direction\n      * @returns Diffuse RGB color\n      */\n\n      vec3 raymarching_sphere(vec3 rayOrigin, vec3 rayDir) {\n        float perIteration = 1.0 / float(iterations);\n        vec3 deltaRay = rayDir * perIteration;\n        vec3 p = rayOrigin;\n        float totalVolume = 0.0;\n        vec2 uv2 = vUv;\n\n        for (int i = 0; i < iterations; ++i) {\n            vec2 uv = uv2;\n            float s = snoise(vec2(uv.x * 1.0 + time * 10.0, uv.y * 1.3 + time * 10.0));\n            uv *= 1.0 + s * 100.0;\n            float heightMapVal = texture(heightVolumeMap, uv).r;\n            float height = length(p);\n            float cutoff = 1.0 - float(i) * perIteration;\n            float slice = smoothstep(cutoff, cutoff + smoothing, heightMapVal);\n            totalVolume += slice * perIteration;\n            p += deltaRay;\n\n\n            if (totalVolume >= 1.0) {\n                break;\n            }\n        }\n\n        float s2 = snoise(vec2(uv2.x * 1.0 - time * 10.0, uv2.y * 1.3 - time * 10.0));\n        uv2 *= 1.0 + s2 * 100.0;\n\n        return mix(texture(baseMap, uv2).rgb, volumeColor.rgb, totalVolume);\n    }\n      ").concat(e)),e.fragmentShader=e.fragmentShader.replace(/vec4 diffuseColor.*;/,"\n      vec2 repeat = vec2(uRepeats.x, uRepeats.y);\n      float animationSpeed = uUseTextAnimation ? uTime * uTextSpeed * 0.5: 0.0;\n      vec2 uv = fract(animationSpeed + vUv * repeat);\n      vec3 textureColor = texture2D(uTexture, uv).rgb;\n\n      vec3 rayDir = normalize(v_dir) + rayDirPos;\n      vec3 rayOrigin = v_pos + rayOrigPos;\n      vec3 rgb = raymarching_sphere(rayOrigin, rayDir);\n      vec4 sphereColor = vec4(rgb, 1.0);\n      vec4 textColor =  vec4(0.0, 0.0, 0.0, 1.0);\n      vec4 diffuseColor = mix(sphereColor, textColor, step(0.5, textureColor.r));")};return(0,s.jsx)("meshStandardMaterial",{roughness:n,onBeforeCompile:m,customProgramCacheKey:()=>m.toString()})}D.propTypes={roughness:Z().number.isRequired,color:Z().string.isRequired,isSphere:Z().bool.isRequired,text:Z().string.isRequired};var F=t(6546);let O=[{smallTitle:"Development",bigTitle:"Web Applications",desc:[(0,s.jsx)("div",{className:"p-l",children:"I build modern web applications with a focus on performance,"}),(0,s.jsx)("div",{className:"p-l",children:"scalability, and clean architecture. From frontend to backend,"}),(0,s.jsx)("div",{className:"p-l",children:"everything is designed to work reliably in real-world use."})],descMobile:[(0,s.jsx)("div",{className:"p-l",children:"I build modern web applications with a focus on"}),(0,s.jsx)("div",{className:"p-l",children:"performance, scalability, and clean architecture."}),(0,s.jsx)("div",{className:"p-l",children:"From frontend to backend, everything is designed"}),(0,s.jsx)("div",{className:"p-l",children:"to work reliably in real-world use."})],options:[{title:"Full-Stack Development",desc:"End-to-end applications built with modern frameworks and scalable architecture"},{title:"Frontend Engineering",desc:"Fast, responsive interfaces built with performance and usability in mind"},{title:"Backend Systems",desc:"APIs and services designed for reliability, scalability, and clean structure"},{title:"Performance Optimization",desc:"Improve load times, responsiveness, and overall user experience"}]},{smallTitle:"Creative",bigTitle:"Interactive Experiences",desc:[(0,s.jsx)("div",{className:"p-l",children:"I create interactive web experiences that focus on motion,"}),(0,s.jsx)("div",{className:"p-l",children:"feedback, and how things feel to use. Every interaction is"}),(0,s.jsx)("div",{className:"p-l",children:"designed to be smooth, intentional, and engaging."})],descMobile:[(0,s.jsx)("div",{className:"p-l",children:"I create interactive web experiences focused on"}),(0,s.jsx)("div",{className:"p-l",children:"motion, feedback, and how things feel to use."}),(0,s.jsx)("div",{className:"p-l",children:"Every interaction is designed to be smooth,"}),(0,s.jsx)("div",{className:"p-l",children:"intentional, and engaging."})],options:[{title:"3D Web Experiences",desc:"Immersive interfaces using Three.js and modern rendering techniques"},{title:"Animation & Motion",desc:"Smooth, meaningful animations that improve usability and feel"},{title:"Microinteractions",desc:"Small details that make interfaces feel responsive and polished"},{title:"Creative Development",desc:"Custom builds that go beyond standard templates and patterns"}]},{smallTitle:"Design",bigTitle:"Design Systems",desc:[(0,s.jsx)("div",{className:"p-l",children:"I design systems that keep products consistent, scalable,"}),(0,s.jsx)("div",{className:"p-l",children:"and easy to maintain. Focused on structure, clarity, and"}),(0,s.jsx)("div",{className:"p-l",children:"long-term usability across interfaces."})],descMobile:[(0,s.jsx)("div",{className:"p-l",children:"I design systems that keep products consistent,"}),(0,s.jsx)("div",{className:"p-l",children:"scalable, and easy to maintain. Focused on"}),(0,s.jsx)("div",{className:"p-l",children:"structure, clarity, and long-term usability."})],options:[{title:"UI Systems",desc:"Reusable components and patterns for consistent interfaces"},{title:"Component Libraries",desc:"Scalable design systems built for real-world applications"},{title:"UX Design",desc:"Clear, intuitive interfaces focused on usability and flow"},{title:"Product Thinking",desc:"Design decisions grounded in real user needs and behavior"}]}];var B=t(2010),z=t(9404);let A=["#8A2BE2","#FFFF00","#DC143C"],W=(0,i.memo)(e=>{let{setPortals:n}=e,[t]=(0,z.o)((0,B.N)(e=>[e.isLoading])),r=(0,u.Z)(),a=(0,i.useRef)(),c=(0,i.useRef)(),d=(0,i.useRef)(),m=(0,i.useRef)([]),x=(0,i.useRef)([]),g=(0,i.useRef)(O.map(e=>e.options.map(()=>[]))),f=(0,h.iP)();(0,p.L)(()=>{let e=e=>f.width*(e/100),n=l.p8.context(()=>{if(!r&&!t){var n;F.ScrollTrigger.create({id:"services",trigger:c.current,start:"top",end:"bottom-=".concat(e(30)),pin:d.current,scrub:!0,scroller:null===(n=document)||void 0===n?void 0:n.querySelector("main"),invalidateOnRefresh:!0,pinSpacing:!1}),x.current.forEach((e,n)=>{if(e){var t;l.p8.set(e,{yPercent:-100}),l.p8.timeline({scrollTrigger:{trigger:m.current[n],start:0===n?"top-=500%":"top center",end:"bottom center",id:"services-".concat(n),scroller:null===(t=document)||void 0===t?void 0:t.querySelector("main"),onEnter:()=>{0===n?l.p8.set(e,{yPercent:0}):(l.p8.set(e,{yPercent:-100,overwrite:!0}),l.p8.to(e,{yPercent:0,duration:1,ease:"bounce.out"}))},onLeave:()=>{2===n?l.p8.set(e,{yPercent:0}):l.p8.to(e,{yPercent:100,duration:1,ease:"power1.out"})},onEnterBack:()=>{2!==n&&(l.p8.set(e,{yPercent:-100,overwrite:!0}),l.p8.to(e,{yPercent:0,duration:1,ease:"bounce.out"}))},onLeaveBack:()=>{l.p8.to(e,{yPercent:100,duration:1,ease:"power1.out"})},invalidateOnRefresh:!0}})}})}});return()=>{n.kill(),F.ScrollTrigger.getById("services")&&F.ScrollTrigger.getById("services").kill()}},[r,t,f.width]);let y=(0,i.useCallback)((e,t,s)=>{{l.p8.to(g.current[e][t],{color:"#28282b",duration:.35,ease:"none"});let i=document.querySelector("main");null==i||i.classList.toggle("color-change");let r=document.getElementById("mainContainer"),a=null==r?void 0:r.querySelectorAll("section")[3],o=null==r?void 0:r.querySelectorAll("section")[2];null==o||o.classList.toggle("fill-change"),null==a||a.classList.toggle("fill-change"),n(e=>{let n=e.findIndex(e=>e.title===s.title);if(-1!==n){let t=[...e];return t[n]={...t[n],fadeIn:!0},t}
1return[...e,{title:s.title,desc:s.desc,fadeIn:!0}]})}},[]),N=(0,i.useCallback)((e,t,s)=>{var i;l.p8.to(g.current[e][t],{color:"unset",duration:.35,ease:"none"}),(null===(i=document)||void 0===i?void 0:i.querySelector("main")).classList.remove("color-change");let r=document.getElementById("mainContainer"),a=r.querySelectorAll("section")[3];r.querySelectorAll("section")[2].classList.remove("fill-change"),a.classList.remove("fill-change"),n(e=>{let n=e.findIndex(e=>e.title===s.title);if(-1===n)return e;let t=[...e];return t[n]={...t[n],fadeIn:!1},t})},[]);return(0,s.jsxs)("section",{ref:a,className:(0,o.Z)(j().root,"layout-block-inner"),children:[(0,s.jsx)("div",{className:j().topContainer,children:(0,s.jsx)("h2",{className:(0,o.Z)(j().text,"h1"),children:(0,s.jsx)(b.Z,{children:"Services"})})}),(0,s.jsxs)("div",{className:j().servicesContainer,children:[(0,s.jsxs)("div",{ref:d,className:j().leftContainer,children:[r?null:(0,s.jsx)(s.Fragment,{children:O.map((e,n)=>(0,s.jsx)("div",{className:j().shapesContainer,children:(0,s.jsx)("div",{ref:e=>{x.current[n]=e},className:j().shape,children:(0,s.jsx)(D,{isSphere:!0,color:A[n],text:e.smallTitle,roughness:.4})})},"services-shape-".concat(n)))}),(0,s.jsx)("div",{className:j().spacing})]}),(0,s.jsx)("div",{ref:c,className:j().rightContainer,children:O.map((e,n)=>(0,s.jsxs)("div",{ref:e=>{m.current[n]=e},className:j().category,children:[r?(0,s.jsx)("div",{ref:e=>{x.current[n]=e},className:j().shape,children:(0,s.jsx)(D,{isSphere:!0,color:A[n],text:e.smallTitle,roughness:.5})}):null,(0,s.jsxs)("div",{className:j().innerContainer,children:[(0,s.jsx)(v.Z,{children:(0,s.jsx)("h3",{className:"h6",children:e.bigTitle})}),r?(0,s.jsx)(v.Z,{children:e.descMobile.map((e,n)=>(0,s.jsx)(i.Fragment,{children:e},"services-descMobile-".concat(n)))}):null,r?null:(0,s.jsx)(v.Z,{children:e.desc.map((e,n)=>(0,s.jsx)(i.Fragment,{children:e},"services-desc-".concat(n)))}),(0,s.jsx)("div",{className:j().options,children:e.options.map((e,t)=>(0,s.jsxs)("div",{onMouseEnter:()=>y(n,t,e),onMouseLeave:()=>N(n,t,e),className:j().option,children:[(0,s.jsx)(_.Z,{className:j().arrow}),(0,s.jsx)("div",{className:"p-l",children:(0,s.jsx)(v.Z,{index:n,optionIndex:t,ref:g,children:(0,s.jsx)("div",{children:e.title})})})]},e.title))})]})]},e.bigTitle))})]})]})},()=>!0);var U=t(3935);function V(e){let{children:n,fadeIn:t,container:s}=e,[r,a]=(0,i.useState)(!0),o=(0,i.useRef)(null),l=()=>{t?(clearTimeout(o.current),r||a(!0)):o.current=setTimeout(()=>{a(!1)},450)};if((0,i.useEffect)(()=>(l(),()=>clearTimeout(o.current)),[t]),!r)return null;let c=s||document.body;return c?U.createPortal(n,c):null}V.propTypes={children:Z().node.isRequired,fadeIn:Z().bool.isRequired,container:Z().instanceOf(Element)},V.defaultProps={container:document.body};var K=function(){let[e,n]=(0,i.useState)([]);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(W,{setPortals:n}),e.map(e=>(0,s.jsx)(V,{fadeIn:e.fadeIn,children:(0,s.jsxs)("div",{className:(0,o.Z)(j().hoverTextContainer,e.fadeIn?"fade-in":"fade-out"),children:[(0,s.jsx)("div",{className:(0,o.Z)("p-l",j().hoverText),children:e.title}),(0,s.jsx)("div",{className:(0,o.Z)("p-l",j().hoverText),children:e.desc})]})},e.title))]})},X=t(3836),G=t.n(X);let H=[{smallTitle:"Development",bigTitle:"Development Lifecycle",desc:[(0,s.jsx)("div",{className:"p-l",children:"I approach every project with a focus on clarity, performance,"}),(0,s.jsx)("div",{className:"p-l",children:"and long-term scalability. Each step is intentional, from"}),(0,s.jsx)("div",{className:"p-l",children:"initial concept to final deployment and iteration."})],descMobile:[(0,s.jsx)("div",{className:"p-l",children:"I approach every project with a focus on clarity,"}),(0,s.jsx)("div",{className:"p-l",children:"performance, and long-term scalability. Each step"}),(0,s.jsx)("div",{className:"p-l",children:"is intentional, from initial concept to deployment"}),(0,s.jsx)("div",{className:"p-l",children:"and iteration."})],options:[{title:"Discovery",desc:"Understand the product, goals, and constraints before writing any code"},{title:"Planning",desc:"Define structure, tech stack, and system architecture"},{title:"Design Integration",desc:"Translate design into responsive, accessible interfaces"},{title:"Development",desc:"Build clean, modular, and scalable systems across the stack"},{title:"Testing",desc:"Validate performance, usability, and reliability across environments"},{title:"Optimization",desc:"Refine speed, interactions, and overall user experience"},{title:"Deployment",desc:"Ship stable, production-ready applications"},{title:"Iteration",desc:"Improve and expand based on real usage and feedback"}]},{smallTitle:"Workflow",bigTitle:"Workflow",desc:[(0,s.jsx)("div",{className:"p-l",children:"My workflow is focused on building quickly without sacrificing"}),(0,s.jsx)("div",{className:"p-l",children:"quality. I prioritize clean systems, clear communication,"}),(0,s.jsx)("div",{className:"p-l",children:"and consistent progress from start to finish."})],descMobile:[(0,s.jsx)("div",{className:"p-l",children:"My workflow is focused on building quickly without"}),(0,s.jsx)("div",{className:"p-l",children:"sacrificing quality. I prioritize clean systems,"}),(0,s.jsx)("div",{className:"p-l",children:"clear communication, and consistent progress"}),(0,s.jsx)("div",{className:"p-l",children:"from start to finish."})],options:[{title:"Project Kickoff",desc:"Align on goals, scope, and expectations early"}
1,{title:"System Setup",desc:"Prepare a clean development environment and structure"},{title:"Iterative Builds",desc:"Develop in small, testable increments with constant feedback"},{title:"Component-First",desc:"Build reusable components for scalability and consistency"},{title:"Version Control",desc:"Maintain a clear history and structured workflow using Git"},{title:"Code Quality",desc:"Write clean, maintainable code with clear patterns"},{title:"Performance Focus",desc:"Continuously monitor and improve speed and responsiveness"},{title:"Collaboration",desc:"Work closely with designers and stakeholders throughout"},{title:"Final Review",desc:"Refine details and validate the full experience before launch"},{title:"Launch & Support",desc:"Deploy confidently and support post-launch improvements"}]}],Y=["#444444","#f2ffbd"],Q=(0,i.memo)(e=>{let{setPortals:n}=e,[t]=(0,z.o)((0,B.N)(e=>[e.isLoading])),r=(0,u.Z)(),a=(0,i.useRef)(),c=(0,i.useRef)(),d=(0,i.useRef)(),m=(0,i.useRef)([]),x=(0,i.useRef)([]),g=(0,i.useRef)(H.map(e=>e.options.map(()=>[]))),f=(0,h.iP)();(0,p.L)(()=>{let e=e=>f.width*(e/100),n=l.p8.context(()=>{if(!r&&!t){var n;F.ScrollTrigger.create({id:"process",trigger:c.current,start:"top",end:"bottom-=".concat(e(30)),pin:d.current,scrub:!0,scroller:null===(n=document)||void 0===n?void 0:n.querySelector("main"),invalidateOnRefresh:!0,pinSpacing:!1}),x.current.forEach((e,n)=>{if(e){var t;l.p8.set(e,{xPercent:-100}),l.p8.timeline({scrollTrigger:{trigger:m.current[n],start:0===n?"top-=500%":"top center",end:"bottom center",id:"process-".concat(n),scroller:null===(t=document)||void 0===t?void 0:t.querySelector("main"),onEnter:()=>{0===n?l.p8.set(e,{xPercent:0}):(l.p8.set(e,{xPercent:-100,overwrite:!0}),l.p8.to(e,{xPercent:0,duration:1,ease:"bounce.out"}))},onLeave:()=>{2===n?l.p8.set(e,{xPercent:0}):l.p8.to(e,{xPercent:100,duration:1,ease:"power1.out"})},onEnterBack:()=>{2!==n&&(l.p8.set(e,{xPercent:-100,overwrite:!0}),l.p8.to(e,{xPercent:0,duration:1,ease:"bounce.out"}))},onLeaveBack:()=>{l.p8.to(e,{xPercent:100,duration:1,ease:"power1.out"})},invalidateOnRefresh:!0}})}})}});return()=>{n.kill(),F.ScrollTrigger.getById("process")&&F.ScrollTrigger.getById("process").kill()}},[r,t,f.width]);let y=(0,i.useCallback)((e,t,s)=>{{l.p8.to(g.current[e][t],{color:"#28282b",duration:.35,ease:"none"});let i=document.querySelector("main");null==i||i.classList.toggle("color-change");let r=document.getElementById("mainContainer"),a=null==r?void 0:r.querySelectorAll("section")[3],o=null==r?void 0:r.querySelectorAll("section")[2];null==o||o.classList.toggle("fill-change"),null==a||a.classList.toggle("fill-change"),n(e=>{let n=e.findIndex(e=>e.title===s.title);if(-1!==n){let t=[...e];return t[n]={...t[n],fadeIn:!0},t}return[...e,{title:s.title,desc:s.desc,fadeIn:!0}]})}},[]),j=(0,i.useCallback)((e,t,s)=>{var i;l.p8.to(g.current[e][t],{color:"unset",duration:.35,ease:"none"}),(null===(i=document)||void 0===i?void 0:i.querySelector("main")).classList.remove("color-change");let r=document.getElementById("mainContainer"),a=r.querySelectorAll("section")[3];r.querySelectorAll("section")[2].classList.remove("fill-change"),a.classList.remove("fill-change"),n(e=>{let n=e.findIndex(e=>e.title===s.title);if(-1===n)return e;let t=[...e];return t[n]={...t[n],fadeIn:!1},t})},[]);return(0,s.jsxs)("section",{ref:a,className:(0,o.Z)(G().root,"layout-block-inner"),children:[(0,s.jsx)("div",{className:G().topContainer,children:(0,s.jsx)("h2",{className:(0,o.Z)(G().text,"h1"),children:(0,s.jsx)(b.Z,{children:"Process"})})}),(0,s.jsxs)("div",{className:G().processContainer,children:[(0,s.jsxs)("div",{ref:d,className:G().leftContainer,children:[r?null:(0,s.jsx)(s.Fragment,{children:H.map((e,n)=>(0,s.jsx)("div",{className:G().shapesContainer,children:(0,s.jsx)("div",{ref:e=>{x.current[n]=e},className:G().shape,children:(0,s.jsx)(D,{isSphere:!1,color:Y[n],text:e.smallTitle,roughness:.4})})},"process-shape-".concat(n)))}),(0,s.jsx)("div",{className:G().spacing})]}),(0,s.jsx)("div",{ref:c,className:G().rightContainer,children:H.map((e,n)=>(0,s.jsxs)("div",{ref:e=>{m.current[n]=e},className:G().category,children:[r?(0,s.jsx)("div",{ref:e=>{x.current[n]=e},className:G().shape,children:(0,s.jsx)(D,{isSphere:!1,color:Y[n],text:e.smallTitle,roughness:.5})}):null,(0,s.jsxs)("div",{className:G().innerContainer,children:[(0,s.jsx)(v.Z,{children:(0,s.jsx)("h3",{className:"h6",children:e.bigTitle})}),r?(0,s.jsx)(v.Z,{children:e.descMobile.map((e,n)=>(0,s.jsx)(i.Fragment,{children:e},"process-descMobile-".concat(n)))}):null,r?null:(0,s.jsx)(v.Z,{children:e.desc.map((e,n)=>(0,s.jsx)(i.Fragment,{children:e},"process-desc-".concat(n)))}),(0,s.jsx)("div",{className:G().options,children:e.options.map((e,t)=>(0,s.jsxs)("div",{onMouseEnter:()=>y(n,t,e),onMouseLeave:()=>j(n,t,e),className:G().option,children:[(0,s.jsx)(_.Z,{className:G().arrow}),(0,s.jsx)("div",{className:"p-l",children:(0,s.jsx)(v.Z,{index:n,optionIndex:t,ref:g,children:(0,s.jsx)("div",{children:e.title})})})]},e.title))})]})]},e.bigTitle))})]})]})},()=>!0);var J=function(){let[e,n]=(0,i.useState)([]);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(Q,{setPortals:n}),e.map(e=>(0,s.jsx)(V,{fadeIn:e.fadeIn,children:(0,s.jsxs)("div",{className:(0,o.Z)(G().hoverTextContainer,e.fadeIn?"fade-in":"fade-out"),children:[(0,s.jsx)("div",{className:(0,o.Z)("p-l",G().hoverText),children:e.title}),(0,s.jsx)("div",{className:(0,o.Z)("p-l",G().hoverText),children:e.desc})]})}
1,e.title))]})},$=t(770),ee=t(3023);let en={title:"About Connor Love | Ohio Web Developer & Frontend Engineer",description:"Learn about Connor Love, a Columbus-based Ohio web developer building fast websites, web applications, and product interfaces for local Ohio and remote teams."};var et=function(){return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)($.Z,{...en,pageType:"about"}),(0,s.jsx)(m,{}),(0,s.jsx)(f,{}),(0,s.jsx)(K,{}),(0,s.jsx)(J,{}),(0,s.jsx)(ee.Z,{variant:"about"})]})}},3023:function(e,n,t){"use strict";var s=t(5893),i=t(512),r=t(5830),a=t.n(r),o=t(5697),l=t.n(o),c=t(6577);let d={home:{eyebrow:"What I do",heading:"I build thoughtful digital products.",subheading:"From the first idea to the final production details.",paragraphs:["I design and develop custom websites, web applications, and product interfaces. My work brings design and engineering together through clear structure, fast performance, accessible interaction, and details that make each experience feel considered.","I am based in Columbus, Ohio, and work with founders, agencies, and product teams wherever they are."],services:c.xK},about:{eyebrow:"My approach",heading:"Thoughtful by default.",subheading:"Design and engineering belong in the same process.",paragraphs:["I start by understanding the goal, the audience, and the constraints. From there, I shape the content, interaction, and technical foundation together so the finished product feels cohesive rather than assembled in pieces.","My usual toolkit includes React, Next.js, semantic HTML, thoughtful motion, and performance-minded implementation. The tools can change; clarity, accessibility, and maintainability do not."],services:c.xK},projects:{eyebrow:"Selected work",heading:"A closer look at my work.",subheading:"Different problems, the same attention to detail.",paragraphs:["These projects cover reusable interface systems, color tools, tokenizer research, and digital typography. Each one began with a different problem and called for a different balance of design and engineering.","Across the work, I focus on responsive interfaces, useful motion, durable component systems, and code that stays understandable as a product grows."],services:c.xK}},u=e=>({eyebrow:"Case study",heading:e.title,subheading:"What I focused on",paragraphs:["For ".concat(e.title,", I brought product thinking, interface design, and frontend engineering together around one clear problem."),...e.desc],services:c.xK});function p(e){let{variant:n="home",project:t}=e,r=t?u(t):d[n]||d.home;return(0,s.jsxs)("section",{className:(0,i.Z)(a().root,"layout-grid-inner"),"aria-labelledby":"".concat(n,"-details-heading"),children:[(0,s.jsxs)("div",{className:a().heading,children:[(0,s.jsx)("p",{className:"p-l",children:r.eyebrow}),(0,s.jsx)("h2",{id:"".concat(n,"-details-heading"),className:"h2",children:r.heading})]}),(0,s.jsxs)("div",{className:a().content,children:[(0,s.jsx)("h3",{className:"h4",children:r.subheading}),r.paragraphs.map(e=>(0,s.jsx)("p",{className:"p-l",children:e},e)),(0,s.jsxs)("div",{className:a().extractableContent,children:[(0,s.jsx)("h3",{className:"h4",children:"What I can help with"}),(0,s.jsx)("ul",{className:a().list,children:r.services.map(e=>(0,s.jsxs)("li",{children:[(0,s.jsx)("span",{className:"h6",children:e.title}),(0,s.jsx)("p",{className:"p-l",children:e.text})]},e.title))})]})]})]})}p.propTypes={variant:l().oneOf(["home","about","projects"]),project:l().shape({title:l().string.isRequired,date:l().string.isRequired,desc:l().arrayOf(l().string).isRequired})},p.defaultProps={variant:"home",project:null},n.Z=p},3844:function(e){e.exports={title:"appearByWords_title__c1a1A",char:"appearByWords_char__KmySQ",visible:"appearByWords_visible__ljtoz"}},2253:function(e){e.exports={root:"hero_root__ZMpDS",titleContainer:"hero_titleContainer__lXDsq",subTitle:"hero_subTitle__06iuu",title:"hero_title___XLH3",wrapper:"hero_wrapper__hgFds",imageContainer:"hero_imageContainer__DufZ1"}},398:function(e){e.exports={root:"overview_root__q8qm7",title:"overview_title__qNUir",myStory:"overview_myStory__ID4Bi",desc:"overview_desc__Fvez0",paddingTop:"overview_paddingTop__WS0F9"}},3836:function(e){e.exports={topContainer:"process_topContainer__gEnKH",text:"process_text__T53b7",root:"process_root__SO1x3",processContainer:"process_processContainer__0RGK
1B",leftContainer:"process_leftContainer__btfZW",spacing:"process_spacing__2xDZt",shapesContainer:"process_shapesContainer__fpeSj",shape:"process_shape___QOqx",rightContainer:"process_rightContainer__6LY_9",category:"process_category__YTUXc",innerContainer:"process_innerContainer__bt2TH",desc:"process_desc__ll08k",options:"process_options__J_N9j",option:"process_option__R0x_d",arrow:"process_arrow__NSGmT",hoverTextContainer:"process_hoverTextContainer__WbYEQ",hoverText:"process_hoverText__FKxjd"}},3901:function(e){e.exports={topContainer:"services_topContainer__OoJeg",text:"services_text__C0Kw5",root:"services_root__bTpEU",servicesContainer:"services_servicesContainer__Hk3w3",leftContainer:"services_leftContainer__Nn2aq",spacing:"services_spacing__GSGes",shapesContainer:"services_shapesContainer__3hIOb",shape:"services_shape__Ld1O3",rightContainer:"services_rightContainer__Yt_Sc",category:"services_category__aicu1",innerContainer:"services_innerContainer__jBcck",desc:"services_desc__yQxnP",options:"services_options__YTbXg",option:"services_option__R_RRU",arrow:"services_arrow__5zgeD",hoverTextContainer:"services_hoverTextContainer__C0i0E",hoverText:"services_hoverText__LUv1E"}},5830:function(e){e.exports={root:"seo_root__J0cXa",heading:"seo_heading__fYDfE",content:"seo_content__YotSI",extractableContent:"seo_extractableContent__L6XmX",list:"seo_list__eX_1c"}}},function(e){e.O(0,[447,838,319,770,888,774,179],function(){return e(e.s=5173)}),_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.