Schedule posts to Bluesky with Cloudflare workers. skyscheduler.work
cf tool bsky-tool cloudflare bluesky schedule bsky service social-media cloudflare-workers
at main 7 lines 1.7 kB view raw
1/* 2 * Tabs 3 * Copyright 2019-2025 - Licensed under MIT 4 * Yohn https://github.com/Yohn/PicoCSS 5 * Modified by Socks https://github.com/SocksTheWolf/SkyScheduler/commit/1dd6ca5736a415971dfe8c9821bd4d0b67dcadc0 6 */ 7class PicoTabContainer{constructor(t,e){this.tabs=t,this.panels=e}}class PicoTabs{constructor(t){this.tabMap=new Map;let e=document.querySelectorAll(t);0!==e.length?e.forEach((e=>{const a=Array.from(e.querySelectorAll('[role="tab"]')),i=Array.from(e.querySelectorAll('[role="tabpanel"]')),s=a.filter((a=>a.closest(t)===e)),n=i.filter((a=>a.closest(t)===e));0!==s.length&&0!==n.length?this.init(e,s,n):console.warn("No root tabs or panels found in a tablist, skipping initialization.")})):console.warn(`No elements with ${t} found on the page.`)}init(t,e,a){t.hasAttribute("name")&&this.tabMap.set(t.getAttribute("name"),new PicoTabContainer(e,a)),e.forEach(((t,i)=>{t.addEventListener("click",(()=>this.activateTab(e,a,i))),t.addEventListener("keydown",(t=>this.handleKeyDown(t,e,a,i)))}))}activateTab(t,e,a){t.forEach(((t,a)=>{t.setAttribute("aria-selected","false"),t.setAttribute("tabindex","-1"),e[a].setAttribute("hidden","true")})),t[a].setAttribute("aria-selected","true"),t[a].setAttribute("tabindex","0"),e[a].removeAttribute("hidden"),t[a].focus()}switchTab(t,e){if(this.tabMap.has(t)){const a=this.tabMap.get(t);this.activateTab(a.tabs,a.panels,e)}}handleKeyDown(t,e,a,i){switch(t.key){case"ArrowLeft":t.preventDefault(),this.activateTab(e,a,(i-1+e.length)%e.length);break;case"ArrowRight":t.preventDefault(),this.activateTab(e,a,(i+1)%e.length);break;case"Home":t.preventDefault(),this.activateTab(e,a,0);break;case"End":t.preventDefault(),this.activateTab(e,a,e.length-1)}}}