zoomora 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoomora.umd.js","sources":["../src/zoomora.js"],"sourcesContent":["/*!\n * Zoomora Lightbox Plugin v1.0.0\n * A modern, responsive lightbox plugin with zoom, fullscreen, and gallery features\n *\n * Copyright (c) 2025 Faruk Ahmed (FrontTheme)\n * Licensed under MIT License\n */\n\n// Import styles\nimport './styles/zoomora.scss';\n\n(function (global, factory) {\n 'use strict';\n\n if (typeof module === 'object' && typeof module.exports === 'object') {\n // CommonJS/Node.js\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n // AMD\n define(factory);\n } else {\n // Browser globals\n global.Zoomora = factory();\n }\n}(typeof window !== 'undefined' ? window : this, function () {\n 'use strict';\n\n /**\n * Zoomora Lightbox Plugin\n * @class\n */\n class Zoomora {\n /**\n * Default configuration options\n * @type {Object}\n */\n static get defaults() {\n return {\n selector: '[data-zoomora]',\n showCounter: true,\n showThumbnails: true,\n showFullscreen: true,\n showZoom: true,\n transition: 'fade', // 'fade' or 'slide'\n useHref: false, // Use href instead of data-src\n maxZoomScale: 3, // Maximum zoom scale\n zoomStep: 0.1, // Zoom step for scroll wheel\n animationDuration: 300, // Animation duration in ms\n onOpen: null, // Callback when lightbox opens\n onClose: null, // Callback when lightbox closes\n onNext: null, // Callback when navigating to next item\n onPrev: null, // Callback when navigating to previous item\n\n // Auto-hide controls\n showAutoHideToggle: true, // Show auto-hide toggle button\n autoHideDelay: 3000, // Delay in ms before hiding controls\n autoHideEnabled: false, // Default state of auto-hide\n };\n }\n\n /**\n * Constructor\n * @param {Object} options - Configuration options\n */\n constructor(options = {}) {\n this.options = {...Zoomora.defaults, ...options};\n this.currentIndex = 0;\n this.items = [];\n this.isZoomed = false;\n this.isFullscreen = false;\n this.isDragging = false;\n this.thumbnailsVisible = true;\n this.startX = 0;\n this.startY = 0;\n this.currentX = 0;\n this.currentY = 0;\n this.currentScale = 1;\n this.isInitialized = false;\n this.eventListeners = new Map();\n\n // Auto-hide controls\n this.autoHideEnabled = false;\n this.autoHideTimeout = null;\n this.autoHideDelay = 3000;\n this.isControlsVisible = true;\n this.idleTimer = null;\n\n // Bound methods for event listeners\n this.boundMethods = {\n handleDocumentClick: this.handleDocumentClick.bind(this),\n handleKeydown: this.handleKeydown.bind(this),\n handleFullscreenChange: this.handleFullscreenChange.bind(this),\n handleZoomoraClick: this.handleZoomoraClick.bind(this),\n handleContentClick: this.handleContentClick.bind(this),\n handleMouseDown: this.handleMouseDown.bind(this),\n handleMouseMove: this.handleMouseMove.bind(this),\n handleMouseUp: this.handleMouseUp.bind(this),\n handleTouchStart: this.handleTouchStart.bind(this),\n handleTouchMove: this.handleTouchMove.bind(this),\n handleTouchEnd: this.handleTouchEnd.bind(this),\n };\n\n this.init();\n }\n\n /**\n * Initialize the plugin\n */\n init() {\n if (this.isInitialized) {\n console.warn('Zoomora: Plugin already initialized');\n return;\n }\n\n try {\n this.createLightbox();\n this.bindEvents();\n\n this.isInitialized = true;\n } catch (error) {\n console.error('Zoomora: Initialization failed', error);\n }\n }\n\n /**\n * Static method to bind to anchor tags with href\n * @param {string} selector - CSS selector\n * @param {Object} options - Configuration options\n * @returns {Zoomora} - New Zoomora instance\n */\n static bind(selector, options = {}) {\n const enhancedOptions = {\n ...options,\n selector: selector,\n useHref: true\n };\n return new Zoomora(enhancedOptions);\n }\n\n /**\n * Create lightbox HTML structure\n */\n createLightbox() {\n // Check if lightbox already exists\n if (document.getElementById('zoomoraLightbox')) {\n console.warn('Zoomora: Lightbox already exists in DOM');\n return;\n }\n\n const zoomoraHTML = `\n <div class=\"zoomora\" id=\"zoomoraLightbox\">\n <div class=\"zoomora-container\">\n <div class=\"zoomora-header\" id=\"zoomoraHeader\">\n <div class=\"zoomora-counter\" id=\"zoomoraCounter\">1 / 1</div>\n <div class=\"zoomora-controls\">\n <button class=\"zoomora-btn\" id=\"zoomoraThumbnailBtn\" title=\"Toggle Thumbnails\">\n <i class=\"zoomorai-thumbnails\"></i>\n </button>\n <button class=\"zoomora-btn\" id=\"zoomoraAutoHideBtn\" title=\"Toggle Auto-Hide Controls\">\n <i class=\"zoomorai-controls-off\"></i>\n </button>\n <button class=\"zoomora-btn\" id=\"zoomoraZoomBtn\" title=\"Zoom\">\n <i class=\"zoomorai-zoom\"></i>\n </button>\n <button class=\"zoomora-btn\" id=\"zoomoraFullscreenBtn\" title=\"Fullscreen\">\n <i class=\"zoomorai-expand\"></i>\n </button>\n <button class=\"zoomora-btn\" id=\"zoomoraCollapseBtn\" title=\"Exit Fullscreen\" style=\"display: none;\">\n <i class=\"zoomorai-collapse\"></i>\n </button>\n <button class=\"zoomora-btn\" id=\"zoomoraCloseBtn\" title=\"Close\">\n <i class=\"zoomorai-close\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"zoomora-content\" id=\"zoomoraContent\">\n <div class=\"zoomora-loading\" id=\"zoomoraLoading\"></div>\n <div class=\"zoomora-slides-container\" id=\"zoomoraSlidesContainer\"></div>\n </div>\n \n <button class=\"zoomora-nav prev\" id=\"zoomoraPrevBtn\">\n <i class=\"zoomorai-arrow-left\"></i>\n </button>\n <button class=\"zoomora-nav next\" id=\"zoomoraNextBtn\">\n <i class=\"zoomorai-arrow-right\"></i>\n </button>\n \n <div class=\"zoomora-caption\" id=\"zoomoraCaption\"></div>\n <div class=\"zoomora-thumbnails\" id=\"zoomoraThumbs\"></div>\n </div>\n </div>\n `;\n\n document.body.insertAdjacentHTML('beforeend', zoomoraHTML);\n\n // Cache DOM elements\n this.zoomora = document.getElementById('zoomoraLightbox');\n this.header = document.getElementById('zoomoraHeader');\n this.content = document.getElementById('zoomoraContent');\n this.slidesContainer = document.getElementById('zoomoraSlidesContainer');\n this.counter = document.getElementById('zoomoraCounter');\n this.thumbs = document.getElementById('zoomoraThumbs');\n this.loading = document.getElementById('zoomoraLoading');\n this.caption = document.getElementById('zoomoraCaption');\n this.prevBtn = document.getElementById('zoomoraPrevBtn');\n this.nextBtn = document.getElementById('zoomoraNextBtn');\n\n // Verify all elements were created\n if (!this.zoomora || !this.content || !this.counter || !this.thumbs || !this.loading || !this.caption) {\n throw new Error('Failed to create required DOM elements');\n }\n }\n\n /**\n * Bind event listeners\n */\n bindEvents() {\n // Document click handler for opening lightbox\n this.addEventListener(document, 'click', this.boundMethods.handleDocumentClick);\n\n // Control button handlers\n this.addEventListener(document.getElementById('zoomoraCloseBtn'), 'click', () => this.close());\n this.addEventListener(document.getElementById('zoomoraPrevBtn'), 'click', () => this.prev());\n this.addEventListener(document.getElementById('zoomoraNextBtn'), 'click', () => this.next());\n this.addEventListener(document.getElementById('zoomoraZoomBtn'), 'click', () => this.toggleZoom());\n this.addEventListener(document.getElementById('zoomoraFullscreenBtn'), 'click', () => this.toggleFullscreen());\n this.addEventListener(document.getElementById('zoomoraCollapseBtn'), 'click', () => this.exitFullscreen());\n this.addEventListener(document.getElementById('zoomoraThumbnailBtn'), 'click', () => this.toggleThumbnails());\n\n // Fullscreen change events\n this.addEventListener(document, 'fullscreenchange', this.boundMethods.handleFullscreenChange);\n this.addEventListener(document, 'webkitfullscreenchange', this.boundMethods.handleFullscreenChange);\n this.addEventListener(document, 'mozfullscreenchange', this.boundMethods.handleFullscreenChange);\n this.addEventListener(document, 'MSFullscreenChange', this.boundMethods.handleFullscreenChange);\n\n // Keyboard navigation\n this.addEventListener(document, 'keydown', this.boundMethods.handleKeydown);\n\n // Lightbox click to close\n this.addEventListener(this.zoomora, 'click', this.boundMethods.handleZoomoraClick);\n\n // Content click for zoom toggle\n this.addEventListener(this.content, 'click', this.boundMethods.handleContentClick);\n\n // Mouse drag events\n this.addEventListener(this.content, 'mousedown', this.boundMethods.handleMouseDown);\n this.addEventListener(this.content, 'mousemove', this.boundMethods.handleMouseMove);\n this.addEventListener(this.content, 'mouseup', this.boundMethods.handleMouseUp);\n this.addEventListener(this.content, 'mouseleave', this.boundMethods.handleMouseUp);\n\n // Touch events\n this.addEventListener(this.content, 'touchstart', this.boundMethods.handleTouchStart, {passive: false});\n this.addEventListener(this.content, 'touchmove', this.boundMethods.handleTouchMove, {passive: false});\n this.addEventListener(this.content, 'touchend', this.boundMethods.handleTouchEnd);\n\n // Add auto-hide toggle button handler\n this.addEventListener(document.getElementById('zoomoraAutoHideBtn'), 'click', () => this.toggleAutoHide());\n\n // Add mouse/touch activity listeners for auto-hide\n this.addEventListener(this.zoomora, 'mousemove', () => this.handleUserActivity());\n this.addEventListener(this.zoomora, 'touchstart', () => this.handleUserActivity());\n this.addEventListener(this.zoomora, 'keydown', () => this.handleUserActivity());\n }\n\n /**\n * Add event listener with cleanup tracking\n * @param {Element} element - DOM element\n * @param {string} event - Event type\n * @param {Function} handler - Event handler\n * @param {Object} options - Event options\n */\n addEventListener(element, event, handler, options = {}) {\n if (!element) return;\n\n element.addEventListener(event, handler, options);\n\n // Track for cleanup\n const key = `${element.constructor.name}_${event}`;\n if (!this.eventListeners.has(key)) {\n this.eventListeners.set(key, []);\n }\n this.eventListeners.get(key).push({element, event, handler, options});\n }\n\n /**\n * Handle document click events\n * @param {Event} e - Click event\n */\n handleDocumentClick(e) {\n const target = e.target.closest(this.options.selector);\n if (target) {\n e.preventDefault();\n this.open(target);\n }\n }\n\n /**\n * Handle keyboard events\n * @param {KeyboardEvent} e - Keyboard event\n */\n handleKeydown(e) {\n if (!this.zoomora.classList.contains('active')) return;\n\n switch (e.key) {\n case 'Escape':\n if (this.isFullscreen) {\n this.exitFullscreen();\n } else {\n this.close();\n }\n break;\n case 'ArrowLeft':\n this.prev();\n break;\n case 'ArrowRight':\n this.next();\n break;\n case 'z':\n case 'Z':\n this.toggleZoom();\n break;\n case 'f':\n case 'F':\n this.toggleFullscreen();\n break;\n case 't':\n case 'T':\n this.toggleThumbnails();\n break;\n }\n }\n\n /**\n * Handle fullscreen change events\n */\n handleFullscreenChange() {\n const isInFullscreen = document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n\n if (!isInFullscreen && this.isFullscreen) {\n this.isFullscreen = false;\n this.zoomora.classList.remove('fullscreen');\n this.updateButtons();\n }\n }\n\n /**\n * Handle zoomora container clicks\n * @param {Event} e - Click event\n */\n handleZoomoraClick(e) {\n if (e.target === this.zoomora) {\n this.close();\n }\n }\n\n /**\n * Handle content clicks\n * @param {Event} e - Click event\n */\n handleContentClick(e) {\n const media = e.target.closest('.zoomora-media');\n if (media && !media.classList.contains('no-zoom') && !this.isDragging) {\n this.toggleZoom();\n }\n }\n\n /**\n * Handle mouse down events\n * @param {MouseEvent} e - Mouse event\n */\n handleMouseDown(e) {\n this.startDrag(e);\n }\n\n /**\n * Handle mouse move events\n * @param {MouseEvent} e - Mouse event\n */\n handleMouseMove(e) {\n this.drag(e);\n }\n\n /**\n * Handle mouse up events\n */\n handleMouseUp() {\n this.endDrag();\n }\n\n /**\n * Handle touch start events\n * @param {TouchEvent} e - Touch event\n */\n handleTouchStart(e) {\n this.startDrag(e);\n }\n\n /**\n * Handle touch move events\n * @param {TouchEvent} e - Touch event\n */\n handleTouchMove(e) {\n this.drag(e);\n }\n\n /**\n * Handle touch end events\n */\n handleTouchEnd() {\n this.endDrag();\n }\n\n /**\n * Get image source from element\n * @param {Element} item - DOM element\n * @returns {string} - Image source URL\n */\n getImageSource(item) {\n const src = item.dataset.src || item.src || item.getAttribute('src');\n const type = item.dataset.type || 'image';\n\n // Handle YouTube URLs for video types\n if (type === 'video' && src) {\n return this.convertToEmbedUrl(src);\n }\n\n return src;\n }\n\n /**\n * Convert YouTube URLs to embed format\n * @param url\n * @returns {*|string}\n */\n convertToEmbedUrl(url) {\n // If already an embed URL, return as is\n if (url.includes('youtube.com/embed/')) {\n return url;\n }\n\n // Handle different YouTube URL formats\n let videoId = null;\n let startTime = null;\n\n // Extract video ID and start time from different YouTube URL formats\n if (url.includes('youtube.com/watch')) {\n const urlParams = new URLSearchParams(url.split('?')[1]);\n videoId = urlParams.get('v');\n const t = urlParams.get('t');\n if (t) {\n // Convert time format (e.g., \"111s\" to seconds)\n startTime = t.replace('s', '');\n }\n } else if (url.includes('youtu.be/')) {\n const parts = url.split('/');\n const videoAndParams = parts[parts.length - 1];\n if (videoAndParams.includes('?')) {\n videoId = videoAndParams.split('?')[0];\n const urlParams = new URLSearchParams(videoAndParams.split('?')[1]);\n const t = urlParams.get('t');\n if (t) startTime = t.replace('s', '');\n } else {\n videoId = videoAndParams;\n }\n }\n\n if (videoId) {\n let embedUrl = `https://www.youtube.com/embed/${videoId}`;\n const params = new URLSearchParams();\n\n if (startTime) {\n params.append('start', startTime);\n }\n\n // Add other useful parameters\n params.append('rel', '0'); // Don't show related videos\n params.append('modestbranding', '1'); // Modest branding\n\n // Option: Add autoplay for YouTube videos (uncomment if desired)\n // params.append('autoplay', '1');\n\n if (params.toString()) {\n embedUrl += '?' + params.toString();\n }\n\n return embedUrl;\n }\n\n // If not a YouTube URL or couldn't parse, return original\n return url;\n }\n\n /**\n * Get thumbnail source from element\n * @param {Element} item - DOM element\n * @returns {string} - Thumbnail source URL\n */\n getThumbnailSource(item) {\n const type = item.dataset.type || 'image';\n\n // For video items, always use the img.src as thumbnail (poster image)\n if (type === 'video') {\n return item.src || item.getAttribute('src');\n }\n\n // For regular images, use data-src or fallback to src\n return item.dataset.src || item.src || item.getAttribute('src');\n }\n\n /**\n * Get group identifier from element\n * @param {Element} element - DOM element\n * @returns {string} - Group identifier\n */\n getGroup(element) {\n if (this.options.useHref) {\n return element.dataset.lightbox || element.dataset.gallery || 'default';\n }\n return element.dataset.zoomora || 'default';\n }\n\n /**\n * Open lightbox with specified element\n * @param {Element} element - DOM element to open\n */\n open(element) {\n if (!element) return;\n\n const group = this.getGroup(element);\n let groupSelector;\n\n if (this.options.useHref) {\n if (element.dataset.lightbox) {\n groupSelector = `[data-lightbox=\"${group}\"]`;\n } else if (element.dataset.gallery) {\n groupSelector = `[data-gallery=\"${group}\"]`;\n } else {\n groupSelector = this.options.selector;\n }\n } else {\n groupSelector = `[data-zoomora=\"${group}\"]`;\n }\n\n this.items = Array.from(document.querySelectorAll(groupSelector));\n this.currentIndex = Math.max(0, this.items.indexOf(element));\n\n // Reset states\n this.isZoomed = false;\n this.isFullscreen = false;\n this.thumbnailsVisible = true;\n this.currentX = 0;\n this.currentY = 0;\n this.currentScale = 1;\n\n this.zoomora.classList.add('active');\n document.body.style.overflow = 'hidden';\n\n this.loadContent();\n this.updateThumbnails();\n this.updateCounter();\n this.updateNavigation();\n this.updateCaption();\n this.updateButtons();\n\n // Initialize auto-hide if enabled\n if (this.autoHideEnabled) {\n this.startAutoHideTimer();\n } else {\n this.showControls();\n }\n\n // Trigger callback\n if (typeof this.options.onOpen === 'function') {\n this.options.onOpen(element, this.currentIndex);\n }\n }\n\n /**\n * Close lightbox\n */\n close() {\n if (this.isFullscreen) {\n this.exitFullscreen();\n }\n\n this.zoomora.classList.remove('active');\n document.body.style.overflow = '';\n this.isZoomed = false;\n this.isFullscreen = false;\n this.currentX = 0;\n this.currentY = 0;\n this.currentScale = 1;\n\n const media = this.content.querySelector('.zoomora-media');\n if (media) {\n media.classList.remove('zoomed');\n media.style.transform = '';\n media.style.cursor = '';\n }\n\n this.zoomora.classList.remove('fullscreen');\n this.updateButtons();\n\n // Clean up auto-hide\n this.stopAutoHideTimer();\n this.showControls();\n\n // Trigger callback\n if (typeof this.options.onClose === 'function') {\n this.options.onClose(this.currentIndex);\n }\n }\n\n /**\n * Navigate to previous item\n */\n prev() {\n if (this.currentIndex > 0) {\n this.currentIndex--;\n this.loadContent();\n this.updateCounter();\n this.updateThumbnails();\n this.updateNavigation();\n this.updateCaption();\n\n // Trigger callback\n if (typeof this.options.onPrev === 'function') {\n this.options.onPrev(this.currentIndex);\n }\n }\n }\n\n /**\n * Navigate to next item\n */\n next() {\n if (this.currentIndex < this.items.length - 1) {\n this.currentIndex++;\n this.loadContent();\n this.updateCounter();\n this.updateThumbnails();\n this.updateNavigation();\n this.updateCaption();\n\n // Trigger callback\n if (typeof this.options.onNext === 'function') {\n this.options.onNext(this.currentIndex);\n }\n }\n }\n\n /**\n * Load content for current item\n */\n loadContent() {\n if (!this.items[this.currentIndex]) return;\n\n const item = this.items[this.currentIndex];\n const src = this.getImageSource(item);\n const type = item.dataset.type || 'image';\n\n if (!src) {\n console.error('Zoomora: No source found for item');\n return;\n }\n\n // Show loading spinner\n this.loading.style.display = 'block';\n\n // Clear content but keep the loading reference intact\n // Don't replace innerHTML, just clear the slides\n if (this.slidesContainer) {\n this.slidesContainer.innerHTML = '';\n }\n\n // Add slight delay for smooth transition\n setTimeout(() => {\n this.renderContent(src, type, item);\n }, 100);\n }\n\n /**\n * Render content based on type\n * @param {string} src - Source URL\n * @param {string} type - Content type\n * @param {Element} item - Original item element\n */\n renderContent(src, type, item) {\n const slideContainer = document.createElement('div');\n slideContainer.className = 'zoomora-slide-container';\n\n // Create slide wrapper\n const slide = document.createElement('div');\n slide.className = `zoomora-slide ${this.options.transition === 'slide' ? 'slide-effect' : 'fade-effect'}`;\n slide.style.opacity = '0';\n slide.style.transform = this.options.transition === 'slide' ? 'translateX(100%)' : 'scale(0.8)';\n\n let mediaElement;\n\n try {\n switch (type) {\n case 'video':\n if (src.endsWith('.mp4') || src.endsWith('.webm') || src.endsWith('.ogg')) {\n const videoContainer = document.createElement('div');\n videoContainer.className = 'zoomora-video-container';\n\n mediaElement = document.createElement('video');\n mediaElement.src = src;\n mediaElement.className = 'zoomora-video';\n mediaElement.setAttribute('preload', 'metadata');\n\n const posterSrc = item.src || item.getAttribute('src');\n if (posterSrc) {\n mediaElement.setAttribute('poster', posterSrc);\n }\n\n const playButton = document.createElement('div');\n playButton.className = 'zoomora-play-button';\n playButton.innerHTML = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M8 5v14l11-7z\"/></svg>`;\n\n playButton.addEventListener('click', () => {\n mediaElement.play();\n playButton.style.display = 'none';\n mediaElement.setAttribute('controls', '');\n });\n\n mediaElement.addEventListener('ended', () => {\n playButton.style.display = 'flex';\n });\n\n videoContainer.appendChild(mediaElement);\n videoContainer.appendChild(playButton);\n slideContainer.appendChild(videoContainer);\n } else {\n mediaElement = document.createElement('iframe');\n mediaElement.src = src;\n mediaElement.className = 'zoomora-video';\n mediaElement.setAttribute('allowfullscreen', '');\n mediaElement.setAttribute('frameborder', '0');\n slideContainer.appendChild(mediaElement);\n }\n break;\n\n case 'iframe':\n mediaElement = document.createElement('iframe');\n mediaElement.src = src;\n mediaElement.className = 'zoomora-iframe';\n mediaElement.setAttribute('frameborder', '0');\n slideContainer.appendChild(mediaElement);\n break;\n\n default:\n mediaElement = document.createElement('img');\n mediaElement.src = src;\n mediaElement.className = 'zoomora-media';\n mediaElement.alt = item.alt || item.title || '';\n\n mediaElement.onload = () => {\n this.loading.style.display = 'none';\n this.checkZoomability(mediaElement);\n this.animateSlideIn(slide);\n };\n\n mediaElement.onerror = () => {\n this.loading.style.display = 'none';\n console.error('Zoomora: Failed to load image:', src);\n this.animateSlideIn(slide);\n };\n\n slideContainer.appendChild(mediaElement);\n }\n\n slide.appendChild(slideContainer);\n\n // Clear existing slides and add new one\n this.slidesContainer.innerHTML = '';\n this.slidesContainer.appendChild(slide);\n\n if (type !== 'image') {\n this.loading.style.display = 'none';\n this.animateSlideIn(slide);\n }\n\n } catch (error) {\n console.error('Zoomora: Error rendering content:', error);\n this.loading.style.display = 'none';\n }\n }\n\n // Animation helper\n animateSlideIn(slide) {\n // Force reflow\n slide.offsetHeight;\n\n // Add active class and animate\n slide.classList.add('active');\n\n if (this.options.transition === 'slide') {\n slide.style.transition = `transform ${this.options.animationDuration}ms ease, opacity ${this.options.animationDuration}ms ease`;\n slide.style.transform = 'translateX(0)';\n slide.style.opacity = '1';\n } else {\n slide.style.transition = `transform ${this.options.animationDuration}ms ease, opacity ${this.options.animationDuration}ms ease`;\n slide.style.transform = 'scale(1)';\n slide.style.opacity = '1';\n }\n }\n\n // Toggle auto-hide controls\n toggleAutoHide() {\n this.autoHideEnabled = !this.autoHideEnabled;\n const autoHideBtn = document.getElementById('zoomoraAutoHideBtn');\n\n if (this.autoHideEnabled) {\n autoHideBtn.classList.add('active');\n autoHideBtn.title = 'Disable Auto-Hide Controls';\n this.startAutoHideTimer();\n } else {\n autoHideBtn.classList.remove('active');\n autoHideBtn.title = 'Enable Auto-Hide Controls';\n this.stopAutoHideTimer();\n this.showControls();\n }\n }\n\n // Handle user activity\n handleUserActivity() {\n if (!this.autoHideEnabled) return;\n\n this.showControls();\n this.startAutoHideTimer();\n }\n\n // Start auto-hide timer\n startAutoHideTimer() {\n this.stopAutoHideTimer();\n\n this.autoHideTimeout = setTimeout(() => {\n this.hideControls();\n }, this.options.autoHideDelay);\n }\n\n // Stop auto-hide timer\n stopAutoHideTimer() {\n if (this.autoHideTimeout) {\n clearTimeout(this.autoHideTimeout);\n this.autoHideTimeout = null;\n }\n }\n\n // Show controls\n showControls() {\n if (this.isControlsVisible) return;\n\n this.isControlsVisible = true;\n this.zoomora.classList.remove('controls-hidden');\n\n // Animate controls back in\n if (this.header) {\n this.header.style.transform = 'translateY(0)';\n this.header.style.opacity = '1';\n }\n\n if (this.caption) {\n this.caption.style.transform = 'translateX(-50%) translateY(0)';\n this.caption.style.opacity = '1';\n }\n\n if (this.thumbs) {\n this.thumbs.style.transform = 'translateX(-50%) translateY(0)';\n this.thumbs.style.opacity = '1';\n }\n\n if (this.prevBtn) {\n this.prevBtn.style.transform = 'translateX(0)';\n this.prevBtn.style.opacity = '1';\n }\n\n if (this.nextBtn) {\n this.nextBtn.style.transform = 'translateX(0)';\n this.nextBtn.style.opacity = '1';\n }\n }\n\n // Hide controls\n hideControls() {\n if (!this.isControlsVisible) return;\n\n this.isControlsVisible = false;\n this.zoomora.classList.add('controls-hidden');\n\n // Animate controls out\n if (this.header) {\n this.header.style.transform = 'translateY(-100%)';\n this.header.style.opacity = '0';\n }\n\n if (this.caption) {\n this.caption.style.transform = 'translateX(-50%) translateY(100%)';\n this.caption.style.opacity = '0';\n }\n\n if (this.thumbs) {\n this.thumbs.style.transform = 'translateX(-50%) translateY(100%)';\n this.thumbs.style.opacity = '0';\n }\n\n if (this.prevBtn) {\n this.prevBtn.style.transform = 'translateX(-100%)';\n this.prevBtn.style.opacity = '0';\n }\n\n if (this.nextBtn) {\n this.nextBtn.style.transform = 'translateX(100%)';\n this.nextBtn.style.opacity = '0';\n }\n }\n\n /**\n * Check if image can be zoomed\n * @param {HTMLImageElement} img - Image element\n */\n checkZoomability(img) {\n if (!img || !img.naturalWidth || !img.naturalHeight) return;\n\n const imgRect = img.getBoundingClientRect();\n const renderedWidth = imgRect.width;\n const renderedHeight = imgRect.height;\n const naturalWidth = img.naturalWidth;\n const naturalHeight = img.naturalHeight;\n\n const isScaledDown = naturalWidth > renderedWidth || naturalHeight > renderedHeight;\n const zoomRatioX = naturalWidth / renderedWidth;\n const zoomRatioY = naturalHeight / renderedHeight;\n const maxZoomRatio = Math.max(zoomRatioX, zoomRatioY);\n\n // Store zoom info\n img.dataset.zoomRatio = maxZoomRatio;\n img.dataset.naturalWidth = naturalWidth;\n img.dataset.naturalHeight = naturalHeight;\n img.dataset.renderedWidth = renderedWidth;\n img.dataset.renderedHeight = renderedHeight;\n\n // Enable zoom if significantly scaled down\n if (isScaledDown && maxZoomRatio > 1.1) {\n img.classList.remove('no-zoom');\n } else {\n img.classList.add('no-zoom');\n }\n }\n\n /**\n * Update counter display\n */\n updateCounter() {\n if (this.options.showCounter && this.counter) {\n this.counter.textContent = `${this.currentIndex + 1} / ${this.items.length}`;\n }\n }\n\n /**\n * Update caption display\n */\n updateCaption() {\n if (!this.caption || !this.items[this.currentIndex]) return;\n\n const item = this.items[this.currentIndex];\n const caption = item.dataset.caption || item.title || '';\n\n if (caption) {\n this.caption.textContent = caption;\n this.caption.style.transform = 'translateX(-50%) translateY(0)';\n this.caption.style.opacity = '1';\n this.caption.style.pointerEvents = 'auto';\n this.caption.style.transition = 'opacity 0.3s ease, transform 0.3s ease';\n } else {\n this.caption.style.transform = 'translateX(-50%) translateY(100%)';\n this.caption.style.opacity = '0';\n this.caption.style.pointerEvents = 'none';\n this.caption.style.transition = 'opacity 0.3s ease, transform 0.3s ease';\n }\n }\n\n /**\n * Update thumbnails display\n */\n updateThumbnails() {\n if (!this.options.showThumbnails || !this.thumbs) return;\n\n if (this.items.length === 1) {\n this.caption.classList.add('single-item-thumbnail');\n this.thumbs.style.display = 'none';\n return;\n }\n\n this.caption.classList.remove('single-item-thumbnail');\n\n this.thumbs.style.display = 'flex';\n this.thumbs.innerHTML = '';\n\n this.items.forEach((item, index) => {\n const thumb = document.createElement('div');\n thumb.className = 'zoomora-thumb';\n if (index === this.currentIndex) thumb.classList.add('active');\n\n const img = document.createElement('img');\n const thumbSrc = this.getThumbnailSource(item);\n\n if (thumbSrc) {\n img.src = thumbSrc;\n img.alt = item.alt || item.title || '';\n img.onerror = () => {\n thumb.style.display = 'none';\n };\n }\n\n thumb.appendChild(img);\n\n thumb.addEventListener('click', () => {\n this.currentIndex = index;\n this.loadContent();\n this.updateCounter();\n this.updateThumbnails();\n this.updateNavigation();\n this.updateCaption();\n });\n\n this.thumbs.appendChild(thumb);\n });\n }\n\n /**\n * Update navigation buttons\n */\n updateNavigation() {\n const prevBtn = document.getElementById('zoomoraPrevBtn');\n const nextBtn = document.getElementById('zoomoraNextBtn');\n\n if (prevBtn) {\n prevBtn.style.display = this.currentIndex > 0 ? 'flex' : 'none';\n }\n if (nextBtn) {\n nextBtn.style.display = this.currentIndex < this.items.length - 1 ? 'flex' : 'none';\n }\n }\n\n /**\n * Update control buttons\n */\n updateButtons() {\n const fullscreenBtn = document.getElementById('zoomoraFullscreenBtn');\n const collapseBtn = document.getElementById('zoomoraCollapseBtn');\n\n if (fullscreenBtn && collapseBtn) {\n if (this.isFullscreen) {\n fullscreenBtn.style.display = 'none';\n collapseBtn.style.display = 'flex';\n } else {\n fullscreenBtn.style.display = 'flex';\n collapseBtn.style.display = 'none';\n }\n }\n }\n\n /**\n * Toggle zoom state\n */\n toggleZoom() {\n const media = this.content.querySelector('.zoomora-media');\n if (!media || media.tagName !== 'IMG' || media.classList.contains('no-zoom')) return;\n\n this.isZoomed = !this.isZoomed;\n media.classList.toggle('zoomed', this.isZoomed);\n\n if (this.isZoomed) {\n const zoomRatio = parseFloat(media.dataset.zoomRatio) || 2;\n let zoomScale = Math.min(zoomRatio, this.options.maxZoomScale);\n\n if (zoomRatio > 2.5) {\n zoomScale = Math.min(zoomRatio * 0.7, 2.5);\n }\n\n media.style.transform = `scale(${zoomScale})`;\n media.style.cursor = 'grab';\n media.dataset.currentZoomScale = zoomScale;\n this.currentScale = zoomScale;\n } else {\n media.style.transform = '';\n media.style.cursor = '';\n this.currentX = 0;\n this.currentY = 0;\n this.currentScale = 1;\n }\n }\n\n /**\n * Toggle fullscreen mode\n */\n toggleFullscreen() {\n if (!this.isFullscreen) {\n this.enterFullscreen();\n } else {\n this.exitFullscreen();\n }\n }\n\n /**\n * Enter fullscreen mode\n */\n enterFullscreen() {\n const element = this.zoomora;\n const requestFullscreen = element.requestFullscreen ||\n element.webkitRequestFullscreen ||\n element.mozRequestFullScreen ||\n element.msRequestFullscreen;\n\n if (requestFullscreen) {\n requestFullscreen.call(element).then(() => {\n this.isFullscreen = true;\n this.zoomora.classList.add('fullscreen');\n this.updateButtons();\n }).catch(err => {\n console.warn('Zoomora: Could not enter fullscreen:', err);\n this.fallbackFullscreen();\n });\n } else {\n this.fallbackFullscreen();\n }\n }\n\n /**\n * Exit fullscreen mode\n */\n exitFullscreen() {\n const isInFullscreen = document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n\n if (isInFullscreen) {\n const exitFullscreen = document.exitFullscreen ||\n document.webkitExitFullscreen ||\n document.mozCancelFullScreen ||\n document.msExitFullscreen;\n\n if (exitFullscreen) {\n exitFullscreen.call(document).then(() => {\n this.isFullscreen = false;\n this.zoomora.classList.remove('fullscreen');\n this.updateButtons();\n }).catch(err => {\n console.warn('Zoomora: Could not exit fullscreen:', err);\n this.fallbackExitFullscreen();\n });\n } else {\n this.fallbackExitFullscreen();\n }\n } else {\n this.fallbackExitFullscreen();\n }\n }\n\n /**\n * Fallback fullscreen using CSS\n */\n fallbackFullscreen() {\n this.isFullscreen = true;\n this.zoomora.classList.add('fullscreen');\n this.updateButtons();\n }\n\n /**\n * Exit CSS fullscreen\n */\n fallbackExitFullscreen() {\n this.isFullscreen = false;\n this.zoomora.classList.remove('fullscreen');\n this.updateButtons();\n }\n\n /**\n * Toggle thumbnails visibility\n */\n toggleThumbnails() {\n if (this.items.length === 1) return;\n\n this.thumbnailsVisible = !this.thumbnailsVisible;\n if (this.thumbs) {\n this.thumbs.classList.toggle('thumbs-hidden', !this.thumbnailsVisible);\n\n if (!this.caption || !this.items[this.currentIndex]) return;\n\n const item = this.items[this.currentIndex];\n const caption = item.dataset.caption || item.title || '';\n\n if (caption && this.thumbs.classList.contains('thumbs-hidden')) {\n this.caption.style.bottom = '20px';\n this.caption.style.transition = 'bottom 0.3s ease, transform 0.3s ease';\n } else {\n this.caption.style.bottom = '120px';\n }\n }\n }\n\n /**\n * Start drag operation\n * @param {Event} e - Mouse or touch event\n */\n startDrag(e) {\n const media = this.content.querySelector('.zoomora-media');\n if (!media || !this.isZoomed) return;\n\n this.isDragging = true;\n media.style.cursor = 'grabbing';\n\n this.startX = e.clientX || (e.touches && e.touches[0].clientX) || 0;\n this.startY = e.clientY || (e.touches && e.touches[0].clientY) || 0;\n\n // Parse current transform\n const transform = media.style.transform;\n const scaleMatch = transform.match(/scale\\(([^)]+)\\)/);\n const translateMatch = transform.match(/translate\\(([^,]+),\\s*([^)]+)\\)/);\n\n this.currentScale = scaleMatch ? parseFloat(scaleMatch[1]) : 1;\n this.currentX = translateMatch ? parseFloat(translateMatch[1]) : 0;\n this.currentY = translateMatch ? parseFloat(translateMatch[2]) : 0;\n\n e.preventDefault();\n }\n\n /**\n * Handle drag movement\n * @param {Event} e - Mouse or touch event\n */\n drag(e) {\n if (!this.isDragging) return;\n\n e.preventDefault();\n const clientX = e.clientX || (e.touches && e.touches[0].clientX) || 0;\n const clientY = e.clientY || (e.touches && e.touches[0].clientY) || 0;\n\n const deltaX = clientX - this.startX;\n const deltaY = clientY - this.startY;\n\n const newX = this.currentX + deltaX;\n const newY = this.currentY + deltaY;\n\n const media = this.content.querySelector('.zoomora-media');\n if (!media) return;\n\n const mediaRect = media.getBoundingClientRect();\n const scale = this.currentScale;\n const maxX = (mediaRect.width * (scale - 1)) / 2;\n const maxY = (mediaRect.height * (scale - 1)) / 2;\n\n const constrainedX = Math.max(-maxX, Math.min(maxX, newX));\n const constrainedY = Math.max(-maxY, Math.min(maxY, newY));\n\n media.style.transform = `scale(${scale}) translate(${constrainedX}px, ${constrainedY}px)`;\n }\n\n /**\n * End drag operation\n */\n endDrag() {\n if (!this.isDragging) return;\n\n this.isDragging = false;\n const media = this.content.querySelector('.zoomora-media');\n if (media && this.isZoomed) {\n media.style.cursor = 'grab';\n }\n }\n\n /**\n * Go to specific item by index\n * @param {number} index - Item index\n */\n goTo(index) {\n if (index < 0 || index >= this.items.length) return;\n\n this.currentIndex = index;\n this.loadContent();\n this.updateCounter();\n this.updateThumbnails();\n this.updateNavigation();\n this.updateCaption();\n }\n\n /**\n * Get current item index\n * @returns {number} - Current index\n */\n getCurrentIndex() {\n return this.currentIndex;\n }\n\n /**\n * Get total number of items\n * @returns {number} - Total items\n */\n getTotalItems() {\n return this.items.length;\n }\n\n /**\n * Check if lightbox is open\n * @returns {boolean} - True if open\n */\n isOpen() {\n return this.zoomora && this.zoomora.classList.contains('active');\n }\n\n /**\n * Update options\n * @param {Object} newOptions - New options to merge\n */\n updateOptions(newOptions) {\n this.options = {...this.options, ...newOptions};\n }\n\n /**\n * Refresh the lightbox (re-scan for items)\n */\n refresh() {\n if (this.isOpen()) {\n const currentItem = this.items[this.currentIndex];\n if (currentItem) {\n this.open(currentItem);\n }\n }\n }\n\n /**\n * Destroy the lightbox instance\n */\n destroy() {\n if (!this.isInitialized) return;\n\n // Close if open\n if (this.isOpen()) {\n this.close();\n }\n\n // Clean up auto-hide\n this.stopAutoHideTimer();\n\n // Remove all event listeners\n this.eventListeners.forEach((listeners, key) => {\n listeners.forEach(({element, event, handler, options}) => {\n if (element && element.removeEventListener) {\n element.removeEventListener(event, handler, options);\n }\n });\n });\n this.eventListeners.clear();\n\n // Remove DOM elements\n if (this.zoomora && this.zoomora.parentNode) {\n this.zoomora.parentNode.removeChild(this.zoomora);\n }\n\n // Reset properties\n this.isInitialized = false;\n this.items = [];\n this.currentIndex = 0;\n this.zoomora = null;\n this.content = null;\n this.counter = null;\n this.thumbs = null;\n this.loading = null;\n this.caption = null;\n }\n }\n\n // Export the class\n return Zoomora;\n}));"],"names":["this"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ !function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";var t,e,s=Object.defineProperty,o=Object.defineProperties,i=Object.getOwnPropertyDescriptors,n=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable,l=(t,e,o)=>e in t?s(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,h=(t,e)=>{for(var s in e||(e={}))a.call(e,s)&&l(t,s,e[s]);if(n)for(var s of n(e))r.call(e,s)&&l(t,s,e[s]);return t};
2
+ /*!
3
+ * Zoomora Lightbox Plugin v1.0.0
4
+ * A modern, responsive lightbox plugin with zoom, fullscreen, and gallery features
5
+ *
6
+ * Copyright (c) 2025 Faruk Ahmed (FrontTheme)
7
+ * Licensed under MIT License
8
+ */
9
+ t="undefined"!=typeof window?window:void 0,e=function(){class t{static get defaults(){return{selector:"[data-zoomora]",showCounter:!0,showThumbnails:!0,showFullscreen:!0,showZoom:!0,transition:"fade",useHref:!1,maxZoomScale:3,zoomStep:.1,animationDuration:300,onOpen:null,onClose:null,onNext:null,onPrev:null,showAutoHideToggle:!0,autoHideDelay:3e3,autoHideEnabled:!1}}constructor(e={}){this.options=h(h({},t.defaults),e),this.currentIndex=0,this.items=[],this.isZoomed=!1,this.isFullscreen=!1,this.isDragging=!1,this.thumbnailsVisible=!0,this.startX=0,this.startY=0,this.currentX=0,this.currentY=0,this.currentScale=1,this.isInitialized=!1,this.eventListeners=new Map,this.autoHideEnabled=!1,this.autoHideTimeout=null,this.autoHideDelay=3e3,this.isControlsVisible=!0,this.idleTimer=null,this.boundMethods={handleDocumentClick:this.handleDocumentClick.bind(this),handleKeydown:this.handleKeydown.bind(this),handleFullscreenChange:this.handleFullscreenChange.bind(this),handleZoomoraClick:this.handleZoomoraClick.bind(this),handleContentClick:this.handleContentClick.bind(this),handleMouseDown:this.handleMouseDown.bind(this),handleMouseMove:this.handleMouseMove.bind(this),handleMouseUp:this.handleMouseUp.bind(this),handleTouchStart:this.handleTouchStart.bind(this),handleTouchMove:this.handleTouchMove.bind(this),handleTouchEnd:this.handleTouchEnd.bind(this)},this.init()}init(){if(this.isInitialized)console.warn("Zoomora: Plugin already initialized");else try{this.createLightbox(),this.bindEvents(),this.isInitialized=!0}catch(t){console.error("Zoomora: Initialization failed",t)}}static bind(e,s={}){const n=(a=h({},s),o(a,i({selector:e,useHref:!0})));var a;return new t(n)}createLightbox(){if(document.getElementById("zoomoraLightbox"))console.warn("Zoomora: Lightbox already exists in DOM");else if(document.body.insertAdjacentHTML("beforeend",'\n <div class="zoomora" id="zoomoraLightbox">\n <div class="zoomora-container">\n <div class="zoomora-header" id="zoomoraHeader">\n <div class="zoomora-counter" id="zoomoraCounter">1 / 1</div>\n <div class="zoomora-controls">\n <button class="zoomora-btn" id="zoomoraThumbnailBtn" title="Toggle Thumbnails">\n <i class="zoomorai-thumbnails"></i>\n </button>\n <button class="zoomora-btn" id="zoomoraAutoHideBtn" title="Toggle Auto-Hide Controls">\n <i class="zoomorai-controls-off"></i>\n </button>\n <button class="zoomora-btn" id="zoomoraZoomBtn" title="Zoom">\n <i class="zoomorai-zoom"></i>\n </button>\n <button class="zoomora-btn" id="zoomoraFullscreenBtn" title="Fullscreen">\n <i class="zoomorai-expand"></i>\n </button>\n <button class="zoomora-btn" id="zoomoraCollapseBtn" title="Exit Fullscreen" style="display: none;">\n <i class="zoomorai-collapse"></i>\n </button>\n <button class="zoomora-btn" id="zoomoraCloseBtn" title="Close">\n <i class="zoomorai-close"></i>\n </button>\n </div>\n </div>\n \n <div class="zoomora-content" id="zoomoraContent">\n <div class="zoomora-loading" id="zoomoraLoading"></div>\n <div class="zoomora-slides-container" id="zoomoraSlidesContainer"></div>\n </div>\n \n <button class="zoomora-nav prev" id="zoomoraPrevBtn">\n <i class="zoomorai-arrow-left"></i>\n </button>\n <button class="zoomora-nav next" id="zoomoraNextBtn">\n <i class="zoomorai-arrow-right"></i>\n </button>\n \n <div class="zoomora-caption" id="zoomoraCaption"></div>\n <div class="zoomora-thumbnails" id="zoomoraThumbs"></div>\n </div>\n </div>\n '),this.zoomora=document.getElementById("zoomoraLightbox"),this.header=document.getElementById("zoomoraHeader"),this.content=document.getElementById("zoomoraContent"),this.slidesContainer=document.getElementById("zoomoraSlidesContainer"),this.counter=document.getElementById("zoomoraCounter"),this.thumbs=document.getElementById("zoomoraThumbs"),this.loading=document.getElementById("zoomoraLoading"),this.caption=document.getElementById("zoomoraCaption"),this.prevBtn=document.getElementById("zoomoraPrevBtn"),this.nextBtn=document.getElementById("zoomoraNextBtn"),!(this.zoomora&&this.content&&this.counter&&this.thumbs&&this.loading&&this.caption))throw new Error("Failed to create required DOM elements")}bindEvents(){this.addEventListener(document,"click",this.boundMethods.handleDocumentClick),this.addEventListener(document.getElementById("zoomoraCloseBtn"),"click",()=>this.close()),this.addEventListener(document.getElementById("zoomoraPrevBtn"),"click",()=>this.prev()),this.addEventListener(document.getElementById("zoomoraNextBtn"),"click",()=>this.next()),this.addEventListener(document.getElementById("zoomoraZoomBtn"),"click",()=>this.toggleZoom()),this.addEventListener(document.getElementById("zoomoraFullscreenBtn"),"click",()=>this.toggleFullscreen()),this.addEventListener(document.getElementById("zoomoraCollapseBtn"),"click",()=>this.exitFullscreen()),this.addEventListener(document.getElementById("zoomoraThumbnailBtn"),"click",()=>this.toggleThumbnails()),this.addEventListener(document,"fullscreenchange",this.boundMethods.handleFullscreenChange),this.addEventListener(document,"webkitfullscreenchange",this.boundMethods.handleFullscreenChange),this.addEventListener(document,"mozfullscreenchange",this.boundMethods.handleFullscreenChange),this.addEventListener(document,"MSFullscreenChange",this.boundMethods.handleFullscreenChange),this.addEventListener(document,"keydown",this.boundMethods.handleKeydown),this.addEventListener(this.zoomora,"click",this.boundMethods.handleZoomoraClick),this.addEventListener(this.content,"click",this.boundMethods.handleContentClick),this.addEventListener(this.content,"mousedown",this.boundMethods.handleMouseDown),this.addEventListener(this.content,"mousemove",this.boundMethods.handleMouseMove),this.addEventListener(this.content,"mouseup",this.boundMethods.handleMouseUp),this.addEventListener(this.content,"mouseleave",this.boundMethods.handleMouseUp),this.addEventListener(this.content,"touchstart",this.boundMethods.handleTouchStart,{passive:!1}),this.addEventListener(this.content,"touchmove",this.boundMethods.handleTouchMove,{passive:!1}),this.addEventListener(this.content,"touchend",this.boundMethods.handleTouchEnd),this.addEventListener(document.getElementById("zoomoraAutoHideBtn"),"click",()=>this.toggleAutoHide()),this.addEventListener(this.zoomora,"mousemove",()=>this.handleUserActivity()),this.addEventListener(this.zoomora,"touchstart",()=>this.handleUserActivity()),this.addEventListener(this.zoomora,"keydown",()=>this.handleUserActivity())}addEventListener(t,e,s,o={}){if(!t)return;t.addEventListener(e,s,o);const i=`${t.constructor.name}_${e}`;this.eventListeners.has(i)||this.eventListeners.set(i,[]),this.eventListeners.get(i).push({element:t,event:e,handler:s,options:o})}handleDocumentClick(t){const e=t.target.closest(this.options.selector);e&&(t.preventDefault(),this.open(e))}handleKeydown(t){if(this.zoomora.classList.contains("active"))switch(t.key){case"Escape":this.isFullscreen?this.exitFullscreen():this.close();break;case"ArrowLeft":this.prev();break;case"ArrowRight":this.next();break;case"z":case"Z":this.toggleZoom();break;case"f":case"F":this.toggleFullscreen();break;case"t":case"T":this.toggleThumbnails()}}handleFullscreenChange(){!(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement)&&this.isFullscreen&&(this.isFullscreen=!1,this.zoomora.classList.remove("fullscreen"),this.updateButtons())}handleZoomoraClick(t){t.target===this.zoomora&&this.close()}handleContentClick(t){const e=t.target.closest(".zoomora-media");!e||e.classList.contains("no-zoom")||this.isDragging||this.toggleZoom()}handleMouseDown(t){this.startDrag(t)}handleMouseMove(t){this.drag(t)}handleMouseUp(){this.endDrag()}handleTouchStart(t){this.startDrag(t)}handleTouchMove(t){this.drag(t)}handleTouchEnd(){this.endDrag()}getImageSource(t){const e=t.dataset.src||t.src||t.getAttribute("src");return"video"===(t.dataset.type||"image")&&e?this.convertToEmbedUrl(e):e}convertToEmbedUrl(t){if(t.includes("youtube.com/embed/"))return t;let e=null,s=null;if(t.includes("youtube.com/watch")){const o=new URLSearchParams(t.split("?")[1]);e=o.get("v");const i=o.get("t");i&&(s=i.replace("s",""))}else if(t.includes("youtu.be/")){const o=t.split("/"),i=o[o.length-1];if(i.includes("?")){e=i.split("?")[0];const t=new URLSearchParams(i.split("?")[1]).get("t");t&&(s=t.replace("s",""))}else e=i}if(e){let t=`https://www.youtube.com/embed/${e}`;const o=new URLSearchParams;return s&&o.append("start",s),o.append("rel","0"),o.append("modestbranding","1"),o.toString()&&(t+="?"+o.toString()),t}return t}getThumbnailSource(t){return"video"===(t.dataset.type||"image")?t.src||t.getAttribute("src"):t.dataset.src||t.src||t.getAttribute("src")}getGroup(t){return this.options.useHref?t.dataset.lightbox||t.dataset.gallery||"default":t.dataset.zoomora||"default"}open(t){if(!t)return;const e=this.getGroup(t);let s;s=this.options.useHref?t.dataset.lightbox?`[data-lightbox="${e}"]`:t.dataset.gallery?`[data-gallery="${e}"]`:this.options.selector:`[data-zoomora="${e}"]`,this.items=Array.from(document.querySelectorAll(s)),this.currentIndex=Math.max(0,this.items.indexOf(t)),this.isZoomed=!1,this.isFullscreen=!1,this.thumbnailsVisible=!0,this.currentX=0,this.currentY=0,this.currentScale=1,this.zoomora.classList.add("active"),document.body.style.overflow="hidden",this.loadContent(),this.updateThumbnails(),this.updateCounter(),this.updateNavigation(),this.updateCaption(),this.updateButtons(),this.autoHideEnabled?this.startAutoHideTimer():this.showControls(),"function"==typeof this.options.onOpen&&this.options.onOpen(t,this.currentIndex)}close(){this.isFullscreen&&this.exitFullscreen(),this.zoomora.classList.remove("active"),document.body.style.overflow="",this.isZoomed=!1,this.isFullscreen=!1,this.currentX=0,this.currentY=0,this.currentScale=1;const t=this.content.querySelector(".zoomora-media");t&&(t.classList.remove("zoomed"),t.style.transform="",t.style.cursor=""),this.zoomora.classList.remove("fullscreen"),this.updateButtons(),this.stopAutoHideTimer(),this.showControls(),"function"==typeof this.options.onClose&&this.options.onClose(this.currentIndex)}prev(){this.currentIndex>0&&(this.currentIndex--,this.loadContent(),this.updateCounter(),this.updateThumbnails(),this.updateNavigation(),this.updateCaption(),"function"==typeof this.options.onPrev&&this.options.onPrev(this.currentIndex))}next(){this.currentIndex<this.items.length-1&&(this.currentIndex++,this.loadContent(),this.updateCounter(),this.updateThumbnails(),this.updateNavigation(),this.updateCaption(),"function"==typeof this.options.onNext&&this.options.onNext(this.currentIndex))}loadContent(){if(!this.items[this.currentIndex])return;const t=this.items[this.currentIndex],e=this.getImageSource(t),s=t.dataset.type||"image";e?(this.loading.style.display="block",this.slidesContainer&&(this.slidesContainer.innerHTML=""),setTimeout(()=>{this.renderContent(e,s,t)},100)):console.error("Zoomora: No source found for item")}renderContent(t,e,s){const o=document.createElement("div");o.className="zoomora-slide-container";const i=document.createElement("div");let n;i.className="zoomora-slide "+("slide"===this.options.transition?"slide-effect":"fade-effect"),i.style.opacity="0",i.style.transform="slide"===this.options.transition?"translateX(100%)":"scale(0.8)";try{switch(e){case"video":if(t.endsWith(".mp4")||t.endsWith(".webm")||t.endsWith(".ogg")){const e=document.createElement("div");e.className="zoomora-video-container",n=document.createElement("video"),n.src=t,n.className="zoomora-video",n.setAttribute("preload","metadata");const i=s.src||s.getAttribute("src");i&&n.setAttribute("poster",i);const a=document.createElement("div");a.className="zoomora-play-button",a.innerHTML='<svg viewBox="0 0 24 24" fill="currentColor"><path d="M8 5v14l11-7z"/></svg>',a.addEventListener("click",()=>{n.play(),a.style.display="none",n.setAttribute("controls","")}),n.addEventListener("ended",()=>{a.style.display="flex"}),e.appendChild(n),e.appendChild(a),o.appendChild(e)}else n=document.createElement("iframe"),n.src=t,n.className="zoomora-video",n.setAttribute("allowfullscreen",""),n.setAttribute("frameborder","0"),o.appendChild(n);break;case"iframe":n=document.createElement("iframe"),n.src=t,n.className="zoomora-iframe",n.setAttribute("frameborder","0"),o.appendChild(n);break;default:n=document.createElement("img"),n.src=t,n.className="zoomora-media",n.alt=s.alt||s.title||"",n.onload=()=>{this.loading.style.display="none",this.checkZoomability(n),this.animateSlideIn(i)},n.onerror=()=>{this.loading.style.display="none",console.error("Zoomora: Failed to load image:",t),this.animateSlideIn(i)},o.appendChild(n)}i.appendChild(o),this.slidesContainer.innerHTML="",this.slidesContainer.appendChild(i),"image"!==e&&(this.loading.style.display="none",this.animateSlideIn(i))}catch(t){console.error("Zoomora: Error rendering content:",t),this.loading.style.display="none"}}animateSlideIn(t){t.offsetHeight,t.classList.add("active"),"slide"===this.options.transition?(t.style.transition=`transform ${this.options.animationDuration}ms ease, opacity ${this.options.animationDuration}ms ease`,t.style.transform="translateX(0)",t.style.opacity="1"):(t.style.transition=`transform ${this.options.animationDuration}ms ease, opacity ${this.options.animationDuration}ms ease`,t.style.transform="scale(1)",t.style.opacity="1")}toggleAutoHide(){this.autoHideEnabled=!this.autoHideEnabled;const t=document.getElementById("zoomoraAutoHideBtn");this.autoHideEnabled?(t.classList.add("active"),t.title="Disable Auto-Hide Controls",this.startAutoHideTimer()):(t.classList.remove("active"),t.title="Enable Auto-Hide Controls",this.stopAutoHideTimer(),this.showControls())}handleUserActivity(){this.autoHideEnabled&&(this.showControls(),this.startAutoHideTimer())}startAutoHideTimer(){this.stopAutoHideTimer(),this.autoHideTimeout=setTimeout(()=>{this.hideControls()},this.options.autoHideDelay)}stopAutoHideTimer(){this.autoHideTimeout&&(clearTimeout(this.autoHideTimeout),this.autoHideTimeout=null)}showControls(){this.isControlsVisible||(this.isControlsVisible=!0,this.zoomora.classList.remove("controls-hidden"),this.header&&(this.header.style.transform="translateY(0)",this.header.style.opacity="1"),this.caption&&(this.caption.style.transform="translateX(-50%) translateY(0)",this.caption.style.opacity="1"),this.thumbs&&(this.thumbs.style.transform="translateX(-50%) translateY(0)",this.thumbs.style.opacity="1"),this.prevBtn&&(this.prevBtn.style.transform="translateX(0)",this.prevBtn.style.opacity="1"),this.nextBtn&&(this.nextBtn.style.transform="translateX(0)",this.nextBtn.style.opacity="1"))}hideControls(){this.isControlsVisible&&(this.isControlsVisible=!1,this.zoomora.classList.add("controls-hidden"),this.header&&(this.header.style.transform="translateY(-100%)",this.header.style.opacity="0"),this.caption&&(this.caption.style.transform="translateX(-50%) translateY(100%)",this.caption.style.opacity="0"),this.thumbs&&(this.thumbs.style.transform="translateX(-50%) translateY(100%)",this.thumbs.style.opacity="0"),this.prevBtn&&(this.prevBtn.style.transform="translateX(-100%)",this.prevBtn.style.opacity="0"),this.nextBtn&&(this.nextBtn.style.transform="translateX(100%)",this.nextBtn.style.opacity="0"))}checkZoomability(t){if(!t||!t.naturalWidth||!t.naturalHeight)return;const e=t.getBoundingClientRect(),s=e.width,o=e.height,i=t.naturalWidth,n=t.naturalHeight,a=i>s||n>o,r=i/s,l=n/o,h=Math.max(r,l);t.dataset.zoomRatio=h,t.dataset.naturalWidth=i,t.dataset.naturalHeight=n,t.dataset.renderedWidth=s,t.dataset.renderedHeight=o,a&&h>1.1?t.classList.remove("no-zoom"):t.classList.add("no-zoom")}updateCounter(){this.options.showCounter&&this.counter&&(this.counter.textContent=`${this.currentIndex+1} / ${this.items.length}`)}updateCaption(){if(!this.caption||!this.items[this.currentIndex])return;const t=this.items[this.currentIndex],e=t.dataset.caption||t.title||"";e?(this.caption.textContent=e,this.caption.style.transform="translateX(-50%) translateY(0)",this.caption.style.opacity="1",this.caption.style.pointerEvents="auto",this.caption.style.transition="opacity 0.3s ease, transform 0.3s ease"):(this.caption.style.transform="translateX(-50%) translateY(100%)",this.caption.style.opacity="0",this.caption.style.pointerEvents="none",this.caption.style.transition="opacity 0.3s ease, transform 0.3s ease")}updateThumbnails(){if(this.options.showThumbnails&&this.thumbs){if(1===this.items.length)return this.caption.classList.add("single-item-thumbnail"),void(this.thumbs.style.display="none");this.caption.classList.remove("single-item-thumbnail"),this.thumbs.style.display="flex",this.thumbs.innerHTML="",this.items.forEach((t,e)=>{const s=document.createElement("div");s.className="zoomora-thumb",e===this.currentIndex&&s.classList.add("active");const o=document.createElement("img"),i=this.getThumbnailSource(t);i&&(o.src=i,o.alt=t.alt||t.title||"",o.onerror=()=>{s.style.display="none"}),s.appendChild(o),s.addEventListener("click",()=>{this.currentIndex=e,this.loadContent(),this.updateCounter(),this.updateThumbnails(),this.updateNavigation(),this.updateCaption()}),this.thumbs.appendChild(s)})}}updateNavigation(){const t=document.getElementById("zoomoraPrevBtn"),e=document.getElementById("zoomoraNextBtn");t&&(t.style.display=this.currentIndex>0?"flex":"none"),e&&(e.style.display=this.currentIndex<this.items.length-1?"flex":"none")}updateButtons(){const t=document.getElementById("zoomoraFullscreenBtn"),e=document.getElementById("zoomoraCollapseBtn");t&&e&&(this.isFullscreen?(t.style.display="none",e.style.display="flex"):(t.style.display="flex",e.style.display="none"))}toggleZoom(){const t=this.content.querySelector(".zoomora-media");if(t&&"IMG"===t.tagName&&!t.classList.contains("no-zoom"))if(this.isZoomed=!this.isZoomed,t.classList.toggle("zoomed",this.isZoomed),this.isZoomed){const e=parseFloat(t.dataset.zoomRatio)||2;let s=Math.min(e,this.options.maxZoomScale);e>2.5&&(s=Math.min(.7*e,2.5)),t.style.transform=`scale(${s})`,t.style.cursor="grab",t.dataset.currentZoomScale=s,this.currentScale=s}else t.style.transform="",t.style.cursor="",this.currentX=0,this.currentY=0,this.currentScale=1}toggleFullscreen(){this.isFullscreen?this.exitFullscreen():this.enterFullscreen()}enterFullscreen(){const t=this.zoomora,e=t.requestFullscreen||t.webkitRequestFullscreen||t.mozRequestFullScreen||t.msRequestFullscreen;e?e.call(t).then(()=>{this.isFullscreen=!0,this.zoomora.classList.add("fullscreen"),this.updateButtons()}).catch(t=>{console.warn("Zoomora: Could not enter fullscreen:",t),this.fallbackFullscreen()}):this.fallbackFullscreen()}exitFullscreen(){if(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement){const t=document.exitFullscreen||document.webkitExitFullscreen||document.mozCancelFullScreen||document.msExitFullscreen;t?t.call(document).then(()=>{this.isFullscreen=!1,this.zoomora.classList.remove("fullscreen"),this.updateButtons()}).catch(t=>{console.warn("Zoomora: Could not exit fullscreen:",t),this.fallbackExitFullscreen()}):this.fallbackExitFullscreen()}else this.fallbackExitFullscreen()}fallbackFullscreen(){this.isFullscreen=!0,this.zoomora.classList.add("fullscreen"),this.updateButtons()}fallbackExitFullscreen(){this.isFullscreen=!1,this.zoomora.classList.remove("fullscreen"),this.updateButtons()}toggleThumbnails(){if(1!==this.items.length&&(this.thumbnailsVisible=!this.thumbnailsVisible,this.thumbs)){if(this.thumbs.classList.toggle("thumbs-hidden",!this.thumbnailsVisible),!this.caption||!this.items[this.currentIndex])return;const t=this.items[this.currentIndex];(t.dataset.caption||t.title)&&this.thumbs.classList.contains("thumbs-hidden")?(this.caption.style.bottom="20px",this.caption.style.transition="bottom 0.3s ease, transform 0.3s ease"):this.caption.style.bottom="120px"}}startDrag(t){const e=this.content.querySelector(".zoomora-media");if(!e||!this.isZoomed)return;this.isDragging=!0,e.style.cursor="grabbing",this.startX=t.clientX||t.touches&&t.touches[0].clientX||0,this.startY=t.clientY||t.touches&&t.touches[0].clientY||0;const s=e.style.transform,o=s.match(/scale\(([^)]+)\)/),i=s.match(/translate\(([^,]+),\s*([^)]+)\)/);this.currentScale=o?parseFloat(o[1]):1,this.currentX=i?parseFloat(i[1]):0,this.currentY=i?parseFloat(i[2]):0,t.preventDefault()}drag(t){if(!this.isDragging)return;t.preventDefault();const e=t.clientX||t.touches&&t.touches[0].clientX||0,s=t.clientY||t.touches&&t.touches[0].clientY||0,o=e-this.startX,i=s-this.startY,n=this.currentX+o,a=this.currentY+i,r=this.content.querySelector(".zoomora-media");if(!r)return;const l=r.getBoundingClientRect(),h=this.currentScale,d=l.width*(h-1)/2,c=l.height*(h-1)/2,u=Math.max(-d,Math.min(d,n)),m=Math.max(-c,Math.min(c,a));r.style.transform=`scale(${h}) translate(${u}px, ${m}px)`}endDrag(){if(!this.isDragging)return;this.isDragging=!1;const t=this.content.querySelector(".zoomora-media");t&&this.isZoomed&&(t.style.cursor="grab")}goTo(t){t<0||t>=this.items.length||(this.currentIndex=t,this.loadContent(),this.updateCounter(),this.updateThumbnails(),this.updateNavigation(),this.updateCaption())}getCurrentIndex(){return this.currentIndex}getTotalItems(){return this.items.length}isOpen(){return this.zoomora&&this.zoomora.classList.contains("active")}updateOptions(t){this.options=h(h({},this.options),t)}refresh(){if(this.isOpen()){const t=this.items[this.currentIndex];t&&this.open(t)}}destroy(){this.isInitialized&&(this.isOpen()&&this.close(),this.stopAutoHideTimer(),this.eventListeners.forEach((t,e)=>{t.forEach(({element:t,event:e,handler:s,options:o})=>{t&&t.removeEventListener&&t.removeEventListener(e,s,o)})}),this.eventListeners.clear(),this.zoomora&&this.zoomora.parentNode&&this.zoomora.parentNode.removeChild(this.zoomora),this.isInitialized=!1,this.items=[],this.currentIndex=0,this.zoomora=null,this.content=null,this.counter=null,this.thumbs=null,this.loading=null,this.caption=null)}}return t},"object"==typeof module&&"object"==typeof module.exports?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Zoomora=e()});
10
+ //# sourceMappingURL=zoomora.umd.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoomora.umd.min.js","sources":["../src/zoomora.js"],"sourcesContent":["/*!\n * Zoomora Lightbox Plugin v1.0.0\n * A modern, responsive lightbox plugin with zoom, fullscreen, and gallery features\n *\n * Copyright (c) 2025 Faruk Ahmed (FrontTheme)\n * Licensed under MIT License\n */\n\n// Import styles\nimport './styles/zoomora.scss';\n\n(function (global, factory) {\n 'use strict';\n\n if (typeof module === 'object' && typeof module.exports === 'object') {\n // CommonJS/Node.js\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n // AMD\n define(factory);\n } else {\n // Browser globals\n global.Zoomora = factory();\n }\n}(typeof window !== 'undefined' ? window : this, function () {\n 'use strict';\n\n /**\n * Zoomora Lightbox Plugin\n * @class\n */\n class Zoomora {\n /**\n * Default configuration options\n * @type {Object}\n */\n static get defaults() {\n return {\n selector: '[data-zoomora]',\n showCounter: true,\n showThumbnails: true,\n showFullscreen: true,\n showZoom: true,\n transition: 'fade', // 'fade' or 'slide'\n useHref: false, // Use href instead of data-src\n maxZoomScale: 3, // Maximum zoom scale\n zoomStep: 0.1, // Zoom step for scroll wheel\n animationDuration: 300, // Animation duration in ms\n onOpen: null, // Callback when lightbox opens\n onClose: null, // Callback when lightbox closes\n onNext: null, // Callback when navigating to next item\n onPrev: null, // Callback when navigating to previous item\n\n // Auto-hide controls\n showAutoHideToggle: true, // Show auto-hide toggle button\n autoHideDelay: 3000, // Delay in ms before hiding controls\n autoHideEnabled: false, // Default state of auto-hide\n };\n }\n\n /**\n * Constructor\n * @param {Object} options - Configuration options\n */\n constructor(options = {}) {\n this.options = {...Zoomora.defaults, ...options};\n this.currentIndex = 0;\n this.items = [];\n this.isZoomed = false;\n this.isFullscreen = false;\n this.isDragging = false;\n this.thumbnailsVisible = true;\n this.startX = 0;\n this.startY = 0;\n this.currentX = 0;\n this.currentY = 0;\n this.currentScale = 1;\n this.isInitialized = false;\n this.eventListeners = new Map();\n\n // Auto-hide controls\n this.autoHideEnabled = false;\n this.autoHideTimeout = null;\n this.autoHideDelay = 3000;\n this.isControlsVisible = true;\n this.idleTimer = null;\n\n // Bound methods for event listeners\n this.boundMethods = {\n handleDocumentClick: this.handleDocumentClick.bind(this),\n handleKeydown: this.handleKeydown.bind(this),\n handleFullscreenChange: this.handleFullscreenChange.bind(this),\n handleZoomoraClick: this.handleZoomoraClick.bind(this),\n handleContentClick: this.handleContentClick.bind(this),\n handleMouseDown: this.handleMouseDown.bind(this),\n handleMouseMove: this.handleMouseMove.bind(this),\n handleMouseUp: this.handleMouseUp.bind(this),\n handleTouchStart: this.handleTouchStart.bind(this),\n handleTouchMove: this.handleTouchMove.bind(this),\n handleTouchEnd: this.handleTouchEnd.bind(this),\n };\n\n this.init();\n }\n\n /**\n * Initialize the plugin\n */\n init() {\n if (this.isInitialized) {\n console.warn('Zoomora: Plugin already initialized');\n return;\n }\n\n try {\n this.createLightbox();\n this.bindEvents();\n\n this.isInitialized = true;\n } catch (error) {\n console.error('Zoomora: Initialization failed', error);\n }\n }\n\n /**\n * Static method to bind to anchor tags with href\n * @param {string} selector - CSS selector\n * @param {Object} options - Configuration options\n * @returns {Zoomora} - New Zoomora instance\n */\n static bind(selector, options = {}) {\n const enhancedOptions = {\n ...options,\n selector: selector,\n useHref: true\n };\n return new Zoomora(enhancedOptions);\n }\n\n /**\n * Create lightbox HTML structure\n */\n createLightbox() {\n // Check if lightbox already exists\n if (document.getElementById('zoomoraLightbox')) {\n console.warn('Zoomora: Lightbox already exists in DOM');\n return;\n }\n\n const zoomoraHTML = `\n <div class=\"zoomora\" id=\"zoomoraLightbox\">\n <div class=\"zoomora-container\">\n <div class=\"zoomora-header\" id=\"zoomoraHeader\">\n <div class=\"zoomora-counter\" id=\"zoomoraCounter\">1 / 1</div>\n <div class=\"zoomora-controls\">\n <button class=\"zoomora-btn\" id=\"zoomoraThumbnailBtn\" title=\"Toggle Thumbnails\">\n <i class=\"zoomorai-thumbnails\"></i>\n </button>\n <button class=\"zoomora-btn\" id=\"zoomoraAutoHideBtn\" title=\"Toggle Auto-Hide Controls\">\n <i class=\"zoomorai-controls-off\"></i>\n </button>\n <button class=\"zoomora-btn\" id=\"zoomoraZoomBtn\" title=\"Zoom\">\n <i class=\"zoomorai-zoom\"></i>\n </button>\n <button class=\"zoomora-btn\" id=\"zoomoraFullscreenBtn\" title=\"Fullscreen\">\n <i class=\"zoomorai-expand\"></i>\n </button>\n <button class=\"zoomora-btn\" id=\"zoomoraCollapseBtn\" title=\"Exit Fullscreen\" style=\"display: none;\">\n <i class=\"zoomorai-collapse\"></i>\n </button>\n <button class=\"zoomora-btn\" id=\"zoomoraCloseBtn\" title=\"Close\">\n <i class=\"zoomorai-close\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"zoomora-content\" id=\"zoomoraContent\">\n <div class=\"zoomora-loading\" id=\"zoomoraLoading\"></div>\n <div class=\"zoomora-slides-container\" id=\"zoomoraSlidesContainer\"></div>\n </div>\n \n <button class=\"zoomora-nav prev\" id=\"zoomoraPrevBtn\">\n <i class=\"zoomorai-arrow-left\"></i>\n </button>\n <button class=\"zoomora-nav next\" id=\"zoomoraNextBtn\">\n <i class=\"zoomorai-arrow-right\"></i>\n </button>\n \n <div class=\"zoomora-caption\" id=\"zoomoraCaption\"></div>\n <div class=\"zoomora-thumbnails\" id=\"zoomoraThumbs\"></div>\n </div>\n </div>\n `;\n\n document.body.insertAdjacentHTML('beforeend', zoomoraHTML);\n\n // Cache DOM elements\n this.zoomora = document.getElementById('zoomoraLightbox');\n this.header = document.getElementById('zoomoraHeader');\n this.content = document.getElementById('zoomoraContent');\n this.slidesContainer = document.getElementById('zoomoraSlidesContainer');\n this.counter = document.getElementById('zoomoraCounter');\n this.thumbs = document.getElementById('zoomoraThumbs');\n this.loading = document.getElementById('zoomoraLoading');\n this.caption = document.getElementById('zoomoraCaption');\n this.prevBtn = document.getElementById('zoomoraPrevBtn');\n this.nextBtn = document.getElementById('zoomoraNextBtn');\n\n // Verify all elements were created\n if (!this.zoomora || !this.content || !this.counter || !this.thumbs || !this.loading || !this.caption) {\n throw new Error('Failed to create required DOM elements');\n }\n }\n\n /**\n * Bind event listeners\n */\n bindEvents() {\n // Document click handler for opening lightbox\n this.addEventListener(document, 'click', this.boundMethods.handleDocumentClick);\n\n // Control button handlers\n this.addEventListener(document.getElementById('zoomoraCloseBtn'), 'click', () => this.close());\n this.addEventListener(document.getElementById('zoomoraPrevBtn'), 'click', () => this.prev());\n this.addEventListener(document.getElementById('zoomoraNextBtn'), 'click', () => this.next());\n this.addEventListener(document.getElementById('zoomoraZoomBtn'), 'click', () => this.toggleZoom());\n this.addEventListener(document.getElementById('zoomoraFullscreenBtn'), 'click', () => this.toggleFullscreen());\n this.addEventListener(document.getElementById('zoomoraCollapseBtn'), 'click', () => this.exitFullscreen());\n this.addEventListener(document.getElementById('zoomoraThumbnailBtn'), 'click', () => this.toggleThumbnails());\n\n // Fullscreen change events\n this.addEventListener(document, 'fullscreenchange', this.boundMethods.handleFullscreenChange);\n this.addEventListener(document, 'webkitfullscreenchange', this.boundMethods.handleFullscreenChange);\n this.addEventListener(document, 'mozfullscreenchange', this.boundMethods.handleFullscreenChange);\n this.addEventListener(document, 'MSFullscreenChange', this.boundMethods.handleFullscreenChange);\n\n // Keyboard navigation\n this.addEventListener(document, 'keydown', this.boundMethods.handleKeydown);\n\n // Lightbox click to close\n this.addEventListener(this.zoomora, 'click', this.boundMethods.handleZoomoraClick);\n\n // Content click for zoom toggle\n this.addEventListener(this.content, 'click', this.boundMethods.handleContentClick);\n\n // Mouse drag events\n this.addEventListener(this.content, 'mousedown', this.boundMethods.handleMouseDown);\n this.addEventListener(this.content, 'mousemove', this.boundMethods.handleMouseMove);\n this.addEventListener(this.content, 'mouseup', this.boundMethods.handleMouseUp);\n this.addEventListener(this.content, 'mouseleave', this.boundMethods.handleMouseUp);\n\n // Touch events\n this.addEventListener(this.content, 'touchstart', this.boundMethods.handleTouchStart, {passive: false});\n this.addEventListener(this.content, 'touchmove', this.boundMethods.handleTouchMove, {passive: false});\n this.addEventListener(this.content, 'touchend', this.boundMethods.handleTouchEnd);\n\n // Add auto-hide toggle button handler\n this.addEventListener(document.getElementById('zoomoraAutoHideBtn'), 'click', () => this.toggleAutoHide());\n\n // Add mouse/touch activity listeners for auto-hide\n this.addEventListener(this.zoomora, 'mousemove', () => this.handleUserActivity());\n this.addEventListener(this.zoomora, 'touchstart', () => this.handleUserActivity());\n this.addEventListener(this.zoomora, 'keydown', () => this.handleUserActivity());\n }\n\n /**\n * Add event listener with cleanup tracking\n * @param {Element} element - DOM element\n * @param {string} event - Event type\n * @param {Function} handler - Event handler\n * @param {Object} options - Event options\n */\n addEventListener(element, event, handler, options = {}) {\n if (!element) return;\n\n element.addEventListener(event, handler, options);\n\n // Track for cleanup\n const key = `${element.constructor.name}_${event}`;\n if (!this.eventListeners.has(key)) {\n this.eventListeners.set(key, []);\n }\n this.eventListeners.get(key).push({element, event, handler, options});\n }\n\n /**\n * Handle document click events\n * @param {Event} e - Click event\n */\n handleDocumentClick(e) {\n const target = e.target.closest(this.options.selector);\n if (target) {\n e.preventDefault();\n this.open(target);\n }\n }\n\n /**\n * Handle keyboard events\n * @param {KeyboardEvent} e - Keyboard event\n */\n handleKeydown(e) {\n if (!this.zoomora.classList.contains('active')) return;\n\n switch (e.key) {\n case 'Escape':\n if (this.isFullscreen) {\n this.exitFullscreen();\n } else {\n this.close();\n }\n break;\n case 'ArrowLeft':\n this.prev();\n break;\n case 'ArrowRight':\n this.next();\n break;\n case 'z':\n case 'Z':\n this.toggleZoom();\n break;\n case 'f':\n case 'F':\n this.toggleFullscreen();\n break;\n case 't':\n case 'T':\n this.toggleThumbnails();\n break;\n }\n }\n\n /**\n * Handle fullscreen change events\n */\n handleFullscreenChange() {\n const isInFullscreen = document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n\n if (!isInFullscreen && this.isFullscreen) {\n this.isFullscreen = false;\n this.zoomora.classList.remove('fullscreen');\n this.updateButtons();\n }\n }\n\n /**\n * Handle zoomora container clicks\n * @param {Event} e - Click event\n */\n handleZoomoraClick(e) {\n if (e.target === this.zoomora) {\n this.close();\n }\n }\n\n /**\n * Handle content clicks\n * @param {Event} e - Click event\n */\n handleContentClick(e) {\n const media = e.target.closest('.zoomora-media');\n if (media && !media.classList.contains('no-zoom') && !this.isDragging) {\n this.toggleZoom();\n }\n }\n\n /**\n * Handle mouse down events\n * @param {MouseEvent} e - Mouse event\n */\n handleMouseDown(e) {\n this.startDrag(e);\n }\n\n /**\n * Handle mouse move events\n * @param {MouseEvent} e - Mouse event\n */\n handleMouseMove(e) {\n this.drag(e);\n }\n\n /**\n * Handle mouse up events\n */\n handleMouseUp() {\n this.endDrag();\n }\n\n /**\n * Handle touch start events\n * @param {TouchEvent} e - Touch event\n */\n handleTouchStart(e) {\n this.startDrag(e);\n }\n\n /**\n * Handle touch move events\n * @param {TouchEvent} e - Touch event\n */\n handleTouchMove(e) {\n this.drag(e);\n }\n\n /**\n * Handle touch end events\n */\n handleTouchEnd() {\n this.endDrag();\n }\n\n /**\n * Get image source from element\n * @param {Element} item - DOM element\n * @returns {string} - Image source URL\n */\n getImageSource(item) {\n const src = item.dataset.src || item.src || item.getAttribute('src');\n const type = item.dataset.type || 'image';\n\n // Handle YouTube URLs for video types\n if (type === 'video' && src) {\n return this.convertToEmbedUrl(src);\n }\n\n return src;\n }\n\n /**\n * Convert YouTube URLs to embed format\n * @param url\n * @returns {*|string}\n */\n convertToEmbedUrl(url) {\n // If already an embed URL, return as is\n if (url.includes('youtube.com/embed/')) {\n return url;\n }\n\n // Handle different YouTube URL formats\n let videoId = null;\n let startTime = null;\n\n // Extract video ID and start time from different YouTube URL formats\n if (url.includes('youtube.com/watch')) {\n const urlParams = new URLSearchParams(url.split('?')[1]);\n videoId = urlParams.get('v');\n const t = urlParams.get('t');\n if (t) {\n // Convert time format (e.g., \"111s\" to seconds)\n startTime = t.replace('s', '');\n }\n } else if (url.includes('youtu.be/')) {\n const parts = url.split('/');\n const videoAndParams = parts[parts.length - 1];\n if (videoAndParams.includes('?')) {\n videoId = videoAndParams.split('?')[0];\n const urlParams = new URLSearchParams(videoAndParams.split('?')[1]);\n const t = urlParams.get('t');\n if (t) startTime = t.replace('s', '');\n } else {\n videoId = videoAndParams;\n }\n }\n\n if (videoId) {\n let embedUrl = `https://www.youtube.com/embed/${videoId}`;\n const params = new URLSearchParams();\n\n if (startTime) {\n params.append('start', startTime);\n }\n\n // Add other useful parameters\n params.append('rel', '0'); // Don't show related videos\n params.append('modestbranding', '1'); // Modest branding\n\n // Option: Add autoplay for YouTube videos (uncomment if desired)\n // params.append('autoplay', '1');\n\n if (params.toString()) {\n embedUrl += '?' + params.toString();\n }\n\n return embedUrl;\n }\n\n // If not a YouTube URL or couldn't parse, return original\n return url;\n }\n\n /**\n * Get thumbnail source from element\n * @param {Element} item - DOM element\n * @returns {string} - Thumbnail source URL\n */\n getThumbnailSource(item) {\n const type = item.dataset.type || 'image';\n\n // For video items, always use the img.src as thumbnail (poster image)\n if (type === 'video') {\n return item.src || item.getAttribute('src');\n }\n\n // For regular images, use data-src or fallback to src\n return item.dataset.src || item.src || item.getAttribute('src');\n }\n\n /**\n * Get group identifier from element\n * @param {Element} element - DOM element\n * @returns {string} - Group identifier\n */\n getGroup(element) {\n if (this.options.useHref) {\n return element.dataset.lightbox || element.dataset.gallery || 'default';\n }\n return element.dataset.zoomora || 'default';\n }\n\n /**\n * Open lightbox with specified element\n * @param {Element} element - DOM element to open\n */\n open(element) {\n if (!element) return;\n\n const group = this.getGroup(element);\n let groupSelector;\n\n if (this.options.useHref) {\n if (element.dataset.lightbox) {\n groupSelector = `[data-lightbox=\"${group}\"]`;\n } else if (element.dataset.gallery) {\n groupSelector = `[data-gallery=\"${group}\"]`;\n } else {\n groupSelector = this.options.selector;\n }\n } else {\n groupSelector = `[data-zoomora=\"${group}\"]`;\n }\n\n this.items = Array.from(document.querySelectorAll(groupSelector));\n this.currentIndex = Math.max(0, this.items.indexOf(element));\n\n // Reset states\n this.isZoomed = false;\n this.isFullscreen = false;\n this.thumbnailsVisible = true;\n this.currentX = 0;\n this.currentY = 0;\n this.currentScale = 1;\n\n this.zoomora.classList.add('active');\n document.body.style.overflow = 'hidden';\n\n this.loadContent();\n this.updateThumbnails();\n this.updateCounter();\n this.updateNavigation();\n this.updateCaption();\n this.updateButtons();\n\n // Initialize auto-hide if enabled\n if (this.autoHideEnabled) {\n this.startAutoHideTimer();\n } else {\n this.showControls();\n }\n\n // Trigger callback\n if (typeof this.options.onOpen === 'function') {\n this.options.onOpen(element, this.currentIndex);\n }\n }\n\n /**\n * Close lightbox\n */\n close() {\n if (this.isFullscreen) {\n this.exitFullscreen();\n }\n\n this.zoomora.classList.remove('active');\n document.body.style.overflow = '';\n this.isZoomed = false;\n this.isFullscreen = false;\n this.currentX = 0;\n this.currentY = 0;\n this.currentScale = 1;\n\n const media = this.content.querySelector('.zoomora-media');\n if (media) {\n media.classList.remove('zoomed');\n media.style.transform = '';\n media.style.cursor = '';\n }\n\n this.zoomora.classList.remove('fullscreen');\n this.updateButtons();\n\n // Clean up auto-hide\n this.stopAutoHideTimer();\n this.showControls();\n\n // Trigger callback\n if (typeof this.options.onClose === 'function') {\n this.options.onClose(this.currentIndex);\n }\n }\n\n /**\n * Navigate to previous item\n */\n prev() {\n if (this.currentIndex > 0) {\n this.currentIndex--;\n this.loadContent();\n this.updateCounter();\n this.updateThumbnails();\n this.updateNavigation();\n this.updateCaption();\n\n // Trigger callback\n if (typeof this.options.onPrev === 'function') {\n this.options.onPrev(this.currentIndex);\n }\n }\n }\n\n /**\n * Navigate to next item\n */\n next() {\n if (this.currentIndex < this.items.length - 1) {\n this.currentIndex++;\n this.loadContent();\n this.updateCounter();\n this.updateThumbnails();\n this.updateNavigation();\n this.updateCaption();\n\n // Trigger callback\n if (typeof this.options.onNext === 'function') {\n this.options.onNext(this.currentIndex);\n }\n }\n }\n\n /**\n * Load content for current item\n */\n loadContent() {\n if (!this.items[this.currentIndex]) return;\n\n const item = this.items[this.currentIndex];\n const src = this.getImageSource(item);\n const type = item.dataset.type || 'image';\n\n if (!src) {\n console.error('Zoomora: No source found for item');\n return;\n }\n\n // Show loading spinner\n this.loading.style.display = 'block';\n\n // Clear content but keep the loading reference intact\n // Don't replace innerHTML, just clear the slides\n if (this.slidesContainer) {\n this.slidesContainer.innerHTML = '';\n }\n\n // Add slight delay for smooth transition\n setTimeout(() => {\n this.renderContent(src, type, item);\n }, 100);\n }\n\n /**\n * Render content based on type\n * @param {string} src - Source URL\n * @param {string} type - Content type\n * @param {Element} item - Original item element\n */\n renderContent(src, type, item) {\n const slideContainer = document.createElement('div');\n slideContainer.className = 'zoomora-slide-container';\n\n // Create slide wrapper\n const slide = document.createElement('div');\n slide.className = `zoomora-slide ${this.options.transition === 'slide' ? 'slide-effect' : 'fade-effect'}`;\n slide.style.opacity = '0';\n slide.style.transform = this.options.transition === 'slide' ? 'translateX(100%)' : 'scale(0.8)';\n\n let mediaElement;\n\n try {\n switch (type) {\n case 'video':\n if (src.endsWith('.mp4') || src.endsWith('.webm') || src.endsWith('.ogg')) {\n const videoContainer = document.createElement('div');\n videoContainer.className = 'zoomora-video-container';\n\n mediaElement = document.createElement('video');\n mediaElement.src = src;\n mediaElement.className = 'zoomora-video';\n mediaElement.setAttribute('preload', 'metadata');\n\n const posterSrc = item.src || item.getAttribute('src');\n if (posterSrc) {\n mediaElement.setAttribute('poster', posterSrc);\n }\n\n const playButton = document.createElement('div');\n playButton.className = 'zoomora-play-button';\n playButton.innerHTML = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M8 5v14l11-7z\"/></svg>`;\n\n playButton.addEventListener('click', () => {\n mediaElement.play();\n playButton.style.display = 'none';\n mediaElement.setAttribute('controls', '');\n });\n\n mediaElement.addEventListener('ended', () => {\n playButton.style.display = 'flex';\n });\n\n videoContainer.appendChild(mediaElement);\n videoContainer.appendChild(playButton);\n slideContainer.appendChild(videoContainer);\n } else {\n mediaElement = document.createElement('iframe');\n mediaElement.src = src;\n mediaElement.className = 'zoomora-video';\n mediaElement.setAttribute('allowfullscreen', '');\n mediaElement.setAttribute('frameborder', '0');\n slideContainer.appendChild(mediaElement);\n }\n break;\n\n case 'iframe':\n mediaElement = document.createElement('iframe');\n mediaElement.src = src;\n mediaElement.className = 'zoomora-iframe';\n mediaElement.setAttribute('frameborder', '0');\n slideContainer.appendChild(mediaElement);\n break;\n\n default:\n mediaElement = document.createElement('img');\n mediaElement.src = src;\n mediaElement.className = 'zoomora-media';\n mediaElement.alt = item.alt || item.title || '';\n\n mediaElement.onload = () => {\n this.loading.style.display = 'none';\n this.checkZoomability(mediaElement);\n this.animateSlideIn(slide);\n };\n\n mediaElement.onerror = () => {\n this.loading.style.display = 'none';\n console.error('Zoomora: Failed to load image:', src);\n this.animateSlideIn(slide);\n };\n\n slideContainer.appendChild(mediaElement);\n }\n\n slide.appendChild(slideContainer);\n\n // Clear existing slides and add new one\n this.slidesContainer.innerHTML = '';\n this.slidesContainer.appendChild(slide);\n\n if (type !== 'image') {\n this.loading.style.display = 'none';\n this.animateSlideIn(slide);\n }\n\n } catch (error) {\n console.error('Zoomora: Error rendering content:', error);\n this.loading.style.display = 'none';\n }\n }\n\n // Animation helper\n animateSlideIn(slide) {\n // Force reflow\n slide.offsetHeight;\n\n // Add active class and animate\n slide.classList.add('active');\n\n if (this.options.transition === 'slide') {\n slide.style.transition = `transform ${this.options.animationDuration}ms ease, opacity ${this.options.animationDuration}ms ease`;\n slide.style.transform = 'translateX(0)';\n slide.style.opacity = '1';\n } else {\n slide.style.transition = `transform ${this.options.animationDuration}ms ease, opacity ${this.options.animationDuration}ms ease`;\n slide.style.transform = 'scale(1)';\n slide.style.opacity = '1';\n }\n }\n\n // Toggle auto-hide controls\n toggleAutoHide() {\n this.autoHideEnabled = !this.autoHideEnabled;\n const autoHideBtn = document.getElementById('zoomoraAutoHideBtn');\n\n if (this.autoHideEnabled) {\n autoHideBtn.classList.add('active');\n autoHideBtn.title = 'Disable Auto-Hide Controls';\n this.startAutoHideTimer();\n } else {\n autoHideBtn.classList.remove('active');\n autoHideBtn.title = 'Enable Auto-Hide Controls';\n this.stopAutoHideTimer();\n this.showControls();\n }\n }\n\n // Handle user activity\n handleUserActivity() {\n if (!this.autoHideEnabled) return;\n\n this.showControls();\n this.startAutoHideTimer();\n }\n\n // Start auto-hide timer\n startAutoHideTimer() {\n this.stopAutoHideTimer();\n\n this.autoHideTimeout = setTimeout(() => {\n this.hideControls();\n }, this.options.autoHideDelay);\n }\n\n // Stop auto-hide timer\n stopAutoHideTimer() {\n if (this.autoHideTimeout) {\n clearTimeout(this.autoHideTimeout);\n this.autoHideTimeout = null;\n }\n }\n\n // Show controls\n showControls() {\n if (this.isControlsVisible) return;\n\n this.isControlsVisible = true;\n this.zoomora.classList.remove('controls-hidden');\n\n // Animate controls back in\n if (this.header) {\n this.header.style.transform = 'translateY(0)';\n this.header.style.opacity = '1';\n }\n\n if (this.caption) {\n this.caption.style.transform = 'translateX(-50%) translateY(0)';\n this.caption.style.opacity = '1';\n }\n\n if (this.thumbs) {\n this.thumbs.style.transform = 'translateX(-50%) translateY(0)';\n this.thumbs.style.opacity = '1';\n }\n\n if (this.prevBtn) {\n this.prevBtn.style.transform = 'translateX(0)';\n this.prevBtn.style.opacity = '1';\n }\n\n if (this.nextBtn) {\n this.nextBtn.style.transform = 'translateX(0)';\n this.nextBtn.style.opacity = '1';\n }\n }\n\n // Hide controls\n hideControls() {\n if (!this.isControlsVisible) return;\n\n this.isControlsVisible = false;\n this.zoomora.classList.add('controls-hidden');\n\n // Animate controls out\n if (this.header) {\n this.header.style.transform = 'translateY(-100%)';\n this.header.style.opacity = '0';\n }\n\n if (this.caption) {\n this.caption.style.transform = 'translateX(-50%) translateY(100%)';\n this.caption.style.opacity = '0';\n }\n\n if (this.thumbs) {\n this.thumbs.style.transform = 'translateX(-50%) translateY(100%)';\n this.thumbs.style.opacity = '0';\n }\n\n if (this.prevBtn) {\n this.prevBtn.style.transform = 'translateX(-100%)';\n this.prevBtn.style.opacity = '0';\n }\n\n if (this.nextBtn) {\n this.nextBtn.style.transform = 'translateX(100%)';\n this.nextBtn.style.opacity = '0';\n }\n }\n\n /**\n * Check if image can be zoomed\n * @param {HTMLImageElement} img - Image element\n */\n checkZoomability(img) {\n if (!img || !img.naturalWidth || !img.naturalHeight) return;\n\n const imgRect = img.getBoundingClientRect();\n const renderedWidth = imgRect.width;\n const renderedHeight = imgRect.height;\n const naturalWidth = img.naturalWidth;\n const naturalHeight = img.naturalHeight;\n\n const isScaledDown = naturalWidth > renderedWidth || naturalHeight > renderedHeight;\n const zoomRatioX = naturalWidth / renderedWidth;\n const zoomRatioY = naturalHeight / renderedHeight;\n const maxZoomRatio = Math.max(zoomRatioX, zoomRatioY);\n\n // Store zoom info\n img.dataset.zoomRatio = maxZoomRatio;\n img.dataset.naturalWidth = naturalWidth;\n img.dataset.naturalHeight = naturalHeight;\n img.dataset.renderedWidth = renderedWidth;\n img.dataset.renderedHeight = renderedHeight;\n\n // Enable zoom if significantly scaled down\n if (isScaledDown && maxZoomRatio > 1.1) {\n img.classList.remove('no-zoom');\n } else {\n img.classList.add('no-zoom');\n }\n }\n\n /**\n * Update counter display\n */\n updateCounter() {\n if (this.options.showCounter && this.counter) {\n this.counter.textContent = `${this.currentIndex + 1} / ${this.items.length}`;\n }\n }\n\n /**\n * Update caption display\n */\n updateCaption() {\n if (!this.caption || !this.items[this.currentIndex]) return;\n\n const item = this.items[this.currentIndex];\n const caption = item.dataset.caption || item.title || '';\n\n if (caption) {\n this.caption.textContent = caption;\n this.caption.style.transform = 'translateX(-50%) translateY(0)';\n this.caption.style.opacity = '1';\n this.caption.style.pointerEvents = 'auto';\n this.caption.style.transition = 'opacity 0.3s ease, transform 0.3s ease';\n } else {\n this.caption.style.transform = 'translateX(-50%) translateY(100%)';\n this.caption.style.opacity = '0';\n this.caption.style.pointerEvents = 'none';\n this.caption.style.transition = 'opacity 0.3s ease, transform 0.3s ease';\n }\n }\n\n /**\n * Update thumbnails display\n */\n updateThumbnails() {\n if (!this.options.showThumbnails || !this.thumbs) return;\n\n if (this.items.length === 1) {\n this.caption.classList.add('single-item-thumbnail');\n this.thumbs.style.display = 'none';\n return;\n }\n\n this.caption.classList.remove('single-item-thumbnail');\n\n this.thumbs.style.display = 'flex';\n this.thumbs.innerHTML = '';\n\n this.items.forEach((item, index) => {\n const thumb = document.createElement('div');\n thumb.className = 'zoomora-thumb';\n if (index === this.currentIndex) thumb.classList.add('active');\n\n const img = document.createElement('img');\n const thumbSrc = this.getThumbnailSource(item);\n\n if (thumbSrc) {\n img.src = thumbSrc;\n img.alt = item.alt || item.title || '';\n img.onerror = () => {\n thumb.style.display = 'none';\n };\n }\n\n thumb.appendChild(img);\n\n thumb.addEventListener('click', () => {\n this.currentIndex = index;\n this.loadContent();\n this.updateCounter();\n this.updateThumbnails();\n this.updateNavigation();\n this.updateCaption();\n });\n\n this.thumbs.appendChild(thumb);\n });\n }\n\n /**\n * Update navigation buttons\n */\n updateNavigation() {\n const prevBtn = document.getElementById('zoomoraPrevBtn');\n const nextBtn = document.getElementById('zoomoraNextBtn');\n\n if (prevBtn) {\n prevBtn.style.display = this.currentIndex > 0 ? 'flex' : 'none';\n }\n if (nextBtn) {\n nextBtn.style.display = this.currentIndex < this.items.length - 1 ? 'flex' : 'none';\n }\n }\n\n /**\n * Update control buttons\n */\n updateButtons() {\n const fullscreenBtn = document.getElementById('zoomoraFullscreenBtn');\n const collapseBtn = document.getElementById('zoomoraCollapseBtn');\n\n if (fullscreenBtn && collapseBtn) {\n if (this.isFullscreen) {\n fullscreenBtn.style.display = 'none';\n collapseBtn.style.display = 'flex';\n } else {\n fullscreenBtn.style.display = 'flex';\n collapseBtn.style.display = 'none';\n }\n }\n }\n\n /**\n * Toggle zoom state\n */\n toggleZoom() {\n const media = this.content.querySelector('.zoomora-media');\n if (!media || media.tagName !== 'IMG' || media.classList.contains('no-zoom')) return;\n\n this.isZoomed = !this.isZoomed;\n media.classList.toggle('zoomed', this.isZoomed);\n\n if (this.isZoomed) {\n const zoomRatio = parseFloat(media.dataset.zoomRatio) || 2;\n let zoomScale = Math.min(zoomRatio, this.options.maxZoomScale);\n\n if (zoomRatio > 2.5) {\n zoomScale = Math.min(zoomRatio * 0.7, 2.5);\n }\n\n media.style.transform = `scale(${zoomScale})`;\n media.style.cursor = 'grab';\n media.dataset.currentZoomScale = zoomScale;\n this.currentScale = zoomScale;\n } else {\n media.style.transform = '';\n media.style.cursor = '';\n this.currentX = 0;\n this.currentY = 0;\n this.currentScale = 1;\n }\n }\n\n /**\n * Toggle fullscreen mode\n */\n toggleFullscreen() {\n if (!this.isFullscreen) {\n this.enterFullscreen();\n } else {\n this.exitFullscreen();\n }\n }\n\n /**\n * Enter fullscreen mode\n */\n enterFullscreen() {\n const element = this.zoomora;\n const requestFullscreen = element.requestFullscreen ||\n element.webkitRequestFullscreen ||\n element.mozRequestFullScreen ||\n element.msRequestFullscreen;\n\n if (requestFullscreen) {\n requestFullscreen.call(element).then(() => {\n this.isFullscreen = true;\n this.zoomora.classList.add('fullscreen');\n this.updateButtons();\n }).catch(err => {\n console.warn('Zoomora: Could not enter fullscreen:', err);\n this.fallbackFullscreen();\n });\n } else {\n this.fallbackFullscreen();\n }\n }\n\n /**\n * Exit fullscreen mode\n */\n exitFullscreen() {\n const isInFullscreen = document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n\n if (isInFullscreen) {\n const exitFullscreen = document.exitFullscreen ||\n document.webkitExitFullscreen ||\n document.mozCancelFullScreen ||\n document.msExitFullscreen;\n\n if (exitFullscreen) {\n exitFullscreen.call(document).then(() => {\n this.isFullscreen = false;\n this.zoomora.classList.remove('fullscreen');\n this.updateButtons();\n }).catch(err => {\n console.warn('Zoomora: Could not exit fullscreen:', err);\n this.fallbackExitFullscreen();\n });\n } else {\n this.fallbackExitFullscreen();\n }\n } else {\n this.fallbackExitFullscreen();\n }\n }\n\n /**\n * Fallback fullscreen using CSS\n */\n fallbackFullscreen() {\n this.isFullscreen = true;\n this.zoomora.classList.add('fullscreen');\n this.updateButtons();\n }\n\n /**\n * Exit CSS fullscreen\n */\n fallbackExitFullscreen() {\n this.isFullscreen = false;\n this.zoomora.classList.remove('fullscreen');\n this.updateButtons();\n }\n\n /**\n * Toggle thumbnails visibility\n */\n toggleThumbnails() {\n if (this.items.length === 1) return;\n\n this.thumbnailsVisible = !this.thumbnailsVisible;\n if (this.thumbs) {\n this.thumbs.classList.toggle('thumbs-hidden', !this.thumbnailsVisible);\n\n if (!this.caption || !this.items[this.currentIndex]) return;\n\n const item = this.items[this.currentIndex];\n const caption = item.dataset.caption || item.title || '';\n\n if (caption && this.thumbs.classList.contains('thumbs-hidden')) {\n this.caption.style.bottom = '20px';\n this.caption.style.transition = 'bottom 0.3s ease, transform 0.3s ease';\n } else {\n this.caption.style.bottom = '120px';\n }\n }\n }\n\n /**\n * Start drag operation\n * @param {Event} e - Mouse or touch event\n */\n startDrag(e) {\n const media = this.content.querySelector('.zoomora-media');\n if (!media || !this.isZoomed) return;\n\n this.isDragging = true;\n media.style.cursor = 'grabbing';\n\n this.startX = e.clientX || (e.touches && e.touches[0].clientX) || 0;\n this.startY = e.clientY || (e.touches && e.touches[0].clientY) || 0;\n\n // Parse current transform\n const transform = media.style.transform;\n const scaleMatch = transform.match(/scale\\(([^)]+)\\)/);\n const translateMatch = transform.match(/translate\\(([^,]+),\\s*([^)]+)\\)/);\n\n this.currentScale = scaleMatch ? parseFloat(scaleMatch[1]) : 1;\n this.currentX = translateMatch ? parseFloat(translateMatch[1]) : 0;\n this.currentY = translateMatch ? parseFloat(translateMatch[2]) : 0;\n\n e.preventDefault();\n }\n\n /**\n * Handle drag movement\n * @param {Event} e - Mouse or touch event\n */\n drag(e) {\n if (!this.isDragging) return;\n\n e.preventDefault();\n const clientX = e.clientX || (e.touches && e.touches[0].clientX) || 0;\n const clientY = e.clientY || (e.touches && e.touches[0].clientY) || 0;\n\n const deltaX = clientX - this.startX;\n const deltaY = clientY - this.startY;\n\n const newX = this.currentX + deltaX;\n const newY = this.currentY + deltaY;\n\n const media = this.content.querySelector('.zoomora-media');\n if (!media) return;\n\n const mediaRect = media.getBoundingClientRect();\n const scale = this.currentScale;\n const maxX = (mediaRect.width * (scale - 1)) / 2;\n const maxY = (mediaRect.height * (scale - 1)) / 2;\n\n const constrainedX = Math.max(-maxX, Math.min(maxX, newX));\n const constrainedY = Math.max(-maxY, Math.min(maxY, newY));\n\n media.style.transform = `scale(${scale}) translate(${constrainedX}px, ${constrainedY}px)`;\n }\n\n /**\n * End drag operation\n */\n endDrag() {\n if (!this.isDragging) return;\n\n this.isDragging = false;\n const media = this.content.querySelector('.zoomora-media');\n if (media && this.isZoomed) {\n media.style.cursor = 'grab';\n }\n }\n\n /**\n * Go to specific item by index\n * @param {number} index - Item index\n */\n goTo(index) {\n if (index < 0 || index >= this.items.length) return;\n\n this.currentIndex = index;\n this.loadContent();\n this.updateCounter();\n this.updateThumbnails();\n this.updateNavigation();\n this.updateCaption();\n }\n\n /**\n * Get current item index\n * @returns {number} - Current index\n */\n getCurrentIndex() {\n return this.currentIndex;\n }\n\n /**\n * Get total number of items\n * @returns {number} - Total items\n */\n getTotalItems() {\n return this.items.length;\n }\n\n /**\n * Check if lightbox is open\n * @returns {boolean} - True if open\n */\n isOpen() {\n return this.zoomora && this.zoomora.classList.contains('active');\n }\n\n /**\n * Update options\n * @param {Object} newOptions - New options to merge\n */\n updateOptions(newOptions) {\n this.options = {...this.options, ...newOptions};\n }\n\n /**\n * Refresh the lightbox (re-scan for items)\n */\n refresh() {\n if (this.isOpen()) {\n const currentItem = this.items[this.currentIndex];\n if (currentItem) {\n this.open(currentItem);\n }\n }\n }\n\n /**\n * Destroy the lightbox instance\n */\n destroy() {\n if (!this.isInitialized) return;\n\n // Close if open\n if (this.isOpen()) {\n this.close();\n }\n\n // Clean up auto-hide\n this.stopAutoHideTimer();\n\n // Remove all event listeners\n this.eventListeners.forEach((listeners, key) => {\n listeners.forEach(({element, event, handler, options}) => {\n if (element && element.removeEventListener) {\n element.removeEventListener(event, handler, options);\n }\n });\n });\n this.eventListeners.clear();\n\n // Remove DOM elements\n if (this.zoomora && this.zoomora.parentNode) {\n this.zoomora.parentNode.removeChild(this.zoomora);\n }\n\n // Reset properties\n this.isInitialized = false;\n this.items = [];\n this.currentIndex = 0;\n this.zoomora = null;\n this.content = null;\n this.counter = null;\n this.thumbs = null;\n this.loading = null;\n this.caption = null;\n }\n }\n\n // Export the class\n return Zoomora;\n}));"],"names":["global","factory","window","this","Zoomora","defaults","selector","showCounter","showThumbnails","showFullscreen","showZoom","transition","useHref","maxZoomScale","zoomStep","animationDuration","onOpen","onClose","onNext","onPrev","showAutoHideToggle","autoHideDelay","autoHideEnabled","constructor","options","__spreadValues","currentIndex","items","isZoomed","isFullscreen","isDragging","thumbnailsVisible","startX","startY","currentX","currentY","currentScale","isInitialized","eventListeners","Map","autoHideTimeout","isControlsVisible","idleTimer","boundMethods","handleDocumentClick","bind","handleKeydown","handleFullscreenChange","handleZoomoraClick","handleContentClick","handleMouseDown","handleMouseMove","handleMouseUp","handleTouchStart","handleTouchMove","handleTouchEnd","init","console","warn","createLightbox","bindEvents","error","enhancedOptions","document","getElementById","body","insertAdjacentHTML","zoomora","header","content","slidesContainer","counter","thumbs","loading","caption","prevBtn","nextBtn","Error","addEventListener","close","prev","next","toggleZoom","toggleFullscreen","exitFullscreen","toggleThumbnails","passive","toggleAutoHide","handleUserActivity","element","event","handler","key","name","has","set","get","push","e","target","closest","preventDefault","open","classList","contains","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","remove","updateButtons","media","startDrag","drag","endDrag","getImageSource","item","src","dataset","getAttribute","type","convertToEmbedUrl","url","includes","videoId","startTime","urlParams","URLSearchParams","split","t","replace","parts","videoAndParams","length","embedUrl","params","append","toString","getThumbnailSource","getGroup","lightbox","gallery","group","groupSelector","Array","from","querySelectorAll","Math","max","indexOf","add","style","overflow","loadContent","updateThumbnails","updateCounter","updateNavigation","updateCaption","startAutoHideTimer","showControls","querySelector","transform","cursor","stopAutoHideTimer","display","innerHTML","setTimeout","renderContent","slideContainer","createElement","className","slide","mediaElement","opacity","endsWith","videoContainer","setAttribute","posterSrc","playButton","play","appendChild","alt","title","onload","checkZoomability","animateSlideIn","onerror","offsetHeight","autoHideBtn","hideControls","clearTimeout","img","naturalWidth","naturalHeight","imgRect","getBoundingClientRect","renderedWidth","width","renderedHeight","height","isScaledDown","zoomRatioX","zoomRatioY","maxZoomRatio","zoomRatio","textContent","pointerEvents","forEach","index","thumb","thumbSrc","fullscreenBtn","collapseBtn","tagName","toggle","parseFloat","zoomScale","min","currentZoomScale","enterFullscreen","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","call","then","catch","err","fallbackFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen","fallbackExitFullscreen","bottom","clientX","touches","clientY","scaleMatch","match","translateMatch","deltaX","deltaY","newX","newY","mediaRect","scale","maxX","maxY","constrainedX","constrainedY","goTo","getCurrentIndex","getTotalItems","isOpen","updateOptions","newOptions","refresh","currentItem","destroy","listeners","removeEventListener","clear","parentNode","removeChild","module","exports","define","amd"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "zoomora",
3
+ "version": "1.0.0",
4
+ "description": "A modern, responsive lightbox plugin with zoom, fullscreen, and gallery features",
5
+ "type": "module",
6
+ "main": "dist/zoomora.umd.js",
7
+ "module": "dist/zoomora.es.js",
8
+ "files": [
9
+ "dist",
10
+ "src",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/fronttheme/zoomora.git"
17
+ },
18
+ "bugs": {
19
+ "url": "https://github.com/fronttheme/zoomora/issues"
20
+ },
21
+ "homepage": "https://github.com/fronttheme/zoomora#readme",
22
+ "keywords": [
23
+ "lightbox",
24
+ "gallery",
25
+ "zoom",
26
+ "image-viewer",
27
+ "responsive",
28
+ "fullscreen",
29
+ "video",
30
+ "youtube",
31
+ "wordpress"
32
+ ],
33
+ "author": "Faruk Ahmed (https://fronttheme.com)",
34
+ "license": "MIT",
35
+ "scripts": {
36
+ "dev": "vite",
37
+ "build": "vite build",
38
+ "preview": "vite preview",
39
+ "clean": "rm -rf dist"
40
+ },
41
+ "devDependencies": {
42
+ "@rollup/plugin-terser": "^0.4.4",
43
+ "sass": "^1.89.2",
44
+ "vite": "^7.0.4"
45
+ }
46
+ }
@@ -0,0 +1,43 @@
1
+ // Colors
2
+ $primary-color: #0ecad4;
3
+ $accent-color: #cb4d8b;
4
+ $text-color: #5C6D96;
5
+ $bg-color: #f1f3f6;
6
+ $border-color: #bdcadc;
7
+ $dark-color: #100F21;
8
+
9
+ // Typography
10
+ $font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
11
+ $font-size-base: 16px;
12
+ $font-size-lg: 1.25rem;
13
+ $font-size-sm: 0.875rem;
14
+ $line-height: 1.5;
15
+
16
+ // Spacing
17
+ $spacing-xs: 0.25rem;
18
+ $spacing-sm: 0.5rem;
19
+ $spacing-md: 1rem;
20
+ $spacing-lg: 1.5rem;
21
+ $spacing-xl: 2rem;
22
+ $spacing-xxl: 3rem;
23
+
24
+ // Breakpoints
25
+ $breakpoint-sm: 576px;
26
+ $breakpoint-md: 768px;
27
+ $breakpoint-lg: 992px;
28
+ $breakpoint-xl: 1200px;
29
+
30
+ // Border radius
31
+ $border-radius: 0.375rem;
32
+ $border-radius-sm: 0.25rem;
33
+ $border-radius-lg: 0.5rem;
34
+
35
+ // Shadows
36
+ $shadow-sm: 0 1px 2px rgba($dark-color, 0.05);
37
+ $shadow-md: 0 4px 6px rgba($dark-color, 0.1);
38
+ $shadow-lg: 0 10px 15px rgba($dark-color, 0.1);
39
+
40
+ // Transitions
41
+ $transition-base: all 0.2s ease-in-out;
42
+ $transition-fast: all 0.1s ease-in-out;
43
+ $transition-slow: all 0.3s ease-in-out;
Binary file
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <svg xmlns="http://www.w3.org/2000/svg">
4
+ <metadata>Generated by IcoMoon</metadata>
5
+ <defs>
6
+ <font id="Zoomora" horiz-adv-x="1024">
7
+ <font-face units-per-em="1024" ascent="960" descent="-64" />
8
+ <missing-glyph horiz-adv-x="1024" />
9
+ <glyph unicode="&#x20;" horiz-adv-x="512" d="" />
10
+ <glyph unicode="&#xe900;" glyph-name="thumbnails" d="M816 960h-608c-114.7 0-208-93.3-208-208v-608c0-114.7 93.3-208 208-208h608c114.7 0 208 93.3 208 208v608c0 114.7-93.3 208-208 208zM928 144c0-61.76-50.24-112-112-112h-608c-61.76 0-112 50.24-112 112v608c0 61.76 50.24 112 112 112h608c61.76 0 112-50.24 112-112v-608zM600.78 167.84c0-26.5-21.5-48-48-48h-81.54c-26.5 0-48 21.5-48 48s21.5 48 48 48h81.54c26.5 0 48-21.5 48-48zM752.94 172.56c0.16-1.56 0.24-3.16 0.24-4.72s-0.080-3.16-0.24-4.72c-0.16-1.56-0.38-3.12-0.7-4.66-0.3-1.52-0.7-3.060-1.14-4.56-0.46-1.48-1-2.98-1.6-4.42s-1.26-2.88-2-4.24c-0.74-1.38-1.54-2.74-2.42-4.040-0.86-1.32-1.8-2.58-2.8-3.8-0.98-1.22-2.060-2.4-3.16-3.5s-2.28-2.18-3.5-3.18c-1.22-0.98-2.5-1.92-3.8-2.78s-2.66-1.68-4.040-2.42c-1.36-0.72-2.8-1.4-4.24-2s-2.94-1.14-4.42-1.58c-1.5-0.46-3.040-0.84-4.56-1.16-1.54-0.3-3.1-0.54-4.66-0.7s-3.16-0.24-4.72-0.24-3.16 0.080-4.72 0.24-3.12 0.4-4.66 0.7c-1.52 0.32-3.060 0.7-4.56 1.16-1.48 0.44-2.98 0.98-4.42 1.58s-2.88 1.28-4.24 2c-1.38 0.74-2.74 1.56-4.040 2.42-1.32 0.86-2.58 1.8-3.8 2.78-1.22 1-2.4 2.080-3.5 3.18s-2.18 2.28-3.18 3.5c-0.98 1.22-1.92 2.48-2.78 3.8-0.88 1.3-1.68 2.66-2.42 4.040-0.72 1.36-1.4 2.8-2 4.24s-1.14 2.94-1.58 4.42c-0.46 1.5-0.84 3.040-1.16 4.56-0.3 1.54-0.54 3.1-0.7 4.66s-0.24 3.16-0.24 4.72 0.080 3.16 0.24 4.72 0.4 3.12 0.7 4.66c0.32 1.52 0.7 3.060 1.16 4.56 0.44 1.5 0.98 2.98 1.58 4.42s1.28 2.88 2 4.24c0.74 1.38 1.54 2.74 2.42 4.040 0.86 1.32 1.8 2.58 2.78 3.8 1 1.22 2.080 2.4 3.18 3.5s2.28 2.18 3.5 3.18c1.22 0.98 2.48 1.92 3.8 2.8 1.3 0.86 2.66 1.66 4.040 2.4 1.36 0.74 2.8 1.4 4.24 2s2.94 1.14 4.42 1.6c1.5 0.44 3.040 0.84 4.56 1.14 1.54 0.32 3.1 0.54 4.66 0.7 3.14 0.32 6.32 0.32 9.44 0 1.56-0.16 3.12-0.38 4.66-0.7 1.52-0.3 3.060-0.7 4.56-1.14 1.48-0.46 2.98-1 4.42-1.6s2.88-1.26 4.24-2c1.38-0.74 2.74-1.54 4.040-2.4 1.3-0.88 2.58-1.82 3.8-2.8 1.22-1 2.4-2.080 3.5-3.18s2.18-2.28 3.16-3.5c1-1.22 1.94-2.48 2.8-3.8 0.88-1.3 1.68-2.66 2.42-4.040 0.74-1.36 1.4-2.8 2-4.24s1.14-2.92 1.6-4.42c0.44-1.5 0.84-3.040 1.14-4.56 0.32-1.54 0.54-3.1 0.7-4.66zM366.58 172.56c0.16-1.56 0.24-3.16 0.24-4.72s-0.080-3.16-0.24-4.72c-0.14-1.56-0.38-3.12-0.7-4.66-0.3-1.52-0.7-3.060-1.14-4.56-0.46-1.48-1-2.98-1.6-4.42s-1.26-2.86-2-4.24c-0.74-1.38-1.54-2.74-2.4-4.040-0.88-1.32-1.82-2.58-2.8-3.8-1-1.22-2.060-2.4-3.18-3.5-1.1-1.1-2.28-2.18-3.5-3.18-1.2-0.98-2.48-1.92-3.8-2.78-1.28-0.88-2.64-1.68-4.020-2.42-1.38-0.72-2.82-1.4-4.26-2s-2.92-1.14-4.42-1.58c-1.5-0.46-3.020-0.86-4.56-1.16s-3.1-0.54-4.66-0.7-3.14-0.24-4.72-0.24-3.14 0.080-4.72 0.24c-1.54 0.16-3.12 0.4-4.66 0.7-1.52 0.3-3.060 0.7-4.54 1.16-1.5 0.44-2.98 0.98-4.44 1.58-1.44 0.6-2.86 1.28-4.24 2-1.38 0.74-2.74 1.54-4.040 2.42-1.3 0.86-2.58 1.8-3.78 2.78-1.22 1-2.4 2.080-3.52 3.18-1.1 1.1-2.16 2.28-3.16 3.5s-1.94 2.48-2.8 3.8c-0.86 1.3-1.68 2.66-2.4 4.040-0.74 1.38-1.42 2.8-2.020 4.24s-1.12 2.94-1.58 4.42c-0.46 1.5-0.84 3.040-1.16 4.56-0.3 1.54-0.54 3.1-0.7 4.66s-0.24 3.16-0.24 4.72 0.080 3.16 0.24 4.72 0.4 3.12 0.7 4.66c0.32 1.52 0.7 3.060 1.16 4.56 0.46 1.48 0.98 2.98 1.58 4.42s1.28 2.88 2.020 4.24c0.72 1.38 1.54 2.74 2.4 4.040 0.86 1.32 1.8 2.58 2.8 3.8s2.060 2.4 3.16 3.5c1.12 1.12 2.3 2.18 3.52 3.18 1.2 0.98 2.48 1.92 3.78 2.8 1.3 0.86 2.66 1.66 4.040 2.4s2.8 1.4 4.24 2c1.46 0.6 2.94 1.14 4.44 1.58 1.48 0.46 3.020 0.86 4.54 1.16 1.54 0.3 3.12 0.54 4.66 0.7 3.14 0.32 6.32 0.32 9.44 0 1.56-0.16 3.12-0.4 4.66-0.7s3.060-0.7 4.56-1.16c1.5-0.44 2.98-0.98 4.42-1.58s2.88-1.26 4.26-2c1.38-0.74 2.74-1.54 4.020-2.4 1.32-0.88 2.6-1.82 3.8-2.8 1.22-1 2.4-2.060 3.5-3.18 1.12-1.1 2.18-2.28 3.18-3.5 0.98-1.22 1.92-2.48 2.8-3.8 0.86-1.3 1.66-2.66 2.4-4.040 0.74-1.36 1.4-2.8 2-4.24s1.14-2.94 1.6-4.42c0.44-1.5 0.84-3.040 1.14-4.56 0.32-1.54 0.56-3.1 0.7-4.66z" />
11
+ <glyph unicode="&#xe901;" glyph-name="arrow-left" d="M1024 448c0-26.5-21.5-48-48-48h-928c-1.5 0-2.98 0.080-4.44 0.22-0.080 0-0.16 0-0.24 0-1.46 0.14-2.9 0.36-4.32 0.62-0.1 0-0.18 0.040-0.28 0.040-1.42 0.28-2.82 0.62-4.18 1.020-0.12 0.040-0.22 0.060-0.34 0.1-1.36 0.4-2.68 0.88-3.98 1.4-0.16 0.060-0.3 0.12-0.46 0.18-1.28 0.52-2.52 1.1-3.74 1.74-0.18 0.1-0.36 0.18-0.54 0.28-1.22 0.64-2.4 1.36-3.56 2.1-0.16 0.1-0.34 0.22-0.5 0.32-1.2 0.8-2.36 1.66-3.48 2.56-0.1 0.080-0.22 0.16-0.32 0.24-1.24 1-2.42 2.080-3.54 3.2 0 0 0 0 0 0s0 0 0 0c-1.12 1.12-2.2 2.3-3.2 3.54-0.080 0.1-0.16 0.22-0.24 0.32-0.9 1.12-1.76 2.28-2.56 3.48-0.12 0.16-0.22 0.34-0.32 0.5-0.74 1.16-1.46 2.34-2.1 3.56-0.1 0.18-0.18 0.36-0.28 0.54-0.64 1.22-1.22 2.48-1.74 3.76-0.060 0.14-0.12 0.3-0.18 0.44-0.52 1.3-1 2.64-1.4 4-0.040 0.1-0.060 0.22-0.1 0.32-0.4 1.38-0.74 2.78-1.020 4.2 0 0.080-0.020 0.16-0.040 0.26-0.28 1.42-0.48 2.86-0.62 4.34 0 0.080 0 0.14 0 0.22-0.14 1.46-0.22 2.94-0.22 4.44s0.080 2.98 0.22 4.44c0 0.080 0 0.14 0 0.22 0.14 1.46 0.36 2.92 0.62 4.34 0 0.080 0.020 0.16 0.040 0.26 0.28 1.42 0.62 2.82 1.020 4.2 0.040 0.1 0.060 0.22 0.1 0.32 0.4 1.36 0.88 2.7 1.4 4 0.060 0.14 0.12 0.3 0.18 0.44 0.52 1.28 1.12 2.54 1.74 3.76 0.1 0.18 0.18 0.36 0.28 0.54 0.64 1.22 1.36 2.4 2.1 3.56 0.1 0.16 0.22 0.34 0.32 0.5 0.8 1.2 1.66 2.36 2.56 3.48 0.080 0.1 0.16 0.22 0.24 0.32 1 1.24 2.080 2.42 3.2 3.54 0 0 0 0 0 0l354.76 354.86c18.74 18.74 49.14 18.74 67.88 0s18.74-49.14 0-67.88l-272.84-272.84h812.12c26.5 0 48-21.5 48-48zM246.58 317.3c-18.74 18.74-49.14 18.74-67.88 0s-18.74-49.14 0-67.88l190.14-190.14c9.38-9.38 21.66-14.060 33.94-14.060s24.56 4.68 33.94 14.060c18.74 18.74 18.74 49.14 0 67.88l-190.14 190.14z" />
12
+ <glyph unicode="&#xe902;" glyph-name="arrow-right" d="M1009.96 414.060s0 0 0 0l-354.78-354.78c-9.38-9.38-21.66-14.060-33.94-14.060s-24.56 4.68-33.94 14.060c-18.74 18.74-18.74 49.14 0 67.88l272.84 272.84h-812.14c-26.5 0-48 21.48-48 48s21.5 48 48 48h928c1.5 0 2.98-0.080 4.44-0.22 0.080 0 0.14 0 0.22 0 1.46-0.14 2.92-0.36 4.34-0.62 0.080 0 0.16-0.020 0.26-0.040 1.42-0.28 2.84-0.62 4.22-1.020 0.1-0.040 0.22-0.060 0.32-0.1 1.36-0.4 2.7-0.88 4-1.4 0.14-0.060 0.3-0.12 0.44-0.18 1.28-0.52 2.54-1.12 3.76-1.74 0.18-0.1 0.36-0.18 0.54-0.28 1.22-0.66 2.4-1.36 3.56-2.1 0.16-0.1 0.34-0.2 0.5-0.32 1.2-0.8 2.36-1.66 3.5-2.56 0.1-0.080 0.22-0.16 0.32-0.24 1.24-1 2.42-2.080 3.54-3.2 0 0 0 0 0 0s0 0 0 0c1.12-1.12 2.2-2.3 3.2-3.54 0.080-0.1 0.16-0.22 0.26-0.32 0.9-1.12 1.76-2.28 2.56-3.48 0.12-0.18 0.22-0.34 0.32-0.52 0.74-1.14 1.44-2.34 2.1-3.54 0.1-0.18 0.18-0.36 0.28-0.56 0.62-1.22 1.2-2.46 1.74-3.74 0.060-0.16 0.12-0.32 0.18-0.46 0.52-1.3 0.98-2.62 1.4-3.98 0.040-0.12 0.060-0.24 0.1-0.34 0.4-1.38 0.74-2.76 1.020-4.18 0-0.1 0.040-0.2 0.060-0.28 0.26-1.42 0.48-2.84 0.62-4.3 0-0.080 0-0.16 0-0.26 0.14-1.46 0.22-2.92 0.22-4.42v0c0-1.52-0.080-2.98-0.22-4.44 0-0.080 0-0.16 0-0.26-0.14-1.46-0.36-2.88-0.62-4.3 0-0.1-0.040-0.2-0.060-0.28-0.28-1.42-0.62-2.82-1.020-4.18-0.040-0.12-0.060-0.24-0.1-0.34-0.4-1.36-0.88-2.68-1.4-3.98-0.060-0.16-0.12-0.32-0.18-0.46-0.52-1.28-1.1-2.52-1.74-3.74-0.1-0.18-0.18-0.36-0.28-0.56-0.64-1.22-1.34-2.4-2.1-3.54-0.12-0.18-0.22-0.34-0.32-0.52-0.8-1.2-1.66-2.36-2.56-3.48-0.080-0.1-0.16-0.22-0.26-0.32-1-1.24-2.080-2.42-3.2-3.54zM777.42 578.7c9.38-9.38 21.66-14.060 33.94-14.060s24.56 4.68 33.94 14.060c18.74 18.74 18.74 49.14 0 67.88l-190.14 190.14c-18.74 18.74-49.14 18.74-67.88 0s-18.74-49.14 0-67.88l190.14-190.14z" />
13
+ <glyph unicode="&#xe903;" glyph-name="controls-on" d="M1024 565.18c0 181.6-147.74 329.36-329.36 329.36h-365.28c-181.62 0-329.36-147.76-329.36-329.36s147.74-329.36 329.36-329.36h11l-19.56-33.52c-24.4-41.8-24.58-91.82-0.48-133.8s67.38-67.040 115.8-67.040h151.8c48.4 0 91.7 25.060 115.8 67.040s23.92 92-0.48 133.8l-19.56 33.52h11c181.6 0 329.36 147.74 329.36 329.36zM96 565.18c0 128.68 104.68 233.36 233.36 233.36h365.28c128.68 0 233.36-104.68 233.36-233.36s-104.68-233.36-233.36-233.36h-93.7c-0.28 0-0.56 0-0.84 0h-176.42c-0.2 0-0.4 0-0.6 0h-93.74c-128.68 0-233.36 104.68-233.36 233.36zM620.3 153.9c9.88-16.94 3.38-31.94 0.14-37.6-3.26-5.66-12.94-18.84-32.54-18.84h-151.8c-19.6 0-29.28 13.18-32.54 18.84s-9.74 20.66 0.14 37.6l47.82 81.92h120.96l47.82-81.92zM600.88 565.18c0 26.5 21.5 48 48 48h147.1c26.5 0 48-21.5 48-48s-21.5-48-48-48h-147.1c-26.5 0-48 21.5-48 48zM512.54 565.18c0 99.42-80.58 180-180 180s-180-80.58-180-180 80.58-180 180-180 180 80.58 180 180zM248.54 565.18c0 46.32 37.68 84 84 84s84-37.68 84-84-37.68-84-84-84-84 37.68-84 84z" />
14
+ <glyph unicode="&#xe904;" glyph-name="zoom" d="M739 833.2c-81.74 81.76-190.44 126.8-306.040 126.8s-224.3-45.040-306.040-126.8c-81.74-81.78-126.76-190.5-126.76-306.14s45.020-224.36 126.76-306.12c81.74-81.78 190.44-126.8 306.040-126.8s224.3 45.040 306.040 126.8c81.74 81.76 126.76 190.48 126.76 306.12s-45.020 224.36-126.76 306.12zM432.96 190.14c-185.72 0-336.8 151.14-336.8 336.94s151.080 336.92 336.8 336.92 336.8-151.14 336.8-336.94-151.080-336.94-336.8-336.94zM1010.8 16.88c-0.34 0.36-35.060 37.26-70.2 73.5-20.82 21.46-37.8 38.58-50.44 50.86-24.96 24.24-41.44 40.24-68.82 34.58-25.96-5.38-42.64-30.78-37.28-56.74 2.96-14.32 13.92-22.36 23.92-32.36 16.86-14.4 80.44-79.86 132.9-135.62 9.44-10.040 22.2-15.12 34.98-15.12 11.78 0 23.6 4.32 32.88 13.040 19.32 18.16 20.24 48.54 2.080 67.84zM635.12 527.060c0-26.5-21.5-48-48-48h-106.16v-106.22c0-26.5-21.5-48-48-48s-48 21.5-48 48v106.22h-106.16c-26.5 0-48 21.5-48 48s21.5 48 48 48h106.16v106.22c0 26.5 21.5 48 48 48s48-21.5 48-48v-106.22h106.16c26.5 0 48-21.5 48-48z" />
15
+ <glyph unicode="&#xe905;" glyph-name="controls-off" d="M1024 565.18c0 181.6-147.74 329.36-329.36 329.36h-365.3c-181.6 0-329.34-147.76-329.34-329.36s147.74-329.36 329.36-329.36h11l-19.56-33.52c-24.4-41.8-24.58-91.82-0.5-133.8 24.1-41.98 67.38-67.040 115.8-67.040h151.8c48.4 0 91.7 25.060 115.8 67.040s23.92 92-0.48 133.8l-19.56 33.52h11c181.6 0 329.36 147.74 329.36 329.36zM96 565.18c0 128.68 104.68 233.36 233.36 233.36h365.3c128.68 0 233.36-104.68 233.36-233.36s-104.68-233.36-233.36-233.36h-93.76c-0.16 0-0.3 0-0.46 0h-176.96c-0.12 0-0.24 0-0.36 0h-93.76c-128.68 0-233.36 104.68-233.36 233.36zM620.3 153.9c9.88-16.92 3.38-31.94 0.14-37.6s-12.94-18.84-32.54-18.84h-151.8c-19.6 0-29.28 13.18-32.54 18.84s-9.74 20.66 0.14 37.6l47.82 81.92h120.96l47.82-81.92zM511.46 565.18c0 99.42 80.58 180 180 180s180-80.58 180-180-80.58-180-180-180-180 80.58-180 180z" />
16
+ <glyph unicode="&#xe906;" glyph-name="expand" d="M381.84-16c0-26.5-21.5-48-48-48h-125.84c-114.7 0-208 93.3-208 208v125.84c0 26.5 21.5 48 48 48s48-21.5 48-48v-125.84c0-61.76 50.24-112 112-112h125.84c26.5 0 48-21.5 48-48zM976 317.84c-26.5 0-48-21.5-48-48v-125.84c0-61.76-50.24-112-112-112h-125.84c-26.5 0-48-21.5-48-48s21.5-48 48-48h125.84c114.7 0 208 93.3 208 208v125.84c0 26.5-21.5 48-48 48zM333.84 960h-125.84c-114.7 0-208-93.3-208-208v-125.84c0-26.5 21.5-48 48-48s48 21.5 48 48v125.84c0 61.76 50.24 112 112 112h125.84c26.5 0 48 21.5 48 48s-21.5 48-48 48zM816 960h-125.84c-26.5 0-48-21.5-48-48s21.5-48 48-48h125.84c61.76 0 112-50.24 112-112v-125.84c0-26.5 21.5-48 48-48s48 21.5 48 48v125.84c0 114.7-93.3 208-208 208z" />
17
+ <glyph unicode="&#xe907;" glyph-name="collapse" d="M381.84 109.84v-125.84c0-26.5-21.5-48-48-48s-48 21.5-48 48v125.84c0 61.76-50.24 112-112 112h-125.84c-26.5 0-48 21.5-48 48s21.5 48 48 48h125.84c114.7 0 208-93.3 208-208zM976 317.84h-125.84c-114.7 0-208-93.3-208-208v-125.84c0-26.5 21.5-48 48-48s48 21.5 48 48v125.84c0 61.76 50.24 112 112 112h125.84c26.5 0 48 21.5 48 48s-21.5 48-48 48zM333.84 960c-26.5 0-48-21.5-48-48v-125.84c0-61.76-50.24-112-112-112h-125.84c-26.5 0-48-21.5-48-48s21.5-48 48-48h125.84c114.7 0 208 93.3 208 208v125.84c0 26.5-21.5 48-48 48zM850.16 578.16h125.84c26.5 0 48 21.5 48 48s-21.5 48-48 48h-125.84c-61.76 0-112 50.24-112 112v125.84c0 26.5-21.5 48-48 48s-48-21.5-48-48v-125.84c0-114.7 93.3-208 208-208z" />
18
+ <glyph unicode="&#xe908;" glyph-name="close" d="M925.16 102.72c18.74-18.74 18.74-49.14 0-67.88-9.38-9.38-21.66-14.060-33.94-14.060s-24.56 4.68-33.94 14.060l-345.28 345.28-345.28-345.28c-9.38-9.38-21.66-14.060-33.94-14.060s-24.56 4.68-33.94 14.060c-18.74 18.74-18.74 49.14 0 67.88l345.28 345.28-345.28 345.28c-18.74 18.74-18.74 49.14 0 67.88s49.14 18.74 67.88 0l379.22-379.22s0 0 0 0 0 0 0 0l379.22-379.22zM632.78 520.78c12.28 0 24.56 4.68 33.94 14.060l258.44 258.44c18.74 18.74 18.74 49.14 0 67.88s-49.14 18.74-67.88 0l-258.44-258.44c-18.74-18.74-18.74-49.14 0-67.88 9.38-9.38 21.66-14.060 33.94-14.060z" />
19
+ </font></defs></svg>
Binary file
Binary file