{
  "version": 3,
  "sources": ["/cdn/shop/t/69/assets/myom-reviews.js?nocache=1791303652"],
  "sourcesContent": ["/*\n * MYOM reviews: 5-star photo/video reviews from the Loox Storefront API in an equal-height card grid.\n * Vanilla JS, no dependencies. Everything from the API goes into the DOM via textContent or validated\n * URL attributes; innerHTML is never used with API data.\n *\n * Selection rule: every card is a 5-star product review with at least one photo or video.\n *   - rating=5 is filtered server-side (the API supports a `rating` filter).\n *   - \"has media\" is filtered client-side (no such API filter). sort=featured puts photo/video reviews\n *     first, so one page of limit=250 normally holds the whole pool; we page further only while a page\n *     still yields qualifying reviews, up to MAX_REQUESTS per page load.\n *   - Store reviews (/store-reviews) carry no media in this API, so they can never qualify and are not fetched.\n *   - The pool is then ordered newest first (client-side, by review date), so the grid and \"Show more\"\n *     run in date order while the fetch itself keeps the featured sort that gathers the pool in one request.\n *   - Only complete rows are shown; fewer than MIN_CARDS qualifying reviews hides the section.\n *   - The merged, filtered pool is cached in sessionStorage for CACHE_TTL_MS.\n *\n * API (public store ID in the URL, CORS-restricted to the store's domain, Cache-Control max-age=60):\n *   GET {base}/product-reviews/bottomline                              -> { totalReviews, averageRating }\n *   GET {base}/product-reviews?rating=5&sort=featured&direction=desc&limit=250&page=N&total=T\n *                                                                        -> { reviews: [...], pagination: { page, total, hasMore } }\n */\n(function () {\n  'use strict';\n\n  var API_BASE = 'https://storefront-api.loox.io/storefront/v1/store/';\n  var PAGE_LIMIT = 250;          // API maximum\n  var MAX_REQUESTS = 6;          // review-list requests per page load (bottomline not counted)\n  var CACHE_TTL_MS = 60 * 1000;  // matches the API's own max-age=60\n  var CACHE_VERSION = 'v3';\n\n  var dateFormat;\n  try {\n    dateFormat = new Intl.DateTimeFormat('en-GB', { day: 'numeric', month: 'short', year: 'numeric' });\n  } catch (e) {\n    dateFormat = null;\n  }\n\n  var numberFormat;\n  try {\n    numberFormat = new Intl.NumberFormat('en-GB');\n  } catch (e) {\n    numberFormat = null;\n  }\n\n  function el(tag, className, text) {\n    var node = document.createElement(tag);\n    if (className) node.className = className;\n    if (text !== undefined && text !== null) node.textContent = String(text);\n    return node;\n  }\n\n  // If a product thumbnail 404s (e.g. a product since deleted), drop the <img> so the thumbnail box shows empty.\n  function removeOnError(img) {\n    img.addEventListener('error', function () {\n      if (img.parentNode) img.parentNode.removeChild(img);\n    });\n    return img;\n  }\n\n  function safeUrl(value, allowHttpUpgrade) {\n    if (typeof value !== 'string' || !value) return null;\n    var url;\n    try {\n      url = new URL(value, window.location.origin);\n    } catch (e) {\n      return null;\n    }\n    if (url.protocol === 'http:' && allowHttpUpgrade) url.protocol = 'https:';\n    if (url.protocol !== 'https:') return null;\n    return url.href;\n  }\n\n  function formatDate(iso) {\n    if (!iso) return '';\n    var d = new Date(iso);\n    if (isNaN(d.getTime())) return '';\n    return dateFormat ? dateFormat.format(d) : d.toLocaleDateString();\n  }\n\n  function formatCount(n) {\n    return numberFormat ? numberFormat.format(n) : String(n);\n  }\n\n  function clampRating(value) {\n    var n = Math.round(Number(value));\n    if (!isFinite(n)) return 0;\n    return Math.min(5, Math.max(0, n));\n  }\n\n  function starSvg(empty) {\n    var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    svg.setAttribute('viewBox', '0 0 24 24');\n    svg.setAttribute('aria-hidden', 'true');\n    svg.setAttribute('focusable', 'false');\n    if (empty) svg.setAttribute('class', 'is-empty');\n    var path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n    path.setAttribute('d', 'M12 2.5l2.95 6.1 6.7.9-4.9 4.7 1.2 6.7L12 17.7l-5.95 3.2 1.2-6.7-4.9-4.7 6.7-.9z');\n    svg.appendChild(path);\n    return svg;\n  }\n\n  function stars(rating, label) {\n    var n = clampRating(rating);\n    var wrap = el('span', 'myom-reviews__stars');\n    wrap.setAttribute('role', 'img');\n    wrap.setAttribute('aria-label', label || ('Rated ' + n + ' out of 5 stars'));\n    for (var i = 1; i <= 5; i++) wrap.appendChild(starSvg(i > n));\n    return wrap;\n  }\n\n  function verifiedBadge() {\n    var badge = el('span', 'myom-review-card__verified');\n    var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    svg.setAttribute('viewBox', '0 0 20 20');\n    svg.setAttribute('aria-hidden', 'true');\n    svg.setAttribute('focusable', 'false');\n    svg.setAttribute('fill', 'currentColor');\n    var path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n    path.setAttribute('d', 'M10 1.5l2.2 1.6 2.7-.3 1 2.5 2.5 1-.3 2.7 1.6 2.2-1.6 2.2.3 2.7-2.5 1-1 2.5-2.7-.3L10 18.5l-2.2-1.6-2.7.3-1-2.5-2.5-1 .3-2.7L.3 9.8l1.6-2.2-.3-2.7 2.5-1 1-2.5 2.7.3zm-1.1 11.3l5-5-1.4-1.4-3.6 3.6-1.8-1.8-1.4 1.4z');\n    svg.appendChild(path);\n    badge.appendChild(svg);\n    badge.appendChild(el('span', null, 'Verified'));\n    return badge;\n  }\n\n  function reviewerName(review) {\n    var name = review && review.reviewer && review.reviewer.name;\n    return typeof name === 'string' && name.trim() ? name.trim() : 'Anonymous';\n  }\n\n  function mediaOf(review) {\n    var media = review && Array.isArray(review.media) ? review.media : [];\n    return media.filter(function (m) {\n      if (!m || (m.type !== 'photo' && m.type !== 'video')) return false;\n      if (!safeUrl(m.url)) return false;\n      if (m.type === 'video' && !safeUrl(m.thumbnailUrl)) return false; // the card needs a poster image\n      return true;\n    });\n  }\n\n  function reviewTime(review) {\n    var t = Date.parse(review.date || review.createdAt || '');\n    return isNaN(t) ? 0 : t;\n  }\n\n  // Newest first; ties keep the API's featured order (stable sort via index).\n  function sortNewestFirst(pool) {\n    return pool\n      .map(function (review, index) { return { review: review, index: index, t: reviewTime(review) }; })\n      .sort(function (a, b) { return b.t - a.t || a.index - b.index; })\n      .map(function (entry) { return entry.review; });\n  }\n\n  function qualifies(review) {\n    return !!review && typeof review === 'object' && typeof review.id === 'string' &&\n      clampRating(review.rating) === 5 && mediaOf(review).length > 0;\n  }\n\n  function productRow(product) {\n    if (!product || typeof product !== 'object') return null;\n    var name = typeof product.name === 'string' ? product.name.trim() : '';\n    var image = safeUrl(product.imageUrl);\n    var href = safeUrl(product.url, true);\n    if (!name && !image) return null;\n\n    var row = el('div', 'myom-review-card__product');\n    var thumb = el('span', 'myom-review-card__product-thumb');\n    if (image) {\n      var img = el('img');\n      img.src = image;\n      img.alt = '';\n      img.loading = 'lazy';\n      img.decoding = 'async';\n      img.width = 40;\n      img.height = 40;\n      thumb.appendChild(removeOnError(img));\n    }\n    row.appendChild(thumb);\n\n    if (href) {\n      var link = el('a', 'myom-review-card__product-link', name || 'View product');\n      link.href = href;\n      row.appendChild(link);\n    } else {\n      row.appendChild(el('span', 'myom-review-card__product-name', name));\n    }\n    return row;\n  }\n\n  /* sessionStorage cache of the filtered pool (per store ID), 60 s */\n  function cacheKey(storeId) {\n    return 'myom-reviews:' + CACHE_VERSION + ':' + storeId;\n  }\n\n  function readCache(storeId) {\n    try {\n      var raw = window.sessionStorage.getItem(cacheKey(storeId));\n      if (!raw) return null;\n      var data = JSON.parse(raw);\n      if (!data || typeof data.t !== 'number' || Date.now() - data.t > CACHE_TTL_MS) return null;\n      if (!Array.isArray(data.pool)) return null;\n      return data;\n    } catch (e) {\n      return null;\n    }\n  }\n\n  function writeCache(storeId, data) {\n    try {\n      window.sessionStorage.setItem(cacheKey(storeId), JSON.stringify(data));\n    } catch (e) {\n      /* storage disabled or full: ignore */\n    }\n  }\n\n  function MyomReviews(root) {\n    this.root = root;\n    this.storeId = (root.getAttribute('data-store-id') || '').trim();\n    this.apiBase = (root.getAttribute('data-api-base') || API_BASE) + encodeURIComponent(this.storeId);\n    this.perPage = Math.max(1, Math.min(48, parseInt(root.getAttribute('data-per-page'), 10) || 8));\n    this.desktopColumns = Math.max(1, Math.min(6, parseInt(root.getAttribute('data-columns'), 10) || 4));\n    this.minCards = Math.max(1, parseInt(root.getAttribute('data-min-cards'), 10) || 4);\n    this.shopName = root.getAttribute('data-shop-name') || 'MYOM Shop';\n\n    this.grid = root.querySelector('[data-grid]');\n    this.status = root.querySelector('[data-status]');\n    this.error = root.querySelector('[data-error]');\n    this.showMore = root.querySelector('[data-show-more]');\n    this.summary = root.querySelector('[data-summary]');\n    this.summarySkeleton = root.querySelector('[data-summary-skeleton]');\n    this.lightbox = root.querySelector('[data-lightbox]');\n    this.sectionWrap = root.closest('.shopify-section') || root.closest('.section') || root;\n\n    this.pool = [];             // qualifying reviews, in featured order\n    this.seen = {};\n    this.cards = [];            // rendered <li>, one per pool entry\n    this.target = this.perPage; // how many cards the visitor has asked for\n    this.nextPage = null;       // { page, total } while the API has more pages\n    this.lastPageYielded = true;\n    this.requests = 0;          // review-list requests this page load (exposed for verification)\n    this.bottomline = null;\n    this.loading = false;\n    this.lastFocus = null;\n\n    if (!this.storeId || !this.grid) return;\n\n    var self = this;\n    if (this.showMore) {\n      this.showMore.addEventListener('click', function () { self.loadMore(); });\n    }\n    this.mq900 = window.matchMedia('(max-width: 900px)');\n    this.mq560 = window.matchMedia('(max-width: 560px)');\n    var onChange = function () { self.applyLayout(); };\n    if (this.mq900.addEventListener) {\n      this.mq900.addEventListener('change', onChange);\n      this.mq560.addEventListener('change', onChange);\n    } else {\n      this.mq900.addListener(onChange);\n      this.mq560.addListener(onChange);\n    }\n    this.setupLightbox();\n\n    this.loadSummary();\n    this.loadInitial();\n  }\n\n  MyomReviews.prototype.columns = function () {\n    if (this.mq560.matches) return 1;\n    if (this.mq900.matches) return 2;\n    return this.desktopColumns;\n  };\n\n  MyomReviews.prototype.fetchJson = function (url) {\n    return fetch(url, { headers: { Accept: 'application/json' } }).then(function (response) {\n      if (!response.ok) throw new Error('Loox API responded ' + response.status);\n      return response.json();\n    });\n  };\n\n  MyomReviews.prototype.pageUrl = function (page, total) {\n    var url = this.apiBase + '/product-reviews?rating=5&sort=featured&direction=desc&limit=' + PAGE_LIMIT + '&page=' + page;\n    if (typeof total === 'number' && isFinite(total)) url += '&total=' + total;\n    return url;\n  };\n\n  MyomReviews.prototype.loadSummary = function () {\n    if (!this.summary) return;\n    var self = this;\n    var cached = readCache(this.storeId);\n    if (cached && cached.bottomline) {\n      this.renderSummary(cached.bottomline);\n      return;\n    }\n    this.fetchJson(this.apiBase + '/product-reviews/bottomline').then(function (data) {\n      self.renderSummary(data);\n      self.persist();\n    }).catch(function () {\n      if (self.summarySkeleton) self.summarySkeleton.hidden = true;\n    });\n  };\n\n  MyomReviews.prototype.renderSummary = function (bottomline) {\n    var total = Number(bottomline && bottomline.totalReviews);\n    var average = Number(bottomline && bottomline.averageRating);\n    if (this.summarySkeleton) this.summarySkeleton.hidden = true;\n    if (!isFinite(total) || !isFinite(average) || total <= 0) return;\n    this.bottomline = { totalReviews: total, averageRating: average };\n    var ratingText = average.toFixed(1);\n    var starsEl = this.summary.querySelector('[data-summary-stars]');\n    if (starsEl) {\n      starsEl.textContent = '';\n      starsEl.appendChild(stars(average, 'Rated ' + ratingText + ' out of 5'));\n    }\n    var ratingEl = this.summary.querySelector('[data-summary-rating]');\n    if (ratingEl) ratingEl.textContent = ratingText + '/5';\n    var countEl = this.summary.querySelector('[data-summary-count]');\n    if (countEl) countEl.textContent = formatCount(total) + ' reviews';\n    this.summary.hidden = false;\n  };\n\n  MyomReviews.prototype.persist = function () {\n    writeCache(this.storeId, {\n      t: Date.now(),\n      pool: this.pool,\n      nextPage: this.nextPage,\n      lastPageYielded: this.lastPageYielded,\n      bottomline: this.bottomline\n    });\n  };\n\n  MyomReviews.prototype.setBusy = function (busy) {\n    this.grid.setAttribute('aria-busy', busy ? 'true' : 'false');\n  };\n\n  MyomReviews.prototype.announce = function (text) {\n    if (this.status) this.status.textContent = text;\n  };\n\n  MyomReviews.prototype.hideSkeletons = function () {\n    Array.prototype.forEach.call(this.grid.querySelectorAll('[data-skeleton]'), function (node) {\n      node.hidden = true;\n    });\n  };\n\n  MyomReviews.prototype.hideSection = function () {\n    this.hideSkeletons();\n    this.setBusy(false);\n    this.sectionWrap.hidden = true;\n    this.sectionWrap.style.display = 'none';\n    this.announce('');\n  };\n\n  /* Absorb one API page into the pool. Returns how many new qualifying reviews it added. */\n  MyomReviews.prototype.absorb = function (data) {\n    var list = data && Array.isArray(data.reviews) ? data.reviews : [];\n    var pagination = data && data.pagination && typeof data.pagination === 'object' ? data.pagination : {};\n    var added = 0;\n    for (var i = 0; i < list.length; i++) {\n      var review = list[i];\n      if (!qualifies(review) || this.seen[review.id]) continue;\n      this.seen[review.id] = true;\n      this.pool.push(review);\n      added++;\n    }\n    if (added) this.pool = sortNewestFirst(this.pool);\n    var page = parseInt(pagination.page, 10);\n    var total = parseInt(pagination.total, 10);\n    this.nextPage = pagination.hasMore && isFinite(page) && page >= 1\n      ? { page: page + 1, total: isFinite(total) ? total : null }\n      : null;\n    this.lastPageYielded = added > 0;\n    return added;\n  };\n\n  /* Worth asking the API for another page? Featured sort front-loads media, so a page with no\n     qualifying reviews means the remaining pages have none either. */\n  MyomReviews.prototype.canFetchMore = function () {\n    return !!this.nextPage && this.lastPageYielded && this.requests < MAX_REQUESTS;\n  };\n\n  /* Fetch pages until the pool covers `needed` cards or there is nothing more worth fetching. */\n  MyomReviews.prototype.fill = function (needed) {\n    var self = this;\n    if (this.pool.length >= needed || !this.canFetchMore()) return Promise.resolve();\n    this.requests++;\n    return this.fetchJson(this.pageUrl(this.nextPage.page, this.nextPage.total)).then(function (data) {\n      self.absorb(data);\n      self.persist();\n      return self.fill(needed);\n    });\n  };\n\n  MyomReviews.prototype.loadInitial = function () {\n    var self = this;\n    this.setBusy(true);\n    this.announce('Loading reviews');\n\n    var cached = readCache(this.storeId);\n    if (cached) {\n      cached.pool.forEach(function (review) {\n        if (qualifies(review) && !self.seen[review.id]) {\n          self.seen[review.id] = true;\n          self.pool.push(review);\n        }\n      });\n      this.pool = sortNewestFirst(this.pool);\n      this.nextPage = cached.nextPage || null;\n      this.lastPageYielded = cached.lastPageYielded !== false;\n      this.fromCache = true;\n    } else {\n      this.nextPage = { page: 1, total: null };\n      this.lastPageYielded = true;\n    }\n\n    this.fill(this.target).then(function () {\n      self.finishLoad();\n    }).catch(function () {\n      if (self.pool.length >= self.minCards) {\n        self.finishLoad();\n        return;\n      }\n      self.hideSkeletons();\n      self.setBusy(false);\n      if (self.error) self.error.hidden = false;\n      self.announce('Reviews could not be loaded');\n    });\n  };\n\n  MyomReviews.prototype.finishLoad = function () {\n    if (this.pool.length < this.minCards) {\n      this.hideSection();\n      return;\n    }\n    this.renderCards();\n    this.applyLayout();\n    this.hideSkeletons();\n    this.setBusy(false);\n  };\n\n  MyomReviews.prototype.loadMore = function () {\n    if (this.loading || !this.showMore) return;\n    var self = this;\n    var previousVisible = this.visibleCount();\n    this.target += this.perPage;\n    this.loading = true;\n\n    var label = this.showMore.querySelector('[data-show-more-label]');\n    var originalLabel = label ? label.textContent : '';\n    this.showMore.disabled = true;\n    if (label) label.textContent = 'Loading\u2026';\n    this.setBusy(true);\n\n    this.fill(this.target).catch(function () {\n      self.announce('More reviews could not be loaded. Please try again.');\n    }).then(function () {\n      self.loading = false;\n      self.renderCards();\n      self.applyLayout();\n      self.setBusy(false);\n      self.showMore.disabled = false;\n      if (label) label.textContent = originalLabel;\n      var card = self.cards[previousVisible];\n      if (card && !card.hidden) {\n        var focusTarget = card.querySelector('button, a');\n        if (focusTarget) focusTarget.focus({ preventScroll: true });\n      }\n    });\n  };\n\n  /* Bring the grid's cards into line with the pool: one card per review, in pool (newest-first) order.\n     Existing cards are reused by review ID; new ones are created hidden until applyLayout decides. */\n  MyomReviews.prototype.renderCards = function () {\n    var byId = {};\n    this.cards.forEach(function (card) { byId[card.getAttribute('data-review-id')] = card; });\n    var cards = [];\n    for (var i = 0; i < this.pool.length; i++) {\n      var review = this.pool[i];\n      var card = byId[review.id];\n      if (!card) {\n        card = this.renderCard(review);\n        card.hidden = true;\n      }\n      cards.push(card);\n      this.grid.appendChild(card); // appendChild moves an existing node, so this also reorders\n    }\n    this.cards.forEach(function (card) {\n      if (cards.indexOf(card) === -1 && card.parentNode) card.parentNode.removeChild(card);\n    });\n    this.cards = cards;\n  };\n\n  /* Cards to show: min(target, pool) rounded down to whole rows at the current column count. */\n  MyomReviews.prototype.visibleCount = function () {\n    var cols = this.columns();\n    var available = Math.min(this.target, this.cards.length);\n    return Math.floor(available / cols) * cols;\n  };\n\n  MyomReviews.prototype.applyLayout = function () {\n    if (this.sectionWrap.hidden) return;\n    var visible = this.visibleCount();\n    if (visible === 0 && this.cards.length) {\n      this.hideSection();\n      return;\n    }\n    for (var i = 0; i < this.cards.length; i++) this.cards[i].hidden = i >= visible;\n\n    var moreAvailable = this.cards.length > visible || this.canFetchMore();\n    if (this.showMore) this.showMore.hidden = !moreAvailable;\n    if (visible) this.announce('Showing ' + visible + ' reviews');\n  };\n\n  /* A review photo that fails to load would leave a blank square: drop that card and re-flow. */\n  MyomReviews.prototype.dropCard = function (card) {\n    var index = this.cards.indexOf(card);\n    if (index === -1) return;\n    this.cards.splice(index, 1);\n    this.pool.splice(index, 1);\n    if (card.parentNode) card.parentNode.removeChild(card);\n    this.persist();\n    this.applyLayout();\n  };\n\n  MyomReviews.prototype.renderCard = function (review) {\n    var self = this;\n    var name = reviewerName(review);\n    var card = el('li', 'myom-review-card');\n    card.setAttribute('data-review-id', review.id);\n    card.setAttribute('data-rating', String(clampRating(review.rating)));\n\n    var media = el('div', 'myom-review-card__media');\n    var first = mediaOf(review)[0];\n    var img = el('img');\n    img.src = first.type === 'video' ? safeUrl(first.thumbnailUrl) : safeUrl(first.url);\n    img.alt = (first.type === 'video' ? 'Video from ' : 'Photo from ') + name + \"'s review\";\n    img.loading = 'lazy';\n    img.decoding = 'async';\n    img.width = 600;\n    img.height = 600;\n    img.addEventListener('error', function () { self.dropCard(card); });\n    media.appendChild(img);\n    if (first.type === 'video') media.classList.add('myom-review-card__media--video');\n    card.appendChild(media);\n\n    var body = el('div', 'myom-review-card__body');\n\n    var meta = el('div', 'myom-review-card__meta');\n    meta.appendChild(el('span', 'myom-review-card__name', name));\n    if (review.verified) meta.appendChild(verifiedBadge());\n    var dateText = formatDate(review.date || review.createdAt);\n    if (dateText) {\n      var time = el('time', 'myom-review-card__date', dateText);\n      var iso = review.date || review.createdAt;\n      if (typeof iso === 'string') time.setAttribute('datetime', iso);\n      meta.appendChild(time);\n    }\n    body.appendChild(meta);\n\n    body.appendChild(stars(review.rating, name + ' rated it ' + clampRating(review.rating) + ' out of 5 stars'));\n\n    var text = typeof review.body === 'string' ? review.body.trim() : '';\n    body.appendChild(el('p', 'myom-review-card__text', text));\n\n    var more = el('button', 'myom-review-card__more', 'Read full review');\n    more.type = 'button';\n    more.setAttribute('aria-label', 'Read full review by ' + name);\n    more.addEventListener('click', function () { self.openLightbox(review, more); });\n    body.appendChild(more);\n\n    var product = productRow(review.product);\n    if (product) body.appendChild(product);\n\n    card.appendChild(body);\n    return card;\n  };\n\n  /* Lightbox: native <dialog> for Esc + inert background, plus explicit focus trap and focus return. */\n  MyomReviews.prototype.setupLightbox = function () {\n    if (!this.lightbox) return;\n    var self = this;\n    var dialog = this.lightbox;\n    var closeBtn = dialog.querySelector('[data-lightbox-close]');\n\n    if (closeBtn) closeBtn.addEventListener('click', function () { self.closeLightbox(); });\n\n    dialog.addEventListener('cancel', function (event) {\n      event.preventDefault();\n      self.closeLightbox();\n    });\n\n    dialog.addEventListener('click', function (event) {\n      if (event.target === dialog) self.closeLightbox();\n    });\n\n    dialog.addEventListener('keydown', function (event) {\n      if (event.key === 'Escape') {\n        event.preventDefault();\n        self.closeLightbox();\n        return;\n      }\n      if (event.key !== 'Tab') return;\n      var focusable = dialog.querySelectorAll('button:not([disabled]), a[href], video[controls], [tabindex]:not([tabindex=\"-1\"])');\n      if (!focusable.length) {\n        event.preventDefault();\n        return;\n      }\n      var first = focusable[0];\n      var last = focusable[focusable.length - 1];\n      if (event.shiftKey && document.activeElement === first) {\n        event.preventDefault();\n        last.focus();\n      } else if (!event.shiftKey && document.activeElement === last) {\n        event.preventDefault();\n        first.focus();\n      }\n    });\n\n    dialog.addEventListener('close', function () {\n      var content = dialog.querySelector('[data-lightbox-content]');\n      if (content) content.textContent = '';\n      if (self.lastFocus && typeof self.lastFocus.focus === 'function') {\n        self.lastFocus.focus({ preventScroll: true });\n      }\n      self.lastFocus = null;\n    });\n  };\n\n  MyomReviews.prototype.openLightbox = function (review, opener) {\n    var dialog = this.lightbox;\n    if (!dialog) return;\n    var content = dialog.querySelector('[data-lightbox-content]');\n    var title = dialog.querySelector('[data-lightbox-title]');\n    var name = reviewerName(review);\n    content.textContent = '';\n    if (title) title.textContent = 'Review by ' + name;\n\n    var items = mediaOf(review);\n    if (items.length) {\n      var mediaList = el('ul', 'myom-reviews-lightbox__media');\n      items.forEach(function (item, index) {\n        var li = el('li');\n        if (item.type === 'video') {\n          var video = el('video');\n          video.controls = true;\n          video.preload = 'none';\n          video.setAttribute('playsinline', '');\n          video.poster = safeUrl(item.thumbnailUrl);\n          video.src = safeUrl(item.url);\n          video.setAttribute('aria-label', 'Video from ' + name + \"'s review\");\n          li.appendChild(video);\n        } else {\n          var img = el('img');\n          img.src = safeUrl(item.url);\n          img.alt = 'Photo from ' + name + \"'s review\" + (items.length > 1 ? ' (' + (index + 1) + ' of ' + items.length + ')' : '');\n          img.loading = index === 0 ? 'eager' : 'lazy';\n          img.decoding = 'async';\n          li.appendChild(removeOnError(img));\n        }\n        mediaList.appendChild(li);\n      });\n      content.appendChild(mediaList);\n    }\n\n    var meta = el('div', 'myom-reviews-lightbox__meta');\n    meta.appendChild(el('span', 'myom-review-card__name', name));\n    if (review.verified) meta.appendChild(verifiedBadge());\n    var dateText = formatDate(review.date || review.createdAt);\n    if (dateText) meta.appendChild(el('time', 'myom-review-card__date', dateText));\n    content.appendChild(meta);\n\n    content.appendChild(stars(review.rating, name + ' rated it ' + clampRating(review.rating) + ' out of 5 stars'));\n\n    var text = typeof review.body === 'string' ? review.body.trim() : '';\n    if (text) content.appendChild(el('p', 'myom-reviews-lightbox__text', text));\n\n    if (Array.isArray(review.customQuestions) && review.customQuestions.length) {\n      var dl = el('dl', 'myom-reviews-lightbox__questions');\n      review.customQuestions.forEach(function (q) {\n        if (!q || typeof q.question !== 'string' || typeof q.answer !== 'string') return;\n        dl.appendChild(el('dt', null, q.question));\n        dl.appendChild(el('dd', null, q.answer));\n      });\n      if (dl.childNodes.length) content.appendChild(dl);\n    }\n\n    var reply = review.reply;\n    if (reply && typeof reply === 'object' && typeof reply.body === 'string' && reply.body.trim()) {\n      var replyBox = el('div', 'myom-reviews-lightbox__reply');\n      var head = el('div', 'myom-reviews-lightbox__reply-head');\n      head.appendChild(el('strong', null, 'Reply from ' + this.shopName));\n      var repliedAt = formatDate(reply.repliedAt);\n      if (repliedAt) head.appendChild(el('span', 'myom-review-card__date', repliedAt));\n      replyBox.appendChild(head);\n      replyBox.appendChild(el('p', null, reply.body.trim()));\n      content.appendChild(replyBox);\n    }\n\n    var product = productRow(review.product);\n    if (product) content.appendChild(product);\n\n    this.lastFocus = opener || document.activeElement;\n    if (typeof dialog.showModal === 'function') {\n      if (!dialog.open) dialog.showModal();\n    } else {\n      dialog.setAttribute('open', '');\n    }\n    var closeBtn = dialog.querySelector('[data-lightbox-close]');\n    if (closeBtn) closeBtn.focus();\n    dialog.querySelector('[data-lightbox-content]').scrollTop = 0;\n  };\n\n  MyomReviews.prototype.closeLightbox = function () {\n    var dialog = this.lightbox;\n    if (!dialog) return;\n    if (typeof dialog.close === 'function' && dialog.open) {\n      dialog.close();\n    } else {\n      dialog.removeAttribute('open');\n      dialog.dispatchEvent(new Event('close'));\n    }\n  };\n\n  function init(scope) {\n    var roots = (scope || document).querySelectorAll('[data-myom-reviews]');\n    Array.prototype.forEach.call(roots, function (root) {\n      if (root.myomReviews) return;\n      root.myomReviews = new MyomReviews(root);\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', function () { init(); });\n  } else {\n    init();\n  }\n\n  // Shopify theme editor: re-initialise when the section is (re)loaded.\n  document.addEventListener('shopify:section:load', function (event) { init(event.target); });\n})();\n"],
  "mappings": "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",
  "names": ["card"]
}
