@libxai/board 0.17.43 → 0.17.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/styles.css +4973 -4973
- package/package.json +141 -141
package/dist/index.cjs
CHANGED
|
@@ -273,7 +273,7 @@
|
|
|
273
273
|
</Calendars>
|
|
274
274
|
<Tasks>${p}
|
|
275
275
|
</Tasks>
|
|
276
|
-
</Project>`,c=new Blob([n],{type:"application/xml;charset=utf-8;"}),d=document.createElement("a");d.href=URL.createObjectURL(c),d.download=a,d.click(),URL.revokeObjectURL(d.href);},calculateCriticalPath:e=>{let t=K.flattenTasks(e),a=t.filter(n=>n.startDate&&n.endDate);if(a.length===0)return [];let r=new Map,o=n=>{if(r.has(n.id))return;let c=n.startDate&&n.endDate?K.calculateDuration(n.startDate,n.endDate):0,d=0;if(n.dependencies&&n.dependencies.length>0)for(let g of n.dependencies){let v=t.find(x=>x.id===g);if(v){o(v);let x=r.get(g)?.ef||0;d=Math.max(d,x);}}let i=d+c;r.set(n.id,{es:d,ef:i});};a.forEach(o);let s=Math.max(...Array.from(r.values()).map(n=>n.ef)),l=new Map,m=n=>{if(l.has(n.id))return;let c=n.startDate&&n.endDate?K.calculateDuration(n.startDate,n.endDate):0,d=t.filter(v=>v.dependencies&&v.dependencies.includes(n.id)),i=s;if(d.length>0)for(let v of d){m(v);let x=l.get(v.id)?.ls||0;i=Math.min(i,x);}let g=i-c;l.set(n.id,{ls:g,lf:i});};a.forEach(m);let p=[];for(let n of a){let c=r.get(n.id),d=l.get(n.id);if(c&&d){let i=d.ls-c.es;Math.abs(i)<.01&&p.push(n.id);}}return p},calculateSlack:(e,t)=>{let a=K.findTaskById(e,t);if(!a||!a.startDate||!a.endDate)return null;if(K.calculateCriticalPath(e).includes(t))return 0;let o=K.getDependentTasks(e,t);if(o.length===0){let m=K.getLatestEndDate(e);if(!m)return null;let p=K.calculateDuration(a.endDate,m);return Math.max(0,p)}let s=o.filter(m=>m.startDate).map(m=>m.startDate.getTime()).sort((m,p)=>m-p)[0];if(!s)return null;let l=K.calculateDuration(a.endDate,new Date(s));return Math.max(0,l)},isOnCriticalPath:(e,t)=>K.calculateCriticalPath(e).includes(t),autoScheduleDependents:(e,t,a)=>{let r=K.findTaskById(e,t);if(!r||!r.endDate)return e;let o=K.getDependentTasks(e,t);if(o.length===0)return e;let s=[...e];for(let l of o){if(!l.startDate||!l.endDate)continue;let m=K.calculateDuration(l.startDate,l.endDate),p;a!==void 0?(p=new Date(l.startDate),p.setDate(p.getDate()+a)):(p=new Date(r.endDate),p.setDate(p.getDate()+1));let n=K.calculateEndDate(p,m),c=d=>d.map(i=>i.id===l.id?{...i,startDate:p,endDate:n}:i.subtasks?{...i,subtasks:c(i.subtasks)}:i);s=c(s),s=K.autoScheduleDependents(s,l.id,a);}return s},calculateCascadePreview:(e,t,a,r,o,s,l,m)=>{if(a===0)return [];let p=[],n=o.getTime(),c=1e3*60*60*24,d=K.findTaskById(e,t);if(!d||!d.endDate)return [];let i=(g,v,x=new Set)=>{if(x.has(g))return;x.add(g);let y=K.getDependentTasks(e,g);for(let h of y){if(!h.startDate||!h.endDate)continue;let f=r.findIndex(G=>G.id===h.id);if(f===-1)continue;let u=h.startDate.getTime(),T=(h.endDate.getTime()-u)/c,N=(u-n)/c*s,k=N+v*s,S=Math.max(T*s,s),w=m+f*l+12;p.push({taskId:h.id,taskName:h.name,originalX:N,previewX:k,width:S,y:w,rowIndex:f,daysDelta:v,color:h.color}),i(h.id,v,x);}};return i(t,a),p},splitTask:(e,t,a,r=3)=>{let o=K.findTaskById(e,t);if(!o||!o.startDate||!o.endDate)return e;if(a<=o.startDate||a>=o.endDate)return console.warn("Split date must be between task start and end dates"),e;let s=new Date(a);s.setDate(s.getDate()-1);let l=new Date(a);l.setDate(l.getDate()+r);let m=new Date(o.endDate);m.setDate(m.getDate()+r);let p=[{startDate:new Date(o.startDate),endDate:s},{startDate:l,endDate:m}],n=c=>c.map(d=>d.id===o.id?{...d,endDate:m,segments:p}:d.subtasks?{...d,subtasks:n(d.subtasks)}:d);return n(e)}};function uo({tasks:e,theme:t,rowHeight:a,timeScale:r,startDate:o,endDate:s,zoom:l,templates:m,onTaskClick:p,onTaskDblClick:n,onTaskContextMenu:c,onTaskDateChange:d,onDependencyCreate:i,onDependencyDelete:g}){let[x,y]=react.useState([]),h=Math.ceil((s.getTime()-o.getTime())/(1e3*60*60*24)),f=r==="day"?60:r==="week"?20:8,u=h*f*l,C=E=>{let z=new Date(Date.UTC(E.getFullYear(),E.getMonth(),E.getDate())),Q=z.getUTCDay()||7;z.setUTCDate(z.getUTCDate()+4-Q);let te=new Date(Date.UTC(z.getUTCFullYear(),0,1));return Math.ceil(((z.getTime()-te.getTime())/864e5+1)/7)},T=E=>{let z=E.getDay();return z===0||z===6},b=react.useCallback(E=>{let z=Math.round(E/(f*l)),Q=new Date(o);return Q.setDate(Q.getDate()+z),Q},[o,f,l]),N=react.useCallback((E,z)=>{if(z.startDate&&z.endDate)return;let Q=E.currentTarget.ownerSVGElement;if(!Q)return;let te=Q.createSVGPoint();te.x=E.clientX,te.y=E.clientY;let le=te.matrixTransform(Q.getScreenCTM()?.inverse()),se=b(le.x),_=new Date(se);_.setDate(_.getDate()+1),d?.(z,se,_);},[b,d]),k=react.useMemo(()=>{let E=le=>le.map(se=>{if(se.subtasks&&se.subtasks.length>0){let _=E(se.subtasks),O=_.filter(M=>M.startDate&&M.endDate);if(O.length>0){let M=O.map(Oe=>Oe.startDate.getTime()),ue=O.map(Oe=>Oe.endDate.getTime()),Y=new Date(Math.min(...M)),$e=new Date(Math.max(...ue));return {...se,subtasks:_,startDate:se.startDate||Y,endDate:se.endDate||$e}}return {...se,subtasks:_}}return se}),z=(le,se=[])=>{for(let _ of le)se.push(_),_.subtasks&&_.subtasks.length>0&&(_.isExpanded===void 0||_.isExpanded)&&z(_.subtasks,se);return se},Q=E(e);return z(Q)},[e]),S=react.useCallback(E=>{if(!E.startDate||!E.endDate)return {x:0,width:0};let z=E.startDate.getTime(),Q=E.endDate.getTime(),te=o.getTime(),le=(z-te)/(1e3*60*60*24),se=(Q-z)/(1e3*60*60*24),_=le*f*l,O=Math.max(f*l,40),M=Math.max(se*f*l,O);return {x:_,width:M}},[o,f,l]),w=react.useMemo(()=>k.filter(E=>E.startDate&&E.endDate).map(E=>{let{x:z,width:Q}=S(E),le=k.findIndex(se=>se.id===E.id)*a+12;return {id:E.id,x:z,y:le,width:Q,height:32}}),[k,S]),G=react.useCallback((E,z,Q)=>{if(!Q||z===0){y([]);return}let te=K.calculateCascadePreview(e,E,z,k,o,f*l,a,48);y(te);},[e,k,o,f,l,a,48]),H=react.useMemo(()=>{let E=[],z=new Date(o);for(;z<=s;){let le=(z.getTime()-o.getTime())/864e5*f*l;if(r==="day")E.push({date:new Date(z),label:z.toLocaleDateString("en-US",{day:"numeric",month:"short"}),x:le}),z.setDate(z.getDate()+1);else if(r==="week"){let se=C(z);E.push({date:new Date(z),label:`Week ${se}`,x:le}),z.setDate(z.getDate()+7);}else E.push({date:new Date(z),label:z.toLocaleDateString("en-US",{month:"short",year:"numeric"}),x:le}),z.setMonth(z.getMonth()+1);}return E},[o,s,r,f,l]),F=react.useMemo(()=>(new Date().getTime()-o.getTime())/(1e3*60*60*24)*f*l,[o,f,l]),W=Math.max(k.length*a,552);return jsxRuntime.jsxs("div",{className:"w-full h-full flex flex-col","data-gantt-chart":true,style:{backgroundColor:t.bgPrimary,overflow:"visible"},children:[jsxRuntime.jsx("div",{style:{position:"sticky",top:0,zIndex:10,backgroundColor:t.bgGrid,flexShrink:0,height:"48px",borderBottom:`1px solid ${t.border}`,boxSizing:"border-box"},children:jsxRuntime.jsxs("svg",{width:Math.max(u,1e3),height:47,style:{display:"block"},children:[jsxRuntime.jsx("rect",{x:0,y:0,width:Math.max(u,1e3),height:48,fill:t.bgGrid}),H.map((E,z)=>jsxRuntime.jsxs("g",{children:[z>0&&jsxRuntime.jsx("line",{x1:E.x,y1:0,x2:E.x,y2:48,stroke:t.border,strokeWidth:1,opacity:.1}),jsxRuntime.jsx("text",{x:E.x+8,y:48/2,fill:t.textTertiary,fontSize:"11",fontFamily:"'JetBrains Mono', ui-monospace, monospace",fontWeight:"500",dominantBaseline:"middle",children:E.label})]},`header-${z}`)),F>=0&&F<=u&&jsxRuntime.jsx("circle",{cx:F,cy:38,r:6,fill:t.today,opacity:1})]})}),jsxRuntime.jsxs("svg",{width:Math.max(u,1e3),height:W,style:{display:"block",flexShrink:0,overflow:"visible"},children:[jsxRuntime.jsxs("defs",{children:[jsxRuntime.jsx("filter",{id:"shadow",children:jsxRuntime.jsx("feDropShadow",{dx:"0",dy:"1",stdDeviation:"2",floodOpacity:"0.1"})}),jsxRuntime.jsx("pattern",{id:"diagonal-stripes",width:"8",height:"8",patternUnits:"userSpaceOnUse",patternTransform:"rotate(45)",children:jsxRuntime.jsx("line",{x1:"0",y1:"0",x2:"0",y2:"8",stroke:t.border,strokeWidth:"2"})})]}),jsxRuntime.jsx("rect",{x:0,y:0,width:Math.max(u,1e3),height:W,fill:t.bgPrimary}),H.map((E,z)=>{let Q=H[z+1]?.x||u,te=T(E.date);return jsxRuntime.jsxs("g",{children:[te&&jsxRuntime.jsx("rect",{x:E.x,y:0,width:Q-E.x,height:k.length*a,fill:t.bgWeekend,opacity:1}),z>0&&jsxRuntime.jsx("line",{x1:E.x,y1:0,x2:E.x,y2:k.length*a,stroke:t.border,strokeWidth:1,opacity:.1})]},z)}),F>=0&&F<=u&&jsxRuntime.jsx("line",{x1:F,y1:0,x2:F,y2:k.length*a,stroke:t.today,strokeWidth:2,opacity:1}),k.map((E,z)=>{let Q=E.startDate&&E.endDate;return jsxRuntime.jsxs("g",{children:[jsxRuntime.jsx("rect",{x:0,y:z*a,width:u,height:a,fill:z%2===0?"transparent":t.bgSecondary,opacity:1,style:{pointerEvents:"none"}},`row-${E.id}`),!Q&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("rect",{x:0,y:z*a,width:u,height:a,fill:"transparent",style:{cursor:"pointer",pointerEvents:"all"},onClick:te=>N(te,E),onMouseEnter:te=>{te.currentTarget.setAttribute("fill",t.accentLight),te.currentTarget.setAttribute("opacity","0.5");},onMouseLeave:te=>{te.currentTarget.setAttribute("fill","transparent"),te.currentTarget.setAttribute("opacity","1");}},`clickable-${E.id}`),jsxRuntime.jsx("text",{x:F>0?F:100,y:z*a+a/2,fill:t.textTertiary,fontSize:"12",fontFamily:"Inter, sans-serif",fontStyle:"italic",dominantBaseline:"middle",opacity:.4,style:{pointerEvents:"none",userSelect:"none"},children:"Click to set dates..."},`placeholder-${E.id}`)]})]},`row-group-${E.id}`)}),k.map((E,z)=>!E.dependencies||E.dependencies.length===0||!E.startDate||!E.endDate?null:E.dependencies.map(Q=>{let te=k.find(O=>O.id===Q);if(!te||!te.startDate||!te.endDate)return null;let le=k.findIndex(O=>O.id===Q),se=S(te),_=S(E);return jsxRuntime.jsx(io,{x1:se.x+se.width,y1:le*a+a/2,x2:_.x,y2:z*a+a/2,theme:t,onDelete:()=>g?.(E.id,Q)},`dep-${Q}-${E.id}`)})),k.map((E,z)=>{if(!E.startDate||!E.endDate)return null;let{x:Q,width:te}=S(E),le=z*a+12,se=E.subtasks&&E.subtasks.length>0&&!E.isMilestone;return E.isMilestone?jsxRuntime.jsx(co,{task:E,x:Q+te/2,y:le+16,theme:t,onClick:p},E.id):se?jsxRuntime.jsxs("g",{onClick:()=>p?.(E),style:{cursor:"pointer"},children:[jsxRuntime.jsx("rect",{x:Q,y:le,width:te,height:32,fill:t.primary,opacity:.25,rx:6}),jsxRuntime.jsx("line",{x1:Q,y1:le,x2:Q+te,y2:le,stroke:t.primary,strokeWidth:3,opacity:.9,strokeLinecap:"round"}),jsxRuntime.jsx("line",{x1:Q,y1:le,x2:Q,y2:le+32,stroke:t.primary,strokeWidth:3,opacity:.9,strokeLinecap:"round"}),jsxRuntime.jsx("line",{x1:Q+te,y1:le,x2:Q+te,y2:le+32,stroke:t.primary,strokeWidth:3,opacity:.9,strokeLinecap:"round"}),jsxRuntime.jsx("line",{x1:Q,y1:le+32,x2:Q+te,y2:le+32,stroke:t.primary,strokeWidth:3,opacity:.9,strokeLinecap:"round"}),te>60&&jsxRuntime.jsx("text",{x:Q+12,y:le+16,dominantBaseline:"middle",fill:"#FFFFFF",fontSize:"13",fontWeight:"500",fontFamily:"Inter, sans-serif",style:{pointerEvents:"none",userSelect:"none"},children:E.name})]},E.id):jsxRuntime.jsx(no,{task:E,x:Q,y:le,width:te,theme:t,dayWidth:f*l,startDate:o,templates:m,onClick:p,onDoubleClick:n,onContextMenu:c,onDateChange:d,onDependencyCreate:i,allTaskPositions:w,onDragMove:G},E.id)}),x.map(E=>jsxRuntime.jsxs("g",{style:{pointerEvents:"none"},children:[jsxRuntime.jsx("rect",{x:E.previewX,y:E.y-48,width:E.width,height:32,rx:8,fill:E.color||t.accent,opacity:.3,stroke:t.accent,strokeWidth:2,strokeDasharray:"4 2"}),Math.abs(E.daysDelta)>0&&jsxRuntime.jsx("text",{x:E.previewX+E.width/2,y:E.y-48+16,textAnchor:"middle",dominantBaseline:"middle",fill:t.accent,fontSize:"10",fontWeight:"600",fontFamily:"Inter, sans-serif",style:{userSelect:"none"},children:E.daysDelta>0?`+${E.daysDelta}d`:`${E.daysDelta}d`})]},`cascade-preview-${E.taskId}`))]})]})}var il=[{name:"Azul",value:"#6366F1",light:"#818CF8"},{name:"P\xFArpura",value:"#A855F7",light:"#C084FC"},{name:"Rosa",value:"#EC4899",light:"#F472B6"},{name:"Rojo",value:"#EF4444",light:"#F87171"},{name:"Naranja",value:"#F59E0B",light:"#FBBF24"},{name:"Amarillo",value:"#EAB308",light:"#FACC15"},{name:"Lima",value:"#84CC16",light:"#A3E635"},{name:"Verde",value:"#10B981",light:"#34D399"},{name:"Esmeralda",value:"#059669",light:"#10B981"},{name:"Cyan",value:"#06B6D4",light:"#22D3EE"},{name:"Azul Cielo",value:"#0EA5E9",light:"#38BDF8"},{name:"\xCDndigo",value:"#4F46E5",light:"#6366F1"},{name:"Violeta",value:"#8B5CF6",light:"#A78BFA"},{name:"Fucsia",value:"#D946EF",light:"#E879F9"},{name:"Gris",value:"#6B7280",light:"#9CA3AF"},{name:"Piedra",value:"#78716C",light:"#A8A29E"}];function ll({value:e="#6366F1",onChange:t,disabled:a=false}){return jsxRuntime.jsxs("div",{className:"space-y-2",children:[jsxRuntime.jsx("div",{className:"flex flex-wrap gap-2",children:il.map(r=>{let o=e===r.value;return jsxRuntime.jsx(framerMotion.motion.button,{type:"button",onClick:()=>!a&&t(r.value),className:"relative rounded-full transition-all focus:outline-none focus:ring-2 focus:ring-offset-2",style:{width:"32px",height:"32px",backgroundColor:r.value,boxShadow:o?`0 0 0 2px #FFFFFF, 0 0 0 4px ${r.value}`:"0 1px 3px rgba(0, 0, 0, 0.12)",opacity:a?.5:1,cursor:a?"not-allowed":"pointer"},whileHover:a?{}:{scale:1.1},whileTap:a?{}:{scale:.95},title:r.name,disabled:a,children:o&&jsxRuntime.jsx(framerMotion.motion.div,{initial:{scale:0},animate:{scale:1},className:"absolute inset-0 flex items-center justify-center",children:jsxRuntime.jsx(lucideReact.Check,{className:"w-4 h-4 text-white drop-shadow-md",strokeWidth:3})})},r.value)})}),e&&jsxRuntime.jsx("div",{className:"text-xs text-center font-medium",style:{color:e},children:il.find(r=>r.value===e)?.name||"Personalizado"})]})}function go({isOpen:e,onClose:t,task:a,availableTasks:r=[],availableUsers:o=[],onSubmit:s,isLoading:l=false,mode:m=a?"edit":"create",theme:p="dark"}){let n=De[p]||De.dark,c={backgroundColor:n.bgSecondary,border:`1px solid ${n.borderLight}`,color:n.textPrimary},d={color:n.textSecondary},[i,g]=react.useState({name:"",description:"",progress:0,status:"todo",priority:"medium",isMilestone:false,color:"#6366F1",assignees:[],dependencies:[]}),[v,x]=react.useState({});react.useEffect(()=>{g(a?{name:a.name,description:a.description||"",startDate:a.startDate,endDate:a.endDate,progress:a.progress,status:a.status||"todo",priority:a.priority||"medium",isMilestone:a.isMilestone||false,color:a.color||"#6366F1",assignees:a.assignees||[],dependencies:a.dependencies||[]}:{name:"",description:"",progress:0,status:"todo",priority:"medium",isMilestone:false,color:"#6366F1",assignees:[],dependencies:[]});},[a,e]);let y=()=>{let u={};return i.name.trim()||(u.name="El nombre es requerido"),i.startDate&&i.endDate&&i.startDate>i.endDate&&(u.endDate="La fecha de fin debe ser posterior a la de inicio"),x(u),Object.keys(u).length===0},h=async u=>{if(u.preventDefault(),!!y())try{await s(i),t();}catch(C){console.error("Error submitting task:",C);}},f=(u,C)=>{g(T=>{let b={...T,[u]:C};if(u==="progress"){let N=typeof C=="number"?C:parseInt(C,10);N===100&&T.status!=="completed"?b.status="completed":N>0&&N<100&&T.status==="todo"?b.status="in-progress":N===0&&T.status==="in-progress"&&(b.status="todo");}return b}),v[u]&&x(T=>{let b={...T};return delete b[u],b});};return jsxRuntime.jsx(framerMotion.AnimatePresence,{children:e&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(framerMotion.motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"fixed inset-0 bg-black/50 z-50",onClick:t}),jsxRuntime.jsx(framerMotion.motion.div,{initial:{opacity:0,scale:.95,y:20},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:20},transition:{duration:.2,ease:[.4,0,.2,1]},className:"fixed inset-0 z-50 flex items-center justify-center p-4 pointer-events-none",children:jsxRuntime.jsxs("div",{className:"w-full max-w-2xl rounded-xl shadow-2xl pointer-events-auto overflow-hidden",style:{backgroundColor:n.bgPrimary,border:`1px solid ${n.border}`},onClick:u=>u.stopPropagation(),children:[jsxRuntime.jsxs("div",{className:"flex items-center justify-between px-6 py-4",style:{borderBottom:`1px solid ${n.border}`},children:[jsxRuntime.jsx("h2",{className:"text-lg font-semibold",style:{color:n.textPrimary},children:m==="create"?"Crear Nueva Tarea":"Editar Tarea"}),jsxRuntime.jsx("button",{onClick:t,className:"p-2 rounded-lg transition-colors",style:{color:n.textSecondary},onMouseEnter:u=>u.currentTarget.style.backgroundColor=n.hoverBg,onMouseLeave:u=>u.currentTarget.style.backgroundColor="transparent",disabled:l,children:jsxRuntime.jsx(lucideReact.X,{className:"w-5 h-5"})})]}),jsxRuntime.jsxs("form",{onSubmit:h,className:"p-6 space-y-6 max-h-[calc(100vh-200px)] overflow-y-auto",children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("label",{className:"block text-sm font-medium mb-2",style:d,children:"Nombre de la Tarea *"}),jsxRuntime.jsx("input",{type:"text",value:i.name,onChange:u=>f("name",u.target.value),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent",style:c,onFocus:u=>u.currentTarget.style.borderColor=n.accent,onBlur:u=>u.currentTarget.style.borderColor=n.borderLight,placeholder:"Ej: Dise\xF1ar mockups de la aplicaci\xF3n",disabled:l}),v.name&&jsxRuntime.jsxs("p",{className:"mt-1 text-sm text-red-400 flex items-center gap-1",children:[jsxRuntime.jsx(lucideReact.AlertCircle,{className:"w-4 h-4"}),v.name]})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.FileText,{className:"w-4 h-4"}),"Descripci\xF3n"]}),jsxRuntime.jsx("textarea",{value:i.description||"",onChange:u=>f("description",u.target.value),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent resize-none",style:c,onFocus:u=>u.currentTarget.style.borderColor=n.accent,onBlur:u=>u.currentTarget.style.borderColor=n.borderLight,placeholder:"Describe los detalles de la tarea...",rows:3,disabled:l})]}),jsxRuntime.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Calendar,{className:"w-4 h-4"}),"Fecha de Inicio"]}),jsxRuntime.jsx("input",{type:"date",value:i.startDate?i.startDate.toISOString().split("T")[0]:"",onChange:u=>f("startDate",u.target.value?new Date(u.target.value):void 0),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent",style:c,disabled:l||i.isMilestone})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Calendar,{className:"w-4 h-4"}),"Fecha de Fin"]}),jsxRuntime.jsx("input",{type:"date",value:i.endDate?i.endDate.toISOString().split("T")[0]:"",onChange:u=>f("endDate",u.target.value?new Date(u.target.value):void 0),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent",style:c,disabled:l||i.isMilestone}),v.endDate&&jsxRuntime.jsxs("p",{className:"mt-1 text-sm text-red-400 flex items-center gap-1",children:[jsxRuntime.jsx(lucideReact.AlertCircle,{className:"w-4 h-4"}),v.endDate]})]})]}),jsxRuntime.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.CheckCircle2,{className:"w-4 h-4"}),"Estado"]}),jsxRuntime.jsxs("select",{value:i.status,onChange:u=>f("status",u.target.value),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent",style:c,disabled:l,children:[jsxRuntime.jsx("option",{value:"todo",children:"Por Hacer"}),jsxRuntime.jsx("option",{value:"in-progress",children:"En Progreso"}),jsxRuntime.jsx("option",{value:"completed",children:"Completada"})]})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Flag,{className:"w-4 h-4"}),"Prioridad"]}),jsxRuntime.jsxs("select",{value:i.priority||"medium",onChange:u=>f("priority",u.target.value),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent",style:c,disabled:l,children:[jsxRuntime.jsx("option",{value:"low",children:"\u{1F7E2} Baja"}),jsxRuntime.jsx("option",{value:"medium",children:"\u{1F7E1} Media"}),jsxRuntime.jsx("option",{value:"high",children:"\u{1F7E0} Alta"}),jsxRuntime.jsx("option",{value:"urgent",children:"\u{1F534} Urgente"})]})]})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-3 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Palette,{className:"w-4 h-4"}),"Color de la Tarea"]}),jsxRuntime.jsx(ll,{value:i.color,onChange:u=>f("color",u),disabled:l}),jsxRuntime.jsx("p",{className:"text-xs mt-2",style:{color:n.textTertiary},children:a?.parentId?"Esta subtarea hereda el color de su tarea padre":a?.subtasks&&a.subtasks.length>0?"Las subtareas heredar\xE1n este color con menor opacidad":"Elige un color para organizar visualmente tus tareas"})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center justify-between",style:d,children:[jsxRuntime.jsxs("span",{className:"flex items-center gap-2",children:[jsxRuntime.jsx(lucideReact.Clock,{className:"w-4 h-4"}),"Progreso"]}),jsxRuntime.jsxs("span",{className:"font-semibold px-2 py-0.5 rounded text-sm",style:{color:i.progress<30?"#EF4444":i.progress<70?"#F59E0B":"#10B981",backgroundColor:i.progress<30?"rgba(239, 68, 68, 0.1)":i.progress<70?"rgba(245, 158, 11, 0.1)":"rgba(16, 185, 129, 0.1)"},children:[i.progress,"%"]})]}),jsxRuntime.jsxs("div",{className:"relative",children:[jsxRuntime.jsx("input",{type:"range",min:"0",max:"100",step:"5",value:i.progress,onChange:u=>f("progress",parseInt(u.target.value)),className:"w-full h-2 rounded-lg appearance-none cursor-pointer",style:{backgroundColor:n.bgSecondary,accentColor:i.progress<30?"#EF4444":i.progress<70?"#F59E0B":"#10B981"},disabled:l}),jsxRuntime.jsx("div",{className:"absolute top-0 left-0 h-2 rounded-lg pointer-events-none transition-all duration-300",style:{width:`${i.progress}%`,backgroundColor:i.progress<30?"rgba(239, 68, 68, 0.3)":i.progress<70?"rgba(245, 158, 11, 0.3)":"rgba(16, 185, 129, 0.3)"}})]}),jsxRuntime.jsxs("div",{className:"flex items-center justify-between mt-3 gap-2",children:[jsxRuntime.jsx("span",{className:"text-xs",style:{color:n.textTertiary},children:"Accesos r\xE1pidos:"}),jsxRuntime.jsx("div",{className:"flex gap-1.5",children:[0,25,50,75,100].map(u=>jsxRuntime.jsxs("button",{type:"button",onClick:()=>f("progress",u),disabled:l,className:"px-3 py-1 text-xs font-medium rounded-md transition-all duration-200 hover:scale-105 active:scale-95",style:{backgroundColor:i.progress===u?u<30?"#EF4444":u<70?"#F59E0B":"#10B981":n.bgSecondary,color:i.progress===u?"#FFFFFF":n.textSecondary,border:`1px solid ${i.progress===u?u<30?"#EF4444":u<70?"#F59E0B":"#10B981":n.borderLight}`},children:[u,"%"]},u))})]}),jsxRuntime.jsxs("div",{className:"flex justify-between text-xs mt-2",style:{color:n.textTertiary},children:[jsxRuntime.jsx("span",{children:"0%"}),jsxRuntime.jsx("span",{children:"25%"}),jsxRuntime.jsx("span",{children:"50%"}),jsxRuntime.jsx("span",{children:"75%"}),jsxRuntime.jsx("span",{children:"100%"})]})]}),jsxRuntime.jsxs("div",{className:"flex items-center gap-3 p-4 rounded-lg",style:{backgroundColor:n.bgSecondary,border:`1px solid ${n.borderLight}`},children:[jsxRuntime.jsx("input",{type:"checkbox",id:"isMilestone",checked:i.isMilestone,onChange:u=>f("isMilestone",u.target.checked),className:"w-4 h-4 rounded focus:ring-2",style:{accentColor:n.accent},disabled:l}),jsxRuntime.jsxs("label",{htmlFor:"isMilestone",className:"flex items-center gap-2 text-sm cursor-pointer",style:{color:n.textPrimary},children:[jsxRuntime.jsx(lucideReact.Milestone,{className:"w-4 h-4 text-yellow-500"}),"Marcar como Hito (Milestone)"]})]}),o.length>0&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Users,{className:"w-4 h-4"}),"Asignar a"]}),jsxRuntime.jsx("div",{className:"space-y-2 max-h-32 overflow-y-auto p-3 rounded-lg",style:{backgroundColor:n.bgSecondary,border:`1px solid ${n.borderLight}`},children:o.map(u=>jsxRuntime.jsxs("label",{className:"flex items-center gap-3 cursor-pointer p-2 rounded",onMouseEnter:C=>C.currentTarget.style.backgroundColor=n.hoverBg,onMouseLeave:C=>C.currentTarget.style.backgroundColor="transparent",children:[jsxRuntime.jsx("input",{type:"checkbox",checked:i.assignees?.some(C=>C.name===u.name),onChange:C=>{let T=C.target.checked?[...i.assignees||[],{id:u.id,name:u.name,avatar:u.avatar,initials:u.name.split(" ").map(b=>b[0]).join("").toUpperCase().slice(0,2),color:n.accent}]:(i.assignees||[]).filter(b=>b.name!==u.name);f("assignees",T);},className:"w-4 h-4 rounded",style:{accentColor:n.accent},disabled:l}),jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[jsxRuntime.jsx("div",{className:"w-6 h-6 rounded-full flex items-center justify-center text-xs text-white font-semibold",style:{backgroundColor:n.accent},children:u.name.charAt(0).toUpperCase()}),jsxRuntime.jsx("span",{className:"text-sm",style:{color:n.textPrimary},children:u.name})]})]},u.id))})]}),r.length>0&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Link2,{className:"w-4 h-4"}),"Dependencias"]}),jsxRuntime.jsx("div",{className:"space-y-2 max-h-32 overflow-y-auto p-3 rounded-lg",style:{backgroundColor:n.bgSecondary,border:`1px solid ${n.borderLight}`},children:r.filter(u=>u.id!==a?.id).map(u=>jsxRuntime.jsxs("label",{className:"flex items-center gap-3 cursor-pointer p-2 rounded",onMouseEnter:C=>C.currentTarget.style.backgroundColor=n.hoverBg,onMouseLeave:C=>C.currentTarget.style.backgroundColor="transparent",children:[jsxRuntime.jsx("input",{type:"checkbox",checked:i.dependencies?.includes(u.id),onChange:C=>{let T=C.target.checked?[...i.dependencies||[],u.id]:(i.dependencies||[]).filter(b=>b!==u.id);f("dependencies",T);},className:"w-4 h-4 rounded",style:{accentColor:n.accent},disabled:l}),jsxRuntime.jsx("span",{className:"text-sm",style:{color:n.textPrimary},children:u.name})]},u.id))})]})]}),jsxRuntime.jsxs("div",{className:"flex items-center justify-end gap-3 px-6 py-4",style:{borderTop:`1px solid ${n.border}`,backgroundColor:n.bgPrimary},children:[jsxRuntime.jsx("button",{type:"button",onClick:t,className:"px-4 py-2 text-sm font-medium rounded-lg transition-colors",style:{color:n.textSecondary},onMouseEnter:u=>{u.currentTarget.style.color=n.textPrimary,u.currentTarget.style.backgroundColor=n.hoverBg;},onMouseLeave:u=>{u.currentTarget.style.color=n.textSecondary,u.currentTarget.style.backgroundColor="transparent";},disabled:l,children:"Cancelar"}),jsxRuntime.jsx("button",{onClick:h,disabled:l,className:"px-4 py-2 text-sm font-medium rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2",style:{backgroundColor:n.accent,color:"#FFFFFF"},onMouseEnter:u=>!l&&(u.currentTarget.style.backgroundColor=n.accentHover),onMouseLeave:u=>!l&&(u.currentTarget.style.backgroundColor=n.accent),children:l?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin"}),"Guardando..."]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(lucideReact.CheckCircle2,{className:"w-4 h-4"}),m==="create"?"Crear Tarea":"Guardar Cambios"]})})]})]})})]})})}var _u=['Move "Task Name" to next Monday','Extend "Task Name" by 3 days','Rename "Old Name" to "New Name"','Set "Task Name" progress to 50%','Link "Task A" to "Task B"','Create a new task called "New Task"','Delete "Task Name"','Assign John to "Task Name"'],fl=()=>jsxRuntime.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsxRuntime.jsx("path",{d:"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707"}),jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"4"})]}),Vu=()=>jsxRuntime.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:jsxRuntime.jsx("path",{d:"M22 2L11 13M22 2L15 22L11 13M22 2L2 9L11 13"})}),ju=()=>jsxRuntime.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:jsxRuntime.jsx("path",{d:"M18 6L6 18M6 6L18 18"})}),Ku=()=>jsxRuntime.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:jsxRuntime.jsx("path",{d:"M5 12h14"})}),Yu=()=>jsxRuntime.jsx("div",{className:"flex gap-1 items-center",children:[0,1,2].map(e=>jsxRuntime.jsx(framerMotion.motion.div,{className:"w-2 h-2 rounded-full bg-current",animate:{scale:[1,1.2,1],opacity:[.5,1,.5]},transition:{duration:.8,repeat:1/0,delay:e*.15}},e))});function fo({tasks:e,theme:t,config:a,onTasksUpdate:r,onTaskUpdate:o,onTaskCreate:s,onTaskDelete:l,onDependencyCreate:m,onDependencyDelete:p}){let[n,c]=react.useState(false),[d,i]=react.useState(false),[g,v]=react.useState([]),[x,y]=react.useState(""),[h,f]=react.useState(false),[u,C]=react.useState(true),T=react.useRef(null),b=react.useRef(null),N=react.useRef(null),{enabled:k=true,placeholder:S='Ask AI to edit tasks... (e.g., "Move Design to next week")',position:w="bottom-right",onCommand:G,suggestions:H=_u,maxHistory:F=50,persistHistory:W}=a,E=W?.storageKey||"gantt-ai-history",z=W?.maxMessages??5;react.useEffect(()=>{if(W?.enabled)try{let O=localStorage.getItem(E);if(O){let ue=JSON.parse(O).map(Y=>({...Y,timestamp:new Date(Y.timestamp)}));v(ue.slice(-z));}}catch(O){console.warn("[GanttAIAssistant] Failed to load persisted history:",O);}},[W?.enabled,E,z]),react.useEffect(()=>{if(W?.enabled&&g.length>0)try{let O=g.filter(M=>!M.isLoading).slice(-z);localStorage.setItem(E,JSON.stringify(O));}catch(O){console.warn("[GanttAIAssistant] Failed to persist history:",O);}},[g,W?.enabled,E,z]),react.useEffect(()=>{b.current&&b.current.scrollIntoView({behavior:"smooth"});},[g]),react.useEffect(()=>{n&&!d&&T.current&&setTimeout(()=>T.current?.focus(),100);},[n,d]);let Q=react.useCallback(O=>{if(O.success)switch(O.type){case "move_task":case "resize_task":case "rename_task":case "set_progress":case "set_status":case "assign_task":O.taskId&&O.updates&&o?.(O.taskId,O.updates);break;case "create_task":O.newTask&&s?.(O.newTask);break;case "delete_task":O.taskId&&l?.(O.taskId);break;case "link_tasks":O.dependencyFrom&&O.dependencyTo&&m?.(O.dependencyFrom,O.dependencyTo);break;case "unlink_tasks":O.taskId&&O.dependencyFrom&&p?.(O.taskId,O.dependencyFrom);break}},[o,s,l,m,p]),te=react.useCallback(async O=>{if(!O.trim()||h)return;let M={id:`user-${Date.now()}`,role:"user",content:O,timestamp:new Date};v(Y=>[...Y.slice(-(F-1)),M]),y(""),C(false),f(true);let ue={id:`loading-${Date.now()}`,role:"assistant",content:"",timestamp:new Date,isLoading:true};v(Y=>[...Y,ue]);try{if(G){let Y=await G(O,e);v($e=>{let Oe=$e.filter(ve=>!ve.isLoading),Ct={id:`assistant-${Date.now()}`,role:"assistant",content:Y.message,timestamp:new Date,command:Y};return [...Oe,Ct]}),Q(Y);}else v(Y=>[...Y.filter(Oe=>!Oe.isLoading),{id:`assistant-${Date.now()}`,role:"assistant",content:"AI handler not configured. Please provide an onCommand handler in the aiAssistant config.",timestamp:new Date}]);}catch(Y){v($e=>[...$e.filter(Ct=>!Ct.isLoading),{id:`error-${Date.now()}`,role:"assistant",content:`Sorry, I encountered an error: ${Y instanceof Error?Y.message:"Unknown error"}`,timestamp:new Date}]);}finally{f(false);}},[h,F,G,e,Q]),le=O=>{O.preventDefault(),te(x);},se=O=>{y(O),T.current?.focus();};if(react.useEffect(()=>{let O=M=>{(M.metaKey||M.ctrlKey)&&M.key==="k"&&(M.preventDefault(),c(ue=>!ue),n||i(false)),M.key==="Escape"&&n&&c(false);};return document.addEventListener("keydown",O),()=>document.removeEventListener("keydown",O)},[n]),react.useEffect(()=>{if(!n)return;let O=ue=>{let Y=ue.target;N.current&&!N.current.contains(Y)&&c(false);},M=setTimeout(()=>{document.addEventListener("mousedown",O);},100);return ()=>{clearTimeout(M),document.removeEventListener("mousedown",O);}},[n]),!k)return null;let _={"bottom-right":"bottom-4 right-4","bottom-left":"bottom-4 left-4","top-right":"top-4 right-4","top-left":"top-4 left-4"};return jsxRuntime.jsxs(Be,{children:[jsxRuntime.jsx(framerMotion.AnimatePresence,{children:!n&&jsxRuntime.jsxs(framerMotion.motion.button,{initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},whileHover:{scale:1.05},whileTap:{scale:.95},className:`fixed ${_[w]} z-[99999] flex items-center gap-2 px-4 py-3 rounded-full shadow-lg transition-colors`,style:{background:"linear-gradient(135deg, #3B82F6 0%, #2563EB 100%)",color:"white",boxShadow:"0 4px 20px rgba(59, 130, 246, 0.4)"},onClick:()=>c(true),children:[jsxRuntime.jsx(fl,{}),jsxRuntime.jsx("span",{className:"text-sm font-medium",children:"AI Assistant"}),jsxRuntime.jsx("kbd",{className:"hidden sm:inline-flex items-center gap-0.5 px-1.5 py-0.5 text-[10px] font-mono rounded bg-white/20",children:"\u2318K"})]})}),jsxRuntime.jsx(framerMotion.AnimatePresence,{children:n&&jsxRuntime.jsxs(framerMotion.motion.div,{ref:N,initial:{opacity:0,y:20,scale:.95},animate:{opacity:1,y:0,scale:1,height:d?"auto":500},exit:{opacity:0,y:20,scale:.95},transition:{type:"spring",damping:25,stiffness:300},className:`fixed ${_[w]} z-[99999] w-96 rounded-2xl overflow-hidden shadow-2xl flex flex-col`,style:{background:t.bgPrimary,border:`1px solid ${t.border}`,boxShadow:`0 20px 60px rgba(0, 0, 0, 0.3), 0 0 0 1px ${t.border}`},children:[jsxRuntime.jsxs("div",{className:"flex items-center justify-between px-4 py-3",style:{background:"linear-gradient(135deg, #3B82F6 0%, #2563EB 100%)"},children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-2 text-white",children:[jsxRuntime.jsx(fl,{}),jsxRuntime.jsx("span",{className:"font-semibold",children:"Gantt AI Assistant"})]}),jsxRuntime.jsxs("div",{className:"flex items-center gap-1",children:[jsxRuntime.jsx("button",{onClick:()=>i(O=>!O),className:"p-1.5 rounded-lg hover:bg-white/20 text-white/80 hover:text-white transition-colors",children:jsxRuntime.jsx(Ku,{})}),jsxRuntime.jsx("button",{onClick:()=>c(false),className:"p-1.5 rounded-lg hover:bg-white/20 text-white/80 hover:text-white transition-colors",children:jsxRuntime.jsx(ju,{})})]})]}),jsxRuntime.jsx(framerMotion.AnimatePresence,{children:!d&&jsxRuntime.jsxs(framerMotion.motion.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},className:"flex flex-col flex-1 min-h-0",children:[jsxRuntime.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-4",style:{maxHeight:350},children:[g.length===0&&u&&jsxRuntime.jsxs("div",{className:"space-y-3",children:[jsxRuntime.jsx("p",{className:"text-sm text-center",style:{color:t.textSecondary},children:"Try asking me to edit your Gantt chart:"}),jsxRuntime.jsx("div",{className:"flex flex-wrap gap-2",children:H.slice(0,4).map((O,M)=>jsxRuntime.jsx("button",{onClick:()=>se(O),className:"text-xs px-3 py-1.5 rounded-full transition-colors",style:{background:t.bgSecondary,color:t.textSecondary,border:`1px solid ${t.border}`},children:O.length>30?O.slice(0,30)+"...":O},M))})]}),g.map(O=>jsxRuntime.jsx(framerMotion.motion.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},className:`flex ${O.role==="user"?"justify-end":"justify-start"}`,children:jsxRuntime.jsxs("div",{className:`max-w-[85%] rounded-2xl px-4 py-2.5 ${O.role==="user"?"rounded-br-md":"rounded-bl-md"}`,style:{background:O.role==="user"?"linear-gradient(135deg, #6366F1 0%, #8B5CF6 100%)":t.bgSecondary,color:O.role==="user"?"white":t.textPrimary},children:[O.isLoading?jsxRuntime.jsx(Yu,{}):jsxRuntime.jsx("p",{className:"text-sm whitespace-pre-wrap",children:O.content}),O.command&&jsxRuntime.jsxs("div",{className:"mt-2 text-xs px-2 py-1 rounded-md inline-flex items-center gap-1",style:{background:O.command.success?"rgba(16, 185, 129, 0.2)":"rgba(239, 68, 68, 0.2)",color:O.command.success?"#10B981":"#EF4444"},children:[O.command.success?"\u2713":"\u2717",jsxRuntime.jsx("span",{className:"capitalize",children:O.command.type.replace(/_/g," ")})]})]})},O.id)),jsxRuntime.jsx("div",{ref:b})]}),jsxRuntime.jsxs("form",{onSubmit:le,className:"p-3 border-t",style:{borderColor:t.border},children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-2 rounded-xl px-4 py-2",style:{background:t.bgSecondary,border:`1px solid ${t.border}`},children:[jsxRuntime.jsx("input",{ref:T,type:"text",value:x,onChange:O=>y(O.target.value),placeholder:S,disabled:h,className:"flex-1 bg-transparent text-sm outline-none",style:{color:t.textPrimary}}),jsxRuntime.jsx("button",{type:"submit",disabled:!x.trim()||h,className:"p-2 rounded-lg transition-all disabled:opacity-50",style:{background:x.trim()?"linear-gradient(135deg, #6366F1 0%, #8B5CF6 100%)":"transparent",color:x.trim()?"white":t.textSecondary},children:jsxRuntime.jsx(Vu,{})})]}),jsxRuntime.jsx("p",{className:"text-[10px] text-center mt-2",style:{color:t.textTertiary},children:"Press Enter to send \u2022 Esc to close"})]})]})})]})})]})}function bl(e,t=50){let[a,r]=react.useState({past:[],present:e,future:[]}),o=react.useRef(false),s=react.useCallback((n,c=true)=>{r(d=>{let i=typeof n=="function"?n(d.present):n;if(o.current)return {...d,present:i};if(!c)return {...d,present:i};let g=[...d.past,d.present];return g.length>t&&g.shift(),{past:g,present:i,future:[]}});},[t]),l=react.useCallback(()=>{r(n=>{if(n.past.length===0)return n;let c=n.past[n.past.length-1],d=n.past.slice(0,n.past.length-1);return o.current=true,setTimeout(()=>{o.current=false;},0),{past:d,present:c,future:[n.present,...n.future]}});},[]),m=react.useCallback(()=>{r(n=>{if(n.future.length===0)return n;let c=n.future[0],d=n.future.slice(1);return o.current=true,setTimeout(()=>{o.current=false;},0),{past:[...n.past,n.present],present:c,future:d}});},[]),p=react.useCallback(()=>{r(n=>({past:[],present:n.present,future:[]}));},[]);return {state:a.present,setState:s,undo:l,redo:m,canUndo:a.past.length>0,canRedo:a.future.length>0,clearHistory:p}}function hl({undo:e,redo:t,canUndo:a,canRedo:r,enabled:o=true}){react.useEffect(()=>{if(!o)return;let s=l=>{let m=navigator.platform.toUpperCase().indexOf("MAC")>=0,p=m?l.metaKey:l.ctrlKey;if(p&&l.key==="z"&&!l.shiftKey&&a){l.preventDefault(),e();return}if(r){if(!m&&p&&l.key==="y"){l.preventDefault(),t();return}if(m&&p&&l.shiftKey&&l.key==="z"){l.preventDefault(),t();return}}};return window.addEventListener("keydown",s),()=>{window.removeEventListener("keydown",s);}},[e,t,a,r,o]);}var Zu={taskTooltip:e=>{let t=[`<strong>${e.name}</strong>`];if(e.startDate&&e.endDate){t.push(`${K.formatDate(e.startDate)} - ${K.formatDate(e.endDate)}`);let a=K.calculateDuration(e.startDate,e.endDate);t.push(`Duration: ${a} days`);}if(e.progress!==void 0&&t.push(`Progress: ${e.progress}%`),e.status&&t.push(`Status: ${e.status}`),e.assignees&&e.assignees.length>0){let a=e.assignees.map(r=>r.name).join(", ");t.push(`Assigned: ${a}`);}return e.dependencies&&e.dependencies.length>0&&t.push(`Dependencies: ${e.dependencies.length}`),t.join("<br/>")},taskLabel:e=>e.name,gridCell:(e,t,a)=>a,taskClass:e=>{let t=[];return e.isCriticalPath&&t.push("critical-path"),e.status==="completed"?t.push("completed"):e.status==="in-progress"?t.push("in-progress"):e.status==="todo"&&t.push("todo"),e.isMilestone&&t.push("milestone"),t.join(" ")},milestoneContent:e=>`\u25C6 ${e.name}`,dateFormat:e=>K.formatDate(e),durationFormat:e=>e===1?"1 day":`${e} days`,progressFormat:e=>`${e}%`};function vl(e){return {...Zu,...e}}var ng=e=>{switch(e){case "compact":return 40;case "comfortable":return 48;case "spacious":return 56;default:return 48}},kl=react.forwardRef(function({tasks:t,config:a={},onTasksChange:r},o){let{theme:s,timeScale:l="week",rowDensity:m="comfortable",showThemeSelector:p=true,showExportButton:n=true,availableUsers:c=[],templates:d,enableAutoCriticalPath:i=true,aiAssistant:g,locale:v="en",customTranslations:x,showCreateTaskButton:y=false,createTaskLabel:h,onCreateTask:f,onThemeChange:u,onTaskClick:C,onTaskDblClick:T,onTaskContextMenu:b,onTaskUpdate:N,onProgressChange:k,onTaskEdit:S,onTaskAddSubtask:w,onTaskMarkIncomplete:G,onTaskSetInProgress:H,onDependencyCreate:F,onDependencyDelete:W,onBeforeTaskAdd:E,onAfterTaskAdd:z,onBeforeTaskUpdate:Q,onAfterTaskUpdate:te,onBeforeTaskDelete:le,onAfterTaskDelete:se}=a,O=react.useContext(eo)?.theme,[M,ue]=react.useState(O||s||"dark"),[Y,$e]=react.useState(l),[Oe,Ct]=react.useState(m),[ve,ut]=react.useState(1),[Mt,ha]=react.useState(0),[va,oa]=react.useState(false),[Vt,ca]=react.useState(null),[we,na]=react.useState({isOpen:false,x:0,y:0,task:null}),[gt,at]=react.useState(null),[jt,St]=react.useState(null);react.useEffect(()=>{O&&O!==M&&ue(O);},[O]),react.useEffect(()=>{s&&s!==M&&ue(s);},[s]);let X=react.useCallback(D=>{ue(D),u?.(D);},[u]),{state:L,setState:q,undo:He,redo:Te,canUndo:Bt,canRedo:Rt,clearHistory:ye}=bl(t,50);react.useEffect(()=>{q(t);},[t,q]);let fe=react.useRef(t),$t=react.useRef(true);react.useEffect(()=>{if($t.current){$t.current=false,fe.current=L;return}if(!r)return;let D=JSON.stringify(fe.current),I=JSON.stringify(L);D!==I&&(fe.current=L,r(L));},[L,r]);let j=react.useMemo(()=>Tn(v,x),[v,x]),V=react.useCallback(D=>[{id:"name",label:D.columns.taskName,width:400,minWidth:200,maxWidth:2e3,visible:true,sortable:true,resizable:false},{id:"startDate",label:D.columns.startDate,width:110,visible:false,sortable:true},{id:"endDate",label:D.columns.endDate,width:110,visible:false,sortable:true},{id:"duration",label:D.columns.duration,width:80,visible:false,sortable:true},{id:"assignees",label:D.columns.assignees,width:120,visible:false,sortable:false},{id:"status",label:D.columns.status,width:80,visible:false,sortable:true},{id:"progress",label:D.columns.progress,width:120,visible:false,sortable:true},{id:"priority",label:D.columns.priority,width:90,visible:false,sortable:true}],[]),[ie,oe]=react.useState(()=>V(j));react.useEffect(()=>{oe(D=>D.map(I=>({...I,label:j.columns[I.id==="name"?"taskName":I.id]||I.label})));},[j]);let We=react.useMemo(()=>ie.filter(D=>D.visible).reduce((D,I)=>D+I.width,0)+60,[ie]),rt=Vt||We,P=react.useRef(null),$=react.useRef(null),ce=react.useRef(null),me=react.useMemo(()=>Fi(M),[M]),Tt=react.useMemo(()=>({theme:me,themeName:M}),[me,M]),Va=react.useMemo(()=>vl(d),[d]),ja=react.useMemo(()=>{if(!i)return L;let D=K.calculateCriticalPath(L),I=U=>U.map(ee=>({...ee,isCriticalPath:D.includes(ee.id),subtasks:ee.subtasks?I(ee.subtasks):void 0}));return I(L)},[L,i]),Gr=ng(Oe);hl({undo:He,redo:Te,canUndo:Bt,canRedo:Rt,enabled:true}),react.useImperativeHandle(o,()=>({getTask:D=>K.findTaskById(L,D),addTask:(D,I)=>{q(U=>{if(!I)return [...U,{...D,level:0}];let ee=ne=>ne.map(pe=>pe.id===I?{...pe,subtasks:[...pe.subtasks||[],{...D,parentId:I,level:(pe.level||0)+1}],isExpanded:true}:pe.subtasks?{...pe,subtasks:ee(pe.subtasks)}:pe);return ee(U)});},updateTask:(D,I)=>{q(U=>{let ee=ne=>ne.map(pe=>pe.id===D?{...pe,...I}:pe.subtasks?{...pe,subtasks:ee(pe.subtasks)}:pe);return ee(U)});},deleteTask:D=>{q(I=>{let U=ee=>ee.filter(ne=>ne.id===D?false:(ne.subtasks&&(ne.subtasks=U(ne.subtasks)),true));return U(I)});},deleteTasks:D=>{q(I=>In(I,D));},duplicateTask:D=>{q(I=>Fn(I,[D]));},splitTask:(D,I,U=3)=>{q(ee=>K.splitTask(ee,D,I,U));},calculateEndDate:K.calculateEndDate,calculateDuration:K.calculateDuration,validateDependency:(D,I)=>!K.validateDependencies(L,D,I),getAllTasks:()=>K.flattenTasks(L),getTasksByStatus:D=>K.flattenTasks(L).filter(I=>I.status===D),getTasksByParent:D=>D?K.findTaskById(L,D)?.subtasks||[]:L.filter(U=>!U.parentId),getCriticalPath:()=>K.flattenTasks(L).filter(D=>D.isCriticalPath),indentTask:D=>{q(I=>En(I,[D]));},outdentTask:D=>{q(I=>Pn(I,[D]));},moveTask:(D,I)=>{q(U=>Mn(U,[D],I));},createSubtask:async D=>{let{tasks:I,newTask:U}=Bn(L,D);if(E){let ee=E({...U,parentId:D});if((ee instanceof Promise?await ee:ee)===false)return}q(I),z&&z({...U,parentId:D});},scrollToTask:D=>{let U=K.flattenTasks(L).findIndex(ee=>ee.id===D);if(U!==-1&&P.current){let ee=U*Gr;P.current.scrollTo({top:ee,behavior:"smooth"}),$.current&&$.current.scrollTo({top:ee,behavior:"smooth"});}},highlightTask:(D,I=2e3)=>{},expandTask:D=>{q(I=>{let U=ee=>ee.map(ne=>ne.id===D?{...ne,isExpanded:true}:ne.subtasks?{...ne,subtasks:U(ne.subtasks)}:ne);return U(I)});},collapseTask:D=>{q(I=>{let U=ee=>ee.map(ne=>ne.id===D?{...ne,isExpanded:false}:ne.subtasks?{...ne,subtasks:U(ne.subtasks)}:ne);return U(I)});},expandAll:()=>{q(D=>{let I=U=>U.map(ee=>({...ee,isExpanded:true,subtasks:ee.subtasks?I(ee.subtasks):void 0}));return I(D)});},collapseAll:()=>{q(D=>{let I=U=>U.map(ee=>({...ee,isExpanded:false,subtasks:ee.subtasks?I(ee.subtasks):void 0}));return I(D)});},undo:He,redo:Te,canUndo:()=>Bt,canRedo:()=>Rt,clearHistory:ye,exportToPNG:async()=>{if(!ce.current)throw new Error("Gantt container not found");let D=await xl__default.default(ce.current,{backgroundColor:me.bgPrimary,scale:2});return new Promise((I,U)=>{D.toBlob(ee=>{ee?I(ee):U(new Error("Failed to create blob from canvas"));},"image/png");})},exportToPDF:async D=>{await K.exportToPDF(L,D);},exportToExcel:async D=>{await K.exportToExcel(L,D);},exportToJSON:()=>K.exportToJSON(L),exportToCSV:()=>K.exportToCSV(L),importFromJSON:D=>{let I=K.importFromJSON(D);q(I);},getTasks:()=>L,refresh:()=>{q(D=>[...D]);},clearAll:()=>{q([]);}}),[L,He,Te,Bt,Rt,ye,me,Gr]);let Ld=react.useCallback(D=>{oe(I=>I.map(U=>U.id===D?{...U,visible:!U.visible}:U));},[]),Ad=react.useCallback((D,I)=>{oe(U=>U.map(ee=>{if(ee.id!==D)return ee;let ne=ee.minWidth??100,pe=ee.maxWidth??800,st=Math.max(ne,Math.min(pe,I));return {...ee,width:st}}));},[]),Bd=react.useCallback(D=>{q(I=>An(I,D)),a.onTaskToggleExpand?.(D);},[a]),Ka=react.useCallback((D,I)=>{if(Q&&Q(D,I)===false)return;let ee=K.findTaskById(L,D)?.progress,ne=st=>st.map(kt=>kt.id===D?{...kt,...I}:kt.subtasks?{...kt,subtasks:ne(kt.subtasks)}:kt);q(ne(L));let pe=K.findTaskById(ne(L),D);pe&&(N?.(pe),te?.(pe),I.progress!==void 0&&ee!==void 0&&I.progress!==ee&&k?.(D,ee,I.progress));},[L,N,Q,te,k]),Rd=react.useCallback(D=>{D.length!==0&&(q(I=>En(I,D)),a.onTaskIndent?.(D[0]));},[a]),Od=react.useCallback(D=>{D.length!==0&&(q(I=>Pn(I,D)),a.onTaskOutdent?.(D[0]));},[a]),Gd=react.useCallback((D,I)=>{D.length!==0&&(q(U=>Mn(U,D,I)),a.onTaskMove?.(D[0],I));},[a]),Lo=react.useCallback(async D=>{let I=[];for(let U of D)le&&await Promise.resolve(le(U))===false||I.push(U);I.length!==0&&(a.onMultiTaskDelete?a.onMultiTaskDelete(I):(q(U=>In(U,I)),I.forEach(U=>a.onTaskDelete?.(U))),se&&I.forEach(U=>se(U)));},[a,le,se]),zd=react.useCallback(D=>{q(I=>Fn(I,D)),D.forEach(I=>a.onTaskDuplicate?.(I));},[a]),Ud=react.useCallback((D,I)=>{q(U=>{let{tasks:ee,newTask:ne}=qi(U,D,I);return E&&E(ne)===false?U:(a.onTaskCreate?.(ne.parentId,ne.position||0),z?.(ne),ee)});},[a,E,z]),$d=react.useCallback((D,I)=>{q(U=>Ln(U,D,I)),a.onTaskRename?.(D,I);},[a]),Fs=react.useCallback(D=>{q(I=>{let{tasks:U}=Bn(I,D);return a.onTaskCreate?.(D,0),U});},[a]),Hd=react.useCallback((D,I,U)=>{let ee=D.startDate?Math.round((I.getTime()-D.startDate.getTime())/864e5):0,ne=kt=>kt.map(Kt=>Kt.id===D.id?{...Kt,startDate:I,endDate:U,...D.segments&&{segments:D.segments}}:Kt.subtasks?{...Kt,subtasks:ne(Kt.subtasks)}:Kt),pe=ne(L);pe=K.autoScheduleDependents(pe,D.id,ee),q(pe);let st={...D,startDate:I,endDate:U};N?.(st);},[L,N]),Wd=react.useCallback((D,I)=>{b?.(D,I),na({isOpen:true,x:I.clientX,y:I.clientY,task:D});},[b]),_d=react.useCallback((D,I)=>{let U=K.splitTask(L,D.id,I);q(U),na({isOpen:false,x:0,y:0,task:null});},[L]),Ls=react.useCallback(D=>{T?.(D),S||at(D);},[T,S]),As=react.useCallback((D,I,U)=>{let ee=new Map,ne=Yt=>{Yt.forEach(pa=>{pa.dependencies&&ee.set(pa.id,pa.dependencies),pa.subtasks&&ne(pa.subtasks);});};ne(U);let pe=ee.get(I)||[];ee.set(I,[...pe,D]);let st=new Set,kt=new Set,Kt=Yt=>{if(!st.has(Yt)){st.add(Yt),kt.add(Yt);let pa=ee.get(Yt)||[];for(let ur of pa){if(!st.has(ur)&&Kt(ur))return true;if(kt.has(ur))return true}}return kt.delete(Yt),false};return Kt(I)},[]),Bs=react.useCallback((D,I)=>{if(As(D.id,I,L)){console.warn("Cannot create dependency: would create a circular dependency"),alert(`Cannot create this dependency: it would create a circular dependency chain.
|
|
276
|
+
</Project>`,c=new Blob([n],{type:"application/xml;charset=utf-8;"}),d=document.createElement("a");d.href=URL.createObjectURL(c),d.download=a,d.click(),URL.revokeObjectURL(d.href);},calculateCriticalPath:e=>{let t=K.flattenTasks(e),a=t.filter(n=>n.startDate&&n.endDate);if(a.length===0)return [];let r=new Map,o=n=>{if(r.has(n.id))return;let c=n.startDate&&n.endDate?K.calculateDuration(n.startDate,n.endDate):0,d=0;if(n.dependencies&&n.dependencies.length>0)for(let g of n.dependencies){let v=t.find(x=>x.id===g);if(v){o(v);let x=r.get(g)?.ef||0;d=Math.max(d,x);}}let i=d+c;r.set(n.id,{es:d,ef:i});};a.forEach(o);let s=Math.max(...Array.from(r.values()).map(n=>n.ef)),l=new Map,m=n=>{if(l.has(n.id))return;let c=n.startDate&&n.endDate?K.calculateDuration(n.startDate,n.endDate):0,d=t.filter(v=>v.dependencies&&v.dependencies.includes(n.id)),i=s;if(d.length>0)for(let v of d){m(v);let x=l.get(v.id)?.ls||0;i=Math.min(i,x);}let g=i-c;l.set(n.id,{ls:g,lf:i});};a.forEach(m);let p=[];for(let n of a){let c=r.get(n.id),d=l.get(n.id);if(c&&d){let i=d.ls-c.es;Math.abs(i)<.01&&p.push(n.id);}}return p},calculateSlack:(e,t)=>{let a=K.findTaskById(e,t);if(!a||!a.startDate||!a.endDate)return null;if(K.calculateCriticalPath(e).includes(t))return 0;let o=K.getDependentTasks(e,t);if(o.length===0){let m=K.getLatestEndDate(e);if(!m)return null;let p=K.calculateDuration(a.endDate,m);return Math.max(0,p)}let s=o.filter(m=>m.startDate).map(m=>m.startDate.getTime()).sort((m,p)=>m-p)[0];if(!s)return null;let l=K.calculateDuration(a.endDate,new Date(s));return Math.max(0,l)},isOnCriticalPath:(e,t)=>K.calculateCriticalPath(e).includes(t),autoScheduleDependents:(e,t,a)=>{let r=K.findTaskById(e,t);if(!r||!r.endDate)return e;let o=K.getDependentTasks(e,t);if(o.length===0)return e;let s=[...e];for(let l of o){if(!l.startDate||!l.endDate)continue;let m=K.calculateDuration(l.startDate,l.endDate),p;a!==void 0?(p=new Date(l.startDate),p.setDate(p.getDate()+a)):(p=new Date(r.endDate),p.setDate(p.getDate()+1));let n=K.calculateEndDate(p,m),c=d=>d.map(i=>i.id===l.id?{...i,startDate:p,endDate:n}:i.subtasks?{...i,subtasks:c(i.subtasks)}:i);s=c(s),s=K.autoScheduleDependents(s,l.id,a);}return s},calculateCascadePreview:(e,t,a,r,o,s,l,m)=>{if(a===0)return [];let p=[],n=o.getTime(),c=1e3*60*60*24,d=K.findTaskById(e,t);if(!d||!d.endDate)return [];let i=(g,v,x=new Set)=>{if(x.has(g))return;x.add(g);let y=K.getDependentTasks(e,g);for(let h of y){if(!h.startDate||!h.endDate)continue;let f=r.findIndex(G=>G.id===h.id);if(f===-1)continue;let u=h.startDate.getTime(),T=(h.endDate.getTime()-u)/c,N=(u-n)/c*s,k=N+v*s,S=Math.max(T*s,s),w=m+f*l+12;p.push({taskId:h.id,taskName:h.name,originalX:N,previewX:k,width:S,y:w,rowIndex:f,daysDelta:v,color:h.color}),i(h.id,v,x);}};return i(t,a),p},splitTask:(e,t,a,r=3)=>{let o=K.findTaskById(e,t);if(!o||!o.startDate||!o.endDate)return e;if(a<=o.startDate||a>=o.endDate)return console.warn("Split date must be between task start and end dates"),e;let s=new Date(a);s.setDate(s.getDate()-1);let l=new Date(a);l.setDate(l.getDate()+r);let m=new Date(o.endDate);m.setDate(m.getDate()+r);let p=[{startDate:new Date(o.startDate),endDate:s},{startDate:l,endDate:m}],n=c=>c.map(d=>d.id===o.id?{...d,endDate:m,segments:p}:d.subtasks?{...d,subtasks:n(d.subtasks)}:d);return n(e)}};function uo({tasks:e,theme:t,rowHeight:a,timeScale:r,startDate:o,endDate:s,zoom:l,templates:m,onTaskClick:p,onTaskDblClick:n,onTaskContextMenu:c,onTaskDateChange:d,onDependencyCreate:i,onDependencyDelete:g}){let[x,y]=react.useState([]),h=Math.ceil((s.getTime()-o.getTime())/(1e3*60*60*24)),f=r==="day"?60:r==="week"?20:8,u=h*f*l,C=E=>{let z=new Date(Date.UTC(E.getFullYear(),E.getMonth(),E.getDate())),Q=z.getUTCDay()||7;z.setUTCDate(z.getUTCDate()+4-Q);let te=new Date(Date.UTC(z.getUTCFullYear(),0,1));return Math.ceil(((z.getTime()-te.getTime())/864e5+1)/7)},T=E=>{let z=E.getDay();return z===0||z===6},b=react.useCallback(E=>{let z=Math.round(E/(f*l)),Q=new Date(o);return Q.setDate(Q.getDate()+z),Q},[o,f,l]),N=react.useCallback((E,z)=>{if(z.startDate&&z.endDate)return;let Q=E.currentTarget.ownerSVGElement;if(!Q)return;let te=Q.createSVGPoint();te.x=E.clientX,te.y=E.clientY;let le=te.matrixTransform(Q.getScreenCTM()?.inverse()),se=b(le.x),_=new Date(se);_.setDate(_.getDate()+1),d?.(z,se,_);},[b,d]),k=react.useMemo(()=>{let E=le=>le.map(se=>{if(se.subtasks&&se.subtasks.length>0){let _=E(se.subtasks),O=_.filter(M=>M.startDate&&M.endDate);if(O.length>0){let M=O.map(Oe=>Oe.startDate.getTime()),ue=O.map(Oe=>Oe.endDate.getTime()),Y=new Date(Math.min(...M)),$e=new Date(Math.max(...ue));return {...se,subtasks:_,startDate:se.startDate||Y,endDate:se.endDate||$e}}return {...se,subtasks:_}}return se}),z=(le,se=[])=>{for(let _ of le)se.push(_),_.subtasks&&_.subtasks.length>0&&(_.isExpanded===void 0||_.isExpanded)&&z(_.subtasks,se);return se},Q=E(e);return z(Q)},[e]),S=react.useCallback(E=>{if(!E.startDate||!E.endDate)return {x:0,width:0};let z=E.startDate.getTime(),Q=E.endDate.getTime(),te=o.getTime(),le=(z-te)/(1e3*60*60*24),se=(Q-z)/(1e3*60*60*24),_=le*f*l,O=Math.max(f*l,40),M=Math.max(se*f*l,O);return {x:_,width:M}},[o,f,l]),w=react.useMemo(()=>k.filter(E=>E.startDate&&E.endDate).map(E=>{let{x:z,width:Q}=S(E),le=k.findIndex(se=>se.id===E.id)*a+12;return {id:E.id,x:z,y:le,width:Q,height:32}}),[k,S]),G=react.useCallback((E,z,Q)=>{if(!Q||z===0){y([]);return}let te=K.calculateCascadePreview(e,E,z,k,o,f*l,a,48);y(te);},[e,k,o,f,l,a,48]),H=react.useMemo(()=>{let E=[],z=new Date(o);for(;z<=s;){let le=(z.getTime()-o.getTime())/864e5*f*l;if(r==="day")E.push({date:new Date(z),label:z.toLocaleDateString("en-US",{day:"numeric",month:"short"}),x:le}),z.setDate(z.getDate()+1);else if(r==="week"){let se=C(z);E.push({date:new Date(z),label:`Week ${se}`,x:le}),z.setDate(z.getDate()+7);}else E.push({date:new Date(z),label:z.toLocaleDateString("en-US",{month:"short",year:"numeric"}),x:le}),z.setMonth(z.getMonth()+1);}return E},[o,s,r,f,l]),F=react.useMemo(()=>(new Date().getTime()-o.getTime())/(1e3*60*60*24)*f*l,[o,f,l]),W=Math.max(k.length*a,552);return jsxRuntime.jsxs("div",{className:"w-full h-full flex flex-col","data-gantt-chart":true,style:{backgroundColor:t.bgPrimary,overflow:"visible"},children:[jsxRuntime.jsx("div",{style:{position:"sticky",top:0,zIndex:10,backgroundColor:t.bgGrid,flexShrink:0,height:"48px",borderBottom:`1px solid ${t.border}`,boxSizing:"border-box"},children:jsxRuntime.jsxs("svg",{width:Math.max(u,1e3),height:47,style:{display:"block"},children:[jsxRuntime.jsx("rect",{x:0,y:0,width:Math.max(u,1e3),height:48,fill:t.bgGrid}),H.map((E,z)=>jsxRuntime.jsxs("g",{children:[z>0&&jsxRuntime.jsx("line",{x1:E.x,y1:0,x2:E.x,y2:48,stroke:t.border,strokeWidth:1,opacity:.1}),jsxRuntime.jsx("text",{x:E.x+8,y:48/2,fill:t.textTertiary,fontSize:"11",fontFamily:"'JetBrains Mono', ui-monospace, monospace",fontWeight:"500",dominantBaseline:"middle",children:E.label})]},`header-${z}`)),F>=0&&F<=u&&jsxRuntime.jsx("circle",{cx:F,cy:38,r:6,fill:t.today,opacity:1})]})}),jsxRuntime.jsxs("svg",{width:Math.max(u,1e3),height:W,style:{display:"block",flexShrink:0,overflow:"visible"},children:[jsxRuntime.jsxs("defs",{children:[jsxRuntime.jsx("filter",{id:"shadow",children:jsxRuntime.jsx("feDropShadow",{dx:"0",dy:"1",stdDeviation:"2",floodOpacity:"0.1"})}),jsxRuntime.jsx("pattern",{id:"diagonal-stripes",width:"8",height:"8",patternUnits:"userSpaceOnUse",patternTransform:"rotate(45)",children:jsxRuntime.jsx("line",{x1:"0",y1:"0",x2:"0",y2:"8",stroke:t.border,strokeWidth:"2"})})]}),jsxRuntime.jsx("rect",{x:0,y:0,width:Math.max(u,1e3),height:W,fill:t.bgPrimary}),H.map((E,z)=>{let Q=H[z+1]?.x||u,te=T(E.date);return jsxRuntime.jsxs("g",{children:[te&&jsxRuntime.jsx("rect",{x:E.x,y:0,width:Q-E.x,height:k.length*a,fill:t.bgWeekend,opacity:1}),z>0&&jsxRuntime.jsx("line",{x1:E.x,y1:0,x2:E.x,y2:k.length*a,stroke:t.border,strokeWidth:1,opacity:.1})]},z)}),F>=0&&F<=u&&jsxRuntime.jsx("line",{x1:F,y1:0,x2:F,y2:k.length*a,stroke:t.today,strokeWidth:2,opacity:1}),k.map((E,z)=>{let Q=E.startDate&&E.endDate;return jsxRuntime.jsxs("g",{children:[jsxRuntime.jsx("rect",{x:0,y:z*a,width:u,height:a,fill:z%2===0?"transparent":t.bgSecondary,opacity:1,style:{pointerEvents:"none"}},`row-${E.id}`),!Q&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("rect",{x:0,y:z*a,width:u,height:a,fill:"transparent",style:{cursor:"pointer",pointerEvents:"all"},onClick:te=>N(te,E),onMouseEnter:te=>{te.currentTarget.setAttribute("fill",t.accentLight),te.currentTarget.setAttribute("opacity","0.5");},onMouseLeave:te=>{te.currentTarget.setAttribute("fill","transparent"),te.currentTarget.setAttribute("opacity","1");}},`clickable-${E.id}`),jsxRuntime.jsx("text",{x:F>0?F:100,y:z*a+a/2,fill:t.textTertiary,fontSize:"12",fontFamily:"Inter, sans-serif",fontStyle:"italic",dominantBaseline:"middle",opacity:.4,style:{pointerEvents:"none",userSelect:"none"},children:"Click to set dates..."},`placeholder-${E.id}`)]})]},`row-group-${E.id}`)}),k.map((E,z)=>!E.dependencies||E.dependencies.length===0||!E.startDate||!E.endDate?null:E.dependencies.map(Q=>{let te=k.find(O=>O.id===Q);if(!te||!te.startDate||!te.endDate)return null;let le=k.findIndex(O=>O.id===Q),se=S(te),_=S(E);return jsxRuntime.jsx(io,{x1:se.x+se.width,y1:le*a+a/2,x2:_.x,y2:z*a+a/2,theme:t,onDelete:()=>g?.(E.id,Q)},`dep-${Q}-${E.id}`)})),k.map((E,z)=>{if(!E.startDate||!E.endDate)return null;let{x:Q,width:te}=S(E),le=z*a+12,se=E.subtasks&&E.subtasks.length>0&&!E.isMilestone;return E.isMilestone?jsxRuntime.jsx(co,{task:E,x:Q+te/2,y:le+16,theme:t,onClick:p},E.id):se?jsxRuntime.jsxs("g",{onClick:()=>p?.(E),style:{cursor:"pointer"},children:[jsxRuntime.jsx("rect",{x:Q,y:le,width:te,height:32,fill:t.primary,opacity:.25,rx:6}),jsxRuntime.jsx("line",{x1:Q,y1:le,x2:Q+te,y2:le,stroke:t.primary,strokeWidth:3,opacity:.9,strokeLinecap:"round"}),jsxRuntime.jsx("line",{x1:Q,y1:le,x2:Q,y2:le+32,stroke:t.primary,strokeWidth:3,opacity:.9,strokeLinecap:"round"}),jsxRuntime.jsx("line",{x1:Q+te,y1:le,x2:Q+te,y2:le+32,stroke:t.primary,strokeWidth:3,opacity:.9,strokeLinecap:"round"}),jsxRuntime.jsx("line",{x1:Q,y1:le+32,x2:Q+te,y2:le+32,stroke:t.primary,strokeWidth:3,opacity:.9,strokeLinecap:"round"}),te>60&&jsxRuntime.jsx("text",{x:Q+12,y:le+16,dominantBaseline:"middle",fill:"#FFFFFF",fontSize:"13",fontWeight:"500",fontFamily:"Inter, sans-serif",style:{pointerEvents:"none",userSelect:"none"},children:E.name})]},E.id):jsxRuntime.jsx(no,{task:E,x:Q,y:le,width:te,theme:t,dayWidth:f*l,startDate:o,templates:m,onClick:p,onDoubleClick:n,onContextMenu:c,onDateChange:d,onDependencyCreate:i,allTaskPositions:w,onDragMove:G},E.id)}),x.map(E=>jsxRuntime.jsxs("g",{style:{pointerEvents:"none"},children:[jsxRuntime.jsx("rect",{x:E.previewX,y:E.y-48,width:E.width,height:32,rx:8,fill:E.color||t.accent,opacity:.3,stroke:t.accent,strokeWidth:2,strokeDasharray:"4 2"}),Math.abs(E.daysDelta)>0&&jsxRuntime.jsx("text",{x:E.previewX+E.width/2,y:E.y-48+16,textAnchor:"middle",dominantBaseline:"middle",fill:t.accent,fontSize:"10",fontWeight:"600",fontFamily:"Inter, sans-serif",style:{userSelect:"none"},children:E.daysDelta>0?`+${E.daysDelta}d`:`${E.daysDelta}d`})]},`cascade-preview-${E.taskId}`))]})]})}var il=[{name:"Azul",value:"#6366F1",light:"#818CF8"},{name:"P\xFArpura",value:"#A855F7",light:"#C084FC"},{name:"Rosa",value:"#EC4899",light:"#F472B6"},{name:"Rojo",value:"#EF4444",light:"#F87171"},{name:"Naranja",value:"#F59E0B",light:"#FBBF24"},{name:"Amarillo",value:"#EAB308",light:"#FACC15"},{name:"Lima",value:"#84CC16",light:"#A3E635"},{name:"Verde",value:"#10B981",light:"#34D399"},{name:"Esmeralda",value:"#059669",light:"#10B981"},{name:"Cyan",value:"#06B6D4",light:"#22D3EE"},{name:"Azul Cielo",value:"#0EA5E9",light:"#38BDF8"},{name:"\xCDndigo",value:"#4F46E5",light:"#6366F1"},{name:"Violeta",value:"#8B5CF6",light:"#A78BFA"},{name:"Fucsia",value:"#D946EF",light:"#E879F9"},{name:"Gris",value:"#6B7280",light:"#9CA3AF"},{name:"Piedra",value:"#78716C",light:"#A8A29E"}];function ll({value:e="#6366F1",onChange:t,disabled:a=false}){return jsxRuntime.jsxs("div",{className:"space-y-2",children:[jsxRuntime.jsx("div",{className:"flex flex-wrap gap-2",children:il.map(r=>{let o=e===r.value;return jsxRuntime.jsx(framerMotion.motion.button,{type:"button",onClick:()=>!a&&t(r.value),className:"relative rounded-full transition-all focus:outline-none focus:ring-2 focus:ring-offset-2",style:{width:"32px",height:"32px",backgroundColor:r.value,boxShadow:o?`0 0 0 2px #FFFFFF, 0 0 0 4px ${r.value}`:"0 1px 3px rgba(0, 0, 0, 0.12)",opacity:a?.5:1,cursor:a?"not-allowed":"pointer"},whileHover:a?{}:{scale:1.1},whileTap:a?{}:{scale:.95},title:r.name,disabled:a,children:o&&jsxRuntime.jsx(framerMotion.motion.div,{initial:{scale:0},animate:{scale:1},className:"absolute inset-0 flex items-center justify-center",children:jsxRuntime.jsx(lucideReact.Check,{className:"w-4 h-4 text-white drop-shadow-md",strokeWidth:3})})},r.value)})}),e&&jsxRuntime.jsx("div",{className:"text-xs text-center font-medium",style:{color:e},children:il.find(r=>r.value===e)?.name||"Personalizado"})]})}function go({isOpen:e,onClose:t,task:a,availableTasks:r=[],availableUsers:o=[],onSubmit:s,isLoading:l=false,mode:m=a?"edit":"create",theme:p="dark"}){let n=De[p]||De.dark,c={backgroundColor:n.bgSecondary,border:`1px solid ${n.borderLight}`,color:n.textPrimary},d={color:n.textSecondary},[i,g]=react.useState({name:"",description:"",progress:0,status:"todo",priority:"medium",isMilestone:false,color:"#6366F1",assignees:[],dependencies:[]}),[v,x]=react.useState({});react.useEffect(()=>{g(a?{name:a.name,description:a.description||"",startDate:a.startDate,endDate:a.endDate,progress:a.progress,status:a.status||"todo",priority:a.priority||"medium",isMilestone:a.isMilestone||false,color:a.color||"#6366F1",assignees:a.assignees||[],dependencies:a.dependencies||[]}:{name:"",description:"",progress:0,status:"todo",priority:"medium",isMilestone:false,color:"#6366F1",assignees:[],dependencies:[]});},[a,e]);let y=()=>{let u={};return i.name.trim()||(u.name="El nombre es requerido"),i.startDate&&i.endDate&&i.startDate>i.endDate&&(u.endDate="La fecha de fin debe ser posterior a la de inicio"),x(u),Object.keys(u).length===0},h=async u=>{if(u.preventDefault(),!!y())try{await s(i),t();}catch(C){console.error("Error submitting task:",C);}},f=(u,C)=>{g(T=>{let b={...T,[u]:C};if(u==="progress"){let N=typeof C=="number"?C:parseInt(C,10);N===100&&T.status!=="completed"?b.status="completed":N>0&&N<100&&T.status==="todo"?b.status="in-progress":N===0&&T.status!=="todo"&&(b.status="todo");}return b}),v[u]&&x(T=>{let b={...T};return delete b[u],b});};return jsxRuntime.jsx(framerMotion.AnimatePresence,{children:e&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(framerMotion.motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"fixed inset-0 bg-black/50 z-50",onClick:t}),jsxRuntime.jsx(framerMotion.motion.div,{initial:{opacity:0,scale:.95,y:20},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:20},transition:{duration:.2,ease:[.4,0,.2,1]},className:"fixed inset-0 z-50 flex items-center justify-center p-4 pointer-events-none",children:jsxRuntime.jsxs("div",{className:"w-full max-w-2xl rounded-xl shadow-2xl pointer-events-auto overflow-hidden",style:{backgroundColor:n.bgPrimary,border:`1px solid ${n.border}`},onClick:u=>u.stopPropagation(),children:[jsxRuntime.jsxs("div",{className:"flex items-center justify-between px-6 py-4",style:{borderBottom:`1px solid ${n.border}`},children:[jsxRuntime.jsx("h2",{className:"text-lg font-semibold",style:{color:n.textPrimary},children:m==="create"?"Crear Nueva Tarea":"Editar Tarea"}),jsxRuntime.jsx("button",{onClick:t,className:"p-2 rounded-lg transition-colors",style:{color:n.textSecondary},onMouseEnter:u=>u.currentTarget.style.backgroundColor=n.hoverBg,onMouseLeave:u=>u.currentTarget.style.backgroundColor="transparent",disabled:l,children:jsxRuntime.jsx(lucideReact.X,{className:"w-5 h-5"})})]}),jsxRuntime.jsxs("form",{onSubmit:h,className:"p-6 space-y-6 max-h-[calc(100vh-200px)] overflow-y-auto",children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("label",{className:"block text-sm font-medium mb-2",style:d,children:"Nombre de la Tarea *"}),jsxRuntime.jsx("input",{type:"text",value:i.name,onChange:u=>f("name",u.target.value),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent",style:c,onFocus:u=>u.currentTarget.style.borderColor=n.accent,onBlur:u=>u.currentTarget.style.borderColor=n.borderLight,placeholder:"Ej: Dise\xF1ar mockups de la aplicaci\xF3n",disabled:l}),v.name&&jsxRuntime.jsxs("p",{className:"mt-1 text-sm text-red-400 flex items-center gap-1",children:[jsxRuntime.jsx(lucideReact.AlertCircle,{className:"w-4 h-4"}),v.name]})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.FileText,{className:"w-4 h-4"}),"Descripci\xF3n"]}),jsxRuntime.jsx("textarea",{value:i.description||"",onChange:u=>f("description",u.target.value),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent resize-none",style:c,onFocus:u=>u.currentTarget.style.borderColor=n.accent,onBlur:u=>u.currentTarget.style.borderColor=n.borderLight,placeholder:"Describe los detalles de la tarea...",rows:3,disabled:l})]}),jsxRuntime.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Calendar,{className:"w-4 h-4"}),"Fecha de Inicio"]}),jsxRuntime.jsx("input",{type:"date",value:i.startDate?i.startDate.toISOString().split("T")[0]:"",onChange:u=>f("startDate",u.target.value?new Date(u.target.value):void 0),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent",style:c,disabled:l||i.isMilestone})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Calendar,{className:"w-4 h-4"}),"Fecha de Fin"]}),jsxRuntime.jsx("input",{type:"date",value:i.endDate?i.endDate.toISOString().split("T")[0]:"",onChange:u=>f("endDate",u.target.value?new Date(u.target.value):void 0),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent",style:c,disabled:l||i.isMilestone}),v.endDate&&jsxRuntime.jsxs("p",{className:"mt-1 text-sm text-red-400 flex items-center gap-1",children:[jsxRuntime.jsx(lucideReact.AlertCircle,{className:"w-4 h-4"}),v.endDate]})]})]}),jsxRuntime.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.CheckCircle2,{className:"w-4 h-4"}),"Estado"]}),jsxRuntime.jsxs("select",{value:i.status,onChange:u=>f("status",u.target.value),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent",style:c,disabled:l,children:[jsxRuntime.jsx("option",{value:"todo",children:"Por Hacer"}),jsxRuntime.jsx("option",{value:"in-progress",children:"En Progreso"}),jsxRuntime.jsx("option",{value:"completed",children:"Completada"})]})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Flag,{className:"w-4 h-4"}),"Prioridad"]}),jsxRuntime.jsxs("select",{value:i.priority||"medium",onChange:u=>f("priority",u.target.value),className:"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent",style:c,disabled:l,children:[jsxRuntime.jsx("option",{value:"low",children:"\u{1F7E2} Baja"}),jsxRuntime.jsx("option",{value:"medium",children:"\u{1F7E1} Media"}),jsxRuntime.jsx("option",{value:"high",children:"\u{1F7E0} Alta"}),jsxRuntime.jsx("option",{value:"urgent",children:"\u{1F534} Urgente"})]})]})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-3 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Palette,{className:"w-4 h-4"}),"Color de la Tarea"]}),jsxRuntime.jsx(ll,{value:i.color,onChange:u=>f("color",u),disabled:l}),jsxRuntime.jsx("p",{className:"text-xs mt-2",style:{color:n.textTertiary},children:a?.parentId?"Esta subtarea hereda el color de su tarea padre":a?.subtasks&&a.subtasks.length>0?"Las subtareas heredar\xE1n este color con menor opacidad":"Elige un color para organizar visualmente tus tareas"})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center justify-between",style:d,children:[jsxRuntime.jsxs("span",{className:"flex items-center gap-2",children:[jsxRuntime.jsx(lucideReact.Clock,{className:"w-4 h-4"}),"Progreso"]}),jsxRuntime.jsxs("span",{className:"font-semibold px-2 py-0.5 rounded text-sm",style:{color:i.progress<30?"#EF4444":i.progress<70?"#F59E0B":"#10B981",backgroundColor:i.progress<30?"rgba(239, 68, 68, 0.1)":i.progress<70?"rgba(245, 158, 11, 0.1)":"rgba(16, 185, 129, 0.1)"},children:[i.progress,"%"]})]}),jsxRuntime.jsxs("div",{className:"relative",children:[jsxRuntime.jsx("input",{type:"range",min:"0",max:"100",step:"5",value:i.progress,onChange:u=>f("progress",parseInt(u.target.value)),className:"w-full h-2 rounded-lg appearance-none cursor-pointer",style:{backgroundColor:n.bgSecondary,accentColor:i.progress<30?"#EF4444":i.progress<70?"#F59E0B":"#10B981"},disabled:l}),jsxRuntime.jsx("div",{className:"absolute top-0 left-0 h-2 rounded-lg pointer-events-none transition-all duration-300",style:{width:`${i.progress}%`,backgroundColor:i.progress<30?"rgba(239, 68, 68, 0.3)":i.progress<70?"rgba(245, 158, 11, 0.3)":"rgba(16, 185, 129, 0.3)"}})]}),jsxRuntime.jsxs("div",{className:"flex items-center justify-between mt-3 gap-2",children:[jsxRuntime.jsx("span",{className:"text-xs",style:{color:n.textTertiary},children:"Accesos r\xE1pidos:"}),jsxRuntime.jsx("div",{className:"flex gap-1.5",children:[0,25,50,75,100].map(u=>jsxRuntime.jsxs("button",{type:"button",onClick:()=>f("progress",u),disabled:l,className:"px-3 py-1 text-xs font-medium rounded-md transition-all duration-200 hover:scale-105 active:scale-95",style:{backgroundColor:i.progress===u?u<30?"#EF4444":u<70?"#F59E0B":"#10B981":n.bgSecondary,color:i.progress===u?"#FFFFFF":n.textSecondary,border:`1px solid ${i.progress===u?u<30?"#EF4444":u<70?"#F59E0B":"#10B981":n.borderLight}`},children:[u,"%"]},u))})]}),jsxRuntime.jsxs("div",{className:"flex justify-between text-xs mt-2",style:{color:n.textTertiary},children:[jsxRuntime.jsx("span",{children:"0%"}),jsxRuntime.jsx("span",{children:"25%"}),jsxRuntime.jsx("span",{children:"50%"}),jsxRuntime.jsx("span",{children:"75%"}),jsxRuntime.jsx("span",{children:"100%"})]})]}),jsxRuntime.jsxs("div",{className:"flex items-center gap-3 p-4 rounded-lg",style:{backgroundColor:n.bgSecondary,border:`1px solid ${n.borderLight}`},children:[jsxRuntime.jsx("input",{type:"checkbox",id:"isMilestone",checked:i.isMilestone,onChange:u=>f("isMilestone",u.target.checked),className:"w-4 h-4 rounded focus:ring-2",style:{accentColor:n.accent},disabled:l}),jsxRuntime.jsxs("label",{htmlFor:"isMilestone",className:"flex items-center gap-2 text-sm cursor-pointer",style:{color:n.textPrimary},children:[jsxRuntime.jsx(lucideReact.Milestone,{className:"w-4 h-4 text-yellow-500"}),"Marcar como Hito (Milestone)"]})]}),o.length>0&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Users,{className:"w-4 h-4"}),"Asignar a"]}),jsxRuntime.jsx("div",{className:"space-y-2 max-h-32 overflow-y-auto p-3 rounded-lg",style:{backgroundColor:n.bgSecondary,border:`1px solid ${n.borderLight}`},children:o.map(u=>jsxRuntime.jsxs("label",{className:"flex items-center gap-3 cursor-pointer p-2 rounded",onMouseEnter:C=>C.currentTarget.style.backgroundColor=n.hoverBg,onMouseLeave:C=>C.currentTarget.style.backgroundColor="transparent",children:[jsxRuntime.jsx("input",{type:"checkbox",checked:i.assignees?.some(C=>C.name===u.name),onChange:C=>{let T=C.target.checked?[...i.assignees||[],{id:u.id,name:u.name,avatar:u.avatar,initials:u.name.split(" ").map(b=>b[0]).join("").toUpperCase().slice(0,2),color:n.accent}]:(i.assignees||[]).filter(b=>b.name!==u.name);f("assignees",T);},className:"w-4 h-4 rounded",style:{accentColor:n.accent},disabled:l}),jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[jsxRuntime.jsx("div",{className:"w-6 h-6 rounded-full flex items-center justify-center text-xs text-white font-semibold",style:{backgroundColor:n.accent},children:u.name.charAt(0).toUpperCase()}),jsxRuntime.jsx("span",{className:"text-sm",style:{color:n.textPrimary},children:u.name})]})]},u.id))})]}),r.length>0&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("label",{className:"block text-sm font-medium mb-2 flex items-center gap-2",style:d,children:[jsxRuntime.jsx(lucideReact.Link2,{className:"w-4 h-4"}),"Dependencias"]}),jsxRuntime.jsx("div",{className:"space-y-2 max-h-32 overflow-y-auto p-3 rounded-lg",style:{backgroundColor:n.bgSecondary,border:`1px solid ${n.borderLight}`},children:r.filter(u=>u.id!==a?.id).map(u=>jsxRuntime.jsxs("label",{className:"flex items-center gap-3 cursor-pointer p-2 rounded",onMouseEnter:C=>C.currentTarget.style.backgroundColor=n.hoverBg,onMouseLeave:C=>C.currentTarget.style.backgroundColor="transparent",children:[jsxRuntime.jsx("input",{type:"checkbox",checked:i.dependencies?.includes(u.id),onChange:C=>{let T=C.target.checked?[...i.dependencies||[],u.id]:(i.dependencies||[]).filter(b=>b!==u.id);f("dependencies",T);},className:"w-4 h-4 rounded",style:{accentColor:n.accent},disabled:l}),jsxRuntime.jsx("span",{className:"text-sm",style:{color:n.textPrimary},children:u.name})]},u.id))})]})]}),jsxRuntime.jsxs("div",{className:"flex items-center justify-end gap-3 px-6 py-4",style:{borderTop:`1px solid ${n.border}`,backgroundColor:n.bgPrimary},children:[jsxRuntime.jsx("button",{type:"button",onClick:t,className:"px-4 py-2 text-sm font-medium rounded-lg transition-colors",style:{color:n.textSecondary},onMouseEnter:u=>{u.currentTarget.style.color=n.textPrimary,u.currentTarget.style.backgroundColor=n.hoverBg;},onMouseLeave:u=>{u.currentTarget.style.color=n.textSecondary,u.currentTarget.style.backgroundColor="transparent";},disabled:l,children:"Cancelar"}),jsxRuntime.jsx("button",{onClick:h,disabled:l,className:"px-4 py-2 text-sm font-medium rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2",style:{backgroundColor:n.accent,color:"#FFFFFF"},onMouseEnter:u=>!l&&(u.currentTarget.style.backgroundColor=n.accentHover),onMouseLeave:u=>!l&&(u.currentTarget.style.backgroundColor=n.accent),children:l?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin"}),"Guardando..."]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(lucideReact.CheckCircle2,{className:"w-4 h-4"}),m==="create"?"Crear Tarea":"Guardar Cambios"]})})]})]})})]})})}var _u=['Move "Task Name" to next Monday','Extend "Task Name" by 3 days','Rename "Old Name" to "New Name"','Set "Task Name" progress to 50%','Link "Task A" to "Task B"','Create a new task called "New Task"','Delete "Task Name"','Assign John to "Task Name"'],fl=()=>jsxRuntime.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsxRuntime.jsx("path",{d:"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707"}),jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"4"})]}),Vu=()=>jsxRuntime.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:jsxRuntime.jsx("path",{d:"M22 2L11 13M22 2L15 22L11 13M22 2L2 9L11 13"})}),ju=()=>jsxRuntime.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:jsxRuntime.jsx("path",{d:"M18 6L6 18M6 6L18 18"})}),Ku=()=>jsxRuntime.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:jsxRuntime.jsx("path",{d:"M5 12h14"})}),Yu=()=>jsxRuntime.jsx("div",{className:"flex gap-1 items-center",children:[0,1,2].map(e=>jsxRuntime.jsx(framerMotion.motion.div,{className:"w-2 h-2 rounded-full bg-current",animate:{scale:[1,1.2,1],opacity:[.5,1,.5]},transition:{duration:.8,repeat:1/0,delay:e*.15}},e))});function fo({tasks:e,theme:t,config:a,onTasksUpdate:r,onTaskUpdate:o,onTaskCreate:s,onTaskDelete:l,onDependencyCreate:m,onDependencyDelete:p}){let[n,c]=react.useState(false),[d,i]=react.useState(false),[g,v]=react.useState([]),[x,y]=react.useState(""),[h,f]=react.useState(false),[u,C]=react.useState(true),T=react.useRef(null),b=react.useRef(null),N=react.useRef(null),{enabled:k=true,placeholder:S='Ask AI to edit tasks... (e.g., "Move Design to next week")',position:w="bottom-right",onCommand:G,suggestions:H=_u,maxHistory:F=50,persistHistory:W}=a,E=W?.storageKey||"gantt-ai-history",z=W?.maxMessages??5;react.useEffect(()=>{if(W?.enabled)try{let O=localStorage.getItem(E);if(O){let ue=JSON.parse(O).map(Y=>({...Y,timestamp:new Date(Y.timestamp)}));v(ue.slice(-z));}}catch(O){console.warn("[GanttAIAssistant] Failed to load persisted history:",O);}},[W?.enabled,E,z]),react.useEffect(()=>{if(W?.enabled&&g.length>0)try{let O=g.filter(M=>!M.isLoading).slice(-z);localStorage.setItem(E,JSON.stringify(O));}catch(O){console.warn("[GanttAIAssistant] Failed to persist history:",O);}},[g,W?.enabled,E,z]),react.useEffect(()=>{b.current&&b.current.scrollIntoView({behavior:"smooth"});},[g]),react.useEffect(()=>{n&&!d&&T.current&&setTimeout(()=>T.current?.focus(),100);},[n,d]);let Q=react.useCallback(O=>{if(O.success)switch(O.type){case "move_task":case "resize_task":case "rename_task":case "set_progress":case "set_status":case "assign_task":O.taskId&&O.updates&&o?.(O.taskId,O.updates);break;case "create_task":O.newTask&&s?.(O.newTask);break;case "delete_task":O.taskId&&l?.(O.taskId);break;case "link_tasks":O.dependencyFrom&&O.dependencyTo&&m?.(O.dependencyFrom,O.dependencyTo);break;case "unlink_tasks":O.taskId&&O.dependencyFrom&&p?.(O.taskId,O.dependencyFrom);break}},[o,s,l,m,p]),te=react.useCallback(async O=>{if(!O.trim()||h)return;let M={id:`user-${Date.now()}`,role:"user",content:O,timestamp:new Date};v(Y=>[...Y.slice(-(F-1)),M]),y(""),C(false),f(true);let ue={id:`loading-${Date.now()}`,role:"assistant",content:"",timestamp:new Date,isLoading:true};v(Y=>[...Y,ue]);try{if(G){let Y=await G(O,e);v($e=>{let Oe=$e.filter(ve=>!ve.isLoading),Ct={id:`assistant-${Date.now()}`,role:"assistant",content:Y.message,timestamp:new Date,command:Y};return [...Oe,Ct]}),Q(Y);}else v(Y=>[...Y.filter(Oe=>!Oe.isLoading),{id:`assistant-${Date.now()}`,role:"assistant",content:"AI handler not configured. Please provide an onCommand handler in the aiAssistant config.",timestamp:new Date}]);}catch(Y){v($e=>[...$e.filter(Ct=>!Ct.isLoading),{id:`error-${Date.now()}`,role:"assistant",content:`Sorry, I encountered an error: ${Y instanceof Error?Y.message:"Unknown error"}`,timestamp:new Date}]);}finally{f(false);}},[h,F,G,e,Q]),le=O=>{O.preventDefault(),te(x);},se=O=>{y(O),T.current?.focus();};if(react.useEffect(()=>{let O=M=>{(M.metaKey||M.ctrlKey)&&M.key==="k"&&(M.preventDefault(),c(ue=>!ue),n||i(false)),M.key==="Escape"&&n&&c(false);};return document.addEventListener("keydown",O),()=>document.removeEventListener("keydown",O)},[n]),react.useEffect(()=>{if(!n)return;let O=ue=>{let Y=ue.target;N.current&&!N.current.contains(Y)&&c(false);},M=setTimeout(()=>{document.addEventListener("mousedown",O);},100);return ()=>{clearTimeout(M),document.removeEventListener("mousedown",O);}},[n]),!k)return null;let _={"bottom-right":"bottom-4 right-4","bottom-left":"bottom-4 left-4","top-right":"top-4 right-4","top-left":"top-4 left-4"};return jsxRuntime.jsxs(Be,{children:[jsxRuntime.jsx(framerMotion.AnimatePresence,{children:!n&&jsxRuntime.jsxs(framerMotion.motion.button,{initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},whileHover:{scale:1.05},whileTap:{scale:.95},className:`fixed ${_[w]} z-[99999] flex items-center gap-2 px-4 py-3 rounded-full shadow-lg transition-colors`,style:{background:"linear-gradient(135deg, #3B82F6 0%, #2563EB 100%)",color:"white",boxShadow:"0 4px 20px rgba(59, 130, 246, 0.4)"},onClick:()=>c(true),children:[jsxRuntime.jsx(fl,{}),jsxRuntime.jsx("span",{className:"text-sm font-medium",children:"AI Assistant"}),jsxRuntime.jsx("kbd",{className:"hidden sm:inline-flex items-center gap-0.5 px-1.5 py-0.5 text-[10px] font-mono rounded bg-white/20",children:"\u2318K"})]})}),jsxRuntime.jsx(framerMotion.AnimatePresence,{children:n&&jsxRuntime.jsxs(framerMotion.motion.div,{ref:N,initial:{opacity:0,y:20,scale:.95},animate:{opacity:1,y:0,scale:1,height:d?"auto":500},exit:{opacity:0,y:20,scale:.95},transition:{type:"spring",damping:25,stiffness:300},className:`fixed ${_[w]} z-[99999] w-96 rounded-2xl overflow-hidden shadow-2xl flex flex-col`,style:{background:t.bgPrimary,border:`1px solid ${t.border}`,boxShadow:`0 20px 60px rgba(0, 0, 0, 0.3), 0 0 0 1px ${t.border}`},children:[jsxRuntime.jsxs("div",{className:"flex items-center justify-between px-4 py-3",style:{background:"linear-gradient(135deg, #3B82F6 0%, #2563EB 100%)"},children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-2 text-white",children:[jsxRuntime.jsx(fl,{}),jsxRuntime.jsx("span",{className:"font-semibold",children:"Gantt AI Assistant"})]}),jsxRuntime.jsxs("div",{className:"flex items-center gap-1",children:[jsxRuntime.jsx("button",{onClick:()=>i(O=>!O),className:"p-1.5 rounded-lg hover:bg-white/20 text-white/80 hover:text-white transition-colors",children:jsxRuntime.jsx(Ku,{})}),jsxRuntime.jsx("button",{onClick:()=>c(false),className:"p-1.5 rounded-lg hover:bg-white/20 text-white/80 hover:text-white transition-colors",children:jsxRuntime.jsx(ju,{})})]})]}),jsxRuntime.jsx(framerMotion.AnimatePresence,{children:!d&&jsxRuntime.jsxs(framerMotion.motion.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},className:"flex flex-col flex-1 min-h-0",children:[jsxRuntime.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-4",style:{maxHeight:350},children:[g.length===0&&u&&jsxRuntime.jsxs("div",{className:"space-y-3",children:[jsxRuntime.jsx("p",{className:"text-sm text-center",style:{color:t.textSecondary},children:"Try asking me to edit your Gantt chart:"}),jsxRuntime.jsx("div",{className:"flex flex-wrap gap-2",children:H.slice(0,4).map((O,M)=>jsxRuntime.jsx("button",{onClick:()=>se(O),className:"text-xs px-3 py-1.5 rounded-full transition-colors",style:{background:t.bgSecondary,color:t.textSecondary,border:`1px solid ${t.border}`},children:O.length>30?O.slice(0,30)+"...":O},M))})]}),g.map(O=>jsxRuntime.jsx(framerMotion.motion.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},className:`flex ${O.role==="user"?"justify-end":"justify-start"}`,children:jsxRuntime.jsxs("div",{className:`max-w-[85%] rounded-2xl px-4 py-2.5 ${O.role==="user"?"rounded-br-md":"rounded-bl-md"}`,style:{background:O.role==="user"?"linear-gradient(135deg, #6366F1 0%, #8B5CF6 100%)":t.bgSecondary,color:O.role==="user"?"white":t.textPrimary},children:[O.isLoading?jsxRuntime.jsx(Yu,{}):jsxRuntime.jsx("p",{className:"text-sm whitespace-pre-wrap",children:O.content}),O.command&&jsxRuntime.jsxs("div",{className:"mt-2 text-xs px-2 py-1 rounded-md inline-flex items-center gap-1",style:{background:O.command.success?"rgba(16, 185, 129, 0.2)":"rgba(239, 68, 68, 0.2)",color:O.command.success?"#10B981":"#EF4444"},children:[O.command.success?"\u2713":"\u2717",jsxRuntime.jsx("span",{className:"capitalize",children:O.command.type.replace(/_/g," ")})]})]})},O.id)),jsxRuntime.jsx("div",{ref:b})]}),jsxRuntime.jsxs("form",{onSubmit:le,className:"p-3 border-t",style:{borderColor:t.border},children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-2 rounded-xl px-4 py-2",style:{background:t.bgSecondary,border:`1px solid ${t.border}`},children:[jsxRuntime.jsx("input",{ref:T,type:"text",value:x,onChange:O=>y(O.target.value),placeholder:S,disabled:h,className:"flex-1 bg-transparent text-sm outline-none",style:{color:t.textPrimary}}),jsxRuntime.jsx("button",{type:"submit",disabled:!x.trim()||h,className:"p-2 rounded-lg transition-all disabled:opacity-50",style:{background:x.trim()?"linear-gradient(135deg, #6366F1 0%, #8B5CF6 100%)":"transparent",color:x.trim()?"white":t.textSecondary},children:jsxRuntime.jsx(Vu,{})})]}),jsxRuntime.jsx("p",{className:"text-[10px] text-center mt-2",style:{color:t.textTertiary},children:"Press Enter to send \u2022 Esc to close"})]})]})})]})})]})}function bl(e,t=50){let[a,r]=react.useState({past:[],present:e,future:[]}),o=react.useRef(false),s=react.useCallback((n,c=true)=>{r(d=>{let i=typeof n=="function"?n(d.present):n;if(o.current)return {...d,present:i};if(!c)return {...d,present:i};let g=[...d.past,d.present];return g.length>t&&g.shift(),{past:g,present:i,future:[]}});},[t]),l=react.useCallback(()=>{r(n=>{if(n.past.length===0)return n;let c=n.past[n.past.length-1],d=n.past.slice(0,n.past.length-1);return o.current=true,setTimeout(()=>{o.current=false;},0),{past:d,present:c,future:[n.present,...n.future]}});},[]),m=react.useCallback(()=>{r(n=>{if(n.future.length===0)return n;let c=n.future[0],d=n.future.slice(1);return o.current=true,setTimeout(()=>{o.current=false;},0),{past:[...n.past,n.present],present:c,future:d}});},[]),p=react.useCallback(()=>{r(n=>({past:[],present:n.present,future:[]}));},[]);return {state:a.present,setState:s,undo:l,redo:m,canUndo:a.past.length>0,canRedo:a.future.length>0,clearHistory:p}}function hl({undo:e,redo:t,canUndo:a,canRedo:r,enabled:o=true}){react.useEffect(()=>{if(!o)return;let s=l=>{let m=navigator.platform.toUpperCase().indexOf("MAC")>=0,p=m?l.metaKey:l.ctrlKey;if(p&&l.key==="z"&&!l.shiftKey&&a){l.preventDefault(),e();return}if(r){if(!m&&p&&l.key==="y"){l.preventDefault(),t();return}if(m&&p&&l.shiftKey&&l.key==="z"){l.preventDefault(),t();return}}};return window.addEventListener("keydown",s),()=>{window.removeEventListener("keydown",s);}},[e,t,a,r,o]);}var Zu={taskTooltip:e=>{let t=[`<strong>${e.name}</strong>`];if(e.startDate&&e.endDate){t.push(`${K.formatDate(e.startDate)} - ${K.formatDate(e.endDate)}`);let a=K.calculateDuration(e.startDate,e.endDate);t.push(`Duration: ${a} days`);}if(e.progress!==void 0&&t.push(`Progress: ${e.progress}%`),e.status&&t.push(`Status: ${e.status}`),e.assignees&&e.assignees.length>0){let a=e.assignees.map(r=>r.name).join(", ");t.push(`Assigned: ${a}`);}return e.dependencies&&e.dependencies.length>0&&t.push(`Dependencies: ${e.dependencies.length}`),t.join("<br/>")},taskLabel:e=>e.name,gridCell:(e,t,a)=>a,taskClass:e=>{let t=[];return e.isCriticalPath&&t.push("critical-path"),e.status==="completed"?t.push("completed"):e.status==="in-progress"?t.push("in-progress"):e.status==="todo"&&t.push("todo"),e.isMilestone&&t.push("milestone"),t.join(" ")},milestoneContent:e=>`\u25C6 ${e.name}`,dateFormat:e=>K.formatDate(e),durationFormat:e=>e===1?"1 day":`${e} days`,progressFormat:e=>`${e}%`};function vl(e){return {...Zu,...e}}var ng=e=>{switch(e){case "compact":return 40;case "comfortable":return 48;case "spacious":return 56;default:return 48}},kl=react.forwardRef(function({tasks:t,config:a={},onTasksChange:r},o){let{theme:s,timeScale:l="week",rowDensity:m="comfortable",showThemeSelector:p=true,showExportButton:n=true,availableUsers:c=[],templates:d,enableAutoCriticalPath:i=true,aiAssistant:g,locale:v="en",customTranslations:x,showCreateTaskButton:y=false,createTaskLabel:h,onCreateTask:f,onThemeChange:u,onTaskClick:C,onTaskDblClick:T,onTaskContextMenu:b,onTaskUpdate:N,onProgressChange:k,onTaskEdit:S,onTaskAddSubtask:w,onTaskMarkIncomplete:G,onTaskSetInProgress:H,onDependencyCreate:F,onDependencyDelete:W,onBeforeTaskAdd:E,onAfterTaskAdd:z,onBeforeTaskUpdate:Q,onAfterTaskUpdate:te,onBeforeTaskDelete:le,onAfterTaskDelete:se}=a,O=react.useContext(eo)?.theme,[M,ue]=react.useState(O||s||"dark"),[Y,$e]=react.useState(l),[Oe,Ct]=react.useState(m),[ve,ut]=react.useState(1),[Mt,ha]=react.useState(0),[va,oa]=react.useState(false),[Vt,ca]=react.useState(null),[we,na]=react.useState({isOpen:false,x:0,y:0,task:null}),[gt,at]=react.useState(null),[jt,St]=react.useState(null);react.useEffect(()=>{O&&O!==M&&ue(O);},[O]),react.useEffect(()=>{s&&s!==M&&ue(s);},[s]);let X=react.useCallback(D=>{ue(D),u?.(D);},[u]),{state:L,setState:q,undo:He,redo:Te,canUndo:Bt,canRedo:Rt,clearHistory:ye}=bl(t,50);react.useEffect(()=>{q(t);},[t,q]);let fe=react.useRef(t),$t=react.useRef(true);react.useEffect(()=>{if($t.current){$t.current=false,fe.current=L;return}if(!r)return;let D=JSON.stringify(fe.current),I=JSON.stringify(L);D!==I&&(fe.current=L,r(L));},[L,r]);let j=react.useMemo(()=>Tn(v,x),[v,x]),V=react.useCallback(D=>[{id:"name",label:D.columns.taskName,width:400,minWidth:200,maxWidth:2e3,visible:true,sortable:true,resizable:false},{id:"startDate",label:D.columns.startDate,width:110,visible:false,sortable:true},{id:"endDate",label:D.columns.endDate,width:110,visible:false,sortable:true},{id:"duration",label:D.columns.duration,width:80,visible:false,sortable:true},{id:"assignees",label:D.columns.assignees,width:120,visible:false,sortable:false},{id:"status",label:D.columns.status,width:80,visible:false,sortable:true},{id:"progress",label:D.columns.progress,width:120,visible:false,sortable:true},{id:"priority",label:D.columns.priority,width:90,visible:false,sortable:true}],[]),[ie,oe]=react.useState(()=>V(j));react.useEffect(()=>{oe(D=>D.map(I=>({...I,label:j.columns[I.id==="name"?"taskName":I.id]||I.label})));},[j]);let We=react.useMemo(()=>ie.filter(D=>D.visible).reduce((D,I)=>D+I.width,0)+60,[ie]),rt=Vt||We,P=react.useRef(null),$=react.useRef(null),ce=react.useRef(null),me=react.useMemo(()=>Fi(M),[M]),Tt=react.useMemo(()=>({theme:me,themeName:M}),[me,M]),Va=react.useMemo(()=>vl(d),[d]),ja=react.useMemo(()=>{if(!i)return L;let D=K.calculateCriticalPath(L),I=U=>U.map(ee=>({...ee,isCriticalPath:D.includes(ee.id),subtasks:ee.subtasks?I(ee.subtasks):void 0}));return I(L)},[L,i]),Gr=ng(Oe);hl({undo:He,redo:Te,canUndo:Bt,canRedo:Rt,enabled:true}),react.useImperativeHandle(o,()=>({getTask:D=>K.findTaskById(L,D),addTask:(D,I)=>{q(U=>{if(!I)return [...U,{...D,level:0}];let ee=ne=>ne.map(pe=>pe.id===I?{...pe,subtasks:[...pe.subtasks||[],{...D,parentId:I,level:(pe.level||0)+1}],isExpanded:true}:pe.subtasks?{...pe,subtasks:ee(pe.subtasks)}:pe);return ee(U)});},updateTask:(D,I)=>{q(U=>{let ee=ne=>ne.map(pe=>pe.id===D?{...pe,...I}:pe.subtasks?{...pe,subtasks:ee(pe.subtasks)}:pe);return ee(U)});},deleteTask:D=>{q(I=>{let U=ee=>ee.filter(ne=>ne.id===D?false:(ne.subtasks&&(ne.subtasks=U(ne.subtasks)),true));return U(I)});},deleteTasks:D=>{q(I=>In(I,D));},duplicateTask:D=>{q(I=>Fn(I,[D]));},splitTask:(D,I,U=3)=>{q(ee=>K.splitTask(ee,D,I,U));},calculateEndDate:K.calculateEndDate,calculateDuration:K.calculateDuration,validateDependency:(D,I)=>!K.validateDependencies(L,D,I),getAllTasks:()=>K.flattenTasks(L),getTasksByStatus:D=>K.flattenTasks(L).filter(I=>I.status===D),getTasksByParent:D=>D?K.findTaskById(L,D)?.subtasks||[]:L.filter(U=>!U.parentId),getCriticalPath:()=>K.flattenTasks(L).filter(D=>D.isCriticalPath),indentTask:D=>{q(I=>En(I,[D]));},outdentTask:D=>{q(I=>Pn(I,[D]));},moveTask:(D,I)=>{q(U=>Mn(U,[D],I));},createSubtask:async D=>{let{tasks:I,newTask:U}=Bn(L,D);if(E){let ee=E({...U,parentId:D});if((ee instanceof Promise?await ee:ee)===false)return}q(I),z&&z({...U,parentId:D});},scrollToTask:D=>{let U=K.flattenTasks(L).findIndex(ee=>ee.id===D);if(U!==-1&&P.current){let ee=U*Gr;P.current.scrollTo({top:ee,behavior:"smooth"}),$.current&&$.current.scrollTo({top:ee,behavior:"smooth"});}},highlightTask:(D,I=2e3)=>{},expandTask:D=>{q(I=>{let U=ee=>ee.map(ne=>ne.id===D?{...ne,isExpanded:true}:ne.subtasks?{...ne,subtasks:U(ne.subtasks)}:ne);return U(I)});},collapseTask:D=>{q(I=>{let U=ee=>ee.map(ne=>ne.id===D?{...ne,isExpanded:false}:ne.subtasks?{...ne,subtasks:U(ne.subtasks)}:ne);return U(I)});},expandAll:()=>{q(D=>{let I=U=>U.map(ee=>({...ee,isExpanded:true,subtasks:ee.subtasks?I(ee.subtasks):void 0}));return I(D)});},collapseAll:()=>{q(D=>{let I=U=>U.map(ee=>({...ee,isExpanded:false,subtasks:ee.subtasks?I(ee.subtasks):void 0}));return I(D)});},undo:He,redo:Te,canUndo:()=>Bt,canRedo:()=>Rt,clearHistory:ye,exportToPNG:async()=>{if(!ce.current)throw new Error("Gantt container not found");let D=await xl__default.default(ce.current,{backgroundColor:me.bgPrimary,scale:2});return new Promise((I,U)=>{D.toBlob(ee=>{ee?I(ee):U(new Error("Failed to create blob from canvas"));},"image/png");})},exportToPDF:async D=>{await K.exportToPDF(L,D);},exportToExcel:async D=>{await K.exportToExcel(L,D);},exportToJSON:()=>K.exportToJSON(L),exportToCSV:()=>K.exportToCSV(L),importFromJSON:D=>{let I=K.importFromJSON(D);q(I);},getTasks:()=>L,refresh:()=>{q(D=>[...D]);},clearAll:()=>{q([]);}}),[L,He,Te,Bt,Rt,ye,me,Gr]);let Ld=react.useCallback(D=>{oe(I=>I.map(U=>U.id===D?{...U,visible:!U.visible}:U));},[]),Ad=react.useCallback((D,I)=>{oe(U=>U.map(ee=>{if(ee.id!==D)return ee;let ne=ee.minWidth??100,pe=ee.maxWidth??800,st=Math.max(ne,Math.min(pe,I));return {...ee,width:st}}));},[]),Bd=react.useCallback(D=>{q(I=>An(I,D)),a.onTaskToggleExpand?.(D);},[a]),Ka=react.useCallback((D,I)=>{if(Q&&Q(D,I)===false)return;let ee=K.findTaskById(L,D)?.progress,ne=st=>st.map(kt=>kt.id===D?{...kt,...I}:kt.subtasks?{...kt,subtasks:ne(kt.subtasks)}:kt);q(ne(L));let pe=K.findTaskById(ne(L),D);pe&&(N?.(pe),te?.(pe),I.progress!==void 0&&ee!==void 0&&I.progress!==ee&&k?.(D,ee,I.progress));},[L,N,Q,te,k]),Rd=react.useCallback(D=>{D.length!==0&&(q(I=>En(I,D)),a.onTaskIndent?.(D[0]));},[a]),Od=react.useCallback(D=>{D.length!==0&&(q(I=>Pn(I,D)),a.onTaskOutdent?.(D[0]));},[a]),Gd=react.useCallback((D,I)=>{D.length!==0&&(q(U=>Mn(U,D,I)),a.onTaskMove?.(D[0],I));},[a]),Lo=react.useCallback(async D=>{let I=[];for(let U of D)le&&await Promise.resolve(le(U))===false||I.push(U);I.length!==0&&(a.onMultiTaskDelete?a.onMultiTaskDelete(I):(q(U=>In(U,I)),I.forEach(U=>a.onTaskDelete?.(U))),se&&I.forEach(U=>se(U)));},[a,le,se]),zd=react.useCallback(D=>{q(I=>Fn(I,D)),D.forEach(I=>a.onTaskDuplicate?.(I));},[a]),Ud=react.useCallback((D,I)=>{q(U=>{let{tasks:ee,newTask:ne}=qi(U,D,I);return E&&E(ne)===false?U:(a.onTaskCreate?.(ne.parentId,ne.position||0),z?.(ne),ee)});},[a,E,z]),$d=react.useCallback((D,I)=>{q(U=>Ln(U,D,I)),a.onTaskRename?.(D,I);},[a]),Fs=react.useCallback(D=>{q(I=>{let{tasks:U}=Bn(I,D);return a.onTaskCreate?.(D,0),U});},[a]),Hd=react.useCallback((D,I,U)=>{let ee=D.startDate?Math.round((I.getTime()-D.startDate.getTime())/864e5):0,ne=kt=>kt.map(Kt=>Kt.id===D.id?{...Kt,startDate:I,endDate:U,...D.segments&&{segments:D.segments}}:Kt.subtasks?{...Kt,subtasks:ne(Kt.subtasks)}:Kt),pe=ne(L);pe=K.autoScheduleDependents(pe,D.id,ee),q(pe);let st={...D,startDate:I,endDate:U};N?.(st);},[L,N]),Wd=react.useCallback((D,I)=>{b?.(D,I),na({isOpen:true,x:I.clientX,y:I.clientY,task:D});},[b]),_d=react.useCallback((D,I)=>{let U=K.splitTask(L,D.id,I);q(U),na({isOpen:false,x:0,y:0,task:null});},[L]),Ls=react.useCallback(D=>{T?.(D),S||at(D);},[T,S]),As=react.useCallback((D,I,U)=>{let ee=new Map,ne=Yt=>{Yt.forEach(pa=>{pa.dependencies&&ee.set(pa.id,pa.dependencies),pa.subtasks&&ne(pa.subtasks);});};ne(U);let pe=ee.get(I)||[];ee.set(I,[...pe,D]);let st=new Set,kt=new Set,Kt=Yt=>{if(!st.has(Yt)){st.add(Yt),kt.add(Yt);let pa=ee.get(Yt)||[];for(let ur of pa){if(!st.has(ur)&&Kt(ur))return true;if(kt.has(ur))return true}}return kt.delete(Yt),false};return Kt(I)},[]),Bs=react.useCallback((D,I)=>{if(As(D.id,I,L)){console.warn("Cannot create dependency: would create a circular dependency"),alert(`Cannot create this dependency: it would create a circular dependency chain.
|
|
277
277
|
|
|
278
278
|
Task dependencies must flow in one direction only.`);return}let U=ee=>ee.map(ne=>{if(ne.id===I){let pe=ne.dependencies||[];if(!pe.includes(D.id))return {...ne,dependencies:[...pe,D.id]}}return ne.subtasks?{...ne,subtasks:U(ne.subtasks)}:ne});q(U(L)),F?.(D.id,I);},[L,F,As]),Rs=react.useCallback((D,I)=>{let U=ee=>ee.map(ne=>{if(ne.id===D&&ne.dependencies){let pe=ne.dependencies.filter(st=>st!==I);return {...ne,dependencies:pe}}return ne.subtasks?{...ne,subtasks:U(ne.subtasks)}:ne});q(U(L)),W?.(D,I);},[L,W]),{startDate:Vd,endDate:jd}=react.useMemo(()=>{let D=L.filter(pe=>pe.startDate&&pe.endDate);if(D.length===0){let pe=new Date,st=new Date(pe);st.setDate(st.getDate()-30);let kt=new Date(pe);return kt.setDate(kt.getDate()+60),{startDate:st,endDate:kt}}let I=D.flatMap(pe=>[pe.startDate,pe.endDate]).filter(pe=>pe!==void 0),U=new Date(Math.min(...I.map(pe=>pe.getTime()))),ee=new Date(Math.max(...I.map(pe=>pe.getTime()))),ne=Y==="day"?7:Y==="week"?14:30;return U.setDate(U.getDate()-ne),ee.setDate(ee.getDate()+ne),{startDate:U,endDate:ee}},[L,Y]),Kd=react.useCallback(async()=>{if(!ce.current)return;let D=await xl__default.default(ce.current,{backgroundColor:me.bgPrimary,scale:2}),I=document.createElement("a");I.download="gantt-chart.png",I.href=D.toDataURL("image/png"),I.click();},[me]),Yd=react.useCallback(async()=>{await K.exportToPDF(L);},[L]),Xd=react.useCallback(async()=>{await K.exportToExcel(L);},[L]),qd=react.useCallback(()=>{let D=K.exportToCSV(L),I=new Blob([D],{type:"text/csv;charset=utf-8;"}),U=document.createElement("a");U.href=URL.createObjectURL(I),U.download="gantt-chart.csv",U.click(),URL.revokeObjectURL(U.href);},[L]),Jd=react.useCallback(()=>{let D=K.exportToJSON(L),I=new Blob([D],{type:"application/json;charset=utf-8;"}),U=document.createElement("a");U.href=URL.createObjectURL(I),U.download="gantt-chart.json",U.click(),URL.revokeObjectURL(U.href);},[L]),Zd=react.useCallback(()=>{K.exportToMSProject(L,"Gantt Project","project.xml");},[L]),Qd=D=>{D.preventDefault(),oa(true);};return react.useEffect(()=>{let D=$.current,I=P.current;if(!D||!I)return;let U=I.querySelector(".gantt-taskgrid-content"),ee=()=>{let st=D.scrollTop;ha(st),U&&(U.style.transform=`translateY(-${st}px)`);},ne=st=>{if(va&&I){let Kt=I.parentElement?.getBoundingClientRect()?.left||0,Yt=st.clientX-Kt,pa=200,ur=Math.min(window.innerWidth-300,800);Yt>=pa&&Yt<=ur&&ca(Yt);}},pe=()=>{oa(false);};return D.addEventListener("scroll",ee),document.addEventListener("mousemove",ne),document.addEventListener("mouseup",pe),()=>{D.removeEventListener("scroll",ee),document.removeEventListener("mousemove",ne),document.removeEventListener("mouseup",pe);}},[va]),jsxRuntime.jsx(nr.Provider,{value:j,children:jsxRuntime.jsx(Go.Provider,{value:Tt,children:jsxRuntime.jsxs("div",{ref:ce,className:"flex flex-col h-full w-full",style:{backgroundColor:me.bgPrimary,fontFamily:"Inter, sans-serif",minHeight:0,...a.disableScrollSync&&{scrollBehavior:"auto",overflowAnchor:"none"}},children:[jsxRuntime.jsx(ao,{theme:me,timeScale:Y,onTimeScaleChange:$e,zoom:ve,onZoomChange:ut,currentTheme:M,onThemeChange:X,rowDensity:Oe,onRowDensityChange:Ct,showThemeSelector:p,showCreateTaskButton:y,createTaskLabel:h,onCreateTask:f,onExportPNG:n?Kd:void 0,onExportPDF:n?Yd:void 0,onExportExcel:n?Xd:void 0,onExportCSV:n?qd:void 0,onExportJSON:n?Jd:void 0,onExportMSProject:n?Zd:void 0}),jsxRuntime.jsxs("div",{ref:P,className:"flex-1 flex min-h-0",style:{overflow:"clip",overflowClipMargin:"100px"},children:[jsxRuntime.jsx("div",{className:"gantt-grid-scroll flex-shrink-0",style:{width:rt,overflow:"hidden"},children:jsxRuntime.jsx(oo,{tasks:ja,theme:me,rowHeight:Gr,availableUsers:c,templates:Va,onTaskClick:C,onTaskDblClick:Ls,onTaskContextMenu:b,onTaskToggle:Bd,scrollTop:Mt,columns:ie,onToggleColumn:Ld,onColumnResize:Ad,onTaskUpdate:Ka,onTaskIndent:Rd,onTaskOutdent:Od,onTaskMove:Gd,onMultiTaskDelete:Lo,onTaskDuplicate:zd,onTaskCreate:Ud,onTaskRename:$d,onCreateSubtask:Fs,onOpenTaskModal:C?D=>C(D):void 0,onDeleteRequest:(D,I)=>St({taskId:D,taskName:I})})}),jsxRuntime.jsx("div",{className:"flex-shrink-0 cursor-col-resize",style:{width:6,marginLeft:-3,zIndex:10},onMouseDown:Qd}),jsxRuntime.jsx("div",{ref:$,className:"gantt-timeline-scroll flex-1",style:{minHeight:0,overflowX:"auto",overflowY:"auto",...a.disableScrollSync&&{scrollBehavior:"auto",overflowAnchor:"none"}},children:jsxRuntime.jsx(uo,{tasks:ja,theme:me,rowHeight:Gr,timeScale:Y,startDate:Vd,endDate:jd,zoom:ve,templates:Va,onTaskClick:C,onTaskDblClick:Ls,onTaskContextMenu:Wd,onTaskDateChange:Hd,onDependencyCreate:Bs,onDependencyDelete:Rs})})]}),we.task&&jsxRuntime.jsx(sr,{isOpen:we.isOpen,x:we.x,y:we.y,theme:me,onClose:()=>na({isOpen:false,x:0,y:0,task:null}),items:[{id:"edit",label:j.contextMenu?.editTask||"Edit Task",icon:dt.Pencil,onClick:()=>{we.task&&(S?S(we.task):at(we.task));}},{id:"addSubtask",label:j.contextMenu?.addSubtask||"Add Subtask",icon:dt.Add,onClick:()=>{we.task&&(w?w(we.task):Fs(we.task.id));}},{id:"separator-status",label:"",separator:true,onClick:()=>{}},{id:"markIncomplete",label:j.contextMenu?.markIncomplete||"Mark Incomplete",icon:dt.MarkIncomplete,onClick:()=>{we.task&&(G?G(we.task):Ka(we.task.id,{status:"todo",progress:0}));},disabled:we.task?.status==="todo"},{id:"setInProgress",label:j.contextMenu?.setInProgress||"Set In Progress",icon:dt.SetInProgress,onClick:()=>{we.task&&(H?H(we.task):Ka(we.task.id,{status:"in-progress"}));},disabled:we.task?.status==="in-progress"},{id:"markComplete",label:j.contextMenu?.markComplete||"Mark Complete",icon:dt.MarkComplete,onClick:()=>{we.task&&Ka(we.task.id,{status:"completed",progress:100});},disabled:we.task?.status==="completed"},{id:"separator-advanced",label:"",separator:true,onClick:()=>{}},{id:"split",label:j.contextMenu?.splitTask||"Split Task",icon:dt.Split,onClick:()=>{if(!we.task?.startDate||!we.task?.endDate){console.warn("Cannot split task without dates");return}let D=we.task.startDate.getTime(),I=we.task.endDate.getTime(),U=D+(I-D)/2,ee=new Date(U);_d(we.task,ee);},disabled:!we.task?.startDate||!we.task?.endDate},{id:"separator-delete",label:"",separator:true,onClick:()=>{}},{id:"delete",label:j.contextMenu?.deleteTask||"Delete Task",icon:dt.Delete,onClick:()=>{we.task&&St({taskId:we.task.id,taskName:we.task.name});}}]}),gt&&jsxRuntime.jsx(go,{isOpen:true,onClose:()=>at(null),task:gt,onSubmit:D=>{Ka(gt.id,D),at(null);},mode:"edit",theme:M}),jsxRuntime.jsx(framerMotion.AnimatePresence,{children:jt&&jsxRuntime.jsx(framerMotion.motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"fixed inset-0 z-[10000] flex items-center justify-center p-4",style:{backgroundColor:"rgba(0, 0, 0, 0.6)"},onClick:()=>St(null),children:jsxRuntime.jsxs(framerMotion.motion.div,{initial:{opacity:0,scale:.9},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.9},transition:{duration:.2,ease:"easeOut"},onClick:D=>D.stopPropagation(),className:"w-full max-w-md rounded-xl shadow-2xl overflow-hidden",style:{backgroundColor:me.bgSecondary,border:`1px solid ${me.border}`},children:[jsxRuntime.jsx("div",{className:"px-6 py-4",style:{borderBottom:`1px solid ${me.border}`},children:jsxRuntime.jsxs("div",{className:"flex items-start gap-3",children:[jsxRuntime.jsx("div",{className:"w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0",style:{backgroundColor:"rgba(239, 68, 68, 0.2)"},children:jsxRuntime.jsx(lucideReact.AlertTriangle,{className:"w-5 h-5",style:{color:"#EF4444"}})}),jsxRuntime.jsxs("div",{className:"flex-1",children:[jsxRuntime.jsxs("h3",{className:"text-lg font-semibold",style:{color:me.textPrimary,fontFamily:"Inter, sans-serif"},children:[j.contextMenu?.deleteTask||"Delete Task","?"]}),jsxRuntime.jsx("p",{className:"text-sm mt-1",style:{color:me.textSecondary,fontFamily:"Inter, sans-serif"},children:v==="es"?"Esta acci\xF3n no se puede deshacer":"This action cannot be undone"})]})]})}),jsxRuntime.jsx("div",{className:"px-6 py-4",children:jsxRuntime.jsxs("p",{className:"text-sm leading-relaxed",style:{color:me.textSecondary,fontFamily:"Inter, sans-serif"},children:[v==="es"?"Est\xE1s a punto de eliminar la tarea":"You are about to delete the task"," ",jsxRuntime.jsxs("span",{className:"font-semibold",style:{color:me.textPrimary},children:['"',jt.taskName,'"']}),"."]})}),jsxRuntime.jsxs("div",{className:"px-6 py-4 flex items-center justify-end gap-3",style:{backgroundColor:me.bgPrimary,borderTop:`1px solid ${me.border}`},children:[jsxRuntime.jsx("button",{onClick:()=>St(null),className:"px-4 py-2 text-sm font-medium rounded-lg transition-colors",style:{color:me.textSecondary,fontFamily:"Inter, sans-serif"},onMouseEnter:D=>{D.currentTarget.style.backgroundColor=me.hoverBg;},onMouseLeave:D=>{D.currentTarget.style.backgroundColor="transparent";},children:v==="es"?"Cancelar":"Cancel"}),jsxRuntime.jsxs("button",{onClick:()=>{Lo([jt.taskId]),St(null);},className:"px-4 py-2 text-sm font-medium text-white rounded-lg transition-colors flex items-center gap-2",style:{backgroundColor:"#EF4444",fontFamily:"Inter, sans-serif"},onMouseEnter:D=>{D.currentTarget.style.backgroundColor="#DC2626";},onMouseLeave:D=>{D.currentTarget.style.backgroundColor="#EF4444";},children:[jsxRuntime.jsx(lucideReact.Trash2,{className:"w-4 h-4"}),v==="es"?"Eliminar":"Delete"]})]})]})})}),g?.enabled&&jsxRuntime.jsx(fo,{tasks:L,theme:me,config:g,onTasksUpdate:q,onTaskUpdate:Ka,onTaskCreate:D=>{q(I=>[...I,D]);},onTaskDelete:D=>{Lo([D]);},onDependencyCreate:(D,I)=>{let U=K.findTaskById(L,D);U&&Bs(U,I);},onDependencyDelete:Rs})]})})})});var wl=`You are a Gantt chart AI assistant. You help users edit project tasks using natural language commands.
|
|
279
279
|
|