{"version":3,"file":"live-preview-client-D835s2Fq.js","names":["start"],"sources":["../../../app/javascript/live-preview-client/utils.js","../../../app/javascript/live-preview-client/iframe-decorator.js","../../../app/javascript/live-preview-client/message.js","../../../app/javascript/live-preview-client/index.js"],"sourcesContent":["export const isBlank = (object) => {\n return (\n object === undefined ||\n object === null ||\n (typeof object === 'string' && object.length === 0) ||\n (typeof object === 'object' && object.length === 0)\n )\n}\n\nexport function debounce (fn, delay) {\n var timeoutID = null\n return function () {\n clearTimeout(timeoutID)\n var args = arguments\n var that = this\n timeoutID = setTimeout(function () {\n fn.apply(that, args)\n }, delay)\n }\n}","import { postMessage } from './message'\nimport { debounce, isBlank } from './utils'\n\n// keep track of the current hovered section\nlet listeners = []\nlet hoveredSectionId = null\n\n// ── Persistent block selection (outline stays until another block is selected) ──\nlet selectedBlockEl = null\nlet selectedBlockState = { sectionId: null, blockIndex: null }\n\nconst clearBlockSelection = () => {\n if (selectedBlockEl) {\n selectedBlockEl.style.outline = ''\n selectedBlockEl.style.outlineOffset = ''\n selectedBlockEl = null\n }\n}\n\nconst applyBlockSelection = (previewDocument) => {\n const { sectionId, blockIndex } = selectedBlockState\n clearBlockSelection()\n if (sectionId == null || blockIndex == null) return\n const sectionEl = previewDocument.querySelector(`[data-maglev-section-id='${sectionId}']`)\n if (!sectionEl) return\n const allBlocks = Array.from(sectionEl.querySelectorAll('[data-maglev-block-id]'))\n const blockEl = allBlocks[blockIndex]\n if (!blockEl) return\n selectedBlockEl = blockEl\n blockEl.style.outline = '2px solid rgba(91,141,238,0.85)'\n blockEl.style.outlineOffset = '-2px'\n}\n\nexport const start = (config) => {\n const previewDocument = window.document\n\n // editor → iframe: persistently highlight a selected block\n window.addEventListener('maglev:block:select', ({ detail: { sectionId, blockIndex } }) => {\n selectedBlockState = { sectionId, blockIndex }\n applyBlockSelection(previewDocument)\n })\n\n // Re-apply selection after section re-renders (debounced at 300ms in rails.js + buffer)\n ;['maglev:block:add', 'maglev:block:move', 'maglev:block:remove', 'maglev:section:update'].forEach((evt) => {\n window.addEventListener(evt, () => {\n setTimeout(() => applyBlockSelection(previewDocument), 350)\n })\n })\n\n // editor → iframe: re-emit hover with a fresh bounding rect after canvas resize\n window.addEventListener('maglev:section:requestRect', ({ detail: { sectionId } }) => {\n const el = previewDocument.querySelector(`[data-maglev-section-id='${sectionId}']`)\n if (!el) return\n postMessage('section:hover', {\n sectionId,\n sectionRect: el.getBoundingClientRect(),\n sectionOffsetTop: getMinTop(previewDocument, sectionId, config.stickySectionIds),\n })\n })\n\n // mousescroll\n listenScrolling(previewDocument)\n\n // mouseenter\n listen(previewDocument, 'mouseenter', (el, type) => {\n switch (type) {\n case 'section':\n return onSectionHovered(previewDocument, el, config.stickySectionIds)\n case 'block':\n return onBlockHovered(el)\n case 'setting':\n return onSettingHovered(el)\n default:\n break\n }\n })\n\n // mouseleave\n listen(previewDocument, 'mouseleave', (el, type) => {\n switch (type) {\n case 'section':\n return onSectionLeft(el)\n case 'block':\n return onBlockLeft()\n case 'setting':\n return onSettingLeft(el)\n default:\n break\n }\n })\n\n // click\n listen(previewDocument, 'click', (el, type, event) => {\n switch (type) {\n case 'setting':\n return onSettingClicked(el, event)\n case 'block':\n return onBlockClicked(el, event)\n case 'section':\n return onSectionClicked(el, event)\n default:\n break\n }\n })\n\n // click on links\n disableLinks(previewDocument)\n}\n\nconst listen = (previewDocument, eventType, handler) => {\n const capture = eventType === 'mouseenter' || eventType === 'mouseleave'\n addEventListener(\n previewDocument.body,\n eventType,\n (event) => {\n if (event.target === previewDocument) return\n\n let sectionElement = event.target.closest('[data-maglev-section-id]')\n let blockElement = event.target.closest('[data-maglev-block-id]')\n let settingElement = event.target.closest('[data-maglev-id]')\n let el = settingElement || blockElement || sectionElement\n\n // not related to maglev element, no need to continue\n if (!el) return\n\n if (eventType === 'mouseleave') {\n if (settingElement) {\n if (settingElement != event.target) return\n } else if (blockElement) {\n if (blockElement != event.target) return\n } else {\n if (sectionElement != event.target) return\n // special case: hovering the section-highlighter component from the parent document\n const rect = sectionElement.getBoundingClientRect()\n const scrollX = previewDocument.defaultView.scrollX\n const scrollY = previewDocument.defaultView.scrollY\n if (\n event.pageX > rect.left + scrollX &&\n event.pageX < rect.right + scrollX &&\n event.pageY > rect.top + scrollY &&\n event.pageY < rect.bottom + scrollY\n )\n return\n }\n }\n\n handler(el, getElementType(el), event)\n },\n capture,\n )\n}\n\nconst listenScrolling = (previewDocument) => {\n let mouseX = 0\n let mouseY = 0\n\n addEventListener(previewDocument, 'mousemove', (e) => {\n mouseX = e.clientX\n mouseY = e.clientY\n })\n\n const debouncedScrollNotifier = debounce(() => {\n const el = previewDocument\n .elementFromPoint(mouseX, mouseY)\n ?.closest('[data-maglev-section-id]')\n\n if (el) postMessage('scroll', { boundingRect: el.getBoundingClientRect() })\n }, 10)\n\n addEventListener(previewDocument, 'scroll', debouncedScrollNotifier)\n}\n\nconst onSectionHovered = (previewDocument, el, stickySectionIds) => {\n const sectionId = el.dataset.maglevSectionId\n if (hoveredSectionId !== sectionId) {\n postMessage('section:hover', {\n sectionId,\n sectionRect: el.getBoundingClientRect(),\n sectionOffsetTop: getMinTop(previewDocument, sectionId, stickySectionIds),\n })\n hoveredSectionId = sectionId\n }\n}\n\nconst getMinTop = (previewDocument, currentSectionId, stickySectionIds) => {\n for (var i = 0; i < stickySectionIds.length; i++) {\n const sectionId = stickySectionIds[i]\n if (sectionId === currentSectionId) return 0 // hovering a sticky section!\n\n const selector = `[data-maglev-section-id='${sectionId}']`\n const stickyElement = previewDocument.querySelector(selector)\n\n if (stickyElement) return stickyElement.offsetHeight // found sticky element found\n }\n return 0\n}\n\nconst onSectionLeft = () => {\n postMessage('section:leave')\n hoveredSectionId = null\n}\n\n// Single container for the block hover overlay (border + label chip).\n// Using a body-appended fixed div instead of CSS outline on the target element\n// avoids stale-reference bugs where mouseenter and click/mouseleave resolve\n// different elements via closest('[data-maglev-block-id]').\nlet blockOverlayEl = null\n\nconst removeBlockOverlay = () => {\n if (blockOverlayEl) {\n blockOverlayEl.remove()\n blockOverlayEl = null\n }\n}\n\nconst onBlockHovered = (el) => {\n removeBlockOverlay()\n\n const rect = el.getBoundingClientRect()\n const name = formatBlockName(el.dataset.maglevBlockId)\n\n blockOverlayEl = document.createElement('div')\n blockOverlayEl.style.cssText = [\n 'position:fixed',\n `top:${rect.top}px`,\n `left:${rect.left}px`,\n `width:${rect.width}px`,\n `height:${rect.height}px`,\n 'border:2px solid rgba(91,141,238,0.75)',\n 'box-sizing:border-box',\n 'z-index:2147483646',\n 'pointer-events:none',\n ].join(';')\n\n const chip = document.createElement('div')\n chip.textContent = name\n chip.style.cssText = [\n 'position:absolute',\n 'top:0',\n 'left:0',\n 'background:rgba(91,141,238,0.92)',\n 'color:#fff',\n 'font-size:10px',\n 'font-weight:600',\n 'font-family:-apple-system,BlinkMacSystemFont,\"Inter\",sans-serif',\n 'padding:2px 7px',\n 'border-radius:0 0 4px 0',\n 'line-height:17px',\n 'letter-spacing:0.02em',\n 'white-space:nowrap',\n ].join(';')\n\n blockOverlayEl.appendChild(chip)\n document.body.appendChild(blockOverlayEl)\n}\n\nconst onBlockLeft = (el) => {\n removeBlockOverlay()\n // Restore the selected outline if the block we just left is the selected one\n if (selectedBlockEl === null && selectedBlockState.sectionId) {\n applyBlockSelection(window.document)\n }\n}\n\nconst formatBlockName = (key) => {\n if (!key) return 'Block'\n // UUID-style keys (8+ hex chars) → generic label\n if (/^[0-9a-f]{6,}/i.test(key)) return 'Block'\n return key\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nconst onSettingHovered = (el) => {\n if (!el) return null\n el.style.outline = '2px solid transparent'\n el.style.outlineOffset = '2px'\n el.style.boxShadow = '0 0 0 2px var(--color-primary)'\n if (\n !el.style.borderRadius &&\n window.getComputedStyle(el).borderRadius === '0px'\n )\n el.style.borderRadius = '2px'\n}\n\nconst onSettingLeft = (el) => {\n el.style.boxShadow = 'none'\n}\n\nconst onBlockClicked = (el, event) => {\n const sectionEl = event.target.closest('[data-maglev-section-id]')\n if (!sectionEl) return\n\n // Clean up overlay — mouseleave won't fire on click, so do it here.\n removeBlockOverlay()\n\n // Block keys (data-maglev-block-id) are not globally unique — they fall back to\n // block type (\"bio\", \"feature\"…). Use the block's index within its section instead,\n // which is always unique and matches sections[sectionId].blocks[blockIndex].\n const allBlocks = Array.from(sectionEl.querySelectorAll('[data-maglev-block-id]'))\n const blockIndex = allBlocks.indexOf(el)\n\n postMessage('sectionBlock:clicked', {\n sectionId: sectionEl.dataset.maglevSectionId,\n blockIndex,\n })\n}\n\nconst onSectionClicked = (el, event) => {\n event.stopPropagation()\n postMessage('section:clicked', { sectionId: el.dataset.maglevSectionId })\n}\n\nconst onSettingClicked = (el, event) => {\n event.stopPropagation() & event.preventDefault()\n\n const fragments = el.dataset.maglevId.split('.')\n\n // is it a section or a block setting?\n const isSectionBlock = !!el.closest('[data-maglev-block-id]')\n const prefix = isSectionBlock ? 'sectionBlock' : 'section'\n\n postMessage(`${prefix}:setting:clicked`, {\n [`${prefix}Id`]: fragments[0],\n settingId: fragments[1],\n })\n}\n\nconst addEventListener = (target, type, listener, capture) => {\n listeners.push({ target, type, listener })\n target.addEventListener(type, listener, capture)\n}\n\nconst disableLinks = (previewDocument) => {\n addEventListener(previewDocument.body, 'click', (event) => {\n const link = event.target.closest('a')\n if (link && !isBlank(link.href)) {\n event.stopPropagation() & event.preventDefault()\n return false\n }\n })\n}\n\nconst getElementType = (el) => {\n if (el.dataset.maglevSectionId) return 'section'\n if (el.dataset.maglevBlockId) return 'block'\n return 'setting'\n}\n","import { start as decorateIframe } from './iframe-decorator'\n\nconst mainWindow = window.parent\n\nexport const listenMessages = () => {\n window.addEventListener('message', ({ data: { type, ...data } }) => {\n // a message MUST have a type\n if (!type) return\n\n switch (type) {\n case 'config':\n decorateIframe({\n stickySectionIds: data.stickySectionIds,\n })\n\n // we answer back we're ready!\n postMessage('ready', { message: \"👋, I'm a Maglev site and I'm ready\" })\n break\n case 'section:requestRect':\n case 'preview:refresh':\n case 'block:select':\n triggerEvent(type, data)\n break\n case 'section:add':\n case 'section:move':\n case 'section:update':\n case 'section:remove':\n case 'block:add':\n case 'block:move':\n case 'block:update':\n case 'block:remove':\n case 'themeSettings:update':\n triggerEvent(type, data)\n break\n default:\n console.log('[maglev][iframe] unknown message type', type)\n break\n }\n })\n}\n\nexport const postMessage = (type, data) => {\n mainWindow.postMessage({ type, ...(data || {}) }, '*')\n}\n\n// local event\nconst triggerEvent = (type, data) => {\n const event = new CustomEvent(`maglev:${type}`, { detail: data })\n window.dispatchEvent(event)\n}\n","import { listenMessages } from './message'\n\nconst start = () => {\n if (window.location === window.parent.location) {\n return false\n }\n listenMessages()\n return true\n}\n\nexport default { start }\n"],"mappings":"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"}