viba-cli 0.38.0 → 0.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +2 -2
  3. package/.next/fallback-build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +2 -2
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +2 -2
  14. package/.next/server/app/_not-found.rsc +3 -3
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/api/custom-scripts/route.js.nft.json +1 -1
  22. package/.next/server/app/api/git/action/route.js +1 -1
  23. package/.next/server/app/api/git/action/route.js.nft.json +1 -1
  24. package/.next/server/app/api/git/branches/route.js.nft.json +1 -1
  25. package/.next/server/app/api/git/diff/route.js.nft.json +1 -1
  26. package/.next/server/app/api/git/log/route.js.nft.json +1 -1
  27. package/.next/server/app/api/git/status/route.js.nft.json +1 -1
  28. package/.next/server/app/api/repos/clone/route.js +1 -1
  29. package/.next/server/app/api/repos/clone/route.js.nft.json +1 -1
  30. package/.next/server/app/api/repos/route.js.nft.json +1 -1
  31. package/.next/server/app/api/settings/route.js.nft.json +1 -1
  32. package/.next/server/app/credentials/page/server-reference-manifest.json +7 -7
  33. package/.next/server/app/credentials/page.js.nft.json +1 -1
  34. package/.next/server/app/credentials/page_client-reference-manifest.js +1 -1
  35. package/.next/server/app/credentials.html +2 -2
  36. package/.next/server/app/credentials.rsc +5 -5
  37. package/.next/server/app/credentials.segments/_full.segment.rsc +5 -5
  38. package/.next/server/app/credentials.segments/_head.segment.rsc +1 -1
  39. package/.next/server/app/credentials.segments/_index.segment.rsc +3 -3
  40. package/.next/server/app/credentials.segments/_tree.segment.rsc +2 -2
  41. package/.next/server/app/credentials.segments/credentials/__PAGE__.segment.rsc +2 -2
  42. package/.next/server/app/credentials.segments/credentials.segment.rsc +1 -1
  43. package/.next/server/app/git/changes/page.js.nft.json +1 -1
  44. package/.next/server/app/git/changes/page_client-reference-manifest.js +1 -1
  45. package/.next/server/app/git/changes.html +2 -2
  46. package/.next/server/app/git/changes.rsc +8 -8
  47. package/.next/server/app/git/changes.segments/_full.segment.rsc +8 -8
  48. package/.next/server/app/git/changes.segments/_head.segment.rsc +1 -1
  49. package/.next/server/app/git/changes.segments/_index.segment.rsc +3 -3
  50. package/.next/server/app/git/changes.segments/_tree.segment.rsc +2 -2
  51. package/.next/server/app/git/changes.segments/git/changes/__PAGE__.segment.rsc +2 -2
  52. package/.next/server/app/git/changes.segments/git/changes.segment.rsc +1 -1
  53. package/.next/server/app/git/changes.segments/git.segment.rsc +3 -3
  54. package/.next/server/app/git/custom-scripts/page.js.nft.json +1 -1
  55. package/.next/server/app/git/custom-scripts/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/git/custom-scripts.html +2 -2
  57. package/.next/server/app/git/custom-scripts.rsc +7 -7
  58. package/.next/server/app/git/custom-scripts.segments/_full.segment.rsc +7 -7
  59. package/.next/server/app/git/custom-scripts.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/git/custom-scripts.segments/_index.segment.rsc +3 -3
  61. package/.next/server/app/git/custom-scripts.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/git/custom-scripts.segments/git/custom-scripts/__PAGE__.segment.rsc +2 -2
  63. package/.next/server/app/git/custom-scripts.segments/git/custom-scripts.segment.rsc +1 -1
  64. package/.next/server/app/git/custom-scripts.segments/git.segment.rsc +3 -3
  65. package/.next/server/app/git/history/page.js.nft.json +1 -1
  66. package/.next/server/app/git/history/page_client-reference-manifest.js +1 -1
  67. package/.next/server/app/git/history.html +2 -2
  68. package/.next/server/app/git/history.rsc +8 -8
  69. package/.next/server/app/git/history.segments/_full.segment.rsc +8 -8
  70. package/.next/server/app/git/history.segments/_head.segment.rsc +1 -1
  71. package/.next/server/app/git/history.segments/_index.segment.rsc +3 -3
  72. package/.next/server/app/git/history.segments/_tree.segment.rsc +2 -2
  73. package/.next/server/app/git/history.segments/git/history/__PAGE__.segment.rsc +2 -2
  74. package/.next/server/app/git/history.segments/git/history.segment.rsc +1 -1
  75. package/.next/server/app/git/history.segments/git.segment.rsc +3 -3
  76. package/.next/server/app/git/page.js.nft.json +1 -1
  77. package/.next/server/app/git/page_client-reference-manifest.js +1 -1
  78. package/.next/server/app/git/stashes/page.js.nft.json +1 -1
  79. package/.next/server/app/git/stashes/page_client-reference-manifest.js +1 -1
  80. package/.next/server/app/git/stashes.html +2 -2
  81. package/.next/server/app/git/stashes.rsc +7 -7
  82. package/.next/server/app/git/stashes.segments/_full.segment.rsc +7 -7
  83. package/.next/server/app/git/stashes.segments/_head.segment.rsc +1 -1
  84. package/.next/server/app/git/stashes.segments/_index.segment.rsc +3 -3
  85. package/.next/server/app/git/stashes.segments/_tree.segment.rsc +2 -2
  86. package/.next/server/app/git/stashes.segments/git/stashes/__PAGE__.segment.rsc +2 -2
  87. package/.next/server/app/git/stashes.segments/git/stashes.segment.rsc +1 -1
  88. package/.next/server/app/git/stashes.segments/git.segment.rsc +3 -3
  89. package/.next/server/app/git.html +2 -2
  90. package/.next/server/app/git.rsc +8 -8
  91. package/.next/server/app/git.segments/_full.segment.rsc +8 -8
  92. package/.next/server/app/git.segments/_head.segment.rsc +1 -1
  93. package/.next/server/app/git.segments/_index.segment.rsc +3 -3
  94. package/.next/server/app/git.segments/_tree.segment.rsc +2 -2
  95. package/.next/server/app/git.segments/git/__PAGE__.segment.rsc +2 -2
  96. package/.next/server/app/git.segments/git.segment.rsc +3 -3
  97. package/.next/server/app/index.html +2 -2
  98. package/.next/server/app/index.rsc +5 -5
  99. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  100. package/.next/server/app/index.segments/_full.segment.rsc +5 -5
  101. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  102. package/.next/server/app/index.segments/_index.segment.rsc +3 -3
  103. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  104. package/.next/server/app/new/page/server-reference-manifest.json +29 -29
  105. package/.next/server/app/new/page.js.nft.json +1 -1
  106. package/.next/server/app/new/page_client-reference-manifest.js +1 -1
  107. package/.next/server/app/page/server-reference-manifest.json +29 -29
  108. package/.next/server/app/page.js.nft.json +1 -1
  109. package/.next/server/app/page_client-reference-manifest.js +1 -1
  110. package/.next/server/app/session/[sessionId]/page/server-reference-manifest.json +19 -19
  111. package/.next/server/app/session/[sessionId]/page.js.nft.json +1 -1
  112. package/.next/server/app/session/[sessionId]/page_client-reference-manifest.js +1 -1
  113. package/.next/server/chunks/[root-of-the-server]__01a6baa7._.js +1 -1
  114. package/.next/server/chunks/[root-of-the-server]__01a6baa7._.js.map +1 -1
  115. package/.next/server/chunks/{[root-of-the-server]__82d53572._.js → [root-of-the-server]__187f37c1._.js} +1 -1
  116. package/.next/server/chunks/{[root-of-the-server]__5349b858._.js → [root-of-the-server]__8de57231._.js} +1 -1
  117. package/.next/server/chunks/[root-of-the-server]__b17e6c62._.js +1 -1
  118. package/.next/server/chunks/[root-of-the-server]__b17e6c62._.js.map +1 -1
  119. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0002606b.js +1 -1
  120. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0002606b.js.map +1 -1
  121. package/.next/server/chunks/ssr/[root-of-the-server]__05b3451a._.js +1 -1
  122. package/.next/server/chunks/ssr/[root-of-the-server]__05b3451a._.js.map +1 -1
  123. package/.next/server/chunks/ssr/[root-of-the-server]__05e6fb4c._.js +1 -1
  124. package/.next/server/chunks/ssr/[root-of-the-server]__2798aa4d._.js +1 -1
  125. package/.next/server/chunks/ssr/[root-of-the-server]__2798aa4d._.js.map +1 -1
  126. package/.next/server/chunks/ssr/[root-of-the-server]__46af1502._.js +1 -1
  127. package/.next/server/chunks/ssr/[root-of-the-server]__46af1502._.js.map +1 -1
  128. package/.next/server/chunks/ssr/[root-of-the-server]__79a7a15d._.js +1 -1
  129. package/.next/server/chunks/ssr/[root-of-the-server]__79a7a15d._.js.map +1 -1
  130. package/.next/server/chunks/ssr/{_787bdec7._.js → _439918bb._.js} +2 -2
  131. package/.next/server/chunks/ssr/{_787bdec7._.js.map → _439918bb._.js.map} +1 -1
  132. package/.next/server/chunks/ssr/_476e86d1._.js +1 -1
  133. package/.next/server/chunks/ssr/{_e17414c3._.js → _4a66db4a._.js} +2 -2
  134. package/.next/server/chunks/ssr/{_e17414c3._.js.map → _4a66db4a._.js.map} +1 -1
  135. package/.next/server/chunks/ssr/_4d07d45e._.js +1 -1
  136. package/.next/server/chunks/ssr/_4d07d45e._.js.map +1 -1
  137. package/.next/server/chunks/ssr/{_2a7fa4b0._.js → _5147763c._.js} +2 -2
  138. package/.next/server/chunks/ssr/{_2a7fa4b0._.js.map → _5147763c._.js.map} +1 -1
  139. package/.next/server/chunks/ssr/_57f63a65._.js +1 -1
  140. package/.next/server/chunks/ssr/_57f63a65._.js.map +1 -1
  141. package/.next/server/chunks/ssr/_707e5fab._.js +1 -1
  142. package/.next/server/chunks/ssr/{_be721a9c._.js → _8d41d1fd._.js} +2 -2
  143. package/.next/server/chunks/ssr/{_be721a9c._.js.map → _8d41d1fd._.js.map} +1 -1
  144. package/.next/server/chunks/ssr/_9493de08._.js +1 -1
  145. package/.next/server/chunks/ssr/{_523ff032._.js → _9a7bd3c8._.js} +2 -2
  146. package/.next/server/chunks/ssr/{_523ff032._.js.map → _9a7bd3c8._.js.map} +1 -1
  147. package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js +1 -1
  148. package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js.map +1 -1
  149. package/.next/server/chunks/ssr/src_app_git_changes_page_tsx_f6dc28dc._.js +2 -2
  150. package/.next/server/chunks/ssr/src_app_git_changes_page_tsx_f6dc28dc._.js.map +1 -1
  151. package/.next/server/chunks/ssr/src_app_providers_tsx_2ae5be81._.js +1 -1
  152. package/.next/server/chunks/ssr/src_app_providers_tsx_2ae5be81._.js.map +1 -1
  153. package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js +1 -1
  154. package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js.map +1 -1
  155. package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js +1 -1
  156. package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js.map +1 -1
  157. package/.next/server/chunks/ssr/src_components_git_029e6e6f._.js +3 -0
  158. package/.next/server/chunks/ssr/src_components_git_029e6e6f._.js.map +1 -0
  159. package/.next/server/chunks/ssr/src_components_git_history-view_tsx_fd62126a._.js +4 -4
  160. package/.next/server/chunks/ssr/src_components_git_history-view_tsx_fd62126a._.js.map +1 -1
  161. package/.next/server/chunks/ssr/src_db5b513b._.js +3 -0
  162. package/.next/server/chunks/ssr/src_db5b513b._.js.map +1 -0
  163. package/.next/server/pages/404.html +2 -2
  164. package/.next/server/pages/500.html +2 -2
  165. package/.next/server/server-reference-manifest.js +1 -1
  166. package/.next/server/server-reference-manifest.json +48 -48
  167. package/.next/static/chunks/{4d93976ea0e8b685.js → 0ce2e7006253186a.js} +3 -3
  168. package/.next/static/chunks/{9f82d45ee88d5dc1.js → 0f9834bd2f6f4c6e.js} +2 -2
  169. package/.next/static/chunks/1958a10518af04a4.js +1 -0
  170. package/.next/static/chunks/3205a3bbc11c3146.css +1 -0
  171. package/.next/static/chunks/{ff0443d5f56a7060.js → 369aa92811a706db.js} +3 -3
  172. package/.next/static/chunks/4aab1f3ea2ed1aef.js +1 -0
  173. package/.next/static/chunks/5e0dada5236f9065.js +8 -0
  174. package/.next/static/chunks/{58e245f27f38e5ff.js → 73c13373731456db.js} +1 -1
  175. package/.next/static/chunks/977137e155012c13.js +1 -0
  176. package/.next/static/chunks/b18cc1247b979318.js +1 -0
  177. package/.next/static/chunks/b926978a88c43bac.js +3 -0
  178. package/.next/static/chunks/{bcc203fd591a3e1b.js → d09578ecf3b80b9d.js} +1 -1
  179. package/.next/static/chunks/d85a06040ea88b62.js +1 -0
  180. package/.next/static/chunks/{a29874cab09f6b0f.js → f7914ab5db08b8dd.js} +2 -2
  181. package/.next/static/chunks/{46c9f58659e11b7d.js → fa9e48c3aa7e4365.js} +1 -1
  182. package/package.json +1 -1
  183. package/.next/server/chunks/ssr/src_hooks_use-workspace-title_ts_9edd343b._.js +0 -3
  184. package/.next/server/chunks/ssr/src_hooks_use-workspace-title_ts_9edd343b._.js.map +0 -1
  185. package/.next/static/chunks/0eca2eff234acf1b.js +0 -1
  186. package/.next/static/chunks/47ad182e478611c4.css +0 -1
  187. package/.next/static/chunks/4b818f2593bc4300.js +0 -1
  188. package/.next/static/chunks/78859d33c5671d29.js +0 -8
  189. package/.next/static/chunks/94fb2462104985a8.js +0 -3
  190. package/.next/static/chunks/e152c322e888ccea.js +0 -1
  191. package/.next/static/chunks/fff7986d66d302cf.js +0 -1
  192. /package/.next/server/chunks/{[root-of-the-server]__82d53572._.js.map → [root-of-the-server]__187f37c1._.js.map} +0 -0
  193. /package/.next/server/chunks/{[root-of-the-server]__5349b858._.js.map → [root-of-the-server]__8de57231._.js.map} +0 -0
  194. /package/.next/static/{mx8z_YoNSm8FluLvondrw → gMV0bFe8zKqVaStUpkI04}/_buildManifest.js +0 -0
  195. /package/.next/static/{mx8z_YoNSm8FluLvondrw → gMV0bFe8zKqVaStUpkI04}/_clientMiddlewareManifest.json +0 -0
  196. /package/.next/static/{mx8z_YoNSm8FluLvondrw → gMV0bFe8zKqVaStUpkI04}/_ssgManifest.js +0 -0
@@ -0,0 +1,3 @@
1
+ module.exports=[3688,a=>{"use strict";var b=a.i(87924),c=a.i(65975),d=a.i(72131),e=a.i(13902),f=a.i(68114),g=a.i(15060),h=a.i(44544);function i({repoPath:a,filePath:i}){let{data:j,isLoading:k}=(0,c.useGitDiff)(a,i),l=(0,d.useRef)(null),[m,n]=(0,d.useState)(()=>!0),[o,p]=(0,d.useState)(null),q=o===i,{resolvedTheme:r}=(0,e.useTheme)();if((0,d.useEffect)(()=>{try{localStorage.setItem("git-web:diff-view-split",JSON.stringify(m))}catch(a){console.error("Failed to save split view preference:",a)}},[m]),(0,d.useEffect)(()=>{if(k)return;let a=requestAnimationFrame(()=>{l.current?.scrollTo({top:0,left:0})});return()=>cancelAnimationFrame(a)},[i,k]),k)return(0,b.jsx)("div",{className:"flex items-center justify-center p-8 h-full",children:(0,b.jsx)("span",{className:"loading loading-spinner text-base-content/50"})});if(!j)return(0,b.jsx)("div",{className:"flex items-center justify-center h-full opacity-50",children:"No diff available"});if((0,f.isImageFile)(i))return(0,b.jsxs)("div",{className:"flex flex-col h-full bg-base-100",children:[(0,b.jsx)("div",{className:"flex items-center justify-between px-4 h-[57px] border-b border-base-300 shrink-0 bg-base-100",children:(0,b.jsx)("span",{className:"text-sm font-mono truncate max-w-[70%]",title:i,children:i})}),(0,b.jsx)("div",{className:"flex-1 overflow-auto",children:(0,b.jsx)(h.ImageDiffView,{filePath:i,imageDiff:j.imageDiff})})]});if((0,f.isFileBinary)(i,j.left,j.right))return(0,b.jsxs)("div",{className:"flex flex-col h-full bg-base-100",children:[(0,b.jsx)("div",{className:"flex items-center justify-between px-4 h-[57px] border-b border-base-300 shrink-0 bg-base-100",children:(0,b.jsx)("span",{className:"text-sm font-mono truncate max-w-[70%]",title:i,children:i})}),(0,b.jsx)("div",{className:"flex-1 flex items-center justify-center opacity-50",children:"Binary file - diff not available"})]});let s=j.diff||"",t=s.length,u=(0,f.getChangedLineCountFromDiff)(s),v=t>102400||u>3e3;return(0,b.jsxs)("div",{className:"flex flex-col h-full bg-base-100",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between px-4 h-[57px] border-b border-base-300 shrink-0 bg-base-100",children:[(0,b.jsx)("span",{className:"text-sm font-mono truncate max-w-[70%]",title:i,children:i}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("label",{htmlFor:"split-view",className:"text-[10px] uppercase tracking-wider font-bold cursor-pointer opacity-70",children:"Split View"}),(0,b.jsx)("input",{type:"checkbox",id:"split-view",checked:m,onChange:a=>n(a.target.checked),className:"toggle toggle-sm toggle-primary"})]})]}),(0,b.jsx)("div",{ref:l,className:"flex-1 overflow-auto diff-viewer-wrapper",children:v&&!q?(0,b.jsxs)("div",{className:"flex flex-col items-center justify-center h-full gap-4 text-center p-4",children:[(0,b.jsx)("i",{className:"iconoir-warning-triangle text-[40px] text-warning","aria-hidden":"true"}),(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)("h3",{className:"font-bold text-lg",children:"Large Diff Detected"}),(0,b.jsxs)("p",{className:"opacity-70",children:["This diff is large (",Math.round(t/1024),"KB, ~",u," changed lines) and may freeze your browser if rendered."]})]}),(0,b.jsx)("button",{className:"btn btn-outline",onClick:()=>p(i),children:"Show Diff Anyway"})]}):(0,b.jsx)(g.GroupedDiffViewer,{oldValue:j.left||"",newValue:j.right||"",splitView:m,useDarkTheme:"dark"===r})})]})}a.s(["DiffView",()=>i])},41910,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(13902),e=a.i(65975),f=a.i(68114),g=a.i(15060),h=a.i(44544),i=a.i(96415);function j({status:a}){switch(a){case"A":return(0,b.jsx)("i",{className:"iconoir-plus-circle text-[16px] text-success","aria-hidden":"true"});case"D":return(0,b.jsx)("i",{className:"iconoir-minus-circle text-[16px] text-error","aria-hidden":"true"});case"M":return(0,b.jsx)("i",{className:"iconoir-edit-pencil text-[16px] text-warning","aria-hidden":"true"});default:return(0,b.jsx)("i",{className:"iconoir-page text-[16px] opacity-50","aria-hidden":"true"})}}function k({node:a,selectedFile:c,expandedFolders:d,onToggleFolder:e,onSelectFile:g,depth:h=0}){let i=Array.from(a.children.values()).sort((a,b)=>{let c=a.children.size>0,d=b.children.size>0;return c&&!d?-1:!c&&d?1:a.name.localeCompare(b.name)});return(0,b.jsx)(b.Fragment,{children:i.map(a=>{if(a.children.size>0){let f=d.has(a.path);return(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center gap-1 px-2 py-1.5 text-xs rounded cursor-pointer hover:bg-base-200 transition-colors opacity-80",style:{paddingLeft:`${12*h+8}px`},onClick:()=>e(a.path),title:a.path,children:[(0,b.jsx)("span",{className:"text-[10px] opacity-70",children:f?"▼":"▶"}),(0,b.jsx)("i",{className:"iconoir-folder text-[14px] opacity-70","aria-hidden":"true"}),(0,b.jsx)("span",{className:"truncate flex-1",children:a.name})]}),f&&(0,b.jsx)(k,{node:a,selectedFile:c,expandedFolders:d,onToggleFolder:e,onSelectFile:g,depth:h+1})]},a.path)}if(!a.file)return null;let i=a.file;return(0,b.jsxs)("div",{className:(0,f.cn)("flex items-center gap-2 px-2 py-1.5 text-xs rounded cursor-pointer hover:bg-base-200 transition-colors",c===i.path&&"bg-base-200 font-medium"),style:{paddingLeft:`${12*h+8}px`},onClick:()=>g(i.path),title:i.path,children:[(0,b.jsx)(j,{status:i.status}),(0,b.jsx)("span",{className:"truncate flex-1 font-mono",children:a.name})]},a.path)})})}var l=a.i(3688);function m({repoPath:a,commitHash:i,fromCommitHash:j,toCommitHash:k,filePath:l,splitView:m}){let{data:n,isLoading:o}=(0,e.useCommitFileDiff)(a,l,{commitHash:i,fromCommitHash:j,toCommitHash:k}),{resolvedTheme:p}=(0,d.useTheme)(),q=`${i??""}:${j??""}:${k??""}:${l}`,[r,s]=(0,c.useState)(null),t=r===q,u=(0,c.useRef)(null);if((0,c.useEffect)(()=>{let a=requestAnimationFrame(()=>{u.current?.scrollTo({top:0,left:0})});return()=>cancelAnimationFrame(a)},[l,i,j,k,o]),o)return(0,b.jsx)("div",{className:"flex items-center justify-center p-8",children:(0,b.jsx)("span",{className:"loading loading-spinner text-base-content/50"})});if(!n)return(0,b.jsx)("div",{className:"flex items-center justify-center p-8 opacity-50",children:"No diff available"});if((0,f.isImageFile)(l))return(0,b.jsx)(h.ImageDiffView,{filePath:l,imageDiff:n.imageDiff});if((0,f.isFileBinary)(l,n.left,n.right))return(0,b.jsx)("div",{className:"flex items-center justify-center p-8 opacity-50",children:"Binary file - diff not available"});let v=n.diff||"",w=v.length,x=(0,f.getChangedLineCountFromDiff)(v);return(w>102400||x>3e3)&&!t?(0,b.jsxs)("div",{className:"flex flex-col items-center justify-center h-full gap-4 text-center p-8",children:[(0,b.jsx)("i",{className:"iconoir-warning-triangle text-[32px] text-warning","aria-hidden":"true"}),(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)("h3",{className:"font-bold text-lg",children:"Large Diff Detected"}),(0,b.jsxs)("p",{className:"opacity-70",children:["This diff is large (",Math.round(w/1024),"KB, ~",x," changed lines) and may freeze your browser if rendered."]})]}),(0,b.jsx)("button",{className:"btn btn-outline",onClick:()=>s(q),children:"Show Diff Anyway"})]}):(0,b.jsx)("div",{ref:u,className:"overflow-auto h-full",children:(0,b.jsx)(g.GroupedDiffViewer,{oldValue:n.left||"",newValue:n.right||"",splitView:m,useDarkTheme:"dark"===p})})}function n({repoPath:a,commitHash:d=null,fromCommitHash:g=null,toCommitHash:h=null,showWorkingTreeWhenNoCommit:j=!1,fileListWidthClass:n="w-64"}){let o=!!g&&!!h,p=j&&!d&&!g&&!h,q=p?"working-tree":o?`${g}..${h}`:d??"none",{data:r,isLoading:s}=(0,e.useCommitDiff)(a,{commitHash:d,fromCommitHash:g,toCommitHash:h}),{data:t,isLoading:u}=(0,e.useGitStatus)(a),v=t?.files,[w,x]=(0,c.useState)({}),[y,z]=(0,c.useState)(!1),[A,B]=(0,c.useState)({}),C=(0,c.useMemo)(()=>{if(!v||0===v.length)return[];let a=new Map;for(let b of v){let c=[(b.index||"").trim(),(b.working_dir||"").trim()].find(a=>["A","D","R","M"].includes(a))||"M";a.set(b.path,{path:b.path,additions:0,deletions:0,status:c})}return Array.from(a.values())},[v]),D=(0,c.useMemo)(()=>p?C:r?.files??[],[p,C,r?.files]),E=(0,c.useMemo)(()=>(function(a){let b={name:"",path:"",children:new Map};for(let c of a){let a=c.path.split("/").filter(Boolean),d=b,e="";for(let b=0;b<a.length;b++){let f=a[b];e=e?`${e}/${f}`:f,d.children.has(f)||d.children.set(f,{name:f,path:e,children:new Map}),d=d.children.get(f),b===a.length-1&&(d.file=c)}}return b})(D),[D]),F=(0,c.useMemo)(()=>(function a(b){let c=[];return Array.from(b.children.values()).forEach(b=>{b.children.size>0&&(c.push(b.path),c.push(...a(b)))}),c})(E),[E]),G=(0,c.useMemo)(()=>A[q]??new Set,[A,q]),[H,I]=(0,c.useState)(()=>!0),J=(0,c.useRef)(null),K=(0,c.useMemo)(()=>{if(0===D.length)return null;let a=w[q]??null;return a&&D.some(b=>b.path===a)?a:D[0].path},[D,w,q]),L=(0,c.useCallback)(a=>{x(b=>(b[q]??null)===a?b:{...b,[q]:a})},[q]);(0,c.useEffect)(()=>{try{localStorage.setItem("git-web:diff-view-split",JSON.stringify(H))}catch(a){console.error("Failed to save split view preference:",a)}},[H]),(0,c.useEffect)(()=>{if(!K)return;let a=requestAnimationFrame(()=>{J.current?.scrollTo({top:0,left:0})});return()=>cancelAnimationFrame(a)},[K,q]),(0,i.useEscapeDismiss)(y,()=>z(!1)),(0,c.useEffect)(()=>{if(!y)return;let a=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=a}},[y]);let M=(0,c.useMemo)(()=>{let a=new Set;return F.forEach(b=>{G.has(b)||a.add(b)}),K&&(function(a){let b=a.split("/").filter(Boolean),c=[];for(let a=1;a<b.length;a++)c.push(b.slice(0,a).join("/"));return c})(K).forEach(b=>a.add(b)),a},[F,G,K]),N=(0,c.useCallback)(a=>{B(b=>{let c=new Set(b[q]??new Set);return c.has(a)?c.delete(a):c.add(a),{...b,[q]:c}})},[q]);return(p?u:s)?(0,b.jsx)("div",{className:"flex items-center justify-center p-8 h-full",children:(0,b.jsx)("span",{className:"loading loading-spinner text-base-content/50"})}):0===D.length?(0,b.jsx)("div",{className:"flex items-center justify-center p-8 h-full opacity-50",children:p?"No uncommitted local changes":o?"No changes in selected commit range":"No changes in this commit"}):(0,b.jsxs)("div",{className:(0,f.cn)("flex h-full",y&&"fixed inset-0 z-[80] h-auto bg-base-100 shadow-2xl"),children:[(0,b.jsxs)("div",{className:(0,f.cn)(n,"border-r border-base-300 flex flex-col bg-base-200/30 shrink-0"),children:[(0,b.jsxs)("div",{className:"px-3 py-2 text-xs font-bold opacity-70 border-b border-base-300 bg-base-100",children:[D.length," file",1!==D.length?"s":""," changed"]}),(0,b.jsx)("div",{className:"flex-1 overflow-y-auto min-h-0",children:(0,b.jsx)("div",{className:"p-1",children:(0,b.jsx)(k,{node:E,selectedFile:K,expandedFolders:M,onToggleFolder:N,onSelectFile:L})})})]}),(0,b.jsx)("div",{className:"flex-1 overflow-hidden",children:K?(0,b.jsxs)("div",{className:"h-full flex flex-col",children:[(0,b.jsxs)("div",{className:"px-4 py-2 text-xs font-mono opacity-70 border-b border-base-300 bg-base-100 shrink-0 truncate flex items-center justify-between",children:[(0,b.jsx)("span",{className:"truncate",children:K}),(0,b.jsxs)("div",{className:"flex items-center gap-2 shrink-0 ml-4",children:[(0,b.jsx)("label",{htmlFor:"commit-diff-split-view",className:"text-[10px] uppercase tracking-wider font-bold cursor-pointer opacity-70",children:"Split View"}),(0,b.jsx)("input",{type:"checkbox",id:"commit-diff-split-view",checked:H,onChange:a=>I(a.target.checked),className:"toggle toggle-xs toggle-primary"}),(0,b.jsx)("button",{type:"button",className:"btn btn-ghost btn-xs btn-square",onClick:()=>z(a=>!a),"aria-label":y?"Exit full-page diff view":"Expand diff viewer to full page",title:y?"Exit full-page diff view":"Expand diff viewer to full page",children:(0,b.jsx)("i",{className:(0,f.cn)(y?"iconoir-collapse":"iconoir-maximize","text-[14px]"),"aria-hidden":"true"})})]})]}),(0,b.jsx)("div",{ref:J,className:"flex-1 overflow-auto diff-viewer-wrapper",children:p?(0,b.jsx)(l.DiffView,{repoPath:a,filePath:K}):(0,b.jsx)(m,{repoPath:a,commitHash:d,fromCommitHash:g,toCommitHash:h,filePath:K,splitView:H},`${q}:${K}`)})]}):(0,b.jsx)("div",{className:"flex items-center justify-center h-full opacity-70 text-sm",children:"Select a file to view changes"})})]})}a.s(["CommitChangesView",()=>n],41910)}];
2
+
3
+ //# sourceMappingURL=src_components_git_029e6e6f._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/git/diff-view.tsx","../../../../src/components/git/commit-changes-view.tsx","../../../../src/components/git/file-status-icon.tsx","../../../../src/components/git/commit-file-tree.tsx"],"sourcesContent":["'use client';\n\nimport { useGitDiff } from '@/hooks/use-git';\nimport { useState, useEffect, useRef } from 'react';\nimport { useTheme } from 'next-themes';\nimport { getChangedLineCountFromDiff, isFileBinary, isImageFile } from '@/lib/utils';\nimport { GroupedDiffViewer } from './grouped-diff-viewer';\nimport { ImageDiffView } from './image-diff-view';\n\nexport function DiffView({ repoPath, filePath }: { repoPath: string, filePath: string }) {\n const { data, isLoading } = useGitDiff(repoPath, filePath);\n const diffScrollContainerRef = useRef<HTMLDivElement>(null);\n \n // Storage key for split view preference\n const storageKey = 'git-web:diff-view-split';\n \n const [splitView, setSplitView] = useState(() => {\n if (typeof window === 'undefined') return true;\n try {\n const stored = localStorage.getItem(storageKey);\n return stored !== null ? JSON.parse(stored) : true;\n } catch (e) {\n console.error('Failed to load split view preference:', e);\n return true;\n }\n });\n\n const [renderAnywayFilePath, setRenderAnywayFilePath] = useState<string | null>(null);\n const renderAnyway = renderAnywayFilePath === filePath;\n \n const { resolvedTheme } = useTheme();\n\n // Save split view preference when it changes\n useEffect(() => {\n try {\n localStorage.setItem(storageKey, JSON.stringify(splitView));\n } catch (e) {\n console.error('Failed to save split view preference:', e);\n }\n }, [splitView]);\n\n // Reset diff scroll position when switching files.\n useEffect(() => {\n if (isLoading) return;\n\n const frame = requestAnimationFrame(() => {\n diffScrollContainerRef.current?.scrollTo({ top: 0, left: 0 });\n });\n\n return () => cancelAnimationFrame(frame);\n }, [filePath, isLoading]);\n\n if (isLoading) {\n return <div className=\"flex items-center justify-center p-8 h-full\"><span className=\"loading loading-spinner text-base-content/50\"></span></div>;\n }\n\n if (!data) {\n return (\n <div className=\"flex items-center justify-center h-full opacity-50\">\n No diff available\n </div>\n )\n }\n\n const isImage = isImageFile(filePath);\n if (isImage) {\n return (\n <div className=\"flex flex-col h-full bg-base-100\">\n <div className=\"flex items-center justify-between px-4 h-[57px] border-b border-base-300 shrink-0 bg-base-100\">\n <span className=\"text-sm font-mono truncate max-w-[70%]\" title={filePath}>{filePath}</span>\n </div>\n <div className=\"flex-1 overflow-auto\">\n <ImageDiffView filePath={filePath} imageDiff={data.imageDiff} />\n </div>\n </div>\n );\n }\n\n // Check if file is binary (first by extension, then by content if unknown)\n const isBinary = isFileBinary(filePath, data.left, data.right);\n\n if (isBinary) {\n return (\n <div className=\"flex flex-col h-full bg-base-100\">\n <div className=\"flex items-center justify-between px-4 h-[57px] border-b border-base-300 shrink-0 bg-base-100\">\n <span className=\"text-sm font-mono truncate max-w-[70%]\" title={filePath}>{filePath}</span>\n </div>\n <div className=\"flex-1 flex items-center justify-center opacity-50\">\n Binary file - diff not available\n </div>\n </div>\n );\n }\n\n // Large file protection\n const MAX_DIFF_SIZE = 100 * 1024; // 100KB\n const MAX_DIFF_LINES = 3000;\n\n const diffContent = data.diff || '';\n const contentSize = diffContent.length;\n const lineCount = getChangedLineCountFromDiff(diffContent);\n\n const isLargeDiff = (contentSize > MAX_DIFF_SIZE || lineCount > MAX_DIFF_LINES);\n\n return (\n <div className=\"flex flex-col h-full bg-base-100\">\n <div className=\"flex items-center justify-between px-4 h-[57px] border-b border-base-300 shrink-0 bg-base-100\">\n <span className=\"text-sm font-mono truncate max-w-[70%]\" title={filePath}>{filePath}</span>\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"split-view\" className=\"text-[10px] uppercase tracking-wider font-bold cursor-pointer opacity-70\">Split View</label>\n <input\n type=\"checkbox\"\n id=\"split-view\"\n checked={splitView}\n onChange={(e) => setSplitView(e.target.checked)}\n className=\"toggle toggle-sm toggle-primary\"\n />\n </div>\n </div>\n <div ref={diffScrollContainerRef} className=\"flex-1 overflow-auto diff-viewer-wrapper\">\n {isLargeDiff && !renderAnyway ? (\n <div className=\"flex flex-col items-center justify-center h-full gap-4 text-center p-4\">\n <i className=\"iconoir-warning-triangle text-[40px] text-warning\" aria-hidden=\"true\" />\n <div className=\"space-y-2\">\n <h3 className=\"font-bold text-lg\">Large Diff Detected</h3>\n <p className=\"opacity-70\">\n This diff is large ({Math.round(contentSize / 1024)}KB, ~{lineCount} changed lines) and may freeze your browser if rendered.\n </p>\n </div>\n <button className=\"btn btn-outline\" onClick={() => setRenderAnywayFilePath(filePath)}>\n Show Diff Anyway\n </button>\n </div>\n ) : (\n <GroupedDiffViewer\n oldValue={data.left || ''}\n newValue={data.right || ''}\n splitView={splitView}\n useDarkTheme={resolvedTheme === 'dark'}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useCallback, useRef } from 'react';\nimport { useTheme } from 'next-themes';\nimport { useCommitDiff, useCommitFileDiff, useGitStatus } from '@/hooks/use-git';\nimport { cn, isFileBinary, isImageFile, getChangedLineCountFromDiff } from '@/lib/utils';\nimport { GroupedDiffViewer } from './grouped-diff-viewer';\nimport { ImageDiffView } from './image-diff-view';\nimport { useEscapeDismiss } from '@/hooks/use-escape-dismiss';\nimport { CommitFileTreeItem, buildCommitFileTree, collectCommitFolderPaths, getParentPaths } from './commit-file-tree';\nimport { DiffView } from './diff-view';\n\n// Component to show commit file diff\nexport function CommitFileDiffView({\n repoPath,\n commitHash,\n fromCommitHash,\n toCommitHash,\n filePath,\n splitView,\n}: {\n repoPath: string;\n commitHash: string | null;\n fromCommitHash: string | null;\n toCommitHash: string | null;\n filePath: string;\n splitView: boolean;\n}) {\n const { data, isLoading } = useCommitFileDiff(repoPath, filePath, {\n commitHash,\n fromCommitHash,\n toCommitHash,\n });\n const { resolvedTheme } = useTheme();\n const diffSelectionKey = `${commitHash ?? ''}:${fromCommitHash ?? ''}:${toCommitHash ?? ''}:${filePath}`;\n const [renderAnywayDiffKey, setRenderAnywayDiffKey] = useState<string | null>(null);\n const renderAnyway = renderAnywayDiffKey === diffSelectionKey;\n const diffScrollContainerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const frame = requestAnimationFrame(() => {\n diffScrollContainerRef.current?.scrollTo({ top: 0, left: 0 });\n });\n\n return () => cancelAnimationFrame(frame);\n }, [filePath, commitHash, fromCommitHash, toCommitHash, isLoading]);\n\n if (isLoading) {\n return <div className=\"flex items-center justify-center p-8\"><span className=\"loading loading-spinner text-base-content/50\"></span></div>;\n }\n\n if (!data) {\n return <div className=\"flex items-center justify-center p-8 opacity-50\">No diff available</div>;\n }\n\n if (isImageFile(filePath)) {\n return <ImageDiffView filePath={filePath} imageDiff={data.imageDiff} />;\n }\n\n // Check if file is binary (first by extension, then by content if unknown)\n const isBinary = isFileBinary(filePath, data.left, data.right);\n\n if (isBinary) {\n return <div className=\"flex items-center justify-center p-8 opacity-50\">Binary file - diff not available</div>;\n }\n\n // Large file protection\n const MAX_DIFF_SIZE = 100 * 1024; // 100KB\n const MAX_DIFF_LINES = 3000;\n\n const diffContent = data.diff || '';\n const contentSize = diffContent.length;\n const lineCount = getChangedLineCountFromDiff(diffContent);\n\n const isLargeDiff = (contentSize > MAX_DIFF_SIZE || lineCount > MAX_DIFF_LINES);\n\n if (isLargeDiff && !renderAnyway) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full gap-4 text-center p-8\">\n <i className=\"iconoir-warning-triangle text-[32px] text-warning\" aria-hidden=\"true\" />\n <div className=\"space-y-2\">\n <h3 className=\"font-bold text-lg\">Large Diff Detected</h3>\n <p className=\"opacity-70\">\n This diff is large ({Math.round(contentSize / 1024)}KB, ~{lineCount} changed lines) and may freeze your browser if rendered.\n </p>\n </div>\n <button className=\"btn btn-outline\" onClick={() => setRenderAnywayDiffKey(diffSelectionKey)}>\n Show Diff Anyway\n </button>\n </div>\n );\n }\n\n return (\n <div ref={diffScrollContainerRef} className=\"overflow-auto h-full\">\n <GroupedDiffViewer\n oldValue={data.left || ''}\n newValue={data.right || ''}\n splitView={splitView}\n useDarkTheme={resolvedTheme === 'dark'}\n />\n </div>\n );\n}\n\n// Component to show commit changes\nexport function CommitChangesView({\n repoPath,\n commitHash = null,\n fromCommitHash = null,\n toCommitHash = null,\n showWorkingTreeWhenNoCommit = false,\n fileListWidthClass = 'w-64',\n}: {\n repoPath: string;\n commitHash?: string | null;\n fromCommitHash?: string | null;\n toCommitHash?: string | null;\n showWorkingTreeWhenNoCommit?: boolean;\n fileListWidthClass?: string;\n}) {\n const isCommitRangeSelection = !!fromCommitHash && !!toCommitHash;\n const isWorkingTreeSelection = showWorkingTreeWhenNoCommit && !commitHash && !fromCommitHash && !toCommitHash;\n const selectionKey = isWorkingTreeSelection\n ? 'working-tree'\n : (isCommitRangeSelection ? `${fromCommitHash}..${toCommitHash}` : (commitHash ?? 'none'));\n const { data, isLoading } = useCommitDiff(repoPath, {\n commitHash,\n fromCommitHash,\n toCommitHash,\n });\n const { data: statusData, isLoading: isStatusLoading } = useGitStatus(repoPath);\n const statusFiles = statusData?.files;\n const [selectedFileBySelection, setSelectedFileBySelection] = useState<Record<string, string | null>>({});\n const [isFullPageDiff, setIsFullPageDiff] = useState(false);\n const [collapsedFoldersByCommit, setCollapsedFoldersByCommit] = useState<Record<string, Set<string>>>({});\n const workingTreeFiles = useMemo(() => {\n if (!statusFiles || statusFiles.length === 0) return [];\n\n const filesByPath = new Map<string, { path: string; additions: number; deletions: number; status: string }>();\n for (const file of statusFiles) {\n const indexStatus = (file.index || '').trim();\n const workingStatus = (file.working_dir || '').trim();\n const normalizedStatus = [indexStatus, workingStatus].find((value) => ['A', 'D', 'R', 'M'].includes(value)) || 'M';\n filesByPath.set(file.path, {\n path: file.path,\n additions: 0,\n deletions: 0,\n status: normalizedStatus,\n });\n }\n\n return Array.from(filesByPath.values());\n }, [statusFiles]);\n const files = useMemo(\n () => (isWorkingTreeSelection ? workingTreeFiles : (data?.files ?? [])),\n [isWorkingTreeSelection, workingTreeFiles, data?.files]\n );\n const fileTree = useMemo(() => buildCommitFileTree(files), [files]);\n const allFolderPaths = useMemo(() => collectCommitFolderPaths(fileTree), [fileTree]);\n const collapsedFolders = useMemo(\n () => collapsedFoldersByCommit[selectionKey] ?? new Set<string>(),\n [collapsedFoldersByCommit, selectionKey]\n );\n \n // Storage key for split view preference - same as in DiffView\n const storageKey = 'git-web:diff-view-split';\n \n const [splitView, setSplitView] = useState(() => {\n if (typeof window === 'undefined') return true;\n try {\n const stored = localStorage.getItem(storageKey);\n return stored !== null ? JSON.parse(stored) : true;\n } catch (e) {\n console.error('Failed to load split view preference:', e);\n return true;\n }\n });\n const diffViewportRef = useRef<HTMLDivElement>(null);\n const selectedFile = useMemo(() => {\n if (files.length === 0) return null;\n\n const savedSelection = selectedFileBySelection[selectionKey] ?? null;\n if (savedSelection && files.some((file) => file.path === savedSelection)) {\n return savedSelection;\n }\n\n return files[0].path;\n }, [files, selectedFileBySelection, selectionKey]);\n const handleSelectFile = useCallback((path: string) => {\n setSelectedFileBySelection((previous) => {\n if ((previous[selectionKey] ?? null) === path) {\n return previous;\n }\n\n return {\n ...previous,\n [selectionKey]: path,\n };\n });\n }, [selectionKey]);\n\n // Save split view preference when it changes\n useEffect(() => {\n try {\n localStorage.setItem(storageKey, JSON.stringify(splitView));\n } catch (e) {\n console.error('Failed to save split view preference:', e);\n }\n }, [splitView]);\n\n useEffect(() => {\n if (!selectedFile) return;\n\n const frame = requestAnimationFrame(() => {\n diffViewportRef.current?.scrollTo({ top: 0, left: 0 });\n });\n\n return () => cancelAnimationFrame(frame);\n }, [selectedFile, selectionKey]);\n\n useEscapeDismiss(isFullPageDiff, () => setIsFullPageDiff(false));\n\n useEffect(() => {\n if (!isFullPageDiff) return;\n\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.body.style.overflow = previousOverflow;\n };\n }, [isFullPageDiff]);\n\n const expandedFolders = useMemo(() => {\n const expanded = new Set<string>();\n\n allFolderPaths.forEach((path) => {\n if (!collapsedFolders.has(path)) {\n expanded.add(path);\n }\n });\n\n if (selectedFile) {\n getParentPaths(selectedFile).forEach((path) => expanded.add(path));\n }\n\n return expanded;\n }, [allFolderPaths, collapsedFolders, selectedFile]);\n\n const handleToggleFolder = useCallback((path: string) => {\n setCollapsedFoldersByCommit((prev) => {\n const current = prev[selectionKey] ?? new Set<string>();\n const next = new Set(current);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return {\n ...prev,\n [selectionKey]: next,\n };\n });\n }, [selectionKey]);\n\n const isLoadingCurrentSelection = isWorkingTreeSelection ? isStatusLoading : isLoading;\n\n if (isLoadingCurrentSelection) {\n return <div className=\"flex items-center justify-center p-8 h-full\"><span className=\"loading loading-spinner text-base-content/50\"></span></div>;\n }\n\n if (files.length === 0) {\n return (\n <div className=\"flex items-center justify-center p-8 h-full opacity-50\">\n {isWorkingTreeSelection\n ? 'No uncommitted local changes'\n : (isCommitRangeSelection ? 'No changes in selected commit range' : 'No changes in this commit')}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n 'flex h-full',\n isFullPageDiff && 'fixed inset-0 z-[80] h-auto bg-base-100 shadow-2xl'\n )}\n >\n {/* File list */}\n <div className={cn(fileListWidthClass, 'border-r border-base-300 flex flex-col bg-base-200/30 shrink-0')}>\n <div className=\"px-3 py-2 text-xs font-bold opacity-70 border-b border-base-300 bg-base-100\">\n {files.length} file{files.length !== 1 ? 's' : ''} changed\n </div>\n <div className=\"flex-1 overflow-y-auto min-h-0\">\n <div className=\"p-1\">\n <CommitFileTreeItem\n node={fileTree}\n selectedFile={selectedFile}\n expandedFolders={expandedFolders}\n onToggleFolder={handleToggleFolder}\n onSelectFile={handleSelectFile}\n />\n </div>\n </div>\n </div>\n\n {/* Diff view */}\n <div className=\"flex-1 overflow-hidden\">\n {selectedFile ? (\n <div className=\"h-full flex flex-col\">\n <div className=\"px-4 py-2 text-xs font-mono opacity-70 border-b border-base-300 bg-base-100 shrink-0 truncate flex items-center justify-between\">\n <span className=\"truncate\">{selectedFile}</span>\n <div className=\"flex items-center gap-2 shrink-0 ml-4\">\n <label htmlFor=\"commit-diff-split-view\" className=\"text-[10px] uppercase tracking-wider font-bold cursor-pointer opacity-70\">Split View</label>\n <input\n type=\"checkbox\"\n id=\"commit-diff-split-view\"\n checked={splitView}\n onChange={(e) => setSplitView(e.target.checked)}\n className=\"toggle toggle-xs toggle-primary\"\n />\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs btn-square\"\n onClick={() => setIsFullPageDiff((prev) => !prev)}\n aria-label={isFullPageDiff ? 'Exit full-page diff view' : 'Expand diff viewer to full page'}\n title={isFullPageDiff ? 'Exit full-page diff view' : 'Expand diff viewer to full page'}\n >\n <i\n className={cn(\n isFullPageDiff ? 'iconoir-collapse' : 'iconoir-maximize',\n 'text-[14px]'\n )}\n aria-hidden=\"true\"\n />\n </button>\n </div>\n </div>\n <div ref={diffViewportRef} className=\"flex-1 overflow-auto diff-viewer-wrapper\">\n {isWorkingTreeSelection ? (\n <DiffView repoPath={repoPath} filePath={selectedFile} />\n ) : (\n <CommitFileDiffView\n key={`${selectionKey}:${selectedFile}`}\n repoPath={repoPath}\n commitHash={commitHash}\n fromCommitHash={fromCommitHash}\n toCommitHash={toCommitHash}\n filePath={selectedFile}\n splitView={splitView}\n />\n )}\n </div>\n </div>\n ) : (\n <div className=\"flex items-center justify-center h-full opacity-70 text-sm\">\n Select a file to view changes\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { cn } from '@/lib/utils';\n\nexport function FileStatusIcon({ status }: { status: string }) {\n switch (status) {\n case 'A':\n return <i className=\"iconoir-plus-circle text-[16px] text-success\" aria-hidden=\"true\" />;\n case 'D':\n return <i className=\"iconoir-minus-circle text-[16px] text-error\" aria-hidden=\"true\" />;\n case 'M':\n return <i className=\"iconoir-edit-pencil text-[16px] text-warning\" aria-hidden=\"true\" />;\n default:\n return <i className=\"iconoir-page text-[16px] opacity-50\" aria-hidden=\"true\" />;\n }\n}\n","import { CommitFile } from '@/hooks/use-git';\nimport { cn } from '@/lib/utils';\nimport { FileStatusIcon } from './file-status-icon';\n\nexport interface CommitFileTreeNode {\n name: string;\n path: string;\n file?: CommitFile;\n children: Map<string, CommitFileTreeNode>;\n}\n\nexport function buildCommitFileTree(files: CommitFile[]): CommitFileTreeNode {\n const root: CommitFileTreeNode = {\n name: '',\n path: '',\n children: new Map(),\n };\n\n for (const file of files) {\n const parts = file.path.split('/').filter(Boolean);\n let current = root;\n let currentPath = '';\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n currentPath = currentPath ? `${currentPath}/${part}` : part;\n\n if (!current.children.has(part)) {\n current.children.set(part, {\n name: part,\n path: currentPath,\n children: new Map(),\n });\n }\n\n current = current.children.get(part)!;\n\n if (i === parts.length - 1) {\n current.file = file;\n }\n }\n }\n\n return root;\n}\n\nexport function collectCommitFolderPaths(node: CommitFileTreeNode): string[] {\n const paths: string[] = [];\n const children = Array.from(node.children.values());\n\n children.forEach((child) => {\n if (child.children.size > 0) {\n paths.push(child.path);\n paths.push(...collectCommitFolderPaths(child));\n }\n });\n\n return paths;\n}\n\nexport function getParentPaths(filePath: string): string[] {\n const parts = filePath.split('/').filter(Boolean);\n const parentPaths: string[] = [];\n\n for (let i = 1; i < parts.length; i++) {\n parentPaths.push(parts.slice(0, i).join('/'));\n }\n\n return parentPaths;\n}\n\nexport function CommitFileTreeItem({\n node,\n selectedFile,\n expandedFolders,\n onToggleFolder,\n onSelectFile,\n depth = 0,\n}: {\n node: CommitFileTreeNode;\n selectedFile: string | null;\n expandedFolders: Set<string>;\n onToggleFolder: (path: string) => void;\n onSelectFile: (path: string) => void;\n depth?: number;\n}) {\n const children = Array.from(node.children.values()).sort((a, b) => {\n const aIsFolder = a.children.size > 0;\n const bIsFolder = b.children.size > 0;\n\n if (aIsFolder && !bIsFolder) return -1;\n if (!aIsFolder && bIsFolder) return 1;\n return a.name.localeCompare(b.name);\n });\n\n return (\n <>\n {children.map((child) => {\n const isFolder = child.children.size > 0;\n\n if (isFolder) {\n const isExpanded = expandedFolders.has(child.path);\n\n return (\n <div key={child.path}>\n <div\n className=\"flex items-center gap-1 px-2 py-1.5 text-xs rounded cursor-pointer hover:bg-base-200 transition-colors opacity-80\"\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onToggleFolder(child.path)}\n title={child.path}\n >\n <span className=\"text-[10px] opacity-70\">{isExpanded ? '▼' : '▶'}</span>\n <i className=\"iconoir-folder text-[14px] opacity-70\" aria-hidden=\"true\" />\n <span className=\"truncate flex-1\">{child.name}</span>\n </div>\n {isExpanded && (\n <CommitFileTreeItem\n node={child}\n selectedFile={selectedFile}\n expandedFolders={expandedFolders}\n onToggleFolder={onToggleFolder}\n onSelectFile={onSelectFile}\n depth={depth + 1}\n />\n )}\n </div>\n );\n }\n\n if (!child.file) return null;\n const file = child.file;\n\n return (\n <div\n key={child.path}\n className={cn(\n \"flex items-center gap-2 px-2 py-1.5 text-xs rounded cursor-pointer hover:bg-base-200 transition-colors\",\n selectedFile === file.path && \"bg-base-200 font-medium\"\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSelectFile(file.path)}\n title={file.path}\n >\n <FileStatusIcon status={file.status} />\n <span className=\"truncate flex-1 font-mono\">{child.name}</span>\n </div>\n );\n })}\n </>\n );\n}\n"],"names":[],"mappings":"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"}