/* input area */ .input-group margin-bottom: 28px;
.section-title font-size: 0.85rem; text-transform: uppercase; font-weight: 700; letter-spacing: 1px; color: #7f8bb3; padding: 12px 16px 4px; display: flex; justify-content: space-between;
.info-panel background: #0f121c; border-radius: 28px; padding: 18px 22px; margin-bottom: 30px; border: 1px solid #2c3145; box-shadow: inset 0 1px 2px #00000020, 0 6px 12px -8px black;
.file-url color: #cbd5ff; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; simple run blocker download
.blocked-list li background: #131825; margin: 8px 12px; padding: 10px 16px; border-radius: 40px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-left: 4px solid #ff6b6b; font-size: 0.85rem; font-family: monospace; word-break: break-all;
a color: #8f9eff; text-decoration: none;
function escapeHtml(str) if (!str) return ''; return str.replace(/[&<>]/g, function(m) if (m === '&') return '&'; if (m === '<') return '<'; if (m === '>') return '>'; return m; ).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, function(c) return c; ); /* input area */
function addBlockedEntry(url, reason) blockedItems.unshift( // add to beginning for latest on top after render (but render reverses again? we render reversed, but unshift + reversed gives newer first) url: url, timestamp: new Date(), reason: reason ); // limit list to 30 items to avoid clutter if (blockedItems.length > 35) blockedItems.pop();
.url-input:focus border-color: #6c7eff; box-shadow: 0 0 0 3px #6c7eff30; background: #070a10;
// core run blocker: simulate blocking a "run/download" attempt if URL not whitelisted function attemptDownload(url, source = 'manual') if (!url maybe not, but we keep blocked list intact
.header background: #0b0e14; padding: 24px 28px 18px 28px; border-bottom: 1px solid #2d3345;
.download-note background: #1e2335; border-radius: 20px; padding: 12px 18px; margin-top: 24px; font-size: 0.75rem; color: #9aa2c2; display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
// Clear entire whitelist (reset) function clearWhitelist() const count = whitelist.size; whitelist.clear(); updateStatusMessage(`🧹 Cleared $count whitelisted URL(s). All downloads will be blocked now.`, "#ffbc7a"); // optional: add a system entry to blocked list? maybe not, but we keep blocked list intact if (count > 0) const notify = document.createElement('div'); renderBlockedList(); // just refresh display (blocked items remain)