I Dream Of Jeannie Archive.org 📢 ⏰

// build initial dataset with enriched thumb url let masterItems = JEANNIE_ARCHIVE_ITEMS.map(item => ({ ...item, thumbUrl: getThumbnailUrl(item), // lower case fields for search searchText: `${item.title} ${item.description} ${item.year} ${item.type}`.toLowerCase() }));

// optional: provide a simple check to see if any thumbnails missing, but we already handle. // also we display loading message for a moment then actual cards (instant because local dataset) // simulate a tiny micro-delay just for smoothness? not needed. but show initial load fine. function init() { // small timeout to show the "loading" replaced instantly setTimeout(() => { renderCards(); }, 50); } i dream of jeannie archive.org

body { background: linear-gradient(145deg, #1e2a32 0%, #0f1a1f 100%); font-family: 'Segoe UI', 'Inter', system-ui, -apple-system, 'Roboto', sans-serif; padding: 2rem 1.5rem; min-height: 100vh; color: #f0ede8; } // build initial dataset with enriched thumb url

function renderCards() { const filtered = filterItems(); resultCountSpan.innerText = `✨ ${filtered.length} magical item${filtered.length !== 1 ? 's' : ''} found from archive.org`; but show initial load fine

/* header with genie flair */ .jeannie-header { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: flex-end; gap: 1rem; margin-bottom: 2rem; border-bottom: 2px solid #ffcf7a; padding-bottom: 1.2rem; } .title-area h1 { font-size: 2.7rem; font-weight: 700; background: linear-gradient(135deg, #FFE6B0, #FFB347); background-clip: text; -webkit-background-clip: text; color: transparent; letter-spacing: -0.5px; display: inline-flex; align-items: center; gap: 12px; } .title-area h1::before { content: "🧞‍♀️"; font-size: 2.5rem; background: none; color: #f7c56e; } .sub { color: #cbd5e1; margin-top: 0.4rem; font-size: 1rem; border-left: 3px solid #f3b33d; padding-left: 0.8rem; } .archive-badge { background: #2c3e2f; padding: 0.5rem 1.2rem; border-radius: 60px; font-weight: 500; font-size: 0.85rem; backdrop-filter: blur(4px); background: rgba(0,0,0,0.5); border: 1px solid #ffcf7a60; } .archive-badge a { color: #ffdd99; text-decoration: none; font-weight: 500; } .archive-badge a:hover { text-decoration: underline; }

// event listeners searchInput.addEventListener("input", (e) => { currentSearch = e.target.value; renderCards(); });

<div class="search-panel"> <div class="search-wrapper"> <input type="text" id="searchInput" placeholder="🔍 Search episodes, descriptions, years... (e.g. 'Jeannie', 'S2', 'Blonde')" autocomplete="off"> </div> <div class="filter-group" id="filterGroup"> <button data-type="all" class="filter-btn active">✨ All</button> <button data-type="episode" class="filter-btn">📺 Episodes</button> <button data-type="promo" class="filter-btn">🎬 Promos / Clips</button> <button data-type="featurette" class="filter-btn">📽️ Featurette / Interview</button> </div> </div> <div class="stats"> <span id="resultCount">Loading archive treasures...</span> <span>🧞‍♂️ "Thank you, Jeannie!"</span> </div>