git-history-ui 5.0.0 → 5.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 +18 -0
- package/build/frontend/chunk-6DL2ZTKG.js +1 -0
- package/build/frontend/chunk-ACWXPHRR.js +1 -0
- package/build/frontend/{chunk-3E3FVV4X.js → chunk-F6HZ5OVS.js} +1 -1
- package/build/frontend/{chunk-GJRIJIZY.js → chunk-GHSRMAIR.js} +1 -1
- package/build/frontend/chunk-J5ZVP6TN.js +9 -0
- package/build/frontend/chunk-PRY6VAFG.js +1 -0
- package/build/frontend/{chunk-V6G3DEZ6.js → chunk-PXNKNORB.js} +1 -1
- package/build/frontend/chunk-S56XRIZ7.js +9 -0
- package/build/frontend/chunk-STUSEB5P.js +1 -0
- package/build/frontend/chunk-UM7ESEXJ.js +5 -0
- package/build/frontend/chunk-VGAHCEAA.js +1 -0
- package/build/frontend/chunk-XLGWMKXV.js +1 -0
- package/build/frontend/index.html +2 -2
- package/build/frontend/main-W5NQX3FE.js +1 -0
- package/build/frontend/styles-RQGRQK4Z.css +1 -0
- package/dist/backend/annotations.d.ts +9 -1
- package/dist/backend/annotations.d.ts.map +1 -1
- package/dist/backend/annotations.js +84 -9
- package/dist/backend/annotations.js.map +1 -1
- package/dist/backend/breakage.d.ts +70 -0
- package/dist/backend/breakage.d.ts.map +1 -0
- package/dist/backend/breakage.js +235 -0
- package/dist/backend/breakage.js.map +1 -0
- package/dist/backend/cache/sqliteIndex.d.ts +1 -1
- package/dist/backend/cache/sqliteIndex.d.ts.map +1 -1
- package/dist/backend/cache/sqliteIndex.js +36 -23
- package/dist/backend/cache/sqliteIndex.js.map +1 -1
- package/dist/backend/gitService.d.ts +14 -6
- package/dist/backend/gitService.d.ts.map +1 -1
- package/dist/backend/gitService.js +148 -45
- package/dist/backend/gitService.js.map +1 -1
- package/dist/backend/grouping/prGrouping.d.ts.map +1 -1
- package/dist/backend/grouping/prGrouping.js +41 -19
- package/dist/backend/grouping/prGrouping.js.map +1 -1
- package/dist/backend/impact.d.ts +3 -1
- package/dist/backend/impact.d.ts.map +1 -1
- package/dist/backend/impact.js +30 -16
- package/dist/backend/impact.js.map +1 -1
- package/dist/backend/insights.d.ts.map +1 -1
- package/dist/backend/insights.js +8 -3
- package/dist/backend/insights.js.map +1 -1
- package/dist/backend/llm/openaiProvider.d.ts +1 -0
- package/dist/backend/llm/openaiProvider.d.ts.map +1 -1
- package/dist/backend/llm/openaiProvider.js +21 -1
- package/dist/backend/llm/openaiProvider.js.map +1 -1
- package/dist/backend/server.d.ts.map +1 -1
- package/dist/backend/server.js +54 -9
- package/dist/backend/server.js.map +1 -1
- package/dist/backend/snapshot.d.ts +3 -1
- package/dist/backend/snapshot.d.ts.map +1 -1
- package/dist/backend/snapshot.js +14 -9
- package/dist/backend/snapshot.js.map +1 -1
- package/package.json +1 -1
- package/build/frontend/chunk-465Y7ZAS.js +0 -2
- package/build/frontend/chunk-7VJNS7EY.js +0 -1
- package/build/frontend/chunk-GBKH4M7W.js +0 -1
- package/build/frontend/chunk-LRN4ELHN.js +0 -9
- package/build/frontend/chunk-PJETIVS4.js +0 -1
- package/build/frontend/chunk-QH2BEUIU.js +0 -5
- package/build/frontend/chunk-SJJTMQGL.js +0 -1
- package/build/frontend/chunk-TI46NMVL.js +0 -1
- package/build/frontend/chunk-WPYI663L.js +0 -7
- package/build/frontend/main-735KK4CH.js +0 -1
- package/build/frontend/styles-DUWPKHDX.css +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,24 @@ 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
|
+
## [5.0.1] - 2026-05-03
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Breakage analysis endpoints and UI hooks for investigating file-level change
|
|
12
|
+
history.
|
|
13
|
+
- Shared frontend observable caching for commit, timeline, insight, and
|
|
14
|
+
annotation requests.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Timeline `Diff vs HEAD` file modifications now render in a properly sized
|
|
19
|
+
virtual-scroll diff viewer.
|
|
20
|
+
- Shared commit links resolve against the selected repository when the app is
|
|
21
|
+
launched with `--cwd`.
|
|
22
|
+
- Diff parsing, rename handling, and large-repo indexing paths were tightened
|
|
23
|
+
for repository-scale testing.
|
|
24
|
+
|
|
7
25
|
## [5.0.0] - 2026-05-03
|
|
8
26
|
|
|
9
27
|
### Added
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as l,Cc as o,Dc as s,W as m,yc as r,zc as g}from"./chunk-UM7ESEXJ.js";var p=class a{http=l(g);base="/api";cache=new o(100);bundle(t={}){let e=new r;for(let[i,n]of Object.entries(t))n!=null&&(e=e.set(i,String(n)));return this.cache.get(`insights:${e.toString()}`,()=>this.http.get(`${this.base}/insights`,{params:e}),s.VOLATILE)}fileStats(t){let e=new r().set("file",t);return this.cache.get(`file-stats:${t}`,()=>this.http.get(`${this.base}/file-stats`,{params:e}),s.VOLATILE)}impact(t){return this.cache.get(`impact:${t}`,()=>this.http.get(`${this.base}/impact/${t}`),s.IMMUTABLE)}breakage(t,e={}){let i=new r().set("file",t);return e.limit!==void 0&&(i=i.set("limit",String(e.limit))),this.cache.get(`breakage:${i.toString()}`,()=>this.http.get(`${this.base}/breakage`,{params:i}),s.VOLATILE)}summarizeDiff(t){return this.http.post(`${this.base}/summarize-diff`,{text:t})}explainCommit(t){return this.cache.get(`explain:${t}`,()=>this.http.post(`${this.base}/explain-commit/${t}`,{}),s.IMMUTABLE)}invalidate(){this.cache.clear()}static \u0275fac=function(e){return new(e||a)};static \u0275prov=m({token:a,factory:a.\u0275fac,providedIn:"root"})};export{p as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as ot,b as rt,c as ft}from"./chunk-F6HZ5OVS.js";import{a as lt,b as ct,c as mt,d as pt,e as dt}from"./chunk-S56XRIZ7.js";import{a as et,b as tt,c as nt,h as it}from"./chunk-GHSRMAIR.js";import{a as at}from"./chunk-VGAHCEAA.js";import{a as G}from"./chunk-STUSEB5P.js";import{g as gt}from"./chunk-Y6GOUMAT.js";import{b as Je,e as Ze}from"./chunk-PXNKNORB.js";import{a as st}from"./chunk-6DL2ZTKG.js";import{$ as M,Cc as _e,D as Ae,Db as te,Dc as be,Eb as ne,Fb as ie,Gb as he,Hb as J,Ib as W,Jb as Qe,Kb as l,Lb as h,Ma as We,Mb as z,Nb as ue,Oa as pe,Ob as Ue,Qa as a,Qb as De,R as je,Rb as Te,Sb as Fe,T as Ie,Va as qe,W as me,Wb as j,Xb as Ke,Yb as q,Za as L,_b as ve,ab as Ye,cb as v,cc as K,dc as Y,ea as P,fa as k,ga as Ge,lb as de,oa as S,ob as d,pb as s,pc as Q,q as Ee,qb as r,qc as N,rb as b,rc as Z,sa as Be,tc as H,vb as ge,wb as fe,xb as A,yb as w,yc as Xe,zb as x,zc as xe}from"./chunk-UM7ESEXJ.js";var Ce=class i{http=M(xe);base="/api";cache=new _e(200);list(e){return this.cache.get(e,()=>this.http.get(`${this.base}/annotations/${e}`),be.VOLATILE)}add(e,t,n){return this.http.post(`${this.base}/annotations/${e}`,{author:t,body:n}).pipe(Ie(()=>this.cache.invalidate(e)))}remove(e,t){return this.http.delete(`${this.base}/annotations/${e}/${t}`).pipe(Ie(()=>this.cache.invalidate(e)))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=me({token:i,factory:i.\u0275fac,providedIn:"root"})};var vt=["svg"];function xt(i,e){i&1&&(s(0,"div",11),l(1," No graph data \u2014 changed files have no detectable internal imports. "),r())}var ye=class i{impact=null;svgRef;simulation=null;hasData=!1;ngAfterViewInit(){this.render()}ngOnChanges(){this.render()}ngOnDestroy(){this.simulation?.stop()}render(){if(!this.svgRef)return;let e=this.svgRef.nativeElement,t=gt(e);t.selectAll("*").remove();let n=this.impact;if(!n||n.dependencyRipple.length===0&&n.modules.length===0){this.hasData=!1;return}this.hasData=!0;let o=new Map,c=(m,E,V)=>{let R=o.get(m);return R||(R={id:m,group:E,label:V},o.set(m,R)),R};for(let m of n.files)c(`f:${m}`,"changed",Re(m));for(let m of n.modules)c(`m:${m}`,"module",m);for(let m of n.dependencyRipple)c(`f:${m.from}`,"changed",Re(m.from)),c(`f:${m.to}`,"imported",Re(m.to));let g=[];for(let m of n.dependencyRipple)g.push({source:`f:${m.from}`,target:`f:${m.to}`,type:"imports"});for(let m of n.files){let E=Ct(m);n.modules.includes(E)&&g.push({source:`f:${m}`,target:`m:${E}`,type:"in-module"})}let u=Array.from(o.values()),O=e.parentElement?.clientWidth??640,p=u.filter(m=>m.group==="module").sort(Le),f=u.filter(m=>m.group==="changed").sort(Le),_=u.filter(m=>m.group==="imported").sort(Le),C=Math.max(p.length,f.length,_.length,4),T=44,$=58,F={module:68,changed:430,imported:780},I=Math.max(O,F.imported+Math.max(320,_t(_))+80),B=Math.max(360,$+C*T+40);t.attr("width",I).attr("height",B).attr("viewBox",`0 0 ${I} ${B}`),t.append("rect").attr("width",I).attr("height",B).attr("fill","transparent"),t.append("g").selectAll("text").data([{label:"Modules",x:F.module},{label:"Changed files",x:F.changed},{label:"Import dependencies",x:F.imported}]).join("text").attr("class","column-title").attr("x",m=>m.x).attr("y",28).text(m=>m.label),ze(p,F.module,$,T),ze(f,F.changed,$,T),ze(_,F.imported,$,T);let $e=t.append("g").selectAll("path").data(g).join("path").attr("class",m=>`impact-link ${m.type}`).attr("d",m=>{let E=o.get(String(m.source)),V=o.get(String(m.target));return E&&V?bt(E,V):""});t.append("g").selectAll("circle").data(u).join("circle").attr("r",m=>m.group==="module"?7:5).attr("fill",m=>m.group==="changed"?"var(--accent)":m.group==="imported"?"#f59e0b":"#8b5cf6").attr("stroke","var(--bg-surface-2)").attr("stroke-width",1.5).attr("cx",m=>m.x??0).attr("cy",m=>m.y??0).append("title").text(m=>`${m.group}: ${m.id.slice(2)}`);let ce=t.append("g").selectAll("rect").data(u).join("rect").attr("class","label-bg").attr("width",m=>ht(m)).attr("height",18).attr("rx",5).attr("ry",5).attr("x",m=>(m.x??0)+10).attr("y",m=>(m.y??0)-11),y=t.append("g").selectAll("text").data(u).join("text").attr("class",m=>`node-label ${m.group}`).attr("x",m=>(m.x??0)+14).attr("y",m=>(m.y??0)+4).text(m=>m.label);this.simulation?.stop(),this.simulation=null}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-impact-graph"]],viewQuery:function(t,n){if(t&1&&te(vt,7),t&2){let o;ne(o=ie())&&(n.svgRef=o.first)}},inputs:{impact:"impact"},features:[Be],decls:17,vars:1,consts:[["svg",""],[1,"graph-head"],[1,"legend"],[1,"legend-item"],[1,"dot","dot-changed"],[1,"dot","dot-imported"],[1,"dot","dot-module"],[1,"hint"],["tabindex","0",1,"canvas-wrap"],["aria-label","Commit impact graph"],["class","empty",4,"ngIf"],[1,"empty"]],template:function(t,n){t&1&&(s(0,"div",1)(1,"div",2)(2,"span",3),b(3,"span",4),l(4,"changed file"),r(),s(5,"span",3),b(6,"span",5),l(7,"import dependency"),r(),s(8,"span",3),b(9,"span",6),l(10,"module"),r()(),s(11,"span",7),l(12,"Scroll to explore. Lines show module membership and imports."),r()(),s(13,"div",8),Ge(),b(14,"svg",9,0),v(16,xt,2,0,"div",10),r()),t&2&&(a(16),d("ngIf",!n.hasData))},dependencies:[H,N],styles:["[_nghost-%COMP%]{display:block}.graph-head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:.75rem;margin-bottom:.5rem}.legend[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;font-size:11px;color:var(--fg-muted)}.legend-item[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px}.hint[_ngcontent-%COMP%]{flex:0 0 auto;color:var(--fg-subtle);font-size:11px}.dot[_ngcontent-%COMP%]{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px}.dot-changed[_ngcontent-%COMP%]{background:var(--accent)}.dot-imported[_ngcontent-%COMP%]{background:#f59e0b}.dot-module[_ngcontent-%COMP%]{background:#8b5cf6}.canvas-wrap[_ngcontent-%COMP%]{position:relative;max-height:430px;min-height:320px;background:radial-gradient(circle at 20% 0%,color-mix(in oklab,var(--accent) 12%,transparent),transparent 34%),var(--bg-surface-2);border-radius:var(--radius-md);border:1px solid var(--border-soft);overflow:auto;overscroll-behavior:contain}.canvas-wrap[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}svg[_ngcontent-%COMP%]{display:block}.empty[_ngcontent-%COMP%]{position:absolute;inset:0;display:grid;place-items:center;color:var(--fg-muted);font-size:11px;pointer-events:none}[_nghost-%COMP%] .column-title{fill:var(--fg-muted);font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}[_nghost-%COMP%] .node-label{font-size:10px;fill:var(--fg-secondary);font-family:var(--font-mono, monospace);pointer-events:none;paint-order:stroke;stroke:var(--bg-surface-2);stroke-width:3px;stroke-linejoin:round}[_nghost-%COMP%] .node-label.changed{fill:var(--fg-primary);font-weight:700}[_nghost-%COMP%] .label-bg{fill:color-mix(in oklab,var(--bg-surface) 78%,transparent);stroke:var(--border-soft);stroke-width:1px;opacity:.92}[_nghost-%COMP%] .impact-link{fill:none;stroke-linecap:round}[_nghost-%COMP%] .impact-link.imports{stroke:#f59e0b;stroke-width:2.2px;stroke-opacity:.78}[_nghost-%COMP%] .impact-link.in-module{stroke:#8b5cf6;stroke-width:2px;stroke-opacity:.62;stroke-dasharray:5 5}"],changeDetection:0})};function Re(i){let e=i.split("/");return e[e.length-1]}function ht(i){let e=i.label.length;return Math.max(112,Math.min(520,e*6.7+18))}function _t(i){return Math.max(0,...i.map(e=>ht(e)))}function Le(i,e){return i.label.localeCompare(e.label)}function ze(i,e,t,n){for(let[o,c]of i.entries())c.x=e,c.y=t+o*n}function bt(i,e){let t=i.x??0,n=i.y??0,o=e.x??0,c=e.y??0,g=Math.max(72,Math.abs(o-t)*.42),u=o>=t?1:-1;return`M ${t} ${n} C ${t+u*g} ${n}, ${o-u*g} ${c}, ${o} ${c}`}function Ct(i){let e=i.split("/");return e.length===1?"(root)":e.slice(0,Math.min(e.length-1,3)).join("/")}var Me=class i{constructor(e){this.sanitizer=e}cache=new Map;transform(e){if(!e)return"";let t=this.cache.get(e);if(t)return t;let n=this.sanitizer.bypassSecurityTrustHtml(yt(e));if(this.cache.set(e,n),this.cache.size>50){let o=this.cache.keys().next().value;o&&this.cache.delete(o)}return n}static \u0275fac=function(t){return new(t||i)(qe(Je,16))};static \u0275pipe=Ye({name:"markdown",type:i,pure:!0})};function yt(i){let e=Mt(i);return e=e.replace(/```(\w*)\n([\s\S]*?)```/g,(t,n,o)=>`<pre><code>${o.trim()}</code></pre>`),e=e.replace(/`([^`]+)`/g,"<code>$1</code>"),e=e.replace(/^### (.+)$/gm,"<h4>$1</h4>"),e=e.replace(/^## (.+)$/gm,"<h3>$1</h3>"),e=e.replace(/^# (.+)$/gm,"<h2>$1</h2>"),e=e.replace(/\*\*\*(.+?)\*\*\*/g,"<strong><em>$1</em></strong>"),e=e.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),e=e.replace(/\*(.+?)\*/g,"<em>$1</em>"),e=e.replace(/^(\s*)[-*] (.+)$/gm,(t,n,o)=>`<li data-depth="${Math.floor(n.length/2)}">${o}</li>`),e=e.replace(/((?:<li[^>]*>.*<\/li>\n?)+)/g,"<ul>$1</ul>"),e=e.replace(/^\d+\.\s+(.+)$/gm,"<li>$1</li>"),e=e.replace(/((?:<li>.*<\/li>\n?){2,})/g,t=>t.includes("data-depth")?t:`<ol>${t}</ol>`),e=e.replace(/\n{2,}/g,"</p><p>"),e=`<p>${e}</p>`,e=e.replace(/<p>\s*(<(?:h[2-4]|ul|ol|pre|blockquote)[^>]*>)/g,"$1"),e=e.replace(/(<\/(?:h[2-4]|ul|ol|pre|blockquote)>)\s*<\/p>/g,"$1"),e=e.replace(/<p>\s*<\/p>/g,""),e=e.replace(/\n/g,"<br>"),e}function Mt(i){return i.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function wt(i,e){if(i&1&&(s(0,"span",36),l(1),r()),i&2){let t=e.$implicit;a(),h(t)}}function Ot(i,e){if(i&1&&(s(0,"span",37),l(1),r()),i&2){let t=e.$implicit;a(),h(t)}}function Pt(i,e){i&1&&(s(0,"span",38),l(1,"merge"),r())}function kt(i,e){if(i&1&&(s(0,"pre",39),l(1),r()),i&2){let t=x().ngIf;a(),h(t.body)}}function St(i,e){if(i&1){let t=A();s(0,"div",40)(1,"span",41),l(2,"AI"),r(),b(3,"div",42),j(4,"markdown"),s(5,"button",43),w("click",function(){P(t);let o=x(2);return k(o.explanation.set(null))}),l(6,"\xD7"),r()()}if(i&2){let t=e.ngIf;a(3),d("innerHTML",Ke(4,1,t),We)}}function Et(i,e){if(i&1&&(s(0,"div",44),l(1),r()),i&2){let t=e.ngIf;a(),h(t)}}function It(i,e){if(i&1&&(s(0,"li"),l(1),r()),i&2){let t=e.$implicit;a(),h(t)}}function Dt(i,e){if(i&1){let t=A();s(0,"li",28),w("click",function(){let o=P(t).$implicit,c=x(3);return k(c.state.selectHash(o.hash))}),s(1,"code"),l(2),r(),s(3,"span"),l(4),r()()}if(i&2){let t=e.$implicit;a(2),h(t.hash.slice(0,7)),a(2),h(t.subject)}}function Tt(i,e){if(i&1&&(s(0,"div",45)(1,"div",46)(2,"span"),l(3,"Impact"),r(),s(4,"span",47),l(5),r()(),b(6,"app-impact-graph",48),s(7,"div",49)(8,"div")(9,"h4"),l(10,"Modules"),r(),s(11,"ul",50),v(12,It,2,1,"li",51),r()(),s(13,"div")(14,"h4"),l(15,"Related commits"),r(),s(16,"ul",52),v(17,Dt,5,2,"li",53),r()()()()),i&2){let t=e.ngIf;a(5),Ue(" ",t.files.length," files \xB7 ",t.modules.length," modules \xB7 ",t.relatedCommits.length," related commits "),a(),d("impact",t),a(6),d("ngForOf",t.modules),a(5),d("ngForOf",t.relatedCommits)}}function Ft(i,e){if(i&1&&(s(0,"span",54),l(1),r()),i&2){let t=x(2);a(),h(t.files().length)}}function Rt(i,e){if(i&1&&(s(0,"span",64),l(1),r()),i&2){let t=x().$implicit;a(),z("+",t.additions)}}function Lt(i,e){if(i&1&&(s(0,"span",65),l(1),r()),i&2){let t=x().$implicit;a(),z("\u2212",t.deletions)}}function zt(i,e){if(i&1){let t=A();s(0,"div",55)(1,"button",56),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.selectFile(o))}),b(2,"span",57),s(3,"span",58),l(4),r(),s(5,"span",59),v(6,Rt,2,1,"span",60)(7,Lt,2,1,"span",61),r()(),s(8,"button",62),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.openFileHistory(o.file))}),l(9," \u23F1 "),r(),s(10,"button",63),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.openFileBreakage(o.file))}),l(11," \u26A0 "),r()()}if(i&2){let t,n=e.$implicit,o=x(2);a(),W("selected",n.file===((t=o.activeFile())==null?null:t.file)),a(),de("data-status",n.status),a(),d("title",n.file),a(),h(n.file),a(2),d("ngIf",n.additions),a(),d("ngIf",n.deletions)}}function Nt(i,e){i&1&&(s(0,"div",66),l(1,"No files changed."),r())}function Ht(i,e){i&1&&(s(0,"div",66),l(1,"Loading\u2026"),r())}function $t(i,e){if(i&1){let t=A();s(0,"div",67)(1,"div",68)(2,"strong"),l(3),r(),s(4,"span",69),l(5),j(6,"date"),r(),s(7,"button",70),w("click",function(){let o=P(t).$implicit,c=x(2);return k(c.deleteComment(o.id))}),l(8," \xD7 "),r()(),s(9,"p",71),l(10),r()()}if(i&2){let t=e.$implicit;a(3),h(t.author),a(2),h(q(6,3,t.createdAt,"short")),a(5),h(t.body)}}function Vt(i,e){if(i&1){let t=A();ge(0),s(1,"header",2)(2,"div",3)(3,"span",4),l(4),r(),s(5,"span",5),v(6,wt,2,1,"span",6)(7,Ot,2,1,"span",7)(8,Pt,2,0,"span",8),r()(),s(9,"h2",9),l(10),r(),s(11,"div",10)(12,"span"),l(13),r(),s(14,"span",11),l(15,"\u2022"),r(),s(16,"span"),l(17),j(18,"date"),r()(),v(19,kt,2,1,"pre",12),s(20,"div",13)(21,"button",14),w("click",function(){P(t);let o=x();return k(o.onExplain())}),l(22),r(),s(23,"button",14),w("click",function(){P(t);let o=x();return k(o.onLoadImpact())}),l(24),r(),s(25,"button",15),w("click",function(){P(t);let o=x();return k(o.copyShareLink())}),l(26),r()(),v(27,St,7,3,"div",16)(28,Et,2,1,"div",17),r(),v(29,Tt,18,6,"div",18),s(30,"div",19)(31,"aside",20)(32,"div",21)(33,"span"),l(34,"Files"),r(),v(35,Ft,2,1,"span",22),r(),s(36,"div",23),v(37,zt,12,7,"div",24)(38,Nt,2,0,"div",25)(39,Ht,2,0,"div",25),r()(),s(40,"section",26)(41,"details",27)(42,"summary",28),w("click",function(o){P(t);let c=x();return k(c.toggleAnnotations(o))}),l(43),r(),s(44,"div",29),v(45,$t,11,6,"div",30),s(46,"div",31)(47,"input",32),Fe("ngModelChange",function(o){P(t);let c=x();return Te(c.commentAuthor,o)||(c.commentAuthor=o),k(o)}),r(),s(48,"textarea",33),Fe("ngModelChange",function(o){P(t);let c=x();return Te(c.commentDraft,o)||(c.commentDraft=o),k(o)}),r(),s(49,"button",34),w("click",function(){P(t);let o=x();return k(o.addComment())}),l(50," Post "),r()()()(),b(51,"app-diff-viewer",35),r()(),fe()}if(i&2){let t=e.ngIf,n=x();a(4),h(t.shortHash),a(2),d("ngForOf",t.tags),a(),d("ngForOf",t.branches),a(),d("ngIf",t.isMerge),a(2),h(t.subject),a(3),ue("",t.author," <",t.authorEmail,">"),a(4),h(q(18,29,t.date,"medium")),a(2),d("ngIf",t.body),a(2),d("disabled",n.explaining()),a(),z(" ",n.explaining()?"...":"\u2728 Explain change"," "),a(),d("disabled",n.loadingImpact()),a(),z(" ",n.loadingImpact()?"...":n.impact()?"Refresh impact":"Show impact"," "),a(2),z(" ",n.shareCopied()?"Copied!":"\u{1F517} Share"," "),a(),d("ngIf",n.explanation()),a(),d("ngIf",n.explainError()),a(),d("ngIf",n.impact()),a(6),d("ngIf",n.files().length),a(2),d("ngForOf",n.files())("ngForTrackBy",n.trackByFile),a(),d("ngIf",!n.files().length&&!n.loading()),a(),d("ngIf",n.loading()),a(2),d("open",n.annotationsOpen()),a(2),z(" \u{1F4AC} Notes (",n.comments().length,") "),a(2),d("ngForOf",n.comments()),a(2),De("ngModel",n.commentAuthor),a(),De("ngModel",n.commentDraft),a(),d("disabled",!n.commentDraft.trim()),a(2),d("fileInput",n.activeFile())}}function At(i,e){i&1&&(s(0,"div",72)(1,"p",73),l(2,"No commit selected"),r(),s(3,"p",74),l(4," Pick a commit from the list, or press "),s(5,"kbd",75),l(6,"\u2318K"),r(),l(7," to open the command palette. "),r()())}var we=class i{state=M(G);git=M(at);insightsApi=M(st);annotationsApi=M(Ce);router=M(Ze);commit=this.state.selected;impact=S(null);loadingImpact=S(!1);explanation=S(null);explainError=S(null);explaining=S(!1);comments=S([]);annotationsOpen=S(!1);shareCopied=S(!1);commentDraft="";commentAuthor="me";loading=S(!1);files=rt(ot(this.commit).pipe(je(e=>e?(this.loading.set(!0),this.git.getDiff(e.hash).pipe(Ae(()=>Ee([])))):(this.loading.set(!1),Ee([])))),{initialValue:[]});activeFileIndex=S(0);activeFile=K(()=>{let e=this.files();if(!e.length)return null;let t=Math.min(this.activeFileIndex(),e.length-1);return e[t]});constructor(){Y(()=>{this.files(),this.activeFileIndex.set(0),this.loading.set(!1)}),Y(()=>{let e=this.commit();if(this.impact.set(null),this.explanation.set(null),this.explainError.set(null),this.shareCopied.set(!1),!e){this.comments.set([]);return}this.annotationsApi.list(e.hash).subscribe({next:t=>this.comments.set(t),error:()=>this.comments.set([])})})}trackByFile(e,t){return t.file}selectFile(e){let t=this.files().findIndex(n=>n.file===e.file);t>=0&&this.activeFileIndex.set(t)}openFileHistory(e){this.router.navigate(["/file",encodeURIComponent(e)])}openFileBreakage(e){this.router.navigate(["/file",encodeURIComponent(e)],{queryParams:{tab:"breakage"}})}shortPath(e){if(e.length<=32)return e;let t=e.split("/");return t.length<=2?e:t[0]+"/.../"+t.slice(-2).join("/")}onLoadImpact(){let e=this.commit();e&&(this.loadingImpact.set(!0),this.insightsApi.impact(e.hash).subscribe({next:t=>{this.impact.set(t),this.loadingImpact.set(!1)},error:()=>this.loadingImpact.set(!1)}))}onExplain(){let e=this.commit();!e||this.explaining()||(this.explaining.set(!0),this.explainError.set(null),this.insightsApi.explainCommit(e.hash).subscribe({next:t=>{this.explanation.set(t.summary),this.explaining.set(!1)},error:t=>{this.explainError.set(t?.error?.error??"AI explanation unavailable. Set ANTHROPIC_API_KEY or OPENAI_API_KEY."),this.explaining.set(!1)}}))}copyShareLink(){let e=this.commit();if(!e)return;let t=`${window.location.origin}/?commit=${e.hash}`;navigator.clipboard?.writeText(t).then(()=>{this.shareCopied.set(!0),setTimeout(()=>this.shareCopied.set(!1),1500)}).catch(()=>{this.shareCopied.set(!1)})}toggleAnnotations(e){setTimeout(()=>this.annotationsOpen.set(!this.annotationsOpen()),0)}addComment(){let e=this.commit();!e||!this.commentDraft.trim()||this.annotationsApi.add(e.hash,this.commentAuthor||"anonymous",this.commentDraft.trim()).subscribe({next:t=>{this.comments.set([...this.comments(),t]),this.commentDraft=""}})}deleteComment(e){let t=this.commit();t&&this.annotationsApi.remove(t.hash,e).subscribe({next:()=>this.comments.set(this.comments().filter(n=>n.id!==e))})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-commit-detail"]],decls:3,vars:2,consts:[["empty",""],[4,"ngIf","ngIfElse"],[1,"head"],[1,"row"],[1,"hash"],[1,"badges"],["class","badge tag",4,"ngFor","ngForOf"],["class","badge branch",4,"ngFor","ngForOf"],["class","badge merge",4,"ngIf"],[1,"subject"],[1,"meta"],[1,"dot"],["class","body",4,"ngIf"],[1,"actions"],[1,"btn","btn-ghost","btn-sm",3,"click","disabled"],[1,"btn","btn-ghost","btn-sm",3,"click"],["class","ai-card",4,"ngIf"],["class","ai-card error",4,"ngIf"],["class","impact-card",4,"ngIf"],[1,"split"],[1,"files"],[1,"files-header"],["class","count",4,"ngIf"],[1,"files-list"],["class","file-row",4,"ngFor","ngForOf","ngForTrackBy"],["class","files-empty",4,"ngIf"],[1,"diff"],[1,"annotations",3,"open"],[3,"click"],[1,"annot-body"],["class","comment",4,"ngFor","ngForOf"],[1,"comment-form"],["placeholder","Your name",1,"input",3,"ngModelChange","ngModel"],["placeholder","Add a note for your team\u2026",1,"input",3,"ngModelChange","ngModel"],[1,"btn",3,"click","disabled"],[3,"fileInput"],[1,"badge","tag"],[1,"badge","branch"],[1,"badge","merge"],[1,"body"],[1,"ai-card"],[1,"ai-pill"],[1,"ai-text",3,"innerHTML"],[1,"btn","btn-ghost","btn-icon","close",3,"click"],[1,"ai-card","error"],[1,"impact-card"],[1,"impact-head"],[1,"impact-meta"],[3,"impact"],[1,"impact-body"],[1,"modules"],[4,"ngFor","ngForOf"],[1,"related"],[3,"click",4,"ngFor","ngForOf"],[1,"count"],[1,"file-row"],[1,"file",3,"click"],[1,"status-dot"],[1,"path",3,"title"],[1,"counts"],["class","add",4,"ngIf"],["class","del",4,"ngIf"],["title","View file history",1,"file-history",3,"click"],["title","Why did this break? Open breakage analysis","aria-label","Open breakage analysis for this file",1,"file-history","breakage",3,"click"],[1,"add"],[1,"del"],[1,"files-empty"],[1,"comment"],[1,"comment-head"],[1,"comment-date"],["title","Delete",1,"btn","btn-ghost","btn-icon",3,"click"],[1,"comment-body"],[1,"placeholder"],[1,"title"],[1,"hint"],[1,"kbd"]],template:function(t,n){if(t&1&&v(0,Vt,52,32,"ng-container",1)(1,At,8,0,"ng-template",null,0,ve),t&2){let o=he(2);d("ngIf",n.commit())("ngIfElse",o)}},dependencies:[H,Q,N,it,et,tt,nt,dt,ye,Z,Me],styles:['[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;min-height:0;background:transparent}.head[_ngcontent-%COMP%]{position:sticky;top:0;z-index:3;padding:.9rem 1rem .8rem;border-bottom:1px solid var(--border-soft);background:color-mix(in oklab,var(--bg-glass) 95%,transparent);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-bottom:.4rem}.hash[_ngcontent-%COMP%]{font-family:var(--font-mono);font-size:12px;color:var(--fg-muted);padding:2px 6px;background:color-mix(in oklab,var(--bg-surface-2) 78%,transparent);border:1px solid var(--border-soft);border-radius:999px}.badges[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:4px;max-height:44px;overflow:hidden}.badge[_ngcontent-%COMP%]{font-size:10px;font-weight:600;padding:2px 7px;border-radius:999px;border:1px solid transparent;max-width:180px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.badge.tag[_ngcontent-%COMP%]{background:#d9770626;color:var(--warning);border-color:color-mix(in oklab,var(--warning) 24%,transparent)}.badge.branch[_ngcontent-%COMP%]{background:var(--accent-soft);color:var(--accent);border-color:color-mix(in oklab,var(--accent) 24%,transparent)}.badge.merge[_ngcontent-%COMP%]{background:#8b5cf62e;color:#8b5cf6}.subject[_ngcontent-%COMP%]{font-size:clamp(17px,1.6vw,22px);margin:0 0 4px;font-weight:600}.meta[_ngcontent-%COMP%]{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--fg-muted)}.meta[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{opacity:.5}.body[_ngcontent-%COMP%]{white-space:pre-wrap;font-family:var(--font-mono);font-size:12px;color:var(--fg-secondary);background:var(--bg-surface-2);border:1px solid var(--border-soft);border-radius:var(--radius-sm);padding:.5rem .75rem;margin-top:.5rem;max-height:160px;overflow:auto}.split[_ngcontent-%COMP%]{flex:1;display:grid;grid-template-columns:minmax(240px,300px) minmax(0,1fr);grid-template-rows:minmax(0,1fr);gap:.75rem;padding:.75rem;min-height:0;overflow:hidden}.files[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-height:0;background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden}.files-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:.6rem .85rem;font-size:12px;color:var(--fg-muted);border-bottom:1px solid var(--border-soft);background:color-mix(in oklab,var(--bg-surface) 82%,transparent)}.count[_ngcontent-%COMP%]{background:var(--bg-surface-2);padding:0 6px;border-radius:999px;font-size:11px}.files-list[_ngcontent-%COMP%]{overflow:auto;flex:1;min-height:0}.file[_ngcontent-%COMP%]{display:grid;grid-template-columns:10px 1fr auto;gap:.5rem;align-items:center;width:100%;padding:.5rem .75rem;border:0;background:transparent;color:inherit;cursor:pointer;text-align:left;border-bottom:1px solid var(--border-soft);font-size:12px}.file[_ngcontent-%COMP%]:hover{background:color-mix(in oklab,var(--bg-hover) 74%,transparent)}.file.selected[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 15%,transparent);box-shadow:inset 3px 0 0 var(--accent)}.file[_ngcontent-%COMP%] .path[_ngcontent-%COMP%]{font-family:var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;direction:rtl;text-align:left}.status-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;background:var(--accent)}.status-dot[data-status=added][_ngcontent-%COMP%]{background:var(--success)}.status-dot[data-status=deleted][_ngcontent-%COMP%]{background:var(--danger)}.status-dot[data-status=renamed][_ngcontent-%COMP%], .status-dot[data-status=copied][_ngcontent-%COMP%]{background:var(--warning)}.status-dot[data-status=binary][_ngcontent-%COMP%]{background:var(--fg-muted)}.counts[_ngcontent-%COMP%]{display:flex;gap:6px;font-family:var(--font-mono);font-size:11px}.counts[_ngcontent-%COMP%] .add[_ngcontent-%COMP%]{color:var(--success)}.counts[_ngcontent-%COMP%] .del[_ngcontent-%COMP%]{color:var(--danger)}.files-empty[_ngcontent-%COMP%]{padding:1rem;color:var(--fg-muted);font-size:12px;text-align:center}.diff[_ngcontent-%COMP%]{min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;border-radius:var(--radius-md);background:var(--bg-panel);border:1px solid var(--border-soft);box-shadow:var(--shadow-sm)}.placeholder[_ngcontent-%COMP%]{flex:1;display:grid;place-items:center;text-align:center;color:var(--fg-muted)}.placeholder[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-size:16px;margin-bottom:4px;color:var(--fg-secondary)}.placeholder[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%]{font-size:13px}.actions[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.6rem}.btn-sm[_ngcontent-%COMP%]{font-size:11px;padding:.3rem .65rem}.ai-card[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:.5rem;padding:.55rem .75rem;margin-top:.5rem;background:color-mix(in oklab,var(--accent) 12%,transparent);border-radius:var(--radius-sm);font-size:12px;color:var(--fg-secondary);max-height:min(280px,32vh);overflow:hidden}.ai-card.error[_ngcontent-%COMP%]{background:#ef44441f;color:var(--danger)}.ai-pill[_ngcontent-%COMP%]{flex-shrink:0;font-size:10px;font-weight:700;letter-spacing:.04em;background:var(--accent);color:var(--accent-fg);padding:1px 5px;border-radius:4px}.ai-text[_ngcontent-%COMP%]{flex:1;min-width:0;min-height:0;max-height:calc(min(280px,32vh) - 1.1rem);line-height:1.6;font-size:.85rem;overflow-y:auto;overflow-x:hidden;padding-right:.45rem;overscroll-behavior:contain;scrollbar-gutter:stable}.ai-text[_ngcontent-%COMP%]::-webkit-scrollbar{width:8px}.ai-text[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:transparent}.ai-text[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:color-mix(in oklab,var(--accent) 40%,transparent);border-radius:999px}.ai-text[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .ai-text[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], .ai-text[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:.6rem 0 .3rem;font-size:.9rem;font-weight:600;color:var(--text-primary, #e2e8f0)}.ai-text[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:1rem}.ai-text[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:.25rem 0}.ai-text[_ngcontent-%COMP%] ul[_ngcontent-%COMP%], .ai-text[_ngcontent-%COMP%] ol[_ngcontent-%COMP%]{margin:.3rem 0;padding-left:1.4rem}.ai-text[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{margin:.15rem 0}.ai-text[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:#8b5cf626;padding:1px 5px;border-radius:3px;font-size:.82em;font-family:var(--font-mono, "JetBrains Mono", monospace)}.ai-text[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{background:#00000040;padding:.5rem .75rem;border-radius:6px;overflow-x:auto;margin:.4rem 0}.ai-text[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:none;padding:0}.ai-text[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-primary, #e2e8f0)}.ai-card[_ngcontent-%COMP%] .close[_ngcontent-%COMP%]{flex-shrink:0;font-size:14px;line-height:1;padding:0 6px}.impact-card[_ngcontent-%COMP%]{margin:.6rem 1rem;background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);padding:.75rem 1rem;box-shadow:var(--shadow-sm)}.impact-head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;font-weight:600;margin-bottom:.5rem;font-size:13px}.impact-meta[_ngcontent-%COMP%]{color:var(--fg-muted);font-weight:400;font-size:11px}.impact-body[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:.75rem;font-size:12px}.impact-body[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:0 0 .4rem;font-size:11px;color:var(--fg-muted);text-transform:uppercase;letter-spacing:.04em}.impact-body[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0}.impact-body[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{padding:2px 0;word-break:break-all}.modules[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace)}.ripple[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-secondary)}.related[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{cursor:pointer;display:flex;gap:.4rem}.related[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover{color:var(--accent)}.related[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);color:var(--fg-muted);flex-shrink:0}.impact-body[_ngcontent-%COMP%] .muted[_ngcontent-%COMP%]{color:var(--fg-muted);font-style:italic;margin:0;font-size:11px}.file-row[_ngcontent-%COMP%]{display:flex}.file-row[_ngcontent-%COMP%] .file[_ngcontent-%COMP%]{flex:1}.file-history[_ngcontent-%COMP%]{background:transparent;border:0;border-bottom:1px solid var(--border-soft);cursor:pointer;color:var(--fg-muted);padding:0 .6rem;font-size:12px}.file-history[_ngcontent-%COMP%]:hover{background:var(--bg-elevated);color:var(--accent)}.file-history.breakage[_ngcontent-%COMP%]:hover{color:var(--danger, #dc2626)}.annotations[_ngcontent-%COMP%]{margin:.5rem;background:var(--bg-surface);border:1px solid var(--border-soft);border-radius:var(--radius-sm)}.annotations[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{padding:.4rem .7rem;cursor:pointer;font-size:12px;color:var(--fg-secondary);-webkit-user-select:none;user-select:none}.annotations[open][_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{border-bottom:1px solid var(--border-soft)}.annot-body[_ngcontent-%COMP%]{padding:.5rem .7rem}.comment[_ngcontent-%COMP%]{padding:.4rem 0;border-bottom:1px dashed var(--border-soft);font-size:12px}.comment[_ngcontent-%COMP%]:last-of-type{border-bottom:0}.comment-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem}.comment-date[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px;flex:1}.comment-body[_ngcontent-%COMP%]{margin:.2rem 0 0;line-height:1.4;white-space:pre-wrap}.comment-form[_ngcontent-%COMP%]{display:flex;gap:.4rem;flex-direction:column;margin-top:.5rem}.comment-form[_ngcontent-%COMP%] .input[_ngcontent-%COMP%]{width:100%;padding:.35rem .5rem;background:var(--bg-app);border:1px solid var(--border-soft);border-radius:var(--radius-sm);color:var(--fg-primary);font-family:inherit;font-size:12px}.comment-form[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{min-height:60px;resize:vertical}.comment-form[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]{align-self:flex-end}'],changeDetection:0})};var jt=["canvas"],Gt=["scroll"];function Bt(i,e){if(i&1&&b(0,"span",12),i&2){let t=e.$implicit;J("background",t)}}function Wt(i,e){i&1&&(s(0,"span",19),l(1,"merge"),r())}function qt(i,e){if(i&1&&(s(0,"div",20),l(1),r()),i&2){let t=x().ngIf;a(),h(t.refs)}}function Yt(i,e){if(i&1&&(s(0,"div",13)(1,"div",14)(2,"code"),l(3),r(),v(4,Wt,2,0,"span",15),r(),s(5,"div",16),l(6),r(),s(7,"div",17)(8,"span"),l(9),r(),s(10,"span"),l(11),j(12,"date"),r()(),v(13,qt,2,1,"div",18),r()),i&2){let t=e.ngIf;J("left",t.x,"px")("top",t.y,"px"),a(3),h(t.shortHash),a(),d("ngIf",t.isMerge),a(2),h(t.subject),a(3),h(t.author),a(2),h(q(12,10,t.date,"MMM d, y, h:mm a")),a(2),d("ngIf",t.refs)}}function Qt(i,e){i&1&&(s(0,"div",21),l(1," No commits to draw. "),r())}var D=34,ae=24,Ne=5.5,se=16,le=16,He=["#4f46e5","#06b6d4","#f59e0b","#ef4444","#10b981","#8b5cf6","#ec4899","#0ea5e9"],Oe=class i{state=M(G);theme=M(ft);legendColors=He.slice(0,5);graphSummary=K(()=>{let e=this.state.commits().length,t=this.laneCount;return e?`${e.toLocaleString()} commits across ${t} lane${t===1?"":"s"}`:"Swim-lane visualization"});contentHeight=K(()=>{let e=this.state.commits().length;return e?le*2+e*D:0});canvasRef;scrollRef;nodes=[];rowByHash=new Map;laneCount=1;hoverRow=-1;hoverTip=S(null);layoutToken=0;idleHandle=null;canvasSize={width:0,height:0,dpr:0};canvasTransform="";cachedTheme=null;onCanvasClick=e=>this.onClick(e);onCanvasMove=e=>this.onMouseMove(e);onCanvasLeave=()=>this.onMouseLeave();scrollRaf=0;onScroll=()=>{this.scrollRaf||(this.scrollRaf=requestAnimationFrame(()=>{this.scrollRaf=0,this.draw()}))};constructor(){Y(()=>{this.scheduleLayout(this.state.commits())}),Y(()=>{this.state.selectedHash(),this.draw()}),Y(()=>{this.theme.resolved(),this.cachedTheme=null,this.draw()})}ngAfterViewInit(){let e=this.canvasRef.nativeElement;e.addEventListener("click",this.onCanvasClick),e.addEventListener("mousemove",this.onCanvasMove),e.addEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.addEventListener("scroll",this.onScroll,{passive:!0}),this.draw()}ngOnDestroy(){let e=this.canvasRef?.nativeElement;e?.removeEventListener("click",this.onCanvasClick),e?.removeEventListener("mousemove",this.onCanvasMove),e?.removeEventListener("mouseleave",this.onCanvasLeave),this.scrollRef?.nativeElement.removeEventListener("scroll",this.onScroll),this.scrollRaf&&cancelAnimationFrame(this.scrollRaf),this.cancelIdleLayout()}onResize(){this.draw()}scheduleLayout(e){let t=++this.layoutToken;if(this.cancelIdleLayout(),this.nodes=[],this.rowByHash.clear(),this.hoverRow=-1,this.hoverTip.set(null),!e.length){this.laneCount=1,this.draw();return}let n=[],o=new Map,c=(f,_)=>{let C=n[f];C&&o.delete(C),n[f]=_,_&&o.set(_,f)},g=f=>{let _=o.get(f);if(_!==void 0)return _;let C=n.indexOf(null);return C>=0?(c(C,f),C):(c(n.length,f),n.length-1)},u=f=>{let _=e[f],C=g(_.hash),T={commit:_,row:f,lane:C};this.nodes.push(T),this.rowByHash.set(_.hash,T);let[$,...F]=_.parents;c(C,$??null);for(let I of F)if(!o.has(I)){let B=n.indexOf(null);B>=0?c(B,I):c(n.length,I)}for(;n.length&&n[n.length-1]===null;)n.pop();C+1>this.laneCount&&(this.laneCount=C+1)};if(this.laneCount=1,e.length<=5e3){for(let f=0;f<e.length;f++)u(f);this.draw();return}let O=0,p=f=>{if(t!==this.layoutToken)return;let _=performance.now();for(;O<e.length;){u(O++);let C=f?.timeRemaining?.()??0;if(O%250===0&&C<=1&&performance.now()-_>8)break}this.draw(),O<e.length&&t===this.layoutToken&&(this.idleHandle=this.requestIdle(p))};this.idleHandle=this.requestIdle(p)}draw(){let e=this.canvasRef?.nativeElement;if(!e)return;let t=this.scrollRef?.nativeElement,n=window.devicePixelRatio||1,o=t?.scrollTop??0,c=t?.clientHeight??0,g=Math.max(t?.clientWidth??se*2+ae,se*2+ae),u=Math.max(c||D*8,D);this.ensureCanvasSize(e,g,u,n);let O=`translateY(${o}px)`;this.canvasTransform!==O&&(this.canvasTransform=O,e.style.transform=O);let p=e.getContext("2d"),f=this.cachedTheme??(this.cachedTheme=this.readTheme(e));if(p.setTransform(n,0,0,n,0,-o*n),p.clearRect(0,o,g,u),p.fillStyle=f.surface,p.fillRect(0,o,g,u),!this.nodes.length)return;let _=this.laneStep(g),C=this.nodeRadius(_),T=y=>this.xOfLane(y,g,_),$=y=>le+y*D+D/2,F=y=>He[y%He.length],I=this.state.selectedHash(),B=D*4,$e=Math.max(0,Math.floor((o-le-B)/D)),Ve=Math.min(this.nodes.length-1,Math.ceil((o+u-le+B)/D)),ce=this.nodes.slice($e,Ve+1);this.drawRows(p,g,T,$,C,f,I,ce),this.drawGuides(p,o,u,f),p.lineCap="round",p.lineJoin="round";for(let y of ce)for(let m of y.commit.parents){let E=this.rowByHash.get(m);if(!E)continue;let V=T(y.lane),R=$(y.row),ee=T(E.lane),X=$(E.row);p.strokeStyle=f.shadow,p.lineWidth=4,p.globalAlpha=.35,this.drawEdge(p,V,R,ee,X),p.strokeStyle=F(E.lane),p.lineWidth=y.commit.isMerge?2.6:2.2,p.globalAlpha=I&&I!==y.commit.hash&&I!==E.commit.hash?.55:.9,this.drawEdge(p,V,R,ee,X),p.globalAlpha=1}for(let y of ce){let m=T(y.lane),E=$(y.row),V=F(y.lane),R=y.commit.hash===I,ee=y.row===this.hoverRow,X=R?C+2:ee?C+1:C;p.beginPath(),p.arc(m,E,X+3,0,Math.PI*2),p.fillStyle=f.nodeRing,p.fill(),p.beginPath(),p.arc(m,E,X,0,Math.PI*2),p.fillStyle=y.commit.isMerge?f.surface:V,p.fill(),p.lineWidth=y.commit.isMerge||R?2.5:1.75,p.strokeStyle=V,p.stroke(),(R||ee)&&(p.beginPath(),p.arc(m,E,X+5,0,Math.PI*2),p.strokeStyle=V,p.globalAlpha=R?.42:.24,p.lineWidth=2,p.stroke(),p.globalAlpha=1)}}drawRows(e,t,n,o,c,g,u,O=this.nodes){for(let p of O){let f=o(p.row)-D/2;if(p.row%2===1&&(e.fillStyle=g.rowAlt,e.fillRect(0,f,t,D)),(p.row===this.hoverRow||p.commit.hash===u)&&(e.fillStyle=p.commit.hash===u?g.rowSelected:g.rowHover,this.roundRect(e,6,f+3,t-12,D-6,8),e.fill()),p.commit.branches.length||p.commit.tags.length){let _=n(p.lane)+c+8;this.drawRefPill(e,_,o(p.row),p.commit,g)}}}drawGuides(e,t,n,o){e.save(),e.strokeStyle=o.guide,e.lineWidth=1,e.setLineDash([3,5]);let c=t,g=t+n,u=e.canvas.clientWidth,O=this.laneStep(u);for(let p=0;p<this.laneCount;p++){let f=this.xOfLane(p,u,O);e.beginPath(),e.moveTo(f,c),e.lineTo(f,g),e.stroke()}e.restore()}ensureCanvasSize(e,t,n,o){let c=Math.floor(t*o),g=Math.floor(n*o);this.canvasSize.width===c&&this.canvasSize.height===g&&this.canvasSize.dpr===o||(this.canvasSize={width:c,height:g,dpr:o},e.width=c,e.height=g,e.style.width=`${t}px`,e.style.height=`${n}px`)}laneStep(e){if(this.laneCount<=1)return ae;let t=Math.max(1,e-se*2-Ne*2);return Math.min(ae,t/(this.laneCount-1))}nodeRadius(e){return Math.max(2,Math.min(Ne,e/2-.5))}xOfLane(e,t,n){if(this.laneCount<=1)return Math.min(t/2,se+ae/2);let o=(this.laneCount-1)*n;return Math.max(se+Ne,(t-o)/2)+e*n}requestIdle(e){let t=window.requestIdleCallback;return t?t(e,{timeout:100}):window.setTimeout(()=>e(),16)}cancelIdleLayout(){this.idleHandle!==null&&(window.cancelIdleCallback?window.cancelIdleCallback(this.idleHandle):clearTimeout(this.idleHandle),this.idleHandle=null)}drawEdge(e,t,n,o,c){if(e.beginPath(),e.moveTo(t,n),t===o)e.lineTo(o,c);else{let g=n+Math.min(D*.75,Math.max(12,(c-n)*.36));e.bezierCurveTo(t,g,o,g,o,c)}e.stroke()}drawRefPill(e,t,n,o,c){let g=o.tags[0]??o.branches.find(_=>!Ut(_));if(!g)return;let u=Math.max(0,e.canvas.clientWidth-t-8);if(u<28)return;let O=Kt(g,u>72?12:8);e.font="600 10px ui-sans-serif, system-ui, sans-serif";let p=Math.min(u,72,e.measureText(O).width+14),f=18;e.fillStyle=o.tags.length?c.warningSoft:c.accentSoft,this.roundRect(e,t,n-f/2,p,f,999),e.fill(),e.fillStyle=o.tags.length?c.warning:c.accent,e.fillText(O,t+7,n+3.5)}onClick(e){let t=this.nodeFromEvent(e);t&&this.state.selectHash(t.commit.hash)}onMouseMove(e){let t=this.nodeFromEvent(e),n=t?.row??-1;n!==this.hoverRow&&(this.hoverRow=n,this.canvasRef.nativeElement.style.cursor=t?"pointer":"default",this.draw()),this.hoverTip.set(t?this.tipFromEvent(e,t):null)}tipFromEvent(e,t){let n=this.scrollRef.nativeElement,o=n.getBoundingClientRect(),c=Math.min(280,Math.max(180,o.width-24)),g=e.clientX-o.left,u=e.clientY-o.top,O=Math.max(12,Math.min(g+14,o.width-c-12)),p=n.scrollTop+Math.max(12,Math.min(u+14,o.height-128)),f=t.commit;return{x:O,y:p,subject:f.subject,shortHash:f.shortHash,author:f.author,date:f.date,refs:[...f.tags,...f.branches].join(", "),isMerge:f.isMerge}}onMouseLeave(){this.hoverRow!==-1&&(this.hoverRow=-1,this.hoverTip.set(null),this.canvasRef.nativeElement.style.cursor="default",this.draw())}nodeFromEvent(e){let t=this.scrollRef?.nativeElement,n=t?.getBoundingClientRect();if(!n)return;let o=e.clientY-n.top+(t?.scrollTop??0),c=Math.floor((o-le)/D);return this.nodes[c]}readTheme(e){let t=getComputedStyle(e);return{accent:this.css(t,"--accent","#4f46e5"),accentSoft:this.css(t,"--accent-soft","#eef2ff"),guide:this.css(t,"--graph-guide","rgba(148, 163, 184, 0.28)"),nodeRing:this.css(t,"--graph-node-ring","#ffffff"),rowAlt:this.css(t,"--graph-row-alt","rgba(15, 23, 42, 0.025)"),rowHover:this.css(t,"--graph-row-hover","rgba(79, 70, 229, 0.08)"),rowSelected:this.css(t,"--graph-row-selected","rgba(79, 70, 229, 0.14)"),shadow:this.css(t,"--graph-shadow","rgba(15, 23, 42, 0.12)"),surface:this.css(t,"--bg-panel","#ffffff"),warning:this.css(t,"--warning","#d97706"),warningSoft:"rgba(217, 119, 6, 0.15)"}}css(e,t,n){return e.getPropertyValue(t).trim()||n}roundRect(e,t,n,o,c,g){let u=Math.min(g,o/2,c/2);e.beginPath(),e.moveTo(t+u,n),e.arcTo(t+o,n,t+o,n+c,u),e.arcTo(t+o,n+c,t,n+c,u),e.arcTo(t,n+c,t,n,u),e.arcTo(t,n,t+o,n,u),e.closePath()}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-commit-graph"]],viewQuery:function(t,n){if(t&1&&(te(jt,7),te(Gt,7)),t&2){let o;ne(o=ie())&&(n.canvasRef=o.first),ne(o=ie())&&(n.scrollRef=o.first)}},hostBindings:function(t,n){t&1&&w("resize",function(){return n.onResize()},pe)},decls:15,vars:6,consts:[["scroll",""],["canvas",""],[1,"header"],[1,"title"],[1,"hint"],["aria-hidden","true",1,"legend"],["class","swatch",3,"background",4,"ngFor","ngForOf"],[1,"scroll"],[1,"phantom"],["aria-label","Commit graph","role","img"],["class","graph-tooltip",3,"left","top",4,"ngIf"],["class","empty",4,"ngIf"],[1,"swatch"],[1,"graph-tooltip"],[1,"tip-top"],["class","merge",4,"ngIf"],[1,"tip-subject"],[1,"tip-meta"],["class","tip-refs",4,"ngIf"],[1,"merge"],[1,"tip-refs"],[1,"empty"]],template:function(t,n){t&1&&(s(0,"div",2)(1,"div",3)(2,"span"),l(3,"Graph"),r(),s(4,"span",4),l(5),r()(),s(6,"div",5),v(7,Bt,1,2,"span",6),r()(),s(8,"div",7,0),b(10,"div",8)(11,"canvas",9,1),v(13,Yt,14,13,"div",10)(14,Qt,2,0,"div",11),r()),t&2&&(a(5),h(n.graphSummary()),a(2),d("ngForOf",n.legendColors),a(3),J("height",n.contentHeight(),"px"),a(3),d("ngIf",n.hoverTip()),a(),d("ngIf",!n.state.commits().length&&!n.state.loading()))},dependencies:[H,Q,N,Z],styles:['[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;min-height:0;background:transparent}.header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.65rem .85rem;border-bottom:1px solid var(--border-soft);font-size:12px;color:var(--fg-muted);background:color-mix(in oklab,var(--bg-surface) 88%,transparent)}.title[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1px;min-width:0}.title[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:first-child{color:var(--fg-primary);font-size:13px;font-weight:600}.hint[_ngcontent-%COMP%]{white-space:nowrap}.legend[_ngcontent-%COMP%]{display:flex;gap:4px;align-items:center;flex:0 0 auto}.swatch[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:999px;box-shadow:0 0 0 2px var(--bg-surface)}.scroll[_ngcontent-%COMP%]{position:relative;flex:1;overflow-y:auto;overflow-x:hidden;min-height:0;background:radial-gradient(circle at 24px 24px,var(--graph-row-alt) 0 1px,transparent 1px 100%),linear-gradient(180deg,color-mix(in oklab,var(--bg-surface) 92%,transparent),color-mix(in oklab,var(--bg-surface-2) 76%,transparent));background-size:24px 24px}.phantom[_ngcontent-%COMP%]{width:100%;pointer-events:none}canvas[_ngcontent-%COMP%]{display:block;position:absolute;top:0;left:0;pointer-events:auto;will-change:transform}.graph-tooltip[_ngcontent-%COMP%]{position:absolute;width:min(280px,calc(100% - 1.5rem));padding:.65rem .75rem;border:1px solid color-mix(in oklab,var(--accent) 34%,var(--border-soft));border-radius:var(--radius-md);background:color-mix(in oklab,var(--bg-elevated) 96%,transparent);box-shadow:var(--shadow-lg);color:var(--fg-primary);pointer-events:none;z-index:20}.tip-top[_ngcontent-%COMP%], .tip-meta[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;color:var(--fg-muted);font-size:11px}.tip-top[_ngcontent-%COMP%]{justify-content:space-between;margin-bottom:.35rem}.tip-top[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);color:var(--accent)}.merge[_ngcontent-%COMP%]{padding:1px 6px;border-radius:999px;background:color-mix(in oklab,var(--accent) 15%,transparent);color:var(--accent);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.tip-subject[_ngcontent-%COMP%]{margin-bottom:.4rem;font-size:13px;font-weight:600;line-height:1.35;overflow-wrap:anywhere}.tip-meta[_ngcontent-%COMP%]{flex-wrap:wrap;line-height:1.35}.tip-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:not(:last-child):after{content:"\\2022";margin-left:.5rem;opacity:.55}.tip-refs[_ngcontent-%COMP%]{margin-top:.45rem;color:var(--accent);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.empty[_ngcontent-%COMP%]{position:absolute;inset:0;display:grid;place-items:center;padding:1rem;color:var(--fg-muted);font-size:12px;text-align:center}'],changeDetection:0})};function Ut(i){return i.startsWith("origin/")||i.includes("/origin/")}function Kt(i,e){return i.length>e?`${i.slice(0,Math.max(1,e-1))}...`:i}function Xt(i,e){i&1&&b(0,"span",24)}function Jt(i,e){if(i&1&&(s(0,"span",28),l(1),r()),i&2){let t=e.$implicit;d("title",t),a(),h(t)}}function Zt(i,e){if(i&1&&(s(0,"span",29),l(1),r()),i&2){let t=e.$implicit;d("title",t),a(),h(t)}}function en(i,e){if(i&1&&(s(0,"span",25),v(1,Jt,2,2,"span",26)(2,Zt,2,2,"span",27),r()),i&2){let t=x().$implicit;a(),d("ngForOf",t.tags),a(),d("ngForOf",t.branches)}}function tn(i,e){if(i&1&&(s(0,"span",30),l(1),r()),i&2){let t=e.ngIf;a(),h(t)}}function nn(i,e){if(i&1){let t=A();s(0,"button",7),w("click",function(){let o=P(t).$implicit,c=x();return k(c.select(o))}),s(1,"span",8),b(2,"span",9),v(3,Xt,1,0,"span",10),r(),s(4,"span",11)(5,"span",12)(6,"span",13),l(7),r(),v(8,en,3,2,"span",14),r(),s(9,"span",15)(10,"span",16),l(11),r(),s(12,"span",17),l(13,"\u2022"),r(),s(14,"span",18),l(15),r(),s(16,"span",17),l(17,"\u2022"),r(),s(18,"span",19),j(19,"date"),l(20),j(21,"date"),r()(),s(22,"span",20)(23,"span",21),l(24),r(),s(25,"span",22)(26,"span",16),l(27),r(),s(28,"span"),l(29),r(),s(30,"span"),l(31),j(32,"date"),r()(),v(33,tn,2,1,"span",23),r()()()}if(i&2){let t=e.$implicit,n=e.index,o=x();W("selected",t.hash===o.selectedHash()),de("aria-current",t.hash===o.selectedHash()?"true":null),a(2),J("background",o.laneColor(t)),W("merge",t.isMerge),a(),d("ngIf",n<o.commits().length-1),a(3),d("title",t.subject),a(),h(t.subject),a(),d("ngIf",t.branches.length||t.tags.length),a(3),h(t.shortHash),a(3),d("title",t.author),a(),h(t.author),a(3),d("title",q(19,21,t.date,"MMM d, y, h:mm a")),a(2),z(" ",q(21,24,t.date,"MMM d, y, h:mm a")," "),a(4),h(t.subject),a(3),h(t.shortHash),a(2),h(t.author),a(2),h(q(32,27,t.date,"MMM d, y, h:mm a")),a(2),d("ngIf",o.refsFor(t))}}function on(i,e){i&1&&(s(0,"div",31)(1,"p"),l(2,"No commits match your filters."),r()())}var Pe=class i{state=M(G);commits=this.state.commits;selectedHash=this.state.selectedHash;refsCache=new Map;laneColorCache=new Map;trackByHash(e,t){return t.hash}select(e){this.state.selectHash(e.hash)}refsFor(e){let t=this.refsCache.get(e.hash);if(t!==void 0)return t;let n=[...e.tags,...e.branches].join(", ");return this.refsCache.set(e.hash,n),n}laneColors=["#4f46e5","#06b6d4","#f59e0b","#ef4444","#10b981","#8b5cf6"];laneColor(e){let t=this.laneColorCache.get(e.hash);if(t)return t;let n=0,o=e.branches[0]??e.parents[0]??e.hash;for(let g=0;g<o.length;g++)n=n*31+o.charCodeAt(g)>>>0;let c=this.laneColors[n%this.laneColors.length];return this.laneColorCache.set(e.hash,c),c}onKey(e){if(!this.isTyping(e.target)){if(e.key==="j")e.preventDefault(),this.state.selectByOffset(1);else if(e.key==="k")e.preventDefault(),this.state.selectByOffset(-1);else if(e.key==="g"){e.preventDefault();let t=this.state.commits();t.length&&this.state.selectHash(t[0].hash)}else if(e.key==="G"){e.preventDefault();let t=this.state.commits();t.length&&this.state.selectHash(t[t.length-1].hash)}}}isTyping(e){return e instanceof HTMLElement?["INPUT","TEXTAREA","SELECT"].includes(e.tagName)||e.isContentEditable:!1}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-commit-list"]],hostBindings:function(t,n){t&1&&w("keydown",function(c){return n.onKey(c)},pe)},decls:13,vars:6,consts:[[1,"header"],[1,"count"],[1,"hint"],[1,"kbd"],["minBufferPx","640","maxBufferPx","1280",1,"viewport",3,"itemSize"],["class","row",3,"selected","click",4,"cdkVirtualFor","cdkVirtualForOf","cdkVirtualForTrackBy"],["class","empty",4,"ngIf"],[1,"row",3,"click"],[1,"lane"],[1,"dot"],["class","line",4,"ngIf"],[1,"content"],[1,"title-row"],[1,"subject",3,"title"],["class","badges",4,"ngIf"],[1,"meta"],[1,"hash"],[1,"dot-sep"],[1,"author",3,"title"],[1,"date",3,"title"],["aria-hidden","true",1,"hover-card"],[1,"hover-subject"],[1,"hover-meta"],["class","hover-refs",4,"ngIf"],[1,"line"],[1,"badges"],["class","badge tag",3,"title",4,"ngFor","ngForOf"],["class","badge branch",3,"title",4,"ngFor","ngForOf"],[1,"badge","tag",3,"title"],[1,"badge","branch",3,"title"],[1,"hover-refs"],[1,"empty"]],template:function(t,n){t&1&&(s(0,"div",0)(1,"span",1),l(2),r(),s(3,"span",2)(4,"kbd",3),l(5,"j"),r(),l(6,"/"),s(7,"kbd",3),l(8,"k"),r(),l(9," navigate "),r()(),s(10,"cdk-virtual-scroll-viewport",4),v(11,nn,34,30,"button",5)(12,on,3,0,"div",6),r()),t&2&&(a(2),ue("",n.commits().length," of ",n.state.total()),a(8),d("itemSize",68),a(),d("cdkVirtualForOf",n.commits())("cdkVirtualForTrackBy",n.trackByHash),a(),d("ngIf",!n.commits().length&&!n.state.loading()))},dependencies:[H,Q,N,pt,lt,mt,ct,Z],styles:['[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;min-height:0;background:transparent}.header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:.6rem .85rem;border-bottom:1px solid var(--border-soft);font-size:12px;color:var(--fg-muted);background:color-mix(in oklab,var(--bg-surface) 92%,transparent)}.viewport[_ngcontent-%COMP%]{flex:1;min-height:0}.row[_ngcontent-%COMP%]{position:relative;display:grid;grid-template-columns:24px minmax(0,1fr);gap:.5rem;align-items:center;width:100%;height:68px;padding:.45rem .7rem;background:transparent;border:0;border-bottom:1px solid var(--border-soft);border-left:3px solid transparent;color:inherit;text-align:left;cursor:pointer;transition:background .1s,border-color .1s,transform 80ms}.row[_ngcontent-%COMP%]:hover{background:color-mix(in oklab,var(--bg-hover) 70%,transparent);border-left-color:color-mix(in oklab,var(--accent) 48%,transparent);z-index:3}.row.selected[_ngcontent-%COMP%]{background:linear-gradient(90deg,color-mix(in oklab,var(--accent) 18%,transparent),transparent 70%);border-left-color:var(--accent)}.row.selected[_ngcontent-%COMP%] .subject[_ngcontent-%COMP%]{color:var(--fg-primary)}.lane[_ngcontent-%COMP%]{position:relative;width:24px;height:100%;display:flex;align-items:center;justify-content:center}.dot[_ngcontent-%COMP%]{width:9px;height:9px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 2px var(--bg-surface);z-index:1}.dot.merge[_ngcontent-%COMP%]{background:transparent;border:2px solid var(--accent)}.line[_ngcontent-%COMP%]{position:absolute;top:50%;left:50%;width:2px;height:50%;background:var(--border-strong);transform:translate(-50%)}.content[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-width:0;gap:4px}.title-row[_ngcontent-%COMP%]{display:flex;align-items:center;min-width:0;gap:.5rem}.subject[_ngcontent-%COMP%]{flex:1 1 auto;min-width:0;font-weight:500;font-size:13px;color:var(--fg-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.meta[_ngcontent-%COMP%]{display:flex;gap:6px;font-size:11px;color:var(--fg-muted);align-items:center;min-width:0;overflow:hidden;white-space:nowrap}.hash[_ngcontent-%COMP%]{flex:0 0 auto;font-family:var(--font-mono)}.author[_ngcontent-%COMP%], .date[_ngcontent-%COMP%]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.author[_ngcontent-%COMP%]{flex:0 1 auto}.date[_ngcontent-%COMP%]{flex:1 1 auto}.dot-sep[_ngcontent-%COMP%]{opacity:.5}.badges[_ngcontent-%COMP%]{display:inline-flex;gap:4px;flex:0 1 auto;flex-wrap:nowrap;justify-content:flex-end;min-width:0;max-width:min(48%,180px);overflow:hidden}.badge[_ngcontent-%COMP%]{flex:0 1 auto;font-size:10px;font-weight:600;padding:2px 7px;border-radius:999px;letter-spacing:.02em;border:1px solid transparent;min-width:0;max-width:132px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.badge.tag[_ngcontent-%COMP%]{background:#d9770626;color:var(--warning);border-color:color-mix(in oklab,var(--warning) 24%,transparent)}.badge.branch[_ngcontent-%COMP%]{background:var(--accent-soft);color:var(--accent);border-color:color-mix(in oklab,var(--accent) 24%,transparent)}.hover-card[_ngcontent-%COMP%]{position:absolute;left:42px;right:10px;top:calc(100% - 8px);display:flex;flex-direction:column;gap:.35rem;padding:.65rem .75rem;border:1px solid color-mix(in oklab,var(--accent) 28%,var(--border-soft));border-radius:var(--radius-md);background:color-mix(in oklab,var(--bg-elevated) 96%,transparent);box-shadow:var(--shadow-lg);color:var(--fg-primary);opacity:0;pointer-events:none;transform:translateY(-4px);transition:opacity .1s ease,transform .1s ease,visibility .1s;visibility:hidden;z-index:12}.row[_ngcontent-%COMP%]:hover .hover-card[_ngcontent-%COMP%], .row[_ngcontent-%COMP%]:focus-visible .hover-card[_ngcontent-%COMP%]{opacity:1;transform:translateY(0);visibility:visible}.hover-subject[_ngcontent-%COMP%]{font-size:13px;font-weight:600;line-height:1.35;white-space:normal;overflow-wrap:anywhere}.hover-meta[_ngcontent-%COMP%], .hover-refs[_ngcontent-%COMP%]{display:flex;gap:.45rem;flex-wrap:wrap;font-size:11px;line-height:1.35;color:var(--fg-muted)}.hover-meta[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:not(:last-child):after{content:"\\2022";margin-left:.45rem;opacity:.55}.hover-refs[_ngcontent-%COMP%]{color:var(--accent);overflow-wrap:anywhere}.empty[_ngcontent-%COMP%]{padding:2rem 1rem;text-align:center;color:var(--fg-muted)}'],changeDetection:0})};var ke=class i{http=M(xe);base="/api";cache=new _e(50);list(e={}){let t=new Xe;for(let[n,o]of Object.entries(e))o&&(t=t.set(n,String(o)));return this.cache.get(`groups:${t.toString()}`,()=>this.http.get(`${this.base}/groups`,{params:t}),be.VOLATILE)}invalidate(){this.cache.clear()}static \u0275fac=function(t){return new(t||i)};static \u0275prov=me({token:i,factory:i.\u0275fac,providedIn:"root"})};function rn(i,e){if(i&1&&(s(0,"span",7),l(1),r()),i&2){let t=e.ngIf;a(),z("",t," groups")}}function an(i,e){i&1&&(s(0,"div",8),l(1,"Loading groups\u2026"),r())}function sn(i,e){if(i&1&&(s(0,"div",9),l(1),r()),i&2){let t=e.ngIf;a(),h(t)}}function ln(i,e){i&1&&(s(0,"div",8),l(1," No groups detected. Try the flat view. "),r())}function cn(i,e){if(i&1&&(s(0,"span",18),l(1),r()),i&2){let t=x().$implicit;a(),z("#",t.prNumber)}}function mn(i,e){if(i&1){let t=A();s(0,"li",21),w("click",function(){let o=P(t).$implicit,c=x(3);return k(c.state.selectHash(o))}),s(1,"code",22),l(2),r(),s(3,"span",23),l(4),r()()}if(i&2){let t=e.$implicit,n=x(3);W("selected",t===n.state.selectedHash()),a(2),h(n.shortHash(t)),a(2),h(n.subjectFor(t))}}function pn(i,e){if(i&1&&(s(0,"ul",19),v(1,mn,5,4,"li",20),r()),i&2){let t=x().$implicit;a(),d("ngForOf",t.commits)}}function dn(i,e){if(i&1){let t=A();s(0,"li",10)(1,"button",11),w("click",function(){let o=P(t).$implicit,c=x();return k(c.toggle(o.id))}),s(2,"span",12),l(3,"\u25B8"),r(),s(4,"span",13),l(5),r(),v(6,cn,2,1,"span",14),s(7,"span",15),l(8),r(),s(9,"span",16),l(10),r()(),v(11,pn,2,1,"ul",17),r()}if(i&2){let t=e.$implicit,n=x();W("expanded",n.isExpanded(t.id)),a(2),W("open",n.isExpanded(t.id)),a(2),Qe("src-"+t.source),a(),h(n.sourceLabel(t.source)),a(),d("ngIf",t.prNumber),a(2),h(t.title),a(2),h(t.commits.length),a(),d("ngIf",n.isExpanded(t.id))}}var Se=class i{state=M(G);groupsApi=M(ke);groups=S(null);loading=S(!1);error=S(null);expanded=S(new Set);subjectMap=K(()=>{let e=new Map;for(let t of this.state.commits())e.set(t.hash,t.subject);return e});constructor(){Y(()=>{let e=this.state.filters();this.load(e.since,e.until,e.author,e.branch)})}isExpanded(e){return this.expanded().has(e)}toggle(e){let t=new Set(this.expanded());t.has(e)?t.delete(e):t.add(e),this.expanded.set(t)}shortHash(e){return e.slice(0,7)}subjectFor(e){return this.subjectMap().get(e)??e.slice(0,7)}sourceLabel(e){switch(e){case"merge":return"PR";case"squash":return"PR (sq)";case"conventional":return"Feat";case"standalone":return"commit"}}load(e,t,n,o){this.loading.set(!0),this.error.set(null),this.groupsApi.list({since:e,until:t,author:n,branch:o}).subscribe({next:c=>{this.groups.set(c),this.loading.set(!1);let g=c.find(u=>u.prNumber);g&&this.expanded.set(new Set([g.id]))},error:c=>{this.error.set(this.errMsg(c)),this.loading.set(!1)}})}errMsg(e){if(e&&typeof e=="object"&&"error"in e){let t=e.error;if(t?.error)return t.error}return e instanceof Error?e.message:"Failed to load groups"}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-grouped-list"]],decls:9,vars:5,consts:[[1,"head"],[1,"title"],["class","meta",4,"ngIf"],["class","empty",4,"ngIf"],["class","empty error",4,"ngIf"],[1,"groups"],["class","group",3,"expanded",4,"ngFor","ngForOf"],[1,"meta"],[1,"empty"],[1,"empty","error"],[1,"group"],[1,"group-head",3,"click"],[1,"caret"],[1,"badge"],["class","pr",4,"ngIf"],[1,"g-title"],[1,"count"],["class","commits",4,"ngIf"],[1,"pr"],[1,"commits"],["class","commit",3,"selected","click",4,"ngFor","ngForOf"],[1,"commit",3,"click"],[1,"hash"],[1,"subject"]],template:function(t,n){if(t&1&&(s(0,"div",0)(1,"span",1),l(2,"PR / feature groups"),r(),v(3,rn,2,1,"span",2),r(),v(4,an,2,0,"div",3)(5,sn,2,1,"div",4)(6,ln,2,0,"div",3),s(7,"ul",5),v(8,dn,12,11,"li",6),r()),t&2){let o,c;a(3),d("ngIf",(o=n.groups())==null?null:o.length),a(),d("ngIf",n.loading()),a(),d("ngIf",n.error()),a(),d("ngIf",!n.loading()&&!n.error()&&(((c=n.groups())==null?null:c.length)??0)===0),a(2),d("ngForOf",n.groups())}},dependencies:[H,Q,N],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;overflow:hidden}.head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:.6rem .85rem;border-bottom:1px solid var(--border-soft);background:color-mix(in oklab,var(--bg-surface) 92%,transparent)}.title[_ngcontent-%COMP%]{font-weight:600;font-size:13px}.meta[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted)}.empty[_ngcontent-%COMP%]{padding:1rem .85rem;color:var(--fg-muted);font-size:12px}.empty.error[_ngcontent-%COMP%]{color:var(--danger)}.groups[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;overflow-y:auto;flex:1}.group[_ngcontent-%COMP%]{border-bottom:1px solid var(--border-soft);transition:background .12s}.group.expanded[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 5%,transparent)}.group-head[_ngcontent-%COMP%]{width:100%;display:flex;align-items:center;gap:.5rem;padding:.58rem .85rem;background:transparent;border:0;color:var(--fg-primary);cursor:pointer;text-align:left}.group-head[_ngcontent-%COMP%]:hover{background:color-mix(in oklab,var(--bg-hover) 72%,transparent)}.caret[_ngcontent-%COMP%]{display:inline-block;width:10px;transition:transform .15s ease;color:var(--fg-muted)}.caret.open[_ngcontent-%COMP%]{transform:rotate(90deg)}.badge[_ngcontent-%COMP%]{font-size:10px;letter-spacing:.04em;padding:1px 6px;border-radius:999px;background:var(--bg-surface-2);color:var(--fg-secondary);text-transform:uppercase}.badge.src-merge[_ngcontent-%COMP%]{background:#6366f12e;color:var(--accent)}.badge.src-squash[_ngcontent-%COMP%]{background:#10b9812e;color:#10b981}.badge.src-conventional[_ngcontent-%COMP%]{background:#f59e0b2e;color:#d97706}.pr[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted)}.g-title[_ngcontent-%COMP%]{flex:1;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.count[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted);background:var(--bg-surface-2);border:1px solid var(--border-soft);padding:1px 6px;border-radius:999px}.commits[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0 0 .4rem;background:color-mix(in oklab,var(--bg-surface-2) 72%,transparent)}.commit[_ngcontent-%COMP%]{display:flex;gap:.6rem;align-items:center;padding:.34rem .85rem .34rem 2rem;cursor:pointer;font-size:12px}.commit[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.commit.selected[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 18%,transparent);box-shadow:inset 3px 0 0 var(--accent)}.commit[_ngcontent-%COMP%] .hash[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);font-size:11px;color:var(--fg-muted)}.commit[_ngcontent-%COMP%] .subject[_ngcontent-%COMP%]{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}"],changeDetection:0})};function gn(i,e){i&1&&(ge(0),b(1,"app-grouped-list"),fe())}function fn(i,e){i&1&&b(0,"app-commit-list")}var ut=class i{state=M(G);static \u0275fac=function(t){return new(t||i)};static \u0275cmp=L({type:i,selectors:[["app-home-shell"]],decls:11,vars:2,consts:[["flat",""],[1,"layout"],[1,"pane","graph"],[1,"pane","list"],[1,"pane-shell"],[4,"ngIf","ngIfElse"],[1,"pane","detail"],[1,"pane-shell","detail-shell"]],template:function(t,n){if(t&1&&(s(0,"main",1)(1,"aside",2),b(2,"app-commit-graph"),r(),s(3,"section",3)(4,"div",4),v(5,gn,2,0,"ng-container",5)(6,fn,1,0,"ng-template",null,0,ve),r()(),s(8,"section",6)(9,"div",7),b(10,"app-commit-detail"),r()()()),t&2){let o=he(7);a(5),d("ngIf",n.state.viewMode()==="grouped")("ngIfElse",o)}},dependencies:[H,N,Oe,Pe,we,Se],styles:["[_nghost-%COMP%]{display:block;flex:1;min-height:0}.layout[_ngcontent-%COMP%]{height:100%;display:grid;grid-template-columns:minmax(240px,320px) minmax(340px,430px) minmax(0,1fr);gap:.75rem;padding:.75rem;min-height:0;background:transparent}.pane[_ngcontent-%COMP%]{min-width:0;min-height:0;overflow:hidden;border-radius:var(--radius-lg);background:var(--bg-panel);border:1px solid color-mix(in oklab,var(--border-soft) 86%,transparent);box-shadow:var(--shadow-md)}.pane.graph[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--bg-panel) 86%,transparent)}.pane-shell[_ngcontent-%COMP%]{height:100%;min-height:0;overflow:hidden;border-radius:inherit}.detail-shell[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--bg-surface) 82%,transparent)}@media (max-width: 1100px){.layout[_ngcontent-%COMP%]{grid-template-columns:320px 1fr}.pane.graph[_ngcontent-%COMP%]{display:none}}@media (max-width: 720px){.layout[_ngcontent-%COMP%]{grid-template-columns:1fr}.pane.list[_ngcontent-%COMP%]{display:none}}"],changeDetection:0})};export{ut as HomeShellComponent};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as a,U as f,W as h,
|
|
1
|
+
import{$ as a,U as f,W as h,bc as v,cc as l,dc as m,ja as y,ka as b,l as g,la as d,oa as i}from"./chunk-UM7ESEXJ.js";function U(n,e){let t=e?.injector??a(y),s=new g(1),u=m(()=>{let r;try{r=n()}catch(c){v(()=>s.error(c));return}v(()=>s.next(r))},{injector:t,manualCleanup:!0});return t.get(d).onDestroy(()=>{u.destroy(),s.complete()}),s.asObservable()}function L(n,e){let s=!e?.manualCleanup?e?.injector?.get(d)??a(d):null,u=w(e?.equal),r;e?.requireSync?r=i({kind:0},{equal:u}):r=i({kind:1,value:e?.initialValue},{equal:u});let c,p=n.subscribe({next:o=>r.set({kind:1,value:o}),error:o=>{r.set({kind:2,error:o}),c?.()},complete:()=>{c?.()}});if(e?.requireSync&&r().kind===0)throw new f(601,!1);return c=s?.onDestroy(p.unsubscribe.bind(p)),l(()=>{let o=r();switch(o.kind){case 1:return o.value;case 2:throw o.error;case 0:throw new f(601,!1)}},{equal:e?.equal})}function w(n=Object.is){return(e,t)=>e.kind===1&&t.kind===1&&n(e.value,t.value)}var k="ghui:theme",D=class n{doc=a(b);mediaQuery=null;preference=i(this.read());systemDark=i(!1);resolved=l(()=>{let e=this.preference();return e==="system"?this.systemDark()?"dark":"light":e});constructor(){typeof window<"u"&&window.matchMedia&&(this.mediaQuery=window.matchMedia("(prefers-color-scheme: dark)"),this.systemDark.set(this.mediaQuery.matches),this.mediaQuery.addEventListener("change",e=>this.systemDark.set(e.matches))),m(()=>{let e=this.resolved(),t=this.doc.documentElement;t.classList.toggle("dark",e==="dark"),t.dataset.theme=e,this.doc.body?.classList?.toggle("dark",e==="dark")})}setPreference(e){this.preference.set(e);try{localStorage.setItem(k,e)}catch{}}cycle(){let t=this.resolved()==="light"?"dark":"light";this.setPreference(t)}read(){try{let e=localStorage.getItem(k);if(e==="light"||e==="dark"||e==="system")return e}catch{}return"system"}static \u0275fac=function(t){return new(t||n)};static \u0275prov=h({token:n,factory:n.\u0275fac,providedIn:"root"})};export{U as a,L as b,D as c};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as N,$a as u,A as ee,Ib as oe,Tb as m,Ua as D,V as g,Va as a,X as H,Z as p,_a as L,a as l,ac as f,b as d,bb as h,bc as P,eb as x,fc as W,gb as ie,ib as re,ic as ae,j as K,jc as $,kb as se,la as te,oa as O,p as J,sa as ne,ta as C,u as Q,va as V,yb as b}from"./chunk-QH2BEUIU.js";var me=(()=>{class n{_renderer;_elementRef;onChange=t=>{};onTouched=()=>{};constructor(t,i){this._renderer=t,this._elementRef=i}setProperty(t,i){this._renderer.setProperty(this._elementRef.nativeElement,t,i)}registerOnTouched(t){this.onTouched=t}registerOnChange(t){this.onChange=t}setDisabledState(t){this.setProperty("disabled",t)}static \u0275fac=function(i){return new(i||n)(a(D),a(V))};static \u0275dir=u({type:n})}return n})(),T=(()=>{class n extends me{static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,features:[h]})}return n})(),I=new p("");var Se={provide:I,useExisting:g(()=>_e),multi:!0};function Ne(){let n=$()?$().getUserAgent():"";return/android (\d+)/.test(n.toLowerCase())}var Oe=new p(""),_e=(()=>{class n extends me{_compositionMode;_composing=!1;constructor(t,i,r){super(t,i),this._compositionMode=r,this._compositionMode==null&&(this._compositionMode=!Ne())}writeValue(t){let i=t??"";this.setProperty("value",i)}_handleInput(t){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(t)}_compositionStart(){this._composing=!0}_compositionEnd(t){this._composing=!1,this._compositionMode&&this.onChange(t)}static \u0275fac=function(i){return new(i||n)(a(D),a(V),a(Oe,8))};static \u0275dir=u({type:n,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,r){i&1&&b("input",function(o){return r._handleInput(o.target.value)})("blur",function(){return r.onTouched()})("compositionstart",function(){return r._compositionStart()})("compositionend",function(o){return r._compositionEnd(o.target.value)})},standalone:!1,features:[m([Se]),h]})}return n})();var xe=new p(""),Pe=new p("");function ve(n){return n!=null}function ye(n){return re(n)?J(n):n}function Ce(n){let e={};return n.forEach(t=>{e=t!=null?l(l({},e),t):e}),Object.keys(e).length===0?null:e}function Ve(n,e){return e.map(t=>t(n))}function Re(n){return!n.validate}function De(n){return n.map(e=>Re(e)?e:t=>e.validate(t))}function ke(n){if(!n)return null;let e=n.filter(ve);return e.length==0?null:function(t){return Ce(Ve(t,e))}}function be(n){return n!=null?ke(De(n)):null}function je(n){if(!n)return null;let e=n.filter(ve);return e.length==0?null:function(t){let i=Ve(t,e).map(ye);return ee(i).pipe(Q(Ce))}}function Ae(n){return n!=null?je(De(n)):null}function le(n,e){return n===null?[e]:Array.isArray(n)?[...n,e]:[n,e]}function Ge(n){return n._rawValidators}function Te(n){return n._rawAsyncValidators}function q(n){return n?Array.isArray(n)?n:[n]:[]}function k(n,e){return Array.isArray(n)?n.includes(e):n===e}function ue(n,e){let t=q(e);return q(n).forEach(r=>{k(t,r)||t.push(r)}),t}function de(n,e){return q(e).filter(t=>!k(n,t))}var j=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=be(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=Ae(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control&&this.control.reset(e)}hasError(e,t){return this.control?this.control.hasError(e,t):!1}getError(e,t){return this.control?this.control.getError(e,t):null}},z=class extends j{name;get formDirective(){return null}get path(){return null}},F=class extends j{_parent=null;name=null;valueAccessor=null},Z=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}},Be={"[class.ng-untouched]":"isUntouched","[class.ng-touched]":"isTouched","[class.ng-pristine]":"isPristine","[class.ng-dirty]":"isDirty","[class.ng-valid]":"isValid","[class.ng-invalid]":"isInvalid","[class.ng-pending]":"isPending"},Ot=d(l({},Be),{"[class.ng-submitted]":"isSubmitted"}),xt=(()=>{class n extends Z{constructor(t){super(t)}static \u0275fac=function(i){return new(i||n)(a(F,2))};static \u0275dir=u({type:n,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,r){i&2&&oe("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)},standalone:!1,features:[h]})}return n})();var A="VALID",R="INVALID",_="PENDING",M="DISABLED",y=class{},G=class extends y{value;source;constructor(e,t){super(),this.value=e,this.source=t}},E=class extends y{pristine;source;constructor(e,t){super(),this.pristine=e,this.source=t}},w=class extends y{touched;source;constructor(e,t){super(),this.touched=e,this.source=t}},v=class extends y{status;source;constructor(e,t){super(),this.status=e,this.source=t}};function Ue(n){return(B(n)?n.validators:n)||null}function He(n){return Array.isArray(n)?be(n):n||null}function Le(n,e){return(B(e)?e.asyncValidators:n)||null}function We(n){return Array.isArray(n)?Ae(n):n||null}function B(n){return n!=null&&!Array.isArray(n)&&typeof n=="object"}var X=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,t){this._assignValidators(e),this._assignAsyncValidators(t)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return f(this.statusReactive)}set status(e){f(()=>this.statusReactive.set(e))}_status=P(()=>this.statusReactive());statusReactive=O(void 0);get valid(){return this.status===A}get invalid(){return this.status===R}get pending(){return this.status==_}get disabled(){return this.status===M}get enabled(){return this.status!==M}errors;get pristine(){return f(this.pristineReactive)}set pristine(e){f(()=>this.pristineReactive.set(e))}_pristine=P(()=>this.pristineReactive());pristineReactive=O(!0);get dirty(){return!this.pristine}get touched(){return f(this.touchedReactive)}set touched(e){f(()=>this.touchedReactive.set(e))}_touched=P(()=>this.touchedReactive());touchedReactive=O(!1);get untouched(){return!this.touched}_events=new K;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(ue(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(ue(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(de(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(de(e,this._rawAsyncValidators))}hasValidator(e){return k(this._rawValidators,e)}hasAsyncValidator(e){return k(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let t=this.touched===!1;this.touched=!0;let i=e.sourceControl??this;this._parent&&!e.onlySelf&&this._parent.markAsTouched(d(l({},e),{sourceControl:i})),t&&e.emitEvent!==!1&&this._events.next(new w(!0,i))}markAllAsDirty(e={}){this.markAsDirty({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(t=>t.markAllAsDirty(e))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(t=>t.markAllAsTouched(e))}markAsUntouched(e={}){let t=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let i=e.sourceControl??this;this._forEachChild(r=>{r.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:i})}),this._parent&&!e.onlySelf&&this._parent._updateTouched(e,i),t&&e.emitEvent!==!1&&this._events.next(new w(!1,i))}markAsDirty(e={}){let t=this.pristine===!0;this.pristine=!1;let i=e.sourceControl??this;this._parent&&!e.onlySelf&&this._parent.markAsDirty(d(l({},e),{sourceControl:i})),t&&e.emitEvent!==!1&&this._events.next(new E(!1,i))}markAsPristine(e={}){let t=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let i=e.sourceControl??this;this._forEachChild(r=>{r.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),this._parent&&!e.onlySelf&&this._parent._updatePristine(e,i),t&&e.emitEvent!==!1&&this._events.next(new E(!0,i))}markAsPending(e={}){this.status=_;let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new v(this.status,t)),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.markAsPending(d(l({},e),{sourceControl:t}))}disable(e={}){let t=this._parentMarkedDirty(e.onlySelf);this.status=M,this.errors=null,this._forEachChild(r=>{r.disable(d(l({},e),{onlySelf:!0}))}),this._updateValue();let i=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new G(this.value,i)),this._events.next(new v(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(d(l({},e),{skipPristineCheck:t}),this),this._onDisabledChange.forEach(r=>r(!0))}enable(e={}){let t=this._parentMarkedDirty(e.onlySelf);this.status=A,this._forEachChild(i=>{i.enable(d(l({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(d(l({},e),{skipPristineCheck:t}),this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(e,t){this._parent&&!e.onlySelf&&(this._parent.updateValueAndValidity(e),e.skipPristineCheck||this._parent._updatePristine({},t),this._parent._updateTouched({},t))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===A||this.status===_)&&this._runAsyncValidator(i,e.emitEvent)}let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new G(this.value,t)),this._events.next(new v(this.status,t)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.updateValueAndValidity(d(l({},e),{sourceControl:t}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(t=>t._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?M:A}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,t){if(this.asyncValidator){this.status=_,this._hasOwnPendingAsyncValidator={emitEvent:t!==!1,shouldHaveEmitted:e!==!1};let i=ye(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(r=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(r,{emitEvent:t,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=(this._hasOwnPendingAsyncValidator?.emitEvent||this._hasOwnPendingAsyncValidator?.shouldHaveEmitted)??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,t={}){this.errors=e,this._updateControlsErrors(t.emitEvent!==!1,this,t.shouldHaveEmitted)}get(e){let t=e;return t==null||(Array.isArray(t)||(t=t.split(".")),t.length===0)?null:t.reduce((i,r)=>i&&i._find(r),this)}getError(e,t){let i=t?this.get(t):this;return i&&i.errors?i.errors[e]:null}hasError(e,t){return!!this.getError(e,t)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,t,i){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||i)&&this._events.next(new v(this.status,t)),this._parent&&this._parent._updateControlsErrors(e,t,i)}_initObservables(){this.valueChanges=new x,this.statusChanges=new x}_calculateStatus(){return this._allControlsDisabled()?M:this.errors?R:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(_)?_:this._anyControlsHaveStatus(R)?R:A}_anyControlsHaveStatus(e){return this._anyControls(t=>t.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,t){let i=!this._anyControlsDirty(),r=this.pristine!==i;this.pristine=i,this._parent&&!e.onlySelf&&this._parent._updatePristine(e,t),r&&this._events.next(new E(this.pristine,t))}_updateTouched(e={},t){this.touched=this._anyControlsTouched(),this._events.next(new w(this.touched,t)),this._parent&&!e.onlySelf&&this._parent._updateTouched(e,t)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){B(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){let t=this._parent&&this._parent.dirty;return!e&&!!t&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=He(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=We(this._rawAsyncValidators)}};var Me=new p("",{providedIn:"root",factory:()=>Y}),Y="always";function $e(n,e){return[...e.path,n]}function qe(n,e,t=Y){Ze(n,e),e.valueAccessor.writeValue(n.value),(n.disabled||t==="always")&&e.valueAccessor.setDisabledState?.(n.disabled),Xe(n,e),Ke(n,e),Ye(n,e),ze(n,e)}function ce(n,e){n.forEach(t=>{t.registerOnValidatorChange&&t.registerOnValidatorChange(e)})}function ze(n,e){if(e.valueAccessor.setDisabledState){let t=i=>{e.valueAccessor.setDisabledState(i)};n.registerOnDisabledChange(t),e._registerOnDestroy(()=>{n._unregisterOnDisabledChange(t)})}}function Ze(n,e){let t=Ge(n);e.validator!==null?n.setValidators(le(t,e.validator)):typeof t=="function"&&n.setValidators([t]);let i=Te(n);e.asyncValidator!==null?n.setAsyncValidators(le(i,e.asyncValidator)):typeof i=="function"&&n.setAsyncValidators([i]);let r=()=>n.updateValueAndValidity();ce(e._rawValidators,r),ce(e._rawAsyncValidators,r)}function Xe(n,e){e.valueAccessor.registerOnChange(t=>{n._pendingValue=t,n._pendingChange=!0,n._pendingDirty=!0,n.updateOn==="change"&&Ee(n,e)})}function Ye(n,e){e.valueAccessor.registerOnTouched(()=>{n._pendingTouched=!0,n.updateOn==="blur"&&n._pendingChange&&Ee(n,e),n.updateOn!=="submit"&&n.markAsTouched()})}function Ee(n,e){n._pendingDirty&&n.markAsDirty(),n.setValue(n._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(n._pendingValue),n._pendingChange=!1}function Ke(n,e){let t=(i,r)=>{e.valueAccessor.writeValue(i),r&&e.viewToModelUpdate(i)};n.registerOnChange(t),e._registerOnDestroy(()=>{n._unregisterOnChange(t)})}function Je(n,e){if(!n.hasOwnProperty("model"))return!1;let t=n.model;return t.isFirstChange()?!0:!Object.is(e,t.currentValue)}function Qe(n){return Object.getPrototypeOf(n.constructor)===T}function et(n,e){if(!e)return null;Array.isArray(e);let t,i,r;return e.forEach(s=>{s.constructor===_e?t=s:Qe(s)?i=s:r=s}),r||i||t||null}function he(n,e){let t=n.indexOf(e);t>-1&&n.splice(t,1)}function fe(n){return typeof n=="object"&&n!==null&&Object.keys(n).length===2&&"value"in n&&"disabled"in n}var tt=class extends X{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,t,i){super(Ue(t),Le(i,t)),this._applyFormState(e),this._setUpdateStrategy(t),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),B(t)&&(t.nonNullable||t.initialValueIsDefault)&&(fe(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,t={}){this.value=this._pendingValue=e,this._onChange.length&&t.emitModelToViewChange!==!1&&this._onChange.forEach(i=>i(this.value,t.emitViewToModelChange!==!1)),this.updateValueAndValidity(t)}patchValue(e,t={}){this.setValue(e,t)}reset(e=this.defaultValue,t={}){this._applyFormState(e),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),this._pendingChange=!1}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){he(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){he(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){fe(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var nt={provide:F,useExisting:g(()=>it)},ge=Promise.resolve(),it=(()=>{class n extends F{_changeDetectorRef;callSetDisabledState;control=new tt;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new x;constructor(t,i,r,s,o,c){super(),this._changeDetectorRef=o,this.callSetDisabledState=c,this._parent=t,this._setValidators(i),this._setAsyncValidators(r),this.valueAccessor=et(this,s)}ngOnChanges(t){if(this._checkForErrors(),!this._registered||"name"in t){if(this._registered&&(this._checkName(),this.formDirective)){let i=t.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in t&&this._updateDisabled(t),Je(t,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(t){this.viewModel=t,this.update.emit(t)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){qe(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(t){ge.then(()=>{this.control.setValue(t,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(t){let i=t.isDisabled.currentValue,r=i!==0&&ae(i);ge.then(()=>{r&&!this.control.disabled?this.control.disable():!r&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(t){return this._parent?$e(t,this._parent):[t]}static \u0275fac=function(i){return new(i||n)(a(z,9),a(xe,10),a(Pe,10),a(I,10),a(W,8),a(Me,8))};static \u0275dir=u({type:n,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[m([nt]),h,ne]})}return n})();var rt={provide:I,useExisting:g(()=>st),multi:!0},st=(()=>{class n extends T{writeValue(t){this.setProperty("value",parseFloat(t))}registerOnChange(t){this.onChange=i=>{t(i==""?null:parseFloat(i))}}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["input","type","range","formControlName",""],["input","type","range","formControl",""],["input","type","range","ngModel",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target.value)})("input",function(o){return r.onChange(o.target.value)})("blur",function(){return r.onTouched()})},standalone:!1,features:[m([rt]),h]})}return n})();var ot={provide:I,useExisting:g(()=>Fe),multi:!0};function we(n,e){return n==null?`${e}`:(e&&typeof e=="object"&&(e="Object"),`${n}: ${e}`.slice(0,50))}function at(n){return n.split(":")[0]}var Fe=(()=>{class n extends T{value;_optionMap=new Map;_idCounter=0;set compareWith(t){this._compareWith=t}_compareWith=Object.is;appRefInjector=N(se).injector;destroyRef=N(te);cdr=N(W);_queuedWrite=!1;_writeValueAfterRender(){this._queuedWrite||this.appRefInjector.destroyed||(this._queuedWrite=!0,ie({write:()=>{this.destroyRef.destroyed||(this._queuedWrite=!1,this.writeValue(this.value))}},{injector:this.appRefInjector}))}writeValue(t){this.cdr.markForCheck(),this.value=t;let i=this._getOptionId(t),r=we(i,t);this.setProperty("value",r)}registerOnChange(t){this.onChange=i=>{this.value=this._getOptionValue(i),t(this.value)}}_registerOption(){return(this._idCounter++).toString()}_getOptionId(t){for(let i of this._optionMap.keys())if(this._compareWith(this._optionMap.get(i),t))return i;return null}_getOptionValue(t){let i=at(t);return this._optionMap.has(i)?this._optionMap.get(i):t}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["select","formControlName","",3,"multiple",""],["select","formControl","",3,"multiple",""],["select","ngModel","",3,"multiple",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target.value)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},standalone:!1,features:[m([ot]),h]})}return n})(),Rt=(()=>{class n{_element;_renderer;_select;id;constructor(t,i,r){this._element=t,this._renderer=i,this._select=r,this._select&&(this.id=this._select._registerOption())}set ngValue(t){this._select!=null&&(this._select._optionMap.set(this.id,t),this._setElementValue(we(this.id,t)),this._select._writeValueAfterRender())}set value(t){this._setElementValue(t),this._select&&this._select._writeValueAfterRender()}_setElementValue(t){this._renderer.setProperty(this._element.nativeElement,"value",t)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select._writeValueAfterRender())}static \u0275fac=function(i){return new(i||n)(a(V),a(D),a(Fe,9))};static \u0275dir=u({type:n,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"},standalone:!1})}return n})(),lt={provide:I,useExisting:g(()=>Ie),multi:!0};function pe(n,e){return n==null?`${e}`:(typeof e=="string"&&(e=`'${e}'`),e&&typeof e=="object"&&(e="Object"),`${n}: ${e}`.slice(0,50))}function ut(n){return n.split(":")[0]}var Ie=(()=>{class n extends T{value;_optionMap=new Map;_idCounter=0;set compareWith(t){this._compareWith=t}_compareWith=Object.is;writeValue(t){this.value=t;let i;if(Array.isArray(t)){let r=t.map(s=>this._getOptionId(s));i=(s,o)=>{s._setSelected(r.indexOf(o.toString())>-1)}}else i=(r,s)=>{r._setSelected(!1)};this._optionMap.forEach(i)}registerOnChange(t){this.onChange=i=>{let r=[],s=i.selectedOptions;if(s!==void 0){let o=s;for(let c=0;c<o.length;c++){let S=o[c],U=this._getOptionValue(S.value);r.push(U)}}else{let o=i.options;for(let c=0;c<o.length;c++){let S=o[c];if(S.selected){let U=this._getOptionValue(S.value);r.push(U)}}}this.value=r,t(r)}}_registerOption(t){let i=(this._idCounter++).toString();return this._optionMap.set(i,t),i}_getOptionId(t){for(let i of this._optionMap.keys())if(this._compareWith(this._optionMap.get(i)._value,t))return i;return null}_getOptionValue(t){let i=ut(t);return this._optionMap.has(i)?this._optionMap.get(i)._value:t}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["select","multiple","","formControlName",""],["select","multiple","","formControl",""],["select","multiple","","ngModel",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},standalone:!1,features:[m([lt]),h]})}return n})(),kt=(()=>{class n{_element;_renderer;_select;id;_value;constructor(t,i,r){this._element=t,this._renderer=i,this._select=r,this._select&&(this.id=this._select._registerOption(this))}set ngValue(t){this._select!=null&&(this._value=t,this._setElementValue(pe(this.id,t)),this._select.writeValue(this._select.value))}set value(t){this._select?(this._value=t,this._setElementValue(pe(this.id,t)),this._select.writeValue(this._select.value)):this._setElementValue(t)}_setElementValue(t){this._renderer.setProperty(this._element.nativeElement,"value",t)}_setSelected(t){this._renderer.setProperty(this._element.nativeElement,"selected",t)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}static \u0275fac=function(i){return new(i||n)(a(V),a(D),a(Ie,9))};static \u0275dir=u({type:n,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"},standalone:!1})}return n})();var dt=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=L({type:n});static \u0275inj=H({})}return n})();var jt=(()=>{class n{static withConfig(t){return{ngModule:n,providers:[{provide:Me,useValue:t.callSetDisabledState??Y}]}}static \u0275fac=function(i){return new(i||n)};static \u0275mod=L({type:n});static \u0275inj=H({imports:[dt]})}return n})();export{_e as a,xt as b,it as c,st as d,Fe as e,Rt as f,kt as g,jt as h};
|
|
1
|
+
import{$ as N,$a as u,A as ee,Ib as oe,Ua as D,Ub as m,V as g,Va as a,X as H,Z as p,_a as L,a as l,b as d,bb as h,bc as f,cc as P,eb as x,gb as ie,gc as W,ib as re,j as K,jc as ae,kb as se,kc as $,la as te,oa as O,p as J,sa as ne,ta as C,u as Q,va as V,yb as b}from"./chunk-UM7ESEXJ.js";var me=(()=>{class n{_renderer;_elementRef;onChange=t=>{};onTouched=()=>{};constructor(t,i){this._renderer=t,this._elementRef=i}setProperty(t,i){this._renderer.setProperty(this._elementRef.nativeElement,t,i)}registerOnTouched(t){this.onTouched=t}registerOnChange(t){this.onChange=t}setDisabledState(t){this.setProperty("disabled",t)}static \u0275fac=function(i){return new(i||n)(a(D),a(V))};static \u0275dir=u({type:n})}return n})(),T=(()=>{class n extends me{static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,features:[h]})}return n})(),I=new p("");var Se={provide:I,useExisting:g(()=>_e),multi:!0};function Ne(){let n=$()?$().getUserAgent():"";return/android (\d+)/.test(n.toLowerCase())}var Oe=new p(""),_e=(()=>{class n extends me{_compositionMode;_composing=!1;constructor(t,i,r){super(t,i),this._compositionMode=r,this._compositionMode==null&&(this._compositionMode=!Ne())}writeValue(t){let i=t??"";this.setProperty("value",i)}_handleInput(t){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(t)}_compositionStart(){this._composing=!0}_compositionEnd(t){this._composing=!1,this._compositionMode&&this.onChange(t)}static \u0275fac=function(i){return new(i||n)(a(D),a(V),a(Oe,8))};static \u0275dir=u({type:n,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,r){i&1&&b("input",function(o){return r._handleInput(o.target.value)})("blur",function(){return r.onTouched()})("compositionstart",function(){return r._compositionStart()})("compositionend",function(o){return r._compositionEnd(o.target.value)})},standalone:!1,features:[m([Se]),h]})}return n})();var xe=new p(""),Pe=new p("");function ve(n){return n!=null}function ye(n){return re(n)?J(n):n}function Ce(n){let e={};return n.forEach(t=>{e=t!=null?l(l({},e),t):e}),Object.keys(e).length===0?null:e}function Ve(n,e){return e.map(t=>t(n))}function Re(n){return!n.validate}function De(n){return n.map(e=>Re(e)?e:t=>e.validate(t))}function ke(n){if(!n)return null;let e=n.filter(ve);return e.length==0?null:function(t){return Ce(Ve(t,e))}}function be(n){return n!=null?ke(De(n)):null}function je(n){if(!n)return null;let e=n.filter(ve);return e.length==0?null:function(t){let i=Ve(t,e).map(ye);return ee(i).pipe(Q(Ce))}}function Ae(n){return n!=null?je(De(n)):null}function le(n,e){return n===null?[e]:Array.isArray(n)?[...n,e]:[n,e]}function Ge(n){return n._rawValidators}function Te(n){return n._rawAsyncValidators}function q(n){return n?Array.isArray(n)?n:[n]:[]}function k(n,e){return Array.isArray(n)?n.includes(e):n===e}function ue(n,e){let t=q(e);return q(n).forEach(r=>{k(t,r)||t.push(r)}),t}function de(n,e){return q(e).filter(t=>!k(n,t))}var j=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=be(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=Ae(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control&&this.control.reset(e)}hasError(e,t){return this.control?this.control.hasError(e,t):!1}getError(e,t){return this.control?this.control.getError(e,t):null}},z=class extends j{name;get formDirective(){return null}get path(){return null}},F=class extends j{_parent=null;name=null;valueAccessor=null},Z=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}},Be={"[class.ng-untouched]":"isUntouched","[class.ng-touched]":"isTouched","[class.ng-pristine]":"isPristine","[class.ng-dirty]":"isDirty","[class.ng-valid]":"isValid","[class.ng-invalid]":"isInvalid","[class.ng-pending]":"isPending"},Ot=d(l({},Be),{"[class.ng-submitted]":"isSubmitted"}),xt=(()=>{class n extends Z{constructor(t){super(t)}static \u0275fac=function(i){return new(i||n)(a(F,2))};static \u0275dir=u({type:n,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,r){i&2&&oe("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)},standalone:!1,features:[h]})}return n})();var A="VALID",R="INVALID",_="PENDING",M="DISABLED",y=class{},G=class extends y{value;source;constructor(e,t){super(),this.value=e,this.source=t}},E=class extends y{pristine;source;constructor(e,t){super(),this.pristine=e,this.source=t}},w=class extends y{touched;source;constructor(e,t){super(),this.touched=e,this.source=t}},v=class extends y{status;source;constructor(e,t){super(),this.status=e,this.source=t}};function Ue(n){return(B(n)?n.validators:n)||null}function He(n){return Array.isArray(n)?be(n):n||null}function Le(n,e){return(B(e)?e.asyncValidators:n)||null}function We(n){return Array.isArray(n)?Ae(n):n||null}function B(n){return n!=null&&!Array.isArray(n)&&typeof n=="object"}var X=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,t){this._assignValidators(e),this._assignAsyncValidators(t)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return f(this.statusReactive)}set status(e){f(()=>this.statusReactive.set(e))}_status=P(()=>this.statusReactive());statusReactive=O(void 0);get valid(){return this.status===A}get invalid(){return this.status===R}get pending(){return this.status==_}get disabled(){return this.status===M}get enabled(){return this.status!==M}errors;get pristine(){return f(this.pristineReactive)}set pristine(e){f(()=>this.pristineReactive.set(e))}_pristine=P(()=>this.pristineReactive());pristineReactive=O(!0);get dirty(){return!this.pristine}get touched(){return f(this.touchedReactive)}set touched(e){f(()=>this.touchedReactive.set(e))}_touched=P(()=>this.touchedReactive());touchedReactive=O(!1);get untouched(){return!this.touched}_events=new K;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(ue(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(ue(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(de(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(de(e,this._rawAsyncValidators))}hasValidator(e){return k(this._rawValidators,e)}hasAsyncValidator(e){return k(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let t=this.touched===!1;this.touched=!0;let i=e.sourceControl??this;this._parent&&!e.onlySelf&&this._parent.markAsTouched(d(l({},e),{sourceControl:i})),t&&e.emitEvent!==!1&&this._events.next(new w(!0,i))}markAllAsDirty(e={}){this.markAsDirty({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(t=>t.markAllAsDirty(e))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(t=>t.markAllAsTouched(e))}markAsUntouched(e={}){let t=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let i=e.sourceControl??this;this._forEachChild(r=>{r.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:i})}),this._parent&&!e.onlySelf&&this._parent._updateTouched(e,i),t&&e.emitEvent!==!1&&this._events.next(new w(!1,i))}markAsDirty(e={}){let t=this.pristine===!0;this.pristine=!1;let i=e.sourceControl??this;this._parent&&!e.onlySelf&&this._parent.markAsDirty(d(l({},e),{sourceControl:i})),t&&e.emitEvent!==!1&&this._events.next(new E(!1,i))}markAsPristine(e={}){let t=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let i=e.sourceControl??this;this._forEachChild(r=>{r.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),this._parent&&!e.onlySelf&&this._parent._updatePristine(e,i),t&&e.emitEvent!==!1&&this._events.next(new E(!0,i))}markAsPending(e={}){this.status=_;let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new v(this.status,t)),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.markAsPending(d(l({},e),{sourceControl:t}))}disable(e={}){let t=this._parentMarkedDirty(e.onlySelf);this.status=M,this.errors=null,this._forEachChild(r=>{r.disable(d(l({},e),{onlySelf:!0}))}),this._updateValue();let i=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new G(this.value,i)),this._events.next(new v(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(d(l({},e),{skipPristineCheck:t}),this),this._onDisabledChange.forEach(r=>r(!0))}enable(e={}){let t=this._parentMarkedDirty(e.onlySelf);this.status=A,this._forEachChild(i=>{i.enable(d(l({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(d(l({},e),{skipPristineCheck:t}),this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(e,t){this._parent&&!e.onlySelf&&(this._parent.updateValueAndValidity(e),e.skipPristineCheck||this._parent._updatePristine({},t),this._parent._updateTouched({},t))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===A||this.status===_)&&this._runAsyncValidator(i,e.emitEvent)}let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new G(this.value,t)),this._events.next(new v(this.status,t)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.updateValueAndValidity(d(l({},e),{sourceControl:t}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(t=>t._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?M:A}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,t){if(this.asyncValidator){this.status=_,this._hasOwnPendingAsyncValidator={emitEvent:t!==!1,shouldHaveEmitted:e!==!1};let i=ye(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(r=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(r,{emitEvent:t,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=(this._hasOwnPendingAsyncValidator?.emitEvent||this._hasOwnPendingAsyncValidator?.shouldHaveEmitted)??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,t={}){this.errors=e,this._updateControlsErrors(t.emitEvent!==!1,this,t.shouldHaveEmitted)}get(e){let t=e;return t==null||(Array.isArray(t)||(t=t.split(".")),t.length===0)?null:t.reduce((i,r)=>i&&i._find(r),this)}getError(e,t){let i=t?this.get(t):this;return i&&i.errors?i.errors[e]:null}hasError(e,t){return!!this.getError(e,t)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,t,i){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||i)&&this._events.next(new v(this.status,t)),this._parent&&this._parent._updateControlsErrors(e,t,i)}_initObservables(){this.valueChanges=new x,this.statusChanges=new x}_calculateStatus(){return this._allControlsDisabled()?M:this.errors?R:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(_)?_:this._anyControlsHaveStatus(R)?R:A}_anyControlsHaveStatus(e){return this._anyControls(t=>t.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,t){let i=!this._anyControlsDirty(),r=this.pristine!==i;this.pristine=i,this._parent&&!e.onlySelf&&this._parent._updatePristine(e,t),r&&this._events.next(new E(this.pristine,t))}_updateTouched(e={},t){this.touched=this._anyControlsTouched(),this._events.next(new w(this.touched,t)),this._parent&&!e.onlySelf&&this._parent._updateTouched(e,t)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){B(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){let t=this._parent&&this._parent.dirty;return!e&&!!t&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=He(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=We(this._rawAsyncValidators)}};var Me=new p("",{providedIn:"root",factory:()=>Y}),Y="always";function $e(n,e){return[...e.path,n]}function qe(n,e,t=Y){Ze(n,e),e.valueAccessor.writeValue(n.value),(n.disabled||t==="always")&&e.valueAccessor.setDisabledState?.(n.disabled),Xe(n,e),Ke(n,e),Ye(n,e),ze(n,e)}function ce(n,e){n.forEach(t=>{t.registerOnValidatorChange&&t.registerOnValidatorChange(e)})}function ze(n,e){if(e.valueAccessor.setDisabledState){let t=i=>{e.valueAccessor.setDisabledState(i)};n.registerOnDisabledChange(t),e._registerOnDestroy(()=>{n._unregisterOnDisabledChange(t)})}}function Ze(n,e){let t=Ge(n);e.validator!==null?n.setValidators(le(t,e.validator)):typeof t=="function"&&n.setValidators([t]);let i=Te(n);e.asyncValidator!==null?n.setAsyncValidators(le(i,e.asyncValidator)):typeof i=="function"&&n.setAsyncValidators([i]);let r=()=>n.updateValueAndValidity();ce(e._rawValidators,r),ce(e._rawAsyncValidators,r)}function Xe(n,e){e.valueAccessor.registerOnChange(t=>{n._pendingValue=t,n._pendingChange=!0,n._pendingDirty=!0,n.updateOn==="change"&&Ee(n,e)})}function Ye(n,e){e.valueAccessor.registerOnTouched(()=>{n._pendingTouched=!0,n.updateOn==="blur"&&n._pendingChange&&Ee(n,e),n.updateOn!=="submit"&&n.markAsTouched()})}function Ee(n,e){n._pendingDirty&&n.markAsDirty(),n.setValue(n._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(n._pendingValue),n._pendingChange=!1}function Ke(n,e){let t=(i,r)=>{e.valueAccessor.writeValue(i),r&&e.viewToModelUpdate(i)};n.registerOnChange(t),e._registerOnDestroy(()=>{n._unregisterOnChange(t)})}function Je(n,e){if(!n.hasOwnProperty("model"))return!1;let t=n.model;return t.isFirstChange()?!0:!Object.is(e,t.currentValue)}function Qe(n){return Object.getPrototypeOf(n.constructor)===T}function et(n,e){if(!e)return null;Array.isArray(e);let t,i,r;return e.forEach(s=>{s.constructor===_e?t=s:Qe(s)?i=s:r=s}),r||i||t||null}function he(n,e){let t=n.indexOf(e);t>-1&&n.splice(t,1)}function fe(n){return typeof n=="object"&&n!==null&&Object.keys(n).length===2&&"value"in n&&"disabled"in n}var tt=class extends X{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,t,i){super(Ue(t),Le(i,t)),this._applyFormState(e),this._setUpdateStrategy(t),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),B(t)&&(t.nonNullable||t.initialValueIsDefault)&&(fe(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,t={}){this.value=this._pendingValue=e,this._onChange.length&&t.emitModelToViewChange!==!1&&this._onChange.forEach(i=>i(this.value,t.emitViewToModelChange!==!1)),this.updateValueAndValidity(t)}patchValue(e,t={}){this.setValue(e,t)}reset(e=this.defaultValue,t={}){this._applyFormState(e),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),this._pendingChange=!1}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){he(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){he(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){fe(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var nt={provide:F,useExisting:g(()=>it)},ge=Promise.resolve(),it=(()=>{class n extends F{_changeDetectorRef;callSetDisabledState;control=new tt;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new x;constructor(t,i,r,s,o,c){super(),this._changeDetectorRef=o,this.callSetDisabledState=c,this._parent=t,this._setValidators(i),this._setAsyncValidators(r),this.valueAccessor=et(this,s)}ngOnChanges(t){if(this._checkForErrors(),!this._registered||"name"in t){if(this._registered&&(this._checkName(),this.formDirective)){let i=t.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in t&&this._updateDisabled(t),Je(t,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(t){this.viewModel=t,this.update.emit(t)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){qe(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(t){ge.then(()=>{this.control.setValue(t,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(t){let i=t.isDisabled.currentValue,r=i!==0&&ae(i);ge.then(()=>{r&&!this.control.disabled?this.control.disable():!r&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(t){return this._parent?$e(t,this._parent):[t]}static \u0275fac=function(i){return new(i||n)(a(z,9),a(xe,10),a(Pe,10),a(I,10),a(W,8),a(Me,8))};static \u0275dir=u({type:n,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[m([nt]),h,ne]})}return n})();var rt={provide:I,useExisting:g(()=>st),multi:!0},st=(()=>{class n extends T{writeValue(t){this.setProperty("value",parseFloat(t))}registerOnChange(t){this.onChange=i=>{t(i==""?null:parseFloat(i))}}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["input","type","range","formControlName",""],["input","type","range","formControl",""],["input","type","range","ngModel",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target.value)})("input",function(o){return r.onChange(o.target.value)})("blur",function(){return r.onTouched()})},standalone:!1,features:[m([rt]),h]})}return n})();var ot={provide:I,useExisting:g(()=>Fe),multi:!0};function we(n,e){return n==null?`${e}`:(e&&typeof e=="object"&&(e="Object"),`${n}: ${e}`.slice(0,50))}function at(n){return n.split(":")[0]}var Fe=(()=>{class n extends T{value;_optionMap=new Map;_idCounter=0;set compareWith(t){this._compareWith=t}_compareWith=Object.is;appRefInjector=N(se).injector;destroyRef=N(te);cdr=N(W);_queuedWrite=!1;_writeValueAfterRender(){this._queuedWrite||this.appRefInjector.destroyed||(this._queuedWrite=!0,ie({write:()=>{this.destroyRef.destroyed||(this._queuedWrite=!1,this.writeValue(this.value))}},{injector:this.appRefInjector}))}writeValue(t){this.cdr.markForCheck(),this.value=t;let i=this._getOptionId(t),r=we(i,t);this.setProperty("value",r)}registerOnChange(t){this.onChange=i=>{this.value=this._getOptionValue(i),t(this.value)}}_registerOption(){return(this._idCounter++).toString()}_getOptionId(t){for(let i of this._optionMap.keys())if(this._compareWith(this._optionMap.get(i),t))return i;return null}_getOptionValue(t){let i=at(t);return this._optionMap.has(i)?this._optionMap.get(i):t}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["select","formControlName","",3,"multiple",""],["select","formControl","",3,"multiple",""],["select","ngModel","",3,"multiple",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target.value)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},standalone:!1,features:[m([ot]),h]})}return n})(),Rt=(()=>{class n{_element;_renderer;_select;id;constructor(t,i,r){this._element=t,this._renderer=i,this._select=r,this._select&&(this.id=this._select._registerOption())}set ngValue(t){this._select!=null&&(this._select._optionMap.set(this.id,t),this._setElementValue(we(this.id,t)),this._select._writeValueAfterRender())}set value(t){this._setElementValue(t),this._select&&this._select._writeValueAfterRender()}_setElementValue(t){this._renderer.setProperty(this._element.nativeElement,"value",t)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select._writeValueAfterRender())}static \u0275fac=function(i){return new(i||n)(a(V),a(D),a(Fe,9))};static \u0275dir=u({type:n,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"},standalone:!1})}return n})(),lt={provide:I,useExisting:g(()=>Ie),multi:!0};function pe(n,e){return n==null?`${e}`:(typeof e=="string"&&(e=`'${e}'`),e&&typeof e=="object"&&(e="Object"),`${n}: ${e}`.slice(0,50))}function ut(n){return n.split(":")[0]}var Ie=(()=>{class n extends T{value;_optionMap=new Map;_idCounter=0;set compareWith(t){this._compareWith=t}_compareWith=Object.is;writeValue(t){this.value=t;let i;if(Array.isArray(t)){let r=t.map(s=>this._getOptionId(s));i=(s,o)=>{s._setSelected(r.indexOf(o.toString())>-1)}}else i=(r,s)=>{r._setSelected(!1)};this._optionMap.forEach(i)}registerOnChange(t){this.onChange=i=>{let r=[],s=i.selectedOptions;if(s!==void 0){let o=s;for(let c=0;c<o.length;c++){let S=o[c],U=this._getOptionValue(S.value);r.push(U)}}else{let o=i.options;for(let c=0;c<o.length;c++){let S=o[c];if(S.selected){let U=this._getOptionValue(S.value);r.push(U)}}}this.value=r,t(r)}}_registerOption(t){let i=(this._idCounter++).toString();return this._optionMap.set(i,t),i}_getOptionId(t){for(let i of this._optionMap.keys())if(this._compareWith(this._optionMap.get(i)._value,t))return i;return null}_getOptionValue(t){let i=ut(t);return this._optionMap.has(i)?this._optionMap.get(i)._value:t}static \u0275fac=(()=>{let t;return function(r){return(t||(t=C(n)))(r||n)}})();static \u0275dir=u({type:n,selectors:[["select","multiple","","formControlName",""],["select","multiple","","formControl",""],["select","multiple","","ngModel",""]],hostBindings:function(i,r){i&1&&b("change",function(o){return r.onChange(o.target)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},standalone:!1,features:[m([lt]),h]})}return n})(),kt=(()=>{class n{_element;_renderer;_select;id;_value;constructor(t,i,r){this._element=t,this._renderer=i,this._select=r,this._select&&(this.id=this._select._registerOption(this))}set ngValue(t){this._select!=null&&(this._value=t,this._setElementValue(pe(this.id,t)),this._select.writeValue(this._select.value))}set value(t){this._select?(this._value=t,this._setElementValue(pe(this.id,t)),this._select.writeValue(this._select.value)):this._setElementValue(t)}_setElementValue(t){this._renderer.setProperty(this._element.nativeElement,"value",t)}_setSelected(t){this._renderer.setProperty(this._element.nativeElement,"selected",t)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}static \u0275fac=function(i){return new(i||n)(a(V),a(D),a(Ie,9))};static \u0275dir=u({type:n,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"},standalone:!1})}return n})();var dt=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=L({type:n});static \u0275inj=H({})}return n})();var jt=(()=>{class n{static withConfig(t){return{ngModule:n,providers:[{provide:Me,useValue:t.callSetDisabledState??Y}]}}static \u0275fac=function(i){return new(i||n)};static \u0275mod=L({type:n});static \u0275inj=H({imports:[dt]})}return n})();export{_e as a,xt as b,it as c,st as d,Fe as e,Rt as f,kt as g,jt as h};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{a as St,b as Et,c as J,d as It,e as Tt,f as mt,g as F,h as zt,i as Rt,j as Ht,k as Dt,l as Vt,m as pt,n as $t,o as At,p as Ft,q as Nt,r as gt}from"./chunk-Y6GOUMAT.js";import{e as Ot}from"./chunk-PXNKNORB.js";import{a as Pt}from"./chunk-6DL2ZTKG.js";import{$ as lt,Db as W,Eb as U,Fb as X,Hb as et,Ib as Ct,Kb as r,Lb as h,Mb as R,Nb as nt,Qa as s,Wb as Y,Yb as ct,Za as V,Zb as dt,cb as S,dc as kt,ea as O,eb as _t,fa as P,ga as K,ha as bt,lb as z,oa as G,ob as u,pb as i,pc as yt,qb as n,qc as it,rb as y,rc as wt,sa as Z,sb as Q,sc as Mt,tb as q,tc as A,ub as $,xb as tt,yb as E,zb as _}from"./chunk-UM7ESEXJ.js";var Wt=["svg"],Ut=["tooltip"],rt=class o{data=[];height=200;svgRef;tooltipRef;hideTimer=null;lastRendered=null;lastHeight=0;ngAfterViewInit(){this.render()}ngOnChanges(){this.render()}ngOnDestroy(){this.hideTimer&&clearTimeout(this.hideTimer)}render(){if(!this.svgRef||this.data===this.lastRendered&&this.height===this.lastHeight)return;this.lastRendered=this.data,this.lastHeight=this.height;let e=this.svgRef.nativeElement,t=this.tooltipRef?.nativeElement,d=e.clientWidth||600,a={top:14,right:46,bottom:28,left:42},m=Math.max(0,d-a.left-a.right),v=Math.max(0,this.height-a.top-a.bottom),b=getComputedStyle(e),g={accent:w(b,"--chart-line","#818cf8"),success:w(b,"--chart-add","#4ade80"),danger:w(b,"--chart-del","#f87171"),muted:w(b,"--fg-muted","#94a3b8"),primary:w(b,"--fg-primary","#f8fafc"),border:w(b,"--border-soft","#334155"),grid:w(b,"--graph-guide","rgba(148, 163, 184, 0.22)"),surface:w(b,"--bg-surface","#111827"),elevated:w(b,"--bg-elevated","#1f2937")},H=F(e);if(H.selectAll("*").remove(),ht(t),this.data.length===0||m<=0||v<=0)return;let f=this.data.map(l=>({date:new Date(l.date),label:l.date,commits:l.commits,additions:l.additions,deletions:l.deletions,churn:l.additions+l.deletions})).filter(l=>!Number.isNaN(l.date.getTime()));if(!f.length)return;let C=Et(f,l=>l.date);+C[0]==+C[1]&&(C[0]=new Date(+C[0]-720*60*1e3),C[1]=new Date(+C[1]+720*60*1e3));let k=$t().domain(C).range([0,m]),I=pt().domain([0,J(f,l=>l.churn)??1]).nice().range([v,0]),B=pt().domain([0,J(f,l=>l.commits)??1]).nice().range([v,0]),ot=H.append("defs").append("linearGradient").attr("id","churn-area-gradient").attr("x1","0%").attr("x2","0%").attr("y1","0%").attr("y2","100%");ot.append("stop").attr("offset","0%").attr("stop-color",g.accent).attr("stop-opacity",.24),ot.append("stop").attr("offset","100%").attr("stop-color",g.accent).attr("stop-opacity",.02);let x=H.append("g").attr("transform",`translate(${a.left},${a.top})`),c=Ht(",");x.append("g").attr("class","grid").call(mt(I).ticks(4).tickSize(-m).tickFormat(()=>"")).call(l=>l.select(".domain").remove()).call(l=>l.selectAll("line").attr("stroke",g.grid));let p=Math.max(2,Math.min(14,m/Math.max(1,f.length)*.45));x.append("g").selectAll("line.additions").data(f).join("line").attr("class","additions").attr("x1",l=>k(l.date)-p/3).attr("x2",l=>k(l.date)-p/3).attr("y1",v).attr("y2",l=>I(l.additions)).attr("stroke",g.success).attr("stroke-width",p).attr("stroke-linecap","round").attr("opacity",.75),x.append("g").selectAll("line.deletions").data(f).join("line").attr("class","deletions").attr("x1",l=>k(l.date)+p/3).attr("x2",l=>k(l.date)+p/3).attr("y1",v).attr("y2",l=>I(l.deletions)).attr("stroke",g.danger).attr("stroke-width",p).attr("stroke-linecap","round").attr("opacity",.62);let j=Nt().x(l=>k(l.date)).y0(v).y1(l=>I(l.churn)).curve(gt);x.append("path").datum(f).attr("d",j).attr("fill","url(#churn-area-gradient)");let T=Ft().x(l=>k(l.date)).y(l=>B(l.commits)).curve(gt);x.append("path").datum(f).attr("d",T).attr("stroke",g.accent).attr("stroke-width",2).attr("fill","none");let D=x.append("g").attr("display","none");D.append("line").attr("y1",0).attr("y2",v).attr("stroke",g.primary).attr("stroke-opacity",.25).attr("stroke-dasharray","3,3"),D.append("circle").attr("r",4).attr("fill",g.accent).attr("stroke",g.surface).attr("stroke-width",2),x.append("g").attr("class","axis").attr("transform",`translate(0,${v})`).call(Tt(k).ticks(Math.min(8,Math.max(3,Math.floor(m/90)))).tickSizeOuter(0)).call(ut(g)),x.append("g").attr("class","axis").call(mt(I).ticks(4).tickSizeOuter(0)).call(ut(g)),x.append("g").attr("class","axis").attr("transform",`translate(${m},0)`).call(It(B).ticks(4).tickSizeOuter(0)).call(ut(g)),x.append("text").attr("x",0).attr("y",-4).attr("fill",g.muted).attr("font-size",10).text("churn"),x.append("text").attr("x",m).attr("y",-4).attr("text-anchor","end").attr("fill",g.muted).attr("font-size",10).text("commits");let Gt=St(l=>l.date).center;H.attr("tabindex",0).on("pointermove",l=>{let[st,ft]=zt(l,x.node());if(st<0||st>m||ft<0||ft>v){ht(t),D.attr("display","none");return}let Qt=k.invert(st),M=f[Gt(f,Qt)];if(!M)return;let xt=k(M.date),vt=B(M.commits);D.attr("display",null).attr("transform",`translate(${xt},0)`),D.select("circle").attr("cy",vt),Xt(t,{x:a.left+xt,y:a.top+Math.min(vt,v-20),date:M.label,commits:c(M.commits),additions:c(M.additions),deletions:c(M.deletions),churn:c(M.churn)})}).on("pointerleave blur",()=>{D.attr("display","none"),this.hideTimer&&clearTimeout(this.hideTimer),this.hideTimer=setTimeout(()=>ht(t),80)})}static \u0275fac=function(t){return new(t||o)};static \u0275cmp=V({type:o,selectors:[["app-churn-chart"]],viewQuery:function(t,d){if(t&1&&(W(Wt,7),W(Ut,7)),t&2){let a;U(a=X())&&(d.svgRef=a.first),U(a=X())&&(d.tooltipRef=a.first)}},inputs:{data:"data",height:"height"},features:[Z],decls:16,vars:1,consts:[["svg",""],["tooltip",""],[1,"chart-shell"],["aria-hidden","true",1,"legend"],[1,"swatch","commits"],[1,"swatch","additions"],[1,"swatch","deletions"],[1,"chart-wrap"],["width","100%","aria-label","Interactive churn over time"],["hidden","",1,"tooltip"]],template:function(t,d){t&1&&(Q(0,"div",2)(1,"div",3)(2,"span"),$(3,"i",4),r(4," commits"),q(),Q(5,"span"),$(6,"i",5),r(7," additions"),q(),Q(8,"span"),$(9,"i",6),r(10," deletions"),q()(),Q(11,"div",7),K(),$(12,"svg",8,0),bt(),$(14,"div",9,1),q()()),t&2&&(s(12),z("height",d.height))},dependencies:[A],styles:["[_nghost-%COMP%]{display:block}.chart-shell[_ngcontent-%COMP%]{display:grid;gap:.45rem}.legend[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;color:var(--fg-muted);font-size:11px}.legend[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-flex;gap:.35rem;align-items:center}.swatch[_ngcontent-%COMP%]{display:inline-block;width:9px;height:9px;border-radius:999px}.swatch.commits[_ngcontent-%COMP%]{background:var(--chart-line)}.swatch.additions[_ngcontent-%COMP%]{background:var(--chart-add)}.swatch.deletions[_ngcontent-%COMP%]{background:var(--chart-del)}.chart-wrap[_ngcontent-%COMP%]{position:relative;overflow:hidden;border:1px solid var(--border-soft);border-radius:var(--radius-md);background:radial-gradient(circle at 12% 0%,var(--chart-fill),transparent 34%),linear-gradient(180deg,color-mix(in oklab,var(--bg-surface-2) 58%,transparent),transparent 70%),var(--bg-surface-2)}svg[_ngcontent-%COMP%]{display:block;outline:none}[_nghost-%COMP%] .axis text{font-size:10px;font-family:var(--font-mono, monospace)}[_nghost-%COMP%] .axis path, [_nghost-%COMP%] .axis line{shape-rendering:crispEdges}.tooltip[_ngcontent-%COMP%]{position:absolute;z-index:2;min-width:150px;max-width:240px;padding:.5rem .6rem;border:1px solid var(--border-soft);border-radius:var(--radius-sm);background:var(--bg-elevated);color:var(--fg-primary);box-shadow:var(--shadow-md);font-size:11px;line-height:1.35;pointer-events:none;transform:translate(-50%,calc(-100% - 12px))}.tooltip[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:block;margin-bottom:.25rem;font-size:12px}.tooltip[_ngcontent-%COMP%] .row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:1rem;color:var(--fg-muted);font-variant-numeric:tabular-nums}.tooltip[_ngcontent-%COMP%] .value[_ngcontent-%COMP%]{color:var(--fg-primary)}"],changeDetection:0})};function ut(o){return e=>{e.selectAll("text").attr("fill",o.muted),e.selectAll("path,line").attr("stroke",o.border)}}function Xt(o,e){o&&(o.hidden=!1,o.style.left=`${e.x}px`,o.style.top=`${e.y}px`,o.innerHTML=`
|
|
2
|
+
<strong>${Yt(e.date)}</strong>
|
|
3
|
+
<div class="row"><span>Commits</span><span class="value">${e.commits}</span></div>
|
|
4
|
+
<div class="row"><span>Additions</span><span class="value">+${e.additions}</span></div>
|
|
5
|
+
<div class="row"><span>Deletions</span><span class="value">-${e.deletions}</span></div>
|
|
6
|
+
<div class="row"><span>Total churn</span><span class="value">${e.churn}</span></div>
|
|
7
|
+
`)}function ht(o){o&&(o.hidden=!0)}function w(o,e,t){return o.getPropertyValue(e).trim()||t}function Yt(o){return o.replace(/[&<>"']/g,e=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[e]??e)}var Kt=["svg"];function Zt(o,e){o&1&&(i(0,"div",5)(1,"span"),r(2,"lower churn"),n(),y(3,"span",6),i(4,"span"),r(5,"higher churn"),n()())}function te(o,e){o&1&&(i(0,"div",7),r(1,"No hotspots in the current window."),n())}var at=class o{data=[];height=320;fileClick=new _t;svgRef;lastRendered=null;lastHeight=0;ngAfterViewInit(){this.render()}ngOnChanges(){this.render()}render(){if(!this.svgRef||this.data===this.lastRendered&&this.height===this.lastHeight)return;this.lastRendered=this.data,this.lastHeight=this.height;let e=this.svgRef.nativeElement,t=e.clientWidth||600,d=F(e);if(d.selectAll("*").remove(),this.data.length===0)return;let a=getComputedStyle(e),m=N(a,"--accent","#4f46e5"),v=N(a,"--fg-muted","#64748b"),b=N(a,"--fg-primary","#0f172a"),g=N(a,"--bg-surface","#ffffff"),H=N(a,"--bg-surface-2","#f3f4f6"),f=N(a,"--border-soft","#e5e7eb"),C=Dt({name:"root",children:this.data}).sum(c=>c.commits??0).sort((c,p)=>(p.value??0)-(c.value??0));Vt().size([t,this.height]).padding(2).round(!0)(C);let I=J(this.data,c=>c.additions+c.deletions)??1,B=At().domain([0,I]).interpolator(Rt(H,m)),L=d.selectAll("g").data(C.leaves()).join("g").attr("class","cell").attr("transform",c=>`translate(${c.x0},${c.y0})`).on("click",(c,p)=>this.fileClick.emit(p.data.file)).on("mouseenter",function(){F(this).select("rect").attr("stroke-width",2.5).attr("filter","url(#hotspot-glow)")}).on("mouseleave",function(){F(this).select("rect").attr("stroke-width",1).attr("filter",null)});d.append("defs").append("filter").attr("id","hotspot-glow").attr("x","-20%").attr("y","-20%").attr("width","140%").attr("height","140%").append("feDropShadow").attr("dx",0).attr("dy",4).attr("stdDeviation",4).attr("flood-color",m).attr("flood-opacity",.28),L.append("rect").attr("width",c=>c.x1-c.x0).attr("height",c=>c.y1-c.y0).attr("rx",6).attr("ry",6).attr("fill",c=>{let p=c.data;return B(p.additions+p.deletions)}).attr("stroke",f).attr("stroke-width",1),L.append("title").text(c=>{let p=c.data;return`${p.file}
|
|
8
|
+
Changed in ${p.commits} commits by ${p.authors} authors
|
|
9
|
+
Line churn: +${p.additions} -${p.deletions}`}),L.append("text").attr("class","cell-label").attr("x",4).attr("y",12).attr("font-size",10).attr("font-family","var(--font-mono, monospace)").attr("fill",b).attr("stroke",g).attr("stroke-width",2.4).attr("paint-order","stroke").attr("pointer-events","none").text(c=>{let p=c.x1-c.x0,j=c.y1-c.y0;if(p<40||j<18)return"";let T=c.data.file;return T.split("/").pop()??T}),L.append("text").attr("x",4).attr("y",26).attr("font-size",9).attr("fill",v).attr("stroke",g).attr("stroke-width",2).attr("paint-order","stroke").attr("pointer-events","none").text(c=>{let p=c.x1-c.x0,j=c.y1-c.y0;if(p<70||j<34)return"";let T=c.data;return`${T.commits} commits \xB7 ${T.authors} authors`})}static \u0275fac=function(t){return new(t||o)};static \u0275cmp=V({type:o,selectors:[["app-hotspots-treemap"]],viewQuery:function(t,d){if(t&1&&W(Kt,7),t&2){let a;U(a=X())&&(d.svgRef=a.first)}},inputs:{data:"data",height:"height"},outputs:{fileClick:"fileClick"},features:[Z],decls:5,vars:3,consts:[["svg",""],[1,"treemap-wrap"],["width","100%","aria-label","Hot files treemap. Larger boxes changed in more commits. Stronger color means more line churn."],["class","scale",4,"ngIf"],["class","empty",4,"ngIf"],[1,"scale"],[1,"scale-bar"],[1,"empty"]],template:function(t,d){t&1&&(i(0,"div",1),K(),y(1,"svg",2,0),S(3,Zt,6,0,"div",3)(4,te,2,0,"div",4),n()),t&2&&(s(),z("height",d.height),s(2),u("ngIf",d.data.length),s(),u("ngIf",d.data.length===0))},dependencies:[A,it],styles:["[_nghost-%COMP%]{display:block}.treemap-wrap[_ngcontent-%COMP%]{position:relative;overflow:hidden;border:1px solid var(--border-soft);border-radius:var(--radius-md);background:radial-gradient(circle at 15% 0%,color-mix(in oklab,var(--accent) 12%,transparent),transparent 38%),var(--bg-surface-2)}svg[_ngcontent-%COMP%]{display:block}.scale[_ngcontent-%COMP%]{position:absolute;right:.75rem;bottom:.65rem;display:inline-flex;align-items:center;gap:.45rem;padding:.28rem .5rem;border:1px solid color-mix(in oklab,var(--border-soft) 72%,transparent);border-radius:999px;background:color-mix(in oklab,var(--bg-surface) 88%,transparent);color:var(--fg-muted);font-size:10px;box-shadow:var(--shadow-sm);pointer-events:none}.scale-bar[_ngcontent-%COMP%]{width:64px;height:7px;border-radius:999px;background:linear-gradient(90deg,var(--bg-surface-2),var(--accent))}.empty[_ngcontent-%COMP%]{position:absolute;inset:0;display:grid;place-items:center;color:var(--fg-muted);font-size:12px}"],changeDetection:0})};function N(o,e,t){return o.getPropertyValue(e).trim()||t}function ee(o,e){if(o&1&&(i(0,"p",7),r(1),Y(2,"slice"),Y(3,"slice"),n()),o&2){let t=e.ngIf;s(),nt(" ",dt(2,2,t.windowStart,0,10)," \u2192 ",dt(3,6,t.windowEnd,0,10)," ")}}function ne(o,e){o&1&&(i(0,"div",8),r(1,"Computing insights (this may take a few seconds)\u2026"),n())}function ie(o,e){if(o&1&&(i(0,"div",9),r(1),n()),o&2){let t=e.ngIf;s(),h(t)}}function re(o,e){if(o&1&&(i(0,"li")(1,"span",35),r(2),n(),i(3,"div",36)(4,"div",37)(5,"span",38),r(6),n(),i(7,"strong"),r(8),n()(),i(9,"div",39),y(10,"div",40),n(),i(11,"span",41),r(12),Y(13,"date"),Y(14,"date"),n()()()),o&2){let t=e.$implicit,d=e.index,a=_(2);s(),et("--avatar-color",a.avatarColor(d)),s(),h(a.initials(t.author)),s(3),u("title",t.author),s(),h(t.author),s(2),R("",t.commits," commits"),s(),z("aria-label",t.commits+" commits"),s(),et("width",a.barPct(t.commits,a.maxAuthorCommits()),"%"),s(2),nt(" active ",ct(13,11,t.firstCommit,"MMM d")," - ",ct(14,14,t.lastCommit,"MMM d, y")," ")}}function ae(o,e){if(o&1){let t=tt();i(0,"li")(1,"a",42),E("click",function(){let a=O(t).$implicit,m=_(2);return P(m.openFile(a.file))}),r(2),n(),i(3,"span",43),r(4),n(),i(5,"span",43),r(6),n(),i(7,"button",44),E("click",function(){let a=O(t).$implicit,m=_(2);return P(m.openBreakage(a.file))}),r(8," \u26A0 "),n(),i(9,"span",45),r(10),n()()}if(o&2){let t=e.$implicit;s(),u("title",t.file),s(),h(t.file),s(2),R("",t.commits," commits"),s(2),R("",t.authors," authors"),s(4),nt("+",t.additions," \u2212",t.deletions)}}function oe(o,e){if(o&1){let t=tt();i(0,"li")(1,"span",46),r(2),n(),i(3,"div",47)(4,"a",42),E("click",function(){let a=O(t).$implicit,m=_(2);return P(m.openFile(a.file))}),r(5),n(),i(6,"span",48),r(7),n()(),i(8,"div",49)(9,"div",50),y(10,"div",51),n(),i(11,"span",52),r(12),n()(),i(13,"div",53)(14,"span"),r(15),n(),i(16,"span"),r(17),n(),i(18,"span"),r(19),n()(),i(20,"button",54),E("click",function(){let a=O(t).$implicit,m=_(2);return P(m.openBreakage(a.file))}),r(21," \u26A0 Breakage "),n()()}if(o&2){let t=e.$implicit,d=e.index,a=_(2);Ct("risk-high",a.riskLevel(t.riskScore)==="high")("risk-medium",a.riskLevel(t.riskScore)==="medium")("risk-low",a.riskLevel(t.riskScore)==="low"),s(2),h(d+1),s(2),u("title",t.file),s(),h(t.file),s(2),h(t.reason),s(),z("aria-label","Risk score "+a.riskScore(t.riskScore)),s(2),et("width",a.riskPct(t.riskScore),"%"),s(2),h(a.riskScore(t.riskScore)),s(3),R("",t.commits," commits"),s(2),R("",t.authors," authors"),s(2),R("",t.churn," churn")}}function se(o,e){if(o&1){let t=tt();i(0,"div",10)(1,"section",11)(2,"button",12)(3,"span",13),r(4,"Commits analyzed"),n(),i(5,"strong"),r(6),n(),i(7,"span",14),r(8,"current insight window"),n()(),i(9,"button",12)(10,"span",13),r(11,"Contributors"),n(),i(12,"strong"),r(13),n(),i(14,"span",14),r(15),n()(),i(16,"button",15),E("click",function(){let a=O(t).ngIf,m=_();return P(m.openTopHotspot(a))}),i(17,"span",13),r(18,"Hotspots"),n(),i(19,"strong"),r(20),n(),i(21,"span",14),r(22,"click to open the top file"),n()(),i(23,"button",15),E("click",function(){let a=O(t).ngIf,m=_();return P(m.openTopRisk(a))}),i(24,"span",13),r(25,"Risk alerts"),n(),i(26,"strong"),r(27),n(),i(28,"span",14),r(29,"highest churn and ownership risk"),n()()(),i(30,"section",16)(31,"div",17)(32,"div")(33,"p",18),r(34,"Ownership"),n(),i(35,"h3"),r(36,"Top contributors"),n()(),i(37,"p",19),r(38,"Who touched this repo most in the current insight window."),n()(),i(39,"ul",20),S(40,re,15,17,"li",21),n()(),i(41,"section",22)(42,"div",17)(43,"div")(44,"p",18),r(45,"Change concentration"),n(),i(46,"h3"),r(47,"Hot files"),n()(),i(48,"p",19),r(49," Bigger boxes changed in more commits. Stronger color means more line churn. Click any file to open its history. "),n()(),i(50,"div",23)(51,"span")(52,"strong"),r(53,"Size"),n(),r(54," = commit frequency"),n(),i(55,"span")(56,"strong"),r(57,"Color"),n(),r(58," = additions + deletions"),n(),i(59,"span")(60,"strong"),r(61,"People"),n(),r(62," = number of authors touching it"),n()(),i(63,"app-hotspots-treemap",24),E("fileClick",function(a){O(t);let m=_();return P(m.openFile(a))}),n(),i(64,"ul",25),S(65,ae,11,6,"li",21),n()(),i(66,"section",26)(67,"div",17)(68,"div")(69,"p",18),r(70,"Review priority"),n(),i(71,"h3"),r(72,"Risky files"),n()(),i(73,"p",19),r(74," This is a triage signal, not a bug detector. Higher scores mean the file changed a lot, changed recently, and/or has several contributors. "),n()(),i(75,"div",27),y(76,"span",28),i(77,"span"),r(78,"Low"),n(),y(79,"span",29),i(80,"span"),r(81,"Medium"),n(),y(82,"span",30),i(83,"span"),r(84,"High"),n()(),i(85,"ul",31),S(86,oe,22,17,"li",32),n()(),i(87,"section",33)(88,"h3"),r(89,"Churn over time"),n(),y(90,"app-churn-chart",34),n()()}if(o&2){let t=e.ngIf,d=_();s(6),h(t.totalCommits),s(7),h(t.totalAuthors),s(2),h(d.topContributor(t)),s(5),h(t.hotspots.length),s(7),h(t.riskyFiles.length),s(13),u("ngForOf",t.topContributors),s(23),u("data",t.hotspots),s(2),u("ngForOf",t.hotspots.slice(0,5)),s(21),u("ngForOf",t.riskyFiles),s(4),u("data",t.churnByDay)}}var jt=class o{insightsApi=lt(Pt);router=lt(Ot);bundle=G(null);loading=G(!1);error=G(null);maxAuthorCommits=G(0);constructor(){kt(()=>{this.load()})}trackByDate(e,t){return t.date}barPct(e,t){return t>0?Math.round(e/t*100):0}initials(e){let t=e.trim().split(/\s+/).filter(Boolean);if(t.length===0)return"?";let d=t[0]?.[0]??"",a=t.length>1?t[t.length-1]?.[0]??"":t[0]?.[1]??"";return`${d}${a}`.toUpperCase()}avatarColor(e){let t=["#4f46e5","#06b6d4","#10b981","#f59e0b","#ef4444","#8b5cf6"];return t[e%t.length]}riskPct(e){return Math.max(4,Math.min(100,Math.round(e*100)))}riskScore(e){return this.riskPct(e).toString()}riskLevel(e){return e>=.67?"high":e>=.34?"medium":"low"}openFile(e){this.router.navigate(["/file",encodeURIComponent(e)])}openBreakage(e){this.router.navigate(["/file",encodeURIComponent(e)],{queryParams:{tab:"breakage"}})}topContributor(e){let t=e.topContributors[0];return t?t.author:"No author data"}openTopHotspot(e){let t=e.hotspots[0]?.file;t&&this.openFile(t)}openTopRisk(e){let t=e.riskyFiles[0]?.file;t&&this.openFile(t)}load(){this.loading.set(!0),this.error.set(null),this.insightsApi.bundle({maxCommits:500}).subscribe({next:e=>{this.bundle.set(e),this.maxAuthorCommits.set(e.topContributors[0]?.commits??0),this.loading.set(!1)},error:e=>{this.error.set(e?.error?.error??"Failed to load insights"),this.loading.set(!1)}})}static \u0275fac=function(t){return new(t||o)};static \u0275cmp=V({type:o,selectors:[["app-insights"]],decls:11,vars:4,consts:[[1,"page"],[1,"head"],[1,"eyebrow"],["class","sub",4,"ngIf"],["class","empty",4,"ngIf"],["class","empty error",4,"ngIf"],["class","grid",4,"ngIf"],[1,"sub"],[1,"empty"],[1,"empty","error"],[1,"grid"],[1,"kpis"],[1,"kpi"],[1,"label"],[1,"hint"],[1,"kpi",3,"click"],[1,"card","contributors-card"],[1,"section-head"],[1,"eyebrow","mini"],[1,"meaning"],["aria-label","Top contributors by commit count",1,"contributors"],[4,"ngFor","ngForOf"],[1,"card","wide","hotspot-card"],[1,"hotspot-help"],[3,"fileClick","data"],["aria-label","Top hot files",1,"hot-list","compact"],[1,"card","wide","risk-card"],[1,"risk-legend"],[1,"legend-dot","low"],[1,"legend-dot","medium"],[1,"legend-dot","high"],["aria-label","Risky files ranked by review priority",1,"risk-list"],[3,"risk-high","risk-medium","risk-low",4,"ngFor","ngForOf"],[1,"card","wide","chart-card"],[3,"data"],[1,"avatar"],[1,"contributor-main"],[1,"contributor-row"],[1,"name",3,"title"],[1,"contributor-bar"],[1,"contributor-fill"],[1,"active-range"],[1,"path",3,"click","title"],[1,"count"],["type","button","title","Open breakage analysis",1,"breakage-link","mini",3,"click"],[1,"churn"],[1,"rank"],[1,"risk-main"],[1,"reason"],[1,"risk-meter"],[1,"risk-track"],[1,"risk-fill"],[1,"risk-score"],[1,"risk-stats"],["type","button","title","Open breakage analysis for this file",1,"breakage-link",3,"click"]],template:function(t,d){t&1&&(i(0,"div",0)(1,"header",1)(2,"div")(3,"p",2),r(4,"Repository intelligence"),n(),i(5,"h2"),r(6,"Insights"),n()(),S(7,ee,4,10,"p",3),n(),S(8,ne,2,0,"div",4)(9,ie,2,1,"div",5)(10,se,91,10,"div",6),n()),t&2&&(s(7),u("ngIf",d.bundle()),s(),u("ngIf",d.loading()),s(),u("ngIf",d.error()),s(),u("ngIf",d.bundle()))},dependencies:[A,yt,it,at,rt,Mt,wt],styles:["[_nghost-%COMP%]{display:block;flex:1;min-height:0;overflow-y:auto}.page[_ngcontent-%COMP%]{padding:1.1rem 1.25rem 1.4rem;max-width:1320px;margin:0 auto}.head[_ngcontent-%COMP%]{display:flex;align-items:end;justify-content:space-between;gap:1rem;margin-bottom:1rem}.eyebrow[_ngcontent-%COMP%]{margin:0 0 .2rem;color:var(--accent);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.head[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0;font-size:clamp(20px,2vw,28px);letter-spacing:-.03em}.head[_ngcontent-%COMP%] .sub[_ngcontent-%COMP%]{margin:0;color:var(--fg-muted);font-size:13px}.empty[_ngcontent-%COMP%]{padding:2rem;color:var(--fg-muted);text-align:center}.empty.error[_ngcontent-%COMP%]{color:var(--danger)}.grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:1rem}.kpis[_ngcontent-%COMP%]{grid-column:1 / -1;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.75rem}.kpi[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:flex-start;gap:.25rem;padding:.85rem 1rem;color:var(--fg-primary);background:radial-gradient(circle at 85% 0%,color-mix(in oklab,var(--accent) 16%,transparent),transparent 44%),var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);cursor:pointer;text-align:left}.kpi[_ngcontent-%COMP%]:hover{border-color:color-mix(in oklab,var(--accent) 36%,var(--border-soft));box-shadow:var(--shadow-md)}.kpi[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px;text-transform:uppercase;letter-spacing:.05em}.kpi[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{font-size:24px;letter-spacing:-.04em}.kpi[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);padding:1rem 1.25rem;box-shadow:var(--shadow-sm)}.card.wide[_ngcontent-%COMP%]{grid-column:1 / -1}.card[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0 0 .75rem;font-size:14px}.section-head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:.7rem}.section-head[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;font-size:18px;letter-spacing:-.03em}.eyebrow.mini[_ngcontent-%COMP%]{margin-bottom:.1rem;font-size:10px;letter-spacing:.07em}.meaning[_ngcontent-%COMP%]{max-width:440px;margin:0;color:var(--fg-muted);font-size:12px;line-height:1.45;text-align:right}.hotspot-help[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:.75rem}.hotspot-help[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .55rem;border:1px solid var(--border-soft);border-radius:999px;background:color-mix(in oklab,var(--bg-surface) 78%,transparent);color:var(--fg-muted);font-size:11px}.hotspot-help[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--fg-primary);font-weight:700}.contributors-card[_ngcontent-%COMP%]{background:radial-gradient(circle at 88% 0%,color-mix(in oklab,var(--accent) 14%,transparent),transparent 38%),var(--bg-panel)}.contributors[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;display:grid;gap:.65rem}.contributors[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{display:grid;grid-template-columns:36px minmax(0,1fr);gap:.7rem;align-items:center;padding:.65rem;border:1px solid color-mix(in oklab,var(--border-soft) 72%,transparent);border-radius:var(--radius-md);background:color-mix(in oklab,var(--bg-surface) 62%,transparent);transition:border-color .12s,box-shadow .12s,transform .12s}.contributors[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover{border-color:color-mix(in oklab,var(--accent) 36%,var(--border-soft));box-shadow:var(--shadow-md);transform:translateY(-1px)}.avatar[_ngcontent-%COMP%]{--avatar-color: var(--accent);display:inline-grid;place-items:center;width:34px;height:34px;border-radius:999px;background:radial-gradient(circle at 30% 20%,rgba(255,255,255,.28),transparent 36%),var(--avatar-color);color:#fff;font-size:12px;font-weight:800;letter-spacing:.03em;box-shadow:0 0 0 2px color-mix(in oklab,var(--bg-surface) 78%,transparent)}.contributor-main[_ngcontent-%COMP%]{min-width:0;display:grid;gap:.28rem}.contributor-row[_ngcontent-%COMP%]{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem}.name[_ngcontent-%COMP%]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--fg-primary);font-size:13px;font-weight:600}.contributor-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{flex:0 0 auto;color:var(--fg-primary);font-size:12px;font-variant-numeric:tabular-nums}.contributor-bar[_ngcontent-%COMP%]{height:8px;border-radius:999px;overflow:hidden;background:var(--bg-surface-2);border:1px solid color-mix(in oklab,var(--border-soft) 68%,transparent)}.contributor-fill[_ngcontent-%COMP%]{height:100%;background:linear-gradient(90deg,var(--accent),#06b6d4)}.active-range[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.hot-list[_ngcontent-%COMP%], .risk-list[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0}.hot-list.compact[_ngcontent-%COMP%]{margin-top:.75rem;max-height:168px;overflow-y:auto;border:1px solid color-mix(in oklab,var(--border-soft) 72%,transparent);border-radius:var(--radius-md);background:color-mix(in oklab,var(--bg-surface) 58%,transparent)}.hot-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1fr) auto auto auto;gap:.6rem;align-items:center;padding:.55rem .7rem;border-bottom:1px solid color-mix(in oklab,var(--border-soft) 50%,transparent);font-size:12px}.hot-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:last-child, .risk-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:last-child{border-bottom:0}.path[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);color:var(--accent);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.path[_ngcontent-%COMP%]:hover{text-decoration:underline}.count[_ngcontent-%COMP%], .churn[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px}.risk-card[_ngcontent-%COMP%]{background:radial-gradient(circle at 96% 0%,color-mix(in oklab,var(--danger) 12%,transparent),transparent 34%),var(--bg-panel)}.risk-legend[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.4rem;margin-bottom:.75rem;padding:.28rem .55rem;border:1px solid var(--border-soft);border-radius:999px;background:color-mix(in oklab,var(--bg-surface) 72%,transparent);color:var(--fg-muted);font-size:11px}.legend-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:999px}.legend-dot.low[_ngcontent-%COMP%]{background:var(--success)}.legend-dot.medium[_ngcontent-%COMP%]{background:var(--warning)}.legend-dot.high[_ngcontent-%COMP%]{background:var(--danger)}.risk-list[_ngcontent-%COMP%]{display:grid;gap:.65rem}.risk-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{display:grid;grid-template-columns:28px minmax(0,1fr) minmax(160px,220px) auto auto;gap:.85rem;align-items:center;padding:.75rem;border:1px solid color-mix(in oklab,var(--border-soft) 72%,transparent);border-radius:var(--radius-md);background:color-mix(in oklab,var(--bg-surface) 66%,transparent);box-shadow:var(--shadow-sm);transition:border-color .12s,box-shadow .12s,transform .12s}.breakage-link[_ngcontent-%COMP%]{background:transparent;border:1px solid var(--border-soft);color:var(--fg-muted);font-size:11px;padding:.25rem .55rem;border-radius:999px;cursor:pointer;white-space:nowrap;transition:color .12s,border-color .12s,background .12s}.breakage-link[_ngcontent-%COMP%]:hover{color:var(--danger, #dc2626);border-color:color-mix(in oklab,var(--danger, #dc2626) 50%,transparent);background:color-mix(in oklab,var(--danger, #dc2626) 10%,transparent)}.breakage-link.mini[_ngcontent-%COMP%]{padding:.1rem .35rem;font-size:12px;line-height:1}.risk-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover{border-color:color-mix(in oklab,var(--accent) 36%,var(--border-soft));box-shadow:var(--shadow-md);transform:translateY(-1px)}.rank[_ngcontent-%COMP%]{display:inline-grid;place-items:center;width:24px;height:24px;border-radius:999px;background:var(--bg-surface-2);color:var(--fg-muted);font-size:11px;font-weight:700;font-variant-numeric:tabular-nums}.risk-main[_ngcontent-%COMP%]{min-width:0;display:grid;gap:.25rem}.risk-meter[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1fr) 42px;align-items:center;gap:.55rem}.risk-track[_ngcontent-%COMP%]{position:relative;height:12px;border-radius:999px;overflow:hidden;background:linear-gradient(90deg,color-mix(in oklab,var(--success) 24%,transparent) 0 33%,color-mix(in oklab,var(--warning) 26%,transparent) 33% 66%,color-mix(in oklab,var(--danger) 28%,transparent) 66% 100%);border:1px solid color-mix(in oklab,var(--border-soft) 70%,transparent)}.risk-fill[_ngcontent-%COMP%]{height:100%;border-radius:inherit;background:linear-gradient(90deg,var(--success),var(--warning),var(--danger))}.risk-score[_ngcontent-%COMP%]{font-size:13px;font-weight:800;color:var(--fg-primary);text-align:right;font-variant-numeric:tabular-nums}.risk-stats[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.35rem;min-width:150px}.risk-stats[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{padding:.18rem .45rem;border-radius:999px;background:var(--bg-surface-2);color:var(--fg-muted);font-size:11px;white-space:nowrap}.reason[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px}.risk-high[_ngcontent-%COMP%] .rank[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--danger) 18%,transparent);color:var(--danger)}.risk-medium[_ngcontent-%COMP%] .rank[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--warning) 18%,transparent);color:var(--warning)}.risk-low[_ngcontent-%COMP%] .rank[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--success) 16%,transparent);color:var(--success)}@media (max-width: 900px){.section-head[_ngcontent-%COMP%]{flex-direction:column}.meaning[_ngcontent-%COMP%]{text-align:left}.risk-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{grid-template-columns:28px minmax(0,1fr)}.risk-meter[_ngcontent-%COMP%], .risk-stats[_ngcontent-%COMP%], .breakage-link[_ngcontent-%COMP%]{grid-column:2}.risk-stats[_ngcontent-%COMP%]{justify-content:flex-start}.breakage-link[_ngcontent-%COMP%]{justify-self:start}}"],changeDetection:0})};export{jt as InsightsComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as w}from"./chunk-VGAHCEAA.js";import{a as G}from"./chunk-STUSEB5P.js";import{c as A,e as q}from"./chunk-PXNKNORB.js";import{a as U}from"./chunk-6DL2ZTKG.js";import{$ as C,Hb as V,Ib as b,Kb as a,Lb as c,Mb as u,Nb as T,Ob as H,Pb as $,Qa as r,Wb as y,Za as M,Zb as k,a as D,b as z,cb as m,cc as O,dc as R,ea as v,fa as x,lb as F,oa as g,ob as s,pb as i,pc as P,qb as n,qc as S,rb as B,sc as j,tc as I,vb as N,wb as L,xb as h,yb as f,zb as d}from"./chunk-UM7ESEXJ.js";function Y(t,o){t&1&&(i(0,"div",3),a(1,"Loading blame\u2026"),n())}function Z(t,o){if(t&1&&(i(0,"div",4),a(1),n()),t&2){let e=o.ngIf;r(),c(e)}}function ee(t,o){t&1&&(i(0,"div",3),a(1," No blame data (file may be binary or freshly created). "),n())}function te(t,o){if(t&1){let e=h();i(0,"div",7)(1,"div",8)(2,"code",9),f("click",function(){let p=v(e).$implicit,_=d(2);return x(_.onSelectCommit(p.hash))}),a(3),n(),i(4,"span",10),a(5),n(),i(6,"span",11),a(7),n()(),i(8,"span",12),a(9),n(),i(10,"pre",13),a(11),n()()}if(t&2){let e=o.$implicit,l=d(2);r(),b("invisible",!e.isFirstOfBlock),r(2),c(e.hash.slice(0,7)),r(2),c(e.author),r(2),c(l.shortDate(e.date)),r(2),c(e.line),r(2),c(e.content)}}function ne(t,o){if(t&1&&(i(0,"div",5),m(1,te,12,7,"div",6),n()),t&2){let e=d();r(),s("ngForOf",e.rows())("ngForTrackBy",e.trackByLine)}}var E=class t{gitService=C(w);set file(o){this._file=o,o?this.load(o):this.lines.set([])}get file(){return this._file}_file=null;onCommitClick=null;lines=g([]);loading=g(!1);error=g(null);rows=O(()=>{let o=[],e="";for(let l of this.lines())o.push(z(D({},l),{isFirstOfBlock:l.hash!==e})),e=l.hash;return o});trackByLine(o,e){return e.line}shortDate(o){return(o||"").slice(0,10)}onSelectCommit(o){this.onCommitClick&&this.onCommitClick(o)}load(o){this.loading.set(!0),this.error.set(null),this.gitService.getBlame(o).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||t)};static \u0275cmp=M({type:t,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,l){e&1&&m(0,Y,2,0,"div",0)(1,Z,2,1,"div",1)(2,ee,2,0,"div",0)(3,ne,2,2,"div",2),e&2&&(s("ngIf",l.loading()),r(),s("ngIf",l.error()),r(),s("ngIf",!l.loading()&&!l.error()&&l.rows().length===0&&l.file),r(),s("ngIf",l.rows().length>0))},dependencies:[I,P,S],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 ie(t,o){if(t&1&&(i(0,"div",11)(1,"span"),a(2),n(),i(3,"span"),a(4,"\xB7"),n(),i(5,"span"),a(6),n(),i(7,"span"),a(8,"\xB7"),n(),i(9,"span"),a(10),y(11,"slice"),n(),i(12,"span"),a(13,"\xB7"),n(),i(14,"span"),a(15),y(16,"slice"),n()()),t&2){let e=o.ngIf;r(2),u("",e.totalCommits," commits"),r(4),u("",e.contributors.length," contributors"),r(4),u("first: ",k(11,4,e.firstSeen,0,10)),r(5),u("last: ",k(16,8,e.lastTouched,0,10))}}function oe(t,o){t&1&&(i(0,"div",17),a(1,"Loading commits\u2026"),n())}function re(t,o){if(t&1&&(i(0,"div",18),a(1),n()),t&2){let e=o.ngIf;r(),c(e)}}function ae(t,o){if(t&1){let e=h();i(0,"li",19),f("click",function(){let p=v(e).$implicit,_=d(2);return x(_.onSelectCommit(p.hash))}),i(1,"code",20),a(2),n(),i(3,"div",21)(4,"span",22),a(5),n(),i(6,"span",23),a(7),y(8,"slice"),n()()()}if(t&2){let e=o.$implicit,l=d(2);b("selected",e.hash===l.state.selectedHash()),r(2),c(e.shortHash),r(3),c(e.subject),r(2),T("",e.author," \xB7 ",k(8,6,e.date,0,10))}}function le(t,o){if(t&1&&(i(0,"section",12),m(1,oe,2,0,"div",13)(2,re,2,1,"div",14),i(3,"ul",15),m(4,ae,9,10,"li",16),n()()),t&2){let e=d();r(),s("ngIf",e.loading()),r(),s("ngIf",e.error()),r(2),s("ngForOf",e.commits())}}function se(t,o){if(t&1&&(i(0,"section",24),B(1,"app-blame",25),n()),t&2){let e=d();r(),s("file",e.filePath())("onCommitClick",e.onSelectCommit.bind(e))}}function ce(t,o){t&1&&(i(0,"div",17),a(1,"Analyzing breakage history\u2026"),n())}function me(t,o){if(t&1&&(i(0,"div",18),a(1),n()),t&2){let e=o.ngIf;r(),c(e)}}function de(t,o){t&1&&(i(0,"span"),a(1,"\xB7"),n())}function pe(t,o){if(t&1&&(i(0,"span")(1,"strong"),a(2),n(),a(3),n()),t&2){let e=d().ngIf;r(2),c(e.suspects.length),r(),u(" suspect",e.suspects.length===1?"":"s")}}function ge(t,o){t&1&&(i(0,"div",46),a(1," No prior change is strongly correlated with a recent fix. "),n())}function _e(t,o){if(t&1&&(i(0,"li"),a(1),n()),t&2){let e=o.$implicit;r(),c(e)}}function fe(t,o){t&1&&(i(0,"span"),a(1,", "),n())}function ue(t,o){if(t&1){let e=h();i(0,"a",57),f("click",function(p){let _=v(e).$implicit,K=d(6);return p.stopPropagation(),x(K.onSelectCommit(_.hash))}),i(1,"code"),a(2),n(),m(3,fe,2,0,"span",27),n()}if(t&2){let e=o.$implicit,l=o.last;r(2),c(e.shortHash),r(),s("ngIf",!l)}}function ve(t,o){if(t&1&&(i(0,"div",55),a(1),m(2,ue,4,2,"a",56),n()),t&2){let e=d().$implicit;r(),u(" Linked fix",e.linkedFixes.length===1?"":"es",": "),r(),s("ngForOf",e.linkedFixes)}}function xe(t,o){if(t&1){let e=h();i(0,"li",49),f("click",function(){let p=v(e).$implicit,_=d(4);return x(_.onSelectCommit(p.hash))}),i(1,"div",50)(2,"code",20),a(3),n(),i(4,"span",51),a(5),n(),i(6,"span",22),a(7),n()(),i(8,"div",23),a(9),y(10,"slice"),n(),i(11,"ul",52),m(12,_e,2,1,"li",53),n(),m(13,ve,3,2,"div",54),n()}if(t&2){let e=o.$implicit;r(3),c(e.shortHash),r(),F("data-strong",e.score>=8?"true":"false"),r(),c(e.score),r(2),c(e.subject),r(2),H(" ",e.author," \xB7 ",k(10,9,e.date,0,10)," \xB7 ",e.churn," lines changed "),r(3),s("ngForOf",e.reasons),r(),s("ngIf",e.linkedFixes.length)}}function he(t,o){if(t&1&&(i(0,"ol",47),m(1,xe,14,13,"li",48),n()),t&2){let e=d().ngIf;r(),s("ngForOf",e.suspects)}}function be(t,o){t&1&&(i(0,"div",46),a(1," No fix/revert commits matched recent history. "),n())}function Ce(t,o){t&1&&(i(0,"span",62),a(1,"revert"),n())}function ye(t,o){t&1&&(i(0,"span",63),a(1,"fix"),n())}function ke(t,o){if(t&1){let e=h();i(0,"li",19),f("click",function(){let p=v(e).$implicit,_=d(4);return x(_.onSelectCommit(p.hash))}),i(1,"code",20),a(2),n(),i(3,"div",21)(4,"span",22),m(5,Ce,2,0,"span",60)(6,ye,2,0,"span",61),a(7),n(),i(8,"span",23),a(9),y(10,"slice"),n()()()}if(t&2){let e=o.$implicit;b("revert",e.isRevert),r(2),c(e.shortHash),r(3),s("ngIf",e.isRevert),r(),s("ngIf",e.isFix),r(),u(" ",e.subject," "),r(2),H("",e.author," \xB7 ",k(10,9,e.date,0,10)," \xB7 ",e.churn," lines")}}function Me(t,o){if(t&1&&(i(0,"ul",58),m(1,ke,11,13,"li",59),n()),t&2){let e=d().ngIf;r(),s("ngForOf",e.fixCommits)}}function Oe(t,o){if(t&1){let e=h();i(0,"li",66),f("click",function(){let p=v(e).$implicit,_=d(4);return x(_.openFile(p.file))}),i(1,"span",67),a(2),n(),i(3,"span",68),a(4),n()()}if(t&2){let e=o.$implicit;r(2),c(e.file),r(2),u("",e.count,"\xD7")}}function Pe(t,o){if(t&1&&(i(0,"article",37)(1,"header",38)(2,"h3"),a(3,"Often changed together"),n(),i(4,"span",39),a(5,"From recent fixes & suspects"),n()(),i(6,"ul",64),m(7,Oe,5,2,"li",65),n()()),t&2){let e=d().ngIf;r(7),s("ngForOf",e.coChangedFiles)}}function Se(t,o){t&1&&(i(0,"span",63),a(1,"fix"),n())}function Ie(t,o){t&1&&(i(0,"span",62),a(1,"revert"),n())}function we(t,o){if(t&1){let e=h();i(0,"li",19),f("click",function(){let p=v(e).$implicit,_=d(3);return x(_.onSelectCommit(p.hash))}),i(1,"code",20),a(2),n(),i(3,"div",21)(4,"span",22),m(5,Se,2,0,"span",61)(6,Ie,2,0,"span",60),a(7),n(),i(8,"span",23),a(9),y(10,"slice"),n()()()}if(t&2){let e=o.$implicit;b("is-fix",e.isFix||e.isRevert),r(2),c(e.shortHash),r(3),s("ngIf",e.isFix),r(),s("ngIf",e.isRevert),r(),u(" ",e.subject," "),r(2),$("",e.author," \xB7 ",k(10,10,e.date,0,10)," \xB7 +",e.additions,"/-",e.deletions)}}function Ee(t,o){if(t&1&&(N(0),i(1,"div",28)(2,"div",29),B(3,"div",30),n(),i(4,"div",31)(5,"span",32),a(6),n(),i(7,"span",33),a(8),n()(),i(9,"p",34),a(10),n(),i(11,"div",35)(12,"span")(13,"strong"),a(14),n(),a(15," recent touches"),n(),i(16,"span"),a(17,"\xB7"),n(),i(18,"span")(19,"strong"),a(20),n(),a(21," fixes/reverts"),n(),m(22,de,2,0,"span",27)(23,pe,4,2,"span",27),n()(),i(24,"div",36)(25,"article",37)(26,"header",38)(27,"h3"),a(28,"Likely culprits"),n(),i(29,"span",39),a(30,"Scored by proximity to fix commits"),n()(),m(31,ge,2,0,"div",40)(32,he,2,1,"ol",41),n(),i(33,"article",37)(34,"header",38)(35,"h3"),a(36,"Fixes & reverts on this file"),n(),i(37,"span",39),a(38),n()(),m(39,be,2,0,"div",40)(40,Me,2,1,"ul",42),n(),m(41,Pe,8,1,"article",43),i(42,"article",37)(43,"header",38)(44,"h3"),a(45,"Recent commits"),n(),i(46,"span",39),a(47),n()(),i(48,"ul",44),m(49,we,11,14,"li",45),n()()(),L()),t&2){let e=o.ngIf,l=d(2);r(),F("data-level",l.riskLevel()),r(2),V("width",e.riskScore,"%"),r(3),u("",e.riskScore,"/100"),r(2),u("",l.riskLevel()," breakage risk"),r(2),c(e.summary),r(4),c(e.commits.length),r(6),c(e.fixCount),r(2),s("ngIf",e.suspects.length),r(),s("ngIf",e.suspects.length),r(8),s("ngIf",!e.suspects.length),r(),s("ngIf",e.suspects.length),r(6),T("",e.fixCount," of ",e.commits.length," recent commits"),r(),s("ngIf",!e.fixCommits.length),r(),s("ngIf",e.fixCommits.length),r(),s("ngIf",e.coChangedFiles.length),r(6),u("Last ",e.commits.length," touches"),r(2),s("ngForOf",e.commits)}}function Fe(t,o){if(t&1&&(i(0,"section",26),m(1,ce,2,0,"div",13)(2,me,2,1,"div",14)(3,Ee,50,19,"ng-container",27),n()),t&2){let e=d();r(),s("ngIf",e.breakageLoading()),r(),s("ngIf",e.breakageError()),r(),s("ngIf",e.breakage())}}var J=class t{route=C(A);router=C(q);git=C(w);insightsApi=C(U);state=C(G);filePath=g("");stats=g(null);commits=g([]);loading=g(!1);error=g(null);tab=g("history");breakage=g(null);breakageLoading=g(!1);breakageError=g(null);riskLevel=O(()=>{let o=this.breakage()?.riskScore??0;return o>=60?"high":o>=30?"moderate":"low"});constructor(){R(()=>{let o=this.route.snapshot.paramMap.get("path")??"",e=decodeURIComponent(o),l=this.route.snapshot.queryParamMap.get("tab");(l==="breakage"||l==="blame"||l==="history")&&this.tab.set(l),this.filePath.set(e),e&&this.load(e)})}onSelectCommit(o){this.state.selectHash(o),this.router.navigate(["/"],{queryParams:{commit:o}})}goBack(){this.router.navigate(["/"])}onSelectBreakageTab(){this.tab.set("breakage"),!this.breakage()&&!this.breakageLoading()&&this.loadBreakage(this.filePath())}openFile(o){o&&this.router.navigate(["/file",encodeURIComponent(o)])}load(o){this.loading.set(!0),this.error.set(null),this.breakage.set(null),this.breakageError.set(null),this.insightsApi.fileStats(o).subscribe({next:e=>this.stats.set(e),error:()=>this.stats.set(null)}),this.git.getCommits({file:o,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)}}),this.tab()==="breakage"&&this.loadBreakage(o)}loadBreakage(o){o&&(this.breakageLoading.set(!0),this.breakageError.set(null),this.insightsApi.breakage(o).subscribe({next:e=>{this.breakage.set(e),this.breakageLoading.set(!1)},error:e=>{this.breakageError.set(e?.error?.error??"Failed to analyze breakage"),this.breakageLoading.set(!1)}}))}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=M({type:t,selectors:[["app-file-history"]],decls:18,vars:11,consts:[[1,"page"],[1,"head"],[1,"btn","btn-ghost",3,"click"],[1,"title-block"],["class","meta",4,"ngIf"],[1,"tabs"],[1,"tab",3,"click"],["title","Heuristic analysis of recent fixes/reverts and likely culprits.",1,"tab",3,"click"],["class","history",4,"ngIf"],["class","blame-tab",4,"ngIf"],["class","breakage","data-testid","breakage-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"],["data-testid","breakage-tab",1,"breakage"],[4,"ngIf"],[1,"risk-card"],["aria-hidden","true",1,"risk-meter"],[1,"risk-meter-fill"],[1,"risk-meta"],[1,"risk-score"],[1,"risk-label"],[1,"summary"],[1,"risk-stats"],[1,"cards"],[1,"card"],[1,"card-head"],[1,"hint"],["class","empty inline",4,"ngIf"],["class","suspects",4,"ngIf"],["class","fixes",4,"ngIf"],["class","card",4,"ngIf"],[1,"recent"],["class","commit",3,"is-fix","click",4,"ngFor","ngForOf"],[1,"empty","inline"],[1,"suspects"],["class","suspect",3,"click",4,"ngFor","ngForOf"],[1,"suspect",3,"click"],[1,"suspect-row"],[1,"score"],[1,"reasons"],[4,"ngFor","ngForOf"],["class","linked",4,"ngIf"],[1,"linked"],["class","link",3,"click",4,"ngFor","ngForOf"],[1,"link",3,"click"],[1,"fixes"],["class","commit",3,"revert","click",4,"ngFor","ngForOf"],["class","tag",4,"ngIf"],["class","tag fix",4,"ngIf"],[1,"tag"],[1,"tag","fix"],[1,"cochanged"],[3,"click",4,"ngFor","ngForOf"],[3,"click"],[1,"path"],[1,"count"]],template:function(e,l){e&1&&(i(0,"div",0)(1,"header",1)(2,"button",2),f("click",function(){return l.goBack()}),a(3,"\u2190 Back"),n(),i(4,"div",3)(5,"h2"),a(6),n(),m(7,ie,17,12,"div",4),n()(),i(8,"nav",5)(9,"button",6),f("click",function(){return l.tab.set("history")}),a(10," History "),n(),i(11,"button",6),f("click",function(){return l.tab.set("blame")}),a(12," Blame "),n(),i(13,"button",7),f("click",function(){return l.onSelectBreakageTab()}),a(14," Breakage Analysis "),n()(),m(15,le,5,3,"section",8)(16,se,2,2,"section",9)(17,Fe,4,3,"section",10),n()),e&2&&(r(6),c(l.filePath()),r(),s("ngIf",l.stats()),r(2),b("active",l.tab()==="history"),r(2),b("active",l.tab()==="blame"),r(2),b("active",l.tab()==="breakage"),r(2),s("ngIf",l.tab()==="history"),r(),s("ngIf",l.tab()==="blame"),r(),s("ngIf",l.tab()==="breakage"))},dependencies:[I,P,S,E,j],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}.breakage[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1rem}.risk-card[_ngcontent-%COMP%]{padding:1rem 1.1rem;border:1px solid var(--border-soft);border-radius:var(--radius-lg);background:var(--bg-panel);box-shadow:var(--shadow-sm);display:flex;flex-direction:column;gap:.55rem}.risk-meter[_ngcontent-%COMP%]{width:100%;height:8px;background:var(--bg-elevated);border-radius:999px;overflow:hidden}.risk-meter-fill[_ngcontent-%COMP%]{height:100%;background:var(--accent);transition:width .3s ease}.risk-card[data-level=high][_ngcontent-%COMP%] .risk-meter-fill[_ngcontent-%COMP%]{background:var(--danger, #dc2626)}.risk-card[data-level=moderate][_ngcontent-%COMP%] .risk-meter-fill[_ngcontent-%COMP%]{background:var(--warning, #d97706)}.risk-card[data-level=low][_ngcontent-%COMP%] .risk-meter-fill[_ngcontent-%COMP%]{background:var(--success, #16a34a)}.risk-meta[_ngcontent-%COMP%]{display:flex;gap:.6rem;align-items:baseline;font-size:13px}.risk-score[_ngcontent-%COMP%]{font-weight:700;font-family:var(--font-mono, monospace)}.risk-label[_ngcontent-%COMP%]{color:var(--fg-muted);text-transform:capitalize}.summary[_ngcontent-%COMP%]{margin:0;font-size:13px;line-height:1.5}.risk-stats[_ngcontent-%COMP%]{display:flex;gap:.4rem;flex-wrap:wrap;font-size:12px;color:var(--fg-muted)}.risk-stats[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--fg);font-weight:600}.cards[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(360px,1fr));gap:1rem}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);padding:.85rem;display:flex;flex-direction:column;gap:.6rem;min-width:0}.card-head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:baseline;gap:.5rem}.card-head[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;font-size:13px;font-weight:600}.hint[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted)}.empty.inline[_ngcontent-%COMP%]{padding:.75rem;font-size:12px}.suspects[_ngcontent-%COMP%], .fixes[_ngcontent-%COMP%], .recent[_ngcontent-%COMP%], .cochanged[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.4rem}.suspect[_ngcontent-%COMP%]{padding:.55rem .7rem;border:1px solid var(--border-soft);border-radius:var(--radius-md);cursor:pointer;background:var(--bg-elevated)}.suspect[_ngcontent-%COMP%]:hover{border-color:var(--accent)}.suspect-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;min-width:0}.suspect-row[_ngcontent-%COMP%] .subject[_ngcontent-%COMP%]{font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.score[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);font-size:11px;padding:1px 6px;border-radius:999px;background:var(--accent-soft);color:var(--accent);font-weight:700}.score[data-strong=true][_ngcontent-%COMP%]{background:color-mix(in oklab,var(--danger, #dc2626) 18%,transparent);color:var(--danger, #dc2626)}.reasons[_ngcontent-%COMP%]{list-style:none;margin:.35rem 0 0;padding:0;display:flex;flex-wrap:wrap;gap:.3rem}.reasons[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted);padding:1px 6px;border-radius:6px;background:var(--bg-panel);border:1px solid var(--border-soft)}.linked[_ngcontent-%COMP%]{margin-top:.35rem;font-size:11px;color:var(--fg-muted)}.linked[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{cursor:pointer;color:var(--accent)}.linked[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace)}.tag[_ngcontent-%COMP%]{display:inline-block;font-size:10px;text-transform:uppercase;letter-spacing:.04em;padding:1px 5px;border-radius:4px;background:var(--bg-elevated);color:var(--fg-muted);margin-right:.25rem;vertical-align:middle}.tag.fix[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 18%,transparent);color:var(--accent)}.commit.revert[_ngcontent-%COMP%] .tag[_ngcontent-%COMP%], .commit.is-fix[_ngcontent-%COMP%] .tag.fix[_ngcontent-%COMP%]{font-weight:600}.cochanged[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:.5rem;padding:.4rem .6rem;border-radius:var(--radius-md);cursor:pointer;font-size:12px}.cochanged[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover{background:var(--bg-elevated)}.cochanged[_ngcontent-%COMP%] .path[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.cochanged[_ngcontent-%COMP%] .count[_ngcontent-%COMP%]{color:var(--fg-muted);flex-shrink:0}"],changeDetection:0})};export{J as FileHistoryComponent};
|