@nivora/matrix 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +5 -7
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/react-loadable-manifest.json +6 -6
  6. package/.next/routes-manifest.json +0 -12
  7. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/_global-error.html +2 -2
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/_not-found.html +1 -1
  18. package/.next/server/app/_not-found.rsc +3 -3
  19. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  20. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  22. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  23. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  25. package/.next/server/app/matrix/page.js +1 -1
  26. package/.next/server/app/matrix/page.js.nft.json +1 -1
  27. package/.next/server/app/matrix/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/page.js +2 -2
  29. package/.next/server/app/page.js.nft.json +1 -1
  30. package/.next/server/app/page_client-reference-manifest.js +1 -1
  31. package/.next/server/app/releases/[id]/page.js +15 -15
  32. package/.next/server/app/releases/[id]/page.js.nft.json +1 -1
  33. package/.next/server/app/releases/[id]/page_client-reference-manifest.js +1 -1
  34. package/.next/server/app/releases/page.js +2 -2
  35. package/.next/server/app/releases/page.js.nft.json +1 -1
  36. package/.next/server/app/releases/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/specs/[id]/page.js +2 -2
  38. package/.next/server/app/specs/[id]/page.js.nft.json +1 -1
  39. package/.next/server/app/specs/[id]/page_client-reference-manifest.js +1 -1
  40. package/.next/server/app/traceability/fs/[id]/page.js +6 -9
  41. package/.next/server/app/traceability/fs/[id]/page.js.nft.json +1 -1
  42. package/.next/server/app/traceability/fs/[id]/page_client-reference-manifest.js +1 -1
  43. package/.next/server/app/traceability/fs/page.js +1 -1
  44. package/.next/server/app/traceability/fs/page.js.nft.json +1 -1
  45. package/.next/server/app/traceability/fs/page_client-reference-manifest.js +1 -1
  46. package/.next/server/app/traceability/page.js +1 -1
  47. package/.next/server/app/traceability/page.js.nft.json +1 -1
  48. package/.next/server/app/traceability/page_client-reference-manifest.js +1 -1
  49. package/.next/server/app/traceability/risk/[id]/page.js +2 -2
  50. package/.next/server/app/traceability/risk/[id]/page.js.nft.json +1 -1
  51. package/.next/server/app/traceability/risk/[id]/page_client-reference-manifest.js +1 -1
  52. package/.next/server/app/traceability/risk/page.js +1 -1
  53. package/.next/server/app/traceability/risk/page.js.nft.json +1 -1
  54. package/.next/server/app/traceability/risk/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/traceability/urs/[id]/page.js +2 -2
  56. package/.next/server/app/traceability/urs/[id]/page.js.nft.json +1 -1
  57. package/.next/server/app/traceability/urs/[id]/page_client-reference-manifest.js +1 -1
  58. package/.next/server/app/traceability/urs/page.js +1 -1
  59. package/.next/server/app/traceability/urs/page.js.nft.json +1 -1
  60. package/.next/server/app/traceability/urs/page_client-reference-manifest.js +1 -1
  61. package/.next/server/app-paths-manifest.json +5 -7
  62. package/.next/server/chunks/319.js +1 -0
  63. package/.next/server/chunks/380.js +34 -0
  64. package/.next/server/chunks/436.js +1 -0
  65. package/.next/server/chunks/907.js +15 -2
  66. package/.next/server/middleware-build-manifest.js +1 -1
  67. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  68. package/.next/server/pages/404.html +1 -1
  69. package/.next/server/pages/500.html +2 -2
  70. package/.next/server/server-reference-manifest.js +1 -1
  71. package/.next/server/server-reference-manifest.json +1 -1
  72. package/.next/server/webpack-runtime.js +1 -1
  73. package/.next/static/QPWuIT4FeeRwrS3bLnzre/_buildManifest.js +1 -0
  74. package/.next/static/chunks/380-c762c0baf4d67207.js +1 -0
  75. package/.next/static/chunks/570.8b785c606c1c3e1f.js +1 -0
  76. package/.next/static/chunks/app/page-b6683055d30b04b4.js +1 -0
  77. package/.next/static/chunks/app/releases/[id]/page-be59421859a7c508.js +1 -0
  78. package/.next/static/chunks/app/releases/page-0ca79b1088cf1b55.js +1 -0
  79. package/.next/static/chunks/app/specs/[id]/page-f15341db02cda8af.js +1 -0
  80. package/.next/static/chunks/app/traceability/fs/[id]/page-f67370f7ed255df0.js +7 -0
  81. package/.next/static/chunks/app/traceability/fs/page-b6683055d30b04b4.js +1 -0
  82. package/.next/static/chunks/app/traceability/risk/[id]/page-5a5ae8b4036cafb9.js +1 -0
  83. package/.next/static/chunks/app/traceability/risk/page-b6683055d30b04b4.js +1 -0
  84. package/.next/static/chunks/app/traceability/urs/[id]/page-de9a44273b59c34a.js +1 -0
  85. package/.next/static/chunks/app/traceability/urs/page-b6683055d30b04b4.js +1 -0
  86. package/.next/static/chunks/webpack-eb94d6a492c4bd35.js +1 -0
  87. package/.next/static/css/{230ac595a7268d78.css → 1ffbba476b848e1a.css} +1 -1
  88. package/README.md +5 -5
  89. package/bin/cli.js +50 -9
  90. package/package.json +1 -1
  91. package/.next/server/app/builder/page.js +0 -11
  92. package/.next/server/app/builder/page.js.nft.json +0 -1
  93. package/.next/server/app/builder/page_client-reference-manifest.js +0 -1
  94. package/.next/server/app/guide/page.js +0 -2
  95. package/.next/server/app/guide/page.js.nft.json +0 -1
  96. package/.next/server/app/guide/page_client-reference-manifest.js +0 -1
  97. package/.next/server/chunks/138.js +0 -1
  98. package/.next/server/chunks/829.js +0 -34
  99. package/.next/server/chunks/941.js +0 -14
  100. package/.next/static/_plXSl3JsnaL0Y8LiiDGM/_buildManifest.js +0 -1
  101. package/.next/static/chunks/411.1639aedf51af4bc4.js +0 -1
  102. package/.next/static/chunks/app/builder/page-98dfb8ccb235f9a8.js +0 -10
  103. package/.next/static/chunks/app/guide/page-f227601c12abd1f8.js +0 -1
  104. package/.next/static/chunks/app/page-f227601c12abd1f8.js +0 -1
  105. package/.next/static/chunks/app/releases/[id]/page-4c326d62508877ef.js +0 -1
  106. package/.next/static/chunks/app/releases/page-0060204f72b7307f.js +0 -1
  107. package/.next/static/chunks/app/specs/[id]/page-8bdf217e9957a247.js +0 -1
  108. package/.next/static/chunks/app/traceability/fs/[id]/page-c89eac470b12216d.js +0 -10
  109. package/.next/static/chunks/app/traceability/fs/page-f227601c12abd1f8.js +0 -1
  110. package/.next/static/chunks/app/traceability/risk/[id]/page-76d6b1fd318e7d5e.js +0 -1
  111. package/.next/static/chunks/app/traceability/risk/page-f227601c12abd1f8.js +0 -1
  112. package/.next/static/chunks/app/traceability/urs/[id]/page-ccb0c3574010d771.js +0 -1
  113. package/.next/static/chunks/app/traceability/urs/page-f227601c12abd1f8.js +0 -1
  114. package/.next/static/chunks/webpack-e1b658b93e085428.js +0 -1
  115. /package/.next/static/{_plXSl3JsnaL0Y8LiiDGM → QPWuIT4FeeRwrS3bLnzre}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[41],{3211:(e,t,r)=>{"use strict";r.d(t,{ReleaseDetailClient:()=>h});var s=r(5155),i=r(2115),a=r(8500),l=r.n(a),n=r(9339);let o=(0,n.createServerReference)("60db213a74892118dee97ca3e1f99302f215efb0a6",n.callServer,void 0,n.findSourceMapURL,"updateReleaseAction"),d=(0,n.createServerReference)("607ee02e827c1f90fd6e16d82ad4ed791a993f8ad6",n.callServer,void 0,n.findSourceMapURL,"tagFSToReleaseAction"),c=(0,n.createServerReference)("605cad28f4d3e4362f7705ca65005d59bf2ecf48aa",n.callServer,void 0,n.findSourceMapURL,"untagFSFromReleaseAction"),m=(0,n.createServerReference)("40a9123eb7ade8ffc81646c9ba74b22f0b8bf682f9",n.callServer,void 0,n.findSourceMapURL,"createDefectAction");function h({release:e,taggedFS:t,availableFS:r,testRuns:a,defects:n}){let[h,p]=(0,i.useState)(!1),[x,g]=(0,i.useState)(!1),[v,u]=(0,i.useState)([]),[y,f]=(0,i.useState)(null),[j,b]=(0,i.useState)({isOpen:!1}),[S,N]=(0,i.useState)({title:"",description:"",status:"open"}),[C,k]=(0,i.useState)({titleError:!1,descriptionError:!1}),[R,w]=(0,i.useTransition)(),[B,W]=(0,i.useState)({version:e.version,name:e.name,status:e.status,notes:e.notes||""}),_={planning:{bg:"rgba(168, 85, 247, 0.1)",color:"#a855f7"},testing:{bg:"rgba(59, 130, 246, 0.1)",color:"#3b82f6"},released:{bg:"rgba(34, 197, 94, 0.1)",color:"#22c55e"}}[e.status];return(0,s.jsxs)("div",{style:{maxWidth:"1200px",margin:"0 auto",padding:"2rem"},children:[(0,s.jsx)("div",{style:{marginBottom:"1.5rem"},children:(0,s.jsx)(l(),{href:"/releases",style:{color:"var(--text-secondary)",textDecoration:"none"},children:"← Back to Releases"})}),(0,s.jsxs)("header",{style:{marginBottom:"2rem"},children:[(0,s.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"1rem",marginBottom:"0.5rem"},children:[(0,s.jsxs)("code",{style:{fontSize:"1.5rem",fontWeight:700,color:_.color},children:[" ",e.id," "]}),(0,s.jsxs)("span",{style:{fontSize:"1.25rem",fontWeight:600},children:["v",e.version]}),(0,s.jsx)("span",{className:"badge",style:{background:_.bg,color:_.color,padding:"0.5rem 1rem"},children:e.status}),(0,s.jsx)("button",{onClick:()=>p(!h),className:"btn btn-primary",style:{marginLeft:"auto"},children:h?"Cancel":"✏️ Edit"})]}),(0,s.jsx)("h1",{style:{fontSize:"2rem",fontWeight:700},children:e.name}),(0,s.jsxs)("p",{style:{color:"var(--text-secondary)"},children:["Created ",e.created_at,e.released_at&&` • Released ${e.released_at}`]})]}),h&&(0,s.jsxs)("div",{className:"card",style:{marginBottom:"1.5rem"},children:[(0,s.jsx)("h2",{className:"card-title",children:"Edit Release"}),(0,s.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 2fr 1fr",gap:"1rem",marginBottom:"1rem"},children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("label",{style:{display:"block",fontWeight:500,marginBottom:"0.5rem"},children:"Version"}),(0,s.jsx)("input",{type:"text",value:B.version,onChange:e=>W({...B,version:e.target.value}),className:"input"})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("label",{style:{display:"block",fontWeight:500,marginBottom:"0.5rem"},children:"Name"}),(0,s.jsx)("input",{type:"text",value:B.name,onChange:e=>W({...B,name:e.target.value}),className:"input"})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("label",{style:{display:"block",fontWeight:500,marginBottom:"0.5rem"},children:"Status"}),(0,s.jsxs)("select",{value:B.status,onChange:e=>W({...B,status:e.target.value}),className:"input",children:[(0,s.jsx)("option",{value:"planning",children:"Planning"}),(0,s.jsx)("option",{value:"testing",children:"Testing"}),(0,s.jsx)("option",{value:"released",children:"Released"})]})]})]}),(0,s.jsxs)("div",{style:{marginBottom:"1rem"},children:[(0,s.jsx)("label",{style:{display:"block",fontWeight:500,marginBottom:"0.5rem"},children:"Notes"}),(0,s.jsx)("textarea",{value:B.notes,onChange:e=>W({...B,notes:e.target.value}),rows:3,className:"input",style:{resize:"vertical"}})]}),(0,s.jsx)("button",{onClick:()=>{w(async()=>{await o(e.id,B),p(!1)})},className:"btn btn-primary",disabled:R,children:R?"Saving...":"Save Changes"})]}),e.notes&&!h&&(0,s.jsxs)("div",{className:"card",style:{marginBottom:"1.5rem"},children:[(0,s.jsx)("h2",{className:"card-title",children:"\uD83D\uDCDD Notes"}),(0,s.jsx)("p",{style:{color:"var(--text-secondary)",whiteSpace:"pre-wrap"},children:e.notes})]}),(0,s.jsxs)("div",{className:"card",style:{marginBottom:"1.5rem",borderLeft:"4px solid var(--error)"},children:[(0,s.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"1rem"},children:[(0,s.jsxs)("h2",{className:"card-title",children:["\uD83D\uDEA8 Defects & Deviations (",n.length,")"]}),(0,s.jsx)("button",{className:"btn",onClick:()=>{b({isOpen:!0,testResultId:void 0,fsId:void 0,scenarioName:void 0}),N({title:"",description:"",status:"open"})},children:"+ Log Defect"})]}),0===n.length?(0,s.jsx)("p",{style:{color:"var(--text-secondary)"},children:"No defects logged. Any failed tests must be resolved or logged as a defect."}):(0,s.jsx)("div",{style:{display:"grid",gap:"0.75rem"},children:n.map(e=>(0,s.jsxs)("div",{style:{padding:"1rem",background:"var(--bg-hover)",borderRadius:"8px",borderLeft:"open"===e.status?"3px solid red":"3px solid green"},children:[(0,s.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:"0.5rem"},children:[(0,s.jsxs)("div",{style:{fontWeight:600},children:[e.id,": ",e.title]}),(0,s.jsx)("div",{className:"badge",style:{background:"open"===e.status?"rgba(239, 68, 68, 0.1)":"rgba(34, 197, 94, 0.1)",color:"open"===e.status?"var(--error)":"var(--success)"},children:e.status.toUpperCase()})]}),(0,s.jsx)("div",{style:{fontSize:"0.875rem",color:"var(--text-secondary)",whiteSpace:"pre-wrap"},children:e.description}),e.test_result_id&&(0,s.jsxs)("div",{style:{marginTop:"0.5rem",fontSize:"0.75rem",color:"var(--warning)"},children:["Linked to failed test result #",e.test_result_id]})]},e.id))})]}),(0,s.jsxs)("div",{className:"card",style:{marginBottom:"1.5rem"},children:[(0,s.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"1rem"},children:[(0,s.jsxs)("h2",{className:"card-title",style:{margin:0},children:["⚙️ Features (",t.length,")"]}),(0,s.jsx)("button",{onClick:()=>g(!0),className:"btn",disabled:0===r.length,children:"+ Add Features"})]}),x&&(0,s.jsxs)("div",{style:{marginBottom:"1rem",padding:"1rem",background:"var(--bg-hover)",borderRadius:"8px"},children:[(0,s.jsx)("div",{style:{marginBottom:"0.5rem",fontWeight:500},children:"Select features to add:"}),(0,s.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.5rem",marginBottom:"1rem"},children:r.map(e=>(0,s.jsxs)("label",{style:{display:"flex",alignItems:"center",gap:"0.5rem",cursor:"pointer"},children:[(0,s.jsx)("input",{type:"checkbox",checked:v.includes(e.id),onChange:t=>{t.target.checked?u([...v,e.id]):u(v.filter(t=>t!==e.id))}}),(0,s.jsx)("code",{style:{color:"var(--warning)"},children:e.id}),(0,s.jsx)("span",{children:e.title})]},e.id))}),(0,s.jsxs)("div",{style:{display:"flex",gap:"0.5rem"},children:[(0,s.jsx)("button",{onClick:()=>{g(!1),u([])},className:"btn",children:"Cancel"}),(0,s.jsx)("button",{onClick:()=>{0!==v.length&&w(async()=>{await d(e.id,v),g(!1),u([])})},className:"btn btn-primary",disabled:R||0===v.length,children:R?"Adding...":`Add ${v.length} Feature${1!==v.length?"s":""}`})]})]}),0===t.length?(0,s.jsx)("p",{style:{color:"var(--text-secondary)"},children:"No features tagged yet. Add features to track them in this release."}):(0,s.jsx)("div",{style:{display:"grid",gap:"0.5rem"},children:t.map(t=>(0,s.jsxs)("div",{style:{display:"flex",alignItems:"center",padding:"0.75rem 1rem",background:"var(--bg-hover)",borderRadius:"8px"},children:[(0,s.jsxs)(l(),{href:`/specs/${t.id}`,style:{flex:1,textDecoration:"none"},children:[(0,s.jsx)("code",{style:{fontWeight:600,color:"var(--warning)",marginRight:"0.75rem"},children:t.id}),(0,s.jsx)("span",{style:{color:"var(--text-primary)"},children:t.title}),(0,s.jsxs)("span",{style:{marginLeft:"0.75rem",color:"var(--text-secondary)",fontSize:"0.875rem"},children:[t.scenario_count," scenarios"]})]}),(0,s.jsx)("button",{onClick:()=>{var r;return r=t.id,void w(async()=>{await c(e.id,r)})},className:"btn",style:{padding:"0.25rem 0.5rem",fontSize:"0.75rem"},disabled:R,children:"\xd7"})]},t.id))})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsxs)("h2",{className:"card-title",children:["\uD83E\uDDEA Test Runs (",a.length,")"]}),0===a.length?(0,s.jsxs)("p",{style:{color:"var(--text-secondary)"},children:["No test runs yet. Import Cucumber results: ",(0,s.jsxs)("code",{children:["matrix release import-results results.json -r ",e.id]})]}):(0,s.jsx)("div",{style:{display:"grid",gap:"0.75rem"},children:a.map(e=>{let t=e.total>0?e.passed/e.total*100:0,r=y===e.id;return(0,s.jsxs)("div",{style:{padding:"1rem",background:"var(--bg-hover)",borderRadius:"8px"},children:[(0,s.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",cursor:"pointer"},onClick:()=>f(r?null:e.id),children:[(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{style:{fontWeight:600,marginBottom:"0.25rem"},children:[e.failed>0?"❌":"✅"," Run #",e.id," ",r?"\uD83D\uDD3D":"▶"]}),(0,s.jsxs)("div",{style:{fontSize:"0.875rem",color:"var(--text-secondary)"},children:[e.run_date," • ",e.source]})]}),(0,s.jsxs)("div",{style:{display:"flex",gap:"1rem",textAlign:"center"},children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{fontWeight:700,color:"var(--success)"},children:e.passed}),(0,s.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)"},children:"Passed"})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{fontWeight:700,color:"var(--error)"},children:e.failed}),(0,s.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)"},children:"Failed"})]}),(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{style:{fontWeight:700,color:100===t?"var(--success)":t>=80?"var(--warning)":"var(--error)"},children:[t.toFixed(0),"%"]}),(0,s.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)"},children:"Pass Rate"})]})]})]}),r&&(0,s.jsx)("div",{style:{marginTop:"1rem",paddingTop:"1rem",borderTop:"1px solid var(--border)"},children:(0,s.jsx)("p",{style:{fontStyle:"italic",color:"var(--text-secondary)"},children:"Detailed results view would go here. For now, check the console logs or database for failure details."})})]},e.id)})})]}),j.isOpen&&(0,s.jsx)("div",{style:{position:"fixed",top:0,left:0,right:0,bottom:0,background:"rgba(0,0,0,0.5)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:100},children:(0,s.jsxs)("div",{className:"card",style:{width:"500px",maxWidth:"90%"},children:[(0,s.jsx)("h2",{className:"card-title",children:"Log Defect / Deviation"}),(0,s.jsxs)("div",{style:{marginBottom:"1rem"},children:[(0,s.jsxs)("label",{style:{display:"block",marginBottom:"0.5rem"},children:["Title ",(0,s.jsx)("span",{style:{color:"var(--error)"},children:"*"})]}),(0,s.jsx)("input",{className:"input",value:S.title,onChange:e=>{N({...S,title:e.target.value}),e.target.value&&k(e=>({...e,titleError:!1}))},placeholder:"Defect summary",style:C.titleError?{borderColor:"var(--error)",boxShadow:"0 0 0 2px rgba(239, 68, 68, 0.2)"}:{}}),C.titleError&&(0,s.jsx)("div",{style:{color:"var(--error)",fontSize:"0.75rem",marginTop:"0.25rem"},children:"Title is required"})]}),(0,s.jsxs)("div",{style:{marginBottom:"1rem"},children:[(0,s.jsxs)("label",{style:{display:"block",marginBottom:"0.5rem"},children:["Description & Root Cause ",(0,s.jsx)("span",{style:{color:"var(--error)"},children:"*"})]}),(0,s.jsx)("textarea",{className:"input",rows:5,value:S.description,onChange:e=>{N({...S,description:e.target.value}),e.target.value&&k(e=>({...e,descriptionError:!1}))},placeholder:"Describe the failure, root cause, and why it is acceptable (if deviating) or mitigation plan.",style:C.descriptionError?{borderColor:"var(--error)",boxShadow:"0 0 0 2px rgba(239, 68, 68, 0.2)"}:{}}),C.descriptionError&&(0,s.jsx)("div",{style:{color:"var(--error)",fontSize:"0.75rem",marginTop:"0.25rem"},children:"Description is required"})]}),(0,s.jsxs)("div",{style:{marginBottom:"1rem"},children:[(0,s.jsx)("label",{style:{display:"block",marginBottom:"0.5rem"},children:"Status"}),(0,s.jsxs)("select",{className:"input",value:S.status,onChange:e=>N({...S,status:e.target.value}),children:[(0,s.jsx)("option",{value:"open",children:"Open (Needs Fix)"}),(0,s.jsx)("option",{value:"resolved",children:"Resolved (Fixed)"}),(0,s.jsx)("option",{value:"accepted",children:"Accepted (Permanent Deviation)"})]})]}),(0,s.jsxs)("div",{style:{display:"flex",gap:"0.5rem",justifyContent:"flex-end"},children:[(0,s.jsx)("button",{className:"btn",onClick:()=>{b({isOpen:!1}),k({titleError:!1,descriptionError:!1})},children:"Cancel"}),(0,s.jsx)("button",{className:"btn btn-primary",onClick:()=>{let t=!S.title.trim(),r=!S.description.trim();t||r?k({titleError:t,descriptionError:r}):w(async()=>{try{await m({releaseId:e.id,testResultId:j.testResultId,title:S.title,description:S.description,status:S.status}),b({isOpen:!1}),N({title:"",description:"",status:"open"})}catch(e){console.error("Failed to create defect:",e),alert("Failed to create defect. Check console for details.")}})},disabled:R,children:R?"Logging...":"Log Defect"})]})]})})]})}},4926:(e,t,r)=>{Promise.resolve().then(r.bind(r,3211))},9339:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s={callServer:function(){return a.callServer},createServerReference:function(){return n.createServerReference},findSourceMapURL:function(){return l.findSourceMapURL}};for(var i in s)Object.defineProperty(t,i,{enumerable:!0,get:s[i]});let a=r(7304),l=r(4060),n=r(7197)}},e=>{e.O(0,[500,441,794,358],()=>e(e.s=4926)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[549],{630:(e,r,t)=>{"use strict";t.d(r,{ReleasesClient:()=>d});var s=t(5155),a=t(2115),n=t(8500),i=t.n(n),o=t(9339);let l=(0,o.createServerReference)("40f54499580863104cf245a1e0e12b6db5d54feb57",o.callServer,void 0,o.findSourceMapURL,"createReleaseAction");function d({releases:e}){let[r,t]=(0,a.useState)(!1),[n,i]=(0,a.useState)(""),[o,d]=(0,a.useState)(""),[m,x]=(0,a.useState)(""),[g,h]=(0,a.useTransition)();return(0,s.jsxs)("div",{style:{maxWidth:"1200px",margin:"0 auto",padding:"2rem"},children:[(0,s.jsx)("header",{style:{marginBottom:"2rem"},children:(0,s.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h1",{style:{fontSize:"2rem",fontWeight:700,marginBottom:"0.5rem"},children:"\uD83D\uDCE6 Releases"}),(0,s.jsx)("p",{style:{color:"var(--text-secondary)"},children:"Manage releases, track test execution, and compare changes"})]}),(0,s.jsx)("button",{onClick:()=>t(!0),className:"btn btn-primary",children:"+ New Release"})]})}),r&&(0,s.jsxs)("div",{className:"card",style:{marginBottom:"1.5rem"},children:[(0,s.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"1.5rem",paddingBottom:"1rem",borderBottom:"1px solid var(--border)"},children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{style:{margin:0,fontSize:"1.25rem",fontWeight:600},children:"\uD83D\uDCE6 New Release"}),(0,s.jsx)("p",{style:{margin:"0.25rem 0 0",color:"var(--text-secondary)",fontSize:"0.875rem"},children:"Create a new release to track features and test results"})]}),(0,s.jsxs)("div",{style:{display:"flex",gap:"0.75rem"},children:[(0,s.jsx)("button",{onClick:()=>t(!1),disabled:g,style:{padding:"0.75rem 1.5rem",background:"transparent",border:"1px solid var(--border)",borderRadius:"10px",color:"var(--text-secondary)",cursor:"pointer",fontWeight:600},children:"Cancel"}),(0,s.jsx)("button",{onClick:()=>{h(async()=>{await l({version:n,name:o,notes:m||void 0}),t(!1),i(""),d(""),x("")})},disabled:g||!n||!o,style:{padding:"0.75rem 1.5rem",fontSize:"0.9375rem",fontWeight:600,borderRadius:"10px",border:"none",cursor:!g&&n&&o?"pointer":"not-allowed",background:!g&&n&&o?"linear-gradient(135deg, var(--gradient-start), var(--gradient-end))":"var(--bg-hover)",color:!g&&n&&o?"white":"var(--text-secondary)",boxShadow:!g&&n&&o?"0 4px 12px rgba(99, 102, 241, 0.25)":"none"},children:g?"\uD83D\uDCBE Creating...":"\uD83D\uDCBE Create Release"})]})]}),(0,s.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"200px 1fr",gap:"1.5rem",marginBottom:"1.5rem"},children:[(0,s.jsxs)("div",{children:[(0,s.jsxs)("label",{style:{display:"block",fontWeight:500,fontSize:"0.875rem",marginBottom:"0.5rem",color:"var(--text-primary)"},children:["Version ",(0,s.jsx)("span",{style:{color:"var(--accent)",fontSize:"0.75rem"},children:"Required"})]}),(0,s.jsx)("input",{type:"text",value:n,onChange:e=>i(e.target.value),placeholder:"e.g., 1.0.0",style:{width:"100%",padding:"0.875rem 1rem",fontSize:"0.9375rem",background:"var(--bg-secondary)",border:"1px solid var(--border)",borderRadius:"10px",color:"var(--text-primary)",outline:"none"}})]}),(0,s.jsxs)("div",{children:[(0,s.jsxs)("label",{style:{display:"block",fontWeight:500,fontSize:"0.875rem",marginBottom:"0.5rem",color:"var(--text-primary)"},children:["Name ",(0,s.jsx)("span",{style:{color:"var(--accent)",fontSize:"0.75rem"},children:"Required"})]}),(0,s.jsx)("input",{type:"text",value:o,onChange:e=>d(e.target.value),placeholder:"e.g., Initial Release, MVP, Feature Update",style:{width:"100%",padding:"0.875rem 1rem",fontSize:"0.9375rem",background:"var(--bg-secondary)",border:"1px solid var(--border)",borderRadius:"10px",color:"var(--text-primary)",outline:"none"}})]})]}),(0,s.jsxs)("div",{children:[(0,s.jsxs)("label",{style:{display:"block",fontWeight:500,fontSize:"0.875rem",marginBottom:"0.5rem",color:"var(--text-primary)"},children:["Release Notes ",(0,s.jsx)("span",{style:{color:"var(--text-secondary)",fontSize:"0.8125rem",fontWeight:400},children:"— optional"})]}),(0,s.jsx)("textarea",{value:m,onChange:e=>x(e.target.value),placeholder:"What's changing in this release...",rows:4,style:{width:"100%",padding:"0.875rem 1rem",fontSize:"0.9375rem",background:"var(--bg-secondary)",border:"1px solid var(--border)",borderRadius:"10px",color:"var(--text-primary)",outline:"none",resize:"vertical",fontFamily:"inherit"}})]})]}),0===e.length?(0,s.jsxs)("div",{className:"card",style:{textAlign:"center",padding:"3rem"},children:[(0,s.jsx)("p",{style:{fontSize:"3rem",marginBottom:"1rem"},children:"\uD83D\uDCE6"}),(0,s.jsx)("h2",{style:{marginBottom:"0.5rem"},children:"No Releases Yet"}),(0,s.jsx)("p",{style:{color:"var(--text-secondary)",marginBottom:"1rem"},children:"Create your first release to start tracking features and test results."}),(0,s.jsx)("button",{onClick:()=>t(!0),className:"btn btn-primary",children:"Create First Release"})]}):(0,s.jsx)("div",{style:{display:"grid",gap:"1rem"},children:e.map(e=>(0,s.jsx)(c,{release:e},e.id))})]})}function c({release:e}){let r={planning:{bg:"rgba(168, 85, 247, 0.1)",color:"#a855f7"},testing:{bg:"rgba(59, 130, 246, 0.1)",color:"#3b82f6"},released:{bg:"rgba(34, 197, 94, 0.1)",color:"#22c55e"}}[e.status];return(0,s.jsx)(i(),{href:`/releases/${e.id}`,style:{textDecoration:"none"},children:(0,s.jsx)("div",{className:"card",style:{borderLeft:`4px solid ${r.color}`,transition:"transform 0.15s, box-shadow 0.15s",cursor:"pointer"},children:(0,s.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"},children:[(0,s.jsxs)("div",{style:{flex:1},children:[(0,s.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem",marginBottom:"0.5rem"},children:[(0,s.jsx)("code",{style:{fontSize:"1.25rem",fontWeight:700,color:r.color},children:e.id}),(0,s.jsxs)("span",{style:{fontSize:"1rem",fontWeight:600,color:"var(--text-primary)"},children:["v",e.version]}),(0,s.jsx)("span",{className:"badge",style:{background:r.bg,color:r.color},children:e.status})]}),(0,s.jsx)("h3",{style:{fontSize:"1.125rem",fontWeight:600,marginBottom:"0.5rem",color:"var(--text-primary)"},children:e.name}),(0,s.jsxs)("p",{style:{fontSize:"0.875rem",color:"var(--text-secondary)"},children:["Created ",e.created_at,e.released_at&&` • Released ${e.released_at}`]})]}),(0,s.jsxs)("div",{style:{display:"flex",gap:"1.5rem",textAlign:"center"},children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{fontSize:"1.5rem",fontWeight:700,color:"var(--warning)"},children:e.fs_count}),(0,s.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)"},children:"Features"})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{fontSize:"1.5rem",fontWeight:700,color:"var(--accent)"},children:e.test_runs}),(0,s.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)"},children:"Test Runs"})]}),null!==e.latest_pass_rate&&(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{style:{fontSize:"1.5rem",fontWeight:700,color:100===e.latest_pass_rate?"var(--success)":e.latest_pass_rate>=80?"var(--warning)":"var(--error)"},children:[e.latest_pass_rate.toFixed(0),"%"]}),(0,s.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)"},children:"Pass Rate"})]})]})]})})})}},5411:(e,r,t)=>{Promise.resolve().then(t.bind(t,630))},9339:(e,r,t)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var s={callServer:function(){return n.callServer},createServerReference:function(){return o.createServerReference},findSourceMapURL:function(){return i.findSourceMapURL}};for(var a in s)Object.defineProperty(r,a,{enumerable:!0,get:s[a]});let n=t(7304),i=t(4060),o=t(7197)}},e=>{e.O(0,[500,441,794,358],()=>e(e.s=5411)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[385],{2320:(e,a,t)=>{"use strict";t.d(a,{RiskDetailClient:()=>d});var r=t(5155),i=t(2115),s=t(8500),l=t.n(s),n=t(9339);let c=(0,n.createServerReference)("60be4458380e3ba554886050e90ef8ba2acaa4aeda",n.callServer,void 0,n.findSourceMapURL,"updateRiskAction");function d({risk:e,linkedFS:a}){let[t,s]=(0,i.useState)(!1),[n,d]=(0,i.useTransition)(),[m,h]=(0,i.useState)({title:e.title,status:e.status,category:e.category,impact:e.impact,probability:e.probability,risk_level:e.risk_level,residual_risk:e.residual_risk}),u=e.title.includes("(Undefined)");return(0,r.jsxs)("div",{children:[(0,r.jsxs)("header",{className:"page-header",children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"1rem",marginBottom:"0.5rem",flexWrap:"wrap"},children:[(0,r.jsx)("code",{style:{fontSize:"1.5rem",fontWeight:700,color:"#f97316",background:"rgba(249, 115, 22, 0.1)",padding:"0.5rem 1rem",borderRadius:"8px"},children:e.id}),t?(0,r.jsx)(({value:e,onChange:a,options:i})=>t?(0,r.jsx)("select",{value:e,onChange:e=>a(e.target.value),className:"input",children:i.map(e=>(0,r.jsx)("option",{value:e.value,children:e.label},e.value))}):(0,r.jsx)("span",{style:{textTransform:"capitalize"},children:e}),{value:m.status,onChange:e=>h({...m,status:e}),options:[{value:"draft",label:"Draft"},{value:"review",label:"Review"},{value:"approved",label:"Approved"}]}):(0,r.jsx)("span",{className:`badge ${"approved"===e.status?"badge-success":"badge-warning"}`,children:m.status}),(0,r.jsx)(p,{level:m.risk_level}),u&&!t&&(0,r.jsx)("span",{className:"badge",style:{background:"rgba(239, 68, 68, 0.2)",color:"var(--error)"},children:"Needs Definition"}),(0,r.jsx)("div",{style:{marginLeft:"auto",display:"flex",gap:"0.5rem"},children:t?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("button",{onClick:()=>{h({title:e.title,status:e.status,category:e.category,impact:e.impact,probability:e.probability,risk_level:e.risk_level,residual_risk:e.residual_risk}),s(!1)},className:"btn",disabled:n,children:"Cancel"}),(0,r.jsx)("button",{onClick:()=>{d(async()=>{await c(e.id,m),s(!1)})},className:"btn btn-primary",disabled:n,children:n?"Saving...":"\uD83D\uDCBE Save"})]}):(0,r.jsx)("button",{onClick:()=>s(!0),className:"btn btn-primary",children:"✏️ Edit"})})]}),t?(0,r.jsx)("input",{type:"text",value:m.title,onChange:e=>h({...m,title:e.target.value}),className:"input",style:{fontSize:"1.5rem",fontWeight:700,width:"100%",marginBottom:"0.5rem"}}):(0,r.jsx)("h1",{className:"page-title",children:m.title}),(0,r.jsxs)("p",{className:"page-subtitle",children:["Risk Assessment • Category: ",t?(0,r.jsx)("input",{type:"text",value:m.category,onChange:e=>h({...m,category:e.target.value}),className:"input",style:{width:"200px",display:"inline-block"}}):m.category," • GAMP Category ",e.gamp_category]})]}),u&&!t&&(0,r.jsx)("div",{className:"card",style:{marginBottom:"1.5rem",background:"rgba(239, 68, 68, 0.1)",borderLeft:"4px solid var(--error)"},children:(0,r.jsxs)("p",{style:{margin:0,color:"var(--error)"},children:["⚠️ This Risk was auto-created from FS references. Click ",(0,r.jsx)("strong",{children:"Edit"})," to define its details."]})}),(0,r.jsx)("div",{className:"card",style:{marginBottom:"1.5rem"},children:(0,r.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, 1fr)",gap:"1rem"},children:[(0,r.jsx)(o,{label:"Impact",value:m.impact,isEditing:t,onChange:e=>h({...m,impact:e}),options:["low","medium","high","critical"]}),(0,r.jsx)(o,{label:"Probability",value:m.probability,isEditing:t,onChange:e=>h({...m,probability:e}),options:["low","medium","high"]}),(0,r.jsx)(o,{label:"Risk Level",value:m.risk_level,isEditing:t,onChange:e=>h({...m,risk_level:e}),options:["low","medium","high","critical"]}),(0,r.jsx)(o,{label:"Residual Risk",value:m.residual_risk,isEditing:t,onChange:e=>h({...m,residual_risk:e}),options:["acceptable","unacceptable","pending"]})]})}),(0,r.jsxs)("div",{className:"card",style:{marginBottom:"1.5rem"},children:[(0,r.jsx)("h2",{className:"card-title",children:"⚙️ Linked Functional Specifications"}),(0,r.jsx)("div",{style:{display:"flex",gap:"0.5rem",flexWrap:"wrap"},children:a.map(e=>(0,r.jsx)(l(),{href:`/specs/${e.id}`,children:(0,r.jsxs)("span",{className:"badge",style:{background:"rgba(245, 158, 11, 0.15)",color:"var(--warning)",padding:"0.5rem 1rem"},children:[e.id," - ",e.title]})},e.id))})]}),(0,r.jsxs)("div",{className:"card",style:{marginBottom:"1.5rem"},children:[(0,r.jsx)("h2",{className:"card-title",children:"\uD83D\uDD34 Identified Risks"}),0===e.risks.length?(0,r.jsx)("p",{style:{color:"var(--text-secondary)",fontStyle:"italic"},children:"No risks defined yet"}):(0,r.jsx)("div",{style:{display:"grid",gap:"0.5rem"},children:e.risks.map((e,a)=>(0,r.jsxs)("div",{style:{padding:"0.75rem 1rem",background:"var(--bg-hover)",borderRadius:"6px",display:"flex",alignItems:"center",gap:"1rem"},children:[(0,r.jsx)("code",{style:{fontWeight:600,color:"#f97316"},children:e.id}),(0,r.jsx)("span",{style:{flex:1,color:"var(--text-secondary)"},children:e.description}),(0,r.jsx)(p,{level:e.impact,small:!0})]},a))})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("h2",{className:"card-title",children:"\uD83D\uDEE1️ Mitigations"}),0===e.mitigations.length?(0,r.jsx)("p",{style:{color:"var(--text-secondary)",fontStyle:"italic"},children:"No mitigations defined yet"}):(0,r.jsxs)("table",{className:"table",children:[(0,r.jsx)("thead",{children:(0,r.jsxs)("tr",{children:[(0,r.jsx)("th",{children:"Risk"}),(0,r.jsx)("th",{children:"Control"}),(0,r.jsx)("th",{children:"Test"})]})}),(0,r.jsx)("tbody",{children:e.mitigations.map((e,a)=>(0,r.jsxs)("tr",{children:[(0,r.jsx)("td",{children:(0,r.jsx)("code",{children:e.risk_id})}),(0,r.jsx)("td",{children:e.control}),(0,r.jsx)("td",{style:{color:"var(--text-secondary)"},children:e.test})]},a))})]})]})]})}function o({label:e,value:a,isEditing:t,onChange:i,options:s}){let l=m(a);return(0,r.jsxs)("div",{style:{textAlign:"center",padding:"1rem",background:"var(--bg-hover)",borderRadius:"8px"},children:[(0,r.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)",marginBottom:"0.25rem"},children:e}),t?(0,r.jsx)("select",{value:a,onChange:e=>i(e.target.value),className:"input",style:{width:"100%",textAlign:"center"},children:s.map(e=>(0,r.jsx)("option",{value:e,style:{textTransform:"capitalize"},children:e},e))}):(0,r.jsx)("div",{style:{fontSize:"1.25rem",fontWeight:700,color:l,textTransform:"capitalize"},children:a})]})}function p({level:e,small:a}){let t=m(e);return(0,r.jsx)("span",{className:"badge",style:{background:`${t}20`,color:t,padding:a?"0.25rem 0.5rem":"0.5rem 1rem",fontSize:a?"0.75rem":"0.875rem",textTransform:"capitalize"},children:e})}function m(e){switch(e){case"critical":case"unacceptable":return"#dc2626";case"high":return"#f97316";case"medium":case"pending":return"#eab308";case"low":case"acceptable":return"#22c55e";default:return"var(--text-secondary)"}}},6164:(e,a,t)=>{Promise.resolve().then(t.t.bind(t,8500,23)),Promise.resolve().then(t.bind(t,2320)),Promise.resolve().then(t.bind(t,8169)),Promise.resolve().then(t.bind(t,8358))},8169:(e,a,t)=>{"use strict";t.d(a,{ScenarioList:()=>l});var r=t(5155),i=t(2115);function s({scenario:e,isHighlighted:a}){return(0,r.jsxs)("div",{style:{padding:"1rem",background:a?"rgba(96, 165, 250, 0.1)":"var(--bg-hover)",borderRadius:"8px",border:a?"2px solid var(--accent)":"1px solid var(--border)"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem",marginBottom:"0.75rem"},children:[(0,r.jsx)("span",{style:{color:"var(--accent)"},children:"\uD83E\uDDEA"}),(0,r.jsx)("span",{style:{fontWeight:600},children:e.name}),e.tags.length>0&&(0,r.jsx)("span",{style:{marginLeft:"auto",fontSize:"0.75rem",color:"var(--text-secondary)"},children:e.tags.join(" ")})]}),(0,r.jsx)("div",{style:{fontFamily:"monospace",fontSize:"0.8125rem",lineHeight:1.6},children:e.steps.map((e,a)=>{var t;return(0,r.jsx)("div",{style:{color:(t=e).startsWith("Given")?"#a78bfa":t.startsWith("When")?"#60a5fa":t.startsWith("Then")?"#34d399":"var(--text-secondary)"},children:e},a)})})]})}function l({scenarios:e,highlightScenario:a}){let t=(0,i.useRef)(null);return(0,i.useEffect)(()=>{a&&t.current&&setTimeout(()=>{t.current?.scrollIntoView({behavior:"smooth",block:"center"})},100)},[a]),(0,r.jsx)("div",{style:{display:"grid",gap:"0.75rem"},children:e.map((e,i)=>{let l=a===e.name;return(0,r.jsx)("div",{ref:l?t:void 0,children:(0,r.jsx)(s,{scenario:e,isHighlighted:l})},i)})})}t(8500)},8358:(e,a,t)=>{"use strict";t.d(a,{URSDetailClient:()=>d});var r=t(5155),i=t(2115),s=t(8500),l=t.n(s),n=t(9339);let c=(0,n.createServerReference)("60a5681723a60a8d9e5d957da75a0c64ba56059ea7",n.callServer,void 0,n.findSourceMapURL,"updateURSAction");function d({urs:e,linkedFS:a,linkedRisks:t}){let[s,n]=(0,i.useState)(!1),[d,p]=(0,i.useTransition)(),[m,h]=(0,i.useState)({title:e.title,status:e.status,priority:e.priority,owner:e.owner,category:e.category,business_need:e.business_need,intended_use:e.intended_use,acceptance_criteria:e.acceptance_criteria}),u=e.title.includes("(Undefined)"),g=({value:e,onChange:a,multiline:t,placeholder:i})=>s?t?(0,r.jsx)("textarea",{value:e,onChange:e=>a(e.target.value),rows:4,className:"input",style:{width:"100%",resize:"vertical"}}):(0,r.jsx)("input",{type:"text",value:e,onChange:e=>a(e.target.value),className:"input",style:{width:"100%"}}):(0,r.jsx)("span",{style:{whiteSpace:"pre-wrap",color:"var(--text-secondary)",fontStyle:e?"normal":"italic"},children:e||i||"Not defined"}),x=({value:e,onChange:a,options:t})=>s?(0,r.jsx)("select",{value:e,onChange:e=>a(e.target.value),className:"input",children:t.map(e=>(0,r.jsx)("option",{value:e.value,children:e.label},e.value))}):(0,r.jsx)("span",{style:{textTransform:"capitalize"},children:e});return(0,r.jsxs)("div",{children:[(0,r.jsxs)("header",{className:"page-header",children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"1rem",marginBottom:"0.5rem",flexWrap:"wrap"},children:[(0,r.jsx)("code",{style:{fontSize:"1.5rem",fontWeight:700,color:"var(--success)",background:"rgba(16, 185, 129, 0.1)",padding:"0.5rem 1rem",borderRadius:"8px"},children:e.id}),s?(0,r.jsx)(x,{value:m.status,onChange:e=>h({...m,status:e}),options:[{value:"draft",label:"Draft"},{value:"review",label:"Review"},{value:"approved",label:"Approved"}]}):(0,r.jsx)("span",{className:`badge ${"approved"===e.status?"badge-success":"badge-warning"}`,children:m.status}),s?(0,r.jsx)(x,{value:m.priority,onChange:e=>h({...m,priority:e}),options:[{value:"critical",label:"Critical"},{value:"high",label:"High"},{value:"medium",label:"Medium"},{value:"low",label:"Low"}]}):(0,r.jsx)("span",{className:"badge",style:{background:"var(--bg-hover)"},children:m.priority}),u&&!s&&(0,r.jsx)("span",{className:"badge",style:{background:"rgba(239, 68, 68, 0.2)",color:"var(--error)"},children:"Needs Definition"}),(0,r.jsx)("div",{style:{marginLeft:"auto",display:"flex",gap:"0.5rem"},children:s?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("button",{onClick:()=>{h({title:e.title,status:e.status,priority:e.priority,owner:e.owner,category:e.category,business_need:e.business_need,intended_use:e.intended_use,acceptance_criteria:e.acceptance_criteria}),n(!1)},className:"btn",disabled:d,children:"Cancel"}),(0,r.jsx)("button",{onClick:()=>{p(async()=>{await c(e.id,m),n(!1)})},className:"btn btn-primary",disabled:d,children:d?"Saving...":"\uD83D\uDCBE Save"})]}):(0,r.jsx)("button",{onClick:()=>n(!0),className:"btn btn-primary",children:"✏️ Edit"})})]}),s?(0,r.jsx)("input",{type:"text",value:m.title,onChange:e=>h({...m,title:e.target.value}),className:"input",style:{fontSize:"1.5rem",fontWeight:700,width:"100%",marginBottom:"0.5rem"}}):(0,r.jsx)("h1",{className:"page-title",children:m.title}),(0,r.jsxs)("p",{className:"page-subtitle",children:["User Requirement Specification • Owner: ",s?(0,r.jsx)("input",{type:"text",value:m.owner,onChange:e=>h({...m,owner:e.target.value}),className:"input",style:{width:"200px",display:"inline-block"}}):m.owner]})]}),u&&!s&&(0,r.jsx)("div",{className:"card",style:{marginBottom:"1.5rem",background:"rgba(239, 68, 68, 0.1)",borderLeft:"4px solid var(--error)"},children:(0,r.jsxs)("p",{style:{margin:0,color:"var(--error)"},children:["⚠️ This URS was auto-created from FS references. Click ",(0,r.jsx)("strong",{children:"Edit"})," to define its details."]})}),(0,r.jsxs)("div",{className:"card",style:{marginBottom:"1.5rem"},children:[(0,r.jsx)("h2",{className:"card-title",children:"\uD83D\uDD17 Traceability"}),(0,r.jsxs)("div",{style:{display:"flex",gap:"2rem",flexWrap:"wrap"},children:[(0,r.jsx)(o,{label:"Functional Specs",count:a.length,color:"var(--warning)"}),(0,r.jsx)(o,{label:"Test Scenarios",count:a.reduce((e,a)=>e+a.scenarios.length,0),color:"var(--accent)"}),(0,r.jsx)(o,{label:"Risk Assessments",count:t.length,color:"#f97316"})]})]}),(0,r.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"1.5rem"},children:[(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("h2",{className:"card-title",children:"\uD83D\uDCCB Business Need"}),(0,r.jsx)("div",{style:{lineHeight:1.7},children:(0,r.jsx)(g,{value:m.business_need,onChange:e=>h({...m,business_need:e}),multiline:!0,placeholder:"Not defined"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("h2",{className:"card-title",children:"\uD83C\uDFAF Intended Use"}),(0,r.jsx)("div",{style:{lineHeight:1.7},children:(0,r.jsx)(g,{value:m.intended_use,onChange:e=>h({...m,intended_use:e}),multiline:!0,placeholder:"Not defined"})})]})]}),(0,r.jsxs)("div",{className:"card",style:{marginTop:"1.5rem"},children:[(0,r.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"1rem"},children:[(0,r.jsx)("h2",{className:"card-title",style:{margin:0},children:"✅ Acceptance Criteria"}),s&&(0,r.jsx)("button",{onClick:()=>h({...m,acceptance_criteria:[...m.acceptance_criteria,""]}),className:"btn",style:{padding:"0.25rem 0.75rem"},children:"+ Add"})]}),0===m.acceptance_criteria.length?(0,r.jsx)("p",{style:{color:"var(--text-secondary)",fontStyle:"italic"},children:"No acceptance criteria defined"}):s?(0,r.jsx)("div",{style:{display:"grid",gap:"0.5rem"},children:m.acceptance_criteria.map((e,a)=>(0,r.jsxs)("div",{style:{display:"flex",gap:"0.5rem"},children:[(0,r.jsx)("input",{type:"text",value:e,onChange:e=>{let t=[...m.acceptance_criteria];t[a]=e.target.value,h({...m,acceptance_criteria:t})},className:"input",style:{flex:1},placeholder:`Criterion ${a+1}`}),(0,r.jsx)("button",{onClick:()=>h({...m,acceptance_criteria:m.acceptance_criteria.filter((e,t)=>t!==a)}),className:"btn",style:{padding:"0.5rem"},children:"\xd7"})]},a))}):(0,r.jsx)("ul",{style:{margin:0,paddingLeft:"1.5rem"},children:m.acceptance_criteria.map((e,a)=>(0,r.jsx)("li",{style:{marginBottom:"0.5rem",color:"var(--text-secondary)"},children:e},a))})]}),(0,r.jsxs)("div",{className:"card",style:{marginTop:"1.5rem"},children:[(0,r.jsx)("h2",{className:"card-title",children:"⚙️ Linked Functional Specifications"}),0===a.length?(0,r.jsx)("p",{style:{color:"var(--text-secondary)"},children:"No FS linked yet"}):(0,r.jsx)("div",{style:{display:"grid",gap:"1rem"},children:a.map(e=>(0,r.jsx)(l(),{href:`/specs/${e.id}`,style:{textDecoration:"none"},children:(0,r.jsx)("div",{style:{padding:"1rem",background:"var(--bg-hover)",borderRadius:"8px",borderLeft:"4px solid var(--warning)"},children:(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem"},children:[(0,r.jsx)("code",{style:{fontWeight:600,color:"var(--warning)"},children:e.id}),(0,r.jsx)("span",{style:{color:"var(--text-primary)"},children:e.title}),(0,r.jsxs)("span",{className:"badge badge-success",style:{marginLeft:"auto"},children:[e.scenario_count," tests"]})]})})},e.id))})]})]})}function o({label:e,count:a,color:t}){return(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)",marginBottom:"0.25rem"},children:e}),(0,r.jsx)("div",{style:{fontSize:"1.5rem",fontWeight:700,color:t},children:a})]})}},9339:(e,a,t)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0});var r={callServer:function(){return s.callServer},createServerReference:function(){return n.createServerReference},findSourceMapURL:function(){return l.findSourceMapURL}};for(var i in r)Object.defineProperty(a,i,{enumerable:!0,get:r[i]});let s=t(7304),l=t(4060),n=t(7197)}},e=>{e.O(0,[500,441,794,358],()=>e(e.s=6164)),_N_E=e.O()}]);
@@ -0,0 +1,7 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[922],{574:(e,t,r)=>{"use strict";r.d(t,{FSClient:()=>c});var n=r(5155),i=r(2115),s=r(3321),a=r(8500),o=r.n(a),l=r(3987),d=r(7948);function c({fs:e,isNew:t=!1,ursItems:a,riskItems:c,stepsByType:m}){let h=(0,s.useRouter)(),[g,x]=(0,i.useState)(t),[v,y]=(0,i.useState)(e?.id||"FS-XXX"),[b,f]=(0,i.useState)(e?.title||""),[j,S]=(0,i.useState)(e?.description||""),[k,w]=(0,i.useState)(e?.urs_ids||[]),[C,B]=(0,i.useState)(e?.risk_ids||[]),z=e?.scenarios?e.scenarios.map(e=>({name:e.name,steps:e.steps.map(e=>{let t=e.match(/^(Given|When|Then|And|But)\s+(.+)$/i);return t?{type:t[1].toLowerCase(),text:t[2]}:{type:"given",text:e}})})):[{name:"",steps:[{type:"given",text:""},{type:"when",text:""},{type:"then",text:""}]}],[R,W]=(0,i.useState)(z),[$,N]=(0,i.useState)(null),[T,I]=(0,i.useState)({type:"idle"}),[L,F]=(0,i.useTransition)(),E=()=>{let e=[...k.map(e=>`@${e}`),...C.map(e=>`@${e}`)].join(" "),t=R.filter(e=>e.name.trim()).map(e=>{let t=e.steps.filter(e=>e.text.trim()).map(e=>` ${u(e.type)} ${e.text}`).join("\n");return` Scenario: ${e.name}
2
+ ${t}`}).join("\n\n");return`${e}
3
+ Feature: ${v} ${b}
4
+ ${j}
5
+
6
+ ${t}
7
+ `};return!g&&e?(0,n.jsxs)("div",{className:"card",style:{maxWidth:"900px"},children:[(0,n.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:"2rem",paddingBottom:"1rem",borderBottom:"1px solid var(--border)"},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h1",{style:{margin:0,fontSize:"1.5rem",fontWeight:600,color:"var(--warning)"},children:e.id}),(0,n.jsx)("h2",{style:{margin:"0.5rem 0 0",fontSize:"1.25rem",fontWeight:500},children:e.title})]}),(0,n.jsx)("button",{onClick:()=>x(!0),className:"btn btn-primary",children:"✏️ Edit"})]}),(0,n.jsxs)("div",{style:{marginBottom:"2rem"},children:[(0,n.jsx)("h3",{style:{fontSize:"1rem",fontWeight:600,marginBottom:"0.5rem",color:"var(--text-secondary)"},children:"Description"}),(0,n.jsx)("div",{style:{lineHeight:1.6,whiteSpace:"pre-wrap"},children:e.description})]}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"2rem",marginBottom:"2rem"},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{style:{fontSize:"1rem",fontWeight:600,marginBottom:"0.5rem",color:"var(--text-secondary)"},children:"Linked Requirements"}),(0,n.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.5rem"},children:e.urs_ids.length?e.urs_ids.map(e=>(0,n.jsx)(o(),{href:`/traceability/urs/${e}`,children:(0,n.jsx)("span",{className:"badge badge-success",children:e})},e)):"None"})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{style:{fontSize:"1rem",fontWeight:600,marginBottom:"0.5rem",color:"var(--text-secondary)"},children:"Linked Risks"}),(0,n.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.5rem"},children:e.risk_ids.length?e.risk_ids.map(e=>(0,n.jsx)(o(),{href:`/traceability/risk/${e}`,children:(0,n.jsx)("span",{className:"badge",style:{background:"#f9731633",color:"#f97316"},children:e})},e)):"None"})]})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{style:{fontSize:"1rem",fontWeight:600,marginBottom:"1rem",color:"var(--text-secondary)"},children:"Scenarios"}),(0,n.jsx)("div",{style:{display:"grid",gap:"1rem"},children:e.scenarios.map((e,t)=>(0,n.jsxs)("div",{style:{padding:"1rem",background:"var(--bg-hover)",borderRadius:"8px"},children:[(0,n.jsxs)("div",{style:{fontWeight:600,marginBottom:"0.5rem"},children:["\uD83E\uDDEA ",e.name]}),(0,n.jsx)("div",{style:{fontFamily:"monospace",fontSize:"0.875rem"},children:e.steps.map((e,t)=>(0,n.jsx)("div",{style:{color:"var(--text-secondary)"},children:e},t))})]},t))})]})]}):(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"1.5rem",height:"calc(100vh - 100px)"},children:[(0,n.jsxs)("div",{className:"card",style:{maxWidth:"none",overflow:"auto"},children:[(0,n.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:"2rem",alignItems:"center"},children:[(0,n.jsx)(d.Mo,{icon:"⚙️",title:t?"New Functional Spec":`Editing ${e?.id}`,subtitle:"Gherkin-based feature builder"}),(0,n.jsx)("div",{style:{display:"flex",gap:"0.5rem"},children:(0,n.jsx)("button",{onClick:()=>{t?h.back():x(!1)},className:"btn",children:"Cancel"})})]}),(0,n.jsx)(d.t3,{status:T}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"120px 1fr",gap:"1rem",marginBottom:"1.5rem"},children:[(0,n.jsx)(d.zB,{label:"FS ID",compact:!0,children:(0,n.jsx)("input",{value:v,onChange:e=>y(e.target.value),onFocus:()=>N("fsId"),onBlur:()=>N(null),style:(0,d.wI)("fsId",$)})}),(0,n.jsx)(d.zB,{label:"Title",required:!0,compact:!0,children:(0,n.jsx)("input",{value:b,onChange:e=>f(e.target.value),onFocus:()=>N("title"),onBlur:()=>N(null),placeholder:"e.g., User Login",style:(0,d.wI)("title",$)})})]}),(0,n.jsx)(d.zB,{label:"Description",hint:"Brief description of the feature",children:(0,n.jsx)("textarea",{value:j,onChange:e=>S(e.target.value),onFocus:()=>N("description"),onBlur:()=>N(null),placeholder:"Brief description of the feature...",style:{...(0,d.KN)("description",$),minHeight:"80px"}})}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"1rem",marginBottom:"1.5rem"},children:[(0,n.jsx)(d.zB,{label:"Link URS",compact:!0,children:(0,n.jsx)(l.j,{options:a.map(e=>({value:e.id,label:`${e.id} - ${e.title}`})),selected:k,onChange:w,placeholder:"Search URS...",multi:!0})}),(0,n.jsx)(d.zB,{label:"Link Risks",compact:!0,children:(0,n.jsx)(l.j,{options:c.map(e=>({value:e.id,label:`${e.id} - ${e.title}`})),selected:C,onChange:B,placeholder:"Search Risks...",multi:!0})})]}),(0,n.jsx)(d.zB,{label:"Test Scenarios",hint:"Gherkin scenarios",action:{label:"+ Scenario",onClick:()=>W([...R,{name:"",steps:[{type:"given",text:""},{type:"when",text:""},{type:"then",text:""}]}])},children:R.map((e,t)=>(0,n.jsx)(p,{scenario:e,index:t,stepsByType:m,focusedField:$,setFocusedField:N,onNameChange:e=>{let r;(r=[...R])[t].name=e,W(r)},onStepChange:(e,r)=>{let n;(n=[...R])[t].steps[e].text=r,W(n)},onStepTypeChange:(e,r)=>{let n;(n=[...R])[t].steps[e].type=r,W(n)},onAddStep:e=>{let r;(r=[...R])[t].steps.push({type:e,text:""}),W(r)},onRemoveStep:e=>{let r;(r=[...R])[t].steps=r[t].steps.filter((t,r)=>r!==e),W(r)},onRemove:()=>{R.length>1&&W(R.filter((e,r)=>r!==t))},canRemove:R.length>1},t))})]}),(0,n.jsxs)("div",{className:"card",style:{maxWidth:"none",display:"flex",flexDirection:"column"},children:[(0,n.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"1rem"},children:[(0,n.jsx)("h2",{style:{fontSize:"1.125rem",fontWeight:600},children:"\uD83D\uDCC4 Gherkin Preview"}),(0,n.jsxs)("div",{style:{display:"flex",gap:"0.75rem"},children:[(0,n.jsx)("button",{onClick:()=>{let e=E(),t=`${v.trim()}-${b.toLowerCase().replace(/\s+/g,"-")}.feature`,r=new Blob([e],{type:"text/plain"}),n=URL.createObjectURL(r),i=document.createElement("a");i.href=n,i.download=t,i.click(),URL.revokeObjectURL(n)},className:"btn",children:"⬇️ Download"}),(0,n.jsx)(d.yY,{onClick:()=>{I({type:"idle"}),F(async()=>{let n=E(),i=`${v.trim()}-${b.toLowerCase().replace(/\s+/g,"-")}.feature`;try{let{saveFS:s,updateFSLinksAction:a}=await r.e(570).then(r.bind(r,570)),o=await s(i,n,t?void 0:e?.file_path);o.success?(await a(o.id,k),I({type:"success",message:`Saved ${o.id}`}),t?h.push(`/traceability/fs/${o.id}`):x(!1)):I({type:"error",message:o.error})}catch(e){I({type:"error",message:"Failed to save"})}})},disabled:L||!b.trim(),isPending:L,label:"Save"})]})]}),(0,n.jsx)("pre",{style:{background:"var(--bg-secondary)",padding:"1.25rem",borderRadius:"10px",overflow:"auto",whiteSpace:"pre-wrap",fontFamily:"'JetBrains Mono', monospace",fontSize:"0.8125rem",lineHeight:1.7,flex:1,border:"1px solid var(--border)"},children:E()})]})]})}function m({onClick:e}){return(0,n.jsx)("button",{onClick:e,style:{padding:"0.5rem",background:"transparent",border:"1px solid var(--border)",borderRadius:"8px",color:"var(--text-secondary)",cursor:"pointer",lineHeight:1},title:"Remove",children:"✕"})}function p({scenario:e,index:t,stepsByType:r,focusedField:i,setFocusedField:s,onNameChange:a,onStepChange:o,onStepTypeChange:c,onAddStep:p,onRemoveStep:h,onRemove:g,canRemove:x}){return(0,n.jsxs)("div",{style:{marginBottom:"1rem",padding:"1.25rem",background:"var(--bg-secondary)",borderRadius:"10px",border:"1px solid var(--border)"},children:[(0,n.jsxs)("div",{style:{display:"flex",gap:"0.75rem",marginBottom:"1rem",alignItems:"center"},children:[(0,n.jsxs)("span",{style:{color:"var(--accent)",fontWeight:600,fontSize:"0.875rem"},children:["Scenario ",t+1]}),(0,n.jsx)("input",{value:e.name,onChange:e=>a(e.target.value),onFocus:()=>s(`scenario-${t}`),onBlur:()=>s(null),placeholder:"Scenario name",style:{...(0,d.wI)(`scenario-${t}`,i),flex:1,fontWeight:500}}),x&&(0,n.jsx)(m,{onClick:g})]}),e.steps.map((e,t)=>(0,n.jsxs)("div",{style:{display:"flex",gap:"0.75rem",marginBottom:"0.75rem",alignItems:"center"},children:[(0,n.jsxs)("select",{value:e.type,onChange:e=>c(t,e.target.value),style:{minWidth:"80px",fontSize:"0.75rem",fontWeight:600,color:{given:"#a78bfa",when:"#60a5fa",then:"#34d399",and:"#94a3b8",but:"#f472b6"}[e.type]||"var(--text-secondary)",textTransform:"capitalize",padding:"0.25rem",borderRadius:"6px",border:"1px solid var(--border)",background:"var(--bg-primary)"},children:[(0,n.jsx)("option",{value:"given",children:"Given"}),(0,n.jsx)("option",{value:"when",children:"When"}),(0,n.jsx)("option",{value:"then",children:"Then"}),(0,n.jsx)("option",{value:"and",children:"And"}),(0,n.jsx)("option",{value:"but",children:"But"})]}),(0,n.jsx)(l.j,{options:r[e.type]?.map(e=>({value:e.replace(/^(Given|When|Then|And|But)\s+/,""),label:e}))||[],selected:e.text?[e.text]:[],onChange:e=>o(t,e[0]||""),placeholder:`Select or type ${e.type} step...`,multi:!1,allowCustom:!0}),(0,n.jsx)(m,{onClick:()=>h(t)})]},t)),(0,n.jsxs)("div",{style:{display:"flex",gap:"0.5rem",marginTop:"1rem"},children:[(0,n.jsx)("button",{onClick:()=>p("given"),className:"btn btn-sm",style:{fontSize:"0.75rem"},children:"+ Given"}),(0,n.jsx)("button",{onClick:()=>p("when"),className:"btn btn-sm",style:{fontSize:"0.75rem"},children:"+ When"}),(0,n.jsx)("button",{onClick:()=>p("then"),className:"btn btn-sm",style:{fontSize:"0.75rem"},children:"+ Then"}),["and","but"].map(e=>(0,n.jsxs)("button",{onClick:()=>p(e),className:"btn btn-sm",style:{fontSize:"0.75rem"},children:["+ ",u(e)]},e))]})]})}function u(e){return e.charAt(0).toUpperCase()+e.slice(1)}},2504:(e,t,r)=>{Promise.resolve().then(r.bind(r,574))},3321:(e,t,r)=>{"use strict";var n=r(4645);r.o(n,"usePathname")&&r.d(t,{usePathname:function(){return n.usePathname}}),r.o(n,"useRouter")&&r.d(t,{useRouter:function(){return n.useRouter}})},3987:(e,t,r)=>{"use strict";r.d(t,{j:()=>s});var n=r(5155),i=r(2115);function s({options:e,selected:t,onChange:r,placeholder:s,multi:a=!0,allowCustom:o=!0}){let[l,d]=(0,i.useState)(!1),[c,m]=(0,i.useState)(""),p=(0,i.useRef)(null),u=e.filter(e=>e.label.toLowerCase().includes(c.toLowerCase())&&(!a||!t.includes(e.value)));return(0,i.useEffect)(()=>{let e=e=>{p.current&&!p.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[]),(0,n.jsxs)("div",{ref:p,style:{position:"relative",flex:1},children:[a&&t.length>0&&(0,n.jsx)("div",{style:{display:"flex",gap:"0.25rem",flexWrap:"wrap",marginBottom:"0.5rem"},children:t.map(i=>{let s=e.find(e=>e.value===i);return(0,n.jsxs)("span",{className:"badge badge-success",style:{display:"flex",alignItems:"center",gap:"0.25rem"},children:[s?.value||i,(0,n.jsx)("button",{onClick:()=>{r(t.filter(e=>e!==i))},style:{background:"none",border:"none",cursor:"pointer",padding:0,fontSize:"1rem",color:"inherit"},children:"\xd7"})]},i)})}),(0,n.jsx)("input",{type:"text",value:a||l?c:(()=>{if(!a&&t.length>0){let r=e.find(e=>e.value===t[0]);return r?.label||t[0]}return""})(),onChange:e=>m(e.target.value),onFocus:()=>d(!0),placeholder:0!==t.length&&a?"Add more...":s,className:"input",style:{width:"100%"}}),l&&(0,n.jsxs)("div",{style:{position:"absolute",top:"100%",left:0,right:0,marginTop:"0.25rem",background:"var(--bg-card)",border:"1px solid var(--border)",borderRadius:"8px",maxHeight:"200px",overflowY:"auto",zIndex:100,boxShadow:"0 4px 12px rgba(0,0,0,0.3)"},children:[0===u.length?(0,n.jsx)("div",{style:{padding:"0.75rem",color:"var(--text-secondary)",fontSize:"0.875rem"},children:o?"No matches - type to create":"No matching steps"}):u.slice(0,20).map(e=>(0,n.jsxs)("div",{onClick:()=>{var n;return n=e.value,void(a?r([...t,n]):(r([n]),d(!1)),m(""))},style:{padding:"0.625rem 0.75rem",cursor:"pointer",fontSize:"0.875rem",borderBottom:"1px solid var(--border)",transition:"background 0.15s"},onMouseEnter:e=>e.currentTarget.style.background="var(--bg-hover)",onMouseLeave:e=>e.currentTarget.style.background="transparent",children:[(0,n.jsx)("div",{style:{fontWeight:500},children:e.value}),e.label!==e.value&&(0,n.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)",marginTop:"0.125rem"},children:e.label})]},e.value)),u.length>20&&(0,n.jsxs)("div",{style:{padding:"0.5rem",color:"var(--text-secondary)",fontSize:"0.75rem",textAlign:"center"},children:["+",u.length-20," more..."]})]})]})}},7948:(e,t,r)=>{"use strict";r.d(t,{KN:()=>c,Mo:()=>u,d0:()=>g,mQ:()=>d,t3:()=>p,wI:()=>l,yY:()=>h,zB:()=>m});var n=r(5155);r(2115);let i={width:"100%",padding:"0.875rem 1rem",fontSize:"0.9375rem",lineHeight:"1.5",color:"var(--text-primary)",background:"var(--bg-secondary)",borderWidth:"1px",borderStyle:"solid",borderColor:"var(--border)",borderRadius:"10px",outline:"none",transition:"all 0.2s ease"},s={borderColor:"var(--accent)",boxShadow:"0 0 0 3px rgba(99, 102, 241, 0.15)"},a={...i,cursor:"pointer",appearance:"none",backgroundImage:"url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%238888a0' d='M6 8L1 3h10z'/%3E%3C/svg%3E\")",backgroundRepeat:"no-repeat",backgroundPosition:"right 1rem center",paddingRight:"2.5rem"},o={...i,resize:"vertical",minHeight:"120px",fontFamily:"inherit"};function l(e,t){return{...i,...t===e?s:{}}}function d(e,t){return{...a,...t===e?s:{}}}function c(e,t){return{...o,...t===e?s:{}}}function m({label:e,children:t,required:r,compact:i,hint:s,action:a}){return(0,n.jsxs)("div",{style:{marginBottom:i?"0":"1.5rem"},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"0.5rem"},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:[(0,n.jsx)("label",{style:{fontWeight:500,fontSize:"0.875rem",color:"var(--text-primary)"},children:e}),r&&(0,n.jsx)("span",{style:{color:"var(--accent)",fontSize:"0.75rem"},children:"Required"}),s&&(0,n.jsxs)("span",{style:{color:"var(--text-secondary)",fontSize:"0.8125rem",fontWeight:400},children:["— ",s]})]}),a&&(0,n.jsx)("button",{onClick:a.onClick,style:{padding:"0.375rem 0.75rem",fontSize:"0.8125rem",fontWeight:500,background:"transparent",border:"1px solid var(--accent)",borderRadius:"6px",color:"var(--accent)",cursor:"pointer",transition:"all 0.2s"},children:a.label})]}),t]})}function p({status:e}){return"idle"===e.type?null:(0,n.jsxs)("div",{style:{marginBottom:"1.5rem",padding:"1rem 1.25rem",borderRadius:"10px",background:"success"===e.type?"rgba(16, 185, 129, 0.1)":"rgba(239, 68, 68, 0.1)",color:"success"===e.type?"var(--success)":"var(--error)",fontSize:"0.9375rem",display:"flex",alignItems:"center",gap:"0.5rem",borderWidth:"1px",borderStyle:"solid",borderColor:"success"===e.type?"rgba(16, 185, 129, 0.2)":"rgba(239, 68, 68, 0.2)"},children:["success"===e.type?"✅":"❌"," ",e.message]})}function u({icon:e,title:t,subtitle:r}){return(0,n.jsxs)("div",{style:{marginBottom:"2rem",paddingBottom:"1.5rem",borderBottom:"1px solid var(--border)"},children:[(0,n.jsxs)("h2",{style:{margin:0,fontSize:"1.25rem",fontWeight:600},children:[e," ",t]}),(0,n.jsx)("p",{style:{margin:"0.25rem 0 0",color:"var(--text-secondary)",fontSize:"0.875rem"},children:r})]})}function h({onClick:e,disabled:t,isPending:r,label:i="Save"}){return(0,n.jsx)("button",{onClick:e,disabled:t,style:{padding:"0.75rem 1.5rem",fontSize:"0.9375rem",fontWeight:600,borderRadius:"10px",border:"none",cursor:t?"not-allowed":"pointer",background:t?"var(--bg-hover)":"linear-gradient(135deg, var(--gradient-start), var(--gradient-end))",color:t?"var(--text-secondary)":"white",transition:"all 0.2s ease",boxShadow:t?"none":"0 4px 12px rgba(99, 102, 241, 0.25)"},children:r?"\uD83D\uDCBE Saving...":`💾 ${i}`})}function g({onClick:e}){return(0,n.jsx)("button",{onClick:e,style:{padding:"0.5rem",background:"transparent",border:"1px solid var(--border)",borderRadius:"8px",color:"var(--text-secondary)",cursor:"pointer",transition:"all 0.2s",lineHeight:1},title:"Remove",children:"✕"})}}},e=>{e.O(0,[500,441,794,358],()=>e(e.s=2504)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[200,252,409,974],{2318:(e,s,_)=>{Promise.resolve().then(_.t.bind(_,8500,23))}},e=>{e.O(0,[500,441,794,358],()=>e(e.s=2318)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[510],{3321:(e,t,i)=>{"use strict";var r=i(4645);i.o(r,"usePathname")&&i.d(t,{usePathname:function(){return r.usePathname}}),i.o(r,"useRouter")&&i.d(t,{useRouter:function(){return r.useRouter}})},3987:(e,t,i)=>{"use strict";i.d(t,{j:()=>n});var r=i(5155),l=i(2115);function n({options:e,selected:t,onChange:i,placeholder:n,multi:s=!0,allowCustom:a=!0}){let[o,d]=(0,l.useState)(!1),[c,m]=(0,l.useState)(""),u=(0,l.useRef)(null),p=e.filter(e=>e.label.toLowerCase().includes(c.toLowerCase())&&(!s||!t.includes(e.value)));return(0,l.useEffect)(()=>{let e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[]),(0,r.jsxs)("div",{ref:u,style:{position:"relative",flex:1},children:[s&&t.length>0&&(0,r.jsx)("div",{style:{display:"flex",gap:"0.25rem",flexWrap:"wrap",marginBottom:"0.5rem"},children:t.map(l=>{let n=e.find(e=>e.value===l);return(0,r.jsxs)("span",{className:"badge badge-success",style:{display:"flex",alignItems:"center",gap:"0.25rem"},children:[n?.value||l,(0,r.jsx)("button",{onClick:()=>{i(t.filter(e=>e!==l))},style:{background:"none",border:"none",cursor:"pointer",padding:0,fontSize:"1rem",color:"inherit"},children:"\xd7"})]},l)})}),(0,r.jsx)("input",{type:"text",value:s||o?c:(()=>{if(!s&&t.length>0){let i=e.find(e=>e.value===t[0]);return i?.label||t[0]}return""})(),onChange:e=>m(e.target.value),onFocus:()=>d(!0),placeholder:0!==t.length&&s?"Add more...":n,className:"input",style:{width:"100%"}}),o&&(0,r.jsxs)("div",{style:{position:"absolute",top:"100%",left:0,right:0,marginTop:"0.25rem",background:"var(--bg-card)",border:"1px solid var(--border)",borderRadius:"8px",maxHeight:"200px",overflowY:"auto",zIndex:100,boxShadow:"0 4px 12px rgba(0,0,0,0.3)"},children:[0===p.length?(0,r.jsx)("div",{style:{padding:"0.75rem",color:"var(--text-secondary)",fontSize:"0.875rem"},children:a?"No matches - type to create":"No matching steps"}):p.slice(0,20).map(e=>(0,r.jsxs)("div",{onClick:()=>{var r;return r=e.value,void(s?i([...t,r]):(i([r]),d(!1)),m(""))},style:{padding:"0.625rem 0.75rem",cursor:"pointer",fontSize:"0.875rem",borderBottom:"1px solid var(--border)",transition:"background 0.15s"},onMouseEnter:e=>e.currentTarget.style.background="var(--bg-hover)",onMouseLeave:e=>e.currentTarget.style.background="transparent",children:[(0,r.jsx)("div",{style:{fontWeight:500},children:e.value}),e.label!==e.value&&(0,r.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)",marginTop:"0.125rem"},children:e.label})]},e.value)),p.length>20&&(0,r.jsxs)("div",{style:{padding:"0.5rem",color:"var(--text-secondary)",fontSize:"0.75rem",textAlign:"center"},children:["+",p.length-20," more..."]})]})]})}},5230:(e,t,i)=>{"use strict";i.d(t,{RiskClient:()=>c});var r=i(5155),l=i(2115),n=i(3321),s=i(8500),a=i.n(s),o=i(3987),d=i(7948);function c({risk:e,isNew:t=!1,fsItems:s}){let c=(0,n.useRouter)(),[g,h]=(0,l.useState)(t),[x,v]=(0,l.useState)(e?.title||""),[y,b]=(0,l.useState)(e?.status||"draft"),[f,j]=(0,l.useState)(e?.category||""),[k,S]=(0,l.useState)(e?.gamp_category||4),[C,w]=(0,l.useState)(e?.impact||"medium"),[z,B]=(0,l.useState)(e?.probability||"medium"),[R,I]=(0,l.useState)(e?.risk_level||"medium"),[_,W]=(0,l.useState)(e?.residual_risk||"acceptable"),[F,$]=(0,l.useState)(e?.fs_ids||[]),L=e?.risks?.length?e.risks.map(e=>({id:e.id,description:e.description,impact:e.impact,probability:e.probability})):[{id:"R-001.1",description:"",impact:"medium",probability:"medium"}],N=e?.mitigations?.length?e.mitigations.map(e=>({risk_id:e.risk_id,control:e.control,test:e.test})):[{risk_id:"R-001.1",control:"",test:""}],[E,T]=(0,l.useState)(L),[H,M]=(0,l.useState)(N),[P,D]=(0,l.useState)(null),[A,Q]=(0,l.useState)({type:"idle"}),[q,Y]=(0,l.useTransition)(),O=(e,t,i)=>{let r=[...E];r[e]={...r[e],[t]:i},T(r)},K=(e,t,i)=>{let r=[...H];r[e]={...r[e],[t]:i},M(r)};return!g&&e?(0,r.jsxs)("div",{className:"card",style:{maxWidth:"900px"},children:[(0,r.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"2rem",paddingBottom:"1.5rem",borderBottom:"1px solid var(--border)"},children:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"1rem",marginBottom:"0.5rem"},children:[(0,r.jsx)("span",{style:{fontSize:"0.75rem",fontWeight:600,padding:"0.25rem 0.75rem",background:"#f97316",borderRadius:"6px",color:"white"},children:e.id}),(0,r.jsxs)("span",{className:`badge ${"acceptable"===e.residual_risk?"badge-success":"badge-error"}`,style:{textTransform:"capitalize"},children:["acceptable"===e.residual_risk?"✅":"⚠️"," ",e.residual_risk||"pending"]})]}),(0,r.jsx)("h1",{style:{margin:0,fontSize:"1.5rem",fontWeight:600,lineHeight:1.3},children:e.title})]}),(0,r.jsxs)("button",{onClick:()=>h(!0),className:"btn btn-primary",style:{display:"flex",gap:"0.5rem",alignItems:"center"},children:[(0,r.jsx)("span",{children:"✏️"})," Edit"]})]}),(0,r.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, 1fr)",gap:"1rem",marginBottom:"1.5rem"},children:[(0,r.jsx)(m,{label:"Category",value:e.category}),(0,r.jsx)(m,{label:"Impact",value:e.impact,color:p(e.impact)}),(0,r.jsx)(m,{label:"Probability",value:e.probability,color:p(e.probability)}),(0,r.jsx)(m,{label:"Risk Level",value:e.risk_level,color:p(e.risk_level)})]}),(0,r.jsx)(u,{label:"Linked Functional Specs",children:e.fs_ids.length>0?(0,r.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.5rem"},children:e.fs_ids.map(e=>(0,r.jsx)(a(),{href:`/traceability/fs/${e}`,children:(0,r.jsx)("span",{className:"badge badge-warning",children:e})},e))}):(0,r.jsx)("span",{style:{color:"var(--text-secondary)",fontStyle:"italic"},children:"No functional specs linked. Edit to add links."})}),e.risks.length>0&&(0,r.jsx)(u,{label:"Identified Risks",count:e.risks.length,children:(0,r.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:e.risks.map((e,t)=>(0,r.jsxs)("div",{style:{display:"flex",gap:"0.75rem",alignItems:"flex-start"},children:[(0,r.jsx)("span",{style:{color:"#f97316",fontWeight:600,fontSize:"0.875rem",fontFamily:"monospace",minWidth:"70px"},children:e.id}),(0,r.jsx)("span",{style:{lineHeight:1.6},children:e.description})]},t))})}),e.mitigations.length>0&&(0,r.jsx)(u,{label:"Mitigation & Control",count:e.mitigations.length,children:(0,r.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:e.mitigations.map((e,t)=>(0,r.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.25rem"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:[(0,r.jsxs)("span",{style:{color:"var(--accent)",fontWeight:600,fontSize:"0.75rem"},children:["For ",e.risk_id,":"]}),(0,r.jsx)("span",{style:{fontWeight:500},children:e.control})]}),(0,r.jsxs)("div",{style:{fontSize:"0.875rem",color:"var(--text-secondary)",paddingLeft:"1rem"},children:["Test: ",e.test]})]},t))})})]}):(0,r.jsxs)("div",{className:"card",style:{maxWidth:"900px"},children:[(0,r.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:"2rem",alignItems:"center"},children:[(0,r.jsx)(d.Mo,{icon:"⚠️",title:t?"New Risk Assessment":`Editing ${e?.id}`,subtitle:"Identify and mitigate risks"}),(0,r.jsxs)("div",{style:{display:"flex",gap:"0.75rem"},children:[(0,r.jsx)("button",{onClick:()=>{t?c.back():h(!1)},className:"btn",children:"Cancel"}),(0,r.jsx)(d.yY,{onClick:()=>{Q({type:"idle"}),Y(async()=>{try{let r,l={title:x,status:y,category:f,gamp_category:k,fs_ids:F,impact:C,probability:z,risk_level:R,residual_risk:_,risks:E.filter(e=>e.description.trim()||e.id).map(e=>({id:e.id,description:e.description,impact:e.impact,probability:e.probability})),mitigations:H.filter(e=>e.control.trim()).map(e=>({risk_id:e.risk_id,control:e.control,test:e.test}))};if(t){let{saveRisk:e}=await i.e(570).then(i.bind(i,570));r=await e(l)}else{let{updateRiskAction:t}=await i.e(570).then(i.bind(i,570));r=await t(e.id,l)}r.success?(Q({type:"success",message:`Saved ${r.id}`}),t?c.push(`/traceability/risk/${r.id}`):(c.refresh(),h(!1))):Q({type:"error",message:r.error})}catch(e){Q({type:"error",message:"Failed to save"})}})},disabled:q||!x.trim(),isPending:q,label:"Save Risk"})]})]}),(0,r.jsx)(d.t3,{status:A}),(0,r.jsx)(d.zB,{label:"Title",required:!0,children:(0,r.jsx)("input",{value:x,onChange:e=>v(e.target.value),style:(0,d.wI)("title",P),onFocus:()=>D("title"),onBlur:()=>D(null)})}),(0,r.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"1rem",marginBottom:"1.5rem"},children:[(0,r.jsx)(d.zB,{label:"Category",compact:!0,children:(0,r.jsx)("input",{value:f,onChange:e=>j(e.target.value),style:(0,d.wI)("cat",P),onFocus:()=>D("cat")})}),(0,r.jsx)(d.zB,{label:"Link FS",required:!0,compact:!0,children:(0,r.jsx)(o.j,{options:s.map(e=>({value:e.id,label:`${e.id} - ${e.title}`})),selected:F,onChange:$,placeholder:"Search FS...",multi:!0})})]}),(0,r.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, 1fr)",gap:"1rem",marginBottom:"1.5rem"},children:[(0,r.jsx)(d.zB,{label:"Impact",compact:!0,children:(0,r.jsxs)("select",{value:C,onChange:e=>w(e.target.value),style:(0,d.mQ)("imp",P),onFocus:()=>D("imp"),children:[(0,r.jsx)("option",{value:"low",children:"\uD83D\uDFE2 Low"}),(0,r.jsx)("option",{value:"medium",children:"\uD83D\uDFE1 Medium"}),(0,r.jsx)("option",{value:"high",children:"\uD83D\uDFE0 High"}),(0,r.jsx)("option",{value:"critical",children:"\uD83D\uDD34 Critical"})]})}),(0,r.jsx)(d.zB,{label:"Probability",compact:!0,children:(0,r.jsxs)("select",{value:z,onChange:e=>B(e.target.value),style:(0,d.mQ)("prob",P),onFocus:()=>D("prob"),children:[(0,r.jsx)("option",{value:"low",children:"\uD83D\uDFE2 Low"}),(0,r.jsx)("option",{value:"medium",children:"\uD83D\uDFE1 Medium"}),(0,r.jsx)("option",{value:"high",children:"\uD83D\uDD34 High"})]})}),(0,r.jsx)(d.zB,{label:"Risk Level",compact:!0,children:(0,r.jsxs)("select",{value:R,onChange:e=>I(e.target.value),style:(0,d.mQ)("lvl",P),onFocus:()=>D("lvl"),children:[(0,r.jsx)("option",{value:"low",children:"\uD83D\uDFE2 Low"}),(0,r.jsx)("option",{value:"medium",children:"\uD83D\uDFE1 Medium"}),(0,r.jsx)("option",{value:"high",children:"\uD83D\uDFE0 High"}),(0,r.jsx)("option",{value:"critical",children:"\uD83D\uDD34 Critical"})]})}),(0,r.jsx)(d.zB,{label:"Residual Risk",compact:!0,children:(0,r.jsxs)("select",{value:_,onChange:e=>W(e.target.value),style:(0,d.mQ)("res",P),onFocus:()=>D("res"),children:[(0,r.jsx)("option",{value:"acceptable",children:"✅ Acceptable"}),(0,r.jsx)("option",{value:"unacceptable",children:"❌ Unacceptable"}),(0,r.jsx)("option",{value:"pending",children:"⏳ Pending"})]})})]}),(0,r.jsx)(d.zB,{label:"Identified Risks",hint:"List specific risks",action:{label:"+ Add Risk",onClick:()=>T([...E,{id:`R-001.${E.length+1}`,description:"",impact:"medium",probability:"medium"}])},children:(0,r.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:E.map((e,t)=>(0,r.jsxs)("div",{style:{display:"flex",gap:"0.75rem",alignItems:"center"},children:[(0,r.jsx)("input",{value:e.id,onChange:e=>O(t,"id",e.target.value),onFocus:()=>D(`risk-id-${t}`),onBlur:()=>D(null),placeholder:"R-ID",style:{...(0,d.wI)(`risk-id-${t}`,P),width:"100px",flexShrink:0}}),(0,r.jsx)("input",{value:e.description,onChange:e=>O(t,"description",e.target.value),onFocus:()=>D(`risk-desc-${t}`),onBlur:()=>D(null),placeholder:"Risk description",style:{...(0,d.wI)(`risk-desc-${t}`,P),flex:1}}),E.length>1&&(0,r.jsx)(d.d0,{onClick:()=>{E.length>1&&T(E.filter((e,i)=>i!==t))}})]},t))})}),(0,r.jsx)(d.zB,{label:"Mitigations",hint:"Control measures and testing",action:{label:"+ Add Mitigation",onClick:()=>M([...H,{risk_id:"",control:"",test:""}])},children:(0,r.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:H.map((e,t)=>(0,r.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"100px 1fr 1fr auto",gap:"0.75rem",alignItems:"center",padding:"1rem",background:"var(--bg-secondary)",borderRadius:"10px",border:"1px solid var(--border)"},children:[(0,r.jsx)("input",{value:e.risk_id,onChange:e=>K(t,"risk_id",e.target.value),onFocus:()=>D(`mit-id-${t}`),onBlur:()=>D(null),placeholder:"R-ID",style:(0,d.wI)(`mit-id-${t}`,P)}),(0,r.jsx)("input",{value:e.control,onChange:e=>K(t,"control",e.target.value),onFocus:()=>D(`mit-control-${t}`),onBlur:()=>D(null),placeholder:"Control measure",style:(0,d.wI)(`mit-control-${t}`,P)}),(0,r.jsx)("input",{value:e.test,onChange:e=>K(t,"test",e.target.value),onFocus:()=>D(`mit-test-${t}`),onBlur:()=>D(null),placeholder:"How to test",style:(0,d.wI)(`mit-test-${t}`,P)}),H.length>1&&(0,r.jsx)(d.d0,{onClick:()=>{H.length>1&&M(H.filter((e,i)=>i!==t))}})]},t))})})]})}function m({label:e,value:t,color:i}){return(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)",fontWeight:500,marginBottom:"0.25rem"},children:e}),(0,r.jsx)("div",{style:{fontSize:"1rem",fontWeight:500,textTransform:"capitalize",color:i||"var(--text-primary)"},children:t||"—"})]})}function u({label:e,count:t,children:i}){return(0,r.jsxs)("div",{style:{marginBottom:"1.5rem"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem",marginBottom:"0.5rem"},children:[(0,r.jsx)("label",{style:{fontWeight:500,fontSize:"0.875rem",color:"var(--text-secondary)"},children:e}),void 0!==t&&(0,r.jsx)("span",{style:{fontSize:"0.75rem",padding:"0.125rem 0.5rem",background:"var(--bg-hover)",borderRadius:"9999px"},children:t})]}),(0,r.jsx)("div",{style:{lineHeight:1.7},children:i})]})}function p(e){switch(e?.toLowerCase()){case"high":return"#ef4444";case"medium":return"#f59e0b";case"low":return"#10b981";default:return"var(--text-primary)"}}},6640:(e,t,i)=>{Promise.resolve().then(i.bind(i,5230))},7948:(e,t,i)=>{"use strict";i.d(t,{KN:()=>c,Mo:()=>p,d0:()=>h,mQ:()=>d,t3:()=>u,wI:()=>o,yY:()=>g,zB:()=>m});var r=i(5155);i(2115);let l={width:"100%",padding:"0.875rem 1rem",fontSize:"0.9375rem",lineHeight:"1.5",color:"var(--text-primary)",background:"var(--bg-secondary)",borderWidth:"1px",borderStyle:"solid",borderColor:"var(--border)",borderRadius:"10px",outline:"none",transition:"all 0.2s ease"},n={borderColor:"var(--accent)",boxShadow:"0 0 0 3px rgba(99, 102, 241, 0.15)"},s={...l,cursor:"pointer",appearance:"none",backgroundImage:"url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%238888a0' d='M6 8L1 3h10z'/%3E%3C/svg%3E\")",backgroundRepeat:"no-repeat",backgroundPosition:"right 1rem center",paddingRight:"2.5rem"},a={...l,resize:"vertical",minHeight:"120px",fontFamily:"inherit"};function o(e,t){return{...l,...t===e?n:{}}}function d(e,t){return{...s,...t===e?n:{}}}function c(e,t){return{...a,...t===e?n:{}}}function m({label:e,children:t,required:i,compact:l,hint:n,action:s}){return(0,r.jsxs)("div",{style:{marginBottom:l?"0":"1.5rem"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"0.5rem"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:[(0,r.jsx)("label",{style:{fontWeight:500,fontSize:"0.875rem",color:"var(--text-primary)"},children:e}),i&&(0,r.jsx)("span",{style:{color:"var(--accent)",fontSize:"0.75rem"},children:"Required"}),n&&(0,r.jsxs)("span",{style:{color:"var(--text-secondary)",fontSize:"0.8125rem",fontWeight:400},children:["— ",n]})]}),s&&(0,r.jsx)("button",{onClick:s.onClick,style:{padding:"0.375rem 0.75rem",fontSize:"0.8125rem",fontWeight:500,background:"transparent",border:"1px solid var(--accent)",borderRadius:"6px",color:"var(--accent)",cursor:"pointer",transition:"all 0.2s"},children:s.label})]}),t]})}function u({status:e}){return"idle"===e.type?null:(0,r.jsxs)("div",{style:{marginBottom:"1.5rem",padding:"1rem 1.25rem",borderRadius:"10px",background:"success"===e.type?"rgba(16, 185, 129, 0.1)":"rgba(239, 68, 68, 0.1)",color:"success"===e.type?"var(--success)":"var(--error)",fontSize:"0.9375rem",display:"flex",alignItems:"center",gap:"0.5rem",borderWidth:"1px",borderStyle:"solid",borderColor:"success"===e.type?"rgba(16, 185, 129, 0.2)":"rgba(239, 68, 68, 0.2)"},children:["success"===e.type?"✅":"❌"," ",e.message]})}function p({icon:e,title:t,subtitle:i}){return(0,r.jsxs)("div",{style:{marginBottom:"2rem",paddingBottom:"1.5rem",borderBottom:"1px solid var(--border)"},children:[(0,r.jsxs)("h2",{style:{margin:0,fontSize:"1.25rem",fontWeight:600},children:[e," ",t]}),(0,r.jsx)("p",{style:{margin:"0.25rem 0 0",color:"var(--text-secondary)",fontSize:"0.875rem"},children:i})]})}function g({onClick:e,disabled:t,isPending:i,label:l="Save"}){return(0,r.jsx)("button",{onClick:e,disabled:t,style:{padding:"0.75rem 1.5rem",fontSize:"0.9375rem",fontWeight:600,borderRadius:"10px",border:"none",cursor:t?"not-allowed":"pointer",background:t?"var(--bg-hover)":"linear-gradient(135deg, var(--gradient-start), var(--gradient-end))",color:t?"var(--text-secondary)":"white",transition:"all 0.2s ease",boxShadow:t?"none":"0 4px 12px rgba(99, 102, 241, 0.25)"},children:i?"\uD83D\uDCBE Saving...":`💾 ${l}`})}function h({onClick:e}){return(0,r.jsx)("button",{onClick:e,style:{padding:"0.5rem",background:"transparent",border:"1px solid var(--border)",borderRadius:"8px",color:"var(--text-secondary)",cursor:"pointer",transition:"all 0.2s",lineHeight:1},title:"Remove",children:"✕"})}}},e=>{e.O(0,[500,441,794,358],()=>e(e.s=6640)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[200,252,409,974],{2318:(e,s,_)=>{Promise.resolve().then(_.t.bind(_,8500,23))}},e=>{e.O(0,[500,441,794,358],()=>e(e.s=2318)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[245],{1704:(e,r,t)=>{Promise.resolve().then(t.bind(t,9325))},3987:(e,r,t)=>{"use strict";t.d(r,{j:()=>a});var n=t(5155),i=t(2115);function a({options:e,selected:r,onChange:t,placeholder:a,multi:s=!0,allowCustom:l=!0}){let[o,d]=(0,i.useState)(!1),[c,u]=(0,i.useState)(""),p=(0,i.useRef)(null),m=e.filter(e=>e.label.toLowerCase().includes(c.toLowerCase())&&(!s||!r.includes(e.value)));return(0,i.useEffect)(()=>{let e=e=>{p.current&&!p.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[]),(0,n.jsxs)("div",{ref:p,style:{position:"relative",flex:1},children:[s&&r.length>0&&(0,n.jsx)("div",{style:{display:"flex",gap:"0.25rem",flexWrap:"wrap",marginBottom:"0.5rem"},children:r.map(i=>{let a=e.find(e=>e.value===i);return(0,n.jsxs)("span",{className:"badge badge-success",style:{display:"flex",alignItems:"center",gap:"0.25rem"},children:[a?.value||i,(0,n.jsx)("button",{onClick:()=>{t(r.filter(e=>e!==i))},style:{background:"none",border:"none",cursor:"pointer",padding:0,fontSize:"1rem",color:"inherit"},children:"\xd7"})]},i)})}),(0,n.jsx)("input",{type:"text",value:s||o?c:(()=>{if(!s&&r.length>0){let t=e.find(e=>e.value===r[0]);return t?.label||r[0]}return""})(),onChange:e=>u(e.target.value),onFocus:()=>d(!0),placeholder:0!==r.length&&s?"Add more...":a,className:"input",style:{width:"100%"}}),o&&(0,n.jsxs)("div",{style:{position:"absolute",top:"100%",left:0,right:0,marginTop:"0.25rem",background:"var(--bg-card)",border:"1px solid var(--border)",borderRadius:"8px",maxHeight:"200px",overflowY:"auto",zIndex:100,boxShadow:"0 4px 12px rgba(0,0,0,0.3)"},children:[0===m.length?(0,n.jsx)("div",{style:{padding:"0.75rem",color:"var(--text-secondary)",fontSize:"0.875rem"},children:l?"No matches - type to create":"No matching steps"}):m.slice(0,20).map(e=>(0,n.jsxs)("div",{onClick:()=>{var n;return n=e.value,void(s?t([...r,n]):(t([n]),d(!1)),u(""))},style:{padding:"0.625rem 0.75rem",cursor:"pointer",fontSize:"0.875rem",borderBottom:"1px solid var(--border)",transition:"background 0.15s"},onMouseEnter:e=>e.currentTarget.style.background="var(--bg-hover)",onMouseLeave:e=>e.currentTarget.style.background="transparent",children:[(0,n.jsx)("div",{style:{fontWeight:500},children:e.value}),e.label!==e.value&&(0,n.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)",marginTop:"0.125rem"},children:e.label})]},e.value)),m.length>20&&(0,n.jsxs)("div",{style:{padding:"0.5rem",color:"var(--text-secondary)",fontSize:"0.75rem",textAlign:"center"},children:["+",m.length-20," more..."]})]})]})}},7948:(e,r,t)=>{"use strict";t.d(r,{KN:()=>c,Mo:()=>m,d0:()=>h,mQ:()=>d,t3:()=>p,wI:()=>o,yY:()=>g,zB:()=>u});var n=t(5155);t(2115);let i={width:"100%",padding:"0.875rem 1rem",fontSize:"0.9375rem",lineHeight:"1.5",color:"var(--text-primary)",background:"var(--bg-secondary)",borderWidth:"1px",borderStyle:"solid",borderColor:"var(--border)",borderRadius:"10px",outline:"none",transition:"all 0.2s ease"},a={borderColor:"var(--accent)",boxShadow:"0 0 0 3px rgba(99, 102, 241, 0.15)"},s={...i,cursor:"pointer",appearance:"none",backgroundImage:"url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%238888a0' d='M6 8L1 3h10z'/%3E%3C/svg%3E\")",backgroundRepeat:"no-repeat",backgroundPosition:"right 1rem center",paddingRight:"2.5rem"},l={...i,resize:"vertical",minHeight:"120px",fontFamily:"inherit"};function o(e,r){return{...i,...r===e?a:{}}}function d(e,r){return{...s,...r===e?a:{}}}function c(e,r){return{...l,...r===e?a:{}}}function u({label:e,children:r,required:t,compact:i,hint:a,action:s}){return(0,n.jsxs)("div",{style:{marginBottom:i?"0":"1.5rem"},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"0.5rem"},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:[(0,n.jsx)("label",{style:{fontWeight:500,fontSize:"0.875rem",color:"var(--text-primary)"},children:e}),t&&(0,n.jsx)("span",{style:{color:"var(--accent)",fontSize:"0.75rem"},children:"Required"}),a&&(0,n.jsxs)("span",{style:{color:"var(--text-secondary)",fontSize:"0.8125rem",fontWeight:400},children:["— ",a]})]}),s&&(0,n.jsx)("button",{onClick:s.onClick,style:{padding:"0.375rem 0.75rem",fontSize:"0.8125rem",fontWeight:500,background:"transparent",border:"1px solid var(--accent)",borderRadius:"6px",color:"var(--accent)",cursor:"pointer",transition:"all 0.2s"},children:s.label})]}),r]})}function p({status:e}){return"idle"===e.type?null:(0,n.jsxs)("div",{style:{marginBottom:"1.5rem",padding:"1rem 1.25rem",borderRadius:"10px",background:"success"===e.type?"rgba(16, 185, 129, 0.1)":"rgba(239, 68, 68, 0.1)",color:"success"===e.type?"var(--success)":"var(--error)",fontSize:"0.9375rem",display:"flex",alignItems:"center",gap:"0.5rem",borderWidth:"1px",borderStyle:"solid",borderColor:"success"===e.type?"rgba(16, 185, 129, 0.2)":"rgba(239, 68, 68, 0.2)"},children:["success"===e.type?"✅":"❌"," ",e.message]})}function m({icon:e,title:r,subtitle:t}){return(0,n.jsxs)("div",{style:{marginBottom:"2rem",paddingBottom:"1.5rem",borderBottom:"1px solid var(--border)"},children:[(0,n.jsxs)("h2",{style:{margin:0,fontSize:"1.25rem",fontWeight:600},children:[e," ",r]}),(0,n.jsx)("p",{style:{margin:"0.25rem 0 0",color:"var(--text-secondary)",fontSize:"0.875rem"},children:t})]})}function g({onClick:e,disabled:r,isPending:t,label:i="Save"}){return(0,n.jsx)("button",{onClick:e,disabled:r,style:{padding:"0.75rem 1.5rem",fontSize:"0.9375rem",fontWeight:600,borderRadius:"10px",border:"none",cursor:r?"not-allowed":"pointer",background:r?"var(--bg-hover)":"linear-gradient(135deg, var(--gradient-start), var(--gradient-end))",color:r?"var(--text-secondary)":"white",transition:"all 0.2s ease",boxShadow:r?"none":"0 4px 12px rgba(99, 102, 241, 0.25)"},children:t?"\uD83D\uDCBE Saving...":`💾 ${i}`})}function h({onClick:e}){return(0,n.jsx)("button",{onClick:e,style:{padding:"0.5rem",background:"transparent",border:"1px solid var(--border)",borderRadius:"8px",color:"var(--text-secondary)",cursor:"pointer",transition:"all 0.2s",lineHeight:1},title:"Remove",children:"✕"})}},9325:(e,r,t)=>{"use strict";t.d(r,{URSClient:()=>u});var n=t(5155),i=t(2115),a=t(3321),s=t(8500),l=t.n(s),o=t(6444),d=t(3987),c=t(7948);function u({urs:e,isNew:r=!1,linkedFS:s=[],allFS:u=[]}){let g=(0,a.useRouter)(),[h,x]=(0,i.useState)(r),[v,y]=(0,i.useState)(e?.title||""),[b,f]=(0,i.useState)(e?.status||"draft"),[j,S]=(0,i.useState)(e?.priority||"high"),[w,C]=(0,i.useState)(e?.owner||""),[z,B]=(0,i.useState)(e?.category||""),[k,W]=(0,i.useState)(e?.business_need||""),[_,N]=(0,i.useState)(e?.acceptance_criteria||[""]),[R,I]=(0,i.useState)(s.map(e=>e.id)),[F,E]=(0,i.useState)(null),[T,$]=(0,i.useState)({type:"idle"}),[L,q]=(0,i.useTransition)();return!h&&e?(0,n.jsxs)("div",{className:"card",style:{maxWidth:"900px"},children:[(0,n.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"2rem",paddingBottom:"1.5rem",borderBottom:"1px solid var(--border)"},children:[(0,n.jsxs)("div",{children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"1rem",marginBottom:"0.5rem"},children:[(0,n.jsx)("span",{style:{fontSize:"0.75rem",fontWeight:600,padding:"0.25rem 0.75rem",background:"linear-gradient(135deg, var(--gradient-start), var(--gradient-end))",borderRadius:"6px",color:"white"},children:e.id}),(0,n.jsxs)("span",{className:`badge ${"approved"===e.status?"badge-success":"review"===e.status?"badge-warning":""}`,style:{textTransform:"capitalize"},children:["approved"===e.status?"✅":"review"===e.status?"\uD83D\uDC40":"\uD83D\uDCDD"," ",e.status]})]}),(0,n.jsx)("h1",{style:{margin:0,fontSize:"1.5rem",fontWeight:600,lineHeight:1.3},children:e.title})]}),(0,n.jsxs)("button",{onClick:()=>x(!0),className:"btn btn-primary",style:{display:"flex",gap:"0.5rem",alignItems:"center"},children:[(0,n.jsx)("span",{children:"✏️"})," Edit"]})]}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, 1fr)",gap:"1rem",marginBottom:"1.5rem"},children:[(0,n.jsx)(p,{label:"Priority",value:e.priority,color:function(e){switch(e){case"critical":return"#ef4444";case"high":return"#f97316";case"medium":return"#f59e0b";case"low":return"#10b981";default:return"var(--text-primary)"}}(e.priority)}),(0,n.jsx)(p,{label:"Category",value:e.category}),(0,n.jsx)(p,{label:"Owner",value:e.owner}),(0,n.jsx)(p,{label:"Created",value:e.created_at?new Date(e.created_at).toLocaleDateString():void 0})]}),(0,n.jsx)(m,{label:"Linked Functional Specs",count:s.length,children:s.length>0?(0,n.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.5rem"},children:s.map(e=>(0,n.jsx)(l(),{href:`/traceability/fs/${e.id}`,style:{textDecoration:"none"},children:(0,n.jsx)("span",{className:"badge",style:{background:"rgba(245, 158, 11, 0.15)",color:"var(--warning)"},children:e.id})},e.id))}):(0,n.jsx)("span",{style:{color:"var(--text-secondary)",fontStyle:"italic"},children:"No linked FS"})}),(0,n.jsx)(m,{label:"Business Need",children:e.business_need?(0,n.jsx)("div",{className:"prose",children:(0,n.jsx)(o.oz,{children:e.business_need})}):(0,n.jsx)("span",{style:{color:"var(--text-secondary)",fontStyle:"italic"},children:"No business need specified"})}),e.acceptance_criteria&&e.acceptance_criteria.length>0&&(0,n.jsx)(m,{label:"Acceptance Criteria",count:e.acceptance_criteria.length,children:(0,n.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:e.acceptance_criteria.map((e,r)=>(0,n.jsxs)("div",{style:{display:"flex",gap:"0.75rem",alignItems:"flex-start"},children:[(0,n.jsxs)("span",{style:{color:"var(--accent)",fontWeight:600,fontSize:"0.875rem",minWidth:"24px"},children:[r+1,"."]}),(0,n.jsx)("span",{style:{lineHeight:1.6},children:e})]},r))})})]}):(0,n.jsxs)("div",{className:"card",style:{maxWidth:"900px"},children:[(0,n.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"2rem",paddingBottom:"1.5rem",borderBottom:"1px solid var(--border)"},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{style:{margin:0,fontSize:"1.25rem",fontWeight:600},children:r?"New User Requirement":`Editing ${e?.id}`}),(0,n.jsx)("p",{style:{margin:"0.25rem 0 0",color:"var(--text-secondary)",fontSize:"0.875rem"},children:r?"Create a new URS document":"Update requirement details"})]}),(0,n.jsxs)("div",{style:{display:"flex",gap:"0.75rem"},children:[(0,n.jsx)("button",{onClick:()=>{r?g.back():(y(e?.title||""),f(e?.status||"draft"),S(e?.priority||"high"),C(e?.owner||""),B(e?.category||""),W(e?.business_need||""),N(e?.acceptance_criteria||[""]),I(s.map(e=>e.id)),x(!1))},style:{padding:"0.75rem 1.5rem",background:"transparent",border:"1px solid var(--border)",borderRadius:"10px",color:"var(--text-secondary)",cursor:"pointer",fontWeight:600},children:"Cancel"}),(0,n.jsx)(c.yY,{onClick:()=>{$({type:"idle"}),q(async()=>{try{let n,i={title:v,status:b,priority:j,owner:w,category:z,business_need:k,intended_use:"",acceptance_criteria:_.filter(e=>e.trim()),regulatory_refs:[]};if(r||e.id,r){let{saveURS:e}=await t.e(570).then(t.bind(t,570));n=await e(i)}else{let{updateURSAction:r}=await t.e(570).then(t.bind(t,570));n=await r(e.id,i)}if(!n.success)return void $({type:"error",message:n.error});let a=n.id,{updateFSLinksAction:l}=await t.e(570).then(t.bind(t,570)),o=s.map(e=>e.id);for(let e of new Set([...o,...R])){let r=u.find(r=>r.id===e);if(!r)continue;let t=new Set(r.urs_ids);R.includes(e)?t.add(a):t.delete(a),await l(e,Array.from(t))}$({type:"success",message:`Saved ${a}`}),r?g.push(`/traceability/urs/${a}`):(g.refresh(),x(!1))}catch(e){$({type:"error",message:"Failed to save"})}})},disabled:L||!v.trim()||!w.trim(),isPending:L,label:"Save URS"})]})]}),(0,n.jsx)(c.t3,{status:T}),(0,n.jsx)(c.zB,{label:"Title",required:!0,children:(0,n.jsx)("input",{type:"text",value:v,onChange:e=>y(e.target.value),onFocus:()=>E("title"),onBlur:()=>E(null),placeholder:"e.g., User Authentication Requirements",style:(0,c.wI)("title",F)})}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, 1fr)",gap:"1rem",marginBottom:"1.5rem"},children:[(0,n.jsx)(c.zB,{label:"Status",compact:!0,children:(0,n.jsxs)("select",{value:b,onChange:e=>f(e.target.value),onFocus:()=>E("status"),onBlur:()=>E(null),style:(0,c.mQ)("status",F),children:[(0,n.jsx)("option",{value:"draft",children:"\uD83D\uDCDD Draft"}),(0,n.jsx)("option",{value:"review",children:"\uD83D\uDC40 Review"}),(0,n.jsx)("option",{value:"approved",children:"✅ Approved"})]})}),(0,n.jsx)(c.zB,{label:"Priority",compact:!0,children:(0,n.jsxs)("select",{value:j,onChange:e=>S(e.target.value),onFocus:()=>E("priority"),onBlur:()=>E(null),style:(0,c.mQ)("priority",F),children:[(0,n.jsx)("option",{value:"critical",children:"\uD83D\uDD34 Critical"}),(0,n.jsx)("option",{value:"high",children:"\uD83D\uDFE0 High"}),(0,n.jsx)("option",{value:"medium",children:"\uD83D\uDFE1 Medium"}),(0,n.jsx)("option",{value:"low",children:"\uD83D\uDFE2 Low"})]})}),(0,n.jsx)(c.zB,{label:"Category",compact:!0,children:(0,n.jsx)("input",{type:"text",value:z,onChange:e=>B(e.target.value),onFocus:()=>E("category"),onBlur:()=>E(null),placeholder:"e.g., Security",style:(0,c.wI)("category",F)})}),(0,n.jsx)(c.zB,{label:"Owner",required:!0,compact:!0,children:(0,n.jsx)("input",{type:"text",value:w,onChange:e=>C(e.target.value),onFocus:()=>E("owner"),onBlur:()=>E(null),placeholder:"e.g., Product Team",style:(0,c.wI)("owner",F)})})]}),(0,n.jsx)(c.zB,{label:"Linked Functional Specs",hint:"Select FS that implement this requirement",children:(0,n.jsx)(d.j,{options:u.map(e=>({value:e.id,label:`${e.id} - ${e.title}`})),selected:R,onChange:I,placeholder:"Search FS...",multi:!0})}),(0,n.jsx)(c.zB,{label:"Business Need",hint:"Describe why this requirement exists",children:(0,n.jsx)("textarea",{value:k,onChange:e=>W(e.target.value),onFocus:()=>E("businessNeed"),onBlur:()=>E(null),placeholder:"Describe the business problem this requirement addresses...",style:{...(0,c.KN)("businessNeed",F),minHeight:"140px"}})}),(0,n.jsx)(c.zB,{label:"Acceptance Criteria",hint:"Define measurable conditions for success",action:{label:"+ Add Criterion",onClick:()=>N([..._,""])},children:(0,n.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:_.map((e,r)=>(0,n.jsxs)("div",{style:{display:"flex",gap:"0.75rem",alignItems:"center"},children:[(0,n.jsxs)("span",{style:{color:"var(--accent)",fontWeight:600,fontSize:"0.875rem",minWidth:"24px"},children:[r+1,"."]}),(0,n.jsx)("input",{type:"text",value:e,onChange:e=>{var t;let n;return t=e.target.value,void((n=[..._])[r]=t,N(n))},onFocus:()=>E(`criterion-${r}`),onBlur:()=>E(null),placeholder:`Criterion ${r+1}`,style:{...(0,c.wI)(`criterion-${r}`,F),flex:1}}),_.length>1&&(0,n.jsx)("button",{onClick:()=>{_.length>1&&N(_.filter((e,t)=>t!==r))},style:{padding:"0.5rem",background:"transparent",border:"1px solid var(--border)",borderRadius:"8px",color:"var(--text-secondary)",cursor:"pointer"},children:"✕"})]},r))})})]})}function p({label:e,value:r,color:t}){return(0,n.jsxs)("div",{children:[(0,n.jsx)("div",{style:{fontSize:"0.75rem",color:"var(--text-secondary)",fontWeight:500,marginBottom:"0.25rem"},children:e}),(0,n.jsx)("div",{style:{fontSize:"1rem",fontWeight:500,textTransform:"capitalize",color:t||"var(--text-primary)"},children:r||"—"})]})}function m({label:e,count:r,children:t}){return(0,n.jsxs)("div",{style:{marginBottom:"1.5rem"},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem",marginBottom:"0.5rem"},children:[(0,n.jsx)("label",{style:{fontWeight:500,fontSize:"0.875rem",color:"var(--text-secondary)"},children:e}),void 0!==r&&(0,n.jsx)("span",{style:{fontSize:"0.75rem",padding:"0.125rem 0.5rem",background:"var(--bg-hover)",borderRadius:"9999px"},children:r})]}),(0,n.jsx)("div",{style:{lineHeight:1.7},children:t})]})}}},e=>{e.O(0,[500,380,441,794,358],()=>e(e.s=1704)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[200,252,409,974],{2318:(e,s,_)=>{Promise.resolve().then(_.t.bind(_,8500,23))}},e=>{e.O(0,[500,441,794,358],()=>e(e.s=2318)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e,t,r,o,n,i,a,u,l={},c={};function s(e){var t=c[e];if(void 0!==t)return t.exports;var r=c[e]={exports:{}},o=!0;try{l[e].call(r.exports,r,r.exports,s),o=!1}finally{o&&delete c[e]}return r.exports}s.m=l,e=[],s.O=(t,r,o,n)=>{if(r){n=n||0;for(var i=e.length;i>0&&e[i-1][2]>n;i--)e[i]=e[i-1];e[i]=[r,o,n];return}for(var a=1/0,i=0;i<e.length;i++){for(var[r,o,n]=e[i],u=!0,l=0;l<r.length;l++)(!1&n||a>=n)&&Object.keys(s.O).every(e=>s.O[e](r[l]))?r.splice(l--,1):(u=!1,n<a&&(a=n));if(u){e.splice(i--,1);var c=o();void 0!==c&&(t=c)}}return t},s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,s.t=function(e,o){if(1&o&&(e=this(e)),8&o||"object"==typeof e&&e&&(4&o&&e.__esModule||16&o&&"function"==typeof e.then))return e;var n=Object.create(null);s.r(n);var i={};t=t||[null,r({}),r([]),r(r)];for(var a=2&o&&e;"object"==typeof a&&!~t.indexOf(a);a=r(a))Object.getOwnPropertyNames(a).forEach(t=>i[t]=()=>e[t]);return i.default=()=>e,s.d(n,i),n},s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce((t,r)=>(s.f[r](e,t),t),[])),s.u=e=>"static/chunks/"+e+".8b785c606c1c3e1f.js",s.miniCssF=e=>{},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},s.l=(e,t,r,n)=>{if(o[e])return void o[e].push(t);if(void 0!==r)for(var i,a,u=document.getElementsByTagName("script"),l=0;l<u.length;l++){var c=u[l];if(c.getAttribute("src")==e||c.getAttribute("data-webpack")=="_N_E:"+r){i=c;break}}i||(a=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,s.nc&&i.setAttribute("nonce",s.nc),i.setAttribute("data-webpack","_N_E:"+r),i.src=s.tu(e)),o[e]=[t];var f=(t,r)=>{i.onerror=i.onload=null,clearTimeout(d);var n=o[e];if(delete o[e],i.parentNode&&i.parentNode.removeChild(i),n&&n.forEach(e=>e(r)),t)return t(r)},d=setTimeout(f.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=f.bind(null,i.onerror),i.onload=f.bind(null,i.onload),a&&document.head.appendChild(i)},s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.tt=()=>(void 0===n&&(n={createScriptURL:e=>e},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(n=trustedTypes.createPolicy("nextjs#bundler",n))),n),s.tu=e=>s.tt().createScriptURL(e),s.p="/_next/",i={68:0,334:0},s.f.j=(e,t)=>{var r=s.o(i,e)?i[e]:void 0;if(0!==r)if(r)t.push(r[2]);else if(/^(334|68)$/.test(e))i[e]=0;else{var o=new Promise((t,o)=>r=i[e]=[t,o]);t.push(r[2]=o);var n=s.p+s.u(e),a=Error();s.l(n,t=>{if(s.o(i,e)&&(0!==(r=i[e])&&(i[e]=void 0),r)){var o=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;a.message="Loading chunk "+e+" failed.\n("+o+": "+n+")",a.name="ChunkLoadError",a.type=o,a.request=n,r[1](a)}},"chunk-"+e,e)}},s.O.j=e=>0===i[e],a=(e,t)=>{var r,o,[n,a,u]=t,l=0;if(n.some(e=>0!==i[e])){for(r in a)s.o(a,r)&&(s.m[r]=a[r]);if(u)var c=u(s)}for(e&&e(t);l<n.length;l++)o=n[l],s.o(i,o)&&i[o]&&i[o][0](),i[o]=0;return s.O(c)},(u=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(a.bind(null,0)),u.push=a.bind(null,u.push.bind(u))})();
@@ -1 +1 @@
1
- /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.isolate{isolation:isolate}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.shrink{flex-shrink:1}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.resize{resize:both}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.italic{font-style:italic}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)}.ring,.shadow{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}}:root{--bg-primary:#0a0a0f;--bg-secondary:#12121a;--bg-card:#1a1a24;--bg-hover:#22222e;--border:#2a2a3a;--text-primary:#f0f0f5;--text-secondary:#8888a0;--accent:#6366f1;--accent-hover:#7c7ff2;--success:#10b981;--warning:#f59e0b;--error:#ef4444;--gradient-start:#6366f1;--gradient-end:#8b5cf6}*{box-sizing:border-box;margin:0;padding:0}body{background:var(--bg-primary);color:var(--text-primary);min-height:100vh;font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;line-height:1.6}a{color:var(--accent);text-decoration:none;transition:color .2s}a:hover{color:var(--accent-hover)}.app{min-height:100vh;display:flex}.sidebar{background:var(--bg-secondary);border-right:1px solid var(--border);width:240px;height:100vh;padding:1.5rem;position:fixed;overflow-y:auto}.sidebar-logo{background:linear-gradient(135deg,var(--gradient-start),var(--gradient-end));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;margin-bottom:2rem;font-size:1.25rem;font-weight:700}.nav-list{list-style:none}.nav-item{margin-bottom:.25rem}.nav-link{color:var(--text-secondary);border-radius:8px;align-items:center;gap:.75rem;padding:.75rem 1rem;transition:all .2s;display:flex}.nav-link.active,.nav-link:hover{background:var(--bg-hover);color:var(--text-primary)}.main-content{flex:1;margin-left:240px;padding:2rem}.page-header{margin-bottom:2rem}.page-title{margin-bottom:.5rem;font-size:1.75rem;font-weight:600}.page-subtitle{color:var(--text-secondary)}.card{background:var(--bg-card);border:1px solid var(--border);border-radius:12px;margin-bottom:1.5rem;padding:1.5rem}.card-title{margin-bottom:1rem;font-size:1rem;font-weight:600}.btn{cursor:pointer;border:none;border-radius:8px;align-items:center;gap:.5rem;padding:.625rem 1.25rem;font-size:.875rem;font-weight:500;transition:all .2s;display:inline-flex}.btn-primary{background:linear-gradient(135deg,var(--gradient-start),var(--gradient-end));color:#fff}.btn-primary:hover{transform:translateY(-1px);box-shadow:0 4px 12px #6366f14d}.stats-grid{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem;margin-bottom:2rem;display:grid}.stat-card{background:var(--bg-card);border:1px solid var(--border);border-radius:12px;padding:1.25rem}.stat-value{background:linear-gradient(135deg,var(--gradient-start),var(--gradient-end));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;font-size:2rem;font-weight:700}.stat-label{color:var(--text-secondary);font-size:.875rem}.badge{border-radius:9999px;align-items:center;padding:.25rem .75rem;font-size:.75rem;font-weight:500;display:inline-flex}.badge-success{color:var(--success);background:#10b98126}.badge-warning{color:var(--warning);background:#f59e0b26}.badge-error{color:var(--error);background:#ef444426}.table{border-collapse:collapse;width:100%}.table td,.table th{text-align:left;border-bottom:1px solid var(--border);padding:.75rem 1rem}.table th{color:var(--text-secondary);font-size:.875rem;font-weight:500}.table tbody tr:hover{background:var(--bg-hover)}.step-palette{background:var(--bg-secondary);border:1px solid var(--border);border-radius:12px;height:calc(100vh - 200px);padding:1rem;overflow-y:auto}.step-item{background:var(--bg-card);border:1px solid var(--border);cursor:grab;border-radius:8px;margin-bottom:.5rem;padding:.75rem 1rem;transition:all .2s}.step-item:hover{border-color:var(--accent);transform:translate(4px)}.step-type{text-transform:uppercase;margin-bottom:.25rem;font-size:.75rem;font-weight:600}.step-type-given{color:#10b981}.step-type-when{color:#f59e0b}.step-type-then{color:#6366f1}.builder-canvas{background:var(--bg-card);border:2px dashed var(--border);border-radius:12px;min-height:400px;padding:1.5rem}.gherkin-preview{background:#1e1e2e;border-radius:8px;padding:1rem;font-family:JetBrains Mono,monospace;font-size:.875rem;line-height:1.8}.gherkin-keyword{color:#c678dd;font-weight:600}.kanban-board{grid-template-columns:repeat(4,1fr);gap:1rem;display:grid}.kanban-column{background:var(--bg-secondary);border-radius:12px;padding:1rem}.kanban-header{align-items:center;gap:.5rem;margin-bottom:1rem;font-weight:600;display:flex}.kanban-count{border-radius:9999px;padding:.125rem .5rem;font-size:.75rem}.kanban-count,.list-row:hover{background:var(--bg-hover)}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
1
+ /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.isolate{isolation:isolate}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.shrink{flex-shrink:1}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.resize{resize:both}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.italic{font-style:italic}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)}.ring,.shadow{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}}:root{--bg-primary:#0a0a0f;--bg-secondary:#12121a;--bg-card:#1a1a24;--bg-hover:#22222e;--border:#2a2a3a;--text-primary:#f0f0f5;--text-secondary:#8888a0;--accent:#6366f1;--accent-hover:#7c7ff2;--success:#10b981;--warning:#f59e0b;--error:#ef4444;--gradient-start:#6366f1;--gradient-end:#8b5cf6}*{box-sizing:border-box;margin:0;padding:0}body{background:var(--bg-primary);color:var(--text-primary);min-height:100vh;font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;line-height:1.6}a{color:var(--accent);text-decoration:none;transition:color .2s}a:hover{color:var(--accent-hover)}.app{min-height:100vh;display:flex}.sidebar{background:var(--bg-secondary);border-right:1px solid var(--border);width:240px;height:100vh;padding:1.5rem;position:fixed;overflow-y:auto}.sidebar-logo{background:linear-gradient(135deg,var(--gradient-start),var(--gradient-end));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;margin-bottom:2rem;font-size:1.25rem;font-weight:700}.nav-list{list-style:none}.nav-item{margin-bottom:.25rem}.nav-link{color:var(--text-secondary);border-radius:8px;align-items:center;gap:.75rem;padding:.75rem 1rem;transition:all .2s;display:flex}.nav-link.active,.nav-link:hover{background:var(--bg-hover);color:var(--text-primary)}.main-content{flex:1;margin-left:240px;padding:2rem}.page-header{margin-bottom:2rem}.page-title{margin-bottom:.5rem;font-size:1.75rem;font-weight:600}.page-subtitle{color:var(--text-secondary)}.card{background:var(--bg-card);border:1px solid var(--border);border-radius:12px;margin-bottom:1.5rem;padding:1.5rem}.card-title{margin-bottom:1rem;font-size:1rem;font-weight:600}.btn{cursor:pointer;border:none;border-radius:8px;align-items:center;gap:.5rem;padding:.625rem 1.25rem;font-size:.875rem;font-weight:500;transition:all .2s;display:inline-flex}.btn-primary{background:linear-gradient(135deg,var(--gradient-start),var(--gradient-end));color:#fff}.btn-primary:hover{transform:translateY(-1px);box-shadow:0 4px 12px #6366f14d}.stats-grid{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem;margin-bottom:2rem;display:grid}.stat-card{background:var(--bg-card);border:1px solid var(--border);border-radius:12px;padding:1.25rem}.stat-value{background:linear-gradient(135deg,var(--gradient-start),var(--gradient-end));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;font-size:2rem;font-weight:700}.stat-label{color:var(--text-secondary);font-size:.875rem}.badge{border-radius:9999px;align-items:center;padding:.25rem .75rem;font-size:.75rem;font-weight:500;display:inline-flex}.badge-success{color:var(--success);background:#10b98126}.badge-warning{color:var(--warning);background:#f59e0b26}.badge-error{color:var(--error);background:#ef444426}.table{border-collapse:collapse;width:100%}.table td,.table th{text-align:left;border-bottom:1px solid var(--border);padding:.75rem 1rem}.table th{color:var(--text-secondary);font-size:.875rem;font-weight:500}.table tbody tr:hover{background:var(--bg-hover)}.step-palette{background:var(--bg-secondary);border:1px solid var(--border);border-radius:12px;height:calc(100vh - 200px);padding:1rem;overflow-y:auto}.step-item{background:var(--bg-card);border:1px solid var(--border);cursor:grab;border-radius:8px;margin-bottom:.5rem;padding:.75rem 1rem;transition:all .2s}.step-item:hover{border-color:var(--accent);transform:translate(4px)}.step-type{text-transform:uppercase;margin-bottom:.25rem;font-size:.75rem;font-weight:600}.step-type-given{color:#10b981}.step-type-when{color:#f59e0b}.step-type-then{color:#6366f1}.builder-canvas{background:var(--bg-card);border:2px dashed var(--border);border-radius:12px;min-height:400px;padding:1.5rem}.gherkin-preview{background:#1e1e2e;border-radius:8px;padding:1rem;font-family:JetBrains Mono,monospace;font-size:.875rem;line-height:1.8}.gherkin-keyword{color:#c678dd;font-weight:600}.kanban-board{grid-template-columns:repeat(4,1fr);gap:1rem;display:grid}.kanban-column{background:var(--bg-secondary);border-radius:12px;padding:1rem}.kanban-header{align-items:center;gap:.5rem;margin-bottom:1rem;font-weight:600;display:flex}.kanban-count{border-radius:9999px;padding:.125rem .5rem;font-size:.75rem}.kanban-count,.list-row:hover{background:var(--bg-hover)}.prose h1{margin-top:0!important;margin-bottom:.75rem!important;font-size:1.75rem!important;font-weight:700!important}.prose h2{font-size:1.5rem!important}.prose h2,.prose h3{margin-top:0!important;margin-bottom:.5rem!important;font-weight:600!important}.prose h3{font-size:1.25rem!important}.prose p{margin-top:0!important;margin-bottom:.75rem!important}.prose ul{list-style-type:disc!important}.prose ol,.prose ul{margin-bottom:.75rem!important;margin-left:1.5rem!important}.prose ol{list-style-type:decimal!important}.prose li{margin-bottom:.25rem!important}.prose code{border-radius:4px!important;padding:.125rem .375rem!important;font-size:.9em!important}.prose code,.prose pre{background:var(--bg-hover)!important}.prose pre{border-radius:8px!important;margin-bottom:.75rem!important;padding:1rem!important;overflow-x:auto!important}.prose blockquote{border-left:3px solid var(--accent)!important;color:var(--text-secondary)!important;margin:.75rem 0!important;padding-left:1rem!important}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
package/README.md CHANGED
@@ -21,7 +21,7 @@ This system implements **GAMP 5** and **V-Model** compliance by making specifica
21
21
  | Artifact | Storage | Purpose |
22
22
  |----------|---------|---------|
23
23
  | **URS** | SQLite DB | High-level business requirements |
24
- | **FS** | Gherkin `.requirement` files | Functional specs + test scenarios |
24
+ | **FS** | Gherkin `.feature` files | Functional specs + test scenarios |
25
25
  | **Risk** | SQLite DB | Risk assessments & mitigations |
26
26
  | **Release** | SQLite DB | Version management & test results |
27
27
 
@@ -63,7 +63,7 @@ Run `matrix sync` and the system creates a placeholder `URS-011` record. Fill in
63
63
 
64
64
  ### 2. Write Functional Specs (FS)
65
65
 
66
- Create `.requirement` files in `specs/fs/`:
66
+ Create `.feature` files in `specs/fs/`:
67
67
 
68
68
  ```gherkin
69
69
  @URS-001 @URS-002 @RISK-005
@@ -104,7 +104,7 @@ matrix sync
104
104
  ```
105
105
 
106
106
  **What sync does:**
107
- 1. Parses all `.requirement` files in `specs/fs/`
107
+ 1. Parses all `.feature` files in `specs/fs/`
108
108
  2. Updates database with Feature titles, descriptions, and scenarios
109
109
  3. Extracts `@URS` and `@RISK` tags
110
110
  4. Auto-creates stub records for any referenced IDs that don't exist
@@ -138,7 +138,7 @@ matrix release tag REL-001 --fs FS-001 FS-002 FS-003
138
138
  Execute Cucumber tests and export results:
139
139
 
140
140
  ```bash
141
- npx cucumber-js specs/fs/**/*.requirement --format json:results.json
141
+ npx cucumber-js specs/fs/**/*.feature --format json:results.json
142
142
  ```
143
143
 
144
144
  ### 4. Import Test Results
@@ -212,7 +212,7 @@ matrix release list
212
212
  |---------|-------------|
213
213
  | `matrix init` | Initialize a new specs directory |
214
214
  | `matrix serve` | Start the dashboard server |
215
- | `matrix sync` | Parse `.requirement` files and update database |
215
+ | `matrix sync` | Parse `.feature` files and update database |
216
216
  | `matrix search <query>` | Semantic search across specs |
217
217
 
218
218
  ### Release Commands
package/bin/cli.js CHANGED
@@ -2200,6 +2200,7 @@ var init_database = __esm(() => {
2200
2200
  // src/lib/database/fs-repo.ts
2201
2201
  var exports_fs_repo = {};
2202
2202
  __export(exports_fs_repo, {
2203
+ updateFSURSLinks: () => updateFSURSLinks,
2203
2204
  syncFS: () => syncFS,
2204
2205
  loadFSMetadata: () => loadFSMetadata,
2205
2206
  loadAllFSMetadata: () => loadAllFSMetadata,
@@ -2303,6 +2304,50 @@ function deleteFS(id) {
2303
2304
  const result = db2.query("DELETE FROM fs WHERE id = ?").run(id);
2304
2305
  return result.changes > 0;
2305
2306
  }
2307
+ function updateFSURSLinks(fsId, ursIds) {
2308
+ const db2 = getDb();
2309
+ const { readFileSync: readFileSync4, writeFileSync } = __require("fs");
2310
+ const row = db2.query("SELECT file_path FROM fs WHERE id = ?").get(fsId);
2311
+ if (!row)
2312
+ return false;
2313
+ const filePath = row.file_path;
2314
+ db2.query("DELETE FROM fs_urs_link WHERE fs_id = ?").run(fsId);
2315
+ for (const ursId of ursIds) {
2316
+ db2.query("INSERT OR IGNORE INTO fs_urs_link (fs_id, urs_id) VALUES (?, ?)").run(fsId, ursId);
2317
+ }
2318
+ try {
2319
+ const content = readFileSync4(filePath, "utf-8");
2320
+ const lines = content.split(`
2321
+ `);
2322
+ const riskLinks = db2.query("SELECT risk_id FROM risk_fs_link WHERE fs_id = ?").all(fsId);
2323
+ const riskTags = riskLinks.map((r) => `@${r.risk_id}`);
2324
+ const ursTags = ursIds.map((id) => `@${id}`);
2325
+ const allTags = [...ursTags, ...riskTags].join(" ");
2326
+ let featureLineIndex = lines.findIndex((l) => l.trim().startsWith("Feature:"));
2327
+ if (featureLineIndex === -1)
2328
+ return false;
2329
+ let startIndex = 0;
2330
+ for (let i = 0;i < featureLineIndex; i++) {
2331
+ if (lines[i].trim().startsWith("@")) {
2332
+ startIndex = i + 1;
2333
+ } else if (lines[i].trim() === "") {
2334
+ continue;
2335
+ } else {
2336
+ break;
2337
+ }
2338
+ }
2339
+ const newLines = [
2340
+ allTags,
2341
+ ...lines.slice(featureLineIndex)
2342
+ ];
2343
+ writeFileSync(filePath, newLines.join(`
2344
+ `), "utf-8");
2345
+ return true;
2346
+ } catch (err) {
2347
+ console.error("Failed to update FS file:", err);
2348
+ return false;
2349
+ }
2350
+ }
2306
2351
  var init_fs_repo = __esm(() => {
2307
2352
  init_database();
2308
2353
  });
@@ -2806,7 +2851,7 @@ function parseGherkinFS(content, filePath) {
2806
2851
  const featureMatch = featureLine?.match(/Feature:\s*(.+)/);
2807
2852
  const fullTitle = featureMatch?.[1] || basename(filePath);
2808
2853
  const idMatch = fullTitle.match(/^(FS-\d+)/);
2809
- const id = idMatch?.[1] || basename(filePath, ".requirement").toUpperCase();
2854
+ const id = idMatch?.[1] || basename(filePath, ".feature").toUpperCase();
2810
2855
  const featureIndex = lines.findIndex((l) => l.trim().startsWith("Feature:"));
2811
2856
  let description = "";
2812
2857
  const requirements = [];
@@ -3293,7 +3338,7 @@ async function syncCommand(config) {
3293
3338
  closeDb2();
3294
3339
  return;
3295
3340
  }
3296
- const fsFiles = readdirSync(fsDir).filter((f) => f.endsWith(".requirement"));
3341
+ const fsFiles = readdirSync(fsDir).filter((f) => f.endsWith(".feature"));
3297
3342
  console.log(`Syncing ${fsFiles.length} FS files...`);
3298
3343
  const fsItems = [];
3299
3344
  const referencedURS = new Set;
@@ -3372,10 +3417,6 @@ var EXAMPLE_FS = `@URS-001
3372
3417
  Feature: FS-001 Example Feature
3373
3418
  This is an example functional specification.
3374
3419
 
3375
- Requirements:
3376
- - FR-001.1: The system shall do something
3377
- - FR-001.2: The system shall do something else
3378
-
3379
3420
  Scenario: Example scenario
3380
3421
  Given a precondition exists
3381
3422
  When an action is performed
@@ -3396,16 +3437,16 @@ async function initCommand(config) {
3396
3437
  }
3397
3438
  }
3398
3439
  const fsDir = join5(config.specsDir, "fs");
3399
- const examplePath = join5(fsDir, "FS-001-example.requirement");
3440
+ const examplePath = join5(fsDir, "FS-001-example.feature");
3400
3441
  if (!existsSync5(examplePath)) {
3401
3442
  writeFileSync(examplePath, EXAMPLE_FS, "utf-8");
3402
- console.log(` ✓ Created example FS: FS-001-example.requirement`);
3443
+ console.log(` ✓ Created example FS: FS-001-example.feature`);
3403
3444
  }
3404
3445
  console.log("");
3405
3446
  console.log("✅ Specs directory initialized!");
3406
3447
  console.log("");
3407
3448
  console.log("Next steps:");
3408
- console.log(" 1. Edit specs/fs/*.requirement files");
3449
+ console.log(" 1. Edit specs/fs/*.feature files");
3409
3450
  console.log(" 2. Run `matrix sync` to index files");
3410
3451
  console.log(" 3. Run `matrix serve` to start the UI");
3411
3452
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nivora/matrix",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Requirements documentation system with semantic search",
5
5
  "type": "module",
6
6
  "bin": {