152:.overlayComposerBar{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 0 12px 0}
153:.overlayComposerNote{font-size:12px;opacity:.72}
154:.overlayComposerHead{margin:14px 0 8px 0;font-size:12px;letter-spacing:.12em;text-transform:uppercase;opacity:.78}
202:.appModalRoot,.overlay,.lkModal,.cpModal,#streamModalV3{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:24px;background:rgba(2,6,14,.62);backdrop-filter:blur(8px);opacity:0;visibility:hidden;pointer-events:none;transition:opacity .16s ease,visibility .16s ease;z-index:10050}
203:.appModalRoot.show,.overlay.show,.lkModal.show,.cpModal.show,#streamModalV3.show{opacity:1;visibility:visible;pointer-events:auto}
204:.overlay[aria-hidden="false"],.lkModal[aria-hidden="false"],.cpModal[aria-hidden="false"],#streamModalV3[aria-hidden="false"]{opacity:1;visibility:visible;pointer-events:auto}
205:.overlay[aria-hidden="true"],.lkModal[aria-hidden="true"],.cpModal[aria-hidden="true"],#streamModalV3[aria-hidden="true"]{opacity:0;visibility:hidden;pointer-events:none}
207:.lkModal__panel,.cpModalCard,#streamModalV3>.streamCard{transform:translateY(14px) scale(.985);transition:transform .16s ease,opacity .16s ease;opacity:.98}
208:.overlay.show>.sheet,.overlay.show>.modalSheet,.overlay.show>.modalCard,.overlay.show>.ocShell,.overlay.show>.cpModalCard,.overlay.show>.streamCard,
209:.lkModal.show .lkModal__panel,.cpModal.show>.cpModalCard,#streamModalV3.show>.streamCard,
211:.lkModal[aria-hidden="false"] .lkModal__panel,.cpModal[aria-hidden="false"]>.cpModalCard,#streamModalV3[aria-hidden="false"]>.streamCard{transform:translateY(0) scale(1);opacity:1}
274: document.querySelectorAll('.overlay,.lkModal,.cpModal,#streamModalV3').forEach(prep);
289: const open = Array.from(document.querySelectorAll('.overlay.show,.lkModal.show,.cpModal.show,#streamModalV3.show,[aria-hidden="false"].overlay,[aria-hidden="false"].lkModal,[aria-hidden="false"].cpModal,[aria-hidden="false"]#streamModalV3'));
291: if (top && typeof window.__modalHide === 'function') window.__modalHide(top);
303: var MODAL_ID = 'cpOverlayHardModal';
304: var MOUNT_ID = 'cpOverlayHardModalMount';
305: var TITLE_ID = 'cpOverlayHardModalTitle';
308: if (q('cpOverlayHardModalStyle')) return;
310: css.id = 'cpOverlayHardModalStyle';
337: '
',
342: '',
350: q('cpOverlayHardModalClose').addEventListener('click', function(ev){
353: closeOverlayModal();
356: modal.querySelector('[data-close-overlay-modal="1"]').addEventListener('click', function(ev){
359: closeOverlayModal();
364: closeOverlayModal();
371: function findOverlayComposerRoot(){
373: 'overlayComposerModal',
374: 'overlayComposer',
377: 'featureStudioModal'
388: '.overlayComposer',
420: function showModal(){
427: function hideModal(){
434: function liftOverlayComposer(){
440: showModal();
444: var panel = findOverlayComposerRoot();
450: if (panel.id === MODAL_ID || panel.closest('#' + MODAL_ID)) {
451: showModal();
458: var legacy = q('overlayComposerModal');
488: showModal();
492: function closeOverlayModal(){
511: hideModal();
516: 'overlayComposerLauncher',
517: 'btnOpenOverlayComposerStudio',
518: 'btnOverlayComposer',
531: liftOverlayComposer();
545: liftOverlayComposer();
551: q('overlayComposerModal'),
552: q('overlayComposer'),
559: if (el.closest('#' + MODAL_ID)) return;
598: window.openOverlayComposerHardModal = liftOverlayComposer;
599: window.closeOverlayComposerHardModal = closeOverlayModal;
662: document.querySelectorAll('.overlay,.lkModal,.cpModal,#streamModalV3').forEach(prep);
665: const open = Array.from(document.querySelectorAll('.overlay.show,.lkModal.show,.cpModal.show,#streamModalV3.show,[aria-hidden="false"].overlay,[aria-hidden="false"].lkModal,[aria-hidden="false"].cpModal,[aria-hidden="false"]#streamModalV3'));
667: if (top && typeof window.__modalHide === 'function') window.__modalHide(top);
679: var MODAL_ID = 'cpOverlayHardModal';
680: var MOUNT_ID = 'cpOverlayHardModalMount';
681: var TITLE_ID = 'cpOverlayHardModalTitle';
684: if (q('cpOverlayHardModalStyle')) return;
686: css.id = 'cpOverlayHardModalStyle';
713: '',
718: '',
726: q('cpOverlayHardModalClose').addEventListener('click', function(ev){
729: closeOverlayModal();
732: modal.querySelector('[data-close-overlay-modal="1"]').addEventListener('click', function(ev){
735: closeOverlayModal();
740: closeOverlayModal();
747: function findOverlayComposerRoot(){
749: 'overlayComposerModal',
750: 'overlayComposer',
753: 'featureStudioModal'
764: '.overlayComposer',
796: function showModal(){
803: function hideModal(){
810: function liftOverlayComposer(){
816: showModal();
820: var panel = findOverlayComposerRoot();
826: if (panel.id === MODAL_ID || panel.closest('#' + MODAL_ID)) {
827: showModal();
834: var legacy = q('overlayComposerModal');
864: showModal();
868: function closeOverlayModal(){
887: hideModal();
892: 'overlayComposerLauncher',
893: 'btnOpenOverlayComposerStudio',
894: 'btnOverlayComposer',
907: liftOverlayComposer();
921: liftOverlayComposer();
927: q('overlayComposerModal'),
928: q('overlayComposer'),
935: if (el.closest('#' + MODAL_ID)) return;
974: window.openOverlayComposerHardModal = liftOverlayComposer;
975: window.closeOverlayComposerHardModal = closeOverlayModal;
1169: // Ensure openHtmlModal exists (real modal, not alert)
1187: if (!document.querySelector('.overlay.show,.lkModal.show,.cpModal.show,#streamModalV3.show,[aria-hidden="false"].overlay,[aria-hidden="false"].lkModal,[aria-hidden="false"].cpModal,[aria-hidden="false"]#streamModalV3')) {
1195: root.addEventListener('click', function(ev){ if (ev.target === root) closeFn ? closeFn() : w.__modalHide(root); });
1199: if (typeof w.openHtmlModal !== 'function') {
1200: w.openHtmlModal = function(modalIdOrTitle, titleOrHtml, htmlMaybe, onMount){
1234: const close = ()=> w.__modalHide(root);
1247: // Wrap openBasicModal to use openHtmlModal instead of alert (if present later)
1248: if (typeof w.openBasicModal === 'function') {
1249: const prev = w.openBasicModal;
1250: w.openBasicModal = function(title, html){
1251: try { return w.openHtmlModal('basic', title, html); } catch(e){ return prev(title, html); }
1256: if (typeof w.openFxSettings !== 'function') w.openFxSettings = function(){};
1259: if (typeof w.openStreamModal !== 'function') w.openStreamModal = function(){};
1303: if (typeof w.openStreamModal !== "function") w.openStreamModal = function(){};
1316:
1528:
Composer Scenes
1529:
1612:
1949:const guidesModal = document.getElementById("guidesModal");
1950:const btnCloseGuidesModal = document.getElementById("btnCloseGuidesModal");
1964:function getGuidesModalEls(){
1966: modal: document.getElementById("guidesModal"),
1967: btnClose: document.getElementById("btnCloseGuidesModal"),
1990:const skinOverlay = document.getElementById("skinOverlay");
2078:function openGuestFramingModal(slotIdx){
2119: openHtmlModal("guest-framing", "Guest Framing / Crop", html, (root)=>{
2171: console.warn("openGuestFramingModal failed", e);
2229:if (qaStream) qaStream.onclick = ()=>{ openStreamModal(); };
2231:{ const __btnStream = document.getElementById("btnStream"); if (__btnStream) __btnStream.onclick = ()=>{ openStreamModal(); }; }
2290: if (!skinOverlay) return;
2291: if (typeof window.__modalShow === "function") window.__modalShow(skinOverlay);
2292: else { skinOverlay.classList.add("show"); skinOverlay.setAttribute("aria-hidden","false"); }
2295: if (!skinOverlay) return;
2296: if (typeof window.__modalHide === "function") window.__modalHide(skinOverlay);
2297: else { skinOverlay.classList.remove("show"); skinOverlay.setAttribute("aria-hidden","true"); }
2359:if (skinOverlay) skinOverlay.addEventListener("click",(e)=>{
2360: if (e.target === skinOverlay) closeSkin();
2364: if (skinOverlay.classList.contains("show")) closeSkin();
3007: wireClickAndDbl(wrap, null, ()=>openGuestFramingModal(s.idx));
3008: wireClickAndDbl(scr, null, ()=>openGuestFramingModal(s.idx));
3464: id: "btnOpenOverlayComposerStudio",
3469: open: ()=> (typeof window.openOverlayComposer === "function") ? window.openOverlayComposer() : null
4502: ()=> openFxSettings("transition", d.id, d.name)
4522: ()=> openFxSettings("overlay", d.id, d.name)
4541: ()=> openFxSettings("virtual", d.id, d.name)
4549:const fxModal = document.createElement("div");
4550:fxModal.className = "overlay";
4551:fxModal.id = "fxModal";
4552:fxModal.setAttribute("aria-hidden","true");
4553:fxModal.innerHTML = `
4565:document.body.appendChild(fxModal);
4568:const mediaModal = document.createElement("div");
4569:mediaModal.className = "overlay";
4570:mediaModal.id = "mediaModal";
4571:mediaModal.setAttribute("aria-hidden","true");
4572:mediaModal.innerHTML = `
4584:document.body.appendChild(mediaModal);
4586:const mediaTitle = mediaModal.querySelector("#mediaTitle");
4587:const mediaBody = mediaModal.querySelector("#mediaBody");
4588:const mediaClose = mediaModal.querySelector("#mediaClose");
4589:const mediaSave = mediaModal.querySelector("#mediaSave");
4590:let mediaModalId = null;
4592:mediaClose.onclick = ()=> closeMediaModal();
4593:mediaModal.addEventListener("click",(e)=>{ if (e.target === mediaModal) closeMediaModal(); });
4639: return __cpForceModalOpen('mediaModal');
4643:function closeMediaModal() {
4645: return __cpForceModalClose('mediaModal');
4650: if (!mediaModalId){ closeMediaModal(); return; }
4659: setMediaSettings(mediaModalId, {
4683: closeMediaModal();
4839:const streamModal = document.createElement("div");
4840:streamModal.className="overlay";
4841:streamModal.id="streamModal";
4842:streamModal.setAttribute("aria-hidden","true");
4843:streamModal.innerHTML = `
4899:document.body.appendChild(streamModal);
4901:const streamClose = streamModal.querySelector("#streamClose");
4902:const streamEndpoint = streamModal.querySelector("#streamEndpoint");
4903:const streamToken = streamModal.querySelector("#streamToken");
4904:const streamSaveCfg = streamModal.querySelector("#streamSaveCfg");
4905:const streamTimeout = streamModal.querySelector("#streamTimeout");
4906:const streamPoll = streamModal.querySelector("#streamPoll");
4907:const streamAdd = streamModal.querySelector("#streamAdd");
4908:const streamStartEnabled = streamModal.querySelector("#streamStartEnabled");
4909:const streamStopAll = streamModal.querySelector("#streamStopAll");
4910:const streamList = streamModal.querySelector("#streamList");
4911:const streamRoomBadge = streamModal.querySelector("#streamRoomBadge");
4912:const streamLogEl = streamModal.querySelector("#streamLog");
4913:const streamCopyLog = streamModal.querySelector("#streamCopyLog");
4914:const streamClearLog = streamModal.querySelector("#streamClearLog");
4916:streamClose.onclick = ()=> closeStreamModal();
4917:streamModal.addEventListener("click",(e)=>{ if (e.target === streamModal) closeStreamModal(); });
4918:document.addEventListener("keydown",(e)=>{ if (e.key === "Escape" && streamModal.classList.contains("show")) closeStreamModal(); });
4920:function openStreamModal() {
4922: return __cpForceModalOpen(document.getElementById('streamModalV3') ? 'streamModalV3' : 'streamModal');
4925:function closeStreamModal() {
4927: __cpForceModalClose('streamModalV3');
4928: return __cpForceModalClose('streamModal');
5189: if (!streamModal.classList.contains("show")) return;
5233:const fxTitle = fxModal.querySelector("#fxTitle");
5234:const fxBody = fxModal.querySelector("#fxBody");
5235:const fxClose = fxModal.querySelector("#fxClose");
5236:const fxSave = fxModal.querySelector("#fxSave");
5238:let fxModalCtx = null;
5240:fxClose.onclick = ()=>closeFxModal();
5241:fxModal.addEventListener("click",(e)=>{ if (e.target === fxModal) closeFxModal(); });
5318:function openFxSettings(kind, id, name) {
5323: return __cpForceModalOpen('fxModal');
5327:function closeFxModal() {
5329: return __cpForceModalClose('fxModal');
5347: if (!fxModalCtx){ closeFxModal(); return; }
5348: const {kind, id} = fxModalCtx;
5388: closeFxModal();
5408: closeFxModal();
5409: openGuidesSettings();
5416: closeFxModal();
5434: const els = getGuidesModalEls();
5439: const els = getGuidesModalEls();
5452:function openGuidesSettings() {
5454: return __cpForceModalOpen('guidesModal');
5457:function closeGuidesSettings() {
5459: return __cpForceModalClose('guidesModal');
5463:window.openGuidesSettings = openGuidesSettings;
5464:window.closeGuidesSettings = closeGuidesSettings;
5466: const els = getGuidesModalEls();
5488: closeGuidesSettings();
5507:if (btnGuidesSettings) btnGuidesSettings.addEventListener("click", openGuidesSettings);
5509: if (ev.target && ev.target.id === "btnCloseGuidesModal") closeGuidesSettings();
5513: const gm = document.getElementById("guidesModal");
5514: if (gm && ev.target === gm) closeGuidesSettings();
5521: const els = getGuidesModalEls();
5526: const gm = document.getElementById("guidesModal");
5527: if (ev.key === "Escape" && gm && !gm.hidden) closeGuidesSettings();
6553:
6640:
6641:
6643:
Preview Guides
6644: