@runfusion/fusion 0.9.3 → 0.10.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.
- package/dist/bin.js +4077 -1291
- package/dist/client/assets/{AgentDetailView-D9UWpTYr.js → AgentDetailView-BtpZ4jxh.js} +3 -3
- package/dist/client/assets/{AgentsView-DeCfRupM.js → AgentsView-Dxdtt0Bm.js} +3 -3
- package/dist/client/assets/ChatView-Bra9fNAG.js +1 -0
- package/dist/client/assets/{DevServerView-B7EjWlgc.js → DevServerView-UkgjEw9-.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-crtmkC00.js → DirectoryPicker-Cls4HWxP.js} +1 -1
- package/dist/client/assets/{DocumentsView-BLxVoopL.js → DocumentsView-BRBUPFVA.js} +1 -1
- package/dist/client/assets/{InsightsView-CcdTychV.js → InsightsView-BRDqHCLb.js} +1 -1
- package/dist/client/assets/{MemoryView-rSwx9Md8.js → MemoryView-DvTrwFnQ.js} +1 -1
- package/dist/client/assets/{NodesView-Bwz0cHKV.js → NodesView-C4Ffl_o0.js} +3 -3
- package/dist/client/assets/{PiExtensionsManager-Uo3E8Ae7.js → PiExtensionsManager-CeI1syeZ.js} +3 -3
- package/dist/client/assets/{PluginManager-HtW8xVY8.js → PluginManager-BgeoYhLk.js} +1 -1
- package/dist/client/assets/ResearchView-BVJFgfat.css +1 -0
- package/dist/client/assets/ResearchView-fmEOm4A2.js +1 -0
- package/dist/client/assets/{RoadmapsView-C2j64cbz.js → RoadmapsView-DNb4x75S.js} +2 -2
- package/dist/client/assets/{SettingsModal-YjpwLH2V.css → SettingsModal-9HS8MnmW.css} +1 -1
- package/dist/client/assets/SettingsModal-CDPDmHhd.css +1 -0
- package/dist/client/assets/{SettingsModal-CVd9kNk7.js → SettingsModal-CRMr4tL6.js} +1 -1
- package/dist/client/assets/SettingsModal-D1xq0WZm.js +31 -0
- package/dist/client/assets/{SetupWizardModal-Dy-vQpTm.js → SetupWizardModal-tF8B_aG_.js} +1 -1
- package/dist/client/assets/{SkillsView-BQwTyjxc.js → SkillsView-uyl47gSf.js} +1 -1
- package/dist/client/assets/{TodoView-Dce4DrzU.js → TodoView-CbzDtV53.js} +2 -2
- package/dist/client/assets/{folder-open-DWUflP4Q.js → folder-open-DPpmGJ-v.js} +1 -1
- package/dist/client/assets/{index-C3-q81dV.css → index-BqK6TvSa.css} +1 -1
- package/dist/client/assets/index-DyXZm9QN.js +656 -0
- package/dist/client/assets/{list-checks-CusZ_RMn.js → list-checks-D62pw1I8.js} +1 -1
- package/dist/client/assets/{star-C-NXZn1F.js → star-B8EbxNgI.js} +1 -1
- package/dist/client/assets/{upload-CXJ5L6L4.js → upload-CpnLno9z.js} +1 -1
- package/dist/client/assets/{users-YaA3x5mt.js → users-B_C_0qzA.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/extension.js +3201 -714
- package/dist/pi-claude-cli/index.ts +31 -5
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/pi-claude-cli/src/__tests__/process-manager.test.ts +90 -0
- package/dist/pi-claude-cli/src/__tests__/provider.test.ts +13 -3
- package/dist/pi-claude-cli/src/process-manager.ts +65 -0
- package/package.json +1 -1
- package/dist/client/assets/ChatView-ChlqnJfu.js +0 -1
- package/dist/client/assets/ResearchView-BV-iy9g8.js +0 -1
- package/dist/client/assets/ResearchView-aQkoD9QR.css +0 -1
- package/dist/client/assets/SettingsModal-ClnT1Lcv.js +0 -31
- package/dist/client/assets/SettingsModal-FfIAhzcJ.css +0 -1
- package/dist/client/assets/index-Bs3RZu5I.js +0 -656
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{c as Et,
|
|
1
|
+
import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{c as Et,a_ as kt,a$ as Ft,b0 as Dt,b1 as Mt,b2 as Rt,b3 as tt,b4 as It,b5 as $t,b6 as at,b7 as zt,b8 as At,b9 as Bt,ba as Ot,bb as Ht,bc as Gt,bd as Pt,be as Tt,p as Lt,aP as Vt,D as Ae,bf as he,X as re,aC as Fe,N as Te,a9 as Ut,af as pt,aB as rt,a6 as Kt,bg as Ye,bh as Wt}from"./index-DyXZm9QN.js";import"./vendor-xterm-DzcZoU0P.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const Yt=[["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m16.2 7.8 2.9-2.9",key:"r700ao"}],["path",{d:"M18 12h4",key:"wj9ykh"}],["path",{d:"m16.2 16.2 2.9 2.9",key:"1bxg5t"}],["path",{d:"M12 18v4",key:"jadmvz"}],["path",{d:"m4.9 19.1 2.9-2.9",key:"bwix9q"}],["path",{d:"M2 12h4",key:"j09sii"}],["path",{d:"m4.9 4.9 2.9 2.9",key:"giyufr"}]],Jt=Et("loader",Yt);function qt(l){const n=l?.projectId,[v,f]=a.useState([]),[_,j]=a.useState(null),[S,m]=a.useState(null),[F,E]=a.useState([]),[C,y]=a.useState({}),[se,V]=a.useState(!1),[A,$]=a.useState(null),[De,ne]=a.useState(null),[fe,ie]=a.useState(!1),[Be,oe]=a.useState(null),[be,T]=a.useState([]),[B,P]=a.useState(!1),[X,O]=a.useState({}),[Me,le]=a.useState({}),Y=a.useRef(X),ce=a.useRef(Me),Z=a.useRef(be);Y.current=X,ce.current=Me,Z.current=be;const Re=a.useRef(n),D=a.useRef(0),Q=a.useRef(0),Oe=a.useRef(v),x=a.useRef(_),de=a.useRef(F),ve=a.useRef(C),R=a.useRef(n),xe=a.useRef(De);Oe.current=v,x.current=_,de.current=F,ve.current=C,R.current=n,xe.current=De,a.useEffect(()=>{Re.current!==n&&(Re.current=n,D.current++,j(null),m(null),E([]),y({}),ne(null),oe(null),T([]),P(!1),O({}),le({}))},[n]);const J=a.useCallback(async()=>{V(!0),$(null);try{const r=await kt(n);f(r)}catch(r){$(r instanceof Error?r:new Error("Failed to fetch roadmaps"))}finally{V(!1)}},[n]),N=a.useCallback(async r=>{try{const c=await Ft(r,n);m(c),E(c.milestones||[]);const i={};for(const s of c.milestones||[])i[s.id]=s.features||[];y(i)}catch(c){$(c instanceof Error?c:new Error("Failed to fetch roadmap"))}},[n]);a.useEffect(()=>{J()},[J]),a.useEffect(()=>{_?N(_):(m(null),E([]),y({}))},[_,N]);const He=a.useCallback(async(r,c)=>{try{const i=await Dt(r,R.current);f(s=>[...s,i]),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to create roadmap");throw c?.onError?.(s),s}},[]),we=a.useCallback(async(r,c,i)=>{try{const s=await Mt(r,c,R.current);f(d=>d.map(o=>o.id===r?s:o)),x.current===r&&m(d=>d?{...d,...s}:null),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update roadmap");throw i?.onError?.(d),d}},[]),h=a.useCallback(async(r,c)=>{try{await Rt(r,R.current),f(i=>i.filter(s=>s.id!==r)),x.current===r&&(j(null),m(null),E([]),y({})),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete roadmap");throw c?.onError?.(s),s}},[]),I=a.useCallback(r=>{j(r)},[]),je=a.useCallback(async(r,c)=>{const i=x.current;if(!i){const s=new Error("No roadmap selected");throw c?.onError?.(s),s}try{const s=await tt(i,r,R.current);E(d=>[...d,s]),y(d=>({...d,[s.id]:[]})),x.current&&N(x.current),c?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create milestone");throw c?.onError?.(d),d}},[N]),q=a.useCallback(async(r,c,i)=>{try{const s=await It(r,c,R.current);E(d=>d.map(o=>o.id===r?s:o)),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update milestone");throw i?.onError?.(d),d}},[N]),_e=a.useCallback(async(r,c)=>{try{await $t(r,R.current),E(i=>i.filter(s=>s.id!==r)),y(i=>{const s={...i};return delete s[r],s}),x.current&&N(x.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete milestone");throw c?.onError?.(s),s}},[N]),Le=a.useCallback(async(r,c,i)=>{try{const s=await at(r,c,R.current);y(d=>({...d,[r]:[...d[r]||[],s]})),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create feature");throw i?.onError?.(d),d}},[N]),M=a.useCallback(async(r,c,i)=>{try{const s=await zt(r,c,R.current);y(d=>{const o={};for(const[g,p]of Object.entries(d))o[g]=p.map(w=>w.id===r?s:w);return o}),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update feature");throw i?.onError?.(d),d}},[N]),ue=a.useCallback(async(r,c)=>{try{await At(r,R.current),y(i=>{const s={};for(const[d,o]of Object.entries(i))s[d]=o.filter(g=>g.id!==r);return s}),x.current&&N(x.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete feature");throw c?.onError?.(s),s}},[N]),H=a.useCallback(async(r,c,i)=>{const s=de.current,d=c.map(o=>s.find(g=>g.id===o)).filter(o=>o!==void 0).map((o,g)=>({...o,orderIndex:g}));E(d);try{await Bt(r,c,R.current),x.current&&N(x.current),i?.onSuccess?.()}catch(o){E(s);const g=o instanceof Error?o:new Error("Failed to reorder milestones");throw i?.onError?.(g),g}},[N]),ee=a.useCallback(async(r,c,i)=>{const s=ve.current[r]||[],d=s.map(p=>p.id);if(JSON.stringify(d)===JSON.stringify(c)){i?.onSuccess?.();return}const o=ve.current,g=c.map(p=>s.find(w=>w.id===p)).filter(p=>p!==void 0).map((p,w)=>({...p,orderIndex:w}));y(p=>({...p,[r]:g}));try{await Ot(r,c,R.current),x.current&&N(x.current),i?.onSuccess?.()}catch(p){y(o);const w=p instanceof Error?p:new Error("Failed to reorder features");throw i?.onError?.(w),w}},[N]),te=a.useCallback(async(r,c,i,s)=>{const d=ve.current;let o=null;for(const[k,K]of Object.entries(d))if(K.some(Ke=>Ke.id===r)){o=k;break}if(!o){const k=new Error("Feature not found");throw s?.onError?.(k),k}if(o===c){const k=d[o]||[],K=Math.max(0,Math.min(i,k.length-1));if(k.findIndex(We=>We.id===r)===K){s?.onSuccess?.();return}}const g=d[o]||[],p=d[c]||[],w=g.find(k=>k.id===r);if(!w){const k=new Error("Feature not found");throw s?.onError?.(k),k}const G=g.filter(k=>k.id!==r).map((k,K)=>({...k,orderIndex:K})),Ne={...w,milestoneId:c,orderIndex:i},ae=[...p];ae.splice(i,0,Ne);const Ve=ae.map((k,K)=>({...k,orderIndex:K}));y(o===c?k=>({...k,[o]:Ve}):k=>({...k,[o]:G,[c]:Ve}));try{await Ht(r,c,i,n),x.current&&N(x.current),s?.onSuccess?.()}catch(k){y(d);const K=k instanceof Error?k:new Error("Failed to move feature");throw s?.onError?.(K),K}},[N,n]);function Ie(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`draft-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}const pe=a.useCallback(async(r,c=5,i)=>{const s=x.current;if(!s){const g=new Error("No roadmap selected");throw i?.onError?.(g),g}const d=D.current,o=R.current;P(!0);try{const g=await Gt(s,r,c,o);if(D.current!==d)return;const p=g.suggestions.map(w=>({id:Ie(),title:w.title,description:w.description}));T(p),i?.onSuccess?.()}catch(g){if(D.current!==d)return;const p=g instanceof Error?g:new Error("Failed to generate suggestions");throw i?.onError?.(p),p}finally{D.current===d&&P(!1)}},[]),Ue=a.useCallback((r,c)=>{const s=Z.current.map(d=>d.id===r?{...d,...c}:d);Z.current=s,T(d=>d.map(o=>o.id===r?{...o,...c}:o))},[]),me=a.useCallback(async(r,c)=>{const i=x.current;if(!i){const p=new Error("No roadmap selected");throw c?.onError?.(p),p}const s=D.current,d=Z.current,o=d.findIndex(p=>p.id===r);if(o===-1){const p=new Error("Suggestion draft not found");throw c?.onError?.(p),p}const g=d[o];if(!g.title.trim()){const p=new Error("Title cannot be empty");throw c?.onError?.(p),p}T(p=>p.filter(w=>w.id!==r));try{if(await tt(i,{title:g.title,description:g.description},R.current),D.current!==s){T(p=>{const w=[...p];return w.splice(o,0,g),w});return}x.current&&N(x.current),c?.onSuccess?.()}catch(p){T(G=>{const Ne=[...G];return Ne.splice(o,0,g),Ne});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw c?.onError?.(w),w}},[N]),U=a.useCallback(async r=>{const c=x.current;if(!c){const o=new Error("No roadmap selected");throw r?.onError?.(o),o}const i=[...Z.current];if(i.length===0)return;const s=i.findIndex(o=>!o.title.trim());if(s!==-1){const o=new Error(`Title cannot be empty at position ${s+1}`);throw r?.onError?.(o),o}T([]);const d=D.current;for(let o=0;o<i.length&&D.current===d;o++){const g=i[o];try{await tt(c,{title:g.title,description:g.description},R.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw r?.onError?.(w),w}}D.current===d&&(x.current&&N(x.current),r?.onSuccess?.())},[N]),Je=a.useCallback(r=>ce.current[r]??!1,[]),Ge=a.useCallback(async(r,c,i)=>{const s=D.current,d=R.current;le(o=>({...o,[r]:!0}));try{const o=await Tt(r,c,d);if(D.current!==s)return;const g=o.suggestions.map(p=>({id:Ie(),title:p.title,description:p.description}));O(p=>({...p,[r]:g})),i?.onSuccess?.()}catch(o){if(D.current!==s)return;const g=o instanceof Error?o:new Error("Failed to generate feature suggestions");throw i?.onError?.(g),g}finally{D.current===s&&le(o=>({...o,[r]:!1}))}},[]),Ce=a.useCallback((r,c,i)=>{const d=(Y.current[r]||[]).map(o=>o.id===c?{...o,...i}:o);Y.current={...Y.current,[r]:d},O(o=>({...o,[r]:o[r]?.map(g=>g.id===c?{...g,...i}:g)||[]}))},[]),Te=a.useCallback(async(r,c,i)=>{const s=D.current,d=Y.current[r]||[],o=d.findIndex(p=>p.id===c);if(o===-1){const p=new Error("Suggestion draft not found");throw i?.onError?.(p),p}const g=d[o];if(!g.title.trim()){const p=new Error("Title cannot be empty");throw i?.onError?.(p),p}O(p=>({...p,[r]:p[r]?.filter(w=>w.id!==c)||[]}));try{if(await at(r,{title:g.title,description:g.description},R.current),D.current!==s){O(p=>{const G=[...p[r]||[]];return G.splice(o,0,g),{...p,[r]:G}});return}x.current&&N(x.current),i?.onSuccess?.()}catch(p){O(G=>{const ae=[...G[r]||[]];return ae.splice(o,0,g),{...G,[r]:ae}});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw i?.onError?.(w),w}},[N]),qe=a.useCallback(async(r,c)=>{const i=[...Y.current[r]||[]];if(i.length===0)return;const s=i.findIndex(o=>!o.title.trim());if(s!==-1){const o=new Error(`Title cannot be empty at position ${s+1}`);throw c?.onError?.(o),o}O(o=>({...o,[r]:[]}));const d=D.current;for(let o=0;o<i.length&&D.current===d;o++){const g=i[o];try{await at(r,{title:g.title,description:g.description},R.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw c?.onError?.(w),w}}D.current===d&&(x.current&&N(x.current),c?.onSuccess?.())},[N]),ye=a.useCallback(()=>{T([]),P(!1)},[]),Xe=a.useCallback(r=>{O(c=>{const i={...c};return delete i[r],i}),le(c=>{const i={...c};return delete i[r],i})},[]),ge=a.useCallback(async(r,c)=>{const i=++Q.current,s=n;ie(!0),oe(null);try{const d=await Pt(r,s);if(Q.current!==i||n!==s)return;ne(d),c?.onSuccess?.()}catch(d){if(Q.current!==i||n!==s)return;const o=d instanceof Error?d:new Error(String(d));oe(o),ne(null),c?.onError?.(o)}finally{Q.current===i&&ie(!1)}},[n]),$e=a.useCallback(()=>{ne(null),oe(null),ie(!1)},[]),Ze=a.useCallback(async()=>{await J(),x.current&&await N(x.current)},[J,N]);return{roadmaps:v,selectedRoadmapId:_,selectedRoadmap:S,milestones:F,featuresByMilestoneId:C,loading:se,error:A,createRoadmap:He,updateRoadmap:we,deleteRoadmap:h,selectRoadmap:I,createMilestone:je,updateMilestone:q,deleteMilestone:_e,reorderMilestones:H,createFeature:Le,updateFeature:M,deleteFeature:ue,reorderFeatures:ee,moveFeature:te,milestoneSuggestions:be,isGeneratingSuggestions:B,generateMilestoneSuggestions:pe,updateMilestoneSuggestionDraft:Ue,acceptMilestoneSuggestion:me,acceptAllMilestoneSuggestions:U,clearMilestoneSuggestions:ye,featureSuggestionsByMilestoneId:X,isGeneratingFeatureSuggestions:Je,generateFeatureSuggestions:Ge,updateFeatureSuggestionDraft:Ce,acceptFeatureSuggestion:Te,acceptAllFeatureSuggestions:qe,clearFeatureSuggestions:Xe,handoffPayload:De,isFetchingHandoff:fe,handoffError:Be,fetchHandoff:ge,clearHandoff:$e,refresh:Ze}}function Xt({isOpen:l,onClose:n,roadmapTitle:v,handoffPayload:f,isLoading:_,error:j,onFetchHandoff:S,onCopyToClipboard:m}){return l?e.jsx("div",{className:"modal-overlay open",onClick:n,role:"presentation",children:e.jsxs("div",{className:"modal modal-lg",onClick:F=>F.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":"handoff-modal-title",children:[e.jsxs("div",{className:"modal-header",children:[e.jsxs("h2",{id:"handoff-modal-title",children:["Export Roadmap: ",v]}),e.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close modal",children:e.jsx(re,{size:18})})]}),e.jsxs("div",{className:"modal-body",children:[e.jsx("p",{className:"text-muted",style:{marginBottom:"var(--space-lg)"},children:"Export roadmap data for use in mission and task planning flows. This is a read-only export — no missions or tasks will be created."}),j&&e.jsxs("div",{className:"form-error",style:{marginBottom:"var(--space-lg)"},children:["Error loading handoff data: ",j.message]}),!f&&!_&&e.jsx("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:e.jsxs("button",{className:"btn btn-primary",onClick:S,children:[e.jsx(rt,{size:16,style:{marginRight:"var(--space-sm)"}}),"Load Handoff Data"]})}),_&&e.jsxs("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:[e.jsx(Jt,{size:24,className:"spin"}),e.jsx("p",{style:{marginTop:"var(--space-md)"},children:"Loading handoff data..."})]}),f&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{marginBottom:"var(--space-lg)"},children:[e.jsx("h3",{style:{marginBottom:"var(--space-sm)"},children:"Mission Planning Handoff"}),e.jsx("div",{className:"card",style:{padding:"var(--space-md)"},children:e.jsx("pre",{style:{whiteSpace:"pre-wrap",fontSize:"12px",maxHeight:"200px",overflow:"auto"},children:JSON.stringify(f.mission,null,2)})})]}),e.jsxs("div",{style:{marginBottom:"var(--space-lg)"},children:[e.jsxs("h3",{style:{marginBottom:"var(--space-sm)"},children:["Feature Task Planning Handoffs (",f.features.length,")"]}),e.jsx("div",{className:"card",style:{padding:"var(--space-md)"},children:e.jsx("pre",{style:{whiteSpace:"pre-wrap",fontSize:"12px",maxHeight:"300px",overflow:"auto"},children:JSON.stringify(f.features,null,2)})})]})]})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("div",{className:"modal-actions-left",children:f&&e.jsxs("button",{className:"btn btn-sm",onClick:m,children:[e.jsx(Wt,{size:14,style:{marginRight:"var(--space-xs)"}}),"Copy to Clipboard"]})}),e.jsx("div",{className:"modal-actions-right",children:e.jsx("button",{className:"btn",onClick:n,children:"Close"})})]})]})}):null}function Zt({roadmap:l,isSelected:n,onSelect:v,onEdit:f,onDelete:_,onExport:j}){const S=C=>{C.key==="Enter"&&v()},m=C=>{C.stopPropagation(),f()},F=C=>{C.stopPropagation(),_()},E=C=>{C.stopPropagation(),j()};return e.jsxs("div",{className:`roadmaps-view__sidebar-item${n?" roadmaps-view__sidebar-item--active":""}`,onClick:v,onKeyDown:S,role:"button",tabIndex:0,"aria-selected":n,"data-testid":`roadmap-item-${l.id}`,children:[e.jsxs("div",{className:"roadmaps-view__sidebar-item-content",children:[e.jsx("div",{className:"roadmaps-view__sidebar-item-title",children:l.title}),l.description&&e.jsx("div",{className:"roadmaps-view__sidebar-item-desc",children:l.description})]}),e.jsxs("div",{className:"roadmaps-view__sidebar-item-actions",onClick:m,role:"presentation",children:[e.jsx("span",{className:"roadmaps-view__icon-btn",onClick:E,role:"button",title:"Export roadmap","aria-label":"Export roadmap","data-testid":`roadmap-export-${l.id}`,tabIndex:0,children:e.jsx(rt,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn",onClick:m,role:"button",title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`roadmap-edit-${l.id}`,tabIndex:0,children:e.jsx(Fe,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:F,role:"button",title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`roadmap-delete-${l.id}`,tabIndex:0,children:e.jsx(Pe,{size:14})})]})]})}function Qt({roadmaps:l,selectedRoadmapId:n,onSelect:v,onCreate:f,onEdit:_,onDelete:j,onExport:S,showCreateForm:m,onCancelCreate:F,onSaveCreate:E}){return e.jsxs("div",{className:"roadmaps-view__mobile-list","data-testid":"roadmaps-view__mobile-list",children:[e.jsxs("div",{className:"roadmaps-view__mobile-list-header",children:[e.jsx("h2",{className:"roadmaps-view__mobile-list-title",children:"Roadmaps"}),!m&&e.jsx("button",{className:"roadmaps-view__mobile-add-btn",onClick:f,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-create-roadmap-btn",children:e.jsx(Ae,{size:18})})]}),m&&e.jsx("div",{className:"roadmaps-view__mobile-create-form",children:e.jsx(mt,{onSave:E,onCancel:F})}),l.length===0&&!m?e.jsxs("div",{className:"roadmaps-view__mobile-empty",children:[e.jsx("p",{children:"No roadmaps yet."}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:f,children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Create Roadmap"})]})]}):e.jsx("div",{className:"roadmaps-view__mobile-list-items",children:l.map(C=>e.jsxs("div",{className:`roadmaps-view__mobile-item${C.id===n?" roadmaps-view__mobile-item--active":""}`,onClick:()=>v(C.id),role:"button",tabIndex:0,onKeyDown:y=>{y.key==="Enter"&&v(C.id)},"data-testid":`mobile-roadmap-item-${C.id}`,children:[e.jsxs("div",{className:"roadmaps-view__mobile-item-content",children:[e.jsx("span",{className:"roadmaps-view__mobile-item-title",children:C.title}),C.description&&e.jsx("span",{className:"roadmaps-view__mobile-item-desc",children:C.description})]}),e.jsxs("div",{className:"roadmaps-view__mobile-item-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),S(C)},title:"Export roadmap","aria-label":"Export roadmap","data-testid":`mobile-roadmap-export-${C.id}`,children:e.jsx(rt,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),_(C)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`mobile-roadmap-edit-${C.id}`,children:e.jsx(Fe,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:y=>{y.stopPropagation(),j(C.id)},title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`mobile-roadmap-delete-${C.id}`,children:e.jsx(Pe,{size:16})})]})]},C.id))})]})}function ea({roadmapTitle:l,onBack:n,onEdit:v,onDelete:f,onCreate:_}){return e.jsxs("div",{className:"roadmaps-view__mobile-header","data-testid":"roadmaps-view__mobile-header",children:[e.jsx("button",{className:"roadmaps-view__mobile-back-btn",onClick:n,title:"Back to roadmap list","aria-label":"Back to roadmap list","data-testid":"mobile-back-btn",children:e.jsx(Kt,{size:20})}),e.jsx("h2",{className:"roadmaps-view__mobile-header-title",children:l}),e.jsxs("div",{className:"roadmaps-view__mobile-header-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:_,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-header-create-btn",children:e.jsx(Ae,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:v,title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"mobile-header-edit-btn",children:e.jsx(Fe,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:f,title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"mobile-header-delete-btn",children:e.jsx(Pe,{size:18})})]})]})}function ta({milestone:l,features:n,onEditMilestone:v,onDeleteMilestone:f,onAddFeature:_,onEditFeature:j,onDeleteFeature:S,milestoneEdit:m,onStartMilestoneEdit:F,onCancelMilestoneEdit:E,onSaveMilestoneEdit:C,featureEdit:y,onStartFeatureEdit:se,onCancelFeatureEdit:V,onSaveFeatureEdit:A,projectId:$,addToast:De,isMilestoneDragging:ne,isMilestoneDropTarget:fe,milestoneDropPosition:ie,onMilestoneDragStart:Be,onMilestoneDragEnd:oe,onMilestoneDragOver:be,onMilestoneDrop:T,onMilestoneDragLeave:B,isFeatureDragging:P,isFeatureDropTarget:X,featureDropIndex:O,onFeatureDragStart:Me,onFeatureDragEnd:le,onFeatureDragOver:Y,onFeatureDrop:ce,onFeatureDragLeave:Z,onFeatureDropOnMilestone:Re,featureSuggestions:D,isGeneratingFeatureSuggestions:Q,onGenerateFeatureSuggestions:Oe,onAcceptFeatureSuggestion:x,onAcceptAllFeatureSuggestions:de,onUpdateFeatureSuggestionDraft:ve,onClearFeatureSuggestions:R}){const xe=m?.milestoneId===l.id,J=h=>{h.key==="Enter"?(h.preventDefault(),m&&C({title:m.value})):h.key==="Escape"&&E()},N=h=>{h.key==="Escape"&&E()},He=["roadmaps-view__milestone",ne?"roadmaps-view__milestone--dragging":"",fe?"roadmaps-view__milestone--drop-target":"",fe&&ie==="before"?"roadmaps-view__milestone--drop-before":"",fe&&ie==="after"?"roadmaps-view__milestone--drop-after":""].filter(Boolean).join(" "),we=["roadmaps-view__feature-list",X?"roadmaps-view__feature-list--drop-target":""].filter(Boolean).join(" ");return e.jsxs("div",{className:He,draggable:!xe,onDragStart:h=>{xe||(Be(l.id),h.dataTransfer.setData("text/plain",`milestone:${l.id}`),h.dataTransfer.effectAllowed="move")},onDragEnd:oe,onDragOver:h=>{h.dataTransfer.types.includes("text/plain")&&h.dataTransfer.types.includes("text/plain")&&(h.preventDefault(),h.dataTransfer.dropEffect="move",be(l.id))},onDrop:h=>{h.preventDefault(),h.dataTransfer.getData("text/plain")?.startsWith("feature:")||T(l.id)},onDragLeave:B,"data-testid":`milestone-card-${l.id}`,children:[e.jsx("div",{className:"roadmaps-view__milestone-header",children:xe?e.jsxs("div",{className:"roadmaps-view__inline-edit",children:[e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${l.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:m.value,onChange:()=>F(),onKeyDown:J,placeholder:"Milestone title",autoFocus:!0,"data-testid":`milestone-title-input-${l.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>C({title:m.value}),"aria-label":"Save milestone title",title:"Save",children:e.jsx(he,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:E,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(re,{size:14})})]}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:m.field==="description"?m.value:l.description||"",onChange:()=>{},onKeyDown:N,placeholder:"Milestone description (optional)",rows:2,"data-testid":`milestone-desc-input-${l.id}`})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__milestone-title-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${l.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("h3",{className:"roadmaps-view__milestone-title",children:l.title}),e.jsxs("div",{className:"roadmaps-view__milestone-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:v,title:"Edit milestone","aria-label":"Edit milestone","data-testid":`milestone-edit-${l.id}`,children:e.jsx(Fe,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:f,title:"Delete milestone","aria-label":"Delete milestone","data-testid":`milestone-delete-${l.id}`,children:e.jsx(Pe,{size:14})})]})]}),l.description&&e.jsx("p",{className:"roadmaps-view__milestone-desc",children:l.description})]})}),e.jsxs("div",{className:"roadmaps-view__milestone-actions-bar",children:[e.jsxs("button",{className:"roadmaps-view__add-feature-btn",onClick:_,title:"Add feature","aria-label":"Add feature","data-testid":`add-feature-${l.id}`,children:[e.jsx(Ae,{size:12}),e.jsx("span",{children:"Add Feature"})]}),e.jsxs("button",{className:"roadmaps-view__suggest-btn",onClick:()=>{Oe?.()},disabled:Q??!1,title:"Generate feature suggestions with AI","aria-label":"Generate feature suggestions","data-testid":`generate-features-${l.id}`,children:[e.jsx(pt,{size:12}),e.jsx("span",{children:Q?"Generating...":"AI Suggestions"})]})]}),e.jsxs("div",{className:we,onDragOver:h=>{h.preventDefault(),h.dataTransfer.dropEffect="move",h.dataTransfer.getData("text/plain")?.startsWith("feature:")&&Re()},onDrop:h=>{h.preventDefault();const I=h.dataTransfer.getData("text/plain");I?.startsWith("feature:")&&ce(I.split(":")[1],n.length)},onDragLeave:Z,children:[n.length===0?e.jsx("p",{className:"roadmaps-view__empty-features",children:"No features yet."}):n.map((h,I)=>{const je=y?.featureId===h.id,q=P(h.id),_e=M=>{M.key==="Enter"?(M.preventDefault(),y&&A({title:y.value})):M.key==="Escape"&&V()},Le=["roadmaps-view__feature-item",q?"roadmaps-view__feature-item--dragging":"",X&&O===I?"roadmaps-view__feature-item--drop-before":"",X&&O===I+1?"roadmaps-view__feature-item--drop-after":""].filter(Boolean).join(" ");return e.jsx("div",{className:Le,draggable:!je,onDragStart:M=>{je||(Me(h.id,l.id),M.dataTransfer.setData("text/plain",`feature:${h.id}`),M.dataTransfer.effectAllowed="move")},onDragEnd:le,onDragOver:M=>{if(M.preventDefault(),M.stopPropagation(),M.dataTransfer.dropEffect="move",M.dataTransfer.getData("text/plain")?.startsWith("feature:")){const H=M.currentTarget.getBoundingClientRect(),ee=H.top+H.height/2,te=M.clientY<ee?"before":"after";Y(h.id,te)}},onDrop:M=>{M.preventDefault(),M.stopPropagation();const ue=M.dataTransfer.getData("text/plain");if(ue?.startsWith("feature:")){const H=ue.split(":")[1],ee=M.currentTarget.getBoundingClientRect(),te=ee.top+ee.height/2,Ie=M.clientY<te?"before":"after";let pe=I;Ie==="after"&&(pe=I+1),ce(H,pe)}},onDragLeave:Z,"data-testid":`feature-item-${h.id}`,children:je?e.jsx("div",{className:"roadmaps-view__inline-edit roadmaps-view__inline-edit--compact",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Ye,{size:12})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:y.value,onChange:()=>{},onKeyDown:_e,placeholder:"Feature title",autoFocus:!0,"data-testid":`feature-title-input-${h.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>A({title:y.value}),"aria-label":"Save feature title",title:"Save",children:e.jsx(he,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:V,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(re,{size:14})})]})}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Ye,{size:12})}),e.jsxs("div",{className:"roadmaps-view__feature-content",children:[e.jsx("span",{className:"roadmaps-view__feature-title",children:h.title}),h.description&&e.jsx("p",{className:"roadmaps-view__feature-desc",children:h.description})]}),e.jsxs("div",{className:"roadmaps-view__feature-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>j(h.id),title:"Edit feature","aria-label":"Edit feature","data-testid":`feature-edit-${h.id}`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>S(h.id),title:"Delete feature","aria-label":"Delete feature","data-testid":`feature-delete-${h.id}`,children:e.jsx(Pe,{size:12})})]})]})},h.id)}),D&&D.length>0&&e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h4",{className:"roadmap-suggestion-title",children:"AI Feature Suggestions"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-accept-all-btn",onClick:()=>de?.(),title:"Accept all suggestions","aria-label":"Accept all","data-testid":`accept-all-features-${l.id}`,children:"Accept All"}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:()=>R?.(),title:"Clear suggestions","aria-label":"Clear","data-testid":`clear-features-${l.id}`,children:"Clear"})]})]}),e.jsx("div",{className:"roadmap-suggestion-list",children:D.map(h=>e.jsx(aa,{suggestion:h,onUpdateDraft:I=>ve?.(l.id,h.id,I),onAccept:()=>{x?.(l.id,h.id)},testIdPrefix:`feature-suggestion-${l.id}`},h.id))})]})]})]})}function aa({suggestion:l,onUpdateDraft:n,onAccept:v,testIdPrefix:f}){const[_,j]=a.useState(!1),[S,m]=a.useState(l.title),[F,E]=a.useState(l.description||""),C=()=>{m(l.title),E(l.description||""),j(!0)},y=()=>{n({title:S.trim(),description:F.trim()||void 0}),j(!1)},se=()=>{m(l.title),E(l.description||""),j(!1)},V=()=>{l.title.trim()&&v()},A=l.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:S,onChange:$=>m($.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:F,onChange:$=>E($.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${f}-${l.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:y,disabled:!S.trim(),title:"Save","data-testid":`${f}-${l.id}-save`,children:e.jsx(he,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:se,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(re,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${f}-${l.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:l.title}),l.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:l.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:C,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:V,disabled:!A,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(he,{size:12})})]})]})}function ut({suggestion:l,onUpdateDraft:n,onAccept:v,testIdPrefix:f}){const[_,j]=a.useState(!1),[S,m]=a.useState(l.title),[F,E]=a.useState(l.description||""),C=()=>{m(l.title),E(l.description||""),j(!0)},y=()=>{n({title:S.trim(),description:F.trim()||void 0}),j(!1)},se=()=>{m(l.title),E(l.description||""),j(!1)},V=()=>{l.title.trim()&&v()},A=l.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:S,onChange:$=>m($.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:F,onChange:$=>E($.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${f}-${l.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:y,disabled:!S.trim(),title:"Save","data-testid":`${f}-${l.id}-save`,children:e.jsx(he,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:se,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(re,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${f}-${l.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:l.title}),l.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:l.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:C,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:V,disabled:!A,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(he,{size:12})})]})]})}function mt({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form","data-testid":"create-roadmap-form",children:e.jsxs("form",{onSubmit:S,children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Roadmap title",autoFocus:!0,"data-testid":"create-roadmap-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Roadmap description (optional)",rows:2,"data-testid":"create-roadmap-description"}),e.jsxs("div",{className:"roadmaps-view__create-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__btn roadmaps-view__btn--primary",disabled:!v.trim(),"data-testid":"create-roadmap-submit",children:"Create"}),e.jsx("button",{type:"button",className:"roadmaps-view__btn",onClick:n,"data-testid":"create-roadmap-cancel",children:"Cancel"})]})]})})}function ra({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-milestone-form",children:e.jsxs("form",{onSubmit:S,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":"create-milestone-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-milestone-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!v.trim(),"aria-label":"Save milestone",title:"Save","data-testid":"create-milestone-submit",children:e.jsx(he,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:n,"aria-label":"Cancel",title:"Cancel","data-testid":"create-milestone-cancel",children:e.jsx(re,{size:14})})]})]})})}function sa({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-feature-form",children:e.jsxs("form",{onSubmit:S,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":"create-feature-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-feature-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!v.trim(),"aria-label":"Save feature",title:"Save","data-testid":"create-feature-submit",children:e.jsx(he,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:n,"aria-label":"Cancel",title:"Cancel","data-testid":"create-feature-cancel",children:e.jsx(re,{size:14})})]})]})})}function ca({projectId:l,addToast:n}){const{confirm:v}=Lt(),f=Vt()==="mobile",{roadmaps:_,selectedRoadmapId:j,selectedRoadmap:S,milestones:m,featuresByMilestoneId:F,loading:E,error:C,createRoadmap:y,updateRoadmap:se,deleteRoadmap:V,selectRoadmap:A,createMilestone:$,updateMilestone:De,deleteMilestone:ne,createFeature:fe,updateFeature:ie,deleteFeature:Be,reorderMilestones:oe,reorderFeatures:be,moveFeature:T,milestoneSuggestions:B,isGeneratingSuggestions:P,generateMilestoneSuggestions:X,updateMilestoneSuggestionDraft:O,acceptMilestoneSuggestion:Me,acceptAllMilestoneSuggestions:le,clearMilestoneSuggestions:Y,featureSuggestionsByMilestoneId:ce,isGeneratingFeatureSuggestions:Z,generateFeatureSuggestions:Re,updateFeatureSuggestionDraft:D,acceptFeatureSuggestion:Q,acceptAllFeatureSuggestions:Oe,clearFeatureSuggestions:x,handoffPayload:de,isFetchingHandoff:ve,handoffError:R,fetchHandoff:xe,clearHandoff:J}=qt({projectId:l}),[N,He]=a.useState(!1),[we,h]=a.useState(null),[I,je]=a.useState(""),[q,_e]=a.useState(""),[Le,M]=a.useState(!1),ue=a.useRef(null);a.useEffect(()=>{ue.current!==null&&ue.current!==j&&M(!1),ue.current=j},[j]);const[H,ee]=a.useState({roadmapId:null,field:null,value:""}),[te,Ie]=a.useState({milestoneId:null,field:null,value:""}),[pe,Ue]=a.useState({featureId:null,field:null,value:""}),[me,U]=a.useState({type:null,parentId:void 0,title:"",description:""}),[Je,Ge]=a.useState(!1),[Ce,Te]=a.useState({draggingId:null,dropTargetId:null,dropPosition:null}),qe=a.useCallback(t=>{Te(u=>({...u,draggingId:t}))},[]),ye=a.useCallback(()=>{Te({draggingId:null,dropTargetId:null,dropPosition:null})},[]),Xe=a.useCallback(t=>{Te(u=>u.draggingId===t?u:{...u,dropTargetId:t,dropPosition:null})},[]),[ge,$e]=a.useState({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}),Ze=a.useCallback((t,u)=>{$e(b=>({...b,draggingId:t,draggingMilestoneId:u}))},[]),r=a.useCallback(()=>{$e({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null})},[]),c=a.useCallback((t,u)=>{$e(b=>{if(b.draggingId===t)return b;const L=(F[b.draggingMilestoneId||""]||[]).findIndex(Ee=>Ee.id===t);let W;return u==="before"?W=L:W=L+1,{...b,dropTargetMilestoneId:b.draggingMilestoneId,dropTargetIndex:W,dropPosition:u}})},[F]),i=a.useCallback(()=>{$e(t=>({...t,dropTargetMilestoneId:t.draggingMilestoneId,dropTargetIndex:(F[t.draggingMilestoneId||""]||[]).length}))},[F]),s=a.useCallback(async(t,u)=>{const{draggingMilestoneId:b,dropTargetMilestoneId:z}=ge;if(!b){r();return}const L=z||b,W=F[b]||[],Ee=W.find(ke=>ke.id===t);if(!Ee){r();return}if(b!==L){if(b===L){r();return}try{await T(t,L,u,{onError:ke=>{n(`Failed to move feature: ${ke.message}`,"error")}})}catch{}}else{const ke=[...W],Nt=ke.findIndex(ze=>ze.id===t);ke.splice(Nt,1),ke.splice(u,0,Ee);const dt=ke.map(ze=>ze.id),St=W.map(ze=>ze.id);if(dt.join(",")===St.join(",")){r();return}try{await be(b,dt,{onError:ze=>{n(`Failed to reorder features: ${ze.message}`,"error")}})}catch{}}r()},[ge,F,be,T,n,r]),d=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),b=t.clientX,z=t.clientY;(b<u.left||b>u.right||z<u.top||z>u.bottom)&&$e(L=>({...L,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}))},[]),o=a.useCallback(t=>ge.draggingId===t,[ge.draggingId]),g=a.useCallback(async t=>{const{draggingId:u}=Ce;if(!u||u===t){ye();return}const b=m.map(Ee=>Ee.id),z=b.indexOf(u),L=b.indexOf(t);if(z===-1||L===-1){ye();return}const W=[...b];if(W.splice(z,1),W.splice(L,0,u),W.join(",")===b.join(",")){ye();return}try{await oe(j,W,{onError:Ee=>{n(`Failed to reorder milestones: ${Ee.message}`,"error")}})}catch{}ye()},[Ce,m,j,oe,n,ye]),p=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),b=t.clientX,z=t.clientY;(b<u.left||b>u.right||z<u.top||z>u.bottom)&&Te(L=>({...L,dropTargetId:null,dropPosition:null}))},[]),w=a.useCallback(t=>{A(t.id),ee({roadmapId:t.id,field:"title",value:t.title})},[A]),G=a.useCallback(()=>{ee({roadmapId:null,field:null,value:""})},[]),Ne=a.useCallback(async t=>{if(H.roadmapId)try{await se(H.roadmapId,t,{onError:u=>n(u.message,"error")}),G()}catch{}},[H.roadmapId,se,G,n]),ae=a.useCallback(async t=>{if(await v({title:"Delete Roadmap",message:"Delete this roadmap? This cannot be undone.",danger:!0}))try{await V(t,{onError:b=>n(b.message,"error")}),n("Roadmap deleted","success")}catch{}},[V,n,v]),Ve=a.useCallback((t,u)=>{h(t),je(u),He(!0),J()},[J]),k=a.useCallback(()=>{He(!1),h(null),je(""),J()},[J]),K=a.useCallback(()=>{we&&xe(we,{onError:t=>n(`Failed to load handoff: ${t.message}`,"error")})},[we,xe,n]),Ke=a.useCallback(()=>{if(de){const t=JSON.stringify(de,null,2);navigator.clipboard.writeText(t).then(()=>{n("Handoff data copied to clipboard","success")}).catch(()=>{n("Failed to copy to clipboard","error")})}},[de,n]),We=a.useCallback(async t=>{try{await y(t,{onError:u=>n(u.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Roadmap created","success")}catch{}},[y,n]),st=a.useCallback(t=>{Ie({milestoneId:t.id,field:"title",value:t.title})},[]),Qe=a.useCallback(()=>{Ie({milestoneId:null,field:null,value:""})},[]),gt=a.useCallback(async t=>{if(te.milestoneId)try{await De(te.milestoneId,t,{onError:u=>n(u.message,"error")}),Qe()}catch{}},[te.milestoneId,De,Qe,n]),ht=a.useCallback(async t=>{if(await v({title:"Delete Milestone",message:"Delete this milestone and all its features?",danger:!0}))try{await ne(t,{onError:b=>n(b.message,"error")}),n("Milestone deleted","success")}catch{}},[ne,n,v]),ft=a.useCallback(async t=>{try{await $(t,{onError:u=>n(u.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Milestone created","success")}catch{}},[$,n]),nt=a.useCallback((t,u,b)=>{Ue({featureId:t,field:"title",value:u})},[]),et=a.useCallback(()=>{Ue({featureId:null,field:null,value:""})},[]),bt=a.useCallback(async t=>{if(pe.featureId)try{await ie(pe.featureId,t,{onError:u=>n(u.message,"error")}),et()}catch{}},[pe.featureId,ie,et,n]),vt=a.useCallback(async t=>{if(await v({title:"Delete Feature",message:"Delete this feature?",danger:!0}))try{await Be(t,{onError:b=>n(b.message,"error")}),n("Feature deleted","success")}catch{}},[Be,n,v]),it=a.useCallback(async()=>{if(q.trim())try{await X(q,5,{onError:t=>n(t.message,"error")})}catch{}},[q,X,n]),ot=a.useCallback(async t=>{try{await Me(t,{onError:u=>n(u.message,"error")}),n("Milestone added","success")}catch{}},[Me,n]),lt=a.useCallback(async()=>{try{await le({onError:t=>n(t.message,"error")}),n(`${B.length} milestones added`,"success"),_e("")}catch{}},[le,B.length,n]),ct=a.useCallback(()=>{Y(),_e("")},[Y]),xt=a.useCallback(async t=>{try{await Re(t,{count:5},{onError:u=>n(u.message,"error")})}catch{}},[Re,n]),wt=a.useCallback(async(t,u)=>{try{await Q(t,u,{onError:b=>n(b.message,"error")}),n("Feature added","success")}catch{}},[Q,n]),jt=a.useCallback((t,u,b)=>{D(t,u,b)},[D]),_t=a.useCallback(async t=>{const u=ce[t]||[];try{await Oe(t,{onError:b=>n(b.message,"error")}),n(`${u.length} features added`,"success")}catch{}},[Oe,ce,n]),Ct=a.useCallback(t=>{x(t)},[x]),yt=a.useCallback(async(t,u)=>{try{await fe(t,u,{onError:b=>n(b.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Feature created","success")}catch{}},[fe,n]),Se=j;return E&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--loading",children:e.jsx("div",{className:"roadmaps-view__loading-state",children:"Loading roadmaps..."})}):C&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--error",children:e.jsxs("div",{className:"roadmaps-view__error-state",children:[e.jsx("p",{children:"Failed to load roadmaps"}),e.jsx("p",{className:"roadmaps-view__error-msg",children:C.message})]})}):e.jsxs("div",{className:"roadmaps-view",children:[f&&!Se&&e.jsx(Qt,{roadmaps:_,selectedRoadmapId:Se,onSelect:t=>A(t),onCreate:()=>Ge(!0),onEdit:w,onDelete:ae,onExport:t=>Ve(t.id,t.title),showCreateForm:Je,onCancelCreate:()=>Ge(!1),onSaveCreate:async t=>{await We(t),Ge(!1)}}),!f&&e.jsxs("aside",{className:"roadmaps-view__sidebar","aria-label":"Roadmaps",children:[e.jsxs("div",{className:"roadmaps-view__sidebar-header",children:[e.jsx("h2",{className:"roadmaps-view__sidebar-title",children:"Roadmaps"}),e.jsx("button",{className:"roadmaps-view__add-btn",onClick:()=>U({type:"roadmap",title:"",description:""}),title:"Create roadmap","aria-label":"Create roadmap","data-testid":"create-roadmap-btn",children:e.jsx(Ae,{size:16})})]}),me.type==="roadmap"&&e.jsx(mt,{onSave:We,onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})}),e.jsx("div",{className:"roadmaps-view__sidebar-list",children:_.length===0?e.jsx("p",{className:"roadmaps-view__empty-sidebar",children:"No roadmaps yet. Click + to create one."}):_.map(t=>e.jsx(Zt,{roadmap:t,isSelected:t.id===Se,onSelect:()=>A(t.id),onEdit:()=>w(t),onDelete:()=>ae(t.id),onExport:()=>Ve(t.id,t.title)},t.id))})]}),e.jsxs("main",{className:"roadmaps-view__main","aria-label":"Roadmap content",children:[f&&Se&&e.jsx(ea,{roadmapTitle:S?.title||"Untitled Roadmap",onBack:()=>A(null),onEdit:()=>{S&&w(S)},onDelete:()=>ae(Se),onCreate:()=>Ge(!0)}),Se?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"roadmaps-view__roadmap-header",children:H.roadmapId===Se?e.jsx("div",{className:"roadmaps-view__inline-edit",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input roadmaps-view__inline-input--large",value:H.value,onChange:t=>ee(u=>({...u,value:t.target.value})),onKeyDown:t=>{t.key==="Enter"?Ne({title:H.value}):t.key==="Escape"&&G()},placeholder:"Roadmap title",autoFocus:!0,"data-testid":"roadmap-title-input"}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>Ne({title:H.value}),"aria-label":"Save",title:"Save",children:e.jsx(he,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:G,"aria-label":"Cancel",title:"Cancel",children:e.jsx(re,{size:16})})]})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__roadmap-title-row",children:[e.jsx("h1",{className:"roadmaps-view__roadmap-title",children:S?.title||"Untitled Roadmap"}),e.jsxs("div",{className:"roadmaps-view__roadmap-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>{S&&w(S)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"edit-roadmap-btn",children:e.jsx(Fe,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>ae(Se),title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"delete-roadmap-btn",children:e.jsx(Pe,{size:16})})]})]}),S?.description&&e.jsx("p",{className:"roadmaps-view__roadmap-desc",children:S.description})]})}),f?Le?e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"}),e.jsx("button",{className:"roadmap-suggestion-collapse-btn",onClick:()=>M(!1),"aria-label":"Collapse suggestion panel","data-testid":"collapse-suggestion-panel-btn",children:e.jsx(Ut,{size:16})})]}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:q,onChange:t=>_e(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:P||!j,"data-testid":"goal-prompt-input",autoFocus:!0}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:it,disabled:!q.trim()||P||!j,"data-testid":"generate-suggestions-btn",children:P?"Generating...":"Generate Milestones"}),B.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:lt,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",B.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ct,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(re,{size:14})})]})]})]}),B.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:B.map(t=>e.jsx(ut,{suggestion:t,onUpdateDraft:u=>O(t.id,u),onAccept:()=>ot(t.id),testIdPrefix:"suggestion"},t.id))})]}):e.jsx("div",{className:"roadmap-suggestion-section",children:e.jsxs("button",{className:"roadmap-suggestion-expand-btn",onClick:()=>M(!0),disabled:!j,"data-testid":"expand-suggestion-panel-btn",children:[e.jsx(pt,{size:16}),"Generate Milestone Ideas"]})}):e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsx("div",{className:"roadmap-suggestion-header",children:e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"})}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:q,onChange:t=>_e(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:P||!j,"data-testid":"goal-prompt-input"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:it,disabled:!q.trim()||P||!j,"data-testid":"generate-suggestions-btn",children:P?"Generating...":"Generate Milestones"}),B.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:lt,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",B.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ct,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(re,{size:14})})]})]})]}),B.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:B.map(t=>e.jsx(ut,{suggestion:t,onUpdateDraft:u=>O(t.id,u),onAccept:()=>ot(t.id),testIdPrefix:"suggestion"},t.id))})]}),e.jsxs("div",{className:"roadmaps-view__milestone-lanes",children:[me.type==="milestone"&&e.jsx(ra,{onSave:ft,onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})}),m.length===0&&me.type!=="milestone"?e.jsxs("div",{className:"roadmaps-view__empty-milestones",children:[e.jsx("p",{children:"This roadmap has no milestones."}),e.jsxs("button",{className:"roadmaps-view__add-milestone-btn",onClick:()=>U({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn-empty",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]})]}):e.jsxs(e.Fragment,{children:[me.type!=="milestone"&&e.jsxs("button",{className:"roadmaps-view__add-milestone-fab",onClick:()=>U({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]}),m.map(t=>e.jsx(ta,{milestone:t,features:F[t.id]||[],onEditMilestone:()=>st(t),onDeleteMilestone:()=>ht(t.id),onAddFeature:()=>U({type:"feature",parentId:t.id,title:"",description:""}),onEditFeature:u=>{const b=F[t.id]?.find(z=>z.id===u);b&&nt(u,b.title,b.description)},onDeleteFeature:vt,milestoneEdit:te,onStartMilestoneEdit:()=>st(t),onCancelMilestoneEdit:Qe,onSaveMilestoneEdit:gt,featureEdit:pe,onStartFeatureEdit:nt,onCancelFeatureEdit:et,onSaveFeatureEdit:bt,projectId:l,addToast:n,isMilestoneDragging:Ce.draggingId===t.id,isMilestoneDropTarget:Ce.dropTargetId===t.id,milestoneDropPosition:Ce.dropTargetId===t.id?Ce.dropPosition:null,onMilestoneDragStart:qe,onMilestoneDragEnd:ye,onMilestoneDragOver:Xe,onMilestoneDrop:g,onMilestoneDragLeave:p,isFeatureDragging:o,isFeatureDropTarget:ge.dropTargetMilestoneId===t.id,featureDropIndex:ge.dropTargetMilestoneId===t.id?ge.dropTargetIndex:null,onFeatureDragStart:Ze,onFeatureDragEnd:r,onFeatureDragOver:c,onFeatureDrop:s,onFeatureDragLeave:d,onFeatureDropOnMilestone:i,featureSuggestions:ce[t.id],isGeneratingFeatureSuggestions:Z(t.id),onGenerateFeatureSuggestions:()=>xt(t.id),onAcceptFeatureSuggestion:u=>wt(t.id,u),onAcceptAllFeatureSuggestions:()=>_t(t.id),onUpdateFeatureSuggestionDraft:(u,b,z)=>jt(u,b,z),onClearFeatureSuggestions:()=>Ct(t.id)},t.id))]})]})]}):e.jsx("div",{className:"roadmaps-view__empty-main",children:e.jsx("p",{children:"Select a roadmap from the sidebar to view its milestones."})})]}),me.type==="feature"&&me.parentId&&e.jsx("div",{className:"roadmaps-view__feature-create-overlay",children:e.jsx(sa,{onSave:t=>yt(me.parentId,t),onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})})}),e.jsx(Xt,{isOpen:N,onClose:k,roadmapId:we||"",roadmapTitle:I,handoffPayload:de,isLoading:ve,error:R,onFetchHandoff:K,onCopyToClipboard:Ke})]})}export{ca as RoadmapsView};
|
|
6
|
+
*/const Yt=[["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m16.2 7.8 2.9-2.9",key:"r700ao"}],["path",{d:"M18 12h4",key:"wj9ykh"}],["path",{d:"m16.2 16.2 2.9 2.9",key:"1bxg5t"}],["path",{d:"M12 18v4",key:"jadmvz"}],["path",{d:"m4.9 19.1 2.9-2.9",key:"bwix9q"}],["path",{d:"M2 12h4",key:"j09sii"}],["path",{d:"m4.9 4.9 2.9 2.9",key:"giyufr"}]],qt=Et("loader",Yt);function Jt(l){const n=l?.projectId,[v,f]=a.useState([]),[_,j]=a.useState(null),[S,m]=a.useState(null),[F,E]=a.useState([]),[C,y]=a.useState({}),[se,V]=a.useState(!1),[A,$]=a.useState(null),[De,ne]=a.useState(null),[fe,ie]=a.useState(!1),[Be,oe]=a.useState(null),[be,P]=a.useState([]),[B,T]=a.useState(!1),[X,O]=a.useState({}),[Me,le]=a.useState({}),Y=a.useRef(X),ce=a.useRef(Me),Q=a.useRef(be);Y.current=X,ce.current=Me,Q.current=be;const Re=a.useRef(n),D=a.useRef(0),Z=a.useRef(0),Oe=a.useRef(v),x=a.useRef(_),de=a.useRef(F),ve=a.useRef(C),R=a.useRef(n),xe=a.useRef(De);Oe.current=v,x.current=_,de.current=F,ve.current=C,R.current=n,xe.current=De,a.useEffect(()=>{Re.current!==n&&(Re.current=n,D.current++,j(null),m(null),E([]),y({}),ne(null),oe(null),P([]),T(!1),O({}),le({}))},[n]);const q=a.useCallback(async()=>{V(!0),$(null);try{const r=await kt(n);f(r)}catch(r){$(r instanceof Error?r:new Error("Failed to fetch roadmaps"))}finally{V(!1)}},[n]),N=a.useCallback(async r=>{try{const c=await Ft(r,n);m(c),E(c.milestones||[]);const i={};for(const s of c.milestones||[])i[s.id]=s.features||[];y(i)}catch(c){$(c instanceof Error?c:new Error("Failed to fetch roadmap"))}},[n]);a.useEffect(()=>{q()},[q]),a.useEffect(()=>{_?N(_):(m(null),E([]),y({}))},[_,N]);const He=a.useCallback(async(r,c)=>{try{const i=await Dt(r,R.current);f(s=>[...s,i]),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to create roadmap");throw c?.onError?.(s),s}},[]),we=a.useCallback(async(r,c,i)=>{try{const s=await Mt(r,c,R.current);f(d=>d.map(o=>o.id===r?s:o)),x.current===r&&m(d=>d?{...d,...s}:null),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update roadmap");throw i?.onError?.(d),d}},[]),h=a.useCallback(async(r,c)=>{try{await Rt(r,R.current),f(i=>i.filter(s=>s.id!==r)),x.current===r&&(j(null),m(null),E([]),y({})),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete roadmap");throw c?.onError?.(s),s}},[]),I=a.useCallback(r=>{j(r)},[]),je=a.useCallback(async(r,c)=>{const i=x.current;if(!i){const s=new Error("No roadmap selected");throw c?.onError?.(s),s}try{const s=await tt(i,r,R.current);E(d=>[...d,s]),y(d=>({...d,[s.id]:[]})),x.current&&N(x.current),c?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create milestone");throw c?.onError?.(d),d}},[N]),J=a.useCallback(async(r,c,i)=>{try{const s=await It(r,c,R.current);E(d=>d.map(o=>o.id===r?s:o)),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update milestone");throw i?.onError?.(d),d}},[N]),_e=a.useCallback(async(r,c)=>{try{await $t(r,R.current),E(i=>i.filter(s=>s.id!==r)),y(i=>{const s={...i};return delete s[r],s}),x.current&&N(x.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete milestone");throw c?.onError?.(s),s}},[N]),Le=a.useCallback(async(r,c,i)=>{try{const s=await at(r,c,R.current);y(d=>({...d,[r]:[...d[r]||[],s]})),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create feature");throw i?.onError?.(d),d}},[N]),M=a.useCallback(async(r,c,i)=>{try{const s=await zt(r,c,R.current);y(d=>{const o={};for(const[g,p]of Object.entries(d))o[g]=p.map(w=>w.id===r?s:w);return o}),x.current&&N(x.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update feature");throw i?.onError?.(d),d}},[N]),ue=a.useCallback(async(r,c)=>{try{await At(r,R.current),y(i=>{const s={};for(const[d,o]of Object.entries(i))s[d]=o.filter(g=>g.id!==r);return s}),x.current&&N(x.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete feature");throw c?.onError?.(s),s}},[N]),H=a.useCallback(async(r,c,i)=>{const s=de.current,d=c.map(o=>s.find(g=>g.id===o)).filter(o=>o!==void 0).map((o,g)=>({...o,orderIndex:g}));E(d);try{await Bt(r,c,R.current),x.current&&N(x.current),i?.onSuccess?.()}catch(o){E(s);const g=o instanceof Error?o:new Error("Failed to reorder milestones");throw i?.onError?.(g),g}},[N]),ee=a.useCallback(async(r,c,i)=>{const s=ve.current[r]||[],d=s.map(p=>p.id);if(JSON.stringify(d)===JSON.stringify(c)){i?.onSuccess?.();return}const o=ve.current,g=c.map(p=>s.find(w=>w.id===p)).filter(p=>p!==void 0).map((p,w)=>({...p,orderIndex:w}));y(p=>({...p,[r]:g}));try{await Ot(r,c,R.current),x.current&&N(x.current),i?.onSuccess?.()}catch(p){y(o);const w=p instanceof Error?p:new Error("Failed to reorder features");throw i?.onError?.(w),w}},[N]),te=a.useCallback(async(r,c,i,s)=>{const d=ve.current;let o=null;for(const[k,K]of Object.entries(d))if(K.some(Ke=>Ke.id===r)){o=k;break}if(!o){const k=new Error("Feature not found");throw s?.onError?.(k),k}if(o===c){const k=d[o]||[],K=Math.max(0,Math.min(i,k.length-1));if(k.findIndex(We=>We.id===r)===K){s?.onSuccess?.();return}}const g=d[o]||[],p=d[c]||[],w=g.find(k=>k.id===r);if(!w){const k=new Error("Feature not found");throw s?.onError?.(k),k}const G=g.filter(k=>k.id!==r).map((k,K)=>({...k,orderIndex:K})),Ne={...w,milestoneId:c,orderIndex:i},ae=[...p];ae.splice(i,0,Ne);const Ve=ae.map((k,K)=>({...k,orderIndex:K}));y(o===c?k=>({...k,[o]:Ve}):k=>({...k,[o]:G,[c]:Ve}));try{await Ht(r,c,i,n),x.current&&N(x.current),s?.onSuccess?.()}catch(k){y(d);const K=k instanceof Error?k:new Error("Failed to move feature");throw s?.onError?.(K),K}},[N,n]);function Ie(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`draft-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}const pe=a.useCallback(async(r,c=5,i)=>{const s=x.current;if(!s){const g=new Error("No roadmap selected");throw i?.onError?.(g),g}const d=D.current,o=R.current;T(!0);try{const g=await Gt(s,r,c,o);if(D.current!==d)return;const p=g.suggestions.map(w=>({id:Ie(),title:w.title,description:w.description}));P(p),i?.onSuccess?.()}catch(g){if(D.current!==d)return;const p=g instanceof Error?g:new Error("Failed to generate suggestions");throw i?.onError?.(p),p}finally{D.current===d&&T(!1)}},[]),Ue=a.useCallback((r,c)=>{const s=Q.current.map(d=>d.id===r?{...d,...c}:d);Q.current=s,P(d=>d.map(o=>o.id===r?{...o,...c}:o))},[]),me=a.useCallback(async(r,c)=>{const i=x.current;if(!i){const p=new Error("No roadmap selected");throw c?.onError?.(p),p}const s=D.current,d=Q.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}P(p=>p.filter(w=>w.id!==r));try{if(await tt(i,{title:g.title,description:g.description},R.current),D.current!==s){P(p=>{const w=[...p];return w.splice(o,0,g),w});return}x.current&&N(x.current),c?.onSuccess?.()}catch(p){P(G=>{const Ne=[...G];return Ne.splice(o,0,g),Ne});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw c?.onError?.(w),w}},[N]),U=a.useCallback(async r=>{const c=x.current;if(!c){const o=new Error("No roadmap selected");throw r?.onError?.(o),o}const i=[...Q.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}P([]);const d=D.current;for(let o=0;o<i.length&&D.current===d;o++){const g=i[o];try{await tt(c,{title:g.title,description:g.description},R.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw r?.onError?.(w),w}}D.current===d&&(x.current&&N(x.current),r?.onSuccess?.())},[N]),qe=a.useCallback(r=>ce.current[r]??!1,[]),Ge=a.useCallback(async(r,c,i)=>{const s=D.current,d=R.current;le(o=>({...o,[r]:!0}));try{const o=await Pt(r,c,d);if(D.current!==s)return;const g=o.suggestions.map(p=>({id:Ie(),title:p.title,description:p.description}));O(p=>({...p,[r]:g})),i?.onSuccess?.()}catch(o){if(D.current!==s)return;const g=o instanceof Error?o:new Error("Failed to generate feature suggestions");throw i?.onError?.(g),g}finally{D.current===s&&le(o=>({...o,[r]:!1}))}},[]),Ce=a.useCallback((r,c,i)=>{const d=(Y.current[r]||[]).map(o=>o.id===c?{...o,...i}:o);Y.current={...Y.current,[r]:d},O(o=>({...o,[r]:o[r]?.map(g=>g.id===c?{...g,...i}:g)||[]}))},[]),Pe=a.useCallback(async(r,c,i)=>{const s=D.current,d=Y.current[r]||[],o=d.findIndex(p=>p.id===c);if(o===-1){const p=new Error("Suggestion draft not found");throw i?.onError?.(p),p}const g=d[o];if(!g.title.trim()){const p=new Error("Title cannot be empty");throw i?.onError?.(p),p}O(p=>({...p,[r]:p[r]?.filter(w=>w.id!==c)||[]}));try{if(await at(r,{title:g.title,description:g.description},R.current),D.current!==s){O(p=>{const G=[...p[r]||[]];return G.splice(o,0,g),{...p,[r]:G}});return}x.current&&N(x.current),i?.onSuccess?.()}catch(p){O(G=>{const ae=[...G[r]||[]];return ae.splice(o,0,g),{...G,[r]:ae}});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw i?.onError?.(w),w}},[N]),Je=a.useCallback(async(r,c)=>{const i=[...Y.current[r]||[]];if(i.length===0)return;const s=i.findIndex(o=>!o.title.trim());if(s!==-1){const o=new Error(`Title cannot be empty at position ${s+1}`);throw c?.onError?.(o),o}O(o=>({...o,[r]:[]}));const d=D.current;for(let o=0;o<i.length&&D.current===d;o++){const g=i[o];try{await at(r,{title:g.title,description:g.description},R.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw c?.onError?.(w),w}}D.current===d&&(x.current&&N(x.current),c?.onSuccess?.())},[N]),ye=a.useCallback(()=>{P([]),T(!1)},[]),Xe=a.useCallback(r=>{O(c=>{const i={...c};return delete i[r],i}),le(c=>{const i={...c};return delete i[r],i})},[]),ge=a.useCallback(async(r,c)=>{const i=++Z.current,s=n;ie(!0),oe(null);try{const d=await Tt(r,s);if(Z.current!==i||n!==s)return;ne(d),c?.onSuccess?.()}catch(d){if(Z.current!==i||n!==s)return;const o=d instanceof Error?d:new Error(String(d));oe(o),ne(null),c?.onError?.(o)}finally{Z.current===i&&ie(!1)}},[n]),$e=a.useCallback(()=>{ne(null),oe(null),ie(!1)},[]),Qe=a.useCallback(async()=>{await q(),x.current&&await N(x.current)},[q,N]);return{roadmaps:v,selectedRoadmapId:_,selectedRoadmap:S,milestones:F,featuresByMilestoneId:C,loading:se,error:A,createRoadmap:He,updateRoadmap:we,deleteRoadmap:h,selectRoadmap:I,createMilestone:je,updateMilestone:J,deleteMilestone:_e,reorderMilestones:H,createFeature:Le,updateFeature:M,deleteFeature:ue,reorderFeatures:ee,moveFeature:te,milestoneSuggestions:be,isGeneratingSuggestions:B,generateMilestoneSuggestions:pe,updateMilestoneSuggestionDraft:Ue,acceptMilestoneSuggestion:me,acceptAllMilestoneSuggestions:U,clearMilestoneSuggestions:ye,featureSuggestionsByMilestoneId:X,isGeneratingFeatureSuggestions:qe,generateFeatureSuggestions:Ge,updateFeatureSuggestionDraft:Ce,acceptFeatureSuggestion:Pe,acceptAllFeatureSuggestions:Je,clearFeatureSuggestions:Xe,handoffPayload:De,isFetchingHandoff:fe,handoffError:Be,fetchHandoff:ge,clearHandoff:$e,refresh:Qe}}function Xt({isOpen:l,onClose:n,roadmapTitle:v,handoffPayload:f,isLoading:_,error:j,onFetchHandoff:S,onCopyToClipboard:m}){return l?e.jsx("div",{className:"modal-overlay open",onClick:n,role:"presentation",children:e.jsxs("div",{className:"modal modal-lg",onClick:F=>F.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":"handoff-modal-title",children:[e.jsxs("div",{className:"modal-header",children:[e.jsxs("h2",{id:"handoff-modal-title",children:["Export Roadmap: ",v]}),e.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close modal",children:e.jsx(re,{size:18})})]}),e.jsxs("div",{className:"modal-body",children:[e.jsx("p",{className:"text-muted",style:{marginBottom:"var(--space-lg)"},children:"Export roadmap data for use in mission and task planning flows. This is a read-only export — no missions or tasks will be created."}),j&&e.jsxs("div",{className:"form-error",style:{marginBottom:"var(--space-lg)"},children:["Error loading handoff data: ",j.message]}),!f&&!_&&e.jsx("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:e.jsxs("button",{className:"btn btn-primary",onClick:S,children:[e.jsx(rt,{size:16,style:{marginRight:"var(--space-sm)"}}),"Load Handoff Data"]})}),_&&e.jsxs("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:[e.jsx(qt,{size:24,className:"spin"}),e.jsx("p",{style:{marginTop:"var(--space-md)"},children:"Loading handoff data..."})]}),f&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{marginBottom:"var(--space-lg)"},children:[e.jsx("h3",{style:{marginBottom:"var(--space-sm)"},children:"Mission Planning Handoff"}),e.jsx("div",{className:"card",style:{padding:"var(--space-md)"},children:e.jsx("pre",{style:{whiteSpace:"pre-wrap",fontSize:"12px",maxHeight:"200px",overflow:"auto"},children:JSON.stringify(f.mission,null,2)})})]}),e.jsxs("div",{style:{marginBottom:"var(--space-lg)"},children:[e.jsxs("h3",{style:{marginBottom:"var(--space-sm)"},children:["Feature Task Planning Handoffs (",f.features.length,")"]}),e.jsx("div",{className:"card",style:{padding:"var(--space-md)"},children:e.jsx("pre",{style:{whiteSpace:"pre-wrap",fontSize:"12px",maxHeight:"300px",overflow:"auto"},children:JSON.stringify(f.features,null,2)})})]})]})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("div",{className:"modal-actions-left",children:f&&e.jsxs("button",{className:"btn btn-sm",onClick:m,children:[e.jsx(Wt,{size:14,style:{marginRight:"var(--space-xs)"}}),"Copy to Clipboard"]})}),e.jsx("div",{className:"modal-actions-right",children:e.jsx("button",{className:"btn",onClick:n,children:"Close"})})]})]})}):null}function Qt({roadmap:l,isSelected:n,onSelect:v,onEdit:f,onDelete:_,onExport:j}){const S=C=>{C.key==="Enter"&&v()},m=C=>{C.stopPropagation(),f()},F=C=>{C.stopPropagation(),_()},E=C=>{C.stopPropagation(),j()};return e.jsxs("div",{className:`roadmaps-view__sidebar-item${n?" roadmaps-view__sidebar-item--active":""}`,onClick:v,onKeyDown:S,role:"button",tabIndex:0,"aria-selected":n,"data-testid":`roadmap-item-${l.id}`,children:[e.jsxs("div",{className:"roadmaps-view__sidebar-item-content",children:[e.jsx("div",{className:"roadmaps-view__sidebar-item-title",children:l.title}),l.description&&e.jsx("div",{className:"roadmaps-view__sidebar-item-desc",children:l.description})]}),e.jsxs("div",{className:"roadmaps-view__sidebar-item-actions",onClick:m,role:"presentation",children:[e.jsx("span",{className:"roadmaps-view__icon-btn",onClick:E,role:"button",title:"Export roadmap","aria-label":"Export roadmap","data-testid":`roadmap-export-${l.id}`,tabIndex:0,children:e.jsx(rt,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn",onClick:m,role:"button",title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`roadmap-edit-${l.id}`,tabIndex:0,children:e.jsx(Fe,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:F,role:"button",title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`roadmap-delete-${l.id}`,tabIndex:0,children:e.jsx(Te,{size:14})})]})]})}function Zt({roadmaps:l,selectedRoadmapId:n,onSelect:v,onCreate:f,onEdit:_,onDelete:j,onExport:S,showCreateForm:m,onCancelCreate:F,onSaveCreate:E}){return e.jsxs("div",{className:"roadmaps-view__mobile-list","data-testid":"roadmaps-view__mobile-list",children:[e.jsxs("div",{className:"roadmaps-view__mobile-list-header",children:[e.jsx("h2",{className:"roadmaps-view__mobile-list-title",children:"Roadmaps"}),!m&&e.jsx("button",{className:"roadmaps-view__mobile-add-btn",onClick:f,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-create-roadmap-btn",children:e.jsx(Ae,{size:18})})]}),m&&e.jsx("div",{className:"roadmaps-view__mobile-create-form",children:e.jsx(mt,{onSave:E,onCancel:F})}),l.length===0&&!m?e.jsxs("div",{className:"roadmaps-view__mobile-empty",children:[e.jsx("p",{children:"No roadmaps yet."}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:f,children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Create Roadmap"})]})]}):e.jsx("div",{className:"roadmaps-view__mobile-list-items",children:l.map(C=>e.jsxs("div",{className:`roadmaps-view__mobile-item${C.id===n?" roadmaps-view__mobile-item--active":""}`,onClick:()=>v(C.id),role:"button",tabIndex:0,onKeyDown:y=>{y.key==="Enter"&&v(C.id)},"data-testid":`mobile-roadmap-item-${C.id}`,children:[e.jsxs("div",{className:"roadmaps-view__mobile-item-content",children:[e.jsx("span",{className:"roadmaps-view__mobile-item-title",children:C.title}),C.description&&e.jsx("span",{className:"roadmaps-view__mobile-item-desc",children:C.description})]}),e.jsxs("div",{className:"roadmaps-view__mobile-item-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),S(C)},title:"Export roadmap","aria-label":"Export roadmap","data-testid":`mobile-roadmap-export-${C.id}`,children:e.jsx(rt,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),_(C)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`mobile-roadmap-edit-${C.id}`,children:e.jsx(Fe,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:y=>{y.stopPropagation(),j(C.id)},title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`mobile-roadmap-delete-${C.id}`,children:e.jsx(Te,{size:16})})]})]},C.id))})]})}function ea({roadmapTitle:l,onBack:n,onEdit:v,onDelete:f,onCreate:_}){return e.jsxs("div",{className:"roadmaps-view__mobile-header","data-testid":"roadmaps-view__mobile-header",children:[e.jsx("button",{className:"roadmaps-view__mobile-back-btn",onClick:n,title:"Back to roadmap list","aria-label":"Back to roadmap list","data-testid":"mobile-back-btn",children:e.jsx(Kt,{size:20})}),e.jsx("h2",{className:"roadmaps-view__mobile-header-title",children:l}),e.jsxs("div",{className:"roadmaps-view__mobile-header-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:_,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-header-create-btn",children:e.jsx(Ae,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:v,title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"mobile-header-edit-btn",children:e.jsx(Fe,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:f,title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"mobile-header-delete-btn",children:e.jsx(Te,{size:18})})]})]})}function ta({milestone:l,features:n,onEditMilestone:v,onDeleteMilestone:f,onAddFeature:_,onEditFeature:j,onDeleteFeature:S,milestoneEdit:m,onStartMilestoneEdit:F,onCancelMilestoneEdit:E,onSaveMilestoneEdit:C,featureEdit:y,onStartFeatureEdit:se,onCancelFeatureEdit:V,onSaveFeatureEdit:A,projectId:$,addToast:De,isMilestoneDragging:ne,isMilestoneDropTarget:fe,milestoneDropPosition:ie,onMilestoneDragStart:Be,onMilestoneDragEnd:oe,onMilestoneDragOver:be,onMilestoneDrop:P,onMilestoneDragLeave:B,isFeatureDragging:T,isFeatureDropTarget:X,featureDropIndex:O,onFeatureDragStart:Me,onFeatureDragEnd:le,onFeatureDragOver:Y,onFeatureDrop:ce,onFeatureDragLeave:Q,onFeatureDropOnMilestone:Re,featureSuggestions:D,isGeneratingFeatureSuggestions:Z,onGenerateFeatureSuggestions:Oe,onAcceptFeatureSuggestion:x,onAcceptAllFeatureSuggestions:de,onUpdateFeatureSuggestionDraft:ve,onClearFeatureSuggestions:R}){const xe=m?.milestoneId===l.id,q=h=>{h.key==="Enter"?(h.preventDefault(),m&&C({title:m.value})):h.key==="Escape"&&E()},N=h=>{h.key==="Escape"&&E()},He=["roadmaps-view__milestone",ne?"roadmaps-view__milestone--dragging":"",fe?"roadmaps-view__milestone--drop-target":"",fe&&ie==="before"?"roadmaps-view__milestone--drop-before":"",fe&&ie==="after"?"roadmaps-view__milestone--drop-after":""].filter(Boolean).join(" "),we=["roadmaps-view__feature-list",X?"roadmaps-view__feature-list--drop-target":""].filter(Boolean).join(" ");return e.jsxs("div",{className:He,draggable:!xe,onDragStart:h=>{xe||(Be(l.id),h.dataTransfer.setData("text/plain",`milestone:${l.id}`),h.dataTransfer.effectAllowed="move")},onDragEnd:oe,onDragOver:h=>{h.dataTransfer.types.includes("text/plain")&&h.dataTransfer.types.includes("text/plain")&&(h.preventDefault(),h.dataTransfer.dropEffect="move",be(l.id))},onDrop:h=>{h.preventDefault(),h.dataTransfer.getData("text/plain")?.startsWith("feature:")||P(l.id)},onDragLeave:B,"data-testid":`milestone-card-${l.id}`,children:[e.jsx("div",{className:"roadmaps-view__milestone-header",children:xe?e.jsxs("div",{className:"roadmaps-view__inline-edit",children:[e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${l.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:m.value,onChange:()=>F(),onKeyDown:q,placeholder:"Milestone title",autoFocus:!0,"data-testid":`milestone-title-input-${l.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>C({title:m.value}),"aria-label":"Save milestone title",title:"Save",children:e.jsx(he,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:E,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(re,{size:14})})]}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:m.field==="description"?m.value:l.description||"",onChange:()=>{},onKeyDown:N,placeholder:"Milestone description (optional)",rows:2,"data-testid":`milestone-desc-input-${l.id}`})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__milestone-title-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${l.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("h3",{className:"roadmaps-view__milestone-title",children:l.title}),e.jsxs("div",{className:"roadmaps-view__milestone-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:v,title:"Edit milestone","aria-label":"Edit milestone","data-testid":`milestone-edit-${l.id}`,children:e.jsx(Fe,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:f,title:"Delete milestone","aria-label":"Delete milestone","data-testid":`milestone-delete-${l.id}`,children:e.jsx(Te,{size:14})})]})]}),l.description&&e.jsx("p",{className:"roadmaps-view__milestone-desc",children:l.description})]})}),e.jsxs("div",{className:"roadmaps-view__milestone-actions-bar",children:[e.jsxs("button",{className:"roadmaps-view__add-feature-btn",onClick:_,title:"Add feature","aria-label":"Add feature","data-testid":`add-feature-${l.id}`,children:[e.jsx(Ae,{size:12}),e.jsx("span",{children:"Add Feature"})]}),e.jsxs("button",{className:"roadmaps-view__suggest-btn",onClick:()=>{Oe?.()},disabled:Z??!1,title:"Generate feature suggestions with AI","aria-label":"Generate feature suggestions","data-testid":`generate-features-${l.id}`,children:[e.jsx(pt,{size:12}),e.jsx("span",{children:Z?"Generating...":"AI Suggestions"})]})]}),e.jsxs("div",{className:we,onDragOver:h=>{h.preventDefault(),h.dataTransfer.dropEffect="move",h.dataTransfer.getData("text/plain")?.startsWith("feature:")&&Re()},onDrop:h=>{h.preventDefault();const I=h.dataTransfer.getData("text/plain");I?.startsWith("feature:")&&ce(I.split(":")[1],n.length)},onDragLeave:Q,children:[n.length===0?e.jsx("p",{className:"roadmaps-view__empty-features",children:"No features yet."}):n.map((h,I)=>{const je=y?.featureId===h.id,J=T(h.id),_e=M=>{M.key==="Enter"?(M.preventDefault(),y&&A({title:y.value})):M.key==="Escape"&&V()},Le=["roadmaps-view__feature-item",J?"roadmaps-view__feature-item--dragging":"",X&&O===I?"roadmaps-view__feature-item--drop-before":"",X&&O===I+1?"roadmaps-view__feature-item--drop-after":""].filter(Boolean).join(" ");return e.jsx("div",{className:Le,draggable:!je,onDragStart:M=>{je||(Me(h.id,l.id),M.dataTransfer.setData("text/plain",`feature:${h.id}`),M.dataTransfer.effectAllowed="move")},onDragEnd:le,onDragOver:M=>{if(M.preventDefault(),M.stopPropagation(),M.dataTransfer.dropEffect="move",M.dataTransfer.getData("text/plain")?.startsWith("feature:")){const H=M.currentTarget.getBoundingClientRect(),ee=H.top+H.height/2,te=M.clientY<ee?"before":"after";Y(h.id,te)}},onDrop:M=>{M.preventDefault(),M.stopPropagation();const ue=M.dataTransfer.getData("text/plain");if(ue?.startsWith("feature:")){const H=ue.split(":")[1],ee=M.currentTarget.getBoundingClientRect(),te=ee.top+ee.height/2,Ie=M.clientY<te?"before":"after";let pe=I;Ie==="after"&&(pe=I+1),ce(H,pe)}},onDragLeave:Q,"data-testid":`feature-item-${h.id}`,children:je?e.jsx("div",{className:"roadmaps-view__inline-edit roadmaps-view__inline-edit--compact",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Ye,{size:12})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:y.value,onChange:()=>{},onKeyDown:_e,placeholder:"Feature title",autoFocus:!0,"data-testid":`feature-title-input-${h.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>A({title:y.value}),"aria-label":"Save feature title",title:"Save",children:e.jsx(he,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:V,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(re,{size:14})})]})}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Ye,{size:12})}),e.jsxs("div",{className:"roadmaps-view__feature-content",children:[e.jsx("span",{className:"roadmaps-view__feature-title",children:h.title}),h.description&&e.jsx("p",{className:"roadmaps-view__feature-desc",children:h.description})]}),e.jsxs("div",{className:"roadmaps-view__feature-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>j(h.id),title:"Edit feature","aria-label":"Edit feature","data-testid":`feature-edit-${h.id}`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>S(h.id),title:"Delete feature","aria-label":"Delete feature","data-testid":`feature-delete-${h.id}`,children:e.jsx(Te,{size:12})})]})]})},h.id)}),D&&D.length>0&&e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h4",{className:"roadmap-suggestion-title",children:"AI Feature Suggestions"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-accept-all-btn",onClick:()=>de?.(),title:"Accept all suggestions","aria-label":"Accept all","data-testid":`accept-all-features-${l.id}`,children:"Accept All"}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:()=>R?.(),title:"Clear suggestions","aria-label":"Clear","data-testid":`clear-features-${l.id}`,children:"Clear"})]})]}),e.jsx("div",{className:"roadmap-suggestion-list",children:D.map(h=>e.jsx(aa,{suggestion:h,onUpdateDraft:I=>ve?.(l.id,h.id,I),onAccept:()=>{x?.(l.id,h.id)},testIdPrefix:`feature-suggestion-${l.id}`},h.id))})]})]})]})}function aa({suggestion:l,onUpdateDraft:n,onAccept:v,testIdPrefix:f}){const[_,j]=a.useState(!1),[S,m]=a.useState(l.title),[F,E]=a.useState(l.description||""),C=()=>{m(l.title),E(l.description||""),j(!0)},y=()=>{n({title:S.trim(),description:F.trim()||void 0}),j(!1)},se=()=>{m(l.title),E(l.description||""),j(!1)},V=()=>{l.title.trim()&&v()},A=l.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:S,onChange:$=>m($.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:F,onChange:$=>E($.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${f}-${l.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:y,disabled:!S.trim(),title:"Save","data-testid":`${f}-${l.id}-save`,children:e.jsx(he,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:se,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(re,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${f}-${l.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:l.title}),l.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:l.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:C,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:V,disabled:!A,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(he,{size:12})})]})]})}function ut({suggestion:l,onUpdateDraft:n,onAccept:v,testIdPrefix:f}){const[_,j]=a.useState(!1),[S,m]=a.useState(l.title),[F,E]=a.useState(l.description||""),C=()=>{m(l.title),E(l.description||""),j(!0)},y=()=>{n({title:S.trim(),description:F.trim()||void 0}),j(!1)},se=()=>{m(l.title),E(l.description||""),j(!1)},V=()=>{l.title.trim()&&v()},A=l.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:S,onChange:$=>m($.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:F,onChange:$=>E($.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${f}-${l.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:y,disabled:!S.trim(),title:"Save","data-testid":`${f}-${l.id}-save`,children:e.jsx(he,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:se,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(re,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${f}-${l.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:l.title}),l.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:l.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:C,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Fe,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:V,disabled:!A,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(he,{size:12})})]})]})}function mt({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form","data-testid":"create-roadmap-form",children:e.jsxs("form",{onSubmit:S,children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Roadmap title",autoFocus:!0,"data-testid":"create-roadmap-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Roadmap description (optional)",rows:2,"data-testid":"create-roadmap-description"}),e.jsxs("div",{className:"roadmaps-view__create-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__btn roadmaps-view__btn--primary",disabled:!v.trim(),"data-testid":"create-roadmap-submit",children:"Create"}),e.jsx("button",{type:"button",className:"roadmaps-view__btn",onClick:n,"data-testid":"create-roadmap-cancel",children:"Cancel"})]})]})})}function ra({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-milestone-form",children:e.jsxs("form",{onSubmit:S,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":"create-milestone-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-milestone-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!v.trim(),"aria-label":"Save milestone",title:"Save","data-testid":"create-milestone-submit",children:e.jsx(he,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:n,"aria-label":"Cancel",title:"Cancel","data-testid":"create-milestone-cancel",children:e.jsx(re,{size:14})})]})]})})}function sa({onSave:l,onCancel:n}){const[v,f]=a.useState(""),[_,j]=a.useState(""),S=m=>{m.preventDefault(),v.trim()&&l({title:v.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-feature-form",children:e.jsxs("form",{onSubmit:S,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:v,onChange:m=>f(m.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":"create-feature-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:m=>j(m.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-feature-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!v.trim(),"aria-label":"Save feature",title:"Save","data-testid":"create-feature-submit",children:e.jsx(he,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:n,"aria-label":"Cancel",title:"Cancel","data-testid":"create-feature-cancel",children:e.jsx(re,{size:14})})]})]})})}function ca({projectId:l,addToast:n}){const{confirm:v}=Lt(),f=Vt()==="mobile",{roadmaps:_,selectedRoadmapId:j,selectedRoadmap:S,milestones:m,featuresByMilestoneId:F,loading:E,error:C,createRoadmap:y,updateRoadmap:se,deleteRoadmap:V,selectRoadmap:A,createMilestone:$,updateMilestone:De,deleteMilestone:ne,createFeature:fe,updateFeature:ie,deleteFeature:Be,reorderMilestones:oe,reorderFeatures:be,moveFeature:P,milestoneSuggestions:B,isGeneratingSuggestions:T,generateMilestoneSuggestions:X,updateMilestoneSuggestionDraft:O,acceptMilestoneSuggestion:Me,acceptAllMilestoneSuggestions:le,clearMilestoneSuggestions:Y,featureSuggestionsByMilestoneId:ce,isGeneratingFeatureSuggestions:Q,generateFeatureSuggestions:Re,updateFeatureSuggestionDraft:D,acceptFeatureSuggestion:Z,acceptAllFeatureSuggestions:Oe,clearFeatureSuggestions:x,handoffPayload:de,isFetchingHandoff:ve,handoffError:R,fetchHandoff:xe,clearHandoff:q}=Jt({projectId:l}),[N,He]=a.useState(!1),[we,h]=a.useState(null),[I,je]=a.useState(""),[J,_e]=a.useState(""),[Le,M]=a.useState(!1),ue=a.useRef(null);a.useEffect(()=>{ue.current!==null&&ue.current!==j&&M(!1),ue.current=j},[j]);const[H,ee]=a.useState({roadmapId:null,field:null,value:""}),[te,Ie]=a.useState({milestoneId:null,field:null,value:""}),[pe,Ue]=a.useState({featureId:null,field:null,value:""}),[me,U]=a.useState({type:null,parentId:void 0,title:"",description:""}),[qe,Ge]=a.useState(!1),[Ce,Pe]=a.useState({draggingId:null,dropTargetId:null,dropPosition:null}),Je=a.useCallback(t=>{Pe(u=>({...u,draggingId:t}))},[]),ye=a.useCallback(()=>{Pe({draggingId:null,dropTargetId:null,dropPosition:null})},[]),Xe=a.useCallback(t=>{Pe(u=>u.draggingId===t?u:{...u,dropTargetId:t,dropPosition:null})},[]),[ge,$e]=a.useState({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}),Qe=a.useCallback((t,u)=>{$e(b=>({...b,draggingId:t,draggingMilestoneId:u}))},[]),r=a.useCallback(()=>{$e({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null})},[]),c=a.useCallback((t,u)=>{$e(b=>{if(b.draggingId===t)return b;const L=(F[b.draggingMilestoneId||""]||[]).findIndex(Ee=>Ee.id===t);let W;return u==="before"?W=L:W=L+1,{...b,dropTargetMilestoneId:b.draggingMilestoneId,dropTargetIndex:W,dropPosition:u}})},[F]),i=a.useCallback(()=>{$e(t=>({...t,dropTargetMilestoneId:t.draggingMilestoneId,dropTargetIndex:(F[t.draggingMilestoneId||""]||[]).length}))},[F]),s=a.useCallback(async(t,u)=>{const{draggingMilestoneId:b,dropTargetMilestoneId:z}=ge;if(!b){r();return}const L=z||b,W=F[b]||[],Ee=W.find(ke=>ke.id===t);if(!Ee){r();return}if(b!==L){if(b===L){r();return}try{await P(t,L,u,{onError:ke=>{n(`Failed to move feature: ${ke.message}`,"error")}})}catch{}}else{const ke=[...W],Nt=ke.findIndex(ze=>ze.id===t);ke.splice(Nt,1),ke.splice(u,0,Ee);const dt=ke.map(ze=>ze.id),St=W.map(ze=>ze.id);if(dt.join(",")===St.join(",")){r();return}try{await be(b,dt,{onError:ze=>{n(`Failed to reorder features: ${ze.message}`,"error")}})}catch{}}r()},[ge,F,be,P,n,r]),d=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),b=t.clientX,z=t.clientY;(b<u.left||b>u.right||z<u.top||z>u.bottom)&&$e(L=>({...L,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}))},[]),o=a.useCallback(t=>ge.draggingId===t,[ge.draggingId]),g=a.useCallback(async t=>{const{draggingId:u}=Ce;if(!u||u===t){ye();return}const b=m.map(Ee=>Ee.id),z=b.indexOf(u),L=b.indexOf(t);if(z===-1||L===-1){ye();return}const W=[...b];if(W.splice(z,1),W.splice(L,0,u),W.join(",")===b.join(",")){ye();return}try{await oe(j,W,{onError:Ee=>{n(`Failed to reorder milestones: ${Ee.message}`,"error")}})}catch{}ye()},[Ce,m,j,oe,n,ye]),p=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),b=t.clientX,z=t.clientY;(b<u.left||b>u.right||z<u.top||z>u.bottom)&&Pe(L=>({...L,dropTargetId:null,dropPosition:null}))},[]),w=a.useCallback(t=>{A(t.id),ee({roadmapId:t.id,field:"title",value:t.title})},[A]),G=a.useCallback(()=>{ee({roadmapId:null,field:null,value:""})},[]),Ne=a.useCallback(async t=>{if(H.roadmapId)try{await se(H.roadmapId,t,{onError:u=>n(u.message,"error")}),G()}catch{}},[H.roadmapId,se,G,n]),ae=a.useCallback(async t=>{if(await v({title:"Delete Roadmap",message:"Delete this roadmap? This cannot be undone.",danger:!0}))try{await V(t,{onError:b=>n(b.message,"error")}),n("Roadmap deleted","success")}catch{}},[V,n,v]),Ve=a.useCallback((t,u)=>{h(t),je(u),He(!0),q()},[q]),k=a.useCallback(()=>{He(!1),h(null),je(""),q()},[q]),K=a.useCallback(()=>{we&&xe(we,{onError:t=>n(`Failed to load handoff: ${t.message}`,"error")})},[we,xe,n]),Ke=a.useCallback(()=>{if(de){const t=JSON.stringify(de,null,2);navigator.clipboard.writeText(t).then(()=>{n("Handoff data copied to clipboard","success")}).catch(()=>{n("Failed to copy to clipboard","error")})}},[de,n]),We=a.useCallback(async t=>{try{await y(t,{onError:u=>n(u.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Roadmap created","success")}catch{}},[y,n]),st=a.useCallback(t=>{Ie({milestoneId:t.id,field:"title",value:t.title})},[]),Ze=a.useCallback(()=>{Ie({milestoneId:null,field:null,value:""})},[]),gt=a.useCallback(async t=>{if(te.milestoneId)try{await De(te.milestoneId,t,{onError:u=>n(u.message,"error")}),Ze()}catch{}},[te.milestoneId,De,Ze,n]),ht=a.useCallback(async t=>{if(await v({title:"Delete Milestone",message:"Delete this milestone and all its features?",danger:!0}))try{await ne(t,{onError:b=>n(b.message,"error")}),n("Milestone deleted","success")}catch{}},[ne,n,v]),ft=a.useCallback(async t=>{try{await $(t,{onError:u=>n(u.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Milestone created","success")}catch{}},[$,n]),nt=a.useCallback((t,u,b)=>{Ue({featureId:t,field:"title",value:u})},[]),et=a.useCallback(()=>{Ue({featureId:null,field:null,value:""})},[]),bt=a.useCallback(async t=>{if(pe.featureId)try{await ie(pe.featureId,t,{onError:u=>n(u.message,"error")}),et()}catch{}},[pe.featureId,ie,et,n]),vt=a.useCallback(async t=>{if(await v({title:"Delete Feature",message:"Delete this feature?",danger:!0}))try{await Be(t,{onError:b=>n(b.message,"error")}),n("Feature deleted","success")}catch{}},[Be,n,v]),it=a.useCallback(async()=>{if(J.trim())try{await X(J,5,{onError:t=>n(t.message,"error")})}catch{}},[J,X,n]),ot=a.useCallback(async t=>{try{await Me(t,{onError:u=>n(u.message,"error")}),n("Milestone added","success")}catch{}},[Me,n]),lt=a.useCallback(async()=>{try{await le({onError:t=>n(t.message,"error")}),n(`${B.length} milestones added`,"success"),_e("")}catch{}},[le,B.length,n]),ct=a.useCallback(()=>{Y(),_e("")},[Y]),xt=a.useCallback(async t=>{try{await Re(t,{count:5},{onError:u=>n(u.message,"error")})}catch{}},[Re,n]),wt=a.useCallback(async(t,u)=>{try{await Z(t,u,{onError:b=>n(b.message,"error")}),n("Feature added","success")}catch{}},[Z,n]),jt=a.useCallback((t,u,b)=>{D(t,u,b)},[D]),_t=a.useCallback(async t=>{const u=ce[t]||[];try{await Oe(t,{onError:b=>n(b.message,"error")}),n(`${u.length} features added`,"success")}catch{}},[Oe,ce,n]),Ct=a.useCallback(t=>{x(t)},[x]),yt=a.useCallback(async(t,u)=>{try{await fe(t,u,{onError:b=>n(b.message,"error")}),U({type:null,parentId:void 0,title:"",description:""}),n("Feature created","success")}catch{}},[fe,n]),Se=j;return E&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--loading",children:e.jsx("div",{className:"roadmaps-view__loading-state",children:"Loading roadmaps..."})}):C&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--error",children:e.jsxs("div",{className:"roadmaps-view__error-state",children:[e.jsx("p",{children:"Failed to load roadmaps"}),e.jsx("p",{className:"roadmaps-view__error-msg",children:C.message})]})}):e.jsxs("div",{className:"roadmaps-view",children:[f&&!Se&&e.jsx(Zt,{roadmaps:_,selectedRoadmapId:Se,onSelect:t=>A(t),onCreate:()=>Ge(!0),onEdit:w,onDelete:ae,onExport:t=>Ve(t.id,t.title),showCreateForm:qe,onCancelCreate:()=>Ge(!1),onSaveCreate:async t=>{await We(t),Ge(!1)}}),!f&&e.jsxs("aside",{className:"roadmaps-view__sidebar","aria-label":"Roadmaps",children:[e.jsxs("div",{className:"roadmaps-view__sidebar-header",children:[e.jsx("h2",{className:"roadmaps-view__sidebar-title",children:"Roadmaps"}),e.jsx("button",{className:"roadmaps-view__add-btn",onClick:()=>U({type:"roadmap",title:"",description:""}),title:"Create roadmap","aria-label":"Create roadmap","data-testid":"create-roadmap-btn",children:e.jsx(Ae,{size:16})})]}),me.type==="roadmap"&&e.jsx(mt,{onSave:We,onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})}),e.jsx("div",{className:"roadmaps-view__sidebar-list",children:_.length===0?e.jsx("p",{className:"roadmaps-view__empty-sidebar",children:"No roadmaps yet. Click + to create one."}):_.map(t=>e.jsx(Qt,{roadmap:t,isSelected:t.id===Se,onSelect:()=>A(t.id),onEdit:()=>w(t),onDelete:()=>ae(t.id),onExport:()=>Ve(t.id,t.title)},t.id))})]}),e.jsxs("main",{className:"roadmaps-view__main","aria-label":"Roadmap content",children:[f&&Se&&e.jsx(ea,{roadmapTitle:S?.title||"Untitled Roadmap",onBack:()=>A(null),onEdit:()=>{S&&w(S)},onDelete:()=>ae(Se),onCreate:()=>Ge(!0)}),Se?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"roadmaps-view__roadmap-header",children:H.roadmapId===Se?e.jsx("div",{className:"roadmaps-view__inline-edit",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input roadmaps-view__inline-input--large",value:H.value,onChange:t=>ee(u=>({...u,value:t.target.value})),onKeyDown:t=>{t.key==="Enter"?Ne({title:H.value}):t.key==="Escape"&&G()},placeholder:"Roadmap title",autoFocus:!0,"data-testid":"roadmap-title-input"}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>Ne({title:H.value}),"aria-label":"Save",title:"Save",children:e.jsx(he,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:G,"aria-label":"Cancel",title:"Cancel",children:e.jsx(re,{size:16})})]})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__roadmap-title-row",children:[e.jsx("h1",{className:"roadmaps-view__roadmap-title",children:S?.title||"Untitled Roadmap"}),e.jsxs("div",{className:"roadmaps-view__roadmap-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>{S&&w(S)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"edit-roadmap-btn",children:e.jsx(Fe,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>ae(Se),title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"delete-roadmap-btn",children:e.jsx(Te,{size:16})})]})]}),S?.description&&e.jsx("p",{className:"roadmaps-view__roadmap-desc",children:S.description})]})}),f?Le?e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"}),e.jsx("button",{className:"roadmap-suggestion-collapse-btn",onClick:()=>M(!1),"aria-label":"Collapse suggestion panel","data-testid":"collapse-suggestion-panel-btn",children:e.jsx(Ut,{size:16})})]}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:J,onChange:t=>_e(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:T||!j,"data-testid":"goal-prompt-input",autoFocus:!0}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:it,disabled:!J.trim()||T||!j,"data-testid":"generate-suggestions-btn",children:T?"Generating...":"Generate Milestones"}),B.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:lt,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",B.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ct,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(re,{size:14})})]})]})]}),B.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:B.map(t=>e.jsx(ut,{suggestion:t,onUpdateDraft:u=>O(t.id,u),onAccept:()=>ot(t.id),testIdPrefix:"suggestion"},t.id))})]}):e.jsx("div",{className:"roadmap-suggestion-section",children:e.jsxs("button",{className:"roadmap-suggestion-expand-btn",onClick:()=>M(!0),disabled:!j,"data-testid":"expand-suggestion-panel-btn",children:[e.jsx(pt,{size:16}),"Generate Milestone Ideas"]})}):e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsx("div",{className:"roadmap-suggestion-header",children:e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"})}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:J,onChange:t=>_e(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:T||!j,"data-testid":"goal-prompt-input"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:it,disabled:!J.trim()||T||!j,"data-testid":"generate-suggestions-btn",children:T?"Generating...":"Generate Milestones"}),B.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:lt,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",B.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ct,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(re,{size:14})})]})]})]}),B.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:B.map(t=>e.jsx(ut,{suggestion:t,onUpdateDraft:u=>O(t.id,u),onAccept:()=>ot(t.id),testIdPrefix:"suggestion"},t.id))})]}),e.jsxs("div",{className:"roadmaps-view__milestone-lanes",children:[me.type==="milestone"&&e.jsx(ra,{onSave:ft,onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})}),m.length===0&&me.type!=="milestone"?e.jsxs("div",{className:"roadmaps-view__empty-milestones",children:[e.jsx("p",{children:"This roadmap has no milestones."}),e.jsxs("button",{className:"roadmaps-view__add-milestone-btn",onClick:()=>U({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn-empty",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]})]}):e.jsxs(e.Fragment,{children:[me.type!=="milestone"&&e.jsxs("button",{className:"roadmaps-view__add-milestone-fab",onClick:()=>U({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]}),m.map(t=>e.jsx(ta,{milestone:t,features:F[t.id]||[],onEditMilestone:()=>st(t),onDeleteMilestone:()=>ht(t.id),onAddFeature:()=>U({type:"feature",parentId:t.id,title:"",description:""}),onEditFeature:u=>{const b=F[t.id]?.find(z=>z.id===u);b&&nt(u,b.title,b.description)},onDeleteFeature:vt,milestoneEdit:te,onStartMilestoneEdit:()=>st(t),onCancelMilestoneEdit:Ze,onSaveMilestoneEdit:gt,featureEdit:pe,onStartFeatureEdit:nt,onCancelFeatureEdit:et,onSaveFeatureEdit:bt,projectId:l,addToast:n,isMilestoneDragging:Ce.draggingId===t.id,isMilestoneDropTarget:Ce.dropTargetId===t.id,milestoneDropPosition:Ce.dropTargetId===t.id?Ce.dropPosition:null,onMilestoneDragStart:Je,onMilestoneDragEnd:ye,onMilestoneDragOver:Xe,onMilestoneDrop:g,onMilestoneDragLeave:p,isFeatureDragging:o,isFeatureDropTarget:ge.dropTargetMilestoneId===t.id,featureDropIndex:ge.dropTargetMilestoneId===t.id?ge.dropTargetIndex:null,onFeatureDragStart:Qe,onFeatureDragEnd:r,onFeatureDragOver:c,onFeatureDrop:s,onFeatureDragLeave:d,onFeatureDropOnMilestone:i,featureSuggestions:ce[t.id],isGeneratingFeatureSuggestions:Q(t.id),onGenerateFeatureSuggestions:()=>xt(t.id),onAcceptFeatureSuggestion:u=>wt(t.id,u),onAcceptAllFeatureSuggestions:()=>_t(t.id),onUpdateFeatureSuggestionDraft:(u,b,z)=>jt(u,b,z),onClearFeatureSuggestions:()=>Ct(t.id)},t.id))]})]})]}):e.jsx("div",{className:"roadmaps-view__empty-main",children:e.jsx("p",{children:"Select a roadmap from the sidebar to view its milestones."})})]}),me.type==="feature"&&me.parentId&&e.jsx("div",{className:"roadmaps-view__feature-create-overlay",children:e.jsx(sa,{onSave:t=>yt(me.parentId,t),onCancel:()=>U({type:null,parentId:void 0,title:"",description:""})})}),e.jsx(Xt,{isOpen:N,onClose:k,roadmapId:we||"",roadmapTitle:I,handoffPayload:de,isLoading:ve,error:R,onFetchHandoff:K,onCopyToClipboard:Ke})]})}export{ca as RoadmapsView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.prompt-manager{display:flex;flex-direction:column;gap:var(--space-md);padding:0 20px;margin-top:var(--space-md)}.prompt-manager-tabs{display:flex;gap:var(--space-xs);border-bottom:1px solid var(--border);padding-bottom:var(--space-sm)}.prompt-manager-tab{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);background:none;border:1px solid transparent;border-radius:var(--radius-md);color:var(--text-muted);font-size:13px;cursor:pointer;transition:all var(--transition-fast)}.prompt-manager-tab:hover{color:var(--text);background:var(--surface)}.prompt-manager-tab.active{color:var(--text);background:var(--surface);border-color:var(--border)}.prompt-manager-content{min-height:200px}.prompt-manager-templates-tab,.prompt-manager-assignments-tab,.prompt-manager-overrides-tab{display:flex;flex-direction:column;gap:var(--space-lg)}.prompt-template-section{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-section-title{font-size:14px;font-weight:600;color:var(--text);margin:0}.prompt-template-section-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-template-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-card{padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast)}.prompt-template-card:hover{border-color:var(--text-dim)}.prompt-template-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);margin-bottom:var(--space-sm)}.prompt-template-card-info{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm)}.prompt-template-card-name{font-weight:600;color:var(--text);font-size:14px}.prompt-template-badge-built-in,.prompt-template-badge-custom,.prompt-template-badge-override{display:inline-flex;align-items:center;padding:2px 6px;font-size:10px;font-weight:500;border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.02em}.prompt-template-badge-built-in{background:var(--surface);color:var(--text-muted);border:1px solid var(--border)}.prompt-template-badge-custom{background:color-mix(in srgb,var(--ws-info) 15%,transparent);color:var(--ws-info)}.prompt-template-badge-override{background:color-mix(in srgb,var(--ws-warning) 15%,transparent);color:var(--ws-warning)}.prompt-template-badge-role{display:inline-flex;align-items:center;padding:2px 6px;font-size:10px;font-weight:500;border-radius:var(--radius-sm)}.prompt-template-card-actions{display:flex;gap:var(--space-xs)}.prompt-template-card-actions .btn-icon{padding:var(--space-xs)}.prompt-template-card-description{font-size:12px;color:var(--text-muted);margin:0 0 var(--space-sm) 0;line-height:1.4}.prompt-template-card-preview{background:var(--surface);border-radius:var(--radius-sm);padding:var(--space-sm);overflow:hidden}.prompt-template-card-preview code{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word;display:block;max-height:120px;overflow-y:auto}.prompt-template-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:13px;background:var(--surface);border:1px dashed var(--border);border-radius:var(--radius-md)}.prompt-template-add-btn{align-self:flex-start;margin-top:var(--space-sm)}.prompt-template-editor{padding:var(--space-lg);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-lg)}.prompt-template-editor-title{font-size:14px;font-weight:600;color:var(--text);margin:0 0 var(--space-md) 0}.prompt-template-editor-fields{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-field{display:flex;flex-direction:column;gap:var(--space-xs)}.prompt-template-field label{font-size:12px;font-weight:500;color:var(--text-muted)}.prompt-template-field input,.prompt-template-field select,.prompt-template-prompt-textarea{padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:13px;transition:border-color var(--transition-fast)}.prompt-template-field input:focus,.prompt-template-field select:focus,.prompt-template-prompt-textarea:focus{outline:none;border-color:var(--todo)}.prompt-template-prompt-textarea{font-family:var(--font-mono);font-size:12px;line-height:1.5;resize:vertical;min-height:120px}.prompt-template-error{padding:var(--space-sm);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid var(--color-error);border-radius:var(--radius-sm);color:var(--color-error);font-size:12px}.prompt-template-editor-actions{display:flex;gap:var(--space-sm);justify-content:flex-end;margin-top:var(--space-sm)}.prompt-template-delete-confirm{padding:var(--space-md);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid var(--color-error);border-radius:var(--radius-md);display:flex;flex-direction:column;gap:var(--space-sm)}.prompt-template-delete-confirm p{margin:0;font-size:13px;color:var(--text)}.prompt-template-delete-actions{display:flex;gap:var(--space-sm)}.prompt-assignments-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-role-assignment-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-role-assignment-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-lg);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md)}.prompt-role-assignment-label{display:flex;align-items:center;gap:var(--space-md)}.prompt-role-badge{display:inline-flex;align-items:center;padding:var(--space-xs) var(--space-sm);font-size:12px;font-weight:600;border-radius:var(--radius-sm)}.prompt-role-assignment-status{font-size:12px;color:var(--text-muted)}.prompt-role-select{min-width:200px;padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:13px;cursor:pointer}.prompt-role-select:focus{outline:none;border-color:var(--todo)}.prompt-assignments-note{margin-top:var(--space-md);padding:var(--space-md);background:var(--surface);border-radius:var(--radius-md);font-size:12px;color:var(--text-muted);line-height:1.5}.prompt-assignments-note strong{color:var(--text)}.prompt-overrides-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-overrides-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-override-item{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}.prompt-override-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md);cursor:pointer;transition:background var(--transition-fast)}.prompt-override-header:hover{background:var(--card-hover)}.prompt-override-info{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm)}.prompt-override-name{font-weight:600;color:var(--text);font-size:13px}.prompt-override-key{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);padding:2px 4px;background:var(--surface);border-radius:var(--radius-sm)}.prompt-override-badge{display:inline-flex;align-items:center;padding:2px 6px;font-size:10px;font-weight:500;background:color-mix(in srgb,var(--ws-warning) 15%,transparent);color:var(--ws-warning);border-radius:var(--radius-sm)}.prompt-override-expand-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:none;border:none;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.prompt-override-expand-btn:hover{color:var(--text);background:var(--surface)}.prompt-override-description{font-size:12px;color:var(--text-muted);margin:0;padding:0 var(--space-md) var(--space-md);line-height:1.4}.prompt-override-editor{padding:var(--space-md);border-top:1px solid var(--border);background:var(--surface);display:flex;flex-direction:column;gap:var(--space-sm)}.prompt-override-textarea{padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:12px;font-family:var(--font-mono);line-height:1.5;resize:vertical;min-height:80px;transition:border-color var(--transition-fast)}.prompt-override-textarea:focus{outline:none;border-color:var(--todo)}.prompt-override-footer{display:flex;align-items:center;gap:var(--space-md)}.prompt-override-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.prompt-override-header-actions{display:flex;align-items:center;gap:var(--space-xs)}.prompt-override-fullscreen-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:none;border:none;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.prompt-override-fullscreen-btn:hover{color:var(--text);background:var(--surface)}.prompt-override-fullscreen{position:fixed;inset:0;z-index:10000;background:var(--surface);padding:max(var(--space-lg),env(safe-area-inset-top,0px)) max(var(--space-lg),env(safe-area-inset-right,0px)) max(var(--space-lg),env(safe-area-inset-bottom,0px)) max(var(--space-lg),env(safe-area-inset-left,0px));display:flex;flex-direction:column}.prompt-override-fullscreen-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-md);flex-shrink:0}.prompt-override-fullscreen-title{font-size:13px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:var(--space-sm)}.prompt-override-fullscreen-close{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:none;border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-muted);cursor:pointer;font-size:12px;transition:all var(--transition-fast)}.prompt-override-fullscreen-close:hover{color:var(--text);border-color:var(--text-muted)}.prompt-override-fullscreen-close:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.prompt-override-fullscreen textarea{flex:1;min-height:unset;resize:none;border-radius:var(--radius-md);font-size:14px;line-height:1.6}.prompt-template-fullscreen-pre{flex:1;font-family:var(--font-mono);font-size:13px;line-height:1.6;color:var(--text);white-space:pre-wrap;word-break:break-word;overflow-y:auto;padding:var(--space-md);background:var(--bg);border-radius:var(--radius-md);border:1px solid var(--border);margin:0}.prompt-override-fullscreen .prompt-override-footer{flex-shrink:0;padding-top:var(--space-sm)}.prompt-template-prompt-label-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-xs)}.prompt-template-prompt-label-row label{display:block}.prompt-template-fullscreen-btn{vertical-align:middle}.prompt-template-prompt-label-row .prompt-template-fullscreen-btn{margin-left:var(--space-xs)}@media(max-width:768px){.prompt-manager{padding:0 14px}.prompt-manager-tabs{flex-wrap:wrap}.prompt-manager-tab{flex:1;justify-content:center;min-width:calc(50% - var(--space-xs))}.prompt-role-assignment-row{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.prompt-role-select{width:100%}.prompt-template-editor-actions{flex-direction:column}.prompt-template-editor-actions .btn{width:100%}.prompt-override-fullscreen{padding:var(--space-md)}.prompt-override-fullscreen textarea{font-size:16px}}.new-task-modal .form-group small{display:block;margin-top:var(--space-sm);font-size:12px;color:var(--text-muted);line-height:1.4}.new-task-modal textarea{min-height:80px;transition:height .1s ease-out}.selected-deps{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--space-sm);padding:2px 0}.dep-chip{display:inline-flex;align-items:center;gap:var(--space-xs);padding:3px 8px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);font-size:12px;color:var(--text);font-family:var(--font-mono);max-width:100%}.dep-chip-remove{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:12px;line-height:1;padding:0;margin-left:2px;border-radius:50%;transition:background .1s,color .1s}.dep-chip-remove:hover{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.model-select-row{display:flex;align-items:center;gap:var(--space-md);margin-bottom:var(--space-md)}.model-select-row:last-child{margin-bottom:0}.model-select-label{width:70px;flex-shrink:0;font-size:13px;color:var(--text-muted);text-align:right}@media(max-width:768px){.model-select-row{flex-direction:column;align-items:stretch;gap:var(--space-xs)}.model-select-label{width:auto;text-align:left}}
|
|
1
|
+
.prompt-manager{display:flex;flex-direction:column;gap:var(--space-md);padding:0 20px;margin-top:var(--space-md)}.prompt-manager-tabs{display:flex;gap:var(--space-xs);border-bottom:1px solid var(--border);padding-bottom:var(--space-sm)}.prompt-manager-tab{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);background:none;border:1px solid transparent;border-radius:var(--radius-md);color:var(--text-muted);font-size:13px;cursor:pointer;transition:all var(--transition-fast)}.prompt-manager-tab:hover{color:var(--text);background:var(--surface)}.prompt-manager-tab.active{color:var(--text);background:var(--surface);border-color:var(--border)}.prompt-manager-content{min-height:200px}.prompt-manager-templates-tab,.prompt-manager-assignments-tab,.prompt-manager-overrides-tab{display:flex;flex-direction:column;gap:var(--space-lg)}.prompt-template-section{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-section-title{font-size:14px;font-weight:600;color:var(--text);margin:0}.prompt-template-section-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-template-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-card{padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast)}.prompt-template-card:hover{border-color:var(--text-dim)}.prompt-template-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);margin-bottom:var(--space-sm)}.prompt-template-card-info{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm)}.prompt-template-card-name{font-weight:600;color:var(--text);font-size:14px}.prompt-template-badge-built-in,.prompt-template-badge-custom,.prompt-template-badge-override{display:inline-flex;align-items:center;padding:2px 6px;font-size:10px;font-weight:500;border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.02em}.prompt-template-badge-built-in{background:var(--surface);color:var(--text-muted);border:1px solid var(--border)}.prompt-template-badge-custom{background:color-mix(in srgb,var(--ws-info) 15%,transparent);color:var(--ws-info)}.prompt-template-badge-override{background:color-mix(in srgb,var(--ws-warning) 15%,transparent);color:var(--ws-warning)}.prompt-template-badge-role{display:inline-flex;align-items:center;padding:2px 6px;font-size:10px;font-weight:500;border-radius:var(--radius-sm)}.prompt-template-card-actions{display:flex;gap:var(--space-xs)}.prompt-template-card-actions .btn-icon{padding:var(--space-xs)}.prompt-template-card-description{font-size:12px;color:var(--text-muted);margin:0 0 var(--space-sm) 0;line-height:1.4}.prompt-template-card-preview{background:var(--surface);border-radius:var(--radius-sm);padding:var(--space-sm);overflow:hidden}.prompt-template-card-preview code{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word;display:block;max-height:120px;overflow-y:auto}.prompt-template-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:13px;background:var(--surface);border:1px dashed var(--border);border-radius:var(--radius-md)}.prompt-template-add-btn{align-self:flex-start;margin-top:var(--space-sm)}.prompt-template-editor{padding:var(--space-lg);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-lg)}.prompt-template-editor-title{font-size:14px;font-weight:600;color:var(--text);margin:0 0 var(--space-md) 0}.prompt-template-editor-fields{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-field{display:flex;flex-direction:column;gap:var(--space-xs)}.prompt-template-field label{font-size:12px;font-weight:500;color:var(--text-muted)}.prompt-template-field input,.prompt-template-field select,.prompt-template-prompt-textarea{padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:13px;transition:border-color var(--transition-fast)}.prompt-template-field input:focus,.prompt-template-field select:focus,.prompt-template-prompt-textarea:focus{outline:none;border-color:var(--todo)}.prompt-template-prompt-textarea{font-family:var(--font-mono);font-size:12px;line-height:1.5;resize:vertical;min-height:120px}.prompt-template-error{padding:var(--space-sm);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid var(--color-error);border-radius:var(--radius-sm);color:var(--color-error);font-size:12px}.prompt-template-editor-actions{display:flex;gap:var(--space-sm);justify-content:flex-end;margin-top:var(--space-sm)}.prompt-template-delete-confirm{padding:var(--space-md);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid var(--color-error);border-radius:var(--radius-md);display:flex;flex-direction:column;gap:var(--space-sm)}.prompt-template-delete-confirm p{margin:0;font-size:13px;color:var(--text)}.prompt-template-delete-actions{display:flex;gap:var(--space-sm)}.prompt-assignments-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-role-assignment-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-role-assignment-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-lg);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md)}.prompt-role-assignment-label{display:flex;align-items:center;gap:var(--space-md)}.prompt-role-badge{display:inline-flex;align-items:center;padding:var(--space-xs) var(--space-sm);font-size:12px;font-weight:600;border-radius:var(--radius-sm)}.prompt-role-assignment-status{font-size:12px;color:var(--text-muted)}.prompt-role-select{min-width:200px;padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:13px;cursor:pointer}.prompt-role-select:focus{outline:none;border-color:var(--todo)}.prompt-assignments-note{margin-top:var(--space-md);padding:var(--space-md);background:var(--surface);border-radius:var(--radius-md);font-size:12px;color:var(--text-muted);line-height:1.5}.prompt-assignments-note strong{color:var(--text)}.prompt-overrides-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-overrides-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-override-item{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}.prompt-override-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md);cursor:pointer;transition:background var(--transition-fast)}.prompt-override-header:hover{background:var(--card-hover)}.prompt-override-info{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm)}.prompt-override-name{font-weight:600;color:var(--text);font-size:13px}.prompt-override-key{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);padding:2px 4px;background:var(--surface);border-radius:var(--radius-sm)}.prompt-override-badge{display:inline-flex;align-items:center;padding:2px 6px;font-size:10px;font-weight:500;background:color-mix(in srgb,var(--ws-warning) 15%,transparent);color:var(--ws-warning);border-radius:var(--radius-sm)}.prompt-override-expand-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:none;border:none;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.prompt-override-expand-btn:hover{color:var(--text);background:var(--surface)}.prompt-override-description{font-size:12px;color:var(--text-muted);margin:0;padding:0 var(--space-md) var(--space-md);line-height:1.4}.prompt-override-editor{padding:var(--space-md);border-top:1px solid var(--border);background:var(--surface);display:flex;flex-direction:column;gap:var(--space-sm)}.prompt-override-textarea{padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:12px;font-family:var(--font-mono);line-height:1.5;resize:vertical;min-height:80px;transition:border-color var(--transition-fast)}.prompt-override-textarea:focus{outline:none;border-color:var(--todo)}.prompt-override-footer{display:flex;align-items:center;gap:var(--space-md)}.prompt-override-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.prompt-override-header-actions{display:flex;align-items:center;gap:var(--space-xs)}.prompt-override-fullscreen-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:none;border:none;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.prompt-override-fullscreen-btn:hover{color:var(--text);background:var(--surface)}.prompt-override-fullscreen{position:fixed;inset:0;z-index:10000;background:var(--surface);padding:max(var(--space-lg),env(safe-area-inset-top,0px)) max(var(--space-lg),env(safe-area-inset-right,0px)) max(var(--space-lg),env(safe-area-inset-bottom,0px)) max(var(--space-lg),env(safe-area-inset-left,0px));display:flex;flex-direction:column}.prompt-override-fullscreen-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-md);flex-shrink:0}.prompt-override-fullscreen-title{font-size:13px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:var(--space-sm)}.prompt-override-fullscreen-close{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:none;border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-muted);cursor:pointer;font-size:12px;transition:all var(--transition-fast)}.prompt-override-fullscreen-close:hover{color:var(--text);border-color:var(--text-muted)}.prompt-override-fullscreen-close:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.prompt-override-fullscreen textarea{flex:1;min-height:unset;resize:none;border-radius:var(--radius-md);font-size:14px;line-height:1.6}.prompt-template-fullscreen-pre{flex:1;font-family:var(--font-mono);font-size:13px;line-height:1.6;color:var(--text);white-space:pre-wrap;word-break:break-word;overflow-y:auto;padding:var(--space-md);background:var(--bg);border-radius:var(--radius-md);border:1px solid var(--border);margin:0}.prompt-override-fullscreen .prompt-override-footer{flex-shrink:0;padding-top:var(--space-sm)}.prompt-template-prompt-label-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-xs)}.prompt-template-prompt-label-row label{display:block}.prompt-template-fullscreen-btn{vertical-align:middle}.prompt-template-prompt-label-row .prompt-template-fullscreen-btn{margin-left:var(--space-xs)}@media(max-width:768px){.prompt-manager{padding:0 14px}.prompt-manager-tabs{flex-wrap:wrap}.prompt-manager-tab{flex:1;justify-content:center;min-width:calc(50% - var(--space-xs))}.prompt-role-assignment-row{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.prompt-role-select{width:100%}.prompt-template-editor-actions{flex-direction:column}.prompt-template-editor-actions .btn{width:100%}.prompt-override-fullscreen{padding:var(--space-md)}.prompt-override-fullscreen textarea{font-size:16px}}.new-task-modal .form-group small{display:block;margin-top:var(--space-sm);font-size:12px;color:var(--text-muted);line-height:1.4}.new-task-modal textarea{min-height:80px;transition:height .1s ease-out}.selected-deps{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--space-sm);padding:2px 0}.dep-chip{display:inline-flex;align-items:center;gap:var(--space-xs);padding:3px 8px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);font-size:12px;color:var(--text);font-family:var(--font-mono);max-width:100%}.dep-chip-remove{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:12px;line-height:1;padding:0;margin-left:2px;border-radius:50%;transition:background .1s,color .1s}.dep-chip-remove:hover{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.model-select-row{display:flex;align-items:center;gap:var(--space-md);margin-bottom:var(--space-md)}.model-select-row:last-child{margin-bottom:0}.model-select-label{width:70px;flex-shrink:0;font-size:13px;color:var(--text-muted);text-align:right}@media(max-width:768px){.model-select-row{flex-direction:column;align-items:stretch;gap:var(--space-xs)}.model-select-label{width:auto;text-align:left}}.onboarding-disclosure{display:flex;flex-direction:column;margin-top:var(--space-sm)}.onboarding-disclosure-trigger{display:flex;align-items:center;gap:var(--space-xs);background:none;border:none;color:var(--text-muted);font-size:var(--font-size-sm, 12px);cursor:pointer;padding:var(--space-xs) 0;transition:color var(--transition-fast);font-family:inherit}.onboarding-disclosure-trigger:hover{color:var(--text)}.onboarding-disclosure-trigger:focus-visible{outline:var(--focus-ring-strong);border-radius:var(--radius-sm)}.onboarding-disclosure-chevron{width:14px;height:14px;transition:transform var(--transition-fast);flex-shrink:0}.onboarding-disclosure-trigger[aria-expanded=true] .onboarding-disclosure-chevron{transform:rotate(90deg)}.onboarding-disclosure-content{padding:var(--space-sm) 0 var(--space-sm) calc(var(--space-sm) + var(--space-lg) - var(--space-xs));color:var(--text-muted);font-size:var(--font-size-sm, 12px);line-height:1.5;animation:onboarding-disclosure-enter var(--transition-fast) ease-out}@keyframes onboarding-disclosure-enter{0%{opacity:0;transform:translateY(calc(var(--space-xs) * -1))}to{opacity:1;transform:translateY(0)}}@media(max-width:768px){.onboarding-disclosure-trigger{min-height:calc(var(--space-lg) + var(--space-lg) + var(--space-xs));padding:var(--space-sm) 0}}@keyframes custom-provider-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.custom-providers-section .onboarding-disclosure-content{margin-top:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.custom-provider-list{display:flex;flex-direction:column;gap:var(--space-sm)}.custom-provider-item{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.custom-provider-item:hover{border-color:var(--text-dim)}.custom-provider-item-info{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.custom-provider-item-name{font-weight:600;color:var(--text)}.custom-provider-item-meta{color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-provider-item-actions{display:flex;gap:var(--space-xs);flex-shrink:0}.custom-provider-badge{display:inline-flex;align-items:center;padding:var(--space-xs);border-radius:var(--radius-pill);background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.custom-provider-empty{color:var(--text-muted);padding:var(--space-sm) 0}.custom-provider-add-btn{margin-top:var(--space-sm)}.custom-provider-form{padding:var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-top:var(--space-sm)}.custom-provider-form-row{margin-bottom:var(--space-sm)}.custom-provider-form-actions{display:flex;gap:var(--space-sm);margin-top:var(--space-md)}.custom-provider-form-error{display:flex;align-items:center;gap:var(--space-xs);color:var(--color-error);margin-top:var(--space-xs);background:color-mix(in srgb,var(--color-error) 10%,transparent);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm)}.custom-provider-item-edit-form{margin-top:var(--space-xs)}.spin{animation:custom-provider-spin calc(var(--transition-slow) * 4) linear infinite}@media(max-width:768px){.custom-provider-item{flex-direction:column;align-items:flex-start;gap:var(--space-xs)}.custom-provider-item-meta{max-width:100%}.custom-provider-form{padding:var(--space-sm)}.custom-provider-item-actions{align-self:flex-end;margin-top:var(--space-xs)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.settings-header-actions{display:flex;align-items:stretch;gap:var(--space-xs);margin-left:auto;margin-right:var(--space-sm)}.settings-header-actions>.settings-github-star-btn,.settings-header-actions>.btn{height:26px;box-sizing:border-box}@media(max-width:768px){.settings-header-actions>.btn-icon{min-height:26px;min-width:26px}}.settings-github-star-btn{display:inline-flex;align-items:stretch;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--card);color:var(--text);font-size:12px;font-weight:500;text-decoration:none;overflow:hidden;transition:border-color var(--transition-fast),background var(--transition-fast)}.settings-github-star-btn:hover{border-color:var(--text-muted);background:var(--card-hover)}.settings-github-star-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-color:var(--todo)}.settings-github-star-btn__action{display:inline-flex;align-items:center;gap:5px;padding:4px 10px}.settings-github-star-btn__count{display:inline-flex;align-items:center;padding:4px 9px;border-left:var(--btn-border-width) solid var(--border);background:color-mix(in srgb,var(--surface) 60%,var(--card));color:var(--text-muted);font-variant-numeric:tabular-nums}.settings-modal{width:min(95vw,1100px);max-width:95vw;min-width:520px;height:80vh;min-height:480px;max-height:calc(100dvh - var(--overlay-padding-top, 10vh) - 16px);overflow:hidden;resize:both}@media(max-width:768px){.modal-overlay:has(.settings-modal){padding-top:0;align-items:stretch;justify-content:stretch}.modal.settings-modal{width:100vw;min-width:0;max-width:100vw;height:100dvh;min-height:0;max-height:100dvh;margin:0;border:none;border-radius:0;resize:none}}.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-update-check{display:flex;align-items:center;gap:var(--space-sm)}.settings-version-check-btn{--settings-inline-touch-target: calc(var(--space-lg) + var(--space-lg) + var(--space-xs));display:inline-flex;align-items:center;gap:var(--space-xs);margin:0;min-height:var(--settings-inline-touch-target);padding:var(--space-xs) var(--space-sm);border:none;background:transparent;color:var(--text-muted);cursor:pointer;transition:opacity var(--transition-fast),box-shadow var(--transition-fast)}.settings-version-check-btn:hover:not(:disabled){opacity:.85}.settings-version-check-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.settings-version-check-btn:disabled{cursor:default;opacity:.7}.settings-version-check-btn svg{color:var(--text-muted)}.settings-version-check-btn svg.spinning{animation:settings-update-spin 1s linear infinite}.settings-update-result{font-size:.85rem;font-weight:500}.settings-update-result--up-to-date{color:var(--color-success)}.settings-update-result--available{color:var(--color-info)}.settings-update-result--error{color:var(--text-muted)}.settings-update-result-link{color:var(--color-info);text-decoration:underline;transition:color var(--transition-fast),box-shadow var(--transition-fast)}.settings-update-result-link:hover{color:color-mix(in srgb,var(--color-info) 80%,var(--text))}.settings-update-result-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}@keyframes settings-update-spin{to{transform:rotate(360deg)}}.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-section-description{margin:0;padding:0 var(--space-xl);margin-bottom:var(--space-sm);color:var(--text-muted);font-size:13px;line-height:1.5}.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: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-button-row{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-sm)}.settings-raw-output{margin:var(--space-sm) 0 0;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);max-height:calc(var(--space-2xl) * 7);overflow:auto;font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs))}.settings-url-output{display:block;margin-top:var(--space-xs);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));overflow-wrap:anywhere;word-break:break-word;overflow-x:auto;max-width:100%}.settings-qr-preview{margin-top:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.settings-qr-preview-label{margin:0;font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.settings-qr-preview-image-wrap{width:fit-content;max-width:100%;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--card)}.settings-qr-preview-image{display:block;width:min(calc(var(--space-2xl) * 6),100%);height:auto;aspect-ratio:1 / 1}.remote-provider-selector{display:flex;gap:var(--space-xs);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-xs);background:var(--surface)}.remote-provider-option{position:relative;flex:1;cursor:pointer}.remote-provider-option input{position:absolute;opacity:0;width:0;height:0}.remote-provider-option span{display:block;padding:var(--space-sm) var(--space-md);text-align:center;border-radius:var(--radius-sm);border:var(--btn-border-width) solid transparent;color:var(--text-muted);transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.remote-provider-option input:checked+span{background:var(--card);color:var(--text);border-color:var(--border)}.remote-provider-option input:focus-visible+span{box-shadow:var(--focus-ring-strong)}.remote-status-bar{--status-color: var(--text-muted);display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-md);margin:0 var(--space-xl) var(--space-md);background:color-mix(in srgb,var(--status-color) 10%,transparent)}.remote-status-bar--running{--status-color: var(--color-success)}.remote-status-bar--starting{--status-color: var(--color-warning)}.remote-status-bar--error{--status-color: var(--color-error)}.remote-status-bar--stopped{--status-color: var(--text-muted)}.remote-share-block{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--text-muted) 5%,transparent)}.remote-share-row{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-share-row .settings-qr-preview-image{margin-top:var(--space-xs)}.remote-status-dot{width:var(--space-sm);height:var(--space-sm);border-radius:50%;display:inline-block;flex-shrink:0}.remote-status-dot--running{background:var(--color-success)}.remote-status-dot--starting{background:var(--color-warning)}.remote-status-dot--error{background:var(--color-error)}.remote-status-dot--stopped{background:var(--text-muted)}.remote-status-url{margin-left:auto;font-family:var(--font-mono);overflow-wrap:anywhere;word-break:break-word;user-select:all}.remote-provider-settings{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-cli-detection{display:flex;align-items:flex-start;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm)}.remote-cli-detection--available{background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success)}.remote-cli-detection--missing{background:color-mix(in srgb,var(--color-warning) 10%,transparent);color:var(--color-warning)}.remote-cli-detection-content{display:flex;flex-direction:column;gap:var(--space-xs);color:var(--text)}.remote-cli-detection .btn{align-self:flex-start}.remote-cli-install-error{color:var(--color-error)}.remote-cli-manual{color:var(--text-dim)}.remote-external-tunnel-panel{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--color-info) 10%,transparent)}.remote-external-tunnel-header{display:flex;align-items:center;gap:var(--space-sm);color:var(--color-info)}.remote-external-tunnel-qr{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-external-tunnel-actions{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-advanced-details{margin:var(--space-lg) var(--space-xl) 0;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);background:var(--surface)}.remote-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.remote-advanced-details>summary::-webkit-details-marker{display:none}.remote-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-advanced-details[open]>summary:before{content:"▾"}.settings-option-details{margin-top:var(--space-xs)}.settings-option-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.settings-option-details>summary::-webkit-details-marker{display:none}.settings-option-details>summary:before{content:"▸";margin-right:var(--space-xs)}.settings-option-details[open]>summary:before{content:"▾"}.remote-cf-advanced-details{margin-top:var(--space-xs)}.remote-cf-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.remote-cf-advanced-details>summary::-webkit-details-marker{display:none}.remote-cf-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-cf-advanced-details[open]>summary:before{content:"▾"}.remote-cf-advanced-fields{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm)}.remote-tunnel-actions{margin-top:var(--space-md)}.remote-tunnel-actions .btn{width:100%}.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))}.remote-provider-selector{flex-direction:column}.remote-status-bar{flex-wrap:wrap}.remote-status-url{width:100%;margin-left:0;font-size:.8em}.remote-provider-option,.remote-tunnel-actions .btn{min-height:36px}.remote-cli-detection,.remote-external-tunnel-panel{margin:0 var(--space-lg) 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)}.settings-inline-link{color:var(--todo);text-decoration:none;transition:text-decoration var(--transition-fast)}.settings-inline-link:hover{text-decoration:underline}.settings-inline-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.notification-provider-card{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-lg);background:var(--surface);margin:0 var(--space-xl) var(--space-lg);overflow:hidden}.notification-provider-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border)}.notification-provider-body{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.notification-provider-actions{display:flex;gap:var(--space-sm);padding-top:var(--space-md);border-top:var(--btn-border-width) solid var(--border);margin-top:var(--space-md)}.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-panel-body{padding-inline:var(--space-md)}.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:10px}.auth-group-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted);margin-bottom:4px;padding:0 4px}.auth-provider-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:4px;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:8px 12px;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-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);padding-inline:var(--space-xl);margin-block:0 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}.notification-provider-card{margin:0 var(--space-lg) var(--space-md)}.notification-provider-header{padding:var(--space-sm) var(--space-md)}.notification-provider-body{padding:var(--space-md)}.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)}.settings-node-routing-note{padding:var(--space-sm) var(--space-md);font-size:12px}}.settings-node-routing-note{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md) var(--space-lg);margin-top:var(--space-sm);color:var(--text-muted);font-size:13px;line-height:1.5}.settings-node-status{display:inline-flex;align-items:center;gap:var(--space-xs);margin-top:var(--space-sm);font-size:12px;color:var(--text-muted)}.auth-advanced-disclosure{margin-top:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.auth-advanced-disclosure>summary{cursor:pointer;padding:var(--space-sm) var(--space-md)}.auth-advanced-content{display:flex;flex-direction:column;gap:var(--space-sm);padding:0 var(--space-md) var(--space-md)}.auth-custom-provider-item{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm)}.auth-custom-provider-actions{display:flex;gap:var(--space-sm)}@media(max-width:768px){.auth-custom-provider-item{flex-direction:column;align-items:flex-start}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./vendor-react-K0fH_qHe.js";import{
|
|
1
|
+
import{r as e}from"./vendor-react-K0fH_qHe.js";import{d6 as C}from"./index-DyXZm9QN.js";function L(k={}){const{projectId:d,pollInterval:b=6e4,autoRefresh:p=!1,enabled:t=!0}=k,[S,o]=e.useState(null),[m,l]=e.useState(t),[E,c]=e.useState(null),[R,v]=e.useState(null),r=e.useRef(null),n=e.useRef(null),a=e.useRef(!0),s=e.useCallback(async()=>{if(!t){l(!1),c(null),o(null);return}r.current&&r.current.abort(),r.current=new AbortController,l(!0),c(null),o(null);try{const u=await C(d);if(!a.current)return;o(u),c(null),v(new Date),l(!1)}catch(u){if(u instanceof Error&&u.name==="AbortError"||!a.current)return;const A=u instanceof Error?u.message:"Failed to fetch memory backend status";c(A),l(!1)}},[t,d]);e.useEffect(()=>(a.current=!0,t?(s(),()=>{a.current=!1}):(r.current&&r.current.abort(),o(null),c(null),l(!1),()=>{a.current=!1})),[t,s]),e.useEffect(()=>{if(!(!t||!p))return n.current=setInterval(()=>{s()},b),()=>{n.current&&(clearInterval(n.current),n.current=null)}},[t,p,b,s]),e.useEffect(()=>()=>{a.current=!1,r.current&&r.current.abort(),n.current&&(clearInterval(n.current),n.current=null)},[]);const h=e.useCallback(()=>s(),[s]),f=m?null:S,B=f?.currentBackend??null,i=f?.capabilities??null,y=f?.availableBackends??[],I=i?.readable??!1,g=i?.writable??!1,w=i?.supportsAtomicWrite??!1;return{status:f,currentBackend:B,capabilities:i,availableBackends:y,isReadable:I,isWritable:g,supportsAtomicWrite:w,loading:m,error:E,lastUpdated:R,refresh:h}}export{L as u};
|