Spaces:
Runtime error
Runtime error
| // A full size 'lightbox' preview modal shown when left clicking on gallery previews | |
| function closeModal() { | |
| gradioApp().getElementById("lightboxModal").style.display = "none"; | |
| } | |
| function showModal(event) { | |
| const source = event.target || event.srcElement; | |
| const modalImage = gradioApp().getElementById("modalImage") | |
| const lb = gradioApp().getElementById("lightboxModal") | |
| modalImage.src = source.src | |
| if (modalImage.style.display === 'none') { | |
| lb.style.setProperty('background-image', 'url(' + source.src + ')'); | |
| } | |
| lb.style.display = "block"; | |
| lb.focus() | |
| event.stopPropagation() | |
| } | |
| function negmod(n, m) { | |
| return ((n % m) + m) % m; | |
| } | |
| function modalImageSwitch(offset){ | |
| var allgalleryButtons = gradioApp().querySelectorAll(".gallery-item.transition-all") | |
| var galleryButtons = [] | |
| allgalleryButtons.forEach(function(elem){ | |
| if(elem.parentElement.offsetParent){ | |
| galleryButtons.push(elem); | |
| } | |
| }) | |
| if(galleryButtons.length>1){ | |
| var allcurrentButtons = gradioApp().querySelectorAll(".gallery-item.transition-all.\\!ring-2") | |
| var currentButton = null | |
| allcurrentButtons.forEach(function(elem){ | |
| if(elem.parentElement.offsetParent){ | |
| currentButton = elem; | |
| } | |
| }) | |
| var result = -1 | |
| galleryButtons.forEach(function(v, i){ if(v==currentButton) { result = i } }) | |
| if(result != -1){ | |
| nextButton = galleryButtons[negmod((result+offset),galleryButtons.length)] | |
| nextButton.click() | |
| const modalImage = gradioApp().getElementById("modalImage"); | |
| const modal = gradioApp().getElementById("lightboxModal"); | |
| modalImage.src = nextButton.children[0].src; | |
| if (modalImage.style.display === 'none') { | |
| modal.style.setProperty('background-image', `url(${modalImage.src})`) | |
| } | |
| setTimeout( function(){modal.focus()},10) | |
| } | |
| } | |
| } | |
| function modalNextImage(event){ | |
| modalImageSwitch(1) | |
| event.stopPropagation() | |
| } | |
| function modalPrevImage(event){ | |
| modalImageSwitch(-1) | |
| event.stopPropagation() | |
| } | |
| function modalKeyHandler(event){ | |
| switch (event.key) { | |
| case "ArrowLeft": | |
| modalPrevImage(event) | |
| break; | |
| case "ArrowRight": | |
| modalNextImage(event) | |
| break; | |
| case "Escape": | |
| closeModal(); | |
| break; | |
| } | |
| } | |
| function showGalleryImage(){ | |
| setTimeout(function() { | |
| fullImg_preview = gradioApp().querySelectorAll('img.w-full.object-contain') | |
| if(fullImg_preview != null){ | |
| fullImg_preview.forEach(function function_name(e) { | |
| if(e && e.parentElement.tagName == 'DIV'){ | |
| e.style.cursor='pointer' | |
| e.addEventListener('click', function (evt) { | |
| if(!opts.js_modal_lightbox) return; | |
| modalZoomSet(gradioApp().getElementById('modalImage'), opts.js_modal_lightbox_initialy_zoomed) | |
| showModal(evt) | |
| },true); | |
| } | |
| }); | |
| } | |
| }, 100); | |
| } | |
| function modalZoomSet(modalImage, enable){ | |
| if( enable ){ | |
| modalImage.classList.add('modalImageFullscreen'); | |
| } else{ | |
| modalImage.classList.remove('modalImageFullscreen'); | |
| } | |
| } | |
| function modalZoomToggle(event){ | |
| modalImage = gradioApp().getElementById("modalImage"); | |
| modalZoomSet(modalImage, !modalImage.classList.contains('modalImageFullscreen')) | |
| event.stopPropagation() | |
| } | |
| function modalTileImageToggle(event){ | |
| const modalImage = gradioApp().getElementById("modalImage"); | |
| const modal = gradioApp().getElementById("lightboxModal"); | |
| const isTiling = modalImage.style.display === 'none'; | |
| if (isTiling) { | |
| modalImage.style.display = 'block'; | |
| modal.style.setProperty('background-image', 'none') | |
| } else { | |
| modalImage.style.display = 'none'; | |
| modal.style.setProperty('background-image', `url(${modalImage.src})`) | |
| } | |
| event.stopPropagation() | |
| } | |
| function galleryImageHandler(e){ | |
| if(e && e.parentElement.tagName == 'BUTTON'){ | |
| e.onclick = showGalleryImage; | |
| } | |
| } | |
| onUiUpdate(function(){ | |
| fullImg_preview = gradioApp().querySelectorAll('img.w-full') | |
| if(fullImg_preview != null){ | |
| fullImg_preview.forEach(galleryImageHandler); | |
| } | |
| }) | |
| document.addEventListener("DOMContentLoaded", function() { | |
| const modalFragment = document.createDocumentFragment(); | |
| const modal = document.createElement('div') | |
| modal.onclick = closeModal; | |
| modal.id = "lightboxModal"; | |
| modal.tabIndex=0 | |
| modal.addEventListener('keydown', modalKeyHandler, true) | |
| const modalControls = document.createElement('div') | |
| modalControls.className = 'modalControls gradio-container'; | |
| modal.append(modalControls); | |
| const modalZoom = document.createElement('span') | |
| modalZoom.className = 'modalZoom cursor'; | |
| modalZoom.innerHTML = '⤡' | |
| modalZoom.addEventListener('click', modalZoomToggle, true) | |
| modalZoom.title = "Toggle zoomed view"; | |
| modalControls.appendChild(modalZoom) | |
| const modalTileImage = document.createElement('span') | |
| modalTileImage.className = 'modalTileImage cursor'; | |
| modalTileImage.innerHTML = '⊞' | |
| modalTileImage.addEventListener('click', modalTileImageToggle, true) | |
| modalTileImage.title = "Preview tiling"; | |
| modalControls.appendChild(modalTileImage) | |
| const modalClose = document.createElement('span') | |
| modalClose.className = 'modalClose cursor'; | |
| modalClose.innerHTML = '×' | |
| modalClose.onclick = closeModal; | |
| modalClose.title = "Close image viewer"; | |
| modalControls.appendChild(modalClose) | |
| const modalImage = document.createElement('img') | |
| modalImage.id = 'modalImage'; | |
| modalImage.onclick = closeModal; | |
| modalImage.tabIndex=0 | |
| modalImage.addEventListener('keydown', modalKeyHandler, true) | |
| modal.appendChild(modalImage) | |
| const modalPrev = document.createElement('a') | |
| modalPrev.className = 'modalPrev'; | |
| modalPrev.innerHTML = '❮' | |
| modalPrev.tabIndex=0 | |
| modalPrev.addEventListener('click',modalPrevImage,true); | |
| modalPrev.addEventListener('keydown', modalKeyHandler, true) | |
| modal.appendChild(modalPrev) | |
| const modalNext = document.createElement('a') | |
| modalNext.className = 'modalNext'; | |
| modalNext.innerHTML = '❯' | |
| modalNext.tabIndex=0 | |
| modalNext.addEventListener('click',modalNextImage,true); | |
| modalNext.addEventListener('keydown', modalKeyHandler, true) | |
| modal.appendChild(modalNext) | |
| gradioApp().getRootNode().appendChild(modal) | |
| document.body.appendChild(modalFragment); | |
| }); | |