Files
store/backup.sune

1 line
6.1 KiB
JSON

[{"id":"id3jjb1","name":"Backup+","pinned":false,"avatar":"data:image/webp;base64,UklGRrYEAABXRUJQVlA4WAoAAAAgAAAAfwAAfwAASUNDUMgBAAAAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADZWUDggyAIAADASAJ0BKoAAgAA+bTaURyQjIiEqmGhggA2JZwWQg/8PRod2hv2sNppunMbg/I3EBwM3bJ54j5685X1Rv0v1mIFI0FIv2A1k4bVz8+024RmUM9e9KvmAs5u7vNASm9b7ArZtiijMF/45G0pv1VjXeKj7u8DuoabKAFtpoLYNhzSzR9BXfr6uK115/oO0d6lRh/kjCgF0K83e8ZAA/urUf4i6e8AxXlXTTIsbTTxZzSg9DhXXXb7C6onyw5YSKJ+0j+JiXeuAz3oCs2pyFoIdE38wwDnO0eXKiXdayyrwGP5IrjzVTy5qOITRP2kfmmK/Ed40CjkkbauGGhhp5drFHFzikUAFPV/Bu4sh2emgv+sFaSr+I3rGaX6bSmvXJaHom+XgNoo+Jj160YT6JwFvmsdD8QQiyqXkw9sCb9tfL28n86iGmSnEyGVe2jZLek7saaQBTYl+N6tmYyKZQYbfGAA+Qkd07YsSXcAoVrfQumlDNR0L+v8BuYV1p01R1S0cYJEV09W10Gqw3nl7mycwlSOOryICHUbqxCqezpKkGTHRz+xqD79keonaF5tm79bKLEhL47Asm2wZ3Vk/Qco6pQCBdB3nR7c1tGh9GaN5AHlNa0IqwGU7Sr8m5nZKvcbgAQNCBudSXgrgYMaEBAHU5R/dYIdiHOXxlF2+HxPV5qVq0V9ZC1qDYfGDQd24oi332fLvekWRo2rovK4P8Jgz6Yt21Dz3KFNFunVeFda7EXLnBv19bx0EK/ui03d6EhuH8Jzs+yV/ocxjwzIrv9pBuDgAB5sbg/7k4eyj6X2Q5volWiytPdo4lCMc/ifGcNRp22tYB7YARBZvNkS3c9XNjLWhQhhoQEf7+UHoYx25Q1hHLqtDohGPTkW5rWiKHfLWz+ndR+uD6/guLos8/QvWz9508lsQgMhp3lZ6lHsPRURSZRbBuOJAAAA=","url":"gh://sune-org/store/backup.sune","updatedAt":1757353908775,"settings":{"model":"openai/gpt-5-chat","temperature":"","top_p":"","top_k":"","frequency_penalty":"","repetition_penalty":"","min_p":"","top_a":"","verbosity":"","reasoning_effort":"default","system_prompt":"","html":"<!-- Sune: LocalStorage Backup v1.0.1 -->\n<div class=\"relative w-full max-w-lg mx-auto p-4 sm:p-6 my-4 bg-gray-50/80 backdrop-blur-sm border border-gray-200/80 rounded-2xl overflow-hidden shadow-sm\">\n <div class=\"absolute top-0 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[200px] h-[150px] sm:w-[300px] sm:h-[200px] bg-gradient-to-br from-cyan-200 to-purple-200 opacity-50 sm:opacity-40 blur-3xl rounded-full z-0\"></div>\n <div class=\"relative z-10\">\n <div class=\"flex justify-between items-baseline mb-2\">\n <h2 class=\"text-lg font-semibold text-gray-800\">LocalStorage Backup</h2>\n <span class=\"text-xs font-mono text-gray-400\">v1.0.1</span>\n </div>\n <p class=\"text-sm text-gray-600 mb-6\">Export all local storage data for this domain into a single JSON file. You can import this file later to restore the state. Be careful, importing will overwrite existing data.</p>\n <div class=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <button id=\"sune_ls_export\" class=\"flex w-full items-center justify-center gap-2 px-4 py-2.5 rounded-xl bg-black text-white hover:bg-black/90 active:scale-[.98] transition-all text-sm font-medium focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-black\">\n <i data-lucide=\"download\" class=\"h-4 w-4\"></i>\n Export Backup\n </button>\n <label for=\"sune_ls_import_input\" class=\"cursor-pointer flex w-full items-center justify-center gap-2 px-4 py-2.5 rounded-xl bg-white border border-gray-300 text-gray-800 hover:bg-gray-50 active:scale-[.98] transition-all text-sm font-medium focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400\">\n <i data-lucide=\"upload\" class=\"h-4 w-4\"></i>\n Import Backup\n </label>\n <input type=\"file\" id=\"sune_ls_import_input\" class=\"hidden\" accept=\"application/json,.json\">\n </div>\n <p id=\"sune_ls_feedback\" class=\"text-center text-xs text-gray-500 mt-4 h-4\"></p>\n </div>\n</div>\n<script>\n(d=>{\n const exportBtn=d.getElementById('sune_ls_export'),importInput=d.getElementById('sune_ls_import_input'),feedback=d.getElementById('sune_ls_feedback');\n const showFeedback=m=>{feedback.textContent=m;setTimeout(()=>feedback.textContent='',3000)};\n const ts=()=>{const date=new Date(),p=n=>String(n).padStart(2,'0');return `${date.getFullYear()}${p(date.getMonth()+1)}${p(date.getDate())}${p(date.getHours())}${p(date.getMinutes())}${p(date.getSeconds())}`};\n\n exportBtn.onclick=()=>{\n try {\n const backup={};\n for(let i=0;i<localStorage.length;i++){const k=localStorage.key(i);if(k)backup[k]=localStorage.getItem(k)}\n if(Object.keys(backup).length === 0) { showFeedback('Nothing to export.'); return }\n const blob=new Blob([JSON.stringify(backup,null,2)],{type:'application/json'}),url=URL.createObjectURL(blob),a=d.createElement('a');\n a.href=url;a.download=`sune_ls_backup_${ts()}.json`;a.click();URL.revokeObjectURL(url);\n showFeedback('Export successful!');\n } catch (e) { showFeedback('Export failed.'); console.error(e) }\n };\n\n importInput.onchange=e=>{\n const f=e.target.files[0];if(!f)return;\n if(!confirm('DANGER: This will clear your current local storage and replace it. Are you absolutely sure?')) { e.target.value=''; return }\n const reader=new FileReader();\n reader.onload=re=>{\n try{\n const data=JSON.parse(re.target.result);\n if(typeof data!=='object'||data===null||Array.isArray(data)){throw new Error('Invalid backup format.')}\n localStorage.clear();\n for(const key in data)if(Object.hasOwn(data,key))localStorage.setItem(key,data[key]);\n alert('Import successful! Page will now reload to apply changes.');\n location.reload();\n }catch(err){alert(`Import failed: ${err.message}`);console.error(err)}finally{e.target.value=''}\n };\n reader.onerror=()=>alert('Failed to read file.');\n reader.readAsText(f);\n };\n window.lucide&&window.lucide.createIcons();\n})(document);\n</script>\n","extension_html":"<sune src='https://raw.githubusercontent.com/sune-org/store/refs/heads/main/sync.sune' private />","hide_composer":true,"presence_penalty":"","max_tokens":""},"storage":{}}]