diff --git "a/.next/static/chunks/app/page-a32e1a99596afbe6.js" "b/.next/static/chunks/app/page-a32e1a99596afbe6.js" new file mode 100644--- /dev/null +++ "b/.next/static/chunks/app/page-a32e1a99596afbe6.js" @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{8846:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>tJ});var a=n(5155),s=n(2115),r=n(5695),o=n(4520),i=n(3999),l=n(7168),c=n(9852);let d=s.forwardRef((e,t)=>{let{className:n,...s}=e;return(0,a.jsx)("textarea",{className:(0,i.cn)("flex min-h-[84px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",n),ref:t,...s})});d.displayName="Textarea";var m=n(2332),u=n(7434),p=n(7213),h=n(5196),g=n(4416),v=n(6287),f=n(4395),x=n(5880),b=n(5868),y=n(4020),w=n(2657),j=n(4357),k=n(7108),N=n(1788),C=n(2525),S=n(757),E=n(3853);function A(e){let{...t}=e;return(0,a.jsx)(E.bL,{"data-slot":"dropdown-menu",...t})}function P(e){let{...t}=e;return(0,a.jsx)(E.l9,{"data-slot":"dropdown-menu-trigger",...t})}function I(e){let{className:t,sideOffset:n=4,...s}=e;return(0,a.jsx)(E.ZL,{children:(0,a.jsx)(E.UC,{"data-slot":"dropdown-menu-content",sideOffset:n,className:(0,i.cn)("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-40 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-lg",t),...s})})}function D(e){let{className:t,inset:n,variant:s="default",...r}=e;return(0,a.jsx)(E.q7,{"data-slot":"dropdown-menu-item","data-inset":n,"data-variant":s,className:(0,i.cn)("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",t),...r})}function L(e){let{className:t,...n}=e;return(0,a.jsx)(E.wv,{"data-slot":"dropdown-menu-separator",className:(0,i.cn)("bg-border -mx-1 my-1 h-px",t),...n})}var T=n(6671);function M(e){var t,n;let{project:r,onSelect:E,onDelete:M,onExport:z,onExportZip:F,onDuplicate:R,onPreview:O,onUpdate:B,viewMode:W="grid",forceMenuOpen:U=!1,highlightExport:_=!1}=e,[$,Y]=(0,s.useState)(!1),[H,V]=(0,s.useState)(r.name),[q,G]=(0,s.useState)(r.description||""),[J,K]=(0,s.useState)(null),[Z,X]=(0,s.useState)(!0),[Q,ee]=(0,s.useState)(!1);(0,s.useEffect)(()=>{et()},[r.id]);let et=async()=>{try{let e=await o.OP.getProjectStats(r.id);K(e)}catch(e){i.v.error("Failed to load project stats:",e)}finally{X(!1)}},en=async()=>{if(!H.trim()){T.oR.error("Project name cannot be empty"),V(r.name),Y(!1);return}if(H.length>50)return void T.oR.error("Project name must be 50 characters or less");if(q.length>200)return void T.oR.error("Description must be 200 characters or less");try{r.name=H.trim(),r.description=q.trim()||void 0,await o.OP.updateProject(r),B(r),Y(!1),T.oR.success("Project updated")}catch(e){i.v.error("Failed to update project:",e),T.oR.error("Failed to update project"),V(r.name),G(r.description||"")}},ea=()=>{V(r.name),G(r.description||""),Y(!1)};(0,s.useEffect)(()=>{U?ee(!0):ee(!1)},[U]);let es=e=>{if(U)return void ee(!0);ee(e)},er=()=>J?Object.entries(J.fileTypes).sort((e,t)=>{let[,n]=e,[,a]=t;return a-n}).slice(0,3):[],eo=e=>{let t=e.toLowerCase();return["html","htm"].includes(t)?(0,a.jsx)(m.A,{className:"h-3 w-3"}):["css","scss","sass"].includes(t)?(0,a.jsx)(u.A,{className:"h-3 w-3"}):["js","jsx","ts","tsx"].includes(t)?(0,a.jsx)(m.A,{className:"h-3 w-3"}):["png","jpg","jpeg","gif","svg"].includes(t)?(0,a.jsx)(p.A,{className:"h-3 w-3"}):(0,a.jsx)(u.A,{className:"h-3 w-3"})},ei=e=>e&&0!==e?"$".concat(e.toFixed(2)):null;return"list"===W?(0,a.jsx)("div",{className:"border border-border rounded-lg p-4 hover:shadow-md transition-all cursor-pointer hover:border-primary/50 ".concat(_?"ring-2 ring-primary/70 animate-ring-opacity":""),style:{background:"linear-gradient(var(--project-card-tint), var(--project-card-tint)), var(--card)"},onClick:()=>E(r),children:(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsx)("div",{className:"flex-1 min-w-0",children:(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[$?(0,a.jsxs)("div",{className:"flex items-center gap-2",onClick:e=>e.stopPropagation(),children:[(0,a.jsx)(c.p,{value:H,onChange:e=>V(e.target.value),onKeyDown:e=>{"Enter"===e.key&&en(),"Escape"===e.key&&ea()},className:"h-7 text-sm",autoFocus:!0,maxLength:50}),(0,a.jsxs)("span",{className:"text-xs text-muted-foreground",children:[H.length,"/50"]}),(0,a.jsx)(l.$,{size:"icon",variant:"ghost",className:"h-5 w-5",onClick:en,children:(0,a.jsx)(h.A,{className:"h-3 w-3"})}),(0,a.jsx)(l.$,{size:"icon",variant:"ghost",className:"h-5 w-5",onClick:ea,children:(0,a.jsx)(g.A,{className:"h-3 w-3"})})]}):(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("h3",{className:"font-semibold truncate",children:r.name}),(0,a.jsx)(l.$,{size:"icon",variant:"ghost",className:"h-5 w-5 opacity-0 group-hover:opacity-100",onClick:e=>{e.stopPropagation(),Y(!0)},children:(0,a.jsx)(v.A,{className:"h-3 w-3"})})]}),r.description&&!$&&(0,a.jsx)("span",{className:"text-sm text-muted-foreground truncate max-w-md",children:r.description})]})}),(0,a.jsxs)("div",{className:"flex items-center gap-4 ml-4",children:[J&&(0,a.jsxs)("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[(0,a.jsxs)("span",{className:"flex items-center gap-1",children:[(0,a.jsx)(f.A,{className:"h-4 w-4"}),J.fileCount," files"]}),(0,a.jsxs)("span",{className:"flex items-center gap-1",children:[(0,a.jsx)(x.A,{className:"h-4 w-4"}),J.formattedSize]}),(null==(n=r.costTracking)?void 0:n.totalCost)&&(0,a.jsxs)("span",{className:"flex items-center gap-1",children:[(0,a.jsx)(b.A,{className:"h-4 w-4"}),ei(r.costTracking.totalCost)]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"text-xs text-muted-foreground",children:(0,S.m)(r.updatedAt,{addSuffix:!0})}),(0,a.jsxs)(A,{open:!!U||Q,onOpenChange:es,children:[(0,a.jsx)(P,{asChild:!0,onClick:e=>e.stopPropagation(),"data-tour-id":_?"project-actions-trigger":void 0,children:(0,a.jsx)(l.$,{size:"icon",variant:"ghost",className:"h-8 w-8",children:(0,a.jsx)(y.A,{className:"h-4 w-4"})})}),(0,a.jsxs)(I,{align:"end",children:[(0,a.jsxs)(D,{onClick:e=>{e.stopPropagation(),O(r)},children:[(0,a.jsx)(w.A,{className:"mr-2 h-4 w-4"}),"Preview"]}),(0,a.jsxs)(D,{onClick:e=>{e.stopPropagation(),R(r)},children:[(0,a.jsx)(j.A,{className:"mr-2 h-4 w-4"}),"Duplicate"]}),(0,a.jsx)(L,{}),(0,a.jsxs)(D,{onClick:e=>{e.stopPropagation(),F(r)},children:[(0,a.jsx)(k.A,{className:"mr-2 h-4 w-4"}),"Export as ZIP"]}),(0,a.jsxs)(D,{onClick:e=>{e.stopPropagation(),z(r)},"data-tour-id":_?"project-export-json":void 0,children:[(0,a.jsx)(N.A,{className:"mr-2 h-4 w-4"}),"Export as JSON"]}),(0,a.jsx)(L,{}),(0,a.jsxs)(D,{className:"text-destructive",onClick:e=>{e.stopPropagation(),M(r)},children:[(0,a.jsx)(C.A,{className:"mr-2 h-4 w-4"}),"Delete"]})]})]})]})]})]})}):(0,a.jsx)("div",{className:"border border-border rounded-lg p-4 hover:shadow-lg transition-all cursor-pointer hover:border-primary/50 group ".concat(_?"ring-2 ring-primary/70 animate-ring-opacity":""),style:{background:"linear-gradient(var(--project-card-tint), var(--project-card-tint)), var(--card)"},onClick:()=>E(r),"data-tour-id":"project-card",children:(0,a.jsxs)("div",{className:"space-y-3",children:[(0,a.jsxs)("div",{className:"flex justify-between items-start",children:[$?(0,a.jsxs)("div",{className:"flex-1",onClick:e=>e.stopPropagation(),children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(c.p,{value:H,onChange:e=>V(e.target.value),onKeyDown:e=>{"Enter"===e.key&&!1===e.shiftKey&&(e.preventDefault(),en()),"Escape"===e.key&&ea()},className:"h-8 text-sm font-semibold",autoFocus:!0,maxLength:50}),(0,a.jsx)(l.$,{size:"icon",variant:"ghost",className:"h-5 w-5",onClick:en,children:(0,a.jsx)(h.A,{className:"h-3 w-3"})}),(0,a.jsx)(l.$,{size:"icon",variant:"ghost",className:"h-5 w-5",onClick:ea,children:(0,a.jsx)(g.A,{className:"h-3 w-3"})})]}),(0,a.jsxs)("span",{className:"text-xs text-muted-foreground mt-1",children:[H.length,"/50"]})]}):(0,a.jsxs)("div",{className:"flex items-center gap-2 flex-1",children:[(0,a.jsx)("h3",{className:"font-semibold text-lg truncate flex-1",children:r.name}),(0,a.jsx)(l.$,{size:"icon",variant:"ghost",className:"h-5 w-5 opacity-0 group-hover:opacity-100 transition-opacity",onClick:e=>{e.stopPropagation(),Y(!0)},children:(0,a.jsx)(v.A,{className:"h-3 w-3"})})]}),(0,a.jsxs)(A,{open:!!U||Q,onOpenChange:es,children:[(0,a.jsx)(P,{asChild:!0,onClick:e=>e.stopPropagation(),"data-tour-id":_?"project-actions-trigger":void 0,children:(0,a.jsx)(l.$,{size:"icon",variant:"ghost",className:"h-8 w-8",children:(0,a.jsx)(y.A,{className:"h-4 w-4"})})}),(0,a.jsxs)(I,{align:"end",children:[(0,a.jsxs)(D,{onClick:e=>{e.stopPropagation(),O(r)},children:[(0,a.jsx)(w.A,{className:"mr-2 h-4 w-4"}),"Preview"]}),(0,a.jsxs)(D,{onClick:e=>{e.stopPropagation(),R(r)},children:[(0,a.jsx)(j.A,{className:"mr-2 h-4 w-4"}),"Duplicate"]}),(0,a.jsx)(L,{}),(0,a.jsxs)(D,{onClick:e=>{e.stopPropagation(),F(r)},children:[(0,a.jsx)(k.A,{className:"mr-2 h-4 w-4"}),"Export as ZIP"]}),(0,a.jsxs)(D,{onClick:e=>{e.stopPropagation(),z(r)},"data-tour-id":_?"project-export-json":void 0,children:[(0,a.jsx)(N.A,{className:"mr-2 h-4 w-4"}),"Export as JSON"]}),(0,a.jsx)(L,{}),(0,a.jsxs)(D,{className:"text-destructive",onClick:e=>{e.stopPropagation(),M(r)},children:[(0,a.jsx)(C.A,{className:"mr-2 h-4 w-4"}),"Delete"]})]})]})]}),$?(0,a.jsxs)("div",{onClick:e=>e.stopPropagation(),children:[(0,a.jsx)(d,{value:q,onChange:e=>G(e.target.value),onKeyDown:e=>{"Escape"===e.key&&ea()},placeholder:"Add a description...",className:"min-h-[60px] text-sm resize-none",maxLength:200}),(0,a.jsx)("div",{className:"flex items-center justify-between mt-1",children:(0,a.jsxs)("span",{className:"text-xs text-muted-foreground",children:[q.length,"/200"]})})]}):(0,a.jsx)("div",{className:"min-h-[40px]",children:r.description?(0,a.jsx)("p",{className:"text-sm text-muted-foreground line-clamp-2",children:r.description}):(0,a.jsx)("p",{className:"text-sm text-muted-foreground/50 italic",children:"No description"})}),Z?(0,a.jsx)("div",{className:"h-6 bg-muted animate-pulse rounded"}):J&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 text-sm text-muted-foreground pt-2 border-t",children:[(0,a.jsxs)("span",{className:"flex items-center gap-1",children:[(0,a.jsx)(f.A,{className:"h-4 w-4"}),J.fileCount," ",1===J.fileCount?"file":"files"]}),(0,a.jsxs)("span",{className:"flex items-center gap-1",children:[(0,a.jsx)(x.A,{className:"h-4 w-4"}),J.formattedSize]}),(null==(t=r.costTracking)?void 0:t.totalCost)&&r.costTracking.totalCost>0&&(0,a.jsxs)("span",{className:"flex items-center gap-1",children:[(0,a.jsx)(b.A,{className:"h-4 w-4"}),ei(r.costTracking.totalCost)]})]}),er().length>0&&(0,a.jsx)("div",{className:"flex items-center gap-3 text-xs",children:er().map(e=>{let[t,n]=e;return(0,a.jsxs)("div",{className:"flex items-center gap-1 text-muted-foreground",children:[eo(t),(0,a.jsxs)("span",{children:[t," (",n,")"]})]},t)})})]}),(0,a.jsx)("div",{className:"text-xs text-muted-foreground pt-2 border-t",children:(0,a.jsxs)("p",{children:["Updated ",(0,S.m)(r.updatedAt,{addSuffix:!0})]})})]})})}var z=n(3902),F=n(3904),R=n(2355),O=n(3052),B=n(7340),W=n(2580),U=n(6767),_=n(2280),$=n(4738),Y=n(5784);let H={mobile:{width:"375px",height:"100%",maxHeight:"667px"},tablet:{width:"768px",height:"100%",maxHeight:"1024px"},desktop:{width:"100%",height:"100%",maxHeight:"900px",maxWidth:"1440px"},responsive:{width:"100%",height:"100%"}};function V(e){let{projectId:t,refreshTrigger:n,onFocusSelection:r,hasFocusTarget:c=!1,onClose:d}=e,[m,u]=(0,s.useState)(null),[p,h]=(0,s.useState)("/"),[v,f]=(0,s.useState)(!0),[x,b]=(0,s.useState)(null),[y,j]=(0,s.useState)("tablet"),[k,N]=(0,s.useState)(["/"]),[C,S]=(0,s.useState)(0),[E,A]=(0,s.useState)(!1),[P,I]=(0,s.useState)(!1),D=P?{backgroundColor:"var(--button-preview-active)",color:"white"}:c?{backgroundColor:"rgba(99, 102, 241, 0.12)",color:"var(--button-preview-active)"}:{},L=(0,s.useRef)(null),T=(0,s.useRef)(null),M=(0,s.useRef)(null),V=(0,s.useRef)("/"),q=(0,s.useRef)(null),G=(0,s.useRef)(!1),J=(0,s.useCallback)(e=>{if(L.current&&L.current.contentWindow)try{L.current.contentWindow.postMessage(e,"*")}catch(e){i.v.warn("Failed to communicate with preview iframe",e)}},[]),K=(0,s.useRef)(!1),Z=(0,s.useRef)(null),X=(0,s.useRef)(null),Q=(0,s.useRef)(null),ee=()=>(0,a.jsxs)("div",{className:"p-3 border-b bg-muted/70 flex items-center gap-2",children:[(0,a.jsx)(w.A,{className:"h-4 w-4 md:hidden",style:{color:"var(--button-preview-active)"}}),d?(0,a.jsxs)("button",{type:"button",onClick:d,"aria-label":"Hide preview",className:"relative hidden h-6 w-6 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:text-destructive md:flex group",children:[(0,a.jsx)(w.A,{className:"h-4 w-4 transition-opacity group-hover:opacity-0",style:{color:"var(--button-preview-active)"}}),(0,a.jsx)(g.A,{className:"absolute h-3 w-3 opacity-0 transition-opacity group-hover:opacity-100"})]}):(0,a.jsx)(w.A,{className:"hidden h-4 w-4 md:inline-flex",style:{color:"var(--button-preview-active)"}}),(0,a.jsx)("h3",{className:"text-sm font-medium",children:"Live Preview"})]});(0,s.useEffect)(()=>{M.current=m},[m]),(0,s.useEffect)(()=>{G.current=P,E&&J({type:"selector-toggle",active:P})},[P,E,J]),(0,s.useEffect)(()=>{let e=L.current;if(!e)return;let t=()=>{J({type:"selector-toggle",active:G.current})};return e.addEventListener("load",t),()=>{e.removeEventListener("load",t)}},[E,J]),(0,s.useEffect)(()=>{V.current=p},[p]),(0,s.useEffect)(()=>{if(E&&q.current&&M.current){let e=q.current;q.current=null,es(e,M.current)}},[E]),(0,s.useEffect)(()=>()=>{X.current&&window.clearTimeout(X.current)},[]);let et=(0,s.useCallback)(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=!(arguments.length>1)||void 0===arguments[1]||arguments[1];n&&f(!0),b(null);try{await o.OP.init();let n=e?V.current:null;T.current&&T.current.cleanupBlobUrls();let a=new z.B(o.OP,t);T.current=a;let s=await a.compileProject();u(s),M.current=s;let r=n;r||(r=s.blobUrls.has("/index.html")?"/":s.entryPoint||(s.routes.length>0?s.routes[0].path:"/")),es(r,s)}catch(e){b(e instanceof Error?e.message:"Failed to compile project"),i.v.error("Compilation error:",e)}finally{n&&f(!1)}},[t]),en=(0,s.useCallback)(function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=!(arguments.length>1)||void 0===arguments[1]||arguments[1];if(K.current){var n,a;let s=Z.current;Z.current={preserve:null!=(n=null==s?void 0:s.preserve)&&n||e,showLoading:null!=(a=null==s?void 0:s.showLoading)&&a||t};return}(async(e,t)=>{K.current=!0;try{await et(e,t)}finally{K.current=!1;let e=Z.current;Z.current=null,e&&en(e.preserve,e.showLoading)}})(e,t)},[et]),ea=(0,s.useCallback)(function(){var e,t;let n=arguments.length>0&&void 0!==arguments[0]&&arguments[0],a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s=Q.current;Q.current={preserve:null!=(e=null==s?void 0:s.preserve)&&e||n,showLoading:null!=(t=null==s?void 0:s.showLoading)&&t||a},X.current&&window.clearTimeout(X.current),X.current=window.setTimeout(()=>{let e=Q.current;Q.current=null,X.current=null,e&&en(e.preserve,e.showLoading)},150)},[en]);(0,s.useEffect)(()=>{en()},[t,n,en]),(0,s.useEffect)(()=>{let e=()=>{ea(!0)},n=e=>{e.detail&&e.detail.projectId!==t||ea(!0)};return window.addEventListener("filesChanged",e),window.addEventListener("fileContentChanged",n),()=>{window.removeEventListener("filesChanged",e),window.removeEventListener("fileContentChanged",n)}},[t,ea]);let es=(e,t)=>{let n,a=t||M.current||m;if(!a)return void i.v.warn("No compiled project available");if(G.current?I(!1):J({type:"selector-toggle",active:!1}),!L.current||!E){q.current=e;return}let s=e;s.startsWith("/")||(s="/"+s);let r=a.routes.find(e=>e.path===s);n=r?r.file:"/"===s?"/index.html":s+".html";let o=a.files.find(e=>e.path===n);if(!o){b("Page not found: ".concat(e)),a.files.find(e=>"/index.html"===e.path||"index.html"===e.path)&&"/"!==e&&es("/",t);return}let l="string"==typeof o.content?o.content:new TextDecoder().decode(o.content);l=(l=(l=l.replace(/href="([^"]+)"/g,(e,t)=>{if(!t.endsWith(".css")||t.startsWith("http")||t.startsWith("//"))return e;let n=t.startsWith("/")?t:"/"+t,s=a.blobUrls.get(n);return s?'href="'.concat(s,'"'):e})).replace(/src="([^"]+)"/g,(e,t)=>{if(!t.endsWith(".js")||t.startsWith("http")||t.startsWith("//"))return e;let n=t.startsWith("/")?t:"/"+t,s=a.blobUrls.get(n);return s?'src="'.concat(s,'"'):e})).replace(/src="([^"]+\.(png|jpg|jpeg|gif|svg|webp))"/gi,(e,t)=>{let n=t.startsWith("/")?t:"/"+t,s=a.blobUrls.get(n);return s?'src="'.concat(s,'"'):e});let c="\n