Appsafe Club 〈Web POPULAR〉
<div id="appsContainer" class="apps-grid"> <!-- dynamic cards injected --> </div> <div class="footer-note"> AppSafe Club — independent safety ratings based on open-source intelligence, permission analysis & real user feedback. </div> </div>
function renderApps() let filtered = [...appsData]; // category filter if (currentFilterCategory !== "all") filtered = filtered.filter(app => app.category === currentFilterCategory); // search filter (name + desc) if (currentSearchTerm.trim() !== "") const term = currentSearchTerm.toLowerCase(); filtered = filtered.filter(app => app.name.toLowerCase().includes(term) // safety threshold if (currentSafetyThreshold > 0) filtered = filtered.filter(app => app.score >= currentSafetyThreshold); const container = document.getElementById("appsContainer"); if (filtered.length === 0) container.innerHTML = `<div style="grid-column:1/-1; text-align:center; padding:3rem; background:white; border-radius:32px;">🤔 No apps match your filters. Try adjusting safety threshold or search.</div>`; return; container.innerHTML = filtered.map(app => ).join(''); // attach event listeners to each "view report" button document.querySelectorAll('.review-btn').forEach(btn => btn.addEventListener('click', (e) => const appId = parseInt(btn.getAttribute('data-id')); const app = appsData.find(a => a.id === appId); if (app) openModal(app); ); );
function openModal(app) const modal = document.getElementById("appModal"); document.getElementById("modalAppName").innerText = app.name; document.getElementById("modalCategory").innerHTML = `<strong>Category:</strong> $app.category`; document.getElementById("modalScore").innerHTML = `$app.score/100 <span style="font-size:0.8rem;">(Safe Club index)</span>`; document.getElementById("modalPermissions").innerText = app.permissions; document.getElementById("modalTrackers").innerText = app.trackers; let privacyNote = app.privacy; if (app.score >= 90) privacyNote += " — Certified by AppSafe"; document.getElementById("modalPrivacy").innerText = privacyNote; let notesExtra = app.notes; if (app.score < 70) notesExtra += " ⚠️ Consider alternatives for sensitive data."; document.getElementById("modalNotes").innerText = notesExtra; modal.style.display = "flex"; // trust button interaction const trustBtn = document.getElementById("trustBtn"); const originalText = trustBtn.innerText; trustBtn.onclick = () => trustBtn.innerText = "✅ Trusted! +1 to safety reputation"; trustBtn.style.background = "#2c7a5e"; setTimeout(() => trustBtn.innerText = originalText; trustBtn.style.background = "#1e6f5c"; , 1800); // in a real app would send to backend ;
.search-box input:focus outline: none; border-color: #2c7a5e; box-shadow: 0 0 0 3px rgba(44,122,94,0.2); appsafe club
.logo span background: #ffcd3c; color: #1a4a5f; padding: 0.2rem 0.6rem; border-radius: 40px; font-size: 1rem; margin-left: 8px; vertical-align: middle;
.desc font-size: 0.85rem; color: #3e5a6b; margin: 0.5rem 0;
.cat-btn background: #eef3f6; border: none; padding: 0.5rem 1rem; border-radius: 40px; font-weight: 500; cursor: pointer; transition: 0.2s; color: #1e3b4a; <div id="appsContainer" class="apps-grid"> <
.modal-content background: white; max-width: 450px; width: 90%; border-radius: 32px; padding: 1.8rem; position: relative; animation: fadeUp 0.2s ease;
// optional: Add a little "join club" vibe to console (just fun) console.log("🛡️ AppSafe Club — helping you choose secure apps since 2025"); </script> </body> </html>
/* hero / intro */ .hero background: white; border-radius: 28px; padding: 2rem 2rem; margin-bottom: 2.5rem; box-shadow: 0 8px 20px rgba(0,0,0,0.02); border: 1px solid #e2edf2; +1 to safety reputation"; trustBtn
.safety-badge display: flex; gap: 0.5rem; margin: 0.7rem 0; flex-wrap: wrap;
.tagline font-size: 0.9rem; opacity: 0.85; margin-top: 4px;
.close-modal position: absolute; top: 1rem; right: 1.5rem; font-size: 1.5rem; cursor: pointer;
.badge-safe background: #dff0e8; color: #1e6f5c; padding: 0.2rem 0.8rem; border-radius: 30px; font-size: 0.8rem; font-weight: 600; display: inline-block;
.app-card:hover transform: translateY(-5px); box-shadow: 0 20px 25px -12px rgba(0,0,0,0.15);