From 3b62606c8345f9bc1f4cd8d4ac24177ec5b8ee40 Mon Sep 17 00:00:00 2001 From: Khoa Vo Date: Sun, 19 Apr 2026 11:12:08 +0700 Subject: [PATCH] Update URLs to khoavo.myds.me --- .../{index-BMqp2sSM.js => index-CrIGQTVu.js} | 2 +- dist/assets/index-DRsd1fIf.js | 133 ------------------ dist/assets/index-zJ5r8A23.css | 1 - dist/index.html | 2 +- src/App.jsx | 26 ++-- src/PrintPortfolio.jsx | 2 +- 6 files changed, 16 insertions(+), 150 deletions(-) rename dist/assets/{index-BMqp2sSM.js => index-CrIGQTVu.js} (91%) delete mode 100644 dist/assets/index-DRsd1fIf.js delete mode 100644 dist/assets/index-zJ5r8A23.css diff --git a/dist/assets/index-BMqp2sSM.js b/dist/assets/index-CrIGQTVu.js similarity index 91% rename from dist/assets/index-BMqp2sSM.js rename to dist/assets/index-CrIGQTVu.js index 57aa9f6..8f38ac2 100644 --- a/dist/assets/index-BMqp2sSM.js +++ b/dist/assets/index-CrIGQTVu.js @@ -125,7 +125,7 @@ Error generating stack: `+c.message+` * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const eu=Ct("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]),en={name:"VO NGUYEN DANG KHOA",title:"AI CREATIVE LEAD & SOFTWARE DEVELOPER",dob:"19/01/1993",phone:"0398300340",email:"vonguyendangkhoa@gmail.com",location:"Ho Chi Minh City, Vietnam",portfolio:"cv.khoavo.myds.me",github:"git.khoavo.myds.me/vndangkhoa",summary:"Highly accomplished Creative Leader bridging the gap between artistic direction and high-performance software engineering. With over 9+ years managing brand strategies and digital design, I evaluate and execute technology-driven projects from concept to production. Specialized in merging traditional creative direction with cutting-edge generative AI workflows (ComfyUI, FLUX) and full-stack development (Go, React)."},nS=[{period:"12/2012 - 06/2016",school:"RMIT Vietnam",degree:"Bachelor of Multimedia System Design (Graduated with Excellence)"}],rS=[{category:"Creative & AI Tools",items:"Adobe Creative Suite (Ps, Ai, Id, Pr), ComfyUI, Stable Diffusion, FLUX, Ollama, 3D Animation, Motion Graphics"},{category:"Development Stack",items:"React, Next.js, Go (Gin), Rust (Axum), Python (FastAPI), TypeScript, Tailwind CSS"},{category:"Infrastructure",items:"Docker, SQLite, Synology NAS Deployment, HLS Video Streaming"},{category:"Leadership",items:"Cross-Functional Management, Creative Strategy, Technical Mentorship, Process Optimization"}],iS=[{role:"AI Creative Lead",company:"Phibious Viet Nam",period:"06/2024 - Present",highlights:["Manage highly complex, technology-driven creative projects, merging traditional design with advanced generative AI models and data analytics.","Deploy and utilize ComfyUI, Stable Diffusion, FLUX, and local LLMs (Ollama, LM Studio) to augment design workflows and drive overarching agency strategies.","Lead cross-functional collaboration between traditional designers, copywriters, and data analysts to ensure measurable campaign performance.","Optimize internal design processes by integrating advanced image generation pipelines into daily operations.","Train and mentor the broader agency (including interns) on core AI design competencies and prompt engineering."]},{role:"eCOM Design Lead",company:"Procter & Gamble (P&G) Vietnam",period:"09/2023 - 06/2025",highlights:["Spearheaded strategic design concepts and visual strategies for e-commerce, directly impacting consumer engagement and online sales for Hair Care brands.","Managed end-to-end medium-to-large design projects, actively improving internal design processes and ensuring strict corporate standard compliance.","Collaborated globally across functional geographic boundaries and cross-functional teams to deliver cohesive brand stories."]},{role:"ECOM Graphic Designer (ABM)",company:"P&G Viet Nam",period:"11/2020 - 09/2023",highlights:["Built concepts and executed visual strategy across vast consumer touchpoints including packaging, eCommerce, and social media under the Hair Care Packaging Design Studio.","Leveraged hands-on design mastery to craft illustrations and brand expressions that consistently met high commercial demands.","Ensured brand guidelines and directives were embraced consistently and creatively across all regional platforms."]},{role:"Production Creative Lead",company:"Inn Saigon",period:"12/2019 - 11/2020",highlights:["Led the photography and production team, setting the standard for internal branding deliverables (Food, Product, Events).","Managed project budgets, retouching workflows, and cross-team communications to deliver high-volume outcomes.","Conducted frequent feedback sessions to boost performance and facilitate the development of team members."]},{role:"Regional Head of Design",company:"ASIAMARINE",period:"12/2018 - 12/2019",highlights:["Supervised all creation of concepts and layouts across digital/offline marketing for luxury marine sectors.","Managed independent contractors and junior designers, leveraging creative marketing to develop targeted campaigns."]},{role:"Senior Graphic Designer",company:"EMG",period:"12/2017 - 12/2018",highlights:["Created outstanding digital and print designs, managing corporate identity, merchandise, and digital displays.","Assisted with concept proposals to clients including mockup preparations and asset sourcing."]},{role:"Graphic Artist",company:"Le Meridien Saigon",period:"12/2016 - 12/2017",highlights:["Designed and executed all promotional collateral according to strict Le Meridien brand identity guidelines.","Liaised with external suppliers to ensure creative print quality and deadlines were consistently met."]},{role:"Animation Designer",company:"Adidas Group",period:"06/2016 - 12/2016",highlights:["Developed graphics and animations for production environment simulations (Line Balancing, One Pair Flow).","Compiled and edited video infographics for visual training purposes."]}],sS=[{name:"KV-Tube",tech:"Go (Gin), Next.js, SQLite, Docker, HLS.js",desc:"YouTube-like video streaming platform with HLS support, subscriptions, and Synology NAS deployment."},{name:"Spotify Clone",tech:"React, Rust (Axum), YouTube API",desc:"Full-featured music player with real-time lyrics and custom playlists."},{name:"APIx (kv-pix)",tech:"Next.js 14, TypeScript, Prisma",desc:"AI Image Generator powered by multiple providers (Grok, Meta, Whisk)."}],oS=[{name:"Dung Bui",title:"Senior Manager",company:"Adidas Group",contact:"dung.bui@adidas-group.com"},{name:"Wouter Pasman",title:"Graphic Designer",company:"FreshStudio.vn",contact:"0908074383"},{name:"Tran Nhuan Vu",title:"Marketing Mgr",company:"Element Mgmt",contact:"Vu.tran@element.vn"}],Ee={pageContainer:{width:"210mm",padding:"14mm 16mm",background:"#ffffff",fontFamily:"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",color:"#000000",fontSize:"9pt",lineHeight:"1.5",margin:"0 auto"},header:{borderBottom:"2px solid #000",paddingBottom:"4mm",marginBottom:"4mm"},name:{fontSize:"25pt",fontWeight:900,letterSpacing:"-0.02em",margin:"0 0 4px 0",lineHeight:"1"},title:{fontSize:"11pt",fontWeight:600,color:"#333",margin:"0 0 4mm 0",letterSpacing:"0.05em"},infoGrid:{display:"flex",flexWrap:"wrap",gap:"3mm 8mm",fontSize:"8pt",color:"#444"},sectionTitle:{fontSize:"11pt",fontWeight:800,textTransform:"uppercase",letterSpacing:"0.05em",borderBottom:"1px solid #ccc",paddingBottom:"1.5mm",margin:"5mm 0 3mm 0",color:"#000"},summary:{fontSize:"9pt",lineHeight:"1.5",margin:"0 0 4mm 0",textAlign:"justify"},skillGrid:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"2mm 5mm",marginBottom:"3mm"},experienceItem:{marginBottom:"4mm"},expHeader:{display:"flex",justifyContent:"space-between",alignItems:"baseline",marginBottom:"1.5mm"},expRole:{fontSize:"10pt",fontWeight:700,margin:0},expCompany:{fontWeight:600,color:"#333"},expPeriod:{fontSize:"8pt",color:"#555",fontWeight:600},expList:{margin:"0",paddingLeft:"5mm"},expBullet:{marginBottom:"1mm",textAlign:"justify"},projectItem:{marginBottom:"2.5mm"},projectHeader:{fontWeight:700,fontSize:"9.5pt"},projectTech:{fontSize:"7.5pt",color:"#555",fontFamily:"monospace",marginLeft:"2mm"},refGrid:{display:"flex",justifyContent:"space-between",fontSize:"8pt",marginTop:"2mm"}};function aS(){return m.jsxs("div",{style:Ee.pageContainer,children:[m.jsxs("div",{style:Ee.header,children:[m.jsx("h1",{style:Ee.name,children:en.name}),m.jsx("div",{style:Ee.title,children:en.title}),m.jsxs("div",{style:Ee.infoGrid,children:[m.jsxs("span",{children:[m.jsx("strong",{children:"Email:"})," ",en.email]}),m.jsxs("span",{children:[m.jsx("strong",{children:"Phone:"})," ",en.phone]}),m.jsxs("span",{children:[m.jsx("strong",{children:"Location:"})," ",en.location]}),m.jsxs("span",{children:[m.jsx("strong",{children:"Portfolio:"})," ",en.portfolio]}),m.jsxs("span",{children:[m.jsx("strong",{children:"GitHub:"})," ",en.github]}),m.jsxs("span",{children:[m.jsx("strong",{children:"DOB:"})," ",en.dob]})]})]}),m.jsx("p",{style:Ee.summary,children:en.summary}),m.jsx("h2",{style:Ee.sectionTitle,children:"Core Competencies"}),m.jsx("div",{style:Ee.skillGrid,children:rS.map((n,r)=>m.jsxs("div",{children:[m.jsx("strong",{style:{display:"block",fontSize:"9pt",marginBottom:"1mm"},children:n.category}),m.jsx("span",{style:{fontSize:"8.5pt",color:"#333"},children:n.items})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"Work Experience"}),m.jsx("div",{children:iS.map((n,r)=>m.jsxs("div",{style:Ee.experienceItem,children:[m.jsxs("div",{style:Ee.expHeader,children:[m.jsxs("h3",{style:Ee.expRole,children:[n.role," ",m.jsx("span",{style:{fontWeight:400},children:"at"})," ",m.jsx("span",{style:Ee.expCompany,children:n.company})]}),m.jsx("span",{style:Ee.expPeriod,children:n.period})]}),m.jsx("ul",{style:Ee.expList,children:n.highlights.map((s,a)=>m.jsx("li",{style:Ee.expBullet,children:s},a))})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"Software Engineering Projects"}),m.jsx("div",{children:sS.map((n,r)=>m.jsxs("div",{style:Ee.projectItem,children:[m.jsx("span",{style:Ee.projectHeader,children:n.name}),m.jsxs("span",{style:Ee.projectTech,children:["[",n.tech,"]"]}),m.jsx("span",{style:{display:"block",fontSize:"8.5pt",color:"#333",marginTop:"1mm"},children:n.desc})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"Education"}),m.jsx("div",{style:{marginBottom:"6mm"},children:nS.map((n,r)=>m.jsxs("div",{style:{display:"flex",justifyContent:"space-between"},children:[m.jsx("strong",{children:n.school}),m.jsx("span",{children:n.degree}),m.jsx("span",{style:Ee.expPeriod,children:n.period})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"References"}),m.jsx("div",{style:Ee.refGrid,children:oS.map((n,r)=>m.jsxs("div",{children:[m.jsx("strong",{children:n.name}),m.jsx("br",{}),m.jsxs("span",{style:{color:"#555"},children:[n.title,", ",n.company]}),m.jsx("br",{}),m.jsx("span",{children:n.contact})]},r))})]})}const Ut={name:"Vo Nguyen Dang Khoa",phone:"0398300340",email:"vonguyendangkhoa@gmail.com",location:"Ho Chi Minh City, Vietnam",linkedin:"https://www.linkedin.com/in/khoa-vo-76291236/",portfolio:"https://cv.khoavo.myds.me/"},Bt={title:"AI Creative Lead & Motion Designer",summary:"Visionary Creative Leader with 9+ years of expertise bridging brand strategy, digital design, motion graphics, and cutting-edge generative AI. Currently pioneering AI-augmented creative workflows at Phibious, merging traditional art direction with ComfyUI, Stable Diffusion, and FLUX to redefine what's possible in visual storytelling. Previously led eCommerce design at P&G, shaping digital experiences for millions of consumers across Southeast Asia.",tagline:"Where Design Meets Intelligence",skills:[{category:"AI & Generative Design",items:["ComfyUI","Stable Diffusion","FLUX","Midjourney","RunwayML","Ollama","LM Studio","LoRA Training","ControlNet","IP-Adapter"]},{category:"Design & Creative Tools",items:["Adobe Creative Suite","Figma","After Effects","Premiere Pro","Cinema 4D","Blender","Photoshop","Illustrator","InDesign"]},{category:"Motion & Animation",items:["Motion Graphics","3D Animation","Kinetic Typography","Visual Effects","Character Animation","Storyboarding"]},{category:"Brand & Strategy",items:["Brand Identity","Art Direction","Visual Storytelling","Editorial Design","Packaging Design","Strategic Design"]}],projects:[{id:1,title:"The Language of Poetry & Literature",category:"AI Generated Art",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2025/08/i2i_1756355661_62547902.png",description:"Exploring the ethereal boundary between reality and imagination through AI-generated visuals. Created with Stable Diffusion, ComfyUI, and custom LoRA training to capture the intangible essence of poetic imagery.",link:"https://portfolio.khoavo.myds.me/2025/08/28/the-language-of-poetry-and-literature/",year:"2025"},{id:2,title:"Delux Perfume – Fineline 2025 Launch",category:"AI Branding & Video",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2025/08/Delux-Perfume_red.png",description:"End-to-end creative strategy and art direction for premium perfume launch. From AI-generated mood boards and product visuals to cinematic video production, creating a cohesive brand narrative for Southeast Asia market.",link:"https://portfolio.khoavo.myds.me/2025/08/11/giving-art-direction-to-a-brand-a-case-study/",year:"2025"},{id:3,title:"AI Studio Photography",category:"AI-Generated Branding",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2025/07/img_0317.jpg",description:"Revolutionary approach to professional studio photography using AI. ComfyUI workflows with custom LoRA to generate studio-quality product and portrait images, reducing production costs by 70%.",link:"https://portfolio.khoavo.myds.me/2025/07/27/%F0%9F%A7%A0%F0%9F%93%B8-ai-studio-i-can-do-that-too/",year:"2025"},{id:4,title:"NAVIGATOR – ASIAMARINE Magazine",category:"Editorial Design",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2020/10/navigator-vol1_page_001.webp",description:"Complete editorial design for Vietnam's premier yacht market publication. Art direction, layout design, and visual storytelling for a luxury marine sector brand reaching high-net-worth readers across Asia.",link:"https://portfolio.khoavo.myds.me/2020/10/20/navigator/",year:"2020"},{id:5,title:"PetroVietnam – PCT Corporate Identity",category:"Brand Identity & 3D",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2017/04/cip_mockup2.png",description:"Comprehensive corporate identity for PetroVietnam Transportation. 3D vehicle visualization, logo design, stationery system, and POSM materials creating a cohesive national brand presence.",link:"https://portfolio.khoavo.myds.me/2017/04/10/petrovietnam-pct/",year:"2017"},{id:6,title:"Skyxx – Animated Poster Series",category:"Motion Graphics",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2019/04/aash-3-scaled.jpg",description:"Award-winning weekly animated poster series for entertainment events. Dynamic motion graphics with 3D elements, pushing creative boundaries under tight deadlines while maintaining exceptional quality.",link:"https://portfolio.khoavo.myds.me/2019/02/17/skyxx-poster-animation/",year:"2019"}],experience:[{role:"AI Creative Lead",company:"Phibious Vietnam",period:"2025 - Present",location:"Ho Chi Minh City",highlights:["Spearhead the integration of generative AI (ComfyUI, Stable Diffusion, FLUX) into creative workflows, reducing production time by 50%","Lead cross-functional teams of designers, copywriters, and data analysts to deliver technology-driven creative campaigns","Developed proprietary AI tools for mood boarding, concept visualization, and rapid prototyping","Created AI-augmented design concepts for digital and physical platforms serving Fortune 500 clients"]},{role:"eCommerce Design Lead",company:"Procter & Gamble (P&G)",period:"2020 - 2025",location:"Ho Chi Minh City",highlights:["Led visual strategy for eCommerce platforms across Hair Care category, directly impacting millions of consumers in SEA","Managed end-to-end design projects from concept to execution, aligning with global marketing strategies","Spearheaded the digital transformation of brand assets for omnichannel retail experiences","Mentored junior designers and established design standards adopted across the regional team"]},{role:"Production Creative Lead",company:"INN SaiGon",period:"Dec 2019 - Nov 2020",location:"Ho Chi Minh City",highlights:["Directed photography production for food, product, and event projects with 30+ client accounts","Established comprehensive brand guidelines and visual standards ensuring consistency across deliverables","Optimized post-production workflows, reducing turnaround time by 40%"]},{role:"Regional Head of Design",company:"ASIAMARINE",period:"2018 - 2019",location:"Ho Chi Minh City",highlights:["Led design team creating digital marketing assets, web graphics, and editorial content for luxury yacht brand","Delegated projects to junior designers while maintaining quality control and brand consistency","Collaborated with international teams to localize content for Asian markets"]},{role:"Senior Graphic Designer",company:"EMG - Element Management Group",period:"2017 - 2018",location:"Ho Chi Minh City",highlights:["Created impactful designs for print and digital campaigns for global luxury and lifestyle brands","Expert in photo sourcing, advanced image retouching, and brand identity development","Delivered corporate identity packages for multinational clients"]}],awards:[{title:"Best Digital Campaign",year:"2024",organization:"P&G SEA Digital Awards"},{title:"Outstanding Art Direction",year:"2019",organization:"Vietnam Design Awards"}]},yr={summary:"9-month intensive coding journey from zero to production. Built 5+ deployed applications including video streaming platforms, AI image generators, and music players. Proficient in modern web frameworks, containerization, and cloud deployment. Self-taught developer with a creative background bringing unique problem-solving perspective.",journey:[{month:"MAY '24",title:"The Spark",description:"First deep dive into Next.js. Abandoned manual CSS for Tailwind efficiency."},{month:"JUL '24",title:"First Production App",description:"Built kv-pix AI image generator with multi-provider support (Google Whisk, Meta AI, Grok)."},{month:"SEP '24",title:"Full-Stack Mastery",description:"Created KV-Tube YouTube platform with Go backend + Next.js. Dockerized for Synology NAS."},{month:"NOV '24",title:"The AI Pivot",description:"Fully embraced AI coding. Cursor and v0 became primary development engine."},{month:"DEC '24",title:"Rust Exploration",description:"Built Spotify clone with Rust Axum backend. Advanced system architecture."},{month:"PRESENT",title:"Vibe Ascended",description:"Building complex apps through high-level prompting and intuition."}],skills:{languages:["TypeScript","JavaScript","Go","Rust","Python","HTML/CSS","SQL"],frontend:["React","Next.js","Vite","Tailwind CSS","Shadcn","Framer Motion","Zustand","PWA"],backend:["Node.js","Go (Gin)","Rust (Axum)","Express","REST APIs","WebSocket"],ai:["LLM Integration","Cursor AI","v0","Replit AI","Ollama","Prompt Engineering","Multi-Provider AI APIs"],devops:["Docker","Docker Compose","GitHub Actions","Forgejo CI/CD","Synology NAS","Nginx","SQLite"],tools:["Git","VS Code","Figma","Postman","MongoDB","Prisma","ffmpeg"]},projects:[{name:"KV-Tube",description:"YouTube-like video streaming platform with HLS support, subscriptions, watch history, and PWA. Deployed on Synology NAS via Docker.",tech:["Go (Gin)","Next.js","TypeScript","SQLite","Docker","HLS.js","PWA"],github:"https://git.khoavo.myds.me/vndangkhoa/kv-tube"},{name:"Spotify Clone",description:"Full-featured Spotify-like music player with YouTube Music integration, real-time lyrics, custom playlists, and PWA support.",tech:["React (Vite)","Rust (Axum)","TailwindCSS","YouTube API","PWA"],github:"https://git.khoavo.myds.me/vndangkhoa/spotify-clone"},{name:"kv-pix (APIx)",description:"AI Image Generator powered by Google Whisk, Meta AI, and Grok. Multi-provider support with prompt library and history.",tech:["Next.js 14","TypeScript","Tailwind","Zustand","Docker"],github:"https://git.khoavo.myds.me/vndangkhoa/apix"},{name:"IT CV Portfolio",description:"This terminal-style interactive resume with typing animations and system aesthetics.",tech:["React","Vite","Tailwind","Framer Motion","TypeScript"],github:"https://git.khoavo.myds.me/vndangkhoa/it-cv"},{name:"kv-tiktok-download",description:"Douyin/TikTok video download API with batch processing support.",tech:["Python","FastAPI","yt-dlp"],github:"https://git.khoavo.myds.me/vndangkhoa/kv-tiktok-download"}],experience:[{role:"Creative Technology",company:"Phibious Vietnam",period:"2025 - Present",highlights:["Bridge between creative and technical teams","Develop interactive prototypes and AI-powered tools","Automate creative workflows with custom scripts","Build internal tools for design team productivity"]},{role:"Freelance Developer",company:"Self-Employed",period:"2024 - Present",highlights:["Built 5+ production web applications deployed on cloud and NAS","Integrated AI capabilities (image generation, video processing) into client solutions","Implemented CI/CD pipelines with GitHub/Forgejo Actions","Dockerized applications for easy deployment on various platforms"]}],forgejo:"https://git.khoavo.myds.me/vndangkhoa"},Hm=({size:n=36,vnColor:r="#1A1A1A",dkColor:s="#00FF94",className:a=""})=>m.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 100 100",width:n,height:n,fill:"none",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[m.jsx("path",{stroke:r,d:"M 15 25 L 30 45 L 45 25"}),m.jsx("path",{stroke:r,d:"M 55 45 L 55 25 L 85 45 L 85 25"}),m.jsx("path",{stroke:s,d:"M 15 55 L 30 55 A 10 10 0 0 1 30 75 L 15 75 Z"}),m.jsx("path",{stroke:s,d:"M 55 55 L 55 75 M 85 55 L 55 65 L 85 75"})]}),lS=({onSelect:n})=>{const[r,s]=_.useState(!1);return m.jsxs(pe.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0,y:-50},className:"fixed inset-0 overflow-hidden bg-[#FAFAFA]",children:[m.jsxs("div",{className:"relative w-full h-full flex flex-col items-center justify-center px-6",children:[m.jsxs("div",{className:"absolute inset-0 z-0",children:[m.jsx("div",{className:"absolute top-[-10%] left-[-10%] w-[40%] h-[40%] rounded-full bg-slate-100 blur-[120px] opacity-60 animate-pulse"}),m.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] w-[40%] h-[40%] rounded-full bg-slate-200 blur-[120px] opacity-60 animate-pulse",style:{animationDelay:"2s"}})]}),m.jsx("div",{className:"absolute inset-0 opacity-[0.03] bg-[linear-gradient(rgba(0,0,0,0.1)_1px,transparent_1px),linear-gradient(90deg,rgba(0,0,0,0.1)_1px,transparent_1px)] bg-[size:60px_60px]"}),m.jsx("div",{className:"relative z-10 max-w-5xl w-full text-center",children:m.jsxs(pe.div,{initial:{y:30,opacity:0},animate:{y:0,opacity:1},transition:{duration:1,ease:[.22,1,.36,1]},children:[m.jsx("div",{className:"overflow-hidden mb-4 py-2 px-4",children:m.jsx(pe.h1,{initial:{y:"100%"},animate:{y:0},transition:{duration:1.2,ease:[.22,1,.36,1],delay:.2},className:"text-[clamp(2rem,6.5vw,7.5rem)] font-serif font-bold text-[#1A1A1A] tracking-tighter leading-tight whitespace-nowrap",style:{textShadow:"0 2px 4px rgba(0,0,0,0.02)"},children:"Vo Nguyen Dang Khoa"})}),m.jsx(pe.p,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},transition:{duration:.8,delay:.8},className:"text-lg md:text-2xl font-serif text-[#1A1A1A]/70 mb-2 italic",children:"Where Design Meets Intelligence"}),m.jsx(pe.p,{initial:{opacity:0},animate:{opacity:1},transition:{duration:.8,delay:1},className:"text-[10px] font-bold tracking-[0.4em] text-[#1A1A1A]/30 uppercase mb-10 md:mb-12",children:"AI Creative Lead & Motion Designer"}),m.jsxs("button",{onClick:()=>n("creative"),className:"hidden md:inline-flex items-center gap-3 px-10 py-5 bg-[#1A1A1A] text-white text-lg font-medium rounded-full hover:bg-black hover:scale-105 transition-all shadow-2xl border-4 border-transparent hover:border-black/5",children:["Explore Portfolio",m.jsx(pe.div,{animate:{x:[0,5,0]},transition:{repeat:1/0,duration:1.5,ease:"easeInOut"},children:m.jsx(kr,{size:22})})]}),m.jsxs("div",{className:"md:hidden flex flex-col gap-4 mt-8",children:[m.jsxs("button",{onClick:()=>n("creative"),className:"flex items-center justify-between px-6 py-5 bg-[#1A1A1A] text-white font-medium rounded-2xl shadow-xl active:scale-[0.98] transition-transform",children:[m.jsxs("span",{className:"flex items-center gap-3",children:[m.jsx(lo,{size:18})," Creative Portfolio"]}),m.jsx(kr,{size:18})]}),m.jsxs("button",{onClick:()=>n("it"),className:"flex items-center justify-between px-6 py-5 border border-[#1A1A1A]/10 text-[#1A1A1A] font-medium rounded-2xl bg-white/50 backdrop-blur-md shadow-sm active:scale-[0.98] transition-transform",children:[m.jsxs("span",{className:"flex items-center gap-3",children:[m.jsx(eu,{size:18})," Developer Side"]}),m.jsx(kr,{size:18})]}),m.jsx("p",{className:"text-[10px] tracking-widest text-[#999] uppercase mt-2 opacity-60",children:"Select a persona to enter"})]})]})}),m.jsx(pe.div,{initial:{opacity:.5},animate:{opacity:r?0:.5},className:"absolute bottom-12 text-sm text-[#BBB] hidden md:block",children:m.jsxs("span",{className:"flex items-center gap-4",children:[m.jsx("span",{className:"w-12 h-px bg-[#BBB]"}),"Hover right to preview Developer side",m.jsx("span",{className:"w-12 h-px bg-[#BBB]"})]})})]}),m.jsxs(pe.div,{className:"absolute inset-y-0 right-0 w-full md:w-[75%] bg-[#0a0a0a] cursor-pointer hidden md:block z-40 border-l border-[#00FF94]/30",initial:{x:"calc(100% - 60px)"},animate:{x:r?"0%":"calc(100% - 60px)"},transition:{duration:.6,ease:[.22,1,.36,1]},onMouseEnter:()=>s(!0),onMouseLeave:()=>s(!1),onClick:()=>n("it"),children:[!r&&m.jsx(pe.div,{initial:{opacity:0},animate:{opacity:1},className:"absolute left-0 inset-y-0 w-[60px] flex items-center justify-center pointer-events-none",children:m.jsx("span",{className:"rotate-90 text-[10px] tracking-[0.5em] text-[#00FF94]/40 font-mono whitespace-nowrap",children:"DEVELOPER SIDE // PREVIEW"})}),m.jsx("div",{className:"absolute inset-0 opacity-[0.04] bg-[linear-gradient(rgba(0,255,136,0.1)_1px,transparent_1px),linear-gradient(90deg,rgba(0,255,136,0.1)_1px,transparent_1px)] bg-[size:25px_25px]"}),m.jsx("div",{className:"relative z-10 w-full h-full flex flex-col items-center justify-center px-8",children:m.jsxs("div",{className:"max-w-md text-center",children:[m.jsx(eu,{size:56,className:"text-[#00FF94] mx-auto mb-6"}),m.jsx("h2",{className:"text-4xl md:text-5xl font-bold text-white font-mono mb-2",children:"DEVELOPER"}),m.jsx("p",{className:"text-[#00FF94]/70 font-mono text-sm tracking-[0.3em] mb-8",children:"FULL-STACK & DEVOPS"}),m.jsxs("p",{className:"text-slate-400 font-mono text-base mb-8 leading-relaxed",children:["9-month coding journey.",m.jsx("br",{}),"Built 5+ production applications.",m.jsx("br",{}),"Self-taught with AI-powered development."]}),m.jsxs("button",{className:"inline-flex items-center gap-2 px-8 py-4 border-2 border-[#00FF94]/40 bg-[#00FF94]/10 text-[#00FF94] font-mono text-base rounded-full hover:bg-[#00FF94]/20 transition-colors",children:["Enter Terminal ",m.jsx(kr,{size:18})]}),m.jsxs("div",{className:"mt-10 font-mono text-sm text-[#00FF94]/40 text-left space-y-2",children:[m.jsxs("div",{children:[m.jsx("span",{className:"text-[#00D9FF]",children:"const"}),' stack = ["Go", "Rust", "TS"];']}),m.jsxs("div",{children:[m.jsx("span",{className:"text-[#00D9FF]",children:"const"})," deployed = 5;"]}),m.jsxs("div",{children:[m.jsx("span",{className:"text-[#00D9FF]",children:"const"}),' vibe = "S-Tier";']})]})]})})]}),m.jsx(pe.div,{initial:{opacity:0},animate:{opacity:r?0:1},transition:{duration:.4},className:"absolute top-8 left-6 md:left-8 z-50 text-[10px] md:text-lg",children:m.jsxs("div",{className:"text-[#1A1A1A] font-serif font-bold tracking-widest flex items-center gap-2",children:["KHOA.VO ",m.jsx("span",{className:"w-4 md:w-8 h-px bg-[#1A1A1A]/30"})]})})]})},uS=({onComplete:n})=>{const r=_.useRef(null);return _.useEffect(()=>{const s=window.innerWidth,a=window.innerHeight,u=Math.floor(s/8)+5,f=Math.floor(a/10)+5;let d=0;const h=()=>{d+=.08;let y="";for(let v=0;v1.5?y+="V":C>.8?y+="N":C>.2?y+="D":C>-.2?y+="K":C>-.8?y+="→":C>-1.2?y+="←":C>-1.8?y+="↑":y+="↓"}y+=` + */const eu=Ct("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]),en={name:"VO NGUYEN DANG KHOA",title:"AI CREATIVE LEAD & SOFTWARE DEVELOPER",dob:"19/01/1993",phone:"0398300340",email:"vonguyendangkhoa@gmail.com",location:"Ho Chi Minh City, Vietnam",portfolio:"khoavo.myds.me",github:"git.khoavo.myds.me/vndangkhoa",summary:"Highly accomplished Creative Leader bridging the gap between artistic direction and high-performance software engineering. With over 9+ years managing brand strategies and digital design, I evaluate and execute technology-driven projects from concept to production. Specialized in merging traditional creative direction with cutting-edge generative AI workflows (ComfyUI, FLUX) and full-stack development (Go, React)."},nS=[{period:"12/2012 - 06/2016",school:"RMIT Vietnam",degree:"Bachelor of Multimedia System Design (Graduated with Excellence)"}],rS=[{category:"Creative & AI Tools",items:"Adobe Creative Suite (Ps, Ai, Id, Pr), ComfyUI, Stable Diffusion, FLUX, Ollama, 3D Animation, Motion Graphics"},{category:"Development Stack",items:"React, Next.js, Go (Gin), Rust (Axum), Python (FastAPI), TypeScript, Tailwind CSS"},{category:"Infrastructure",items:"Docker, SQLite, Synology NAS Deployment, HLS Video Streaming"},{category:"Leadership",items:"Cross-Functional Management, Creative Strategy, Technical Mentorship, Process Optimization"}],iS=[{role:"AI Creative Lead",company:"Phibious Viet Nam",period:"06/2024 - Present",highlights:["Manage highly complex, technology-driven creative projects, merging traditional design with advanced generative AI models and data analytics.","Deploy and utilize ComfyUI, Stable Diffusion, FLUX, and local LLMs (Ollama, LM Studio) to augment design workflows and drive overarching agency strategies.","Lead cross-functional collaboration between traditional designers, copywriters, and data analysts to ensure measurable campaign performance.","Optimize internal design processes by integrating advanced image generation pipelines into daily operations.","Train and mentor the broader agency (including interns) on core AI design competencies and prompt engineering."]},{role:"eCOM Design Lead",company:"Procter & Gamble (P&G) Vietnam",period:"09/2023 - 06/2025",highlights:["Spearheaded strategic design concepts and visual strategies for e-commerce, directly impacting consumer engagement and online sales for Hair Care brands.","Managed end-to-end medium-to-large design projects, actively improving internal design processes and ensuring strict corporate standard compliance.","Collaborated globally across functional geographic boundaries and cross-functional teams to deliver cohesive brand stories."]},{role:"ECOM Graphic Designer (ABM)",company:"P&G Viet Nam",period:"11/2020 - 09/2023",highlights:["Built concepts and executed visual strategy across vast consumer touchpoints including packaging, eCommerce, and social media under the Hair Care Packaging Design Studio.","Leveraged hands-on design mastery to craft illustrations and brand expressions that consistently met high commercial demands.","Ensured brand guidelines and directives were embraced consistently and creatively across all regional platforms."]},{role:"Production Creative Lead",company:"Inn Saigon",period:"12/2019 - 11/2020",highlights:["Led the photography and production team, setting the standard for internal branding deliverables (Food, Product, Events).","Managed project budgets, retouching workflows, and cross-team communications to deliver high-volume outcomes.","Conducted frequent feedback sessions to boost performance and facilitate the development of team members."]},{role:"Regional Head of Design",company:"ASIAMARINE",period:"12/2018 - 12/2019",highlights:["Supervised all creation of concepts and layouts across digital/offline marketing for luxury marine sectors.","Managed independent contractors and junior designers, leveraging creative marketing to develop targeted campaigns."]},{role:"Senior Graphic Designer",company:"EMG",period:"12/2017 - 12/2018",highlights:["Created outstanding digital and print designs, managing corporate identity, merchandise, and digital displays.","Assisted with concept proposals to clients including mockup preparations and asset sourcing."]},{role:"Graphic Artist",company:"Le Meridien Saigon",period:"12/2016 - 12/2017",highlights:["Designed and executed all promotional collateral according to strict Le Meridien brand identity guidelines.","Liaised with external suppliers to ensure creative print quality and deadlines were consistently met."]},{role:"Animation Designer",company:"Adidas Group",period:"06/2016 - 12/2016",highlights:["Developed graphics and animations for production environment simulations (Line Balancing, One Pair Flow).","Compiled and edited video infographics for visual training purposes."]}],sS=[{name:"KV-Tube",tech:"Go (Gin), Next.js, SQLite, Docker, HLS.js",desc:"YouTube-like video streaming platform with HLS support, subscriptions, and Synology NAS deployment."},{name:"Spotify Clone",tech:"React, Rust (Axum), YouTube API",desc:"Full-featured music player with real-time lyrics and custom playlists."},{name:"APIx (kv-pix)",tech:"Next.js 14, TypeScript, Prisma",desc:"AI Image Generator powered by multiple providers (Grok, Meta, Whisk)."}],oS=[{name:"Dung Bui",title:"Senior Manager",company:"Adidas Group",contact:"dung.bui@adidas-group.com"},{name:"Wouter Pasman",title:"Graphic Designer",company:"FreshStudio.vn",contact:"0908074383"},{name:"Tran Nhuan Vu",title:"Marketing Mgr",company:"Element Mgmt",contact:"Vu.tran@element.vn"}],Ee={pageContainer:{width:"210mm",padding:"14mm 16mm",background:"#ffffff",fontFamily:"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",color:"#000000",fontSize:"9pt",lineHeight:"1.5",margin:"0 auto"},header:{borderBottom:"2px solid #000",paddingBottom:"4mm",marginBottom:"4mm"},name:{fontSize:"25pt",fontWeight:900,letterSpacing:"-0.02em",margin:"0 0 4px 0",lineHeight:"1"},title:{fontSize:"11pt",fontWeight:600,color:"#333",margin:"0 0 4mm 0",letterSpacing:"0.05em"},infoGrid:{display:"flex",flexWrap:"wrap",gap:"3mm 8mm",fontSize:"8pt",color:"#444"},sectionTitle:{fontSize:"11pt",fontWeight:800,textTransform:"uppercase",letterSpacing:"0.05em",borderBottom:"1px solid #ccc",paddingBottom:"1.5mm",margin:"5mm 0 3mm 0",color:"#000"},summary:{fontSize:"9pt",lineHeight:"1.5",margin:"0 0 4mm 0",textAlign:"justify"},skillGrid:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"2mm 5mm",marginBottom:"3mm"},experienceItem:{marginBottom:"4mm"},expHeader:{display:"flex",justifyContent:"space-between",alignItems:"baseline",marginBottom:"1.5mm"},expRole:{fontSize:"10pt",fontWeight:700,margin:0},expCompany:{fontWeight:600,color:"#333"},expPeriod:{fontSize:"8pt",color:"#555",fontWeight:600},expList:{margin:"0",paddingLeft:"5mm"},expBullet:{marginBottom:"1mm",textAlign:"justify"},projectItem:{marginBottom:"2.5mm"},projectHeader:{fontWeight:700,fontSize:"9.5pt"},projectTech:{fontSize:"7.5pt",color:"#555",fontFamily:"monospace",marginLeft:"2mm"},refGrid:{display:"flex",justifyContent:"space-between",fontSize:"8pt",marginTop:"2mm"}};function aS(){return m.jsxs("div",{style:Ee.pageContainer,children:[m.jsxs("div",{style:Ee.header,children:[m.jsx("h1",{style:Ee.name,children:en.name}),m.jsx("div",{style:Ee.title,children:en.title}),m.jsxs("div",{style:Ee.infoGrid,children:[m.jsxs("span",{children:[m.jsx("strong",{children:"Email:"})," ",en.email]}),m.jsxs("span",{children:[m.jsx("strong",{children:"Phone:"})," ",en.phone]}),m.jsxs("span",{children:[m.jsx("strong",{children:"Location:"})," ",en.location]}),m.jsxs("span",{children:[m.jsx("strong",{children:"Portfolio:"})," ",en.portfolio]}),m.jsxs("span",{children:[m.jsx("strong",{children:"GitHub:"})," ",en.github]}),m.jsxs("span",{children:[m.jsx("strong",{children:"DOB:"})," ",en.dob]})]})]}),m.jsx("p",{style:Ee.summary,children:en.summary}),m.jsx("h2",{style:Ee.sectionTitle,children:"Core Competencies"}),m.jsx("div",{style:Ee.skillGrid,children:rS.map((n,r)=>m.jsxs("div",{children:[m.jsx("strong",{style:{display:"block",fontSize:"9pt",marginBottom:"1mm"},children:n.category}),m.jsx("span",{style:{fontSize:"8.5pt",color:"#333"},children:n.items})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"Work Experience"}),m.jsx("div",{children:iS.map((n,r)=>m.jsxs("div",{style:Ee.experienceItem,children:[m.jsxs("div",{style:Ee.expHeader,children:[m.jsxs("h3",{style:Ee.expRole,children:[n.role," ",m.jsx("span",{style:{fontWeight:400},children:"at"})," ",m.jsx("span",{style:Ee.expCompany,children:n.company})]}),m.jsx("span",{style:Ee.expPeriod,children:n.period})]}),m.jsx("ul",{style:Ee.expList,children:n.highlights.map((s,a)=>m.jsx("li",{style:Ee.expBullet,children:s},a))})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"Software Engineering Projects"}),m.jsx("div",{children:sS.map((n,r)=>m.jsxs("div",{style:Ee.projectItem,children:[m.jsx("span",{style:Ee.projectHeader,children:n.name}),m.jsxs("span",{style:Ee.projectTech,children:["[",n.tech,"]"]}),m.jsx("span",{style:{display:"block",fontSize:"8.5pt",color:"#333",marginTop:"1mm"},children:n.desc})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"Education"}),m.jsx("div",{style:{marginBottom:"6mm"},children:nS.map((n,r)=>m.jsxs("div",{style:{display:"flex",justifyContent:"space-between"},children:[m.jsx("strong",{children:n.school}),m.jsx("span",{children:n.degree}),m.jsx("span",{style:Ee.expPeriod,children:n.period})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"References"}),m.jsx("div",{style:Ee.refGrid,children:oS.map((n,r)=>m.jsxs("div",{children:[m.jsx("strong",{children:n.name}),m.jsx("br",{}),m.jsxs("span",{style:{color:"#555"},children:[n.title,", ",n.company]}),m.jsx("br",{}),m.jsx("span",{children:n.contact})]},r))})]})}const Ut={name:"Vo Nguyen Dang Khoa",phone:"0398300340",email:"vonguyendangkhoa@gmail.com",location:"Ho Chi Minh City, Vietnam",linkedin:"https://www.linkedin.com/in/khoa-vo-76291236/",portfolio:"https://khoavo.myds.me/"},Bt={title:"AI Creative Lead & Motion Designer",summary:"Visionary Creative Leader with 9+ years of expertise bridging brand strategy, digital design, motion graphics, and cutting-edge generative AI. Currently pioneering AI-augmented creative workflows at Phibious, merging traditional art direction with ComfyUI, Stable Diffusion, and FLUX to redefine what's possible in visual storytelling. Previously led eCommerce design at P&G, shaping digital experiences for millions of consumers across Southeast Asia.",tagline:"Where Design Meets Intelligence",skills:[{category:"AI & Generative Design",items:["ComfyUI","Stable Diffusion","FLUX","Midjourney","RunwayML","Ollama","LM Studio","LoRA Training","ControlNet","IP-Adapter"]},{category:"Design & Creative Tools",items:["Adobe Creative Suite","Figma","After Effects","Premiere Pro","Cinema 4D","Blender","Photoshop","Illustrator","InDesign"]},{category:"Motion & Animation",items:["Motion Graphics","3D Animation","Kinetic Typography","Visual Effects","Character Animation","Storyboarding"]},{category:"Brand & Strategy",items:["Brand Identity","Art Direction","Visual Storytelling","Editorial Design","Packaging Design","Strategic Design"]}],projects:[{id:1,title:"The Language of Poetry & Literature",category:"AI Generated Art",image:"https://khoavo.myds.me/wp-content/uploads/2025/08/i2i_1756355661_62547902.png",description:"Exploring the ethereal boundary between reality and imagination through AI-generated visuals. Created with Stable Diffusion, ComfyUI, and custom LoRA training to capture the intangible essence of poetic imagery.",link:"https://khoavo.myds.me/2025/08/28/the-language-of-poetry-and-literature/",year:"2025"},{id:2,title:"Delux Perfume – Fineline 2025 Launch",category:"AI Branding & Video",image:"https://khoavo.myds.me/wp-content/uploads/2025/08/Delux-Perfume_red.png",description:"End-to-end creative strategy and art direction for premium perfume launch. From AI-generated mood boards and product visuals to cinematic video production, creating a cohesive brand narrative for Southeast Asia market.",link:"https://khoavo.myds.me/2025/08/11/giving-art-direction-to-a-brand-a-case-study/",year:"2025"},{id:3,title:"AI Studio Photography",category:"AI-Generated Branding",image:"https://khoavo.myds.me/wp-content/uploads/2025/07/img_0317.jpg",description:"Revolutionary approach to professional studio photography using AI. ComfyUI workflows with custom LoRA to generate studio-quality product and portrait images, reducing production costs by 70%.",link:"https://khoavo.myds.me/2025/07/27/%F0%9F%A7%A0%F0%9F%93%B8-ai-studio-i-can-do-that-too/",year:"2025"},{id:4,title:"NAVIGATOR – ASIAMARINE Magazine",category:"Editorial Design",image:"https://khoavo.myds.me/wp-content/uploads/2020/10/navigator-vol1_page_001.webp",description:"Complete editorial design for Vietnam's premier yacht market publication. Art direction, layout design, and visual storytelling for a luxury marine sector brand reaching high-net-worth readers across Asia.",link:"https://khoavo.myds.me/2020/10/20/navigator/",year:"2020"},{id:5,title:"PetroVietnam – PCT Corporate Identity",category:"Brand Identity & 3D",image:"https://khoavo.myds.me/wp-content/uploads/2017/04/cip_mockup2.png",description:"Comprehensive corporate identity for PetroVietnam Transportation. 3D vehicle visualization, logo design, stationery system, and POSM materials creating a cohesive national brand presence.",link:"https://khoavo.myds.me/2017/04/10/petrovietnam-pct/",year:"2017"},{id:6,title:"Skyxx – Animated Poster Series",category:"Motion Graphics",image:"https://khoavo.myds.me/wp-content/uploads/2019/04/aash-3-scaled.jpg",description:"Award-winning weekly animated poster series for entertainment events. Dynamic motion graphics with 3D elements, pushing creative boundaries under tight deadlines while maintaining exceptional quality.",link:"https://khoavo.myds.me/2019/02/17/skyxx-poster-animation/",year:"2019"}],experience:[{role:"AI Creative Lead",company:"Phibious Vietnam",period:"2025 - Present",location:"Ho Chi Minh City",highlights:["Spearhead the integration of generative AI (ComfyUI, Stable Diffusion, FLUX) into creative workflows, reducing production time by 50%","Lead cross-functional teams of designers, copywriters, and data analysts to deliver technology-driven creative campaigns","Developed proprietary AI tools for mood boarding, concept visualization, and rapid prototyping","Created AI-augmented design concepts for digital and physical platforms serving Fortune 500 clients"]},{role:"eCommerce Design Lead",company:"Procter & Gamble (P&G)",period:"2020 - 2025",location:"Ho Chi Minh City",highlights:["Led visual strategy for eCommerce platforms across Hair Care category, directly impacting millions of consumers in SEA","Managed end-to-end design projects from concept to execution, aligning with global marketing strategies","Spearheaded the digital transformation of brand assets for omnichannel retail experiences","Mentored junior designers and established design standards adopted across the regional team"]},{role:"Production Creative Lead",company:"INN SaiGon",period:"Dec 2019 - Nov 2020",location:"Ho Chi Minh City",highlights:["Directed photography production for food, product, and event projects with 30+ client accounts","Established comprehensive brand guidelines and visual standards ensuring consistency across deliverables","Optimized post-production workflows, reducing turnaround time by 40%"]},{role:"Regional Head of Design",company:"ASIAMARINE",period:"2018 - 2019",location:"Ho Chi Minh City",highlights:["Led design team creating digital marketing assets, web graphics, and editorial content for luxury yacht brand","Delegated projects to junior designers while maintaining quality control and brand consistency","Collaborated with international teams to localize content for Asian markets"]},{role:"Senior Graphic Designer",company:"EMG - Element Management Group",period:"2017 - 2018",location:"Ho Chi Minh City",highlights:["Created impactful designs for print and digital campaigns for global luxury and lifestyle brands","Expert in photo sourcing, advanced image retouching, and brand identity development","Delivered corporate identity packages for multinational clients"]}],awards:[{title:"Best Digital Campaign",year:"2024",organization:"P&G SEA Digital Awards"},{title:"Outstanding Art Direction",year:"2019",organization:"Vietnam Design Awards"}]},yr={summary:"9-month intensive coding journey from zero to production. Built 5+ deployed applications including video streaming platforms, AI image generators, and music players. Proficient in modern web frameworks, containerization, and cloud deployment. Self-taught developer with a creative background bringing unique problem-solving perspective.",journey:[{month:"MAY '24",title:"The Spark",description:"First deep dive into Next.js. Abandoned manual CSS for Tailwind efficiency."},{month:"JUL '24",title:"First Production App",description:"Built kv-pix AI image generator with multi-provider support (Google Whisk, Meta AI, Grok)."},{month:"SEP '24",title:"Full-Stack Mastery",description:"Created KV-Tube YouTube platform with Go backend + Next.js. Dockerized for Synology NAS."},{month:"NOV '24",title:"The AI Pivot",description:"Fully embraced AI coding. Cursor and v0 became primary development engine."},{month:"DEC '24",title:"Rust Exploration",description:"Built Spotify clone with Rust Axum backend. Advanced system architecture."},{month:"PRESENT",title:"Vibe Ascended",description:"Building complex apps through high-level prompting and intuition."}],skills:{languages:["TypeScript","JavaScript","Go","Rust","Python","HTML/CSS","SQL"],frontend:["React","Next.js","Vite","Tailwind CSS","Shadcn","Framer Motion","Zustand","PWA"],backend:["Node.js","Go (Gin)","Rust (Axum)","Express","REST APIs","WebSocket"],ai:["LLM Integration","Cursor AI","v0","Replit AI","Ollama","Prompt Engineering","Multi-Provider AI APIs"],devops:["Docker","Docker Compose","GitHub Actions","Forgejo CI/CD","Synology NAS","Nginx","SQLite"],tools:["Git","VS Code","Figma","Postman","MongoDB","Prisma","ffmpeg"]},projects:[{name:"KV-Tube",description:"YouTube-like video streaming platform with HLS support, subscriptions, watch history, and PWA. Deployed on Synology NAS via Docker.",tech:["Go (Gin)","Next.js","TypeScript","SQLite","Docker","HLS.js","PWA"],github:"https://git.khoavo.myds.me/vndangkhoa/kv-tube"},{name:"Spotify Clone",description:"Full-featured Spotify-like music player with YouTube Music integration, real-time lyrics, custom playlists, and PWA support.",tech:["React (Vite)","Rust (Axum)","TailwindCSS","YouTube API","PWA"],github:"https://git.khoavo.myds.me/vndangkhoa/spotify-clone"},{name:"kv-pix (APIx)",description:"AI Image Generator powered by Google Whisk, Meta AI, and Grok. Multi-provider support with prompt library and history.",tech:["Next.js 14","TypeScript","Tailwind","Zustand","Docker"],github:"https://git.khoavo.myds.me/vndangkhoa/apix"},{name:"IT CV Portfolio",description:"This terminal-style interactive resume with typing animations and system aesthetics.",tech:["React","Vite","Tailwind","Framer Motion","TypeScript"],github:"https://git.khoavo.myds.me/vndangkhoa/it-cv"},{name:"kv-tiktok-download",description:"Douyin/TikTok video download API with batch processing support.",tech:["Python","FastAPI","yt-dlp"],github:"https://git.khoavo.myds.me/vndangkhoa/kv-tiktok-download"}],experience:[{role:"Creative Technology",company:"Phibious Vietnam",period:"2025 - Present",highlights:["Bridge between creative and technical teams","Develop interactive prototypes and AI-powered tools","Automate creative workflows with custom scripts","Build internal tools for design team productivity"]},{role:"Freelance Developer",company:"Self-Employed",period:"2024 - Present",highlights:["Built 5+ production web applications deployed on cloud and NAS","Integrated AI capabilities (image generation, video processing) into client solutions","Implemented CI/CD pipelines with GitHub/Forgejo Actions","Dockerized applications for easy deployment on various platforms"]}],forgejo:"https://git.khoavo.myds.me/vndangkhoa"},Hm=({size:n=36,vnColor:r="#1A1A1A",dkColor:s="#00FF94",className:a=""})=>m.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 100 100",width:n,height:n,fill:"none",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[m.jsx("path",{stroke:r,d:"M 15 25 L 30 45 L 45 25"}),m.jsx("path",{stroke:r,d:"M 55 45 L 55 25 L 85 45 L 85 25"}),m.jsx("path",{stroke:s,d:"M 15 55 L 30 55 A 10 10 0 0 1 30 75 L 15 75 Z"}),m.jsx("path",{stroke:s,d:"M 55 55 L 55 75 M 85 55 L 55 65 L 85 75"})]}),lS=({onSelect:n})=>{const[r,s]=_.useState(!1);return m.jsxs(pe.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0,y:-50},className:"fixed inset-0 overflow-hidden bg-[#FAFAFA]",children:[m.jsxs("div",{className:"relative w-full h-full flex flex-col items-center justify-center px-6",children:[m.jsxs("div",{className:"absolute inset-0 z-0",children:[m.jsx("div",{className:"absolute top-[-10%] left-[-10%] w-[40%] h-[40%] rounded-full bg-slate-100 blur-[120px] opacity-60 animate-pulse"}),m.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] w-[40%] h-[40%] rounded-full bg-slate-200 blur-[120px] opacity-60 animate-pulse",style:{animationDelay:"2s"}})]}),m.jsx("div",{className:"absolute inset-0 opacity-[0.03] bg-[linear-gradient(rgba(0,0,0,0.1)_1px,transparent_1px),linear-gradient(90deg,rgba(0,0,0,0.1)_1px,transparent_1px)] bg-[size:60px_60px]"}),m.jsx("div",{className:"relative z-10 max-w-5xl w-full text-center",children:m.jsxs(pe.div,{initial:{y:30,opacity:0},animate:{y:0,opacity:1},transition:{duration:1,ease:[.22,1,.36,1]},children:[m.jsx("div",{className:"overflow-hidden mb-4 py-2 px-4",children:m.jsx(pe.h1,{initial:{y:"100%"},animate:{y:0},transition:{duration:1.2,ease:[.22,1,.36,1],delay:.2},className:"text-[clamp(2rem,6.5vw,7.5rem)] font-serif font-bold text-[#1A1A1A] tracking-tighter leading-tight whitespace-nowrap",style:{textShadow:"0 2px 4px rgba(0,0,0,0.02)"},children:"Vo Nguyen Dang Khoa"})}),m.jsx(pe.p,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},transition:{duration:.8,delay:.8},className:"text-lg md:text-2xl font-serif text-[#1A1A1A]/70 mb-2 italic",children:"Where Design Meets Intelligence"}),m.jsx(pe.p,{initial:{opacity:0},animate:{opacity:1},transition:{duration:.8,delay:1},className:"text-[10px] font-bold tracking-[0.4em] text-[#1A1A1A]/30 uppercase mb-10 md:mb-12",children:"AI Creative Lead & Motion Designer"}),m.jsxs("button",{onClick:()=>n("creative"),className:"hidden md:inline-flex items-center gap-3 px-10 py-5 bg-[#1A1A1A] text-white text-lg font-medium rounded-full hover:bg-black hover:scale-105 transition-all shadow-2xl border-4 border-transparent hover:border-black/5",children:["Explore Portfolio",m.jsx(pe.div,{animate:{x:[0,5,0]},transition:{repeat:1/0,duration:1.5,ease:"easeInOut"},children:m.jsx(kr,{size:22})})]}),m.jsxs("div",{className:"md:hidden flex flex-col gap-4 mt-8",children:[m.jsxs("button",{onClick:()=>n("creative"),className:"flex items-center justify-between px-6 py-5 bg-[#1A1A1A] text-white font-medium rounded-2xl shadow-xl active:scale-[0.98] transition-transform",children:[m.jsxs("span",{className:"flex items-center gap-3",children:[m.jsx(lo,{size:18})," Creative Portfolio"]}),m.jsx(kr,{size:18})]}),m.jsxs("button",{onClick:()=>n("it"),className:"flex items-center justify-between px-6 py-5 border border-[#1A1A1A]/10 text-[#1A1A1A] font-medium rounded-2xl bg-white/50 backdrop-blur-md shadow-sm active:scale-[0.98] transition-transform",children:[m.jsxs("span",{className:"flex items-center gap-3",children:[m.jsx(eu,{size:18})," Developer Side"]}),m.jsx(kr,{size:18})]}),m.jsx("p",{className:"text-[10px] tracking-widest text-[#999] uppercase mt-2 opacity-60",children:"Select a persona to enter"})]})]})}),m.jsx(pe.div,{initial:{opacity:.5},animate:{opacity:r?0:.5},className:"absolute bottom-12 text-sm text-[#BBB] hidden md:block",children:m.jsxs("span",{className:"flex items-center gap-4",children:[m.jsx("span",{className:"w-12 h-px bg-[#BBB]"}),"Hover right to preview Developer side",m.jsx("span",{className:"w-12 h-px bg-[#BBB]"})]})})]}),m.jsxs(pe.div,{className:"absolute inset-y-0 right-0 w-full md:w-[75%] bg-[#0a0a0a] cursor-pointer hidden md:block z-40 border-l border-[#00FF94]/30",initial:{x:"calc(100% - 60px)"},animate:{x:r?"0%":"calc(100% - 60px)"},transition:{duration:.6,ease:[.22,1,.36,1]},onMouseEnter:()=>s(!0),onMouseLeave:()=>s(!1),onClick:()=>n("it"),children:[!r&&m.jsx(pe.div,{initial:{opacity:0},animate:{opacity:1},className:"absolute left-0 inset-y-0 w-[60px] flex items-center justify-center pointer-events-none",children:m.jsx("span",{className:"rotate-90 text-[10px] tracking-[0.5em] text-[#00FF94]/40 font-mono whitespace-nowrap",children:"DEVELOPER SIDE // PREVIEW"})}),m.jsx("div",{className:"absolute inset-0 opacity-[0.04] bg-[linear-gradient(rgba(0,255,136,0.1)_1px,transparent_1px),linear-gradient(90deg,rgba(0,255,136,0.1)_1px,transparent_1px)] bg-[size:25px_25px]"}),m.jsx("div",{className:"relative z-10 w-full h-full flex flex-col items-center justify-center px-8",children:m.jsxs("div",{className:"max-w-md text-center",children:[m.jsx(eu,{size:56,className:"text-[#00FF94] mx-auto mb-6"}),m.jsx("h2",{className:"text-4xl md:text-5xl font-bold text-white font-mono mb-2",children:"DEVELOPER"}),m.jsx("p",{className:"text-[#00FF94]/70 font-mono text-sm tracking-[0.3em] mb-8",children:"FULL-STACK & DEVOPS"}),m.jsxs("p",{className:"text-slate-400 font-mono text-base mb-8 leading-relaxed",children:["9-month coding journey.",m.jsx("br",{}),"Built 5+ production applications.",m.jsx("br",{}),"Self-taught with AI-powered development."]}),m.jsxs("button",{className:"inline-flex items-center gap-2 px-8 py-4 border-2 border-[#00FF94]/40 bg-[#00FF94]/10 text-[#00FF94] font-mono text-base rounded-full hover:bg-[#00FF94]/20 transition-colors",children:["Enter Terminal ",m.jsx(kr,{size:18})]}),m.jsxs("div",{className:"mt-10 font-mono text-sm text-[#00FF94]/40 text-left space-y-2",children:[m.jsxs("div",{children:[m.jsx("span",{className:"text-[#00D9FF]",children:"const"}),' stack = ["Go", "Rust", "TS"];']}),m.jsxs("div",{children:[m.jsx("span",{className:"text-[#00D9FF]",children:"const"})," deployed = 5;"]}),m.jsxs("div",{children:[m.jsx("span",{className:"text-[#00D9FF]",children:"const"}),' vibe = "S-Tier";']})]})]})})]}),m.jsx(pe.div,{initial:{opacity:0},animate:{opacity:r?0:1},transition:{duration:.4},className:"absolute top-8 left-6 md:left-8 z-50 text-[10px] md:text-lg",children:m.jsxs("div",{className:"text-[#1A1A1A] font-serif font-bold tracking-widest flex items-center gap-2",children:["KHOA.VO ",m.jsx("span",{className:"w-4 md:w-8 h-px bg-[#1A1A1A]/30"})]})})]})},uS=({onComplete:n})=>{const r=_.useRef(null);return _.useEffect(()=>{const s=window.innerWidth,a=window.innerHeight,u=Math.floor(s/8)+5,f=Math.floor(a/10)+5;let d=0;const h=()=>{d+=.08;let y="";for(let v=0;v1.5?y+="V":C>.8?y+="N":C>.2?y+="D":C>-.2?y+="K":C>-.8?y+="→":C>-1.2?y+="←":C>-1.8?y+="↑":y+="↓"}y+=` `}return y},g=setInterval(()=>{r.current&&(r.current.textContent=h())},50),x=setTimeout(()=>{clearInterval(g),n()},5e3);return()=>{clearInterval(g),clearTimeout(x)}},[n]),m.jsxs(pe.div,{exit:{opacity:0,scale:1.05,filter:"blur(5px)",transition:{duration:.8,ease:[.76,0,.24,1]}},className:"fixed inset-0 z-[200] bg-[#FAFAFA] flex items-center justify-center overflow-hidden",children:[m.jsx("pre",{ref:r,className:"text-[#1A1A1A] font-mono font-bold italic text-[10px] md:text-xs leading-[10px] md:leading-[12px] opacity-30 select-none whitespace-pre transform scale-110",style:{letterSpacing:"0.15em"}}),m.jsxs("button",{onClick:n,className:"absolute bottom-8 right-8 z-[210] flex items-center gap-2 text-[10px] md:text-xs font-bold tracking-[0.2em] uppercase text-[#1A1A1A]/50 hover:text-[#1A1A1A] transition-colors bg-white/80 px-4 py-2 backdrop-blur-sm rounded",children:["Click to Skip ",m.jsx("span",{className:"opacity-50",children:"→"})]})]})},cS=({onComplete:n})=>{const[r,s]=_.useState([]),a=["INIT SYSTEM KHOA.VO...","MOUNTING VIRTUAL DOM [OK]","LOADING REACT ROOT [OK]","ESTABLISHING AI SUBSYSTEMS...","AI SUBSYSTEMS [ONLINE]","BYPASSING SECURITY PROTOCOLS...","ACCESS GRANTED."];return _.useEffect(()=>{let u=0;const f=setInterval(()=>{u[...d,a[u]]),u++):(clearInterval(f),setTimeout(n,500))},180);return()=>clearInterval(f)},[n]),m.jsx(pe.div,{exit:{opacity:0,scale:1.05,filter:"blur(10px)",transition:{duration:.6,ease:"easeIn"}},className:"fixed inset-0 z-[200] bg-[#0a0a0a] text-[#00FF94] font-mono p-6 md:p-12 flex flex-col justify-end pb-24",children:m.jsxs("div",{className:"space-y-2 opacity-80 text-sm md:text-base",children:[r.map((u,f)=>m.jsxs("div",{children:["> ",u]},f)),r.length ▋"})]})})},dS=({onBack:n,onSwitch:r})=>{const[s,a]=_.useState(!0),[u,f]=_.useState(!1),[d,h]=_.useState(null),[g,x]=_.useState([]);_.useEffect(()=>{const v=()=>{f(window.scrollY>400)};return window.addEventListener("scroll",v),()=>window.removeEventListener("scroll",v)},[]);const y=()=>{window.scrollTo({top:0,behavior:"smooth"})};return _.useEffect(()=>{if(s)return;const v=setTimeout(()=>{x(Bt.projects.map(w=>w.id))},500);return()=>clearTimeout(v)},[s]),m.jsxs(m.Fragment,{children:[m.jsx(Tr,{children:s&&m.jsx(uS,{onComplete:()=>a(!1)})}),m.jsxs(pe.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"min-h-screen bg-[#FAFAFA] text-[#1A1A1A]",children:[m.jsx("nav",{className:"fixed top-0 left-0 right-0 z-50 bg-[#FAFAFA]/90 backdrop-blur-sm border-b border-[#1A1A1A]/10",children:m.jsxs("div",{className:"max-w-7xl mx-auto px-4 md:px-6 h-16 flex items-center justify-between",children:[m.jsxs("button",{onClick:n,className:"p-2 flex items-center gap-1.5 text-sm md:text-base text-[#1A1A1A]/60 hover:text-[#1A1A1A] transition-colors",children:[m.jsx(bm,{size:18})," ",m.jsx("span",{className:"hidden md:inline",children:"Back"})]}),m.jsx("div",{className:"flex items-center justify-center",children:m.jsx(Hm,{size:36,vnColor:"#1A1A1A",dkColor:"#00FF94"})}),m.jsxs("div",{className:"flex items-center gap-2",children:[m.jsxs("button",{onClick:()=>window.print(),className:"px-3 py-1.5 text-[10px] md:text-xs font-bold uppercase tracking-widest text-[#1A1A1A] border border-[#1A1A1A] rounded-full hover:bg-[#1A1A1A] hover:text-white transition-colors flex items-center gap-2",children:[m.jsx("span",{className:"hidden md:inline",children:"Download CV"}),m.jsx("span",{className:"md:hidden",children:"CV"})]}),m.jsxs("button",{onClick:r,className:"px-4 py-2 text-[10px] md:text-xs text-white bg-[#1A1A1A] border border-[#1A1A1A] rounded-full hover:bg-transparent hover:text-[#1A1A1A] transition-colors flex items-center gap-2",children:[m.jsx(eu,{size:14})," ",m.jsx("span",{className:"hidden md:inline",children:"IT View"}),m.jsx("span",{className:"md:hidden",children:"IT"})]})]})]})}),m.jsx(Tr,{children:u&&m.jsx(pe.button,{initial:{opacity:0,scale:.8,y:20},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.8,y:20},onClick:y,className:"fixed bottom-8 right-6 z-50 p-4 bg-[#1A1A1A] text-white rounded-full shadow-2xl md:hidden",children:m.jsx(kr,{size:20,className:"-rotate-90"})})}),m.jsxs("main",{className:"pt-20",children:[m.jsx("section",{className:"max-w-5xl mx-auto px-6 py-24 md:py-32",children:m.jsxs(pe.div,{initial:{opacity:0,y:30},animate:{opacity:1,y:0},transition:{duration:.8},children:[m.jsx("p",{className:"text-xs tracking-[0.3em] text-[#666] uppercase mb-4",children:Bt.title}),m.jsx("h1",{className:"text-5xl md:text-7xl font-serif font-bold leading-tight mb-4",children:Bt.tagline}),m.jsx("p",{className:"text-2xl md:text-3xl font-serif text-[#666] mb-8",children:Ut.name}),m.jsx("p",{className:"text-lg text-[#666] max-w-2xl leading-relaxed",children:Bt.summary}),m.jsxs("div",{className:"flex flex-wrap gap-4 mt-8 text-sm text-[#999]",children:[m.jsxs("span",{className:"flex items-center gap-1",children:[m.jsx(Zh,{size:14})," ",Ut.location]}),m.jsxs("span",{className:"flex items-center gap-1",children:[m.jsx(Jl,{size:14})," ",Ut.email]}),m.jsxs("span",{className:"flex items-center gap-1",children:[m.jsx(tS,{size:14})," ",Ut.phone]})]})]})}),Bt.awards&&Bt.awards.length>0&&m.jsx("section",{className:"max-w-5xl mx-auto px-6 pb-16",children:m.jsx("div",{className:"flex flex-wrap gap-6",children:Bt.awards.map((v,w)=>m.jsxs(pe.div,{initial:{opacity:0,y:20},whileInView:{opacity:1,y:0},viewport:{once:!0},transition:{delay:w*.1},className:"flex items-center gap-3 bg-[#F5F5F5] px-4 py-2 rounded-full",children:[m.jsx(lo,{size:14,className:"text-amber-500"}),m.jsx("span",{className:"text-sm font-medium",children:v.title}),m.jsx("span",{className:"text-xs text-[#999]",children:v.year})]},w))})}),m.jsxs("section",{className:"max-w-7xl mx-auto px-6 py-16",children:[m.jsxs(pe.div,{initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},className:"flex items-center gap-4 mb-12",children:[m.jsx(eS,{size:20}),m.jsx("h2",{className:"text-2xl font-serif font-bold",children:"Selected Works"})]}),m.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:Bt.projects.map((v,w)=>m.jsxs(pe.div,{initial:{opacity:0,y:30},animate:{opacity:g.includes(v.id)?1:0,y:g.includes(v.id)?0:30},transition:{duration:.6,delay:w*.1},className:"group cursor-pointer",onClick:()=>h(v),children:[m.jsxs("div",{className:"relative aspect-[4/3] overflow-hidden bg-slate-200 mb-4",children:[m.jsx("img",{src:v.image,alt:v.title,className:"w-full h-full object-cover transition-transform duration-700 group-hover:scale-105"}),m.jsx("div",{className:"absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300"}),m.jsx("span",{className:"absolute top-4 right-4 bg-white/90 px-3 py-1 text-xs font-medium",children:v.year})]}),m.jsx("p",{className:"text-xs tracking-widest text-[#666] uppercase mb-1",children:v.category}),m.jsx("h3",{className:"text-lg font-serif font-semibold group-hover:text-[#666] transition-colors",children:v.title})]},v.id))})]}),m.jsxs("section",{className:"max-w-7xl mx-auto px-6 py-16 bg-[#F5F5F5]",children:[m.jsxs(pe.div,{initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},className:"flex items-center gap-4 mb-12",children:[m.jsx(lo,{size:20}),m.jsx("h2",{className:"text-2xl font-serif font-bold",children:"Expertise"})]}),m.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8",children:Bt.skills.map((v,w)=>m.jsxs(pe.div,{initial:{opacity:0,y:20},whileInView:{opacity:1,y:0},viewport:{once:!0},transition:{delay:w*.1},children:[m.jsx("h3",{className:"text-sm font-bold text-[#1A1A1A] mb-4 pb-2 border-b border-[#1A1A1A]/10",children:v.category}),m.jsx("div",{className:"flex flex-wrap gap-2",children:v.items.map(C=>m.jsx("span",{className:"text-xs text-[#666] bg-white px-3 py-1 border border-[#1A1A1A]/10",children:C},C))})]},v.category))})]}),m.jsxs("section",{className:"max-w-5xl mx-auto px-6 py-16",children:[m.jsxs(pe.div,{initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},className:"flex items-center gap-4 mb-12",children:[m.jsx(Jw,{size:20}),m.jsx("h2",{className:"text-2xl font-serif font-bold",children:"Professional Journey"})]}),m.jsxs("div",{className:"relative",children:[m.jsx("div",{className:"absolute left-0 top-0 bottom-0 w-px bg-[#1A1A1A]/10"}),m.jsx("div",{className:"space-y-10",children:Bt.experience.map((v,w)=>m.jsxs(pe.div,{initial:{opacity:0,x:-30},whileInView:{opacity:1,x:0},viewport:{once:!0},transition:{delay:w*.1},className:"relative pl-8",children:[m.jsx("div",{className:"absolute left-[-3px] top-2 w-2 h-2 bg-[#1A1A1A] rounded-full"}),m.jsxs("div",{className:"flex flex-col md:flex-row md:items-start gap-2 md:gap-6 mb-2",children:[m.jsx("div",{className:"text-sm font-medium text-[#1A1A1A] shrink-0",children:v.period}),m.jsxs("div",{children:[m.jsx("h3",{className:"text-xl font-bold text-[#1A1A1A]",children:v.role}),m.jsxs("div",{className:"flex items-center gap-2 text-[#666] mt-1",children:[m.jsx("span",{className:"font-medium",children:v.company}),v.location&&m.jsxs(m.Fragment,{children:[m.jsx("span",{className:"text-[#999]",children:"•"}),m.jsx("span",{className:"text-sm",children:v.location})]})]})]})]}),m.jsx("ul",{className:"text-[#666] space-y-2 mt-3",children:v.highlights.map((C,N)=>m.jsxs("li",{className:"leading-relaxed flex items-start gap-2",children:[m.jsx("span",{className:"w-1.5 h-1.5 bg-[#1A1A1A]/30 rounded-full mt-2 shrink-0"}),m.jsx("span",{children:C})]},N))})]},w))})]})]}),m.jsxs("footer",{className:"max-w-7xl mx-auto px-6 py-16 border-t border-[#1A1A1A]/10",children:[m.jsxs("div",{className:"flex flex-col md:flex-row justify-between items-center gap-8",children:[m.jsxs("div",{children:[m.jsx("h3",{className:"text-2xl font-serif font-bold mb-2",children:"Let's Create Together"}),m.jsx("p",{className:"text-[#666]",children:"Open for creative collaborations and opportunities"})]}),m.jsxs("div",{className:"flex gap-4",children:[m.jsx("a",{href:Ut.linkedin,target:"_blank",rel:"noreferrer",className:"p-3 border border-[#1A1A1A]/20 hover:bg-[#1A1A1A] hover:text-white transition-colors",children:m.jsx(Wm,{size:20})}),m.jsx("a",{href:Ut.email,className:"p-3 border border-[#1A1A1A]/20 hover:bg-[#1A1A1A] hover:text-white transition-colors",children:m.jsx(Jl,{size:20})}),m.jsx("a",{href:Ut.portfolio,target:"_blank",rel:"noreferrer",className:"p-3 border border-[#1A1A1A]/20 hover:bg-[#1A1A1A] hover:text-white transition-colors",children:m.jsx(Zh,{size:20})})]})]}),m.jsxs("p",{className:"text-center text-xs text-[#999] mt-12",children:["© ",new Date().getFullYear()," Vo Nguyen Dang Khoa. All rights reserved."]})]})]}),m.jsx(Tr,{children:d&&m.jsx(pe.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"fixed inset-0 z-[100] flex items-center justify-center bg-black/80 backdrop-blur-sm p-8",onClick:()=>h(null),children:m.jsxs(pe.div,{initial:{scale:.9,y:20},animate:{scale:1,y:0},exit:{scale:.9,y:20},className:"bg-[#FAFAFA] max-w-4xl w-full rounded-lg overflow-hidden",onClick:v=>v.stopPropagation(),children:[m.jsx("img",{src:d.image,alt:d.title,className:"w-full h-64 md:h-96 object-cover"}),m.jsxs("div",{className:"p-8",children:[m.jsx("p",{className:"text-xs tracking-widest text-[#666] uppercase mb-2",children:d.category}),m.jsx("h3",{className:"text-2xl font-serif font-bold mb-4",children:d.title}),m.jsx("p",{className:"text-[#666] mb-6",children:d.description}),m.jsxs("a",{href:d.link,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-2 text-sm font-medium text-[#1A1A1A] border-b border-[#1A1A1A] pb-1 hover:opacity-60",children:["View Project ",m.jsx(Um,{size:14})]})]})]})})})]})]})},fS=({onBack:n,onSwitch:r})=>{const[s,a]=_.useState(!0),[u,f]=_.useState("about"),[d,h]=_.useState(""),[g,x]=_.useState(!1),y=`> whoami Vo Nguyen Dang Khoa diff --git a/dist/assets/index-DRsd1fIf.js b/dist/assets/index-DRsd1fIf.js deleted file mode 100644 index a49b317..0000000 --- a/dist/assets/index-DRsd1fIf.js +++ /dev/null @@ -1,133 +0,0 @@ -(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))a(u);new MutationObserver(u=>{for(const f of u)if(f.type==="childList")for(const d of f.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&a(d)}).observe(document,{childList:!0,subtree:!0});function s(u){const f={};return u.integrity&&(f.integrity=u.integrity),u.referrerPolicy&&(f.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?f.credentials="include":u.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function a(u){if(u.ep)return;u.ep=!0;const f=s(u);fetch(u.href,f)}})();function Jh(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var ll={exports:{}},pi={},ul={exports:{}},ae={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Af;function By(){if(Af)return ae;Af=1;var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),f=Symbol.for("react.provider"),d=Symbol.for("react.context"),h=Symbol.for("react.forward_ref"),g=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),v=Symbol.iterator;function w(P){return P===null||typeof P!="object"?null:(P=v&&P[v]||P["@@iterator"],typeof P=="function"?P:null)}var C={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},N=Object.assign,D={};function M(P,L,se){this.props=P,this.context=L,this.refs=D,this.updater=se||C}M.prototype.isReactComponent={},M.prototype.setState=function(P,L){if(typeof P!="object"&&typeof P!="function"&&P!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,P,L,"setState")},M.prototype.forceUpdate=function(P){this.updater.enqueueForceUpdate(this,P,"forceUpdate")};function I(){}I.prototype=M.prototype;function U(P,L,se){this.props=P,this.context=L,this.refs=D,this.updater=se||C}var B=U.prototype=new I;B.constructor=U,N(B,M.prototype),B.isPureReactComponent=!0;var b=Array.isArray,G=Object.prototype.hasOwnProperty,ie={current:null},oe={key:!0,ref:!0,__self:!0,__source:!0};function J(P,L,se){var le,de={},fe=null,xe=null;if(L!=null)for(le in L.ref!==void 0&&(xe=L.ref),L.key!==void 0&&(fe=""+L.key),L)G.call(L,le)&&!oe.hasOwnProperty(le)&&(de[le]=L[le]);var me=arguments.length-2;if(me===1)de.children=se;else if(1>>1,L=z[P];if(0>>1;Pu(de,W))feu(xe,de)?(z[P]=xe,z[fe]=W,P=fe):(z[P]=de,z[le]=W,P=le);else if(feu(xe,W))z[P]=xe,z[fe]=W,P=fe;else break e}}return X}function u(z,X){var W=z.sortIndex-X.sortIndex;return W!==0?W:z.id-X.id}if(typeof performance=="object"&&typeof performance.now=="function"){var f=performance;n.unstable_now=function(){return f.now()}}else{var d=Date,h=d.now();n.unstable_now=function(){return d.now()-h}}var g=[],x=[],y=1,v=null,w=3,C=!1,N=!1,D=!1,M=typeof setTimeout=="function"?setTimeout:null,I=typeof clearTimeout=="function"?clearTimeout:null,U=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function B(z){for(var X=s(x);X!==null;){if(X.callback===null)a(x);else if(X.startTime<=z)a(x),X.sortIndex=X.expirationTime,r(g,X);else break;X=s(x)}}function b(z){if(D=!1,B(z),!N)if(s(g)!==null)N=!0,Se(G);else{var X=s(x);X!==null&&Ne(b,X.startTime-z)}}function G(z,X){N=!1,D&&(D=!1,I(J),J=-1),C=!0;var W=w;try{for(B(X),v=s(g);v!==null&&(!(v.expirationTime>X)||z&&!ce());){var P=v.callback;if(typeof P=="function"){v.callback=null,w=v.priorityLevel;var L=P(v.expirationTime<=X);X=n.unstable_now(),typeof L=="function"?v.callback=L:v===s(g)&&a(g),B(X)}else a(g);v=s(g)}if(v!==null)var se=!0;else{var le=s(x);le!==null&&Ne(b,le.startTime-X),se=!1}return se}finally{v=null,w=W,C=!1}}var ie=!1,oe=null,J=-1,re=5,q=-1;function ce(){return!(n.unstable_now()-qz||125P?(z.sortIndex=W,r(x,z),s(g)===null&&z===s(x)&&(D?(I(J),J=-1):D=!0,Ne(b,W-P))):(z.sortIndex=L,r(g,z),N||C||(N=!0,Se(G))),z},n.unstable_shouldYield=ce,n.unstable_wrapCallback=function(z){var X=w;return function(){var W=w;w=X;try{return z.apply(this,arguments)}finally{w=W}}}})(fl)),fl}var Df;function Gy(){return Df||(Df=1,dl.exports=Hy()),dl.exports}/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Lf;function Ky(){if(Lf)return ut;Lf=1;var n=tu(),r=Gy();function s(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,i=1;i"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),g=Object.prototype.hasOwnProperty,x=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,y={},v={};function w(e){return g.call(v,e)?!0:g.call(y,e)?!1:x.test(e)?v[e]=!0:(y[e]=!0,!1)}function C(e,t,i,o){if(i!==null&&i.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return o?!1:i!==null?!i.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function N(e,t,i,o){if(t===null||typeof t>"u"||C(e,t,i,o))return!0;if(o)return!1;if(i!==null)switch(i.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function D(e,t,i,o,l,c,p){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=o,this.attributeNamespace=l,this.mustUseProperty=i,this.propertyName=e,this.type=t,this.sanitizeURL=c,this.removeEmptyString=p}var M={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){M[e]=new D(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];M[t]=new D(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){M[e]=new D(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){M[e]=new D(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){M[e]=new D(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){M[e]=new D(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){M[e]=new D(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){M[e]=new D(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){M[e]=new D(e,5,!1,e.toLowerCase(),null,!1,!1)});var I=/[\-:]([a-z])/g;function U(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(I,U);M[t]=new D(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(I,U);M[t]=new D(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(I,U);M[t]=new D(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){M[e]=new D(e,1,!1,e.toLowerCase(),null,!1,!1)}),M.xlinkHref=new D("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){M[e]=new D(e,1,!1,e.toLowerCase(),null,!0,!0)});function B(e,t,i,o){var l=M.hasOwnProperty(t)?M[t]:null;(l!==null?l.type!==0:o||!(2S||l[p]!==c[S]){var k=` -`+l[p].replace(" at new "," at ");return e.displayName&&k.includes("")&&(k=k.replace("",e.displayName)),k}while(1<=p&&0<=S);break}}}finally{se=!1,Error.prepareStackTrace=i}return(e=e?e.displayName||e.name:"")?L(e):""}function de(e){switch(e.tag){case 5:return L(e.type);case 16:return L("Lazy");case 13:return L("Suspense");case 19:return L("SuspenseList");case 0:case 2:case 15:return e=le(e.type,!1),e;case 11:return e=le(e.type.render,!1),e;case 1:return e=le(e.type,!0),e;default:return""}}function fe(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case oe:return"Fragment";case ie:return"Portal";case re:return"Profiler";case J:return"StrictMode";case je:return"Suspense";case Le:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case ce:return(e.displayName||"Context")+".Consumer";case q:return(e._context.displayName||"Context")+".Provider";case ye:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case _e:return t=e.displayName||null,t!==null?t:fe(e.type)||"Memo";case Se:t=e._payload,e=e._init;try{return fe(e(t))}catch{}}return null}function xe(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return fe(t);case 8:return t===J?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function me(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Pe(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function ct(e){var t=Pe(e)?"checked":"value",i=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&typeof i<"u"&&typeof i.get=="function"&&typeof i.set=="function"){var l=i.get,c=i.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(p){o=""+p,c.call(this,p)}}),Object.defineProperty(e,t,{enumerable:i.enumerable}),{getValue:function(){return o},setValue:function(p){o=""+p},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Ni(e){e._valueTracker||(e._valueTracker=ct(e))}function Du(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var i=t.getValue(),o="";return e&&(o=Pe(e)?e.checked?"true":"false":e.value),e=o,e!==i?(t.setValue(e),!0):!1}function Mi(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function mo(e,t){var i=t.checked;return W({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:i??e._wrapperState.initialChecked})}function Lu(e,t){var i=t.defaultValue==null?"":t.defaultValue,o=t.checked!=null?t.checked:t.defaultChecked;i=me(t.value!=null?t.value:i),e._wrapperState={initialChecked:o,initialValue:i,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Ru(e,t){t=t.checked,t!=null&&B(e,"checked",t,!1)}function go(e,t){Ru(e,t);var i=me(t.value),o=t.type;if(i!=null)o==="number"?(i===0&&e.value===""||e.value!=i)&&(e.value=""+i):e.value!==""+i&&(e.value=""+i);else if(o==="submit"||o==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?yo(e,t.type,i):t.hasOwnProperty("defaultValue")&&yo(e,t.type,me(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Fu(e,t,i){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!(o!=="submit"&&o!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,i||t===e.value||(e.value=t),e.defaultValue=t}i=e.name,i!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,i!==""&&(e.name=i)}function yo(e,t,i){(t!=="number"||Mi(e.ownerDocument)!==e)&&(i==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+i&&(e.defaultValue=""+i))}var Nr=Array.isArray;function Kn(e,t,i,o){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Di.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Mr(e,t){if(t){var i=e.firstChild;if(i&&i===e.lastChild&&i.nodeType===3){i.nodeValue=t;return}}e.textContent=t}var Dr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Hm=["Webkit","ms","Moz","O"];Object.keys(Dr).forEach(function(e){Hm.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Dr[t]=Dr[e]})});function Bu(e,t,i){return t==null||typeof t=="boolean"||t===""?"":i||typeof t!="number"||t===0||Dr.hasOwnProperty(e)&&Dr[e]?(""+t).trim():t+"px"}function bu(e,t){e=e.style;for(var i in t)if(t.hasOwnProperty(i)){var o=i.indexOf("--")===0,l=Bu(i,t[i],o);i==="float"&&(i="cssFloat"),o?e.setProperty(i,l):e[i]=l}}var Gm=W({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function wo(e,t){if(t){if(Gm[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(s(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(s(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(s(61))}if(t.style!=null&&typeof t.style!="object")throw Error(s(62))}}function So(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ko=null;function To(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Co=null,$n=null,Yn=null;function Uu(e){if(e=Jr(e)){if(typeof Co!="function")throw Error(s(280));var t=e.stateNode;t&&(t=es(t),Co(e.stateNode,e.type,t))}}function Wu(e){$n?Yn?Yn.push(e):Yn=[e]:$n=e}function Hu(){if($n){var e=$n,t=Yn;if(Yn=$n=null,Uu(e),t)for(e=0;e>>=0,e===0?32:31-(ng(e)/rg|0)|0}var Ii=64,_i=4194304;function Vr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function zi(e,t){var i=e.pendingLanes;if(i===0)return 0;var o=0,l=e.suspendedLanes,c=e.pingedLanes,p=i&268435455;if(p!==0){var S=p&~l;S!==0?o=Vr(S):(c&=p,c!==0&&(o=Vr(c)))}else p=i&~l,p!==0?o=Vr(p):c!==0&&(o=Vr(c));if(o===0)return 0;if(t!==0&&t!==o&&(t&l)===0&&(l=o&-o,c=t&-t,l>=c||l===16&&(c&4194240)!==0))return t;if((o&4)!==0&&(o|=i&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=o;0i;i++)t.push(e);return t}function Ir(e,t,i){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Pt(t),e[t]=i}function ag(e,t){var i=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0=Hr),vc=" ",xc=!1;function wc(e,t){switch(e){case"keyup":return Vg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Sc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var qn=!1;function _g(e,t){switch(e){case"compositionend":return Sc(t);case"keypress":return t.which!==32?null:(xc=!0,vc);case"textInput":return e=t.data,e===vc&&xc?null:e;default:return null}}function zg(e,t){if(qn)return e==="compositionend"||!Uo&&wc(e,t)?(e=fc(),Wi=Io=on=null,qn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:i,offset:t-e};e=o}e:{for(;i;){if(i.nextSibling){i=i.nextSibling;break e}i=i.parentNode}i=void 0}i=jc(i)}}function Mc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Mc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Dc(){for(var e=window,t=Mi();t instanceof e.HTMLIFrameElement;){try{var i=typeof t.contentWindow.location.href=="string"}catch{i=!1}if(i)e=t.contentWindow;else break;t=Mi(e.document)}return t}function Go(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function $g(e){var t=Dc(),i=e.focusedElem,o=e.selectionRange;if(t!==i&&i&&i.ownerDocument&&Mc(i.ownerDocument.documentElement,i)){if(o!==null&&Go(i)){if(t=o.start,e=o.end,e===void 0&&(e=t),"selectionStart"in i)i.selectionStart=t,i.selectionEnd=Math.min(e,i.value.length);else if(e=(t=i.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=i.textContent.length,c=Math.min(o.start,l);o=o.end===void 0?c:Math.min(o.end,l),!e.extend&&c>o&&(l=o,o=c,c=l),l=Nc(i,c);var p=Nc(i,o);l&&p&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==p.node||e.focusOffset!==p.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),c>o?(e.addRange(t),e.extend(p.node,p.offset)):(t.setEnd(p.node,p.offset),e.addRange(t)))}}for(t=[],e=i;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof i.focus=="function"&&i.focus(),i=0;i=document.documentMode,Zn=null,Ko=null,Yr=null,$o=!1;function Lc(e,t,i){var o=i.window===i?i.document:i.nodeType===9?i:i.ownerDocument;$o||Zn==null||Zn!==Mi(o)||(o=Zn,"selectionStart"in o&&Go(o)?o={start:o.selectionStart,end:o.selectionEnd}:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection(),o={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}),Yr&&$r(Yr,o)||(Yr=o,o=qi(Ko,"onSelect"),0rr||(e.current=sa[rr],sa[rr]=null,rr--)}function we(e,t){rr++,sa[rr]=e.current,e.current=t}var cn={},Qe=un(cn),it=un(!1),Nn=cn;function ir(e,t){var i=e.type.contextTypes;if(!i)return cn;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var l={},c;for(c in i)l[c]=t[c];return o&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function st(e){return e=e.childContextTypes,e!=null}function ts(){Te(it),Te(Qe)}function $c(e,t,i){if(Qe.current!==cn)throw Error(s(168));we(Qe,t),we(it,i)}function Yc(e,t,i){var o=e.stateNode;if(t=t.childContextTypes,typeof o.getChildContext!="function")return i;o=o.getChildContext();for(var l in o)if(!(l in t))throw Error(s(108,xe(e)||"Unknown",l));return W({},i,o)}function ns(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||cn,Nn=Qe.current,we(Qe,e),we(it,it.current),!0}function Xc(e,t,i){var o=e.stateNode;if(!o)throw Error(s(169));i?(e=Yc(e,t,Nn),o.__reactInternalMemoizedMergedChildContext=e,Te(it),Te(Qe),we(Qe,e)):Te(it),we(it,i)}var $t=null,rs=!1,oa=!1;function Qc(e){$t===null?$t=[e]:$t.push(e)}function sy(e){rs=!0,Qc(e)}function dn(){if(!oa&&$t!==null){oa=!0;var e=0,t=ge;try{var i=$t;for(ge=1;e>=p,l-=p,Yt=1<<32-Pt(t)+l|i<ne?(Ge=te,te=null):Ge=te.sibling;var he=R(A,te,E[ne],O);if(he===null){te===null&&(te=Ge);break}e&&te&&he.alternate===null&&t(A,te),T=c(he,T,ne),ee===null?Z=he:ee.sibling=he,ee=he,te=Ge}if(ne===E.length)return i(A,te),Ae&&Dn(A,ne),Z;if(te===null){for(;nene?(Ge=te,te=null):Ge=te.sibling;var wn=R(A,te,he.value,O);if(wn===null){te===null&&(te=Ge);break}e&&te&&wn.alternate===null&&t(A,te),T=c(wn,T,ne),ee===null?Z=wn:ee.sibling=wn,ee=wn,te=Ge}if(he.done)return i(A,te),Ae&&Dn(A,ne),Z;if(te===null){for(;!he.done;ne++,he=E.next())he=V(A,he.value,O),he!==null&&(T=c(he,T,ne),ee===null?Z=he:ee.sibling=he,ee=he);return Ae&&Dn(A,ne),Z}for(te=o(A,te);!he.done;ne++,he=E.next())he=H(te,A,ne,he.value,O),he!==null&&(e&&he.alternate!==null&&te.delete(he.key===null?ne:he.key),T=c(he,T,ne),ee===null?Z=he:ee.sibling=he,ee=he);return e&&te.forEach(function(Oy){return t(A,Oy)}),Ae&&Dn(A,ne),Z}function Ie(A,T,E,O){if(typeof E=="object"&&E!==null&&E.type===oe&&E.key===null&&(E=E.props.children),typeof E=="object"&&E!==null){switch(E.$$typeof){case G:e:{for(var Z=E.key,ee=T;ee!==null;){if(ee.key===Z){if(Z=E.type,Z===oe){if(ee.tag===7){i(A,ee.sibling),T=l(ee,E.props.children),T.return=A,A=T;break e}}else if(ee.elementType===Z||typeof Z=="object"&&Z!==null&&Z.$$typeof===Se&&nd(Z)===ee.type){i(A,ee.sibling),T=l(ee,E.props),T.ref=ei(A,ee,E),T.return=A,A=T;break e}i(A,ee);break}else t(A,ee);ee=ee.sibling}E.type===oe?(T=On(E.props.children,A.mode,O,E.key),T.return=A,A=T):(O=Ds(E.type,E.key,E.props,null,A.mode,O),O.ref=ei(A,T,E),O.return=A,A=O)}return p(A);case ie:e:{for(ee=E.key;T!==null;){if(T.key===ee)if(T.tag===4&&T.stateNode.containerInfo===E.containerInfo&&T.stateNode.implementation===E.implementation){i(A,T.sibling),T=l(T,E.children||[]),T.return=A,A=T;break e}else{i(A,T);break}else t(A,T);T=T.sibling}T=rl(E,A.mode,O),T.return=A,A=T}return p(A);case Se:return ee=E._init,Ie(A,T,ee(E._payload),O)}if(Nr(E))return $(A,T,E,O);if(X(E))return Q(A,T,E,O);as(A,E)}return typeof E=="string"&&E!==""||typeof E=="number"?(E=""+E,T!==null&&T.tag===6?(i(A,T.sibling),T=l(T,E),T.return=A,A=T):(i(A,T),T=nl(E,A.mode,O),T.return=A,A=T),p(A)):i(A,T)}return Ie}var lr=rd(!0),id=rd(!1),ls=un(null),us=null,ur=null,fa=null;function ha(){fa=ur=us=null}function pa(e){var t=ls.current;Te(ls),e._currentValue=t}function ma(e,t,i){for(;e!==null;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,o!==null&&(o.childLanes|=t)):o!==null&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===i)break;e=e.return}}function cr(e,t){us=e,fa=ur=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(ot=!0),e.firstContext=null)}function vt(e){var t=e._currentValue;if(fa!==e)if(e={context:e,memoizedValue:t,next:null},ur===null){if(us===null)throw Error(s(308));ur=e,us.dependencies={lanes:0,firstContext:e}}else ur=ur.next=e;return t}var Ln=null;function ga(e){Ln===null?Ln=[e]:Ln.push(e)}function sd(e,t,i,o){var l=t.interleaved;return l===null?(i.next=i,ga(t)):(i.next=l.next,l.next=i),t.interleaved=i,Qt(e,o)}function Qt(e,t){e.lanes|=t;var i=e.alternate;for(i!==null&&(i.lanes|=t),i=e,e=e.return;e!==null;)e.childLanes|=t,i=e.alternate,i!==null&&(i.childLanes|=t),i=e,e=e.return;return i.tag===3?i.stateNode:null}var fn=!1;function ya(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function od(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function qt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function hn(e,t,i){var o=e.updateQueue;if(o===null)return null;if(o=o.shared,(ue&2)!==0){var l=o.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),o.pending=t,Qt(e,i)}return l=o.interleaved,l===null?(t.next=t,ga(o)):(t.next=l.next,l.next=t),o.interleaved=t,Qt(e,i)}function cs(e,t,i){if(t=t.updateQueue,t!==null&&(t=t.shared,(i&4194240)!==0)){var o=t.lanes;o&=e.pendingLanes,i|=o,t.lanes=i,Do(e,i)}}function ad(e,t){var i=e.updateQueue,o=e.alternate;if(o!==null&&(o=o.updateQueue,i===o)){var l=null,c=null;if(i=i.firstBaseUpdate,i!==null){do{var p={eventTime:i.eventTime,lane:i.lane,tag:i.tag,payload:i.payload,callback:i.callback,next:null};c===null?l=c=p:c=c.next=p,i=i.next}while(i!==null);c===null?l=c=t:c=c.next=t}else l=c=t;i={baseState:o.baseState,firstBaseUpdate:l,lastBaseUpdate:c,shared:o.shared,effects:o.effects},e.updateQueue=i;return}e=i.lastBaseUpdate,e===null?i.firstBaseUpdate=t:e.next=t,i.lastBaseUpdate=t}function ds(e,t,i,o){var l=e.updateQueue;fn=!1;var c=l.firstBaseUpdate,p=l.lastBaseUpdate,S=l.shared.pending;if(S!==null){l.shared.pending=null;var k=S,j=k.next;k.next=null,p===null?c=j:p.next=j,p=k;var F=e.alternate;F!==null&&(F=F.updateQueue,S=F.lastBaseUpdate,S!==p&&(S===null?F.firstBaseUpdate=j:S.next=j,F.lastBaseUpdate=k))}if(c!==null){var V=l.baseState;p=0,F=j=k=null,S=c;do{var R=S.lane,H=S.eventTime;if((o&R)===R){F!==null&&(F=F.next={eventTime:H,lane:0,tag:S.tag,payload:S.payload,callback:S.callback,next:null});e:{var $=e,Q=S;switch(R=t,H=i,Q.tag){case 1:if($=Q.payload,typeof $=="function"){V=$.call(H,V,R);break e}V=$;break e;case 3:$.flags=$.flags&-65537|128;case 0:if($=Q.payload,R=typeof $=="function"?$.call(H,V,R):$,R==null)break e;V=W({},V,R);break e;case 2:fn=!0}}S.callback!==null&&S.lane!==0&&(e.flags|=64,R=l.effects,R===null?l.effects=[S]:R.push(S))}else H={eventTime:H,lane:R,tag:S.tag,payload:S.payload,callback:S.callback,next:null},F===null?(j=F=H,k=V):F=F.next=H,p|=R;if(S=S.next,S===null){if(S=l.shared.pending,S===null)break;R=S,S=R.next,R.next=null,l.lastBaseUpdate=R,l.shared.pending=null}}while(!0);if(F===null&&(k=V),l.baseState=k,l.firstBaseUpdate=j,l.lastBaseUpdate=F,t=l.shared.interleaved,t!==null){l=t;do p|=l.lane,l=l.next;while(l!==t)}else c===null&&(l.shared.lanes=0);Vn|=p,e.lanes=p,e.memoizedState=V}}function ld(e,t,i){if(e=t.effects,t.effects=null,e!==null)for(t=0;ti?i:4,e(!0);var o=ka.transition;ka.transition={};try{e(!1),t()}finally{ge=i,ka.transition=o}}function Ed(){return xt().memoizedState}function uy(e,t,i){var o=yn(e);if(i={lane:o,action:i,hasEagerState:!1,eagerState:null,next:null},jd(e))Nd(t,i);else if(i=sd(e,t,i,o),i!==null){var l=tt();Dt(i,e,o,l),Md(i,t,o)}}function cy(e,t,i){var o=yn(e),l={lane:o,action:i,hasEagerState:!1,eagerState:null,next:null};if(jd(e))Nd(t,l);else{var c=e.alternate;if(e.lanes===0&&(c===null||c.lanes===0)&&(c=t.lastRenderedReducer,c!==null))try{var p=t.lastRenderedState,S=c(p,i);if(l.hasEagerState=!0,l.eagerState=S,At(S,p)){var k=t.interleaved;k===null?(l.next=l,ga(t)):(l.next=k.next,k.next=l),t.interleaved=l;return}}catch{}finally{}i=sd(e,t,l,o),i!==null&&(l=tt(),Dt(i,e,o,l),Md(i,t,o))}}function jd(e){var t=e.alternate;return e===De||t!==null&&t===De}function Nd(e,t){ii=ps=!0;var i=e.pending;i===null?t.next=t:(t.next=i.next,i.next=t),e.pending=t}function Md(e,t,i){if((i&4194240)!==0){var o=t.lanes;o&=e.pendingLanes,i|=o,t.lanes=i,Do(e,i)}}var ys={readContext:vt,useCallback:qe,useContext:qe,useEffect:qe,useImperativeHandle:qe,useInsertionEffect:qe,useLayoutEffect:qe,useMemo:qe,useReducer:qe,useRef:qe,useState:qe,useDebugValue:qe,useDeferredValue:qe,useTransition:qe,useMutableSource:qe,useSyncExternalStore:qe,useId:qe,unstable_isNewReconciler:!1},dy={readContext:vt,useCallback:function(e,t){return zt().memoizedState=[e,t===void 0?null:t],e},useContext:vt,useEffect:xd,useImperativeHandle:function(e,t,i){return i=i!=null?i.concat([e]):null,ms(4194308,4,kd.bind(null,t,e),i)},useLayoutEffect:function(e,t){return ms(4194308,4,e,t)},useInsertionEffect:function(e,t){return ms(4,2,e,t)},useMemo:function(e,t){var i=zt();return t=t===void 0?null:t,e=e(),i.memoizedState=[e,t],e},useReducer:function(e,t,i){var o=zt();return t=i!==void 0?i(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=uy.bind(null,De,e),[o.memoizedState,e]},useRef:function(e){var t=zt();return e={current:e},t.memoizedState=e},useState:yd,useDebugValue:Na,useDeferredValue:function(e){return zt().memoizedState=e},useTransition:function(){var e=yd(!1),t=e[0];return e=ly.bind(null,e[1]),zt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,i){var o=De,l=zt();if(Ae){if(i===void 0)throw Error(s(407));i=i()}else{if(i=t(),He===null)throw Error(s(349));(Fn&30)!==0||fd(o,t,i)}l.memoizedState=i;var c={value:i,getSnapshot:t};return l.queue=c,xd(pd.bind(null,o,c,e),[e]),o.flags|=2048,ai(9,hd.bind(null,o,c,i,t),void 0,null),i},useId:function(){var e=zt(),t=He.identifierPrefix;if(Ae){var i=Xt,o=Yt;i=(o&~(1<<32-Pt(o)-1)).toString(32)+i,t=":"+t+"R"+i,i=si++,0<\/script>",e=e.removeChild(e.firstChild)):typeof o.is=="string"?e=p.createElement(i,{is:o.is}):(e=p.createElement(i),i==="select"&&(p=e,o.multiple?p.multiple=!0:o.size&&(p.size=o.size))):e=p.createElementNS(e,i),e[It]=t,e[Zr]=o,Qd(e,t,!1,!1),t.stateNode=e;e:{switch(p=So(i,o),i){case"dialog":ke("cancel",e),ke("close",e),l=o;break;case"iframe":case"object":case"embed":ke("load",e),l=o;break;case"video":case"audio":for(l=0;lmr&&(t.flags|=128,o=!0,li(c,!1),t.lanes=4194304)}else{if(!o)if(e=fs(p),e!==null){if(t.flags|=128,o=!0,i=e.updateQueue,i!==null&&(t.updateQueue=i,t.flags|=4),li(c,!0),c.tail===null&&c.tailMode==="hidden"&&!p.alternate&&!Ae)return Ze(t),null}else 2*Ve()-c.renderingStartTime>mr&&i!==1073741824&&(t.flags|=128,o=!0,li(c,!1),t.lanes=4194304);c.isBackwards?(p.sibling=t.child,t.child=p):(i=c.last,i!==null?i.sibling=p:t.child=p,c.last=p)}return c.tail!==null?(t=c.tail,c.rendering=t,c.tail=t.sibling,c.renderingStartTime=Ve(),t.sibling=null,i=Me.current,we(Me,o?i&1|2:i&1),t):(Ze(t),null);case 22:case 23:return Ja(),o=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==o&&(t.flags|=8192),o&&(t.mode&1)!==0?(pt&1073741824)!==0&&(Ze(t),t.subtreeFlags&6&&(t.flags|=8192)):Ze(t),null;case 24:return null;case 25:return null}throw Error(s(156,t.tag))}function xy(e,t){switch(la(t),t.tag){case 1:return st(t.type)&&ts(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return dr(),Te(it),Te(Qe),Sa(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return xa(t),null;case 13:if(Te(Me),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));ar()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Te(Me),null;case 4:return dr(),null;case 10:return pa(t.type._context),null;case 22:case 23:return Ja(),null;case 24:return null;default:return null}}var Ss=!1,Je=!1,wy=typeof WeakSet=="function"?WeakSet:Set,K=null;function hr(e,t){var i=e.ref;if(i!==null)if(typeof i=="function")try{i(null)}catch(o){Re(e,t,o)}else i.current=null}function ba(e,t,i){try{i()}catch(o){Re(e,t,o)}}var Jd=!1;function Sy(e,t){if(Jo=bi,e=Dc(),Go(e)){if("selectionStart"in e)var i={start:e.selectionStart,end:e.selectionEnd};else e:{i=(i=e.ownerDocument)&&i.defaultView||window;var o=i.getSelection&&i.getSelection();if(o&&o.rangeCount!==0){i=o.anchorNode;var l=o.anchorOffset,c=o.focusNode;o=o.focusOffset;try{i.nodeType,c.nodeType}catch{i=null;break e}var p=0,S=-1,k=-1,j=0,F=0,V=e,R=null;t:for(;;){for(var H;V!==i||l!==0&&V.nodeType!==3||(S=p+l),V!==c||o!==0&&V.nodeType!==3||(k=p+o),V.nodeType===3&&(p+=V.nodeValue.length),(H=V.firstChild)!==null;)R=V,V=H;for(;;){if(V===e)break t;if(R===i&&++j===l&&(S=p),R===c&&++F===o&&(k=p),(H=V.nextSibling)!==null)break;V=R,R=V.parentNode}V=H}i=S===-1||k===-1?null:{start:S,end:k}}else i=null}i=i||{start:0,end:0}}else i=null;for(ea={focusedElem:e,selectionRange:i},bi=!1,K=t;K!==null;)if(t=K,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,K=e;else for(;K!==null;){t=K;try{var $=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if($!==null){var Q=$.memoizedProps,Ie=$.memoizedState,A=t.stateNode,T=A.getSnapshotBeforeUpdate(t.elementType===t.type?Q:jt(t.type,Q),Ie);A.__reactInternalSnapshotBeforeUpdate=T}break;case 3:var E=t.stateNode.containerInfo;E.nodeType===1?E.textContent="":E.nodeType===9&&E.documentElement&&E.removeChild(E.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(s(163))}}catch(O){Re(t,t.return,O)}if(e=t.sibling,e!==null){e.return=t.return,K=e;break}K=t.return}return $=Jd,Jd=!1,$}function ui(e,t,i){var o=t.updateQueue;if(o=o!==null?o.lastEffect:null,o!==null){var l=o=o.next;do{if((l.tag&e)===e){var c=l.destroy;l.destroy=void 0,c!==void 0&&ba(t,i,c)}l=l.next}while(l!==o)}}function ks(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var i=t=t.next;do{if((i.tag&e)===e){var o=i.create;i.destroy=o()}i=i.next}while(i!==t)}}function Ua(e){var t=e.ref;if(t!==null){var i=e.stateNode;switch(e.tag){case 5:e=i;break;default:e=i}typeof t=="function"?t(e):t.current=e}}function ef(e){var t=e.alternate;t!==null&&(e.alternate=null,ef(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[It],delete t[Zr],delete t[ia],delete t[ry],delete t[iy])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function tf(e){return e.tag===5||e.tag===3||e.tag===4}function nf(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||tf(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Wa(e,t,i){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?i.nodeType===8?i.parentNode.insertBefore(e,t):i.insertBefore(e,t):(i.nodeType===8?(t=i.parentNode,t.insertBefore(e,i)):(t=i,t.appendChild(e)),i=i._reactRootContainer,i!=null||t.onclick!==null||(t.onclick=Ji));else if(o!==4&&(e=e.child,e!==null))for(Wa(e,t,i),e=e.sibling;e!==null;)Wa(e,t,i),e=e.sibling}function Ha(e,t,i){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?i.insertBefore(e,t):i.appendChild(e);else if(o!==4&&(e=e.child,e!==null))for(Ha(e,t,i),e=e.sibling;e!==null;)Ha(e,t,i),e=e.sibling}var Ke=null,Nt=!1;function pn(e,t,i){for(i=i.child;i!==null;)rf(e,t,i),i=i.sibling}function rf(e,t,i){if(Vt&&typeof Vt.onCommitFiberUnmount=="function")try{Vt.onCommitFiberUnmount(Vi,i)}catch{}switch(i.tag){case 5:Je||hr(i,t);case 6:var o=Ke,l=Nt;Ke=null,pn(e,t,i),Ke=o,Nt=l,Ke!==null&&(Nt?(e=Ke,i=i.stateNode,e.nodeType===8?e.parentNode.removeChild(i):e.removeChild(i)):Ke.removeChild(i.stateNode));break;case 18:Ke!==null&&(Nt?(e=Ke,i=i.stateNode,e.nodeType===8?ra(e.parentNode,i):e.nodeType===1&&ra(e,i),br(e)):ra(Ke,i.stateNode));break;case 4:o=Ke,l=Nt,Ke=i.stateNode.containerInfo,Nt=!0,pn(e,t,i),Ke=o,Nt=l;break;case 0:case 11:case 14:case 15:if(!Je&&(o=i.updateQueue,o!==null&&(o=o.lastEffect,o!==null))){l=o=o.next;do{var c=l,p=c.destroy;c=c.tag,p!==void 0&&((c&2)!==0||(c&4)!==0)&&ba(i,t,p),l=l.next}while(l!==o)}pn(e,t,i);break;case 1:if(!Je&&(hr(i,t),o=i.stateNode,typeof o.componentWillUnmount=="function"))try{o.props=i.memoizedProps,o.state=i.memoizedState,o.componentWillUnmount()}catch(S){Re(i,t,S)}pn(e,t,i);break;case 21:pn(e,t,i);break;case 22:i.mode&1?(Je=(o=Je)||i.memoizedState!==null,pn(e,t,i),Je=o):pn(e,t,i);break;default:pn(e,t,i)}}function sf(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var i=e.stateNode;i===null&&(i=e.stateNode=new wy),t.forEach(function(o){var l=My.bind(null,e,o);i.has(o)||(i.add(o),o.then(l,l))})}}function Mt(e,t){var i=t.deletions;if(i!==null)for(var o=0;ol&&(l=p),o&=~c}if(o=l,o=Ve()-o,o=(120>o?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*Ty(o/1960))-o,10e?16:e,gn===null)var o=!1;else{if(e=gn,gn=null,Es=0,(ue&6)!==0)throw Error(s(331));var l=ue;for(ue|=4,K=e.current;K!==null;){var c=K,p=c.child;if((K.flags&16)!==0){var S=c.deletions;if(S!==null){for(var k=0;kVe()-$a?_n(e,0):Ka|=i),lt(e,t)}function vf(e,t){t===0&&((e.mode&1)===0?t=1:(t=_i,_i<<=1,(_i&130023424)===0&&(_i=4194304)));var i=tt();e=Qt(e,t),e!==null&&(Ir(e,t,i),lt(e,i))}function Ny(e){var t=e.memoizedState,i=0;t!==null&&(i=t.retryLane),vf(e,i)}function My(e,t){var i=0;switch(e.tag){case 13:var o=e.stateNode,l=e.memoizedState;l!==null&&(i=l.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(s(314))}o!==null&&o.delete(t),vf(e,i)}var xf;xf=function(e,t,i){if(e!==null)if(e.memoizedProps!==t.pendingProps||it.current)ot=!0;else{if((e.lanes&i)===0&&(t.flags&128)===0)return ot=!1,yy(e,t,i);ot=(e.flags&131072)!==0}else ot=!1,Ae&&(t.flags&1048576)!==0&&qc(t,ss,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;ws(e,t),e=t.pendingProps;var l=ir(t,Qe.current);cr(t,i),l=Ca(null,t,o,e,l,i);var c=Pa();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,st(o)?(c=!0,ns(t)):c=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,ya(t),l.updater=vs,t.stateNode=l,l._reactInternals=t,Da(t,o,e,i),t=Va(null,t,o,!0,c,i)):(t.tag=0,Ae&&c&&aa(t),et(null,t,l,i),t=t.child),t;case 16:o=t.elementType;e:{switch(ws(e,t),e=t.pendingProps,l=o._init,o=l(o._payload),t.type=o,l=t.tag=Ly(o),e=jt(o,e),l){case 0:t=Fa(null,t,o,e,i);break e;case 1:t=Hd(null,t,o,e,i);break e;case 11:t=Od(null,t,o,e,i);break e;case 14:t=Bd(null,t,o,jt(o.type,e),i);break e}throw Error(s(306,o,""))}return t;case 0:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:jt(o,l),Fa(e,t,o,l,i);case 1:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:jt(o,l),Hd(e,t,o,l,i);case 3:e:{if(Gd(t),e===null)throw Error(s(387));o=t.pendingProps,c=t.memoizedState,l=c.element,od(e,t),ds(t,o,null,i);var p=t.memoizedState;if(o=p.element,c.isDehydrated)if(c={element:o,isDehydrated:!1,cache:p.cache,pendingSuspenseBoundaries:p.pendingSuspenseBoundaries,transitions:p.transitions},t.updateQueue.baseState=c,t.memoizedState=c,t.flags&256){l=fr(Error(s(423)),t),t=Kd(e,t,o,i,l);break e}else if(o!==l){l=fr(Error(s(424)),t),t=Kd(e,t,o,i,l);break e}else for(ht=ln(t.stateNode.containerInfo.firstChild),ft=t,Ae=!0,Et=null,i=id(t,null,o,i),t.child=i;i;)i.flags=i.flags&-3|4096,i=i.sibling;else{if(ar(),o===l){t=Zt(e,t,i);break e}et(e,t,o,i)}t=t.child}return t;case 5:return ud(t),e===null&&ca(t),o=t.type,l=t.pendingProps,c=e!==null?e.memoizedProps:null,p=l.children,ta(o,l)?p=null:c!==null&&ta(o,c)&&(t.flags|=32),Wd(e,t),et(e,t,p,i),t.child;case 6:return e===null&&ca(t),null;case 13:return $d(e,t,i);case 4:return va(t,t.stateNode.containerInfo),o=t.pendingProps,e===null?t.child=lr(t,null,o,i):et(e,t,o,i),t.child;case 11:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:jt(o,l),Od(e,t,o,l,i);case 7:return et(e,t,t.pendingProps,i),t.child;case 8:return et(e,t,t.pendingProps.children,i),t.child;case 12:return et(e,t,t.pendingProps.children,i),t.child;case 10:e:{if(o=t.type._context,l=t.pendingProps,c=t.memoizedProps,p=l.value,we(ls,o._currentValue),o._currentValue=p,c!==null)if(At(c.value,p)){if(c.children===l.children&&!it.current){t=Zt(e,t,i);break e}}else for(c=t.child,c!==null&&(c.return=t);c!==null;){var S=c.dependencies;if(S!==null){p=c.child;for(var k=S.firstContext;k!==null;){if(k.context===o){if(c.tag===1){k=qt(-1,i&-i),k.tag=2;var j=c.updateQueue;if(j!==null){j=j.shared;var F=j.pending;F===null?k.next=k:(k.next=F.next,F.next=k),j.pending=k}}c.lanes|=i,k=c.alternate,k!==null&&(k.lanes|=i),ma(c.return,i,t),S.lanes|=i;break}k=k.next}}else if(c.tag===10)p=c.type===t.type?null:c.child;else if(c.tag===18){if(p=c.return,p===null)throw Error(s(341));p.lanes|=i,S=p.alternate,S!==null&&(S.lanes|=i),ma(p,i,t),p=c.sibling}else p=c.child;if(p!==null)p.return=c;else for(p=c;p!==null;){if(p===t){p=null;break}if(c=p.sibling,c!==null){c.return=p.return,p=c;break}p=p.return}c=p}et(e,t,l.children,i),t=t.child}return t;case 9:return l=t.type,o=t.pendingProps.children,cr(t,i),l=vt(l),o=o(l),t.flags|=1,et(e,t,o,i),t.child;case 14:return o=t.type,l=jt(o,t.pendingProps),l=jt(o.type,l),Bd(e,t,o,l,i);case 15:return bd(e,t,t.type,t.pendingProps,i);case 17:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:jt(o,l),ws(e,t),t.tag=1,st(o)?(e=!0,ns(t)):e=!1,cr(t,i),Ld(t,o,l),Da(t,o,l,i),Va(null,t,o,!0,e,i);case 19:return Xd(e,t,i);case 22:return Ud(e,t,i)}throw Error(s(156,t.tag))};function wf(e,t){return Zu(e,t)}function Dy(e,t,i,o){this.tag=e,this.key=i,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function St(e,t,i,o){return new Dy(e,t,i,o)}function tl(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Ly(e){if(typeof e=="function")return tl(e)?1:0;if(e!=null){if(e=e.$$typeof,e===ye)return 11;if(e===_e)return 14}return 2}function xn(e,t){var i=e.alternate;return i===null?(i=St(e.tag,t,e.key,e.mode),i.elementType=e.elementType,i.type=e.type,i.stateNode=e.stateNode,i.alternate=e,e.alternate=i):(i.pendingProps=t,i.type=e.type,i.flags=0,i.subtreeFlags=0,i.deletions=null),i.flags=e.flags&14680064,i.childLanes=e.childLanes,i.lanes=e.lanes,i.child=e.child,i.memoizedProps=e.memoizedProps,i.memoizedState=e.memoizedState,i.updateQueue=e.updateQueue,t=e.dependencies,i.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},i.sibling=e.sibling,i.index=e.index,i.ref=e.ref,i}function Ds(e,t,i,o,l,c){var p=2;if(o=e,typeof e=="function")tl(e)&&(p=1);else if(typeof e=="string")p=5;else e:switch(e){case oe:return On(i.children,l,c,t);case J:p=8,l|=8;break;case re:return e=St(12,i,t,l|2),e.elementType=re,e.lanes=c,e;case je:return e=St(13,i,t,l),e.elementType=je,e.lanes=c,e;case Le:return e=St(19,i,t,l),e.elementType=Le,e.lanes=c,e;case Ne:return Ls(i,l,c,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case q:p=10;break e;case ce:p=9;break e;case ye:p=11;break e;case _e:p=14;break e;case Se:p=16,o=null;break e}throw Error(s(130,e==null?e:typeof e,""))}return t=St(p,i,t,l),t.elementType=e,t.type=o,t.lanes=c,t}function On(e,t,i,o){return e=St(7,e,o,t),e.lanes=i,e}function Ls(e,t,i,o){return e=St(22,e,o,t),e.elementType=Ne,e.lanes=i,e.stateNode={isHidden:!1},e}function nl(e,t,i){return e=St(6,e,null,t),e.lanes=i,e}function rl(e,t,i){return t=St(4,e.children!==null?e.children:[],e.key,t),t.lanes=i,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Ry(e,t,i,o,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Mo(0),this.expirationTimes=Mo(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Mo(0),this.identifierPrefix=o,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function il(e,t,i,o,l,c,p,S,k){return e=new Ry(e,t,i,S,k),t===1?(t=1,c===!0&&(t|=8)):t=0,c=St(3,null,null,t),e.current=c,c.stateNode=e,c.memoizedState={element:o,isDehydrated:i,cache:null,transitions:null,pendingSuspenseBoundaries:null},ya(c),e}function Fy(e,t,i){var o=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(r){console.error(r)}}return n(),cl.exports=Ky(),cl.exports}var Ff;function Yy(){if(Ff)return Os;Ff=1;var n=$y();return Os.createRoot=n.createRoot,Os.hydrateRoot=n.hydrateRoot,Os}var Xy=Yy();const Qy=Jh(Xy),nu=_.createContext({});function ru(n){const r=_.useRef(null);return r.current===null&&(r.current=n()),r.current}const qy=typeof window<"u",ep=qy?_.useLayoutEffect:_.useEffect,uo=_.createContext(null);function iu(n,r){n.indexOf(r)===-1&&n.push(r)}function Js(n,r){const s=n.indexOf(r);s>-1&&n.splice(s,1)}const Gt=(n,r,s)=>s>r?r:s{};const Cn={},tp=n=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(n);function np(n){return typeof n=="object"&&n!==null}const rp=n=>/^0[^.\s]+$/u.test(n);function ip(n){let r;return()=>(r===void 0&&(r=n()),r)}const Tt=n=>n,Zy=(n,r)=>s=>r(n(s)),Pi=(...n)=>n.reduce(Zy),Si=(n,r,s)=>{const a=r-n;return a===0?1:(s-n)/a};class ou{constructor(){this.subscriptions=[]}add(r){return iu(this.subscriptions,r),()=>Js(this.subscriptions,r)}notify(r,s,a){const u=this.subscriptions.length;if(u)if(u===1)this.subscriptions[0](r,s,a);else for(let f=0;fn*1e3,kt=n=>n/1e3;function sp(n,r){return r?n*(1e3/r):0}const op=(n,r,s)=>(((1-3*s+3*r)*n+(3*s-6*r))*n+3*r)*n,Jy=1e-7,e0=12;function t0(n,r,s,a,u){let f,d,h=0;do d=r+(s-r)/2,f=op(d,a,u)-n,f>0?s=d:r=d;while(Math.abs(f)>Jy&&++ht0(f,0,1,n,s);return f=>f===0||f===1?f:op(u(f),r,a)}const ap=n=>r=>r<=.5?n(2*r)/2:(2-n(2*(1-r)))/2,lp=n=>r=>1-n(1-r),up=Ai(.33,1.53,.69,.99),au=lp(up),cp=ap(au),dp=n=>n>=1?1:(n*=2)<1?.5*au(n):.5*(2-Math.pow(2,-10*(n-1))),lu=n=>1-Math.sin(Math.acos(n)),fp=lp(lu),hp=ap(lu),n0=Ai(.42,0,1,1),r0=Ai(0,0,.58,1),pp=Ai(.42,0,.58,1),i0=n=>Array.isArray(n)&&typeof n[0]!="number",mp=n=>Array.isArray(n)&&typeof n[0]=="number",s0={linear:Tt,easeIn:n0,easeInOut:pp,easeOut:r0,circIn:lu,circInOut:hp,circOut:fp,backIn:au,backInOut:cp,backOut:up,anticipate:dp},o0=n=>typeof n=="string",Vf=n=>{if(mp(n)){su(n.length===4);const[r,s,a,u]=n;return Ai(r,s,a,u)}else if(o0(n))return s0[n];return n},Bs=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"];function a0(n,r){let s=new Set,a=new Set,u=!1,f=!1;const d=new WeakSet;let h={delta:0,timestamp:0,isProcessing:!1};function g(y){d.has(y)&&(x.schedule(y),n()),y(h)}const x={schedule:(y,v=!1,w=!1)=>{const N=w&&u?s:a;return v&&d.add(y),N.add(y),y},cancel:y=>{a.delete(y),d.delete(y)},process:y=>{if(h=y,u){f=!0;return}u=!0;const v=s;s=a,a=v,s.forEach(g),s.clear(),u=!1,f&&(f=!1,x.process(y))}};return x}const l0=40;function gp(n,r){let s=!1,a=!0;const u={delta:0,timestamp:0,isProcessing:!1},f=()=>s=!0,d=Bs.reduce((B,b)=>(B[b]=a0(f),B),{}),{setup:h,read:g,resolveKeyframes:x,preUpdate:y,update:v,preRender:w,render:C,postRender:N}=d,D=()=>{const B=Cn.useManualTiming,b=B?u.timestamp:performance.now();s=!1,B||(u.delta=a?1e3/60:Math.max(Math.min(b-u.timestamp,l0),1)),u.timestamp=b,u.isProcessing=!0,h.process(u),g.process(u),x.process(u),y.process(u),v.process(u),w.process(u),C.process(u),N.process(u),u.isProcessing=!1,s&&r&&(a=!1,n(D))},M=()=>{s=!0,a=!0,u.isProcessing||n(D)};return{schedule:Bs.reduce((B,b)=>{const G=d[b];return B[b]=(ie,oe=!1,J=!1)=>(s||M(),G.schedule(ie,oe,J)),B},{}),cancel:B=>{for(let b=0;b(Gs===void 0&&nt.set(Ye.isProcessing||Cn.useManualTiming?Ye.timestamp:performance.now()),Gs),set:n=>{Gs=n,queueMicrotask(u0)}},yp=n=>r=>typeof r=="string"&&r.startsWith(n),vp=yp("--"),c0=yp("var(--"),uu=n=>c0(n)?d0.test(n.split("/*")[0].trim()):!1,d0=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;function If(n){return typeof n!="string"?!1:n.split("/*")[0].includes("var(--")}const Ar={test:n=>typeof n=="number",parse:parseFloat,transform:n=>n},ki={...Ar,transform:n=>Gt(0,1,n)},bs={...Ar,default:1},yi=n=>Math.round(n*1e5)/1e5,cu=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;function f0(n){return n==null}const h0=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,du=(n,r)=>s=>!!(typeof s=="string"&&h0.test(s)&&s.startsWith(n)||r&&!f0(s)&&Object.prototype.hasOwnProperty.call(s,r)),xp=(n,r,s)=>a=>{if(typeof a!="string")return a;const[u,f,d,h]=a.match(cu);return{[n]:parseFloat(u),[r]:parseFloat(f),[s]:parseFloat(d),alpha:h!==void 0?parseFloat(h):1}},p0=n=>Gt(0,255,n),pl={...Ar,transform:n=>Math.round(p0(n))},Un={test:du("rgb","red"),parse:xp("red","green","blue"),transform:({red:n,green:r,blue:s,alpha:a=1})=>"rgba("+pl.transform(n)+", "+pl.transform(r)+", "+pl.transform(s)+", "+yi(ki.transform(a))+")"};function m0(n){let r="",s="",a="",u="";return n.length>5?(r=n.substring(1,3),s=n.substring(3,5),a=n.substring(5,7),u=n.substring(7,9)):(r=n.substring(1,2),s=n.substring(2,3),a=n.substring(3,4),u=n.substring(4,5),r+=r,s+=s,a+=a,u+=u),{red:parseInt(r,16),green:parseInt(s,16),blue:parseInt(a,16),alpha:u?parseInt(u,16)/255:1}}const Nl={test:du("#"),parse:m0,transform:Un.transform},Ei=n=>({test:r=>typeof r=="string"&&r.endsWith(n)&&r.split(" ").length===1,parse:parseFloat,transform:r=>`${r}${n}`}),Sn=Ei("deg"),Ht=Ei("%"),Y=Ei("px"),g0=Ei("vh"),y0=Ei("vw"),_f={...Ht,parse:n=>Ht.parse(n)/100,transform:n=>Ht.transform(n*100)},xr={test:du("hsl","hue"),parse:xp("hue","saturation","lightness"),transform:({hue:n,saturation:r,lightness:s,alpha:a=1})=>"hsla("+Math.round(n)+", "+Ht.transform(yi(r))+", "+Ht.transform(yi(s))+", "+yi(ki.transform(a))+")"},Oe={test:n=>Un.test(n)||Nl.test(n)||xr.test(n),parse:n=>Un.test(n)?Un.parse(n):xr.test(n)?xr.parse(n):Nl.parse(n),transform:n=>typeof n=="string"?n:n.hasOwnProperty("red")?Un.transform(n):xr.transform(n),getAnimatableNone:n=>{const r=Oe.parse(n);return r.alpha=0,Oe.transform(r)}},v0=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;function x0(n){var r,s;return isNaN(n)&&typeof n=="string"&&(((r=n.match(cu))==null?void 0:r.length)||0)+(((s=n.match(v0))==null?void 0:s.length)||0)>0}const wp="number",Sp="color",w0="var",S0="var(",zf="${}",k0=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function Cr(n){const r=n.toString(),s=[],a={color:[],number:[],var:[]},u=[];let f=0;const h=r.replace(k0,g=>(Oe.test(g)?(a.color.push(f),u.push(Sp),s.push(Oe.parse(g))):g.startsWith(S0)?(a.var.push(f),u.push(w0),s.push(g)):(a.number.push(f),u.push(wp),s.push(parseFloat(g))),++f,zf)).split(zf);return{values:s,split:h,indexes:a,types:u}}function T0(n){return Cr(n).values}function kp({split:n,types:r}){const s=n.length;return a=>{let u="";for(let f=0;ftypeof n=="number"?0:Oe.test(n)?Oe.getAnimatableNone(n):n,A0=(n,r)=>typeof n=="number"?r!=null&&r.trim().endsWith("/")?n:0:P0(n);function E0(n){const r=Cr(n);return kp(r)(r.values.map((a,u)=>A0(a,r.split[u])))}const Ft={test:x0,parse:T0,createTransformer:C0,getAnimatableNone:E0};function ml(n,r,s){return s<0&&(s+=1),s>1&&(s-=1),s<1/6?n+(r-n)*6*s:s<1/2?r:s<2/3?n+(r-n)*(2/3-s)*6:n}function j0({hue:n,saturation:r,lightness:s,alpha:a}){n/=360,r/=100,s/=100;let u=0,f=0,d=0;if(!r)u=f=d=s;else{const h=s<.5?s*(1+r):s+r-s*r,g=2*s-h;u=ml(g,h,n+1/3),f=ml(g,h,n),d=ml(g,h,n-1/3)}return{red:Math.round(u*255),green:Math.round(f*255),blue:Math.round(d*255),alpha:a}}function eo(n,r){return s=>s>0?r:n}const Ce=(n,r,s)=>n+(r-n)*s,gl=(n,r,s)=>{const a=n*n,u=s*(r*r-a)+a;return u<0?0:Math.sqrt(u)},N0=[Nl,Un,xr],M0=n=>N0.find(r=>r.test(n));function Of(n){const r=M0(n);if(!r)return!1;let s=r.parse(n);return r===xr&&(s=j0(s)),s}const Bf=(n,r)=>{const s=Of(n),a=Of(r);if(!s||!a)return eo(n,r);const u={...s};return f=>(u.red=gl(s.red,a.red,f),u.green=gl(s.green,a.green,f),u.blue=gl(s.blue,a.blue,f),u.alpha=Ce(s.alpha,a.alpha,f),Un.transform(u))},Ml=new Set(["none","hidden"]);function D0(n,r){return Ml.has(n)?s=>s<=0?n:r:s=>s>=1?r:n}function L0(n,r){return s=>Ce(n,r,s)}function fu(n){return typeof n=="number"?L0:typeof n=="string"?uu(n)?eo:Oe.test(n)?Bf:V0:Array.isArray(n)?Tp:typeof n=="object"?Oe.test(n)?Bf:R0:eo}function Tp(n,r){const s=[...n],a=s.length,u=n.map((f,d)=>fu(f)(f,r[d]));return f=>{for(let d=0;d{for(const f in a)s[f]=a[f](u);return s}}function F0(n,r){const s=[],a={color:0,var:0,number:0};for(let u=0;u{const s=Ft.createTransformer(r),a=Cr(n),u=Cr(r);return a.indexes.var.length===u.indexes.var.length&&a.indexes.color.length===u.indexes.color.length&&a.indexes.number.length>=u.indexes.number.length?Ml.has(n)&&!u.values.length||Ml.has(r)&&!a.values.length?D0(n,r):Pi(Tp(F0(a,u),u.values),s):eo(n,r)};function Cp(n,r,s){return typeof n=="number"&&typeof r=="number"&&typeof s=="number"?Ce(n,r,s):fu(n)(n,r)}const I0=n=>{const r=({timestamp:s})=>n(s);return{start:(s=!0)=>ve.update(r,s),stop:()=>Pn(r),now:()=>Ye.isProcessing?Ye.timestamp:nt.now()}},Pp=(n,r,s=10)=>{let a="";const u=Math.max(Math.round(r/s),2);for(let f=0;f=to?1/0:r}function _0(n,r=100,s){const a=s({...n,keyframes:[0,r]}),u=Math.min(hu(a),to);return{type:"keyframes",ease:f=>a.next(u*f).value/r,duration:kt(u)}}const Fe={stiffness:100,damping:10,mass:1,velocity:0,duration:800,bounce:.3,visualDuration:.3,restSpeed:{granular:.01,default:2},restDelta:{granular:.005,default:.5},minDuration:.01,maxDuration:10,minDamping:.05,maxDamping:1};function Dl(n,r){return n*Math.sqrt(1-r*r)}const z0=12;function O0(n,r,s){let a=s;for(let u=1;u{const y=x*d,v=y*n,w=y-s,C=Dl(x,d),N=Math.exp(-v);return yl-w/C*N},f=x=>{const v=x*d*n,w=v*s+s,C=Math.pow(d,2)*Math.pow(x,2)*n,N=Math.exp(-v),D=Dl(Math.pow(x,2),d);return(-u(x)+yl>0?-1:1)*((w-C)*N)/D}):(u=x=>{const y=Math.exp(-x*n),v=(x-s)*n+1;return-yl+y*v},f=x=>{const y=Math.exp(-x*n),v=(s-x)*(n*n);return y*v});const h=5/n,g=O0(u,f,h);if(n=mt(n),isNaN(g))return{stiffness:Fe.stiffness,damping:Fe.damping,duration:n};{const x=Math.pow(g,2)*a;return{stiffness:x,damping:d*2*Math.sqrt(a*x),duration:n}}}const b0=["duration","bounce"],U0=["stiffness","damping","mass"];function bf(n,r){return r.some(s=>n[s]!==void 0)}function W0(n){let r={velocity:Fe.velocity,stiffness:Fe.stiffness,damping:Fe.damping,mass:Fe.mass,isResolvedFromDuration:!1,...n};if(!bf(n,U0)&&bf(n,b0))if(r.velocity=0,n.visualDuration){const s=n.visualDuration,a=2*Math.PI/(s*1.2),u=a*a,f=2*Gt(.05,1,1-(n.bounce||0))*Math.sqrt(u);r={...r,mass:Fe.mass,stiffness:u,damping:f}}else{const s=B0({...n,velocity:0});r={...r,...s,mass:Fe.mass},r.isResolvedFromDuration=!0}return r}function no(n=Fe.visualDuration,r=Fe.bounce){const s=typeof n!="object"?{visualDuration:n,keyframes:[0,1],bounce:r}:n;let{restSpeed:a,restDelta:u}=s;const f=s.keyframes[0],d=s.keyframes[s.keyframes.length-1],h={done:!1,value:f},{stiffness:g,damping:x,mass:y,duration:v,velocity:w,isResolvedFromDuration:C}=W0({...s,velocity:-kt(s.velocity||0)}),N=w||0,D=x/(2*Math.sqrt(g*y)),M=d-f,I=kt(Math.sqrt(g/y)),U=Math.abs(M)<5;a||(a=U?Fe.restSpeed.granular:Fe.restSpeed.default),u||(u=U?Fe.restDelta.granular:Fe.restDelta.default);let B,b,G,ie,oe,J;if(D<1)G=Dl(I,D),ie=(N+D*I*M)/G,B=q=>{const ce=Math.exp(-D*I*q);return d-ce*(ie*Math.sin(G*q)+M*Math.cos(G*q))},oe=D*I*ie+M*G,J=D*I*M-ie*G,b=q=>Math.exp(-D*I*q)*(oe*Math.sin(G*q)+J*Math.cos(G*q));else if(D===1){B=ce=>d-Math.exp(-I*ce)*(M+(N+I*M)*ce);const q=N+I*M;b=ce=>Math.exp(-I*ce)*(I*q*ce-N)}else{const q=I*Math.sqrt(D*D-1);B=Le=>{const _e=Math.exp(-D*I*Le),Se=Math.min(q*Le,300);return d-_e*((N+D*I*M)*Math.sinh(Se)+q*M*Math.cosh(Se))/q};const ce=(N+D*I*M)/q,ye=D*I*ce-M*q,je=D*I*M-ce*q;b=Le=>{const _e=Math.exp(-D*I*Le),Se=Math.min(q*Le,300);return _e*(ye*Math.sinh(Se)+je*Math.cosh(Se))}}const re={calculatedDuration:C&&v||null,velocity:q=>mt(b(q)),next:q=>{if(!C&&D<1){const ye=Math.exp(-D*I*q),je=Math.sin(G*q),Le=Math.cos(G*q),_e=d-ye*(ie*je+M*Le),Se=mt(ye*(oe*je+J*Le));return h.done=Math.abs(Se)<=a&&Math.abs(d-_e)<=u,h.value=h.done?d:_e,h}const ce=B(q);if(C)h.done=q>=v;else{const ye=mt(b(q));h.done=Math.abs(ye)<=a&&Math.abs(d-ce)<=u}return h.value=h.done?d:ce,h},toString:()=>{const q=Math.min(hu(re),to),ce=Pp(ye=>re.next(q*ye).value,q,30);return q+"ms "+ce},toTransition:()=>{}};return re}no.applyToOptions=n=>{const r=_0(n,100,no);return n.ease=r.ease,n.duration=mt(r.duration),n.type="keyframes",n};const H0=5;function Ap(n,r,s){const a=Math.max(r-H0,0);return sp(s-n(a),r-a)}function Ll({keyframes:n,velocity:r=0,power:s=.8,timeConstant:a=325,bounceDamping:u=10,bounceStiffness:f=500,modifyTarget:d,min:h,max:g,restDelta:x=.5,restSpeed:y}){const v=n[0],w={done:!1,value:v},C=J=>h!==void 0&&Jg,N=J=>h===void 0?g:g===void 0||Math.abs(h-J)-D*Math.exp(-J/a),B=J=>I+U(J),b=J=>{const re=U(J),q=B(J);w.done=Math.abs(re)<=x,w.value=w.done?I:q};let G,ie;const oe=J=>{C(w.value)&&(G=J,ie=no({keyframes:[w.value,N(w.value)],velocity:Ap(B,J,w.value),damping:u,stiffness:f,restDelta:x,restSpeed:y}))};return oe(0),{calculatedDuration:null,next:J=>{let re=!1;return!ie&&G===void 0&&(re=!0,b(J),oe(J)),G!==void 0&&J>=G?ie.next(J-G):(!re&&b(J),w)}}}function G0(n,r,s){const a=[],u=s||Cn.mix||Cp,f=n.length-1;for(let d=0;dr[0];if(f===2&&r[0]===r[1])return()=>r[1];const d=n[0]===n[1];n[0]>n[f-1]&&(n=[...n].reverse(),r=[...r].reverse());const h=G0(r,a,u),g=h.length,x=y=>{if(d&&y1)for(;vx(Gt(n[0],n[f-1],y)):x}function $0(n,r){const s=n[n.length-1];for(let a=1;a<=r;a++){const u=Si(0,r,a);n.push(Ce(s,1,u))}}function Y0(n){const r=[0];return $0(r,n.length-1),r}function X0(n,r){return n.map(s=>s*r)}function Q0(n,r){return n.map(()=>r||pp).splice(0,n.length-1)}function vi({duration:n=300,keyframes:r,times:s,ease:a="easeInOut"}){const u=i0(a)?a.map(Vf):Vf(a),f={done:!1,value:r[0]},d=X0(s&&s.length===r.length?s:Y0(r),n),h=K0(d,r,{ease:Array.isArray(u)?u:Q0(r,u)});return{calculatedDuration:n,next:g=>(f.value=h(g),f.done=g>=n,f)}}const q0=n=>n!==null;function co(n,{repeat:r,repeatType:s="loop"},a,u=1){const f=n.filter(q0),h=u<0||r&&s!=="loop"&&r%2===1?0:f.length-1;return!h||a===void 0?f[h]:a}const Z0={decay:Ll,inertia:Ll,tween:vi,keyframes:vi,spring:no};function Ep(n){typeof n.type=="string"&&(n.type=Z0[n.type])}class pu{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(r=>{this.resolve=r})}notifyFinished(){this.resolve()}then(r,s){return this.finished.then(r,s)}}const J0=n=>n/100;class ro extends pu{constructor(r){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.delayState={done:!1,value:void 0},this.stop=()=>{var a,u;const{motionValue:s}=this.options;s&&s.updatedAt!==nt.now()&&this.tick(nt.now()),this.isStopped=!0,this.state!=="idle"&&(this.teardown(),(u=(a=this.options).onStop)==null||u.call(a))},this.options=r,this.initAnimation(),this.play(),r.autoplay===!1&&this.pause()}initAnimation(){const{options:r}=this;Ep(r);const{type:s=vi,repeat:a=0,repeatDelay:u=0,repeatType:f,velocity:d=0}=r;let{keyframes:h}=r;const g=s||vi;g!==vi&&typeof h[0]!="number"&&(this.mixKeyframes=Pi(J0,Cp(h[0],h[1])),h=[0,100]);const x=g({...r,keyframes:h});f==="mirror"&&(this.mirroredGenerator=g({...r,keyframes:[...h].reverse(),velocity:-d})),x.calculatedDuration===null&&(x.calculatedDuration=hu(x));const{calculatedDuration:y}=x;this.calculatedDuration=y,this.resolvedDuration=y+u,this.totalDuration=this.resolvedDuration*(a+1)-u,this.generator=x}updateTime(r){const s=Math.round(r-this.startTime)*this.playbackSpeed;this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=s}tick(r,s=!1){const{generator:a,totalDuration:u,mixKeyframes:f,mirroredGenerator:d,resolvedDuration:h,calculatedDuration:g}=this;if(this.startTime===null)return a.next(0);const{delay:x=0,keyframes:y,repeat:v,repeatType:w,repeatDelay:C,type:N,onUpdate:D,finalKeyframe:M}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,r):this.speed<0&&(this.startTime=Math.min(r-u/this.speed,this.startTime)),s?this.currentTime=r:this.updateTime(r);const I=this.currentTime-x*(this.playbackSpeed>=0?1:-1),U=this.playbackSpeed>=0?I<0:I>u;this.currentTime=Math.max(I,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=u);let B=this.currentTime,b=a;if(v){const J=Math.min(this.currentTime,u)/h;let re=Math.floor(J),q=J%1;!q&&J>=1&&(q=1),q===1&&re--,re=Math.min(re,v+1),!!(re%2)&&(w==="reverse"?(q=1-q,C&&(q-=C/h)):w==="mirror"&&(b=d)),B=Gt(0,1,q)*h}let G;U?(this.delayState.value=y[0],G=this.delayState):G=b.next(B),f&&!U&&(G.value=f(G.value));let{done:ie}=G;!U&&g!==null&&(ie=this.playbackSpeed>=0?this.currentTime>=u:this.currentTime<=0);const oe=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&ie);return oe&&N!==Ll&&(G.value=co(y,this.options,M,this.speed)),D&&D(G.value),oe&&this.finish(),G}then(r,s){return this.finished.then(r,s)}get duration(){return kt(this.calculatedDuration)}get iterationDuration(){const{delay:r=0}=this.options||{};return this.duration+kt(r)}get time(){return kt(this.currentTime)}set time(r){r=mt(r),this.currentTime=r,this.startTime===null||this.holdTime!==null||this.playbackSpeed===0?this.holdTime=r:this.driver&&(this.startTime=this.driver.now()-r/this.playbackSpeed),this.driver?this.driver.start(!1):(this.startTime=0,this.state="paused",this.holdTime=r,this.tick(r))}getGeneratorVelocity(){const r=this.currentTime;if(r<=0)return this.options.velocity||0;if(this.generator.velocity)return this.generator.velocity(r);const s=this.generator.next(r).value;return Ap(a=>this.generator.next(a).value,r,s)}get speed(){return this.playbackSpeed}set speed(r){const s=this.playbackSpeed!==r;s&&this.driver&&this.updateTime(nt.now()),this.playbackSpeed=r,s&&this.driver&&(this.time=kt(this.currentTime))}play(){var u,f;if(this.isStopped)return;const{driver:r=I0,startTime:s}=this.options;this.driver||(this.driver=r(d=>this.tick(d))),(f=(u=this.options).onPlay)==null||f.call(u);const a=this.driver.now();this.state==="finished"?(this.updateFinished(),this.startTime=a):this.holdTime!==null?this.startTime=a-this.holdTime:this.startTime||(this.startTime=s??a),this.state==="finished"&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(nt.now()),this.holdTime=this.currentTime}complete(){this.state!=="running"&&this.play(),this.state="finished",this.holdTime=null}finish(){var r,s;this.notifyFinished(),this.teardown(),this.state="finished",(s=(r=this.options).onComplete)==null||s.call(r)}cancel(){var r,s;this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),(s=(r=this.options).onCancel)==null||s.call(r)}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(r){return this.startTime=0,this.tick(r,!0)}attachTimeline(r){var s;return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),(s=this.driver)==null||s.stop(),r.observe(this)}}function ev(n){for(let r=1;rn*180/Math.PI,Rl=n=>{const r=Wn(Math.atan2(n[1],n[0]));return Fl(r)},tv={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:n=>(Math.abs(n[0])+Math.abs(n[3]))/2,rotate:Rl,rotateZ:Rl,skewX:n=>Wn(Math.atan(n[1])),skewY:n=>Wn(Math.atan(n[2])),skew:n=>(Math.abs(n[1])+Math.abs(n[2]))/2},Fl=n=>(n=n%360,n<0&&(n+=360),n),Uf=Rl,Wf=n=>Math.sqrt(n[0]*n[0]+n[1]*n[1]),Hf=n=>Math.sqrt(n[4]*n[4]+n[5]*n[5]),nv={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:Wf,scaleY:Hf,scale:n=>(Wf(n)+Hf(n))/2,rotateX:n=>Fl(Wn(Math.atan2(n[6],n[5]))),rotateY:n=>Fl(Wn(Math.atan2(-n[2],n[0]))),rotateZ:Uf,rotate:Uf,skewX:n=>Wn(Math.atan(n[4])),skewY:n=>Wn(Math.atan(n[1])),skew:n=>(Math.abs(n[1])+Math.abs(n[4]))/2};function Vl(n){return n.includes("scale")?1:0}function Il(n,r){if(!n||n==="none")return Vl(r);const s=n.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let a,u;if(s)a=nv,u=s;else{const h=n.match(/^matrix\(([-\d.e\s,]+)\)$/u);a=tv,u=h}if(!u)return Vl(r);const f=a[r],d=u[1].split(",").map(iv);return typeof f=="function"?f(d):d[f]}const rv=(n,r)=>{const{transform:s="none"}=getComputedStyle(n);return Il(s,r)};function iv(n){return parseFloat(n.trim())}const Er=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],jr=new Set(Er),Gf=n=>n===Ar||n===Y,sv=new Set(["x","y","z"]),ov=Er.filter(n=>!sv.has(n));function av(n){const r=[];return ov.forEach(s=>{const a=n.getValue(s);a!==void 0&&(r.push([s,a.get()]),a.set(s.startsWith("scale")?1:0))}),r}const Tn={width:({x:n},{paddingLeft:r="0",paddingRight:s="0",boxSizing:a})=>{const u=n.max-n.min;return a==="border-box"?u:u-parseFloat(r)-parseFloat(s)},height:({y:n},{paddingTop:r="0",paddingBottom:s="0",boxSizing:a})=>{const u=n.max-n.min;return a==="border-box"?u:u-parseFloat(r)-parseFloat(s)},top:(n,{top:r})=>parseFloat(r),left:(n,{left:r})=>parseFloat(r),bottom:({y:n},{top:r})=>parseFloat(r)+(n.max-n.min),right:({x:n},{left:r})=>parseFloat(r)+(n.max-n.min),x:(n,{transform:r})=>Il(r,"x"),y:(n,{transform:r})=>Il(r,"y")};Tn.translateX=Tn.x;Tn.translateY=Tn.y;const Hn=new Set;let _l=!1,zl=!1,Ol=!1;function jp(){if(zl){const n=Array.from(Hn).filter(a=>a.needsMeasurement),r=new Set(n.map(a=>a.element)),s=new Map;r.forEach(a=>{const u=av(a);u.length&&(s.set(a,u),a.render())}),n.forEach(a=>a.measureInitialState()),r.forEach(a=>{a.render();const u=s.get(a);u&&u.forEach(([f,d])=>{var h;(h=a.getValue(f))==null||h.set(d)})}),n.forEach(a=>a.measureEndState()),n.forEach(a=>{a.suspendedScrollY!==void 0&&window.scrollTo(0,a.suspendedScrollY)})}zl=!1,_l=!1,Hn.forEach(n=>n.complete(Ol)),Hn.clear()}function Np(){Hn.forEach(n=>{n.readKeyframes(),n.needsMeasurement&&(zl=!0)})}function lv(){Ol=!0,Np(),jp(),Ol=!1}class mu{constructor(r,s,a,u,f,d=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...r],this.onComplete=s,this.name=a,this.motionValue=u,this.element=f,this.isAsync=d}scheduleResolve(){this.state="scheduled",this.isAsync?(Hn.add(this),_l||(_l=!0,ve.read(Np),ve.resolveKeyframes(jp))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:r,name:s,element:a,motionValue:u}=this;if(r[0]===null){const f=u==null?void 0:u.get(),d=r[r.length-1];if(f!==void 0)r[0]=f;else if(a&&s){const h=a.readValue(s,d);h!=null&&(r[0]=h)}r[0]===void 0&&(r[0]=d),u&&f===void 0&&u.set(r[0])}ev(r)}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(r=!1){this.state="complete",this.onComplete(this.unresolvedKeyframes,this.finalKeyframe,r),Hn.delete(this)}cancel(){this.state==="scheduled"&&(Hn.delete(this),this.state="pending")}resume(){this.state==="pending"&&this.scheduleResolve()}}const uv=n=>n.startsWith("--");function Mp(n,r,s){uv(r)?n.style.setProperty(r,s):n.style[r]=s}const cv={};function Dp(n,r){const s=ip(n);return()=>cv[r]??s()}const dv=Dp(()=>window.ScrollTimeline!==void 0,"scrollTimeline"),Lp=Dp(()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch{return!1}return!0},"linearEasing"),gi=([n,r,s,a])=>`cubic-bezier(${n}, ${r}, ${s}, ${a})`,Kf={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:gi([0,.65,.55,1]),circOut:gi([.55,0,1,.45]),backIn:gi([.31,.01,.66,-.59]),backOut:gi([.33,1.53,.69,.99])};function Rp(n,r){if(n)return typeof n=="function"?Lp()?Pp(n,r):"ease-out":mp(n)?gi(n):Array.isArray(n)?n.map(s=>Rp(s,r)||Kf.easeOut):Kf[n]}function fv(n,r,s,{delay:a=0,duration:u=300,repeat:f=0,repeatType:d="loop",ease:h="easeOut",times:g}={},x=void 0){const y={[r]:s};g&&(y.offset=g);const v=Rp(h,u);Array.isArray(v)&&(y.easing=v);const w={delay:a,duration:u,easing:Array.isArray(v)?"linear":v,fill:"both",iterations:f+1,direction:d==="reverse"?"alternate":"normal"};return x&&(w.pseudoElement=x),n.animate(y,w)}function Fp(n){return typeof n=="function"&&"applyToOptions"in n}function hv({type:n,...r}){return Fp(n)&&Lp()?n.applyToOptions(r):(r.duration??(r.duration=300),r.ease??(r.ease="easeOut"),r)}class Vp extends pu{constructor(r){if(super(),this.finishedTime=null,this.isStopped=!1,this.manualStartTime=null,!r)return;const{element:s,name:a,keyframes:u,pseudoElement:f,allowFlatten:d=!1,finalKeyframe:h,onComplete:g}=r;this.isPseudoElement=!!f,this.allowFlatten=d,this.options=r,su(typeof r.type!="string");const x=hv(r);this.animation=fv(s,a,u,x,f),x.autoplay===!1&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!f){const y=co(u,this.options,h,this.speed);this.updateMotionValue&&this.updateMotionValue(y),Mp(s,a,y),this.animation.cancel()}g==null||g(),this.notifyFinished()}}play(){this.isStopped||(this.manualStartTime=null,this.animation.play(),this.state==="finished"&&this.updateFinished())}pause(){this.animation.pause()}complete(){var r,s;(s=(r=this.animation).finish)==null||s.call(r)}cancel(){try{this.animation.cancel()}catch{}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:r}=this;r==="idle"||r==="finished"||(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){var s,a,u;const r=(s=this.options)==null?void 0:s.element;!this.isPseudoElement&&(r!=null&&r.isConnected)&&((u=(a=this.animation).commitStyles)==null||u.call(a))}get duration(){var s,a;const r=((a=(s=this.animation.effect)==null?void 0:s.getComputedTiming)==null?void 0:a.call(s).duration)||0;return kt(Number(r))}get iterationDuration(){const{delay:r=0}=this.options||{};return this.duration+kt(r)}get time(){return kt(Number(this.animation.currentTime)||0)}set time(r){const s=this.finishedTime!==null;this.manualStartTime=null,this.finishedTime=null,this.animation.currentTime=mt(r),s&&this.animation.pause()}get speed(){return this.animation.playbackRate}set speed(r){r<0&&(this.finishedTime=null),this.animation.playbackRate=r}get state(){return this.finishedTime!==null?"finished":this.animation.playState}get startTime(){return this.manualStartTime??Number(this.animation.startTime)}set startTime(r){this.manualStartTime=this.animation.startTime=r}attachTimeline({timeline:r,rangeStart:s,rangeEnd:a,observe:u}){var f;return this.allowFlatten&&((f=this.animation.effect)==null||f.updateTiming({easing:"linear"})),this.animation.onfinish=null,r&&dv()?(this.animation.timeline=r,s&&(this.animation.rangeStart=s),a&&(this.animation.rangeEnd=a),Tt):u(this)}}const Ip={anticipate:dp,backInOut:cp,circInOut:hp};function pv(n){return n in Ip}function mv(n){typeof n.ease=="string"&&pv(n.ease)&&(n.ease=Ip[n.ease])}const vl=10;class gv extends Vp{constructor(r){mv(r),Ep(r),super(r),r.startTime!==void 0&&r.autoplay!==!1&&(this.startTime=r.startTime),this.options=r}updateMotionValue(r){const{motionValue:s,onUpdate:a,onComplete:u,element:f,...d}=this.options;if(!s)return;if(r!==void 0){s.set(r);return}const h=new ro({...d,autoplay:!1}),g=Math.max(vl,nt.now()-this.startTime),x=Gt(0,vl,g-vl),y=h.sample(g).value,{name:v}=this.options;f&&v&&Mp(f,v,y),s.setWithVelocity(h.sample(Math.max(0,g-x)).value,y,x),h.stop()}}const $f=(n,r)=>r==="zIndex"?!1:!!(typeof n=="number"||Array.isArray(n)||typeof n=="string"&&(Ft.test(n)||n==="0")&&!n.startsWith("url("));function yv(n){const r=n[0];if(n.length===1)return!0;for(let s=0;sObject.hasOwnProperty.call(Element.prototype,"animate"));function Tv(n){var v;const{motionValue:r,name:s,repeatDelay:a,repeatType:u,damping:f,type:d,keyframes:h}=n;if(!(((v=r==null?void 0:r.owner)==null?void 0:v.current)instanceof HTMLElement))return!1;const{onUpdate:x,transformTemplate:y}=r.owner.getProps();return kv()&&s&&(_p.has(s)||Sv.has(s)&&wv(h))&&(s!=="transform"||!y)&&!x&&!a&&u!=="mirror"&&f!==0&&d!=="inertia"}const Cv=40;class Pv extends pu{constructor({autoplay:r=!0,delay:s=0,type:a="keyframes",repeat:u=0,repeatDelay:f=0,repeatType:d="loop",keyframes:h,name:g,motionValue:x,element:y,...v}){var N;super(),this.stop=()=>{var D,M;this._animation&&(this._animation.stop(),(D=this.stopTimeline)==null||D.call(this)),(M=this.keyframeResolver)==null||M.cancel()},this.createdAt=nt.now();const w={autoplay:r,delay:s,type:a,repeat:u,repeatDelay:f,repeatType:d,name:g,motionValue:x,element:y,...v},C=(y==null?void 0:y.KeyframeResolver)||mu;this.keyframeResolver=new C(h,(D,M,I)=>this.onKeyframesResolved(D,M,w,!I),g,x,y),(N=this.keyframeResolver)==null||N.scheduleResolve()}onKeyframesResolved(r,s,a,u){var I,U;this.keyframeResolver=void 0;const{name:f,type:d,velocity:h,delay:g,isHandoff:x,onUpdate:y}=a;this.resolvedAt=nt.now();let v=!0;vv(r,f,d,h)||(v=!1,(Cn.instantAnimations||!g)&&(y==null||y(co(r,a,s))),r[0]=r[r.length-1],Bl(a),a.repeat=0);const C={startTime:u?this.resolvedAt?this.resolvedAt-this.createdAt>Cv?this.resolvedAt:this.createdAt:this.createdAt:void 0,finalKeyframe:s,...a,keyframes:r},N=v&&!x&&Tv(C),D=(U=(I=C.motionValue)==null?void 0:I.owner)==null?void 0:U.current;let M;if(N)try{M=new gv({...C,element:D})}catch{M=new ro(C)}else M=new ro(C);M.finished.then(()=>{this.notifyFinished()}).catch(Tt),this.pendingTimeline&&(this.stopTimeline=M.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=M}get finished(){return this._animation?this.animation.finished:this._finished}then(r,s){return this.finished.finally(r).then(()=>{})}get animation(){var r;return this._animation||((r=this.keyframeResolver)==null||r.resume(),lv()),this._animation}get duration(){return this.animation.duration}get iterationDuration(){return this.animation.iterationDuration}get time(){return this.animation.time}set time(r){this.animation.time=r}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(r){this.animation.speed=r}get startTime(){return this.animation.startTime}attachTimeline(r){return this._animation?this.stopTimeline=this.animation.attachTimeline(r):this.pendingTimeline=r,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){var r;this._animation&&this.animation.cancel(),(r=this.keyframeResolver)==null||r.cancel()}}function zp(n,r,s,a=0,u=1){const f=Array.from(n).sort((x,y)=>x.sortNodePosition(y)).indexOf(r),d=n.size,h=(d-1)*a;return typeof s=="function"?s(f,d):u===1?f*a:h-f*a}const Av=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function Ev(n){const r=Av.exec(n);if(!r)return[,];const[,s,a,u]=r;return[`--${s??a}`,u]}function Op(n,r,s=1){const[a,u]=Ev(n);if(!a)return;const f=window.getComputedStyle(r).getPropertyValue(a);if(f){const d=f.trim();return tp(d)?parseFloat(d):d}return uu(u)?Op(u,r,s+1):u}const jv={type:"spring",stiffness:500,damping:25,restSpeed:10},Nv=n=>({type:"spring",stiffness:550,damping:n===0?2*Math.sqrt(550):30,restSpeed:10}),Mv={type:"keyframes",duration:.8},Dv={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},Lv=(n,{keyframes:r})=>r.length>2?Mv:jr.has(n)?n.startsWith("scale")?Nv(r[1]):jv:Dv;function Bp(n,r){if(n!=null&&n.inherit&&r){const{inherit:s,...a}=n;return{...r,...a}}return n}function gu(n,r){const s=(n==null?void 0:n[r])??(n==null?void 0:n.default)??n;return s!==n?Bp(s,n):s}const Rv=new Set(["when","delay","delayChildren","staggerChildren","staggerDirection","repeat","repeatType","repeatDelay","from","elapsed"]);function Fv(n){for(const r in n)if(!Rv.has(r))return!0;return!1}const yu=(n,r,s,a={},u,f)=>d=>{const h=gu(a,n)||{},g=h.delay||a.delay||0;let{elapsed:x=0}=a;x=x-mt(g);const y={keyframes:Array.isArray(s)?s:[null,s],ease:"easeOut",velocity:r.getVelocity(),...h,delay:-x,onUpdate:w=>{r.set(w),h.onUpdate&&h.onUpdate(w)},onComplete:()=>{d(),h.onComplete&&h.onComplete()},name:n,motionValue:r,element:f?void 0:u};Fv(h)||Object.assign(y,Lv(n,y)),y.duration&&(y.duration=mt(y.duration)),y.repeatDelay&&(y.repeatDelay=mt(y.repeatDelay)),y.from!==void 0&&(y.keyframes[0]=y.from);let v=!1;if((y.type===!1||y.duration===0&&!y.repeatDelay)&&(Bl(y),y.delay===0&&(v=!0)),(Cn.instantAnimations||Cn.skipAnimations||u!=null&&u.shouldSkipAnimations)&&(v=!0,Bl(y),y.delay=0),y.allowFlatten=!h.type&&!h.ease,v&&!f&&r.get()!==void 0){const w=co(y.keyframes,h);if(w!==void 0){ve.update(()=>{y.onUpdate(w),y.onComplete()});return}}return h.isSync?new ro(y):new Pv(y)};function Yf(n){const r=[{},{}];return n==null||n.values.forEach((s,a)=>{r[0][a]=s.get(),r[1][a]=s.getVelocity()}),r}function vu(n,r,s,a){if(typeof r=="function"){const[u,f]=Yf(a);r=r(s!==void 0?s:n.custom,u,f)}if(typeof r=="string"&&(r=n.variants&&n.variants[r]),typeof r=="function"){const[u,f]=Yf(a);r=r(s!==void 0?s:n.custom,u,f)}return r}function Gn(n,r,s){const a=n.getProps();return vu(a,r,s!==void 0?s:a.custom,n)}const bp=new Set(["width","height","top","left","right","bottom",...Er]),Xf=30,Vv=n=>!isNaN(parseFloat(n));class Iv{constructor(r,s={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=a=>{var f;const u=nt.now();if(this.updatedAt!==u&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(a),this.current!==this.prev&&((f=this.events.change)==null||f.notify(this.current),this.dependents))for(const d of this.dependents)d.dirty()},this.hasAnimated=!1,this.setCurrent(r),this.owner=s.owner}setCurrent(r){this.current=r,this.updatedAt=nt.now(),this.canTrackVelocity===null&&r!==void 0&&(this.canTrackVelocity=Vv(this.current))}setPrevFrameValue(r=this.current){this.prevFrameValue=r,this.prevUpdatedAt=this.updatedAt}onChange(r){return this.on("change",r)}on(r,s){this.events[r]||(this.events[r]=new ou);const a=this.events[r].add(s);return r==="change"?()=>{a(),ve.read(()=>{this.events.change.getSize()||this.stop()})}:a}clearListeners(){for(const r in this.events)this.events[r].clear()}attach(r,s){this.passiveEffect=r,this.stopPassiveEffect=s}set(r){this.passiveEffect?this.passiveEffect(r,this.updateAndNotify):this.updateAndNotify(r)}setWithVelocity(r,s,a){this.set(s),this.prev=void 0,this.prevFrameValue=r,this.prevUpdatedAt=this.updatedAt-a}jump(r,s=!0){this.updateAndNotify(r),this.prev=r,this.prevUpdatedAt=this.prevFrameValue=void 0,s&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){var r;(r=this.events.change)==null||r.notify(this.current)}addDependent(r){this.dependents||(this.dependents=new Set),this.dependents.add(r)}removeDependent(r){this.dependents&&this.dependents.delete(r)}get(){return this.current}getPrevious(){return this.prev}getVelocity(){const r=nt.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||r-this.updatedAt>Xf)return 0;const s=Math.min(this.updatedAt-this.prevUpdatedAt,Xf);return sp(parseFloat(this.current)-parseFloat(this.prevFrameValue),s)}start(r){return this.stop(),new Promise(s=>{this.hasAnimated=!0,this.animation=r(s),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){var r,s;(r=this.dependents)==null||r.clear(),(s=this.events.destroy)==null||s.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function Pr(n,r){return new Iv(n,r)}const bl=n=>Array.isArray(n);function _v(n,r,s){n.hasValue(r)?n.getValue(r).set(s):n.addValue(r,Pr(s))}function zv(n){return bl(n)?n[n.length-1]||0:n}function Ov(n,r){const s=Gn(n,r);let{transitionEnd:a={},transition:u={},...f}=s||{};f={...f,...a};for(const d in f){const h=zv(f[d]);_v(n,d,h)}}const Xe=n=>!!(n&&n.getVelocity);function Bv(n){return!!(Xe(n)&&n.add)}function Ul(n,r){const s=n.getValue("willChange");if(Bv(s))return s.add(r);if(!s&&Cn.WillChange){const a=new Cn.WillChange("auto");n.addValue("willChange",a),a.add(r)}}function xu(n){return n.replace(/([A-Z])/g,r=>`-${r.toLowerCase()}`)}const bv="framerAppearId",Up="data-"+xu(bv);function Wp(n){return n.props[Up]}function Uv({protectedKeys:n,needsAnimating:r},s){const a=n.hasOwnProperty(s)&&r[s]!==!0;return r[s]=!1,a}function Hp(n,r,{delay:s=0,transitionOverride:a,type:u}={}){let{transition:f,transitionEnd:d,...h}=r;const g=n.getDefaultTransition();f=f?Bp(f,g):g;const x=f==null?void 0:f.reduceMotion;a&&(f=a);const y=[],v=u&&n.animationState&&n.animationState.getState()[u];for(const w in h){const C=n.getValue(w,n.latestValues[w]??null),N=h[w];if(N===void 0||v&&Uv(v,w))continue;const D={delay:s,...gu(f||{},w)},M=C.get();if(M!==void 0&&!C.isAnimating()&&!Array.isArray(N)&&N===M&&!D.velocity){ve.update(()=>C.set(N));continue}let I=!1;if(window.MotionHandoffAnimation){const b=Wp(n);if(b){const G=window.MotionHandoffAnimation(b,w,ve);G!==null&&(D.startTime=G,I=!0)}}Ul(n,w);const U=x??n.shouldReduceMotion;C.start(yu(w,C,N,U&&bp.has(w)?{type:!1}:D,n,I));const B=C.animation;B&&y.push(B)}if(d){const w=()=>ve.update(()=>{d&&Ov(n,d)});y.length?Promise.all(y).then(w):w()}return y}function Wl(n,r,s={}){var g;const a=Gn(n,r,s.type==="exit"?(g=n.presenceContext)==null?void 0:g.custom:void 0);let{transition:u=n.getDefaultTransition()||{}}=a||{};s.transitionOverride&&(u=s.transitionOverride);const f=a?()=>Promise.all(Hp(n,a,s)):()=>Promise.resolve(),d=n.variantChildren&&n.variantChildren.size?(x=0)=>{const{delayChildren:y=0,staggerChildren:v,staggerDirection:w}=u;return Wv(n,r,x,y,v,w,s)}:()=>Promise.resolve(),{when:h}=u;if(h){const[x,y]=h==="beforeChildren"?[f,d]:[d,f];return x().then(()=>y())}else return Promise.all([f(),d(s.delay)])}function Wv(n,r,s=0,a=0,u=0,f=1,d){const h=[];for(const g of n.variantChildren)g.notify("AnimationStart",r),h.push(Wl(g,r,{...d,delay:s+(typeof a=="function"?0:a)+zp(n.variantChildren,g,a,u,f)}).then(()=>g.notify("AnimationComplete",r)));return Promise.all(h)}function Hv(n,r,s={}){n.notify("AnimationStart",r);let a;if(Array.isArray(r)){const u=r.map(f=>Wl(n,f,s));a=Promise.all(u)}else if(typeof r=="string")a=Wl(n,r,s);else{const u=typeof r=="function"?Gn(n,r,s.custom):r;a=Promise.all(Hp(n,u,s))}return a.then(()=>{n.notify("AnimationComplete",r)})}const Gv={test:n=>n==="auto",parse:n=>n},Gp=n=>r=>r.test(n),Kp=[Ar,Y,Ht,Sn,y0,g0,Gv],Qf=n=>Kp.find(Gp(n));function Kv(n){return typeof n=="number"?n===0:n!==null?n==="none"||n==="0"||rp(n):!0}const $v=new Set(["brightness","contrast","saturate","opacity"]);function Yv(n){const[r,s]=n.slice(0,-1).split("(");if(r==="drop-shadow")return n;const[a]=s.match(cu)||[];if(!a)return n;const u=s.replace(a,"");let f=$v.has(r)?1:0;return a!==s&&(f*=100),r+"("+f+u+")"}const Xv=/\b([a-z-]*)\(.*?\)/gu,Hl={...Ft,getAnimatableNone:n=>{const r=n.match(Xv);return r?r.map(Yv).join(" "):n}},Gl={...Ft,getAnimatableNone:n=>{const r=Ft.parse(n);return Ft.createTransformer(n)(r.map(a=>typeof a=="number"?0:typeof a=="object"?{...a,alpha:1}:a))}},qf={...Ar,transform:Math.round},Qv={rotate:Sn,rotateX:Sn,rotateY:Sn,rotateZ:Sn,scale:bs,scaleX:bs,scaleY:bs,scaleZ:bs,skew:Sn,skewX:Sn,skewY:Sn,distance:Y,translateX:Y,translateY:Y,translateZ:Y,x:Y,y:Y,z:Y,perspective:Y,transformPerspective:Y,opacity:ki,originX:_f,originY:_f,originZ:Y},wu={borderWidth:Y,borderTopWidth:Y,borderRightWidth:Y,borderBottomWidth:Y,borderLeftWidth:Y,borderRadius:Y,borderTopLeftRadius:Y,borderTopRightRadius:Y,borderBottomRightRadius:Y,borderBottomLeftRadius:Y,width:Y,maxWidth:Y,height:Y,maxHeight:Y,top:Y,right:Y,bottom:Y,left:Y,inset:Y,insetBlock:Y,insetBlockStart:Y,insetBlockEnd:Y,insetInline:Y,insetInlineStart:Y,insetInlineEnd:Y,padding:Y,paddingTop:Y,paddingRight:Y,paddingBottom:Y,paddingLeft:Y,paddingBlock:Y,paddingBlockStart:Y,paddingBlockEnd:Y,paddingInline:Y,paddingInlineStart:Y,paddingInlineEnd:Y,margin:Y,marginTop:Y,marginRight:Y,marginBottom:Y,marginLeft:Y,marginBlock:Y,marginBlockStart:Y,marginBlockEnd:Y,marginInline:Y,marginInlineStart:Y,marginInlineEnd:Y,fontSize:Y,backgroundPositionX:Y,backgroundPositionY:Y,...Qv,zIndex:qf,fillOpacity:ki,strokeOpacity:ki,numOctaves:qf},qv={...wu,color:Oe,backgroundColor:Oe,outlineColor:Oe,fill:Oe,stroke:Oe,borderColor:Oe,borderTopColor:Oe,borderRightColor:Oe,borderBottomColor:Oe,borderLeftColor:Oe,filter:Hl,WebkitFilter:Hl,mask:Gl,WebkitMask:Gl},$p=n=>qv[n],Zv=new Set([Hl,Gl]);function Yp(n,r){let s=$p(n);return Zv.has(s)||(s=Ft),s.getAnimatableNone?s.getAnimatableNone(r):void 0}const Jv=new Set(["auto","none","0"]);function ex(n,r,s){let a=0,u;for(;a{r.getValue(g).set(x)}),this.resolveNoneKeyframes()}}function Xp(n,r,s){if(n==null)return[];if(n instanceof EventTarget)return[n];if(typeof n=="string"){let a=document;const u=(s==null?void 0:s[n])??a.querySelectorAll(n);return u?Array.from(u):[]}return Array.from(n).filter(a=>a!=null)}const Qp=(n,r)=>r&&typeof n=="number"?r.transform(n):n;function Ks(n){return np(n)&&"offsetHeight"in n&&!("ownerSVGElement"in n)}const{schedule:Su}=gp(queueMicrotask,!1),Rt={x:!1,y:!1};function qp(){return Rt.x||Rt.y}function nx(n){return n==="x"||n==="y"?Rt[n]?null:(Rt[n]=!0,()=>{Rt[n]=!1}):Rt.x||Rt.y?null:(Rt.x=Rt.y=!0,()=>{Rt.x=Rt.y=!1})}function Zp(n,r){const s=Xp(n),a=new AbortController,u={passive:!0,...r,signal:a.signal};return[s,u,()=>a.abort()]}function rx(n){return!(n.pointerType==="touch"||qp())}function ix(n,r,s={}){const[a,u,f]=Zp(n,s);return a.forEach(d=>{let h=!1,g=!1,x;const y=()=>{d.removeEventListener("pointerleave",N)},v=M=>{x&&(x(M),x=void 0),y()},w=M=>{h=!1,window.removeEventListener("pointerup",w),window.removeEventListener("pointercancel",w),g&&(g=!1,v(M))},C=()=>{h=!0,window.addEventListener("pointerup",w,u),window.addEventListener("pointercancel",w,u)},N=M=>{if(M.pointerType!=="touch"){if(h){g=!0;return}v(M)}},D=M=>{if(!rx(M))return;g=!1;const I=r(d,M);typeof I=="function"&&(x=I,d.addEventListener("pointerleave",N,u))};d.addEventListener("pointerenter",D,u),d.addEventListener("pointerdown",C,u)}),f}const Jp=(n,r)=>r?n===r?!0:Jp(n,r.parentElement):!1,ku=n=>n.pointerType==="mouse"?typeof n.button!="number"||n.button<=0:n.isPrimary!==!1,sx=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function ox(n){return sx.has(n.tagName)||n.isContentEditable===!0}const ax=new Set(["INPUT","SELECT","TEXTAREA"]);function lx(n){return ax.has(n.tagName)||n.isContentEditable===!0}const $s=new WeakSet;function Zf(n){return r=>{r.key==="Enter"&&n(r)}}function xl(n,r){n.dispatchEvent(new PointerEvent("pointer"+r,{isPrimary:!0,bubbles:!0}))}const ux=(n,r)=>{const s=n.currentTarget;if(!s)return;const a=Zf(()=>{if($s.has(s))return;xl(s,"down");const u=Zf(()=>{xl(s,"up")}),f=()=>xl(s,"cancel");s.addEventListener("keyup",u,r),s.addEventListener("blur",f,r)});s.addEventListener("keydown",a,r),s.addEventListener("blur",()=>s.removeEventListener("keydown",a),r)};function Jf(n){return ku(n)&&!qp()}const eh=new WeakSet;function cx(n,r,s={}){const[a,u,f]=Zp(n,s),d=h=>{const g=h.currentTarget;if(!Jf(h)||eh.has(h))return;$s.add(g),s.stopPropagation&&eh.add(h);const x=r(g,h),y=(C,N)=>{window.removeEventListener("pointerup",v),window.removeEventListener("pointercancel",w),$s.has(g)&&$s.delete(g),Jf(C)&&typeof x=="function"&&x(C,{success:N})},v=C=>{y(C,g===window||g===document||s.useGlobalTarget||Jp(g,C.target))},w=C=>{y(C,!1)};window.addEventListener("pointerup",v,u),window.addEventListener("pointercancel",w,u)};return a.forEach(h=>{(s.useGlobalTarget?window:h).addEventListener("pointerdown",d,u),Ks(h)&&(h.addEventListener("focus",x=>ux(x,u)),!ox(h)&&!h.hasAttribute("tabindex")&&(h.tabIndex=0))}),f}function Tu(n){return np(n)&&"ownerSVGElement"in n}const Ys=new WeakMap;let kn;const em=(n,r,s)=>(a,u)=>u&&u[0]?u[0][n+"Size"]:Tu(a)&&"getBBox"in a?a.getBBox()[r]:a[s],dx=em("inline","width","offsetWidth"),fx=em("block","height","offsetHeight");function hx({target:n,borderBoxSize:r}){var s;(s=Ys.get(n))==null||s.forEach(a=>{a(n,{get width(){return dx(n,r)},get height(){return fx(n,r)}})})}function px(n){n.forEach(hx)}function mx(){typeof ResizeObserver>"u"||(kn=new ResizeObserver(px))}function gx(n,r){kn||mx();const s=Xp(n);return s.forEach(a=>{let u=Ys.get(a);u||(u=new Set,Ys.set(a,u)),u.add(r),kn==null||kn.observe(a)}),()=>{s.forEach(a=>{const u=Ys.get(a);u==null||u.delete(r),u!=null&&u.size||kn==null||kn.unobserve(a)})}}const Xs=new Set;let wr;function yx(){wr=()=>{const n={get width(){return window.innerWidth},get height(){return window.innerHeight}};Xs.forEach(r=>r(n))},window.addEventListener("resize",wr)}function vx(n){return Xs.add(n),wr||yx(),()=>{Xs.delete(n),!Xs.size&&typeof wr=="function"&&(window.removeEventListener("resize",wr),wr=void 0)}}function th(n,r){return typeof n=="function"?vx(n):gx(n,r)}function xx(n){return Tu(n)&&n.tagName==="svg"}const wx=[...Kp,Oe,Ft],Sx=n=>wx.find(Gp(n)),nh=()=>({translate:0,scale:1,origin:0,originPoint:0}),Sr=()=>({x:nh(),y:nh()}),rh=()=>({min:0,max:0}),Ue=()=>({x:rh(),y:rh()}),kx=new WeakMap;function fo(n){return n!==null&&typeof n=="object"&&typeof n.start=="function"}function Ti(n){return typeof n=="string"||Array.isArray(n)}const Cu=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],Pu=["initial",...Cu];function ho(n){return fo(n.animate)||Pu.some(r=>Ti(n[r]))}function tm(n){return!!(ho(n)||n.variants)}function Tx(n,r,s){for(const a in r){const u=r[a],f=s[a];if(Xe(u))n.addValue(a,u);else if(Xe(f))n.addValue(a,Pr(u,{owner:n}));else if(f!==u)if(n.hasValue(a)){const d=n.getValue(a);d.liveStyle===!0?d.jump(u):d.hasAnimated||d.set(u)}else{const d=n.getStaticValue(a);n.addValue(a,Pr(d!==void 0?d:u,{owner:n}))}}for(const a in s)r[a]===void 0&&n.removeValue(a);return r}const Kl={current:null},nm={current:!1},Cx=typeof window<"u";function Px(){if(nm.current=!0,!!Cx)if(window.matchMedia){const n=window.matchMedia("(prefers-reduced-motion)"),r=()=>Kl.current=n.matches;n.addEventListener("change",r),r()}else Kl.current=!1}const ih=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];let io={};function rm(n){io=n}function Ax(){return io}class Ex{scrapeMotionValuesFromProps(r,s,a){return{}}constructor({parent:r,props:s,presenceContext:a,reducedMotionConfig:u,skipAnimations:f,blockInitialAnimation:d,visualState:h},g={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.shouldSkipAnimations=!1,this.values=new Map,this.KeyframeResolver=mu,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.hasBeenMounted=!1,this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const C=nt.now();this.renderScheduledAtthis.bindToMotionValue(f,u)),this.reducedMotionConfig==="never"?this.shouldReduceMotion=!1:this.reducedMotionConfig==="always"?this.shouldReduceMotion=!0:(nm.current||Px(),this.shouldReduceMotion=Kl.current),this.shouldSkipAnimations=this.skipAnimationsConfig??!1,(a=this.parent)==null||a.addChild(this),this.update(this.props,this.presenceContext),this.hasBeenMounted=!0}unmount(){var r;this.projection&&this.projection.unmount(),Pn(this.notifyUpdate),Pn(this.render),this.valueSubscriptions.forEach(s=>s()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),(r=this.parent)==null||r.removeChild(this);for(const s in this.events)this.events[s].clear();for(const s in this.features){const a=this.features[s];a&&(a.unmount(),a.isMounted=!1)}this.current=null}addChild(r){this.children.add(r),this.enteringChildren??(this.enteringChildren=new Set),this.enteringChildren.add(r)}removeChild(r){this.children.delete(r),this.enteringChildren&&this.enteringChildren.delete(r)}bindToMotionValue(r,s){if(this.valueSubscriptions.has(r)&&this.valueSubscriptions.get(r)(),s.accelerate&&_p.has(r)&&this.current instanceof HTMLElement){const{factory:d,keyframes:h,times:g,ease:x,duration:y}=s.accelerate,v=new Vp({element:this.current,name:r,keyframes:h,times:g,ease:x,duration:mt(y)}),w=d(v);this.valueSubscriptions.set(r,()=>{w(),v.cancel()});return}const a=jr.has(r);a&&this.onBindTransform&&this.onBindTransform();const u=s.on("change",d=>{this.latestValues[r]=d,this.props.onUpdate&&ve.preRender(this.notifyUpdate),a&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()});let f;typeof window<"u"&&window.MotionCheckAppearSync&&(f=window.MotionCheckAppearSync(this,r,s)),this.valueSubscriptions.set(r,()=>{u(),f&&f(),s.owner&&s.stop()})}sortNodePosition(r){return!this.current||!this.sortInstanceNodePosition||this.type!==r.type?0:this.sortInstanceNodePosition(this.current,r.current)}updateFeatures(){let r="animation";for(r in io){const s=io[r];if(!s)continue;const{isEnabled:a,Feature:u}=s;if(!this.features[r]&&u&&a(this.props)&&(this.features[r]=new u(this)),this.features[r]){const f=this.features[r];f.isMounted?f.update():(f.mount(),f.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):Ue()}getStaticValue(r){return this.latestValues[r]}setStaticValue(r,s){this.latestValues[r]=s}update(r,s){(r.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=r,this.prevPresenceContext=this.presenceContext,this.presenceContext=s;for(let a=0;as.variantChildren.delete(r)}addValue(r,s){const a=this.values.get(r);s!==a&&(a&&this.removeValue(r),this.bindToMotionValue(r,s),this.values.set(r,s),this.latestValues[r]=s.get())}removeValue(r){this.values.delete(r);const s=this.valueSubscriptions.get(r);s&&(s(),this.valueSubscriptions.delete(r)),delete this.latestValues[r],this.removeValueFromRenderState(r,this.renderState)}hasValue(r){return this.values.has(r)}getValue(r,s){if(this.props.values&&this.props.values[r])return this.props.values[r];let a=this.values.get(r);return a===void 0&&s!==void 0&&(a=Pr(s===null?void 0:s,{owner:this}),this.addValue(r,a)),a}readValue(r,s){let a=this.latestValues[r]!==void 0||!this.current?this.latestValues[r]:this.getBaseTargetFromProps(this.props,r)??this.readValueFromInstance(this.current,r,this.options);return a!=null&&(typeof a=="string"&&(tp(a)||rp(a))?a=parseFloat(a):!Sx(a)&&Ft.test(s)&&(a=Yp(r,s)),this.setBaseTarget(r,Xe(a)?a.get():a)),Xe(a)?a.get():a}setBaseTarget(r,s){this.baseTarget[r]=s}getBaseTarget(r){var f;const{initial:s}=this.props;let a;if(typeof s=="string"||typeof s=="object"){const d=vu(this.props,s,(f=this.presenceContext)==null?void 0:f.custom);d&&(a=d[r])}if(s&&a!==void 0)return a;const u=this.getBaseTargetFromProps(this.props,r);return u!==void 0&&!Xe(u)?u:this.initialValues[r]!==void 0&&a===void 0?void 0:this.baseTarget[r]}on(r,s){return this.events[r]||(this.events[r]=new ou),this.events[r].add(s)}notify(r,...s){this.events[r]&&this.events[r].notify(...s)}scheduleRenderMicrotask(){Su.render(this.render)}}class im extends Ex{constructor(){super(...arguments),this.KeyframeResolver=tx}sortInstanceNodePosition(r,s){return r.compareDocumentPosition(s)&2?1:-1}getBaseTargetFromProps(r,s){const a=r.style;return a?a[s]:void 0}removeValueFromRenderState(r,{vars:s,style:a}){delete s[r],delete a[r]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:r}=this.props;Xe(r)&&(this.childSubscription=r.on("change",s=>{this.current&&(this.current.textContent=`${s}`)}))}}class An{constructor(r){this.isMounted=!1,this.node=r}update(){}}function sm({top:n,left:r,right:s,bottom:a}){return{x:{min:r,max:s},y:{min:n,max:a}}}function jx({x:n,y:r}){return{top:r.min,right:n.max,bottom:r.max,left:n.min}}function Nx(n,r){if(!r)return n;const s=r({x:n.left,y:n.top}),a=r({x:n.right,y:n.bottom});return{top:s.y,left:s.x,bottom:a.y,right:a.x}}function wl(n){return n===void 0||n===1}function $l({scale:n,scaleX:r,scaleY:s}){return!wl(n)||!wl(r)||!wl(s)}function bn(n){return $l(n)||om(n)||n.z||n.rotate||n.rotateX||n.rotateY||n.skewX||n.skewY}function om(n){return sh(n.x)||sh(n.y)}function sh(n){return n&&n!=="0%"}function so(n,r,s){const a=n-s,u=r*a;return s+u}function oh(n,r,s,a,u){return u!==void 0&&(n=so(n,u,a)),so(n,s,a)+r}function Yl(n,r=0,s=1,a,u){n.min=oh(n.min,r,s,a,u),n.max=oh(n.max,r,s,a,u)}function am(n,{x:r,y:s}){Yl(n.x,r.translate,r.scale,r.originPoint),Yl(n.y,s.translate,s.scale,s.originPoint)}const ah=.999999999999,lh=1.0000000000001;function Mx(n,r,s,a=!1){var h;const u=s.length;if(!u)return;r.x=r.y=1;let f,d;for(let g=0;gah&&(r.x=1),r.yah&&(r.y=1)}function Wt(n,r){n.min+=r,n.max+=r}function uh(n,r,s,a,u=.5){const f=Ce(n.min,n.max,u);Yl(n,r,s,f,a)}function ch(n,r){return typeof n=="string"?parseFloat(n)/100*(r.max-r.min):n}function Qs(n,r,s){const a=s??n;uh(n.x,ch(r.x,a.x),r.scaleX,r.scale,r.originX),uh(n.y,ch(r.y,a.y),r.scaleY,r.scale,r.originY)}function lm(n,r){return sm(Nx(n.getBoundingClientRect(),r))}function Dx(n,r,s){const a=lm(n,s),{scroll:u}=r;return u&&(Wt(a.x,u.offset.x),Wt(a.y,u.offset.y)),a}const Lx={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},Rx=Er.length;function Fx(n,r,s){let a="",u=!0;for(let f=0;f{if(!r.target)return n;if(typeof n=="string")if(Y.test(n))n=parseFloat(n);else return n;const s=dh(n,r.target.x),a=dh(n,r.target.y);return`${s}% ${a}%`}},Vx={correct:(n,{treeScale:r,projectionDelta:s})=>{const a=n,u=Ft.parse(n);if(u.length>5)return a;const f=Ft.createTransformer(n),d=typeof u[0]!="number"?1:0,h=s.x.scale*r.x,g=s.y.scale*r.y;u[0+d]/=h,u[1+d]/=g;const x=Ce(h,g,.5);return typeof u[2+d]=="number"&&(u[2+d]/=x),typeof u[3+d]=="number"&&(u[3+d]/=x),f(u)}},Xl={borderRadius:{...mi,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:mi,borderTopRightRadius:mi,borderBottomLeftRadius:mi,borderBottomRightRadius:mi,boxShadow:Vx};function cm(n,{layout:r,layoutId:s}){return jr.has(n)||n.startsWith("origin")||(r||s!==void 0)&&(!!Xl[n]||n==="opacity")}function Eu(n,r,s){var d;const a=n.style,u=r==null?void 0:r.style,f={};if(!a)return f;for(const h in a)(Xe(a[h])||u&&Xe(u[h])||cm(h,n)||((d=s==null?void 0:s.getValue(h))==null?void 0:d.liveStyle)!==void 0)&&(f[h]=a[h]);return f}function Ix(n){return window.getComputedStyle(n)}class _x extends im{constructor(){super(...arguments),this.type="html",this.renderInstance=um}readValueFromInstance(r,s){var a;if(jr.has(s))return(a=this.projection)!=null&&a.isProjecting?Vl(s):rv(r,s);{const u=Ix(r),f=(vp(s)?u.getPropertyValue(s):u[s])||0;return typeof f=="string"?f.trim():f}}measureInstanceViewportBox(r,{transformPagePoint:s}){return lm(r,s)}build(r,s,a){Au(r,s,a.transformTemplate)}scrapeMotionValuesFromProps(r,s,a){return Eu(r,s,a)}}const zx={offset:"stroke-dashoffset",array:"stroke-dasharray"},Ox={offset:"strokeDashoffset",array:"strokeDasharray"};function Bx(n,r,s=1,a=0,u=!0){n.pathLength=1;const f=u?zx:Ox;n[f.offset]=`${-a}`,n[f.array]=`${r} ${s}`}const bx=["offsetDistance","offsetPath","offsetRotate","offsetAnchor"];function dm(n,{attrX:r,attrY:s,attrScale:a,pathLength:u,pathSpacing:f=1,pathOffset:d=0,...h},g,x,y){if(Au(n,h,x),g){n.style.viewBox&&(n.attrs.viewBox=n.style.viewBox);return}n.attrs=n.style,n.style={};const{attrs:v,style:w}=n;v.transform&&(w.transform=v.transform,delete v.transform),(w.transform||v.transformOrigin)&&(w.transformOrigin=v.transformOrigin??"50% 50%",delete v.transformOrigin),w.transform&&(w.transformBox=(y==null?void 0:y.transformBox)??"fill-box",delete v.transformBox);for(const C of bx)v[C]!==void 0&&(w[C]=v[C],delete v[C]);r!==void 0&&(v.x=r),s!==void 0&&(v.y=s),a!==void 0&&(v.scale=a),u!==void 0&&Bx(v,u,f,d,!1)}const fm=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]),hm=n=>typeof n=="string"&&n.toLowerCase()==="svg";function Ux(n,r,s,a){um(n,r,void 0,a);for(const u in r.attrs)n.setAttribute(fm.has(u)?u:xu(u),r.attrs[u])}function pm(n,r,s){const a=Eu(n,r,s);for(const u in n)if(Xe(n[u])||Xe(r[u])){const f=Er.indexOf(u)!==-1?"attr"+u.charAt(0).toUpperCase()+u.substring(1):u;a[f]=n[u]}return a}class Wx extends im{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=Ue}getBaseTargetFromProps(r,s){return r[s]}readValueFromInstance(r,s){if(jr.has(s)){const a=$p(s);return a&&a.default||0}return s=fm.has(s)?s:xu(s),r.getAttribute(s)}scrapeMotionValuesFromProps(r,s,a){return pm(r,s,a)}build(r,s,a){dm(r,s,this.isSVGTag,a.transformTemplate,a.style)}renderInstance(r,s,a,u){Ux(r,s,a,u)}mount(r){this.isSVGTag=hm(r.tagName),super.mount(r)}}const Hx=Pu.length;function mm(n){if(!n)return;if(!n.isControllingVariants){const s=n.parent?mm(n.parent)||{}:{};return n.props.initial!==void 0&&(s.initial=n.props.initial),s}const r={};for(let s=0;sPromise.all(r.map(({animation:s,options:a})=>Hv(n,s,a)))}function Yx(n){let r=$x(n),s=fh(),a=!0,u=!1;const f=x=>(y,v)=>{var C;const w=Gn(n,v,x==="exit"?(C=n.presenceContext)==null?void 0:C.custom:void 0);if(w){const{transition:N,transitionEnd:D,...M}=w;y={...y,...M,...D}}return y};function d(x){r=x(n)}function h(x){const{props:y}=n,v=mm(n.parent)||{},w=[],C=new Set;let N={},D=1/0;for(let I=0;ID&&G,q=!1;const ce=Array.isArray(b)?b:[b];let ye=ce.reduce(f(U),{});ie===!1&&(ye={});const{prevResolvedValues:je={}}=B,Le={...je,...ye},_e=z=>{re=!0,C.has(z)&&(q=!0,C.delete(z)),B.needsAnimating[z]=!0;const X=n.getValue(z);X&&(X.liveStyle=!1)};for(const z in Le){const X=ye[z],W=je[z];if(N.hasOwnProperty(z))continue;let P=!1;bl(X)&&bl(W)?P=!gm(X,W):P=X!==W,P?X!=null?_e(z):C.add(z):X!==void 0&&C.has(z)?_e(z):B.protectedKeys[z]=!0}B.prevProp=b,B.prevResolvedValues=ye,B.isActive&&(N={...N,...ye}),(a||u)&&n.blockInitialAnimation&&(re=!1);const Se=oe&&J;re&&(!Se||q)&&w.push(...ce.map(z=>{const X={type:U};if(typeof z=="string"&&(a||u)&&!Se&&n.manuallyAnimateOnMount&&n.parent){const{parent:W}=n,P=Gn(W,z);if(W.enteringChildren&&P){const{delayChildren:L}=P.transition||{};X.delay=zp(W.enteringChildren,n,L)}}return{animation:z,options:X}}))}if(C.size){const I={};if(typeof y.initial!="boolean"){const U=Gn(n,Array.isArray(y.initial)?y.initial[0]:y.initial);U&&U.transition&&(I.transition=U.transition)}C.forEach(U=>{const B=n.getBaseTarget(U),b=n.getValue(U);b&&(b.liveStyle=!0),I[U]=B??null}),w.push({animation:I})}let M=!!w.length;return a&&(y.initial===!1||y.initial===y.animate)&&!n.manuallyAnimateOnMount&&(M=!1),a=!1,u=!1,M?r(w):Promise.resolve()}function g(x,y){var w;if(s[x].isActive===y)return Promise.resolve();(w=n.variantChildren)==null||w.forEach(C=>{var N;return(N=C.animationState)==null?void 0:N.setActive(x,y)}),s[x].isActive=y;const v=h(x);for(const C in s)s[C].protectedKeys={};return v}return{animateChanges:h,setActive:g,setAnimateFunction:d,getState:()=>s,reset:()=>{s=fh(),u=!0}}}function Xx(n,r){return typeof r=="string"?r!==n:Array.isArray(r)?!gm(r,n):!1}function Bn(n=!1){return{isActive:n,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function fh(){return{animate:Bn(!0),whileInView:Bn(),whileHover:Bn(),whileTap:Bn(),whileDrag:Bn(),whileFocus:Bn(),exit:Bn()}}function Ql(n,r){n.min=r.min,n.max=r.max}function Lt(n,r){Ql(n.x,r.x),Ql(n.y,r.y)}function hh(n,r){n.translate=r.translate,n.scale=r.scale,n.originPoint=r.originPoint,n.origin=r.origin}const ym=1e-4,Qx=1-ym,qx=1+ym,vm=.01,Zx=0-vm,Jx=0+vm;function rt(n){return n.max-n.min}function e1(n,r,s){return Math.abs(n-r)<=s}function ph(n,r,s,a=.5){n.origin=a,n.originPoint=Ce(r.min,r.max,n.origin),n.scale=rt(s)/rt(r),n.translate=Ce(s.min,s.max,n.origin)-n.originPoint,(n.scale>=Qx&&n.scale<=qx||isNaN(n.scale))&&(n.scale=1),(n.translate>=Zx&&n.translate<=Jx||isNaN(n.translate))&&(n.translate=0)}function xi(n,r,s,a){ph(n.x,r.x,s.x,a?a.originX:void 0),ph(n.y,r.y,s.y,a?a.originY:void 0)}function mh(n,r,s,a=0){const u=a?Ce(s.min,s.max,a):s.min;n.min=u+r.min,n.max=n.min+rt(r)}function t1(n,r,s,a){mh(n.x,r.x,s.x,a==null?void 0:a.x),mh(n.y,r.y,s.y,a==null?void 0:a.y)}function gh(n,r,s,a=0){const u=a?Ce(s.min,s.max,a):s.min;n.min=r.min-u,n.max=n.min+rt(r)}function oo(n,r,s,a){gh(n.x,r.x,s.x,a==null?void 0:a.x),gh(n.y,r.y,s.y,a==null?void 0:a.y)}function yh(n,r,s,a,u){return n-=r,n=so(n,1/s,a),u!==void 0&&(n=so(n,1/u,a)),n}function n1(n,r=0,s=1,a=.5,u,f=n,d=n){if(Ht.test(r)&&(r=parseFloat(r),r=Ce(d.min,d.max,r/100)-d.min),typeof r!="number")return;let h=Ce(f.min,f.max,a);n===f&&(h-=r),n.min=yh(n.min,r,s,h,u),n.max=yh(n.max,r,s,h,u)}function vh(n,r,[s,a,u],f,d){n1(n,r[s],r[a],r[u],r.scale,f,d)}const r1=["x","scaleX","originX"],i1=["y","scaleY","originY"];function xh(n,r,s,a){vh(n.x,r,r1,s?s.x:void 0,a?a.x:void 0),vh(n.y,r,i1,s?s.y:void 0,a?a.y:void 0)}function wh(n){return n.translate===0&&n.scale===1}function xm(n){return wh(n.x)&&wh(n.y)}function Sh(n,r){return n.min===r.min&&n.max===r.max}function s1(n,r){return Sh(n.x,r.x)&&Sh(n.y,r.y)}function kh(n,r){return Math.round(n.min)===Math.round(r.min)&&Math.round(n.max)===Math.round(r.max)}function wm(n,r){return kh(n.x,r.x)&&kh(n.y,r.y)}function Th(n){return rt(n.x)/rt(n.y)}function Ch(n,r){return n.translate===r.translate&&n.scale===r.scale&&n.originPoint===r.originPoint}function bt(n){return[n("x"),n("y")]}function o1(n,r,s){let a="";const u=n.x.translate/r.x,f=n.y.translate/r.y,d=(s==null?void 0:s.z)||0;if((u||f||d)&&(a=`translate3d(${u}px, ${f}px, ${d}px) `),(r.x!==1||r.y!==1)&&(a+=`scale(${1/r.x}, ${1/r.y}) `),s){const{transformPerspective:x,rotate:y,rotateX:v,rotateY:w,skewX:C,skewY:N}=s;x&&(a=`perspective(${x}px) ${a}`),y&&(a+=`rotate(${y}deg) `),v&&(a+=`rotateX(${v}deg) `),w&&(a+=`rotateY(${w}deg) `),C&&(a+=`skewX(${C}deg) `),N&&(a+=`skewY(${N}deg) `)}const h=n.x.scale*r.x,g=n.y.scale*r.y;return(h!==1||g!==1)&&(a+=`scale(${h}, ${g})`),a||"none"}const Sm=["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"],a1=Sm.length,Ph=n=>typeof n=="string"?parseFloat(n):n,Ah=n=>typeof n=="number"||Y.test(n);function l1(n,r,s,a,u,f){u?(n.opacity=Ce(0,s.opacity??1,u1(a)),n.opacityExit=Ce(r.opacity??1,0,c1(a))):f&&(n.opacity=Ce(r.opacity??1,s.opacity??1,a));for(let d=0;dar?1:s(Si(n,r,a))}function d1(n,r,s){const a=Xe(n)?n:Pr(n);return a.start(yu("",a,r,s)),a.animation}function Ci(n,r,s,a={passive:!0}){return n.addEventListener(r,s,a),()=>n.removeEventListener(r,s)}const f1=(n,r)=>n.depth-r.depth;class h1{constructor(){this.children=[],this.isDirty=!1}add(r){iu(this.children,r),this.isDirty=!0}remove(r){Js(this.children,r),this.isDirty=!0}forEach(r){this.isDirty&&this.children.sort(f1),this.isDirty=!1,this.children.forEach(r)}}function p1(n,r){const s=nt.now(),a=({timestamp:u})=>{const f=u-s;f>=r&&(Pn(a),n(f-r))};return ve.setup(a,!0),()=>Pn(a)}function qs(n){return Xe(n)?n.get():n}class m1{constructor(){this.members=[]}add(r){iu(this.members,r);for(let s=this.members.length-1;s>=0;s--){const a=this.members[s];if(a===r||a===this.lead||a===this.prevLead)continue;const u=a.instance;(!u||u.isConnected===!1)&&!a.snapshot&&(Js(this.members,a),a.unmount())}r.scheduleRender()}remove(r){if(Js(this.members,r),r===this.prevLead&&(this.prevLead=void 0),r===this.lead){const s=this.members[this.members.length-1];s&&this.promote(s)}}relegate(r){var s;for(let a=this.members.indexOf(r)-1;a>=0;a--){const u=this.members[a];if(u.isPresent!==!1&&((s=u.instance)==null?void 0:s.isConnected)!==!1)return this.promote(u),!0}return!1}promote(r,s){var u;const a=this.lead;if(r!==a&&(this.prevLead=a,this.lead=r,r.show(),a)){a.updateSnapshot(),r.scheduleRender();const{layoutDependency:f}=a.options,{layoutDependency:d}=r.options;(f===void 0||f!==d)&&(r.resumeFrom=a,s&&(a.preserveOpacity=!0),a.snapshot&&(r.snapshot=a.snapshot,r.snapshot.latestValues=a.animationValues||a.latestValues),(u=r.root)!=null&&u.isUpdating&&(r.isLayoutDirty=!0)),r.options.crossfade===!1&&a.hide()}}exitAnimationComplete(){this.members.forEach(r=>{var s,a,u,f,d;(a=(s=r.options).onExitComplete)==null||a.call(s),(d=(u=r.resumingFrom)==null?void 0:(f=u.options).onExitComplete)==null||d.call(f)})}scheduleRender(){this.members.forEach(r=>r.instance&&r.scheduleRender(!1))}removeLeadSnapshot(){var r;(r=this.lead)!=null&&r.snapshot&&(this.lead.snapshot=void 0)}}const Zs={hasAnimatedSinceResize:!0,hasEverUpdated:!1},Sl=["","X","Y","Z"],g1=1e3;let y1=0;function kl(n,r,s,a){const{latestValues:u}=r;u[n]&&(s[n]=u[n],r.setStaticValue(n,0),a&&(a[n]=0))}function Tm(n){if(n.hasCheckedOptimisedAppear=!0,n.root===n)return;const{visualElement:r}=n.options;if(!r)return;const s=Wp(r);if(window.MotionHasOptimisedAnimation(s,"transform")){const{layout:u,layoutId:f}=n.options;window.MotionCancelOptimisedAnimation(s,"transform",ve,!(u||f))}const{parent:a}=n;a&&!a.hasCheckedOptimisedAppear&&Tm(a)}function Cm({attachResizeListener:n,defaultParent:r,measureScroll:s,checkIsScrollRoot:a,resetTransform:u}){return class{constructor(d={},h=r==null?void 0:r()){this.id=y1++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.layoutVersion=0,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(w1),this.nodes.forEach(A1),this.nodes.forEach(E1),this.nodes.forEach(S1)},this.resolvedRelativeTargetAt=0,this.linkedParentVersion=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=d,this.root=h?h.root||h:this,this.path=h?[...h.path,h]:[],this.parent=h,this.depth=h?h.depth+1:0;for(let g=0;gthis.root.updateBlockedByResize=!1;ve.read(()=>{v=window.innerWidth}),n(d,()=>{const C=window.innerWidth;C!==v&&(v=C,this.root.updateBlockedByResize=!0,y&&y(),y=p1(w,250),Zs.hasAnimatedSinceResize&&(Zs.hasAnimatedSinceResize=!1,this.nodes.forEach(Mh)))})}h&&this.root.registerSharedNode(h,this),this.options.animate!==!1&&x&&(h||g)&&this.addEventListener("didUpdate",({delta:y,hasLayoutChanged:v,hasRelativeLayoutChanged:w,layout:C})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const N=this.options.transition||x.getDefaultTransition()||L1,{onLayoutAnimationStart:D,onLayoutAnimationComplete:M}=x.getProps(),I=!this.targetLayout||!wm(this.targetLayout,C),U=!v&&w;if(this.options.layoutRoot||this.resumeFrom||U||v&&(I||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const B={...gu(N,"layout"),onPlay:D,onComplete:M};(x.shouldReduceMotion||this.options.layoutRoot)&&(B.delay=0,B.type=!1),this.startAnimation(B),this.setAnimationOrigin(y,U)}else v||Mh(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=C})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const d=this.getStack();d&&d.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),Pn(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(j1),this.animationId++)}getTransformTemplate(){const{visualElement:d}=this.options;return d&&d.getProps().transformTemplate}willUpdate(d=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&Tm(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let y=0;y{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure(),this.snapshot&&!rt(this.snapshot.measuredBox.x)&&!rt(this.snapshot.measuredBox.y)&&(this.snapshot=void 0))}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let g=0;g{const G=b/1e3;Dh(v.x,d.x,G),Dh(v.y,d.y,G),this.setTargetDelta(v),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(oo(w,this.layout.layoutBox,this.relativeParent.layout.layoutBox,this.options.layoutAnchor||void 0),M1(this.relativeTarget,this.relativeTargetOrigin,w,G),B&&s1(this.relativeTarget,B)&&(this.isProjectionDirty=!1),B||(B=Ue()),Lt(B,this.relativeTarget)),D&&(this.animationValues=y,l1(y,x,this.latestValues,G,U,I)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=G},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(d){var h,g,x;this.notifyListeners("animationStart"),(h=this.currentAnimation)==null||h.stop(),(x=(g=this.resumingFrom)==null?void 0:g.currentAnimation)==null||x.stop(),this.pendingAnimation&&(Pn(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=ve.update(()=>{Zs.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=Pr(0)),this.motionValue.jump(0,!1),this.currentAnimation=d1(this.motionValue,[0,1e3],{...d,velocity:0,isSync:!0,onUpdate:y=>{this.mixTargetDelta(y),d.onUpdate&&d.onUpdate(y)},onStop:()=>{},onComplete:()=>{d.onComplete&&d.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const d=this.getStack();d&&d.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(g1),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const d=this.getLead();let{targetWithTransforms:h,target:g,layout:x,latestValues:y}=d;if(!(!h||!g||!x)){if(this!==d&&this.layout&&x&&Pm(this.options.animationType,this.layout.layoutBox,x.layoutBox)){g=this.target||Ue();const v=rt(this.layout.layoutBox.x);g.x.min=d.target.x.min,g.x.max=g.x.min+v;const w=rt(this.layout.layoutBox.y);g.y.min=d.target.y.min,g.y.max=g.y.min+w}Lt(h,g),Qs(h,y),xi(this.projectionDeltaWithTransform,this.layoutCorrected,h,y)}}registerSharedNode(d,h){this.sharedNodes.has(d)||this.sharedNodes.set(d,new m1),this.sharedNodes.get(d).add(h);const x=h.options.initialPromotionConfig;h.promote({transition:x?x.transition:void 0,preserveFollowOpacity:x&&x.shouldPreserveFollowOpacity?x.shouldPreserveFollowOpacity(h):void 0})}isLead(){const d=this.getStack();return d?d.lead===this:!0}getLead(){var h;const{layoutId:d}=this.options;return d?((h=this.getStack())==null?void 0:h.lead)||this:this}getPrevLead(){var h;const{layoutId:d}=this.options;return d?(h=this.getStack())==null?void 0:h.prevLead:void 0}getStack(){const{layoutId:d}=this.options;if(d)return this.root.sharedNodes.get(d)}promote({needsReset:d,transition:h,preserveFollowOpacity:g}={}){const x=this.getStack();x&&x.promote(this,g),d&&(this.projectionDelta=void 0,this.needsReset=!0),h&&this.setOptions({transition:h})}relegate(){const d=this.getStack();return d?d.relegate(this):!1}resetSkewAndRotation(){const{visualElement:d}=this.options;if(!d)return;let h=!1;const{latestValues:g}=d;if((g.z||g.rotate||g.rotateX||g.rotateY||g.rotateZ||g.skewX||g.skewY)&&(h=!0),!h)return;const x={};g.z&&kl("z",d,x,this.animationValues);for(let y=0;y{var h;return(h=d.currentAnimation)==null?void 0:h.stop()}),this.root.nodes.forEach(jh),this.root.sharedNodes.clear()}}}function v1(n){n.updateLayout()}function x1(n){var s;const r=((s=n.resumeFrom)==null?void 0:s.snapshot)||n.snapshot;if(n.isLead()&&n.layout&&r&&n.hasListeners("didUpdate")){const{layoutBox:a,measuredBox:u}=n.layout,{animationType:f}=n.options,d=r.source!==n.layout.source;if(f==="size")bt(v=>{const w=d?r.measuredBox[v]:r.layoutBox[v],C=rt(w);w.min=a[v].min,w.max=w.min+C});else if(f==="x"||f==="y"){const v=f==="x"?"y":"x";Ql(d?r.measuredBox[v]:r.layoutBox[v],a[v])}else Pm(f,r.layoutBox,a)&&bt(v=>{const w=d?r.measuredBox[v]:r.layoutBox[v],C=rt(a[v]);w.max=w.min+C,n.relativeTarget&&!n.currentAnimation&&(n.isProjectionDirty=!0,n.relativeTarget[v].max=n.relativeTarget[v].min+C)});const h=Sr();xi(h,a,r.layoutBox);const g=Sr();d?xi(g,n.applyTransform(u,!0),r.measuredBox):xi(g,a,r.layoutBox);const x=!xm(h);let y=!1;if(!n.resumeFrom){const v=n.getClosestProjectingParent();if(v&&!v.resumeFrom){const{snapshot:w,layout:C}=v;if(w&&C){const N=n.options.layoutAnchor||void 0,D=Ue();oo(D,r.layoutBox,w.layoutBox,N);const M=Ue();oo(M,a,C.layoutBox,N),wm(D,M)||(y=!0),v.options.layoutRoot&&(n.relativeTarget=M,n.relativeTargetOrigin=D,n.relativeParent=v)}}}n.notifyListeners("didUpdate",{layout:a,snapshot:r,delta:g,layoutDelta:h,hasLayoutChanged:x,hasRelativeLayoutChanged:y})}else if(n.isLead()){const{onExitComplete:a}=n.options;a&&a()}n.options.transition=void 0}function w1(n){n.parent&&(n.isProjecting()||(n.isProjectionDirty=n.parent.isProjectionDirty),n.isSharedProjectionDirty||(n.isSharedProjectionDirty=!!(n.isProjectionDirty||n.parent.isProjectionDirty||n.parent.isSharedProjectionDirty)),n.isTransformDirty||(n.isTransformDirty=n.parent.isTransformDirty))}function S1(n){n.isProjectionDirty=n.isSharedProjectionDirty=n.isTransformDirty=!1}function k1(n){n.clearSnapshot()}function jh(n){n.clearMeasurements()}function T1(n){n.isLayoutDirty=!0,n.updateLayout()}function Nh(n){n.isLayoutDirty=!1}function C1(n){n.isAnimationBlocked&&n.layout&&!n.isLayoutDirty&&(n.snapshot=n.layout,n.isLayoutDirty=!0)}function P1(n){const{visualElement:r}=n.options;r&&r.getProps().onBeforeLayoutMeasure&&r.notify("BeforeLayoutMeasure"),n.resetTransform()}function Mh(n){n.finishAnimation(),n.targetDelta=n.relativeTarget=n.target=void 0,n.isProjectionDirty=!0}function A1(n){n.resolveTargetDelta()}function E1(n){n.calcProjection()}function j1(n){n.resetSkewAndRotation()}function N1(n){n.removeLeadSnapshot()}function Dh(n,r,s){n.translate=Ce(r.translate,0,s),n.scale=Ce(r.scale,1,s),n.origin=r.origin,n.originPoint=r.originPoint}function Lh(n,r,s,a){n.min=Ce(r.min,s.min,a),n.max=Ce(r.max,s.max,a)}function M1(n,r,s,a){Lh(n.x,r.x,s.x,a),Lh(n.y,r.y,s.y,a)}function D1(n){return n.animationValues&&n.animationValues.opacityExit!==void 0}const L1={duration:.45,ease:[.4,0,.1,1]},Rh=n=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(n),Fh=Rh("applewebkit/")&&!Rh("chrome/")?Math.round:Tt;function Vh(n){n.min=Fh(n.min),n.max=Fh(n.max)}function R1(n){Vh(n.x),Vh(n.y)}function Pm(n,r,s){return n==="position"||n==="preserve-aspect"&&!e1(Th(r),Th(s),.2)}function F1(n){var r;return n!==n.root&&((r=n.scroll)==null?void 0:r.wasRoot)}const V1=Cm({attachResizeListener:(n,r)=>Ci(n,"resize",r),measureScroll:()=>{var n,r;return{x:document.documentElement.scrollLeft||((n=document.body)==null?void 0:n.scrollLeft)||0,y:document.documentElement.scrollTop||((r=document.body)==null?void 0:r.scrollTop)||0}},checkIsScrollRoot:()=>!0}),Tl={current:void 0},Am=Cm({measureScroll:n=>({x:n.scrollLeft,y:n.scrollTop}),defaultParent:()=>{if(!Tl.current){const n=new V1({});n.mount(window),n.setOptions({layoutScroll:!0}),Tl.current=n}return Tl.current},resetTransform:(n,r)=>{n.style.transform=r!==void 0?r:"none"},checkIsScrollRoot:n=>window.getComputedStyle(n).position==="fixed"}),ju=_.createContext({transformPagePoint:n=>n,isStatic:!1,reducedMotion:"never"});function Ih(n,r){if(typeof n=="function")return n(r);n!=null&&(n.current=r)}function I1(...n){return r=>{let s=!1;const a=n.map(u=>{const f=Ih(u,r);return!s&&typeof f=="function"&&(s=!0),f});if(s)return()=>{for(let u=0;u{const{width:C,height:N,top:D,left:M,right:I,bottom:U}=g.current;if(r||f===!1||!h.current||!C||!N)return;const B=s==="left"?`left: ${M}`:`right: ${I}`,b=a==="bottom"?`bottom: ${U}`:`top: ${D}`;h.current.dataset.motionPopId=d;const G=document.createElement("style");x&&(G.nonce=x);const ie=u??document.head;return ie.appendChild(G),G.sheet&&G.sheet.insertRule(` - [data-motion-pop-id="${d}"] { - position: absolute !important; - width: ${C}px !important; - height: ${N}px !important; - ${B}px !important; - ${b}px !important; - } - `),()=>{var oe;(oe=h.current)==null||oe.removeAttribute("data-motion-pop-id"),ie.contains(G)&&ie.removeChild(G)}},[r]),m.jsx(z1,{isPresent:r,childRef:h,sizeRef:g,pop:f,children:f===!1?n:_.cloneElement(n,{ref:v})})}const B1=({children:n,initial:r,isPresent:s,onExitComplete:a,custom:u,presenceAffectsLayout:f,mode:d,anchorX:h,anchorY:g,root:x})=>{const y=ru(b1),v=_.useId();let w=!0,C=_.useMemo(()=>(w=!1,{id:v,initial:r,isPresent:s,custom:u,onExitComplete:N=>{y.set(N,!0);for(const D of y.values())if(!D)return;a&&a()},register:N=>(y.set(N,!1),()=>y.delete(N))}),[s,y,a]);return f&&w&&(C={...C}),_.useMemo(()=>{y.forEach((N,D)=>y.set(D,!1))},[s]),_.useEffect(()=>{!s&&!y.size&&a&&a()},[s]),n=m.jsx(O1,{pop:d==="popLayout",isPresent:s,anchorX:h,anchorY:g,root:x,children:n}),m.jsx(uo.Provider,{value:C,children:n})};function b1(){return new Map}function Em(n=!0){const r=_.useContext(uo);if(r===null)return[!0,null];const{isPresent:s,onExitComplete:a,register:u}=r,f=_.useId();_.useEffect(()=>{if(n)return u(f)},[n]);const d=_.useCallback(()=>n&&a&&a(f),[f,a,n]);return!s&&a?[!1,d]:[!0]}const Us=n=>n.key||"";function _h(n){const r=[];return _.Children.forEach(n,s=>{_.isValidElement(s)&&r.push(s)}),r}const Tr=({children:n,custom:r,initial:s=!0,onExitComplete:a,presenceAffectsLayout:u=!0,mode:f="sync",propagate:d=!1,anchorX:h="left",anchorY:g="top",root:x})=>{const[y,v]=Em(d),w=_.useMemo(()=>_h(n),[n]),C=d&&!y?[]:w.map(Us),N=_.useRef(!0),D=_.useRef(w),M=ru(()=>new Map),I=_.useRef(new Set),[U,B]=_.useState(w),[b,G]=_.useState(w);ep(()=>{N.current=!1,D.current=w;for(let J=0;J{const re=Us(J),q=d&&!y?!1:w===b||C.includes(re),ce=()=>{if(I.current.has(re))return;if(M.has(re))I.current.add(re),M.set(re,!0);else return;let ye=!0;M.forEach(je=>{je||(ye=!1)}),ye&&(oe==null||oe(),G(D.current),d&&(v==null||v()),a&&a())};return m.jsx(B1,{isPresent:q,initial:!N.current||s?void 0:!1,custom:r,presenceAffectsLayout:u,mode:f,root:x,onExitComplete:q?void 0:ce,anchorX:h,anchorY:g,children:J},re)})})},jm=_.createContext({strict:!1}),zh={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]};let Oh=!1;function U1(){if(Oh)return;const n={};for(const r in zh)n[r]={isEnabled:s=>zh[r].some(a=>!!s[a])};rm(n),Oh=!0}function Nm(){return U1(),Ax()}function W1(n){const r=Nm();for(const s in n)r[s]={...r[s],...n[s]};rm(r)}const H1=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","propagate","ignoreStrict","viewport"]);function ao(n){return n.startsWith("while")||n.startsWith("drag")&&n!=="draggable"||n.startsWith("layout")||n.startsWith("onTap")||n.startsWith("onPan")||n.startsWith("onLayout")||H1.has(n)}let Mm=n=>!ao(n);function G1(n){typeof n=="function"&&(Mm=r=>r.startsWith("on")?!ao(r):n(r))}try{G1(require("@emotion/is-prop-valid").default)}catch{}function K1(n,r,s){const a={};for(const u in n)u==="values"&&typeof n.values=="object"||Xe(n[u])||(Mm(u)||s===!0&&ao(u)||!r&&!ao(u)||n.draggable&&u.startsWith("onDrag"))&&(a[u]=n[u]);return a}const po=_.createContext({});function $1(n,r){if(ho(n)){const{initial:s,animate:a}=n;return{initial:s===!1||Ti(s)?s:void 0,animate:Ti(a)?a:void 0}}return n.inherit!==!1?r:{}}function Y1(n){const{initial:r,animate:s}=$1(n,_.useContext(po));return _.useMemo(()=>({initial:r,animate:s}),[Bh(r),Bh(s)])}function Bh(n){return Array.isArray(n)?n.join(" "):n}const Nu=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function Dm(n,r,s){for(const a in r)!Xe(r[a])&&!cm(a,s)&&(n[a]=r[a])}function X1({transformTemplate:n},r){return _.useMemo(()=>{const s=Nu();return Au(s,r,n),Object.assign({},s.vars,s.style)},[r])}function Q1(n,r){const s=n.style||{},a={};return Dm(a,s,n),Object.assign(a,X1(n,r)),a}function q1(n,r){const s={},a=Q1(n,r);return n.drag&&n.dragListener!==!1&&(s.draggable=!1,a.userSelect=a.WebkitUserSelect=a.WebkitTouchCallout="none",a.touchAction=n.drag===!0?"none":`pan-${n.drag==="x"?"y":"x"}`),n.tabIndex===void 0&&(n.onTap||n.onTapStart||n.whileTap)&&(s.tabIndex=0),s.style=a,s}const Lm=()=>({...Nu(),attrs:{}});function Z1(n,r,s,a){const u=_.useMemo(()=>{const f=Lm();return dm(f,r,hm(a),n.transformTemplate,n.style),{...f.attrs,style:{...f.style}}},[r]);if(n.style){const f={};Dm(f,n.style,n),u.style={...f,...u.style}}return u}const J1=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function Mu(n){return typeof n!="string"||n.includes("-")?!1:!!(J1.indexOf(n)>-1||/[A-Z]/u.test(n))}function ew(n,r,s,{latestValues:a},u,f=!1,d){const g=(d??Mu(n)?Z1:q1)(r,a,u,n),x=K1(r,typeof n=="string",f),y=n!==_.Fragment?{...x,...g,ref:s}:{},{children:v}=r,w=_.useMemo(()=>Xe(v)?v.get():v,[v]);return _.createElement(n,{...y,children:w})}function tw({scrapeMotionValuesFromProps:n,createRenderState:r},s,a,u){return{latestValues:nw(s,a,u,n),renderState:r()}}function nw(n,r,s,a){const u={},f=a(n,{});for(const w in f)u[w]=qs(f[w]);let{initial:d,animate:h}=n;const g=ho(n),x=tm(n);r&&x&&!g&&n.inherit!==!1&&(d===void 0&&(d=r.initial),h===void 0&&(h=r.animate));let y=s?s.initial===!1:!1;y=y||d===!1;const v=y?h:d;if(v&&typeof v!="boolean"&&!fo(v)){const w=Array.isArray(v)?v:[v];for(let C=0;C(r,s)=>{const a=_.useContext(po),u=_.useContext(uo),f=()=>tw(n,r,a,u);return s?f():ru(f)},rw=Rm({scrapeMotionValuesFromProps:Eu,createRenderState:Nu}),iw=Rm({scrapeMotionValuesFromProps:pm,createRenderState:Lm}),sw=Symbol.for("motionComponentSymbol");function ow(n,r,s){const a=_.useRef(s);_.useInsertionEffect(()=>{a.current=s});const u=_.useRef(null);return _.useCallback(f=>{var h;f&&((h=n.onMount)==null||h.call(n,f));const d=a.current;if(typeof d=="function")if(f){const g=d(f);typeof g=="function"&&(u.current=g)}else u.current?(u.current(),u.current=null):d(f);else d&&(d.current=f);r&&(f?r.mount(f):r.unmount())},[r])}const Fm=_.createContext({});function vr(n){return n&&typeof n=="object"&&Object.prototype.hasOwnProperty.call(n,"current")}function aw(n,r,s,a,u,f){var B,b;const{visualElement:d}=_.useContext(po),h=_.useContext(jm),g=_.useContext(uo),x=_.useContext(ju),y=x.reducedMotion,v=x.skipAnimations,w=_.useRef(null),C=_.useRef(!1);a=a||h.renderer,!w.current&&a&&(w.current=a(n,{visualState:r,parent:d,props:s,presenceContext:g,blockInitialAnimation:g?g.initial===!1:!1,reducedMotionConfig:y,skipAnimations:v,isSVG:f}),C.current&&w.current&&(w.current.manuallyAnimateOnMount=!0));const N=w.current,D=_.useContext(Fm);N&&!N.projection&&u&&(N.type==="html"||N.type==="svg")&&lw(w.current,s,u,D);const M=_.useRef(!1);_.useInsertionEffect(()=>{N&&M.current&&N.update(s,g)});const I=s[Up],U=_.useRef(!!I&&typeof window<"u"&&!((B=window.MotionHandoffIsComplete)!=null&&B.call(window,I))&&((b=window.MotionHasOptimisedAnimation)==null?void 0:b.call(window,I)));return ep(()=>{C.current=!0,N&&(M.current=!0,window.MotionIsMounted=!0,N.updateFeatures(),N.scheduleRenderMicrotask(),U.current&&N.animationState&&N.animationState.animateChanges())}),_.useEffect(()=>{N&&(!U.current&&N.animationState&&N.animationState.animateChanges(),U.current&&(queueMicrotask(()=>{var G;(G=window.MotionHandoffMarkAsComplete)==null||G.call(window,I)}),U.current=!1),N.enteringChildren=void 0)}),N}function lw(n,r,s,a){const{layoutId:u,layout:f,drag:d,dragConstraints:h,layoutScroll:g,layoutRoot:x,layoutAnchor:y,layoutCrossfade:v}=r;n.projection=new s(n.latestValues,r["data-framer-portal-id"]?void 0:Vm(n.parent)),n.projection.setOptions({layoutId:u,layout:f,alwaysMeasureLayout:!!d||h&&vr(h),visualElement:n,animationType:typeof f=="string"?f:"both",initialPromotionConfig:a,crossfade:v,layoutScroll:g,layoutRoot:x,layoutAnchor:y})}function Vm(n){if(n)return n.options.allowProjection!==!1?n.projection:Vm(n.parent)}function Cl(n,{forwardMotionProps:r=!1,type:s}={},a,u){a&&W1(a);const f=s?s==="svg":Mu(n),d=f?iw:rw;function h(x,y){let v;const w={..._.useContext(ju),...x,layoutId:uw(x)},{isStatic:C}=w,N=Y1(x),D=d(x,C);if(!C&&typeof window<"u"){cw();const M=dw(w);v=M.MeasureLayout,N.visualElement=aw(n,D,w,u,M.ProjectionNode,f)}return m.jsxs(po.Provider,{value:N,children:[v&&N.visualElement?m.jsx(v,{visualElement:N.visualElement,...w}):null,ew(n,x,ow(D,N.visualElement,y),D,C,r,f)]})}h.displayName=`motion.${typeof n=="string"?n:`create(${n.displayName??n.name??""})`}`;const g=_.forwardRef(h);return g[sw]=n,g}function uw({layoutId:n}){const r=_.useContext(nu).id;return r&&n!==void 0?r+"-"+n:n}function cw(n,r){_.useContext(jm).strict}function dw(n){const r=Nm(),{drag:s,layout:a}=r;if(!s&&!a)return{};const u={...s,...a};return{MeasureLayout:s!=null&&s.isEnabled(n)||a!=null&&a.isEnabled(n)?u.MeasureLayout:void 0,ProjectionNode:u.ProjectionNode}}function fw(n,r){if(typeof Proxy>"u")return Cl;const s=new Map,a=(f,d)=>Cl(f,d,n,r),u=(f,d)=>a(f,d);return new Proxy(u,{get:(f,d)=>d==="create"?a:(s.has(d)||s.set(d,Cl(d,void 0,n,r)),s.get(d))})}const hw=(n,r)=>r.isSVG??Mu(n)?new Wx(r):new _x(r,{allowProjection:n!==_.Fragment});class pw extends An{constructor(r){super(r),r.animationState||(r.animationState=Yx(r))}updateAnimationControlsSubscription(){const{animate:r}=this.node.getProps();fo(r)&&(this.unmountControls=r.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:r}=this.node.getProps(),{animate:s}=this.node.prevProps||{};r!==s&&this.updateAnimationControlsSubscription()}unmount(){var r;this.node.animationState.reset(),(r=this.unmountControls)==null||r.call(this)}}let mw=0;class gw extends An{constructor(){super(...arguments),this.id=mw++,this.isExitComplete=!1}update(){var f;if(!this.node.presenceContext)return;const{isPresent:r,onExitComplete:s}=this.node.presenceContext,{isPresent:a}=this.node.prevPresenceContext||{};if(!this.node.animationState||r===a)return;if(r&&a===!1){if(this.isExitComplete){const{initial:d,custom:h}=this.node.getProps();if(typeof d=="string"){const g=Gn(this.node,d,h);if(g){const{transition:x,transitionEnd:y,...v}=g;for(const w in v)(f=this.node.getValue(w))==null||f.jump(v[w])}}this.node.animationState.reset(),this.node.animationState.animateChanges()}else this.node.animationState.setActive("exit",!1);this.isExitComplete=!1;return}const u=this.node.animationState.setActive("exit",!r);s&&!r&&u.then(()=>{this.isExitComplete=!0,s(this.id)})}mount(){const{register:r,onExitComplete:s}=this.node.presenceContext||{};s&&s(this.id),r&&(this.unmount=r(this.id))}unmount(){}}const yw={animation:{Feature:pw},exit:{Feature:gw}};function ji(n){return{point:{x:n.pageX,y:n.pageY}}}const vw=n=>r=>ku(r)&&n(r,ji(r));function wi(n,r,s,a){return Ci(n,r,vw(s),a)}const Im=({current:n})=>n?n.ownerDocument.defaultView:null,bh=(n,r)=>Math.abs(n-r);function xw(n,r){const s=bh(n.x,r.x),a=bh(n.y,r.y);return Math.sqrt(s**2+a**2)}const Uh=new Set(["auto","scroll"]);class _m{constructor(r,s,{transformPagePoint:a,contextWindow:u=window,dragSnapToOrigin:f=!1,distanceThreshold:d=3,element:h}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.lastRawMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.scrollPositions=new Map,this.removeScrollListeners=null,this.onElementScroll=C=>{this.handleScroll(C.target)},this.onWindowScroll=()=>{this.handleScroll(window)},this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;this.lastRawMoveEventInfo&&(this.lastMoveEventInfo=Ws(this.lastRawMoveEventInfo,this.transformPagePoint));const C=Pl(this.lastMoveEventInfo,this.history),N=this.startEvent!==null,D=xw(C.offset,{x:0,y:0})>=this.distanceThreshold;if(!N&&!D)return;const{point:M}=C,{timestamp:I}=Ye;this.history.push({...M,timestamp:I});const{onStart:U,onMove:B}=this.handlers;N||(U&&U(this.lastMoveEvent,C),this.startEvent=this.lastMoveEvent),B&&B(this.lastMoveEvent,C)},this.handlePointerMove=(C,N)=>{this.lastMoveEvent=C,this.lastRawMoveEventInfo=N,this.lastMoveEventInfo=Ws(N,this.transformPagePoint),ve.update(this.updatePoint,!0)},this.handlePointerUp=(C,N)=>{this.end();const{onEnd:D,onSessionEnd:M,resumeAnimation:I}=this.handlers;if((this.dragSnapToOrigin||!this.startEvent)&&I&&I(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const U=Pl(C.type==="pointercancel"?this.lastMoveEventInfo:Ws(N,this.transformPagePoint),this.history);this.startEvent&&D&&D(C,U),M&&M(C,U)},!ku(r))return;this.dragSnapToOrigin=f,this.handlers=s,this.transformPagePoint=a,this.distanceThreshold=d,this.contextWindow=u||window;const g=ji(r),x=Ws(g,this.transformPagePoint),{point:y}=x,{timestamp:v}=Ye;this.history=[{...y,timestamp:v}];const{onSessionStart:w}=s;w&&w(r,Pl(x,this.history)),this.removeListeners=Pi(wi(this.contextWindow,"pointermove",this.handlePointerMove),wi(this.contextWindow,"pointerup",this.handlePointerUp),wi(this.contextWindow,"pointercancel",this.handlePointerUp)),h&&this.startScrollTracking(h)}startScrollTracking(r){let s=r.parentElement;for(;s;){const a=getComputedStyle(s);(Uh.has(a.overflowX)||Uh.has(a.overflowY))&&this.scrollPositions.set(s,{x:s.scrollLeft,y:s.scrollTop}),s=s.parentElement}this.scrollPositions.set(window,{x:window.scrollX,y:window.scrollY}),window.addEventListener("scroll",this.onElementScroll,{capture:!0}),window.addEventListener("scroll",this.onWindowScroll),this.removeScrollListeners=()=>{window.removeEventListener("scroll",this.onElementScroll,{capture:!0}),window.removeEventListener("scroll",this.onWindowScroll)}}handleScroll(r){const s=this.scrollPositions.get(r);if(!s)return;const a=r===window,u=a?{x:window.scrollX,y:window.scrollY}:{x:r.scrollLeft,y:r.scrollTop},f={x:u.x-s.x,y:u.y-s.y};f.x===0&&f.y===0||(a?this.lastMoveEventInfo&&(this.lastMoveEventInfo.point.x+=f.x,this.lastMoveEventInfo.point.y+=f.y):this.history.length>0&&(this.history[0].x-=f.x,this.history[0].y-=f.y),this.scrollPositions.set(r,u),ve.update(this.updatePoint,!0))}updateHandlers(r){this.handlers=r}end(){this.removeListeners&&this.removeListeners(),this.removeScrollListeners&&this.removeScrollListeners(),this.scrollPositions.clear(),Pn(this.updatePoint)}}function Ws(n,r){return r?{point:r(n.point)}:n}function Wh(n,r){return{x:n.x-r.x,y:n.y-r.y}}function Pl({point:n},r){return{point:n,delta:Wh(n,zm(r)),offset:Wh(n,ww(r)),velocity:Sw(r,.1)}}function ww(n){return n[0]}function zm(n){return n[n.length-1]}function Sw(n,r){if(n.length<2)return{x:0,y:0};let s=n.length-1,a=null;const u=zm(n);for(;s>=0&&(a=n[s],!(u.timestamp-a.timestamp>mt(r)));)s--;if(!a)return{x:0,y:0};a===n[0]&&n.length>2&&u.timestamp-a.timestamp>mt(r)*2&&(a=n[1]);const f=kt(u.timestamp-a.timestamp);if(f===0)return{x:0,y:0};const d={x:(u.x-a.x)/f,y:(u.y-a.y)/f};return d.x===1/0&&(d.x=0),d.y===1/0&&(d.y=0),d}function kw(n,{min:r,max:s},a){return r!==void 0&&ns&&(n=a?Ce(s,n,a.max):Math.min(n,s)),n}function Hh(n,r,s){return{min:r!==void 0?n.min+r:void 0,max:s!==void 0?n.max+s-(n.max-n.min):void 0}}function Tw(n,{top:r,left:s,bottom:a,right:u}){return{x:Hh(n.x,s,u),y:Hh(n.y,r,a)}}function Gh(n,r){let s=r.min-n.min,a=r.max-n.max;return r.max-r.mina?s=Si(r.min,r.max-a,n.min):a>u&&(s=Si(n.min,n.max-u,r.min)),Gt(0,1,s)}function Aw(n,r){const s={};return r.min!==void 0&&(s.min=r.min-n.min),r.max!==void 0&&(s.max=r.max-n.min),s}const ql=.35;function Ew(n=ql){return n===!1?n=0:n===!0&&(n=ql),{x:Kh(n,"left","right"),y:Kh(n,"top","bottom")}}function Kh(n,r,s){return{min:$h(n,r),max:$h(n,s)}}function $h(n,r){return typeof n=="number"?n:n[r]||0}const jw=new WeakMap;class Nw{constructor(r){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=Ue(),this.latestPointerEvent=null,this.latestPanInfo=null,this.visualElement=r}start(r,{snapToCursor:s=!1,distanceThreshold:a}={}){const{presenceContext:u}=this.visualElement;if(u&&u.isPresent===!1)return;const f=v=>{s&&this.snapToCursor(ji(v).point),this.stopAnimation()},d=(v,w)=>{const{drag:C,dragPropagation:N,onDragStart:D}=this.getProps();if(C&&!N&&(this.openDragLock&&this.openDragLock(),this.openDragLock=nx(C),!this.openDragLock))return;this.latestPointerEvent=v,this.latestPanInfo=w,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),bt(I=>{let U=this.getAxisMotionValue(I).get()||0;if(Ht.test(U)){const{projection:B}=this.visualElement;if(B&&B.layout){const b=B.layout.layoutBox[I];b&&(U=rt(b)*(parseFloat(U)/100))}}this.originPoint[I]=U}),D&&ve.update(()=>D(v,w),!1,!0),Ul(this.visualElement,"transform");const{animationState:M}=this.visualElement;M&&M.setActive("whileDrag",!0)},h=(v,w)=>{this.latestPointerEvent=v,this.latestPanInfo=w;const{dragPropagation:C,dragDirectionLock:N,onDirectionLock:D,onDrag:M}=this.getProps();if(!C&&!this.openDragLock)return;const{offset:I}=w;if(N&&this.currentDirection===null){this.currentDirection=Dw(I),this.currentDirection!==null&&D&&D(this.currentDirection);return}this.updateAxis("x",w.point,I),this.updateAxis("y",w.point,I),this.visualElement.render(),M&&ve.update(()=>M(v,w),!1,!0)},g=(v,w)=>{this.latestPointerEvent=v,this.latestPanInfo=w,this.stop(v,w),this.latestPointerEvent=null,this.latestPanInfo=null},x=()=>{const{dragSnapToOrigin:v}=this.getProps();(v||this.constraints)&&this.startAnimation({x:0,y:0})},{dragSnapToOrigin:y}=this.getProps();this.panSession=new _m(r,{onSessionStart:f,onStart:d,onMove:h,onSessionEnd:g,resumeAnimation:x},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:y,distanceThreshold:a,contextWindow:Im(this.visualElement),element:this.visualElement.current})}stop(r,s){const a=r||this.latestPointerEvent,u=s||this.latestPanInfo,f=this.isDragging;if(this.cancel(),!f||!u||!a)return;const{velocity:d}=u;this.startAnimation(d);const{onDragEnd:h}=this.getProps();h&&ve.postRender(()=>h(a,u))}cancel(){this.isDragging=!1;const{projection:r,animationState:s}=this.visualElement;r&&(r.isAnimationBlocked=!1),this.endPanSession();const{dragPropagation:a}=this.getProps();!a&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),s&&s.setActive("whileDrag",!1)}endPanSession(){this.panSession&&this.panSession.end(),this.panSession=void 0}updateAxis(r,s,a){const{drag:u}=this.getProps();if(!a||!Hs(r,u,this.currentDirection))return;const f=this.getAxisMotionValue(r);let d=this.originPoint[r]+a[r];this.constraints&&this.constraints[r]&&(d=kw(d,this.constraints[r],this.elastic[r])),f.set(d)}resolveConstraints(){var f;const{dragConstraints:r,dragElastic:s}=this.getProps(),a=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):(f=this.visualElement.projection)==null?void 0:f.layout,u=this.constraints;r&&vr(r)?this.constraints||(this.constraints=this.resolveRefConstraints()):r&&a?this.constraints=Tw(a.layoutBox,r):this.constraints=!1,this.elastic=Ew(s),u!==this.constraints&&!vr(r)&&a&&this.constraints&&!this.hasMutatedConstraints&&bt(d=>{this.constraints!==!1&&this.getAxisMotionValue(d)&&(this.constraints[d]=Aw(a.layoutBox[d],this.constraints[d]))})}resolveRefConstraints(){const{dragConstraints:r,onMeasureDragConstraints:s}=this.getProps();if(!r||!vr(r))return!1;const a=r.current,{projection:u}=this.visualElement;if(!u||!u.layout)return!1;const f=Dx(a,u.root,this.visualElement.getTransformPagePoint());let d=Cw(u.layout.layoutBox,f);if(s){const h=s(jx(d));this.hasMutatedConstraints=!!h,h&&(d=sm(h))}return d}startAnimation(r){const{drag:s,dragMomentum:a,dragElastic:u,dragTransition:f,dragSnapToOrigin:d,onDragTransitionEnd:h}=this.getProps(),g=this.constraints||{},x=bt(y=>{if(!Hs(y,s,this.currentDirection))return;let v=g&&g[y]||{};(d===!0||d===y)&&(v={min:0,max:0});const w=u?200:1e6,C=u?40:1e7,N={type:"inertia",velocity:a?r[y]:0,bounceStiffness:w,bounceDamping:C,timeConstant:750,restDelta:1,restSpeed:10,...f,...v};return this.startAxisValueAnimation(y,N)});return Promise.all(x).then(h)}startAxisValueAnimation(r,s){const a=this.getAxisMotionValue(r);return Ul(this.visualElement,r),a.start(yu(r,a,0,s,this.visualElement,!1))}stopAnimation(){bt(r=>this.getAxisMotionValue(r).stop())}getAxisMotionValue(r){const s=`_drag${r.toUpperCase()}`,a=this.visualElement.getProps(),u=a[s];return u||this.visualElement.getValue(r,(a.initial?a.initial[r]:void 0)||0)}snapToCursor(r){bt(s=>{const{drag:a}=this.getProps();if(!Hs(s,a,this.currentDirection))return;const{projection:u}=this.visualElement,f=this.getAxisMotionValue(s);if(u&&u.layout){const{min:d,max:h}=u.layout.layoutBox[s],g=f.get()||0;f.set(r[s]-Ce(d,h,.5)+g)}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:r,dragConstraints:s}=this.getProps(),{projection:a}=this.visualElement;if(!vr(s)||!a||!this.constraints)return;this.stopAnimation();const u={x:0,y:0};bt(d=>{const h=this.getAxisMotionValue(d);if(h&&this.constraints!==!1){const g=h.get();u[d]=Pw({min:g,max:g},this.constraints[d])}});const{transformTemplate:f}=this.visualElement.getProps();this.visualElement.current.style.transform=f?f({},""):"none",a.root&&a.root.updateScroll(),a.updateLayout(),this.constraints=!1,this.resolveConstraints(),bt(d=>{if(!Hs(d,r,null))return;const h=this.getAxisMotionValue(d),{min:g,max:x}=this.constraints[d];h.set(Ce(g,x,u[d]))}),this.visualElement.render()}addListeners(){if(!this.visualElement.current)return;jw.set(this.visualElement,this);const r=this.visualElement.current,s=wi(r,"pointerdown",x=>{const{drag:y,dragListener:v=!0}=this.getProps(),w=x.target,C=w!==r&&lx(w);y&&v&&!C&&this.start(x)});let a;const u=()=>{const{dragConstraints:x}=this.getProps();vr(x)&&x.current&&(this.constraints=this.resolveRefConstraints(),a||(a=Mw(r,x.current,()=>this.scalePositionWithinConstraints())))},{projection:f}=this.visualElement,d=f.addEventListener("measure",u);f&&!f.layout&&(f.root&&f.root.updateScroll(),f.updateLayout()),ve.read(u);const h=Ci(window,"resize",()=>this.scalePositionWithinConstraints()),g=f.addEventListener("didUpdate",(({delta:x,hasLayoutChanged:y})=>{this.isDragging&&y&&(bt(v=>{const w=this.getAxisMotionValue(v);w&&(this.originPoint[v]+=x[v].translate,w.set(w.get()+x[v].translate))}),this.visualElement.render())}));return()=>{h(),s(),d(),g&&g(),a&&a()}}getProps(){const r=this.visualElement.getProps(),{drag:s=!1,dragDirectionLock:a=!1,dragPropagation:u=!1,dragConstraints:f=!1,dragElastic:d=ql,dragMomentum:h=!0}=r;return{...r,drag:s,dragDirectionLock:a,dragPropagation:u,dragConstraints:f,dragElastic:d,dragMomentum:h}}}function Yh(n){let r=!0;return()=>{if(r){r=!1;return}n()}}function Mw(n,r,s){const a=th(n,Yh(s)),u=th(r,Yh(s));return()=>{a(),u()}}function Hs(n,r,s){return(r===!0||r===n)&&(s===null||s===n)}function Dw(n,r=10){let s=null;return Math.abs(n.y)>r?s="y":Math.abs(n.x)>r&&(s="x"),s}class Lw extends An{constructor(r){super(r),this.removeGroupControls=Tt,this.removeListeners=Tt,this.controls=new Nw(r)}mount(){const{dragControls:r}=this.node.getProps();r&&(this.removeGroupControls=r.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||Tt}update(){const{dragControls:r}=this.node.getProps(),{dragControls:s}=this.node.prevProps||{};r!==s&&(this.removeGroupControls(),r&&(this.removeGroupControls=r.subscribe(this.controls)))}unmount(){this.removeGroupControls(),this.removeListeners(),this.controls.isDragging||this.controls.endPanSession()}}const Al=n=>(r,s)=>{n&&ve.update(()=>n(r,s),!1,!0)};class Rw extends An{constructor(){super(...arguments),this.removePointerDownListener=Tt}onPointerDown(r){this.session=new _m(r,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:Im(this.node)})}createPanHandlers(){const{onPanSessionStart:r,onPanStart:s,onPan:a,onPanEnd:u}=this.node.getProps();return{onSessionStart:Al(r),onStart:Al(s),onMove:Al(a),onEnd:(f,d)=>{delete this.session,u&&ve.postRender(()=>u(f,d))}}}mount(){this.removePointerDownListener=wi(this.node.current,"pointerdown",r=>this.onPointerDown(r))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}let El=!1;class Fw extends _.Component{componentDidMount(){const{visualElement:r,layoutGroup:s,switchLayoutGroup:a,layoutId:u}=this.props,{projection:f}=r;f&&(s.group&&s.group.add(f),a&&a.register&&u&&a.register(f),El&&f.root.didUpdate(),f.addEventListener("animationComplete",()=>{this.safeToRemove()}),f.setOptions({...f.options,layoutDependency:this.props.layoutDependency,onExitComplete:()=>this.safeToRemove()})),Zs.hasEverUpdated=!0}getSnapshotBeforeUpdate(r){const{layoutDependency:s,visualElement:a,drag:u,isPresent:f}=this.props,{projection:d}=a;return d&&(d.isPresent=f,r.layoutDependency!==s&&d.setOptions({...d.options,layoutDependency:s}),El=!0,u||r.layoutDependency!==s||s===void 0||r.isPresent!==f?d.willUpdate():this.safeToRemove(),r.isPresent!==f&&(f?d.promote():d.relegate()||ve.postRender(()=>{const h=d.getStack();(!h||!h.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{visualElement:r,layoutAnchor:s}=this.props,{projection:a}=r;a&&(a.options.layoutAnchor=s,a.root.didUpdate(),Su.postRender(()=>{!a.currentAnimation&&a.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:r,layoutGroup:s,switchLayoutGroup:a}=this.props,{projection:u}=r;El=!0,u&&(u.scheduleCheckAfterUnmount(),s&&s.group&&s.group.remove(u),a&&a.deregister&&a.deregister(u))}safeToRemove(){const{safeToRemove:r}=this.props;r&&r()}render(){return null}}function Om(n){const[r,s]=Em(),a=_.useContext(nu);return m.jsx(Fw,{...n,layoutGroup:a,switchLayoutGroup:_.useContext(Fm),isPresent:r,safeToRemove:s})}const Vw={pan:{Feature:Rw},drag:{Feature:Lw,ProjectionNode:Am,MeasureLayout:Om}};function Xh(n,r,s){const{props:a}=n;n.animationState&&a.whileHover&&n.animationState.setActive("whileHover",s==="Start");const u="onHover"+s,f=a[u];f&&ve.postRender(()=>f(r,ji(r)))}class Iw extends An{mount(){const{current:r}=this.node;r&&(this.unmount=ix(r,(s,a)=>(Xh(this.node,a,"Start"),u=>Xh(this.node,u,"End"))))}unmount(){}}class _w extends An{constructor(){super(...arguments),this.isActive=!1}onFocus(){let r=!1;try{r=this.node.current.matches(":focus-visible")}catch{r=!0}!r||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=Pi(Ci(this.node.current,"focus",()=>this.onFocus()),Ci(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}function Qh(n,r,s){const{props:a}=n;if(n.current instanceof HTMLButtonElement&&n.current.disabled)return;n.animationState&&a.whileTap&&n.animationState.setActive("whileTap",s==="Start");const u="onTap"+(s==="End"?"":s),f=a[u];f&&ve.postRender(()=>f(r,ji(r)))}class zw extends An{mount(){const{current:r}=this.node;if(!r)return;const{globalTapTarget:s,propagate:a}=this.node.props;this.unmount=cx(r,(u,f)=>(Qh(this.node,f,"Start"),(d,{success:h})=>Qh(this.node,d,h?"End":"Cancel")),{useGlobalTarget:s,stopPropagation:(a==null?void 0:a.tap)===!1})}unmount(){}}const Zl=new WeakMap,jl=new WeakMap,Ow=n=>{const r=Zl.get(n.target);r&&r(n)},Bw=n=>{n.forEach(Ow)};function bw({root:n,...r}){const s=n||document;jl.has(s)||jl.set(s,{});const a=jl.get(s),u=JSON.stringify(r);return a[u]||(a[u]=new IntersectionObserver(Bw,{root:n,...r})),a[u]}function Uw(n,r,s){const a=bw(r);return Zl.set(n,s),a.observe(n),()=>{Zl.delete(n),a.unobserve(n)}}const Ww={some:0,all:1};class Hw extends An{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){var g;(g=this.stopObserver)==null||g.call(this);const{viewport:r={}}=this.node.getProps(),{root:s,margin:a,amount:u="some",once:f}=r,d={root:s?s.current:void 0,rootMargin:a,threshold:typeof u=="number"?u:Ww[u]},h=x=>{const{isIntersecting:y}=x;if(this.isInView===y||(this.isInView=y,f&&!y&&this.hasEnteredView))return;y&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",y);const{onViewportEnter:v,onViewportLeave:w}=this.node.getProps(),C=y?v:w;C&&C(x)};this.stopObserver=Uw(this.node.current,d,h)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:r,prevProps:s}=this.node;["amount","margin","root"].some(Gw(r,s))&&this.startObserver()}unmount(){var r;(r=this.stopObserver)==null||r.call(this),this.hasEnteredView=!1,this.isInView=!1}}function Gw({viewport:n={}},{viewport:r={}}={}){return s=>n[s]!==r[s]}const Kw={inView:{Feature:Hw},tap:{Feature:zw},focus:{Feature:_w},hover:{Feature:Iw}},$w={layout:{ProjectionNode:Am,MeasureLayout:Om}},Yw={...yw,...Kw,...Vw,...$w},pe=fw(Yw,hw);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Xw=n=>n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Bm=(...n)=>n.filter((r,s,a)=>!!r&&r.trim()!==""&&a.indexOf(r)===s).join(" ").trim();/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var Qw={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const qw=_.forwardRef(({color:n="currentColor",size:r=24,strokeWidth:s=2,absoluteStrokeWidth:a,className:u="",children:f,iconNode:d,...h},g)=>_.createElement("svg",{ref:g,...Qw,width:r,height:r,stroke:n,strokeWidth:a?Number(s)*24/Number(r):s,className:Bm("lucide",u),...h},[...d.map(([x,y])=>_.createElement(x,y)),...Array.isArray(f)?f:[f]]));/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ct=(n,r)=>{const s=_.forwardRef(({className:a,...u},f)=>_.createElement(qw,{ref:f,iconNode:r,className:Bm(`lucide-${Xw(n)}`,a),...u}));return s.displayName=`${n}`,s};/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const bm=Ct("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Zw=Ct("Briefcase",[["path",{d:"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16",key:"jecpp"}],["rect",{width:"20",height:"14",x:"2",y:"6",rx:"2",key:"i6l2r4"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const kr=Ct("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Um=Ct("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"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const qh=Ct("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"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Zh=Ct("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"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Jw=Ct("Layers",[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Wm=Ct("Linkedin",[["path",{d:"M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z",key:"c2jq9f"}],["rect",{width:"4",height:"12",x:"2",y:"9",key:"mk3on5"}],["circle",{cx:"4",cy:"4",r:"2",key:"bt5ra8"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Jl=Ct("Mail",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const eS=Ct("Phone",[["path",{d:"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z",key:"foiqr5"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const lo=Ct("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const eu=Ct("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]),en={name:"VO NGUYEN DANG KHOA",title:"AI CREATIVE LEAD & SOFTWARE DEVELOPER",dob:"19/01/1993",phone:"0398300340",email:"vonguyendangkhoa@gmail.com",location:"Ho Chi Minh City, Vietnam",portfolio:"portfolio.khoavo.myds.me",github:"git.khoavo.myds.me/vndangkhoa",summary:"Highly accomplished Creative Leader bridging the gap between artistic direction and high-performance software engineering. With over 9+ years managing brand strategies and digital design, I evaluate and execute technology-driven projects from concept to production. Specialized in merging traditional creative direction with cutting-edge generative AI workflows (ComfyUI, FLUX) and full-stack development (Go, React)."},tS=[{period:"12/2012 - 06/2016",school:"RMIT Vietnam",degree:"Bachelor of Multimedia System Design (Graduated with Excellence)"}],nS=[{category:"Creative & AI Tools",items:"Adobe Creative Suite (Ps, Ai, Id, Pr), ComfyUI, Stable Diffusion, FLUX, Ollama, 3D Animation, Motion Graphics"},{category:"Development Stack",items:"React, Next.js, Go (Gin), Rust (Axum), Python (FastAPI), TypeScript, Tailwind CSS"},{category:"Infrastructure",items:"Docker, SQLite, Synology NAS Deployment, HLS Video Streaming"},{category:"Leadership",items:"Cross-Functional Management, Creative Strategy, Technical Mentorship, Process Optimization"}],rS=[{role:"AI Creative Lead",company:"Phibious Viet Nam",period:"06/2024 - Present",highlights:["Manage highly complex, technology-driven creative projects, merging traditional design with advanced generative AI models.","Deploy and utilize ComfyUI, Stable Diffusion, FLUX, and local LLMs (Ollama, LM Studio) to augment design workflows and drive agency strategies.","Lead cross-functional collaboration between traditional designers, copywriters, and data analysts.","Train and mentor the broader agency (including interns) on core AI design competencies and prompt engineering."]},{role:"eCOM Design Lead",company:"Procter & Gamble (P&G) Vietnam",period:"09/2023 - Present",highlights:["Spearheaded strategic design concepts and visual strategies for e-commerce, directly impacting consumer engagement for Hair Care brands.","Managed end-to-end medium-to-large design projects, actively improving internal design processes and ensuring standard compliance.","Collaborated globally across functional geographic boundaries to deliver cohesive brand stories."]},{role:"ECOM Graphic Designer (ABM)",company:"P&G Viet Nam",period:"11/2020 - 09/2023",highlights:["Executed visual strategy across vast consumer touchpoints including packaging, eCommerce, and social media under the Hair Care Packaging Design Studio.","Leveraged hands-on design mastery to craft illustrations and brand expressions that consistently met high commercial demands."]},{role:"Production Creative Lead",company:"Inn Saigon",period:"12/2019 - 11/2020",highlights:["Led the photography and production team, setting the standard for internal branding deliverables (Food, Product, Events).","Managed project budgets, retouching workflows, and cross-team communications to deliver high-volume outcomes."]},{role:"Regional Head of Design",company:"ASIAMARINE",period:"12/2018 - 12/2019",highlights:["Supervised all creation of concepts and layouts across digital/offline marketing for luxury marine sectors.","Managed independent contractors and junior designers, optimizing talent bidding and deadline tracking."]},{role:"Senior Graphic Designer",company:"EMG",period:"12/2017 - 12/2018",highlights:["Created outstanding digital and print designs, managing corporate identity and digital displays."]},{role:"Graphic Artist",company:"Le Meridien Saigon",period:"12/2016 - 12/2017",highlights:["Executed marketing collateral ensuring strict Le Meridien identity guidelines."]},{role:"Animation Designer",company:"Adidas Group",period:"06/2016 - 12/2016",highlights:["Developed graphics and animations for production environment simulations and visual training."]}],iS=[{name:"KV-Tube",tech:"Go (Gin), Next.js, SQLite, Docker, HLS.js",desc:"YouTube-like video streaming platform with HLS support, subscriptions, and Synology NAS deployment."},{name:"Spotify Clone",tech:"React, Rust (Axum), YouTube API",desc:"Full-featured music player with real-time lyrics and custom playlists."},{name:"APIx (kv-pix)",tech:"Next.js 14, TypeScript, Prisma",desc:"AI Image Generator powered by multiple providers (Grok, Meta, Whisk)."}],sS=[{name:"Dung Bui",title:"Senior Manager",company:"Adidas Group",contact:"dung.bui@adidas-group.com"},{name:"Wouter Pasman",title:"Graphic Designer",company:"FreshStudio.vn",contact:"0908074383"},{name:"Tran Nhuan Vu",title:"Marketing Mgr",company:"Element Mgmt",contact:"Vu.tran@element.vn"}],Ee={pageContainer:{width:"210mm",padding:"12mm 15mm",background:"#ffffff",fontFamily:"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",color:"#000000",fontSize:"9pt",lineHeight:"1.4",margin:"0 auto"},header:{borderBottom:"2px solid #000",paddingBottom:"4mm",marginBottom:"4mm"},name:{fontSize:"24pt",fontWeight:900,letterSpacing:"-0.02em",margin:"0 0 2px 0",lineHeight:"1"},title:{fontSize:"11pt",fontWeight:600,color:"#333",margin:"0 0 4mm 0",letterSpacing:"0.05em"},infoGrid:{display:"flex",flexWrap:"wrap",gap:"2mm 6mm",fontSize:"8pt",color:"#444"},sectionTitle:{fontSize:"11pt",fontWeight:800,textTransform:"uppercase",letterSpacing:"0.05em",borderBottom:"1px solid #ccc",paddingBottom:"1.5mm",margin:"4mm 0 3mm 0",color:"#000"},summary:{fontSize:"9pt",lineHeight:"1.5",margin:"0 0 4mm 0",textAlign:"justify"},skillGrid:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"2mm 4mm",marginBottom:"2mm"},experienceItem:{marginBottom:"3.5mm"},expHeader:{display:"flex",justifyContent:"space-between",alignItems:"baseline",marginBottom:"1mm"},expRole:{fontSize:"10pt",fontWeight:700,margin:0},expCompany:{fontWeight:600,color:"#333"},expPeriod:{fontSize:"8pt",color:"#555",fontWeight:600},expList:{margin:"0",paddingLeft:"4mm"},expBullet:{marginBottom:"1mm",textAlign:"justify"},projectItem:{marginBottom:"2mm"},projectHeader:{fontWeight:700,fontSize:"9.5pt"},projectTech:{fontSize:"7.5pt",color:"#555",fontFamily:"monospace",marginLeft:"2mm"},refGrid:{display:"flex",justifyContent:"space-between",fontSize:"8pt"}};function oS(){return m.jsxs("div",{style:Ee.pageContainer,children:[m.jsxs("div",{style:Ee.header,children:[m.jsx("h1",{style:Ee.name,children:en.name}),m.jsx("div",{style:Ee.title,children:en.title}),m.jsxs("div",{style:Ee.infoGrid,children:[m.jsxs("span",{children:[m.jsx("strong",{children:"Email:"})," ",en.email]}),m.jsxs("span",{children:[m.jsx("strong",{children:"Phone:"})," ",en.phone]}),m.jsxs("span",{children:[m.jsx("strong",{children:"Location:"})," ",en.location]}),m.jsxs("span",{children:[m.jsx("strong",{children:"Portfolio:"})," ",en.portfolio]}),m.jsxs("span",{children:[m.jsx("strong",{children:"GitHub:"})," ",en.github]}),m.jsxs("span",{children:[m.jsx("strong",{children:"DOB:"})," ",en.dob]})]})]}),m.jsx("p",{style:Ee.summary,children:en.summary}),m.jsx("h2",{style:Ee.sectionTitle,children:"Core Competencies"}),m.jsx("div",{style:Ee.skillGrid,children:nS.map((n,r)=>m.jsxs("div",{children:[m.jsx("strong",{style:{display:"block",fontSize:"8.5pt"},children:n.category}),m.jsx("span",{style:{fontSize:"8pt",color:"#333"},children:n.items})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"Work Experience"}),m.jsx("div",{children:rS.map((n,r)=>m.jsxs("div",{style:Ee.experienceItem,children:[m.jsxs("div",{style:Ee.expHeader,children:[m.jsxs("h3",{style:Ee.expRole,children:[n.role," ",m.jsx("span",{style:{fontWeight:400},children:"at"})," ",m.jsx("span",{style:Ee.expCompany,children:n.company})]}),m.jsx("span",{style:Ee.expPeriod,children:n.period})]}),m.jsx("ul",{style:Ee.expList,children:n.highlights.map((s,a)=>m.jsx("li",{style:Ee.expBullet,children:s},a))})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"Software Engineering Projects"}),m.jsx("div",{children:iS.map((n,r)=>m.jsxs("div",{style:Ee.projectItem,children:[m.jsx("span",{style:Ee.projectHeader,children:n.name}),m.jsxs("span",{style:Ee.projectTech,children:["[",n.tech,"]"]}),m.jsx("span",{style:{display:"block",fontSize:"8pt",color:"#333",marginTop:"0.5mm"},children:n.desc})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"Education"}),m.jsx("div",{children:tS.map((n,r)=>m.jsxs("div",{style:{display:"flex",justifyContent:"space-between"},children:[m.jsx("strong",{children:n.school}),m.jsx("span",{children:n.degree}),m.jsx("span",{style:Ee.expPeriod,children:n.period})]},r))}),m.jsx("h2",{style:Ee.sectionTitle,children:"References"}),m.jsx("div",{style:Ee.refGrid,children:sS.map((n,r)=>m.jsxs("div",{children:[m.jsx("strong",{children:n.name}),m.jsx("br",{}),m.jsxs("span",{style:{color:"#555"},children:[n.title,", ",n.company]}),m.jsx("br",{}),m.jsx("span",{children:n.contact})]},r))})]})}const Ut={name:"Vo Nguyen Dang Khoa",phone:"0398300340",email:"vonguyendangkhoa@gmail.com",location:"Ho Chi Minh City, Vietnam",linkedin:"https://www.linkedin.com/in/khoa-vo-76291236/",portfolio:"https://portfolio.khoavo.myds.me/"},Bt={title:"AI Creative Lead & Motion Designer",summary:"Visionary Creative Leader with 9+ years of expertise bridging brand strategy, digital design, motion graphics, and cutting-edge generative AI. Currently pioneering AI-augmented creative workflows at Phibious, merging traditional art direction with ComfyUI, Stable Diffusion, and FLUX to redefine what's possible in visual storytelling. Previously led eCommerce design at P&G, shaping digital experiences for millions of consumers across Southeast Asia.",tagline:"Where Design Meets Intelligence",skills:[{category:"AI & Generative Design",items:["ComfyUI","Stable Diffusion","FLUX","Midjourney","RunwayML","Ollama","LM Studio","LoRA Training","ControlNet","IP-Adapter"]},{category:"Design & Creative Tools",items:["Adobe Creative Suite","Figma","After Effects","Premiere Pro","Cinema 4D","Blender","Photoshop","Illustrator","InDesign"]},{category:"Motion & Animation",items:["Motion Graphics","3D Animation","Kinetic Typography","Visual Effects","Character Animation","Storyboarding"]},{category:"Brand & Strategy",items:["Brand Identity","Art Direction","Visual Storytelling","Editorial Design","Packaging Design","Strategic Design"]}],projects:[{id:1,title:"The Language of Poetry & Literature",category:"AI Generated Art",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2025/08/i2i_1756355661_62547902.png",description:"Exploring the ethereal boundary between reality and imagination through AI-generated visuals. Created with Stable Diffusion, ComfyUI, and custom LoRA training to capture the intangible essence of poetic imagery.",link:"https://portfolio.khoavo.myds.me/2025/08/28/the-language-of-poetry-and-literature/",year:"2025"},{id:2,title:"Delux Perfume – Fineline 2025 Launch",category:"AI Branding & Video",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2025/08/Delux-Perfume_red.png",description:"End-to-end creative strategy and art direction for premium perfume launch. From AI-generated mood boards and product visuals to cinematic video production, creating a cohesive brand narrative for Southeast Asia market.",link:"https://portfolio.khoavo.myds.me/2025/08/11/giving-art-direction-to-a-brand-a-case-study/",year:"2025"},{id:3,title:"AI Studio Photography",category:"AI-Generated Branding",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2025/07/img_0317.jpg",description:"Revolutionary approach to professional studio photography using AI. ComfyUI workflows with custom LoRA to generate studio-quality product and portrait images, reducing production costs by 70%.",link:"https://portfolio.khoavo.myds.me/2025/07/27/%F0%9F%A7%A0%F0%9F%93%B8-ai-studio-i-can-do-that-too/",year:"2025"},{id:4,title:"NAVIGATOR – ASIAMARINE Magazine",category:"Editorial Design",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2020/10/navigator-vol1_page_001.webp",description:"Complete editorial design for Vietnam's premier yacht market publication. Art direction, layout design, and visual storytelling for a luxury marine sector brand reaching high-net-worth readers across Asia.",link:"https://portfolio.khoavo.myds.me/2020/10/20/navigator/",year:"2020"},{id:5,title:"PetroVietnam – PCT Corporate Identity",category:"Brand Identity & 3D",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2017/04/cip_mockup2.png",description:"Comprehensive corporate identity for PetroVietnam Transportation. 3D vehicle visualization, logo design, stationery system, and POSM materials creating a cohesive national brand presence.",link:"https://portfolio.khoavo.myds.me/2017/04/10/petrovietnam-pct/",year:"2017"},{id:6,title:"Skyxx – Animated Poster Series",category:"Motion Graphics",image:"https://portfolio.khoavo.myds.me/wp-content/uploads/2019/04/aash-3-scaled.jpg",description:"Award-winning weekly animated poster series for entertainment events. Dynamic motion graphics with 3D elements, pushing creative boundaries under tight deadlines while maintaining exceptional quality.",link:"https://portfolio.khoavo.myds.me/2019/02/17/skyxx-poster-animation/",year:"2019"}],experience:[{role:"AI Creative Lead",company:"Phibious Vietnam",period:"2025 - Present",location:"Ho Chi Minh City",highlights:["Spearhead the integration of generative AI (ComfyUI, Stable Diffusion, FLUX) into creative workflows, reducing production time by 50%","Lead cross-functional teams of designers, copywriters, and data analysts to deliver technology-driven creative campaigns","Developed proprietary AI tools for mood boarding, concept visualization, and rapid prototyping","Created AI-augmented design concepts for digital and physical platforms serving Fortune 500 clients"]},{role:"eCommerce Design Lead",company:"Procter & Gamble (P&G)",period:"2020 - 2025",location:"Ho Chi Minh City",highlights:["Led visual strategy for eCommerce platforms across Hair Care category, directly impacting millions of consumers in SEA","Managed end-to-end design projects from concept to execution, aligning with global marketing strategies","Spearheaded the digital transformation of brand assets for omnichannel retail experiences","Mentored junior designers and established design standards adopted across the regional team"]},{role:"Production Creative Lead",company:"INN SaiGon",period:"Dec 2019 - Nov 2020",location:"Ho Chi Minh City",highlights:["Directed photography production for food, product, and event projects with 30+ client accounts","Established comprehensive brand guidelines and visual standards ensuring consistency across deliverables","Optimized post-production workflows, reducing turnaround time by 40%"]},{role:"Regional Head of Design",company:"ASIAMARINE",period:"2018 - 2019",location:"Ho Chi Minh City",highlights:["Led design team creating digital marketing assets, web graphics, and editorial content for luxury yacht brand","Delegated projects to junior designers while maintaining quality control and brand consistency","Collaborated with international teams to localize content for Asian markets"]},{role:"Senior Graphic Designer",company:"EMG - Element Management Group",period:"2017 - 2018",location:"Ho Chi Minh City",highlights:["Created impactful designs for print and digital campaigns for global luxury and lifestyle brands","Expert in photo sourcing, advanced image retouching, and brand identity development","Delivered corporate identity packages for multinational clients"]}],awards:[{title:"Best Digital Campaign",year:"2024",organization:"P&G SEA Digital Awards"},{title:"Outstanding Art Direction",year:"2019",organization:"Vietnam Design Awards"}]},yr={summary:"9-month intensive coding journey from zero to production. Built 5+ deployed applications including video streaming platforms, AI image generators, and music players. Proficient in modern web frameworks, containerization, and cloud deployment. Self-taught developer with a creative background bringing unique problem-solving perspective.",journey:[{month:"MAY '24",title:"The Spark",description:"First deep dive into Next.js. Abandoned manual CSS for Tailwind efficiency."},{month:"JUL '24",title:"First Production App",description:"Built kv-pix AI image generator with multi-provider support (Google Whisk, Meta AI, Grok)."},{month:"SEP '24",title:"Full-Stack Mastery",description:"Created KV-Tube YouTube platform with Go backend + Next.js. Dockerized for Synology NAS."},{month:"NOV '24",title:"The AI Pivot",description:"Fully embraced AI coding. Cursor and v0 became primary development engine."},{month:"DEC '24",title:"Rust Exploration",description:"Built Spotify clone with Rust Axum backend. Advanced system architecture."},{month:"PRESENT",title:"Vibe Ascended",description:"Building complex apps through high-level prompting and intuition."}],skills:{languages:["TypeScript","JavaScript","Go","Rust","Python","HTML/CSS","SQL"],frontend:["React","Next.js","Vite","Tailwind CSS","Shadcn","Framer Motion","Zustand","PWA"],backend:["Node.js","Go (Gin)","Rust (Axum)","Express","REST APIs","WebSocket"],ai:["LLM Integration","Cursor AI","v0","Replit AI","Ollama","Prompt Engineering","Multi-Provider AI APIs"],devops:["Docker","Docker Compose","GitHub Actions","Forgejo CI/CD","Synology NAS","Nginx","SQLite"],tools:["Git","VS Code","Figma","Postman","MongoDB","Prisma","ffmpeg"]},projects:[{name:"KV-Tube",description:"YouTube-like video streaming platform with HLS support, subscriptions, watch history, and PWA. Deployed on Synology NAS via Docker.",tech:["Go (Gin)","Next.js","TypeScript","SQLite","Docker","HLS.js","PWA"],github:"https://git.khoavo.myds.me/vndangkhoa/kv-tube"},{name:"Spotify Clone",description:"Full-featured Spotify-like music player with YouTube Music integration, real-time lyrics, custom playlists, and PWA support.",tech:["React (Vite)","Rust (Axum)","TailwindCSS","YouTube API","PWA"],github:"https://git.khoavo.myds.me/vndangkhoa/spotify-clone"},{name:"kv-pix (APIx)",description:"AI Image Generator powered by Google Whisk, Meta AI, and Grok. Multi-provider support with prompt library and history.",tech:["Next.js 14","TypeScript","Tailwind","Zustand","Docker"],github:"https://git.khoavo.myds.me/vndangkhoa/apix"},{name:"IT CV Portfolio",description:"This terminal-style interactive resume with typing animations and system aesthetics.",tech:["React","Vite","Tailwind","Framer Motion","TypeScript"],github:"https://git.khoavo.myds.me/vndangkhoa/it-cv"},{name:"kv-tiktok-download",description:"Douyin/TikTok video download API with batch processing support.",tech:["Python","FastAPI","yt-dlp"],github:"https://git.khoavo.myds.me/vndangkhoa/kv-tiktok-download"}],experience:[{role:"Creative Technology",company:"Phibious Vietnam",period:"2025 - Present",highlights:["Bridge between creative and technical teams","Develop interactive prototypes and AI-powered tools","Automate creative workflows with custom scripts","Build internal tools for design team productivity"]},{role:"Freelance Developer",company:"Self-Employed",period:"2024 - Present",highlights:["Built 5+ production web applications deployed on cloud and NAS","Integrated AI capabilities (image generation, video processing) into client solutions","Implemented CI/CD pipelines with GitHub/Forgejo Actions","Dockerized applications for easy deployment on various platforms"]}],forgejo:"https://git.khoavo.myds.me/vndangkhoa"},aS=({onSelect:n})=>{const[r,s]=_.useState(!1);return m.jsxs(pe.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0,y:-50},className:"fixed inset-0 overflow-hidden bg-[#FAFAFA]",children:[m.jsxs("div",{className:"relative w-full h-full flex flex-col items-center justify-center px-6",children:[m.jsxs("div",{className:"absolute inset-0 z-0",children:[m.jsx("div",{className:"absolute top-[-10%] left-[-10%] w-[40%] h-[40%] rounded-full bg-slate-100 blur-[120px] opacity-60 animate-pulse"}),m.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] w-[40%] h-[40%] rounded-full bg-slate-200 blur-[120px] opacity-60 animate-pulse",style:{animationDelay:"2s"}})]}),m.jsx("div",{className:"absolute inset-0 opacity-[0.03] bg-[linear-gradient(rgba(0,0,0,0.1)_1px,transparent_1px),linear-gradient(90deg,rgba(0,0,0,0.1)_1px,transparent_1px)] bg-[size:60px_60px]"}),m.jsx("div",{className:"relative z-10 max-w-5xl w-full text-center",children:m.jsxs(pe.div,{initial:{y:30,opacity:0},animate:{y:0,opacity:1},transition:{duration:1,ease:[.22,1,.36,1]},children:[m.jsx("div",{className:"overflow-hidden mb-4 py-2 px-4",children:m.jsx(pe.h1,{initial:{y:"100%"},animate:{y:0},transition:{duration:1.2,ease:[.22,1,.36,1],delay:.2},className:"text-[clamp(2rem,6.5vw,7.5rem)] font-serif font-bold text-[#1A1A1A] tracking-tighter leading-tight whitespace-nowrap",style:{textShadow:"0 2px 4px rgba(0,0,0,0.02)"},children:"Vo Nguyen Dang Khoa"})}),m.jsx(pe.p,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},transition:{duration:.8,delay:.8},className:"text-lg md:text-2xl font-serif text-[#1A1A1A]/70 mb-2 italic",children:"Where Design Meets Intelligence"}),m.jsx(pe.p,{initial:{opacity:0},animate:{opacity:1},transition:{duration:.8,delay:1},className:"text-[10px] font-bold tracking-[0.4em] text-[#1A1A1A]/30 uppercase mb-10 md:mb-12",children:"AI Creative Lead & Motion Designer"}),m.jsxs("button",{onClick:()=>n("creative"),className:"hidden md:inline-flex items-center gap-3 px-10 py-5 bg-[#1A1A1A] text-white text-lg font-medium rounded-full hover:bg-black hover:scale-105 transition-all shadow-2xl border-4 border-transparent hover:border-black/5",children:["Explore Portfolio",m.jsx(pe.div,{animate:{x:[0,5,0]},transition:{repeat:1/0,duration:1.5,ease:"easeInOut"},children:m.jsx(kr,{size:22})})]}),m.jsxs("div",{className:"md:hidden flex flex-col gap-4 mt-8",children:[m.jsxs("button",{onClick:()=>n("creative"),className:"flex items-center justify-between px-6 py-5 bg-[#1A1A1A] text-white font-medium rounded-2xl shadow-xl active:scale-[0.98] transition-transform",children:[m.jsxs("span",{className:"flex items-center gap-3",children:[m.jsx(lo,{size:18})," Creative Portfolio"]}),m.jsx(kr,{size:18})]}),m.jsxs("button",{onClick:()=>n("it"),className:"flex items-center justify-between px-6 py-5 border border-[#1A1A1A]/10 text-[#1A1A1A] font-medium rounded-2xl bg-white/50 backdrop-blur-md shadow-sm active:scale-[0.98] transition-transform",children:[m.jsxs("span",{className:"flex items-center gap-3",children:[m.jsx(eu,{size:18})," Developer Side"]}),m.jsx(kr,{size:18})]}),m.jsx("p",{className:"text-[10px] tracking-widest text-[#999] uppercase mt-2 opacity-60",children:"Select a persona to enter"})]})]})}),m.jsx(pe.div,{initial:{opacity:.5},animate:{opacity:r?0:.5},className:"absolute bottom-12 text-sm text-[#BBB] hidden md:block",children:m.jsxs("span",{className:"flex items-center gap-4",children:[m.jsx("span",{className:"w-12 h-px bg-[#BBB]"}),"Hover right to preview Developer side",m.jsx("span",{className:"w-12 h-px bg-[#BBB]"})]})})]}),m.jsxs(pe.div,{className:"absolute inset-y-0 right-0 w-full md:w-[75%] bg-[#0a0a0a] cursor-pointer hidden md:block z-40 border-l border-[#00FF94]/30",initial:{x:"calc(100% - 60px)"},animate:{x:r?"0%":"calc(100% - 60px)"},transition:{duration:.6,ease:[.22,1,.36,1]},onMouseEnter:()=>s(!0),onMouseLeave:()=>s(!1),onClick:()=>n("it"),children:[!r&&m.jsx(pe.div,{initial:{opacity:0},animate:{opacity:1},className:"absolute left-0 inset-y-0 w-[60px] flex items-center justify-center pointer-events-none",children:m.jsx("span",{className:"rotate-90 text-[10px] tracking-[0.5em] text-[#00FF94]/40 font-mono whitespace-nowrap",children:"DEVELOPER SIDE // PREVIEW"})}),m.jsx("div",{className:"absolute inset-0 opacity-[0.04] bg-[linear-gradient(rgba(0,255,136,0.1)_1px,transparent_1px),linear-gradient(90deg,rgba(0,255,136,0.1)_1px,transparent_1px)] bg-[size:25px_25px]"}),m.jsx("div",{className:"relative z-10 w-full h-full flex flex-col items-center justify-center px-8",children:m.jsxs("div",{className:"max-w-md text-center",children:[m.jsx(eu,{size:56,className:"text-[#00FF94] mx-auto mb-6"}),m.jsx("h2",{className:"text-4xl md:text-5xl font-bold text-white font-mono mb-2",children:"DEVELOPER"}),m.jsx("p",{className:"text-[#00FF94]/70 font-mono text-sm tracking-[0.3em] mb-8",children:"FULL-STACK & DEVOPS"}),m.jsxs("p",{className:"text-slate-400 font-mono text-base mb-8 leading-relaxed",children:["9-month coding journey.",m.jsx("br",{}),"Built 5+ production applications.",m.jsx("br",{}),"Self-taught with AI-powered development."]}),m.jsxs("button",{className:"inline-flex items-center gap-2 px-8 py-4 border-2 border-[#00FF94]/40 bg-[#00FF94]/10 text-[#00FF94] font-mono text-base rounded-full hover:bg-[#00FF94]/20 transition-colors",children:["Enter Terminal ",m.jsx(kr,{size:18})]}),m.jsxs("div",{className:"mt-10 font-mono text-sm text-[#00FF94]/40 text-left space-y-2",children:[m.jsxs("div",{children:[m.jsx("span",{className:"text-[#00D9FF]",children:"const"}),' stack = ["Go", "Rust", "TS"];']}),m.jsxs("div",{children:[m.jsx("span",{className:"text-[#00D9FF]",children:"const"})," deployed = 5;"]}),m.jsxs("div",{children:[m.jsx("span",{className:"text-[#00D9FF]",children:"const"}),' vibe = "S-Tier";']})]})]})})]}),m.jsx(pe.div,{initial:{opacity:0},animate:{opacity:r?0:1},transition:{duration:.4},className:"absolute top-8 left-6 md:left-8 z-50 text-[10px] md:text-lg",children:m.jsxs("div",{className:"text-[#1A1A1A] font-serif font-bold tracking-widest flex items-center gap-2",children:["KHOA.VO ",m.jsx("span",{className:"w-4 md:w-8 h-px bg-[#1A1A1A]/30"})]})})]})},lS=({onComplete:n})=>{const r=_.useRef(null);return _.useEffect(()=>{const s=window.innerWidth,a=window.innerHeight,u=Math.floor(s/8)+5,f=Math.floor(a/10)+5;let d=0;const h=()=>{d+=.08;let y="";for(let v=0;v1.5?y+="V":C>.8?y+="N":C>.2?y+="D":C>-.2?y+="K":C>-.8?y+="→":C>-1.2?y+="←":C>-1.8?y+="↑":y+="↓"}y+=` -`}return y},g=setInterval(()=>{r.current&&(r.current.textContent=h())},50),x=setTimeout(()=>{clearInterval(g),n()},5e3);return()=>{clearInterval(g),clearTimeout(x)}},[n]),m.jsxs(pe.div,{exit:{opacity:0,scale:1.05,filter:"blur(5px)",transition:{duration:.8,ease:[.76,0,.24,1]}},className:"fixed inset-0 z-[200] bg-[#FAFAFA] flex items-center justify-center overflow-hidden",children:[m.jsx("pre",{ref:r,className:"text-[#1A1A1A] font-mono font-bold italic text-[10px] md:text-xs leading-[10px] md:leading-[12px] opacity-30 select-none whitespace-pre transform scale-110",style:{letterSpacing:"0.15em"}}),m.jsxs("button",{onClick:n,className:"absolute bottom-8 right-8 z-[210] flex items-center gap-2 text-[10px] md:text-xs font-bold tracking-[0.2em] uppercase text-[#1A1A1A]/50 hover:text-[#1A1A1A] transition-colors bg-white/80 px-4 py-2 backdrop-blur-sm rounded",children:["Click to Skip ",m.jsx("span",{className:"opacity-50",children:"→"})]})]})},uS=({onComplete:n})=>{const[r,s]=_.useState([]),a=["INIT SYSTEM KHOA.VO...","MOUNTING VIRTUAL DOM [OK]","LOADING REACT ROOT [OK]","ESTABLISHING AI SUBSYSTEMS...","AI SUBSYSTEMS [ONLINE]","BYPASSING SECURITY PROTOCOLS...","ACCESS GRANTED."];return _.useEffect(()=>{let u=0;const f=setInterval(()=>{u[...d,a[u]]),u++):(clearInterval(f),setTimeout(n,500))},180);return()=>clearInterval(f)},[n]),m.jsx(pe.div,{exit:{opacity:0,scale:1.05,filter:"blur(10px)",transition:{duration:.6,ease:"easeIn"}},className:"fixed inset-0 z-[200] bg-[#0a0a0a] text-[#00FF94] font-mono p-6 md:p-12 flex flex-col justify-end pb-24",children:m.jsxs("div",{className:"space-y-2 opacity-80 text-sm md:text-base",children:[r.map((u,f)=>m.jsxs("div",{children:["> ",u]},f)),r.length ▋"})]})})},cS=({onBack:n,onSwitch:r})=>{const[s,a]=_.useState(!0),[u,f]=_.useState(!1),[d,h]=_.useState(null),[g,x]=_.useState([]);_.useEffect(()=>{const v=()=>{f(window.scrollY>400)};return window.addEventListener("scroll",v),()=>window.removeEventListener("scroll",v)},[]);const y=()=>{window.scrollTo({top:0,behavior:"smooth"})};return _.useEffect(()=>{if(s)return;const v=setTimeout(()=>{x(Bt.projects.map(w=>w.id))},500);return()=>clearTimeout(v)},[s]),m.jsxs(m.Fragment,{children:[m.jsx(Tr,{children:s&&m.jsx(lS,{onComplete:()=>a(!1)})}),m.jsxs(pe.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"min-h-screen bg-[#FAFAFA] text-[#1A1A1A]",children:[m.jsx("nav",{className:"fixed top-0 left-0 right-0 z-50 bg-[#FAFAFA]/90 backdrop-blur-sm border-b border-[#1A1A1A]/10",children:m.jsxs("div",{className:"max-w-7xl mx-auto px-4 md:px-6 h-16 flex items-center justify-between",children:[m.jsxs("button",{onClick:n,className:"p-2 flex items-center gap-1.5 text-sm md:text-base text-[#1A1A1A]/60 hover:text-[#1A1A1A] transition-colors",children:[m.jsx(bm,{size:18})," ",m.jsx("span",{className:"hidden md:inline",children:"Back"})]}),m.jsx("div",{className:"font-serif font-bold text-xl tracking-tighter",children:"KHOA.VO"}),m.jsxs("div",{className:"flex items-center gap-2",children:[m.jsxs("button",{onClick:()=>window.print(),className:"px-3 py-1.5 text-[10px] md:text-xs font-bold uppercase tracking-widest text-[#1A1A1A] border border-[#1A1A1A] rounded-full hover:bg-[#1A1A1A] hover:text-white transition-colors flex items-center gap-2",children:[m.jsx("span",{className:"hidden md:inline",children:"Download CV"}),m.jsx("span",{className:"md:hidden",children:"CV"})]}),m.jsxs("button",{onClick:r,className:"px-4 py-2 text-[10px] md:text-xs text-white bg-[#1A1A1A] border border-[#1A1A1A] rounded-full hover:bg-transparent hover:text-[#1A1A1A] transition-colors flex items-center gap-2",children:[m.jsx(eu,{size:14})," ",m.jsx("span",{className:"hidden md:inline",children:"IT View"}),m.jsx("span",{className:"md:hidden",children:"IT"})]})]})]})}),m.jsx(Tr,{children:u&&m.jsx(pe.button,{initial:{opacity:0,scale:.8,y:20},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.8,y:20},onClick:y,className:"fixed bottom-8 right-6 z-50 p-4 bg-[#1A1A1A] text-white rounded-full shadow-2xl md:hidden",children:m.jsx(kr,{size:20,className:"-rotate-90"})})}),m.jsxs("main",{className:"pt-20",children:[m.jsx("section",{className:"max-w-5xl mx-auto px-6 py-24 md:py-32",children:m.jsxs(pe.div,{initial:{opacity:0,y:30},animate:{opacity:1,y:0},transition:{duration:.8},children:[m.jsx("p",{className:"text-xs tracking-[0.3em] text-[#666] uppercase mb-4",children:Bt.title}),m.jsx("h1",{className:"text-5xl md:text-7xl font-serif font-bold leading-tight mb-4",children:Bt.tagline}),m.jsx("p",{className:"text-2xl md:text-3xl font-serif text-[#666] mb-8",children:Ut.name}),m.jsx("p",{className:"text-lg text-[#666] max-w-2xl leading-relaxed",children:Bt.summary}),m.jsxs("div",{className:"flex flex-wrap gap-4 mt-8 text-sm text-[#999]",children:[m.jsxs("span",{className:"flex items-center gap-1",children:[m.jsx(Zh,{size:14})," ",Ut.location]}),m.jsxs("span",{className:"flex items-center gap-1",children:[m.jsx(Jl,{size:14})," ",Ut.email]}),m.jsxs("span",{className:"flex items-center gap-1",children:[m.jsx(eS,{size:14})," ",Ut.phone]})]})]})}),Bt.awards&&Bt.awards.length>0&&m.jsx("section",{className:"max-w-5xl mx-auto px-6 pb-16",children:m.jsx("div",{className:"flex flex-wrap gap-6",children:Bt.awards.map((v,w)=>m.jsxs(pe.div,{initial:{opacity:0,y:20},whileInView:{opacity:1,y:0},viewport:{once:!0},transition:{delay:w*.1},className:"flex items-center gap-3 bg-[#F5F5F5] px-4 py-2 rounded-full",children:[m.jsx(lo,{size:14,className:"text-amber-500"}),m.jsx("span",{className:"text-sm font-medium",children:v.title}),m.jsx("span",{className:"text-xs text-[#999]",children:v.year})]},w))})}),m.jsxs("section",{className:"max-w-7xl mx-auto px-6 py-16",children:[m.jsxs(pe.div,{initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},className:"flex items-center gap-4 mb-12",children:[m.jsx(Jw,{size:20}),m.jsx("h2",{className:"text-2xl font-serif font-bold",children:"Selected Works"})]}),m.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:Bt.projects.map((v,w)=>m.jsxs(pe.div,{initial:{opacity:0,y:30},animate:{opacity:g.includes(v.id)?1:0,y:g.includes(v.id)?0:30},transition:{duration:.6,delay:w*.1},className:"group cursor-pointer",onClick:()=>h(v),children:[m.jsxs("div",{className:"relative aspect-[4/3] overflow-hidden bg-slate-200 mb-4",children:[m.jsx("img",{src:v.image,alt:v.title,className:"w-full h-full object-cover transition-transform duration-700 group-hover:scale-105"}),m.jsx("div",{className:"absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300"}),m.jsx("span",{className:"absolute top-4 right-4 bg-white/90 px-3 py-1 text-xs font-medium",children:v.year})]}),m.jsx("p",{className:"text-xs tracking-widest text-[#666] uppercase mb-1",children:v.category}),m.jsx("h3",{className:"text-lg font-serif font-semibold group-hover:text-[#666] transition-colors",children:v.title})]},v.id))})]}),m.jsxs("section",{className:"max-w-7xl mx-auto px-6 py-16 bg-[#F5F5F5]",children:[m.jsxs(pe.div,{initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},className:"flex items-center gap-4 mb-12",children:[m.jsx(lo,{size:20}),m.jsx("h2",{className:"text-2xl font-serif font-bold",children:"Expertise"})]}),m.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8",children:Bt.skills.map((v,w)=>m.jsxs(pe.div,{initial:{opacity:0,y:20},whileInView:{opacity:1,y:0},viewport:{once:!0},transition:{delay:w*.1},children:[m.jsx("h3",{className:"text-sm font-bold text-[#1A1A1A] mb-4 pb-2 border-b border-[#1A1A1A]/10",children:v.category}),m.jsx("div",{className:"flex flex-wrap gap-2",children:v.items.map(C=>m.jsx("span",{className:"text-xs text-[#666] bg-white px-3 py-1 border border-[#1A1A1A]/10",children:C},C))})]},v.category))})]}),m.jsxs("section",{className:"max-w-5xl mx-auto px-6 py-16",children:[m.jsxs(pe.div,{initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},className:"flex items-center gap-4 mb-12",children:[m.jsx(Zw,{size:20}),m.jsx("h2",{className:"text-2xl font-serif font-bold",children:"Professional Journey"})]}),m.jsxs("div",{className:"relative",children:[m.jsx("div",{className:"absolute left-0 top-0 bottom-0 w-px bg-[#1A1A1A]/10"}),m.jsx("div",{className:"space-y-10",children:Bt.experience.map((v,w)=>m.jsxs(pe.div,{initial:{opacity:0,x:-30},whileInView:{opacity:1,x:0},viewport:{once:!0},transition:{delay:w*.1},className:"relative pl-8",children:[m.jsx("div",{className:"absolute left-[-3px] top-2 w-2 h-2 bg-[#1A1A1A] rounded-full"}),m.jsxs("div",{className:"flex flex-col md:flex-row md:items-start gap-2 md:gap-6 mb-2",children:[m.jsx("div",{className:"text-sm font-medium text-[#1A1A1A] shrink-0",children:v.period}),m.jsxs("div",{children:[m.jsx("h3",{className:"text-xl font-bold text-[#1A1A1A]",children:v.role}),m.jsxs("div",{className:"flex items-center gap-2 text-[#666] mt-1",children:[m.jsx("span",{className:"font-medium",children:v.company}),v.location&&m.jsxs(m.Fragment,{children:[m.jsx("span",{className:"text-[#999]",children:"•"}),m.jsx("span",{className:"text-sm",children:v.location})]})]})]})]}),m.jsx("ul",{className:"text-[#666] space-y-2 mt-3",children:v.highlights.map((C,N)=>m.jsxs("li",{className:"leading-relaxed flex items-start gap-2",children:[m.jsx("span",{className:"w-1.5 h-1.5 bg-[#1A1A1A]/30 rounded-full mt-2 shrink-0"}),m.jsx("span",{children:C})]},N))})]},w))})]})]}),m.jsxs("footer",{className:"max-w-7xl mx-auto px-6 py-16 border-t border-[#1A1A1A]/10",children:[m.jsxs("div",{className:"flex flex-col md:flex-row justify-between items-center gap-8",children:[m.jsxs("div",{children:[m.jsx("h3",{className:"text-2xl font-serif font-bold mb-2",children:"Let's Create Together"}),m.jsx("p",{className:"text-[#666]",children:"Open for creative collaborations and opportunities"})]}),m.jsxs("div",{className:"flex gap-4",children:[m.jsx("a",{href:Ut.linkedin,target:"_blank",rel:"noreferrer",className:"p-3 border border-[#1A1A1A]/20 hover:bg-[#1A1A1A] hover:text-white transition-colors",children:m.jsx(Wm,{size:20})}),m.jsx("a",{href:Ut.email,className:"p-3 border border-[#1A1A1A]/20 hover:bg-[#1A1A1A] hover:text-white transition-colors",children:m.jsx(Jl,{size:20})}),m.jsx("a",{href:Ut.portfolio,target:"_blank",rel:"noreferrer",className:"p-3 border border-[#1A1A1A]/20 hover:bg-[#1A1A1A] hover:text-white transition-colors",children:m.jsx(Zh,{size:20})})]})]}),m.jsxs("p",{className:"text-center text-xs text-[#999] mt-12",children:["© ",new Date().getFullYear()," Vo Nguyen Dang Khoa. All rights reserved."]})]})]}),m.jsx(Tr,{children:d&&m.jsx(pe.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"fixed inset-0 z-[100] flex items-center justify-center bg-black/80 backdrop-blur-sm p-8",onClick:()=>h(null),children:m.jsxs(pe.div,{initial:{scale:.9,y:20},animate:{scale:1,y:0},exit:{scale:.9,y:20},className:"bg-[#FAFAFA] max-w-4xl w-full rounded-lg overflow-hidden",onClick:v=>v.stopPropagation(),children:[m.jsx("img",{src:d.image,alt:d.title,className:"w-full h-64 md:h-96 object-cover"}),m.jsxs("div",{className:"p-8",children:[m.jsx("p",{className:"text-xs tracking-widest text-[#666] uppercase mb-2",children:d.category}),m.jsx("h3",{className:"text-2xl font-serif font-bold mb-4",children:d.title}),m.jsx("p",{className:"text-[#666] mb-6",children:d.description}),m.jsxs("a",{href:d.link,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-2 text-sm font-medium text-[#1A1A1A] border-b border-[#1A1A1A] pb-1 hover:opacity-60",children:["View Project ",m.jsx(Um,{size:14})]})]})]})})})]})]})},dS=({onBack:n,onSwitch:r})=>{const[s,a]=_.useState(!0),[u,f]=_.useState("about"),[d,h]=_.useState(""),[g,x]=_.useState(!1),y=`> whoami - -Vo Nguyen Dang Khoa -AI-Powered Developer -9-month coding journey from zero to production`;_.useEffect(()=>{const w=()=>{x(window.scrollY>400)};return window.addEventListener("scroll",w),()=>window.removeEventListener("scroll",w)},[]);const v=()=>{window.scrollTo({top:0,behavior:"smooth"})};return _.useEffect(()=>{if(s)return;let w=0;const C=setInterval(()=>{wclearInterval(C)},[s]),m.jsxs(m.Fragment,{children:[m.jsx(Tr,{children:s&&m.jsx(uS,{onComplete:()=>a(!1)})}),m.jsxs(pe.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"min-h-screen bg-[#0a0a0a] text-[#00FF94] font-mono",children:[m.jsx(Tr,{children:g&&m.jsx(pe.button,{initial:{opacity:0,scale:.8,y:20},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.8,y:20},onClick:v,className:"fixed bottom-8 right-6 z-50 p-4 bg-[#00FF94] text-[#0a0a0a] rounded-full shadow-[0_0_20px_rgba(0,255,148,0.3)] md:hidden",children:m.jsx(kr,{size:20,className:"-rotate-90"})})}),m.jsx("nav",{className:"fixed top-0 left-0 right-0 z-50 bg-[#0a0a0a]/90 backdrop-blur-sm border-b border-[#00FF94]/20",children:m.jsxs("div",{className:"max-w-6xl mx-auto px-4 h-14 flex items-center justify-between",children:[m.jsxs("button",{onClick:n,className:"p-2 -ml-2 flex items-center gap-1.5 text-xs text-[#00FF94]/60 hover:text-[#00FF94] transition-colors uppercase",children:[m.jsx(bm,{size:16})," ",m.jsx("span",{className:"hidden md:inline",children:"Exit"})]}),m.jsxs("div",{className:"text-sm font-bold tracking-tighter",children:[m.jsx("span",{className:"text-[#00FF94]",children:"KHOA"}),m.jsx("span",{className:"text-white",children:"."}),m.jsx("span",{className:"text-[#00D9FF]",children:"VO"})]}),m.jsxs("div",{className:"flex items-center gap-2",children:[m.jsxs("button",{onClick:()=>window.print(),className:"px-3 py-1.5 text-[10px] md:text-xs text-[#00FF94] border border-[#00FF94] rounded hover:bg-[#00FF94] hover:text-[#0a0a0a] transition-colors flex items-center gap-1.5 font-bold uppercase",children:[m.jsx("span",{className:"hidden md:inline",children:"Download CV"}),m.jsx("span",{className:"md:hidden",children:"CV"})]}),m.jsxs("button",{onClick:r,className:"px-3 py-1.5 text-[10px] md:text-xs text-[#0a0a0a] bg-[#00FF94] border border-[#00FF94] rounded hover:bg-transparent hover:text-[#00FF94] transition-colors flex items-center gap-1.5 uppercase font-bold",children:[m.jsx(lo,{size:12})," ",m.jsx("span",{className:"hidden md:inline",children:"Design View"}),m.jsx("span",{className:"md:hidden",children:"Design"})]})]})]})}),m.jsx("main",{className:"pt-16",children:m.jsxs("div",{className:"max-w-5xl mx-4 md:mx-auto",children:[m.jsxs("div",{className:"flex items-center gap-2 px-4 py-2 bg-[#111] border border-[#00FF94]/20 border-b-0 rounded-t-lg",children:[m.jsx("div",{className:"w-3 h-3 rounded-full bg-red-500/50"}),m.jsx("div",{className:"w-3 h-3 rounded-full bg-yellow-500/50"}),m.jsx("div",{className:"w-3 h-3 rounded-full bg-green-500/50"}),m.jsx("span",{className:"ml-4 text-xs text-[#00FF94]/50",children:"khoa@portfolio ~"})]}),m.jsxs("div",{className:"border border-[#00FF94]/20 bg-[#0a0a0a] p-6 md:p-8 min-h-[80vh]",children:[m.jsx("div",{className:"flex gap-2 overflow-x-auto pb-4 mb-4 md:mb-8 no-scrollbar touch-pan-x",children:["about","skills","projects","experience"].map(w=>m.jsx("button",{onClick:()=>f(w),className:`px-5 py-3 md:px-4 md:py-2 text-[10px] md:text-xs border transition-colors whitespace-nowrap shrink-0 ${u===w?"border-[#00FF94] bg-[#00FF94]/10 text-[#00FF94]":"border-[#00FF94]/30 text-[#00FF94]/50 hover:text-[#00FF94] hover:border-[#00FF94]/50"}`,children:w.toUpperCase()},w))}),u==="about"&&m.jsxs(pe.div,{initial:{opacity:0},animate:{opacity:1},children:[m.jsx("div",{className:"text-xs text-[#00FF94]/50 mb-4",children:"SYSTEM STARTED..."}),m.jsxs("pre",{className:"text-sm leading-relaxed whitespace-pre-wrap",children:[d,m.jsx("span",{className:"animate-pulse",children:"▋"})]}),m.jsxs("div",{className:"mt-8 pt-8 border-t border-[#00FF94]/20",children:[m.jsx("div",{className:"text-xs text-[#00FF94]/50 mb-2",children:"> echo $JOURNEY"}),m.jsx("div",{className:"space-y-4",children:yr.journey.map((w,C)=>m.jsxs("div",{className:"flex gap-4",children:[m.jsx("span",{className:"text-[#00D9FF] text-xs shrink-0",children:w.month}),m.jsxs("div",{children:[m.jsx("span",{className:"text-white",children:w.title}),m.jsxs("span",{className:"text-[#00FF94]/50",children:[" — ",w.description]})]})]},C))})]}),m.jsxs("div",{className:"mt-8 pt-8 border-t border-[#00FF94]/20",children:[m.jsx("div",{className:"text-xs text-[#00FF94]/50 mb-4",children:"> cat summary.txt"}),m.jsx("p",{className:"text-sm text-slate-300 leading-relaxed max-w-xl",children:yr.summary})]})]}),u==="skills"&&m.jsx(pe.div,{initial:{opacity:0},animate:{opacity:1},children:Object.entries(yr.skills).map(([w,C])=>m.jsxs("div",{className:"mb-6",children:[m.jsx("div",{className:"text-xs text-[#00D9FF] mb-2 uppercase tracking-wider",children:w}),m.jsx("div",{className:"flex flex-wrap gap-2",children:C.map((N,D)=>m.jsx("span",{className:"text-sm border border-[#00FF94]/30 px-3 py-1 bg-[#00FF94]/5",children:N},D))})]},w))}),u==="projects"&&m.jsx(pe.div,{initial:{opacity:0},animate:{opacity:1},children:m.jsx("div",{className:"space-y-6",children:yr.projects.map((w,C)=>m.jsxs("div",{className:"border border-[#00FF94]/20 p-4 hover:border-[#00FF94]/40 transition-colors",children:[m.jsxs("div",{className:"flex items-center justify-between mb-2",children:[m.jsx("span",{className:"text-white font-bold",children:w.name}),m.jsxs("div",{className:"flex gap-2",children:[w.demo&&m.jsx("a",{href:w.demo,target:"_blank",rel:"noreferrer",className:"text-[#00D9FF] hover:text-[#00FF94]",title:"Live Demo",children:m.jsx(Um,{size:16})}),m.jsx("a",{href:w.github,target:"_blank",rel:"noreferrer",className:"text-[#00FF94] hover:text-[#00D9FF]",children:m.jsx(qh,{size:16})})]})]}),m.jsx("p",{className:"text-sm text-slate-400 mb-3",children:w.description}),m.jsx("div",{className:"flex flex-wrap gap-2",children:w.tech.map((N,D)=>m.jsx("span",{className:"text-xs bg-[#00FF94]/10 px-2 py-0.5 text-[#00FF94]",children:N},D))})]},C))})}),u==="experience"&&m.jsx(pe.div,{initial:{opacity:0},animate:{opacity:1},children:m.jsx("div",{className:"space-y-6",children:yr.experience.map((w,C)=>m.jsxs("div",{className:"border-l-2 border-[#00FF94] pl-4",children:[m.jsxs("div",{className:"flex justify-between items-start mb-2",children:[m.jsx("span",{className:"text-white font-bold",children:w.role}),m.jsx("span",{className:"text-xs text-[#00FF94]/50",children:w.period})]}),m.jsx("div",{className:"text-sm text-[#00D9FF] mb-2",children:w.company}),m.jsx("ul",{className:"text-sm text-slate-400 space-y-1",children:w.highlights.map((N,D)=>m.jsxs("li",{children:["• ",N]},D))})]},C))})}),m.jsxs("div",{className:"mt-12 pt-8 border-t border-[#00FF94]/20",children:[m.jsx("div",{className:"text-xs text-[#00FF94]/50 mb-4",children:"> exit --contact"}),m.jsxs("div",{className:"flex flex-wrap gap-4",children:[m.jsxs("a",{href:`mailto:${Ut.email}`,className:"flex items-center gap-2 text-sm text-slate-300 hover:text-[#00FF94]",children:[m.jsx(Jl,{size:14})," ",Ut.email]}),m.jsxs("a",{href:yr.forgejo,target:"_blank",rel:"noreferrer",className:"flex items-center gap-2 text-sm text-slate-300 hover:text-[#00FF94]",children:[m.jsx(qh,{size:14})," git.khoavo.myds.me/vndangkhoa"]}),m.jsxs("a",{href:Ut.linkedin,target:"_blank",rel:"noreferrer",className:"flex items-center gap-2 text-sm text-slate-300 hover:text-[#00FF94]",children:[m.jsx(Wm,{size:14})," linkedin.com/in/khoa-vo-76291236"]})]})]})]})]})}),m.jsxs("footer",{className:"py-8 text-center text-xs text-[#00FF94]/30",children:["khoa@portfolio:~$ echo ",new Date().getFullYear()," © Vo Nguyen Dang Khoa"]})]})]})};function fS(){const[n,r]=_.useState("landing"),[s,a]=_.useState(!1),u=d=>{r(d)},f=()=>{r("landing")};return m.jsxs(m.Fragment,{children:[m.jsxs(Tr,{mode:"wait",children:[n==="landing"&&m.jsx(aS,{onSelect:u},"landing"),n==="creative"&&m.jsx(cS,{onBack:f,onSwitch:()=>r("it")},"creative"),n==="it"&&m.jsx(dS,{onBack:f,onSwitch:()=>r("creative")},"it")]}),m.jsx("div",{className:"print-portfolio",children:m.jsx(oS,{})})]})}Qy.createRoot(document.getElementById("root")).render(m.jsx(Wy.StrictMode,{children:m.jsx(fS,{})})); diff --git a/dist/assets/index-zJ5r8A23.css b/dist/assets/index-zJ5r8A23.css deleted file mode 100644 index 07fdde8..0000000 --- a/dist/assets/index-zJ5r8A23.css +++ /dev/null @@ -1 +0,0 @@ -@import"https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";body{background-color:#020617}@media print{@page{size:A4;margin:0}html,body{margin:0!important;padding:0!important;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;-webkit-print-color-adjust:exact;print-color-adjust:exact}body>*{display:none!important}#root{display:block!important}#root>*:not(.print-portfolio){display:none!important}.print-portfolio{display:block!important;width:210mm;margin:0 auto}.page,.page-content,.cover-page,.contact-page,.portfolio-grid{display:none}.cover-content{text-align:center;color:#fff;padding:40mm}.cover-name{font-size:38pt;font-weight:800;letter-spacing:-.02em;margin:0 0 12px;color:#000}.cover-title{font-size:16pt;font-weight:500;color:#666;margin:0 0 30px;letter-spacing:.15em;text-transform:uppercase}.cover-contact{display:flex;flex-wrap:wrap;justify-content:center;gap:8px 20px;font-size:9pt;color:#333}.cover-contact span{white-space:nowrap}.section{margin-bottom:8mm}.section-title{font-size:16pt;font-weight:700;color:#000;margin:0 0 6mm;padding-bottom:3mm;border-bottom:2px solid #000000}.summary-section{background:#f8fafc;padding:6mm;border-radius:4mm;border-left:4px solid #000000}.summary-text{font-size:10pt;line-height:1.7;color:#333;margin:0}.experience-list{display:flex;flex-direction:column;gap:5mm}.experience-item{padding-bottom:5mm;border-bottom:1px solid #e2e8f0}.experience-item:last-child{border-bottom:none}.experience-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:2mm}.experience-role{font-size:12pt;font-weight:700;color:#0f172a;margin:0}.experience-company{font-size:9pt;color:#333;margin:2px 0 0;font-weight:500}.experience-period{font-size:8pt;color:#64748b;white-space:nowrap;background:#f1f5f9;padding:2px 8px;border-radius:3px;border:1px solid #e2e8f0}.experience-highlights{margin:3mm 0 0;padding-left:5mm}.experience-highlights li{font-size:9pt;line-height:1.6;color:#475569;margin-bottom:2mm}.skills-grid{display:grid;grid-template-columns:1fr 1fr;gap:4mm}.skill-category{background:#f8fafc;padding:4mm;border-radius:3mm;border-left:3px solid #000000}.skill-category h3{font-size:10pt;font-weight:700;color:#0f172a;margin:0 0 2mm}.skill-category p{font-size:8.5pt;color:#475569;margin:0;line-height:1.5}.portfolio-grid{display:flex;flex-direction:column;gap:5mm}.portfolio-item{display:flex;gap:4mm;background:#f8fafc;border-radius:3mm;overflow:hidden;border:1px solid #e2e8f0}.portfolio-image{width:45mm;height:35mm;-o-object-fit:cover;object-fit:cover;flex-shrink:0}.portfolio-info{padding:3mm 4mm 3mm 0;flex:1}.portfolio-category{font-size:7pt;font-weight:600;color:#333;text-transform:uppercase;letter-spacing:.05em}.portfolio-title{font-size:11pt;font-weight:700;color:#000;margin:1mm 0 2mm}.portfolio-description{font-size:8pt;color:#475569;line-height:1.5;margin:0}.contact-page{background:transparent;display:flex;align-items:center;justify-content:center}.contact-content{text-align:center;color:#000;padding:40mm}.contact-title{font-size:32pt;font-weight:800;margin:0 0 6mm;color:#000}.contact-subtitle{font-size:10pt;color:#666;margin:0 0 12mm}.contact-details{display:grid;grid-template-columns:1fr 1fr;gap:5mm;text-align:left}.contact-item{background:#ffffff0d;padding:4mm;border-radius:3mm;border:1px solid rgba(255,255,255,.1)}.contact-item strong{display:block;font-size:7pt;color:#22d3ee;text-transform:uppercase;letter-spacing:.1em;margin-bottom:2mm}.contact-item span{font-size:9pt;color:#cbd5e1;word-break:break-all}}.print-portfolio{display:none}.print-portfolio.show-preview{display:block;background:#1e293b;padding:20px}.print-portfolio.show-preview .page{width:210mm;min-height:297mm;margin:0 auto 20px;box-shadow:0 10px 40px #00000080;page-break-after:auto;-moz-column-break-after:auto;break-after:auto}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.bottom-12{bottom:3rem}.bottom-8{bottom:2rem}.bottom-\[-10\%\]{bottom:-10%}.left-0{left:0}.left-6{left:1.5rem}.left-\[-10\%\]{left:-10%}.left-\[-3px\]{left:-3px}.right-0{right:0}.right-4{right:1rem}.right-6{right:1.5rem}.right-8{right:2rem}.right-\[-10\%\]{right:-10%}.top-0{top:0}.top-2{top:.5rem}.top-4{top:1rem}.top-8{top:2rem}.top-\[-10\%\]{top:-10%}.z-0{z-index:0}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[200\]{z-index:200}.z-\[210\]{z-index:210}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.-ml-2{margin-left:-.5rem}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-4{margin-left:1rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-8{margin-top:2rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.aspect-\[4\/3\]{aspect-ratio:4/3}.h-1\.5{height:.375rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-64{height:16rem}.h-\[40\%\]{height:40%}.h-full{height:100%}.h-px{height:1px}.min-h-\[80vh\]{min-height:80vh}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-12{width:3rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-\[40\%\]{width:40%}.w-\[60px\]{width:60px}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-md{max-width:28rem}.max-w-xl{max-width:36rem}.shrink-0{flex-shrink:0}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.touch-pan-x{--tw-pan-x: pan-x;touch-action:var(--tw-pan-x) var(--tw-pan-y) var(--tw-pinch-zoom)}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-\[\#00FF94\]{--tw-border-opacity: 1;border-color:rgb(0 255 148 / var(--tw-border-opacity, 1))}.border-\[\#00FF94\]\/20{border-color:#00ff9433}.border-\[\#00FF94\]\/30{border-color:#00ff944d}.border-\[\#00FF94\]\/40{border-color:#00ff9466}.border-\[\#1A1A1A\]{--tw-border-opacity: 1;border-color:rgb(26 26 26 / var(--tw-border-opacity, 1))}.border-\[\#1A1A1A\]\/10{border-color:#1a1a1a1a}.border-\[\#1A1A1A\]\/20{border-color:#1a1a1a33}.border-transparent{border-color:transparent}.bg-\[\#00FF94\]{--tw-bg-opacity: 1;background-color:rgb(0 255 148 / var(--tw-bg-opacity, 1))}.bg-\[\#00FF94\]\/10{background-color:#00ff941a}.bg-\[\#00FF94\]\/5{background-color:#00ff940d}.bg-\[\#0a0a0a\]{--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.bg-\[\#0a0a0a\]\/90{background-color:#0a0a0ae6}.bg-\[\#111\]{--tw-bg-opacity: 1;background-color:rgb(17 17 17 / var(--tw-bg-opacity, 1))}.bg-\[\#1A1A1A\]{--tw-bg-opacity: 1;background-color:rgb(26 26 26 / var(--tw-bg-opacity, 1))}.bg-\[\#1A1A1A\]\/10{background-color:#1a1a1a1a}.bg-\[\#1A1A1A\]\/30{background-color:#1a1a1a4d}.bg-\[\#BBB\]{--tw-bg-opacity: 1;background-color:rgb(187 187 187 / var(--tw-bg-opacity, 1))}.bg-\[\#F5F5F5\]{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.bg-\[\#FAFAFA\]{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-\[\#FAFAFA\]\/90{background-color:#fafafae6}.bg-black\/0{background-color:#0000}.bg-black\/80{background-color:#000c}.bg-green-500\/50{background-color:#22c55e80}.bg-red-500\/50{background-color:#ef444480}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/50{background-color:#ffffff80}.bg-white\/80{background-color:#fffc}.bg-white\/90{background-color:#ffffffe6}.bg-yellow-500\/50{background-color:#eab30880}.bg-\[linear-gradient\(rgba\(0\,0\,0\,0\.1\)_1px\,transparent_1px\)\,linear-gradient\(90deg\,rgba\(0\,0\,0\,0\.1\)_1px\,transparent_1px\)\]{background-image:linear-gradient(rgba(0,0,0,.1) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.1) 1px,transparent 1px)}.bg-\[linear-gradient\(rgba\(0\,255\,136\,0\.1\)_1px\,transparent_1px\)\,linear-gradient\(90deg\,rgba\(0\,255\,136\,0\.1\)_1px\,transparent_1px\)\]{background-image:linear-gradient(rgba(0,255,136,.1) 1px,transparent 1px),linear-gradient(90deg,rgba(0,255,136,.1) 1px,transparent 1px)}.bg-\[size\:25px_25px\]{background-size:25px 25px}.bg-\[size\:60px_60px\]{background-size:60px 60px}.object-cover{-o-object-fit:cover;object-fit:cover}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-24{padding-bottom:6rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pt-16{padding-top:4rem}.pt-20{padding-top:5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[clamp\(2rem\,6\.5vw\,7\.5rem\)\]{font-size:clamp(2rem,6.5vw,7.5rem)}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-\[10px\]{line-height:10px}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-\[0\.4em\]{letter-spacing:.4em}.tracking-\[0\.5em\]{letter-spacing:.5em}.tracking-tighter{letter-spacing:-.05em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[\#00D9FF\]{--tw-text-opacity: 1;color:rgb(0 217 255 / var(--tw-text-opacity, 1))}.text-\[\#00FF94\]{--tw-text-opacity: 1;color:rgb(0 255 148 / var(--tw-text-opacity, 1))}.text-\[\#00FF94\]\/30{color:#00ff944d}.text-\[\#00FF94\]\/40{color:#00ff9466}.text-\[\#00FF94\]\/50{color:#00ff9480}.text-\[\#00FF94\]\/60{color:#00ff9499}.text-\[\#00FF94\]\/70{color:#00ff94b3}.text-\[\#0a0a0a\]{--tw-text-opacity: 1;color:rgb(10 10 10 / var(--tw-text-opacity, 1))}.text-\[\#1A1A1A\]{--tw-text-opacity: 1;color:rgb(26 26 26 / var(--tw-text-opacity, 1))}.text-\[\#1A1A1A\]\/30{color:#1a1a1a4d}.text-\[\#1A1A1A\]\/50{color:#1a1a1a80}.text-\[\#1A1A1A\]\/60{color:#1a1a1a99}.text-\[\#1A1A1A\]\/70{color:#1a1a1ab3}.text-\[\#666\]{--tw-text-opacity: 1;color:rgb(102 102 102 / var(--tw-text-opacity, 1))}.text-\[\#999\]{--tw-text-opacity: 1;color:rgb(153 153 153 / var(--tw-text-opacity, 1))}.text-\[\#BBB\]{--tw-text-opacity: 1;color:rgb(187 187 187 / var(--tw-text-opacity, 1))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.opacity-\[0\.03\]{opacity:.03}.opacity-\[0\.04\]{opacity:.04}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_20px_rgba\(0\,255\,148\,0\.3\)\]{--tw-shadow: 0 0 20px rgba(0,255,148,.3);--tw-shadow-colored: 0 0 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-\[120px\]{--tw-blur: blur(120px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.duration-700{transition-duration:.7s}html{scroll-behavior:smooth}body{background-color:#fafafa;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.font-serif{font-family:Playfair Display,Georgia,serif}.font-mono{font-family:JetBrains Mono,Fira Code,Consolas,monospace}.print-only-version{display:none!important}.print-portfolio.show-preview{display:block!important;background:#1e293b;padding:20px}.print-portfolio.show-preview .pdf-content{display:block!important}.print-portfolio.show-preview .page{width:210mm;min-height:297mm;margin:0 auto 20px;box-shadow:0 10px 40px #00000080;display:block!important;background:#fff!important}.pdf-content{display:block!important}@media print{@page{size:A4;margin:0}*{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important;color-adjust:exact!important}html,body{margin:0!important;padding:0!important;background:#fff!important;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important;color:#000!important}.app-main,.fixed.inset-0{display:none!important}.print-only-version{display:block!important;visibility:visible!important;position:absolute!important;top:0!important;left:0!important;width:100%!important;background:#fff!important}.pdf-content{display:block!important;background:none!important;padding:0!important;margin:0!important;width:210mm!important}.pdf-content .page{width:210mm!important;height:297mm!important;page-break-after:always!important;-moz-column-break-after:page!important;break-after:page!important;position:relative!important;overflow:hidden!important;background:#fff!important;margin:0!important;padding:0!important;display:block!important}.pdf-content .page:last-child{page-break-after:avoid!important;-moz-column-break-after:avoid!important;break-after:avoid!important}.pdf-content .page-content{padding:18mm 16mm!important;height:100%!important;display:flex!important;flex-direction:column!important}.pdf-content .cover-page{background:#111827!important;display:flex!important;align-items:center!important;justify-content:center!important}.pdf-content .cover-content{text-align:center!important;color:#fff!important;padding:35mm 30mm!important}.pdf-content .cover-name{font-size:38pt!important;font-weight:800!important;letter-spacing:-.02em!important;margin:0!important;color:#fff!important}.pdf-content .cover-accent{font-size:38pt!important;font-weight:800!important;letter-spacing:-.02em!important;margin:0!important;color:#60a5fa!important}.pdf-content .cover-divider{width:60px!important;height:3px!important;background:#60a5fa!important;margin:0 auto 35px!important}.pdf-content .cover-title{font-size:16pt!important;font-weight:500!important;color:#9ca3af!important;margin:0 0 35px!important;letter-spacing:.15em!important;text-transform:uppercase!important}.pdf-content .cover-contact{display:flex!important;flex-wrap:wrap!important;justify-content:center!important;gap:6px 18px!important;font-size:9pt!important;color:#9ca3af!important}.pdf-content .cover-contact span{white-space:nowrap!important}.pdf-content .section{margin-bottom:7mm!important}.pdf-content .section-title{font-size:15pt!important;font-weight:700!important;color:#111827!important;margin:0 0 5mm!important;padding-bottom:2.5mm!important;border-bottom:2px solid #1e40af!important;text-transform:uppercase!important;letter-spacing:.05em!important}.pdf-content .summary-section{background:#f9fafb!important;padding:5mm!important;border-left:3px solid #1e40af!important}.pdf-content .summary-text{font-size:9.5pt!important;line-height:1.7!important;color:#374151!important;margin:0!important}.pdf-content .experience-list{display:flex!important;flex-direction:column!important;gap:4mm!important}.pdf-content .experience-item{padding-bottom:4mm!important;border-bottom:1px solid #d1d5db!important}.pdf-content .experience-item:last-child{border-bottom:none!important}.pdf-content .experience-header{display:flex!important;justify-content:space-between!important;align-items:flex-start!important;margin-bottom:2mm!important}.pdf-content .experience-role{font-size:11pt!important;font-weight:700!important;color:#111827!important;margin:0!important}.pdf-content .experience-company{font-size:9pt!important;color:#1e40af!important;margin:1px 0 0!important;font-weight:600!important}.pdf-content .experience-period{font-size:8pt!important;color:#6b7280!important;white-space:nowrap!important;background:#f9fafb!important;padding:2px 8px!important;border-radius:3px!important;border:1px solid #d1d5db!important}.pdf-content .experience-highlights{margin:2.5mm 0 0!important;padding-left:5mm!important}.pdf-content .experience-highlights li{font-size:8.5pt!important;line-height:1.6!important;color:#374151!important;margin-bottom:1.5mm!important}.pdf-content .skills-grid{display:grid!important;grid-template-columns:1fr 1fr!important;gap:3.5mm!important}.pdf-content .skill-category{background:#f9fafb!important;padding:3.5mm!important;border-left:3px solid #1e40af!important}.pdf-content .skill-category h3{font-size:9.5pt!important;font-weight:700!important;color:#111827!important;margin:0 0 1.5mm!important}.pdf-content .skill-category p{font-size:8pt!important;color:#374151!important;margin:0!important;line-height:1.5!important}.pdf-content .portfolio-grid{display:flex!important;flex-direction:column!important;gap:4mm!important}.pdf-content .portfolio-item{display:flex!important;gap:4mm!important;background:#fff!important;border-radius:2mm!important;overflow:hidden!important;border:1px solid #d1d5db!important}.pdf-content .portfolio-image{width:50mm!important;height:38mm!important;-o-object-fit:cover!important;object-fit:cover!important;flex-shrink:0!important;display:block!important}.pdf-content .portfolio-info{padding:2.5mm 3mm 2.5mm 0!important;flex:1!important;display:flex!important;flex-direction:column!important;justify-content:center!important}.pdf-content .portfolio-category{font-size:7pt!important;font-weight:600!important;color:#1e40af!important;text-transform:uppercase!important;letter-spacing:.05em!important;margin-bottom:1mm!important}.pdf-content .portfolio-title{font-size:10.5pt!important;font-weight:700!important;color:#111827!important;margin:0 0 1.5mm!important;line-height:1.3!important}.pdf-content .portfolio-description{font-size:7.5pt!important;color:#374151!important;line-height:1.5!important;margin:0!important}.pdf-content .contact-page{background:#111827!important;display:flex!important;align-items:center!important;justify-content:center!important}.pdf-content .contact-content{text-align:center!important;color:#fff!important;padding:35mm 30mm!important}.pdf-content .contact-title{font-size:28pt!important;font-weight:800!important;margin:0 0 5mm!important;color:#fff!important}.pdf-content .contact-divider{width:50px!important;height:3px!important;background:#60a5fa!important;margin:0 auto 10mm!important}.pdf-content .contact-subtitle{font-size:10pt!important;color:#9ca3af!important;margin:0 0 10mm!important}.pdf-content .contact-details{display:grid!important;grid-template-columns:1fr 1fr!important;gap:4mm!important;text-align:left!important}.pdf-content .contact-item{background:#ffffff0d!important;padding:3.5mm!important;border-radius:2mm!important;border:1px solid rgba(255,255,255,.1)!important}.pdf-content .contact-item strong{display:block!important;font-size:7pt!important;color:#60a5fa!important;text-transform:uppercase!important;letter-spacing:.1em!important;margin-bottom:1.5mm!important;font-weight:600!important}.pdf-content .contact-item span{font-size:9pt!important;color:#d1d5db!important;word-break:break-all!important}}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#0a0a0a}::-webkit-scrollbar-thumb{background:#00ff94;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#00d9ff}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-\[\#00FF94\]\/40:hover{border-color:#00ff9466}.hover\:border-\[\#00FF94\]\/50:hover{border-color:#00ff9480}.hover\:border-black\/5:hover{border-color:#0000000d}.hover\:bg-\[\#00FF94\]:hover{--tw-bg-opacity: 1;background-color:rgb(0 255 148 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#00FF94\]\/20:hover{background-color:#00ff9433}.hover\:bg-\[\#1A1A1A\]:hover{--tw-bg-opacity: 1;background-color:rgb(26 26 26 / var(--tw-bg-opacity, 1))}.hover\:bg-black:hover{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.hover\:bg-transparent:hover{background-color:transparent}.hover\:text-\[\#00D9FF\]:hover{--tw-text-opacity: 1;color:rgb(0 217 255 / var(--tw-text-opacity, 1))}.hover\:text-\[\#00FF94\]:hover{--tw-text-opacity: 1;color:rgb(0 255 148 / var(--tw-text-opacity, 1))}.hover\:text-\[\#0a0a0a\]:hover{--tw-text-opacity: 1;color:rgb(10 10 10 / var(--tw-text-opacity, 1))}.hover\:text-\[\#1A1A1A\]:hover{--tw-text-opacity: 1;color:rgb(26 26 26 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:opacity-60:hover{opacity:.6}.active\:scale-\[0\.98\]:active{--tw-scale-x: .98;--tw-scale-y: .98;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-105{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:bg-black\/20{background-color:#0003}.group:hover .group-hover\:text-\[\#666\]{--tw-text-opacity: 1;color:rgb(102 102 102 / var(--tw-text-opacity, 1))}@media(min-width:768px){.md\:left-8{left:2rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:mb-12{margin-bottom:3rem}.md\:mb-8{margin-bottom:2rem}.md\:block{display:block}.md\:inline{display:inline}.md\:inline-flex{display:inline-flex}.md\:hidden{display:none}.md\:h-96{height:24rem}.md\:w-8{width:2rem}.md\:w-\[75\%\]{width:75%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:gap-6{gap:1.5rem}.md\:p-12{padding:3rem}.md\:p-8{padding:2rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:py-2{padding-top:.5rem;padding-bottom:.5rem}.md\:py-32{padding-top:8rem;padding-bottom:8rem}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-7xl{font-size:4.5rem;line-height:1}.md\:text-base{font-size:1rem;line-height:1.5rem}.md\:text-lg{font-size:1.125rem;line-height:1.75rem}.md\:text-xs{font-size:.75rem;line-height:1rem}.md\:leading-\[12px\]{line-height:12px}}@media(min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}} diff --git a/dist/index.html b/dist/index.html index e37a3d0..e2a5987 100644 --- a/dist/index.html +++ b/dist/index.html @@ -5,7 +5,7 @@ Khoa Vo - AI Creative Lead - + diff --git a/src/App.jsx b/src/App.jsx index b38fb66..9987c32 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -16,7 +16,7 @@ const PERSONAL_INFO = { email: "vonguyendangkhoa@gmail.com", location: "Ho Chi Minh City, Vietnam", linkedin: "https://www.linkedin.com/in/khoa-vo-76291236/", - portfolio: "https://cv.khoavo.myds.me/", + portfolio: "https://khoavo.myds.me/", github: "https://git.khoavo.myds.me/vndangkhoa" }; @@ -36,54 +36,54 @@ const CREATIVE_DATA = { id: 1, title: "The Language of Poetry & Literature", category: "AI Generated Art", - image: "https://portfolio.khoavo.myds.me/wp-content/uploads/2025/08/i2i_1756355661_62547902.png", + image: "https://khoavo.myds.me/wp-content/uploads/2025/08/i2i_1756355661_62547902.png", description: "Exploring the ethereal boundary between reality and imagination through AI-generated visuals. Created with Stable Diffusion, ComfyUI, and custom LoRA training to capture the intangible essence of poetic imagery.", - link: "https://portfolio.khoavo.myds.me/2025/08/28/the-language-of-poetry-and-literature/", + link: "https://khoavo.myds.me/2025/08/28/the-language-of-poetry-and-literature/", year: "2025" }, { id: 2, title: "Delux Perfume – Fineline 2025 Launch", category: "AI Branding & Video", - image: "https://portfolio.khoavo.myds.me/wp-content/uploads/2025/08/Delux-Perfume_red.png", + image: "https://khoavo.myds.me/wp-content/uploads/2025/08/Delux-Perfume_red.png", description: "End-to-end creative strategy and art direction for premium perfume launch. From AI-generated mood boards and product visuals to cinematic video production, creating a cohesive brand narrative for Southeast Asia market.", - link: "https://portfolio.khoavo.myds.me/2025/08/11/giving-art-direction-to-a-brand-a-case-study/", + link: "https://khoavo.myds.me/2025/08/11/giving-art-direction-to-a-brand-a-case-study/", year: "2025" }, { id: 3, title: "AI Studio Photography", category: "AI-Generated Branding", - image: "https://portfolio.khoavo.myds.me/wp-content/uploads/2025/07/img_0317.jpg", + image: "https://khoavo.myds.me/wp-content/uploads/2025/07/img_0317.jpg", description: "Revolutionary approach to professional studio photography using AI. ComfyUI workflows with custom LoRA to generate studio-quality product and portrait images, reducing production costs by 70%.", - link: "https://portfolio.khoavo.myds.me/2025/07/27/%F0%9F%A7%A0%F0%9F%93%B8-ai-studio-i-can-do-that-too/", + link: "https://khoavo.myds.me/2025/07/27/%F0%9F%A7%A0%F0%9F%93%B8-ai-studio-i-can-do-that-too/", year: "2025" }, { id: 4, title: "NAVIGATOR – ASIAMARINE Magazine", category: "Editorial Design", - image: "https://portfolio.khoavo.myds.me/wp-content/uploads/2020/10/navigator-vol1_page_001.webp", + image: "https://khoavo.myds.me/wp-content/uploads/2020/10/navigator-vol1_page_001.webp", description: "Complete editorial design for Vietnam's premier yacht market publication. Art direction, layout design, and visual storytelling for a luxury marine sector brand reaching high-net-worth readers across Asia.", - link: "https://portfolio.khoavo.myds.me/2020/10/20/navigator/", + link: "https://khoavo.myds.me/2020/10/20/navigator/", year: "2020" }, { id: 5, title: "PetroVietnam – PCT Corporate Identity", category: "Brand Identity & 3D", - image: "https://portfolio.khoavo.myds.me/wp-content/uploads/2017/04/cip_mockup2.png", + image: "https://khoavo.myds.me/wp-content/uploads/2017/04/cip_mockup2.png", description: "Comprehensive corporate identity for PetroVietnam Transportation. 3D vehicle visualization, logo design, stationery system, and POSM materials creating a cohesive national brand presence.", - link: "https://portfolio.khoavo.myds.me/2017/04/10/petrovietnam-pct/", + link: "https://khoavo.myds.me/2017/04/10/petrovietnam-pct/", year: "2017" }, { id: 6, title: "Skyxx – Animated Poster Series", category: "Motion Graphics", - image: "https://portfolio.khoavo.myds.me/wp-content/uploads/2019/04/aash-3-scaled.jpg", + image: "https://khoavo.myds.me/wp-content/uploads/2019/04/aash-3-scaled.jpg", description: "Award-winning weekly animated poster series for entertainment events. Dynamic motion graphics with 3D elements, pushing creative boundaries under tight deadlines while maintaining exceptional quality.", - link: "https://portfolio.khoavo.myds.me/2019/02/17/skyxx-poster-animation/", + link: "https://khoavo.myds.me/2019/02/17/skyxx-poster-animation/", year: "2019" } ], diff --git a/src/PrintPortfolio.jsx b/src/PrintPortfolio.jsx index 8064d89..0632ad9 100644 --- a/src/PrintPortfolio.jsx +++ b/src/PrintPortfolio.jsx @@ -11,7 +11,7 @@ const PERSONAL_INFO = { email: "vonguyendangkhoa@gmail.com", location: "Ho Chi Minh City, Vietnam", linkedin: "linkedin.com/in/khoavo", - portfolio: "cv.khoavo.myds.me", + portfolio: "khoavo.myds.me", github: "git.khoavo.myds.me/vndangkhoa", summary: "Highly accomplished Creative Leader bridging the gap between artistic direction and high-performance software engineering. With over 9+ years managing brand strategies and digital design, I evaluate and execute technology-driven projects from concept to production. Specialized in merging traditional creative direction with cutting-edge generative AI workflows (ComfyUI, FLUX) and full-stack development (Go, React)." };