git-history-ui 4.0.0 → 4.0.1

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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,13 @@ All notable changes to this project are documented in this file.
4
4
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
5
5
  this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [4.0.1] - 2026-05-02
8
+
9
+ ### Fixed
10
+
11
+ - Commit loading now falls back to the paginated commits endpoint if the SSE
12
+ stream fails, and server-sent stream errors preserve their real message.
13
+
7
14
  ## [4.0.0] - 2026-05-02
8
15
 
9
16
  ### Added
@@ -0,0 +1 @@
1
+ import{$ as v,W as b,g as u,lc as c,mc as E}from"./chunk-OBPR2XVH.js";var O=class s{http=v(E);base="/api";getCommits(t={}){let e=new c;for(let[l,a]of Object.entries(t))a!=null&&a!==""&&(e=e.set(l,String(a)));return this.http.get(`${this.base}/commits`,{params:e})}streamCommits(t={}){return new u(e=>{let l=new URL(`${window.location.origin}${this.base}/commits/stream`);for(let[i,r]of Object.entries(t))r!=null&&r!==""&&l.searchParams.set(i,String(r));let a=new EventSource(l.toString()),o=[],m=[],f=Math.max(1,t.page??1),h=0,n=0,g=!1,p=null,C=()=>{n=0,!(!m.length&&!g)&&(m.length&&o.push(...m.splice(0)),e.next({commits:o.slice(),total:g&&h||o.length,page:f,pageSize:o.length||t.pageSize||100,totalPages:1,hasNext:!1,hasPrevious:f>1}),g&&(a.close(),e.complete()))},d=()=>{n||(n=requestAnimationFrame(C))};return a.addEventListener("commit",i=>{m.push(JSON.parse(i.data)),d()}),a.addEventListener("done",i=>{h=JSON.parse(i.data).total??o.length+m.length,g=!0,d()}),a.addEventListener("error",i=>{a.close(),n&&cancelAnimationFrame(n),p=this.getCommits(t).subscribe({next:r=>e.next(r),error:r=>e.error(w(i)?S(i):r),complete:()=>e.complete()})}),()=>{a.close(),n&&cancelAnimationFrame(n),p?.unsubscribe()}})}getCommit(t){return this.http.get(`${this.base}/commit/${t}`)}getDiff(t){return this.http.get(`${this.base}/diff/${t}`)}getBlame(t){let e=new c().set("file",t);return this.http.get(`${this.base}/blame`,{params:e})}getTags(){return this.http.get(`${this.base}/tags`)}getBranches(){return this.http.get(`${this.base}/branches`)}getAuthors(){return this.http.get(`${this.base}/authors`)}static \u0275fac=function(e){return new(e||s)};static \u0275prov=b({token:s,factory:s.\u0275fac,providedIn:"root"})};function w(s){return s instanceof MessageEvent&&typeof s.data=="string"&&s.data.length>0}function S(s){if(s instanceof MessageEvent&&typeof s.data=="string"&&s.data)try{let t=JSON.parse(s.data),e=t.message||t.error;if(e)return new Error(e)}catch{return new Error(s.data)}return new Error("Failed to load commits.")}export{O as a};
@@ -1,2 +1,2 @@
1
- import{a as Jt,b as en,c as pn}from"./chunk-CFCRPNUQ.js";import{a as rn}from"./chunk-UNROVCUZ.js";import{a as Zt,b as Qt,c as Kt,h as Xt}from"./chunk-UHWTLUOW.js";import{a as tn}from"./chunk-AWMYL3YU.js";import{a as G}from"./chunk-I4VBIHH2.js";import{g as on,i as an,k as sn,l as ln,m as cn,n as dn,o as mn}from"./chunk-EZUFC4CQ.js";import{d as Yt}from"./chunk-6VRZZB3T.js";import{a as nn}from"./chunk-UIWFTWLF.js";import{$ as g,$a as Nt,Ab as v,B as _t,Bb as j,C as ke,Cb as Ve,D as vt,Db as jt,Ea as Ie,Eb as nt,Fb as it,Ga as s,Gb as rt,I as Ct,Ia as Dt,Ib as he,Ja as et,Ka as Pt,Kb as ue,Lb as _e,Ma as It,N as bt,Nb as Fe,P as xt,Pa as D,Q as Je,Qa as pe,Qb as Ht,R as Oe,Ra as se,Rb as ie,S as Ee,Sa as tt,Sb as H,Ta as b,V as wt,Va as Rt,Vb as Gt,W as N,Wa as fe,Wb as Wt,X as de,Xa as Tt,Yb as $t,Z as X,ab as ge,cc as Z,db as h,dc as I,e as ft,ea as k,eb as l,ec as ze,fa as O,fb as a,g as Xe,ga as yt,gb as y,gc as R,hb as Vt,i as gt,ib as Ft,j as T,ja as St,jb as zt,ka as De,kb as Re,kc as Ut,la as Mt,lb as Te,lc as qt,m as ht,mb as V,mc as Le,n as ut,nb as S,oa as w,ob as x,pb as Lt,q as Y,qa as kt,qb as At,ra as Ot,s as Me,sa as Pe,sb as J,tb as ee,ub as te,va as me,vb as Ne,wb as ne,xb as F,yb as Bt,za as Et,zb as c}from"./chunk-OBPR2XVH.js";var Ae=class i{http=g(Le);base="/api";list(n){return this.http.get(`${this.base}/annotations/${n}`)}add(n,e,t){return this.http.post(`${this.base}/annotations/${n}`,{author:e,body:t})}remove(n,e){return this.http.delete(`${this.base}/annotations/${n}/${e}`)}static \u0275fac=function(e){return new(e||i)};static \u0275prov=N({token:i,factory:i.\u0275fac,providedIn:"root"})};var On=["svg"];function En(i,n){i&1&&(l(0,"div",8),c(1,"No graph data \u2014 changed files have no detectable internal imports."),a())}var Be=class i{impact=null;svgRef;simulation=null;hasData=!1;ngAfterViewInit(){this.render()}ngOnChanges(){this.render()}ngOnDestroy(){this.simulation?.stop()}render(){if(!this.svgRef)return;let n=this.svgRef.nativeElement,e=on(n);e.selectAll("*").remove();let t=this.impact;if(!t||t.dependencyRipple.length===0&&t.modules.length===0){this.hasData=!1;return}this.hasData=!0;let r=n.clientWidth||600,o=280,d=getComputedStyle(n),u=fn(d,"--fg-secondary","#cbd5e1"),m=fn(d,"--bg-surface-2","#0b1020"),_=new Map,p=(f,q,Q)=>{let C=_.get(f);return C||(C={id:f,group:q,label:Q},_.set(f,C)),C};for(let f of t.files)p(`f:${f}`,"changed",ot(f));for(let f of t.modules)p(`m:${f}`,"module",f);for(let f of t.dependencyRipple)p(`f:${f.from}`,"changed",ot(f.from)),p(`f:${f.to}`,"imported",ot(f.to));let M=[];for(let f of t.dependencyRipple)M.push({source:`f:${f.from}`,target:`f:${f.to}`,type:"imports"});for(let f of t.files){let q=Dn(f);t.modules.includes(q)&&M.push({source:`f:${f}`,target:`m:${q}`,type:"in-module"})}let A=Array.from(_.values()),U=e.append("g").attr("stroke","var(--border-strong)").attr("stroke-opacity",.5).selectAll("line").data(M).join("line").attr("stroke-dasharray",f=>f.type==="in-module"?"2,3":null),W=e.append("g").selectAll("circle").data(A).join("circle").attr("r",f=>f.group==="module"?7:5).attr("fill",f=>f.group==="changed"?"var(--accent)":f.group==="imported"?"#f59e0b":"#8b5cf6").attr("stroke","var(--bg-surface-2)").attr("stroke-width",1.5).call(Se());W.append("title").text(f=>f.id.slice(2));let B=e.append("g").selectAll("text").data(A).join("text").attr("class","node-label").attr("dx",8).attr("dy",3).attr("fill",u).attr("stroke",m).attr("stroke-width",2).attr("paint-order","stroke").text(f=>f.label);this.simulation?.stop(),this.simulation=dn(A).force("link",cn(M).id(f=>f.id).distance(60).strength(.4)).force("charge",mn().strength(-160)).force("center",sn(r/2,o/2)).force("collide",ln(14)).on("tick",()=>{U.attr("x1",f=>f.source.x??0).attr("y1",f=>f.source.y??0).attr("x2",f=>f.target.x??0).attr("y2",f=>f.target.y??0),W.attr("cx",f=>f.x??0).attr("cy",f=>f.y??0),B.attr("x",f=>f.x??0).attr("y",f=>f.y??0)});function Se(){function f(C,E){C.active||window.__impactSim?.alphaTarget?.(.3).restart(),E.fx=E.x,E.fy=E.y}function q(C,E){E.fx=C.x,E.fy=C.y}function Q(C,E){C.active||window.__impactSim?.alphaTarget?.(0),E.fx=null,E.fy=null}return an().on("start",f).on("drag",q).on("end",Q)}window.__impactSim=this.simulation}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=D({type:i,selectors:[["app-impact-graph"]],viewQuery:function(e,t){if(e&1&&J(On,7),e&2){let r;ee(r=te())&&(t.svgRef=r.first)}},inputs:{impact:"impact"},features:[Pe],decls:11,vars:1,consts:[["svg",""],[1,"legend"],[1,"dot","dot-changed"],[1,"dot","dot-imported"],[1,"dot","dot-module"],[1,"canvas-wrap"],["width","100%","height","280","aria-label","Commit impact graph"],["class","empty",4,"ngIf"],[1,"empty"]],template:function(e,t){e&1&&(l(0,"div",1),y(1,"span",2),c(2," changed "),y(3,"span",3),c(4," imports "),y(5,"span",4),c(6," module "),a(),l(7,"div",5),yt(),y(8,"svg",6,0),b(10,En,2,0,"div",7),a()),e&2&&(s(10),h("ngIf",!t.hasData))},dependencies:[R,I],styles:["[_nghost-%COMP%]{display:block}.legend[_ngcontent-%COMP%]{display:flex;gap:.75rem;align-items:center;font-size:11px;color:var(--fg-muted);margin-bottom:.4rem}.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;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:hidden}.empty[_ngcontent-%COMP%]{position:absolute;inset:0;display:grid;place-items:center;color:var(--fg-muted);font-size:11px;pointer-events:none}[_nghost-%COMP%] .node-label{font-size:9px;fill:var(--fg-secondary);font-family:var(--font-mono, monospace);pointer-events:none;paint-order:stroke;stroke:var(--bg-app);stroke-width:2px;stroke-linejoin:round}"],changeDetection:0})};function ot(i){let n=i.split("/");return n[n.length-1]}function Dn(i){let n=i.split("/");return n.length===1?"(root)":n.slice(0,Math.min(n.length-1,3)).join("/")}function fn(i,n,e){return i.getPropertyValue(n).trim()||e}function Pn(i,n){if(i&1&&(l(0,"span",36),c(1),a()),i&2){let e=n.$implicit;s(),v(e)}}function In(i,n){if(i&1&&(l(0,"span",37),c(1),a()),i&2){let e=n.$implicit;s(),v(e)}}function Rn(i,n){i&1&&(l(0,"span",38),c(1,"merge"),a())}function Tn(i,n){if(i&1&&(l(0,"pre",39),c(1),a()),i&2){let e=x().ngIf;s(),v(e.body)}}function Nn(i,n){if(i&1){let e=V();l(0,"div",40)(1,"span",41),c(2,"AI"),a(),l(3,"span",42),c(4),a(),l(5,"button",43),S("click",function(){k(e);let r=x(2);return O(r.explanation.set(null))}),c(6,"\xD7"),a()()}if(i&2){let e=n.ngIf;s(4),v(e)}}function Vn(i,n){if(i&1&&(l(0,"div",44),c(1),a()),i&2){let e=n.ngIf;s(),v(e)}}function Fn(i,n){if(i&1&&(l(0,"li"),c(1),a()),i&2){let e=n.$implicit;s(),v(e)}}function zn(i,n){if(i&1){let e=V();l(0,"li",28),S("click",function(){let r=k(e).$implicit,o=x(3);return O(o.state.selectHash(r.hash))}),l(1,"code"),c(2),a(),l(3,"span"),c(4),a()()}if(i&2){let e=n.$implicit;s(2),v(e.hash.slice(0,7)),s(2),v(e.subject)}}function Ln(i,n){if(i&1&&(l(0,"div",45)(1,"div",46)(2,"span"),c(3,"Impact"),a(),l(4,"span",47),c(5),a()(),y(6,"app-impact-graph",48),l(7,"div",49)(8,"div")(9,"h4"),c(10,"Modules"),a(),l(11,"ul",50),b(12,Fn,2,1,"li",51),a()(),l(13,"div")(14,"h4"),c(15,"Related commits"),a(),l(16,"ul",52),b(17,zn,5,2,"li",53),a()()()()),i&2){let e=n.ngIf;s(5),jt(" ",e.files.length," files \xB7 ",e.modules.length," modules \xB7 ",e.relatedCommits.length," related commits "),s(),h("impact",e),s(6),h("ngForOf",e.modules),s(5),h("ngForOf",e.relatedCommits)}}function An(i,n){if(i&1&&(l(0,"span",54),c(1),a()),i&2){let e=x(2);s(),v(e.files().length)}}function Bn(i,n){if(i&1&&(l(0,"span",63),c(1),a()),i&2){let e=x().$implicit;s(),j("+",e.additions)}}function jn(i,n){if(i&1&&(l(0,"span",64),c(1),a()),i&2){let e=x().$implicit;s(),j("\u2212",e.deletions)}}function Hn(i,n){if(i&1){let e=V();l(0,"div",55)(1,"button",56),S("click",function(){let r=k(e).$implicit,o=x(2);return O(o.selectFile(r))}),y(2,"span",57),l(3,"span",58),c(4),a(),l(5,"span",59),b(6,Bn,2,1,"span",60)(7,jn,2,1,"span",61),a()(),l(8,"button",62),S("click",function(){let r=k(e).$implicit,o=x(2);return O(o.openFileHistory(r.file))}),c(9," \u23F1 "),a()()}if(i&2){let e,t=n.$implicit,r=x(2);s(),F("selected",t.file===((e=r.activeFile())==null?null:e.file)),s(),ge("data-status",t.status),s(),h("title",t.file),s(),v(t.file),s(2),h("ngIf",t.additions),s(),h("ngIf",t.deletions)}}function Gn(i,n){i&1&&(l(0,"div",65),c(1," No files changed. "),a())}function Wn(i,n){i&1&&(l(0,"div",65),c(1,"Loading\u2026"),a())}function $n(i,n){if(i&1){let e=V();l(0,"div",66)(1,"div",67)(2,"strong"),c(3),a(),l(4,"span",68),c(5),ue(6,"date"),a(),l(7,"button",69),S("click",function(){let r=k(e).$implicit,o=x(2);return O(o.deleteComment(r.id))}),c(8,"\xD7"),a()(),l(9,"p",70),c(10),a()()}if(i&2){let e=n.$implicit;s(3),v(e.author),s(2),v(_e(6,3,e.createdAt,"short")),s(5),v(e.body)}}function Un(i,n){if(i&1){let e=V();Re(0),l(1,"header",2)(2,"div",3)(3,"span",4),c(4),a(),l(5,"span",5),b(6,Pn,2,1,"span",6)(7,In,2,1,"span",7)(8,Rn,2,0,"span",8),a()(),l(9,"h2",9),c(10),a(),l(11,"div",10)(12,"span"),c(13),a(),l(14,"span",11),c(15,"\u2022"),a(),l(16,"span"),c(17),ue(18,"date"),a()(),b(19,Tn,2,1,"pre",12),l(20,"div",13)(21,"button",14),S("click",function(){k(e);let r=x();return O(r.onExplain())}),c(22),a(),l(23,"button",14),S("click",function(){k(e);let r=x();return O(r.onLoadImpact())}),c(24),a(),l(25,"button",15),S("click",function(){k(e);let r=x();return O(r.copyShareLink())}),c(26),a()(),b(27,Nn,7,1,"div",16)(28,Vn,2,1,"div",17),a(),b(29,Ln,18,6,"div",18),l(30,"div",19)(31,"aside",20)(32,"div",21)(33,"span"),c(34,"Files"),a(),b(35,An,2,1,"span",22),a(),l(36,"div",23),b(37,Hn,10,7,"div",24)(38,Gn,2,0,"div",25)(39,Wn,2,0,"div",25),a()(),l(40,"section",26)(41,"details",27)(42,"summary",28),S("click",function(r){k(e);let o=x();return O(o.toggleAnnotations(r))}),c(43),a(),l(44,"div",29),b(45,$n,11,6,"div",30),l(46,"div",31)(47,"input",32),rt("ngModelChange",function(r){k(e);let o=x();return it(o.commentAuthor,r)||(o.commentAuthor=r),O(r)}),a(),l(48,"textarea",33),rt("ngModelChange",function(r){k(e);let o=x();return it(o.commentDraft,r)||(o.commentDraft=r),O(r)}),a(),l(49,"button",34),S("click",function(){k(e);let r=x();return O(r.addComment())}),c(50,"Post"),a()()()(),y(51,"app-diff-viewer",35),a()(),Te()}if(i&2){let e=n.ngIf,t=x();s(4),v(e.shortHash),s(2),h("ngForOf",e.tags),s(),h("ngForOf",e.branches),s(),h("ngIf",e.isMerge),s(2),v(e.subject),s(3),Ve("",e.author," <",e.authorEmail,">"),s(4),v(_e(18,29,e.date,"medium")),s(2),h("ngIf",e.body),s(2),h("disabled",t.explaining()),s(),j(" ",t.explaining()?"...":"\u2728 Explain change"," "),s(),h("disabled",t.loadingImpact()),s(),j(" ",t.loadingImpact()?"...":t.impact()?"Refresh impact":"Show impact"," "),s(2),j(" ",t.shareCopied()?"Copied!":"\u{1F517} Share"," "),s(),h("ngIf",t.explanation()),s(),h("ngIf",t.explainError()),s(),h("ngIf",t.impact()),s(6),h("ngIf",t.files().length),s(2),h("ngForOf",t.files())("ngForTrackBy",t.trackByFile),s(),h("ngIf",!t.files().length&&!t.loading()),s(),h("ngIf",t.loading()),s(2),h("open",t.annotationsOpen()),s(2),j(" \u{1F4AC} Notes (",t.comments().length,") "),s(2),h("ngForOf",t.comments()),s(2),nt("ngModel",t.commentAuthor),s(),nt("ngModel",t.commentDraft),s(),h("disabled",!t.commentDraft.trim()),s(2),h("fileInput",t.activeFile())}}function qn(i,n){i&1&&(l(0,"div",71)(1,"p",72),c(2,"No commit selected"),a(),l(3,"p",73),c(4," Pick a commit from the list, or press "),l(5,"kbd",74),c(6,"\u2318K"),a(),c(7," to open the command palette. "),a()())}var je=class i{state=g(G);git=g(tn);insightsApi=g(nn);annotationsApi=g(Ae);router=g(Yt);commit=this.state.selected;impact=w(null);loadingImpact=w(!1);explanation=w(null);explainError=w(null);explaining=w(!1);comments=w([]);annotationsOpen=w(!1);shareCopied=w(!1);commentDraft="";commentAuthor="me";loading=w(!1);files=en(Jt(this.commit).pipe(Oe(n=>n?(this.loading.set(!0),this.git.getDiff(n.hash).pipe(vt(()=>Y([])))):(this.loading.set(!1),Y([])))),{initialValue:[]});activeFileIndex=w(0);activeFile=ie(()=>{let n=this.files();if(!n.length)return null;let e=Math.min(this.activeFileIndex(),n.length-1);return n[e]});constructor(){H(()=>{this.files(),this.activeFileIndex.set(0),this.loading.set(!1)}),H(()=>{let n=this.commit();if(this.impact.set(null),this.explanation.set(null),this.explainError.set(null),this.shareCopied.set(!1),!n){this.comments.set([]);return}this.annotationsApi.list(n.hash).subscribe({next:e=>this.comments.set(e),error:()=>this.comments.set([])})})}trackByFile(n,e){return e.file}selectFile(n){let e=this.files().findIndex(t=>t.file===n.file);e>=0&&this.activeFileIndex.set(e)}openFileHistory(n){this.router.navigate(["/file",encodeURIComponent(n)])}shortPath(n){if(n.length<=32)return n;let e=n.split("/");return e.length<=2?n:e[0]+"/.../"+e.slice(-2).join("/")}onLoadImpact(){let n=this.commit();n&&(this.loadingImpact.set(!0),this.insightsApi.impact(n.hash).subscribe({next:e=>{this.impact.set(e),this.loadingImpact.set(!1)},error:()=>this.loadingImpact.set(!1)}))}onExplain(){let n=this.commit();!n||this.explaining()||(this.explaining.set(!0),this.explainError.set(null),this.insightsApi.explainCommit(n.hash).subscribe({next:e=>{this.explanation.set(e.summary),this.explaining.set(!1)},error:e=>{this.explainError.set(e?.error?.error??"AI explanation unavailable. Set ANTHROPIC_API_KEY or OPENAI_API_KEY."),this.explaining.set(!1)}}))}copyShareLink(){let n=this.commit();if(!n)return;let e=`${window.location.origin}/?commit=${n.hash}`;navigator.clipboard?.writeText(e).then(()=>{this.shareCopied.set(!0),setTimeout(()=>this.shareCopied.set(!1),1500)}).catch(()=>{this.shareCopied.set(!1)})}toggleAnnotations(n){setTimeout(()=>this.annotationsOpen.set(!this.annotationsOpen()),0)}addComment(){let n=this.commit();!n||!this.commentDraft.trim()||this.annotationsApi.add(n.hash,this.commentAuthor||"anonymous",this.commentDraft.trim()).subscribe({next:e=>{this.comments.set([...this.comments(),e]),this.commentDraft=""}})}deleteComment(n){let e=this.commit();e&&this.annotationsApi.remove(e.hash,n).subscribe({next:()=>this.comments.set(this.comments().filter(t=>t.id!==n))})}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=D({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"],[1,"btn","btn-ghost","btn-icon","close",3,"click"],[1,"ai-card","error"],[1,"impact-card"],[1,"impact-head"],[1,"impact-meta"],[3,"impact"],[1,"impact-body"],[1,"modules"],[4,"ngFor","ngForOf"],[1,"related"],[3,"click",4,"ngFor","ngForOf"],[1,"count"],[1,"file-row"],[1,"file",3,"click"],[1,"status-dot"],[1,"path",3,"title"],[1,"counts"],["class","add",4,"ngIf"],["class","del",4,"ngIf"],["title","View file history",1,"file-history",3,"click"],[1,"add"],[1,"del"],[1,"files-empty"],[1,"comment"],[1,"comment-head"],[1,"comment-date"],["title","Delete",1,"btn","btn-ghost","btn-icon",3,"click"],[1,"comment-body"],[1,"placeholder"],[1,"title"],[1,"hint"],[1,"kbd"]],template:function(e,t){if(e&1&&b(0,Un,52,32,"ng-container",1)(1,qn,8,0,"ng-template",null,0,Fe),e&2){let r=Ne(2);h("ngIf",t.commit())("ngIfElse",r)}},dependencies:[R,Z,I,Xt,Zt,Qt,Kt,rn,Be,ze],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)}.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;line-height:1.5}.ai-card[_ngcontent-%COMP%] .close[_ngcontent-%COMP%]{font-size:14px;line-height:1;padding:0 6px}.impact-card[_ngcontent-%COMP%]{margin:.6rem 1rem;background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);padding:.75rem 1rem;box-shadow:var(--shadow-sm)}.impact-head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;font-weight:600;margin-bottom:.5rem;font-size:13px}.impact-meta[_ngcontent-%COMP%]{color:var(--fg-muted);font-weight:400;font-size:11px}.impact-body[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:.75rem;font-size:12px}.impact-body[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:0 0 .4rem;font-size:11px;color:var(--fg-muted);text-transform:uppercase;letter-spacing:.04em}.impact-body[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0}.impact-body[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{padding:2px 0;word-break:break-all}.modules[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace)}.ripple[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-secondary)}.related[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{cursor:pointer;display:flex;gap:.4rem}.related[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover{color:var(--accent)}.related[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);color:var(--fg-muted);flex-shrink:0}.impact-body[_ngcontent-%COMP%] .muted[_ngcontent-%COMP%]{color:var(--fg-muted);font-style:italic;margin:0;font-size:11px}.file-row[_ngcontent-%COMP%]{display:flex}.file-row[_ngcontent-%COMP%] .file[_ngcontent-%COMP%]{flex:1}.file-history[_ngcontent-%COMP%]{background:transparent;border:0;border-bottom:1px solid var(--border-soft);cursor:pointer;color:var(--fg-muted);padding:0 .6rem;font-size:12px}.file-history[_ngcontent-%COMP%]:hover{background:var(--bg-elevated);color:var(--accent)}.annotations[_ngcontent-%COMP%]{margin:.5rem;background:var(--bg-surface);border:1px solid var(--border-soft);border-radius:var(--radius-sm)}.annotations[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{padding:.4rem .7rem;cursor:pointer;font-size:12px;color:var(--fg-secondary);-webkit-user-select:none;user-select:none}.annotations[open][_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{border-bottom:1px solid var(--border-soft)}.annot-body[_ngcontent-%COMP%]{padding:.5rem .7rem}.comment[_ngcontent-%COMP%]{padding:.4rem 0;border-bottom:1px dashed var(--border-soft);font-size:12px}.comment[_ngcontent-%COMP%]:last-of-type{border-bottom:0}.comment-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem}.comment-date[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px;flex:1}.comment-body[_ngcontent-%COMP%]{margin:.2rem 0 0;line-height:1.4;white-space:pre-wrap}.comment-form[_ngcontent-%COMP%]{display:flex;gap:.4rem;flex-direction:column;margin-top:.5rem}.comment-form[_ngcontent-%COMP%] .input[_ngcontent-%COMP%]{width:100%;padding:.35rem .5rem;background:var(--bg-app);border:1px solid var(--border-soft);border-radius:var(--radius-sm);color:var(--fg-primary);font-family:inherit;font-size:12px}.comment-form[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{min-height:60px;resize:vertical}.comment-form[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]{align-self:flex-end}"],changeDetection:0})};var Yn=["canvas"],Zn=["scroll"];function Qn(i,n){if(i&1&&y(0,"span",11),i&2){let e=n.$implicit;ne("background",e)}}function Kn(i,n){i&1&&(l(0,"div",12),c(1," No commits to draw. "),a())}var P=34,be=24,He=5.5,at=16,xe=16,st=["#4f46e5","#06b6d4","#f59e0b","#ef4444","#10b981","#8b5cf6","#ec4899","#0ea5e9"],Ge=class i{state=g(G);theme=g(pn);legendColors=st.slice(0,5);graphSummary=ie(()=>{let n=this.state.commits().length,e=this.laneCount;return n?`${n.toLocaleString()} commits across ${e} lane${e===1?"":"s"}`:"Swim-lane visualization"});contentHeight=ie(()=>{let n=this.state.commits().length;return n?xe*2+n*P:0});canvasRef;scrollRef;nodes=[];rowByHash=new Map;laneCount=1;hoverRow=-1;layoutToken=0;idleHandle=null;canvasSize={width:0,height:0,dpr:0};canvasTransform="";onCanvasClick=n=>this.onClick(n);onCanvasMove=n=>this.onMouseMove(n);onCanvasLeave=()=>this.onMouseLeave();scrollRaf=0;onScroll=()=>{this.scrollRaf||(this.scrollRaf=requestAnimationFrame(()=>{this.scrollRaf=0,this.draw()}))};constructor(){H(()=>{this.scheduleLayout(this.state.commits())}),H(()=>{this.state.selectedHash(),this.theme.resolved(),this.draw()})}ngAfterViewInit(){let n=this.canvasRef.nativeElement;n.addEventListener("click",this.onCanvasClick),n.addEventListener("mousemove",this.onCanvasMove),n.addEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.addEventListener("scroll",this.onScroll,{passive:!0}),this.draw()}ngOnDestroy(){let n=this.canvasRef?.nativeElement;n?.removeEventListener("click",this.onCanvasClick),n?.removeEventListener("mousemove",this.onCanvasMove),n?.removeEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.removeEventListener("scroll",this.onScroll),this.scrollRaf&&cancelAnimationFrame(this.scrollRaf),this.cancelIdleLayout()}onResize(){this.draw()}scheduleLayout(n){let e=++this.layoutToken;if(this.cancelIdleLayout(),this.nodes=[],this.rowByHash.clear(),this.hoverRow=-1,!n.length){this.laneCount=1,this.draw();return}let t=[],r=m=>{let _=t.indexOf(m);if(_>=0)return _;let p=t.indexOf(null);return p>=0?(t[p]=m,p):(t.push(m),t.length-1)},o=m=>{let _=n[m],p=r(_.hash),M={commit:_,row:m,lane:p};this.nodes.push(M),this.rowByHash.set(_.hash,M);let[A,...U]=_.parents;t[p]=A??null;for(let W of U)if(t.indexOf(W)===-1){let B=t.indexOf(null);B>=0?t[B]=W:t.push(W)}for(;t.length&&t[t.length-1]===null;)t.pop();p+1>this.laneCount&&(this.laneCount=p+1)};if(this.laneCount=1,n.length<=5e3){for(let m=0;m<n.length;m++)o(m);this.draw();return}let d=0,u=m=>{if(e!==this.layoutToken)return;let _=performance.now();for(;d<n.length;){o(d++);let p=m?.timeRemaining?.()??0;if(d%250===0&&p<=1&&performance.now()-_>8)break}this.draw(),d<n.length&&e===this.layoutToken&&(this.idleHandle=this.requestIdle(u))};this.idleHandle=this.requestIdle(u)}draw(){let n=this.canvasRef?.nativeElement;if(!n)return;let e=this.scrollRef?.nativeElement,t=window.devicePixelRatio||1,r=at*2+this.laneCount*be,o=e?.scrollTop??0,d=e?.clientHeight??0,u=Math.max(r,e?.clientWidth??r),m=Math.max(d||P*8,P);this.ensureCanvasSize(n,u,m,t);let _=`translateY(${o}px)`;this.canvasTransform!==_&&(this.canvasTransform=_,n.style.transform=_);let p=n.getContext("2d"),M=this.readTheme(n);if(p.setTransform(t,0,0,t,0,-o*t),p.clearRect(0,o,u,m),p.fillStyle=M.surface,p.fillRect(0,o,u,m),!this.nodes.length)return;let A=C=>at+C*be+be/2,U=C=>xe+C*P+P/2,W=C=>st[C%st.length],B=this.state.selectedHash(),Se=P*4,f=Math.max(0,Math.floor((o-xe-Se)/P)),q=Math.min(this.nodes.length-1,Math.ceil((o+m-xe+Se)/P)),Q=this.nodes.slice(f,q+1);this.drawRows(p,u,A,U,M,B,Q),this.drawGuides(p,o,m,M),p.lineCap="round",p.lineJoin="round";for(let C of Q)for(let E of C.commit.parents){let $=this.rowByHash.get(E);if(!$)continue;let oe=A(C.lane),K=U(C.row),ce=A($.lane),ae=U($.row);p.strokeStyle=M.shadow,p.lineWidth=4,p.globalAlpha=.35,this.drawEdge(p,oe,K,ce,ae),p.strokeStyle=W($.lane),p.lineWidth=C.commit.isMerge?2.6:2.2,p.globalAlpha=B&&B!==C.commit.hash&&B!==$.commit.hash?.55:.9,this.drawEdge(p,oe,K,ce,ae),p.globalAlpha=1}for(let C of Q){let E=A(C.lane),$=U(C.row),oe=W(C.lane),K=C.commit.hash===B,ce=C.row===this.hoverRow,ae=K?He+2:ce?He+1:He;p.beginPath(),p.arc(E,$,ae+3,0,Math.PI*2),p.fillStyle=M.nodeRing,p.fill(),p.beginPath(),p.arc(E,$,ae,0,Math.PI*2),p.fillStyle=C.commit.isMerge?M.surface:oe,p.fill(),p.lineWidth=C.commit.isMerge||K?2.5:1.75,p.strokeStyle=oe,p.stroke(),(K||ce)&&(p.beginPath(),p.arc(E,$,ae+5,0,Math.PI*2),p.strokeStyle=oe,p.globalAlpha=K?.42:.24,p.lineWidth=2,p.stroke(),p.globalAlpha=1)}}drawRows(n,e,t,r,o,d,u=this.nodes){for(let m of u){let _=r(m.row)-P/2;if(m.row%2===1&&(n.fillStyle=o.rowAlt,n.fillRect(0,_,e,P)),(m.row===this.hoverRow||m.commit.hash===d)&&(n.fillStyle=m.commit.hash===d?o.rowSelected:o.rowHover,this.roundRect(n,6,_+3,e-12,P-6,8),n.fill()),m.commit.branches.length||m.commit.tags.length){let p=t(m.lane)+He+8;this.drawRefPill(n,p,r(m.row),m.commit,o)}}}drawGuides(n,e,t,r){n.save(),n.strokeStyle=r.guide,n.lineWidth=1,n.setLineDash([3,5]);let o=e,d=e+t;for(let u=0;u<this.laneCount;u++){let m=at+u*be+be/2;n.beginPath(),n.moveTo(m,o),n.lineTo(m,d),n.stroke()}n.restore()}ensureCanvasSize(n,e,t,r){let o=Math.floor(e*r),d=Math.floor(t*r);this.canvasSize.width===o&&this.canvasSize.height===d&&this.canvasSize.dpr===r||(this.canvasSize={width:o,height:d,dpr:r},n.width=o,n.height=d,n.style.width=`${e}px`,n.style.height=`${t}px`)}requestIdle(n){let e=window.requestIdleCallback;return e?e(n,{timeout:100}):window.setTimeout(()=>n(),16)}cancelIdleLayout(){this.idleHandle!==null&&(window.cancelIdleCallback?window.cancelIdleCallback(this.idleHandle):clearTimeout(this.idleHandle),this.idleHandle=null)}drawEdge(n,e,t,r,o){if(n.beginPath(),n.moveTo(e,t),e===r)n.lineTo(r,o);else{let d=t+Math.min(P*.75,Math.max(12,(o-t)*.36));n.bezierCurveTo(e,d,r,d,r,o)}n.stroke()}drawRefPill(n,e,t,r,o){let d=r.tags[0]??r.branches.find(M=>!Xn(M));if(!d)return;let u=Math.max(0,n.canvas.clientWidth-e-8);if(u<28)return;let m=Jn(d,u>72?12:8);n.font="600 10px ui-sans-serif, system-ui, sans-serif";let _=Math.min(u,72,n.measureText(m).width+14),p=18;n.fillStyle=r.tags.length?o.warningSoft:o.accentSoft,this.roundRect(n,e,t-p/2,_,p,999),n.fill(),n.fillStyle=r.tags.length?o.warning:o.accent,n.fillText(m,e+7,t+3.5)}onClick(n){let e=this.nodeFromEvent(n);e&&this.state.selectHash(e.commit.hash)}onMouseMove(n){let e=this.nodeFromEvent(n),t=e?.row??-1;t!==this.hoverRow&&(this.hoverRow=t,this.canvasRef.nativeElement.style.cursor=e?"pointer":"default",this.draw())}onMouseLeave(){this.hoverRow!==-1&&(this.hoverRow=-1,this.canvasRef.nativeElement.style.cursor="default",this.draw())}nodeFromEvent(n){let e=this.scrollRef?.nativeElement,t=e?.getBoundingClientRect();if(!t)return;let r=n.clientY-t.top+(e?.scrollTop??0),o=Math.floor((r-xe)/P);return this.nodes[o]}readTheme(n){let e=getComputedStyle(n);return{accent:this.css(e,"--accent","#4f46e5"),accentSoft:this.css(e,"--accent-soft","#eef2ff"),guide:this.css(e,"--graph-guide","rgba(148, 163, 184, 0.28)"),nodeRing:this.css(e,"--graph-node-ring","#ffffff"),rowAlt:this.css(e,"--graph-row-alt","rgba(15, 23, 42, 0.025)"),rowHover:this.css(e,"--graph-row-hover","rgba(79, 70, 229, 0.08)"),rowSelected:this.css(e,"--graph-row-selected","rgba(79, 70, 229, 0.14)"),shadow:this.css(e,"--graph-shadow","rgba(15, 23, 42, 0.12)"),surface:this.css(e,"--bg-panel","#ffffff"),warning:this.css(e,"--warning","#d97706"),warningSoft:"rgba(217, 119, 6, 0.15)"}}css(n,e,t){return n.getPropertyValue(e).trim()||t}roundRect(n,e,t,r,o,d){let u=Math.min(d,r/2,o/2);n.beginPath(),n.moveTo(e+u,t),n.arcTo(e+r,t,e+r,t+o,u),n.arcTo(e+r,t+o,e,t+o,u),n.arcTo(e,t+o,e,t,u),n.arcTo(e,t,e+r,t,u),n.closePath()}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=D({type:i,selectors:[["app-commit-graph"]],viewQuery:function(e,t){if(e&1&&(J(Yn,7),J(Zn,7)),e&2){let r;ee(r=te())&&(t.canvasRef=r.first),ee(r=te())&&(t.scrollRef=r.first)}},hostBindings:function(e,t){e&1&&S("resize",function(){return t.onResize()},Ie)},decls:14,vars:5,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","empty",4,"ngIf"],[1,"swatch"],[1,"empty"]],template:function(e,t){e&1&&(l(0,"div",2)(1,"div",3)(2,"span"),c(3,"Graph"),a(),l(4,"span",4),c(5),a()(),l(6,"div",5),b(7,Qn,1,2,"span",6),a()(),l(8,"div",7,0),y(10,"div",8)(11,"canvas",9,1),b(13,Kn,2,0,"div",10),a()),e&2&&(s(5),v(t.graphSummary()),s(2),h("ngForOf",t.legendColors),s(3),ne("height",t.contentHeight(),"px"),s(3),h("ngIf",!t.state.commits().length&&!t.state.loading()))},dependencies:[R,Z,I],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:auto;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:1px;pointer-events:none}canvas[_ngcontent-%COMP%]{display:block;position:absolute;top:0;left:0;pointer-events:auto;will-change:transform}.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 Xn(i){return i.startsWith("origin/")||i.includes("/origin/")}function Jn(i,n){return i.length>n?`${i.slice(0,Math.max(1,n-1))}...`:i}function we(i,n=0){return ei(i)?Number(i):arguments.length===2?n:0}function ei(i){return!isNaN(parseFloat(i))&&!isNaN(Number(i))}function gn(i){return i instanceof me?i.nativeElement:i}var lt;try{lt=typeof Intl<"u"&&Intl.v8BreakIterator}catch{lt=!1}var We=(()=>{class i{_platformId=g(Et);isBrowser=this._platformId?Ut(this._platformId):typeof document=="object"&&!!document;EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent);TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent);BLINK=this.isBrowser&&!!(window.chrome||lt)&&typeof CSS<"u"&&!this.EDGE&&!this.TRIDENT;WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT;IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window);FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent);ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT;SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT;constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275prov=N({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var ti=new X("cdk-dir-doc",{providedIn:"root",factory:ni});function ni(){return g(De)}var ii=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;function ri(i){let n=i?.toLowerCase()||"";return n==="auto"&&typeof navigator<"u"&&navigator?.language?ii.test(navigator.language)?"rtl":"ltr":n==="rtl"?"rtl":"ltr"}var hn=(()=>{class i{get value(){return this.valueSignal()}valueSignal=w("ltr");change=new Rt;constructor(){let e=g(ti,{optional:!0});if(e){let t=e.body?e.body.dir:null,r=e.documentElement?e.documentElement.dir:null;this.valueSignal.set(ri(t||r||"ltr"))}}ngOnDestroy(){this.change.complete()}static \u0275fac=function(t){return new(t||i)};static \u0275prov=N({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var L=(function(i){return i[i.NORMAL=0]="NORMAL",i[i.NEGATED=1]="NEGATED",i[i.INVERTED=2]="INVERTED",i})(L||{}),$e,re;function un(){if(re==null){if(typeof document!="object"||!document||typeof Element!="function"||!Element)return re=!1,re;if(document.documentElement?.style&&"scrollBehavior"in document.documentElement.style)re=!0;else{let i=Element.prototype.scrollTo;i?re=!/\{\s*\[native code\]\s*\}/.test(i.toString()):re=!1}}return re}function le(){if(typeof document!="object"||!document)return L.NORMAL;if($e==null){let i=document.createElement("div"),n=i.style;i.dir="rtl",n.width="1px",n.overflow="auto",n.visibility="hidden",n.pointerEvents="none",n.position="absolute";let e=document.createElement("div"),t=e.style;t.width="2px",t.height="1px",i.appendChild(e),document.body.appendChild(i),$e=L.NORMAL,i.scrollLeft===0&&(i.scrollLeft=1,$e=i.scrollLeft===0?L.NEGATED:L.INVERTED),i.remove()}return $e}var ct=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=pe({type:i});static \u0275inj=de({})}return i})();var Ue=class{};function _n(i){return i&&typeof i.connect=="function"&&!(i instanceof gt)}var qe=class extends Ue{_data;constructor(n){super(),this._data=n}connect(){return Me(this._data)?this._data:Y(this._data)}disconnect(){}},ye=(function(i){return i[i.REPLACED=0]="REPLACED",i[i.INSERTED=1]="INSERTED",i[i.MOVED=2]="MOVED",i[i.REMOVED=3]="REMOVED",i})(ye||{}),dt=new X("_ViewRepeater"),Ye=class{viewCacheSize=20;_viewCache=[];applyChanges(n,e,t,r,o){n.forEachOperation((d,u,m)=>{let _,p;if(d.previousIndex==null){let M=()=>t(d,u,m);_=this._insertView(M,m,e,r(d)),p=_?ye.INSERTED:ye.REPLACED}else m==null?(this._detachAndCacheView(u,e),p=ye.REMOVED):(_=this._moveView(u,m,e,r(d)),p=ye.MOVED);o&&o({context:_?.context,operation:p,record:d})})}detach(){for(let n of this._viewCache)n.destroy();this._viewCache=[]}_insertView(n,e,t,r){let o=this._insertViewFromCache(e,t);if(o){o.context.$implicit=r;return}let d=n();return t.createEmbeddedView(d.templateRef,d.context,d.index)}_detachAndCacheView(n,e){let t=e.detach(n);this._maybeCacheView(t,e)}_moveView(n,e,t,r){let o=t.get(n);return t.move(o,e),o.context.$implicit=r,o}_maybeCacheView(n,e){if(this._viewCache.length<this.viewCacheSize)this._viewCache.push(n);else{let t=e.indexOf(n);t===-1?n.destroy():e.remove(t)}}_insertViewFromCache(n,e){let t=this._viewCache.pop();return t&&e.insert(t,n),t||null}};var oi=["contentWrapper"],ai=["*"],xn=new X("VIRTUAL_SCROLL_STRATEGY"),mt=class{_scrolledIndexChange=new T;scrolledIndexChange=this._scrolledIndexChange.pipe(Ct());_viewport=null;_itemSize;_minBufferPx;_maxBufferPx;constructor(n,e,t){this._itemSize=n,this._minBufferPx=e,this._maxBufferPx=t}attach(n){this._viewport=n,this._updateTotalContentSize(),this._updateRenderedRange()}detach(){this._scrolledIndexChange.complete(),this._viewport=null}updateItemAndBufferSize(n,e,t){t<e,this._itemSize=n,this._minBufferPx=e,this._maxBufferPx=t,this._updateTotalContentSize(),this._updateRenderedRange()}onContentScrolled(){this._updateRenderedRange()}onDataLengthChanged(){this._updateTotalContentSize(),this._updateRenderedRange()}onContentRendered(){}onRenderedOffsetChanged(){}scrollToIndex(n,e){this._viewport&&this._viewport.scrollToOffset(n*this._itemSize,e)}_updateTotalContentSize(){this._viewport&&this._viewport.setTotalContentSize(this._viewport.getDataLength()*this._itemSize)}_updateRenderedRange(){if(!this._viewport)return;let n=this._viewport.getRenderedRange(),e={start:n.start,end:n.end},t=this._viewport.getViewportSize(),r=this._viewport.getDataLength(),o=this._viewport.measureScrollOffset(),d=this._itemSize>0?o/this._itemSize:0;if(e.end>r){let m=Math.ceil(t/this._itemSize),_=Math.max(0,Math.min(d,r-m));d!=_&&(d=_,o=_*this._itemSize,e.start=Math.floor(d)),e.end=Math.max(0,Math.min(r,e.start+m))}let u=o-e.start*this._itemSize;if(u<this._minBufferPx&&e.start!=0){let m=Math.ceil((this._maxBufferPx-u)/this._itemSize);e.start=Math.max(0,e.start-m),e.end=Math.min(r,Math.ceil(d+(t+this._minBufferPx)/this._itemSize))}else{let m=e.end*this._itemSize-(o+t);if(m<this._minBufferPx&&e.end!=r){let _=Math.ceil((this._maxBufferPx-m)/this._itemSize);_>0&&(e.end=Math.min(r,e.end+_),e.start=Math.max(0,Math.floor(d-this._minBufferPx/this._itemSize)))}}this._viewport.setRenderedRange(e),this._viewport.setRenderedContentOffset(Math.round(this._itemSize*e.start)),this._scrolledIndexChange.next(Math.floor(d))}};function si(i){return i._scrollStrategy}var wn=(()=>{class i{get itemSize(){return this._itemSize}set itemSize(e){this._itemSize=we(e)}_itemSize=20;get minBufferPx(){return this._minBufferPx}set minBufferPx(e){this._minBufferPx=we(e)}_minBufferPx=100;get maxBufferPx(){return this._maxBufferPx}set maxBufferPx(e){this._maxBufferPx=we(e)}_maxBufferPx=200;_scrollStrategy=new mt(this.itemSize,this.minBufferPx,this.maxBufferPx);ngOnChanges(){this._scrollStrategy.updateItemAndBufferSize(this.itemSize,this.minBufferPx,this.maxBufferPx)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=se({type:i,selectors:[["cdk-virtual-scroll-viewport","itemSize",""]],inputs:{itemSize:"itemSize",minBufferPx:"minBufferPx",maxBufferPx:"maxBufferPx"},features:[he([{provide:xn,useFactory:si,deps:[wt(()=>i)]}]),Pe]})}return i})(),li=20,ci=(()=>{class i{_ngZone=g(fe);_platform=g(We);_renderer=g(et).createRenderer(null,null);_cleanupGlobalListener;constructor(){}_scrolled=new T;_scrolledCount=0;scrollContainers=new Map;register(e){this.scrollContainers.has(e)||this.scrollContainers.set(e,e.elementScrolled().subscribe(()=>this._scrolled.next(e)))}deregister(e){let t=this.scrollContainers.get(e);t&&(t.unsubscribe(),this.scrollContainers.delete(e))}scrolled(e=li){return this._platform.isBrowser?new Xe(t=>{this._cleanupGlobalListener||(this._cleanupGlobalListener=this._ngZone.runOutsideAngular(()=>this._renderer.listen("document","scroll",()=>this._scrolled.next())));let r=e>0?this._scrolled.pipe(ke(e)).subscribe(t):this._scrolled.subscribe(t);return this._scrolledCount++,()=>{r.unsubscribe(),this._scrolledCount--,this._scrolledCount||(this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0)}}):Y()}ngOnDestroy(){this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0,this.scrollContainers.forEach((e,t)=>this.deregister(t)),this._scrolled.complete()}ancestorScrolled(e,t){let r=this.getAncestorScrollContainers(e);return this.scrolled(t).pipe(_t(o=>!o||r.indexOf(o)>-1))}getAncestorScrollContainers(e){let t=[];return this.scrollContainers.forEach((r,o)=>{this._scrollableContainsElement(o,e)&&t.push(o)}),t}_scrollableContainsElement(e,t){let r=gn(t),o=e.getElementRef().nativeElement;do if(r==o)return!0;while(r=r.parentElement);return!1}static \u0275fac=function(t){return new(t||i)};static \u0275prov=N({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),yn=(()=>{class i{elementRef=g(me);scrollDispatcher=g(ci);ngZone=g(fe);dir=g(hn,{optional:!0});_scrollElement=this.elementRef.nativeElement;_destroyed=new T;_renderer=g(Pt);_cleanupScroll;_elementScrolled=new T;constructor(){}ngOnInit(){this._cleanupScroll=this.ngZone.runOutsideAngular(()=>this._renderer.listen(this._scrollElement,"scroll",e=>this._elementScrolled.next(e))),this.scrollDispatcher.register(this)}ngOnDestroy(){this._cleanupScroll?.(),this._elementScrolled.complete(),this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}elementScrolled(){return this._elementScrolled}getElementRef(){return this.elementRef}scrollTo(e){let t=this.elementRef.nativeElement,r=this.dir&&this.dir.value=="rtl";e.left==null&&(e.left=r?e.end:e.start),e.right==null&&(e.right=r?e.start:e.end),e.bottom!=null&&(e.top=t.scrollHeight-t.clientHeight-e.bottom),r&&le()!=L.NORMAL?(e.left!=null&&(e.right=t.scrollWidth-t.clientWidth-e.left),le()==L.INVERTED?e.left=e.right:le()==L.NEGATED&&(e.left=e.right?-e.right:e.right)):e.right!=null&&(e.left=t.scrollWidth-t.clientWidth-e.right),this._applyScrollToOptions(e)}_applyScrollToOptions(e){let t=this.elementRef.nativeElement;un()?t.scrollTo(e):(e.top!=null&&(t.scrollTop=e.top),e.left!=null&&(t.scrollLeft=e.left))}measureScrollOffset(e){let t="left",r="right",o=this.elementRef.nativeElement;if(e=="top")return o.scrollTop;if(e=="bottom")return o.scrollHeight-o.clientHeight-o.scrollTop;let d=this.dir&&this.dir.value=="rtl";return e=="start"?e=d?r:t:e=="end"&&(e=d?t:r),d&&le()==L.INVERTED?e==t?o.scrollWidth-o.clientWidth-o.scrollLeft:o.scrollLeft:d&&le()==L.NEGATED?e==t?o.scrollLeft+o.scrollWidth-o.clientWidth:-o.scrollLeft:e==t?o.scrollLeft:o.scrollWidth-o.clientWidth-o.scrollLeft}static \u0275fac=function(t){return new(t||i)};static \u0275dir=se({type:i,selectors:[["","cdk-scrollable",""],["","cdkScrollable",""]]})}return i})(),di=20,mi=(()=>{class i{_platform=g(We);_listeners;_viewportSize;_change=new T;_document=g(De);constructor(){let e=g(fe),t=g(et).createRenderer(null,null);e.runOutsideAngular(()=>{if(this._platform.isBrowser){let r=o=>this._change.next(o);this._listeners=[t.listen("window","resize",r),t.listen("window","orientationchange",r)]}this.change().subscribe(()=>this._viewportSize=null)})}ngOnDestroy(){this._listeners?.forEach(e=>e()),this._change.complete()}getViewportSize(){this._viewportSize||this._updateViewportSize();let e={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),e}getViewportRect(){let e=this.getViewportScrollPosition(),{width:t,height:r}=this.getViewportSize();return{top:e.top,left:e.left,bottom:e.top+r,right:e.left+t,height:r,width:t}}getViewportScrollPosition(){if(!this._platform.isBrowser)return{top:0,left:0};let e=this._document,t=this._getWindow(),r=e.documentElement,o=r.getBoundingClientRect(),d=-o.top||e.body.scrollTop||t.scrollY||r.scrollTop||0,u=-o.left||e.body.scrollLeft||t.scrollX||r.scrollLeft||0;return{top:d,left:u}}change(e=di){return e>0?this._change.pipe(ke(e)):this._change}_getWindow(){return this._document.defaultView||window}_updateViewportSize(){let e=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:e.innerWidth,height:e.innerHeight}:{width:0,height:0}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=N({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),vn=new X("VIRTUAL_SCROLLABLE"),pi=(()=>{class i extends yn{constructor(){super()}measureViewportSize(e){let t=this.elementRef.nativeElement;return e==="horizontal"?t.clientWidth:t.clientHeight}static \u0275fac=function(t){return new(t||i)};static \u0275dir=se({type:i,features:[tt]})}return i})();function fi(i,n){return i.start==n.start&&i.end==n.end}var gi=typeof requestAnimationFrame<"u"?ut:ht,pt=(()=>{class i extends pi{elementRef=g(me);_changeDetectorRef=g(Gt);_scrollStrategy=g(xn,{optional:!0});scrollable=g(vn,{optional:!0});_platform=g(We);_detachedSubject=new T;_renderedRangeSubject=new T;get orientation(){return this._orientation}set orientation(e){this._orientation!==e&&(this._orientation=e,this._calculateSpacerSize())}_orientation="vertical";appendOnly=!1;scrolledIndexChange=new Xe(e=>this._scrollStrategy.scrolledIndexChange.subscribe(t=>Promise.resolve().then(()=>this.ngZone.run(()=>e.next(t)))));_contentWrapper;renderedRangeStream=this._renderedRangeSubject;_totalContentSize=0;_totalContentWidth=w("");_totalContentHeight=w("");_renderedContentTransform;_renderedRange={start:0,end:0};_dataLength=0;_viewportSize=0;_forOf;_renderedContentOffset=0;_renderedContentOffsetNeedsRewrite=!1;_changeDetectionNeeded=w(!1);_runAfterChangeDetection=[];_viewportChanges=ft.EMPTY;_injector=g(St);_isDestroyed=!1;constructor(){super();let e=g(mi);this._scrollStrategy,this._viewportChanges=e.change().subscribe(()=>{this.checkViewportSize()}),this.scrollable||(this.elementRef.nativeElement.classList.add("cdk-virtual-scrollable"),this.scrollable=this);let t=H(()=>{this._changeDetectionNeeded()&&this._doChangeDetection()},{injector:g(Nt).injector});g(Mt).onDestroy(()=>void t.destroy())}ngOnInit(){this._platform.isBrowser&&(this.scrollable===this&&super.ngOnInit(),this.ngZone.runOutsideAngular(()=>Promise.resolve().then(()=>{this._measureViewportSize(),this._scrollStrategy.attach(this),this.scrollable.elementScrolled().pipe(Je(null),ke(0,gi),Ee(this._destroyed)).subscribe(()=>this._scrollStrategy.onContentScrolled()),this._markChangeDetectionNeeded()})))}ngOnDestroy(){this.detach(),this._scrollStrategy.detach(),this._renderedRangeSubject.complete(),this._detachedSubject.complete(),this._viewportChanges.unsubscribe(),this._isDestroyed=!0,super.ngOnDestroy()}attach(e){this._forOf,this.ngZone.runOutsideAngular(()=>{this._forOf=e,this._forOf.dataStream.pipe(Ee(this._detachedSubject)).subscribe(t=>{let r=t.length;r!==this._dataLength&&(this._dataLength=r,this._scrollStrategy.onDataLengthChanged()),this._doChangeDetection()})})}detach(){this._forOf=null,this._detachedSubject.next()}getDataLength(){return this._dataLength}getViewportSize(){return this._viewportSize}getRenderedRange(){return this._renderedRange}measureBoundingClientRectWithScrollOffset(e){return this.getElementRef().nativeElement.getBoundingClientRect()[e]}setTotalContentSize(e){this._totalContentSize!==e&&(this._totalContentSize=e,this._calculateSpacerSize(),this._markChangeDetectionNeeded())}setRenderedRange(e){fi(this._renderedRange,e)||(this.appendOnly&&(e={start:0,end:Math.max(this._renderedRange.end,e.end)}),this._renderedRangeSubject.next(this._renderedRange=e),this._markChangeDetectionNeeded(()=>this._scrollStrategy.onContentRendered()))}getOffsetToRenderedContentStart(){return this._renderedContentOffsetNeedsRewrite?null:this._renderedContentOffset}setRenderedContentOffset(e,t="to-start"){e=this.appendOnly&&t==="to-start"?0:e;let r=this.dir&&this.dir.value=="rtl",o=this.orientation=="horizontal",d=o?"X":"Y",m=`translate${d}(${Number((o&&r?-1:1)*e)}px)`;this._renderedContentOffset=e,t==="to-end"&&(m+=` translate${d}(-100%)`,this._renderedContentOffsetNeedsRewrite=!0),this._renderedContentTransform!=m&&(this._renderedContentTransform=m,this._markChangeDetectionNeeded(()=>{this._renderedContentOffsetNeedsRewrite?(this._renderedContentOffset-=this.measureRenderedContentSize(),this._renderedContentOffsetNeedsRewrite=!1,this.setRenderedContentOffset(this._renderedContentOffset)):this._scrollStrategy.onRenderedOffsetChanged()}))}scrollToOffset(e,t="auto"){let r={behavior:t};this.orientation==="horizontal"?r.start=e:r.top=e,this.scrollable.scrollTo(r)}scrollToIndex(e,t="auto"){this._scrollStrategy.scrollToIndex(e,t)}measureScrollOffset(e){let t;return this.scrollable==this?t=r=>super.measureScrollOffset(r):t=r=>this.scrollable.measureScrollOffset(r),Math.max(0,t(e??(this.orientation==="horizontal"?"start":"top"))-this.measureViewportOffset())}measureViewportOffset(e){let t,r="left",o="right",d=this.dir?.value=="rtl";e=="start"?t=d?o:r:e=="end"?t=d?r:o:e?t=e:t=this.orientation==="horizontal"?"left":"top";let u=this.scrollable.measureBoundingClientRectWithScrollOffset(t);return this.elementRef.nativeElement.getBoundingClientRect()[t]-u}measureRenderedContentSize(){let e=this._contentWrapper.nativeElement;return this.orientation==="horizontal"?e.offsetWidth:e.offsetHeight}measureRangeSize(e){return this._forOf?this._forOf.measureRangeSize(e,this.orientation):0}checkViewportSize(){this._measureViewportSize(),this._scrollStrategy.onDataLengthChanged()}_measureViewportSize(){this._viewportSize=this.scrollable.measureViewportSize(this.orientation)}_markChangeDetectionNeeded(e){e&&this._runAfterChangeDetection.push(e),!Ht(this._changeDetectionNeeded)&&this.ngZone.runOutsideAngular(()=>{Promise.resolve().then(()=>{this.ngZone.run(()=>{this._changeDetectionNeeded.set(!0)})})})}_doChangeDetection(){this._isDestroyed||this.ngZone.run(()=>{this._changeDetectorRef.markForCheck(),this._contentWrapper.nativeElement.style.transform=this._renderedContentTransform,Tt(()=>{this._changeDetectionNeeded.set(!1);let e=this._runAfterChangeDetection;this._runAfterChangeDetection=[];for(let t of e)t()},{injector:this._injector})})}_calculateSpacerSize(){this._totalContentHeight.set(this.orientation==="horizontal"?"":`${this._totalContentSize}px`),this._totalContentWidth.set(this.orientation==="horizontal"?`${this._totalContentSize}px`:"")}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=D({type:i,selectors:[["cdk-virtual-scroll-viewport"]],viewQuery:function(t,r){if(t&1&&J(oi,7),t&2){let o;ee(o=te())&&(r._contentWrapper=o.first)}},hostAttrs:[1,"cdk-virtual-scroll-viewport"],hostVars:4,hostBindings:function(t,r){t&2&&F("cdk-virtual-scroll-orientation-horizontal",r.orientation==="horizontal")("cdk-virtual-scroll-orientation-vertical",r.orientation!=="horizontal")},inputs:{orientation:"orientation",appendOnly:[2,"appendOnly","appendOnly",$t]},outputs:{scrolledIndexChange:"scrolledIndexChange"},features:[he([{provide:yn,useFactory:(e,t)=>e||t,deps:[[new Ot,new kt(vn)],i]}]),tt],ngContentSelectors:ai,decls:4,vars:4,consts:[["contentWrapper",""],[1,"cdk-virtual-scroll-content-wrapper"],[1,"cdk-virtual-scroll-spacer"]],template:function(t,r){t&1&&(Lt(),Vt(0,"div",1,0),At(2),Ft(),zt(3,"div",2)),t&2&&(s(3),ne("width",r._totalContentWidth())("height",r._totalContentHeight()))},styles:[`cdk-virtual-scroll-viewport{display:block;position:relative;transform:translateZ(0)}.cdk-virtual-scrollable{overflow:auto;will-change:scroll-position;contain:strict}.cdk-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .cdk-virtual-scroll-content-wrapper{right:0;left:auto}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper{min-height:100%}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{min-width:100%}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.cdk-virtual-scroll-spacer{height:1px;transform-origin:0 0;flex:0 0 auto}[dir=rtl] .cdk-virtual-scroll-spacer{transform-origin:100% 0}
1
+ import{a as Jt,b as en,c as pn}from"./chunk-CFCRPNUQ.js";import{a as rn}from"./chunk-UNROVCUZ.js";import{a as Zt,b as Qt,c as Kt,h as Xt}from"./chunk-UHWTLUOW.js";import{a as tn}from"./chunk-4JCUQ6Y5.js";import{a as G}from"./chunk-I4VBIHH2.js";import{g as on,i as an,k as sn,l as ln,m as cn,n as dn,o as mn}from"./chunk-EZUFC4CQ.js";import{d as Yt}from"./chunk-6VRZZB3T.js";import{a as nn}from"./chunk-UIWFTWLF.js";import{$ as g,$a as Nt,Ab as v,B as _t,Bb as j,C as ke,Cb as Ve,D as vt,Db as jt,Ea as Ie,Eb as nt,Fb as it,Ga as s,Gb as rt,I as Ct,Ia as Dt,Ib as he,Ja as et,Ka as Pt,Kb as ue,Lb as _e,Ma as It,N as bt,Nb as Fe,P as xt,Pa as D,Q as Je,Qa as pe,Qb as Ht,R as Oe,Ra as se,Rb as ie,S as Ee,Sa as tt,Sb as H,Ta as b,V as wt,Va as Rt,Vb as Gt,W as N,Wa as fe,Wb as Wt,X as de,Xa as Tt,Yb as $t,Z as X,ab as ge,cc as Z,db as h,dc as I,e as ft,ea as k,eb as l,ec as ze,fa as O,fb as a,g as Xe,ga as yt,gb as y,gc as R,hb as Vt,i as gt,ib as Ft,j as T,ja as St,jb as zt,ka as De,kb as Re,kc as Ut,la as Mt,lb as Te,lc as qt,m as ht,mb as V,mc as Le,n as ut,nb as S,oa as w,ob as x,pb as Lt,q as Y,qa as kt,qb as At,ra as Ot,s as Me,sa as Pe,sb as J,tb as ee,ub as te,va as me,vb as Ne,wb as ne,xb as F,yb as Bt,za as Et,zb as c}from"./chunk-OBPR2XVH.js";var Ae=class i{http=g(Le);base="/api";list(n){return this.http.get(`${this.base}/annotations/${n}`)}add(n,e,t){return this.http.post(`${this.base}/annotations/${n}`,{author:e,body:t})}remove(n,e){return this.http.delete(`${this.base}/annotations/${n}/${e}`)}static \u0275fac=function(e){return new(e||i)};static \u0275prov=N({token:i,factory:i.\u0275fac,providedIn:"root"})};var On=["svg"];function En(i,n){i&1&&(l(0,"div",8),c(1,"No graph data \u2014 changed files have no detectable internal imports."),a())}var Be=class i{impact=null;svgRef;simulation=null;hasData=!1;ngAfterViewInit(){this.render()}ngOnChanges(){this.render()}ngOnDestroy(){this.simulation?.stop()}render(){if(!this.svgRef)return;let n=this.svgRef.nativeElement,e=on(n);e.selectAll("*").remove();let t=this.impact;if(!t||t.dependencyRipple.length===0&&t.modules.length===0){this.hasData=!1;return}this.hasData=!0;let r=n.clientWidth||600,o=280,d=getComputedStyle(n),u=fn(d,"--fg-secondary","#cbd5e1"),m=fn(d,"--bg-surface-2","#0b1020"),_=new Map,p=(f,q,Q)=>{let C=_.get(f);return C||(C={id:f,group:q,label:Q},_.set(f,C)),C};for(let f of t.files)p(`f:${f}`,"changed",ot(f));for(let f of t.modules)p(`m:${f}`,"module",f);for(let f of t.dependencyRipple)p(`f:${f.from}`,"changed",ot(f.from)),p(`f:${f.to}`,"imported",ot(f.to));let M=[];for(let f of t.dependencyRipple)M.push({source:`f:${f.from}`,target:`f:${f.to}`,type:"imports"});for(let f of t.files){let q=Dn(f);t.modules.includes(q)&&M.push({source:`f:${f}`,target:`m:${q}`,type:"in-module"})}let A=Array.from(_.values()),U=e.append("g").attr("stroke","var(--border-strong)").attr("stroke-opacity",.5).selectAll("line").data(M).join("line").attr("stroke-dasharray",f=>f.type==="in-module"?"2,3":null),W=e.append("g").selectAll("circle").data(A).join("circle").attr("r",f=>f.group==="module"?7:5).attr("fill",f=>f.group==="changed"?"var(--accent)":f.group==="imported"?"#f59e0b":"#8b5cf6").attr("stroke","var(--bg-surface-2)").attr("stroke-width",1.5).call(Se());W.append("title").text(f=>f.id.slice(2));let B=e.append("g").selectAll("text").data(A).join("text").attr("class","node-label").attr("dx",8).attr("dy",3).attr("fill",u).attr("stroke",m).attr("stroke-width",2).attr("paint-order","stroke").text(f=>f.label);this.simulation?.stop(),this.simulation=dn(A).force("link",cn(M).id(f=>f.id).distance(60).strength(.4)).force("charge",mn().strength(-160)).force("center",sn(r/2,o/2)).force("collide",ln(14)).on("tick",()=>{U.attr("x1",f=>f.source.x??0).attr("y1",f=>f.source.y??0).attr("x2",f=>f.target.x??0).attr("y2",f=>f.target.y??0),W.attr("cx",f=>f.x??0).attr("cy",f=>f.y??0),B.attr("x",f=>f.x??0).attr("y",f=>f.y??0)});function Se(){function f(C,E){C.active||window.__impactSim?.alphaTarget?.(.3).restart(),E.fx=E.x,E.fy=E.y}function q(C,E){E.fx=C.x,E.fy=C.y}function Q(C,E){C.active||window.__impactSim?.alphaTarget?.(0),E.fx=null,E.fy=null}return an().on("start",f).on("drag",q).on("end",Q)}window.__impactSim=this.simulation}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=D({type:i,selectors:[["app-impact-graph"]],viewQuery:function(e,t){if(e&1&&J(On,7),e&2){let r;ee(r=te())&&(t.svgRef=r.first)}},inputs:{impact:"impact"},features:[Pe],decls:11,vars:1,consts:[["svg",""],[1,"legend"],[1,"dot","dot-changed"],[1,"dot","dot-imported"],[1,"dot","dot-module"],[1,"canvas-wrap"],["width","100%","height","280","aria-label","Commit impact graph"],["class","empty",4,"ngIf"],[1,"empty"]],template:function(e,t){e&1&&(l(0,"div",1),y(1,"span",2),c(2," changed "),y(3,"span",3),c(4," imports "),y(5,"span",4),c(6," module "),a(),l(7,"div",5),yt(),y(8,"svg",6,0),b(10,En,2,0,"div",7),a()),e&2&&(s(10),h("ngIf",!t.hasData))},dependencies:[R,I],styles:["[_nghost-%COMP%]{display:block}.legend[_ngcontent-%COMP%]{display:flex;gap:.75rem;align-items:center;font-size:11px;color:var(--fg-muted);margin-bottom:.4rem}.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;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:hidden}.empty[_ngcontent-%COMP%]{position:absolute;inset:0;display:grid;place-items:center;color:var(--fg-muted);font-size:11px;pointer-events:none}[_nghost-%COMP%] .node-label{font-size:9px;fill:var(--fg-secondary);font-family:var(--font-mono, monospace);pointer-events:none;paint-order:stroke;stroke:var(--bg-app);stroke-width:2px;stroke-linejoin:round}"],changeDetection:0})};function ot(i){let n=i.split("/");return n[n.length-1]}function Dn(i){let n=i.split("/");return n.length===1?"(root)":n.slice(0,Math.min(n.length-1,3)).join("/")}function fn(i,n,e){return i.getPropertyValue(n).trim()||e}function Pn(i,n){if(i&1&&(l(0,"span",36),c(1),a()),i&2){let e=n.$implicit;s(),v(e)}}function In(i,n){if(i&1&&(l(0,"span",37),c(1),a()),i&2){let e=n.$implicit;s(),v(e)}}function Rn(i,n){i&1&&(l(0,"span",38),c(1,"merge"),a())}function Tn(i,n){if(i&1&&(l(0,"pre",39),c(1),a()),i&2){let e=x().ngIf;s(),v(e.body)}}function Nn(i,n){if(i&1){let e=V();l(0,"div",40)(1,"span",41),c(2,"AI"),a(),l(3,"span",42),c(4),a(),l(5,"button",43),S("click",function(){k(e);let r=x(2);return O(r.explanation.set(null))}),c(6,"\xD7"),a()()}if(i&2){let e=n.ngIf;s(4),v(e)}}function Vn(i,n){if(i&1&&(l(0,"div",44),c(1),a()),i&2){let e=n.ngIf;s(),v(e)}}function Fn(i,n){if(i&1&&(l(0,"li"),c(1),a()),i&2){let e=n.$implicit;s(),v(e)}}function zn(i,n){if(i&1){let e=V();l(0,"li",28),S("click",function(){let r=k(e).$implicit,o=x(3);return O(o.state.selectHash(r.hash))}),l(1,"code"),c(2),a(),l(3,"span"),c(4),a()()}if(i&2){let e=n.$implicit;s(2),v(e.hash.slice(0,7)),s(2),v(e.subject)}}function Ln(i,n){if(i&1&&(l(0,"div",45)(1,"div",46)(2,"span"),c(3,"Impact"),a(),l(4,"span",47),c(5),a()(),y(6,"app-impact-graph",48),l(7,"div",49)(8,"div")(9,"h4"),c(10,"Modules"),a(),l(11,"ul",50),b(12,Fn,2,1,"li",51),a()(),l(13,"div")(14,"h4"),c(15,"Related commits"),a(),l(16,"ul",52),b(17,zn,5,2,"li",53),a()()()()),i&2){let e=n.ngIf;s(5),jt(" ",e.files.length," files \xB7 ",e.modules.length," modules \xB7 ",e.relatedCommits.length," related commits "),s(),h("impact",e),s(6),h("ngForOf",e.modules),s(5),h("ngForOf",e.relatedCommits)}}function An(i,n){if(i&1&&(l(0,"span",54),c(1),a()),i&2){let e=x(2);s(),v(e.files().length)}}function Bn(i,n){if(i&1&&(l(0,"span",63),c(1),a()),i&2){let e=x().$implicit;s(),j("+",e.additions)}}function jn(i,n){if(i&1&&(l(0,"span",64),c(1),a()),i&2){let e=x().$implicit;s(),j("\u2212",e.deletions)}}function Hn(i,n){if(i&1){let e=V();l(0,"div",55)(1,"button",56),S("click",function(){let r=k(e).$implicit,o=x(2);return O(o.selectFile(r))}),y(2,"span",57),l(3,"span",58),c(4),a(),l(5,"span",59),b(6,Bn,2,1,"span",60)(7,jn,2,1,"span",61),a()(),l(8,"button",62),S("click",function(){let r=k(e).$implicit,o=x(2);return O(o.openFileHistory(r.file))}),c(9," \u23F1 "),a()()}if(i&2){let e,t=n.$implicit,r=x(2);s(),F("selected",t.file===((e=r.activeFile())==null?null:e.file)),s(),ge("data-status",t.status),s(),h("title",t.file),s(),v(t.file),s(2),h("ngIf",t.additions),s(),h("ngIf",t.deletions)}}function Gn(i,n){i&1&&(l(0,"div",65),c(1," No files changed. "),a())}function Wn(i,n){i&1&&(l(0,"div",65),c(1,"Loading\u2026"),a())}function $n(i,n){if(i&1){let e=V();l(0,"div",66)(1,"div",67)(2,"strong"),c(3),a(),l(4,"span",68),c(5),ue(6,"date"),a(),l(7,"button",69),S("click",function(){let r=k(e).$implicit,o=x(2);return O(o.deleteComment(r.id))}),c(8,"\xD7"),a()(),l(9,"p",70),c(10),a()()}if(i&2){let e=n.$implicit;s(3),v(e.author),s(2),v(_e(6,3,e.createdAt,"short")),s(5),v(e.body)}}function Un(i,n){if(i&1){let e=V();Re(0),l(1,"header",2)(2,"div",3)(3,"span",4),c(4),a(),l(5,"span",5),b(6,Pn,2,1,"span",6)(7,In,2,1,"span",7)(8,Rn,2,0,"span",8),a()(),l(9,"h2",9),c(10),a(),l(11,"div",10)(12,"span"),c(13),a(),l(14,"span",11),c(15,"\u2022"),a(),l(16,"span"),c(17),ue(18,"date"),a()(),b(19,Tn,2,1,"pre",12),l(20,"div",13)(21,"button",14),S("click",function(){k(e);let r=x();return O(r.onExplain())}),c(22),a(),l(23,"button",14),S("click",function(){k(e);let r=x();return O(r.onLoadImpact())}),c(24),a(),l(25,"button",15),S("click",function(){k(e);let r=x();return O(r.copyShareLink())}),c(26),a()(),b(27,Nn,7,1,"div",16)(28,Vn,2,1,"div",17),a(),b(29,Ln,18,6,"div",18),l(30,"div",19)(31,"aside",20)(32,"div",21)(33,"span"),c(34,"Files"),a(),b(35,An,2,1,"span",22),a(),l(36,"div",23),b(37,Hn,10,7,"div",24)(38,Gn,2,0,"div",25)(39,Wn,2,0,"div",25),a()(),l(40,"section",26)(41,"details",27)(42,"summary",28),S("click",function(r){k(e);let o=x();return O(o.toggleAnnotations(r))}),c(43),a(),l(44,"div",29),b(45,$n,11,6,"div",30),l(46,"div",31)(47,"input",32),rt("ngModelChange",function(r){k(e);let o=x();return it(o.commentAuthor,r)||(o.commentAuthor=r),O(r)}),a(),l(48,"textarea",33),rt("ngModelChange",function(r){k(e);let o=x();return it(o.commentDraft,r)||(o.commentDraft=r),O(r)}),a(),l(49,"button",34),S("click",function(){k(e);let r=x();return O(r.addComment())}),c(50,"Post"),a()()()(),y(51,"app-diff-viewer",35),a()(),Te()}if(i&2){let e=n.ngIf,t=x();s(4),v(e.shortHash),s(2),h("ngForOf",e.tags),s(),h("ngForOf",e.branches),s(),h("ngIf",e.isMerge),s(2),v(e.subject),s(3),Ve("",e.author," <",e.authorEmail,">"),s(4),v(_e(18,29,e.date,"medium")),s(2),h("ngIf",e.body),s(2),h("disabled",t.explaining()),s(),j(" ",t.explaining()?"...":"\u2728 Explain change"," "),s(),h("disabled",t.loadingImpact()),s(),j(" ",t.loadingImpact()?"...":t.impact()?"Refresh impact":"Show impact"," "),s(2),j(" ",t.shareCopied()?"Copied!":"\u{1F517} Share"," "),s(),h("ngIf",t.explanation()),s(),h("ngIf",t.explainError()),s(),h("ngIf",t.impact()),s(6),h("ngIf",t.files().length),s(2),h("ngForOf",t.files())("ngForTrackBy",t.trackByFile),s(),h("ngIf",!t.files().length&&!t.loading()),s(),h("ngIf",t.loading()),s(2),h("open",t.annotationsOpen()),s(2),j(" \u{1F4AC} Notes (",t.comments().length,") "),s(2),h("ngForOf",t.comments()),s(2),nt("ngModel",t.commentAuthor),s(),nt("ngModel",t.commentDraft),s(),h("disabled",!t.commentDraft.trim()),s(2),h("fileInput",t.activeFile())}}function qn(i,n){i&1&&(l(0,"div",71)(1,"p",72),c(2,"No commit selected"),a(),l(3,"p",73),c(4," Pick a commit from the list, or press "),l(5,"kbd",74),c(6,"\u2318K"),a(),c(7," to open the command palette. "),a()())}var je=class i{state=g(G);git=g(tn);insightsApi=g(nn);annotationsApi=g(Ae);router=g(Yt);commit=this.state.selected;impact=w(null);loadingImpact=w(!1);explanation=w(null);explainError=w(null);explaining=w(!1);comments=w([]);annotationsOpen=w(!1);shareCopied=w(!1);commentDraft="";commentAuthor="me";loading=w(!1);files=en(Jt(this.commit).pipe(Oe(n=>n?(this.loading.set(!0),this.git.getDiff(n.hash).pipe(vt(()=>Y([])))):(this.loading.set(!1),Y([])))),{initialValue:[]});activeFileIndex=w(0);activeFile=ie(()=>{let n=this.files();if(!n.length)return null;let e=Math.min(this.activeFileIndex(),n.length-1);return n[e]});constructor(){H(()=>{this.files(),this.activeFileIndex.set(0),this.loading.set(!1)}),H(()=>{let n=this.commit();if(this.impact.set(null),this.explanation.set(null),this.explainError.set(null),this.shareCopied.set(!1),!n){this.comments.set([]);return}this.annotationsApi.list(n.hash).subscribe({next:e=>this.comments.set(e),error:()=>this.comments.set([])})})}trackByFile(n,e){return e.file}selectFile(n){let e=this.files().findIndex(t=>t.file===n.file);e>=0&&this.activeFileIndex.set(e)}openFileHistory(n){this.router.navigate(["/file",encodeURIComponent(n)])}shortPath(n){if(n.length<=32)return n;let e=n.split("/");return e.length<=2?n:e[0]+"/.../"+e.slice(-2).join("/")}onLoadImpact(){let n=this.commit();n&&(this.loadingImpact.set(!0),this.insightsApi.impact(n.hash).subscribe({next:e=>{this.impact.set(e),this.loadingImpact.set(!1)},error:()=>this.loadingImpact.set(!1)}))}onExplain(){let n=this.commit();!n||this.explaining()||(this.explaining.set(!0),this.explainError.set(null),this.insightsApi.explainCommit(n.hash).subscribe({next:e=>{this.explanation.set(e.summary),this.explaining.set(!1)},error:e=>{this.explainError.set(e?.error?.error??"AI explanation unavailable. Set ANTHROPIC_API_KEY or OPENAI_API_KEY."),this.explaining.set(!1)}}))}copyShareLink(){let n=this.commit();if(!n)return;let e=`${window.location.origin}/?commit=${n.hash}`;navigator.clipboard?.writeText(e).then(()=>{this.shareCopied.set(!0),setTimeout(()=>this.shareCopied.set(!1),1500)}).catch(()=>{this.shareCopied.set(!1)})}toggleAnnotations(n){setTimeout(()=>this.annotationsOpen.set(!this.annotationsOpen()),0)}addComment(){let n=this.commit();!n||!this.commentDraft.trim()||this.annotationsApi.add(n.hash,this.commentAuthor||"anonymous",this.commentDraft.trim()).subscribe({next:e=>{this.comments.set([...this.comments(),e]),this.commentDraft=""}})}deleteComment(n){let e=this.commit();e&&this.annotationsApi.remove(e.hash,n).subscribe({next:()=>this.comments.set(this.comments().filter(t=>t.id!==n))})}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=D({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"],[1,"btn","btn-ghost","btn-icon","close",3,"click"],[1,"ai-card","error"],[1,"impact-card"],[1,"impact-head"],[1,"impact-meta"],[3,"impact"],[1,"impact-body"],[1,"modules"],[4,"ngFor","ngForOf"],[1,"related"],[3,"click",4,"ngFor","ngForOf"],[1,"count"],[1,"file-row"],[1,"file",3,"click"],[1,"status-dot"],[1,"path",3,"title"],[1,"counts"],["class","add",4,"ngIf"],["class","del",4,"ngIf"],["title","View file history",1,"file-history",3,"click"],[1,"add"],[1,"del"],[1,"files-empty"],[1,"comment"],[1,"comment-head"],[1,"comment-date"],["title","Delete",1,"btn","btn-ghost","btn-icon",3,"click"],[1,"comment-body"],[1,"placeholder"],[1,"title"],[1,"hint"],[1,"kbd"]],template:function(e,t){if(e&1&&b(0,Un,52,32,"ng-container",1)(1,qn,8,0,"ng-template",null,0,Fe),e&2){let r=Ne(2);h("ngIf",t.commit())("ngIfElse",r)}},dependencies:[R,Z,I,Xt,Zt,Qt,Kt,rn,Be,ze],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)}.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;line-height:1.5}.ai-card[_ngcontent-%COMP%] .close[_ngcontent-%COMP%]{font-size:14px;line-height:1;padding:0 6px}.impact-card[_ngcontent-%COMP%]{margin:.6rem 1rem;background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);padding:.75rem 1rem;box-shadow:var(--shadow-sm)}.impact-head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;font-weight:600;margin-bottom:.5rem;font-size:13px}.impact-meta[_ngcontent-%COMP%]{color:var(--fg-muted);font-weight:400;font-size:11px}.impact-body[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:.75rem;font-size:12px}.impact-body[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:0 0 .4rem;font-size:11px;color:var(--fg-muted);text-transform:uppercase;letter-spacing:.04em}.impact-body[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0}.impact-body[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{padding:2px 0;word-break:break-all}.modules[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace)}.ripple[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-secondary)}.related[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{cursor:pointer;display:flex;gap:.4rem}.related[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover{color:var(--accent)}.related[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);color:var(--fg-muted);flex-shrink:0}.impact-body[_ngcontent-%COMP%] .muted[_ngcontent-%COMP%]{color:var(--fg-muted);font-style:italic;margin:0;font-size:11px}.file-row[_ngcontent-%COMP%]{display:flex}.file-row[_ngcontent-%COMP%] .file[_ngcontent-%COMP%]{flex:1}.file-history[_ngcontent-%COMP%]{background:transparent;border:0;border-bottom:1px solid var(--border-soft);cursor:pointer;color:var(--fg-muted);padding:0 .6rem;font-size:12px}.file-history[_ngcontent-%COMP%]:hover{background:var(--bg-elevated);color:var(--accent)}.annotations[_ngcontent-%COMP%]{margin:.5rem;background:var(--bg-surface);border:1px solid var(--border-soft);border-radius:var(--radius-sm)}.annotations[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{padding:.4rem .7rem;cursor:pointer;font-size:12px;color:var(--fg-secondary);-webkit-user-select:none;user-select:none}.annotations[open][_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{border-bottom:1px solid var(--border-soft)}.annot-body[_ngcontent-%COMP%]{padding:.5rem .7rem}.comment[_ngcontent-%COMP%]{padding:.4rem 0;border-bottom:1px dashed var(--border-soft);font-size:12px}.comment[_ngcontent-%COMP%]:last-of-type{border-bottom:0}.comment-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem}.comment-date[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px;flex:1}.comment-body[_ngcontent-%COMP%]{margin:.2rem 0 0;line-height:1.4;white-space:pre-wrap}.comment-form[_ngcontent-%COMP%]{display:flex;gap:.4rem;flex-direction:column;margin-top:.5rem}.comment-form[_ngcontent-%COMP%] .input[_ngcontent-%COMP%]{width:100%;padding:.35rem .5rem;background:var(--bg-app);border:1px solid var(--border-soft);border-radius:var(--radius-sm);color:var(--fg-primary);font-family:inherit;font-size:12px}.comment-form[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{min-height:60px;resize:vertical}.comment-form[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]{align-self:flex-end}"],changeDetection:0})};var Yn=["canvas"],Zn=["scroll"];function Qn(i,n){if(i&1&&y(0,"span",11),i&2){let e=n.$implicit;ne("background",e)}}function Kn(i,n){i&1&&(l(0,"div",12),c(1," No commits to draw. "),a())}var P=34,be=24,He=5.5,at=16,xe=16,st=["#4f46e5","#06b6d4","#f59e0b","#ef4444","#10b981","#8b5cf6","#ec4899","#0ea5e9"],Ge=class i{state=g(G);theme=g(pn);legendColors=st.slice(0,5);graphSummary=ie(()=>{let n=this.state.commits().length,e=this.laneCount;return n?`${n.toLocaleString()} commits across ${e} lane${e===1?"":"s"}`:"Swim-lane visualization"});contentHeight=ie(()=>{let n=this.state.commits().length;return n?xe*2+n*P:0});canvasRef;scrollRef;nodes=[];rowByHash=new Map;laneCount=1;hoverRow=-1;layoutToken=0;idleHandle=null;canvasSize={width:0,height:0,dpr:0};canvasTransform="";onCanvasClick=n=>this.onClick(n);onCanvasMove=n=>this.onMouseMove(n);onCanvasLeave=()=>this.onMouseLeave();scrollRaf=0;onScroll=()=>{this.scrollRaf||(this.scrollRaf=requestAnimationFrame(()=>{this.scrollRaf=0,this.draw()}))};constructor(){H(()=>{this.scheduleLayout(this.state.commits())}),H(()=>{this.state.selectedHash(),this.theme.resolved(),this.draw()})}ngAfterViewInit(){let n=this.canvasRef.nativeElement;n.addEventListener("click",this.onCanvasClick),n.addEventListener("mousemove",this.onCanvasMove),n.addEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.addEventListener("scroll",this.onScroll,{passive:!0}),this.draw()}ngOnDestroy(){let n=this.canvasRef?.nativeElement;n?.removeEventListener("click",this.onCanvasClick),n?.removeEventListener("mousemove",this.onCanvasMove),n?.removeEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.removeEventListener("scroll",this.onScroll),this.scrollRaf&&cancelAnimationFrame(this.scrollRaf),this.cancelIdleLayout()}onResize(){this.draw()}scheduleLayout(n){let e=++this.layoutToken;if(this.cancelIdleLayout(),this.nodes=[],this.rowByHash.clear(),this.hoverRow=-1,!n.length){this.laneCount=1,this.draw();return}let t=[],r=m=>{let _=t.indexOf(m);if(_>=0)return _;let p=t.indexOf(null);return p>=0?(t[p]=m,p):(t.push(m),t.length-1)},o=m=>{let _=n[m],p=r(_.hash),M={commit:_,row:m,lane:p};this.nodes.push(M),this.rowByHash.set(_.hash,M);let[A,...U]=_.parents;t[p]=A??null;for(let W of U)if(t.indexOf(W)===-1){let B=t.indexOf(null);B>=0?t[B]=W:t.push(W)}for(;t.length&&t[t.length-1]===null;)t.pop();p+1>this.laneCount&&(this.laneCount=p+1)};if(this.laneCount=1,n.length<=5e3){for(let m=0;m<n.length;m++)o(m);this.draw();return}let d=0,u=m=>{if(e!==this.layoutToken)return;let _=performance.now();for(;d<n.length;){o(d++);let p=m?.timeRemaining?.()??0;if(d%250===0&&p<=1&&performance.now()-_>8)break}this.draw(),d<n.length&&e===this.layoutToken&&(this.idleHandle=this.requestIdle(u))};this.idleHandle=this.requestIdle(u)}draw(){let n=this.canvasRef?.nativeElement;if(!n)return;let e=this.scrollRef?.nativeElement,t=window.devicePixelRatio||1,r=at*2+this.laneCount*be,o=e?.scrollTop??0,d=e?.clientHeight??0,u=Math.max(r,e?.clientWidth??r),m=Math.max(d||P*8,P);this.ensureCanvasSize(n,u,m,t);let _=`translateY(${o}px)`;this.canvasTransform!==_&&(this.canvasTransform=_,n.style.transform=_);let p=n.getContext("2d"),M=this.readTheme(n);if(p.setTransform(t,0,0,t,0,-o*t),p.clearRect(0,o,u,m),p.fillStyle=M.surface,p.fillRect(0,o,u,m),!this.nodes.length)return;let A=C=>at+C*be+be/2,U=C=>xe+C*P+P/2,W=C=>st[C%st.length],B=this.state.selectedHash(),Se=P*4,f=Math.max(0,Math.floor((o-xe-Se)/P)),q=Math.min(this.nodes.length-1,Math.ceil((o+m-xe+Se)/P)),Q=this.nodes.slice(f,q+1);this.drawRows(p,u,A,U,M,B,Q),this.drawGuides(p,o,m,M),p.lineCap="round",p.lineJoin="round";for(let C of Q)for(let E of C.commit.parents){let $=this.rowByHash.get(E);if(!$)continue;let oe=A(C.lane),K=U(C.row),ce=A($.lane),ae=U($.row);p.strokeStyle=M.shadow,p.lineWidth=4,p.globalAlpha=.35,this.drawEdge(p,oe,K,ce,ae),p.strokeStyle=W($.lane),p.lineWidth=C.commit.isMerge?2.6:2.2,p.globalAlpha=B&&B!==C.commit.hash&&B!==$.commit.hash?.55:.9,this.drawEdge(p,oe,K,ce,ae),p.globalAlpha=1}for(let C of Q){let E=A(C.lane),$=U(C.row),oe=W(C.lane),K=C.commit.hash===B,ce=C.row===this.hoverRow,ae=K?He+2:ce?He+1:He;p.beginPath(),p.arc(E,$,ae+3,0,Math.PI*2),p.fillStyle=M.nodeRing,p.fill(),p.beginPath(),p.arc(E,$,ae,0,Math.PI*2),p.fillStyle=C.commit.isMerge?M.surface:oe,p.fill(),p.lineWidth=C.commit.isMerge||K?2.5:1.75,p.strokeStyle=oe,p.stroke(),(K||ce)&&(p.beginPath(),p.arc(E,$,ae+5,0,Math.PI*2),p.strokeStyle=oe,p.globalAlpha=K?.42:.24,p.lineWidth=2,p.stroke(),p.globalAlpha=1)}}drawRows(n,e,t,r,o,d,u=this.nodes){for(let m of u){let _=r(m.row)-P/2;if(m.row%2===1&&(n.fillStyle=o.rowAlt,n.fillRect(0,_,e,P)),(m.row===this.hoverRow||m.commit.hash===d)&&(n.fillStyle=m.commit.hash===d?o.rowSelected:o.rowHover,this.roundRect(n,6,_+3,e-12,P-6,8),n.fill()),m.commit.branches.length||m.commit.tags.length){let p=t(m.lane)+He+8;this.drawRefPill(n,p,r(m.row),m.commit,o)}}}drawGuides(n,e,t,r){n.save(),n.strokeStyle=r.guide,n.lineWidth=1,n.setLineDash([3,5]);let o=e,d=e+t;for(let u=0;u<this.laneCount;u++){let m=at+u*be+be/2;n.beginPath(),n.moveTo(m,o),n.lineTo(m,d),n.stroke()}n.restore()}ensureCanvasSize(n,e,t,r){let o=Math.floor(e*r),d=Math.floor(t*r);this.canvasSize.width===o&&this.canvasSize.height===d&&this.canvasSize.dpr===r||(this.canvasSize={width:o,height:d,dpr:r},n.width=o,n.height=d,n.style.width=`${e}px`,n.style.height=`${t}px`)}requestIdle(n){let e=window.requestIdleCallback;return e?e(n,{timeout:100}):window.setTimeout(()=>n(),16)}cancelIdleLayout(){this.idleHandle!==null&&(window.cancelIdleCallback?window.cancelIdleCallback(this.idleHandle):clearTimeout(this.idleHandle),this.idleHandle=null)}drawEdge(n,e,t,r,o){if(n.beginPath(),n.moveTo(e,t),e===r)n.lineTo(r,o);else{let d=t+Math.min(P*.75,Math.max(12,(o-t)*.36));n.bezierCurveTo(e,d,r,d,r,o)}n.stroke()}drawRefPill(n,e,t,r,o){let d=r.tags[0]??r.branches.find(M=>!Xn(M));if(!d)return;let u=Math.max(0,n.canvas.clientWidth-e-8);if(u<28)return;let m=Jn(d,u>72?12:8);n.font="600 10px ui-sans-serif, system-ui, sans-serif";let _=Math.min(u,72,n.measureText(m).width+14),p=18;n.fillStyle=r.tags.length?o.warningSoft:o.accentSoft,this.roundRect(n,e,t-p/2,_,p,999),n.fill(),n.fillStyle=r.tags.length?o.warning:o.accent,n.fillText(m,e+7,t+3.5)}onClick(n){let e=this.nodeFromEvent(n);e&&this.state.selectHash(e.commit.hash)}onMouseMove(n){let e=this.nodeFromEvent(n),t=e?.row??-1;t!==this.hoverRow&&(this.hoverRow=t,this.canvasRef.nativeElement.style.cursor=e?"pointer":"default",this.draw())}onMouseLeave(){this.hoverRow!==-1&&(this.hoverRow=-1,this.canvasRef.nativeElement.style.cursor="default",this.draw())}nodeFromEvent(n){let e=this.scrollRef?.nativeElement,t=e?.getBoundingClientRect();if(!t)return;let r=n.clientY-t.top+(e?.scrollTop??0),o=Math.floor((r-xe)/P);return this.nodes[o]}readTheme(n){let e=getComputedStyle(n);return{accent:this.css(e,"--accent","#4f46e5"),accentSoft:this.css(e,"--accent-soft","#eef2ff"),guide:this.css(e,"--graph-guide","rgba(148, 163, 184, 0.28)"),nodeRing:this.css(e,"--graph-node-ring","#ffffff"),rowAlt:this.css(e,"--graph-row-alt","rgba(15, 23, 42, 0.025)"),rowHover:this.css(e,"--graph-row-hover","rgba(79, 70, 229, 0.08)"),rowSelected:this.css(e,"--graph-row-selected","rgba(79, 70, 229, 0.14)"),shadow:this.css(e,"--graph-shadow","rgba(15, 23, 42, 0.12)"),surface:this.css(e,"--bg-panel","#ffffff"),warning:this.css(e,"--warning","#d97706"),warningSoft:"rgba(217, 119, 6, 0.15)"}}css(n,e,t){return n.getPropertyValue(e).trim()||t}roundRect(n,e,t,r,o,d){let u=Math.min(d,r/2,o/2);n.beginPath(),n.moveTo(e+u,t),n.arcTo(e+r,t,e+r,t+o,u),n.arcTo(e+r,t+o,e,t+o,u),n.arcTo(e,t+o,e,t,u),n.arcTo(e,t,e+r,t,u),n.closePath()}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=D({type:i,selectors:[["app-commit-graph"]],viewQuery:function(e,t){if(e&1&&(J(Yn,7),J(Zn,7)),e&2){let r;ee(r=te())&&(t.canvasRef=r.first),ee(r=te())&&(t.scrollRef=r.first)}},hostBindings:function(e,t){e&1&&S("resize",function(){return t.onResize()},Ie)},decls:14,vars:5,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","empty",4,"ngIf"],[1,"swatch"],[1,"empty"]],template:function(e,t){e&1&&(l(0,"div",2)(1,"div",3)(2,"span"),c(3,"Graph"),a(),l(4,"span",4),c(5),a()(),l(6,"div",5),b(7,Qn,1,2,"span",6),a()(),l(8,"div",7,0),y(10,"div",8)(11,"canvas",9,1),b(13,Kn,2,0,"div",10),a()),e&2&&(s(5),v(t.graphSummary()),s(2),h("ngForOf",t.legendColors),s(3),ne("height",t.contentHeight(),"px"),s(3),h("ngIf",!t.state.commits().length&&!t.state.loading()))},dependencies:[R,Z,I],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:auto;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:1px;pointer-events:none}canvas[_ngcontent-%COMP%]{display:block;position:absolute;top:0;left:0;pointer-events:auto;will-change:transform}.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 Xn(i){return i.startsWith("origin/")||i.includes("/origin/")}function Jn(i,n){return i.length>n?`${i.slice(0,Math.max(1,n-1))}...`:i}function we(i,n=0){return ei(i)?Number(i):arguments.length===2?n:0}function ei(i){return!isNaN(parseFloat(i))&&!isNaN(Number(i))}function gn(i){return i instanceof me?i.nativeElement:i}var lt;try{lt=typeof Intl<"u"&&Intl.v8BreakIterator}catch{lt=!1}var We=(()=>{class i{_platformId=g(Et);isBrowser=this._platformId?Ut(this._platformId):typeof document=="object"&&!!document;EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent);TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent);BLINK=this.isBrowser&&!!(window.chrome||lt)&&typeof CSS<"u"&&!this.EDGE&&!this.TRIDENT;WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT;IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window);FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent);ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT;SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT;constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275prov=N({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var ti=new X("cdk-dir-doc",{providedIn:"root",factory:ni});function ni(){return g(De)}var ii=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;function ri(i){let n=i?.toLowerCase()||"";return n==="auto"&&typeof navigator<"u"&&navigator?.language?ii.test(navigator.language)?"rtl":"ltr":n==="rtl"?"rtl":"ltr"}var hn=(()=>{class i{get value(){return this.valueSignal()}valueSignal=w("ltr");change=new Rt;constructor(){let e=g(ti,{optional:!0});if(e){let t=e.body?e.body.dir:null,r=e.documentElement?e.documentElement.dir:null;this.valueSignal.set(ri(t||r||"ltr"))}}ngOnDestroy(){this.change.complete()}static \u0275fac=function(t){return new(t||i)};static \u0275prov=N({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var L=(function(i){return i[i.NORMAL=0]="NORMAL",i[i.NEGATED=1]="NEGATED",i[i.INVERTED=2]="INVERTED",i})(L||{}),$e,re;function un(){if(re==null){if(typeof document!="object"||!document||typeof Element!="function"||!Element)return re=!1,re;if(document.documentElement?.style&&"scrollBehavior"in document.documentElement.style)re=!0;else{let i=Element.prototype.scrollTo;i?re=!/\{\s*\[native code\]\s*\}/.test(i.toString()):re=!1}}return re}function le(){if(typeof document!="object"||!document)return L.NORMAL;if($e==null){let i=document.createElement("div"),n=i.style;i.dir="rtl",n.width="1px",n.overflow="auto",n.visibility="hidden",n.pointerEvents="none",n.position="absolute";let e=document.createElement("div"),t=e.style;t.width="2px",t.height="1px",i.appendChild(e),document.body.appendChild(i),$e=L.NORMAL,i.scrollLeft===0&&(i.scrollLeft=1,$e=i.scrollLeft===0?L.NEGATED:L.INVERTED),i.remove()}return $e}var ct=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=pe({type:i});static \u0275inj=de({})}return i})();var Ue=class{};function _n(i){return i&&typeof i.connect=="function"&&!(i instanceof gt)}var qe=class extends Ue{_data;constructor(n){super(),this._data=n}connect(){return Me(this._data)?this._data:Y(this._data)}disconnect(){}},ye=(function(i){return i[i.REPLACED=0]="REPLACED",i[i.INSERTED=1]="INSERTED",i[i.MOVED=2]="MOVED",i[i.REMOVED=3]="REMOVED",i})(ye||{}),dt=new X("_ViewRepeater"),Ye=class{viewCacheSize=20;_viewCache=[];applyChanges(n,e,t,r,o){n.forEachOperation((d,u,m)=>{let _,p;if(d.previousIndex==null){let M=()=>t(d,u,m);_=this._insertView(M,m,e,r(d)),p=_?ye.INSERTED:ye.REPLACED}else m==null?(this._detachAndCacheView(u,e),p=ye.REMOVED):(_=this._moveView(u,m,e,r(d)),p=ye.MOVED);o&&o({context:_?.context,operation:p,record:d})})}detach(){for(let n of this._viewCache)n.destroy();this._viewCache=[]}_insertView(n,e,t,r){let o=this._insertViewFromCache(e,t);if(o){o.context.$implicit=r;return}let d=n();return t.createEmbeddedView(d.templateRef,d.context,d.index)}_detachAndCacheView(n,e){let t=e.detach(n);this._maybeCacheView(t,e)}_moveView(n,e,t,r){let o=t.get(n);return t.move(o,e),o.context.$implicit=r,o}_maybeCacheView(n,e){if(this._viewCache.length<this.viewCacheSize)this._viewCache.push(n);else{let t=e.indexOf(n);t===-1?n.destroy():e.remove(t)}}_insertViewFromCache(n,e){let t=this._viewCache.pop();return t&&e.insert(t,n),t||null}};var oi=["contentWrapper"],ai=["*"],xn=new X("VIRTUAL_SCROLL_STRATEGY"),mt=class{_scrolledIndexChange=new T;scrolledIndexChange=this._scrolledIndexChange.pipe(Ct());_viewport=null;_itemSize;_minBufferPx;_maxBufferPx;constructor(n,e,t){this._itemSize=n,this._minBufferPx=e,this._maxBufferPx=t}attach(n){this._viewport=n,this._updateTotalContentSize(),this._updateRenderedRange()}detach(){this._scrolledIndexChange.complete(),this._viewport=null}updateItemAndBufferSize(n,e,t){t<e,this._itemSize=n,this._minBufferPx=e,this._maxBufferPx=t,this._updateTotalContentSize(),this._updateRenderedRange()}onContentScrolled(){this._updateRenderedRange()}onDataLengthChanged(){this._updateTotalContentSize(),this._updateRenderedRange()}onContentRendered(){}onRenderedOffsetChanged(){}scrollToIndex(n,e){this._viewport&&this._viewport.scrollToOffset(n*this._itemSize,e)}_updateTotalContentSize(){this._viewport&&this._viewport.setTotalContentSize(this._viewport.getDataLength()*this._itemSize)}_updateRenderedRange(){if(!this._viewport)return;let n=this._viewport.getRenderedRange(),e={start:n.start,end:n.end},t=this._viewport.getViewportSize(),r=this._viewport.getDataLength(),o=this._viewport.measureScrollOffset(),d=this._itemSize>0?o/this._itemSize:0;if(e.end>r){let m=Math.ceil(t/this._itemSize),_=Math.max(0,Math.min(d,r-m));d!=_&&(d=_,o=_*this._itemSize,e.start=Math.floor(d)),e.end=Math.max(0,Math.min(r,e.start+m))}let u=o-e.start*this._itemSize;if(u<this._minBufferPx&&e.start!=0){let m=Math.ceil((this._maxBufferPx-u)/this._itemSize);e.start=Math.max(0,e.start-m),e.end=Math.min(r,Math.ceil(d+(t+this._minBufferPx)/this._itemSize))}else{let m=e.end*this._itemSize-(o+t);if(m<this._minBufferPx&&e.end!=r){let _=Math.ceil((this._maxBufferPx-m)/this._itemSize);_>0&&(e.end=Math.min(r,e.end+_),e.start=Math.max(0,Math.floor(d-this._minBufferPx/this._itemSize)))}}this._viewport.setRenderedRange(e),this._viewport.setRenderedContentOffset(Math.round(this._itemSize*e.start)),this._scrolledIndexChange.next(Math.floor(d))}};function si(i){return i._scrollStrategy}var wn=(()=>{class i{get itemSize(){return this._itemSize}set itemSize(e){this._itemSize=we(e)}_itemSize=20;get minBufferPx(){return this._minBufferPx}set minBufferPx(e){this._minBufferPx=we(e)}_minBufferPx=100;get maxBufferPx(){return this._maxBufferPx}set maxBufferPx(e){this._maxBufferPx=we(e)}_maxBufferPx=200;_scrollStrategy=new mt(this.itemSize,this.minBufferPx,this.maxBufferPx);ngOnChanges(){this._scrollStrategy.updateItemAndBufferSize(this.itemSize,this.minBufferPx,this.maxBufferPx)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=se({type:i,selectors:[["cdk-virtual-scroll-viewport","itemSize",""]],inputs:{itemSize:"itemSize",minBufferPx:"minBufferPx",maxBufferPx:"maxBufferPx"},features:[he([{provide:xn,useFactory:si,deps:[wt(()=>i)]}]),Pe]})}return i})(),li=20,ci=(()=>{class i{_ngZone=g(fe);_platform=g(We);_renderer=g(et).createRenderer(null,null);_cleanupGlobalListener;constructor(){}_scrolled=new T;_scrolledCount=0;scrollContainers=new Map;register(e){this.scrollContainers.has(e)||this.scrollContainers.set(e,e.elementScrolled().subscribe(()=>this._scrolled.next(e)))}deregister(e){let t=this.scrollContainers.get(e);t&&(t.unsubscribe(),this.scrollContainers.delete(e))}scrolled(e=li){return this._platform.isBrowser?new Xe(t=>{this._cleanupGlobalListener||(this._cleanupGlobalListener=this._ngZone.runOutsideAngular(()=>this._renderer.listen("document","scroll",()=>this._scrolled.next())));let r=e>0?this._scrolled.pipe(ke(e)).subscribe(t):this._scrolled.subscribe(t);return this._scrolledCount++,()=>{r.unsubscribe(),this._scrolledCount--,this._scrolledCount||(this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0)}}):Y()}ngOnDestroy(){this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0,this.scrollContainers.forEach((e,t)=>this.deregister(t)),this._scrolled.complete()}ancestorScrolled(e,t){let r=this.getAncestorScrollContainers(e);return this.scrolled(t).pipe(_t(o=>!o||r.indexOf(o)>-1))}getAncestorScrollContainers(e){let t=[];return this.scrollContainers.forEach((r,o)=>{this._scrollableContainsElement(o,e)&&t.push(o)}),t}_scrollableContainsElement(e,t){let r=gn(t),o=e.getElementRef().nativeElement;do if(r==o)return!0;while(r=r.parentElement);return!1}static \u0275fac=function(t){return new(t||i)};static \u0275prov=N({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),yn=(()=>{class i{elementRef=g(me);scrollDispatcher=g(ci);ngZone=g(fe);dir=g(hn,{optional:!0});_scrollElement=this.elementRef.nativeElement;_destroyed=new T;_renderer=g(Pt);_cleanupScroll;_elementScrolled=new T;constructor(){}ngOnInit(){this._cleanupScroll=this.ngZone.runOutsideAngular(()=>this._renderer.listen(this._scrollElement,"scroll",e=>this._elementScrolled.next(e))),this.scrollDispatcher.register(this)}ngOnDestroy(){this._cleanupScroll?.(),this._elementScrolled.complete(),this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}elementScrolled(){return this._elementScrolled}getElementRef(){return this.elementRef}scrollTo(e){let t=this.elementRef.nativeElement,r=this.dir&&this.dir.value=="rtl";e.left==null&&(e.left=r?e.end:e.start),e.right==null&&(e.right=r?e.start:e.end),e.bottom!=null&&(e.top=t.scrollHeight-t.clientHeight-e.bottom),r&&le()!=L.NORMAL?(e.left!=null&&(e.right=t.scrollWidth-t.clientWidth-e.left),le()==L.INVERTED?e.left=e.right:le()==L.NEGATED&&(e.left=e.right?-e.right:e.right)):e.right!=null&&(e.left=t.scrollWidth-t.clientWidth-e.right),this._applyScrollToOptions(e)}_applyScrollToOptions(e){let t=this.elementRef.nativeElement;un()?t.scrollTo(e):(e.top!=null&&(t.scrollTop=e.top),e.left!=null&&(t.scrollLeft=e.left))}measureScrollOffset(e){let t="left",r="right",o=this.elementRef.nativeElement;if(e=="top")return o.scrollTop;if(e=="bottom")return o.scrollHeight-o.clientHeight-o.scrollTop;let d=this.dir&&this.dir.value=="rtl";return e=="start"?e=d?r:t:e=="end"&&(e=d?t:r),d&&le()==L.INVERTED?e==t?o.scrollWidth-o.clientWidth-o.scrollLeft:o.scrollLeft:d&&le()==L.NEGATED?e==t?o.scrollLeft+o.scrollWidth-o.clientWidth:-o.scrollLeft:e==t?o.scrollLeft:o.scrollWidth-o.clientWidth-o.scrollLeft}static \u0275fac=function(t){return new(t||i)};static \u0275dir=se({type:i,selectors:[["","cdk-scrollable",""],["","cdkScrollable",""]]})}return i})(),di=20,mi=(()=>{class i{_platform=g(We);_listeners;_viewportSize;_change=new T;_document=g(De);constructor(){let e=g(fe),t=g(et).createRenderer(null,null);e.runOutsideAngular(()=>{if(this._platform.isBrowser){let r=o=>this._change.next(o);this._listeners=[t.listen("window","resize",r),t.listen("window","orientationchange",r)]}this.change().subscribe(()=>this._viewportSize=null)})}ngOnDestroy(){this._listeners?.forEach(e=>e()),this._change.complete()}getViewportSize(){this._viewportSize||this._updateViewportSize();let e={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),e}getViewportRect(){let e=this.getViewportScrollPosition(),{width:t,height:r}=this.getViewportSize();return{top:e.top,left:e.left,bottom:e.top+r,right:e.left+t,height:r,width:t}}getViewportScrollPosition(){if(!this._platform.isBrowser)return{top:0,left:0};let e=this._document,t=this._getWindow(),r=e.documentElement,o=r.getBoundingClientRect(),d=-o.top||e.body.scrollTop||t.scrollY||r.scrollTop||0,u=-o.left||e.body.scrollLeft||t.scrollX||r.scrollLeft||0;return{top:d,left:u}}change(e=di){return e>0?this._change.pipe(ke(e)):this._change}_getWindow(){return this._document.defaultView||window}_updateViewportSize(){let e=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:e.innerWidth,height:e.innerHeight}:{width:0,height:0}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=N({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),vn=new X("VIRTUAL_SCROLLABLE"),pi=(()=>{class i extends yn{constructor(){super()}measureViewportSize(e){let t=this.elementRef.nativeElement;return e==="horizontal"?t.clientWidth:t.clientHeight}static \u0275fac=function(t){return new(t||i)};static \u0275dir=se({type:i,features:[tt]})}return i})();function fi(i,n){return i.start==n.start&&i.end==n.end}var gi=typeof requestAnimationFrame<"u"?ut:ht,pt=(()=>{class i extends pi{elementRef=g(me);_changeDetectorRef=g(Gt);_scrollStrategy=g(xn,{optional:!0});scrollable=g(vn,{optional:!0});_platform=g(We);_detachedSubject=new T;_renderedRangeSubject=new T;get orientation(){return this._orientation}set orientation(e){this._orientation!==e&&(this._orientation=e,this._calculateSpacerSize())}_orientation="vertical";appendOnly=!1;scrolledIndexChange=new Xe(e=>this._scrollStrategy.scrolledIndexChange.subscribe(t=>Promise.resolve().then(()=>this.ngZone.run(()=>e.next(t)))));_contentWrapper;renderedRangeStream=this._renderedRangeSubject;_totalContentSize=0;_totalContentWidth=w("");_totalContentHeight=w("");_renderedContentTransform;_renderedRange={start:0,end:0};_dataLength=0;_viewportSize=0;_forOf;_renderedContentOffset=0;_renderedContentOffsetNeedsRewrite=!1;_changeDetectionNeeded=w(!1);_runAfterChangeDetection=[];_viewportChanges=ft.EMPTY;_injector=g(St);_isDestroyed=!1;constructor(){super();let e=g(mi);this._scrollStrategy,this._viewportChanges=e.change().subscribe(()=>{this.checkViewportSize()}),this.scrollable||(this.elementRef.nativeElement.classList.add("cdk-virtual-scrollable"),this.scrollable=this);let t=H(()=>{this._changeDetectionNeeded()&&this._doChangeDetection()},{injector:g(Nt).injector});g(Mt).onDestroy(()=>void t.destroy())}ngOnInit(){this._platform.isBrowser&&(this.scrollable===this&&super.ngOnInit(),this.ngZone.runOutsideAngular(()=>Promise.resolve().then(()=>{this._measureViewportSize(),this._scrollStrategy.attach(this),this.scrollable.elementScrolled().pipe(Je(null),ke(0,gi),Ee(this._destroyed)).subscribe(()=>this._scrollStrategy.onContentScrolled()),this._markChangeDetectionNeeded()})))}ngOnDestroy(){this.detach(),this._scrollStrategy.detach(),this._renderedRangeSubject.complete(),this._detachedSubject.complete(),this._viewportChanges.unsubscribe(),this._isDestroyed=!0,super.ngOnDestroy()}attach(e){this._forOf,this.ngZone.runOutsideAngular(()=>{this._forOf=e,this._forOf.dataStream.pipe(Ee(this._detachedSubject)).subscribe(t=>{let r=t.length;r!==this._dataLength&&(this._dataLength=r,this._scrollStrategy.onDataLengthChanged()),this._doChangeDetection()})})}detach(){this._forOf=null,this._detachedSubject.next()}getDataLength(){return this._dataLength}getViewportSize(){return this._viewportSize}getRenderedRange(){return this._renderedRange}measureBoundingClientRectWithScrollOffset(e){return this.getElementRef().nativeElement.getBoundingClientRect()[e]}setTotalContentSize(e){this._totalContentSize!==e&&(this._totalContentSize=e,this._calculateSpacerSize(),this._markChangeDetectionNeeded())}setRenderedRange(e){fi(this._renderedRange,e)||(this.appendOnly&&(e={start:0,end:Math.max(this._renderedRange.end,e.end)}),this._renderedRangeSubject.next(this._renderedRange=e),this._markChangeDetectionNeeded(()=>this._scrollStrategy.onContentRendered()))}getOffsetToRenderedContentStart(){return this._renderedContentOffsetNeedsRewrite?null:this._renderedContentOffset}setRenderedContentOffset(e,t="to-start"){e=this.appendOnly&&t==="to-start"?0:e;let r=this.dir&&this.dir.value=="rtl",o=this.orientation=="horizontal",d=o?"X":"Y",m=`translate${d}(${Number((o&&r?-1:1)*e)}px)`;this._renderedContentOffset=e,t==="to-end"&&(m+=` translate${d}(-100%)`,this._renderedContentOffsetNeedsRewrite=!0),this._renderedContentTransform!=m&&(this._renderedContentTransform=m,this._markChangeDetectionNeeded(()=>{this._renderedContentOffsetNeedsRewrite?(this._renderedContentOffset-=this.measureRenderedContentSize(),this._renderedContentOffsetNeedsRewrite=!1,this.setRenderedContentOffset(this._renderedContentOffset)):this._scrollStrategy.onRenderedOffsetChanged()}))}scrollToOffset(e,t="auto"){let r={behavior:t};this.orientation==="horizontal"?r.start=e:r.top=e,this.scrollable.scrollTo(r)}scrollToIndex(e,t="auto"){this._scrollStrategy.scrollToIndex(e,t)}measureScrollOffset(e){let t;return this.scrollable==this?t=r=>super.measureScrollOffset(r):t=r=>this.scrollable.measureScrollOffset(r),Math.max(0,t(e??(this.orientation==="horizontal"?"start":"top"))-this.measureViewportOffset())}measureViewportOffset(e){let t,r="left",o="right",d=this.dir?.value=="rtl";e=="start"?t=d?o:r:e=="end"?t=d?r:o:e?t=e:t=this.orientation==="horizontal"?"left":"top";let u=this.scrollable.measureBoundingClientRectWithScrollOffset(t);return this.elementRef.nativeElement.getBoundingClientRect()[t]-u}measureRenderedContentSize(){let e=this._contentWrapper.nativeElement;return this.orientation==="horizontal"?e.offsetWidth:e.offsetHeight}measureRangeSize(e){return this._forOf?this._forOf.measureRangeSize(e,this.orientation):0}checkViewportSize(){this._measureViewportSize(),this._scrollStrategy.onDataLengthChanged()}_measureViewportSize(){this._viewportSize=this.scrollable.measureViewportSize(this.orientation)}_markChangeDetectionNeeded(e){e&&this._runAfterChangeDetection.push(e),!Ht(this._changeDetectionNeeded)&&this.ngZone.runOutsideAngular(()=>{Promise.resolve().then(()=>{this.ngZone.run(()=>{this._changeDetectionNeeded.set(!0)})})})}_doChangeDetection(){this._isDestroyed||this.ngZone.run(()=>{this._changeDetectorRef.markForCheck(),this._contentWrapper.nativeElement.style.transform=this._renderedContentTransform,Tt(()=>{this._changeDetectionNeeded.set(!1);let e=this._runAfterChangeDetection;this._runAfterChangeDetection=[];for(let t of e)t()},{injector:this._injector})})}_calculateSpacerSize(){this._totalContentHeight.set(this.orientation==="horizontal"?"":`${this._totalContentSize}px`),this._totalContentWidth.set(this.orientation==="horizontal"?`${this._totalContentSize}px`:"")}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=D({type:i,selectors:[["cdk-virtual-scroll-viewport"]],viewQuery:function(t,r){if(t&1&&J(oi,7),t&2){let o;ee(o=te())&&(r._contentWrapper=o.first)}},hostAttrs:[1,"cdk-virtual-scroll-viewport"],hostVars:4,hostBindings:function(t,r){t&2&&F("cdk-virtual-scroll-orientation-horizontal",r.orientation==="horizontal")("cdk-virtual-scroll-orientation-vertical",r.orientation!=="horizontal")},inputs:{orientation:"orientation",appendOnly:[2,"appendOnly","appendOnly",$t]},outputs:{scrolledIndexChange:"scrolledIndexChange"},features:[he([{provide:yn,useFactory:(e,t)=>e||t,deps:[[new Ot,new kt(vn)],i]}]),tt],ngContentSelectors:ai,decls:4,vars:4,consts:[["contentWrapper",""],[1,"cdk-virtual-scroll-content-wrapper"],[1,"cdk-virtual-scroll-spacer"]],template:function(t,r){t&1&&(Lt(),Vt(0,"div",1,0),At(2),Ft(),zt(3,"div",2)),t&2&&(s(3),ne("width",r._totalContentWidth())("height",r._totalContentHeight()))},styles:[`cdk-virtual-scroll-viewport{display:block;position:relative;transform:translateZ(0)}.cdk-virtual-scrollable{overflow:auto;will-change:scroll-position;contain:strict}.cdk-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .cdk-virtual-scroll-content-wrapper{right:0;left:auto}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper{min-height:100%}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{min-width:100%}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.cdk-virtual-scroll-spacer{height:1px;transform-origin:0 0;flex:0 0 auto}[dir=rtl] .cdk-virtual-scroll-spacer{transform-origin:100% 0}
2
2
  `],encapsulation:2,changeDetection:0})}return i})();function Cn(i,n,e){let t=e;if(!t.getBoundingClientRect)return 0;let r=t.getBoundingClientRect();return i==="horizontal"?n==="start"?r.left:r.right:n==="start"?r.top:r.bottom}var Sn=(()=>{class i{_viewContainerRef=g(It);_template=g(Dt);_differs=g(Wt);_viewRepeater=g(dt);_viewport=g(pt,{skipSelf:!0});viewChange=new T;_dataSourceChanges=new T;get cdkVirtualForOf(){return this._cdkVirtualForOf}set cdkVirtualForOf(e){this._cdkVirtualForOf=e,_n(e)?this._dataSourceChanges.next(e):this._dataSourceChanges.next(new qe(Me(e)?e:Array.from(e||[])))}_cdkVirtualForOf;get cdkVirtualForTrackBy(){return this._cdkVirtualForTrackBy}set cdkVirtualForTrackBy(e){this._needsUpdate=!0,this._cdkVirtualForTrackBy=e?(t,r)=>e(t+(this._renderedRange?this._renderedRange.start:0),r):void 0}_cdkVirtualForTrackBy;set cdkVirtualForTemplate(e){e&&(this._needsUpdate=!0,this._template=e)}get cdkVirtualForTemplateCacheSize(){return this._viewRepeater.viewCacheSize}set cdkVirtualForTemplateCacheSize(e){this._viewRepeater.viewCacheSize=we(e)}dataStream=this._dataSourceChanges.pipe(Je(null),bt(),Oe(([e,t])=>this._changeDataSource(e,t)),xt(1));_differ=null;_data;_renderedItems;_renderedRange;_needsUpdate=!1;_destroyed=new T;constructor(){let e=g(fe);this.dataStream.subscribe(t=>{this._data=t,this._onRenderedDataChange()}),this._viewport.renderedRangeStream.pipe(Ee(this._destroyed)).subscribe(t=>{this._renderedRange=t,this.viewChange.observers.length&&e.run(()=>this.viewChange.next(this._renderedRange)),this._onRenderedDataChange()}),this._viewport.attach(this)}measureRangeSize(e,t){if(e.start>=e.end)return 0;e.start<this._renderedRange.start||e.end>this._renderedRange.end;let r=e.start-this._renderedRange.start,o=e.end-e.start,d,u;for(let m=0;m<o;m++){let _=this._viewContainerRef.get(m+r);if(_&&_.rootNodes.length){d=u=_.rootNodes[0];break}}for(let m=o-1;m>-1;m--){let _=this._viewContainerRef.get(m+r);if(_&&_.rootNodes.length){u=_.rootNodes[_.rootNodes.length-1];break}}return d&&u?Cn(t,"end",u)-Cn(t,"start",d):0}ngDoCheck(){if(this._differ&&this._needsUpdate){let e=this._differ.diff(this._renderedItems);e?this._applyChanges(e):this._updateContext(),this._needsUpdate=!1}}ngOnDestroy(){this._viewport.detach(),this._dataSourceChanges.next(void 0),this._dataSourceChanges.complete(),this.viewChange.complete(),this._destroyed.next(),this._destroyed.complete(),this._viewRepeater.detach()}_onRenderedDataChange(){this._renderedRange&&(this._renderedItems=this._data.slice(this._renderedRange.start,this._renderedRange.end),this._differ||(this._differ=this._differs.find(this._renderedItems).create((e,t)=>this.cdkVirtualForTrackBy?this.cdkVirtualForTrackBy(e,t):t)),this._needsUpdate=!0)}_changeDataSource(e,t){return e&&e.disconnect(this),this._needsUpdate=!0,t?t.connect(this):Y()}_updateContext(){let e=this._data.length,t=this._viewContainerRef.length;for(;t--;){let r=this._viewContainerRef.get(t);r.context.index=this._renderedRange.start+t,r.context.count=e,this._updateComputedContextProperties(r.context),r.detectChanges()}}_applyChanges(e){this._viewRepeater.applyChanges(e,this._viewContainerRef,(o,d,u)=>this._getEmbeddedViewArgs(o,u),o=>o.item),e.forEachIdentityChange(o=>{let d=this._viewContainerRef.get(o.currentIndex);d.context.$implicit=o.item});let t=this._data.length,r=this._viewContainerRef.length;for(;r--;){let o=this._viewContainerRef.get(r);o.context.index=this._renderedRange.start+r,o.context.count=t,this._updateComputedContextProperties(o.context)}}_updateComputedContextProperties(e){e.first=e.index===0,e.last=e.index===e.count-1,e.even=e.index%2===0,e.odd=!e.even}_getEmbeddedViewArgs(e,t){return{templateRef:this._template,context:{$implicit:e.item,cdkVirtualForOf:this._cdkVirtualForOf,index:-1,count:-1,first:!1,last:!1,odd:!1,even:!1},index:t}}static ngTemplateContextGuard(e,t){return!0}static \u0275fac=function(t){return new(t||i)};static \u0275dir=se({type:i,selectors:[["","cdkVirtualFor","","cdkVirtualForOf",""]],inputs:{cdkVirtualForOf:"cdkVirtualForOf",cdkVirtualForTrackBy:"cdkVirtualForTrackBy",cdkVirtualForTemplate:"cdkVirtualForTemplate",cdkVirtualForTemplateCacheSize:"cdkVirtualForTemplateCacheSize"},features:[he([{provide:dt,useClass:Ye}])]})}return i})();var bn=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=pe({type:i});static \u0275inj=de({})}return i})(),Mn=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=pe({type:i});static \u0275inj=de({imports:[ct,bn,ct,bn]})}return i})();function ui(i,n){i&1&&y(0,"span",19)}function _i(i,n){if(i&1&&(l(0,"span",23),c(1),a()),i&2){let e=n.$implicit;s(),v(e)}}function vi(i,n){if(i&1&&(l(0,"span",24),c(1),a()),i&2){let e=n.$implicit;s(),v(e)}}function Ci(i,n){if(i&1&&(l(0,"span",20),b(1,_i,2,1,"span",21)(2,vi,2,1,"span",22),a()),i&2){let e=x().$implicit;s(),h("ngForOf",e.tags),s(),h("ngForOf",e.branches)}}function bi(i,n){if(i&1){let e=V();l(0,"button",7),S("click",function(){let r=k(e).$implicit,o=x();return O(o.select(r))}),l(1,"span",8),y(2,"span",9),b(3,ui,1,0,"span",10),a(),l(4,"span",11)(5,"span",12),c(6),a(),l(7,"span",13)(8,"span",14),c(9),a(),l(10,"span",15),c(11,"\u2022"),a(),l(12,"span",16),c(13),a(),l(14,"span",15),c(15,"\u2022"),a(),l(16,"span",17),c(17),ue(18,"date"),a()()(),b(19,Ci,3,2,"span",18),a()}if(i&2){let e=n.$implicit,t=n.index,r=x();F("selected",e.hash===r.selectedHash()),ge("aria-current",e.hash===r.selectedHash()?"true":null),s(2),ne("background",r.laneColor(e)),F("merge",e.isMerge),s(),h("ngIf",t<r.commits().length-1),s(2),h("title",e.subject),s(),v(e.subject),s(3),v(e.shortHash),s(4),v(e.author),s(4),v(_e(18,14,e.date,"MMM d, y, h:mm a")),s(2),h("ngIf",e.branches.length||e.tags.length)}}function xi(i,n){i&1&&(l(0,"div",25)(1,"p"),c(2,"No commits match your filters."),a()())}var Ze=class i{state=g(G);commits=this.state.commits;selectedHash=this.state.selectedHash;trackByHash(n,e){return e.hash}select(n){this.state.selectHash(n.hash)}laneColors=["#4f46e5","#06b6d4","#f59e0b","#ef4444","#10b981","#8b5cf6"];laneColor(n){let e=0,t=n.branches[0]??n.parents[0]??n.hash;for(let r=0;r<t.length;r++)e=e*31+t.charCodeAt(r)>>>0;return this.laneColors[e%this.laneColors.length]}onKey(n){if(!this.isTyping(n.target)){if(n.key==="j")n.preventDefault(),this.state.selectByOffset(1);else if(n.key==="k")n.preventDefault(),this.state.selectByOffset(-1);else if(n.key==="g"){n.preventDefault();let e=this.state.commits();e.length&&this.state.selectHash(e[0].hash)}else if(n.key==="G"){n.preventDefault();let e=this.state.commits();e.length&&this.state.selectHash(e[e.length-1].hash)}}}isTyping(n){return n instanceof HTMLElement?["INPUT","TEXTAREA","SELECT"].includes(n.tagName)||n.isContentEditable:!1}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=D({type:i,selectors:[["app-commit-list"]],hostBindings:function(e,t){e&1&&S("keydown",function(o){return t.onKey(o)},Ie)},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,"subject",3,"title"],[1,"meta"],[1,"hash"],[1,"dot-sep"],[1,"author"],[1,"date"],["class","badges",4,"ngIf"],[1,"line"],[1,"badges"],["class","badge tag",4,"ngFor","ngForOf"],["class","badge branch",4,"ngFor","ngForOf"],[1,"badge","tag"],[1,"badge","branch"],[1,"empty"]],template:function(e,t){e&1&&(l(0,"div",0)(1,"span",1),c(2),a(),l(3,"span",2)(4,"kbd",3),c(5,"j"),a(),c(6,"/"),l(7,"kbd",3),c(8,"k"),a(),c(9," navigate "),a()(),l(10,"cdk-virtual-scroll-viewport",4),b(11,bi,20,17,"button",5)(12,xi,3,0,"div",6),a()),e&2&&(s(2),Ve("",t.commits().length," of ",t.state.total()),s(8),h("itemSize",58),s(),h("cdkVirtualForOf",t.commits())("cdkVirtualForTrackBy",t.trackByHash),s(),h("ngIf",!t.commits().length&&!t.state.loading()))},dependencies:[R,Z,I,Mn,wn,Sn,pt,ze],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%]{display:grid;grid-template-columns:24px 1fr auto;gap:.5rem;align-items:center;width:100%;height:58px;padding:.38rem .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)}.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:2px}.subject[_ngcontent-%COMP%]{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}.hash[_ngcontent-%COMP%]{font-family:var(--font-mono)}.dot-sep[_ngcontent-%COMP%]{opacity:.5}.badges[_ngcontent-%COMP%]{display:flex;gap:4px;flex-wrap:wrap;justify-content:flex-end;max-width:150px;overflow:hidden;max-height:42px}.badge[_ngcontent-%COMP%]{font-size:10px;font-weight:600;padding:2px 7px;border-radius:999px;letter-spacing:.02em;border:1px solid transparent;max-width:128px;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)}.empty[_ngcontent-%COMP%]{padding:2rem 1rem;text-align:center;color:var(--fg-muted)}"],changeDetection:0})};var Qe=class i{http=g(Le);base="/api";list(n={}){let e=new qt;for(let[t,r]of Object.entries(n))r&&(e=e.set(t,String(r)));return this.http.get(`${this.base}/groups`,{params:e})}static \u0275fac=function(e){return new(e||i)};static \u0275prov=N({token:i,factory:i.\u0275fac,providedIn:"root"})};function wi(i,n){if(i&1&&(l(0,"span",7),c(1),a()),i&2){let e=n.ngIf;s(),j("",e," groups")}}function yi(i,n){i&1&&(l(0,"div",8),c(1,"Loading groups\u2026"),a())}function Si(i,n){if(i&1&&(l(0,"div",9),c(1),a()),i&2){let e=n.ngIf;s(),v(e)}}function Mi(i,n){i&1&&(l(0,"div",8),c(1," No groups detected. Try the flat view. "),a())}function ki(i,n){if(i&1&&(l(0,"span",18),c(1),a()),i&2){let e=x().$implicit;s(),j("#",e.prNumber)}}function Oi(i,n){if(i&1){let e=V();l(0,"li",21),S("click",function(){let r=k(e).$implicit,o=x(3);return O(o.state.selectHash(r))}),l(1,"code",22),c(2),a(),l(3,"span",23),c(4),a()()}if(i&2){let e=n.$implicit,t=x(3);F("selected",e===t.state.selectedHash()),s(2),v(t.shortHash(e)),s(2),v(t.subjectFor(e))}}function Ei(i,n){if(i&1&&(l(0,"ul",19),b(1,Oi,5,4,"li",20),a()),i&2){let e=x().$implicit;s(),h("ngForOf",e.commits)}}function Di(i,n){if(i&1){let e=V();l(0,"li",10)(1,"button",11),S("click",function(){let r=k(e).$implicit,o=x();return O(o.toggle(r.id))}),l(2,"span",12),c(3,"\u25B8"),a(),l(4,"span",13),c(5),a(),b(6,ki,2,1,"span",14),l(7,"span",15),c(8),a(),l(9,"span",16),c(10),a()(),b(11,Ei,2,1,"ul",17),a()}if(i&2){let e=n.$implicit,t=x();F("expanded",t.isExpanded(e.id)),s(2),F("open",t.isExpanded(e.id)),s(2),Bt("src-"+e.source),s(),v(t.sourceLabel(e.source)),s(),h("ngIf",e.prNumber),s(2),v(e.title),s(2),v(e.commits.length),s(),h("ngIf",t.isExpanded(e.id))}}var Ke=class i{state=g(G);groupsApi=g(Qe);groups=w(null);loading=w(!1);error=w(null);expanded=w(new Set);subjectMap=ie(()=>{let n=new Map;for(let e of this.state.commits())n.set(e.hash,e.subject);return n});constructor(){H(()=>{let n=this.state.filters();this.load(n.since,n.until,n.author,n.branch)})}isExpanded(n){return this.expanded().has(n)}toggle(n){let e=new Set(this.expanded());e.has(n)?e.delete(n):e.add(n),this.expanded.set(e)}shortHash(n){return n.slice(0,7)}subjectFor(n){return this.subjectMap().get(n)??n.slice(0,7)}sourceLabel(n){switch(n){case"merge":return"PR";case"squash":return"PR (sq)";case"conventional":return"Feat";case"standalone":return"commit"}}load(n,e,t,r){this.loading.set(!0),this.error.set(null),this.groupsApi.list({since:n,until:e,author:t,branch:r}).subscribe({next:o=>{this.groups.set(o),this.loading.set(!1);let d=o.find(u=>u.prNumber);d&&this.expanded.set(new Set([d.id]))},error:o=>{this.error.set(this.errMsg(o)),this.loading.set(!1)}})}errMsg(n){if(n&&typeof n=="object"&&"error"in n){let e=n.error;if(e?.error)return e.error}return n instanceof Error?n.message:"Failed to load groups"}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=D({type:i,selectors:[["app-grouped-list"]],decls:9,vars:5,consts:[[1,"head"],[1,"title"],["class","meta",4,"ngIf"],["class","empty",4,"ngIf"],["class","empty error",4,"ngIf"],[1,"groups"],["class","group",3,"expanded",4,"ngFor","ngForOf"],[1,"meta"],[1,"empty"],[1,"empty","error"],[1,"group"],[1,"group-head",3,"click"],[1,"caret"],[1,"badge"],["class","pr",4,"ngIf"],[1,"g-title"],[1,"count"],["class","commits",4,"ngIf"],[1,"pr"],[1,"commits"],["class","commit",3,"selected","click",4,"ngFor","ngForOf"],[1,"commit",3,"click"],[1,"hash"],[1,"subject"]],template:function(e,t){if(e&1&&(l(0,"div",0)(1,"span",1),c(2,"PR / feature groups"),a(),b(3,wi,2,1,"span",2),a(),b(4,yi,2,0,"div",3)(5,Si,2,1,"div",4)(6,Mi,2,0,"div",3),l(7,"ul",5),b(8,Di,12,11,"li",6),a()),e&2){let r,o;s(3),h("ngIf",(r=t.groups())==null?null:r.length),s(),h("ngIf",t.loading()),s(),h("ngIf",t.error()),s(),h("ngIf",!t.loading()&&!t.error()&&(((o=t.groups())==null?null:o.length)??0)===0),s(2),h("ngForOf",t.groups())}},dependencies:[R,Z,I],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 Pi(i,n){i&1&&(Re(0),y(1,"app-grouped-list"),Te())}function Ii(i,n){i&1&&y(0,"app-commit-list")}var kn=class i{state=g(G);static \u0275fac=function(e){return new(e||i)};static \u0275cmp=D({type:i,selectors:[["app-home-shell"]],decls:11,vars:2,consts:[["flat",""],[1,"layout"],[1,"pane","graph"],[1,"pane","list"],[1,"pane-shell"],[4,"ngIf","ngIfElse"],[1,"pane","detail"],[1,"pane-shell","detail-shell"]],template:function(e,t){if(e&1&&(l(0,"main",1)(1,"aside",2),y(2,"app-commit-graph"),a(),l(3,"section",3)(4,"div",4),b(5,Pi,2,0,"ng-container",5)(6,Ii,1,0,"ng-template",null,0,Fe),a()(),l(8,"section",6)(9,"div",7),y(10,"app-commit-detail"),a()()()),e&2){let r=Ne(7);s(5),h("ngIf",t.state.viewMode()==="grouped")("ngIfElse",r)}},dependencies:[R,I,Ge,Ze,je,Ke],styles:["[_nghost-%COMP%]{display:block;flex:1;min-height:0}.layout[_ngcontent-%COMP%]{height:100%;display:grid;grid-template-columns:minmax(180px,230px) minmax(320px,390px) 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{kn as HomeShellComponent};
@@ -1 +1 @@
1
- import{a as O}from"./chunk-AWMYL3YU.js";import{a as V}from"./chunk-I4VBIHH2.js";import{b as z,d as L}from"./chunk-6VRZZB3T.js";import{a as R}from"./chunk-UIWFTWLF.js";import{$ as p,Ab as m,Bb as _,Cb as T,Ga as i,Kb as y,Mb as M,Pa as x,Rb as D,Sb as N,Ta as g,a as B,b as F,cc as P,db as s,dc as k,ea as b,eb as o,fa as h,fb as r,fc as H,gb as E,gc as S,mb as C,nb as f,oa as c,ob as d,xb as v,zb as l}from"./chunk-OBPR2XVH.js";function U(n,t){n&1&&(o(0,"div",3),l(1,"Loading blame\u2026"),r())}function q(n,t){if(n&1&&(o(0,"div",4),l(1),r()),n&2){let e=t.ngIf;i(),m(e)}}function J(n,t){n&1&&(o(0,"div",3),l(1," No blame data (file may be binary or freshly created). "),r())}function K(n,t){if(n&1){let e=C();o(0,"div",7)(1,"div",8)(2,"code",9),f("click",function(){let u=b(e).$implicit,I=d(2);return h(I.onSelectCommit(u.hash))}),l(3),r(),o(4,"span",10),l(5),r(),o(6,"span",11),l(7),r()(),o(8,"span",12),l(9),r(),o(10,"pre",13),l(11),r()()}if(n&2){let e=t.$implicit,a=d(2);i(),v("invisible",!e.isFirstOfBlock),i(2),m(e.hash.slice(0,7)),i(2),m(e.author),i(2),m(a.shortDate(e.date)),i(2),m(e.line),i(2),m(e.content)}}function Q(n,t){if(n&1&&(o(0,"div",5),g(1,K,12,7,"div",6),r()),n&2){let e=d();i(),s("ngForOf",e.rows())("ngForTrackBy",e.trackByLine)}}var w=class n{gitService=p(O);set file(t){this._file=t,t?this.load(t):this.lines.set([])}get file(){return this._file}_file=null;onCommitClick=null;lines=c([]);loading=c(!1);error=c(null);rows=D(()=>{let t=[],e="";for(let a of this.lines())t.push(F(B({},a),{isFirstOfBlock:a.hash!==e})),e=a.hash;return t});trackByLine(t,e){return e.line}shortDate(t){return(t||"").slice(0,10)}onSelectCommit(t){this.onCommitClick&&this.onCommitClick(t)}load(t){this.loading.set(!0),this.error.set(null),this.gitService.getBlame(t).subscribe({next:e=>{this.lines.set(e),this.loading.set(!1)},error:e=>{this.error.set(e?.error?.error??"Failed to load blame"),this.loading.set(!1)}})}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=x({type:n,selectors:[["app-blame"]],inputs:{file:"file",onCommitClick:"onCommitClick"},decls:4,vars:4,consts:[["class","empty",4,"ngIf"],["class","empty error",4,"ngIf"],["class","blame",4,"ngIf"],[1,"empty"],[1,"empty","error"],[1,"blame"],["class","row",4,"ngFor","ngForOf","ngForTrackBy"],[1,"row"],[1,"meta"],[1,"hash",3,"click"],[1,"author"],[1,"date"],[1,"line-no"],[1,"code"]],template:function(e,a){e&1&&g(0,U,2,0,"div",0)(1,q,2,1,"div",1)(2,J,2,0,"div",0)(3,Q,2,2,"div",2),e&2&&(s("ngIf",a.loading()),i(),s("ngIf",a.error()),i(),s("ngIf",!a.loading()&&!a.error()&&a.rows().length===0&&a.file),i(),s("ngIf",a.rows().length>0))},dependencies:[S,P,k],styles:["[_nghost-%COMP%]{display:block;font-family:var(--font-mono, monospace);font-size:12.5px}.empty[_ngcontent-%COMP%]{padding:1.5rem;color:var(--fg-muted);text-align:center}.empty.error[_ngcontent-%COMP%]{color:var(--danger)}.blame[_ngcontent-%COMP%]{display:block;background:var(--bg-surface);border:1px solid var(--border-soft);border-radius:var(--radius-md);overflow:auto;max-height:70vh}.row[_ngcontent-%COMP%]{display:grid;grid-template-columns:220px 50px 1fr;align-items:center;gap:.5rem;padding:0 .5rem;border-bottom:1px solid color-mix(in oklab,var(--border-soft) 50%,transparent)}.row[_ngcontent-%COMP%]:hover{background:var(--bg-elevated)}.meta[_ngcontent-%COMP%]{display:flex;gap:.5rem;align-items:center;font-size:11px;color:var(--fg-muted);padding:.15rem 0;border-right:1px solid var(--border-soft)}.meta.invisible[_ngcontent-%COMP%] > *[_ngcontent-%COMP%]{visibility:hidden}.hash[_ngcontent-%COMP%]{color:var(--accent);cursor:pointer;text-decoration:none}.hash[_ngcontent-%COMP%]:hover{text-decoration:underline}.author[_ngcontent-%COMP%]{max-width:100px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date[_ngcontent-%COMP%]{color:var(--fg-subtle)}.line-no[_ngcontent-%COMP%]{color:var(--fg-subtle);text-align:right;font-variant-numeric:tabular-nums;font-size:11px}.code[_ngcontent-%COMP%]{margin:0;padding:.15rem 0;white-space:pre;overflow-x:auto;color:var(--fg-primary)}"],changeDetection:0})};function W(n,t){if(n&1&&(o(0,"div",9)(1,"span"),l(2),r(),o(3,"span"),l(4,"\xB7"),r(),o(5,"span"),l(6),r(),o(7,"span"),l(8,"\xB7"),r(),o(9,"span"),l(10),y(11,"slice"),r(),o(12,"span"),l(13,"\xB7"),r(),o(14,"span"),l(15),y(16,"slice"),r()()),n&2){let e=t.ngIf;i(2),_("",e.totalCommits," commits"),i(4),_("",e.contributors.length," contributors"),i(4),_("first: ",M(11,4,e.firstSeen,0,10)),i(5),_("last: ",M(16,8,e.lastTouched,0,10))}}function X(n,t){n&1&&(o(0,"div",15),l(1,"Loading commits\u2026"),r())}function Y(n,t){if(n&1&&(o(0,"div",16),l(1),r()),n&2){let e=t.ngIf;i(),m(e)}}function Z(n,t){if(n&1){let e=C();o(0,"li",17),f("click",function(){let u=b(e).$implicit,I=d(2);return h(I.onSelectCommit(u.hash))}),o(1,"code",18),l(2),r(),o(3,"div",19)(4,"span",20),l(5),r(),o(6,"span",21),l(7),y(8,"slice"),r()()()}if(n&2){let e=t.$implicit,a=d(2);v("selected",e.hash===a.state.selectedHash()),i(2),m(e.shortHash),i(3),m(e.subject),i(2),T("",e.author," \xB7 ",M(8,6,e.date,0,10))}}function ee(n,t){if(n&1&&(o(0,"section",10),g(1,X,2,0,"div",11)(2,Y,2,1,"div",12),o(3,"ul",13),g(4,Z,9,10,"li",14),r()()),n&2){let e=d();i(),s("ngIf",e.loading()),i(),s("ngIf",e.error()),i(2),s("ngForOf",e.commits())}}function te(n,t){if(n&1&&(o(0,"section",22),E(1,"app-blame",23),r()),n&2){let e=d();i(),s("file",e.filePath())("onCommitClick",e.onSelectCommit.bind(e))}}var j=class n{route=p(z);router=p(L);git=p(O);insightsApi=p(R);state=p(V);filePath=c("");stats=c(null);commits=c([]);loading=c(!1);error=c(null);tab=c("history");constructor(){N(()=>{let t=this.route.snapshot.paramMap.get("path")??"",e=decodeURIComponent(t);this.filePath.set(e),e&&this.load(e)})}onSelectCommit(t){this.state.selectHash(t),this.router.navigate(["/"],{queryParams:{commit:t}})}goBack(){this.router.navigate(["/"])}load(t){this.loading.set(!0),this.error.set(null),this.insightsApi.fileStats(t).subscribe({next:e=>this.stats.set(e),error:()=>this.stats.set(null)}),this.git.getCommits({file:t,page:1,pageSize:200}).subscribe({next:e=>{this.commits.set(e.commits),this.loading.set(!1)},error:e=>{this.error.set(e?.error?.error??"Failed to load file history"),this.loading.set(!1)}})}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=x({type:n,selectors:[["app-file-history"]],decls:15,vars:8,consts:[[1,"page"],[1,"head"],[1,"btn","btn-ghost",3,"click"],[1,"title-block"],["class","meta",4,"ngIf"],[1,"tabs"],[1,"tab",3,"click"],["class","history",4,"ngIf"],["class","blame-tab",4,"ngIf"],[1,"meta"],[1,"history"],["class","empty",4,"ngIf"],["class","empty error",4,"ngIf"],[1,"commits"],["class","commit",3,"selected","click",4,"ngFor","ngForOf"],[1,"empty"],[1,"empty","error"],[1,"commit",3,"click"],[1,"hash"],[1,"info"],[1,"subject"],[1,"byline"],[1,"blame-tab"],[3,"file","onCommitClick"]],template:function(e,a){e&1&&(o(0,"div",0)(1,"header",1)(2,"button",2),f("click",function(){return a.goBack()}),l(3,"\u2190 Back"),r(),o(4,"div",3)(5,"h2"),l(6),r(),g(7,W,17,12,"div",4),r()(),o(8,"nav",5)(9,"button",6),f("click",function(){return a.tab.set("history")}),l(10," History "),r(),o(11,"button",6),f("click",function(){return a.tab.set("blame")}),l(12," Blame "),r()(),g(13,ee,5,3,"section",7)(14,te,2,2,"section",8),r()),e&2&&(i(6),m(a.filePath()),i(),s("ngIf",a.stats()),i(2),v("active",a.tab()==="history"),i(2),v("active",a.tab()==="blame"),i(2),s("ngIf",a.tab()==="history"),i(),s("ngIf",a.tab()==="blame"))},dependencies:[S,P,k,w,H],styles:["[_nghost-%COMP%]{display:block;flex:1;min-height:0;overflow-y:auto}.page[_ngcontent-%COMP%]{padding:1.1rem 1.25rem;max-width:1200px;margin:0 auto}.head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:1rem;margin-bottom:1rem;padding:.9rem 1rem;background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm)}.head[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0;font-size:16px;font-family:var(--font-mono, monospace);word-break:break-all}.meta[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:12px;display:flex;gap:.4rem;flex-wrap:wrap;margin-top:.25rem}.tabs[_ngcontent-%COMP%]{display:flex;gap:.5rem;padding:.25rem;border:1px solid var(--border-soft);border-radius:999px;background:var(--bg-panel);margin-bottom:1rem;width:fit-content}.tab[_ngcontent-%COMP%]{background:transparent;border:0;padding:.5rem .75rem;cursor:pointer;color:var(--fg-muted);border-radius:999px;font-size:13px}.tab.active[_ngcontent-%COMP%]{color:var(--accent);background:var(--accent-soft);font-weight:600}.empty[_ngcontent-%COMP%]{padding:1.5rem;color:var(--fg-muted);text-align:center;font-size:13px}.empty.error[_ngcontent-%COMP%]{color:var(--danger)}.commits[_ngcontent-%COMP%]{list-style:none;margin:0;padding:.35rem;background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm)}.commit[_ngcontent-%COMP%]{display:flex;gap:.75rem;align-items:flex-start;padding:.55rem .85rem;border-radius:var(--radius-md);cursor:pointer}.commit[_ngcontent-%COMP%]:hover{background:var(--bg-elevated)}.commit.selected[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 18%,transparent)}.commit[_ngcontent-%COMP%] .hash[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);font-size:11px;color:var(--fg-muted);padding-top:2px}.commit[_ngcontent-%COMP%] .info[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-width:0}.commit[_ngcontent-%COMP%] .subject[_ngcontent-%COMP%]{font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.commit[_ngcontent-%COMP%] .byline[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted);margin-top:2px}"],changeDetection:0})};export{j as FileHistoryComponent};
1
+ import{a as O}from"./chunk-4JCUQ6Y5.js";import{a as V}from"./chunk-I4VBIHH2.js";import{b as z,d as L}from"./chunk-6VRZZB3T.js";import{a as R}from"./chunk-UIWFTWLF.js";import{$ as p,Ab as m,Bb as _,Cb as T,Ga as i,Kb as y,Mb as M,Pa as x,Rb as D,Sb as N,Ta as g,a as B,b as F,cc as P,db as s,dc as k,ea as b,eb as o,fa as h,fb as r,fc as H,gb as E,gc as S,mb as C,nb as f,oa as c,ob as d,xb as v,zb as l}from"./chunk-OBPR2XVH.js";function U(n,t){n&1&&(o(0,"div",3),l(1,"Loading blame\u2026"),r())}function q(n,t){if(n&1&&(o(0,"div",4),l(1),r()),n&2){let e=t.ngIf;i(),m(e)}}function J(n,t){n&1&&(o(0,"div",3),l(1," No blame data (file may be binary or freshly created). "),r())}function K(n,t){if(n&1){let e=C();o(0,"div",7)(1,"div",8)(2,"code",9),f("click",function(){let u=b(e).$implicit,I=d(2);return h(I.onSelectCommit(u.hash))}),l(3),r(),o(4,"span",10),l(5),r(),o(6,"span",11),l(7),r()(),o(8,"span",12),l(9),r(),o(10,"pre",13),l(11),r()()}if(n&2){let e=t.$implicit,a=d(2);i(),v("invisible",!e.isFirstOfBlock),i(2),m(e.hash.slice(0,7)),i(2),m(e.author),i(2),m(a.shortDate(e.date)),i(2),m(e.line),i(2),m(e.content)}}function Q(n,t){if(n&1&&(o(0,"div",5),g(1,K,12,7,"div",6),r()),n&2){let e=d();i(),s("ngForOf",e.rows())("ngForTrackBy",e.trackByLine)}}var w=class n{gitService=p(O);set file(t){this._file=t,t?this.load(t):this.lines.set([])}get file(){return this._file}_file=null;onCommitClick=null;lines=c([]);loading=c(!1);error=c(null);rows=D(()=>{let t=[],e="";for(let a of this.lines())t.push(F(B({},a),{isFirstOfBlock:a.hash!==e})),e=a.hash;return t});trackByLine(t,e){return e.line}shortDate(t){return(t||"").slice(0,10)}onSelectCommit(t){this.onCommitClick&&this.onCommitClick(t)}load(t){this.loading.set(!0),this.error.set(null),this.gitService.getBlame(t).subscribe({next:e=>{this.lines.set(e),this.loading.set(!1)},error:e=>{this.error.set(e?.error?.error??"Failed to load blame"),this.loading.set(!1)}})}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=x({type:n,selectors:[["app-blame"]],inputs:{file:"file",onCommitClick:"onCommitClick"},decls:4,vars:4,consts:[["class","empty",4,"ngIf"],["class","empty error",4,"ngIf"],["class","blame",4,"ngIf"],[1,"empty"],[1,"empty","error"],[1,"blame"],["class","row",4,"ngFor","ngForOf","ngForTrackBy"],[1,"row"],[1,"meta"],[1,"hash",3,"click"],[1,"author"],[1,"date"],[1,"line-no"],[1,"code"]],template:function(e,a){e&1&&g(0,U,2,0,"div",0)(1,q,2,1,"div",1)(2,J,2,0,"div",0)(3,Q,2,2,"div",2),e&2&&(s("ngIf",a.loading()),i(),s("ngIf",a.error()),i(),s("ngIf",!a.loading()&&!a.error()&&a.rows().length===0&&a.file),i(),s("ngIf",a.rows().length>0))},dependencies:[S,P,k],styles:["[_nghost-%COMP%]{display:block;font-family:var(--font-mono, monospace);font-size:12.5px}.empty[_ngcontent-%COMP%]{padding:1.5rem;color:var(--fg-muted);text-align:center}.empty.error[_ngcontent-%COMP%]{color:var(--danger)}.blame[_ngcontent-%COMP%]{display:block;background:var(--bg-surface);border:1px solid var(--border-soft);border-radius:var(--radius-md);overflow:auto;max-height:70vh}.row[_ngcontent-%COMP%]{display:grid;grid-template-columns:220px 50px 1fr;align-items:center;gap:.5rem;padding:0 .5rem;border-bottom:1px solid color-mix(in oklab,var(--border-soft) 50%,transparent)}.row[_ngcontent-%COMP%]:hover{background:var(--bg-elevated)}.meta[_ngcontent-%COMP%]{display:flex;gap:.5rem;align-items:center;font-size:11px;color:var(--fg-muted);padding:.15rem 0;border-right:1px solid var(--border-soft)}.meta.invisible[_ngcontent-%COMP%] > *[_ngcontent-%COMP%]{visibility:hidden}.hash[_ngcontent-%COMP%]{color:var(--accent);cursor:pointer;text-decoration:none}.hash[_ngcontent-%COMP%]:hover{text-decoration:underline}.author[_ngcontent-%COMP%]{max-width:100px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date[_ngcontent-%COMP%]{color:var(--fg-subtle)}.line-no[_ngcontent-%COMP%]{color:var(--fg-subtle);text-align:right;font-variant-numeric:tabular-nums;font-size:11px}.code[_ngcontent-%COMP%]{margin:0;padding:.15rem 0;white-space:pre;overflow-x:auto;color:var(--fg-primary)}"],changeDetection:0})};function W(n,t){if(n&1&&(o(0,"div",9)(1,"span"),l(2),r(),o(3,"span"),l(4,"\xB7"),r(),o(5,"span"),l(6),r(),o(7,"span"),l(8,"\xB7"),r(),o(9,"span"),l(10),y(11,"slice"),r(),o(12,"span"),l(13,"\xB7"),r(),o(14,"span"),l(15),y(16,"slice"),r()()),n&2){let e=t.ngIf;i(2),_("",e.totalCommits," commits"),i(4),_("",e.contributors.length," contributors"),i(4),_("first: ",M(11,4,e.firstSeen,0,10)),i(5),_("last: ",M(16,8,e.lastTouched,0,10))}}function X(n,t){n&1&&(o(0,"div",15),l(1,"Loading commits\u2026"),r())}function Y(n,t){if(n&1&&(o(0,"div",16),l(1),r()),n&2){let e=t.ngIf;i(),m(e)}}function Z(n,t){if(n&1){let e=C();o(0,"li",17),f("click",function(){let u=b(e).$implicit,I=d(2);return h(I.onSelectCommit(u.hash))}),o(1,"code",18),l(2),r(),o(3,"div",19)(4,"span",20),l(5),r(),o(6,"span",21),l(7),y(8,"slice"),r()()()}if(n&2){let e=t.$implicit,a=d(2);v("selected",e.hash===a.state.selectedHash()),i(2),m(e.shortHash),i(3),m(e.subject),i(2),T("",e.author," \xB7 ",M(8,6,e.date,0,10))}}function ee(n,t){if(n&1&&(o(0,"section",10),g(1,X,2,0,"div",11)(2,Y,2,1,"div",12),o(3,"ul",13),g(4,Z,9,10,"li",14),r()()),n&2){let e=d();i(),s("ngIf",e.loading()),i(),s("ngIf",e.error()),i(2),s("ngForOf",e.commits())}}function te(n,t){if(n&1&&(o(0,"section",22),E(1,"app-blame",23),r()),n&2){let e=d();i(),s("file",e.filePath())("onCommitClick",e.onSelectCommit.bind(e))}}var j=class n{route=p(z);router=p(L);git=p(O);insightsApi=p(R);state=p(V);filePath=c("");stats=c(null);commits=c([]);loading=c(!1);error=c(null);tab=c("history");constructor(){N(()=>{let t=this.route.snapshot.paramMap.get("path")??"",e=decodeURIComponent(t);this.filePath.set(e),e&&this.load(e)})}onSelectCommit(t){this.state.selectHash(t),this.router.navigate(["/"],{queryParams:{commit:t}})}goBack(){this.router.navigate(["/"])}load(t){this.loading.set(!0),this.error.set(null),this.insightsApi.fileStats(t).subscribe({next:e=>this.stats.set(e),error:()=>this.stats.set(null)}),this.git.getCommits({file:t,page:1,pageSize:200}).subscribe({next:e=>{this.commits.set(e.commits),this.loading.set(!1)},error:e=>{this.error.set(e?.error?.error??"Failed to load file history"),this.loading.set(!1)}})}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=x({type:n,selectors:[["app-file-history"]],decls:15,vars:8,consts:[[1,"page"],[1,"head"],[1,"btn","btn-ghost",3,"click"],[1,"title-block"],["class","meta",4,"ngIf"],[1,"tabs"],[1,"tab",3,"click"],["class","history",4,"ngIf"],["class","blame-tab",4,"ngIf"],[1,"meta"],[1,"history"],["class","empty",4,"ngIf"],["class","empty error",4,"ngIf"],[1,"commits"],["class","commit",3,"selected","click",4,"ngFor","ngForOf"],[1,"empty"],[1,"empty","error"],[1,"commit",3,"click"],[1,"hash"],[1,"info"],[1,"subject"],[1,"byline"],[1,"blame-tab"],[3,"file","onCommitClick"]],template:function(e,a){e&1&&(o(0,"div",0)(1,"header",1)(2,"button",2),f("click",function(){return a.goBack()}),l(3,"\u2190 Back"),r(),o(4,"div",3)(5,"h2"),l(6),r(),g(7,W,17,12,"div",4),r()(),o(8,"nav",5)(9,"button",6),f("click",function(){return a.tab.set("history")}),l(10," History "),r(),o(11,"button",6),f("click",function(){return a.tab.set("blame")}),l(12," Blame "),r()(),g(13,ee,5,3,"section",7)(14,te,2,2,"section",8),r()),e&2&&(i(6),m(a.filePath()),i(),s("ngIf",a.stats()),i(2),v("active",a.tab()==="history"),i(2),v("active",a.tab()==="blame"),i(2),s("ngIf",a.tab()==="history"),i(),s("ngIf",a.tab()==="blame"))},dependencies:[S,P,k,w,H],styles:["[_nghost-%COMP%]{display:block;flex:1;min-height:0;overflow-y:auto}.page[_ngcontent-%COMP%]{padding:1.1rem 1.25rem;max-width:1200px;margin:0 auto}.head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:1rem;margin-bottom:1rem;padding:.9rem 1rem;background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm)}.head[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0;font-size:16px;font-family:var(--font-mono, monospace);word-break:break-all}.meta[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:12px;display:flex;gap:.4rem;flex-wrap:wrap;margin-top:.25rem}.tabs[_ngcontent-%COMP%]{display:flex;gap:.5rem;padding:.25rem;border:1px solid var(--border-soft);border-radius:999px;background:var(--bg-panel);margin-bottom:1rem;width:fit-content}.tab[_ngcontent-%COMP%]{background:transparent;border:0;padding:.5rem .75rem;cursor:pointer;color:var(--fg-muted);border-radius:999px;font-size:13px}.tab.active[_ngcontent-%COMP%]{color:var(--accent);background:var(--accent-soft);font-weight:600}.empty[_ngcontent-%COMP%]{padding:1.5rem;color:var(--fg-muted);text-align:center;font-size:13px}.empty.error[_ngcontent-%COMP%]{color:var(--danger)}.commits[_ngcontent-%COMP%]{list-style:none;margin:0;padding:.35rem;background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm)}.commit[_ngcontent-%COMP%]{display:flex;gap:.75rem;align-items:flex-start;padding:.55rem .85rem;border-radius:var(--radius-md);cursor:pointer}.commit[_ngcontent-%COMP%]:hover{background:var(--bg-elevated)}.commit.selected[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 18%,transparent)}.commit[_ngcontent-%COMP%] .hash[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);font-size:11px;color:var(--fg-muted);padding-top:2px}.commit[_ngcontent-%COMP%] .info[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-width:0}.commit[_ngcontent-%COMP%] .subject[_ngcontent-%COMP%]{font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.commit[_ngcontent-%COMP%] .byline[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted);margin-top:2px}"],changeDetection:0})};export{j as FileHistoryComponent};
@@ -12,5 +12,5 @@
12
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-DUWPKHDX.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-DUWPKHDX.css"></noscript></head>
13
13
  <body>
14
14
  <app-root></app-root>
15
- <link rel="modulepreload" href="chunk-CFCRPNUQ.js"><link rel="modulepreload" href="chunk-UHWTLUOW.js"><link rel="modulepreload" href="chunk-AWMYL3YU.js"><link rel="modulepreload" href="chunk-I4VBIHH2.js"><link rel="modulepreload" href="chunk-6VRZZB3T.js"><link rel="modulepreload" href="chunk-OBPR2XVH.js"><script src="polyfills-5CFQRCPP.js" type="module"></script><script src="main-6PSVVDXD.js" type="module"></script></body>
15
+ <link rel="modulepreload" href="chunk-CFCRPNUQ.js"><link rel="modulepreload" href="chunk-UHWTLUOW.js"><link rel="modulepreload" href="chunk-4JCUQ6Y5.js"><link rel="modulepreload" href="chunk-I4VBIHH2.js"><link rel="modulepreload" href="chunk-6VRZZB3T.js"><link rel="modulepreload" href="chunk-OBPR2XVH.js"><script src="polyfills-5CFQRCPP.js" type="module"></script><script src="main-SQFBVJA6.js" type="module"></script></body>
16
16
  </html>
@@ -1 +1 @@
1
- import{a as be,b as ve,c as xe}from"./chunk-CFCRPNUQ.js";import{a as z,b as B,c as R,e as fe,f as he,g as _e,h as j}from"./chunk-UHWTLUOW.js";import{a as Ce}from"./chunk-AWMYL3YU.js";import{a as S}from"./chunk-I4VBIHH2.js";import{a as ae,c as de,e as me,f as ue,g as ge}from"./chunk-6VRZZB3T.js";import{$ as v,Ab as b,Bb as C,D as Y,Ea as ie,F as ee,Fa as D,Ga as a,Jb as oe,Pa as M,Pb as re,R as te,Rb as y,Sb as w,Ta as f,W as ne,ab as E,cc as I,db as c,dc as k,ea as m,eb as o,fa as u,fb as r,ga as P,gb as x,gc as T,ha as $,kb as V,lb as F,lc as se,mb as _,mc as le,nb as p,nc as ce,oa as O,ob as g,oc as pe,q as X,sb as N,tb as L,ub as A,xb as H,zb as l}from"./chunk-OBPR2XVH.js";var ye=[{path:"",loadComponent:()=>import("./chunk-L4LXF744.js").then(n=>n.HomeShellComponent),pathMatch:"full"},{path:"timeline",loadComponent:()=>import("./chunk-VHEMN3MU.js").then(n=>n.TimelineComponent)},{path:"file/:path",loadComponent:()=>import("./chunk-3KK6F5JX.js").then(n=>n.FileHistoryComponent)},{path:"insights",loadComponent:()=>import("./chunk-GRG6HTLW.js").then(n=>n.InsightsComponent)},{path:"**",redirectTo:""}];var Me={providers:[re({eventCoalescing:!0}),ge(ye),ce(pe())]};var ke=["input"];function Te(n,e){if(n&1){let t=_();o(0,"div",3),p("click",function(){m(t);let s=g();return u(s.close())}),r()}}function Se(n,e){if(n&1){let t=_();o(0,"li",11),p("mouseenter",function(){let s=m(t).index,d=g(2);return u(d.index.set(s))})("click",function(){let s=m(t).$implicit,d=g(2);return u(d.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=g(2);H("active",i===s.index()),E("aria-selected",i===s.index()),a(2),b(t.shortHash),a(2),b(t.subject),a(2),b(t.author)}}function Oe(n,e){n&1&&(o(0,"li",15),l(1,"No matches."),r())}function Pe(n,e){if(n&1){let t=_();o(0,"div",4)(1,"input",5,0),p("ngModelChange",function(s){m(t);let d=g();return u(d.onQuery(s))})("keydown",function(s){m(t);let d=g();return u(d.onKey(s))}),r(),o(3,"ul",6),f(4,Se,7,6,"li",7)(5,Oe,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=g();a(),c("ngModel",t.query()),a(3),c("ngForOf",t.results())("ngForTrackBy",t.trackByHash),a(),c("ngIf",!t.results().length)}}var q=class n{state=v(S);input;query=O("");index=O(0);results=y(()=>{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(){w(()=>{this.state.paletteOpen()&&(this.query.set(""),this.index.set(0),queueMicrotask(()=>this.input?.nativeElement.focus()))}),w(()=>{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=M({type:n,selectors:[["app-command-palette"]],viewQuery:function(t,i){if(t&1&&N(ke,5),t&2){let s;L(s=A())&&(i.input=s.first)}},hostBindings:function(t,i){t&1&&p("keydown",function(d){return i.onGlobal(d)},D)},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&&f(0,Te,1,0,"div",1)(1,Pe,21,4,"div",2),t&2&&(c("ngIf",i.state.paletteOpen()),a(),c("ngIf",i.state.paletteOpen()))},dependencies:[T,I,k,j,z,B,R],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 Ee(n,e){if(n&1&&(o(0,"kbd",11),l(1),r()),n&2){let t=e.$implicit;a(),b(t)}}function Ie(n,e){if(n&1&&(o(0,"li")(1,"span",8),l(2),r(),o(3,"span",9),f(4,Ee,2,1,"kbd",10),r()()),n&2){let t=e.$implicit;a(2),b(t.description),a(2),c("ngForOf",t.keys)}}function Ve(n,e){if(n&1&&(o(0,"section")(1,"h3"),l(2),r(),o(3,"ul"),f(4,Ie,5,2,"li",7),r()()),n&2){let t=e.$implicit;a(2),b(t.title),a(2),c("ngForOf",t.bindings)}}function Fe(n,e){if(n&1){let t=_();V(0),o(1,"div",1),p("click",function(){m(t);let s=g();return u(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(){m(t);let s=g();return u(s.close())}),l(7,"\u2715"),r()(),o(8,"div",6),f(9,Ve,5,2,"section",7),r()(),F()}if(n&2){let t=g();a(9),c("ngForOf",t.groups)}}var De=[{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"}]}],G=class n{state=v(S);groups=De;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=M({type:n,selectors:[["app-shortcuts-modal"]],hostBindings:function(t,i){t&1&&p("keydown",function(d){return i.onKey(d)},D)},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&&f(0,Fe,10,1,"ng-container",0),t&2&&c("ngIf",i.state.shortcutsOpen())},dependencies:[T,I,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 Ne=["searchInput"],Le=()=>({exact:!0});function Ae(n,e){if(n&1&&(o(0,"span",36),l(1),r()),n&2){let t=e.ngIf;a(),b(t)}}function He(n,e){n&1&&(V(0),P(),o(1,"svg",37),x(2,"path",38),r(),F())}function ze(n,e){n&1&&(V(0),o(1,"span",39),l(2,"AI"),r(),F())}function Be(n,e){n&1&&(o(0,"kbd",40),l(1,"/"),r())}function Re(n,e){if(n&1&&(o(0,"option",41),l(1),r()),n&2){let t=e.$implicit,i=g();c("value",t),a(),b(i.shortBranch(t))}}function je(n,e){if(n&1&&(o(0,"option",41),l(1),r()),n&2){let t=e.$implicit;c("value",t),a(),b(t)}}function qe(n,e){if(n&1){let t=_();o(0,"button",42),p("click",function(){m(t);let s=g();return u(s.clearFilters())}),l(1),r()}if(n&2){let t=g();a(),C(" Clear ",t.activeFilterCount()," ")}}function Ke(n,e){n&1&&(P(),o(0,"svg",28),x(1,"path",43),r())}function Ge(n,e){n&1&&(P(),o(0,"svg",28),x(1,"path",44),r())}function Ze(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=g().ngIf;a(),C("author: ",t.author)}}function Qe(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=g().ngIf;a(),C("since: ",t.since)}}function Ue(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=g().ngIf;a(),C("until: ",t.until)}}function $e(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=e.$implicit;a(),b(t)}}function We(n,e){n&1&&(o(0,"span",51),l(1,"no structured filters detected"),r())}function Je(n,e){if(n&1&&(o(0,"div",45)(1,"span",46),l(2,"Interpreted as"),r(),f(3,Ze,2,1,"span",47)(4,Qe,2,1,"span",47)(5,Ue,2,1,"span",47)(6,$e,2,1,"span",48)(7,We,2,0,"span",49),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 Xe(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onBranch(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf,i=g(2);a(),C(" branch: ",i.shortBranch(t)," ")}}function Ye(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onAuthor(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" author: ",t," ")}}function et(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onSince(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" since: ",t," ")}}function tt(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onUntil(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" until: ",t," ")}}function nt(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onFile(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" file: ",t," ")}}function it(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onSearchInput(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" search: ",t," ")}}function ot(n,e){if(n&1&&(o(0,"div",52)(1,"span",46),l(2,"Active filters"),r(),f(3,Xe,4,1,"button",53)(4,Ye,4,1,"button",53)(5,et,4,1,"button",53)(6,tt,4,1,"button",53)(7,nt,4,1,"button",53)(8,it,4,1,"button",53),r()),n&2){let t=g();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 Z=class n{state=v(S);theme=v(xe);searchEl;searchValue=O("");totalLabel=y(()=>{let e=this.state.total();return e?`${e.toLocaleString()} commits`:""});themeLabel=y(()=>`Switch to ${this.theme.resolved()==="light"?"dark":"light"} mode`);searchPlaceholder=y(()=>this.state.searchMode()==="nl"?'Ask anything: "login bug last month", "payments by alice"\u2026':"Search commits\u2026 ( / )");searchModeTooltip=y(()=>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=y(()=>this.state.viewMode()==="grouped"?"Showing PR / feature groups. Click for flat list.":"Showing flat commit list. Click for PR / feature groups.");branchOptions=y(()=>{let e=this.state.branches(),t=e.filter(i=>!rt(i));return t.length?t:e});activeFilterCount=y(()=>{let e=this.state.filters();return[e.branch,e.author,e.since,e.until,e.file,e.search].filter(Boolean).length});debounce=null;constructor(){w(()=>{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=M({type:n,selectors:[["app-toolbar"]],viewQuery:function(t,i){if(t&1&&N(Ne,5),t&2){let s;L(s=A())&&(i.searchEl=s.first)}},hostBindings:function(t,i){t&1&&p("keydown",function(d){return i.onKeydown(d)},ie)},decls:49,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"],[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=_();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(),f(7,Ae,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,"div",11)(16,"label",12)(17,"button",13),p("click",function(){return m(s),u(i.toggleSearchMode())}),f(18,He,3,0,"ng-container",14)(19,ze,3,0,"ng-container",14),r(),o(20,"input",15,0),p("ngModelChange",function(h){return m(s),u(i.onSearchInput(h))}),r(),f(22,Be,2,0,"kbd",16),r(),o(23,"select",17),p("ngModelChange",function(h){return m(s),u(i.onBranch(h))}),o(24,"option",18),l(25,"All branches"),r(),f(26,Re,2,2,"option",19),r(),o(27,"select",20),p("ngModelChange",function(h){return m(s),u(i.onAuthor(h))}),o(28,"option",18),l(29,"All authors"),r(),f(30,je,2,2,"option",19),r(),o(31,"input",21),p("ngModelChange",function(h){return m(s),u(i.onSince(h))}),r(),o(32,"input",22),p("ngModelChange",function(h){return m(s),u(i.onUntil(h))}),r(),o(33,"input",23),p("ngModelChange",function(h){return m(s),u(i.onFile(h))}),r()(),o(34,"div",24),f(35,qe,2,1,"button",25),o(36,"button",26),p("click",function(){return m(s),u(i.toggleViewMode())}),l(37),r(),o(38,"button",27),p("click",function(){return m(s),u(i.state.paletteOpen.set(!0))}),P(),o(39,"svg",28),x(40,"path",29),r()(),$(),o(41,"button",30),p("click",function(){return m(s),u(i.state.shortcutsOpen.set(!0))}),P(),o(42,"svg",28),x(43,"path",31),r()(),$(),o(44,"button",32),p("click",function(){return m(s),u(i.theme.cycle())}),f(45,Ke,2,0,"svg",33)(46,Ge,2,0,"svg",33),r()()(),f(47,Je,8,5,"div",34)(48,ot,9,6,"div",35)}t&2&&(a(7),c("ngIf",i.totalLabel()),a(2),c("routerLinkActiveOptions",oe(28,Le)),a(7),H("search-nl",i.state.searchMode()==="nl"),a(),c("title",i.searchModeTooltip()),E("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()),E("aria-label",i.viewModeTooltip()),a(),C(" ",i.state.viewMode()==="grouped"?"Grouped":"Flat"," "),a(7),c("title",i.themeLabel()),E("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:[T,I,k,j,he,_e,z,fe,B,R,me,ue],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 rt(n){return n.startsWith("origin/")||n.includes("/origin/")}var Q=class n{http=v(le);base="/api";naturalLanguage(e,t={}){let s=new se().set("q",e).set("page",String(t.page??1)).set("pageSize",String(t.pageSize??100));for(let d of["author","since","until","branch","file"]){let h=t[d];h&&(s=s.set(d,String(h)))}return this.http.get(`${this.base}/search`,{params:s})}static \u0275fac=function(t){return new(t||n)};static \u0275prov=ne({token:n,factory:n.\u0275fac,providedIn:"root"})};function at(n,e){if(n&1&&(o(0,"div",2)(1,"span"),l(2),r()()),n&2){let t=e.ngIf;a(2),b(t)}}function st(n,e){n&1&&(o(0,"div",3),x(1,"span",4),l(2," Loading commits\u2026 "),r())}var U=class n{state=v(S);git=v(Ce);search=v(Q);commitsResp=ve(be(this.state.filters).pipe(ee(200),te(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(Y(h=>(this.state.error.set(this.errorMessage(h)),this.state.loading.set(!1),X(null))))})),{initialValue:null});authorsLoaded=O(!1);constructor(){w(()=>{let e=this.commitsResp();if(!e)return;this.state.commits.set(e.commits),this.state.total.set(e.total),this.state.page.set(e.page),this.state.pageSize.set(e.pageSize),this.state.loading.set(!1);let t=e.parsedQuery;this.state.nlInterpretation.set(t??null),!this.state.selectedHash()&&e.commits.length&&this.state.selectHash(e.commits[0].hash)}),w(()=>{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."}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=M({type:n,selectors:[["app-root"]],decls:6,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&&(x(0,"app-toolbar"),f(1,at,3,1,"div",0),x(2,"router-outlet"),f(3,st,3,0,"div",1),x(4,"app-command-palette")(5,"app-shortcuts-modal")),t&2&&(a(),c("ngIf",i.state.error()),a(2),c("ngIf",i.state.loading()))},dependencies:[T,k,de,Z,q,G],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})};ae(U,Me).catch(n=>console.error(n));
1
+ import{a as be,b as ve,c as xe}from"./chunk-CFCRPNUQ.js";import{a as z,b as B,c as R,e as fe,f as he,g as _e,h as j}from"./chunk-UHWTLUOW.js";import{a as Ce}from"./chunk-4JCUQ6Y5.js";import{a as S}from"./chunk-I4VBIHH2.js";import{a as ae,c as de,e as me,f as ue,g as ge}from"./chunk-6VRZZB3T.js";import{$ as v,Ab as b,Bb as C,D as Y,Ea as ie,F as ee,Fa as D,Ga as a,Jb as oe,Pa as M,Pb as re,R as te,Rb as y,Sb as w,Ta as f,W as ne,ab as E,cc as I,db as c,dc as k,ea as m,eb as o,fa as u,fb as r,ga as P,gb as x,gc as T,ha as $,kb as V,lb as F,lc as se,mb as _,mc as le,nb as p,nc as ce,oa as O,ob as g,oc as pe,q as X,sb as N,tb as L,ub as A,xb as H,zb as l}from"./chunk-OBPR2XVH.js";var ye=[{path:"",loadComponent:()=>import("./chunk-QNEGGJHP.js").then(n=>n.HomeShellComponent),pathMatch:"full"},{path:"timeline",loadComponent:()=>import("./chunk-VHEMN3MU.js").then(n=>n.TimelineComponent)},{path:"file/:path",loadComponent:()=>import("./chunk-UWM4ZZWH.js").then(n=>n.FileHistoryComponent)},{path:"insights",loadComponent:()=>import("./chunk-GRG6HTLW.js").then(n=>n.InsightsComponent)},{path:"**",redirectTo:""}];var Me={providers:[re({eventCoalescing:!0}),ge(ye),ce(pe())]};var ke=["input"];function Te(n,e){if(n&1){let t=_();o(0,"div",3),p("click",function(){m(t);let s=g();return u(s.close())}),r()}}function Se(n,e){if(n&1){let t=_();o(0,"li",11),p("mouseenter",function(){let s=m(t).index,d=g(2);return u(d.index.set(s))})("click",function(){let s=m(t).$implicit,d=g(2);return u(d.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=g(2);H("active",i===s.index()),E("aria-selected",i===s.index()),a(2),b(t.shortHash),a(2),b(t.subject),a(2),b(t.author)}}function Oe(n,e){n&1&&(o(0,"li",15),l(1,"No matches."),r())}function Pe(n,e){if(n&1){let t=_();o(0,"div",4)(1,"input",5,0),p("ngModelChange",function(s){m(t);let d=g();return u(d.onQuery(s))})("keydown",function(s){m(t);let d=g();return u(d.onKey(s))}),r(),o(3,"ul",6),f(4,Se,7,6,"li",7)(5,Oe,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=g();a(),c("ngModel",t.query()),a(3),c("ngForOf",t.results())("ngForTrackBy",t.trackByHash),a(),c("ngIf",!t.results().length)}}var q=class n{state=v(S);input;query=O("");index=O(0);results=y(()=>{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(){w(()=>{this.state.paletteOpen()&&(this.query.set(""),this.index.set(0),queueMicrotask(()=>this.input?.nativeElement.focus()))}),w(()=>{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=M({type:n,selectors:[["app-command-palette"]],viewQuery:function(t,i){if(t&1&&N(ke,5),t&2){let s;L(s=A())&&(i.input=s.first)}},hostBindings:function(t,i){t&1&&p("keydown",function(d){return i.onGlobal(d)},D)},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&&f(0,Te,1,0,"div",1)(1,Pe,21,4,"div",2),t&2&&(c("ngIf",i.state.paletteOpen()),a(),c("ngIf",i.state.paletteOpen()))},dependencies:[T,I,k,j,z,B,R],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 Ee(n,e){if(n&1&&(o(0,"kbd",11),l(1),r()),n&2){let t=e.$implicit;a(),b(t)}}function Ie(n,e){if(n&1&&(o(0,"li")(1,"span",8),l(2),r(),o(3,"span",9),f(4,Ee,2,1,"kbd",10),r()()),n&2){let t=e.$implicit;a(2),b(t.description),a(2),c("ngForOf",t.keys)}}function Ve(n,e){if(n&1&&(o(0,"section")(1,"h3"),l(2),r(),o(3,"ul"),f(4,Ie,5,2,"li",7),r()()),n&2){let t=e.$implicit;a(2),b(t.title),a(2),c("ngForOf",t.bindings)}}function Fe(n,e){if(n&1){let t=_();V(0),o(1,"div",1),p("click",function(){m(t);let s=g();return u(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(){m(t);let s=g();return u(s.close())}),l(7,"\u2715"),r()(),o(8,"div",6),f(9,Ve,5,2,"section",7),r()(),F()}if(n&2){let t=g();a(9),c("ngForOf",t.groups)}}var De=[{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"}]}],G=class n{state=v(S);groups=De;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=M({type:n,selectors:[["app-shortcuts-modal"]],hostBindings:function(t,i){t&1&&p("keydown",function(d){return i.onKey(d)},D)},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&&f(0,Fe,10,1,"ng-container",0),t&2&&c("ngIf",i.state.shortcutsOpen())},dependencies:[T,I,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 Ne=["searchInput"],Le=()=>({exact:!0});function Ae(n,e){if(n&1&&(o(0,"span",36),l(1),r()),n&2){let t=e.ngIf;a(),b(t)}}function He(n,e){n&1&&(V(0),P(),o(1,"svg",37),x(2,"path",38),r(),F())}function ze(n,e){n&1&&(V(0),o(1,"span",39),l(2,"AI"),r(),F())}function Be(n,e){n&1&&(o(0,"kbd",40),l(1,"/"),r())}function Re(n,e){if(n&1&&(o(0,"option",41),l(1),r()),n&2){let t=e.$implicit,i=g();c("value",t),a(),b(i.shortBranch(t))}}function je(n,e){if(n&1&&(o(0,"option",41),l(1),r()),n&2){let t=e.$implicit;c("value",t),a(),b(t)}}function qe(n,e){if(n&1){let t=_();o(0,"button",42),p("click",function(){m(t);let s=g();return u(s.clearFilters())}),l(1),r()}if(n&2){let t=g();a(),C(" Clear ",t.activeFilterCount()," ")}}function Ke(n,e){n&1&&(P(),o(0,"svg",28),x(1,"path",43),r())}function Ge(n,e){n&1&&(P(),o(0,"svg",28),x(1,"path",44),r())}function Ze(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=g().ngIf;a(),C("author: ",t.author)}}function Qe(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=g().ngIf;a(),C("since: ",t.since)}}function Ue(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=g().ngIf;a(),C("until: ",t.until)}}function $e(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=e.$implicit;a(),b(t)}}function We(n,e){n&1&&(o(0,"span",51),l(1,"no structured filters detected"),r())}function Je(n,e){if(n&1&&(o(0,"div",45)(1,"span",46),l(2,"Interpreted as"),r(),f(3,Ze,2,1,"span",47)(4,Qe,2,1,"span",47)(5,Ue,2,1,"span",47)(6,$e,2,1,"span",48)(7,We,2,0,"span",49),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 Xe(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onBranch(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf,i=g(2);a(),C(" branch: ",i.shortBranch(t)," ")}}function Ye(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onAuthor(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" author: ",t," ")}}function et(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onSince(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" since: ",t," ")}}function tt(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onUntil(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" until: ",t," ")}}function nt(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onFile(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" file: ",t," ")}}function it(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onSearchInput(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" search: ",t," ")}}function ot(n,e){if(n&1&&(o(0,"div",52)(1,"span",46),l(2,"Active filters"),r(),f(3,Xe,4,1,"button",53)(4,Ye,4,1,"button",53)(5,et,4,1,"button",53)(6,tt,4,1,"button",53)(7,nt,4,1,"button",53)(8,it,4,1,"button",53),r()),n&2){let t=g();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 Z=class n{state=v(S);theme=v(xe);searchEl;searchValue=O("");totalLabel=y(()=>{let e=this.state.total();return e?`${e.toLocaleString()} commits`:""});themeLabel=y(()=>`Switch to ${this.theme.resolved()==="light"?"dark":"light"} mode`);searchPlaceholder=y(()=>this.state.searchMode()==="nl"?'Ask anything: "login bug last month", "payments by alice"\u2026':"Search commits\u2026 ( / )");searchModeTooltip=y(()=>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=y(()=>this.state.viewMode()==="grouped"?"Showing PR / feature groups. Click for flat list.":"Showing flat commit list. Click for PR / feature groups.");branchOptions=y(()=>{let e=this.state.branches(),t=e.filter(i=>!rt(i));return t.length?t:e});activeFilterCount=y(()=>{let e=this.state.filters();return[e.branch,e.author,e.since,e.until,e.file,e.search].filter(Boolean).length});debounce=null;constructor(){w(()=>{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=M({type:n,selectors:[["app-toolbar"]],viewQuery:function(t,i){if(t&1&&N(Ne,5),t&2){let s;L(s=A())&&(i.searchEl=s.first)}},hostBindings:function(t,i){t&1&&p("keydown",function(d){return i.onKeydown(d)},ie)},decls:49,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"],[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=_();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(),f(7,Ae,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,"div",11)(16,"label",12)(17,"button",13),p("click",function(){return m(s),u(i.toggleSearchMode())}),f(18,He,3,0,"ng-container",14)(19,ze,3,0,"ng-container",14),r(),o(20,"input",15,0),p("ngModelChange",function(h){return m(s),u(i.onSearchInput(h))}),r(),f(22,Be,2,0,"kbd",16),r(),o(23,"select",17),p("ngModelChange",function(h){return m(s),u(i.onBranch(h))}),o(24,"option",18),l(25,"All branches"),r(),f(26,Re,2,2,"option",19),r(),o(27,"select",20),p("ngModelChange",function(h){return m(s),u(i.onAuthor(h))}),o(28,"option",18),l(29,"All authors"),r(),f(30,je,2,2,"option",19),r(),o(31,"input",21),p("ngModelChange",function(h){return m(s),u(i.onSince(h))}),r(),o(32,"input",22),p("ngModelChange",function(h){return m(s),u(i.onUntil(h))}),r(),o(33,"input",23),p("ngModelChange",function(h){return m(s),u(i.onFile(h))}),r()(),o(34,"div",24),f(35,qe,2,1,"button",25),o(36,"button",26),p("click",function(){return m(s),u(i.toggleViewMode())}),l(37),r(),o(38,"button",27),p("click",function(){return m(s),u(i.state.paletteOpen.set(!0))}),P(),o(39,"svg",28),x(40,"path",29),r()(),$(),o(41,"button",30),p("click",function(){return m(s),u(i.state.shortcutsOpen.set(!0))}),P(),o(42,"svg",28),x(43,"path",31),r()(),$(),o(44,"button",32),p("click",function(){return m(s),u(i.theme.cycle())}),f(45,Ke,2,0,"svg",33)(46,Ge,2,0,"svg",33),r()()(),f(47,Je,8,5,"div",34)(48,ot,9,6,"div",35)}t&2&&(a(7),c("ngIf",i.totalLabel()),a(2),c("routerLinkActiveOptions",oe(28,Le)),a(7),H("search-nl",i.state.searchMode()==="nl"),a(),c("title",i.searchModeTooltip()),E("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()),E("aria-label",i.viewModeTooltip()),a(),C(" ",i.state.viewMode()==="grouped"?"Grouped":"Flat"," "),a(7),c("title",i.themeLabel()),E("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:[T,I,k,j,he,_e,z,fe,B,R,me,ue],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 rt(n){return n.startsWith("origin/")||n.includes("/origin/")}var Q=class n{http=v(le);base="/api";naturalLanguage(e,t={}){let s=new se().set("q",e).set("page",String(t.page??1)).set("pageSize",String(t.pageSize??100));for(let d of["author","since","until","branch","file"]){let h=t[d];h&&(s=s.set(d,String(h)))}return this.http.get(`${this.base}/search`,{params:s})}static \u0275fac=function(t){return new(t||n)};static \u0275prov=ne({token:n,factory:n.\u0275fac,providedIn:"root"})};function at(n,e){if(n&1&&(o(0,"div",2)(1,"span"),l(2),r()()),n&2){let t=e.ngIf;a(2),b(t)}}function st(n,e){n&1&&(o(0,"div",3),x(1,"span",4),l(2," Loading commits\u2026 "),r())}var U=class n{state=v(S);git=v(Ce);search=v(Q);commitsResp=ve(be(this.state.filters).pipe(ee(200),te(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(Y(h=>(this.state.error.set(this.errorMessage(h)),this.state.loading.set(!1),X(null))))})),{initialValue:null});authorsLoaded=O(!1);constructor(){w(()=>{let e=this.commitsResp();if(!e)return;this.state.commits.set(e.commits),this.state.total.set(e.total),this.state.page.set(e.page),this.state.pageSize.set(e.pageSize),this.state.loading.set(!1);let t=e.parsedQuery;this.state.nlInterpretation.set(t??null),!this.state.selectedHash()&&e.commits.length&&this.state.selectHash(e.commits[0].hash)}),w(()=>{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."}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=M({type:n,selectors:[["app-root"]],decls:6,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&&(x(0,"app-toolbar"),f(1,at,3,1,"div",0),x(2,"router-outlet"),f(3,st,3,0,"div",1),x(4,"app-command-palette")(5,"app-shortcuts-modal")),t&2&&(a(),c("ngIf",i.state.error()),a(2),c("ngIf",i.state.loading()))},dependencies:[T,k,de,Z,q,G],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})};ae(U,Me).catch(n=>console.error(n));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "git-history-ui",
3
- "version": "4.0.0",
3
+ "version": "4.0.1",
4
4
  "description": "Git Intelligence in your browser — natural-language search, PR/feature grouping, time-travel snapshots, file history, blame, commit impact, and an insights dashboard. Optional AI integration (Anthropic / OpenAI).",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- import{$ as u,W as d,g as b,lc as c,mc as v}from"./chunk-OBPR2XVH.js";var O=class g{http=u(v);base="/api";getCommits(t={}){let e=new c;for(let[m,i]of Object.entries(t))i!=null&&i!==""&&(e=e.set(m,String(i)));return this.http.get(`${this.base}/commits`,{params:e})}streamCommits(t={}){return new b(e=>{let m=new URL(`${window.location.origin}${this.base}/commits/stream`);for(let[a,o]of Object.entries(t))o!=null&&o!==""&&m.searchParams.set(a,String(o));let i=new EventSource(m.toString()),n=[],r=[],h=Math.max(1,t.page??1),f=0,s=0,l=!1,C=()=>{s=0,!(!r.length&&!l)&&(r.length&&n.push(...r.splice(0)),e.next({commits:n.slice(),total:l&&f||n.length,page:h,pageSize:n.length||t.pageSize||100,totalPages:1,hasNext:!1,hasPrevious:h>1}),l&&(i.close(),e.complete()))},p=()=>{s||(s=requestAnimationFrame(C))};return i.addEventListener("commit",a=>{r.push(JSON.parse(a.data)),p()}),i.addEventListener("done",a=>{f=JSON.parse(a.data).total??n.length+r.length,l=!0,p()}),i.addEventListener("error",a=>{i.close(),s&&cancelAnimationFrame(s),e.error(a)}),()=>{i.close(),s&&cancelAnimationFrame(s)}})}getCommit(t){return this.http.get(`${this.base}/commit/${t}`)}getDiff(t){return this.http.get(`${this.base}/diff/${t}`)}getBlame(t){let e=new c().set("file",t);return this.http.get(`${this.base}/blame`,{params:e})}getTags(){return this.http.get(`${this.base}/tags`)}getBranches(){return this.http.get(`${this.base}/branches`)}getAuthors(){return this.http.get(`${this.base}/authors`)}static \u0275fac=function(e){return new(e||g)};static \u0275prov=d({token:g,factory:g.\u0275fac,providedIn:"root"})};export{O as a};