A behind the scenes look at GloRilla's VIBE magazine cover shoot. Raw moments, real energy, and the work that goes into making an iconic image.



© 2026 Partlii · All rights reserved.

(function () { const ROW_HEIGHT = 280; const GAP = 12; const RADIUS = 8; function extractImageUrl(el) { const img = el.querySelector("img"); if (img && img.src) return img.src; const nodes = [el, ...el.querySelectorAll("*")]; for (const node of nodes) { const bg = window.getComputedStyle(node).backgroundImage; const match = bg && bg.match(/url\(["']?(.*?)["']?\)/); if (match && match[1]) return match[1]; } return null; } function measureRatio(url) { return new Promise((resolve) => { const probe = new Image(); probe.onload = () => { resolve( probe.naturalWidth > 0 && probe.naturalHeight > 0 ? probe.naturalWidth / probe.naturalHeight : 1.5 ); }; probe.onerror = () => resolve(1.5); probe.src = url; }); } const ratioCache = new Map(); async function layoutOne(container) { const items = Array.from(container.children); if (items.length === 0) { console.warn("[justified-gallery] container found but has no items:", container); return; } const ratios = await Promise.all( items.map(async (el) => { if (ratioCache.has(el)) return ratioCache.get(el); const url = extractImageUrl(el); if (!url) console.warn("[justified-gallery] couldn't find an image URL in item:", el); const ratio = url ? await measureRatio(url) : 1.5; ratioCache.set(el, ratio); return ratio; }) ); const containerWidth = container.getBoundingClientRect().width; if (containerWidth <= 0) return; container.style.position = "relative"; let cursorY = 0; let current = []; function flushRow() { if (current.length === 0) return; const gapTotal = GAP * (current.length - 1); const available = Math.max(containerWidth - gapTotal, 1); const widthAtTarget = current.reduce( (sum, e) => sum + ROW_HEIGHT * e.ratio, 0 ); const scale = available / Math.max(widthAtTarget, 1); const rowHeight = ROW_HEIGHT * scale; let cursorX = 0; current.forEach(({ el, ratio }) => { const w = rowHeight * ratio; el.style.position = "absolute"; el.style.left = cursorX + "px"; el.style.top = cursorY + "px"; el.style.width = w + "px"; el.style.height = rowHeight + "px"; el.style.margin = "0"; el.style.borderRadius = RADIUS + "px"; el.style.overflow = "hidden"; cursorX += w + GAP; }); cursorY += rowHeight + GAP; current = []; } items.forEach((el, i) => { const ratio = ratios[i]; current.push({ el, ratio }); const gapTotal = GAP * (current.length - 1); const widthAtTarget = current.reduce((sum, e) => sum + ROW_HEIGHT * e.ratio, 0) + gapTotal; if (widthAtTarget >= containerWidth) flushRow(); }); flushRow(); container.style.height = Math.max(cursorY - GAP, 0) + "px"; container.style.opacity = "1"; } function applyAll() { const containers = document.querySelectorAll('[data-framer-name="JustifiedGallery"]'); console.log("[justified-gallery] found", containers.length, "container(s)"); containers.forEach((container) => { if (container.style.opacity !== "1") { container.style.opacity = "0"; container.style.transition = "opacity 160ms ease"; } layoutOne(container); }); } function debounce(fn, ms) { let t; return (...args) => { clearTimeout(t); t = setTimeout(() => fn(...args), ms); }; } function init() { applyAll(); const debouncedApply = debounce(applyAll, 150); window.addEventListener("resize", debouncedApply); const mo = new MutationObserver(debouncedApply); mo.observe(document.body, { childList: true, subtree: true }); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } })();