summaryrefslogtreecommitdiff
path: root/dist/libra.min.js.map
blob: 6a178bee2174424832fd48832f5884eda79998f6 (plain)
1
{"mappings":"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","sources":["src/lightbox.js","src/overlay.js","src/config.js","src/shadow.js","src/animation.js"],"sourcesContent":["import Overlay from './overlay';\nimport Shadow from './shadow';\nimport config from './config';\nimport { setConfig } from './config';\n\nexport default class LightBox {\n  currentImage = null;\n  shadows = {};\n\n  /**\n   * ============\n   * Initializers\n   * ============\n   */\n\n  constructor(config) {\n    setConfig(config);\n\n    this.initOverlay();\n    this.initImages();\n    this.initControls();\n  }\n\n  initOverlay() {\n    this.overlay = new Overlay();\n    this.overlay.element.addEventListener('click', () => {\n      this.closeCurrent();\n    });\n  }\n\n  initImages() {\n    this.images = document.querySelectorAll(config.selector);\n    this.images.forEach(image => {\n      if (image.tagName !== 'IMG') return;\n      image.id = crypto.randomUUID(); // generate unique id for each image\n      image.style.cursor = config.imageCursor;\n      image.addEventListener('click', () => this.open(image)); // click image to open lightbox\n    });\n  }\n\n  initControls() {\n    // keyboard shortcuts\n    document.addEventListener('keydown', e => {\n      if (e.key === 'Escape' || e.key === ' ')\n        this.closeCurrent();\n    });\n    // scroll to dismiss\n    document.body.addEventListener('wheel', e => this.closeCurrent());\n    document.body.addEventListener('touchmove', e => this.closeCurrent());\n  }\n\n  /**\n   * ============\n   * Actions\n   * ============\n   */\n\n  // open lightbox = open shadow + show overlay\n  open(image) {\n    this.currentImage = image;\n\n    const shadow = this.shadows[image.id] || new Shadow(image);\n    if (!this.shadows[image.id]) {\n      this.shadows[image.id] = shadow;\n    }\n\n    shadow.open();\n    this.overlay.show();\n  }\n\n  // close lightbox = remove shadow + hide overlay\n  close(image) {\n    this.currentImage = null;\n\n    if (!this.shadows[image.id]) return;\n    this.shadows[image.id].close();\n\n    this.overlay.hide();\n  }\n\n  closeCurrent() {\n    if (!this.currentImage) return;\n    this.close(this.currentImage);\n  }\n}\n","import config from './config';\n\nexport default class Overlay {\n  constructor() {\n    const overlay = document.createElement('div');\n    overlay.id = 'libra-overlay';\n    overlay.classList.add('libra-overlay', 'libra-hidden');\n\n    // Set transition duration from config\n    overlay.style.transitionDuration = config.transitionDuration + 'ms';\n\n    this.element = overlay;\n    document.body.appendChild(overlay);\n\n    return this;\n  }\n\n  show() {\n    this.element.classList.remove('libra-hidden');\n    this.element.classList.add('libra-visible');\n  }\n\n  hide() {\n    this.element.classList.remove('libra-visible');\n    this.element.classList.add('libra-hidden');\n  }\n}\n","const config = {\n  selector: '[data-libra]',\n  margin: 50,\n  offset: { x: 0, y: 0 },\n  transitionDuration: 200, // milliseconds\n  imageCursor: 'zoom-in',\n};\n\nfunction deepMerge(target, source) {\n  for (const key in source) {\n    if (\n      typeof source[key] === 'object' &&\n      source[key] !== null &&\n      !Array.isArray(source[key])\n    ) {\n      if (!target[key]) target[key] = {};\n      deepMerge(target[key], source[key]);\n    } else {\n      target[key] = source[key];\n    }\n  }\n  return target;\n}\n\nexport function setConfig(newConfig) {\n  deepMerge(config, newConfig);\n}\n\nexport default config;\n","import Animation from './animation.js';\nimport config from './config';\n\nexport default class Shadow {\n  isOpen = false;\n\n  /**\n   * ============\n   * Constructors\n   * ============\n   */\n\n  constructor(image) {\n    this.original = image;\n\n    const rect = this.original.getBoundingClientRect();\n    this.originalPosition = {\n      top: rect.top + window.scrollY + config.offset.y,\n      left: rect.left + window.scrollX + config.offset.x,\n      width: rect.width,\n      height: rect.height,\n    };\n\n    this.create(image);\n\n    return this;\n  }\n\n  create(image) {\n    // create shadow image\n    const shadow = document.createElement('img');\n    shadow.src = image.src;\n    shadow.id = `libra-shadow-${image.id}`;\n    shadow.classList.add('libra-shadow');\n\n    // style and position shadow image\n    shadow.style.top = `${this.originalPosition.top}px`;\n    shadow.style.left = `${this.originalPosition.left}px`;\n    shadow.style.width = `${this.originalPosition.width}px`;\n    shadow.style.height = `${this.originalPosition.height}px`;\n    // Set transition duration from config\n    shadow.style.transitionDuration = config.transitionDuration + 'ms';\n\n    document.body.appendChild(shadow);\n    this.element = shadow;\n  }\n\n  /**\n   * ============\n   * Actions\n   * ============\n   */\n\n  updateOriginalPosition() {\n    const rect = this.original.getBoundingClientRect();\n    this.originalPosition = {\n      top: rect.top + window.scrollY + config.offset.y,\n      left: rect.left + window.scrollX + config.offset.x,\n      width: rect.width,\n      height: rect.height,\n    };\n  }\n\n  open() {\n    this.isOpen = true;\n    this.element.classList.add('open');\n\n    // Update original position before animation in case viewport changed\n    this.updateOriginalPosition();\n    this.element.style.top = `${this.originalPosition.top}px`;\n    this.element.style.left = `${this.originalPosition.left}px`;\n    this.element.style.width = `${this.originalPosition.width}px`;\n    this.element.style.height = `${this.originalPosition.height}px`;\n\n    this.original.style.visibility = 'hidden';\n    if (!document.body.contains(this.element)) this.placeItself();\n\n    // Wait for image to load before animating\n    if (this.element.naturalWidth === 0 || this.element.naturalHeight === 0) {\n      this.element.addEventListener(\n        'load',\n        () => {\n          Animation.transformMatrix(\n            this.element,\n            this.originalPosition,\n            Animation.calculateFinalState(this.element),\n          );\n        },\n        { once: true },\n      );\n    } else {\n      Animation.transformMatrix(\n        this.element,\n        this.originalPosition,\n        Animation.calculateFinalState(this.element),\n      );\n    }\n  }\n\n  close() {\n    this.isOpen = false;\n    this.element.classList.remove('open');\n\n    Animation.resetTransformMatrix(this.element);\n    // Wait for animation to complete before showing original and destroying shadow\n    setTimeout(() => {\n      this.original.style.visibility = 'visible';\n      this.destroyItself();\n    }, config.transitionDuration);\n  }\n\n  placeItself() {\n    document.body.appendChild(this.element);\n  }\n\n  destroyItself() {\n    if (!document.body.contains(this.element)) return;\n    document.body.removeChild(this.element);\n  }\n}\n","import config from './config';\n\nexport default class Animation {\n  static calculateFinalState(element) {\n    let finals = {};\n\n    const margin = config.margin;\n    const nw = element.naturalWidth;\n    const nh = element.naturalHeight;\n    const ratio = nw / nh;\n    const ww = window.innerWidth - 2 * margin;\n    const wh = window.innerHeight - 2 * margin;\n\n    // size image based on width first\n    finals.width = nw > ww ? ww : nw;\n    finals.height = nw > ww ? ww / ratio : nh;\n\n    // if height is too big, adjust based on height\n    if (finals.height > wh) {\n      finals.height = wh;\n      finals.width = wh * ratio;\n    }\n\n    finals.top =\n      (wh - finals.height) / 2 + window.scrollY + margin + config.offset.y;\n    finals.left =\n      (ww - finals.width) / 2 + window.scrollX + margin + config.offset.x;\n\n    return finals;\n  }\n\n  static transformMatrix(element, starts, finals) {\n    // Calculate scaling factors based on width and height interpolation\n    const scaleX = finals.width / starts.width;\n    const scaleY = finals.height / starts.height;\n\n    // Calculate the center of the starting and final positions\n    const startCenterX = starts.left + starts.width / 2;\n    const startCenterY = starts.top + starts.height / 2;\n    const finalCenterX = finals.left + finals.width / 2;\n    const finalCenterY = finals.top + finals.height / 2;\n\n    const translateX = finalCenterX - startCenterX;\n    const translateY = finalCenterY - startCenterY;\n\n    // Apply the transform with matrix (scale + translate)\n    element.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${translateX}, ${translateY})`;\n  }\n\n  static resetTransformMatrix(element) {\n    element.style.transform = `matrix(1, 0, 0, 1, 0, 0)`;\n  }\n}\n"],"names":[],"version":3,"file":"libra.min.js.map","sourceRoot":"../"}