diff options
| author | Eltrac <hi@guhub.cn> | 2025-09-16 15:27:08 +0800 |
|---|---|---|
| committer | Eltrac <hi@guhub.cn> | 2025-09-16 15:27:08 +0800 |
| commit | 51f4f6a7d020abf5f1e9a3a19e23df3cf1ba41f3 (patch) | |
| tree | 496d8dfb542ca3002239ff51c112dd953bf83571 /dist | |
| parent | 00e7eab4eb65cbb4e396837281ebf4a38cdcd7ad (diff) | |
chore(build)
Diffstat (limited to 'dist')
| -rw-r--r-- | dist/libra.min.js | 2 | ||||
| -rw-r--r-- | dist/libra.min.js.map | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/dist/libra.min.js b/dist/libra.min.js index ac819a5..60ce56b 100644 --- a/dist/libra.min.js +++ b/dist/libra.min.js @@ -1,2 +1,2 @@ -class e{zIndex=900;zIndexHidden=-100;constructor(){let e=document.createElement("div");return e.id="libra-overlay",e.classList.add("libra-overlay"),e.style.zIndex=this.zIndexHidden,e.style.opacity="0",this.element=e,document.body.appendChild(e),this}show(){this.element.style.opacity="1",this.element.style.zIndex=this.zIndex}hide(){this.element.style.opacity="0",this.element.style.zIndex="-100"}}class t{static calculateFinalState(e){let t={},i=e.naturalWidth/e.naturalHeight,s=window.innerWidth-100,l=window.innerHeight-100;return e.naturalWidth>s?(t.width=s,t.height=s/i,t.height>l&&(t.height=l,t.width=l*i)):(t.width=e.offsetWidth,t.height=e.offsetHeight),t.top=(l-t.height)/2+window.scrollY+50,t.left=(s-t.width)/2+window.scrollX+50,t}static transformMatrix(e,t,i){let s=i.width/t.width,l=i.height/t.height,h=t.left+t.width/2,n=t.top+t.height/2,o=i.left+i.width/2,a=i.top+i.height/2;e.style.transform=`matrix(${s}, 0, 0, ${l}, ${o-h}, ${a-n})`}static resetTransformMatrix(e){e.style.transform="matrix(1, 0, 0, 1, 0, 0)"}}class i{zIndex="1000";isOpen=!1;constructor(e){return this.create(e),this.startingState={top:this.element.offsetTop,left:this.element.offsetLeft,width:this.element.offsetWidth,height:this.element.offsetHeight},this}create(e){let t=document.createElement("img");t.src=e.src,t.id=`libra-shadow-${e.id}`,t.classList.add("libra-shadow"),t.style.top=e.offsetTop,t.style.left=e.offsetLeft,t.style.width=e.offsetWidth,t.style.height=e.offsetHeight,t.style.zIndex=this.zIndex,document.body.appendChild(t),this.element=t}open(){this.isOpen=!0,t.transformMatrix(this.element,this.startingState,t.calculateFinalState(this.element))}close(){this.isOpen=!1,t.resetTransformMatrix(this.element),setTimeout(()=>this.destroyItself(),300)}placeItself(){document.body.appendChild(this.element)}destroyItself(){document.body.contains(this.element)&&document.body.removeChild(this.element)}}class s{currentImage=null;shadows={};constructor({selector:e}){this.selector=e,this.initOverlay(),this.initImages(),this.initControls()}initOverlay(){this.overlay=new e,this.overlay.element.addEventListener("click",()=>{this.closeCurrent()})}initImages(){this.images=document.querySelectorAll(this.selector),this.images.forEach(e=>{"IMG"===e.tagName&&(e.id=crypto.randomUUID(),e.addEventListener("click",()=>this.open(e)))})}initControls(){document.addEventListener("keydown",e=>{("Escape"===e.key||" "===e.key)&&this.closeCurrent()}),document.body.addEventListener("wheel",e=>{this.closeCurrent()})}open(e){e.style.visibility="hidden",this.currentImage=e;let t=this.shadows[e.id]||new i(e);this.shadows[e.id]||(this.shadows[e.id]=t),document.body.contains(t.element)||t.placeItself(),t.open(),this.overlay.show()}close(e){e.style.visibility="visible",this.currentImage=null;let t=this.shadows[e.id];t&&(t.close(),this.overlay.hide())}closeCurrent(){this.currentImage&&this.close(this.currentImage)}closeAll(){this.images.forEach(e=>{this.close(e)}),this.overlay.hide()}}export{s as default}; +class t{zIndex=900;zIndexHidden=-100;constructor(){let t=document.createElement("div");return t.id="libra-overlay",t.classList.add("libra-overlay"),t.style.zIndex=this.zIndexHidden,t.style.opacity="0",this.element=t,document.body.appendChild(t),this}show(){this.element.style.opacity="1",this.element.style.zIndex=this.zIndex}hide(){this.element.style.opacity="0",this.element.style.zIndex="-100"}}class e{static calculateFinalState(t){let e={},i=t.naturalWidth/t.naturalHeight,s=window.innerWidth-100,n=window.innerHeight-100;return t.naturalWidth>s?(e.width=s,e.height=s/i,e.height>n&&(e.height=n,e.width=n*i)):(e.width=t.offsetWidth,e.height=t.offsetHeight),e.top=(n-e.height)/2+window.scrollY+50,e.left=(s-e.width)/2+window.scrollX+50,e}static transformMatrix(t,e,i){let s=i.width/e.width,n=i.height/e.height,h=e.left+e.width/2,l=e.top+e.height/2,o=i.left+i.width/2,r=i.top+i.height/2;t.style.transform=`matrix(${s}, 0, 0, ${n}, ${o-h}, ${r-l})`}static resetTransformMatrix(t){t.style.transform="matrix(1, 0, 0, 1, 0, 0)"}}class i{zIndex="1000";isOpen=!1;constructor(t){return this.original=t,this.create(t),this.startingState={top:this.element.offsetTop,left:this.element.offsetLeft,width:this.element.offsetWidth,height:this.element.offsetHeight},this}create(t){let e=document.createElement("img");e.src=t.src,e.id=`libra-shadow-${t.id}`,e.classList.add("libra-shadow"),e.style.top=t.offsetTop,e.style.left=t.offsetLeft,e.style.width=t.offsetWidth,e.style.height=t.offsetHeight,e.style.zIndex=this.zIndex,document.body.appendChild(e),this.element=e}open(){this.isOpen=!0,this.original.style.visibility="hidden",document.body.contains(this.element)||this.placeItself(),e.transformMatrix(this.element,this.startingState,e.calculateFinalState(this.element))}close(){this.isOpen=!1,this.original.style.visibility="visible",e.resetTransformMatrix(this.element),setTimeout(()=>this.destroyItself(),300)}placeItself(){document.body.appendChild(this.element)}destroyItself(){document.body.contains(this.element)&&document.body.removeChild(this.element)}}class s{currentImage=null;shadows={};constructor({selector:t}){this.selector=t,this.initOverlay(),this.initImages(),this.initControls()}initOverlay(){this.overlay=new t,this.overlay.element.addEventListener("click",()=>{this.closeCurrent()})}initImages(){this.images=document.querySelectorAll(this.selector),this.images.forEach(t=>{"IMG"===t.tagName&&(t.id=crypto.randomUUID(),t.style.cursor="zoom-in",t.addEventListener("click",()=>this.open(t)))})}initControls(){document.addEventListener("keydown",t=>{("Escape"===t.key||" "===t.key)&&this.closeCurrent()}),document.body.addEventListener("wheel",t=>{this.closeCurrent()})}open(t){this.currentImage=t;let e=this.shadows[t.id]||new i(t);this.shadows[t.id]||(this.shadows[t.id]=e),e.open(),this.overlay.show()}close(t){this.currentImage=null,this.shadows[t.id]&&(this.shadows[t.id].close(),this.overlay.hide())}closeCurrent(){this.currentImage&&this.close(this.currentImage)}}export{s as default}; //# sourceMappingURL=libra.min.js.map diff --git a/dist/libra.min.js.map b/dist/libra.min.js.map index 7c6892a..35bfdbc 100644 --- a/dist/libra.min.js.map +++ b/dist/libra.min.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["<anon>","src/lightbox.js","src/overlay.js","src/shadow.js","src/animation.js"],"sourcesContent":["class $e49d13fc7942bae1$export$2e2bcd8739ae039 {\n zIndex = 900;\n zIndexHidden = -100;\n constructor(){\n const overlay = document.createElement('div');\n overlay.id = 'libra-overlay';\n overlay.classList.add('libra-overlay');\n // initialized state\n overlay.style.zIndex = this.zIndexHidden;\n overlay.style.opacity = '0';\n this.element = overlay;\n document.body.appendChild(overlay);\n return this;\n }\n show() {\n this.element.style.opacity = '1';\n this.element.style.zIndex = this.zIndex;\n }\n hide() {\n this.element.style.opacity = '0';\n this.element.style.zIndex = '-100';\n }\n}\n\n\nclass $6e8e6c64a3263339$export$2e2bcd8739ae039 {\n static calculateFinalState(element) {\n let finals = {};\n const margin = 50;\n const ratio = element.naturalWidth / element.naturalHeight;\n const ww = window.innerWidth - 2 * margin;\n const wh = window.innerHeight - 2 * margin;\n if (element.naturalWidth > ww) {\n finals.width = ww;\n finals.height = ww / ratio;\n if (finals.height > wh) {\n finals.height = wh;\n finals.width = wh * ratio;\n }\n } else {\n finals.width = element.offsetWidth;\n finals.height = element.offsetHeight;\n }\n finals.top = (wh - finals.height) / 2 + window.scrollY + margin;\n finals.left = (ww - finals.width) / 2 + window.scrollX + margin;\n return finals;\n }\n static transformMatrix(element, starts, finals) {\n // Calculate scaling factors based on width and height interpolation\n const scaleX = finals.width / starts.width;\n const scaleY = finals.height / starts.height;\n // Calculate the center of the starting and final positions\n const startCenterX = starts.left + starts.width / 2;\n const startCenterY = starts.top + starts.height / 2;\n const finalCenterX = finals.left + finals.width / 2;\n const finalCenterY = finals.top + finals.height / 2;\n const translateX = finalCenterX - startCenterX;\n const translateY = finalCenterY - startCenterY;\n // Apply the transform with matrix (scale + translate)\n element.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${translateX}, ${translateY})`;\n }\n static resetTransformMatrix(element) {\n element.style.transform = `matrix(1, 0, 0, 1, 0, 0)`;\n }\n}\n\n\nclass $2f427fc7e1c3703f$export$2e2bcd8739ae039 {\n zIndex = '1000';\n isOpen = false;\n /**\n * ============\n * Constructors\n * ============\n */ constructor(image){\n this.create(image);\n this.startingState = {\n top: this.element.offsetTop,\n left: this.element.offsetLeft,\n width: this.element.offsetWidth,\n height: this.element.offsetHeight\n };\n return this;\n }\n create(image) {\n // create shadow image\n const shadow = document.createElement('img');\n shadow.src = image.src;\n shadow.id = `libra-shadow-${image.id}`;\n shadow.classList.add('libra-shadow');\n // style and position shadow image\n shadow.style.top = image.offsetTop;\n shadow.style.left = image.offsetLeft;\n shadow.style.width = image.offsetWidth;\n shadow.style.height = image.offsetHeight;\n shadow.style.zIndex = this.zIndex;\n document.body.appendChild(shadow);\n this.element = shadow;\n }\n /**\n * ============\n * Actions\n * ============\n */ open() {\n this.isOpen = true;\n (0, $6e8e6c64a3263339$export$2e2bcd8739ae039).transformMatrix(this.element, this.startingState, (0, $6e8e6c64a3263339$export$2e2bcd8739ae039).calculateFinalState(this.element));\n }\n close() {\n this.isOpen = false;\n (0, $6e8e6c64a3263339$export$2e2bcd8739ae039).resetTransformMatrix(this.element);\n setTimeout(()=>this.destroyItself(), 300);\n }\n placeItself() {\n document.body.appendChild(this.element);\n }\n destroyItself() {\n if (!document.body.contains(this.element)) return;\n document.body.removeChild(this.element);\n }\n}\n\n\nclass $e220af4964903f87$export$2e2bcd8739ae039 {\n currentImage = null;\n shadows = {};\n /**\n * ============\n * Initializers\n * ============\n */ constructor({ selector: selector }){\n this.selector = selector;\n this.initOverlay();\n this.initImages();\n this.initControls();\n }\n initOverlay() {\n this.overlay = new (0, $e49d13fc7942bae1$export$2e2bcd8739ae039)();\n this.overlay.element.addEventListener('click', ()=>{\n this.closeCurrent();\n });\n }\n initImages() {\n this.images = document.querySelectorAll(this.selector);\n this.images.forEach((image)=>{\n if (image.tagName !== 'IMG') return;\n image.id = crypto.randomUUID(); // generate unique id for each image\n image.addEventListener('click', ()=>this.open(image)); // click image to open lightbox\n });\n }\n initControls() {\n // keyboard shortcuts\n document.addEventListener('keydown', (e)=>{\n if (e.key === 'Escape' || e.key === ' ') this.closeCurrent();\n });\n // scroll to dismiss\n document.body.addEventListener('wheel', (e)=>{\n this.closeCurrent();\n });\n }\n /**\n * ============\n * Actions\n * ============\n */ open(image) {\n // hide and store original image\n image.style.visibility = 'hidden';\n this.currentImage = image;\n // get shadow of this image\n const shadow = this.shadows[image.id] || new (0, $2f427fc7e1c3703f$export$2e2bcd8739ae039)(image);\n if (!this.shadows[image.id]) this.shadows[image.id] = shadow;\n // place and open shadow\n if (!document.body.contains(shadow.element)) shadow.placeItself();\n shadow.open();\n this.overlay.show();\n }\n close(image) {\n // show and unstore original image\n image.style.visibility = 'visible';\n this.currentImage = null;\n // close shadow\n const shadow = this.shadows[image.id];\n if (!shadow) return;\n shadow.close();\n this.overlay.hide();\n }\n closeCurrent() {\n if (!this.currentImage) return;\n this.close(this.currentImage);\n }\n closeAll() {\n this.images.forEach((image)=>{\n this.close(image);\n });\n this.overlay.hide();\n }\n}\n\n\nexport {$e220af4964903f87$export$2e2bcd8739ae039 as default};\n//# sourceMappingURL=libra.min.js.map\n","import Overlay from './overlay.js';\nimport Shadow from './shadow.js';\n\nexport default class LightBox {\n currentImage = null;\n shadows = {};\n\n /**\n * ============\n * Initializers\n * ============\n */\n\n constructor({ selector }) {\n this.selector = selector;\n this.initOverlay();\n this.initImages();\n this.initControls();\n }\n\n initOverlay() {\n this.overlay = new Overlay();\n this.overlay.element.addEventListener('click', () => {\n this.closeCurrent();\n });\n }\n\n initImages() {\n this.images = document.querySelectorAll(this.selector);\n this.images.forEach(image => {\n if (image.tagName !== 'IMG') return;\n image.id = crypto.randomUUID(); // generate unique id for each image\n image.addEventListener('click', () => this.open(image)); // click image to open lightbox\n });\n }\n\n initControls() {\n // keyboard shortcuts\n document.addEventListener('keydown', e => {\n if (e.key === 'Escape' || e.key === ' ') {\n this.closeCurrent();\n }\n });\n // scroll to dismiss\n document.body.addEventListener('wheel', e => {\n this.closeCurrent();\n });\n }\n\n /**\n * ============\n * Actions\n * ============\n */\n\n open(image) {\n // hide and store original image\n image.style.visibility = 'hidden';\n this.currentImage = image;\n\n // get shadow of this image\n const shadow = this.shadows[image.id] || new Shadow(image);\n if (!this.shadows[image.id]) {\n this.shadows[image.id] = shadow;\n }\n\n // place and open shadow\n if (!document.body.contains(shadow.element)) shadow.placeItself();\n shadow.open();\n\n this.overlay.show();\n }\n\n close(image) {\n // show and unstore original image\n image.style.visibility = 'visible';\n this.currentImage = null;\n\n // close shadow\n const shadow = this.shadows[image.id];\n if (!shadow) return;\n shadow.close();\n\n this.overlay.hide();\n }\n\n closeCurrent() {\n if (!this.currentImage) return;\n this.close(this.currentImage);\n }\n\n closeAll() {\n this.images.forEach(image => {\n this.close(image);\n });\n this.overlay.hide();\n }\n}\n","export default class Overlay {\n zIndex = 900;\n zIndexHidden = -100;\n\n constructor() {\n const overlay = document.createElement('div');\n overlay.id = 'libra-overlay';\n overlay.classList.add('libra-overlay');\n\n // initialized state\n overlay.style.zIndex = this.zIndexHidden;\n overlay.style.opacity = '0';\n\n this.element = overlay;\n document.body.appendChild(overlay);\n\n return this;\n }\n\n show() {\n this.element.style.opacity = '1';\n this.element.style.zIndex = this.zIndex;\n }\n\n hide() {\n this.element.style.opacity = '0';\n this.element.style.zIndex = '-100';\n }\n}\n","import Animation from './animation.js'\n\nexport default class Shadow {\n zIndex = '1000'\n isOpen = false\n\n /**\n * ============\n * Constructors\n * ============\n */\n\n constructor(image) {\n this.create(image);\n\n this.startingState = {\n top: this.element.offsetTop,\n left: this.element.offsetLeft,\n width: this.element.offsetWidth,\n height: this.element.offsetHeight\n }\n\n return this;\n }\n\n create(image) {\n // create shadow image\n const shadow = document.createElement('img');\n shadow.src = image.src;\n shadow.id = `libra-shadow-${image.id}`;\n shadow.classList.add('libra-shadow');\n\n // style and position shadow image\n shadow.style.top = image.offsetTop;\n shadow.style.left = image.offsetLeft;\n shadow.style.width = image.offsetWidth;\n shadow.style.height = image.offsetHeight;\n shadow.style.zIndex = this.zIndex;\n\n document.body.appendChild(shadow);\n this.element = shadow;\n }\n\n /**\n * ============\n * Actions\n * ============\n */\n\n open() {\n this.isOpen = true;\n Animation.transformMatrix(\n this.element,\n this.startingState,\n Animation.calculateFinalState(this.element)\n );\n }\n\n close() {\n this.isOpen = false;\n Animation.resetTransformMatrix(this.element);\n setTimeout(() => this.destroyItself(), 300);\n }\n\n placeItself() {\n document.body.appendChild(this.element);\n }\n\n destroyItself() {\n if (!document.body.contains(this.element)) return;\n document.body.removeChild(this.element);\n }\n}\n","export default class Animation {\n static calculateFinalState(element) {\n let finals = {}\n\n const margin = 50\n const ratio = element.naturalWidth / element.naturalHeight;\n const ww = window.innerWidth - 2*margin;\n const wh = window.innerHeight - 2*margin;\n\n if (element.naturalWidth > ww) {\n finals.width = ww;\n finals.height = ww / ratio;\n if (finals.height > wh) {\n finals.height = wh;\n finals.width = wh * ratio;\n }\n } else {\n finals.width = element.offsetWidth;\n finals.height = element.offsetHeight;\n }\n\n finals.top = (wh - finals.height) / 2 + window.scrollY + margin;\n finals.left = (ww - finals.width) / 2 + window.scrollX + margin;\n\n return finals;\n }\n\n static transformMatrix(element, starts, finals) {\n // Calculate scaling factors based on width and height interpolation\n const scaleX = finals.width / starts.width;\n const scaleY = finals.height / starts.height;\n\n // Calculate the center of the starting and final positions\n const startCenterX = starts.left + starts.width / 2;\n const startCenterY = starts.top + starts.height / 2;\n const finalCenterX = finals.left + finals.width / 2;\n const finalCenterY = finals.top + finals.height / 2;\n\n const translateX = finalCenterX - startCenterX;\n const translateY = finalCenterY - startCenterY;\n\n // Apply the transform with matrix (scale + translate)\n element.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${translateX}, ${translateY})`;\n }\n\n static resetTransformMatrix(element) {\n element.style.transform = `matrix(1, 0, 0, 1, 0, 0)`;\n }\n}\n"],"names":["$e49d13fc7942bae1$export$2e2bcd8739ae039","zIndex","zIndexHidden","overlay","document","createElement","id","classList","add","style","opacity","element","body","appendChild","show","hide","$6e8e6c64a3263339$export$2e2bcd8739ae039","calculateFinalState","finals","ratio","naturalWidth","naturalHeight","ww","window","innerWidth","wh","innerHeight","width","height","offsetWidth","offsetHeight","top","scrollY","left","scrollX","transformMatrix","starts","scaleX","scaleY","startCenterX","startCenterY","finalCenterX","finalCenterY","transform","resetTransformMatrix","$2f427fc7e1c3703f$export$2e2bcd8739ae039","isOpen","image","create","startingState","offsetTop","offsetLeft","shadow","src","open","close","setTimeout","destroyItself","placeItself","contains","removeChild","$e220af4964903f87$export$2e2bcd8739ae039","currentImage","shadows","selector","initOverlay","initImages","initControls","addEventListener","closeCurrent","images","querySelectorAll","forEach","tagName","crypto","randomUUID","e","key","visibility","closeAll","default"],"version":3,"file":"libra.min.js.map"}
\ No newline at end of file +{"mappings":"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","sources":["<anon>","src/lightbox.js","src/overlay.js","src/shadow.js","src/animation.js"],"sourcesContent":["class $e49d13fc7942bae1$export$2e2bcd8739ae039 {\n zIndex = 900;\n zIndexHidden = -100;\n constructor(){\n const overlay = document.createElement('div');\n overlay.id = 'libra-overlay';\n overlay.classList.add('libra-overlay');\n // initialized state\n overlay.style.zIndex = this.zIndexHidden;\n overlay.style.opacity = '0';\n this.element = overlay;\n document.body.appendChild(overlay);\n return this;\n }\n show() {\n this.element.style.opacity = '1';\n this.element.style.zIndex = this.zIndex;\n }\n hide() {\n this.element.style.opacity = '0';\n this.element.style.zIndex = '-100';\n }\n}\n\n\nclass $6e8e6c64a3263339$export$2e2bcd8739ae039 {\n static calculateFinalState(element) {\n let finals = {};\n const margin = 50;\n const ratio = element.naturalWidth / element.naturalHeight;\n const ww = window.innerWidth - 2 * margin;\n const wh = window.innerHeight - 2 * margin;\n if (element.naturalWidth > ww) {\n finals.width = ww;\n finals.height = ww / ratio;\n if (finals.height > wh) {\n finals.height = wh;\n finals.width = wh * ratio;\n }\n } else {\n finals.width = element.offsetWidth;\n finals.height = element.offsetHeight;\n }\n finals.top = (wh - finals.height) / 2 + window.scrollY + margin;\n finals.left = (ww - finals.width) / 2 + window.scrollX + margin;\n return finals;\n }\n static transformMatrix(element, starts, finals) {\n // Calculate scaling factors based on width and height interpolation\n const scaleX = finals.width / starts.width;\n const scaleY = finals.height / starts.height;\n // Calculate the center of the starting and final positions\n const startCenterX = starts.left + starts.width / 2;\n const startCenterY = starts.top + starts.height / 2;\n const finalCenterX = finals.left + finals.width / 2;\n const finalCenterY = finals.top + finals.height / 2;\n const translateX = finalCenterX - startCenterX;\n const translateY = finalCenterY - startCenterY;\n // Apply the transform with matrix (scale + translate)\n element.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${translateX}, ${translateY})`;\n }\n static resetTransformMatrix(element) {\n element.style.transform = `matrix(1, 0, 0, 1, 0, 0)`;\n }\n}\n\n\nclass $2f427fc7e1c3703f$export$2e2bcd8739ae039 {\n zIndex = '1000';\n isOpen = false;\n /**\n * ============\n * Constructors\n * ============\n */ constructor(image){\n this.original = image;\n this.create(image);\n this.startingState = {\n top: this.element.offsetTop,\n left: this.element.offsetLeft,\n width: this.element.offsetWidth,\n height: this.element.offsetHeight\n };\n return this;\n }\n create(image) {\n // create shadow image\n const shadow = document.createElement('img');\n shadow.src = image.src;\n shadow.id = `libra-shadow-${image.id}`;\n shadow.classList.add('libra-shadow');\n // style and position shadow image\n shadow.style.top = image.offsetTop;\n shadow.style.left = image.offsetLeft;\n shadow.style.width = image.offsetWidth;\n shadow.style.height = image.offsetHeight;\n shadow.style.zIndex = this.zIndex;\n document.body.appendChild(shadow);\n this.element = shadow;\n }\n /**\n * ============\n * Actions\n * ============\n */ open() {\n this.isOpen = true;\n this.original.style.visibility = 'hidden';\n if (!document.body.contains(this.element)) this.placeItself();\n (0, $6e8e6c64a3263339$export$2e2bcd8739ae039).transformMatrix(this.element, this.startingState, (0, $6e8e6c64a3263339$export$2e2bcd8739ae039).calculateFinalState(this.element));\n }\n close() {\n this.isOpen = false;\n this.original.style.visibility = 'visible';\n (0, $6e8e6c64a3263339$export$2e2bcd8739ae039).resetTransformMatrix(this.element);\n setTimeout(()=>this.destroyItself(), 300);\n }\n placeItself() {\n document.body.appendChild(this.element);\n }\n destroyItself() {\n if (!document.body.contains(this.element)) return;\n document.body.removeChild(this.element);\n }\n}\n\n\nclass $e220af4964903f87$export$2e2bcd8739ae039 {\n currentImage = null;\n shadows = {};\n /**\n * ============\n * Initializers\n * ============\n */ constructor({ selector: selector }){\n this.selector = selector;\n this.initOverlay();\n this.initImages();\n this.initControls();\n }\n initOverlay() {\n this.overlay = new (0, $e49d13fc7942bae1$export$2e2bcd8739ae039)();\n this.overlay.element.addEventListener('click', ()=>{\n this.closeCurrent();\n });\n }\n initImages() {\n this.images = document.querySelectorAll(this.selector);\n this.images.forEach((image)=>{\n if (image.tagName !== 'IMG') return;\n image.id = crypto.randomUUID(); // generate unique id for each image\n image.style.cursor = 'zoom-in';\n image.addEventListener('click', ()=>this.open(image)); // click image to open lightbox\n });\n }\n initControls() {\n // keyboard shortcuts\n document.addEventListener('keydown', (e)=>{\n if (e.key === 'Escape' || e.key === ' ') this.closeCurrent();\n });\n // scroll to dismiss\n document.body.addEventListener('wheel', (e)=>{\n this.closeCurrent();\n });\n }\n /**\n * ============\n * Actions\n * ============\n */ // open lightbox = open shadow + show overlay\n open(image) {\n this.currentImage = image;\n const shadow = this.shadows[image.id] || new (0, $2f427fc7e1c3703f$export$2e2bcd8739ae039)(image);\n if (!this.shadows[image.id]) this.shadows[image.id] = shadow;\n shadow.open();\n this.overlay.show();\n }\n // close lightbox = remove shadow + hide overlay\n close(image) {\n this.currentImage = null;\n if (!this.shadows[image.id]) return;\n this.shadows[image.id].close();\n this.overlay.hide();\n }\n closeCurrent() {\n if (!this.currentImage) return;\n this.close(this.currentImage);\n }\n}\n\n\nexport {$e220af4964903f87$export$2e2bcd8739ae039 as default};\n//# sourceMappingURL=libra.min.js.map\n","import Overlay from './overlay.js';\nimport Shadow from './shadow.js';\n\nexport default class LightBox {\n currentImage = null;\n shadows = {};\n\n /**\n * ============\n * Initializers\n * ============\n */\n\n constructor({ selector }) {\n this.selector = selector;\n this.initOverlay();\n this.initImages();\n this.initControls();\n }\n\n initOverlay() {\n this.overlay = new Overlay();\n this.overlay.element.addEventListener('click', () => {\n this.closeCurrent();\n });\n }\n\n initImages() {\n this.images = document.querySelectorAll(this.selector);\n this.images.forEach(image => {\n if (image.tagName !== 'IMG') return;\n image.id = crypto.randomUUID(); // generate unique id for each image\n image.style.cursor = 'zoom-in';\n image.addEventListener('click', () => this.open(image)); // click image to open lightbox\n });\n }\n\n initControls() {\n // keyboard shortcuts\n document.addEventListener('keydown', e => {\n if (e.key === 'Escape' || e.key === ' ') {\n this.closeCurrent();\n }\n });\n // scroll to dismiss\n document.body.addEventListener('wheel', e => {\n this.closeCurrent();\n });\n }\n\n /**\n * ============\n * Actions\n * ============\n */\n\n // open lightbox = open shadow + show overlay\n open(image) {\n this.currentImage = image;\n\n const shadow = this.shadows[image.id] || new Shadow(image);\n if (!this.shadows[image.id]) {\n this.shadows[image.id] = shadow;\n }\n\n shadow.open();\n this.overlay.show();\n }\n\n // close lightbox = remove shadow + hide overlay\n close(image) {\n this.currentImage = null;\n\n if (!this.shadows[image.id]) return;\n this.shadows[image.id].close();\n\n this.overlay.hide();\n }\n\n closeCurrent() {\n if (!this.currentImage) return;\n this.close(this.currentImage);\n }\n}\n","export default class Overlay {\n zIndex = 900;\n zIndexHidden = -100;\n\n constructor() {\n const overlay = document.createElement('div');\n overlay.id = 'libra-overlay';\n overlay.classList.add('libra-overlay');\n\n // initialized state\n overlay.style.zIndex = this.zIndexHidden;\n overlay.style.opacity = '0';\n\n this.element = overlay;\n document.body.appendChild(overlay);\n\n return this;\n }\n\n show() {\n this.element.style.opacity = '1';\n this.element.style.zIndex = this.zIndex;\n }\n\n hide() {\n this.element.style.opacity = '0';\n this.element.style.zIndex = '-100';\n }\n}\n","import Animation from './animation.js'\n\nexport default class Shadow {\n zIndex = '1000'\n isOpen = false\n\n /**\n * ============\n * Constructors\n * ============\n */\n\n constructor(image) {\n this.original = image;\n this.create(image);\n\n this.startingState = {\n top: this.element.offsetTop,\n left: this.element.offsetLeft,\n width: this.element.offsetWidth,\n height: this.element.offsetHeight\n }\n\n return this;\n }\n\n create(image) {\n // create shadow image\n const shadow = document.createElement('img');\n shadow.src = image.src;\n shadow.id = `libra-shadow-${image.id}`;\n shadow.classList.add('libra-shadow');\n\n // style and position shadow image\n shadow.style.top = image.offsetTop;\n shadow.style.left = image.offsetLeft;\n shadow.style.width = image.offsetWidth;\n shadow.style.height = image.offsetHeight;\n shadow.style.zIndex = this.zIndex;\n\n document.body.appendChild(shadow);\n this.element = shadow;\n }\n\n /**\n * ============\n * Actions\n * ============\n */\n\n open() {\n this.isOpen = true;\n\n this.original.style.visibility = 'hidden';\n if (!document.body.contains(this.element)) this.placeItself();\n\n Animation.transformMatrix(\n this.element,\n this.startingState,\n Animation.calculateFinalState(this.element)\n );\n }\n\n close() {\n this.isOpen = false;\n\n this.original.style.visibility = 'visible';\n\n Animation.resetTransformMatrix(this.element);\n setTimeout(() => this.destroyItself(), 300);\n }\n\n placeItself() {\n document.body.appendChild(this.element);\n }\n\n destroyItself() {\n if (!document.body.contains(this.element)) return;\n document.body.removeChild(this.element);\n }\n}\n","export default class Animation {\n static calculateFinalState(element) {\n let finals = {}\n\n const margin = 50\n const ratio = element.naturalWidth / element.naturalHeight;\n const ww = window.innerWidth - 2*margin;\n const wh = window.innerHeight - 2*margin;\n\n if (element.naturalWidth > ww) {\n finals.width = ww;\n finals.height = ww / ratio;\n if (finals.height > wh) {\n finals.height = wh;\n finals.width = wh * ratio;\n }\n } else {\n finals.width = element.offsetWidth;\n finals.height = element.offsetHeight;\n }\n\n finals.top = (wh - finals.height) / 2 + window.scrollY + margin;\n finals.left = (ww - finals.width) / 2 + window.scrollX + margin;\n\n return finals;\n }\n\n static transformMatrix(element, starts, finals) {\n // Calculate scaling factors based on width and height interpolation\n const scaleX = finals.width / starts.width;\n const scaleY = finals.height / starts.height;\n\n // Calculate the center of the starting and final positions\n const startCenterX = starts.left + starts.width / 2;\n const startCenterY = starts.top + starts.height / 2;\n const finalCenterX = finals.left + finals.width / 2;\n const finalCenterY = finals.top + finals.height / 2;\n\n const translateX = finalCenterX - startCenterX;\n const translateY = finalCenterY - startCenterY;\n\n // Apply the transform with matrix (scale + translate)\n element.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${translateX}, ${translateY})`;\n }\n\n static resetTransformMatrix(element) {\n element.style.transform = `matrix(1, 0, 0, 1, 0, 0)`;\n }\n}\n"],"names":["$e49d13fc7942bae1$export$2e2bcd8739ae039","zIndex","zIndexHidden","overlay","document","createElement","id","classList","add","style","opacity","element","body","appendChild","show","hide","$6e8e6c64a3263339$export$2e2bcd8739ae039","calculateFinalState","finals","ratio","naturalWidth","naturalHeight","ww","window","innerWidth","wh","innerHeight","width","height","offsetWidth","offsetHeight","top","scrollY","left","scrollX","transformMatrix","starts","scaleX","scaleY","startCenterX","startCenterY","finalCenterX","finalCenterY","transform","resetTransformMatrix","$2f427fc7e1c3703f$export$2e2bcd8739ae039","isOpen","image","original","create","startingState","offsetTop","offsetLeft","shadow","src","open","visibility","contains","placeItself","close","setTimeout","destroyItself","removeChild","$e220af4964903f87$export$2e2bcd8739ae039","currentImage","shadows","selector","initOverlay","initImages","initControls","addEventListener","closeCurrent","images","querySelectorAll","forEach","tagName","crypto","randomUUID","cursor","e","key","default"],"version":3,"file":"libra.min.js.map"}
\ No newline at end of file |
