Writer Jeff Ihaza sits down with ‪@ASAPROCKYUPTOWN‬ in Red Hook as he reflects on #dontbedumb, fatherhood, fashion, Harlem, and the world he helped build. At 37, Rocky is preparing for his first #tour since 2019’s run, a return to the stage that he sees as both an act of discipline and celebration. He talks about the preparation that goes into touring, the left turns on his new album, and why he’s not interested in giving listeners "McDonald’s" anymore. Rocky also opens up about raising three children with ‪@rihanna‬ and how family has changed the way he records. More than a decade after 'Live. Love. ASAP,' Rocky sounds less interested in nostalgia than in figuring out what comes next.


Read the cover story at VIBE.com

© 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(); } })();