git-history-ui 4.0.0 → 5.0.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 (82) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/CODE_OF_CONDUCT.md +53 -0
  3. package/CONTRIBUTING.md +132 -0
  4. package/LICENSE +21 -0
  5. package/README.md +75 -15
  6. package/SECURITY.md +51 -0
  7. package/build/frontend/{chunk-CFCRPNUQ.js → chunk-3E3FVV4X.js} +1 -1
  8. package/build/frontend/chunk-465Y7ZAS.js +2 -0
  9. package/build/frontend/{chunk-I4VBIHH2.js → chunk-7VJNS7EY.js} +1 -1
  10. package/build/frontend/{chunk-UIWFTWLF.js → chunk-GBKH4M7W.js} +1 -1
  11. package/build/frontend/{chunk-UHWTLUOW.js → chunk-GJRIJIZY.js} +1 -1
  12. package/build/frontend/chunk-LRN4ELHN.js +9 -0
  13. package/build/frontend/chunk-PJETIVS4.js +1 -0
  14. package/build/frontend/chunk-QH2BEUIU.js +5 -0
  15. package/build/frontend/{chunk-3KK6F5JX.js → chunk-SJJTMQGL.js} +1 -1
  16. package/build/frontend/chunk-TI46NMVL.js +1 -0
  17. package/build/frontend/chunk-V6G3DEZ6.js +1 -0
  18. package/build/frontend/{chunk-UNROVCUZ.js → chunk-WPYI663L.js} +1 -1
  19. package/build/frontend/chunk-Y6GOUMAT.js +1 -0
  20. package/build/frontend/index.html +1 -1
  21. package/build/frontend/main-735KK4CH.js +1 -0
  22. package/dist/backend/aggregations.d.ts +1 -0
  23. package/dist/backend/aggregations.d.ts.map +1 -0
  24. package/dist/backend/annotations.d.ts +1 -0
  25. package/dist/backend/annotations.d.ts.map +1 -0
  26. package/dist/backend/cache/sqliteIndex.d.ts +1 -0
  27. package/dist/backend/cache/sqliteIndex.d.ts.map +1 -0
  28. package/dist/backend/dev-server.d.ts +1 -0
  29. package/dist/backend/dev-server.d.ts.map +1 -0
  30. package/dist/backend/gitService.d.ts +1 -0
  31. package/dist/backend/gitService.d.ts.map +1 -0
  32. package/dist/backend/grouping/prGrouping.d.ts +1 -0
  33. package/dist/backend/grouping/prGrouping.d.ts.map +1 -0
  34. package/dist/backend/impact.d.ts +1 -0
  35. package/dist/backend/impact.d.ts.map +1 -0
  36. package/dist/backend/insights.d.ts +1 -0
  37. package/dist/backend/insights.d.ts.map +1 -0
  38. package/dist/backend/llm/anthropicProvider.d.ts +2 -0
  39. package/dist/backend/llm/anthropicProvider.d.ts.map +1 -0
  40. package/dist/backend/llm/anthropicProvider.js +10 -4
  41. package/dist/backend/llm/anthropicProvider.js.map +1 -1
  42. package/dist/backend/llm/heuristicProvider.d.ts +2 -0
  43. package/dist/backend/llm/heuristicProvider.d.ts.map +1 -0
  44. package/dist/backend/llm/heuristicProvider.js +54 -4
  45. package/dist/backend/llm/heuristicProvider.js.map +1 -1
  46. package/dist/backend/llm/index.d.ts +7 -0
  47. package/dist/backend/llm/index.d.ts.map +1 -0
  48. package/dist/backend/llm/index.js +15 -5
  49. package/dist/backend/llm/index.js.map +1 -1
  50. package/dist/backend/llm/openaiProvider.d.ts +2 -0
  51. package/dist/backend/llm/openaiProvider.d.ts.map +1 -0
  52. package/dist/backend/llm/openaiProvider.js +8 -3
  53. package/dist/backend/llm/openaiProvider.js.map +1 -1
  54. package/dist/backend/llm/types.d.ts +3 -1
  55. package/dist/backend/llm/types.d.ts.map +1 -0
  56. package/dist/backend/presets.d.ts +1 -0
  57. package/dist/backend/presets.d.ts.map +1 -0
  58. package/dist/backend/search/datePhrase.d.ts +1 -0
  59. package/dist/backend/search/datePhrase.d.ts.map +1 -0
  60. package/dist/backend/search/nlSearch.d.ts +1 -0
  61. package/dist/backend/search/nlSearch.d.ts.map +1 -0
  62. package/dist/backend/server.d.ts +1 -0
  63. package/dist/backend/server.d.ts.map +1 -0
  64. package/dist/backend/server.js +47 -18
  65. package/dist/backend/server.js.map +1 -1
  66. package/dist/backend/snapshot.d.ts +1 -0
  67. package/dist/backend/snapshot.d.ts.map +1 -0
  68. package/dist/cli.d.ts +1 -0
  69. package/dist/cli.d.ts.map +1 -0
  70. package/docs/API.md +70 -0
  71. package/docs/architecture.md +85 -0
  72. package/docs/configuration.md +54 -0
  73. package/docs/troubleshooting.md +85 -0
  74. package/package.json +44 -8
  75. package/build/frontend/chunk-6VRZZB3T.js +0 -1
  76. package/build/frontend/chunk-AWMYL3YU.js +0 -1
  77. package/build/frontend/chunk-EZUFC4CQ.js +0 -1
  78. package/build/frontend/chunk-GRG6HTLW.js +0 -9
  79. package/build/frontend/chunk-L4LXF744.js +0 -2
  80. package/build/frontend/chunk-OBPR2XVH.js +0 -5
  81. package/build/frontend/chunk-VHEMN3MU.js +0 -1
  82. package/build/frontend/main-6PSVVDXD.js +0 -1
@@ -0,0 +1,2 @@
1
+ import{a as cn,b as dn,c as hn}from"./chunk-3E3FVV4X.js";import{a as gn}from"./chunk-WPYI663L.js";import{a as on,b as an,c as sn,h as ln}from"./chunk-GJRIJIZY.js";import{a as mn}from"./chunk-PJETIVS4.js";import{a as q}from"./chunk-7VJNS7EY.js";import{g as fn}from"./chunk-Y6GOUMAT.js";import{b as nn,e as rn}from"./chunk-V6G3DEZ6.js";import{a as pn}from"./chunk-GBKH4M7W.js";import{$ as u,$a as le,Ab as Wt,B as Ct,Bb as Ut,C as ke,D as wt,Db as te,Eb as ne,Fb as ie,Gb as Fe,Hb as X,I as yt,Ib as $,Jb as qt,Kb as c,Lb as v,Ma as Tt,Mb as z,N as Mt,Nb as Ve,Oa as Re,Ob as Yt,P as St,Pb as nt,Q as Je,Qa as s,Qb as it,R as Pe,Rb as rt,S as Ee,Sa as zt,Ta as et,Tb as _e,Ua as Ft,V as Ot,Va as Vt,Vb as W,W as j,Wa as Nt,Wb as Zt,X as pe,Xb as Z,Z as ee,Za as E,Zb as Ne,_a as fe,ab as Lt,ac as Qt,bb as tt,bc as re,cb as x,cc as U,e as _t,ea as S,eb as At,fa as O,fb as he,fc as Kt,g as Xe,ga as kt,gb as Bt,gc as Xt,i as vt,ic as Jt,j as B,ja as Pt,ka as De,kb as jt,la as Et,lb as ue,m as xt,n as bt,oa as C,ob as g,oc as J,pb as l,pc as F,q as K,qa as Dt,qb as a,qc as ce,ra as It,rb as w,s as Oe,sa as Ie,sb as Ht,sc as V,tb as $t,ub as Gt,va as ge,vb as Te,wb as ze,wc as en,xb as H,xc as tn,yb as M,yc as Le,za as Rt,zb as b}from"./chunk-QH2BEUIU.js";var Ae=class i{http=u(Le);base="/api";list(t){return this.http.get(`${this.base}/annotations/${t}`)}add(t,e,n){return this.http.post(`${this.base}/annotations/${t}`,{author:e,body:n})}remove(t,e){return this.http.delete(`${this.base}/annotations/${t}/${e}`)}static \u0275fac=function(e){return new(e||i)};static \u0275prov=j({token:i,factory:i.\u0275fac,providedIn:"root"})};var Dn=["svg"];function In(i,t){i&1&&(l(0,"div",11),c(1," No graph data \u2014 changed files have no detectable internal imports. "),a())}var Be=class i{impact=null;svgRef;simulation=null;hasData=!1;ngAfterViewInit(){this.render()}ngOnChanges(){this.render()}ngOnDestroy(){this.simulation?.stop()}render(){if(!this.svgRef)return;let t=this.svgRef.nativeElement,e=fn(t);e.selectAll("*").remove();let n=this.impact;if(!n||n.dependencyRipple.length===0&&n.modules.length===0){this.hasData=!1;return}this.hasData=!0;let r=new Map,o=(p,k,A)=>{let T=r.get(p);return T||(T={id:p,group:k,label:A},r.set(p,T)),T};for(let p of n.files)o(`f:${p}`,"changed",ot(p));for(let p of n.modules)o(`m:${p}`,"module",p);for(let p of n.dependencyRipple)o(`f:${p.from}`,"changed",ot(p.from)),o(`f:${p.to}`,"imported",ot(p.to));let m=[];for(let p of n.dependencyRipple)m.push({source:`f:${p.from}`,target:`f:${p.to}`,type:"imports"});for(let p of n.files){let k=zn(p);n.modules.includes(k)&&m.push({source:`f:${p}`,target:`m:${k}`,type:"in-module"})}let f=Array.from(r.values()),h=t.parentElement?.clientWidth??640,d=f.filter(p=>p.group==="module").sort(at),_=f.filter(p=>p.group==="changed").sort(at),P=f.filter(p=>p.group==="imported").sort(at),Q=Math.max(d.length,_.length,P.length,4),L=44,D=58,I={module:68,changed:430,imported:780},Y=Math.max(h,I.imported+Math.max(320,Rn(P))+80),ae=Math.max(360,D+Q*L+40);e.attr("width",Y).attr("height",ae).attr("viewBox",`0 0 ${Y} ${ae}`),e.append("rect").attr("width",Y).attr("height",ae).attr("fill","transparent"),e.append("g").selectAll("text").data([{label:"Modules",x:I.module},{label:"Changed files",x:I.changed},{label:"Import dependencies",x:I.imported}]).join("text").attr("class","column-title").attr("x",p=>p.x).attr("y",28).text(p=>p.label),st(d,I.module,D,L),st(_,I.changed,D,L),st(P,I.imported,D,L);let ht=e.append("g").selectAll("path").data(m).join("path").attr("class",p=>`impact-link ${p.type}`).attr("d",p=>{let k=r.get(String(p.source)),A=r.get(String(p.target));return k&&A?Tn(k,A):""});e.append("g").selectAll("circle").data(f).join("circle").attr("r",p=>p.group==="module"?7:5).attr("fill",p=>p.group==="changed"?"var(--accent)":p.group==="imported"?"#f59e0b":"#8b5cf6").attr("stroke","var(--bg-surface-2)").attr("stroke-width",1.5).attr("cx",p=>p.x??0).attr("cy",p=>p.y??0).append("title").text(p=>`${p.group}: ${p.id.slice(2)}`);let Se=e.append("g").selectAll("rect").data(f).join("rect").attr("class","label-bg").attr("width",p=>un(p)).attr("height",18).attr("rx",5).attr("ry",5).attr("x",p=>(p.x??0)+10).attr("y",p=>(p.y??0)-11),y=e.append("g").selectAll("text").data(f).join("text").attr("class",p=>`node-label ${p.group}`).attr("x",p=>(p.x??0)+14).attr("y",p=>(p.y??0)+4).text(p=>p.label);this.simulation?.stop(),this.simulation=null}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=E({type:i,selectors:[["app-impact-graph"]],viewQuery:function(e,n){if(e&1&&te(Dn,7),e&2){let r;ne(r=ie())&&(n.svgRef=r.first)}},inputs:{impact:"impact"},features:[Ie],decls:17,vars:1,consts:[["svg",""],[1,"graph-head"],[1,"legend"],[1,"legend-item"],[1,"dot","dot-changed"],[1,"dot","dot-imported"],[1,"dot","dot-module"],[1,"hint"],["tabindex","0",1,"canvas-wrap"],["aria-label","Commit impact graph"],["class","empty",4,"ngIf"],[1,"empty"]],template:function(e,n){e&1&&(l(0,"div",1)(1,"div",2)(2,"span",3),w(3,"span",4),c(4,"changed file"),a(),l(5,"span",3),w(6,"span",5),c(7,"import dependency"),a(),l(8,"span",3),w(9,"span",6),c(10,"module"),a()(),l(11,"span",7),c(12,"Scroll to explore. Lines show module membership and imports."),a()(),l(13,"div",8),kt(),w(14,"svg",9,0),x(16,In,2,0,"div",10),a()),e&2&&(s(16),g("ngIf",!n.hasData))},dependencies:[V,F],styles:["[_nghost-%COMP%]{display:block}.graph-head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:.75rem;margin-bottom:.5rem}.legend[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;font-size:11px;color:var(--fg-muted)}.legend-item[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px}.hint[_ngcontent-%COMP%]{flex:0 0 auto;color:var(--fg-subtle);font-size:11px}.dot[_ngcontent-%COMP%]{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px}.dot-changed[_ngcontent-%COMP%]{background:var(--accent)}.dot-imported[_ngcontent-%COMP%]{background:#f59e0b}.dot-module[_ngcontent-%COMP%]{background:#8b5cf6}.canvas-wrap[_ngcontent-%COMP%]{position:relative;max-height:430px;min-height:320px;background:radial-gradient(circle at 20% 0%,color-mix(in oklab,var(--accent) 12%,transparent),transparent 34%),var(--bg-surface-2);border-radius:var(--radius-md);border:1px solid var(--border-soft);overflow:auto;overscroll-behavior:contain}.canvas-wrap[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}svg[_ngcontent-%COMP%]{display:block}.empty[_ngcontent-%COMP%]{position:absolute;inset:0;display:grid;place-items:center;color:var(--fg-muted);font-size:11px;pointer-events:none}[_nghost-%COMP%] .column-title{fill:var(--fg-muted);font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}[_nghost-%COMP%] .node-label{font-size:10px;fill:var(--fg-secondary);font-family:var(--font-mono, monospace);pointer-events:none;paint-order:stroke;stroke:var(--bg-surface-2);stroke-width:3px;stroke-linejoin:round}[_nghost-%COMP%] .node-label.changed{fill:var(--fg-primary);font-weight:700}[_nghost-%COMP%] .label-bg{fill:color-mix(in oklab,var(--bg-surface) 78%,transparent);stroke:var(--border-soft);stroke-width:1px;opacity:.92}[_nghost-%COMP%] .impact-link{fill:none;stroke-linecap:round}[_nghost-%COMP%] .impact-link.imports{stroke:#f59e0b;stroke-width:2.2px;stroke-opacity:.78}[_nghost-%COMP%] .impact-link.in-module{stroke:#8b5cf6;stroke-width:2px;stroke-opacity:.62;stroke-dasharray:5 5}"],changeDetection:0})};function ot(i){let t=i.split("/");return t[t.length-1]}function un(i){let t=i.label.length;return Math.max(112,Math.min(520,t*6.7+18))}function Rn(i){return Math.max(0,...i.map(t=>un(t)))}function at(i,t){return i.label.localeCompare(t.label)}function st(i,t,e,n){for(let[r,o]of i.entries())o.x=t,o.y=e+r*n}function Tn(i,t){let e=i.x??0,n=i.y??0,r=t.x??0,o=t.y??0,m=Math.max(72,Math.abs(r-e)*.42),f=r>=e?1:-1;return`M ${e} ${n} C ${e+f*m} ${n}, ${r-f*m} ${o}, ${r} ${o}`}function zn(i){let t=i.split("/");return t.length===1?"(root)":t.slice(0,Math.min(t.length-1,3)).join("/")}var je=class i{constructor(t){this.sanitizer=t}transform(t){return t?this.sanitizer.bypassSecurityTrustHtml(Fn(t)):""}static \u0275fac=function(e){return new(e||i)(Vt(nn,16))};static \u0275pipe=Lt({name:"markdown",type:i,pure:!0})};function Fn(i){let t=Vn(i);return t=t.replace(/```(\w*)\n([\s\S]*?)```/g,(e,n,r)=>`<pre><code>${r.trim()}</code></pre>`),t=t.replace(/`([^`]+)`/g,"<code>$1</code>"),t=t.replace(/^### (.+)$/gm,"<h4>$1</h4>"),t=t.replace(/^## (.+)$/gm,"<h3>$1</h3>"),t=t.replace(/^# (.+)$/gm,"<h2>$1</h2>"),t=t.replace(/\*\*\*(.+?)\*\*\*/g,"<strong><em>$1</em></strong>"),t=t.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),t=t.replace(/\*(.+?)\*/g,"<em>$1</em>"),t=t.replace(/^(\s*)[-*] (.+)$/gm,(e,n,r)=>`<li data-depth="${Math.floor(n.length/2)}">${r}</li>`),t=t.replace(/((?:<li[^>]*>.*<\/li>\n?)+)/g,"<ul>$1</ul>"),t=t.replace(/^\d+\.\s+(.+)$/gm,"<li>$1</li>"),t=t.replace(/((?:<li>.*<\/li>\n?){2,})/g,e=>e.includes("data-depth")?e:`<ol>${e}</ol>`),t=t.replace(/\n{2,}/g,"</p><p>"),t=`<p>${t}</p>`,t=t.replace(/<p>\s*(<(?:h[2-4]|ul|ol|pre|blockquote)[^>]*>)/g,"$1"),t=t.replace(/(<\/(?:h[2-4]|ul|ol|pre|blockquote)>)\s*<\/p>/g,"$1"),t=t.replace(/<p>\s*<\/p>/g,""),t=t.replace(/\n/g,"<br>"),t}function Vn(i){return i.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Nn(i,t){if(i&1&&(l(0,"span",36),c(1),a()),i&2){let e=t.$implicit;s(),v(e)}}function Ln(i,t){if(i&1&&(l(0,"span",37),c(1),a()),i&2){let e=t.$implicit;s(),v(e)}}function An(i,t){i&1&&(l(0,"span",38),c(1,"merge"),a())}function Bn(i,t){if(i&1&&(l(0,"pre",39),c(1),a()),i&2){let e=b().ngIf;s(),v(e.body)}}function jn(i,t){if(i&1){let e=H();l(0,"div",40)(1,"span",41),c(2,"AI"),a(),w(3,"div",42),W(4,"markdown"),l(5,"button",43),M("click",function(){S(e);let r=b(2);return O(r.explanation.set(null))}),c(6,"\xD7"),a()()}if(i&2){let e=t.ngIf;s(3),g("innerHTML",Zt(4,1,e),Tt)}}function Hn(i,t){if(i&1&&(l(0,"div",44),c(1),a()),i&2){let e=t.ngIf;s(),v(e)}}function $n(i,t){if(i&1&&(l(0,"li"),c(1),a()),i&2){let e=t.$implicit;s(),v(e)}}function Gn(i,t){if(i&1){let e=H();l(0,"li",28),M("click",function(){let r=S(e).$implicit,o=b(3);return O(o.state.selectHash(r.hash))}),l(1,"code"),c(2),a(),l(3,"span"),c(4),a()()}if(i&2){let e=t.$implicit;s(2),v(e.hash.slice(0,7)),s(2),v(e.subject)}}function Wn(i,t){if(i&1&&(l(0,"div",45)(1,"div",46)(2,"span"),c(3,"Impact"),a(),l(4,"span",47),c(5),a()(),w(6,"app-impact-graph",48),l(7,"div",49)(8,"div")(9,"h4"),c(10,"Modules"),a(),l(11,"ul",50),x(12,$n,2,1,"li",51),a()(),l(13,"div")(14,"h4"),c(15,"Related commits"),a(),l(16,"ul",52),x(17,Gn,5,2,"li",53),a()()()()),i&2){let e=t.ngIf;s(5),Yt(" ",e.files.length," files \xB7 ",e.modules.length," modules \xB7 ",e.relatedCommits.length," related commits "),s(),g("impact",e),s(6),g("ngForOf",e.modules),s(5),g("ngForOf",e.relatedCommits)}}function Un(i,t){if(i&1&&(l(0,"span",54),c(1),a()),i&2){let e=b(2);s(),v(e.files().length)}}function qn(i,t){if(i&1&&(l(0,"span",63),c(1),a()),i&2){let e=b().$implicit;s(),z("+",e.additions)}}function Yn(i,t){if(i&1&&(l(0,"span",64),c(1),a()),i&2){let e=b().$implicit;s(),z("\u2212",e.deletions)}}function Zn(i,t){if(i&1){let e=H();l(0,"div",55)(1,"button",56),M("click",function(){let r=S(e).$implicit,o=b(2);return O(o.selectFile(r))}),w(2,"span",57),l(3,"span",58),c(4),a(),l(5,"span",59),x(6,qn,2,1,"span",60)(7,Yn,2,1,"span",61),a()(),l(8,"button",62),M("click",function(){let r=S(e).$implicit,o=b(2);return O(o.openFileHistory(r.file))}),c(9," \u23F1 "),a()()}if(i&2){let e,n=t.$implicit,r=b(2);s(),$("selected",n.file===((e=r.activeFile())==null?null:e.file)),s(),ue("data-status",n.status),s(),g("title",n.file),s(),v(n.file),s(2),g("ngIf",n.additions),s(),g("ngIf",n.deletions)}}function Qn(i,t){i&1&&(l(0,"div",65),c(1,"No files changed."),a())}function Kn(i,t){i&1&&(l(0,"div",65),c(1,"Loading\u2026"),a())}function Xn(i,t){if(i&1){let e=H();l(0,"div",66)(1,"div",67)(2,"strong"),c(3),a(),l(4,"span",68),c(5),W(6,"date"),a(),l(7,"button",69),M("click",function(){let r=S(e).$implicit,o=b(2);return O(o.deleteComment(r.id))}),c(8," \xD7 "),a()(),l(9,"p",70),c(10),a()()}if(i&2){let e=t.$implicit;s(3),v(e.author),s(2),v(Z(6,3,e.createdAt,"short")),s(5),v(e.body)}}function Jn(i,t){if(i&1){let e=H();Te(0),l(1,"header",2)(2,"div",3)(3,"span",4),c(4),a(),l(5,"span",5),x(6,Nn,2,1,"span",6)(7,Ln,2,1,"span",7)(8,An,2,0,"span",8),a()(),l(9,"h2",9),c(10),a(),l(11,"div",10)(12,"span"),c(13),a(),l(14,"span",11),c(15,"\u2022"),a(),l(16,"span"),c(17),W(18,"date"),a()(),x(19,Bn,2,1,"pre",12),l(20,"div",13)(21,"button",14),M("click",function(){S(e);let r=b();return O(r.onExplain())}),c(22),a(),l(23,"button",14),M("click",function(){S(e);let r=b();return O(r.onLoadImpact())}),c(24),a(),l(25,"button",15),M("click",function(){S(e);let r=b();return O(r.copyShareLink())}),c(26),a()(),x(27,jn,7,3,"div",16)(28,Hn,2,1,"div",17),a(),x(29,Wn,18,6,"div",18),l(30,"div",19)(31,"aside",20)(32,"div",21)(33,"span"),c(34,"Files"),a(),x(35,Un,2,1,"span",22),a(),l(36,"div",23),x(37,Zn,10,7,"div",24)(38,Qn,2,0,"div",25)(39,Kn,2,0,"div",25),a()(),l(40,"section",26)(41,"details",27)(42,"summary",28),M("click",function(r){S(e);let o=b();return O(o.toggleAnnotations(r))}),c(43),a(),l(44,"div",29),x(45,Xn,11,6,"div",30),l(46,"div",31)(47,"input",32),rt("ngModelChange",function(r){S(e);let o=b();return it(o.commentAuthor,r)||(o.commentAuthor=r),O(r)}),a(),l(48,"textarea",33),rt("ngModelChange",function(r){S(e);let o=b();return it(o.commentDraft,r)||(o.commentDraft=r),O(r)}),a(),l(49,"button",34),M("click",function(){S(e);let r=b();return O(r.addComment())}),c(50," Post "),a()()()(),w(51,"app-diff-viewer",35),a()(),ze()}if(i&2){let e=t.ngIf,n=b();s(4),v(e.shortHash),s(2),g("ngForOf",e.tags),s(),g("ngForOf",e.branches),s(),g("ngIf",e.isMerge),s(2),v(e.subject),s(3),Ve("",e.author," <",e.authorEmail,">"),s(4),v(Z(18,29,e.date,"medium")),s(2),g("ngIf",e.body),s(2),g("disabled",n.explaining()),s(),z(" ",n.explaining()?"...":"\u2728 Explain change"," "),s(),g("disabled",n.loadingImpact()),s(),z(" ",n.loadingImpact()?"...":n.impact()?"Refresh impact":"Show impact"," "),s(2),z(" ",n.shareCopied()?"Copied!":"\u{1F517} Share"," "),s(),g("ngIf",n.explanation()),s(),g("ngIf",n.explainError()),s(),g("ngIf",n.impact()),s(6),g("ngIf",n.files().length),s(2),g("ngForOf",n.files())("ngForTrackBy",n.trackByFile),s(),g("ngIf",!n.files().length&&!n.loading()),s(),g("ngIf",n.loading()),s(2),g("open",n.annotationsOpen()),s(2),z(" \u{1F4AC} Notes (",n.comments().length,") "),s(2),g("ngForOf",n.comments()),s(2),nt("ngModel",n.commentAuthor),s(),nt("ngModel",n.commentDraft),s(),g("disabled",!n.commentDraft.trim()),s(2),g("fileInput",n.activeFile())}}function ei(i,t){i&1&&(l(0,"div",71)(1,"p",72),c(2,"No commit selected"),a(),l(3,"p",73),c(4," Pick a commit from the list, or press "),l(5,"kbd",74),c(6,"\u2318K"),a(),c(7," to open the command palette. "),a()())}var He=class i{state=u(q);git=u(mn);insightsApi=u(pn);annotationsApi=u(Ae);router=u(rn);commit=this.state.selected;impact=C(null);loadingImpact=C(!1);explanation=C(null);explainError=C(null);explaining=C(!1);comments=C([]);annotationsOpen=C(!1);shareCopied=C(!1);commentDraft="";commentAuthor="me";loading=C(!1);files=dn(cn(this.commit).pipe(Pe(t=>t?(this.loading.set(!0),this.git.getDiff(t.hash).pipe(wt(()=>K([])))):(this.loading.set(!1),K([])))),{initialValue:[]});activeFileIndex=C(0);activeFile=re(()=>{let t=this.files();if(!t.length)return null;let e=Math.min(this.activeFileIndex(),t.length-1);return t[e]});constructor(){U(()=>{this.files(),this.activeFileIndex.set(0),this.loading.set(!1)}),U(()=>{let t=this.commit();if(this.impact.set(null),this.explanation.set(null),this.explainError.set(null),this.shareCopied.set(!1),!t){this.comments.set([]);return}this.annotationsApi.list(t.hash).subscribe({next:e=>this.comments.set(e),error:()=>this.comments.set([])})})}trackByFile(t,e){return e.file}selectFile(t){let e=this.files().findIndex(n=>n.file===t.file);e>=0&&this.activeFileIndex.set(e)}openFileHistory(t){this.router.navigate(["/file",encodeURIComponent(t)])}shortPath(t){if(t.length<=32)return t;let e=t.split("/");return e.length<=2?t:e[0]+"/.../"+e.slice(-2).join("/")}onLoadImpact(){let t=this.commit();t&&(this.loadingImpact.set(!0),this.insightsApi.impact(t.hash).subscribe({next:e=>{this.impact.set(e),this.loadingImpact.set(!1)},error:()=>this.loadingImpact.set(!1)}))}onExplain(){let t=this.commit();!t||this.explaining()||(this.explaining.set(!0),this.explainError.set(null),this.insightsApi.explainCommit(t.hash).subscribe({next:e=>{this.explanation.set(e.summary),this.explaining.set(!1)},error:e=>{this.explainError.set(e?.error?.error??"AI explanation unavailable. Set ANTHROPIC_API_KEY or OPENAI_API_KEY."),this.explaining.set(!1)}}))}copyShareLink(){let t=this.commit();if(!t)return;let e=`${window.location.origin}/?commit=${t.hash}`;navigator.clipboard?.writeText(e).then(()=>{this.shareCopied.set(!0),setTimeout(()=>this.shareCopied.set(!1),1500)}).catch(()=>{this.shareCopied.set(!1)})}toggleAnnotations(t){setTimeout(()=>this.annotationsOpen.set(!this.annotationsOpen()),0)}addComment(){let t=this.commit();!t||!this.commentDraft.trim()||this.annotationsApi.add(t.hash,this.commentAuthor||"anonymous",this.commentDraft.trim()).subscribe({next:e=>{this.comments.set([...this.comments(),e]),this.commentDraft=""}})}deleteComment(t){let e=this.commit();e&&this.annotationsApi.remove(e.hash,t).subscribe({next:()=>this.comments.set(this.comments().filter(n=>n.id!==t))})}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=E({type:i,selectors:[["app-commit-detail"]],decls:3,vars:2,consts:[["empty",""],[4,"ngIf","ngIfElse"],[1,"head"],[1,"row"],[1,"hash"],[1,"badges"],["class","badge tag",4,"ngFor","ngForOf"],["class","badge branch",4,"ngFor","ngForOf"],["class","badge merge",4,"ngIf"],[1,"subject"],[1,"meta"],[1,"dot"],["class","body",4,"ngIf"],[1,"actions"],[1,"btn","btn-ghost","btn-sm",3,"click","disabled"],[1,"btn","btn-ghost","btn-sm",3,"click"],["class","ai-card",4,"ngIf"],["class","ai-card error",4,"ngIf"],["class","impact-card",4,"ngIf"],[1,"split"],[1,"files"],[1,"files-header"],["class","count",4,"ngIf"],[1,"files-list"],["class","file-row",4,"ngFor","ngForOf","ngForTrackBy"],["class","files-empty",4,"ngIf"],[1,"diff"],[1,"annotations",3,"open"],[3,"click"],[1,"annot-body"],["class","comment",4,"ngFor","ngForOf"],[1,"comment-form"],["placeholder","Your name",1,"input",3,"ngModelChange","ngModel"],["placeholder","Add a note for your team\u2026",1,"input",3,"ngModelChange","ngModel"],[1,"btn",3,"click","disabled"],[3,"fileInput"],[1,"badge","tag"],[1,"badge","branch"],[1,"badge","merge"],[1,"body"],[1,"ai-card"],[1,"ai-pill"],[1,"ai-text",3,"innerHTML"],[1,"btn","btn-ghost","btn-icon","close",3,"click"],[1,"ai-card","error"],[1,"impact-card"],[1,"impact-head"],[1,"impact-meta"],[3,"impact"],[1,"impact-body"],[1,"modules"],[4,"ngFor","ngForOf"],[1,"related"],[3,"click",4,"ngFor","ngForOf"],[1,"count"],[1,"file-row"],[1,"file",3,"click"],[1,"status-dot"],[1,"path",3,"title"],[1,"counts"],["class","add",4,"ngIf"],["class","del",4,"ngIf"],["title","View file history",1,"file-history",3,"click"],[1,"add"],[1,"del"],[1,"files-empty"],[1,"comment"],[1,"comment-head"],[1,"comment-date"],["title","Delete",1,"btn","btn-ghost","btn-icon",3,"click"],[1,"comment-body"],[1,"placeholder"],[1,"title"],[1,"hint"],[1,"kbd"]],template:function(e,n){if(e&1&&x(0,Jn,52,32,"ng-container",1)(1,ei,8,0,"ng-template",null,0,Ne),e&2){let r=Fe(2);g("ngIf",n.commit())("ngIfElse",r)}},dependencies:[V,J,F,ln,on,an,sn,gn,Be,ce,je],styles:['[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;min-height:0;background:transparent}.head[_ngcontent-%COMP%]{position:sticky;top:0;z-index:3;padding:.9rem 1rem .8rem;border-bottom:1px solid var(--border-soft);background:color-mix(in oklab,var(--bg-glass) 95%,transparent);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-bottom:.4rem}.hash[_ngcontent-%COMP%]{font-family:var(--font-mono);font-size:12px;color:var(--fg-muted);padding:2px 6px;background:color-mix(in oklab,var(--bg-surface-2) 78%,transparent);border:1px solid var(--border-soft);border-radius:999px}.badges[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:4px;max-height:44px;overflow:hidden}.badge[_ngcontent-%COMP%]{font-size:10px;font-weight:600;padding:2px 7px;border-radius:999px;border:1px solid transparent;max-width:180px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.badge.tag[_ngcontent-%COMP%]{background:#d9770626;color:var(--warning);border-color:color-mix(in oklab,var(--warning) 24%,transparent)}.badge.branch[_ngcontent-%COMP%]{background:var(--accent-soft);color:var(--accent);border-color:color-mix(in oklab,var(--accent) 24%,transparent)}.badge.merge[_ngcontent-%COMP%]{background:#8b5cf62e;color:#8b5cf6}.subject[_ngcontent-%COMP%]{font-size:clamp(17px,1.6vw,22px);margin:0 0 4px;font-weight:600}.meta[_ngcontent-%COMP%]{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--fg-muted)}.meta[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{opacity:.5}.body[_ngcontent-%COMP%]{white-space:pre-wrap;font-family:var(--font-mono);font-size:12px;color:var(--fg-secondary);background:var(--bg-surface-2);border:1px solid var(--border-soft);border-radius:var(--radius-sm);padding:.5rem .75rem;margin-top:.5rem;max-height:160px;overflow:auto}.split[_ngcontent-%COMP%]{flex:1;display:grid;grid-template-columns:minmax(240px,300px) minmax(0,1fr);grid-template-rows:minmax(0,1fr);gap:.75rem;padding:.75rem;min-height:0;overflow:hidden}.files[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-height:0;background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden}.files-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:.6rem .85rem;font-size:12px;color:var(--fg-muted);border-bottom:1px solid var(--border-soft);background:color-mix(in oklab,var(--bg-surface) 82%,transparent)}.count[_ngcontent-%COMP%]{background:var(--bg-surface-2);padding:0 6px;border-radius:999px;font-size:11px}.files-list[_ngcontent-%COMP%]{overflow:auto;flex:1;min-height:0}.file[_ngcontent-%COMP%]{display:grid;grid-template-columns:10px 1fr auto;gap:.5rem;align-items:center;width:100%;padding:.5rem .75rem;border:0;background:transparent;color:inherit;cursor:pointer;text-align:left;border-bottom:1px solid var(--border-soft);font-size:12px}.file[_ngcontent-%COMP%]:hover{background:color-mix(in oklab,var(--bg-hover) 74%,transparent)}.file.selected[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 15%,transparent);box-shadow:inset 3px 0 0 var(--accent)}.file[_ngcontent-%COMP%] .path[_ngcontent-%COMP%]{font-family:var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;direction:rtl;text-align:left}.status-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;background:var(--accent)}.status-dot[data-status=added][_ngcontent-%COMP%]{background:var(--success)}.status-dot[data-status=deleted][_ngcontent-%COMP%]{background:var(--danger)}.status-dot[data-status=renamed][_ngcontent-%COMP%], .status-dot[data-status=copied][_ngcontent-%COMP%]{background:var(--warning)}.status-dot[data-status=binary][_ngcontent-%COMP%]{background:var(--fg-muted)}.counts[_ngcontent-%COMP%]{display:flex;gap:6px;font-family:var(--font-mono);font-size:11px}.counts[_ngcontent-%COMP%] .add[_ngcontent-%COMP%]{color:var(--success)}.counts[_ngcontent-%COMP%] .del[_ngcontent-%COMP%]{color:var(--danger)}.files-empty[_ngcontent-%COMP%]{padding:1rem;color:var(--fg-muted);font-size:12px;text-align:center}.diff[_ngcontent-%COMP%]{min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;border-radius:var(--radius-md);background:var(--bg-panel);border:1px solid var(--border-soft);box-shadow:var(--shadow-sm)}.placeholder[_ngcontent-%COMP%]{flex:1;display:grid;place-items:center;text-align:center;color:var(--fg-muted)}.placeholder[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-size:16px;margin-bottom:4px;color:var(--fg-secondary)}.placeholder[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%]{font-size:13px}.actions[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.6rem}.btn-sm[_ngcontent-%COMP%]{font-size:11px;padding:.3rem .65rem}.ai-card[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:.5rem;padding:.55rem .75rem;margin-top:.5rem;background:color-mix(in oklab,var(--accent) 12%,transparent);border-radius:var(--radius-sm);font-size:12px;color:var(--fg-secondary);max-height:min(280px,32vh);overflow:hidden}.ai-card.error[_ngcontent-%COMP%]{background:#ef44441f;color:var(--danger)}.ai-pill[_ngcontent-%COMP%]{flex-shrink:0;font-size:10px;font-weight:700;letter-spacing:.04em;background:var(--accent);color:var(--accent-fg);padding:1px 5px;border-radius:4px}.ai-text[_ngcontent-%COMP%]{flex:1;min-width:0;min-height:0;max-height:calc(min(280px,32vh) - 1.1rem);line-height:1.6;font-size:.85rem;overflow-y:auto;overflow-x:hidden;padding-right:.45rem;overscroll-behavior:contain;scrollbar-gutter:stable}.ai-text[_ngcontent-%COMP%]::-webkit-scrollbar{width:8px}.ai-text[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:transparent}.ai-text[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:color-mix(in oklab,var(--accent) 40%,transparent);border-radius:999px}.ai-text[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .ai-text[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], .ai-text[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:.6rem 0 .3rem;font-size:.9rem;font-weight:600;color:var(--text-primary, #e2e8f0)}.ai-text[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:1rem}.ai-text[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:.25rem 0}.ai-text[_ngcontent-%COMP%] ul[_ngcontent-%COMP%], .ai-text[_ngcontent-%COMP%] ol[_ngcontent-%COMP%]{margin:.3rem 0;padding-left:1.4rem}.ai-text[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{margin:.15rem 0}.ai-text[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:#8b5cf626;padding:1px 5px;border-radius:3px;font-size:.82em;font-family:var(--font-mono, "JetBrains Mono", monospace)}.ai-text[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{background:#00000040;padding:.5rem .75rem;border-radius:6px;overflow-x:auto;margin:.4rem 0}.ai-text[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:none;padding:0}.ai-text[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-primary, #e2e8f0)}.ai-card[_ngcontent-%COMP%] .close[_ngcontent-%COMP%]{flex-shrink:0;font-size:14px;line-height:1;padding:0 6px}.impact-card[_ngcontent-%COMP%]{margin:.6rem 1rem;background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);padding:.75rem 1rem;box-shadow:var(--shadow-sm)}.impact-head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;font-weight:600;margin-bottom:.5rem;font-size:13px}.impact-meta[_ngcontent-%COMP%]{color:var(--fg-muted);font-weight:400;font-size:11px}.impact-body[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:.75rem;font-size:12px}.impact-body[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:0 0 .4rem;font-size:11px;color:var(--fg-muted);text-transform:uppercase;letter-spacing:.04em}.impact-body[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0}.impact-body[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{padding:2px 0;word-break:break-all}.modules[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace)}.ripple[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-secondary)}.related[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{cursor:pointer;display:flex;gap:.4rem}.related[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover{color:var(--accent)}.related[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);color:var(--fg-muted);flex-shrink:0}.impact-body[_ngcontent-%COMP%] .muted[_ngcontent-%COMP%]{color:var(--fg-muted);font-style:italic;margin:0;font-size:11px}.file-row[_ngcontent-%COMP%]{display:flex}.file-row[_ngcontent-%COMP%] .file[_ngcontent-%COMP%]{flex:1}.file-history[_ngcontent-%COMP%]{background:transparent;border:0;border-bottom:1px solid var(--border-soft);cursor:pointer;color:var(--fg-muted);padding:0 .6rem;font-size:12px}.file-history[_ngcontent-%COMP%]:hover{background:var(--bg-elevated);color:var(--accent)}.annotations[_ngcontent-%COMP%]{margin:.5rem;background:var(--bg-surface);border:1px solid var(--border-soft);border-radius:var(--radius-sm)}.annotations[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{padding:.4rem .7rem;cursor:pointer;font-size:12px;color:var(--fg-secondary);-webkit-user-select:none;user-select:none}.annotations[open][_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{border-bottom:1px solid var(--border-soft)}.annot-body[_ngcontent-%COMP%]{padding:.5rem .7rem}.comment[_ngcontent-%COMP%]{padding:.4rem 0;border-bottom:1px dashed var(--border-soft);font-size:12px}.comment[_ngcontent-%COMP%]:last-of-type{border-bottom:0}.comment-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem}.comment-date[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px;flex:1}.comment-body[_ngcontent-%COMP%]{margin:.2rem 0 0;line-height:1.4;white-space:pre-wrap}.comment-form[_ngcontent-%COMP%]{display:flex;gap:.4rem;flex-direction:column;margin-top:.5rem}.comment-form[_ngcontent-%COMP%] .input[_ngcontent-%COMP%]{width:100%;padding:.35rem .5rem;background:var(--bg-app);border:1px solid var(--border-soft);border-radius:var(--radius-sm);color:var(--fg-primary);font-family:inherit;font-size:12px}.comment-form[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{min-height:60px;resize:vertical}.comment-form[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]{align-self:flex-end}'],changeDetection:0})};var ti=["canvas"],ni=["scroll"];function ii(i,t){if(i&1&&w(0,"span",12),i&2){let e=t.$implicit;X("background",e)}}function ri(i,t){i&1&&(l(0,"span",19),c(1,"merge"),a())}function oi(i,t){if(i&1&&(l(0,"div",20),c(1),a()),i&2){let e=b().ngIf;s(),v(e.refs)}}function ai(i,t){if(i&1&&(l(0,"div",13)(1,"div",14)(2,"code"),c(3),a(),x(4,ri,2,0,"span",15),a(),l(5,"div",16),c(6),a(),l(7,"div",17)(8,"span"),c(9),a(),l(10,"span"),c(11),W(12,"date"),a()(),x(13,oi,2,1,"div",18),a()),i&2){let e=t.ngIf;X("left",e.x,"px")("top",e.y,"px"),s(3),v(e.shortHash),s(),g("ngIf",e.isMerge),s(2),v(e.subject),s(3),v(e.author),s(2),v(Z(12,10,e.date,"MMM d, y, h:mm a")),s(2),g("ngIf",e.refs)}}function si(i,t){i&1&&(l(0,"div",21),c(1," No commits to draw. "),a())}var R=34,be=24,lt=5.5,Ce=16,we=16,ct=["#4f46e5","#06b6d4","#f59e0b","#ef4444","#10b981","#8b5cf6","#ec4899","#0ea5e9"],$e=class i{state=u(q);theme=u(hn);legendColors=ct.slice(0,5);graphSummary=re(()=>{let t=this.state.commits().length,e=this.laneCount;return t?`${t.toLocaleString()} commits across ${e} lane${e===1?"":"s"}`:"Swim-lane visualization"});contentHeight=re(()=>{let t=this.state.commits().length;return t?we*2+t*R:0});canvasRef;scrollRef;nodes=[];rowByHash=new Map;laneCount=1;hoverRow=-1;hoverTip=C(null);layoutToken=0;idleHandle=null;canvasSize={width:0,height:0,dpr:0};canvasTransform="";onCanvasClick=t=>this.onClick(t);onCanvasMove=t=>this.onMouseMove(t);onCanvasLeave=()=>this.onMouseLeave();scrollRaf=0;onScroll=()=>{this.scrollRaf||(this.scrollRaf=requestAnimationFrame(()=>{this.scrollRaf=0,this.draw()}))};constructor(){U(()=>{this.scheduleLayout(this.state.commits())}),U(()=>{this.state.selectedHash(),this.theme.resolved(),this.draw()})}ngAfterViewInit(){let t=this.canvasRef.nativeElement;t.addEventListener("click",this.onCanvasClick),t.addEventListener("mousemove",this.onCanvasMove),t.addEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.addEventListener("scroll",this.onScroll,{passive:!0}),this.draw()}ngOnDestroy(){let t=this.canvasRef?.nativeElement;t?.removeEventListener("click",this.onCanvasClick),t?.removeEventListener("mousemove",this.onCanvasMove),t?.removeEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.removeEventListener("scroll",this.onScroll),this.scrollRaf&&cancelAnimationFrame(this.scrollRaf),this.cancelIdleLayout()}onResize(){this.draw()}scheduleLayout(t){let e=++this.layoutToken;if(this.cancelIdleLayout(),this.nodes=[],this.rowByHash.clear(),this.hoverRow=-1,this.hoverTip.set(null),!t.length){this.laneCount=1,this.draw();return}let n=[],r=h=>{let d=n.indexOf(h);if(d>=0)return d;let _=n.indexOf(null);return _>=0?(n[_]=h,_):(n.push(h),n.length-1)},o=h=>{let d=t[h],_=r(d.hash),P={commit:d,row:h,lane:_};this.nodes.push(P),this.rowByHash.set(d.hash,P);let[Q,...L]=d.parents;n[_]=Q??null;for(let D of L)if(n.indexOf(D)===-1){let I=n.indexOf(null);I>=0?n[I]=D:n.push(D)}for(;n.length&&n[n.length-1]===null;)n.pop();_+1>this.laneCount&&(this.laneCount=_+1)};if(this.laneCount=1,t.length<=5e3){for(let h=0;h<t.length;h++)o(h);this.draw();return}let m=0,f=h=>{if(e!==this.layoutToken)return;let d=performance.now();for(;m<t.length;){o(m++);let _=h?.timeRemaining?.()??0;if(m%250===0&&_<=1&&performance.now()-d>8)break}this.draw(),m<t.length&&e===this.layoutToken&&(this.idleHandle=this.requestIdle(f))};this.idleHandle=this.requestIdle(f)}draw(){let t=this.canvasRef?.nativeElement;if(!t)return;let e=this.scrollRef?.nativeElement,n=window.devicePixelRatio||1,r=e?.scrollTop??0,o=e?.clientHeight??0,m=Math.max(e?.clientWidth??Ce*2+be,Ce*2+be),f=Math.max(o||R*8,R);this.ensureCanvasSize(t,m,f,n);let h=`translateY(${r}px)`;this.canvasTransform!==h&&(this.canvasTransform=h,t.style.transform=h);let d=t.getContext("2d"),_=this.readTheme(t);if(d.setTransform(n,0,0,n,0,-r*n),d.clearRect(0,r,m,f),d.fillStyle=_.surface,d.fillRect(0,r,m,f),!this.nodes.length)return;let P=this.laneStep(m),Q=this.nodeRadius(P),L=y=>this.xOfLane(y,m,P),D=y=>we+y*R+R/2,I=y=>ct[y%ct.length],Y=this.state.selectedHash(),ae=R*4,ht=Math.max(0,Math.floor((r-we-ae)/R)),ut=Math.min(this.nodes.length-1,Math.ceil((r+f-we+ae)/R)),Se=this.nodes.slice(ht,ut+1);this.drawRows(d,m,L,D,Q,_,Y,Se),this.drawGuides(d,r,f,_),d.lineCap="round",d.lineJoin="round";for(let y of Se)for(let p of y.commit.parents){let k=this.rowByHash.get(p);if(!k)continue;let A=L(y.lane),T=D(y.row),me=L(k.lane),se=D(k.row);d.strokeStyle=_.shadow,d.lineWidth=4,d.globalAlpha=.35,this.drawEdge(d,A,T,me,se),d.strokeStyle=I(k.lane),d.lineWidth=y.commit.isMerge?2.6:2.2,d.globalAlpha=Y&&Y!==y.commit.hash&&Y!==k.commit.hash?.55:.9,this.drawEdge(d,A,T,me,se),d.globalAlpha=1}for(let y of Se){let p=L(y.lane),k=D(y.row),A=I(y.lane),T=y.commit.hash===Y,me=y.row===this.hoverRow,se=T?Q+2:me?Q+1:Q;d.beginPath(),d.arc(p,k,se+3,0,Math.PI*2),d.fillStyle=_.nodeRing,d.fill(),d.beginPath(),d.arc(p,k,se,0,Math.PI*2),d.fillStyle=y.commit.isMerge?_.surface:A,d.fill(),d.lineWidth=y.commit.isMerge||T?2.5:1.75,d.strokeStyle=A,d.stroke(),(T||me)&&(d.beginPath(),d.arc(p,k,se+5,0,Math.PI*2),d.strokeStyle=A,d.globalAlpha=T?.42:.24,d.lineWidth=2,d.stroke(),d.globalAlpha=1)}}drawRows(t,e,n,r,o,m,f,h=this.nodes){for(let d of h){let _=r(d.row)-R/2;if(d.row%2===1&&(t.fillStyle=m.rowAlt,t.fillRect(0,_,e,R)),(d.row===this.hoverRow||d.commit.hash===f)&&(t.fillStyle=d.commit.hash===f?m.rowSelected:m.rowHover,this.roundRect(t,6,_+3,e-12,R-6,8),t.fill()),d.commit.branches.length||d.commit.tags.length){let P=n(d.lane)+o+8;this.drawRefPill(t,P,r(d.row),d.commit,m)}}}drawGuides(t,e,n,r){t.save(),t.strokeStyle=r.guide,t.lineWidth=1,t.setLineDash([3,5]);let o=e,m=e+n,f=t.canvas.clientWidth,h=this.laneStep(f);for(let d=0;d<this.laneCount;d++){let _=this.xOfLane(d,f,h);t.beginPath(),t.moveTo(_,o),t.lineTo(_,m),t.stroke()}t.restore()}ensureCanvasSize(t,e,n,r){let o=Math.floor(e*r),m=Math.floor(n*r);this.canvasSize.width===o&&this.canvasSize.height===m&&this.canvasSize.dpr===r||(this.canvasSize={width:o,height:m,dpr:r},t.width=o,t.height=m,t.style.width=`${e}px`,t.style.height=`${n}px`)}laneStep(t){if(this.laneCount<=1)return be;let e=Math.max(1,t-Ce*2-lt*2);return Math.min(be,e/(this.laneCount-1))}nodeRadius(t){return Math.max(2,Math.min(lt,t/2-.5))}xOfLane(t,e,n){if(this.laneCount<=1)return Math.min(e/2,Ce+be/2);let r=(this.laneCount-1)*n;return Math.max(Ce+lt,(e-r)/2)+t*n}requestIdle(t){let e=window.requestIdleCallback;return e?e(t,{timeout:100}):window.setTimeout(()=>t(),16)}cancelIdleLayout(){this.idleHandle!==null&&(window.cancelIdleCallback?window.cancelIdleCallback(this.idleHandle):clearTimeout(this.idleHandle),this.idleHandle=null)}drawEdge(t,e,n,r,o){if(t.beginPath(),t.moveTo(e,n),e===r)t.lineTo(r,o);else{let m=n+Math.min(R*.75,Math.max(12,(o-n)*.36));t.bezierCurveTo(e,m,r,m,r,o)}t.stroke()}drawRefPill(t,e,n,r,o){let m=r.tags[0]??r.branches.find(P=>!li(P));if(!m)return;let f=Math.max(0,t.canvas.clientWidth-e-8);if(f<28)return;let h=ci(m,f>72?12:8);t.font="600 10px ui-sans-serif, system-ui, sans-serif";let d=Math.min(f,72,t.measureText(h).width+14),_=18;t.fillStyle=r.tags.length?o.warningSoft:o.accentSoft,this.roundRect(t,e,n-_/2,d,_,999),t.fill(),t.fillStyle=r.tags.length?o.warning:o.accent,t.fillText(h,e+7,n+3.5)}onClick(t){let e=this.nodeFromEvent(t);e&&this.state.selectHash(e.commit.hash)}onMouseMove(t){let e=this.nodeFromEvent(t),n=e?.row??-1;n!==this.hoverRow&&(this.hoverRow=n,this.canvasRef.nativeElement.style.cursor=e?"pointer":"default",this.draw()),this.hoverTip.set(e?this.tipFromEvent(t,e):null)}tipFromEvent(t,e){let n=this.scrollRef.nativeElement,r=n.getBoundingClientRect(),o=Math.min(280,Math.max(180,r.width-24)),m=t.clientX-r.left,f=t.clientY-r.top,h=Math.max(12,Math.min(m+14,r.width-o-12)),d=n.scrollTop+Math.max(12,Math.min(f+14,r.height-128)),_=e.commit;return{x:h,y:d,subject:_.subject,shortHash:_.shortHash,author:_.author,date:_.date,refs:[..._.tags,..._.branches].join(", "),isMerge:_.isMerge}}onMouseLeave(){this.hoverRow!==-1&&(this.hoverRow=-1,this.hoverTip.set(null),this.canvasRef.nativeElement.style.cursor="default",this.draw())}nodeFromEvent(t){let e=this.scrollRef?.nativeElement,n=e?.getBoundingClientRect();if(!n)return;let r=t.clientY-n.top+(e?.scrollTop??0),o=Math.floor((r-we)/R);return this.nodes[o]}readTheme(t){let e=getComputedStyle(t);return{accent:this.css(e,"--accent","#4f46e5"),accentSoft:this.css(e,"--accent-soft","#eef2ff"),guide:this.css(e,"--graph-guide","rgba(148, 163, 184, 0.28)"),nodeRing:this.css(e,"--graph-node-ring","#ffffff"),rowAlt:this.css(e,"--graph-row-alt","rgba(15, 23, 42, 0.025)"),rowHover:this.css(e,"--graph-row-hover","rgba(79, 70, 229, 0.08)"),rowSelected:this.css(e,"--graph-row-selected","rgba(79, 70, 229, 0.14)"),shadow:this.css(e,"--graph-shadow","rgba(15, 23, 42, 0.12)"),surface:this.css(e,"--bg-panel","#ffffff"),warning:this.css(e,"--warning","#d97706"),warningSoft:"rgba(217, 119, 6, 0.15)"}}css(t,e,n){return t.getPropertyValue(e).trim()||n}roundRect(t,e,n,r,o,m){let f=Math.min(m,r/2,o/2);t.beginPath(),t.moveTo(e+f,n),t.arcTo(e+r,n,e+r,n+o,f),t.arcTo(e+r,n+o,e,n+o,f),t.arcTo(e,n+o,e,n,f),t.arcTo(e,n,e+r,n,f),t.closePath()}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=E({type:i,selectors:[["app-commit-graph"]],viewQuery:function(e,n){if(e&1&&(te(ti,7),te(ni,7)),e&2){let r;ne(r=ie())&&(n.canvasRef=r.first),ne(r=ie())&&(n.scrollRef=r.first)}},hostBindings:function(e,n){e&1&&M("resize",function(){return n.onResize()},Re)},decls:15,vars:6,consts:[["scroll",""],["canvas",""],[1,"header"],[1,"title"],[1,"hint"],["aria-hidden","true",1,"legend"],["class","swatch",3,"background",4,"ngFor","ngForOf"],[1,"scroll"],[1,"phantom"],["aria-label","Commit graph","role","img"],["class","graph-tooltip",3,"left","top",4,"ngIf"],["class","empty",4,"ngIf"],[1,"swatch"],[1,"graph-tooltip"],[1,"tip-top"],["class","merge",4,"ngIf"],[1,"tip-subject"],[1,"tip-meta"],["class","tip-refs",4,"ngIf"],[1,"merge"],[1,"tip-refs"],[1,"empty"]],template:function(e,n){e&1&&(l(0,"div",2)(1,"div",3)(2,"span"),c(3,"Graph"),a(),l(4,"span",4),c(5),a()(),l(6,"div",5),x(7,ii,1,2,"span",6),a()(),l(8,"div",7,0),w(10,"div",8)(11,"canvas",9,1),x(13,ai,14,13,"div",10)(14,si,2,0,"div",11),a()),e&2&&(s(5),v(n.graphSummary()),s(2),g("ngForOf",n.legendColors),s(3),X("height",n.contentHeight(),"px"),s(3),g("ngIf",n.hoverTip()),s(),g("ngIf",!n.state.commits().length&&!n.state.loading()))},dependencies:[V,J,F,ce],styles:['[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;min-height:0;background:transparent}.header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.65rem .85rem;border-bottom:1px solid var(--border-soft);font-size:12px;color:var(--fg-muted);background:color-mix(in oklab,var(--bg-surface) 88%,transparent)}.title[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1px;min-width:0}.title[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:first-child{color:var(--fg-primary);font-size:13px;font-weight:600}.hint[_ngcontent-%COMP%]{white-space:nowrap}.legend[_ngcontent-%COMP%]{display:flex;gap:4px;align-items:center;flex:0 0 auto}.swatch[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:999px;box-shadow:0 0 0 2px var(--bg-surface)}.scroll[_ngcontent-%COMP%]{position:relative;flex:1;overflow-y:auto;overflow-x:hidden;min-height:0;background:radial-gradient(circle at 24px 24px,var(--graph-row-alt) 0 1px,transparent 1px 100%),linear-gradient(180deg,color-mix(in oklab,var(--bg-surface) 92%,transparent),color-mix(in oklab,var(--bg-surface-2) 76%,transparent));background-size:24px 24px}.phantom[_ngcontent-%COMP%]{width:100%;pointer-events:none}canvas[_ngcontent-%COMP%]{display:block;position:absolute;top:0;left:0;pointer-events:auto;will-change:transform}.graph-tooltip[_ngcontent-%COMP%]{position:absolute;width:min(280px,calc(100% - 1.5rem));padding:.65rem .75rem;border:1px solid color-mix(in oklab,var(--accent) 34%,var(--border-soft));border-radius:var(--radius-md);background:color-mix(in oklab,var(--bg-elevated) 96%,transparent);box-shadow:var(--shadow-lg);color:var(--fg-primary);pointer-events:none;z-index:20}.tip-top[_ngcontent-%COMP%], .tip-meta[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;color:var(--fg-muted);font-size:11px}.tip-top[_ngcontent-%COMP%]{justify-content:space-between;margin-bottom:.35rem}.tip-top[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);color:var(--accent)}.merge[_ngcontent-%COMP%]{padding:1px 6px;border-radius:999px;background:color-mix(in oklab,var(--accent) 15%,transparent);color:var(--accent);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.tip-subject[_ngcontent-%COMP%]{margin-bottom:.4rem;font-size:13px;font-weight:600;line-height:1.35;overflow-wrap:anywhere}.tip-meta[_ngcontent-%COMP%]{flex-wrap:wrap;line-height:1.35}.tip-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:not(:last-child):after{content:"\\2022";margin-left:.5rem;opacity:.55}.tip-refs[_ngcontent-%COMP%]{margin-top:.45rem;color:var(--accent);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.empty[_ngcontent-%COMP%]{position:absolute;inset:0;display:grid;place-items:center;padding:1rem;color:var(--fg-muted);font-size:12px;text-align:center}'],changeDetection:0})};function li(i){return i.startsWith("origin/")||i.includes("/origin/")}function ci(i,t){return i.length>t?`${i.slice(0,Math.max(1,t-1))}...`:i}function ye(i,t=0){return di(i)?Number(i):arguments.length===2?t:0}function di(i){return!isNaN(parseFloat(i))&&!isNaN(Number(i))}function _n(i){return i instanceof ge?i.nativeElement:i}var dt;try{dt=typeof Intl<"u"&&Intl.v8BreakIterator}catch{dt=!1}var Ge=(()=>{class i{_platformId=u(Rt);isBrowser=this._platformId?en(this._platformId):typeof document=="object"&&!!document;EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent);TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent);BLINK=this.isBrowser&&!!(window.chrome||dt)&&typeof CSS<"u"&&!this.EDGE&&!this.TRIDENT;WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT;IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window);FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent);ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT;SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT;constructor(){}static \u0275fac=function(n){return new(n||i)};static \u0275prov=j({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var mi=new ee("cdk-dir-doc",{providedIn:"root",factory:pi});function pi(){return u(De)}var gi=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;function fi(i){let t=i?.toLowerCase()||"";return t==="auto"&&typeof navigator<"u"&&navigator?.language?gi.test(navigator.language)?"rtl":"ltr":t==="rtl"?"rtl":"ltr"}var vn=(()=>{class i{get value(){return this.valueSignal()}valueSignal=C("ltr");change=new At;constructor(){let e=u(mi,{optional:!0});if(e){let n=e.body?e.body.dir:null,r=e.documentElement?e.documentElement.dir:null;this.valueSignal.set(fi(n||r||"ltr"))}}ngOnDestroy(){this.change.complete()}static \u0275fac=function(n){return new(n||i)};static \u0275prov=j({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var G=(function(i){return i[i.NORMAL=0]="NORMAL",i[i.NEGATED=1]="NEGATED",i[i.INVERTED=2]="INVERTED",i})(G||{}),We,oe;function xn(){if(oe==null){if(typeof document!="object"||!document||typeof Element!="function"||!Element)return oe=!1,oe;if(document.documentElement?.style&&"scrollBehavior"in document.documentElement.style)oe=!0;else{let i=Element.prototype.scrollTo;i?oe=!/\{\s*\[native code\]\s*\}/.test(i.toString()):oe=!1}}return oe}function de(){if(typeof document!="object"||!document)return G.NORMAL;if(We==null){let i=document.createElement("div"),t=i.style;i.dir="rtl",t.width="1px",t.overflow="auto",t.visibility="hidden",t.pointerEvents="none",t.position="absolute";let e=document.createElement("div"),n=e.style;n.width="2px",n.height="1px",i.appendChild(e),document.body.appendChild(i),We=G.NORMAL,i.scrollLeft===0&&(i.scrollLeft=1,We=i.scrollLeft===0?G.NEGATED:G.INVERTED),i.remove()}return We}var mt=(()=>{class i{static \u0275fac=function(n){return new(n||i)};static \u0275mod=fe({type:i});static \u0275inj=pe({})}return i})();var Ue=class{};function bn(i){return i&&typeof i.connect=="function"&&!(i instanceof vt)}var qe=class extends Ue{_data;constructor(t){super(),this._data=t}connect(){return Oe(this._data)?this._data:K(this._data)}disconnect(){}},Me=(function(i){return i[i.REPLACED=0]="REPLACED",i[i.INSERTED=1]="INSERTED",i[i.MOVED=2]="MOVED",i[i.REMOVED=3]="REMOVED",i})(Me||{}),pt=new ee("_ViewRepeater"),Ye=class{viewCacheSize=20;_viewCache=[];applyChanges(t,e,n,r,o){t.forEachOperation((m,f,h)=>{let d,_;if(m.previousIndex==null){let P=()=>n(m,f,h);d=this._insertView(P,h,e,r(m)),_=d?Me.INSERTED:Me.REPLACED}else h==null?(this._detachAndCacheView(f,e),_=Me.REMOVED):(d=this._moveView(f,h,e,r(m)),_=Me.MOVED);o&&o({context:d?.context,operation:_,record:m})})}detach(){for(let t of this._viewCache)t.destroy();this._viewCache=[]}_insertView(t,e,n,r){let o=this._insertViewFromCache(e,n);if(o){o.context.$implicit=r;return}let m=t();return n.createEmbeddedView(m.templateRef,m.context,m.index)}_detachAndCacheView(t,e){let n=e.detach(t);this._maybeCacheView(n,e)}_moveView(t,e,n,r){let o=n.get(t);return n.move(o,e),o.context.$implicit=r,o}_maybeCacheView(t,e){if(this._viewCache.length<this.viewCacheSize)this._viewCache.push(t);else{let n=e.indexOf(t);n===-1?t.destroy():e.remove(n)}}_insertViewFromCache(t,e){let n=this._viewCache.pop();return n&&e.insert(n,t),n||null}};var hi=["contentWrapper"],ui=["*"],Mn=new ee("VIRTUAL_SCROLL_STRATEGY"),gt=class{_scrolledIndexChange=new B;scrolledIndexChange=this._scrolledIndexChange.pipe(yt());_viewport=null;_itemSize;_minBufferPx;_maxBufferPx;constructor(t,e,n){this._itemSize=t,this._minBufferPx=e,this._maxBufferPx=n}attach(t){this._viewport=t,this._updateTotalContentSize(),this._updateRenderedRange()}detach(){this._scrolledIndexChange.complete(),this._viewport=null}updateItemAndBufferSize(t,e,n){n<e,this._itemSize=t,this._minBufferPx=e,this._maxBufferPx=n,this._updateTotalContentSize(),this._updateRenderedRange()}onContentScrolled(){this._updateRenderedRange()}onDataLengthChanged(){this._updateTotalContentSize(),this._updateRenderedRange()}onContentRendered(){}onRenderedOffsetChanged(){}scrollToIndex(t,e){this._viewport&&this._viewport.scrollToOffset(t*this._itemSize,e)}_updateTotalContentSize(){this._viewport&&this._viewport.setTotalContentSize(this._viewport.getDataLength()*this._itemSize)}_updateRenderedRange(){if(!this._viewport)return;let t=this._viewport.getRenderedRange(),e={start:t.start,end:t.end},n=this._viewport.getViewportSize(),r=this._viewport.getDataLength(),o=this._viewport.measureScrollOffset(),m=this._itemSize>0?o/this._itemSize:0;if(e.end>r){let h=Math.ceil(n/this._itemSize),d=Math.max(0,Math.min(m,r-h));m!=d&&(m=d,o=d*this._itemSize,e.start=Math.floor(m)),e.end=Math.max(0,Math.min(r,e.start+h))}let f=o-e.start*this._itemSize;if(f<this._minBufferPx&&e.start!=0){let h=Math.ceil((this._maxBufferPx-f)/this._itemSize);e.start=Math.max(0,e.start-h),e.end=Math.min(r,Math.ceil(m+(n+this._minBufferPx)/this._itemSize))}else{let h=e.end*this._itemSize-(o+n);if(h<this._minBufferPx&&e.end!=r){let d=Math.ceil((this._maxBufferPx-h)/this._itemSize);d>0&&(e.end=Math.min(r,e.end+d),e.start=Math.max(0,Math.floor(m-this._minBufferPx/this._itemSize)))}}this._viewport.setRenderedRange(e),this._viewport.setRenderedContentOffset(Math.round(this._itemSize*e.start)),this._scrolledIndexChange.next(Math.floor(m))}};function _i(i){return i._scrollStrategy}var Sn=(()=>{class i{get itemSize(){return this._itemSize}set itemSize(e){this._itemSize=ye(e)}_itemSize=20;get minBufferPx(){return this._minBufferPx}set minBufferPx(e){this._minBufferPx=ye(e)}_minBufferPx=100;get maxBufferPx(){return this._maxBufferPx}set maxBufferPx(e){this._maxBufferPx=ye(e)}_maxBufferPx=200;_scrollStrategy=new gt(this.itemSize,this.minBufferPx,this.maxBufferPx);ngOnChanges(){this._scrollStrategy.updateItemAndBufferSize(this.itemSize,this.minBufferPx,this.maxBufferPx)}static \u0275fac=function(n){return new(n||i)};static \u0275dir=le({type:i,selectors:[["cdk-virtual-scroll-viewport","itemSize",""]],inputs:{itemSize:"itemSize",minBufferPx:"minBufferPx",maxBufferPx:"maxBufferPx"},features:[_e([{provide:Mn,useFactory:_i,deps:[Ot(()=>i)]}]),Ie]})}return i})(),vi=20,xi=(()=>{class i{_ngZone=u(he);_platform=u(Ge);_renderer=u(et).createRenderer(null,null);_cleanupGlobalListener;constructor(){}_scrolled=new B;_scrolledCount=0;scrollContainers=new Map;register(e){this.scrollContainers.has(e)||this.scrollContainers.set(e,e.elementScrolled().subscribe(()=>this._scrolled.next(e)))}deregister(e){let n=this.scrollContainers.get(e);n&&(n.unsubscribe(),this.scrollContainers.delete(e))}scrolled(e=vi){return this._platform.isBrowser?new Xe(n=>{this._cleanupGlobalListener||(this._cleanupGlobalListener=this._ngZone.runOutsideAngular(()=>this._renderer.listen("document","scroll",()=>this._scrolled.next())));let r=e>0?this._scrolled.pipe(ke(e)).subscribe(n):this._scrolled.subscribe(n);return this._scrolledCount++,()=>{r.unsubscribe(),this._scrolledCount--,this._scrolledCount||(this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0)}}):K()}ngOnDestroy(){this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0,this.scrollContainers.forEach((e,n)=>this.deregister(n)),this._scrolled.complete()}ancestorScrolled(e,n){let r=this.getAncestorScrollContainers(e);return this.scrolled(n).pipe(Ct(o=>!o||r.indexOf(o)>-1))}getAncestorScrollContainers(e){let n=[];return this.scrollContainers.forEach((r,o)=>{this._scrollableContainsElement(o,e)&&n.push(o)}),n}_scrollableContainsElement(e,n){let r=_n(n),o=e.getElementRef().nativeElement;do if(r==o)return!0;while(r=r.parentElement);return!1}static \u0275fac=function(n){return new(n||i)};static \u0275prov=j({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),On=(()=>{class i{elementRef=u(ge);scrollDispatcher=u(xi);ngZone=u(he);dir=u(vn,{optional:!0});_scrollElement=this.elementRef.nativeElement;_destroyed=new B;_renderer=u(Ft);_cleanupScroll;_elementScrolled=new B;constructor(){}ngOnInit(){this._cleanupScroll=this.ngZone.runOutsideAngular(()=>this._renderer.listen(this._scrollElement,"scroll",e=>this._elementScrolled.next(e))),this.scrollDispatcher.register(this)}ngOnDestroy(){this._cleanupScroll?.(),this._elementScrolled.complete(),this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}elementScrolled(){return this._elementScrolled}getElementRef(){return this.elementRef}scrollTo(e){let n=this.elementRef.nativeElement,r=this.dir&&this.dir.value=="rtl";e.left==null&&(e.left=r?e.end:e.start),e.right==null&&(e.right=r?e.start:e.end),e.bottom!=null&&(e.top=n.scrollHeight-n.clientHeight-e.bottom),r&&de()!=G.NORMAL?(e.left!=null&&(e.right=n.scrollWidth-n.clientWidth-e.left),de()==G.INVERTED?e.left=e.right:de()==G.NEGATED&&(e.left=e.right?-e.right:e.right)):e.right!=null&&(e.left=n.scrollWidth-n.clientWidth-e.right),this._applyScrollToOptions(e)}_applyScrollToOptions(e){let n=this.elementRef.nativeElement;xn()?n.scrollTo(e):(e.top!=null&&(n.scrollTop=e.top),e.left!=null&&(n.scrollLeft=e.left))}measureScrollOffset(e){let n="left",r="right",o=this.elementRef.nativeElement;if(e=="top")return o.scrollTop;if(e=="bottom")return o.scrollHeight-o.clientHeight-o.scrollTop;let m=this.dir&&this.dir.value=="rtl";return e=="start"?e=m?r:n:e=="end"&&(e=m?n:r),m&&de()==G.INVERTED?e==n?o.scrollWidth-o.clientWidth-o.scrollLeft:o.scrollLeft:m&&de()==G.NEGATED?e==n?o.scrollLeft+o.scrollWidth-o.clientWidth:-o.scrollLeft:e==n?o.scrollLeft:o.scrollWidth-o.clientWidth-o.scrollLeft}static \u0275fac=function(n){return new(n||i)};static \u0275dir=le({type:i,selectors:[["","cdk-scrollable",""],["","cdkScrollable",""]]})}return i})(),bi=20,Ci=(()=>{class i{_platform=u(Ge);_listeners;_viewportSize;_change=new B;_document=u(De);constructor(){let e=u(he),n=u(et).createRenderer(null,null);e.runOutsideAngular(()=>{if(this._platform.isBrowser){let r=o=>this._change.next(o);this._listeners=[n.listen("window","resize",r),n.listen("window","orientationchange",r)]}this.change().subscribe(()=>this._viewportSize=null)})}ngOnDestroy(){this._listeners?.forEach(e=>e()),this._change.complete()}getViewportSize(){this._viewportSize||this._updateViewportSize();let e={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),e}getViewportRect(){let e=this.getViewportScrollPosition(),{width:n,height:r}=this.getViewportSize();return{top:e.top,left:e.left,bottom:e.top+r,right:e.left+n,height:r,width:n}}getViewportScrollPosition(){if(!this._platform.isBrowser)return{top:0,left:0};let e=this._document,n=this._getWindow(),r=e.documentElement,o=r.getBoundingClientRect(),m=-o.top||e.body.scrollTop||n.scrollY||r.scrollTop||0,f=-o.left||e.body.scrollLeft||n.scrollX||r.scrollLeft||0;return{top:m,left:f}}change(e=bi){return e>0?this._change.pipe(ke(e)):this._change}_getWindow(){return this._document.defaultView||window}_updateViewportSize(){let e=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:e.innerWidth,height:e.innerHeight}:{width:0,height:0}}static \u0275fac=function(n){return new(n||i)};static \u0275prov=j({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),Cn=new ee("VIRTUAL_SCROLLABLE"),wi=(()=>{class i extends On{constructor(){super()}measureViewportSize(e){let n=this.elementRef.nativeElement;return e==="horizontal"?n.clientWidth:n.clientHeight}static \u0275fac=function(n){return new(n||i)};static \u0275dir=le({type:i,features:[tt]})}return i})();function yi(i,t){return i.start==t.start&&i.end==t.end}var Mi=typeof requestAnimationFrame<"u"?bt:xt,ft=(()=>{class i extends wi{elementRef=u(ge);_changeDetectorRef=u(Kt);_scrollStrategy=u(Mn,{optional:!0});scrollable=u(Cn,{optional:!0});_platform=u(Ge);_detachedSubject=new B;_renderedRangeSubject=new B;get orientation(){return this._orientation}set orientation(e){this._orientation!==e&&(this._orientation=e,this._calculateSpacerSize())}_orientation="vertical";appendOnly=!1;scrolledIndexChange=new Xe(e=>this._scrollStrategy.scrolledIndexChange.subscribe(n=>Promise.resolve().then(()=>this.ngZone.run(()=>e.next(n)))));_contentWrapper;renderedRangeStream=this._renderedRangeSubject;_totalContentSize=0;_totalContentWidth=C("");_totalContentHeight=C("");_renderedContentTransform;_renderedRange={start:0,end:0};_dataLength=0;_viewportSize=0;_forOf;_renderedContentOffset=0;_renderedContentOffsetNeedsRewrite=!1;_changeDetectionNeeded=C(!1);_runAfterChangeDetection=[];_viewportChanges=_t.EMPTY;_injector=u(Pt);_isDestroyed=!1;constructor(){super();let e=u(Ci);this._scrollStrategy,this._viewportChanges=e.change().subscribe(()=>{this.checkViewportSize()}),this.scrollable||(this.elementRef.nativeElement.classList.add("cdk-virtual-scrollable"),this.scrollable=this);let n=U(()=>{this._changeDetectionNeeded()&&this._doChangeDetection()},{injector:u(jt).injector});u(Et).onDestroy(()=>void n.destroy())}ngOnInit(){this._platform.isBrowser&&(this.scrollable===this&&super.ngOnInit(),this.ngZone.runOutsideAngular(()=>Promise.resolve().then(()=>{this._measureViewportSize(),this._scrollStrategy.attach(this),this.scrollable.elementScrolled().pipe(Je(null),ke(0,Mi),Ee(this._destroyed)).subscribe(()=>this._scrollStrategy.onContentScrolled()),this._markChangeDetectionNeeded()})))}ngOnDestroy(){this.detach(),this._scrollStrategy.detach(),this._renderedRangeSubject.complete(),this._detachedSubject.complete(),this._viewportChanges.unsubscribe(),this._isDestroyed=!0,super.ngOnDestroy()}attach(e){this._forOf,this.ngZone.runOutsideAngular(()=>{this._forOf=e,this._forOf.dataStream.pipe(Ee(this._detachedSubject)).subscribe(n=>{let r=n.length;r!==this._dataLength&&(this._dataLength=r,this._scrollStrategy.onDataLengthChanged()),this._doChangeDetection()})})}detach(){this._forOf=null,this._detachedSubject.next()}getDataLength(){return this._dataLength}getViewportSize(){return this._viewportSize}getRenderedRange(){return this._renderedRange}measureBoundingClientRectWithScrollOffset(e){return this.getElementRef().nativeElement.getBoundingClientRect()[e]}setTotalContentSize(e){this._totalContentSize!==e&&(this._totalContentSize=e,this._calculateSpacerSize(),this._markChangeDetectionNeeded())}setRenderedRange(e){yi(this._renderedRange,e)||(this.appendOnly&&(e={start:0,end:Math.max(this._renderedRange.end,e.end)}),this._renderedRangeSubject.next(this._renderedRange=e),this._markChangeDetectionNeeded(()=>this._scrollStrategy.onContentRendered()))}getOffsetToRenderedContentStart(){return this._renderedContentOffsetNeedsRewrite?null:this._renderedContentOffset}setRenderedContentOffset(e,n="to-start"){e=this.appendOnly&&n==="to-start"?0:e;let r=this.dir&&this.dir.value=="rtl",o=this.orientation=="horizontal",m=o?"X":"Y",h=`translate${m}(${Number((o&&r?-1:1)*e)}px)`;this._renderedContentOffset=e,n==="to-end"&&(h+=` translate${m}(-100%)`,this._renderedContentOffsetNeedsRewrite=!0),this._renderedContentTransform!=h&&(this._renderedContentTransform=h,this._markChangeDetectionNeeded(()=>{this._renderedContentOffsetNeedsRewrite?(this._renderedContentOffset-=this.measureRenderedContentSize(),this._renderedContentOffsetNeedsRewrite=!1,this.setRenderedContentOffset(this._renderedContentOffset)):this._scrollStrategy.onRenderedOffsetChanged()}))}scrollToOffset(e,n="auto"){let r={behavior:n};this.orientation==="horizontal"?r.start=e:r.top=e,this.scrollable.scrollTo(r)}scrollToIndex(e,n="auto"){this._scrollStrategy.scrollToIndex(e,n)}measureScrollOffset(e){let n;return this.scrollable==this?n=r=>super.measureScrollOffset(r):n=r=>this.scrollable.measureScrollOffset(r),Math.max(0,n(e??(this.orientation==="horizontal"?"start":"top"))-this.measureViewportOffset())}measureViewportOffset(e){let n,r="left",o="right",m=this.dir?.value=="rtl";e=="start"?n=m?o:r:e=="end"?n=m?r:o:e?n=e:n=this.orientation==="horizontal"?"left":"top";let f=this.scrollable.measureBoundingClientRectWithScrollOffset(n);return this.elementRef.nativeElement.getBoundingClientRect()[n]-f}measureRenderedContentSize(){let e=this._contentWrapper.nativeElement;return this.orientation==="horizontal"?e.offsetWidth:e.offsetHeight}measureRangeSize(e){return this._forOf?this._forOf.measureRangeSize(e,this.orientation):0}checkViewportSize(){this._measureViewportSize(),this._scrollStrategy.onDataLengthChanged()}_measureViewportSize(){this._viewportSize=this.scrollable.measureViewportSize(this.orientation)}_markChangeDetectionNeeded(e){e&&this._runAfterChangeDetection.push(e),!Qt(this._changeDetectionNeeded)&&this.ngZone.runOutsideAngular(()=>{Promise.resolve().then(()=>{this.ngZone.run(()=>{this._changeDetectionNeeded.set(!0)})})})}_doChangeDetection(){this._isDestroyed||this.ngZone.run(()=>{this._changeDetectorRef.markForCheck(),this._contentWrapper.nativeElement.style.transform=this._renderedContentTransform,Bt(()=>{this._changeDetectionNeeded.set(!1);let e=this._runAfterChangeDetection;this._runAfterChangeDetection=[];for(let n of e)n()},{injector:this._injector})})}_calculateSpacerSize(){this._totalContentHeight.set(this.orientation==="horizontal"?"":`${this._totalContentSize}px`),this._totalContentWidth.set(this.orientation==="horizontal"?`${this._totalContentSize}px`:"")}static \u0275fac=function(n){return new(n||i)};static \u0275cmp=E({type:i,selectors:[["cdk-virtual-scroll-viewport"]],viewQuery:function(n,r){if(n&1&&te(hi,7),n&2){let o;ne(o=ie())&&(r._contentWrapper=o.first)}},hostAttrs:[1,"cdk-virtual-scroll-viewport"],hostVars:4,hostBindings:function(n,r){n&2&&$("cdk-virtual-scroll-orientation-horizontal",r.orientation==="horizontal")("cdk-virtual-scroll-orientation-vertical",r.orientation!=="horizontal")},inputs:{orientation:"orientation",appendOnly:[2,"appendOnly","appendOnly",Jt]},outputs:{scrolledIndexChange:"scrolledIndexChange"},features:[_e([{provide:On,useFactory:(e,n)=>e||n,deps:[[new It,new Dt(Cn)],i]}]),tt],ngContentSelectors:ui,decls:4,vars:4,consts:[["contentWrapper",""],[1,"cdk-virtual-scroll-content-wrapper"],[1,"cdk-virtual-scroll-spacer"]],template:function(n,r){n&1&&(Wt(),Ht(0,"div",1,0),Ut(2),$t(),Gt(3,"div",2)),n&2&&(s(3),X("width",r._totalContentWidth())("height",r._totalContentHeight()))},styles:[`cdk-virtual-scroll-viewport{display:block;position:relative;transform:translateZ(0)}.cdk-virtual-scrollable{overflow:auto;will-change:scroll-position;contain:strict}.cdk-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .cdk-virtual-scroll-content-wrapper{right:0;left:auto}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper{min-height:100%}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{min-width:100%}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.cdk-virtual-scroll-spacer{height:1px;transform-origin:0 0;flex:0 0 auto}[dir=rtl] .cdk-virtual-scroll-spacer{transform-origin:100% 0}
2
+ `],encapsulation:2,changeDetection:0})}return i})();function wn(i,t,e){let n=e;if(!n.getBoundingClientRect)return 0;let r=n.getBoundingClientRect();return i==="horizontal"?t==="start"?r.left:r.right:t==="start"?r.top:r.bottom}var kn=(()=>{class i{_viewContainerRef=u(Nt);_template=u(zt);_differs=u(Xt);_viewRepeater=u(pt);_viewport=u(ft,{skipSelf:!0});viewChange=new B;_dataSourceChanges=new B;get cdkVirtualForOf(){return this._cdkVirtualForOf}set cdkVirtualForOf(e){this._cdkVirtualForOf=e,bn(e)?this._dataSourceChanges.next(e):this._dataSourceChanges.next(new qe(Oe(e)?e:Array.from(e||[])))}_cdkVirtualForOf;get cdkVirtualForTrackBy(){return this._cdkVirtualForTrackBy}set cdkVirtualForTrackBy(e){this._needsUpdate=!0,this._cdkVirtualForTrackBy=e?(n,r)=>e(n+(this._renderedRange?this._renderedRange.start:0),r):void 0}_cdkVirtualForTrackBy;set cdkVirtualForTemplate(e){e&&(this._needsUpdate=!0,this._template=e)}get cdkVirtualForTemplateCacheSize(){return this._viewRepeater.viewCacheSize}set cdkVirtualForTemplateCacheSize(e){this._viewRepeater.viewCacheSize=ye(e)}dataStream=this._dataSourceChanges.pipe(Je(null),Mt(),Pe(([e,n])=>this._changeDataSource(e,n)),St(1));_differ=null;_data;_renderedItems;_renderedRange;_needsUpdate=!1;_destroyed=new B;constructor(){let e=u(he);this.dataStream.subscribe(n=>{this._data=n,this._onRenderedDataChange()}),this._viewport.renderedRangeStream.pipe(Ee(this._destroyed)).subscribe(n=>{this._renderedRange=n,this.viewChange.observers.length&&e.run(()=>this.viewChange.next(this._renderedRange)),this._onRenderedDataChange()}),this._viewport.attach(this)}measureRangeSize(e,n){if(e.start>=e.end)return 0;e.start<this._renderedRange.start||e.end>this._renderedRange.end;let r=e.start-this._renderedRange.start,o=e.end-e.start,m,f;for(let h=0;h<o;h++){let d=this._viewContainerRef.get(h+r);if(d&&d.rootNodes.length){m=f=d.rootNodes[0];break}}for(let h=o-1;h>-1;h--){let d=this._viewContainerRef.get(h+r);if(d&&d.rootNodes.length){f=d.rootNodes[d.rootNodes.length-1];break}}return m&&f?wn(n,"end",f)-wn(n,"start",m):0}ngDoCheck(){if(this._differ&&this._needsUpdate){let e=this._differ.diff(this._renderedItems);e?this._applyChanges(e):this._updateContext(),this._needsUpdate=!1}}ngOnDestroy(){this._viewport.detach(),this._dataSourceChanges.next(void 0),this._dataSourceChanges.complete(),this.viewChange.complete(),this._destroyed.next(),this._destroyed.complete(),this._viewRepeater.detach()}_onRenderedDataChange(){this._renderedRange&&(this._renderedItems=this._data.slice(this._renderedRange.start,this._renderedRange.end),this._differ||(this._differ=this._differs.find(this._renderedItems).create((e,n)=>this.cdkVirtualForTrackBy?this.cdkVirtualForTrackBy(e,n):n)),this._needsUpdate=!0)}_changeDataSource(e,n){return e&&e.disconnect(this),this._needsUpdate=!0,n?n.connect(this):K()}_updateContext(){let e=this._data.length,n=this._viewContainerRef.length;for(;n--;){let r=this._viewContainerRef.get(n);r.context.index=this._renderedRange.start+n,r.context.count=e,this._updateComputedContextProperties(r.context),r.detectChanges()}}_applyChanges(e){this._viewRepeater.applyChanges(e,this._viewContainerRef,(o,m,f)=>this._getEmbeddedViewArgs(o,f),o=>o.item),e.forEachIdentityChange(o=>{let m=this._viewContainerRef.get(o.currentIndex);m.context.$implicit=o.item});let n=this._data.length,r=this._viewContainerRef.length;for(;r--;){let o=this._viewContainerRef.get(r);o.context.index=this._renderedRange.start+r,o.context.count=n,this._updateComputedContextProperties(o.context)}}_updateComputedContextProperties(e){e.first=e.index===0,e.last=e.index===e.count-1,e.even=e.index%2===0,e.odd=!e.even}_getEmbeddedViewArgs(e,n){return{templateRef:this._template,context:{$implicit:e.item,cdkVirtualForOf:this._cdkVirtualForOf,index:-1,count:-1,first:!1,last:!1,odd:!1,even:!1},index:n}}static ngTemplateContextGuard(e,n){return!0}static \u0275fac=function(n){return new(n||i)};static \u0275dir=le({type:i,selectors:[["","cdkVirtualFor","","cdkVirtualForOf",""]],inputs:{cdkVirtualForOf:"cdkVirtualForOf",cdkVirtualForTrackBy:"cdkVirtualForTrackBy",cdkVirtualForTemplate:"cdkVirtualForTemplate",cdkVirtualForTemplateCacheSize:"cdkVirtualForTemplateCacheSize"},features:[_e([{provide:pt,useClass:Ye}])]})}return i})();var yn=(()=>{class i{static \u0275fac=function(n){return new(n||i)};static \u0275mod=fe({type:i});static \u0275inj=pe({})}return i})(),Pn=(()=>{class i{static \u0275fac=function(n){return new(n||i)};static \u0275mod=fe({type:i});static \u0275inj=pe({imports:[mt,yn,mt,yn]})}return i})();function Oi(i,t){i&1&&w(0,"span",24)}function ki(i,t){if(i&1&&(l(0,"span",28),c(1),a()),i&2){let e=t.$implicit;g("title",e),s(),v(e)}}function Pi(i,t){if(i&1&&(l(0,"span",29),c(1),a()),i&2){let e=t.$implicit;g("title",e),s(),v(e)}}function Ei(i,t){if(i&1&&(l(0,"span",25),x(1,ki,2,2,"span",26)(2,Pi,2,2,"span",27),a()),i&2){let e=b().$implicit;s(),g("ngForOf",e.tags),s(),g("ngForOf",e.branches)}}function Di(i,t){if(i&1&&(l(0,"span",30),c(1),a()),i&2){let e=t.ngIf;s(),v(e)}}function Ii(i,t){if(i&1){let e=H();l(0,"button",7),M("click",function(){let r=S(e).$implicit,o=b();return O(o.select(r))}),l(1,"span",8),w(2,"span",9),x(3,Oi,1,0,"span",10),a(),l(4,"span",11)(5,"span",12)(6,"span",13),c(7),a(),x(8,Ei,3,2,"span",14),a(),l(9,"span",15)(10,"span",16),c(11),a(),l(12,"span",17),c(13,"\u2022"),a(),l(14,"span",18),c(15),a(),l(16,"span",17),c(17,"\u2022"),a(),l(18,"span",19),W(19,"date"),c(20),W(21,"date"),a()(),l(22,"span",20)(23,"span",21),c(24),a(),l(25,"span",22)(26,"span",16),c(27),a(),l(28,"span"),c(29),a(),l(30,"span"),c(31),W(32,"date"),a()(),x(33,Di,2,1,"span",23),a()()()}if(i&2){let e=t.$implicit,n=t.index,r=b();$("selected",e.hash===r.selectedHash()),ue("aria-current",e.hash===r.selectedHash()?"true":null),s(2),X("background",r.laneColor(e)),$("merge",e.isMerge),s(),g("ngIf",n<r.commits().length-1),s(3),g("title",e.subject),s(),v(e.subject),s(),g("ngIf",e.branches.length||e.tags.length),s(3),v(e.shortHash),s(3),g("title",e.author),s(),v(e.author),s(3),g("title",Z(19,21,e.date,"MMM d, y, h:mm a")),s(2),z(" ",Z(21,24,e.date,"MMM d, y, h:mm a")," "),s(4),v(e.subject),s(3),v(e.shortHash),s(2),v(e.author),s(2),v(Z(32,27,e.date,"MMM d, y, h:mm a")),s(2),g("ngIf",r.refsFor(e))}}function Ri(i,t){i&1&&(l(0,"div",31)(1,"p"),c(2,"No commits match your filters."),a()())}var Ze=class i{state=u(q);commits=this.state.commits;selectedHash=this.state.selectedHash;trackByHash(t,e){return e.hash}select(t){this.state.selectHash(t.hash)}refsFor(t){return[...t.tags,...t.branches].join(", ")}laneColors=["#4f46e5","#06b6d4","#f59e0b","#ef4444","#10b981","#8b5cf6"];laneColor(t){let e=0,n=t.branches[0]??t.parents[0]??t.hash;for(let r=0;r<n.length;r++)e=e*31+n.charCodeAt(r)>>>0;return this.laneColors[e%this.laneColors.length]}onKey(t){if(!this.isTyping(t.target)){if(t.key==="j")t.preventDefault(),this.state.selectByOffset(1);else if(t.key==="k")t.preventDefault(),this.state.selectByOffset(-1);else if(t.key==="g"){t.preventDefault();let e=this.state.commits();e.length&&this.state.selectHash(e[0].hash)}else if(t.key==="G"){t.preventDefault();let e=this.state.commits();e.length&&this.state.selectHash(e[e.length-1].hash)}}}isTyping(t){return t instanceof HTMLElement?["INPUT","TEXTAREA","SELECT"].includes(t.tagName)||t.isContentEditable:!1}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=E({type:i,selectors:[["app-commit-list"]],hostBindings:function(e,n){e&1&&M("keydown",function(o){return n.onKey(o)},Re)},decls:13,vars:6,consts:[[1,"header"],[1,"count"],[1,"hint"],[1,"kbd"],["minBufferPx","640","maxBufferPx","1280",1,"viewport",3,"itemSize"],["class","row",3,"selected","click",4,"cdkVirtualFor","cdkVirtualForOf","cdkVirtualForTrackBy"],["class","empty",4,"ngIf"],[1,"row",3,"click"],[1,"lane"],[1,"dot"],["class","line",4,"ngIf"],[1,"content"],[1,"title-row"],[1,"subject",3,"title"],["class","badges",4,"ngIf"],[1,"meta"],[1,"hash"],[1,"dot-sep"],[1,"author",3,"title"],[1,"date",3,"title"],["aria-hidden","true",1,"hover-card"],[1,"hover-subject"],[1,"hover-meta"],["class","hover-refs",4,"ngIf"],[1,"line"],[1,"badges"],["class","badge tag",3,"title",4,"ngFor","ngForOf"],["class","badge branch",3,"title",4,"ngFor","ngForOf"],[1,"badge","tag",3,"title"],[1,"badge","branch",3,"title"],[1,"hover-refs"],[1,"empty"]],template:function(e,n){e&1&&(l(0,"div",0)(1,"span",1),c(2),a(),l(3,"span",2)(4,"kbd",3),c(5,"j"),a(),c(6,"/"),l(7,"kbd",3),c(8,"k"),a(),c(9," navigate "),a()(),l(10,"cdk-virtual-scroll-viewport",4),x(11,Ii,34,30,"button",5)(12,Ri,3,0,"div",6),a()),e&2&&(s(2),Ve("",n.commits().length," of ",n.state.total()),s(8),g("itemSize",68),s(),g("cdkVirtualForOf",n.commits())("cdkVirtualForTrackBy",n.trackByHash),s(),g("ngIf",!n.commits().length&&!n.state.loading()))},dependencies:[V,J,F,Pn,Sn,kn,ft,ce],styles:['[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;min-height:0;background:transparent}.header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:.6rem .85rem;border-bottom:1px solid var(--border-soft);font-size:12px;color:var(--fg-muted);background:color-mix(in oklab,var(--bg-surface) 92%,transparent)}.viewport[_ngcontent-%COMP%]{flex:1;min-height:0}.row[_ngcontent-%COMP%]{position:relative;display:grid;grid-template-columns:24px minmax(0,1fr);gap:.5rem;align-items:center;width:100%;height:68px;padding:.45rem .7rem;background:transparent;border:0;border-bottom:1px solid var(--border-soft);border-left:3px solid transparent;color:inherit;text-align:left;cursor:pointer;transition:background .1s,border-color .1s,transform 80ms}.row[_ngcontent-%COMP%]:hover{background:color-mix(in oklab,var(--bg-hover) 70%,transparent);border-left-color:color-mix(in oklab,var(--accent) 48%,transparent);z-index:3}.row.selected[_ngcontent-%COMP%]{background:linear-gradient(90deg,color-mix(in oklab,var(--accent) 18%,transparent),transparent 70%);border-left-color:var(--accent)}.row.selected[_ngcontent-%COMP%] .subject[_ngcontent-%COMP%]{color:var(--fg-primary)}.lane[_ngcontent-%COMP%]{position:relative;width:24px;height:100%;display:flex;align-items:center;justify-content:center}.dot[_ngcontent-%COMP%]{width:9px;height:9px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 2px var(--bg-surface);z-index:1}.dot.merge[_ngcontent-%COMP%]{background:transparent;border:2px solid var(--accent)}.line[_ngcontent-%COMP%]{position:absolute;top:50%;left:50%;width:2px;height:50%;background:var(--border-strong);transform:translate(-50%)}.content[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-width:0;gap:4px}.title-row[_ngcontent-%COMP%]{display:flex;align-items:center;min-width:0;gap:.5rem}.subject[_ngcontent-%COMP%]{flex:1 1 auto;min-width:0;font-weight:500;font-size:13px;color:var(--fg-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.meta[_ngcontent-%COMP%]{display:flex;gap:6px;font-size:11px;color:var(--fg-muted);align-items:center;min-width:0;overflow:hidden;white-space:nowrap}.hash[_ngcontent-%COMP%]{flex:0 0 auto;font-family:var(--font-mono)}.author[_ngcontent-%COMP%], .date[_ngcontent-%COMP%]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.author[_ngcontent-%COMP%]{flex:0 1 auto}.date[_ngcontent-%COMP%]{flex:1 1 auto}.dot-sep[_ngcontent-%COMP%]{opacity:.5}.badges[_ngcontent-%COMP%]{display:inline-flex;gap:4px;flex:0 1 auto;flex-wrap:nowrap;justify-content:flex-end;min-width:0;max-width:min(48%,180px);overflow:hidden}.badge[_ngcontent-%COMP%]{flex:0 1 auto;font-size:10px;font-weight:600;padding:2px 7px;border-radius:999px;letter-spacing:.02em;border:1px solid transparent;min-width:0;max-width:132px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.badge.tag[_ngcontent-%COMP%]{background:#d9770626;color:var(--warning);border-color:color-mix(in oklab,var(--warning) 24%,transparent)}.badge.branch[_ngcontent-%COMP%]{background:var(--accent-soft);color:var(--accent);border-color:color-mix(in oklab,var(--accent) 24%,transparent)}.hover-card[_ngcontent-%COMP%]{position:absolute;left:42px;right:10px;top:calc(100% - 8px);display:flex;flex-direction:column;gap:.35rem;padding:.65rem .75rem;border:1px solid color-mix(in oklab,var(--accent) 28%,var(--border-soft));border-radius:var(--radius-md);background:color-mix(in oklab,var(--bg-elevated) 96%,transparent);box-shadow:var(--shadow-lg);color:var(--fg-primary);opacity:0;pointer-events:none;transform:translateY(-4px);transition:opacity .1s ease,transform .1s ease,visibility .1s;visibility:hidden;z-index:12}.row[_ngcontent-%COMP%]:hover .hover-card[_ngcontent-%COMP%], .row[_ngcontent-%COMP%]:focus-visible .hover-card[_ngcontent-%COMP%]{opacity:1;transform:translateY(0);visibility:visible}.hover-subject[_ngcontent-%COMP%]{font-size:13px;font-weight:600;line-height:1.35;white-space:normal;overflow-wrap:anywhere}.hover-meta[_ngcontent-%COMP%], .hover-refs[_ngcontent-%COMP%]{display:flex;gap:.45rem;flex-wrap:wrap;font-size:11px;line-height:1.35;color:var(--fg-muted)}.hover-meta[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:not(:last-child):after{content:"\\2022";margin-left:.45rem;opacity:.55}.hover-refs[_ngcontent-%COMP%]{color:var(--accent);overflow-wrap:anywhere}.empty[_ngcontent-%COMP%]{padding:2rem 1rem;text-align:center;color:var(--fg-muted)}'],changeDetection:0})};var Qe=class i{http=u(Le);base="/api";list(t={}){let e=new tn;for(let[n,r]of Object.entries(t))r&&(e=e.set(n,String(r)));return this.http.get(`${this.base}/groups`,{params:e})}static \u0275fac=function(e){return new(e||i)};static \u0275prov=j({token:i,factory:i.\u0275fac,providedIn:"root"})};function Ti(i,t){if(i&1&&(l(0,"span",7),c(1),a()),i&2){let e=t.ngIf;s(),z("",e," groups")}}function zi(i,t){i&1&&(l(0,"div",8),c(1,"Loading groups\u2026"),a())}function Fi(i,t){if(i&1&&(l(0,"div",9),c(1),a()),i&2){let e=t.ngIf;s(),v(e)}}function Vi(i,t){i&1&&(l(0,"div",8),c(1," No groups detected. Try the flat view. "),a())}function Ni(i,t){if(i&1&&(l(0,"span",18),c(1),a()),i&2){let e=b().$implicit;s(),z("#",e.prNumber)}}function Li(i,t){if(i&1){let e=H();l(0,"li",21),M("click",function(){let r=S(e).$implicit,o=b(3);return O(o.state.selectHash(r))}),l(1,"code",22),c(2),a(),l(3,"span",23),c(4),a()()}if(i&2){let e=t.$implicit,n=b(3);$("selected",e===n.state.selectedHash()),s(2),v(n.shortHash(e)),s(2),v(n.subjectFor(e))}}function Ai(i,t){if(i&1&&(l(0,"ul",19),x(1,Li,5,4,"li",20),a()),i&2){let e=b().$implicit;s(),g("ngForOf",e.commits)}}function Bi(i,t){if(i&1){let e=H();l(0,"li",10)(1,"button",11),M("click",function(){let r=S(e).$implicit,o=b();return O(o.toggle(r.id))}),l(2,"span",12),c(3,"\u25B8"),a(),l(4,"span",13),c(5),a(),x(6,Ni,2,1,"span",14),l(7,"span",15),c(8),a(),l(9,"span",16),c(10),a()(),x(11,Ai,2,1,"ul",17),a()}if(i&2){let e=t.$implicit,n=b();$("expanded",n.isExpanded(e.id)),s(2),$("open",n.isExpanded(e.id)),s(2),qt("src-"+e.source),s(),v(n.sourceLabel(e.source)),s(),g("ngIf",e.prNumber),s(2),v(e.title),s(2),v(e.commits.length),s(),g("ngIf",n.isExpanded(e.id))}}var Ke=class i{state=u(q);groupsApi=u(Qe);groups=C(null);loading=C(!1);error=C(null);expanded=C(new Set);subjectMap=re(()=>{let t=new Map;for(let e of this.state.commits())t.set(e.hash,e.subject);return t});constructor(){U(()=>{let t=this.state.filters();this.load(t.since,t.until,t.author,t.branch)})}isExpanded(t){return this.expanded().has(t)}toggle(t){let e=new Set(this.expanded());e.has(t)?e.delete(t):e.add(t),this.expanded.set(e)}shortHash(t){return t.slice(0,7)}subjectFor(t){return this.subjectMap().get(t)??t.slice(0,7)}sourceLabel(t){switch(t){case"merge":return"PR";case"squash":return"PR (sq)";case"conventional":return"Feat";case"standalone":return"commit"}}load(t,e,n,r){this.loading.set(!0),this.error.set(null),this.groupsApi.list({since:t,until:e,author:n,branch:r}).subscribe({next:o=>{this.groups.set(o),this.loading.set(!1);let m=o.find(f=>f.prNumber);m&&this.expanded.set(new Set([m.id]))},error:o=>{this.error.set(this.errMsg(o)),this.loading.set(!1)}})}errMsg(t){if(t&&typeof t=="object"&&"error"in t){let e=t.error;if(e?.error)return e.error}return t instanceof Error?t.message:"Failed to load groups"}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=E({type:i,selectors:[["app-grouped-list"]],decls:9,vars:5,consts:[[1,"head"],[1,"title"],["class","meta",4,"ngIf"],["class","empty",4,"ngIf"],["class","empty error",4,"ngIf"],[1,"groups"],["class","group",3,"expanded",4,"ngFor","ngForOf"],[1,"meta"],[1,"empty"],[1,"empty","error"],[1,"group"],[1,"group-head",3,"click"],[1,"caret"],[1,"badge"],["class","pr",4,"ngIf"],[1,"g-title"],[1,"count"],["class","commits",4,"ngIf"],[1,"pr"],[1,"commits"],["class","commit",3,"selected","click",4,"ngFor","ngForOf"],[1,"commit",3,"click"],[1,"hash"],[1,"subject"]],template:function(e,n){if(e&1&&(l(0,"div",0)(1,"span",1),c(2,"PR / feature groups"),a(),x(3,Ti,2,1,"span",2),a(),x(4,zi,2,0,"div",3)(5,Fi,2,1,"div",4)(6,Vi,2,0,"div",3),l(7,"ul",5),x(8,Bi,12,11,"li",6),a()),e&2){let r,o;s(3),g("ngIf",(r=n.groups())==null?null:r.length),s(),g("ngIf",n.loading()),s(),g("ngIf",n.error()),s(),g("ngIf",!n.loading()&&!n.error()&&(((o=n.groups())==null?null:o.length)??0)===0),s(2),g("ngForOf",n.groups())}},dependencies:[V,J,F],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;overflow:hidden}.head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:.6rem .85rem;border-bottom:1px solid var(--border-soft);background:color-mix(in oklab,var(--bg-surface) 92%,transparent)}.title[_ngcontent-%COMP%]{font-weight:600;font-size:13px}.meta[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted)}.empty[_ngcontent-%COMP%]{padding:1rem .85rem;color:var(--fg-muted);font-size:12px}.empty.error[_ngcontent-%COMP%]{color:var(--danger)}.groups[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;overflow-y:auto;flex:1}.group[_ngcontent-%COMP%]{border-bottom:1px solid var(--border-soft);transition:background .12s}.group.expanded[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 5%,transparent)}.group-head[_ngcontent-%COMP%]{width:100%;display:flex;align-items:center;gap:.5rem;padding:.58rem .85rem;background:transparent;border:0;color:var(--fg-primary);cursor:pointer;text-align:left}.group-head[_ngcontent-%COMP%]:hover{background:color-mix(in oklab,var(--bg-hover) 72%,transparent)}.caret[_ngcontent-%COMP%]{display:inline-block;width:10px;transition:transform .15s ease;color:var(--fg-muted)}.caret.open[_ngcontent-%COMP%]{transform:rotate(90deg)}.badge[_ngcontent-%COMP%]{font-size:10px;letter-spacing:.04em;padding:1px 6px;border-radius:999px;background:var(--bg-surface-2);color:var(--fg-secondary);text-transform:uppercase}.badge.src-merge[_ngcontent-%COMP%]{background:#6366f12e;color:var(--accent)}.badge.src-squash[_ngcontent-%COMP%]{background:#10b9812e;color:#10b981}.badge.src-conventional[_ngcontent-%COMP%]{background:#f59e0b2e;color:#d97706}.pr[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted)}.g-title[_ngcontent-%COMP%]{flex:1;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.count[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted);background:var(--bg-surface-2);border:1px solid var(--border-soft);padding:1px 6px;border-radius:999px}.commits[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0 0 .4rem;background:color-mix(in oklab,var(--bg-surface-2) 72%,transparent)}.commit[_ngcontent-%COMP%]{display:flex;gap:.6rem;align-items:center;padding:.34rem .85rem .34rem 2rem;cursor:pointer;font-size:12px}.commit[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.commit.selected[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 18%,transparent);box-shadow:inset 3px 0 0 var(--accent)}.commit[_ngcontent-%COMP%] .hash[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);font-size:11px;color:var(--fg-muted)}.commit[_ngcontent-%COMP%] .subject[_ngcontent-%COMP%]{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}"],changeDetection:0})};function ji(i,t){i&1&&(Te(0),w(1,"app-grouped-list"),ze())}function Hi(i,t){i&1&&w(0,"app-commit-list")}var En=class i{state=u(q);static \u0275fac=function(e){return new(e||i)};static \u0275cmp=E({type:i,selectors:[["app-home-shell"]],decls:11,vars:2,consts:[["flat",""],[1,"layout"],[1,"pane","graph"],[1,"pane","list"],[1,"pane-shell"],[4,"ngIf","ngIfElse"],[1,"pane","detail"],[1,"pane-shell","detail-shell"]],template:function(e,n){if(e&1&&(l(0,"main",1)(1,"aside",2),w(2,"app-commit-graph"),a(),l(3,"section",3)(4,"div",4),x(5,ji,2,0,"ng-container",5)(6,Hi,1,0,"ng-template",null,0,Ne),a()(),l(8,"section",6)(9,"div",7),w(10,"app-commit-detail"),a()()()),e&2){let r=Fe(7);s(5),g("ngIf",n.state.viewMode()==="grouped")("ngIfElse",r)}},dependencies:[V,F,$e,Ze,He,Ke],styles:["[_nghost-%COMP%]{display:block;flex:1;min-height:0}.layout[_ngcontent-%COMP%]{height:100%;display:grid;grid-template-columns:minmax(240px,320px) minmax(340px,430px) minmax(0,1fr);gap:.75rem;padding:.75rem;min-height:0;background:transparent}.pane[_ngcontent-%COMP%]{min-width:0;min-height:0;overflow:hidden;border-radius:var(--radius-lg);background:var(--bg-panel);border:1px solid color-mix(in oklab,var(--border-soft) 86%,transparent);box-shadow:var(--shadow-md)}.pane.graph[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--bg-panel) 86%,transparent)}.pane-shell[_ngcontent-%COMP%]{height:100%;min-height:0;overflow:hidden;border-radius:inherit}.detail-shell[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--bg-surface) 82%,transparent)}@media (max-width: 1100px){.layout[_ngcontent-%COMP%]{grid-template-columns:320px 1fr}.pane.graph[_ngcontent-%COMP%]{display:none}}@media (max-width: 720px){.layout[_ngcontent-%COMP%]{grid-template-columns:1fr}.pane.list[_ngcontent-%COMP%]{display:none}}"],changeDetection:0})};export{En as HomeShellComponent};
@@ -1 +1 @@
1
- import{Rb as g,W as i,a as l,b as d,oa as e}from"./chunk-OBPR2XVH.js";var u=class a{filters=e({page:1,pageSize:100});commits=e([]);total=e(0);page=e(1);pageSize=e(100);loading=e(!1);error=e(null);authors=e([]);branches=e([]);tags=e([]);selectedHash=e(null);selected=g(()=>{let t=this.selectedHash();return t?this.commits().find(n=>n.hash===t)??null:null});paletteOpen=e(!1);shortcutsOpen=e(!1);graphVisible=e(!0);viewMode=e("flat");searchMode=e("classic");nlInterpretation=e(null);patchFilters(t){this.filters.update(n=>d(l(l({},n),t),{page:t.page??1}))}selectHash(t){this.selectedHash.set(t)}selectByOffset(t){let n=this.commits();if(n.length===0)return;let s=this.selectedHash(),r=s?n.findIndex(m=>m.hash===s):-1,o=r===-1?t>0?0:n.length-1:r+t;o=Math.max(0,Math.min(n.length-1,o)),this.selectedHash.set(n[o].hash)}static \u0275fac=function(n){return new(n||a)};static \u0275prov=i({token:a,factory:a.\u0275fac,providedIn:"root"})};export{u as a};
1
+ import{W as i,a as l,b as d,bc as g,oa as e}from"./chunk-QH2BEUIU.js";var u=class a{filters=e({page:1,pageSize:100});commits=e([]);total=e(0);page=e(1);pageSize=e(100);loading=e(!1);error=e(null);authors=e([]);branches=e([]);tags=e([]);selectedHash=e(null);selected=g(()=>{let t=this.selectedHash();return t?this.commits().find(n=>n.hash===t)??null:null});paletteOpen=e(!1);shortcutsOpen=e(!1);graphVisible=e(!0);viewMode=e("flat");searchMode=e("classic");nlInterpretation=e(null);patchFilters(t){this.filters.update(n=>d(l(l({},n),t),{page:t.page??1}))}selectHash(t){this.selectedHash.set(t)}selectByOffset(t){let n=this.commits();if(n.length===0)return;let s=this.selectedHash(),r=s?n.findIndex(m=>m.hash===s):-1,o=r===-1?t>0?0:n.length-1:r+t;o=Math.max(0,Math.min(n.length-1,o)),this.selectedHash.set(n[o].hash)}static \u0275fac=function(n){return new(n||a)};static \u0275prov=i({token:a,factory:a.\u0275fac,providedIn:"root"})};export{u as a};
@@ -1 +1 @@
1
- import{$ as a,W as n,lc as r,mc as m}from"./chunk-OBPR2XVH.js";var o=class s{http=a(m);base="/api";bundle(t={}){let i=new r;for(let[p,e]of Object.entries(t))e!=null&&(i=i.set(p,String(e)));return this.http.get(`${this.base}/insights`,{params:i})}fileStats(t){let i=new r().set("file",t);return this.http.get(`${this.base}/file-stats`,{params:i})}impact(t){return this.http.get(`${this.base}/impact/${t}`)}summarizeDiff(t){return this.http.post(`${this.base}/summarize-diff`,{text:t})}explainCommit(t){return this.http.post(`${this.base}/explain-commit/${t}`,{})}static \u0275fac=function(i){return new(i||s)};static \u0275prov=n({token:s,factory:s.\u0275fac,providedIn:"root"})};export{o as a};
1
+ import{$ as a,W as n,xc as r,yc as m}from"./chunk-QH2BEUIU.js";var o=class s{http=a(m);base="/api";bundle(t={}){let i=new r;for(let[p,e]of Object.entries(t))e!=null&&(i=i.set(p,String(e)));return this.http.get(`${this.base}/insights`,{params:i})}fileStats(t){let i=new r().set("file",t);return this.http.get(`${this.base}/file-stats`,{params:i})}impact(t){return this.http.get(`${this.base}/impact/${t}`)}summarizeDiff(t){return this.http.post(`${this.base}/summarize-diff`,{text:t})}explainCommit(t){return this.http.post(`${this.base}/explain-commit/${t}`,{})}static \u0275fac=function(i){return new(i||s)};static \u0275prov=n({token:s,factory:s.\u0275fac,providedIn:"root"})};export{o as a};
@@ -1 +1 @@
1
- import{$ as N,$a as se,A as ee,Ib as m,Ka as D,La as a,Qa as L,Qb as f,Ra as u,Rb as P,Sa as h,V as g,Va as x,Vb as W,X as H,Xa as ie,Yb as ae,Z as p,Za as re,Zb as $,a as l,b as d,j as K,la as te,nb as b,oa as O,p as J,sa as ne,ta as C,u as Q,va as V,xb as oe}from"./chunk-OBPR2XVH.js";var me=(()=>{class n{_renderer;_elementRef;onChange=t=>{};onTouched=()=>{};constructor(t,i){this._renderer=t,this._elementRef=i}setProperty(t,i){this._renderer.setProperty(this._elementRef.nativeElement,t,i)}registerOnTouched(t){this.onTouched=t}registerOnChange(t){this.onChange=t}setDisabledState(t){this.setProperty("disabled",t)}static \u0275fac=function(i){return new(i||n)(a(D),a(V))};static \u0275dir=u({type:n})}return n})(),T=(()=>{class n extends me{static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,features:[h]})}return n})(),I=new p("");var Se={provide:I,useExisting:g(()=>_e),multi:!0};function Ne(){let n=$()?$().getUserAgent():"";return/android (\d+)/.test(n.toLowerCase())}var Oe=new p(""),_e=(()=>{class n extends me{_compositionMode;_composing=!1;constructor(t,i,r){super(t,i),this._compositionMode=r,this._compositionMode==null&&(this._compositionMode=!Ne())}writeValue(t){let i=t??"";this.setProperty("value",i)}_handleInput(t){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(t)}_compositionStart(){this._composing=!0}_compositionEnd(t){this._composing=!1,this._compositionMode&&this.onChange(t)}static \u0275fac=function(i){return new(i||n)(a(D),a(V),a(Oe,8))};static \u0275dir=u({type:n,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,r){i&1&&b("input",function(o){return r._handleInput(o.target.value)})("blur",function(){return r.onTouched()})("compositionstart",function(){return r._compositionStart()})("compositionend",function(o){return r._compositionEnd(o.target.value)})},standalone:!1,features:[m([Se]),h]})}return n})();var xe=new p(""),Pe=new p("");function ve(n){return n!=null}function ye(n){return re(n)?J(n):n}function Ce(n){let e={};return n.forEach(t=>{e=t!=null?l(l({},e),t):e}),Object.keys(e).length===0?null:e}function Ve(n,e){return e.map(t=>t(n))}function Re(n){return!n.validate}function De(n){return n.map(e=>Re(e)?e:t=>e.validate(t))}function ke(n){if(!n)return null;let e=n.filter(ve);return e.length==0?null:function(t){return Ce(Ve(t,e))}}function be(n){return n!=null?ke(De(n)):null}function je(n){if(!n)return null;let e=n.filter(ve);return e.length==0?null:function(t){let i=Ve(t,e).map(ye);return ee(i).pipe(Q(Ce))}}function Ae(n){return n!=null?je(De(n)):null}function le(n,e){return n===null?[e]:Array.isArray(n)?[...n,e]:[n,e]}function Ge(n){return n._rawValidators}function Te(n){return n._rawAsyncValidators}function q(n){return n?Array.isArray(n)?n:[n]:[]}function k(n,e){return Array.isArray(n)?n.includes(e):n===e}function ue(n,e){let t=q(e);return q(n).forEach(r=>{k(t,r)||t.push(r)}),t}function de(n,e){return q(e).filter(t=>!k(n,t))}var j=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=be(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=Ae(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control&&this.control.reset(e)}hasError(e,t){return this.control?this.control.hasError(e,t):!1}getError(e,t){return this.control?this.control.getError(e,t):null}},z=class extends j{name;get formDirective(){return null}get path(){return null}},F=class extends j{_parent=null;name=null;valueAccessor=null},Z=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}},Be={"[class.ng-untouched]":"isUntouched","[class.ng-touched]":"isTouched","[class.ng-pristine]":"isPristine","[class.ng-dirty]":"isDirty","[class.ng-valid]":"isValid","[class.ng-invalid]":"isInvalid","[class.ng-pending]":"isPending"},Ot=d(l({},Be),{"[class.ng-submitted]":"isSubmitted"}),xt=(()=>{class n extends Z{constructor(t){super(t)}static \u0275fac=function(i){return new(i||n)(a(F,2))};static \u0275dir=u({type:n,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,r){i&2&&oe("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)},standalone:!1,features:[h]})}return n})();var A="VALID",R="INVALID",_="PENDING",M="DISABLED",y=class{},G=class extends y{value;source;constructor(e,t){super(),this.value=e,this.source=t}},E=class extends y{pristine;source;constructor(e,t){super(),this.pristine=e,this.source=t}},w=class extends y{touched;source;constructor(e,t){super(),this.touched=e,this.source=t}},v=class extends y{status;source;constructor(e,t){super(),this.status=e,this.source=t}};function Ue(n){return(B(n)?n.validators:n)||null}function He(n){return Array.isArray(n)?be(n):n||null}function Le(n,e){return(B(e)?e.asyncValidators:n)||null}function We(n){return Array.isArray(n)?Ae(n):n||null}function B(n){return n!=null&&!Array.isArray(n)&&typeof n=="object"}var X=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,t){this._assignValidators(e),this._assignAsyncValidators(t)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return f(this.statusReactive)}set status(e){f(()=>this.statusReactive.set(e))}_status=P(()=>this.statusReactive());statusReactive=O(void 0);get valid(){return this.status===A}get invalid(){return this.status===R}get pending(){return this.status==_}get disabled(){return this.status===M}get enabled(){return this.status!==M}errors;get pristine(){return f(this.pristineReactive)}set pristine(e){f(()=>this.pristineReactive.set(e))}_pristine=P(()=>this.pristineReactive());pristineReactive=O(!0);get dirty(){return!this.pristine}get touched(){return f(this.touchedReactive)}set touched(e){f(()=>this.touchedReactive.set(e))}_touched=P(()=>this.touchedReactive());touchedReactive=O(!1);get untouched(){return!this.touched}_events=new K;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(ue(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(ue(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(de(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(de(e,this._rawAsyncValidators))}hasValidator(e){return k(this._rawValidators,e)}hasAsyncValidator(e){return k(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let t=this.touched===!1;this.touched=!0;let i=e.sourceControl??this;this._parent&&!e.onlySelf&&this._parent.markAsTouched(d(l({},e),{sourceControl:i})),t&&e.emitEvent!==!1&&this._events.next(new w(!0,i))}markAllAsDirty(e={}){this.markAsDirty({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(t=>t.markAllAsDirty(e))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(t=>t.markAllAsTouched(e))}markAsUntouched(e={}){let t=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let i=e.sourceControl??this;this._forEachChild(r=>{r.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:i})}),this._parent&&!e.onlySelf&&this._parent._updateTouched(e,i),t&&e.emitEvent!==!1&&this._events.next(new w(!1,i))}markAsDirty(e={}){let t=this.pristine===!0;this.pristine=!1;let i=e.sourceControl??this;this._parent&&!e.onlySelf&&this._parent.markAsDirty(d(l({},e),{sourceControl:i})),t&&e.emitEvent!==!1&&this._events.next(new E(!1,i))}markAsPristine(e={}){let t=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let i=e.sourceControl??this;this._forEachChild(r=>{r.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),this._parent&&!e.onlySelf&&this._parent._updatePristine(e,i),t&&e.emitEvent!==!1&&this._events.next(new E(!0,i))}markAsPending(e={}){this.status=_;let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new v(this.status,t)),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.markAsPending(d(l({},e),{sourceControl:t}))}disable(e={}){let t=this._parentMarkedDirty(e.onlySelf);this.status=M,this.errors=null,this._forEachChild(r=>{r.disable(d(l({},e),{onlySelf:!0}))}),this._updateValue();let i=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new G(this.value,i)),this._events.next(new v(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(d(l({},e),{skipPristineCheck:t}),this),this._onDisabledChange.forEach(r=>r(!0))}enable(e={}){let t=this._parentMarkedDirty(e.onlySelf);this.status=A,this._forEachChild(i=>{i.enable(d(l({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(d(l({},e),{skipPristineCheck:t}),this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(e,t){this._parent&&!e.onlySelf&&(this._parent.updateValueAndValidity(e),e.skipPristineCheck||this._parent._updatePristine({},t),this._parent._updateTouched({},t))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===A||this.status===_)&&this._runAsyncValidator(i,e.emitEvent)}let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new G(this.value,t)),this._events.next(new v(this.status,t)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.updateValueAndValidity(d(l({},e),{sourceControl:t}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(t=>t._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?M:A}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,t){if(this.asyncValidator){this.status=_,this._hasOwnPendingAsyncValidator={emitEvent:t!==!1,shouldHaveEmitted:e!==!1};let i=ye(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(r=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(r,{emitEvent:t,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=(this._hasOwnPendingAsyncValidator?.emitEvent||this._hasOwnPendingAsyncValidator?.shouldHaveEmitted)??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,t={}){this.errors=e,this._updateControlsErrors(t.emitEvent!==!1,this,t.shouldHaveEmitted)}get(e){let t=e;return t==null||(Array.isArray(t)||(t=t.split(".")),t.length===0)?null:t.reduce((i,r)=>i&&i._find(r),this)}getError(e,t){let i=t?this.get(t):this;return i&&i.errors?i.errors[e]:null}hasError(e,t){return!!this.getError(e,t)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,t,i){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||i)&&this._events.next(new v(this.status,t)),this._parent&&this._parent._updateControlsErrors(e,t,i)}_initObservables(){this.valueChanges=new x,this.statusChanges=new x}_calculateStatus(){return this._allControlsDisabled()?M:this.errors?R:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(_)?_:this._anyControlsHaveStatus(R)?R:A}_anyControlsHaveStatus(e){return this._anyControls(t=>t.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,t){let i=!this._anyControlsDirty(),r=this.pristine!==i;this.pristine=i,this._parent&&!e.onlySelf&&this._parent._updatePristine(e,t),r&&this._events.next(new E(this.pristine,t))}_updateTouched(e={},t){this.touched=this._anyControlsTouched(),this._events.next(new w(this.touched,t)),this._parent&&!e.onlySelf&&this._parent._updateTouched(e,t)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){B(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){let t=this._parent&&this._parent.dirty;return!e&&!!t&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=He(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=We(this._rawAsyncValidators)}};var Me=new p("",{providedIn:"root",factory:()=>Y}),Y="always";function $e(n,e){return[...e.path,n]}function qe(n,e,t=Y){Ze(n,e),e.valueAccessor.writeValue(n.value),(n.disabled||t==="always")&&e.valueAccessor.setDisabledState?.(n.disabled),Xe(n,e),Ke(n,e),Ye(n,e),ze(n,e)}function ce(n,e){n.forEach(t=>{t.registerOnValidatorChange&&t.registerOnValidatorChange(e)})}function ze(n,e){if(e.valueAccessor.setDisabledState){let t=i=>{e.valueAccessor.setDisabledState(i)};n.registerOnDisabledChange(t),e._registerOnDestroy(()=>{n._unregisterOnDisabledChange(t)})}}function Ze(n,e){let t=Ge(n);e.validator!==null?n.setValidators(le(t,e.validator)):typeof t=="function"&&n.setValidators([t]);let i=Te(n);e.asyncValidator!==null?n.setAsyncValidators(le(i,e.asyncValidator)):typeof i=="function"&&n.setAsyncValidators([i]);let r=()=>n.updateValueAndValidity();ce(e._rawValidators,r),ce(e._rawAsyncValidators,r)}function Xe(n,e){e.valueAccessor.registerOnChange(t=>{n._pendingValue=t,n._pendingChange=!0,n._pendingDirty=!0,n.updateOn==="change"&&Ee(n,e)})}function Ye(n,e){e.valueAccessor.registerOnTouched(()=>{n._pendingTouched=!0,n.updateOn==="blur"&&n._pendingChange&&Ee(n,e),n.updateOn!=="submit"&&n.markAsTouched()})}function Ee(n,e){n._pendingDirty&&n.markAsDirty(),n.setValue(n._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(n._pendingValue),n._pendingChange=!1}function Ke(n,e){let t=(i,r)=>{e.valueAccessor.writeValue(i),r&&e.viewToModelUpdate(i)};n.registerOnChange(t),e._registerOnDestroy(()=>{n._unregisterOnChange(t)})}function Je(n,e){if(!n.hasOwnProperty("model"))return!1;let t=n.model;return t.isFirstChange()?!0:!Object.is(e,t.currentValue)}function Qe(n){return Object.getPrototypeOf(n.constructor)===T}function et(n,e){if(!e)return null;Array.isArray(e);let t,i,r;return e.forEach(s=>{s.constructor===_e?t=s:Qe(s)?i=s:r=s}),r||i||t||null}function he(n,e){let t=n.indexOf(e);t>-1&&n.splice(t,1)}function fe(n){return typeof n=="object"&&n!==null&&Object.keys(n).length===2&&"value"in n&&"disabled"in n}var tt=class extends X{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,t,i){super(Ue(t),Le(i,t)),this._applyFormState(e),this._setUpdateStrategy(t),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),B(t)&&(t.nonNullable||t.initialValueIsDefault)&&(fe(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,t={}){this.value=this._pendingValue=e,this._onChange.length&&t.emitModelToViewChange!==!1&&this._onChange.forEach(i=>i(this.value,t.emitViewToModelChange!==!1)),this.updateValueAndValidity(t)}patchValue(e,t={}){this.setValue(e,t)}reset(e=this.defaultValue,t={}){this._applyFormState(e),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),this._pendingChange=!1}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){he(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){he(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){fe(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var nt={provide:F,useExisting:g(()=>it)},ge=Promise.resolve(),it=(()=>{class n extends F{_changeDetectorRef;callSetDisabledState;control=new tt;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new x;constructor(t,i,r,s,o,c){super(),this._changeDetectorRef=o,this.callSetDisabledState=c,this._parent=t,this._setValidators(i),this._setAsyncValidators(r),this.valueAccessor=et(this,s)}ngOnChanges(t){if(this._checkForErrors(),!this._registered||"name"in t){if(this._registered&&(this._checkName(),this.formDirective)){let i=t.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in t&&this._updateDisabled(t),Je(t,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(t){this.viewModel=t,this.update.emit(t)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){qe(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(t){ge.then(()=>{this.control.setValue(t,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(t){let i=t.isDisabled.currentValue,r=i!==0&&ae(i);ge.then(()=>{r&&!this.control.disabled?this.control.disable():!r&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(t){return this._parent?$e(t,this._parent):[t]}static \u0275fac=function(i){return new(i||n)(a(z,9),a(xe,10),a(Pe,10),a(I,10),a(W,8),a(Me,8))};static \u0275dir=u({type:n,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[m([nt]),h,ne]})}return n})();var rt={provide:I,useExisting:g(()=>st),multi:!0},st=(()=>{class n extends T{writeValue(t){this.setProperty("value",parseFloat(t))}registerOnChange(t){this.onChange=i=>{t(i==""?null:parseFloat(i))}}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["input","type","range","formControlName",""],["input","type","range","formControl",""],["input","type","range","ngModel",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target.value)})("input",function(o){return r.onChange(o.target.value)})("blur",function(){return r.onTouched()})},standalone:!1,features:[m([rt]),h]})}return n})();var ot={provide:I,useExisting:g(()=>Fe),multi:!0};function we(n,e){return n==null?`${e}`:(e&&typeof e=="object"&&(e="Object"),`${n}: ${e}`.slice(0,50))}function at(n){return n.split(":")[0]}var Fe=(()=>{class n extends T{value;_optionMap=new Map;_idCounter=0;set compareWith(t){this._compareWith=t}_compareWith=Object.is;appRefInjector=N(se).injector;destroyRef=N(te);cdr=N(W);_queuedWrite=!1;_writeValueAfterRender(){this._queuedWrite||this.appRefInjector.destroyed||(this._queuedWrite=!0,ie({write:()=>{this.destroyRef.destroyed||(this._queuedWrite=!1,this.writeValue(this.value))}},{injector:this.appRefInjector}))}writeValue(t){this.cdr.markForCheck(),this.value=t;let i=this._getOptionId(t),r=we(i,t);this.setProperty("value",r)}registerOnChange(t){this.onChange=i=>{this.value=this._getOptionValue(i),t(this.value)}}_registerOption(){return(this._idCounter++).toString()}_getOptionId(t){for(let i of this._optionMap.keys())if(this._compareWith(this._optionMap.get(i),t))return i;return null}_getOptionValue(t){let i=at(t);return this._optionMap.has(i)?this._optionMap.get(i):t}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["select","formControlName","",3,"multiple",""],["select","formControl","",3,"multiple",""],["select","ngModel","",3,"multiple",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target.value)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},standalone:!1,features:[m([ot]),h]})}return n})(),Rt=(()=>{class n{_element;_renderer;_select;id;constructor(t,i,r){this._element=t,this._renderer=i,this._select=r,this._select&&(this.id=this._select._registerOption())}set ngValue(t){this._select!=null&&(this._select._optionMap.set(this.id,t),this._setElementValue(we(this.id,t)),this._select._writeValueAfterRender())}set value(t){this._setElementValue(t),this._select&&this._select._writeValueAfterRender()}_setElementValue(t){this._renderer.setProperty(this._element.nativeElement,"value",t)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select._writeValueAfterRender())}static \u0275fac=function(i){return new(i||n)(a(V),a(D),a(Fe,9))};static \u0275dir=u({type:n,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"},standalone:!1})}return n})(),lt={provide:I,useExisting:g(()=>Ie),multi:!0};function pe(n,e){return n==null?`${e}`:(typeof e=="string"&&(e=`'${e}'`),e&&typeof e=="object"&&(e="Object"),`${n}: ${e}`.slice(0,50))}function ut(n){return n.split(":")[0]}var Ie=(()=>{class n extends T{value;_optionMap=new Map;_idCounter=0;set compareWith(t){this._compareWith=t}_compareWith=Object.is;writeValue(t){this.value=t;let i;if(Array.isArray(t)){let r=t.map(s=>this._getOptionId(s));i=(s,o)=>{s._setSelected(r.indexOf(o.toString())>-1)}}else i=(r,s)=>{r._setSelected(!1)};this._optionMap.forEach(i)}registerOnChange(t){this.onChange=i=>{let r=[],s=i.selectedOptions;if(s!==void 0){let o=s;for(let c=0;c<o.length;c++){let S=o[c],U=this._getOptionValue(S.value);r.push(U)}}else{let o=i.options;for(let c=0;c<o.length;c++){let S=o[c];if(S.selected){let U=this._getOptionValue(S.value);r.push(U)}}}this.value=r,t(r)}}_registerOption(t){let i=(this._idCounter++).toString();return this._optionMap.set(i,t),i}_getOptionId(t){for(let i of this._optionMap.keys())if(this._compareWith(this._optionMap.get(i)._value,t))return i;return null}_getOptionValue(t){let i=ut(t);return this._optionMap.has(i)?this._optionMap.get(i)._value:t}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["select","multiple","","formControlName",""],["select","multiple","","formControl",""],["select","multiple","","ngModel",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},standalone:!1,features:[m([lt]),h]})}return n})(),kt=(()=>{class n{_element;_renderer;_select;id;_value;constructor(t,i,r){this._element=t,this._renderer=i,this._select=r,this._select&&(this.id=this._select._registerOption(this))}set ngValue(t){this._select!=null&&(this._value=t,this._setElementValue(pe(this.id,t)),this._select.writeValue(this._select.value))}set value(t){this._select?(this._value=t,this._setElementValue(pe(this.id,t)),this._select.writeValue(this._select.value)):this._setElementValue(t)}_setElementValue(t){this._renderer.setProperty(this._element.nativeElement,"value",t)}_setSelected(t){this._renderer.setProperty(this._element.nativeElement,"selected",t)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}static \u0275fac=function(i){return new(i||n)(a(V),a(D),a(Ie,9))};static \u0275dir=u({type:n,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"},standalone:!1})}return n})();var dt=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=L({type:n});static \u0275inj=H({})}return n})();var jt=(()=>{class n{static withConfig(t){return{ngModule:n,providers:[{provide:Me,useValue:t.callSetDisabledState??Y}]}}static \u0275fac=function(i){return new(i||n)};static \u0275mod=L({type:n});static \u0275inj=H({imports:[dt]})}return n})();export{_e as a,xt as b,it as c,st as d,Fe as e,Rt as f,kt as g,jt as h};
1
+ import{$ as N,$a as u,A as ee,Ib as oe,Tb as m,Ua as D,V as g,Va as a,X as H,Z as p,_a as L,a as l,ac as f,b as d,bb as h,bc as P,eb as x,fc as W,gb as ie,ib as re,ic as ae,j as K,jc as $,kb as se,la as te,oa as O,p as J,sa as ne,ta as C,u as Q,va as V,yb as b}from"./chunk-QH2BEUIU.js";var me=(()=>{class n{_renderer;_elementRef;onChange=t=>{};onTouched=()=>{};constructor(t,i){this._renderer=t,this._elementRef=i}setProperty(t,i){this._renderer.setProperty(this._elementRef.nativeElement,t,i)}registerOnTouched(t){this.onTouched=t}registerOnChange(t){this.onChange=t}setDisabledState(t){this.setProperty("disabled",t)}static \u0275fac=function(i){return new(i||n)(a(D),a(V))};static \u0275dir=u({type:n})}return n})(),T=(()=>{class n extends me{static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,features:[h]})}return n})(),I=new p("");var Se={provide:I,useExisting:g(()=>_e),multi:!0};function Ne(){let n=$()?$().getUserAgent():"";return/android (\d+)/.test(n.toLowerCase())}var Oe=new p(""),_e=(()=>{class n extends me{_compositionMode;_composing=!1;constructor(t,i,r){super(t,i),this._compositionMode=r,this._compositionMode==null&&(this._compositionMode=!Ne())}writeValue(t){let i=t??"";this.setProperty("value",i)}_handleInput(t){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(t)}_compositionStart(){this._composing=!0}_compositionEnd(t){this._composing=!1,this._compositionMode&&this.onChange(t)}static \u0275fac=function(i){return new(i||n)(a(D),a(V),a(Oe,8))};static \u0275dir=u({type:n,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,r){i&1&&b("input",function(o){return r._handleInput(o.target.value)})("blur",function(){return r.onTouched()})("compositionstart",function(){return r._compositionStart()})("compositionend",function(o){return r._compositionEnd(o.target.value)})},standalone:!1,features:[m([Se]),h]})}return n})();var xe=new p(""),Pe=new p("");function ve(n){return n!=null}function ye(n){return re(n)?J(n):n}function Ce(n){let e={};return n.forEach(t=>{e=t!=null?l(l({},e),t):e}),Object.keys(e).length===0?null:e}function Ve(n,e){return e.map(t=>t(n))}function Re(n){return!n.validate}function De(n){return n.map(e=>Re(e)?e:t=>e.validate(t))}function ke(n){if(!n)return null;let e=n.filter(ve);return e.length==0?null:function(t){return Ce(Ve(t,e))}}function be(n){return n!=null?ke(De(n)):null}function je(n){if(!n)return null;let e=n.filter(ve);return e.length==0?null:function(t){let i=Ve(t,e).map(ye);return ee(i).pipe(Q(Ce))}}function Ae(n){return n!=null?je(De(n)):null}function le(n,e){return n===null?[e]:Array.isArray(n)?[...n,e]:[n,e]}function Ge(n){return n._rawValidators}function Te(n){return n._rawAsyncValidators}function q(n){return n?Array.isArray(n)?n:[n]:[]}function k(n,e){return Array.isArray(n)?n.includes(e):n===e}function ue(n,e){let t=q(e);return q(n).forEach(r=>{k(t,r)||t.push(r)}),t}function de(n,e){return q(e).filter(t=>!k(n,t))}var j=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=be(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=Ae(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control&&this.control.reset(e)}hasError(e,t){return this.control?this.control.hasError(e,t):!1}getError(e,t){return this.control?this.control.getError(e,t):null}},z=class extends j{name;get formDirective(){return null}get path(){return null}},F=class extends j{_parent=null;name=null;valueAccessor=null},Z=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}},Be={"[class.ng-untouched]":"isUntouched","[class.ng-touched]":"isTouched","[class.ng-pristine]":"isPristine","[class.ng-dirty]":"isDirty","[class.ng-valid]":"isValid","[class.ng-invalid]":"isInvalid","[class.ng-pending]":"isPending"},Ot=d(l({},Be),{"[class.ng-submitted]":"isSubmitted"}),xt=(()=>{class n extends Z{constructor(t){super(t)}static \u0275fac=function(i){return new(i||n)(a(F,2))};static \u0275dir=u({type:n,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,r){i&2&&oe("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)},standalone:!1,features:[h]})}return n})();var A="VALID",R="INVALID",_="PENDING",M="DISABLED",y=class{},G=class extends y{value;source;constructor(e,t){super(),this.value=e,this.source=t}},E=class extends y{pristine;source;constructor(e,t){super(),this.pristine=e,this.source=t}},w=class extends y{touched;source;constructor(e,t){super(),this.touched=e,this.source=t}},v=class extends y{status;source;constructor(e,t){super(),this.status=e,this.source=t}};function Ue(n){return(B(n)?n.validators:n)||null}function He(n){return Array.isArray(n)?be(n):n||null}function Le(n,e){return(B(e)?e.asyncValidators:n)||null}function We(n){return Array.isArray(n)?Ae(n):n||null}function B(n){return n!=null&&!Array.isArray(n)&&typeof n=="object"}var X=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,t){this._assignValidators(e),this._assignAsyncValidators(t)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return f(this.statusReactive)}set status(e){f(()=>this.statusReactive.set(e))}_status=P(()=>this.statusReactive());statusReactive=O(void 0);get valid(){return this.status===A}get invalid(){return this.status===R}get pending(){return this.status==_}get disabled(){return this.status===M}get enabled(){return this.status!==M}errors;get pristine(){return f(this.pristineReactive)}set pristine(e){f(()=>this.pristineReactive.set(e))}_pristine=P(()=>this.pristineReactive());pristineReactive=O(!0);get dirty(){return!this.pristine}get touched(){return f(this.touchedReactive)}set touched(e){f(()=>this.touchedReactive.set(e))}_touched=P(()=>this.touchedReactive());touchedReactive=O(!1);get untouched(){return!this.touched}_events=new K;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(ue(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(ue(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(de(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(de(e,this._rawAsyncValidators))}hasValidator(e){return k(this._rawValidators,e)}hasAsyncValidator(e){return k(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let t=this.touched===!1;this.touched=!0;let i=e.sourceControl??this;this._parent&&!e.onlySelf&&this._parent.markAsTouched(d(l({},e),{sourceControl:i})),t&&e.emitEvent!==!1&&this._events.next(new w(!0,i))}markAllAsDirty(e={}){this.markAsDirty({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(t=>t.markAllAsDirty(e))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(t=>t.markAllAsTouched(e))}markAsUntouched(e={}){let t=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let i=e.sourceControl??this;this._forEachChild(r=>{r.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:i})}),this._parent&&!e.onlySelf&&this._parent._updateTouched(e,i),t&&e.emitEvent!==!1&&this._events.next(new w(!1,i))}markAsDirty(e={}){let t=this.pristine===!0;this.pristine=!1;let i=e.sourceControl??this;this._parent&&!e.onlySelf&&this._parent.markAsDirty(d(l({},e),{sourceControl:i})),t&&e.emitEvent!==!1&&this._events.next(new E(!1,i))}markAsPristine(e={}){let t=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let i=e.sourceControl??this;this._forEachChild(r=>{r.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),this._parent&&!e.onlySelf&&this._parent._updatePristine(e,i),t&&e.emitEvent!==!1&&this._events.next(new E(!0,i))}markAsPending(e={}){this.status=_;let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new v(this.status,t)),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.markAsPending(d(l({},e),{sourceControl:t}))}disable(e={}){let t=this._parentMarkedDirty(e.onlySelf);this.status=M,this.errors=null,this._forEachChild(r=>{r.disable(d(l({},e),{onlySelf:!0}))}),this._updateValue();let i=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new G(this.value,i)),this._events.next(new v(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(d(l({},e),{skipPristineCheck:t}),this),this._onDisabledChange.forEach(r=>r(!0))}enable(e={}){let t=this._parentMarkedDirty(e.onlySelf);this.status=A,this._forEachChild(i=>{i.enable(d(l({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(d(l({},e),{skipPristineCheck:t}),this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(e,t){this._parent&&!e.onlySelf&&(this._parent.updateValueAndValidity(e),e.skipPristineCheck||this._parent._updatePristine({},t),this._parent._updateTouched({},t))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===A||this.status===_)&&this._runAsyncValidator(i,e.emitEvent)}let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new G(this.value,t)),this._events.next(new v(this.status,t)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.updateValueAndValidity(d(l({},e),{sourceControl:t}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(t=>t._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?M:A}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,t){if(this.asyncValidator){this.status=_,this._hasOwnPendingAsyncValidator={emitEvent:t!==!1,shouldHaveEmitted:e!==!1};let i=ye(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(r=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(r,{emitEvent:t,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=(this._hasOwnPendingAsyncValidator?.emitEvent||this._hasOwnPendingAsyncValidator?.shouldHaveEmitted)??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,t={}){this.errors=e,this._updateControlsErrors(t.emitEvent!==!1,this,t.shouldHaveEmitted)}get(e){let t=e;return t==null||(Array.isArray(t)||(t=t.split(".")),t.length===0)?null:t.reduce((i,r)=>i&&i._find(r),this)}getError(e,t){let i=t?this.get(t):this;return i&&i.errors?i.errors[e]:null}hasError(e,t){return!!this.getError(e,t)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,t,i){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||i)&&this._events.next(new v(this.status,t)),this._parent&&this._parent._updateControlsErrors(e,t,i)}_initObservables(){this.valueChanges=new x,this.statusChanges=new x}_calculateStatus(){return this._allControlsDisabled()?M:this.errors?R:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(_)?_:this._anyControlsHaveStatus(R)?R:A}_anyControlsHaveStatus(e){return this._anyControls(t=>t.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,t){let i=!this._anyControlsDirty(),r=this.pristine!==i;this.pristine=i,this._parent&&!e.onlySelf&&this._parent._updatePristine(e,t),r&&this._events.next(new E(this.pristine,t))}_updateTouched(e={},t){this.touched=this._anyControlsTouched(),this._events.next(new w(this.touched,t)),this._parent&&!e.onlySelf&&this._parent._updateTouched(e,t)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){B(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){let t=this._parent&&this._parent.dirty;return!e&&!!t&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=He(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=We(this._rawAsyncValidators)}};var Me=new p("",{providedIn:"root",factory:()=>Y}),Y="always";function $e(n,e){return[...e.path,n]}function qe(n,e,t=Y){Ze(n,e),e.valueAccessor.writeValue(n.value),(n.disabled||t==="always")&&e.valueAccessor.setDisabledState?.(n.disabled),Xe(n,e),Ke(n,e),Ye(n,e),ze(n,e)}function ce(n,e){n.forEach(t=>{t.registerOnValidatorChange&&t.registerOnValidatorChange(e)})}function ze(n,e){if(e.valueAccessor.setDisabledState){let t=i=>{e.valueAccessor.setDisabledState(i)};n.registerOnDisabledChange(t),e._registerOnDestroy(()=>{n._unregisterOnDisabledChange(t)})}}function Ze(n,e){let t=Ge(n);e.validator!==null?n.setValidators(le(t,e.validator)):typeof t=="function"&&n.setValidators([t]);let i=Te(n);e.asyncValidator!==null?n.setAsyncValidators(le(i,e.asyncValidator)):typeof i=="function"&&n.setAsyncValidators([i]);let r=()=>n.updateValueAndValidity();ce(e._rawValidators,r),ce(e._rawAsyncValidators,r)}function Xe(n,e){e.valueAccessor.registerOnChange(t=>{n._pendingValue=t,n._pendingChange=!0,n._pendingDirty=!0,n.updateOn==="change"&&Ee(n,e)})}function Ye(n,e){e.valueAccessor.registerOnTouched(()=>{n._pendingTouched=!0,n.updateOn==="blur"&&n._pendingChange&&Ee(n,e),n.updateOn!=="submit"&&n.markAsTouched()})}function Ee(n,e){n._pendingDirty&&n.markAsDirty(),n.setValue(n._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(n._pendingValue),n._pendingChange=!1}function Ke(n,e){let t=(i,r)=>{e.valueAccessor.writeValue(i),r&&e.viewToModelUpdate(i)};n.registerOnChange(t),e._registerOnDestroy(()=>{n._unregisterOnChange(t)})}function Je(n,e){if(!n.hasOwnProperty("model"))return!1;let t=n.model;return t.isFirstChange()?!0:!Object.is(e,t.currentValue)}function Qe(n){return Object.getPrototypeOf(n.constructor)===T}function et(n,e){if(!e)return null;Array.isArray(e);let t,i,r;return e.forEach(s=>{s.constructor===_e?t=s:Qe(s)?i=s:r=s}),r||i||t||null}function he(n,e){let t=n.indexOf(e);t>-1&&n.splice(t,1)}function fe(n){return typeof n=="object"&&n!==null&&Object.keys(n).length===2&&"value"in n&&"disabled"in n}var tt=class extends X{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,t,i){super(Ue(t),Le(i,t)),this._applyFormState(e),this._setUpdateStrategy(t),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),B(t)&&(t.nonNullable||t.initialValueIsDefault)&&(fe(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,t={}){this.value=this._pendingValue=e,this._onChange.length&&t.emitModelToViewChange!==!1&&this._onChange.forEach(i=>i(this.value,t.emitViewToModelChange!==!1)),this.updateValueAndValidity(t)}patchValue(e,t={}){this.setValue(e,t)}reset(e=this.defaultValue,t={}){this._applyFormState(e),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),this._pendingChange=!1}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){he(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){he(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){fe(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var nt={provide:F,useExisting:g(()=>it)},ge=Promise.resolve(),it=(()=>{class n extends F{_changeDetectorRef;callSetDisabledState;control=new tt;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new x;constructor(t,i,r,s,o,c){super(),this._changeDetectorRef=o,this.callSetDisabledState=c,this._parent=t,this._setValidators(i),this._setAsyncValidators(r),this.valueAccessor=et(this,s)}ngOnChanges(t){if(this._checkForErrors(),!this._registered||"name"in t){if(this._registered&&(this._checkName(),this.formDirective)){let i=t.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in t&&this._updateDisabled(t),Je(t,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(t){this.viewModel=t,this.update.emit(t)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){qe(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(t){ge.then(()=>{this.control.setValue(t,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(t){let i=t.isDisabled.currentValue,r=i!==0&&ae(i);ge.then(()=>{r&&!this.control.disabled?this.control.disable():!r&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(t){return this._parent?$e(t,this._parent):[t]}static \u0275fac=function(i){return new(i||n)(a(z,9),a(xe,10),a(Pe,10),a(I,10),a(W,8),a(Me,8))};static \u0275dir=u({type:n,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[m([nt]),h,ne]})}return n})();var rt={provide:I,useExisting:g(()=>st),multi:!0},st=(()=>{class n extends T{writeValue(t){this.setProperty("value",parseFloat(t))}registerOnChange(t){this.onChange=i=>{t(i==""?null:parseFloat(i))}}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["input","type","range","formControlName",""],["input","type","range","formControl",""],["input","type","range","ngModel",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target.value)})("input",function(o){return r.onChange(o.target.value)})("blur",function(){return r.onTouched()})},standalone:!1,features:[m([rt]),h]})}return n})();var ot={provide:I,useExisting:g(()=>Fe),multi:!0};function we(n,e){return n==null?`${e}`:(e&&typeof e=="object"&&(e="Object"),`${n}: ${e}`.slice(0,50))}function at(n){return n.split(":")[0]}var Fe=(()=>{class n extends T{value;_optionMap=new Map;_idCounter=0;set compareWith(t){this._compareWith=t}_compareWith=Object.is;appRefInjector=N(se).injector;destroyRef=N(te);cdr=N(W);_queuedWrite=!1;_writeValueAfterRender(){this._queuedWrite||this.appRefInjector.destroyed||(this._queuedWrite=!0,ie({write:()=>{this.destroyRef.destroyed||(this._queuedWrite=!1,this.writeValue(this.value))}},{injector:this.appRefInjector}))}writeValue(t){this.cdr.markForCheck(),this.value=t;let i=this._getOptionId(t),r=we(i,t);this.setProperty("value",r)}registerOnChange(t){this.onChange=i=>{this.value=this._getOptionValue(i),t(this.value)}}_registerOption(){return(this._idCounter++).toString()}_getOptionId(t){for(let i of this._optionMap.keys())if(this._compareWith(this._optionMap.get(i),t))return i;return null}_getOptionValue(t){let i=at(t);return this._optionMap.has(i)?this._optionMap.get(i):t}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["select","formControlName","",3,"multiple",""],["select","formControl","",3,"multiple",""],["select","ngModel","",3,"multiple",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target.value)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},standalone:!1,features:[m([ot]),h]})}return n})(),Rt=(()=>{class n{_element;_renderer;_select;id;constructor(t,i,r){this._element=t,this._renderer=i,this._select=r,this._select&&(this.id=this._select._registerOption())}set ngValue(t){this._select!=null&&(this._select._optionMap.set(this.id,t),this._setElementValue(we(this.id,t)),this._select._writeValueAfterRender())}set value(t){this._setElementValue(t),this._select&&this._select._writeValueAfterRender()}_setElementValue(t){this._renderer.setProperty(this._element.nativeElement,"value",t)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select._writeValueAfterRender())}static \u0275fac=function(i){return new(i||n)(a(V),a(D),a(Fe,9))};static \u0275dir=u({type:n,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"},standalone:!1})}return n})(),lt={provide:I,useExisting:g(()=>Ie),multi:!0};function pe(n,e){return n==null?`${e}`:(typeof e=="string"&&(e=`'${e}'`),e&&typeof e=="object"&&(e="Object"),`${n}: ${e}`.slice(0,50))}function ut(n){return n.split(":")[0]}var Ie=(()=>{class n extends T{value;_optionMap=new Map;_idCounter=0;set compareWith(t){this._compareWith=t}_compareWith=Object.is;writeValue(t){this.value=t;let i;if(Array.isArray(t)){let r=t.map(s=>this._getOptionId(s));i=(s,o)=>{s._setSelected(r.indexOf(o.toString())>-1)}}else i=(r,s)=>{r._setSelected(!1)};this._optionMap.forEach(i)}registerOnChange(t){this.onChange=i=>{let r=[],s=i.selectedOptions;if(s!==void 0){let o=s;for(let c=0;c<o.length;c++){let S=o[c],U=this._getOptionValue(S.value);r.push(U)}}else{let o=i.options;for(let c=0;c<o.length;c++){let S=o[c];if(S.selected){let U=this._getOptionValue(S.value);r.push(U)}}}this.value=r,t(r)}}_registerOption(t){let i=(this._idCounter++).toString();return this._optionMap.set(i,t),i}_getOptionId(t){for(let i of this._optionMap.keys())if(this._compareWith(this._optionMap.get(i)._value,t))return i;return null}_getOptionValue(t){let i=ut(t);return this._optionMap.has(i)?this._optionMap.get(i)._value:t}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["select","multiple","","formControlName",""],["select","multiple","","formControl",""],["select","multiple","","ngModel",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},standalone:!1,features:[m([lt]),h]})}return n})(),kt=(()=>{class n{_element;_renderer;_select;id;_value;constructor(t,i,r){this._element=t,this._renderer=i,this._select=r,this._select&&(this.id=this._select._registerOption(this))}set ngValue(t){this._select!=null&&(this._value=t,this._setElementValue(pe(this.id,t)),this._select.writeValue(this._select.value))}set value(t){this._select?(this._value=t,this._setElementValue(pe(this.id,t)),this._select.writeValue(this._select.value)):this._setElementValue(t)}_setElementValue(t){this._renderer.setProperty(this._element.nativeElement,"value",t)}_setSelected(t){this._renderer.setProperty(this._element.nativeElement,"selected",t)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}static \u0275fac=function(i){return new(i||n)(a(V),a(D),a(Ie,9))};static \u0275dir=u({type:n,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"},standalone:!1})}return n})();var dt=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=L({type:n});static \u0275inj=H({})}return n})();var jt=(()=>{class n{static withConfig(t){return{ngModule:n,providers:[{provide:Me,useValue:t.callSetDisabledState??Y}]}}static \u0275fac=function(i){return new(i||n)};static \u0275mod=L({type:n});static \u0275inj=H({imports:[dt]})}return n})();export{_e as a,xt as b,it as c,st as d,Fe as e,Rt as f,kt as g,jt as h};
@@ -0,0 +1,9 @@
1
+ import{a as St,b as Et,c as J,d as It,e as Tt,f as mt,g as F,h as zt,i as Dt,j as Rt,k as Ht,l as Vt,m as pt,n as $t,o as At,p as Ft,q as Nt,r as gt}from"./chunk-Y6GOUMAT.js";import{e as Ot}from"./chunk-V6G3DEZ6.js";import{a as Pt}from"./chunk-GBKH4M7W.js";import{$ as lt,Db as W,Eb as U,Fb as X,Hb as et,Ib as _t,Kb as r,Lb as h,Mb as I,Nb as nt,Qa as s,Vb as Y,Xb as dt,Yb as ct,Za as H,cb as O,cc as yt,ea as D,eb as Ct,fa as R,ga as K,ha as bt,lb as E,oa as j,ob as u,oc as kt,pb as i,pc as it,qb as n,qc as wt,rb as y,rc as Mt,sa as Z,sb as Q,sc as A,tb as q,ub as V,xb as tt,yb as $,zb as k}from"./chunk-QH2BEUIU.js";var Wt=["svg"],Ut=["tooltip"],rt=class a{data=[];height=200;svgRef;tooltipRef;hideTimer=null;ngAfterViewInit(){this.render()}ngOnChanges(){this.render()}ngOnDestroy(){this.hideTimer&&clearTimeout(this.hideTimer)}render(){if(!this.svgRef)return;let e=this.svgRef.nativeElement,t=this.tooltipRef?.nativeElement,c=e.clientWidth||600,o={top:14,right:46,bottom:28,left:42},p=Math.max(0,c-o.left-o.right),v=Math.max(0,this.height-o.top-o.bottom),b=getComputedStyle(e),g={accent:w(b,"--chart-line","#818cf8"),success:w(b,"--chart-add","#4ade80"),danger:w(b,"--chart-del","#f87171"),muted:w(b,"--fg-muted","#94a3b8"),primary:w(b,"--fg-primary","#f8fafc"),border:w(b,"--border-soft","#334155"),grid:w(b,"--graph-guide","rgba(148, 163, 184, 0.22)"),surface:w(b,"--bg-surface","#111827"),elevated:w(b,"--bg-elevated","#1f2937")},T=F(e);if(T.selectAll("*").remove(),ht(t),this.data.length===0||p<=0||v<=0)return;let f=this.data.map(l=>({date:new Date(l.date),label:l.date,commits:l.commits,additions:l.additions,deletions:l.deletions,churn:l.additions+l.deletions})).filter(l=>!Number.isNaN(l.date.getTime()));if(!f.length)return;let C=Et(f,l=>l.date);+C[0]==+C[1]&&(C[0]=new Date(+C[0]-720*60*1e3),C[1]=new Date(+C[1]+720*60*1e3));let _=$t().domain(C).range([0,p]),P=pt().domain([0,J(f,l=>l.churn)??1]).nice().range([v,0]),L=pt().domain([0,J(f,l=>l.commits)??1]).nice().range([v,0]),ot=T.append("defs").append("linearGradient").attr("id","churn-area-gradient").attr("x1","0%").attr("x2","0%").attr("y1","0%").attr("y2","100%");ot.append("stop").attr("offset","0%").attr("stop-color",g.accent).attr("stop-opacity",.24),ot.append("stop").attr("offset","100%").attr("stop-color",g.accent).attr("stop-opacity",.02);let x=T.append("g").attr("transform",`translate(${o.left},${o.top})`),d=Rt(",");x.append("g").attr("class","grid").call(mt(P).ticks(4).tickSize(-p).tickFormat(()=>"")).call(l=>l.select(".domain").remove()).call(l=>l.selectAll("line").attr("stroke",g.grid));let m=Math.max(2,Math.min(14,p/Math.max(1,f.length)*.45));x.append("g").selectAll("line.additions").data(f).join("line").attr("class","additions").attr("x1",l=>_(l.date)-m/3).attr("x2",l=>_(l.date)-m/3).attr("y1",v).attr("y2",l=>P(l.additions)).attr("stroke",g.success).attr("stroke-width",m).attr("stroke-linecap","round").attr("opacity",.75),x.append("g").selectAll("line.deletions").data(f).join("line").attr("class","deletions").attr("x1",l=>_(l.date)+m/3).attr("x2",l=>_(l.date)+m/3).attr("y1",v).attr("y2",l=>P(l.deletions)).attr("stroke",g.danger).attr("stroke-width",m).attr("stroke-linecap","round").attr("opacity",.62);let G=Nt().x(l=>_(l.date)).y0(v).y1(l=>P(l.churn)).curve(gt);x.append("path").datum(f).attr("d",G).attr("fill","url(#churn-area-gradient)");let S=Ft().x(l=>_(l.date)).y(l=>L(l.commits)).curve(gt);x.append("path").datum(f).attr("d",S).attr("stroke",g.accent).attr("stroke-width",2).attr("fill","none");let z=x.append("g").attr("display","none");z.append("line").attr("y1",0).attr("y2",v).attr("stroke",g.primary).attr("stroke-opacity",.25).attr("stroke-dasharray","3,3"),z.append("circle").attr("r",4).attr("fill",g.accent).attr("stroke",g.surface).attr("stroke-width",2),x.append("g").attr("class","axis").attr("transform",`translate(0,${v})`).call(Tt(_).ticks(Math.min(8,Math.max(3,Math.floor(p/90)))).tickSizeOuter(0)).call(ut(g)),x.append("g").attr("class","axis").call(mt(P).ticks(4).tickSizeOuter(0)).call(ut(g)),x.append("g").attr("class","axis").attr("transform",`translate(${p},0)`).call(It(L).ticks(4).tickSizeOuter(0)).call(ut(g)),x.append("text").attr("x",0).attr("y",-4).attr("fill",g.muted).attr("font-size",10).text("churn"),x.append("text").attr("x",p).attr("y",-4).attr("text-anchor","end").attr("fill",g.muted).attr("font-size",10).text("commits");let jt=St(l=>l.date).center;T.attr("tabindex",0).on("pointermove",l=>{let[st,ft]=zt(l,x.node());if(st<0||st>p||ft<0||ft>v){ht(t),z.attr("display","none");return}let Qt=_.invert(st),M=f[jt(f,Qt)];if(!M)return;let xt=_(M.date),vt=L(M.commits);z.attr("display",null).attr("transform",`translate(${xt},0)`),z.select("circle").attr("cy",vt),Xt(t,{x:o.left+xt,y:o.top+Math.min(vt,v-20),date:M.label,commits:d(M.commits),additions:d(M.additions),deletions:d(M.deletions),churn:d(M.churn)})}).on("pointerleave blur",()=>{z.attr("display","none"),this.hideTimer&&clearTimeout(this.hideTimer),this.hideTimer=setTimeout(()=>ht(t),80)})}static \u0275fac=function(t){return new(t||a)};static \u0275cmp=H({type:a,selectors:[["app-churn-chart"]],viewQuery:function(t,c){if(t&1&&(W(Wt,7),W(Ut,7)),t&2){let o;U(o=X())&&(c.svgRef=o.first),U(o=X())&&(c.tooltipRef=o.first)}},inputs:{data:"data",height:"height"},features:[Z],decls:16,vars:1,consts:[["svg",""],["tooltip",""],[1,"chart-shell"],["aria-hidden","true",1,"legend"],[1,"swatch","commits"],[1,"swatch","additions"],[1,"swatch","deletions"],[1,"chart-wrap"],["width","100%","aria-label","Interactive churn over time"],["hidden","",1,"tooltip"]],template:function(t,c){t&1&&(Q(0,"div",2)(1,"div",3)(2,"span"),V(3,"i",4),r(4," commits"),q(),Q(5,"span"),V(6,"i",5),r(7," additions"),q(),Q(8,"span"),V(9,"i",6),r(10," deletions"),q()(),Q(11,"div",7),K(),V(12,"svg",8,0),bt(),V(14,"div",9,1),q()()),t&2&&(s(12),E("height",c.height))},dependencies:[A],styles:["[_nghost-%COMP%]{display:block}.chart-shell[_ngcontent-%COMP%]{display:grid;gap:.45rem}.legend[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;color:var(--fg-muted);font-size:11px}.legend[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-flex;gap:.35rem;align-items:center}.swatch[_ngcontent-%COMP%]{display:inline-block;width:9px;height:9px;border-radius:999px}.swatch.commits[_ngcontent-%COMP%]{background:var(--chart-line)}.swatch.additions[_ngcontent-%COMP%]{background:var(--chart-add)}.swatch.deletions[_ngcontent-%COMP%]{background:var(--chart-del)}.chart-wrap[_ngcontent-%COMP%]{position:relative;overflow:hidden;border:1px solid var(--border-soft);border-radius:var(--radius-md);background:radial-gradient(circle at 12% 0%,var(--chart-fill),transparent 34%),linear-gradient(180deg,color-mix(in oklab,var(--bg-surface-2) 58%,transparent),transparent 70%),var(--bg-surface-2)}svg[_ngcontent-%COMP%]{display:block;outline:none}[_nghost-%COMP%] .axis text{font-size:10px;font-family:var(--font-mono, monospace)}[_nghost-%COMP%] .axis path, [_nghost-%COMP%] .axis line{shape-rendering:crispEdges}.tooltip[_ngcontent-%COMP%]{position:absolute;z-index:2;min-width:150px;max-width:240px;padding:.5rem .6rem;border:1px solid var(--border-soft);border-radius:var(--radius-sm);background:var(--bg-elevated);color:var(--fg-primary);box-shadow:var(--shadow-md);font-size:11px;line-height:1.35;pointer-events:none;transform:translate(-50%,calc(-100% - 12px))}.tooltip[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:block;margin-bottom:.25rem;font-size:12px}.tooltip[_ngcontent-%COMP%] .row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:1rem;color:var(--fg-muted);font-variant-numeric:tabular-nums}.tooltip[_ngcontent-%COMP%] .value[_ngcontent-%COMP%]{color:var(--fg-primary)}"],changeDetection:0})};function ut(a){return e=>{e.selectAll("text").attr("fill",a.muted),e.selectAll("path,line").attr("stroke",a.border)}}function Xt(a,e){a&&(a.hidden=!1,a.style.left=`${e.x}px`,a.style.top=`${e.y}px`,a.innerHTML=`
2
+ <strong>${Yt(e.date)}</strong>
3
+ <div class="row"><span>Commits</span><span class="value">${e.commits}</span></div>
4
+ <div class="row"><span>Additions</span><span class="value">+${e.additions}</span></div>
5
+ <div class="row"><span>Deletions</span><span class="value">-${e.deletions}</span></div>
6
+ <div class="row"><span>Total churn</span><span class="value">${e.churn}</span></div>
7
+ `)}function ht(a){a&&(a.hidden=!0)}function w(a,e,t){return a.getPropertyValue(e).trim()||t}function Yt(a){return a.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e]??e)}var Kt=["svg"];function Zt(a,e){a&1&&(i(0,"div",5)(1,"span"),r(2,"lower churn"),n(),y(3,"span",6),i(4,"span"),r(5,"higher churn"),n()())}function te(a,e){a&1&&(i(0,"div",7),r(1,"No hotspots in the current window."),n())}var at=class a{data=[];height=320;fileClick=new Ct;svgRef;ngAfterViewInit(){this.render()}ngOnChanges(){this.render()}render(){if(!this.svgRef)return;let e=this.svgRef.nativeElement,t=e.clientWidth||600,c=F(e);if(c.selectAll("*").remove(),this.data.length===0)return;let o=getComputedStyle(e),p=N(o,"--accent","#4f46e5"),v=N(o,"--fg-muted","#64748b"),b=N(o,"--fg-primary","#0f172a"),g=N(o,"--bg-surface","#ffffff"),T=N(o,"--bg-surface-2","#f3f4f6"),f=N(o,"--border-soft","#e5e7eb"),C=Ht({name:"root",children:this.data}).sum(d=>d.commits??0).sort((d,m)=>(m.value??0)-(d.value??0));Vt().size([t,this.height]).padding(2).round(!0)(C);let P=J(this.data,d=>d.additions+d.deletions)??1,L=At().domain([0,P]).interpolator(Dt(T,p)),B=c.selectAll("g").data(C.leaves()).join("g").attr("class","cell").attr("transform",d=>`translate(${d.x0},${d.y0})`).on("click",(d,m)=>this.fileClick.emit(m.data.file)).on("mouseenter",function(){F(this).select("rect").attr("stroke-width",2.5).attr("filter","url(#hotspot-glow)")}).on("mouseleave",function(){F(this).select("rect").attr("stroke-width",1).attr("filter",null)});c.append("defs").append("filter").attr("id","hotspot-glow").attr("x","-20%").attr("y","-20%").attr("width","140%").attr("height","140%").append("feDropShadow").attr("dx",0).attr("dy",4).attr("stdDeviation",4).attr("flood-color",p).attr("flood-opacity",.28),B.append("rect").attr("width",d=>d.x1-d.x0).attr("height",d=>d.y1-d.y0).attr("rx",6).attr("ry",6).attr("fill",d=>{let m=d.data;return L(m.additions+m.deletions)}).attr("stroke",f).attr("stroke-width",1),B.append("title").text(d=>{let m=d.data;return`${m.file}
8
+ Changed in ${m.commits} commits by ${m.authors} authors
9
+ Line churn: +${m.additions} -${m.deletions}`}),B.append("text").attr("class","cell-label").attr("x",4).attr("y",12).attr("font-size",10).attr("font-family","var(--font-mono, monospace)").attr("fill",b).attr("stroke",g).attr("stroke-width",2.4).attr("paint-order","stroke").attr("pointer-events","none").text(d=>{let m=d.x1-d.x0,G=d.y1-d.y0;if(m<40||G<18)return"";let S=d.data.file;return S.split("/").pop()??S}),B.append("text").attr("x",4).attr("y",26).attr("font-size",9).attr("fill",v).attr("stroke",g).attr("stroke-width",2).attr("paint-order","stroke").attr("pointer-events","none").text(d=>{let m=d.x1-d.x0,G=d.y1-d.y0;if(m<70||G<34)return"";let S=d.data;return`${S.commits} commits \xB7 ${S.authors} authors`})}static \u0275fac=function(t){return new(t||a)};static \u0275cmp=H({type:a,selectors:[["app-hotspots-treemap"]],viewQuery:function(t,c){if(t&1&&W(Kt,7),t&2){let o;U(o=X())&&(c.svgRef=o.first)}},inputs:{data:"data",height:"height"},outputs:{fileClick:"fileClick"},features:[Z],decls:5,vars:3,consts:[["svg",""],[1,"treemap-wrap"],["width","100%","aria-label","Hot files treemap. Larger boxes changed in more commits. Stronger color means more line churn."],["class","scale",4,"ngIf"],["class","empty",4,"ngIf"],[1,"scale"],[1,"scale-bar"],[1,"empty"]],template:function(t,c){t&1&&(i(0,"div",1),K(),y(1,"svg",2,0),O(3,Zt,6,0,"div",3)(4,te,2,0,"div",4),n()),t&2&&(s(),E("height",c.height),s(2),u("ngIf",c.data.length),s(),u("ngIf",c.data.length===0))},dependencies:[A,it],styles:["[_nghost-%COMP%]{display:block}.treemap-wrap[_ngcontent-%COMP%]{position:relative;overflow:hidden;border:1px solid var(--border-soft);border-radius:var(--radius-md);background:radial-gradient(circle at 15% 0%,color-mix(in oklab,var(--accent) 12%,transparent),transparent 38%),var(--bg-surface-2)}svg[_ngcontent-%COMP%]{display:block}.scale[_ngcontent-%COMP%]{position:absolute;right:.75rem;bottom:.65rem;display:inline-flex;align-items:center;gap:.45rem;padding:.28rem .5rem;border:1px solid color-mix(in oklab,var(--border-soft) 72%,transparent);border-radius:999px;background:color-mix(in oklab,var(--bg-surface) 88%,transparent);color:var(--fg-muted);font-size:10px;box-shadow:var(--shadow-sm);pointer-events:none}.scale-bar[_ngcontent-%COMP%]{width:64px;height:7px;border-radius:999px;background:linear-gradient(90deg,var(--bg-surface-2),var(--accent))}.empty[_ngcontent-%COMP%]{position:absolute;inset:0;display:grid;place-items:center;color:var(--fg-muted);font-size:12px}"],changeDetection:0})};function N(a,e,t){return a.getPropertyValue(e).trim()||t}function ee(a,e){if(a&1&&(i(0,"p",7),r(1),Y(2,"slice"),Y(3,"slice"),n()),a&2){let t=e.ngIf;s(),nt(" ",ct(2,2,t.windowStart,0,10)," \u2192 ",ct(3,6,t.windowEnd,0,10)," ")}}function ne(a,e){a&1&&(i(0,"div",8),r(1,"Computing insights (this may take a few seconds)\u2026"),n())}function ie(a,e){if(a&1&&(i(0,"div",9),r(1),n()),a&2){let t=e.ngIf;s(),h(t)}}function re(a,e){if(a&1&&(i(0,"li")(1,"span",35),r(2),n(),i(3,"div",36)(4,"div",37)(5,"span",38),r(6),n(),i(7,"strong"),r(8),n()(),i(9,"div",39),y(10,"div",40),n(),i(11,"span",41),r(12),Y(13,"date"),Y(14,"date"),n()()()),a&2){let t=e.$implicit,c=e.index,o=k(2);s(),et("--avatar-color",o.avatarColor(c)),s(),h(o.initials(t.author)),s(3),u("title",t.author),s(),h(t.author),s(2),I("",t.commits," commits"),s(),E("aria-label",t.commits+" commits"),s(),et("width",o.barPct(t.commits,o.maxAuthorCommits()),"%"),s(2),nt(" active ",dt(13,11,t.firstCommit,"MMM d")," - ",dt(14,14,t.lastCommit,"MMM d, y")," ")}}function ae(a,e){if(a&1){let t=tt();i(0,"li")(1,"a",42),$("click",function(){let o=D(t).$implicit,p=k(2);return R(p.openFile(o.file))}),r(2),n(),i(3,"span",43),r(4),n(),i(5,"span",43),r(6),n(),i(7,"span",44),r(8),n()()}if(a&2){let t=e.$implicit;s(),u("title",t.file),s(),h(t.file),s(2),I("",t.commits," commits"),s(2),I("",t.authors," authors"),s(2),nt("+",t.additions," \u2212",t.deletions)}}function oe(a,e){if(a&1){let t=tt();i(0,"li")(1,"span",45),r(2),n(),i(3,"div",46)(4,"a",42),$("click",function(){let o=D(t).$implicit,p=k(2);return R(p.openFile(o.file))}),r(5),n(),i(6,"span",47),r(7),n()(),i(8,"div",48)(9,"div",49),y(10,"div",50),n(),i(11,"span",51),r(12),n()(),i(13,"div",52)(14,"span"),r(15),n(),i(16,"span"),r(17),n(),i(18,"span"),r(19),n()()()}if(a&2){let t=e.$implicit,c=e.index,o=k(2);_t("risk-high",o.riskLevel(t.riskScore)==="high")("risk-medium",o.riskLevel(t.riskScore)==="medium")("risk-low",o.riskLevel(t.riskScore)==="low"),s(2),h(c+1),s(2),u("title",t.file),s(),h(t.file),s(2),h(t.reason),s(),E("aria-label","Risk score "+o.riskScore(t.riskScore)),s(2),et("width",o.riskPct(t.riskScore),"%"),s(2),h(o.riskScore(t.riskScore)),s(3),I("",t.commits," commits"),s(2),I("",t.authors," authors"),s(2),I("",t.churn," churn")}}function se(a,e){if(a&1){let t=tt();i(0,"div",10)(1,"section",11)(2,"button",12)(3,"span",13),r(4,"Commits analyzed"),n(),i(5,"strong"),r(6),n(),i(7,"span",14),r(8,"current insight window"),n()(),i(9,"button",12)(10,"span",13),r(11,"Contributors"),n(),i(12,"strong"),r(13),n(),i(14,"span",14),r(15),n()(),i(16,"button",15),$("click",function(){let o=D(t).ngIf,p=k();return R(p.openTopHotspot(o))}),i(17,"span",13),r(18,"Hotspots"),n(),i(19,"strong"),r(20),n(),i(21,"span",14),r(22,"click to open the top file"),n()(),i(23,"button",15),$("click",function(){let o=D(t).ngIf,p=k();return R(p.openTopRisk(o))}),i(24,"span",13),r(25,"Risk alerts"),n(),i(26,"strong"),r(27),n(),i(28,"span",14),r(29,"highest churn and ownership risk"),n()()(),i(30,"section",16)(31,"div",17)(32,"div")(33,"p",18),r(34,"Ownership"),n(),i(35,"h3"),r(36,"Top contributors"),n()(),i(37,"p",19),r(38,"Who touched this repo most in the current insight window."),n()(),i(39,"ul",20),O(40,re,15,17,"li",21),n()(),i(41,"section",22)(42,"div",17)(43,"div")(44,"p",18),r(45,"Change concentration"),n(),i(46,"h3"),r(47,"Hot files"),n()(),i(48,"p",19),r(49," Bigger boxes changed in more commits. Stronger color means more line churn. Click any file to open its history. "),n()(),i(50,"div",23)(51,"span")(52,"strong"),r(53,"Size"),n(),r(54," = commit frequency"),n(),i(55,"span")(56,"strong"),r(57,"Color"),n(),r(58," = additions + deletions"),n(),i(59,"span")(60,"strong"),r(61,"People"),n(),r(62," = number of authors touching it"),n()(),i(63,"app-hotspots-treemap",24),$("fileClick",function(o){D(t);let p=k();return R(p.openFile(o))}),n(),i(64,"ul",25),O(65,ae,9,6,"li",21),n()(),i(66,"section",26)(67,"div",17)(68,"div")(69,"p",18),r(70,"Review priority"),n(),i(71,"h3"),r(72,"Risky files"),n()(),i(73,"p",19),r(74," This is a triage signal, not a bug detector. Higher scores mean the file changed a lot, changed recently, and/or has several contributors. "),n()(),i(75,"div",27),y(76,"span",28),i(77,"span"),r(78,"Low"),n(),y(79,"span",29),i(80,"span"),r(81,"Medium"),n(),y(82,"span",30),i(83,"span"),r(84,"High"),n()(),i(85,"ul",31),O(86,oe,20,17,"li",32),n()(),i(87,"section",33)(88,"h3"),r(89,"Churn over time"),n(),y(90,"app-churn-chart",34),n()()}if(a&2){let t=e.ngIf,c=k();s(6),h(t.totalCommits),s(7),h(t.totalAuthors),s(2),h(c.topContributor(t)),s(5),h(t.hotspots.length),s(7),h(t.riskyFiles.length),s(13),u("ngForOf",t.topContributors),s(23),u("data",t.hotspots),s(2),u("ngForOf",t.hotspots.slice(0,5)),s(21),u("ngForOf",t.riskyFiles),s(4),u("data",t.churnByDay)}}var Gt=class a{insightsApi=lt(Pt);router=lt(Ot);bundle=j(null);loading=j(!1);error=j(null);maxAuthorCommits=j(0);constructor(){yt(()=>{this.load()})}trackByDate(e,t){return t.date}barPct(e,t){return t>0?Math.round(e/t*100):0}initials(e){let t=e.trim().split(/\s+/).filter(Boolean);if(t.length===0)return"?";let c=t[0]?.[0]??"",o=t.length>1?t[t.length-1]?.[0]??"":t[0]?.[1]??"";return`${c}${o}`.toUpperCase()}avatarColor(e){let t=["#4f46e5","#06b6d4","#10b981","#f59e0b","#ef4444","#8b5cf6"];return t[e%t.length]}riskPct(e){return Math.max(4,Math.min(100,Math.round(e*100)))}riskScore(e){return this.riskPct(e).toString()}riskLevel(e){return e>=.67?"high":e>=.34?"medium":"low"}openFile(e){this.router.navigate(["/file",encodeURIComponent(e)])}topContributor(e){let t=e.topContributors[0];return t?t.author:"No author data"}openTopHotspot(e){let t=e.hotspots[0]?.file;t&&this.openFile(t)}openTopRisk(e){let t=e.riskyFiles[0]?.file;t&&this.openFile(t)}load(){this.loading.set(!0),this.error.set(null),this.insightsApi.bundle({maxCommits:500}).subscribe({next:e=>{this.bundle.set(e),this.maxAuthorCommits.set(e.topContributors[0]?.commits??0),this.loading.set(!1)},error:e=>{this.error.set(e?.error?.error??"Failed to load insights"),this.loading.set(!1)}})}static \u0275fac=function(t){return new(t||a)};static \u0275cmp=H({type:a,selectors:[["app-insights"]],decls:11,vars:4,consts:[[1,"page"],[1,"head"],[1,"eyebrow"],["class","sub",4,"ngIf"],["class","empty",4,"ngIf"],["class","empty error",4,"ngIf"],["class","grid",4,"ngIf"],[1,"sub"],[1,"empty"],[1,"empty","error"],[1,"grid"],[1,"kpis"],[1,"kpi"],[1,"label"],[1,"hint"],[1,"kpi",3,"click"],[1,"card","contributors-card"],[1,"section-head"],[1,"eyebrow","mini"],[1,"meaning"],["aria-label","Top contributors by commit count",1,"contributors"],[4,"ngFor","ngForOf"],[1,"card","wide","hotspot-card"],[1,"hotspot-help"],[3,"fileClick","data"],["aria-label","Top hot files",1,"hot-list","compact"],[1,"card","wide","risk-card"],[1,"risk-legend"],[1,"legend-dot","low"],[1,"legend-dot","medium"],[1,"legend-dot","high"],["aria-label","Risky files ranked by review priority",1,"risk-list"],[3,"risk-high","risk-medium","risk-low",4,"ngFor","ngForOf"],[1,"card","wide","chart-card"],[3,"data"],[1,"avatar"],[1,"contributor-main"],[1,"contributor-row"],[1,"name",3,"title"],[1,"contributor-bar"],[1,"contributor-fill"],[1,"active-range"],[1,"path",3,"click","title"],[1,"count"],[1,"churn"],[1,"rank"],[1,"risk-main"],[1,"reason"],[1,"risk-meter"],[1,"risk-track"],[1,"risk-fill"],[1,"risk-score"],[1,"risk-stats"]],template:function(t,c){t&1&&(i(0,"div",0)(1,"header",1)(2,"div")(3,"p",2),r(4,"Repository intelligence"),n(),i(5,"h2"),r(6,"Insights"),n()(),O(7,ee,4,10,"p",3),n(),O(8,ne,2,0,"div",4)(9,ie,2,1,"div",5)(10,se,91,10,"div",6),n()),t&2&&(s(7),u("ngIf",c.bundle()),s(),u("ngIf",c.loading()),s(),u("ngIf",c.error()),s(),u("ngIf",c.bundle()))},dependencies:[A,kt,it,at,rt,Mt,wt],styles:["[_nghost-%COMP%]{display:block;flex:1;min-height:0;overflow-y:auto}.page[_ngcontent-%COMP%]{padding:1.1rem 1.25rem 1.4rem;max-width:1320px;margin:0 auto}.head[_ngcontent-%COMP%]{display:flex;align-items:end;justify-content:space-between;gap:1rem;margin-bottom:1rem}.eyebrow[_ngcontent-%COMP%]{margin:0 0 .2rem;color:var(--accent);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.head[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0;font-size:clamp(20px,2vw,28px);letter-spacing:-.03em}.head[_ngcontent-%COMP%] .sub[_ngcontent-%COMP%]{margin:0;color:var(--fg-muted);font-size:13px}.empty[_ngcontent-%COMP%]{padding:2rem;color:var(--fg-muted);text-align:center}.empty.error[_ngcontent-%COMP%]{color:var(--danger)}.grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:1rem}.kpis[_ngcontent-%COMP%]{grid-column:1 / -1;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.75rem}.kpi[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:flex-start;gap:.25rem;padding:.85rem 1rem;color:var(--fg-primary);background:radial-gradient(circle at 85% 0%,color-mix(in oklab,var(--accent) 16%,transparent),transparent 44%),var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);cursor:pointer;text-align:left}.kpi[_ngcontent-%COMP%]:hover{border-color:color-mix(in oklab,var(--accent) 36%,var(--border-soft));box-shadow:var(--shadow-md)}.kpi[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px;text-transform:uppercase;letter-spacing:.05em}.kpi[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{font-size:24px;letter-spacing:-.04em}.kpi[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);padding:1rem 1.25rem;box-shadow:var(--shadow-sm)}.card.wide[_ngcontent-%COMP%]{grid-column:1 / -1}.card[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0 0 .75rem;font-size:14px}.section-head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:.7rem}.section-head[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;font-size:18px;letter-spacing:-.03em}.eyebrow.mini[_ngcontent-%COMP%]{margin-bottom:.1rem;font-size:10px;letter-spacing:.07em}.meaning[_ngcontent-%COMP%]{max-width:440px;margin:0;color:var(--fg-muted);font-size:12px;line-height:1.45;text-align:right}.hotspot-help[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:.75rem}.hotspot-help[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .55rem;border:1px solid var(--border-soft);border-radius:999px;background:color-mix(in oklab,var(--bg-surface) 78%,transparent);color:var(--fg-muted);font-size:11px}.hotspot-help[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--fg-primary);font-weight:700}.contributors-card[_ngcontent-%COMP%]{background:radial-gradient(circle at 88% 0%,color-mix(in oklab,var(--accent) 14%,transparent),transparent 38%),var(--bg-panel)}.contributors[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;display:grid;gap:.65rem}.contributors[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{display:grid;grid-template-columns:36px minmax(0,1fr);gap:.7rem;align-items:center;padding:.65rem;border:1px solid color-mix(in oklab,var(--border-soft) 72%,transparent);border-radius:var(--radius-md);background:color-mix(in oklab,var(--bg-surface) 62%,transparent);transition:border-color .12s,box-shadow .12s,transform .12s}.contributors[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover{border-color:color-mix(in oklab,var(--accent) 36%,var(--border-soft));box-shadow:var(--shadow-md);transform:translateY(-1px)}.avatar[_ngcontent-%COMP%]{--avatar-color: var(--accent);display:inline-grid;place-items:center;width:34px;height:34px;border-radius:999px;background:radial-gradient(circle at 30% 20%,rgba(255,255,255,.28),transparent 36%),var(--avatar-color);color:#fff;font-size:12px;font-weight:800;letter-spacing:.03em;box-shadow:0 0 0 2px color-mix(in oklab,var(--bg-surface) 78%,transparent)}.contributor-main[_ngcontent-%COMP%]{min-width:0;display:grid;gap:.28rem}.contributor-row[_ngcontent-%COMP%]{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem}.name[_ngcontent-%COMP%]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--fg-primary);font-size:13px;font-weight:600}.contributor-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{flex:0 0 auto;color:var(--fg-primary);font-size:12px;font-variant-numeric:tabular-nums}.contributor-bar[_ngcontent-%COMP%]{height:8px;border-radius:999px;overflow:hidden;background:var(--bg-surface-2);border:1px solid color-mix(in oklab,var(--border-soft) 68%,transparent)}.contributor-fill[_ngcontent-%COMP%]{height:100%;background:linear-gradient(90deg,var(--accent),#06b6d4)}.active-range[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.hot-list[_ngcontent-%COMP%], .risk-list[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0}.hot-list.compact[_ngcontent-%COMP%]{margin-top:.75rem;max-height:168px;overflow-y:auto;border:1px solid color-mix(in oklab,var(--border-soft) 72%,transparent);border-radius:var(--radius-md);background:color-mix(in oklab,var(--bg-surface) 58%,transparent)}.hot-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1fr) auto auto auto;gap:.6rem;align-items:center;padding:.55rem .7rem;border-bottom:1px solid color-mix(in oklab,var(--border-soft) 50%,transparent);font-size:12px}.hot-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:last-child, .risk-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:last-child{border-bottom:0}.path[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);color:var(--accent);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.path[_ngcontent-%COMP%]:hover{text-decoration:underline}.count[_ngcontent-%COMP%], .churn[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px}.risk-card[_ngcontent-%COMP%]{background:radial-gradient(circle at 96% 0%,color-mix(in oklab,var(--danger) 12%,transparent),transparent 34%),var(--bg-panel)}.risk-legend[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.4rem;margin-bottom:.75rem;padding:.28rem .55rem;border:1px solid var(--border-soft);border-radius:999px;background:color-mix(in oklab,var(--bg-surface) 72%,transparent);color:var(--fg-muted);font-size:11px}.legend-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:999px}.legend-dot.low[_ngcontent-%COMP%]{background:var(--success)}.legend-dot.medium[_ngcontent-%COMP%]{background:var(--warning)}.legend-dot.high[_ngcontent-%COMP%]{background:var(--danger)}.risk-list[_ngcontent-%COMP%]{display:grid;gap:.65rem}.risk-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{display:grid;grid-template-columns:28px minmax(0,1fr) minmax(160px,220px) auto;gap:.85rem;align-items:center;padding:.75rem;border:1px solid color-mix(in oklab,var(--border-soft) 72%,transparent);border-radius:var(--radius-md);background:color-mix(in oklab,var(--bg-surface) 66%,transparent);box-shadow:var(--shadow-sm);transition:border-color .12s,box-shadow .12s,transform .12s}.risk-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover{border-color:color-mix(in oklab,var(--accent) 36%,var(--border-soft));box-shadow:var(--shadow-md);transform:translateY(-1px)}.rank[_ngcontent-%COMP%]{display:inline-grid;place-items:center;width:24px;height:24px;border-radius:999px;background:var(--bg-surface-2);color:var(--fg-muted);font-size:11px;font-weight:700;font-variant-numeric:tabular-nums}.risk-main[_ngcontent-%COMP%]{min-width:0;display:grid;gap:.25rem}.risk-meter[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1fr) 42px;align-items:center;gap:.55rem}.risk-track[_ngcontent-%COMP%]{position:relative;height:12px;border-radius:999px;overflow:hidden;background:linear-gradient(90deg,color-mix(in oklab,var(--success) 24%,transparent) 0 33%,color-mix(in oklab,var(--warning) 26%,transparent) 33% 66%,color-mix(in oklab,var(--danger) 28%,transparent) 66% 100%);border:1px solid color-mix(in oklab,var(--border-soft) 70%,transparent)}.risk-fill[_ngcontent-%COMP%]{height:100%;border-radius:inherit;background:linear-gradient(90deg,var(--success),var(--warning),var(--danger))}.risk-score[_ngcontent-%COMP%]{font-size:13px;font-weight:800;color:var(--fg-primary);text-align:right;font-variant-numeric:tabular-nums}.risk-stats[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.35rem;min-width:150px}.risk-stats[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{padding:.18rem .45rem;border-radius:999px;background:var(--bg-surface-2);color:var(--fg-muted);font-size:11px;white-space:nowrap}.reason[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px}.risk-high[_ngcontent-%COMP%] .rank[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--danger) 18%,transparent);color:var(--danger)}.risk-medium[_ngcontent-%COMP%] .rank[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--warning) 18%,transparent);color:var(--warning)}.risk-low[_ngcontent-%COMP%] .rank[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--success) 16%,transparent);color:var(--success)}@media (max-width: 900px){.section-head[_ngcontent-%COMP%]{flex-direction:column}.meaning[_ngcontent-%COMP%]{text-align:left}.risk-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{grid-template-columns:28px minmax(0,1fr)}.risk-meter[_ngcontent-%COMP%], .risk-stats[_ngcontent-%COMP%]{grid-column:2}.risk-stats[_ngcontent-%COMP%]{justify-content:flex-start}}"],changeDetection:0})};export{Gt as InsightsComponent};
@@ -0,0 +1 @@
1
+ import{$ as E,W as C,g as v,xc as h,yc as O}from"./chunk-QH2BEUIU.js";var P=class a{http=E(O);base="/api";getCommits(t={}){let e=new h;for(let[g,s]of Object.entries(t))s!=null&&s!==""&&(e=e.set(g,String(s)));return this.http.get(`${this.base}/commits`,{params:e})}streamCommits(t={}){return new v(e=>{let g=new URL(`${window.location.origin}${this.base}/commits/stream`);for(let[i,r]of Object.entries(t))r!=null&&r!==""&&g.searchParams.set(i,String(r));let s=new EventSource(g.toString()),o=[],m=[],f=Math.max(1,t.page??1),p=w(t.pageSize??100,1,500),u=0,l={},n=0,c=!1,d=null,S=()=>{n=0,!(!m.length&&!c)&&(m.length&&o.push(...m.splice(0)),e.next({commits:o.slice(),total:c&&u||o.length,page:l.page??f,pageSize:l.pageSize??p,totalPages:l.totalPages??1,hasNext:l.hasNext??!1,hasPrevious:l.hasPrevious??f>1}),c&&(s.close(),e.complete()))},b=()=>{n||(n=requestAnimationFrame(S))};return s.addEventListener("commit",i=>{o.length+m.length<p&&m.push(JSON.parse(i.data)),b()}),s.addEventListener("done",i=>{let r=JSON.parse(i.data);u=r.total??o.length+m.length,l=r,c=!0,b()}),s.addEventListener("error",i=>{s.close(),n&&cancelAnimationFrame(n),d=this.getCommits(t).subscribe({next:r=>e.next(r),error:r=>e.error($(i)?M(i):r),complete:()=>e.complete()})}),()=>{s.close(),n&&cancelAnimationFrame(n),d?.unsubscribe()}})}getCommit(t){return this.http.get(`${this.base}/commit/${t}`)}getDiff(t){return this.http.get(`${this.base}/diff/${t}`)}getBlame(t){let e=new h().set("file",t);return this.http.get(`${this.base}/blame`,{params:e})}getTags(){return this.http.get(`${this.base}/tags`)}getBranches(){return this.http.get(`${this.base}/branches`)}getAuthors(){return this.http.get(`${this.base}/authors`)}static \u0275fac=function(e){return new(e||a)};static \u0275prov=C({token:a,factory:a.\u0275fac,providedIn:"root"})};function w(a,t,e){return Math.max(t,Math.min(e,a))}function $(a){return a instanceof MessageEvent&&typeof a.data=="string"&&a.data.length>0}function M(a){if(a instanceof MessageEvent&&typeof a.data=="string"&&a.data)try{let t=JSON.parse(a.data),e=t.message||t.error;if(e)return new Error(e)}catch{return new Error(a.data)}return new Error("Failed to load commits.")}export{P as a};