Update index.html
Browse files- index.html +27 -7
index.html
CHANGED
|
@@ -6,7 +6,7 @@
|
|
| 6 |
<title>Four-in-One Clock</title>
|
| 7 |
<link href="https://fonts.googleapis.com/css2?family=Figtree:wght@500;700&family=Orbitron:wght@500;700&display=swap" rel="stylesheet">
|
| 8 |
<style>
|
| 9 |
-
:root{--bg:#cfc7b8;--c1:#f3ede1;--c2:#ddd2bd;--brass:#a07c42;--face:#fdfcf8;--ink:#1f1b16;--panel:#f7f2e8;--line:#cdbfa6;--txt:#2a241c;--mute:#6f6556;--acc:#d23b2a;--lcdbg:#1a1206;--lcd:#ffb12e;--bz1:#f3dfae;--bz2:var(--brass);--bz3:#5e4620;--tone:#c0392b;--dim:#4a1511;box-sizing:border-box;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}
|
| 10 |
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--bg:#0f0d0b;--c1:#3a2e24;--c2:#1f1913;--brass:#c9a266;--face:#e9ede6;--ink:#1b2420;--panel:#241d17;--line:#4b3e31;--txt:#efe6d8;--mute:#a69a88;--acc:#ff5a3c}}
|
| 11 |
:root[data-theme="dark"]{--bg:#0f0d0b;--c1:#3a2e24;--c2:#1f1913;--brass:#c9a266;--face:#e9ede6;--ink:#1b2420;--panel:#241d17;--line:#4b3e31;--txt:#efe6d8;--mute:#a69a88;--acc:#ff5a3c}
|
| 12 |
*,*::before,*::after{box-sizing:inherit}
|
|
@@ -29,7 +29,7 @@ button:focus-visible,input:focus-visible{outline:2px solid var(--acc);outline-of
|
|
| 29 |
.row{display:flex;flex-wrap:nowrap;align-items:flex-end;gap:calc(12px*var(--ds,1));justify-content:center}
|
| 30 |
.seg7{position:relative;display:inline-block;font-weight:700;font-size:calc(3.2rem*var(--ds,1));line-height:1.1}
|
| 31 |
.seg7 i{font-style:normal;opacity:.09}
|
| 32 |
-
.seg7 b{position:absolute;left:0;top:0;font-weight:700;text-shadow:0 0
|
| 33 |
.seg7.sm{font-size:calc(1.6rem*var(--ds,1))}
|
| 34 |
.ind{display:flex;flex-direction:column;gap:4px;font-size:calc(.62rem*var(--ds,1));padding-bottom:6px}
|
| 35 |
.ind span{opacity:.15}.ind span.on{opacity:1}
|
|
@@ -60,13 +60,16 @@ body.tm .wrap{position:fixed;top:0;right:0;bottom:0;left:0;width:auto;max-width:
|
|
| 60 |
.tm .lcd{position:relative;background:none;box-shadow:none;padding:0;border-radius:0}
|
| 61 |
.tm .row{position:relative;display:block;text-align:center}
|
| 62 |
.tm .seg7 i{display:none}
|
| 63 |
-
.tm .seg7 b{position:static;text-shadow:0 3px 14px rgba(0,0,0,.75),0 0
|
| 64 |
[data-night] body.tm .seg7 b{text-shadow:none}
|
| 65 |
.tm .row .seg7.sm{position:absolute;left:100%;bottom:.1em;margin-left:.35em}
|
| 66 |
.tm .ind{position:absolute;left:100%;top:0;margin-left:.5em;padding:0}
|
| 67 |
.tm .lcdinfo{position:absolute;top:100%;left:50%;transform:translateX(-50%);white-space:nowrap;gap:2em;margin-top:.4em;text-shadow:0 2px 8px rgba(0,0,0,.7)}
|
| 68 |
.tm .tabs{position:fixed;left:50%;bottom:calc(12px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);margin:0;opacity:.3;pointer-events:auto}
|
| 69 |
.tm .tabs:hover,.tm .tabs:focus-within{opacity:1}
|
|
|
|
|
|
|
|
|
|
| 70 |
.wrap{z-index:2}
|
| 71 |
.ss .wrap{position:fixed;width:max-content;min-width:min(var(--ww,380px),calc(100vw - 24px));max-width:calc(100vw - 24px)}
|
| 72 |
.ss .an{width:calc(min(var(--ww,380px),calc(100vw - 24px)) - 30px);max-width:none}
|
|
@@ -182,6 +185,8 @@ input[type=text]{flex:1;min-width:120px}
|
|
| 182 |
<div class="f"><span>Second hand</span><div class="sg" data-k="smooth"><button data-v="true">Sweep</button><button data-v="false">Tick</button></div></div>
|
| 183 |
<div class="f"><span>Theme</span><div class="sg" data-k="theme"><button data-v="auto">π Auto</button><button data-v="dark">π Dark</button><button data-v="light">βοΈ Light</button></div></div>
|
| 184 |
<div class="f"><span>Show clocks</span><div class="sg" id="shows"><button data-t="a">π°οΈ Analog</button><button data-t="d">π‘ Digital</button><button data-t="b">π’ Binary</button></div></div>
|
|
|
|
|
|
|
| 185 |
<div class="f"><span>Clock only (transparent)</span><div class="sg" data-k="tm"><button data-v="true">On</button><button data-v="false">Off</button></div></div>
|
| 186 |
<div class="f"><span>Digital text size</span><div class="sg" data-k="ds"><button data-v="0.7">XS</button><button data-v="1">S</button><button data-v="1.6">M</button><button data-v="2.4">L</button><button data-v="3.4">XL</button><button data-v="5">XXL</button></div></div>
|
| 187 |
<div class="f"><span>Binary dots</span><div class="sg" data-k="dot"><button data-v="red">π΄</button><button data-v="green">π’</button><button data-v="moon">π</button><button data-v="heart">π</button></div></div>
|
|
@@ -197,6 +202,7 @@ input[type=text]{flex:1;min-width:120px}
|
|
| 197 |
<div class="grp">
|
| 198 |
<h3>πΌοΈ Slideshow</h3>
|
| 199 |
<div class="f"><span id="cnt">No pictures yet</span><span><button class="btn" id="bfd">π Folder</button> <button class="btn alt" id="bfi">β Pictures</button></span></div>
|
|
|
|
| 200 |
<input type="text" id="hf" placeholder="Hugging Face folder: user/space/photos" aria-label="Hugging Face folder or list file URL">
|
| 201 |
<input type="password" id="hft" placeholder="Access token (private repos only)" aria-label="Hugging Face access token">
|
| 202 |
<div class="f"><button class="btn" id="bhf">βοΈ Load whole folder</button></div>
|
|
@@ -245,7 +251,7 @@ input[type=text]{flex:1;min-width:120px}
|
|
| 245 |
|
| 246 |
<script>
|
| 247 |
const $=id=>document.getElementById(id);
|
| 248 |
-
const DEF={h24:false,secs:true,smooth:true,theme:'auto',dot:'red',sound:'bell',vol:.6,snooze:5,awake:false,hf:'',hft:'',tm:false,ds:1,urls:[],ss:true,interval:10,shuffle:true,fit:'cover',trans:'random',tdur:2,dim:.2,corner:'br',ws:380,night:false,nc:'red',nb:.6,show:{a:true,b:true,d:true},alarms:[{id:1,t:'07:00',label:'Wake up',on:false,days:[1,2,3,4,5]}]};
|
| 249 |
let S=JSON.parse(JSON.stringify(DEF));
|
| 250 |
try{const o=JSON.parse(localStorage.getItem('clock4')||'{}');Object.assign(S,o);S.show=Object.assign({},DEF.show,o.show)}catch(e){}
|
| 251 |
const save=()=>{try{localStorage.setItem('clock4',JSON.stringify(S))}catch(e){}};
|
|
@@ -313,7 +319,7 @@ document.querySelectorAll('.sg[data-k]').forEach(g=>g.querySelectorAll('button')
|
|
| 313 |
$('shows').querySelectorAll('button').forEach(b=>b.classList.toggle('on',S.show[b.dataset.t]));
|
| 314 |
$('pA').hidden=!S.show.a;$('pD').hidden=!S.show.d&&!S.tm;$('pB').hidden=!S.show.b;$('col').hidden=!S.show.d&&!S.show.b&&!S.tm;
|
| 315 |
$('psec').hidden=!S.secs;$('sh').style.display=S.secs?'':'none';cols.slice(4).forEach(c=>c.hidden=!S.secs);
|
| 316 |
-
$('an').classList.toggle('tick',!S.smooth);$('vol').value=S.vol;$('dim').value=S.dim;$('nb').value=S.nb;$('tsel').value=S.trans;$('sn').textContent='π€ Snooze '+S.snooze+' min';document.documentElement.style.setProperty('--ds',S.ds);ssSync()}
|
| 317 |
function apply(){save();sync();renderAlarms();dirty=true;logic();awake()}
|
| 318 |
document.querySelectorAll('.sg[data-k]').forEach(g=>g.onclick=e=>{const b=e.target.closest('button');if(!b)return;S[g.dataset.k]=parse(b.dataset.v);apply()});
|
| 319 |
$('shows').onclick=e=>{const b=e.target.closest('button');if(!b)return;S.show[b.dataset.t]=!S.show[b.dataset.t];apply()};
|
|
@@ -416,8 +422,8 @@ function ssSync(){const on=!!(S.ss&&files.length&&!S.night),b=document.body,r=do
|
|
| 416 |
b.classList.toggle('ss',on&&!S.tm);b.classList.toggle('tm',!!S.tm);['tl','tr','bl','br'].forEach(k=>b.classList.toggle('c-'+k,k===S.corner));b.style.setProperty('--ww',S.ws+'px');bg.hidden=!on;
|
| 417 |
r.toggleAttribute('data-night',S.night);r.style.setProperty('--tone',P[0]);r.style.setProperty('--dim',P[1]);r.style.setProperty('--nb',S.nb);
|
| 418 |
if(on&&!running){running=true;size();advance()}else if(!on&&running){running=false;clearTimeout(timer);cancelAnimationFrame(anim)}}
|
| 419 |
-
const load=e=>{
|
| 420 |
-
files=
|
| 421 |
cnt();S.ss=true;e.target.value='';apply()};
|
| 422 |
$('fdir').onchange=$('ffil').onchange=load;$('bfd').onclick=()=>$('fdir').click();$('bfi').onclick=()=>$('ffil').click();
|
| 423 |
$('bnext').onclick=()=>{if(!running)return;cancelAnimationFrame(anim);if(nxt){cur=nxt;nxt=null}advance()};
|
|
@@ -429,6 +435,13 @@ const setU=(u,k)=>{if(!k){S.hf='';$('hf').value=''}S.urls=u;files=[...u,...files
|
|
| 429 |
$('burl').onclick=()=>setU($('urls').value.split(/\n+/).map(s=>s.trim()).filter(Boolean).slice(0,500));
|
| 430 |
$('brnd').onclick=()=>setU(['picsum']);
|
| 431 |
$('bclr').onclick=()=>{$('urls').value='';setU([])};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 432 |
const hfTok=()=>S.hft?{Authorization:'Bearer '+S.hft}:{};
|
| 433 |
async function hfList(q){q=q.trim().replace(/^https?:\/\/huggingface\.co\//,'').replace(/^\/+|\/+$/g,'');
|
| 434 |
if(/^https?:\/\//i.test(q)){const t=await(await fetch(q)).text();return t.split(/\s*\n\s*/).filter(Boolean)}
|
|
@@ -441,6 +454,13 @@ $('bhf').onclick=hfGo;
|
|
| 441 |
const qp=new URLSearchParams(location.search).get('hf');if(qp){S.hf=qp;save()}
|
| 442 |
files=[...S.urls];$('urls').value=S.urls[0]==='picsum'||S.hf?'':S.urls.join('\n');$('hf').value=S.hf;$('hft').value=S.hft;cnt();
|
| 443 |
if(S.hf)hfList(S.hf).then(l=>l.length&&setU(l,1)).catch(()=>{});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 444 |
size();sync();renderAlarms();logic();frame();setInterval(logic,250);awake();
|
| 445 |
</script>
|
| 446 |
</body>
|
|
|
|
| 6 |
<title>Four-in-One Clock</title>
|
| 7 |
<link href="https://fonts.googleapis.com/css2?family=Figtree:wght@500;700&family=Orbitron:wght@500;700&display=swap" rel="stylesheet">
|
| 8 |
<style>
|
| 9 |
+
:root{--bg:#cfc7b8;--c1:#f3ede1;--c2:#ddd2bd;--brass:#a07c42;--face:#fdfcf8;--ink:#1f1b16;--panel:#f7f2e8;--line:#cdbfa6;--txt:#2a241c;--mute:#6f6556;--acc:#d23b2a;--lcdbg:#1a1206;--lcd:var(--tc,#ffb12e);--bz1:#f3dfae;--bz2:var(--brass);--bz3:#5e4620;--tone:#c0392b;--dim:#4a1511;box-sizing:border-box;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}
|
| 10 |
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--bg:#0f0d0b;--c1:#3a2e24;--c2:#1f1913;--brass:#c9a266;--face:#e9ede6;--ink:#1b2420;--panel:#241d17;--line:#4b3e31;--txt:#efe6d8;--mute:#a69a88;--acc:#ff5a3c}}
|
| 11 |
:root[data-theme="dark"]{--bg:#0f0d0b;--c1:#3a2e24;--c2:#1f1913;--brass:#c9a266;--face:#e9ede6;--ink:#1b2420;--panel:#241d17;--line:#4b3e31;--txt:#efe6d8;--mute:#a69a88;--acc:#ff5a3c}
|
| 12 |
*,*::before,*::after{box-sizing:inherit}
|
|
|
|
| 29 |
.row{display:flex;flex-wrap:nowrap;align-items:flex-end;gap:calc(12px*var(--ds,1));justify-content:center}
|
| 30 |
.seg7{position:relative;display:inline-block;font-weight:700;font-size:calc(3.2rem*var(--ds,1));line-height:1.1}
|
| 31 |
.seg7 i{font-style:normal;opacity:.09}
|
| 32 |
+
.seg7 b{position:absolute;left:0;top:0;font-weight:700;text-shadow:0 0 10px currentColor;white-space:nowrap}
|
| 33 |
.seg7.sm{font-size:calc(1.6rem*var(--ds,1))}
|
| 34 |
.ind{display:flex;flex-direction:column;gap:4px;font-size:calc(.62rem*var(--ds,1));padding-bottom:6px}
|
| 35 |
.ind span{opacity:.15}.ind span.on{opacity:1}
|
|
|
|
| 60 |
.tm .lcd{position:relative;background:none;box-shadow:none;padding:0;border-radius:0}
|
| 61 |
.tm .row{position:relative;display:block;text-align:center}
|
| 62 |
.tm .seg7 i{display:none}
|
| 63 |
+
.tm .seg7 b{position:static;text-shadow:0 3px 14px rgba(0,0,0,.75),0 0 10px currentColor}
|
| 64 |
[data-night] body.tm .seg7 b{text-shadow:none}
|
| 65 |
.tm .row .seg7.sm{position:absolute;left:100%;bottom:.1em;margin-left:.35em}
|
| 66 |
.tm .ind{position:absolute;left:100%;top:0;margin-left:.5em;padding:0}
|
| 67 |
.tm .lcdinfo{position:absolute;top:100%;left:50%;transform:translateX(-50%);white-space:nowrap;gap:2em;margin-top:.4em;text-shadow:0 2px 8px rgba(0,0,0,.7)}
|
| 68 |
.tm .tabs{position:fixed;left:50%;bottom:calc(12px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);margin:0;opacity:.3;pointer-events:auto}
|
| 69 |
.tm .tabs:hover,.tm .tabs:focus-within{opacity:1}
|
| 70 |
+
.tabs,#na{transition:opacity .6s}
|
| 71 |
+
body.idle .tabs,body.idle #na{opacity:0!important;pointer-events:none}
|
| 72 |
+
body.idle{cursor:none}
|
| 73 |
.wrap{z-index:2}
|
| 74 |
.ss .wrap{position:fixed;width:max-content;min-width:min(var(--ww,380px),calc(100vw - 24px));max-width:calc(100vw - 24px)}
|
| 75 |
.ss .an{width:calc(min(var(--ww,380px),calc(100vw - 24px)) - 30px);max-width:none}
|
|
|
|
| 185 |
<div class="f"><span>Second hand</span><div class="sg" data-k="smooth"><button data-v="true">Sweep</button><button data-v="false">Tick</button></div></div>
|
| 186 |
<div class="f"><span>Theme</span><div class="sg" data-k="theme"><button data-v="auto">π Auto</button><button data-v="dark">π Dark</button><button data-v="light">βοΈ Light</button></div></div>
|
| 187 |
<div class="f"><span>Show clocks</span><div class="sg" id="shows"><button data-t="a">π°οΈ Analog</button><button data-t="d">π‘ Digital</button><button data-t="b">π’ Binary</button></div></div>
|
| 188 |
+
<div class="f"><span>Text color (day)</span><div class="sg" data-k="tc"><button data-v="#ffb12e" aria-label="Amber">π </button><button data-v="#ffffff" aria-label="White">βͺ</button><button data-v="#6cc8ff" aria-label="Blue">π΅</button><button data-v="#6dff8f" aria-label="Green">π’</button><button data-v="#c79bff" aria-label="Violet">π£</button><button data-v="#ff5a4a" aria-label="Red">π΄</button><button data-v="#ffe14a" aria-label="Yellow">π‘</button></div></div>
|
| 189 |
+
<div class="f"><span>Auto-hide controls</span><div class="sg" data-k="idle"><button data-v="0">Off</button><button data-v="1">1 min</button><button data-v="5">5 min</button><button data-v="15">15 min</button></div></div>
|
| 190 |
<div class="f"><span>Clock only (transparent)</span><div class="sg" data-k="tm"><button data-v="true">On</button><button data-v="false">Off</button></div></div>
|
| 191 |
<div class="f"><span>Digital text size</span><div class="sg" data-k="ds"><button data-v="0.7">XS</button><button data-v="1">S</button><button data-v="1.6">M</button><button data-v="2.4">L</button><button data-v="3.4">XL</button><button data-v="5">XXL</button></div></div>
|
| 192 |
<div class="f"><span>Binary dots</span><div class="sg" data-k="dot"><button data-v="red">π΄</button><button data-v="green">π’</button><button data-v="moon">π</button><button data-v="heart">π</button></div></div>
|
|
|
|
| 202 |
<div class="grp">
|
| 203 |
<h3>πΌοΈ Slideshow</h3>
|
| 204 |
<div class="f"><span id="cnt">No pictures yet</span><span><button class="btn" id="bfd">π Folder</button> <button class="btn alt" id="bfi">β Pictures</button></span></div>
|
| 205 |
+
<div class="f"><span class="fine">Pictures you add are saved on this device.</span><button class="btn alt" id="bclp">ποΈ Clear saved</button></div>
|
| 206 |
<input type="text" id="hf" placeholder="Hugging Face folder: user/space/photos" aria-label="Hugging Face folder or list file URL">
|
| 207 |
<input type="password" id="hft" placeholder="Access token (private repos only)" aria-label="Hugging Face access token">
|
| 208 |
<div class="f"><button class="btn" id="bhf">βοΈ Load whole folder</button></div>
|
|
|
|
| 251 |
|
| 252 |
<script>
|
| 253 |
const $=id=>document.getElementById(id);
|
| 254 |
+
const DEF={h24:false,secs:true,smooth:true,theme:'auto',dot:'red',sound:'bell',vol:.6,snooze:5,awake:false,tc:'#ffb12e',idle:5,hf:'',hft:'',tm:false,ds:1,urls:[],ss:true,interval:10,shuffle:true,fit:'cover',trans:'random',tdur:2,dim:.2,corner:'br',ws:380,night:false,nc:'red',nb:.6,show:{a:true,b:true,d:true},alarms:[{id:1,t:'07:00',label:'Wake up',on:false,days:[1,2,3,4,5]}]};
|
| 255 |
let S=JSON.parse(JSON.stringify(DEF));
|
| 256 |
try{const o=JSON.parse(localStorage.getItem('clock4')||'{}');Object.assign(S,o);S.show=Object.assign({},DEF.show,o.show)}catch(e){}
|
| 257 |
const save=()=>{try{localStorage.setItem('clock4',JSON.stringify(S))}catch(e){}};
|
|
|
|
| 319 |
$('shows').querySelectorAll('button').forEach(b=>b.classList.toggle('on',S.show[b.dataset.t]));
|
| 320 |
$('pA').hidden=!S.show.a;$('pD').hidden=!S.show.d&&!S.tm;$('pB').hidden=!S.show.b;$('col').hidden=!S.show.d&&!S.show.b&&!S.tm;
|
| 321 |
$('psec').hidden=!S.secs;$('sh').style.display=S.secs?'':'none';cols.slice(4).forEach(c=>c.hidden=!S.secs);
|
| 322 |
+
$('an').classList.toggle('tick',!S.smooth);$('vol').value=S.vol;$('dim').value=S.dim;$('nb').value=S.nb;$('tsel').value=S.trans;$('sn').textContent='π€ Snooze '+S.snooze+' min';document.documentElement.style.setProperty('--ds',S.ds);document.documentElement.style.setProperty('--tc',S.tc);ssSync()}
|
| 323 |
function apply(){save();sync();renderAlarms();dirty=true;logic();awake()}
|
| 324 |
document.querySelectorAll('.sg[data-k]').forEach(g=>g.onclick=e=>{const b=e.target.closest('button');if(!b)return;S[g.dataset.k]=parse(b.dataset.v);apply()});
|
| 325 |
$('shows').onclick=e=>{const b=e.target.closest('button');if(!b)return;S.show[b.dataset.t]=!S.show[b.dataset.t];apply()};
|
|
|
|
| 422 |
b.classList.toggle('ss',on&&!S.tm);b.classList.toggle('tm',!!S.tm);['tl','tr','bl','br'].forEach(k=>b.classList.toggle('c-'+k,k===S.corner));b.style.setProperty('--ww',S.ws+'px');bg.hidden=!on;
|
| 423 |
r.toggleAttribute('data-night',S.night);r.style.setProperty('--tone',P[0]);r.style.setProperty('--dim',P[1]);r.style.setProperty('--nb',S.nb);
|
| 424 |
if(on&&!running){running=true;size();advance()}else if(!on&&running){running=false;clearTimeout(timer);cancelAnimationFrame(anim)}}
|
| 425 |
+
const load=async e=>{let fl=[...e.target.files].filter(f=>f.type.startsWith('image/')||/\.(jpe?g|png|webp|gif|avif|bmp)$/i.test(f.name));if(!fl.length)return;$('cnt').textContent='Savingβ¦';fl=await Promise.all(fl.map(shrink));fl.forEach(b=>idbPut(b).catch(()=>{}));
|
| 426 |
+
files=files.concat(fl);idx=-1;order=[];cur&&cur.close&&cur.close();cur=nxt=null;running=false;clearTimeout(timer);cancelAnimationFrame(anim);
|
| 427 |
cnt();S.ss=true;e.target.value='';apply()};
|
| 428 |
$('fdir').onchange=$('ffil').onchange=load;$('bfd').onclick=()=>$('fdir').click();$('bfi').onclick=()=>$('ffil').click();
|
| 429 |
$('bnext').onclick=()=>{if(!running)return;cancelAnimationFrame(anim);if(nxt){cur=nxt;nxt=null}advance()};
|
|
|
|
| 435 |
$('burl').onclick=()=>setU($('urls').value.split(/\n+/).map(s=>s.trim()).filter(Boolean).slice(0,500));
|
| 436 |
$('brnd').onclick=()=>setU(['picsum']);
|
| 437 |
$('bclr').onclick=()=>{$('urls').value='';setU([])};
|
| 438 |
+
let db;
|
| 439 |
+
const idb=()=>new Promise((ok,no)=>{if(db)return ok(db);const r=indexedDB.open('clock4',1);r.onupgradeneeded=()=>r.result.createObjectStore('pics',{autoIncrement:true});r.onsuccess=()=>ok(db=r.result);r.onerror=no});
|
| 440 |
+
const idbOp=(mode,f)=>idb().then(d=>new Promise((ok,no)=>{const t=d.transaction('pics',mode),r=f(t.objectStore('pics'));t.oncomplete=()=>ok(r.result);t.onerror=no}));
|
| 441 |
+
const idbPut=b=>idbOp('readwrite',s=>s.add(b)),idbAll=()=>idbOp('readonly',s=>s.getAll()),idbClear=()=>idbOp('readwrite',s=>s.clear());
|
| 442 |
+
async function shrink(f){try{const b=await createImageBitmap(f),m=Math.max(b.width,b.height);if(m<=2560){b.close&&b.close();return f}const k=2560/m,cv=document.createElement('canvas');cv.width=Math.round(b.width*k);cv.height=Math.round(b.height*k);cv.getContext('2d').drawImage(b,0,0,cv.width,cv.height);b.close&&b.close();return await new Promise(ok=>cv.toBlob(x=>ok(x||f),'image/jpeg',.9))}catch(e){return f}}
|
| 443 |
+
$('bclp').onclick=()=>{idbClear().catch(()=>{});files=files.filter(f=>typeof f==='string');idx=-1;order=[];cur&&cur.close&&cur.close();cur=nxt=null;running=false;clearTimeout(timer);cancelAnimationFrame(anim);cnt();apply()};
|
| 444 |
+
try{navigator.storage&&navigator.storage.persist&&navigator.storage.persist()}catch(e){}
|
| 445 |
const hfTok=()=>S.hft?{Authorization:'Bearer '+S.hft}:{};
|
| 446 |
async function hfList(q){q=q.trim().replace(/^https?:\/\/huggingface\.co\//,'').replace(/^\/+|\/+$/g,'');
|
| 447 |
if(/^https?:\/\//i.test(q)){const t=await(await fetch(q)).text();return t.split(/\s*\n\s*/).filter(Boolean)}
|
|
|
|
| 454 |
const qp=new URLSearchParams(location.search).get('hf');if(qp){S.hf=qp;save()}
|
| 455 |
files=[...S.urls];$('urls').value=S.urls[0]==='picsum'||S.hf?'':S.urls.join('\n');$('hf').value=S.hf;$('hft').value=S.hft;cnt();
|
| 456 |
if(S.hf)hfList(S.hf).then(l=>l.length&&setU(l,1)).catch(()=>{});
|
| 457 |
+
idbAll().then(a=>{if(!a.length)return;files=files.concat(a);idx=-1;order=[];cnt();apply()}).catch(()=>{});
|
| 458 |
+
let lastAct=Date.now(),idleOn=false,swallow=0;
|
| 459 |
+
const wake=()=>{lastAct=Date.now();if(idleOn){idleOn=false;document.body.classList.remove('idle')}};
|
| 460 |
+
['pointermove','pointerdown','touchstart','wheel'].forEach(ev=>addEventListener(ev,()=>{if(idleOn&&(ev==='pointerdown'||ev==='touchstart'))swallow=Date.now()+500;wake()},{passive:true,capture:true}));
|
| 461 |
+
addEventListener('keydown',e=>{if(idleOn){e.preventDefault();e.stopPropagation()}wake()},true);
|
| 462 |
+
addEventListener('click',e=>{if(Date.now()<swallow){e.preventDefault();e.stopPropagation()}},true);
|
| 463 |
+
setInterval(()=>{if(S.idle&&!idleOn&&!$('drawer').classList.contains('open')&&Date.now()-lastAct>S.idle*60000){idleOn=true;document.body.classList.add('idle')}},5000);
|
| 464 |
size();sync();renderAlarms();logic();frame();setInterval(logic,250);awake();
|
| 465 |
</script>
|
| 466 |
</body>
|