=====380–520===== for (var i=0; i= 0 || t.indexOf('Graphics Composer') >= 0){ return textHits[k]; } } return null; } function ensurePlaceholder(panel){ if (!panel || !panel.parentNode) return null; var ph = document.createElement('div'); ph.setAttribute('data-cp-overlay-placeholder', '1'); panel.parentNode.insertBefore(ph, panel); return ph; } function showModal(){ var modal = ensureModal(); modal.classList.add('show'); modal.setAttribute('aria-hidden', 'false'); document.body.classList.add('appModalNoScroll'); } function hideModal(){ var modal = ensureModal(); modal.classList.remove('show'); modal.setAttribute('aria-hidden', 'true'); document.body.classList.remove('appModalNoScroll'); } function liftOverlayComposer(){ ensureStyle(); var modal = ensureModal(); var mount = q(MOUNT_ID); if (mount.__currentPanel) { showModal(); return true; } var panel = findOverlayComposerRoot(); if (!panel) { console.warn('Overlay composer root not found.'); return false; } if (panel.id === MODAL_ID || panel.closest('#' + MODAL_ID)) { showModal(); return true; } if (panel === modal) return false; // prevent legacy inline modal shell from showing behind ours var legacy = q('overlayComposerModal'); if (legacy && legacy !== panel) { legacy.classList.remove('show', 'is-open'); legacy.hidden = true; legacy.style.display = 'none'; } var placeholder = ensurePlaceholder(panel); mount.innerHTML = ''; mount.appendChild(panel); panel.classList.add('cp-overlay-lifted-panel'); panel.removeAttribute('hidden'); panel.style.display = 'block'; panel.style.position = 'relative'; panel.style.inset = 'auto'; panel.style.left = 'auto'; panel.style.top = 'auto'; panel.style.transform = 'none'; panel.style.width = '100%'; panel.style.height = 'auto'; panel.style.maxWidth = 'none'; panel.style.maxHeight = 'none'; mount.__currentPanel = panel; mount.__currentPlaceholder = placeholder; var title = q(TITLE_ID); if (title) title.textContent = 'Overlay Composer'; showModal(); return true; } function closeOverlayModal(){ var modal = ensureModal(); var mount = q(MOUNT_ID); if (mount.__currentPanel && mount.__currentPlaceholder) { try { mount.__currentPlaceholder.parentNode.insertBefore(mount.__currentPanel, mount.__currentPlaceholder); } catch(e) { console.warn('Failed to restore overlay composer panel', e); } mount.__currentPanel.classList.remove('cp-overlay-lifted-panel'); mount.__currentPanel.style.display = 'none'; mount.__currentPanel = null; mount.__currentPlaceholder = null; mount.innerHTML = ''; } hideModal(); } function suppressInlineOpeners(){ var ids = [ 'overlayComposerLauncher', 'btnOpenOverlayComposerStudio', 'btnOverlayComposer', 'btnOpenGraphicsComposer' ]; =====760–890===== var selectors = [ '[data-overlay-composer-root]', '.overlay-composer', '.overlayComposer', '.graphics-composer', '.graphicsComposer', '.oc-shell', '.oc-root', '.composer-shell' ]; for (var j=0; j= 0 || t.indexOf('Graphics Composer') >= 0){ return textHits[k]; } } return null; } function ensurePlaceholder(panel){ if (!panel || !panel.parentNode) return null; var ph = document.createElement('div'); ph.setAttribute('data-cp-overlay-placeholder', '1'); panel.parentNode.insertBefore(ph, panel); return ph; } function showModal(){ var modal = ensureModal(); modal.classList.add('show'); modal.setAttribute('aria-hidden', 'false'); document.body.classList.add('appModalNoScroll'); } function hideModal(){ var modal = ensureModal(); modal.classList.remove('show'); modal.setAttribute('aria-hidden', 'true'); document.body.classList.remove('appModalNoScroll'); } function liftOverlayComposer(){ ensureStyle(); var modal = ensureModal(); var mount = q(MOUNT_ID); if (mount.__currentPanel) { showModal(); return true; } var panel = findOverlayComposerRoot(); if (!panel) { console.warn('Overlay composer root not found.'); return false; } if (panel.id === MODAL_ID || panel.closest('#' + MODAL_ID)) { showModal(); return true; } if (panel === modal) return false; // prevent legacy inline modal shell from showing behind ours var legacy = q('overlayComposerModal'); if (legacy && legacy !== panel) { legacy.classList.remove('show', 'is-open'); legacy.hidden = true; legacy.style.display = 'none'; } var placeholder = ensurePlaceholder(panel); mount.innerHTML = ''; mount.appendChild(panel); panel.classList.add('cp-overlay-lifted-panel'); panel.removeAttribute('hidden'); panel.style.display = 'block'; panel.style.position = 'relative'; panel.style.inset = 'auto'; panel.style.left = 'auto'; panel.style.top = 'auto'; panel.style.transform = 'none'; panel.style.width = '100%'; panel.style.height = 'auto'; panel.style.maxWidth = 'none'; panel.style.maxHeight = 'none'; mount.__currentPanel = panel; mount.__currentPlaceholder = placeholder; var title = q(TITLE_ID); if (title) title.textContent = 'Overlay Composer'; showModal(); return true; } function closeOverlayModal(){ var modal = ensureModal(); var mount = q(MOUNT_ID); if (mount.__currentPanel && mount.__currentPlaceholder) { try { mount.__currentPlaceholder.parentNode.insertBefore(mount.__currentPanel, mount.__currentPlaceholder); } catch(e) { console.warn('Failed to restore overlay composer panel', e); } mount.__currentPanel.classList.remove('cp-overlay-lifted-panel'); mount.__currentPanel.style.display = 'none'; mount.__currentPanel = null; mount.__currentPlaceholder = null; mount.innerHTML = ''; } hideModal(); } function suppressInlineOpeners(){ =====240–980===== } .studioThumbLaunch .thumbArt{ display:flex; align-items:center; justify-content:center; text-align:center; font-weight:800; letter-spacing:.05em; line-height:1.15; } .studioThumbLaunch .thumbMeta{ display:flex; flex-direction:column; gap:2px; } .studioThumbLaunch .thumbMeta span{ font-size:11px; opacity:.82; } .studioThumbLaunch--media{ box-shadow: inset 0 0 0 1px rgba(0,188,212,.48); } .studioThumbLaunch--virtual{ box-shadow: inset 0 0 0 1px rgba(142,68,255,.48); } .studioThumbLaunch--transition{ box-shadow: inset 0 0 0 1px rgba(255,166,0,.52); }
Co‑Producer crashed (PHP)
Fix the fatal error below to restore UI.
Message: {$msg}
{$file}:{$line}
Trace
{$trace}
HTML; exit; }); // Catch fatal errors (E_ERROR / parse/runtime fatals) and avoid blank page register_shutdown_function(function() use ($__cp_log, $__CP_DEBUG) { $err = error_get_last(); if (!$err) return; $fatalTypes = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR]; if (!in_array($err['type'], $fatalTypes, true)) return; $msg = "[FATAL] {$err['message']} in {$err['file']}:{$err['line']} (type={$err['type']})"; @error_log($msg); if (!headers_sent()) { header('Content-Type: text/html; charset=UTF-8', true, 500); } @ob_clean(); $msg = htmlspecialchars($e->getMessage(), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $file = htmlspecialchars($e->getFile(), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $line = (int)$e->getLine(); $trace = htmlspecialchars($e->getTraceAsString(), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); http_response_code(200); header('Content-Type: text/html; charset=utf-8'); $__cp_inline_css = ''; $__cp_inline_js = ''; $__cp_css_path = __DIR__ . '/assets/css/coproducer.core.css'; $__cp_js_path = __DIR__ . '/assets/js/modules/stream.module.js'; if (is_file($__cp_css_path) && is_readable($__cp_css_path)) $__cp_inline_css = file_get_contents($__cp_css_path); if (is_file($__cp_js_path) && is_readable($__cp_js_path)) $__cp_inline_js = file_get_contents($__cp_js_path); echo << Co-Producer Error
Co‑Producer crashed (PHP)
Fix the fatal error below to restore UI.
Message: {$msg}
{$file}:{$line}
Trace
{$trace}
HTML; =====5280–5485===== wrap.style.gap="10px"; wrap.appendChild(rng); wrap.appendChild(out); return {wrap, rng, out}; } window.mkSelect = mkSelect; window.mkInput = mkInput; window.mkRange = mkRange; window.mkSelectSafe = mkSelectSafe; window.mkInputSafe = mkInputSafe; window.mkRangeSafe = mkRangeSafe; function addRow(label, inputEl){ const row = document.createElement("div"); row.className = "row"; const lab = document.createElement("label"); lab.textContent = label; row.appendChild(lab); row.appendChild(inputEl); fxBody.appendChild(row); } function buildSourceOptions(){ const opts = []; opts.push({value:"auto", label:"Auto"}); opts.push({value:"main", label:"Main (Preview source)"}); opts.push({value:"return", label:"Return (Host)"}); for (let i=0;i= 1) window.__lastFxKind = arguments[0]; if (arguments.length >= 2) window.__lastFxId = arguments[1]; if (arguments.length >= 3) window.__lastFxName = arguments[2]; return __cpForceModalOpen('fxModal'); } function closeFxModal() { return __cpForceModalClose('fxModal'); } function readModalValues(){ const out = {}; const els = fxBody.querySelectorAll("input, select, textarea"); for (const el of els){ const name = el.name; if (!name) continue; if (el.type === "checkbox") out[name] = !!el.checked; else if (el.type === "number" || el.type === "range") out[name] = el.value; else out[name] = el.value; } return out; } fxSave.onclick = ()=>{ if (!fxModalCtx){ closeFxModal(); return; } const {kind, id} = fxModalCtx; const v = readModalValues(); if (kind === "transition"){ fxState.transition.settings[id] = fxState.transition.settings[id] || {}; if (id !== "cut"){ fxState.transition.settings[id].dur = Math.max(80, Math.min(1800, parseInt(v.dur,10) || 520)); fxState.transition.settings[id].ease = String(v.ease || "ease"); if (id === "dip"){ fxState.transition.settings[id].color = String(v.color || "#000000"); } } } if (kind === "overlay"){ fxState.overlays.settings[id] = fxState.overlays.settings[id] || {}; const s = fxState.overlays.settings[id]; // content if (id === "lower"){ s.title = String(v.title || "TITLE"); s.subtitle = String(v.subtitle || ""); }else{ s.text = String(v.text || ""); } if (id === "ticker"){ s.speed = Math.max(5, Math.min(200, parseFloat(v.speed) || 40)); } // common s.opacity = Math.max(0, Math.min(1, parseFloat(v.opacity) || 1)); s.blend = String(v.blend || "normal"); s.anchor = String(v.anchor || s.anchor || "C"); s.offX = Math.max(-2000, Math.min(2000, parseFloat(v.offX) || 0)); s.offY = Math.max(-2000, Math.min(2000, parseFloat(v.offY) || 0)); s.scale = Math.max(0.2, Math.min(3, parseFloat(v.scale) || 1)); s.rot = Math.max(-360, Math.min(360, parseFloat(v.rot) || 0)); saveFx(); buildFxThumbs(); updatePreviewOverlays(); updateProgramOverlays(); closeFxModal(); return; } if (kind === "virtual"){ fxState.virtuals.settings[id] = fxState.virtuals.settings[id] || {}; const s = fxState.virtuals.settings[id]; if (id === "pip"){ s.pipSize = Math.max(0.18, Math.min(0.45, parseFloat(v.pipSize) || 0.30)); } // sources array const keys = Object.keys(v).filter(k=>/^src\d+$/.test(k)).sort((a,b)=>parseInt(a.slice(3),10)-parseInt(b.slice(3),10)); if (keys.length){ s.sources = keys.map(k=>String(v[k] || "auto")); } } if (kind === "guides"){ closeFxModal(); openGuidesSettings(); return; } saveFx(); buildFxThumbs(); updatePreviewPanel(); closeFxModal(); }; function updateOverlaysAfterToggle(){ updatePreviewOverlays(); updateProgramOverlays(); } } /* Guides icon: single click toggle, double click settings */ function applyGuidesPreset(preset){ const map = { "16:9": {w:1920, h:1080}, "9:16": {w:1080, h:1920}, "1:1": {w:1080, h:1080}, "4:3": {w:1440, h:1080} }; const p = map[preset] || map["16:9"]; const els = getGuidesModalEls(); if (els.pxw && (!els.pxw.value || Number(els.pxw.value) < 1)) els.pxw.value = String(p.w); if (els.pxh && (!els.pxh.value || Number(els.pxh.value) < 1)) els.pxh.value = String(p.h); } function loadGuidesIntoPanel(){ const els = getGuidesModalEls(); if (!els.modal) return; if (els.standard) els.standard.value = guidesState.standard || "16:9"; if (els.safe) els.safe.value = String(guidesState.safe ?? 0.08); if (els.grid) els.grid.checked = !!guidesState.grid; if (els.ruler) els.ruler.checked = !!guidesState.ruler; if (els.pixels) els.pixels.checked = !!guidesState.pixels; if (els.pxw) els.pxw.value = String(guidesState.pxw ?? 1920); if (els.pxh) els.pxh.value = String(guidesState.pxh ?? 1080); if (els.color) els.color.value = guidesState.color || "#00ff88"; if (els.opacity) els.opacity.value = String(guidesState.opacity ?? 0.75); if (els.thickness) els.thickness.value = String(guidesState.thickness ?? 1); } function openGuidesSettings() { return __cpForceModalOpen('guidesModal'); } function closeGuidesSettings() { return __cpForceModalClose('guidesModal'); } window.loadGuidesIntoPanel = loadGuidesIntoPanel; window.openGuidesSettings = openGuidesSettings; window.closeGuidesSettings = closeGuidesSettings; function saveGuidesFromPanel(){ const els = getGuidesModalEls(); const preset = (els.standard && els.standard.value) || "16:9"; const presets = { "16:9": {w:1920, h:1080}, "9:16": {w:1080, h:1920}, "1:1": {w:1080, h:1080}, "4:3": {w:1440, h:1080} }; const fallback = presets[preset] || presets["16:9"]; guidesState.standard = preset; guidesState.safe = Math.max(0, Math.min(0.20, parseFloat((els.safe && els.safe.value) || "0.08") || 0.08)); guidesState.grid = !!(els.grid && els.grid.checked); guidesState.ruler = !!(els.ruler && els.ruler.checked); guidesState.pixels = !!(els.pixels && els.pixels.checked); guidesState.pxw = Math.max(1, parseInt((els.pxw && els.pxw.value) || String(fallback.w), 10) || fallback.w); guidesState.pxh = Math.max(1, parseInt((els.pxh && els.pxh.value) || String(fallback.h), 10) || fallback.h); guidesState.color = String((els.color && els.color.value) || "#00ff88"); guidesState.opacity = Math.max(0.10, Math.min(1.00, parseFloat((els.opacity && els.opacity.value) || "0.75") || 0.75)); guidesState.thickness = Math.max(1, Math.min(4, parseInt((els.thickness && els.thickness.value) || "1", 10) || 1)); saveGuides(); =====6700–6765===== root.__fxDelegatedBound=true; function resolveFxThumb(target){ var el = target && target.closest ? target.closest('.fxThumb,.thumb.fxThumb,[data-composer-scene],[data-composer-launcher]') : null; if(!el) return null; if(el.closest && el.closest('#fxTransitions')) return {kind:'transition', el:el}; if(el.closest && (el.closest('#fxOverlays') || el.closest('#fxOverlayComposerThumbs'))) return {kind:'overlay', el:el}; if(el.closest && el.closest('#fxVirtuals')) return {kind:'virtual', el:el}; return null; } function inferInfo(info){ var el=info.el; var id = el.getAttribute('data-id') || el.dataset.id || el.dataset.fxId || el.dataset.sceneId || ''; var nameEl = el.querySelector('.name,b,.thumbName,.thumbMeta b'); var name = nameEl ? nameEl.textContent.trim() : (el.getAttribute('title') || id || info.kind); if(!id && el.getAttribute('data-composer-scene')==='1') id = (window.fxState&&window.fxState.overlays&&window.fxState.overlays.settings&&window.fxState.overlays.settings.composer&&window.fxState.overlays.settings.composer.sceneId) || 'composer'; return {kind: info.kind, id: id || name || info.kind, name: name || id || info.kind}; } root.addEventListener('contextmenu', function(ev){ var info=resolveFxThumb(ev.target); if(!info) return; ev.preventDefault(); ev.stopPropagation(); var x=inferInfo(info); if(typeof window.openFxSettings==='function') window.openFxSettings(x.kind,x.id,x.name); }, true); root.addEventListener('dblclick', function(ev){ var info=resolveFxThumb(ev.target); if(!info) return; ev.preventDefault(); ev.stopPropagation(); var x=inferInfo(info); if(typeof window.openFxSettings==='function') window.openFxSettings(x.kind,x.id,x.name); }, true); root.addEventListener('click', function(ev){ if(!ev.shiftKey) return; var info=resolveFxThumb(ev.target); if(!info) return; ev.preventDefault(); ev.stopPropagation(); var x=inferInfo(info); if(typeof window.openFxSettings==='function') window.openFxSettings(x.kind,x.id,x.name); }, true); } // Overlay composer direct open path through same engine var oc=q('overlayComposerModal'); if(oc){ window.openOverlayComposer = function(sceneId){ try { if (typeof window.__ocOpenComposerInner === 'function') window.__ocOpenComposerInner(sceneId); } catch(_){} show(oc); return false; }; var close = oc.querySelector('.ocClose,[data-close="overlay-composer"],.close,button[aria-label="Close"]'); if(close && !close.__lateBound){ close.__lateBound=true; close.addEventListener('click', function(ev){ ev.preventDefault(); ev.stopPropagation(); hide(oc); }, true); } } document.addEventListener('keydown', function(ev){ if(ev.key!=='Escape') return; ['overlayComposerModal','guidesModal','fxModal','mediaModal','streamModal','streamModalV3','skinOverlay','featureStudioModal'].forEach(hide); }, true); } if(document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot, {once:true}); else boot(); })(); (function(){ function dedupeGuidesSettingsButton(){ var nodes = document.querySelectorAll('#btnGuidesSettings'); if (!nodes || nodes.length <= 1) return; for (var i = 1; i < nodes.length; i++) { try { nodes[i].remove(); } catch(_){} } } if(document.readyState === 'loading') document.addEventListener('DOMContentLoaded', dedupeGuidesSettingsButton, {once:true}); else dedupeGuidesSettingsButton(); })();