|
|
<!DOCTYPE html> |
|
|
<html lang="en"> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
|
<title>Cosmic Portfolio Experience</title> |
|
|
<script src="https://cdn.tailwindcss.com"></script> |
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.4/gsap.min.js"></script> |
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> |
|
|
<script src="https://cdn.jsdelivr.net/npm/vanilla-tilt@1.7.0/dist/vanilla-tilt.min.js"></script> |
|
|
<style> |
|
|
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&display=swap'); |
|
|
|
|
|
:root { |
|
|
--color-pink: #ff9ff3; |
|
|
--color-gold: #feca57; |
|
|
--color-lavender: #9c88ff; |
|
|
--color-teal: #00d2d3; |
|
|
--color-dark: #1e272e; |
|
|
} |
|
|
|
|
|
body { |
|
|
font-family: 'Space Grotesk', sans-serif; |
|
|
margin: 0; |
|
|
padding: 0; |
|
|
overflow-x: hidden; |
|
|
color: white; |
|
|
background: linear-gradient(135deg, #1e272e 0%, #2d3436 100%); |
|
|
} |
|
|
|
|
|
#nebula-bg { |
|
|
position: fixed; |
|
|
top: 0; |
|
|
left: 0; |
|
|
width: 100%; |
|
|
height: 100%; |
|
|
z-index: -1; |
|
|
opacity: 0.7; |
|
|
} |
|
|
|
|
|
.glass-orb { |
|
|
background: rgba(255, 255, 255, 0.1); |
|
|
backdrop-filter: blur(10px); |
|
|
-webkit-backdrop-filter: blur(10px); |
|
|
border-radius: 50%; |
|
|
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); |
|
|
border: 1px solid rgba(255, 255, 255, 0.18); |
|
|
transition: all 0.3s ease; |
|
|
} |
|
|
|
|
|
.floating-shard { |
|
|
position: absolute; |
|
|
background: rgba(255, 255, 255, 0.2); |
|
|
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); |
|
|
transition: all 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); |
|
|
} |
|
|
|
|
|
.isometric-tile { |
|
|
transform-style: preserve-3d; |
|
|
transform: rotateX(15deg) rotateY(-15deg); |
|
|
transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1); |
|
|
box-shadow: 20px 20px 40px rgba(0, 0, 0, 0.3); |
|
|
} |
|
|
|
|
|
.isometric-tile:hover { |
|
|
transform: rotateX(0deg) rotateY(0deg) translateY(-10px); |
|
|
} |
|
|
|
|
|
.progress-robot { |
|
|
position: absolute; |
|
|
width: 30px; |
|
|
height: 30px; |
|
|
background-color: var(--color-gold); |
|
|
border-radius: 50%; |
|
|
animation: weld 2s infinite alternate; |
|
|
} |
|
|
|
|
|
@keyframes weld { |
|
|
0% { box-shadow: 0 0 5px var(--color-gold); } |
|
|
100% { box-shadow: 0 0 20px var(--color-gold); } |
|
|
} |
|
|
|
|
|
.color-wheel { |
|
|
width: 200px; |
|
|
height: 200px; |
|
|
border-radius: 50%; |
|
|
background: conic-gradient( |
|
|
red, yellow, lime, cyan, blue, magenta, red |
|
|
); |
|
|
cursor: grab; |
|
|
} |
|
|
|
|
|
.radial-menu { |
|
|
position: fixed; |
|
|
bottom: 2rem; |
|
|
right: 2rem; |
|
|
width: 60px; |
|
|
height: 60px; |
|
|
border-radius: 50%; |
|
|
background: rgba(255, 255, 255, 0.1); |
|
|
backdrop-filter: blur(10px); |
|
|
display: flex; |
|
|
justify-content: center; |
|
|
align-items: center; |
|
|
cursor: pointer; |
|
|
z-index: 100; |
|
|
transition: all 0.3s ease; |
|
|
} |
|
|
|
|
|
.radial-menu:hover { |
|
|
transform: scale(1.1); |
|
|
box-shadow: 0 0 20px rgba(255, 255, 255, 0.3); |
|
|
} |
|
|
|
|
|
.radial-items { |
|
|
position: absolute; |
|
|
width: 300px; |
|
|
height: 300px; |
|
|
pointer-events: none; |
|
|
opacity: 0; |
|
|
transition: all 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); |
|
|
} |
|
|
|
|
|
.radial-item { |
|
|
position: absolute; |
|
|
width: 50px; |
|
|
height: 50px; |
|
|
border-radius: 50%; |
|
|
background: rgba(255, 255, 255, 0.1); |
|
|
backdrop-filter: blur(5px); |
|
|
display: flex; |
|
|
justify-content: center; |
|
|
align-items: center; |
|
|
cursor: pointer; |
|
|
transition: all 0.3s ease; |
|
|
} |
|
|
|
|
|
.radial-item:hover { |
|
|
transform: scale(1.2); |
|
|
background: rgba(255, 255, 255, 0.3); |
|
|
} |
|
|
|
|
|
.heartbeat { |
|
|
animation: heartbeat 1.5s ease-in-out infinite both; |
|
|
} |
|
|
|
|
|
@keyframes heartbeat { |
|
|
0% { transform: scale(1); } |
|
|
25% { transform: scale(1.1); } |
|
|
50% { transform: scale(1); } |
|
|
75% { transform: scale(1.1); } |
|
|
100% { transform: scale(1); } |
|
|
} |
|
|
|
|
|
.draggable-card { |
|
|
cursor: grab; |
|
|
transition: transform 0.2s ease, box-shadow 0.2s ease; |
|
|
touch-action: none; |
|
|
} |
|
|
|
|
|
.draggable-card:active { |
|
|
cursor: grabbing; |
|
|
transform: scale(1.05) !important; |
|
|
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3) !important; |
|
|
} |
|
|
|
|
|
.paint-drip { |
|
|
position: relative; |
|
|
overflow: hidden; |
|
|
} |
|
|
|
|
|
.paint-drip::after { |
|
|
content: ''; |
|
|
position: absolute; |
|
|
bottom: 0; |
|
|
left: 50%; |
|
|
width: 150%; |
|
|
height: 150%; |
|
|
background: linear-gradient(45deg, var(--color-pink), var(--color-lavender)); |
|
|
border-radius: 40%; |
|
|
transform: translateX(-50%) rotate(0deg); |
|
|
animation: rotate 10s linear infinite; |
|
|
opacity: 0.3; |
|
|
z-index: -1; |
|
|
} |
|
|
|
|
|
@keyframes rotate { |
|
|
0% { transform: translateX(-50%) rotate(0deg); } |
|
|
100% { transform: translateX(-50%) rotate(360deg); } |
|
|
} |
|
|
|
|
|
.avatar-tooltip { |
|
|
position: absolute; |
|
|
width: 40px; |
|
|
height: 40px; |
|
|
border-radius: 50%; |
|
|
background: var(--color-teal); |
|
|
display: flex; |
|
|
justify-content: center; |
|
|
align-items: center; |
|
|
cursor: pointer; |
|
|
transition: all 0.3s ease; |
|
|
} |
|
|
|
|
|
.avatar-tooltip:hover { |
|
|
transform: scale(1.2); |
|
|
} |
|
|
|
|
|
.tooltip-content { |
|
|
position: absolute; |
|
|
width: 200px; |
|
|
padding: 1rem; |
|
|
background: rgba(255, 255, 255, 0.9); |
|
|
border-radius: 10px; |
|
|
color: var(--color-dark); |
|
|
font-size: 0.9rem; |
|
|
opacity: 0; |
|
|
pointer-events: none; |
|
|
transition: all 0.3s ease; |
|
|
transform: translateY(10px); |
|
|
} |
|
|
|
|
|
.avatar-tooltip:hover .tooltip-content { |
|
|
opacity: 1; |
|
|
transform: translateY(0); |
|
|
} |
|
|
|
|
|
.bounce-button { |
|
|
transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); |
|
|
} |
|
|
|
|
|
.bounce-button:active { |
|
|
transform: scale(0.95); |
|
|
} |
|
|
|
|
|
.parallax-banner { |
|
|
transform-style: preserve-3d; |
|
|
transition: all 0.5s ease-out; |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
|
|
|
<div id="nebula-bg"></div> |
|
|
|
|
|
|
|
|
<section class="min-h-screen flex flex-col justify-center items-center relative overflow-hidden"> |
|
|
|
|
|
<div class="glass-orb w-64 h-64 flex justify-center items-center mb-12" data-tilt data-tilt-max="15" data-tilt-speed="400" data-tilt-perspective="1000"> |
|
|
<h1 class="text-4xl font-bold text-center">Welcome</h1> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div id="shard-container" class="relative w-full h-32 mb-20"> |
|
|
|
|
|
</div> |
|
|
|
|
|
<h2 class="text-6xl font-bold mb-8 text-center">Let's Create Something <span class="text-transparent bg-clip-text bg-gradient-to-r from-pink-400 to-purple-600">Extraordinary</span></h2> |
|
|
<p class="text-xl max-w-2xl text-center mb-12 opacity-80">A fusion of love, trust, and creativity in every pixel and line of code</p> |
|
|
|
|
|
<button class="bounce-button px-8 py-4 rounded-full bg-gradient-to-r from-pink-500 to-purple-600 text-white font-bold text-lg shadow-lg hover:shadow-xl transition-all duration-300"> |
|
|
Explore My Universe |
|
|
</button> |
|
|
|
|
|
|
|
|
<div class="absolute bottom-10 left-1/2 transform -translate-x-1/2 animate-bounce"> |
|
|
<div class="w-6 h-10 border-2 border-white rounded-full flex justify-center"> |
|
|
<div class="w-1 h-2 bg-white rounded-full mt-2 animate-pulse"></div> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
<section class="py-20 px-4 sm:px-8 max-w-7xl mx-auto"> |
|
|
<h2 class="text-4xl font-bold mb-16 text-center">My Creative Cosmos</h2> |
|
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-12"> |
|
|
|
|
|
<div class="isometric-tile bg-gradient-to-br from-gray-800 to-gray-900 rounded-lg p-8 relative overflow-hidden group"> |
|
|
<div class="absolute inset-0 bg-[url('https://images.unsplash.com/photo-1547036967-23d11aacaee0?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80')] bg-cover bg-center opacity-20 group-hover:opacity-30 transition-opacity"></div> |
|
|
<div class="relative z-10"> |
|
|
<div class="w-16 h-16 bg-pink-500 rounded-full mb-6 flex items-center justify-center"> |
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01" /> |
|
|
</svg> |
|
|
</div> |
|
|
<h3 class="text-2xl font-bold mb-4">Design Philosophy</h3> |
|
|
<p class="text-gray-300 mb-6">Where aesthetics meet purpose in perfect harmony</p> |
|
|
<div class="h-1 w-full bg-gray-700 rounded-full mb-4"> |
|
|
<div class="h-1 bg-pink-500 rounded-full" style="width: 85%"> |
|
|
<div class="progress-robot" style="left: calc(85% - 15px); top: -15px;"></div> |
|
|
</div> |
|
|
</div> |
|
|
<p class="text-sm text-gray-400">85% mastery</p> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="isometric-tile bg-gradient-to-br from-gray-800 to-gray-900 rounded-lg p-8 relative overflow-hidden group"> |
|
|
<div class="absolute inset-0 bg-[url('https://images.unsplash.com/photo-1555066931-4365d14bab8c?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80')] bg-cover bg-center opacity-20 group-hover:opacity-30 transition-opacity"></div> |
|
|
<div class="relative z-10"> |
|
|
<div class="w-16 h-16 bg-purple-500 rounded-full mb-6 flex items-center justify-center"> |
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4" /> |
|
|
</svg> |
|
|
</div> |
|
|
<h3 class="text-2xl font-bold mb-4">Code Craftsmanship</h3> |
|
|
<p class="text-gray-300 mb-6">Elegant solutions to complex problems</p> |
|
|
<div class="h-1 w-full bg-gray-700 rounded-full mb-4"> |
|
|
<div class="h-1 bg-purple-500 rounded-full" style="width: 92%"> |
|
|
<div class="progress-robot" style="left: calc(92% - 15px); top: -15px;"></div> |
|
|
</div> |
|
|
</div> |
|
|
<p class="text-sm text-gray-400">92% mastery</p> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="isometric-tile bg-gradient-to-br from-gray-800 to-gray-900 rounded-lg p-8 relative overflow-hidden group"> |
|
|
<div class="absolute inset-0 bg-[url('https://images.unsplash.com/photo-1516321318423-f06f85e504b3?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80')] bg-cover bg-center opacity-20 group-hover:opacity-30 transition-opacity"></div> |
|
|
<div class="relative z-10"> |
|
|
<div class="w-16 h-16 bg-teal-500 rounded-full mb-6 flex items-center justify-center"> |
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z" /> |
|
|
</svg> |
|
|
</div> |
|
|
<h3 class="text-2xl font-bold mb-4">Innovation Engine</h3> |
|
|
<p class="text-gray-300 mb-6">Pushing boundaries with every project</p> |
|
|
<div class="h-1 w-full bg-gray-700 rounded-full mb-4"> |
|
|
<div class="h-1 bg-teal-500 rounded-full" style="width: 78%"> |
|
|
<div class="progress-robot" style="left: calc(78% - 15px); top: -15px;"></div> |
|
|
</div> |
|
|
</div> |
|
|
<p class="text-sm text-gray-400">78% mastery</p> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
<section class="py-20 px-4 sm:px-8 max-w-7xl mx-auto"> |
|
|
<div class="paint-drip bg-gray-800 rounded-3xl p-12 mb-20 relative overflow-hidden"> |
|
|
<h2 class="text-4xl font-bold mb-6">Generative Art Playground</h2> |
|
|
<p class="text-xl mb-12 max-w-3xl">Interact with these tools to create your own unique compositions</p> |
|
|
|
|
|
<div class="flex flex-col lg:flex-row gap-12"> |
|
|
|
|
|
<div class="flex-1"> |
|
|
<h3 class="text-2xl font-bold mb-6">Color Spectrum Explorer</h3> |
|
|
<div class="color-wheel mx-auto mb-6" id="color-wheel"></div> |
|
|
<div class="text-center"> |
|
|
<p class="mb-4">Selected color: <span id="selected-color" class="font-bold">#FF0000</span></p> |
|
|
<button class="px-6 py-2 bg-white bg-opacity-10 rounded-full hover:bg-opacity-20 transition">Save Palette</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="flex-1"> |
|
|
<h3 class="text-2xl font-bold mb-6">Modular Composition</h3> |
|
|
<p class="mb-6">Drag and rearrange these elements to create your own layout</p> |
|
|
|
|
|
<div class="grid grid-cols-3 gap-4" id="card-grid"> |
|
|
<div class="draggable-card bg-pink-500 aspect-square rounded-lg flex items-center justify-center">1</div> |
|
|
<div class="draggable-card bg-purple-500 aspect-square rounded-lg flex items-center justify-center">2</div> |
|
|
<div class="draggable-card bg-teal-500 aspect-square rounded-lg flex items-center justify-center">3</div> |
|
|
<div class="draggable-card bg-yellow-500 aspect-square rounded-lg flex items-center justify-center">4</div> |
|
|
<div class="draggable-card bg-blue-500 aspect-square rounded-lg flex items-center justify-center">5</div> |
|
|
<div class="draggable-card bg-green-500 aspect-square rounded-lg flex items-center justify-center">6</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="avatar-tooltip absolute top-8 right-8"> |
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /> |
|
|
</svg> |
|
|
<div class="tooltip-content"> |
|
|
<p>This interactive section showcases my passion for creative coding and generative art. Play with the tools to see how dynamic digital experiences can be!</p> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
<section class="py-32 px-4 sm:px-8 relative overflow-hidden"> |
|
|
<div class="parallax-banner max-w-4xl mx-auto bg-gradient-to-r from-pink-500 to-purple-600 rounded-3xl p-12 text-center"> |
|
|
<h2 class="text-5xl font-bold mb-6 heartbeat">Let's Build the Future Together</h2> |
|
|
<p class="text-xl mb-8 max-w-2xl mx-auto">I'm passionate about creating digital experiences that resonate with love, trust, and understanding.</p> |
|
|
<div class="flex flex-col sm:flex-row gap-4 justify-center"> |
|
|
<button class="bounce-button px-8 py-4 bg-white text-gray-900 font-bold rounded-full hover:bg-opacity-90 transition"> |
|
|
Start a Project |
|
|
</button> |
|
|
<button class="bounce-button px-8 py-4 bg-black bg-opacity-30 text-white font-bold rounded-full hover:bg-opacity-50 transition"> |
|
|
Learn More About Me |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
<div class="radial-menu" id="radial-menu"> |
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" /> |
|
|
</svg> |
|
|
|
|
|
<div class="radial-items" id="radial-items"> |
|
|
<div class="radial-item" style="top: 50%; left: 50%; transform: translate(-50%, -50%);"> |
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" /> |
|
|
</svg> |
|
|
</div> |
|
|
<div class="radial-item" style="top: 20%; left: 50%; transform: translateX(-50%);"> |
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" /> |
|
|
</svg> |
|
|
</div> |
|
|
<div class="radial-item" style="top: 50%; left: 80%; transform: translateY(-50%);"> |
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9-3-9m-9 9a9 9 0 019-9" /> |
|
|
</svg> |
|
|
</div> |
|
|
<div class="radial-item" style="top: 80%; left: 50%; transform: translateX(-50%);"> |
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" /> |
|
|
</svg> |
|
|
</div> |
|
|
<div class="radial-item" style="top: 50%; left: 20%; transform: translateY(-50%);"> |
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" /> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" /> |
|
|
</svg> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<script> |
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function() { |
|
|
|
|
|
const nebulaBg = document.getElementById('nebula-bg'); |
|
|
const scene = new THREE.Scene(); |
|
|
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); |
|
|
const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true }); |
|
|
renderer.setSize(window.innerWidth, window.innerHeight); |
|
|
nebulaBg.appendChild(renderer.domElement); |
|
|
|
|
|
|
|
|
const particlesGeometry = new THREE.BufferGeometry(); |
|
|
const particleCount = 5000; |
|
|
|
|
|
const posArray = new Float32Array(particleCount * 3); |
|
|
const colorArray = new Float32Array(particleCount * 3); |
|
|
|
|
|
for(let i = 0; i < particleCount * 3; i++) { |
|
|
posArray[i] = (Math.random() - 0.5) * 10; |
|
|
colorArray[i] = Math.random() * 0.5 + 0.5; |
|
|
} |
|
|
|
|
|
particlesGeometry.setAttribute('position', new THREE.BufferAttribute(posArray, 3)); |
|
|
particlesGeometry.setAttribute('color', new THREE.BufferAttribute(colorArray, 3)); |
|
|
|
|
|
const particlesMaterial = new THREE.PointsMaterial({ |
|
|
size: 0.05, |
|
|
vertexColors: true, |
|
|
transparent: true, |
|
|
opacity: 0.8, |
|
|
blending: THREE.AdditiveBlending |
|
|
}); |
|
|
|
|
|
const particlesMesh = new THREE.Points(particlesGeometry, particlesMaterial); |
|
|
scene.add(particlesMesh); |
|
|
|
|
|
camera.position.z = 5; |
|
|
|
|
|
|
|
|
function animateNebula() { |
|
|
requestAnimationFrame(animateNebula); |
|
|
|
|
|
particlesMesh.rotation.x += 0.0001; |
|
|
particlesMesh.rotation.y += 0.0002; |
|
|
|
|
|
|
|
|
particlesMesh.scale.x = 1 + Math.sin(Date.now() * 0.001) * 0.05; |
|
|
particlesMesh.scale.y = 1 + Math.sin(Date.now() * 0.001) * 0.05; |
|
|
|
|
|
renderer.render(scene, camera); |
|
|
} |
|
|
|
|
|
animateNebula(); |
|
|
|
|
|
|
|
|
window.addEventListener('resize', function() { |
|
|
camera.aspect = window.innerWidth / window.innerHeight; |
|
|
camera.updateProjectionMatrix(); |
|
|
renderer.setSize(window.innerWidth, window.innerHeight); |
|
|
}); |
|
|
|
|
|
|
|
|
const shardContainer = document.getElementById('shard-container'); |
|
|
const word = "Understanding"; |
|
|
const shardCount = 100; |
|
|
|
|
|
for(let i = 0; i < shardCount; i++) { |
|
|
const shard = document.createElement('div'); |
|
|
shard.className = 'floating-shard'; |
|
|
|
|
|
|
|
|
const size = Math.random() * 20 + 10; |
|
|
shard.style.width = `${size}px`; |
|
|
shard.style.height = `${size}px`; |
|
|
|
|
|
|
|
|
shard.style.left = `${Math.random() * 100}%`; |
|
|
shard.style.top = `${Math.random() * 100}%`; |
|
|
|
|
|
|
|
|
const colors = ['rgba(255, 159, 243, 0.6)', 'rgba(254, 202, 87, 0.6)', 'rgba(156, 136, 255, 0.6)']; |
|
|
shard.style.background = colors[Math.floor(Math.random() * colors.length)]; |
|
|
|
|
|
shardContainer.appendChild(shard); |
|
|
} |
|
|
|
|
|
|
|
|
setTimeout(() => { |
|
|
const shards = document.querySelectorAll('.floating-shard'); |
|
|
const centerX = shardContainer.offsetWidth / 2; |
|
|
const centerY = shardContainer.offsetHeight / 2; |
|
|
|
|
|
|
|
|
const letterPositions = []; |
|
|
const fontSize = 80; |
|
|
const fontWidth = fontSize * 0.6; |
|
|
const startX = centerX - (word.length * fontWidth) / 2; |
|
|
|
|
|
|
|
|
const canvas = document.createElement('canvas'); |
|
|
const ctx = canvas.getContext('2d'); |
|
|
canvas.width = shardContainer.offsetWidth; |
|
|
canvas.height = shardContainer.offsetHeight; |
|
|
|
|
|
ctx.font = `bold ${fontSize}px 'Space Grotesk', sans-serif`; |
|
|
ctx.fillStyle = 'white'; |
|
|
ctx.textAlign = 'center'; |
|
|
ctx.fillText(word, centerX, centerY + fontSize/3); |
|
|
|
|
|
|
|
|
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data; |
|
|
|
|
|
|
|
|
const points = []; |
|
|
for(let y = 0; y < canvas.height; y += 4) { |
|
|
for(let x = 0; x < canvas.width; x += 4) { |
|
|
const index = (y * canvas.width + x) * 4; |
|
|
if(imageData[index + 3] > 0) { |
|
|
points.push({x, y}); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
shards.forEach((shard, index) => { |
|
|
if(index < points.length) { |
|
|
const point = points[index]; |
|
|
gsap.to(shard, { |
|
|
x: point.x - parseFloat(shard.style.left), |
|
|
y: point.y - parseFloat(shard.style.top), |
|
|
duration: 2, |
|
|
ease: "elastic.out(1, 0.5)" |
|
|
}); |
|
|
} |
|
|
}); |
|
|
}, 2000); |
|
|
|
|
|
|
|
|
VanillaTilt.init(document.querySelector(".glass-orb"), { |
|
|
max: 15, |
|
|
speed: 400, |
|
|
glare: true, |
|
|
"max-glare": 0.2, |
|
|
}); |
|
|
|
|
|
|
|
|
const radialMenu = document.getElementById('radial-menu'); |
|
|
const radialItems = document.getElementById('radial-items'); |
|
|
let menuOpen = false; |
|
|
|
|
|
radialMenu.addEventListener('click', function() { |
|
|
menuOpen = !menuOpen; |
|
|
|
|
|
if(menuOpen) { |
|
|
radialItems.style.opacity = '1'; |
|
|
radialItems.style.pointerEvents = 'auto'; |
|
|
|
|
|
|
|
|
const items = radialItems.querySelectorAll('.radial-item'); |
|
|
items.forEach((item, index) => { |
|
|
const angle = (index / items.length) * Math.PI * 2; |
|
|
const radius = 120; |
|
|
const x = Math.cos(angle) * radius; |
|
|
const y = Math.sin(angle) * radius; |
|
|
|
|
|
gsap.fromTo(item, |
|
|
{ x: 0, y: 0, opacity: 0 }, |
|
|
{ x: x, y: y, opacity: 1, duration: 0.5, delay: index * 0.1, ease: "back.out(1.7)" } |
|
|
); |
|
|
}); |
|
|
} else { |
|
|
radialItems.style.opacity = '0'; |
|
|
radialItems.style.pointerEvents = 'none'; |
|
|
|
|
|
|
|
|
const items = radialItems.querySelectorAll('.radial-item'); |
|
|
items.forEach((item) => { |
|
|
gsap.to(item, |
|
|
{ x: 0, y: 0, opacity: 0, duration: 0.3, ease: "back.in(1.7)" } |
|
|
); |
|
|
}); |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
const colorWheel = document.getElementById('color-wheel'); |
|
|
const selectedColor = document.getElementById('selected-color'); |
|
|
|
|
|
colorWheel.addEventListener('mousemove', function(e) { |
|
|
const rect = colorWheel.getBoundingClientRect(); |
|
|
const x = e.clientX - rect.left; |
|
|
const y = e.clientY - rect.top; |
|
|
const centerX = rect.width / 2; |
|
|
const centerY = rect.height / 2; |
|
|
|
|
|
const angle = Math.atan2(y - centerY, x - centerX) * 180 / Math.PI; |
|
|
const normalizedAngle = (angle + 360) % 360; |
|
|
|
|
|
|
|
|
const hue = Math.round(normalizedAngle); |
|
|
|
|
|
|
|
|
const distance = Math.sqrt(Math.pow(x - centerX, 2) + Math.pow(y - centerY, 2)); |
|
|
const saturation = Math.min(100, Math.round(distance / (rect.width / 2) * 100)); |
|
|
|
|
|
|
|
|
const lightness = 50; |
|
|
|
|
|
selectedColor.textContent = `HSL(${hue}, ${saturation}%, ${lightness}%)`; |
|
|
selectedColor.style.color = `hsl(${hue}, ${saturation}%, ${lightness}%)`; |
|
|
}); |
|
|
|
|
|
|
|
|
const cardGrid = document.getElementById('card-grid'); |
|
|
const cards = document.querySelectorAll('.draggable-card'); |
|
|
|
|
|
cards.forEach(card => { |
|
|
let posX = 0, posY = 0, mouseX = 0, mouseY = 0; |
|
|
let isDragging = false; |
|
|
|
|
|
card.addEventListener('mousedown', function(e) { |
|
|
isDragging = true; |
|
|
mouseX = e.clientX; |
|
|
mouseY = e.clientY; |
|
|
|
|
|
|
|
|
card.style.zIndex = '10'; |
|
|
card.style.boxShadow = '0 10px 25px rgba(0, 0, 0, 0.3)'; |
|
|
|
|
|
document.addEventListener('mousemove', moveCard); |
|
|
document.addEventListener('mouseup', function() { |
|
|
isDragging = false; |
|
|
card.style.zIndex = '1'; |
|
|
card.style.boxShadow = ''; |
|
|
document.removeEventListener('mousemove', moveCard); |
|
|
}); |
|
|
}); |
|
|
|
|
|
function moveCard(e) { |
|
|
if(isDragging) { |
|
|
const dx = e.clientX - mouseX; |
|
|
const dy = e.clientY - mouseY; |
|
|
|
|
|
posX += dx; |
|
|
posY += dy; |
|
|
|
|
|
card.style.transform = `translate(${posX}px, ${posY}px) rotate(${posX * 0.1}deg)`; |
|
|
|
|
|
mouseX = e.clientX; |
|
|
mouseY = e.clientY; |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
const parallaxBanner = document.querySelector('.parallax-banner'); |
|
|
|
|
|
window.addEventListener('mousemove', function(e) { |
|
|
const x = e.clientX / window.innerWidth; |
|
|
const y = e.clientY / window.innerHeight; |
|
|
|
|
|
parallaxBanner.style.transform = `rotateX(${(y - 0.5) * 5}deg) rotateY(${(x - 0.5) * 5}deg)`; |
|
|
}); |
|
|
|
|
|
|
|
|
const bounceButtons = document.querySelectorAll('.bounce-button'); |
|
|
|
|
|
bounceButtons.forEach(button => { |
|
|
button.addEventListener('mouseenter', function() { |
|
|
gsap.to(button, { |
|
|
scale: 1.05, |
|
|
duration: 0.3, |
|
|
ease: "elastic.out(1, 0.5)" |
|
|
}); |
|
|
}); |
|
|
|
|
|
button.addEventListener('mouseleave', function() { |
|
|
gsap.to(button, { |
|
|
scale: 1, |
|
|
duration: 0.3, |
|
|
ease: "elastic.out(1, 0.5)" |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
</script> |
|
|
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Marv12/nice" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
|
|
</html> |