PageSourceSearch

https://app.mockit.ai/assets/Layout-6lQu8bHh.js

js mockit.ai collected 2026-10-05 12:17:27 UTC 44,011 bytes, 1 lines download raw bytes

1import{r as n,j as f,a as It}from"./index-ezPvDX_Q.js";import{d as I,z as B,w as Pt,b as Ut,c as Gt}from"./index-CiCtIybz.js";import Bt from"./ImageGrid-Z9uH5W1X.js";import{g as Kt,c as ft,h as pt,C as Pe}from"./ControlPanel-CS805Po4.js";import{A as gt}from"./ArtworkUpload-DDo9Phle.js";import{M as Lt,B as Ft,p as Vt,a as qt,u as $t,A as Wt}from"./mockitlogo-m-DC_Uqnbv.js";import{D as ke}from"./UserContext-CjeeaHi9.js";import{u as zt}from"./useCreditRefresh-BBxlDlF0.js";import{c as Ht}from"./subscription-CkUo7Wv7.js";import{h as Yt}from"./mockupState-BFkRHvNS.js";import{n as me}from"./artworkEffects-BLZGdzae.js";import{G as ht}from"./constants-BlJrhuYO.js";import"./index-WsJ2kbdz.js";import"./download-ggMBArp9.js";import"./functions-ByS8FYUr.js";import"./productKitViews-bS-g0kG7.js";import"./x-hl2gIG65.js";import"./env-Br8t7GFD.js";import"./variant-DhhsaQ7u.js";import"./editprompt-D26ZtX5J.js";import"./z-image-model-B3fYjSaj.js";import"./model-check-CM9KH_Av.js";import"./authImage-BqG_pPRp.js";import"./demoDestinations-Cx5YIP9O.js";const Qt=()=>null,bt=32,Xt=({tabs:t=[],activeDraftId:g=null,used:d=0,limit:a=0,canCreate:y=!0,isCreating:l=!1,activatingDraftId:o=null,onActivate:u,onCreate:c,onClose:A,onRename:h})=>{const[x,S]=n.useState(null),[v,C]=n.useState(""),J=n.useMemo(()=>a?`${d}/${a}`:"",[d,a]),b=E=>{S(E.id),C(E.name||"")},V=async E=>{if(!E)return;const N=(v||"").trim().slice(0,bt);S(null),C(""),N&&await h?.(E,N)};return f.jsxs("div",{"data-tour-id":"draft-tabs",className:"relative h-12 bg-[var(--app-bg)] px-3 flex items-end gap-2 overflow-x-auto overflow-y-visible",children:[f.jsx("div",{"aria-hidden":"true",className:"pointer-events-none absolute inset-x-0 bottom-0 h-px bg-[var(--app-border-strong)]"}),t.map(E=>{const N=E.id===g,$=E.id===o,D=E.id===x;return f.jsxs("div",{className:`relative z-10 h-9 min-w-[170px] max-w-[250px] px-3 rounded-t-lg border flex items-center gap-2 ${N?"bg-[var(--app-bg)] border-[var(--app-border-strong)] border-b-0 text-[var(--text-primary)]":"bg-[var(--app-surface-soft)] border-[var(--app-border)] text-[var(--text-muted)] hover:text-[var(--text-primary)]"}`,children:[f.jsx("button",{type:"button",onClick:()=>u?.(E.id),onDoubleClick:()=>b(E),disabled:$,className:"min-w-0 flex-1 text-left text-[12px] font-medium truncate disabled:cursor-wait",title:E.name,children:D?f.jsx("input",{autoFocus:!0,value:v,maxLength:bt,onChange:W=>C(W.target.value),onBlur:()=>V(E.id),onKeyDown:W=>{W.key==="Enter"&&(W.preventDefault(),V(E.id)),W.key==="Escape"&&(W.preventDefault(),S(null),C(""))},className:"w-full bg-transparent border border-[var(--app-border-strong)] rounded px-1.5 py-0.5 text-[12px] text-[var(--text-primary)] focus:outline-none"}):f.jsxs("span",{className:"inline-flex min-w-0 items-center gap-2",children:[$?f.jsx("span",{"aria-hidden":"true",className:"h-3 w-3 shrink-0 animate-spin rounded-full border border-current border-t-transparent"}):null,f.jsx("span",{className:"truncate",children:E.name})]})}),!D&&f.jsx("button",{type:"button",onClick:W=>{W.stopPropagation(),b(E)},className:"p-1 rounded text-[var(--text-muted)] hover:text-[var(--text-primary)] hover:bg-[var(--app-card-muted)]",title:"Rename tab",children:f.jsx(Lt,{size:13})}),f.jsx("button",{type:"button",onClick:W=>{W.stopPropagation(),A?.(E.id)},className:"p-1 rounded text-[var(--text-muted)] hover:text-[var(--text-primary)] hover:bg-[var(--app-card-muted)]",title:"Close tab",children:f.jsx(Ft,{size:14})})]},E.id)}),f.jsx("button",{type:"button",onClick:()=>c?.(),disabled:!y||l,className:"h-8 w-8 shrink-0 rounded-md text-[var(--text-secondary)] inline-flex items-center justify-center hover:bg-[var(--app-card-muted)] disabled:opacity-50 disabled:cursor-not-allowed",title:y?"New tab":"Draft tab limit reached",children:f.jsx(Vt,{size:16})}),J?f.jsx("div",{className:"ml-auto shrink-0 text-[11px] text-[var(--text-muted)]",children:J}):null]})},Jt=1800,Zt=32,er=new Set([...ht,"prompt","generationMode","variantSource","communityIterationGroupId","selectedSavedModel"]),vt=t=>!t||typeof t!="object"?t||null:{id:t.id??null,name:t.name||"",preset_slug:t.preset_slug||t.presetSlug||""},kt=t=>{if(!t||typeof t!="object")return null;const g={};return er.forEach(d=>{const a=t[d];if(a!==void 0){if(d==="selectedSavedModel"){g[d]=vt(a);return}
1g[d]=a}}),g},tr=t=>{if(!t||typeof t!="object")return null;const g={activeTab:t.activeTab||"promptBuilder",step:Number(t.step||1),promptText:typeof t.promptText=="string"?t.promptText.slice(0,5e3):"",advancedPromptText:typeof t.advancedPromptText=="string"?t.advancedPromptText.slice(0,5e3):"",referencePromptText:typeof t.referencePromptText=="string"?t.referencePromptText.slice(0,5e3):"",selectedModel:t.selectedModel||"",selectedSavedModel:vt(t.selectedSavedModel),lastGenerationRequest:kt(t.lastGenerationRequest)};return t.builderState&&typeof t.builderState=="object"&&(g.builderState={},ht.forEach(d=>{const a=t.builderState[d];a!==void 0&&(g.builderState[d]=a)})),t.referenceMeta&&typeof t.referenceMeta=="object"&&(g.referenceMeta={name:t.referenceMeta.name||"",type:t.referenceMeta.type||"",size:Number(t.referenceMeta.size||0)}),t.referenceSessionId&&(g.referenceSessionId=t.referenceSessionId),g},rr=t=>new Promise((g,d)=>{if(!t){g("");return}const a=new FileReader;a.onload=()=>g(typeof a.result=="string"?a.result:""),a.onerror=()=>d(new Error("Failed to read file")),a.readAsDataURL(t)}),nr=(t,g,d)=>{const a=(t||"").split(",");if(a.length<2)throw new Error("Invalid data URL");const y=atob(a[1]),l=new Uint8Array(y.length);for(let o=0;o<y.length;o+=1)l[o]=y.charCodeAt(o);return new File([l],g||"artwork.png",{type:d})},Ce=t=>{const g=new Set((Array.isArray(t?.artworks)?t.artworks:[]).map(o=>o?.url).filter(o=>typeof o=="string"&&o.startsWith("blob:"))),d=t?.model;typeof d=="string"&&d.startsWith("blob:")&&g.add(d),(Array.isArray(t?.artworks)?t.artworks:[]).forEach(o=>{const u=o?.effects?.embroideryDataUrl;typeof u=="string"&&u.startsWith("blob:")&&g.add(u)}),(Array.isArray(t?.aiEditLayers)?t.aiEditLayers:[]).forEach(o=>{const u=o?.imageDataUrl||o?.imageUrl||o?.image_url;typeof u=="string"&&u.startsWith("blob:")&&g.add(u)}),(Array.isArray(t?.productViewArtboards)?t.productViewArtboards:[]).forEach(o=>{const u=o?.imageDataUrl||o?.imageUrl||o?.image_url;typeof u=="string"&&u.startsWith("blob:")&&g.add(u)}),g.forEach(o=>URL.revokeObjectURL(o))},_e=(t,g)=>{const d=t&&typeof t=="object"?t:{},a=g&&typeof g=="object"?g:{},y={...d};a.modelObjectKey&&(y.modelObjectKey=a.modelObjectKey,y.modelContentType=a.modelContentType||y.modelContentType||"image/png");const l=new Map((Array.isArray(a.artworks)?a.artworks:[]).filter(c=>c?.id).map(c=>[String(c.id),c]));Array.isArray(d.artworks)&&(y.artworks=d.artworks.map(c=>{const A=l.get(String(c?.id||""));if(!A)return c;const h={...c,artworkObjectKey:A.artworkObjectKey||c?.artworkObjectKey||"",artworkContentType:A.artworkContentType||c?.artworkContentType||c?.file?.type||"image/png"};return A.effects&&(h.effects={...me(c?.effects),...A.effects}),h}));const o=new Map((Array.isArray(a.aiEditLayers)?a.aiEditLayers:[]).filter(c=>c?.id).map(c=>[String(c.id),c]));Array.isArray(d.aiEditLayers)&&(y.aiEditLayers=d.aiEditLayers.map(c=>{const A=o.get(String(c?.id||""));return A?{...c,imageObjectKey:A.imageObjectKey||c?.imageObjectKey||"",imageContentType:A.imageContentType||c?.imageContentType||"image/png"}:c}));const u=new Map((Array.isArray(a.productViewArtboards)?a.productViewArtboards:[]).filter(c=>c?.id).map(c=>[String(c.id),c]));return Array.isArray(d.productViewArtboards)&&(y.productViewArtboards=d.productViewArtboards.map(c=>{const A=u.get(String(c?.id||""));return A?{...c,imageObjectKey:A.imageObjectKey||c?.imageObjectKey||"",imageContentType:A.imageContentType||c?.imageContentType||"image/png"}:c})),y},wt=t=>t?.imageDataUrl||t?.imageUrl||t?.image_url||"",ar=(t,g)=>{const d=t&&typeof t=="object"?t:{},a=g&&typeof g=="object"?g:{},y={...d};a.modelObjectKey&&d.model&&d.model===a.model?(y.modelObjectKey=a.modelObjectKey,y.modelContentType=a.modelContentType||d.modelContentType||"image/png"):d.model!==a.model&&(delete y.modelObjectKey,delete y.modelContentType);const l=new Map((Array.isArray(a.artworks)?a.artworks:[]).filter(u=>u?.id).map(u=>[String(u.id),u]));Array.isArray(d.artworks)&&(y.artworks=d.artworks.map(u=>{const c=l.get(String(u?.id||""));if(!c)return u;const A=u?.file,h=c?.file,x=!!(A&&h&&A.name===h.name&&A.size===h.size&&A.lastModified===h.lastModified),S=!!(u?.url&&u.url===c?.url),v={...u},C=!!(A&&h&&!x||u?.url&&c?.url&&!S),J=!!(u?.artworkObjectKey&&u.artworkObjectKey===c.artworkObjectKey);c.artworkObjectKey&&!C&&(x||S||J)?(v.artworkObjectKey=c.artworkObjectKey,v.artworkContentType=c.artworkContentType||A?.type||"image/png"):C&&(delete v.artworkObjectKey,delete v.artworkContentType);const b=me(u?.effects),V=me(c?.effects),E=b.embroideryDataUrl||"",N=V.embroideryDataUrl||"",$=!!(E&&N&&E!==N),D=!!(b.embroideryObjectKey&&b.embroideryObjectKey===V.embroideryObjectKey);return V.embroideryObjectKey&&!$&&(E&&E===N||D)?v.effects={...b,embroideryObjectKey:V.embroideryObjectKey,embroideryContentType:V.embroideryContentType||"image/png"}:$&&(v.effects={...b},delete v.effects.embroideryObjectKey,delete v.effects.embroideryContentType),v}));const o=(u,c)=>{const A=new Map((Array.isArray(c)?c:[]).filter(h=>h?.id).map(h=>[String(h.id),h]));return(Array.isArray(u)?u:[]).map(h=>{const x=A.get(String(h?.id||""));if(!x)return h;const S=wt(h),v=wt(x);if(!S||S!==v||!x.imageObjectKey){const C={...h};return S!==v&&(delete C.imageObjectKey,delete C.image_object_key,delete C.imageContentType),C}return{...h,imageObjectKey:x.imageObjectKey,imageContentType:x.imageContentType||"image/png"}})};return y.aiEditLayers=o(d.aiEditLayers,a.aiEditLayers),y.productViewArtboards=o(d.productViewArtboards,a.productViewArtboards),y},Ye=async(t,g)=>{const d=!!t?.pendingGeneration?.jobId,a={...t,isGenerating:d,generationProgress:d?Number(t?.generationProgress||0):0,selectedArtworkId:t?.selectedArtwork?.id||null};delete a.selectedArtwork,delete a.pendingGeneratorImportId,delete a.adminCommunityThumbnail,a.modelObjectKey&&typeof a.model=="string"&&(a.model=""),a.lastGenerationRequest=kt(t?.lastGenerationRequest),a.promptSessionOverride=tr(t?.promptSessionOverride);const y=Array.isArray(t?.artworks)?t.artworks:[];return a.artworks=await Promise.all(y.map(async l=>{const o=`${l?.id||""}:${l?.file?.lastModified||""}:${l?.file?.size||""}`;let u=l?.artworkObjectKey?"":g.current.get(o);return!l?.artworkObjectKey&&!u&&l?.file&&(u=await rr(l.file),u&&g.current.set(o,u)),{id:l?.id,name:l?.name||"artwork.png",visible:l?.visible!==!1,locked:!!l?.locked,order:Number(l?.order??0),status:l?.status||"ready",effects:(()=>{const c=me(l?.effects);return c.embroideryObjectKey&&(c.embroideryDataUrl=""),c})(),transform:l?.transform||null,artworkObjectKey:l?.artworkObjectKey||"",artworkContentType:l?.artworkContentType||l?.file?.type||"image/png",fileType:l?.file?.type||"image/png",fileDataUrl:u||""}})),a.aiEditLayers=(Array.isArray(t?.aiEditLayers)?t.aiEditLayers:[]).map(l
1=>{const o=!!(l?.imageObjectKey||l?.image_object_key),u=l?.imageDataUrl||l?.imageUrl||l?.image_url||"";return{...l,imageDataUrl:o?"":u,imageUrl:"",image_url:""}}),a.productViewArtboards=(Array.isArray(t?.productViewArtboards)?t.productViewArtboards:[]).map(l=>{const o=!!(l?.imageObjectKey||l?.image_object_key),u=l?.imageDataUrl||l?.imageUrl||l?.image_url||"";return{...l,imageDataUrl:o?"":u,imageUrl:"",image_url:""}}),a},yt=async(t,g,{signal:d}={})=>{if(!t||!g)return t||{};const a={...t},y=new Set,l=u=>{const c=URL.createObjectURL(u);return y.add(c),c},o=()=>{if(d?.aborted)throw new DOMException("Draft load canceled","AbortError")};try{if(a.modelObjectKey&&!a.model)try{o();const h=await I.getModelBlob(g,{signal:d});o(),a.model=l(h)}catch(h){if(h?.name==="AbortError"||h?.name==="CanceledError")throw h;console.error("Failed to restore draft hero image",h)}const u=Array.isArray(a.artworks)?a.artworks:[];a.artworks=await Promise.all(u.map(async(h,x)=>{if(!h||typeof h!="object")return h;const S={...h,effects:me(h.effects)};if(!!!(S.fileDataUrl||S.file||S.url)&&S.artworkObjectKey)try{o();const C=await I.getArtworkBlob(g,S.id,{signal:d});o();const J=new File([C],S.name||`artwork-${x+1}.png`,{type:C.type||S.artworkContentType||"image/png"});S.file=J,S.url=l(J)}catch(C){if(C?.name==="AbortError"||C?.name==="CanceledError")throw C;console.error("Failed to restore draft artwork",C)}if(S.effects?.embroideryObjectKey&&!S.effects?.embroideryDataUrl)try{o();const C=await I.getArtworkBlob(g,S.id,{effect:"embroidery",signal:d});o(),S.effects={...S.effects,embroideryDataUrl:l(C)}}catch(C){if(C?.name==="AbortError"||C?.name==="CanceledError")throw C;console.error("Failed to restore draft artwork effect",C)}return S}));const c=Array.isArray(a.aiEditLayers)?a.aiEditLayers:[];a.aiEditLayers=await Promise.all(c.map(async h=>{if(!h||typeof h!="object")return h;const x={...h};if(!(x.imageDataUrl||x.imageUrl||x.image_url||"")&&(x.imageObjectKey||x.image_object_key))try{o();const v=await I.getAiEditBlob(g,x.id,{signal:d});o(),x.imageDataUrl=l(v)}catch(v){if(v?.name==="AbortError"||v?.name==="CanceledError")throw v;console.error("Failed to restore draft AI edit",v)}return x}));const A=Array.isArray(a.productViewArtboards)?a.productViewArtboards:[];return a.productViewArtboards=await Promise.all(A.map(async h=>{if(!h||typeof h!="object")return h;const x={...h};if(!(x.imageDataUrl||x.imageUrl||x.image_url||"")&&(x.imageObjectKey||x.image_object_key))try{o();const v=await I.getProductViewBlob(g,x.id,{signal:d});o(),x.imageDataUrl=l(v)}catch(v){if(v?.name==="AbortError"||v?.name==="CanceledError")throw v;console.error("Failed to restore draft Product View",v)}return x})),o(),a}catch(u){throw y.forEach(c=>URL.revokeObjectURL(c)),u}},or=t=>{const g={...ke,...t||{},isGenerating:!1,generationProgress:0,builderWorkflowOpen:t?.builderWorkflowOpen??!t?.model},d=Array.isArray(t?.artworks)?t.artworks:[],a=[];d.forEach((o,u)=>{if(!o?.fileDataUrl){if(o?.file||o?.url){const c=o?.url||(o?.file?URL.createObjectURL(o.file):"");a.push({...o,id:o.id||`draft-layer-${u}-${Date.now()}`,name:o.name||`artwork-${u+1}.png`,url:c,visible:o.visible!==!1,locked:!!o.locked,order:Number(o.order??u),status:o.status||"ready",effects:me(o.effects),transform:o.transform||null})}return}try{const c=nr(o.fileDataUrl,o.name||`artwork-${u+1}.png`,o.fileType||"image/png");a.push({id:o.id||`draft-layer-${u}-${Date.now()}`,name:o.name||`artwork-${u+1}.png`,visible:o.visible!==!1,locked:!!o.locked,order:Number(o.order??u),status:o.status||"ready",effects:me(o.effects),transform:o.transform||null,artworkObjectKey:o.artworkObjectKey||"",artworkContentType:o.artworkContentType||o.fileType||"image/png",file:c,url:URL.createObjectURL(c)})}catch{}});const y=t?.selectedArtworkId||null,l=t?.selectedCanvasLayer==="hero"?null:a.find(o=>o.id===y)||a.find(o=>o.visible!==!1)||a[0]||null;return{...g,artworks:a,selectedArtwork:l,selectedCanvasLayer:l?"artwork":g.selectedCanvasLayer||"hero",savedArtworkTransform:l?.transform||null,savedArtworkTransforms:g.savedArtworkTransforms||{}}},De=()=>({...ke,builderWorkingState:{...ke.builderWorkingState,mode:"promptBuilder",screen:"model",promptBuilderScreen:"model",imageReferenceScreen:"form",advancedScreen:"form",entryPoint:"newMockup",startedAt:null},outputArtboard:{...ke.outputArtboard},heroPlacement:{...ke.heroPlacement},isGenerating:!1,generationProgress:0}),sr=t=>{if(t?.pendingGeneration?.jobId)return!0;const g=t?.model||t?.modelObjectKey;if((typeof g=="string"?g.trim():"")||(Array.isArray(t?.artworks)?t.artworks:[]).length>0)return!0;const y=t?.lastGenerationRequest;return!!(y&&typeof y=="object"&&Object.keys(y).length>0)},Re=(t=[])=>[...t].sort((g,d)=>Number(g?.sort_order??0)-Number(d?.sort_order??0)),re=(t,g)=>{const d=t?.response;if(!d)return"Cannot reach draft tab service. Please restart backend and try again.";if(d?.status===500)return"Draft tabs couldn’t load due to a server error. Please try again.";if(d?.status===404)return"Draft tabs endpoint not found. Please restart backend.";const a=d?.data?.detail;
1if(typeof a=="string"&&a.trim())return a;if(Array.isArray(a)&&a.length){const y=a[0];if(typeof y=="string")return y;if(y?.msg)return y.msg}return t?.message?t.message:d?.status?`${g} (${d.status})`:g},Nr=()=>{const{state:t,credits:g,creditsLoading:d,isAuthenticated:a,user:y,updateState:l,patchGeneratorState:o,patchGeneratorStateForRun:u,replaceGeneratorState:c,refreshCredits:A,setDraftUsage:h}=qt(),x=It();zt();const S=$t(),v=Wt&&S,C=!d&&typeof g=="number"&&g<=0,J=v,b=!!a&&Ht(y?.subscription_tier)&&!J,V=!b,E=!!(y?.centered_prompt_builder_enabled||y?.questionnaire_prompt_builder_enabled),[N,$]=n.useState([]),[D,W]=n.useState(null),[O,xe]=n.useState({used:0,limit:0}),[Ue,Qe]=n.useState(!1),[xt,Ge]=n.useState(!1),[Be,Xe]=n.useState(!1),[Et,Ke]=n.useState(null),[fe,Je]=n.useState(()=>b&&typeof window<"u"&&sessionStorage.getItem("mockitai:create-draft-tab")==="1"),[Ze,Ee]=n.useState({}),[Le,Fe]=n.useState(!1),[jt,Ve]=n.useState(!1),[Z,je]=n.useState({open:!1,draftId:null,hasExistingSave:!1}),[pe,et]=n.useState(!1),[St,qe]=n.useState(!1),[At,Ct]=n.useState(0),tt=n.useRef(null),$e=n.useRef(new Map),le=n.useRef(!1),ue=n.useRef(!1),Ne=n.useRef(!1),ne=n.useRef(null),H=n.useRef(new Set),ae=n.useRef(new Map),We=n.useRef(new Map),ge=n.useRef(new Map),de=n.useRef(!1),Te=n.useRef(""),ze=n.useRef(""),U=n.useRef(null),M=n.useRef(t),K=n.useRef(new Map),ee=n.useRef(new Map),Se=n.useRef(0),Ae=n.useRef(null),rt=n.useRef(null),oe=n.useCallback(()=>{Se.current+=1,Ae.current=null,ee.current.forEach(e=>e?.controller?.abort()),ee.current.clear(),Ke(null)},[]),be=n.useCallback(e=>{const s=Se.current+1;return Se.current=s,Ae.current=e,ee.current.forEach((i,r)=>{r!==e&&i?.controller?.abort()}),Ke(e),s},[]),te=n.useCallback((e,s)=>Se.current===s&&Ae.current===e&&!ue.current,[]),we=n.useCallback((e,s)=>{Se.current!==s||Ae.current!==e||(Ae.current=null,Ke(null))},[]);n.useEffect(()=>{if(!Z.open)return;tt.current?.focus();const e=s=>{s.key!=="Escape"||pe||je({open:!1,draftId:null,hasExistingSave:!1})};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[Z.open,pe]),n.useEffect(()=>{U.current=D},[D]);const F=n.useCallback(e=>{U.current=e,W(e)},[]);n.useEffect(()=>{M.current=t},[t]);const ye=n.useCallback((e,s)=>{if(!e)return s;const i=rt.current?.capture?.(e),r=i?{...s||{},canvasArtboards:{...(s||{}).canvasArtboards||{},viewport:{...((s||{}).canvasArtboards||{}).viewport||{},...i}}}:s;return K.current.set(e,r||{}),r},[]);n.useEffect(()=>{h(O)},[O,h]);const G=n.useCallback(e=>{le.current=!0;const s=or(e||{});c(s),requestAnimationFrame(()=>{le.current=!1})},[c]),Oe=n.useCallback(e=>{le.current=!0,c({...e||{},pendingGeneratorImportId:null,isRestoringMockup:!1}),requestAnimationFrame(()=>{le.current=!1})},[c]);n.useLayoutEffect(()=>{if(!b)return;const e=sessionStorage.getItem("mockitai:create-draft-tab")==="1";!fe&&!e||(e&&!fe&&Je(!0),G({...De(),showPromptEditor:!0}))},[G,b,fe]);const Y=n.useCallback((e,s)=>{$(i=>Re(i.map(r=>r.id===e?s(r):r)))},[]),se=n.useCallback(async e=>{if(!e||e.state_loaded!==!1)return e;const s=ee.current.get(e.id);if(s?.promise)return s.promise;const i=new AbortController,r=(async()=>{const m=await I.get(e.id,{signal:i.signal}),w=await yt(m.state_json||{},e.id,{signal:i.signal});if(i.signal.aborted)throw Ce(w),new DOMException("Draft load canceled","AbortError");const k={...e,...m,state_json:w,state_loaded:!0};return K.current.set(e.id,k.state_json||{}),Y(e.id,()=>k),k})();ee.current.set(e.id,{controller:i,promise:r});try{return await r}finally{ee.current.get(e.id)?.promise===r&&ee.current.delete(e.id)}},[Y]),q=n.useCallback(async(e,s,i="manual")=>{if(!b||!e||!H.current.has(e)&&i!=="force")return!0;const r=ge.current.get(e);ge.current.set(e,{draftState:s,reason:i==="force"||r?.reason==="force"?"force":i});const m=We.current.get(e);if(m)return m;try{const w=(async()=>{for(;ge.current.has(e);){const k=ge.current.get(e);ge.current.delete(e);const p=k?.draftState||{},j=Number(ae.current.get(e)||0);if(!H.current.has(e)&&k?.reason!=="force")continue;const R=ar(p,K.current.get(e)),P=await Ye(R,$e),_=await I.update(e,{state_json:P}),L=_e({...p||{},artworks:Array.isArray(p?.artworks)?p.artworks.map(ie=>({...ie})):[]},_?.state_json);K.current.set(e,L),Y(e,ie=>({...ie,..._,state_json:L,state_loaded:!0})),Number(ae.current.get(e)||0)===j&&H.current.delete(e)}return!0})();return We.current.set(e,w),await w,Ee(k=>{if(!k[e])return k;const p={...k};return delete p[e],p}),!0}catch{return ge.current.delete(e),Ee(k=>({...k,[e]:!0})),i!=="autosave"&&B.error("Draft sync failed. Please try again."),!1}finally{We.current.delete(e)}},[b,Y]);n.useEffect(()=>{if(!b)return;const e=s=>{const i=s?.detail||{},r=Number(i.draftId),m=i.pendingGeneration;if(!Number.isFinite(r)||!m?.jobId)return;const w=r===Number(U.current)?M.current:K.current.get(r)||{},k={...w||{},pendingGeneration:m,isGenerating:!0,generationProgress:Number(w?.generationProgress||0)};K.current.set(r,k),H.current.add(r),ae.current.set(r,Number(ae.current.get(r)||0)+1),Y(r,p=>({...p,has_generated_content:!0,state_json:p?.state_loaded===!1?p.state_json:k})),q(r,k,"force")};return window.addEventListener("mockitai:generation-job-started",e),()=>window.removeEventListener("mockitai:generation-job-started",e)},[b,q,Y]),n.useEffect(()=>{if(!b||D==null||t?.pendingGeneration?.jobId)return;const e=Kt(D);!e?.jobId||!e?.runId||(o({pendingGeneration:e,isGenerating:!0,generationProgress:Number(t?.generationProgress||0)}),window.dispatchEvent(new CustomEvent("mockitai:generation-job-started",{detail:{draftId:Number(D),pendingGeneration:e}})))}
1,[D,b,o,t?.generationProgress,t?.pendingGeneration?.jobId]),n.useEffect(()=>{const e=t?.pendingGeneration,s=String(e?.jobId||""),i=String(e?.runId||"");if(!s||!i)return;const r=e?.draftId==null?null:Number(e.draftId);if(b&&(r==null||r!==Number(D)))return;let m=!1,w=null;const k=()=>!(m||M.current?.pendingGeneration?.runId!==i||b&&Number(U.current)!==Number(r)),p=window.setInterval(()=>{u(i,j=>({generationProgress:Math.min(Number(j?.generationProgress||0)+2,95)}))},1e3);return u(i,{isGenerating:!0}),Pt(s).then(j=>{if(!k())return;if(!j?.b64_json)throw new Error("Generation completed without an image");const R=j.communityIterationGroupId||null,P={...e.generationRequest||{},communityIterationGroupId:R},_=P.selectedSavedModel||null,L=e.centered&&e.outputArtboard?{...e.outputArtboard}:null;u(i,{artworks:[],selectedArtwork:null,selectedCanvasLayer:"hero",savedArtworkTransform:null,savedArtworkTransforms:{},mask:null,deferInitialPreparationOverlay:!0,model:`data:image/png;base64,${j.b64_json}`,aiEditLayers:[],activeSavedMockupId:null,lastSavedMockupSignature:null,lastGenerationRequest:P,communityIterationGroupId:R,selectedSavedModel:_,...L?{committedOutputArtboard:L}:{},pendingGeneration:null,isGenerating:!1,generationProgress:0}),ft(r),A(),window.dispatchEvent(new CustomEvent("mockitai:prompt-builder-generation-result",{detail:{outcome:"succeeded",draftId:r,runId:i}}))}).catch(j=>{if(!k())return;if(j?.code==="GENERATION_POLL_TIMEOUT"){w=window.setTimeout(()=>{m||Ct(_=>_+1)},5e3);return}const R=j?.response?.status,P=j?.response?.data?.detail||j?.message||"Failed to generate mockup";R===402&&window.dispatchEvent(new CustomEvent("mockitai:show-out-of-credits-modal")),B.error(P),u(i,{pendingGeneration:null,isGenerating:!1,generationProgress:0,...e.centered?{builderWorkflowOpen:!0,showPromptEditor:!0}:{}}),ft(r),window.dispatchEvent(new CustomEvent("mockitai:prompt-builder-generation-result",{detail:{outcome:"failed",errorCategory:String(R||"generation"),draftId:r,runId:i}}))}),()=>{m=!0,window.clearInterval(p),w&&window.clearTimeout(w)}},[D,b,u,A,At,t?.pendingGeneration?.jobId,t?.pendingGeneration?.runId]);const nt=n.useCallback(async(e="manual")=>{if(!b)return!0;const s=U.current;return!s||le.current||ue.current?!0:q(s,M.current,e)},[b,q]),at=n.useCallback(()=>{const e=U.current;e&&(H.current.add(e),ae.current.set(e,Number(ae.current.get(e)||0)+1))},[]),ot=n.useCallback(()=>{b&&de.current&&(le.current||ue.current||Ne.current||U.current&&(Number(O?.limit||0)>0&&Number(O?.used||0)>Number(O?.limit||0)||(ne.current&&clearTimeout(ne.current),ne.current=setTimeout(()=>{nt("autosave")},Jt))))},[O,b,nt]),st=n.useCallback(async()=>{if(!b)return;Ge(!1),Qe(!0);const e=sessionStorage.getItem("mockitai:create-draft-tab")==="1",s=sessionStorage.getItem("mockitai:import-current-state")==="1",i=sessionStorage.getItem("mockitai:saved-mockup-restore-in-progress")==="1",r=s||i;try{const[m,w]=await Promise.all([I.list({includeState:!1}),I.usage()]);let k=Array.isArray(m?.items)?m.items:[],p=null,j={used:Number(w?.used||k.length||0),limit:Number(w?.limit||0)};if(k.length){if(e)if(sessionStorage.removeItem("mockitai:create-draft-tab"),j.limit>0&&j.used>=j.limit)B.error("You have too many tabs open. Close/save one or upgrade your plan.");else try{const T=De(),X=await I.create({name:`Mockup ${j.used+1}`,state_json:T,make_active:!0});p={...X,state_json:_e(T,X?.state_json),state_loaded:!0},k=[...k,p],j={...j,used:j.used+1}}catch(T){B.error(re(T,"Failed to create draft tab"))}}else{const T=De(),X=await I.create({name:"Mockup 1",state_json:T,make_active:!0}),z={...X,state_json:_e(T,X?.state_json),state_loaded:!0};k=[z],j={used:1,limit:j.limit},e&&(p=z,sessionStorage.removeItem("mockitai:create-draft-tab"))}let R=Re(k);R.forEach(T=>{T.state_loaded!==!1&&K.current.set(T.id,T.state_json||{})});const P=R.filter(T=>!!T?.last_opened_at).sort((T,X)=>new Date(X.last_opened_at).getTime()-new Date(T.last_opened_at).getTime())[0];let _=p||P||R[0];const L=!!(M.current?.pendingGeneratorImportId||sessionStorage.getItem("mockitai:import-current-state")==="1"||sessionStorage.getItem("mockitai:saved-mockup-restore-in-progress")==="1");if(_?.state_loaded===!1&&!r&&!L){const T=await I.get(_.id),X=await yt(T.state_json||{},_.id);_={..._,...T,state_json:X,state_loaded:!0},R=R.map(z=>z.id===_.id?_:z),K.current.set(_.id,_.state_json||{})}$(R),xe(j),F(_.id);const ie=!!(M.current?.pendingGeneratorImportId||sessionStorage.getItem("mockitai:import-current-state")==="1"||sessionStorage.getItem("mockitai:saved-mockup-restore-in-progress")==="1");!e&&!r&&!ie&&G(_.state_json||{}),de.current=!0,e&&p&&(H.current.add(p.id),ae.current.set(p.id,1),q(p.id,p.state_json,"force"))}catch(m){const w=re(m,"Failed to load draft tabs");B.error(w),$([]),xe({used:0,limit:0}),de.current=!1}finally{Qe(!1),Ge(!0),Je(!1)}},[G,b,q,F]);n.useEffect(()=>{if(!b){de.current=!1,$([]),F(null),xe({used:0,limit:0}),Ge(!1);return}st()},[b,st]);const Me=n.useCallback(()=>{c({...ke,showPromptEditor:!0})},[c]);n.useEffect(()=>{!V||!(sessionStorage.getItem("mockitai:open-single-mockup")==="1")||(sessionStorage.removeItem("mockitai:open-single-mockup"),Me())},[Me,V]),n.useEffect(()=>{if(!V)return;const e=()=>{Me()};return window.addEventListener("mockitai:open-single-mockup",e),()=>window.removeEventListener("mockitai:open-single-mockup",e)},[Me,V]),n.useEffect(()=>{b&&de.current&&(le.current||ue.current||t.pendingGeneratorImportId||sessionStorage.getItem("mockitai:import-current-state")!=="1"&&(at(),ot()))},[t,ot,b,at]),n.useEffect(()=>()=>{ne.current&&clearTimeout(ne.current)},[]);const Q=n.useCallback(async(e={})=>{const{seedCurrentState:s=!1,seedState:i=null,skipFlush:r=!1,transientState:m=null,skipApply:w=!1,usageOverride:k=null}=e;if(!b)return null;const p=Number(O?.limit||0),j=Number(k??O?.used??0);if(p>0&&j>=p)return B.error("You have too many tabs open. Close/save one or upgrade your plan."),null;if(Be)return null;oe();const R=!s&&!i&&!w&&!m,P=U.current,_=ye(P,M.current);Xe(!0);try{r||P&&H.current.has(P)&&q(P,_,"create"),R&&(Ne.current=!0,G({...De(),showPromptEditor:!0}));const L=i||M.current,ie=s?await Ye(L,$e):De(),T=await I.create({name:`Mockup ${j+1}`,state_json:ie,make_active:!0}),z=_e(s?L:ie,T?.state_json),ce={...T,state_json:z,state_loaded:!0};return K.current.set(ce.id,z),$(ve=>Re([...ve,ce])),xe(ve=>({...ve,used:Number(ve?.used||0)+1})),F(ce.id),!w&&!R&&G({...z,...m||{}}),R&&(Ne.current=!1,G(z),H.current.add(ce.id),ae.current.set(ce.id,1),q(ce.id,z,"force")),Ee(ve=>{const mt={...ve};return delete mt[ce.id],mt}),ce}catch(L){return R&&P&&G(_),B.error(re(L,"Failed to create draft tab")),null}finally{Ne.current=!1,Xe(!1)}},[G,ye,O,b,Be,oe,q,F]),it=n.useCallback(async(e=null,s={})=>
1{if(!b)return;oe();const{skipApply:i=!1}=s||{},r=e||M.current,m=Re(N),w=m.some(p=>!!p?.has_generated_content||sr(p?.state_json)||pt(p?.id));if(m.length>0&&!w){const p=U.current||m[0]?.id;if(!p){const j=await Q({seedCurrentState:!0,seedState:r,skipFlush:!0,skipApply:i});return j&&i&&Oe(r),!!j}try{const j=await Ye(r,$e),R=await I.update(p,{state_json:j,touch_opened_at:!0}),P=_e(r,R?.state_json);return K.current.set(p,P),F(p),Y(p,_=>({..._,state_json:P,last_opened_at:R?.last_opened_at||_.last_opened_at})),Ee(_=>{if(!_[p])return _;const L={..._};return delete L[p],L}),i?Oe(r):G({...P,...r?.adminCommunityThumbnail?{adminCommunityThumbnail:r.adminCommunityThumbnail}:{}}),!0}catch{}}const k=await Q({seedCurrentState:!0,seedState:r,skipFlush:!0,skipApply:i,transientState:r?.adminCommunityThumbnail?{adminCommunityThumbnail:r.adminCommunityThumbnail}:null});return k&&i&&Oe(r),!!k},[G,Oe,N,b,Q,oe,F,Y]),_t=n.useCallback(async e=>{if(!b||!e||e===U.current||ue.current)return;let s=N.find(r=>r.id===e);if(!s)return;const i=be(e);try{if(s=await se(s),!te(e,i))return;const r=U.current,m=ye(r,{...M.current,builderWorkflowOpen:!1,showPromptEditor:!1});if(r&&H.current.has(r)&&q(r,m,"switch"),!te(e,i))return;const w=K.current.get(e)||s.state_json||{};F(e),G({...w,builderWorkflowOpen:!1,showPromptEditor:!1}),I.update(e,{touch_opened_at:!0}).catch(()=>{})}catch(r){if(r?.code==="ERR_CANCELED"||r?.name==="CanceledError"||r?.name==="AbortError")return;B.error(re(r,"Failed to load draft tab"))}finally{we(e,i)}},[G,be,ye,N,b,we,te,se,q,F]),Dt=n.useCallback(async(e,s)=>{const i=(s||"").trim().slice(0,Zt);if(i)try{const r=await I.update(e,{name:i});Y(e,m=>({...m,name:r.name||i}))}catch(r){B.error(r?.response?.data?.detail||"Failed to rename draft")}},[Y]),ct=n.useCallback((e="auto")=>new Promise(s=>{const i=`mockup-save-${Date.now()}-${Math.random().toString(16).slice(2)}`;let r=!1;const m=window.setTimeout(()=>{r||(r=!0,window.removeEventListener("mockitai:save-mockup-result",w),s(!1))},45e3),w=k=>{k?.detail?.requestId===i&&(r||(r=!0,window.clearTimeout(m),window.removeEventListener("mockitai:save-mockup-result",w),s(!!k?.detail?.success)))};window.addEventListener("mockitai:save-mockup-result",w),window.dispatchEvent(new CustomEvent("mockitai:request-save-mockup",{detail:{requestId:i,saveMode:e}}))}),[]),lt=n.useCallback(async e=>{if(!b||!e)return!1;if(e===U.current)return!0;let s=N.find(r=>r.id===e);if(!s)return!1;const i=be(e);try{if(s=await se(s),!te(e,i))return!1;const r=U.current,m=ye(r,M.current);if(r&&H.current.has(r)&&q(r,m,"switch"),!te(e,i))return!1;const w=K.current.get(e)||s.state_json||{};return F(e),G(w),I.update(e,{touch_opened_at:!0}).catch(()=>{}),await new Promise(k=>requestAnimationFrame(()=>requestAnimationFrame(k))),te(e,i)}catch(r){return r?.code==="ERR_CANCELED"||r?.name==="CanceledError"||r?.name==="AbortError"||B.error(re(r,"Failed to load draft tab")),!1}finally{we(e,i)}},[G,be,ye,N,b,we,te,se,q,F]),he=n.useCallback(async e=>{if(!b||!e)return;oe();const s=Re(N),i=s.findIndex(p=>p.id===e);if(i<0)return;try{await I.remove(e)}catch(p){B.error(re(p,"Failed to close draft"));return}const r=s.filter(p=>p.id!==e),m=e===U.current?M.current:K.current.get(e);if(K.current.delete(e),$(r),xe(p=>({...p,used:Math.max(0,Number(p?.used||0)-1)})),Ee(p=>{const j={...p};return delete j[e],j}),!r.length){Ce(m),F(null),await Q({skipFlush:!0,usageOverride:0});return}if(e!==U.current){Ce(m);return}let w=r[Math.max(0,i-1)]||r[0];const k=be(w.id);try{if(w=await se(w),!te(w.id,k))return;const p=K.current.get(w.id)||w.state_json||{};F(w.id),G(p),Ce(m),I.update(w.id,{touch_opened_at:!0}).catch(()=>{})}catch(p){if(p?.code==="ERR_CANCELED"||p?.name==="CanceledError"||p?.name==="AbortError")return;B.error(re(p,"Failed to load draft tab"))}finally{we(w.id,k)}},[G,be,N,b,we,Q,oe,te,se,F]),Rt=n.useCallback(async e=>{if(!b||!e||!!Ze[e]&&!window.confirm("This draft has unsynced changes. Close this tab anyway?"))return;let i=M.current;if(e!==U.current){let m=N.find(w=>w.id===e);if(!m)return;try{m=await se(m)}catch(w){B.error(re(w,"Failed to load draft tab"));return}i=m.state_json||{}}if(i?.pendingGeneration?.jobId||pt(e)){B.error("This mockup is still generating. Wait for it to finish before closing the tab.");return}if(Yt(i||{})){je({open:!0,draftId:e,hasExistingSave:!!i?.activeSavedMockupId});return}await he(e)},[he,Ze,N,b,se]),Nt=n.useCallback(async(e="auto")=>{const s=Z?.draftId;if(s)try{if(et(!0),!await lt(s)){B.error("Unable to activate tab for save.");return}if(!await ct(e)){B.error("Save failed. Draft tab remains open.");return}je({open:!1,draftId:null,hasExistingSave:!1}),await he(s)}finally{et(!1)}},[lt,he,Z?.draftId,ct]),Tt=n.useCallback(async()=>{const e=Z?.draftId;e&&(je({open:!1,draftId:null,hasExistingSave:!1}),await he(e))},[he,Z?.draftId]);n.useEffect(()=>{const e=t.pendingGeneratorImportId||"",s=sessionStorage.getItem("mockitai:import-current-state")==="1",i=e||(s?"session":"");if(!b){s&&(sessionStorage.removeItem("mockitai:import-current-state"),sessionStorage.removeItem("mockitai:import-current-state-skip-apply"),sessionStorage.removeItem("mockitai:saved-mockup-restore-in-progress")),e&&l("pendingGeneratorImportId",null);return}if(!de.current)return;if(i){if(Te.current===i||ze.current===i)return;Te.current=i,ue.current=!0,oe(),ne.current&&(clearTimeout(ne.current),ne.current=null);const m=sessionStorage.getItem("mockitai:import-current-state-skip-apply")==="1";Promise.resolve(it(t,{skipApply:m})).then(w=>
1{if(!w)throw new Error("Draft import was not completed");sessionStorage.removeItem("mockitai:import-current-state"),sessionStorage.removeItem("mockitai:import-current-state-skip-apply"),ze.current=e?i:"",l("pendingGeneratorImportId",null)}).catch(w=>{B.error(re(w,"Failed to open mockup")),sessionStorage.removeItem("mockitai:import-current-state"),sessionStorage.removeItem("mockitai:import-current-state-skip-apply"),sessionStorage.removeItem("mockitai:saved-mockup-restore-in-progress"),ze.current=e?i:"",l("pendingGeneratorImportId",null)}).finally(()=>{ue.current=!1,Te.current===i&&(Te.current="")});return}sessionStorage.getItem("mockitai:create-draft-tab")==="1"&&(sessionStorage.removeItem("mockitai:create-draft-tab"),Q())},[b,N.length,Q,it,oe,t,t.pendingGeneratorImportId,l]),n.useEffect(()=>{if(!b)return;const e=()=>{if(!de.current){sessionStorage.setItem("mockitai:create-draft-tab","1");return}Q()};return window.addEventListener("mockitai:create-draft-tab",e),()=>window.removeEventListener("mockitai:create-draft-tab",e)},[b,Q]);const Ot=n.useMemo(()=>{const e=Number(O?.limit||0);return e?Number(O?.used||0)<e:!0},[O]),ut=Number(O?.limit||0)>0&&Number(O?.used||0)>Number(O?.limit||0),Ie=!!t.isRestoringMockup||!!t.pendingGeneratorImportId||b&&!fe&&Ue||b&&!fe&&!xt,dt=v&&!Ie&&!jt&&(t.showPromptEditor||!t.model&&!t.isGenerating),He=v&&!!t.model&&!t.showPromptEditor,Mt=E&&!Ie&&!t.model&&!t.isGenerating;return n.useEffect(()=>{if(!E||!t.model||!t.showPromptEditor||t.isGenerating)return;const e=t.builderWorkingState||{},s=e.mode==="chooser"?t.lastGenerationRequest?.generationMode==="imageReference"?"imageReference":t.lastGenerationRequest?.prompt&&!t.lastGenerationRequest?.gender?"advanced":"promptBuilder":e.mode||"promptBuilder";l("builderWorkflowOpen",!0),l("builderWorkingState",{...e,mode:s,entryPoint:"editPrompt",promptBuilderScreen:s==="promptBuilder"?"photography":e.promptBuilderScreen,imageReferenceScreen:s==="imageReference"?"form":e.imageReferenceScreen,advancedScreen:s==="advanced"?"form":e.advancedScreen})},[E,t.isGenerating,t.lastGenerationRequest,t.model,t.showPromptEditor,l]),n.useEffect(()=>{if(!E)return;const e=s=>{const i=s?.detail?.outcome;if(!["succeeded","failed"].includes(i))return;const r=s?.detail?.draftId;if(r!=null&&Number(r)!==Number(U.current))return;const m=M.current?.builderWorkingState||{},w=i==="succeeded"?"generation_succeeded":"generation_failed";Ut.record({event_id:globalThis.crypto?.randomUUID?.()||`${Date.now()}-${Math.random()}`,draft_id:D?String(D):null,builder_version:y?.questionnaire_prompt_builder_enabled?3:2,event_type:w,mode:m.mode==="chooser"?null:m.mode||"promptBuilder",screen:y?.questionnaire_prompt_builder_enabled&&(m.mode||"promptBuilder")==="promptBuilder"?m.questionnaire?.question||"model":m.mode==="imageReference"?m.imageReferenceScreen:m.mode==="advanced"?m.advancedScreen:m.promptBuilderScreen,entry_point:m.entryPoint==="editPrompt"?"edit_prompt":"new_mockup",provider_model:M.current?.selectedModel?.id||M.current?.selectedModel||null,artboard_preset:M.current?.outputArtboard?.preset||null,outcome:i,error_category:s?.detail?.errorCategory||null,elapsed_ms:m.startedAt?Math.max(0,Date.now()-Number(m.startedAt)):null,viewport_category:Gt()}).catch(()=>{})};return window.addEventListener("mockitai:prompt-builder-generation-result",e),()=>window.removeEventListener("mockitai:prompt-builder-generation-result",e)},[D,E,y?.questionnaire_prompt_builder_enabled]),n.useEffect(()=>()=>{!E||!M.current?.builderWorkflowOpen||(l("builderWorkflowOpen",!1),l("showPromptEditor",!1))},[E,l]),n.useEffect(()=>()=>{ee.current.forEach(s=>s?.controller?.abort()),ee.current.clear(),[M.current,...K.current.values()].forEach(Ce)},[]),n.useEffect(()=>{if(!v){Ve(!1);return}const e=()=>{Ve(!0)};return window.addEventListener("mockitai:force-mobile-canvas",e),()=>window.removeEventListener("mockitai:force-mobile-canvas",e)},[v]),n.useEffect(()=>{v&&t.showPromptEditor&&!t.isGenerating&&Ve(!1)},[v,t.isGenerating,t.showPromptEditor]),n.useEffect(()=>{!He&&Le&&Fe(!1)},[He,Le]),n.useEffect(()=>{const e=()=>{qe(!0)};return window.addEventListener("mockitai:show-out-of-credits-modal",e),()=>window.removeEventListener("mockitai:show-out-of-credits-modal",e)},[]),f.jsxs("div",{className:`generator-shell flex flex-1 min-h-0 relative items-stretch overflow-hidden ${v?"h-[calc(100dvh-3.5rem)] max-h-[calc(100dvh-3.5rem)]":"h-[calc(100dvh-4rem)] max-h-[calc(100dvh-4rem)]"}`,"data-mobile":S?"true":"false","data-mobile-v1":v?"true":"false",children:[f.jsx(Qt,{}),f.jsxs("div",{className:"flex flex-1 min-w-0 min-h-0 overflow-hidden flex-col",children:[b&&!Ue?f.jsx(Xt,{tabs:N,activeDraftId:D,used:Number(O?.used||0),limit:Number(O?.limit||0),canCreate:Ot,isCreating:
1Be,activatingDraftId:Et,onActivate:_t,onCreate:Q,onClose:Rt,onRename:Dt}):null,b&&Ue&&!fe?f.jsx("div",{className:"h-12 border-b border-[var(--app-border-strong)] bg-[var(--app-surface)] px-3 flex items-center text-[12px] text-[var(--text-muted)]",children:"Loading draft tabs..."}):null,b&&ut?f.jsxs("div",{className:"h-10 border-b border-[#8f4c4c] bg-[#3f2020] px-3 flex items-center justify-between text-[12px] text-[#ffdada]",children:[f.jsxs("span",{children:["You have ",O.used,"/",O.limit," draft tabs. Close tabs to continue."]}),f.jsx("button",{type:"button",onClick:()=>x("/pricing"),className:"rounded-full border border-[#6d3d3d] px-3 py-1 text-[11px] text-[#ffd1d1] hover:bg-[#3a1f1f]",children:"Upgrade"})]}):null,f.jsx("div",{className:`flex-1 min-h-0 overflow-hidden ${ut?"opacity-40 pointer-events-none":""}`,children:Mt?f.jsx(Pe,{centered:!0,centeredEmbedded:!0,activeDraftId:D}):!E&&dt?f.jsx("div",{className:"h-full min-h-0",children:f.jsx(Pe,{activeDraftId:D})}):f.jsx(Bt,{isMobileV1:v,activeDraftId:D,canvasViewportApiRef:rt,onRequestOpenUploadPanel:()=>Fe(!0)})})]}),!v&&!dt&&(!Ie||t.model)?t.model&&!t.showPromptEditor?f.jsx(gt,{}):E?null:f.jsx(Pe,{activeDraftId:D}):null,E&&!Ie&&t.model&&!t.isGenerating&&t.builderWorkflowOpen?f.jsx(Pe,{centered:!0,activeDraftId:D}):null,He&&Le?f.jsxs("div",{className:"absolute inset-0 z-30 bg-[var(--app-surface)] flex flex-col",children:[f.jsxs("div",{className:"h-12 shrink-0 px-4 border-b border-[var(--app-border-strong)] flex items-center justify-between",children:[f.jsx("span",{className:"text-sm font-semibold text-[var(--text-primary)]",children:"Design Layers"}),f.jsx("button",{type:"button",onClick:()=>Fe(!1),className:"h-8 px-3 rounded-md border border-[var(--app-border-strong)] text-sm text-[var(--text-secondary)]",children:"Done"})]}),f.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto",children:f.jsx(gt,{embedded:!0})})]}):null,Z.open&&f.jsx("div",{"data-tour-blocking":"true",className:"absolute inset-0 z-50 flex items-center justify-center bg-[var(--overlay-bg)] px-4",children:f.jsxs("div",{role:"dialog","aria-modal":"true","aria-labelledby":"close-draft-dialog-title",className:"w-full max-w-md rounded-xl border border-[var(--app-border-strong)] bg-[var(--app-card)] p-5 text-left",children:[f.jsx("h3",{id:"close-draft-dialog-title",className:"mb-2 text-lg font-semibold",children:Z.hasExistingSave?"Save changes before closing?":"Save mockup before closing?"}),f.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:Z.hasExistingSave?"Save your latest changes to My Mockups before closing this draft.":"Save this mockup to My Mockups before closing the draft."}),f.jsxs("div",{className:"mt-6 flex flex-col-reverse gap-3 sm:flex-row sm:items-center sm:justify-between",children:[f.jsx("button",{type:"button",onClick:Tt,disabled:pe,className:"min-h-11 rounded-[var(--dashboard-radius-control)] px-3 text-sm font-medium text-[var(--danger-text)] hover:bg-[var(--danger-soft)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--app-focus-ring)] disabled:opacity-60",children:"Close without saving"}),f.jsxs("div",{className:"flex flex-col-reverse gap-2 sm:flex-row sm:items-center",children:[f.jsx("button",{ref:tt,type:"button",onClick:()=>je({open:!1,draftId:null,hasExistingSave:!1}),disabled:pe,className:"min-h-11 rounded-[var(--dashboard-radius-control)] border border-[var(--app-border-strong)] px-4 text-sm font-medium text-[var(--text-primary)] hover:bg-[var(--app-control-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--app-focus-ring)] disabled:opacity-60",children:"Keep editing"}),f.jsx("button",{type:"button",onClick:()=>Nt("auto"),disabled:pe,className:"min-h-11 rounded-[var(--dashboard-radius-control)] bg-[var(--color-brand)] px-4 text-sm font-semibold text-white hover:bg-[var(--app-brand-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--app-focus-ring)] disabled:cursor-wait disabled:opacity-60",children:pe?"Saving…":"Save & close"})]})]})]})}),St&&C&&f.jsxs(f.Fragment,{children:[f.jsx("button",{type:"button","aria-label":"Close out of credits dialog",onClick:()=>qe(!1),"data-tour-blocking":"true",className:"absolute inset-0 bg-black/60 backdrop-blur-[2px] z-40"}),f.jsx("div",{className:"absolute inset-0 flex items-center justify-center z-50 px-4",children:f.jsxs("div",{className:"bg-black rounded-xl shadow-2xl max-w-sm w-full p-6 text-center border-2 border-white/20",children:[f.jsx("h3",{className:"text-xl font-semibold text-white-900",children:"You are out of credits"}),f.jsx("p",{className:"text-white-600 mt-2",children:"Upgrade your plan to continue generating mockups."}),f.jsxs("div",{className:"mt-5 flex flex-col gap-3",children:[f.jsx("button",{onClick:()=>qe(!1),className:"w-full border border-gray-300 hover:bg-gray-50 hover:text-black text-white-800 py-2.5 rounded-lg font-medium",children:"Continue editing"}),f.jsx("button",{onClick:()=>x("/pricing"),className:"w-full bg-purple-600 hover:bg-purple-700 text-white py-2.5 rounded-lg font-medium",children:"View Plans"}),f.jsx("button",{onClick:()=>x("/profile"),className:"w-full border border-gray-300 hover:bg-gray-50 hover:text-black text-white-800 py-2.5 rounded-lg font-medium",children:"Manage Billing"})]})]})})]})]})};export{Nr as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.