├── README.md ├── cause.css ├── cause.html ├── cause.js ├── d1.jpg ├── d2.jpg ├── d3.jpg ├── d4.jpg ├── gif1.gif ├── gif2.gif ├── index.html ├── last.html ├── script.js └── style.css /README.md: -------------------------------------------------------------------------------- 1 | # BestFriend_ 2 | You can download.. modify and Grow it 3 | -------------------------------------------------------------------------------- /cause.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Bubblegum+Sans&family=Comic+Neue:wght@700&family=Quicksand:wght@500&display=swap'); 2 | 3 | * { 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | cursor: none; 8 | } 9 | 10 | body { 11 | min-height: 100vh; 12 | background: linear-gradient(-45deg, #ffe6e6, #e6e6ff, #ffebf5); 13 | background-size: 400% 400%; 14 | animation: gradientBG 15s ease infinite; 15 | font-family: 'Quicksand', sans-serif; 16 | overflow-x: hidden; 17 | padding: 2rem; 18 | } 19 | 20 | .custom-cursor { 21 | width: 30px; 22 | height: 30px; 23 | position: fixed; 24 | pointer-events: none; 25 | z-index: 9999; 26 | mix-blend-mode: difference; 27 | transition: transform 0.1s; 28 | } 29 | 30 | .custom-cursor svg { 31 | width: 100%; 32 | height: 100%; 33 | filter: drop-shadow(0 0 5px rgba(255, 182, 193, 0.5)); 34 | } 35 | 36 | .container { 37 | max-width: 1200px; 38 | margin: 0 auto; 39 | text-align: center; 40 | position: relative; 41 | z-index: 1; 42 | } 43 | 44 | h1 { 45 | font-family: 'Bubblegum Sans', cursive; 46 | font-size: 3rem; 47 | color: #ff69b4; 48 | text-shadow: 2px 2px 4px rgba(255, 105, 180, 0.3); 49 | margin-bottom: 2rem; 50 | animation: bounce 1s ease infinite; 51 | } 52 | 53 | .reason-card { 54 | background: rgba(255, 255, 255, 0.9); 55 | border-radius: 20px; 56 | padding: 2rem; 57 | margin: 1.5rem; 58 | box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); 59 | transition: transform 0.3s, box-shadow 0.3s; 60 | cursor: pointer; 61 | position: relative; 62 | overflow: hidden; 63 | } 64 | 65 | .reason-card:hover { 66 | transform: translateY(-5px); 67 | box-shadow: 0 8px 25px rgba(255, 105, 180, 0.2); 68 | } 69 | 70 | .reason-text { 71 | font-size: 1.2rem; 72 | margin-bottom: 1rem; 73 | position: relative; 74 | z-index: 2; 75 | } 76 | 77 | .gif-overlay { 78 | position: absolute; 79 | top: 0; 80 | left: 0; 81 | width: 100%; 82 | height: 100%; 83 | background: rgba(255, 255, 255, 0.95); 84 | display: flex; 85 | align-items: center; 86 | justify-content: center; 87 | opacity: 0; 88 | transition: opacity 0.3s; 89 | z-index: 1; 90 | } 91 | 92 | .reason-card:hover .gif-overlay { 93 | opacity: 1; 94 | } 95 | 96 | .shuffle-button { 97 | background: linear-gradient(45deg, #ff69b4, #ff99cc); 98 | border: none; 99 | border-radius: 50px; 100 | padding: 1rem 2rem; 101 | font-size: 1.2rem; 102 | color: white; 103 | margin: 2rem 0; 104 | cursor: pointer; 105 | transition: transform 0.3s; 106 | font-family: 'Comic Neue', cursive; 107 | box-shadow: 0 5px 15px rgba(255, 105, 180, 0.3); 108 | } 109 | 110 | .shuffle-button:hover { 111 | transform: scale(1.1); 112 | } 113 | 114 | .floating { 115 | position: fixed; 116 | pointer-events: none; 117 | animation: float 3s ease-in-out infinite; 118 | } 119 | 120 | .ending-section { 121 | margin-top: 4rem; 122 | padding: 2rem; 123 | text-align: center; 124 | } 125 | 126 | .ending-text { 127 | font-family: 'Bubblegum Sans', cursive; 128 | font-size: 2rem; 129 | color: #ff69b4; 130 | margin-bottom: 2rem; 131 | opacity: 0; 132 | transform: translateY(20px); 133 | } 134 | 135 | .teddy-hug { 136 | width: 200px; 137 | margin: 0 auto; 138 | transform: scale(0); 139 | } 140 | 141 | @keyframes gradientBG { 142 | 0% { background-position: 0% 50%; } 143 | 50% { background-position: 100% 50%; } 144 | 100% { background-position: 0% 50%; } 145 | } 146 | 147 | @keyframes float { 148 | 0%, 100% { transform: translateY(0); } 149 | 50% { transform: translateY(-20px); } 150 | } 151 | 152 | @keyframes bounce { 153 | 0%, 100% { transform: translateY(0); } 154 | 50% { transform: translateY(-10px); } 155 | } 156 | 157 | @media (max-width: 768px) { 158 | h1 { font-size: 2rem; } 159 | .reason-card { margin: 1rem; } 160 | .reason-text { font-size: 1rem; } 161 | } 162 | .shuffle-button { 163 | background: linear-gradient(45deg, #ff69b4, #ff99cc); 164 | border: none; 165 | border-radius: 50px; 166 | padding: 1rem 2rem; 167 | font-size: 1.2rem; 168 | color: white; 169 | margin: 2rem 0; 170 | cursor: pointer; 171 | transition: all 0.3s; 172 | font-family: 'Comic Neue', cursive; 173 | box-shadow: 0 5px 15px rgba(255, 105, 180, 0.3); 174 | } 175 | 176 | .shuffle-button.story-mode { 177 | background: linear-gradient(45deg, #9b6dff, #ff6dc7); 178 | transform: scale(1.1); 179 | } 180 | 181 | .shuffle-button:hover { 182 | transform: scale(1.1); 183 | } 184 | 185 | .shuffle-button.story-mode:hover { 186 | transform: scale(1.2); 187 | } 188 | 189 | .reason-counter { 190 | font-size: 0.9rem; 191 | color: #ff69b4; 192 | margin-top: 1rem; 193 | opacity: 0.7; 194 | } -------------------------------------------------------------------------------- /cause.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Why You're My Best Friend! 💖 7 | 8 | 9 | 12 | 13 | 14 |
15 | 16 | 17 | 18 |
19 | 20 |
21 |

Why You're My Best Friend! 💖

22 | 23 |
24 | 25 | 26 |
27 | 28 |
29 |
30 | Teddy Hug 31 |
32 |
You're the BESTEST Best Friend EVER! 💖
33 |
34 |
35 | 36 | 39 | 40 | -------------------------------------------------------------------------------- /cause.js: -------------------------------------------------------------------------------- 1 | // Reasons database 2 | const reasons = [ 3 | { 4 | text: "You always know how to make me laugh, even on my worst days! 😊", 5 | emoji: "🌟", 6 | gif: "gif1.gif" 7 | }, 8 | { 9 | text: "jo plan hua tha , In bengali ota dee 🙈💗 ", 10 | emoji: "😆", 11 | gif: "gif2.gif" 12 | }, 13 | { 14 | text: "Kitnii Chillati hy mere upar isliyee, hehehe 💕", 15 | emoji: "👂", 16 | gif: "gif1.gif" 17 | }, 18 | { 19 | text: "Our inside jokes are literally the best thing ever~", 20 | emoji: "🚀", 21 | gif: "gif2.gif" 22 | } 23 | ]; 24 | 25 | // State management 26 | let currentReasonIndex = 0; 27 | const reasonsContainer = document.getElementById('reasons-container'); 28 | const shuffleButton = document.querySelector('.shuffle-button'); 29 | const reasonCounter = document.querySelector('.reason-counter'); 30 | let isTransitioning = false; 31 | 32 | // Create reason card with gif 33 | function createReasonCard(reason) { 34 | const card = document.createElement('div'); 35 | card.className = 'reason-card'; 36 | 37 | const text = document.createElement('div'); 38 | text.className = 'reason-text'; 39 | text.innerHTML = `${reason.emoji} ${reason.text}`; 40 | 41 | const gifOverlay = document.createElement('div'); 42 | gifOverlay.className = 'gif-overlay'; 43 | gifOverlay.innerHTML = `Friendship Memory`; 44 | 45 | card.appendChild(text); 46 | card.appendChild(gifOverlay); 47 | 48 | gsap.from(card, { 49 | opacity: 0, 50 | y: 50, 51 | duration: 0.5, 52 | ease: "back.out" 53 | }); 54 | 55 | return card; 56 | } 57 | 58 | // Display new reason 59 | function displayNewReason() { 60 | if (isTransitioning) return; 61 | isTransitioning = true; 62 | 63 | if (currentReasonIndex < reasons.length) { 64 | const card = createReasonCard(reasons[currentReasonIndex]); 65 | reasonsContainer.appendChild(card); 66 | 67 | // Update counter 68 | reasonCounter.textContent = `Reason ${currentReasonIndex + 1} of ${reasons.length}`; 69 | 70 | currentReasonIndex++; 71 | 72 | // Check if we should transform the button 73 | if (currentReasonIndex === reasons.length) { 74 | gsap.to(shuffleButton, { 75 | scale: 1.1, 76 | duration: 0.5, 77 | ease: "elastic.out", 78 | onComplete: () => { 79 | shuffleButton.textContent = "Enter Our Storylane 💫"; 80 | shuffleButton.classList.add('story-mode'); 81 | shuffleButton.addEventListener('click', () => { 82 | gsap.to('body', { 83 | opacity: 0, 84 | duration: 1, 85 | onComplete: () => { 86 | window.location.href = 'last.html'; // Replace with the actual URL of the next page 87 | } 88 | }); 89 | }); 90 | } 91 | }); 92 | } 93 | 94 | // Create floating elements 95 | createFloatingElement(); 96 | 97 | setTimeout(() => { 98 | isTransitioning = false; 99 | }, 500); 100 | } else { 101 | // Handle navigation to new page or section 102 | window.location.href = "#storylane"; 103 | // Or trigger your next page functionality 104 | } 105 | } 106 | 107 | // Initialize button click 108 | shuffleButton.addEventListener('click', () => { 109 | gsap.to(shuffleButton, { 110 | scale: 0.9, 111 | duration: 0.1, 112 | yoyo: true, 113 | repeat: 1 114 | }); 115 | displayNewReason(); 116 | }); 117 | 118 | // Floating elements function (same as before) 119 | function createFloatingElement() { 120 | const elements = ['🌸', '✨', '💖', '🦋', '⭐']; 121 | const element = document.createElement('div'); 122 | element.className = 'floating'; 123 | element.textContent = elements[Math.floor(Math.random() * elements.length)]; 124 | element.style.left = Math.random() * window.innerWidth + 'px'; 125 | element.style.top = Math.random() * window.innerHeight + 'px'; 126 | element.style.fontSize = (Math.random() * 20 + 10) + 'px'; 127 | document.body.appendChild(element); 128 | 129 | gsap.to(element, { 130 | y: -500, 131 | duration: Math.random() * 10 + 10, 132 | opacity: 0, 133 | onComplete: () => element.remove() 134 | }); 135 | } 136 | 137 | // Custom cursor (same as before) 138 | const cursor = document.querySelector('.custom-cursor'); 139 | document.addEventListener('mousemove', (e) => { 140 | gsap.to(cursor, { 141 | x: e.clientX - 15, 142 | y: e.clientY - 15, 143 | duration: 0.2 144 | }); 145 | }); 146 | 147 | // Create initial floating elements 148 | setInterval(createFloatingElement, 2000); -------------------------------------------------------------------------------- /d1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubhajiit/BestFriend_/5bb50dd0033eb941de3bdef7bdc04ad878930293/d1.jpg -------------------------------------------------------------------------------- /d2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubhajiit/BestFriend_/5bb50dd0033eb941de3bdef7bdc04ad878930293/d2.jpg -------------------------------------------------------------------------------- /d3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubhajiit/BestFriend_/5bb50dd0033eb941de3bdef7bdc04ad878930293/d3.jpg -------------------------------------------------------------------------------- /d4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubhajiit/BestFriend_/5bb50dd0033eb941de3bdef7bdc04ad878930293/d4.jpg -------------------------------------------------------------------------------- /gif1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubhajiit/BestFriend_/5bb50dd0033eb941de3bdef7bdc04ad878930293/gif1.gif -------------------------------------------------------------------------------- /gif2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubhajiit/BestFriend_/5bb50dd0033eb941de3bdef7bdc04ad878930293/gif2.gif -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | The Cutest Best Friend 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |

The Cutest Best Friend..🤭💗

15 |
16 | 17 |
18 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /last.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Our Beautiful Memories ✨ 7 | 308 | 309 | 310 |
311 |
312 | 313 |
💝
314 |
💖
315 |
💗
316 |
💓
317 |
💕
318 |
319 | 320 |
321 |

Our Beautiful Journey Together

322 |

Every moment spent with you has been magical. Let's cherish these precious memories forever...

323 |
324 | 325 |
326 |
327 | First Date 328 |
December 15, 2023
329 |
Our first candlelight dinner. Your smile lit up the entire room! ✨
330 |
331 |
332 | Beach Day 333 |
January 1, 2024
334 |
Watching the sunrise together on New Year's Day. Pure magic! 🌅
335 |
336 |
337 | Movie Night 338 |
January 20, 2024
339 |
Our cozy movie night. You fell asleep on my shoulder! 🎬💕
340 |
341 |
342 | Adventure Day 343 |
February 14, 2024
344 |
Valentine's Day adventure. Getting lost was the best part! 🗺️❤️
345 |
346 |
347 | 348 |
349 |

Thank You for the Memories

350 |

Every laugh, every tear, every moment spent together has been a precious gift. Though this chapter ends, the memories we've created will forever stay in my heart. You've made my world brighter and more beautiful than I could have ever imagined.

351 |

May your path ahead be filled with joy, love, and endless possibilities. Thank you for sharing these magical moments with me. ✨

352 | Until We Meet Again 💝 353 |
354 | 355 | -------------------------------------------------------------------------------- /script.js: -------------------------------------------------------------------------------- 1 | // Cursor following effect 2 | const cursor = document.querySelector('.cursor'); 3 | document.addEventListener('mousemove', (e) => { 4 | cursor.style.left = e.clientX + 'px'; 5 | cursor.style.top = e.clientY + 'px'; 6 | }); 7 | 8 | // Typing effect for greeting 9 | const greetingText = "Hey Bestie! You're the most adorable human ever! 💖"; 10 | const greetingElement = document.querySelector('.greeting'); 11 | let charIndex = 0; 12 | 13 | function typeGreeting() { 14 | if (charIndex < greetingText.length) { 15 | greetingElement.textContent += greetingText.charAt(charIndex); 16 | charIndex++; 17 | setTimeout(typeGreeting, 100); 18 | } 19 | } 20 | 21 | // Create floating elements 22 | const floatingElements = ['💖', '✨', '🌸', '💫', '💕']; 23 | function createFloating() { 24 | const element = document.createElement('div'); 25 | element.className = 'floating'; 26 | element.textContent = floatingElements[Math.floor(Math.random() * floatingElements.length)]; 27 | element.style.left = Math.random() * 100 + 'vw'; 28 | element.style.top = Math.random() * 100 + 'vh'; 29 | element.style.fontSize = (Math.random() * 20 + 20) + 'px'; 30 | document.body.appendChild(element); 31 | 32 | gsap.to(element, { 33 | y: -500, 34 | x: Math.random() * 100 - 50, 35 | rotation: Math.random() * 360, 36 | duration: Math.random() * 5 + 5, 37 | opacity: 1, 38 | ease: "none", 39 | onComplete: () => element.remove() 40 | }); 41 | } 42 | 43 | // Initialize animations 44 | window.addEventListener('load', () => { 45 | // Title animation 46 | gsap.to('h1', { 47 | opacity: 1, 48 | duration: 1, 49 | y: 20, 50 | ease: "bounce.out" 51 | }); 52 | 53 | // Button animation 54 | gsap.to('.cta-button', { 55 | opacity: 1, 56 | duration: 1, 57 | y: -20, 58 | ease: "back.out" 59 | }); 60 | 61 | // Start typing effect 62 | typeGreeting(); 63 | 64 | // Create floating elements periodically 65 | setInterval(createFloating, 1000); 66 | }); 67 | 68 | // Hover effects 69 | // Hover effects 70 | document.querySelectorAll('.cta-button').forEach(button => { 71 | button.addEventListener('mouseenter', () => { 72 | gsap.to(button, { 73 | scale: 1.1, 74 | duration: 0.3 75 | }); 76 | }); 77 | 78 | button.addEventListener('mouseleave', () => { 79 | gsap.to(button, { 80 | scale: 1, 81 | duration: 0.3 82 | }); 83 | }); 84 | 85 | // Smooth page transition on click 86 | button.addEventListener('click', () => { 87 | gsap.to('body', { 88 | opacity: 0, 89 | duration: 1, 90 | onComplete: () => { 91 | window.location.href = 'cause.html'; // Replace with the actual URL of the next page 92 | } 93 | }); 94 | }); 95 | }); -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | cursor: none; 6 | } 7 | 8 | body { 9 | min-height: 100vh; 10 | display: flex; 11 | flex-direction: column; 12 | align-items: center; 13 | justify-content: center; 14 | background: linear-gradient(-45deg, #fee9f7, #e8f5fe, #fef2e8, #f0ffe8); 15 | background-size: 400% 400%; 16 | animation: gradientBG 15s ease infinite; 17 | font-family: 'Arial Rounded MT Bold', Arial, sans-serif; 18 | overflow: hidden; 19 | position: relative; 20 | } 21 | 22 | .cursor { 23 | width: 20px; 24 | height: 20px; 25 | background: pink; 26 | border-radius: 50%; 27 | position: fixed; 28 | pointer-events: none; 29 | mix-blend-mode: difference; 30 | transition: transform 0.2s; 31 | } 32 | 33 | .container { 34 | text-align: center; 35 | z-index: 1; 36 | } 37 | 38 | h1 { 39 | font-size: 3.5rem; 40 | color: #ff69b4; 41 | text-shadow: 0 0 10px rgba(255, 105, 180, 0.5); 42 | margin-bottom: 2rem; 43 | opacity: 0; 44 | } 45 | 46 | .greeting { 47 | font-size: 1.5rem; 48 | color: #8a2be2; 49 | margin-bottom: 3rem; 50 | min-height: 2em; 51 | } 52 | 53 | .cta-button { 54 | padding: 1rem 2rem; 55 | font-size: 1.2rem; 56 | background: linear-gradient(45deg, #ff69b4, #ff99cc); 57 | border: none; 58 | border-radius: 50px; 59 | color: white; 60 | cursor: pointer; 61 | box-shadow: 0 0 15px rgba(255, 105, 180, 0.5); 62 | transition: transform 0.3s, box-shadow 0.3s; 63 | opacity: 0; 64 | } 65 | 66 | .cta-button:hover { 67 | transform: scale(1.1); 68 | box-shadow: 0 0 25px rgba(255, 105, 180, 0.7); 69 | } 70 | 71 | .floating { 72 | position: absolute; 73 | pointer-events: none; 74 | opacity: 0; 75 | } 76 | 77 | @keyframes gradientBG { 78 | 0% { background-position: 0% 50%; } 79 | 50% { background-position: 100% 50%; } 80 | 100% { background-position: 0% 50%; } 81 | } 82 | 83 | @media (max-width: 768px) { 84 | h1 { font-size: 2rem; } 85 | .greeting { font-size: 1.2rem; } 86 | .cta-button { font-size: 1rem; } 87 | } --------------------------------------------------------------------------------