@hienlh/ppm 0.8.37 → 0.8.38

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 (50) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/web/assets/{api-client-Bs-0pRox.js → api-client-B0aMOJxF.js} +1 -1
  3. package/dist/web/assets/{api-settings-D42qxHtn.js → api-settings-0Hx_9lIU.js} +1 -1
  4. package/dist/web/assets/chat-tab-CGic5t8w.js +7 -0
  5. package/dist/web/assets/code-editor-DZlXHMtA.js +1 -0
  6. package/dist/web/assets/columns-2-BZ5wv2wA.js +1 -0
  7. package/dist/web/assets/database-viewer-BaxjPtYR.js +1 -0
  8. package/dist/web/assets/diff-viewer-CDdO3tqP.js +4 -0
  9. package/dist/web/assets/{dist-CU2je4l7.js → dist-QgqOdSYG.js} +2 -2
  10. package/dist/web/assets/git-graph-C-TRbbx7.js +1 -0
  11. package/dist/web/assets/index-CvbNQ1mi.js +28 -0
  12. package/dist/web/assets/input-4ElbicvY.js +41 -0
  13. package/dist/web/assets/jsx-runtime-wQxeESYQ.js +1 -0
  14. package/dist/web/assets/keybindings-store-Dqs-i9cV.js +1 -0
  15. package/dist/web/assets/{markdown-renderer-DmuIK1-X.js → markdown-renderer-DE503g9L.js} +2 -2
  16. package/dist/web/assets/postgres-viewer-hmqfZRr-.js +1 -0
  17. package/dist/web/assets/react-CYzKIDNi.js +1 -0
  18. package/dist/web/assets/{react-Dhei_cB0.js → react-Dk7fkoaB.js} +1 -1
  19. package/dist/web/assets/{settings-store-CIOAyrzs.js → settings-store-Clv3ZNje.js} +2 -2
  20. package/dist/web/assets/settings-tab-BdgsQeES.js +1 -0
  21. package/dist/web/assets/sqlite-viewer-9X_1ZHJE.js +1 -0
  22. package/dist/web/assets/tab-store-D7tRt0VT.js +1 -0
  23. package/dist/web/assets/table-B6neW6Hr.js +1 -0
  24. package/dist/web/assets/{terminal-tab-ZMG3urJd.js → terminal-tab-V7x81Qpr.js} +2 -2
  25. package/dist/web/assets/{use-monaco-theme-D6807XbV.js → use-monaco-theme-czriskTO.js} +1 -1
  26. package/dist/web/index.html +10 -11
  27. package/dist/web/sw.js +1 -1
  28. package/package.json +1 -1
  29. package/src/cli/commands/restart.ts +5 -1
  30. package/src/server/index.ts +9 -16
  31. package/src/server/routes/tunnel.ts +0 -14
  32. package/src/services/tunnel.service.ts +22 -0
  33. package/dist/web/assets/chat-tab-DesJNGlM.js +0 -7
  34. package/dist/web/assets/code-editor-BJSi0tN8.js +0 -1
  35. package/dist/web/assets/columns-2-BSNHGqVP.js +0 -1
  36. package/dist/web/assets/database-viewer-BRtti__1.js +0 -1
  37. package/dist/web/assets/diff-viewer-BtqxNPvT.js +0 -4
  38. package/dist/web/assets/git-graph-BwaH1gCr.js +0 -1
  39. package/dist/web/assets/index-cCRyobYW.js +0 -237
  40. package/dist/web/assets/input-D3FZB4A8.js +0 -45
  41. package/dist/web/assets/jsx-dev-runtime-B0R0R7SH.js +0 -6
  42. package/dist/web/assets/jsx-runtime-CdTrtNt5.js +0 -6
  43. package/dist/web/assets/keybindings-store-EctjzvyI.js +0 -1
  44. package/dist/web/assets/postgres-viewer-BToBpDFs.js +0 -1
  45. package/dist/web/assets/react-4j_0SqET.js +0 -13
  46. package/dist/web/assets/settings-tab-CIM3X82k.js +0 -1
  47. package/dist/web/assets/sqlite-viewer-CSsYLA1Q.js +0 -1
  48. package/dist/web/assets/tab-store-HCmwXLYA.js +0 -1
  49. package/dist/web/assets/table-CSrbr8mU.js +0 -1
  50. /package/dist/web/assets/{utils-DC-bdPS3.js → utils-DBpa1UZX.js} +0 -0
@@ -1 +0,0 @@
1
- import{i as e,t}from"./react-4j_0SqET.js";import{t as n}from"./jsx-dev-runtime-B0R0R7SH.js";import{a as r,c as i,i as a,n as o,o as s,r as c,s as l,t as u}from"./dist-CU2je4l7.js";import"./jsx-runtime-CdTrtNt5.js";import{t as d}from"./api-client-Bs-0pRox.js";import{B as f,G as p,K as m,M as h,O as g}from"./index-cCRyobYW.js";var _=e(t(),1);function v(e,t,n,r){return`ppm-db-${e}-${n}.${t}-p${r}`}function y(e,t,n,r){try{let i=sessionStorage.getItem(v(e,t,n,r));return i?JSON.parse(i):null}catch{return null}}function b(e,t,n,r,i,a){try{sessionStorage.setItem(v(e,t,n,r),JSON.stringify({data:i,cols:a}))}catch{}}function x(e){let t=`/api/db/connections/${e}`,[n,r]=(0,_.useState)(null),[i,a]=(0,_.useState)(`public`),[o,s]=(0,_.useState)(null),[c,l]=(0,_.useState)([]),[u,f]=(0,_.useState)(!0),[p,m]=(0,_.useState)(null),[h,g]=(0,_.useState)(1),[v,x]=(0,_.useState)(null),[S,C]=(0,_.useState)(null),[w,T]=(0,_.useState)(!1),E=(0,_.useCallback)(async(r,a,o)=>{let c=r??n,u=a??i;if(c){f(!0);try{let[n,r]=await Promise.all([d.get(`${t}/data?table=${encodeURIComponent(c)}&schema=${u}&page=${o??h}&limit=100`),d.get(`${t}/schema?table=${encodeURIComponent(c)}&schema=${u}`)]);s(n),l(r),b(e,c,u,o??h,n,r)}catch(e){m(e.message)}finally{f(!1)}}},[t,e,n,i,h]);return{selectedTable:n,selectTable:(0,_.useCallback)((t,n=`public`)=>{r(t),a(n),g(1),x(null);let i=y(e,t,n,1);i?(s(i.data),l(i.cols),f(!1),E(t,n,1)):E(t,n,1)},[e,E]),tableData:o,schema:c,loading:u,error:p,page:h,setPage:(0,_.useCallback)(e=>{g(e),E(void 0,void 0,e)},[E]),queryResult:v,queryError:S,queryLoading:w,executeQuery:(0,_.useCallback)(async e=>{T(!0),C(null);try{let r=await d.post(`${t}/query`,{sql:e});x(r),r.changeType===`modify`&&E(n??void 0,i)}catch(e){C(e.message)}finally{T(!1)}},[t,n,i,E]),updateCell:(0,_.useCallback)(async(e,r,a,o)=>{if(!n)return;let s=n,c=i;try{await d.put(`${t}/cell`,{table:s,schema:c,pkColumn:e,pkValue:r,column:a,value:o}),E(s,c)}catch(e){m(e.message)}},[t,n,i,E]),refreshData:E}}var S=n(),C=`/Users/hienlh/Projects/ppm/src/web/components/database/database-viewer.tsx`,w={postgres:u,sqlite:o};function T({metadata:e}){let t=e?.connectionId,n=e?.connectionName,r=e?.dbType??`postgres`,i=e?.tableName,a=e?.schemaName??`public`,o=x(t),[s,c]=(0,_.useState)(!1),l=(0,_.useRef)(!1);return(0,_.useEffect)(()=>{!i||l.current||(l.current=!0,o.selectTable(i,a))},[i,a]),(0,S.jsxDEV)(`div`,{className:`flex h-full w-full overflow-hidden`,children:(0,S.jsxDEV)(`div`,{className:`flex-1 flex flex-col overflow-hidden`,children:[(0,S.jsxDEV)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border bg-background shrink-0`,children:[(0,S.jsxDEV)(f,{className:`size-3.5 text-muted-foreground`},void 0,!1,{fileName:C,lineNumber:36,columnNumber:11},this),(0,S.jsxDEV)(`span`,{className:`text-xs text-muted-foreground truncate`,children:n??`Database`},void 0,!1,{fileName:C,lineNumber:37,columnNumber:11},this),o.selectedTable&&(0,S.jsxDEV)(`span`,{className:`text-xs text-muted-foreground`,children:[`/ `,o.selectedTable]},void 0,!0,{fileName:C,lineNumber:38,columnNumber:32},this),(0,S.jsxDEV)(`div`,{className:`ml-auto flex items-center gap-1`,children:[(0,S.jsxDEV)(`button`,{type:`button`,onClick:()=>o.refreshData(),title:`Reload data`,className:`p-1 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,S.jsxDEV)(g,{className:`size-3 ${o.loading?`animate-spin`:``}`},void 0,!1,{fileName:C,lineNumber:42,columnNumber:15},this)},void 0,!1,{fileName:C,lineNumber:40,columnNumber:13},this),(0,S.jsxDEV)(`button`,{type:`button`,onClick:()=>c(e=>!e),className:`px-2 py-1 rounded text-xs transition-colors ${s?`bg-muted text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:`SQL`},void 0,!1,{fileName:C,lineNumber:44,columnNumber:13},this)]},void 0,!0,{fileName:C,lineNumber:39,columnNumber:11},this)]},void 0,!0,{fileName:C,lineNumber:35,columnNumber:9},this),(0,S.jsxDEV)(`div`,{className:`flex-1 overflow-hidden ${s?`max-h-[60%]`:``}`,children:(0,S.jsxDEV)(E,{tableData:o.tableData,schema:o.schema,loading:o.loading,page:o.page,onPageChange:o.setPage,onCellUpdate:o.updateCell},void 0,!1,{fileName:C,lineNumber:53,columnNumber:11},this)},void 0,!1,{fileName:C,lineNumber:52,columnNumber:9},this),s&&(0,S.jsxDEV)(`div`,{className:`border-t border-border h-[40%] shrink-0`,children:(0,S.jsxDEV)(D,{dialect:w[r]??u,onExecute:o.executeQuery,result:o.queryResult,error:o.queryError,loading:o.queryLoading},void 0,!1,{fileName:C,lineNumber:60,columnNumber:13},this)},void 0,!1,{fileName:C,lineNumber:59,columnNumber:11},this)]},void 0,!0,{fileName:C,lineNumber:33,columnNumber:7},this)},void 0,!1,{fileName:C,lineNumber:32,columnNumber:5},this)}function E({tableData:e,schema:t,loading:n,page:i,onPageChange:a,onCellUpdate:o}){let[c,u]=(0,_.useState)(null),[d,f]=(0,_.useState)(``),g=(0,_.useMemo)(()=>t.find(e=>e.pk)?.name??null,[t]),v=(0,_.useCallback)((e,t,n)=>{u({rowIdx:e,col:t}),f(n==null?``:String(n))},[]),y=(0,_.useCallback)(()=>{if(!c||!e||!g)return;let t=e.rows[c.rowIdx];if(!t)return;let n=t[c.col];String(n??``)!==d&&o(g,t[g],c.col,d===``?null:d),u(null)},[c,d,e,g,o]),b=(0,_.useCallback)(()=>u(null),[]),x=(0,_.useMemo)(()=>(e?.columns??[]).map(e=>({id:e,accessorFn:t=>t[e],header:()=>(0,S.jsxDEV)(`span`,{className:t.find(t=>t.name===e)?.pk?`font-bold`:``,children:e},void 0,!1,{fileName:C,lineNumber:103,columnNumber:21},this),cell:({row:t,getValue:n})=>{let r=c?.rowIdx===t.index&&c?.col===e,i=n();return r?(0,S.jsxDEV)(`input`,{autoFocus:!0,className:`w-full bg-transparent border border-primary/50 rounded px-1 py-0 text-xs outline-none`,value:d,onChange:e=>f(e.target.value),onBlur:y,onKeyDown:e=>{e.key===`Enter`&&y(),e.key===`Escape`&&b()}},void 0,!1,{fileName:C,lineNumber:109,columnNumber:13},this):(0,S.jsxDEV)(`span`,{className:`cursor-pointer truncate block ${i==null?`text-muted-foreground/40 italic`:``}`,onDoubleClick:()=>g&&v(t.index,e,i),title:i==null?`NULL`:String(i),children:i==null?`NULL`:String(i)},void 0,!1,{fileName:C,lineNumber:115,columnNumber:11},this)}})),[e?.columns,t,c,d,y,b,v,g]),w=s({data:e?.rows??[],columns:x,getCoreRowModel:l()});if(!e)return(0,S.jsxDEV)(`div`,{className:`flex items-center justify-center h-full text-xs text-muted-foreground`,children:n?(0,S.jsxDEV)(h,{className:`size-4 animate-spin`},void 0,!1,{fileName:C,lineNumber:129,columnNumber:20},this):`Select a table`},void 0,!1,{fileName:C,lineNumber:128,columnNumber:7},this);let T=Math.ceil(e.total/e.limit)||1;return(0,S.jsxDEV)(`div`,{className:`flex flex-col h-full overflow-hidden`,children:[(0,S.jsxDEV)(`div`,{className:`flex-1 overflow-auto`,children:(0,S.jsxDEV)(`table`,{className:`w-full text-xs border-collapse`,children:[(0,S.jsxDEV)(`thead`,{className:`sticky top-0 z-10 bg-muted`,children:w.getHeaderGroups().map(e=>(0,S.jsxDEV)(`tr`,{children:e.headers.map(e=>(0,S.jsxDEV)(`th`,{className:`px-2 py-1.5 text-left font-medium text-muted-foreground border-b border-border whitespace-nowrap`,children:r(e.column.columnDef.header,e.getContext())},e.id,!1,{fileName:C,lineNumber:144,columnNumber:19},this))},e.id,!1,{fileName:C,lineNumber:142,columnNumber:15},this))},void 0,!1,{fileName:C,lineNumber:140,columnNumber:11},this),(0,S.jsxDEV)(`tbody`,{children:[w.getRowModel().rows.map(e=>(0,S.jsxDEV)(`tr`,{className:`hover:bg-muted/30 border-b border-border/50`,children:e.getVisibleCells().map(e=>(0,S.jsxDEV)(`td`,{className:`px-2 py-1 max-w-[300px]`,children:r(e.column.columnDef.cell,e.getContext())},e.id,!1,{fileName:C,lineNumber:155,columnNumber:19},this))},e.id,!1,{fileName:C,lineNumber:153,columnNumber:15},this)),e.rows.length===0&&(0,S.jsxDEV)(`tr`,{children:(0,S.jsxDEV)(`td`,{colSpan:e.columns.length,className:`px-2 py-8 text-center text-muted-foreground`,children:`No data`},void 0,!1,{fileName:C,lineNumber:162,columnNumber:19},this)},void 0,!1,{fileName:C,lineNumber:162,columnNumber:15},this)]},void 0,!0,{fileName:C,lineNumber:151,columnNumber:11},this)]},void 0,!0,{fileName:C,lineNumber:139,columnNumber:9},this)},void 0,!1,{fileName:C,lineNumber:138,columnNumber:7},this),(0,S.jsxDEV)(`div`,{className:`flex items-center justify-between px-3 py-1.5 border-t border-border bg-background shrink-0 text-xs text-muted-foreground`,children:[(0,S.jsxDEV)(`span`,{children:[e.total.toLocaleString(),` rows`]},void 0,!0,{fileName:C,lineNumber:168,columnNumber:9},this),(0,S.jsxDEV)(`div`,{className:`flex items-center gap-2`,children:[(0,S.jsxDEV)(`button`,{type:`button`,disabled:i<=1,onClick:()=>a(i-1),className:`p-0.5 rounded hover:bg-muted disabled:opacity-30`,children:(0,S.jsxDEV)(m,{className:`size-3.5`},void 0,!1,{fileName:C,lineNumber:171,columnNumber:13},this)},void 0,!1,{fileName:C,lineNumber:170,columnNumber:11},this),(0,S.jsxDEV)(`span`,{children:[i,` / `,T]},void 0,!0,{fileName:C,lineNumber:173,columnNumber:11},this),(0,S.jsxDEV)(`button`,{type:`button`,disabled:i>=T,onClick:()=>a(i+1),className:`p-0.5 rounded hover:bg-muted disabled:opacity-30`,children:(0,S.jsxDEV)(p,{className:`size-3.5`},void 0,!1,{fileName:C,lineNumber:175,columnNumber:13},this)},void 0,!1,{fileName:C,lineNumber:174,columnNumber:11},this)]},void 0,!0,{fileName:C,lineNumber:169,columnNumber:9},this)]},void 0,!0,{fileName:C,lineNumber:167,columnNumber:7},this)]},void 0,!0,{fileName:C,lineNumber:137,columnNumber:5},this)}function D({dialect:e,onExecute:t,result:n,error:r,loading:o}){let[s,l]=(0,_.useState)(`SELECT * FROM `),u=(0,_.useCallback)(()=>{let e=s.trim();e&&t(e)},[s,t]);return(0,S.jsxDEV)(`div`,{className:`flex flex-col h-full overflow-hidden`,children:[(0,S.jsxDEV)(`div`,{className:`flex items-start gap-1 border-b border-border bg-background`,onKeyDown:(0,_.useCallback)(e=>{(e.metaKey||e.ctrlKey)&&e.key===`Enter`&&(e.preventDefault(),u())},[u]),children:[(0,S.jsxDEV)(`div`,{className:`flex-1 max-h-[120px] overflow-auto`,children:(0,S.jsxDEV)(a,{value:s,onChange:l,extensions:[c({dialect:e})],basicSetup:{lineNumbers:!1,foldGutter:!1,highlightActiveLine:!1},className:`text-xs [&_.cm-editor]:!outline-none [&_.cm-scroller]:!overflow-auto`},void 0,!1,{fileName:C,lineNumber:198,columnNumber:11},this)},void 0,!1,{fileName:C,lineNumber:197,columnNumber:9},this),(0,S.jsxDEV)(`button`,{type:`button`,onClick:u,disabled:o,title:`Execute (Cmd+Enter)`,className:`shrink-0 m-1 p-1.5 rounded bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors`,children:o?(0,S.jsxDEV)(h,{className:`size-3.5 animate-spin`},void 0,!1,{fileName:C,lineNumber:204,columnNumber:22},this):(0,S.jsxDEV)(i,{className:`size-3.5`},void 0,!1,{fileName:C,lineNumber:204,columnNumber:70},this)},void 0,!1,{fileName:C,lineNumber:202,columnNumber:9},this)]},void 0,!0,{fileName:C,lineNumber:196,columnNumber:7},this),(0,S.jsxDEV)(`div`,{className:`flex-1 overflow-auto text-xs`,children:[r&&(0,S.jsxDEV)(`div`,{className:`px-3 py-2 text-destructive bg-destructive/5`,children:r},void 0,!1,{fileName:C,lineNumber:208,columnNumber:19},this),n?.changeType===`modify`&&(0,S.jsxDEV)(`div`,{className:`px-3 py-2 text-green-500`,children:[`Query executed. `,n.rowsAffected,` row(s) affected.`]},void 0,!0,{fileName:C,lineNumber:209,columnNumber:45},this),n?.changeType===`select`&&n.rows.length>0&&(0,S.jsxDEV)(`table`,{className:`w-full border-collapse`,children:[(0,S.jsxDEV)(`thead`,{className:`sticky top-0 bg-muted`,children:(0,S.jsxDEV)(`tr`,{children:n.columns.map(e=>(0,S.jsxDEV)(`th`,{className:`px-2 py-1 text-left font-medium text-muted-foreground border-b border-border whitespace-nowrap`,children:e},e,!1,{fileName:C,lineNumber:213,columnNumber:46},this))},void 0,!1,{fileName:C,lineNumber:213,columnNumber:15},this)},void 0,!1,{fileName:C,lineNumber:212,columnNumber:13},this),(0,S.jsxDEV)(`tbody`,{children:n.rows.map((e,t)=>(0,S.jsxDEV)(`tr`,{className:`hover:bg-muted/30 border-b border-border/50`,children:n.columns.map(t=>(0,S.jsxDEV)(`td`,{className:`px-2 py-1 max-w-[300px] truncate`,title:e[t]==null?`NULL`:String(e[t]),children:e[t]==null?(0,S.jsxDEV)(`span`,{className:`text-muted-foreground/40 italic`,children:`NULL`},void 0,!1,{fileName:C,lineNumber:220,columnNumber:41},this):String(e[t])},t,!1,{fileName:C,lineNumber:219,columnNumber:21},this))},t,!1,{fileName:C,lineNumber:217,columnNumber:17},this))},void 0,!1,{fileName:C,lineNumber:215,columnNumber:13},this)]},void 0,!0,{fileName:C,lineNumber:211,columnNumber:11},this),n?.changeType===`select`&&n.rows.length===0&&(0,S.jsxDEV)(`div`,{className:`px-3 py-2 text-muted-foreground`,children:`No results`},void 0,!1,{fileName:C,lineNumber:228,columnNumber:73},this)]},void 0,!0,{fileName:C,lineNumber:207,columnNumber:7},this)]},void 0,!0,{fileName:C,lineNumber:195,columnNumber:5},this)}export{T as DatabaseViewer};
@@ -1,4 +0,0 @@
1
- import{i as e,t}from"./react-4j_0SqET.js";import{n,t as r}from"./jsx-dev-runtime-B0R0R7SH.js";import{t as i}from"./columns-2-BSNHGqVP.js";import{n as a}from"./settings-store-CIOAyrzs.js";import{i as o,t as s}from"./api-client-Bs-0pRox.js";import{A as c,L as l,M as u}from"./index-cCRyobYW.js";import{r as d,t as f}from"./use-monaco-theme-D6807XbV.js";var p=n(`panel-right-open`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m10 15-3-3 3-3`,key:`1pgupc`}]]),m=n(`text-wrap`,[[`path`,{d:`m16 16-3 3 3 3`,key:`117b85`}],[`path`,{d:`M3 12h14.5a1 1 0 0 1 0 7H13`,key:`18xa6z`}],[`path`,{d:`M3 19h6`,key:`1ygdsz`}],[`path`,{d:`M3 5h18`,key:`1u36vt`}]]),h=e(t(),1),g=r(),_=`/Users/hienlh/Projects/ppm/src/web/components/editor/diff-viewer.tsx`;function v(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`}[e.split(`.`).pop()?.toLowerCase()??``]??`plaintext`}function y({metadata:e}){let t=e?.filePath,n=e?.projectName,r=e?.ref1,y=e?.ref2,x=e?.file1,S=e?.file2,C=e?.original,w=e?.modified,T=C!=null||w!=null,E=!!(x&&S),[D,O]=(0,h.useState)(null),[k,A]=(0,h.useState)(null),[j,M]=(0,h.useState)(!T),[N,P]=(0,h.useState)(null),[F,I]=(0,h.useState)(`both`),{wordWrap:L,toggleWordWrap:R}=a(),z=f(),B=(0,h.useRef)(null),[V,H]=(0,h.useState)();(0,h.useEffect)(()=>{let e=B.current;if(!e)return;let t=new ResizeObserver(([e])=>{e&&H(Math.floor(e.contentRect.height))});return t.observe(e),()=>t.disconnect()},[j,N]),(0,h.useEffect)(()=>{if(T||!n)return;if(M(!0),P(null),x&&S){let e=new URLSearchParams({file1:x,file2:S});s.get(`${o(n)}/files/compare?${e}`).then(e=>{A(e),M(!1)}).catch(e=>{P(e instanceof Error?e.message:`Failed to compare files`),M(!1)});return}let e;if(t){let i=new URLSearchParams({file:t});r&&i.set(`ref`,r),e=`${o(n)}/git/file-diff?${i}`}else if(r||y){let t=new URLSearchParams;r&&t.set(`ref1`,r),y&&t.set(`ref2`,y),e=`${o(n)}/git/diff?${t}`}else e=`${o(n)}/git/diff`;s.get(e).then(e=>{O(e.diff),M(!1)}).catch(e=>{P(e instanceof Error?e.message:`Failed to load diff`),M(!1)})},[t,n,r,y,x,S,T]);let{original:U,modified:W}=(0,h.useMemo)(()=>T?{original:C??``,modified:w??``}:E&&k?k:D?b(D):{original:``,modified:``},[D,T,C,w,E,k]),G=(0,h.useMemo)(()=>{let e=t??S??x;return e?v(e):`plaintext`},[t,x,S]),K=typeof window<`u`&&window.innerWidth<768,q=!K&&F===`both`;return!n&&!T?(0,g.jsxDEV)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground text-sm`,children:`No project selected.`},void 0,!1,{fileName:_,lineNumber:115,columnNumber:7},this):j?(0,g.jsxDEV)(`div`,{className:`flex items-center justify-center h-full gap-2 text-muted-foreground`,children:[(0,g.jsxDEV)(u,{className:`size-5 animate-spin`},void 0,!1,{fileName:_,lineNumber:124,columnNumber:9},this),(0,g.jsxDEV)(`span`,{className:`text-sm`,children:`Loading diff...`},void 0,!1,{fileName:_,lineNumber:125,columnNumber:9},this)]},void 0,!0,{fileName:_,lineNumber:123,columnNumber:7},this):N?(0,g.jsxDEV)(`div`,{className:`flex items-center justify-center h-full text-destructive text-sm`,children:N},void 0,!1,{fileName:_,lineNumber:132,columnNumber:7},this):!T&&!E&&!U&&!W?(0,g.jsxDEV)(`div`,{className:`flex flex-col items-center justify-center h-full gap-2 text-muted-foreground`,children:[(0,g.jsxDEV)(l,{className:`size-8`},void 0,!1,{fileName:_,lineNumber:140,columnNumber:9},this),(0,g.jsxDEV)(`p`,{className:`text-sm`,children:`No content changes`},void 0,!1,{fileName:_,lineNumber:141,columnNumber:9},this),t&&(0,g.jsxDEV)(`p`,{className:`text-xs font-mono`,children:t},void 0,!1,{fileName:_,lineNumber:142,columnNumber:22},this)]},void 0,!0,{fileName:_,lineNumber:139,columnNumber:7},this):(0,g.jsxDEV)(`div`,{className:`flex flex-col h-full`,children:[!K&&(0,g.jsxDEV)(`div`,{className:`flex items-center justify-end gap-0.5 px-2 py-0.5 border-b border-border shrink-0`,children:[(0,g.jsxDEV)(`button`,{type:`button`,onClick:()=>I(F===`left`?`both`:`left`),className:`p-1 rounded hover:bg-muted transition-colors ${F===`left`?`bg-muted text-foreground`:``}`,title:`Expand original`,children:(0,g.jsxDEV)(c,{className:`size-3.5`},void 0,!1,{fileName:_,lineNumber:157,columnNumber:13},this)},void 0,!1,{fileName:_,lineNumber:152,columnNumber:11},this),(0,g.jsxDEV)(`button`,{type:`button`,onClick:()=>I(`both`),className:`p-1 rounded hover:bg-muted transition-colors ${F===`both`?`bg-muted text-foreground`:``}`,title:`Side by side`,children:(0,g.jsxDEV)(i,{className:`size-3.5`},void 0,!1,{fileName:_,lineNumber:164,columnNumber:13},this)},void 0,!1,{fileName:_,lineNumber:159,columnNumber:11},this),(0,g.jsxDEV)(`button`,{type:`button`,onClick:()=>I(F===`right`?`both`:`right`),className:`p-1 rounded hover:bg-muted transition-colors ${F===`right`?`bg-muted text-foreground`:``}`,title:`Expand modified`,children:(0,g.jsxDEV)(p,{className:`size-3.5`},void 0,!1,{fileName:_,lineNumber:171,columnNumber:13},this)},void 0,!1,{fileName:_,lineNumber:166,columnNumber:11},this),(0,g.jsxDEV)(`div`,{className:`w-px h-3.5 bg-border mx-0.5 shrink-0`},void 0,!1,{fileName:_,lineNumber:173,columnNumber:11},this),(0,g.jsxDEV)(`button`,{type:`button`,onClick:R,title:`Toggle word wrap`,className:`p-1 rounded hover:bg-muted transition-colors ${L?`bg-muted text-foreground`:``}`,children:(0,g.jsxDEV)(m,{className:`size-3.5`},void 0,!1,{fileName:_,lineNumber:177,columnNumber:13},this)},void 0,!1,{fileName:_,lineNumber:174,columnNumber:11},this)]},void 0,!0,{fileName:_,lineNumber:151,columnNumber:9},this),(0,g.jsxDEV)(`div`,{ref:B,className:`flex-1 overflow-hidden`,children:V&&V>0?(0,g.jsxDEV)(d,{height:V,language:G,original:U,modified:W,theme:z,options:{fontSize:K?11:13,fontFamily:`Menlo, Monaco, Consolas, monospace`,wordWrap:K||L?`on`:`off`,renderSideBySide:q,readOnly:!0,automaticLayout:!0,scrollBeyondLastLine:!1},loading:(0,g.jsxDEV)(u,{className:`size-5 animate-spin text-muted-foreground`},void 0,!1,{fileName:_,lineNumber:199,columnNumber:22},this)},void 0,!1,{fileName:_,lineNumber:184,columnNumber:11},this):(0,g.jsxDEV)(`div`,{className:`flex items-center justify-center h-full`,children:(0,g.jsxDEV)(u,{className:`size-5 animate-spin text-muted-foreground`},void 0,!1,{fileName:_,lineNumber:203,columnNumber:13},this)},void 0,!1,{fileName:_,lineNumber:202,columnNumber:11},this)},void 0,!1,{fileName:_,lineNumber:182,columnNumber:7},this)]},void 0,!0,{fileName:_,lineNumber:148,columnNumber:5},this)}function b(e){let t=e.split(`
2
- `),n=[],r=[],i=!1;for(let e of t)if(!(e.startsWith(`diff --git`)||e.startsWith(`diff --no-index`)||e.startsWith(`index `)||e.startsWith(`new file`)||e.startsWith(`deleted file`)||e.startsWith(`old mode`)||e.startsWith(`new mode`)||e.startsWith(`---`)||e.startsWith(`+++`)||e.startsWith(`Binary files`)||e.startsWith(`\\ No newline`))){if(e.startsWith(`@@`)){i=!0;continue}if(i)if(e.startsWith(`-`))n.push(e.slice(1));else if(e.startsWith(`+`))r.push(e.slice(1));else{let t=e.startsWith(` `)?e.slice(1):e;n.push(t),r.push(t)}}return{original:n.join(`
3
- `),modified:r.join(`
4
- `)}}export{y as DiffViewer};
@@ -1 +0,0 @@
1
- import{i as e,t}from"./react-4j_0SqET.js";import{A as n,M as r,N as i,j as a,t as o}from"./input-D3FZB4A8.js";import{n as s,t as c}from"./jsx-dev-runtime-B0R0R7SH.js";import{a as l,t as u}from"./tab-store-HCmwXLYA.js";import"./jsx-runtime-CdTrtNt5.js";import{t as d}from"./utils-DC-bdPS3.js";import{i as f,t as p}from"./api-client-Bs-0pRox.js";import{D as m,E as h,M as g,N as _,O as v,V as y,Y as b,a as x,c as S,d as C,f as w,h as T,l as E,m as D,o as O,p as k,s as A,u as j,w as M,z as N}from"./index-cCRyobYW.js";var ee=s(`cherry`,[[`path`,{d:`M2 17a5 5 0 0 0 10 0c0-2.76-2.5-5-5-3-2.5-2-5 .24-5 3Z`,key:`cvxqlc`}],[`path`,{d:`M12 17a5 5 0 0 0 10 0c0-2.76-2.5-5-5-3-2.5-2-5 .24-5 3Z`,key:`1ostrc`}],[`path`,{d:`M7 14c3.22-2.91 4.29-8.75 5-12 1.66 2.38 4.94 9 5 12`,key:`hqx58h`}],[`path`,{d:`M22 9c-4.29 0-7.14-2.33-10-7 5.71 0 10 4.67 10 7Z`,key:`eykp1o`}]]),te=s(`git-merge`,[[`circle`,{cx:`18`,cy:`18`,r:`3`,key:`1xkwt0`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`path`,{d:`M6 21V9a9 9 0 0 0 9 9`,key:`7kw0sc`}]]),P=s(`tag`,[[`path`,{d:`M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z`,key:`vktsd0`}],[`circle`,{cx:`7.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`kqv944`}]]),F=e(t(),1),I=[`#0085d9`,`#d73a49`,`#6f42c1`,`#2cbe4e`,`#e36209`,`#005cc5`,`#b31d28`,`#5a32a3`,`#22863a`,`#cb2431`];function ne(e){let t=new Map;if(!e)return t;let n=new Set;for(let t of e.branches)if(!t.remote)for(let e of t.remotes)n.add(`remotes/${e}/${t.name}`);for(let r of e.branches)if(r.remote){if(n.has(r.name))continue;let e=t.get(r.commitHash)??[],i=r.name.replace(/^remotes\//,``);e.push({name:i,type:`branch`,remotes:[],current:!1}),t.set(r.commitHash,e)}else{let e=t.get(r.commitHash)??[];e.push({name:r.name,type:`branch`,remotes:r.remotes,current:r.current}),t.set(r.commitHash,e)}for(let n of e.commits)for(let e of n.refs)if(e.startsWith(`tag: `)){let r=e.replace(`tag: `,``),i=t.get(n.hash)??[];i.push({name:r,type:`tag`,remotes:[],current:!1}),t.set(n.hash,i)}return t}function re(e){let t=new Map;if(!e)return{laneMap:t,maxLane:0,unloadedParentLanes:new Map};let n=0,r=0,i=new Map,a=new Set(e.commits.map(e=>e.hash)),o=[],s=()=>o.length>0?(o.sort((e,t)=>e-t),o.shift()):n++;for(let n of e.commits){let e=i.get(n.hash);e===void 0&&(e=s()),t.set(n.hash,e),e>r&&(r=e),i.delete(n.hash);let a=!1;for(let t=0;t<n.parents.length;t++){let o=n.parents[t];if(!i.has(o))if(t===0)i.set(o,e),a=!0;else{let e=s();i.set(o,e),e>r&&(r=e)}}a||o.push(e)}let c=new Map;for(let[e,t]of i)a.has(e)||c.set(e,t);return{laneMap:t,maxLane:r,unloadedParentLanes:c}}function ie(e,t,n,r){if(!e)return[];let i=[],a=new Set(e.commits.map(e=>e.hash));for(let o=0;o<e.commits.length;o++){let s=e.commits[o],c=t.get(s.hash)??0,l=I[c%I.length];for(let u of s.parents){let d=e.commits.findIndex(e=>e.hash===u);if(d>=0){let e=t.get(u)??0,n=I[e%I.length],r=c*16+16/2,a=o*24+24/2,f=e*16+16/2,p=d*24+24/2,m,h=s.parents.indexOf(u)>0;if(r===f)m=`M ${r} ${a} L ${f} ${p}`;else if(h){let e=a+24;m=`M ${r} ${a} C ${r} ${e} ${f} ${a} ${f} ${e} L ${f} ${p}`}else{let e=p-24;m=`M ${r} ${a} L ${r} ${e} C ${r} ${p} ${f} ${e} ${f} ${p}`}let g=s.parents.indexOf(u)===0?l:n;i.push({d:m,color:g})}else if(!a.has(u)){let e=n.get(u)??c,t=I[e%I.length],a=c*16+16/2,s=o*24+24/2,d=e*16+16/2;if(a===d)i.push({d:`M ${a} ${s} L ${a} ${r}`,color:l});else{let e=s+24,n=`M ${a} ${s} C ${a} ${e} ${d} ${s} ${d} ${e} L ${d} ${r}`;i.push({d:n,color:t})}}}}return i}function ae(e){let t=new Date(e),n=new Date().getTime()-t.getTime(),r=Math.floor(n/6e4);if(r<1)return`just now`;if(r<60)return`${r}m ago`;let i=Math.floor(r/60);if(i<24)return`${i}h ago`;let a=Math.floor(i/24);if(a<30)return`${a}d ago`;let o=Math.floor(a/30);return o<12?`${o}mo ago`:`${Math.floor(o/12)}y ago`}var L=200;function R(e){let[t,n]=(0,F.useState)(null),[r,i]=(0,F.useState)(!0),[a,o]=(0,F.useState)(!1),[s,c]=(0,F.useState)(!0),[l,d]=(0,F.useState)(null),[m,h]=(0,F.useState)(!1),[g,_]=(0,F.useState)(null),[v,y]=(0,F.useState)([]),[b,x]=(0,F.useState)(!1),[S,C]=(0,F.useState)(`__all__`),[w,T]=(0,F.useState)(``),[E,D]=(0,F.useState)(!1),{openTab:O}=u(),k=(0,F.useRef)(0),A=(0,F.useCallback)(async()=>{if(e)try{i(!0);let t=Math.max(L,k.current),r=await p.get(`${f(e)}/git/graph?max=${t}`);n(r),k.current=r.commits.length,c(r.commits.length>=t),d(null)}catch(e){d(e instanceof Error?e.message:`Failed to fetch graph`)}finally{i(!1)}},[e]),j=(0,F.useCallback)(async()=>{if(!(!e||a||!s))try{o(!0);let t=k.current,r=await p.get(`${f(e)}/git/graph?max=${L}&skip=${t}`);if(r.commits.length===0){c(!1);return}n(e=>{if(!e)return r;let t=new Set(e.commits.map(e=>e.hash)),n=r.commits.filter(e=>!t.has(e.hash)),i=new Set(e.branches.map(e=>e.name)),a=r.branches.filter(e=>!i.has(e.name));return{commits:[...e.commits,...n],branches:[...e.branches,...a],head:e.head}}),k.current=t+r.commits.length,c(r.commits.length>=L)}catch(e){d(e instanceof Error?e.message:`Failed to load more`)}finally{o(!1)}},[e,a,s]);(0,F.useEffect)(()=>{A();let e=setInterval(A,1e4);return()=>clearInterval(e)},[A]);let M=async(t,n)=>{if(e){h(!0);try{await p.post(`${f(e)}${t}`,n),await A()}catch(e){d(e instanceof Error?e.message:`Action failed`)}finally{h(!1)}}},N=()=>M(`/git/fetch`,{}),ee=e=>M(`/git/checkout`,{ref:e}),te=e=>M(`/git/cherry-pick`,{hash:e}),P=e=>M(`/git/revert`,{hash:e}),I=e=>M(`/git/merge`,{source:e}),ae=e=>M(`/git/branch/delete`,{name:e}),R=e=>M(`/git/push`,{branch:e}),z=(e,t)=>M(`/git/tag`,{name:e,hash:t}),B=e=>navigator.clipboard.writeText(e),V=async(e,n)=>{if(t?.branches.some(t=>t.name===e||t.name.endsWith(`/${e}`))){if(!window.confirm(`Branch "${e}" already exists.\nDelete and recreate from this commit?`))return;await M(`/git/branch/delete`,{name:e})}await M(`/git/branch/create`,{name:e,from:n})},oe=async t=>{if(e)try{let n=await p.get(`${f(e)}/git/pr-url?branch=${encodeURIComponent(t)}`);n.url&&window.open(n.url,`_blank`)}catch{}},H=async t=>{if(g?.hash===t.hash){_(null);return}_(t),x(!0);try{let n=t.parents[0]??``,r=n?`ref1=${encodeURIComponent(n)}&`:``,i=await p.get(`${f(e)}/git/diff-stat?${r}ref2=${encodeURIComponent(t.hash)}`);y(Array.isArray(i)?i:[])}catch{y([])}finally{x(!1)}},U=t=>O({type:`git-diff`,title:`Diff ${t.abbreviatedHash}`,closable:!0,metadata:{projectName:e,ref1:t.parents[0]??void 0,ref2:t.hash},projectId:e??null}),se=(0,F.useMemo)(()=>ne(t),[t]),W=t?.branches.find(e=>e.current),G=t?.head??``,K=(0,F.useMemo)(()=>{if(!t)return[];let e=t.commits;if(S!==`__all__`){let n=t.branches.find(e=>e.name===S);if(n){let r=new Set,i=[n.commitHash];for(;i.length>0;){let e=i.pop();if(r.has(e))continue;r.add(e);let n=t.commits.find(t=>t.hash===e);n&&i.push(...n.parents)}e=e.filter(e=>r.has(e.hash))}}if(w.trim()){let t=w.toLowerCase();e=e.filter(e=>e.subject.toLowerCase().includes(t)||e.authorName.toLowerCase().includes(t)||e.abbreviatedHash.includes(t)||e.hash.includes(t))}return e},[t,S,w]),q=(0,F.useMemo)(()=>t?{...t,commits:K}:null,[t,K]),J=(0,F.useMemo)(()=>re(q),[q]),Y=K.length*24+48;return{data:t,loading:r,loadingMore:a,hasMore:s,error:l,acting:m,selectedCommit:g,setSelectedCommit:_,commitFiles:v,loadingDetail:b,branchFilter:S,setBranchFilter:C,searchQuery:w,setSearchQuery:T,showSearch:E,setShowSearch:D,fetchGraph:A,fetchFromRemotes:N,loadMore:j,handleCheckout:ee,handleCherryPick:te,handleRevert:P,handleMerge:I,handleDeleteBranch:ae,handlePushBranch:R,handleCreateBranch:V,handleCreateTag:z,handleCreatePr:oe,copyHash:B,selectCommit:H,openDiffForCommit:U,commitLabels:se,currentBranch:W,headHash:G,filteredCommits:K,filteredLanes:J,svgHeight:Y,svgPaths:(0,F.useMemo)(()=>ie(q,J.laneMap,J.unloadedParentLanes,Y),[q,J.laneMap,J.unloadedParentLanes,Y])}}function z(e){let[t,n]=(0,F.useState)(e),r=(0,F.useRef)(e);r.current=t;let i=(0,F.useRef)(!1);return{widths:t,startResize:(e,t)=>{i.current=!0;let a=r.current[e]??80,o=r=>{if(!i.current)return;let o=`touches`in r?r.touches[0].clientX:r.clientX,s=Math.max(40,a+o-t);n(t=>({...t,[e]:s}))},s=()=>{i.current=!1,window.removeEventListener(`mousemove`,o),window.removeEventListener(`mouseup`,s),window.removeEventListener(`touchmove`,o),window.removeEventListener(`touchend`,s)};window.addEventListener(`mousemove`,o),window.addEventListener(`mouseup`,s),window.addEventListener(`touchmove`,o,{passive:!1}),window.addEventListener(`touchend`,s)}}}var B=c(),V=`/Users/hienlh/Projects/ppm/src/web/components/git/git-graph-toolbar.tsx`;function oe({branches:e,branchFilter:t,onBranchFilterChange:i,searchQuery:a,onSearchQueryChange:s,showSearch:c,onToggleSearch:l,onFetch:u,onRefresh:d,onOpenSettings:f,loading:p,acting:g,projectName:_}){let y=e.filter(e=>!e.remote),[b,x]=(0,F.useState)(!1),[S,C]=(0,F.useState)(``),w=(0,F.useRef)(null);(0,F.useEffect)(()=>{if(!b)return;let e=e=>{w.current&&!w.current.contains(e.target)&&(x(!1),C(``))};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[b]);let T=S?y.filter(e=>e.name.toLowerCase().includes(S.toLowerCase())):y,E=t===`__all__`?`Show All`:y.find(e=>e.name===t)?.name??`Show All`;return(0,B.jsxDEV)(`div`,{className:`border-b bg-background`,children:(0,B.jsxDEV)(`div`,{className:`flex items-center gap-1.5 px-2 py-1.5`,children:[(0,B.jsxDEV)(`div`,{className:`flex items-center gap-1 text-xs text-muted-foreground shrink-0`,children:[(0,B.jsxDEV)(`span`,{className:`font-semibold`,children:`Repo:`},void 0,!1,{fileName:V,lineNumber:80,columnNumber:11},this),(0,B.jsxDEV)(`span`,{className:`font-medium text-foreground truncate max-w-[120px]`,children:_??`—`},void 0,!1,{fileName:V,lineNumber:81,columnNumber:11},this)]},void 0,!0,{fileName:V,lineNumber:79,columnNumber:9},this),(0,B.jsxDEV)(`div`,{className:`w-px h-4 bg-border mx-1`},void 0,!1,{fileName:V,lineNumber:86,columnNumber:9},this),(0,B.jsxDEV)(`div`,{className:`relative shrink-0`,ref:w,children:[(0,B.jsxDEV)(`button`,{type:`button`,className:`flex items-center gap-1 h-6 px-2 text-xs border rounded-md bg-transparent hover:bg-muted/50`,onClick:()=>{x(e=>!e),C(``)},children:[(0,B.jsxDEV)(`span`,{className:`font-semibold text-muted-foreground`,children:`Branches:`},void 0,!1,{fileName:V,lineNumber:95,columnNumber:13},this),(0,B.jsxDEV)(`span`,{className:`max-w-[100px] truncate`,children:E},void 0,!1,{fileName:V,lineNumber:96,columnNumber:13},this),(0,B.jsxDEV)(r,{className:`size-3 opacity-50`},void 0,!1,{fileName:V,lineNumber:97,columnNumber:13},this)]},void 0,!0,{fileName:V,lineNumber:90,columnNumber:11},this),b&&(0,B.jsxDEV)(`div`,{className:`absolute top-full left-0 mt-1 z-50 w-[220px] rounded-md border bg-popover shadow-md`,children:[(0,B.jsxDEV)(`div`,{className:`p-1.5`,children:(0,B.jsxDEV)(o,{className:`h-6 text-xs px-2`,placeholder:`Filter branches...`,value:S,onChange:e=>C(e.target.value),autoFocus:!0},void 0,!1,{fileName:V,lineNumber:102,columnNumber:17},this)},void 0,!1,{fileName:V,lineNumber:101,columnNumber:15},this),(0,B.jsxDEV)(`div`,{className:`max-h-[200px] overflow-y-auto p-1`,children:[(0,B.jsxDEV)(H,{label:`Show All`,selected:t===`__all__`,onClick:()=>{i(`__all__`),x(!1)}},void 0,!1,{fileName:V,lineNumber:111,columnNumber:17},this),T.map(e=>(0,B.jsxDEV)(H,{label:e.name,current:e.current,selected:t===e.name,onClick:()=>{i(e.name),x(!1)}},e.name,!1,{fileName:V,lineNumber:117,columnNumber:19},this)),T.length===0&&S&&(0,B.jsxDEV)(`div`,{className:`px-2 py-1.5 text-xs text-muted-foreground`,children:`No branches found`},void 0,!1,{fileName:V,lineNumber:126,columnNumber:19},this)]},void 0,!0,{fileName:V,lineNumber:110,columnNumber:15},this)]},void 0,!0,{fileName:V,lineNumber:100,columnNumber:13},this)]},void 0,!0,{fileName:V,lineNumber:89,columnNumber:9},this),(0,B.jsxDEV)(`div`,{className:`flex-1`},void 0,!1,{fileName:V,lineNumber:133,columnNumber:9},this),c&&(0,B.jsxDEV)(`div`,{className:`flex items-center gap-1`,children:[(0,B.jsxDEV)(o,{className:`h-6 text-xs w-[160px] px-2`,placeholder:`Search commits...`,value:a,onChange:e=>s(e.target.value),autoFocus:!0},void 0,!1,{fileName:V,lineNumber:138,columnNumber:13},this),(0,B.jsxDEV)(j,{variant:`ghost`,size:`icon-xs`,onClick:l,children:(0,B.jsxDEV)(n,{className:`size-3`},void 0,!1,{fileName:V,lineNumber:146,columnNumber:15},this)},void 0,!1,{fileName:V,lineNumber:145,columnNumber:13},this)]},void 0,!0,{fileName:V,lineNumber:137,columnNumber:11},this),!c&&(0,B.jsxDEV)(j,{variant:`ghost`,size:`icon-xs`,onClick:l,title:`Find`,children:(0,B.jsxDEV)(m,{className:`size-3.5`},void 0,!1,{fileName:V,lineNumber:154,columnNumber:13},this)},void 0,!1,{fileName:V,lineNumber:153,columnNumber:11},this),(0,B.jsxDEV)(j,{variant:`ghost`,size:`icon-xs`,onClick:f,title:`Settings`,children:(0,B.jsxDEV)(h,{className:`size-3.5`},void 0,!1,{fileName:V,lineNumber:158,columnNumber:11},this)},void 0,!1,{fileName:V,lineNumber:157,columnNumber:9},this),(0,B.jsxDEV)(j,{variant:`ghost`,size:`icon-xs`,onClick:u,disabled:g,title:`Fetch`,children:(0,B.jsxDEV)(N,{className:`size-3.5`},void 0,!1,{fileName:V,lineNumber:161,columnNumber:11},this)},void 0,!1,{fileName:V,lineNumber:160,columnNumber:9},this),(0,B.jsxDEV)(j,{variant:`ghost`,size:`icon-xs`,onClick:d,disabled:g,title:`Refresh`,children:(0,B.jsxDEV)(v,{className:`size-3.5 ${p?`animate-spin`:``}`},void 0,!1,{fileName:V,lineNumber:164,columnNumber:11},this)},void 0,!1,{fileName:V,lineNumber:163,columnNumber:9},this)]},void 0,!0,{fileName:V,lineNumber:77,columnNumber:7},this)},void 0,!1,{fileName:V,lineNumber:76,columnNumber:5},this)}function H({label:e,selected:t,current:n,onClick:r}){return(0,B.jsxDEV)(`button`,{type:`button`,className:`flex items-center gap-2 w-full px-2 py-1 text-xs rounded-sm hover:bg-accent hover:text-accent-foreground text-left`,onClick:r,children:[(0,B.jsxDEV)(i,{className:`size-3 shrink-0 ${t?`opacity-100`:`opacity-0`}`},void 0,!1,{fileName:V,lineNumber:188,columnNumber:7},this),(0,B.jsxDEV)(`span`,{className:`truncate flex-1`,children:e},void 0,!1,{fileName:V,lineNumber:189,columnNumber:7},this),n&&(0,B.jsxDEV)(`span`,{className:`text-[10px] text-muted-foreground italic`,children:`current`},void 0,!1,{fileName:V,lineNumber:191,columnNumber:9},this)]},void 0,!0,{fileName:V,lineNumber:183,columnNumber:5},this)}var U=`/Users/hienlh/Projects/ppm/src/web/components/git/git-graph-svg.tsx`;function se({commits:e,laneMap:t,svgPaths:n,width:r,height:i,headHash:a}){return(0,B.jsxDEV)(`svg`,{width:r,height:i,children:[n.map((e,t)=>(0,B.jsxDEV)(`path`,{d:e.d,stroke:e.color,strokeWidth:2,fill:`none`},t,!1,{fileName:U,lineNumber:25,columnNumber:9},this)),e.map((e,n)=>{let r=t.get(e.hash)??0,i=r*16+16/2,o=n*24+24/2,s=I[r%I.length],c=e.hash===a;return(0,B.jsxDEV)(`circle`,{cx:i,cy:o,r:c?5:4,fill:s,stroke:c?`#000`:`none`,strokeWidth:c?2:0},e.hash,!1,{fileName:U,lineNumber:41,columnNumber:11},this)})]},void 0,!0,{fileName:U,lineNumber:22,columnNumber:5},this)}var W=`/Users/hienlh/Projects/ppm/src/web/components/git/git-graph-branch-label.tsx`;function G({name:e,type:t,remotes:n,isCurrent:r,color:i,currentBranch:a,onCheckout:o,onMerge:s,onPush:c,onCreatePr:u,onDelete:d}){return t===`tag`?(0,B.jsxDEV)(`span`,{className:`inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-[10px] font-medium shrink-0 bg-amber-500/20 text-amber-500 border border-amber-500/30`,children:[(0,B.jsxDEV)(P,{className:`size-2.5`},void 0,!1,{fileName:W,lineNumber:48,columnNumber:9},this),e]},void 0,!0,{fileName:W,lineNumber:47,columnNumber:7},this):(0,B.jsxDEV)(C,{children:[(0,B.jsxDEV)(T,{asChild:!0,children:(0,B.jsxDEV)(`span`,{className:`inline-flex items-center rounded text-[10px] font-medium shrink-0 cursor-context-menu overflow-hidden`,style:{border:r?`1.5px solid ${i}`:`1px solid ${i}50`},children:[(0,B.jsxDEV)(`span`,{className:`inline-flex items-center gap-0.5 px-1.5 py-0.5`,style:{backgroundColor:r?i:`${i}30`,color:r?`#fff`:i},children:[(0,B.jsxDEV)(_,{className:`size-2.5`},void 0,!1,{fileName:W,lineNumber:73,columnNumber:13},this),e]},void 0,!0,{fileName:W,lineNumber:66,columnNumber:11},this),n.map(e=>(0,B.jsxDEV)(`span`,{className:`px-1.5 py-0.5 italic opacity-70`,style:{borderLeft:`1px solid ${i}40`,color:i,backgroundColor:`${i}15`},children:e},e,!1,{fileName:W,lineNumber:78,columnNumber:13},this))]},void 0,!0,{fileName:W,lineNumber:57,columnNumber:9},this)},void 0,!1,{fileName:W,lineNumber:56,columnNumber:7},this),(0,B.jsxDEV)(w,{children:[(0,B.jsxDEV)(k,{onClick:()=>o(e),children:`Checkout`},void 0,!1,{fileName:W,lineNumber:93,columnNumber:9},this),(0,B.jsxDEV)(k,{onClick:()=>s(e),disabled:e===a?.name,children:[(0,B.jsxDEV)(te,{className:`size-3`},void 0,!1,{fileName:W,lineNumber:100,columnNumber:11},this),`Merge into current`]},void 0,!0,{fileName:W,lineNumber:96,columnNumber:9},this),(0,B.jsxDEV)(D,{},void 0,!1,{fileName:W,lineNumber:103,columnNumber:9},this),(0,B.jsxDEV)(k,{onClick:()=>c(e),children:[(0,B.jsxDEV)(b,{className:`size-3`},void 0,!1,{fileName:W,lineNumber:105,columnNumber:11},this),`Push`]},void 0,!0,{fileName:W,lineNumber:104,columnNumber:9},this),(0,B.jsxDEV)(k,{onClick:()=>u(e),children:[(0,B.jsxDEV)(l,{className:`size-3`},void 0,!1,{fileName:W,lineNumber:109,columnNumber:11},this),`Create PR`]},void 0,!0,{fileName:W,lineNumber:108,columnNumber:9},this),(0,B.jsxDEV)(D,{},void 0,!1,{fileName:W,lineNumber:112,columnNumber:9},this),(0,B.jsxDEV)(k,{variant:`destructive`,onClick:()=>d(e),disabled:e===a?.name,children:[(0,B.jsxDEV)(M,{className:`size-3`},void 0,!1,{fileName:W,lineNumber:118,columnNumber:11},this),`Delete`]},void 0,!0,{fileName:W,lineNumber:113,columnNumber:9},this)]},void 0,!0,{fileName:W,lineNumber:92,columnNumber:7},this)]},void 0,!0,{fileName:W,lineNumber:55,columnNumber:5},this)}var K=`/Users/hienlh/Projects/ppm/src/web/components/git/git-graph-row.tsx`;function q({commit:e,lane:t,isSelected:n,isHead:r,labels:i,currentBranch:o,onSelect:s,onCheckout:c,onCherryPick:l,onRevert:u,onMerge:d,onDeleteBranch:f,onPushBranch:p,onCreatePr:m,onOpenCreateBranch:h,onOpenCreateTag:g,onOpenDiff:v,onCopyHash:b}){let x=I[t%I.length],S=i.filter(e=>e.type===`branch`),E=i.filter(e=>e.type===`tag`);return(0,B.jsxDEV)(C,{children:[(0,B.jsxDEV)(T,{asChild:!0,children:(0,B.jsxDEV)(`tr`,{className:`hover:bg-muted/50 cursor-pointer border-b border-border/20 ${n?`bg-primary/10`:``} ${r?`font-medium`:``}`,style:{height:`24px`},onClick:s,children:[(0,B.jsxDEV)(`td`,{className:`px-2 truncate max-w-0`,children:(0,B.jsxDEV)(`div`,{className:`flex items-center gap-1.5 min-w-0`,children:[S.map(e=>(0,B.jsxDEV)(G,{name:e.name,type:`branch`,remotes:e.remotes,isCurrent:e.current,color:x,currentBranch:o,onCheckout:c,onMerge:d,onPush:p,onCreatePr:m,onDelete:f},`branch-${e.name}`,!1,{fileName:K,lineNumber:85,columnNumber:17},this)),E.map(e=>(0,B.jsxDEV)(G,{name:e.name,type:`tag`,remotes:[],isCurrent:!1,color:x,currentBranch:o,onCheckout:c,onMerge:d,onPush:p,onCreatePr:m,onDelete:f},`tag-${e.name}`,!1,{fileName:K,lineNumber:101,columnNumber:17},this)),(0,B.jsxDEV)(`span`,{className:`truncate text-xs`,children:e.subject},void 0,!1,{fileName:K,lineNumber:116,columnNumber:15},this)]},void 0,!0,{fileName:K,lineNumber:83,columnNumber:13},this)},void 0,!1,{fileName:K,lineNumber:82,columnNumber:11},this),(0,B.jsxDEV)(`td`,{className:`px-2 text-xs text-muted-foreground whitespace-nowrap shrink-0`,children:ae(e.authorDate)},void 0,!1,{fileName:K,lineNumber:121,columnNumber:11},this),(0,B.jsxDEV)(`td`,{className:`px-2 text-xs text-muted-foreground truncate max-w-[120px]`,children:e.authorName},void 0,!1,{fileName:K,lineNumber:126,columnNumber:11},this),(0,B.jsxDEV)(`td`,{className:`px-2 text-xs text-muted-foreground font-mono whitespace-nowrap`,children:e.abbreviatedHash},void 0,!1,{fileName:K,lineNumber:131,columnNumber:11},this)]},void 0,!0,{fileName:K,lineNumber:74,columnNumber:9},this)},void 0,!1,{fileName:K,lineNumber:73,columnNumber:7},this),(0,B.jsxDEV)(w,{children:[(0,B.jsxDEV)(k,{onClick:()=>c(e.hash),children:`Checkout`},void 0,!1,{fileName:K,lineNumber:138,columnNumber:9},this),(0,B.jsxDEV)(k,{onClick:()=>h(e.hash),children:[(0,B.jsxDEV)(_,{className:`size-3`},void 0,!1,{fileName:K,lineNumber:142,columnNumber:11},this),`Create Branch...`]},void 0,!0,{fileName:K,lineNumber:141,columnNumber:9},this),(0,B.jsxDEV)(D,{},void 0,!1,{fileName:K,lineNumber:145,columnNumber:9},this),(0,B.jsxDEV)(k,{onClick:()=>l(e.hash),children:[(0,B.jsxDEV)(ee,{className:`size-3`},void 0,!1,{fileName:K,lineNumber:147,columnNumber:11},this),`Cherry Pick`]},void 0,!0,{fileName:K,lineNumber:146,columnNumber:9},this),(0,B.jsxDEV)(k,{onClick:()=>u(e.hash),children:[(0,B.jsxDEV)(a,{className:`size-3`},void 0,!1,{fileName:K,lineNumber:151,columnNumber:11},this),`Revert`]},void 0,!0,{fileName:K,lineNumber:150,columnNumber:9},this),(0,B.jsxDEV)(k,{onClick:()=>g(e.hash),children:[(0,B.jsxDEV)(P,{className:`size-3`},void 0,!1,{fileName:K,lineNumber:155,columnNumber:11},this),`Create Tag...`]},void 0,!0,{fileName:K,lineNumber:154,columnNumber:9},this),(0,B.jsxDEV)(D,{},void 0,!1,{fileName:K,lineNumber:158,columnNumber:9},this),(0,B.jsxDEV)(k,{onClick:v,children:`View Diff`},void 0,!1,{fileName:K,lineNumber:159,columnNumber:9},this),(0,B.jsxDEV)(k,{onClick:b,children:[(0,B.jsxDEV)(y,{className:`size-3`},void 0,!1,{fileName:K,lineNumber:161,columnNumber:11},this),`Copy Hash`]},void 0,!0,{fileName:K,lineNumber:160,columnNumber:9},this)]},void 0,!0,{fileName:K,lineNumber:137,columnNumber:7},this)]},void 0,!0,{fileName:K,lineNumber:72,columnNumber:5},this)}var J=`/Users/hienlh/Projects/ppm/src/web/components/git/git-graph-detail.tsx`;function Y({commit:e,files:t,loadingDetail:n,projectName:r,onClose:i,copyHash:a}){let{openTab:o}=u();return(0,B.jsxDEV)(`div`,{className:`border-t bg-muted/30 max-h-[40%] overflow-auto`,children:[(0,B.jsxDEV)(`div`,{className:`px-3 py-2 border-b flex items-center justify-between`,children:[(0,B.jsxDEV)(`span`,{className:`text-sm font-medium truncate`,children:[e.abbreviatedHash,` — `,e.subject]},void 0,!0,{fileName:J,lineNumber:28,columnNumber:9},this),(0,B.jsxDEV)(j,{variant:`ghost`,size:`icon-xs`,onClick:i,children:`✕`},void 0,!1,{fileName:J,lineNumber:31,columnNumber:9},this)]},void 0,!0,{fileName:J,lineNumber:27,columnNumber:7},this),(0,B.jsxDEV)(`div`,{className:`px-3 py-2 text-xs space-y-1`,children:[(0,B.jsxDEV)(`div`,{className:`flex gap-4`,children:[(0,B.jsxDEV)(`span`,{className:`text-muted-foreground w-12 shrink-0`,children:`Author`},void 0,!1,{fileName:J,lineNumber:37,columnNumber:11},this),(0,B.jsxDEV)(`span`,{children:[e.authorName,` <`,e.authorEmail,`>`]},void 0,!0,{fileName:J,lineNumber:38,columnNumber:11},this)]},void 0,!0,{fileName:J,lineNumber:36,columnNumber:9},this),(0,B.jsxDEV)(`div`,{className:`flex gap-4`,children:[(0,B.jsxDEV)(`span`,{className:`text-muted-foreground w-12 shrink-0`,children:`Date`},void 0,!1,{fileName:J,lineNumber:43,columnNumber:11},this),(0,B.jsxDEV)(`span`,{children:new Date(e.authorDate).toLocaleString()},void 0,!1,{fileName:J,lineNumber:44,columnNumber:11},this)]},void 0,!0,{fileName:J,lineNumber:42,columnNumber:9},this),(0,B.jsxDEV)(`div`,{className:`flex gap-4`,children:[(0,B.jsxDEV)(`span`,{className:`text-muted-foreground w-12 shrink-0`,children:`Hash`},void 0,!1,{fileName:J,lineNumber:47,columnNumber:11},this),(0,B.jsxDEV)(`span`,{className:`font-mono cursor-pointer hover:text-primary`,onClick:()=>a(e.hash),children:e.hash},void 0,!1,{fileName:J,lineNumber:48,columnNumber:11},this)]},void 0,!0,{fileName:J,lineNumber:46,columnNumber:9},this),e.parents.length>0&&(0,B.jsxDEV)(`div`,{className:`flex gap-4`,children:[(0,B.jsxDEV)(`span`,{className:`text-muted-foreground w-12 shrink-0`,children:`Parents`},void 0,!1,{fileName:J,lineNumber:57,columnNumber:13},this),(0,B.jsxDEV)(`span`,{className:`font-mono`,children:e.parents.map(e=>e.slice(0,7)).join(`, `)},void 0,!1,{fileName:J,lineNumber:58,columnNumber:13},this)]},void 0,!0,{fileName:J,lineNumber:56,columnNumber:11},this),e.body&&(0,B.jsxDEV)(`div`,{className:`mt-2 p-2 bg-background rounded text-xs whitespace-pre-wrap`,children:e.body},void 0,!1,{fileName:J,lineNumber:64,columnNumber:11},this)]},void 0,!0,{fileName:J,lineNumber:35,columnNumber:7},this),(0,B.jsxDEV)(`div`,{className:`px-3 py-1 border-t`,children:[(0,B.jsxDEV)(`div`,{className:`text-xs text-muted-foreground py-1`,children:n?`Loading files...`:`${t.length} file${t.length===1?``:`s`} changed`},void 0,!1,{fileName:J,lineNumber:71,columnNumber:9},this),t.map(t=>(0,B.jsxDEV)(`div`,{className:`flex items-center gap-2 py-0.5 text-xs hover:bg-muted/50 rounded px-1 cursor-pointer`,onClick:()=>o({type:`git-diff`,title:`Diff ${d(t.path)}`,closable:!0,metadata:{projectName:r,ref1:e.parents[0]??void 0,ref2:e.hash,filePath:t.path},projectId:r}),children:[(0,B.jsxDEV)(`span`,{className:`flex-1 truncate font-mono`,children:t.path},void 0,!1,{fileName:J,lineNumber:95,columnNumber:13},this),t.additions>0&&(0,B.jsxDEV)(`span`,{className:`text-green-500`,children:[`+`,t.additions]},void 0,!0,{fileName:J,lineNumber:97,columnNumber:15},this),t.deletions>0&&(0,B.jsxDEV)(`span`,{className:`text-red-500`,children:[`-`,t.deletions]},void 0,!0,{fileName:J,lineNumber:100,columnNumber:15},this)]},t.path,!0,{fileName:J,lineNumber:77,columnNumber:11},this))]},void 0,!0,{fileName:J,lineNumber:70,columnNumber:7},this)]},void 0,!0,{fileName:J,lineNumber:26,columnNumber:5},this)}var X=`/Users/hienlh/Projects/ppm/src/web/components/git/git-graph-dialog.tsx`;function ce({type:e,hash:t,onClose:n,onCreateBranch:r,onCreateTag:i}){let[a,s]=(0,F.useState)(``),c=()=>{a.trim()&&(e===`branch`?r(a.trim(),t):i(a.trim(),t),n())};return(0,B.jsxDEV)(x,{open:e!==null,onOpenChange:e=>{e||n()},children:(0,B.jsxDEV)(O,{children:[(0,B.jsxDEV)(S,{children:(0,B.jsxDEV)(E,{children:e===`branch`?`Create Branch`:`Create Tag`},void 0,!1,{fileName:X,lineNumber:48,columnNumber:11},this)},void 0,!1,{fileName:X,lineNumber:47,columnNumber:9},this),(0,B.jsxDEV)(o,{placeholder:e===`branch`?`Branch name`:`Tag name`,value:a,onChange:e=>s(e.target.value),onKeyDown:e=>{e.key===`Enter`&&c()},autoFocus:!0},void 0,!1,{fileName:X,lineNumber:52,columnNumber:9},this),(0,B.jsxDEV)(A,{children:[(0,B.jsxDEV)(j,{variant:`outline`,onClick:n,children:`Cancel`},void 0,!1,{fileName:X,lineNumber:62,columnNumber:11},this),(0,B.jsxDEV)(j,{disabled:!a.trim(),onClick:c,children:`Create`},void 0,!1,{fileName:X,lineNumber:65,columnNumber:11},this)]},void 0,!0,{fileName:X,lineNumber:61,columnNumber:9},this)]},void 0,!0,{fileName:X,lineNumber:46,columnNumber:7},this)},void 0,!1,{fileName:X,lineNumber:40,columnNumber:5},this)}var Z=`/Users/hienlh/Projects/ppm/src/web/components/git/git-graph-settings-dialog.tsx`;function le({open:e,onClose:t,projectName:n,branches:r}){let i=r.filter(e=>!e.remote),a=r.filter(e=>e.remote),o=new Map;for(let e of a){let t=e.name.replace(/^remotes\//,``),n=t.indexOf(`/`);if(n<0)continue;let r=t.slice(0,n),i=t.slice(n+1),a=o.get(r)??[];a.push(i),o.set(r,a)}return(0,B.jsxDEV)(x,{open:e,onOpenChange:e=>{e||t()},children:(0,B.jsxDEV)(O,{className:`max-w-md`,children:[(0,B.jsxDEV)(S,{children:(0,B.jsxDEV)(E,{children:`Repository Settings`},void 0,!1,{fileName:Z,lineNumber:42,columnNumber:11},this)},void 0,!1,{fileName:Z,lineNumber:41,columnNumber:9},this),(0,B.jsxDEV)(`div`,{className:`space-y-4 text-sm`,children:[(0,B.jsxDEV)(Q,{title:`General`,children:[(0,B.jsxDEV)(ue,{label:`Name`,value:n},void 0,!1,{fileName:Z,lineNumber:47,columnNumber:13},this),(0,B.jsxDEV)(ue,{label:`Branches`,value:`${i.length} local, ${a.length} remote`},void 0,!1,{fileName:Z,lineNumber:48,columnNumber:13},this)]},void 0,!0,{fileName:Z,lineNumber:46,columnNumber:11},this),(0,B.jsxDEV)(Q,{title:`Local Branches`,children:i.map(e=>(0,B.jsxDEV)(`div`,{className:`flex items-center gap-2 py-0.5`,children:[(0,B.jsxDEV)(`span`,{className:`text-xs ${e.current?`font-semibold text-primary`:`text-foreground`}`,children:e.name},void 0,!1,{fileName:Z,lineNumber:55,columnNumber:17},this),e.current&&(0,B.jsxDEV)(`span`,{className:`text-[10px] text-muted-foreground italic`,children:`HEAD`},void 0,!1,{fileName:Z,lineNumber:58,columnNumber:31},this),e.remotes.length>0&&(0,B.jsxDEV)(`span`,{className:`text-[10px] text-muted-foreground`,children:[`(`,e.remotes.join(`, `),`)`]},void 0,!0,{fileName:Z,lineNumber:60,columnNumber:19},this)]},e.name,!0,{fileName:Z,lineNumber:54,columnNumber:15},this))},void 0,!1,{fileName:Z,lineNumber:52,columnNumber:11},this),(0,B.jsxDEV)(Q,{title:`Remotes`,children:[[...o.entries()].map(([e,t])=>(0,B.jsxDEV)(`div`,{className:`py-0.5`,children:[(0,B.jsxDEV)(`span`,{className:`text-xs font-medium`,children:e},void 0,!1,{fileName:Z,lineNumber:72,columnNumber:17},this),(0,B.jsxDEV)(`span`,{className:`text-[10px] text-muted-foreground ml-2`,children:[t.length,` branch`,t.length===1?``:`es`]},void 0,!0,{fileName:Z,lineNumber:73,columnNumber:17},this)]},e,!0,{fileName:Z,lineNumber:71,columnNumber:15},this)),o.size===0&&(0,B.jsxDEV)(`span`,{className:`text-xs text-muted-foreground`,children:`No remotes configured`},void 0,!1,{fileName:Z,lineNumber:79,columnNumber:15},this)]},void 0,!0,{fileName:Z,lineNumber:69,columnNumber:11},this)]},void 0,!0,{fileName:Z,lineNumber:44,columnNumber:9},this)]},void 0,!0,{fileName:Z,lineNumber:40,columnNumber:7},this)},void 0,!1,{fileName:Z,lineNumber:39,columnNumber:5},this)}function Q({title:e,children:t}){return(0,B.jsxDEV)(`div`,{children:[(0,B.jsxDEV)(`h4`,{className:`text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-1.5`,children:e},void 0,!1,{fileName:Z,lineNumber:91,columnNumber:7},this),(0,B.jsxDEV)(`div`,{className:`pl-1`,children:t},void 0,!1,{fileName:Z,lineNumber:92,columnNumber:7},this)]},void 0,!0,{fileName:Z,lineNumber:90,columnNumber:5},this)}function ue({label:e,value:t}){return(0,B.jsxDEV)(`div`,{className:`flex items-center gap-3 py-0.5`,children:[(0,B.jsxDEV)(`span`,{className:`text-xs text-muted-foreground w-16 shrink-0`,children:e},void 0,!1,{fileName:Z,lineNumber:100,columnNumber:7},this),(0,B.jsxDEV)(`span`,{className:`text-xs`,children:t},void 0,!1,{fileName:Z,lineNumber:101,columnNumber:7},this)]},void 0,!0,{fileName:Z,lineNumber:99,columnNumber:5},this)}var $=`/Users/hienlh/Projects/ppm/src/web/components/git/git-graph.tsx`;function de({metadata:e}){let t=e?.projectName,n=R(t),[r,i]=(0,F.useState)({type:null}),[a,o]=(0,F.useState)(!1),s=(typeof window<`u`&&window.innerWidth<768?6:10)*16+16,[c,l]=(0,F.useState)(s),u=(0,F.useRef)(s);u.current=c;let d=(0,F.useRef)(!1),f=e=>{d.current=!0;let t=u.current,n=n=>{if(!d.current)return;let r=`touches`in n?n.touches[0].clientX:n.clientX;l(Math.max(40,t+r-e))},r=()=>{d.current=!1,window.removeEventListener(`mousemove`,n),window.removeEventListener(`mouseup`,r),window.removeEventListener(`touchmove`,n),window.removeEventListener(`touchend`,r)};window.addEventListener(`mousemove`,n),window.addEventListener(`mouseup`,r),window.addEventListener(`touchmove`,n,{passive:!1}),window.addEventListener(`touchend`,r)},{widths:p,startResize:m}=z({date:80,author:120,commit:70}),h=(0,F.useRef)(n.loadMore);h.current=n.loadMore;let _=(0,F.useCallback)(e=>{let t=e.currentTarget;t.scrollHeight-t.scrollTop-t.clientHeight<200&&h.current()},[]);return t?n.loading&&!n.data?(0,B.jsxDEV)(me,{},void 0,!1,{fileName:$,lineNumber:70,columnNumber:36},this):n.error&&!n.data?(0,B.jsxDEV)(he,{error:n.error,onRetry:n.fetchGraph},void 0,!1,{fileName:$,lineNumber:71,columnNumber:34},this):(0,B.jsxDEV)(`div`,{className:`flex flex-col h-full`,children:[(0,B.jsxDEV)(oe,{branches:n.data?.branches??[],branchFilter:n.branchFilter,onBranchFilterChange:n.setBranchFilter,searchQuery:n.searchQuery,onSearchQueryChange:n.setSearchQuery,showSearch:n.showSearch,onToggleSearch:()=>n.setShowSearch(!n.showSearch),onFetch:n.fetchFromRemotes,onRefresh:n.fetchGraph,onOpenSettings:()=>o(!0),loading:n.loading,acting:n.acting,projectName:t},void 0,!1,{fileName:$,lineNumber:75,columnNumber:7},this),n.error&&(0,B.jsxDEV)(`div`,{className:`px-3 py-1.5 text-xs text-destructive bg-destructive/10`,children:n.error},void 0,!1,{fileName:$,lineNumber:84,columnNumber:19},this),(0,B.jsxDEV)(`div`,{className:`flex-1 overflow-auto`,onScroll:_,children:(0,B.jsxDEV)(`div`,{className:`flex min-w-max md:min-w-0`,children:[(0,B.jsxDEV)(`div`,{className:`sticky left-0 z-10 shrink-0 bg-background relative overflow-hidden`,style:{width:`${c}px`},children:[(0,B.jsxDEV)(`div`,{className:`text-[11px] font-semibold text-muted-foreground px-2 border-b bg-background sticky top-0 z-20`,style:{height:`24px`,lineHeight:`24px`},children:`Graph`},void 0,!1,{fileName:$,lineNumber:90,columnNumber:13},this),(0,B.jsxDEV)(se,{commits:n.filteredCommits,laneMap:n.filteredLanes.laneMap,svgPaths:n.svgPaths,width:(n.filteredLanes.maxLane+2)*16,height:n.svgHeight,headHash:n.headHash},void 0,!1,{fileName:$,lineNumber:92,columnNumber:13},this),(0,B.jsxDEV)(`div`,{className:`absolute top-0 right-0 w-1.5 h-full cursor-col-resize hover:bg-primary/30`,onMouseDown:e=>{e.preventDefault(),f(e.clientX)},onTouchStart:e=>f(e.touches[0].clientX)},void 0,!1,{fileName:$,lineNumber:94,columnNumber:13},this)]},void 0,!0,{fileName:$,lineNumber:89,columnNumber:11},this),(0,B.jsxDEV)(`div`,{className:`flex-1 min-w-[400px]`,children:[(0,B.jsxDEV)(`table`,{className:`w-full border-collapse text-xs`,style:{tableLayout:`fixed`},children:[(0,B.jsxDEV)(`colgroup`,{children:[(0,B.jsxDEV)(`col`,{},void 0,!1,{fileName:$,lineNumber:103,columnNumber:17},this),(0,B.jsxDEV)(`col`,{style:{width:`${p.date}px`}},void 0,!1,{fileName:$,lineNumber:104,columnNumber:17},this),(0,B.jsxDEV)(`col`,{style:{width:`${p.author}px`}},void 0,!1,{fileName:$,lineNumber:105,columnNumber:17},this),(0,B.jsxDEV)(`col`,{style:{width:`${p.commit}px`}},void 0,!1,{fileName:$,lineNumber:106,columnNumber:17},this)]},void 0,!0,{fileName:$,lineNumber:102,columnNumber:15},this),(0,B.jsxDEV)(`thead`,{className:`sticky top-0 z-10 bg-background`,children:(0,B.jsxDEV)(`tr`,{className:`border-b text-[11px] font-semibold text-muted-foreground`,style:{height:`24px`},children:[(0,B.jsxDEV)(`th`,{className:`text-left px-2 font-semibold`,children:`Description`},void 0,!1,{fileName:$,lineNumber:110,columnNumber:19},this),(0,B.jsxDEV)(fe,{label:`Date`,colKey:`date`,onStartResize:m},void 0,!1,{fileName:$,lineNumber:111,columnNumber:19},this),(0,B.jsxDEV)(fe,{label:`Author`,colKey:`author`,onStartResize:m},void 0,!1,{fileName:$,lineNumber:112,columnNumber:19},this),(0,B.jsxDEV)(`th`,{className:`text-left px-2 font-semibold`,children:`Commit`},void 0,!1,{fileName:$,lineNumber:113,columnNumber:19},this)]},void 0,!0,{fileName:$,lineNumber:109,columnNumber:17},this)},void 0,!1,{fileName:$,lineNumber:108,columnNumber:15},this),(0,B.jsxDEV)(`tbody`,{children:n.filteredCommits.map(e=>(0,B.jsxDEV)(q,{commit:e,lane:n.filteredLanes.laneMap.get(e.hash)??0,isSelected:n.selectedCommit?.hash===e.hash,isHead:e.hash===n.headHash,labels:n.commitLabels.get(e.hash)??[],currentBranch:n.currentBranch,onSelect:()=>n.selectCommit(e),onCheckout:n.handleCheckout,onCherryPick:n.handleCherryPick,onRevert:n.handleRevert,onMerge:n.handleMerge,onDeleteBranch:n.handleDeleteBranch,onPushBranch:n.handlePushBranch,onCreatePr:n.handleCreatePr,onOpenCreateBranch:e=>i({type:`branch`,hash:e}),onOpenCreateTag:e=>i({type:`tag`,hash:e}),onOpenDiff:()=>n.openDiffForCommit(e),onCopyHash:()=>n.copyHash(e.hash)},e.hash,!1,{fileName:$,lineNumber:118,columnNumber:19},this))},void 0,!1,{fileName:$,lineNumber:116,columnNumber:15},this)]},void 0,!0,{fileName:$,lineNumber:101,columnNumber:13},this),n.loadingMore&&(0,B.jsxDEV)(`div`,{className:`flex items-center justify-center gap-2 py-3 text-xs text-muted-foreground`,children:[(0,B.jsxDEV)(g,{className:`size-3.5 animate-spin`},void 0,!1,{fileName:$,lineNumber:138,columnNumber:17},this),` Loading more commits...`]},void 0,!0,{fileName:$,lineNumber:137,columnNumber:15},this),!n.hasMore&&n.data&&n.data.commits.length>0&&(0,B.jsxDEV)(`div`,{className:`text-center py-2 text-xs text-muted-foreground`,children:[n.data.commits.length,` commits loaded`]},void 0,!0,{fileName:$,lineNumber:142,columnNumber:15},this)]},void 0,!0,{fileName:$,lineNumber:100,columnNumber:11},this)]},void 0,!0,{fileName:$,lineNumber:87,columnNumber:9},this)},void 0,!1,{fileName:$,lineNumber:86,columnNumber:7},this),n.selectedCommit&&t&&(0,B.jsxDEV)(Y,{commit:n.selectedCommit,files:n.commitFiles,loadingDetail:n.loadingDetail,projectName:t,onClose:()=>n.setSelectedCommit(null),copyHash:n.copyHash},void 0,!1,{fileName:$,lineNumber:151,columnNumber:9},this),(0,B.jsxDEV)(ce,{type:r.type,hash:r.hash,onClose:()=>i({type:null}),onCreateBranch:n.handleCreateBranch,onCreateTag:n.handleCreateTag},void 0,!1,{fileName:$,lineNumber:155,columnNumber:7},this),(0,B.jsxDEV)(le,{open:a,onClose:()=>o(!1),projectName:t,branches:n.data?.branches??[]},void 0,!1,{fileName:$,lineNumber:158,columnNumber:7},this)]},void 0,!0,{fileName:$,lineNumber:74,columnNumber:5},this):(0,B.jsxDEV)(pe,{msg:`No project selected.`},void 0,!1,{fileName:$,lineNumber:69,columnNumber:28},this)}function fe({label:e,colKey:t,onStartResize:n}){return(0,B.jsxDEV)(`th`,{className:`text-left px-2 font-semibold relative`,children:[e,(0,B.jsxDEV)(`div`,{className:`absolute top-0 right-0 w-1.5 h-full cursor-col-resize hover:bg-primary/30`,onMouseDown:e=>{e.preventDefault(),n(t,e.clientX)},onTouchStart:e=>n(t,e.touches[0].clientX)},void 0,!1,{fileName:$,lineNumber:170,columnNumber:7},this)]},void 0,!0,{fileName:$,lineNumber:168,columnNumber:5},this)}function pe({msg:e}){return(0,B.jsxDEV)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground text-sm`,children:e},void 0,!1,{fileName:$,lineNumber:178,columnNumber:10},this)}function me(){return(0,B.jsxDEV)(`div`,{className:`flex items-center justify-center h-full gap-2 text-muted-foreground`,children:[(0,B.jsxDEV)(g,{className:`size-5 animate-spin`},void 0,!1,{fileName:$,lineNumber:183,columnNumber:7},this),(0,B.jsxDEV)(`span`,{className:`text-sm`,children:`Loading git graph...`},void 0,!1,{fileName:$,lineNumber:183,columnNumber:50},this)]},void 0,!0,{fileName:$,lineNumber:182,columnNumber:5},this)}function he({error:e,onRetry:t}){return(0,B.jsxDEV)(`div`,{className:`flex flex-col items-center justify-center h-full gap-2 text-destructive text-sm`,children:[(0,B.jsxDEV)(`p`,{children:e},void 0,!1,{fileName:$,lineNumber:190,columnNumber:7},this),(0,B.jsxDEV)(j,{variant:`outline`,size:`sm`,onClick:t,children:`Retry`},void 0,!1,{fileName:$,lineNumber:190,columnNumber:21},this)]},void 0,!0,{fileName:$,lineNumber:189,columnNumber:5},this)}export{de as GitGraph};