mirror of
https://github.com/sune-org/store.git
synced 2026-01-13 16:17:58 +00:00
1 line
7.3 KiB
JSON
1 line
7.3 KiB
JSON
[{"id":"id3jjb1","name":"Backup+","pinned":false,"avatar":"data:image/webp;base64,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","url":"gh://sune-org/store/backup.sune","updatedAt":1757454400927,"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></sune>","hide_composer":true,"presence_penalty":"","max_tokens":""},"storage":{}}] |