booty
This commit is contained in:
parent
c99032044d
commit
5cb66c5012
34 changed files with 1236 additions and 132 deletions
19
assets/javascript/emoji-footprint.js
Normal file
19
assets/javascript/emoji-footprint.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
// Sparkle effect on mouse move
|
||||
document.addEventListener('mousemove', function (e) {
|
||||
const emojis = ['✨', '💖', '🌟', '💅', '🦄', '🎉', '🌈'];
|
||||
const sparkle = document.createElement('div');
|
||||
sparkle.className = 'emoji-footprint';
|
||||
sparkle.textContent = emojis[Math.floor(Math.random() * emojis.length)];
|
||||
sparkle.style.left = e.pageX + 'px';
|
||||
sparkle.style.top = e.pageY + 'px';
|
||||
document.body.appendChild(sparkle);
|
||||
|
||||
setTimeout(() => {
|
||||
sparkle.remove();
|
||||
}, 1000);
|
||||
});
|
||||
|
||||
export function initEmojiFootprint() {
|
||||
// The sparkle effect is already initialized when this module is imported
|
||||
// This function can be used if we need to control when the effect starts
|
||||
}
|
136
assets/javascript/modes.js
Normal file
136
assets/javascript/modes.js
Normal file
|
@ -0,0 +1,136 @@
|
|||
// Bonkers mode functionality
|
||||
function setEmojiLevelClass(mode) {
|
||||
document.body.classList.remove('emoji-normal', 'emoji-enhanced', 'emoji-bonkers');
|
||||
if (mode === 'bonkers') {
|
||||
document.body.classList.add('emoji-bonkers');
|
||||
} else if (mode === 'enhanced') {
|
||||
document.body.classList.add('emoji-enhanced');
|
||||
} else {
|
||||
document.body.classList.add('emoji-normal');
|
||||
}
|
||||
}
|
||||
|
||||
function initBonkersMode() {
|
||||
// Check if we're in bonkers mode
|
||||
const currentMode = document.documentElement.getAttribute('data-website-mode');
|
||||
setEmojiLevelClass(currentMode);
|
||||
|
||||
if (currentMode === 'bonkers') {
|
||||
// Apply bonkers mode immediately
|
||||
document.body.classList.add('bonkers-mode');
|
||||
|
||||
// Start the fabulous effects
|
||||
createExtraSparkles();
|
||||
createSlayEffects();
|
||||
|
||||
console.log('🌈✨ Bonkers mode activated! ✨🌈');
|
||||
} else {
|
||||
// Remove bonkers mode if it was active
|
||||
document.body.classList.remove('bonkers-mode');
|
||||
}
|
||||
}
|
||||
|
||||
// Function to create extra sparkles during bonkers mode
|
||||
function createExtraSparkles() {
|
||||
const currentMode = document.documentElement.getAttribute('data-website-mode');
|
||||
if (currentMode !== 'bonkers') return;
|
||||
|
||||
const extraEmojis = [
|
||||
'💃', '🕺',
|
||||
'🍑', '💦', '😏', '😈', '👅', '💋', '🥵', '😳', '🤤', '😍', '🥴',
|
||||
'💕', '💖', '💗', '💘', '💝', '💞', '💟', '💌', '💏', '💑',
|
||||
'🍆', '🥒', '🍌', '💦', '👀', '😉', '😌', '😍', '🥰', '😘',
|
||||
'😚', '😋', '😏', '😫', '😩', '🥺', '🥵', '🥴',
|
||||
'💖', '💗', '💕', '💞', '💓', '💗', '💖', '💘', '💝',
|
||||
'💋', '💏', '💑'
|
||||
];
|
||||
const sparkle = document.createElement('div');
|
||||
sparkle.className = 'emoji-footprint';
|
||||
sparkle.textContent = extraEmojis[Math.floor(Math.random() * extraEmojis.length)];
|
||||
sparkle.style.left = Math.random() * window.innerWidth + 'px';
|
||||
sparkle.style.top = Math.random() * window.innerHeight + 'px';
|
||||
document.body.appendChild(sparkle);
|
||||
|
||||
setTimeout(() => {
|
||||
if (sparkle.parentNode) {
|
||||
sparkle.remove();
|
||||
}
|
||||
}, 3000);
|
||||
|
||||
// Continue creating extra sparkles while in bonkers mode
|
||||
const newMode = document.documentElement.getAttribute('data-website-mode');
|
||||
if (newMode === 'bonkers') {
|
||||
setTimeout(() => createExtraSparkles(), 150);
|
||||
}
|
||||
}
|
||||
|
||||
// Function to create slay effects
|
||||
function createSlayEffects() {
|
||||
const currentMode = document.documentElement.getAttribute('data-website-mode');
|
||||
if (currentMode !== 'bonkers') return;
|
||||
|
||||
// Create floating "SLAY" text effects
|
||||
const slayWords = [
|
||||
'SLAY', 'QUEEN', 'FABULOUS', 'ICONIC', 'LEGENDARY', 'STUNNING', 'GORGEOUS', 'FLAWLESS',
|
||||
'DAZZLING', 'RADIANT', 'BREATHTAKING', 'EXQUISITE', 'DIVINE'
|
||||
];
|
||||
const slayElement = document.createElement('div');
|
||||
slayElement.className = 'slay-text';
|
||||
slayElement.textContent = slayWords[Math.floor(Math.random() * slayWords.length)];
|
||||
slayElement.style.left = Math.random() * window.innerWidth + 'px';
|
||||
slayElement.style.top = Math.random() * window.innerHeight + 'px';
|
||||
document.body.appendChild(slayElement);
|
||||
|
||||
setTimeout(() => {
|
||||
if (slayElement.parentNode) {
|
||||
slayElement.remove();
|
||||
}
|
||||
}, 3000);
|
||||
|
||||
// Continue creating slay effects while in bonkers mode
|
||||
const newMode = document.documentElement.getAttribute('data-website-mode');
|
||||
if (newMode === 'bonkers') {
|
||||
setTimeout(() => createSlayEffects(), 800);
|
||||
}
|
||||
}
|
||||
|
||||
// Watch for mode changes
|
||||
function watchModeChanges() {
|
||||
// Create a MutationObserver to watch for changes to the data-website-mode attribute
|
||||
const observer = new MutationObserver(function(mutations) {
|
||||
mutations.forEach(function(mutation) {
|
||||
if (mutation.type === 'attributes' && mutation.attributeName === 'data-website-mode') {
|
||||
const newMode = document.documentElement.getAttribute('data-website-mode');
|
||||
|
||||
if (newMode === 'bonkers') {
|
||||
document.body.classList.add('bonkers-mode');
|
||||
setEmojiLevelClass(newMode);
|
||||
|
||||
// Start the fabulous effects
|
||||
createExtraSparkles();
|
||||
createSlayEffects();
|
||||
|
||||
console.log('🌈✨ Switched to bonkers mode! ✨🌈');
|
||||
} else {
|
||||
document.body.classList.remove('bonkers-mode');
|
||||
setEmojiLevelClass(newMode);
|
||||
console.log(`😴 Switched to ${newMode} mode`);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Start observing
|
||||
observer.observe(document.documentElement, {
|
||||
attributes: true,
|
||||
attributeFilter: ['data-website-mode']
|
||||
});
|
||||
}
|
||||
|
||||
// Initialize when DOM is loaded
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
initBonkersMode();
|
||||
watchModeChanges();
|
||||
});
|
||||
|
||||
export { initBonkersMode, watchModeChanges };
|
55
assets/javascript/numberInputs.js
Normal file
55
assets/javascript/numberInputs.js
Normal file
|
@ -0,0 +1,55 @@
|
|||
// Function to initialize number input buttons
|
||||
function initNumberInputs(container = document) {
|
||||
container.querySelectorAll('.number-input-wrapper').forEach(function(wrapper) {
|
||||
const input = wrapper.querySelector('input[type="number"]');
|
||||
const decreaseBtn = wrapper.querySelector('[data-action="decrease"]');
|
||||
const increaseBtn = wrapper.querySelector('[data-action="increase"]');
|
||||
|
||||
if (!input || !decreaseBtn || !increaseBtn) return;
|
||||
|
||||
// Skip if already initialized
|
||||
if (decreaseBtn.hasAttribute('data-initialized')) return;
|
||||
|
||||
const step = parseFloat(input.getAttribute('step')) || 1;
|
||||
const min = 0;
|
||||
const max = input.getAttribute('max') ? parseFloat(input.getAttribute('max')) : null;
|
||||
|
||||
decreaseBtn.addEventListener('click', function() {
|
||||
const currentValue = parseFloat(input.value) || 0;
|
||||
const newValue = currentValue - step;
|
||||
|
||||
if (min === null || newValue >= min) {
|
||||
input.value = newValue;
|
||||
input.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
}
|
||||
});
|
||||
|
||||
increaseBtn.addEventListener('click', function() {
|
||||
const currentValue = parseFloat(input.value) || 0;
|
||||
const newValue = currentValue + step;
|
||||
|
||||
if (max === null || newValue <= max) {
|
||||
input.value = newValue;
|
||||
input.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
}
|
||||
});
|
||||
|
||||
// Validate input on change
|
||||
input.addEventListener('input', function() {
|
||||
const value = parseFloat(this.value);
|
||||
|
||||
if (min !== null && value < min) {
|
||||
this.value = min;
|
||||
}
|
||||
if (max !== null && value > max) {
|
||||
this.value = max;
|
||||
}
|
||||
});
|
||||
|
||||
// Mark as initialized
|
||||
decreaseBtn.setAttribute('data-initialized', 'true');
|
||||
increaseBtn.setAttribute('data-initialized', 'true');
|
||||
});
|
||||
}
|
||||
|
||||
export { initNumberInputs };
|
35
assets/javascript/radioState.js
Normal file
35
assets/javascript/radioState.js
Normal file
|
@ -0,0 +1,35 @@
|
|||
// Radio button state management with localStorage
|
||||
function initRadioState() {
|
||||
// Store and retrieve radio button state
|
||||
const radioButtons = document.querySelectorAll('input[name="mode"]');
|
||||
|
||||
// Load saved state on page load
|
||||
const savedMode = localStorage.getItem('selectedMode');
|
||||
if (savedMode) {
|
||||
const radioToCheck = document.getElementById(savedMode);
|
||||
if (radioToCheck) {
|
||||
radioToCheck.checked = true;
|
||||
// Set the data attribute to match the saved mode
|
||||
document.documentElement.setAttribute('data-website-mode', savedMode);
|
||||
}
|
||||
} else {
|
||||
// If no saved state, set to the currently checked radio button
|
||||
const checkedRadio = document.querySelector('input[name="mode"]:checked');
|
||||
if (checkedRadio) {
|
||||
document.documentElement.setAttribute('data-website-mode', checkedRadio.id);
|
||||
}
|
||||
}
|
||||
|
||||
// Save state when radio button changes
|
||||
radioButtons.forEach(radio => {
|
||||
radio.addEventListener('change', function() {
|
||||
if (this.checked) {
|
||||
localStorage.setItem('selectedMode', this.id);
|
||||
// Update the data attribute when mode changes
|
||||
document.documentElement.setAttribute('data-website-mode', this.id);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export { initRadioState };
|
18
assets/javascript/theme.js
Normal file
18
assets/javascript/theme.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
// Theme detection and switching
|
||||
const getPreferredTheme = () => {
|
||||
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
|
||||
}
|
||||
|
||||
const setTheme = theme => {
|
||||
document.documentElement.setAttribute('data-bs-theme', theme)
|
||||
}
|
||||
|
||||
// Set initial theme
|
||||
setTheme(getPreferredTheme())
|
||||
|
||||
// Listen for changes in user's preferred color scheme
|
||||
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
|
||||
setTheme(getPreferredTheme())
|
||||
})
|
||||
|
||||
export { getPreferredTheme, setTheme };
|
Loading…
Add table
Add a link
Reference in a new issue