Convert to PHP
parent
03d1ccfbe4
commit
8166541ebf
File diff suppressed because it is too large
Load Diff
Binary file not shown.
After Width: | Height: | Size: 19 MiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 2.4 MiB |
Binary file not shown.
|
@ -0,0 +1,114 @@
|
||||||
|
/* Reset for clean styling */
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
padding: 20px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.boxes {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
background-color: #4caf50;
|
||||||
|
color: white;
|
||||||
|
font-weight: bold;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box:hover {
|
||||||
|
background-color: #45a049;
|
||||||
|
transform: scale(1.05);
|
||||||
|
transition: all 0.3s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.box {
|
||||||
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.box {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 99%; /* Increase container width */
|
||||||
|
margin: 10px auto;
|
||||||
|
background: rgba(255, 255, 255, 0.1);
|
||||||
|
border-radius: 15px;
|
||||||
|
padding: 20px;
|
||||||
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Logo Santa hat */
|
||||||
|
.logo-container {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.santa-hat {
|
||||||
|
position: absolute;
|
||||||
|
top: -45px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%) rotate(0deg);
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
background: red;
|
||||||
|
border-radius: 50%;
|
||||||
|
border-bottom: 10px solid white;
|
||||||
|
animation: hatDrop 2s ease-out infinite alternate;
|
||||||
|
}
|
||||||
|
.santa-hat:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -15px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
width: 15px;
|
||||||
|
height: 15px;
|
||||||
|
background: white;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
@keyframes hatDrop {
|
||||||
|
0% {
|
||||||
|
transform: translateX(-50%) rotate(-20deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateX(-50%) rotate(20deg);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>CSV Boxes</title>
|
||||||
|
<link rel="stylesheet" href="index-styles.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container text-center py-5">
|
||||||
|
<div class="logo-container position-relative">
|
||||||
|
<img src="./pgan_logo.png" alt="PGAN Logo" class="logo mb-4" />
|
||||||
|
<div class="santa-hat"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h2>PRIZZES</h2>
|
||||||
|
<div class="boxes" id="low-boxes"></div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h2>PRIZZES</h2>
|
||||||
|
<div class="boxes" id="high-boxes"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const csvLow = ["3000", "5000", "7000"];
|
||||||
|
const csvHigh = ["10000", "15000", "25000"];
|
||||||
|
|
||||||
|
function createBoxes(data, containerId, nextPage) {
|
||||||
|
const container = document.getElementById(containerId);
|
||||||
|
data.forEach((value) => {
|
||||||
|
const box = document.createElement("div");
|
||||||
|
box.className = "box";
|
||||||
|
box.textContent = value;
|
||||||
|
|
||||||
|
// Add click event to store selected value and navigate
|
||||||
|
box.addEventListener("click", () => {
|
||||||
|
localStorage.setItem("selectedPrice", value); // Save selected price
|
||||||
|
window.location.href = nextPage; // Navigate to the respective page
|
||||||
|
});
|
||||||
|
|
||||||
|
container.appendChild(box);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
createBoxes(csvLow, "low-boxes", "offices-low.html");
|
||||||
|
createBoxes(csvHigh, "high-boxes", "offices-high.html");
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,44 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Offices High</title>
|
||||||
|
<link rel="stylesheet" href="./index-styles.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h2>Selected Price (High): <span id="selected-price"></span></h2>
|
||||||
|
<h2>Available Offices</h2>
|
||||||
|
<div class="boxes" id="office-boxes"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const offices = ["PGO", "PHRMO", "TEST", "PPDO"];
|
||||||
|
|
||||||
|
// Display the selected price
|
||||||
|
const selectedPrice = localStorage.getItem('selectedPrice');
|
||||||
|
document.getElementById('selected-price').textContent = selectedPrice;
|
||||||
|
|
||||||
|
// Create office boxes
|
||||||
|
function createOfficeBoxes(data) {
|
||||||
|
const container = document.getElementById('office-boxes');
|
||||||
|
data.forEach(office => {
|
||||||
|
const box = document.createElement('div');
|
||||||
|
box.className = 'box';
|
||||||
|
box.textContent = office;
|
||||||
|
|
||||||
|
// Add click event to store selected office
|
||||||
|
box.addEventListener('click', () => {
|
||||||
|
localStorage.setItem('selectedOffice', office); // Save selected office
|
||||||
|
alert(`You selected office: ${office}`); // Display confirmation
|
||||||
|
});
|
||||||
|
|
||||||
|
container.appendChild(box);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
createOfficeBoxes(offices);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,99 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Offices Low</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
margin: 20px;
|
||||||
|
width: 90%;
|
||||||
|
max-width: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.boxes {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box {
|
||||||
|
background: #f0f0f0;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 15px;
|
||||||
|
cursor: pointer;
|
||||||
|
text-align: center;
|
||||||
|
width: calc(50% - 10px);
|
||||||
|
transition: background 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box:hover {
|
||||||
|
background: #f8d7da;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h2>Selected Price (Low): <span id="selected-price"></span></h2>
|
||||||
|
<h2>Available Offices</h2>
|
||||||
|
<div class="boxes" id="office-boxes"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Predefined offices
|
||||||
|
const offices = ["PGO", "PHRMO", "TEST", "PPDO"];
|
||||||
|
|
||||||
|
const selectedPrice = localStorage.getItem('selectedPrice');
|
||||||
|
document.getElementById('selected-price').textContent = selectedPrice || "None";
|
||||||
|
|
||||||
|
|
||||||
|
function fetchRemovedOffices() {
|
||||||
|
const removedOffices = localStorage.getItem('removedOffices');
|
||||||
|
return removedOffices ? JSON.parse(removedOffices) : [];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function saveRemovedOffice(office) {
|
||||||
|
const removedOffices = fetchRemovedOffices();
|
||||||
|
removedOffices.push(office);
|
||||||
|
localStorage.setItem('removedOffices', JSON.stringify(removedOffices));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function createOfficeBoxes() {
|
||||||
|
const removedOffices = fetchRemovedOffices();
|
||||||
|
const filteredOffices = offices.filter(office => !removedOffices.includes(office));
|
||||||
|
|
||||||
|
const container = document.getElementById('office-boxes');
|
||||||
|
container.innerHTML = '';
|
||||||
|
|
||||||
|
filteredOffices.forEach(office => {
|
||||||
|
const box = document.createElement('div');
|
||||||
|
box.className = 'box';
|
||||||
|
box.textContent = office;
|
||||||
|
|
||||||
|
|
||||||
|
box.addEventListener('click', () => {
|
||||||
|
alert(`You selected and removed office: ${office}`);
|
||||||
|
saveRemovedOffice(office);
|
||||||
|
createOfficeBoxes();
|
||||||
|
});
|
||||||
|
|
||||||
|
container.appendChild(box);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
createOfficeBoxes();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,3 @@
|
||||||
|
PGO-MIS
|
||||||
|
PGO
|
||||||
|
PHRMO
|
|
Binary file not shown.
After Width: | Height: | Size: 7.0 MiB |
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 366 KiB |
|
@ -0,0 +1,113 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>PGAN Christmas Raffle</title>
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
|
||||||
|
/>
|
||||||
|
<link rel="stylesheet" href="./style.css" />
|
||||||
|
</head>
|
||||||
|
<body class="bg-christmas">
|
||||||
|
<!-- Background Music -->
|
||||||
|
<audio id="background-music" src="./paripapap_music.mp3" loop></audio>
|
||||||
|
<audio id="background-music1" src="./igiling.mp3" loop></audio>
|
||||||
|
|
||||||
|
<audio id="congrats-music1" src="./congrats.mp3"></audio>
|
||||||
|
<audio id="congrats-music2" src="./congrats1.mp3"></audio>
|
||||||
|
|
||||||
|
<img id="paripapap-gif" class="playing-image-paripapap" src="./paripapap.gif" alt="Paripapap GIF">
|
||||||
|
<img id="igiling-gif" class="playing-image-igiling" src="./igiling.gif" alt="Igiling GIF">
|
||||||
|
|
||||||
|
<!-- Snowflakes -->
|
||||||
|
<div id="snow-container"></div>
|
||||||
|
|
||||||
|
<div class="container text-center py-5">
|
||||||
|
<!-- PGAN Logo -->
|
||||||
|
<!-- <img src="./pgan_logo.png" alt="PGAN Logo" class="logo mb-4" /> -->
|
||||||
|
<div class="logo-container position-relative">
|
||||||
|
<img src="./pgan_logo.png" alt="PGAN Logo" class="logo mb-4" />
|
||||||
|
<div class="santa-hat"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1 class="text-dark mb-4 position-relative heading-lights fancy-heading">
|
||||||
|
<span class="christmas-tree">🎄</span>
|
||||||
|
PGAN Christmas Raffle
|
||||||
|
<span class="santa">🎅</span>
|
||||||
|
<div class="lights-wrapper">
|
||||||
|
<div class="lightbulb red"></div>
|
||||||
|
<div class="lightbulb green"></div>
|
||||||
|
<div class="lightbulb blue"></div>
|
||||||
|
<div class="lightbulb yellow"></div>
|
||||||
|
<div class="lightbulb purple"></div>
|
||||||
|
<div class="lightbulb red"></div>
|
||||||
|
<div class="lightbulb green"></div>
|
||||||
|
<div class="lightbulb blue"></div>
|
||||||
|
<div class="lightbulb yellow"></div>
|
||||||
|
<div class="lightbulb purple"></div>
|
||||||
|
</div>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
<input
|
||||||
|
type="file"
|
||||||
|
id="file-input"
|
||||||
|
accept=".csv"
|
||||||
|
class="form-control w-50 mx-auto"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<button id="raffle-button" class="btn btn-danger btn-lg mb-3 glowing">
|
||||||
|
🎁 Pick a Winner! 🎁
|
||||||
|
</button>
|
||||||
|
<div
|
||||||
|
id="box-container"
|
||||||
|
class="d-flex flex-wrap justify-content-center gap-1 my-4"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Modal -->
|
||||||
|
<!-- Modal -->
|
||||||
|
<div
|
||||||
|
class="modal fade"
|
||||||
|
id="winnerModal"
|
||||||
|
tabindex="-1"
|
||||||
|
aria-labelledby="winnerModalLabel"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<div class="modal-dialog modal-xl">
|
||||||
|
<!-- Enlarged modal -->
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title fw-bold" id="winnerModalLabel">
|
||||||
|
🎉 Winner Announced! 🎉
|
||||||
|
</h5>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn-close"
|
||||||
|
data-bs-dismiss="modal"
|
||||||
|
aria-label="Close"
|
||||||
|
></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body text-center">
|
||||||
|
<p
|
||||||
|
id="winner-name"
|
||||||
|
class="fw-bold text-danger"
|
||||||
|
style="font-size: 5.5rem"
|
||||||
|
></p>
|
||||||
|
<!-- Larger winner text -->
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button id="remove-winner" class="btn btn-danger">
|
||||||
|
Remove Winner
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
<script src="./script.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,169 @@
|
||||||
|
const fileInput = document.getElementById("file-input");
|
||||||
|
const boxContainer = document.getElementById("box-container");
|
||||||
|
const raffleButton = document.getElementById("raffle-button");
|
||||||
|
const backgroundMusicOptions = [
|
||||||
|
document.getElementById("background-music"),
|
||||||
|
document.getElementById("background-music1"),
|
||||||
|
];
|
||||||
|
const congratsMusicOptions = [
|
||||||
|
document.getElementById("congrats-music1"),
|
||||||
|
document.getElementById("congrats-music2"),
|
||||||
|
];
|
||||||
|
const winnerModal = new bootstrap.Modal(
|
||||||
|
document.getElementById("winnerModal"),
|
||||||
|
{
|
||||||
|
backdrop: "static",
|
||||||
|
keyboard: false,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
const winnerNameDisplay = document.getElementById("winner-name");
|
||||||
|
const removeWinnerButton = document.getElementById("remove-winner");
|
||||||
|
const paripapapGif = document.getElementById("paripapap-gif");
|
||||||
|
const igilingGif = document.getElementById("igiling-gif");
|
||||||
|
|
||||||
|
let names = [];
|
||||||
|
let spinning = false;
|
||||||
|
let currentWinnerIndex = null;
|
||||||
|
|
||||||
|
// Initialize both images hidden
|
||||||
|
paripapapGif.style.display = "none";
|
||||||
|
igilingGif.style.display = "none";
|
||||||
|
|
||||||
|
// Function to show the appropriate GIF based on the audio playing
|
||||||
|
function showGifForMusic(audioId) {
|
||||||
|
if (audioId === "background-music") {
|
||||||
|
paripapapGif.style.display = "block";
|
||||||
|
igilingGif.style.display = "none";
|
||||||
|
} else if (audioId === "background-music1") {
|
||||||
|
paripapapGif.style.display = "none";
|
||||||
|
igilingGif.style.display = "block";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add event listeners for play, pause, and ended events on the audio elements
|
||||||
|
backgroundMusicOptions.forEach((music) => {
|
||||||
|
music.addEventListener("play", () => showGifForMusic(music.id));
|
||||||
|
music.addEventListener("pause", () => {
|
||||||
|
paripapapGif.style.display = "none";
|
||||||
|
igilingGif.style.display = "none";
|
||||||
|
});
|
||||||
|
music.addEventListener("ended", () => {
|
||||||
|
paripapapGif.style.display = "none";
|
||||||
|
igilingGif.style.display = "none";
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Load names from CSV and populate boxes
|
||||||
|
fileInput.addEventListener("change", (event) => {
|
||||||
|
const file = event.target.files[0];
|
||||||
|
if (file) {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = (e) => {
|
||||||
|
names = e.target.result.split("\n").filter((name) => name.trim() !== "");
|
||||||
|
populateBoxes();
|
||||||
|
raffleButton.disabled = names.length === 0;
|
||||||
|
};
|
||||||
|
reader.readAsText(file);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Populate the UI with boxes
|
||||||
|
function populateBoxes() {
|
||||||
|
boxContainer.innerHTML = "";
|
||||||
|
names.forEach((name, index) => {
|
||||||
|
const box = document.createElement("div");
|
||||||
|
box.classList.add("box");
|
||||||
|
box.textContent = name.trim();
|
||||||
|
box.dataset.index = index;
|
||||||
|
boxContainer.appendChild(box);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle raffle button click
|
||||||
|
raffleButton.addEventListener("click", () => {
|
||||||
|
if (names.length === 0 || spinning) return;
|
||||||
|
|
||||||
|
spinning = true;
|
||||||
|
raffleButton.disabled = true; // Disable the button
|
||||||
|
|
||||||
|
// Stop any previously playing background music
|
||||||
|
backgroundMusicOptions.forEach((music) => {
|
||||||
|
music.pause();
|
||||||
|
music.currentTime = 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Play a random background music
|
||||||
|
const randomBackgroundMusic =
|
||||||
|
backgroundMusicOptions[
|
||||||
|
Math.floor(Math.random() * backgroundMusicOptions.length)
|
||||||
|
];
|
||||||
|
randomBackgroundMusic.play();
|
||||||
|
|
||||||
|
const boxes = Array.from(document.querySelectorAll(".box"));
|
||||||
|
let randomInterval;
|
||||||
|
let highlightedIndex;
|
||||||
|
|
||||||
|
// Randomly highlight boxes
|
||||||
|
function randomHighlight() {
|
||||||
|
if (highlightedIndex !== undefined) {
|
||||||
|
boxes[highlightedIndex].classList.remove("highlighted");
|
||||||
|
}
|
||||||
|
highlightedIndex = Math.floor(Math.random() * boxes.length);
|
||||||
|
boxes[highlightedIndex].classList.add("highlighted");
|
||||||
|
}
|
||||||
|
|
||||||
|
randomInterval = setInterval(randomHighlight, 200);
|
||||||
|
|
||||||
|
// Reveal the winner after a delay
|
||||||
|
setTimeout(() => {
|
||||||
|
clearInterval(randomInterval);
|
||||||
|
randomHighlight();
|
||||||
|
|
||||||
|
const winnerBox = boxes[highlightedIndex];
|
||||||
|
currentWinnerIndex = highlightedIndex;
|
||||||
|
winnerBox.classList.add("winner");
|
||||||
|
|
||||||
|
const winnerName = names[highlightedIndex];
|
||||||
|
winnerNameDisplay.textContent = winnerName.trim();
|
||||||
|
|
||||||
|
// Stop background music and play random congrats music
|
||||||
|
randomBackgroundMusic.pause();
|
||||||
|
randomBackgroundMusic.currentTime = 0;
|
||||||
|
|
||||||
|
// Play a random congratulatory music
|
||||||
|
const randomCongratsMusic =
|
||||||
|
congratsMusicOptions[
|
||||||
|
Math.floor(Math.random() * congratsMusicOptions.length)
|
||||||
|
];
|
||||||
|
randomCongratsMusic.play();
|
||||||
|
|
||||||
|
// Show winner modal
|
||||||
|
winnerModal.show();
|
||||||
|
|
||||||
|
spinning = false;
|
||||||
|
raffleButton.disabled = false; // Re-enable the button after process
|
||||||
|
}, 8500);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Remove winner and allow a new draw
|
||||||
|
removeWinnerButton.addEventListener("click", () => {
|
||||||
|
if (currentWinnerIndex !== null) {
|
||||||
|
names.splice(currentWinnerIndex, 1);
|
||||||
|
populateBoxes();
|
||||||
|
currentWinnerIndex = null;
|
||||||
|
raffleButton.disabled = names.length === 0;
|
||||||
|
winnerModal.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add snowflakes dynamically
|
||||||
|
const snowContainer = document.getElementById("snow-container");
|
||||||
|
for (let i = 0; i < 100; i++) {
|
||||||
|
const snowflake = document.createElement("div");
|
||||||
|
snowflake.className = "snowflake";
|
||||||
|
snowflake.style.left = Math.random() * 100 + "vw";
|
||||||
|
snowflake.style.animationDelay = Math.random() * 10 + "s";
|
||||||
|
snowflake.style.animationDuration = 5 + Math.random() * 10 + "s";
|
||||||
|
snowflake.style.width = snowflake.style.height = 5 + Math.random() * 5 + "px";
|
||||||
|
snowContainer.appendChild(snowflake);
|
||||||
|
}
|
|
@ -0,0 +1,349 @@
|
||||||
|
/* General adjustments for body and container */
|
||||||
|
body.bg-christmas {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background: url("./bg.png") no-repeat top center;
|
||||||
|
background-size: cover; /* Ensures it covers the screen proportionally */
|
||||||
|
background-attachment: fixed; /* Keeps the background fixed during scrolling */
|
||||||
|
height: 100vh; /* Ensures it occupies the full height of the viewport */
|
||||||
|
overflow-x: hidden; /* Prevents horizontal scrolling */
|
||||||
|
}
|
||||||
|
|
||||||
|
button:disabled {
|
||||||
|
opacity: 0.6;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 99%; /* Increase container width */
|
||||||
|
margin: 10px auto;
|
||||||
|
background: rgba(255, 255, 255, 0.1);
|
||||||
|
border-radius: 15px;
|
||||||
|
padding: 20px;
|
||||||
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Styling for boxes */
|
||||||
|
#box-container {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
width: 120px; /* Adjust width for more compact layout */
|
||||||
|
height: 80px; /* Adjust height for more compact layout */
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
border: 2px solid #ddd;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
color: #333;
|
||||||
|
box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.1);
|
||||||
|
transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box:hover {
|
||||||
|
transform: scale(1.1);
|
||||||
|
box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Highlighted box */
|
||||||
|
.highlighted {
|
||||||
|
background-color: #ffd700;
|
||||||
|
color: #fff;
|
||||||
|
border: 2px solid #ff6347;
|
||||||
|
animation: pulse 1s infinite;
|
||||||
|
z-index: 101;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulse {
|
||||||
|
0%,
|
||||||
|
100% {
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Winner box */
|
||||||
|
.winner-display {
|
||||||
|
background-color: #28a745;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 3.5rem;
|
||||||
|
border: 3px solid #fff;
|
||||||
|
animation: winnerPulse 2s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes winnerPulse {
|
||||||
|
0%,
|
||||||
|
100% {
|
||||||
|
box-shadow: 0 0 15px rgba(40, 167, 69, 0.8);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
box-shadow: 0 0 30px rgba(40, 167, 69, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Responsive layout adjustments */
|
||||||
|
@media (min-width: 1200px) {
|
||||||
|
#box-container {
|
||||||
|
gap: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box {
|
||||||
|
width: 150px;
|
||||||
|
height: 90px;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.box {
|
||||||
|
width: 100px;
|
||||||
|
height: 70px;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.box {
|
||||||
|
width: 80px;
|
||||||
|
height: 60px;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Logo styles */
|
||||||
|
.logo {
|
||||||
|
max-width: 230px;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Snowflakes animation */
|
||||||
|
#snow-container {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: 1;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.snowflake {
|
||||||
|
position: absolute;
|
||||||
|
background: white;
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
border-radius: 50%;
|
||||||
|
opacity: 0.8;
|
||||||
|
animation: snow 10s linear infinite;
|
||||||
|
}
|
||||||
|
@keyframes snow {
|
||||||
|
0% {
|
||||||
|
transform: translateY(-100px);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateY(110vh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Logo Santa hat */
|
||||||
|
.logo-container {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.santa-hat {
|
||||||
|
position: absolute;
|
||||||
|
top: -45px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%) rotate(0deg);
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
background: red;
|
||||||
|
border-radius: 50%;
|
||||||
|
border-bottom: 10px solid white;
|
||||||
|
animation: hatDrop 2s ease-out infinite alternate;
|
||||||
|
}
|
||||||
|
.santa-hat:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -15px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
width: 15px;
|
||||||
|
height: 15px;
|
||||||
|
background: white;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
@keyframes hatDrop {
|
||||||
|
0% {
|
||||||
|
transform: translateX(-50%) rotate(-20deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateX(-50%) rotate(20deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Glowing button */
|
||||||
|
/* Glowing Button with White Border */
|
||||||
|
button.glowing {
|
||||||
|
border: 1px solid white; /* Adds a white border */
|
||||||
|
box-shadow: 0 0 15px rgba(255, 0, 0, 0.7), 0 0 25px rgba(255, 0, 0, 0.5); /* Red glow */
|
||||||
|
animation: glowingEffect 2s infinite;
|
||||||
|
transition: box-shadow 0.3s ease-in-out, transform 0.3s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Glowing animation */
|
||||||
|
@keyframes glowingEffect {
|
||||||
|
0% {
|
||||||
|
box-shadow: 0 0 10px rgba(255, 0, 0, 0.7), 0 0 20px rgba(255, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
box-shadow: 0 0 20px rgba(255, 255, 255, 1), 0 0 40px rgba(255, 0, 0, 0.8);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
box-shadow: 0 0 10px rgba(255, 0, 0, 0.7), 0 0 20px rgba(255, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hover Effect for Interaction */
|
||||||
|
button.glowing:hover {
|
||||||
|
transform: scale(1.1); /* Slight enlargement */
|
||||||
|
box-shadow: 0 0 30px rgba(255, 255, 255, 0.9), 0 0 50px rgba(255, 0, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fancy Heading Styles */
|
||||||
|
.fancy-heading {
|
||||||
|
font-family: "Merry Christmas", cursive; /* Festive font */
|
||||||
|
font-size: 4rem;
|
||||||
|
font-weight: bold;
|
||||||
|
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3), 0 0 10px rgba(255, 255, 255, 0.7);
|
||||||
|
position: relative;
|
||||||
|
padding: 20px 0;
|
||||||
|
animation: headingGlow 3s infinite ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Glow Animation for the Text */
|
||||||
|
@keyframes headingGlow {
|
||||||
|
0%,
|
||||||
|
100% {
|
||||||
|
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3),
|
||||||
|
0 0 10px rgba(255, 255, 255, 0.7);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3), 0 0 20px rgba(255, 255, 255, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Emoji Animations */
|
||||||
|
.christmas-tree {
|
||||||
|
animation: bounceTree 2s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.santa {
|
||||||
|
animation: dropHat 2s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bounce Animation for the Tree */
|
||||||
|
@keyframes bounceTree {
|
||||||
|
0%,
|
||||||
|
100% {
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
transform: translateY(-10px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Drop Animation for Santa */
|
||||||
|
@keyframes dropHat {
|
||||||
|
0% {
|
||||||
|
transform: translateY(-10px);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateY(-10px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Light Bulbs Wrapper Styling */
|
||||||
|
.lights-wrapper {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Light Bulbs */
|
||||||
|
.lightbulb {
|
||||||
|
width: 15px;
|
||||||
|
height: 15px;
|
||||||
|
margin: 5px;
|
||||||
|
border-radius: 50%;
|
||||||
|
animation: blink 1.5s infinite ease-in-out;
|
||||||
|
box-shadow: 0 0 5px rgba(255, 255, 255, 0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
.lightbulb.red {
|
||||||
|
background-color: red;
|
||||||
|
animation-delay: 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lightbulb.green {
|
||||||
|
background-color: green;
|
||||||
|
animation-delay: 0.4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lightbulb.blue {
|
||||||
|
background-color: blue;
|
||||||
|
animation-delay: 0.6s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lightbulb.yellow {
|
||||||
|
background-color: yellow;
|
||||||
|
animation-delay: 0.8s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lightbulb.purple {
|
||||||
|
background-color: purple;
|
||||||
|
animation-delay: 1s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Blink Animation for the Light Bulbs */
|
||||||
|
@keyframes blink {
|
||||||
|
0%,
|
||||||
|
100% {
|
||||||
|
opacity: 0.6;
|
||||||
|
transform: scale(0.9);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.playing-image-paripapap {
|
||||||
|
position: absolute;
|
||||||
|
width: 40%;
|
||||||
|
top: 16%;
|
||||||
|
left: 31%;
|
||||||
|
z-index: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.playing-image-igiling {
|
||||||
|
position: absolute;
|
||||||
|
width: 17%;
|
||||||
|
top: 16%;
|
||||||
|
left: 40%;
|
||||||
|
z-index: 100;
|
||||||
|
}
|
Loading…
Reference in New Issue