(function() { // 1. Create Toolbar Container const wrapper = document.createElement('div'); wrapper.style.position = 'fixed'; wrapper.style.top = '20px'; wrapper.style.right = '20px'; wrapper.style.zIndex = '999999'; wrapper.style.padding = '12px'; wrapper.style.backgroundColor = '#2d3748'; wrapper.style.color = '#fff'; wrapper.style.borderRadius = '8px'; wrapper.style.boxShadow = '0 4px 6px rgba(0,0,0,0.3)'; wrapper.style.fontFamily = 'sans-serif'; wrapper.style.display = 'flex'; wrapper.style.flexDirection = 'column'; wrapper.style.gap = '8px'; wrapper.style.border = '1px solid #4a5568'; wrapper.style.cursor = 'move'; wrapper.className = 'storage-toolbar'; // Make it draggable let isDragging = false; let offsetX, offsetY; wrapper.addEventListener('mousedown', (e) => { isDragging = true; offsetX = e.clientX - wrapper.getBoundingClientRect().left; offsetY = e.clientY - wrapper.getBoundingClientRect().top; }); window.addEventListener('mousemove', (e) => { if (!isDragging) return; wrapper.style.left = (e.clientX - offsetX) + 'px'; wrapper.style.top = (e.clientY - offsetY) + 'px'; }); window.addEventListener('mouseup', () => isDragging = false); // 2. Helper Functions function downloadFile(content, filename) { const blob = new Blob([content], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.click(); URL.revokeObjectURL(url); } function getCookies() { const pairs = document.cookie.split(";"); const cookies = {}; for (let i = 0; i < pairs.length; i++) { const pair = pairs[i].split("="); if (pair[0].trim()) cookies[pair[0].trim()] = decodeURIComponent(pair[1] || ''); } return cookies; } function setCookie(name, value) { document.cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}; path=/; max-age=31536000; SameSite=Lax`; } // 3. Button Definitions const buttons = [ { text: '📥 Export Data', color: '#48bb78', action: () => { const data = { localStorage: { ...localStorage }, cookies: getCookies() }; downloadFile(JSON.stringify(data, null, 2), 'storage_export.json'); } }, { text: '📤 Import Data', color: '#4299e1', action: () => { const input = document.createElement('input'); input.type = 'file'; input.accept = 'application/json'; input.onchange = (e) => { const file = e.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = (evt) => { try { const data = JSON.parse(evt.target.result); if (data.localStorage) { localStorage.clear(); for (const [key, val] of Object.entries(data.localStorage)) { localStorage.setItem(key, val); } } if (data.cookies) { for (const [key, val] of Object.entries(data.cookies)) { setCookie(key, val); } } alert('Data imported successfully! Please refresh the page.'); } catch (err) { alert('Error parsing file. Please ensure it is valid JSON.'); } }; reader.readAsText(file); }; input.click(); } }, { text: '❌ Close', color: '#e53e3e', action: () => wrapper.remove() } ]; // 4. Render Toolbar buttons.forEach(btn => { const b = document.createElement('button'); b.innerText = btn.text; b.style.backgroundColor = btn.color; b.style.color = '#fff'; b.style.border = 'none'; b.style.padding = '8px'; b.style.borderRadius = '4px'; b.style.cursor = 'pointer'; b.style.fontWeight = 'bold'; b.onmouseover = () => b.style.opacity = '0.9'; b.onmouseout = () => b.style.opacity = '1'; b.onclick = btn.action; wrapper.appendChild(b); }); // 5. Append to DOM document.body.appendChild(wrapper); })();