diff --git a/docs/_astro/ReactKanban.CcQCcZ2Z.js b/docs/_astro/ReactKanban.CcQCcZ2Z.js
deleted file mode 100644
index 56d63a694a..0000000000
--- a/docs/_astro/ReactKanban.CcQCcZ2Z.js
+++ /dev/null
@@ -1 +0,0 @@
-import{j as s,r as m}from"./react.XJQ4OnvF.js";import{u as T,a as v,D as K,r as B,b as A,c as G,C as V,d as N,T as q,P as J}from"./@dnd-kit.CZoI31gw.js";import{c as j}from"./clsx.B-dksMZM.js";import{t as f}from"./tailwind-merge.B9ugUrge.js";import{a as $,e as g}from"./npchandler.Cs5KoD5X.js";import{a as F}from"./@nanostores.kqnvP3SD.js";import{E as z}from"./ExpandIcon.Bpk_t6hV.js";import"./@react-three.DzcfnNYH.js";import"./react-dom.3umP1jIU.js";import"./scheduler.CzFDRTuY.js";import"./@supabase.BrxtDNAR.js";import"./Tabs.astro_astro_type_script_index_0_lang.BYjWCQXm.js";import"./dexie.FI_cDWIf.js";import"./nanostores.Bo9-_MAV.js";import"./axios.dxcvQi4N.js";class H extends ${itemPositionsStore;constructor(){super(),this.itemPositionsStore=F("kanBanItemPositions",{},{encode:JSON.stringify,decode:JSON.parse})}saveItemPositions(t){this.itemPositionsStore.set(t),console.log("Item positions saved to KanbanBase:",t)}loadItemPositions(){const t=this.itemPositionsStore.get();return console.log("Item positions loaded from KanbanBase:",t),t||{}}resetItemPositions(t){const n=Object.keys(t).reduce((i,u)=>(i[u]=[],i),{});this.itemPositionsStore.set(n),console.log("Item positions reset to:",n)}}const b=new H,P=f("p-5 border-gray-200 dark:text-neutral-200 rounded-md","w-full md:w-1/4","flex flex-col items-center"),L=f("flex flex-wrap flex-grow bg-gray-500 p-5 rounded-md","w-full md:w-3/4"),Q=({title:a,message:t,isVisible:n,onClose:i})=>n?s.jsx("div",{className:"fixed inset-0 flex items-center justify-center bg-black bg-opacity-50",children:s.jsxs("div",{className:"bg-white p-5 rounded shadow-lg w-96",children:[s.jsx("h2",{className:"text-xl font-bold mb-4",children:a}),s.jsxs("p",{className:"mb-4",children:["This is the content of the modal for item ",a,".",t]}),s.jsx("button",{className:"bg-cyan-500 text-gray-500 py-2 px-4 rounded hover:bg-cyan-600",onClick:i,children:"Close"})]})}):null,w=({id:a,onExpandClick:t})=>{const{attributes:n,listeners:i,setNodeRef:u,transform:h,isDragging:x}=G({id:a}),I={transform:V.Translate.toString(h)};return s.jsxs("div",{ref:u,className:f("p-3 border border-cyan-500 rounded-md m-2 cursor-grab bg-cyan-300 dark:text-neutral-600 flex items-center justify-between",j({"opacity-50":x})),style:I,...i,...n,children:[a,s.jsx("button",{onClick:t,className:"ml-2 p-2 rounded-full bg-gray-200 hover:bg-gray-300",children:s.jsx(z,{className:"w-4 h-4 text-gray-800 dark:text-gray-200"})})]})},U=({id:a,children:t})=>{const{setNodeRef:n,isOver:i}=N({id:a});return s.jsxs("div",{ref:n,className:f("p-5 border-dashed border-2 border-gray-300 rounded-md m-3 min-h-[150px]","w-full sm:w-[45%] md:w-[30%]",j({"bg-cyan-100":i,"bg-white":!i})),children:[s.jsx("h3",{className:f("font-bold mb-3"),children:a}),t]})},W=({id:a,children:t})=>{const{setNodeRef:n,isOver:i}=N({id:a});return s.jsxs("div",{ref:n,className:f(P,"border-2 border-dashed border-gray-400",j({"bg-cyan-500":i})),children:[s.jsx("h3",{className:f("font-bold text-xl mb-4"),children:"Kanban"}),t]})},X=({items:a,onItemExpandClick:t})=>s.jsxs("div",{className:P,children:[s.jsx("h3",{className:f("font-bold text-xl mb-4"),children:"Available Items"}),a.map(n=>s.jsx(w,{id:n,onExpandClick:()=>t(n)},n))]}),Y=({containers:a})=>{const[t,n]=m.useState({}),[i,u]=m.useState(["Item 1","Item 2","Item 3","Function","IGBC"]),[h,x]=m.useState(null),[I,S]=m.useState(!1),[D,E]=m.useState(""),[O,Z]=m.useState(""),C=()=>{const o={TODO:[],"IN-PROGRESS":[],DONE:[]},e=b.loadItemPositions(),p=Object.values(e).flatMap(r=>r.map(d=>d.id));u(r=>[...new Set([...r,...p])]),b.resetItemPositions(o),n(o),console.log("Kanban reset completed.")},M=T(v(J,{activationConstraint:{distance:5}}),v(q,{activationConstraint:{delay:100,tolerance:5}}));m.useEffect(()=>{(async()=>{try{const e=await b.loadProfile();console.log(`Data: ${e}`)}catch(e){console.error("Error loading profile or item positions:",e)}})()},[]),m.useEffect(()=>{const o=b.loadItemPositions();n(o);const e=new Set(Object.values(o).flatMap(p=>p.map(r=>r.id)));u(p=>p.filter(r=>!e.has(r)))},[]);const y=o=>{g.emit("openModal",{message:`Modal for ${o}`})};m.useEffect(()=>{const o=e=>{e&&E(e.message),S(!0)};return g.on("openModal",o),()=>{g.off("openModal",o)}},[]),m.useEffect(()=>{const o=e=>{if(e)switch(e.npcId){case"Reset":C()}};return g.on("npcInteraction",o),()=>{g.off("npcInteraction",o)}},[]);const k=async o=>{const{active:e,over:p}=o;if(!p){x(null);return}const r=Object.keys(t).find(l=>t[l]?.some(c=>c.id===e.id)),d=p.id;if(d==="sidebar")i.includes(e.id)||u(l=>[...l,e.id]),r&&n(l=>{const c={...l,[r]:l[r].filter(R=>R.id!==e.id)};return b.saveItemPositions(c),c});else if(!r)u(l=>l.filter(c=>c!==e.id)),n(l=>{const c={...l,[d]:[...l[d]||[],{id:e.id,container:d}]};return b.saveItemPositions(c),c});else if(r!==d){const l={...t,[r]:t[r].filter(c=>c.id!==e.id),[d]:[...t[d]||[],{id:e.id,container:d}]};n(l),b.saveItemPositions(l)}x(null)};return s.jsxs(K,{sensors:M,collisionDetection:B,onDragStart:o=>x(o.active.id),onDragEnd:k,children:[s.jsxs("div",{className:f("flex flex-col md:flex-row"),children:[s.jsx(W,{id:"sidebar",children:s.jsx(X,{items:i,onItemExpandClick:y})}),s.jsx("div",{className:L,children:a.map(o=>s.jsx(U,{id:o,children:t[o]?.map(e=>s.jsx(w,{id:e.id,onExpandClick:()=>y(e.id)},e.id))},o))})]}),s.jsx(A,{children:h?s.jsx("div",{children:h}):null}),s.jsx(Q,{title:D,message:O,isVisible:I,onClose:()=>S(!1)})]})},pe=()=>s.jsx(Y,{containers:["TODO","IN-PROGRESS","DONE"]});export{pe as default};
diff --git a/docs/_astro/ReactKanban.lXYf4dnT.js b/docs/_astro/ReactKanban.lXYf4dnT.js
new file mode 100644
index 0000000000..2e826e5a3f
--- /dev/null
+++ b/docs/_astro/ReactKanban.lXYf4dnT.js
@@ -0,0 +1 @@
+import{r as d,j as s}from"./react.XJQ4OnvF.js";import{u as A,a as B,D as K,r as G,b as _,c as F,C as J,d as C,T as $,P as V}from"./@dnd-kit.CZoI31gw.js";import{c as E}from"./clsx.B-dksMZM.js";import{t as g}from"./tailwind-merge.B9ugUrge.js";import{a as L,e as D}from"./npchandler.Cs5KoD5X.js";import{a as k}from"./@nanostores.kqnvP3SD.js";import{E as q}from"./ExpandIcon.Bpk_t6hV.js";import"./@react-three.DzcfnNYH.js";import"./react-dom.3umP1jIU.js";import"./scheduler.CzFDRTuY.js";import"./@supabase.BrxtDNAR.js";import"./Tabs.astro_astro_type_script_index_0_lang.BYjWCQXm.js";import"./dexie.FI_cDWIf.js";import"./nanostores.Bo9-_MAV.js";import"./axios.dxcvQi4N.js";class U extends L{itemPositionsStore;boardIdStore;constructor(){super(),this.itemPositionsStore=k("kanBanItemPositions",{},{encode:JSON.stringify,decode:JSON.parse}),this.boardIdStore=k("kanBanBoardId",null,{encode:JSON.stringify,decode:JSON.parse})}saveItemPositions(e){this.itemPositionsStore.set(e),console.log("Item positions saved to KanbanBase:",e)}loadItemPositions(){const e=this.itemPositionsStore.get();return console.log("Item positions loaded from KanbanBase:",e),e||{}}resetItemPositions(e){const o=Object.keys(e).reduce((t,i)=>(t[i]=[],t),{});this.itemPositionsStore.set(o),console.log("Item positions reset to:",o)}async loadBoardData(e){try{const o=await fetch("https://kanban.kbve.com/api/get_board",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({board_id:e})});if(!o.ok)return console.error(`Failed to fetch board data for board ID: ${e}`),null;const t=await o.json();if(t&&typeof t=="object"&&"todo"in t&&"in_progress"in t&&"done"in t&&"unassigned"in t&&"metadata"in t&&"actions"in t){const i={TODO:t.todo||[],"IN-PROGRESS":t.in_progress||[],DONE:t.done||[],UNASSIGNED:t.unassigned||[]};return this.itemPositionsStore.set(i),console.log(`Loaded and saved board data for board ID: ${e}`),console.log("Metadata:",t.metadata),console.log("Actions:",t.actions),i}return console.error(`Invalid board data structure for board ID: ${e}`),null}catch(o){return console.error("Error loading board data:",o),null}}async saveBoardData(e,o){try{const t=this.itemPositionsStore.get(),i={board_id:e,todo:t.TODO||[],in_progress:t["IN-PROGRESS"]||[],done:t.DONE||[]};if(console.log("Saving to API with data:",i),!(await fetch("https://kanban.kbve.com/api/save_board",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})).ok)throw new Error("Failed to save board data to API");console.log(`Saved board data to API for ${e}`)}catch(t){throw console.error("Error saving board data:",t),t}}async validateBoardId(e){return await this.loadBoardData(e)?(console.log("Validation passed for board ID:",e),!0):(console.error("Validation failed for board ID:",e),!1)}}const h=new U,M=g("p-5 border-gray-200 dark:text-neutral-200 rounded-md","w-full md:w-1/4","flex flex-col items-center"),z=g("flex flex-wrap flex-grow bg-gray-500 p-5 rounded-md","w-full md:w-3/4"),H=({title:r,message:e,isVisible:o,onClose:t})=>o?s.jsx("div",{className:"fixed inset-0 flex items-center justify-center bg-black bg-opacity-50",children:s.jsxs("div",{className:"bg-white p-5 rounded shadow-lg w-96",children:[s.jsx("h2",{className:"text-xl font-bold mb-4",children:r}),s.jsxs("p",{className:"mb-4",children:["This is the content of the modal for item ",r,".",e]}),s.jsx("button",{className:"bg-cyan-500 text-gray-500 py-2 px-4 rounded hover:bg-cyan-600",onClick:t,children:"Close"})]})}):null,R=({id:r,onExpandClick:e})=>{const{attributes:o,listeners:t,setNodeRef:i,transform:f,isDragging:y}=F({id:r}),v={transform:J.Translate.toString(f)};return s.jsxs("div",{ref:i,className:g("p-3 border border-cyan-500 rounded-md m-2 cursor-grab bg-cyan-300 dark:text-neutral-600 flex items-center justify-between",E({"opacity-50":y})),style:v,...t,...o,children:[r,s.jsx("button",{onClick:e,className:"ml-2 p-2 rounded-full bg-gray-200 hover:bg-gray-300",children:s.jsx(q,{className:"w-4 h-4 text-gray-800 dark:text-gray-200"})})]})},Q=({id:r,children:e})=>{const{setNodeRef:o,isOver:t}=C({id:r});return s.jsxs("div",{ref:o,className:g("p-5 border-dashed border-2 border-gray-300 rounded-md m-3 min-h-[150px]","w-full sm:w-[45%] md:w-[30%]",E({"bg-cyan-100":t,"bg-white":!t})),children:[s.jsx("h3",{className:g("font-bold mb-3"),children:r}),e]})},W=({id:r,children:e})=>{const{setNodeRef:o,isOver:t}=C({id:r});return s.jsxs("div",{ref:o,className:g(M,"border-2 border-dashed border-gray-400",E({"bg-cyan-500":t})),children:[s.jsx("h3",{className:g("font-bold text-xl mb-4"),children:"Kanban"}),e]})},X=({items:r,onItemExpandClick:e})=>s.jsxs("div",{className:M,children:[s.jsx("h3",{className:g("font-bold text-xl mb-4"),children:"Available Items"}),r.map(o=>s.jsx(R,{id:o,onExpandClick:()=>e(o)},o))]}),Y=({containers:r})=>{const[e,o]=d.useState({}),[t,i]=d.useState(["Item 1","Item 2","Item 3","Function","IGBC"]),[f,y]=d.useState(null),[v,j]=d.useState(!1),[w,O]=d.useState(""),[P,x]=d.useState(""),b=()=>{const n={TODO:[],"IN-PROGRESS":[],DONE:[]},a=h.loadItemPositions(),S=Object.values(a).flatMap(l=>l.map(m=>m.id));i(l=>[...new Set([...l,...S])]),h.resetItemPositions(n),o(n),console.log("Kanban reset completed.")},p=A(B(V,{activationConstraint:{distance:5}}),B($,{activationConstraint:{delay:100,tolerance:5}}));d.useEffect(()=>{(async()=>{try{const a=await h.loadProfile();console.log(`Data: ${a}`)}catch(a){console.error("Error loading profile or item positions:",a)}})()},[]),d.useEffect(()=>{const n=h.loadItemPositions();o(n);const a=new Set(Object.values(n).flatMap(S=>S.map(l=>l.id)));i(S=>S.filter(l=>!a.has(l)))},[]);const I=n=>{D.emit("openModal",{message:`Modal for ${n}`})};d.useEffect(()=>{const n=a=>{a&&O(a.message),j(!0)};return D.on("openModal",n),()=>{D.off("openModal",n)}},[]),d.useEffect(()=>{const n=a=>{if(a)switch(a.npcId){case"Reset":b()}};return D.on("npcInteraction",n),()=>{D.off("npcInteraction",n)}},[]);const N=async n=>{const{active:a,over:S}=n;if(!S){y(null);return}const l=Object.keys(e).find(c=>e[c]?.some(u=>u.id===a.id)),m=S.id;if(m==="sidebar")t.includes(a.id)||i(c=>[...c,a.id]),l&&o(c=>{const u={...c,[l]:c[l].filter(T=>T.id!==a.id)};return h.saveItemPositions(u),u});else if(!l)i(c=>c.filter(u=>u!==a.id)),o(c=>{const u={...c,[m]:[...c[m]||[],{id:a.id,container:m}]};return h.saveItemPositions(u),u});else if(l!==m){const c={...e,[l]:e[l].filter(u=>u.id!==a.id),[m]:[...e[m]||[],{id:a.id,container:m}]};o(c),h.saveItemPositions(c)}y(null)};return s.jsxs(K,{sensors:p,collisionDetection:G,onDragStart:n=>y(n.active.id),onDragEnd:N,children:[s.jsxs("div",{className:g("flex flex-col md:flex-row"),children:[s.jsx(W,{id:"sidebar",children:s.jsx(X,{items:t,onItemExpandClick:I})}),s.jsx("div",{className:z,children:r.map(n=>s.jsx(Q,{id:n,children:e[n]?.map(a=>s.jsx(R,{id:a.id,onExpandClick:()=>I(a.id)},a.id))},n))})]}),s.jsx(_,{children:f?s.jsx("div",{children:f}):null}),s.jsx(H,{title:w,message:P,isVisible:v,onClose:()=>j(!1)})]})},Z=({onSubmit:r})=>{const[e,o]=d.useState("");return s.jsxs("div",{className:"flex flex-col items-center justify-center h-screen bg-gray-100",children:[s.jsx("h2",{className:"text-2xl font-bold mb-4",children:"Enter Board ID"}),s.jsx("input",{type:"text",placeholder:"Board ID",value:e,onChange:t=>o(t.target.value),className:"border p-2 rounded-md mb-4 w-64"}),s.jsx("button",{onClick:()=>e&&r(e),className:"bg-cyan-500 text-white py-2 px-4 rounded hover:bg-cyan-600",children:"Submit"})]})},pe=()=>{const[r,e]=d.useState(null),[o,t]=d.useState({}),[i,f]=d.useState([]),[y,v]=d.useState(!1),j=async x=>{v(!0);try{const b=await h.loadBoardData(x);if(b){t(b);const p=new Set(Object.values(b).flatMap(I=>I.map(N=>N.id)));f(I=>I.filter(N=>!p.has(N)))}else alert("No board data found for the provided Board ID."),e(null)}catch(b){console.error("Error loading board data:",b),alert("Failed to load board data.")}finally{v(!1)}},w=async()=>{if(r)try{await h.saveBoardData(r,o),alert("Board saved successfully!")}catch(x){console.error("Error saving board data:",x),alert("Failed to save board.")}},O=()=>{t({TODO:[],"IN-PROGRESS":[],DONE:[]});const b=Object.values(o).flatMap(p=>p.map(I=>I.id)).filter(p=>!i.includes(p));f(p=>[...p,...b])},P=x=>{e(x),j(x)};return d.useEffect(()=>{r&&j(r)},[r]),y?s.jsx("div",{className:"flex items-center justify-center h-screen",children:"Loading..."}):r?s.jsxs("div",{children:[s.jsx(Y,{containers:["TODO","IN-PROGRESS","DONE"],items:o,sidebarItems:i,setItems:t,setSidebarItems:f}),s.jsxs("div",{className:"mt-4 text-center",children:[s.jsx("button",{className:"bg-green-500 text-white py-2 px-4 rounded hover:bg-green-600",onClick:w,children:"Save Board"}),s.jsx("button",{className:"bg-red-500 text-white py-2 px-4 rounded hover:bg-red-600 ml-4",onClick:O,children:"Reset Board"})]})]}):s.jsx(Z,{onSubmit:P})};export{pe as default};
diff --git a/docs/index.html b/docs/index.html
index 8c8bba139e..0711b91042 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -196,11 +196,11 @@
Latest Commit by h0lybyte : -
"Merge pull request #3617 from KBVE/beta +
"Merge pull request #3638 from KBVE/beta Preparing Release Branch"
-On:
-View this commit on +On:
+View this commit on GitHub .