git-history-ui 5.1.0 → 5.2.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 (37) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +13 -1
  3. package/build/frontend/{chunk-T5NR37IK.js → chunk-3HQI3U5H.js} +1 -1
  4. package/build/frontend/chunk-5ISCQDR6.js +1 -0
  5. package/build/frontend/{chunk-AS5GIWPS.js → chunk-6SY2IWCO.js} +1 -1
  6. package/build/frontend/{chunk-EAY7RGLT.js → chunk-KINVHBDC.js} +1 -1
  7. package/build/frontend/index.html +2 -2
  8. package/build/frontend/main-MVJO42GL.js +1 -0
  9. package/build/frontend/{styles-VRDIEW7E.css → styles-YVI22YLY.css} +1 -1
  10. package/dist/backend/aggregations.d.ts.map +1 -1
  11. package/dist/backend/aggregations.js.map +1 -1
  12. package/dist/backend/breakage.d.ts +1 -1
  13. package/dist/backend/breakage.d.ts.map +1 -1
  14. package/dist/backend/breakage.js +2 -1
  15. package/dist/backend/breakage.js.map +1 -1
  16. package/dist/backend/cache/sqliteIndex.d.ts +13 -0
  17. package/dist/backend/cache/sqliteIndex.d.ts.map +1 -1
  18. package/dist/backend/cache/sqliteIndex.js +68 -5
  19. package/dist/backend/cache/sqliteIndex.js.map +1 -1
  20. package/dist/backend/dev-server.js +0 -2
  21. package/dist/backend/dev-server.js.map +1 -1
  22. package/dist/backend/gitService.d.ts +2 -0
  23. package/dist/backend/gitService.d.ts.map +1 -1
  24. package/dist/backend/gitService.js +44 -16
  25. package/dist/backend/gitService.js.map +1 -1
  26. package/dist/backend/search/datePhrase.d.ts.map +1 -1
  27. package/dist/backend/search/datePhrase.js +6 -2
  28. package/dist/backend/search/datePhrase.js.map +1 -1
  29. package/dist/backend/server.d.ts +2 -0
  30. package/dist/backend/server.d.ts.map +1 -1
  31. package/dist/backend/server.js +209 -69
  32. package/dist/backend/server.js.map +1 -1
  33. package/dist/cli.js +3 -1
  34. package/dist/cli.js.map +1 -1
  35. package/package.json +11 -10
  36. package/build/frontend/chunk-HSZFTFM3.js +0 -1
  37. package/build/frontend/main-TYWZN6ZP.js +0 -1
@@ -1 +1 @@
1
- import{a as ot,b as rt,c as ft}from"./chunk-UC5UORBU.js";import{a as lt,b as ct,c as mt,d as pt,e as dt}from"./chunk-COLUQZLF.js";import{a as G}from"./chunk-VDZMKPJL.js";import{g as gt}from"./chunk-Y6GOUMAT.js";import{b as Je,e as Ze}from"./chunk-Q72JIHF2.js";import{a as et,b as tt,c as nt,h as it}from"./chunk-HHK3LJFN.js";import{a as at}from"./chunk-HSZFTFM3.js";import{a as st}from"./chunk-5K2HNBK3.js";import{$a as L,Ab as w,Ac as Xe,Bb as x,Bc as xe,E as Ae,Ec as _e,Fb as te,Fc as be,Gb as ne,Hb as ie,Ib as he,Jb as J,Kb as W,Lb as Qe,Mb as l,Na as We,Nb as h,Ob as z,Pb as ue,Qa as pe,Qb as Ue,S as je,Sa as a,Sb as De,Tb as Te,U as Ie,Ub as Fe,X as me,Xa as qe,Yb as j,Zb as Ke,_b as q,aa as M,ac as ve,cb as Ye,eb as v,ec as K,fa as P,fc as Y,ga as k,ha as Ge,nb as de,pa as S,qb as d,r as Ee,rb as s,rc as Q,sb as r,sc as N,ta as Be,tb as b,tc as Z,vc as H,xb as ge,yb as fe,zb as A}from"./chunk-MTI6UKQ3.js";var Ce=class i{http=M(xe);base="/api";cache=new _e(200);list(e){return this.cache.get(e,()=>this.http.get(`${this.base}/annotations/${e}`),be.VOLATILE)}add(e,t,n){return this.http.post(`${this.base}/annotations/${e}`,{author:t,body:n}).pipe(Ie(()=>this.cache.invalidate(e)))}remove(e,t){return this.http.delete(`${this.base}/annotations/${e}/${t}`).pipe(Ie(()=>this.cache.invalidate(e)))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=me({token:i,factory:i.\u0275fac,providedIn:"root"})};var vt=["svg"];function xt(i,e){i&1&&(s(0,"div",11),l(1," No graph data \u2014 changed files have no detectable internal imports. "),r())}var ye=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 e=this.svgRef.nativeElement,t=gt(e);t.selectAll("*").remove();let n=this.impact;if(!n||n.dependencyRipple.length===0&&n.modules.length===0){this.hasData=!1;return}this.hasData=!0;let o=new Map,c=(m,E,V)=>{let R=o.get(m);return R||(R={id:m,group:E,label:V},o.set(m,R)),R};for(let m of n.files)c(`f:${m}`,"changed",Re(m));for(let m of n.modules)c(`m:${m}`,"module",m);for(let m of n.dependencyRipple)c(`f:${m.from}`,"changed",Re(m.from)),c(`f:${m.to}`,"imported",Re(m.to));let g=[];for(let m of n.dependencyRipple)g.push({source:`f:${m.from}`,target:`f:${m.to}`,type:"imports"});for(let m of n.files){let E=Ct(m);n.modules.includes(E)&&g.push({source:`f:${m}`,target:`m:${E}`,type:"in-module"})}let u=Array.from(o.values()),O=e.parentElement?.clientWidth??640,p=u.filter(m=>m.group==="module").sort(Le),f=u.filter(m=>m.group==="changed").sort(Le),_=u.filter(m=>m.group==="imported").sort(Le),C=Math.max(p.length,f.length,_.length,4),T=44,$=58,F={module:68,changed:430,imported:780},I=Math.max(O,F.imported+Math.max(320,_t(_))+80),B=Math.max(360,$+C*T+40);t.attr("width",I).attr("height",B).attr("viewBox",`0 0 ${I} ${B}`),t.append("rect").attr("width",I).attr("height",B).attr("fill","transparent"),t.append("g").selectAll("text").data([{label:"Modules",x:F.module},{label:"Changed files",x:F.changed},{label:"Import dependencies",x:F.imported}]).join("text").attr("class","column-title").attr("x",m=>m.x).attr("y",28).text(m=>m.label),ze(p,F.module,$,T),ze(f,F.changed,$,T),ze(_,F.imported,$,T);let $e=t.append("g").selectAll("path").data(g).join("path").attr("class",m=>`impact-link ${m.type}`).attr("d",m=>{let E=o.get(String(m.source)),V=o.get(String(m.target));return E&&V?bt(E,V):""});t.append("g").selectAll("circle").data(u).join("circle").attr("r",m=>m.group==="module"?7:5).attr("fill",m=>m.group==="changed"?"var(--accent)":m.group==="imported"?"#f59e0b":"#8b5cf6").attr("stroke","var(--bg-surface-2)").attr("stroke-width",1.5).attr("cx",m=>m.x??0).attr("cy",m=>m.y??0).append("title").text(m=>`${m.group}: ${m.id.slice(2)}`);let ce=t.append("g").selectAll("rect").data(u).join("rect").attr("class","label-bg").attr("width",m=>ht(m)).attr("height",18).attr("rx",5).attr("ry",5).attr("x",m=>(m.x??0)+10).attr("y",m=>(m.y??0)-11),y=t.append("g").selectAll("text").data(u).join("text").attr("class",m=>`node-label ${m.group}`).attr("x",m=>(m.x??0)+14).attr("y",m=>(m.y??0)+4).text(m=>m.label);this.simulation?.stop(),this.simulation=null}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-impact-graph"]],viewQuery:function(t,n){if(t&1&&te(vt,7),t&2){let o;ne(o=ie())&&(n.svgRef=o.first)}},inputs:{impact:"impact"},features:[Be],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(t,n){t&1&&(s(0,"div",1)(1,"div",2)(2,"span",3),b(3,"span",4),l(4,"changed file"),r(),s(5,"span",3),b(6,"span",5),l(7,"import dependency"),r(),s(8,"span",3),b(9,"span",6),l(10,"module"),r()(),s(11,"span",7),l(12,"Scroll to explore. Lines show module membership and imports."),r()(),s(13,"div",8),Ge(),b(14,"svg",9,0),v(16,xt,2,0,"div",10),r()),t&2&&(a(16),d("ngIf",!n.hasData))},dependencies:[H,N],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 Re(i){let e=i.split("/");return e[e.length-1]}function ht(i){let e=i.label.length;return Math.max(112,Math.min(520,e*6.7+18))}function _t(i){return Math.max(0,...i.map(e=>ht(e)))}function Le(i,e){return i.label.localeCompare(e.label)}function ze(i,e,t,n){for(let[o,c]of i.entries())c.x=e,c.y=t+o*n}function bt(i,e){let t=i.x??0,n=i.y??0,o=e.x??0,c=e.y??0,g=Math.max(72,Math.abs(o-t)*.42),u=o>=t?1:-1;return`M ${t} ${n} C ${t+u*g} ${n}, ${o-u*g} ${c}, ${o} ${c}`}function Ct(i){let e=i.split("/");return e.length===1?"(root)":e.slice(0,Math.min(e.length-1,3)).join("/")}var Me=class i{constructor(e){this.sanitizer=e}cache=new Map;transform(e){if(!e)return"";let t=this.cache.get(e);if(t)return t;let n=this.sanitizer.bypassSecurityTrustHtml(yt(e));if(this.cache.set(e,n),this.cache.size>50){let o=this.cache.keys().next().value;o&&this.cache.delete(o)}return n}static \u0275fac=function(t){return new(t||i)(qe(Je,16))};static \u0275pipe=Ye({name:"markdown",type:i,pure:!0})};function yt(i){let e=Mt(i);return e=e.replace(/```(\w*)\n([\s\S]*?)```/g,(t,n,o)=>`<pre><code>${o.trim()}</code></pre>`),e=e.replace(/`([^`]+)`/g,"<code>$1</code>"),e=e.replace(/^### (.+)$/gm,"<h4>$1</h4>"),e=e.replace(/^## (.+)$/gm,"<h3>$1</h3>"),e=e.replace(/^# (.+)$/gm,"<h2>$1</h2>"),e=e.replace(/\*\*\*(.+?)\*\*\*/g,"<strong><em>$1</em></strong>"),e=e.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),e=e.replace(/\*(.+?)\*/g,"<em>$1</em>"),e=e.replace(/^(\s*)[-*] (.+)$/gm,(t,n,o)=>`<li data-depth="${Math.floor(n.length/2)}">${o}</li>`),e=e.replace(/((?:<li[^>]*>.*<\/li>\n?)+)/g,"<ul>$1</ul>"),e=e.replace(/^\d+\.\s+(.+)$/gm,"<li>$1</li>"),e=e.replace(/((?:<li>.*<\/li>\n?){2,})/g,t=>t.includes("data-depth")?t:`<ol>${t}</ol>`),e=e.replace(/\n{2,}/g,"</p><p>"),e=`<p>${e}</p>`,e=e.replace(/<p>\s*(<(?:h[2-4]|ul|ol|pre|blockquote)[^>]*>)/g,"$1"),e=e.replace(/(<\/(?:h[2-4]|ul|ol|pre|blockquote)>)\s*<\/p>/g,"$1"),e=e.replace(/<p>\s*<\/p>/g,""),e=e.replace(/\n/g,"<br>"),e}function Mt(i){return i.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function wt(i,e){if(i&1&&(s(0,"span",36),l(1),r()),i&2){let t=e.$implicit;a(),h(t)}}function Ot(i,e){if(i&1&&(s(0,"span",37),l(1),r()),i&2){let t=e.$implicit;a(),h(t)}}function Pt(i,e){i&1&&(s(0,"span",38),l(1,"merge"),r())}function kt(i,e){if(i&1&&(s(0,"pre",39),l(1),r()),i&2){let t=x().ngIf;a(),h(t.body)}}function St(i,e){if(i&1){let t=A();s(0,"div",40)(1,"span",41),l(2,"AI"),r(),b(3,"div",42),j(4,"markdown"),s(5,"button",43),w("click",function(){P(t);let o=x(2);return k(o.explanation.set(null))}),l(6,"\xD7"),r()()}if(i&2){let t=e.ngIf;a(3),d("innerHTML",Ke(4,1,t),We)}}function Et(i,e){if(i&1&&(s(0,"div",44),l(1),r()),i&2){let t=e.ngIf;a(),h(t)}}function It(i,e){if(i&1&&(s(0,"li"),l(1),r()),i&2){let t=e.$implicit;a(),h(t)}}function Dt(i,e){if(i&1){let t=A();s(0,"li",28),w("click",function(){let o=P(t).$implicit,c=x(3);return k(c.state.selectHash(o.hash))}),s(1,"code"),l(2),r(),s(3,"span"),l(4),r()()}if(i&2){let t=e.$implicit;a(2),h(t.hash.slice(0,7)),a(2),h(t.subject)}}function Tt(i,e){if(i&1&&(s(0,"div",45)(1,"div",46)(2,"span"),l(3,"Impact"),r(),s(4,"span",47),l(5),r()(),b(6,"app-impact-graph",48),s(7,"div",49)(8,"div")(9,"h4"),l(10,"Modules"),r(),s(11,"ul",50),v(12,It,2,1,"li",51),r()(),s(13,"div")(14,"h4"),l(15,"Related commits"),r(),s(16,"ul",52),v(17,Dt,5,2,"li",53),r()()()()),i&2){let t=e.ngIf;a(5),Ue(" ",t.files.length," files \xB7 ",t.modules.length," modules \xB7 ",t.relatedCommits.length," related commits "),a(),d("impact",t),a(6),d("ngForOf",t.modules),a(5),d("ngForOf",t.relatedCommits)}}function Ft(i,e){if(i&1&&(s(0,"span",54),l(1),r()),i&2){let t=x(2);a(),h(t.files().length)}}function Rt(i,e){if(i&1&&(s(0,"span",64),l(1),r()),i&2){let t=x().$implicit;a(),z("+",t.additions)}}function Lt(i,e){if(i&1&&(s(0,"span",65),l(1),r()),i&2){let t=x().$implicit;a(),z("\u2212",t.deletions)}}function zt(i,e){if(i&1){let t=A();s(0,"div",55)(1,"button",56),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.selectFile(o))}),b(2,"span",57),s(3,"span",58),l(4),r(),s(5,"span",59),v(6,Rt,2,1,"span",60)(7,Lt,2,1,"span",61),r()(),s(8,"button",62),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.openFileHistory(o.file))}),l(9," \u23F1 "),r(),s(10,"button",63),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.openFileBreakage(o.file))}),l(11," \u26A0 "),r()()}if(i&2){let t,n=e.$implicit,o=x(2);a(),W("selected",n.file===((t=o.activeFile())==null?null:t.file)),a(),de("data-status",n.status),a(),d("title",n.file),a(),h(n.file),a(2),d("ngIf",n.additions),a(),d("ngIf",n.deletions)}}function Nt(i,e){i&1&&(s(0,"div",66),l(1,"No files changed."),r())}function Ht(i,e){i&1&&(s(0,"div",66),l(1,"Loading\u2026"),r())}function $t(i,e){if(i&1){let t=A();s(0,"div",67)(1,"div",68)(2,"strong"),l(3),r(),s(4,"span",69),l(5),j(6,"date"),r(),s(7,"button",70),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.deleteComment(o.id))}),l(8," \xD7 "),r()(),s(9,"p",71),l(10),r()()}if(i&2){let t=e.$implicit;a(3),h(t.author),a(2),h(q(6,3,t.createdAt,"short")),a(5),h(t.body)}}function Vt(i,e){if(i&1){let t=A();ge(0),s(1,"header",2)(2,"div",3)(3,"span",4),l(4),r(),s(5,"span",5),v(6,wt,2,1,"span",6)(7,Ot,2,1,"span",7)(8,Pt,2,0,"span",8),r()(),s(9,"h2",9),l(10),r(),s(11,"div",10)(12,"span"),l(13),r(),s(14,"span",11),l(15,"\u2022"),r(),s(16,"span"),l(17),j(18,"date"),r()(),v(19,kt,2,1,"pre",12),s(20,"div",13)(21,"button",14),w("click",function(){P(t);let o=x();return k(o.onExplain())}),l(22),r(),s(23,"button",14),w("click",function(){P(t);let o=x();return k(o.onLoadImpact())}),l(24),r(),s(25,"button",15),w("click",function(){P(t);let o=x();return k(o.copyShareLink())}),l(26),r()(),v(27,St,7,3,"div",16)(28,Et,2,1,"div",17),r(),v(29,Tt,18,6,"div",18),s(30,"div",19)(31,"aside",20)(32,"div",21)(33,"span"),l(34,"Files"),r(),v(35,Ft,2,1,"span",22),r(),s(36,"div",23),v(37,zt,12,7,"div",24)(38,Nt,2,0,"div",25)(39,Ht,2,0,"div",25),r()(),s(40,"section",26)(41,"details",27)(42,"summary",28),w("click",function(o){P(t);let c=x();return k(c.toggleAnnotations(o))}),l(43),r(),s(44,"div",29),v(45,$t,11,6,"div",30),s(46,"div",31)(47,"input",32),Fe("ngModelChange",function(o){P(t);let c=x();return Te(c.commentAuthor,o)||(c.commentAuthor=o),k(o)}),r(),s(48,"textarea",33),Fe("ngModelChange",function(o){P(t);let c=x();return Te(c.commentDraft,o)||(c.commentDraft=o),k(o)}),r(),s(49,"button",34),w("click",function(){P(t);let o=x();return k(o.addComment())}),l(50," Post "),r()()()(),b(51,"app-diff-viewer",35),r()(),fe()}if(i&2){let t=e.ngIf,n=x();a(4),h(t.shortHash),a(2),d("ngForOf",t.tags),a(),d("ngForOf",t.branches),a(),d("ngIf",t.isMerge),a(2),h(t.subject),a(3),ue("",t.author," <",t.authorEmail,">"),a(4),h(q(18,29,t.date,"medium")),a(2),d("ngIf",t.body),a(2),d("disabled",n.explaining()),a(),z(" ",n.explaining()?"...":"\u2728 Explain change"," "),a(),d("disabled",n.loadingImpact()),a(),z(" ",n.loadingImpact()?"...":n.impact()?"Refresh impact":"Show impact"," "),a(2),z(" ",n.shareCopied()?"Copied!":"\u{1F517} Share"," "),a(),d("ngIf",n.explanation()),a(),d("ngIf",n.explainError()),a(),d("ngIf",n.impact()),a(6),d("ngIf",n.files().length),a(2),d("ngForOf",n.files())("ngForTrackBy",n.trackByFile),a(),d("ngIf",!n.files().length&&!n.loading()),a(),d("ngIf",n.loading()),a(2),d("open",n.annotationsOpen()),a(2),z(" \u{1F4AC} Notes (",n.comments().length,") "),a(2),d("ngForOf",n.comments()),a(2),De("ngModel",n.commentAuthor),a(),De("ngModel",n.commentDraft),a(),d("disabled",!n.commentDraft.trim()),a(2),d("fileInput",n.activeFile())}}function At(i,e){i&1&&(s(0,"div",72)(1,"p",73),l(2,"No commit selected"),r(),s(3,"p",74),l(4," Pick a commit from the list, or press "),s(5,"kbd",75),l(6,"\u2318K"),r(),l(7," to open the command palette. "),r()())}var we=class i{state=M(G);git=M(at);insightsApi=M(st);annotationsApi=M(Ce);router=M(Ze);commit=this.state.selected;impact=S(null);loadingImpact=S(!1);explanation=S(null);explainError=S(null);explaining=S(!1);comments=S([]);annotationsOpen=S(!1);shareCopied=S(!1);commentDraft="";commentAuthor="me";loading=S(!1);files=rt(ot(this.commit).pipe(je(e=>e?(this.loading.set(!0),this.git.getDiff(e.hash).pipe(Ae(()=>Ee([])))):(this.loading.set(!1),Ee([])))),{initialValue:[]});activeFileIndex=S(0);activeFile=K(()=>{let e=this.files();if(!e.length)return null;let t=Math.min(this.activeFileIndex(),e.length-1);return e[t]});constructor(){Y(()=>{this.files(),this.activeFileIndex.set(0),this.loading.set(!1)}),Y(()=>{let e=this.commit();if(this.impact.set(null),this.explanation.set(null),this.explainError.set(null),this.shareCopied.set(!1),!e){this.comments.set([]);return}this.annotationsApi.list(e.hash).subscribe({next:t=>this.comments.set(t),error:()=>this.comments.set([])})})}trackByFile(e,t){return t.file}selectFile(e){let t=this.files().findIndex(n=>n.file===e.file);t>=0&&this.activeFileIndex.set(t)}openFileHistory(e){this.router.navigate(["/file",encodeURIComponent(e)])}openFileBreakage(e){this.router.navigate(["/file",encodeURIComponent(e)],{queryParams:{tab:"breakage"}})}shortPath(e){if(e.length<=32)return e;let t=e.split("/");return t.length<=2?e:t[0]+"/.../"+t.slice(-2).join("/")}onLoadImpact(){let e=this.commit();e&&(this.loadingImpact.set(!0),this.insightsApi.impact(e.hash).subscribe({next:t=>{this.impact.set(t),this.loadingImpact.set(!1)},error:()=>this.loadingImpact.set(!1)}))}onExplain(){let e=this.commit();!e||this.explaining()||(this.explaining.set(!0),this.explainError.set(null),this.insightsApi.explainCommit(e.hash).subscribe({next:t=>{this.explanation.set(t.summary),this.explaining.set(!1)},error:t=>{this.explainError.set(t?.error?.error??"AI explanation unavailable. Set ANTHROPIC_API_KEY or OPENAI_API_KEY."),this.explaining.set(!1)}}))}copyShareLink(){let e=this.commit();if(!e)return;let t=`${window.location.origin}/?commit=${e.hash}`;navigator.clipboard?.writeText(t).then(()=>{this.shareCopied.set(!0),setTimeout(()=>this.shareCopied.set(!1),1500)}).catch(()=>{this.shareCopied.set(!1)})}toggleAnnotations(e){setTimeout(()=>this.annotationsOpen.set(!this.annotationsOpen()),0)}addComment(){let e=this.commit();!e||!this.commentDraft.trim()||this.annotationsApi.add(e.hash,this.commentAuthor||"anonymous",this.commentDraft.trim()).subscribe({next:t=>{this.comments.set([...this.comments(),t]),this.commentDraft=""}})}deleteComment(e){let t=this.commit();t&&this.annotationsApi.remove(t.hash,e).subscribe({next:()=>this.comments.set(this.comments().filter(n=>n.id!==e))})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({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"],["title","Why did this break? Open breakage analysis","aria-label","Open breakage analysis for this file",1,"file-history","breakage",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(t,n){if(t&1&&v(0,Vt,52,32,"ng-container",1)(1,At,8,0,"ng-template",null,0,ve),t&2){let o=he(2);d("ngIf",n.commit())("ngIfElse",o)}},dependencies:[H,Q,N,it,et,tt,nt,dt,ye,Z,Me],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)}.file-history.breakage[_ngcontent-%COMP%]:hover{color:var(--danger, #dc2626)}.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 jt=["canvas"],Gt=["scroll"];function Bt(i,e){if(i&1&&b(0,"span",12),i&2){let t=e.$implicit;J("background",t)}}function Wt(i,e){i&1&&(s(0,"span",19),l(1,"merge"),r())}function qt(i,e){if(i&1&&(s(0,"div",20),l(1),r()),i&2){let t=x().ngIf;a(),h(t.refs)}}function Yt(i,e){if(i&1&&(s(0,"div",13)(1,"div",14)(2,"code"),l(3),r(),v(4,Wt,2,0,"span",15),r(),s(5,"div",16),l(6),r(),s(7,"div",17)(8,"span"),l(9),r(),s(10,"span"),l(11),j(12,"date"),r()(),v(13,qt,2,1,"div",18),r()),i&2){let t=e.ngIf;J("left",t.x,"px")("top",t.y,"px"),a(3),h(t.shortHash),a(),d("ngIf",t.isMerge),a(2),h(t.subject),a(3),h(t.author),a(2),h(q(12,10,t.date,"MMM d, y, h:mm a")),a(2),d("ngIf",t.refs)}}function Qt(i,e){i&1&&(s(0,"div",21),l(1," No commits to draw. "),r())}var D=34,ae=24,Ne=5.5,se=16,le=16,He=["#4f46e5","#06b6d4","#f59e0b","#ef4444","#10b981","#8b5cf6","#ec4899","#0ea5e9"],Oe=class i{state=M(G);theme=M(ft);legendColors=He.slice(0,5);graphSummary=K(()=>{let e=this.state.commits().length,t=this.laneCount;return e?`${e.toLocaleString()} commits across ${t} lane${t===1?"":"s"}`:"Swim-lane visualization"});contentHeight=K(()=>{let e=this.state.commits().length;return e?le*2+e*D:0});canvasRef;scrollRef;nodes=[];rowByHash=new Map;laneCount=1;hoverRow=-1;hoverTip=S(null);layoutToken=0;idleHandle=null;canvasSize={width:0,height:0,dpr:0};canvasTransform="";cachedTheme=null;onCanvasClick=e=>this.onClick(e);onCanvasMove=e=>this.onMouseMove(e);onCanvasLeave=()=>this.onMouseLeave();scrollRaf=0;onScroll=()=>{this.scrollRaf||(this.scrollRaf=requestAnimationFrame(()=>{this.scrollRaf=0,this.draw()}))};constructor(){Y(()=>{this.scheduleLayout(this.state.commits())}),Y(()=>{this.state.selectedHash(),this.draw()}),Y(()=>{this.theme.resolved(),this.cachedTheme=null,this.draw()})}ngAfterViewInit(){let e=this.canvasRef.nativeElement;e.addEventListener("click",this.onCanvasClick),e.addEventListener("mousemove",this.onCanvasMove),e.addEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.addEventListener("scroll",this.onScroll,{passive:!0}),this.draw()}ngOnDestroy(){let e=this.canvasRef?.nativeElement;e?.removeEventListener("click",this.onCanvasClick),e?.removeEventListener("mousemove",this.onCanvasMove),e?.removeEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.removeEventListener("scroll",this.onScroll),this.scrollRaf&&cancelAnimationFrame(this.scrollRaf),this.cancelIdleLayout()}onResize(){this.draw()}scheduleLayout(e){let t=++this.layoutToken;if(this.cancelIdleLayout(),this.nodes=[],this.rowByHash.clear(),this.hoverRow=-1,this.hoverTip.set(null),!e.length){this.laneCount=1,this.draw();return}let n=[],o=new Map,c=(f,_)=>{let C=n[f];C&&o.delete(C),n[f]=_,_&&o.set(_,f)},g=f=>{let _=o.get(f);if(_!==void 0)return _;let C=n.indexOf(null);return C>=0?(c(C,f),C):(c(n.length,f),n.length-1)},u=f=>{let _=e[f],C=g(_.hash),T={commit:_,row:f,lane:C};this.nodes.push(T),this.rowByHash.set(_.hash,T);let[$,...F]=_.parents;c(C,$??null);for(let I of F)if(!o.has(I)){let B=n.indexOf(null);B>=0?c(B,I):c(n.length,I)}for(;n.length&&n[n.length-1]===null;)n.pop();C+1>this.laneCount&&(this.laneCount=C+1)};if(this.laneCount=1,e.length<=5e3){for(let f=0;f<e.length;f++)u(f);this.draw();return}let O=0,p=f=>{if(t!==this.layoutToken)return;let _=performance.now();for(;O<e.length;){u(O++);let C=f?.timeRemaining?.()??0;if(O%250===0&&C<=1&&performance.now()-_>8)break}this.draw(),O<e.length&&t===this.layoutToken&&(this.idleHandle=this.requestIdle(p))};this.idleHandle=this.requestIdle(p)}draw(){let e=this.canvasRef?.nativeElement;if(!e)return;let t=this.scrollRef?.nativeElement,n=window.devicePixelRatio||1,o=t?.scrollTop??0,c=t?.clientHeight??0,g=Math.max(t?.clientWidth??se*2+ae,se*2+ae),u=Math.max(c||D*8,D);this.ensureCanvasSize(e,g,u,n);let O=`translateY(${o}px)`;this.canvasTransform!==O&&(this.canvasTransform=O,e.style.transform=O);let p=e.getContext("2d"),f=this.cachedTheme??(this.cachedTheme=this.readTheme(e));if(p.setTransform(n,0,0,n,0,-o*n),p.clearRect(0,o,g,u),p.fillStyle=f.surface,p.fillRect(0,o,g,u),!this.nodes.length)return;let _=this.laneStep(g),C=this.nodeRadius(_),T=y=>this.xOfLane(y,g,_),$=y=>le+y*D+D/2,F=y=>He[y%He.length],I=this.state.selectedHash(),B=D*4,$e=Math.max(0,Math.floor((o-le-B)/D)),Ve=Math.min(this.nodes.length-1,Math.ceil((o+u-le+B)/D)),ce=this.nodes.slice($e,Ve+1);this.drawRows(p,g,T,$,C,f,I,ce),this.drawGuides(p,o,u,f),p.lineCap="round",p.lineJoin="round";for(let y of ce)for(let m of y.commit.parents){let E=this.rowByHash.get(m);if(!E)continue;let V=T(y.lane),R=$(y.row),ee=T(E.lane),X=$(E.row);p.strokeStyle=f.shadow,p.lineWidth=4,p.globalAlpha=.35,this.drawEdge(p,V,R,ee,X),p.strokeStyle=F(E.lane),p.lineWidth=y.commit.isMerge?2.6:2.2,p.globalAlpha=I&&I!==y.commit.hash&&I!==E.commit.hash?.55:.9,this.drawEdge(p,V,R,ee,X),p.globalAlpha=1}for(let y of ce){let m=T(y.lane),E=$(y.row),V=F(y.lane),R=y.commit.hash===I,ee=y.row===this.hoverRow,X=R?C+2:ee?C+1:C;p.beginPath(),p.arc(m,E,X+3,0,Math.PI*2),p.fillStyle=f.nodeRing,p.fill(),p.beginPath(),p.arc(m,E,X,0,Math.PI*2),p.fillStyle=y.commit.isMerge?f.surface:V,p.fill(),p.lineWidth=y.commit.isMerge||R?2.5:1.75,p.strokeStyle=V,p.stroke(),(R||ee)&&(p.beginPath(),p.arc(m,E,X+5,0,Math.PI*2),p.strokeStyle=V,p.globalAlpha=R?.42:.24,p.lineWidth=2,p.stroke(),p.globalAlpha=1)}}drawRows(e,t,n,o,c,g,u,O=this.nodes){for(let p of O){let f=o(p.row)-D/2;if(p.row%2===1&&(e.fillStyle=g.rowAlt,e.fillRect(0,f,t,D)),(p.row===this.hoverRow||p.commit.hash===u)&&(e.fillStyle=p.commit.hash===u?g.rowSelected:g.rowHover,this.roundRect(e,6,f+3,t-12,D-6,8),e.fill()),p.commit.branches.length||p.commit.tags.length){let _=n(p.lane)+c+8;this.drawRefPill(e,_,o(p.row),p.commit,g)}}}drawGuides(e,t,n,o){e.save(),e.strokeStyle=o.guide,e.lineWidth=1,e.setLineDash([3,5]);let c=t,g=t+n,u=e.canvas.clientWidth,O=this.laneStep(u);for(let p=0;p<this.laneCount;p++){let f=this.xOfLane(p,u,O);e.beginPath(),e.moveTo(f,c),e.lineTo(f,g),e.stroke()}e.restore()}ensureCanvasSize(e,t,n,o){let c=Math.floor(t*o),g=Math.floor(n*o);this.canvasSize.width===c&&this.canvasSize.height===g&&this.canvasSize.dpr===o||(this.canvasSize={width:c,height:g,dpr:o},e.width=c,e.height=g,e.style.width=`${t}px`,e.style.height=`${n}px`)}laneStep(e){if(this.laneCount<=1)return ae;let t=Math.max(1,e-se*2-Ne*2);return Math.min(ae,t/(this.laneCount-1))}nodeRadius(e){return Math.max(2,Math.min(Ne,e/2-.5))}xOfLane(e,t,n){if(this.laneCount<=1)return Math.min(t/2,se+ae/2);let o=(this.laneCount-1)*n;return Math.max(se+Ne,(t-o)/2)+e*n}requestIdle(e){let t=window.requestIdleCallback;return t?t(e,{timeout:100}):window.setTimeout(()=>e(),16)}cancelIdleLayout(){this.idleHandle!==null&&(window.cancelIdleCallback?window.cancelIdleCallback(this.idleHandle):clearTimeout(this.idleHandle),this.idleHandle=null)}drawEdge(e,t,n,o,c){if(e.beginPath(),e.moveTo(t,n),t===o)e.lineTo(o,c);else{let g=n+Math.min(D*.75,Math.max(12,(c-n)*.36));e.bezierCurveTo(t,g,o,g,o,c)}e.stroke()}drawRefPill(e,t,n,o,c){let g=o.tags[0]??o.branches.find(_=>!Ut(_));if(!g)return;let u=Math.max(0,e.canvas.clientWidth-t-8);if(u<28)return;let O=Kt(g,u>72?12:8);e.font="600 10px ui-sans-serif, system-ui, sans-serif";let p=Math.min(u,72,e.measureText(O).width+14),f=18;e.fillStyle=o.tags.length?c.warningSoft:c.accentSoft,this.roundRect(e,t,n-f/2,p,f,999),e.fill(),e.fillStyle=o.tags.length?c.warning:c.accent,e.fillText(O,t+7,n+3.5)}onClick(e){let t=this.nodeFromEvent(e);t&&this.state.selectHash(t.commit.hash)}onMouseMove(e){let t=this.nodeFromEvent(e),n=t?.row??-1;n!==this.hoverRow&&(this.hoverRow=n,this.canvasRef.nativeElement.style.cursor=t?"pointer":"default",this.draw()),this.hoverTip.set(t?this.tipFromEvent(e,t):null)}tipFromEvent(e,t){let n=this.scrollRef.nativeElement,o=n.getBoundingClientRect(),c=Math.min(280,Math.max(180,o.width-24)),g=e.clientX-o.left,u=e.clientY-o.top,O=Math.max(12,Math.min(g+14,o.width-c-12)),p=n.scrollTop+Math.max(12,Math.min(u+14,o.height-128)),f=t.commit;return{x:O,y:p,subject:f.subject,shortHash:f.shortHash,author:f.author,date:f.date,refs:[...f.tags,...f.branches].join(", "),isMerge:f.isMerge}}onMouseLeave(){this.hoverRow!==-1&&(this.hoverRow=-1,this.hoverTip.set(null),this.canvasRef.nativeElement.style.cursor="default",this.draw())}nodeFromEvent(e){let t=this.scrollRef?.nativeElement,n=t?.getBoundingClientRect();if(!n)return;let o=e.clientY-n.top+(t?.scrollTop??0),c=Math.floor((o-le)/D);return this.nodes[c]}readTheme(e){let t=getComputedStyle(e);return{accent:this.css(t,"--accent","#4f46e5"),accentSoft:this.css(t,"--accent-soft","#eef2ff"),guide:this.css(t,"--graph-guide","rgba(148, 163, 184, 0.28)"),nodeRing:this.css(t,"--graph-node-ring","#ffffff"),rowAlt:this.css(t,"--graph-row-alt","rgba(15, 23, 42, 0.025)"),rowHover:this.css(t,"--graph-row-hover","rgba(79, 70, 229, 0.08)"),rowSelected:this.css(t,"--graph-row-selected","rgba(79, 70, 229, 0.14)"),shadow:this.css(t,"--graph-shadow","rgba(15, 23, 42, 0.12)"),surface:this.css(t,"--bg-panel","#ffffff"),warning:this.css(t,"--warning","#d97706"),warningSoft:"rgba(217, 119, 6, 0.15)"}}css(e,t,n){return e.getPropertyValue(t).trim()||n}roundRect(e,t,n,o,c,g){let u=Math.min(g,o/2,c/2);e.beginPath(),e.moveTo(t+u,n),e.arcTo(t+o,n,t+o,n+c,u),e.arcTo(t+o,n+c,t,n+c,u),e.arcTo(t,n+c,t,n,u),e.arcTo(t,n,t+o,n,u),e.closePath()}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-commit-graph"]],viewQuery:function(t,n){if(t&1&&(te(jt,7),te(Gt,7)),t&2){let o;ne(o=ie())&&(n.canvasRef=o.first),ne(o=ie())&&(n.scrollRef=o.first)}},hostBindings:function(t,n){t&1&&w("resize",function(){return n.onResize()},pe)},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(t,n){t&1&&(s(0,"div",2)(1,"div",3)(2,"span"),l(3,"Graph"),r(),s(4,"span",4),l(5),r()(),s(6,"div",5),v(7,Bt,1,2,"span",6),r()(),s(8,"div",7,0),b(10,"div",8)(11,"canvas",9,1),v(13,Yt,14,13,"div",10)(14,Qt,2,0,"div",11),r()),t&2&&(a(5),h(n.graphSummary()),a(2),d("ngForOf",n.legendColors),a(3),J("height",n.contentHeight(),"px"),a(3),d("ngIf",n.hoverTip()),a(),d("ngIf",!n.state.commits().length&&!n.state.loading()))},dependencies:[H,Q,N,Z],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 Ut(i){return i.startsWith("origin/")||i.includes("/origin/")}function Kt(i,e){return i.length>e?`${i.slice(0,Math.max(1,e-1))}...`:i}function Xt(i,e){i&1&&b(0,"span",24)}function Jt(i,e){if(i&1&&(s(0,"span",28),l(1),r()),i&2){let t=e.$implicit;d("title",t),a(),h(t)}}function Zt(i,e){if(i&1&&(s(0,"span",29),l(1),r()),i&2){let t=e.$implicit;d("title",t),a(),h(t)}}function en(i,e){if(i&1&&(s(0,"span",25),v(1,Jt,2,2,"span",26)(2,Zt,2,2,"span",27),r()),i&2){let t=x().$implicit;a(),d("ngForOf",t.tags),a(),d("ngForOf",t.branches)}}function tn(i,e){if(i&1&&(s(0,"span",30),l(1),r()),i&2){let t=e.ngIf;a(),h(t)}}function nn(i,e){if(i&1){let t=A();s(0,"button",7),w("click",function(){let o=P(t).$implicit,c=x();return k(c.select(o))}),s(1,"span",8),b(2,"span",9),v(3,Xt,1,0,"span",10),r(),s(4,"span",11)(5,"span",12)(6,"span",13),l(7),r(),v(8,en,3,2,"span",14),r(),s(9,"span",15)(10,"span",16),l(11),r(),s(12,"span",17),l(13,"\u2022"),r(),s(14,"span",18),l(15),r(),s(16,"span",17),l(17,"\u2022"),r(),s(18,"span",19),j(19,"date"),l(20),j(21,"date"),r()(),s(22,"span",20)(23,"span",21),l(24),r(),s(25,"span",22)(26,"span",16),l(27),r(),s(28,"span"),l(29),r(),s(30,"span"),l(31),j(32,"date"),r()(),v(33,tn,2,1,"span",23),r()()()}if(i&2){let t=e.$implicit,n=e.index,o=x();W("selected",t.hash===o.selectedHash()),de("aria-current",t.hash===o.selectedHash()?"true":null),a(2),J("background",o.laneColor(t)),W("merge",t.isMerge),a(),d("ngIf",n<o.commits().length-1),a(3),d("title",t.subject),a(),h(t.subject),a(),d("ngIf",t.branches.length||t.tags.length),a(3),h(t.shortHash),a(3),d("title",t.author),a(),h(t.author),a(3),d("title",q(19,21,t.date,"MMM d, y, h:mm a")),a(2),z(" ",q(21,24,t.date,"MMM d, y, h:mm a")," "),a(4),h(t.subject),a(3),h(t.shortHash),a(2),h(t.author),a(2),h(q(32,27,t.date,"MMM d, y, h:mm a")),a(2),d("ngIf",o.refsFor(t))}}function on(i,e){i&1&&(s(0,"div",31)(1,"p"),l(2,"No commits match your filters."),r()())}var Pe=class i{state=M(G);commits=this.state.commits;selectedHash=this.state.selectedHash;refsCache=new Map;laneColorCache=new Map;trackByHash(e,t){return t.hash}select(e){this.state.selectHash(e.hash)}refsFor(e){let t=this.refsCache.get(e.hash);if(t!==void 0)return t;let n=[...e.tags,...e.branches].join(", ");return this.refsCache.set(e.hash,n),n}laneColors=["#4f46e5","#06b6d4","#f59e0b","#ef4444","#10b981","#8b5cf6"];laneColor(e){let t=this.laneColorCache.get(e.hash);if(t)return t;let n=0,o=e.branches[0]??e.parents[0]??e.hash;for(let g=0;g<o.length;g++)n=n*31+o.charCodeAt(g)>>>0;let c=this.laneColors[n%this.laneColors.length];return this.laneColorCache.set(e.hash,c),c}onKey(e){if(!this.isTyping(e.target)){if(e.key==="j")e.preventDefault(),this.state.selectByOffset(1);else if(e.key==="k")e.preventDefault(),this.state.selectByOffset(-1);else if(e.key==="g"){e.preventDefault();let t=this.state.commits();t.length&&this.state.selectHash(t[0].hash)}else if(e.key==="G"){e.preventDefault();let t=this.state.commits();t.length&&this.state.selectHash(t[t.length-1].hash)}}}isTyping(e){return e instanceof HTMLElement?["INPUT","TEXTAREA","SELECT"].includes(e.tagName)||e.isContentEditable:!1}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-commit-list"]],hostBindings:function(t,n){t&1&&w("keydown",function(c){return n.onKey(c)},pe)},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(t,n){t&1&&(s(0,"div",0)(1,"span",1),l(2),r(),s(3,"span",2)(4,"kbd",3),l(5,"j"),r(),l(6,"/"),s(7,"kbd",3),l(8,"k"),r(),l(9," navigate "),r()(),s(10,"cdk-virtual-scroll-viewport",4),v(11,nn,34,30,"button",5)(12,on,3,0,"div",6),r()),t&2&&(a(2),ue("",n.commits().length," of ",n.state.total()),a(8),d("itemSize",68),a(),d("cdkVirtualForOf",n.commits())("cdkVirtualForTrackBy",n.trackByHash),a(),d("ngIf",!n.commits().length&&!n.state.loading()))},dependencies:[H,Q,N,pt,lt,mt,ct,Z],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 ke=class i{http=M(xe);base="/api";cache=new _e(50);list(e={}){let t=new Xe;for(let[n,o]of Object.entries(e))o&&(t=t.set(n,String(o)));return this.cache.get(`groups:${t.toString()}`,()=>this.http.get(`${this.base}/groups`,{params:t}),be.VOLATILE)}invalidate(){this.cache.clear()}static \u0275fac=function(t){return new(t||i)};static \u0275prov=me({token:i,factory:i.\u0275fac,providedIn:"root"})};function rn(i,e){if(i&1&&(s(0,"span",7),l(1),r()),i&2){let t=e.ngIf;a(),z("",t," groups")}}function an(i,e){i&1&&(s(0,"div",8),l(1,"Loading groups\u2026"),r())}function sn(i,e){if(i&1&&(s(0,"div",9),l(1),r()),i&2){let t=e.ngIf;a(),h(t)}}function ln(i,e){i&1&&(s(0,"div",8),l(1," No groups detected. Try the flat view. "),r())}function cn(i,e){if(i&1&&(s(0,"span",18),l(1),r()),i&2){let t=x().$implicit;a(),z("#",t.prNumber)}}function mn(i,e){if(i&1){let t=A();s(0,"li",21),w("click",function(){let o=P(t).$implicit,c=x(3);return k(c.state.selectHash(o))}),s(1,"code",22),l(2),r(),s(3,"span",23),l(4),r()()}if(i&2){let t=e.$implicit,n=x(3);W("selected",t===n.state.selectedHash()),a(2),h(n.shortHash(t)),a(2),h(n.subjectFor(t))}}function pn(i,e){if(i&1&&(s(0,"ul",19),v(1,mn,5,4,"li",20),r()),i&2){let t=x().$implicit;a(),d("ngForOf",t.commits)}}function dn(i,e){if(i&1){let t=A();s(0,"li",10)(1,"button",11),w("click",function(){let o=P(t).$implicit,c=x();return k(c.toggle(o.id))}),s(2,"span",12),l(3,"\u25B8"),r(),s(4,"span",13),l(5),r(),v(6,cn,2,1,"span",14),s(7,"span",15),l(8),r(),s(9,"span",16),l(10),r()(),v(11,pn,2,1,"ul",17),r()}if(i&2){let t=e.$implicit,n=x();W("expanded",n.isExpanded(t.id)),a(2),W("open",n.isExpanded(t.id)),a(2),Qe("src-"+t.source),a(),h(n.sourceLabel(t.source)),a(),d("ngIf",t.prNumber),a(2),h(t.title),a(2),h(t.commits.length),a(),d("ngIf",n.isExpanded(t.id))}}var Se=class i{state=M(G);groupsApi=M(ke);groups=S(null);loading=S(!1);error=S(null);expanded=S(new Set);subjectMap=K(()=>{let e=new Map;for(let t of this.state.commits())e.set(t.hash,t.subject);return e});constructor(){Y(()=>{let e=this.state.filters();this.load(e.since,e.until,e.author,e.branch)})}isExpanded(e){return this.expanded().has(e)}toggle(e){let t=new Set(this.expanded());t.has(e)?t.delete(e):t.add(e),this.expanded.set(t)}shortHash(e){return e.slice(0,7)}subjectFor(e){return this.subjectMap().get(e)??e.slice(0,7)}sourceLabel(e){switch(e){case"merge":return"PR";case"squash":return"PR (sq)";case"conventional":return"Feat";case"standalone":return"commit"}}load(e,t,n,o){this.loading.set(!0),this.error.set(null),this.groupsApi.list({since:e,until:t,author:n,branch:o}).subscribe({next:c=>{this.groups.set(c),this.loading.set(!1);let g=c.find(u=>u.prNumber);g&&this.expanded.set(new Set([g.id]))},error:c=>{this.error.set(this.errMsg(c)),this.loading.set(!1)}})}errMsg(e){if(e&&typeof e=="object"&&"error"in e){let t=e.error;if(t?.error)return t.error}return e instanceof Error?e.message:"Failed to load groups"}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({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(t,n){if(t&1&&(s(0,"div",0)(1,"span",1),l(2,"PR / feature groups"),r(),v(3,rn,2,1,"span",2),r(),v(4,an,2,0,"div",3)(5,sn,2,1,"div",4)(6,ln,2,0,"div",3),s(7,"ul",5),v(8,dn,12,11,"li",6),r()),t&2){let o,c;a(3),d("ngIf",(o=n.groups())==null?null:o.length),a(),d("ngIf",n.loading()),a(),d("ngIf",n.error()),a(),d("ngIf",!n.loading()&&!n.error()&&(((c=n.groups())==null?null:c.length)??0)===0),a(2),d("ngForOf",n.groups())}},dependencies:[H,Q,N],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 gn(i,e){i&1&&(ge(0),b(1,"app-grouped-list"),fe())}function fn(i,e){i&1&&b(0,"app-commit-list")}var ut=class i{state=M(G);static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({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(t,n){if(t&1&&(s(0,"main",1)(1,"aside",2),b(2,"app-commit-graph"),r(),s(3,"section",3)(4,"div",4),v(5,gn,2,0,"ng-container",5)(6,fn,1,0,"ng-template",null,0,ve),r()(),s(8,"section",6)(9,"div",7),b(10,"app-commit-detail"),r()()()),t&2){let o=he(7);a(5),d("ngIf",n.state.viewMode()==="grouped")("ngIfElse",o)}},dependencies:[H,N,Oe,Pe,we,Se],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{ut as HomeShellComponent};
1
+ import{a as ot,b as rt,c as ft}from"./chunk-UC5UORBU.js";import{a as lt,b as ct,c as mt,d as pt,e as dt}from"./chunk-COLUQZLF.js";import{a as G}from"./chunk-VDZMKPJL.js";import{g as gt}from"./chunk-Y6GOUMAT.js";import{b as Je,e as Ze}from"./chunk-Q72JIHF2.js";import{a as et,b as tt,c as nt,h as it}from"./chunk-HHK3LJFN.js";import{a as at}from"./chunk-5ISCQDR6.js";import{a as st}from"./chunk-5K2HNBK3.js";import{$a as L,Ab as w,Ac as Xe,Bb as x,Bc as xe,E as Ae,Ec as _e,Fb as te,Fc as be,Gb as ne,Hb as ie,Ib as he,Jb as J,Kb as W,Lb as Qe,Mb as l,Na as We,Nb as h,Ob as z,Pb as ue,Qa as pe,Qb as Ue,S as je,Sa as a,Sb as De,Tb as Te,U as Ie,Ub as Fe,X as me,Xa as qe,Yb as j,Zb as Ke,_b as q,aa as M,ac as ve,cb as Ye,eb as v,ec as K,fa as P,fc as Y,ga as k,ha as Ge,nb as de,pa as S,qb as d,r as Ee,rb as s,rc as Q,sb as r,sc as N,ta as Be,tb as b,tc as Z,vc as H,xb as ge,yb as fe,zb as A}from"./chunk-MTI6UKQ3.js";var Ce=class i{http=M(xe);base="/api";cache=new _e(200);list(e){return this.cache.get(e,()=>this.http.get(`${this.base}/annotations/${e}`),be.VOLATILE)}add(e,t,n){return this.http.post(`${this.base}/annotations/${e}`,{author:t,body:n}).pipe(Ie(()=>this.cache.invalidate(e)))}remove(e,t){return this.http.delete(`${this.base}/annotations/${e}/${t}`).pipe(Ie(()=>this.cache.invalidate(e)))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=me({token:i,factory:i.\u0275fac,providedIn:"root"})};var vt=["svg"];function xt(i,e){i&1&&(s(0,"div",11),l(1," No graph data \u2014 changed files have no detectable internal imports. "),r())}var ye=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 e=this.svgRef.nativeElement,t=gt(e);t.selectAll("*").remove();let n=this.impact;if(!n||n.dependencyRipple.length===0&&n.modules.length===0){this.hasData=!1;return}this.hasData=!0;let o=new Map,c=(m,E,V)=>{let R=o.get(m);return R||(R={id:m,group:E,label:V},o.set(m,R)),R};for(let m of n.files)c(`f:${m}`,"changed",Re(m));for(let m of n.modules)c(`m:${m}`,"module",m);for(let m of n.dependencyRipple)c(`f:${m.from}`,"changed",Re(m.from)),c(`f:${m.to}`,"imported",Re(m.to));let g=[];for(let m of n.dependencyRipple)g.push({source:`f:${m.from}`,target:`f:${m.to}`,type:"imports"});for(let m of n.files){let E=Ct(m);n.modules.includes(E)&&g.push({source:`f:${m}`,target:`m:${E}`,type:"in-module"})}let u=Array.from(o.values()),O=e.parentElement?.clientWidth??640,p=u.filter(m=>m.group==="module").sort(Le),f=u.filter(m=>m.group==="changed").sort(Le),_=u.filter(m=>m.group==="imported").sort(Le),C=Math.max(p.length,f.length,_.length,4),T=44,$=58,F={module:68,changed:430,imported:780},I=Math.max(O,F.imported+Math.max(320,_t(_))+80),B=Math.max(360,$+C*T+40);t.attr("width",I).attr("height",B).attr("viewBox",`0 0 ${I} ${B}`),t.append("rect").attr("width",I).attr("height",B).attr("fill","transparent"),t.append("g").selectAll("text").data([{label:"Modules",x:F.module},{label:"Changed files",x:F.changed},{label:"Import dependencies",x:F.imported}]).join("text").attr("class","column-title").attr("x",m=>m.x).attr("y",28).text(m=>m.label),ze(p,F.module,$,T),ze(f,F.changed,$,T),ze(_,F.imported,$,T);let $e=t.append("g").selectAll("path").data(g).join("path").attr("class",m=>`impact-link ${m.type}`).attr("d",m=>{let E=o.get(String(m.source)),V=o.get(String(m.target));return E&&V?bt(E,V):""});t.append("g").selectAll("circle").data(u).join("circle").attr("r",m=>m.group==="module"?7:5).attr("fill",m=>m.group==="changed"?"var(--accent)":m.group==="imported"?"#f59e0b":"#8b5cf6").attr("stroke","var(--bg-surface-2)").attr("stroke-width",1.5).attr("cx",m=>m.x??0).attr("cy",m=>m.y??0).append("title").text(m=>`${m.group}: ${m.id.slice(2)}`);let ce=t.append("g").selectAll("rect").data(u).join("rect").attr("class","label-bg").attr("width",m=>ht(m)).attr("height",18).attr("rx",5).attr("ry",5).attr("x",m=>(m.x??0)+10).attr("y",m=>(m.y??0)-11),y=t.append("g").selectAll("text").data(u).join("text").attr("class",m=>`node-label ${m.group}`).attr("x",m=>(m.x??0)+14).attr("y",m=>(m.y??0)+4).text(m=>m.label);this.simulation?.stop(),this.simulation=null}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-impact-graph"]],viewQuery:function(t,n){if(t&1&&te(vt,7),t&2){let o;ne(o=ie())&&(n.svgRef=o.first)}},inputs:{impact:"impact"},features:[Be],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(t,n){t&1&&(s(0,"div",1)(1,"div",2)(2,"span",3),b(3,"span",4),l(4,"changed file"),r(),s(5,"span",3),b(6,"span",5),l(7,"import dependency"),r(),s(8,"span",3),b(9,"span",6),l(10,"module"),r()(),s(11,"span",7),l(12,"Scroll to explore. Lines show module membership and imports."),r()(),s(13,"div",8),Ge(),b(14,"svg",9,0),v(16,xt,2,0,"div",10),r()),t&2&&(a(16),d("ngIf",!n.hasData))},dependencies:[H,N],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 Re(i){let e=i.split("/");return e[e.length-1]}function ht(i){let e=i.label.length;return Math.max(112,Math.min(520,e*6.7+18))}function _t(i){return Math.max(0,...i.map(e=>ht(e)))}function Le(i,e){return i.label.localeCompare(e.label)}function ze(i,e,t,n){for(let[o,c]of i.entries())c.x=e,c.y=t+o*n}function bt(i,e){let t=i.x??0,n=i.y??0,o=e.x??0,c=e.y??0,g=Math.max(72,Math.abs(o-t)*.42),u=o>=t?1:-1;return`M ${t} ${n} C ${t+u*g} ${n}, ${o-u*g} ${c}, ${o} ${c}`}function Ct(i){let e=i.split("/");return e.length===1?"(root)":e.slice(0,Math.min(e.length-1,3)).join("/")}var Me=class i{constructor(e){this.sanitizer=e}cache=new Map;transform(e){if(!e)return"";let t=this.cache.get(e);if(t)return t;let n=this.sanitizer.bypassSecurityTrustHtml(yt(e));if(this.cache.set(e,n),this.cache.size>50){let o=this.cache.keys().next().value;o&&this.cache.delete(o)}return n}static \u0275fac=function(t){return new(t||i)(qe(Je,16))};static \u0275pipe=Ye({name:"markdown",type:i,pure:!0})};function yt(i){let e=Mt(i);return e=e.replace(/```(\w*)\n([\s\S]*?)```/g,(t,n,o)=>`<pre><code>${o.trim()}</code></pre>`),e=e.replace(/`([^`]+)`/g,"<code>$1</code>"),e=e.replace(/^### (.+)$/gm,"<h4>$1</h4>"),e=e.replace(/^## (.+)$/gm,"<h3>$1</h3>"),e=e.replace(/^# (.+)$/gm,"<h2>$1</h2>"),e=e.replace(/\*\*\*(.+?)\*\*\*/g,"<strong><em>$1</em></strong>"),e=e.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),e=e.replace(/\*(.+?)\*/g,"<em>$1</em>"),e=e.replace(/^(\s*)[-*] (.+)$/gm,(t,n,o)=>`<li data-depth="${Math.floor(n.length/2)}">${o}</li>`),e=e.replace(/((?:<li[^>]*>.*<\/li>\n?)+)/g,"<ul>$1</ul>"),e=e.replace(/^\d+\.\s+(.+)$/gm,"<li>$1</li>"),e=e.replace(/((?:<li>.*<\/li>\n?){2,})/g,t=>t.includes("data-depth")?t:`<ol>${t}</ol>`),e=e.replace(/\n{2,}/g,"</p><p>"),e=`<p>${e}</p>`,e=e.replace(/<p>\s*(<(?:h[2-4]|ul|ol|pre|blockquote)[^>]*>)/g,"$1"),e=e.replace(/(<\/(?:h[2-4]|ul|ol|pre|blockquote)>)\s*<\/p>/g,"$1"),e=e.replace(/<p>\s*<\/p>/g,""),e=e.replace(/\n/g,"<br>"),e}function Mt(i){return i.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function wt(i,e){if(i&1&&(s(0,"span",36),l(1),r()),i&2){let t=e.$implicit;a(),h(t)}}function Ot(i,e){if(i&1&&(s(0,"span",37),l(1),r()),i&2){let t=e.$implicit;a(),h(t)}}function Pt(i,e){i&1&&(s(0,"span",38),l(1,"merge"),r())}function kt(i,e){if(i&1&&(s(0,"pre",39),l(1),r()),i&2){let t=x().ngIf;a(),h(t.body)}}function St(i,e){if(i&1){let t=A();s(0,"div",40)(1,"span",41),l(2,"AI"),r(),b(3,"div",42),j(4,"markdown"),s(5,"button",43),w("click",function(){P(t);let o=x(2);return k(o.explanation.set(null))}),l(6,"\xD7"),r()()}if(i&2){let t=e.ngIf;a(3),d("innerHTML",Ke(4,1,t),We)}}function Et(i,e){if(i&1&&(s(0,"div",44),l(1),r()),i&2){let t=e.ngIf;a(),h(t)}}function It(i,e){if(i&1&&(s(0,"li"),l(1),r()),i&2){let t=e.$implicit;a(),h(t)}}function Dt(i,e){if(i&1){let t=A();s(0,"li",28),w("click",function(){let o=P(t).$implicit,c=x(3);return k(c.state.selectHash(o.hash))}),s(1,"code"),l(2),r(),s(3,"span"),l(4),r()()}if(i&2){let t=e.$implicit;a(2),h(t.hash.slice(0,7)),a(2),h(t.subject)}}function Tt(i,e){if(i&1&&(s(0,"div",45)(1,"div",46)(2,"span"),l(3,"Impact"),r(),s(4,"span",47),l(5),r()(),b(6,"app-impact-graph",48),s(7,"div",49)(8,"div")(9,"h4"),l(10,"Modules"),r(),s(11,"ul",50),v(12,It,2,1,"li",51),r()(),s(13,"div")(14,"h4"),l(15,"Related commits"),r(),s(16,"ul",52),v(17,Dt,5,2,"li",53),r()()()()),i&2){let t=e.ngIf;a(5),Ue(" ",t.files.length," files \xB7 ",t.modules.length," modules \xB7 ",t.relatedCommits.length," related commits "),a(),d("impact",t),a(6),d("ngForOf",t.modules),a(5),d("ngForOf",t.relatedCommits)}}function Ft(i,e){if(i&1&&(s(0,"span",54),l(1),r()),i&2){let t=x(2);a(),h(t.files().length)}}function Rt(i,e){if(i&1&&(s(0,"span",64),l(1),r()),i&2){let t=x().$implicit;a(),z("+",t.additions)}}function Lt(i,e){if(i&1&&(s(0,"span",65),l(1),r()),i&2){let t=x().$implicit;a(),z("\u2212",t.deletions)}}function zt(i,e){if(i&1){let t=A();s(0,"div",55)(1,"button",56),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.selectFile(o))}),b(2,"span",57),s(3,"span",58),l(4),r(),s(5,"span",59),v(6,Rt,2,1,"span",60)(7,Lt,2,1,"span",61),r()(),s(8,"button",62),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.openFileHistory(o.file))}),l(9," \u23F1 "),r(),s(10,"button",63),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.openFileBreakage(o.file))}),l(11," \u26A0 "),r()()}if(i&2){let t,n=e.$implicit,o=x(2);a(),W("selected",n.file===((t=o.activeFile())==null?null:t.file)),a(),de("data-status",n.status),a(),d("title",n.file),a(),h(n.file),a(2),d("ngIf",n.additions),a(),d("ngIf",n.deletions)}}function Nt(i,e){i&1&&(s(0,"div",66),l(1,"No files changed."),r())}function Ht(i,e){i&1&&(s(0,"div",66),l(1,"Loading\u2026"),r())}function $t(i,e){if(i&1){let t=A();s(0,"div",67)(1,"div",68)(2,"strong"),l(3),r(),s(4,"span",69),l(5),j(6,"date"),r(),s(7,"button",70),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.deleteComment(o.id))}),l(8," \xD7 "),r()(),s(9,"p",71),l(10),r()()}if(i&2){let t=e.$implicit;a(3),h(t.author),a(2),h(q(6,3,t.createdAt,"short")),a(5),h(t.body)}}function Vt(i,e){if(i&1){let t=A();ge(0),s(1,"header",2)(2,"div",3)(3,"span",4),l(4),r(),s(5,"span",5),v(6,wt,2,1,"span",6)(7,Ot,2,1,"span",7)(8,Pt,2,0,"span",8),r()(),s(9,"h2",9),l(10),r(),s(11,"div",10)(12,"span"),l(13),r(),s(14,"span",11),l(15,"\u2022"),r(),s(16,"span"),l(17),j(18,"date"),r()(),v(19,kt,2,1,"pre",12),s(20,"div",13)(21,"button",14),w("click",function(){P(t);let o=x();return k(o.onExplain())}),l(22),r(),s(23,"button",14),w("click",function(){P(t);let o=x();return k(o.onLoadImpact())}),l(24),r(),s(25,"button",15),w("click",function(){P(t);let o=x();return k(o.copyShareLink())}),l(26),r()(),v(27,St,7,3,"div",16)(28,Et,2,1,"div",17),r(),v(29,Tt,18,6,"div",18),s(30,"div",19)(31,"aside",20)(32,"div",21)(33,"span"),l(34,"Files"),r(),v(35,Ft,2,1,"span",22),r(),s(36,"div",23),v(37,zt,12,7,"div",24)(38,Nt,2,0,"div",25)(39,Ht,2,0,"div",25),r()(),s(40,"section",26)(41,"details",27)(42,"summary",28),w("click",function(o){P(t);let c=x();return k(c.toggleAnnotations(o))}),l(43),r(),s(44,"div",29),v(45,$t,11,6,"div",30),s(46,"div",31)(47,"input",32),Fe("ngModelChange",function(o){P(t);let c=x();return Te(c.commentAuthor,o)||(c.commentAuthor=o),k(o)}),r(),s(48,"textarea",33),Fe("ngModelChange",function(o){P(t);let c=x();return Te(c.commentDraft,o)||(c.commentDraft=o),k(o)}),r(),s(49,"button",34),w("click",function(){P(t);let o=x();return k(o.addComment())}),l(50," Post "),r()()()(),b(51,"app-diff-viewer",35),r()(),fe()}if(i&2){let t=e.ngIf,n=x();a(4),h(t.shortHash),a(2),d("ngForOf",t.tags),a(),d("ngForOf",t.branches),a(),d("ngIf",t.isMerge),a(2),h(t.subject),a(3),ue("",t.author," <",t.authorEmail,">"),a(4),h(q(18,29,t.date,"medium")),a(2),d("ngIf",t.body),a(2),d("disabled",n.explaining()),a(),z(" ",n.explaining()?"...":"\u2728 Explain change"," "),a(),d("disabled",n.loadingImpact()),a(),z(" ",n.loadingImpact()?"...":n.impact()?"Refresh impact":"Show impact"," "),a(2),z(" ",n.shareCopied()?"Copied!":"\u{1F517} Share"," "),a(),d("ngIf",n.explanation()),a(),d("ngIf",n.explainError()),a(),d("ngIf",n.impact()),a(6),d("ngIf",n.files().length),a(2),d("ngForOf",n.files())("ngForTrackBy",n.trackByFile),a(),d("ngIf",!n.files().length&&!n.loading()),a(),d("ngIf",n.loading()),a(2),d("open",n.annotationsOpen()),a(2),z(" \u{1F4AC} Notes (",n.comments().length,") "),a(2),d("ngForOf",n.comments()),a(2),De("ngModel",n.commentAuthor),a(),De("ngModel",n.commentDraft),a(),d("disabled",!n.commentDraft.trim()),a(2),d("fileInput",n.activeFile())}}function At(i,e){i&1&&(s(0,"div",72)(1,"p",73),l(2,"No commit selected"),r(),s(3,"p",74),l(4," Pick a commit from the list, or press "),s(5,"kbd",75),l(6,"\u2318K"),r(),l(7," to open the command palette. "),r()())}var we=class i{state=M(G);git=M(at);insightsApi=M(st);annotationsApi=M(Ce);router=M(Ze);commit=this.state.selected;impact=S(null);loadingImpact=S(!1);explanation=S(null);explainError=S(null);explaining=S(!1);comments=S([]);annotationsOpen=S(!1);shareCopied=S(!1);commentDraft="";commentAuthor="me";loading=S(!1);files=rt(ot(this.commit).pipe(je(e=>e?(this.loading.set(!0),this.git.getDiff(e.hash).pipe(Ae(()=>Ee([])))):(this.loading.set(!1),Ee([])))),{initialValue:[]});activeFileIndex=S(0);activeFile=K(()=>{let e=this.files();if(!e.length)return null;let t=Math.min(this.activeFileIndex(),e.length-1);return e[t]});constructor(){Y(()=>{this.files(),this.activeFileIndex.set(0),this.loading.set(!1)}),Y(()=>{let e=this.commit();if(this.impact.set(null),this.explanation.set(null),this.explainError.set(null),this.shareCopied.set(!1),!e){this.comments.set([]);return}this.annotationsApi.list(e.hash).subscribe({next:t=>this.comments.set(t),error:()=>this.comments.set([])})})}trackByFile(e,t){return t.file}selectFile(e){let t=this.files().findIndex(n=>n.file===e.file);t>=0&&this.activeFileIndex.set(t)}openFileHistory(e){this.router.navigate(["/file",encodeURIComponent(e)])}openFileBreakage(e){this.router.navigate(["/file",encodeURIComponent(e)],{queryParams:{tab:"breakage"}})}shortPath(e){if(e.length<=32)return e;let t=e.split("/");return t.length<=2?e:t[0]+"/.../"+t.slice(-2).join("/")}onLoadImpact(){let e=this.commit();e&&(this.loadingImpact.set(!0),this.insightsApi.impact(e.hash).subscribe({next:t=>{this.impact.set(t),this.loadingImpact.set(!1)},error:()=>this.loadingImpact.set(!1)}))}onExplain(){let e=this.commit();!e||this.explaining()||(this.explaining.set(!0),this.explainError.set(null),this.insightsApi.explainCommit(e.hash).subscribe({next:t=>{this.explanation.set(t.summary),this.explaining.set(!1)},error:t=>{this.explainError.set(t?.error?.error??"AI explanation unavailable. Set ANTHROPIC_API_KEY or OPENAI_API_KEY."),this.explaining.set(!1)}}))}copyShareLink(){let e=this.commit();if(!e)return;let t=`${window.location.origin}/?commit=${e.hash}`;navigator.clipboard?.writeText(t).then(()=>{this.shareCopied.set(!0),setTimeout(()=>this.shareCopied.set(!1),1500)}).catch(()=>{this.shareCopied.set(!1)})}toggleAnnotations(e){setTimeout(()=>this.annotationsOpen.set(!this.annotationsOpen()),0)}addComment(){let e=this.commit();!e||!this.commentDraft.trim()||this.annotationsApi.add(e.hash,this.commentAuthor||"anonymous",this.commentDraft.trim()).subscribe({next:t=>{this.comments.set([...this.comments(),t]),this.commentDraft=""}})}deleteComment(e){let t=this.commit();t&&this.annotationsApi.remove(t.hash,e).subscribe({next:()=>this.comments.set(this.comments().filter(n=>n.id!==e))})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({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"],["title","Why did this break? Open breakage analysis","aria-label","Open breakage analysis for this file",1,"file-history","breakage",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(t,n){if(t&1&&v(0,Vt,52,32,"ng-container",1)(1,At,8,0,"ng-template",null,0,ve),t&2){let o=he(2);d("ngIf",n.commit())("ngIfElse",o)}},dependencies:[H,Q,N,it,et,tt,nt,dt,ye,Z,Me],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)}.file-history.breakage[_ngcontent-%COMP%]:hover{color:var(--danger, #dc2626)}.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 jt=["canvas"],Gt=["scroll"];function Bt(i,e){if(i&1&&b(0,"span",12),i&2){let t=e.$implicit;J("background",t)}}function Wt(i,e){i&1&&(s(0,"span",19),l(1,"merge"),r())}function qt(i,e){if(i&1&&(s(0,"div",20),l(1),r()),i&2){let t=x().ngIf;a(),h(t.refs)}}function Yt(i,e){if(i&1&&(s(0,"div",13)(1,"div",14)(2,"code"),l(3),r(),v(4,Wt,2,0,"span",15),r(),s(5,"div",16),l(6),r(),s(7,"div",17)(8,"span"),l(9),r(),s(10,"span"),l(11),j(12,"date"),r()(),v(13,qt,2,1,"div",18),r()),i&2){let t=e.ngIf;J("left",t.x,"px")("top",t.y,"px"),a(3),h(t.shortHash),a(),d("ngIf",t.isMerge),a(2),h(t.subject),a(3),h(t.author),a(2),h(q(12,10,t.date,"MMM d, y, h:mm a")),a(2),d("ngIf",t.refs)}}function Qt(i,e){i&1&&(s(0,"div",21),l(1," No commits to draw. "),r())}var D=34,ae=24,Ne=5.5,se=16,le=16,He=["#4f46e5","#06b6d4","#f59e0b","#ef4444","#10b981","#8b5cf6","#ec4899","#0ea5e9"],Oe=class i{state=M(G);theme=M(ft);legendColors=He.slice(0,5);graphSummary=K(()=>{let e=this.state.commits().length,t=this.laneCount;return e?`${e.toLocaleString()} commits across ${t} lane${t===1?"":"s"}`:"Swim-lane visualization"});contentHeight=K(()=>{let e=this.state.commits().length;return e?le*2+e*D:0});canvasRef;scrollRef;nodes=[];rowByHash=new Map;laneCount=1;hoverRow=-1;hoverTip=S(null);layoutToken=0;idleHandle=null;canvasSize={width:0,height:0,dpr:0};canvasTransform="";cachedTheme=null;onCanvasClick=e=>this.onClick(e);onCanvasMove=e=>this.onMouseMove(e);onCanvasLeave=()=>this.onMouseLeave();scrollRaf=0;onScroll=()=>{this.scrollRaf||(this.scrollRaf=requestAnimationFrame(()=>{this.scrollRaf=0,this.draw()}))};constructor(){Y(()=>{this.scheduleLayout(this.state.commits())}),Y(()=>{this.state.selectedHash(),this.draw()}),Y(()=>{this.theme.resolved(),this.cachedTheme=null,this.draw()})}ngAfterViewInit(){let e=this.canvasRef.nativeElement;e.addEventListener("click",this.onCanvasClick),e.addEventListener("mousemove",this.onCanvasMove),e.addEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.addEventListener("scroll",this.onScroll,{passive:!0}),this.draw()}ngOnDestroy(){let e=this.canvasRef?.nativeElement;e?.removeEventListener("click",this.onCanvasClick),e?.removeEventListener("mousemove",this.onCanvasMove),e?.removeEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.removeEventListener("scroll",this.onScroll),this.scrollRaf&&cancelAnimationFrame(this.scrollRaf),this.cancelIdleLayout()}onResize(){this.draw()}scheduleLayout(e){let t=++this.layoutToken;if(this.cancelIdleLayout(),this.nodes=[],this.rowByHash.clear(),this.hoverRow=-1,this.hoverTip.set(null),!e.length){this.laneCount=1,this.draw();return}let n=[],o=new Map,c=(f,_)=>{let C=n[f];C&&o.delete(C),n[f]=_,_&&o.set(_,f)},g=f=>{let _=o.get(f);if(_!==void 0)return _;let C=n.indexOf(null);return C>=0?(c(C,f),C):(c(n.length,f),n.length-1)},u=f=>{let _=e[f],C=g(_.hash),T={commit:_,row:f,lane:C};this.nodes.push(T),this.rowByHash.set(_.hash,T);let[$,...F]=_.parents;c(C,$??null);for(let I of F)if(!o.has(I)){let B=n.indexOf(null);B>=0?c(B,I):c(n.length,I)}for(;n.length&&n[n.length-1]===null;)n.pop();C+1>this.laneCount&&(this.laneCount=C+1)};if(this.laneCount=1,e.length<=5e3){for(let f=0;f<e.length;f++)u(f);this.draw();return}let O=0,p=f=>{if(t!==this.layoutToken)return;let _=performance.now();for(;O<e.length;){u(O++);let C=f?.timeRemaining?.()??0;if(O%250===0&&C<=1&&performance.now()-_>8)break}this.draw(),O<e.length&&t===this.layoutToken&&(this.idleHandle=this.requestIdle(p))};this.idleHandle=this.requestIdle(p)}draw(){let e=this.canvasRef?.nativeElement;if(!e)return;let t=this.scrollRef?.nativeElement,n=window.devicePixelRatio||1,o=t?.scrollTop??0,c=t?.clientHeight??0,g=Math.max(t?.clientWidth??se*2+ae,se*2+ae),u=Math.max(c||D*8,D);this.ensureCanvasSize(e,g,u,n);let O=`translateY(${o}px)`;this.canvasTransform!==O&&(this.canvasTransform=O,e.style.transform=O);let p=e.getContext("2d"),f=this.cachedTheme??(this.cachedTheme=this.readTheme(e));if(p.setTransform(n,0,0,n,0,-o*n),p.clearRect(0,o,g,u),p.fillStyle=f.surface,p.fillRect(0,o,g,u),!this.nodes.length)return;let _=this.laneStep(g),C=this.nodeRadius(_),T=y=>this.xOfLane(y,g,_),$=y=>le+y*D+D/2,F=y=>He[y%He.length],I=this.state.selectedHash(),B=D*4,$e=Math.max(0,Math.floor((o-le-B)/D)),Ve=Math.min(this.nodes.length-1,Math.ceil((o+u-le+B)/D)),ce=this.nodes.slice($e,Ve+1);this.drawRows(p,g,T,$,C,f,I,ce),this.drawGuides(p,o,u,f),p.lineCap="round",p.lineJoin="round";for(let y of ce)for(let m of y.commit.parents){let E=this.rowByHash.get(m);if(!E)continue;let V=T(y.lane),R=$(y.row),ee=T(E.lane),X=$(E.row);p.strokeStyle=f.shadow,p.lineWidth=4,p.globalAlpha=.35,this.drawEdge(p,V,R,ee,X),p.strokeStyle=F(E.lane),p.lineWidth=y.commit.isMerge?2.6:2.2,p.globalAlpha=I&&I!==y.commit.hash&&I!==E.commit.hash?.55:.9,this.drawEdge(p,V,R,ee,X),p.globalAlpha=1}for(let y of ce){let m=T(y.lane),E=$(y.row),V=F(y.lane),R=y.commit.hash===I,ee=y.row===this.hoverRow,X=R?C+2:ee?C+1:C;p.beginPath(),p.arc(m,E,X+3,0,Math.PI*2),p.fillStyle=f.nodeRing,p.fill(),p.beginPath(),p.arc(m,E,X,0,Math.PI*2),p.fillStyle=y.commit.isMerge?f.surface:V,p.fill(),p.lineWidth=y.commit.isMerge||R?2.5:1.75,p.strokeStyle=V,p.stroke(),(R||ee)&&(p.beginPath(),p.arc(m,E,X+5,0,Math.PI*2),p.strokeStyle=V,p.globalAlpha=R?.42:.24,p.lineWidth=2,p.stroke(),p.globalAlpha=1)}}drawRows(e,t,n,o,c,g,u,O=this.nodes){for(let p of O){let f=o(p.row)-D/2;if(p.row%2===1&&(e.fillStyle=g.rowAlt,e.fillRect(0,f,t,D)),(p.row===this.hoverRow||p.commit.hash===u)&&(e.fillStyle=p.commit.hash===u?g.rowSelected:g.rowHover,this.roundRect(e,6,f+3,t-12,D-6,8),e.fill()),p.commit.branches.length||p.commit.tags.length){let _=n(p.lane)+c+8;this.drawRefPill(e,_,o(p.row),p.commit,g)}}}drawGuides(e,t,n,o){e.save(),e.strokeStyle=o.guide,e.lineWidth=1,e.setLineDash([3,5]);let c=t,g=t+n,u=e.canvas.clientWidth,O=this.laneStep(u);for(let p=0;p<this.laneCount;p++){let f=this.xOfLane(p,u,O);e.beginPath(),e.moveTo(f,c),e.lineTo(f,g),e.stroke()}e.restore()}ensureCanvasSize(e,t,n,o){let c=Math.floor(t*o),g=Math.floor(n*o);this.canvasSize.width===c&&this.canvasSize.height===g&&this.canvasSize.dpr===o||(this.canvasSize={width:c,height:g,dpr:o},e.width=c,e.height=g,e.style.width=`${t}px`,e.style.height=`${n}px`)}laneStep(e){if(this.laneCount<=1)return ae;let t=Math.max(1,e-se*2-Ne*2);return Math.min(ae,t/(this.laneCount-1))}nodeRadius(e){return Math.max(2,Math.min(Ne,e/2-.5))}xOfLane(e,t,n){if(this.laneCount<=1)return Math.min(t/2,se+ae/2);let o=(this.laneCount-1)*n;return Math.max(se+Ne,(t-o)/2)+e*n}requestIdle(e){let t=window.requestIdleCallback;return t?t(e,{timeout:100}):window.setTimeout(()=>e(),16)}cancelIdleLayout(){this.idleHandle!==null&&(window.cancelIdleCallback?window.cancelIdleCallback(this.idleHandle):clearTimeout(this.idleHandle),this.idleHandle=null)}drawEdge(e,t,n,o,c){if(e.beginPath(),e.moveTo(t,n),t===o)e.lineTo(o,c);else{let g=n+Math.min(D*.75,Math.max(12,(c-n)*.36));e.bezierCurveTo(t,g,o,g,o,c)}e.stroke()}drawRefPill(e,t,n,o,c){let g=o.tags[0]??o.branches.find(_=>!Ut(_));if(!g)return;let u=Math.max(0,e.canvas.clientWidth-t-8);if(u<28)return;let O=Kt(g,u>72?12:8);e.font="600 10px ui-sans-serif, system-ui, sans-serif";let p=Math.min(u,72,e.measureText(O).width+14),f=18;e.fillStyle=o.tags.length?c.warningSoft:c.accentSoft,this.roundRect(e,t,n-f/2,p,f,999),e.fill(),e.fillStyle=o.tags.length?c.warning:c.accent,e.fillText(O,t+7,n+3.5)}onClick(e){let t=this.nodeFromEvent(e);t&&this.state.selectHash(t.commit.hash)}onMouseMove(e){let t=this.nodeFromEvent(e),n=t?.row??-1;n!==this.hoverRow&&(this.hoverRow=n,this.canvasRef.nativeElement.style.cursor=t?"pointer":"default",this.draw()),this.hoverTip.set(t?this.tipFromEvent(e,t):null)}tipFromEvent(e,t){let n=this.scrollRef.nativeElement,o=n.getBoundingClientRect(),c=Math.min(280,Math.max(180,o.width-24)),g=e.clientX-o.left,u=e.clientY-o.top,O=Math.max(12,Math.min(g+14,o.width-c-12)),p=n.scrollTop+Math.max(12,Math.min(u+14,o.height-128)),f=t.commit;return{x:O,y:p,subject:f.subject,shortHash:f.shortHash,author:f.author,date:f.date,refs:[...f.tags,...f.branches].join(", "),isMerge:f.isMerge}}onMouseLeave(){this.hoverRow!==-1&&(this.hoverRow=-1,this.hoverTip.set(null),this.canvasRef.nativeElement.style.cursor="default",this.draw())}nodeFromEvent(e){let t=this.scrollRef?.nativeElement,n=t?.getBoundingClientRect();if(!n)return;let o=e.clientY-n.top+(t?.scrollTop??0),c=Math.floor((o-le)/D);return this.nodes[c]}readTheme(e){let t=getComputedStyle(e);return{accent:this.css(t,"--accent","#4f46e5"),accentSoft:this.css(t,"--accent-soft","#eef2ff"),guide:this.css(t,"--graph-guide","rgba(148, 163, 184, 0.28)"),nodeRing:this.css(t,"--graph-node-ring","#ffffff"),rowAlt:this.css(t,"--graph-row-alt","rgba(15, 23, 42, 0.025)"),rowHover:this.css(t,"--graph-row-hover","rgba(79, 70, 229, 0.08)"),rowSelected:this.css(t,"--graph-row-selected","rgba(79, 70, 229, 0.14)"),shadow:this.css(t,"--graph-shadow","rgba(15, 23, 42, 0.12)"),surface:this.css(t,"--bg-panel","#ffffff"),warning:this.css(t,"--warning","#d97706"),warningSoft:"rgba(217, 119, 6, 0.15)"}}css(e,t,n){return e.getPropertyValue(t).trim()||n}roundRect(e,t,n,o,c,g){let u=Math.min(g,o/2,c/2);e.beginPath(),e.moveTo(t+u,n),e.arcTo(t+o,n,t+o,n+c,u),e.arcTo(t+o,n+c,t,n+c,u),e.arcTo(t,n+c,t,n,u),e.arcTo(t,n,t+o,n,u),e.closePath()}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-commit-graph"]],viewQuery:function(t,n){if(t&1&&(te(jt,7),te(Gt,7)),t&2){let o;ne(o=ie())&&(n.canvasRef=o.first),ne(o=ie())&&(n.scrollRef=o.first)}},hostBindings:function(t,n){t&1&&w("resize",function(){return n.onResize()},pe)},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(t,n){t&1&&(s(0,"div",2)(1,"div",3)(2,"span"),l(3,"Graph"),r(),s(4,"span",4),l(5),r()(),s(6,"div",5),v(7,Bt,1,2,"span",6),r()(),s(8,"div",7,0),b(10,"div",8)(11,"canvas",9,1),v(13,Yt,14,13,"div",10)(14,Qt,2,0,"div",11),r()),t&2&&(a(5),h(n.graphSummary()),a(2),d("ngForOf",n.legendColors),a(3),J("height",n.contentHeight(),"px"),a(3),d("ngIf",n.hoverTip()),a(),d("ngIf",!n.state.commits().length&&!n.state.loading()))},dependencies:[H,Q,N,Z],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 Ut(i){return i.startsWith("origin/")||i.includes("/origin/")}function Kt(i,e){return i.length>e?`${i.slice(0,Math.max(1,e-1))}...`:i}function Xt(i,e){i&1&&b(0,"span",24)}function Jt(i,e){if(i&1&&(s(0,"span",28),l(1),r()),i&2){let t=e.$implicit;d("title",t),a(),h(t)}}function Zt(i,e){if(i&1&&(s(0,"span",29),l(1),r()),i&2){let t=e.$implicit;d("title",t),a(),h(t)}}function en(i,e){if(i&1&&(s(0,"span",25),v(1,Jt,2,2,"span",26)(2,Zt,2,2,"span",27),r()),i&2){let t=x().$implicit;a(),d("ngForOf",t.tags),a(),d("ngForOf",t.branches)}}function tn(i,e){if(i&1&&(s(0,"span",30),l(1),r()),i&2){let t=e.ngIf;a(),h(t)}}function nn(i,e){if(i&1){let t=A();s(0,"button",7),w("click",function(){let o=P(t).$implicit,c=x();return k(c.select(o))}),s(1,"span",8),b(2,"span",9),v(3,Xt,1,0,"span",10),r(),s(4,"span",11)(5,"span",12)(6,"span",13),l(7),r(),v(8,en,3,2,"span",14),r(),s(9,"span",15)(10,"span",16),l(11),r(),s(12,"span",17),l(13,"\u2022"),r(),s(14,"span",18),l(15),r(),s(16,"span",17),l(17,"\u2022"),r(),s(18,"span",19),j(19,"date"),l(20),j(21,"date"),r()(),s(22,"span",20)(23,"span",21),l(24),r(),s(25,"span",22)(26,"span",16),l(27),r(),s(28,"span"),l(29),r(),s(30,"span"),l(31),j(32,"date"),r()(),v(33,tn,2,1,"span",23),r()()()}if(i&2){let t=e.$implicit,n=e.index,o=x();W("selected",t.hash===o.selectedHash()),de("aria-current",t.hash===o.selectedHash()?"true":null),a(2),J("background",o.laneColor(t)),W("merge",t.isMerge),a(),d("ngIf",n<o.commits().length-1),a(3),d("title",t.subject),a(),h(t.subject),a(),d("ngIf",t.branches.length||t.tags.length),a(3),h(t.shortHash),a(3),d("title",t.author),a(),h(t.author),a(3),d("title",q(19,21,t.date,"MMM d, y, h:mm a")),a(2),z(" ",q(21,24,t.date,"MMM d, y, h:mm a")," "),a(4),h(t.subject),a(3),h(t.shortHash),a(2),h(t.author),a(2),h(q(32,27,t.date,"MMM d, y, h:mm a")),a(2),d("ngIf",o.refsFor(t))}}function on(i,e){i&1&&(s(0,"div",31)(1,"p"),l(2,"No commits match your filters."),r()())}var Pe=class i{state=M(G);commits=this.state.commits;selectedHash=this.state.selectedHash;refsCache=new Map;laneColorCache=new Map;trackByHash(e,t){return t.hash}select(e){this.state.selectHash(e.hash)}refsFor(e){let t=this.refsCache.get(e.hash);if(t!==void 0)return t;let n=[...e.tags,...e.branches].join(", ");return this.refsCache.set(e.hash,n),n}laneColors=["#4f46e5","#06b6d4","#f59e0b","#ef4444","#10b981","#8b5cf6"];laneColor(e){let t=this.laneColorCache.get(e.hash);if(t)return t;let n=0,o=e.branches[0]??e.parents[0]??e.hash;for(let g=0;g<o.length;g++)n=n*31+o.charCodeAt(g)>>>0;let c=this.laneColors[n%this.laneColors.length];return this.laneColorCache.set(e.hash,c),c}onKey(e){if(!this.isTyping(e.target)){if(e.key==="j")e.preventDefault(),this.state.selectByOffset(1);else if(e.key==="k")e.preventDefault(),this.state.selectByOffset(-1);else if(e.key==="g"){e.preventDefault();let t=this.state.commits();t.length&&this.state.selectHash(t[0].hash)}else if(e.key==="G"){e.preventDefault();let t=this.state.commits();t.length&&this.state.selectHash(t[t.length-1].hash)}}}isTyping(e){return e instanceof HTMLElement?["INPUT","TEXTAREA","SELECT"].includes(e.tagName)||e.isContentEditable:!1}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-commit-list"]],hostBindings:function(t,n){t&1&&w("keydown",function(c){return n.onKey(c)},pe)},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(t,n){t&1&&(s(0,"div",0)(1,"span",1),l(2),r(),s(3,"span",2)(4,"kbd",3),l(5,"j"),r(),l(6,"/"),s(7,"kbd",3),l(8,"k"),r(),l(9," navigate "),r()(),s(10,"cdk-virtual-scroll-viewport",4),v(11,nn,34,30,"button",5)(12,on,3,0,"div",6),r()),t&2&&(a(2),ue("",n.commits().length," of ",n.state.total()),a(8),d("itemSize",68),a(),d("cdkVirtualForOf",n.commits())("cdkVirtualForTrackBy",n.trackByHash),a(),d("ngIf",!n.commits().length&&!n.state.loading()))},dependencies:[H,Q,N,pt,lt,mt,ct,Z],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 ke=class i{http=M(xe);base="/api";cache=new _e(50);list(e={}){let t=new Xe;for(let[n,o]of Object.entries(e))o&&(t=t.set(n,String(o)));return this.cache.get(`groups:${t.toString()}`,()=>this.http.get(`${this.base}/groups`,{params:t}),be.VOLATILE)}invalidate(){this.cache.clear()}static \u0275fac=function(t){return new(t||i)};static \u0275prov=me({token:i,factory:i.\u0275fac,providedIn:"root"})};function rn(i,e){if(i&1&&(s(0,"span",7),l(1),r()),i&2){let t=e.ngIf;a(),z("",t," groups")}}function an(i,e){i&1&&(s(0,"div",8),l(1,"Loading groups\u2026"),r())}function sn(i,e){if(i&1&&(s(0,"div",9),l(1),r()),i&2){let t=e.ngIf;a(),h(t)}}function ln(i,e){i&1&&(s(0,"div",8),l(1," No groups detected. Try the flat view. "),r())}function cn(i,e){if(i&1&&(s(0,"span",18),l(1),r()),i&2){let t=x().$implicit;a(),z("#",t.prNumber)}}function mn(i,e){if(i&1){let t=A();s(0,"li",21),w("click",function(){let o=P(t).$implicit,c=x(3);return k(c.state.selectHash(o))}),s(1,"code",22),l(2),r(),s(3,"span",23),l(4),r()()}if(i&2){let t=e.$implicit,n=x(3);W("selected",t===n.state.selectedHash()),a(2),h(n.shortHash(t)),a(2),h(n.subjectFor(t))}}function pn(i,e){if(i&1&&(s(0,"ul",19),v(1,mn,5,4,"li",20),r()),i&2){let t=x().$implicit;a(),d("ngForOf",t.commits)}}function dn(i,e){if(i&1){let t=A();s(0,"li",10)(1,"button",11),w("click",function(){let o=P(t).$implicit,c=x();return k(c.toggle(o.id))}),s(2,"span",12),l(3,"\u25B8"),r(),s(4,"span",13),l(5),r(),v(6,cn,2,1,"span",14),s(7,"span",15),l(8),r(),s(9,"span",16),l(10),r()(),v(11,pn,2,1,"ul",17),r()}if(i&2){let t=e.$implicit,n=x();W("expanded",n.isExpanded(t.id)),a(2),W("open",n.isExpanded(t.id)),a(2),Qe("src-"+t.source),a(),h(n.sourceLabel(t.source)),a(),d("ngIf",t.prNumber),a(2),h(t.title),a(2),h(t.commits.length),a(),d("ngIf",n.isExpanded(t.id))}}var Se=class i{state=M(G);groupsApi=M(ke);groups=S(null);loading=S(!1);error=S(null);expanded=S(new Set);subjectMap=K(()=>{let e=new Map;for(let t of this.state.commits())e.set(t.hash,t.subject);return e});constructor(){Y(()=>{let e=this.state.filters();this.load(e.since,e.until,e.author,e.branch)})}isExpanded(e){return this.expanded().has(e)}toggle(e){let t=new Set(this.expanded());t.has(e)?t.delete(e):t.add(e),this.expanded.set(t)}shortHash(e){return e.slice(0,7)}subjectFor(e){return this.subjectMap().get(e)??e.slice(0,7)}sourceLabel(e){switch(e){case"merge":return"PR";case"squash":return"PR (sq)";case"conventional":return"Feat";case"standalone":return"commit"}}load(e,t,n,o){this.loading.set(!0),this.error.set(null),this.groupsApi.list({since:e,until:t,author:n,branch:o}).subscribe({next:c=>{this.groups.set(c),this.loading.set(!1);let g=c.find(u=>u.prNumber);g&&this.expanded.set(new Set([g.id]))},error:c=>{this.error.set(this.errMsg(c)),this.loading.set(!1)}})}errMsg(e){if(e&&typeof e=="object"&&"error"in e){let t=e.error;if(t?.error)return t.error}return e instanceof Error?e.message:"Failed to load groups"}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({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(t,n){if(t&1&&(s(0,"div",0)(1,"span",1),l(2,"PR / feature groups"),r(),v(3,rn,2,1,"span",2),r(),v(4,an,2,0,"div",3)(5,sn,2,1,"div",4)(6,ln,2,0,"div",3),s(7,"ul",5),v(8,dn,12,11,"li",6),r()),t&2){let o,c;a(3),d("ngIf",(o=n.groups())==null?null:o.length),a(),d("ngIf",n.loading()),a(),d("ngIf",n.error()),a(),d("ngIf",!n.loading()&&!n.error()&&(((c=n.groups())==null?null:c.length)??0)===0),a(2),d("ngForOf",n.groups())}},dependencies:[H,Q,N],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 gn(i,e){i&1&&(ge(0),b(1,"app-grouped-list"),fe())}function fn(i,e){i&1&&b(0,"app-commit-list")}var ut=class i{state=M(G);static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({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(t,n){if(t&1&&(s(0,"main",1)(1,"aside",2),b(2,"app-commit-graph"),r(),s(3,"section",3)(4,"div",4),v(5,gn,2,0,"ng-container",5)(6,fn,1,0,"ng-template",null,0,ve),r()(),s(8,"section",6)(9,"div",7),b(10,"app-commit-detail"),r()()()),t&2){let o=he(7);a(5),d("ngIf",n.state.viewMode()==="grouped")("ngIfElse",o)}},dependencies:[H,N,Oe,Pe,we,Se],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{ut as HomeShellComponent};
@@ -9,8 +9,8 @@
9
9
  <meta name="theme-color" content="#0b1020" media="(prefers-color-scheme: dark)">
10
10
  <meta name="theme-color" content="#f7f8fa" media="(prefers-color-scheme: light)">
11
11
  <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%234f46e5' d='M12 .5a11.5 11.5 0 1 0 11.5 11.5A11.5 11.5 0 0 0 12 .5Zm5.7 14.83a1 1 0 0 1-1.41 1.41L13 13.41V19a1 1 0 0 1-2 0v-5.59l-3.29 3.33A1 1 0 1 1 6.3 15.34l5-5.05a1 1 0 0 1 1.42 0Z'/%3E%3C/svg%3E">
12
- <style>*,:before,:after{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}:root{color-scheme:light;--bg-app:#f7f8fa;--bg-surface:#ffffff;--bg-surface-2:#f3f4f6;--bg-elevated:#ffffff;--bg-panel:rgba(255, 255, 255, .78);--bg-glass:rgba(255, 255, 255, .72);--bg-hover:#eef2ff;--bg-selected:#e0e7ff;--bg-overlay:rgba(15, 23, 42, .45);--bg-gradient:radial-gradient(circle at 12% -8%, rgba(79, 70, 229, .12), transparent 34%), radial-gradient(circle at 90% 0%, rgba(6, 182, 212, .12), transparent 28%), linear-gradient(180deg, #f8fafc 0%, #eef2f7 100%);--fg-primary:#0f172a;--fg-secondary:#475569;--fg-muted:#64748b;--fg-subtle:#94a3b8;--fg-inverted:#ffffff;--border-soft:#e2e8f0;--border-strong:#cbd5e1;--border-focus:#6366f1;--accent:#4f46e5;--accent-hover:#4338ca;--accent-soft:#eef2ff;--accent-fg:#ffffff;--accent-ring:rgba(99, 102, 241, .18);--success:#16a34a;--warning:#d97706;--danger:#dc2626;--diff-add-bg:#dcfce7;--diff-add-fg:#14532d;--diff-add-gutter:#86efac;--diff-del-bg:#fee2e2;--diff-del-fg:#7f1d1d;--diff-del-gutter:#fca5a5;--diff-hunk-bg:#f1f5f9;--diff-hunk-fg:#475569;--graph-guide:rgba(148, 163, 184, .28);--graph-row-alt:rgba(15, 23, 42, .025);--graph-row-hover:rgba(79, 70, 229, .08);--graph-row-selected:rgba(79, 70, 229, .14);--graph-node-ring:#ffffff;--graph-shadow:rgba(15, 23, 42, .12);--chart-add:#16a34a;--chart-del:#dc2626;--chart-line:#4f46e5;--chart-fill:rgba(79, 70, 229, .16);--shadow-sm:0 1px 2px rgba(15, 23, 42, .06);--shadow-md:0 4px 12px rgba(15, 23, 42, .08);--shadow-lg:0 12px 32px rgba(15, 23, 42, .12);--shadow-glow:0 16px 60px rgba(79, 70, 229, .14);--radius-sm:6px;--radius-md:10px;--radius-lg:14px;--radius-xl:18px;--font-sans:ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, "Cascadia Mono", "Liberation Mono", "Courier New", monospace}*,*:before,*:after{box-sizing:border-box}html,body{height:100%}body{margin:0;font-family:var(--font-sans);font-size:14px;line-height:1.5;color:var(--fg-primary);background:var(--bg-gradient);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}</style><link rel="stylesheet" href="styles-VRDIEW7E.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-VRDIEW7E.css"></noscript></head>
12
+ <style>*,:before,:after{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}:root{color-scheme:light;--bg-app:#f7f8fa;--bg-surface:#ffffff;--bg-surface-2:#f3f4f6;--bg-elevated:#ffffff;--bg-panel:rgba(255, 255, 255, .78);--bg-glass:rgba(255, 255, 255, .72);--bg-hover:#eef2ff;--bg-selected:#e0e7ff;--bg-overlay:rgba(15, 23, 42, .45);--bg-gradient:radial-gradient(circle at 12% -8%, rgba(79, 70, 229, .12), transparent 34%), radial-gradient(circle at 90% 0%, rgba(6, 182, 212, .12), transparent 28%), linear-gradient(180deg, #f8fafc 0%, #eef2f7 100%);--fg-primary:#0f172a;--fg-secondary:#475569;--fg-muted:#64748b;--fg-subtle:#94a3b8;--fg-inverted:#ffffff;--border-soft:#e2e8f0;--border-strong:#cbd5e1;--border-focus:#6366f1;--accent:#4f46e5;--accent-hover:#4338ca;--accent-soft:#eef2ff;--accent-fg:#ffffff;--accent-ring:rgba(99, 102, 241, .18);--success:#16a34a;--warning:#d97706;--danger:#dc2626;--diff-add-bg:#dcfce7;--diff-add-fg:#14532d;--diff-add-gutter:#86efac;--diff-del-bg:#fee2e2;--diff-del-fg:#7f1d1d;--diff-del-gutter:#fca5a5;--diff-hunk-bg:#f1f5f9;--diff-hunk-fg:#475569;--graph-guide:rgba(148, 163, 184, .28);--graph-row-alt:rgba(15, 23, 42, .025);--graph-row-hover:rgba(79, 70, 229, .08);--graph-row-selected:rgba(79, 70, 229, .14);--graph-node-ring:#ffffff;--graph-shadow:rgba(15, 23, 42, .12);--chart-add:#16a34a;--chart-del:#dc2626;--chart-line:#4f46e5;--chart-fill:rgba(79, 70, 229, .16);--shadow-sm:0 1px 2px rgba(15, 23, 42, .06);--shadow-md:0 4px 12px rgba(15, 23, 42, .08);--shadow-lg:0 12px 32px rgba(15, 23, 42, .12);--shadow-glow:0 16px 60px rgba(79, 70, 229, .14);--radius-sm:6px;--radius-md:10px;--radius-lg:14px;--radius-xl:18px;--font-sans:ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, "Cascadia Mono", "Liberation Mono", "Courier New", monospace}*,*:before,*:after{box-sizing:border-box}html,body{height:100%}body{margin:0;font-family:var(--font-sans);font-size:14px;line-height:1.5;color:var(--fg-primary);background:var(--bg-gradient);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}</style><link rel="stylesheet" href="styles-YVI22YLY.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-YVI22YLY.css"></noscript></head>
13
13
  <body>
14
14
  <app-root></app-root>
15
- <link rel="modulepreload" href="chunk-UC5UORBU.js"><link rel="modulepreload" href="chunk-VDZMKPJL.js"><link rel="modulepreload" href="chunk-Q72JIHF2.js"><link rel="modulepreload" href="chunk-HHK3LJFN.js"><link rel="modulepreload" href="chunk-HSZFTFM3.js"><link rel="modulepreload" href="chunk-MTI6UKQ3.js"><script src="polyfills-5CFQRCPP.js" type="module"></script><script src="main-TYWZN6ZP.js" type="module"></script></body>
15
+ <link rel="modulepreload" href="chunk-UC5UORBU.js"><link rel="modulepreload" href="chunk-VDZMKPJL.js"><link rel="modulepreload" href="chunk-Q72JIHF2.js"><link rel="modulepreload" href="chunk-HHK3LJFN.js"><link rel="modulepreload" href="chunk-5ISCQDR6.js"><link rel="modulepreload" href="chunk-MTI6UKQ3.js"><script src="polyfills-5CFQRCPP.js" type="module"></script><script src="main-MVJO42GL.js" type="module"></script></body>
16
16
  </html>
@@ -0,0 +1 @@
1
+ import{a as we,b as ke,c as Oe}from"./chunk-UC5UORBU.js";import{a as O}from"./chunk-VDZMKPJL.js";import{a as pe,c as fe,d as _e,f as be,g as ve,h as Ce}from"./chunk-Q72JIHF2.js";import{a as R,b as $,c as j,e as xe,f as ye,g as Me,h as q}from"./chunk-HHK3LJFN.js";import{a as K}from"./chunk-5ISCQDR6.js";import{$a as w,Ab as p,Ac as me,Bb as d,Bc as ue,Cc as ge,Dc as he,E as oe,Ec as Se,Fb as H,Fc as Te,G as re,Gb as A,Hb as z,Kb as E,Mb as l,Nb as _,Ob as M,Qa as le,Ra as L,S as ae,Sa as a,X as se,Xb as ce,aa as v,cc as de,dc as B,eb as h,ec as x,fa as u,fc as T,ga as g,ha as P,ia as ee,nb as I,pa as y,qb as c,r as ie,rb as o,rc as V,sb as r,sc as k,tb as C,vc as S,xb as D,yb as F,zb as b}from"./chunk-MTI6UKQ3.js";var Pe=[{path:"",loadComponent:()=>import("./chunk-KINVHBDC.js").then(n=>n.HomeShellComponent),pathMatch:"full"},{path:"timeline",loadComponent:()=>import("./chunk-VT6O3MYC.js").then(n=>n.TimelineComponent)},{path:"file/:path",loadComponent:()=>import("./chunk-6SY2IWCO.js").then(n=>n.FileHistoryComponent)},{path:"insights",loadComponent:()=>import("./chunk-GHYTSHSI.js").then(n=>n.InsightsComponent)},{path:"wrapped",loadComponent:()=>import("./chunk-3HQI3U5H.js").then(n=>n.WrappedComponent)},{path:"**",redirectTo:""}];var Ie={providers:[de({eventCoalescing:!0}),Ce(Pe),ge(he())]};var Ve=["input"];function De(n,e){if(n&1){let t=b();o(0,"div",3),p("click",function(){u(t);let s=d();return g(s.close())}),r()}}function Fe(n,e){if(n&1){let t=b();o(0,"li",11),p("mouseenter",function(){let s=u(t).index,m=d(2);return g(m.index.set(s))})("click",function(){let s=u(t).$implicit,m=d(2);return g(m.pick(s))}),o(1,"span",12),l(2),r(),o(3,"span",13),l(4),r(),o(5,"span",14),l(6),r()()}if(n&2){let t=e.$implicit,i=e.index,s=d(2);E("active",i===s.index()),I("aria-selected",i===s.index()),a(2),_(t.shortHash),a(2),_(t.subject),a(2),_(t.author)}}function Ne(n,e){n&1&&(o(0,"li",15),l(1,"No matches."),r())}function Le(n,e){if(n&1){let t=b();o(0,"div",4)(1,"input",5,0),p("ngModelChange",function(s){u(t);let m=d();return g(m.onQuery(s))})("keydown",function(s){u(t);let m=d();return g(m.onKey(s))}),r(),o(3,"ul",6),h(4,Fe,7,6,"li",7)(5,Ne,2,0,"li",8),r(),o(6,"div",9)(7,"span")(8,"kbd",10),l(9,"\u2191"),r(),o(10,"kbd",10),l(11,"\u2193"),r(),l(12," navigate"),r(),o(13,"span")(14,"kbd",10),l(15,"Enter"),r(),l(16," select"),r(),o(17,"span")(18,"kbd",10),l(19,"Esc"),r(),l(20," close"),r()()()}if(n&2){let t=d();a(),c("ngModel",t.query()),a(3),c("ngForOf",t.results())("ngForTrackBy",t.trackByHash),a(),c("ngIf",!t.results().length)}}var G=class n{state=v(O);input;query=y("");index=y(0);results=x(()=>{let e=this.query().trim().toLowerCase(),t=this.state.commits();return e?t.filter(i=>i.hash.toLowerCase().startsWith(e)||i.shortHash.toLowerCase().startsWith(e)||i.subject.toLowerCase().includes(e)||i.author.toLowerCase().includes(e)).slice(0,50):t.slice(0,50)});constructor(){T(()=>{this.state.paletteOpen()&&(this.query.set(""),this.index.set(0),queueMicrotask(()=>this.input?.nativeElement.focus()))}),T(()=>{let e=this.results().length;this.index()>=e&&this.index.set(Math.max(0,e-1))})}trackByHash(e,t){return t.hash}onQuery(e){this.query.set(e),this.index.set(0)}onKey(e){if(e.key==="ArrowDown")e.preventDefault(),this.index.update(t=>Math.min(this.results().length-1,t+1));else if(e.key==="ArrowUp")e.preventDefault(),this.index.update(t=>Math.max(0,t-1));else if(e.key==="Enter"){e.preventDefault();let t=this.results()[this.index()];t&&this.pick(t)}else e.key==="Escape"&&(e.preventDefault(),this.close())}pick(e){this.state.selectHash(e.hash),this.close()}close(){this.state.paletteOpen.set(!1)}onGlobal(e){(e.metaKey||e.ctrlKey)&&(e.key==="k"||e.key==="K")&&(e.preventDefault(),this.state.paletteOpen.set(!this.state.paletteOpen()))}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=w({type:n,selectors:[["app-command-palette"]],viewQuery:function(t,i){if(t&1&&H(Ve,5),t&2){let s;A(s=z())&&(i.input=s.first)}},hostBindings:function(t,i){t&1&&p("keydown",function(m){return i.onGlobal(m)},L)},decls:2,vars:2,consts:[["input",""],["class","backdrop",3,"click",4,"ngIf"],["class","palette","role","dialog","aria-modal","true",4,"ngIf"],[1,"backdrop",3,"click"],["role","dialog","aria-modal","true",1,"palette"],["type","text","placeholder","Jump to a commit by hash, subject, or author\u2026",1,"search",3,"ngModelChange","keydown","ngModel"],["role","listbox",1,"results"],["class","result",3,"active","mouseenter","click",4,"ngFor","ngForOf","ngForTrackBy"],["class","result empty",4,"ngIf"],[1,"footer"],[1,"kbd"],[1,"result",3,"mouseenter","click"],[1,"hash"],[1,"subj"],[1,"auth"],[1,"result","empty"]],template:function(t,i){t&1&&h(0,De,1,0,"div",1)(1,Le,21,4,"div",2),t&2&&(c("ngIf",i.state.paletteOpen()),a(),c("ngIf",i.state.paletteOpen()))},dependencies:[S,V,k,q,R,$,j],styles:[".backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:var(--bg-overlay);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:90}.palette[_ngcontent-%COMP%]{position:fixed;top:12vh;left:50%;transform:translate(-50%);width:min(640px,calc(100vw - 32px));background:color-mix(in oklab,var(--bg-glass) 96%,transparent);border:1px solid var(--border-soft);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg),var(--shadow-glow);-webkit-backdrop-filter:blur(18px) saturate(1.2);backdrop-filter:blur(18px) saturate(1.2);z-index:100;overflow:hidden}.search[_ngcontent-%COMP%]{width:100%;border:0;outline:0;padding:1rem 1.1rem;background:transparent;color:var(--fg-primary);font-size:14px;border-bottom:1px solid var(--border-soft)}.results[_ngcontent-%COMP%]{list-style:none;margin:0;padding:.25rem 0;max-height:50vh;overflow:auto}.result[_ngcontent-%COMP%]{display:grid;grid-template-columns:70px 1fr auto;align-items:center;gap:.6rem;padding:.52rem 1rem;cursor:pointer;font-size:13px}.result.active[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 12%,transparent);box-shadow:inset 3px 0 0 var(--accent)}.result.empty[_ngcontent-%COMP%]{grid-template-columns:1fr;color:var(--fg-muted);cursor:default}.hash[_ngcontent-%COMP%]{font-family:var(--font-mono);color:var(--fg-muted)}.subj[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--fg-primary)}.auth[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px}.footer[_ngcontent-%COMP%]{display:flex;gap:1rem;padding:.4rem .75rem;background:color-mix(in oklab,var(--bg-surface-2) 84%,transparent);border-top:1px solid var(--border-soft);font-size:11px;color:var(--fg-muted)}"],changeDetection:0})};function He(n,e){if(n&1){let t=b();o(0,"div",5)(1,"button",6),p("click",function(){u(t);let s=d(2);return g(s.build())}),l(2," Build "),r(),o(3,"button",6),p("click",function(){u(t);let s=d(2);return g(s.rebuild())}),l(4," Rebuild "),r(),o(5,"button",6),p("click",function(){u(t);let s=d(2);return g(s.cancel())}),l(6," Cancel "),r()()}if(n&2){let t=d().ngIf,i=d();a(),c("disabled",i.busy()||t.running),a(2),c("disabled",i.busy()||t.running),a(2),c("disabled",i.busy()||!t.running)}}function Ae(n,e){if(n&1&&(o(0,"section",1)(1,"div",2),C(2,"span",3),o(3,"div")(4,"strong"),l(5),r(),o(6,"span"),l(7),r()()(),h(8,He,7,3,"div",4),r()),n&2){let t=e.ngIf,i=d();a(2),E("running",t.running)("off",!t.available),a(3),_(i.title()),a(2),_(i.subtitle()),a(),c("ngIf",t.available)}}var U=class n{git=v(K);timer=null;status=y(null);busy=y(!1);title=x(()=>{let e=this.status();return e?e.available?e.running?`Index ${e.progress.phase}`:e.progress.phase==="error"?"Index build failed":e.total>0?"Search index ready":"Search index not built":"SQLite index unavailable":"Index status"});subtitle=x(()=>{let e=this.status();if(!e)return"Checking\u2026";if(!e.available)return"Install optional better-sqlite3 support to enable indexed search.";let t=e.progress.message?`${e.progress.message}. `:"",i=e.running?e.progress.indexed:e.total,s=i?`${i.toLocaleString()} commits`:"No commits indexed",m=e.builtAt?`Built ${new Date(e.builtAt).toLocaleString()}`:"Never built";return`${t}${s}. ${m}.`});constructor(){this.refresh()}ngOnDestroy(){this.timer&&clearTimeout(this.timer)}build(){this.run(()=>this.git.buildIndex())}rebuild(){this.run(()=>this.git.rebuildIndex())}cancel(){this.run(()=>this.git.cancelIndexBuild())}refresh(){this.git.getIndexStatus().subscribe({next:e=>{this.status.set(e),this.schedule(e.running?1e3:1e4)},error:()=>this.schedule(15e3)})}run(e){this.busy.set(!0),e().subscribe({next:t=>this.status.set(t),error:()=>this.busy.set(!1),complete:()=>{this.busy.set(!1),this.schedule(this.status()?.running?1e3:5e3)}})}schedule(e){this.timer&&clearTimeout(this.timer),this.timer=setTimeout(()=>this.refresh(),e)}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=w({type:n,selectors:[["app-index-status"]],decls:1,vars:1,consts:[["class","index-card","aria-live","polite",4,"ngIf"],["aria-live","polite",1,"index-card"],[1,"main"],[1,"dot"],["class","actions",4,"ngIf"],[1,"actions"],["type","button",1,"btn","btn-ghost",3,"click","disabled"]],template:function(t,i){t&1&&h(0,Ae,9,7,"section",0),t&2&&c("ngIf",i.status())},dependencies:[S,k],styles:[".index-card[_ngcontent-%COMP%]{position:fixed;right:1rem;bottom:3.75rem;z-index:70;display:flex;gap:.75rem;align-items:center;max-width:min(560px,calc(100vw - 2rem));padding:.55rem .7rem;border:1px solid var(--border-soft);border-radius:var(--radius-md);background:var(--bg-elevated);color:var(--fg-secondary);box-shadow:var(--shadow-md);font-size:12px}.main[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.55rem;min-width:0}.main[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-width:0}strong[_ngcontent-%COMP%]{color:var(--fg-primary);font-weight:600}span[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dot[_ngcontent-%COMP%]{width:9px;height:9px;border-radius:999px;background:var(--accent);box-shadow:0 0 0 3px var(--accent-ring);flex:0 0 auto}.dot.running[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_pulse 1s ease-in-out infinite}.dot.off[_ngcontent-%COMP%]{background:var(--fg-subtle);box-shadow:none}.actions[_ngcontent-%COMP%]{display:flex;gap:.3rem}.actions[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]{font-size:11px;padding:.25rem .45rem}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:.55;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}@media (max-width: 760px){.index-card[_ngcontent-%COMP%]{left:1rem;right:1rem;justify-content:space-between}.actions[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]:first-child{display:none}}"],changeDetection:0})};function ze(n,e){if(n&1&&(o(0,"kbd",11),l(1),r()),n&2){let t=e.$implicit;a(),_(t)}}function Be(n,e){if(n&1&&(o(0,"li")(1,"span",8),l(2),r(),o(3,"span",9),h(4,ze,2,1,"kbd",10),r()()),n&2){let t=e.$implicit;a(2),_(t.description),a(2),c("ngForOf",t.keys)}}function Re(n,e){if(n&1&&(o(0,"section")(1,"h3"),l(2),r(),o(3,"ul"),h(4,Be,5,2,"li",7),r()()),n&2){let t=e.$implicit;a(2),_(t.title),a(2),c("ngForOf",t.bindings)}}function $e(n,e){if(n&1){let t=b();D(0),o(1,"div",1),p("click",function(){u(t);let s=d();return g(s.close())}),r(),o(2,"div",2)(3,"div",3)(4,"h2",4),l(5,"Keyboard shortcuts"),r(),o(6,"button",5),p("click",function(){u(t);let s=d();return g(s.close())}),l(7,"\u2715"),r()(),o(8,"div",6),h(9,Re,5,2,"section",7),r()(),F()}if(n&2){let t=d();a(9),c("ngForOf",t.groups)}}var je=[{title:"Navigation",bindings:[{keys:["j"],description:"Next commit"},{keys:["k"],description:"Previous commit"},{keys:["g"],description:"Jump to newest commit"},{keys:["G"],description:"Jump to oldest commit"}]},{title:"Search & overlays",bindings:[{keys:["/"],description:"Focus search"},{keys:["\u2318","K"],description:"Open command palette"},{keys:["?"],description:"Show this help"},{keys:["Esc"],description:"Close overlays"}]}],W=class n{state=v(O);groups=je;close(){this.state.shortcutsOpen.set(!1)}onKey(e){e.key==="?"&&!this.isTyping(e.target)&&(e.preventDefault(),this.state.shortcutsOpen.set(!0)),e.key==="Escape"&&(this.state.shortcutsOpen.set(!1),this.state.paletteOpen.set(!1))}isTyping(e){return e instanceof HTMLElement?["INPUT","TEXTAREA","SELECT"].includes(e.tagName)||e.isContentEditable:!1}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=w({type:n,selectors:[["app-shortcuts-modal"]],hostBindings:function(t,i){t&1&&p("keydown",function(m){return i.onKey(m)},L)},decls:1,vars:1,consts:[[4,"ngIf"],[1,"backdrop",3,"click"],["role","dialog","aria-modal","true","aria-labelledby","shortcuts-title",1,"modal"],[1,"head"],["id","shortcuts-title"],["aria-label","Close",1,"btn","btn-ghost","btn-icon",3,"click"],[1,"body"],[4,"ngFor","ngForOf"],[1,"desc"],[1,"keys"],["class","kbd",4,"ngFor","ngForOf"],[1,"kbd"]],template:function(t,i){t&1&&h(0,$e,10,1,"ng-container",0),t&2&&c("ngIf",i.state.shortcutsOpen())},dependencies:[S,V,k],styles:[".backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:var(--bg-overlay);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:90}.modal[_ngcontent-%COMP%]{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(560px,calc(100vw - 32px));max-height:80vh;overflow:auto;background:var(--bg-elevated);border:1px solid var(--border-soft);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);z-index:100}.head[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-bottom:1px solid var(--border-soft)}.head[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0;font-size:16px}.body[_ngcontent-%COMP%]{padding:.75rem 1rem 1rem}h3[_ngcontent-%COMP%]{margin:1rem 0 .4rem;font-size:12px;color:var(--fg-muted);text-transform:uppercase;letter-spacing:.04em}h3[_ngcontent-%COMP%]:first-child{margin-top:0}ul[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}li[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;padding:.45rem .25rem;border-bottom:1px dashed var(--border-soft)}li[_ngcontent-%COMP%]:last-child{border-bottom:0}.desc[_ngcontent-%COMP%]{color:var(--fg-secondary);font-size:13px}.keys[_ngcontent-%COMP%]{display:flex;gap:4px}"],changeDetection:0})};var qe=["searchInput"],Ke=()=>({exact:!0});function Ge(n,e){if(n&1&&(o(0,"span",37),l(1),r()),n&2){let t=e.ngIf;a(),_(t)}}function Qe(n,e){n&1&&(D(0),P(),o(1,"svg",38),C(2,"path",39),r(),F())}function Ze(n,e){n&1&&(D(0),o(1,"span",40),l(2,"AI"),r(),F())}function Ue(n,e){n&1&&(o(0,"kbd",41),l(1,"/"),r())}function We(n,e){if(n&1&&(o(0,"option",42),l(1),r()),n&2){let t=e.$implicit,i=d();c("value",t),a(),_(i.shortBranch(t))}}function Je(n,e){if(n&1&&(o(0,"option",42),l(1),r()),n&2){let t=e.$implicit;c("value",t),a(),_(t)}}function Xe(n,e){if(n&1){let t=b();o(0,"button",43),p("click",function(){u(t);let s=d();return g(s.clearFilters())}),l(1),r()}if(n&2){let t=d();a(),M(" Clear ",t.activeFilterCount()," ")}}function Ye(n,e){n&1&&(P(),o(0,"svg",29),C(1,"path",44),r())}function et(n,e){n&1&&(P(),o(0,"svg",29),C(1,"path",45),r())}function tt(n,e){if(n&1&&(o(0,"span",51),l(1),r()),n&2){let t=d().ngIf;a(),M("author: ",t.author)}}function nt(n,e){if(n&1&&(o(0,"span",51),l(1),r()),n&2){let t=d().ngIf;a(),M("since: ",t.since)}}function it(n,e){if(n&1&&(o(0,"span",51),l(1),r()),n&2){let t=d().ngIf;a(),M("until: ",t.until)}}function ot(n,e){if(n&1&&(o(0,"span",51),l(1),r()),n&2){let t=e.$implicit;a(),_(t)}}function rt(n,e){n&1&&(o(0,"span",52),l(1,"no structured filters detected"),r())}function at(n,e){if(n&1&&(o(0,"div",46)(1,"span",47),l(2,"Interpreted as"),r(),h(3,tt,2,1,"span",48)(4,nt,2,1,"span",48)(5,it,2,1,"span",48)(6,ot,2,1,"span",49)(7,rt,2,0,"span",50),r()),n&2){let t=e.ngIf;a(3),c("ngIf",t.author),a(),c("ngIf",t.since),a(),c("ngIf",t.until),a(),c("ngForOf",t.keywords),a(),c("ngIf",t.keywords.length===0&&!t.author&&!t.since)}}function st(n,e){if(n&1){let t=b();o(0,"button",55),p("click",function(){u(t);let s=d(2);return g(s.onBranch(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf,i=d(2);a(),M(" branch: ",i.shortBranch(t)," ")}}function lt(n,e){if(n&1){let t=b();o(0,"button",55),p("click",function(){u(t);let s=d(2);return g(s.onAuthor(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),M(" author: ",t," ")}}function ct(n,e){if(n&1){let t=b();o(0,"button",55),p("click",function(){u(t);let s=d(2);return g(s.onSince(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),M(" since: ",t," ")}}function dt(n,e){if(n&1){let t=b();o(0,"button",55),p("click",function(){u(t);let s=d(2);return g(s.onUntil(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),M(" until: ",t," ")}}function pt(n,e){if(n&1){let t=b();o(0,"button",55),p("click",function(){u(t);let s=d(2);return g(s.onFile(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),M(" file: ",t," ")}}function mt(n,e){if(n&1){let t=b();o(0,"button",55),p("click",function(){u(t);let s=d(2);return g(s.onSearchInput(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),M(" search: ",t," ")}}function ut(n,e){if(n&1&&(o(0,"div",53)(1,"span",47),l(2,"Active filters"),r(),h(3,st,4,1,"button",54)(4,lt,4,1,"button",54)(5,ct,4,1,"button",54)(6,dt,4,1,"button",54)(7,pt,4,1,"button",54)(8,mt,4,1,"button",54),r()),n&2){let t=d();a(3),c("ngIf",t.state.filters().branch),a(),c("ngIf",t.state.filters().author),a(),c("ngIf",t.state.filters().since),a(),c("ngIf",t.state.filters().until),a(),c("ngIf",t.state.filters().file),a(),c("ngIf",t.state.filters().search)}}var J=class n{state=v(O);theme=v(Oe);searchEl;searchValue=y("");totalLabel=x(()=>{let e=this.state.total();return e?`${e.toLocaleString()} commits`:""});themeLabel=x(()=>`Switch to ${this.theme.resolved()==="light"?"dark":"light"} mode`);searchPlaceholder=x(()=>this.state.searchMode()==="nl"?'Ask anything: "login bug last month", "payments by alice"\u2026':"Search commits\u2026 ( / )");searchModeTooltip=x(()=>this.state.searchMode()==="nl"?"Natural-language search active. Click to switch to literal search.":"Literal git-grep search. Click to switch to natural-language search.");viewModeTooltip=x(()=>this.state.viewMode()==="grouped"?"Showing PR / feature groups. Click for flat list.":"Showing flat commit list. Click for PR / feature groups.");branchOptions=x(()=>{let e=this.state.branches(),t=e.filter(i=>!gt(i));return t.length?t:e});activeFilterCount=x(()=>{let e=this.state.filters();return[e.branch,e.author,e.since,e.until,e.file,e.search].filter(Boolean).length});debounce=null;constructor(){T(()=>{let e=this.state.filters();this.searchValue.set(e.search??"")})}onKeydown(e){e.key==="/"&&!this.isTyping(e.target)&&(e.preventDefault(),queueMicrotask(()=>this.searchEl?.nativeElement.focus()))}onSearchInput(e){this.searchValue.set(e),this.debounce&&clearTimeout(this.debounce),this.debounce=setTimeout(()=>{this.state.patchFilters({search:e||void 0})},250)}onAuthor(e){this.state.patchFilters({author:e||void 0})}onBranch(e){this.state.patchFilters({branch:e||void 0})}onSince(e){this.state.patchFilters({since:e||void 0})}onUntil(e){this.state.patchFilters({until:e||void 0})}onFile(e){this.state.patchFilters({file:e||void 0})}toggleSearchMode(){let e=this.state.searchMode()==="classic"?"nl":"classic";this.state.searchMode.set(e),e==="classic"&&this.state.nlInterpretation.set(null),this.state.patchFilters({})}toggleViewMode(){this.state.viewMode.set(this.state.viewMode()==="flat"?"grouped":"flat")}clearFilters(){this.state.patchFilters({branch:void 0,author:void 0,since:void 0,until:void 0,file:void 0,search:void 0}),this.searchValue.set("")}isTyping(e){return e instanceof HTMLElement?["INPUT","TEXTAREA","SELECT"].includes(e.tagName)||e.isContentEditable:!1}shortBranch(e){return e.startsWith("origin/")?e.slice(7):e}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=w({type:n,selectors:[["app-toolbar"]],viewQuery:function(t,i){if(t&1&&H(qe,5),t&2){let s;A(s=z())&&(i.searchEl=s.first)}},hostBindings:function(t,i){t&1&&p("keydown",function(m){return i.onKeydown(m)},le)},decls:51,vars:29,consts:[["searchInput",""],[1,"toolbar"],[1,"brand"],["aria-hidden","true",1,"brand-mark"],[1,"brand-text"],[1,"brand-title"],["class","brand-sub",4,"ngIf"],[1,"nav"],["routerLink","/","routerLinkActive","active",3,"routerLinkActiveOptions"],["routerLink","/timeline","routerLinkActive","active"],["routerLink","/insights","routerLinkActive","active"],["routerLink","/wrapped","routerLinkActive","active"],[1,"filters"],[1,"search"],["type","button",1,"search-mode",3,"click","title"],[4,"ngIf"],["type","text","aria-label","Search commits",1,"search-input",3,"ngModelChange","placeholder","ngModel"],["class","kbd",4,"ngIf"],["aria-label","Filter by branch",1,"select",3,"ngModelChange","ngModel"],["value",""],[3,"value",4,"ngFor","ngForOf"],["aria-label","Filter by author",1,"select","author",3,"ngModelChange","ngModel"],["type","date","aria-label","Since date",1,"input","date",3,"ngModelChange","ngModel"],["type","date","aria-label","Until date",1,"input","date",3,"ngModelChange","ngModel"],["type","text","placeholder","path/to/file","aria-label","Filter by file path",1,"input","file",3,"ngModelChange","ngModel"],[1,"actions"],["class","btn btn-ghost clear-filters","title","Clear active filters",3,"click",4,"ngIf"],[1,"btn","btn-ghost","view-toggle",3,"click","title"],["title","Command palette (\u2318K)",1,"btn","btn-ghost","btn-icon",3,"click"],["viewBox","0 0 24 24","width","16","height","16","aria-hidden","true"],["fill","currentColor","d","M3 6a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v12a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3Zm3-1a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1Zm2 4h2v2H8Zm4 0h6v2h-6Zm-4 4h6v2H8Zm8 0h2v2h-2Z"],["title","Keyboard shortcuts (?)",1,"btn","btn-ghost","btn-icon",3,"click"],["fill","currentColor","d","M11 18h2v-2h-2Zm1-16a8 8 0 0 0-8 8h2a6 6 0 1 1 9.6 4.8c-1.06.8-1.6 1.42-1.6 3.2v.5h-2v-.5c0-2.6.94-3.5 2.13-4.39A4 4 0 1 0 8 10H6a6 6 0 0 1 6-8Z"],[1,"btn","btn-ghost","btn-icon",3,"click","title"],["viewBox","0 0 24 24","width","16","height","16","aria-hidden","true",4,"ngIf"],["class","nl-chips",4,"ngIf"],["class","filter-chips",4,"ngIf"],[1,"brand-sub"],["viewBox","0 0 20 20","width","14","height","14","aria-hidden","true"],["fill","currentColor","d","M9 2a7 7 0 1 1-4.32 12.5l-3.1 3.09a1 1 0 0 1-1.42-1.42l3.1-3.09A7 7 0 0 1 9 2Zm0 2a5 5 0 1 0 0 10A5 5 0 0 0 9 4Z"],[1,"ai-pill"],[1,"kbd"],[3,"value"],["title","Clear active filters",1,"btn","btn-ghost","clear-filters",3,"click"],["fill","currentColor","d","M12 4V2m0 20v-2m8-8h2M2 12h2m13.66-6.34 1.42-1.42M4.92 19.08l1.42-1.42m0-11.32L4.92 4.92m14.16 14.16-1.42-1.42M12 7a5 5 0 1 1 0 10 5 5 0 0 1 0-10Z"],["fill","currentColor","d","M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z"],[1,"nl-chips"],[1,"chip-label"],["class","chip",4,"ngIf"],["class","chip",4,"ngFor","ngForOf"],["class","chip muted",4,"ngIf"],[1,"chip"],[1,"chip","muted"],[1,"filter-chips"],["class","chip active",3,"click",4,"ngIf"],[1,"chip","active",3,"click"]],template:function(t,i){if(t&1){let s=b();o(0,"header",1)(1,"div",2)(2,"span",3),l(3,"\u2387"),r(),o(4,"div",4)(5,"span",5),l(6,"Git History"),r(),h(7,Ge,2,1,"span",6),r()(),o(8,"nav",7)(9,"a",8),l(10,"History"),r(),o(11,"a",9),l(12,"Timeline"),r(),o(13,"a",10),l(14,"Insights"),r(),o(15,"a",11),l(16,"Wrapped"),r()(),o(17,"div",12)(18,"label",13)(19,"button",14),p("click",function(){return u(s),g(i.toggleSearchMode())}),h(20,Qe,3,0,"ng-container",15)(21,Ze,3,0,"ng-container",15),r(),o(22,"input",16,0),p("ngModelChange",function(f){return u(s),g(i.onSearchInput(f))}),r(),h(24,Ue,2,0,"kbd",17),r(),o(25,"select",18),p("ngModelChange",function(f){return u(s),g(i.onBranch(f))}),o(26,"option",19),l(27,"All branches"),r(),h(28,We,2,2,"option",20),r(),o(29,"select",21),p("ngModelChange",function(f){return u(s),g(i.onAuthor(f))}),o(30,"option",19),l(31,"All authors"),r(),h(32,Je,2,2,"option",20),r(),o(33,"input",22),p("ngModelChange",function(f){return u(s),g(i.onSince(f))}),r(),o(34,"input",23),p("ngModelChange",function(f){return u(s),g(i.onUntil(f))}),r(),o(35,"input",24),p("ngModelChange",function(f){return u(s),g(i.onFile(f))}),r()(),o(36,"div",25),h(37,Xe,2,1,"button",26),o(38,"button",27),p("click",function(){return u(s),g(i.toggleViewMode())}),l(39),r(),o(40,"button",28),p("click",function(){return u(s),g(i.state.paletteOpen.set(!0))}),P(),o(41,"svg",29),C(42,"path",30),r()(),ee(),o(43,"button",31),p("click",function(){return u(s),g(i.state.shortcutsOpen.set(!0))}),P(),o(44,"svg",29),C(45,"path",32),r()(),ee(),o(46,"button",33),p("click",function(){return u(s),g(i.theme.cycle())}),h(47,Ye,2,0,"svg",34)(48,et,2,0,"svg",34),r()()(),h(49,at,8,5,"div",35)(50,ut,9,6,"div",36)}t&2&&(a(7),c("ngIf",i.totalLabel()),a(2),c("routerLinkActiveOptions",ce(28,Ke)),a(9),E("search-nl",i.state.searchMode()==="nl"),a(),c("title",i.searchModeTooltip()),I("aria-label",i.searchModeTooltip()),a(),c("ngIf",i.state.searchMode()==="classic"),a(),c("ngIf",i.state.searchMode()==="nl"),a(),c("placeholder",i.searchPlaceholder())("ngModel",i.searchValue()),a(2),c("ngIf",!i.searchValue()),a(),c("ngModel",i.state.filters().branch??""),a(3),c("ngForOf",i.branchOptions()),a(),c("ngModel",i.state.filters().author??""),a(3),c("ngForOf",i.state.authors()),a(),c("ngModel",i.state.filters().since??""),a(),c("ngModel",i.state.filters().until??""),a(),c("ngModel",i.state.filters().file??""),a(2),c("ngIf",i.activeFilterCount()),a(),c("title",i.viewModeTooltip()),I("aria-label",i.viewModeTooltip()),a(),M(" ",i.state.viewMode()==="grouped"?"Grouped":"Flat"," "),a(7),c("title",i.themeLabel()),I("aria-label",i.themeLabel()),a(),c("ngIf",i.theme.resolved()==="light"),a(),c("ngIf",i.theme.resolved()==="dark"),a(),c("ngIf",i.state.searchMode()==="nl"&&i.state.nlInterpretation()),a(),c("ngIf",i.activeFilterCount()))},dependencies:[S,V,k,q,ye,Me,R,xe,$,j,be,ve],styles:["[_nghost-%COMP%]{display:block;position:sticky;top:0;z-index:50;background:color-mix(in oklab,var(--bg-glass) 94%,transparent);-webkit-backdrop-filter:blur(16px) saturate(1.2);backdrop-filter:blur(16px) saturate(1.2);border-bottom:1px solid var(--border-soft);box-shadow:var(--shadow-sm)}.toolbar[_ngcontent-%COMP%]{display:grid;grid-template-columns:auto auto minmax(0,1fr) auto;align-items:center;column-gap:.75rem;row-gap:.4rem;padding:.65rem 1rem .55rem}.brand[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.6rem;padding-right:.25rem}.brand-mark[_ngcontent-%COMP%]{width:32px;height:32px;border-radius:8px;display:grid;place-items:center;background:linear-gradient(135deg,var(--accent),#06b6d4);color:var(--accent-fg);box-shadow:var(--shadow-glow);font-weight:700;font-size:18px}.brand-text[_ngcontent-%COMP%]{display:flex;flex-direction:column;line-height:1.1}.brand-title[_ngcontent-%COMP%]{font-weight:600}.brand-sub[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted)}.filters[_ngcontent-%COMP%]{display:flex;gap:.4rem;align-items:center;min-width:0;justify-content:flex-end}.filters[_ngcontent-%COMP%] > *[_ngcontent-%COMP%]{min-width:0}.search[_ngcontent-%COMP%]{position:relative;display:flex;align-items:center;gap:.35rem;flex:1 1 220px;min-width:0;max-width:360px;padding:0 .55rem;background:linear-gradient(180deg,color-mix(in oklab,var(--bg-surface) 94%,white 6%),var(--bg-surface));border:1px solid var(--border-soft);border-radius:999px;color:var(--fg-muted)}.search[_ngcontent-%COMP%]:focus-within{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--accent-ring)}.search-input[_ngcontent-%COMP%]{flex:1;border:0;outline:0;background:transparent;color:var(--fg-primary);font-size:13px;padding:.45rem 0}.search-input[_ngcontent-%COMP%]::placeholder{color:var(--fg-subtle)}.search[_ngcontent-%COMP%] .kbd[_ngcontent-%COMP%]{margin-left:.4rem}.date[_ngcontent-%COMP%]{width:8.25rem}.filters[_ngcontent-%COMP%] .input[_ngcontent-%COMP%], .filters[_ngcontent-%COMP%] .select[_ngcontent-%COMP%]{font-size:12px}.filters[_ngcontent-%COMP%] .select[_ngcontent-%COMP%]{max-width:9.5rem}.filters[_ngcontent-%COMP%] .select.author[_ngcontent-%COMP%]{max-width:8.5rem}.filters[_ngcontent-%COMP%] .input.file[_ngcontent-%COMP%]{width:9rem}.actions[_ngcontent-%COMP%]{display:flex;gap:.3rem;align-items:center}.nav[_ngcontent-%COMP%]{display:flex;gap:.15rem;padding:0}.nav[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{font-size:12px;color:var(--fg-muted);text-decoration:none;padding:.3rem .65rem;border-radius:var(--radius-sm);transition:background .15s ease,color .15s ease}.nav[_ngcontent-%COMP%] a[_ngcontent-%COMP%]:hover{background:var(--bg-elevated);color:var(--fg-primary)}.nav[_ngcontent-%COMP%] a.active[_ngcontent-%COMP%]{background:var(--bg-elevated);color:var(--accent);font-weight:600}.search-mode[_ngcontent-%COMP%]{background:transparent;border:0;padding:0;cursor:pointer;color:var(--fg-muted);display:flex;align-items:center}.search-mode[_ngcontent-%COMP%]:hover{color:var(--fg-primary)}.search.search-nl[_ngcontent-%COMP%]{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in oklab,var(--accent) 20%,transparent)}.ai-pill[_ngcontent-%COMP%]{font-size:10px;font-weight:700;letter-spacing:.04em;background:var(--accent);color:var(--accent-fg);padding:1px 5px;border-radius:4px}.view-toggle[_ngcontent-%COMP%]{font-size:11px;letter-spacing:.04em;text-transform:uppercase;padding:.35rem .6rem}.clear-filters[_ngcontent-%COMP%]{font-size:11px;color:var(--danger);border-color:color-mix(in oklab,var(--danger) 24%,transparent)}.nl-chips[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;padding:.4rem 1rem;border-bottom:1px solid var(--border-soft);background:var(--bg-surface);font-size:11px}.filter-chips[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;padding:0 1rem .55rem;background:color-mix(in oklab,var(--bg-glass) 94%,transparent);font-size:11px}.chip-label[_ngcontent-%COMP%]{color:var(--fg-muted);margin-right:.2rem}.chip[_ngcontent-%COMP%]{background:var(--bg-elevated);border:1px solid var(--border-soft);padding:2px 8px;border-radius:999px;color:var(--fg-secondary)}button.chip[_ngcontent-%COMP%]{cursor:pointer;font-family:inherit}.chip.active[_ngcontent-%COMP%]{display:inline-flex;gap:.35rem;align-items:center;border-color:color-mix(in oklab,var(--accent) 35%,var(--border-soft));color:var(--fg-primary)}.chip.active[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--fg-muted);font-weight:700}.chip.muted[_ngcontent-%COMP%]{font-style:italic;color:var(--fg-subtle)}@media (max-width: 1280px){.filters[_ngcontent-%COMP%] .input.file[_ngcontent-%COMP%]{display:none}}@media (max-width: 1100px){.filters[_ngcontent-%COMP%] .date[_ngcontent-%COMP%]{display:none}.search[_ngcontent-%COMP%]{max-width:280px}}@media (max-width: 900px){.toolbar[_ngcontent-%COMP%]{grid-template-columns:auto minmax(0,1fr) auto;row-gap:.5rem}.nav[_ngcontent-%COMP%]{grid-column:1 / -1;order:5}.filters[_ngcontent-%COMP%] .select[_ngcontent-%COMP%]{display:none}}"],changeDetection:0})};function gt(n){return n.startsWith("origin/")||n.includes("/origin/")}var X=class n{http=v(ue);base="/api";cache=new Se(50);naturalLanguage(e,t={}){let s=new me().set("q",e).set("page",String(t.page??1)).set("pageSize",String(t.pageSize??100));for(let m of["author","since","until","branch","file"]){let f=t[m];f&&(s=s.set(m,String(f)))}return this.cache.get(`nl:${s.toString()}`,()=>this.http.get(`${this.base}/search`,{params:s}),Te.SHORT)}invalidate(){this.cache.clear()}static \u0275fac=function(t){return new(t||n)};static \u0275prov=se({token:n,factory:n.\u0275fac,providedIn:"root"})};function ht(n,e){if(n&1&&(o(0,"div",2)(1,"span"),l(2),r()()),n&2){let t=e.ngIf;a(2),_(t)}}function ft(n,e){n&1&&(o(0,"div",3),C(1,"span",4),l(2," Loading commits\u2026 "),r())}var Y=class n{state=v(O);git=v(K);search=v(X);route=v(fe);commitsResp=ke(we(this.state.filters).pipe(re(200),ae(e=>{this.state.loading.set(!0),this.state.error.set(null);let i=this.state.searchMode()==="nl"&&(e.search||"").trim().length>0,s=!i&&(e.page??1)===1;return(i?this.search.naturalLanguage(e.search||"",e):s?this.git.streamCommits(e):this.git.getCommits(e)).pipe(oe(f=>(this.state.error.set(this.errorMessage(f)),this.state.loading.set(!1),ie(null))))})),{initialValue:null});authorsLoaded=y(!1);pendingSharedCommit=y(null);loadingSharedCommit=y(null);constructor(){this.route.queryParamMap.subscribe(e=>{let t=_t(e.get("commit"));t&&(this.pendingSharedCommit.set(t),this.state.selectHash(t))}),T(()=>{let e=this.commitsResp();if(!e)return;let t=B(()=>this.state.selectedHash()),i=t?B(()=>te(this.state.commits(),t)):void 0,s=i&&!te(e.commits,i.hash)?[i,...e.commits]:e.commits;this.state.commits.set(s),this.state.total.set(e.total),this.state.page.set(e.page),this.state.pageSize.set(e.pageSize),this.state.loading.set(!1);let m=e.parsedQuery;this.state.nlInterpretation.set(m??null);let f=this.pendingSharedCommit();if(f){let ne=te(s,f);if(ne){this.state.selectHash(ne.hash),this.pendingSharedCommit.set(null);return}this.loadSharedCommit(f);return}!B(()=>this.state.selectedHash())&&e.commits.length&&this.state.selectHash(e.commits[0].hash)}),T(()=>{this.commitsResp()&&!this.authorsLoaded()&&(this.authorsLoaded.set(!0),this.git.getAuthors().subscribe({next:e=>this.state.authors.set(e),error:()=>this.state.authors.set([])}),this.git.getBranches().subscribe({next:e=>this.state.branches.set(e),error:()=>this.state.branches.set([])}),this.git.getTags().subscribe({next:e=>this.state.tags.set(e),error:()=>this.state.tags.set([])}))})}errorMessage(e){if(e&&typeof e=="object"&&"error"in e){let t=e.error;if(t?.error)return t.error}return e instanceof Error?e.message:"Failed to load commits."}loadSharedCommit(e){this.loadingSharedCommit()!==e&&(this.loadingSharedCommit.set(e),this.git.getCommit(e).subscribe({next:t=>{this.state.commits.update(i=>i.some(s=>s.hash===t.hash)?i:[t,...i]),this.state.selectHash(t.hash),this.pendingSharedCommit.set(null),this.loadingSharedCommit.set(null)},error:()=>{this.state.error.set(`Shared commit not found: ${e}`),this.pendingSharedCommit.set(null),this.loadingSharedCommit.set(null)}}))}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=w({type:n,selectors:[["app-root"]],decls:7,vars:2,consts:[["class","status-bar",4,"ngIf"],["class","loading","aria-live","polite",4,"ngIf"],[1,"status-bar"],["aria-live","polite",1,"loading"],[1,"spinner"]],template:function(t,i){t&1&&(C(0,"app-toolbar"),h(1,ht,3,1,"div",0),C(2,"router-outlet"),h(3,ft,3,0,"div",1),C(4,"app-index-status")(5,"app-command-palette")(6,"app-shortcuts-modal")),t&2&&(a(),c("ngIf",i.state.error()),a(2),c("ngIf",i.state.loading()))},dependencies:[S,k,_e,J,G,U,W],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100vh;width:100vw;overflow:hidden;background:var(--bg-app);color:var(--fg-primary)}.status-bar[_ngcontent-%COMP%]{padding:.5rem 1rem;background:#dc26261a;color:var(--danger);border-bottom:1px solid var(--border-soft);font-size:13px}.loading[_ngcontent-%COMP%]{position:fixed;bottom:1rem;right:1rem;display:flex;align-items:center;gap:.5rem;padding:.5rem .85rem;background:var(--bg-elevated);border:1px solid var(--border-soft);border-radius:var(--radius-md);box-shadow:var(--shadow-md);font-size:12px;color:var(--fg-secondary);z-index:80}.spinner[_ngcontent-%COMP%]{width:14px;height:14px;border:2px solid var(--border-strong);border-top-color:var(--accent);border-radius:50%;animation:_ngcontent-%COMP%_spin .7s linear infinite}@keyframes _ngcontent-%COMP%_spin{to{transform:rotate(360deg)}}"],changeDetection:0})};function _t(n){let e=n?.trim();return e&&/^[0-9a-f]{7,40}$/i.test(e)?e:null}function te(n,e){let t=e.toLowerCase();return n.find(i=>i.hash.toLowerCase()===t||i.shortHash.toLowerCase()===t||i.hash.toLowerCase().startsWith(t))}pe(Y,Ie).catch(n=>console.error(n));
@@ -1 +1 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.block{display:block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-shrink{flex-shrink:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.border{border-width:1px}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.underline{text-decoration-line:underline}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{color-scheme:light;--bg-app: #f7f8fa;--bg-surface: #ffffff;--bg-surface-2: #f3f4f6;--bg-elevated: #ffffff;--bg-panel: rgba(255, 255, 255, .78);--bg-glass: rgba(255, 255, 255, .72);--bg-hover: #eef2ff;--bg-selected: #e0e7ff;--bg-overlay: rgba(15, 23, 42, .45);--bg-gradient: radial-gradient(circle at 12% -8%, rgba(79, 70, 229, .12), transparent 34%), radial-gradient(circle at 90% 0%, rgba(6, 182, 212, .12), transparent 28%), linear-gradient(180deg, #f8fafc 0%, #eef2f7 100%);--fg-primary: #0f172a;--fg-secondary: #475569;--fg-muted: #64748b;--fg-subtle: #94a3b8;--fg-inverted: #ffffff;--border-soft: #e2e8f0;--border-strong: #cbd5e1;--border-focus: #6366f1;--accent: #4f46e5;--accent-hover: #4338ca;--accent-soft: #eef2ff;--accent-fg: #ffffff;--accent-ring: rgba(99, 102, 241, .18);--success: #16a34a;--warning: #d97706;--danger: #dc2626;--diff-add-bg: #dcfce7;--diff-add-fg: #14532d;--diff-add-gutter: #86efac;--diff-del-bg: #fee2e2;--diff-del-fg: #7f1d1d;--diff-del-gutter: #fca5a5;--diff-hunk-bg: #f1f5f9;--diff-hunk-fg: #475569;--graph-guide: rgba(148, 163, 184, .28);--graph-row-alt: rgba(15, 23, 42, .025);--graph-row-hover: rgba(79, 70, 229, .08);--graph-row-selected: rgba(79, 70, 229, .14);--graph-node-ring: #ffffff;--graph-shadow: rgba(15, 23, 42, .12);--chart-add: #16a34a;--chart-del: #dc2626;--chart-line: #4f46e5;--chart-fill: rgba(79, 70, 229, .16);--shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);--shadow-md: 0 4px 12px rgba(15, 23, 42, .08);--shadow-lg: 0 12px 32px rgba(15, 23, 42, .12);--shadow-glow: 0 16px 60px rgba(79, 70, 229, .14);--radius-sm: 6px;--radius-md: 10px;--radius-lg: 14px;--radius-xl: 18px;--font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, "Cascadia Mono", "Liberation Mono", "Courier New", monospace}:root.dark{color-scheme:dark;--bg-app: #0b1020;--bg-surface: #111827;--bg-surface-2: #0f172a;--bg-elevated: #1f2937;--bg-panel: rgba(17, 24, 39, .74);--bg-glass: rgba(15, 23, 42, .72);--bg-hover: #1e293b;--bg-selected: #312e81;--bg-overlay: rgba(2, 6, 23, .6);--bg-gradient: radial-gradient(circle at 10% -10%, rgba(129, 140, 248, .18), transparent 34%), radial-gradient(circle at 94% 2%, rgba(34, 211, 238, .12), transparent 30%), linear-gradient(180deg, #0b1020 0%, #020617 100%);--fg-primary: #f8fafc;--fg-secondary: #cbd5e1;--fg-muted: #94a3b8;--fg-subtle: #64748b;--fg-inverted: #0b1020;--border-soft: #1f2937;--border-strong: #334155;--border-focus: #818cf8;--accent: #818cf8;--accent-hover: #a5b4fc;--accent-soft: #1e1b4b;--accent-fg: #0b1020;--accent-ring: rgba(129, 140, 248, .24);--success: #4ade80;--warning: #fbbf24;--danger: #f87171;--diff-add-bg: rgba(34, 197, 94, .16);--diff-add-fg: #bbf7d0;--diff-add-gutter: #166534;--diff-del-bg: rgba(239, 68, 68, .18);--diff-del-fg: #fecaca;--diff-del-gutter: #7f1d1d;--diff-hunk-bg: #1f2937;--diff-hunk-fg: #cbd5e1;--graph-guide: rgba(148, 163, 184, .22);--graph-row-alt: rgba(248, 250, 252, .025);--graph-row-hover: rgba(129, 140, 248, .12);--graph-row-selected: rgba(129, 140, 248, .2);--graph-node-ring: #111827;--graph-shadow: rgba(0, 0, 0, .45);--chart-add: #4ade80;--chart-del: #f87171;--chart-line: #a5b4fc;--chart-fill: rgba(129, 140, 248, .18);--shadow-sm: 0 1px 2px rgba(0, 0, 0, .45);--shadow-md: 0 6px 16px rgba(0, 0, 0, .45);--shadow-lg: 0 18px 40px rgba(0, 0, 0, .55);--shadow-glow: 0 24px 80px rgba(79, 70, 229, .18)}*,*:before,*:after{box-sizing:border-box}html,body{height:100%}body{margin:0;font-family:var(--font-sans);font-size:14px;line-height:1.5;color:var(--fg-primary);background:var(--bg-gradient);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}::selection{background:var(--accent);color:var(--accent-fg)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:999px;border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-track{background:transparent}:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}button{font-family:inherit}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;padding:.45rem .85rem;font-size:13px;font-weight:500;border-radius:calc(var(--radius-sm) + 2px);background:linear-gradient(180deg,color-mix(in oklab,var(--bg-surface) 92%,white 8%),var(--bg-surface-2));color:var(--fg-primary);border:1px solid var(--border-soft);cursor:pointer;box-shadow:var(--shadow-sm);transition:background .12s,border-color .12s,color .12s,transform 60ms,box-shadow .12s}.btn:hover{background:var(--bg-hover);border-color:var(--border-strong);box-shadow:var(--shadow-md)}.btn:active{transform:translateY(1px)}.btn-primary{background:var(--accent);color:var(--accent-fg);border-color:transparent}.btn-primary:hover{background:var(--accent-hover)}.btn-ghost{background:transparent;border-color:transparent;box-shadow:none}.btn-ghost:hover{background:var(--bg-hover)}.btn-icon{width:32px;padding:0;height:32px}.input,.select{background:color-mix(in oklab,var(--bg-surface) 88%,transparent);color:var(--fg-primary);border:1px solid var(--border-soft);border-radius:calc(var(--radius-sm) + 2px);padding:.4rem .6rem;font-size:13px;outline:none;min-height:32px}.input::placeholder{color:var(--fg-subtle)}.input:focus,.select:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--accent-ring)}.panel-card{background:linear-gradient(180deg,color-mix(in oklab,var(--bg-panel) 94%,white 6%),var(--bg-panel));border:1px solid color-mix(in oklab,var(--border-soft) 88%,transparent);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm)}.metric-chip{display:inline-flex;align-items:center;gap:.35rem;padding:.2rem .55rem;border:1px solid var(--border-soft);border-radius:999px;background:var(--bg-surface-2);color:var(--fg-secondary);font-size:11px;font-variant-numeric:tabular-nums}.skeleton{position:relative;overflow:hidden;background:var(--bg-surface-2);border-radius:var(--radius-sm)}.skeleton:after{content:"";position:absolute;inset:0;transform:translate(-100%);background:linear-gradient(90deg,transparent,color-mix(in oklab,var(--fg-muted) 14%,transparent),transparent);animation:shimmer 1.4s infinite}@keyframes shimmer{to{transform:translate(100%)}}.kbd{display:inline-flex;align-items:center;justify-content:center;min-width:22px;padding:1px 6px;font-family:var(--font-mono);font-size:11px;font-weight:600;color:var(--fg-secondary);background:var(--bg-surface);border:1px solid var(--border-strong);border-bottom-width:2px;border-radius:4px}.divider{height:1px;background:var(--border-soft)}.hljs{background:transparent;color:var(--fg-primary)}.hljs-keyword,.hljs-selector-tag,.hljs-meta-keyword,.hljs-doctag,.hljs-section,.hljs-name{color:#c084fc}.dark .hljs-keyword,.dark .hljs-selector-tag,.dark .hljs-meta-keyword,.dark .hljs-doctag,.dark .hljs-section,.dark .hljs-name{color:#d8b4fe}.hljs-string,.hljs-attr,.hljs-symbol,.hljs-bullet,.hljs-addition{color:#15803d}.dark .hljs-string,.dark .hljs-attr,.dark .hljs-symbol,.dark .hljs-bullet,.dark .hljs-addition{color:#86efac}.hljs-number,.hljs-literal,.hljs-link{color:#b45309}.dark .hljs-number,.dark .hljs-literal,.dark .hljs-link{color:#fcd34d}.hljs-comment,.hljs-quote{color:var(--fg-subtle);font-style:italic}.hljs-title,.hljs-class .hljs-title,.hljs-type{color:#1d4ed8}.dark .hljs-title,.dark .hljs-class .hljs-title,.dark .hljs-type{color:#93c5fd}.hljs-deletion{color:#b91c1c}.dark .hljs-deletion{color:#fca5a5}.cdk-overlay-dark-backdrop{background:var(--bg-overlay);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.block{display:block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-shrink{flex-shrink:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.border{border-width:1px}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.underline{text-decoration-line:underline}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}:root{color-scheme:light;--bg-app: #f7f8fa;--bg-surface: #ffffff;--bg-surface-2: #f3f4f6;--bg-elevated: #ffffff;--bg-panel: rgba(255, 255, 255, .78);--bg-glass: rgba(255, 255, 255, .72);--bg-hover: #eef2ff;--bg-selected: #e0e7ff;--bg-overlay: rgba(15, 23, 42, .45);--bg-gradient: radial-gradient(circle at 12% -8%, rgba(79, 70, 229, .12), transparent 34%), radial-gradient(circle at 90% 0%, rgba(6, 182, 212, .12), transparent 28%), linear-gradient(180deg, #f8fafc 0%, #eef2f7 100%);--fg-primary: #0f172a;--fg-secondary: #475569;--fg-muted: #64748b;--fg-subtle: #94a3b8;--fg-inverted: #ffffff;--border-soft: #e2e8f0;--border-strong: #cbd5e1;--border-focus: #6366f1;--accent: #4f46e5;--accent-hover: #4338ca;--accent-soft: #eef2ff;--accent-fg: #ffffff;--accent-ring: rgba(99, 102, 241, .18);--success: #16a34a;--warning: #d97706;--danger: #dc2626;--diff-add-bg: #dcfce7;--diff-add-fg: #14532d;--diff-add-gutter: #86efac;--diff-del-bg: #fee2e2;--diff-del-fg: #7f1d1d;--diff-del-gutter: #fca5a5;--diff-hunk-bg: #f1f5f9;--diff-hunk-fg: #475569;--graph-guide: rgba(148, 163, 184, .28);--graph-row-alt: rgba(15, 23, 42, .025);--graph-row-hover: rgba(79, 70, 229, .08);--graph-row-selected: rgba(79, 70, 229, .14);--graph-node-ring: #ffffff;--graph-shadow: rgba(15, 23, 42, .12);--chart-add: #16a34a;--chart-del: #dc2626;--chart-line: #4f46e5;--chart-fill: rgba(79, 70, 229, .16);--shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);--shadow-md: 0 4px 12px rgba(15, 23, 42, .08);--shadow-lg: 0 12px 32px rgba(15, 23, 42, .12);--shadow-glow: 0 16px 60px rgba(79, 70, 229, .14);--radius-sm: 6px;--radius-md: 10px;--radius-lg: 14px;--radius-xl: 18px;--font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, "Cascadia Mono", "Liberation Mono", "Courier New", monospace}:root.dark{color-scheme:dark;--bg-app: #0b1020;--bg-surface: #111827;--bg-surface-2: #0f172a;--bg-elevated: #1f2937;--bg-panel: rgba(17, 24, 39, .74);--bg-glass: rgba(15, 23, 42, .72);--bg-hover: #1e293b;--bg-selected: #312e81;--bg-overlay: rgba(2, 6, 23, .6);--bg-gradient: radial-gradient(circle at 10% -10%, rgba(129, 140, 248, .18), transparent 34%), radial-gradient(circle at 94% 2%, rgba(34, 211, 238, .12), transparent 30%), linear-gradient(180deg, #0b1020 0%, #020617 100%);--fg-primary: #f8fafc;--fg-secondary: #cbd5e1;--fg-muted: #94a3b8;--fg-subtle: #64748b;--fg-inverted: #0b1020;--border-soft: #1f2937;--border-strong: #334155;--border-focus: #818cf8;--accent: #818cf8;--accent-hover: #a5b4fc;--accent-soft: #1e1b4b;--accent-fg: #0b1020;--accent-ring: rgba(129, 140, 248, .24);--success: #4ade80;--warning: #fbbf24;--danger: #f87171;--diff-add-bg: rgba(34, 197, 94, .16);--diff-add-fg: #bbf7d0;--diff-add-gutter: #166534;--diff-del-bg: rgba(239, 68, 68, .18);--diff-del-fg: #fecaca;--diff-del-gutter: #7f1d1d;--diff-hunk-bg: #1f2937;--diff-hunk-fg: #cbd5e1;--graph-guide: rgba(148, 163, 184, .22);--graph-row-alt: rgba(248, 250, 252, .025);--graph-row-hover: rgba(129, 140, 248, .12);--graph-row-selected: rgba(129, 140, 248, .2);--graph-node-ring: #111827;--graph-shadow: rgba(0, 0, 0, .45);--chart-add: #4ade80;--chart-del: #f87171;--chart-line: #a5b4fc;--chart-fill: rgba(129, 140, 248, .18);--shadow-sm: 0 1px 2px rgba(0, 0, 0, .45);--shadow-md: 0 6px 16px rgba(0, 0, 0, .45);--shadow-lg: 0 18px 40px rgba(0, 0, 0, .55);--shadow-glow: 0 24px 80px rgba(79, 70, 229, .18)}*,*:before,*:after{box-sizing:border-box}html,body{height:100%}body{margin:0;font-family:var(--font-sans);font-size:14px;line-height:1.5;color:var(--fg-primary);background:var(--bg-gradient);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}::selection{background:var(--accent);color:var(--accent-fg)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:999px;border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-track{background:transparent}:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}button{font-family:inherit}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;padding:.45rem .85rem;font-size:13px;font-weight:500;border-radius:calc(var(--radius-sm) + 2px);background:linear-gradient(180deg,color-mix(in oklab,var(--bg-surface) 92%,white 8%),var(--bg-surface-2));color:var(--fg-primary);border:1px solid var(--border-soft);cursor:pointer;box-shadow:var(--shadow-sm);transition:background .12s,border-color .12s,color .12s,transform 60ms,box-shadow .12s}.btn:hover{background:var(--bg-hover);border-color:var(--border-strong);box-shadow:var(--shadow-md)}.btn:active{transform:translateY(1px)}.btn-primary{background:var(--accent);color:var(--accent-fg);border-color:transparent}.btn-primary:hover{background:var(--accent-hover)}.btn-ghost{background:transparent;border-color:transparent;box-shadow:none}.btn-ghost:hover{background:var(--bg-hover)}.btn-icon{width:32px;padding:0;height:32px}.input,.select{background:color-mix(in oklab,var(--bg-surface) 88%,transparent);color:var(--fg-primary);border:1px solid var(--border-soft);border-radius:calc(var(--radius-sm) + 2px);padding:.4rem .6rem;font-size:13px;outline:none;min-height:32px}.input::placeholder{color:var(--fg-subtle)}.input:focus,.select:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--accent-ring)}.panel-card{background:linear-gradient(180deg,color-mix(in oklab,var(--bg-panel) 94%,white 6%),var(--bg-panel));border:1px solid color-mix(in oklab,var(--border-soft) 88%,transparent);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm)}.metric-chip{display:inline-flex;align-items:center;gap:.35rem;padding:.2rem .55rem;border:1px solid var(--border-soft);border-radius:999px;background:var(--bg-surface-2);color:var(--fg-secondary);font-size:11px;font-variant-numeric:tabular-nums}.skeleton{position:relative;overflow:hidden;background:var(--bg-surface-2);border-radius:var(--radius-sm)}.skeleton:after{content:"";position:absolute;inset:0;transform:translate(-100%);background:linear-gradient(90deg,transparent,color-mix(in oklab,var(--fg-muted) 14%,transparent),transparent);animation:shimmer 1.4s infinite}@keyframes shimmer{to{transform:translate(100%)}}.kbd{display:inline-flex;align-items:center;justify-content:center;min-width:22px;padding:1px 6px;font-family:var(--font-mono);font-size:11px;font-weight:600;color:var(--fg-secondary);background:var(--bg-surface);border:1px solid var(--border-strong);border-bottom-width:2px;border-radius:4px}.divider{height:1px;background:var(--border-soft)}.hljs{background:transparent;color:var(--fg-primary)}.hljs-keyword,.hljs-selector-tag,.hljs-meta-keyword,.hljs-doctag,.hljs-section,.hljs-name{color:#c084fc}.dark .hljs-keyword,.dark .hljs-selector-tag,.dark .hljs-meta-keyword,.dark .hljs-doctag,.dark .hljs-section,.dark .hljs-name{color:#d8b4fe}.hljs-string,.hljs-attr,.hljs-symbol,.hljs-bullet,.hljs-addition{color:#15803d}.dark .hljs-string,.dark .hljs-attr,.dark .hljs-symbol,.dark .hljs-bullet,.dark .hljs-addition{color:#86efac}.hljs-number,.hljs-literal,.hljs-link{color:#b45309}.dark .hljs-number,.dark .hljs-literal,.dark .hljs-link{color:#fcd34d}.hljs-comment,.hljs-quote{color:var(--fg-subtle);font-style:italic}.hljs-title,.hljs-class .hljs-title,.hljs-type{color:#1d4ed8}.dark .hljs-title,.dark .hljs-class .hljs-title,.dark .hljs-type{color:#93c5fd}.hljs-deletion{color:#b91c1c}.dark .hljs-deletion{color:#fca5a5}.cdk-overlay-dark-backdrop{background:var(--bg-overlay);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}
@@ -1 +1 @@
1
- {"version":3,"file":"aggregations.d.ts","sourceRoot":"","sources":["../../src/backend/aggregations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3F,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAoB5E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,GAClD,SAAS,EAAE,CA4Bb;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,GAClD,cAAc,CAAC,YAAY,CAAC,CAmB9B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,SAAK,GAAG,SAAS,EAAE,CAiC7E"}
1
+ {"version":3,"file":"aggregations.d.ts","sourceRoot":"","sources":["../../src/backend/aggregations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3F,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAoB5E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,GAAG,SAAS,EAAE,CA4BjG;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,GAClD,cAAc,CAAC,YAAY,CAAC,CAmB9B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,SAAK,GAAG,SAAS,EAAE,CAgC7E"}
@@ -1 +1 @@
1
- {"version":3,"file":"aggregations.js","sourceRoot":"","sources":["../../src/backend/aggregations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aggregations.js","sourceRoot":"","sources":["../../src/backend/aggregations.ts"],"names":[],"mappings":"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"}