@runfusion/fusion 0.2.7 → 0.3.0

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 (55) hide show
  1. package/dist/bin.js +8436 -7001
  2. package/dist/client/assets/{AgentDetailView-BMrHuWGs.css → AgentDetailView-C1b9PC5l.css} +1 -1
  3. package/dist/client/assets/{AgentDetailView-B4lRk--v.js → AgentDetailView-CJIxNRq-.js} +3 -3
  4. package/dist/client/assets/{AgentsView-yCYBY2km.js → AgentsView-BS17exn3.js} +5 -5
  5. package/dist/client/assets/ChatView-BUlq3WNJ.js +1 -0
  6. package/dist/client/assets/{DevServerView-jXXtoQUx.js → DevServerView-qMPpnXRb.js} +2 -2
  7. package/dist/client/assets/{DirectoryPicker-izgMlS27.js → DirectoryPicker-CTwgv9LY.js} +1 -1
  8. package/dist/client/assets/DirectoryPicker-DzKVmxOf.css +1 -0
  9. package/dist/client/assets/{DocumentsView-DkkoHRwL.js → DocumentsView-DOz1KFGN.js} +1 -1
  10. package/dist/client/assets/{InsightsView-DaRtUPHX.js → InsightsView-CHZTJUic.js} +2 -2
  11. package/dist/client/assets/MemoryView-V0QdeO3e.js +2 -0
  12. package/dist/client/assets/{NodesView-BsUk_oiU.js → NodesView-BtGNRj2z.js} +1 -1
  13. package/dist/client/assets/PiExtensionsManager-D9Ye2Vak.js +11 -0
  14. package/dist/client/assets/PiExtensionsManager-kgTOHPE9.css +1 -0
  15. package/dist/client/assets/PluginManager-DRiIqol2.css +1 -0
  16. package/dist/client/assets/PluginManager-LeHp0jJ_.js +1 -0
  17. package/dist/client/assets/{RoadmapsView-SQol126Y.js → RoadmapsView-C413ISVU.js} +2 -2
  18. package/dist/client/assets/SettingsModal--vWmKBpT.css +1 -0
  19. package/dist/client/assets/SettingsModal-BZLL2xAP.js +31 -0
  20. package/dist/client/assets/SettingsModal-CDWvhvrd.css +1 -0
  21. package/dist/client/assets/SettingsModal-olTBmYJs.js +1 -0
  22. package/dist/client/assets/SetupWizardModal-BMa6p24b.css +1 -0
  23. package/dist/client/assets/{SetupWizardModal-CQc1uGSq.js → SetupWizardModal-WdaR2eQQ.js} +1 -1
  24. package/dist/client/assets/SkillsView-BcE57w8i.js +1 -0
  25. package/dist/client/assets/{folder-open-CI4TCD7P.js → folder-open-Ec4hU1xL.js} +1 -1
  26. package/dist/client/assets/index-CCYdhck-.js +616 -0
  27. package/dist/client/assets/index-lJ5WOmO9.css +1 -0
  28. package/dist/client/assets/{upload-CAlKC4qI.js → upload-BksRDuGJ.js} +1 -1
  29. package/dist/client/assets/users-EFU4n9Qr.js +6 -0
  30. package/dist/client/index.html +2 -2
  31. package/dist/extension.js +1266 -205
  32. package/dist/pi-claude-cli/index.ts +72 -28
  33. package/dist/pi-claude-cli/package.json +1 -1
  34. package/dist/pi-claude-cli/src/__tests__/event-bridge.test.ts +34 -0
  35. package/dist/pi-claude-cli/src/__tests__/mcp-config.test.ts +22 -0
  36. package/dist/pi-claude-cli/src/__tests__/prompt-builder.test.ts +72 -10
  37. package/dist/pi-claude-cli/src/__tests__/provider.test.ts +9 -9
  38. package/dist/pi-claude-cli/src/event-bridge.ts +17 -6
  39. package/dist/pi-claude-cli/src/mcp-config.ts +36 -3
  40. package/dist/pi-claude-cli/src/prompt-builder.ts +111 -7
  41. package/dist/pi-claude-cli/src/provider.ts +18 -2
  42. package/package.json +6 -5
  43. package/skill/fusion/SKILL.md +6 -1
  44. package/skill/fusion/references/engine-tools.md +54 -0
  45. package/skill/fusion/references/extension-tools.md +83 -84
  46. package/skill/fusion/references/fusion-capabilities.md +33 -31
  47. package/dist/client/assets/ChatView-CH9T0dDs.js +0 -1
  48. package/dist/client/assets/MemoryView-85NKuU3h.js +0 -2
  49. package/dist/client/assets/PiExtensionsManager-BF5pxrSE.js +0 -11
  50. package/dist/client/assets/PiExtensionsManager-K7HQ08L4.css +0 -1
  51. package/dist/client/assets/PluginManager-ccq3uK50.css +0 -1
  52. package/dist/client/assets/PluginManager-s6btydh5.js +0 -1
  53. package/dist/client/assets/SkillsView-BtUhs_QW.js +0 -1
  54. package/dist/client/assets/index-Ct-OqLpP.css +0 -1
  55. package/dist/client/assets/index-rNf7s96d.js +0 -649
@@ -1,6 +1,6 @@
1
- import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{c as St,aO as Et,aP as kt,aQ as Ft,aR as Dt,aS as Mt,aT as tt,aU as Rt,aV as It,aW as at,aX as $t,aY as zt,aZ as At,a_ as Ot,a$ as Bt,b0 as Ht,b1 as Gt,b2 as Tt,aG as Pt,w as Ae,b3 as me,X as ae,at as Ee,I as Le,a7 as Lt,ad as ut,as as rt,a4 as Vt,b4 as Ye,b5 as Ut}from"./index-rNf7s96d.js";import"./vendor-xterm-DzcZoU0P.js";/**
1
+ import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{c as St,aN as Et,aO as kt,aP as Ft,aQ as Dt,aR as Mt,aS as tt,aT as Rt,aU as It,aV as at,aW as $t,aX as zt,aY as At,aZ as Ot,a_ as Bt,a$ as Ht,b0 as Tt,b1 as Gt,aF as Pt,w as Ae,b2 as me,X as ae,as as Ee,I as Le,a7 as Lt,ad as ut,ar as rt,a4 as Vt,b3 as Ye,b4 as Ut}from"./index-CCYdhck-.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 Kt=[["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"}]],Wt=St("loader",Kt);function Yt(l){const n=l?.projectId,[j,f]=a.useState([]),[b,C]=a.useState(null),[S,m]=a.useState(null),[I,E]=a.useState([]),[_,y]=a.useState({}),[re,z]=a.useState(!1),[W,A]=a.useState(null),[ke,se]=a.useState(null),[ge,ne]=a.useState(!1),[Oe,ie]=a.useState(null),[he,R]=a.useState([]),[J,oe]=a.useState(!1),[X,B]=a.useState({}),[Fe,le]=a.useState({}),P=a.useRef(X),De=a.useRef(Fe),Y=a.useRef(he);P.current=X,De.current=Fe,Y.current=he;const Me=a.useRef(n),F=a.useRef(0),Q=a.useRef(0),Be=a.useRef(j),v=a.useRef(b),He=a.useRef(I),fe=a.useRef(_),M=a.useRef(n),Z=a.useRef(ke);Be.current=j,v.current=b,He.current=I,fe.current=_,M.current=n,Z.current=ke,a.useEffect(()=>{Me.current!==n&&(Me.current=n,F.current++,C(null),m(null),E([]),y({}),se(null),ie(null),R([]),oe(!1),B({}),le({}))},[n]);const be=a.useCallback(async()=>{z(!0),A(null);try{const r=await Et(n);f(r)}catch(r){A(r instanceof Error?r:new Error("Failed to fetch roadmaps"))}finally{z(!1)}},[n]),N=a.useCallback(async r=>{try{const c=await kt(r,n);m(c),E(c.milestones||[]);const i={};for(const s of c.milestones||[])i[s.id]=s.features||[];y(i)}catch(c){A(c instanceof Error?c:new Error("Failed to fetch roadmap"))}},[n]);a.useEffect(()=>{be()},[be]),a.useEffect(()=>{b?N(b):(m(null),E([]),y({}))},[b,N]);const ve=a.useCallback(async(r,c)=>{try{const i=await Ft(r,M.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}},[]),Ge=a.useCallback(async(r,c,i)=>{try{const s=await Dt(r,c,M.current);f(d=>d.map(o=>o.id===r?s:o)),v.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 Mt(r,M.current),f(i=>i.filter(s=>s.id!==r)),v.current===r&&(C(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}},[]),$=a.useCallback(r=>{C(r)},[]),H=a.useCallback(async(r,c)=>{const i=v.current;if(!i){const s=new Error("No roadmap selected");throw c?.onError?.(s),s}try{const s=await tt(i,r,M.current);E(d=>[...d,s]),y(d=>({...d,[s.id]:[]})),v.current&&N(v.current),c?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create milestone");throw c?.onError?.(d),d}},[N]),xe=a.useCallback(async(r,c,i)=>{try{const s=await Rt(r,c,M.current);E(d=>d.map(o=>o.id===r?s:o)),v.current&&N(v.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update milestone");throw i?.onError?.(d),d}},[N]),Ve=a.useCallback(async(r,c)=>{try{await It(r,M.current),E(i=>i.filter(s=>s.id!==r)),y(i=>{const s={...i};return delete s[r],s}),v.current&&N(v.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete milestone");throw c?.onError?.(s),s}},[N]),Re=a.useCallback(async(r,c,i)=>{try{const s=await at(r,c,M.current);y(d=>({...d,[r]:[...d[r]||[],s]})),v.current&&N(v.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create feature");throw i?.onError?.(d),d}},[N]),D=a.useCallback(async(r,c,i)=>{try{const s=await $t(r,c,M.current);y(d=>{const o={};for(const[g,p]of Object.entries(d))o[g]=p.map(x=>x.id===r?s:x);return o}),v.current&&N(v.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update feature");throw i?.onError?.(d),d}},[N]),G=a.useCallback(async(r,c)=>{try{await zt(r,M.current),y(i=>{const s={};for(const[d,o]of Object.entries(i))s[d]=o.filter(g=>g.id!==r);return s}),v.current&&N(v.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete feature");throw c?.onError?.(s),s}},[N]),ee=a.useCallback(async(r,c,i)=>{const s=He.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 At(r,c,M.current),v.current&&N(v.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]),q=a.useCallback(async(r,c,i)=>{const s=fe.current[r]||[],d=s.map(p=>p.id);if(JSON.stringify(d)===JSON.stringify(c)){i?.onSuccess?.();return}const o=fe.current,g=c.map(p=>s.find(x=>x.id===p)).filter(p=>p!==void 0).map((p,x)=>({...p,orderIndex:x}));y(p=>({...p,[r]:g}));try{await Ot(r,c,M.current),v.current&&N(v.current),i?.onSuccess?.()}catch(p){y(o);const x=p instanceof Error?p:new Error("Failed to reorder features");throw i?.onError?.(x),x}},[N]),we=a.useCallback(async(r,c,i,s)=>{const d=fe.current;let o=null;for(const[k,U]of Object.entries(d))if(U.some(Ue=>Ue.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]||[],U=Math.max(0,Math.min(i,k.length-1));if(k.findIndex(We=>We.id===r)===U){s?.onSuccess?.();return}}const g=d[o]||[],p=d[c]||[],x=g.find(k=>k.id===r);if(!x){const k=new Error("Feature not found");throw s?.onError?.(k),k}const V=g.filter(k=>k.id!==r).map((k,U)=>({...k,orderIndex:U})),te={...x,milestoneId:c,orderIndex:i},Ce=[...p];Ce.splice(i,0,te);const Ke=Ce.map((k,U)=>({...k,orderIndex:U}));y(o===c?k=>({...k,[o]:Ke}):k=>({...k,[o]:V,[c]:Ke}));try{await Bt(r,c,i,n),v.current&&N(v.current),s?.onSuccess?.()}catch(k){y(d);const U=k instanceof Error?k:new Error("Failed to move feature");throw s?.onError?.(U),U}},[N,n]);function ce(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`draft-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}const Ie=a.useCallback(async(r,c=5,i)=>{const s=v.current;if(!s){const g=new Error("No roadmap selected");throw i?.onError?.(g),g}const d=F.current,o=M.current;oe(!0);try{const g=await Ht(s,r,c,o);if(F.current!==d)return;const p=g.suggestions.map(x=>({id:ce(),title:x.title,description:x.description}));R(p),i?.onSuccess?.()}catch(g){if(F.current!==d)return;const p=g instanceof Error?g:new Error("Failed to generate suggestions");throw i?.onError?.(p),p}finally{F.current===d&&oe(!1)}},[]),de=a.useCallback((r,c)=>{const s=Y.current.map(d=>d.id===r?{...d,...c}:d);Y.current=s,R(d=>d.map(o=>o.id===r?{...o,...c}:o))},[]),L=a.useCallback(async(r,c)=>{const i=v.current;if(!i){const p=new Error("No roadmap selected");throw c?.onError?.(p),p}const s=F.current,d=Y.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}R(p=>p.filter(x=>x.id!==r));try{if(await tt(i,{title:g.title,description:g.description},M.current),F.current!==s){R(p=>{const x=[...p];return x.splice(o,0,g),x});return}v.current&&N(v.current),c?.onSuccess?.()}catch(p){R(V=>{const te=[...V];return te.splice(o,0,g),te});const x=p instanceof Error?p:new Error("Failed to accept suggestion");throw c?.onError?.(x),x}},[N]),qe=a.useCallback(async r=>{const c=v.current;if(!c){const o=new Error("No roadmap selected");throw r?.onError?.(o),o}const i=[...Y.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}R([]);const d=F.current;for(let o=0;o<i.length&&F.current===d;o++){const g=i[o];try{await tt(c,{title:g.title,description:g.description},M.current)}catch(p){const x=p instanceof Error?p:new Error("Failed to accept all suggestions");throw r?.onError?.(x),x}}F.current===d&&(v.current&&N(v.current),r?.onSuccess?.())},[N]),Te=a.useCallback(r=>De.current[r]??!1,[]),je=a.useCallback(async(r,c,i)=>{const s=F.current,d=M.current;le(o=>({...o,[r]:!0}));try{const o=await Gt(r,c,d);if(F.current!==s)return;const g=o.suggestions.map(p=>({id:ce(),title:p.title,description:p.description}));B(p=>({...p,[r]:g})),i?.onSuccess?.()}catch(o){if(F.current!==s)return;const g=o instanceof Error?o:new Error("Failed to generate feature suggestions");throw i?.onError?.(g),g}finally{F.current===s&&le(o=>({...o,[r]:!1}))}},[]),Pe=a.useCallback((r,c,i)=>{const d=(P.current[r]||[]).map(o=>o.id===c?{...o,...i}:o);P.current={...P.current,[r]:d},B(o=>({...o,[r]:o[r]?.map(g=>g.id===c?{...g,...i}:g)||[]}))},[]),Je=a.useCallback(async(r,c,i)=>{const s=F.current,d=P.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}B(p=>({...p,[r]:p[r]?.filter(x=>x.id!==c)||[]}));try{if(await at(r,{title:g.title,description:g.description},M.current),F.current!==s){B(p=>{const V=[...p[r]||[]];return V.splice(o,0,g),{...p,[r]:V}});return}v.current&&N(v.current),i?.onSuccess?.()}catch(p){B(V=>{const Ce=[...V[r]||[]];return Ce.splice(o,0,g),{...V,[r]:Ce}});const x=p instanceof Error?p:new Error("Failed to accept suggestion");throw i?.onError?.(x),x}},[N]),_e=a.useCallback(async(r,c)=>{const i=[...P.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}B(o=>({...o,[r]:[]}));const d=F.current;for(let o=0;o<i.length&&F.current===d;o++){const g=i[o];try{await at(r,{title:g.title,description:g.description},M.current)}catch(p){const x=p instanceof Error?p:new Error("Failed to accept all suggestions");throw c?.onError?.(x),x}}F.current===d&&(v.current&&N(v.current),c?.onSuccess?.())},[N]),Xe=a.useCallback(()=>{R([]),oe(!1)},[]),ue=a.useCallback(r=>{B(c=>{const i={...c};return delete i[r],i}),le(c=>{const i={...c};return delete i[r],i})},[]),$e=a.useCallback(async(r,c)=>{const i=++Q.current,s=n;ne(!0),ie(null);try{const d=await Tt(r,s);if(Q.current!==i||n!==s)return;se(d),c?.onSuccess?.()}catch(d){if(Q.current!==i||n!==s)return;const o=d instanceof Error?d:new Error(String(d));ie(o),se(null),c?.onError?.(o)}finally{Q.current===i&&ne(!1)}},[n]),Qe=a.useCallback(()=>{se(null),ie(null),ne(!1)},[]),pe=a.useCallback(async()=>{await be(),v.current&&await N(v.current)},[be,N]);return{roadmaps:j,selectedRoadmapId:b,selectedRoadmap:S,milestones:I,featuresByMilestoneId:_,loading:re,error:W,createRoadmap:ve,updateRoadmap:Ge,deleteRoadmap:h,selectRoadmap:$,createMilestone:H,updateMilestone:xe,deleteMilestone:Ve,reorderMilestones:ee,createFeature:Re,updateFeature:D,deleteFeature:G,reorderFeatures:q,moveFeature:we,milestoneSuggestions:he,isGeneratingSuggestions:J,generateMilestoneSuggestions:Ie,updateMilestoneSuggestionDraft:de,acceptMilestoneSuggestion:L,acceptAllMilestoneSuggestions:qe,clearMilestoneSuggestions:Xe,featureSuggestionsByMilestoneId:X,isGeneratingFeatureSuggestions:Te,generateFeatureSuggestions:je,updateFeatureSuggestionDraft:Pe,acceptFeatureSuggestion:Je,acceptAllFeatureSuggestions:_e,clearFeatureSuggestions:ue,handoffPayload:ke,isFetchingHandoff:ge,handoffError:Oe,fetchHandoff:$e,clearHandoff:Qe,refresh:pe}}function qt({isOpen:l,onClose:n,roadmapTitle:j,handoffPayload:f,isLoading:b,error:C,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:I=>I.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: ",j]}),e.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close modal",children:e.jsx(ae,{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."}),C&&e.jsxs("div",{className:"form-error",style:{marginBottom:"var(--space-lg)"},children:["Error loading handoff data: ",C.message]}),!f&&!b&&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"]})}),b&&e.jsxs("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:[e.jsx(Wt,{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(Ut,{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 Jt({roadmap:l,isSelected:n,onSelect:j,onEdit:f,onDelete:b,onExport:C}){const S=_=>{_.key==="Enter"&&j()},m=_=>{_.stopPropagation(),f()},I=_=>{_.stopPropagation(),b()},E=_=>{_.stopPropagation(),C()};return e.jsxs("div",{className:`roadmaps-view__sidebar-item${n?" roadmaps-view__sidebar-item--active":""}`,onClick:j,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(Ee,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:I,role:"button",title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`roadmap-delete-${l.id}`,tabIndex:0,children:e.jsx(Le,{size:14})})]})]})}function Xt({roadmaps:l,selectedRoadmapId:n,onSelect:j,onCreate:f,onEdit:b,onDelete:C,onExport:S,showCreateForm:m,onCancelCreate:I,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(pt,{onSave:E,onCancel:I})}),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(_=>e.jsxs("div",{className:`roadmaps-view__mobile-item${_.id===n?" roadmaps-view__mobile-item--active":""}`,onClick:()=>j(_.id),role:"button",tabIndex:0,onKeyDown:y=>{y.key==="Enter"&&j(_.id)},"data-testid":`mobile-roadmap-item-${_.id}`,children:[e.jsxs("div",{className:"roadmaps-view__mobile-item-content",children:[e.jsx("span",{className:"roadmaps-view__mobile-item-title",children:_.title}),_.description&&e.jsx("span",{className:"roadmaps-view__mobile-item-desc",children:_.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(_)},title:"Export roadmap","aria-label":"Export roadmap","data-testid":`mobile-roadmap-export-${_.id}`,children:e.jsx(rt,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),b(_)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`mobile-roadmap-edit-${_.id}`,children:e.jsx(Ee,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:y=>{y.stopPropagation(),C(_.id)},title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`mobile-roadmap-delete-${_.id}`,children:e.jsx(Le,{size:16})})]})]},_.id))})]})}function Qt({roadmapTitle:l,onBack:n,onEdit:j,onDelete:f,onCreate:b}){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(Vt,{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:b,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:j,title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"mobile-header-edit-btn",children:e.jsx(Ee,{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(Le,{size:18})})]})]})}function Zt({milestone:l,features:n,onEditMilestone:j,onDeleteMilestone:f,onAddFeature:b,onEditFeature:C,onDeleteFeature:S,milestoneEdit:m,onStartMilestoneEdit:I,onCancelMilestoneEdit:E,onSaveMilestoneEdit:_,featureEdit:y,onStartFeatureEdit:re,onCancelFeatureEdit:z,onSaveFeatureEdit:W,projectId:A,addToast:ke,isMilestoneDragging:se,isMilestoneDropTarget:ge,milestoneDropPosition:ne,onMilestoneDragStart:Oe,onMilestoneDragEnd:ie,onMilestoneDragOver:he,onMilestoneDrop:R,onMilestoneDragLeave:J,isFeatureDragging:oe,isFeatureDropTarget:X,featureDropIndex:B,onFeatureDragStart:Fe,onFeatureDragEnd:le,onFeatureDragOver:P,onFeatureDrop:De,onFeatureDragLeave:Y,onFeatureDropOnMilestone:Me,featureSuggestions:F,isGeneratingFeatureSuggestions:Q,onGenerateFeatureSuggestions:Be,onAcceptFeatureSuggestion:v,onAcceptAllFeatureSuggestions:He,onUpdateFeatureSuggestionDraft:fe,onClearFeatureSuggestions:M}){const Z=m?.milestoneId===l.id,be=h=>{h.key==="Enter"?(h.preventDefault(),m&&_({title:m.value})):h.key==="Escape"&&E()},N=h=>{h.key==="Escape"&&E()},ve=["roadmaps-view__milestone",se?"roadmaps-view__milestone--dragging":"",ge?"roadmaps-view__milestone--drop-target":"",ge&&ne==="before"?"roadmaps-view__milestone--drop-before":"",ge&&ne==="after"?"roadmaps-view__milestone--drop-after":""].filter(Boolean).join(" "),Ge=["roadmaps-view__feature-list",X?"roadmaps-view__feature-list--drop-target":""].filter(Boolean).join(" ");return e.jsxs("div",{className:ve,draggable:!Z,onDragStart:h=>{Z||(Oe(l.id),h.dataTransfer.setData("text/plain",`milestone:${l.id}`),h.dataTransfer.effectAllowed="move")},onDragEnd:ie,onDragOver:h=>{h.dataTransfer.types.includes("text/plain")&&h.dataTransfer.types.includes("text/plain")&&(h.preventDefault(),h.dataTransfer.dropEffect="move",he(l.id))},onDrop:h=>{h.preventDefault(),h.dataTransfer.getData("text/plain")?.startsWith("feature:")||R(l.id)},onDragLeave:J,"data-testid":`milestone-card-${l.id}`,children:[e.jsx("div",{className:"roadmaps-view__milestone-header",children:Z?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:()=>I(),onKeyDown:be,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:()=>_({title:m.value}),"aria-label":"Save milestone title",title:"Save",children:e.jsx(me,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:E,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(ae,{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:j,title:"Edit milestone","aria-label":"Edit milestone","data-testid":`milestone-edit-${l.id}`,children:e.jsx(Ee,{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(Le,{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:b,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:()=>{Be?.()},disabled:Q??!1,title:"Generate feature suggestions with AI","aria-label":"Generate feature suggestions","data-testid":`generate-features-${l.id}`,children:[e.jsx(ut,{size:12}),e.jsx("span",{children:Q?"Generating...":"AI Suggestions"})]})]}),e.jsxs("div",{className:Ge,onDragOver:h=>{h.preventDefault(),h.dataTransfer.dropEffect="move",h.dataTransfer.getData("text/plain")?.startsWith("feature:")&&Me()},onDrop:h=>{h.preventDefault();const $=h.dataTransfer.getData("text/plain");$?.startsWith("feature:")&&De($.split(":")[1],n.length)},onDragLeave:Y,children:[n.length===0?e.jsx("p",{className:"roadmaps-view__empty-features",children:"No features yet."}):n.map((h,$)=>{const H=y?.featureId===h.id,xe=oe(h.id),Ve=D=>{D.key==="Enter"?(D.preventDefault(),y&&W({title:y.value})):D.key==="Escape"&&z()},Re=["roadmaps-view__feature-item",xe?"roadmaps-view__feature-item--dragging":"",X&&B===$?"roadmaps-view__feature-item--drop-before":"",X&&B===$+1?"roadmaps-view__feature-item--drop-after":""].filter(Boolean).join(" ");return e.jsx("div",{className:Re,draggable:!H,onDragStart:D=>{H||(Fe(h.id,l.id),D.dataTransfer.setData("text/plain",`feature:${h.id}`),D.dataTransfer.effectAllowed="move")},onDragEnd:le,onDragOver:D=>{if(D.preventDefault(),D.stopPropagation(),D.dataTransfer.dropEffect="move",D.dataTransfer.getData("text/plain")?.startsWith("feature:")){const ee=D.currentTarget.getBoundingClientRect(),q=ee.top+ee.height/2,we=D.clientY<q?"before":"after";P(h.id,we)}},onDrop:D=>{D.preventDefault(),D.stopPropagation();const G=D.dataTransfer.getData("text/plain");if(G?.startsWith("feature:")){const ee=G.split(":")[1],q=D.currentTarget.getBoundingClientRect(),we=q.top+q.height/2,ce=D.clientY<we?"before":"after";let Ie=$;ce==="after"&&(Ie=$+1),De(ee,Ie)}},onDragLeave:Y,"data-testid":`feature-item-${h.id}`,children:H?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:Ve,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:()=>W({title:y.value}),"aria-label":"Save feature title",title:"Save",children:e.jsx(me,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:z,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(ae,{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:()=>C(h.id),title:"Edit feature","aria-label":"Edit feature","data-testid":`feature-edit-${h.id}`,children:e.jsx(Ee,{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(Le,{size:12})})]})]})},h.id)}),F&&F.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:()=>He?.(),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:()=>M?.(),title:"Clear suggestions","aria-label":"Clear","data-testid":`clear-features-${l.id}`,children:"Clear"})]})]}),e.jsx("div",{className:"roadmap-suggestion-list",children:F.map(h=>e.jsx(ea,{suggestion:h,onUpdateDraft:$=>fe?.(l.id,h.id,$),onAccept:()=>{v?.(l.id,h.id)},testIdPrefix:`feature-suggestion-${l.id}`},h.id))})]})]})]})}function ea({suggestion:l,onUpdateDraft:n,onAccept:j,testIdPrefix:f}){const[b,C]=a.useState(!1),[S,m]=a.useState(l.title),[I,E]=a.useState(l.description||""),_=()=>{m(l.title),E(l.description||""),C(!0)},y=()=>{n({title:S.trim(),description:I.trim()||void 0}),C(!1)},re=()=>{m(l.title),E(l.description||""),C(!1)},z=()=>{l.title.trim()&&j()},W=l.title.trim().length>0;return b?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:A=>m(A.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:I,onChange:A=>E(A.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(me,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:re,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(ae,{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:_,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Ee,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:z,disabled:!W,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(me,{size:12})})]})]})}function dt({suggestion:l,onUpdateDraft:n,onAccept:j,testIdPrefix:f}){const[b,C]=a.useState(!1),[S,m]=a.useState(l.title),[I,E]=a.useState(l.description||""),_=()=>{m(l.title),E(l.description||""),C(!0)},y=()=>{n({title:S.trim(),description:I.trim()||void 0}),C(!1)},re=()=>{m(l.title),E(l.description||""),C(!1)},z=()=>{l.title.trim()&&j()},W=l.title.trim().length>0;return b?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:A=>m(A.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:I,onChange:A=>E(A.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(me,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:re,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(ae,{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:_,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Ee,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:z,disabled:!W,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(me,{size:12})})]})]})}function pt({onSave:l,onCancel:n}){const[j,f]=a.useState(""),[b,C]=a.useState(""),S=m=>{m.preventDefault(),j.trim()&&l({title:j.trim(),description:b.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:j,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:b,onChange:m=>C(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:!j.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 ta({onSave:l,onCancel:n}){const[j,f]=a.useState(""),[b,C]=a.useState(""),S=m=>{m.preventDefault(),j.trim()&&l({title:j.trim(),description:b.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:j,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:b,onChange:m=>C(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:!j.trim(),"aria-label":"Save milestone",title:"Save","data-testid":"create-milestone-submit",children:e.jsx(me,{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(ae,{size:14})})]})]})})}function aa({onSave:l,onCancel:n}){const[j,f]=a.useState(""),[b,C]=a.useState(""),S=m=>{m.preventDefault(),j.trim()&&l({title:j.trim(),description:b.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:j,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:b,onChange:m=>C(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:!j.trim(),"aria-label":"Save feature",title:"Save","data-testid":"create-feature-submit",children:e.jsx(me,{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(ae,{size:14})})]})]})})}function oa({projectId:l,addToast:n}){const j=Pt()==="mobile",{roadmaps:f,selectedRoadmapId:b,selectedRoadmap:C,milestones:S,featuresByMilestoneId:m,loading:I,error:E,createRoadmap:_,updateRoadmap:y,deleteRoadmap:re,selectRoadmap:z,createMilestone:W,updateMilestone:A,deleteMilestone:ke,createFeature:se,updateFeature:ge,deleteFeature:ne,reorderMilestones:Oe,reorderFeatures:ie,moveFeature:he,milestoneSuggestions:R,isGeneratingSuggestions:J,generateMilestoneSuggestions:oe,updateMilestoneSuggestionDraft:X,acceptMilestoneSuggestion:B,acceptAllMilestoneSuggestions:Fe,clearMilestoneSuggestions:le,featureSuggestionsByMilestoneId:P,isGeneratingFeatureSuggestions:De,generateFeatureSuggestions:Y,updateFeatureSuggestionDraft:Me,acceptFeatureSuggestion:F,acceptAllFeatureSuggestions:Q,clearFeatureSuggestions:Be,handoffPayload:v,isFetchingHandoff:He,handoffError:fe,fetchHandoff:M,clearHandoff:Z}=Yt({projectId:l}),[be,N]=a.useState(!1),[ve,Ge]=a.useState(null),[h,$]=a.useState(""),[H,xe]=a.useState(""),[Ve,Re]=a.useState(!1),D=a.useRef(null);a.useEffect(()=>{D.current!==null&&D.current!==b&&Re(!1),D.current=b},[b]);const[G,ee]=a.useState({roadmapId:null,field:null,value:""}),[q,we]=a.useState({milestoneId:null,field:null,value:""}),[ce,Ie]=a.useState({featureId:null,field:null,value:""}),[de,L]=a.useState({type:null,parentId:void 0,title:"",description:""}),[qe,Te]=a.useState(!1),[je,Pe]=a.useState({draggingId:null,dropTargetId:null,dropPosition:null}),Je=a.useCallback(t=>{Pe(u=>({...u,draggingId:t}))},[]),_e=a.useCallback(()=>{Pe({draggingId:null,dropTargetId:null,dropPosition:null})},[]),Xe=a.useCallback(t=>{Pe(u=>u.draggingId===t?u:{...u,dropTargetId:t,dropPosition:null})},[]),[ue,$e]=a.useState({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}),Qe=a.useCallback((t,u)=>{$e(w=>({...w,draggingId:t,draggingMilestoneId:u}))},[]),pe=a.useCallback(()=>{$e({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null})},[]),r=a.useCallback((t,u)=>{$e(w=>{if(w.draggingId===t)return w;const T=(m[w.draggingMilestoneId||""]||[]).findIndex(Ne=>Ne.id===t);let K;return u==="before"?K=T:K=T+1,{...w,dropTargetMilestoneId:w.draggingMilestoneId,dropTargetIndex:K,dropPosition:u}})},[m]),c=a.useCallback(()=>{$e(t=>({...t,dropTargetMilestoneId:t.draggingMilestoneId,dropTargetIndex:(m[t.draggingMilestoneId||""]||[]).length}))},[m]),i=a.useCallback(async(t,u)=>{const{draggingMilestoneId:w,dropTargetMilestoneId:O}=ue;if(!w){pe();return}const T=O||w,K=m[w]||[],Ne=K.find(Se=>Se.id===t);if(!Ne){pe();return}if(w!==T){if(w===T){pe();return}try{await he(t,T,u,{onError:Se=>{n(`Failed to move feature: ${Se.message}`,"error")}})}catch{}}else{const Se=[...K],yt=Se.findIndex(ze=>ze.id===t);Se.splice(yt,1),Se.splice(u,0,Ne);const ct=Se.map(ze=>ze.id),Nt=K.map(ze=>ze.id);if(ct.join(",")===Nt.join(",")){pe();return}try{await ie(w,ct,{onError:ze=>{n(`Failed to reorder features: ${ze.message}`,"error")}})}catch{}}pe()},[ue,m,ie,he,n,pe]),s=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),w=t.clientX,O=t.clientY;(w<u.left||w>u.right||O<u.top||O>u.bottom)&&$e(T=>({...T,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}))},[]),d=a.useCallback(t=>ue.draggingId===t,[ue.draggingId]),o=a.useCallback(async t=>{const{draggingId:u}=je;if(!u||u===t){_e();return}const w=S.map(Ne=>Ne.id),O=w.indexOf(u),T=w.indexOf(t);if(O===-1||T===-1){_e();return}const K=[...w];if(K.splice(O,1),K.splice(T,0,u),K.join(",")===w.join(",")){_e();return}try{await Oe(b,K,{onError:Ne=>{n(`Failed to reorder milestones: ${Ne.message}`,"error")}})}catch{}_e()},[je,S,b,Oe,n,_e]),g=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),w=t.clientX,O=t.clientY;(w<u.left||w>u.right||O<u.top||O>u.bottom)&&Pe(T=>({...T,dropTargetId:null,dropPosition:null}))},[]),p=a.useCallback(t=>{z(t.id),ee({roadmapId:t.id,field:"title",value:t.title})},[z]),x=a.useCallback(()=>{ee({roadmapId:null,field:null,value:""})},[]),V=a.useCallback(async t=>{if(G.roadmapId)try{await y(G.roadmapId,t,{onError:u=>n(u.message,"error")}),x()}catch{}},[G.roadmapId,y,x,n]),te=a.useCallback(async t=>{if(window.confirm("Delete this roadmap? This cannot be undone."))try{await re(t,{onError:u=>n(u.message,"error")}),n("Roadmap deleted","success")}catch{}},[re,n]),Ce=a.useCallback((t,u)=>{Ge(t),$(u),N(!0),Z()},[Z]),Ke=a.useCallback(()=>{N(!1),Ge(null),$(""),Z()},[Z]),k=a.useCallback(()=>{ve&&M(ve,{onError:t=>n(`Failed to load handoff: ${t.message}`,"error")})},[ve,M,n]),U=a.useCallback(()=>{if(v){const t=JSON.stringify(v,null,2);navigator.clipboard.writeText(t).then(()=>{n("Handoff data copied to clipboard","success")}).catch(()=>{n("Failed to copy to clipboard","error")})}},[v,n]),Ue=a.useCallback(async t=>{try{await _(t,{onError:u=>n(u.message,"error")}),L({type:null,parentId:void 0,title:"",description:""}),n("Roadmap created","success")}catch{}},[_,n]),We=a.useCallback(t=>{we({milestoneId:t.id,field:"title",value:t.title})},[]),Ze=a.useCallback(()=>{we({milestoneId:null,field:null,value:""})},[]),mt=a.useCallback(async t=>{if(q.milestoneId)try{await A(q.milestoneId,t,{onError:u=>n(u.message,"error")}),Ze()}catch{}},[q.milestoneId,A,Ze,n]),gt=a.useCallback(async t=>{if(window.confirm("Delete this milestone and all its features?"))try{await ke(t,{onError:u=>n(u.message,"error")}),n("Milestone deleted","success")}catch{}},[ke,n]),ht=a.useCallback(async t=>{try{await W(t,{onError:u=>n(u.message,"error")}),L({type:null,parentId:void 0,title:"",description:""}),n("Milestone created","success")}catch{}},[W,n]),st=a.useCallback((t,u,w)=>{Ie({featureId:t,field:"title",value:u})},[]),et=a.useCallback(()=>{Ie({featureId:null,field:null,value:""})},[]),ft=a.useCallback(async t=>{if(ce.featureId)try{await ge(ce.featureId,t,{onError:u=>n(u.message,"error")}),et()}catch{}},[ce.featureId,ge,et,n]),bt=a.useCallback(async t=>{if(window.confirm("Delete this feature?"))try{await ne(t,{onError:u=>n(u.message,"error")}),n("Feature deleted","success")}catch{}},[ne,n]),nt=a.useCallback(async()=>{if(H.trim())try{await oe(H,5,{onError:t=>n(t.message,"error")})}catch{}},[H,oe,n]),it=a.useCallback(async t=>{try{await B(t,{onError:u=>n(u.message,"error")}),n("Milestone added","success")}catch{}},[B,n]),ot=a.useCallback(async()=>{try{await Fe({onError:t=>n(t.message,"error")}),n(`${R.length} milestones added`,"success"),xe("")}catch{}},[Fe,R.length,n]),lt=a.useCallback(()=>{le(),xe("")},[le]),vt=a.useCallback(async t=>{try{await Y(t,{count:5},{onError:u=>n(u.message,"error")})}catch{}},[Y,n]),xt=a.useCallback(async(t,u)=>{try{await F(t,u,{onError:w=>n(w.message,"error")}),n("Feature added","success")}catch{}},[F,n]),wt=a.useCallback((t,u,w)=>{Me(t,u,w)},[Me]),jt=a.useCallback(async t=>{const u=P[t]||[];try{await Q(t,{onError:w=>n(w.message,"error")}),n(`${u.length} features added`,"success")}catch{}},[Q,P,n]),_t=a.useCallback(t=>{Be(t)},[Be]),Ct=a.useCallback(async(t,u)=>{try{await se(t,u,{onError:w=>n(w.message,"error")}),L({type:null,parentId:void 0,title:"",description:""}),n("Feature created","success")}catch{}},[se,n]),ye=b;return I&&f.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--loading",children:e.jsx("div",{className:"roadmaps-view__loading-state",children:"Loading roadmaps..."})}):E&&f.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:E.message})]})}):e.jsxs("div",{className:"roadmaps-view",children:[j&&!ye&&e.jsx(Xt,{roadmaps:f,selectedRoadmapId:ye,onSelect:t=>z(t),onCreate:()=>Te(!0),onEdit:p,onDelete:te,onExport:t=>Ce(t.id,t.title),showCreateForm:qe,onCancelCreate:()=>Te(!1),onSaveCreate:async t=>{await Ue(t),Te(!1)}}),!j&&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:()=>L({type:"roadmap",title:"",description:""}),title:"Create roadmap","aria-label":"Create roadmap","data-testid":"create-roadmap-btn",children:e.jsx(Ae,{size:16})})]}),de.type==="roadmap"&&e.jsx(pt,{onSave:Ue,onCancel:()=>L({type:null,parentId:void 0,title:"",description:""})}),e.jsx("div",{className:"roadmaps-view__sidebar-list",children:f.length===0?e.jsx("p",{className:"roadmaps-view__empty-sidebar",children:"No roadmaps yet. Click + to create one."}):f.map(t=>e.jsx(Jt,{roadmap:t,isSelected:t.id===ye,onSelect:()=>z(t.id),onEdit:()=>p(t),onDelete:()=>te(t.id),onExport:()=>Ce(t.id,t.title)},t.id))})]}),e.jsxs("main",{className:"roadmaps-view__main","aria-label":"Roadmap content",children:[j&&ye&&e.jsx(Qt,{roadmapTitle:C?.title||"Untitled Roadmap",onBack:()=>z(null),onEdit:()=>{C&&p(C)},onDelete:()=>te(ye),onCreate:()=>Te(!0)}),ye?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"roadmaps-view__roadmap-header",children:G.roadmapId===ye?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:G.value,onChange:t=>ee(u=>({...u,value:t.target.value})),onKeyDown:t=>{t.key==="Enter"?V({title:G.value}):t.key==="Escape"&&x()},placeholder:"Roadmap title",autoFocus:!0,"data-testid":"roadmap-title-input"}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>V({title:G.value}),"aria-label":"Save",title:"Save",children:e.jsx(me,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:x,"aria-label":"Cancel",title:"Cancel",children:e.jsx(ae,{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:C?.title||"Untitled Roadmap"}),e.jsxs("div",{className:"roadmaps-view__roadmap-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>{C&&p(C)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"edit-roadmap-btn",children:e.jsx(Ee,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>te(ye),title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"delete-roadmap-btn",children:e.jsx(Le,{size:16})})]})]}),C?.description&&e.jsx("p",{className:"roadmaps-view__roadmap-desc",children:C.description})]})}),j?Ve?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:()=>Re(!1),"aria-label":"Collapse suggestion panel","data-testid":"collapse-suggestion-panel-btn",children:e.jsx(Lt,{size:16})})]}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:H,onChange:t=>xe(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:J||!b,"data-testid":"goal-prompt-input",autoFocus:!0}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:nt,disabled:!H.trim()||J||!b,"data-testid":"generate-suggestions-btn",children:J?"Generating...":"Generate Milestones"}),R.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:ot,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",R.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:lt,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(ae,{size:14})})]})]})]}),R.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:R.map(t=>e.jsx(dt,{suggestion:t,onUpdateDraft:u=>X(t.id,u),onAccept:()=>it(t.id),testIdPrefix:"suggestion"},t.id))})]}):e.jsx("div",{className:"roadmap-suggestion-section",children:e.jsxs("button",{className:"roadmap-suggestion-expand-btn",onClick:()=>Re(!0),disabled:!b,"data-testid":"expand-suggestion-panel-btn",children:[e.jsx(ut,{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:H,onChange:t=>xe(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:J||!b,"data-testid":"goal-prompt-input"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:nt,disabled:!H.trim()||J||!b,"data-testid":"generate-suggestions-btn",children:J?"Generating...":"Generate Milestones"}),R.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:ot,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",R.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:lt,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(ae,{size:14})})]})]})]}),R.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:R.map(t=>e.jsx(dt,{suggestion:t,onUpdateDraft:u=>X(t.id,u),onAccept:()=>it(t.id),testIdPrefix:"suggestion"},t.id))})]}),e.jsxs("div",{className:"roadmaps-view__milestone-lanes",children:[de.type==="milestone"&&e.jsx(ta,{onSave:ht,onCancel:()=>L({type:null,parentId:void 0,title:"",description:""})}),S.length===0&&de.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:()=>L({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:[de.type!=="milestone"&&e.jsxs("button",{className:"roadmaps-view__add-milestone-fab",onClick:()=>L({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]}),S.map(t=>e.jsx(Zt,{milestone:t,features:m[t.id]||[],onEditMilestone:()=>We(t),onDeleteMilestone:()=>gt(t.id),onAddFeature:()=>L({type:"feature",parentId:t.id,title:"",description:""}),onEditFeature:u=>{const w=m[t.id]?.find(O=>O.id===u);w&&st(u,w.title,w.description)},onDeleteFeature:bt,milestoneEdit:q,onStartMilestoneEdit:()=>We(t),onCancelMilestoneEdit:Ze,onSaveMilestoneEdit:mt,featureEdit:ce,onStartFeatureEdit:st,onCancelFeatureEdit:et,onSaveFeatureEdit:ft,projectId:l,addToast:n,isMilestoneDragging:je.draggingId===t.id,isMilestoneDropTarget:je.dropTargetId===t.id,milestoneDropPosition:je.dropTargetId===t.id?je.dropPosition:null,onMilestoneDragStart:Je,onMilestoneDragEnd:_e,onMilestoneDragOver:Xe,onMilestoneDrop:o,onMilestoneDragLeave:g,isFeatureDragging:d,isFeatureDropTarget:ue.dropTargetMilestoneId===t.id,featureDropIndex:ue.dropTargetMilestoneId===t.id?ue.dropTargetIndex:null,onFeatureDragStart:Qe,onFeatureDragEnd:pe,onFeatureDragOver:r,onFeatureDrop:i,onFeatureDragLeave:s,onFeatureDropOnMilestone:c,featureSuggestions:P[t.id],isGeneratingFeatureSuggestions:De(t.id),onGenerateFeatureSuggestions:()=>vt(t.id),onAcceptFeatureSuggestion:u=>xt(t.id,u),onAcceptAllFeatureSuggestions:()=>jt(t.id),onUpdateFeatureSuggestionDraft:(u,w,O)=>wt(u,w,O),onClearFeatureSuggestions:()=>_t(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."})})]}),de.type==="feature"&&de.parentId&&e.jsx("div",{className:"roadmaps-view__feature-create-overlay",children:e.jsx(aa,{onSave:t=>Ct(de.parentId,t),onCancel:()=>L({type:null,parentId:void 0,title:"",description:""})})}),e.jsx(qt,{isOpen:be,onClose:Ke,roadmapId:ve||"",roadmapTitle:h,handoffPayload:v,isLoading:He,error:fe,onFetchHandoff:k,onCopyToClipboard:U})]})}export{oa as RoadmapsView};
6
+ */const Kt=[["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"}]],Wt=St("loader",Kt);function Yt(l){const n=l?.projectId,[j,f]=a.useState([]),[b,C]=a.useState(null),[S,m]=a.useState(null),[I,E]=a.useState([]),[_,y]=a.useState({}),[re,z]=a.useState(!1),[W,A]=a.useState(null),[ke,se]=a.useState(null),[ge,ne]=a.useState(!1),[Oe,ie]=a.useState(null),[he,R]=a.useState([]),[J,oe]=a.useState(!1),[X,B]=a.useState({}),[Fe,le]=a.useState({}),P=a.useRef(X),De=a.useRef(Fe),Y=a.useRef(he);P.current=X,De.current=Fe,Y.current=he;const Me=a.useRef(n),F=a.useRef(0),Q=a.useRef(0),Be=a.useRef(j),v=a.useRef(b),He=a.useRef(I),fe=a.useRef(_),M=a.useRef(n),Z=a.useRef(ke);Be.current=j,v.current=b,He.current=I,fe.current=_,M.current=n,Z.current=ke,a.useEffect(()=>{Me.current!==n&&(Me.current=n,F.current++,C(null),m(null),E([]),y({}),se(null),ie(null),R([]),oe(!1),B({}),le({}))},[n]);const be=a.useCallback(async()=>{z(!0),A(null);try{const r=await Et(n);f(r)}catch(r){A(r instanceof Error?r:new Error("Failed to fetch roadmaps"))}finally{z(!1)}},[n]),N=a.useCallback(async r=>{try{const c=await kt(r,n);m(c),E(c.milestones||[]);const i={};for(const s of c.milestones||[])i[s.id]=s.features||[];y(i)}catch(c){A(c instanceof Error?c:new Error("Failed to fetch roadmap"))}},[n]);a.useEffect(()=>{be()},[be]),a.useEffect(()=>{b?N(b):(m(null),E([]),y({}))},[b,N]);const ve=a.useCallback(async(r,c)=>{try{const i=await Ft(r,M.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}},[]),Te=a.useCallback(async(r,c,i)=>{try{const s=await Dt(r,c,M.current);f(d=>d.map(o=>o.id===r?s:o)),v.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 Mt(r,M.current),f(i=>i.filter(s=>s.id!==r)),v.current===r&&(C(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}},[]),$=a.useCallback(r=>{C(r)},[]),H=a.useCallback(async(r,c)=>{const i=v.current;if(!i){const s=new Error("No roadmap selected");throw c?.onError?.(s),s}try{const s=await tt(i,r,M.current);E(d=>[...d,s]),y(d=>({...d,[s.id]:[]})),v.current&&N(v.current),c?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create milestone");throw c?.onError?.(d),d}},[N]),xe=a.useCallback(async(r,c,i)=>{try{const s=await Rt(r,c,M.current);E(d=>d.map(o=>o.id===r?s:o)),v.current&&N(v.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update milestone");throw i?.onError?.(d),d}},[N]),Ve=a.useCallback(async(r,c)=>{try{await It(r,M.current),E(i=>i.filter(s=>s.id!==r)),y(i=>{const s={...i};return delete s[r],s}),v.current&&N(v.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete milestone");throw c?.onError?.(s),s}},[N]),Re=a.useCallback(async(r,c,i)=>{try{const s=await at(r,c,M.current);y(d=>({...d,[r]:[...d[r]||[],s]})),v.current&&N(v.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create feature");throw i?.onError?.(d),d}},[N]),D=a.useCallback(async(r,c,i)=>{try{const s=await $t(r,c,M.current);y(d=>{const o={};for(const[g,p]of Object.entries(d))o[g]=p.map(x=>x.id===r?s:x);return o}),v.current&&N(v.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update feature");throw i?.onError?.(d),d}},[N]),T=a.useCallback(async(r,c)=>{try{await zt(r,M.current),y(i=>{const s={};for(const[d,o]of Object.entries(i))s[d]=o.filter(g=>g.id!==r);return s}),v.current&&N(v.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete feature");throw c?.onError?.(s),s}},[N]),ee=a.useCallback(async(r,c,i)=>{const s=He.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 At(r,c,M.current),v.current&&N(v.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]),q=a.useCallback(async(r,c,i)=>{const s=fe.current[r]||[],d=s.map(p=>p.id);if(JSON.stringify(d)===JSON.stringify(c)){i?.onSuccess?.();return}const o=fe.current,g=c.map(p=>s.find(x=>x.id===p)).filter(p=>p!==void 0).map((p,x)=>({...p,orderIndex:x}));y(p=>({...p,[r]:g}));try{await Ot(r,c,M.current),v.current&&N(v.current),i?.onSuccess?.()}catch(p){y(o);const x=p instanceof Error?p:new Error("Failed to reorder features");throw i?.onError?.(x),x}},[N]),we=a.useCallback(async(r,c,i,s)=>{const d=fe.current;let o=null;for(const[k,U]of Object.entries(d))if(U.some(Ue=>Ue.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]||[],U=Math.max(0,Math.min(i,k.length-1));if(k.findIndex(We=>We.id===r)===U){s?.onSuccess?.();return}}const g=d[o]||[],p=d[c]||[],x=g.find(k=>k.id===r);if(!x){const k=new Error("Feature not found");throw s?.onError?.(k),k}const V=g.filter(k=>k.id!==r).map((k,U)=>({...k,orderIndex:U})),te={...x,milestoneId:c,orderIndex:i},Ce=[...p];Ce.splice(i,0,te);const Ke=Ce.map((k,U)=>({...k,orderIndex:U}));y(o===c?k=>({...k,[o]:Ke}):k=>({...k,[o]:V,[c]:Ke}));try{await Bt(r,c,i,n),v.current&&N(v.current),s?.onSuccess?.()}catch(k){y(d);const U=k instanceof Error?k:new Error("Failed to move feature");throw s?.onError?.(U),U}},[N,n]);function ce(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`draft-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}const Ie=a.useCallback(async(r,c=5,i)=>{const s=v.current;if(!s){const g=new Error("No roadmap selected");throw i?.onError?.(g),g}const d=F.current,o=M.current;oe(!0);try{const g=await Ht(s,r,c,o);if(F.current!==d)return;const p=g.suggestions.map(x=>({id:ce(),title:x.title,description:x.description}));R(p),i?.onSuccess?.()}catch(g){if(F.current!==d)return;const p=g instanceof Error?g:new Error("Failed to generate suggestions");throw i?.onError?.(p),p}finally{F.current===d&&oe(!1)}},[]),de=a.useCallback((r,c)=>{const s=Y.current.map(d=>d.id===r?{...d,...c}:d);Y.current=s,R(d=>d.map(o=>o.id===r?{...o,...c}:o))},[]),L=a.useCallback(async(r,c)=>{const i=v.current;if(!i){const p=new Error("No roadmap selected");throw c?.onError?.(p),p}const s=F.current,d=Y.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}R(p=>p.filter(x=>x.id!==r));try{if(await tt(i,{title:g.title,description:g.description},M.current),F.current!==s){R(p=>{const x=[...p];return x.splice(o,0,g),x});return}v.current&&N(v.current),c?.onSuccess?.()}catch(p){R(V=>{const te=[...V];return te.splice(o,0,g),te});const x=p instanceof Error?p:new Error("Failed to accept suggestion");throw c?.onError?.(x),x}},[N]),qe=a.useCallback(async r=>{const c=v.current;if(!c){const o=new Error("No roadmap selected");throw r?.onError?.(o),o}const i=[...Y.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}R([]);const d=F.current;for(let o=0;o<i.length&&F.current===d;o++){const g=i[o];try{await tt(c,{title:g.title,description:g.description},M.current)}catch(p){const x=p instanceof Error?p:new Error("Failed to accept all suggestions");throw r?.onError?.(x),x}}F.current===d&&(v.current&&N(v.current),r?.onSuccess?.())},[N]),Ge=a.useCallback(r=>De.current[r]??!1,[]),je=a.useCallback(async(r,c,i)=>{const s=F.current,d=M.current;le(o=>({...o,[r]:!0}));try{const o=await Tt(r,c,d);if(F.current!==s)return;const g=o.suggestions.map(p=>({id:ce(),title:p.title,description:p.description}));B(p=>({...p,[r]:g})),i?.onSuccess?.()}catch(o){if(F.current!==s)return;const g=o instanceof Error?o:new Error("Failed to generate feature suggestions");throw i?.onError?.(g),g}finally{F.current===s&&le(o=>({...o,[r]:!1}))}},[]),Pe=a.useCallback((r,c,i)=>{const d=(P.current[r]||[]).map(o=>o.id===c?{...o,...i}:o);P.current={...P.current,[r]:d},B(o=>({...o,[r]:o[r]?.map(g=>g.id===c?{...g,...i}:g)||[]}))},[]),Je=a.useCallback(async(r,c,i)=>{const s=F.current,d=P.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}B(p=>({...p,[r]:p[r]?.filter(x=>x.id!==c)||[]}));try{if(await at(r,{title:g.title,description:g.description},M.current),F.current!==s){B(p=>{const V=[...p[r]||[]];return V.splice(o,0,g),{...p,[r]:V}});return}v.current&&N(v.current),i?.onSuccess?.()}catch(p){B(V=>{const Ce=[...V[r]||[]];return Ce.splice(o,0,g),{...V,[r]:Ce}});const x=p instanceof Error?p:new Error("Failed to accept suggestion");throw i?.onError?.(x),x}},[N]),_e=a.useCallback(async(r,c)=>{const i=[...P.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}B(o=>({...o,[r]:[]}));const d=F.current;for(let o=0;o<i.length&&F.current===d;o++){const g=i[o];try{await at(r,{title:g.title,description:g.description},M.current)}catch(p){const x=p instanceof Error?p:new Error("Failed to accept all suggestions");throw c?.onError?.(x),x}}F.current===d&&(v.current&&N(v.current),c?.onSuccess?.())},[N]),Xe=a.useCallback(()=>{R([]),oe(!1)},[]),ue=a.useCallback(r=>{B(c=>{const i={...c};return delete i[r],i}),le(c=>{const i={...c};return delete i[r],i})},[]),$e=a.useCallback(async(r,c)=>{const i=++Q.current,s=n;ne(!0),ie(null);try{const d=await Gt(r,s);if(Q.current!==i||n!==s)return;se(d),c?.onSuccess?.()}catch(d){if(Q.current!==i||n!==s)return;const o=d instanceof Error?d:new Error(String(d));ie(o),se(null),c?.onError?.(o)}finally{Q.current===i&&ne(!1)}},[n]),Qe=a.useCallback(()=>{se(null),ie(null),ne(!1)},[]),pe=a.useCallback(async()=>{await be(),v.current&&await N(v.current)},[be,N]);return{roadmaps:j,selectedRoadmapId:b,selectedRoadmap:S,milestones:I,featuresByMilestoneId:_,loading:re,error:W,createRoadmap:ve,updateRoadmap:Te,deleteRoadmap:h,selectRoadmap:$,createMilestone:H,updateMilestone:xe,deleteMilestone:Ve,reorderMilestones:ee,createFeature:Re,updateFeature:D,deleteFeature:T,reorderFeatures:q,moveFeature:we,milestoneSuggestions:he,isGeneratingSuggestions:J,generateMilestoneSuggestions:Ie,updateMilestoneSuggestionDraft:de,acceptMilestoneSuggestion:L,acceptAllMilestoneSuggestions:qe,clearMilestoneSuggestions:Xe,featureSuggestionsByMilestoneId:X,isGeneratingFeatureSuggestions:Ge,generateFeatureSuggestions:je,updateFeatureSuggestionDraft:Pe,acceptFeatureSuggestion:Je,acceptAllFeatureSuggestions:_e,clearFeatureSuggestions:ue,handoffPayload:ke,isFetchingHandoff:ge,handoffError:Oe,fetchHandoff:$e,clearHandoff:Qe,refresh:pe}}function qt({isOpen:l,onClose:n,roadmapTitle:j,handoffPayload:f,isLoading:b,error:C,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:I=>I.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: ",j]}),e.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close modal",children:e.jsx(ae,{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."}),C&&e.jsxs("div",{className:"form-error",style:{marginBottom:"var(--space-lg)"},children:["Error loading handoff data: ",C.message]}),!f&&!b&&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"]})}),b&&e.jsxs("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:[e.jsx(Wt,{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(Ut,{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 Jt({roadmap:l,isSelected:n,onSelect:j,onEdit:f,onDelete:b,onExport:C}){const S=_=>{_.key==="Enter"&&j()},m=_=>{_.stopPropagation(),f()},I=_=>{_.stopPropagation(),b()},E=_=>{_.stopPropagation(),C()};return e.jsxs("div",{className:`roadmaps-view__sidebar-item${n?" roadmaps-view__sidebar-item--active":""}`,onClick:j,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(Ee,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:I,role:"button",title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`roadmap-delete-${l.id}`,tabIndex:0,children:e.jsx(Le,{size:14})})]})]})}function Xt({roadmaps:l,selectedRoadmapId:n,onSelect:j,onCreate:f,onEdit:b,onDelete:C,onExport:S,showCreateForm:m,onCancelCreate:I,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(pt,{onSave:E,onCancel:I})}),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(_=>e.jsxs("div",{className:`roadmaps-view__mobile-item${_.id===n?" roadmaps-view__mobile-item--active":""}`,onClick:()=>j(_.id),role:"button",tabIndex:0,onKeyDown:y=>{y.key==="Enter"&&j(_.id)},"data-testid":`mobile-roadmap-item-${_.id}`,children:[e.jsxs("div",{className:"roadmaps-view__mobile-item-content",children:[e.jsx("span",{className:"roadmaps-view__mobile-item-title",children:_.title}),_.description&&e.jsx("span",{className:"roadmaps-view__mobile-item-desc",children:_.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(_)},title:"Export roadmap","aria-label":"Export roadmap","data-testid":`mobile-roadmap-export-${_.id}`,children:e.jsx(rt,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),b(_)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`mobile-roadmap-edit-${_.id}`,children:e.jsx(Ee,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:y=>{y.stopPropagation(),C(_.id)},title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`mobile-roadmap-delete-${_.id}`,children:e.jsx(Le,{size:16})})]})]},_.id))})]})}function Qt({roadmapTitle:l,onBack:n,onEdit:j,onDelete:f,onCreate:b}){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(Vt,{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:b,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:j,title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"mobile-header-edit-btn",children:e.jsx(Ee,{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(Le,{size:18})})]})]})}function Zt({milestone:l,features:n,onEditMilestone:j,onDeleteMilestone:f,onAddFeature:b,onEditFeature:C,onDeleteFeature:S,milestoneEdit:m,onStartMilestoneEdit:I,onCancelMilestoneEdit:E,onSaveMilestoneEdit:_,featureEdit:y,onStartFeatureEdit:re,onCancelFeatureEdit:z,onSaveFeatureEdit:W,projectId:A,addToast:ke,isMilestoneDragging:se,isMilestoneDropTarget:ge,milestoneDropPosition:ne,onMilestoneDragStart:Oe,onMilestoneDragEnd:ie,onMilestoneDragOver:he,onMilestoneDrop:R,onMilestoneDragLeave:J,isFeatureDragging:oe,isFeatureDropTarget:X,featureDropIndex:B,onFeatureDragStart:Fe,onFeatureDragEnd:le,onFeatureDragOver:P,onFeatureDrop:De,onFeatureDragLeave:Y,onFeatureDropOnMilestone:Me,featureSuggestions:F,isGeneratingFeatureSuggestions:Q,onGenerateFeatureSuggestions:Be,onAcceptFeatureSuggestion:v,onAcceptAllFeatureSuggestions:He,onUpdateFeatureSuggestionDraft:fe,onClearFeatureSuggestions:M}){const Z=m?.milestoneId===l.id,be=h=>{h.key==="Enter"?(h.preventDefault(),m&&_({title:m.value})):h.key==="Escape"&&E()},N=h=>{h.key==="Escape"&&E()},ve=["roadmaps-view__milestone",se?"roadmaps-view__milestone--dragging":"",ge?"roadmaps-view__milestone--drop-target":"",ge&&ne==="before"?"roadmaps-view__milestone--drop-before":"",ge&&ne==="after"?"roadmaps-view__milestone--drop-after":""].filter(Boolean).join(" "),Te=["roadmaps-view__feature-list",X?"roadmaps-view__feature-list--drop-target":""].filter(Boolean).join(" ");return e.jsxs("div",{className:ve,draggable:!Z,onDragStart:h=>{Z||(Oe(l.id),h.dataTransfer.setData("text/plain",`milestone:${l.id}`),h.dataTransfer.effectAllowed="move")},onDragEnd:ie,onDragOver:h=>{h.dataTransfer.types.includes("text/plain")&&h.dataTransfer.types.includes("text/plain")&&(h.preventDefault(),h.dataTransfer.dropEffect="move",he(l.id))},onDrop:h=>{h.preventDefault(),h.dataTransfer.getData("text/plain")?.startsWith("feature:")||R(l.id)},onDragLeave:J,"data-testid":`milestone-card-${l.id}`,children:[e.jsx("div",{className:"roadmaps-view__milestone-header",children:Z?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:()=>I(),onKeyDown:be,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:()=>_({title:m.value}),"aria-label":"Save milestone title",title:"Save",children:e.jsx(me,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:E,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(ae,{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:j,title:"Edit milestone","aria-label":"Edit milestone","data-testid":`milestone-edit-${l.id}`,children:e.jsx(Ee,{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(Le,{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:b,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:()=>{Be?.()},disabled:Q??!1,title:"Generate feature suggestions with AI","aria-label":"Generate feature suggestions","data-testid":`generate-features-${l.id}`,children:[e.jsx(ut,{size:12}),e.jsx("span",{children:Q?"Generating...":"AI Suggestions"})]})]}),e.jsxs("div",{className:Te,onDragOver:h=>{h.preventDefault(),h.dataTransfer.dropEffect="move",h.dataTransfer.getData("text/plain")?.startsWith("feature:")&&Me()},onDrop:h=>{h.preventDefault();const $=h.dataTransfer.getData("text/plain");$?.startsWith("feature:")&&De($.split(":")[1],n.length)},onDragLeave:Y,children:[n.length===0?e.jsx("p",{className:"roadmaps-view__empty-features",children:"No features yet."}):n.map((h,$)=>{const H=y?.featureId===h.id,xe=oe(h.id),Ve=D=>{D.key==="Enter"?(D.preventDefault(),y&&W({title:y.value})):D.key==="Escape"&&z()},Re=["roadmaps-view__feature-item",xe?"roadmaps-view__feature-item--dragging":"",X&&B===$?"roadmaps-view__feature-item--drop-before":"",X&&B===$+1?"roadmaps-view__feature-item--drop-after":""].filter(Boolean).join(" ");return e.jsx("div",{className:Re,draggable:!H,onDragStart:D=>{H||(Fe(h.id,l.id),D.dataTransfer.setData("text/plain",`feature:${h.id}`),D.dataTransfer.effectAllowed="move")},onDragEnd:le,onDragOver:D=>{if(D.preventDefault(),D.stopPropagation(),D.dataTransfer.dropEffect="move",D.dataTransfer.getData("text/plain")?.startsWith("feature:")){const ee=D.currentTarget.getBoundingClientRect(),q=ee.top+ee.height/2,we=D.clientY<q?"before":"after";P(h.id,we)}},onDrop:D=>{D.preventDefault(),D.stopPropagation();const T=D.dataTransfer.getData("text/plain");if(T?.startsWith("feature:")){const ee=T.split(":")[1],q=D.currentTarget.getBoundingClientRect(),we=q.top+q.height/2,ce=D.clientY<we?"before":"after";let Ie=$;ce==="after"&&(Ie=$+1),De(ee,Ie)}},onDragLeave:Y,"data-testid":`feature-item-${h.id}`,children:H?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:Ve,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:()=>W({title:y.value}),"aria-label":"Save feature title",title:"Save",children:e.jsx(me,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:z,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(ae,{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:()=>C(h.id),title:"Edit feature","aria-label":"Edit feature","data-testid":`feature-edit-${h.id}`,children:e.jsx(Ee,{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(Le,{size:12})})]})]})},h.id)}),F&&F.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:()=>He?.(),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:()=>M?.(),title:"Clear suggestions","aria-label":"Clear","data-testid":`clear-features-${l.id}`,children:"Clear"})]})]}),e.jsx("div",{className:"roadmap-suggestion-list",children:F.map(h=>e.jsx(ea,{suggestion:h,onUpdateDraft:$=>fe?.(l.id,h.id,$),onAccept:()=>{v?.(l.id,h.id)},testIdPrefix:`feature-suggestion-${l.id}`},h.id))})]})]})]})}function ea({suggestion:l,onUpdateDraft:n,onAccept:j,testIdPrefix:f}){const[b,C]=a.useState(!1),[S,m]=a.useState(l.title),[I,E]=a.useState(l.description||""),_=()=>{m(l.title),E(l.description||""),C(!0)},y=()=>{n({title:S.trim(),description:I.trim()||void 0}),C(!1)},re=()=>{m(l.title),E(l.description||""),C(!1)},z=()=>{l.title.trim()&&j()},W=l.title.trim().length>0;return b?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:A=>m(A.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:I,onChange:A=>E(A.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(me,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:re,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(ae,{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:_,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Ee,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:z,disabled:!W,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(me,{size:12})})]})]})}function dt({suggestion:l,onUpdateDraft:n,onAccept:j,testIdPrefix:f}){const[b,C]=a.useState(!1),[S,m]=a.useState(l.title),[I,E]=a.useState(l.description||""),_=()=>{m(l.title),E(l.description||""),C(!0)},y=()=>{n({title:S.trim(),description:I.trim()||void 0}),C(!1)},re=()=>{m(l.title),E(l.description||""),C(!1)},z=()=>{l.title.trim()&&j()},W=l.title.trim().length>0;return b?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:A=>m(A.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:I,onChange:A=>E(A.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(me,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:re,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(ae,{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:_,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Ee,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:z,disabled:!W,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(me,{size:12})})]})]})}function pt({onSave:l,onCancel:n}){const[j,f]=a.useState(""),[b,C]=a.useState(""),S=m=>{m.preventDefault(),j.trim()&&l({title:j.trim(),description:b.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:j,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:b,onChange:m=>C(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:!j.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 ta({onSave:l,onCancel:n}){const[j,f]=a.useState(""),[b,C]=a.useState(""),S=m=>{m.preventDefault(),j.trim()&&l({title:j.trim(),description:b.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:j,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:b,onChange:m=>C(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:!j.trim(),"aria-label":"Save milestone",title:"Save","data-testid":"create-milestone-submit",children:e.jsx(me,{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(ae,{size:14})})]})]})})}function aa({onSave:l,onCancel:n}){const[j,f]=a.useState(""),[b,C]=a.useState(""),S=m=>{m.preventDefault(),j.trim()&&l({title:j.trim(),description:b.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:j,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:b,onChange:m=>C(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:!j.trim(),"aria-label":"Save feature",title:"Save","data-testid":"create-feature-submit",children:e.jsx(me,{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(ae,{size:14})})]})]})})}function oa({projectId:l,addToast:n}){const j=Pt()==="mobile",{roadmaps:f,selectedRoadmapId:b,selectedRoadmap:C,milestones:S,featuresByMilestoneId:m,loading:I,error:E,createRoadmap:_,updateRoadmap:y,deleteRoadmap:re,selectRoadmap:z,createMilestone:W,updateMilestone:A,deleteMilestone:ke,createFeature:se,updateFeature:ge,deleteFeature:ne,reorderMilestones:Oe,reorderFeatures:ie,moveFeature:he,milestoneSuggestions:R,isGeneratingSuggestions:J,generateMilestoneSuggestions:oe,updateMilestoneSuggestionDraft:X,acceptMilestoneSuggestion:B,acceptAllMilestoneSuggestions:Fe,clearMilestoneSuggestions:le,featureSuggestionsByMilestoneId:P,isGeneratingFeatureSuggestions:De,generateFeatureSuggestions:Y,updateFeatureSuggestionDraft:Me,acceptFeatureSuggestion:F,acceptAllFeatureSuggestions:Q,clearFeatureSuggestions:Be,handoffPayload:v,isFetchingHandoff:He,handoffError:fe,fetchHandoff:M,clearHandoff:Z}=Yt({projectId:l}),[be,N]=a.useState(!1),[ve,Te]=a.useState(null),[h,$]=a.useState(""),[H,xe]=a.useState(""),[Ve,Re]=a.useState(!1),D=a.useRef(null);a.useEffect(()=>{D.current!==null&&D.current!==b&&Re(!1),D.current=b},[b]);const[T,ee]=a.useState({roadmapId:null,field:null,value:""}),[q,we]=a.useState({milestoneId:null,field:null,value:""}),[ce,Ie]=a.useState({featureId:null,field:null,value:""}),[de,L]=a.useState({type:null,parentId:void 0,title:"",description:""}),[qe,Ge]=a.useState(!1),[je,Pe]=a.useState({draggingId:null,dropTargetId:null,dropPosition:null}),Je=a.useCallback(t=>{Pe(u=>({...u,draggingId:t}))},[]),_e=a.useCallback(()=>{Pe({draggingId:null,dropTargetId:null,dropPosition:null})},[]),Xe=a.useCallback(t=>{Pe(u=>u.draggingId===t?u:{...u,dropTargetId:t,dropPosition:null})},[]),[ue,$e]=a.useState({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}),Qe=a.useCallback((t,u)=>{$e(w=>({...w,draggingId:t,draggingMilestoneId:u}))},[]),pe=a.useCallback(()=>{$e({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null})},[]),r=a.useCallback((t,u)=>{$e(w=>{if(w.draggingId===t)return w;const G=(m[w.draggingMilestoneId||""]||[]).findIndex(Ne=>Ne.id===t);let K;return u==="before"?K=G:K=G+1,{...w,dropTargetMilestoneId:w.draggingMilestoneId,dropTargetIndex:K,dropPosition:u}})},[m]),c=a.useCallback(()=>{$e(t=>({...t,dropTargetMilestoneId:t.draggingMilestoneId,dropTargetIndex:(m[t.draggingMilestoneId||""]||[]).length}))},[m]),i=a.useCallback(async(t,u)=>{const{draggingMilestoneId:w,dropTargetMilestoneId:O}=ue;if(!w){pe();return}const G=O||w,K=m[w]||[],Ne=K.find(Se=>Se.id===t);if(!Ne){pe();return}if(w!==G){if(w===G){pe();return}try{await he(t,G,u,{onError:Se=>{n(`Failed to move feature: ${Se.message}`,"error")}})}catch{}}else{const Se=[...K],yt=Se.findIndex(ze=>ze.id===t);Se.splice(yt,1),Se.splice(u,0,Ne);const ct=Se.map(ze=>ze.id),Nt=K.map(ze=>ze.id);if(ct.join(",")===Nt.join(",")){pe();return}try{await ie(w,ct,{onError:ze=>{n(`Failed to reorder features: ${ze.message}`,"error")}})}catch{}}pe()},[ue,m,ie,he,n,pe]),s=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),w=t.clientX,O=t.clientY;(w<u.left||w>u.right||O<u.top||O>u.bottom)&&$e(G=>({...G,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}))},[]),d=a.useCallback(t=>ue.draggingId===t,[ue.draggingId]),o=a.useCallback(async t=>{const{draggingId:u}=je;if(!u||u===t){_e();return}const w=S.map(Ne=>Ne.id),O=w.indexOf(u),G=w.indexOf(t);if(O===-1||G===-1){_e();return}const K=[...w];if(K.splice(O,1),K.splice(G,0,u),K.join(",")===w.join(",")){_e();return}try{await Oe(b,K,{onError:Ne=>{n(`Failed to reorder milestones: ${Ne.message}`,"error")}})}catch{}_e()},[je,S,b,Oe,n,_e]),g=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),w=t.clientX,O=t.clientY;(w<u.left||w>u.right||O<u.top||O>u.bottom)&&Pe(G=>({...G,dropTargetId:null,dropPosition:null}))},[]),p=a.useCallback(t=>{z(t.id),ee({roadmapId:t.id,field:"title",value:t.title})},[z]),x=a.useCallback(()=>{ee({roadmapId:null,field:null,value:""})},[]),V=a.useCallback(async t=>{if(T.roadmapId)try{await y(T.roadmapId,t,{onError:u=>n(u.message,"error")}),x()}catch{}},[T.roadmapId,y,x,n]),te=a.useCallback(async t=>{if(window.confirm("Delete this roadmap? This cannot be undone."))try{await re(t,{onError:u=>n(u.message,"error")}),n("Roadmap deleted","success")}catch{}},[re,n]),Ce=a.useCallback((t,u)=>{Te(t),$(u),N(!0),Z()},[Z]),Ke=a.useCallback(()=>{N(!1),Te(null),$(""),Z()},[Z]),k=a.useCallback(()=>{ve&&M(ve,{onError:t=>n(`Failed to load handoff: ${t.message}`,"error")})},[ve,M,n]),U=a.useCallback(()=>{if(v){const t=JSON.stringify(v,null,2);navigator.clipboard.writeText(t).then(()=>{n("Handoff data copied to clipboard","success")}).catch(()=>{n("Failed to copy to clipboard","error")})}},[v,n]),Ue=a.useCallback(async t=>{try{await _(t,{onError:u=>n(u.message,"error")}),L({type:null,parentId:void 0,title:"",description:""}),n("Roadmap created","success")}catch{}},[_,n]),We=a.useCallback(t=>{we({milestoneId:t.id,field:"title",value:t.title})},[]),Ze=a.useCallback(()=>{we({milestoneId:null,field:null,value:""})},[]),mt=a.useCallback(async t=>{if(q.milestoneId)try{await A(q.milestoneId,t,{onError:u=>n(u.message,"error")}),Ze()}catch{}},[q.milestoneId,A,Ze,n]),gt=a.useCallback(async t=>{if(window.confirm("Delete this milestone and all its features?"))try{await ke(t,{onError:u=>n(u.message,"error")}),n("Milestone deleted","success")}catch{}},[ke,n]),ht=a.useCallback(async t=>{try{await W(t,{onError:u=>n(u.message,"error")}),L({type:null,parentId:void 0,title:"",description:""}),n("Milestone created","success")}catch{}},[W,n]),st=a.useCallback((t,u,w)=>{Ie({featureId:t,field:"title",value:u})},[]),et=a.useCallback(()=>{Ie({featureId:null,field:null,value:""})},[]),ft=a.useCallback(async t=>{if(ce.featureId)try{await ge(ce.featureId,t,{onError:u=>n(u.message,"error")}),et()}catch{}},[ce.featureId,ge,et,n]),bt=a.useCallback(async t=>{if(window.confirm("Delete this feature?"))try{await ne(t,{onError:u=>n(u.message,"error")}),n("Feature deleted","success")}catch{}},[ne,n]),nt=a.useCallback(async()=>{if(H.trim())try{await oe(H,5,{onError:t=>n(t.message,"error")})}catch{}},[H,oe,n]),it=a.useCallback(async t=>{try{await B(t,{onError:u=>n(u.message,"error")}),n("Milestone added","success")}catch{}},[B,n]),ot=a.useCallback(async()=>{try{await Fe({onError:t=>n(t.message,"error")}),n(`${R.length} milestones added`,"success"),xe("")}catch{}},[Fe,R.length,n]),lt=a.useCallback(()=>{le(),xe("")},[le]),vt=a.useCallback(async t=>{try{await Y(t,{count:5},{onError:u=>n(u.message,"error")})}catch{}},[Y,n]),xt=a.useCallback(async(t,u)=>{try{await F(t,u,{onError:w=>n(w.message,"error")}),n("Feature added","success")}catch{}},[F,n]),wt=a.useCallback((t,u,w)=>{Me(t,u,w)},[Me]),jt=a.useCallback(async t=>{const u=P[t]||[];try{await Q(t,{onError:w=>n(w.message,"error")}),n(`${u.length} features added`,"success")}catch{}},[Q,P,n]),_t=a.useCallback(t=>{Be(t)},[Be]),Ct=a.useCallback(async(t,u)=>{try{await se(t,u,{onError:w=>n(w.message,"error")}),L({type:null,parentId:void 0,title:"",description:""}),n("Feature created","success")}catch{}},[se,n]),ye=b;return I&&f.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--loading",children:e.jsx("div",{className:"roadmaps-view__loading-state",children:"Loading roadmaps..."})}):E&&f.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:E.message})]})}):e.jsxs("div",{className:"roadmaps-view",children:[j&&!ye&&e.jsx(Xt,{roadmaps:f,selectedRoadmapId:ye,onSelect:t=>z(t),onCreate:()=>Ge(!0),onEdit:p,onDelete:te,onExport:t=>Ce(t.id,t.title),showCreateForm:qe,onCancelCreate:()=>Ge(!1),onSaveCreate:async t=>{await Ue(t),Ge(!1)}}),!j&&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:()=>L({type:"roadmap",title:"",description:""}),title:"Create roadmap","aria-label":"Create roadmap","data-testid":"create-roadmap-btn",children:e.jsx(Ae,{size:16})})]}),de.type==="roadmap"&&e.jsx(pt,{onSave:Ue,onCancel:()=>L({type:null,parentId:void 0,title:"",description:""})}),e.jsx("div",{className:"roadmaps-view__sidebar-list",children:f.length===0?e.jsx("p",{className:"roadmaps-view__empty-sidebar",children:"No roadmaps yet. Click + to create one."}):f.map(t=>e.jsx(Jt,{roadmap:t,isSelected:t.id===ye,onSelect:()=>z(t.id),onEdit:()=>p(t),onDelete:()=>te(t.id),onExport:()=>Ce(t.id,t.title)},t.id))})]}),e.jsxs("main",{className:"roadmaps-view__main","aria-label":"Roadmap content",children:[j&&ye&&e.jsx(Qt,{roadmapTitle:C?.title||"Untitled Roadmap",onBack:()=>z(null),onEdit:()=>{C&&p(C)},onDelete:()=>te(ye),onCreate:()=>Ge(!0)}),ye?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"roadmaps-view__roadmap-header",children:T.roadmapId===ye?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:T.value,onChange:t=>ee(u=>({...u,value:t.target.value})),onKeyDown:t=>{t.key==="Enter"?V({title:T.value}):t.key==="Escape"&&x()},placeholder:"Roadmap title",autoFocus:!0,"data-testid":"roadmap-title-input"}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>V({title:T.value}),"aria-label":"Save",title:"Save",children:e.jsx(me,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:x,"aria-label":"Cancel",title:"Cancel",children:e.jsx(ae,{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:C?.title||"Untitled Roadmap"}),e.jsxs("div",{className:"roadmaps-view__roadmap-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>{C&&p(C)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"edit-roadmap-btn",children:e.jsx(Ee,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>te(ye),title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"delete-roadmap-btn",children:e.jsx(Le,{size:16})})]})]}),C?.description&&e.jsx("p",{className:"roadmaps-view__roadmap-desc",children:C.description})]})}),j?Ve?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:()=>Re(!1),"aria-label":"Collapse suggestion panel","data-testid":"collapse-suggestion-panel-btn",children:e.jsx(Lt,{size:16})})]}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:H,onChange:t=>xe(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:J||!b,"data-testid":"goal-prompt-input",autoFocus:!0}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:nt,disabled:!H.trim()||J||!b,"data-testid":"generate-suggestions-btn",children:J?"Generating...":"Generate Milestones"}),R.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:ot,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",R.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:lt,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(ae,{size:14})})]})]})]}),R.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:R.map(t=>e.jsx(dt,{suggestion:t,onUpdateDraft:u=>X(t.id,u),onAccept:()=>it(t.id),testIdPrefix:"suggestion"},t.id))})]}):e.jsx("div",{className:"roadmap-suggestion-section",children:e.jsxs("button",{className:"roadmap-suggestion-expand-btn",onClick:()=>Re(!0),disabled:!b,"data-testid":"expand-suggestion-panel-btn",children:[e.jsx(ut,{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:H,onChange:t=>xe(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:J||!b,"data-testid":"goal-prompt-input"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:nt,disabled:!H.trim()||J||!b,"data-testid":"generate-suggestions-btn",children:J?"Generating...":"Generate Milestones"}),R.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:ot,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",R.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:lt,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(ae,{size:14})})]})]})]}),R.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:R.map(t=>e.jsx(dt,{suggestion:t,onUpdateDraft:u=>X(t.id,u),onAccept:()=>it(t.id),testIdPrefix:"suggestion"},t.id))})]}),e.jsxs("div",{className:"roadmaps-view__milestone-lanes",children:[de.type==="milestone"&&e.jsx(ta,{onSave:ht,onCancel:()=>L({type:null,parentId:void 0,title:"",description:""})}),S.length===0&&de.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:()=>L({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:[de.type!=="milestone"&&e.jsxs("button",{className:"roadmaps-view__add-milestone-fab",onClick:()=>L({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]}),S.map(t=>e.jsx(Zt,{milestone:t,features:m[t.id]||[],onEditMilestone:()=>We(t),onDeleteMilestone:()=>gt(t.id),onAddFeature:()=>L({type:"feature",parentId:t.id,title:"",description:""}),onEditFeature:u=>{const w=m[t.id]?.find(O=>O.id===u);w&&st(u,w.title,w.description)},onDeleteFeature:bt,milestoneEdit:q,onStartMilestoneEdit:()=>We(t),onCancelMilestoneEdit:Ze,onSaveMilestoneEdit:mt,featureEdit:ce,onStartFeatureEdit:st,onCancelFeatureEdit:et,onSaveFeatureEdit:ft,projectId:l,addToast:n,isMilestoneDragging:je.draggingId===t.id,isMilestoneDropTarget:je.dropTargetId===t.id,milestoneDropPosition:je.dropTargetId===t.id?je.dropPosition:null,onMilestoneDragStart:Je,onMilestoneDragEnd:_e,onMilestoneDragOver:Xe,onMilestoneDrop:o,onMilestoneDragLeave:g,isFeatureDragging:d,isFeatureDropTarget:ue.dropTargetMilestoneId===t.id,featureDropIndex:ue.dropTargetMilestoneId===t.id?ue.dropTargetIndex:null,onFeatureDragStart:Qe,onFeatureDragEnd:pe,onFeatureDragOver:r,onFeatureDrop:i,onFeatureDragLeave:s,onFeatureDropOnMilestone:c,featureSuggestions:P[t.id],isGeneratingFeatureSuggestions:De(t.id),onGenerateFeatureSuggestions:()=>vt(t.id),onAcceptFeatureSuggestion:u=>xt(t.id,u),onAcceptAllFeatureSuggestions:()=>jt(t.id),onUpdateFeatureSuggestionDraft:(u,w,O)=>wt(u,w,O),onClearFeatureSuggestions:()=>_t(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."})})]}),de.type==="feature"&&de.parentId&&e.jsx("div",{className:"roadmaps-view__feature-create-overlay",children:e.jsx(aa,{onSave:t=>Ct(de.parentId,t),onCancel:()=>L({type:null,parentId:void 0,title:"",description:""})})}),e.jsx(qt,{isOpen:be,onClose:Ke,roadmapId:ve||"",roadmapTitle:h,handoffPayload:v,isLoading:He,error:fe,onFetchHandoff:k,onCopyToClipboard:U})]})}export{oa as RoadmapsView};
@@ -0,0 +1 @@
1
+ .settings-modal-heading{display:flex;flex-direction:column;gap:var(--space-xs)}.settings-modal-heading h3{margin:0}.settings-modal-version{margin:0;font-size:.85rem;color:var(--text-muted);font-weight:500}.settings-layout{display:flex;flex:1;flex-direction:row;min-height:0;overflow:hidden}.settings-mobile-section-picker{display:none}.settings-sidebar{width:170px;min-width:170px;border-right:1px solid var(--border);display:flex;flex-direction:column;overflow-y:auto;padding:10px 8px;gap:2px;background:#0000001a;scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-sidebar::-webkit-scrollbar{width:6px}.settings-sidebar::-webkit-scrollbar-track{background:transparent}.settings-sidebar::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-sidebar::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-nav-item{display:block;width:100%;padding:var(--space-sm) var(--space-md);font-size:13px;font-weight:500;color:var(--text-muted);background:none;border:none;border-left:3px solid transparent;border-radius:0 var(--radius) var(--radius) 0;cursor:pointer;text-align:left;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.settings-nav-item:hover{background:var(--bg);color:var(--text);border-left-color:var(--border)}.settings-nav-item:focus-visible{box-shadow:var(--focus-ring-strong);outline:none}.settings-nav-item.active{background:var(--bg);color:var(--todo);font-weight:600;border-left-color:var(--todo)}.settings-group-header{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);padding:var(--space-md) var(--space-md) var(--space-xs);margin-top:var(--space-sm);user-select:none}.settings-group-header:first-child{margin-top:0}.settings-content{flex:1;overflow-x:hidden;overflow-y:auto;padding:4px 0 12px;scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-content::-webkit-scrollbar{width:6px}.settings-content::-webkit-scrollbar-track{background:transparent}.settings-content::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-content::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-content>*{animation:settingsFadeIn var(--transition-normal)}@keyframes settingsFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.settings-section-heading{font-size:14px;font-weight:600;padding:var(--space-lg) var(--space-xl) var(--space-md);margin:0 var(--space-xl) 0;color:var(--text);border-bottom:1px solid var(--border);margin-bottom:var(--space-xs)}.settings-section-heading--spaced{margin-top:var(--space-xl)}.settings-plugins-subsection-toggle{display:inline-flex;gap:var(--space-xs);padding:0 var(--space-xl);margin:var(--space-md) 0}.settings-plugins-subsection-btn{display:inline-flex;align-items:center;justify-content:center;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--surface);color:var(--text-muted);font-size:.85rem;font-weight:600;padding:var(--space-xs) var(--space-md);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast)}.settings-plugins-subsection-btn:hover{background:var(--surface-hover, color-mix(in srgb, var(--text-muted) 8%, transparent));color:var(--text)}.settings-plugins-subsection-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.settings-plugins-subsection-btn.active{background:color-mix(in srgb,var(--todo) 14%,transparent);border-color:color-mix(in srgb,var(--todo) 45%,var(--border));color:var(--todo)}.settings-plugins-subsection-panel{padding-bottom:var(--space-md)}.settings-scope-icon{margin-right:6px;display:inline-flex;vertical-align:middle;color:var(--text-muted)}.settings-scope-banner{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-xl);margin:0 var(--space-xl) var(--space-xs);font-size:12px;border-radius:var(--radius);color:var(--text-muted)}.settings-scope-global{background:color-mix(in srgb,var(--color-info) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--color-info) 40%,transparent)}.settings-scope-project{background:color-mix(in srgb,var(--color-success) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--color-success) 40%,transparent)}.settings-scope-mixed{background:color-mix(in srgb,var(--triage) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--triage) 40%,transparent)}.settings-note{display:block;padding:0 var(--space-xl);margin-top:var(--space-xs);font-size:12px;color:var(--text-muted)}.settings-overlap-ignore-group code{font-family:var(--font-mono);font-size:.9em}.settings-overlap-ignore-list{display:flex;flex-direction:column;gap:var(--space-sm);margin:var(--space-sm) 0}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-sm);align-items:center}.settings-overlap-path-picker-modal{max-width:min(960px,calc(100vw - var(--space-2xl)))}.settings-overlap-path-picker-body{display:flex;flex-direction:column;gap:var(--space-sm);max-height:min(70vh,720px)}.settings-overlap-path-picker-note{margin:0;font-size:12px;color:var(--text-muted)}.settings-section-divider{border-top:1px solid var(--border);margin:var(--space-lg) var(--space-xl)}@media(max-width:768px){.settings-note{padding:0 var(--space-lg)}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{grid-template-columns:minmax(0,1fr)}.settings-overlap-ignore-row>.btn{justify-self:start}.settings-overlap-path-picker-modal{max-width:calc(100vw - var(--space-md))}}.ntfy-advanced-disclosure{margin-top:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.ntfy-advanced-disclosure>summary{cursor:pointer;list-style:none;padding:var(--space-sm) var(--space-md);font-size:12px;font-weight:600;color:var(--text)}.ntfy-advanced-disclosure>summary::-webkit-details-marker{display:none}.ntfy-advanced-content{padding:0 var(--space-md) var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.memory-status-message{display:flex;gap:var(--space-md);align-items:center;justify-content:space-between;margin-bottom:var(--space-md)}.memory-status-message span{min-width:0}.memory-retrieval-test{margin-top:var(--space-lg)}.memory-test-result{margin:0 var(--space-xl) var(--space-lg);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-test-result strong,.memory-test-result span{color:var(--text);font-size:12px}.memory-test-result small{display:block;margin-top:var(--space-xs);color:var(--text-muted);font-size:12px}.memory-test-result ul{margin:var(--space-md) 0 0;padding:0;list-style:none}.memory-test-result li{padding-top:var(--space-sm);border-top:var(--btn-border-width) solid var(--border)}.memory-test-result li+li{margin-top:var(--space-sm)}.memory-test-result p{margin:var(--space-xs) 0 0;color:var(--text-muted);font-size:12px;line-height:1.5;overflow-wrap:anywhere}.memory-editor-section{margin-top:var(--space-lg)}.memory-file-summary{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--space-xs) var(--space-md);align-items:center;margin:0 var(--space-xl) var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-file-summary span{display:inline-flex;align-items:center;justify-content:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);color:var(--color-info);background:color-mix(in srgb,var(--color-info) 12%,transparent);font-size:11px;font-weight:600}.memory-file-summary strong{min-width:0;overflow-wrap:anywhere;color:var(--text);font-family:var(--font-mono);font-size:12px}.memory-file-summary small{grid-column:2;color:var(--text-muted);font-size:12px}.memory-editor-frame{min-height:50vh;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;display:flex;flex-direction:column}.auth-section-hint{padding:12px 16px;margin-bottom:12px;background:var(--bg-tertiary);border-radius:var(--radius);font-size:13px;color:var(--text-muted);border-left:3px solid var(--text-muted)}.auth-provider-group{margin-bottom:16px}.auth-group-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted);margin-bottom:8px;padding:0 4px}.auth-provider-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:8px;overflow:hidden;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.auth-provider-card:hover{border-color:var(--text-dim)}.auth-provider-card--authenticated{border-color:color-mix(in srgb,var(--color-success) 40%,var(--border));background:color-mix(in srgb,var(--color-success) 5%,var(--surface))}.auth-provider-card--authenticated:hover{border-color:color-mix(in srgb,var(--color-success) 60%,var(--border))}.auth-provider-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;gap:12px}.auth-provider-info{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.auth-provider-info strong{font-weight:500;color:var(--text)}.auth-provider-icon-slot{display:inline-flex;align-items:center;justify-content:center;inline-size:calc(var(--space-md) + var(--space-xs) * 2);block-size:calc(var(--space-md) + var(--space-xs) * 2);flex-shrink:0}.auth-provider-icon-slot .provider-icon{display:inline-flex}.auth-hint{display:block;padding:12px 4px 0;font-size:12px;color:var(--text-muted);border-top:1px solid var(--border);margin-top:8px}.auth-login-instructions{margin-top:var(--space-sm);margin-bottom:0;padding:var(--space-sm) var(--space-md);border:1px solid color-mix(in srgb,var(--color-info) 35%,var(--border));border-radius:var(--radius-md);background:color-mix(in srgb,var(--color-info) 8%,transparent);color:var(--text);line-height:1.5;white-space:pre-wrap}.auth-apikey-section{display:flex;flex-direction:column;gap:4px;align-items:flex-end;flex-shrink:0}.auth-apikey-input-row{display:flex;gap:6px;align-items:center}.auth-apikey-input{background:var(--bg-input);border:1px solid var(--border);border-radius:6px;color:var(--text);padding:6px 10px;font-size:13px;width:180px;font-family:monospace}.auth-apikey-input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #6366f133}.auth-apikey-input:disabled{opacity:.6}.auth-apikey-progress{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);padding-right:4px}.auth-apikey-error{font-size:11px;color:var(--color-error);padding-right:4px}.auth-key-hint{font-family:var(--font-mono);font-size:12px;color:var(--text-muted);display:inline-block;margin-top:var(--space-xs);user-select:none}.settings-lane-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:500;white-space:nowrap}.settings-lane-badge--override{background-color:color-mix(in srgb,var(--color-accent) 20%,transparent);color:var(--color-accent)}.settings-lane-badge--inherited{background-color:color-mix(in srgb,var(--color-text-muted) 15%,transparent);color:var(--text-muted)}.settings-description{font-size:13px;color:var(--text-secondary);margin-bottom:var(--space-md);line-height:1.5}.settings-model-presets{display:flex;flex-direction:column;gap:var(--space-md)}.settings-preset-list{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-item{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.settings-preset-item-meta{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.settings-preset-item-meta strong{color:var(--text);overflow-wrap:anywhere}.settings-preset-summary{font-size:12px;overflow-wrap:anywhere}.settings-preset-item-actions{display:flex;gap:var(--space-xs);flex-wrap:wrap;justify-content:flex-end}.settings-preset-actions{display:flex;justify-content:flex-start}.settings-preset-editor{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,var(--card))}.settings-preset-editor-fields{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-editor .form-group{padding:0}.settings-preset-editor-actions{justify-content:flex-start;margin-top:0;padding:0}.settings-preset-auto-select{margin-top:var(--space-sm)}.settings-preset-size-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-sm)}.settings-preset-size-row{padding:0}@media(max-width:768px){.settings-layout{flex-direction:column;min-height:0}.settings-mobile-section-picker{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-md) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border);background:var(--surface)}.settings-mobile-section-picker label{color:var(--text-muted);font-weight:600;text-transform:uppercase}.settings-mobile-section-picker select{width:100%}.settings-mobile-section-picker select:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.settings-sidebar{display:none}.settings-nav-item{display:flex;align-items:center;justify-content:center;gap:4px;border-left:none;border-bottom:2px solid transparent;border-radius:var(--radius) var(--radius) 0 0;padding:6px 12px;white-space:nowrap}.settings-nav-item:hover{border-left-color:transparent;border-bottom-color:var(--border)}.settings-nav-item.active{border-left-color:transparent;border-bottom-color:var(--todo)}.settings-group-header{display:none}.settings-scope-icon{margin-right:0}.settings-content{flex:1;min-height:0;overflow-x:hidden;overflow-y:auto}.settings-content .form-group small{overflow-wrap:break-word;word-break:break-all}.settings-content input,.settings-content select,.settings-content textarea{font-size:16px}.settings-section-heading{padding:var(--space-lg) var(--space-lg) var(--space-md);margin:0 var(--space-lg) 0}.settings-plugins-subsection-toggle{display:flex;width:100%;padding:0 var(--space-lg)}.settings-plugins-subsection-btn{flex:1;min-height:36px}.settings-plugins-subsection-panel{padding-left:var(--space-lg);padding-right:var(--space-lg)}.form-group{padding:0 14px}.settings-scope-banner{padding:var(--space-sm) var(--space-lg)}.memory-editor-frame{min-height:45vh}.memory-file-summary{grid-template-columns:1fr;margin:0 var(--space-lg) var(--space-md)}.memory-status-message{align-items:stretch;flex-direction:column}.memory-file-summary span{justify-content:flex-start}.memory-file-summary small{grid-column:auto}.settings-description{padding:0 var(--space-lg)}.settings-content .btn,.settings-preset-item-actions .btn{min-height:36px}.auth-provider-row{flex-wrap:wrap;padding:12px 14px;gap:var(--space-sm)}.auth-section-hint{margin:0 14px 12px;padding:10px 14px}.auth-provider-group{margin-bottom:12px}.auth-group-label{padding:0 14px}.auth-provider-card{margin:0 14px 8px}.auth-provider-header{flex-wrap:wrap;padding:10px 14px;gap:10px}.auth-provider-header>div:not(.auth-provider-info):not(.auth-apikey-section){margin-left:auto}.auth-provider-info{width:100%;flex-basis:100%}.auth-apikey-section{width:100%;flex-basis:100%;align-items:flex-end}.auth-apikey-input-row{width:100%;flex-wrap:wrap;justify-content:flex-end}.auth-apikey-input{flex:1;min-width:120px;width:auto}.auth-apikey-input-row .btn{flex-shrink:0;margin-left:auto}.auth-hint{padding:12px 14px 0}.settings-model-presets{gap:var(--space-sm)}.settings-preset-item{flex-direction:column;align-items:stretch;padding:var(--space-sm) var(--space-md)}.settings-preset-item-actions{justify-content:flex-start}.settings-preset-editor{padding:var(--space-sm) var(--space-md)}.settings-preset-editor-actions{flex-wrap:wrap}.settings-preset-size-grid{grid-template-columns:1fr;gap:var(--space-xs)}}