{"version":3,"file":"ProjectReelBus.DPB3HUdB.mjs","names":[],"sources":["https:/framerusercontent.com/modules/2KpHOF37AOj9QTxTwcEN/zHHEHvZIRYMItTbvGoTg/ProjectReelBus.js"],"sourcesContent":["// ProjectReelBus.ts (FULL REPLACEMENT)\n// Adds a HARD-GATE: closeProjectList() will never close if session is missing.\n// This prevents external / Framer / mode-change callers from randomly closing the overlay.\n// All real closes must pass the session they intend to close.\nlet reelState={active:1,total:1};let uiState={listOpen:false,preview:1,chromeHidden:false,listSession:0};// ===== Work mode =====\nlet workMode=\"design\";const workModeSubs=new Set;const reelSubs=new Set;const uiSubs=new Set;const cmdSubs=new Set;const DBG={enabled:false,verbose:false,captureStacks:true,maxEvents:400};const events=[];function nowMs(){return typeof performance!==\"undefined\"&&performance.now?performance.now():Date.now();}function safeStack(skipLines=0){try{const s=new Error().stack||\"\";if(!s)return\"\";const lines=s.split(\"\\n\");return lines.slice(1+skipLines).join(\"\\n\");}catch{return\"\";}}function pushEvent(name,data,forceStack=false){if(!DBG.enabled)return;const ev={t:nowMs(),name,data,stack:DBG.captureStacks||forceStack?safeStack(1):undefined};events.push(ev);if(events.length>DBG.maxEvents)events.splice(0,events.length-DBG.maxEvents);if(DBG.verbose){try{console.log(`[ProjectReelBus] ${name}`,data??\"\");}catch{}}}function installGlobalDebugApi(){if(typeof window===\"undefined\")return;if(window.__PSBUS__)return;window.__PSBUS__={state:()=>({reelState,uiState,workMode}),set:partial=>{Object.assign(DBG,partial);return{...DBG};},events:()=>[...events],dump:(n=120)=>events.slice(Math.max(0,events.length-n)).map(e=>({t:Math.round(e.t),name:e.name,data:e.data,stack:e.stack})),clear:()=>events.splice(0,events.length),// Convenience: show only close/open events\nclosings:(n=50)=>events.filter(e=>e.name.startsWith(\"ui:openProjectList\")||e.name.startsWith(\"ui:closeProjectList\")||e.name.startsWith(\"ui:setChromeHidden\")).slice(-n).map(e=>({t:Math.round(e.t),name:e.name,reason:e?.data?.reason,session:e?.data?.session,curSession:e?.data?.curSession,wasOpen:e?.data?.wasOpen})),// Convenience: last close call stacks\ncloseStacks:(n=10)=>events.filter(e=>e.name===\"ui:closeProjectList:call\").slice(-n).map(e=>({t:Math.round(e.t),reason:e?.data?.reason,session:e?.data?.session,curSession:e?.data?.curSession,stack:e.stack}))};}installGlobalDebugApi();/* =========================================================\n   API\n   ========================================================= */// ---------- Project reel ----------\nexport function getProjectReelState(){return reelState;}export function subscribeProjectReelState(fn){reelSubs.add(fn);fn(reelState);return()=>reelSubs.delete(fn);}export function setProjectReelState(next){const prev=reelState;reelState={...reelState,...next};reelSubs.forEach(fn=>fn(reelState));pushEvent(\"reel:setProjectReelState\",{prev,next,cur:reelState});const max=Math.max(1,reelState.total);if(uiState.preview>max){const prevUi=uiState;uiState={...uiState,preview:max};uiSubs.forEach(fn=>fn(uiState));pushEvent(\"ui:clampPreviewToTotal\",{prevUi,curUi:uiState,max});}}// ---------- UI (overlay) ----------\n// ===== Scheduled close (prevents \"old closeHold timer\" closing a new overlay) =====\nlet pendingCloseTimer=null;let pendingCloseMeta=null;function clearPendingClose(reason){if(pendingCloseTimer!=null){try{window.clearTimeout(pendingCloseTimer);}catch{}pendingCloseTimer=null;pendingCloseMeta=null;pushEvent(\"ui:closeProjectList:scheduled:clear\",{reason});}}// Call this instead of setTimeout in components\nexport function scheduleCloseProjectList(session,delayMs,reason){clearPendingClose(\"reschedule\");pendingCloseMeta={session,reason};pushEvent(\"ui:closeProjectList:scheduled:set\",{session,delayMs,reason},true);pendingCloseTimer=window.setTimeout(()=>{pendingCloseTimer=null;const meta=pendingCloseMeta;pendingCloseMeta=null;if(!meta)return;closeProjectList(meta.session,meta.reason??\"scheduledClose\");},Math.max(0,delayMs|0));}export function getUiState(){return uiState;}export function subscribeUiState(fn){uiSubs.add(fn);fn(uiState);return()=>uiSubs.delete(fn);}export function setChromeHidden(hidden,reason){const prev=uiState.chromeHidden;pushEvent(\"ui:setChromeHidden:call\",{hidden,prev,listOpen:uiState.listOpen,reason},true);uiState={...uiState,chromeHidden:hidden};uiSubs.forEach(fn=>fn(uiState));pushEvent(\"ui:setChromeHidden:commit\",{hidden,prev,cur:uiState.chromeHidden,reason});}export function openProjectList(reason){clearPendingClose(\"openProjectList\");pushEvent(\"ui:openProjectList:call\",{curSession:uiState.listSession,listOpen:uiState.listOpen,reason},true);const nextSession=(uiState.listSession??0)+1;const prevUi=uiState;uiState={listOpen:true,preview:reelState.active,chromeHidden:true,listSession:nextSession};uiSubs.forEach(fn=>fn(uiState));pushEvent(\"ui:openProjectList:commit\",{prevUi,curUi:uiState,reason});}// ✅ NEW SIGNATURE: closeProjectList(session?, reason?)\nexport function closeProjectList(session,reason){const curSession=uiState.listSession;const wasOpen=uiState.listOpen;pushEvent(\"ui:closeProjectList:call\",{session,curSession,wasOpen,reason},true);// ✅ HARD-GATE: if session is missing, never close.\n// This prevents external callers (mode-change / Framer internals) from randomly closing the overlay.\nif(typeof session!==\"number\"){pushEvent(\"ui:closeProjectList:WARN:noSession\",{curSession,wasOpen,reason});return;}// Session-aware close: only close if the session matches the currently open overlay session.\nif(!uiState.listOpen){pushEvent(\"ui:closeProjectList:ignore:notOpen\",{session,curSession,reason});return;}if(session!==uiState.listSession){pushEvent(\"ui:closeProjectList:ignore:staleSession\",{session,curSession,reason});return;}// If we are closing the active session, kill any scheduled close too\nclearPendingClose(\"closeProjectList\");const prevUi=uiState;uiState={...uiState,listOpen:false,chromeHidden:false};uiSubs.forEach(fn=>fn(uiState));pushEvent(\"ui:closeProjectList:commit\",{prevUi,curUi:uiState,session,curSession,reason});}export function setProjectListPreview(id,reason){const prev=uiState.preview;uiState={...uiState,preview:id};uiSubs.forEach(fn=>fn(uiState));pushEvent(\"ui:setProjectListPreview\",{prev,next:id,listOpen:uiState.listOpen,reason});}// ---------- Commands ----------\nexport function subscribeCommands(fn){cmdSubs.add(fn);return()=>cmdSubs.delete(fn);}export function scrollToProject(id,reason,source=\"default\"){pushEvent(\"cmd:scrollToProject\",{id,reason,source},true);cmdSubs.forEach(fn=>fn({type:\"scrollTo\",id,source}));}export function setActiveProject(id,reason){pushEvent(\"cmd:setActiveProject\",{id,reason},true);cmdSubs.forEach(fn=>fn({type:\"setActive\",id}));setProjectReelState({active:id});}// ===== Work mode API =====\nexport function getWorkMode(){return workMode;}export function subscribeWorkMode(fn){workModeSubs.add(fn);fn(workMode);return()=>workModeSubs.delete(fn);}export function setWorkMode(next){if(next===workMode)return;pushEvent(\"mode:setWorkMode:call\",{prev:workMode,next},true);cmdSubs.forEach(fn=>fn({type:\"WORK_MODE_WILL_CHANGE\",next}));pushEvent(\"mode:WORK_MODE_WILL_CHANGE\",{next});workMode=next;workModeSubs.forEach(fn=>fn(workMode));pushEvent(\"mode:setWorkMode:commit\",{cur:workMode});cmdSubs.forEach(fn=>fn({type:\"WORK_MODE_DID_CHANGE\",next}));pushEvent(\"mode:WORK_MODE_DID_CHANGE\",{next});}export function toggleWorkMode(){setWorkMode(workMode===\"design\"?\"photo\":\"design\");}\nexport const __FramerMetadata__ = {\"exports\":{\"scheduleCloseProjectList\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"setProjectReelState\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"subscribeProjectReelState\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"subscribeUiState\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ProjectReelState\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"setChromeHidden\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getWorkMode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"toggleWorkMode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"UiState\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getUiState\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"setActiveProject\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"closeProjectList\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"subscribeWorkMode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getProjectReelState\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"setProjectListPreview\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"openProjectList\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"subscribeCommands\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"setWorkMode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"scrollToProject\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ProjectReelBus.map"],"mappings":"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"}