@runfusion/fusion 0.9.1 → 0.9.2

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.
Files changed (39) hide show
  1. package/dist/bin.js +5390 -3696
  2. package/dist/client/assets/AgentDetailView-CcvwSbwq.js +18 -0
  3. package/dist/client/assets/{AgentsView-DvN5EsoE.js → AgentsView-m8dBmo63.js} +3 -3
  4. package/dist/client/assets/{ChatView-DsETFRQp.js → ChatView-BKlUxTL8.js} +1 -1
  5. package/dist/client/assets/{DevServerView-D1_7SL1h.js → DevServerView-BygenPXh.js} +1 -1
  6. package/dist/client/assets/{DirectoryPicker-BBcm5G9F.js → DirectoryPicker-BosMLSTv.js} +1 -1
  7. package/dist/client/assets/{DocumentsView-OuVpmTPp.js → DocumentsView-BfEPLY3E.js} +1 -1
  8. package/dist/client/assets/{InsightsView-DMC_bLUc.js → InsightsView-B8FDRckf.js} +1 -1
  9. package/dist/client/assets/{MemoryView-cI4IK-lz.js → MemoryView-RT80_hUg.js} +1 -1
  10. package/dist/client/assets/{NodesView-C_LWLFNr.js → NodesView-UaaYrNBq.js} +1 -1
  11. package/dist/client/assets/{PiExtensionsManager-DCTHvy2u.js → PiExtensionsManager-Cjtt84Cv.js} +3 -3
  12. package/dist/client/assets/{PluginManager-BXMpkZx-.js → PluginManager-BuhG8uF_.js} +1 -1
  13. package/dist/client/assets/ResearchView-DLDnrYVm.js +1 -0
  14. package/dist/client/assets/ResearchView-aQkoD9QR.css +1 -0
  15. package/dist/client/assets/{RoadmapsView-BHTePn2u.js → RoadmapsView-DP7o1HsL.js} +2 -2
  16. package/dist/client/assets/SettingsModal-BAZQbTpw.js +31 -0
  17. package/dist/client/assets/{SettingsModal-BSZIno8y.js → SettingsModal-BWkxqiIg.js} +1 -1
  18. package/dist/client/assets/SettingsModal-FfIAhzcJ.css +1 -0
  19. package/dist/client/assets/{SetupWizardModal-DVoRhy_V.js → SetupWizardModal-BZFsWHpZ.js} +1 -1
  20. package/dist/client/assets/{SkillsView-CK52SRz5.js → SkillsView-87geY7V_.js} +1 -1
  21. package/dist/client/assets/TodoView-DaYieTys.js +6 -0
  22. package/dist/client/assets/{folder-open-C0SfzRFt.js → folder-open-Di63O7Be.js} +1 -1
  23. package/dist/client/assets/index-BFOt3vs-.js +656 -0
  24. package/dist/client/assets/index-BKZuWpfH.css +1 -0
  25. package/dist/client/assets/{list-checks-D5c428sr.js → list-checks-DQ8ece3U.js} +1 -1
  26. package/dist/client/assets/{star-GGmbVi2b.js → star-CHOSzU9a.js} +1 -1
  27. package/dist/client/assets/{upload-CrJJybRJ.js → upload-D7w2Kq_t.js} +1 -1
  28. package/dist/client/assets/{users-C56SMdh4.js → users-YG5FjHxk.js} +1 -1
  29. package/dist/client/index.html +2 -2
  30. package/dist/client/version.json +1 -1
  31. package/dist/extension.js +5168 -4050
  32. package/dist/pi-claude-cli/package.json +1 -1
  33. package/package.json +1 -1
  34. package/dist/client/assets/AgentDetailView-khrspqE3.js +0 -18
  35. package/dist/client/assets/SettingsModal-2s-L1oWD.js +0 -31
  36. package/dist/client/assets/SettingsModal-xVaD-0tP.css +0 -1
  37. package/dist/client/assets/TodoView-BKqIV8P6.js +0 -6
  38. package/dist/client/assets/index-DawWARY5.css +0 -1
  39. package/dist/client/assets/index-DiC9GfBH.js +0 -656
@@ -1,11 +1,11 @@
1
- import{r as l,j as e}from"./vendor-react-K0fH_qHe.js";import{c as M,dz as Q,dA as V,dB as Y,R as $,dr as y,D as Z,O as T,I as ee,N as se,cb as L,F as D,dC as ae,dD as te,dE as _,X as ie}from"./index-DiC9GfBH.js";import"./vendor-xterm-DzcZoU0P.js";/**
1
+ import{r as l,j as e}from"./vendor-react-K0fH_qHe.js";import{c as O,dH as Q,dI as V,dJ as Y,R as $,dz as y,D as Z,O as T,I as ee,N as se,cd as L,F as D,dK as ae,dL as te,dM as I,X as ie}from"./index-BFOt3vs-.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
- */const ne=[["path",{d:"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z",key:"e79jfc"}],["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}]],A=M("palette",ne);/**
6
+ */const ne=[["path",{d:"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z",key:"e79jfc"}],["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}]],M=O("palette",ne);/**
7
7
  * @license lucide-react v1.7.0 - ISC
8
8
  *
9
9
  * This source code is licensed under the ISC license.
10
10
  * See the LICENSE file in the root directory of this source tree.
11
- */const le=[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]],I=M("puzzle",le);function ce(t){return t.replace(/-/g,"-")}function re(t){return{"fusion-global":"Fusion Global","pi-global":"Pi Global","fusion-project":"Fusion Project","pi-project":"Pi Project",package:"Package"}[t]??t}function oe(t){return t.startsWith("npm:")?"npm":t.startsWith("git:")?"git":"local"}function de(t){return t.replace(/^(npm:|git:)/,"")}function he({addToast:t,projectId:x}){const[c,O]=l.useState(null),[f,P]=l.useState(!0),[N,E]=l.useState(!1),[S,w]=l.useState(!1),[h,z]=l.useState(""),[B,G]=l.useState(new Set),[p,W]=l.useState([]),[b,F]=l.useState(!0),[q,C]=l.useState(!1),r=l.useCallback(async()=>{try{P(!0);const s=await Q();O(s)}catch(s){t(`Failed to load Pi settings: ${s instanceof Error?s.message:String(s)}`,"error")}finally{P(!1)}},[t]),m=l.useCallback(async()=>{try{F(!0);const s=await V(x);W(s.extensions)}catch(s){t(`Failed to load extensions: ${s instanceof Error?s.message:String(s)}`,"error")}finally{F(!1)}},[t,x]),K=l.useCallback(async s=>{try{C(!0);const i=s.enabled?[...p.filter(a=>a.enabled&&a.id!==s.id).map(a=>a.id),s.id]:p.filter(a=>a.enabled&&a.id!==s.id).map(a=>a.id);await Y(i,x),await m(),t(s.enabled?"Extension disabled":"Extension enabled","success")}catch(i){t(`Failed to update extension: ${i instanceof Error?i.message:String(i)}`,"error")}finally{C(!1)}},[p,x,m,t]);l.useEffect(()=>{r()},[r]),l.useEffect(()=>{m()},[m]);const U=s=>{G(i=>{const a=new Set(i);return a.has(s)?a.delete(s):a.add(s),a})},R=async()=>{if(!h.trim()){t("Please enter a package source","error");return}try{E(!0),await ae(h.trim()),t("Package installed successfully","success"),z(""),await r()}catch(s){t(`Failed to install package: ${s instanceof Error?s.message:String(s)}`,"error")}finally{E(!1)}},X=async()=>{try{w(!0),await te(x),await Promise.all([r(),m()]),t("Fusion skill reinstalled successfully","success")}catch(s){t(`Failed to reinstall Fusion skill: ${s instanceof Error?s.message:String(s)}`,"error")}finally{w(!1)}},H=async s=>{if(!c)return;const i=c.packages.filter(a=>(typeof a=="string"?a:a.source)!==s);try{await _({packages:i}),t("Package removed","success"),await r()}catch(a){t(`Failed to remove package: ${a instanceof Error?a.message:String(a)}`,"error")}},J=async(s,i)=>{if(!c)return;const a=c[s].filter(n=>n!==i);try{await _({[s]:a}),t(`${s.slice(0,-1)} removed`,"success"),await r()}catch(n){t(`Failed to update settings: ${n instanceof Error?n.message:String(n)}`,"error")}},u=(s,i,a)=>!c||c[a].length===0?null:e.jsxs("div",{className:"pi-ext-section",children:[e.jsxs("div",{className:"pi-ext-section-header",children:[e.jsx(i,{size:14}),e.jsx("span",{children:s}),e.jsx("span",{className:"pi-ext-count",children:c[a].length})]}),e.jsx("div",{className:"pi-ext-resource-list",children:c[a].map((n,g)=>e.jsxs("span",{className:"pi-ext-resource-tag",children:[e.jsx("span",{className:"pi-ext-resource-path",children:n}),e.jsx("button",{className:"btn-icon touch-target pi-ext-resource-remove",onClick:()=>J(a,n),title:`Remove ${n}`,"aria-label":`Remove ${n}`,children:e.jsx(ie,{size:12})})]},g))})]});return e.jsxs("div",{className:"pi-ext-manager",children:[e.jsxs("div",{className:"pi-ext-manager-header",children:[e.jsx("h4",{className:"pi-ext-manager-title",children:"Pi Extensions"}),e.jsx("div",{className:"pi-ext-manager-actions",children:e.jsx("button",{className:"btn-icon",onClick:r,title:"Refresh",disabled:f,children:e.jsx($,{size:16,className:f?"spin":""})})})]}),f?e.jsx("div",{className:"loading-state",children:"Loading Pi settings…"}):c?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"pi-ext-add-form",children:[e.jsxs("div",{className:"pi-ext-add-form-row",children:[e.jsx("input",{type:"text",className:"input",placeholder:"npm:pi-extension-name or git:https://github.com/...",value:h,onChange:s=>z(s.target.value),onKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),R())},disabled:N}),e.jsxs("button",{className:"btn btn-primary",onClick:R,disabled:N||!h.trim(),children:[e.jsx(Z,{size:14}),N?"Installing…":"Add"]})]}),e.jsx("div",{className:"pi-ext-add-form-row",children:e.jsx("button",{className:"btn",onClick:X,disabled:S,children:S?"Reinstalling Fusion…":"Reinstall Fusion skill"})})]}),c.packages.length>0?e.jsx("div",{className:"pi-ext-package-list",children:c.packages.map((s,i)=>{const a=typeof s=="string"?s:s.source,n=oe(a),g=de(a),j=typeof s=="object"&&s!==null,v=j&&(s.extensions?.length??0)>0||(s.skills?.length??0)>0||(s.prompts?.length??0)>0||(s.themes?.length??0)>0,k=B.has(i);return e.jsxs("div",{className:"pi-ext-package-card",children:[e.jsxs("div",{className:"pi-ext-package-header",children:[j&&v?e.jsx("button",{className:"pi-ext-expand-btn",onClick:()=>U(i),"aria-expanded":k,children:k?e.jsx(T,{size:14}):e.jsx(ee,{size:14})}):e.jsx("span",{className:"pi-ext-expand-placeholder"}),e.jsx("span",{className:`pi-ext-source-badge pi-ext-source-badge--${n}`,children:n}),e.jsx("span",{className:"pi-ext-package-source",children:g}),e.jsxs("div",{className:"pi-ext-package-actions",children:[j&&v&&e.jsxs("span",{className:"pi-ext-filter-hint",children:[s.extensions?.length??0," ext,"," ",s.skills?.length??0," skill,"," ",s.prompts?.length??0," prompt,"," ",s.themes?.length??0," theme"]}),e.jsx("button",{className:"btn-icon touch-target pi-ext-remove-btn",onClick:()=>H(a),title:"Remove package","aria-label":`Remove package ${g}`,children:e.jsx(se,{size:14})})]})]}),j&&v&&k&&e.jsxs("div",{className:"pi-ext-filter-list",children:[s.extensions?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(I,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Extensions:"}),s.extensions.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null,s.skills?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(L,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Skills:"}),s.skills.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null,s.prompts?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(D,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Prompts:"}),s.prompts.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null,s.themes?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(A,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Themes:"}),s.themes.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null]})]},i)})}):e.jsxs("div",{className:"empty-state",children:[e.jsx(y,{size:32,className:"text-muted"}),e.jsx("p",{children:"No packages configured."}),e.jsx("p",{className:"text-muted",children:"Add a package source above to get started."})]}),e.jsxs("div",{className:"pi-ext-top-level",children:[u("Extensions",I,"extensions"),u("Skills",L,"skills"),u("Prompts",D,"prompts"),u("Themes",A,"themes")]})]}):e.jsxs("div",{className:"empty-state",children:[e.jsx(y,{size:32,className:"text-muted"}),e.jsx("p",{children:"Failed to load Pi settings."})]}),e.jsxs("div",{className:"pi-ext-discovered-section",children:[e.jsxs("div",{className:"pi-ext-discovered-header",children:[e.jsx("h4",{children:"Discovered Extensions"}),e.jsx("button",{className:"btn-icon",onClick:m,disabled:b,title:"Refresh extensions",children:e.jsx($,{size:14,className:b?"spin":""})})]}),e.jsx("p",{className:"pi-ext-description",children:"Installed extensions resolved from packages and configured paths."}),b?e.jsx("div",{className:"loading-state",children:"Loading extensions…"}):p.length===0?e.jsxs("div",{className:"empty-state",children:[e.jsx(y,{size:32,className:"text-muted"}),e.jsx("p",{children:"No extensions discovered."})]}):e.jsx("div",{className:"pi-ext-list",children:p.map(s=>e.jsxs("div",{className:"pi-ext-item",children:[e.jsxs("div",{className:"pi-ext-item-content",children:[e.jsxs("div",{className:"pi-ext-info",children:[e.jsx("span",{className:"pi-ext-name",children:s.name}),e.jsx("span",{className:`pi-ext-source-badge pi-ext-source-badge--${ce(s.source)}`,children:re(s.source)})]}),e.jsx("span",{className:"pi-ext-path",children:s.path})]}),e.jsx("div",{className:"pi-ext-actions",children:e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>void K(s),disabled:q,"aria-label":`Toggle ${s.name}`}),e.jsx("span",{className:"toggle-slider"})]})})]},s.id))})]})]})}export{he as PiExtensionsManager};
11
+ */const le=[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]],_=O("puzzle",le);function ce(t){return t.replace(/-/g,"-")}function re(t){return{"fusion-global":"Fusion Global","pi-global":"Pi Global","fusion-project":"Fusion Project","pi-project":"Pi Project",package:"Package"}[t]??t}function oe(t){return t.startsWith("npm:")?"npm":t.startsWith("git:")?"git":"local"}function de(t){return t.replace(/^(npm:|git:)/,"")}function he({addToast:t,projectId:x}){const[c,A]=l.useState(null),[f,P]=l.useState(!0),[N,S]=l.useState(!1),[E,w]=l.useState(!1),[h,z]=l.useState(""),[G,K]=l.useState(new Set),[p,W]=l.useState([]),[b,F]=l.useState(!0),[q,C]=l.useState(!1),r=l.useCallback(async()=>{try{P(!0);const s=await Q();A(s)}catch(s){t(`Failed to load Pi settings: ${s instanceof Error?s.message:String(s)}`,"error")}finally{P(!1)}},[t]),m=l.useCallback(async()=>{try{F(!0);const s=await V(x);W(s.extensions)}catch(s){t(`Failed to load extensions: ${s instanceof Error?s.message:String(s)}`,"error")}finally{F(!1)}},[t,x]),B=l.useCallback(async s=>{try{C(!0);const i=s.enabled?[...p.filter(a=>a.enabled&&a.id!==s.id).map(a=>a.id),s.id]:p.filter(a=>a.enabled&&a.id!==s.id).map(a=>a.id);await Y(i,x),await m(),t(s.enabled?"Extension disabled":"Extension enabled","success")}catch(i){t(`Failed to update extension: ${i instanceof Error?i.message:String(i)}`,"error")}finally{C(!1)}},[p,x,m,t]);l.useEffect(()=>{r()},[r]),l.useEffect(()=>{m()},[m]);const H=s=>{K(i=>{const a=new Set(i);return a.has(s)?a.delete(s):a.add(s),a})},R=async()=>{if(!h.trim()){t("Please enter a package source","error");return}try{S(!0),await ae(h.trim()),t("Package installed successfully","success"),z(""),await r()}catch(s){t(`Failed to install package: ${s instanceof Error?s.message:String(s)}`,"error")}finally{S(!1)}},J=async()=>{try{w(!0),await te(x),await Promise.all([r(),m()]),t("Fusion skill reinstalled successfully","success")}catch(s){t(`Failed to reinstall Fusion skill: ${s instanceof Error?s.message:String(s)}`,"error")}finally{w(!1)}},U=async s=>{if(!c)return;const i=c.packages.filter(a=>(typeof a=="string"?a:a.source)!==s);try{await I({packages:i}),t("Package removed","success"),await r()}catch(a){t(`Failed to remove package: ${a instanceof Error?a.message:String(a)}`,"error")}},X=async(s,i)=>{if(!c)return;const a=c[s].filter(n=>n!==i);try{await I({[s]:a}),t(`${s.slice(0,-1)} removed`,"success"),await r()}catch(n){t(`Failed to update settings: ${n instanceof Error?n.message:String(n)}`,"error")}},u=(s,i,a)=>!c||c[a].length===0?null:e.jsxs("div",{className:"pi-ext-section",children:[e.jsxs("div",{className:"pi-ext-section-header",children:[e.jsx(i,{size:14}),e.jsx("span",{children:s}),e.jsx("span",{className:"pi-ext-count",children:c[a].length})]}),e.jsx("div",{className:"pi-ext-resource-list",children:c[a].map((n,g)=>e.jsxs("span",{className:"pi-ext-resource-tag",children:[e.jsx("span",{className:"pi-ext-resource-path",children:n}),e.jsx("button",{className:"btn-icon touch-target pi-ext-resource-remove",onClick:()=>X(a,n),title:`Remove ${n}`,"aria-label":`Remove ${n}`,children:e.jsx(ie,{size:12})})]},g))})]});return e.jsxs("div",{className:"pi-ext-manager",children:[e.jsxs("div",{className:"pi-ext-manager-header",children:[e.jsx("h4",{className:"pi-ext-manager-title",children:"Pi Extensions"}),e.jsx("div",{className:"pi-ext-manager-actions",children:e.jsx("button",{className:"btn-icon",onClick:r,title:"Refresh",disabled:f,children:e.jsx($,{size:16,className:f?"spin":""})})})]}),f?e.jsx("div",{className:"loading-state",children:"Loading Pi settings…"}):c?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"pi-ext-add-form",children:[e.jsxs("div",{className:"pi-ext-add-form-row",children:[e.jsx("input",{type:"text",className:"input",placeholder:"npm:pi-extension-name or git:https://github.com/...",value:h,onChange:s=>z(s.target.value),onKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),R())},disabled:N}),e.jsxs("button",{className:"btn btn-primary",onClick:R,disabled:N||!h.trim(),children:[e.jsx(Z,{size:14}),N?"Installing…":"Add"]})]}),e.jsx("div",{className:"pi-ext-add-form-row",children:e.jsx("button",{className:"btn",onClick:J,disabled:E,children:E?"Reinstalling Fusion…":"Reinstall Fusion skill"})})]}),c.packages.length>0?e.jsx("div",{className:"pi-ext-package-list",children:c.packages.map((s,i)=>{const a=typeof s=="string"?s:s.source,n=oe(a),g=de(a),j=typeof s=="object"&&s!==null,v=j&&(s.extensions?.length??0)>0||(s.skills?.length??0)>0||(s.prompts?.length??0)>0||(s.themes?.length??0)>0,k=G.has(i);return e.jsxs("div",{className:"pi-ext-package-card",children:[e.jsxs("div",{className:"pi-ext-package-header",children:[j&&v?e.jsx("button",{className:"pi-ext-expand-btn",onClick:()=>H(i),"aria-expanded":k,children:k?e.jsx(T,{size:14}):e.jsx(ee,{size:14})}):e.jsx("span",{className:"pi-ext-expand-placeholder"}),e.jsx("span",{className:`pi-ext-source-badge pi-ext-source-badge--${n}`,children:n}),e.jsx("span",{className:"pi-ext-package-source",children:g}),e.jsxs("div",{className:"pi-ext-package-actions",children:[j&&v&&e.jsxs("span",{className:"pi-ext-filter-hint",children:[s.extensions?.length??0," ext,"," ",s.skills?.length??0," skill,"," ",s.prompts?.length??0," prompt,"," ",s.themes?.length??0," theme"]}),e.jsx("button",{className:"btn-icon touch-target pi-ext-remove-btn",onClick:()=>U(a),title:"Remove package","aria-label":`Remove package ${g}`,children:e.jsx(se,{size:14})})]})]}),j&&v&&k&&e.jsxs("div",{className:"pi-ext-filter-list",children:[s.extensions?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(_,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Extensions:"}),s.extensions.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null,s.skills?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(L,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Skills:"}),s.skills.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null,s.prompts?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(D,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Prompts:"}),s.prompts.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null,s.themes?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(M,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Themes:"}),s.themes.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null]})]},i)})}):e.jsxs("div",{className:"empty-state",children:[e.jsx(y,{size:32,className:"text-muted"}),e.jsx("p",{children:"No packages configured."}),e.jsx("p",{className:"text-muted",children:"Add a package source above to get started."})]}),e.jsxs("div",{className:"pi-ext-top-level",children:[u("Extensions",_,"extensions"),u("Skills",L,"skills"),u("Prompts",D,"prompts"),u("Themes",M,"themes")]})]}):e.jsxs("div",{className:"empty-state",children:[e.jsx(y,{size:32,className:"text-muted"}),e.jsx("p",{children:"Failed to load Pi settings."})]}),e.jsxs("div",{className:"pi-ext-discovered-section",children:[e.jsxs("div",{className:"pi-ext-discovered-header",children:[e.jsx("h4",{children:"Discovered Extensions"}),e.jsx("button",{className:"btn-icon",onClick:m,disabled:b,title:"Refresh extensions",children:e.jsx($,{size:14,className:b?"spin":""})})]}),e.jsx("p",{className:"pi-ext-description",children:"Installed extensions resolved from packages and configured paths."}),b?e.jsx("div",{className:"loading-state",children:"Loading extensions…"}):p.length===0?e.jsxs("div",{className:"empty-state",children:[e.jsx(y,{size:32,className:"text-muted"}),e.jsx("p",{children:"No extensions discovered."})]}):e.jsx("div",{className:"pi-ext-list",children:p.map(s=>e.jsxs("div",{className:"pi-ext-item",children:[e.jsxs("div",{className:"pi-ext-item-content",children:[e.jsxs("div",{className:"pi-ext-info",children:[e.jsx("span",{className:"pi-ext-name",children:s.name}),e.jsx("span",{className:`pi-ext-source-badge pi-ext-source-badge--${ce(s.source)}`,children:re(s.source)})]}),e.jsx("span",{className:"pi-ext-path",children:s.path})]}),e.jsx("div",{className:"pi-ext-actions",children:e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>void B(s),disabled:q,"aria-label":`Toggle ${s.name}`}),e.jsx("span",{className:"toggle-slider"})]})})]},s.id))})]})]})}export{he as PiExtensionsManager};
@@ -1 +1 @@
1
- import{r as u,j as s}from"./vendor-react-K0fH_qHe.js";import{p as ee,dp as se,s as ne,X as k,aj as te,D as O,dq as A,N as _,R as ie,dr as ae,as as le,c1 as re,ds as ce,dt as de,du as ue,dv as oe,dw as V,b_ as ge}from"./index-DiC9GfBH.js";import{D as me}from"./DirectoryPicker-BBcm5G9F.js";import"./vendor-xterm-DzcZoU0P.js";import"./folder-open-C0SfzRFt.js";const H=[{id:"fusion-plugin-hermes-runtime",name:"Hermes Runtime",path:"./plugins/fusion-plugin-hermes-runtime",experimental:!0},{id:"fusion-plugin-paperclip-runtime",name:"Paperclip Runtime",path:"./plugins/fusion-plugin-paperclip-runtime"},{id:"fusion-plugin-openclaw-runtime",name:"OpenClaw Runtime",path:"./plugins/fusion-plugin-openclaw-runtime",experimental:!0}],j={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function fe({addToast:l,projectId:c}){const[N,b]=u.useState([]),[S,w]=u.useState(!0),[M,f]=u.useState(!1),[x,v]=u.useState(""),[C,P]=u.useState(!1),[h,I]=u.useState(null),[i,y]=u.useState(null),[a,p]=u.useState({}),[G,$]=u.useState(!1),[R,E]=u.useState(null),{confirm:J}=ee(),o=u.useCallback(async()=>{try{w(!0);const e=await se(c);b(e)}catch(e){l(`Failed to load plugins: ${e instanceof Error?e.message:String(e)}`,"error")}finally{w(!1)}},[c,l]);u.useEffect(()=>{o()},[o]);const K=u.useRef([]);K.current=N,u.useEffect(()=>{const e=c?`?projectId=${encodeURIComponent(c)}`:"",n=g=>{try{const t=JSON.parse(g.data);if(c&&t.projectId&&t.projectId!==c)return;switch(t.transition){case"installing":case"enabled":case"disabled":case"settings-updated":b(d=>{const m=d.findIndex(r=>r.id===t.pluginId);if(m>=0){const r=[...d];return r[m]={...r[m],enabled:t.enabled,state:t.state,settings:t.settings,error:t.error},r}else return o(),d});break;case"uninstalled":b(d=>d.filter(m=>m.id!==t.pluginId));break;case"error":b(d=>{const m=d.findIndex(r=>r.id===t.pluginId);if(m>=0){const r=[...d];return r[m]={...r[m],state:t.state,error:t.error},r}return d});break}}catch{}};return ne(`/api/events${e}`,{events:{"plugin:lifecycle":n},onReconnect:()=>{o()}})},[c,o]);const z=async()=>{if(!x.trim()){l("Please enter a plugin path","error");return}try{P(!0),await V({path:x},c),l("Plugin installed successfully","success"),f(!1),v(""),await o()}catch(e){l(`Failed to install plugin: ${e instanceof Error?e.message:String(e)}`,"error")}finally{P(!1)}},X=async e=>{try{E(e.id),await V({path:e.path},c),l(`${e.name} installed successfully`,"success"),await o()}catch(n){l(`Failed to install ${e.name}: ${n instanceof Error?n.message:String(n)}`,"error")}finally{E(null)}},F=async e=>{try{await ue(e.id,c),l(`${e.name} enabled`,"success"),await o()}catch(n){l(`Failed to enable plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},B=async e=>{try{await de(e.id,c),l(`${e.name} disabled`,"success"),await o()}catch(n){l(`Failed to disable plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},L=async e=>{try{I(e.id),await ce(e.id,c),l(`${e.name} reloaded`,"success"),await o()}catch(n){l(`Failed to reload plugin: ${n instanceof Error?n.message:String(n)}`,"error")}finally{I(null)}},U=async e=>{if(await J({title:"Uninstall Plugin",message:`Are you sure you want to uninstall "${e.name}"?`,danger:!0}))try{await oe(e.id,c),l(`${e.name} uninstalled`,"success"),await o(),y(null)}catch(g){l(`Failed to uninstall plugin: ${g instanceof Error?g.message:String(g)}`,"error")}},Q=async e=>{y(e);try{$(!0);const n=await ge(e.id,c);p(n)}catch{p({})}finally{$(!1)}},W=async()=>{if(i)try{await re(i.id,a,c),l("Settings saved","success")}catch(e){l(`Failed to save settings: ${e instanceof Error?e.message:String(e)}`,"error")}};if(i)return s.jsxs("div",{className:"plugin-manager-detail","data-testid":"plugin-manager-detail",children:[s.jsxs("div",{className:"plugin-manager-detail-header",children:[s.jsx("button",{className:"btn-icon",onClick:()=>y(null),"aria-label":"Back to plugin list",children:s.jsx(k,{size:16})}),s.jsxs("div",{className:"plugin-detail-title",children:[s.jsx("h4",{className:"plugin-detail-name",children:i.name}),s.jsx("span",{className:"plugin-state-badge",style:{color:j[i.state]||j.installed},children:i.state})]})]}),s.jsxs("div",{className:"plugin-detail-content",children:[s.jsxs("div",{className:"plugin-detail-card",children:[i.description&&s.jsx("p",{className:"plugin-description",children:i.description}),i.author&&s.jsxs("p",{className:"plugin-detail-meta-row",children:[s.jsx("span",{className:"text-muted",children:"Author:"}),i.author]}),i.homepage&&s.jsxs("p",{className:"plugin-detail-meta-row plugin-homepage",children:[s.jsx("span",{className:"text-muted",children:"Homepage:"}),s.jsxs("a",{href:i.homepage,target:"_blank",rel:"noopener noreferrer",children:[i.homepage,s.jsx(te,{size:12})]})]}),s.jsxs("p",{className:"plugin-detail-meta-row",children:[s.jsx("span",{className:"text-muted",children:"Version:"}),i.version]})]}),s.jsxs("div",{className:"plugin-detail-card",children:[s.jsx("h5",{className:"plugin-detail-section-heading",children:"Settings"}),G?s.jsx("p",{className:"text-muted",children:"Loading..."}):i.settingsSchema&&Object.keys(i.settingsSchema).length>0?s.jsxs("div",{className:"plugin-settings-form",children:[Object.entries(i.settingsSchema).map(([e,n])=>{const g=`setting-${e}-help`;return s.jsxs("div",{className:"form-group",children:[s.jsxs("label",{htmlFor:`setting-${e}`,children:[n.label||e,n.required&&" *"]}),n.type==="string"&&!n.multiline&&s.jsx("input",{type:"text",id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="string"&&n.multiline&&s.jsx("textarea",{id:`setting-${e}`,rows:4,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="password"&&s.jsx("input",{type:"password",id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="number"&&s.jsx("input",{type:"number",id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:Number(t.target.value)}),"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="boolean"&&s.jsxs("label",{className:"checkbox-label",children:[s.jsx("input",{type:"checkbox",checked:a[e]??!1,onChange:t=>p({...a,[e]:t.target.checked})}),n.description]}),n.type==="enum"&&s.jsxs("select",{id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),"aria-describedby":n.description&&!n.required?g:void 0,children:[s.jsx("option",{value:"",children:"Select..."}),n.enumValues?.map(t=>s.jsx("option",{value:t,children:t},t))]}),n.type==="array"&&s.jsxs("div",{className:"plugin-settings-array",children:[a[e]?.map((t,d)=>s.jsxs("div",{className:"plugin-settings-array-item",children:[s.jsx("input",{type:n.itemType==="number"?"number":"text",value:t??"",onChange:m=>{const r=m.target.value,D=[...a[e]||[]];D[d]=n.itemType==="number"?Number(r):r,p({...a,[e]:D})}}),s.jsx("button",{className:"btn-icon",onClick:()=>{const r=[...a[e]||[]];r.splice(d,1),p({...a,[e]:r})},"aria-label":"Remove item",children:s.jsx(k,{size:14})})]},d)),s.jsxs("button",{className:"btn btn-secondary",onClick:()=>{const t=a[e]||[],d=n.itemType==="number"?0:"";p({...a,[e]:[...t,d]})},children:[s.jsx(O,{size:14})," Add Item"]})]}),n.description&&!n.required&&!n.multiline&&s.jsx("span",{id:g,className:"form-help",children:n.description})]},e)}),s.jsx("button",{className:"btn btn-primary",onClick:W,children:"Save Settings"})]}):s.jsx("p",{className:"text-muted",children:"No configurable settings."})]}),s.jsxs("div",{className:"plugin-detail-actions",children:[i.state==="started"&&s.jsxs("button",{className:"btn btn-secondary",onClick:()=>L(i),disabled:h===i.id,children:[s.jsx(A,{size:14,className:h===i.id?"spin":""}),h===i.id?"Reloading...":"Reload"]}),i.enabled?s.jsx("button",{className:"btn btn-secondary",onClick:()=>B(i),children:"Disable"}):s.jsx("button",{className:"btn btn-primary",onClick:()=>F(i),children:"Enable"}),s.jsxs("button",{className:"btn btn-danger",onClick:()=>U(i),children:[s.jsx(_,{size:14})," Uninstall"]})]})]})]});const Y=new Set(N.map(e=>e.id)),Z=new Set(H.map(e=>e.id)),q=N.filter(e=>!Z.has(e.id)),T=()=>s.jsxs("section",{className:"plugin-bundled-runtime-section","aria-label":"Bundled Runtime Plugins",children:[s.jsxs("div",{className:"plugin-bundled-runtime-header",children:[s.jsx("h4",{className:"plugin-bundled-runtime-heading",children:"Bundled Runtime Plugins"}),s.jsx("p",{className:"plugin-bundled-runtime-description",children:"Install Fusion's bundled runtimes directly from this screen."})]}),s.jsx("div",{className:"plugin-bundled-runtime-list","aria-label":"Bundled runtime plugin recommendations",children:H.map(e=>{const n=Y.has(e.id);return s.jsxs("div",{className:"plugin-bundled-runtime-item",children:[s.jsxs("div",{className:"plugin-bundled-runtime-meta",children:[s.jsx("span",{className:"plugin-bundled-runtime-name",children:e.name}),e.experimental&&s.jsx("span",{className:"plugin-bundled-runtime-badge",children:"Experimental"}),s.jsx("span",{className:`plugin-bundled-runtime-status ${n?"plugin-bundled-runtime-status--installed":"plugin-bundled-runtime-status--available"}`,children:n?"Installed":"Not installed"})]}),s.jsx("button",{className:`btn ${n?"btn-secondary":"btn-primary"} btn-sm`,onClick:()=>X(e),disabled:n||R===e.id,children:n?"Installed":R===e.id?"Installing...":`Install ${e.name}`})]},e.id)})})]});return s.jsxs("div",{className:"plugin-manager","data-testid":"plugin-manager",children:[s.jsxs("div",{className:"plugin-manager-header",children:[s.jsx("span",{className:"plugin-manager-header-title",children:"Installed Plugins"}),s.jsxs("div",{className:"plugin-manager-actions",children:[s.jsxs("button",{className:"btn btn-sm btn-ghost",onClick:o,title:"Refresh","aria-label":"Refresh plugin list",children:[s.jsx(ie,{size:14,className:S?"spin":""}),"Refresh"]}),s.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>f(!0),children:[s.jsx(O,{size:14})," Install"]})]})]}),M&&s.jsxs("div",{className:"plugin-install-form",children:[s.jsxs("p",{className:"plugin-install-hint",children:["Browse to a plugin package root (contains ",s.jsx("code",{children:"manifest.json"}),") or a built ",s.jsx("code",{children:"dist"})," directory."]}),s.jsx(me,{value:x,onChange:v,placeholder:"Absolute path to plugin directory or dist folder",onInputKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),z())}}),s.jsxs("div",{className:"plugin-install-actions",children:[s.jsx("button",{className:"btn btn-primary",onClick:z,disabled:C||!x.trim(),children:C?"Installing...":"Install Plugin"}),s.jsx("button",{className:"btn btn-secondary",onClick:()=>{f(!1),v("")},children:"Cancel"})]})]}),S?s.jsx("div",{className:"settings-empty-state",children:"Loading plugins..."}):s.jsxs(s.Fragment,{children:[q.length===0?s.jsxs("div",{className:"settings-empty-state",children:[s.jsx(ae,{size:32,className:"text-muted"}),s.jsx("p",{children:"No plugins installed."}),s.jsx("p",{className:"text-muted",children:"Install a plugin to get started, or use a bundled runtime below."})]}):s.jsx("div",{className:"plugin-list",children:q.map(e=>s.jsxs("div",{className:"plugin-item",children:[s.jsxs("div",{className:"plugin-info",children:[s.jsx("span",{className:"plugin-name",children:e.name}),s.jsxs("span",{className:"plugin-version text-muted",children:["v",e.version]}),s.jsx("span",{className:"plugin-state-badge",style:{color:j[e.state]||j.installed},children:e.state})]}),s.jsxs("div",{className:"plugin-actions",children:[e.state==="started"&&s.jsx("button",{className:"btn-icon",onClick:()=>L(e),disabled:h===e.id,title:"Reload",children:s.jsx(A,{size:14,className:h===e.id?"spin":""})}),s.jsxs("label",{className:"toggle-switch",children:[s.jsx("input",{type:"checkbox",checked:e.enabled,onChange:()=>e.enabled?B(e):F(e)}),s.jsx("span",{className:"toggle-slider"})]}),s.jsx("button",{className:"btn-icon",onClick:()=>Q(e),title:"Settings",children:s.jsx(le,{size:14})}),s.jsx("button",{className:"btn-icon",onClick:()=>U(e),title:"Uninstall",children:s.jsx(_,{size:14})})]})]},e.id))}),T()]})]})}export{fe as PluginManager,j as STATE_COLORS};
1
+ import{r as u,j as s}from"./vendor-react-K0fH_qHe.js";import{p as ee,dx as se,s as ne,X as k,aj as te,D as A,dy as O,N as _,R as ie,dz as ae,au as le,c3 as re,dA as ce,dB as de,dC as ue,dD as oe,dE as V,c0 as ge}from"./index-BFOt3vs-.js";import{D as me}from"./DirectoryPicker-BosMLSTv.js";import"./vendor-xterm-DzcZoU0P.js";import"./folder-open-Di63O7Be.js";const H=[{id:"fusion-plugin-hermes-runtime",name:"Hermes Runtime",path:"./plugins/fusion-plugin-hermes-runtime",experimental:!0},{id:"fusion-plugin-paperclip-runtime",name:"Paperclip Runtime",path:"./plugins/fusion-plugin-paperclip-runtime"},{id:"fusion-plugin-openclaw-runtime",name:"OpenClaw Runtime",path:"./plugins/fusion-plugin-openclaw-runtime",experimental:!0}],j={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function fe({addToast:l,projectId:c}){const[N,x]=u.useState([]),[S,w]=u.useState(!0),[M,f]=u.useState(!1),[b,v]=u.useState(""),[C,P]=u.useState(!1),[h,I]=u.useState(null),[i,y]=u.useState(null),[a,p]=u.useState({}),[G,$]=u.useState(!1),[R,E]=u.useState(null),{confirm:J}=ee(),o=u.useCallback(async()=>{try{w(!0);const e=await se(c);x(e)}catch(e){l(`Failed to load plugins: ${e instanceof Error?e.message:String(e)}`,"error")}finally{w(!1)}},[c,l]);u.useEffect(()=>{o()},[o]);const K=u.useRef([]);K.current=N,u.useEffect(()=>{const e=c?`?projectId=${encodeURIComponent(c)}`:"",n=g=>{try{const t=JSON.parse(g.data);if(c&&t.projectId&&t.projectId!==c)return;switch(t.transition){case"installing":case"enabled":case"disabled":case"settings-updated":x(d=>{const m=d.findIndex(r=>r.id===t.pluginId);if(m>=0){const r=[...d];return r[m]={...r[m],enabled:t.enabled,state:t.state,settings:t.settings,error:t.error},r}else return o(),d});break;case"uninstalled":x(d=>d.filter(m=>m.id!==t.pluginId));break;case"error":x(d=>{const m=d.findIndex(r=>r.id===t.pluginId);if(m>=0){const r=[...d];return r[m]={...r[m],state:t.state,error:t.error},r}return d});break}}catch{}};return ne(`/api/events${e}`,{events:{"plugin:lifecycle":n},onReconnect:()=>{o()}})},[c,o]);const z=async()=>{if(!b.trim()){l("Please enter a plugin path","error");return}try{P(!0),await V({path:b},c),l("Plugin installed successfully","success"),f(!1),v(""),await o()}catch(e){l(`Failed to install plugin: ${e instanceof Error?e.message:String(e)}`,"error")}finally{P(!1)}},X=async e=>{try{E(e.id),await V({path:e.path},c),l(`${e.name} installed successfully`,"success"),await o()}catch(n){l(`Failed to install ${e.name}: ${n instanceof Error?n.message:String(n)}`,"error")}finally{E(null)}},B=async e=>{try{await ue(e.id,c),l(`${e.name} enabled`,"success"),await o()}catch(n){l(`Failed to enable plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},F=async e=>{try{await de(e.id,c),l(`${e.name} disabled`,"success"),await o()}catch(n){l(`Failed to disable plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},D=async e=>{try{I(e.id),await ce(e.id,c),l(`${e.name} reloaded`,"success"),await o()}catch(n){l(`Failed to reload plugin: ${n instanceof Error?n.message:String(n)}`,"error")}finally{I(null)}},L=async e=>{if(await J({title:"Uninstall Plugin",message:`Are you sure you want to uninstall "${e.name}"?`,danger:!0}))try{await oe(e.id,c),l(`${e.name} uninstalled`,"success"),await o(),y(null)}catch(g){l(`Failed to uninstall plugin: ${g instanceof Error?g.message:String(g)}`,"error")}},Q=async e=>{y(e);try{$(!0);const n=await ge(e.id,c);p(n)}catch{p({})}finally{$(!1)}},W=async()=>{if(i)try{await re(i.id,a,c),l("Settings saved","success")}catch(e){l(`Failed to save settings: ${e instanceof Error?e.message:String(e)}`,"error")}};if(i)return s.jsxs("div",{className:"plugin-manager-detail","data-testid":"plugin-manager-detail",children:[s.jsxs("div",{className:"plugin-manager-detail-header",children:[s.jsx("button",{className:"btn-icon",onClick:()=>y(null),"aria-label":"Back to plugin list",children:s.jsx(k,{size:16})}),s.jsxs("div",{className:"plugin-detail-title",children:[s.jsx("h4",{className:"plugin-detail-name",children:i.name}),s.jsx("span",{className:"plugin-state-badge",style:{color:j[i.state]||j.installed},children:i.state})]})]}),s.jsxs("div",{className:"plugin-detail-content",children:[s.jsxs("div",{className:"plugin-detail-card",children:[i.description&&s.jsx("p",{className:"plugin-description",children:i.description}),i.author&&s.jsxs("p",{className:"plugin-detail-meta-row",children:[s.jsx("span",{className:"text-muted",children:"Author:"}),i.author]}),i.homepage&&s.jsxs("p",{className:"plugin-detail-meta-row plugin-homepage",children:[s.jsx("span",{className:"text-muted",children:"Homepage:"}),s.jsxs("a",{href:i.homepage,target:"_blank",rel:"noopener noreferrer",children:[i.homepage,s.jsx(te,{size:12})]})]}),s.jsxs("p",{className:"plugin-detail-meta-row",children:[s.jsx("span",{className:"text-muted",children:"Version:"}),i.version]})]}),s.jsxs("div",{className:"plugin-detail-card",children:[s.jsx("h5",{className:"plugin-detail-section-heading",children:"Settings"}),G?s.jsx("p",{className:"text-muted",children:"Loading..."}):i.settingsSchema&&Object.keys(i.settingsSchema).length>0?s.jsxs("div",{className:"plugin-settings-form",children:[Object.entries(i.settingsSchema).map(([e,n])=>{const g=`setting-${e}-help`;return s.jsxs("div",{className:"form-group",children:[s.jsxs("label",{htmlFor:`setting-${e}`,children:[n.label||e,n.required&&" *"]}),n.type==="string"&&!n.multiline&&s.jsx("input",{type:"text",id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="string"&&n.multiline&&s.jsx("textarea",{id:`setting-${e}`,rows:4,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="password"&&s.jsx("input",{type:"password",id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="number"&&s.jsx("input",{type:"number",id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:Number(t.target.value)}),"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="boolean"&&s.jsxs("label",{className:"checkbox-label",children:[s.jsx("input",{type:"checkbox",checked:a[e]??!1,onChange:t=>p({...a,[e]:t.target.checked})}),n.description]}),n.type==="enum"&&s.jsxs("select",{id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),"aria-describedby":n.description&&!n.required?g:void 0,children:[s.jsx("option",{value:"",children:"Select..."}),n.enumValues?.map(t=>s.jsx("option",{value:t,children:t},t))]}),n.type==="array"&&s.jsxs("div",{className:"plugin-settings-array",children:[a[e]?.map((t,d)=>s.jsxs("div",{className:"plugin-settings-array-item",children:[s.jsx("input",{type:n.itemType==="number"?"number":"text",value:t??"",onChange:m=>{const r=m.target.value,q=[...a[e]||[]];q[d]=n.itemType==="number"?Number(r):r,p({...a,[e]:q})}}),s.jsx("button",{className:"btn-icon",onClick:()=>{const r=[...a[e]||[]];r.splice(d,1),p({...a,[e]:r})},"aria-label":"Remove item",children:s.jsx(k,{size:14})})]},d)),s.jsxs("button",{className:"btn btn-secondary",onClick:()=>{const t=a[e]||[],d=n.itemType==="number"?0:"";p({...a,[e]:[...t,d]})},children:[s.jsx(A,{size:14})," Add Item"]})]}),n.description&&!n.required&&!n.multiline&&s.jsx("span",{id:g,className:"form-help",children:n.description})]},e)}),s.jsx("button",{className:"btn btn-primary",onClick:W,children:"Save Settings"})]}):s.jsx("p",{className:"text-muted",children:"No configurable settings."})]}),s.jsxs("div",{className:"plugin-detail-actions",children:[i.state==="started"&&s.jsxs("button",{className:"btn btn-secondary",onClick:()=>D(i),disabled:h===i.id,children:[s.jsx(O,{size:14,className:h===i.id?"spin":""}),h===i.id?"Reloading...":"Reload"]}),i.enabled?s.jsx("button",{className:"btn btn-secondary",onClick:()=>F(i),children:"Disable"}):s.jsx("button",{className:"btn btn-primary",onClick:()=>B(i),children:"Enable"}),s.jsxs("button",{className:"btn btn-danger",onClick:()=>L(i),children:[s.jsx(_,{size:14})," Uninstall"]})]})]})]});const Y=new Set(N.map(e=>e.id)),Z=new Set(H.map(e=>e.id)),U=N.filter(e=>!Z.has(e.id)),T=()=>s.jsxs("section",{className:"plugin-bundled-runtime-section","aria-label":"Bundled Runtime Plugins",children:[s.jsxs("div",{className:"plugin-bundled-runtime-header",children:[s.jsx("h4",{className:"plugin-bundled-runtime-heading",children:"Bundled Runtime Plugins"}),s.jsx("p",{className:"plugin-bundled-runtime-description",children:"Install Fusion's bundled runtimes directly from this screen."})]}),s.jsx("div",{className:"plugin-bundled-runtime-list","aria-label":"Bundled runtime plugin recommendations",children:H.map(e=>{const n=Y.has(e.id);return s.jsxs("div",{className:"plugin-bundled-runtime-item",children:[s.jsxs("div",{className:"plugin-bundled-runtime-meta",children:[s.jsx("span",{className:"plugin-bundled-runtime-name",children:e.name}),e.experimental&&s.jsx("span",{className:"plugin-bundled-runtime-badge",children:"Experimental"}),s.jsx("span",{className:`plugin-bundled-runtime-status ${n?"plugin-bundled-runtime-status--installed":"plugin-bundled-runtime-status--available"}`,children:n?"Installed":"Not installed"})]}),s.jsx("button",{className:`btn ${n?"btn-secondary":"btn-primary"} btn-sm`,onClick:()=>X(e),disabled:n||R===e.id,children:n?"Installed":R===e.id?"Installing...":`Install ${e.name}`})]},e.id)})})]});return s.jsxs("div",{className:"plugin-manager","data-testid":"plugin-manager",children:[s.jsxs("div",{className:"plugin-manager-header",children:[s.jsx("span",{className:"plugin-manager-header-title",children:"Installed Plugins"}),s.jsxs("div",{className:"plugin-manager-actions",children:[s.jsxs("button",{className:"btn btn-sm btn-ghost",onClick:o,title:"Refresh","aria-label":"Refresh plugin list",children:[s.jsx(ie,{size:14,className:S?"spin":""}),"Refresh"]}),s.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>f(!0),children:[s.jsx(A,{size:14})," Install"]})]})]}),M&&s.jsxs("div",{className:"plugin-install-form",children:[s.jsxs("p",{className:"plugin-install-hint",children:["Browse to a plugin package root (contains ",s.jsx("code",{children:"manifest.json"}),") or a built ",s.jsx("code",{children:"dist"})," directory."]}),s.jsx(me,{value:b,onChange:v,placeholder:"Absolute path to plugin directory or dist folder",onInputKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),z())}}),s.jsxs("div",{className:"plugin-install-actions",children:[s.jsx("button",{className:"btn btn-primary",onClick:z,disabled:C||!b.trim(),children:C?"Installing...":"Install Plugin"}),s.jsx("button",{className:"btn btn-secondary",onClick:()=>{f(!1),v("")},children:"Cancel"})]})]}),S?s.jsx("div",{className:"settings-empty-state",children:"Loading plugins..."}):s.jsxs(s.Fragment,{children:[U.length===0?s.jsxs("div",{className:"settings-empty-state",children:[s.jsx(ae,{size:32,className:"text-muted"}),s.jsx("p",{children:"No plugins installed."}),s.jsx("p",{className:"text-muted",children:"Install a plugin to get started, or use a bundled runtime below."})]}):s.jsx("div",{className:"plugin-list",children:U.map(e=>s.jsxs("div",{className:"plugin-item",children:[s.jsxs("div",{className:"plugin-info",children:[s.jsx("span",{className:"plugin-name",children:e.name}),s.jsxs("span",{className:"plugin-version text-muted",children:["v",e.version]}),s.jsx("span",{className:"plugin-state-badge",style:{color:j[e.state]||j.installed},children:e.state})]}),s.jsxs("div",{className:"plugin-actions",children:[e.state==="started"&&s.jsx("button",{className:"btn-icon",onClick:()=>D(e),disabled:h===e.id,title:"Reload",children:s.jsx(O,{size:14,className:h===e.id?"spin":""})}),s.jsxs("label",{className:"toggle-switch",children:[s.jsx("input",{type:"checkbox",checked:e.enabled,onChange:()=>e.enabled?F(e):B(e)}),s.jsx("span",{className:"toggle-slider"})]}),s.jsx("button",{className:"btn-icon",onClick:()=>Q(e),title:"Settings",children:s.jsx(le,{size:14})}),s.jsx("button",{className:"btn-icon",onClick:()=>L(e),title:"Uninstall",children:s.jsx(_,{size:14})})]})]},e.id))}),T()]})]})}export{fe as PluginManager,j as STATE_COLORS};
@@ -0,0 +1 @@
1
+ import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{am as x,an as j}from"./index-BFOt3vs-.js";import"./vendor-xterm-DzcZoU0P.js";const w={pending:"Pending",running:"Running",completed:"Completed",failed:"Failed",cancelled:"Cancelled"};function b({projectId:n,addToast:h}){const[r,m]=a.useState([]),[d,v]=a.useState(null),[t,o]=a.useState(!0),[c,u]=a.useState(null),i=a.useCallback(async()=>{o(!0),u(null);try{const[s,l]=await Promise.all([x({limit:50},n),j(n)]);m(s.runs),v(l)}catch(s){const l=s instanceof Error?s.message:"Failed to load research runs";u(l),h?.(l,"error")}finally{o(!1)}},[n,h]);a.useEffect(()=>{i()},[i]);const _=a.useMemo(()=>r.some(s=>s.status==="completed"&&s.results?.summary),[r]);return e.jsxs("section",{className:"research-view","aria-label":"Research view",children:[e.jsxs("header",{className:"research-view__header",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"research-view__title",children:"Research"}),e.jsx("p",{className:"research-view__subtitle",children:"Track synthesis runs, source collection, and export artifacts."})]}),e.jsx("button",{className:"btn",type:"button",onClick:()=>void i(),children:"Refresh"})]}),t&&e.jsx("div",{className:"research-view__state card","data-testid":"research-state-loading",children:"Loading research runs…"}),!t&&c&&e.jsxs("div",{className:"research-view__state research-view__state--error card","data-testid":"research-state-error",children:[e.jsx("p",{children:c}),e.jsx("button",{className:"btn btn-danger",type:"button",onClick:()=>void i(),children:"Retry"})]}),!t&&!c&&r.length===0&&e.jsx("div",{className:"research-view__state card","data-testid":"research-state-empty",children:"No research runs yet. Start a run from the API or upcoming orchestration workflow."}),!t&&!c&&r.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"research-view__stats","data-testid":"research-state-running",children:[e.jsxs("div",{className:"card research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:"Total Runs"}),e.jsx("div",{className:"research-view__stat-value",children:d?.total??r.length})]}),e.jsxs("div",{className:"card research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:"Running"}),e.jsx("div",{className:"research-view__stat-value",children:d?.byStatus.running??0})]}),e.jsxs("div",{className:"card research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:"Completed"}),e.jsx("div",{className:"research-view__stat-value",children:d?.byStatus.completed??0})]})]}),e.jsx("div",{className:"research-view__list",children:r.map(s=>e.jsxs("article",{className:"card research-view__run-card",children:[e.jsxs("div",{className:"research-view__run-head",children:[e.jsx("span",{className:`card-status-badge ${s.status==="failed"?"research-view__status-badge--failed":`card-status-badge--${s.status==="pending"?"todo":s.status==="running"?"in-progress":s.status==="completed"?"done":"archived"}`}`,children:w[s.status]}),e.jsx("span",{className:"card-id",children:s.id})]}),e.jsx("h3",{className:"research-view__run-title",children:s.topic||s.query}),e.jsx("p",{className:"research-view__run-query",children:s.query}),s.results?.summary&&e.jsx("p",{"data-testid":"research-state-results",children:s.results.summary})]},s.id))}),!_&&e.jsx("p",{className:"research-view__hint",children:"Runs are active, but no summarized results are available yet."})]})]})}export{b as ResearchView};
@@ -0,0 +1 @@
1
+ .research-view{display:flex;flex-direction:column;gap:var(--space-lg);padding:var(--space-lg)}.research-view__header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md)}.research-view__title{margin:0;color:var(--text)}.research-view__subtitle{margin:var(--space-xs) 0 0;color:var(--text-muted)}.research-view__state{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-lg)}.research-view__state--error{border-color:var(--color-error);background:color-mix(in srgb,var(--color-error) 12%,var(--card))}.research-view__stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-md)}.research-view__stat-card{padding:var(--space-lg)}.research-view__stat-label{color:var(--text-muted)}.research-view__stat-value{margin-top:var(--space-xs);color:var(--text);font-family:var(--font-mono)}.research-view__list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-md)}.research-view__run-card{display:flex;flex-direction:column;gap:var(--space-sm)}.research-view__run-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.research-view__status-badge--failed{border-color:var(--color-error);background:color-mix(in srgb,var(--color-error) 18%,transparent);color:var(--color-error)}.research-view__run-title{margin:0;color:var(--text)}.research-view__run-query,.research-view__hint{margin:0;color:var(--text-muted)}@media(max-width:768px){.research-view{padding:var(--space-md)}.research-view__header{flex-direction:column}.research-view__stats,.research-view__list{grid-template-columns:minmax(0,1fr)}}
@@ -1,6 +1,6 @@
1
- import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{c as Et,aS as kt,aT as Ft,aU as Dt,aV as Mt,aW as Rt,aX as tt,aY as It,aZ as $t,a_ as at,a$ as zt,b0 as At,b1 as Bt,b2 as Ht,b3 as Ot,b4 as Tt,b5 as Gt,b6 as Pt,p as Lt,aH as Vt,D as Ae,b7 as he,X as re,au as Fe,N as Pe,a9 as Ut,af as pt,at as rt,a6 as Kt,b8 as Ye,b9 as Wt}from"./index-DiC9GfBH.js";import"./vendor-xterm-DzcZoU0P.js";/**
1
+ import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{c as Et,aU as kt,aV as Ft,aW as Dt,aX as Mt,aY as Rt,aZ as tt,a_ as It,a$ as $t,b0 as at,b1 as zt,b2 as At,b3 as Bt,b4 as Ot,b5 as Ht,b6 as Gt,b7 as Tt,b8 as Pt,p as Lt,aJ as Vt,D as Ae,b9 as he,X as re,aw as Fe,N as Pe,a9 as Ut,af as pt,av as rt,a6 as Kt,ba as Ye,bb as Wt}from"./index-BFOt3vs-.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
- */const Yt=[["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m16.2 7.8 2.9-2.9",key:"r700ao"}],["path",{d:"M18 12h4",key:"wj9ykh"}],["path",{d:"m16.2 16.2 2.9 2.9",key:"1bxg5t"}],["path",{d:"M12 18v4",key:"jadmvz"}],["path",{d:"m4.9 19.1 2.9-2.9",key:"bwix9q"}],["path",{d:"M2 12h4",key:"j09sii"}],["path",{d:"m4.9 4.9 2.9 2.9",key:"giyufr"}]],qt=Et("loader",Yt);function Jt(l){const n=l?.projectId,[v,f]=a.useState([]),[_,j]=a.useState(null),[S,m]=a.useState(null),[F,E]=a.useState([]),[C,y]=a.useState({}),[se,V]=a.useState(!1),[A,$]=a.useState(null),[De,ne]=a.useState(null),[fe,ie]=a.useState(!1),[Be,oe]=a.useState(null),[be,G]=a.useState([]),[B,P]=a.useState(!1),[X,H]=a.useState({}),[Me,le]=a.useState({}),Y=a.useRef(X),ce=a.useRef(Me),Z=a.useRef(be);Y.current=X,ce.current=Me,Z.current=be;const Re=a.useRef(n),D=a.useRef(0),Q=a.useRef(0),He=a.useRef(v),x=a.useRef(_),de=a.useRef(F),ve=a.useRef(C),R=a.useRef(n),xe=a.useRef(De);He.current=v,x.current=_,de.current=F,ve.current=C,R.current=n,xe.current=De,a.useEffect(()=>{Re.current!==n&&(Re.current=n,D.current++,j(null),m(null),E([]),y({}),ne(null),oe(null),G([]),P(!1),H({}),le({}))},[n]);const q=a.useCallback(async()=>{V(!0),$(null);try{const r=await kt(n);f(r)}catch(r){$(r instanceof Error?r:new Error("Failed to fetch roadmaps"))}finally{V(!1)}},[n]),N=a.useCallback(async r=>{try{const c=await Ft(r,n);m(c),E(c.milestones||[]);const i={};for(const s of c.milestones||[])i[s.id]=s.features||[];y(i)}catch(c){$(c instanceof Error?c:new Error("Failed to fetch roadmap"))}},[n]);a.useEffect(()=>{q()},[q]),a.useEffect(()=>{_?N(_):(m(null),E([]),y({}))},[_,N]);const Oe=a.useCallback(async(r,c)=>{try{const i=await Dt(r,R.current);f(s=>[...s,i]),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to create roadmap");throw c?.onError?.(s),s}},[]),we=a.useCallback(async(r,c,i)=>{try{const s=await Mt(r,c,R.current);f(d=>d.map(o=>o.id===r?s:o)),x.current===r&&m(d=>d?{...d,...s}:null),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update roadmap");throw i?.onError?.(d),d}},[]),h=a.useCallback(async(r,c)=>{try{await Rt(r,R.current),f(i=>i.filter(s=>s.id!==r)),x.current===r&&(j(null),m(null),E([]),y({})),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete roadmap");throw c?.onError?.(s),s}},[]),I=a.useCallback(r=>{j(r)},[]),je=a.useCallback(async(r,c)=>{const i=x.current;if(!i){const s=new Error("No roadmap selected");throw c?.onError?.(s),s}try{const s=await tt(i,r,R.current);E(d=>[...d,s]),y(d=>({...d,[s.id]:[]})),x.current&&N(x.current),c?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create milestone");throw c?.onError?.(d),d}},[N]),J=a.useCallback(async(r,c,i)=>{try{const s=await It(r,c,R.current);E(d=>d.map(o=>o.id===r?s:o)),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update milestone");throw i?.onError?.(d),d}},[N]),_e=a.useCallback(async(r,c)=>{try{await $t(r,R.current),E(i=>i.filter(s=>s.id!==r)),y(i=>{const s={...i};return delete s[r],s}),x.current&&N(x.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete milestone");throw c?.onError?.(s),s}},[N]),Le=a.useCallback(async(r,c,i)=>{try{const s=await at(r,c,R.current);y(d=>({...d,[r]:[...d[r]||[],s]})),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create feature");throw i?.onError?.(d),d}},[N]),M=a.useCallback(async(r,c,i)=>{try{const s=await zt(r,c,R.current);y(d=>{const o={};for(const[g,p]of Object.entries(d))o[g]=p.map(w=>w.id===r?s:w);return o}),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update feature");throw i?.onError?.(d),d}},[N]),ue=a.useCallback(async(r,c)=>{try{await At(r,R.current),y(i=>{const s={};for(const[d,o]of Object.entries(i))s[d]=o.filter(g=>g.id!==r);return s}),x.current&&N(x.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete feature");throw c?.onError?.(s),s}},[N]),O=a.useCallback(async(r,c,i)=>{const s=de.current,d=c.map(o=>s.find(g=>g.id===o)).filter(o=>o!==void 0).map((o,g)=>({...o,orderIndex:g}));E(d);try{await Bt(r,c,R.current),x.current&&N(x.current),i?.onSuccess?.()}catch(o){E(s);const g=o instanceof Error?o:new Error("Failed to reorder milestones");throw i?.onError?.(g),g}},[N]),ee=a.useCallback(async(r,c,i)=>{const s=ve.current[r]||[],d=s.map(p=>p.id);if(JSON.stringify(d)===JSON.stringify(c)){i?.onSuccess?.();return}const o=ve.current,g=c.map(p=>s.find(w=>w.id===p)).filter(p=>p!==void 0).map((p,w)=>({...p,orderIndex:w}));y(p=>({...p,[r]:g}));try{await Ht(r,c,R.current),x.current&&N(x.current),i?.onSuccess?.()}catch(p){y(o);const w=p instanceof Error?p:new Error("Failed to reorder features");throw i?.onError?.(w),w}},[N]),te=a.useCallback(async(r,c,i,s)=>{const d=ve.current;let o=null;for(const[k,K]of Object.entries(d))if(K.some(Ke=>Ke.id===r)){o=k;break}if(!o){const k=new Error("Feature not found");throw s?.onError?.(k),k}if(o===c){const k=d[o]||[],K=Math.max(0,Math.min(i,k.length-1));if(k.findIndex(We=>We.id===r)===K){s?.onSuccess?.();return}}const g=d[o]||[],p=d[c]||[],w=g.find(k=>k.id===r);if(!w){const k=new Error("Feature not found");throw s?.onError?.(k),k}const T=g.filter(k=>k.id!==r).map((k,K)=>({...k,orderIndex:K})),Ne={...w,milestoneId:c,orderIndex:i},ae=[...p];ae.splice(i,0,Ne);const Ve=ae.map((k,K)=>({...k,orderIndex:K}));y(o===c?k=>({...k,[o]:Ve}):k=>({...k,[o]:T,[c]:Ve}));try{await Ot(r,c,i,n),x.current&&N(x.current),s?.onSuccess?.()}catch(k){y(d);const K=k instanceof Error?k:new Error("Failed to move feature");throw s?.onError?.(K),K}},[N,n]);function Ie(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`draft-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}const pe=a.useCallback(async(r,c=5,i)=>{const s=x.current;if(!s){const g=new Error("No roadmap selected");throw i?.onError?.(g),g}const d=D.current,o=R.current;P(!0);try{const g=await Tt(s,r,c,o);if(D.current!==d)return;const p=g.suggestions.map(w=>({id:Ie(),title:w.title,description:w.description}));G(p),i?.onSuccess?.()}catch(g){if(D.current!==d)return;const p=g instanceof Error?g:new Error("Failed to generate suggestions");throw i?.onError?.(p),p}finally{D.current===d&&P(!1)}},[]),Ue=a.useCallback((r,c)=>{const s=Z.current.map(d=>d.id===r?{...d,...c}:d);Z.current=s,G(d=>d.map(o=>o.id===r?{...o,...c}:o))},[]),me=a.useCallback(async(r,c)=>{const i=x.current;if(!i){const p=new Error("No roadmap selected");throw c?.onError?.(p),p}const s=D.current,d=Z.current,o=d.findIndex(p=>p.id===r);if(o===-1){const p=new Error("Suggestion draft not found");throw c?.onError?.(p),p}const g=d[o];if(!g.title.trim()){const p=new Error("Title cannot be empty");throw c?.onError?.(p),p}G(p=>p.filter(w=>w.id!==r));try{if(await tt(i,{title:g.title,description:g.description},R.current),D.current!==s){G(p=>{const w=[...p];return w.splice(o,0,g),w});return}x.current&&N(x.current),c?.onSuccess?.()}catch(p){G(T=>{const Ne=[...T];return Ne.splice(o,0,g),Ne});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw c?.onError?.(w),w}},[N]),U=a.useCallback(async r=>{const c=x.current;if(!c){const o=new Error("No roadmap selected");throw r?.onError?.(o),o}const i=[...Z.current];if(i.length===0)return;const s=i.findIndex(o=>!o.title.trim());if(s!==-1){const o=new Error(`Title cannot be empty at position ${s+1}`);throw r?.onError?.(o),o}G([]);const d=D.current;for(let o=0;o<i.length&&D.current===d;o++){const g=i[o];try{await tt(c,{title:g.title,description:g.description},R.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw r?.onError?.(w),w}}D.current===d&&(x.current&&N(x.current),r?.onSuccess?.())},[N]),qe=a.useCallback(r=>ce.current[r]??!1,[]),Te=a.useCallback(async(r,c,i)=>{const s=D.current,d=R.current;le(o=>({...o,[r]:!0}));try{const o=await Gt(r,c,d);if(D.current!==s)return;const g=o.suggestions.map(p=>({id:Ie(),title:p.title,description:p.description}));H(p=>({...p,[r]:g})),i?.onSuccess?.()}catch(o){if(D.current!==s)return;const g=o instanceof Error?o:new Error("Failed to generate feature suggestions");throw i?.onError?.(g),g}finally{D.current===s&&le(o=>({...o,[r]:!1}))}},[]),Ce=a.useCallback((r,c,i)=>{const d=(Y.current[r]||[]).map(o=>o.id===c?{...o,...i}:o);Y.current={...Y.current,[r]:d},H(o=>({...o,[r]:o[r]?.map(g=>g.id===c?{...g,...i}:g)||[]}))},[]),Ge=a.useCallback(async(r,c,i)=>{const s=D.current,d=Y.current[r]||[],o=d.findIndex(p=>p.id===c);if(o===-1){const p=new Error("Suggestion draft not found");throw i?.onError?.(p),p}const g=d[o];if(!g.title.trim()){const p=new Error("Title cannot be empty");throw i?.onError?.(p),p}H(p=>({...p,[r]:p[r]?.filter(w=>w.id!==c)||[]}));try{if(await at(r,{title:g.title,description:g.description},R.current),D.current!==s){H(p=>{const T=[...p[r]||[]];return T.splice(o,0,g),{...p,[r]:T}});return}x.current&&N(x.current),i?.onSuccess?.()}catch(p){H(T=>{const ae=[...T[r]||[]];return ae.splice(o,0,g),{...T,[r]:ae}});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw i?.onError?.(w),w}},[N]),Je=a.useCallback(async(r,c)=>{const i=[...Y.current[r]||[]];if(i.length===0)return;const s=i.findIndex(o=>!o.title.trim());if(s!==-1){const o=new Error(`Title cannot be empty at position ${s+1}`);throw c?.onError?.(o),o}H(o=>({...o,[r]:[]}));const d=D.current;for(let o=0;o<i.length&&D.current===d;o++){const g=i[o];try{await at(r,{title:g.title,description:g.description},R.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw c?.onError?.(w),w}}D.current===d&&(x.current&&N(x.current),c?.onSuccess?.())},[N]),ye=a.useCallback(()=>{G([]),P(!1)},[]),Xe=a.useCallback(r=>{H(c=>{const i={...c};return delete i[r],i}),le(c=>{const i={...c};return delete i[r],i})},[]),ge=a.useCallback(async(r,c)=>{const i=++Q.current,s=n;ie(!0),oe(null);try{const d=await Pt(r,s);if(Q.current!==i||n!==s)return;ne(d),c?.onSuccess?.()}catch(d){if(Q.current!==i||n!==s)return;const o=d instanceof Error?d:new Error(String(d));oe(o),ne(null),c?.onError?.(o)}finally{Q.current===i&&ie(!1)}},[n]),$e=a.useCallback(()=>{ne(null),oe(null),ie(!1)},[]),Ze=a.useCallback(async()=>{await q(),x.current&&await N(x.current)},[q,N]);return{roadmaps:v,selectedRoadmapId:_,selectedRoadmap:S,milestones:F,featuresByMilestoneId:C,loading:se,error:A,createRoadmap:Oe,updateRoadmap:we,deleteRoadmap:h,selectRoadmap:I,createMilestone:je,updateMilestone:J,deleteMilestone:_e,reorderMilestones:O,createFeature:Le,updateFeature:M,deleteFeature:ue,reorderFeatures:ee,moveFeature:te,milestoneSuggestions:be,isGeneratingSuggestions:B,generateMilestoneSuggestions:pe,updateMilestoneSuggestionDraft:Ue,acceptMilestoneSuggestion:me,acceptAllMilestoneSuggestions:U,clearMilestoneSuggestions:ye,featureSuggestionsByMilestoneId:X,isGeneratingFeatureSuggestions:qe,generateFeatureSuggestions:Te,updateFeatureSuggestionDraft:Ce,acceptFeatureSuggestion:Ge,acceptAllFeatureSuggestions:Je,clearFeatureSuggestions:Xe,handoffPayload:De,isFetchingHandoff:fe,handoffError:Be,fetchHandoff:ge,clearHandoff:$e,refresh:Ze}}function Xt({isOpen:l,onClose:n,roadmapTitle:v,handoffPayload:f,isLoading:_,error:j,onFetchHandoff:S,onCopyToClipboard:m}){return l?e.jsx("div",{className:"modal-overlay open",onClick:n,role:"presentation",children:e.jsxs("div",{className:"modal modal-lg",onClick:F=>F.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":"handoff-modal-title",children:[e.jsxs("div",{className:"modal-header",children:[e.jsxs("h2",{id:"handoff-modal-title",children:["Export Roadmap: ",v]}),e.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close modal",children:e.jsx(re,{size:18})})]}),e.jsxs("div",{className:"modal-body",children:[e.jsx("p",{className:"text-muted",style:{marginBottom:"var(--space-lg)"},children:"Export roadmap data for use in mission and task planning flows. This is a read-only export — no missions or tasks will be created."}),j&&e.jsxs("div",{className:"form-error",style:{marginBottom:"var(--space-lg)"},children:["Error loading handoff data: ",j.message]}),!f&&!_&&e.jsx("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:e.jsxs("button",{className:"btn btn-primary",onClick:S,children:[e.jsx(rt,{size:16,style:{marginRight:"var(--space-sm)"}}),"Load Handoff Data"]})}),_&&e.jsxs("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:[e.jsx(qt,{size:24,className:"spin"}),e.jsx("p",{style:{marginTop:"var(--space-md)"},children:"Loading handoff data..."})]}),f&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{marginBottom:"var(--space-lg)"},children:[e.jsx("h3",{style:{marginBottom:"var(--space-sm)"},children:"Mission Planning Handoff"}),e.jsx("div",{className:"card",style:{padding:"var(--space-md)"},children:e.jsx("pre",{style:{whiteSpace:"pre-wrap",fontSize:"12px",maxHeight:"200px",overflow:"auto"},children:JSON.stringify(f.mission,null,2)})})]}),e.jsxs("div",{style:{marginBottom:"var(--space-lg)"},children:[e.jsxs("h3",{style:{marginBottom:"var(--space-sm)"},children:["Feature Task Planning Handoffs (",f.features.length,")"]}),e.jsx("div",{className:"card",style:{padding:"var(--space-md)"},children:e.jsx("pre",{style:{whiteSpace:"pre-wrap",fontSize:"12px",maxHeight:"300px",overflow:"auto"},children:JSON.stringify(f.features,null,2)})})]})]})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("div",{className:"modal-actions-left",children:f&&e.jsxs("button",{className:"btn btn-sm",onClick:m,children:[e.jsx(Wt,{size:14,style:{marginRight:"var(--space-xs)"}}),"Copy to Clipboard"]})}),e.jsx("div",{className:"modal-actions-right",children:e.jsx("button",{className:"btn",onClick:n,children:"Close"})})]})]})}):null}function Zt({roadmap:l,isSelected:n,onSelect:v,onEdit:f,onDelete:_,onExport:j}){const S=C=>{C.key==="Enter"&&v()},m=C=>{C.stopPropagation(),f()},F=C=>{C.stopPropagation(),_()},E=C=>{C.stopPropagation(),j()};return e.jsxs("div",{className:`roadmaps-view__sidebar-item${n?" roadmaps-view__sidebar-item--active":""}`,onClick:v,onKeyDown:S,role:"button",tabIndex:0,"aria-selected":n,"data-testid":`roadmap-item-${l.id}`,children:[e.jsxs("div",{className:"roadmaps-view__sidebar-item-content",children:[e.jsx("div",{className:"roadmaps-view__sidebar-item-title",children:l.title}),l.description&&e.jsx("div",{className:"roadmaps-view__sidebar-item-desc",children:l.description})]}),e.jsxs("div",{className:"roadmaps-view__sidebar-item-actions",onClick:m,role:"presentation",children:[e.jsx("span",{className:"roadmaps-view__icon-btn",onClick:E,role:"button",title:"Export roadmap","aria-label":"Export roadmap","data-testid":`roadmap-export-${l.id}`,tabIndex:0,children:e.jsx(rt,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn",onClick:m,role:"button",title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`roadmap-edit-${l.id}`,tabIndex:0,children:e.jsx(Fe,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:F,role:"button",title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`roadmap-delete-${l.id}`,tabIndex:0,children:e.jsx(Pe,{size:14})})]})]})}function Qt({roadmaps:l,selectedRoadmapId:n,onSelect:v,onCreate:f,onEdit:_,onDelete:j,onExport:S,showCreateForm:m,onCancelCreate:F,onSaveCreate:E}){return e.jsxs("div",{className:"roadmaps-view__mobile-list","data-testid":"roadmaps-view__mobile-list",children:[e.jsxs("div",{className:"roadmaps-view__mobile-list-header",children:[e.jsx("h2",{className:"roadmaps-view__mobile-list-title",children:"Roadmaps"}),!m&&e.jsx("button",{className:"roadmaps-view__mobile-add-btn",onClick:f,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-create-roadmap-btn",children:e.jsx(Ae,{size:18})})]}),m&&e.jsx("div",{className:"roadmaps-view__mobile-create-form",children:e.jsx(mt,{onSave:E,onCancel:F})}),l.length===0&&!m?e.jsxs("div",{className:"roadmaps-view__mobile-empty",children:[e.jsx("p",{children:"No roadmaps yet."}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:f,children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Create Roadmap"})]})]}):e.jsx("div",{className:"roadmaps-view__mobile-list-items",children:l.map(C=>e.jsxs("div",{className:`roadmaps-view__mobile-item${C.id===n?" roadmaps-view__mobile-item--active":""}`,onClick:()=>v(C.id),role:"button",tabIndex:0,onKeyDown:y=>{y.key==="Enter"&&v(C.id)},"data-testid":`mobile-roadmap-item-${C.id}`,children:[e.jsxs("div",{className:"roadmaps-view__mobile-item-content",children:[e.jsx("span",{className:"roadmaps-view__mobile-item-title",children:C.title}),C.description&&e.jsx("span",{className:"roadmaps-view__mobile-item-desc",children:C.description})]}),e.jsxs("div",{className:"roadmaps-view__mobile-item-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),S(C)},title:"Export roadmap","aria-label":"Export roadmap","data-testid":`mobile-roadmap-export-${C.id}`,children:e.jsx(rt,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),_(C)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`mobile-roadmap-edit-${C.id}`,children:e.jsx(Fe,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:y=>{y.stopPropagation(),j(C.id)},title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`mobile-roadmap-delete-${C.id}`,children:e.jsx(Pe,{size:16})})]})]},C.id))})]})}function ea({roadmapTitle:l,onBack:n,onEdit:v,onDelete:f,onCreate:_}){return e.jsxs("div",{className:"roadmaps-view__mobile-header","data-testid":"roadmaps-view__mobile-header",children:[e.jsx("button",{className:"roadmaps-view__mobile-back-btn",onClick:n,title:"Back to roadmap list","aria-label":"Back to roadmap list","data-testid":"mobile-back-btn",children:e.jsx(Kt,{size:20})}),e.jsx("h2",{className:"roadmaps-view__mobile-header-title",children:l}),e.jsxs("div",{className:"roadmaps-view__mobile-header-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:_,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-header-create-btn",children:e.jsx(Ae,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:v,title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"mobile-header-edit-btn",children:e.jsx(Fe,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:f,title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"mobile-header-delete-btn",children:e.jsx(Pe,{size:18})})]})]})}function ta({milestone:l,features:n,onEditMilestone:v,onDeleteMilestone:f,onAddFeature:_,onEditFeature:j,onDeleteFeature:S,milestoneEdit:m,onStartMilestoneEdit:F,onCancelMilestoneEdit:E,onSaveMilestoneEdit:C,featureEdit:y,onStartFeatureEdit:se,onCancelFeatureEdit:V,onSaveFeatureEdit:A,projectId:$,addToast:De,isMilestoneDragging:ne,isMilestoneDropTarget:fe,milestoneDropPosition:ie,onMilestoneDragStart:Be,onMilestoneDragEnd:oe,onMilestoneDragOver:be,onMilestoneDrop:G,onMilestoneDragLeave:B,isFeatureDragging:P,isFeatureDropTarget:X,featureDropIndex:H,onFeatureDragStart:Me,onFeatureDragEnd:le,onFeatureDragOver:Y,onFeatureDrop:ce,onFeatureDragLeave:Z,onFeatureDropOnMilestone:Re,featureSuggestions:D,isGeneratingFeatureSuggestions:Q,onGenerateFeatureSuggestions:He,onAcceptFeatureSuggestion:x,onAcceptAllFeatureSuggestions:de,onUpdateFeatureSuggestionDraft:ve,onClearFeatureSuggestions:R}){const xe=m?.milestoneId===l.id,q=h=>{h.key==="Enter"?(h.preventDefault(),m&&C({title:m.value})):h.key==="Escape"&&E()},N=h=>{h.key==="Escape"&&E()},Oe=["roadmaps-view__milestone",ne?"roadmaps-view__milestone--dragging":"",fe?"roadmaps-view__milestone--drop-target":"",fe&&ie==="before"?"roadmaps-view__milestone--drop-before":"",fe&&ie==="after"?"roadmaps-view__milestone--drop-after":""].filter(Boolean).join(" "),we=["roadmaps-view__feature-list",X?"roadmaps-view__feature-list--drop-target":""].filter(Boolean).join(" ");return e.jsxs("div",{className:Oe,draggable:!xe,onDragStart:h=>{xe||(Be(l.id),h.dataTransfer.setData("text/plain",`milestone:${l.id}`),h.dataTransfer.effectAllowed="move")},onDragEnd:oe,onDragOver:h=>{h.dataTransfer.types.includes("text/plain")&&h.dataTransfer.types.includes("text/plain")&&(h.preventDefault(),h.dataTransfer.dropEffect="move",be(l.id))},onDrop:h=>{h.preventDefault(),h.dataTransfer.getData("text/plain")?.startsWith("feature:")||G(l.id)},onDragLeave:B,"data-testid":`milestone-card-${l.id}`,children:[e.jsx("div",{className:"roadmaps-view__milestone-header",children:xe?e.jsxs("div",{className:"roadmaps-view__inline-edit",children:[e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${l.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:m.value,onChange:()=>F(),onKeyDown:q,placeholder:"Milestone title",autoFocus:!0,"data-testid":`milestone-title-input-${l.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>C({title:m.value}),"aria-label":"Save milestone title",title:"Save",children:e.jsx(he,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:E,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(re,{size:14})})]}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:m.field==="description"?m.value:l.description||"",onChange:()=>{},onKeyDown:N,placeholder:"Milestone description (optional)",rows:2,"data-testid":`milestone-desc-input-${l.id}`})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__milestone-title-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${l.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("h3",{className:"roadmaps-view__milestone-title",children:l.title}),e.jsxs("div",{className:"roadmaps-view__milestone-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:v,title:"Edit milestone","aria-label":"Edit milestone","data-testid":`milestone-edit-${l.id}`,children:e.jsx(Fe,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:f,title:"Delete milestone","aria-label":"Delete milestone","data-testid":`milestone-delete-${l.id}`,children:e.jsx(Pe,{size:14})})]})]}),l.description&&e.jsx("p",{className:"roadmaps-view__milestone-desc",children:l.description})]})}),e.jsxs("div",{className:"roadmaps-view__milestone-actions-bar",children:[e.jsxs("button",{className:"roadmaps-view__add-feature-btn",onClick:_,title:"Add feature","aria-label":"Add feature","data-testid":`add-feature-${l.id}`,children:[e.jsx(Ae,{size:12}),e.jsx("span",{children:"Add Feature"})]}),e.jsxs("button",{className:"roadmaps-view__suggest-btn",onClick:()=>{He?.()},disabled:Q??!1,title:"Generate feature suggestions with AI","aria-label":"Generate feature suggestions","data-testid":`generate-features-${l.id}`,children:[e.jsx(pt,{size:12}),e.jsx("span",{children:Q?"Generating...":"AI Suggestions"})]})]}),e.jsxs("div",{className:we,onDragOver:h=>{h.preventDefault(),h.dataTransfer.dropEffect="move",h.dataTransfer.getData("text/plain")?.startsWith("feature:")&&Re()},onDrop:h=>{h.preventDefault();const I=h.dataTransfer.getData("text/plain");I?.startsWith("feature:")&&ce(I.split(":")[1],n.length)},onDragLeave:Z,children:[n.length===0?e.jsx("p",{className:"roadmaps-view__empty-features",children:"No features yet."}):n.map((h,I)=>{const je=y?.featureId===h.id,J=P(h.id),_e=M=>{M.key==="Enter"?(M.preventDefault(),y&&A({title:y.value})):M.key==="Escape"&&V()},Le=["roadmaps-view__feature-item",J?"roadmaps-view__feature-item--dragging":"",X&&H===I?"roadmaps-view__feature-item--drop-before":"",X&&H===I+1?"roadmaps-view__feature-item--drop-after":""].filter(Boolean).join(" ");return e.jsx("div",{className:Le,draggable:!je,onDragStart:M=>{je||(Me(h.id,l.id),M.dataTransfer.setData("text/plain",`feature:${h.id}`),M.dataTransfer.effectAllowed="move")},onDragEnd:le,onDragOver:M=>{if(M.preventDefault(),M.stopPropagation(),M.dataTransfer.dropEffect="move",M.dataTransfer.getData("text/plain")?.startsWith("feature:")){const O=M.currentTarget.getBoundingClientRect(),ee=O.top+O.height/2,te=M.clientY<ee?"before":"after";Y(h.id,te)}},onDrop:M=>{M.preventDefault(),M.stopPropagation();const ue=M.dataTransfer.getData("text/plain");if(ue?.startsWith("feature:")){const O=ue.split(":")[1],ee=M.currentTarget.getBoundingClientRect(),te=ee.top+ee.height/2,Ie=M.clientY<te?"before":"after";let pe=I;Ie==="after"&&(pe=I+1),ce(O,pe)}},onDragLeave:Z,"data-testid":`feature-item-${h.id}`,children:je?e.jsx("div",{className:"roadmaps-view__inline-edit roadmaps-view__inline-edit--compact",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Ye,{size:12})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:y.value,onChange:()=>{},onKeyDown:_e,placeholder:"Feature title",autoFocus:!0,"data-testid":`feature-title-input-${h.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>A({title:y.value}),"aria-label":"Save feature title",title:"Save",children:e.jsx(he,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:V,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(re,{size:14})})]})}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Ye,{size:12})}),e.jsxs("div",{className:"roadmaps-view__feature-content",children:[e.jsx("span",{className:"roadmaps-view__feature-title",children:h.title}),h.description&&e.jsx("p",{className:"roadmaps-view__feature-desc",children:h.description})]}),e.jsxs("div",{className:"roadmaps-view__feature-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>j(h.id),title:"Edit feature","aria-label":"Edit feature","data-testid":`feature-edit-${h.id}`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>S(h.id),title:"Delete feature","aria-label":"Delete feature","data-testid":`feature-delete-${h.id}`,children:e.jsx(Pe,{size:12})})]})]})},h.id)}),D&&D.length>0&&e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h4",{className:"roadmap-suggestion-title",children:"AI Feature Suggestions"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-accept-all-btn",onClick:()=>de?.(),title:"Accept all suggestions","aria-label":"Accept all","data-testid":`accept-all-features-${l.id}`,children:"Accept All"}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:()=>R?.(),title:"Clear suggestions","aria-label":"Clear","data-testid":`clear-features-${l.id}`,children:"Clear"})]})]}),e.jsx("div",{className:"roadmap-suggestion-list",children:D.map(h=>e.jsx(aa,{suggestion:h,onUpdateDraft:I=>ve?.(l.id,h.id,I),onAccept:()=>{x?.(l.id,h.id)},testIdPrefix:`feature-suggestion-${l.id}`},h.id))})]})]})]})}function aa({suggestion:l,onUpdateDraft:n,onAccept:v,testIdPrefix:f}){const[_,j]=a.useState(!1),[S,m]=a.useState(l.title),[F,E]=a.useState(l.description||""),C=()=>{m(l.title),E(l.description||""),j(!0)},y=()=>{n({title:S.trim(),description:F.trim()||void 0}),j(!1)},se=()=>{m(l.title),E(l.description||""),j(!1)},V=()=>{l.title.trim()&&v()},A=l.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:S,onChange:$=>m($.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:F,onChange:$=>E($.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${f}-${l.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:y,disabled:!S.trim(),title:"Save","data-testid":`${f}-${l.id}-save`,children:e.jsx(he,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:se,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(re,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${f}-${l.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:l.title}),l.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:l.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:C,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:V,disabled:!A,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(he,{size:12})})]})]})}function ut({suggestion:l,onUpdateDraft:n,onAccept:v,testIdPrefix:f}){const[_,j]=a.useState(!1),[S,m]=a.useState(l.title),[F,E]=a.useState(l.description||""),C=()=>{m(l.title),E(l.description||""),j(!0)},y=()=>{n({title:S.trim(),description:F.trim()||void 0}),j(!1)},se=()=>{m(l.title),E(l.description||""),j(!1)},V=()=>{l.title.trim()&&v()},A=l.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:S,onChange:$=>m($.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:F,onChange:$=>E($.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${f}-${l.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:y,disabled:!S.trim(),title:"Save","data-testid":`${f}-${l.id}-save`,children:e.jsx(he,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:se,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(re,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${f}-${l.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:l.title}),l.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:l.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:C,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:V,disabled:!A,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(he,{size:12})})]})]})}function mt({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form","data-testid":"create-roadmap-form",children:e.jsxs("form",{onSubmit:S,children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Roadmap title",autoFocus:!0,"data-testid":"create-roadmap-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Roadmap description (optional)",rows:2,"data-testid":"create-roadmap-description"}),e.jsxs("div",{className:"roadmaps-view__create-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__btn roadmaps-view__btn--primary",disabled:!v.trim(),"data-testid":"create-roadmap-submit",children:"Create"}),e.jsx("button",{type:"button",className:"roadmaps-view__btn",onClick:n,"data-testid":"create-roadmap-cancel",children:"Cancel"})]})]})})}function ra({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-milestone-form",children:e.jsxs("form",{onSubmit:S,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":"create-milestone-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-milestone-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!v.trim(),"aria-label":"Save milestone",title:"Save","data-testid":"create-milestone-submit",children:e.jsx(he,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:n,"aria-label":"Cancel",title:"Cancel","data-testid":"create-milestone-cancel",children:e.jsx(re,{size:14})})]})]})})}function sa({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-feature-form",children:e.jsxs("form",{onSubmit:S,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":"create-feature-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-feature-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!v.trim(),"aria-label":"Save feature",title:"Save","data-testid":"create-feature-submit",children:e.jsx(he,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:n,"aria-label":"Cancel",title:"Cancel","data-testid":"create-feature-cancel",children:e.jsx(re,{size:14})})]})]})})}function ca({projectId:l,addToast:n}){const{confirm:v}=Lt(),f=Vt()==="mobile",{roadmaps:_,selectedRoadmapId:j,selectedRoadmap:S,milestones:m,featuresByMilestoneId:F,loading:E,error:C,createRoadmap:y,updateRoadmap:se,deleteRoadmap:V,selectRoadmap:A,createMilestone:$,updateMilestone:De,deleteMilestone:ne,createFeature:fe,updateFeature:ie,deleteFeature:Be,reorderMilestones:oe,reorderFeatures:be,moveFeature:G,milestoneSuggestions:B,isGeneratingSuggestions:P,generateMilestoneSuggestions:X,updateMilestoneSuggestionDraft:H,acceptMilestoneSuggestion:Me,acceptAllMilestoneSuggestions:le,clearMilestoneSuggestions:Y,featureSuggestionsByMilestoneId:ce,isGeneratingFeatureSuggestions:Z,generateFeatureSuggestions:Re,updateFeatureSuggestionDraft:D,acceptFeatureSuggestion:Q,acceptAllFeatureSuggestions:He,clearFeatureSuggestions:x,handoffPayload:de,isFetchingHandoff:ve,handoffError:R,fetchHandoff:xe,clearHandoff:q}=Jt({projectId:l}),[N,Oe]=a.useState(!1),[we,h]=a.useState(null),[I,je]=a.useState(""),[J,_e]=a.useState(""),[Le,M]=a.useState(!1),ue=a.useRef(null);a.useEffect(()=>{ue.current!==null&&ue.current!==j&&M(!1),ue.current=j},[j]);const[O,ee]=a.useState({roadmapId:null,field:null,value:""}),[te,Ie]=a.useState({milestoneId:null,field:null,value:""}),[pe,Ue]=a.useState({featureId:null,field:null,value:""}),[me,U]=a.useState({type:null,parentId:void 0,title:"",description:""}),[qe,Te]=a.useState(!1),[Ce,Ge]=a.useState({draggingId:null,dropTargetId:null,dropPosition:null}),Je=a.useCallback(t=>{Ge(u=>({...u,draggingId:t}))},[]),ye=a.useCallback(()=>{Ge({draggingId:null,dropTargetId:null,dropPosition:null})},[]),Xe=a.useCallback(t=>{Ge(u=>u.draggingId===t?u:{...u,dropTargetId:t,dropPosition:null})},[]),[ge,$e]=a.useState({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}),Ze=a.useCallback((t,u)=>{$e(b=>({...b,draggingId:t,draggingMilestoneId:u}))},[]),r=a.useCallback(()=>{$e({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null})},[]),c=a.useCallback((t,u)=>{$e(b=>{if(b.draggingId===t)return b;const L=(F[b.draggingMilestoneId||""]||[]).findIndex(Ee=>Ee.id===t);let W;return u==="before"?W=L:W=L+1,{...b,dropTargetMilestoneId:b.draggingMilestoneId,dropTargetIndex:W,dropPosition:u}})},[F]),i=a.useCallback(()=>{$e(t=>({...t,dropTargetMilestoneId:t.draggingMilestoneId,dropTargetIndex:(F[t.draggingMilestoneId||""]||[]).length}))},[F]),s=a.useCallback(async(t,u)=>{const{draggingMilestoneId:b,dropTargetMilestoneId:z}=ge;if(!b){r();return}const L=z||b,W=F[b]||[],Ee=W.find(ke=>ke.id===t);if(!Ee){r();return}if(b!==L){if(b===L){r();return}try{await G(t,L,u,{onError:ke=>{n(`Failed to move feature: ${ke.message}`,"error")}})}catch{}}else{const ke=[...W],Nt=ke.findIndex(ze=>ze.id===t);ke.splice(Nt,1),ke.splice(u,0,Ee);const dt=ke.map(ze=>ze.id),St=W.map(ze=>ze.id);if(dt.join(",")===St.join(",")){r();return}try{await be(b,dt,{onError:ze=>{n(`Failed to reorder features: ${ze.message}`,"error")}})}catch{}}r()},[ge,F,be,G,n,r]),d=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),b=t.clientX,z=t.clientY;(b<u.left||b>u.right||z<u.top||z>u.bottom)&&$e(L=>({...L,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}))},[]),o=a.useCallback(t=>ge.draggingId===t,[ge.draggingId]),g=a.useCallback(async t=>{const{draggingId:u}=Ce;if(!u||u===t){ye();return}const b=m.map(Ee=>Ee.id),z=b.indexOf(u),L=b.indexOf(t);if(z===-1||L===-1){ye();return}const W=[...b];if(W.splice(z,1),W.splice(L,0,u),W.join(",")===b.join(",")){ye();return}try{await oe(j,W,{onError:Ee=>{n(`Failed to reorder milestones: ${Ee.message}`,"error")}})}catch{}ye()},[Ce,m,j,oe,n,ye]),p=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),b=t.clientX,z=t.clientY;(b<u.left||b>u.right||z<u.top||z>u.bottom)&&Ge(L=>({...L,dropTargetId:null,dropPosition:null}))},[]),w=a.useCallback(t=>{A(t.id),ee({roadmapId:t.id,field:"title",value:t.title})},[A]),T=a.useCallback(()=>{ee({roadmapId:null,field:null,value:""})},[]),Ne=a.useCallback(async t=>{if(O.roadmapId)try{await se(O.roadmapId,t,{onError:u=>n(u.message,"error")}),T()}catch{}},[O.roadmapId,se,T,n]),ae=a.useCallback(async t=>{if(await v({title:"Delete Roadmap",message:"Delete this roadmap? This cannot be undone.",danger:!0}))try{await V(t,{onError:b=>n(b.message,"error")}),n("Roadmap deleted","success")}catch{}},[V,n,v]),Ve=a.useCallback((t,u)=>{h(t),je(u),Oe(!0),q()},[q]),k=a.useCallback(()=>{Oe(!1),h(null),je(""),q()},[q]),K=a.useCallback(()=>{we&&xe(we,{onError:t=>n(`Failed to load handoff: ${t.message}`,"error")})},[we,xe,n]),Ke=a.useCallback(()=>{if(de){const t=JSON.stringify(de,null,2);navigator.clipboard.writeText(t).then(()=>{n("Handoff data copied to clipboard","success")}).catch(()=>{n("Failed to copy to clipboard","error")})}},[de,n]),We=a.useCallback(async t=>{try{await y(t,{onError:u=>n(u.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Roadmap created","success")}catch{}},[y,n]),st=a.useCallback(t=>{Ie({milestoneId:t.id,field:"title",value:t.title})},[]),Qe=a.useCallback(()=>{Ie({milestoneId:null,field:null,value:""})},[]),gt=a.useCallback(async t=>{if(te.milestoneId)try{await De(te.milestoneId,t,{onError:u=>n(u.message,"error")}),Qe()}catch{}},[te.milestoneId,De,Qe,n]),ht=a.useCallback(async t=>{if(await v({title:"Delete Milestone",message:"Delete this milestone and all its features?",danger:!0}))try{await ne(t,{onError:b=>n(b.message,"error")}),n("Milestone deleted","success")}catch{}},[ne,n,v]),ft=a.useCallback(async t=>{try{await $(t,{onError:u=>n(u.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Milestone created","success")}catch{}},[$,n]),nt=a.useCallback((t,u,b)=>{Ue({featureId:t,field:"title",value:u})},[]),et=a.useCallback(()=>{Ue({featureId:null,field:null,value:""})},[]),bt=a.useCallback(async t=>{if(pe.featureId)try{await ie(pe.featureId,t,{onError:u=>n(u.message,"error")}),et()}catch{}},[pe.featureId,ie,et,n]),vt=a.useCallback(async t=>{if(await v({title:"Delete Feature",message:"Delete this feature?",danger:!0}))try{await Be(t,{onError:b=>n(b.message,"error")}),n("Feature deleted","success")}catch{}},[Be,n,v]),it=a.useCallback(async()=>{if(J.trim())try{await X(J,5,{onError:t=>n(t.message,"error")})}catch{}},[J,X,n]),ot=a.useCallback(async t=>{try{await Me(t,{onError:u=>n(u.message,"error")}),n("Milestone added","success")}catch{}},[Me,n]),lt=a.useCallback(async()=>{try{await le({onError:t=>n(t.message,"error")}),n(`${B.length} milestones added`,"success"),_e("")}catch{}},[le,B.length,n]),ct=a.useCallback(()=>{Y(),_e("")},[Y]),xt=a.useCallback(async t=>{try{await Re(t,{count:5},{onError:u=>n(u.message,"error")})}catch{}},[Re,n]),wt=a.useCallback(async(t,u)=>{try{await Q(t,u,{onError:b=>n(b.message,"error")}),n("Feature added","success")}catch{}},[Q,n]),jt=a.useCallback((t,u,b)=>{D(t,u,b)},[D]),_t=a.useCallback(async t=>{const u=ce[t]||[];try{await He(t,{onError:b=>n(b.message,"error")}),n(`${u.length} features added`,"success")}catch{}},[He,ce,n]),Ct=a.useCallback(t=>{x(t)},[x]),yt=a.useCallback(async(t,u)=>{try{await fe(t,u,{onError:b=>n(b.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Feature created","success")}catch{}},[fe,n]),Se=j;return E&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--loading",children:e.jsx("div",{className:"roadmaps-view__loading-state",children:"Loading roadmaps..."})}):C&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--error",children:e.jsxs("div",{className:"roadmaps-view__error-state",children:[e.jsx("p",{children:"Failed to load roadmaps"}),e.jsx("p",{className:"roadmaps-view__error-msg",children:C.message})]})}):e.jsxs("div",{className:"roadmaps-view",children:[f&&!Se&&e.jsx(Qt,{roadmaps:_,selectedRoadmapId:Se,onSelect:t=>A(t),onCreate:()=>Te(!0),onEdit:w,onDelete:ae,onExport:t=>Ve(t.id,t.title),showCreateForm:qe,onCancelCreate:()=>Te(!1),onSaveCreate:async t=>{await We(t),Te(!1)}}),!f&&e.jsxs("aside",{className:"roadmaps-view__sidebar","aria-label":"Roadmaps",children:[e.jsxs("div",{className:"roadmaps-view__sidebar-header",children:[e.jsx("h2",{className:"roadmaps-view__sidebar-title",children:"Roadmaps"}),e.jsx("button",{className:"roadmaps-view__add-btn",onClick:()=>U({type:"roadmap",title:"",description:""}),title:"Create roadmap","aria-label":"Create roadmap","data-testid":"create-roadmap-btn",children:e.jsx(Ae,{size:16})})]}),me.type==="roadmap"&&e.jsx(mt,{onSave:We,onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})}),e.jsx("div",{className:"roadmaps-view__sidebar-list",children:_.length===0?e.jsx("p",{className:"roadmaps-view__empty-sidebar",children:"No roadmaps yet. Click + to create one."}):_.map(t=>e.jsx(Zt,{roadmap:t,isSelected:t.id===Se,onSelect:()=>A(t.id),onEdit:()=>w(t),onDelete:()=>ae(t.id),onExport:()=>Ve(t.id,t.title)},t.id))})]}),e.jsxs("main",{className:"roadmaps-view__main","aria-label":"Roadmap content",children:[f&&Se&&e.jsx(ea,{roadmapTitle:S?.title||"Untitled Roadmap",onBack:()=>A(null),onEdit:()=>{S&&w(S)},onDelete:()=>ae(Se),onCreate:()=>Te(!0)}),Se?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"roadmaps-view__roadmap-header",children:O.roadmapId===Se?e.jsx("div",{className:"roadmaps-view__inline-edit",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input roadmaps-view__inline-input--large",value:O.value,onChange:t=>ee(u=>({...u,value:t.target.value})),onKeyDown:t=>{t.key==="Enter"?Ne({title:O.value}):t.key==="Escape"&&T()},placeholder:"Roadmap title",autoFocus:!0,"data-testid":"roadmap-title-input"}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>Ne({title:O.value}),"aria-label":"Save",title:"Save",children:e.jsx(he,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:T,"aria-label":"Cancel",title:"Cancel",children:e.jsx(re,{size:16})})]})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__roadmap-title-row",children:[e.jsx("h1",{className:"roadmaps-view__roadmap-title",children:S?.title||"Untitled Roadmap"}),e.jsxs("div",{className:"roadmaps-view__roadmap-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>{S&&w(S)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"edit-roadmap-btn",children:e.jsx(Fe,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>ae(Se),title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"delete-roadmap-btn",children:e.jsx(Pe,{size:16})})]})]}),S?.description&&e.jsx("p",{className:"roadmaps-view__roadmap-desc",children:S.description})]})}),f?Le?e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"}),e.jsx("button",{className:"roadmap-suggestion-collapse-btn",onClick:()=>M(!1),"aria-label":"Collapse suggestion panel","data-testid":"collapse-suggestion-panel-btn",children:e.jsx(Ut,{size:16})})]}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:J,onChange:t=>_e(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:P||!j,"data-testid":"goal-prompt-input",autoFocus:!0}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:it,disabled:!J.trim()||P||!j,"data-testid":"generate-suggestions-btn",children:P?"Generating...":"Generate Milestones"}),B.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:lt,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",B.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ct,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(re,{size:14})})]})]})]}),B.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:B.map(t=>e.jsx(ut,{suggestion:t,onUpdateDraft:u=>H(t.id,u),onAccept:()=>ot(t.id),testIdPrefix:"suggestion"},t.id))})]}):e.jsx("div",{className:"roadmap-suggestion-section",children:e.jsxs("button",{className:"roadmap-suggestion-expand-btn",onClick:()=>M(!0),disabled:!j,"data-testid":"expand-suggestion-panel-btn",children:[e.jsx(pt,{size:16}),"Generate Milestone Ideas"]})}):e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsx("div",{className:"roadmap-suggestion-header",children:e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"})}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:J,onChange:t=>_e(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:P||!j,"data-testid":"goal-prompt-input"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:it,disabled:!J.trim()||P||!j,"data-testid":"generate-suggestions-btn",children:P?"Generating...":"Generate Milestones"}),B.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:lt,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",B.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ct,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(re,{size:14})})]})]})]}),B.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:B.map(t=>e.jsx(ut,{suggestion:t,onUpdateDraft:u=>H(t.id,u),onAccept:()=>ot(t.id),testIdPrefix:"suggestion"},t.id))})]}),e.jsxs("div",{className:"roadmaps-view__milestone-lanes",children:[me.type==="milestone"&&e.jsx(ra,{onSave:ft,onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})}),m.length===0&&me.type!=="milestone"?e.jsxs("div",{className:"roadmaps-view__empty-milestones",children:[e.jsx("p",{children:"This roadmap has no milestones."}),e.jsxs("button",{className:"roadmaps-view__add-milestone-btn",onClick:()=>U({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn-empty",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]})]}):e.jsxs(e.Fragment,{children:[me.type!=="milestone"&&e.jsxs("button",{className:"roadmaps-view__add-milestone-fab",onClick:()=>U({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]}),m.map(t=>e.jsx(ta,{milestone:t,features:F[t.id]||[],onEditMilestone:()=>st(t),onDeleteMilestone:()=>ht(t.id),onAddFeature:()=>U({type:"feature",parentId:t.id,title:"",description:""}),onEditFeature:u=>{const b=F[t.id]?.find(z=>z.id===u);b&&nt(u,b.title,b.description)},onDeleteFeature:vt,milestoneEdit:te,onStartMilestoneEdit:()=>st(t),onCancelMilestoneEdit:Qe,onSaveMilestoneEdit:gt,featureEdit:pe,onStartFeatureEdit:nt,onCancelFeatureEdit:et,onSaveFeatureEdit:bt,projectId:l,addToast:n,isMilestoneDragging:Ce.draggingId===t.id,isMilestoneDropTarget:Ce.dropTargetId===t.id,milestoneDropPosition:Ce.dropTargetId===t.id?Ce.dropPosition:null,onMilestoneDragStart:Je,onMilestoneDragEnd:ye,onMilestoneDragOver:Xe,onMilestoneDrop:g,onMilestoneDragLeave:p,isFeatureDragging:o,isFeatureDropTarget:ge.dropTargetMilestoneId===t.id,featureDropIndex:ge.dropTargetMilestoneId===t.id?ge.dropTargetIndex:null,onFeatureDragStart:Ze,onFeatureDragEnd:r,onFeatureDragOver:c,onFeatureDrop:s,onFeatureDragLeave:d,onFeatureDropOnMilestone:i,featureSuggestions:ce[t.id],isGeneratingFeatureSuggestions:Z(t.id),onGenerateFeatureSuggestions:()=>xt(t.id),onAcceptFeatureSuggestion:u=>wt(t.id,u),onAcceptAllFeatureSuggestions:()=>_t(t.id),onUpdateFeatureSuggestionDraft:(u,b,z)=>jt(u,b,z),onClearFeatureSuggestions:()=>Ct(t.id)},t.id))]})]})]}):e.jsx("div",{className:"roadmaps-view__empty-main",children:e.jsx("p",{children:"Select a roadmap from the sidebar to view its milestones."})})]}),me.type==="feature"&&me.parentId&&e.jsx("div",{className:"roadmaps-view__feature-create-overlay",children:e.jsx(sa,{onSave:t=>yt(me.parentId,t),onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})})}),e.jsx(Xt,{isOpen:N,onClose:k,roadmapId:we||"",roadmapTitle:I,handoffPayload:de,isLoading:ve,error:R,onFetchHandoff:K,onCopyToClipboard:Ke})]})}export{ca as RoadmapsView};
6
+ */const Yt=[["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m16.2 7.8 2.9-2.9",key:"r700ao"}],["path",{d:"M18 12h4",key:"wj9ykh"}],["path",{d:"m16.2 16.2 2.9 2.9",key:"1bxg5t"}],["path",{d:"M12 18v4",key:"jadmvz"}],["path",{d:"m4.9 19.1 2.9-2.9",key:"bwix9q"}],["path",{d:"M2 12h4",key:"j09sii"}],["path",{d:"m4.9 4.9 2.9 2.9",key:"giyufr"}]],Jt=Et("loader",Yt);function qt(l){const n=l?.projectId,[v,f]=a.useState([]),[_,j]=a.useState(null),[S,m]=a.useState(null),[F,E]=a.useState([]),[C,y]=a.useState({}),[se,V]=a.useState(!1),[A,$]=a.useState(null),[De,ne]=a.useState(null),[fe,ie]=a.useState(!1),[Be,oe]=a.useState(null),[be,T]=a.useState([]),[B,P]=a.useState(!1),[X,O]=a.useState({}),[Me,le]=a.useState({}),Y=a.useRef(X),ce=a.useRef(Me),Z=a.useRef(be);Y.current=X,ce.current=Me,Z.current=be;const Re=a.useRef(n),D=a.useRef(0),Q=a.useRef(0),Oe=a.useRef(v),x=a.useRef(_),de=a.useRef(F),ve=a.useRef(C),R=a.useRef(n),xe=a.useRef(De);Oe.current=v,x.current=_,de.current=F,ve.current=C,R.current=n,xe.current=De,a.useEffect(()=>{Re.current!==n&&(Re.current=n,D.current++,j(null),m(null),E([]),y({}),ne(null),oe(null),T([]),P(!1),O({}),le({}))},[n]);const J=a.useCallback(async()=>{V(!0),$(null);try{const r=await kt(n);f(r)}catch(r){$(r instanceof Error?r:new Error("Failed to fetch roadmaps"))}finally{V(!1)}},[n]),N=a.useCallback(async r=>{try{const c=await Ft(r,n);m(c),E(c.milestones||[]);const i={};for(const s of c.milestones||[])i[s.id]=s.features||[];y(i)}catch(c){$(c instanceof Error?c:new Error("Failed to fetch roadmap"))}},[n]);a.useEffect(()=>{J()},[J]),a.useEffect(()=>{_?N(_):(m(null),E([]),y({}))},[_,N]);const He=a.useCallback(async(r,c)=>{try{const i=await Dt(r,R.current);f(s=>[...s,i]),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to create roadmap");throw c?.onError?.(s),s}},[]),we=a.useCallback(async(r,c,i)=>{try{const s=await Mt(r,c,R.current);f(d=>d.map(o=>o.id===r?s:o)),x.current===r&&m(d=>d?{...d,...s}:null),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update roadmap");throw i?.onError?.(d),d}},[]),h=a.useCallback(async(r,c)=>{try{await Rt(r,R.current),f(i=>i.filter(s=>s.id!==r)),x.current===r&&(j(null),m(null),E([]),y({})),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete roadmap");throw c?.onError?.(s),s}},[]),I=a.useCallback(r=>{j(r)},[]),je=a.useCallback(async(r,c)=>{const i=x.current;if(!i){const s=new Error("No roadmap selected");throw c?.onError?.(s),s}try{const s=await tt(i,r,R.current);E(d=>[...d,s]),y(d=>({...d,[s.id]:[]})),x.current&&N(x.current),c?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create milestone");throw c?.onError?.(d),d}},[N]),q=a.useCallback(async(r,c,i)=>{try{const s=await It(r,c,R.current);E(d=>d.map(o=>o.id===r?s:o)),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update milestone");throw i?.onError?.(d),d}},[N]),_e=a.useCallback(async(r,c)=>{try{await $t(r,R.current),E(i=>i.filter(s=>s.id!==r)),y(i=>{const s={...i};return delete s[r],s}),x.current&&N(x.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete milestone");throw c?.onError?.(s),s}},[N]),Le=a.useCallback(async(r,c,i)=>{try{const s=await at(r,c,R.current);y(d=>({...d,[r]:[...d[r]||[],s]})),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create feature");throw i?.onError?.(d),d}},[N]),M=a.useCallback(async(r,c,i)=>{try{const s=await zt(r,c,R.current);y(d=>{const o={};for(const[g,p]of Object.entries(d))o[g]=p.map(w=>w.id===r?s:w);return o}),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update feature");throw i?.onError?.(d),d}},[N]),ue=a.useCallback(async(r,c)=>{try{await At(r,R.current),y(i=>{const s={};for(const[d,o]of Object.entries(i))s[d]=o.filter(g=>g.id!==r);return s}),x.current&&N(x.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete feature");throw c?.onError?.(s),s}},[N]),H=a.useCallback(async(r,c,i)=>{const s=de.current,d=c.map(o=>s.find(g=>g.id===o)).filter(o=>o!==void 0).map((o,g)=>({...o,orderIndex:g}));E(d);try{await Bt(r,c,R.current),x.current&&N(x.current),i?.onSuccess?.()}catch(o){E(s);const g=o instanceof Error?o:new Error("Failed to reorder milestones");throw i?.onError?.(g),g}},[N]),ee=a.useCallback(async(r,c,i)=>{const s=ve.current[r]||[],d=s.map(p=>p.id);if(JSON.stringify(d)===JSON.stringify(c)){i?.onSuccess?.();return}const o=ve.current,g=c.map(p=>s.find(w=>w.id===p)).filter(p=>p!==void 0).map((p,w)=>({...p,orderIndex:w}));y(p=>({...p,[r]:g}));try{await Ot(r,c,R.current),x.current&&N(x.current),i?.onSuccess?.()}catch(p){y(o);const w=p instanceof Error?p:new Error("Failed to reorder features");throw i?.onError?.(w),w}},[N]),te=a.useCallback(async(r,c,i,s)=>{const d=ve.current;let o=null;for(const[k,K]of Object.entries(d))if(K.some(Ke=>Ke.id===r)){o=k;break}if(!o){const k=new Error("Feature not found");throw s?.onError?.(k),k}if(o===c){const k=d[o]||[],K=Math.max(0,Math.min(i,k.length-1));if(k.findIndex(We=>We.id===r)===K){s?.onSuccess?.();return}}const g=d[o]||[],p=d[c]||[],w=g.find(k=>k.id===r);if(!w){const k=new Error("Feature not found");throw s?.onError?.(k),k}const G=g.filter(k=>k.id!==r).map((k,K)=>({...k,orderIndex:K})),Ne={...w,milestoneId:c,orderIndex:i},ae=[...p];ae.splice(i,0,Ne);const Ve=ae.map((k,K)=>({...k,orderIndex:K}));y(o===c?k=>({...k,[o]:Ve}):k=>({...k,[o]:G,[c]:Ve}));try{await Ht(r,c,i,n),x.current&&N(x.current),s?.onSuccess?.()}catch(k){y(d);const K=k instanceof Error?k:new Error("Failed to move feature");throw s?.onError?.(K),K}},[N,n]);function Ie(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`draft-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}const pe=a.useCallback(async(r,c=5,i)=>{const s=x.current;if(!s){const g=new Error("No roadmap selected");throw i?.onError?.(g),g}const d=D.current,o=R.current;P(!0);try{const g=await Gt(s,r,c,o);if(D.current!==d)return;const p=g.suggestions.map(w=>({id:Ie(),title:w.title,description:w.description}));T(p),i?.onSuccess?.()}catch(g){if(D.current!==d)return;const p=g instanceof Error?g:new Error("Failed to generate suggestions");throw i?.onError?.(p),p}finally{D.current===d&&P(!1)}},[]),Ue=a.useCallback((r,c)=>{const s=Z.current.map(d=>d.id===r?{...d,...c}:d);Z.current=s,T(d=>d.map(o=>o.id===r?{...o,...c}:o))},[]),me=a.useCallback(async(r,c)=>{const i=x.current;if(!i){const p=new Error("No roadmap selected");throw c?.onError?.(p),p}const s=D.current,d=Z.current,o=d.findIndex(p=>p.id===r);if(o===-1){const p=new Error("Suggestion draft not found");throw c?.onError?.(p),p}const g=d[o];if(!g.title.trim()){const p=new Error("Title cannot be empty");throw c?.onError?.(p),p}T(p=>p.filter(w=>w.id!==r));try{if(await tt(i,{title:g.title,description:g.description},R.current),D.current!==s){T(p=>{const w=[...p];return w.splice(o,0,g),w});return}x.current&&N(x.current),c?.onSuccess?.()}catch(p){T(G=>{const Ne=[...G];return Ne.splice(o,0,g),Ne});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw c?.onError?.(w),w}},[N]),U=a.useCallback(async r=>{const c=x.current;if(!c){const o=new Error("No roadmap selected");throw r?.onError?.(o),o}const i=[...Z.current];if(i.length===0)return;const s=i.findIndex(o=>!o.title.trim());if(s!==-1){const o=new Error(`Title cannot be empty at position ${s+1}`);throw r?.onError?.(o),o}T([]);const d=D.current;for(let o=0;o<i.length&&D.current===d;o++){const g=i[o];try{await tt(c,{title:g.title,description:g.description},R.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw r?.onError?.(w),w}}D.current===d&&(x.current&&N(x.current),r?.onSuccess?.())},[N]),Je=a.useCallback(r=>ce.current[r]??!1,[]),Ge=a.useCallback(async(r,c,i)=>{const s=D.current,d=R.current;le(o=>({...o,[r]:!0}));try{const o=await Tt(r,c,d);if(D.current!==s)return;const g=o.suggestions.map(p=>({id:Ie(),title:p.title,description:p.description}));O(p=>({...p,[r]:g})),i?.onSuccess?.()}catch(o){if(D.current!==s)return;const g=o instanceof Error?o:new Error("Failed to generate feature suggestions");throw i?.onError?.(g),g}finally{D.current===s&&le(o=>({...o,[r]:!1}))}},[]),Ce=a.useCallback((r,c,i)=>{const d=(Y.current[r]||[]).map(o=>o.id===c?{...o,...i}:o);Y.current={...Y.current,[r]:d},O(o=>({...o,[r]:o[r]?.map(g=>g.id===c?{...g,...i}:g)||[]}))},[]),Te=a.useCallback(async(r,c,i)=>{const s=D.current,d=Y.current[r]||[],o=d.findIndex(p=>p.id===c);if(o===-1){const p=new Error("Suggestion draft not found");throw i?.onError?.(p),p}const g=d[o];if(!g.title.trim()){const p=new Error("Title cannot be empty");throw i?.onError?.(p),p}O(p=>({...p,[r]:p[r]?.filter(w=>w.id!==c)||[]}));try{if(await at(r,{title:g.title,description:g.description},R.current),D.current!==s){O(p=>{const G=[...p[r]||[]];return G.splice(o,0,g),{...p,[r]:G}});return}x.current&&N(x.current),i?.onSuccess?.()}catch(p){O(G=>{const ae=[...G[r]||[]];return ae.splice(o,0,g),{...G,[r]:ae}});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw i?.onError?.(w),w}},[N]),qe=a.useCallback(async(r,c)=>{const i=[...Y.current[r]||[]];if(i.length===0)return;const s=i.findIndex(o=>!o.title.trim());if(s!==-1){const o=new Error(`Title cannot be empty at position ${s+1}`);throw c?.onError?.(o),o}O(o=>({...o,[r]:[]}));const d=D.current;for(let o=0;o<i.length&&D.current===d;o++){const g=i[o];try{await at(r,{title:g.title,description:g.description},R.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw c?.onError?.(w),w}}D.current===d&&(x.current&&N(x.current),c?.onSuccess?.())},[N]),ye=a.useCallback(()=>{T([]),P(!1)},[]),Xe=a.useCallback(r=>{O(c=>{const i={...c};return delete i[r],i}),le(c=>{const i={...c};return delete i[r],i})},[]),ge=a.useCallback(async(r,c)=>{const i=++Q.current,s=n;ie(!0),oe(null);try{const d=await Pt(r,s);if(Q.current!==i||n!==s)return;ne(d),c?.onSuccess?.()}catch(d){if(Q.current!==i||n!==s)return;const o=d instanceof Error?d:new Error(String(d));oe(o),ne(null),c?.onError?.(o)}finally{Q.current===i&&ie(!1)}},[n]),$e=a.useCallback(()=>{ne(null),oe(null),ie(!1)},[]),Ze=a.useCallback(async()=>{await J(),x.current&&await N(x.current)},[J,N]);return{roadmaps:v,selectedRoadmapId:_,selectedRoadmap:S,milestones:F,featuresByMilestoneId:C,loading:se,error:A,createRoadmap:He,updateRoadmap:we,deleteRoadmap:h,selectRoadmap:I,createMilestone:je,updateMilestone:q,deleteMilestone:_e,reorderMilestones:H,createFeature:Le,updateFeature:M,deleteFeature:ue,reorderFeatures:ee,moveFeature:te,milestoneSuggestions:be,isGeneratingSuggestions:B,generateMilestoneSuggestions:pe,updateMilestoneSuggestionDraft:Ue,acceptMilestoneSuggestion:me,acceptAllMilestoneSuggestions:U,clearMilestoneSuggestions:ye,featureSuggestionsByMilestoneId:X,isGeneratingFeatureSuggestions:Je,generateFeatureSuggestions:Ge,updateFeatureSuggestionDraft:Ce,acceptFeatureSuggestion:Te,acceptAllFeatureSuggestions:qe,clearFeatureSuggestions:Xe,handoffPayload:De,isFetchingHandoff:fe,handoffError:Be,fetchHandoff:ge,clearHandoff:$e,refresh:Ze}}function Xt({isOpen:l,onClose:n,roadmapTitle:v,handoffPayload:f,isLoading:_,error:j,onFetchHandoff:S,onCopyToClipboard:m}){return l?e.jsx("div",{className:"modal-overlay open",onClick:n,role:"presentation",children:e.jsxs("div",{className:"modal modal-lg",onClick:F=>F.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":"handoff-modal-title",children:[e.jsxs("div",{className:"modal-header",children:[e.jsxs("h2",{id:"handoff-modal-title",children:["Export Roadmap: ",v]}),e.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close modal",children:e.jsx(re,{size:18})})]}),e.jsxs("div",{className:"modal-body",children:[e.jsx("p",{className:"text-muted",style:{marginBottom:"var(--space-lg)"},children:"Export roadmap data for use in mission and task planning flows. This is a read-only export — no missions or tasks will be created."}),j&&e.jsxs("div",{className:"form-error",style:{marginBottom:"var(--space-lg)"},children:["Error loading handoff data: ",j.message]}),!f&&!_&&e.jsx("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:e.jsxs("button",{className:"btn btn-primary",onClick:S,children:[e.jsx(rt,{size:16,style:{marginRight:"var(--space-sm)"}}),"Load Handoff Data"]})}),_&&e.jsxs("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:[e.jsx(Jt,{size:24,className:"spin"}),e.jsx("p",{style:{marginTop:"var(--space-md)"},children:"Loading handoff data..."})]}),f&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{marginBottom:"var(--space-lg)"},children:[e.jsx("h3",{style:{marginBottom:"var(--space-sm)"},children:"Mission Planning Handoff"}),e.jsx("div",{className:"card",style:{padding:"var(--space-md)"},children:e.jsx("pre",{style:{whiteSpace:"pre-wrap",fontSize:"12px",maxHeight:"200px",overflow:"auto"},children:JSON.stringify(f.mission,null,2)})})]}),e.jsxs("div",{style:{marginBottom:"var(--space-lg)"},children:[e.jsxs("h3",{style:{marginBottom:"var(--space-sm)"},children:["Feature Task Planning Handoffs (",f.features.length,")"]}),e.jsx("div",{className:"card",style:{padding:"var(--space-md)"},children:e.jsx("pre",{style:{whiteSpace:"pre-wrap",fontSize:"12px",maxHeight:"300px",overflow:"auto"},children:JSON.stringify(f.features,null,2)})})]})]})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("div",{className:"modal-actions-left",children:f&&e.jsxs("button",{className:"btn btn-sm",onClick:m,children:[e.jsx(Wt,{size:14,style:{marginRight:"var(--space-xs)"}}),"Copy to Clipboard"]})}),e.jsx("div",{className:"modal-actions-right",children:e.jsx("button",{className:"btn",onClick:n,children:"Close"})})]})]})}):null}function Zt({roadmap:l,isSelected:n,onSelect:v,onEdit:f,onDelete:_,onExport:j}){const S=C=>{C.key==="Enter"&&v()},m=C=>{C.stopPropagation(),f()},F=C=>{C.stopPropagation(),_()},E=C=>{C.stopPropagation(),j()};return e.jsxs("div",{className:`roadmaps-view__sidebar-item${n?" roadmaps-view__sidebar-item--active":""}`,onClick:v,onKeyDown:S,role:"button",tabIndex:0,"aria-selected":n,"data-testid":`roadmap-item-${l.id}`,children:[e.jsxs("div",{className:"roadmaps-view__sidebar-item-content",children:[e.jsx("div",{className:"roadmaps-view__sidebar-item-title",children:l.title}),l.description&&e.jsx("div",{className:"roadmaps-view__sidebar-item-desc",children:l.description})]}),e.jsxs("div",{className:"roadmaps-view__sidebar-item-actions",onClick:m,role:"presentation",children:[e.jsx("span",{className:"roadmaps-view__icon-btn",onClick:E,role:"button",title:"Export roadmap","aria-label":"Export roadmap","data-testid":`roadmap-export-${l.id}`,tabIndex:0,children:e.jsx(rt,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn",onClick:m,role:"button",title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`roadmap-edit-${l.id}`,tabIndex:0,children:e.jsx(Fe,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:F,role:"button",title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`roadmap-delete-${l.id}`,tabIndex:0,children:e.jsx(Pe,{size:14})})]})]})}function Qt({roadmaps:l,selectedRoadmapId:n,onSelect:v,onCreate:f,onEdit:_,onDelete:j,onExport:S,showCreateForm:m,onCancelCreate:F,onSaveCreate:E}){return e.jsxs("div",{className:"roadmaps-view__mobile-list","data-testid":"roadmaps-view__mobile-list",children:[e.jsxs("div",{className:"roadmaps-view__mobile-list-header",children:[e.jsx("h2",{className:"roadmaps-view__mobile-list-title",children:"Roadmaps"}),!m&&e.jsx("button",{className:"roadmaps-view__mobile-add-btn",onClick:f,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-create-roadmap-btn",children:e.jsx(Ae,{size:18})})]}),m&&e.jsx("div",{className:"roadmaps-view__mobile-create-form",children:e.jsx(mt,{onSave:E,onCancel:F})}),l.length===0&&!m?e.jsxs("div",{className:"roadmaps-view__mobile-empty",children:[e.jsx("p",{children:"No roadmaps yet."}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:f,children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Create Roadmap"})]})]}):e.jsx("div",{className:"roadmaps-view__mobile-list-items",children:l.map(C=>e.jsxs("div",{className:`roadmaps-view__mobile-item${C.id===n?" roadmaps-view__mobile-item--active":""}`,onClick:()=>v(C.id),role:"button",tabIndex:0,onKeyDown:y=>{y.key==="Enter"&&v(C.id)},"data-testid":`mobile-roadmap-item-${C.id}`,children:[e.jsxs("div",{className:"roadmaps-view__mobile-item-content",children:[e.jsx("span",{className:"roadmaps-view__mobile-item-title",children:C.title}),C.description&&e.jsx("span",{className:"roadmaps-view__mobile-item-desc",children:C.description})]}),e.jsxs("div",{className:"roadmaps-view__mobile-item-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),S(C)},title:"Export roadmap","aria-label":"Export roadmap","data-testid":`mobile-roadmap-export-${C.id}`,children:e.jsx(rt,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),_(C)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`mobile-roadmap-edit-${C.id}`,children:e.jsx(Fe,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:y=>{y.stopPropagation(),j(C.id)},title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`mobile-roadmap-delete-${C.id}`,children:e.jsx(Pe,{size:16})})]})]},C.id))})]})}function ea({roadmapTitle:l,onBack:n,onEdit:v,onDelete:f,onCreate:_}){return e.jsxs("div",{className:"roadmaps-view__mobile-header","data-testid":"roadmaps-view__mobile-header",children:[e.jsx("button",{className:"roadmaps-view__mobile-back-btn",onClick:n,title:"Back to roadmap list","aria-label":"Back to roadmap list","data-testid":"mobile-back-btn",children:e.jsx(Kt,{size:20})}),e.jsx("h2",{className:"roadmaps-view__mobile-header-title",children:l}),e.jsxs("div",{className:"roadmaps-view__mobile-header-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:_,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-header-create-btn",children:e.jsx(Ae,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:v,title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"mobile-header-edit-btn",children:e.jsx(Fe,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:f,title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"mobile-header-delete-btn",children:e.jsx(Pe,{size:18})})]})]})}function ta({milestone:l,features:n,onEditMilestone:v,onDeleteMilestone:f,onAddFeature:_,onEditFeature:j,onDeleteFeature:S,milestoneEdit:m,onStartMilestoneEdit:F,onCancelMilestoneEdit:E,onSaveMilestoneEdit:C,featureEdit:y,onStartFeatureEdit:se,onCancelFeatureEdit:V,onSaveFeatureEdit:A,projectId:$,addToast:De,isMilestoneDragging:ne,isMilestoneDropTarget:fe,milestoneDropPosition:ie,onMilestoneDragStart:Be,onMilestoneDragEnd:oe,onMilestoneDragOver:be,onMilestoneDrop:T,onMilestoneDragLeave:B,isFeatureDragging:P,isFeatureDropTarget:X,featureDropIndex:O,onFeatureDragStart:Me,onFeatureDragEnd:le,onFeatureDragOver:Y,onFeatureDrop:ce,onFeatureDragLeave:Z,onFeatureDropOnMilestone:Re,featureSuggestions:D,isGeneratingFeatureSuggestions:Q,onGenerateFeatureSuggestions:Oe,onAcceptFeatureSuggestion:x,onAcceptAllFeatureSuggestions:de,onUpdateFeatureSuggestionDraft:ve,onClearFeatureSuggestions:R}){const xe=m?.milestoneId===l.id,J=h=>{h.key==="Enter"?(h.preventDefault(),m&&C({title:m.value})):h.key==="Escape"&&E()},N=h=>{h.key==="Escape"&&E()},He=["roadmaps-view__milestone",ne?"roadmaps-view__milestone--dragging":"",fe?"roadmaps-view__milestone--drop-target":"",fe&&ie==="before"?"roadmaps-view__milestone--drop-before":"",fe&&ie==="after"?"roadmaps-view__milestone--drop-after":""].filter(Boolean).join(" "),we=["roadmaps-view__feature-list",X?"roadmaps-view__feature-list--drop-target":""].filter(Boolean).join(" ");return e.jsxs("div",{className:He,draggable:!xe,onDragStart:h=>{xe||(Be(l.id),h.dataTransfer.setData("text/plain",`milestone:${l.id}`),h.dataTransfer.effectAllowed="move")},onDragEnd:oe,onDragOver:h=>{h.dataTransfer.types.includes("text/plain")&&h.dataTransfer.types.includes("text/plain")&&(h.preventDefault(),h.dataTransfer.dropEffect="move",be(l.id))},onDrop:h=>{h.preventDefault(),h.dataTransfer.getData("text/plain")?.startsWith("feature:")||T(l.id)},onDragLeave:B,"data-testid":`milestone-card-${l.id}`,children:[e.jsx("div",{className:"roadmaps-view__milestone-header",children:xe?e.jsxs("div",{className:"roadmaps-view__inline-edit",children:[e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${l.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:m.value,onChange:()=>F(),onKeyDown:J,placeholder:"Milestone title",autoFocus:!0,"data-testid":`milestone-title-input-${l.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>C({title:m.value}),"aria-label":"Save milestone title",title:"Save",children:e.jsx(he,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:E,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(re,{size:14})})]}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:m.field==="description"?m.value:l.description||"",onChange:()=>{},onKeyDown:N,placeholder:"Milestone description (optional)",rows:2,"data-testid":`milestone-desc-input-${l.id}`})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__milestone-title-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${l.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("h3",{className:"roadmaps-view__milestone-title",children:l.title}),e.jsxs("div",{className:"roadmaps-view__milestone-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:v,title:"Edit milestone","aria-label":"Edit milestone","data-testid":`milestone-edit-${l.id}`,children:e.jsx(Fe,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:f,title:"Delete milestone","aria-label":"Delete milestone","data-testid":`milestone-delete-${l.id}`,children:e.jsx(Pe,{size:14})})]})]}),l.description&&e.jsx("p",{className:"roadmaps-view__milestone-desc",children:l.description})]})}),e.jsxs("div",{className:"roadmaps-view__milestone-actions-bar",children:[e.jsxs("button",{className:"roadmaps-view__add-feature-btn",onClick:_,title:"Add feature","aria-label":"Add feature","data-testid":`add-feature-${l.id}`,children:[e.jsx(Ae,{size:12}),e.jsx("span",{children:"Add Feature"})]}),e.jsxs("button",{className:"roadmaps-view__suggest-btn",onClick:()=>{Oe?.()},disabled:Q??!1,title:"Generate feature suggestions with AI","aria-label":"Generate feature suggestions","data-testid":`generate-features-${l.id}`,children:[e.jsx(pt,{size:12}),e.jsx("span",{children:Q?"Generating...":"AI Suggestions"})]})]}),e.jsxs("div",{className:we,onDragOver:h=>{h.preventDefault(),h.dataTransfer.dropEffect="move",h.dataTransfer.getData("text/plain")?.startsWith("feature:")&&Re()},onDrop:h=>{h.preventDefault();const I=h.dataTransfer.getData("text/plain");I?.startsWith("feature:")&&ce(I.split(":")[1],n.length)},onDragLeave:Z,children:[n.length===0?e.jsx("p",{className:"roadmaps-view__empty-features",children:"No features yet."}):n.map((h,I)=>{const je=y?.featureId===h.id,q=P(h.id),_e=M=>{M.key==="Enter"?(M.preventDefault(),y&&A({title:y.value})):M.key==="Escape"&&V()},Le=["roadmaps-view__feature-item",q?"roadmaps-view__feature-item--dragging":"",X&&O===I?"roadmaps-view__feature-item--drop-before":"",X&&O===I+1?"roadmaps-view__feature-item--drop-after":""].filter(Boolean).join(" ");return e.jsx("div",{className:Le,draggable:!je,onDragStart:M=>{je||(Me(h.id,l.id),M.dataTransfer.setData("text/plain",`feature:${h.id}`),M.dataTransfer.effectAllowed="move")},onDragEnd:le,onDragOver:M=>{if(M.preventDefault(),M.stopPropagation(),M.dataTransfer.dropEffect="move",M.dataTransfer.getData("text/plain")?.startsWith("feature:")){const H=M.currentTarget.getBoundingClientRect(),ee=H.top+H.height/2,te=M.clientY<ee?"before":"after";Y(h.id,te)}},onDrop:M=>{M.preventDefault(),M.stopPropagation();const ue=M.dataTransfer.getData("text/plain");if(ue?.startsWith("feature:")){const H=ue.split(":")[1],ee=M.currentTarget.getBoundingClientRect(),te=ee.top+ee.height/2,Ie=M.clientY<te?"before":"after";let pe=I;Ie==="after"&&(pe=I+1),ce(H,pe)}},onDragLeave:Z,"data-testid":`feature-item-${h.id}`,children:je?e.jsx("div",{className:"roadmaps-view__inline-edit roadmaps-view__inline-edit--compact",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Ye,{size:12})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:y.value,onChange:()=>{},onKeyDown:_e,placeholder:"Feature title",autoFocus:!0,"data-testid":`feature-title-input-${h.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>A({title:y.value}),"aria-label":"Save feature title",title:"Save",children:e.jsx(he,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:V,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(re,{size:14})})]})}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Ye,{size:12})}),e.jsxs("div",{className:"roadmaps-view__feature-content",children:[e.jsx("span",{className:"roadmaps-view__feature-title",children:h.title}),h.description&&e.jsx("p",{className:"roadmaps-view__feature-desc",children:h.description})]}),e.jsxs("div",{className:"roadmaps-view__feature-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>j(h.id),title:"Edit feature","aria-label":"Edit feature","data-testid":`feature-edit-${h.id}`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>S(h.id),title:"Delete feature","aria-label":"Delete feature","data-testid":`feature-delete-${h.id}`,children:e.jsx(Pe,{size:12})})]})]})},h.id)}),D&&D.length>0&&e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h4",{className:"roadmap-suggestion-title",children:"AI Feature Suggestions"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-accept-all-btn",onClick:()=>de?.(),title:"Accept all suggestions","aria-label":"Accept all","data-testid":`accept-all-features-${l.id}`,children:"Accept All"}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:()=>R?.(),title:"Clear suggestions","aria-label":"Clear","data-testid":`clear-features-${l.id}`,children:"Clear"})]})]}),e.jsx("div",{className:"roadmap-suggestion-list",children:D.map(h=>e.jsx(aa,{suggestion:h,onUpdateDraft:I=>ve?.(l.id,h.id,I),onAccept:()=>{x?.(l.id,h.id)},testIdPrefix:`feature-suggestion-${l.id}`},h.id))})]})]})]})}function aa({suggestion:l,onUpdateDraft:n,onAccept:v,testIdPrefix:f}){const[_,j]=a.useState(!1),[S,m]=a.useState(l.title),[F,E]=a.useState(l.description||""),C=()=>{m(l.title),E(l.description||""),j(!0)},y=()=>{n({title:S.trim(),description:F.trim()||void 0}),j(!1)},se=()=>{m(l.title),E(l.description||""),j(!1)},V=()=>{l.title.trim()&&v()},A=l.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:S,onChange:$=>m($.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:F,onChange:$=>E($.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${f}-${l.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:y,disabled:!S.trim(),title:"Save","data-testid":`${f}-${l.id}-save`,children:e.jsx(he,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:se,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(re,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${f}-${l.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:l.title}),l.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:l.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:C,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:V,disabled:!A,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(he,{size:12})})]})]})}function ut({suggestion:l,onUpdateDraft:n,onAccept:v,testIdPrefix:f}){const[_,j]=a.useState(!1),[S,m]=a.useState(l.title),[F,E]=a.useState(l.description||""),C=()=>{m(l.title),E(l.description||""),j(!0)},y=()=>{n({title:S.trim(),description:F.trim()||void 0}),j(!1)},se=()=>{m(l.title),E(l.description||""),j(!1)},V=()=>{l.title.trim()&&v()},A=l.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:S,onChange:$=>m($.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:F,onChange:$=>E($.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${f}-${l.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:y,disabled:!S.trim(),title:"Save","data-testid":`${f}-${l.id}-save`,children:e.jsx(he,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:se,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(re,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${f}-${l.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:l.title}),l.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:l.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:C,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:V,disabled:!A,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(he,{size:12})})]})]})}function mt({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form","data-testid":"create-roadmap-form",children:e.jsxs("form",{onSubmit:S,children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Roadmap title",autoFocus:!0,"data-testid":"create-roadmap-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Roadmap description (optional)",rows:2,"data-testid":"create-roadmap-description"}),e.jsxs("div",{className:"roadmaps-view__create-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__btn roadmaps-view__btn--primary",disabled:!v.trim(),"data-testid":"create-roadmap-submit",children:"Create"}),e.jsx("button",{type:"button",className:"roadmaps-view__btn",onClick:n,"data-testid":"create-roadmap-cancel",children:"Cancel"})]})]})})}function ra({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-milestone-form",children:e.jsxs("form",{onSubmit:S,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":"create-milestone-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-milestone-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!v.trim(),"aria-label":"Save milestone",title:"Save","data-testid":"create-milestone-submit",children:e.jsx(he,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:n,"aria-label":"Cancel",title:"Cancel","data-testid":"create-milestone-cancel",children:e.jsx(re,{size:14})})]})]})})}function sa({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-feature-form",children:e.jsxs("form",{onSubmit:S,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":"create-feature-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-feature-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!v.trim(),"aria-label":"Save feature",title:"Save","data-testid":"create-feature-submit",children:e.jsx(he,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:n,"aria-label":"Cancel",title:"Cancel","data-testid":"create-feature-cancel",children:e.jsx(re,{size:14})})]})]})})}function ca({projectId:l,addToast:n}){const{confirm:v}=Lt(),f=Vt()==="mobile",{roadmaps:_,selectedRoadmapId:j,selectedRoadmap:S,milestones:m,featuresByMilestoneId:F,loading:E,error:C,createRoadmap:y,updateRoadmap:se,deleteRoadmap:V,selectRoadmap:A,createMilestone:$,updateMilestone:De,deleteMilestone:ne,createFeature:fe,updateFeature:ie,deleteFeature:Be,reorderMilestones:oe,reorderFeatures:be,moveFeature:T,milestoneSuggestions:B,isGeneratingSuggestions:P,generateMilestoneSuggestions:X,updateMilestoneSuggestionDraft:O,acceptMilestoneSuggestion:Me,acceptAllMilestoneSuggestions:le,clearMilestoneSuggestions:Y,featureSuggestionsByMilestoneId:ce,isGeneratingFeatureSuggestions:Z,generateFeatureSuggestions:Re,updateFeatureSuggestionDraft:D,acceptFeatureSuggestion:Q,acceptAllFeatureSuggestions:Oe,clearFeatureSuggestions:x,handoffPayload:de,isFetchingHandoff:ve,handoffError:R,fetchHandoff:xe,clearHandoff:J}=qt({projectId:l}),[N,He]=a.useState(!1),[we,h]=a.useState(null),[I,je]=a.useState(""),[q,_e]=a.useState(""),[Le,M]=a.useState(!1),ue=a.useRef(null);a.useEffect(()=>{ue.current!==null&&ue.current!==j&&M(!1),ue.current=j},[j]);const[H,ee]=a.useState({roadmapId:null,field:null,value:""}),[te,Ie]=a.useState({milestoneId:null,field:null,value:""}),[pe,Ue]=a.useState({featureId:null,field:null,value:""}),[me,U]=a.useState({type:null,parentId:void 0,title:"",description:""}),[Je,Ge]=a.useState(!1),[Ce,Te]=a.useState({draggingId:null,dropTargetId:null,dropPosition:null}),qe=a.useCallback(t=>{Te(u=>({...u,draggingId:t}))},[]),ye=a.useCallback(()=>{Te({draggingId:null,dropTargetId:null,dropPosition:null})},[]),Xe=a.useCallback(t=>{Te(u=>u.draggingId===t?u:{...u,dropTargetId:t,dropPosition:null})},[]),[ge,$e]=a.useState({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}),Ze=a.useCallback((t,u)=>{$e(b=>({...b,draggingId:t,draggingMilestoneId:u}))},[]),r=a.useCallback(()=>{$e({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null})},[]),c=a.useCallback((t,u)=>{$e(b=>{if(b.draggingId===t)return b;const L=(F[b.draggingMilestoneId||""]||[]).findIndex(Ee=>Ee.id===t);let W;return u==="before"?W=L:W=L+1,{...b,dropTargetMilestoneId:b.draggingMilestoneId,dropTargetIndex:W,dropPosition:u}})},[F]),i=a.useCallback(()=>{$e(t=>({...t,dropTargetMilestoneId:t.draggingMilestoneId,dropTargetIndex:(F[t.draggingMilestoneId||""]||[]).length}))},[F]),s=a.useCallback(async(t,u)=>{const{draggingMilestoneId:b,dropTargetMilestoneId:z}=ge;if(!b){r();return}const L=z||b,W=F[b]||[],Ee=W.find(ke=>ke.id===t);if(!Ee){r();return}if(b!==L){if(b===L){r();return}try{await T(t,L,u,{onError:ke=>{n(`Failed to move feature: ${ke.message}`,"error")}})}catch{}}else{const ke=[...W],Nt=ke.findIndex(ze=>ze.id===t);ke.splice(Nt,1),ke.splice(u,0,Ee);const dt=ke.map(ze=>ze.id),St=W.map(ze=>ze.id);if(dt.join(",")===St.join(",")){r();return}try{await be(b,dt,{onError:ze=>{n(`Failed to reorder features: ${ze.message}`,"error")}})}catch{}}r()},[ge,F,be,T,n,r]),d=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),b=t.clientX,z=t.clientY;(b<u.left||b>u.right||z<u.top||z>u.bottom)&&$e(L=>({...L,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}))},[]),o=a.useCallback(t=>ge.draggingId===t,[ge.draggingId]),g=a.useCallback(async t=>{const{draggingId:u}=Ce;if(!u||u===t){ye();return}const b=m.map(Ee=>Ee.id),z=b.indexOf(u),L=b.indexOf(t);if(z===-1||L===-1){ye();return}const W=[...b];if(W.splice(z,1),W.splice(L,0,u),W.join(",")===b.join(",")){ye();return}try{await oe(j,W,{onError:Ee=>{n(`Failed to reorder milestones: ${Ee.message}`,"error")}})}catch{}ye()},[Ce,m,j,oe,n,ye]),p=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),b=t.clientX,z=t.clientY;(b<u.left||b>u.right||z<u.top||z>u.bottom)&&Te(L=>({...L,dropTargetId:null,dropPosition:null}))},[]),w=a.useCallback(t=>{A(t.id),ee({roadmapId:t.id,field:"title",value:t.title})},[A]),G=a.useCallback(()=>{ee({roadmapId:null,field:null,value:""})},[]),Ne=a.useCallback(async t=>{if(H.roadmapId)try{await se(H.roadmapId,t,{onError:u=>n(u.message,"error")}),G()}catch{}},[H.roadmapId,se,G,n]),ae=a.useCallback(async t=>{if(await v({title:"Delete Roadmap",message:"Delete this roadmap? This cannot be undone.",danger:!0}))try{await V(t,{onError:b=>n(b.message,"error")}),n("Roadmap deleted","success")}catch{}},[V,n,v]),Ve=a.useCallback((t,u)=>{h(t),je(u),He(!0),J()},[J]),k=a.useCallback(()=>{He(!1),h(null),je(""),J()},[J]),K=a.useCallback(()=>{we&&xe(we,{onError:t=>n(`Failed to load handoff: ${t.message}`,"error")})},[we,xe,n]),Ke=a.useCallback(()=>{if(de){const t=JSON.stringify(de,null,2);navigator.clipboard.writeText(t).then(()=>{n("Handoff data copied to clipboard","success")}).catch(()=>{n("Failed to copy to clipboard","error")})}},[de,n]),We=a.useCallback(async t=>{try{await y(t,{onError:u=>n(u.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Roadmap created","success")}catch{}},[y,n]),st=a.useCallback(t=>{Ie({milestoneId:t.id,field:"title",value:t.title})},[]),Qe=a.useCallback(()=>{Ie({milestoneId:null,field:null,value:""})},[]),gt=a.useCallback(async t=>{if(te.milestoneId)try{await De(te.milestoneId,t,{onError:u=>n(u.message,"error")}),Qe()}catch{}},[te.milestoneId,De,Qe,n]),ht=a.useCallback(async t=>{if(await v({title:"Delete Milestone",message:"Delete this milestone and all its features?",danger:!0}))try{await ne(t,{onError:b=>n(b.message,"error")}),n("Milestone deleted","success")}catch{}},[ne,n,v]),ft=a.useCallback(async t=>{try{await $(t,{onError:u=>n(u.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Milestone created","success")}catch{}},[$,n]),nt=a.useCallback((t,u,b)=>{Ue({featureId:t,field:"title",value:u})},[]),et=a.useCallback(()=>{Ue({featureId:null,field:null,value:""})},[]),bt=a.useCallback(async t=>{if(pe.featureId)try{await ie(pe.featureId,t,{onError:u=>n(u.message,"error")}),et()}catch{}},[pe.featureId,ie,et,n]),vt=a.useCallback(async t=>{if(await v({title:"Delete Feature",message:"Delete this feature?",danger:!0}))try{await Be(t,{onError:b=>n(b.message,"error")}),n("Feature deleted","success")}catch{}},[Be,n,v]),it=a.useCallback(async()=>{if(q.trim())try{await X(q,5,{onError:t=>n(t.message,"error")})}catch{}},[q,X,n]),ot=a.useCallback(async t=>{try{await Me(t,{onError:u=>n(u.message,"error")}),n("Milestone added","success")}catch{}},[Me,n]),lt=a.useCallback(async()=>{try{await le({onError:t=>n(t.message,"error")}),n(`${B.length} milestones added`,"success"),_e("")}catch{}},[le,B.length,n]),ct=a.useCallback(()=>{Y(),_e("")},[Y]),xt=a.useCallback(async t=>{try{await Re(t,{count:5},{onError:u=>n(u.message,"error")})}catch{}},[Re,n]),wt=a.useCallback(async(t,u)=>{try{await Q(t,u,{onError:b=>n(b.message,"error")}),n("Feature added","success")}catch{}},[Q,n]),jt=a.useCallback((t,u,b)=>{D(t,u,b)},[D]),_t=a.useCallback(async t=>{const u=ce[t]||[];try{await Oe(t,{onError:b=>n(b.message,"error")}),n(`${u.length} features added`,"success")}catch{}},[Oe,ce,n]),Ct=a.useCallback(t=>{x(t)},[x]),yt=a.useCallback(async(t,u)=>{try{await fe(t,u,{onError:b=>n(b.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Feature created","success")}catch{}},[fe,n]),Se=j;return E&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--loading",children:e.jsx("div",{className:"roadmaps-view__loading-state",children:"Loading roadmaps..."})}):C&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--error",children:e.jsxs("div",{className:"roadmaps-view__error-state",children:[e.jsx("p",{children:"Failed to load roadmaps"}),e.jsx("p",{className:"roadmaps-view__error-msg",children:C.message})]})}):e.jsxs("div",{className:"roadmaps-view",children:[f&&!Se&&e.jsx(Qt,{roadmaps:_,selectedRoadmapId:Se,onSelect:t=>A(t),onCreate:()=>Ge(!0),onEdit:w,onDelete:ae,onExport:t=>Ve(t.id,t.title),showCreateForm:Je,onCancelCreate:()=>Ge(!1),onSaveCreate:async t=>{await We(t),Ge(!1)}}),!f&&e.jsxs("aside",{className:"roadmaps-view__sidebar","aria-label":"Roadmaps",children:[e.jsxs("div",{className:"roadmaps-view__sidebar-header",children:[e.jsx("h2",{className:"roadmaps-view__sidebar-title",children:"Roadmaps"}),e.jsx("button",{className:"roadmaps-view__add-btn",onClick:()=>U({type:"roadmap",title:"",description:""}),title:"Create roadmap","aria-label":"Create roadmap","data-testid":"create-roadmap-btn",children:e.jsx(Ae,{size:16})})]}),me.type==="roadmap"&&e.jsx(mt,{onSave:We,onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})}),e.jsx("div",{className:"roadmaps-view__sidebar-list",children:_.length===0?e.jsx("p",{className:"roadmaps-view__empty-sidebar",children:"No roadmaps yet. Click + to create one."}):_.map(t=>e.jsx(Zt,{roadmap:t,isSelected:t.id===Se,onSelect:()=>A(t.id),onEdit:()=>w(t),onDelete:()=>ae(t.id),onExport:()=>Ve(t.id,t.title)},t.id))})]}),e.jsxs("main",{className:"roadmaps-view__main","aria-label":"Roadmap content",children:[f&&Se&&e.jsx(ea,{roadmapTitle:S?.title||"Untitled Roadmap",onBack:()=>A(null),onEdit:()=>{S&&w(S)},onDelete:()=>ae(Se),onCreate:()=>Ge(!0)}),Se?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"roadmaps-view__roadmap-header",children:H.roadmapId===Se?e.jsx("div",{className:"roadmaps-view__inline-edit",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input roadmaps-view__inline-input--large",value:H.value,onChange:t=>ee(u=>({...u,value:t.target.value})),onKeyDown:t=>{t.key==="Enter"?Ne({title:H.value}):t.key==="Escape"&&G()},placeholder:"Roadmap title",autoFocus:!0,"data-testid":"roadmap-title-input"}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>Ne({title:H.value}),"aria-label":"Save",title:"Save",children:e.jsx(he,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:G,"aria-label":"Cancel",title:"Cancel",children:e.jsx(re,{size:16})})]})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__roadmap-title-row",children:[e.jsx("h1",{className:"roadmaps-view__roadmap-title",children:S?.title||"Untitled Roadmap"}),e.jsxs("div",{className:"roadmaps-view__roadmap-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>{S&&w(S)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"edit-roadmap-btn",children:e.jsx(Fe,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>ae(Se),title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"delete-roadmap-btn",children:e.jsx(Pe,{size:16})})]})]}),S?.description&&e.jsx("p",{className:"roadmaps-view__roadmap-desc",children:S.description})]})}),f?Le?e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"}),e.jsx("button",{className:"roadmap-suggestion-collapse-btn",onClick:()=>M(!1),"aria-label":"Collapse suggestion panel","data-testid":"collapse-suggestion-panel-btn",children:e.jsx(Ut,{size:16})})]}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:q,onChange:t=>_e(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:P||!j,"data-testid":"goal-prompt-input",autoFocus:!0}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:it,disabled:!q.trim()||P||!j,"data-testid":"generate-suggestions-btn",children:P?"Generating...":"Generate Milestones"}),B.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:lt,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",B.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ct,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(re,{size:14})})]})]})]}),B.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:B.map(t=>e.jsx(ut,{suggestion:t,onUpdateDraft:u=>O(t.id,u),onAccept:()=>ot(t.id),testIdPrefix:"suggestion"},t.id))})]}):e.jsx("div",{className:"roadmap-suggestion-section",children:e.jsxs("button",{className:"roadmap-suggestion-expand-btn",onClick:()=>M(!0),disabled:!j,"data-testid":"expand-suggestion-panel-btn",children:[e.jsx(pt,{size:16}),"Generate Milestone Ideas"]})}):e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsx("div",{className:"roadmap-suggestion-header",children:e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"})}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:q,onChange:t=>_e(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:P||!j,"data-testid":"goal-prompt-input"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:it,disabled:!q.trim()||P||!j,"data-testid":"generate-suggestions-btn",children:P?"Generating...":"Generate Milestones"}),B.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:lt,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",B.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ct,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(re,{size:14})})]})]})]}),B.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:B.map(t=>e.jsx(ut,{suggestion:t,onUpdateDraft:u=>O(t.id,u),onAccept:()=>ot(t.id),testIdPrefix:"suggestion"},t.id))})]}),e.jsxs("div",{className:"roadmaps-view__milestone-lanes",children:[me.type==="milestone"&&e.jsx(ra,{onSave:ft,onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})}),m.length===0&&me.type!=="milestone"?e.jsxs("div",{className:"roadmaps-view__empty-milestones",children:[e.jsx("p",{children:"This roadmap has no milestones."}),e.jsxs("button",{className:"roadmaps-view__add-milestone-btn",onClick:()=>U({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn-empty",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]})]}):e.jsxs(e.Fragment,{children:[me.type!=="milestone"&&e.jsxs("button",{className:"roadmaps-view__add-milestone-fab",onClick:()=>U({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]}),m.map(t=>e.jsx(ta,{milestone:t,features:F[t.id]||[],onEditMilestone:()=>st(t),onDeleteMilestone:()=>ht(t.id),onAddFeature:()=>U({type:"feature",parentId:t.id,title:"",description:""}),onEditFeature:u=>{const b=F[t.id]?.find(z=>z.id===u);b&&nt(u,b.title,b.description)},onDeleteFeature:vt,milestoneEdit:te,onStartMilestoneEdit:()=>st(t),onCancelMilestoneEdit:Qe,onSaveMilestoneEdit:gt,featureEdit:pe,onStartFeatureEdit:nt,onCancelFeatureEdit:et,onSaveFeatureEdit:bt,projectId:l,addToast:n,isMilestoneDragging:Ce.draggingId===t.id,isMilestoneDropTarget:Ce.dropTargetId===t.id,milestoneDropPosition:Ce.dropTargetId===t.id?Ce.dropPosition:null,onMilestoneDragStart:qe,onMilestoneDragEnd:ye,onMilestoneDragOver:Xe,onMilestoneDrop:g,onMilestoneDragLeave:p,isFeatureDragging:o,isFeatureDropTarget:ge.dropTargetMilestoneId===t.id,featureDropIndex:ge.dropTargetMilestoneId===t.id?ge.dropTargetIndex:null,onFeatureDragStart:Ze,onFeatureDragEnd:r,onFeatureDragOver:c,onFeatureDrop:s,onFeatureDragLeave:d,onFeatureDropOnMilestone:i,featureSuggestions:ce[t.id],isGeneratingFeatureSuggestions:Z(t.id),onGenerateFeatureSuggestions:()=>xt(t.id),onAcceptFeatureSuggestion:u=>wt(t.id,u),onAcceptAllFeatureSuggestions:()=>_t(t.id),onUpdateFeatureSuggestionDraft:(u,b,z)=>jt(u,b,z),onClearFeatureSuggestions:()=>Ct(t.id)},t.id))]})]})]}):e.jsx("div",{className:"roadmaps-view__empty-main",children:e.jsx("p",{children:"Select a roadmap from the sidebar to view its milestones."})})]}),me.type==="feature"&&me.parentId&&e.jsx("div",{className:"roadmaps-view__feature-create-overlay",children:e.jsx(sa,{onSave:t=>yt(me.parentId,t),onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})})}),e.jsx(Xt,{isOpen:N,onClose:k,roadmapId:we||"",roadmapTitle:I,handoffPayload:de,isLoading:ve,error:R,onFetchHandoff:K,onCopyToClipboard:Ke})]})}export{ca as RoadmapsView};