{"version":3,"file":"live-preview-rails-client-FGupsMp_.js","sources":["../../../app/frontend/live-preview-client/run-scripts.js","../../../app/frontend/live-preview-client/rails.js","../../../app/frontend/entrypoints/live-preview-rails-client.js"],"sourcesContent":["export default function (element) {\n var scripts\n\n // Get the scripts\n scripts = element.getElementsByTagName('script')\n\n // Run them in sequence (remember NodeLists are live)\n continueLoading()\n\n function continueLoading() {\n var script, newscript\n\n // While we have a script to load...\n while (scripts.length) {\n // Get it and remove it from the DOM\n script = scripts[0]\n script.parentNode.removeChild(script)\n\n // Create a replacement for it\n newscript = document.createElement('script')\n\n // External?\n if (script.src) {\n // Yes, we'll have to wait until it's loaded before continuing\n newscript.onerror = continueLoadingOnError\n newscript.onload = continueLoadingOnLoad\n newscript.onreadystatechange = continueLoadingOnReady\n newscript.src = script.src\n } else {\n // No, we can do it right away\n newscript.text = script.text\n }\n\n // Start the script\n document.documentElement.appendChild(newscript)\n\n // If it's external, wait for callback\n if (script.src) {\n return\n }\n }\n\n // All scripts loaded\n newscript = undefined\n\n // Callback on most browsers when a script is loaded\n function continueLoadingOnLoad() {\n // Defend against duplicate calls\n if (this === newscript) {\n continueLoading()\n }\n }\n\n // Callback on most browsers when a script fails to load\n function continueLoadingOnError() {\n // Defend against duplicate calls\n if (this === newscript) {\n continueLoading()\n }\n }\n\n // Callback on IE when a script's loading status changes\n function continueLoadingOnReady() {\n // Defend against duplicate calls and check whether the\n // script is complete (complete = loaded or error)\n if (this === newscript && this.readyState === 'complete') {\n continueLoading()\n }\n }\n }\n}\n","import axios from 'axios'\nimport { debounce } from './utils'\nimport runScripts from './run-scripts'\n\nconst parentDocument = window.parent.document\nconst previewDocument = window.document\nconst csrfParam =\n window.location !== window.parent.location\n ? {\n [parentDocument\n .querySelector(\"meta[name='csrf-param']\")\n .getAttribute('content')]: parentDocument\n .querySelector(\"meta[name='csrf-token']\")\n .getAttribute('content'),\n }\n : {}\n\nconst start = () => {\n // Within a Rails site, no need to remove the event listeners\n window.addEventListener('maglev:section:add', addSection)\n window.addEventListener('maglev:section:move', moveSections)\n window.addEventListener('maglev:section:update', updateSection)\n window.addEventListener('maglev:section:remove', removeSection)\n window.addEventListener('maglev:block:add', replaceSection)\n window.addEventListener('maglev:block:move', replaceSection)\n window.addEventListener('maglev:block:update', updateBlock)\n window.addEventListener('maglev:block:remove', replaceSection)\n\n window.addEventListener('maglev:style:update', updateStyle)\n}\n\nexport default { start }\n\n// === Section related actions ===\n\nconst addSection = (event) => {\n const { content, section, insertAt } = event.detail\n debouncedUpdatePreviewDocument(content, section, insertAt)\n}\n\nconst moveSections = (event) => {\n const { sectionId, targetSectionId, direction } = event.detail\n\n const sectionElement = previewDocument.querySelector(\n `[data-maglev-section-id='${sectionId}']`,\n )\n const targetSectionElement = previewDocument.querySelector(\n `[data-maglev-section-id='${targetSectionId}']`,\n )\n\n if (direction === 'up')\n targetSectionElement.parentNode.insertBefore(\n sectionElement,\n targetSectionElement,\n )\n else\n targetSectionElement.parentNode.insertBefore(\n sectionElement,\n targetSectionElement.nextSibling,\n )\n\n // scroll to the new placement of the section\n sectionElement.scrollIntoView(true)\n}\n\nconst updateSection = (event) => {\n const { content, section, change } = event.detail\n updateSectionOrBlock(content, section, section, change)\n}\n\nconst removeSection = (event) => {\n const { sectionId } = event.detail\n const selector = `[data-maglev-section-id='${sectionId}']`\n let element = previewDocument.querySelector(selector)\n element.remove()\n}\n\n// === Block related actions ===\n\nconst updateBlock = (event) => {\n const { content, section, sectionBlock, change } = event.detail\n updateSectionOrBlock(content, section, sectionBlock, change)\n}\n\nconst replaceSection = (event) => {\n const { content, section } = event.detail\n debouncedUpdatePreviewDocument(content, section)\n}\n\n// === Other actions ===\n\nconst updateStyle = async (event) => {\n const { content, style } = event.detail\n\n const doc = await getUpdatedDoc({\n pageSections: JSON.stringify(content.pageSections),\n style: JSON.stringify(style),\n })\n\n // update the CSS variables\n const selector = '#maglev-style'\n const sourceElement = doc.querySelector(selector)\n let targetElement = previewDocument.querySelector(selector)\n\n if (sourceElement) {\n targetElement.replaceWith(sourceElement)\n }\n}\n\n// === Helpers ===\n\nconst updateSectionOrBlock = (content, section, source, change) => {\n const foundSetting = updateSetting(source, change)\n if (!foundSetting) debouncedUpdatePreviewDocument(content, section)\n}\n\nconst updateSetting = (source, change) => {\n switch (change.settingType) {\n case 'text':\n return updateTextSetting(source, change)\n case 'link':\n if (change.settingOptions.withText && change.value)\n return updateTextSetting(source, {\n ...change,\n value: change.value.text,\n settingId: `${change.settingId}.text`,\n })\n break\n default:\n // ok, we can't cherry-pick the modification so we have to refresh the whole section\n break\n }\n return false\n}\n\nconst updateTextSetting = (source, change) => {\n const selector = `[data-maglev-id='${source.id}.${change.settingId}']`\n const settings = previewDocument.querySelectorAll(selector)\n settings.forEach(($el) => ($el.innerHTML = change.value))\n return settings.length > 0\n}\n\nconst updatePreviewDocument = async (content, section, insertAt) => {\n const doc = await getUpdatedDoc({\n pageSections: JSON.stringify([\n content.pageSections.find((s) => s.id == section.id), // no need to render the other sections\n ]),\n })\n\n // NOTE: Instructions to refresh the whole document\n // removeEventListeners()\n // previewDocument.querySelector('body').replaceWith(doc.querySelector('body'))\n // setupEvents(previewDocument)\n\n const selector = `[data-maglev-section-id='${section.id}']`\n const sourceElement = doc.querySelector(selector)\n let targetElement = previewDocument.querySelector(selector)\n\n if (!sourceElement)\n throw new Error(`Maglev section ${section.id} not generated by the server`)\n\n if (targetElement) {\n targetElement.replaceWith(sourceElement)\n } else {\n insertSectionInDOM(sourceElement, insertAt)\n targetElement = previewDocument.querySelector(selector)\n }\n\n runScripts(targetElement)\n\n targetElement.scrollIntoView(true)\n}\n\nconst debouncedUpdatePreviewDocument = debounce(updatePreviewDocument, 300)\n\nconst insertSectionInDOM = (element, insertAt) => {\n switch (insertAt) {\n case 'top': {\n const parentNode = previewDocument.querySelector('[data-maglev-dropzone]')\n parentNode.prepend(element)\n break\n }\n case 'bottom':\n case undefined:\n case null:\n case '': {\n const parentNode = previewDocument.querySelector('[data-maglev-dropzone]')\n parentNode.appendChild(element)\n break\n }\n default: {\n const selector = `[data-maglev-section-id='${insertAt}']`\n const pivotElement = previewDocument.querySelector(selector)\n pivotElement.parentNode.insertBefore(element, pivotElement.nextSibling)\n }\n }\n}\n\nconst getUpdatedDoc = async (attributes) => {\n const { data } = await axios.post(previewDocument.location.href, {\n ...attributes,\n ...csrfParam,\n })\n const parser = new DOMParser()\n const doc = parser.parseFromString(data, 'text/html')\n return doc\n}\n","import Client from '~/live-preview-client/index'\nimport RailsClient from '~/live-preview-client/rails'\n\ndocument.addEventListener('DOMContentLoaded', () => {\n console.log('[Rails] Maglev Live Preview 🚀')\n if (Client.start()) {\n RailsClient.start()\n }\n})\n"],"names":["runScripts","element","scripts","continueLoading","script","newscript","continueLoadingOnError","continueLoadingOnLoad","continueLoadingOnReady","parentDocument","previewDocument","csrfParam","start","addSection","moveSections","updateSection","removeSection","replaceSection","updateBlock","updateStyle","RailsClient","event","content","section","insertAt","debouncedUpdatePreviewDocument","sectionId","targetSectionId","direction","sectionElement","targetSectionElement","change","updateSectionOrBlock","selector","sectionBlock","style","doc","getUpdatedDoc","sourceElement","targetElement","source","updateSetting","updateTextSetting","settings","$el","updatePreviewDocument","insertSectionInDOM","debounce","pivotElement","attributes","data","axios","Client"],"mappings":"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"}