TraderBea

Trader Bea’s Christmas Hive @import url(‘https://fonts.googleapis.com/css2?family=Cinzel:wght@400;700&family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Great+Vibes&display=swap’); :root { –gold-dark: #8a6e2f; –gold-mid: #b8860b; –gold-light: #fcf6ba; –gold-base: #d4af37; –green: #1a472a; –purple: #4a1c50; –off-white: #fdfbf7; –text-black: #1a1a1a; } body { /* Rich Royal Wall Background */ background-color: #1a0b1a; /* Very dark purple/black base */ background-image: radial-gradient(circle at 50% 50%, #2d1b2d 10%, transparent 10%), radial-gradient(circle at 0% 0%, #2d1b2d 10%, transparent 10%); background-size: 40px 40px; margin: 0; min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px; font-family: ‘Playfair Display’, serif; box-sizing: border-box; overflow-x: hidden; } /* — THE ORNATE GOLD FRAME — */ .frame-container { position: relative; width: 100%; max-width: 900px; /* Inner Content Background */ background: radial-gradient(circle at center, var(–green) 0%, var(–purple) 100%); /* The Gold Frame Construction */ border: 20px solid transparent; border-image: linear-gradient( 45deg, var(–gold-dark), var(–gold-light), var(–gold-base), var(–gold-light), var(–gold-dark) ) 1; /* Layered shadows for 3D Ridge Effect */ box-shadow: /* Inner inset shadow for depth */ inset 0 0 50px rgba(0,0,0,0.8), /* 1. Thin dark separator */ 0 0 0 2px #3d2b1f, /* 2. Main Gold Band (Outer) */ 0 0 0 15px var(–gold-base), /* 3. Shine on Gold Band */ 0 0 0 16px var(–gold-light), /* 4. Outer dark rim */ 0 0 0 18px #5c4013, /* 5. Drop shadow on wall */ 0 20px 50px rgba(0,0,0,0.8); padding: 2rem; text-align: center; color: var(–off-white); margin: 30px; } /* Decorative Corners (The Scrolly Shit) */ .corner-ornament { position: absolute; font-size: 4rem; color: var(–gold-base); /* Gradient Text Effect */ background: linear-gradient(to bottom, var(–gold-light), var(–gold-dark)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; filter: drop-shadow(2px 2px 2px rgba(0,0,0,0.5)); line-height: 0; z-index: 20; pointer-events: none; } .top-left { top: -15px; left: -15px; transform: rotate(-45deg); } .top-right { top: -15px; right: -15px; transform: rotate(45deg); } .bottom-left { bottom: -15px; left: -15px; transform: rotate(-135deg); } .bottom-right { bottom: -15px; right: -15px; transform: rotate(135deg); } @media (max-width: 600px) { .frame-container { border-width: 10px; box-shadow: inset 0 0 20px rgba(0,0,0,0.8), 0 0 0 1px #3d2b1f, 0 0 0 8px var(–gold-base), 0 0 0 9px var(–gold-light), 0 0 0 10px #5c4013, 0 10px 30px rgba(0,0,0,0.8); padding: 1rem; margin: 20px 10px; } .corner-ornament { font-size: 2.5rem; } .top-left { top: -10px; left: -10px; } .top-right { top: -10px; right: -10px; } .bottom-left { bottom: -10px; left: -10px; } .bottom-right { bottom: -10px; right: -10px; } } header { text-align: center; padding: 1rem; position: relative; margin-bottom: 2rem; border-bottom: 2px solid var(–gold-dark); } /* Ornate Divider */ header::after { content: “❦”; display: block; margin-top: 10px; font-size: 2rem; color: var(–gold-base); text-shadow: 0 2px 4px rgba(0,0,0,0.5); } h1 { font-family: ‘Cinzel’, serif; font-size: 3.5rem; margin: 0; background: linear-gradient(to bottom, var(–gold-light), var(–gold-base)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; filter: drop-shadow(2px 2px 0px rgba(0,0,0,0.8)); line-height: 1.1; cursor: pointer; /* Hint that it’s clickable for admin */ user-select: none; } .subtitle { font-family: ‘Great Vibes’, cursive; /* Scrolly font */ font-size: 2.2rem; color: var(–gold-light); margin-top: 0rem; text-shadow: 0 0 10px rgba(212, 175, 55, 0.5); } /* Countdown Display */ #status-bar { background: linear-gradient(90deg, transparent, rgba(0,0,0,0.6), transparent); color: var(–gold-light); padding: 0.5rem 2rem; margin-top: 1rem; font-family: ‘Cinzel’, serif; font-size: 0.9rem; display: inline-block; border-top: 1px solid var(–gold-dark); border-bottom: 1px solid var(–gold-dark); letter-spacing: 2px; text-transform: uppercase; } /* Hive Grid */ .hive-container { display: flex; justify-content: center; width: 100%; flex-wrap: wrap; margin-top: 1rem; } .hive-grid { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; } /* Hexagon Shape */ .hex-wrapper { width: 120px; height: 130px; margin: -15px 5px; position: relative; display: flex; justify-content: center; align-items: center; transition: transform 0.3s ease; filter: drop-shadow(0 5px 10px rgba(0,0,0,0.5)); } .hex-wrapper:nth-child(even) { margin-top: 45px; } @media (max-width: 600px) { .hex-wrapper { width: 80px; height: 90px; margin: -10px 2px; } .hex-wrapper:nth-child(even) { margin-top: 35px; } h1 { font-size: 2.2rem; } .subtitle { font-size: 1.8rem; } } .hex { width: 100%; height: 100%; clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%); background: linear-gradient(135deg, var(–gold-base), #8a6e2f); display: flex; justify-content: center; align-items: center; cursor: pointer; position: relative; transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); /* Gold Sheen */ box-shadow: inset 0 0 20px rgba(255,255,255,0.4); border: 2px solid rgba(255,255,255,0.1); } .hex:hover { transform: scale(1.05); z-index: 10; background: linear-gradient(135deg, var(–gold-light), var(–gold-base)); box-shadow: 0 0 15px var(–gold-light); } /* States */ .hex.opened { background: var(–green); cursor: default; transform: none; box-shadow: inset 0 0 20px rgba(0,0,0,0.5); border: none; } .hex.locked { background: linear-gradient(135deg, #4a4a4a, #2a2a2a); cursor: not-allowed; opacity: 0.9; } .hex.locked::after { content: ‘🔒’; position: absolute; bottom: 15px; font-size: 1rem; opacity: 0.3; filter: grayscale(100%); } .day-number { font-size: 2.5rem; font-family: ‘Cinzel’, serif; font-weight: 700; color: var(–off-white); text-shadow: 2px 2px 4px rgba(0,0,0,0.6); } .hex.locked .day-number { color: #888; text-shadow: none; } /* Revealed Content */ .treat { display: none; flex-direction: column; align-items: center; justify-content: center; text-align: center; width: 80%; height: 80%; animation: fadeIn 0.5s; } .hex.opened .day-number { display: none; } .hex.opened .treat { display: flex; } .treat-emoji { font-size: 2.2rem; margin-bottom: 2px; } .treat-text { font-size: 0.7rem; color: white; line-height: 1.1; font-weight: bold; opacity: 0.8; letter-spacing: 1px; } /* Hidden coupon code in grid */ .coupon-code { display: none; } /* Modal */ .modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: #fdfbf7; padding: 2.5rem; border-radius: 4px; box-shadow: 0 20px 50px rgba(0,0,0,0.8); z-index: 100; text-align: center; /* Gold border for modal too */ border: 4px solid var(–gold-base); outline: 2px solid var(–gold-dark); outline-offset: -8px; display: none; max-width: 90%; width: 400px; color: #333; } .modal.active { display: block; animation: popIn 0.3s; } .overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.8); z-index: 99; display: none; } .overlay.active { display: block; } .modal h3 { color: var(–green); margin-top: 0; font-family: ‘Cinzel’, serif; border-bottom: 1px solid var(–gold-base); padding-bottom: 10px;} .modal .timer { font-size: 1.5rem; font-family: monospace; color: var(–purple); margin: 1rem 0; font-weight: bold; } .btn-close { background: var(–green); color: white; border: 1px solid var(–gold-base); padding: 0.8rem 2rem; cursor: pointer; margin-top: 1rem; font-family: ‘Cinzel’, serif; text-transform: uppercase; letter-spacing: 1px; transition: 0.2s; font-size: 1rem; } .btn-close:hover { background: #153822; } /* Controls */ .controls { margin-top: 2rem; font-size: 0.8rem; color: var(–gold-base); text-align: center; border-top: 1px solid rgba(212, 175, 55, 0.3); padding-top: 1rem; width: 80%; margin-left: auto; margin-right: auto; } .controls button { background: transparent; border: 1px solid var(–gold-dark); color: var(–gold-base); padding: 5px 10px; margin: 0 5px; cursor: pointer; transition: all 0.2s; font-family: ‘Cinzel’, serif; } .controls button:hover { border-color: var(–gold-light); color: var(–gold-light); box-shadow: 0 0 10px rgba(212, 175, 55, 0.3); } /* HIDE TEST BUTTON BY DEFAULT */ #testModeBtn { display: none; } @keyframes fadeIn { from { opacity: 0; transform: scale(0.8); } to { opacity: 1; transform: scale(1); } } @keyframes popIn { from { transform: translate(-50%, -40%); opacity: 0; } to { transform: translate(-50%, -50%); opacity: 1; } } @keyframes shake { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-5px); } 75% { transform: translateX(5px); } } .shake { animation: shake 0.3s ease-in-out; }

Trader Bea

~ 12 days of Christmas ~
Starting December 13th

Opens automatically on scheduled dates

// — CONFIGURATION START — const TOTAL_DAYS = 12; // Start Date: Year, Month (0-11), Day const START_YEAR = 2025; const START_MONTH = 11; // December const START_DAY = 13; // Updated to start on Dec 13th (so Day 12 is Dec 24th) // EDIT PRIZES HERE let prizes = [ // 4 Coupons { type: “coupon”, text: “Save 5% on your purchase from @traderbea using the code 5PM20. Max $20 Savings Expires Christmas Day 11:59PM CDT”, code: “5PM20”, emoji: “🐝” }, { type: “coupon”, text: “Save 10% on your purchase from @traderbea using the code 10PM20. Max $20 Savings Expires Christmas Day 11:59PM CDT”, code: “10PM20”, emoji: “🍯” }, { type: “coupon”, text: “Save $5.00 on your purchases $20 and up from @traderbea using the code 5D20M. Savings Expire Christmas Day 11:59 CDT”, code: “5D20M”, emoji: “💵” }, { type: “coupon”, text: “$20.00 discount on orders over $100.00 using code 20D100M. Savings Expire Christmas Day 11:59 CDT”, code: “20D100M”, emoji: “🎁” }, // 3 Holiday Surprise Videos { type: “link”, text: “Holiday Surprise Video”, code: “WATCH”, emoji: “📺”, url: “https://youtu.be/zDP6J5l7b-o” }, { type: “link”, text: “Holiday Surprise Video”, code: “WATCH”, emoji: “📺”, url: “https://youtu.be/uMT08q8DuvI” }, { type: “link”, text: “Holiday Surprise Video”, code: “WATCH”, emoji: “📺”, url: “https://youtu.be/HwgAnUPigZs” }, // 5 Trader Bea Songs by One_Time { type: “link”, text: “Trader Bea Song by One_Time”, code: “LISTEN”, emoji: “🎵”, url: “https://youtube.com/shorts/qvIYgK0Wd0w?feature=share” }, { type: “link”, text: “Trader Bea Song by One_Time”, code: “LISTEN”, emoji: “🎵”, url: “https://youtube.com/shorts/ZPRP6EQ1-Ws?feature=share” }, { type: “link”, text: “Trader Bea Song by One_Time”, code: “LISTEN”, emoji: “🎵”, url: “https://youtu.be/yepiCcf3z6s” }, { type: “link”, text: “Trader Bea Song by One_Time”, code: “LISTEN”, emoji: “🎵”, url: “https://youtu.be/f3HDs9U8ODI” }, { type: “link”, text: “Trader Bea Song by One_Time”, code: “LISTEN”, emoji: “🎵”, url: “https://youtu.be/pPGTpzhIOFc” } ]; // — CONFIGURATION END — let testMode = false; // — SAFE STORAGE HANDLER (Prevents crashes if LocalStorage is blocked) — const safeStorage = { getItem: (key) => { try { return localStorage.getItem(key); } catch (e) { console.warn(“LocalStorage blocked. Using temporary memory.”); return null; } }, setItem: (key, val) => { try { localStorage.setItem(key, val); } catch (e) { // Fail silently } }, removeItem: (key) => { try { localStorage.removeItem(key); } catch (e) { // Fail silently } } }; // Load State – V12 (Hidden Button Update) let state = JSON.parse(safeStorage.getItem(‘traderBeaState_v12’)) || { openedDoors: [], prizeOrder: null }; if (!state.prizeOrder) { shuffleArray(prizes); state.prizeOrder = prizes; safeStorage.setItem(‘traderBeaState_v12’, JSON.stringify(state)); } console.log(“🎴 Current Prize Order for this session:”, state.prizeOrder); const grid = document.getElementById(‘calendar-grid’); const statusBar = document.getElementById(‘status-bar’); function saveState() { safeStorage.setItem(‘traderBeaState_v12’, JSON.stringify(state)); } function getUnlockDate(dayNum) { const date = new Date(START_YEAR, START_MONTH, START_DAY, 0, 0, 0); date.setDate(date.getDate() + (dayNum – 1)); return date; } function renderCalendar() { grid.innerHTML = ”; const now = new Date(); let nextUnlockDate = null; for (let dayNum = 1; dayNum = unlockDate); if (!isUnlocked && nextUnlockDate === null) { nextUnlockDate = unlockDate; } const hexWrapper = document.createElement(‘div’); hexWrapper.className = ‘hex-wrapper’; const hex = document.createElement(‘div’); let statusClass = ”; if (isOpened) statusClass = ‘opened’; else if (!isUnlocked) statusClass = ‘locked’; hex.className = `hex ${statusClass}`; hex.onclick = () => handleDoorClick(dayNum, hex, unlockDate, prize); // Content const daySpan = document.createElement(‘span’); daySpan.className = ‘day-number’; daySpan.innerText = dayNum; // Hidden Content (Simplified for Grid View) const treatDiv = document.createElement(‘div’); treatDiv.className = ‘treat’; treatDiv.innerHTML = `
${prize.emoji}
OPENED
`; hex.appendChild(daySpan); hex.appendChild(treatDiv); hexWrapper.appendChild(hex); grid.appendChild(hexWrapper); } updateStatusHeader(now, nextUnlockDate); } function updateStatusHeader(now, nextUnlockDate) { if (testMode) { statusBar.innerText = “TEST MODE: All Unlocked”; return; } const startDate = getUnlockDate(1); if (now < startDate) { // Dynamic date display statusBar.innerText = `Event Starts: ${startDate.toLocaleDateString()}`; } else if (nextUnlockDate) { const diff = nextUnlockDate – now; statusBar.innerHTML = `Next Day Unlocks: ${formatTime(diff)}`; } else { statusBar.innerText = “Merry Christmas! All days unlocked.”; } } function handleDoorClick(day, element, unlockDate, prize) { const now = new Date(); const isOpened = state.openedDoors.includes(day); // 1. If Locked (and not test mode) if (!isOpened && !testMode && now element.classList.remove(‘shake’), 500); const diff = unlockDate – now; showModal(“Patience, Honeybee!”, `Day ${day} unlocks on ${unlockDate.toLocaleDateString()} at 12:00 AM.`, diff); return; } // 2. Open logic (if not already opened) if (!isOpened) { openDoor(day, element); } // 3. SHOW THE LARGE REWARD CARD showPrizeModal(day, prize); } // Helper to get YouTube ID from URL (Updated to support Shorts) function getYoutubeId(url) { const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=|shorts\/)([^#&?]*).*/; const match = url.match(regExp); return (match && match[2].length === 11) ? match[2] : null; } function showPrizeModal(dayNum, prize) { const title = `Day ${dayNum} Reward!`; let actionContent = ”; // Check if it’s a link and specifically a valid URL if(prize.type === ‘link’ && prize.url && prize.url !== ‘#’) { // Try to get YouTube ID const videoId = getYoutubeId(prize.url); if (videoId) { // It is a YouTube video -> Show Thumbnail const thumbUrl = `https://img.youtube.com/vi/${videoId}/mqdefault.jpg`; actionContent = ` Video Thumbnail
Click to Watch
`; } else { // Not a YouTube link (or failed to parse) -> Show Button actionContent = `▶ OPEN LINK`; } } else { // It’s a coupon code actionContent = `
${prize.code}
`; } const content = `
${prize.emoji}

${prize.text}

${actionContent}
(Saved to Day ${dayNum})
`; showModal(title, content, null); } function openDoor(day, element) { state.openedDoors.push(day); saveState(); renderCalendar(); } function updateTimers() { const now = new Date(); const headerTimer = document.getElementById(‘header-timer’); if (headerTimer) { for (let i = 1; i <= TOTAL_DAYS; i++) { const d = getUnlockDate(i); if (now < d) { headerTimer.innerText = formatTime(d – now); break; } } } // Modal timer logic included… if(document.getElementById('modal-timer').style.display === 'block' && activeModalTargetDate) { const diff = activeModalTargetDate – now; if(diff <= 0) closeModal(); else document.getElementById('modal-timer').innerText = formatTime(diff); } } let activeModalTargetDate = null; function formatTime(ms) { if (ms 0) return `${days}d ${pad(hours)}:${pad(minutes)}:${pad(seconds)}`; return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`; } function pad(n) { return n 0; i–) { const j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; } } function showModal(title, msgHtml, timeRemainingMs) { document.getElementById(‘modal-title’).innerText = title; document.getElementById(‘modal-msg’).innerHTML = msgHtml; // Changed to innerHTML for custom content if (timeRemainingMs) { activeModalTargetDate = new Date(Date.now() + timeRemainingMs); document.getElementById(‘modal-timer’).innerText = formatTime(timeRemainingMs); document.getElementById(‘modal-timer’).style.display = ‘block’; } else { activeModalTargetDate = null; document.getElementById(‘modal-timer’).style.display = ‘none’; } document.getElementById(‘overlay’).classList.add(‘active’); document.getElementById(‘modal’).classList.add(‘active’); } function closeModal() { document.getElementById(‘overlay’).classList.remove(‘active’); document.getElementById(‘modal’).classList.remove(‘active’); activeModalTargetDate = null; } function resetCalendar() { if(confirm(“Reset progress? This will lock all days again and reshuffle prizes.”)) { safeStorage.removeItem(‘traderBeaState_v12’); testMode = false; document.getElementById(‘testModeBtn’).innerText = ‘Test Mode: OFF’; document.getElementById(‘testModeBtn’).style.display = ‘none’; // Re-hide button location.reload(); // Fallback state = { openedDoors: [], prizeOrder: null }; let freshPrizes = […prizes]; shuffleArray(freshPrizes); state.prizeOrder = freshPrizes; saveState(); renderCalendar(); } } function toggleTestMode() { testMode = !testMode; document.getElementById(‘testModeBtn’).innerText = `Test Mode: ${testMode ? ‘ON’ : ‘OFF’}`; renderCalendar(); } // — SECRET ADMIN TRIGGER — let tapCount = 0; let tapTimer = null; // Listen for clicks on the H1 Title document.querySelector(‘h1’).addEventListener(‘click’, () => { tapCount++; if(tapCount === 1) { // Start a 2 second timer to reset taps tapTimer = setTimeout(() => { tapCount = 0; }, 2000); } if(tapCount >= 5) { // 5 taps detected! document.getElementById(‘testModeBtn’).style.display = ‘inline-block’; alert(“Admin Mode Revealed: Test button is now visible below.”); tapCount = 0; clearTimeout(tapTimer); } }); // Also check URL for ?admin=true const urlParams = new URLSearchParams(window.location.search); if(urlParams.get(‘admin’) === ‘true’) { document.getElementById(‘testModeBtn’).style.display = ‘inline-block’; } renderCalendar();