This commit is contained in:
Oli Passey
2025-12-10 18:16:14 +00:00
commit 9dddb35ac9
5 changed files with 919 additions and 0 deletions

24
README.md Normal file
View File

@@ -0,0 +1,24 @@
# Gift Prank Website
A fun prank website that looks like a gift redemption portal.
## How it works:
1. **Code Entry**: Enter the 5-digit code: `12345`
2. **Fake Reveal**: Shows an "epic" gift of a week of brewery tours in Holland + 3-day Defqon.1 festival stay with hardcore videos
3. **Hoax Reveal**: When they confirm, reveals it's a prank and shows the real gift: a relaxing spa day!
## Files:
- `index.html` - Main HTML structure
- `styles.css` - Styling and animations
- `script.js` - Interactive functionality
## To run:
Simply open `index.html` in a web browser!
## Customization:
- Change the redemption code in `script.js` (line 2): `const VALID_CODE = '12345';`
- Modify the spa gift details in `index.html`
- Adjust colors and styling in `styles.css`
Enjoy pranking your friend! 🎁😂

184
index.html Normal file
View File

@@ -0,0 +1,184 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gift Redemption Portal</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<!-- Initial Code Entry Screen -->
<div id="code-screen" class="screen active">
<div class="gift-box">
<div class="ribbon"></div>
<div class="bow"></div>
</div>
<h1>🎁 Gift Redemption Portal</h1>
<p class="subtitle">Enter your 5-digit code to reveal your exclusive gift</p>
<div class="code-input-container">
<input type="text" id="code-input" maxlength="5" placeholder="00000" class="code-input">
<button id="redeem-btn" class="btn-primary">Redeem Gift</button>
</div>
<p class="error-message" id="error-message"></p>
</div>
<!-- Fake Gift Reveal Screen -->
<div id="reveal-screen" class="screen">
<h1>🎉 CONGRATULATIONS! 🎉</h1>
<h2 class="gift-title">Your Ultimate Experience Awaits!</h2>
<div class="gift-details">
<div class="gift-section">
<h3>🍺 7-DAY EXTREME BREWERY MARATHON</h3>
<p style="font-weight: bold; color: #d32f2f; margin-bottom: 15px;">
3 BREWERIES PER DAY | MINIMUM 5 BEERS PER LOCATION | LIMITED FOOD BREAKS
</p>
<div class="brewery-schedule">
<h4>📅 Your Grueling Itinerary:</h4>
<div class="day-schedule">
<strong>DAY 1 - Amsterdam Assault:</strong>
<ul>
<li>Brouwerij 't IJ - 6 IPAs (breakfast of champions!)</li>
<li>Two Chefs Brewing - 5 experimental sours</li>
<li>Oedipus Brewing - 7 high-ABV specials</li>
</ul>
</div>
<div class="day-schedule">
<strong>DAY 2 - Rotterdam Rampage:</strong>
<ul>
<li>Kaapse Brouwers - 6 hoppy lagers</li>
<li>Stadsbierbrouwerij De Pelgrim - 5 Belgian-style ales</li>
<li>Noordt Bier - 6 stouts (heavy and unforgiving)</li>
</ul>
</div>
<div class="day-schedule">
<strong>DAY 3 - Utrecht Undertaking:</strong>
<ul>
<li>Stadsbrouwerij Maximus - 5 wheat beers</li>
<li>De Leckere - 6 farmhouse ales</li>
<li>Oproer Brouwerij - 7 double IPAs (no mercy!)</li>
</ul>
</div>
<div class="day-schedule">
<strong>DAY 4 - The Hague Hardship:</strong>
<ul>
<li>Kompaan Bierbrouwerij - 6 pilsners</li>
<li>Haagsche Broeder - 5 brown ales</li>
<li>Trappist Brouwerij - 8 monastery brews (pray for your liver)</li>
</ul>
</div>
<div class="day-schedule">
<strong>DAY 5 - Haarlem Havoc:</strong>
<ul>
<li>Jopen Bier - 6 historic recipes</li>
<li>Uiltje Brewing Company - 7 owl-themed IPAs</li>
<li>Ramses Bier - 5 Egyptian-inspired brews</li>
</ul>
</div>
<div class="day-schedule">
<strong>DAY 6 - Eindhoven Endurance:</strong>
<ul>
<li>Stadsbrouwerij Eindhoven - 6 industrial lagers</li>
<li>100 Watt Brewery - 5 electric ales</li>
<li>Little Bang Brewing - 7 explosive stouts</li>
</ul>
</div>
<div class="day-schedule">
<strong>DAY 7 - Final Countdown:</strong>
<ul>
<li>Texels Bierbrouwerij - 6 island beers</li>
<li>Brouwerij De Prael - 5 Amsterdam specials</li>
<li>Breugem Bier - 8 FINAL BOSS brews before Defqon!</li>
</ul>
</div>
</div>
<p style="background: #ffeb3b; padding: 10px; border-radius: 5px; margin-top: 15px; font-weight: bold; color: #333;">
⚠️ Total: 21 breweries • 127+ beers • Food breaks: MINIMAL (maybe some bitterballen if you're lucky)
</p>
</div>
<div class="gift-section highlight">
<h3>🎵 3-DAY CAMPING AT DEFQON.1 FESTIVAL</h3>
<p style="font-weight: bold; font-size: 1.2em; margin-bottom: 15px;">
STRAIGHT FROM YOUR BREWERY MARATHON TO THE MOST INTENSE HARDSTYLE FESTIVAL!
</p>
<div class="camping-details">
<h4>🏕️ Your "Luxury" Camping Experience:</h4>
<ul style="text-align: left; margin: 15px 0;">
<li>❌ Basic tent in MUD FIELD (June weather = rain guaranteed)</li>
<li>❌ Shared porta-potties with 10,000+ festival-goers</li>
<li>❌ No showers (or freezing cold ones at 6 AM)</li>
<li>❌ Sleep 3 hours max per night (bass doesn't stop until 4 AM)</li>
<li>❌ Wake up at 7 AM when the sun turns your tent into a sauna</li>
<li>❌ Festival food only: overpriced fries and mystery meat</li>
<li>❌ 150+ decibels of HARDCORE HARDSTYLE for 15 hours straight</li>
<li>❌ Surrounded by 60,000 sweaty ravers in neon</li>
<li>❌ Your hangover from 127 beers × 3 days of bass = LEGENDARY SUFFERING</li>
</ul>
<p style="background: #000; color: #ff0000; padding: 15px; border-radius: 5px; margin-top: 15px; font-weight: bold; font-size: 1.1em; border: 3px solid #ff0000;">
🔊 ENDURE THE CHAOS: 72 HOURS OF RELENTLESS BEATS, ZERO COMFORT, MAXIMUM PAIN! 🔊
</p>
</div>
</div>
<div class="video-container">
<h3>Get Ready for the POWER HOUR! ⚡</h3>
<div class="videos">
<!-- Local Power Hour video -->
<video controls width="100%" style="border-radius: 10px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);">
<source src="powerhour.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
</div>
<p class="warning">⚠️ THIS IS HOW HARDCORE YOUR WEEK WILL BE! ⚠️</p>
</div>
</div>
<button id="confirm-btn" class="btn-confirm">CONFIRM & ACCEPT GIFT</button>
</div>
<!-- Hoax Reveal & Real Gift Screen -->
<div id="final-screen" class="screen">
<div class="hoax-reveal">
<h1 class="hoax-title">😂 GOTCHA! 😂</h1>
<p class="hoax-message">Did you really think I'd send you to survive that chaos?!</p>
<p class="hoax-subtitle">Here's your ACTUAL gift...</p>
</div>
<div class="real-gift">
<div class="spa-icon">🧖‍♂️</div>
<h2>✨ Luxury Spa Day Experience ✨</h2>
<p class="spa-description">
Enjoy a relaxing day at a premium spa with:
</p>
<ul class="spa-features">
<li>🌿 Full body massage</li>
<li>💆 Facial treatment</li>
<li>🛀 Thermal bath access</li>
<li>🍵 Refreshments & healthy snacks</li>
<li>😌 Pure relaxation (no hardcore music!)</li>
</ul>
<p class="final-message">
You deserve some actual rest and relaxation, not a week-long hangover!
Enjoy your peaceful spa day! 💝
</p>
</div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>

BIN
powerhour.mp4 Normal file

Binary file not shown.

76
script.js Normal file
View File

@@ -0,0 +1,76 @@
// Valid redemption code (you can change this to any 5-digit code)
const VALID_CODE = '12345';
// Get DOM elements
const codeScreen = document.getElementById('code-screen');
const revealScreen = document.getElementById('reveal-screen');
const finalScreen = document.getElementById('final-screen');
const codeInput = document.getElementById('code-input');
const redeemBtn = document.getElementById('redeem-btn');
const confirmBtn = document.getElementById('confirm-btn');
const errorMessage = document.getElementById('error-message');
// Format input to only accept numbers
codeInput.addEventListener('input', function(e) {
this.value = this.value.replace(/[^0-9]/g, '');
});
// Handle Enter key in code input
codeInput.addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
redeemBtn.click();
}
});
// Redeem button click
redeemBtn.addEventListener('click', function() {
const code = codeInput.value.trim();
if (code.length !== 5) {
errorMessage.textContent = 'Please enter a 5-digit code';
codeInput.classList.add('shake');
setTimeout(() => codeInput.classList.remove('shake'), 500);
return;
}
if (code === VALID_CODE) {
errorMessage.textContent = '';
// Transition to reveal screen
codeScreen.classList.remove('active');
revealScreen.classList.add('active');
// Scroll to top
window.scrollTo(0, 0);
} else {
errorMessage.textContent = 'Invalid code. Please try again.';
codeInput.value = '';
codeInput.classList.add('shake');
setTimeout(() => codeInput.classList.remove('shake'), 500);
}
});
// Confirm button click (reveal the hoax)
confirmBtn.addEventListener('click', function() {
// Add some dramatic pause
confirmBtn.textContent = 'PROCESSING...';
confirmBtn.disabled = true;
setTimeout(() => {
revealScreen.classList.remove('active');
finalScreen.classList.add('active');
window.scrollTo(0, 0);
}, 1500);
});
// Add shake animation for invalid codes
const style = document.createElement('style');
style.textContent = `
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-10px); }
75% { transform: translateX(10px); }
}
.shake {
animation: shake 0.3s ease;
}
`;
document.head.appendChild(style);

635
styles.css Normal file
View File

@@ -0,0 +1,635 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 10px;
}
.container {
width: 100%;
max-width: 800px;
}
.screen {
display: none;
background: white;
border-radius: 20px;
padding: 20px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
animation: slideIn 0.5s ease;
}
@media (min-width: 768px) {
.screen {
padding: 40px;
}
body {
padding: 20px;
}
}
.screen.active {
display: block;
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Code Entry Screen */
.gift-box {
width: 100px;
height: 100px;
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
margin: 0 auto 30px;
border-radius: 10px;
position: relative;
animation: bounce 2s infinite;
}
@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.ribbon {
position: absolute;
width: 20px;
height: 100%;
background: #ffd700;
left: 50%;
transform: translateX(-50%);
}
.bow {
position: absolute;
width: 50px;
height: 30px;
background: #ffd700;
top: -10px;
left: 50%;
transform: translateX(-50%);
border-radius: 50%;
}
h1 {
text-align: center;
color: #333;
margin-bottom: 10px;
font-size: 1.8em;
word-wrap: break-word;
}
@media (min-width: 768px) {
h1 {
font-size: 2.5em;
}
}
.subtitle {
text-align: center;
color: #666;
margin-bottom: 30px;
font-size: 1em;
padding: 0 10px;
}
@media (min-width: 768px) {
.subtitle {
font-size: 1.1em;
padding: 0;
}
}
.code-input-container {
display: flex;
flex-direction: column;
gap: 15px;
align-items: center;
margin-bottom: 10px;
}
.code-input {
width: 180px;
padding: 12px;
font-size: 1.8em;
text-align: center;
border: 3px solid #667eea;
border-radius: 10px;
letter-spacing: 8px;
transition: all 0.3s;
}
@media (min-width: 768px) {
.code-input {
width: 200px;
padding: 15px;
font-size: 2em;
letter-spacing: 10px;
}
}
.code-input:focus {
outline: none;
border-color: #764ba2;
box-shadow: 0 0 20px rgba(102, 126, 234, 0.3);
}
.btn-primary, .btn-confirm {
padding: 12px 30px;
font-size: 1em;
font-weight: bold;
color: white;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border: none;
border-radius: 50px;
cursor: pointer;
transition: all 0.3s;
text-transform: uppercase;
}
@media (min-width: 768px) {
.btn-primary, .btn-confirm {
padding: 15px 40px;
font-size: 1.2em;
}
}
.btn-primary:hover, .btn-confirm:hover {
transform: translateY(-2px);
box-shadow: 0 10px 30px rgba(102, 126, 234, 0.4);
}
.error-message {
color: #f5576c;
text-align: center;
min-height: 20px;
font-weight: bold;
}
/* Reveal Screen */
.gift-title {
text-align: center;
color: #764ba2;
margin-bottom: 20px;
font-size: 1.3em;
word-wrap: break-word;
padding: 0 10px;
}
@media (min-width: 768px) {
.gift-title {
font-size: 1.8em;
margin-bottom: 30px;
padding: 0;
}
}
.gift-details {
margin: 20px 0;
}
@media (min-width: 768px) {
.gift-details {
margin: 30px 0;
}
}
.gift-section {
background: #f8f9fa;
padding: 15px;
border-radius: 10px;
margin-bottom: 20px;
}
@media (min-width: 768px) {
.gift-section {
padding: 20px;
}
}
.gift-section.highlight {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
color: white;
}
.gift-section h3 {
margin-bottom: 10px;
font-size: 1.2em;
word-wrap: break-word;
}
@media (min-width: 768px) {
.gift-section h3 {
font-size: 1.5em;
}
}
.gift-section p {
font-size: 0.95em;
line-height: 1.6;
word-wrap: break-word;
}
@media (min-width: 768px) {
.gift-section p {
font-size: 1.1em;
}
}
.brewery-schedule {
background: white;
padding: 10px;
border-radius: 8px;
margin-top: 15px;
}
@media (min-width: 768px) {
.brewery-schedule {
padding: 15px;
}
}
.brewery-schedule h4 {
color: #d32f2f;
margin-bottom: 15px;
font-size: 1em;
word-wrap: break-word;
}
@media (min-width: 768px) {
.brewery-schedule h4 {
font-size: 1.2em;
}
}
.day-schedule {
margin-bottom: 15px;
padding: 8px;
background: #fff3e0;
border-radius: 5px;
border-left: 4px solid #ff6f00;
}
@media (min-width: 768px) {
.day-schedule {
padding: 10px;
}
}
.day-schedule strong {
display: block;
color: #e65100;
margin-bottom: 8px;
font-size: 0.95em;
word-wrap: break-word;
}
@media (min-width: 768px) {
.day-schedule strong {
font-size: 1.1em;
}
}
.day-schedule ul {
list-style: none;
padding-left: 5px;
}
@media (min-width: 768px) {
.day-schedule ul {
padding-left: 10px;
}
}
.day-schedule ul li {
padding: 5px 0;
color: #333;
font-size: 0.9em;
word-wrap: break-word;
}
@media (min-width: 768px) {
.day-schedule ul li {
font-size: 1em;
}
}
.day-schedule ul li:before {
content: "🍺 ";
margin-right: 5px;
}
.camping-details {
background: rgba(0, 0, 0, 0.3);
padding: 15px;
border-radius: 10px;
margin-top: 15px;
}
@media (min-width: 768px) {
.camping-details {
padding: 20px;
}
}
.camping-details h4 {
margin-bottom: 15px;
font-size: 1.1em;
word-wrap: break-word;
}
@media (min-width: 768px) {
.camping-details h4 {
font-size: 1.3em;
}
}
.camping-details ul {
list-style: none;
padding: 0;
}
.camping-details ul li {
padding: 8px;
margin: 8px 0;
background: rgba(255, 255, 255, 0.1);
border-radius: 5px;
font-size: 0.9em;
word-wrap: break-word;
}
@media (min-width: 768px) {
.camping-details ul li {
font-size: 1.05em;
}
}
.video-container {
margin: 30px 0;
text-align: center;
}
.video-container h3 {
margin-bottom: 20px;
color: #f5576c;
font-size: 1.3em;
animation: pulse 1.5s infinite;
word-wrap: break-word;
}
@media (min-width: 768px) {
.video-container h3 {
font-size: 1.8em;
}
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.7; }
}
.videos {
margin: 20px 0;
}
.videos iframe {
border-radius: 10px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
}
.video-link-box {
background: #1a1a1a;
color: white;
padding: 30px;
border-radius: 10px;
text-align: center;
}
.video-link-box h4 {
color: #ff0000;
margin-bottom: 20px;
font-size: 1.3em;
}
.youtube-link {
display: inline-block;
background: #ff0000;
color: white;
padding: 15px 30px;
text-decoration: none;
border-radius: 5px;
font-weight: bold;
font-size: 1.2em;
transition: all 0.3s;
}
.youtube-link:hover {
background: #cc0000;
transform: scale(1.05);
}
.warning {
color: #ff0000;
font-weight: bold;
font-size: 1em;
margin-top: 20px;
animation: blink 1s infinite;
word-wrap: break-word;
}
@media (min-width: 768px) {
.warning {
font-size: 1.3em;
}
}
@keyframes blink {
0%, 50%, 100% { opacity: 1; }
25%, 75% { opacity: 0.5; }
}
.btn-confirm {
display: block;
margin: 20px auto 0;
background: linear-gradient(135deg, #f5576c 0%, #764ba2 100%);
font-size: 1.1em;
padding: 15px 30px;
}
@media (min-width: 768px) {
.btn-confirm {
margin: 30px auto 0;
font-size: 1.4em;
padding: 20px 50px;
}
}
/* Final Screen */
.hoax-reveal {
text-align: center;
margin-bottom: 20px;
padding: 20px;
background: linear-gradient(135deg, #ffeb3b 0%, #ff9800 100%);
border-radius: 15px;
animation: wiggle 0.5s ease;
}
@media (min-width: 768px) {
.hoax-reveal {
margin-bottom: 40px;
padding: 30px;
}
}
@keyframes wiggle {
0%, 100% { transform: rotate(0deg); }
25% { transform: rotate(-5deg); }
75% { transform: rotate(5deg); }
}
.hoax-title {
font-size: 2em;
color: #333;
margin-bottom: 15px;
word-wrap: break-word;
}
@media (min-width: 768px) {
.hoax-title {
font-size: 3em;
}
}
.hoax-message {
font-size: 1.1em;
color: #333;
font-weight: bold;
margin-bottom: 10px;
word-wrap: break-word;
}
@media (min-width: 768px) {
.hoax-message {
font-size: 1.5em;
}
}
.hoax-subtitle {
font-size: 1em;
color: #555;
font-style: italic;
word-wrap: break-word;
}
@media (min-width: 768px) {
.hoax-subtitle {
font-size: 1.3em;
}
}
.real-gift {
background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
padding: 20px;
border-radius: 15px;
text-align: center;
}
@media (min-width: 768px) {
.real-gift {
padding: 40px;
}
}
.spa-icon {
font-size: 3em;
margin-bottom: 20px;
}
@media (min-width: 768px) {
.spa-icon {
font-size: 5em;
}
}
.real-gift h2 {
color: #764ba2;
margin-bottom: 20px;
font-size: 1.5em;
word-wrap: break-word;
}
@media (min-width: 768px) {
.real-gift h2 {
font-size: 2em;
}
}
.spa-description {
font-size: 1em;
color: #333;
margin-bottom: 20px;
word-wrap: break-word;
}
@media (min-width: 768px) {
.spa-description {
font-size: 1.2em;
}
}
.spa-features {
list-style: none;
text-align: left;
max-width: 400px;
margin: 20px auto;
font-size: 0.95em;
}
@media (min-width: 768px) {
.spa-features {
font-size: 1.1em;
}
}
.spa-features li {
padding: 10px;
margin: 5px 0;
background: white;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
word-wrap: break-word;
}
.final-message {
font-size: 1em;
color: #333;
margin-top: 20px;
font-weight: bold;
line-height: 1.6;
word-wrap: break-word;
}
@media (min-width: 768px) {
.final-message {
font-size: 1.2em;
margin-top: 30px;
}
}