@livx.cc/bare-v3 0.1.0-alpha.122 → 0.1.0-alpha.124

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -38,7 +38,7 @@ ${r?'Expression: "'+r+`"
38
38
  min-height:44px;min-width:44px;}
39
39
  .b3-image-viewer>.b3-image-viewer-close{inset-inline-end:var(--b3-space,1rem);}
40
40
  .b3-image-viewer>.b3-image-viewer-fit{inset-inline-start:var(--b3-space,1rem);}
41
- `;class ir extends Ne{static observedAttributes=["src","alt","max-scale","open"];#t=1;#e=0;#n=0;#l=!1;#s=null;#i=new Map;#c=!1;#p=0;#r=0;#y=0;#v=0;#k=!1;#w=null;#m=null;#A=new WeakSet;#d=null;get scale(){return this.#t}get fitted(){return this.#t<=fe}get src(){return this.#d??this.getAttribute("src")}set src(e){if(e&&typeof e==="object")this.#d=e.src??e.default??String(e);else if(this.#d=null,e==null)this.removeAttribute("src");else this.setAttribute("src",e);this.#_()}get alt(){return this.getAttribute("alt")??""}set alt(e){this.setAttribute("alt",e??"")}get maxScale(){let e=Number(this.getAttribute("max-scale"));return e>=1?e:8}set maxScale(e){this.setAttribute("max-scale",String(e))}get open(){return this.hasAttribute("open")}set open(e){this.toggleAttribute("open",Boolean(e))}connectedCallback(){if(this.#k)return;if(this.#k=!0,Be(this.ownerDocument,ca,da),this.classList.add("b3-image-viewer"),!this.hasAttribute("tabindex"))this.tabIndex=0;if(!this.hasAttribute("role"))this.setAttribute("role","group");this.#E(),this.#_(),this.#M(),this.#m=new MutationObserver(()=>{this.#S(),this.#f()}),this.#m.observe(this,{childList:!0}),this.#S(),this.#f()}disconnectedCallback(){this.#w?.abort(),this.#w=null,this.#m?.disconnect(),this.#m=null;for(let e of this.#i.keys())if(this.hasPointerCapture?.(e))this.releasePointerCapture(e);this.#i.clear(),this.#s=null,this.#c=!1,this.#k=!1}attributeChangedCallback(e,t,r){if(t===r)return;if(e==="src")this.#_(),this.reset();if(e==="alt"){let n=this.#h();if(n)n.alt=this.alt;this.#E()}if(e==="open"){if(this.#S(),this.reset(),this.open)this.focus({preventScroll:!0})}if(e==="max-scale"&&this.#t>this.maxScale)this.zoomTo(this.maxScale)}#h(){return this.querySelector(":scope > img, :scope > svg, :scope > canvas")}#_(){let e=this.#h(),t=this.src,r=!1;if(!e&&t)e=this.ownerDocument.createElement("img"),r=!0,this.prepend(e);if(!e)return;if(t&&e.tagName==="IMG"&&e.getAttribute("src")!==t)e.setAttribute("src",t);if(e.tagName==="IMG"&&(r||this.hasAttribute("alt")))e.alt=this.alt;if(this.#E(),e.tagName==="IMG")this.#o(e)}#E(){if(this.hasAttribute("aria-labelledby"))return;let e=this.getAttribute("alt");if(e)this.setAttribute("aria-label",e);else if(!this.hasAttribute("aria-label"))this.setAttribute("aria-label","Zoomable image")}#o(e){if(this.#A.has(e))return;if(this.#A.add(e),e.addEventListener("load",()=>{this.removeAttribute("data-b3-error"),this.reset()}),e.addEventListener("error",()=>this.#g(e)),e.complete&&e.naturalWidth===0&&e.getAttribute("src"))setTimeout(()=>{if(e.isConnected&&e.complete&&e.naturalWidth===0)this.#g(e)},0)}#g(e){if(this.hasAttribute("data-b3-error"))return;this.setAttribute("data-b3-error",""),this.dispatchEvent(new CustomEvent("b3-error",{bubbles:!0,composed:!0,detail:{src:e.getAttribute("src")??this.src??null}}))}#S(){if(!this.open){for(let t of this.querySelectorAll(":scope > .b3-image-viewer-close"))t.remove();return}if(this.querySelector(":scope > .b3-image-viewer-close"))return;let e=this.ownerDocument.createElement("button");e.type="button",e.className="b3-image-viewer-close",e.setAttribute("aria-label","Close"),e.textContent="×",e.addEventListener("click",(t)=>{t.preventDefault(),t.stopPropagation(),this.requestClose()}),e.addEventListener("pointerdown",(t)=>t.stopPropagation()),this.append(e)}#u(){let e=this.#h();if(!e)return null;let t=e.style.transform;e.style.transform="none";let r=this.getBoundingClientRect(),n=e.getBoundingClientRect();return e.style.transform=t,this.#l=n.width>r.width+1||n.height>r.height+1,{element:e,vw:r.width,vh:r.height,x:n.left-r.left,y:n.top-r.top,w:n.width,h:n.height}}#a(e){if(this.#t<=fe&&!this.#l){this.#e=0,this.#n=0;return}let t=e.w*this.#t,r=e.h*this.#t;this.#e=t<=e.vw?(e.vw-t)/2-e.x:Math.min(-e.x,Math.max(-e.x-(t-e.vw),this.#e)),this.#n=r<=e.vh?(e.vh-r)/2-e.y:Math.min(-e.y,Math.max(-e.y-(r-e.vh),this.#n))}#f(e){let t=e?.element??this.#h();if(!t)return;let r=this.#t<=fe,n=!r||this.#l;t.style.transformOrigin="0 0",t.style.transform=r&&!this.#e&&!this.#n?"":`translate(${this.#e}px, ${this.#n}px) scale(${this.#t})`,t.style.setProperty("--b3-zoom",String(this.#t)),this.toggleAttribute("data-b3-zoomed",!r),this.toggleAttribute("data-b3-pannable",n),this.style.touchAction=n||this.open?"none":"pan-y";let i=this.querySelector(":scope > .b3-image-viewer-fit");if(i)i.hidden=r}#C(e,t,r,n=this.#u()){if(!n)return;let i=this.#t;e=Math.max(1,Math.min(this.maxScale,e));let o=(t-this.#e)/this.#t,s=(r-this.#n)/this.#t;if(this.#e=t-o*e,this.#n=r-s*e,this.#t=e,this.#a(n),this.#f(n),i!==this.#t)this.#T()}#T(){this.dispatchEvent(new CustomEvent("b3-zoom",{bubbles:!0,composed:!0,detail:{scale:this.#t,fitted:this.fitted,src:this.src}}))}reset(){let e=this.#t!==1;this.#t=1,this.#e=0,this.#n=0;let t=this.#u();if(t)this.#a(t);if(this.#f(t),e)this.#T()}zoomTo(e){let t=this.#u();if(t)this.#C(e,t.vw/2,t.vh/2,t)}requestClose(){this.dispatchEvent(new CustomEvent("b3-close",{bubbles:!0,composed:!0,detail:{src:this.src}}))}#x(){let e=0,t=0;for(let r of this.#i.values())e+=r.x,t+=r.y;return{x:e/this.#i.size,y:t/this.#i.size}}#O(){let[e,t]=[...this.#i.values()];return Math.hypot(e.x-t.x,e.y-t.y)}#M(){this.#w=new AbortController;let e={signal:this.#w.signal},t={...e,passive:!1};this.addEventListener("pointerdown",(n)=>{if(n.pointerType==="mouse"&&n.button!==0)return;if(!this.#h())return;if(this.#i.set(n.pointerId,{x:n.clientX,y:n.clientY}),this.#s=this.#u(),this.#i.size>1||this.#t>fe||this.#l)this.setPointerCapture(n.pointerId),n.preventDefault()},e),this.addEventListener("pointermove",(n)=>{if(!this.#i.has(n.pointerId))return;let i=this.#i.size===2;if(!i&&this.#t<=fe&&!this.#l){this.#i.set(n.pointerId,{x:n.clientX,y:n.clientY});return}if(this.#s??=this.#u(),!this.#s)return;n.preventDefault();let o=this.#x(),s=i?this.#O():0;this.#i.set(n.pointerId,{x:n.clientX,y:n.clientY});let a=this.#x(),l=i?this.#O():0,c=this.getBoundingClientRect(),d=this.#t,u=i&&s>0?Math.max(1,Math.min(this.maxScale,this.#t*(l/s))):this.#t,f=(o.x-c.left-this.#e)/this.#t,b=(o.y-c.top-this.#n)/this.#t;if(this.#e=a.x-c.left-f*u,this.#n=a.y-c.top-b*u,this.#t=u,this.#a(this.#s),this.#f(this.#s),this.#c=!0,d!==this.#t)this.#T()},t);let r=(n)=>{if(!this.#i.delete(n.pointerId))return;if(this.hasPointerCapture?.(n.pointerId))this.releasePointerCapture(n.pointerId);if(this.#i.size){this.#s=this.#u();return}if(this.#s=null,this.#c){this.#p=performance.now(),this.#c=!1;return}if(n.type!=="pointerup")return;let i=performance.now(),o=Math.hypot(n.clientX-this.#y,n.clientY-this.#v)<aa;if(i-this.#r<oa&&o){this.#r=0;let s=this.getBoundingClientRect();this.#C(this.#t>fe?1:2.5,n.clientX-s.left,n.clientY-s.top),this.#p=i}else this.#r=i,this.#y=n.clientX,this.#v=n.clientY};this.addEventListener("pointerup",r,e),this.addEventListener("pointercancel",r,e),this.addEventListener("click",(n)=>{if(n.target.closest?.(".b3-image-viewer-close, .b3-image-viewer-fit"))return;if(performance.now()-this.#p<la){n.preventDefault(),n.stopPropagation();return}if(this.open&&this.fitted&&n.target===this)this.requestClose()},{...e,capture:!0}),this.addEventListener("wheel",(n)=>{let i=this.getBoundingClientRect();if(n.ctrlKey){n.preventDefault(),this.#C(this.#t*Math.exp(-n.deltaY/180),n.clientX-i.left,n.clientY-i.top);return}let o=this.#u();if(!o||o.h*this.#t<=o.vh&&!this.#l)return;let s=this.#n;if(this.#n-=n.deltaY,this.#a(o),this.#n===s)return;n.preventDefault(),this.#f(o)},t);for(let n of["gesturestart","gesturechange","gestureend"])this.addEventListener(n,(i)=>i.preventDefault(),t);this.addEventListener("keydown",(n)=>{if(n.metaKey||n.altKey)return;let i=n.shiftKey?80:40,o=(s,a)=>{let l=this.#u();if(!l||this.fitted)return!1;return this.#e+=s,this.#n+=a,this.#a(l),this.#f(l),!0};switch(n.key){case"+":case"=":this.zoomTo(this.#t*1.5);break;case"-":case"_":this.zoomTo(this.#t/1.5);break;case"0":this.reset();break;case"Enter":case" ":this.zoomTo(this.fitted?2.5:1);break;case"Escape":if(!this.open)return;this.requestClose();break;case"ArrowLeft":if(!o(i,0))return;break;case"ArrowRight":if(!o(-i,0))return;break;case"ArrowUp":if(!o(0,i))return;break;case"ArrowDown":if(!o(0,-i))return;break;default:return}n.preventDefault()},e),this.ownerDocument.defaultView.addEventListener("resize",()=>{let n=this.#u();if(n)this.#a(n),this.#f(n)},e)}}var ri=ir;function sr(e="b3-image-viewer"){if(typeof customElements>"u")return null;let t=customElements.get?.(e);if(t)return t;let r=ri;return ri=class extends ir{},customElements.define(e,r),r}sr();var ua=/(^|\s)([#@][\p{L}\p{N}_-]+)/gu,fa=/(?:\s+[#@][\p{L}\p{N}_-]+)+\s*$/u,ha=350,Ie=()=>globalThis.crypto?.randomUUID?.()??Math.random().toString(36).slice(2,11),or=(e)=>JSON.parse(JSON.stringify(nr(e))),y=(e,t)=>e!=null&&String(e)===String(t),rt=(e)=>!!e&&typeof e==="object",A=(e)=>Array.isArray(e.subtasks)?e.subtasks:[],he=(e)=>Array.isArray(e.comments)?e.comments:[];function ba(e,t){if(e==null||e==="")return"";let r=new Date(typeof e==="string"?e.replace(" ","T"):e).getTime();if(!Number.isFinite(r))return"";let n=Math.max(0,Math.round((t-r)/60000));if(n<1)return"just now";for(let[i,o]of[["y",525600],["mo",43200],["w",10080],["d",1440],["h",60]])if(n>=o)return`${Math.floor(n/o)}${i} ago`;return`${n}m ago`}var ui=(e)=>[...e.filter((t)=>t.starred),...e.filter((t)=>!t.starred)];function ar(e){if(!Array.isArray(e))return[];let t=new Set,r=(n)=>{let{id:i}=n;if(!(typeof i==="string"&&i!==""||typeof i==="number"&&Number.isFinite(i))||t.has(String(i)))n.id=Ie();t.add(String(n.id))};return e.filter(rt).map((n)=>{r(n),n.cards=ui(Array.isArray(n.cards)?n.cards.filter(rt):[]);for(let i of n.cards){if(r(i),Array.isArray(i.subtasks)){for(let o of i.subtasks)if(rt(o))r(o)}if(Array.isArray(i.comments)){for(let o of i.comments)if(rt(o))r(o)}}return n})}function ni(e,{field:t,id:r}){if(t==="name"){let n=e.findIndex((i)=>y(i.id,r));if(n>=0)e.splice(n,1);return}for(let n of e){let i=n.cards.findIndex((o)=>y(o.id,r));if(t==="title"&&i>=0)return void n.cards.splice(i,1);if(t==="subtask")for(let o of n.cards){let s=A(o),a=s.findIndex((l)=>y(l.id,r));if(a>=0)return void s.splice(a,1)}}}function pa(e,t,r){let{field:n,id:i}=r,o=(s,a,l)=>s.splice(Math.min(l,s.length),0,nr(a));if(n==="name"){let s=e.findIndex((a)=>y(a.id,i));if(s>=0&&!t.some((a)=>y(a.id,i)))o(t,e[s],s);return}for(let s of e){let a=s.cards.findIndex((l)=>y(l.id,i));if(n==="title"&&a>=0){let l=t.find((c)=>y(c.id,s.id));if(l&&!l.cards.some((c)=>y(c.id,i)))o(l.cards,s.cards[a],a);return}if(n==="subtask")for(let l of s.cards){let c=A(l).findIndex((u)=>y(u.id,i));if(c<0)continue;let d=t.flatMap((u)=>u.cards).find((u)=>y(u.id,l.id));if(d&&!A(d).some((u)=>y(u.id,i))){if(!Array.isArray(d.subtasks))d.subtasks=[];o(d.subtasks,A(l)[c],c)}return}}}var fi=(e)=>e.toLowerCase().split(/\s+/).filter(Boolean);function ma(e){return[e.title??"",e.description??"",...A(e).map((t)=>t.title??""),...st(e),...he(e).map((t)=>t.text??"")].join(`
41
+ `;class ir extends Ne{static observedAttributes=["src","alt","max-scale","open"];#t=1;#e=0;#n=0;#l=!1;#s=null;#i=new Map;#c=!1;#p=0;#r=0;#m=0;#v=0;#k=!1;#w=null;#g=null;#A=new WeakSet;#d=null;get scale(){return this.#t}get fitted(){return this.#t<=fe}get src(){return this.#d??this.getAttribute("src")}set src(e){if(e&&typeof e==="object")this.#d=e.src??e.default??String(e);else if(this.#d=null,e==null)this.removeAttribute("src");else this.setAttribute("src",e);this.#_()}get alt(){return this.getAttribute("alt")??""}set alt(e){this.setAttribute("alt",e??"")}get maxScale(){let e=Number(this.getAttribute("max-scale"));return e>=1?e:8}set maxScale(e){this.setAttribute("max-scale",String(e))}get open(){return this.hasAttribute("open")}set open(e){this.toggleAttribute("open",Boolean(e))}connectedCallback(){if(this.#k)return;if(this.#k=!0,Be(this.ownerDocument,ca,da),this.classList.add("b3-image-viewer"),!this.hasAttribute("tabindex"))this.tabIndex=0;if(!this.hasAttribute("role"))this.setAttribute("role","group");this.#E(),this.#_(),this.#M(),this.#g=new MutationObserver(()=>{this.#S(),this.#f()}),this.#g.observe(this,{childList:!0}),this.#S(),this.#f()}disconnectedCallback(){this.#w?.abort(),this.#w=null,this.#g?.disconnect(),this.#g=null;for(let e of this.#i.keys())if(this.hasPointerCapture?.(e))this.releasePointerCapture(e);this.#i.clear(),this.#s=null,this.#c=!1,this.#k=!1}attributeChangedCallback(e,t,r){if(t===r)return;if(e==="src")this.#_(),this.reset();if(e==="alt"){let n=this.#h();if(n)n.alt=this.alt;this.#E()}if(e==="open"){if(this.#S(),this.reset(),this.open)this.focus({preventScroll:!0})}if(e==="max-scale"&&this.#t>this.maxScale)this.zoomTo(this.maxScale)}#h(){return this.querySelector(":scope > img, :scope > svg, :scope > canvas")}#_(){let e=this.#h(),t=this.src,r=!1;if(!e&&t)e=this.ownerDocument.createElement("img"),r=!0,this.prepend(e);if(!e)return;if(t&&e.tagName==="IMG"&&e.getAttribute("src")!==t)e.setAttribute("src",t);if(e.tagName==="IMG"&&(r||this.hasAttribute("alt")))e.alt=this.alt;if(this.#E(),e.tagName==="IMG")this.#o(e)}#E(){if(this.hasAttribute("aria-labelledby"))return;let e=this.getAttribute("alt");if(e)this.setAttribute("aria-label",e);else if(!this.hasAttribute("aria-label"))this.setAttribute("aria-label","Zoomable image")}#o(e){if(this.#A.has(e))return;if(this.#A.add(e),e.addEventListener("load",()=>{this.removeAttribute("data-b3-error"),this.reset()}),e.addEventListener("error",()=>this.#y(e)),e.complete&&e.naturalWidth===0&&e.getAttribute("src"))setTimeout(()=>{if(e.isConnected&&e.complete&&e.naturalWidth===0)this.#y(e)},0)}#y(e){if(this.hasAttribute("data-b3-error"))return;this.setAttribute("data-b3-error",""),this.dispatchEvent(new CustomEvent("b3-error",{bubbles:!0,composed:!0,detail:{src:e.getAttribute("src")??this.src??null}}))}#S(){if(!this.open){for(let t of this.querySelectorAll(":scope > .b3-image-viewer-close"))t.remove();return}if(this.querySelector(":scope > .b3-image-viewer-close"))return;let e=this.ownerDocument.createElement("button");e.type="button",e.className="b3-image-viewer-close",e.setAttribute("aria-label","Close"),e.textContent="×",e.addEventListener("click",(t)=>{t.preventDefault(),t.stopPropagation(),this.requestClose()}),e.addEventListener("pointerdown",(t)=>t.stopPropagation()),this.append(e)}#u(){let e=this.#h();if(!e)return null;let t=e.style.transform;e.style.transform="none";let r=this.getBoundingClientRect(),n=e.getBoundingClientRect();return e.style.transform=t,this.#l=n.width>r.width+1||n.height>r.height+1,{element:e,vw:r.width,vh:r.height,x:n.left-r.left,y:n.top-r.top,w:n.width,h:n.height}}#a(e){if(this.#t<=fe&&!this.#l){this.#e=0,this.#n=0;return}let t=e.w*this.#t,r=e.h*this.#t;this.#e=t<=e.vw?(e.vw-t)/2-e.x:Math.min(-e.x,Math.max(-e.x-(t-e.vw),this.#e)),this.#n=r<=e.vh?(e.vh-r)/2-e.y:Math.min(-e.y,Math.max(-e.y-(r-e.vh),this.#n))}#f(e){let t=e?.element??this.#h();if(!t)return;let r=this.#t<=fe,n=!r||this.#l;t.style.transformOrigin="0 0",t.style.transform=r&&!this.#e&&!this.#n?"":`translate(${this.#e}px, ${this.#n}px) scale(${this.#t})`,t.style.setProperty("--b3-zoom",String(this.#t)),this.toggleAttribute("data-b3-zoomed",!r),this.toggleAttribute("data-b3-pannable",n),this.style.touchAction=n||this.open?"none":"pan-y";let i=this.querySelector(":scope > .b3-image-viewer-fit");if(i)i.hidden=r}#C(e,t,r,n=this.#u()){if(!n)return;let i=this.#t;e=Math.max(1,Math.min(this.maxScale,e));let o=(t-this.#e)/this.#t,s=(r-this.#n)/this.#t;if(this.#e=t-o*e,this.#n=r-s*e,this.#t=e,this.#a(n),this.#f(n),i!==this.#t)this.#T()}#T(){this.dispatchEvent(new CustomEvent("b3-zoom",{bubbles:!0,composed:!0,detail:{scale:this.#t,fitted:this.fitted,src:this.src}}))}reset(){let e=this.#t!==1;this.#t=1,this.#e=0,this.#n=0;let t=this.#u();if(t)this.#a(t);if(this.#f(t),e)this.#T()}zoomTo(e){let t=this.#u();if(t)this.#C(e,t.vw/2,t.vh/2,t)}requestClose(){this.dispatchEvent(new CustomEvent("b3-close",{bubbles:!0,composed:!0,detail:{src:this.src}}))}#x(){let e=0,t=0;for(let r of this.#i.values())e+=r.x,t+=r.y;return{x:e/this.#i.size,y:t/this.#i.size}}#O(){let[e,t]=[...this.#i.values()];return Math.hypot(e.x-t.x,e.y-t.y)}#M(){this.#w=new AbortController;let e={signal:this.#w.signal},t={...e,passive:!1};this.addEventListener("pointerdown",(n)=>{if(n.pointerType==="mouse"&&n.button!==0)return;if(!this.#h())return;if(this.#i.set(n.pointerId,{x:n.clientX,y:n.clientY}),this.#s=this.#u(),this.#i.size>1||this.#t>fe||this.#l)this.setPointerCapture(n.pointerId),n.preventDefault()},e),this.addEventListener("pointermove",(n)=>{if(!this.#i.has(n.pointerId))return;let i=this.#i.size===2;if(!i&&this.#t<=fe&&!this.#l){this.#i.set(n.pointerId,{x:n.clientX,y:n.clientY});return}if(this.#s??=this.#u(),!this.#s)return;n.preventDefault();let o=this.#x(),s=i?this.#O():0;this.#i.set(n.pointerId,{x:n.clientX,y:n.clientY});let a=this.#x(),l=i?this.#O():0,c=this.getBoundingClientRect(),d=this.#t,u=i&&s>0?Math.max(1,Math.min(this.maxScale,this.#t*(l/s))):this.#t,f=(o.x-c.left-this.#e)/this.#t,b=(o.y-c.top-this.#n)/this.#t;if(this.#e=a.x-c.left-f*u,this.#n=a.y-c.top-b*u,this.#t=u,this.#a(this.#s),this.#f(this.#s),this.#c=!0,d!==this.#t)this.#T()},t);let r=(n)=>{if(!this.#i.delete(n.pointerId))return;if(this.hasPointerCapture?.(n.pointerId))this.releasePointerCapture(n.pointerId);if(this.#i.size){this.#s=this.#u();return}if(this.#s=null,this.#c){this.#p=performance.now(),this.#c=!1;return}if(n.type!=="pointerup")return;let i=performance.now(),o=Math.hypot(n.clientX-this.#m,n.clientY-this.#v)<aa;if(i-this.#r<oa&&o){this.#r=0;let s=this.getBoundingClientRect();this.#C(this.#t>fe?1:2.5,n.clientX-s.left,n.clientY-s.top),this.#p=i}else this.#r=i,this.#m=n.clientX,this.#v=n.clientY};this.addEventListener("pointerup",r,e),this.addEventListener("pointercancel",r,e),this.addEventListener("click",(n)=>{if(n.target.closest?.(".b3-image-viewer-close, .b3-image-viewer-fit"))return;if(performance.now()-this.#p<la){n.preventDefault(),n.stopPropagation();return}if(this.open&&this.fitted&&n.target===this)this.requestClose()},{...e,capture:!0}),this.addEventListener("wheel",(n)=>{let i=this.getBoundingClientRect();if(n.ctrlKey){n.preventDefault(),this.#C(this.#t*Math.exp(-n.deltaY/180),n.clientX-i.left,n.clientY-i.top);return}let o=this.#u();if(!o||o.h*this.#t<=o.vh&&!this.#l)return;let s=this.#n;if(this.#n-=n.deltaY,this.#a(o),this.#n===s)return;n.preventDefault(),this.#f(o)},t);for(let n of["gesturestart","gesturechange","gestureend"])this.addEventListener(n,(i)=>i.preventDefault(),t);this.addEventListener("keydown",(n)=>{if(n.metaKey||n.altKey)return;let i=n.shiftKey?80:40,o=(s,a)=>{let l=this.#u();if(!l||this.fitted)return!1;return this.#e+=s,this.#n+=a,this.#a(l),this.#f(l),!0};switch(n.key){case"+":case"=":this.zoomTo(this.#t*1.5);break;case"-":case"_":this.zoomTo(this.#t/1.5);break;case"0":this.reset();break;case"Enter":case" ":this.zoomTo(this.fitted?2.5:1);break;case"Escape":if(!this.open)return;this.requestClose();break;case"ArrowLeft":if(!o(i,0))return;break;case"ArrowRight":if(!o(-i,0))return;break;case"ArrowUp":if(!o(0,i))return;break;case"ArrowDown":if(!o(0,-i))return;break;default:return}n.preventDefault()},e),this.ownerDocument.defaultView.addEventListener("resize",()=>{let n=this.#u();if(n)this.#a(n),this.#f(n)},e)}}var ri=ir;function sr(e="b3-image-viewer"){if(typeof customElements>"u")return null;let t=customElements.get?.(e);if(t)return t;let r=ri;return ri=class extends ir{},customElements.define(e,r),r}sr();var ua=/(^|\s)([#@][\p{L}\p{N}_-]+)/gu,fa=/(?:\s+[#@][\p{L}\p{N}_-]+)+\s*$/u,ha=350,Ie=()=>globalThis.crypto?.randomUUID?.()??Math.random().toString(36).slice(2,11),or=(e)=>JSON.parse(JSON.stringify(nr(e))),y=(e,t)=>e!=null&&String(e)===String(t),rt=(e)=>!!e&&typeof e==="object",A=(e)=>Array.isArray(e.subtasks)?e.subtasks:[],he=(e)=>Array.isArray(e.comments)?e.comments:[];function ba(e,t){if(e==null||e==="")return"";let r=new Date(typeof e==="string"?e.replace(" ","T"):e).getTime();if(!Number.isFinite(r))return"";let n=Math.max(0,Math.round((t-r)/60000));if(n<1)return"just now";for(let[i,o]of[["y",525600],["mo",43200],["w",10080],["d",1440],["h",60]])if(n>=o)return`${Math.floor(n/o)}${i} ago`;return`${n}m ago`}var ui=(e)=>[...e.filter((t)=>t.starred),...e.filter((t)=>!t.starred)];function ar(e){if(!Array.isArray(e))return[];let t=new Set,r=(n)=>{let{id:i}=n;if(!(typeof i==="string"&&i!==""||typeof i==="number"&&Number.isFinite(i))||t.has(String(i)))n.id=Ie();t.add(String(n.id))};return e.filter(rt).map((n)=>{r(n),n.cards=ui(Array.isArray(n.cards)?n.cards.filter(rt):[]);for(let i of n.cards){if(r(i),Array.isArray(i.subtasks)){for(let o of i.subtasks)if(rt(o))r(o)}if(Array.isArray(i.comments)){for(let o of i.comments)if(rt(o))r(o)}}return n})}function ni(e,{field:t,id:r}){if(t==="name"){let n=e.findIndex((i)=>y(i.id,r));if(n>=0)e.splice(n,1);return}for(let n of e){let i=n.cards.findIndex((o)=>y(o.id,r));if(t==="title"&&i>=0)return void n.cards.splice(i,1);if(t==="subtask")for(let o of n.cards){let s=A(o),a=s.findIndex((l)=>y(l.id,r));if(a>=0)return void s.splice(a,1)}}}function pa(e,t,r){let{field:n,id:i}=r,o=(s,a,l)=>s.splice(Math.min(l,s.length),0,nr(a));if(n==="name"){let s=e.findIndex((a)=>y(a.id,i));if(s>=0&&!t.some((a)=>y(a.id,i)))o(t,e[s],s);return}for(let s of e){let a=s.cards.findIndex((l)=>y(l.id,i));if(n==="title"&&a>=0){let l=t.find((c)=>y(c.id,s.id));if(l&&!l.cards.some((c)=>y(c.id,i)))o(l.cards,s.cards[a],a);return}if(n==="subtask")for(let l of s.cards){let c=A(l).findIndex((u)=>y(u.id,i));if(c<0)continue;let d=t.flatMap((u)=>u.cards).find((u)=>y(u.id,l.id));if(d&&!A(d).some((u)=>y(u.id,i))){if(!Array.isArray(d.subtasks))d.subtasks=[];o(d.subtasks,A(l)[c],c)}return}}}var fi=(e)=>e.toLowerCase().split(/\s+/).filter(Boolean);function ma(e){return[e.title??"",e.description??"",...A(e).map((t)=>t.title??""),...st(e),...he(e).map((t)=>t.text??"")].join(`
42
42
  `).toLowerCase()}var ii=(e,t)=>{let r=String(t.text??"").toLowerCase();return fi(e).some((n)=>r.includes(n))};function st(e){let t=new Set((e.tags??[]).map((n)=>(/^[#@]/.test(n)?n:`#${n}`).toLowerCase())),r=[e.title??"",e.description??"",...A(e).map((n)=>n.title??"")].join(`
43
43
  `);for(let[,,n]of r.matchAll(ua))t.add(n.toLowerCase());return[...t]}var si=String.raw`(<[^<>\n]+>|(?:[^()\n]|\([^()\n]*\))+)`,ga=new RegExp(String.raw`!\[([^\]\n]*)\]\(${si}\)|\[([^\]\n]+)\]\(${si}\)|\[([^[\]\s]*\/[^[\]\s]*\.[a-z][a-z\d]{0,7}|[^[\]\s\/]+\.(?:md|markdown|txt|json|ya?ml|csv|log|pdf|png|jpe?g|gif|webp|svg|html|kanban))\](?![(\[])|\bhttps?:\/\/[^\s<>]+`,"giu"),ya=new Set(["javascript","data","vbscript","file","blob","about"]),xa=(e)=>{let t=e.trim();return t.startsWith("<")&&t.endsWith(">")?t.slice(1,-1):t.replace(/\s+"[^"\n]*"$/,"")};function va(e,t=[]){if(/[\u0000-\u001f\u007f\\]/.test(e)||/\s/.test(e.replaceAll(" ",""))||e!==e.trim()||!e)return null;let r=/^([a-z][a-z\d+.-]*):/i.exec(e)?.[1].toLowerCase();if(r==="http"||r==="https"||r==="mailto")return{href:e,file:!1};if(r)return!ya.has(r)&&t.includes(r)?{href:e,file:!1}:null;return e.startsWith("//")?null:{href:e,file:!0}}var oi=(e)=>(e??"").toLowerCase().split(/[\s,]+/).map((t)=>t.replace(/:$/,"")).filter(Boolean),ai=(e)=>(e??"").toLowerCase().split(",").map((t)=>t.trim()).filter(Boolean),lr=(e,t)=>!!t&&e.includes(String(t.name??"").trim().toLowerCase());function dr(e,t=[]){let r=[],n=0;for(let i of e.matchAll(ga)){let o=i[2]!==void 0,[s]=i,a=o?i[1]:i[3]??i[5],l=o?i[2]:i[4]??i[5],c=i.index+s.length;if(!l){let u=s;for(;;){if(u=u.replace(/[.,;:!?'"\]]+$/u,""),!u.endsWith(")")||u.split("(").length>=u.split(")").length)break;u=u.slice(0,-1)}c-=s.length-u.length,s=a=l=u}else l=xa(l);let d=va(l,t);if(!d||o&&!d.file&&!/^https?:/i.test(d.href))continue;if(i.index>n)r.push(e.slice(n,i.index));r.push({text:a,...d,...o?{image:o}:{}}),n=c}if(n<e.length)r.push(e.slice(n));return r}var li=(e,t=[])=>dr(e,t).map((r)=>typeof r==="string"?r:r.text).join(""),cr=null;function wa(e,t,r=[]){let n=e.ownerDocument;e.replaceChildren(...dr(t,r).map((i)=>{if(typeof i==="string")return n.createTextNode(i);let o=n.createElement("a");if(o.className="b3-board-ref",o.href=i.href,o.dataset.href=i.href,o.draggable=!1,i.image){let s=n.createElement("img");if(s.src=i.href,s.alt=i.text,s.loading="lazy",s.draggable=!1,o.classList.add("b3-board-image"),o.append(s),i.file)o.dataset.file="";else o.target="_blank",o.rel="noopener noreferrer";return o}if(i.file){if(o.dataset.file="",!cr){let s=n.createElement("template");s.innerHTML=Aa,cr=s.content.firstElementChild}o.append(cr.cloneNode(!0))}else if(/^https?:/i.test(i.href))o.target="_blank",o.rel="noopener noreferrer";return o.append(i.text),o}))}var _a="b3-board-style",Ea=`
44
44
  :where(b3-board){--b3-board-hit:var(--b3-d-control,var(--b3-touch,2.75rem));--b3-board-chip:var(--b3-d-control-small,2rem);
@@ -109,7 +109,9 @@ b3-board{display:flex;flex-direction:column;min-inline-size:0;min-block-size:0;c
109
109
  .b3-board-card{position:relative;display:grid;grid-template-columns:minmax(0,1fr);gap:.25rem;padding:.625rem .5rem .625rem .75rem;
110
110
  border:1px solid var(--b3-board-line);border-radius:var(--b3-radius);background:var(--b3-color-surface);
111
111
  box-shadow:0 1px 2px color-mix(in srgb,var(--b3-color-text) 6%,transparent);transition:box-shadow var(--b3-duration,.16s),border-color var(--b3-duration,.16s);
112
- -webkit-touch-callout:none;-webkit-user-select:none;user-select:none;}
112
+ -webkit-touch-callout:none;}
113
+ /* Card text is selectable; its handles (grip, title) and controls aren't, so a drag there moves rather than selects. */
114
+ .b3-board-card :is(.b3-board-grip,.b3-board-card-head>.b3-board-title,button){-webkit-user-select:none;user-select:none;}
113
115
  /* The selected card (the keys act on it): one solid ring inside its border — never clipped by the column, kept while focus
114
116
  is elsewhere, apart from hover's faint tint. A focused card is always the selected one, so focus draws no ring of its own. */
115
117
  .b3-board-card:focus{outline:none;}
@@ -333,8 +335,8 @@ b3-board [data-b3-drop="before"]{box-shadow:0 -3px 0 -1px var(--b3-color-accent)
333
335
  </template>
334
336
  <button type="button" class="b3-board-link b3-board-add" b3x-show="!readonly" b3x-on:click="addColumn()">${nt}<span>Add column</span></button>
335
337
  </div>
336
- <span class="b3-visually-hidden" role="status" b3x-text="announcement"></span>`;class hi extends Ne{static observedAttributes=["readonly","search","link-schemes","searchable","expand-in"];#t=null;#e=null;#n=null;#l=null;#s=null;#i=!1;#c=null;#p=null;#r=null;#y=!1;#v=null;#k=0;#w=Math.random().toString(36).slice(2,8);#m=!1;#A=[];#d={past:[],future:[],now:null,key:"",at:0};#h=!1;get columns(){let e=or(this.#e?.columns??this.#n??[]),t=this.#e?.editing;if(t?.fresh)ni(e,t);return e}set columns(e){let t=ar(or(e));if(!this.#e){this.#n=t;return}this.#b();let r=this.#q();if(r)this.#j(r);let n=this.#e;if(n.editing?.fresh)pa(n.columns,t,n.editing);if(n.columns=t,n.editing&&!this.#o(n.editing.id))n.editing=null;if(!this.#h)this.#d={past:[],future:[],now:null,key:"",at:0};this.#d.now=this.columns}undo(){return this.#_(-1)}openSearch(){if(!this.#e?.searchable)return!1;return this.#e.openSearch(),!0}redo(){return this.#_(1)}get canUndo(){return!this.readonly&&(this.#d.past.length>0||!!this.#e?.editing)}get canRedo(){return!this.readonly&&this.#d.future.length>0}#_(e){let t=this.#e;if(!t||this.readonly)return!1;t.settle();let r=this.#d,i=(e<0?r.past:r.future).pop();if(!i||!r.now)return!1;(e<0?r.future:r.past).push(r.now),r.key="";let o=new Map(t.columns.flatMap((a)=>a.cards.map((l)=>[String(l.id),l.expanded]))),s=ar(or(i));for(let a of s)for(let l of a.cards){let c=o.get(String(l.id));if(o.has(String(l.id)))if(c===void 0)delete l.expanded;else l.expanded=c}return this.#b(),t.columns=s,r.now=this.columns,this.#a(e<0?"Undone":"Redone"),this.#E({type:e<0?"undo":"redo"}),!0}#E(e){this.#h=!0;try{this.dispatchEvent(new CustomEvent("b3-change",{bubbles:!0,detail:{columns:this.columns,action:e}}))}finally{this.#h=!1}}get filter(){return[...this.#e?.filter??this.#l??[]]}set filter(e){let t=[...e??[]].map((r)=>String(r).toLowerCase());if(this.#e){if(t.join(" ")!==this.#e.filter.join(" "))this.#e.kept=[];this.#e.filter=t}else this.#l=t}get search(){return this.#e?.search??this.#s??""}set search(e){let t=String(e??"");if(this.#e){if(t!==this.#e.search)this.#e.kept=[];this.#e.search=t}else this.#s=t}get defaultColumn(){return this.getAttribute("default-column")??""}set defaultColumn(e){if(e)this.setAttribute("default-column",String(e));else this.removeAttribute("default-column")}addCard(e){let t=this.#e;if(!t||this.readonly)return!1;let r=e??this.defaultColumn,n=String(r).trim().toLowerCase(),i=r!==""&&(t.columns.find((o)=>y(o.id,r))??t.columns.find((o)=>String(o.name??"").trim().toLowerCase()===n))||(e===void 0?t.columns[0]:void 0);if(!i)return!1;return t.addCard(i),!0}get upload(){return this.#v}set upload(e){this.#v=typeof e==="function"?e:null}get readonly(){return this.hasAttribute("readonly")}set readonly(e){this.toggleAttribute("readonly",!!e)}connectedCallback(){for(let t of["columns","filter","search","defaultColumn","readonly","upload"]){if(!Object.hasOwn(this,t))continue;let r=this[t];delete this[t],this[t]=r}let e=this.ownerDocument;if(!this.#t&&e.readyState==="loading"){if(!this.#i)this.#i=!0,e.addEventListener("DOMContentLoaded",()=>{if(this.#i=!1,this.isConnected)this.connectedCallback()},{once:!0});return}if(Be(e,_a,Ea),ti(),!this.#t){let t=this.querySelector(':scope > script[type="application/json"]'),r=this.#n;if(!r&&t)try{r=ar(JSON.parse(t.textContent||"[]"))}catch(n){console.warn("b3-board: ignoring unreadable JSON data",n)}this.#t=e.createElement("div"),this.#t.className="b3-board-ui",this.append(this.#t),this.#e=Qn(this.#t,Oa,this.#S(r??[],this.#l??[],this.#s??this.getAttribute("search")??"")),this.#n=this.#l=this.#s=null,this.#d.now=this.columns}else if(this.#t.parentNode!==this)this.append(this.#t);this.#p=new MutationObserver(()=>{if(this.#t&&this.#t.parentNode!==this)this.append(this.#t)}),this.#p.observe(this,{childList:!0}),this.#F(),br(this,this.#c.signal,{role:"region"})}disconnectedCallback(){this.#b(),this.#c?.abort(),this.#c=null,this.#$(),this.#p?.disconnect(),this.#p=null}attributeChangedCallback(e,t,r){if(e==="search")return void(this.search=r??"");if(!this.#e)return;if(e==="link-schemes")return void(this.#e.schemes=oi(r));if(e==="searchable")return void(this.#e.searchable=r!==null);if(e==="expand-in")return void(this.#e.expandIn=ai(r));if(this.#e.readonly=this.readonly,this.#e.viewed={},this.readonly)this.#b(),this.#e.editing=null}#o(e){for(let t of this.#e?.columns??[]){if(y(t.id,e))return t;for(let r of t.cards)if(y(r.id,e)||A(r).some((n)=>y(n.id,e)))return r}return null}#g(e){let t="card"in e&&e.card!=null&&e.type!=="toggle"&&e.type!=="remove"?this.#o(e.card):null;if(t){if(t.updated=new Date().toISOString(),e.type==="add")t.created=t.updated}let r=this.#d,n=Date.now();if(e.type!=="toggle"){let i=e.type==="edit"?JSON.stringify([e.card,e.column,e.field,e.subtask]):"";if(r.now&&!(i&&i===r.key&&n-r.at<1000)){if(r.past.push(r.now),r.past.length>100)r.past.shift()}r.future=[],r.key=i,r.at=n}r.now=this.columns,this.#E(e)}#S(e,t,r){let n=this,i=(a)=>this.#g(a),o=(a)=>{for(let l of s.columns){let c=l.cards.findIndex((d)=>y(d.id,a));if(c>=0)return{column:l,index:c,card:l.cards[c]}}return null},s=Zn({columns:e,filter:t,search:r,kept:[],editing:null,announcement:"",readonly:n.readonly,searchable:n.hasAttribute("searchable"),expandIn:ai(n.getAttribute("expand-in")),searching:!1,schemes:oi(n.getAttribute("link-schemes")),viewed:{},selected:null,tokensOf:st,subtasksOf:A,commentsOf:he,hits:ii,said(a){return he(a).some((l)=>ii(s.search,l))},now:Date.now(),ago(a){return ba(a,s.now)},label(a){let l=String(a??"");return l.replace(fa,"").trim()||l},pressed(a){return String(s.filter.includes(a))},mention(a){return a.startsWith("@")?"":null},starred(a){return String(!!a.starred)},hasDetails(a){return!!(a.description||A(a).length||he(a).length)},complete(a){let l=A(a).length;return l>0&&s.done(a)===l},preview(a){let l=String(a.description??"");return l.split(`
338
+ <span class="b3-visually-hidden" role="status" b3x-text="announcement"></span>`;class hi extends Ne{static observedAttributes=["readonly","search","link-schemes","searchable","expand-in"];#t=null;#e=null;#n=null;#l=null;#s=null;#i=!1;#c=null;#p=null;#r=null;#m=!1;#v=null;#k=0;#w=Math.random().toString(36).slice(2,8);#g=!1;#A=[];#d={past:[],future:[],now:null,key:"",at:0};#h=!1;get columns(){let e=or(this.#e?.columns??this.#n??[]),t=this.#e?.editing;if(t?.fresh)ni(e,t);return e}set columns(e){let t=ar(or(e));if(!this.#e){this.#n=t;return}this.#b();let r=this.#q();if(r)this.#j(r);let n=this.#e;if(n.editing?.fresh)pa(n.columns,t,n.editing);if(n.columns=t,n.editing&&!this.#o(n.editing.id))n.editing=null;if(!this.#h)this.#d={past:[],future:[],now:null,key:"",at:0};this.#d.now=this.columns}undo(){return this.#_(-1)}openSearch(){if(!this.#e?.searchable)return!1;return this.#e.openSearch(),!0}redo(){return this.#_(1)}get canUndo(){return!this.readonly&&(this.#d.past.length>0||!!this.#e?.editing)}get canRedo(){return!this.readonly&&this.#d.future.length>0}#_(e){let t=this.#e;if(!t||this.readonly)return!1;t.settle();let r=this.#d,i=(e<0?r.past:r.future).pop();if(!i||!r.now)return!1;(e<0?r.future:r.past).push(r.now),r.key="";let o=new Map(t.columns.flatMap((a)=>a.cards.map((l)=>[String(l.id),l.expanded]))),s=ar(or(i));for(let a of s)for(let l of a.cards){let c=o.get(String(l.id));if(o.has(String(l.id)))if(c===void 0)delete l.expanded;else l.expanded=c}return this.#b(),t.columns=s,r.now=this.columns,this.#a(e<0?"Undone":"Redone"),this.#E({type:e<0?"undo":"redo"}),!0}#E(e){this.#h=!0;try{this.dispatchEvent(new CustomEvent("b3-change",{bubbles:!0,detail:{columns:this.columns,action:e}}))}finally{this.#h=!1}}get filter(){return[...this.#e?.filter??this.#l??[]]}set filter(e){let t=[...e??[]].map((r)=>String(r).toLowerCase());if(this.#e){if(t.join(" ")!==this.#e.filter.join(" "))this.#e.kept=[];this.#e.filter=t}else this.#l=t}get search(){return this.#e?.search??this.#s??""}set search(e){let t=String(e??"");if(this.#e){if(t!==this.#e.search)this.#e.kept=[];this.#e.search=t}else this.#s=t}get defaultColumn(){return this.getAttribute("default-column")??""}set defaultColumn(e){if(e)this.setAttribute("default-column",String(e));else this.removeAttribute("default-column")}addCard(e){let t=this.#e;if(!t||this.readonly)return!1;let r=e??this.defaultColumn,n=String(r).trim().toLowerCase(),i=r!==""&&(t.columns.find((o)=>y(o.id,r))??t.columns.find((o)=>String(o.name??"").trim().toLowerCase()===n))||(e===void 0?t.columns[0]:void 0);if(!i)return!1;return t.addCard(i),!0}get upload(){return this.#v}set upload(e){this.#v=typeof e==="function"?e:null}get readonly(){return this.hasAttribute("readonly")}set readonly(e){this.toggleAttribute("readonly",!!e)}connectedCallback(){for(let t of["columns","filter","search","defaultColumn","readonly","upload"]){if(!Object.hasOwn(this,t))continue;let r=this[t];delete this[t],this[t]=r}let e=this.ownerDocument;if(!this.#t&&e.readyState==="loading"){if(!this.#i)this.#i=!0,e.addEventListener("DOMContentLoaded",()=>{if(this.#i=!1,this.isConnected)this.connectedCallback()},{once:!0});return}if(Be(e,_a,Ea),ti(),!this.#t){let t=this.querySelector(':scope > script[type="application/json"]'),r=this.#n;if(!r&&t)try{r=ar(JSON.parse(t.textContent||"[]"))}catch(n){console.warn("b3-board: ignoring unreadable JSON data",n)}this.#t=e.createElement("div"),this.#t.className="b3-board-ui",this.append(this.#t),this.#e=Qn(this.#t,Oa,this.#S(r??[],this.#l??[],this.#s??this.getAttribute("search")??"")),this.#n=this.#l=this.#s=null,this.#d.now=this.columns}else if(this.#t.parentNode!==this)this.append(this.#t);this.#p=new MutationObserver(()=>{if(this.#t&&this.#t.parentNode!==this)this.append(this.#t)}),this.#p.observe(this,{childList:!0}),this.#F(),br(this,this.#c.signal,{role:"region"})}disconnectedCallback(){this.#b(),this.#c?.abort(),this.#c=null,this.#$(),this.#p?.disconnect(),this.#p=null}attributeChangedCallback(e,t,r){if(e==="search")return void(this.search=r??"");if(!this.#e)return;if(e==="link-schemes")return void(this.#e.schemes=oi(r));if(e==="searchable")return void(this.#e.searchable=r!==null);if(e==="expand-in")return void(this.#e.expandIn=ai(r));if(this.#e.readonly=this.readonly,this.#e.viewed={},this.readonly)this.#b(),this.#e.editing=null}#o(e){for(let t of this.#e?.columns??[]){if(y(t.id,e))return t;for(let r of t.cards)if(y(r.id,e)||A(r).some((n)=>y(n.id,e)))return r}return null}#y(e){let t="card"in e&&e.card!=null&&e.type!=="toggle"&&e.type!=="remove"?this.#o(e.card):null;if(t){if(t.updated=new Date().toISOString(),e.type==="add")t.created=t.updated}let r=this.#d,n=Date.now();if(e.type!=="toggle"){let i=e.type==="edit"?JSON.stringify([e.card,e.column,e.field,e.subtask]):"";if(r.now&&!(i&&i===r.key&&n-r.at<1000)){if(r.past.push(r.now),r.past.length>100)r.past.shift()}r.future=[],r.key=i,r.at=n}r.now=this.columns,this.#E(e)}#S(e,t,r){let n=this,i=(a)=>this.#y(a),o=(a)=>{for(let l of s.columns){let c=l.cards.findIndex((d)=>y(d.id,a));if(c>=0)return{column:l,index:c,card:l.cards[c]}}return null},s=Zn({columns:e,filter:t,search:r,kept:[],editing:null,announcement:"",readonly:n.readonly,searchable:n.hasAttribute("searchable"),expandIn:ai(n.getAttribute("expand-in")),searching:!1,schemes:oi(n.getAttribute("link-schemes")),viewed:{},selected:null,tokensOf:st,subtasksOf:A,commentsOf:he,hits:ii,said(a){return he(a).some((l)=>ii(s.search,l))},now:Date.now(),ago(a){return ba(a,s.now)},label(a){let l=String(a??"");return l.replace(fa,"").trim()||l},pressed(a){return String(s.filter.includes(a))},mention(a){return a.startsWith("@")?"":null},starred(a){return String(!!a.starred)},hasDetails(a){return!!(a.description||A(a).length||he(a).length)},complete(a){let l=A(a).length;return l>0&&s.done(a)===l},preview(a){let l=String(a.description??"");return l.split(`
337
339
  `).map((d)=>li(d,s.schemes)).find((d)=>d.trim())?.trim()??(dr(l,s.schemes).some((d)=>typeof d!=="string"&&d.image)?"Image":"")},plain(a){return li(s.label(a),s.schemes)},rich(a,l){wa(a,String(l??""),s.schemes)},keyText(a,l,c,d){if(a.target!==a.currentTarget||a.key!=="Enter"&&a.key!==" ")return;a.preventDefault(),a.stopPropagation(),s.edit(l,c,d)},isOpen(a){let l=s.viewed[String(a.id)];return s.readonly&&l!==void 0?l:a.expanded??(s.hasDetails(a)&&lr(s.expandIn,s.columns.find((c)=>c.cards.some((d)=>y(d.id,a.id)))))},expanded(a){return String(s.isOpen(a))},isSelected(a){return y(s.selected,a.id)},isEditing(a,l){return!!s.editing&&s.editing.field===a&&s.editing.id===l},focusEditor(a){queueMicrotask(()=>n.#C(a))},blurEditor(a,l){if(s.isEditing(a,l))s.commit()},tokens(){let a=new Set;for(let l of s.columns)for(let c of l.cards)for(let d of st(c))a.add(d);return[...a].sort()},visible(a){let l=fi(s.search);if(!s.filter.length&&!l.length)return a.cards;let c=s.editing&&n.#o(s.editing.id);return a.cards.filter((d)=>{if(d===c||s.kept.some((b)=>y(d.id,b)))return!0;let u=st(d),f=l.length?ma(d):"";return s.filter.every((b)=>u.includes(b))&&l.every((b)=>f.includes(b))})},count(a){let l=s.visible(a).length;return l===a.cards.length?String(l):`${l}/${a.cards.length}`},done(a){return A(a).filter((l)=>l.done).length},disclosable(a){return!!(s.hasDetails(a)||!s.readonly)},toggleFilter(a){s.kept=[],s.filter=s.filter.includes(a)?s.filter.filter((l)=>l!==a):[...s.filter,a]},setFilter(a){s.kept=[],s.filter=a},searchShown(){return s.searching||!!s.search},openSearch(){s.searching=!0;let a=n.querySelector(".b3-board-search-input");if(!a)return;a.hidden=!1,a.closest(".b3-board-filters").hidden=!1,a.focus(),a.select()},typeSearch(a){n.search=a.target.value},keySearch(a){if(a.isComposing||a.keyCode===229)return;if(a.key!=="Escape"&&a.key!=="Enter")return;a.preventDefault(),a.stopPropagation();let l=a.target;if(a.key==="Escape")l.value="",n.search="";l.blur()},blurSearch(){s.searching=!1},toggleStar(a){if(s.readonly)return;if(s.editing)s.commit();let l=o(a.id),c=l?.card;if(!l||!c)return;if(c.starred)delete c.starred;else c.starred=!0;l.column.cards=ui(l.column.cards);let d=!!c.starred;s.announcement=`${c.title??""} ${d?"starred":"unstarred"}`,i({type:"star",card:c.id,starred:d}),n.#B(c.id)},toggle(a){if(s.readonly){s.viewed={...s.viewed,[String(a.id)]:!s.isOpen(a)};return}a.expanded=!s.isOpen(a),i({type:"toggle",card:a.id,expanded:a.expanded})},edit(a,l,c,d=!1,u=!1,f=!1){if(s.readonly||n.#r?.started)return;if(s.editing&&!s.isEditing(a,l))s.commit();s.editing={field:a,id:l,draft:c??"",fresh:d,opened:u,atEnd:f},n.#T()},addDetails(a,l=!1){if(s.readonly)return;let c=!s.isOpen(a);a.expanded=!0,s.edit("description",a.id,String(a.description??""),!1,c,l)},keyEditor(a,l){if(a.stopPropagation(),a.key==="Escape")a.preventDefault(),s.cancel();else if(a.key==="Enter"&&!(l&&a.shiftKey)&&!a.isComposing)a.preventDefault(),s.commit(!0);else if(a.key==="Tab"&&!a.altKey&&!a.metaKey&&!a.ctrlKey&&!a.isComposing&&!n.hasAttribute("compact")){let c=s.editing,d=c?.field==="title"&&!a.shiftKey?"description":c?.field==="description"&&a.shiftKey?"title":null;if(!d)return;a.preventDefault(),s.commit();let u=n.#o(c.id);if(!u||s.readonly)return;if(d==="description")s.addDetails(u,!0);else s.edit("title",u.id,String(u.title??""))}},pasteEditor(a,l,c){let d=[...a.clipboardData?.files??[]].filter((u)=>u.type.startsWith("image/"));if(s.readonly||!n.upload||l!=="title"&&l!=="description"||!d.length)return;if(a.clipboardData?.getData("text/plain").trim())return;a.preventDefault();for(let u of d)n.#u(c,u,l==="description"?a.target:null)},cancel(){let a=s.editing;if(s.editing=null,a?.fresh)s.discard(a);if(a?.opened)s.close(a);n.#P(a)},close(a){let l=n.#o(a.id);if(l&&!s.hasDetails(l))l.expanded=!1},commit(a=!1){let l=s.editing;if(!l)return;if(s.editing=null,s.readonly)return;let c=l.field==="description"||l.field==="comment"?l.draft.trim():l.draft.replace(/\s+/g," ").trim(),d=n.#o(l.id);if(!d)return;if(!c&&l.fresh)return s.discard(l);if(!c&&l.opened)s.close(l);let u=null;if(l.field==="comment"){let b=d;if(c){let m={id:Ie(),at:new Date().toISOString(),by:n.getAttribute("author")||"you",text:c};b.comments=[...he(b),m],u={type:"comment",card:b.id,comment:m.id,op:"add"}}}else if(l.field==="name"){let b=d;if(c&&c!==b.name)b.name=c,u={type:"edit",column:b.id,field:"name"};if(l.fresh)u={type:"add",column:b.id}}else if(l.field==="subtask"){let b=d,m=A(b).find((p)=>y(p.id,l.id));if(!c)return s.removeSubtask(b,m);if(c!==m.title)m.title=c,u={type:"edit",card:b.id,field:"subtask",subtask:m.id};if(l.fresh)u={type:"subtask",card:b.id,subtask:m.id,op:"add"}}else{let b=d,m=l.field;if((c||m==="description")&&c!==(b[m]??""))b[m]=c,u={type:"edit",card:b.id,field:m};if(l.fresh)u={type:"add",card:b.id,column:o(b.id).column.id},s.kept=[...s.kept,b.id]}if(u)i(u);let f=n.#o(l.id)??d;if(l.fresh&&l.field==="subtask"&&a)s.addSubtask(f);else if(l.fresh&&l.field==="title"&&a&&!n.hasAttribute("compact"))s.addDetails(f,!0);else n.#P(l)},discard(a){ni(s.columns,a)},settle(){if(s.editing)s.commit()},addCard(a){if(s.readonly)return;s.settle();let l={id:Ie(),title:""};a.cards.push(l),s.edit("title",l.id,"",!0)},addColumn(){if(s.readonly)return;s.settle();let a={id:Ie(),name:"",cards:[]};s.columns.push(a),s.edit("name",a.id,"",!0)},addSubtask(a){if(s.readonly)return;s.settle();let l={id:Ie(),title:"",done:!1};if(a.expanded=!0,!Array.isArray(a.subtasks))a.subtasks=[];a.subtasks.push(l),s.edit("subtask",l.id,"",!0)},removeCard(a,l){if(s.readonly)return;a.cards=a.cards.filter((c)=>c!==l),i({type:"remove",card:l.id,column:a.id})},removeColumn(a){if(s.readonly)return;s.columns=s.columns.filter((l)=>l!==a),i({type:"remove",column:a.id})},removeSubtask(a,l){if(s.readonly)return;a.subtasks=A(a).filter((c)=>c!==l),i({type:"subtask",card:a.id,subtask:l.id,op:"remove"})},removeComment(a,l){if(s.readonly)return;a.comments=he(a).filter((c)=>c!==l),i({type:"comment",card:a.id,comment:l.id,op:"remove"})},check(a,l,c){if(s.readonly)return;l.done=c,i({type:"check",card:a.id,subtask:l.id,done:c})},keyTags(a){n.#U(a)},keyCard(a,l){if(a.target!==a.currentTarget)return;if(a.key==="Enter")return a.preventDefault(),s.edit("title",l.id,l.title);if(a.metaKey||a.ctrlKey)return;if(!a.altKey)return void n.#O(a,l);if(s.readonly)return;let c=o(l.id);if(!c)return;let d=getComputedStyle(n).direction==="rtl",u={ArrowUp:-1,ArrowDown:1,ArrowLeft:d?1:-1,ArrowRight:d?-1:1}[a.key];if(!u)return;if(a.preventDefault(),a.key==="ArrowUp"||a.key==="ArrowDown"){let b=s.visible(c.column),m=b[b.indexOf(c.card)+u];if(m&&!m.starred===!l.starred)n.moveCard(l.id,c.column.id,c.column.cards.indexOf(m));else n.#D(a.currentTarget,u,!m?u<0?"Already first":"Already last":l.starred?"Starred cards stay above the others — unstar it to move it lower":"Starred cards stay on top — star it to move it among them");return}let f=s.columns[s.columns.indexOf(c.column)+u];if(f)n.moveCard(l.id,f.id,Math.min(c.index,f.cards.length));else n.#D(a.currentTarget,0,"No column there")},keySubtask(a,l,c){s.keyText(a,"subtask",c.id,c.title);let d=a.key==="ArrowUp"?-1:a.key==="ArrowDown"?1:0;if(!a.altKey||!d||s.readonly)return;a.preventDefault(),a.stopPropagation(),n.#f(l,c.id,A(l).indexOf(c)+d)},keyColumn(a,l){if(a.metaKey||a.ctrlKey||a.shiftKey)return;let c=getComputedStyle(n).direction==="rtl",d=a.key==="ArrowLeft"?c?1:-1:a.key==="ArrowRight"?c?-1:1:0;if(!a.altKey){let f=a.currentTarget.closest(".b3-board-column"),b=[...n.querySelectorAll(".b3-board-column")],m=a.key==="ArrowDown"?f.querySelector(".b3-board-card"):d?b[b.indexOf(f)+d]?.querySelector(".b3-board-column-name"):void 0;if(m===void 0)return;if(a.preventDefault(),m)n.#x(m);return}if(!d||s.readonly)return;a.preventDefault();let u=s.columns.indexOf(l)+d;if(u>=0&&u<s.columns.length)n.moveColumn(l.id,u)}});return s}async#u(e,t,r){let n=this.#e,i=()=>n.editing?.field==="description"&&y(n.editing.id,e)?n.editing:null,o=`![Uploading image ${this.#w}-${++this.#k}…]()`,s="",a=i();if(a&&r){let{selectionStart:h,selectionEnd:x}=r;s=h&&r.value[h-1]!==`
338
340
  `?`
339
- ${o}`:o,a.draft=r.value=r.value.slice(0,h)+s+r.value.slice(x),r.setSelectionRange(h+s.length,h+s.length)}let l=n.columns.find((h)=>h.cards.some((x)=>y(x.id,e))),c=null;try{c=await this.#v?.(t,{card:e,column:l?.id})}catch(h){console.warn("b3-board: image upload failed",h)}let d=c?`![](${String(c).replace(/[\s()]/g,(h)=>`%${h.charCodeAt(0).toString(16).toUpperCase().padStart(2,"0")}`)})`:"";if(!d)this.#a("Image not added");while(this.#m)await new Promise((h)=>this.#A.push(h));let u=(h)=>{if(!s)return null;let x=h.indexOf(s),z=x>=0?x:h.indexOf(o);if(z<0)return null;let ie=x>=0?s:o;return[z,z+ie.length,d?ie.replace(o,d):""]},f=(h)=>{if(!s)return d?h.trim()?`${h.replace(/\s+$/,"")}
340
- ${d}`:d:h;let x=u(h);return x?h.slice(0,x[0])+x[2]+h.slice(x[1]):h},b=i();if(b){let h=this.querySelector("textarea.b3-board-editor"),x=h?.value===b.draft&&u(h.value);if(h&&x){let[z,ie,ot]=x,{selectionStart:bi,selectionEnd:pi,selectionDirection:mi}=h,ur=(De)=>De>=ie?De+ot.length-(ie-z):De>z?z+ot.length:De;h.setRangeText(ot,z,ie),h.setSelectionRange(ur(bi),ur(pi),mi??void 0),b.draft=h.value}else if(f(b.draft)!==b.draft)b.draft=f(b.draft);else if(d)this.#a("Image not added");return}let m=this.#o(e);if(s&&!String(m?.description??"").includes(o))m=n.columns.flatMap((h)=>h.cards).find((h)=>String(h.description??"").includes(o))??m;let p=String(m?.description??""),g=f(p).trim();if(!m||this.readonly||g===p.trim()){if(d)this.#a("Image not added");return}m.description=g,m.expanded=!0,this.#g({type:"edit",card:m.id,field:"description"})}#a(e){let t=this.#e;t.announcement="",requestAnimationFrame(()=>{if(!t.announcement)t.announcement=e})}moveCard(e,t,r){let n=this.#e;if(!n||this.readonly)return!1;let i=n.columns.find((u)=>u.cards.some((f)=>y(f.id,e))),o=n.columns.find((u)=>y(u.id,t));if(!i||!o)return!1;let s=i.cards.findIndex((u)=>y(u.id,e)),[a]=i.cards.splice(s,1),l=o.cards.filter((u)=>u.starred).length,c=Math.max(0,Math.min(o.cards.length,r)),d=a.starred?Math.min(c,l):Math.max(c,l);if(o.cards.splice(d,0,a),i===o&&s===d)return!1;if(lr(n.expandIn,i)!==lr(n.expandIn,o))delete a.expanded;return n.announcement=`${a.title??""} moved to ${o.name??""}, position ${d+1} of ${o.cards.length}`,this.#g({type:"move",card:a.id,from:i.id,to:o.id,index:d}),this.#B(a.id),!0}moveColumn(e,t){let r=this.#e;if(!r||this.readonly)return!1;let n=r.columns.findIndex((s)=>y(s.id,e));if(n<0)return!1;let[i]=r.columns.splice(n,1),o=Math.max(0,Math.min(r.columns.length,t));if(r.columns.splice(o,0,i),n===o)return!1;return r.announcement=`${i.name??""} moved to position ${o+1} of ${r.columns.length}`,this.#g({type:"reorder",column:i.id,index:o}),queueMicrotask(()=>this.querySelector(`[data-column="${CSS.escape(String(i.id))}"] .b3-board-column-name`)?.focus()),!0}#f(e,t,r){let n=this.#e,i=A(e),o=i.findIndex((l)=>y(l.id,t));if(!n||this.readonly||o<0)return!1;let s=Math.max(0,Math.min(i.length-1,r));if(o===s)return!1;let[a]=i.splice(o,1);return i.splice(s,0,a),n.announcement=`${a.title??""} moved to position ${s+1} of ${i.length}`,this.#g({type:"subtask",card:e.id,subtask:a.id,op:"move",index:s}),requestAnimationFrame(()=>this.querySelector(`[data-subtask="${CSS.escape(String(a.id))}"] .b3-board-title`)?.focus()),!0}#C(e){if(!e.isConnected)return;if(e.focus({preventScroll:!0}),this.#e?.editing?.atEnd)e.setSelectionRange(e.value.length,e.value.length);else e.select();let t=e.closest(".b3-board-card-head")?e.closest(".b3-board-card"):e.closest(".b3-board-column-header")?e.closest(".b3-board-column"):e.parentElement?.matches(".b3-board-body")?e.parentElement:e,r=()=>t.scrollIntoView({block:"nearest",inline:"nearest"});requestAnimationFrame(r);let n=this.ownerDocument.defaultView;if(!n)return;let i=new AbortController,o=()=>({height:n.visualViewport?.height??n.innerHeight,scale:n.visualViewport?.scale??1}),s=o(),a=()=>{if(!e.isConnected||this.ownerDocument.activeElement!==e)return i.abort();let l=o(),c=l.scale===s.scale&&l.height<s.height;if(s=l,!c)return;if(r(),t!==e)e.scrollIntoView({block:"nearest",inline:"nearest"})};for(let l of[n,n.visualViewport])l?.addEventListener("resize",a,{signal:i.signal});e.addEventListener("blur",()=>i.abort(),{signal:i.signal,once:!0})}#T(){let e=this.ownerDocument,t=e.activeElement;if(!e.defaultView?.matchMedia("(pointer: coarse)").matches||t?.matches("textarea, input"))return;let r=this.#t?.querySelector(":scope > .b3-board-holder");if(!r)r=e.createElement("textarea"),r.className="b3-board-holder",r.tabIndex=-1,r.setAttribute("aria-hidden","true"),this.#t?.append(r);r.focus({preventScroll:!0}),requestAnimationFrame(()=>requestAnimationFrame(()=>{if(e.activeElement===r)r.blur()}))}#x(e){e.focus({preventScroll:!0}),e.scrollIntoView({block:"nearest",inline:"nearest"})}#O(e,t){let r=this.#e,n=e.currentTarget,i=(c)=>[...c.querySelectorAll(".b3-board-cards > .b3-board-card")],o=n.closest(".b3-board-column"),s=i(o),a=s.indexOf(n),l;switch(e.key){case"ArrowUp":if(l=s[a-1],!l&&this.#M())return void e.preventDefault();break;case"ArrowDown":l=s[a+1];break;case"Home":l=s[0];break;case"End":l=s.at(-1);break;case"ArrowLeft":case"ArrowRight":{let c=[...this.querySelectorAll(".b3-board-column")],d=e.key==="ArrowLeft"!==(getComputedStyle(this).direction==="rtl")?-1:1;for(let u=c.indexOf(o)+d;u>=0&&u<c.length&&!l;u+=d){let f=i(c[u]);l=f[Math.min(a,f.length-1)]}break}case" ":if(e.preventDefault(),!this.hasAttribute("compact")&&r.disclosable(t))r.toggle(t);return;case"Delete":case"Backspace":{if(r.readonly||e.shiftKey)return;e.preventDefault();let c=(s[a+1]??s[a-1])?.dataset.card;n.querySelector(":scope > .b3-board-card-head .b3-board-remove")?.click(),requestAnimationFrame(()=>{if(n.isConnected)return;let d=c!==void 0&&this.querySelector(`[data-card="${CSS.escape(c)}"]`),u=this.querySelector(`[data-column="${CSS.escape(o.dataset.column??"")}"] .b3-board-column-name`),f=d||u;if(f)this.#x(f)});return}default:return}if(e.preventDefault(),l)this.#x(l)}#M(){let e=[...this.querySelectorAll(".b3-board-filters > .b3-board-chip")],t=e.find((r)=>r.textContent===this.#L)??e[0];return t?.focus(),!!t}#L=null;#U(e){let t=e.target;if(!t.matches(".b3-board-chip")||e.altKey||e.metaKey||e.ctrlKey)return;let r=[...this.querySelectorAll(".b3-board-filters > .b3-board-chip")],n=r.indexOf(t);if(this.#L=t.textContent,e.key==="ArrowDown"||e.key==="Escape"){e.preventDefault(),this.focusCard();return}if(e.key===" "||e.key==="Enter"){if(e.preventDefault(),!e.repeat)t.click();return}if(e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();let i=e.key==="ArrowLeft"!==(getComputedStyle(this).direction==="rtl")?-1:1,o=r[n+i];if(o)this.#L=o.textContent,o.focus()}focusCard(e){let t=(n)=>n!=null&&this.querySelector(`.b3-board-cards > [data-card="${CSS.escape(String(n))}"]`),r=t(e)||t(this.#e?.selected)||this.querySelector(".b3-board-cards > .b3-board-card");if(!r)return!1;return this.#x(r),!0}shortcuts=[];showShortcuts(e=!0){let t=this.#t;if(!t)return!1;let r=t.querySelector(":scope > .b3-board-keys");if(!e){if(r)this.focusCard(),r.remove();return!0}if(r)return!0;let n=/Mac|iP(hone|ad|od)/.test(this.ownerDocument.defaultView?.navigator.platform??""),i=n?"⌥":"Alt+",o=n?"⌘":"Ctrl+",s=[["↑ ↓","Previous / next card"],["↑ (top card)","Filter tags: ← → pick, Space toggle, ↓ back"],["← →","Card in the next column"],["Home End","First / last card"],["Space","Expand / collapse"],["Enter","Edit the title"],...this.readonly?[]:[[`${i}↑ ${i}↓`,"Move the card up / down"],[`${i}← ${i}→`,"Move the card to the next column"],["Tab ⇧Tab","Editing: title ⇄ details"],["Delete","Delete the card (press twice)"],[`${o}Z ${n?"⇧⌘Z":"Ctrl+Y"}`,"Undo / redo"]],...this.shortcuts,["Esc","Cancel / close"],["?","This list"]];r=this.ownerDocument.createElement("div"),r.className="b3-board-keys",r.tabIndex=-1,r.setAttribute("role","dialog"),r.setAttribute("aria-label","Keyboard shortcuts");let a=this.ownerDocument.createElement("dl");for(let[l,c]of s){let d=this.ownerDocument.createElement("div"),u=this.ownerDocument.createElement("dt"),f=this.ownerDocument.createElement("dd");for(let b of l.split(" ")){let m=this.ownerDocument.createElement("kbd");m.textContent=b,u.append(m)}f.textContent=c,d.append(u,f),a.append(d)}return r.append(a),r.addEventListener("keydown",(l)=>{if(l.key!=="Escape"&&l.key!=="?")return;l.preventDefault(),l.stopPropagation(),this.showShortcuts(!1)}),r.addEventListener("focusout",(l)=>{if(!r.contains(l.relatedTarget))queueMicrotask(()=>r.remove())}),t.append(r),r.focus({preventScroll:!0}),!0}#q(){let e=this.ownerDocument.activeElement;if(!e?.matches(".b3-board-card")||!this.contains(e))return null;let t=e.closest(".b3-board-column");return{id:e.dataset.card,column:t.dataset.column,index:[...t.querySelectorAll(".b3-board-cards > .b3-board-card")].indexOf(e)}}#j(e){requestAnimationFrame(()=>{let t=this.ownerDocument.activeElement;if(t&&t!==this.ownerDocument.body&&t.isConnected)return;let r=[...this.querySelectorAll(`[data-column="${CSS.escape(e.column)}"] .b3-board-cards > .b3-board-card`)];(this.querySelector(`[data-card="${CSS.escape(e.id)}"]`)??r[Math.min(e.index,r.length-1)])?.focus({preventScroll:!0})})}#D(e,t,r){e.style.setProperty("--b3-board-bump",String(t)),e.removeAttribute("data-b3-bump"),e.offsetWidth,e.setAttribute("data-b3-bump",""),e.addEventListener("animationend",()=>e.removeAttribute("data-b3-bump"),{once:!0}),this.#a(r)}#N(){let e=this.ownerDocument,t=e.activeElement;if(!this.#I||!this.#e?.selected||t&&t!==e.body&&t!==e.documentElement)return;this.focusCard(this.#e.selected)}#B(e){requestAnimationFrame(()=>this.querySelector(`[data-card="${CSS.escape(String(e))}"]`)?.focus({preventScroll:!1}))}#P(e){if(!e)return;let t=CSS.escape(String(e.id));requestAnimationFrame(()=>{if(this.contains(this.ownerDocument.activeElement)&&this.ownerDocument.activeElement!==this.ownerDocument.body)return;let r=e.field==="name"?`[data-column="${t}"] .b3-board-column-name`:e.field==="subtask"?null:`[data-card="${t}"]`;if(r)this.querySelector(r)?.focus({preventScroll:!0})})}#I=!1;#F(){this.#c?.abort(),this.#c=new AbortController;let e=this.#c.signal,t=this.ownerDocument.defaultView,r=t.setInterval(()=>{if(this.#e)this.#e.now=Date.now()},60000);e.addEventListener("abort",()=>t.clearInterval(r)),this.addEventListener("pointerdown",(o)=>this.#W(o),{signal:e}),this.addEventListener("mousedown",(o)=>{if(this.#e?.editing&&o.target.closest?.(".b3-board-actions > button, .b3-board-star")&&this.contains(this.ownerDocument.activeElement))o.preventDefault()},{signal:e,capture:!0}),t.addEventListener("pointermove",(o)=>this.#Y(o),{signal:e}),t.addEventListener("pointerup",(o)=>this.#J(o),{signal:e}),t.addEventListener("pointercancel",(o)=>{if(o.pointerId===this.#r?.pointerId)this.#b()},{signal:e}),t.addEventListener("keydown",(o)=>{if(o.key==="Escape"&&this.#r?.started)o.preventDefault(),this.#b()},{signal:e}),this.addEventListener("touchmove",(o)=>{if(this.#r?.started)o.preventDefault()},{signal:e,passive:!1}),this.addEventListener("contextmenu",(o)=>{if(this.#r)o.preventDefault()},{signal:e}),this.addEventListener("focusin",(o)=>{let s=o.target,a=s.parentElement;if(!a?.matches(".b3-board-filters"))return;a.style.scrollPaddingInlineEnd=`${a.querySelector(":scope > .b3-board-search")?.offsetWidth??0}px`,s.scrollIntoView({inline:"nearest",block:"nearest"})},{signal:e}),this.addEventListener("focusin",(o)=>{this.#I=!0;let s=o.target.closest?.(".b3-board-card");if(s&&this.#e&&this.contains(s))this.#e.selected=s.dataset.card??null},{signal:e}),this.addEventListener("focusout",(o)=>{let s=o.relatedTarget;if(s&&!this.contains(s)){this.#I=!1;return}if(!s)requestAnimationFrame(()=>requestAnimationFrame(()=>this.#N()))},{signal:e}),t.addEventListener("focus",()=>queueMicrotask(()=>this.#N()),{signal:e}),this.addEventListener("click",(o)=>{if(!this.#y)return;this.#y=!1,o.preventDefault(),o.stopImmediatePropagation()},{signal:e,capture:!0}),this.addEventListener("keydown",(o)=>{if(o.key!=="?"||o.defaultPrevented||o.metaKey||o.ctrlKey||o.altKey||o.isComposing)return;if(o.target.closest?.('input, textarea, select, [contenteditable]:not([contenteditable="false"]), .b3-board-keys'))return;o.preventDefault(),this.showShortcuts()},{signal:e}),this.addEventListener("keydown",(o)=>{if(o.defaultPrevented||o.altKey||!(o.metaKey||o.ctrlKey))return;if(o.target.closest?.('input, textarea, select, [contenteditable]:not([contenteditable="false"])'))return;let s=o.key.toLowerCase(),a=s==="y"||s==="z"&&o.shiftKey;if(s!=="z"&&s!=="y")return;if(o.preventDefault(),a)this.redo();else this.undo()},{signal:e});let n=(o)=>this.#K(o);this.addEventListener("click",n,{signal:e,capture:!0}),this.addEventListener("auxclick",(o)=>{if(o.button===1)n(o)},{signal:e,capture:!0});let i=()=>this.#$();this.addEventListener("compositionstart",()=>{this.#m=!0},{signal:e}),this.addEventListener("compositionend",i,{signal:e}),this.addEventListener("focusout",i,{signal:e})}#$(){this.#m=!1;for(let e of this.#A.splice(0))e()}#K(e){let t=e.target.closest?.("a.b3-board-ref");if(!t||!this.contains(t))return;e.stopPropagation();let r=(c)=>t.closest(c),n=this.#e?.columns.find((c)=>y(c.id,r("[data-column]")?.dataset.column)),i=n?.cards.find((c)=>y(c.id,r("[data-card]")?.dataset.card)),o=i&&A(i).find((c)=>y(c.id,r("[data-subtask]")?.dataset.subtask)),s={href:t.dataset.href??"",text:t.textContent??"",file:t.hasAttribute("data-file"),newTab:e.metaKey||e.ctrlKey||e.shiftKey||e.button===1,card:i?.id,column:n?.id};if(o)s.subtask=o.id;let a=t.querySelector("img");if(a&&!s.newTab&&e.type==="click"){e.preventDefault(),this.#V(t,a,s);return}if(!t.dispatchEvent(new CustomEvent("b3-link",{bubbles:!0,cancelable:!0,detail:s}))||s.file)e.preventDefault()}#V(e,t,r){let n=this.ownerDocument;n.body.querySelector(":scope > .b3-board-lightbox")?.dispatchEvent(new CustomEvent("b3-close")),sr();let i=n.createElement("b3-image-viewer");i.className="b3-board-lightbox",i.setAttribute("alt",t.alt||"Image"),i.setAttribute("role","dialog"),i.setAttribute("aria-modal","true");let o=n.createElement("img");o.src=t.currentSrc||t.src,o.alt=t.alt;let s=n.createElement("button");s.type="button",s.className="b3-board-lightbox-open",s.textContent="Open",i.append(o,s);let a=n.activeElement,l=[...n.body.children].filter((d)=>d instanceof HTMLElement&&!d.inert),c=()=>{i.remove();for(let d of l)d.inert=!1;if(e.isConnected)e.focus({preventScroll:!0});else a?.focus?.({preventScroll:!0})};i.addEventListener("b3-close",c),i.addEventListener("click",(d)=>{if(d.target===i)c()}),s.addEventListener("pointerdown",(d)=>d.stopPropagation()),s.addEventListener("click",(d)=>{if(d.stopPropagation(),c(),e.dispatchEvent(new CustomEvent("b3-link",{bubbles:!0,cancelable:!0,detail:{...r}}))&&!r.file)this.ownerDocument.defaultView?.open(r.href,"_blank","noopener")}),n.body.append(i);for(let d of l)d.inert=!0;i.setAttribute("open",""),i.focus({preventScroll:!0})}#W(e){if(this.readonly||this.#r||!e.isPrimary||e.button!==0||this.#e?.editing)return;let t=e.target,r=t.closest(".b3-board-subtask-grip")?.closest(".b3-board-subtask"),n;if(r)n={kind:"subtask",id:r.dataset.subtask,card:r.closest(".b3-board-card").dataset.card,node:r,pointerId:e.pointerId,x:e.clientX,y:e.clientY,started:!1,hold:0};else{if(t.closest("input, textarea, select, a, .b3-board-quiet, .b3-board-chip, .b3-board-link, .b3-board-toggle, .b3-board-description"))return;let i=t.closest(".b3-board-card"),o=!i&&t.closest(".b3-board-column-header")?t.closest(".b3-board-column"):null,s=i??o;if(!s)return;n={kind:i?"card":"column",id:i?i.dataset.card:o.dataset.column,node:s,pointerId:e.pointerId,x:e.clientX,y:e.clientY,started:!1,hold:0}}if(!this.contains(n.node))return;if(this.#r=n,e.pointerType!=="mouse")n.hold=window.setTimeout(()=>{if(this.#r===n)this.#R(e.clientX,e.clientY)},ha)}#R(e,t){let r=this.#r;r.started=!0;let n=r.node.getBoundingClientRect(),i=r.node.cloneNode(!0);i.classList.add("b3-board-ghost"),i.removeAttribute("data-b3-dragging");for(let s of[i,...i.querySelectorAll("[id]")])s.removeAttribute("id");i.setAttribute("aria-hidden","true"),Object.assign(i.style,{inlineSize:`${n.width}px`,left:`${n.left}px`,top:`${n.top}px`}),r.dx=e-n.left,r.dy=t-n.top,r.ghost=i,this.#t.append(i),r.node.setAttribute("data-b3-dragging",""),this.ownerDocument.getSelection()?.removeAllRanges(),r.px=e,r.py=t;let o=()=>{if(this.#r!==r)return;this.#X(r.px,r.py),this.#G(this.#H(r.px,r.py)),r.frame=requestAnimationFrame(o)};r.frame=requestAnimationFrame(o)}#Y(e){let t=this.#r;if(!t||e.pointerId!==t.pointerId)return;if(!t.started){let r=Math.hypot(e.clientX-t.x,e.clientY-t.y);if(e.pointerType!=="mouse"){if(r>8)this.#b();return}if(r<5)return;this.#R(e.clientX,e.clientY)}e.preventDefault(),t.ghost.style.left=`${e.clientX-t.dx}px`,t.ghost.style.top=`${e.clientY-t.dy}px`,t.px=e.clientX,t.py=e.clientY}#J(e){let t=this.#r;if(!t||e.pointerId!==t.pointerId)return;if(!t.started)return this.#b();let r=this.#H(e.clientX,e.clientY);if(this.#b(),this.#y=!0,setTimeout(()=>{this.#y=!1},0),!r)return;let n=this.#e;if(t.kind==="card"){let i=n.columns.find((l)=>y(l.id,r.column)),o=n.columns.find((l)=>l.cards.some((c)=>y(c.id,t.id))),s=r.before?i.cards.findIndex((l)=>y(l.id,r.before)):i.cards.length,a=o.cards.findIndex((l)=>y(l.id,t.id));if(o===i&&a<s)s-=1;this.moveCard(t.id,i.id,s)}else if(t.kind==="subtask"){let i=this.#o(t.card);if(!i)return;let o=A(i),s=r.before?o.findIndex((a)=>y(a.id,r.before)):o.length;if(o.findIndex((a)=>y(a.id,t.id))<s)s-=1;this.#f(i,t.id,s)}else{let i=r.before?n.columns.findIndex((s)=>y(s.id,r.before)):n.columns.length;if(n.columns.findIndex((s)=>y(s.id,t.id))<i)i-=1;this.moveColumn(t.id,i)}}#H(e,t){let r=this.#r,n=this.ownerDocument.elementFromPoint(e,t);if(!n||!this.contains(n))return null;if(r.kind==="card"){let l=this.#z(e,n);if(!l)return null;let c=l.querySelector(".b3-board-cards"),d=[...c.querySelectorAll(":scope > .b3-board-card:not([data-b3-dragging])")],u=d.find((b)=>{let m=b.getBoundingClientRect();return t<m.top+m.height/2}),f=(b)=>!!(b!=null&&this.#o(b)?.starred);if(f(u?.dataset.card)!==f(r.id)&&(u||f(r.id)))u=d.find((b)=>!f(b.dataset.card));return{column:l.dataset.column,before:u?.dataset.card??null,list:c}}if(r.kind==="subtask"){let l=r.node.parentElement;return{column:"",before:[...l.querySelectorAll(":scope > .b3-board-subtask:not([data-b3-dragging])")].find((u)=>{let f=u.getBoundingClientRect();return t<f.top+f.height/2})?.dataset.subtask??null,list:l}}let i=this.querySelector(".b3-board-columns"),o=[...i.querySelectorAll(":scope > .b3-board-column:not([data-b3-dragging])")],s=getComputedStyle(this).direction==="rtl";return{column:"",before:o.find((l)=>{let c=l.getBoundingClientRect();return s?e>c.left+c.width/2:e<c.left+c.width/2})?.dataset.column??null,list:i}}#G(e){for(let n of this.querySelectorAll("[data-b3-drop]"))n.removeAttribute("data-b3-drop");if(!e)return;let t=`[data-${this.#r.kind}="${CSS.escape(e.before??"")}"]`,r=e.before?e.list.querySelector(t):null;(r??e.list).setAttribute("data-b3-drop",r?"before":"end")}#z(e,t){return t?.closest(".b3-board-column")??[...this.querySelectorAll(".b3-board-column")].find((r)=>{let n=r.getBoundingClientRect();return e>=n.left&&e<=n.right})}#X(e,t){let r=(s,a,l)=>s<a+40?-12:s>l-40?12:0,n=this.querySelector(".b3-board-columns");if(n){let s=n.getBoundingClientRect();n.scrollLeft+=r(e,s.left,s.right)}let i=this.#r?.kind==="card"?this.#z(e,this.ownerDocument.elementFromPoint(e,t))?.querySelector(".b3-board-cards"):null;if(i&&i.scrollHeight>i.clientHeight){let s=i.getBoundingClientRect();i.scrollTop+=r(t,s.top,s.bottom)}let o=this.ownerDocument.defaultView;o.scrollBy(0,r(t,0,o.innerHeight))}#b(){let e=this.#r;if(!e)return;this.#r=null,clearTimeout(e.hold),cancelAnimationFrame(e.frame??0),e.ghost?.remove(),e.node.removeAttribute("data-b3-dragging");for(let t of this.querySelectorAll("[data-b3-drop]"))t.removeAttribute("data-b3-drop")}}hr("b3-board",hi);export{hi as B3Board};
341
+ ${o}`:o,a.draft=r.value=r.value.slice(0,h)+s+r.value.slice(x),r.setSelectionRange(h+s.length,h+s.length)}let l=n.columns.find((h)=>h.cards.some((x)=>y(x.id,e))),c=null;try{c=await this.#v?.(t,{card:e,column:l?.id})}catch(h){console.warn("b3-board: image upload failed",h)}let d=c?`![](${String(c).replace(/[\s()]/g,(h)=>`%${h.charCodeAt(0).toString(16).toUpperCase().padStart(2,"0")}`)})`:"";if(!d)this.#a("Image not added");while(this.#g)await new Promise((h)=>this.#A.push(h));let u=(h)=>{if(!s)return null;let x=h.indexOf(s),z=x>=0?x:h.indexOf(o);if(z<0)return null;let ie=x>=0?s:o;return[z,z+ie.length,d?ie.replace(o,d):""]},f=(h)=>{if(!s)return d?h.trim()?`${h.replace(/\s+$/,"")}
342
+ ${d}`:d:h;let x=u(h);return x?h.slice(0,x[0])+x[2]+h.slice(x[1]):h},b=i();if(b){let h=this.querySelector("textarea.b3-board-editor"),x=h?.value===b.draft&&u(h.value);if(h&&x){let[z,ie,ot]=x,{selectionStart:bi,selectionEnd:pi,selectionDirection:mi}=h,ur=(De)=>De>=ie?De+ot.length-(ie-z):De>z?z+ot.length:De;h.setRangeText(ot,z,ie),h.setSelectionRange(ur(bi),ur(pi),mi??void 0),b.draft=h.value}else if(f(b.draft)!==b.draft)b.draft=f(b.draft);else if(d)this.#a("Image not added");return}let m=this.#o(e);if(s&&!String(m?.description??"").includes(o))m=n.columns.flatMap((h)=>h.cards).find((h)=>String(h.description??"").includes(o))??m;let p=String(m?.description??""),g=f(p).trim();if(!m||this.readonly||g===p.trim()){if(d)this.#a("Image not added");return}m.description=g,m.expanded=!0,this.#y({type:"edit",card:m.id,field:"description"})}#a(e){let t=this.#e;t.announcement="",requestAnimationFrame(()=>{if(!t.announcement)t.announcement=e})}moveCard(e,t,r){let n=this.#e;if(!n||this.readonly)return!1;let i=n.columns.find((u)=>u.cards.some((f)=>y(f.id,e))),o=n.columns.find((u)=>y(u.id,t));if(!i||!o)return!1;let s=i.cards.findIndex((u)=>y(u.id,e)),[a]=i.cards.splice(s,1),l=o.cards.filter((u)=>u.starred).length,c=Math.max(0,Math.min(o.cards.length,r)),d=a.starred?Math.min(c,l):Math.max(c,l);if(o.cards.splice(d,0,a),i===o&&s===d)return!1;if(lr(n.expandIn,i)!==lr(n.expandIn,o))delete a.expanded;return n.announcement=`${a.title??""} moved to ${o.name??""}, position ${d+1} of ${o.cards.length}`,this.#y({type:"move",card:a.id,from:i.id,to:o.id,index:d}),this.#B(a.id),!0}moveColumn(e,t){let r=this.#e;if(!r||this.readonly)return!1;let n=r.columns.findIndex((s)=>y(s.id,e));if(n<0)return!1;let[i]=r.columns.splice(n,1),o=Math.max(0,Math.min(r.columns.length,t));if(r.columns.splice(o,0,i),n===o)return!1;return r.announcement=`${i.name??""} moved to position ${o+1} of ${r.columns.length}`,this.#y({type:"reorder",column:i.id,index:o}),queueMicrotask(()=>this.querySelector(`[data-column="${CSS.escape(String(i.id))}"] .b3-board-column-name`)?.focus()),!0}#f(e,t,r){let n=this.#e,i=A(e),o=i.findIndex((l)=>y(l.id,t));if(!n||this.readonly||o<0)return!1;let s=Math.max(0,Math.min(i.length-1,r));if(o===s)return!1;let[a]=i.splice(o,1);return i.splice(s,0,a),n.announcement=`${a.title??""} moved to position ${s+1} of ${i.length}`,this.#y({type:"subtask",card:e.id,subtask:a.id,op:"move",index:s}),requestAnimationFrame(()=>this.querySelector(`[data-subtask="${CSS.escape(String(a.id))}"] .b3-board-title`)?.focus()),!0}#C(e){if(!e.isConnected)return;if(e.focus({preventScroll:!0}),this.#e?.editing?.atEnd)e.setSelectionRange(e.value.length,e.value.length);else e.select();let t=e.closest(".b3-board-card-head")?e.closest(".b3-board-card"):e.closest(".b3-board-column-header")?e.closest(".b3-board-column"):e.parentElement?.matches(".b3-board-body")?e.parentElement:e,r=()=>t.scrollIntoView({block:"nearest",inline:"nearest"});requestAnimationFrame(r);let n=this.ownerDocument.defaultView;if(!n)return;let i=new AbortController,o=()=>({height:n.visualViewport?.height??n.innerHeight,scale:n.visualViewport?.scale??1}),s=o(),a=()=>{if(!e.isConnected||this.ownerDocument.activeElement!==e)return i.abort();let l=o(),c=l.scale===s.scale&&l.height<s.height;if(s=l,!c)return;if(r(),t!==e)e.scrollIntoView({block:"nearest",inline:"nearest"})};for(let l of[n,n.visualViewport])l?.addEventListener("resize",a,{signal:i.signal});e.addEventListener("blur",()=>i.abort(),{signal:i.signal,once:!0})}#T(){let e=this.ownerDocument,t=e.activeElement;if(!e.defaultView?.matchMedia("(pointer: coarse)").matches||t?.matches("textarea, input"))return;let r=this.#t?.querySelector(":scope > .b3-board-holder");if(!r)r=e.createElement("textarea"),r.className="b3-board-holder",r.tabIndex=-1,r.setAttribute("aria-hidden","true"),this.#t?.append(r);r.focus({preventScroll:!0}),requestAnimationFrame(()=>requestAnimationFrame(()=>{if(e.activeElement===r)r.blur()}))}#x(e){e.focus({preventScroll:!0}),e.scrollIntoView({block:"nearest",inline:"nearest"})}#O(e,t){let r=this.#e,n=e.currentTarget,i=(c)=>[...c.querySelectorAll(".b3-board-cards > .b3-board-card")],o=n.closest(".b3-board-column"),s=i(o),a=s.indexOf(n),l;switch(e.key){case"ArrowUp":if(l=s[a-1],!l&&this.#M())return void e.preventDefault();break;case"ArrowDown":l=s[a+1];break;case"Home":l=s[0];break;case"End":l=s.at(-1);break;case"ArrowLeft":case"ArrowRight":{let c=[...this.querySelectorAll(".b3-board-column")],d=e.key==="ArrowLeft"!==(getComputedStyle(this).direction==="rtl")?-1:1;for(let u=c.indexOf(o)+d;u>=0&&u<c.length&&!l;u+=d){let f=i(c[u]);l=f[Math.min(a,f.length-1)]}break}case" ":if(e.preventDefault(),!this.hasAttribute("compact")&&r.disclosable(t))r.toggle(t);return;case"Delete":case"Backspace":{if(r.readonly||e.shiftKey)return;e.preventDefault();let c=(s[a+1]??s[a-1])?.dataset.card;n.querySelector(":scope > .b3-board-card-head .b3-board-remove")?.click(),requestAnimationFrame(()=>{if(n.isConnected)return;let d=c!==void 0&&this.querySelector(`[data-card="${CSS.escape(c)}"]`),u=this.querySelector(`[data-column="${CSS.escape(o.dataset.column??"")}"] .b3-board-column-name`),f=d||u;if(f)this.#x(f)});return}default:return}if(e.preventDefault(),l)this.#x(l)}#M(){let e=[...this.querySelectorAll(".b3-board-filters > .b3-board-chip")],t=e.find((r)=>r.textContent===this.#L)??e[0];return t?.focus(),!!t}#L=null;#U(e){let t=e.target;if(!t.matches(".b3-board-chip")||e.altKey||e.metaKey||e.ctrlKey)return;let r=[...this.querySelectorAll(".b3-board-filters > .b3-board-chip")],n=r.indexOf(t);if(this.#L=t.textContent,e.key==="ArrowDown"||e.key==="Escape"){e.preventDefault(),this.focusCard();return}if(e.key===" "||e.key==="Enter"){if(e.preventDefault(),!e.repeat)t.click();return}if(e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();let i=e.key==="ArrowLeft"!==(getComputedStyle(this).direction==="rtl")?-1:1,o=r[n+i];if(o)this.#L=o.textContent,o.focus()}focusCard(e){let t=(n)=>n!=null&&this.querySelector(`.b3-board-cards > [data-card="${CSS.escape(String(n))}"]`),r=t(e)||t(this.#e?.selected)||this.querySelector(".b3-board-cards > .b3-board-card");if(!r)return!1;return this.#x(r),!0}shortcuts=[];showShortcuts(e=!0){let t=this.#t;if(!t)return!1;let r=t.querySelector(":scope > .b3-board-keys");if(!e){if(r)this.focusCard(),r.remove();return!0}if(r)return!0;let n=/Mac|iP(hone|ad|od)/.test(this.ownerDocument.defaultView?.navigator.platform??""),i=n?"⌥":"Alt+",o=n?"⌘":"Ctrl+",s=[["↑ ↓","Previous / next card"],["↑ (top card)","Filter tags: ← → pick, Space toggle, ↓ back"],["← →","Card in the next column"],["Home End","First / last card"],["Space","Expand / collapse"],["Enter","Edit the title"],...this.readonly?[]:[[`${i}↑ ${i}↓`,"Move the card up / down"],[`${i}← ${i}→`,"Move the card to the next column"],["Tab ⇧Tab","Editing: title ⇄ details"],["Delete","Delete the card (press twice)"],[`${o}Z ${n?"⇧⌘Z":"Ctrl+Y"}`,"Undo / redo"]],...this.shortcuts,["Esc","Cancel / close"],["?","This list"]];r=this.ownerDocument.createElement("div"),r.className="b3-board-keys",r.tabIndex=-1,r.setAttribute("role","dialog"),r.setAttribute("aria-label","Keyboard shortcuts");let a=this.ownerDocument.createElement("dl");for(let[l,c]of s){let d=this.ownerDocument.createElement("div"),u=this.ownerDocument.createElement("dt"),f=this.ownerDocument.createElement("dd");for(let b of l.split(" ")){let m=this.ownerDocument.createElement("kbd");m.textContent=b,u.append(m)}f.textContent=c,d.append(u,f),a.append(d)}return r.append(a),r.addEventListener("keydown",(l)=>{if(l.key!=="Escape"&&l.key!=="?")return;l.preventDefault(),l.stopPropagation(),this.showShortcuts(!1)}),r.addEventListener("focusout",(l)=>{if(!r.contains(l.relatedTarget))queueMicrotask(()=>r.remove())}),t.append(r),r.focus({preventScroll:!0}),!0}#q(){let e=this.ownerDocument.activeElement;if(!e?.matches(".b3-board-card")||!this.contains(e))return null;let t=e.closest(".b3-board-column");return{id:e.dataset.card,column:t.dataset.column,index:[...t.querySelectorAll(".b3-board-cards > .b3-board-card")].indexOf(e)}}#j(e){requestAnimationFrame(()=>{let t=this.ownerDocument.activeElement;if(t&&t!==this.ownerDocument.body&&t.isConnected)return;let r=[...this.querySelectorAll(`[data-column="${CSS.escape(e.column)}"] .b3-board-cards > .b3-board-card`)];(this.querySelector(`[data-card="${CSS.escape(e.id)}"]`)??r[Math.min(e.index,r.length-1)])?.focus({preventScroll:!0})})}#D(e,t,r){e.style.setProperty("--b3-board-bump",String(t)),e.removeAttribute("data-b3-bump"),e.offsetWidth,e.setAttribute("data-b3-bump",""),e.addEventListener("animationend",()=>e.removeAttribute("data-b3-bump"),{once:!0}),this.#a(r)}#N(){let e=this.ownerDocument,t=e.activeElement;if(!this.#I||!this.#e?.selected||t&&t!==e.body&&t!==e.documentElement)return;this.focusCard(this.#e.selected)}#B(e){requestAnimationFrame(()=>this.querySelector(`[data-card="${CSS.escape(String(e))}"]`)?.focus({preventScroll:!1}))}#P(e){if(!e)return;let t=CSS.escape(String(e.id));requestAnimationFrame(()=>{if(this.contains(this.ownerDocument.activeElement)&&this.ownerDocument.activeElement!==this.ownerDocument.body)return;let r=e.field==="name"?`[data-column="${t}"] .b3-board-column-name`:e.field==="subtask"?null:`[data-card="${t}"]`;if(r)this.querySelector(r)?.focus({preventScroll:!0})})}#I=!1;#F(){this.#c?.abort(),this.#c=new AbortController;let e=this.#c.signal,t=this.ownerDocument.defaultView,r=t.setInterval(()=>{if(this.#e)this.#e.now=Date.now()},60000);e.addEventListener("abort",()=>t.clearInterval(r)),this.addEventListener("pointerdown",(o)=>this.#W(o),{signal:e}),this.addEventListener("mousedown",(o)=>{if(this.#e?.editing&&o.target.closest?.(".b3-board-actions > button, .b3-board-star")&&this.contains(this.ownerDocument.activeElement))o.preventDefault()},{signal:e,capture:!0}),t.addEventListener("pointermove",(o)=>this.#Y(o),{signal:e}),t.addEventListener("pointerup",(o)=>this.#J(o),{signal:e}),t.addEventListener("pointercancel",(o)=>{if(o.pointerId===this.#r?.pointerId)this.#b()},{signal:e}),t.addEventListener("keydown",(o)=>{if(o.key==="Escape"&&this.#r?.started)o.preventDefault(),this.#b()},{signal:e}),this.addEventListener("touchmove",(o)=>{if(this.#r?.started)o.preventDefault()},{signal:e,passive:!1}),this.addEventListener("contextmenu",(o)=>{if(this.#r)o.preventDefault()},{signal:e}),this.addEventListener("focusin",(o)=>{let s=o.target,a=s.parentElement;if(!a?.matches(".b3-board-filters"))return;a.style.scrollPaddingInlineEnd=`${a.querySelector(":scope > .b3-board-search")?.offsetWidth??0}px`,s.scrollIntoView({inline:"nearest",block:"nearest"})},{signal:e}),this.addEventListener("focusin",(o)=>{this.#I=!0;let s=o.target.closest?.(".b3-board-card");if(s&&this.#e&&this.contains(s))this.#e.selected=s.dataset.card??null},{signal:e}),this.addEventListener("focusout",(o)=>{let s=o.relatedTarget;if(s&&!this.contains(s)){this.#I=!1;return}if(!s)requestAnimationFrame(()=>requestAnimationFrame(()=>this.#N()))},{signal:e}),t.addEventListener("focus",()=>queueMicrotask(()=>this.#N()),{signal:e}),this.addEventListener("click",(o)=>{let s=this.ownerDocument.getSelection(),a=o.target;if(!this.#m&&s&&!s.isCollapsed&&(a.contains(s.anchorNode)||s.containsNode(a,!0))&&!a.closest?.("button, .b3-board-grip, .b3-board-card-head>.b3-board-title")){o.preventDefault(),o.stopImmediatePropagation();return}if(!this.#m)return;this.#m=!1,o.preventDefault(),o.stopImmediatePropagation()},{signal:e,capture:!0}),this.addEventListener("keydown",(o)=>{if(o.key!=="?"||o.defaultPrevented||o.metaKey||o.ctrlKey||o.altKey||o.isComposing)return;if(o.target.closest?.('input, textarea, select, [contenteditable]:not([contenteditable="false"]), .b3-board-keys'))return;o.preventDefault(),this.showShortcuts()},{signal:e}),this.addEventListener("keydown",(o)=>{if(o.defaultPrevented||o.altKey||!(o.metaKey||o.ctrlKey))return;if(o.target.closest?.('input, textarea, select, [contenteditable]:not([contenteditable="false"])'))return;let s=o.key.toLowerCase(),a=s==="y"||s==="z"&&o.shiftKey;if(s!=="z"&&s!=="y")return;if(o.preventDefault(),a)this.redo();else this.undo()},{signal:e});let n=(o)=>this.#K(o);this.addEventListener("click",n,{signal:e,capture:!0}),this.addEventListener("auxclick",(o)=>{if(o.button===1)n(o)},{signal:e,capture:!0});let i=()=>this.#$();this.addEventListener("compositionstart",()=>{this.#g=!0},{signal:e}),this.addEventListener("compositionend",i,{signal:e}),this.addEventListener("focusout",i,{signal:e})}#$(){this.#g=!1;for(let e of this.#A.splice(0))e()}#K(e){let t=e.target.closest?.("a.b3-board-ref");if(!t||!this.contains(t))return;e.stopPropagation();let r=(c)=>t.closest(c),n=this.#e?.columns.find((c)=>y(c.id,r("[data-column]")?.dataset.column)),i=n?.cards.find((c)=>y(c.id,r("[data-card]")?.dataset.card)),o=i&&A(i).find((c)=>y(c.id,r("[data-subtask]")?.dataset.subtask)),s={href:t.dataset.href??"",text:t.textContent??"",file:t.hasAttribute("data-file"),newTab:e.metaKey||e.ctrlKey||e.shiftKey||e.button===1,card:i?.id,column:n?.id};if(o)s.subtask=o.id;let a=t.querySelector("img");if(a&&!s.newTab&&e.type==="click"){e.preventDefault(),this.#V(t,a,s);return}if(!t.dispatchEvent(new CustomEvent("b3-link",{bubbles:!0,cancelable:!0,detail:s}))||s.file)e.preventDefault()}#V(e,t,r){let n=this.ownerDocument;n.body.querySelector(":scope > .b3-board-lightbox")?.dispatchEvent(new CustomEvent("b3-close")),sr();let i=n.createElement("b3-image-viewer");i.className="b3-board-lightbox",i.setAttribute("alt",t.alt||"Image"),i.setAttribute("role","dialog"),i.setAttribute("aria-modal","true");let o=n.createElement("img");o.src=t.currentSrc||t.src,o.alt=t.alt;let s=n.createElement("button");s.type="button",s.className="b3-board-lightbox-open",s.textContent="Open",i.append(o,s);let a=n.activeElement,l=[...n.body.children].filter((d)=>d instanceof HTMLElement&&!d.inert),c=()=>{i.remove();for(let d of l)d.inert=!1;if(e.isConnected)e.focus({preventScroll:!0});else a?.focus?.({preventScroll:!0})};i.addEventListener("b3-close",c),i.addEventListener("click",(d)=>{if(d.target===i)c()}),s.addEventListener("pointerdown",(d)=>d.stopPropagation()),s.addEventListener("click",(d)=>{if(d.stopPropagation(),c(),e.dispatchEvent(new CustomEvent("b3-link",{bubbles:!0,cancelable:!0,detail:{...r}}))&&!r.file)this.ownerDocument.defaultView?.open(r.href,"_blank","noopener")}),n.body.append(i);for(let d of l)d.inert=!0;i.setAttribute("open",""),i.focus({preventScroll:!0})}#W(e){if(this.readonly||this.#r||!e.isPrimary||e.button!==0||this.#e?.editing)return;let t=e.target,r=t.closest(".b3-board-subtask-grip")?.closest(".b3-board-subtask"),n;if(r)n={kind:"subtask",id:r.dataset.subtask,card:r.closest(".b3-board-card").dataset.card,node:r,pointerId:e.pointerId,x:e.clientX,y:e.clientY,started:!1,hold:0};else{if(t.closest("input, textarea, select, a, .b3-board-quiet, .b3-board-chip, .b3-board-link, .b3-board-toggle, .b3-board-description"))return;let i=t.closest(".b3-board-grip, .b3-board-card-head>.b3-board-title")?t.closest(".b3-board-card"):null;if(!i&&t.closest(".b3-board-card"))return;let o=!i&&t.closest(".b3-board-column-header")?t.closest(".b3-board-column"):null,s=i??o;if(!s)return;n={kind:i?"card":"column",id:i?i.dataset.card:o.dataset.column,node:s,pointerId:e.pointerId,x:e.clientX,y:e.clientY,started:!1,hold:0}}if(!this.contains(n.node))return;if(this.#r=n,e.pointerType!=="mouse")n.hold=window.setTimeout(()=>{if(this.#r===n)this.#R(e.clientX,e.clientY)},ha)}#R(e,t){let r=this.#r;r.started=!0;let n=r.node.getBoundingClientRect(),i=r.node.cloneNode(!0);i.classList.add("b3-board-ghost"),i.removeAttribute("data-b3-dragging");for(let s of[i,...i.querySelectorAll("[id]")])s.removeAttribute("id");i.setAttribute("aria-hidden","true"),Object.assign(i.style,{inlineSize:`${n.width}px`,left:`${n.left}px`,top:`${n.top}px`}),r.dx=e-n.left,r.dy=t-n.top,r.ghost=i,this.#t.append(i),r.node.setAttribute("data-b3-dragging",""),this.ownerDocument.getSelection()?.removeAllRanges(),r.px=e,r.py=t;let o=()=>{if(this.#r!==r)return;this.#X(r.px,r.py),this.#G(this.#H(r.px,r.py)),r.frame=requestAnimationFrame(o)};r.frame=requestAnimationFrame(o)}#Y(e){let t=this.#r;if(!t||e.pointerId!==t.pointerId)return;if(!t.started){let r=Math.hypot(e.clientX-t.x,e.clientY-t.y);if(e.pointerType!=="mouse"){if(r>8)this.#b();return}if(r<5)return;this.#R(e.clientX,e.clientY)}e.preventDefault(),t.ghost.style.left=`${e.clientX-t.dx}px`,t.ghost.style.top=`${e.clientY-t.dy}px`,t.px=e.clientX,t.py=e.clientY}#J(e){let t=this.#r;if(!t||e.pointerId!==t.pointerId)return;if(!t.started)return this.#b();let r=this.#H(e.clientX,e.clientY);if(this.#b(),this.#m=!0,setTimeout(()=>{this.#m=!1},0),!r)return;let n=this.#e;if(t.kind==="card"){let i=n.columns.find((l)=>y(l.id,r.column)),o=n.columns.find((l)=>l.cards.some((c)=>y(c.id,t.id))),s=r.before?i.cards.findIndex((l)=>y(l.id,r.before)):i.cards.length,a=o.cards.findIndex((l)=>y(l.id,t.id));if(o===i&&a<s)s-=1;this.moveCard(t.id,i.id,s)}else if(t.kind==="subtask"){let i=this.#o(t.card);if(!i)return;let o=A(i),s=r.before?o.findIndex((a)=>y(a.id,r.before)):o.length;if(o.findIndex((a)=>y(a.id,t.id))<s)s-=1;this.#f(i,t.id,s)}else{let i=r.before?n.columns.findIndex((s)=>y(s.id,r.before)):n.columns.length;if(n.columns.findIndex((s)=>y(s.id,t.id))<i)i-=1;this.moveColumn(t.id,i)}}#H(e,t){let r=this.#r,n=this.ownerDocument.elementFromPoint(e,t);if(!n||!this.contains(n))return null;if(r.kind==="card"){let l=this.#z(e,n);if(!l)return null;let c=l.querySelector(".b3-board-cards"),d=[...c.querySelectorAll(":scope > .b3-board-card:not([data-b3-dragging])")],u=d.find((b)=>{let m=b.getBoundingClientRect();return t<m.top+m.height/2}),f=(b)=>!!(b!=null&&this.#o(b)?.starred);if(f(u?.dataset.card)!==f(r.id)&&(u||f(r.id)))u=d.find((b)=>!f(b.dataset.card));return{column:l.dataset.column,before:u?.dataset.card??null,list:c}}if(r.kind==="subtask"){let l=r.node.parentElement;return{column:"",before:[...l.querySelectorAll(":scope > .b3-board-subtask:not([data-b3-dragging])")].find((u)=>{let f=u.getBoundingClientRect();return t<f.top+f.height/2})?.dataset.subtask??null,list:l}}let i=this.querySelector(".b3-board-columns"),o=[...i.querySelectorAll(":scope > .b3-board-column:not([data-b3-dragging])")],s=getComputedStyle(this).direction==="rtl";return{column:"",before:o.find((l)=>{let c=l.getBoundingClientRect();return s?e>c.left+c.width/2:e<c.left+c.width/2})?.dataset.column??null,list:i}}#G(e){for(let n of this.querySelectorAll("[data-b3-drop]"))n.removeAttribute("data-b3-drop");if(!e)return;let t=`[data-${this.#r.kind}="${CSS.escape(e.before??"")}"]`,r=e.before?e.list.querySelector(t):null;(r??e.list).setAttribute("data-b3-drop",r?"before":"end")}#z(e,t){return t?.closest(".b3-board-column")??[...this.querySelectorAll(".b3-board-column")].find((r)=>{let n=r.getBoundingClientRect();return e>=n.left&&e<=n.right})}#X(e,t){let r=(s,a,l)=>s<a+40?-12:s>l-40?12:0,n=this.querySelector(".b3-board-columns");if(n){let s=n.getBoundingClientRect();n.scrollLeft+=r(e,s.left,s.right)}let i=this.#r?.kind==="card"?this.#z(e,this.ownerDocument.elementFromPoint(e,t))?.querySelector(".b3-board-cards"):null;if(i&&i.scrollHeight>i.clientHeight){let s=i.getBoundingClientRect();i.scrollTop+=r(t,s.top,s.bottom)}let o=this.ownerDocument.defaultView;o.scrollBy(0,r(t,0,o.innerHeight))}#b(){let e=this.#r;if(!e)return;this.#r=null,clearTimeout(e.hold),cancelAnimationFrame(e.frame??0),e.ghost?.remove(),e.node.removeAttribute("data-b3-dragging");for(let t of this.querySelectorAll("[data-b3-drop]"))t.removeAttribute("data-b3-drop")}}hr("b3-board",hi);export{hi as B3Board};
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.0-alpha.122",
2
+ "version": "0.1.0-alpha.124",
3
3
  "cssSha256": "bcd1ca98ef45cdb643cdf8c89b5e9c3950b1b7e8a594c7f3d236d7c5d1c3a434",
4
4
  "classes": [
5
5
  "b3-accordion",
@@ -118,8 +118,8 @@
118
118
  "classes": [
119
119
  "b3-root"
120
120
  ],
121
- "guidance": "Place b3-root on html to synchronize the document canvas and native controls. Set data-b3-theme=\"dark\" explicitly for dark mode. A nested root inherits its parent theme and tokens; set data-b3-theme on it only to force a different theme. Override complete CSS values in --b3-* properties. Consumer CSS is unlayered and wins over library defaults. Scope custom palette overrides to each theme: unlayered :root token overrides beat layered library dark defaults. Use .b3-root:not([data-b3-theme=\"dark\"]) for light-only colors and .b3-root[data-b3-theme=\"dark\"] for dark overrides. Set foreground/background pairs together. Borders: --b3-color-border is the soft edge for cards, dividers, rows and bubbles; --b3-color-border-strong is the text-input edge (b3-input, textarea, select, b3-input-group, the composer field), kept at least 3:1 against both surface and canvas. Override both per theme; focus and error states keep their own colors. Check ordinary text at least 4.5:1 against its actual backing in every theme/state, including muted badges and selected filters. For translucent fills, composite over the real surface; a passing accent-on-white pair does not qualify an accent-tinted badge. Leave margin above the threshold. Density: data-b3-density=\"compact\" on the root tightens controls, nav, headings, avatars and messages for pointer-first apps; \"auto\" applies it only under a fine pointer on a wide viewport and keeps touch sizing on phones. For nested rounded surfaces with an even inset, derive the inner radius from the outer radius minus padding and border, clamped at zero. File-selector buttons and command-palette items follow this relationship. Match focus indicators to the element shape; keep surface colors theme-aware. Enabled native buttons inherit surrounding text color by default, including custom card actions; explicit component/app colors still win. Disabled native controls retain browser disabled styling.",
122
- "example": "<html class=\"b3-root\" data-b3-theme=\"dark\">"
121
+ "guidance": "Place b3-root on html to synchronize the document canvas and native controls. Set data-b3-theme=\"dark\" explicitly for dark mode. A nested root inherits its parent theme and tokens; set data-b3-theme on it only to force a different theme. Override complete CSS values in --b3-* properties. Consumer CSS is unlayered and wins over library defaults. Scope custom palette overrides to each theme: unlayered :root token overrides beat layered library dark defaults. Use .b3-root:not([data-b3-theme=\"dark\"]) for light-only colors and .b3-root[data-b3-theme=\"dark\"] for dark overrides. Set foreground/background pairs together. Keep theme-invariant font, radius and spacing overrides outside light/dark selectors so switching theme preserves the app identity. Custom surfaces should use semantic color tokens, not a fixed light translucent fill behind theme-dependent text. Borders: --b3-color-border is the soft edge for cards, dividers, rows and bubbles; --b3-color-border-strong is the text-input edge (b3-input, textarea, select, b3-input-group, the composer field), kept at least 3:1 against both surface and canvas. Override both per theme; focus and error states keep their own colors. Check ordinary text at least 4.5:1 against its actual backing in every theme/state, including muted badges and selected filters. For translucent fills, composite over the real surface; a passing accent-on-white pair does not qualify an accent-tinted badge. Leave margin above the threshold. Density: data-b3-density=\"compact\" on the root tightens controls, nav, headings, avatars and messages for pointer-first apps; \"auto\" applies it only under a fine pointer on a wide viewport and keeps touch sizing on phones. For nested rounded surfaces with an even inset, derive the inner radius from the outer radius minus padding and border, clamped at zero. File-selector buttons and command-palette items follow this relationship. Match focus indicators to the element shape; keep surface colors theme-aware. Enabled native buttons inherit surrounding text color by default, including custom card actions; explicit component/app colors still win. Disabled native controls retain browser disabled styling.",
122
+ "example": "<html class=\"b3-root\" data-b3-theme=\"dark\">\n<style>\n/* Identity applies in both themes; scope custom palette values separately. */\n.b3-root {\n --b3-font-body: system-ui, sans-serif;\n --b3-font-display: Georgia, serif;\n --b3-radius: 0.5rem;\n}\n.app-panel {\n color: var(--b3-color-text);\n background: var(--b3-color-surface);\n}\n</style>"
123
123
  },
124
124
  {
125
125
  "id": "layout",
@@ -1,9 +1,21 @@
1
1
  # Root and theme
2
2
 
3
- Place b3-root on html to synchronize the document canvas and native controls. Set data-b3-theme="dark" explicitly for dark mode. A nested root inherits its parent theme and tokens; set data-b3-theme on it only to force a different theme. Override complete CSS values in --b3-* properties. Consumer CSS is unlayered and wins over library defaults. Scope custom palette overrides to each theme: unlayered :root token overrides beat layered library dark defaults. Use .b3-root:not([data-b3-theme="dark"]) for light-only colors and .b3-root[data-b3-theme="dark"] for dark overrides. Set foreground/background pairs together. Borders: --b3-color-border is the soft edge for cards, dividers, rows and bubbles; --b3-color-border-strong is the text-input edge (b3-input, textarea, select, b3-input-group, the composer field), kept at least 3:1 against both surface and canvas. Override both per theme; focus and error states keep their own colors. Check ordinary text at least 4.5:1 against its actual backing in every theme/state, including muted badges and selected filters. For translucent fills, composite over the real surface; a passing accent-on-white pair does not qualify an accent-tinted badge. Leave margin above the threshold. Density: data-b3-density="compact" on the root tightens controls, nav, headings, avatars and messages for pointer-first apps; "auto" applies it only under a fine pointer on a wide viewport and keeps touch sizing on phones. For nested rounded surfaces with an even inset, derive the inner radius from the outer radius minus padding and border, clamped at zero. File-selector buttons and command-palette items follow this relationship. Match focus indicators to the element shape; keep surface colors theme-aware. Enabled native buttons inherit surrounding text color by default, including custom card actions; explicit component/app colors still win. Disabled native controls retain browser disabled styling.
3
+ Place b3-root on html to synchronize the document canvas and native controls. Set data-b3-theme="dark" explicitly for dark mode. A nested root inherits its parent theme and tokens; set data-b3-theme on it only to force a different theme. Override complete CSS values in --b3-* properties. Consumer CSS is unlayered and wins over library defaults. Scope custom palette overrides to each theme: unlayered :root token overrides beat layered library dark defaults. Use .b3-root:not([data-b3-theme="dark"]) for light-only colors and .b3-root[data-b3-theme="dark"] for dark overrides. Set foreground/background pairs together. Keep theme-invariant font, radius and spacing overrides outside light/dark selectors so switching theme preserves the app identity. Custom surfaces should use semantic color tokens, not a fixed light translucent fill behind theme-dependent text. Borders: --b3-color-border is the soft edge for cards, dividers, rows and bubbles; --b3-color-border-strong is the text-input edge (b3-input, textarea, select, b3-input-group, the composer field), kept at least 3:1 against both surface and canvas. Override both per theme; focus and error states keep their own colors. Check ordinary text at least 4.5:1 against its actual backing in every theme/state, including muted badges and selected filters. For translucent fills, composite over the real surface; a passing accent-on-white pair does not qualify an accent-tinted badge. Leave margin above the threshold. Density: data-b3-density="compact" on the root tightens controls, nav, headings, avatars and messages for pointer-first apps; "auto" applies it only under a fine pointer on a wide viewport and keeps touch sizing on phones. For nested rounded surfaces with an even inset, derive the inner radius from the outer radius minus padding and border, clamped at zero. File-selector buttons and command-palette items follow this relationship. Match focus indicators to the element shape; keep surface colors theme-aware. Enabled native buttons inherit surrounding text color by default, including custom card actions; explicit component/app colors still win. Disabled native controls retain browser disabled styling.
4
4
 
5
5
  Classes: b3-root
6
6
 
7
7
  ```html
8
8
  <html class="b3-root" data-b3-theme="dark">
9
+ <style>
10
+ /* Identity applies in both themes; scope custom palette values separately. */
11
+ .b3-root {
12
+ --b3-font-body: system-ui, sans-serif;
13
+ --b3-font-display: Georgia, serif;
14
+ --b3-radius: 0.5rem;
15
+ }
16
+ .app-panel {
17
+ color: var(--b3-color-text);
18
+ background: var(--b3-color-surface);
19
+ }
20
+ </style>
9
21
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livx.cc/bare-v3",
3
- "version": "0.1.0-alpha.122",
3
+ "version": "0.1.0-alpha.124",
4
4
  "type": "module",
5
5
  "thirdPartyNotices": "./dist/third-party.json",
6
6
  "files": [