react-pert 1.0.0-beta.1 → 1.0.1
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/README.md +241 -61
- package/dist/index.d.ts +160 -18
- package/dist/index.js +582 -132
- package/dist/index.umd.cjs +11 -1
- package/dist/main.css +1 -0
- package/package.json +4 -1
package/dist/index.umd.cjs
CHANGED
|
@@ -1 +1,11 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(f,n){typeof exports=="object"&&typeof module<"u"?n(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],n):(f=typeof globalThis<"u"?globalThis:f||self,n(f["react-pert"]={},f["react/jsx-runtime"],f.React))})(this,function(f,n,c){"use strict";var ct=Object.defineProperty;var ht=(f,n,c)=>n in f?ct(f,n,{enumerable:!0,configurable:!0,writable:!0,value:c}):f[n]=c;var m=(f,n,c)=>ht(f,typeof n!="symbol"?n+"":n,c);var O=document.createElement("style");O.textContent=`._arrows_62ntr_1 ._arrow_62ntr_1{fill:transparent;stroke:var(--arrow-stroke-color);stroke-width:var(--arrow-stroke-width);transition:stroke .2s,stroke-width .2s,opacity .2s}._arrows_62ntr_1 ._arrow_62ntr_1._critical_62ntr_8{stroke:var(--arrow-critical-stroke-color)}._arrows_62ntr_1._onHover_62ntr_13 ._arrow_62ntr_1{opacity:.3}._arrows_62ntr_1._onSelect_62ntr_17 ._arrow_62ntr_1{opacity:0}._arrows_62ntr_1._onSelect_62ntr_17 ._arrow_62ntr_1._hover_62ntr_24,._arrows_62ntr_1._onSelect_62ntr_17 ._arrow_62ntr_1._visible_62ntr_25,._arrows_62ntr_1._onHover_62ntr_13 ._arrow_62ntr_1._hover_62ntr_24,._arrows_62ntr_1._onHover_62ntr_13 ._arrow_62ntr_1._visible_62ntr_25{stroke-width:calc(var(--arrow-stroke-width) + 1);opacity:1}._tasks_1slwh_1 ._task_1slwh_1{-webkit-user-select:none;user-select:none;transition:filter .2s,opacity .2s}._tasks_1slwh_1 ._task_1slwh_1 text{fill:var(--task-text-color);font-family:var(--task-font-family)}._tasks_1slwh_1 ._task_1slwh_1 rect{transition:stroke-width .2s;stroke:var(--task-stroke-color);stroke-width:var(--task-stroke-width);fill:var(--task-bg)}._tasks_1slwh_1 ._task_1slwh_1 rect~path{stroke:var(--task-stroke-color)}._tasks_1slwh_1 ._task_1slwh_1._critical_1slwh_22 rect{fill:var(--task-bg-critical)}._tasks_1slwh_1 ._task_1slwh_1:hover{cursor:pointer;filter:brightness(.9)}._tasks_1slwh_1 ._task_1slwh_1:hover rect{stroke-width:var(--task-stroke-hover-width)}._tasks_1slwh_1 ._task_1slwh_1._selected_1slwh_35 rect{stroke:var(--task-selected-stroke-color);stroke-width:var(--task-selected-stroke-width)}._tasks_1slwh_1:has(._task_1slwh_1._selected_1slwh_35) ._task_1slwh_1:not(._selected_1slwh_35):not(._visible_1slwh_44){opacity:.7;filter:brightness(.6)}._tasks_1slwh_1:has(._task_1slwh_1._selected_1slwh_35) ._task_1slwh_1:not(._selected_1slwh_35):not(._visible_1slwh_44):hover{cursor:pointer;filter:brightness(.9);opacity:1}._tasks_1slwh_1:has(._task_1slwh_1._selected_1slwh_35) ._task_1slwh_1:not(._selected_1slwh_35):not(._visible_1slwh_44):hover rect{stroke:var(--task-stroke-color);stroke-linejoin:bevel}
|
|
2
|
+
`,document.head.appendChild(O);const L=()=>Math.random().toString(36).substring(7);let B=class{constructor(t){m(this,"levels");m(this,"tasksMap");m(this,"initialData");m(this,"links");m(this,"criticalPaths");m(this,"lastTaskKey");m(this,"startTaskKey");m(this,"projectDuration");this.initialData=t,this.tasksMap=new Map,this.lastTaskKey=`Finish-${L()}`,this.startTaskKey=`Start-${L()}`,this.links=[],this.criticalPaths=[],this.levels=new Map,this.projectDuration=0}convertDataToMap(){this.tasksMap=new Map,this.tasksMap.set(this.startTaskKey,{key:this.startTaskKey,duration:0,text:"Start"}),this.initialData.forEach((t,s)=>{if(this.tasksMap.has(t.key))throw Error(`Duplicate keys found ${t.key}`);this.tasksMap.set(t.key,!t.dependsOn||t.dependsOn.length===0?{...t,dependsOn:[this.startTaskKey],index:s}:{...t,index:s})})}calculatePERT(){this.convertDataToMap(),this.calcLevels(),this.levels.forEach(s=>{s.forEach(e=>{this.calculateEarlyTimes(e)})});let t=Array.from(this.tasksMap.values()).reduce((s,e)=>s.earlyFinish>e.earlyFinish?s:e);t.lateFinish=t.earlyFinish,t.critical=!0,this.tasksMap.set(this.lastTaskKey,{key:this.lastTaskKey,text:"Finish",dependsOn:[t.key],duration:0,earlyStart:t.earlyFinish,earlyFinish:t.earlyFinish,lateFinish:t.earlyFinish,lateStart:t.earlyFinish,level:this.levels.size,critical:!0,freeFloat:0,totalFloat:0,index:this.tasksMap.size-1}),this.levels.set(this.levels.size,[this.lastTaskKey]),this.projectDuration=t.lateFinish;for(const[,s]of[...this.levels.entries()].reverse())s.forEach(e=>{this.calculateLateTimes(e,t.lateFinish)});this.levels.forEach((s,e)=>{this.levels.set(e,s.sort((l,a)=>this.tasksMap.get(l).index-this.tasksMap.get(a).index))})}getSuccessors(t){return Array.from(this.tasksMap.values()).filter(s=>s.dependsOn&&s.dependsOn.includes(t.key))}calculateEarlyTimes(t){const s=this.tasksMap.get(t);if(!s.dependsOn)s.earlyStart=0;else{let e=0;s.dependsOn.forEach(l=>{const a=this.tasksMap.get(l);e=Math.max(e,a.earlyStart+a.duration)}),s.earlyStart=e}s.earlyFinish=s.earlyStart+s.duration}calculateLateTimes(t,s){var h;const e=this.tasksMap.get(t),l=this.getSuccessors(e);l.length===0&&((h=this.tasksMap.get(this.lastTaskKey).dependsOn)==null||h.push(t));let a=l.length===0?s:Math.min(...l.map(o=>o.lateFinish-o.duration));e.lateFinish=a,e.lateStart=e.lateFinish-e.duration,e.critical=e.earlyFinish===e.lateFinish,e.critical?(e.freeFloat=0,e.totalFloat=0):(e.freeFloat=(l.length===0?s:Math.min(...l.map(o=>o.earlyStart)))-e.earlyFinish,e.totalFloat=e.lateFinish-e.earlyFinish)}calcLevels(){this.levels.clear();let t=[];const s=e=>{if(t.includes(e.key))throw new Error("Circular dependency detected");if(!e.dependsOn||e.dependsOn.length===0)e.level=0;else{let a=0;e.dependsOn.forEach(h=>{const o=this.tasksMap.get(h);if(!o)throw new Error(`Task with KEY '${h}' was not found.`);o.level===void 0&&(t.push(e.key),s(o)),a=Math.max(a,o.level+1)}),e.level=a}this.levels.has(e.level)||this.levels.set(e.level,[]);const l=this.levels.get(e.level);l.includes(e.key)||l.push(e.key)};this.tasksMap.forEach(e=>{e.level===void 0&&(t=[],s(e))})}calcNodeLinks(){const t=[],s=[];this.tasksMap.forEach((e,l)=>{e.dependsOn?e.dependsOn.forEach(a=>{s.push(a),t.push({from:a,to:e.key,critical:e.critical&&this.tasksMap.get(a).critical})}):l!==this.startTaskKey&&t.push({from:this.startTaskKey,to:e.key,critical:e.critical})}),this.tasksMap.forEach(e=>{!s.includes(e.key)&&e.key!==this.lastTaskKey&&t.push({from:e.key,to:this.lastTaskKey,critical:e.critical})}),this.links=t}calcCriticalPaths(){this.calcNodeLinks();const t=[];this.links.filter(e=>e.critical&&e.from===this.startTaskKey&&e.to!==this.lastTaskKey).forEach(e=>{const l=[e],a=h=>{const o=this.links.filter(i=>i.critical&&i.from===h.to&&i.to!==this.lastTaskKey);o.length===0?t.push(l.map(i=>({text:this.tasksMap.get(i.to).text,key:i.to}))):o.forEach(i=>{l.push(i),a(i),l.pop()})};a(e)}),this.criticalPaths=t}getTasks(){return this.calculatePERT(),this.tasksMap}getCriticalPaths(){return this.criticalPaths.length===0&&this.calcCriticalPaths(),this.criticalPaths}getLevels(){return this.levels}getNodeLinks(){return this.links}getProjectDuration(){return this.projectDuration}solve(){return{tasks:this.getTasks(),levels:this.getLevels(),criticalPaths:this.getCriticalPaths(),links:this.getNodeLinks(),projectDuration:this.getProjectDuration()}}};const A={tasks:new Map,levels:new Map,links:[],criticalPaths:[],projectDuration:0},D=c.createContext(null),H=c.createContext(null),K=r=>({children:t})=>{const[s,e]=c.useState(A),[l,a]=c.useState(null),h=c.useCallback(o=>{try{const i=new B(o).solve();e(i),a(null)}catch(i){console.error(i),e(A),a(i.message)}},[]);return n.jsx(r.Provider,{value:{pertData:s,calculatePertResults:h,error:l},children:t})},U=K(D),Y=K(H),X=(r={bounds:!0})=>{const t=c.useContext(D);if(!t)throw new Error("usePertData must be used within a PertProvider");const s=Array.from(t.pertData.tasks.values()),e=r!=null&&r.bounds?s.slice(1,-1).map(l=>{var a;return{...l,dependsOn:(a=l.dependsOn)!=null&&a.includes(s[0].key)?[]:l.dependsOn}}):s;return{...t.pertData,tasks:e,error:t.error,projectDuration:t.pertData.projectDuration}},N=()=>{const r=c.useContext(D);if(!r){const t=c.useContext(H);if(!t)throw new Error("usePertData must be used within a PertProvider or InternalPertProvider");return t}return r},$={arrows:"_arrows_62ntr_1",arrow:"_arrow_62ntr_1",critical:"_critical_62ntr_8",onHover:"_onHover_62ntr_13",onSelect:"_onSelect_62ntr_17",hover:"_hover_62ntr_24",visible:"_visible_62ntr_25"},V=({arrows:r,taskSize:t,levels:s,size:e,gap:l,tasks:a,selectedTask:h,hoveredTask:o,arrowStyles:i})=>{const _=(k,u)=>h===k||h===u||o===k||o===u,w=(k,u=!1)=>{const d=a.get(k),v=d.level,y=s.get(v).findIndex(C=>C===k),g=s.get(v).length,T=g*t+(g-1)*l.y,x=(e.height-T)/2+t/2,M=v*(t+l.x)+(u?t*(3/2):t/2),E=y*(t+l.y)+x;return{x:M,y:E,level:v,task:d}},p=`${$.arrows} ${h?$.onSelect:""} ${o?$.onHover:""}`;return n.jsx("g",{className:p,children:r.map((k,u)=>{const{x:d,y:v,level:y,task:g}=w(k.from,!0),{x:T,y:x,level:M,task:E}=w(k.to),C=`${$.arrow} ${_(g.key,E.key)?$.visible:""} ${k.critical?$.critical:""}`;return n.jsx("path",{className:C,d:`M ${d} ${v} C ${d+20*(M-y)+(T-d)/1.2} ${v} ${d+20*(M-y)+(T-d)/4} ${x} ${T} ${x}`,style:i},u)})})},b={tasks:"_tasks_1slwh_1",task:"_task_1slwh_1",critical:"_critical_1slwh_22",selected:"_selected_1slwh_35",visible:"_visible_1slwh_44"},q=({task:r,x:t,y:s,dimensions:e})=>{const{halfRadius:l,twoThirdsRadius:a}=e;return n.jsxs(n.Fragment,{children:[n.jsx("text",{x:t-l,y:s-a,fill:"black",children:r.earlyStart}),n.jsx("text",{x:t+l,y:s-a,fill:"black",children:r.earlyFinish}),n.jsx("text",{x:t-l,y:s+a,fill:"black",children:r.lateStart}),n.jsx("text",{x:t+l,y:s+a,fill:"black",children:r.lateFinish})]})},J=({task:r,x:t,y:s,dimensions:e,onHover:l,onTaskClick:a,isVisible:h,isSelected:o,taskStyles:i})=>{const{radius:_}=e,w=c.useMemo(()=>`
|
|
3
|
+
M ${t-_} ${s-_/3}
|
|
4
|
+
L ${t+_} ${s-_/3}
|
|
5
|
+
M ${t-_} ${s+_/3}
|
|
6
|
+
L ${t+_} ${s+_/3}
|
|
7
|
+
M ${t} ${s+_/3}
|
|
8
|
+
L ${t} ${s+_}
|
|
9
|
+
M ${t} ${s-_}
|
|
10
|
+
L ${t} ${s-_/3}
|
|
11
|
+
`,[t,s,_]);return n.jsxs("g",{className:`${b.task} ${o?b.selected:""} ${h?b.visible:""} ${r.critical?b.critical:""}`,onMouseEnter:()=>l(r.key,!0),onMouseLeave:()=>l(r.key,!1),onClick:()=>a(r.key),style:i,children:[n.jsx("rect",{x:t-_,y:s-_,rx:"20",ry:"20",width:_*2,height:_*2}),n.jsx("text",{x:t,y:s,children:r.text}),n.jsx(q,{task:r,x:t,y:s,dimensions:e}),n.jsx("path",{d:w,fill:"none"})]})},W=c.memo(J),Z=({level:r,keyList:t,tasks:s,taskSize:e,gap:l,offset:a,dimensions:h,selectedTask:o,onHover:i,onTaskClick:_,taskStyles:w})=>n.jsx("g",{children:t.map((p,k)=>{var T,x,M;const u=s.get(p);if(!u)return null;const d=r*e+e+l.x*r,v=k*(e+l.y)+a,y=!!(o&&((T=u.dependsOn)!=null&&T.includes(o)||(M=(x=s.get(o))==null?void 0:x.dependsOn)!=null&&M.includes(u.key))),g=u.key===o;return n.jsx(W,{task:u,x:d,y:v,dimensions:h,onHover:i,onTaskClick:_,isSelected:g,isVisible:y,taskStyles:w},u.key)})}),G=c.memo(Z),Q=({tasks:r,levels:t,taskSize:s,size:e,gap:l,selectedTask:a,setHoveredTask:h,taskStyles:o})=>{const i=c.useMemo(()=>({radius:s/2,halfRadius:s/4,twoThirdsRadius:s/6*2}),[s]),_=c.useCallback((k,u)=>{h(u?k:null)},[h]),w=c.useCallback(k=>{I(a!==k?k:null)},[a]),p=c.useMemo(()=>Array.from(t.entries()).map(([k,u])=>{const d=u.length*s+(u.length-1)*l.y,v=(e.height-d)/2+i.radius;return n.jsx(G,{level:k,keyList:u,tasks:r,taskSize:s,gap:l,offset:v,dimensions:i,selectedTask:a,onHover:_,onTaskClick:w,taskStyles:o},k)}),[t,r,s,l,e.height,i,a,_,w,o]);return n.jsx("g",{className:b.tasks,children:p})},R=c.memo(Q),z={width:300,height:200},tt={display:"block",boxSizing:"border-box",transition:"width 0.3s ease, height 0.3s ease"},P={CRITICAL:"#ff9147",TASK_BG:"#aaaeff",CHART_BG:"#fff",GRID:"#00000030",TEXT:"#000",SELECTED:"#6868ff",STROKE:"#615f77"},F={BORDER:1,HOVER_BORDER:2,SELECTED_BORDER:3};function et({size:r,taskSize:t,strokeColor:s}){const e=Math.ceil(r.height/t)+1,l=Math.ceil(r.width/t)+1,a=(h,o,i)=>Array.from({length:h},(_,w)=>{const p=w*t;return n.jsx("line",{x1:o?p:0,y1:o?0:p,x2:o?p:i,y2:o?i:p,style:{stroke:s??P.GRID}},w)});return n.jsxs("g",{children:[n.jsx("g",{children:a(e,!1,r.width)}),n.jsx("g",{children:a(l,!0,r.height)})]})}const st=({size:r,pertData:t,selectedTask:s,setHoveredTask:e,hoveredTask:l,styles:{fontSize:a,taskSize:h,gap:o,disableGrid:i,taskBackground:_,selectedBorderColor:w,borderColor:p,criticalColor:k,arrowColor:u,arrowWidth:d,chartBackground:v,textColor:y,fontFamily:g,borderWidth:T,hoverBorderWidth:x,selectedBorderWidth:M,gridColor:E}})=>{const C={"--task-bg":_??P.TASK_BG,"--task-bg-critical":k??P.CRITICAL,"--task-stroke-color":p??P.STROKE,"--task-stroke-width":T??F.BORDER,"--task-stroke-hover-width":x??F.HOVER_BORDER,"--task-selected-stroke-width":M??F.SELECTED_BORDER,"--task-selected-stroke-color":w??P.SELECTED,"--task-text-color":y??P.TEXT,"--task-font-family":g??"inherit"},ot={"--arrow-stroke-color":u??P.STROKE,"--arrow-critical-stroke-color":k??P.CRITICAL,"--arrow-stroke-width":d??2},it={...tt,fontSize:a,backgroundColor:v};return n.jsx("svg",{width:r.width,height:r.height,viewBox:`0 0 ${r.width} ${r.height}`,xmlns:"http://www.w3.org/2000/svg",style:it,dominantBaseline:"central",textAnchor:"middle",children:n.jsxs("g",{className:"content",children:[!i&&n.jsx(et,{size:r,taskSize:h,strokeColor:E}),n.jsx(V,{gap:o,arrows:t.links,taskSize:h,size:r,levels:t.levels,tasks:t.tasks,selectedTask:s,hoveredTask:l,arrowStyles:ot}),n.jsx(R,{gap:o,size:r,taskSize:h,tasks:t.tasks,levels:t.levels,selectedTask:s,setHoveredTask:e,taskStyles:C})]})})};function rt({error:r}){return n.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",fontSize:"1.5rem",padding:"3rem"},children:r})}const lt=({taskSize:r,gap:t})=>{const{pertData:s}=N();return c.useMemo(()=>{const e=Array.from(s.levels.values());if(!e.length)return{width:0,height:0};const l=Math.max(...e.map(a=>a.length));return{width:(e.length+1)*r+(e.length-1)*t.x,height:(l+1)*r+(l-1)*t.y}},[s.levels,r,t])},j={sm:"0.75rem",md:"1rem",lg:"1.25rem",xl:"1.5rem","2xl":"1.75rem","3xl":"2rem",default:"1rem",min:"0.75rem",max:"2rem"};let S=null;const I=r=>{if(S){if(!r)S.setter(null);else if(S.getTask){const t=S.getTask(r);t&&S.onSelect&&S.onSelect(t),S.setter(r)}}},at=({tasks:r,onSelect:t,styles:s})=>{const{pertData:e,calculatePertResults:l,error:a}=N(),h=c.useRef(),[o,i]=c.useState(null),[_,w]=c.useState(null),p=E=>e.tasks.get(E);S={setter:c.useRef(i).current,getTask:p,onSelect:t},c.useEffect(()=>{const E=JSON.stringify(r);h.current!==E&&(l(r),h.current=E)},[r,l]);const u=c.useCallback(E=>{w(E)},[]),{gap:d,taskSize:v,fontSize:y}=s,g=Math.max(v??100,70),T=c.useMemo(()=>({x:Math.max(g,(d==null?void 0:d.x)??0),y:Math.max(g,(d==null?void 0:d.y)??0)}),[d==null?void 0:d.x,d==null?void 0:d.y,g]),x=lt({taskSize:g,gap:T}),M=c.useMemo(()=>y?typeof y=="number"?`${y}px`:j[y]||y:j.default,[y]);return a?n.jsx(rt,{error:a}):n.jsx(st,{size:a?z:x,pertData:e,selectedTask:o,hoveredTask:_,setHoveredTask:u,styles:{...s,fontSize:M,taskSize:g,gap:T}})},nt=({styles:r,...t})=>n.jsx(Y,{children:n.jsx("div",{style:{width:"fit-content",height:"fit-content",boxSizing:"border-box"},children:n.jsx(at,{...t,styles:r??{}})})});f.Pert=nt,f.PertProvider=U,f.setSelectedTask=I,f.usePert=X,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
|
package/dist/main.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._arrows_62ntr_1 ._arrow_62ntr_1{fill:transparent;stroke:var(--arrow-stroke-color);stroke-width:var(--arrow-stroke-width);transition:stroke .2s,stroke-width .2s,opacity .2s}._arrows_62ntr_1 ._arrow_62ntr_1._critical_62ntr_8{stroke:var(--arrow-critical-stroke-color)}._arrows_62ntr_1._onHover_62ntr_13 ._arrow_62ntr_1{opacity:.3}._arrows_62ntr_1._onSelect_62ntr_17 ._arrow_62ntr_1{opacity:0}._arrows_62ntr_1._onSelect_62ntr_17 ._arrow_62ntr_1._hover_62ntr_24,._arrows_62ntr_1._onSelect_62ntr_17 ._arrow_62ntr_1._visible_62ntr_25,._arrows_62ntr_1._onHover_62ntr_13 ._arrow_62ntr_1._hover_62ntr_24,._arrows_62ntr_1._onHover_62ntr_13 ._arrow_62ntr_1._visible_62ntr_25{stroke-width:calc(var(--arrow-stroke-width) + 1);opacity:1}._tasks_1slwh_1 ._task_1slwh_1{-webkit-user-select:none;user-select:none;transition:filter .2s,opacity .2s}._tasks_1slwh_1 ._task_1slwh_1 text{fill:var(--task-text-color);font-family:var(--task-font-family)}._tasks_1slwh_1 ._task_1slwh_1 rect{transition:stroke-width .2s;stroke:var(--task-stroke-color);stroke-width:var(--task-stroke-width);fill:var(--task-bg)}._tasks_1slwh_1 ._task_1slwh_1 rect~path{stroke:var(--task-stroke-color)}._tasks_1slwh_1 ._task_1slwh_1._critical_1slwh_22 rect{fill:var(--task-bg-critical)}._tasks_1slwh_1 ._task_1slwh_1:hover{cursor:pointer;filter:brightness(.9)}._tasks_1slwh_1 ._task_1slwh_1:hover rect{stroke-width:var(--task-stroke-hover-width)}._tasks_1slwh_1 ._task_1slwh_1._selected_1slwh_35 rect{stroke:var(--task-selected-stroke-color);stroke-width:var(--task-selected-stroke-width)}._tasks_1slwh_1:has(._task_1slwh_1._selected_1slwh_35) ._task_1slwh_1:not(._selected_1slwh_35):not(._visible_1slwh_44){opacity:.7;filter:brightness(.6)}._tasks_1slwh_1:has(._task_1slwh_1._selected_1slwh_35) ._task_1slwh_1:not(._selected_1slwh_35):not(._visible_1slwh_44):hover{cursor:pointer;filter:brightness(.9);opacity:1}._tasks_1slwh_1:has(._task_1slwh_1._selected_1slwh_35) ._task_1slwh_1:not(._selected_1slwh_35):not(._visible_1slwh_44):hover rect{stroke:var(--task-stroke-color);stroke-linejoin:bevel}
|
package/package.json
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-pert",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"type": "module",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"description": "Interactive PERT chart component for React",
|
|
5
7
|
"files": [
|
|
6
8
|
"dist",
|
|
7
9
|
"README.md",
|
|
@@ -56,6 +58,7 @@
|
|
|
56
58
|
"typescript-eslint": "^8.7.0",
|
|
57
59
|
"vite": "^5.4.8",
|
|
58
60
|
"vite-plugin-dts": "^4.2.4",
|
|
61
|
+
"vite-plugin-lib-inject-css": "^2.2.1",
|
|
59
62
|
"vite-tsconfig-paths": "^5.0.1"
|
|
60
63
|
},
|
|
61
64
|
"keywords": [
|