From d6be4c0c624c56f3b6fd2f2fc829e2be308d7591 Mon Sep 17 00:00:00 2001 From: defaultkavy Date: Thu, 17 Oct 2024 11:43:21 +0800 Subject: [PATCH] v0.9.0 - change: document element scroll behavior smooth. - new: hotkey supported: - browser navigation back and forward. - post grid navigation. - post favorites. --- dist/assets/index-BMZsSbMp.js | 1 + dist/assets/index-ByWqsQtl.css | 1 + dist/assets/index-D689878Y.css | 1 - dist/assets/index-D8tVsP8g.js | 1 - dist/index.html | 4 ++-- index.scss | 2 +- package.json | 2 +- src/component/Drawer/$Drawer.ts | 3 ++- src/component/PostGrid/$PostGrid.ts | 28 +++++++++++++++++++++++++- src/component/PostGrid/_$PostGrid.scss | 9 +++++++++ src/component/PostTile/_$PostTile.scss | 7 ++++++- src/main.ts | 15 ++++++++++++-- src/route/post/$post_route.ts | 11 ++++++++++ 13 files changed, 74 insertions(+), 11 deletions(-) create mode 100644 dist/assets/index-BMZsSbMp.js create mode 100644 dist/assets/index-ByWqsQtl.css delete mode 100644 dist/assets/index-D689878Y.css delete mode 100644 dist/assets/index-D8tVsP8g.js diff --git a/dist/assets/index-BMZsSbMp.js b/dist/assets/index-BMZsSbMp.js new file mode 100644 index 0000000..07ef276 --- /dev/null +++ b/dist/assets/index-BMZsSbMp.js @@ -0,0 +1 @@ +var jt=Object.defineProperty;var xt=r=>{throw TypeError(r)};var Ut=(r,e,t)=>e in r?jt(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var h=(r,e,t)=>Ut(r,typeof e!="symbol"?e+"":e,t),Tt=(r,e,t)=>e.has(r)||xt("Cannot "+t);var L=(r,e,t)=>(Tt(r,e,"read from private field"),t?t.call(r):e.get(r)),et=(r,e,t)=>e.has(r)?xt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),st=(r,e,t,s)=>(Tt(r,e,"write to private field"),s?s.call(r,t):e.set(r,t),t);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const n of i)if(n.type==="childList")for(const o of n.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function t(i){const n={};return i.integrity&&(n.integrity=i.integrity),i.referrerPolicy&&(n.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?n.credentials="include":i.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function s(i){if(i.ep)return;i.ep=!0;const n=t(i);fetch(i.href,n)}})();class X{constructor(){h(this,"eventMap",new Map)}fire(e,...t){var s;return(s=this.eventMap.get(e))==null||s.forEach(i=>i(...t)),this}on(e,t){const s=this.eventMap.get(e)??this.eventMap.set(e,new Set).get(e);return s==null||s.add(t),this}off(e,t){var s;return(s=this.eventMap.get(e))==null||s.delete(t),this}once(e,t){const s=(...n)=>{var o;(o=this.eventMap.get(e))==null||o.delete(s),t(...n)},i=this.eventMap.get(e)??this.eventMap.set(e,new Set).get(e);return i==null||i.add(s),this}}class Mt{constructor(){h(this,"domEvents",{});h(this,"events",new X)}on(e,t,s){e=$.orArrayResolve(e);for(const i of e){this.domEvents[i]||(this.domEvents[i]=new Map);const n=o=>{t(o,this)};this.domEvents[i].set(t,n),this.events.on(i,t),this.dom.addEventListener(i,n,s)}return this}off(e,t,s){var n;const i=(n=this.domEvents[e])==null?void 0:n.get(t);return i&&this.dom.removeEventListener(e,i,s),this.events.off(e,t),this}once(e,t,s){const i=n=>{this.dom.removeEventListener(e,i,s),t(n,this)};return this.dom.addEventListener(e,i,s),this.events.once(e,t),this}trigger(e){this.dom.dispatchEvent(new Event(e))}}class q extends Mt{constructor(){super(...arguments);h(this,"__$property__",{hidden:!1,coordinate:void 0});h(this,"parent")}hide(t,s=!0){return _.fluent(this,arguments,()=>this.__$property__.hidden,()=>{var i;if(t!==void 0)return t instanceof M?(this.__$property__.hidden=t.value,t.use(this,"hide")):this.__$property__.hidden=t,s&&((i=this.parent)==null||i.children.render()),this})}remove(){var t;return(t=this.parent)==null||t.children.remove(this).render(),this}replace(t){var s;return(s=this.parent)==null||s.children.replace(this,t).render(),this}contains(t){return t?t instanceof q?this.dom.contains(t.dom):t instanceof EventTarget?this.dom.contains(_(t).dom):this.dom.contains(t):!1}coordinate(t){return _.fluent(this,arguments,()=>this.__$property__.coordinate,()=>_.set(this.__$property__,"coordinate",t))}self(t){return _.orArrayResolve(t).forEach(s=>s(this)),this}inDOM(){return document.contains(this.dom)}isElement(){return this instanceof F}get element(){return this instanceof F?this:null}get htmlElement(){return this instanceof B?this:null}}class F extends q{constructor(t,s){super();h(this,"dom");h(this,"static_classes",new Set);this.dom=this.createDom(t,s),this.dom.$=this,this.setOptions(s)}createDom(t,s){return s!=null&&s.dom?s.dom:t==="svg"?document.createElementNS("http://www.w3.org/2000/svg","svg"):document.createElement((s==null?void 0:s.tagname)??t)}setOptions(t){return this.id(t==null?void 0:t.id),t&&t.class&&this.class(...t.class),this}id(t){return $.fluent(this,arguments,()=>this.dom.id,()=>$.set(this.dom,"id",t))}class(...t){return $.fluent(this,arguments,()=>this.dom.classList,()=>{this.dom.classList.forEach(s=>this.static_classes.has(s)??this.dom.classList.remove(s)),this.dom.classList.add(...t.detype())})}addClass(...t){return $.fluent(this,arguments,()=>this,()=>{this.dom.classList.add(...t.detype())})}removeClass(...t){return $.fluent(this,arguments,()=>this,()=>{this.dom.classList.remove(...t.detype())})}staticClass(...t){return $.fluent(this,arguments,()=>this.static_classes,()=>{this.removeClass(...this.static_classes),this.static_classes.clear(),this.addStaticClass(...t)})}addStaticClass(...t){return $.fluent(this,arguments,()=>this,()=>{t.detype().forEach(s=>this.static_classes.add(s)),this.addClass(...t)})}removeStaticClass(...t){return $.fluent(this,arguments,()=>this,()=>{t.detype().forEach(s=>this.static_classes.delete(s)),this.removeClass(...t)})}css(t){return $.fluent(this,arguments,()=>this.dom.style,()=>{Object.assign(this.dom.style,t)})}attribute(t,s){return arguments.length?arguments.length===1?t===void 0?null:this.dom.getAttribute(t):arguments.length===2?t?(s===null?this.dom.removeAttribute(t):s!==void 0&&this.dom.setAttribute(t,`${s}`),this):this:this:null}tabIndex(t){return $.fluent(this,arguments,()=>this.dom.tabIndex,()=>$.set(this.dom,"tabIndex",t))}focus(t){return this.dom.focus(t),this}blur(){return this.dom.blur(),this}animate(t,s,i){const n=this.dom.animate(t,s);return i&&(n.onfinish=()=>i(n)),n}getAnimations(t){return this.dom.getAnimations(t)}get dataset(){return this.dom.dataset}domRect(t){const s=this.dom.getBoundingClientRect();if(!t)return s;const i=t instanceof F?t.dom.getBoundingClientRect():t;return{...s,top:s.top-i.top,left:s.left-i.left,right:s.right-i.left,bottom:s.bottom-i.top,x:s.x-i.x,y:s.y-i.y}}}class rt extends q{constructor(t){super();h(this,"dom");this.dom=t,this.dom.$=this}domRect(t){const s={bottom:innerHeight,height:innerHeight,left:0,right:innerWidth,top:0,width:innerWidth,x:0,y:0};if(!t)return s;const i=t instanceof F?t.dom.getBoundingClientRect():t;return{...s,top:s.top-i.top,left:s.left-i.left,right:s.right-i.left,bottom:s.bottom-i.top,x:s.x-i.x,y:s.y-i.y}}static from(t){return t.$ instanceof rt?t.$:new rt(t)}}const zt="modulepreload",Gt=function(r){return"/"+r},St={},Kt=function(e,t,s){let i=Promise.resolve();if(t&&t.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),a=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));i=Promise.allSettled(t.map(l=>{if(l=Gt(l),l in St)return;St[l]=!0;const u=l.endsWith(".css"),c=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${c}`))return;const d=document.createElement("link");if(d.rel=u?"stylesheet":zt,u||(d.as="script"),d.crossOrigin="",d.href=l,a&&d.setAttribute("nonce",a),document.head.appendChild(d),u)return new Promise((p,x)=>{d.addEventListener("load",p),d.addEventListener("error",()=>x(new Error(`Unable to preload CSS for ${l}`)))})}))}function n(o){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=o,window.dispatchEvent(a),!a.defaultPrevented)throw o}return i.then(o=>{for(const a of o||[])a.status==="rejected"&&n(a.reason);return e().catch(n)})};class Bt{constructor(e){h(this,"$container");h(this,"childList",new Set);this.$container=e}add(e,t=-1){if(t===-1||this.childList.size-1===t)this.childList.add(e);else{const s=[...this.childList];s.splice(t,0,e),this.childList.clear(),s.forEach(i=>this.childList.add(i))}e.parent=this.$container}remove(e){return this.childList.has(e)?(this.childList.delete(e),e.parent=void 0,this):this}removeAll(e=!0){this.childList.forEach(t=>this.remove(t)),e&&this.render()}replace(e,t){const s=this.array;return s.splice(s.indexOf(e),1,t),e.remove(),this.childList.clear(),s.forEach(i=>this.childList.add(i)),t.parent=this.$container,this}render(){const[e,t]=[this.array.map(i=>i.dom),Array.from(this.dom.childNodes)],s=[];for(;t.length||e.length;){const[i,n]=[t.at(0),e.at(0)];n?i?n!==i?(n.$.hide()||(this.dom.insertBefore(n,i),s.push(n)),e.shift()):(n.$.hide()&&this.dom.removeChild(n),e.shift(),t.shift()):(n.$.hide()||this.dom.append(n),e.shift()):(i&&!s.includes(i)&&i.remove(),t.shift())}}indexOf(e){return this.array.indexOf(e)}get array(){return[...this.childList.values()]}get dom(){return this.$container.dom}}class M{constructor(e,t){h(this,"_value");h(this,"attributes",new Map);h(this,"linkStates",new Set);h(this,"options",{});this.set(e),t&&(this.options=t)}set(e){this._value=e,e instanceof M&&e.linkStates.add(this),this.update(),this.linkStates.forEach(t=>t.update())}static toJSON(e){const t={};for(let[s,i]of Object.entries(e))i instanceof M?i=i.toJSON():i instanceof Object&&M.toJSON(i),Object.assign(t,{[s]:i});return t}update(){for(const[e,t]of this.attributes.entries())for(const s of t)e[s]instanceof Function?this.options.format?e[s](this.options.format(this.value)):e[s](this.value):s in e&&(e[s]=this.value)}use(e,t){const s=this.attributes.get(e);s?s.add(t):this.attributes.set(e,new Set().add(t))}convert(e){return new M(this,{format:e})}get value(){return this._value instanceof M?this._value.value:this._value}toString(){return this.options.format?this.options.format(this.value):this.value instanceof Object?JSON.stringify(this.toJSON()):`${this.value}`}toJSON(){return this.value instanceof M?this.value.toJSON():this.value instanceof Object?M.toJSON(this.value):this.toString()}}class Q extends q{constructor(t){super();h(this,"dom");this.dom=new Text(t),this.dom.$=this}content(t){return $.fluent(this,arguments,()=>this.dom.textContent,()=>$.set(this.dom,"textContent",t))}}class B extends F{constructor(e,t){super(e,t)}autocapitalize(e){return $.fluent(this,arguments,()=>this.dom.autocapitalize,()=>$.set(this.dom,"autocapitalize",e))}innerText(e){return $.fluent(this,arguments,()=>this.dom.innerText,()=>$.set(this.dom,"innerText",e))}title(e){return $.fluent(this,arguments,()=>this.dom.title,()=>$.set(this.dom,"title",e))}dir(e){return $.fluent(this,arguments,()=>this.dom.dir,()=>$.set(this.dom,"dir",e))}translate(e){return $.fluent(this,arguments,()=>this.dom.translate,()=>$.set(this.dom,"translate",e))}popover(e){return $.fluent(this,arguments,()=>this.dom.popover,()=>$.set(this.dom,"popover",e))}spellcheck(e){return $.fluent(this,arguments,()=>this.dom.spellcheck,()=>$.set(this.dom,"spellcheck",e))}inert(e){return $.fluent(this,arguments,()=>this.dom.inert,()=>$.set(this.dom,"inert",e))}lang(e){return $.fluent(this,arguments,()=>this.dom.lang,()=>$.set(this.dom,"lang",e))}draggable(e){return $.fluent(this,arguments,()=>this.dom.draggable,()=>$.set(this.dom,"draggable",e))}hidden(e){return $.fluent(this,arguments,()=>this.dom.hidden,()=>$.set(this.dom,"hidden",e))}click(){return this.dom.click(),this}attachInternals(){return this.dom.attachInternals()}hidePopover(){return this.dom.hidePopover(),this}showPopover(){return this.dom.showPopover(),this}togglePopover(){return this.dom.togglePopover(),this}get accessKeyLabel(){return this.dom.accessKeyLabel}get offsetHeight(){return this.dom.offsetHeight}get offsetLeft(){return this.dom.offsetLeft}get offsetParent(){return $(this.dom.offsetParent)}get offsetTop(){return this.dom.offsetTop}get offsetWidth(){return this.dom.offsetWidth}}class m extends B{constructor(t,s){super(t,s);h(this,"children",new Bt(this));h(this,"__position_cursor",0)}content(t){return $.fluent(this,arguments,()=>this,()=>{this.children.removeAll(!1),this.insert(t)})}insert(t,s=-1){return $.fluent(this,arguments,()=>this,async()=>{if(t instanceof Function){let i=t(this);i instanceof Promise?t=await i:t=i}else t instanceof Promise&&(t=await t);t=$.orArrayResolve(t),this.__position_cursor=s<0?this.children.array.length+s:s;for(const i of t)if(i!=null){if(i instanceof Array)this.insert(i,this.__position_cursor);else if(typeof i=="string")this.children.add(new Q(i),s);else if(i instanceof M){const n=new Q(i.toString());i.use(n,"content"),this.children.add(n,s)}else if(i instanceof Promise){const n=(await Kt(async()=>{const{$Async:a}=await Promise.resolve().then(()=>se);return{$Async:a}},void 0)).$Async,o=new n().await(i);this.children.add(o,s)}else this.children.add(i,s);this.__position_cursor+=1}this.children.render()})}clear(){return this.children.removeAll(),this}$(t){if(t.startsWith("::"))return Array.from(document.querySelectorAll(t.replace(/^::/,""))).map(s=>$(s));if(t.startsWith(":"))return $(document.querySelector(t.replace(/^:/,"")))}get scrollHeight(){return this.dom.scrollHeight}get scrollWidth(){return this.dom.scrollWidth}scrollTop(t){return $.fluent(this,arguments,()=>this.dom.scrollTop,()=>$.set(this.dom,"scrollTop",t))}scrollLeft(t){return $.fluent(this,arguments,()=>this.dom.scrollLeft,()=>$.set(this.dom,"scrollLeft",t))}}class Xt extends m{constructor(e){super("a",e),this.dom.addEventListener("click",t=>{$.anchorHandler&&this.href()&&(t.preventDefault(),$.anchorHandler(this,t))})}href(e){return $.fluent(this,arguments,()=>this.dom.href,()=>$.set(this.dom,"href",e))}target(e){return $.fluent(this,arguments,()=>this.dom.target??void 0,()=>{e&&(this.dom.target=e)})}}class qt extends F{constructor(e,t){super(e,t)}}var O;(r=>{function e(a,l,u,c){return l.length?(c(),a):u()}r.fluent=e;function t(a){return a instanceof Array?a:[a]}r.orArrayResolve=t;function s(a,l){return t(l).forEach(u=>{Object.getOwnPropertyNames(u.prototype).forEach(c=>{c!=="constructor"&&Object.defineProperty(a.prototype,c,Object.getOwnPropertyDescriptor(u.prototype,c)||Object.create(null))})}),a}r.mixin=s;function i(a,l,u){u!==void 0&&(a[l]=u)}r.set=i;function n(a){return new M(a)}r.state=n;function o(a){if(a.$)return a.$;if(a.nodeName.toLowerCase()==="body")return new m("body",{dom:a});if(a.nodeName.toLowerCase()==="head")return new m("head",{dom:a});if(a.nodeName.toLowerCase()==="#document")return rt.from(a);if(a instanceof HTMLElement){const l=$.TagNameElementMap[a.tagName.toLowerCase()],u=l?l===m?new l(a.tagName,{dom:a}):new l({dom:a}):new m(a.tagName,{dom:a});if(u instanceof m)for(const c of Array.from(u.dom.childNodes))u.children.add($(c));return u}else if(a instanceof Text){const l=new Q(a.textContent??"");return l.dom=a,l}else if(a instanceof SVGElement&&a.tagName.toLowerCase()==="svg")return new qt("svg",{dom:a});throw`$NODE.FROM: NOT SUPPORT TARGET ELEMENT TYPE (${a.nodeName})`}r.from=o})(O||(O={}));class D{static create(...e){const t=class{};return Object.getOwnPropertyNames(D.prototype).forEach(s=>{s!=="constructor"&&e.includes(s)&&Object.defineProperty(t.prototype,s,Object.getOwnPropertyDescriptor(D.prototype,s)||Object.create(null))}),t}disabled(e){return $.fluent(this,arguments,()=>this.dom.disabled,()=>$.set(this.dom,"disabled",e))}checkValidity(){return this.dom.checkValidity()}reportValidity(){return this.dom.reportValidity()}formAction(e){return $.fluent(this,arguments,()=>this.dom.formAction,()=>$.set(this.dom,"formAction",e))}formEnctype(e){return $.fluent(this,arguments,()=>this.dom.formEnctype,()=>$.set(this.dom,"formEnctype",e))}formMethod(e){return $.fluent(this,arguments,()=>this.dom.formMethod,()=>$.set(this.dom,"formMethod",e))}formNoValidate(e){return $.fluent(this,arguments,()=>this.dom.formNoValidate,()=>$.set(this.dom,"formNoValidate",e))}formTarget(e){return $.fluent(this,arguments,()=>this.dom.formTarget,()=>$.set(this.dom,"formTarget",e))}autocomplete(e){return $.fluent(this,arguments,()=>this.dom.autocomplete,()=>$.set(this.dom,"autocomplete",e))}name(e){return $.fluent(this,arguments,()=>this.dom.name,()=>$.set(this.dom,"name",e))}maxLength(e){return $.fluent(this,arguments,()=>this.dom.maxLength,()=>$.set(this.dom,"maxLength",e))}minLength(e){return $.fluent(this,arguments,()=>this.dom.minLength,()=>$.set(this.dom,"minLength",e))}required(e){return $.fluent(this,arguments,()=>this.dom.required,()=>$.set(this.dom,"required",e))}label(e){return $.fluent(this,arguments,()=>this.dom.label,()=>$.set(this.dom,"label",e))}get form(){return this.dom.form?$(this.dom.form):null}get validationMessage(){return this.dom.validationMessage}get validity(){return this.dom.validity}get willValidate(){return this.dom.willValidate}}class wt extends m{constructor(e){super("button",e)}type(e){return $.fluent(this,arguments,()=>this.dom.type,()=>$.set(this.dom,"type",e))}}O.mixin(wt,D.create("disabled","checkValidity","formAction","formEnctype","formMethod","formNoValidate","formTarget","reportValidity"));class Et extends m{constructor(e){super("form",e)}action(e){return $.fluent(this,arguments,()=>this.dom.formAction,()=>$.set(this.dom,"formAction",e))}enctype(e){return $.fluent(this,arguments,()=>this.dom.formEnctype,()=>$.set(this.dom,"formEnctype",e))}method(e){return $.fluent(this,arguments,()=>this.dom.formMethod,()=>$.set(this.dom,"formMethod",e))}noValidate(e){return $.fluent(this,arguments,()=>this.dom.formNoValidate,()=>$.set(this.dom,"formNoValidate",e))}acceptCharset(e){return $.fluent(this,arguments,()=>this.dom.acceptCharset,()=>$.set(this.dom,"acceptCharset",e))}target(e){return $.fluent(this,arguments,()=>this.dom.formTarget,()=>$.set(this.dom,"formTarget",e))}requestSubmit(){return this.dom.requestSubmit(),this}reset(){return this.dom.reset(),this}submit(){return this.dom.submit(),this}get length(){return this.dom.length}get elements(){return Array.from(this.dom.elements).map(e=>$(e))}}O.mixin(Et,D.create("checkValidity","reportValidity","autocomplete"));class P extends B{constructor(e){super("input",e)}value(e){return $.fluent(this,arguments,()=>this.type()==="number"?Number(this.dom.value):this.dom.value,()=>$.set(this.dom,"value",e,t=>{this.on("input",()=>{t.attributes.has(this.dom)!==!1&&(typeof t.value=="string"&&t.set(`${this.value()}`),typeof t.value=="number"&&t.set(Number(this.value())))})}))}type(e){return $.fluent(this,arguments,()=>this.dom.type,()=>$.set(this.dom,"type",e))}capture(e){return $.fluent(this,arguments,()=>this.dom.capture,()=>$.set(this.dom,"capture",e))}alt(e){return $.fluent(this,arguments,()=>this.dom.alt,()=>$.set(this.dom,"alt",e))}height(e){return $.fluent(this,arguments,()=>this.dom.height,()=>$.set(this.dom,"height",e))}width(e){return $.fluent(this,arguments,()=>this.dom.width,()=>$.set(this.dom,"width",e))}defaultValue(e){return $.fluent(this,arguments,()=>this.dom.defaultValue,()=>$.set(this.dom,"defaultValue",e))}dirName(e){return $.fluent(this,arguments,()=>this.dom.dirName,()=>$.set(this.dom,"dirName",e))}pattern(e){return $.fluent(this,arguments,()=>this.dom.pattern,()=>$.set(this.dom,"pattern",e))}placeholder(e){return $.fluent(this,arguments,()=>this.dom.placeholder,()=>$.set(this.dom,"placeholder",e))}readOnly(e){return $.fluent(this,arguments,()=>this.dom.readOnly,()=>$.set(this.dom,"readOnly",e))}selectionDirection(e){return $.fluent(this,arguments,()=>this.dom.selectionDirection,()=>$.set(this.dom,"selectionDirection",e))}selectionEnd(e){return $.fluent(this,arguments,()=>this.dom.selectionEnd,()=>$.set(this.dom,"selectionEnd",e))}selectionStart(e){return $.fluent(this,arguments,()=>this.dom.selectionStart,()=>$.set(this.dom,"selectionStart",e))}size(e){return $.fluent(this,arguments,()=>this.dom.size,()=>$.set(this.dom,"size",e))}src(e){return $.fluent(this,arguments,()=>this.dom.src,()=>$.set(this.dom,"src",e))}inputMode(e){return $.fluent(this,arguments,()=>this.dom.inputMode,()=>$.set(this.dom,"inputMode",e))}valueAsDate(e){return $.fluent(this,arguments,()=>this.dom.valueAsDate,()=>$.set(this.dom,"valueAsDate",e))}valueAsNumber(e){return $.fluent(this,arguments,()=>this.dom.valueAsNumber,()=>$.set(this.dom,"valueAsNumber",e))}webkitdirectory(e){return $.fluent(this,arguments,()=>this.dom.webkitdirectory,()=>$.set(this.dom,"webkitdirectory",e))}select(){return this.dom.select(),this}setCustomValidity(e){return this.dom.setCustomValidity(e),this}setRangeText(e,t,s,i){return typeof t=="number"&&typeof s=="number"&&this.dom.setRangeText(e,t,s,i),this.dom.setRangeText(e),this}setSelectionRange(e,t,s){return this.dom.setSelectionRange(e,t,s),this}showPicker(){return this.dom.showPicker(),this}get files(){return this.dom.files}get webkitEntries(){return this.dom.webkitEntries}get labels(){return Array.from(this.dom.labels??[]).map(e=>$(e))}}O.mixin(P,D.create("checkValidity","reportValidity","autocomplete","name","form","required","validationMessage","validity","willValidate","formAction","formEnctype","formMethod","formNoValidate","formTarget"));class Qt extends P{constructor(e){super(e),this.type("number")}static from(e){return $.mixin(P,this)}stepDown(){return this.dom.stepDown(),this}stepUp(){return this.dom.stepUp(),this}max(e){return $.fluent(this,arguments,()=>this.dom.max===""?null:parseInt(this.dom.min),()=>$.set(this.dom,"max",e==null?void 0:e.toString()))}min(e){return $.fluent(this,arguments,()=>this.dom.min===""?null:parseInt(this.dom.min),()=>$.set(this.dom,"min",e==null?void 0:e.toString()))}step(e){return $.fluent(this,arguments,()=>Number(this.dom.step),()=>$.set(this.dom,"step",e==null?void 0:e.toString()))}}class Jt extends P{constructor(e){super(e),this.type("radio")}static from(e){return $.mixin(P,this)}checked(e){return $.fluent(this,arguments,()=>this.dom.checked,()=>$.set(this.dom,"checked",e))}defaultChecked(e){return $.fluent(this,arguments,()=>this.dom.defaultChecked,()=>$.set(this.dom,"defaultChecked",e))}}class Yt extends P{constructor(e){super(e),this.type("file")}static from(e){return $.mixin(P,this)}multiple(e){return $.fluent(this,arguments,()=>this.dom.multiple,()=>$.set(this.dom,"multiple",e))}accept(...e){return $.fluent(this,arguments,()=>this.dom.accept.split(","),()=>this.dom.accept=e.toString())}}O.mixin(P,[Qt,Jt,Yt]);class Lt extends m{constructor(e){super("label",e)}for(e){return $.fluent(this,arguments,()=>this.dom.htmlFor,()=>{$.set(this.dom,"htmlFor",e)})}get control(){return this.dom.control}}O.mixin(Lt,D.create("form"));class Zt extends B{constructor(e){super("img",e)}async load(e){return new Promise(t=>{const s=this.once("load",()=>{t(s)});typeof e=="string"?s.src(e):e.then(i=>s.src(i))})}static resize(e,t){return new Promise(s=>{const i=new Image;if(i.addEventListener("load",()=>{const n=document.createElement("canvas"),o=n.getContext("2d");if(!o)throw"$Image.resize: context undefined";const a=i.width/i.height,[l,u,c]=[a>1,a<1,a===1],d=t instanceof Array?t[0]:u?t:t*a,p=t instanceof Array?t[1]:l?t:t/a;n.height=p,n.width=d,o.drawImage(i,0,0,d,p),s(n.toDataURL())},{once:!0}),e instanceof File){const n=new FileReader;n.addEventListener("load",()=>i.src=n.result),n.readAsDataURL(e)}else i.src=e})}alt(e){return $.fluent(this,arguments,()=>this.dom.alt,()=>$.set(this.dom,"alt",e))}crossOrigin(e){return $.fluent(this,arguments,()=>this.dom.crossOrigin,()=>$.set(this.dom,"crossOrigin",e))}decoding(e){return $.fluent(this,arguments,()=>this.dom.decoding,()=>$.set(this.dom,"decoding",e))}height(e){return $.fluent(this,arguments,()=>this.dom.height,()=>$.set(this.dom,"height",e))}isMap(e){return $.fluent(this,arguments,()=>this.dom.isMap,()=>$.set(this.dom,"isMap",e))}loading(e){return $.fluent(this,arguments,()=>this.dom.loading,()=>$.set(this.dom,"loading",e))}referrerPolicy(e){return $.fluent(this,arguments,()=>this.dom.referrerPolicy,()=>$.set(this.dom,"referrerPolicy",e))}sizes(e){return $.fluent(this,arguments,()=>this.dom.sizes,()=>$.set(this.dom,"sizes",e))}src(e){return $.fluent(this,arguments,()=>this.dom.src,()=>$.set(this.dom,"src",e))}srcset(e){return $.fluent(this,arguments,()=>this.dom.srcset,()=>$.set(this.dom,"srcset",e))}useMap(e){return $.fluent(this,arguments,()=>this.dom.useMap,()=>$.set(this.dom,"useMap",e))}width(e){return $.fluent(this,arguments,()=>this.dom.width,()=>$.set(this.dom,"width",e))}decode(){return this.dom.decode()}get complete(){return this.dom.complete}get currentSrc(){return this.dom.currentSrc}get naturalHeight(){return this.dom.naturalHeight}get naturalWidth(){return this.dom.naturalWidth}get x(){return this.dom.x}get y(){return this.dom.y}}class te extends m{constructor(e){super("canvas",e)}height(e){return $.fluent(this,arguments,()=>this.dom.height,()=>{$.set(this.dom,"height",e)})}width(e){return $.fluent(this,arguments,()=>this.dom.width,()=>{$.set(this.dom,"width",e)})}captureStream(e){return this.dom.captureStream(e)}getContext(e,t){return this.dom.getContext(e)}toBlob(e,t,s){return this.dom.toBlob(e,t,s),this}toDataURL(e,t){return this.dom.toDataURL(e,t)}transferControlToOffscreen(){return this.dom.transferControlToOffscreen()}}class ee extends m{constructor(e){super("dialog",e)}open(e){return $.fluent(this,arguments,()=>this.dom.open,()=>$.set(this.dom,"open",e))}returnValue(e){return $.fluent(this,arguments,()=>this.dom.returnValue,()=>$.set(this.dom,"returnValue",e))}close(){return this.dom.close(),this}show(){return this.dom.show(),this}showModal(){return this.dom.showModal(),this}}class At extends m{constructor(e){super("select")}add(e){return this.insert(e),this}item(e){return $(this.dom.item(e))}namedItem(e){return $(this.dom.namedItem(e))}multiple(e){return $.fluent(this,arguments,()=>this.dom.multiple,()=>$.set(this.dom,"multiple",e))}get length(){return this.dom.length}get size(){return this.dom.size}get options(){return Array.from(this.dom.options).map(e=>$(e))}get selectedIndex(){return this.dom.selectedIndex}get selectedOptions(){return Array.from(this.dom.selectedOptions).map(e=>$(e))}value(e){return $.fluent(this,arguments,()=>this.dom.value,()=>$.set(this.dom,"value",e,t=>{this.on("input",()=>{t.attributes.has(this.dom)!==!1&&(typeof t.value=="string"&&t.set(`${this.value()}`),typeof t.value=="number"&&t.set(Number(this.value())))})}))}get labels(){return Array.from(this.dom.labels??[]).map(e=>$(e))}}O.mixin(At,D.create("checkValidity","reportValidity","autocomplete","name","form","required","disabled","validationMessage","validity","willValidate"));class Pt extends m{constructor(e){super("option",e)}defaultSelected(e){return $.fluent(this,arguments,()=>this.dom.defaultSelected,()=>$.set(this.dom,"defaultSelected",e))}selected(e){return $.fluent(this,arguments,()=>this.dom.selected,()=>$.set(this.dom,"selected",e))}text(e){return $.fluent(this,arguments,()=>this.dom.text,()=>$.set(this.dom,"text",e))}value(e){return $.fluent(this,arguments,()=>this.dom.value,()=>$.set(this.dom,"value",e))}get form(){return this.dom.form?$(this.dom.form):null}get index(){return this.dom.index}}O.mixin(Pt,D.create("form","disabled","label"));class Ct extends m{constructor(e){super("optgroup",e)}disabled(e){return $.fluent(this,arguments,()=>this.dom.disabled,()=>$.set(this.dom,"disabled",e))}}O.mixin(Ct,D.create("disabled","label"));class Dt extends m{constructor(e){super("textarea",e)}cols(e){return $.fluent(this,arguments,()=>this.dom.cols,()=>$.set(this.dom,"cols",e))}wrap(e){return $.fluent(this,arguments,()=>this.dom.wrap,()=>$.set(this.dom,"wrap",e))}value(e){return $.fluent(this,arguments,()=>this.dom.value,()=>$.set(this.dom,"value",e))}defaultValue(e){return $.fluent(this,arguments,()=>this.dom.defaultValue,()=>$.set(this.dom,"defaultValue",e))}dirName(e){return $.fluent(this,arguments,()=>this.dom.dirName,()=>$.set(this.dom,"dirName",e))}placeholder(e){return $.fluent(this,arguments,()=>this.dom.placeholder,()=>$.set(this.dom,"placeholder",e))}readOnly(e){return $.fluent(this,arguments,()=>this.dom.readOnly,()=>$.set(this.dom,"readOnly",e))}selectionDirection(e){return $.fluent(this,arguments,()=>this.dom.selectionDirection,()=>$.set(this.dom,"selectionDirection",e))}selectionEnd(e){return $.fluent(this,arguments,()=>this.dom.selectionEnd,()=>$.set(this.dom,"selectionEnd",e))}selectionStart(e){return $.fluent(this,arguments,()=>this.dom.selectionStart,()=>$.set(this.dom,"selectionStart",e))}type(e){return $.fluent(this,arguments,()=>this.dom.type,()=>$.set(this.dom,"type",e))}inputMode(e){return $.fluent(this,arguments,()=>this.dom.inputMode,()=>$.set(this.dom,"inputMode",e))}select(){return this.dom.select(),this}setCustomValidity(e){return this.dom.setCustomValidity(e),this}setRangeText(e,t,s,i){return typeof t=="number"&&typeof s=="number"&&this.dom.setRangeText(e,t,s,i),this.dom.setRangeText(e),this}setSelectionRange(e,t,s){return this.dom.setSelectionRange(e,t,s),this}get labels(){return Array.from(this.dom.labels??[]).map(e=>$(e))}}O.mixin(Dt,D.create("checkValidity","reportValidity","autocomplete","name","form","required","disabled","minLength","maxLength","validationMessage","validity","willValidate"));var nt;class Rt extends m{constructor(t){super("async",t);et(this,nt,!1)}await(t){return t instanceof Function?t(this).then(s=>this._loaded(s)):t.then(s=>this._loaded(s)),this}_loaded(t){if(st(this,nt,!0),typeof t=="string")this.replace(new Q(t));else if(t instanceof M){const s=new Q(t.toString());t.use(s,"content"),this.replace(s)}else t==null?this.replace(new Q(String(t))):this.replace(t);this.dom.dispatchEvent(new Event("load"))}get loaded(){return L(this,nt)}}nt=new WeakMap;const se=Object.freeze(Object.defineProperty({__proto__:null,$Async:Rt},Symbol.toStringTag,{value:"Module"}));class ie extends B{constructor(e,t){super(e,t)}autoplay(e){return $.fluent(this,arguments,()=>this.dom.autoplay,()=>$.set(this.dom,"autoplay",e))}get buffered(){return this.dom.buffered}controls(e){return $.fluent(this,arguments,()=>this.dom.controls,()=>$.set(this.dom,"controls",e))}crossOrigin(e){return $.fluent(this,arguments,()=>this.dom.crossOrigin,()=>$.set(this.dom,"crossOrigin",e))}get currentSrc(){return this.dom.currentSrc}currentTime(e){return $.fluent(this,arguments,()=>this.dom.currentTime,()=>$.set(this.dom,"currentTime",e))}defaultMuted(e){return $.fluent(this,arguments,()=>this.dom.defaultMuted,()=>$.set(this.dom,"defaultMuted",e))}defaultPlaybackRate(e){return $.fluent(this,arguments,()=>this.dom.defaultPlaybackRate,()=>$.set(this.dom,"defaultPlaybackRate",e))}disableRemotePlayback(e){return $.fluent(this,arguments,()=>this.dom.disableRemotePlayback,()=>$.set(this.dom,"disableRemotePlayback",e))}get duration(){return this.dom.duration}get ended(){return this.dom.ended}get error(){return this.dom.error}loop(e){return $.fluent(this,arguments,()=>this.dom.loop,()=>$.set(this.dom,"loop",e))}mediaKeys(e){return $.fluent(this,arguments,()=>this.dom.mediaKeys,()=>$.set(this.dom,"setMediaKeys",[e]))}muted(e){return $.fluent(this,arguments,()=>this.dom.muted,()=>$.set(this.dom,"muted",e))}get networkState(){return this.dom.networkState}get paused(){return this.dom.paused}playbackRate(e){return $.fluent(this,arguments,()=>this.dom.playbackRate,()=>$.set(this.dom,"playbackRate",e))}get played(){return this.dom.played}preload(e){return $.fluent(this,arguments,()=>this.dom.preload,()=>$.set(this.dom,"preload",e))}preservesPitch(e){return $.fluent(this,arguments,()=>this.dom.preservesPitch,()=>$.set(this.dom,"preservesPitch",e))}get readyState(){return this.dom.readyState}get remote(){return this.dom.remote}get seekable(){return this.dom.seekable}get seeking(){return this.dom.seeking}sinkId(e){return $.fluent(this,arguments,()=>this.dom.sinkId,()=>$.set(this.dom,"setSinkId",[e]))}src(e){return $.fluent(this,arguments,()=>this.dom.src,()=>$.set(this.dom,"src",e))}srcObject(e){return $.fluent(this,arguments,()=>this.dom.srcObject,()=>$.set(this.dom,"srcObject",e))}get textTracks(){return this.dom.textTracks}volume(e){return $.fluent(this,arguments,()=>this.dom.volume,()=>$.set(this.dom,"volume",e))}addTextTrack(e,t,s){return this.dom.addTextTrack(e,t,s)}canPlayType(e){return this.dom.canPlayType(e)}fastSeek(e){return this.dom.fastSeek(e),this}load(){return this.dom.load(),this}pause(){return this.dom.pause(),this}async play(){return await this.dom.play(),this}get isPlaying(){return this.currentTime()>0&&!this.paused&&!this.ended&&this.readyState>2}}class re extends ie{constructor(e){super("video",e)}disablePictureInPicture(e){return $.fluent(this,arguments,()=>this.dom.disablePictureInPicture,()=>$.set(this.dom,"disablePictureInPicture",e))}height(e){return $.fluent(this,arguments,()=>this.dom.height,()=>$.set(this.dom,"height",e))}width(e){return $.fluent(this,arguments,()=>this.dom.width,()=>$.set(this.dom,"width",e))}playsInline(e){return $.fluent(this,arguments,()=>this.dom.playsInline,()=>$.set(this.dom,"playsInline",e))}poster(e){return $.fluent(this,arguments,()=>this.dom.poster,()=>$.set(this.dom,"poster",e))}get videoHeight(){return this.dom.videoHeight}get videoWidth(){return this.dom.videoWidth}cancelVideoFrameCallback(e){return this.dom.cancelVideoFrameCallback(e),this}getVideoPlaybackQuality(){return this.dom.getVideoPlaybackQuality()}requestPictureInPicture(){return this.dom.requestPictureInPicture()}requestVideoFrameCallback(e){return this.dom.requestVideoFrameCallback(e)}}const ut=class ut extends Mt{constructor(){super(...arguments);h(this,"dom",window)}};h(ut,"$",new ut);let mt=ut;class ne{constructor(e){h(this,"keyMap",new Map);h(this,"conditional");e.on("keydown",t=>{var s;this.conditional&&!this.conditional(t)||(s=this.keyMap.get(t.key))==null||s.keydown.forEach(i=>i(t))}),e.on("keyup",t=>{var s;this.conditional&&!this.conditional(t)||(s=this.keyMap.get(t.key))==null||s.keyup.forEach(i=>i(t))}),e.on("keypress",t=>{var s;this.conditional&&!this.conditional(t)||(s=this.keyMap.get(t.key))==null||s.keypress.forEach(i=>i(t))})}if(e){return this.conditional=e,this}assigns(e,t,s){e=O.orArrayResolve(e),t=O.orArrayResolve(t);for(const i of e){const n=this.keyMap.get(i)??{keydown:new Set,keypress:new Set,keyup:new Set};for(const o of t)n[o].add(s);this.keyMap.set(i,n)}return this}unassign(e,t,s){e=O.orArrayResolve(e),t=t?O.orArrayResolve(t):["keydown","keypress","keyup"];for(const i of e){const n=this.keyMap.get(i)??{keydown:new Set,keypress:new Set,keyup:new Set};for(const o of t)s?n[o].delete(s):n[o].clear();this.keyMap.set(i,n)}return this}keydown(e,t){return this.assigns(e,"keydown",t),this}keyup(e,t){return this.assigns(e,"keyup",t),this}keypress(e,t){return this.assigns(e,"keypress",t),this}}function _(r){if(typeof r>"u"||r===null||r instanceof q)return r;if(typeof r=="string"){if(r.startsWith("::"))return Array.from(document.querySelectorAll(r.replace(/^::/,""))).map(e=>_(e));if(r.startsWith(":"))return _(document.querySelector(r.replace(/^:/,"")));if(r in _.TagNameElementMap){const e=_.TagNameElementMap[r];return e===B?new B(r):e===m?new m(r):new e}else return new m(r)}if(r instanceof Node)return r.$?r.$:O.from(r);if(r instanceof Window)return mt.$;throw`$: NOT SUPPORT TARGET ELEMENT TYPE ('${r}')`}(r=>{r.anchorHandler=null,r.TagNameElementMap={html:m,head:m,document:rt,body:m,a:Xt,p:m,pre:m,code:m,blockquote:m,strong:m,h1:m,h2:m,h3:m,h4:m,h5:m,h6:m,div:m,ol:m,ul:m,dl:m,li:m,input:P,label:Lt,button:wt,form:Et,img:Zt,dialog:ee,canvas:te,select:At,option:Pt,optgroup:Ct,textarea:Dt,video:re,async:Rt};function e(f,g,b,S){return g.length?(S(),f):b()}r.fluent=e;function t(f){return f instanceof Array?f:[f]}r.orArrayResolve=t;function s(f,g){return O.mixin(f,g)}r.mixin=s;function i(f,g,b,S){if(b!==void 0){if(b instanceof M){b.use(f,g),f[g]instanceof Function?f[g](...b.value):f[g]=b.value,S&&S(b);return}f[g]instanceof Function?f[g](...b):f[g]=b}}r.set=i;function n(f,g){return new M(f,g)}r.state=n;async function o(f,g){return new Promise(b=>{const S=new FileReader;S.onload=E=>{const T=r("img");if(T.once("load",V=>{const C=r("canvas"),U=C.getContext("2d"),z=T.height()/T.width(),[Z,tt]=[z>1?g/z:g,z>1?g:g*z];C.height(tt).width(Z),U==null||U.drawImage(T.dom,0,0,Z,tt),b(C.toDataURL(f.type))}),!E.target)throw"$.resize(): e.target is null";T.src(E.target.result)},S.readAsDataURL(f)})}r.resize=o;function a(f=1){return parseInt(getComputedStyle(document.documentElement).fontSize)*f}r.rem=a;function l(f){const g=new DOMParser().parseFromString(f,"text/html").body;return Array.from(g.children).map(b=>r(b))}r.html=l;function u(f,g,b){if(typeof g=="number")return Array(g).fill("").map(E=>{const T=S(f)?f[0](...f.slice(1)):r(f);return b&&b(T),T});{const E=[];for(const T of g){const V=f instanceof Function?f(...T):S(f)?f[0](...f.slice(1)):r(f);T instanceof Function?T(V):(T instanceof q||typeof T=="string")&&V.content(T),E.push(V)}return E}function S(E){return E instanceof Array&&E[0]instanceof Function}}r.builder=u;function c(f,g){return Object.assign(r.TagNameElementMap,{[f]:g}),r.TagNameElementMap}r.registerTagName=c;function d(){return new X}r.events=d;function p(f){return new he(f)}r.pointers=p;function x(f){return new ne(f)}r.keys=x;function w(){return new oe}r.focus=w;function I(f){return f()}r.call=I})(_||(_={}));globalThis.$=_;class oe{constructor(){h(this,"layerMap",new Map);h(this,"currentLayer");h(this,"historyList",[])}layer(e){const t=this.layerMap.get(e)??new ae(e);return this.layerMap.set(t.id,t),t}next(){return this.select(0)}prev(){return this.select(1)}up(){return this.select(2)}down(){return this.select(3)}right(){return this.select(4)}left(){return this.select(5)}blur(){var e;return(e=this.currentLayer)==null||e.blur(),this}select(e){var n;if(this.currentLayer=this.currentLayer??[...this.layerMap.values()].at(0),!this.currentLayer)return this;const t=this.currentLayer.currentFocus,s=this.currentLayer.elementSet.array;if(!t)return this.currentLayer.focus(this.currentLayer.beforeBlur??s.at(0)),this;const i=s.indexOf(t);switch(e){case 0:case 1:{let o=e===0?i+1:i-1;(o===s.length&&this.currentLayer.loop()||o===-1&&!this.currentLayer.loop())&&(o=0),this.currentLayer.focus(s.at(o));break}case 3:case 5:case 4:case 2:{const o=t.coordinate();if(!o)break;const a=$.call(()=>{switch(e){case 2:return{y:o.y,x:o.x/2};case 3:return{y:o.y+o.height,x:o.x/2};case 5:return{y:o.y/2,x:o.x};case 4:return{y:o.y/2,x:o.x+o.width}}}),u=(n=s.map(c=>{if(c===t)return;const d=c.coordinate();if(!d)return;const p=$.call(()=>{switch(e){case 2:return{y:d.y+d.height,x:d.x/2};case 3:return{y:d.y,x:d.x/2};case 5:return{y:d.y/2,x:d.x+d.width};case 4:return{y:d.y/2,x:d.x}}});return{$ele:c,elePosition:d,distance:Math.sqrt((p.x-a.x)**2+(p.y-a.y)**2)}}).detype(void 0).filter(({elePosition:c})=>{switch(e){case 2:if(c.y+c.height>=o.y)return!1;break;case 3:if(c.y<=o.y+o.height)return!1;break;case 5:if(c.x+c.width>=o.x)return!1;break;case 4:if(c.x<=o.x+o.width)return!1;break}return!0}).sort((c,d)=>c.distance-d.distance).at(0))==null?void 0:n.$ele;this.currentLayer.focus(u)}}return this}}class ae{constructor(e){h(this,"id");h(this,"elementSet",new Set);h(this,"entrySet",new Set);h(this,"beforeBlur");h(this,"currentFocus");h(this,"__$property__",{loop:!0,scrollThreshold:0});this.id=e,this.add=this.add.bind(this),this.entry=this.entry.bind(this)}add(e){return $.orArrayResolve(e).forEach(t=>{this.elementSet.add(t),t.tabIndex(0)}),this}remove(e){return this.elementSet.delete(e),this}entry(e){return $.orArrayResolve(e).forEach(this.entrySet.add.bind(this.entrySet)),this}focus(e){if(!e)return this;e.hide(!1);const{scrollTop:t,scrollLeft:s}=document.documentElement,i=$.call(()=>{const o=e.domRect();return{left:o.left+s,top:o.top+t,right:o.right+s,bottom:o.bottom+t,height:o.height,width:o.width}}),{scrollThreshold:n}=this.__$property__;return this.blur(),this.currentFocus=e,(t>i.top-n||t>i.bottom+n)&&document.documentElement.scrollTo({left:i.left-n,top:i.top-n}),(t+innerHeightthis.__$property__.loop,()=>$.set(this.__$property__,"loop",e))}scrollThreshold(e){return $.fluent(this,arguments,()=>this.__$property__.scrollThreshold,()=>$.set(this.__$property__,"scrollThreshold",e))}}class he extends X{constructor(t){super();h(this,"$node");h(this,"map",new Map);this.$node=t,this.$node.on("pointerdown",s=>this.down(s)),this.$node.on("pointerup",s=>this.up(s)),this.$node.on("pointermove",s=>this.move(s)),this.$node.on("pointercancel",s=>this.cancel(s))}down(t){const s=new le(this,this.toData(t),$(t.target));this.map.set(s.id,s),this.fire("down",s,t)}up(t){const s=this.map.get(t.pointerId);s&&(this.map.delete(t.pointerId),this.fire("up",s,t))}move(t){const s=this.map.get(t.pointerId);s&&(this.map.set(s.id,s),s.update(this.toData(t)),this.fire("move",s,t))}cancel(t){const s=this.map.get(t.pointerId);s&&(s.update(this.toData(t)),this.map.delete(s.id),this.fire("cancel",s,t))}toData(t){return{id:t.pointerId,type:t.pointerType,width:t.width,height:t.height,x:t.x,y:t.y,movement_x:t.movementX,movement_y:t.movementY}}}class le{constructor(e,t,s){h(this,"initial_x");h(this,"initial_y");h(this,"$target");h(this,"manager");Object.assign(this,t),this.manager=e,this.$target=s,this.initial_x=t.x,this.initial_y=t.y}get move_x(){return this.x-this.initial_x}get move_y(){return this.y-this.initial_y}update(e){return Object.assign(this,e),this}delete(){return this.manager.map.delete(this.id),this}}Array.prototype.detype=function(...r){return this.filter(e=>{if(r.length)for(const t of r)return typeof e!=typeof t;else return e!==void 0})};Object.defineProperties(Set.prototype,{array:{get:function(){return Array.from(this)}}});Set.prototype.sort=function(r){return this.array.sort(r)};class Nt extends m{constructor(t){super("layout",t);h(this,"_property",{ROW_MAX_HEIGHT:200,GAP:0,IS_RENDERING:!1,RENDER_REQUEST:!1,COLUNM:1,TYPE:"justified",ROOT:null,ITEM_PROPERTIES:new Map});this.css({display:"block",position:"relative"}),new ResizeObserver(s=>{this.inDOM()&&(this.render(),this.dom.dispatchEvent(new Event("resize")))}).observe(this.dom),document.addEventListener("scroll",s=>{s.target===this.root().dom&&this.scrollCompute()},{passive:!0}),new IntersectionObserver(s=>{this.inDOM()&&this.render()}).observe(this.dom)}type(t){return $.fluent(this,arguments,()=>this._property.TYPE,()=>$.set(this._property,"TYPE",t))}maxHeight(t){return $.fluent(this,arguments,()=>this._property.ROW_MAX_HEIGHT,()=>$.set(this._property,"ROW_MAX_HEIGHT",t))}column(t){return $.fluent(this,arguments,()=>this._property.COLUNM,()=>$.set(this._property,"COLUNM",t))}gap(t){return $.fluent(this,arguments,()=>this._property.GAP,()=>$.set(this._property,"GAP",t))}root(t){return $.fluent(this,arguments,()=>this._property.ROOT??$(document),()=>$.set(this._property,"ROOT",t))}get COL_WIDTH(){return(this.offsetWidth-this._property.GAP*(this._property.COLUNM-1))/this._property.COLUNM}justifiedCompute(){const t=[],s=this.offsetWidth;for(const i of this.children.array){const n=$(i);if(!(n instanceof F))continue;const o=n.attribute("layout-item-ratio"),a=o?parseFloat(o):n.dom.offsetWidth/n.dom.offsetHeight,l={$node:n,ratio:a};let u=t.at(-1);(!u||u.heightc+=x.ratio);const d=c+a,p=(s-this._property.GAP*u.items.length)/d;u.items.push(l),u.ratio=d,u.height=p}return t}waterfallCompute(){const t=[],s=this.COL_WIDTH,i=()=>{if(t.lengthn.height-o.height)[0]};for(const n of this.children.array){const o=$(n);if(!(o instanceof F))continue;const a=o.attribute("layout-item-ratio"),l=a?parseFloat(a):o.dom.offsetWidth/o.dom.offsetHeight,u={$node:o,ratio:l},c=i();let d=0;c.items.forEach(w=>d+=w.ratio);const p=s/(c.height+s/l),x=s/p;c.items.push(u),c.ratio=p,c.height=x}return t}render(){if(!this.inDOM())return this;if(this._property.ITEM_PROPERTIES.clear(),this._property.TYPE==="justified"){const t=this.justifiedCompute();let s=0;for(const i of t){let n=0;i.height>this._property.ROW_MAX_HEIGHT&&(i.height=this._property.ROW_MAX_HEIGHT);for(const o of i.items){const a=o.ratio*i.height;o.$node.css({position:"absolute",height:`${i.height}px`,width:`${a}px`,top:`${s}px`,left:`${n}px`}),o.$node.attribute("layout-item-ratio",o.ratio),this._property.ITEM_PROPERTIES.set(o.$node,{height:i.height,width:a,top:s,left:n,ratio:o.ratio,$node:o.$node}),o.$node.coordinate({x:n,y:s,height:i.height,width:a}),n+=i.height*o.ratio+this._property.GAP}s+=i.height+this._property.GAP}this.css({height:`${s}px`})}else if(this._property.TYPE="waterfall"){const t=this.waterfallCompute(),s=this.COL_WIDTH;let i=0;for(const n of t){let o=0;for(const a of n.items){const l=s/a.ratio;a.$node.css({position:"absolute",height:`${l}px`,width:`${s}px`,top:`${o}px`,left:`${i}px`}),a.$node.attribute("layout-item-ratio",a.ratio),this._property.ITEM_PROPERTIES.set(a.$node,{height:l,width:s,top:o,left:i,ratio:a.ratio,$node:a.$node}),a.$node.coordinate({x:i,y:o,height:l,width:s}),o+=l+this._property.GAP}i+=s+this._property.GAP}if(t.length){const n=t.sort((o,a)=>a.height-o.height)[0];this.css({height:`${n.height+n.items.length*this._property.GAP}px`})}else this.css({height:""})}return this.scrollCompute(),this}scrollCompute(){if(this.inDOM()===!1)return;const t=document.documentElement.scrollTop-this.dom.offsetTop;this._property.ITEM_PROPERTIES.forEach((s,i)=>{const n=s.top,o=s.top+s.height;document.activeElement!==i.dom&&(o>t&&n{this.contentId=t,this.events.fire("rendered",{$view:this,previousContent:i,nextContent:s})},a=()=>{this.events.fire("afterSwitch",{$view:this,previousId:t})};return this.events.fire("beforeSwitch",{$view:this,preventDefault:()=>n=!0,targetId:t,previousContent:i,nextContent:s,switched:a,rendered:o}),n||(this.content(s),o(),a()),this}get currentContent(){if(this.contentId)return this.viewCache.get(this.contentId)}}$.registerTagName("view",Ht);var W;const y=class y extends Ht{constructor(t){super({tagname:"router",...t});et(this,W,"");h(this,"routes",new Map);y.routers.add(this)}base(t){return $.fluent(this,arguments,()=>L(this,W),()=>{st(this,W,t??L(this,W))})}map(t){t=$.orArrayResolve(t);for(const s of t)s instanceof Array?this.map(s):this.routes.set(s.path(),s);return this.resolve(),this}resolve(){return new Promise(t=>{if(!location.pathname.startsWith(L(this,W)))return t(2);const s=location.pathname.replace(L(this,W),"/").replace("//","/"),i=s.split("/").map(w=>`/${w}`),n=location.search,o=new Map(n.replace("?","").split("&").map(w=>w.split("="))),l=(()=>{const w=[];for(const[I,f]of this.routes){const g=$.orArrayResolve(I);for(const b of g){let S=0,E={},T={};const V=b.split("/").map(C=>`/${C}`);if(!(i.length{const tt=o.get(Z);tt!==void 0&&S++,Object.assign(T,{[Z]:tt})}),U.startsWith("/:")){S++,Object.assign(E,{[U.replace("/:","")]:i[C].replace("/","")});continue}else if(b.startsWith("#")&&b===location.hash){S++;continue}else if(U===i[C]){S++;continue}else break}w.push({deep:S,$route:f,params:E,query:T,routePath:b,pathId:Object.keys(T).length!==0?s+n:Object.keys(E).length!==0?s:g[0]})}}}return w.sort((I,f)=>f.deep-I.deep).at(0)})();if(!l)return t(1);const{$route:u,params:c,pathId:d,query:p}=l;if(d===this.contentId)return t(0);this.events.once("rendered",({nextContent:w,previousContent:I})=>{I==null||I.events.fire("afterShift",{$route:I}),w.events.fire("rendered",{$route:w}),t(0)});const x=this.viewCache.get(d)??u.build({params:c,query:p});this.viewCache.has(d)||this.setView(d,x),this.events.once("beforeSwitch",()=>{var w;x.events.fire("beforeShift",{$route:x}),(w=this.currentContent)==null||w.events.fire("beforeShift",{$route:this.currentContent})}),this.events.once("afterSwitch",()=>x.events.fire("afterShift",{$route:x})),this.switchView(d)})}static init(){if(!history.state||!("index"in history.state)){const t={index:y.index};history.replaceState(t,"")}else y.index=history.state.index;return y.navigationDirection=0,y.resolve(),window.addEventListener("popstate",()=>y.popstate()),window.addEventListener("scroll",()=>{this.setScrollHistory(this.index,location.href,document.documentElement.scrollTop)},{passive:!0}),history.scrollRestoration="manual",this}static open(t,s){return t===void 0?this:(t=this.urlResolver(t),t.href===this.url.href?this:t.origin!==this.url.origin?(window.open(t,s),this):(y.clearForwardScrollHistory(),y.forwardIndex=0,y.index++,history.pushState(y.historyState,"",t),y.stateChange(0),y.resolve(),this))}static back(){return this.index--,this.forwardIndex++,history.back(),this}static forward(){return this.forwardIndex===0?this:(this.index++,this.forwardIndex--,history.forward(),this)}static replace(t){return t===void 0?this:(t=this.urlResolver(t),history.replaceState(y.historyState,"",t),this.stateChange(2),this.setScrollHistory(this.index,location.href,0),y.resolve(),this)}static urlResolver(t){return t instanceof URL?t:(t.startsWith("/")&&(t=`${location.origin}${t}`),t.startsWith("#")&&(t=`${location.origin}${location.pathname}${t}`),new URL(t))}static popstate(){const t=history.state.index>y.index?0:history.state.indext.resolve())),this.scrollRestoration(),this.setScrollHistory(this.index,location.href,document.documentElement.scrollTop)}static get historyState(){return{index:y.index}}static stateChange(t){const s=this.url,i=new URL(location.href);this.url=i,y.events.fire("stateChange",{beforeURL:s,afterURL:i,direction:t}),y.navigationDirection=t}static setScrollHistory(t,s,i){const n=this.getScrollHistory();if(!n)return sessionStorage.setItem(this.scrollHistoryKey,JSON.stringify({[t]:{url:s,value:i}}));n[t]={url:s,value:i},sessionStorage.setItem(this.scrollHistoryKey,JSON.stringify(n))}static getScrollHistory(){const t=sessionStorage.getItem(this.scrollHistoryKey);if(t)return JSON.parse(t)}static clearForwardScrollHistory(){const t=this.getScrollHistory();if(t)for(const s in t)Number(s)>this.index&&delete t[s],sessionStorage.setItem(this.scrollHistoryKey,JSON.stringify(t))}static scrollRestoration(){const t=this.getScrollHistory();if(t&&t[this.index])document.documentElement.scrollTop=t[this.index].value??0;else if(location.hash.length){const s=$(document.body).$(`:${location.hash}`);s&&(document.documentElement.scrollTop=s.dom.offsetTop)}else document.documentElement.scrollTop=0}};W=new WeakMap,h(y,"routers",new Set),h(y,"events",new X),h(y,"navigationDirection"),h(y,"index",0),h(y,"forwardIndex",0),h(y,"url",new URL(location.href)),h(y,"scrollHistoryKey","$ROUTER_SCROLL_HISTORY");let k=y;var G=(r=>(r[r.Forward=0]="Forward",r[r.Back=1]="Back",r[r.Replace=2]="Replace",r))(G||{});k.init();var Y,j;const _t=class _t extends m{constructor(t){super("route",t);et(this,Y,"");et(this,j);h(this,"rendered",!1)}path(t){return $.fluent(this,arguments,()=>L(this,Y),()=>st(this,Y,t??L(this,Y)))}builder(t){return st(this,j,t),this}render(t){return L(this,j)&&this.content(L(this,j).call(this,{$route:this,params:t.params,query:t.query})),this.rendered=!0,this}build(t){return new _t({dom:this.dom.cloneNode()}).self(s=>{L(this,j)&&s.builder(L(this,j)).render({params:t.params,query:t.query})})}};Y=new WeakMap,j=new WeakMap;let pt=_t;$.registerTagName("router",k);$.registerTagName("route",pt);Object.assign($,{open(r,e){return k.open(r,e)},replace(r){return k.replace(r)},back(){return k.back()},forward(){return k.forward()}});class ce{constructor(e,t){h(this,"booru");Object.assign(this,t),this.booru=e}static async fetchUserFavorites(e,t,s,i=100,n){return(await e.fetch(`/favorites.json?${s}&${`search[user_id]=${t.id}`}&limit=${i}&page=${n}`)).map(a=>(t.favorites.add(a.post_id),a.post_id))}update(e){return Object.assign(this,e),this}}class gt{constructor(e,t,s=!0){h(this,"name$",$.state("..."));h(this,"post_upload_count$",$.state(0));h(this,"level$",$.state(10));h(this,"level_string$",$.state("..."));h(this,"booru");h(this,"favorites",new Set);this.booru=e,Object.assign(this,t),s&&this.update$()}static async fetch(e,t){var n;let s;if(typeof t=="string"){const o=(await e.fetch(`/users.json?search[name]=${t}`)).at(0);if(!o)throw"User Not Found";return s=o}else s=await e.fetch(`/users/${t}.json`);const i=((n=e.users.get(s.id))==null?void 0:n.update(s))??new this(e,s);return e.users.set(i.id,i),i}static async fetchMultiple(e,t,s=200){let i="";if(t)for(const[a,l]of Object.entries(t))if(l instanceof Array)i+=`&search[${a}]=${l}`;else if(l instanceof Object)for(const[u,c]of Object.entries(l))i+=`&search[${a}${u}]=${c}`;else i+=`&search[${a}]=${l}`;return(await e.fetch(`/users.json?limit=${s}${i}`)).map(a=>{const l=new this(e,a);return e.users.set(l.id,l),l})}update(e){return Object.assign(this,e),this.update$(),this}update$(){this.name$.set(this.name),this.post_upload_count$.set(this.post_upload_count),this.level$.set(this.level),this.level_string$.set(this.level_string)}get booruURL(){return`${this.booru.origin}/users/${this.id}`}get url(){return`/users/${this.id}`}}const dt=class dt extends gt{constructor(t,s,i){super(t,i,!1);h(this,"apiKey");h(this,"favorite_count$",$.state(0));h(this,"forum_post_count$",$.state(0));this.apiKey=s,this.update$()}update$(){var t,s;super.update$(),(t=this.forum_post_count$)==null||t.set(this.forum_post_count),(s=this.favorite_count$)==null||s.set(this.favorite_count)}async init(){await this.fetchFavorites()}async fetchFavorites(){const t=Array.from(this.favorites.keys()).at(-1),s=await ce.fetchUserFavorites(this.booru,this,"",1e3,t?`b${t}`:1);return dt.events.fire("favoriteUpdate",this),s.length>=1e3&&this.fetchFavorites(),s}static get storageUserData(){const t=localStorage.getItem("user_data");return t?JSON.parse(t):null}static set storageUserData(t){localStorage.setItem("user_data",JSON.stringify(t))}};h(dt,"events",new X);let H=dt;const N=class N{constructor(e){h(this,"user");h(this,"posts",new Map);h(this,"tags",new Map);h(this,"users",new Map);h(this,"favorites",new Map);Object.assign(this,e),this.origin.endsWith("/")&&(this.origin=this.origin.slice(0,-1)),N.manager.set(this.name,this)}static set(e){this.used=e,this.name$.set(e.name),this.storageAPI=e.name;const t=H.storageUserData;return t&&e.login(t.username,t.apiKey),this.events.fire("set"),this}static get storageAPI(){return localStorage.getItem("booru_api")}static set storageAPI(e){e?localStorage.setItem("booru_api",e):localStorage.removeItem("booru_api")}async fetch(e,t="GET"){const s=this.user?`${e.includes("?")?"&":"?"}login=${this.user.name}&api_key=${this.user.apiKey}`:"",i=await fetch(`${this.origin}${e}${s}`,{method:t}).then(n=>n.json());if(i.success===!1)throw i.message;return i}async login(e,t){const s=await this.fetch(`/profile.json?login=${e}&api_key=${t}`);return this.user=new H(this,t,s),this.user.init(),N.events.fire("login",this.user),this.user}logout(){return this.user=void 0,H.storageUserData=null,N.events.fire("logout"),this}};h(N,"used"),h(N,"events",new X),h(N,"name$",$.state(N.name)),h(N,"manager",new Map);let v=N;class ue{constructor(e,t){h(this,"post_count$",$.state(0));h(this,"name$",$.state(""));h(this,"booru");this.booru=e,Object.assign(this,t),this.$update()}static async fetch(e,t){var n;const s=await e.fetch(`/tags/${t}.json`),i=((n=e.tags.get(s.id))==null?void 0:n.update(s))??new this(e,s);return e.tags.set(i.id,i),i}static async fetchMultiple(e,t,s=1e3){let i="";if(t)for(const[a,l]of Object.entries(t))if(l instanceof Array)i+=`&search[${a}]=${l}`;else if(l instanceof Object)for(const[u,c]of Object.entries(l))i+=`&search[${a}${u}]=${c}`;else i+=`&search[${a}]=${l}`;return(await e.fetch(`/tags.json?limit=${s}${i}`)).map(a=>{var u;const l=((u=e.tags.get(a.id))==null?void 0:u.update(a))??new this(e,a);return e.tags.set(l.id,l),l})}update(e){return Object.assign(this,e),this.$update(),this}$update(){this.post_count$.set(this.post_count),this.name$.set(this.name)}}var K=(r=>(r[r.General=0]="General",r[r.Artist=1]="Artist",r[r.Copyright=3]="Copyright",r[r.Character=4]="Character",r[r.Meta=5]="Meta",r))(K||{});const bt=1e3,ht=bt*60,lt=ht*60,ct=lt*24,de=ct*7,ot=new Intl.RelativeTimeFormat("en",{style:"long"});function $t(r){r=Math.floor(r);const e=r/bt,t=r/ht,s=r/lt,i=r/ct,n=r%1e3,o=Math.floor(r%6e4/1e3),a=Math.floor(r%36e5/6e4),l=Math.floor(r%(36e5*24)/36e5),u=o.toString().padStart(2,"0"),c=a.toString().padStart(2,"0"),d=l.toString().padStart(2,"0");return{seconds:e,minutes:t,hours:s,days:i,mil:n,s:o,min:a,h:l,ss:u,mm:c,hh:d}}function fe(r,e=Date.now()){const t=r-e,s=Math.abs(t);if(sthis.update$()),this}static async fetchMultiple(t,s,i=20,n){let o="";if(s){if(typeof s=="string")o=s;else for(const[c,d]of Object.entries(s))if(d!==void 0){if(c==="tags"){o+=`${d}`;continue}o.at(-1)!=="="&&(o+=" "),o+=`${c}:${d}`}}const a=await t.fetch(`/posts.json?limit=${i}&tags=${o}${n?`&page=${n}`:""}&_method=get`);if(!(a instanceof Array))return[];const l=a.map(c=>{var p;const d=((p=t.posts.get(c.id))==null?void 0:p.update(c))??new this(t,c.id,c);return t.posts.set(d.id,d),d});if(!l.length)return l;const u=[...new Set(a.map(c=>[c.approver_id,c.uploader_id].detype(null)).flat())];return gt.fetchMultiple(t,{id:u}).then(()=>l.forEach(c=>c.update$())),l}update$(){var t,s,i,n;this.uploader$.set(((t=this.uploader)==null?void 0:t.name$)??((s=this.uploader_id)==null?void 0:s.toString())),this.approver$.set(((i=this.approver)==null?void 0:i.name$)??((n=this.approver_id)==null?void 0:n.toString())??"None"),this.created_date$.set(fe(+new Date(this.created_at))),this.favcount$.set(this.fav_count),this.score$.set(this.score),this.file_size$.set(me(this.file_size)),this.file_ext$.set(this.file_ext),this.file_url$.set(this.file_url),this.source$.set(this.source),this.dimension$.set(`${this.image_width}x${this.image_height}`),this.booruUrl$.set(`${this.booruUrl}`),this.isUgoria&&this.webm_url$.set(this.large_file_url),this.createdDate=new Date(this.created_at),this.fire("update")}update(t){return Object.assign(this,t),this.update$(),this}async fetchTags(){return await this.ready,await ue.fetchMultiple(this.booru,{name:{_space:this.tag_string}})}async createFavorite(){if(!this.booru.user)return;const t=await this.booru.fetch(`/favorites.json?post_id=${this.id}`,"POST");return this.update(t),this.booru.user.favorites.add(t.id),H.events.fire("favoriteUpdate",this.booru.user),t.id}async deleteFavorite(){!this.booru.user||await fetch(`/api/favorites/${this.id}?login=${this.booru.user.name}&api_key=${this.booru.user.apiKey}&origin=${this.booru.origin}`,{method:"DELETE"}).then(s=>s.json())===!1||(this.fav_count--,this.favcount$.set(this.fav_count),this.booru.user.favorites.delete(this.id),H.events.fire("favoriteUpdate",this.booru.user))}get pathname(){return`/posts/${this.id}`}get uploader(){return this.booru.users.get(this.uploader_id)}get approver(){return this.approver_id?this.booru.users.get(this.approver_id):null}get isVideo(){return this.file_ext==="mp4"||this.file_ext==="webm"||this.file_ext==="zip"}get isGif(){return this.file_ext==="gif"}get isUgoria(){return this.file_ext==="zip"}get hasSound(){return this.tag_string_meta.includes("sound")}get tags(){const t=this.tag_string.split(" ");return[...this.booru.tags.values()].filter(s=>t.includes(s.name))}get previewURL(){var t,s;return((s=(t=this.media_asset.variants)==null?void 0:t.find(i=>i.file_ext==="webp"))==null?void 0:s.url)??this.large_file_url}get booruUrl(){return`${this.booru.origin}/posts/${this.id}`}get url(){return`https://danbooru.defaultkavy.com/posts/${this.id}`}get isFileSource(){return this.source.startsWith("file://")}get isLargeFile(){return this.file_size>5e6}}class Ft{constructor(e){Object.assign(this,e)}static async fetch(e,t){const s=await e.fetch(`/artist_commentaries/${t}.json`);return new this(s)}static async fetchMultiple(e,t,s=200){let i="";if(t)for(const[a,l]of Object.entries(t))if(l instanceof Array)i+=`&search[${a}]=${l}`;else if(l instanceof Object)for(const[u,c]of Object.entries(l))i+=`&search[${a}${u}]=${c}`;else i+=`&search[${a}]=${l}`;return(await e.fetch(`/artist_commentaries.json?limit=${s}${i}`)).map(a=>{const l=new this(a);return this.manager.set(l.id,l),l})}}h(Ft,"manager",new Map);class ge extends m{constructor(t,s,i){super("video-controller");h(this,"$video");h(this,"$viewer");h(this,"duration$",$.state("00:00"));h(this,"post");this.$video=t,this.$viewer=s,this.post=i,this.build()}build(){const t=$.events();this.$video.on("timeupdate",()=>this.durationUpdate()),this.content([$("div").class("video-details").content([$("div").class("left").content([$("ion-icon").class("play").title("Play").name("play").self(s=>{this.$video.on("play",()=>s.name("pause")).on("pause",()=>s.name("play")),s.on("click",()=>this.$video.isPlaying?this.$video.pause():this.$video.play())}),$("div").class("duration").content([$("span").class("current-time").content(this.duration$),$("span").content("/"),$("span").class("total-time").content("00:00").self(s=>{this.$video.on("loadeddata",()=>{const i=$t(this.$video.duration*1e3);s.content(Number(i.hh)>0?`${i.hh}:${i.mm}:${i.ss}`:`${i.mm}:${i.ss}`)})})])]),$("div").class("right").content([$("ion-icon").class("volume").title("Volume").name("volume-high").disable(!this.post.hasSound).self(s=>{const i=()=>{this.$video.muted()?s.name("volume-mute"):s.name("volume-high")};s.on("click",()=>{this.$video.muted(!this.$video.muted()),i()})}),$("ion-icon").class("full-screen").title("Full-Screen").name("scan").self(s=>{s.on("click",()=>{document.fullscreenElement?document.exitFullscreen():this.$viewer.dom.requestFullscreen()})})])]),$("div").class("progressbar-container").content([$("div").class("progressbar").content([$("div").class("progress").self(s=>{this.$video.on("timeupdate",i=>{s.css({width:`${this.$video.currentTime()/this.$video.duration*100}%`})}),t.on("progressChange",i=>{s.css({width:`${i*100}%`})})})])]).self(s=>{const i=$.pointers($(document.body));let n=!1;i.on("down",(o,a)=>{if(!s.contains(o.$target))return o.delete();a.preventDefault(),this.$video.isPlaying&&(n=!0,this.$video.pause());const l=(o.x-s.domRect().x)/s.offsetWidth;this.$video.currentTime(l*this.$video.duration)}),i.on("move",(o,a)=>{a.preventDefault();const l=(o.x-s.domRect().x)/s.offsetWidth;this.$video.currentTime(l*this.$video.duration),t.fire("progressChange",l)}),i.on("up",(o,a)=>{n&&this.$video.play(),n=!1})})])}durationUpdate(){const t=$t(this.$video.currentTime()*1e3);this.duration$.set(Number(t.hh)>0?`${t.hh}:${t.mm}:${t.ss}`:`${t.mm}:${t.ss}`)}}const $e=$("route").path("/posts/:id").id("post").builder(({$route:r,params:e})=>{if(!Number(e.id))return $("h1").content("404: POST NOT FOUND");const t=J.get(v.used,+e.id),s=$.events();return $.keys($(window)).if(i=>{if(!($(i.target)instanceof P)&&r.inDOM())return!0}).keydown(["f","F"],i=>{var n;(n=v.used.user)!=null&&n.favorites.has(t.id)?t.deleteFavorite():t.createFavorite()}),[$("div").class("viewer").content(async i=>{const n=$("video");return s.on("video_play_pause",()=>{n.isPlaying?n.pause():n.play()}),await t.ready,i.on("pointermove",o=>{(o.pointerType==="mouse"||o.pointerType==="pen")&&s.fire("viewerPanel_show")}).on("pointerup",o=>{var a;(a=$(":.viewer-panel .panel"))!=null&&a.contains($(o.target))||(o.pointerType==="touch"&&s.fire("viewerPanel_switch"),o.pointerType==="mouse"&&s.fire("video_play_pause"))}).on("mouseleave",()=>{s.fire("viewerPanel_hide")}),[$("div").class("viewer-panel").hide(!1).content([$("div").class("panel").content([t.isVideo?new ge(n,i,t):null,$("div").class("buttons").content([$("ion-icon").title("Favorite").name("heart-outline").self(o=>{var a;H.events.on("favoriteUpdate",l=>{l.favorites.has(t.id)?o.name("heart"):o.name("heart-outline")}),(a=v.used.user)!=null&&a.favorites.has(t.id)&&o.name("heart"),o.on("click",()=>{var l;(l=v.used.user)!=null&&l.favorites.has(t.id)?t.deleteFavorite():t.createFavorite()})}),$("ion-icon").title("Original Size").name("resize-outline").self(o=>{o.on("click",()=>{s.fire("original_size"),o.disable(!0)}),(!t.isLargeFile||t.isVideo)&&o.disable(!0)})])]),$("div").class("overlay")]).self(o=>{s.on("viewerPanel_hide",()=>o.hide(!0)).on("viewerPanel_show",()=>o.hide(!1)).on("viewerPanel_switch",()=>o.hide(!o.hide()))}),t.isVideo?n.height(t.image_height).width(t.image_width).src(t.file_ext==="zip"?t.large_file_url:t.file_url).controls(!1).autoplay(!0).loop(!0).disablePictureInPicture(!0):$("img").src(t.isLargeFile?t.large_file_url:t.file_url).self(o=>{s.on("original_size",()=>o.src(t.file_url))})]}),$("div").class("content").content([$("h3").content("Artist's Commentary"),$("section").class("commentary").content(async i=>{const n=(await Ft.fetchMultiple(v.used,{post:{_id:t.id}})).at(0);return[n?[n.original_title?$("h3").content(n.original_title):null,$("pre").content(n.original_description)]:"No commentary"]})]),$("div").class("sidebar").self(i=>{let n=0;addEventListener("scroll",()=>{i.inDOM()&&(n=document.documentElement.scrollTop)},{passive:!0}),r.on("beforeShift",()=>{innerWidth>800&&i.css({position:"absolute",top:`calc(${n}px + var(--nav-height) + var(--padding))`})}).on("afterShift",()=>i.css({position:"",top:""}))}).content([$("section").class("post-info").content([new A("id").name("Post").content(`#${e.id}`),new A("uploader").name("Uploader").content(t.uploader$),new A("approver").name("Approver").content(t.approver$),new A("date").name("Date").content(t.created_date$),new A("size").name("Size").content([t.file_size$,t.dimension$]),new A("file-type").name("File Type").content(t.file_ext$),$("div").class("inline").content([new A("favorites").name("Favorites").content(t.favcount$),new A("score").name("Score").content(t.score$)]),new A("file-url").name("File").content([$("a").href(t.file_url$).content(t.file_url$.convert(i=>i.replace("https://",""))).target("_blank"),$("ion-icon").name("clipboard").on("click",(i,n)=>ft(n,t.file_url))]),new A("source-url").name("Source").content([$("a").href(t.source$).content(t.source$.convert(i=>i.replace("https://",""))).target("_blank"),$("ion-icon").name("clipboard").on("click",(i,n)=>ft(n,t.source))]),new A("booru-url").name(v.name$).content([$("a").href(t.booruUrl$).content(t.booruUrl$.convert(i=>i.replace("https://",""))).target("_blank"),$("ion-icon").name("clipboard").on("click",(i,n)=>ft(n,t.booruUrl))]),new A("webm-url").name("Webm").hide(!0).self(async i=>{await t.ready,t.isUgoria&&i.content($("a").href(t.webm_url$).content(t.webm_url$.convert(n=>n.replace("https://",""))).target("_blank")).hide(!1)})]),$("div").class("post-tags").content(async i=>{const n=await t.fetchTags(),[o,a,l,u,c]=[n.filter(p=>p.category===K.Artist),n.filter(p=>p.category===K.Character),n.filter(p=>p.category===K.General),n.filter(p=>p.category===K.Meta),n.filter(p=>p.category===K.Copyright)];return[d("Artist",o),d("Character",a),d("Copyright",c),d("Meta",u),d("General",l)];function d(p,x){return x.length?[$("h3").content(p),$("section").content([x.map(w=>$("div").class("tag").content([$("a").class("tag-name").content(w.name).href(`/posts?tags=${w.name}`),$("span").class("tag-post-count").content(w.post_count$.convert(it))]))])]:null}})])]});function ft(r,e){r.name("checkmark"),navigator.clipboard.writeText(e),setTimeout(()=>r.name("clipboard"),3e3)}class A extends m{constructor(t){super("div");h(this,"$name",$("span").class("property-name"));h(this,"$values",$("div").class("property-values"));this.staticClass("property").attribute("property-id",t),super.content([this.$name,this.$values.hide(!0)])}name(t){return this.$name.content(t),this}content(t){this.$values.hide(!1);const s=$.orArrayResolve(t);return this.$values.content(s.map(i=>$("span").staticClass("property-value").content(i))),this}}class It extends m{constructor(t){super("post-tile");h(this,"post");h(this,"$video");h(this,"duration$",$.state(""));this.post=t,this.$video=this.post.isVideo?$("video").width(this.post.image_width).height(this.post.image_height).disablePictureInPicture(!0).loop(!0).muted(!0).hide(!0).on("mousedown",s=>s.preventDefault()):null,this.attribute("filetype",this.post.file_ext),this.durationUpdate(),this.build()}build(){var s,i;let t;(s=this.$video)==null||s.on("timeupdate",(n,o)=>{this.durationUpdate()}),(i=this.$video)==null||i.on("pause",()=>{clearInterval(t),this.durationUpdate()}),this.class("loading").content([this.post.isVideo?$("div").class("video-detail").content([this.post.hasSound?$("ion-icon").name("volume-medium-outline"):null,this.post.isUgoria?$("ion-icon").name("images-outline"):null,$("span").class("duration").content(this.duration$)]):null,this.post.isGif?$("div").class("gif-detail").content([$("span").content("GIF")]):null,$("a").href(this.post.pathname).content(()=>[this.$video,$("img").draggable(!1).css({opacity:"0"}).width(this.post.image_width).height(this.post.image_height).src(this.post.previewURL).loading("lazy").on("mousedown",n=>n.preventDefault()).once("load",(n,o)=>{o.src(this.post.previewURL).on(["mouseenter","touchstart"],()=>{this.post.isGif&&o.src(this.post.large_file_url)},{passive:!0}).on(["mouseleave","touchend","touchcancel"],()=>{this.post.isGif&&o.src(this.post.previewURL)},{passive:!0}).animate({opacity:[0,1]},{duration:300,fill:"both"}),this.removeClass("loading")})]).on(["mouseenter","touchstart"],()=>{var n,o;(n=this.$video)!=null&&n.isPlaying||(o=this.$video)==null||o.src(this.post.large_file_url).hide(!1).play().catch(a=>{})},{passive:!0}).on(["mouseleave","touchend","touchcancel"],()=>{var n;(n=this.$video)==null||n.pause().currentTime(0).hide(!0)},{passive:!0})])}durationUpdate(){if(!this.$video)return;const t=$t(this.post.media_asset.duration*1e3-this.$video.currentTime()*1e3);this.duration$.set(Number(t.hh)>0?`${t.hh}:${t.mm}:${t.ss}`:`${t.mm}:${t.ss}`)}}class Ot extends Nt{constructor(t){super();h(this,"posts",new Set);h(this,"$posts",new Map);h(this,"orderMap",new Map);h(this,"tags");h(this,"finished",!1);h(this,"limit",100);h(this,"$focus",$.focus());this.tags=t==null?void 0:t.tags,this.addStaticClass("post-grid"),this.type("waterfall").gap(10),this.init()}async init(){setInterval(()=>{this.inDOM()&&document.documentElement.scrollTop===0&&this.getPost("newer")},1e4),v.events.on("set",()=>{this.removeAll(),this.finished&&(this.finished=!1,this.events.fire("startLoad"),this.loader())}),this.on("resize",()=>this.resize()),this.events.fire("startLoad"),this.loader(),this.$focus.layer(100).loop(!1).scrollThreshold($.rem(2)+60),$.keys($(window)).if(t=>{if(!($(t.target)instanceof P)&&this.inDOM())return!0}).keydown("Tab",t=>{t.preventDefault(),t.shiftKey?this.$focus.prev():this.$focus.next()}).keydown(["w","W"],t=>{t.preventDefault(),this.$focus.up()}).keydown(["s","S"],t=>{t.preventDefault(),this.$focus.down()}).keydown(["d","D"],t=>{t.preventDefault(),this.$focus.right()}).keydown(["a","A"],t=>{t.preventDefault(),this.$focus.left()}).keydown([" ","Enter"],t=>{var i;t.preventDefault();const s=(i=this.$focus.currentLayer)==null?void 0:i.currentFocus;s instanceof It&&$.open(`/posts/${s.post.id}`)}).keydown(["Escape"],t=>{t.preventDefault(),this.$focus.blur()})}async loader(){if(!this.inDOM())return setTimeout(()=>this.loader(),100);for(;this.inDOM()&&document.documentElement.scrollHeight<=innerHeight*2;)if(!(await this.getPost("older")).length)return;document.documentElement.scrollTop+innerHeight>document.documentElement.scrollHeight-innerHeight*2&&!(await this.getPost("older")).length||setTimeout(()=>this.loader(),100)}resize(){const t=Math.round(this.dom.clientWidth/300);this.column(t>=2?t:2)}addPost(t){t=$.orArrayResolve(t);for(const i of t){if(!i.file_url||this.posts.has(i))continue;const n=new It(i);this.$posts.set(i,n),this.posts.add(i)}this.$focus.layer(100).removeAll();const s=[...this.orderMap.values()].map(i=>{var n;return(n=this.$posts.get(i))==null?void 0:n.self(this.$focus.layer(100).add)});return this.content(s).render(),this}removeAll(){return this.posts.clear(),this.$posts.clear(),this.orderMap.clear(),this.animate({opacity:[1,0]},{duration:300,easing:"ease"},()=>this.clear().render()),this}async getPost(t){const s=this.tags?decodeURIComponent(this.tags).split("+"):void 0,i=[],n=[];let o=this.limit;if(s)for(const c of s)c.startsWith("ordfav:")||c.startsWith("order:")?n.push(c):c.startsWith("limit:")?o=Number(c.split(":")[1]):i.push(c);if(n.length){if(n.length>1)return this.events.fire("post_error",`Error: These query can't be used together [${n}].`),[];const c=n[0];if(c.startsWith("ordfav:")){const d=c.split(":")[1],p=i.length?`&search[post_tags_match]=${i.toString().replaceAll(",","+")}`:"",x=this.orderKeyList.length?t==="newer"?`&search[id]=>${this.orderKeyList.at(0)}`:`&search[id]=<${this.orderKeyList.at(-1)}`:void 0,w=await v.used.fetch(`/favorites.json?search[user_name]=${d}${x??""}${p}&limit=${o}`),I=await J.fetchMultiple(v.used,{tags:`id:${w.map(g=>g.post_id).toString()}`}),f=new Map;for(const g of w){const b=I.find(S=>S.id===g.post_id);b&&f.set(g.id,b)}return this.orderMap=new Map(t==="newer"?[...f,...this.orderMap]:[...this.orderMap,...f]),this.addPost(I),I}if(c.startsWith("order:")){const d=this.orderKeyList.length?t==="newer"?1:this.orderMap.size/o+1:void 0,p=await J.fetchMultiple(v.used,{tags:this.tags},o,d),x=new Map(p.map(w=>[w.id,w]));return x.forEach((w,I)=>{this.orderMap.has(I)&&x.delete(I)}),this.orderMap=new Map(t==="newer"?[...x,...this.orderMap]:[...this.orderMap,...x]),this.addPost(p),p}}const a=this.orderKeyList.length?t==="newer"?`a${this.orderKeyList.at(0)}`:`b${this.orderKeyList.at(-1)}`:void 0,l=await J.fetchMultiple(v.used,{tags:this.tags},o,a),u=new Map(l.map(c=>[c.id,c]));return this.orderMap=new Map(t==="newer"?[...u,...this.orderMap]:[...this.orderMap,...u]),this.addPost(l),l.length||(this.finished=!0,this.posts.size?this.events.fire("endPost"):this.events.fire("noPost")),l}get orderKeyList(){return[...this.orderMap.keys()]}}class Vt{static async fetch(e,t,s=20){if(!t.length)return this.searchQuery.map(o=>new kt(o));const i=await e.fetch(`/autocomplete.json?search[query]=${t}&search[type]=tag_query&version=1&limit=${s}`);return[...t.length?this.searchQuery.filter(o=>o.value.startsWith(t)&&o.value!==t):this.searchQuery,...i].map(o=>new kt(o))}}h(Vt,"searchQuery",[{value:"user:",label:"user:"},{value:"approver:",label:"approver:"},{value:"-approver:",label:"-approver:"},{value:"order:",label:"order:"},{value:"ordfav:",label:"ordfav:"},{value:"ordfavgroup:",label:"ordfavgroup:"},{value:"search:",label:"search:"},{value:"favgroup:",label:"favgroup:"},{value:"-favgroup:",label:"-favgroup:"},{value:"favcount:",label:"favcount:"},{value:"id:",label:"id:"},{value:"tagcount:",label:"tagcount:"},{value:"gentags:",label:"gentags:"},{value:"arttags:",label:"arttags:"},{value:"chartags:",label:"chartags:"},{value:"copytags:",label:"copytags:"},{value:"metatags:",label:"metatags:"},{value:"score:",label:"score:"},{value:"upvote:",label:"upvote:"},{value:"downvote:",label:"downvote:"},{value:"disapproved:",label:"disapproved:"},{value:"md5:",label:"md5:"},{value:"width:",label:"width:"},{value:"height:",label:"height:"},{value:"ratio:",label:"ratio:"},{value:"mpixels:",label:"mpixels:"},{value:"filesize:",label:"filesize:"},{value:"duration:",label:"duration:"},{value:"is:",label:"is:"},{value:"has:",label:"has:"},{value:"pool:",label:"pool:"},{value:"-pool:",label:"-pool:"},{value:"ordpool:",label:"ordpool:"},{value:"random:",label:"random:"},{value:"limit:",label:"limit:"},{value:"date:",label:"date:"},{value:"commenter:",label:"commenter:"},{value:"note:",label:"note:"},{value:"noter:",label:"noter:"},{value:"noteupdater:",label:"noteupdater:"},{value:"status:",label:"status:"},{value:"-status:",label:"-status:"},{value:"rating:",label:"rating:"},{value:"-rating:",label:"-rating:"},{value:"source:",label:"source:"},{value:"-source:",label:"-source:"},{value:"pixiv:",label:"pixiv:"},{value:"parent:",label:"parent:"},{value:"child:",label:"child:"},{value:"flagger:",label:"flagger:"},{value:"appealer:",label:"appealer:"},{value:"commentary:",label:"commentary:"},{value:"commentaryupdater:",label:"commentaryupdater:"}].map(e=>({type:"query",...e})));class kt{constructor(e){Object.assign(this,e)}isTag(){return this.type==="tag"||this.type==="tag-autocorrect"||this.type==="tag-alias"||this.type==="tag-word"}isTagAutocorrect(){return this.type==="tag-autocorrect"}isTagAntecedent(){return!!this.antecedent}isTagWord(){return this.type==="tag-word"}isUser(){return this.type==="user"}}class ve extends m{constructor(){super("searchbar");h(this,"$tagInput",new be(this));h(this,"$selectionList",new ye);h(this,"typingTimer",null);h(this,"$filter",$("div").class("filter"));this.build(),window.addEventListener("keyup",t=>{!this.inDOM()&&t.key==="/"&&this.open(),this.inDOM()&&t.key==="Escape"&&this.close()})}build(){this.content([$("div").class("input-container").content([this.$tagInput.on("input",()=>this.inputHandler()).on("keydown",t=>this.keyHandler(t)),$("ion-icon").name("close-circle-outline").title("Clear Input").on("click",()=>this.$tagInput.clearAll())]).on("click",t=>{t.target===this.$tagInput.dom&&this.$tagInput.addTag().input()}),$("div").class("selection-list-container").content([this.$selectionList]),this.$filter.on("click",()=>{location.hash==="#search"&&this.close()})])}open(){return location.hash!=="#search"&&$.open(location.href+"#search"),this}close(){return location.hash==="#search"&&$.back(),this}activate(){return this.hide(!1),this.$filter.animate({opacity:[0,.5]},{duration:300,easing:"ease"}),this.$tagInput.input(),this}inactivate(){return this.animate({opacity:[.5,0]},{duration:300,easing:"ease"},()=>this.hide(!0)),this}keyHandler(t){var n,o;const s=()=>{t.preventDefault(),this.$tagInput.addTag().input()},i=a=>{const l=this.$tagInput.children.indexOf(this.$tagInput.$inputor);if(this.$tagInput.$input.value().at(-1)===":")return this.getSearchSuggestions();const u=this.$tagInput.children.array.at(l+1);this.$tagInput.addTag(a.value()),u?this.$tagInput.editTag(u):this.$tagInput.input()};switch(t.key){case"ArrowUp":{t.preventDefault(),this.$selectionList.focusPrevSelection(),this.$tagInput.value((n=this.$selectionList.focused)==null?void 0:n.value());break}case"ArrowDown":{t.preventDefault(),this.$selectionList.focusNextSelection(),this.$tagInput.value((o=this.$selectionList.focused)==null?void 0:o.value());break}case" ":s();break;case"Enter":{t.preventDefault(),this.$selectionList.focused?i(this.$selectionList.focused):(this.$tagInput.addTag(),this.search());break}case"Tab":{t.preventDefault();const a=this.$tagInput.children.indexOf(this.$tagInput.$inputor);if(t.shiftKey){a-1>=0&&this.$tagInput.editTag(this.$tagInput.children.array.at(a-1));break}if(this.$selectionList.focused)i(this.$selectionList.focused);else{const l=this.$tagInput.children.array.at(a+1);l?this.$tagInput.editTag(l):this.$tagInput.addTag().input()}break}case"Backspace":{const a=this.$tagInput.children.indexOf(this.$tagInput.$inputor);a!==0&&!this.$tagInput.$input.value().length&&(t.preventDefault(),this.$tagInput.editTag(this.$tagInput.children.array.at(a-1)));break}}}inputHandler(){this.typingTimer&&(clearTimeout(this.typingTimer),this.typingTimer=null),this.typingTimer=setTimeout(async()=>{this.typingTimer=null,this.getSearchSuggestions()},200)}async getSearchSuggestions(){const t=this.$tagInput.$input.value(),s=await Vt.fetch(v.used,t,20);this.$selectionList.clearSelections().addSelections(s.map(i=>new we().value(i.value).content([$("div").class("selection-label").content([i.isTagAntecedent()?$("span").class("tag-antecedent").self(n=>n.dom.innerHTML=i.antecedent.replaceAll(t,`${t}`)):null,$("div").class("label-container").content([i.isTagAntecedent()?$("ion-icon").name("arrow-forward-outline"):null,$("span").class("label").self(n=>n.dom.innerHTML=i.label.replaceAll(t,`${t}`))])]),i.isTag()?$("div").class("tag-detail").content([$("span").class("tag-post-count").content(it(i.post_count)),$("span").class("tag-category").content(K[i.category])]):null,i.isUser()?$("span").class("user-level").content(i.level):null]).on("click",()=>{this.$tagInput.addTag(i.value).input()})))}search(){return $.replace(`/posts?tags=${this.$tagInput.query.replace(":","%3A")}`),this.$tagInput.clearAll(),this.inactivate(),this}checkURL(t,s){if((t==null?void 0:t.hash)==="#search"&&this.inactivate(),s.hash==="#search"&&this.activate(),`${t==null?void 0:t.pathname}${t==null?void 0:t.search}`==`${s.pathname}${s.search}`)return;const i=s.searchParams.get("tags");this.$tagInput.clearAll(),i==null||i.split(" ").forEach(n=>this.$tagInput.addTag(n))}}class ye extends m{constructor(){super("selection-list");h(this,"focused",null);h(this,"selections",new Set)}addSelections(t){t=$.orArrayResolve(t);for(const s of t)this.selections.add(s);return this.insert(t),this}clearSelections(){return this.focused=null,this.selections.clear(),this.clear(),this}focusSelection(t){return this.blurSelection(),this.focused=t,t.focus(),t.offsetTopthis.scrollTop()+this.offsetHeight&&this.scrollTop(t.offsetTop+t.offsetHeight-this.offsetHeight),this}blurSelection(){var t;return(t=this.focused)==null||t.blur(),this.focused=null,this}focusNextSelection(){const t=this.selections.array,s=t.at(0);if(this.focused){const i=t.at(t.indexOf(this.focused)+1);i?this.focusSelection(i):s&&this.focusSelection(s)}else s&&this.focusSelection(s)}focusPrevSelection(){const t=this.selections.array;if(this.focused){const s=t.at(t.indexOf(this.focused)-1);s&&this.focusSelection(s)}else{const s=t.at(0);s&&this.focusSelection(s)}}}class we extends m{constructor(){super("selection");h(this,"property",{value:""})}value(t){return $.fluent(this,arguments,()=>this.property.value,()=>$.set(this.property,"value",t))}focus(){return this.addClass("active"),this}blur(){return this.removeClass("active"),this}}class be extends m{constructor(t){super("tag-input");h(this,"$input",$("input").type("text"));h(this,"$sizer",$("span").class("sizer"));h(this,"$inputor",$("div").class("input-wrapper").content([this.$sizer,this.$input.on("input",()=>{this.$sizer.content(this.$input.value())})]));h(this,"tags",new Set);h(this,"$seachbar");this.$seachbar=t}input(){return this.insert(this.$inputor),this.$input.focus(),this.$seachbar.$selectionList.clearSelections(),this.$seachbar.getSearchSuggestions(),this}addTag(t){if(t=t??this.$input.value(),!t.length)return this;const s=new _e(t);return s.on("click",()=>this.editTag(s)),this.tags.add(s),this.value(""),this.$input.inDOM()?this.$inputor.replace(s):this.insert(s),this}editTag(t){return this.addTag(),this.tags.delete(t),t.replace(this.$inputor),this.value(t.name),this.$input.focus(),this.$seachbar.getSearchSuggestions(),this}clearAll(){return this.value(""),this.tags.clear(),this.clear(),this}value(t){return t===void 0?this:(this.$input.value(t),this.$sizer.content(t),this)}focus(){return this.$input.focus(),this}get query(){return this.tags.array.map(t=>t.name).toString().replace(",","+")}}class _e extends m{constructor(t){super("tag");h(this,"name");this.name=t,this.build()}build(){this.content(this.name)}}class xe extends m{constructor(){super("ion-icon")}name(e){return this.attribute("name",e),this}size(e){return this.attribute("size",e),this}disable(e){return this.attribute("disable",e),this}link(e,t=!1){return this.on("click",()=>t?$.replace(e):$.open(e)),this}}class Te extends wt{constructor(){super();h(this,"$icon",$("ion-icon"));h(this,"$label",$("span"));this.addStaticClass("icon"),this.build()}build(){super.content([this.$icon.hide(!0),this.$label])}content(t){return this.$label.content(t),this}icon(t){return this.$icon.name(t).hide(!1),this}link(t,s=!1){return this.on("click",()=>s?$.replace(t):$.open(t)),this}}const Se=$("route").id("login").path("/login").builder(()=>{const[r,e]=[$.state(""),$.state("")];return[$("div").class("login-container").content([$("h1").content("Login"),$("div").class("username","input-container").content([$("label").for("username").content("Username"),$("input").type("text").id("username").value(r)]),$("div").class("api-key","input-container").content([$("label").for("api-key").content("API Key"),$("input").type("password").id("api-key").value(e)]),$("icon-button").content("Login").on("click",async()=>{await v.used.login(r.value,e.value),v.used.user&&(H.storageUserData={apiKey:e.value,username:r.value},r.set(""),e.set(""),$.replace("/"))}),$("icon-button").content("Create Account").icon("open-outline").on("click",()=>$.open("https://danbooru.donmai.us/users/new","_blank"))])]});class Ie extends m{constructor(){super("drawer");h(this,"$filter",$("div").class("filter"));h(this,"$container",$("div").class("drawer-container"));h(this,"pointers",$.pointers($(document.body)));h(this,"opened",!1);this.hide(!0),this.build()}build(){this.content([this.$container.content([$("div").class("user-info").hide(!0).self(t=>[v.events.on("login",s=>{t.content([$("div").content([$("h3").class("username").content(s.name$),$("div").class("user-detail").content([$("span").class("userid").content(`ID: ${s.id}`),$("span").class("level").content(["Level: ",s.level_string$])])]),$("div").class("user-nav").content([$("icon-button").title("Uploaded Posts").icon("image").content(s.post_upload_count$.convert(it)).link(`/posts?tags=user:${s.name}`,!0),$("icon-button").title("Favorites").icon("heart").content(s.favorite_count$.convert(it)).link(`/posts?tags=ordfav:${s.name}`,!0),$("icon-button").title("Forum Posts").icon("document-text").content(s.forum_post_count$.convert(it)).hide(!0)])]).hide(!1)}).on("logout",()=>{t.clear().hide(!0)})]),$("div").class("nav").content([$("icon-button").icon("log-in-outline").content("Login").link("/login",!0).self(t=>v.events.on("login",()=>t.hide(!0)).on("logout",()=>t.hide(!1))),$("icon-button").icon("log-in-outline").content("Logout").on("dblclick",()=>v.used.logout()).hide(!0).self(t=>v.events.on("login",()=>t.hide(!1)).on("logout",()=>t.hide(!0))),$("icon-button").icon("swap-horizontal").class("switch").content("Switch Booru").on("click",()=>{v.used===vt?v.set(Oe):v.set(vt),this.close()})])]),this.$filter.on("click",()=>$.back())]),this.pointers.on("move",t=>{var s;(s=$(":.viewer"))!=null&&s.contains(t.$target)||(t.$target.parent,!(t.type!=="pen"&&t.type!=="touch")&&(t.move_y>4||t.move_y<-4||(t.move_x<=-7&&(t.delete(),this.open()),t.move_x>=7&&(t.delete(),this.close()))))})}open(){return location.hash!=="#drawer"&&$.open(location.href+"#drawer"),this}close(){return location.hash==="#drawer"&&$.back(),this}activate(){this.opened=!0,this.hide(!1),this.$container.animate({transform:["translateX(100%)","translateX(0%)"]},{fill:"both",duration:300,easing:"ease"}),this.$filter.animate({opacity:[0,1]},{fill:"both",duration:300,easing:"ease"})}inactivate(){this.opened=!1,this.$container.animate({transform:["translateX(0%)","translateX(100%)"]},{fill:"both",duration:300,easing:"ease"},()=>this.hide(!this.opened)),this.$filter.animate({opacity:[1,0]},{fill:"both",duration:300,easing:"ease"})}checkURL(t,s){(t==null?void 0:t.hash)==="#drawer"&&this.inactivate(),s.hash==="#drawer"&&this.activate()}}$.registerTagName("ion-icon",xe);$.registerTagName("icon-button",Te);$.anchorHandler=r=>{$.open(r.href(),r.target())};const[vt,Oe]=[new v({origin:"https://danbooru.donmai.us",name:"Danbooru"}),new v({origin:"https://safebooru.donmai.us",name:"Safebooru"}),new v({origin:"https://testbooru.donmai.us",name:"Testbooru"})];v.set(v.manager.get(v.storageAPI??"")??vt);const at=new ve().hide(!0),yt=new Ie;$(document.body).content([$("nav").content([$("a").class("title").href("/").content([$("h1").class("booru-name").content(v.name$),$("h2").class("app").content([$("span").class("app-name").content("Viewer"),$("span").class("version").content("v0.9.0")])]),$("div").class("searchbar").content(["Search in ",v.name$]).self(r=>k.events.on("stateChange",({beforeURL:e,afterURL:t})=>{e.hash==="#search"&&r.hide(!1),t.hash==="#search"&&r.hide(!0)})).on("click",()=>at.open()),$("div").class("buttons").content([$("ion-icon").class("search").name("search-outline").title("Search").self(r=>k.events.on("stateChange",({beforeURL:e,afterURL:t})=>{e.hash==="#search"&&r.hide(!1),t.hash==="#search"&&r.hide(!0)})).on("click",()=>at.open()),$("a").content($("ion-icon").class("open").name("open-outline").title("Open in Original Site")).href(location.href.replace(location.origin,v.used.origin)).target("_blank"),$("ion-icon").class("copy").name("link-outline").title("Copy Page Link").hide(!1).on("click",(r,e)=>{navigator.clipboard.writeText(`${location.origin}${location.pathname}${location.search}`),e.name("checkmark-outline"),setTimeout(()=>{e.name("link-outline")},2e3)}),$("ion-icon").class("menu").name("menu-outline").title("Menu").hide(!1).self(r=>{v.events.on("login",()=>r.hide(!0)).on("logout",()=>r.hide(!1))}).on("click",()=>$.open(location.href+"#drawer")),$("div").class("account").hide(!0).title("Menu").self(r=>{v.events.on("login",e=>{r.content(e.name$.convert(t=>{var s;return((s=t.at(0))==null?void 0:s.toUpperCase())??""})).hide(!1)}).on("logout",()=>r.hide(!0))}).on("click",()=>yt.open())])]),at,yt,$("router").base("/").map([$("route").id("posts").path(["/","/posts"]).builder(()=>new Ot),$("route").id("posts").path("/posts?tags").builder(({query:r})=>{const e=new Ot({tags:r.tags});return[$("header").content([$("h2").content("Posts"),$("div").class("tags").self(t=>{r.tags.split("+").forEach(s=>{t.insert($("a").class("tag").content(decodeURIComponent(s)).href(`posts?tags=${s}`))})})]),$("div").class("no-post").hide(!0).self(t=>{t.on("startLoad",()=>t.hide(!0)),e.on("noPost",()=>t.hide(!1).content("No Posts")).on("post_error",s=>t.hide(!1).content(s))}),e]}),$e,Se]).on("beforeSwitch",r=>{r.preventDefault();function s(){var o;$(document.documentElement).css({scrollBehavior:"auto"});const n=$.call(()=>{switch(k.navigationDirection){case G.Forward:return["translateX(2%)","translateX(0%)"];case G.Back:return["translateX(-2%)","translateX(0%)"];case G.Replace:return""}});r.$view.content(r.nextContent),r.rendered(),(o=r.nextContent.element)==null||o.class("animated").animate({opacity:[0,1],transform:n},{duration:300,easing:"ease"},()=>{var a;r.switched(),$(document.documentElement).css({scrollBehavior:""}),(a=r.nextContent.element)==null||a.removeClass("animated")})}function i(){var o,a;$(document.documentElement).css({scrollBehavior:"auto"});const n=$.call(()=>{switch(k.navigationDirection){case G.Forward:return["translateX(0%)","translateX(-2%)"];case G.Back:return["translateX(0%)","translateX(2%)"];case G.Replace:return""}});(a=(o=r.previousContent)==null?void 0:o.element)==null||a.class("animated").animate({opacity:[1,0],transform:n},{duration:300,easing:"ease"},()=>{var l,u;(u=(l=r.previousContent)==null?void 0:l.element)==null||u.removeClass("animated"),s()})}r.previousContent?i():s()})]);k.events.on("stateChange",({beforeURL:r,afterURL:e})=>Wt(r,e));Wt(void 0,new URL(location.href));function Wt(r,e){at.checkURL(r,e),yt.checkURL(r,e)}$.keys($(window)).if(r=>{if(!($(r.target)instanceof P))return!0}).keydown(["q","Q"],r=>{r.preventDefault(),k.index!==0&&$.back()}).keydown(["e","E"],r=>{r.preventDefault(),k.forwardIndex!==0&&$.forward()}); diff --git a/dist/assets/index-ByWqsQtl.css b/dist/assets/index-ByWqsQtl.css new file mode 100644 index 0000000..91ae363 --- /dev/null +++ b/dist/assets/index-ByWqsQtl.css @@ -0,0 +1 @@ +layout.post-grid{margin-top:.4rem}layout.post-grid:has(post-tile[focus]) post-tile:not([focus]){opacity:.5}layout.post-grid:has(post-tile[focus]) post-tile:hover{opacity:1}post-tile{display:block;transition:.3s all ease;position:relative;transition:all .3s ease;border-radius:var(--border-radius-medium);overflow:hidden;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none;outline:transparent solid 2px}post-tile[focus]{outline:var(--secondary-color-9) solid 2px;transform:scale(1.02)}@media (hover: hover){post-tile:hover{transform:scale(1.02);z-index:1;box-shadow:0 0 10px color-mix(in srgb,var(--secondary-color-1) 50%,transparent)}}post-tile.loading{transition:none}post-tile:active{transform:scale(.95)}post-tile div.video-detail,post-tile div.gif-detail{position:absolute;background-color:var(--secondary-color-3);color:var(--primary-color);bottom:.3rem;right:.3rem;padding:.2em .4em;height:1rem;border-radius:var(--border-radius-small);font-size:12px;display:flex;align-items:center;gap:.2rem;z-index:2}post-tile div.video-detail ion-icon,post-tile div.gif-detail ion-icon{font-size:1.4rem}post-tile div.video-detail ion-icon[name=images-outline],post-tile div.gif-detail ion-icon[name=images-outline]{padding:.1rem;font-size:1rem}post-tile div.video-detail span.duration,post-tile div.gif-detail span.duration{text-transform:uppercase;z-index:2}post-tile a{background-color:transparent;padding:0;border-radius:0}post-tile a img{height:100%;width:100%;vertical-align:top;background-color:var(--secondary-color-1)}post-tile a video{height:100%;width:100%;object-fit:cover;position:absolute;z-index:1}searchbar{display:flex;align-items:center;flex-direction:column;width:100%;z-index:200;position:fixed;height:100%}searchbar div.input-container{margin-top:.4rem;background-color:color-mix(in srgb,var(--secondary-color-2) 100%,transparent);border-radius:var(--border-radius-small);font-size:1rem;width:500px;padding:.4rem;max-width:calc(100% - 2rem);box-sizing:border-box;z-index:201;display:flex;align-items:center;border:1px solid var(--secondary-color-4)}searchbar div.input-container:focus-within{outline:none}searchbar div.input-container tag-input{display:flex;gap:.4rem;width:100%;overflow:hidden;padding-inline:.4rem;box-sizing:border-box;cursor:text}searchbar div.input-container tag-input tag{display:inline-block;padding:.2rem .4rem;background-color:var(--secondary-color-4);color:var(--secondary-color-9);border-radius:var(--border-radius-small);cursor:pointer}searchbar div.input-container ion-icon{font-size:20px;color:var(--secondary-color-4);cursor:pointer}searchbar div.input-container ion-icon:hover{color:var(--secondary-color-9)}searchbar div.selection-list-container{overflow:hidden;border-radius:var(--border-radius-small);background-color:var(--secondary-color-1);z-index:201;max-width:calc(100% - 2rem);width:500px}searchbar div.selection-list-container selection-list{display:block;max-height:40vh;overflow-y:scroll;overflow-x:hidden;position:relative}searchbar div.selection-list-container selection-list::-webkit-scrollbar{width:4px}searchbar div.selection-list-container selection-list selection{display:flex;justify-content:space-between;align-items:center;padding:.4rem 1rem;cursor:pointer;gap:1rem}searchbar div.selection-list-container selection-list selection:hover{background-color:color-mix(in srgb,var(--secondary-color-3) 50%,transparent)}searchbar div.selection-list-container selection-list selection.active{background-color:var(--secondary-color-3)}searchbar div.selection-list-container selection-list selection div.selection-label{display:flex;flex-wrap:wrap;gap:.5rem}searchbar div.selection-list-container selection-list selection div.selection-label .label-container{display:flex;gap:.5rem;align-items:center}searchbar div.selection-list-container selection-list selection div.selection-label .label-container ion-icon{font-size:1rem}searchbar div.selection-list-container selection-list selection div.tag-detail{display:flex;align-items:center;gap:.5rem}searchbar div.selection-list-container selection-list selection div.tag-detail .tag-post-count{font-size:.8rem}searchbar div.selection-list-container selection-list selection .tag-category,searchbar div.selection-list-container selection-list selection .user-level{padding:.1rem .4rem;border-radius:var(--border-radius-small);font-size:.9rem;background-color:var(--secondary-color-4);color:var(--secondary-color-9)}searchbar div.filter{background-color:var(--secondary-color-1);opacity:.5;position:fixed;top:0;height:100%;width:100%;z-index:199}.input-wrapper{color:var(--primary-color);border:1px solid var(--secondary-color-9);border-radius:var(--border-radius-small);position:relative;box-sizing:border-box;line-height:1em;font-size:14px;padding:4px 8px;display:inline-block;max-width:100%;text-overflow:ellipsis}.input-wrapper span.sizer{font-family:inherit;white-space:pre;height:1em;display:inline-block;font-size:inherit;line-height:inherit;box-sizing:border-box;position:relative;opacity:0;min-width:2px;-webkit-user-select:none;user-select:none;vertical-align:top}.input-wrapper input{height:100%;text-overflow:ellipsis;font-family:inherit;background:none;color:inherit;top:0;left:0;font-size:inherit;line-height:inherit;padding:inherit;position:absolute;box-sizing:border-box;width:100%;border:none;outline:none}button.icon{display:flex;justify-content:center;align-items:center;gap:.4rem;padding:.8rem 1.2rem}button.icon ion-icon{font-size:1.4rem;color:inherit}button.icon.vertical{flex-direction:column}ion-icon{font-size:24px;color:var(--primary-color);cursor:pointer}ion-icon:hover{color:var(--secondary-color-9)}ion-icon[disable=true]{color:var(--primary-color-darker);pointer-events:none}drawer{position:fixed;top:0;left:0;display:flex;z-index:300;height:100%;width:100%;box-sizing:border-box;justify-content:end;align-items:center;padding:1rem}drawer div.drawer-container{width:300px;max-width:70%;height:100%;background-color:var(--secondary-color-1);border-radius:var(--border-radius-large);z-index:1;overflow:hidden}drawer div.drawer-container div.user-info{background-color:var(--secondary-color-2);padding:2rem}drawer div.drawer-container div.user-info .username{margin:0;color:var(--secondary-color-9);cursor:pointer}drawer div.drawer-container div.user-info div.user-detail{display:flex;gap:.5rem;margin-top:.2rem}drawer div.drawer-container div.user-info div.user-detail span{font-size:.8rem;color:var(--primary-color-dark);display:block;cursor:pointer}drawer div.drawer-container div.user-info div.user-nav{display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem;margin-top:1rem}drawer div.drawer-container div.nav{padding:2rem;display:flex;gap:1rem;flex-direction:column}drawer div.drawer-container div.nav button.icon{justify-content:start}drawer div.filter{position:absolute;top:0;left:0;height:100%;width:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--secondary-color-1) 50%,transparent),color-mix(in srgb,var(--secondary-color-0) 70%,transparent))}#post{padding:0;padding-top:var(--nav-height)}#post section{background-color:#2f2f45;border-radius:var(--border-radius-large);padding:20px}#post div.viewer{height:calc(100dvh - 2rem - var(--nav-height));display:flex;justify-content:center;align-items:center;background-color:#000;border-radius:var(--border-radius-large);overflow:hidden;width:calc(100vw - 300px - 4rem);margin:1rem;position:relative;transition:all .3s ease}@media (max-width: 800px){#post div.viewer{width:100%;height:calc(100dvh - var(--nav-height));border-radius:0;margin:0}}#post div.viewer img{max-width:100%;max-height:100%}#post div.viewer video{max-width:100%;max-height:100%;-webkit-user-drag:none;transition:all .3s ease}#post div.viewer div.viewer-panel{position:absolute;bottom:0;width:100%;z-index:1}#post div.viewer div.viewer-panel div.panel{width:100%;display:flex;justify-content:center;flex-direction:column;padding:1rem;gap:1rem;box-sizing:border-box}#post div.viewer div.viewer-panel div.panel video-controller{display:flex;flex-direction:column;gap:1rem;align-items:center;width:100%}#post div.viewer div.viewer-panel div.panel video-controller div.video-details{display:flex;align-items:center;justify-content:space-between;width:100%}#post div.viewer div.viewer-panel div.panel video-controller div.video-details div{display:flex;align-items:center;gap:1rem}#post div.viewer div.viewer-panel div.panel video-controller div.progressbar-container{height:2rem;width:100%;display:flex;touch-action:none;align-items:center}#post div.viewer div.viewer-panel div.panel video-controller div.progressbar-container div.progressbar{height:.4rem;width:100%;background-color:var(--secondary-color-1);flex-shrink:1;cursor:pointer}#post div.viewer div.viewer-panel div.panel video-controller div.progressbar-container div.progressbar div.progress{height:100%;background-color:var(--secondary-color-3);width:100px}#post div.viewer div.viewer-panel div.panel video-controller .play{flex-shrink:0}#post div.viewer div.viewer-panel div.panel div.buttons{width:100%;display:flex;justify-content:center;gap:2rem}#post div.viewer div.viewer-panel div.overlay{position:absolute;bottom:0;width:100%;height:200%;z-index:-1;background:linear-gradient(180deg,color-mix(in srgb,var(--secondary-color-1) 0%,transparent),color-mix(in srgb,var(--secondary-color-0) 70%,transparent))}#post div.content{width:calc(100vw - 300px - 2rem);display:flex;flex-direction:column;padding:1rem;box-sizing:border-box}@media (max-width: 800px){#post div.content{width:100%}}#post div.content::-webkit-scrollbar{background-color:#000;width:4px}#post div.content::-webkit-scrollbar-thumb{background-color:#aeaeec;border-radius:2px}#post div.content>h3{padding-left:1rem;margin-block:1rem}#post div.content section.commentary *{text-wrap:wrap;word-break:break-word}#post div.sidebar{--padding: 1rem;position:fixed;top:calc(var(--nav-height) + var(--padding));right:var(--padding);display:flex;flex-direction:column;gap:.4rem;width:300px;overflow:scroll;overflow-x:hidden;height:calc(100dvh - 2rem - var(--nav-height));border-radius:var(--border-radius-large);transition:all .3s ease}@media (max-width: 800px){#post div.sidebar{position:static;width:100%;overflow:visible;height:100%;padding:1rem;box-sizing:border-box}}#post div.sidebar::-webkit-scrollbar{background-color:#000;width:0px}#post div.sidebar::-webkit-scrollbar-thumb{background-color:#aeaeec}#post div.sidebar h3{padding-left:1rem;margin-block:.6rem}#post div.sidebar .post-info{background-color:#2f2f45;border-radius:var(--border-radius-large);padding:20px;display:flex;flex-direction:column;gap:.4rem}#post div.sidebar .post-info .buttons{display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem;margin-top:1rem}#post div.sidebar div.property{display:flex;gap:.6rem;align-items:center;width:100%}#post div.sidebar div.property span.property-name{flex-shrink:0}#post div.sidebar div.property div.property-values{display:flex;gap:.4rem;width:100%;overflow:hidden}#post div.sidebar div.property div.property-values span.property-value{padding:.2rem .4rem;background-color:var(--secondary-color-1);color:var(--primary-color-dark);border-radius:var(--border-radius-small);justify-content:space-between;flex-shrink:1;display:flex;align-items:center;overflow:hidden}#post div.sidebar div.property div.property-values span.property-value:has(ion-icon){flex-shrink:0}#post div.sidebar div.property div.property-values span.property-value *{display:block;overflow:hidden;text-wrap:nowrap;text-overflow:ellipsis;flex-shrink:1}#post div.sidebar div.property div.property-values span.property-value ion-icon{font-size:1rem;padding:4px;box-sizing:border-box}#post div.sidebar div.inline{display:flex;gap:1rem}#post div.sidebar div.post-tags{display:flex;flex-direction:column;gap:.2rem}#post div.sidebar div.post-tags div.tag{align-items:center}#post div.sidebar div.post-tags div.tag a.tag-name{word-break:break-word;text-decoration:none}#post div.sidebar div.post-tags div.tag span.tag-post-count{background-color:var(--secondary-color-3);color:var(--secondary-color-8);padding:0 4px;border-radius:var(--border-radius-small);font-size:12px;margin-left:.4rem}route#login{display:flex;justify-content:center;align-items:center;margin-top:5rem}route#login .login-container{padding:2rem;border:1px solid var(--secondary-color-9);border-radius:var(--border-radius-large);display:flex;flex-direction:column;justify-content:center;gap:1rem;max-width:400px;width:100%;box-sizing:border-box}route#login .login-container h1{margin:0}route#login .login-container .input-container{display:flex;flex-direction:column;gap:.5rem}route#login .login-container .input-container input{display:block}:root{--primary-color: #d1d1ee;--primary-color-dark: #9696b3;--primary-color-darker: #72728d;--secondary-color-9: #aeaeec;--secondary-color-8: #9a9ad6;--secondary-color-7: #7c7cb8;--secondary-color-6: #646497;--secondary-color-5: #545486;--secondary-color-4: #424268;--secondary-color-3: #3b3b66;--secondary-color-2: #24243b;--secondary-color-1: #1e1e2c;--secondary-color-0: #07070c;--shadow-color: #09090e50;--border-radius-small: .4rem;--border-radius-medium: .8rem;--border-radius-large: 1.2rem;--nav-height: 50px}html{overflow-x:hidden;font-size:14px;scroll-behavior:smooth}html ::-webkit-scrollbar{background-color:var(--secondary-color-1);width:8px}html ::-webkit-scrollbar-thumb{background-color:#aeaeec;border-radius:2px}body{overflow-x:hidden;background-color:var(--secondary-color-1);color:var(--primary-color);margin:0;font-family:Microsoft Yahei}nav{display:flex;width:100%;height:var(--nav-height);position:fixed;top:0;z-index:100;background-color:color-mix(in srgb,var(--secondary-color-1) 70%,transparent);justify-content:space-between;align-items:center;padding-inline:1rem;box-sizing:border-box;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}nav a.title{display:flex;align-items:center;gap:.4rem;text-decoration:none}nav a.title .booru-name{color:var(--secondary-color-9);margin:0}nav a.title .app{display:flex;align-items:center;border-radius:var(--border-radius-small);margin:0;gap:.4rem}nav a.title .app .version{color:var(--secondary-color-1);background-color:var(--secondary-color-9);padding:.2em .4em;border-radius:var(--border-radius-small);font-size:.8rem;font-weight:700}nav a.title .app .app-name{display:none;font-size:1rem;color:var(--secondary-color-9)}nav div.searchbar{padding:.4rem 10%;max-width:500px;background-color:color-mix(in srgb,var(--secondary-color-2) 30%,transparent);border:1px solid var(--primary-color-darker);border-radius:var(--border-radius-small);color:var(--primary-color-dark);transition:.3s all ease;cursor:pointer}nav div.searchbar:hover{color:var(--primary-color)}nav div.buttons{display:flex;align-items:center;gap:1rem}nav div.buttons ion-icon{transition:all .3s ease;border-radius:1rem;padding:.4rem}nav div.buttons ion-icon:hover{background-color:color-mix(in srgb,var(--secondary-color-3) 50%,transparent)}nav div.buttons ion-icon.search{display:none}nav div.buttons a{display:flex;justify-content:center;align-items:center}nav div.buttons div.account{height:2rem;width:2rem;display:flex;justify-content:center;align-items:center;border-radius:2rem;font-weight:bolder;color:var(--secondary-color-9);background-color:var(--secondary-color-4);-webkit-user-select:none;user-select:none;cursor:pointer}@media (max-width: 800px){nav div.searchbar{display:none}nav div.buttons ion-icon.search{display:inline-block}}router{display:block;position:relative}router route{display:block;position:relative;padding-inline:1rem;padding-top:var(--nav-height)}route#posts header{margin-bottom:1rem}route#posts header h2{margin:0}route#posts header div.tags{display:flex;flex-wrap:wrap;gap:.5rem}button{background-color:var(--secondary-color-4);color:var(--secondary-color-9);padding:.8rem 1.2rem;border-radius:1rem;border:none;cursor:pointer}button:hover{background-color:var(--secondary-color-6);color:var(--primary-color)}a{text-decoration:none;color:var(--secondary-color-9)}input{background-color:var(--secondary-color-2);border-radius:var(--border-radius-small);border:1px solid var(--secondary-color-3);font-size:.9rem;padding:.8rem 1.2rem;color:var(--primary-color);outline:none}input:focus{border-color:var(--secondary-color-9)} diff --git a/dist/assets/index-D689878Y.css b/dist/assets/index-D689878Y.css deleted file mode 100644 index d73ed5f..0000000 --- a/dist/assets/index-D689878Y.css +++ /dev/null @@ -1 +0,0 @@ -layout.post-grid{margin-top:.4rem}post-tile{display:block;transition:.3s all ease;position:relative;transition:all .3s ease;border-radius:var(--border-radius-medium);overflow:hidden;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none}@media (hover: hover){post-tile:hover{transform:scale(1.02);z-index:1;box-shadow:0 0 10px color-mix(in srgb,var(--secondary-color-1) 50%,transparent)}}post-tile.loading{transition:none}post-tile:active{transform:scale(.95)}post-tile div.video-detail,post-tile div.gif-detail{position:absolute;background-color:var(--secondary-color-3);color:var(--primary-color);bottom:.3rem;right:.3rem;padding:.2em .4em;height:1rem;border-radius:var(--border-radius-small);font-size:12px;display:flex;align-items:center;gap:.2rem;z-index:2}post-tile div.video-detail ion-icon,post-tile div.gif-detail ion-icon{font-size:1.4rem}post-tile div.video-detail ion-icon[name=images-outline],post-tile div.gif-detail ion-icon[name=images-outline]{padding:.1rem;font-size:1rem}post-tile div.video-detail span.duration,post-tile div.gif-detail span.duration{text-transform:uppercase;z-index:2}post-tile a{background-color:transparent;padding:0;border-radius:0}post-tile a img{height:100%;width:100%;vertical-align:top;background-color:var(--secondary-color-1)}post-tile a video{height:100%;width:100%;object-fit:cover;position:absolute;z-index:1}searchbar{display:flex;align-items:center;flex-direction:column;width:100%;z-index:200;position:fixed;height:100%}searchbar div.input-container{margin-top:.4rem;background-color:color-mix(in srgb,var(--secondary-color-2) 100%,transparent);border-radius:var(--border-radius-small);font-size:1rem;width:500px;padding:.4rem;max-width:calc(100% - 2rem);box-sizing:border-box;z-index:201;display:flex;align-items:center;border:1px solid var(--secondary-color-4)}searchbar div.input-container:focus-within{outline:none}searchbar div.input-container tag-input{display:flex;gap:.4rem;width:100%;overflow:hidden;padding-inline:.4rem;box-sizing:border-box;cursor:text}searchbar div.input-container tag-input tag{display:inline-block;padding:.2rem .4rem;background-color:var(--secondary-color-4);color:var(--secondary-color-9);border-radius:var(--border-radius-small);cursor:pointer}searchbar div.input-container ion-icon{font-size:20px;color:var(--secondary-color-4);cursor:pointer}searchbar div.input-container ion-icon:hover{color:var(--secondary-color-9)}searchbar div.selection-list-container{overflow:hidden;border-radius:var(--border-radius-small);background-color:var(--secondary-color-1);z-index:201;max-width:calc(100% - 2rem);width:500px}searchbar div.selection-list-container selection-list{display:block;max-height:40vh;overflow-y:scroll;overflow-x:hidden;position:relative}searchbar div.selection-list-container selection-list::-webkit-scrollbar{width:4px}searchbar div.selection-list-container selection-list selection{display:flex;justify-content:space-between;align-items:center;padding:.4rem 1rem;cursor:pointer;gap:1rem}searchbar div.selection-list-container selection-list selection:hover{background-color:color-mix(in srgb,var(--secondary-color-3) 50%,transparent)}searchbar div.selection-list-container selection-list selection.active{background-color:var(--secondary-color-3)}searchbar div.selection-list-container selection-list selection div.selection-label{display:flex;flex-wrap:wrap;gap:.5rem}searchbar div.selection-list-container selection-list selection div.selection-label .label-container{display:flex;gap:.5rem;align-items:center}searchbar div.selection-list-container selection-list selection div.selection-label .label-container ion-icon{font-size:1rem}searchbar div.selection-list-container selection-list selection div.tag-detail{display:flex;align-items:center;gap:.5rem}searchbar div.selection-list-container selection-list selection div.tag-detail .tag-post-count{font-size:.8rem}searchbar div.selection-list-container selection-list selection .tag-category,searchbar div.selection-list-container selection-list selection .user-level{padding:.1rem .4rem;border-radius:var(--border-radius-small);font-size:.9rem;background-color:var(--secondary-color-4);color:var(--secondary-color-9)}searchbar div.filter{background-color:var(--secondary-color-1);opacity:.5;position:fixed;top:0;height:100%;width:100%;z-index:199}.input-wrapper{color:var(--primary-color);border:1px solid var(--secondary-color-9);border-radius:var(--border-radius-small);position:relative;box-sizing:border-box;line-height:1em;font-size:14px;padding:4px 8px;display:inline-block;max-width:100%;text-overflow:ellipsis}.input-wrapper span.sizer{font-family:inherit;white-space:pre;height:1em;display:inline-block;font-size:inherit;line-height:inherit;box-sizing:border-box;position:relative;opacity:0;min-width:2px;-webkit-user-select:none;user-select:none;vertical-align:top}.input-wrapper input{height:100%;text-overflow:ellipsis;font-family:inherit;background:none;color:inherit;top:0;left:0;font-size:inherit;line-height:inherit;padding:inherit;position:absolute;box-sizing:border-box;width:100%;border:none;outline:none}button.icon{display:flex;justify-content:center;align-items:center;gap:.4rem;padding:.8rem 1.2rem}button.icon ion-icon{font-size:1.4rem;color:inherit}button.icon.vertical{flex-direction:column}ion-icon{font-size:24px;color:var(--primary-color);cursor:pointer}ion-icon:hover{color:var(--secondary-color-9)}ion-icon[disable=true]{color:var(--primary-color-darker);pointer-events:none}drawer{position:fixed;top:0;left:0;display:flex;z-index:300;height:100%;width:100%;box-sizing:border-box;justify-content:end;align-items:center;padding:1rem}drawer div.drawer-container{width:300px;max-width:70%;height:100%;background-color:var(--secondary-color-1);border-radius:var(--border-radius-large);z-index:1;overflow:hidden}drawer div.drawer-container div.user-info{background-color:var(--secondary-color-2);padding:2rem}drawer div.drawer-container div.user-info .username{margin:0;color:var(--secondary-color-9);cursor:pointer}drawer div.drawer-container div.user-info div.user-detail{display:flex;gap:.5rem;margin-top:.2rem}drawer div.drawer-container div.user-info div.user-detail span{font-size:.8rem;color:var(--primary-color-dark);display:block;cursor:pointer}drawer div.drawer-container div.user-info div.user-nav{display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem;margin-top:1rem}drawer div.drawer-container div.nav{padding:2rem;display:flex;gap:1rem;flex-direction:column}drawer div.drawer-container div.nav button.icon{justify-content:start}drawer div.filter{position:absolute;top:0;left:0;height:100%;width:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--secondary-color-1) 50%,transparent),color-mix(in srgb,var(--secondary-color-0) 70%,transparent))}#post{padding:0;padding-top:var(--nav-height)}#post section{background-color:#2f2f45;border-radius:var(--border-radius-large);padding:20px}#post div.viewer{height:calc(100dvh - 2rem - var(--nav-height));display:flex;justify-content:center;align-items:center;background-color:#000;border-radius:var(--border-radius-large);overflow:hidden;width:calc(100vw - 300px - 4rem);margin:1rem;position:relative;transition:all .3s ease}@media (max-width: 800px){#post div.viewer{width:100%;height:calc(100dvh - var(--nav-height));border-radius:0;margin:0}}#post div.viewer img{max-width:100%;max-height:100%}#post div.viewer video{max-width:100%;max-height:100%;-webkit-user-drag:none;transition:all .3s ease}#post div.viewer div.viewer-panel{position:absolute;bottom:0;width:100%;z-index:1}#post div.viewer div.viewer-panel div.panel{width:100%;display:flex;justify-content:center;flex-direction:column;padding:1rem;gap:1rem;box-sizing:border-box}#post div.viewer div.viewer-panel div.panel video-controller{display:flex;flex-direction:column;gap:1rem;align-items:center;width:100%}#post div.viewer div.viewer-panel div.panel video-controller div.video-details{display:flex;align-items:center;justify-content:space-between;width:100%}#post div.viewer div.viewer-panel div.panel video-controller div.video-details div{display:flex;align-items:center;gap:1rem}#post div.viewer div.viewer-panel div.panel video-controller div.progressbar-container{height:2rem;width:100%;display:flex;touch-action:none;align-items:center}#post div.viewer div.viewer-panel div.panel video-controller div.progressbar-container div.progressbar{height:.4rem;width:100%;background-color:var(--secondary-color-1);flex-shrink:1;cursor:pointer}#post div.viewer div.viewer-panel div.panel video-controller div.progressbar-container div.progressbar div.progress{height:100%;background-color:var(--secondary-color-3);width:100px}#post div.viewer div.viewer-panel div.panel video-controller .play{flex-shrink:0}#post div.viewer div.viewer-panel div.panel div.buttons{width:100%;display:flex;justify-content:center;gap:2rem}#post div.viewer div.viewer-panel div.overlay{position:absolute;bottom:0;width:100%;height:200%;z-index:-1;background:linear-gradient(180deg,color-mix(in srgb,var(--secondary-color-1) 0%,transparent),color-mix(in srgb,var(--secondary-color-0) 70%,transparent))}#post div.content{width:calc(100vw - 300px - 2rem);display:flex;flex-direction:column;padding:1rem;box-sizing:border-box}@media (max-width: 800px){#post div.content{width:100%}}#post div.content::-webkit-scrollbar{background-color:#000;width:4px}#post div.content::-webkit-scrollbar-thumb{background-color:#aeaeec;border-radius:2px}#post div.content>h3{padding-left:1rem;margin-block:1rem}#post div.content section.commentary *{text-wrap:wrap;word-break:break-word}#post div.sidebar{--padding: 1rem;position:fixed;top:calc(var(--nav-height) + var(--padding));right:var(--padding);display:flex;flex-direction:column;gap:.4rem;width:300px;overflow:scroll;overflow-x:hidden;height:calc(100dvh - 2rem - var(--nav-height));border-radius:var(--border-radius-large);transition:all .3s ease}@media (max-width: 800px){#post div.sidebar{position:static;width:100%;overflow:visible;height:100%;padding:1rem;box-sizing:border-box}}#post div.sidebar::-webkit-scrollbar{background-color:#000;width:0px}#post div.sidebar::-webkit-scrollbar-thumb{background-color:#aeaeec}#post div.sidebar h3{padding-left:1rem;margin-block:.6rem}#post div.sidebar .post-info{background-color:#2f2f45;border-radius:var(--border-radius-large);padding:20px;display:flex;flex-direction:column;gap:.4rem}#post div.sidebar .post-info .buttons{display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem;margin-top:1rem}#post div.sidebar div.property{display:flex;gap:.6rem;align-items:center;width:100%}#post div.sidebar div.property span.property-name{flex-shrink:0}#post div.sidebar div.property div.property-values{display:flex;gap:.4rem;width:100%;overflow:hidden}#post div.sidebar div.property div.property-values span.property-value{padding:.2rem .4rem;background-color:var(--secondary-color-1);color:var(--primary-color-dark);border-radius:var(--border-radius-small);justify-content:space-between;flex-shrink:1;display:flex;align-items:center;overflow:hidden}#post div.sidebar div.property div.property-values span.property-value:has(ion-icon){flex-shrink:0}#post div.sidebar div.property div.property-values span.property-value *{display:block;overflow:hidden;text-wrap:nowrap;text-overflow:ellipsis;flex-shrink:1}#post div.sidebar div.property div.property-values span.property-value ion-icon{font-size:1rem;padding:4px;box-sizing:border-box}#post div.sidebar div.inline{display:flex;gap:1rem}#post div.sidebar div.post-tags{display:flex;flex-direction:column;gap:.2rem}#post div.sidebar div.post-tags div.tag{align-items:center}#post div.sidebar div.post-tags div.tag a.tag-name{word-break:break-word;text-decoration:none}#post div.sidebar div.post-tags div.tag span.tag-post-count{background-color:var(--secondary-color-3);color:var(--secondary-color-8);padding:0 4px;border-radius:var(--border-radius-small);font-size:12px;margin-left:.4rem}route#login{display:flex;justify-content:center;align-items:center;margin-top:5rem}route#login .login-container{padding:2rem;border:1px solid var(--secondary-color-9);border-radius:var(--border-radius-large);display:flex;flex-direction:column;justify-content:center;gap:1rem;max-width:400px;width:100%;box-sizing:border-box}route#login .login-container h1{margin:0}route#login .login-container .input-container{display:flex;flex-direction:column;gap:.5rem}route#login .login-container .input-container input{display:block}:root{--primary-color: #d1d1ee;--primary-color-dark: #9696b3;--primary-color-darker: #72728d;--secondary-color-9: #aeaeec;--secondary-color-8: #9a9ad6;--secondary-color-7: #7c7cb8;--secondary-color-6: #646497;--secondary-color-5: #545486;--secondary-color-4: #424268;--secondary-color-3: #3b3b66;--secondary-color-2: #24243b;--secondary-color-1: #1e1e2c;--secondary-color-0: #07070c;--shadow-color: #09090e50;--border-radius-small: .4rem;--border-radius-medium: .8rem;--border-radius-large: 1.2rem;--nav-height: 50px}html{overflow-x:hidden;font-size:14px}html ::-webkit-scrollbar{background-color:var(--secondary-color-1);width:8px}html ::-webkit-scrollbar-thumb{background-color:#aeaeec;border-radius:2px}body{overflow-x:hidden;background-color:var(--secondary-color-1);color:var(--primary-color);margin:0;font-family:Microsoft Yahei}nav{display:flex;width:100%;height:var(--nav-height);position:fixed;top:0;z-index:100;background-color:color-mix(in srgb,var(--secondary-color-1) 70%,transparent);justify-content:space-between;align-items:center;padding-inline:1rem;box-sizing:border-box;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}nav a.title{display:flex;align-items:center;gap:.4rem;text-decoration:none}nav a.title .booru-name{color:var(--secondary-color-9);margin:0}nav a.title .app{display:flex;align-items:center;border-radius:var(--border-radius-small);margin:0;gap:.4rem}nav a.title .app .version{color:var(--secondary-color-1);background-color:var(--secondary-color-9);padding:.2em .4em;border-radius:var(--border-radius-small);font-size:.8rem;font-weight:700}nav a.title .app .app-name{display:none;font-size:1rem;color:var(--secondary-color-9)}nav div.searchbar{padding:.4rem 10%;max-width:500px;background-color:color-mix(in srgb,var(--secondary-color-2) 30%,transparent);border:1px solid var(--primary-color-darker);border-radius:var(--border-radius-small);color:var(--primary-color-dark);transition:.3s all ease;cursor:pointer}nav div.searchbar:hover{color:var(--primary-color)}nav div.buttons{display:flex;align-items:center;gap:1rem}nav div.buttons ion-icon{transition:all .3s ease;border-radius:1rem;padding:.4rem}nav div.buttons ion-icon:hover{background-color:color-mix(in srgb,var(--secondary-color-3) 50%,transparent)}nav div.buttons ion-icon.search{display:none}nav div.buttons a{display:flex;justify-content:center;align-items:center}nav div.buttons div.account{height:2rem;width:2rem;display:flex;justify-content:center;align-items:center;border-radius:2rem;font-weight:bolder;color:var(--secondary-color-9);background-color:var(--secondary-color-4);-webkit-user-select:none;user-select:none;cursor:pointer}@media (max-width: 800px){nav div.searchbar{display:none}nav div.buttons ion-icon.search{display:inline-block}}router{display:block;position:relative}router route{display:block;position:relative;padding-inline:1rem;padding-top:var(--nav-height)}route#posts header{margin-bottom:1rem}route#posts header h2{margin:0}route#posts header div.tags{display:flex;flex-wrap:wrap;gap:.5rem}button{background-color:var(--secondary-color-4);color:var(--secondary-color-9);padding:.8rem 1.2rem;border-radius:1rem;border:none;cursor:pointer}button:hover{background-color:var(--secondary-color-6);color:var(--primary-color)}a{text-decoration:none;color:var(--secondary-color-9)}input{background-color:var(--secondary-color-2);border-radius:var(--border-radius-small);border:1px solid var(--secondary-color-3);font-size:.9rem;padding:.8rem 1.2rem;color:var(--primary-color);outline:none}input:focus{border-color:var(--secondary-color-9)} diff --git a/dist/assets/index-D8tVsP8g.js b/dist/assets/index-D8tVsP8g.js deleted file mode 100644 index 77a2688..0000000 --- a/dist/assets/index-D8tVsP8g.js +++ /dev/null @@ -1 +0,0 @@ -var Ht=Object.defineProperty;var bt=r=>{throw TypeError(r)};var Ft=(r,e,t)=>e in r?Ht(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var h=(r,e,t)=>Ft(r,typeof e!="symbol"?e+"":e,t),_t=(r,e,t)=>e.has(r)||bt("Cannot "+t);var E=(r,e,t)=>(_t(r,e,"read from private field"),t?t.call(r):e.get(r)),Y=(r,e,t)=>e.has(r)?bt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),Z=(r,e,t,s)=>(_t(r,e,"write to private field"),s?s.call(r,t):e.set(r,t),t);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const n of i)if(n.type==="childList")for(const o of n.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function t(i){const n={};return i.integrity&&(n.integrity=i.integrity),i.referrerPolicy&&(n.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?n.credentials="include":i.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function s(i){if(i.ep)return;i.ep=!0;const n=t(i);fetch(i.href,n)}})();class G{constructor(){h(this,"__hidden",!1);h(this,"domEvents",{});h(this,"parent");h(this,"events",new K)}on(e,t,s){e=T.orArrayResolve(e);for(const i of e){this.domEvents[i]||(this.domEvents[i]=new Map);const n=o=>{t(o,this)};this.domEvents[i].set(t,n),this.events.on(i,t),this.dom.addEventListener(i,n,s)}return this}off(e,t,s){var n;const i=(n=this.domEvents[e])==null?void 0:n.get(t);return i&&this.dom.removeEventListener(e,i,s),this.events.off(e,t),this}once(e,t,s){const i=n=>{this.dom.removeEventListener(e,i,s),t(n,this)};return this.dom.addEventListener(e,i,s),this.events.once(e,t),this}hide(e,t=!0){return T.fluent(this,arguments,()=>this.__hidden,()=>{var s;if(e!==void 0)return e instanceof x?(this.__hidden=e.value,e.use(this,"hide")):this.__hidden=e,t&&((s=this.parent)==null||s.children.render()),this})}remove(){var e;return(e=this.parent)==null||e.children.remove(this).render(),this}replace(e){var t;return(t=this.parent)==null||t.children.replace(this,e).render(),this}contains(e){return e?e instanceof G?this.dom.contains(e.dom):e instanceof EventTarget?this.dom.contains(T(e).dom):this.dom.contains(e):!1}self(e){return e(this),this}inDOM(){return document.contains(this.dom)}isElement(){return this instanceof R}get element(){return this instanceof R?this:null}}class R extends G{constructor(t,s){super();h(this,"dom");h(this,"static_classes",new Set);this.dom=this.createDom(t,s),this.dom.$=this,this.setOptions(s)}createDom(t,s){return s!=null&&s.dom?s.dom:t==="svg"?document.createElementNS("http://www.w3.org/2000/svg","svg"):document.createElement((s==null?void 0:s.tagname)??t)}setOptions(t){return this.id(t==null?void 0:t.id),t&&t.class&&this.class(...t.class),this}id(t){return $.fluent(this,arguments,()=>this.dom.id,()=>$.set(this.dom,"id",t))}class(...t){return $.fluent(this,arguments,()=>this.dom.classList,()=>{this.dom.classList.forEach(s=>this.static_classes.has(s)??this.dom.classList.remove(s)),this.dom.classList.add(...t.detype())})}addClass(...t){return $.fluent(this,arguments,()=>this,()=>{this.dom.classList.add(...t.detype())})}removeClass(...t){return $.fluent(this,arguments,()=>this,()=>{this.dom.classList.remove(...t.detype())})}staticClass(...t){return $.fluent(this,arguments,()=>this.static_classes,()=>{this.removeClass(...this.static_classes),this.static_classes.clear(),this.addStaticClass(...t)})}addStaticClass(...t){return $.fluent(this,arguments,()=>this,()=>{t.detype().forEach(s=>this.static_classes.add(s)),this.addClass(...t)})}removeStaticClass(...t){return $.fluent(this,arguments,()=>this,()=>{t.detype().forEach(s=>this.static_classes.delete(s)),this.removeClass(...t)})}css(t){return $.fluent(this,arguments,()=>this.dom.style,()=>{Object.assign(this.dom.style,t)})}attribute(t,s){return arguments.length?arguments.length===1?t===void 0?null:this.dom.getAttribute(t):arguments.length===2?t?(s===null?this.dom.removeAttribute(t):s!==void 0&&this.dom.setAttribute(t,`${s}`),this):this:this:null}tabIndex(t){return $.fluent(this,arguments,()=>this.dom.tabIndex,()=>$.set(this.dom,"tabIndex",t))}focus(){return this.dom.focus(),this}blur(){return this.dom.blur(),this}animate(t,s,i){const n=this.dom.animate(t,s);return i&&(n.onfinish=()=>i(n)),n}getAnimations(t){return this.dom.getAnimations(t)}get dataset(){return this.dom.dataset}domRect(t){const s=this.dom.getBoundingClientRect();if(!t)return s;const i=t instanceof R?t.dom.getBoundingClientRect():t;return{...s,top:s.top-i.top,left:s.left-i.left,right:s.right-i.left,bottom:s.bottom-i.top,x:s.x-i.x,y:s.y-i.y}}}class et extends G{constructor(t){super();h(this,"dom");this.dom=t,this.dom.$=this}domRect(t){const s={bottom:innerHeight,height:innerHeight,left:0,right:innerWidth,top:0,width:innerWidth,x:0,y:0};if(!t)return s;const i=t instanceof R?t.dom.getBoundingClientRect():t;return{...s,top:s.top-i.top,left:s.left-i.left,right:s.right-i.left,bottom:s.bottom-i.top,x:s.x-i.x,y:s.y-i.y}}static from(t){return t.$ instanceof et?t.$:new et(t)}}const Vt="modulepreload",jt=function(r){return"/"+r},Tt={},Wt=function(e,t,s){let i=Promise.resolve();if(t&&t.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),a=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));i=Promise.allSettled(t.map(l=>{if(l=jt(l),l in Tt)return;Tt[l]=!0;const d=l.endsWith(".css"),c=d?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${c}`))return;const f=document.createElement("link");if(f.rel=d?"stylesheet":Vt,d||(f.as="script"),f.crossOrigin="",f.href=l,a&&f.setAttribute("nonce",a),document.head.appendChild(f),d)return new Promise((g,b)=>{f.addEventListener("load",g),f.addEventListener("error",()=>b(new Error(`Unable to preload CSS for ${l}`)))})}))}function n(o){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=o,window.dispatchEvent(a),!a.defaultPrevented)throw o}return i.then(o=>{for(const a of o||[])a.status==="rejected"&&n(a.reason);return e().catch(n)})};class Ut{constructor(e){h(this,"$container");h(this,"childList",new Set);this.$container=e}add(e,t=-1){if(t===-1||this.childList.size-1===t)this.childList.add(e);else{const s=[...this.childList];s.splice(t,0,e),this.childList.clear(),s.forEach(i=>this.childList.add(i))}e.parent=this.$container}remove(e){return this.childList.has(e)?(this.childList.delete(e),e.parent=void 0,this):this}removeAll(e=!0){this.childList.forEach(t=>this.remove(t)),e&&this.render()}replace(e,t){const s=this.array;return s.splice(s.indexOf(e),1,t),e.remove(),this.childList.clear(),s.forEach(i=>this.childList.add(i)),t.parent=this.$container,this}render(){const[e,t]=[this.array.map(i=>i.dom),Array.from(this.dom.childNodes)],s=[];for(;t.length||e.length;){const[i,n]=[t.at(0),e.at(0)];n?i?n!==i?(n.$.__hidden||(this.dom.insertBefore(n,i),s.push(n)),e.shift()):(n.$.__hidden&&this.dom.removeChild(n),e.shift(),t.shift()):(n.$.__hidden||this.dom.append(n),e.shift()):(i&&!s.includes(i)&&i.remove(),t.shift())}}indexOf(e){return this.array.indexOf(e)}get array(){return[...this.childList.values()]}get dom(){return this.$container.dom}}class x{constructor(e,t){h(this,"_value");h(this,"attributes",new Map);h(this,"linkStates",new Set);h(this,"options",{});this.set(e),t&&(this.options=t)}set(e){this._value=e,e instanceof x&&e.linkStates.add(this),this.update(),this.linkStates.forEach(t=>t.update())}static toJSON(e){const t={};for(let[s,i]of Object.entries(e))i instanceof x?i=i.toJSON():i instanceof Object&&x.toJSON(i),Object.assign(t,{[s]:i});return t}update(){for(const[e,t]of this.attributes.entries())for(const s of t)e[s]instanceof Function?this.options.format?e[s](this.options.format(this.value)):e[s](this.value):s in e&&(e[s]=this.value)}use(e,t){const s=this.attributes.get(e);s?s.add(t):this.attributes.set(e,new Set().add(t))}convert(e){return new x(this,{format:e})}get value(){return this._value instanceof x?this._value.value:this._value}toString(){return this.options.format?this.options.format(this.value):this.value instanceof Object?JSON.stringify(this.toJSON()):`${this.value}`}toJSON(){return this.value instanceof x?this.value.toJSON():this.value instanceof Object?x.toJSON(this.value):this.toString()}}class q extends G{constructor(t){super();h(this,"dom");this.dom=new Text(t),this.dom.$=this}content(t){return $.fluent(this,arguments,()=>this.dom.textContent,()=>$.set(this.dom,"textContent",t))}}class st extends R{constructor(e,t){super(e,t)}autocapitalize(e){return $.fluent(this,arguments,()=>this.dom.autocapitalize,()=>$.set(this.dom,"autocapitalize",e))}innerText(e){return $.fluent(this,arguments,()=>this.dom.innerText,()=>$.set(this.dom,"innerText",e))}title(e){return $.fluent(this,arguments,()=>this.dom.title,()=>$.set(this.dom,"title",e))}dir(e){return $.fluent(this,arguments,()=>this.dom.dir,()=>$.set(this.dom,"dir",e))}translate(e){return $.fluent(this,arguments,()=>this.dom.translate,()=>$.set(this.dom,"translate",e))}popover(e){return $.fluent(this,arguments,()=>this.dom.popover,()=>$.set(this.dom,"popover",e))}spellcheck(e){return $.fluent(this,arguments,()=>this.dom.spellcheck,()=>$.set(this.dom,"spellcheck",e))}inert(e){return $.fluent(this,arguments,()=>this.dom.inert,()=>$.set(this.dom,"inert",e))}lang(e){return $.fluent(this,arguments,()=>this.dom.lang,()=>$.set(this.dom,"lang",e))}draggable(e){return $.fluent(this,arguments,()=>this.dom.draggable,()=>$.set(this.dom,"draggable",e))}hidden(e){return $.fluent(this,arguments,()=>this.dom.hidden,()=>$.set(this.dom,"hidden",e))}click(){return this.dom.click(),this}attachInternals(){return this.dom.attachInternals()}hidePopover(){return this.dom.hidePopover(),this}showPopover(){return this.dom.showPopover(),this}togglePopover(){return this.dom.togglePopover(),this}get accessKeyLabel(){return this.dom.accessKeyLabel}get offsetHeight(){return this.dom.offsetHeight}get offsetLeft(){return this.dom.offsetLeft}get offsetParent(){return $(this.dom.offsetParent)}get offsetTop(){return this.dom.offsetTop}get offsetWidth(){return this.dom.offsetWidth}}class m extends st{constructor(t,s){super(t,s);h(this,"children",new Ut(this));h(this,"__position_cursor",0)}content(t){return $.fluent(this,arguments,()=>this,()=>{this.children.removeAll(!1),this.insert(t)})}insert(t,s=-1){return $.fluent(this,arguments,()=>this,async()=>{if(t instanceof Function){let i=t(this);i instanceof Promise?t=await i:t=i}else t instanceof Promise&&(t=await t);t=$.orArrayResolve(t),this.__position_cursor=s<0?this.children.array.length+s:s;for(const i of t)if(i!=null){if(i instanceof Array)this.insert(i,this.__position_cursor);else if(typeof i=="string")this.children.add(new q(i),s);else if(i instanceof x){const n=new q(i.toString());i.use(n,"content"),this.children.add(n,s)}else if(i instanceof Promise){const n=(await Wt(async()=>{const{$Async:a}=await Promise.resolve().then(()=>Yt);return{$Async:a}},void 0)).$Async,o=new n().await(i);this.children.add(o,s)}else this.children.add(i,s);this.__position_cursor+=1}this.children.render()})}clear(){return this.children.removeAll(),this}$(t){return $(this.dom.querySelector(t))}$all(t){return Array.from(this.dom.querySelectorAll(t)).map(s=>$(s))}get scrollHeight(){return this.dom.scrollHeight}get scrollWidth(){return this.dom.scrollWidth}scrollTop(t){return $.fluent(this,arguments,()=>this.dom.scrollTop,()=>$.set(this.dom,"scrollTop",t))}scrollLeft(t){return $.fluent(this,arguments,()=>this.dom.scrollLeft,()=>$.set(this.dom,"scrollLeft",t))}}class zt extends m{constructor(e){super("a",e),this.dom.addEventListener("click",t=>{$.anchorHandler&&this.href()&&(t.preventDefault(),$.anchorHandler(this,t))})}href(e){return $.fluent(this,arguments,()=>this.dom.href,()=>$.set(this.dom,"href",e))}target(e){return $.fluent(this,arguments,()=>this.dom.target??void 0,()=>{e&&(this.dom.target=e)})}}class Gt extends R{constructor(e,t){super(e,t)}}var O;(r=>{function e(a,l,d,c){return l.length?(c(),a):d()}r.fluent=e;function t(a){return a instanceof Array?a:[a]}r.orArrayResolve=t;function s(a,l){return t(l).forEach(d=>{Object.getOwnPropertyNames(d.prototype).forEach(c=>{c!=="constructor"&&Object.defineProperty(a.prototype,c,Object.getOwnPropertyDescriptor(d.prototype,c)||Object.create(null))})}),a}r.mixin=s;function i(a,l,d){d!==void 0&&(a[l]=d)}r.set=i;function n(a){return new x(a)}r.state=n;function o(a){if(a.$)return a.$;if(a.nodeName.toLowerCase()==="body")return new m("body",{dom:a});if(a.nodeName.toLowerCase()==="#document")return et.from(a);if(a instanceof HTMLElement){const l=$.TagNameElementMap[a.tagName.toLowerCase()],d=l===m?new l(a.tagName,{dom:a}):new l({dom:a});if(d instanceof m)for(const c of Array.from(d.dom.childNodes))d.children.add($(c));return d}else if(a instanceof Text){const l=new q(a.textContent??"");return l.dom=a,l}else if(a instanceof SVGElement&&a.tagName.toLowerCase()==="svg")return new Gt("svg",{dom:a});throw`$NODE.FROM: NOT SUPPORT TARGET ELEMENT TYPE (${a.nodeName})`}r.from=o})(O||(O={}));class A{static create(...e){const t=class{};return Object.getOwnPropertyNames(A.prototype).forEach(s=>{s!=="constructor"&&e.includes(s)&&Object.defineProperty(t.prototype,s,Object.getOwnPropertyDescriptor(A.prototype,s)||Object.create(null))}),t}disabled(e){return $.fluent(this,arguments,()=>this.dom.disabled,()=>$.set(this.dom,"disabled",e))}checkValidity(){return this.dom.checkValidity()}reportValidity(){return this.dom.reportValidity()}formAction(e){return $.fluent(this,arguments,()=>this.dom.formAction,()=>$.set(this.dom,"formAction",e))}formEnctype(e){return $.fluent(this,arguments,()=>this.dom.formEnctype,()=>$.set(this.dom,"formEnctype",e))}formMethod(e){return $.fluent(this,arguments,()=>this.dom.formMethod,()=>$.set(this.dom,"formMethod",e))}formNoValidate(e){return $.fluent(this,arguments,()=>this.dom.formNoValidate,()=>$.set(this.dom,"formNoValidate",e))}formTarget(e){return $.fluent(this,arguments,()=>this.dom.formTarget,()=>$.set(this.dom,"formTarget",e))}autocomplete(e){return $.fluent(this,arguments,()=>this.dom.autocomplete,()=>$.set(this.dom,"autocomplete",e))}name(e){return $.fluent(this,arguments,()=>this.dom.name,()=>$.set(this.dom,"name",e))}maxLength(e){return $.fluent(this,arguments,()=>this.dom.maxLength,()=>$.set(this.dom,"maxLength",e))}minLength(e){return $.fluent(this,arguments,()=>this.dom.minLength,()=>$.set(this.dom,"minLength",e))}required(e){return $.fluent(this,arguments,()=>this.dom.required,()=>$.set(this.dom,"required",e))}label(e){return $.fluent(this,arguments,()=>this.dom.label,()=>$.set(this.dom,"label",e))}get form(){return this.dom.form?$(this.dom.form):null}get validationMessage(){return this.dom.validationMessage}get validity(){return this.dom.validity}get willValidate(){return this.dom.willValidate}}class gt extends m{constructor(e){super("button",e)}type(e){return $.fluent(this,arguments,()=>this.dom.type,()=>$.set(this.dom,"type",e))}}O.mixin(gt,A.create("disabled","checkValidity","formAction","formEnctype","formMethod","formNoValidate","formTarget","reportValidity"));class xt extends m{constructor(e){super("form",e)}action(e){return $.fluent(this,arguments,()=>this.dom.formAction,()=>$.set(this.dom,"formAction",e))}enctype(e){return $.fluent(this,arguments,()=>this.dom.formEnctype,()=>$.set(this.dom,"formEnctype",e))}method(e){return $.fluent(this,arguments,()=>this.dom.formMethod,()=>$.set(this.dom,"formMethod",e))}noValidate(e){return $.fluent(this,arguments,()=>this.dom.formNoValidate,()=>$.set(this.dom,"formNoValidate",e))}acceptCharset(e){return $.fluent(this,arguments,()=>this.dom.acceptCharset,()=>$.set(this.dom,"acceptCharset",e))}target(e){return $.fluent(this,arguments,()=>this.dom.formTarget,()=>$.set(this.dom,"formTarget",e))}requestSubmit(){return this.dom.requestSubmit(),this}reset(){return this.dom.reset(),this}submit(){return this.dom.submit(),this}get length(){return this.dom.length}get elements(){return Array.from(this.dom.elements).map(e=>$(e))}}O.mixin(xt,A.create("checkValidity","reportValidity","autocomplete"));class N extends st{constructor(e){super("input",e)}value(e){return $.fluent(this,arguments,()=>this.type()==="number"?Number(this.dom.value):this.dom.value,()=>$.set(this.dom,"value",e,t=>{this.on("input",()=>{t.attributes.has(this.dom)!==!1&&(typeof t.value=="string"&&t.set(`${this.value()}`),typeof t.value=="number"&&t.set(Number(this.value())))})}))}type(e){return $.fluent(this,arguments,()=>this.dom.type,()=>$.set(this.dom,"type",e))}capture(e){return $.fluent(this,arguments,()=>this.dom.capture,()=>$.set(this.dom,"capture",e))}alt(e){return $.fluent(this,arguments,()=>this.dom.alt,()=>$.set(this.dom,"alt",e))}height(e){return $.fluent(this,arguments,()=>this.dom.height,()=>$.set(this.dom,"height",e))}width(e){return $.fluent(this,arguments,()=>this.dom.width,()=>$.set(this.dom,"width",e))}defaultValue(e){return $.fluent(this,arguments,()=>this.dom.defaultValue,()=>$.set(this.dom,"defaultValue",e))}dirName(e){return $.fluent(this,arguments,()=>this.dom.dirName,()=>$.set(this.dom,"dirName",e))}pattern(e){return $.fluent(this,arguments,()=>this.dom.pattern,()=>$.set(this.dom,"pattern",e))}placeholder(e){return $.fluent(this,arguments,()=>this.dom.placeholder,()=>$.set(this.dom,"placeholder",e))}readOnly(e){return $.fluent(this,arguments,()=>this.dom.readOnly,()=>$.set(this.dom,"readOnly",e))}selectionDirection(e){return $.fluent(this,arguments,()=>this.dom.selectionDirection,()=>$.set(this.dom,"selectionDirection",e))}selectionEnd(e){return $.fluent(this,arguments,()=>this.dom.selectionEnd,()=>$.set(this.dom,"selectionEnd",e))}selectionStart(e){return $.fluent(this,arguments,()=>this.dom.selectionStart,()=>$.set(this.dom,"selectionStart",e))}size(e){return $.fluent(this,arguments,()=>this.dom.size,()=>$.set(this.dom,"size",e))}src(e){return $.fluent(this,arguments,()=>this.dom.src,()=>$.set(this.dom,"src",e))}inputMode(e){return $.fluent(this,arguments,()=>this.dom.inputMode,()=>$.set(this.dom,"inputMode",e))}valueAsDate(e){return $.fluent(this,arguments,()=>this.dom.valueAsDate,()=>$.set(this.dom,"valueAsDate",e))}valueAsNumber(e){return $.fluent(this,arguments,()=>this.dom.valueAsNumber,()=>$.set(this.dom,"valueAsNumber",e))}webkitdirectory(e){return $.fluent(this,arguments,()=>this.dom.webkitdirectory,()=>$.set(this.dom,"webkitdirectory",e))}select(){return this.dom.select(),this}setCustomValidity(e){return this.dom.setCustomValidity(e),this}setRangeText(e,t,s,i){return typeof t=="number"&&typeof s=="number"&&this.dom.setRangeText(e,t,s,i),this.dom.setRangeText(e),this}setSelectionRange(e,t,s){return this.dom.setSelectionRange(e,t,s),this}showPicker(){return this.dom.showPicker(),this}get files(){return this.dom.files}get webkitEntries(){return this.dom.webkitEntries}get labels(){return Array.from(this.dom.labels??[]).map(e=>$(e))}}O.mixin(N,A.create("checkValidity","reportValidity","autocomplete","name","form","required","validationMessage","validity","willValidate","formAction","formEnctype","formMethod","formNoValidate","formTarget"));class Kt extends N{constructor(e){super(e),this.type("number")}static from(e){return $.mixin(N,this)}stepDown(){return this.dom.stepDown(),this}stepUp(){return this.dom.stepUp(),this}max(e){return $.fluent(this,arguments,()=>this.dom.max===""?null:parseInt(this.dom.min),()=>$.set(this.dom,"max",e==null?void 0:e.toString()))}min(e){return $.fluent(this,arguments,()=>this.dom.min===""?null:parseInt(this.dom.min),()=>$.set(this.dom,"min",e==null?void 0:e.toString()))}step(e){return $.fluent(this,arguments,()=>Number(this.dom.step),()=>$.set(this.dom,"step",e==null?void 0:e.toString()))}}class Xt extends N{constructor(e){super(e),this.type("radio")}static from(e){return $.mixin(N,this)}checked(e){return $.fluent(this,arguments,()=>this.dom.checked,()=>$.set(this.dom,"checked",e))}defaultChecked(e){return $.fluent(this,arguments,()=>this.dom.defaultChecked,()=>$.set(this.dom,"defaultChecked",e))}}class qt extends N{constructor(e){super(e),this.type("file")}static from(e){return $.mixin(N,this)}multiple(e){return $.fluent(this,arguments,()=>this.dom.multiple,()=>$.set(this.dom,"multiple",e))}accept(...e){return $.fluent(this,arguments,()=>this.dom.accept.split(","),()=>this.dom.accept=e.toString())}}O.mixin(N,[Kt,Xt,qt]);class Ot extends m{constructor(e){super("label",e)}for(e){return $.fluent(this,arguments,()=>this.dom.htmlFor,()=>{$.set(this.dom,"htmlFor",e)})}get control(){return this.dom.control}}O.mixin(Ot,A.create("form"));class Bt extends st{constructor(e){super("img",e)}async load(e){return new Promise(t=>{const s=this.once("load",()=>{t(s)});typeof e=="string"?s.src(e):e.then(i=>s.src(i))})}static resize(e,t){return new Promise(s=>{const i=new Image;if(i.addEventListener("load",()=>{const n=document.createElement("canvas"),o=n.getContext("2d");if(!o)throw"$Image.resize: context undefined";const a=i.width/i.height,[l,d,c]=[a>1,a<1,a===1],f=t instanceof Array?t[0]:d?t:t*a,g=t instanceof Array?t[1]:l?t:t/a;n.height=g,n.width=f,o.drawImage(i,0,0,f,g),s(n.toDataURL())},{once:!0}),e instanceof File){const n=new FileReader;n.addEventListener("load",()=>i.src=n.result),n.readAsDataURL(e)}else i.src=e})}alt(e){return $.fluent(this,arguments,()=>this.dom.alt,()=>$.set(this.dom,"alt",e))}crossOrigin(e){return $.fluent(this,arguments,()=>this.dom.crossOrigin,()=>$.set(this.dom,"crossOrigin",e))}decoding(e){return $.fluent(this,arguments,()=>this.dom.decoding,()=>$.set(this.dom,"decoding",e))}height(e){return $.fluent(this,arguments,()=>this.dom.height,()=>$.set(this.dom,"height",e))}isMap(e){return $.fluent(this,arguments,()=>this.dom.isMap,()=>$.set(this.dom,"isMap",e))}loading(e){return $.fluent(this,arguments,()=>this.dom.loading,()=>$.set(this.dom,"loading",e))}referrerPolicy(e){return $.fluent(this,arguments,()=>this.dom.referrerPolicy,()=>$.set(this.dom,"referrerPolicy",e))}sizes(e){return $.fluent(this,arguments,()=>this.dom.sizes,()=>$.set(this.dom,"sizes",e))}src(e){return $.fluent(this,arguments,()=>this.dom.src,()=>$.set(this.dom,"src",e))}srcset(e){return $.fluent(this,arguments,()=>this.dom.srcset,()=>$.set(this.dom,"srcset",e))}useMap(e){return $.fluent(this,arguments,()=>this.dom.useMap,()=>$.set(this.dom,"useMap",e))}width(e){return $.fluent(this,arguments,()=>this.dom.width,()=>$.set(this.dom,"width",e))}decode(){return this.dom.decode()}get complete(){return this.dom.complete}get currentSrc(){return this.dom.currentSrc}get naturalHeight(){return this.dom.naturalHeight}get naturalWidth(){return this.dom.naturalWidth}get x(){return this.dom.x}get y(){return this.dom.y}}class Qt extends m{constructor(e){super("canvas",e)}height(e){return $.fluent(this,arguments,()=>this.dom.height,()=>{$.set(this.dom,"height",e)})}width(e){return $.fluent(this,arguments,()=>this.dom.width,()=>{$.set(this.dom,"width",e)})}captureStream(e){return this.dom.captureStream(e)}getContext(e,t){return this.dom.getContext(e)}toBlob(e,t,s){return this.dom.toBlob(e,t,s),this}toDataURL(e,t){return this.dom.toDataURL(e,t)}transferControlToOffscreen(){return this.dom.transferControlToOffscreen()}}class Jt extends m{constructor(e){super("dialog",e)}open(e){return $.fluent(this,arguments,()=>this.dom.open,()=>$.set(this.dom,"open",e))}returnValue(e){return $.fluent(this,arguments,()=>this.dom.returnValue,()=>$.set(this.dom,"returnValue",e))}close(){return this.dom.close(),this}show(){return this.dom.show(),this}showModal(){return this.dom.showModal(),this}}class Mt extends m{constructor(e){super("select")}add(e){return this.insert(e),this}item(e){return $(this.dom.item(e))}namedItem(e){return $(this.dom.namedItem(e))}multiple(e){return $.fluent(this,arguments,()=>this.dom.multiple,()=>$.set(this.dom,"multiple",e))}get length(){return this.dom.length}get size(){return this.dom.size}get options(){return Array.from(this.dom.options).map(e=>$(e))}get selectedIndex(){return this.dom.selectedIndex}get selectedOptions(){return Array.from(this.dom.selectedOptions).map(e=>$(e))}value(e){return $.fluent(this,arguments,()=>this.dom.value,()=>$.set(this.dom,"value",e,t=>{this.on("input",()=>{t.attributes.has(this.dom)!==!1&&(typeof t.value=="string"&&t.set(`${this.value()}`),typeof t.value=="number"&&t.set(Number(this.value())))})}))}get labels(){return Array.from(this.dom.labels??[]).map(e=>$(e))}}O.mixin(Mt,A.create("checkValidity","reportValidity","autocomplete","name","form","required","disabled","validationMessage","validity","willValidate"));class Et extends m{constructor(e){super("option",e)}defaultSelected(e){return $.fluent(this,arguments,()=>this.dom.defaultSelected,()=>$.set(this.dom,"defaultSelected",e))}selected(e){return $.fluent(this,arguments,()=>this.dom.selected,()=>$.set(this.dom,"selected",e))}text(e){return $.fluent(this,arguments,()=>this.dom.text,()=>$.set(this.dom,"text",e))}value(e){return $.fluent(this,arguments,()=>this.dom.value,()=>$.set(this.dom,"value",e))}get form(){return this.dom.form?$(this.dom.form):null}get index(){return this.dom.index}}O.mixin(Et,A.create("form","disabled","label"));class Pt extends m{constructor(e){super("optgroup",e)}disabled(e){return $.fluent(this,arguments,()=>this.dom.disabled,()=>$.set(this.dom,"disabled",e))}}O.mixin(Pt,A.create("disabled","label"));class kt extends m{constructor(e){super("textarea",e)}cols(e){return $.fluent(this,arguments,()=>this.dom.cols,()=>$.set(this.dom,"cols",e))}wrap(e){return $.fluent(this,arguments,()=>this.dom.wrap,()=>$.set(this.dom,"wrap",e))}value(e){return $.fluent(this,arguments,()=>this.dom.value,()=>$.set(this.dom,"value",e))}defaultValue(e){return $.fluent(this,arguments,()=>this.dom.defaultValue,()=>$.set(this.dom,"defaultValue",e))}dirName(e){return $.fluent(this,arguments,()=>this.dom.dirName,()=>$.set(this.dom,"dirName",e))}placeholder(e){return $.fluent(this,arguments,()=>this.dom.placeholder,()=>$.set(this.dom,"placeholder",e))}readOnly(e){return $.fluent(this,arguments,()=>this.dom.readOnly,()=>$.set(this.dom,"readOnly",e))}selectionDirection(e){return $.fluent(this,arguments,()=>this.dom.selectionDirection,()=>$.set(this.dom,"selectionDirection",e))}selectionEnd(e){return $.fluent(this,arguments,()=>this.dom.selectionEnd,()=>$.set(this.dom,"selectionEnd",e))}selectionStart(e){return $.fluent(this,arguments,()=>this.dom.selectionStart,()=>$.set(this.dom,"selectionStart",e))}type(e){return $.fluent(this,arguments,()=>this.dom.type,()=>$.set(this.dom,"type",e))}inputMode(e){return $.fluent(this,arguments,()=>this.dom.inputMode,()=>$.set(this.dom,"inputMode",e))}select(){return this.dom.select(),this}setCustomValidity(e){return this.dom.setCustomValidity(e),this}setRangeText(e,t,s,i){return typeof t=="number"&&typeof s=="number"&&this.dom.setRangeText(e,t,s,i),this.dom.setRangeText(e),this}setSelectionRange(e,t,s){return this.dom.setSelectionRange(e,t,s),this}get labels(){return Array.from(this.dom.labels??[]).map(e=>$(e))}}O.mixin(kt,A.create("checkValidity","reportValidity","autocomplete","name","form","required","disabled","minLength","maxLength","validationMessage","validity","willValidate"));var it;class At extends m{constructor(t){super("async",t);Y(this,it,!1)}await(t){return t instanceof Function?t(this).then(s=>this._loaded(s)):t.then(s=>this._loaded(s)),this}_loaded(t){if(Z(this,it,!0),typeof t=="string")this.replace(new q(t));else if(t instanceof x){const s=new q(t.toString());t.use(s,"content"),this.replace(s)}else t==null?this.replace(new q(String(t))):this.replace(t);this.dom.dispatchEvent(new Event("load"))}get loaded(){return E(this,it)}}it=new WeakMap;const Yt=Object.freeze(Object.defineProperty({__proto__:null,$Async:At},Symbol.toStringTag,{value:"Module"}));class Zt extends R{constructor(e,t){super(e,t)}autoplay(e){return $.fluent(this,arguments,()=>this.dom.autoplay,()=>$.set(this.dom,"autoplay",e))}get buffered(){return this.dom.buffered}controls(e){return $.fluent(this,arguments,()=>this.dom.controls,()=>$.set(this.dom,"controls",e))}crossOrigin(e){return $.fluent(this,arguments,()=>this.dom.crossOrigin,()=>$.set(this.dom,"crossOrigin",e))}get currentSrc(){return this.dom.currentSrc}currentTime(e){return $.fluent(this,arguments,()=>this.dom.currentTime,()=>$.set(this.dom,"currentTime",e))}defaultMuted(e){return $.fluent(this,arguments,()=>this.dom.defaultMuted,()=>$.set(this.dom,"defaultMuted",e))}defaultPlaybackRate(e){return $.fluent(this,arguments,()=>this.dom.defaultPlaybackRate,()=>$.set(this.dom,"defaultPlaybackRate",e))}disableRemotePlayback(e){return $.fluent(this,arguments,()=>this.dom.disableRemotePlayback,()=>$.set(this.dom,"disableRemotePlayback",e))}get duration(){return this.dom.duration}get ended(){return this.dom.ended}get error(){return this.dom.error}loop(e){return $.fluent(this,arguments,()=>this.dom.loop,()=>$.set(this.dom,"loop",e))}mediaKeys(e){return $.fluent(this,arguments,()=>this.dom.mediaKeys,()=>$.set(this.dom,"setMediaKeys",[e]))}muted(e){return $.fluent(this,arguments,()=>this.dom.muted,()=>$.set(this.dom,"muted",e))}get networkState(){return this.dom.networkState}get paused(){return this.dom.paused}playbackRate(e){return $.fluent(this,arguments,()=>this.dom.playbackRate,()=>$.set(this.dom,"playbackRate",e))}get played(){return this.dom.played}preload(e){return $.fluent(this,arguments,()=>this.dom.preload,()=>$.set(this.dom,"preload",e))}preservesPitch(e){return $.fluent(this,arguments,()=>this.dom.preservesPitch,()=>$.set(this.dom,"preservesPitch",e))}get readyState(){return this.dom.readyState}get remote(){return this.dom.remote}get seekable(){return this.dom.seekable}get seeking(){return this.dom.seeking}sinkId(e){return $.fluent(this,arguments,()=>this.dom.sinkId,()=>$.set(this.dom,"setSinkId",[e]))}src(e){return $.fluent(this,arguments,()=>this.dom.src,()=>$.set(this.dom,"src",e))}srcObject(e){return $.fluent(this,arguments,()=>this.dom.srcObject,()=>$.set(this.dom,"srcObject",e))}get textTracks(){return this.dom.textTracks}volume(e){return $.fluent(this,arguments,()=>this.dom.volume,()=>$.set(this.dom,"volume",e))}addTextTrack(e,t,s){return this.dom.addTextTrack(e,t,s)}canPlayType(e){return this.dom.canPlayType(e)}fastSeek(e){return this.dom.fastSeek(e),this}load(){return this.dom.load(),this}pause(){return this.dom.pause(),this}async play(){return await this.dom.play(),this}get isPlaying(){return this.currentTime()>0&&!this.paused&&!this.ended&&this.readyState>2}}class te extends Zt{constructor(e){super("video",e)}disablePictureInPicture(e){return $.fluent(this,arguments,()=>this.dom.disablePictureInPicture,()=>$.set(this.dom,"disablePictureInPicture",e))}height(e){return $.fluent(this,arguments,()=>this.dom.height,()=>$.set(this.dom,"height",e))}width(e){return $.fluent(this,arguments,()=>this.dom.width,()=>$.set(this.dom,"width",e))}playsInline(e){return $.fluent(this,arguments,()=>this.dom.playsInline,()=>$.set(this.dom,"playsInline",e))}poster(e){return $.fluent(this,arguments,()=>this.dom.poster,()=>$.set(this.dom,"poster",e))}get videoHeight(){return this.dom.videoHeight}get videoWidth(){return this.dom.videoWidth}cancelVideoFrameCallback(e){return this.dom.cancelVideoFrameCallback(e),this}getVideoPlaybackQuality(){return this.dom.getVideoPlaybackQuality()}requestPictureInPicture(){return this.dom.requestPictureInPicture()}requestVideoFrameCallback(e){return this.dom.requestVideoFrameCallback(e)}}function T(r){if(typeof r>"u"||r===null||r instanceof G)return r;if(typeof r=="string"){if(r.startsWith("::"))return Array.from(document.querySelectorAll(r.replace(/^::/,""))).map(e=>T(e));if(r.startsWith(":"))return T(document.querySelector(r.replace(/^:/,"")));if(r in T.TagNameElementMap){const e=T.TagNameElementMap[r];return e===st?new st(r):e===m?new m(r):new e}else return new m(r)}if(r instanceof Node)return r.$?r.$:O.from(r);throw`$: NOT SUPPORT TARGET ELEMENT TYPE ('${r}')`}(r=>{r.anchorHandler=null,r.TagNameElementMap={html:m,head:m,document:et,body:m,a:zt,p:m,pre:m,code:m,blockquote:m,strong:m,h1:m,h2:m,h3:m,h4:m,h5:m,h6:m,div:m,ol:m,ul:m,dl:m,li:m,input:N,label:Ot,button:gt,form:xt,img:Bt,dialog:Jt,canvas:Qt,select:Mt,option:Et,optgroup:Pt,textarea:kt,video:te,async:At};function e(u,p,w,S){return p.length?(S(),u):w()}r.fluent=e;function t(u){return u instanceof Array?u:[u]}r.orArrayResolve=t;function s(u,p){return O.mixin(u,p)}r.mixin=s;function i(u,p,w,S){if(w!==void 0){if(w instanceof x){w.use(u,p),u[p]instanceof Function?u[p](...w.value):u[p]=w.value,S&&S(w);return}u[p]instanceof Function?u[p](...w):u[p]=w}}r.set=i;function n(u,p){return new x(u,p)}r.state=n;async function o(u,p){return new Promise(w=>{const S=new FileReader;S.onload=I=>{const _=r("img");if(_.once("load",H=>{const j=r("canvas"),W=j.getContext("2d"),M=_.height()/_.width(),[X,J]=[M>1?p/M:p,M>1?p:p*M];j.height(J).width(X),W==null||W.drawImage(_.dom,0,0,X,J),w(j.toDataURL(u.type))}),!I.target)throw"$.resize(): e.target is null";_.src(I.target.result)},S.readAsDataURL(u)})}r.resize=o;function a(u=1){return parseInt(getComputedStyle(document.documentElement).fontSize)*u}r.rem=a;function l(u){const p=new DOMParser().parseFromString(u,"text/html").body;return Array.from(p.children).map(w=>r(w))}r.html=l;function d(u,p,w){if(typeof p=="number")return Array(p).fill("").map(I=>{const _=S(u)?u[0](...u.slice(1)):r(u);return w&&w(_),_});{const I=[];for(const _ of p){const H=u instanceof Function?u(..._):S(u)?u[0](...u.slice(1)):r(u);_ instanceof Function?_(H):(_ instanceof G||typeof _=="string")&&H.content(_),I.push(H)}return I}function S(I){return I instanceof Array&&I[0]instanceof Function}}r.builder=d;function c(u,p){return Object.assign(r.TagNameElementMap,{[u]:p}),r.TagNameElementMap}r.registerTagName=c;function f(){return new K}r.events=f;function g(u){return new ee(u)}r.pointers=g;function b(u){return u()}r.call=b})(T||(T={}));globalThis.$=T;class K{constructor(){h(this,"eventMap",new Map)}fire(e,...t){var s;return(s=this.eventMap.get(e))==null||s.forEach(i=>i(...t)),this}on(e,t){const s=this.eventMap.get(e)??this.eventMap.set(e,new Set).get(e);return s==null||s.add(t),this}off(e,t){var s;return(s=this.eventMap.get(e))==null||s.delete(t),this}once(e,t){const s=(...n)=>{var o;(o=this.eventMap.get(e))==null||o.delete(s),t(...n)},i=this.eventMap.get(e)??this.eventMap.set(e,new Set).get(e);return i==null||i.add(s),this}}class ee extends K{constructor(t){super();h(this,"$node");h(this,"map",new Map);this.$node=t,this.$node.on("pointerdown",s=>this.down(s)),this.$node.on("pointerup",s=>this.up(s)),this.$node.on("pointermove",s=>this.move(s)),this.$node.on("pointercancel",s=>this.cancel(s))}down(t){const s=new se(this,this.toData(t),$(t.target));this.map.set(s.id,s),this.fire("down",s,t)}up(t){const s=this.map.get(t.pointerId);s&&(this.map.delete(t.pointerId),this.fire("up",s,t))}move(t){const s=this.map.get(t.pointerId);s&&(this.map.set(s.id,s),s.update(this.toData(t)),this.fire("move",s,t))}cancel(t){const s=this.map.get(t.pointerId);s&&(s.update(this.toData(t)),this.map.delete(s.id),this.fire("cancel",s,t))}toData(t){return{id:t.pointerId,type:t.pointerType,width:t.width,height:t.height,x:t.x,y:t.y,movement_x:t.movementX,movement_y:t.movementY}}}class se{constructor(e,t,s){h(this,"initial_x");h(this,"initial_y");h(this,"$target");h(this,"manager");Object.assign(this,t),this.manager=e,this.$target=s,this.initial_x=t.x,this.initial_y=t.y}get move_x(){return this.x-this.initial_x}get move_y(){return this.y-this.initial_y}update(e){return Object.assign(this,e),this}delete(){return this.manager.map.delete(this.id),this}}Array.prototype.detype=function(...r){return this.filter(e=>{if(r.length)for(const t of r)return typeof e!=typeof t;else return e!==void 0})};Object.defineProperties(Set.prototype,{array:{get:function(){return Array.from(this)}}});Set.prototype.sort=function(r){return this.array.sort(r)};class Lt extends m{constructor(t){super("layout",t);h(this,"_property",{ROW_MAX_HEIGHT:200,GAP:0,IS_RENDERING:!1,RENDER_REQUEST:!1,COLUNM:1,TYPE:"justified",ROOT:null,ITEM_PROPERTIES:new Map});this.css({display:"block",position:"relative"}),new ResizeObserver(s=>{this.inDOM()&&(this.render(),this.dom.dispatchEvent(new Event("resize")))}).observe(this.dom),document.addEventListener("scroll",s=>{s.target===this.root().dom&&this.scrollCompute()},{passive:!0}),new IntersectionObserver(s=>{this.inDOM()&&this.render()}).observe(this.dom)}type(t){return $.fluent(this,arguments,()=>this._property.TYPE,()=>$.set(this._property,"TYPE",t))}maxHeight(t){return $.fluent(this,arguments,()=>this._property.ROW_MAX_HEIGHT,()=>$.set(this._property,"ROW_MAX_HEIGHT",t))}column(t){return $.fluent(this,arguments,()=>this._property.COLUNM,()=>$.set(this._property,"COLUNM",t))}gap(t){return $.fluent(this,arguments,()=>this._property.GAP,()=>$.set(this._property,"GAP",t))}root(t){return $.fluent(this,arguments,()=>this._property.ROOT??$(document),()=>$.set(this._property,"ROOT",t))}get COL_WIDTH(){return(this.offsetWidth-this._property.GAP*(this._property.COLUNM-1))/this._property.COLUNM}justifiedCompute(){const t=[],s=this.offsetWidth;for(const i of this.children.array){const n=$(i);if(!(n instanceof R))continue;const o=n.attribute("layout-item-ratio"),a=o?parseFloat(o):n.dom.offsetWidth/n.dom.offsetHeight,l={$node:n,ratio:a};let d=t.at(-1);(!d||d.heightc+=b.ratio);const f=c+a,g=(s-this._property.GAP*d.items.length)/f;d.items.push(l),d.ratio=f,d.height=g}return t}waterfallCompute(){const t=[],s=this.COL_WIDTH,i=()=>{if(t.lengthn.height-o.height)[0]};for(const n of this.children.array){const o=$(n);if(!(o instanceof R))continue;const a=o.attribute("layout-item-ratio"),l=a?parseFloat(a):o.dom.offsetWidth/o.dom.offsetHeight,d={$node:o,ratio:l},c=i();let f=0;c.items.forEach(u=>f+=u.ratio);const g=s/(c.height+s/l),b=s/g;c.items.push(d),c.ratio=g,c.height=b}return t}render(){if(!this.inDOM())return this;if(this._property.ITEM_PROPERTIES.clear(),this._property.TYPE==="justified"){const t=this.justifiedCompute();let s=0;for(const i of t){let n=0;i.height>this._property.ROW_MAX_HEIGHT&&(i.height=this._property.ROW_MAX_HEIGHT);for(const o of i.items){const a=o.ratio*i.height;o.$node.css({position:"absolute",height:`${i.height}px`,width:`${a}px`,top:`${s}px`,left:`${n}px`}),o.$node.attribute("layout-item-ratio",o.ratio),this._property.ITEM_PROPERTIES.set(o.$node,{height:i.height,width:a,top:s,left:n,ratio:o.ratio,$node:o.$node}),n+=i.height*o.ratio+this._property.GAP}s+=i.height+this._property.GAP}this.css({height:`${s}px`})}else if(this._property.TYPE="waterfall"){const t=this.waterfallCompute(),s=this.COL_WIDTH;let i=0;for(const n of t){let o=0;for(const a of n.items){const l=s/a.ratio;a.$node.css({position:"absolute",height:`${l}px`,width:`${s}px`,top:`${o}px`,left:`${i}px`}),a.$node.attribute("layout-item-ratio",a.ratio),this._property.ITEM_PROPERTIES.set(a.$node,{height:l,width:s,top:o,left:i,ratio:a.ratio,$node:a.$node}),o+=l+this._property.GAP}i+=s+this._property.GAP}if(t.length){const n=t.sort((o,a)=>a.height-o.height)[0];this.css({height:`${n.height+n.items.length*this._property.GAP}px`})}else this.css({height:""})}return this.scrollCompute(),this}scrollCompute(){if(this.inDOM()===!1)return;const t=document.documentElement.scrollTop-this.dom.offsetTop;this._property.ITEM_PROPERTIES.forEach((s,i)=>{const n=s.top;s.top+s.height>t&&n{this.contentId=t,this.events.fire("rendered",{$view:this,previousContent:i,nextContent:s})},a=()=>{this.events.fire("afterSwitch",{$view:this,previousId:t})};return this.events.fire("beforeSwitch",{$view:this,preventDefault:()=>n=!0,targetId:t,previousContent:i,nextContent:s,switched:a,rendered:o}),n||(this.content(s),o(),a()),this}get currentContent(){if(this.contentId)return this.viewCache.get(this.contentId)}}$.registerTagName("view",Ct);var F;const y=class y extends Ct{constructor(t){super({tagname:"router",...t});Y(this,F,"");h(this,"routes",new Map);y.routers.add(this)}base(t){return $.fluent(this,arguments,()=>E(this,F),()=>{Z(this,F,t??E(this,F))})}map(t){t=$.orArrayResolve(t);for(const s of t)s instanceof Array?this.map(s):this.routes.set(s.path(),s);return this.resolve(),this}resolve(){return new Promise(t=>{if(!location.pathname.startsWith(E(this,F)))return t(2);const s=location.pathname.replace(E(this,F),"/").replace("//","/"),i=s.split("/").map(u=>`/${u}`),n=location.search,o=new Map(n.replace("?","").split("&").map(u=>u.split("="))),l=(()=>{const u=[];for(const[p,w]of this.routes){const S=$.orArrayResolve(p);for(const I of S){let _=0,H={},j={};const W=I.split("/").map(M=>`/${M}`);if(!(i.length{const wt=o.get(yt);wt!==void 0&&_++,Object.assign(j,{[yt]:wt})}),X.startsWith("/:")){_++,Object.assign(H,{[X.replace("/:","")]:i[M].replace("/","")});continue}else if(I.startsWith("#")&&I===location.hash){_++;continue}else if(X===i[M]){_++;continue}else break}u.push({deep:_,$route:w,params:H,query:j,routePath:I,pathId:Object.keys(j).length!==0?s+n:Object.keys(H).length!==0?s:S[0]})}}}return u.sort((p,w)=>w.deep-p.deep).at(0)})();if(!l)return t(1);const{$route:d,params:c,pathId:f,query:g}=l;if(f===this.contentId)return t(0);this.events.once("rendered",({nextContent:u,previousContent:p})=>{p==null||p.events.fire("afterShift",{$route:p}),u.events.fire("rendered",{$route:u}),t(0)});const b=this.viewCache.get(f)??d.build({params:c,query:g});this.viewCache.has(f)||this.setView(f,b),this.events.once("beforeSwitch",()=>{var u;b.events.fire("beforeShift",{$route:b}),(u=this.currentContent)==null||u.events.fire("beforeShift",{$route:this.currentContent})}),this.events.once("afterSwitch",()=>b.events.fire("afterShift",{$route:b})),this.switchView(f)})}static init(){if(!history.state||!("index"in history.state)){const t={index:y.historyIndex};history.replaceState(t,"")}else y.historyIndex=history.state.index;return y.navigationDirection=0,y.resolve(),window.addEventListener("popstate",()=>y.popstate()),window.addEventListener("scroll",()=>{this.setScrollHistory(this.historyIndex,location.href,document.documentElement.scrollTop)},{passive:!0}),history.scrollRestoration="manual",this}static open(t,s){return t===void 0?this:(t=this.urlResolver(t),t.href===this.url.href?this:t.origin!==this.url.origin?(window.open(t,s),this):(y.clearForwardScrollHistory(),y.historyIndex++,history.pushState(y.historyState,"",t),y.stateChange(0),y.resolve(),this))}static back(){return this.historyIndex--,history.back(),this}static replace(t){return t===void 0?this:(t=this.urlResolver(t),history.replaceState(y.historyState,"",t),this.stateChange(2),this.setScrollHistory(this.historyIndex,location.href,0),y.resolve(),this)}static urlResolver(t){return t instanceof URL?t:(t.startsWith("/")&&(t=`${location.origin}${t}`),t.startsWith("#")&&(t=`${location.origin}${location.pathname}${t}`),new URL(t))}static popstate(){const t=history.state.index>y.historyIndex?0:history.state.indext.resolve())),this.scrollRestoration(),this.setScrollHistory(this.historyIndex,location.href,document.documentElement.scrollTop)}static get historyState(){return{index:y.historyIndex}}static stateChange(t){const s=this.url,i=new URL(location.href);this.url=i,y.events.fire("stateChange",{beforeURL:s,afterURL:i,direction:t}),y.navigationDirection=t}static setScrollHistory(t,s,i){const n=this.getScrollHistory();if(!n)return sessionStorage.setItem(this.scrollHistoryKey,JSON.stringify({[t]:{url:s,value:i}}));n[t]={url:s,value:i},sessionStorage.setItem(this.scrollHistoryKey,JSON.stringify(n))}static getScrollHistory(){const t=sessionStorage.getItem(this.scrollHistoryKey);if(t)return JSON.parse(t)}static clearForwardScrollHistory(){const t=this.getScrollHistory();if(t)for(const s in t)Number(s)>this.historyIndex&&delete t[s],sessionStorage.setItem(this.scrollHistoryKey,JSON.stringify(t))}static scrollRestoration(){const t=this.getScrollHistory();if(t&&t[this.historyIndex])document.documentElement.scrollTop=t[this.historyIndex].value??0;else if(location.hash.length){const s=$(document.body).$(location.hash);s&&(document.documentElement.scrollTop=s.dom.offsetTop)}else document.documentElement.scrollTop=0}};F=new WeakMap,h(y,"routers",new Set),h(y,"events",new K),h(y,"navigationDirection"),h(y,"historyIndex",0),h(y,"url",new URL(location.href)),h(y,"scrollHistoryKey","$ROUTER_SCROLL_HISTORY");let k=y;var U=(r=>(r[r.Forward=0]="Forward",r[r.Back=1]="Back",r[r.Replace=2]="Replace",r))(U||{});k.init();var Q,V;const vt=class vt extends m{constructor(t){super("route",t);Y(this,Q,"");Y(this,V);h(this,"rendered",!1)}path(t){return $.fluent(this,arguments,()=>E(this,Q),()=>Z(this,Q,t??E(this,Q)))}builder(t){return Z(this,V,t),this}render(t){return E(this,V)&&this.content(E(this,V).call(this,{$route:this,params:t.params,query:t.query})),this.rendered=!0,this}build(t){return new vt({dom:this.dom.cloneNode()}).self(s=>{E(this,V)&&s.builder(E(this,V)).render({params:t.params,query:t.query})})}};Q=new WeakMap,V=new WeakMap;let ct=vt;$.registerTagName("router",k);$.registerTagName("route",ct);Object.assign($,{open(r,e){return k.open(r,e)},replace(r){return k.replace(r)},back(){return k.back()}});class ie{constructor(e,t){h(this,"booru");Object.assign(this,t),this.booru=e}static async fetchUserFavorites(e,t,s,i=100,n){return(await e.fetch(`/favorites.json?${s}&${`search[user_id]=${t.id}`}&limit=${i}&page=${n}`)).map(a=>(t.favorites.add(a.post_id),a.post_id))}update(e){return Object.assign(this,e),this}}class dt{constructor(e,t,s=!0){h(this,"name$",$.state("..."));h(this,"post_upload_count$",$.state(0));h(this,"level$",$.state(10));h(this,"level_string$",$.state("..."));h(this,"booru");h(this,"favorites",new Set);this.booru=e,Object.assign(this,t),s&&this.update$()}static async fetch(e,t){var n;let s;if(typeof t=="string"){const o=(await e.fetch(`/users.json?search[name]=${t}`)).at(0);if(!o)throw"User Not Found";return s=o}else s=await e.fetch(`/users/${t}.json`);const i=((n=e.users.get(s.id))==null?void 0:n.update(s))??new this(e,s);return e.users.set(i.id,i),i}static async fetchMultiple(e,t,s=200){let i="";if(t)for(const[a,l]of Object.entries(t))if(l instanceof Array)i+=`&search[${a}]=${l}`;else if(l instanceof Object)for(const[d,c]of Object.entries(l))i+=`&search[${a}${d}]=${c}`;else i+=`&search[${a}]=${l}`;return(await e.fetch(`/users.json?limit=${s}${i}`)).map(a=>{const l=new this(e,a);return e.users.set(l.id,l),l})}update(e){return Object.assign(this,e),this.update$(),this}update$(){this.name$.set(this.name),this.post_upload_count$.set(this.post_upload_count),this.level$.set(this.level),this.level_string$.set(this.level_string)}get booruURL(){return`${this.booru.origin}/users/${this.id}`}get url(){return`/users/${this.id}`}}const lt=class lt extends dt{constructor(t,s,i){super(t,i,!1);h(this,"apiKey");h(this,"favorite_count$",$.state(0));h(this,"forum_post_count$",$.state(0));this.apiKey=s,this.update$()}update$(){var t,s;super.update$(),(t=this.forum_post_count$)==null||t.set(this.forum_post_count),(s=this.favorite_count$)==null||s.set(this.favorite_count)}async init(){await this.fetchFavorites()}async fetchFavorites(){const t=Array.from(this.favorites.keys()).at(-1),s=await ie.fetchUserFavorites(this.booru,this,"",1e3,t?`b${t}`:1);return lt.events.fire("favoriteUpdate",this),s.length>=1e3&&this.fetchFavorites(),s}static get storageUserData(){const t=localStorage.getItem("user_data");return t?JSON.parse(t):null}static set storageUserData(t){localStorage.setItem("user_data",JSON.stringify(t))}};h(lt,"events",new K);let D=lt;const C=class C{constructor(e){h(this,"user");h(this,"posts",new Map);h(this,"tags",new Map);h(this,"users",new Map);h(this,"favorites",new Map);Object.assign(this,e),this.origin.endsWith("/")&&(this.origin=this.origin.slice(0,-1)),C.manager.set(this.name,this)}static set(e){this.used=e,this.name$.set(e.name),this.storageAPI=e.name;const t=D.storageUserData;return t&&e.login(t.username,t.apiKey),this.events.fire("set"),this}static get storageAPI(){return localStorage.getItem("booru_api")}static set storageAPI(e){e?localStorage.setItem("booru_api",e):localStorage.removeItem("booru_api")}async fetch(e,t="GET"){const s=this.user?`${e.includes("?")?"&":"?"}login=${this.user.name}&api_key=${this.user.apiKey}`:"",i=await fetch(`${this.origin}${e}${s}`,{method:t}).then(n=>n.json());if(i.success===!1)throw i.message;return i}async login(e,t){const s=await this.fetch(`/profile.json?login=${e}&api_key=${t}`);return this.user=new D(this,t,s),this.user.init(),C.events.fire("login",this.user),this.user}logout(){return this.user=void 0,D.storageUserData=null,C.events.fire("logout"),this}};h(C,"used"),h(C,"events",new K),h(C,"name$",$.state(C.name)),h(C,"manager",new Map);let v=C;class re{constructor(e,t){h(this,"post_count$",$.state(0));h(this,"name$",$.state(""));h(this,"booru");this.booru=e,Object.assign(this,t),this.$update()}static async fetch(e,t){var n;const s=await e.fetch(`/tags/${t}.json`),i=((n=e.tags.get(s.id))==null?void 0:n.update(s))??new this(e,s);return e.tags.set(i.id,i),i}static async fetchMultiple(e,t,s=1e3){let i="";if(t)for(const[a,l]of Object.entries(t))if(l instanceof Array)i+=`&search[${a}]=${l}`;else if(l instanceof Object)for(const[d,c]of Object.entries(l))i+=`&search[${a}${d}]=${c}`;else i+=`&search[${a}]=${l}`;return(await e.fetch(`/tags.json?limit=${s}${i}`)).map(a=>{var d;const l=((d=e.tags.get(a.id))==null?void 0:d.update(a))??new this(e,a);return e.tags.set(l.id,l),l})}update(e){return Object.assign(this,e),this.$update(),this}$update(){this.post_count$.set(this.post_count),this.name$.set(this.name)}}var z=(r=>(r[r.General=0]="General",r[r.Artist=1]="Artist",r[r.Copyright=3]="Copyright",r[r.Character=4]="Character",r[r.Meta=5]="Meta",r))(z||{});const $t=1e3,ot=$t*60,at=ot*60,ht=at*24,ne=ht*7,rt=new Intl.RelativeTimeFormat("en",{style:"long"});function mt(r){r=Math.floor(r);const e=r/$t,t=r/ot,s=r/at,i=r/ht,n=r%1e3,o=Math.floor(r%6e4/1e3),a=Math.floor(r%36e5/6e4),l=Math.floor(r%(36e5*24)/36e5),d=o.toString().padStart(2,"0"),c=a.toString().padStart(2,"0"),f=l.toString().padStart(2,"0");return{seconds:e,minutes:t,hours:s,days:i,mil:n,s:o,min:a,h:l,ss:d,mm:c,hh:f}}function oe(r,e=Date.now()){const t=r-e,s=Math.abs(t);if(sthis.update$()),this}static async fetchMultiple(t,s,i=20,n){let o="";if(s){if(typeof s=="string")o=s;else for(const[c,f]of Object.entries(s))if(f!==void 0){if(c==="tags"){o+=`${f}`;continue}o.at(-1)!=="="&&(o+=" "),o+=`${c}:${f}`}}const a=await t.fetch(`/posts.json?limit=${i}&tags=${o}${n?`&page=${n}`:""}&_method=get`);if(!(a instanceof Array))return[];const l=a.map(c=>{var g;const f=((g=t.posts.get(c.id))==null?void 0:g.update(c))??new this(t,c.id,c);return t.posts.set(f.id,f),f});if(!l.length)return l;const d=[...new Set(a.map(c=>[c.approver_id,c.uploader_id].detype(null)).flat())];return dt.fetchMultiple(t,{id:d}).then(()=>l.forEach(c=>c.update$())),l}update$(){var t,s,i,n;this.uploader$.set(((t=this.uploader)==null?void 0:t.name$)??((s=this.uploader_id)==null?void 0:s.toString())),this.approver$.set(((i=this.approver)==null?void 0:i.name$)??((n=this.approver_id)==null?void 0:n.toString())??"None"),this.created_date$.set(oe(+new Date(this.created_at))),this.favcount$.set(this.fav_count),this.score$.set(this.score),this.file_size$.set(ae(this.file_size)),this.file_ext$.set(this.file_ext),this.file_url$.set(this.file_url),this.source$.set(this.source),this.dimension$.set(`${this.image_width}x${this.image_height}`),this.booruUrl$.set(`${this.booruUrl}`),this.isUgoria&&this.webm_url$.set(this.large_file_url),this.createdDate=new Date(this.created_at),this.fire("update")}update(t){return Object.assign(this,t),this.update$(),this}async fetchTags(){return await this.ready,await re.fetchMultiple(this.booru,{name:{_space:this.tag_string}})}async createFavorite(){if(!this.booru.user)return;const t=await this.booru.fetch(`/favorites.json?post_id=${this.id}`,"POST");return this.update(t),this.booru.user.favorites.add(t.id),D.events.fire("favoriteUpdate",this.booru.user),t.id}async deleteFavorite(){!this.booru.user||await fetch(`/api/favorites/${this.id}?login=${this.booru.user.name}&api_key=${this.booru.user.apiKey}&origin=${this.booru.origin}`,{method:"DELETE"}).then(s=>s.json())===!1||(this.fav_count--,this.favcount$.set(this.fav_count),this.booru.user.favorites.delete(this.id),D.events.fire("favoriteUpdate",this.booru.user))}get pathname(){return`/posts/${this.id}`}get uploader(){return this.booru.users.get(this.uploader_id)}get approver(){return this.approver_id?this.booru.users.get(this.approver_id):null}get isVideo(){return this.file_ext==="mp4"||this.file_ext==="webm"||this.file_ext==="zip"}get isGif(){return this.file_ext==="gif"}get isUgoria(){return this.file_ext==="zip"}get hasSound(){return this.tag_string_meta.includes("sound")}get tags(){const t=this.tag_string.split(" ");return[...this.booru.tags.values()].filter(s=>t.includes(s.name))}get previewURL(){var t,s;return((s=(t=this.media_asset.variants)==null?void 0:t.find(i=>i.file_ext==="webp"))==null?void 0:s.url)??this.large_file_url}get booruUrl(){return`${this.booru.origin}/posts/${this.id}`}get url(){return`https://danbooru.defaultkavy.com/posts/${this.id}`}get isFileSource(){return this.source.startsWith("file://")}get isLargeFile(){return this.file_size>5e6}}class Rt{constructor(e){Object.assign(this,e)}static async fetch(e,t){const s=await e.fetch(`/artist_commentaries/${t}.json`);return new this(s)}static async fetchMultiple(e,t,s=200){let i="";if(t)for(const[a,l]of Object.entries(t))if(l instanceof Array)i+=`&search[${a}]=${l}`;else if(l instanceof Object)for(const[d,c]of Object.entries(l))i+=`&search[${a}${d}]=${c}`;else i+=`&search[${a}]=${l}`;return(await e.fetch(`/artist_commentaries.json?limit=${s}${i}`)).map(a=>{const l=new this(a);return this.manager.set(l.id,l),l})}}h(Rt,"manager",new Map);class le extends m{constructor(t,s,i){super("video-controller");h(this,"$video");h(this,"$viewer");h(this,"duration$",$.state("00:00"));h(this,"post");this.$video=t,this.$viewer=s,this.post=i,this.build()}build(){const t=$.events();this.$video.on("timeupdate",()=>this.durationUpdate()),this.content([$("div").class("video-details").content([$("div").class("left").content([$("ion-icon").class("play").title("Play").name("play").self(s=>{this.$video.on("play",()=>s.name("pause")).on("pause",()=>s.name("play")),s.on("click",()=>this.$video.isPlaying?this.$video.pause():this.$video.play())}),$("div").class("duration").content([$("span").class("current-time").content(this.duration$),$("span").content("/"),$("span").class("total-time").content("00:00").self(s=>{this.$video.on("loadeddata",()=>{const i=mt(this.$video.duration*1e3);s.content(Number(i.hh)>0?`${i.hh}:${i.mm}:${i.ss}`:`${i.mm}:${i.ss}`)})})])]),$("div").class("right").content([$("ion-icon").class("volume").title("Volume").name("volume-high").disable(!this.post.hasSound).self(s=>{const i=()=>{this.$video.muted()?s.name("volume-mute"):s.name("volume-high")};s.on("click",()=>{this.$video.muted(!this.$video.muted()),i()})}),$("ion-icon").class("full-screen").title("Full-Screen").name("scan").self(s=>{s.on("click",()=>{document.fullscreenElement?document.exitFullscreen():this.$viewer.dom.requestFullscreen()})})])]),$("div").class("progressbar-container").content([$("div").class("progressbar").content([$("div").class("progress").self(s=>{this.$video.on("timeupdate",i=>{s.css({width:`${this.$video.currentTime()/this.$video.duration*100}%`})}),t.on("progressChange",i=>{s.css({width:`${i*100}%`})})})])]).self(s=>{const i=$.pointers($(document.body));let n=!1;i.on("down",(o,a)=>{if(!s.contains(o.$target))return o.delete();a.preventDefault(),this.$video.isPlaying&&(n=!0,this.$video.pause());const l=(o.x-s.domRect().x)/s.offsetWidth;this.$video.currentTime(l*this.$video.duration)}),i.on("move",(o,a)=>{a.preventDefault();const l=(o.x-s.domRect().x)/s.offsetWidth;this.$video.currentTime(l*this.$video.duration),t.fire("progressChange",l)}),i.on("up",(o,a)=>{n&&this.$video.play(),n=!1})})])}durationUpdate(){const t=mt(this.$video.currentTime()*1e3);this.duration$.set(Number(t.hh)>0?`${t.hh}:${t.mm}:${t.ss}`:`${t.mm}:${t.ss}`)}}const ue=$("route").path("/posts/:id").id("post").builder(({$route:r,params:e})=>{if(!Number(e.id))return $("h1").content("404: POST NOT FOUND");const t=B.get(v.used,+e.id),s=$.events();return[$("div").class("viewer").content(async i=>{const n=$("video");return s.on("video_play_pause",()=>{n.isPlaying?n.pause():n.play()}),await t.ready,i.on("pointermove",o=>{(o.pointerType==="mouse"||o.pointerType==="pen")&&s.fire("viewerPanel_show")}).on("pointerup",o=>{var a;(a=$(":.viewer-panel .panel"))!=null&&a.contains($(o.target))||(o.pointerType==="touch"&&s.fire("viewerPanel_switch"),o.pointerType==="mouse"&&s.fire("video_play_pause"))}).on("mouseleave",()=>{s.fire("viewerPanel_hide")}),[$("div").class("viewer-panel").hide(!1).content([$("div").class("panel").content([t.isVideo?new le(n,i,t):null,$("div").class("buttons").content([$("ion-icon").title("Favorite").name("heart-outline").self(o=>{var a;D.events.on("favoriteUpdate",l=>{l.favorites.has(t.id)?o.name("heart"):o.name("heart-outline")}),(a=v.used.user)!=null&&a.favorites.has(t.id)&&o.name("heart"),o.on("click",()=>{var l;(l=v.used.user)!=null&&l.favorites.has(t.id)?t.deleteFavorite():t.createFavorite()})}),$("ion-icon").title("Original Size").name("resize-outline").self(o=>{o.on("click",()=>{s.fire("original_size"),o.disable(!0)}),(!t.isLargeFile||t.isVideo)&&o.disable(!0)})])]),$("div").class("overlay")]).self(o=>{s.on("viewerPanel_hide",()=>o.hide(!0)).on("viewerPanel_show",()=>o.hide(!1)).on("viewerPanel_switch",()=>o.hide(!o.hide()))}),t.isVideo?n.height(t.image_height).width(t.image_width).src(t.file_ext==="zip"?t.large_file_url:t.file_url).controls(!1).autoplay(!0).loop(!0).disablePictureInPicture(!0):$("img").src(t.isLargeFile?t.large_file_url:t.file_url).self(o=>{s.on("original_size",()=>o.src(t.file_url))})]}),$("div").class("content").content([$("h3").content("Artist's Commentary"),$("section").class("commentary").content(async i=>{const n=(await Rt.fetchMultiple(v.used,{post:{_id:t.id}})).at(0);return[n?[n.original_title?$("h3").content(n.original_title):null,$("pre").content(n.original_description)]:"No commentary"]})]),$("div").class("sidebar").self(i=>{let n=0;addEventListener("scroll",()=>{i.inDOM()&&(n=document.documentElement.scrollTop)},{passive:!0}),r.on("beforeShift",()=>{innerWidth>800&&i.css({position:"absolute",top:`calc(${n}px + var(--nav-height) + var(--padding))`})}).on("afterShift",()=>i.css({position:"",top:""}))}).content([$("section").class("post-info").content([new P("id").name("Post").content(`#${e.id}`),new P("uploader").name("Uploader").content(t.uploader$),new P("approver").name("Approver").content(t.approver$),new P("date").name("Date").content(t.created_date$),new P("size").name("Size").content([t.file_size$,t.dimension$]),new P("file-type").name("File Type").content(t.file_ext$),$("div").class("inline").content([new P("favorites").name("Favorites").content(t.favcount$),new P("score").name("Score").content(t.score$)]),new P("file-url").name("File").content([$("a").href(t.file_url$).content(t.file_url$.convert(i=>i.replace("https://",""))).target("_blank"),$("ion-icon").name("clipboard").on("click",(i,n)=>ut(n,t.file_url))]),new P("source-url").name("Source").content([$("a").href(t.source$).content(t.source$.convert(i=>i.replace("https://",""))).target("_blank"),$("ion-icon").name("clipboard").on("click",(i,n)=>ut(n,t.source))]),new P("booru-url").name(v.name$).content([$("a").href(t.booruUrl$).content(t.booruUrl$.convert(i=>i.replace("https://",""))).target("_blank"),$("ion-icon").name("clipboard").on("click",(i,n)=>ut(n,t.booruUrl))]),new P("webm-url").name("Webm").hide(!0).self(async i=>{await t.ready,t.isUgoria&&i.content($("a").href(t.webm_url$).content(t.webm_url$.convert(n=>n.replace("https://",""))).target("_blank")).hide(!1)})]),$("div").class("post-tags").content(async i=>{const n=await t.fetchTags(),[o,a,l,d,c]=[n.filter(g=>g.category===z.Artist),n.filter(g=>g.category===z.Character),n.filter(g=>g.category===z.General),n.filter(g=>g.category===z.Meta),n.filter(g=>g.category===z.Copyright)];return[f("Artist",o),f("Character",a),f("Copyright",c),f("Meta",d),f("General",l)];function f(g,b){return b.length?[$("h3").content(g),$("section").content([b.map(u=>$("div").class("tag").content([$("a").class("tag-name").content(u.name).href(`/posts?tags=${u.name}`),$("span").class("tag-post-count").content(u.post_count$.convert(tt))]))])]:null}})])]});function ut(r,e){r.name("checkmark"),navigator.clipboard.writeText(e),setTimeout(()=>r.name("clipboard"),3e3)}class P extends m{constructor(t){super("div");h(this,"$name",$("span").class("property-name"));h(this,"$values",$("div").class("property-values"));this.staticClass("property").attribute("property-id",t),super.content([this.$name,this.$values.hide(!0)])}name(t){return this.$name.content(t),this}content(t){this.$values.hide(!1);const s=$.orArrayResolve(t);return this.$values.content(s.map(i=>$("span").staticClass("property-value").content(i))),this}}class ce extends m{constructor(t){super("post-tile");h(this,"post");h(this,"$video");h(this,"duration$",$.state(""));this.post=t,this.$video=this.post.isVideo?$("video").width(this.post.image_width).height(this.post.image_height).disablePictureInPicture(!0).loop(!0).muted(!0).hide(!0).on("mousedown",s=>s.preventDefault()):null,this.attribute("filetype",this.post.file_ext),this.durationUpdate(),this.build()}build(){var s,i;let t;(s=this.$video)==null||s.on("timeupdate",(n,o)=>{this.durationUpdate()}),(i=this.$video)==null||i.on("pause",()=>{clearInterval(t),this.durationUpdate()}),this.class("loading").content([this.post.isVideo?$("div").class("video-detail").content([this.post.hasSound?$("ion-icon").name("volume-medium-outline"):null,this.post.isUgoria?$("ion-icon").name("images-outline"):null,$("span").class("duration").content(this.duration$)]):null,this.post.isGif?$("div").class("gif-detail").content([$("span").content("GIF")]):null,$("a").href(this.post.pathname).content(()=>[this.$video,$("img").draggable(!1).css({opacity:"0"}).width(this.post.image_width).height(this.post.image_height).src(this.post.previewURL).loading("lazy").on("mousedown",n=>n.preventDefault()).once("load",(n,o)=>{o.src(this.post.previewURL).on(["mouseenter","touchstart"],()=>{this.post.isGif&&o.src(this.post.large_file_url)},{passive:!0}).on(["mouseleave","touchend","touchcancel"],()=>{this.post.isGif&&o.src(this.post.previewURL)},{passive:!0}).animate({opacity:[0,1]},{duration:300,fill:"both"}),this.removeClass("loading")})]).on(["mouseenter","touchstart"],()=>{var n,o;(n=this.$video)!=null&&n.isPlaying||(o=this.$video)==null||o.src(this.post.large_file_url).hide(!1).play().catch(a=>{})},{passive:!0}).on(["mouseleave","touchend","touchcancel"],()=>{var n;(n=this.$video)==null||n.pause().currentTime(0).hide(!0)},{passive:!0})])}durationUpdate(){if(!this.$video)return;const t=mt(this.post.media_asset.duration*1e3-this.$video.currentTime()*1e3);this.duration$.set(Number(t.hh)>0?`${t.hh}:${t.mm}:${t.ss}`:`${t.mm}:${t.ss}`)}}class St extends Lt{constructor(t){super();h(this,"posts",new Set);h(this,"$posts",new Map);h(this,"orderMap",new Map);h(this,"tags");h(this,"finished",!1);h(this,"limit",100);this.tags=t==null?void 0:t.tags,this.addStaticClass("post-grid"),this.type("waterfall").gap(10),this.init()}async init(){setInterval(()=>{this.inDOM()&&document.documentElement.scrollTop===0&&this.getPost("newer")},1e4),v.events.on("set",()=>{this.removeAll(),this.finished&&(this.finished=!1,this.events.fire("startLoad"),this.loader())}),this.on("resize",()=>this.resize()),this.events.fire("startLoad"),this.loader()}async loader(){if(!this.inDOM())return setTimeout(()=>this.loader(),100);for(;this.inDOM()&&document.documentElement.scrollHeight<=innerHeight*2;)if(!(await this.getPost("older")).length)return;document.documentElement.scrollTop+innerHeight>document.documentElement.scrollHeight-innerHeight*2&&!(await this.getPost("older")).length||setTimeout(()=>this.loader(),100)}resize(){const t=Math.round(this.dom.clientWidth/300);this.column(t>=2?t:2)}addPost(t){t=$.orArrayResolve(t);for(const i of t){if(!i.file_url||this.posts.has(i))continue;const n=new ce(i);this.$posts.set(i,n),this.posts.add(i)}const s=[...this.orderMap.values()].map(i=>this.$posts.get(i));return this.content(s).render(),this}removeAll(){return this.posts.clear(),this.$posts.clear(),this.orderMap.clear(),this.animate({opacity:[1,0]},{duration:300,easing:"ease"},()=>this.clear().render()),this}async getPost(t){const s=this.tags?decodeURIComponent(this.tags).split("+"):void 0,i=[],n=[];let o=this.limit;if(s)for(const c of s)c.startsWith("ordfav:")||c.startsWith("order:")?n.push(c):c.startsWith("limit:")?o=Number(c.split(":")[1]):i.push(c);if(n.length){if(n.length>1)return this.events.fire("post_error",`Error: These query can't be used together [${n}].`),[];const c=n[0];if(c.startsWith("ordfav:")){const f=c.split(":")[1],g=i.length?`&search[post_tags_match]=${i.toString().replaceAll(",","+")}`:"",b=this.orderKeyList.length?t==="newer"?`&search[id]=>${this.orderKeyList.at(0)}`:`&search[id]=<${this.orderKeyList.at(-1)}`:void 0,u=await v.used.fetch(`/favorites.json?search[user_name]=${f}${b??""}${g}&limit=${o}`),p=await B.fetchMultiple(v.used,{tags:`id:${u.map(S=>S.post_id).toString()}`}),w=new Map;for(const S of u){const I=p.find(_=>_.id===S.post_id);I&&w.set(S.id,I)}return this.orderMap=new Map(t==="newer"?[...w,...this.orderMap]:[...this.orderMap,...w]),this.addPost(p),p}if(c.startsWith("order:")){const f=this.orderKeyList.length?t==="newer"?1:this.orderMap.size/o+1:void 0,g=await B.fetchMultiple(v.used,{tags:this.tags},o,f),b=new Map(g.map(u=>[u.id,u]));return b.forEach((u,p)=>{this.orderMap.has(p)&&b.delete(p)}),this.orderMap=new Map(t==="newer"?[...b,...this.orderMap]:[...this.orderMap,...b]),this.addPost(g),g}}const a=this.orderKeyList.length?t==="newer"?`a${this.orderKeyList.at(0)}`:`b${this.orderKeyList.at(-1)}`:void 0,l=await B.fetchMultiple(v.used,{tags:this.tags},o,a),d=new Map(l.map(c=>[c.id,c]));return this.orderMap=new Map(t==="newer"?[...d,...this.orderMap]:[...this.orderMap,...d]),this.addPost(l),l.length||(this.finished=!0,this.posts.size?this.events.fire("endPost"):this.events.fire("noPost")),l}get orderKeyList(){return[...this.orderMap.keys()]}}class Dt{static async fetch(e,t,s=20){if(!t.length)return this.searchQuery.map(o=>new It(o));const i=await e.fetch(`/autocomplete.json?search[query]=${t}&search[type]=tag_query&version=1&limit=${s}`);return[...t.length?this.searchQuery.filter(o=>o.value.startsWith(t)&&o.value!==t):this.searchQuery,...i].map(o=>new It(o))}}h(Dt,"searchQuery",[{value:"user:",label:"user:"},{value:"approver:",label:"approver:"},{value:"-approver:",label:"-approver:"},{value:"order:",label:"order:"},{value:"ordfav:",label:"ordfav:"},{value:"ordfavgroup:",label:"ordfavgroup:"},{value:"search:",label:"search:"},{value:"favgroup:",label:"favgroup:"},{value:"-favgroup:",label:"-favgroup:"},{value:"favcount:",label:"favcount:"},{value:"id:",label:"id:"},{value:"tagcount:",label:"tagcount:"},{value:"gentags:",label:"gentags:"},{value:"arttags:",label:"arttags:"},{value:"chartags:",label:"chartags:"},{value:"copytags:",label:"copytags:"},{value:"metatags:",label:"metatags:"},{value:"score:",label:"score:"},{value:"upvote:",label:"upvote:"},{value:"downvote:",label:"downvote:"},{value:"disapproved:",label:"disapproved:"},{value:"md5:",label:"md5:"},{value:"width:",label:"width:"},{value:"height:",label:"height:"},{value:"ratio:",label:"ratio:"},{value:"mpixels:",label:"mpixels:"},{value:"filesize:",label:"filesize:"},{value:"duration:",label:"duration:"},{value:"is:",label:"is:"},{value:"has:",label:"has:"},{value:"pool:",label:"pool:"},{value:"-pool:",label:"-pool:"},{value:"ordpool:",label:"ordpool:"},{value:"random:",label:"random:"},{value:"limit:",label:"limit:"},{value:"date:",label:"date:"},{value:"commenter:",label:"commenter:"},{value:"note:",label:"note:"},{value:"noter:",label:"noter:"},{value:"noteupdater:",label:"noteupdater:"},{value:"status:",label:"status:"},{value:"-status:",label:"-status:"},{value:"rating:",label:"rating:"},{value:"-rating:",label:"-rating:"},{value:"source:",label:"source:"},{value:"-source:",label:"-source:"},{value:"pixiv:",label:"pixiv:"},{value:"parent:",label:"parent:"},{value:"child:",label:"child:"},{value:"flagger:",label:"flagger:"},{value:"appealer:",label:"appealer:"},{value:"commentary:",label:"commentary:"},{value:"commentaryupdater:",label:"commentaryupdater:"}].map(e=>({type:"query",...e})));class It{constructor(e){Object.assign(this,e)}isTag(){return this.type==="tag"||this.type==="tag-autocorrect"||this.type==="tag-alias"||this.type==="tag-word"}isTagAutocorrect(){return this.type==="tag-autocorrect"}isTagAntecedent(){return!!this.antecedent}isTagWord(){return this.type==="tag-word"}isUser(){return this.type==="user"}}class de extends m{constructor(){super("searchbar");h(this,"$tagInput",new pe(this));h(this,"$selectionList",new me);h(this,"typingTimer",null);h(this,"$filter",$("div").class("filter"));this.build(),window.addEventListener("keyup",t=>{!this.inDOM()&&t.key==="/"&&this.open(),this.inDOM()&&t.key==="Escape"&&this.close()})}build(){this.content([$("div").class("input-container").content([this.$tagInput.on("input",()=>this.inputHandler()).on("keydown",t=>this.keyHandler(t)),$("ion-icon").name("close-circle-outline").title("Clear Input").on("click",()=>this.$tagInput.clearAll())]).on("click",t=>{t.target===this.$tagInput.dom&&this.$tagInput.addTag().input()}),$("div").class("selection-list-container").content([this.$selectionList]),this.$filter.on("click",()=>{location.hash==="#search"&&this.close()})])}open(){return location.hash!=="#search"&&$.open(location.href+"#search"),this}close(){return location.hash==="#search"&&$.back(),this}activate(){return this.hide(!1),this.$filter.animate({opacity:[0,.5]},{duration:300,easing:"ease"}),this.$tagInput.input(),this}inactivate(){return this.animate({opacity:[.5,0]},{duration:300,easing:"ease"},()=>this.hide(!0)),this}keyHandler(t){var n,o;const s=()=>{t.preventDefault(),this.$tagInput.addTag().input()},i=a=>{const l=this.$tagInput.children.indexOf(this.$tagInput.$inputor);if(this.$tagInput.$input.value().at(-1)===":")return this.getSearchSuggestions();const d=this.$tagInput.children.array.at(l+1);this.$tagInput.addTag(a.value()),d?this.$tagInput.editTag(d):this.$tagInput.input()};switch(t.key){case"ArrowUp":{t.preventDefault(),this.$selectionList.focusPrevSelection(),this.$tagInput.value((n=this.$selectionList.focused)==null?void 0:n.value());break}case"ArrowDown":{t.preventDefault(),this.$selectionList.focusNextSelection(),this.$tagInput.value((o=this.$selectionList.focused)==null?void 0:o.value());break}case" ":s();break;case"Enter":{t.preventDefault(),this.$selectionList.focused?i(this.$selectionList.focused):(this.$tagInput.addTag(),this.search());break}case"Tab":{t.preventDefault();const a=this.$tagInput.children.indexOf(this.$tagInput.$inputor);if(t.shiftKey){a-1>=0&&this.$tagInput.editTag(this.$tagInput.children.array.at(a-1));break}if(this.$selectionList.focused)i(this.$selectionList.focused);else{const l=this.$tagInput.children.array.at(a+1);l?this.$tagInput.editTag(l):this.$tagInput.addTag().input()}break}case"Backspace":{const a=this.$tagInput.children.indexOf(this.$tagInput.$inputor);a!==0&&!this.$tagInput.$input.value().length&&(t.preventDefault(),this.$tagInput.editTag(this.$tagInput.children.array.at(a-1)));break}}}inputHandler(){this.typingTimer&&(clearTimeout(this.typingTimer),this.typingTimer=null),this.typingTimer=setTimeout(async()=>{this.typingTimer=null,this.getSearchSuggestions()},200)}async getSearchSuggestions(){const t=this.$tagInput.$input.value(),s=await Dt.fetch(v.used,t,20);this.$selectionList.clearSelections().addSelections(s.map(i=>new fe().value(i.value).content([$("div").class("selection-label").content([i.isTagAntecedent()?$("span").class("tag-antecedent").self(n=>n.dom.innerHTML=i.antecedent.replaceAll(t,`${t}`)):null,$("div").class("label-container").content([i.isTagAntecedent()?$("ion-icon").name("arrow-forward-outline"):null,$("span").class("label").self(n=>n.dom.innerHTML=i.label.replaceAll(t,`${t}`))])]),i.isTag()?$("div").class("tag-detail").content([$("span").class("tag-post-count").content(tt(i.post_count)),$("span").class("tag-category").content(z[i.category])]):null,i.isUser()?$("span").class("user-level").content(i.level):null]).on("click",()=>{this.$tagInput.addTag(i.value).input()})))}search(){return $.replace(`/posts?tags=${this.$tagInput.query.replace(":","%3A")}`),this.$tagInput.clearAll(),this.inactivate(),this}checkURL(t,s){if((t==null?void 0:t.hash)==="#search"&&this.inactivate(),s.hash==="#search"&&this.activate(),`${t==null?void 0:t.pathname}${t==null?void 0:t.search}`==`${s.pathname}${s.search}`)return;const i=s.searchParams.get("tags");this.$tagInput.clearAll(),i==null||i.split(" ").forEach(n=>this.$tagInput.addTag(n))}}class me extends m{constructor(){super("selection-list");h(this,"focused",null);h(this,"selections",new Set)}addSelections(t){t=$.orArrayResolve(t);for(const s of t)this.selections.add(s);return this.insert(t),this}clearSelections(){return this.focused=null,this.selections.clear(),this.clear(),this}focusSelection(t){return this.blurSelection(),this.focused=t,t.focus(),t.offsetTopthis.scrollTop()+this.offsetHeight&&this.scrollTop(t.offsetTop+t.offsetHeight-this.offsetHeight),this}blurSelection(){var t;return(t=this.focused)==null||t.blur(),this.focused=null,this}focusNextSelection(){const t=this.selections.array,s=t.at(0);if(this.focused){const i=t.at(t.indexOf(this.focused)+1);i?this.focusSelection(i):s&&this.focusSelection(s)}else s&&this.focusSelection(s)}focusPrevSelection(){const t=this.selections.array;if(this.focused){const s=t.at(t.indexOf(this.focused)-1);s&&this.focusSelection(s)}else{const s=t.at(0);s&&this.focusSelection(s)}}}class fe extends m{constructor(){super("selection");h(this,"property",{value:""})}value(t){return $.fluent(this,arguments,()=>this.property.value,()=>$.set(this.property,"value",t))}focus(){return this.addClass("active"),this}blur(){return this.removeClass("active"),this}}class pe extends m{constructor(t){super("tag-input");h(this,"$input",$("input").type("text"));h(this,"$sizer",$("span").class("sizer"));h(this,"$inputor",$("div").class("input-wrapper").content([this.$sizer,this.$input.on("input",()=>{this.$sizer.content(this.$input.value())})]));h(this,"tags",new Set);h(this,"$seachbar");this.$seachbar=t}input(){return this.insert(this.$inputor),this.$input.focus(),this.$seachbar.$selectionList.clearSelections(),this.$seachbar.getSearchSuggestions(),this}addTag(t){if(t=t??this.$input.value(),!t.length)return this;const s=new ge(t);return s.on("click",()=>this.editTag(s)),this.tags.add(s),this.value(""),this.$input.inDOM()?this.$inputor.replace(s):this.insert(s),this}editTag(t){return this.addTag(),this.tags.delete(t),t.replace(this.$inputor),this.value(t.name),this.$input.focus(),this.$seachbar.getSearchSuggestions(),this}clearAll(){return this.value(""),this.tags.clear(),this.clear(),this}value(t){return t===void 0?this:(this.$input.value(t),this.$sizer.content(t),this)}focus(){return this.$input.focus(),this}get query(){return this.tags.array.map(t=>t.name).toString().replace(",","+")}}class ge extends m{constructor(t){super("tag");h(this,"name");this.name=t,this.build()}build(){this.content(this.name)}}class $e extends m{constructor(){super("ion-icon")}name(e){return this.attribute("name",e),this}size(e){return this.attribute("size",e),this}disable(e){return this.attribute("disable",e),this}link(e,t=!1){return this.on("click",()=>t?$.replace(e):$.open(e)),this}}class ve extends gt{constructor(){super();h(this,"$icon",$("ion-icon"));h(this,"$label",$("span"));this.addStaticClass("icon"),this.build()}build(){super.content([this.$icon.hide(!0),this.$label])}content(t){return this.$label.content(t),this}icon(t){return this.$icon.name(t).hide(!1),this}link(t,s=!1){return this.on("click",()=>s?$.replace(t):$.open(t)),this}}const ye=$("route").id("login").path("/login").builder(()=>{const[r,e]=[$.state(""),$.state("")];return[$("div").class("login-container").content([$("h1").content("Login"),$("div").class("username","input-container").content([$("label").for("username").content("Username"),$("input").type("text").id("username").value(r)]),$("div").class("api-key","input-container").content([$("label").for("api-key").content("API Key"),$("input").type("password").id("api-key").value(e)]),$("icon-button").content("Login").on("click",async()=>{await v.used.login(r.value,e.value),v.used.user&&(D.storageUserData={apiKey:e.value,username:r.value},r.set(""),e.set(""),$.replace("/"))}),$("icon-button").content("Create Account").icon("open-outline").on("click",()=>$.open("https://danbooru.donmai.us/users/new","_blank"))])]});class we extends m{constructor(){super("drawer");h(this,"$filter",$("div").class("filter"));h(this,"$container",$("div").class("drawer-container"));h(this,"pointers",$.pointers($(document.body)));h(this,"opened",!1);this.hide(!0),this.build()}build(){this.content([this.$container.content([$("div").class("user-info").hide(!0).self(t=>[v.events.on("login",s=>{t.content([$("div").content([$("h3").class("username").content(s.name$),$("div").class("user-detail").content([$("span").class("userid").content(`ID: ${s.id}`),$("span").class("level").content(["Level: ",s.level_string$])])]),$("div").class("user-nav").content([$("icon-button").title("Uploaded Posts").icon("image").content(s.post_upload_count$.convert(tt)).link(`/posts?tags=user:${s.name}`,!0),$("icon-button").title("Favorites").icon("heart").content(s.favorite_count$.convert(tt)).link(`/posts?tags=ordfav:${s.name}`,!0),$("icon-button").title("Forum Posts").icon("document-text").content(s.forum_post_count$.convert(tt)).hide(!0)])]).hide(!1)}).on("logout",()=>{t.clear().hide(!0)})]),$("div").class("nav").content([$("icon-button").icon("log-in-outline").content("Login").link("/login",!0).self(t=>v.events.on("login",()=>t.hide(!0)).on("logout",()=>t.hide(!1))),$("icon-button").icon("log-in-outline").content("Logout").on("dblclick",()=>v.used.logout()).hide(!0).self(t=>v.events.on("login",()=>t.hide(!1)).on("logout",()=>t.hide(!0))),$("icon-button").icon("swap-horizontal").content("Logout").class("switch").content("Switch Booru").on("click",()=>{v.used===ft?v.set(be):v.set(ft)})])]),this.$filter.on("click",()=>$.back())]),this.pointers.on("move",t=>{var s;(s=$(":.viewer"))!=null&&s.contains(t.$target)||(t.$target.parent,!(t.type!=="pen"&&t.type!=="touch")&&(t.move_y>4||t.move_y<-4||(t.move_x<=-7&&(t.delete(),this.open()),t.move_x>=7&&(t.delete(),this.close()))))})}open(){return location.hash!=="#drawer"&&$.open(location.href+"#drawer"),this}close(){return location.hash==="#drawer"&&$.back(),this}activate(){this.opened=!0,this.hide(!1),this.$container.animate({transform:["translateX(100%)","translateX(0%)"]},{fill:"both",duration:300,easing:"ease"}),this.$filter.animate({opacity:[0,1]},{fill:"both",duration:300,easing:"ease"})}inactivate(){this.opened=!1,this.$container.animate({transform:["translateX(0%)","translateX(100%)"]},{fill:"both",duration:300,easing:"ease"},()=>this.hide(!this.opened)),this.$filter.animate({opacity:[1,0]},{fill:"both",duration:300,easing:"ease"})}checkURL(t,s){(t==null?void 0:t.hash)==="#drawer"&&this.inactivate(),s.hash==="#drawer"&&this.activate()}}$.registerTagName("ion-icon",$e);$.registerTagName("icon-button",ve);$.anchorHandler=r=>{$.open(r.href(),r.target())};const[ft,be]=[new v({origin:"https://danbooru.donmai.us",name:"Danbooru"}),new v({origin:"https://safebooru.donmai.us",name:"Safebooru"}),new v({origin:"https://testbooru.donmai.us",name:"Testbooru"})];v.set(v.manager.get(v.storageAPI??"")??ft);const nt=new de().hide(!0),pt=new we;$(document.body).content([$("nav").content([$("a").class("title").href("/").content([$("h1").class("booru-name").content(v.name$),$("h2").class("app").content([$("span").class("app-name").content("Viewer"),$("span").class("version").content("v0.8.2")])]),$("div").class("searchbar").content(["Search in ",v.name$]).self(r=>k.events.on("stateChange",({beforeURL:e,afterURL:t})=>{e.hash==="#search"&&r.hide(!1),t.hash==="#search"&&r.hide(!0)})).on("click",()=>nt.open()),$("div").class("buttons").content([$("ion-icon").class("search").name("search-outline").title("Search").self(r=>k.events.on("stateChange",({beforeURL:e,afterURL:t})=>{e.hash==="#search"&&r.hide(!1),t.hash==="#search"&&r.hide(!0)})).on("click",()=>nt.open()),$("a").content($("ion-icon").class("open").name("open-outline").title("Open in Original Site")).href(location.href.replace(location.origin,v.used.origin)).target("_blank"),$("ion-icon").class("copy").name("link-outline").title("Copy Page Link").hide(!1).on("click",(r,e)=>{navigator.clipboard.writeText(`${location.origin}${location.pathname}${location.search}`),e.name("checkmark-outline"),setTimeout(()=>{e.name("link-outline")},2e3)}),$("ion-icon").class("menu").name("menu-outline").title("Menu").hide(!1).self(r=>{v.events.on("login",()=>r.hide(!0)).on("logout",()=>r.hide(!1))}).on("click",()=>$.open(location.href+"#drawer")),$("div").class("account").hide(!0).title("Menu").self(r=>{v.events.on("login",e=>{r.content(e.name$.convert(t=>{var s;return((s=t.at(0))==null?void 0:s.toUpperCase())??""})).hide(!1)}).on("logout",()=>r.hide(!0))}).on("click",()=>pt.open())])]),nt,pt,$("router").base("/").map([$("route").id("posts").path(["/","/posts"]).builder(()=>new St),$("route").id("posts").path("/posts?tags").builder(({query:r})=>{const e=new St({tags:r.tags});return[$("header").content([$("h2").content("Posts"),$("div").class("tags").self(t=>{r.tags.split("+").forEach(s=>{t.insert($("a").class("tag").content(decodeURIComponent(s)).href(`posts?tags=${s}`))})})]),$("div").class("no-post").hide(!0).self(t=>{t.on("startLoad",()=>t.hide(!0)),e.on("noPost",()=>t.hide(!1).content("No Posts")).on("post_error",s=>t.hide(!1).content(s))}),e]}),ue,ye]).on("beforeSwitch",r=>{r.preventDefault();function s(){var o;const n=$.call(()=>{switch(k.navigationDirection){case U.Forward:return["translateX(2%)","translateX(0%)"];case U.Back:return["translateX(-2%)","translateX(0%)"];case U.Replace:return""}});r.$view.content(r.nextContent),r.rendered(),(o=r.nextContent.element)==null||o.class("animated").animate({opacity:[0,1],transform:n},{duration:300,easing:"ease"},()=>{var a;r.switched(),(a=r.nextContent.element)==null||a.removeClass("animated")})}function i(){var o,a;const n=$.call(()=>{switch(k.navigationDirection){case U.Forward:return["translateX(0%)","translateX(-2%)"];case U.Back:return["translateX(0%)","translateX(2%)"];case U.Replace:return""}});(a=(o=r.previousContent)==null?void 0:o.element)==null||a.class("animated").animate({opacity:[1,0],transform:n},{duration:300,easing:"ease"},()=>{var l,d;(d=(l=r.previousContent)==null?void 0:l.element)==null||d.removeClass("animated"),s()})}r.previousContent?i():s()})]);k.events.on("stateChange",({beforeURL:r,afterURL:e})=>Nt(r,e));Nt(void 0,new URL(location.href));function Nt(r,e){nt.checkURL(r,e),pt.checkURL(r,e)} diff --git a/dist/index.html b/dist/index.html index 32e1ae1..8665d9e 100644 --- a/dist/index.html +++ b/dist/index.html @@ -16,8 +16,8 @@ gtag('config', 'G-59HBGP98WR'); - - + + diff --git a/index.scss b/index.scss index b645f7b..c73c835 100644 --- a/index.scss +++ b/index.scss @@ -33,7 +33,7 @@ html { overflow-x: hidden; font-size: 14px; - + scroll-behavior: smooth; ::-webkit-scrollbar { background-color: var(--secondary-color-1); width: 8px; diff --git a/package.json b/package.json index 65cd6e9..7b11695 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "danbooru-viewer", "module": "index.ts", "type": "module", - "version": "0.8.2", + "version": "0.9.0", "scripts": { "dev": "bun x vite", "build": "bun x vite build", diff --git a/src/component/Drawer/$Drawer.ts b/src/component/Drawer/$Drawer.ts index 0cf171b..9e2647c 100644 --- a/src/component/Drawer/$Drawer.ts +++ b/src/component/Drawer/$Drawer.ts @@ -45,10 +45,11 @@ export class $Drawer extends $Container { $('icon-button').icon('log-in-outline').content('Logout').on('dblclick', () => Booru.used.logout()).hide(true) .self(($div => Booru.events.on('login', () => $div.hide(false)).on('logout', () => $div.hide(true)))), - $('icon-button').icon('swap-horizontal').content('Logout').class('switch').content('Switch Booru') + $('icon-button').icon('swap-horizontal').class('switch').content('Switch Booru') .on('click', () => { if (Booru.used === danbooru) Booru.set(safebooru); else Booru.set(danbooru); + this.close(); }), ]) ]), diff --git a/src/component/PostGrid/$PostGrid.ts b/src/component/PostGrid/$PostGrid.ts index fae3177..040e8c1 100644 --- a/src/component/PostGrid/$PostGrid.ts +++ b/src/component/PostGrid/$PostGrid.ts @@ -2,6 +2,7 @@ import { $Layout, type $LayoutEventMap } from "@elexis/layout"; import { Booru } from "../../structure/Booru"; import { Post } from "../../structure/Post"; import { $PostTile } from "../PostTile/$PostTile"; +import { $Input } from "elexis/lib/node/$Input"; interface $PostGridOptions { tags?: string @@ -13,6 +14,7 @@ export class $PostGrid extends $Layout<$PostGridEventMap> { tags?: string; finished = false; limit = 100; + $focus = $.focus(); constructor(options?: $PostGridOptions) { super(); this.tags = options?.tags; @@ -34,6 +36,29 @@ export class $PostGrid extends $Layout<$PostGridEventMap> { this.on('resize', () => this.resize()) this.events.fire('startLoad'); this.loader(); + this.$focus.layer(100).loop(false).scrollThreshold($.rem(2) + 60); + + $.keys($(window)) + .if(e => { + if ($(e.target) instanceof $Input) return; + if (!this.inDOM()) return; + return true; + }) + .keydown('Tab', e => { + e.preventDefault(); + if (e.shiftKey) this.$focus.prev(); + else this.$focus.next(); + }) + .keydown(['w', 'W'], e => { e.preventDefault(); this.$focus.up(); }) + .keydown(['s', 'S'], e => { e.preventDefault(); this.$focus.down(); }) + .keydown(['d', 'D'], e => { e.preventDefault(); this.$focus.right(); }) + .keydown(['a', 'A'], e => { e.preventDefault(); this.$focus.left(); }) + .keydown([' ', 'Enter'], e => { + e.preventDefault(); + const focused = this.$focus.currentLayer?.currentFocus; + if (focused instanceof $PostTile) $.open(`/posts/${focused.post.id}`); + }) + .keydown(['Escape'], e => { e.preventDefault(); this.$focus.blur(); }) } protected async loader() { @@ -63,7 +88,8 @@ export class $PostGrid extends $Layout<$PostGridEventMap> { this.$posts.set(post, $post); this.posts.add(post); } - const $posts = [...this.orderMap.values()].map(post => this.$posts.get(post)); + this.$focus.layer(100).removeAll(); + const $posts = [...this.orderMap.values()].map(post => this.$posts.get(post)?.self(this.$focus.layer(100).add)); this.content($posts).render(); return this; } diff --git a/src/component/PostGrid/_$PostGrid.scss b/src/component/PostGrid/_$PostGrid.scss index a46e8e6..7a62112 100644 --- a/src/component/PostGrid/_$PostGrid.scss +++ b/src/component/PostGrid/_$PostGrid.scss @@ -1,3 +1,12 @@ layout.post-grid { margin-top: 0.4rem; + + &:has(post-tile[focus]) { + post-tile:not([focus]) { + opacity: 0.5; + } + post-tile:hover { + opacity: 1; + } + } } \ No newline at end of file diff --git a/src/component/PostTile/_$PostTile.scss b/src/component/PostTile/_$PostTile.scss index 7fb5c3f..0def99e 100644 --- a/src/component/PostTile/_$PostTile.scss +++ b/src/component/PostTile/_$PostTile.scss @@ -7,7 +7,12 @@ post-tile { overflow: hidden; -webkit-tap-highlight-color: transparent; user-select: none; - + outline: transparent solid 2px; + + &[focus] { + outline: var(--secondary-color-9) solid 2px; + transform: scale(1.02); + } @media (hover: hover) { &:hover { transform: scale(1.02); diff --git a/src/main.ts b/src/main.ts index 796958c..34a77ce 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,7 @@ import 'elexis'; import '@elexis/layout'; import '@elexis/router'; -import { Booru, type BooruOptions } from './structure/Booru'; +import { Booru } from './structure/Booru'; import { post_route } from './route/post/$post_route'; import { $PostGrid } from './component/PostGrid/$PostGrid'; import { $Router, $RouterNavigationDirection } from '@elexis/router'; @@ -10,6 +10,7 @@ import { $IonIcon } from './component/IonIcon/$IonIcon'; import { $IconButton } from './component/IconButton/$IconButton'; import { $login_route } from './route/login/$login_route'; import { $Drawer } from './component/Drawer/$Drawer'; +import { $Input } from 'elexis/lib/node/$Input'; // declare elexis module declare module 'elexis' { export namespace $ { @@ -117,6 +118,7 @@ $(document.body).content([ const TX = 2; e.preventDefault(); function intro() { + $(document.documentElement).css({scrollBehavior: 'auto'}); const transform = $.call(() => { switch ($Router.navigationDirection) { case $RouterNavigationDirection.Forward: return [`translateX(${TX}%)`, `translateX(0%)`]; @@ -134,10 +136,12 @@ $(document.body).content([ easing: 'ease' }, () => { e.switched(); + $(document.documentElement).css({scrollBehavior: ''}); e.nextContent.element?.removeClass('animated') }) } function outro() { + $(document.documentElement).css({scrollBehavior: 'auto'}); const transform = $.call(() => { switch ($Router.navigationDirection) { case $RouterNavigationDirection.Forward: return [`translateX(0%)`, `translateX(-${TX}%)`]; @@ -168,4 +172,11 @@ componentState(undefined, new URL(location.href)) function componentState(beforeURL: URL | undefined, afterURL: URL) { $searchbar.checkURL(beforeURL, afterURL); $drawer.checkURL(beforeURL, afterURL) -} \ No newline at end of file +} +$.keys($(window)) + .if(e => { + if ($(e.target) instanceof $Input) return; + return true; + }) + .keydown(['q', 'Q'], e => { e.preventDefault(); if ($Router.index !== 0) $.back(); }) + .keydown(['e', 'E'], e => { e.preventDefault(); if ($Router.forwardIndex !== 0) $.forward(); }) \ No newline at end of file diff --git a/src/route/post/$post_route.ts b/src/route/post/$post_route.ts index 0fcb78f..071b560 100644 --- a/src/route/post/$post_route.ts +++ b/src/route/post/$post_route.ts @@ -7,6 +7,7 @@ import type { $IonIcon } from "../../component/IonIcon/$IonIcon"; import { numberFormat } from "../../structure/Util"; import { ClientUser } from "../../structure/ClientUser"; import { $VideoController } from "../../component/VideoController/$VideoController"; +import { $Input } from "elexis/lib/node/$Input"; export const post_route = $('route').path('/posts/:id').id('post').builder(({$route, params}) => { if (!Number(params.id)) return $('h1').content('404: POST NOT FOUND'); @@ -18,6 +19,16 @@ export const post_route = $('route').path('/posts/:id').id('post').builder(({$ro original_size: [], video_play_pause: [] }>(); + $.keys($(window)) + .if(e => { + if ($(e.target) instanceof $Input) return; + if (!$route.inDOM()) return; + return true; + }) + .keydown(['f', 'F'], e => { + if (Booru.used.user?.favorites.has(post.id)) post.deleteFavorite(); + else post.createFavorite(); + }) return [ $('div').class('viewer').content(async ($viewer) => { const $video = $('video');