1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/StackRadar-nnrSyuLa.js","assets/animations-mKk2LNaC.js","assets/index-B6A1Izbo.js","assets/router-C2GO3w43.js","assets/index-CKDHrPXp.css","assets/SectionHeader-xqkXaAu7.js","assets/RevealText-DKJba3Uc.js"])))=>i.map(i=>d[i]); 2import{u as G,_ as B}from"./index-B6A1Izbo.js";import{r as k,b as $,c as U,j as e,m as P,A as H}from"./animations-mKk2LNaC.js";import{S as V}from"./SectionHeader-xqkXaAu7.js";const S=[{id:"Mobile",title:"Mobile",token:"--primary",skills:[{name:"Flutter & Dart",level:98},{name:"SwiftUI & UIKit",level:90},{name:"Kotlin & Jetpack Compose",level:75},{name:"watchOS",level:85}],radar:[{name:"Flutter",level:98},{name:"Dart",level:96},{name:"SwiftUI",level:90},{name:"Kotlin",level:75},{name:"watchOS",level:85}]},{id:"Web",title:"Web & Backend",token:"--app-getmycv",skills:[{name:"Next.js & React",level:88},{name:"TypeScript",level:90},{name:"Node.js & REST APIs",level:82},{name:"GraphQL",level:70}],radar:[{name:"React",level:88},{name:"Next.js",level:88},{name:"TypeScript",level:90},{name:"Node.js",level:82},{name:"GraphQL",level:70}]},{id:"AI",title:"AI & LLM",token:"--app-escalate",skills:[{name:"Claude API & Claude Code",level:95},{name:"OpenAI API",level:80},{name:"Prompt Engineering",level:92},{name:"Agent Workflow Design",level:85}],radar:[{name:"Claude API",level:95},{name:"OpenAI",level:80},{name:"Prompt Eng.",level:92},{name:"Agents",level:85}]},{id:"DevOps",title:"DevOps & Cloud",token:"--app-crush",skills:[{name:"Firebase & Google Cloud",level:88},{name:"GitHub Actions & CI/CD",level:90},{name:"Docker & Fastlane",level:78},{name:"Jira Automation",level:85}],radar:[{name:"Firebase",level:88},{name:"CI/CD",level:90},{name:"Docker",level:78},{name:"GCP",level:85}]},{id:"Patterns",title:"Patterns",token:"--app-ccpawan",skills:[],radar:[{name:"Clean Arch",level:92},{name:"BLoC",level:90}]}],A=t=>S.find(n=>n.id===t),K=[{name:"Flutter",group:"Mobile"},{name:"Dart",group:"Mobile"},{name:"Swift",group:"Mobile"},{name:"SwiftUI",group:"Mobile"},{name:"Kotlin",group:"Mobile"},{name:"TypeScript",group:"Web"},{name:"React",group:"Web"},{name:"Next.js",group:"Web"},{name:"Node.js",group:"Web"},{name:"Python",group:"Web"},{name:"Claude API",group:"AI"},{name:"Firebase",group:"DevOps"},{name:"Docker",group:"DevOps"},{name:"GraphQL",group:"Web"},{name:"Clean Architecture",group:"Patterns"},{name:"BLoC",group:"Patterns"},{name:"Riverpod",group:"Mobile"}],Q=S.reduce((t,n)=>t+n.radar.length,0),J=520,f=J/2,M=66,C=180,X=68,ce=8,N=18,q=t=>M+(100-t)/(100-X)*(C-M),F=(t,n)=>{const d=(t-90)*Math.PI/180;return{x:f+n*Math.cos(d),y:f+n*Math.sin(d)}},Y=["Mobile","Web","Patterns","AI","DevOps"],Z=()=>{const t=[],n=[];let d=0;for(const i of Y.map(m=>S.find(o=>o.id===m))){const m=[...i.radar].sort((v,b)=>b.level-v.level),o=[];let p=0,h=m.length-1;for(;p<=h;)o.push(m[p++]),p<=h&&o.push(m[h--]);o.forEach((v,b)=>{const s=d+b*N,r=q(v.level),{x:l,y:w}=F(s,r);t.push({...v,group:i.id,angle:s,radius:r,x:l,y:w})}),n.push({id:i.id,from:d-N/2,to:d+(i.radar.length-1)*N+N/2}),d+=i.radar.length*N}return{nodes:t,sectors:n}},{nodes:T,sectors:z}=Z(),de=[90,80,70],me=M-12,pe=C+10,xe=C+21,ee=C+44,ae=(t,n)=>Math.max(0,Math.min(t.x1,n.x1)-Math.max(t.x0,n.x0))*Math.max(0,Math.min(t.y1,n.y1)-Math.max(t.y0,n.y0)),ue=(t,n)=>{const d=t*.58,i=t*.9,m=t*.3,o=14,p=T.map(s=>({x0:s.x-o,y0:s.y-o,x1:s.x+o,y1:s.y+o})),h=M-12;p.push({x0:f-h,y0:f-h,x1:f+h,y1:f+h});for(const s of z){const r=F((s.from+s.to)/2,ee),l=s.id.length*(n*.62+1.6)+6;p.push({x0:r.x-l/2,y0:r.y-n,x1:r.x+l/2,y1:r.y+n*.5})}const v=new Map,b=[...T].sort((s,r)=>s.radius-r.radius);for(const s of b){const r=(s.name.length+3)*d,l=(s.angle%360+360)%360,w=s.x>=f,g=u=>u===w?{x:s.x+12,y:s.y+t*.36,anchor:"start"}:{x:s.x-12,y:s.y+t*.36,anchor:"end"},j={x:s.x,y:s.y-13,anchor:"middle"},a={x:s.x,y:s.y+13+i,anchor:"middle"},c=l>=330||l<=30?[j,g(!0),g(!1),a]:l>=150&&l<=210?[a,g(!0),g(!1),j]:[g(!0),j,a,g(!1)],x=u=>{const E=u.anchor==="start"?u.x:u.anchor==="end"?u.x-r:u.x-r/2;return{x0:E-3,y0:u.y-i-4,x1:E+r+3,y1:u.y+m+4}};let y=c[0],I=1/0;for(const u of c){const E=x(u),L={x0:s.x-o,y0:s.y-o,x1:s.x+o,y1:s.y+o},_=p.reduce((O,R)=>R.x0===L.x0&&R.y0===L.y0?O:O+ae(E,R),0);if(_<I&&(y=u,I=_),_===0)break}v.set(`${s.group}-${s.name}`,y),p.push(x(y))}return v},te=k.lazy(()=>B(()=>import("./StackRadar-nnrSyuLa.js"),__vite__mapDeps([0,1,2,3,4,5,6]))),D=[.22,1,.36,1],W="repeating-linear-gradient(90deg, #000 0, #000 calc(5% - 2px), transparent calc(5% - 2px), transparent 5%)",se=(()=>{let t=23;const n=()=>(t=t*16807%2147483647,(t-1)/2147483646);return Array.from({length:34},()=>{const d=(n()*100).toFixed(1),i=(n()*100).toFixed(1),m=n()<.2?1.4:.9,o=(.2+n()*.45).toFixed(2);return`radial-gradient(${m}px ${m}px at ${d}% ${i}%, rgba(255,255,255,${o}), transparent)`}).join(", ")})(),ne=({skill:t,token:n,delay:d,still:i})=>e.jsxs("li",{children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-4",children:[e.jsx("span",{className:"text-sm font-medium text-foreground
2/90",children:t.name}),e.jsxs("span",{className:"font-mono text-xs tabular-nums text-muted-foreground",children:[t.level,"%"]})]}),e.jsx("div",{className:"relative mt-2 h-2 overflow-hidden",style:{maskImage:W,WebkitMaskImage:W,background:"hsl(var(--foreground) / 0.1)"},role:"meter","aria-label":`${t.name} proficiency`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":t.level,children:e.jsx(P.span,{className:"absolute inset-0 origin-left",style:{background:`hsl(var(${n}))`},initial:{scaleX:i?t.level/100:0},animate:{scaleX:t.level/100},transition:{duration:i?0:.9,ease:D,delay:i?0:d}})})]}),re=()=>{const[t,n]=k.useState("Mobile"),[d,i]=k.useState(null),[m,o]=k.useState(!1),p=k.useRef(null),h=$(p,{margin:"80px 0px"}),v=$(p,{once:!0,amount:.3}),b=U()??!1,s=G("(max-width: 640px)"),r=d??(m?t:null),l=A(d??t),w=l.skills.length?l.skills:l.radar,g=a=>{i(a),a&&o(!0)},j=a=>{n(a),o(!0)};return e.jsx("section",{id:"skills",className:"relative py-28 md:py-36",children:e.jsxs("div",{className:"relative z-10 mx-auto max-w-[1400px] px-5 md:px-10",children:[e.jsx(V,{eyebrow:"Stack · Tech radar",title:"The stack behind the",accent:"products.",description:`${Q} tools plotted by proficiency: the closer to the core, the stronger. Hover or tap a group to light up its sector.`}),e.jsxs("div",{className:"grid items-start gap-8 lg:grid-cols-12 lg:gap-12",children:[e.jsxs(P.div,{ref:p,role:"group","aria-label":"Tech radar","data-paused":!h,className:"relative mx-auto w-full max-w-[640px] overflow-hidden rounded-[32px] border border-white/10 bg-black p-3 shadow-[0_40px_100px_-50px_rgba(76,29,149,0.7)] sm:p-6 lg:col-span-7 lg:max-w-none",initial:{opacity:0,y:40},whileInView:{opacity:1,y:0},viewport:{once:!0,margin:"0px 0px -10% 0px"},transition:{duration:.9,ease:D},children:[e.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 opacity-90",style:{backgroundImage:se}}),e.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0",style:{background:"radial-gradient(circle at 50% 46%, rgba(139,110,214,0.2), transparent 55%)"}}),e.jsx("div",{className:"relative mx-auto aspect-square w-full max-w-[600px]",children:e.jsx(k.Suspense,{fallback:null,children:e.jsx(te,{highlight:r,revealed:v,compact:s,onHover:g,onSelect:j})})}),e.jsxs("p",{className:"relative mt-1 text-center font-mono text-[10px] uppercase tracking-[0.2em] text-white/45 sm:mt-2 sm:text-[11px]",children:[e.jsx("span",{className:"whitespace-nowrap",children:"Core = strongest"})," ·"," ",e.jsx("span",{className:"whitespace-nowrap",children:"Rings at 90 / 80 / 70"})]}),e.jsx("div",{className:"sr-only",children:S.map(a=>e.jsx("ul",{"aria-label":`${a.title} on the radar`,children:a.radar.map(c=>e.jsxs("li",{children:[c.name,": ",c.level," percent"]},c.name))},a.id))})]}),e.jsxs("div",{className:"min-w-0 lg:col-span-5",children:[e.jsx("ul",{className:"scrollbar-hide -mx-5 flex gap-2 overflow-x-auto px-5 pb-1 lg:mx-0 lg:flex-col lg:gap-2 lg:overflow-visible lg:px-0","aria-label":"Skill groups",onPointerLeave:()=>i(null),children:S.map(a=>{const c=t===a.id,x=r===a.id,y=a.skills.length||a.radar.length;return e.jsx("li",{className:"shrink-0",children:e.jsxs("button",{type:"button","aria-pressed":c,onPointerEnter:I=>I.pointerType==="mouse"&&g(a.id),onFocus:()=>g(a.id),onBlur:()=>i(null),onClick:()=>j(a.id),className:"group flex w-full items-center gap-3 rounded-full border px-4 py-2 text-left outline-none transition-[background-color,border-color,opacity] duration-300 focus-visible:ring-2 focus-visible:ring-primary lg:rounded-2xl lg:px-5 lg:py-3.5",style:{borderColor:c||x?`hsl(var(${a.token}) / 0.55)`:"hsl(var(--border) / 0.8)",background:c||x?`hsl(var(${a.token}) / 0.1)`:"hsl(var(--card) / 0.5)",opacity:r!==null&&!x&&!c?.6:1},children:[e.jsx("span",{className:"h-2.5 w-2.5 shrink-0 rounded-full",style:{background:`hsl(var(${a.token}))`}}),e.jsx("span",{className:"whitespace-nowrap font-display text-base font-semibold tracking-[-0.02em] text-foreground lg:text-xl",children:a.title}),e.jsxs("span",{className:"ml-auto hidden font-mono text-[11px] uppercase tracking-[0.16em] text-muted-foreground lg:inline",children:[y," skills"]})]})},a.id)})}),e.jsxs("div",{className:"relative mt-4 min-h-[21rem] overflow-hidden rounded-[28px] border border-border/70 bg-card/60 p-6 md:p-7",children:[e.jsx("span",{"aria-hidden":!0,
2className:"absolute inset-x-0 top-0 h-px transition-colors duration-500",style:{background:`linear-gradient(90deg, transparent, hsl(var(${l.token}) / 0.8), transparent)`}}),e.jsx(H,{mode:"wait",initial:!1,children:e.jsxs(P.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0,y:-6,transition:{duration:.12}},transition:{duration:.25,ease:D},children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-4",children:[e.jsx("h3",{className:"font-display text-2xl font-semibold tracking-[-0.03em] text-foreground md:text-3xl",children:l.title}),e.jsxs("span",{className:"font-mono text-[11px] uppercase tracking-[0.16em] text-muted-foreground",children:[l.radar.length," on the radar"]})]}),e.jsx("ul",{className:"mt-6 space-y-4",children:w.map((a,c)=>e.jsx(ne,{skill:a,token:l.token,delay:.05+c*.07,still:b},a.name))}),l.skills.length>0&&e.jsxs("div",{className:"mt-6 flex flex-wrap items-center gap-1.5",children:[e.jsx("span",{className:"mr-1 font-mono text-[10px] uppercase tracking-[0.16em] text-muted-foreground",children:"On the radar"}),l.radar.map(a=>e.jsxs("span",{className:"rounded-full border border-border/70 bg-secondary/50 px-2.5 py-1 text-xs text-secondary-foreground",children:[a.name,e.jsx("span",{className:"ml-1.5 font-mono text-[10px] text-muted-foreground",children:a.level})]},a.name))]})]},l.id)})]})]})]}),e.jsxs("div",{className:"mt-14 flex flex-col items-center gap-5",children:[e.jsx("p",{className:"eyebrow",children:r?e.jsxs(e.Fragment,{children:["Toolbox · ",e.jsx("span",{style:{color:`hsl(var(${A(r).token}))`},children:A(r).title})]}):"Also in the toolbox"}),e.jsx("ul",{className:"flex max-w-4xl flex-wrap justify-center gap-2","aria-label":"Toolbox",children:K.map(a=>{const c=A(a.group).token,x=r===a.group,y=r!==null&&!x;return e.jsx("li",{children:e.jsx("span",{className:"inline-block rounded-full border px-3.5 py-1.5 font-mono text-xs transition-[opacity,transform,background-color,border-color,color] duration-300",style:{opacity:y?.3:1,transform:x?"translateY(-2px)":void 0,borderColor:x?`hsl(var(${c}) / 0.6)`:"hsl(var(--border))",color:x?`hsl(var(${c}))`:void 0,background:x?`hsl(var(${c}) / 0.1)`:"hsl(var(--secondary) / 0.5)"},children:a.name})},a.name)})})]})]})})},he=Object.freeze(Object.defineProperty({__proto__:null,default:re},Symbol.toStringTag,{value:"Module"}));export{xe as A,f as C,ee as L,de as R,ce as S,pe as W,J as a,F as b,T as c,M as d,Q as e,me as f,A as g,he as h,ue as p,q as r,z as s};
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.