1import{a as ut}from"./chunk-UT5RZ5SN.js";import{c as Uo}from"./chunk-OBZUIDEP.js";import{a as Vo}from"./chunk-OHSAYPPM.js";import{a as zo}from"./chunk-SP6WZPWS.js";import{a as Lo,b as Un}from"./chunk-NE22VKN5.js";import{a as qo,b as Hn}from"./chunk-64WGMCQL.js";import{a as Va,b as Ut}from"./chunk-EU3YAAEQ.js";import{a as La,b as zt}from"./chunk-DBNHDKST.js";import{a as Ro}from"./chunk-HEWARKUE.js";import{b as _o,c as zn,d as ht}from"./chunk-TP3A6IN2.js";import{$ as Oo,R as ko,S as To,T as Io,V as Mo,W as Do,X as Fo,Z as Po,_ as Ao,aa as No,ba as Bo}from"./chunk-XNFXA3ZT.js";import{a as Ze,b as Ae}from"./chunk-TEFEWVO6.js";import{q as Wo}from"./chunk-QH3IRCHN.js";import{b as Co}from"./chunk-FSUBAQYH.js";import{$c as cn,$e as vn,$f as kn,$g as So,Ac as tt,Ae as Cr,Ag as po,Bb as qa,Bc as an,Be as _r,Bg as xo,Cc as tr,Ce as kr,Cg as ho,D as Q,Db as et,Dc as rn,De as lt,Ec as nr,Ee as bn,Fb as Se,Gb as za,Gd as cr,Gf as Lr,Gg as uo,Hb as Ht,Hd as Be,Hf as qr,Ib as Ua,If as Vr,Ig as go,Ja as Da,Jb as Ha,Jf as zr,Jg as Dn,Ka as Fa,Kb as J,Kg as fo,La as Pa,Lb as ja,Lg as Fn,Ma as Aa,Mb as le,Mg as Pn,Na as St,Ng as An,Ob as Ga,Pc as on,Qc as ir,Rc as nt,Rf as st,Sc as it,Sf as Cn,Sg as bo,Tc as ar,Te as Tr,Tf as Ur,Tg as On,Uc as rr,Ue as Ir,Uf as Hr,Ug as Nn,Vb as Y,Vc as ln,Ve as Mr,Vf as jr,Vg as Bn,Wb as ae,Wc as sn,We as Dr,Wf as _n,Wg as ct,Xb as z,Xc as at,Xe as Sn,Xf as Gr,Xg as pt,Yc as dn,Ye as En,Yg as xt,Zc as rt,Ze as Fr,Zf as $r,Zg as Wn,_c as mn,_e as Pr,_f as dt,_g as Rn,ac as jt,ad as or,ae as pr,af as Vi,ag as Tn,ah as Eo,b as be,bc as Gt,bd as lr,be as xr,bf as yn,bg as mt,bh as Ln,cc as Oe,cd as sr,cf as Ar,cg as In,ch as vo,d as U,dc as $t,dd as pn,df as Or,dg as Mn,dh as qn,e as fa,eb as Nt,ed as dr,ef as Nr,eg as Kr,fb as Bt,fc as $a,fd as xn,ff as Br,fg as Xr,g as ba,gd as mr,gf as Wr,gh as yo,h as Sa,hc as Ka,hd as hn,hf as wn,hh as Vn,ic as Xa,ie as hr,if as Rr,ig as Yr,j as Wi,jb as Oa,jc as Kt,je as ur,jg as Qr,k as H,kb as Na,kc as Xt,kd as Ne,ke as gr,kg as Jr,kh as wo,l as Ea,lc as Yt,lg as Zr,mb as Ba,mc as Qt,me as fr,mg as eo,nb as Wt,ne as br,ng as to,o as va,oe as un,og as no,pg as io,qc as Ya,qe as We,qg as ao,rc as Jt,re as Sr,sc as Qa,se as ot,t as ya,tb as Rt,tc as Zt,te as Er,tg as ro,u as Fe,ub as Lt,uc as Ja,ug as oo,v as Pe,va as Ot,vb as Wa,vc as en,ve as gn,vg as lo,wb as qt,wc as Za,we as vr,wg as so,xb as ye,xc as tn,xe as yr,xg as mo,yb as Vt,yc as er,ye as fn,yg as co,zb as Ra,zc as nn,ze as wr}from"./chunk-X5J6QTCG.js";import{$ as je,$a as v,$b as Tt,Aa as kt,Ac as Ke,Ad as Ri,Cc as pa,Db as ue,Eb as W,Fa as i,Fb as j,Gb as te,Hb as ne,Ib as e,Jb as p,Ka as A,Kb as f,Ke as ka,Lb as q,Lc as It,Ma as b,Mb as Ve,Mc as Me,Na as Ge,Nc as Xe,Oc as xa,Pc as ha,Qa as la,Qb as T,Qc as ua,Ra as sa,Rb as I,Sa as k,Sb as M,Sc as De,U as Ct,Vd as Qe,Xa as pe,Yb as ca,Yc as Ye,Zb as Bi,Zd as ce,_ as ia,_c as ga,aa,ac as Ie,ad as D,bb as y,be as oe,ca as _t,cb as da,cc as V,ce as Ft,d as He,db as K,dc as ie,di as Ia,eb as S,fa as w,fb as E,fg as Pt,ga as C,gb as m,gg as Li,ha as ra,hb as n,hg as Ta,ia as oa,ib as t,ig as At,jb as c,jg as qi,kg as Je,lc as L,mc as ze,nb as O,nc as G,ob as N,pb as de,pj as R,qb as B,qc as fe,ri as Ma,sa as Ni,sb as g,ta as Ce,tb as u,td as wa,ub as ke,vb as Te,vd as Ca,wb as ma,wd as Mt,xb as $e,xd as Dt,yb as xe,yd as $,z as na,zb as he,zd as _a}from"./chunk-SMW7PHYX.js";import{a as bt,b as ta}from"./chunk-BMIYOSOG.js";var Ho=(()=>{let r=class r{constructor(d){this.siteDataService=d}ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-landing-page"]],standalone:!1,decls:10,vars:0,consts:[[1,""],[2,"font-family","'Courier New', Courier, monospace"]],template:function(s,o){s&1&&(n(0,"div",0),e(1,` 2 `),n(2,"h1"),e(3,"Style guide"),t(),e(4,` 3 `),c(5,"hr"),e(6,` 4 `),n(7,"pre",1),e(8,` WKxlllcllllllllllcclllccccclllllllllcccccccllcccclllllllllclloONW 5 WKdllllccllllllllllllllcccccccccllcccclcccccllllcclllllllllllllokN 6 NkllllllclllllllllllllllloddxxkkkkkkkxxxddoolllcccllllllllllcllloKW 7 NkllclllcclllllllllloxO0KXNWWWWWWWWWWWWWWNNXK0Okdollllllllllclllo0W 8 NklllllccllcclllldkKNWW WNX0Oxollllcllcclo0W 9 NkllllllllllccldOXW WWXOdlclllcclo0W 10 NkllllllllclllkXW WKxlclllcclo0W 11 NklllllllllclkN W0dlcclllcclo0W 12 NkllllllllclxX WWWWWWW WXkollclcclcclo0W 13 Nkllllllllco0W NOxddddxxkkO0XNW W0dlclclllllcclo0W 14 NkllllllllcoK XxolllcccccllodxOKNWNOolllllcllclcclo0W 15 NkllllllllcoK WNXK00Okxddolllclldxdlccllcccllclcclo0W 16 NkllllllllclOW WWWNXKK0kxdollcccllcclclllcclo0W 17 NklllllllllldKW WWNXKOxollcclcclllcclo0W 18 Nkllllllllclld0N WX0xolcllcllcclo0W 19 NkllllllllllcloxKNW WKkolccllcclo0W 20 NklllllllllllcccldkKXWW NOoclllcclo0W 21 Nklllllllllccccllccloxk0KXNWW Nkllllcclo0W 22 NkllllllllcllllclodolllllodxkOO0KKXNWW WK
22dcllcclo0W 23 NklllllllllccllokXNX0kdlllcclllllloodxOKN Xdcllcclo0W 24 NklcllllllllllxKW WNK0kxdolllllllllldKW Xdlllcclo0W 25 Nkllcllllllld0N WWNXKK000OOOO0XW W0occlcclo0W 26 NklllcllclokXW WXxlcllcclo0W 27 Nkllllccld0N WXxlllllcclo0W 28 Nklcllcclox0XWW WN0dlcllclllco0W 29 Nkllllllllclox0XNW WX0xllcllclllcco0W 30 NkllllllcccclllodkOKXNWW WWNKOxolcllcllclcclco0W 31 NklllllllccclccllcllodxkkO00KKXXXXXXXXXXK00OkxdllcllllclcllccllloKW 32 WKdlllcllllllllccllcccccclllllooooooooollllccclllllllllclcccclllkN 33 WKxllllcllllllllccllllllllllllllllllllllllllllllllllllllllccloONW 34 WN0kdlllcclllllllllllllllclcccccclcccccclllllllllcclllclloxOXW 35 WNKOxolccllccllllllllllllllllllllllllllllllllllcclldk0XNW 36 WX0kdllllccllllcclllllllllccllcclcclccllccloxOKNW 37 WNKOxolcllcclcclllllllllccllcccllcllldk0XWW 38 WX0kdlllclllllllllllllcllcclloxOKNW 39 WNKOxolllllllllllllcllldk0XWW 40 WX0kdllllcclllloxOKNW 41 WXOxolccllokKNW 42 `),t(),e(9,` 43`),t())},encapsulation:2});let a=r;return a})();var S0=()=>({exact:!0}),jo=(()=>{let r=class r{constructor(){}ngOnInit(){}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-styleguide-nav"]],standalone:!1,decls:184,vars:21,consts:[[1,"page-navigation","mt-0"],[1,"header"],[1,"text-header-5","mb-0"],["routerLinkActive","active",3,"routerLinkActiveOptions"],[1,"btn-a11y",3,"routerLink"],["routerLinkActive","active"],[1,"text-smallest","text-grey-lt"]],template:function(s,o){s&1&&(n(0,"nav",0),e(1,` 44 `),n(2,"ul"),e(3,` 45 `),n(4,"li",1),e(5,` 46 `),n(6,"h2",2),e(7,"Style Guide"),t(),e(8,` 47 `),t(),e(9,` 48 `),n(10,"li",3),e(11,` 49 `),n(12,"a",4),e(13,"Home"),t(),e(14,` 50 `),t(),e(15,` 51 `),c(16,"hr"),e(17,` 52 `),n(18,"li",1),e(19,` 53 `),n(20,"h2",2),e(21,"Global"),t(),e(22,` 54 `),t(),e(23,` 55 `),n(24,"li",5),e(25,` 56 `),n(26,"a",4),e(27,"admin vs member"),t(),e(28,` 57 `),t(),e(29,` 58 `),n(30,"li",5),e(31,` 59 `),n(32,"a",4),e(33,"fonts"),t(),e(34,` 60 `),t(),e(35,` 61 `),n(36,"li",5),e(37,` 62 `),n(38,"a",4),e(39,"color"),t(),e(40,` 63 `),t(),e(41,` 64 `),n(42,"li",5),e(43,` 65 `),n(44,"a",4),e(45,"contrast"),t(),e(46,` 66 `),n(47,"div",6),e(48,` 67 audit \u2014 the WCAG maths is wrong, measured live 68 `),t(),e(49,` 69 `),t(),e(50,` 70 `),n(51,"li",5),e(52,` 71 `),n(53,"a",4),e(54,"blues & links"),t(),e(55,` 72 `),t(),e(56,` 73 `),n(57,"li",5),e(58,` 74 `),n(59,"a",4),e(60,"primeng upgrade debt"),t(),e(61,` 75 `),n(62,"div",6),e(63,` 76 audit \u2014 rules that stopped matching at v21, probed live 77 `),t(),e(64,` 78 `),t(),e(65,` 79 `),e(66,` 80 `),e(67,` 81 `),e(68,` 82 83 `),n(69,"li",5),e(70,` 84 `),n(71,"a",4),e(72,"buttons"),t(),e(73,` 85 `),t(),e(74,` 86 87 `),e(75,` 88 `),e(76,` 89 `),n(77,"li",5),e(78,` 90 `),n(79,"a",4),e(80,"forms"),t(),e(81,` 91 `),n(82,"div",6),e(83,` 92 6 tabs \u2014 permutations, architectures, contracts, defects 93 `),t(),e(84,` 94 `),t(),e(85,` 95 `),e(86,` 96 `),e(87,` 97 `),n(88,"li",5),e(89,` 98 `),n(90,"a",4),e(91,"utilities & misc"),t(),e(92,` 99 `),t(),e(93,` 100 `),n(94,"li",5),e(95,` 101 `),n(96,"a",4),e(97,"icon browser"),t(),e(98,` 102 `),t(),e(99,` 103 `),n(100,"li",5),e(101,` 104 `),n(102,"a",4),e(103,"backgrounds"),t(),e(104,` 105 `),n(105,"div",6),e(106,"experiment \u2014 not a mirror of shipped CSS"),t(),e(107,` 106 `),t(),e(108,` 107 `),c(109,"hr"),e(110,` 108 `),n(111,"li",1),e(112,` 109 `),n(113,"h2",2),e(114,"Components"),t(),e(115,` 110 `),t(),e(116,` 111 `),n(117,"li",5),e(118,` 112 `),n(119,"a",4),e(120,"pills & tags"),t(),e(121,` 113 `),t(),e(122,` 114 `),n(123,"li",5),e(124,` 115 `),n(125,"a",4),e(126,"avatars"),t(),e(127,` 116 `),n(128,"div",6),e(129,` 117 audit \u2014 states, overrides, contrast measured live 118 `),t(),e(130,` 119 `),t(),e(131,` 120 `),n(132,"li",5),e(133,` 121 `),n(134,"a",4),e(135,"cards"),t(),e(136,` 122 `),t(),e(137,` 123 `),n(138,"li",5),e(139,` 124 `),n(140,"a",4),e(141,"system alerts & colored text"),t(),e(142,` 125 `),t(),e(143,` 126 `),n(144,"li",5),e(145,` 127 `),n(146,"a",4),e(147,"staging \u2014 all 98"),t(),e(148,` 128 `),n(149,"div",6),e(150,` 129 every library component mounted once, folder order 130 `),t(),e(151,` 131 `),t(),e(152,` 132 `),c(153,"hr"),e(154,` 133 `),n(155,"li",1),e(156,` 134 `),n(157,"h2",2),e(158,"PrimeNG"),t(),e(159,` 135 `),t(),e(160,` 136 `),n(161,"li",5),e(162,` 137 `),n(163,"a",4),e(164,"component demos"),t(),e(165,` 138 `),t(),e(166,` 139 140 141 142 `),c(167,"hr"),e(168,` 143 `),n(169,"li",1),e(170,` 144 `),n(171,"h2",2),e(172,"CMS Elements"),t(),e(173,` 145 `),t(),e(174,` 146 147 `),n(175,"li",5),e(176,` 148 `),n(177,"a",4),e(178,"Buttons"),t(),e(179,` 149 `),t(),e(180,` 150`),e(181,` 151 `),t(),e(182,` 152`),t(),e(183,` 153`)),s&2&&(i(10),m("routerLinkActiveOptions",V(20,S0)),i(2),m("routerLink","/admin/styleguide"),i(14),m("routerLink","global/admin-vs-member"),i(6),m("routerLink","global/fonts"),i(6),m("routerLink","global/color"),i(6),m("routerLink","global/contrast"),i(9),m("routerLink","global/blues-and-links"),i(6),m("routerLink","global/primeng-upgrade-
153debt"),i(12),m("routerLink","global/buttons"),i(8),m("routerLink","global/forms"),i(11),m("routerLink","global/utilities"),i(6),m("routerLink","global/font-test"),i(6),m("routerLink","global/background-test"),i(17),m("routerLink","components/pills"),i(6),m("routerLink","components/avatars"),i(9),m("routerLink","components/cards"),i(6),m("routerLink","components/system-alerts"),i(6),m("routerLink","components/staging"),i(17),m("routerLink","primeng"),i(14),m("routerLink","cms/buttons"))},dependencies:[$,_a],styles:[".page-navigation[_ngcontent-%COMP%]{margin-top:2rem}"]});let a=r;return a})();var Go=(()=>{let r=class r{constructor(d,s){this.siteDataService=d,this.router=s,this.unsubscribe$=new He}ngOnInit(){this.siteDataService.hideSiteLoader(),this.siteDataService.getEnvironment().pipe(Ct(this.unsubscribe$)).subscribe({next:d=>{d===Ot.DEV||d===Ot.LOCAL||d===Ot.QA||this.router.navigate(["/admin/dashboard"])},error:()=>{this.router.navigate(["/admin/dashboard"])}})}ngOnDestroy(){this.unsubscribe$.next(),this.unsubscribe$.complete()}};r.\u0275fac=function(s){return new(s||r)(A(R),A(Dt))},r.\u0275cmp=b({type:r,selectors:[["app-styleguide"]],standalone:!1,decls:19,vars:0,consts:[["role","main"],[1,"ml-0"],[1,"row"],[1,"col-auto","left-nav-wrapper"],[1,"col"]],template:function(s,o){s&1&&(n(0,"main",0),e(1,` 154 `),n(2,"div",1),e(3,` 155 `),n(4,"div",2),e(5,` 156 `),n(6,"div",3),e(7,` 157 `),c(8,"app-styleguide-nav"),e(9,` 158 `),t(),e(10,` 159 `),n(11,"div",4),e(12,` 160 `),c(13,"router-outlet"),e(14,` 161 `),t(),e(15,` 162 `),t(),e(16,` 163 `),t(),e(17,` 164`),t(),e(18,` 165`))},dependencies:[Mt,jo],encapsulation:2});let a=r;return a})();var v0=["*"];function y0(a,r){if(a&1&&(e(0,` 166 `),c(1,"app-pill",1),e(2,` 167 `)),a&2){let l=u();i(),m("status",l.sideStatus)("text",l.sideLabel)("tooltipText",l.sideTooltip)}}var X=(()=>{let r=class r{get sideStatus(){return r.sides[this.side]?.status}get sideLabel(){return r.sides[this.side]?.label}get sideTooltip(){return r.sides[this.side]?.tooltip}};r.sides={admin:{status:"secondary",label:"admin",tooltip:"Admin side only \u2014 fixed values, a club theme cannot change this."},member:{status:"primary",label:"member",tooltip:"Member side only \u2014 a club theme can change this."},shared:{status:"black",label:"shared",tooltip:"Renders on both sides. Themeable only where the partial reads --cms-* / --theme-*."}},r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-sg-caption"]],inputs:{side:"side"},standalone:!1,ngContentSelectors:v0,decls:7,vars:1,consts:[[1,"d-block","text-smallest","text-grey","mt-3","mb-1"],["variant","tag","tooltipPosition","top",3,"status","text","tooltipText"]],template:function(s,o){s&1&&(ke(),e(0,` 168`),n(1,"div",0),e(2,` 169 `),v(3,y0,3,3),Te(4),e(5,` 170`),t(),e(6,` 171`)),s&2&&(i(3),y(o.sideLabel?3:-1))},dependencies:[J],encapsulation:2});let a=r;return a})();var w0=["adminProbe"],C0=["memberProbe"],_0=(a,r)=>r.name,k0=(a,r)=>r.token;function T0(a,r){if(a&1){let l=B();e(0,` 172 `),n(1,"button",20),g("click",function(){let s=w(l).$implicit,o=u();return C(o.applyTheme(s))}),e(2),t(),e(3,` 173 `)}if(a&2){let l=r.$implicit,d=u();i(),j("btn-primary",l===d.activeTheme),i(),p(l.name)}}function I0(a,r){if(a&1&&(e(0,` 174 `),n(1,"span",21),e(2,"\xA0"),t(),e(3,` 175 `)),a&2){let l=u().$implicit;i(),W("background-color",l.admin)}}function M0(a,r){if(a&1&&(e(0,` 176 `),n(1,"span",21),e(2,"\xA0"),t(),e(3,` 177 `)),a&2){let l=u().$implicit;i(),W("background-color",l.member)}}function D0(a,r){if(a&1&&(e(0,` 178 `),n(1,"tr"),e(2,` 179 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 180 `),n(7,"td"),e(8,` 181 `),v(9,I0,4,2),n(10,"code"),e(11),t(),e(12,` 182 `),t(),e(13,` 183 `),n(14,"td"),e(15,` 184 `),v(16,M0,4,2),n(17,"code"),e(18),t(),e(19,` 185 `),t(),e(20,` 186 `),t(),e(21,` 187 `)),a&2){let l=r.$implicit,d=u();i(5),p(l.token),i(4),y(d.isColor(l.admin)?9:-1),i(2),p(l.admin),i(5),y(d.isColor(l.member)?16:-1),i(2),p(l.member)}}function F0(a,r){a&1&&(e(0,` 188 `),n(1,"tr"),e(2,` 189 `),n(3,"td",22),e(4,"Reading tokens\u2026"),t(),e(5,` 190 `),t(),e(6,` 191 `))}var $o=(()=>
191{let r=class r{constructor(d,s){this.cdr=d,this.siteDataService=s,this.probedTokens=["--theme-button-background","--theme-button-text-color","--theme-button-border","--theme-button-background--primary","--theme-button-text-color--primary","--theme-button-background-hover--primary","--theme-button-text-color--naked","--cms-button-background--primary"],this.themes=[{name:"No theme (SCSS defaults)",tokens:{}},{name:"Crimson",tokens:{"--theme-button-background":"#ffffff","--theme-button-text-color":"#9b1b30","--theme-button-border":"#9b1b30","--theme-button-background-hover":"#9b1b30","--theme-button-text-color-hover":"#ffffff","--theme-button-background--primary":"#9b1b30","--theme-button-border--primary":"#9b1b30","--theme-button-text-color--primary":"#ffffff","--theme-button-background-hover--primary":"#7a1526","--theme-button-border-hover--primary":"#7a1526","--theme-button-text-color-hover--primary":"#ffffff","--theme-button-text-color--naked":"#9b1b30","--theme-button-text-color-hover--naked":"#7a1526"}},{name:"Forest",tokens:{"--theme-button-background":"#ffffff","--theme-button-text-color":"#14532d","--theme-button-border":"#14532d","--theme-button-background-hover":"#14532d","--theme-button-text-color-hover":"#ffffff","--theme-button-background--primary":"#14532d","--theme-button-border--primary":"#14532d","--theme-button-text-color--primary":"#ffffff","--theme-button-background-hover--primary":"#0d3a1f","--theme-button-border-hover--primary":"#0d3a1f","--theme-button-text-color-hover--primary":"#ffffff","--theme-button-text-color--naked":"#14532d","--theme-button-text-color-hover--naked":"#0d3a1f"}}],this.activeTheme=this.themes[1],this.readings=[]}ngOnInit(){this.siteDataService.hideSiteLoader()}ngAfterViewInit(){this.applyTheme(this.activeTheme)}applyTheme(d){this.activeTheme=d;let s=this.memberProbe?.nativeElement;if(s){for(let o of this.themes)for(let x of Object.keys(o.tokens))s.style.removeProperty(x);for(let[o,x]of Object.entries(d.tokens))s.style.setProperty(o,x);this.readTokens()}}isColor(d){return d.startsWith("#")||d.startsWith("rgb")}readTokens(){let d=this.adminProbe?.nativeElement,s=this.memberProbe?.nativeElement;if(!d||!s)return;let o=getComputedStyle(d),x=getComputedStyle(s);this.readings=this.probedTokens.map(h=>({token:h,admin:o.getPropertyValue(h).trim()||"(unset)",member:x.getPropertyValue(h).trim()||"(unset)"})),this.cdr.detectChanges()}};r.\u0275fac=function(s){return new(s||r)(A(Ke),A(R))},r.\u0275cmp=b({type:r,selectors:[["app-sg-admin-vs-member"]],viewQuery:function(s,o){if(s&1&&$e(w0,5)(C0,5),s&2){let x;xe(x=he())&&(o.adminProbe=x.first),xe(x=he())&&(o.memberProbe=x.first)}},standalone:!1,decls:632,vars:1,consts:[["adminProbe",""],["memberProbe",""],[1,"text-small","text-grey"],[1,"card"],[1,"table","table-bordered"],["alertType","note",1,"mb-3"],["side","admin"],["variant","tag","status","secondary","text","admin"],["variant","tag","status","primary","text","member"],["alertType","warning",1,"mb-3"],[1,"d-flex","flex-wrap","gap-3","align-items-center","mb-3"],[1,"row"],[1,"col-md-6"],[1,"bg-white","p-3"],["type","button",1,"btn"],["type","button",1,"btn","btn-primary"],["type","button",1,"btn","btn-naked"],["side","member"],["alertType","info",1,"mb-3"],["side","shared"],["type","button",1,"btn","btn-sm",3,"click"],[1,"d-inline-block","px-3","mr-2","border-radius-sm"],["colspan","3",1,"text-small","text-grey"]],template:function(s,o){s&1&&(n(0,"h2"),e(1,"Admin side vs. member side"),t(),e(2,` 192`),n(3,"p",2),e(4,` 193 The app has two style conventions, not one. `),n(5,"strong"),e(6,"Admin styling is immutable"),t(),e(7,` \u2014 every 194 club sees the same admin. `),n(8,"strong"),e(9,"Member styling is themeable"),t(),e(10,` \u2014 a club's theme changes 195 it. Many components render on both sides, so "which side is this?" decides whether a color is a 196 fixed value or a token a club controls. 197`),t(),e(11,` 198 199`),n(12,"div",3),e(13,` 200 `),n(14,"h3"),e(15,"1. How the app decides which side you are on"),t(),e(16,` 201 `),n(17,"p",2),e(18,` 202 Nothing inspects the URL. A route opts in with `),n(19,"code"),e(20,"data.admin: true"),t(),e(21,`, and the app 203 shell turns that into a class on `),n(22,"code"),e(23,"<body>"),t(),e(24,`. 204 `),t(),e(25,` 205 206 `),n(26,"table",4),e(27,` 207 `),n(28,"thead"),e(29,` 208 `),n(30,"tr"),e(31,` 209 `),n(32,"th"),e(33,"Step"),t(),e(34,` 210 `),n(35,"th"),e(36,"Where"),t(),e(37,` 211 `),n(38,"th"),e(39,"What happens"),t(),e(40,` 212 `),t(),e(41,` 213 `),t(),e(42,` 214 `),n(43,"tbody"),e(44,` 215 `),n(45,"tr"),e(46,` 216 `),n(47,"td"),e(48,"1"),t(),e(49,` 217 `),n(50,"td")(51,"code"),e(52,"app-routing.module.ts"),t()(),e(53,` 218 `),n(54,"td"),e(55,"Route declares "),n(56,"code"),e(57,"data: { admin: true }"),t()(),e(58,` 219 `),t(),e(59,` 220 `),n(60,"tr"),e(61,` 221 `),n(62,"td"),e(63,"2"),t(),e(64,` 222 `),n(65,"td")(66,"code"),e(67,"app.component.ts"),t(),e(68," \u2014 "),n(69,"code"),e(70,"NavigationEnd"),t()(),e(71,` 223 `),n(72,"td"),e(73,"Walks the activated route tree and sets "),n(74,"code"),e(75,"isAdmin"),t()(),e(76,` 224 `),t(),e(77,` 225 `),n(78,"tr"),e(79,` 226 `),n(80,"td"),e(81,"3"),t(),e(82,` 227 `),n(83,"td")(84,"code"),e(85,"app.component.ts"),t(),e(86," \u2014 "),n(87,"code"),e(88,"addAdminBodyClass()"),t()(),e(89,` 228 `),n(90,"td")(91,"code"),e(92,'<body class="admin-wrapper">'),t(),e(93,", else "),n(94,"code"),e(95,"site-wrapper"),t()(),e(96,` 229 `),t(),e(97,` 230 `),n(98,"tr"),e(99,` 231 `),n(100,"td"),e(101,"4"),t(),e(102,` 232 `),n(103,"td")(104,"code"),e(105,"header.component.ts"),t(),e(106," \u2014 "),n(107,"code"),e(108,"setThemePrimatives()"),t()(),e(109,` 233 `),n(110,"td"),e(111,` 234 Writes the club's `),n(112,"code"),e(113,"--theme-*"),t(),e(114," values onto "),n(115,"code"),e(116,"<html>"),t(),e(117,`. 235 `),n(118,"strong"),e(119,"Only runs on the member side"),t(),e(120," \u2014 "),n(121,"code"),e(122,"app-header"),t(),e(123,` is not 236 rendered when `),n(124,"code"),e(125,"isAdmin"),t(),e(126,`. 237 `),t(),e(127,` 238 `),t(),e(128,` 239 `),t(),e(129,` 240 `),t(),e(130,` 241 242 `),n(131,"app-inline-alert",5),e(132,` 243 `),n(133,"strong"),e(134,"Admin immutability has two mechanisms, and you need both."),t(),e(135,` Step 4 means an 244 admin route never applies a theme itself. But this is a single-page app: a member who 245 navigates from a club site into `),n(136,"code"),e(137,"/admin"),t(),e(138,` keeps whatever 246 `),n(139,"code"),e(140,"--theme-*"),t(),e(141," that club already wrote onto "),n(142,"code"),e(143,"<html>"),t(),e(144,` \u2014 nothing 247 clears it. The guard against that is the `),n(145,"code"),e(146,".admin-wrapper"),t(),e(147,` block in 248 `),n(148,"code"),e(149,"2_layout/buttons.scss"),t(),e(150,", which re-pins "),n(151,"code"),e(152,"--theme-button-*"),t(),e(153,` to admin 249 values on `),n(154,"code"),e(155,"<body>"),t(),e(156,`. Do not remove it because the values look redundant 250 with the `),n(157,"code"),e(158,":root"),t(),e(159,` defaults \u2014 they are the same on a cold load and different 251 after that navigation. 252 `),t(),e(160,` 253 254 `),n(161,"app-sg-caption",6),e(162,` 255 This page is `),n(163,"code"),e(164,"/admin/styleguide"),t(),e(165,", so "),n(166,"code"),e(167,"data.admin: true"),t(),e(168,` \u2014 everything 256 outside the member preview in section 3 is rendering in admin context right now. 257 `),t(),e(169,` 258`),t(),e(170,` 259
260`),n(171,"div",3),e(172,` 261 `),n(173,"h3"),e(174,"2. The three wrapper scopes"),t(),e(175,` 262 `),n(176,"p",2),e(177,` 263 These are the class names to look for when reading a stylesheet and asking which convention 264 a rule belongs to. 265 `),t(),e(178,` 266 267 `),n(179,"table",4),e(180,` 268 `),n(181,"thead"),e(182,` 269 `),n(183,"tr"),e(184,` 270 `),n(185,"th"),e(186,"Scope"),t(),e(187,` 271 `),n(188,"th"),e(189,"Applied to"),t(),e(190,` 272 `),n(191,"th"),e(192,"Convention"),t(),e(193,` 273 `),t(),e(194,` 274 `),t(),e(195,` 275 `),n(196,"tbody"),e(197,` 276 `),n(198,"tr"),e(199,` 277 `),n(200,"td"),c(201,"app-pill",7),e(202,` 278 `),n(203,"code"),e(204,".admin-wrapper"),t()(),e(205,` 279 `),n(206,"td")(207,"code"),e(208,"<body>"),t(),e(209," on admin routes, plus editor chrome divs"),t(),e(210,` 280 `),n(211,"td"),e(212,"Fixed values. A club theme cannot reach these."),t(),e(213,` 281 `),t(),e(214,` 282 `),n(215,"tr"),e(216,` 283 `),n(217,"td"),c(218,"app-pill",8),e(219,` 284 `),n(220,"code"),e(221,".site-wrapper"),t()(),e(222,` 285 `),n(223,"td"),e(224,"The app shell wrapper on every non-admin route"),t(),e(225,` 286 `),n(226,"td"),e(227,"Member side. "),n(228,"code"),e(229,"--theme-*"),t(),e(230," is live on "),n(231,"code"),e(232,"<html>"),t(),e(233,"."),t(),e(234,` 287 `),t(),e(235,` 288 `),n(236,"tr"),e(237,` 289 `),n(238,"td"),c(239,"app-pill",8),e(240,` 290 `),n(241,"code"),e(242,".cms-content"),t()(),e(243,` 291 `),n(244,"td"),e(245,"Page-builder-rendered content, on "),n(246,"em"),e(247,"either"),t(),e(248," side"),t(),e(249,` 292 `),n(250,"td"),e(251,"Opts back into theme values even inside the admin editor."),t(),e(252,` 293 `),t(),e(253,` 294 `),t(),e(254,` 295 `),t(),e(255,` 296 297 `),n(256,"app-inline-alert",9),e(257,` 298 `),n(258,"code"),e(259,".admin-wrapper"),t(),e(260,` is not strictly nested. The page-builder editor puts chrome 299 divs carrying `),n(261,"code"),e(262,".admin-wrapper"),t(),e(263," "),n(264,"em"),e(265,"inside"),t(),e(266,` 300 `),n(267,"code"),e(268,"main.cms-content"),t(),e(269,`, wrapping the member content being previewed. Token scopes 301 therefore key off `),n(270,"code"),e(271,"body.admin-wrapper"),t(),e(272,", not bare "),n(273,"code"),e(274,".admin-wrapper"),t(),e(275,` \u2014 302 a descendant-selector pin would re-pin the preview. 303 `),t(),e(276,` 304`),t(),e(277,` 305 306`),n(278,"div",3),e(279,` 307 `),n(280,"h3"),e(281,"3. The token layers"),t(),e(282,` 308 `),n(283,"p",2),e(284,` 309 Two layers, declared in 310 `),n(285,"code"),e(286,"1_base/variables.scss"),t(),e(287," and scoped in "),n(288,"code"),e(289,"2_layout/buttons.scss"),t(),e(290,`. 311 `),t(),e(291,` 312 313 `),n(292,"table",4),e(293,` 314 `),n(294,"thead"),e(295,` 315 `),n(296,"tr"),e(297,` 316 `),n(298,"th"),e(299,"Layer"),t(),e(300,` 317 `),n(301,"th"),e(302,"Role"),t(),e(303,` 318 `),n(304,"th"),e(305,"Who writes it"),t(),e(306,` 319 `),n(307,"th"),e(308,"Who reads it"),t(),e(309,` 320 `),t(),e(310,` 321 `),t(),e(311,` 322 `),n(312,"tbody"),e(313,` 323 `),n(314,"tr"),e(315,` 324 `),n(316,"td")(317,"code"),e(318,"--theme-*"),t()(),e(319,` 325 `),n(320,"td"),e(321,"Raw palette"),t(),e(322,` 326 `),n(323,"td"),e(324,` 327 SCSS defaults, then the club theme at runtime on `),n(325,"code"),e(326,"<html>"),t(),e(327,`, 328 then re-pinned to admin values on `),n(328,"code"),e(329,"body.admin-wrapper"),t(),e(330,` 329 `),t(),e(331,` 330 `),n(332,"td"),e(333,` 331 `),n(334,"strong"),e(335,"The global button rules read these directly"),t(),e(336,` \u2014 332 `),n(337,"code"),e(338,".btn"),t(),e(339,", "),n(340,"code"),e(341,".btn-primary"),t(),e(342," and "),n(343,"code"),e(344,".btn-naked"),t(),e(345,` in 333 `),n(346,"code"),e(347,"2_layout/buttons.scss"),t(),e(348,". Also the "),n(349,"code"),e(350,"--cms-*"),t(),e(351,` layer. 334 `),t(),e(352,` 335 `),t(),e(353,` 336 `),n(354,"tr"),e(355,` 337 `),n(356,"td")(357,"code"),e(358,"--cms-*"),t()(),e(359,` 338 `),n(360,"td"),e(361,"Semantic"),t(),e(362,` 339 `),n(363,"td")(364,"code"),e(365,":root"),t(),e(366,", from "),n(367,"code"),e(368,"--theme-*"),t(),e(369,". Nothing else re-declares them."),t(),e(370,` 340 `),n(371,"td"),e(372,` 341 Only `),n(373,"code"),e(374,"button-content.component.scss"),t(),e(375,` \u2014 the page-builder Button 342 block, a component-scoped stylesheet. 343 `),t(),e(376,` 344 `),t(),e(377,` 345 `),t(),e(378,` 346 `),t(),e(379,` 347 348 `),n(380,"app-inline-alert",9),e(381,` 349 `),n(382,"strong"),e(383,"The rule that is easy to get wrong:"),t(),e(384,` a custom property is substituted where 350 it is `),n(385,"em"),e(386,"declared"),t(),e(387,", not where it is read. "),n(388,"code"),e(389,"--cms-*"),t(),e(390,` is declared only at 351 `),n(391,"code"),e(392,":root"),t(),e(393,`, so every element inherits the value already resolved from 352 `),n(394,"code"),e(395,"<html>"),t(),e(396,"'s "),n(397,"code"),e(398,"--theme-*"),t(),e(399,". The "),n(400,"code"),e(401,".admin-wrapper"),t(),e(402,` pin 353 therefore redirects the global `),n(403,"code"),e(404,".btn"),t(),e(405," rules (they read "),n(406,"code"),e(407,"--theme-*"),t(),e(408,` 354 directly) but `),n(409,"em"),e(410,"not"),t(),e(411," the "),n(412,"code"),e(413,"--cms-*"),t(),e(414,` layer. The two layers do not move 355 together, and that asymmetry is load-bearing \u2014 see section 4. 356 `),t(),e(415,` 357 358 `),n(416,"h4"),e(417,"Live: the same markup, both conventions"),t(),e(418,` 359 `),n(419,"p",2),e(420,` 360 Both columns are the app's own `),n(421,"code"),e(422,".btn"),t(),e(423,` classes \u2014 no harness markup. The left 361 column inherits the `),n(424,"code"),e(425,"body.admin-wrapper"),t(),e(426,` pin. The right column has a sample club 362 theme set inline on its container, which outranks that pin for its subtree; that is the 363 only way to render member-side buttons on a route which is itself admin, and it is the same 364 `),n(427,"code"),e(428,"setProperty()"),t(),e(429," call the app's header makes against "),n(430,"code"),e(431,"<html>"),t(),e(432,`. 365 A sample theme is needed because admin routes never apply a real one. 366 `),t(),e(433,` 367 368 `),n(434,"div",10),e(435,` 369 `),S(436,T0,4,3,null,null,_0),t(),e(438,` 370 371 `),n(439,"div",11),e(440,` 372 `),n(441,"div",12),e(442,` 373 `),n(443,"app-sg-caption",6),e(444,` 374 Inherits the `),n(445,"code"),e(446,"body.admin-wrapper"),t(),e(447,` pin \u2014 no theme reaches it 375 `),t(),e(448,` 376 `),n(449,"div",13,0),e(451,` 377 `),n(452,"button",14),e(453,".btn"),t(),e(454,` 378 `),n(455,"button",15),e(456,".btn-primary"),t(),e(457,` 379 `),n(458,"button",16),e(459,".btn-naked"),t(),e(460,` 380 `),t(),e(461,` 381 `),t(),e(462,` 382 `),n(463,"div",12),e(464,` 383 `),n(465,"app-sg-caption",17),e(466,` 384 Sample club theme set on this container 385 `),t(),e(467,` 386 `),n(468,"div",13,1),e(470,` 387 `),n(471,"button",14),e(472,".btn"),t(),e(473,` 388 `),n(474,"button",15),e(475,".btn-primary"),t(),e(476,` 389 `),n(477,"button",16),e(478,".btn-naked"),t(),e(479,` 390 `),t(),e(480,` 391 `),t(),e(481,` 392 `),t(),e(482,` 393 394 `),n(483,"p",2),e(484,` 395 The resolved values behind those buttons, read back with 396 `),n(485,"code"),e(486,"getComputedStyle()"),t(),e(487,". Note the last row: "),n(488,"code"),e(489,"--cms-*"),t(),e(490,` is 397 `),n(491,"strong"),e(492,"identical in both columns"),t(),e(493,`, because the sample theme sets
398 `),n(494,"code"),e(495,"--theme-*"),t(),e(496," and nothing re-derives "),n(497,"code"),e(498,"--cms-*"),t(),e(499,` below 399 `),n(500,"code"),e(501,":root"),t(),e(502,`. 400 `),t(),e(503,` 401 402 `),n(504,"table",4),e(505,` 403 `),n(506,"thead"),e(507,` 404 `),n(508,"tr"),e(509,` 405 `),n(510,"th"),e(511,"Token"),t(),e(512,` 406 `),n(513,"th"),c(514,"app-pill",7),e(515," resolved"),t(),e(516,` 407 `),n(517,"th"),c(518,"app-pill",8),e(519," resolved"),t(),e(520,` 408 `),t(),e(521,` 409 `),t(),e(522,` 410 `),n(523,"tbody"),e(524,` 411 `),S(525,D0,22,5,null,null,k0,!1,F0,7,0),t(),e(528,` 412 `),t(),e(529,` 413 414 `),n(530,"app-inline-alert",18),e(531,` 415 Not everything on a button is themeable. `),n(532,"code"),e(533,".btn"),t(),e(534,` takes its corner radius from 416 `),n(535,"code"),e(536,"var(--base-radius)"),t(),e(537,", not "),n(538,"code"),e(539,"--theme-button-radius"),t(),e(540,` \u2014 that token only 417 reaches the page-builder Button block and a few page-builder content blocks. Colors are 418 themeable; geometry mostly is not. 419 `),t(),e(541,` 420`),t(),e(542,` 421 422`),n(543,"div",3),e(544,` 423 `),n(545,"h3"),e(546,"4. Where this architecture does not hold up"),t(),e(547,` 424 `),n(548,"p",2),e(549,` 425 Two known consequences of the layering above. Both are recorded in 426 `),n(550,"code"),e(551,"docs/ui-migration-and-review/**/Kitchen-Sink-Harness.md"),t(),e(552,`; neither is fixed. 427 `),t(),e(553,` 428 429 `),n(554,"app-inline-alert",9),e(555,` 430 `),n(556,"strong"),e(557,"The page-builder editor previews admin buttons, not the club's."),t(),e(558,` The editor 431 is an admin route, so `),n(559,"code"),e(560,"body.admin-wrapper"),t(),e(561,` pins 432 `),n(562,"code"),e(563,"--theme-button-*"),t(),e(564,` across the whole document \u2014 including 433 `),n(565,"code"),e(566,"main.cms-content"),t(),e(567,`, where member content is being previewed. A 434 `),n(568,"code"),e(569,".cms-content"),t(),e(570,` rule cannot undo it: once the pin overwrites those names in that 435 subtree, the club's values are gone from it and only survive on `),n(571,"code"),e(572,"<html>"),t(),e(573,`.
436 That is why the `),n(574,"code"),e(575,".cms-content"),t(),e(576," reset block in "),n(577,"code"),e(578,"buttons.scss"),t(),e(579,` is 437 commented out \u2014 restoring it would assign the admin values, not the club's. A real fix 438 needs a separate name for the admin pin (an `),n(580,"code"),e(581,"--admin-button-*"),t(),e(582,` set) so 439 `),n(583,"code"),e(584,"--theme-button-*"),t(),e(585,` stays the club layer everywhere. 440 `),t(),e(586,` 441 442 `),n(587,"app-inline-alert",9),e(588,` 443 `),n(589,"strong")(590,"code"),e(591,"--cms-*"),t(),e(592," is a one-consumer layer."),t(),e(593,` Its name suggests it is the 444 semantic layer components read, and the comments in `),n(594,"code"),e(595,"variables.scss"),t(),e(596,` say so, but 445 only the page-builder Button block actually reads it \u2014 and that component also overwrites 446 those same names inline on its host in `),n(597,"code"),e(598,"setThemeButtonStyle()"),t(),e(599,` when the block 447 author picks a color. Treat `),n(600,"code"),e(601,"--cms-*"),t(),e(602,` as a pattern that was started, not as 448 infrastructure you can rely on. 449 `),t(),e(603,` 450`),t(),e(604,` 451 452`),n(605,"div",3),e(606,` 453 `),n(607,"h3"),e(608,"5. Reading the markers on the other pages"),t(),e(609,` 454 `),n(610,"p",2),e(611,` 455 Every captioned sample in this harness can declare which side it belongs to, via 456 `),n(612,"code"),e(613,'<app-sg-caption side="\u2026">'),t(),e(614,`. An uncaptioned or unmarked sample has not been 457 classified yet \u2014 that is a gap, not a statement that it is neutral. 458 `),t(),e(615,` 459 460 `),n(616,"app-sg-caption",6),e(617,"Fixed values; a club theme cannot change this"),t(),e(618,` 461 `),n(619,"app-sg-caption",17),e(620,"Reads the themeable layer"),t(),e(621,` 462 `),n(622,"app-sg-caption",19),e(623,` 463 Renders on both sides \u2014 immutable under `),n(624,"code"),e(625,"body.admin-wrapper"),t(),e(626,`, themeable under 464 `),n(627,"code"),e(628,".cms-content"),t(),e(629,` 465 `),t(),e(630,` 466`),t(),e(631,` 467`)),s&2&&(i(436),E(o.themes),i(89),E(o.readings))},dependencies:[J,le,X],encapsulation:2});let a=r;return a})();var Ko=(()=>{let r=class r{constructor(d){this.siteDataService=d}ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-fonts"]],standalone:!1,decls:52,vars:0,consts:[[1,""],[1,"word-break-all",2,"font-size","32px"],["href","https://fonts.adobe.com/fonts/proxima-nova"],["href","https://fontawesome.com/icons?d=gallery","target","_blank"],["href","https://www.primefaces.org/primeng/showcase/#/","target","_blank"],["href","https://www.primefaces.org/primeng/showcase/#/icons","target","_blank"],[1,"normal"],[1,"normal-ital"],[1,"bold"],[1,"black"]],template:function(s,o){s&1&&(n(0,"div",0),e(1,` 468 `),n(2,"h2"),e(3,"Fonts"),t(),e(4,` 469 `),n(5,"div",0),e(6,` 470 `),n(7,"p",1),e(8,"AbBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"),t(),e(9,` 471 `),n(10,"p",1),e(11,"1234567890\xA0!@#$%^&*()+=[]"),t(),e(12,` 472 `),c(13,"hr"),e(14,` 473 `),n(15,"p"),e(16,"The base font family is "),n(17,"a",2),e(18,"Proxima Nova"),t(),e(19,", using Adobe Fonts."),t(),e(20,` 474 `),n(21,"p"),e(22,"The icon font family used is "),n(23,"a",3),e(24,"Font Awesome"),t(),e(25,"."),t(),e(26,` 475 `),n(27,"p"),e(28,"We are also using the "),n(29,"a",4),e(30,"Prime NG component Library"),t(),e(31,". It also has an "),n(32,"a",5),e(33,"icon set included"),t(),e(34,"."),t(),e(35,` 476 `),n(36,"p"),e(37,"We are loading in four fonts:"),t(),e(38,` 477 `),n(39,"p",6),e(40,"This is the 400 (normal) weight. The quick brown fox jumps over the lazy dog."),t(),e(41,` 478 `),n(42,"p",7),e(43,"This is the 400 (normal) weight with italics. The quick brown fox jumps over the lazy dog."),t(),e(44,` 479 `),n(45,"p",8),e(46,"This is the 700 (bold) weight. The quick brown fox jumps over the lazy dog."),t(),e(47,` 480 `),n(48,"p",9),e(49,"This is the 900 (black) weight. The quick brown fox jumps over the lazy dog."),t(),e(50,` 481 `),t(),e(51,` 482 `),t())},encapsulation:2});let a=r;return a})();var P0=()=>[],A0=(a,r)=>r.anchor,O0=(a,r)=>r.name,Re=(a,r)=>r.token,Xo=(a,r)=>r.className,N0=(a,r)=>
482r.id,B0=(a,r)=>r.index,W0=(a,r)=>r.convention,R0=(a,r)=>r.selector,L0=(a,r)=>r.themeToken,q0=(a,r)=>r.field,V0=(a,r)=>r.hex,Yo=(a,r)=>r.gap,z0=(a,r)=>r.teamID,Qo=(a,r)=>r.label;function U0(a,r){a&1&&(e(0," "),c(1,"app-pill",58),e(2," "))}function H0(a,r){a&1&&(e(0," "),c(1,"app-pill",59),e(2," "))}function j0(a,r){a&1&&(e(0," "),n(1,"span",41),e(2,"fixed"),t(),e(3," "))}function G0(a,r){if(a&1&&(e(0,` 483 `),n(1,"tr"),e(2,` 484 `),n(3,"td")(4,"a",57),e(5),t()(),e(6,` 485 `),n(7,"td")(8,"code",42),e(9),t()(),e(10,` 486 `),n(11,"td",42),e(12),t(),e(13,` 487 `),n(14,"td",42),e(15),t(),e(16,` 488 `),n(17,"td",42),e(18,` 489 `),v(19,U0,3,0)(20,H0,3,0)(21,j0,4,0),e(22,` 490 `),t(),e(23,` 491 `),t(),e(24,` 492 `)),a&2){let l,d=r.$implicit;i(4),m("routerLink",V(7,P0))("fragment",d.anchor),i(),p(d.system),i(4),p(d.home),i(3),p(d.values),i(3),p(d.owner),i(4),y((l=d.themeable)==="club"?19:l==="per-record"?20:21)}}function $0(a,r){a&1&&(e(0,` 493 `),n(1,"span",41),e(2,"0"),t(),e(3,` 494 `))}function K0(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(` 495 `,l.uses,` 496 `)}}function X0(a,r){a&1&&(e(0,` 497 `),n(1,"span",41),e(2,"no consumers"),t(),e(3,` 498 `))}function Y0(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(` 499 `,l.note,` 500 `)}}function Q0(a,r){a&1&&(e(0,` 501 `),n(1,"span",41),e(2,"\u2014"),t(),e(3,` 502 `))}function J0(a,r){if(a&1&&(e(0,` 503 `),n(1,"tr"),e(2,` 504 `),n(3,"td"),c(4,"span",60),t(),e(5,` 505 `),n(6,"td")(7,"code"),e(8),t()(),e(9,` 506 `),n(10,"td")(11,"code"),e(12),t()(),e(13,` 507 `),n(14,"td"),e(15,` 508 `),v(16,$0,4,0)(17,K0,1,1),t(),e(18,` 509 `),n(19,"td",42),e(20,` 510 `),v(21,X0,4,0)(22,Y0,1,1)(23,Q0,4,0),t(),e(24,` 511 `),t(),e(25,` 512 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(4),p(l.token),i(4),p(l.hex),i(4),y(l.uses===0?16:17),i(5),y(l.note==="dead"?21:l.note?22:23)}}function Z0(a,r){if(a&1&&(e(0,` 513 `),n(1,"h4",19),e(2),t(),e(3,` 514 `),n(4,"div",4),e(5,` 515 `),n(6,"table",5),e(7,` 516 `),n(8,"thead"),e(9,` 517 `),n(10,"tr"),e(11,` 518 `),c(12,"th",12),e(13,` 519 `),n(14,"th",14),e(15,"Token"),t(),e(16,` 520 `),n(17,"th",23),e(18,"Hex"),t(),e(19,` 521 `),n(20,"th",15),e(21,"Uses"),t(),e(22,` 522 `),n(23,"th"),e(24,"Also known as"),t(),e(25,` 523 `),t(),e(26,` 524 `),t(),e(27,` 525 `),n(28,"tbody"),e(29,` 526 `),S(30,J0,26,6,null,null,Re),t(),e(32,` 527 `),t(),e(33,` 528 `),t(),e(34,` 529 `)),a&2){let l=r.$implicit;i(2),p(l.name),i(28),E(l.steps)}}function es(a,r){a&1&&(e(0,` 530 `),n(1,"span",61),e(2," \u25CF"),t(),e(3,` 531 `))}function ts(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(` 532 `,l.note,` 533 `)}}function ns(a,r){a&1&&(e(0,` 534 `),n(1,"span",41),e(2,"\u2014"),t(),e(3,` 535 `))}function is(a,r){if(a&1&&(e(0,` 536 `),n(1,"tr"),e(2,` 537 `),n(3,"td"),c(4,"span",60),t(),e(5,` 538 `),n(6,"td"),e(7,` 539 `),n(8,"code"),e(9),t(),e(10,` 540 `),v(11,es,4,0),t(),e(12,` 541 `),n(13,"td")(14,"code",42),e(15),t()(),e(16,` 542 `),n(17,"td"),e(18),t(),e(19,` 543 `),n(20,"td",42),e(21,` 544 `),v(22,ts,1,1)(23,ns,4,0),t(),e(24,` 545 `),t(),e(25,` 546 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(5),p(l.token),i(2),y(l.suspect?11:-1),i(4),p(l.resolvesTo),i(3),p(l.uses),i(4),y(l.note?22
546:23)}}function as(a,r){a&1&&(e(0,` 547 `),n(1,"span",62),e(2,"below AA for body text"),t(),e(3,` 548 `))}function rs(a,r){if(a&1&&(e(0,` 549 `),n(1,"tr"),e(2,` 550 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 551 `),n(7,"td"),e(8,` 552 `),n(9,"span"),e(10,"The quick brown fox"),t(),e(11,` 553 `),t(),e(12,` 554 `),n(13,"td")(14,"code",42),e(15),t()(),e(16,` 555 `),n(17,"td"),e(18),v(19,as,4,0),t(),e(20,` 556 `),n(21,"td",42),e(22),t(),e(23,` 557 `),t(),e(24,` 558 `)),a&2){let l=r.$implicit;i(5),f(".",l.className),i(2),j("bg-navy",l.className==="text-white"),i(2),ne(l.className),i(6),p(l.token),i(3),f(` 559 `,l.onWhite,`:1 560 `),i(),y(l.onWhite<4.5&&l.className!=="text-white"?19:-1),i(3),p(l.role)}}function os(a,r){if(a&1&&(e(0,` 561 `),n(1,"div",63),e(2,` 562 `),c(3,"div",64),e(4,` 563 `),n(5,"div",40),e(6,` 564 `),n(7,"code"),e(8),t(),c(9,"br"),e(10,` 565 `),n(11,"span",41),e(12),t(),e(13,` 566 `),t(),e(14,` 567 `),t(),e(15,` 568 `)),a&2){let l=r.$implicit;i(3),ne(l.className+" border-all border-radius"),i(5),f(".",l.className),i(4),p(l.token)}}function ls(a,r){if(a&1&&(e(0,` 569 `),n(1,"tr"),e(2,` 570 `),n(3,"td"),c(4,"span",60),t(),e(5,` 571 `),n(6,"td")(7,"code"),e(8),t()(),e(9,` 572 `),n(10,"td")(11,"code"),e(12),t()(),e(13,` 573 `),n(14,"td"),e(15),t(),e(16,` 574 `),n(17,"td"),e(18),t(),e(19,` 575 `),n(20,"td"),e(21),t(),e(22,` 576 `),t(),e(23,` 577 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(4),p(l.token),i(4),p(l.hex),i(3),p(l.label),i(3),p(l.uses),i(3),f("",l.onWhite,":1")}}function ss(a,r){if(a&1&&(e(0,` 578 `),n(1,"li")(2,"code"),e(3),t()(),e(4,` 579 `)),a&2){let l=r.$implicit;i(3),p(l)}}function ds(a,r){if(a&1&&(e(0,` 580 `),n(1,"tr"),e(2,` 581 `),n(3,"td"),c(4,"span",60),t(),e(5,` 582 `),n(6,"td"),e(7),t(),e(8,` 583 `),n(9,"td",41),e(10),t(),e(11,` 584 `),n(12,"td")(13,"code"),e(14),t()(),e(15,` 585 `),n(16,"td",42)(17,"code"),e(18),t()(),e(19,` 586 `),t(),e(20,` 587 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(3),p(l.label),i(3),p(l.id),i(4),p(l.hex),i(4),f("--",l.teamToken)}}function ms(a,r){if(a&1&&(e(0,` 588 `),n(1,"th",65),e(2),t(),e(3,` 589 `)),a&2){let l=r.$implicit;i(2),p(l)}}function cs(a,r){if(a&1&&(e(0,` 590 `),n(1,"td",66),e(2,` 591 `),c(3,"span",67),e(4,` 592 `),t(),e(5,` 593 `)),a&2){let l=r.$implicit;i(3),W("background-color","var(--team-color-"+l+")")}}function ps(a,r){if(a&1&&(e(0,` 594 `),n(1,"td",66),e(2,` 595 `),c(3,"span",67),e(4,` 596 `),t(),e(5,` 597 `)),a&2){let l=r.$implicit;i(3),W("background-color","var(--team-color-"+l+")")}}function xs(a,r){if(a&1&&(e(0,` 598 `),n(1,"tr"),e(2,` 599 `),n(3,"td",42)(4,"code"),e(5),t(),c(6,"br"),e(7),t(),e(8,` 600 `),S(9,ps,6,2,null,null,K),t(),e(11,` 601 `)),a&2){let l=r.$implicit,d=u();i(),ne("team-color-"+l.index),i(4),f(".team-color-",l.index),i(2),p(l.name),i(2),E(d.teamSteps)}}function hs(a,r){if(a&1&&(e(0,` 602 `),n(1,"td",65),e(2),t(),e(3,` 603 `)),a&2){let l=r.$implicit,d=u();i(2),p(d.teamStepUses[l])}}function us(a,r){a&1&&(e(0,` 604 `),n(1,"span",41),e(2,"0"),t(),e(3,` 605 `))}function gs(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(` 606 `,l.uses,` 607 `)}}function fs(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(` 608 `,l.onWhite,`:1 609 `)}}function bs(a,r){a&1&&(e(0,` 610 `),n(1,"span",41),e(2,"\u2014"),t(),e(3,` 611 `))}function Ss(a,r){if(a&1&&(e(0,` 612 `),n(1,"tr"),e(2,` 613 `),n(3,"td"),c(4,"span",60),t(),e(5,` 614 `),n(6,"td")(7,"code"),e(8),t()(),e(9,` 615 `),n(10,"td")(11,"code"),e(12),t()(),e(13,` 616 `),n(14,"td"),e(15,` 617 `),v(16,us,4,0)(17,gs,1,1),t(),e(18,` 618 `),n(19,"td"),e(20,` 619 `),v(21,fs,1,1)(22,bs,4,0),t(),e(23,` 620 `),n(24,"td",42),e(25),t(),e(26,` 621 `),t(),e(27,` 622 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(4),p(l.token),i(4),p(l.hex),i(4),y(l.uses===0?16:17),i(5),y(l.onWhite?21:22),i(4),p(l.role)}}function Es(a,r){if(a&1&&(e(0,` 623 `),n(1,"tr"),e(2,` 624 `),n(3,"td",42),e(4),t(),e(5,` 625 `),n(6,"td")(7,"code",42),e(8),t()(),e(9,` 626 `),n(10,"td",42),e(11),t(),e(12,` 627 `),n(13,"td",42),e(14),t(),e(15,` 628 `),t(),e(16,` 629 `)),a&2){let l=r.$implicit;i(4),p(l.convention),i(4),p(l.example),i(3),p(l.seenIn),i(3),p(l.problem)}}function vs(a,r){if(a&1&&(e(0,` 630 `),n(1,"div",38),e(2,` 631 `),n(3,"app-user-initials",39),e(4,` 632 `),t(),e(5,` 633 `),n(6,"div",40),e(7,` 634 `),n(8,"code"),e(9),t(),c(10,"br"),e(11,` 635 `),n(12,"span",41),e(13),t(),e(14,` 636 `),t(),e(15,` 637 `),t(),e(16,` 638 `)),a&2){let l=r.$implicit;i(3),m("id",l.sampleId),i(6),p(l.token),i(4),p(l.hex)}}function ys(a,r){if(a&1&&(e(0,` 639 `),n(1,"tr"),e(2,` 640 `),n(3,"td")(4,"code",42),e(5),t()(),e(6,` 641 `),n(7,"td"),e(8,` 642 `),c(9,"span",44),e(10,` 643 `),n(11,"span",43),e(12),t(),e(13,` 644 `),t(),e(14,` 645 `),n(15,"td"),e(16,` 646 `),n(17,"code",45),e(18),t(),e(19,` 647 `),t(),e(20,` 648 `),n(21,"td"),e(22),t(),e(23,` 649 `),t(),e(24,` 650 `)),a&2){let l=r.$implicit;i(5),p(l.token),i(4),W("background-color",l.hex),i(3),p(l.hex),i(6),p(l.onLight?"--user-avatar-text-on-light":"--user-avatar-text"),i(4),f("",l.ratio,":1")}}function ws(a,r){if(a&1&&(e(0,` 651 `),n(1,"span",41),e(2),t(),e(3,` 652 `)),a&2){let l=u().$implicit;i(2),p(l.reach)}}function Cs(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(` 653 `,l.reach,` 654 `)}}function _s(a,r){if(a&1&&(e(0,` 655 `),n(1,"tr"),e(2,` 656 `),n(3,"td"),e(4,` 657 `),n(5,"code",42),e(6),t(),e(7,` 658 `),n(8,"span",43),e(9),t(),e(10,` 659 `),t(),e(11,` 660 `),n(12,"td")(13,"code",42),e(14),t()(),e(15,` 661 `),n(16,"td",42),e(17),t(),e(18,` 662 `),n(19,"td",42),e(20,` 663 `),v(21,ws,4,1)(22,Cs,1,1),t(),e(23,` 664 `),t(),e(24,` 665 `)),a&2){let l=r.$implicit;i(6),p(l.selector),i(3),p(l.home),i(5),p(l.foreground),i(3),p(l.sizes),i(4),y(l.status==="dead"?21:22)}}function ks(a,r){a&1&&e(0,` 666 yes 667 `)}function Ts(a,r){a&1&&(e(0,` 668 `),n(1,"span",41),e(2,"no \u2014 CSS default only"),t(),e(3,` 669 `))}function Is(a,r){if(a&1&&(e(0,` 670 `),n(1,"span",51),e(2),t(),e(3,` 671 `)),a&2){let l=u().$implicit;i(2),p(l.directConsumers)}}function Ms(a,r){a&1&&(e(0,` 672 `),n(1,"span",41),e(2,"0"),t(),e(3,` 673 `))}function Ds(a,r){if(a&1&&(e(0,` 674 `),n(1,"tr"),e(2,` 675 `),n(3,"td")(4,"code",42),e(5),t()(),e(6,` 676 `),n(7,"td")(8,"code",42),e(9),t()(),e(10,` 677 `),n(11,"td"),e(12,` 678 `),v(13,ks,1,0)(14,Ts,4,0),t(),e(15,` 679 `),n(16,"td"),e(17,` 680 `),v(18,Is,4,1)(19,Ms,4,0),t(),e(20,` 681 `),t(),e(21,` 682 `)),a&2){let l=r.$implicit;i(5),p(l.themeToken),i(4),p(l.cmsToken),i(4),y(l.setAtRuntime?13:14),i(5),y(l.directConsumers?18:19)}}function Fs(a,r){if(a&1&&(e(0,` 683 `),n(1,"tr"),e(2,` 684 `),n(3,"td")(4,"code",42),e(5),t()(),e(6,` 685 `),n(7,"td")(8,"code",42),e(9),t()(),e(10,` 686 `),n(11,"td",42),e(12),t(),e(13,` 687 `),t(),e(14,` 688 `)),a&2){let l=r.$implicit;i(5),p(l.token),i(4),p(l.resolvesTo),i(3),p(l.drives)}}function Ps(a,r){a&1&&(e(0,` 689 `),n(1,"span",51),e(2,"0"),t(),e(3,` 690 `))}function As(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(` 691 `,l.consumers,` 692 `)}}function Os(a,r){if(a&1&&(e(0,` 693 `),n(1,"tr"),e(2,` 694 `),n(3,"td",42),e(4),t(),e(5,` 695 `),n(6,"td")(7,"code",42),e(8),t()(),e(9,` 696 `),n(10,"td"),e(11,` 697 `),v(12,Ps,4,0)(13,As,1,1),t(),e(14,` 698 `),n(15,"td",42),e(16),t(),e(17,` 699 `),t(),e(18,` 700 `)),a&2){let l=r.$implicit;i(4),p(l.field),i(4),p(l.cssVar),i(4),y(l.consumers===0?12:13),i(3),j("text-red",l.broken),i(),p(l.reaches)}}function Ns(a,r){if(a&1&&(e(0,` 701 `),n(1,"tr"),e(2,` 702 `),n(3,"td"),c(4,"span",60),t(),e(5,` 703 `),n(6,"td")(7,"code"),e(8),t()(),e(9,` 704 `),n(10,"td",42),e(11),t(),e(12,` 705 `),n(13,"td"),e(14),t(),e(15,` 706 `),n(16,"td"),e(17),t(),e(18,` 707 `),n(19,"td",42)(20,"code"),e(21),t()(),e(22,` 708 `),t(),e(23,` 709 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(4),p(l.hex),i(3),p(l.origin),i(3),p(l.decls),i(3),p(l.files),i(4),p(l.nearest)}}function Bs(a,r){a&1&&(e(0," "),c(1,"app-pill",68),e(2," "))}function Ws(a,r){a&1&&(e(0," "),c(1,"app-pill",69),e(2," "))}function Rs(a,r){a&1&&(e(0," "),c(1,"app-pill",70),e(2," "))}function Ls(a,r){a&1&&(e(0,` 710 `),n(1,"div",72),e(2,` 711 `),c(3,"span",73),e(4,` 712 `),n(5,"span",45)(6,"code"),e(7,"var(--theme-color-primary)"),t(),e(8," \u2014 resolves to nothing, so the swatch is empty"),t(),e(9,` 713 `),t(),e(10,` 714 `),n(11,"div",74),e(12,` 715 `),c(13,"span",73),e(14,` 716 `),n(15,"span",45)(16,"code"),e(17,"var(--theme-color-accent)"),t(),e(18," \u2014 the sibling field that is wired"),t(),e(19,` 717 `),t(),e(20,` 718 `)),a&2&&(i(3),W("background-color","var(--theme-color-primary)"),i(10),W("background-color","var(--theme-color-accent)"))}function qs(a,r){a&1&&(e(0,` 719 `),n(1,"span",41),e(2,"resolves"),t(),e(3,` 720 `))}function Vs(a,r){a&1&&(e(0,` 721 `),n(1,"span",51),e(2,"no such class"),t(),e(3,` 722 `))}function zs(a,r){if(a&1&&(e(0,` 723 `),n(1,"div",77),e(2,` 724 `),n(3,"span"),e(4,` 725 `),c(5,"span",44),e(6,` 726 `),t(),e(7,` 727 `),n(8,"div",40),e(9),c(10,"br"),e(11,` 728 `),n(12,"code"),e(13),t(),c(14,"br"),e(15,` 729 `),v(16,qs,4,0)(17,Vs,4,0),t(),e(18,` 730 `),t(),e(19,` 731 `)),a&2){let l=r.$implicit;i(3),ne(l.emitted),i(2),W("background-color","var(--team-color-500)"),i(4),f(` 732 teamID `,l.teamID),i(4),f(".",l.emitted),i(3),y(l.resolves?16:17)}}function Us(a,r){if(a&1&&(e(0,` 733 `),n(1,"div",75),e(2,` 734 `),S(3,zs,20,7,null,null,z0),t(),e(5,` 735 `),n(6,"p",76),e(7,` 736 Each dot carries the class the service actually emits for that teamID. 737 `),t(),e(8,` 738 `)),a&2){let l=u(3);i(3),E(l.teamFallbackSamples)}}function Hs(a,r){a&1&&(e(0,` 739 `),n(1,"div",78),e(2,` 740 `),n(3,"code"),e(4,"color: var(--grey900)"),t(),e(5,` \u2014 this text is inheriting, not colored 741 `),t(),e(6,` 742 `),n(7,"div",79),e(8,` 743 `),n(9,"code"),e(10,"color: var(--grey-900)"),t(),e(11,` \u2014 this text is the token 744 `),t(),e(12,` 745 `))}function js(a,r){a&1&&(e(0,` 746 `),n(1,"div",72),e(2,` 747 `),c(3,"span",73),e(4,` 748 `),n(5,"span",45),e(6,"the token "),n(7,"code"),e(8,"var(--warning)"),t()(),e(9,` 749 `),t(),e(10,` 750 `),n(11,"div",74),e(12,` 751 `),c(13,"span",73),e(14,` 752 `),n(15,"span",45),e(16,"the class "),n(17,"span",80),e(18,".text-warning"),t()(),e(19,` 753 `),t(),e(20,` 754 `)),a&2&&(i(3),W("background-color","var(--warning)"),i(10),W("background-color","var(--yellow-600)"))}function Gs(a,r){if(a&1&&(e(0,` 755 `),n(1,"div",82),e(2,` 756 `),c(3,"span",60),e(4,` 757 `),n(5,"div",83),e(6),t(),e(7,` 758 `),t(),e(8,` 759 `)),a&2){let l=r.$implicit;i(3),W("background-color",l.hex),i(3),p(l.token)}}function $s(a,r){if(a&1&&(e(0,` 760 `),n(1,"div",81),e(2,` 761 `),S(3,Gs,9,3,null,null,Re),t(),e(5,` 762 `),n(6,"p",76),e(7,` 763 Left to right should get darker. Step 100 is lighter than step 50, and step 50 is a different hue. 764 `),t(),e(8,` 765
765 `)),a&2){let l=u(3);i(3),E(l.yellowOrderDemo)}}function Ks(a,r){a&1&&(e(0,` 766 `),n(1,"div",72),e(2,` 767 `),c(3,"span",84),e(4,` 768 `),n(5,"span",45),e(6,"the literal in "),n(7,"code"),e(8,"program-navigation.component.ts"),t()(),e(9,` 769 `),t(),e(10,` 770 `),n(11,"div",85),e(12,` 771 `),c(13,"span",73),e(14,` 772 `),n(15,"span",45),e(16,"live "),n(17,"code"),e(18,".team-color-9"),t(),e(19," \u2192 "),n(20,"code"),e(21,"var(--team-color-300)"),t()(),e(22,` 773 `),t(),e(23,` 774 `),n(24,"p",76),e(25,` 775 Identical today. Nothing keeps them that way \u2014 only the top one is a decision anybody records. 776 `),t(),e(26,` 777 `)),a&2&&(i(13),W("background-color","var(--team-color-300)"))}function Xs(a,r){if(a&1&&(e(0,` 778 `),n(1,"div",86),e(2,` 779 `),c(3,"span",60),e(4,` 780 `),n(5,"div",83),e(6),c(7,"br"),e(8,` 781 `),n(9,"span",41),e(10),t(),e(11,` 782 `),t(),e(12,` 783 `),t(),e(13,` 784 `)),a&2){let l=r.$implicit;i(3),W("background-color",l.hex),i(3),p(l.hex),i(4),p(l.label)}}function Ys(a,r){if(a&1&&(e(0,` 785 `),n(1,"div",81),e(2,` 786 `),S(3,Xs,14,4,null,null,Qo),t(),e(5,` 787 `)),a&2){let l=u(3);i(3),E(l.chartGreensDemo)}}function Qs(a,r){if(a&1&&(e(0,` 788 `),n(1,"div",86),e(2,` 789 `),c(3,"span",60),e(4,` 790 `),n(5,"div",83),e(6),c(7,"br"),e(8,` 791 `),n(9,"span",41),e(10),t(),e(11,` 792 `),t(),e(12,` 793 `),t(),e(13,` 794 `)),a&2){let l=r.$implicit;i(3),W("background-color",l.hex),i(3),p(l.hex),i(4),p(l.label)}}function Js(a,r){if(a&1&&(e(0,` 795 `),n(1,"div",81),e(2,` 796 `),S(3,Qs,14,4,null,null,Qo),t(),e(5,` 797 `),n(6,"p",76),e(7,` 798 Three borders, three systems, close enough that no review has ever caught the difference. 799 `),t(),e(8,` 800 `)),a&2){let l=u(3);i(3),E(l.threeGreysDemo)}}function Zs(a,r){a&1&&(e(0,` 801 `),n(1,"div",72),e(2,` 802 `),c(3,"span",73),e(4,` 803 `),n(5,"span",45)(6,"code"),e(7,"var(--color1)"),t(),e(8," as this page used to label it \u2014 empty"),t(),e(9,` 804 `),t(),e(10,` 805 `),n(11,"div",74),e(12,` 806 `),c(13,"span",73),e(14,` 807 `),n(15,"span",45)(16,"code"),e(17,"var(--blue-1000)"),t(),e(18," \u2014 the token that replaced it"),t(),e(19,` 808 `),t(),e(20,` 809 `)),a&2&&(i(3),W("background-color","var(--color1)"),i(10),W("background-color","var(--blue-1000)"))}function ed(a,r){if(a&1&&(e(0,` 810 `),n(1,"div",71),e(2,` 811 `),v(3,Ls,21,4)(4,Us,9,0)(5,Hs,13,0)(6,js,21,4)(7,$s,9,0)(8,Ks,27,2)(9,Ys,6,0)(10,Js,9,0)(11,Zs,21,4),e(12,` 812 `),t(),e(13,` 813 `)),a&2){let l,d=u().$implicit;i(3),y((l=d.demo)==="unread-var"?3:l==="team-fallback"?4:l==="missing-hyphen"?5:l==="warning-two-colors"?6:l==="yellow-order"?7:l==="program-hex"?8:l==="chart-greens"?9:l==="three-greys"?10:l==="retired-tokens"?11:-1)}}function td(a,r){if(a&1&&(e(0,` 814 `),n(1,"tr"),e(2,` 815 `),n(3,"td"),e(4,` 816 `),v(5,Bs,3,0)(6,Ws,3,0)(7,Rs,3,0),e(8,` 817 `),t(),e(9,` 818 `),n(10,"td",42)(11,"strong"),e(12),t()(),e(13,`
819 `),n(14,"td",0),e(15),v(16,ed,14,1),t(),e(17,` 820 `),n(18,"td",42),e(19),t(),e(20,` 821 `),t(),e(21,` 822 `)),a&2){let l,d=r.$implicit;i(5),y((l=d.severity)==="defect"?5:l==="drift"?6:7),i(7),p(d.gap),i(3),f(` 823 `,d.evidence,` 824 `),i(),y(d.demo?16:-1),i(3),p(d.impact)}}function nd(a,r){a&1&&(e(0," "),c(1,"app-pill",68),e(2," "))}function id(a,r){a&1&&(e(0," "),c(1,"app-pill",69),e(2," "))}function ad(a,r){a&1&&(e(0," "),c(1,"app-pill",70),e(2," "))}function rd(a,r){if(a&1&&(e(0,` 825 `),n(1,"tr"),e(2,` 826 `),n(3,"td"),e(4,` 827 `),v(5,nd,3,0)(6,id,3,0)(7,ad,3,0),e(8,` 828 `),t(),e(9,` 829 `),n(10,"td",42)(11,"strong"),e(12),t()(),e(13,` 830 `),n(14,"td",42),e(15),t(),e(16,` 831 `),n(17,"td",0)(18,"code"),e(19),t()(),e(20,` 832 `),t(),e(21,` 833 `)),a&2){let l,d=r.$implicit;i(5),y((l=d.severity)==="defect"?5:l==="drift"?6:7),i(7),p(d.gap),i(3),p(d.fix),i(4),p(d.touches)}}var Jo=(()=>{let r=class r{constructor(d){this.siteDataService=d,this.snapshotDate="2026-09-01",this.systems=[{system:"Core ramps",home:"1_base/variables.scss",values:"6 ramps \xB7 90 steps",owner:"design system",themeable:"no",anchor:"ramps"},{system:"Semantic aliases",home:"1_base/variables.scss",values:"34 tokens",owner:"design system",themeable:"no",anchor:"aliases"},{system:"Text & background classes",home:"1_base/modifiers.scss",values:"14 text \xB7 14 bg",owner:"design system",themeable:"no",anchor:"utilities"},{system:"Event colors",home:"1_base/variables.scss",values:"4 tokens",owner:"design system",themeable:"no",anchor:"events"},{system:"Program type colors",home:"program-navigation.component.ts",values:"9 hardcoded hex",owner:"one component",themeable:"no",anchor:"program-types"},{system:"Team colors",home:"1_base/team-colors/",values:"14 ramps \xB7 11 steps",owner:"design system",themeable:"per-record",anchor:"teams"},{system:"Dashboard & chart",home:"variables.scss + chart TS",values:"14 tokens + inline hex",owner:"split",themeable:"no",anchor:"charts"},{system:"Avatar backgrounds",home:"variables.scss + player-profile-photo.scss",values:"10 fills \xB7 3 foregrounds",owner:"design system",themeable:"no",anchor:"avatars"},{system:"Buttons & input chrome",home:"variables.scss + ng-theme.scss",values:"19 --theme- \xB7 19 --cms- \xB7 202 --p-",owner:"design system",themeable:"club",anchor:"chrome"},{system:"Club theme overrides",home:"header.component.ts (runtime)",values:"13 admin fields",owner:"club admin",themeable:"club",anchor:"theme"},{system:"Off-token hex",home:"(scattered)",values:"609 decls \xB7 117 distinct",owner:"nobody",themeable:"no",anchor:"foreign"}],this.ramps=[{name:"Grey",region:"#region Neutral/Grey",steps:[{token:"--grey-0",hex:"#ffffff",uses:4,note:"Same value as --color-white (364 uses)."},{token:"--grey-50",hex:"#fafbfc",uses:82,note:"--primary-background"},{token:"--grey-75",hex:"#f5f8fa",uses:57,note:"--light-grey-background"},{token:"--grey-100",hex:"#f1f5f8",uses:101,note:"--secondary-background \xB7 note alert fill"},{token:"--grey-200",hex:"#e9eff4",uses:101,note:"input group addon fill"},{token:"--grey-300",hex:"#dce4e9",uses:63,note:"--border-color-light"},{token:"--grey-400",hex:"#cdd4da",uses:108,note:"--border-color \xB7 --form-border"},{token:"--grey-500",hex:"#b8c0c5",uses:44,note:""},{token:"--grey-600",hex:"#9ea5aa",uses:91,note:"--text-grey-lt \xB7 .text-grey-lt"},{token:"--grey-700",hex:"#7f8489",uses:85,note:"note alert icon"},{token:"--grey-800",hex:"#595c60",uses:91,note:"--text-grey \xB7 --form-label \xB7 .text-grey"},{token:"--grey-900",hex:"#2e3032",uses:72,note:"--base-text \xB7 --header-link \xB7 --icon-link"},{token:"--grey-1000",hex:"#000000",uses:12,note:"Same value as --color-black (44 uses)."}]},{name:"Green",region:"#region Green",steps:[{token:"--green-25",hex:"#eef9ec",uses:5,note:"--light-green-background"},{token:"--green-50",hex:"#ddf3d9",uses:10,note:"success alert fill"},{token:"--green-100",hex:"#ccf1c2",uses:9,note:""},{token:"--green-200",hex:"#a9e397",uses:4,note:""},{token:"--green-300",hex:"#8fdb75",uses:7,note:".bg-green-lt"},{token:"--green-400",hex:"#78c867",uses:10,note:""},{token:"--green-500",hex:"#5ab361",uses:6,note:""},{token:"--green-600",hex:"#4ca45a",uses:28,note:"--success \xB7 --confirmation \xB7 --border-green \xB7 .text-green-alt"},{token:"--green-700",hex:"#3c894d",uses:31,note:".text-green"},{token:"--green-800",hex:"#2d6944",uses:17,note:""},{token:"--green-900",hex:"#1c4130",uses:6,note:""},{token:"--green-950",hex:"#124012",uses:0,note:"dead"},{token:"--green-1000",hex:"#0d2a0c",uses:1,note:""},{token:"--green-1500",hex:"#081906",uses:0,note:"dead"},{token:"--green-2000",hex:"#030c03",uses:0,note:"dead"}]},{name:"Red",region:"#region Red",steps:[{token:"--red-25",hex:"#fff2f3",uses:2,note:""},{token:"--red-50",hex:"#ffdee0",uses:22,note:""},{token:"--red-100",hex:"#fdb5b8",uses:12,note:"error alert fill"},{token:"--red-200",hex:"#f98d91",uses:5,note:""},{token:"--red-300",hex:"#f4696c",uses:1,note:""},{token:"--red-400",hex:"#eb464a",uses:4,note:""},{token:"--red-500",hex:"#e0222b",uses:11,note:'--warning \u2014 the token named "warning" is RED'},{token:"--red-600",hex:"#c6161f",uses:8,note:""},{token:"--red-700",hex:"#a11019",uses:35,note:"--error \xB7 .text-red"},{token:"--red-800",hex:"#7d0d14",uses:25,note:".text-dark-red \xB7 error alert border"},{token:"--red-900",hex:"#570a0f",uses:4,note:""},{token:"--red-950",hex:"#380508",uses:0,note:"dead"},{token:"--red-1000",hex:"#2a0406",uses:0,note:"dead"},{token:"--red-1500",hex:"#1e0204",uses:0,note:"dead"},{token:"--red-2000",hex:"#0c0102",uses:0,note:"dead"}]},{name:"Orange",region:"#region Orange",steps:[{token:"--orange-25",hex:"#fff4e8",uses:0,note:"dead"},{token:"--orange-50",hex:"#ffe2c8",uses:13,note:""},{token:"--orange-100",hex:"#ffc999",uses:1,note:""},{token:"--orange-200",hex:"#ffb36f",uses:3,note:""},{token:"--orange-300",hex:"#ff9a4c",uses:1,note:""},{token:"--orange-400",hex:"#ff8732",uses:2,note:""},{token:"--orange-500",hex:"#ff7500",uses:8,note:""},{token:"--orange-600",hex:"#e46600",uses:1,note:""},{token:"--orange-700",hex:"#c65400",uses:6,note:""},{token:"--orange-800",hex:"#993800",uses:1,note:""},{token:"--orange-900",hex:"#5e1f00",uses:2,note:""},{token:"--orange-950",hex:"#2e1203",uses:0,note:"dead"},{token:"--orange-1000",hex:"#220a00",uses:0,note:"dead"},{token:"--orange-1500",hex:"#160600",uses:0,note:"dead"},{token:"--orange-2000",hex:"#0d0300",uses:0,note:"dead"}]},{name:"Yellow",region:"#region Yellow",steps:[{token:"--yellow-25",hex:"#fff3c9",uses:2,note:""},{token:"--yellow-50",hex:"#ffe1b8",uses:17,note:"warning alert fill \u2014 an ORANGE inside the yellow ramp"},{token:"--yellow-100",hex:"#ffe98f",uses:3,note:"lighter than --yellow-50 \u2014 ramp is out of order"},{token:"--yellow-200",hex:"#ffe066",uses:5,note:""},{token:"--yellow-300",hex:"#ffd338",uses:7,note:".text-yellow"},{token:"--yellow-400",hex:"#f7cf4c",uses:13,note:""},{token:"--yellow-500",hex:"#f5bf41",uses:13,note:"--caution \xB7 warning alert border"},{token:"--yellow-600",hex:"#d39c36",uses:9,note:".text-warn \xB7 .text-warning"},{token:"--yellow-700",hex:"#b0782a",uses:3,note:"warning alert icon"},{token:"--yellow-800",hex:"#8b501f",uses:3,note:""},{token:"--yellow-900",hex:"#4f2c0b",uses:2,note:""},{token:"--yellow-950",hex:"#2a1b08",uses:0,note:"dead"}]}],this.deadSteps=this.ramps.reduce((s,o)=>s+o.steps.filter(x=>x.uses===0).length,0),this.aliases=[{token:"--color-white",resolvesTo:"#ffffff",hex:"#ffffff",uses:364,note:"The single most-used token in the app. Duplicates --grey-0.",suspect:!0},{token:"--color-black",resolvesTo:"#000000",hex:"#000000",uses:44,note:"Duplicates --grey-1000.",suspect:!0},{token:"--color-black-lt",resolvesTo:"#111111",hex:"#111111",uses:6,note:"Not on any ramp.",suspect:!1},{token:"--base-text",resolvesTo:"--grey-900",hex:"#2e3032",uses:93,note:'Source comment: "not just being used for text \u2014 borders and backgrounds use this too."',suspect:!1},{token:"--base-text-alt",resolvesTo:"--blue-1000",hex:"#001537",uses:6,note:"Same value as --base-header and .text-navy.",suspect:!0},{token:"--base-text-alt-lt",resolvesTo:"--blue-900",hex:"#054584",uses:2,note:"Same value as .text-blue and --002d73.",suspect:!0},{token:"--base-header",resolvesTo:"--blue-1000",hex:"#001537",uses:2,note:"Same value as --base-text-alt. Trailing comment still says //#221E20.",suspect:!0},{token:"--base-sub-header",resolvesTo:"#6684a0",hex:"#6684a0",uses:1,note:'Off-ramp. Comment says "60% of base-header" but it is not that value.',suspect:!0},{token:"--warning",resolvesTo:"--red-500",hex:"#e0222b",uses:20,note:'Named "warning", renders RED. .text-warning renders YELLOW. Same word, two colors.',suspect:!0},{token:"--caution",resolvesTo:"--yellow-500",hex:"#f5bf41",uses:13,note:"The token that actually holds the warning yellow.",suspect:!1},{token:"--error",resolvesTo:"--red-700",hex:"#a11019",uses:3,note:"Only 3 uses \u2014 --warning (a different red) is used 20 times instead.",suspect:!0},{token:"--success",resolvesTo:"--green-600",hex:"#4ca45a",uses:18,note:"",suspect:!1},{token:"--confirmation",resolvesTo:"--green-600",hex:"#4ca45a",uses:1,note:"Identical to --success. Two names, one green.",suspect:!0},{token:"--brand-color",resolvesTo:"#ec4f2e",hex:"#ec4f2e",uses:4,note:"Sprocket orange. Off-ramp \u2014 nearest is --orange-500 #ff7500.",suspect:!0},{token:"--002d73",resolvesTo:"--blue-900",hex:"#054584",uses:20,note:"Named after a hex it no longer holds. #002d73 is a different blue.",suspect:!0},{token:"--border-blue",resolvesTo:"--blue-700",hex:"#1d6ae5",uses:9,note:"Duplicate of --primary-link at another name.",suspect:!0},{token:"--border-green",resolvesTo:"--green-600",hex:"#4ca45a",uses:2,note:"Duplicate of --success at another name.",suspect:!0},{token:"--header-link",resolvesTo:"--grey-900",hex:"#2e3032",uses:1,note:'Filed under "Orphan Colors" in source. Trailing comment says //#30363D.',suspect:!0},{token:"--icon-link",resolvesTo:"--grey-900",hex:"#2e3032",uses:1,note:"Identical to --header-link.",suspect:!0},{token:"--form-label",resolvesTo:"--grey-800",hex:"#595c60",uses:3,note:"",suspect:!1},{token:"--text-grey",resolvesTo:"--grey-800",hex:"#595c60",uses:4,note:"Token and class .text-grey hold the same value by coincidence, not by reference.",suspect:!1},{token:"--text-grey-lt",resolvesTo:"--grey-600",hex:"#9ea5aa",uses:5,note:"",suspect:!1},{token:"--border-color",resolvesTo:"--grey-400",hex:"#cdd4da",uses:90,note:"",suspect:!1},{token:"--border-color-light",resolvesTo:"--grey-300",hex:"#dce4e9",uses:3,note:"",suspect:!1},{token:"--form-border",resolvesTo:"--grey-400",hex:"#cdd4da",uses:13,note:"Duplicate of --border-color at another name.",suspect:!0},{token:"--primary-background",resolvesTo:"--grey-50",hex:"#fafbfc",uses:13,note:"",suspect:!1},{token:"--secondary-background",resolvesTo:"--grey-100",hex:"#f1f5f8",uses:4,note:"",suspect:!1},{token:"--light-grey-background",resolvesTo:"--grey-75",hex:"#f5f8fa",uses:11,note:"",suspect:!1},{token:"--light-blue-background",resolvesTo:"--blue-50",hex:"#ebf7ff",uses:6,note:"Same value as the info alert fill.",suspect:!1},{token:"--light-green-background",resolvesTo:"--green-25",hex:"#eef9ec",uses:1,note:"",suspect:!1},{token:"--color-highlight",resolvesTo:"#ff0",hex:"#ffff00",uses:1,note:"Only 3-digit hex in the file. Backs .text-highlight, which sets background not color.",suspect:!0},{token:"--color-code",resolvesTo:"#e01a76",hex:"#e01a76",uses:1,note:"Off-ramp magenta for <code>. Defined in styles.scss, not the palette.",suspect:!1},{token:"--primary-link",resolvesTo:"--blue-700",hex:"#1d6ae5",uses:96,note:"See blues & links.",suspect:!1},{token:"--primary-link-hover",resolvesTo:"--blue-800",hex:"#0e58bb",uses:36,note:"See blues & links.",suspect:!1}],this.suspectAliases=this.aliases.filter(s=>s.suspect).length,this.textClasses=[{className:"text-red",token:"--red-700",hex:"#a11019",onWhite:8.07,role:"error intent"},{className:"text-dark-red",token:"--red-800",hex:"#7d0d14",onWhite:10.83,role:"darker error"},{className:"text-warning",token:"--yellow-600",hex:"#d39c36",onWhite:2.45,role:"warning intent \u2014 but --warning the token is red"},{className:"text-yellow",token:"--yellow-300",hex:"#ffd338",onWhite:1.44,role:"not usable as text on white"},{className:"text-green",token:"--green-700",hex:"#3c894d",onWhite:4.31,role:"success intent"},{className:"text-green-alt",token:"--green-600",hex:"#4ca45a",onWhite:3.1,role:"second success green"},{className:"text-blue",token:"--blue-900",hex:"#054584",onWhite:9.59,role:"info intent"},{className:"text-navy",token:"--blue-1000",hex:"#001537",onWhite:18.07,role:"heading blue"},{className:"text-header-blue",token:"--blue-800 @ .8 opacity",hex:"#0e58bb",onWhite:6.7,role:"only class that makes a color with opacity"},{className:"text-primary-link",token:"--primary-link",hex:"#1d6ae5",onWhite:4.95,role:"link blue on non-anchors"},{className:"text-color-default",token:"--base-text",hex:"#2e3032",onWhite:13.25,role:"body"},{className:"text-grey",token:"--grey-800",hex:"#595c60",onWhite:6.72,role:"de-emphasis"},{className:"text-grey-lt",token:"--grey-600",hex:"#9ea5aa",onWhite:2.5,role:"furthest de-emphasis"},{className:"text-white",token:"--color-white",hex:"#ffffff",onWhite:1,role:"on dark only"}],this.bgClasses=[{className:"bg-white",token:"--color-white"},{className:"bg-grey-lt",token:"--grey-75"},{className:"bg-grey",token:"--grey-100"},{className:"bg-grey-md",token:"--grey-200"},{className:"bg-blue-lt",token:"--blue-50"},{className:"bg-green-lt",token:"--green-50"},{className:"bg-green",token:"--green-600"},{className:"bg-red-lt",token:"--red-50"},{className:"bg-red",token:"--red-700"},{className:"bg-navy",token:"--blue-1000"},{className:"bg-navy-lt",token:"--blue-900"},{className:"bg-warning",token:"--yellow-50"},{className:"bg-primary",token:"--primary-link"},{className:"bg-secondary",token:"--grey-600"}],this.eventColors=[{token:"--event-color--game",hex:"#f78909",label:"Game",uses:6,onWhite:2.46},{token:"--event-color--practice",hex:"#0e58bb",label:"Practice",uses:6,onWhite:6.7},{token:"--event-color--club",hex:"#039874",label:"Club event",uses:6,onWhite:3.65},{token:"--event-color--default",hex:"#422593",label:"Everything else",uses:8,onWhite:10.95}],this.eventConsumers=["calendar-event-row-simple.component.scss \u2014 fill + 4px left border","calendar-card.component.scss \u2014 card accent","scheduling.component.scss \u2014 dashboard team panel","assets/css/shared/calendarEventCard.scss","3_modules/components/pill.scss \u2014 event pills"],this.programTypes=[{label:"Core (Team)",id:1,hex:"#64BDFF",teamToken:"team-color-9 (blue) \xB7 300"},{label:"Tryouts",id:2,hex:"#8C8BEC",teamToken:"team-color-8 (indigo) \xB7 300"},{label:"Supplemental",id:3,hex:"#B8D84F",teamToken:"team-color-13 (lime) \xB7 400"},{label:"Other / fallback",id:4,hex:"#87D388",teamToken:"team-color-12 (green) \xB7 300"},{label:"Tournament",id:5,hex:"#FDD55C",teamToken:"team-color-1 (yellow) \xB7 300"},{label:"League",id:6,hex:"#189E8A",teamToken:"team-color-11 (teal) \xB7 500"},{label:"Sessions",id:7,hex:"#FF8E43",teamToken:"team-color-2 (orange) \xB7 400"},{label:"Subscription",id:8,hex:"#5756D5",teamToken:"team-color-8 (indigo) \xB7 500"},{label:"Camps & Clinics",id:9,hex:"#1BA6D8",teamToken:"team-color-10 (cyan) \xB7 500"}],this.teamRamps=[{index:1,name:"Yellow"},{index:2,name:"Orange"},{index:3,name:"Red"},{index:4,name:"Ros\xE9"},{index:5,name:"Pink"},{index:6,name:"Fuchsia"},{index:7,name:"Purple"},{index:8,name:"Indigo"},{index:9,name:"Blue"},{index:10,name:"Cyan"},{index:11,name:"Teal"},{index:12,name:"Green"},{index:13,name:"Lime"},{index:14,name:"Moss"}],this.teamSteps=[50,100,200,300,400,500,600,700,800,900,950],this.teamStepUses={50:10,100:10,200:10,300:10,400:10,500:25,600:11,700:10,800:10,900:10,950:10},this.dashboardColors=[{token:"--dashboard-color-default",hex:"#1D6AE5",uses:2,role:"chart series 1 \u2014 same value as --blue-700",onWhite:4.95},{token:"--dashboard-color-success",hex:"#00CE9B",uses:24,role:"chart series 2 \u2014 a green n
833othing else in the app uses",onWhite:2.04},{token:"--dashboard-color-medium",hex:"#FFAA02",uses:23,role:"chart series 3 \u2014 off-ramp amber",onWhite:1.91},{token:"--dashboard-color-critical",hex:"#EC4F2E",uses:25,role:"chart series 4 \u2014 same value as --brand-color",onWhite:3.67},{token:"--dashboard-color-low",hex:"#c9d5dd",uses:7,role:"heatmap low",onWhite:null},{token:"--dashboard-color-medium-low",hex:"#efd17d",uses:1,role:"heatmap medium-low",onWhite:null},{token:"--dashboard-color-none",hex:"#e8f0f6",uses:0,role:"heatmap empty \u2014 dead",onWhite:null},{token:"--dashboard-bar-primary",hex:"#00CE9B",uses:1,role:"identical to --dashboard-bar-secondary",onWhite:null},{token:"--dashboard-bar-secondary",hex:"#00CE9B",uses:1,role:"identical to --dashboard-bar-primary",onWhite:null},{token:"--dashboard-bar-male",hex:"#9abcd6",uses:0,role:"dead",onWhite:null},{token:"--dashboard-bar-female",hex:"#d69a9a",uses:0,role:"dead",onWhite:null},{token:"--dashboard-bar-other",hex:"#9bd8a5",uses:0,role:"dead",onWhite:null},{token:"--dashboard-chart-mobile",hex:"#ff7f0e",uses:0,role:"dead \u2014 matplotlib default orange",onWhite:null},{token:"--dashboard-chart-desktop",hex:"#1f77b4",uses:0,role:"dead \u2014 matplotlib default blue",onWhite:null}],this.chartConventions=[{convention:"Read the token at runtime, fall back to hex",example:"documentStyle.getPropertyValue('--dashboard-color-default').trim() || '#1D6AE5'",seenIn:"analytics-dashboard.component.ts (donut + bar series)",problem:"Correct. This is the one that actually tracks the token."},{convention:"Token read, then commented out and replaced with hex",example:"borderColor: '#1D6AE5', //documentStyle.getPropertyValue('--blue-700') || '#1D6AE5'",seenIn:"analytics-dashboard.component.ts:728, :737",problem:"Someone hit a timing bug and pinned the hex. --green-700 is #3c894d; the pinned partner value is #00D297, a third green."},{convention:"Hex with the token name in a trailing comment",example:"borderColor: '#1d6ae5', // --blue-700",seenIn:"progress.component.ts (29 hex, every one annotated)",problem:"The comment is the only link to the token. Change the ramp and every chart silently keeps the old color."},{convention:"Bare hex from a foreign palette",example:"if (intensity < 0.5) return '#6baed6';",seenIn:"analytics-dashboard.component.ts:613-617, :651-655",problem:"A 5-step ColorBrewer Blues ramp, duplicated in two functions, unrelated to --blue-*."}],this.avatarColors=[{token:"--user-avatar-1",hex:"#f7b905",sampleId:1,ratio:8.51,onLight:!0},{token:"--user-avatar-2",hex:"#e84234",sampleId:2,ratio:3.04},{token:"--user-avatar-3",hex:"#f43993",sampleId:3,ratio:2.75},{token:"--user-avatar-4",hex:"#595c60",sampleId:4,ratio:5.01},{token:"--user-avatar-5",hex:"#ac51fc",sampleId:5,ratio:3.06},{token:"--user-avatar-6",hex:"#7b1fa2",sampleId:6,ratio:5.77},{token:"--user-avatar-7",hex:"#0c4caf",sampleId:7,ratio:5.63},{token:"--user-avatar-8",hex:"#4688f5",sampleId:8,ratio:2.76},{token:"--user-avatar-9",hex:"#0592a1",sampleId:9,ratio:2.93},{token:"--user-avatar-0",hex:"#34b557",sampleId:10,ratio:2.21}],this.avatarFallback={token:"--user-avatar-none",hex:"#D1D1D1",wasHex:"#e9eff4",wasToken:"--grey-200",ratio:9.42,wasShared:1.09,onLight:!0},this.avatarForegrounds=[{selector:"span.user-initials.userN",home:"3_modules/components/player-profile-photo.scss",foreground:"var(--user-avatar-text) \xB7 -on-light on .user1",sizes:"0.65rem tiny/small \xB7 0.875rem default \xB7 1.5rem large \xB7 2.5rem banner",reach:"every avatar in the app \u2014 the one place the foreground is decided",status:"live"},{selector:".chat-first-few div.userN",home:"was message-avatar-group.component.scss:67",foreground:"none declared \u2014 inherited --base-text",sizes:"0.5rem (2-3 up) \xB7 0.65rem (1 up)",reach:"gone \u2014 the group renders app-user-initials now, so it takes the pair above",status:"dead"},{selector:".player-profile-header .profile-image span.user-initials.default-circle",home:"was 3_modules/templates.scss:425",foreground:"var(--grey-500) #b8c0c5",sizes:"70px circle \xB7 --text-larger",reach:"gone \u2014 never matched anything; its only call site rendered .large-circle",status:"dead"}],this.buttonLayers=[{themeToken:"--theme-button-background",cmsToken:"--cms-button-background",setAtRuntime:!1,directConsumers:0},{themeToken:"--theme-button-background-hover",cmsToken:"--cms-button-background-hover",setAtRuntime:!0,directConsumers:0},{themeToken:"--theme-button-text-color",cmsToken:"--cms-button-text-color",setAtRuntime:!0,directConsumers:0},{themeToken:"--theme-button-text-color-hover",cmsToken:"--cms-button-text-color-hover",setAtRuntime:!0,directConsumers:0},{themeToken:"--theme-button-border",cmsToken:"--cms-button-border",setAtRuntime:!0,directConsumers:0},{themeToken:"--theme-button-border-hover",cmsToken:"--cms-button-border-hover",setAtRuntime:!0,directConsumers:0},{themeToken:"--theme-button-background--primary",cmsToken:"--cms-button-background--primary",setAtRuntime:!0,directConsumers:0},{themeToken:"--theme-button-border--primary",cmsToken:"--cms-button-border--primary",setAtRuntime:!0,directConsumers:2},{themeToken:"--theme-button-text-color--naked",cmsToken:"--cms-button-text-color--naked",setAtRuntime:!0,directConsumers:0},{themeToken:"--theme-button-background--naked",cmsToken:"--cms-button-background--naked",setAtRuntime:!1,directConsumers:0},{themeToken:"--theme-button-radius",cmsToken:"--cms-button-radius",setAtRuntime:!0,directConsumers:6}],this.primeBridge=[{token:"--p-primary-500",resolvesTo:"--blue-700",drives:"focus ring, form-field focus border, badge, tabs"},{token:"--p-select-option-selected-background",resolvesTo:"--primary-link",drives:"selected dropdown option"},{token:"--p-select-border-color",resolvesTo:"--form-border",drives:"select chrome"},{token:"--p-select-hover-border-color",resolvesTo:"--primary-link-hover",drives:"select hover"},{token:"--p-inputgroup-addon-background",resolvesTo:"--grey-200",drives:"input group addon"},{token:"--p-inputgroup-addon-color",resolvesTo:"--grey-800",drives:"input group addon text"},{token:"--p-button-primary-active-background",resolvesTo:"--primary-link-hover",drives:"primary button :active"},{token:"--p-button-text-primary-hover-background",resolvesTo:"--grey-200",drives:"text button hover fill"}
833],this.themeFields=[{field:"topNavigationBackground",cssVar:"--theme-top-navigation-background",consumers:24,reaches:"primary nav fill (+ derived -hover)",broken:!1},{field:"topNavigationTextColor",cssVar:"--theme-top-navigation-text-color",consumers:0,reaches:"Reaches CSS only via --theme-top-navigation-background-contrast (24). The named var is dead.",broken:!0},{field:"colorCTAButtons",cssVar:"--theme-color-cta-buttons",consumers:13,reaches:"CTA buttons across page-builder content",broken:!1},{field:"colorCTAButtons (hover)",cssVar:"--theme-color-cta-buttons--hover",consumers:4,reaches:"CTA hover text, darkened until it clears AA on the white hover fill",broken:!1},{field:"colorAccent",cssVar:"--theme-color-accent",consumers:7,reaches:"accent surfaces; contrast partner has 10",broken:!1},{field:"colorPrimary",cssVar:"--theme-color-primary",consumers:0,reaches:"Nothing in CSS reads it, or its -hover / -contrast partners. Only the mobile-home preview uses the raw field.",broken:!0},{field:"bannerColor",cssVar:"--theme-banner-background",consumers:6,reaches:"banner fill (+ auto contrast)",broken:!1},{field:"textColor",cssVar:"--theme-banner-text-color",consumers:3,reaches:"banner text",broken:!1},{field:"buttonBackgroundColor",cssVar:"--theme-button-* (9 of them)",consumers:8,reaches:"default / primary / naked button flavors",broken:!1},{field:"buttonTextColor",cssVar:"--theme-button-text-color-hover*",consumers:5,reaches:"set after a contrast check",broken:!1},{field:"footerNavigationBackground",cssVar:"--theme-footer-background-color",consumers:1,reaches:"footer fill",broken:!1},{field:"footerNavigationHeaderColor",cssVar:"--theme-footer-header-color",consumers:1,reaches:"footer headings",broken:!1},{field:"footerNavigationLinkColor",cssVar:"--theme-footer-link-color",consumers:3,reaches:"footer links",broken:!1}
833,{field:"pageBackgroundColor",cssVar:"--html-background-color",consumers:1,reaches:"html background",broken:!1},{field:"pageOverlayColor / pageSecondaryOverlayColor",cssVar:"--html-background-image",consumers:1,reaches:"composed into a linear-gradient in TS, not a color var",broken:!1},{field:"columnTextColor",cssVar:"(none)",consumers:0,reaches:"Applied inline by page-builder, never becomes a variable.",broken:!1}],this.brokenThemeFields=this.themeFields.filter(s=>s.broken).length,this.foreign=[{hex:"#007bff",origin:"Bootstrap 4 $primary",decls:31,files:12,nearest:"--blue-600 #297ef4"},{hex:"#e5e7eb",origin:"Tailwind gray-200",decls:28,files:3,nearest:"--grey-300 #dce4e9"},{hex:"#6b7280",origin:"Tailwind gray-500",decls:23,files:3,nearest:"--grey-800 #595c60"},{hex:"#6c757d",origin:"Bootstrap 4 $secondary",decls:22,files:6,nearest:"--grey-700 #7f8489"},{hex:"#f8f9fa",origin:"Bootstrap 4 $light",decls:21,files:9,nearest:"--grey-50 #fafbfc"},{hex:"#dee2e6",origin:"Bootstrap 4 $gray-300",decls:20,files:9,nearest:"--grey-300 #dce4e9"},{hex:"#4f46e5",origin:"Tailwind indigo-600",decls:20,files:3,nearest:"--blue-800 #0e58bb"},{hex:"#28a745",origin:"Bootstrap 4 $success",decls:19,files:7,nearest:"--green-600 #4ca45a"},{hex:"#f3f4f6",origin:"Tailwind gray-100",decls:16,files:4,nearest:"--grey-100 #f1f5f8"},{hex:"#e0e0e0",origin:"Material grey-300",decls:16,files:5,nearest:"--grey-300 #dce4e9"},{hex:"#495057",origin:"Bootstrap 4 $gray-700",decls:14,files:4,nearest:"--grey-800 #595c60"},{hex:"#f9fafb",origin:"Tailwind gray-50",decls:13,files:3,nearest:"--grey-50 #fafbfc"},{hex:"#dc3545",origin:"Bootstrap 4 $danger",decls:12,files:6,nearest:"--red-600 #c6161f"},{hex:"#4b5563",origin:"Tailwind gray-600",decls:10,files:3,nearest:"--grey-800 #595c60"},{hex:"#374151",origin:"Tailwind gray-700",decls:9,files:2,nearest:"--grey-900 #2e3032"},{hex:"#ef4444",origin:"Tailwind red-500",decls:8,files:3,nearest:"--red-500 #e0222b"}],this.foreignTotalDecls=609,this.foreignDistinct=117,this.gaps=[{gap:"colorPrimary is an admin-editable theme color that changes nothing",evidence:"theme.component.html:392 exposes the field; header.component.ts:834 writes --theme-color-primary. Zero CSS consumers, including its -hover and -contrast partners.",impact:"Admins set a primary brand color and see no change on the site.",severity:"defect",demo:"unread-var",fix:`Decide what primary means, then either point something at it or retire the field. --theme-color-accent is already wired and already means "the club's color" to 17 rules \u2014 if primary is a duplicate of accent, remove the control rather than wiring a second one.`,touches:"theme.component.html:392 \xB7 header.component.ts:833-839"},{gap:"1 team in 10 falls back to grey",evidence:"TeamColorsService.getTeamColorClassName() does teamID.toString().slice(-2). A teamID ending 00-09 yields class team-color-05, but only .team-color-1 \u2026 .team-color-14 exist.",impact:"Those teams silently render the default grey ramp on calendars, dots and pipes.",severity:"defect",demo:"team-fallback",fix:"Derive the index arithmetically instead of by string slicing: ((teamID - 1) % 14) + 1 always lands in 1-14 and spreads evenly. The slice also biases the distribution \u2014 8 of the 14 hues are only reachable via the two-digit branch.",touches:"team-colors.service.ts getTeamColorClassName()"},{gap:"No avatar fill clears AA under the foreground that ships on it",evidence:"The base span.user-initials rule set one shared foreground for every fill. Composited over the ten --user-avatar-* fills the shared white runs 2.21:1 to 5.77:1 \u2014 see \xA79. It also reached the --grey-200 fallback fill at 1.09:1, and gold at 1.57:1.",impact:"Initials are what tells one avatar from another, and seven of the ten fills sit below 4.5:1 at every size the component renders. On gold and on the fallback they were effectively invisible.",severity:"defect",fix:"Resolved by scope, not by colour: the initials are decorative and aria-hidden, so SC 1.4.3 does not apply \u2014 see the avatars page \xA71. The token set gained a single --user-avatar-text so the three rules in \xA79 stop each picking their own, and the two fills where the type was not low-contrast but absent take --user-avatar-text-on-light instead: gold (1.57:1 white, 8.51:1 dark) and the no-id fallback (#D1D1D1, 1.41:1 white, 9.42:1 dark). Matched to the mobile client 2026-09-03.",touches:"variables.scss #region User Avatar Backgroun
833ds \xB7 player-profile-photo.scss:33 \xB7 message-avatar-group.component.scss"},{gap:"var(--grey900) \u2014 a token that was never defined",evidence:"staff-card.component.scss:7, cms.scss:234, pb-blog.scss:24. The real token is --grey-900 with a hyphen.",impact:"Those three declarations are no-ops; the elements inherit instead.",severity:"defect",demo:"missing-hyphen",fix:"Add the hyphen \u2014 but check the rendered result first. These have been inheriting for long enough that the inherited color may be what the design now expects, in which case delete the declaration instead of fixing it.",touches:"staff-card.component.scss:7 \xB7 cms.scss:234 \xB7 pb-blog.scss:24"},{gap:'"warning" means two different colors',evidence:"--warning resolves to --red-500 (#e0222b). .text-warning resolves to --yellow-600 (#d39c36).",impact:"Picking by name gets you red or yellow depending on whether you reach for the token or the class.",severity:"drift",demo:"warning-two-colors",fix:"Retire --warning. --caution already holds the warning yellow and --error already holds the error red, so every one of the 20 --warning uses is really one or the other \u2014 audit each and re-point it, then delete the token so the name cannot be picked again.",touches:"20 call sites \xB7 variables.scss #region Orphan Colors"},{gap:"The yellow ramp is out of order",evidence:"--yellow-50 is #ffe1b8 (an orange), --yellow-100 is #ffe98f (lighter than the step below it).",impact:"Choosing a step by number does not reliably choose a lightness.",severity:"drift",demo:"yellow-order",fix:"Move #ffe1b8 to the orange ramp where its hue belongs and re-cut yellow 25-200 as a monotonic run. 17 of its 20 uses are the warning-alert fill, so most of the churn lands in one partial.",touches:"variables.scss #region Yellow \xB7 inline-alert.component.scss"},{gap:"Program-type colors are the team palette, retyped as hex",evidence:"All 9 constants in program-navigation.component.ts land exactly on a --team-color-* step.",impact:"Re-tuning the team palette leaves the program cards behind. Locked in by a spec that asserts the literals.",severity:"drift",demo:"program-hex",fix:"Emit the class, not the color: give each program type a .team-color-N and let the card read var(--team-color-300). The spec should then assert the hue index, which is the thing that is actually a decision \u2014 the hex is an implementation detail of the palette.",touches:"program-navigation.component.ts + .spec.ts + .html"},{gap:"Charts pick colors four different ways",evidence:"See \xA78. One reads the token, one comments the token out, one puts the token in a trailing comment, one uses a ColorBrewer ramp.",impact:"Three of the four do not track the palette at all.",severity:"drift",demo:"chart-greens",fix:"One helper \u2014 readToken(name, fallback) \u2014 in shared/constants.ts, and every chart calls it. That collapses the four conventions to one and gives the commented-out reads somewhere to come back to. Resolve the three greens to a single series color while doing it.",touches:"shared/constants.ts \xB7 6 chart components"},{gap:"Components reach past the --cms-* layer they were told to use",evidence:'variables.scss:376 says "--theme-* are the raw/palette layer. Components should not consume these directly." 8 component rules read --theme-button-* anyway.',impact:"The semantic layer cannot be re-pointed without breaking those 8.",severity:"drift",fix:"Re-point the 8 rules at their --cms-* equivalent. Mechanical \u2014 the semantic token already resolves to the raw one, so the rendered result is unchanged and the diff is safe to land on its own.",touches:"page-builder-row-edit \xB7 feature-cards-content \xB7 calendar-content \xB7 button-content"},{gap:"Three grey systems ship side by side",evidence:"Sprocket --grey-*, Bootstrap 4 greys (#6c757d, #f8f9fa, #dee2e6, #495057) and Tailwind greys (#e5e7eb, #6b7280, #f3f4f6, #f9fafb, #4b5563, #374151).",impact:"609 hardcoded declarations, 117 distinct values, none of them themeable.",severity:"drift",demo:"three-greys",fix:"Sweep by origin, not by file. The Bootstrap set and the Tailwind set are each a small fixed vocabulary with a known nearest token, so one find-and-replace table clears most of the
833609. Worth its own project doc \u2014 the swap is visible, so it needs eyes-on per wave.",touches:"app/** component SCSS \u2014 117 distinct values"},{gap:"The 60-color team accent palette is dead",evidence:"3_modules/components/team-accent-colors.scss generates .team-color-0 \u2026 .team-color-59 and --team-color-0 \u2026 59, but its @import in components.scss:1063 is commented out.",impact:"223 lines of Flat-UI palette that would collide with the .team-color-1 \u2026 14 ramp classes if re-enabled.",severity:"dead",fix:"Delete the file and the commented @import. It has been off long enough that nothing can depend on it, and leaving it in place means the next person to uncomment it silently overwrites 14 live team hues.",touches:"team-accent-colors.scss \xB7 components.scss:1063"},{gap:`${this.deadSteps} ramp steps and 5 dashboard tokens have zero consumers`,evidence:"The 950-2000 tail of green, red, orange and yellow, plus --dashboard-bar-male / -female / -other and --dashboard-chart-mobile / -desktop.",impact:"They read as available palette but nothing has ever validated them.",severity:"dead",fix:"Leave the ramp tails \u2014 a ramp with holes is worse than a ramp with unused ends, and they cost nothing. Delete the 5 dashboard tokens: they are not a ramp, two of them are matplotlib defaults, and the gendered bar colors would need a design decision before anything used them anyway.",touches:"variables.scss #region Dashboard Charting"},{gap:"This page used to document 18 tokens that no longer exist",evidence:"--color1 \u2026 --color11 and --grey1 \u2026 --grey7 were replaced by the ramps. The only remaining references in the whole app were the swatch labels on this page.",impact:"Fixed by this rewrite \u2014 recorded here because it is why the page went stale invisibly.",severity:"dead",demo:"retired-tokens",fix:"Already done. The lasting fix is structural: this page now reads its counts from a dated snapshot, so a stale figure is visible as a stale date rather than as a swatch that still looks fine.",touches:"this page"}],this.defectCount=this.gaps.filter(s=>s.severity==="defect").length,this.teamFallbackSamples=[{teamID:2228,emitted:"team-color-8",resolves:!0},{teamID:662,emitted:"team-color-2",resolves:!0},{teamID:105,emitted:"team-color-05",resolves:!1},{teamID:1400,emitted:"team-color-00",resolves:!1}],this.yellowOrderDemo=[{token:"25",hex:"#fff3c9"},{token:"50",hex:"#ffe1b8"},{token:"100",hex:"#ffe98f"},{token:"200",hex:"#ffe066"},{token:"300",hex:"#ffd338"}],this.chartGreensDemo=[{hex:"#00CE9B",label:"--dashboard-color-success"},{hex:"#00D297",label:"pinned in analytics-dashboard"},{hex:"#3c894d",label:"--green-700 (.text-green)"}],this.threeGreysDemo=[{hex:"#dce4e9",label:"--grey-300"},{hex:"#dee2e6",label:"Bootstrap gray-300"},{hex:"#e5e7eb",label:"Tailwind gray-200"}]}ngOnInit(){this.siteDataService.hideSiteLoader()}severityLabel(d){return d==="defect"?"defect":d==="drift"?"drift":"dead code"}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-color"]],standalone:!1,decls:961,vars:27,consts:[[1,"text-small","text-grey"],[3,"routerLink"],[1,"card"],["side","shared"],[1,"overflow-x-auto"],[1,"table","table-bordered","table-hover","sg-doc-table"],[2,"width","14rem"],[2,"width","18rem"],[2,"width","12rem"],[2,"width","9rem"],["id","ramps",1,"card"],["id","aliases",1,"card"],[2,"width","3rem"],[2,"width","15rem"],[2,"width","10rem"],[2,"width","5rem"],["id","utilities",1,"card"],[2,"width","13rem"],[2,"width","8rem"],[1,"text-medium-large","mt-4"],[1,"row"],["
833id","events",1,"card"],[2,"width","16rem"],[2,"width","6rem"],[2,"width","11rem"],[1,"text-small","text-grey","mb-1"],["id","program-types",1,"card"],["side","admin"],[2,"width","4rem"],[2,"width","7rem"],[1,"text-small","text-grey","mb-0"],["id","teams",1,"card"],[1,"table","table-bordered","sg-doc-table"],[1,"text-small","text-grey-lt"],["id","charts",1,"card"],[2,"width","17rem"],[2,"width","22rem"],["id","avatars",1,"card"],[1,"col-4","col-md-2","mb-3","text-center"],["firstName","Ada","lastName","Byron","size","default",3,"id"],[1,"text-smallest","line-height-3","mt-1"],[1,"text-grey-lt"],[1,"text-small"],[1,"text-smallest","text-grey-lt","d-block"],[1,"sg-swatch","sg-swatch--dot"],[1,"text-smallest"],["id","chrome",1,"card"],[1,"bg-grey-lt","border-all","border-radius","p-3","text-medium","overflow-x-auto"],[2,"width","24rem"],["id","theme",1,"card"],["side","member"],[1,"text-red"],[2,"width","20rem"],["id","foreign",1,"card"],["id","gaps",1,"card"],[2,"width","26rem"],[2,"width","30rem"],[3,"routerLink","fragment"],["variant","tag","status","primary","text","club theme"],["variant","tag","status","secondary","text","per team"],[1,"sg-swatch"],["title","duplicate, stale name, or misleading name",1,"text-red"],[1,"text-red","text-small","d-block"],[1,"col-6","col-md-3","mb-3"],[2,"height","3.5rem"],[1,"text-center","text-small"],[1,"p-1"],[1,"sg-swatch","sg-swatch--block"],["variant","tag","status","error","text","defect"],["variant","tag","status","warning","text","drift"],["variant","tag","status","disabled","text","dead code"],[1,"mt-2","p-2","bg-grey-lt","border-all","border-radius"],[1,"d-flex","align-items-center","mb-1"],[1,"sg-swatch","mr-2"],[1,"d-flex","align-items-center"],[1,"d-flex","flex-wrap"],[1,"text-smallest","text-grey-lt","mb-0","mt-1"],[1,"mr-4","text-center"],[1,"text-medium",2,"color","var(--grey900)"],[1,"text-medium",2,"color","var(--grey-900)"],[1,"text-warning"],[1,"d-flex"],[1,"mr-2","text-center"],[1,"text-smallest","line-height-3"],[1,"sg-swatch","mr-2",2,"background-color","#64BDFF"],[1,"d-flex","align-items-center","team-color-9"],[1,"mr-3","text-center"]],template:function(s,o){s&1&&(n(0,"h2"),e(1,"Color"),t(),e(2,` 834`),n(3,"p",0),e(4,` 835 Every system in the app that decides what color something is \u2014 where it lives, who is 836 allowed to change it, and where two of them disagree. Swatches alone can't show that, so this 837 page leads with the map and carries usage counts through every table. 838`),t(),e(5,` 839`),n(6,"p",0),e(7,` 840 Counts are a grep snapshot of `),n(8,"code"),e(9,"ClientApp/src"),t(),e(10," taken "),n(11,"strong"),e(12),t(),e(13,`, 841 with the styleguide itself and the token declarations excluded so a token's count is its real 842 consumers. Contrast is against white. Companion deep-dives: 843 `),n(14,"a",1),e(15,"blues & links"),t(),e(16,` owns the blue 844 ramp and every link treatment; 845 `),n(17,"a",1),e(18,"system alerts & colored text"),t(),e(19,` 846 owns alert intents and the undefined text modifiers. 847`),t(),e(20,` 848 849`),n(21,"div",2),e(22,` 850 `),n(23,"h3"),e(24,"1. Eleven color systems"),t(),e(25,` 851 `),n(26,"app-sg-caption",3),e(27,"the map \u2014 every row below is a section on this page"),t(),e(28,` 852 `),n(29,"p",0),e(30,` 853 Six of these know nothing about the other five. A color set in one cannot be reached from 854 another, which is why the same green arrives three times at three values. 855 `),t(),e(31,` 856 `),n(32,"div",4),e(33,` 857 `),n(34,"table",5),e(35,` 858 `),n(36,"thead"),e(37,` 859 `),n(38,"tr"),e(39,` 860 `),n(40,"th",6),e(41,"System"),t(),e(42,` 861 `),n(43,"th",7),e(44,"Defined in"),t(),e(45,` 862 `),n(46,"th",8),e(47,"Size"),t(),e(48,` 863 `),n(49,"th",9),e(50,"Owner"),t(),e(51,` 864 `),n(52,"th",9),e(53,"Overridable"),t(),e(54,` 865 `),t(),e(55,` 866 `),t(),e(56,` 867 `),n(57,"tbody"),e(58,` 868 `),S(59,G0,25,8,null,null,A0),t(),e(61,` 869 `),t(),e(62,` 870 `),t(),e(63,` 871`),t(),e(64,` 872 873`),n(65,"div",10),e(66,` 874 `),n(67,"h3"),e(68,"2. The core ramps"),t(),e(69,` 875 `),n(70,"app-sg-caption",3),e(71,"1_base/variables.scss"),t(),e(72,` 876 `),n(73,"p",0),e(74,` 877 Five ramps here; the blue ramp lives on 878 `),n(75,"a",1),e(76,"blues & links"),t(),e(77,`. Usage is 879 top-heavy in grey and bottom-empty everywhere else \u2014 `),n(78,"strong"),e(79),t(),e(80,`, all of them in the 950\u20132000 tail. 880 `),t(),e(81,` 881 `),S(82,Z0,35,1,null,null,O0),t(),e(84,` 882 883`),n(85,"div",11),e(86,` 884 `),n(87,"h3"),e(88),t(),e(89,` 885 `),n(90,"app-sg-caption",3),e(91,"1_base/variables.scss \u2014 Utility, Backgroun
885ds, Borders, Orphan Colors"),t(),e(92,` 886 `),n(93,"p",0),e(94,` 887 The layer components are supposed to reach for. Flagged rows are duplicates of another 888 token, names that no longer describe their value, or names that mean the opposite of what 889 they say. 890 `),t(),e(95,` 891 `),n(96,"div",4),e(97,` 892 `),n(98,"table",5),e(99,` 893 `),n(100,"thead"),e(101,` 894 `),n(102,"tr"),e(103,` 895 `),c(104,"th",12),e(105,` 896 `),n(106,"th",13),e(107,"Token"),t(),e(108,` 897 `),n(109,"th",14),e(110,"Resolves to"),t(),e(111,` 898 `),n(112,"th",15),e(113,"Uses"),t(),e(114,` 899 `),n(115,"th"),e(116,"Note"),t(),e(117,` 900 `),t(),e(118,` 901 `),t(),e(119,` 902 `),n(120,"tbody"),e(121,` 903 `),S(122,is,26,7,null,null,Re),t(),e(124,` 904 `),t(),e(125,` 905 `),t(),e(126,` 906`),t(),e(127,` 907 908`),n(128,"div",16),e(129,` 909 `),n(130,"h3"),e(131,"4. Color in text & backgrounds"),t(),e(132,` 910 `),n(133,"app-sg-caption",3),e(134,"1_base/modifiers.scss \u2014 #region Text Colors"),t(),e(135,` 911 `),n(136,"p",0),e(137,` 912 Samples carry the live class. Four of the fourteen fall below 4.5:1 on white, which is the 913 floor for body-size text. The full undefined-modifier census (the ones that render as 914 nothing) is on 915 `),n(138,"a",1),e(139,"system alerts & colored text"),t(),e(140,`. 916 `),t(),e(141,` 917 `),n(142,"div",4),e(143,` 918 `),n(144,"table",5),e(145,` 919 `),n(146,"thead"),e(147,` 920 `),n(148,"tr"),e(149,` 921 `),n(150,"th",8),e(151,"Class"),t(),e(152,` 922 `),n(153,"th",6),e(154,"Sample"),t(),e(155,` 923 `),n(156,"th",17),e(157,"Token"),t(),e(158,` 924 `),n(159,"th",18),e(160,"On white"),t(),e(161,` 925 `),n(162,"th"),e(163,"Role"),t(),e(164,` 926 `),t(),e(165,` 927 `),t(),e(166,` 928 `),n(167,"tbody"),e(168,` 929 `),S(169,rs,25,9,null,null,Xo),t(),e(171,` 930 `),t(),e(172,` 931 `),t(),e(173,` 932 933 `),n(174,"h4",19),e(175,"Backgrounds"),t(),e(176,` 934 `),n(177,"p",0),e(178,` 935 Each tile carries the live class, so anything blank below is a class that no longer resolves. 936 `),t(),e(179,` 937 `),n(180,"div",20),e(181,` 938 `),S(182,os,16,4,null,null,Xo),t(),e(184,` 939`),t(),e(185,` 940 941`),n(186,"div",21),e(187,` 942 `),n(188,"h3"),e(189,"5. Event colors"),t(),e(190,` 943 `),n(191,"app-sg-caption",3),e(192,"1_base/variables.scss \u2014 #region Event Colors"),t(),e(193,` 944 `),n(194,"p",0),e(195,` 945 Four tokens, applied by event type. They are fixed \u2014 a club theme cannot change them, 946 and they are unrelated to both the core ramps and the team palette. 947 `),t(),e(196,` 948 `),n(197,"div",4),e(198,` 949 `),n(199,"table",5),e(200,` 950 `),n(201,"thead"),e(202,` 951 `),n(203,"tr"),e(204,` 952 `),c(205,"th",12),e(206,` 953 `),n(207,"th",22),e(208,"Token"),t(),e(209,` 954 `),n(210,"th",23),e(211,"Hex"),t(),e(212,` 955 `),n(213,"th",24),e(214,"Event type"),t(),e(215,` 956 `),n(216,"th",15),e(217,"Uses"),t(),e(218,` 957 `),n(219,"th"),e(220,"On white"),t(),e(221,` 958 `),t(),e(222,` 959 `),t(),e(223,` 960 `),n(224,"tbody"),e(225,` 961 `),S(226,ls,24,7,null,null,Re),t(),e(228,` 962 `),t(),e(229,` 963 `),t(),e(230,` 964 `),n(231,"p",25),e(232,"Applied in five places, each re-deriving the type \u2192 color mapping in its own selectors:"),t(),e(233,` 965 `),n(234,"ul",0),e(235,` 966 `),S(236,ss,5,1,null,null,K),t(),e(238,` 967`),t(),e(239,` 968 969`),n(240,"div",26),e(241,` 970 `),n(242,"h3"),e(243,"6. Program type colors"),t(),e(244,` 971 `),n(245,"app-sg-caption",27),e(246,"program-navigation.component.ts \u2014 PROGRAM_TYPE_CARD_COLORS"),t(),e(247,` 972 `),n(248,"p",0),e(249,` 973 Nine hardcoded hex literals in one component, backing the flat art background on each 974 program-type card. `),n(250,"strong"),e(251,"Every one of them is a step on the team palette"),t(),e(252,`, retyped 975 as a literal \u2014 so the two systems already agree, but only by hand. 976 `),t(),e(253,` 977 `),n(254,"div",4),e(255,` 978 `),n(256,"table",5),e(257,` 979 `),n(258,"thead"),e(259,` 980 `),n(260,"tr"),e(261,` 981 `),c(262,"th",12),e(263,` 982 `),n(264,"th",17),e(265,"Program type"),t(),e(266,` 983 `),n(267,"th",28),e(268,"ID"),t(),e(269,` 984 `),n(270,"th",29),e(271,"Hex"),t(),e(272,` 985 `),n(273,"th"),e(274,"Identical to"),t(),e(275,` 986 `),t(),e(276,` 987 `),t(),e(277,` 988 `),n(278,"tbody"),e(279,` 989 `),S(280,ds,21,6,null,null,N0),t(),e(282,` 990 `),t(),e(283,` 991 `),t(),e(284,` 992 `),n(285,"p",30),e(286,` 993 The mapping is asserted literal-by-literal in 994 `),n(287,"code"),e(288,"program-navigation.component.spec.ts"),t(),e(289,`, so re-tuning the team palette will leave 995 these behind and the test will pass. 996 `),t(),e(290,` 997`),t(),e(291,` 998 999`),n(292,"div",31),e(293,` 1000 `),n(294,"h3"),e(295,"7. Team colors"),t(),e(296,` 1001 `),n(297,"app-sg-caption",3),e(298,"1_base/team-colors/team-colors.scss"),t(),e(299,` 1002 `),n(300,"p",0),e(301,` 1003 The only per-record color in the app: a team is assigned one of 14 hues, and the class 1004 `),n(302,"code"),e(303,".team-color-N"),t(),e(304," re-points an 11-step ramp of "),n(305,"code"),e(306,"--team-color-50 \u2026 950"),t(),e(307,` 1005 for everything inside it. Components read the ramp, never a hue. The grid below is live 1006 \u2014 every cell is the real class wrapping the real token. 1007 `),t(),e(308,` 1008 `),n(309,"div",4),e(310,` 1009 `),n(311,"table",32),e(312,` 1010 `),n(313,"thead"),e(314,` 1011 `),n(315,"tr"),e(316,` 1012 `),n(317,"th",18),e(318,"Hue"),t(),e(319,` 1013 `),S(320,ms,4,1,null,null,K),t(),e(322,` 1014 `),t(),e(323,` 1015 `),n(324,"tbody"),e(325,` 1016 `),n(326,"tr"),e(327,` 1017 `),n(328,"td",33),e(329,"default (no class)"),t(),e(330,` 1018 `),S(331,cs,6,2,null,null,K),t(),e(333,` 1019 `),S(334,xs,12,4,null,null,B0),n(336,"tr"),e(337,` 1020 `),n(338,"td",33),e(339,"consumers"),t(),e(340,` 1021 `),S(341,hs,4,1,null,null,K),t(),e(343,` 1022 `),t(),e(344,`
1023 `),t(),e(345,` 1024 `),t(),e(346,` 1025 `),n(347,"p",0),e(348,` 1026 `),n(349,"code"),e(350,".tc-50 \u2026 .tc-950"),t(),e(351," in "),n(352,"code"),e(353,"modifiers.scss"),t(),e(354,` are the companion utilities that 1027 pull one step out as `),n(355,"code"),e(356,"color"),t(),e(357," / "),n(358,"code"),e(359,"background-color"),t(),e(360,`, which is how 1028 `),n(361,"code"),e(362,"TeamColorsService"),t(),e(363," emits "),n(364,"code"),e(365,"team-color-9 tc-500"),t(),e(366,`. 1029 `),t(),e(367,` 1030 `),n(368,"p",30),e(369,` 1031 Two things to know about this system. `),n(370,"strong"),e(371,"The fallback drops 1 team in 10 to grey"),t(),e(372,` 1032 \u2014 when a team has no stored color, the service takes the last two digits of the teamID, 1033 so a teamID ending `),n(373,"code"),e(374,"00"),t(),e(375,"\u2013"),n(376,"code"),e(377,"09"),t(),e(378," produces "),n(379,"code"),e(380,"team-color-05"),t(),e(381,`, 1034 which does not exist. And `),n(382,"strong"),e(383,`a second, larger team palette is checked in but switched 1035 off`),t(),e(384,": "),n(385,"code"),e(386,"3_modules/components/team-accent-colors.scss"),t(),e(387,` generates 60 flat 1036 colors as `),n(388,"code"),e(389,".team-color-0 \u2026 .team-color-59"),t(),e(390,`, whose first 14 classes would collide 1037 head-on with the ramp classes above. Its `),n(391,"code"),e(392,"@import"),t(),e(393,` is commented out at 1038 `),n(394,"code"),e(395,"components.scss:1063"),t(),e(396,`. 1039 `),t(),e(397,` 1040`),t(),e(398,` 1041 1042`),n(399,"div",34),e(400,` 1043 `),n(401,"h3"),e(402,"8. Dashboard & chart colors"),t(),e(403,` 1044 `),n(404,"app-sg-caption",27),e(405,"1_base/variables.scss \u2014 #region Chart Dashboard Colors"),t(),e(406,` 1045 `),n(407,"p",0),e(408,` 1046 Fourteen tokens, of which five have no consumer. The four that matter carry the analytics 1047 chart series \u2014 and none of them is a step on any ramp except by accident. 1048 `),t(),e(409,` 1049 `),n(410,"div",4),e(411,` 1050 `),n(412,"table",5),e(413,` 1051 `),n(414,"thead"),e(415,` 1052 `),n(416,"tr"),e(417,` 1053 `),c(418,"th",12),e(419,` 1054 `),n(420,"th",35),e(421,"Token"),t(),e(422,` 1055 `),n(423,"th",29),e(424,"Hex"),t(),e(425,` 1056 `),n(426,"th",15),e(427,"Uses"),t(),e(428,` 1057 `),n(429,"th",29),e(430,"On white"),t(),e(431,` 1058 `),n(432,"th"),e(433,"Role"),t(),e(434,` 1059 `),t(),e(435,` 1060 `),t(),e(436,` 1061 `),n(437,"tbody"),e(438,` 1062 `),S(439,Ss,28,7,null,null,Re),t(),e(441,` 1063 `),t(),e(442,` 1064 `),t(),e(443,` 1065 1066 `),n(444,"h4",19),e(445,"Four conventions for the same job"),t(),e(446,` 1067 `),n(447,"p",0),e(448,` 1068 Chart color has to cross from CSS into JavaScript. The codebase does that four ways, three of 1069 which stop tracking the palette the moment it changes. 1070 `),t(),e(449,` 1071 `),n(450,"div",4),e(451,` 1072 `),n(452,"table",32),e(453,` 1073 `),n(454,"thead"),e(455,` 1074 `),n(456,"tr"),e(457,` 1075 `),n(458,"th",22),e(459,"Convention"),t(),e(460,` 1076 `),n(461,"th",36),e(462,"Example"),t(),e(463,` 1077 `),n(464,"th",22),e(465,"Seen in"),t(),e(466,` 1078 `),n(467,"th"),e(468,"What it costs"),t(),e(469,` 1079 `),t(),e(470,` 1080 `),t(),e(471,` 1081 `),n(472,"tbody"),e(473,` 1082 `),S(474,Es,17,4,null,null,W0),t(),e(476,` 1083 `),t(),e(477,` 1084 `),t(),e(478,` 1085`),t(),e(479,` 1086 1087`),n(480,"div",37),e(481,` 1088 `),n(482,"h3"),e(483,"9. Avatar backgrounds"),t(),e(484,` 1089 `),n(485,"app-sg-caption",3),e(486,"1_base/variables.scss \u2014 #region User Avatar Backgroun
1089ds"),t(),e(487,` 1090 `),n(488,"p",0),e(489,` 1091 Ten single fills behind a user's initials, picked by the last digit of the user ID, plus a 1092 light neutral eleventh for a user with no ID. Unlike the team palette these are single values 1093 rather than ramps, and nine of the eleven share one foreground, 1094 `),n(490,"code"),e(491,"--user-avatar-text"),t(),e(492,`. Gold and the no-id neutral are too light to carry it and 1095 take `),n(493,"code"),e(494,"--user-avatar-text-on-light"),t(),e(495,` instead. All eleven values match the mobile 1096 client \u2014 the same person is the same colour in both products. 1097 `),t(),e(496,` 1098 `),n(497,"p",0),e(498,` 1099 This section owns the tokens. 1100 `),n(499,"a",1),e(500,"avatars"),t(),e(501,` owns the component 1101 \u2014 the size scale, and the register of bugs fixed and still open, each demonstrated 1102 against a live instance. 1103 `),t(),e(502,` 1104 `),n(503,"div",20),e(504,` 1105 `),S(505,vs,17,3,null,null,Re),n(507,"div",38),e(508,` 1106 `),c(509,"app-user-initials",39),e(510,` 1107 `),n(511,"div",40),e(512,` 1108 `),n(513,"code"),e(514,"--user-avatar-none"),t(),c(515,"br"),e(516,` 1109 `),n(517,"span",41),e(518),t(),e(519,` 1110 `),t(),e(520,` 1111 `),t(),e(521,` 1112 `),t(),e(522,` 1113 1114 `),n(523,"h4",19),e(524,"Why the foreground is shared"),t(),e(525,` 1115 `),n(526,"p",0),e(527,` 1116 `),n(528,"strong"),e(529,"The initials are decorative"),t(),e(530," \u2014 "),n(531,"code"),e(532,"aria-hidden"),t(),e(533,` at every call 1117 site, with the person's name in real text beside the avatar \u2014 so SC 1.4.3 does not 1118 apply to them and a shared `),n(534,"code"),e(535,"--user-avatar-text"),t(),e(536,` is a look decision. The ratios 1119 below are reported for that conversation, not as a grade. 1120 `),t(),e(537,` 1121 `),n(538,"p",0),e(539,` 1122 There is no single text colour that would clear AA on all of them anyway \u2014 the fills 1123 span too much of the lightness range, so anything light enough for 1124 `),n(540,"code"),e(541,"--user-avatar-7"),t(),e(542," is unreadable on "),n(543,"code"),e(544,"--user-avatar-1"),t(),e(545,` and the reverse. 1125 The figures that mattered are gold and the no-id neutral: fills so close to the shared white 1126 that the initials were not low-contrast but `),n(546,"em"),e(547,"absent"),t(),e(548,`. That is a bug at any exemption, 1127 and it is why those two \u2014 and only those two \u2014 take a dark foreground. 1128 `),t(),e(549,` 1129 `),n(550,"div",4),e(551,` 1130 `),n(552,"table",5),e(553,` 1131 `),n(554,"thead"),e(555,` 1132 `),n(556,"tr"),e(557,` 1133 `),n(558,"th",8),e(559,"Fill token"),t(),e(560,` 1134 `),n(561,"th",29),e(562,"Fill"),t(),e(563,` 1135 `),n(564,"th",18),e(565,"Foreground"),t(),e(566,` 1136 `),n(567,"th",18),e(568,"Ratio"),t(),e(569,` 1137 `),t(),e(570,` 1138 `),t(),e(571,` 1139 `),n(572,"tbody"),e(573,` 1140 `),S(574,ys,25,6,null,null,Re),n(576,"tr"),e(577,` 1141 `),n(578,"td"),e(579,` 1142 `),n(580,"code",42),e(581),t(),e(582,` 1143 `),n(583,"span",43),e(584,"the no-id fill"),t(),e(585,` 1144 `),t(),e(586,` 1145 `),n(587,"td"),e(588,` 1146 `),c(589,"span",44),e(590,` 1147 `),n(591,"span",43),e(592),t(),e(593,` 1148 `),t(),e(594,` 1149 `),n(595,"td"),e(596,` 1150 `),n(597,"code",45),e(598,"--user-avatar-text-on-light"),t(),e(599,` 1151 `),t(),e(600,` 1152 `),n(601,"td"),e(602),n(603,"span",43),e(604),t(),e(605,` 1153 `),t(),e(606,` 1154 `),t(),e(607,` 1155 `),t(),e(608,` 1156 `),t(),e(609,` 1157 `),t(),e(610,` 1158 `),n(611,"p",0),e(612,` 1159 `),n(613,"code"),e(614,"--user-avatar-4"),t(),e(615," is "),n(616,"code"),e(617,"#595c60"),t(),e(618,`, the same value as 1160 `),n(619,"code"),e(620,"--grey-800"),t(),e(621,`. It is the one fill that restates a core-ramp step rather than 1161 carrying a hue of its own. 1162 `),t(),e(622,` 1163 1164 `),n(623,"h4",19),e(624,"The foregrounds this replaced"),t(),e(625,` 1165 `),n(626,"p",0),e(627,` 1166 Three separate rules used to decide the text colour on these ten fills, and the token set had 1167 no foreground token to point them at \u2014 which is how a foreground change could land on 1168 one surface and miss the other two. Two of the three are deleted, and the survivor reads 1169 `),n(628,"code"),e(629,"--user-avatar-text"),t(),e(630,", or "),n(631,"code"),e(632,"--user-avatar-text-on-light"),t(),e(633,` on the two 1170 light fills. 1171 `),t(),e(634,` 1172 `),n(635,"div",4),e(636,` 1173 `),n(637,"table",5),e(638,` 1174 `),n(639,"thead"),e(640,` 1175 `),n(641,"tr"),e(642,` 1176 `),n(643,"th",7),e(644,"Selector"),t(),e(645,` 1177 `),n(646,"th",6),e(647,"Foreground"),t(),e(648,` 1178 `),n(649,"th",8),e(650,"Text size"),t(),e(651,` 1179 `),n(652,"th"),e(653,"Reach"),t(),e(654,` 1180 `),t(),e(655,` 1181 `),t(),e(656,` 1182 `),n(657,"tbody"),e(658,` 1183 `),S(659,_s,25,5,null,null,R0),t(),e(661,` 1184 `),t(),e(662,` 1185 `),t(),e(663,` 1186`),t(),e(664,` 1187 1188`),n(665,"div",46),e(666,` 1189 `),n(667,"h3"),e(668,"10. Buttons & input chrome"),t(),e(669,` 1190 `),n(670,"app-sg-caption",3),e(671,"1_base/variables.scss \u2014 #region Button Variables \xB7 sass/ng-theme.scss"),t(),e(672,` 1191 `),n(673,"p",0),e(674,` 1192 Button color is the only part of the design system with a declared two-layer contract. The 1193 source states it plainly at `),n(675,"code"),e(676,"variables.scss:376"),t(),e(677,`: 1194 `),t(),e(678,` 1195 `),n(679,"pre",47),e(680,`// --theme-* are the raw/palette layer. The theme API sets these on <html> at runtime. 1196// Components should not consume these directly. 1197... 1198// --cms-* are the semantic layer. Components consume these.`),t(),e(681,` 1199 `),n(682,"p",0),e(683,` 1200 The counts run the other way. Each `),n(684,"code"),e(685,"--cms-button-*"),t(),e(686,` token has one consumer \u2014 1201 the button partial \u2014 while eight component rules reach `),n(687,"code"),e(688,"--theme-button-*"),t(),e(689,` 1202 directly, seven of them without naming the semantic token at all. 1203 `),t(),e(690,` 1204 `),n(691,"div",4),e(692,` 1205 `),n(693,"table",5),e(694,` 1206 `),n(695,"thead"),e(696,` 1207 `),n(697,"tr"),e(698,` 1208 `),n(699,"th",36),e(700,"Raw token ("),n(701,"code"),e(702,"--theme-*"),t(),e(703,")"),t(),e(704,` 1209 `),n(705,"th",36),e(706,"Semantic token ("),n(707,"code"),e(708,"--cms-*"),t(),e(709,")"),t(),e(710,` 1210 `),n(711,"th",14),e(712,"Set by club theme"),t(),e(713,` 1211 `),n(714,"th"),e(715,"Rules skipping the semantic layer"),t(),e(716,` 1212 `),t(),e(717,` 1213 `),t(),e(718,` 1214 `),n(719,"tbody"),e(720,` 1215 `),S(721,Ds,22,4,null,null,L0),t(),e(723,` 1216 `),t(),e(724,` 1217 `),t(),e(725,` 1218 1219 `),n(726,"h4",19),e(727,"The PrimeNG bridge"),t(),e(728,` 1220 `),n(729,"p",0),e(730,` 1221 Input chrome is PrimeNG's, re-pointed at our tokens. `),n(731,"code"),e(732,"ng-theme.scss"),t(),e(733,` carries 202 1222 `),n(734,"code"),e(735,"--p-*"),t(),e(736,` declarations; these are the ones that decide color. Everything downstream 1223 of `),n(737,"code"),e(738,"--p-primary-*"),t(),e(739,` is covered on 1224 `),n(740,"a",1),e(741,"blues & links"),t(),e(742,`. 1225 `),t(),e(743,` 1226 `),n(744,"div",4),e(745,` 1227 `),n(746,"table",5),e(747,` 1228 `),n(748,"thead"),e(749,` 1229 `),n(750,"tr"),e(751,` 1230 `),n(752,"th",48),e(753,"PrimeNG token"),t(),e(754,` 1231 `),n(755,"th",6),e(756,"Points at"),t(),e(757,` 1232 `),n(758,"th"),e(759,"Drives"),t(),e(760,` 1233 `),t(),e(761,` 1234 `),t(),e(762,` 1235 `),n(763,"tbody"),e(764,` 1236 `),S(765,Fs,15,3,null,null,Re),t(),e(767,` 1237 `),t(),e(768,` 1238 `),t(),e(769,`
1239 `),n(770,"p",30),e(771,` 1240 Live samples of the resulting chrome are on 1241 `),n(772,"a",1),e(773,"forms"),t(),e(774,` and 1242 `),n(775,"a",1),e(776,"buttons"),t(),e(777,`. 1243 `),t(),e(778,` 1244`),t(),e(779,` 1245 1246`),n(780,"div",49),e(781,` 1247 `),n(782,"h3"),e(783,"11. What a club can actually change"),t(),e(784,` 1248 `),n(785,"app-sg-caption",50),e(786,"admin/content/theme \u2192 header.component.ts setThemePrimatives / setThemeSettings"),t(),e(787,` 1249 `),n(788,"p",0),e(789,` 1250 Thirteen color fields on the club theme form. Each is written to a CSS variable on 1251 `),n(790,"code"),e(791,"<html>"),t(),e(792,` at runtime, and only then does it reach CSS \u2014 so a field whose 1252 variable has no consumer is a control that does nothing. 1253 `),n(793,"strong",51),e(794),t(),e(795,` 1254 `),t(),e(796,` 1255 `),n(797,"div",4),e(798,` 1256 `),n(799,"table",5),e(800,` 1257 `),n(801,"thead"),e(802,` 1258 `),n(803,"tr"),e(804,` 1259 `),n(805,"th",22),e(806,"Admin field"),t(),e(807,` 1260 `),n(808,"th",52),e(809,"CSS variable"),t(),e(810,` 1261 `),n(811,"th",29),e(812,"Consumers"),t(),e(813,` 1262 `),n(814,"th"),e(815,"What it reaches"),t(),e(816,` 1263 `),t(),e(817,` 1264 `),t(),e(818,` 1265 `),n(819,"tbody"),e(820,` 1266 `),S(821,Os,19,6,null,null,q0),t(),e(823,` 1267 `),t(),e(824,` 1268 `),t(),e(825,` 1269 `),n(826,"p",30),e(827,` 1270 Note the shape of all three failures: the runtime writes one name and the stylesheet reads 1271 another, or reads nothing. Nothing errors \u2014 an unread custom property is simply never 1272 asked for, so the control looks wired and behaves as if it isn't. 1273 `),t(),e(828,` 1274`),t(),e(829,` 1275 1276`),n(830,"div",53),e(831,` 1277 `),n(832,"h3"),e(833,"12. Color that belongs to no system"),t(),e(834,` 1278 `),n(835,"app-sg-caption",3),e(836,"component SCSS, app/**"),t(),e(837,` 1279 `),n(838,"p",0),e(839,` 1280 `),n(840,"strong"),e(841),t(),e(842,` in component stylesheets. They are not random: they are two other 1281 design systems, pasted in. The app ships three greys for every job. 1282 `),t(),e(843,` 1283 `),n(844,"div",4),e(845,` 1284 `),n(846,"table",5),e(847,` 1285 `),n(848,"thead"),e(849,` 1286 `),n(850,"tr"),e(851,` 1287 `),c(852,"th",12),e(853,` 1288 `),n(854,"th",29),e(855,"Hex"),t(),e(856,` 1289 `),n(857,"th",13),e(858,"Where it came from"),t(),e(859,` 1290 `),n(860,"th",23),e(861,"Decls"),t(),e(862,` 1291 `),n(863,"th",23),e(864,"Files"),t(),e(865,` 1292 `),n(866,"th"),e(867,"Nearest token"),t(),e(868,` 1293 `),t(),e(869,` 1294 `),t(),e(870,` 1295 `),n(871,"tbody"),e(872,` 1296 `),S(873,Ns,24,7,null,null,V0),t(),e(875,` 1297 `),t(),e(876,` 1298 `),t(),e(877,` 1299 `),n(878,"p",30),e(879,` 1300 None of these move when a club themes the site, and none of them move when the ramps are 1301 re-tuned. 1302 `),t(),e(880,` 1303`),t(),e(881,` 1304 1305`),n(882,"div",54),e(883,` 1306 `),n(884,"h3"),e(885,"13. Gaps & discrepancies"),t(),e(886,` 1307 `),n(887,"app-sg-caption",3),e(888,"everything above, collected"),t(),e(889,` 1308 `),n(890,"p",0),e(891),n(892,"strong",51),e(893),t(),e(894,`. Recorded here, not fixed \u2014 this page is the inventory. 1309 Where a gap can be shown rather than described, the evidence cell carries a live demo built 1310 from the real tokens and classes, so what you are looking at is the bug itself. 1311 Recommended fixes are the second table. 1312 `),t(),e(895,` 1313 `),n(896,"div",4),e(897,` 1314 `),n(898,"table",32),e(899,` 1315 `),n(900,"thead"),e(901,` 1316 `),n(902,"tr"),e(903,` 1317 `),n(904,"th",29),e(905,"Kind"),t(),e(906,` 1318 `),n(907,"th",52),e(908,"Finding"),t(),e(909,` 1319 `),n(910,"th",55),e(911,"Evidence"),t(),e(912,` 1320 `),n(913,"th"),e(914,"Consequence"),t(),e(915,` 1321 `),t(),e(916,` 1322 `),t(),e(917,` 1323 `),n(918,"tbody"),e(919,`
1324 `),S(920,td,22,5,null,null,Yo),t(),e(922,` 1325 `),t(),e(923,` 1326 `),t(),e(924,` 1327 1328 `),n(925,"h4",19),e(926,"Recommended fixes"),t(),e(927,` 1329 `),n(928,"p",0),e(929,` 1330 Same rows, same order. These are recommendations from the census, not scheduled work \u2014 1331 each one is a decision for @bob, and several are large enough to want their own doc. 1332 `),t(),e(930,` 1333 `),n(931,"div",4),e(932,` 1334 `),n(933,"table",32),e(934,` 1335 `),n(935,"thead"),e(936,` 1336 `),n(937,"tr"),e(938,` 1337 `),n(939,"th",29),e(940,"Kind"),t(),e(941,` 1338 `),n(942,"th",52),e(943,"Finding"),t(),e(944,` 1339 `),n(945,"th",56),e(946,"Recommended fix"),t(),e(947,` 1340 `),n(948,"th"),e(949,"Touches"),t(),e(950,` 1341 `),t(),e(951,` 1342 `),t(),e(952,` 1343 `),n(953,"tbody"),e(954,` 1344 `),S(955,rd,22,4,null,null,Yo),t(),e(957,` 1345 `),t(),e(958,` 1346 `),t(),e(959,` 1347`),t(),e(960,` 1348`)),s&2&&(i(12),p(o.snapshotDate),i(2),m("routerLink","/admin/styleguide/global/blues-and-links"),i(3),m("routerLink","/admin/styleguide/components/system-alerts"),i(42),E(o.systems),i(16),m("routerLink","/admin/styleguide/global/blues-and-links"),i(4),f("",o.deadSteps,` steps have 1349 no consumer at all`),i(3),E(o.ramps),i(6),q("3. Semantic aliases \u2014 ",o.aliases.length," tokens, ",o.suspectAliases," of them suspect"),i(34),E(o.aliases),i(16),m("routerLink","/admin/styleguide/components/system-alerts"),i(31),E(o.textClasses),i(13),E(o.bgClasses),i(44),E(o.eventColors),i(10),E(o.eventConsumers),i(44),E(o.programTypes),i(40),E(o.teamSteps),i(11),E(o.teamSteps),i(3),E(o.teamRamps),i(7),E(o.teamSteps),i(98),E(o.dashboardColors),i(35),E(o.chartConventions),i(25),m("routerLink","/admin/styleguide/components/avatars"),i(6),E(o.avatarColors),i(4),m("id",0),i(9),p(o.avatarFallback.hex),i(56),E(o.avatarColors),i(7),p(o.avatarFallback.token),i(8),W("background-color",o.avatarFallback.hex),i(3),p(o.avatarFallback.hex),i(10),f(` 1350 `,o.avatarFallback.ratio,`:1 1351 `),i(2),Ve(` 1352 was `,o.avatarFallback.wasShared,":1 as ",o.avatarFallback.wasToken,` 1353 (`,o.avatarFallback.wasHex,`) \u2014 white on near-white 1354 `),i(55),E(o.avatarForegrounds),i(62),E(o.buttonLayers),i(19),m("routerLink","/admin/styleguide/global/blues-and-links"),i(25),E(o.primeBridge),i(7),m("routerLink","/admin/styleguide/global/forms"),i(3),m("routerLink","/admin/styleguide/global/buttons"),i(19),f("",o.brokenThemeFields," of them are in that state."),i(27),E(o.themeFields),i(20),q("",o.foreignTotalDecls," hardcoded hex declarations across ",o.foreignDistinct,` 1355 distinct values`),i(32),E(o.foreign),i(18),f(` 1356 `,o.gaps.length," findings from the census, "),i(2),f("",o.defectCount,` of them 1357 defects a user can see`),i(27),E(o.gaps),i(35),E(o.gaps))},dependencies:[$,J,We,X],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var Zo=(a,r)=>r.verdict;function od(a,r){if(a&1&&(e(0,` 1358 `),n(1,"span",2),e(2,` 1359 `),c(3,"app-sg-verdict",3),e(4,` 1360 `),t(),e(5,` 1361 `)),a&2){let l=r.$implicit;i(3),m("verdict",l.verdict)}}function ld(a,r){if(a&1&&(e(0,` 1362 `),n(1,"div",0),e(2,` 1363 `),n(3,"span"),e(4,"Verdicts:"),t(),e(5,` 1364 `),S(6,od,6,1,null,null,Zo),n(8,"span"),e(9,`\u2014 hover for the definition, or see 1365 `),n(10,"a",1),e(11,"Overview"),t(),e(12,"."),t(),e(13,` 1366 `),t(),e(14,` 1367`)),a&2){let l=u();i(6),E(l.rows),i(4),m("routerLink","/admin/styleguide/global/forms/
1367overview")}}function sd(a,r){if(a&1&&(e(0,` 1368 `),n(1,"tr"),e(2,` 1369 `),n(3,"td"),c(4,"app-sg-verdict",3),t(),e(5,` 1370 `),n(6,"td",7),e(7),t(),e(8,` 1371 `),t(),e(9,` 1372 `)),a&2){let l=r.$implicit;i(4),m("verdict",l.verdict),i(3),p(l.means)}}function dd(a,r){if(a&1&&(e(0,` 1373 `),n(1,"div",4),e(2,` 1374 `),n(3,"table",5),e(4,` 1375 `),n(5,"thead"),e(6,` 1376 `),n(7,"tr"),e(8,` 1377 `),n(9,"th",6),e(10,"Verdict"),t(),e(11,` 1378 `),n(12,"th"),e(13,"What it means"),t(),e(14,` 1379 `),t(),e(15,` 1380 `),t(),e(16,` 1381 `),n(17,"tbody"),e(18,` 1382 `),S(19,sd,10,2,null,null,Zo),t(),e(21,` 1383 `),t(),e(22,` 1384 `),t(),e(23,` 1385`)),a&2){let l=u();i(19),E(l.rows)}}var gt={house:{status:"success",label:"house style",means:"The sanctioned answer. New code uses this one."},live:{status:"black",label:"live",means:"Declared, used, and working \u2014 just narrower in scope than house style. Not a problem."},drift:{status:"warning",label:"drift",means:"Works, but it is a second answer to a question house style already answers \u2014 or it is scoped so tightly that it silently does nothing outside one container."},deprecated:{status:"warning",label:"deprecated",means:"A superseded vocabulary \u2014 Bootstrap 4 leftovers \u2014 still present in the markup."},dead:{status:"secondary",label:"dead",means:"Declared in CSS and referenced by nothing. Weight, not breakage."},undefined:{status:"error",label:"undefined",means:"Referenced by markup and declared nowhere. The template reads as styled and renders bare \u2014 the worse of the two failures, because nothing at the call site suggests it."},defect:{status:"error",label:"defect",means:"Measurably wrong: a duplicated declaration, an unguarded dereference, a missing behavior."}},ve=(()=>{let r=class r{get status(){return gt[this.verdict]?.status}get label(){return gt[this.verdict]?.label}get means(){return gt[this.verdict]?.means}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-sg-verdict"]],inputs:{verdict:"verdict"},standalone:!1,decls:2,vars:4,consts:[["variant","tag","tooltipPosition","left",3,"status","text","tooltipText","nowrap"]],template:function(s,o){s&1&&(c(0,"app-pill",0),e(1,` 1386`)),s&2&&m("status",o.status)("text",o.label)("tooltipText",o.means)("nowrap",!0)},dependencies:[J],encapsulation:2});let a=r;return a})(),we=(()=>{let r=class r{constructor(){this.compact=!1,this.rows=Object.keys(gt).map(d=>({verdict:d,label:gt[d].label,means:gt[d].means}))}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-sg-verdict-legend"]],inputs:{compact:"compact"},standalone:!1,decls:2,vars:1,consts:[[1,"d-flex","flex-wrap","align-items-center","gap-3","text-smallest","text-grey","mb-3"],[3,"routerLink"],[1,"d-inline-flex","align-items-center"],[3,"verdict"],[1,"overflow-x-auto"],[1,"table","table-bordered","sg-doc-table"],[2,"width","9rem"],[1,"text-small","text-grey"]],template:function(s,o){s&1&&v(0,ld,15,1)(1,dd,24,0),s&2&&y(o.compact?0:1)},dependencies:[$,ve],encapsulation:2});let a=r;return a})();var tl=()=>[],nl=a=>({kind:a,mode:"shipped"}),il=a=>({kind:a,mode:"fixed"}),md=(a,r)=>r.who,el=(a,r)=>r.where,cd=(a,r)=>r.background,pd=(a,r)=>r.fn,xd=(a,r)=>r.input,hd=(a,r)=>r.thing,ud=(a,r)=>r.tier;function gd(a,r){if(a&1&&(e(0,` 1387 `),n(1,"div"),e(2,` 1388 `),n(3,"button",61),e(4,"Register Now"),t(),e(5,` 1389 `),t(),e(6,` 1390 `)),a&2){let l=u(),d=l.kind,s=l.mode,o=u();i(),te(Bi("--theme-color-cta-buttons: ",o.demoColors(d,s).bg,"; --theme-color-cta-buttons-contrast: ",o.demoColors(d,s).fg,"; --theme-color-cta-buttons--hover: ",o.demoColors(d,s).hover,";"))}}function fd(a,r){if(a&1&&(e(0,` 1391 `),n(1,"div"),e(2,` 1392 `),n(3,"button",62),e(4,"Save Changes"),t(),e(5,` 1393 `),t(),e(6,` 1394 `)),a&2){let l=u(),d=l.kind,s=l.mode,o=u();i(),te(Bi("--theme-button-background--primary: ",o.demoColors(d,s).bg,"; --theme-button-border--primary: ",o.demoColors(d,s).bg,"; --theme-button-text-color--primary: ",o.demoColors(d,s).fg,";"))}}function bd(a,r){if(a&1&&(e(0,` 1395 `),n(1,"div"),e(2,` 1396 `),n(3,"button",63),e(4,"Learn More"),t(),e(5,` 1397 `),t(),e(6,` 1398 `)),a&2){let l=u(),d=l.kind,s=l.mode,o=u();i(),te(ca("--theme-button-background: #ffffff; --theme-button-border: ",o.demoColors(d,s).fg,"; --theme-button-text-color: ",o.demoColors(d,s).fg,";"))}}function Sd(a,r){if(a&1&&(e(0,` 1399 `),n(1,"div",64),e(2,` 1400 `),n(3,"strong",65),e(4,"Riverside FC"),t(),e(5,` 1401 `),n(6,"span",66),e(7,"Teams"),t(),e(8,` 1402 `),n(9,"span",66),e(10,"Schedule"),t(),e(11,` 1403 `),n(12,"span",67),e(13,"Register"),t(),e(14,` 1404 `),t(),e(15,` 1405 `)),a&2){let l=u(),d=l.kind,s=l.mode,o=u();i(),W("background-color",o.demoColors(d,s).bg)("color",o.demoColors(d,s).fg)}}function Ed(a,r){if(a&1&&(e(0,` 1406 `),n(1,"div",68),e(2,` 1407 `),n(3,"div",69),e(4,"Spring Season"),t(),e(5,` 1408 `),n(6,"div",67),e(7,"Registration closes March 14"),t(),e(8,` 1409 `),t(),e(9,` 1410 `)),a&2){let l=u(),d=l.kind,s=l.mode,o=u();i(),W("background-color",o.demoColors(d,s).bg)("color",o.demoColors(d,s).fg)}}function vd(a,r){if(a&1&&(e(0,` 1411 `),n(1,"div",70),e(2,` 1412 `),n(3,"span",67),e(4,"Team Roster"),t(),e(5,` 1413 `),t(),e(6,` 1414 `)),a&2){let l=u(),d=l.kind,s=l.mode,o=u();i(),W("background-color",o.demoColors(d,s).bg)("color",o.demoColors(d,s).fg)}}function yd(a,r){if(a&1&&(e(0,` 1415 `),n(1,"div",71),e(2,` 1416 `),n(3,"span",72),e(4,"Sign Up"),t(),e(5,` 1417 `),t(),e(6,` 1418 `)),a&2){let l=u(),d=l.kind,s=l.mode,o=u();i(3),W("background-color",o.demoColors(d,s).bg)("border-color",o.demoColors(d,s).bg)("color",o.demoColors(d,s).fg)}}function wd(a,r){a&1&&(e(0,` 1419 `),n(1,"div",73),e(2,` 1420 nothing renders \u2014 no consumer reads this variable 1421 `),t(),e(3,` 1422 `))}function Cd(a,r){if(a&1&&(e(0,` 1423 `),v(1,gd,7,5)(2,fd,7,5)(3,bd,7,4)(4,Sd,16,4)(5,Ed,10,4)(6,vd,7,4)(7,yd,7,6)(8,wd,4,0),e(9,` 1424`)),a&2){let l,d=r.kind;i(),y((l=d)==="cta"?1:l==="primary-btn"?2:l==="outline-btn"?3:l==="nav"?4:l==="banner"?5:l==="accent"?6:l==="author-text"?7:8)}}function _d(a,r){a&1&&(e(0,` 1425 `),n(1,"p",18),e(2,` 1426 `),c(3,"app-pill",74),e(4,` 1427 `),n(5,"span",75),e(6,` 1428 The threshold has been corrected but the `),n(7,"code"),e(8,"#333333"),t(),e(9,` rule has not, and 1429 `),n(10,"strong"),e(11,"that combination measures worse than the original bug did"),t(),e(12,`. See 1430 `),n(13,"a",76),e(14,"How wrong, measured"),t(),e(15,`. 1431 `),t(),e(16,` 1432 `),t(),e(17,` 1433 `)),a&2&&(i(13),m("routerLink",V(1,tl)))}function kd(a,r){if(a&1&&(e(0,` 1434 The code uses `),n(1,"code"),e(2),t(),e(3,` \u2014 a dropped zero, introduced in 1435 `),n(4,"code"),e(5),t(),e(6)),a&2){let l=u();i(2),p(l.LEGACY_THRESHOLD),i(3),p(l.introducedIn),i(),f(" on ",l.introducedOn,` and never touched since. 1436 `)}}function Td(a,r){if(a&1&&(e(0,` 1437 The code used `),n(1,"code"),e(2),t(),e(3,` \u2014 a dropped zero, introduced in 1438 `),n(4,"code"),e(5),t(),e(6),n(7,"strong"),e(8,"It has since been corrected"),t(),e(9,`, which is why the live check at the foot of 1439 this section is green. The curve below is kept as history. 1440 `)),a&2){let l=u();i(2),p(l.LEGACY_THRESHOLD),i(3),p(l.introducedIn),i(),f(" on ",l.introducedOn,` and carried for four years. 1441 `)}}function Id(a,r){a&1&&(e(0,` 1442 `),c(1,"app-pill",77),e(2,` 1443 `),n(3,"span",75),e(4,"The shipped "),n(5,"code"),e(6,"getLuminance"),t(),e(7," still disagrees with WCAG right now \u2014 this page is reading the unfixed code."),t(),e(8,` 1444 `))}function Md(a,r){a&1&&(e(0,` 1445 `),c(1,"app-pill",78),e(2,` 1446 `),n(3,"span",75),e(4,"The shipped "),n(5,"code"),e(6,"getLuminance"),t(),e(7," now agrees with WCAG. The curve above is kept as history; this line is the regression check."),t(),e(8,` 1447 `))}function Dd(a,r){a&1&&(e(0,` 1448 `),n(1,"div",15),e(2,` 1449 `),c(3,"app-pill",79),e(4,` 1450 `),n(5,"span",80),e(6,` 1451 The live code has the corrected threshold and the old rule \u2014 the configuration 1452 described above. Finish Tier 1 or revert the threshold. 1453 `),t(),e(7,` 1454 `),t(),e(8,` 1455 `))}function Fd(a,r){if(a&1){let l=B();e(0,`
1456 `),n(1,"button",81),g("click",function(){let s=w(l).$implicit,o=u();return C(o.demoHex=s)}),e(2,` 1457 `),c(3,"span",82),e(4),t(),e(5,` 1458 `)}if(a&2){let l=r.$implicit;i(3),W("background-color",l),i(),f("",l,` 1459 `)}}function Pd(a,r){a&1&&(e(0,` 1460 `),n(1,"span",86),e(2,"passes AA"),t(),e(3,` 1461 `))}function Ad(a,r){a&1&&(e(0,` 1462 `),n(1,"span",89),e(2,"fails AA"),t(),e(3,` 1463 `))}function Od(a,r){a&1&&e(0,` 1464 The two panels differ, so the left one is what a club with this colour is seeing in 1465 production today. 1466 `)}function Nd(a,r){a&1&&e(0,` 1467 Both rules agree on this colour \u2014 the gap only opens on the mid-tones. 1468 `)}function Bd(a,r){a&1&&(e(0,` 1469 `),n(1,"span",75),c(2,"app-pill",93),t(),e(3,` 1470 `))}function Wd(a,r){a&1&&(e(0,` 1471 `),n(1,"span",75),c(2,"app-pill",94),t(),e(3,` 1472 `))}function Rd(a,r){a&1&&de(0)}function Ld(a,r){a&1&&(e(0,` 1473 `),n(1,"span",86),e(2,"passes AA"),t(),e(3,` 1474 `))}function qd(a,r){a&1&&(e(0,` 1475 `),n(1,"span",89),e(2,"fails AA"),t(),e(3,` 1476 `))}function Vd(a,r){a&1&&de(0)}function zd(a,r){a&1&&(e(0,` 1477 `),n(1,"span",86),e(2,"passes AA"),t(),e(3,` 1478 `))}function Ud(a,r){a&1&&(e(0,` 1479 `),n(1,"span",89),e(2,"fails AA"),t(),e(3,` 1480 `))}function Hd(a,r){if(a&1&&(e(0,` 1481 `),n(1,"div",90),e(2,` 1482 `),n(3,"div",91),e(4,` 1483 `),n(5,"strong",67),e(6),t(),e(7,` 1484 `),v(8,Bd,4,0)(9,Wd,4,0),t(),e(10,` 1485 `),n(11,"div",19),e(12,` 1486 `),n(13,"div",83),e(14,` 1487 `),n(15,"app-sg-caption",33),e(16,"as it ships now"),t(),e(17,` 1488 `),k(18,Rd,1,0,"ng-container",92),e(19,` 1489 `),n(20,"p",85),e(21),L(22,"number"),v(23,Ld,4,0)(24,qd,4,0),t(),e(25,` 1490 `),t(),e(26,` 1491 `),n(27,"div",83),e(28,` 1492 `),n(29,"app-sg-caption",33),e(30,"a fully-correct rule"),t(),e(31,` 1493 `),k(32,Vd,1,0,"ng-container",92),e(33,` 1494 `),n(34,"p",85),e(35),L(36,"number"),v(37,zd,4,0)(38,Ud,4,0),t(),e(39,` 1495 `),t(),e(40,` 1496 `),t(),e(41,` 1497 `),t(),e(42,` 1498 `)),a&2){let l=r.$implicit,d=u(2),s=ue(2);i(6),p(d.demoLabels[l]),i(2),y(d.demoChanges(l)?8:9),i(10),m("ngTemplateOutlet",s)("ngTemplateOutletContext",ie(16,nl,l)),i(3),f(` 1499 `,G(22,10,d.pairRatio(d.demoColors(l,"shipped").fg,d.demoColors(l,"shipped").bg),"1.2-2"),`:1 \u2014 1500 `),i(2),y(d.pairPasses(d.demoColors(l,"shipped").fg,d.demoColors(l,"shipped").bg)?23:24),i(9),m("ngTemplateOutlet",s)("ngTemplateOutletContext",ie(18,il,l)),i(3),f(` 1501 `,G(36,13,d.pairRatio(d.demoColors(l,"fixed").fg,d.demoColors(l,"fixed").bg),"1.2-2"),`:1 \u2014 1502 `),i(2),y(d.pairPasses(d.demoColors(l,"fixed").fg,d.demoColors(l,"fixed").bg)?37:38)}}function jd(a,r){if(a&1&&(e(0,` 1503 `),n(1,"div",26),e(2,` 1504 `),n(3,"div",83),e(4,` 1505 `),n(5,"app-sg-caption",2),e(6,"as the app decides it today \u2014 live"),t(),e(7,` 1506 `),n(8,"div",84),e(9),t(),e(10,` 1507 `),n(11,"p",85),e(12),L(13,"number"),n(14,"strong"),e(15),L(16,"number"),t(),e(17,` \u2014 1508 the two agree now that the threshold is right \u2014 1509 `),v(18,Pd,4,0)(19,Ad,4,0),t(),e(20,` 1510 `),t(),e(21,` 1511 `),n(22,"div",83),e(23,` 1512 `),n(24,"app-sg-caption",2),e(25,"best of black / white"),t(),e(26,` 1513 `),n(27,"div",84),e(28),t(),e(29,` 1514 `),n(30,"p",85),e(31,` 1515 True ratio `),n(32,"strong"),e(33),L(34,"number"),t(),e(35,` 1516 \u2014 `),n(36,"span",86),e(37,"passes AA"),t(),e(38),L(39,"number"),L(40,"number"),t(),e(41,` 1517 `),t(),e(42,` 1518 `),t(),e(43,` 1519 `),n(44,"p",87),e(45,` 1520 `),v(46,Od,1,0)(47,Nd,1,0),t(),e(48,` 1521 1522 `),n(49,"h4",88),e(50,"What that colour does to the elements that use it"),t(),e(51,` 1523 `),n(52,"p",3),e(53,` 1524 Swatches make the ratio arguable; buttons make it obvious. Each pair below is the real 1525 element a club would see, with `),n(54,"strong"),e(55,`the same custom properties 1526 `),n(56,"code"),e(57,"header.component.ts"),t(),e(58," writes"),t(),e(59,` set on a wrapper \u2014 so the primary, 1527 outline and CMS buttons are styled by the actual shipping `),n(60,"code"),e(61,".btn"),t(),e(62,` rules, not by 1528 anything this page invented. Only the CTA is a replica, because its rule is 1529 component-scoped and the harness cannot reach it. 1530 `),n(63,"strong"),e(64,"Hover the CTA and the buttons"),t(),e(65,` \u2014 several of these only diverge on hover. 1531 `),t(),e(66,` 1532 1533 `),S(67,Hd,43,20,null,null,K),n(69,"p",31),e(70,` 1534 Two of these are still broken, deliberately: the `),n(71,"strong"),e(72,"outline button"),t(),e(73,` 1535 paints its label in the raw club colour on a white fill and nothing ever checks that pair, 1536 and the `),n(74,"strong"),e(75,"author-set CMS button"),t(),e(76,` takes both colours verbatim. Neither is a 1537 maths problem \u2014 they are Tier 3 and Tier 4, and they are the reason the tiers exist. 1538 `),t(),e(77,` 1539 `)),a&2){let l=u();i(8),W("background-color",l.demoHex)("color",l.shippedTextColor(l.demoHex)),i(),f(` 1540 Register Now \u2014 `,l.shippedTextColor(l.demoHex),` 1541 `),i(3),f(` 1542 The app computes `,G(13,17,l.shippedBelievedRatio(l.demoHex),"1.2-2"),`:1 for this 1543 pair. It actually measures 1544 `),i(3),f("",G(16,20,l.shippedActualRatio(l.demoHex),"1.2-2"),":1"),i(3),y(l.shippedActualRatio(l.demoHex)>=4.5?18:19),i(9),W("background-color",l.demoHex)("color",l.correctTextColor(l.demoHex)),i(),f(` 1545 Register Now \u2014 `,l.correctTextColor(l.demoHex),` 1546 `),i(5),f("",G(34,23,l.correctPickRatio(l.demoHex),"1.2-2"),":1"),i(5),q(`. Black scores 1547 `,G(39,26,l.trueRatio("#000000",l.demoHex),"1.2-2"),`:1, white 1548 `,G(40,29,l.trueRatio("#ffffff",l.demoHex),"1.2-2"),`:1. 1549 `),i(8),y(l.picksDiffer(l.demoHex)?46:47),i(21),E(l.elementDemos)}}function Gd(a,r){a&1&&(e(0,` 1550 `),n(1,"p",95),e(2,"Enter a 6-digit hex, e.g. "),n(3,"code"),e(4,"#f663a5"),t(),e(5,"."),t(),e(6,` 1551 `))}function $d(a,r){if(a&1&&(e(0,` 1552 `),n(1,"tr"),e(2,` 1553 `),n(3,"td",67),e(4),t(),e(5,` 1554 `),n(6,"td",96)(7,"code"),e(8),t()(),e(9,` 1555 `),n(10,"td",3),e(11),t(),e(12,` 1556 `),t(),e(13,` 1557 `)),a&2){let l=r.$implicit;i(4),p(l.when),i(4),p(l.who),i(3),p(l.what)}}function Kd(a,r){a&1&&de(0)}function Xd(a,r){a&1&&de(0)}function Yd(a,r){if(a&1&&(e(0,` 1558 `),n(1,"div",99),e(2,` 1559 `),n(3,"div",19),e(4,` 1560 `),n(5,"div",100),e(6,` 1561 `),n(7,"div",101),e(8,"as shipped"),t(),e(9,` 1562 `),k(10,Kd,1,0,"ng-container",92),e(11,` 1563 `),t(),e(12,` 1564 `),n(13,"div",100),e(14,` 1565 `),n(15,"div",101),e(16,"after the fix"),t(),e(17,` 1566 `),k(18,Xd,1,0,"ng-container",92),e(19,` 1567 `),t(),e(20,` 1568 `),t(),e(21,` 1569 `),n(22,"div",10),e(23,` 1570 driven by `),n(24,"code"),e(25),t(),e(26,` from 1571 `),n(27,"a",102),e(28,"Try a colour"),t(),e(29,` 1572 `),t(),e(30,` 1573 `),t(),e(31,` 1574 `)),a&2){let l=u().$implicit,d=u(),s=ue(2);i(10),m("ngTemplateOutlet",s)("ngTemplateOutletContext",ie(6,nl,l.demo)),i(8),m("ngTemplateOutlet",s)("ngTemplateOutletContext",ie(8,il,l.demo)),i(7),p(d.demoHex),i(2),m("routerLink",V(10,tl))}}function Qd(a,r){a&1&&(e(0,` 1575 `),n(1,"div",103),e(2,` 1576 not replicable here \u2014 it toggles a class in an admin preview, or renders into email. 1577 `),t(),e(3,` 1578 `))}function Jd(a,r){if(a&1&&(e(0,` 1579 `),n(1,"tr"),e(2,` 1580 `),n(3,"td"),c(4,"app-sg-verdict",97),t(),e(5,` 1581 `),n(6,"td",67)(7,"code"),e(8),t()(),e(9,` 1582 `),n(10,"td",67)(11,"code"),e(12),t()(),e(13,` 1583 `),n(14,"td",96),e(15),t(),e(16,` 1584 `),n(17,"td",3),e(18,` 1585 `),n(19,"div",98),e(20),t(),e(21),v(22,Yd,32,11)(23,Qd,4,0),t(),e(24,` 1586 `),t(),e(25,` 1587 `)),a&2){let l=r.$implicit;i(4),m("verdict",l.verdict),i(4),p(l.where),i(4),p(l.tested),i(3),p(l.shape),i(5),p(l.decides),i(),f(` 1588 `,l.risk,` 1589 `),i(),y(l.demo?22:23)}}function Zd(a,r){if(a&1&&(e(0,` 1590 `),n(1,"tr"),e(2,` 1591 `),n(3,"td",67)(4,"code"),e(5),t()(),e(6,` 1592 `),n(7,"td",67)(8,"code"),e(9),t()(),e(10,` 1593 `),n(11,"td",96),e(12),t(),e(13,` 1594 `),t(),e(14,` 1595 `)),a&2){let l=r.$implicit;i(5),p(l.background),i(4),p(l.foreground),i(3),p(l.where)}}function em(a,r){if(a&1&&(e(0,` 1596 `),n(1,"tr"),e(2,` 1597 `),n(3,"td"),c(4,"app-sg-verdict",97),t(),e(5,` 1598 `),n(6,"td",67)(7,"code"),e(8),t(),n(9,"span",104),e(10),t()(),e(11,` 1599 `),n(12,"td",67),e(13),t(),e(14,` 1600 `),n(15,"td",3),e(16),t(),e(17,` 1601 `),t(),e(18,` 1602 `)),a&2){let l=r.$implicit;i(4),m("verdict",l.verdict),i(4),p(l.fn),i(2),f(":",l.line),i(3),p(l.callSites),i(3),p(l.problem)}}function tm(a,r){if(a&1&&(e(0,` 1603 `),n(1,"div",105),e(2,` 1604 `),c(3,"span",106),e(4,` 1605 `),n(5,"div",107)(6,"code"),e(7),t()(),e(8,` 1606 `),n(9,"div",23),e(10),t(),e(11,` 1607 `),t(),e(12,` 1608 `)),a&2){let l=r.$implicit;i(3),W("background-color",l.output),i(4),p(l.input),i(3),p(l.output)}}function nm(a,r){if(a&1&&(e(0,` 1609 `),n(1,"tr"),e(2,` 1610 `),n(3,"td",67)(4,"code"),e(5),t()(),e(6,` 1611 `),n(7,"td",67),e(8),t(),e(9,` 1612 `),n(10,"td",67),e(11),t(),e(12,` 1613 `),n(13,"td",67),e(14),t(),e(15,` 1614 `),t(),e(16,` 1615 `)),a&2){let l=r.$implicit,d=u();i(5),p(l||"(empty string)"),i(3),p(d.validity(l).checker),i(3),p(d.validity(l).toArray),i(3),p(d.validity(l).toRgba)}}function im(a,r){if(a&1&&(e(0,` 1616 `),c(1,"app-pill",108),e(2,` 1617 `),n(3,"code",75),e(4),t(),e(5,` 1618 `)),a&2){let l=u();i(4),p(l.darkenThrows.result)}}function am(a,r){if(a&1&&(e(0,` 1619 `),c(1,"app-pill",109),e(2,` 1620 `),n(3,"code",75),e(4),t(),e(5,` 1621 `)),a&2){let l=u();i(4),p(l.darkenThrows.result)}}function rm(a,r){if(a&1&&(e(0,` 1622 `),n(1,"tr"),e(2,` 1623 `),n(3,"td"),c(4,"app-sg-verdict",97),t(),e(5,` 1624 `),n(6,"td",67)(7,"code"),e(8),t()(),e(9,` 1625 `),n(10,"td",67)(11,"code"),e(12),t()(),e(13,` 1626 `),n(14,"td",96),e(15),t(),e(16,` 1627 `),n(17,"td",3),e(18),t(),e(19,` 1628 `),t(),e(20,` 1629 `)),a&2){let l=r.$implicit;i(4),m("verdict",l.verdict),i(4),p(l.where),i(4),p(l.tests),i(3),p(l.mechanism),i(3),p(l.does)}}function om(a,r){if(a&1&&(e(0,` 1630 `),n(1,"tr"),e(2,` 1631 `),n(3,"td"),c(4,"app-sg-verdict",97),t(),e(5,` 1632 `),n(6,"td",67)(7,"code"),e(8),t()(),e(9,` 1633 `),n(10,"td",3),e(11),t(),e(12,` 1634 `),t(),e(13,` 1635 `)),a&2){let l=r.$implicit;i(4),m("verdict",l.verdict),i(4),p(l.thing),i(3),p(l.state)}}function lm(a,r){if(a&1&&(e(0,` 1636 `),n(1,"li")(2,"code"),e(3),t()(),e(4,` 1637 `)),a&2){let l=r.$implicit;i(3),p(l)}}function sm(a,r){if(a&1&&(e(0,` 1638 `),n(1,"tr"),e(2,` 1639 `),n(3,"td",67)(4,"strong"),e(5),t()(),e(6,` 1640 `),n(7,"td",3),e(8),t(),e(9,` 1641 `),n(10,"td",3),e(11),t(),e(12,` 1642 `),t(),e(13,` 1643 `)),a&2){let l=r.$implicit;i(5),p(l.tier),i(3),p(l.contents),i(3),p(l.buys)}}var al=(()=>{let r=class r{linearize(d,s){let o=d/255;return o<=s?o/12.92:Math.pow((o+.055)/1.055,2.4)}channels(d){let s=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(d);return s?{r:parseInt(s[1],16),g:parseInt(s[2],16),b:parseInt(s[3],16)}:null}luminanceAt(d,s){let o=this.channels(d);return .2126*this.linearize(o.r,s)+.7152*this.linearize(o.g,s)+.0722*this.linearize(o.b,s)}ratioFrom(d,s){return d>s?(d+.05)/(s+.05):(s+.05)/(d+.05)}trueRatio(d,s){return this.ratioFrom(this.luminanceAt(d,this.WCAG_THRESHOLD),this.luminanceAt(s,this.WCAG_THRESHOLD))}shippedRatio(d,s){return this.ratioFrom(At(d),At(s))}expand(d){return d.length===4?"#"+d[1]+d[1]+d[2]+d[2]+d[3]+d[3]:d}correctTextColor(d){return this.trueRatio("#000000",d)>=this.trueRatio("#ffffff",d)?"#000":"#fff"}shippedTextColor(d){return Li(d)}halfFixedTextColor(d){return this.trueRatio("#333333",d)>=this.AA?"#000":"#fff"}legacyTextColor(d){return this.ratioFrom(this.luminanceAt("#333333",this.LEGACY_THRESHOLD),this.luminanceAt(d,this.LEGACY_THRESHOLD))>=this.AA?"#000":"#fff"}hex2(d){return d.toString(16).padStart(2,"0")}plot(d){return this.curve.map(s=>`${s.byte/255*this.chart.width},${this.chart.height-d(s)*this.chart.height}`).join(" ")}get halfFixedUnreadablePercent(){return this.sweep.total?100*this.sweep.halfFixedUnreadable/this.sweep.total:0}get legacyUnreadablePercent(){return this.sweep.total?100*this.sweep.legacyUnreadable/this.sweep.total:0}get bothFixedUnreadablePercent(){return this.sweep.total?100*this.sweep.bothFixedUnreadable/this.sweep.total:0}get inHalfFixedState(){return!this.shippedStillWrong&&this.unreadablePercent>this.legacyUnreadablePercent}get disagreePercent(){return this.sweep.total?100*this.sweep.disagree/this.sweep.total:0}get unreadablePercent(){return this.sweep.total?100*this.sweep.unreadable/this.sweep.total:0}get hoverFailPercent(){return this.sweep.total?100*this.sweep.hoverFails/this.sweep.total:0}runSweep(){let d=this.sweep;for(let s=0;s<256;s+=this.SWEEP_STEP)for(let o=0;o<256;o+=this.SWEEP_STEP)for(let x=0;x<256;x+=this.SWEEP_STEP){let h="#"+this.hex2(s)+this.hex2(o)+this.hex2(x);d.total++;let _=this.shippedTextColor(h),se=this.correctTextColor(h),qe=this.trueRatio(this.expand(_),h);_!==se&&(d.disagree++,qe<this.AA?d.unsafe++:d.safe++),qe<this.AA&&(d.unreadable++,qe<d.worstRatio&&(d.worstRatio=qe,d.worstColor=h,d.worstPick=_)),this.trueRatio(this.expand(this.legacyTextColor(h)),h)<this.AA&&d.legacyUnreadable++,this.trueRatio(this.expand(this.halfFixedTextColor(h)),h)<this.AA&&d.halfFixedUnreadable++,this.trueRatio(this.expand(se),h)<this.AA&&d.bothFixedUnreadable++;let ea=Math.max(this.trueRatio("#000000",h),this.trueRatio("#ffffff",h));ea<d.bestOfWorst&&(d.bestOfWorst=ea,d.bestOfWorstColor=h);let Oi=this.trueRatio(this.correctDarkenUntilReadable(h,"#ffffff"),"#ffffff");Oi<this.AA&&d.hoverFails++,Oi<d.hoverWorst&&(d.hoverWorst=Oi)}}get demoValid(){return/^#[a-f\d]{6}$/i.test(thi
1643s.demoHex)}shippedBelievedRatio(d){return this.shippedRatio(this.expand(this.shippedTextColor(d)),d)}shippedActualRatio(d){return this.trueRatio(this.expand(this.shippedTextColor(d)),d)}correctPickRatio(d){return this.trueRatio(this.expand(this.correctTextColor(d)),d)}picksDiffer(d){return this.shippedTextColor(d)!==this.correctTextColor(d)}ctaContrastShipped(d){return Li(d)}ctaContrastFixed(d){return this.correctTextColor(d)}ctaHoverShipped(d){return Ta(d,"#ffffff")}ctaHoverFixed(d){return this.correctDarkenUntilReadable(d,"#ffffff")}primaryTextShipped(d){return Pt("#ffffff",d)?"#ffffff":"#111111"}primaryTextFixed(d){return this.correctTextColor(d)==="#000"?"#111111":"#ffffff"}accentContrastShipped(){return"#ffffff"}accentContrastFixed(d){return this.correctTextColor(d)}bannerContrastShipped(d){return Pt("#ffffff",d)?"#ffffff":"#111111"}bannerContrastFixed(d){return this.correctTextColor(d)}navContrastShipped(d){return this.shippedTextColor(d)}navContrastFixed(d){return this.correctTextColor(d)}correctDarkenUntilReadable(d,s){let o=this.channels(d);if(!o)return"#000000";for(let x=9;x>=1;x--){let h=x/10,_="#"+this.hex2(Math.round(o.r*h))+this.hex2(Math.round(o.g*h))+this.hex2(Math.round(o.b*h));if(this.trueRatio(_,s)>=this.AA)return _}return"#000000"}pairRatio(d,s){return this.trueRatio(this.expand(d),s)}pairPasses(d,s){return this.pairRatio(d,s)>=this.AA}demoColors(d,s){let o=this.demoValid?this.demoHex:"#ffffff",x=s==="fixed";switch(d){case"cta":return{bg:o,fg:x?this.ctaContrastFixed(o):this.ctaContrastShipped(o),hover:x?this.ctaHoverFixed(o):this.ctaHoverShipped(o)};case"primary-btn":return{bg:o,fg:x?this.primaryTextFixed(o):this.primaryTextShipped(o),hover:o};case"outline-btn":return{bg:"#ffffff",fg:o,hover:o};case"accent":return{bg:o,fg:x?this.accentContrastFixed(o):this.accentContrastShipped(),hover:o};case"banner":return{bg:o,fg:x?this.bannerContrastFixed(o):this.bannerContrastShipped(o),hover:o};case"nav":return{bg:o,fg:x?this.navContrastFixed(o):this.navContrastShipped(o),hover:o};case"author-text":return{bg:o,fg:o,hover:o};default:return{bg:o,fg:"#ffffff",hover:o}}}demoChanges(d){return this.demoColors(d,"shipped").fg!==this.demoColors(d,"fixed").fg||this.demoColors(d,"shipped").hover!==this.demoColors(d,"fixed").hover}get oneWayCount(){return this.callSites.filter(d=>d.shape==="one-way").length}validity(d){let s;try{s=Pt(d,"#000000")?"true (passes)":"false (fails)"}catch(h){s="throws"}let o;try{o=this.channels(d)?"parsed":"null"}catch(h){o="throws"}let x;try{x=Je(d,1)}catch(h){x="throws"}return{checker:s,toArray:o,toRgba:x}}constructor(d){this.siteDataService=d,this.snapshotDate="2026-09-01",this.tier1FixedOn="2026-09-04",this.WCAG_THRESHOLD=.03928,this.LEGACY_THRESHOLD=.3928,this.AA=4.5,this.brandColor="#ec4f2e",this.introducedIn="2c9c77fcae",this.introducedOn="2021-05-13",this.SWEEP_STEP=17,this.curve=Array.from({length:52},(s,o)=>{let x=Math.min(255,o*5);return{byte:x,legacy:this.linearize(x,this.LEGACY_THRESHOLD),wcag:this.linearize(x,this.WCAG_THRESHOLD)}}),this.chart={width:480,height:170},this.legacyPlot=this.plot(s=>s.legacy),this.wcagPlot=this.plot(s=>s.wcag),this.legacyCrossover=Math.floor(this.LEGACY_THRESHOLD*255),this.wcagCrossover=Math.floor(this.WCAG_THRESHOLD*255),this.worstChannel=(()=>{let s=this.legacyCrossover,o=this.linearize(s,this.LEGACY_THRESHOLD),x=this.linearize(s,this.WCAG_THRESHOLD);return{byte:s,legacy:o,wcag:x,factor:x/o}})(),this.shippedStillWrong=Math.abs(At("#646464")-this.luminanceAt("#646464",this.WCAG_THRESHOLD))>1e-4,this.sweep={total:0,disagree:0,unreadable:0,unsafe:0,safe:0,worstRatio:99,worstColor:"",worstPick:"",hoverFails:0,hoverWorst:99,bestOfWorst:99,bestOfWorstColor:"",legacyUnreadable:0,halfFixedUnreadable:0,bothFixedUnreadable:0},this.fullSweep={total:636056,unreadable:88942,unreadablePercent:14,worstRatio:2.9,worstColor:"#f663a5",bestOfWorst:4.58,halfFixed:149873,halfFixedPercent:23.6,bothFixed:0},this.shippedSweep={total:16777216,textFails:0,textFloor:4.58,textFloorColor:"#cf0dcc",hoverFails:0,hoverFloor:4.5,ratioDrift:0},this.demoHex="#f663a5",this.demoLabels={cta:"CTA button \u2014 banner, club
1643contact, CMS","primary-btn":"Primary button \u2014 the real .btn-primary rule","outline-btn":"Default/outline button \u2014 the real .btn rule",accent:"Accent surface \u2014 nav hover, panel menu active",banner:"Banner \u2014 team, player, league",nav:"Top navigation bar","author-text":"CMS button with an author-set text colour","dead-var":"Nothing \u2014 the variable has no consumer"},this.elementDemos=["cta","primary-btn","outline-btn","accent","nav","banner","author-text"],this.presets=["#f663a5","#ffffff","#7ccdef","#0088ff","#ffe066","#00aa00","#7f3ca1","#111111"],this.probeHistory=[{when:"2021-05-13",who:"commit 2c9c77fcae",what:'contrastChecker introduced. It tested #ffffff \u2014 the colour that actually rendered \u2014 purely to WARN an admin in the theme editor: "text on this background may be too light". Correct by construction: it asked about the real pair, and changed nothing.'},{when:"later",who:"moved into header.component.ts",what:"The same call was repurposed from warning to deciding, testing #000000 and toggling a .needsContrast CSS class."},{when:"2025-07-09",who:"commit 2944810373",what:'#000000 \u2192 #333333, "contrast checker adjustment on header". Still a boolean driving a class, so asking "is dark-ish text readable here?" was reasonable. #333333 was a stand-in for dark text, never a value anything returned.'},{when:"2026-05-20",who:"commit 8b4b0397b8",what:'Someone fixed it exactly right: "checks contrast against actual color instead of hardcoded value" \u2014 #333333 \u2192 theme.topNavigationTextColor.'},{when:"2026-05-20",who:"commit 3f4ba8ee15",what:'Reverted the same day, one line, message "restore change". The likely reason is Tier 2: topNavigationTextColor is frequently unset or the #ffffff0 sentinel, and contrastChecker fails OPEN on the first and CLOSED on the second \u2014 so the correct fix returned garbage.'},{when:"2026-09-01",who:"this audit",what:"The rule was briefly extracted into a shared contrastingTextColor and pointed at the CTA button too \u2014 which would have spread #333333 to a second consumer. Rolled back with every other change so this page could be built first and the tier decision made from evidence."},{when:"2026-09-04",who:"Tier 1",what:"The probe is gone. contrastingTextColor compares black against white and returns whichever actually wins, so nothing tests a colour it does not render. It shipped in the same change as the threshold, because the measurements above show that either one alone is worse than both."}],this.callSites=[{where:"header.component.ts:847 \u2014 colorAccent",tested:"#000000",decides:"--theme-color-accent-contrast",shape:"one-way",risk:"Writes #fff only when black FAILS. A light accent falls through to the var(--color-white) default \u2014 white on light. 10 consumers.",verdict:"defect",demo:"accent"},{where:"header.component.ts:837 \u2014 colorPrimary",tested:"#000000",decides:"--theme-color-primary-contrast",shape:"dead",risk:"Same shape, but the variable has zero CSS consumers and is never declared. The check cannot reach anything.",verdict:"dead",demo:"dead-var"},{where:"header.component.ts:880 \u2014 bannerColor",tested:"#ffffff",decides:"--theme-banner-background-contrast",shape:"one-way",risk:"Correctly oriented \u2014 the fall-through default is the safe answer. The #ffffff0 sentinel still length-fails into #111111.",verdict:"live",demo:"banner"},{where:"header.component.ts:937 \u2014 topNavigationBackground",tested:"black vs white",decides:"--theme-top-navigation-background-contrast",shape:"two-way",risk:"On contrastingTextColor since Tier 1, and now derived from navBgColor so the #ffffff0 sentinel resolves first. The most-consumed contrast var in the app (24+ readers). An explicit topNavigationTextColor still overrides it unchecked \u2014 Tier 4.",verdict:"house",demo:"nav"},{where:"header.component.ts:947 \u2014 colorCTAButtons",tested:"black vs white",decides:"--theme-color-cta-buttons-contrast + --theme-color-cta-buttons--hover",shape:"two-way",risk:"Tier 1. Always writes, both directions, and skips the #ffffff0 sentinel instead of emitting an invali
1643d colour. This is the shape the one-way sites below should copy.",verdict:"house",demo:"cta"},{where:"header.component.ts:988 \u2014 buttonBackgroundColor",tested:"(none)",decides:"--theme-button-text-color",shape:"one-way",risk:"Outline button: white fill, label painted the raw club colour, never checked. The check at 1025 covers only the filled and hover states.",verdict:"defect",demo:"outline-btn"},{where:"header.component.ts:1025 \u2014 button text",tested:"#ffffff",decides:"5 --theme-button-text-* vars",shape:"one-way",risk:"Fall-through default is correct here, so filled/primary buttons are safe.",verdict:"live",demo:"primary-btn"},{where:"button-content.component.ts:233 / :252",tested:"#ffffff",decides:"5 --cms-button-text-* vars",shape:"one-way",risk:"Reads its input back out of the DOM, so it can be an empty string or a var(...) reference. 252 is two-directional; 233 is not.",verdict:"drift"},{where:"button-content.component.ts:243",tested:"(none)",decides:"5 --cms-button-text-* vars",shape:"one-way",risk:"An author's explicit textColor is applied verbatim to all five vars \u2014 yellow on yellow is reachable.",verdict:"defect",demo:"author-text"},{where:"page-builder-row.component.ts:204 + view twin :212",tested:"#2e3032",decides:"--row-needs-contrast",shape:"one-way",risk:"Duplicated admin/view pair. Only the scoreboard widget reads the variable; every other content type in a dark row keeps its own colour.",verdict:"drift"},{where:"content-dashboard.component.ts:495",tested:"#ffffff",decides:".needs-contrast class",shape:"class",risk:"Class toggle on colorPrimary.",verdict:"live"},{where:"mobile-home-preview.component.ts:96",tested:"#ffffff",decides:".needs-contrast class",shape:"class",risk:"bgColor can be undefined, which contrastChecker treats as passing.",verdict:"drift"},{where:"roster-card-content.component.ts:54",tested:"#ffffff",decides:".needs-contrast class",shape:"class",risk:'Decision is computed against bgColor, but html:32 binds "#" + bgColor \u2014 ##003261, invalid.',verdict:"defect"},{where:"social-media-links-content.component.ts:63 / :98",tested:"#636363",decides:"highContrast \u2192 icon fallback",shape:"class",risk:"bgStyle is columnStyle[background-color] || rowBackground || '' \u2014 frequently empty, which reads as passing. Icons are non-text UI judged at the 4.5 text bar.",verdict:"drift"},{where:"compose.component.ts:652 \xB7 email-format-form.component.ts:83",tested:"#ffffff",decides:"inline email button text colour",shape:"two-way",risk:"Both branches written. Goes out in email, where it cannot be corrected after send.",verdict:"live"}],this.pairs=[{background:"footerNavigationBackground",foreground:"footerNavigationHeaderColor \xB7 footerNavigationLinkColor",where:"header.component.ts:862-871 \u2192 footer.component.scss"},{background:"bannerColor",foreground:"textColor (banner headline)",where:"header.component.ts:879 / :884"},{background:"topNavigationBackground",foreground:"topNavigationTextColor when the club sets one",where:"header.component.ts:934-944"}
1643,{background:"pageBackgroundColor + overlays",foreground:"columnTextColor and all body text",where:"header.component.ts:973, column templates"},{background:"row backgroundColor",foreground:"everything except the scoreboard widget",where:"page-builder-view-row.component.ts:208"},{background:"column backgroundColor",foreground:"column content",where:"page-builder-column.component.ts:133"},{background:"CMS button backgroundColor",foreground:"explicit button textColor",where:"button-content.component.ts:243-248"},{background:"carousel textBoxBackgroundColor",foreground:"headlineTextColor \xB7 descriptionTextColor",where:"image-carousel-item.component.html:129-139"}],this.utilities=[{fn:"contrastChecker",line:1060,callSites:12,verdict:"defect",problem:'Its maths is right now \u2014 it delegates to contrastRatio \u2014 but its input handling is not, and that is Tier 2. Missing input fails OPEN (returns true, "contrast is fine"); a valid #fff or 8-digit hex fails CLOSED. Two different wrong answers for two kinds of bad input, and the mobile fork still carries the 0.3928 threshold.'},{fn:"getLuminancePart",line:1131,callSites:0,verdict:"house",problem:"Was 0.3928 for five years; corrected to 0.03928 in Tier 1, together with the rule below. The measurements above are why the two had to land as one change. The regression check is the live line under the curve."},{fn:"contrastingTextColor",line:1088,callSites:2,verdict:"house",problem:"Tier 1 replaced the inline #333333 probe. Compares the two colours it can actually return, emits six-digit hex so contrastChecker's length-7 gate accepts it back, and returns black rather than throwing on unparseable input. Swept over all 16,777,216 colours: zero AA failures, floor 4.58:1."},{fn:"hexToRgba",line:1158,callSites:12,verdict:"defect",problem:"No validation at all. 3-digit hex yields rgba(255, 15, NaN, 1); any non-hex yields all-NaN. Both are invalid CSS, so the declaration is dropped and the overlay silently vanishes. Discards the alpha byte of 8-digit hex, and alpha = NaN survives the clamp."},{fn:"darkenHexColor",line:1073,callSites:5,verdict:"drift",problem:"Emits unrounded rgb(229.5,229.5,229.5) that no sibling helper can read back, and dereferences a null the line above may have produced."},{fn:"darkenHexColorUntilReadable",line:1096,callSites:1,verdict:"house",problem:"Tier 1. Steps the colour down until it clears AA against the surface it lands on, so a near-white CTA is darkened far enough \u2014 a fixed multiplier never could. Swept over all 16,777,216 colours against the white hover fill: zero failures, floor 4.50:1."},{fn:"lightenHexColor",line:1114,callSites:0,verdict:"dead",problem:"Divides where darkenHexColor multiplies, so the same 0.9 means opposite things. modifier < 1 overflows past 255, 0 gives Infinity, and it cannot lighten black at all. Not called live from this page \u2014 deleting it is the recommendation."},{fn:"isValidHexColor",line:1130,callSites:0,verdict:"dead",problem:"The one helper that would catch the 3-digit and sentinel cases, and nothing uses it."}],this.rgbaDemos=[{input:"#ffffff",output:Je("#ffffff",.5)},{input:"#fff",output:Je("#fff",.5)},{input:"#ffffff80",output:Je("#ffffff80",.5)},{input:"rgb(255,255,255)",output:Je("rgb(255,255,255)",.5)}],this.darkenDemo=qi("#ffffff",.9),this.darkenThrows=(()=>{try{return{threw:!1,result:qi("#fff",.9)}}catch(s){return{threw:!0,result:s instanceof Error?s.message:String(s)}}})(),this.validityMatrix=["#ffffff","#fff","ffffff","#ffffff80","#ffffff0",""],this.needsContrastRows=[{where:"content-dashboard.component.ts:495",tests:"#ffffff",mechanism:".needs-contrast class",does:"white \u2192 var(--color-black-lt)",verdict:"drift"},{where:"mobile-home-preview.component.ts:96",tests:"#ffffff",mechanism:".needs-contrast class",does:"white \u2192 var(--color-black-lt)",verdict:"drift"},{where:"roster-card-content.component.ts:54",tests:"#ffffff",mechanism:".needs-contrast class",does:"white \u2192 var(--color-black) \u2014 a different token from its two siblings",verdict:"drift"},{where:"header.component.ts:933",tests:"#333333",mechanism:".needsContrast \u2014 camel
1643Case",does:"sets 7 PrimeNG menubar tokens to LIGHT greys \u2014 the opposite direction. Dead: its only markup is two commented-out <header> tags.",verdict:"dead"},{where:"social-media-links-content.component.ts:63",tests:"#636363",mechanism:"highContrast \u2192 .needs-contrast &",does:"inverted boolean name, ancestor selector rather than a modifier, and icons are non-text UI judged at the 4.5 text bar",verdict:"drift"},{where:"page-builder-row.component.ts:204 + view twin",tests:"#2e3032",mechanism:"--row-needs-contrast variable",does:"not a class at all. Read by 2 rules in scoreboard-content; every other content type in a dark row keeps its own colour.",verdict:"drift"},{where:"variables.scss:274",tests:"\u2014",mechanism:"--theme-needs-contrast variable",does:'zero consumers; the declaration itself says "not really using this anymore"',verdict:"dead"}],this.deadThings=[{thing:"--theme-color-primary-contrast",state:"Written at header.component.ts:838, never declared in any stylesheet, zero readers.",verdict:"dead"},{thing:"--theme-button-background-contrast--naked (+ its -hover twin)",state:"Read by button-content.component.ts:273-274 and declared nowhere \u2014 those two lines are the only references in the codebase. Invalid at computed-value time, so naked CMS buttons fall back to inherited colour.",verdict:"undefined"},{thing:"checkButtonContrast()",state:"theme.component.ts:628-637 is entirely commented out with a bare return, so showButtonContrastWarning can never be true and the admin warning at theme.component.html:248 is unreachable. This is the mechanism the theme-editor warnings need.",verdict:"dead"},{thing:"--theme-needs-contrast",state:'Declared at variables.scss:274 with the comment "not really using this anymore". Zero consumers.',verdict:"dead"},{thing:"page-builder-edit.component.ts:731, 732, 761, 762",state:"Guards the overlay with +t?.pageOverlayColor. Unary plus on a hex string is NaN, always falsy, so the page-builder editor renders
1643NO overlay while the published page renders it. The three sibling copies use plain truthiness.",verdict:"defect"},{thing:"Overlay gradient block \xD74",state:"The same ~20-line computation is copy-pasted across page-builder-edit (\xD72), page-builder-view (\xD72), theme.component.ts and header.component.ts \u2014 which is how one copy drifted into the bug above.",verdict:"drift"},{thing:"CTA hover border",state:"3 of the 4 CTA rules set border-color to the contrast colour over a white hover fill; cms.scss:101 alone keeps the club colour, which is the one that stays visible.",verdict:"defect"}],this.mobile={file:"Capacitor/src/app/shared/constants.ts:822",documentedPath:"../SprocketSports Mobile",actualPath:"/Users/bob/Develop/SprocketSports Mobile",callSites:["club.page.ts:105 \u2192 setBgColor(theme?.colorPrimary)",'overview.page.html:129 \u2192 [bgColor]="clubTheme?.colorPrimary" \u2192 mobile-banner'],commentedOut:"overview.page.ts:389-391"},this.tiers=[{tier:"1 \u2014 the maths and the rule, together \u2014 SHIPPED 2026-09-04",contents:"0.3928 \u2192 0.03928; the #333333 probe replaced by contrastingTextColor, which compares the two colours the rule actually returns; darkenHexColorUntilReadable for CTA hover; the runtime writing the hover variable name the CSS actually reads; the #ffffff0 sentinel skipped rather than emitted. Regression tests in constants.spec.ts.",buys:"Failure rate is zero across all 16,777,216 colours, with a floor of 4.58:1 that no club colour can defeat. Shipped as one change \u2014 the measurements above show the threshold alone is worse than the bug. The mobile fork still carries 0.3928; both its call sites are #ffffff class toggles, so the one-character fix is safe there on its own."},{tier:"2 \u2014 the colour utilities",contents:"One hex normalizer (3-digit, 8-digit alpha, optional #, the #ffffff0 sentinel) and the rest of the family routed through it. Consistent failure mode. hexToRgba validated. Null-deref guards. Delete lightenHexColor and isValidHexColor.",buys:"Removes the silent-wrong-answer class from every colour helper, not just the contrast ones."},{tier:"3 \u2014 call sites",contents:"The one-sided writes above, chiefly colorAccent. The page-builder editor overlay bug. The undefined --naked vars. The CTA hover border. One shared overlay helper in place of four copies.",buys:"Clears the remaining user-visible bugs of the same class as the CTA one."},{tier:"4 \u2014 unguarded pairs",contents:"Warn in the theme editor for the 8 pairs where a club picks both colours. Re-enabling checkButtonContrast is most of the work.",buys:'Turns "a club can make it unreadable and never know" into "a club is told, and still decides".'},{tier:"5 \u2014 retire needs-contrast",contents:"Fold the boolean into the token system: derive the colour once, emit it as a --*-contrast token, and delete the four class variants, the two spare CSS variables and the inverted highContrast flag.",buys:"Removes the second, parallel answer to the same question. A component reading var(--x-contrast) needs no boolean, so this is mostly deletion."}]}ngOnInit(){let d=getComputedStyle(document.documentElement).getPropertyValue("--brand-color").trim();/^#[a-f\d]{6}$/i.test(d)&&(this.brandColor=d),this.runSweep(),this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-contrast"]],standalone:!1,decls:912,vars:135,consts:[["sitePanel",""],["id","defect",1,"card"],["side","shared"],[1,"text-small","text-grey"],[1,"overflow-x-auto"],["role","img","aria-label","Linearized channel value against 8-bit input, shipped curve versus WCAG curve",1,"d-block"],["x1","0","stroke","var(--grey-300)","stroke-width","1"],["y1","0","stroke","var(--grey-300)","stroke-width","1","stroke-dasharray","3 3"],["fill","none","stroke","var(--green-600)","stroke-width","2"],["fill","none","stroke","var(--red-600)","stroke-width","2"],[1,"text-smallest","text-grey-lt","mt-1"],[1,"sg-swatch","sg-swatch--sm","mr-1",2,"background-color","var(--green-600)"],[1,"sg-swatch","sg-swatch--sm","ml-3","mr-1",2,"background-color","var(--red-600)"],[1,"text-small","mt-3","mb-0"],["
1643id","how-wrong",1,"card"],[1,"p-3","mb-3","border-all","border-radius","bg-grey-lt"],["variant","tag","status","error","text","read this first"],[1,"text-small","mt-2","mb-2"],[1,"text-small","mb-0"],[1,"row"],[1,"col-md-4"],[1,"sub-head"],[1,"text-header-3","mb-0"],[1,"text-smallest","text-grey-lt"],[1,"text-header-3","mb-0","text-red"],[1,"text-header-3","mb-0","text-green"],[1,"row","mt-3"],[1,"p-3","mt-3","border-all","border-radius","bg-grey-lt"],["variant","tag","status","success","text","Tier 1 verified"],[1,"text-small","mt-2","mb-0"],[1,"text-small","text-grey","mt-3","mb-0"],[1,"text-small","text-grey","mb-0"],["id","try-it",1,"card"],["side","member"],[1,"form-group"],["for","sgContrastHex"],["id","sgContrastHex","type","text","name","sgContrastHex","placeholder","#f663a5",2,"max-width","12rem",3,"ngModelChange","ngModel"],[1,"mt-2"],["id","second-flaw",1,"card"],[1,"sub-head","mt-3"],[1,"table","table-bordered","sg-doc-table"],[2,"width","7rem"],[2,"width","14rem"],["id","call-sites",1,"card"],[1,"table","table-bordered","table-hover","sg-doc-table"],[2,"width","6rem"],[2,"width","20rem"],[2,"width","5rem"],["id","pairs",1,"card"],[2,"width","18rem"],["id","utilities",1,"card"],[2,"width","15rem"],[2,"width","10rem"],[2,"width","12rem"],[1,"text-small","text-grey","mb-1"],["id","needs-contrast",1,"card"],["id","dead",1,"card"],[2,"width","22rem"],["id","mobile",1,"card"],["id","tiers",1,"card"],["id","legend",1,"card"],["type","button",1,"btn","sg-cta-replica"],["type","button",1,"btn","btn-primary"],["type","button",1,"btn"],[1,"p-2","d-flex","align-items-center"],[1,"mr-3"],[1,"mr-3","text-small"],[1,"text-small"],[1,"p-3"],[1,"text-header-4","mb-0"],[1,"p-2","border-radius"],[1,"p-3","bg-grey-lt","border-radius"],[1,"btn"],[1,"sg-slot-outline","p-3","text-smallest","text-grey-lt"],["variant","tag","status","warning","text","partly fixed"],[1,"ml-2"],["fragment","how-wrong",3,"routerLink"],["variant","tag","status","error","text","live"],["variant","tag","status","success","text","live"],["variant","tag","status","error","text","the tree is in that state now"],[1,"text-small","ml-2"],["type","button",1,"btn","btn-naked","btn-sm","mr-1",3,"click"],[1,"sg-swatch","sg-swatch--sm","mr-1"],[1,"col-md-6"],[1,"p-3","border-radius"],[1,"text-smallest","text-grey-lt","mt-1","mb-0"],[1,"text-green"],[1,"text-small","text-grey","mt-3"],[1,"sub-head","mt-4"],[1,"text-red"],[1,"mb-4"],[1,"d-flex","align-items-center","mb-1"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],["variant","tag","status","warning","text","the fix changes this"],["variant","tag","status","disabled","text","already correct"],[1,"text-small","text-red","mb-0"],[1,"text-smallest","text-grey"],[3,"verdict"],[1,"text-smallest"],[1,"mt-2","p-2","bg-grey-lt","border-all","border-radius"],[1,"col-6"],[1,"text-smallest","text-grey-lt","mb-1"],["fragment","try-it",3,"routerLink"],[1,"text-smallest","text-grey-lt","mt-2"],[1,"text-grey-lt"],[1,"col-md-3"],[1,"sg-swatch","sg-swatch--block","sg-slot-outline"],[1,"text-smallest","mt-1"],["variant","tag","status","error","text","throws"],["variant","tag","status","success","text","returns"]],template:function(s,o){if(s&1){let x=B();e(0,` 1644`),k(1,Cd,10,1,"ng-template",null,0,fe),e(3,` 1645 1646`),n(4,"div",1),e(5,` 1647 `),n(6,"h2"),e(7,"Contrast"),t(),e(8,` 1648 `),n(9,"app-sg-caption",2),e(10),t(),e(11,` 1649 `),n(12,"p",3),e(13),n(14,"strong"),e(15,`Tier 1 \u2014 the maths and the rule 1650 \u2014 has shipped;`),t(),e(16,` Tiers 2\u20135 have not, so the defect verdicts below are the 1651 live remainder rather than history. `),n(17,"strong"),e(18,"Every number is computed in your browser"),t(),e(19,` 1652 from the shipped `),n(20,"code"),e(21,"constants.ts"),t(),e(22,` against a WCAG-correct reference implemented 1653 alongside it \u2014 nothing here is a figure typed in from an audit, so the page keeps 1654 telling the truth as the code changes underneath it. 1655 `),t(),e(23,` 1656 `),v(24,_d,18,2),n(25,"h3"),e(26,"One character"),t(),e(27,` 1657 `),n(28,"p",3),e(29,` 1658 `),n(30,"code"),e(31,"getLuminancePart()"),t(),e(32," at "),n(33,"code"),e(34,"constants.ts:1060"),t(),e(35,` linearizes each sRGB 1659 channel. WCAG 2.1 sets the crossover between the linear branch and the gamma curve at 1660 `),n(36,"code"),e(37,"0.03928"),t(),e(38,`.
1661 `),v(39,kd,7,3)(40,Td,10,3),e(41,` 1662 Every other constant on that line was correct. 1663 `),t(),e(42,` 1664 `),n(43,"p",3),e(44,` 1665 The consequence is that the linear branch is taken for channel bytes up to 1666 `),n(45,"strong"),e(46),t(),e(47," instead of "),n(48,"strong"),e(49),t(),e(50),n(51,"code"),e(52),L(53,"number"),t(),e(54,` where the true value is 1667 `),n(55,"code"),e(56),L(57,"number"),t(),e(58,` \u2014 1668 `),n(59,"strong"),e(60),L(61,"number"),t(),e(62,`. 1669 `),t(),e(63,` 1670 1671 `),n(64,"div",4),e(65,` 1672 `),ra(),n(66,"svg",5),e(67,` 1673 `),c(68,"line",6),e(69,` 1674 `),c(70,"line",7),e(71,` 1675 `),c(72,"polyline",8),e(73,` 1676 `),c(74,"polyline",9),e(75,` 1677 `),t(),e(76,` 1678 `),t(),e(77,` 1679 `),oa(),n(78,"p",10),e(79,` 1680 `),c(80,"span",11),e(81,` WCAG 1681 `),c(82,"span",12),e(83),t(),e(84,` 1682 1683 `),n(85,"p",13),e(86,` 1684 `),v(87,Id,9,0)(88,Md,9,0),t(),e(89,` 1685`),t(),e(90,` 1686 1687`),n(91,"div",14),e(92,` 1688 `),n(93,"h3"),e(94,"How wrong, measured"),t(),e(95,` 1689 `),n(96,"app-sg-caption",2),e(97),t(),e(98,` 1690 `),n(99,"p",3),e(100,` 1691 The threshold error only ever ran one way. Luminance came out understated, so contrast 1692 `),n(101,"em"),e(102,"against light backgrounds was overstated"),t(),e(103,` \u2014 the check said "readable" when it 1693 was not. Against dark backgrounds it was understated, which is merely conservative. 1694 `),t(),e(104,` 1695 1696 `),n(105,"div",15),e(106,` 1697 `),c(107,"app-pill",16),e(108,` 1698 `),n(109,"p",17),e(110,` 1699 `),n(111,"strong"),e(112,"Correcting the threshold on its own makes this worse, not better."),t(),e(113,` The 1700 two flaws partly cancel: understating luminance makes the `),n(114,"code"),e(115,"#333333"),t(),e(116,` test 1701 `),n(117,"em"),e(118,"pass"),t(),e(119,` more often, which means black text more often, which is the right answer 1702 more often than it deserves to be. Correct the maths and that probe starts failing on 1703 mid-tones, handing back an unchecked `),n(120,"code"),e(121,"#fff"),t(),e(122,` \u2014 and the rate 1704 `),n(123,"strong"),e(124),L(125,"number"),L(126,"number"),t(),e(127,`. This was verified by 1705 applying the one-character fix and re-measuring, then reverting it. 1706 `),t(),e(128,` 1707 `),n(129,"p",18),e(130,` 1708 That was never an argument against fixing the threshold. It was the argument for 1709 `),n(131,"strong"),e(132,"shipping both halves of Tier 1 as one change"),t(),e(133),n(134,"strong"),e(135),L(136,"number"),t(),e(137,`. Keep this section: 1710 it is the reason the two can never be separated again. 1711 `),t(),e(138,` 1712 `),t(),e(139,` 1713 `),v(140,Dd,9,0),n(141,"div",19),e(142,` 1714 `),n(143,"div",20),e(144,` 1715 `),n(145,"h4",21),e(146,"Before Tier 1"),t(),e(147,` 1716 `),n(148,"p",22),e(149),L(150,"number"),t(),e(151,` 1717 `),n(152,"p",23),e(153,` 1718 Both flaws present. The wrong maths masked part of the wrong rule. 1719 `),t(),e(154,` 1720 `),t(),e(155,` 1721 `),n(156,"div",20),e(157,` 1722 `),n(158,"h4",21),e(159,"Threshold fixed only"),t(),e(160,` 1723 `),n(161,"p",24),e(162),L(163,"number"),t(),e(164,` 1724 `),n(165,"p",23),e(166,` 1725 The rule still tests `),n(167,"code"),e(168,"#333333"),t(),e(169," and never checks its "),n(170,"code"),e(171,"#fff"),t(),e(172,` 1726 fallback. `),n(173,"strong"),e(174,"Worse than leaving it alone."),t(),e(175,` 1727 `),t(),e(176,` 1728 `),t(),e(177,` 1729 `),n(178,"div",20),e(179,` 1730 `),n(180,"h4",21),e(181,"Both fixed \u2014 shipped"),t(),e(182,` 1731 `),n(183,"p",25),e(184),L(185,"number"),t(),e(186,` 1732 `),n(187,"p",23),e(188),L(189,"number"),t(),e(190,` 1733 `),t(),e(191,` 1734 `),t(),e(192,` 1735 1736 `),n(193,"div",26),e(194,` 1737 `),n(195,"div",20),e(196,` 1738 `),n(197,"h4",21),e(198,"Picks unreadable text"),t(),e(199,` 1739 `),n(200,"p",24),e(201),L(202,"number"),t(),e(203,` 1740 `),n(204,"p",23),e(205),n(206,"code"),e(207),t(),e(208,` \u2192 1741 `),n(209,"code"),e(210),t(),e(211),L(212,"number"),t(),e(213,` 1742 `),t(),e(214,` 1743 `),n(215,"div",20),e(216,` 1744 `),n(217,"h4",21),e(218,"Disagrees with WCAG"),t(),e(219,` 1745 `),n(220,"p",22),e(221),L(222,"number"),t(),e(223,` 1746 `),n(224,"p",23),e(225),n(226,"strong"),e(227),t(),e(228),t(),e(229,` 1747 `),t(),e(230,` 1748 `),n(231,"div",20),e(232,` 1749 `),n(233,"h4",21),e(234,"CTA hover text"),t(),e(235,` 1750 `),n(236,"p",25),e(237,"0%"),t(),e(238,` 1751 `),n(239,"p",23),e(240,` 1752 A separate defect with a simpler shape, fixed in Tier 1: the runtime wrote 1753 `),n(241,"code"),e(242,"--theme-color-cta-hover"),t(),e(243,` while the four CSS rules read 1754 `),n(244,"code"),e(245,"--theme-color-cta-buttons--hover"),t(),e(246,`. The names never met, so hover text was 1755 always `),n(247,"code"),e(248,"var(--brand-color)"),t(),e(249,` \u2014 1756 `),n(250,"strong"),e(251),L(252,"number"),t(),e(253,` on the 1757 white hover fill, for every club, regardless of their colour. The runtime now writes 1758 the name the CSS reads, solved against that fill. 1759 `),t(),e(254,` 1760 `),t(),e(255,` 1761 `),t(),e(256,` 1762 1763 `),n(257,"div",27),e(258,` 1764 `),c(259,"app-pill",28),e(260,` 1765 `),n(261,"p",29),e(262,` 1766 Swept over `),n(263,"strong"),e(264),t(),e(265),n(266,"code"),e(267,"contrastRatio"),t(),e(268,` differed from that 1767 reference on `),n(269,"strong"),e(270),t(),e(271,` colours. 1768 `),n(272,"code"),e(273,"contrastingTextColor"),t(),e(274," failed AA on "),n(275,"strong"),e(276),t(),e(277,`, 1769 floor `),n(278,"strong"),e(279),t(),e(280,` at 1770 `),n(281,"code"),e(282),t(),e(283,". "),n(284,"code"),e(285,"darkenHexColorUntilReadable"),t(),e(286,` 1771 failed on `),n(287,"strong"),e(288),t(),e(289,` against the white hover fill, 1772 floor `),n(290,"strong"),e(291),t(),e(292),n(293,"code"),e(294,"constants.spec.ts"),t(),e(295,`. 1773 `),t(),e(296,` 1774 `),t(),e(297,` 1775 1776 `),n(298,"p",30),e(299),n(300,"strong"),e(301),t(),e(302,` colours measured 1777 `),n(303,"strong"),e(304),t(),e(305,` 1778 as it ships, worst `),n(306,"strong"),e(307),t(),e(308,` at 1779 `),n(309,"code"),e(310),t(),e(311,"; "),n(312,"strong"),e(313),t(),e(314,` with the threshold corrected alone; and 1780 `),n(315,"strong"),e(316),t(),e(317,` with both halves done. 1781 `),t(),e(318,` 1782 `),n(319,"p",31),e(320),n(321,"strong"),e(322),t(),e(323),L(324,"number"),t(),e(325,` 1783`),t(),e(326,` 1784 1785`),n(327,"div",32),e(328,` 1786 `),n(329,"h3"),e(330,"Try a colour"),t(),e(331,` 1787 `),n(332,"app-sg-caption",33),e(333,"any colour a club can pick in the theme editor"),t(),e(334,` 1788 `),n(335,"div",34),e(336,`
1789 `),n(337,"label",35),e(338,"Background colour"),t(),e(339,` 1790 `),n(340,"input",36),M("ngModelChange",function(_){return w(x),I(o.demoHex,_)||(o.demoHex=_),C(_)}),t(),e(341,` 1791 `),n(342,"div",37),e(343,` 1792 `),S(344,Fd,6,3,null,null,K),t(),e(346,` 1793 `),t(),e(347,` 1794 1795 `),v(348,jd,78,32)(349,Gd,7,0),t(),e(350,` 1796 1797`),n(351,"div",38),e(352,` 1798 `),n(353,"h3"),e(354,"A second flaw, independent of the maths"),t(),e(355,` 1799 `),n(356,"app-sg-caption",2),e(357,"constants.ts:1089"),t(),e(358,` 1800 `),n(359,"p",3),e(360,` 1801 `),n(361,"code"),e(362,"contrastingTextColor()"),t(),e(363," tests "),n(364,"code"),e(365,"#333333"),t(),e(366,` against the background and 1802 then returns `),n(367,"code"),e(368,"#000"),t(),e(369," or "),n(370,"code"),e(371,"#fff"),t(),e(372,". "),n(373,"strong"),e(374,`It validates a colour it never 1803 renders`),t(),e(375,", and it never checks the "),n(376,"code"),e(377,"#fff"),t(),e(378,` fallback at all \u2014 when the 1804 `),n(379,"code"),e(380,"#333333"),t(),e(381,` test fails, white is returned on the assumption that white must be 1805 better, which is not true for mid-tones. Fixing the threshold alone would leave this in place. 1806 `),t(),e(382,` 1807 `),n(383,"p",3),e(384,` 1808 The proposed rule is to compare the two colours it can actually return and keep the better 1809 one. That is not just safer, it is `),n(385,"em"),e(386,"provably sufficient"),t(),e(387),n(388,"strong"),e(389),L(390,"number"),t(),e(391,` at 1810 `),n(392,"code"),e(393),t(),e(394,` \u2014 comfortably over the 4.5 bar. At full 1811 step-1 resolution the floor is `),n(395,"strong"),e(396),t(),e(397,`. 1812 `),n(398,"strong"),e(399,"No colour a club can pick can defeat a correct two-way check."),t(),e(400,` 1813 `),t(),e(401,` 1814 `),n(402,"p",3),e(403,` 1815 One more trap worth noting: it returns 3-digit hex. `),n(404,"code"),e(405,"contrastChecker"),t(),e(406,` rejects 1816 anything that is not exactly 7 characters, so its own output would fail its own gate if the 1817 two were ever composed. 1818 `),t(),e(407,` 1819 1820 `),n(408,"h4",39),e(409,"Where "),n(410,"code"),e(411,"#333333"),t(),e(412," came from"),t(),e(413,`
1821 `),n(414,"p",3),e(415,` 1822 It is not a design-system colour. The base text colour is 1823 `),n(416,"code"),e(417,"--grey-900: #2e3032"),t(),e(418,", and "),n(419,"code"),e(420,"#333333"),t(),e(421,` appears 1824 `),n(422,"strong"),e(423,"nowhere in the stylesheets"),t(),e(424," \u2014 the one "),n(425,"code"),e(426,"#333"),t(),e(427,` in the SCSS is 1825 in a GIF picker. Nothing the contrast decisions drive has ever rendered it. It got there by 1826 drift: 1827 `),t(),e(428,` 1828 `),n(429,"div",4),e(430,` 1829 `),n(431,"table",40),e(432,` 1830 `),n(433,"thead"),e(434,` 1831 `),n(435,"tr"),e(436,` 1832 `),n(437,"th",41),e(438,"When"),t(),e(439,` 1833 `),n(440,"th",42),e(441,"What"),t(),e(442,` 1834 `),n(443,"th"),e(444,"\xA0"),t(),e(445,` 1835 `),t(),e(446,` 1836 `),t(),e(447,` 1837 `),n(448,"tbody"),e(449,` 1838 `),S(450,$d,14,3,null,null,md),t(),e(452,` 1839 `),t(),e(453,` 1840 `),t(),e(454,` 1841 `),n(455,"p",31),e(456,` 1842 The lesson in that table is not that anyone picked a bad colour \u2014 `),n(457,"code"),e(458,"#333333"),t(),e(459,` 1843 was a sensible probe for the question being asked in 2025. It is that 1844 `),n(460,"strong"),e(461,"the question changed and the probe did not"),t(),e(462,`. A boolean asking "would dark 1845 text work here?" became a function that returns the text colour, and the stand-in came along 1846 for the ride. It also shows the idea has surfaced before: in May 2026 the probe was pointed 1847 at the real text colour and reverted the same day. That commit changed the 1848 `),n(463,"code"),e(464,"needsContrast"),t(),e(465,` boolean at line 933 rather than the colour-picking path, and no 1849 reason for the revert is recorded \u2014 so read it as evidence the smell was noticed, not 1850 as a failed attempt at this fix. 1851 `),t(),e(466,` 1852`),t(),e(467,` 1853 1854`),n(468,"div",43),e(469,` 1855 `),n(470,"h3"),e(471),t(),e(472,` 1856 `),n(473,"app-sg-caption",2),e(474),t(),e(475,` 1857 `),n(476,"p",3),e(477,` 1858 The shape matters as much as the maths. A `),n(478,"strong"),e(479,"one-way"),t(),e(480,` site sets its variable 1859 only when the check fails and relies on the declared default otherwise \u2014 which is fine 1860 when the default happens to be the safe answer and a bug when it does not. That is exactly 1861 the defect fixed on the CTA button earlier today, and it is still present elsewhere. 1862 `),t(),e(481,` 1863 `),n(482,"div",4),e(483,` 1864 `),n(484,"table",44),e(485,` 1865 `),n(486,"thead"),e(487,` 1866 `),n(488,"tr"),e(489,` 1867 `),c(490,"th",45),e(491,` 1868 `),n(492,"th",46),e(493,"Site"),t(),e(494,` 1869 `),n(495,"th",45),e(496,"Tests"),t(),e(497,` 1870 `),n(498,"th",47),e(499,"Shape"),t(),e(500,` 1871 `),n(501,"th"),e(502,"What it means"),t(),e(503,` 1872 `),t(),e(504,` 1873 `),t(),e(505,` 1874 `),n(506,"tbody"),e(507,` 1875 `),S(508,Jd,26,7,null,null,el),t(),e(510,` 1876 `),t(),e(511,` 1877 `),t(),e(512,` 1878`),t(),e(513,` 1879 1880`),n(514,"div",48),e(515,` 1881 `),n(516,"h3"),e(517),t(),e(518,` 1882 `),n(519,"app-sg-caption",33),e(520,"the club picks both colours; no code compares them"),t(),e(521,` 1883 `),n(522,"p",3),e(523,` 1884 These are different from the sites above. Nothing is computing a wrong answer \u2014 nothing 1885 is computing an answer. A club sets a background in one field and the text over it in 1886 another, and the two never meet. `),n(524,"strong"),e(525,`The agreed direction is to warn in the theme editor 1887 and keep the club's choice`),t(),e(526,`, not to override a deliberate brand decision at runtime. 1888 `),t(),e(527,` 1889 `),n(528,"div",4),e(529,` 1890 `),n(530,"table",40),e(531,` 1891 `),n(532,"thead"),e(533,` 1892 `),n(534,"tr"),e(535,` 1893 `),n(536,"th",49),e(537,"Background field"),t(),e(538,` 1894 `),n(539,"th",46),e(540,"Text drawn on it"),t(),e(541,` 1895 `),n(542,"th"),e(543,"Where"),t(),e(544,` 1896 `),t(),e(545,` 1897 `),t(),e(546,` 1898 `),n(547,"tbody"),e(548,` 1899 `),S(549,Zd,15,3,null,null,cd),t(),e(551,` 1900 `),t(),e(552,` 1901 `),t(),e(553,` 1902`),t(),e(554,` 1903 1904`),n(555,"div",50),e(556,` 1905 `),n(557,"h3"),e(558,"The colour utilities around it"),t(),e(559,` 1906 `),n(560,"app-sg-caption",2),e(561,"constants.ts \u2014 the whole family, not just the contrast pair"),t(),e(562,` 1907 `),n(563,"p",3),e(564,` 1908 Four of these functions have four different ideas of what a valid hex colour is, and the one 1909 that would settle the argument is the one nothing calls. 1910 `),t(),e(565,` 1911 `),n(566,"div",4),e(567,` 1912 `),n(568,"table",44),e(569,` 1913 `),n(570,"thead"),e(571,` 1914 `),n(572,"tr"),e(573,` 1915 `),c(574,"th",45),e(575,` 1916 `),n(576,"th",51),e(577,"Function"),t(),e(578,` 1917 `),n(579,"th",47),e(580,"Callers"),t(),e(581,` 1918 `),n(582,"th"),e(583,"Problem"),t(),e(584,` 1919 `),t(),e(585,` 1920 `),t(),e(586,` 1921 `),n(587,"tbody"),e(588,`
1922 `),S(589,em,19,5,null,null,pd),t(),e(591,` 1923 `),t(),e(592,` 1924 `),t(),e(593,` 1925 1926 `),n(594,"h4",39),e(595,"hexToRgba, live"),t(),e(596,` 1927 `),n(597,"p",3),e(598,` 1928 The swatch below each result is filled with the string the shipped function returned. Two of 1929 the four are invalid CSS, so the browser drops the declaration and the swatch renders empty 1930 \u2014 which is precisely how a page-background overlay disappears without an error anywhere. 1931 `),t(),e(599,` 1932 `),n(600,"div",19),e(601,` 1933 `),S(602,tm,13,4,null,null,xd),t(),e(604,` 1934 1935 `),n(605,"h4",39),e(606,"The four notions of a valid hex"),t(),e(607,` 1936 `),n(608,"div",4),e(609,` 1937 `),n(610,"table",40),e(611,` 1938 `),n(612,"thead"),e(613,` 1939 `),n(614,"tr"),e(615,` 1940 `),n(616,"th",52),e(617,"Input"),t(),e(618,` 1941 `),n(619,"th",53),e(620,"contrastChecker"),t(),e(621,` 1942 `),n(622,"th",52),e(623,"hexColorToArray"),t(),e(624,` 1943 `),n(625,"th"),e(626,"hexToRgba"),t(),e(627,` 1944 `),t(),e(628,` 1945 `),t(),e(629,` 1946 `),n(630,"tbody"),e(631,` 1947 `),S(632,nm,17,4,null,null,K),t(),e(634,` 1948 `),t(),e(635,` 1949 `),t(),e(636,` 1950 `),n(637,"p",23),e(638,` 1951 `),n(639,"code"),e(640,"#ffffff0"),t(),e(641,` is the colour picker's "no colour" sentinel, and it is a real value 1952 stored on real themes. Note that a missing colour reads as `),n(642,"em"),e(643,"passing"),t(),e(644,` while a perfectly 1953 valid `),n(645,"code"),e(646,"#fff"),t(),e(647," reads as "),n(648,"em"),e(649,"failing"),t(),e(650,`. 1954 `),t(),e(651,` 1955 1956 `),n(652,"h4",39),e(653,"darkenHexColor, live"),t(),e(654,` 1957 `),n(655,"p",54),e(656,` 1958 `),n(657,"code"),e(658,"darkenHexColor('#ffffff', 0.9)"),t(),e(659," returns "),n(660,"code"),e(661),t(),e(662,` \u2014 1959 valid CSS, but fractional and in a format no other helper in the file can read back. 1960 And with a 3-digit hex: 1961 `),t(),e(663,` 1962 `),n(664,"p",18),e(665,` 1963 `),v(666,im,6,1)(667,am,6,1),t(),e(668,` 1964`),t(),e(669,` 1965 1966`),n(670,"div",55),e(671,` 1967 `),n(672,"h3"),e(673,"The other half of the system: "),n(674,"code"),e(675,"needs-contrast"),t()(),e(676,` 1968 `),n(677,"app-sg-caption",2),e(678,"one decision, five mechanisms"),t(),e(679,` 1969 `),n(680,"p",3),e(681,` 1970 Everything above is the `),n(682,"strong"),e(683,"token"),t(),e(684," half \u2014 a "),n(685,"code"),e(686,"--*-contrast"),t(),e(687,` 1971 variable carrying a computed colour. There is a second, parallel half that answers the same 1972 question with a `),n(688,"strong"),e(689,"boolean"),t(),e(690,`, and nothing connects the two. 1973 `),t(),e(691,` 1974 `),n(692,"div",4),e(693,` 1975 `),n(694,"table",44),e(695,` 1976 `),n(696,"thead"),e(697,` 1977 `),n(698,"tr"),e(699,` 1978 `),c(700,"th",45),e(701,` 1979 `),n(702,"th",49),e(703,"Where"),t(),e(704,` 1980 `),n(705,"th",45),e(706,"Tests"),t(),e(707,` 1981 `),n(708,"th",53),e(709,"Mechanism"),t(),e(710,` 1982 `),n(711,"th"),e(712,"What it does"),t(),e(713,` 1983 `),t(),e(714,` 1984 `),t(),e(715,` 1985 `),n(716,"tbody"),e(717,` 1986 `),S(718,rm,21,5,null,null,el),t(),e(720,` 1987 `),t(),e(721,` 1988 `),t(),e(722,` 1989 `),n(723,"p",3),e(724,` 1990 Four different tested foregrounds, two opposite directions, two different blacks, class 1991 `),n(725,"em"),e(726,"and"),t(),e(727," CSS variable, "),n(728,"code"),e(729,"needsContrast"),t(),e(730," "),n(731,"em"),e(732,"and"),t(),e(733,` 1992 `),n(734,"code"),e(735,"needs-contrast"),t(),e(736,`, plus one variable that documents its own disuse. 1993 `),t(),e(737,` 1994 `),n(738,"p",3),e(739,` 1995 The reason it drifted is in the name. `),n(740,"strong")(741,"code"),e(742,"needs-contrast"),t(),e(743,` means "not the 1996 default" without saying what the default was or what to switch to`),t(),e(744,` \u2014 so its 1997 meaning is set by whichever component it lands in. On the roster card it means 1998 `),n(745,"em"),e(746,"go dark"),t(),e(747,"; on the header it means "),n(748,"em"),e(749,"go light"),t(),e(750,`. Both are "needs contrast". A 1999 boolean cannot carry the difference, so nothing can be shared and every new surface 2000 reinvents it \u2014 which is exactly how one of the three siblings ended up on 2001 `),n(751,"code"),e(752,"--color-black"),t(),e(753," while the other two use "),n(754,"code"),e(755,"--color-black-lt"),t(),e(756,`. 2002 `),t(),e(757,` 2003 `),n(758,"p",31),e(759,` 2004 It should not be made consistent \u2014 it should mostly be `),n(760,"strong"),e(761,"deleted"),t(),e(762,`. The 2005 token approach subsumes it: a boolean can only flip to the single alternative a stylesheet 2006 hardcoded, while a token carries the actual computed colour, and a component that reads 2007 `),n(763,"code"),e(764,"var(--x-contrast)"),t(),e(765,` needs no boolean at all. That is Tier 5, and it is mostly 2008 removal: four components, roughly eight SCSS rules and two dead variables. 2009 `),t(),e(766,` 2010`),t(),e(767,` 2011 2012`),n(768,"div",56),e(769,`
2013 `),n(770,"h3"),e(771,"Dead and broken nearby"),t(),e(772,` 2014 `),n(773,"app-sg-caption",2),e(774,"found while tracing the call sites above"),t(),e(775,` 2015 `),n(776,"div",4),e(777,` 2016 `),n(778,"table",44),e(779,` 2017 `),n(780,"thead"),e(781,` 2018 `),n(782,"tr"),e(783,` 2019 `),c(784,"th",45),e(785,` 2020 `),n(786,"th",57),e(787,"Thing"),t(),e(788,` 2021 `),n(789,"th"),e(790,"State"),t(),e(791,` 2022 `),t(),e(792,` 2023 `),t(),e(793,` 2024 `),n(794,"tbody"),e(795,` 2025 `),S(796,om,14,3,null,null,hd),t(),e(798,` 2026 `),t(),e(799,` 2027 `),t(),e(800,` 2028`),t(),e(801,` 2029 2030`),n(802,"div",58),e(803,` 2031 `),n(804,"h3"),e(805,"The mobile fork"),t(),e(806,` 2032 `),n(807,"app-sg-caption",2),e(808,"one colour, two decisions"),t(),e(809,` 2033 `),n(810,"p",3),e(811,` 2034 The mobile app carries its own copy of the same maths at `),n(812,"code"),e(813),t(),e(814,`, with 2035 the same `),n(815,"code"),e(816),t(),e(817,`. It is a narrow surface: mobile reads exactly one 2036 club colour, `),n(818,"code"),e(819,"colorPrimary"),t(),e(820,`, in exactly two places. 2037 `),t(),e(821,` 2038 `),n(822,"ul",3),e(823,` 2039 `),S(824,lm,5,1,null,null,K),t(),e(826,` 2040 `),n(827,"p",3),e(828,` 2041 A third usage at `),n(829,"code"),e(830),t(),e(831,` is commented out. Everything else in 2042 that app is Ionic theming rather than club colour. The irony worth recording: 2043 `),n(832,"strong")(833,"code"),e(834,"colorPrimary"),t(),e(835,` is the field this styleguide already lists as dead on 2044 web`),t(),e(836,` \u2014 zero CSS consumers here, and the only one mobile depends on. 2045 `),t(),e(837,` 2046 `),n(838,"p",31),e(839,` 2047 The two forks also disagree on malformed input: web returns `),n(840,"code"),e(841,"false"),t(),e(842,` for a 2048 wrong-length string, mobile returns `),n(843,"code"),e(844,"true"),t(),e(845,`. Worth knowing: 2049 `),n(846,"code"),e(847,"CLAUDE.md"),t(),e(848," documents the mobile repo at "),n(849,"code"),e(850),t(),e(851,`, 2050 which does not exist \u2014 it is at `),n(852,"code"),e(853),t(),e(854,`. A cross-client 2051 grep at the documented path finds nothing and reports a false all-clear. 2052 `),t(),e(855,` 2053`),t(),e(856,` 2054 2055`),n(857,"div",59),e(858,` 2056 `),n(859,"h3"),e(860,"What fixing it looks like"),t(),e(861,` 2057 `),n(862,"app-sg-caption",2),e(863,"proposed \u2014 no decision taken"),t(),e(864,` 2058 `),n(865,"p",3),e(866,` 2059 The tiers are ordered by how much each depends on the one before it. Tier 1 stands alone and 2060 is where all the measured harm is; each later tier is progressively more about hygiene than 2061 about what a member sees. 2062 `),t(),e(867,` 2063 `),n(868,"div",4),e(869,` 2064 `),n(870,"table",40),e(871,` 2065 `),n(872,"thead"),e(873,` 2066 `),n(874,"tr"),e(875,` 2067 `),n(876,"th",53),e(877,"Tier"),t(),e(878,` 2068 `),n(879,"th"),e(880,"Contents"),t(),e(881,` 2069 `),n(882,"th",57),e(883,"What it buys"),t(),e(884,` 2070 `),t(),e(885,` 2071 `),t(),e(886,` 2072 `),n(887,"tbody"),e(888,` 2073 `),S(889,sm,14,3,null,null,ud),t(),e(891,` 2074 `),t(),e(892,` 2075 `),t(),e(893,` 2076 `),n(894,"p",31),e(895,` 2077 `),n(896,"strong"),e(897,"Tier 1 must ship as one change."),t(),e(898,` Its two halves cancel in the wrong 2078 direction if separated \u2014 the figures above were taken by applying the threshold fix 2079 alone and watching the rate rise. One item is independent of all of it and cheap: the 2080 `),n(899,"code"),e(900,"+t?.pageOverlayColor"),t(),e(901,` guard in the page-builder editor, which is hiding every 2081 author's background overlay. 2082 `),t(),e(902,` 2083`),t(),e(903,` 2084 2085`),n(904,"div",60),e(905,` 2086 `),n(906,"h3"),e(907,"Verdict legend"),t(),e(908,` 2087 `),c(909,"app-sg-verdict-legend"),e(910,` 2088`),t(),e(911,` 2089`)}s&2&&(i(10),q("audited ",o.snapshotDate," \u2014 Tier 1 shipped ",o.tier1FixedOn," \u2014 the page measures the code live, so it tracks what is fixed"),i(3),f(` 2090 Every contrast decision in the app runs through one function, and that function was wrong 2091 from the day it was written until `,o.tier1FixedOn,`. This page measures how wrong, shows the 2092 elements it drives, and sets out what remains. `),i(11),y(o.inHalfFixedState?24:-1),i(15),y(o.shippedStillWrong?39:40),i(7),p(o.legacyCrossover),i(3),p(o.wcagCrossover),i(),Ve(`. Bytes 2093 `,o.wcagCrossover+1,"\u2013",o.legacyCrossover,` \u2014 most of the dark half of every 2094 ramp \u2014 are linearized with the cheap branch and come out far too dark. At byte 2095 `,o.worstChannel.byte,` the code reports 2096 `),i(2),p(G(53,87,o.worstChannel.legacy,"1.5-5")),i(4),p(G(57,90,o.worstChannel.wcag,"1.5-5")),i(4),f("",G(61,93,o.worstChannel.factor,"1.1-1"),"\xD7 too dark"),i(6),pe("viewBox","0 0 "+o.chart.width+" "+o.chart.height)("width",o.chart.width)("height",o.chart.height),i(2),pe("y1",o.chart.height)("x2",o.chart.width)("y2",o.chart.height),i(2),pe("x1",o.legacyCrossover/255*o.chart.width)("x2",o.legacyCrossover/255*o.chart.width)("y2",o.chart.height),i(2),pe("points",o.wcagPlot),i(2),pe("points",o.legacyPlot),i(9),Ve(" the ",o.LEGACY_THRESHOLD,` curve 2097 \u2014 the gap between them, from byte `,o.wcagCrossover," to byte ",o.legacyCrossover,`, was the defect. 2098 Note the discontinuity where the legacy curve jumps back onto the correct one. 2099 `),i(4),y(o.shippedStillWrong?87:88),i(10),q("swept live in your browser \u2014 ",o.sweep.total," colours, every ",o.SWEEP_STEP,"th step of the cube"),i(27),q("rises from ",G(125,96,o.legacyUnreadablePercent,"1.1-1"),`% to 2100 `,G(126,99,o.halfFixedUnreadablePercent,"1.1-1"),"%"),i(9),f(`, which is what happened on 2101 `,o.tier1FixedOn,` and takes it to 2102 `),i(2),f("",G(136,102,o.bothFixedUnreadablePercent,"1.1-1"),"%"),i(5),y(o.inHalfFixedState?140:-1),i(9),f("",G(150,105,o.legacyUnreadablePercent,"1.1-1"),"%"),i(13),f("",G(163,108,o.halfFixedUnreadablePercent,"1.1-1"),"%"),i(22),f("",G(185,111,o.bothFixedUnreadablePercent,"1.1-1"),"%"),i(4),f(` 2103 Best-of black/white, which cannot drop below 2104 `,G(189,114,o.sweep.bestOfWorst,"1.2-2"),`:1. 2105 `),i(13),f("",G(202,117,o.unreadablePercent,"1.1-1"),"%"),i(4),q(` 2106 `,o.sweep.unreadable," of ",o.sweep.total,` colours get a text colour that fails real 2107 WCAG AA. Worst: `),i(2),p(o.sweep.worstColor),i(3),p(o.sweep.worstPick),i(),f(" at ",G(212,120,o.sweep.worstRatio,"1.2-2"),`:1. 2108 `),i(10),f("",G(222,123,o.disagreePercent,"1.1-1"),"%"),i(4),f(` 2109 `,o.sweep.disagree,` colours where the shipped rule and a correct one pick different 2110 text. `),i(2),f("",o.sweep.unsafe," of those are unsafe"),i(),f(` and 2111 `,o.sweep.safe,` are merely conservative. 2112 `),i(23),f("",G(252,126,o.trueRatio(o.brandColor,"#ffffff"),"1.2-2"),":1"),i(13),f("every one of the ",o.shippedSweep.total," colours"),i(),f(` on 2113 `,o.tier1FixedOn,`, executing the shipped functions rather than a copy of them, against a 2114 WCAG reference implemented separately. `),i(5),p(o.shippedSweep.ratioDrift),i(6),p(o.shippedSweep.textFails),i(3),f("",o.shippedSweep.textFloor,":1"),i(3),p(o.shippedSweep.textFloorColor),i(6),p(o.shippedSweep.hoverFails),i(3),f("",o.shippedSweep.hoverFloor,":1"),i(),f(". The step-",o.SWEEP_STEP,` form of
2115 the same two sweeps is pinned in `),i(7),f(` 2116 The sweep above samples every `,o.SWEEP_STEP,`th value so it can run on page load. A full 2117 step-1 sweep of all `),i(2),p(o.fullSweep.total),i(3),q("",o.fullSweep.unreadable," unreadable (",o.fullSweep.unreadablePercent,"%)"),i(3),f("",o.fullSweep.worstRatio,":1"),i(3),p(o.fullSweep.worstColor),i(3),q("",o.fullSweep.halfFixed,` 2118 (`,o.fullSweep.halfFixedPercent,"%)"),i(3),p(o.fullSweep.bothFixed),i(4),f(` 2119 The proposed hover solver, swept live here against every one of the `,o.sweep.total,` 2120 colours, fails `),i(2),p(o.sweep.hoverFails),i(),f(` times \u2014 its worst result is 2121 `,G(324,129,o.sweep.hoverWorst,"1.2-2"),`:1, because it iterates until it clears the bar 2122 instead of guessing once. 2123 `),i(17),T("ngModel",o.demoHex),i(4),E(o.presets),i(4),y(o.demoValid?348:349),i(39),f(`: swept live here, the worst 2124 case of best-of-black-or-white across all `,o.sweep.total,` colours is 2125 `),i(2),f("",G(390,132,o.sweep.bestOfWorst,"1.2-2"),":1"),i(4),p(o.sweep.bestOfWorstColor),i(3),f("",o.fullSweep.bestOfWorst,":1"),i(54),E(o.probeHistory),i(21),f("Where the answer is used \u2014 ",o.callSites.length," sites"),i(3),f("",o.oneWayCount," of them write only one branch and lean on a CSS default for the other"),i(34),E(o.callSites),i(9),f("",o.pairs.length," pairs nothing checks at all"),i(32),E(o.pairs),i(40),E(o.utilities),i(13),E(o.rgbaDemos),i(30),E(o.validityMatrix),i(29),p(o.darkenDemo),i(5),y(o.darkenThrows.threw?666:667),i(52),E(o.needsContrastRows),i(78),E(o.deadThings),i(17),p(o.mobile.file),i(3),p(o.LEGACY_THRESHOLD),i(8),E(o.mobile.callSites),i(6),p(o.mobile.commentedOut),i(20),p(o.mobile.documentedPath),i(3),p(o.mobile.actualPath),i(36),E(o.tiers))},dependencies:[De,be,U,H,$,J,X,ve,we,Ye],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var Ui=(a,r)=>r.token,dm=(a,r)=>r.className,mm=(a,r)=>r.hex;function cm(a,r){a&1&&(e(0,` 2126 `),n(1,"span",30),e(2,"(not for text)"),t(),e(3,` 2127 `))}function pm(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(` 2128 `,l.aliases,` 2129 `)}}function xm(a,r){a&1&&(e(0,` 2130 `),n(1,"span",31),e(2,"\u2014"),t(),e(3,` 2131 `))}function hm(a,r){if(a&1&&(e(0,` 2132 `),n(1,"tr"),e(2,` 2133 `),n(3,"td"),c(4,"span",29),t(),e(5,` 2134 `),n(6,"td")(7,"code"),e(8),t()(),e(9,` 2135 `),n(10,"td")(11,"code"),e(12),t()(),e(13,` 2136 `),n(14,"td"),e(15),t(),e(16,` 2137 `),n(17,"td"),e(18),v(19,cm,4,0),t(),e(20,` 2138 `),n(21,"td",24),e(22,` 2139 `),v(23,pm,1,1)(24,xm,4,0),t(),e(25,` 2140 `),t(),e(26,` 2141 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(4),p(l.token),i(4),p(l.hex),i(3),p(l.uses),i(3),f(` 2142 `,l.onWhite,`:1 2143 `),i(),y(l.onWhite<4.5?19:-1),i(4),y(l.aliases?23:24)}}function um(a,r){if(a&1&&(e(0,` 2144 `),n(1,"tr"),e(2,` 2145 `),n(3,"td"),c(4,"span",29),t(),e(5,` 2146 `),n(6,"td")(7,"code"),e(8),t()(),e(9,` 2147 `),n(10,"td")(11,"span"),e(12,"Reserve your spot"),t()(),e(13,` 2148 `),n(14,"td",24)(15,"code"),e(16),t()(),e(17,` 2149 `),n(18,"td"),e(19),t(),e(20,` 2150 `),n(21,"td"),e(22),t(),e(23,` 2151 `),n(24,"td",24),e(25),t(),e(26,` 2152 `),t(),e(27,` 2153 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(4),f(".",l.className),i(3),ne(l.className),i(5),p(l.token),i(3),p(l.uses),i(3),f("",l.onWhite,":1"),i(3),p(l.role)}}function gm(a,r){a&1&&(e(0,` 2154 `),n(1,"app-pill",32),e(2,"suspect"),t(),e(3,` 2155 `))}function fm(a,r){if(a&1&&(e(0,` 2156 `),n(1,"tr"),e(2,` 2157 `),n(3,"td"),c(4,"span",29),t(),e(5,` 2158 `),n(6,"td"),e(7,` 2159 `),n(8,"code"),e(9),t(),e(10,` 2160 `),v(11,gm,4,0),t(),e(12,` 2161 `),n(13,"td",24)(14,"code"),e(15),t()(),e(16,` 2162 `),n(17,"td",24)(18,"code"),e(19),t()(),e(20,` 2163 `),n(21,"td"),e(22),t(),e(23,` 2164 `),n(24,"td",24),e(25),t(),e(26,` 2165 `),t(),e(27,` 2166 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(5),p(l.token),i(2),y(l.suspect?11:-1),i(4),p(l.resolvesTo),i(4),p(l.hex),i(3),p(l.uses),i(3),p(l.note)}}function bm(a,r){if(a&1&&(e(0,` 2167 `),n(1,"tr"),e(2,` 2168 `),n(3,"td"),c(4,"span",29),t(),e(5,` 2169 `),n(6,"td")(7,"code"),e(8),t()(),e(9,` 2170 `),n(10,"td",24)(11,"code"),e(12),t()(),e(13,` 2171 `),n(14,"td",24)(15,"code"),e(16),t()(),e(17,` 2172 `),n(18,"td",24),e(19),t(),e(20,` 2173 `),t(),e(21,` 2174 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(4),p(l.token),i(4),p(l.resolvesTo),i(4),p(l.hex),i(3),p(l.drives)}}function Sm(a,r){a&1&&(e(0,` 2175 `),n(1,"app-pill",33),e(2,"text fails"),t(),e(3,` 2176 `))}function Em(a,r){if(a&1&&(e(0,` 2177 `),n(1,"tr"),e(2,` 2178 `),n(3,"td"),c(4,"span",29),t(),e(5,` 2179 `),n(6,"td")(7,"code"),e(8),t()(),e(9,` 2180 `),n(10,"td",24),e(11),t(),e(12,` 2181 `),n(13,"td"),e(14),t(),e(15,` 2182 `),n(16,"td"),e(17),t(),e(18,` 2183 `),n(19,"td"),e(20),v(21,Sm,4,0),t(),e(22,` 2184 `),n(23,"td"),c(24,"span",29),t(),e(25,` 2185 `),n(26,"td",24)(27,"code"),e(28),t()(),e(29,` 2186 `),t(),e(30,` 2187 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(4),p(l.hex),i(3),p(l.origin),i(3),p(l.decls),i(3),p(l.files),i(3),f(` 2188 `,l.onWhite,`:1 2189 `),i(),y(l.onWhite<4.5?21:-1),i(3),W("background-color",l.nearestHex),i(4),p(l.nearest)}}var rl=(()=>
2189{let r=class r{constructor(d){this.siteDataService=d,this.snapshotDate="2026-08-19",this.ramp=[{token:"--blue-25",hex:"#f8fcff",uses:14,aliases:"",onWhite:1.03},{token:"--blue-50",hex:"#ebf7ff",uses:24,aliases:"--light-blue-background \xB7 alert info fill",onWhite:1.11},{token:"--blue-75",hex:"#c9ebff",uses:5,aliases:"",onWhite:1.32},{token:"--blue-100",hex:"#bae5ff",uses:9,aliases:"",onWhite:1.41},{token:"--blue-200",hex:"#92d2ff",uses:8,aliases:"",onWhite:1.72},{token:"--blue-300",hex:"#6fbdff",uses:5,aliases:"",onWhite:2.09},{token:"--blue-400",hex:"#51a8ff",uses:4,aliases:"",onWhite:2.52},{token:"--blue-500",hex:"#3a93ff",uses:11,aliases:"",onWhite:3.06},{token:"--blue-600",hex:"#297ef4",uses:21,aliases:"",onWhite:3.83},{token:"--blue-700",hex:"#1d6ae5",uses:23,aliases:"--primary-link \xB7 --border-blue \xB7 $btn-primary",onWhite:4.95},{token:"--blue-800",hex:"#0e58bb",uses:23,aliases:"--primary-link-hover \xB7 .text-header-blue \xB7 alert info icon",onWhite:6.7},{token:"--blue-900",hex:"#054584",uses:33,aliases:".text-blue \xB7 --base-text-alt-lt \xB7 --002d73 \xB7 alert info border",onWhite:9.59},{token:"--blue-950",hex:"#001d46",uses:3,aliases:"",onWhite:15.9},{token:"--blue-1000",hex:"#001537",uses:104,aliases:".text-navy \xB7 --base-text-alt \xB7 --base-header \xB7 header-emphasis",onWhite:18.07},{token:"--blue-1500",hex:"#000c24",uses:2,aliases:"",onWhite:19.51},{token:"--blue-2000",hex:"#00040f",uses:2,aliases:"",onWhite:20.63}],this.aliases=[{token:"--primary-link",resolvesTo:"--blue-700",hex:"#1d6ae5",uses:121,note:"The link color. Also the bare <a> color and $btn-primary.",suspect:!1},{token:"--primary-link-hover",resolvesTo:"--blue-800",hex:"#0e58bb",uses:48,note:"Link hover, and every PrimeNG hover we hand-patched.",suspect:!1},{token:"--002d73",resolvesTo:"--blue-900",hex:"#054584",uses:20,note:"Named after a hex it no longer holds \u2014 #002d73 is a DIFFERENT blue.",suspect:!0},{token:"--border-blue",resolvesTo:"--blue-700",hex:"#1d6ae5",uses:10,note:"Duplicate of --primary-link at a different name.",suspect:!0},{token:"--light-blue-background",resolvesTo:"--blue-50",hex:"#ebf7ff",uses:7,note:"Same value as the inline-alert info fill.",suspect:!1},{token:"--base-text-alt",resolvesTo:"--blue-1000",hex:"#001537",uses:6,note:"Same value as --base-header and .text-navy.",suspect:!0},{token:"--base-header",resolvesTo:"--blue-1000",hex:"#001537",uses:5,note:"Same value as --base-text-alt and .text-navy.",suspect:!0},{token:"--base-text-alt-lt",resolvesTo:"--blue-900",hex:"#054584",uses:2,note:"Same value as .text-blue and --002d73.",suspect:!0}],this.blueText=[{className:"text-primary-link",token:"--primary-link (--blue-700)",hex:"#1d6ae5",uses:147,onWhite:4.95,role:"Looks like a link. Mostly on non-anchors \u2014 73 buttons, 47 spans, 10 icons, only 6 anchors."},{className:"text-blue",token:"--blue-900",hex:"#054584",uses:31,onWhite:9.59,role:"The info intent color. Four ramp steps away from the link color."},{className:"text-navy",token:"--blue-1000 !important",hex:"#001537",uses:59,onWhite:18.07,role:"Heading-weight blue. Same value as --base-header, but reached by a different name."},{className:"text-header-blue",token:"--blue-800 @ .8 opacity",hex:"#0e58bb",uses:1,role:"Only class in the block that uses opacity to make a color.",onWhite:6.7}],this.foreign=[{hex:"#007bff",origin:"Bootstrap 4 $primary",decls:31,files:12,onWhite:3.98,nearest:"--blue-600 #297ef4",nearestHex:"#297ef4"},{hex:"#4f46e5",origin:"Tailwind indigo-600",decls:20,files:3,onWhite:6.29,nearest:"--blue-800 #0e58bb",nearestHex:"#0e58bb"},{hex:"#6366f1",origin:"Tailwind indigo-500",decls:7,files:1,onWhite:4.36,nearest:"--blue-700 #1d6ae5",nearestHex:"#1d6ae5"},{hex:"#e0e7ff",origin:"Tailwind indigo-100",decls:7,files:2,onWhite:1.2,nearest:"--blue-50 #ebf7ff",nearestHex:"#ebf7ff"},{hex:"#116fbf",origin:"one-off",decls:6,files:1,onWhite:5.24,nearest:"--blue-800 #0e58bb",nearestHex:"#0e58bb"},{hex:"#a5b4fc",origin:"Tailwind indigo-300",decls:5,files:1,onWhite:1.9,nearest:"--blue-200 #92d2ff",nearestHex:"#92d2ff"},{hex:"#4338ca",origin:"Tailwind indigo-700",decls:4,files:1,onWhite:8.09,nearest:"--blue-900 #054584",nearestHex:"#054584"},{hex:"#2196f3",origin:"Material blue 500",decls:4,files:3,onWhite:3.12,nearest:"--blue-600 #297ef4",nearestHex:"#297ef4"},{hex:"#e3f2fd",origin:"Material blue 50",decls:4,files:2,onWhite:1.14,nearest:"--blue-50 #ebf7ff",nearestHex:"#ebf7ff"}],this.foreignDecls=this.foreign.reduce((s,o)=>s+o.decls,0),this.primeRamp=[{token:"--p-primary-50",resolvesTo:"--blue-50",hex:"#ebf7ff",drives:"highlight.background \u2014 selected option / row / page"},{token:"--p-primary-100",resolvesTo:"--blue-100",hex:"#bae5ff",drives:"highlight.focusB
2189ackground, tag fill"},{token:"--p-primary-200",resolvesTo:"--blue-200",hex:"#92d2ff",drives:"dark scheme only"},{token:"--p-primary-300",resolvesTo:"--blue-400",hex:"#51a8ff",drives:"dark scheme only"},{token:"--p-primary-400",resolvesTo:"--blue-600",hex:"#297ef4",drives:"dark scheme primary.color"},{token:"--p-primary-500",resolvesTo:"--blue-700",hex:"#1d6ae5",drives:"primary.color \u2014 focus ring, form-field focus border, badge, tabs"},{token:"--p-primary-600",resolvesTo:"--blue-800",hex:"#0e58bb",drives:"primary.hoverColor"},{token:"--p-primary-700",resolvesTo:"--blue-900",hex:"#054584",drives:"primary.activeColor, highlight.color"},{token:"--p-primary-800",resolvesTo:"--blue-950",hex:"#001d46",drives:"highlight.focusColor"},{token:"--p-primary-900",resolvesTo:"--blue-1000",hex:"#001537",drives:"dark scheme only"},{token:"--p-primary-950",resolvesTo:"--blue-1500",hex:"#000c24",drives:"nothing consumes it"}]}ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-sg-blues-and-links"]],standalone:!1,decls:542,vars:6,consts:[[1,"text-small","text-grey"],[3,"routerLink"],[1,"card"],["side","shared"],[1,"table","table-bordered","table-hover"],[2,"width","3rem"],[2,"width","9rem"],[2,"width","6rem"],[2,"width","5rem"],[2,"width","7rem"],[1,"bg-grey-lt","border-all","border-radius","p-3","text-medium","overflow-x-auto"],[1,"border-bottom","py-2"],[1,"row"],[1,"col-3","text-small","text-grey"],[1,"col"],["href","javascript:void(0)"],["width","20","height","20","alt","","src","data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Crect width='20' height='20' fill='%239ea5aa'/%3E%3C/svg%3E"],[1,"text-small","text-grey","mb-0"],[2,"width","12rem"],[2,"width","16rem"],[2,"width","14rem"],[1,"mt-3"],[1,"d-flex","align-items-center","gap-3","flex-wrap","border-bottom","py-2"],[1,"sg-swatch","sg-swatch--lg",2,"background-color","#002d73"],[1,"text-small"],[1,"sg-swatch","sg-swatch--lg",2,"background-color","#054584"],[2,"width","10rem"],[2,"width","8rem"],[1,"text-medium"],[1,"sg-swatch"],[1,"text-grey-lt","text-small"],[1,"text-grey-lt"],["status","warning"],["status","error"]],template:function(s,o){s&1&&(n(0,"h2"),e(1,"Blues & Links"),t(),e(2,` 2190`),n(3,"p",0),e(4,` 2191 Every blue the app can render, and every way it says "this is a link." The trigger for this study 2192 was noticing that link blue, info blue, and heading blue are three unrelated values that arrived 2193 by three different routes. 2194`),t(),e(5,` 2195`),n(6,"p",0),e(7,` 2196 Counts are a grep snapshot of `),n(8,"code"),e(9,"ClientApp/src"),t(),e(10," taken "),n(11,"strong"),e(12),t(),e(13,`, 2197 styleguide excluded. Contrast is against white \u2014 the background the vast majority of this text 2198 sits on. Companion study: 2199 `),n(14,"a",1),e(15,"system alerts & colored text"),t(),e(16,`, 2200 which owns the `),n(17,"code"),e(18,"info"),t(),e(19,` intent. 2201`),t(),e(20,` 2202 2203`),n(21,"div",2),e(22,` 2204 `),n(23,"h3"),e(24,"1. The ramp"),t(),e(25,` 2205 `),n(26,"app-sg-caption",3),e(27,"1_base/variables.scss \u2014 #region Blue"),t(),e(28,` 2206 `),n(29,"p",0),e(30,` 2207 16 steps. Usage is heavily bimodal: `),n(31,"code"),e(32,"--blue-1000"),t(),e(33," (104) and "),n(34,"code"),e(35,"--blue-900"),t(),e(36,` 2208 (33) carry the headings, `),n(37,"code"),e(38,"--blue-700"),t(),e(39,"/"),n(40,"code"),e(41,"--blue-800"),t(),e(42,` carry links, and the 2209 entire 25\u2013400 range \u2014 6 steps \u2014 accounts for 65 uses of mostly backgrounds. 2210 `),t(),e(43,` 2211 `),n(44,"table",4),e(45,` 2212 `),n(46,"thead"),e(47,` 2213 `),n(48,"tr"),e(49,` 2214 `),c(50,"th",5),e(51,` 2215 `),n(52,"th",6),e(53,"Token"),t(),e(54,` 2216 `),n(55,"th",7),e(56,"Hex"),t(),e(57,` 2217 `),n(58,"th",8),e(59,"Uses"),t(),e(60,` 2218 `),n(61,"th",9),e(62,"On white"),t(),e(63,` 2219 `),n(64,"th"),e(65,"Also known as"),t(),e(66,` 2220 `),t(),e(67,` 2221 `),t(),e(68,` 2222 `),n(69,"tbody"),e(70,` 2223 `),S(71,hm,27,8,null,null,Ui),t(),e(73,` 2224 `),t(),e(74,` 2225`),t(),e(75,` 2226 2227`),n(76,"div",2),e(77,` 2228 `),n(78,"h3"),e(79,'2. What "link" means'),t(),e(80,` 2229 `),n(81,"app-sg-caption",3),e(82,"1_base/global.scss \u2014 /*Links and buttons*/"),t(),e(83,` 2230 `),n(84,"p",0),e(85,`
2231 There is exactly one global anchor rule, and it carries a `),n(86,"code"),e(87,":has()"),t(),e(88,` guard: 2232 `),t(),e(89,` 2233`),n(90,"pre",10),e(91,`a:not(:has(img)) { 2234 color: var(--primary-link); 2235 text-decoration: none; 2236} 2237a:hover { 2238 color: var(--primary-link-hover); 2239 text-decoration: underline; 2240}`),t(),e(92,` 2241 `),n(93,"p",0),e(94,` 2242 `),n(95,"strong"),e(96,"The guard is on the base rule but not on the hover rule."),t(),e(97,` An anchor wrapping 2243 an image is deliberately left un-recolored \u2014 then picks up link color and an underline the 2244 moment you hover it. The two rules disagree about whether image links are links. 2245 `),t(),e(98,` 2246 `),n(99,"div",11),e(100,` 2247 `),n(101,"div",12),e(102,` 2248 `),n(103,"div",13),e(104,"plain anchor"),t(),e(105,` 2249 `),n(106,"div",14)(107,"a",15),e(108,"Register for this program"),t()(),e(109,` 2250 `),t(),e(110,` 2251 `),t(),e(111,` 2252 `),n(112,"div",11),e(113,` 2253 `),n(114,"div",12),e(115,` 2254 `),n(116,"div",13),e(117,"anchor with an image"),t(),e(118,` 2255 `),n(119,"div",14)(120,"a",15),c(121,"img",16),e(122," hover me \u2014 the base rule skips this anchor, the hover rule does not"),t()(),e(123,` 2256 `),t(),e(124,` 2257 `),t(),e(125,` 2258 `),n(126,"p",17),e(127,` 2259 The source already carries the author's own note: `),n(128,"em"),e(129,`"this is too global \u2014 bumping into 2260 issues with this with primeng. we should refactor this as a BEM modifier and not a global 2261 definition."`),t(),e(130,` 2262 `),t(),e(131,` 2263`),t(),e(132,` 2264 2265`),n(133,"div",2),e(134,` 2266 `),n(135,"h3"),e(136,"3. Blue text classes"),t(),e(137,` 2267 `),n(138,"app-sg-caption",3),e(139,"1_base/modifiers.scss \u2014 #region Text Colors"),t(),e(140,` 2268 `),n(141,"p",0),e(142,` 2269 Four classes, four different blues, spanning `),n(143,"code"),e(144,"--blue-700"),t(),e(145,` to 2270 `),n(146,"code"),e(147,"--blue-1000"),t(),e(148,`. Samples carry the live class. 2271 `),t(),e(149,` 2272 `),n(150,"table",4),e(151,` 2273 `),n(152,"thead"),e(153,` 2274 `),n(154,"tr"),e(155,` 2275 `),c(156,"th",5),e(157,` 2276 `),n(158,"th",18),e(159,"Class"),t(),e(160,` 2277 `),n(161,"th"),e(162,"Sample"),t(),e(163,` 2278 `),n(164,"th",19),e(165,"Token"),t(),e(166,` 2279 `),n(167,"th",8),e(168,"Uses"),t(),e(169,` 2280 `),n(170,"th",7),e(171,"On white"),t(),e(172,` 2281 `),n(173,"th"),e(174,"Role"),t(),e(175,` 2282 `),t(),e(176,` 2283 `),t(),e(177,` 2284 `),n(178,"tbody"),e(179,` 2285 `),S(180,um,28,9,null,null,dm),t(),e(182,` 2286 `),t(),e(183,` 2287 `),n(184,"p",17),e(185,` 2288 `),n(186,"code"),e(187,".text-primary-link"),t(),e(188," duplicates the bare "),n(189,"code"),e(190,"<a>"),t(),e(191,` color, but 141 of 2289 its 147 usages are on `),n(192,"em"),e(193,"non-anchors"),t(),e(194,` \u2014 it is the "style this button/span as a link" 2290 class. That is a real need, and it already has a project: 2291 `),n(195,"strong"),e(196,"Btn-Anchor Style"),t(),e(197," proposes a shared "),n(198,"code"),e(199,"btn-anchor"),t(),e(200,` to replace the 2292 `),n(201,"code"),e(202,"btn-a11y text-primary-link text-medium"),t(),e(203,` combo. 2293 `),t(),e(204,` 2294`),t(),e(205,` 2295 2296`),n(206,"div",2),e(207,` 2297 `),n(208,"h3"),e(209,"4. Aliases \u2014 how many names does one blue get?"),t(),e(210,` 2298 `),n(211,"p",0),e(212,` 2299 `),n(213,"code"),e(214,"--blue-1000"),t(),e(215,` is reachable as three different token names plus a class. 2300 `),n(216,"code"),e(217,"--blue-900"),t(),e(218," as three. Renaming is not the problem; "),n(219,"em"),e(220,`not knowing which name is 2301 canonical`),t(),e(221,` is. 2302 `),t(),e(222,` 2303 `),n(223,"table",4),e(224,` 2304 `),n(225,"thead"),e(226,` 2305 `),n(227,"tr"),e(228,` 2306 `),c(229,"th",5),e(230,` 2307 `),n(231,"th",20),e(232,"Token"),t(),e(233,` 2308 `),n(234,"th",6),e(235,"Resolves to"),t(),e(236,` 2309 `),n(237,"th",7),e(238,"Hex"),t(),e(239,` 2310 `),n(240,"th",8),e(241,"Uses"),t(),e(242,` 2311 `),n(243,"th"),e(244,"Note"),t(),e(245,` 2312 `),t(),e(246,` 2313 `),t(),e(247,` 2314 `),n(248,"tbody"),e(249,` 2315 `),S(250,fm,28,8,null,null,Ui),t(),e(252,` 2316 `),t(),e(253,` 2317 2318 `),n(254,"h4",21)(255,"code"),e(256,"--002d73"),t(),e(257," \u2014 the name is a lie"),t(),e(258,` 2319 `),n(259,"p",0),e(260,` 2320 Declared under `),n(261,"em"),e(262,"Orphan Colors"),t(),e(263," as "),n(264,"code"),e(265,"--002d73: var(--blue-900); //#002d73"),t(),e(266,`. 2321 A token named after a hex literal is already a convention break; this one no longer even 2322 holds that hex. 20 stylesheets read it \u2014 the left nav, the calendar, program overview, 2323 page-builder content \u2014 all believing they are asking for `),n(267,"code"),e(268,"#002d73"),t(),e(269,`. 2324 `),t(),e(270,` 2325 `),n(271,"div",22),e(272,` 2326 `),c(273,"span",23),e(274,` 2327 `),n(275,"span",24)(276,"code"),e(277,"#002d73"),t(),e(278," \u2014 the name"),t(),e(279,` 2328 `),c(280,"span",25),e(281,` 2329 `),n(282,"span",24)(283,"code"),e(284,"#054584"),t(),e(285," \u2014 what it actually resolves to ("),n(286,"code"),e(287,"--blue-900"),t(),e(288,")"),t(),e(289,` 2330 `),t(),e(290,` 2331`),t(),e(291,` 2332 2333`),n(292,"div",2),e(293,` 2334 `),n(294,"h3"),e(295,"5. PrimeNG's primary is our blue ramp"),t(),e(296,` 2335 `),n(297,"app-sg-caption",3),e(298,"ng-theme.scss \xA71 (Base)"),t(),e(299,` 2336 `),n(300,"p",0),e(301,` 2337 The stock Aura preset's `),n(302,"code"),e(303,"primary"),t(),e(304,` palette is emerald, so 2338 `),n(305,"code"),e(306,"ng-theme.scss"),t(),e(307," repoints "),n(308,"code"),e(309,"--p-primary-50"),t(),e(310,"\u2026"),n(311,"code"),e(312,"950"),t(),e(313,` at our 2339 blues. Everything Aura derives from `),n(314,"code"),e(315),t(),e(316,` follows \u2014 2340 the global focus ring, form-field focus borders, highlight backgrounds, badges, tabs. 2341 Per-component `),n(317,"code"),e(318,"--p-*"),t(),e(319,` overrides are only for where we deliberately differ from 2342 Aura, so `),n(320,"strong"),e(321,"change the ramp, not a component token."),t(),e(322,` 2343 `),t(),e(323,` 2344 `),n(324,"table",4),e(325,` 2345 `),n(326,"thead"),e(327,` 2346 `),n(328,"tr"),e(329,` 2347 `),c(330,"th",5),e(331,` 2348 `),n(332,"th",18),e(333,"Aura token"),t(),e(334,` 2349 `),n(335,"th",26),e(336,"Ours"),t(),e(337,` 2350 `),n(338,"th",7),e(339,"Hex"),t(),e(340,` 2351 `),n(341,"th"),e(342,"Drives"),t(),e(343,` 2352 `),t(),e(344,`
2353 `),t(),e(345,` 2354 `),n(346,"tbody"),e(347,` 2355 `),S(348,bm,22,6,null,null,Ui),t(),e(350,` 2356 `),t(),e(351,` 2357 `),n(352,"p",17),e(353,` 2358 `),n(354,"code"),e(355,"500"),t(),e(356," and "),n(357,"code"),e(358,"600"),t(),e(359," are pinned to "),n(360,"code"),e(361,"--primary-link"),t(),e(362,` and 2359 `),n(363,"code"),e(364,"--primary-link-hover"),t(),e(365," so Aura's "),n(366,"code"),e(367,"primary.color"),t(),e(368,` / 2360 `),n(369,"code"),e(370,"hoverColor"),t(),e(371,` land on the two blues the rest of the app uses. 2361 `),t(),e(372,` 2362`),t(),e(373,` 2363 2364`),n(374,"div",2),e(375,` 2365 `),n(376,"h3"),e(377),t(),e(378,` 2366 `),n(379,"p",0),e(380,` 2367 Blues in component stylesheets that come from `),n(381,"em"),e(382,"other design systems"),t(),e(383,` \u2014 Bootstrap, 2368 Tailwind, Material \u2014 none of which is our ramp. Two of them fail 4.5:1 on white. 2369 `),t(),e(384,` 2370 `),n(385,"table",4),e(386,` 2371 `),n(387,"thead"),e(388,` 2372 `),n(389,"tr"),e(390,` 2373 `),c(391,"th",5),e(392,` 2374 `),n(393,"th",9),e(394,"Hex"),t(),e(395,` 2375 `),n(396,"th",20),e(397,"Where it's from"),t(),e(398,` 2376 `),n(399,"th",7),e(400,"Decls"),t(),e(401,` 2377 `),n(402,"th",8),e(403,"Files"),t(),e(404,` 2378 `),n(405,"th",27),e(406,"On white"),t(),e(407,` 2379 `),c(408,"th",5),e(409,` 2380 `),n(410,"th"),e(411,"Nearest step on our ramp"),t(),e(412,` 2381 `),t(),e(413,`
2382 `),t(),e(414,` 2383 `),n(415,"tbody"),e(416,` 2384 `),S(417,Em,31,11,null,null,mm),t(),e(419,` 2385 `),t(),e(420,` 2386 `),n(421,"p",17),e(422,` 2387 The Tailwind indigos cluster in the messaging components; Bootstrap's `),n(423,"code"),e(424,"#007bff"),t(),e(425,` is 2388 the most widespread at 12 files. All of it predates the ramp or was pasted in from a 2389 generated snippet. 2390 `),t(),e(426,` 2391`),t(),e(427,` 2392 2393`),n(428,"div",2),e(429,` 2394 `),n(430,"h3"),e(431,"7. Findings"),t(),e(432,` 2395 `),n(433,"ol",28),e(434,` 2396 `),n(435,"li"),e(436,` 2397 `),n(437,"strong")(438,"code"),e(439,"--002d73"),t(),e(440," is named after a hex it does not hold"),t(),e(441,` \u2014 \xA74. Named 2398 `),n(442,"code"),e(443,"#002d73"),t(),e(444,", resolves to "),n(445,"code"),e(446,"#054584"),t(),e(447,`, read by 20 stylesheets. 2399 `),t(),e(448,` 2400 `),n(449,"li"),e(450,` 2401 `),n(451,"strong"),e(452,"The anchor base rule and hover rule disagree"),t(),e(453,` \u2014 \xA72. The 2402 `),n(454,"code"),e(455,":not(:has(img))"),t(),e(456,` guard is on one and not the other, so image links are 2403 not links until you hover them. 2404 `),t(),e(457,` 2405 `),n(458,"li"),e(459,` 2406 `),n(460,"strong"),e(461),t(),e(462,` \u2014 \xA76. Bootstrap, 2407 Tailwind indigo, and Material blue all ship in the app; `),n(463,"code"),e(464,"#007bff"),t(),e(465,` (3.98:1) and 2408 `),n(466,"code"),e(467,"#2196f3"),t(),e(468,` (3.12:1) fail AA as text. 2409 `),t(),e(469,` 2410 `),n(470,"li"),e(471,` 2411 `),n(472,"strong"),e(473,"One color, many names."),t(),e(474," "),n(475,"code"),e(476,"--blue-1000"),t(),e(477,` answers to 2412 `),n(478,"code"),e(479,"--base-text-alt"),t(),e(480,", "),n(481,"code"),e(482,"--base-header"),t(),e(483,", "),n(484,"code"),e(485,".text-navy"),t(),e(486,` and 2413 `),n(487,"code"),e(488,"header-emphasis"),t(),e(489,"; "),n(490,"code"),e(491,"--blue-900"),t(),e(492," to "),n(493,"code"),e(494,".text-blue"),t(),e(495,`, 2414 `),n(496,"code"),e(497,"--base-text-alt-lt"),t(),e(498," and "),n(499,"code"),e(500,"--002d73"),t(),e(501,`. Nothing marks which is 2415 canonical. 2416 `),t(),e(502,` 2417 `),n(503,"li"),e(504,` 2418 `),n(505,"strong")(506,"code"),e(507,"--border-blue"),t(),e(508," is a straight duplicate of "),n(509,"code"),e(510,"--primary-link"),t()(),e(511,` 2419 \u2014 same value, different name, 10 consumers. 2420 `),t(),e(512,` 2421 `),n(513,"li"),e(514,` 2422 `),n(515,"strong"),e(516,"Link color and info color are four ramp steps apart"),t(),e(517,` \u2014 2423 `),n(518,"code"),e(519,".text-primary-link"),t(),e(520," is "),n(521,"code"),e(522,"--blue-700"),t(),e(523,", "),n(524,"code"),e(525,".text-blue"),t(),e(526,` is 2424 `),n(527,"code"),e(528,"--blue-900"),t(),e(529,`. Defensible (they mean different things) but undocumented, which 2425 is how `),n(530,"code"),e(531,".text-blue"),t(),e(532,` ends up used as a link color by mistake. 2426 `),t(),e(533,` 2427 `),n(534,"li"),e(535,` 2428 `),n(536,"strong"),e(537,"Six ramp steps (25\u2013400) serve 65 uses"),t(),e(538,` and none is safe for text. Worth 2429 asking whether the light end needs six steps or two. 2430 `),t(),e(539,` 2431 `),t(),e(540,` 2432`),t(),e(541,` 2433`)),s&2&&(i(12),p(o.snapshotDate),i(2),m("routerLink","/admin/styleguide/components/system-alerts"),i(57),E(o.ramp),i(109),E(o.blueText),i(70),E(o.aliases),i(65),q("","{","primary.*","}"),i(33),E(o.primeRamp),i(29),f("6. Foreign blue palettes (",o.foreignDecls," declarations)"),i(40),E(o.foreign),i(44),f("",o.foreignDecls," declarations use a foreign blue"))},dependencies:[$,J,X],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();
2433var ol=[{file:"app/shared/modules/page-builder-content/_styles/carousels.scss",label:"Page-builder carousels",component:"carousel",consumers:"video feed \xB7 scoreboard \xB7 image carousel \xB7 testimonials",targets:["p-carousel-indicators","p-carousel-next","p-carousel-prev","p-carousel-prev-icon","p-reset"],live:["p-carousel","p-carousel-content","p-carousel-indicator","p-highlight"]},{file:"app/shared/modules/page-builder-content/faq-content/faq-content.component.scss",label:"Public FAQ accordion",component:"accordion",consumers:"faq-content",targets:["p-accordion-header-link","p-accordion-toggle-icon"],live:["p-accordion","p-accordion-content","p-accordion-header","p-disabled","p-highlight"]},{file:"assets/css/sass/3_modules/components/calendar.scss",label:"Club calendar accordion",component:"accordion",consumers:"club-calendar",targets:["p-accordion-header-link"],live:["p-accordion","p-accordion-content","p-accordion-header","p-disabled","p-highlight"]},{file:"app/account/manage/requests/requests.component.scss",label:"Account \u2192 requests tabs",component:"tabs",consumers:"account/manage/requests",targets:["p-accordion-header-link","p-tabview","p-tabview-panels"],live:["p-accordion","p-accordion-content","p-accordion-header"]},{file:"app/admin/dashboard/staff-credentialing/staff-credentialing-panel.component.scss",label:"Staff credentialing select",component:"select",consumers:"admin dashboard panel",targets:["p-dropdown-item","p-dropdown-panel"],live:["p-dropdown-label"]},{file:"app/admin/shared/user/roles/roles.component.scss",label:"User roles filter select",component:"select",consumers:"admin/shared/user/roles",targets:["p-dropdown-filter","p-dropdown-filter-container","p-dropdown-header"],live:[]}];var ym=["probeMount"],wm=()=>["0"],Cm=()=>({"min-width":"14rem"}),_m=(a,r)=>r.file,km=(a,r)=>r.className;function Tm(a,r){if(a&1&&(e(0,` 2434 `),n(1,"span",7),e(2),t(),e(3,` 2435 `)),a&2){let l=u();i(2),f("measured live at ",l.probedAt)}}function Im(a,r){if(a&1&&(e(0,` 2436 `),n(1,"div",23),e(2),t(),e(3,` 2437 `)),a&2){let l=r.$implicit;i(2),p(l.title)}}function Mm(a,r){if(a&1&&(e(0,` 2438 `),c(1,"app-pill",28),e(2,` 2439 `)),a&2){let l=u().$implicit;i(),m("text",l.liveRendered+" still matching")}}function Dm(a,r){if(a&1&&(e(0,` 2440 `),n(1,"tr"),e(2,` 2441 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 2442 `),n(7,"td"),e(8,` 2443 `),c(9,"app-pill",5),e(10,` 2444 `),t(),e(11,` 2445 `),t(),e(12,` 2446 `)),a&2){let l=r.$implicit,d=u(2);i(5),f(".",l.className),i(4),m("status",d.statusFor(l))("text",l.rendered?"matches":"no such element")}}function Fm(a,r){if(a&1&&(e(0,` 2447 `),n(1,"code",30),e(2),t(),e(3,` 2448 `)),a&2){let l=r.$implicit;i(2),f(".",l)}}function Pm(a,r){if(a&1&&(e(0,` 2449 `),n(1,"div",26),e(2,` 2450 `),n(3,"strong"),e(4,"Named in the PrimeNG package but not rendered by this mount:"),t(),e(5,` 2451 `),S(6,Fm,4,1,null,null,K),n(8,"span",29),e(9,` 2452 Not automatically a defect \u2014 a panel that only exists while open cannot 2453 appear in a static mount. But a name that survives only as a 2454 `),n(10,"code"),e(11,"data-"),t(),e(12,` attribute or a back-compat rule lands here too, and the 2455 census counts those as live. Open the component and re-probe before judging. 2456 `),t(),e(13,` 2457 `),t(),e(14,` 2458 `)),a&2){let l=u().$implicit;i(6),E(l.liveNotSeen)}}function Am(a,r){if(a&1&&(e(0,` 2459 `),n(1,"code",30),e(2),t(),e(3,` 2460 `)),a&2){let l=r.$implicit;i(2),f(".",l)}}function Om(a,r){if(a&1&&(e(0,` 2461 `),n(1,"div",7),e(2,` 2462 `),n(3,"strong"),e(4,"What "),n(5,"code"),e(6),t(),e(7,` renders instead, and no 2463 rule in this file claims:`),t(),e(8,` 2464 `),S(9,Am,4,1,null,null,K),t(),e(11,` 2465 `)),a&2){let l=u().$implicit;
2465i(6),f("<p-",l.component,">"),i(3),E(l.unclaimed)}}function Nm(a,r){if(a&1&&(e(0,` 2466 `),n(1,"div",24),e(2,` 2467 `),n(3,"div",25),e(4,` 2468 `),n(5,"strong"),e(6),t(),e(7,` 2469 `),c(8,"app-pill",5),e(9,` 2470 `),v(10,Mm,3,1),t(),e(11,` 2471 `),n(12,"div",26),e(13,` 2472 `),n(14,"code"),e(15),t(),e(16),t(),e(17,` 2473 2474 `),n(18,"table",27),e(19,` 2475 `),n(20,"thead"),e(21,` 2476 `),n(22,"tr"),e(23,` 2477 `),n(24,"th"),e(25,"Class the stylesheet targets"),t(),e(26,` 2478 `),n(27,"th"),e(28,"Present in the rendered DOM?"),t(),e(29,` 2479 `),t(),e(30,` 2480 `),t(),e(31,` 2481 `),n(32,"tbody"),e(33,` 2482 `),S(34,Dm,13,3,null,null,km),t(),e(36,` 2483 `),t(),e(37,` 2484 2485 `),v(38,Pm,15,0),v(39,Om,12,1),t(),e(40,` 2486 `)),a&2){let l=r.$implicit;i(6),p(l.label),i(2),m("status",l.inert?"error":"success")("text",l.inert+" inert"),i(2),y(l.liveRendered?10:-1),i(5),p(l.file),i(),f(" \u2014 renders on ",l.consumers,` 2487 `),i(18),E(l.targets_),i(4),y(l.liveNotSeen.length?38:-1),i(),y(l.unclaimed.length?39:-1)}}var dl=(()=>{let r=class r{constructor(d,s){this.changeDetector=d,this.siteDataService=s,this.upgradeCommit="27d40a2cc5",this.upgradeDate="2026-05-19",this.surfaces=[],this.carouselItems=[{title:"Slide one"},{title:"Slide two"},{title:"Slide three"},{title:"Slide four"},{title:"Slide five"}],this.selectOptions=[{label:"Head coach",value:1},{label:"Assistant coach",value:2},{label:"Team manager",value:3},{label:"Volunteer",value:4}]}ngOnInit(){this.siteDataService.hideSiteLoader()}ngAfterViewInit(){this.probe()}probe(){let d=this.renderedVocabulary();this.surfaces=ol.map(s=>{let o=d.get(s.component)||new Set,x=s.targets.map(_=>({className:_,rendered:o.has(_)})),h=new Set([...s.targets,...s.live]);return ta(bt({},s),{targets_:x,inert:x.filter(_=>!_.rendered).length,liveRendered:s.live.filter(_=>o.has(_)).length,liveNotSeen:s.live.filter(_=>!o.has(_)).sort(),unclaimed:[...o].filter(_=>!h.has(_)).sort()})}),this.probedAt=new Date().toLocaleTimeString(),this.changeDetector.detectChanges()}renderedVocabulary(){let d=new Map;for(let o of this.mounts?.toArray()||[]){let x=o.nativeElement.dataset.probe,h=d.get(x)||new Set;this.collect(o.nativeElement,h),d.set(x,h)}let s=new Set;for(let o of Array.from(document.querySelectorAll('body > .p-overlay, body > [class*="-overlay"]')))this.collect(o,s);if(s.size)for(let o of d.keys())s.forEach(x=>d.get(o).add(x));return d}collect(d,s){for(let o of[d,...Array.from(d.querySelectorAll("*"))])o.classList.forEach(x=>{x.startsWith("p-")&&s.add(x)})}statusFor(d){return d.rendered?"success":"error"}get totalInert(){return this.surfaces.reduce((d,s)=>d+s.inert,0)}get totalTargets(){return this.surfaces.reduce((d,s)=>d+s.targets_.length,0)}};r.\u0275fac=function(s){return new(s||r)(A(Ke),A(R))}
vendor: 6,535 bytes, lines 2487-2594
2487,r.\u0275cmp=b({type:r,selectors:[["app-primeng-upgrade-debt"]],viewQuery:function(s,o){if(s&1&&$e(ym,5,Ce),s&2){let x;xe(x=he())&&(o.mounts=x)}},standalone:!1,decls:208,vars:18,consts:[["probeMount",""],["item",""],[1,"form-note"],["href","https://dev.azure.com","target","_blank","rel","noopener"],[1,"d-flex","align-items-center","gap-3","mb-3"],["variant","tag",3,"status","text"],["type","button",1,"btn","btn-sm",3,"click"],[1,"text-smallest","text-grey"],[1,"mt-4"],[1,"row"],[1,"col-md-6","mb-3"],[1,"sg-specimen"],[1,"sg-specimen-head"],["data-probe","carousel",1,"sg-specimen-body"],[3,"value","numVisible","numScroll","circular"],["data-probe","accordion",1,"sg-specimen-body"],[3,"multiple","value"],["value","0"],[1,"mb-0"],["value","1"],["data-probe","tabs",1,"sg-specimen-body"],["data-probe","select",1,"sg-specimen-body"],["optionLabel","label","optionValue","value","placeholder","Select a role",3,"ngModelChange","options","ngModel","filter"],[1,"card","p-3","m-2","text-center"],[1,"card","p-3","mb-3"],[1,"d-flex","flex-wrap","align-items-center","gap-3","mb-1"],[1,"text-smallest","text-grey","mb-2"],[1,"table","sg-doc-table","mb-2"],["variant","tag","status","success",3,"text"],[1,"d-block"],[1,"mr-1"]],template:function(s,o){if(s&1){let x=B();n(0,"div"),e(1,` 2488 `),n(2,"h2"),e(3,"PrimeNG v21 upgrade debt"),t(),e(4,` 2489 2490 `),n(5,"p"),e(6,` 2491 Six stylesheets carry rules written against PrimeNG's `),n(7,"strong"),e(8,"pre-v21"),t(),e(9,` class names. 2492 PrimeNG 21 landed in `),n(10,"code"),e(11),t(),e(12," on "),n(13,"strong"),e(14),t(),e(15,` and 2493 renamed them, so those rules stopped matching anything. Nothing errored, nothing failed to 2494 build, and the styling they were written to apply has simply been absent from production ever 2495 since. 2496 `),t(),e(16,` 2497 2498 `),n(17,"p",2),e(18,` 2499 `),n(19,"strong"),e(20,"Why this page exists."),t(),e(21,` These surfaces are already rendering un-overridden 2500 PrimeNG. If the 2501 `),n(22,"a",3),e(23,"override-removal evaluation"),t(),e(24,` 2502 runs against the app without this being known, the breakage below reads as 2503 `),n(25,"em"),e(26,"\u201Cthis is what removing our overrides did\u201D"),t(),e(27,` \u2014 when in fact these six 2504 were never overridden at the time of the test. 2505 `),t(),e(28,` 2506 2507 `),n(29,"div",4),e(30,` 2508 `),c(31,"app-pill",5),e(32,` 2509 `),n(33,"button",6),g("click",function(){return o.probe()}),e(34,"re-probe"),t(),e(35,` 2510 `),v(36,Tm,4,1),t(),e(37,` 2511 2512 `),n(38,"p",7),e(39,` 2513 Every verdict is read off the rendered DOM at runtime and compared against 2514 `),n(40,"code"),e(41,"upgrade-debt.manifest.ts"),t(),e(42,`, which 2515 `),n(43,"code"),e(44,"scripts/primeng-override-census.mjs --manifest"),t(),e(45,` generates from the stylesheets 2516 themselves. Nothing on this page is typed in, so a future rename surfaces here on its own. 2517 `),t(),e(46,` 2518 2519 `),e(47,` 2520 `),n(48,"h3",8),e(49,"The mounted components"),t(),e(50,` 2521 `),n(51,"p",7),e(52,` 2522 These are stock. No override on this page touches them, which is exactly what the six 2523 surfaces below are getting in production today. 2524 `),t(),e(53,` 2525 2526 `),n(54,"div",9),e(55,` 2527 `),n(56,"div",10),e(57,` 2528 `),n(58,"div",11),e(59,` 2529 `),n(60,"div",12)(61,"code"),e(62,"<p-carousel>"),t()(),e(63,` 2530 `),n(64,"div",13,0),e(66,` 2531 `),n(67,"p-carousel",14),e(68,` 2532 `),k(69,Im,4,1,"ng-template",null,1,fe),e(71,` 2533 `),t(),e(72,` 2534 `),t(),e(73,` 2535 `),t(),e(74,` 2536 `),t(),e(75,` 2537 2538 `),n(76,"div",10),e(77,` 2539 `),n(78,"div",11),e(79,` 2540 `),n(80,"div",12)(81,"code"),e(82,"<p-accordion>"),t()(),e(83,` 2541 `),n(84,"div",15,0),e(86,` 2542 `),n(87,"p-accordion",16),e(88,` 2543 `),n(89,"p-accordion-panel",17),e(90,` 2544 `),n(91,"p-accordion-header"),e(92,"First panel"),t(),e(93,` 2545 `),n(94,"p-accordion-content"),e(95,` 2546 `),n(96,"p",18),e(97,"Expanded so the content anatomy renders and can be probed."),t(),e(98,` 2547 `),t(),e(99,` 2548 `),t(),e(100,` 2549 `),n(101,"p-accordion-panel",19),e(102,` 2550 `),n(103,"p-accordion-header"),e(104,"Second panel"),t(),e(105,` 2551 `),n(106,"p-accordion-content")(107,"p",18),e(108,"Collapsed."),t()(),e(109,` 2552 `),t(),e(110,` 2553 `),t(),e(111,` 2554 `),t(),e(112,` 2555 `),t(),e(113,` 2556 `),t(),e(114,` 2557 2558 `),n(115,"div",10),e(116,` 2559 `),n(117,"div",11),e(118,` 2560 `),n(119,"div",12)(120,"code"),e(121,"<p-tabs>"),t()(),e(122,` 2561 `),n(123,"div",20,0),e(125,` 2562 `),n(126,"p-tabs",17),e(127,` 2563 `),n(128,"p-tablist"),e(129,` 2564 `),n(130,"p-tab",17),e(131,"Requests"),t(),e(132,` 2565 `),n(133,"p-tab",19),e(134,"History"),t(),e(135,` 2566 `),t(),e(136,` 2567 `),n(137,"p-tabpanels"),e(138,` 2568 `),n(139,"p-tabpanel",17)(140,"p",18),e(141,"Panel body."),t()(),e(142,` 2569 `),n(143,"p-tabpanel",19)(144,"p",18),e(145,"Second body."),t()(),e(146,` 2570 `),t(),e(147,` 2571 `),t(),e(148,` 2572 `),t(),e(149,` 2573 `),t(),e(150,` 2574 `),t(),e(151,` 2575 2576 `),n(152,"div",10),e(153,` 2577 `),n(154,"div",11),e(155,` 2578 `),n(156,"div",12),e(157,` 2579 `),n(158,"code"),e(159,"<p-select>"),t(),e(160,` 2580 `),n(161,"span",7),e(162,` 2581 \u2014 open it, then re-probe: the panel renders into 2582 `),n(163,"code"),e(164,"<body>"),t(),e(165,`, not into this box 2583 `),t(),e(166,` 2584 `),t(),e(167,` 2585 `),n(168,"div",21,0),e(170,` 2586 `),n(171,"p-select",22),M("ngModelChange",function(_){return w(x),I(o.selectValue,_)||(o.selectValue=_),C(_)}),t(),e(172,` 2587 `),t(),e(173,` 2588 `),t(),e(174,` 2589 `),t(),e(175,` 2590 `),t(),e(176,` 2591 2592 `),e(177,` 2593 `),n(178,"h3",8),e(179,"What each stylesheet targets"),t(),e(180,` 2594
2595 `),S(181,Nm,41,8,null,null,_m),n(183,"h3",8),e(184,"Reading this"),t(),e(185,` 2596 `),n(186,"ul"),e(187,` 2597 `),n(188,"li"),e(189,` 2598 `),n(190,"strong"),e(191,"\u201CNo such element\u201D is not the same as unused CSS."),t(),e(192,` The 2599 component is still on the page and still in use \u2014 only the rule missed it. Weight 2600 would be harmless; this is absent styling. 2601 `),t(),e(193,` 2602 `),n(194,"li"),e(195,` 2603 `),n(196,"strong"),e(197,"The carousel row is the one to look at first."),t(),e(198,` Every arrow rule in that 2604 file is inert, across four public page-builder blocks, and the rules are positioning 2605 rather than colour \u2014 so stock is not merely a different look there. 2606 `),t(),e(199,` 2607 `),n(200,"li"),e(201,` 2608 `),n(202,"strong"),e(203,"This page finds one kind of upgrade debt only."),t(),e(204,` A rule whose classes still 2609 match but whose target element moved or changed nesting looks healthy here. Finding that 2610 kind needs rendering and comparing, not name matching. 2611 `),t(),e(205,` 2612 `),t(),e(206,` 2613`),t(),e(207,` 2614`)}s&2&&(i(11),p(o.upgradeCommit),i(3),p(o.upgradeDate),i(17),m("status",o.totalInert?"error":"success")("text",o.totalInert+" of "+o.totalTargets+" targeted classes are inert"),i(5),y(o.probedAt?36:-1),i(31),m("value",o.carouselItems)("numVisible",2)("numScroll",1)("circular",!0),i(20),m("multiple",!0)("value",V(16,wm)),i(84),te(V(17,Cm)),m("options",o.selectOptions),T("ngModel",o.selectValue),m("filter",!0),i(10),E(o.surfaces))},dependencies:[U,H,J,ye,Pn,ct,Rn,Wn,pt,xt,mt,dt,kn,Tn],encapsulation:2});let a=r;return a})();var ml=(()=>{let r=class r{constructor(d){this.siteDataService=d}ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-typography"]],standalone:!1,decls:128,vars:0,consts:[[1,""],[1,"no-bullets","style-example"],[1,"no-bullets"],[1,"inline-list"]],template:function(s,o){s&1&&(n(0,"div",0),e(1,` 2615 2616 `),n(2,"h2"),e(3,"Headlines, Paragraphs & Lists"),t(),e(4,` 2617 2618 `),n(5,"h3"),e(6,"Headlines"),t(),e(7,` 2619 `),n(8,"ul",1),e(9,` 2620 `),n(10,"li")(11,"h1"),e(12,"h1 The quick brown fox jumps."),t()(),e(13,` 2621 `),n(14,"li")(15,"h2"),e(16,"h2 The quick brown fox jumps."),t()(),e(17,` 2622 `),n(18,"li")(19,"h3"),e(20,"h3 The quick brown fox jumps over the lazy dog."),t()(),e(21,` 2623 `),n(22,"li")(23,"h4"),e(24,"h4 The quick brown fox jumps over the lazy dog."),t()(),e(25,` 2624 `),n(26,"li")(27,"h5"),e(28,"h5 The quick brown fox jumps over the lazy dog."),t()(),e(29,` 2625 `),t(),e(30,` 2626 2627`),c(31,"br"),e(32,` 2628 `),n(33,"h3"),e(34,"Paragraph"),t(),e(35,` 2629 `),n(36,"p"),e(37,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Explicabo porro iure, tempora, quae repellendus aliquam fugiat sit dolore. Maiores, officiis. Omnis sed autem voluptatum! Delectus harum neque voluptatum, numquam laboriosam a. Consequuntur illum debitis dolore quod, reprehenderit fugiat neque! Quos quidem laborum, molestiae assumenda error dolores maxime aperiam pariatur, quasi praesentium neque illum ducimus, quae, laudantium aliquid alias. Iste facilis cupiditate, tempora nostrum fugiat esse eum unde obcaecati, est exercitationem velit, omnis assumenda! Cum nemo dolore nam magni necessitatibus rem tempora qui fugit excepturi placeat quibusdam itaque tenetur quia cupiditate, ea in delectus, aliquid error tempore quisquam provident id asperiores."),t(),e(38,` 2630`),c(39,"br"),e(40,` 2631 `),n(41,"h3"),e(42,"Lists"),t(),e(43,` 2632 2633 `),n(44,"h5"),e(45,"Bulleted List"),t(),e(46,` 2634 `),n(47,"ul"),e(48,` 2635 `),n(49,"li"),e(50,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(51,` 2636 `),n(52,"li"),e(53,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(54,` 2637 `),n(55,"li"),e(56,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae"),t(),e(57,` 2638 `),n(58,"li"),e(59,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(60,` 2639 `),n(61,"li"),e(62,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(63,` 2640 `),t(),e(64,` 2641 2642 `),n(65,"h5"),e(66,"Ordered List"),t(),e(67,` 2643 `),n(68,"ol"),e(69,` 2644 `),n(70,"li"),e(71,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(72,` 2645 `),n(73,"li"),e(74,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(75,` 2646 `),n(76,"li"),e(77,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae"),t(),e(78,` 2647 `),n(79,"li"),e(80,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(81,` 2648 `),n(82,"li"),e(83,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(84,` 2649 `),t(),e(85,` 2650 2651 `),n(86,"h5"),e(87,'Remove Bullets, padding & margins (ul class "no-bullets")'),t(),e(88,` 2652 `),n(89,"ul",2),e(90,` 2653 `),n(91,"li"),e(92,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(93,` 2654 `),n(94,"li"),e(95,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(96,` 2655 `),n(97,"li"),e(98,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae"),t(),e(99,` 2656 `),n(100,"li"),e(101,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(102,` 2657 `),n(103,"li"),e(104,"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis, quae."),t(),e(105,` 2658 `),t(),e(106,` 2659 2660 `),n(107,"h5"),e(108,'Inline List (ul class "inline-list")'),t(),e(109,` 2661 `),n(110,"ul",3),e(111,` 2662 `),n(112,"li"),e(113,"Lorem ipsum dolor sit amet."),t(),e(114,` 2663 `),n(115,"li"),e(116,"Lorem ipsum dolor sit amet."),t(),e(117,` 2664 `),n(118,"li"),e(119,"Lorem ipsum dolor sit amet."),t(),e(120,` 2665 `),n(121,"li"),e(122,"Lorem ipsum dolor sit amet."),t(),e(123,` 2666 `),n(124,"li"),e(125,"Lorem ipsum dolor sit amet."),t(),e(126,` 2667 `),t(),e(127,` 2668 `),t())},encapsulation:2});let a=r;return a})();var cl=(()=>
2668{let r=class r{constructor(d){this.siteDataService=d}ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-buttons"]],standalone:!1,decls:203,vars:0,consts:[[1,""],["href","#"],["href","#",1,"hoverlink"],[1,"row"],[1,"col-md-4"],[1,"sub-head"],["href","#",1,"btn"],[1,"btn"],["type","button","value","Click me, I'm an Input",1,"btn"],["href","#",1,"btn","btn-lg"],["href","#",1,"btn","btn-sm"],["href","#",1,"btn","btn-primary","btn-lg"],["href","#",1,"btn","btn-primary"],["href","#",1,"btn","btn-primary","btn-sm"],["href","#",1,"btn","btn-secondary","btn-lg"],["href","#",1,"btn","btn-secondary"],["href","#",1,"btn","btn-secondary","btn-sm"],["href","#",1,"btn","btn-disabled"],["href","#",1,"btn","btn-primary","btn-disabled"],["href","#",1,"btn","btn-primary","btn-lg","btn-disabled"],["href","#",1,"btn","btn-naked"],["type","button","value","Cancel",1,"btn","btn-primary","btn-naked"],[1,"btn","btn-primary","btn-lg","btn-naked"]],template:function(s,o){s&1&&(n(0,"div",0),e(1,` 2669 `),n(2,"h2"),e(3,"Links & Buttons"),t(),e(4,` 2670 `),n(5,"div",0),e(6,` 2671 `),n(7,"h3"),e(8,"Links"),t(),e(9,` 2672 `),n(10,"p")(11,"a",1),e(12,"This is a normal anchor link."),t()(),e(13,` 2673 `),n(14,"p")(15,"a",2),e(16,"This is an anchor link with a hoverlink/doclink/infolink class."),t()(),e(17,` 2674 `),c(18,"br")(19,"br"),e(20,` 2675 `),n(21,"h3"),e(22,"Buttons"),t(),e(23,` 2676 `),n(24,"div",3),e(25,` 2677 `),n(26,"div",4),e(27,` 2678 `),n(28,"h5",5),e(29,"Anchors styles as buttons"),t(),e(30,` 2679 `),n(31,"a",6),e(32,"Click Me, I'm an Anchor"),t(),e(33,` 2680 `),t(),e(34,` 2681 `),n(35,"div",4),e(36,` 2682 `),n(37,"h5",5),e(38,"Button Elements"),t(),e(39,` 2683 `),n(40,"button",7),e(41,"Click Me, I'm a Button"),t(),e(42,` 2684 `),t(),e(43,` 2685 `),n(44,"div",4),e(45,` 2686 `),n(46,"h5",5),e(47,"Input Elements"),t(),e(48,` 2687 `),c(49,"input",8),e(50,` 2688 `),t(),e(51,` 2689 `),t(),e(52,` 2690 `),n(53,"div",3),e(54,` 2691 `),n(55,"div",4),e(56,` 2692 `),n(57,"h5"),e(58,"btn btn-lg"),t(),e(59,` 2693 `),n(60,"a",9),e(61,"Large Button"),t(),e(62,` 2694 `),t(),e(63,` 2695 `),n(64,"div",4),e(65,` 2696 `),n(66,"h5"),e(67,"btn"),t(),e(68,` 2697 `),n(69,"a",6),e(70,"Default Button"),t(),e(71,` 2698 `),t(),e(72,` 2699 `),n(73,"div",4),e(74,` 2700 `),n(75,"h5"),e(76,"btn btn-sm"),t(),e(77,` 2701 `),n(78,"a",10),e(79,"Small Button"),t(),e(80,` 2702 `),t(),e(81,` 2703 `),t(),e(82,` 2704 `),n(83,"div",3),e(84,` 2705 `),n(85,"div",4),e(86,` 2706 `),n(87,"h5"),e(88,"btn btn-primary btn-lg"),t(),e(89,` 2707 `),n(90,"a",11),e(91,"Submit"),t(),e(92,` 2708 `),t(),e(93,` 2709 `),n(94,"div",4),e(95,` 2710 `),n(96,"h5"),e(97,"btn btn-primary"),t(),e(98,` 2711 `),n(99,"a",12),e(100,"Submit"),t(),e(101,` 2712 `),t(),e(102,` 2713 `),n(103,"div",4),e(104,` 2714 `),n(105,"h5"),e(106,"btn btn-primary btn-sm"),t(),e(107,` 2715 `),n(108,"a",13),e(109,"Submit"),t(),e(110,` 2716 `),t(),e(111,` 2717 `),t(),e(112,` 2718 `),n(113,"div",3),e(114,` 2719 `),n(115,"div",4),e(116,` 2720 `),n(117,"h5"),e(118,"btn btn-secondary btn-lg"),t(),e(119,` 2721 `),n(120,"a",14),e(121,"Cancel"),t(),e(122,` 2722 `),t(),e(123,` 2723 `),n(124,"div",4),e(125,` 2724 `),n(126,"h5"),e(127,"btn btn-secondary"),t(),e(128,` 2725 `),n(129,"a",15),e(130,"Cancel"),t(),e(131,` 2726 `),t(),e(132,` 2727 `),n(133,"div",4),e(134,` 2728 `),n(135,"h5"),e(136,"btn btn-secondary btn-sm"),t(),e(137,` 2729 `),n(138,"a",16),e(139,"Cancel"),t(),e(140,` 2730 `),t(),e(141,` 2731 `),t(),e(142,` 2732 `),n(143,"div",3),e(144,` 2733 `),n(145,"div",4),e(146,` 2734 `),n(147,"h5"),e(148,"btn btn-disabled"),t(),e(149,` 2735 `),n(150,"a",17),e(151,"Cancel"),t(),e(152,` 2736 `),t(),e(153,` 2737 `),n(154,"div",4),e(155,` 2738 `),n(156,"h5"),e(157,"btn btn-primary btn-disabled"),t(),e(158,` 2739 `),n(159,"a",18),e(160,"Cancel"),t(),e(161,` 2740 `),t(),e(162,` 2741 `),n(163,"div",4),e(164,` 2742 `),n(165,"h5"),e(166,"btn btn-primary btn-lg btn-disabled"),t(),e(167,` 2743 `),n(168,"a",19),e(169,"Cancel"),t(),e(170,` 2744 `),t(),e(171,` 2745 `),t(),e(172,`
2746 `),n(173,"div",3),e(174,` 2747 `),n(175,"div",4),e(176,` 2748 `),n(177,"h5"),e(178,"btn btn-naked"),t(),e(179,` 2749 `),n(180,"a",20),e(181,"Cancel"),t(),e(182,` 2750 `),t(),e(183,` 2751 `),n(184,"div",4),e(185,` 2752 `),n(186,"h5"),e(187,"btn btn-primary btn-naked"),t(),e(188,` 2753 `),c(189,"input",21),e(190,` 2754 `),t(),e(191,` 2755 `),n(192,"div",4),e(193,` 2756 `),n(194,"h5"),e(195,"btn btn-primary btn-lg btn-naked"),t(),e(196,` 2757 `),n(197,"button",22),e(198,"Cancel"),t(),e(199,` 2758 `),t(),e(200,` 2759 `),t(),e(201,` 2760 `),t(),e(202,` 2761 `),t())},encapsulation:2});let a=r;return a})();var pl=(()=>{let r=class r{constructor(d){this.siteDataService=d}ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-grid"]],standalone:!1,decls:80,vars:0,consts:[[1,""],["href","http://getbootstrap.com/css/#grid"],[1,"row","show-grid"],[1,"col-md-1"],[1,"col-md-8"],[1,"col-md-4"],[1,"col-md-6"]],template:function(s,o){s&1&&(n(0,"div",0),e(1,` 2762 `),n(2,"h2"),e(3,"Layout Grid"),t(),e(4,` 2763 `),n(5,"p"),e(6,"This styleguide is using a simplified version of the "),n(7,"a",1),e(8,"Bootstrap 4 responsive grid"),t(),e(9,"."),t(),e(10,` 2764 `),n(11,"div",2),e(12," "),n(13,"div",3),e(14,".col-md-1"),t(),e(15," "),n(16,"div",3),e(1
27647,".col-md-1"),t(),e(18," "),n(19,"div",3),e(20,".col-md-1"),t(),e(21," "),n(22,"div",3),e(23,".col-md-1"),t(),e(24," "),n(25,"div",3),e(26,".col-md-1"),t(),e(27," "),n(28,"div",3),e(29,".col-md-1"),t(),e(30," "),n(31,"div",3),e(32,".col-md-1"),t(),e(33," "),n(34,"div",3),e(35,".col-md-1"),t(),e(36," "),n(37,"div",3),e(38,".col-md-1"),t(),e(39," "),n(40,"div",3),e(41,".col-md-1"),t(),e(42," "),n(43,"div",3),e(44,".col-md-1"),t(),e(45," "),n(46,"div",3),e(47,".col-md-1"),t(),e(48," "),t(),e(49,` 2765 `),n(50,"div",2),e(51," "),n(52,"div",4),e(53,".col-md-8"),t(),e(54," "),n(55,"div",5),e(56,".col-md-4"),t(),e(57," "),t(),e(58,` 2766 `),n(59,"div",2),e(60," "),n(61,"div",5),e(62,".col-md-4"),t(),e(63," "),n(64,"div",5),e(65,".col-md-4"),t(),e(66," "),n(67,"div",5),e(68,".col-md-4"),t(),e(69," "),t(),e(70,` 2767 `),n(71,"div",2),e(72," "),n(73,"div",6),e(74,".col-md-6"),t(),e(75," "),n(76,"div",6),e(77,".col-md-6"),t(),e(78," "),t(),e(79,` 2768`),t())},encapsulation:2});let a=r;return a})();var Gn="2026-08-31",xl=[{name:"Content-projection dynamic form",what:'<app-dynamic-form [contentFieldsMode]="true"> with hand-placed fields \u2014 the host owns layout',scale:"327 of 334 sanctioned templates",tab:"fields",verdict:"house"},{name:"Config-driven dynamic form",what:"the same component driven only by its [fields] array",scale:"7 of 334",tab:"fields",verdict:"house"},{name:"Controls with no <form>",what:"inputs floating free \u2014 no form element, no submit, no implicit submission",scale:"305 templates",tab:"defects",verdict:"defect"},{name:"Report filter grid",what:".row / .col-md-* / .form-group / bare <label> / p-multiSelect with [(ngModel)]",scale:"55 templates under admin/report",tab:"architectures",verdict:"drift"},{name:"Admin filter bar",what:"<app-admin-filter> with primary + advanced projection slots",scale:"74 templates",tab:"architectures",verdict:"live"},{name:"CMS settings rail",what:".pb-settings-column \u2014 a full-height right rail of autosaving dynamic forms",scale:"1 host, 34 content edit forms",tab:"architectures",verdict:"live"},{name:"Modal quick-add",what:"p-dialog \u2192 dynamic form (or raw .form-group) \u2192 app-dialog-footer",scale:"217 dialogs with a form, 116 with orphan controls",tab:"architectures",verdict:"live"},{name:"Dashboard panel mini-form",what:"a lone p-select or p-datepicker in a card header, used as a scope selector",scale:"18 templates under admin/dashboard",tab:"architectures",verdict:"drift"},{name:"Multi-step wizard",what:"p-steps chrome with one dynamic form per step, composed by @ViewChild",scale:"18 templates",tab:"architectures",verdict:"live"},{name:"Public checkout / registration",what:"the only place with a real <form> + [formGroup] outside the shared modules",scale:"~6 templates",tab:"architectures",verdict:"live"},{name:"Form-builder system",what:"a parallel drag-and-drop builder with its own model, steps and column metadata",scale:"1 consumer",tab:"architectures",verdict:"dead"}],hl=[{label:"Templates carrying a form control",value:"656",note:"inputs, textareas, selects, PrimeNG controls, or app-dynamic-form-field"},{label:"Templates containing a <form> element",value:"25",note:"written by hand \u2014 3.8% of the 656"},{label:"Templates whose <form> comes from app-dynamic-form",value:"326",note:"the component emits a real <form [formGroup]> itself \u2014 these are fine"},{label:"Templates with controls and no form element at all",value:"305",note:"the orphan population \u2014 free-floating controls"},{label:"\u2026of those, sitting inside a dialog",value:"116",note:"a modal that collects input but is not a form"},{label:"\u2026of those, with any Enter-key handler",value:"45",note:"so ~280 screens where Enter does nothing"},{label:'\u2026of those, with a type="submit" button',value:"1",note:"a single template in the whole orphan population"}],ul=[{idiom:"[horizontalForm]",home:"DynamicFormComponent input \u2192 .horizontal-form",uses:120,files:77,verdict:"house"},{idiom:"per-field [styleClass] Bootstrap columns",home:"the host template",uses:0,files:327,verdict:"house"},{idiom:"field.fieldContainerClass",home:"backend metadata",uses:7,files:4,verdict:"live"},{idiom:"field.fieldHeader",home:"backend metadata \u2192 .form-group--field-header",uses:1,files:1,verdict:"undefined"},{idiom:"[transposeLabel]",home:"DynamicFormFieldComponent input \u2192 .transpose-label, declared in dynamic-form-field.component.scss:5 \u2014 not in forms.scss",uses:15,files:4,verdict:"drift"},{idiom:"field.reverseLabel",home:"field metadata \u2192 the same .transpose-label class",uses:3,files:1,verdict:"drift"},{idiom:"field.floatLabel",home:"field metadata \u2192 .float-label",uses:2,files:2,verdict:"drift"},{idiom:'[buttonsPosition]="left|spread"',home:"DynamicFormComponent input",uses:0,files:0,verdict:"live"},{idiom:"[buttonsSticky]",home:"appStickyFormButtons directive",uses:33,files:33,verdict:"live"},{idiom:".compact-form",home:"2_layout/forms.scss:477",uses:22,files:5,verdict:"live"},{idiom:".inline-form",home:"2_layout/forms.scss:441 (nested in .horizontal-form)",uses:3,files:2,verdict:"drift"},{idiom:".wide-label",home:"2_layout/forms.scss:377 (nested in .horizontal-form)",uses:3,files:3,verdict:"drift"}],gl=[{slot:"beforeFormContent",host:"form",kind:"attribute",what:"above everything, outside the <form> element",files:"\u2014"},{slot:"beforeFormFieldsContent",host:"form",kind:"attribute",what:"inside the <form>, above the fields",files:"\u2014"},{slot:"(default)",host:"form",kind:"default",what:"the projected fields themselves \u2014 contentFieldsMode",files:"327"},{slot:"beforeSubmitButtonsContent",host:"form",kind:"attribute",what:"inside the action row, before the buttons",files:"\u2014"},{slot:"afterSubmitButtonsContent",host:"form",kind:"attribute",what:"inside the action row, after the buttons",files:"\u2014"},{slot:"afterFormContent",host:"form",kind:"attribute",what:"below everything, outside the <form> element",files:"\u2014"},{slot:"#beforeFieldContent",host:"field",kind:"template ref",what:"a TemplateRef rendered above the whole field group",files:"\u2014"},{slot:"beforeInputContent",host:"field",kind:"attribute",what:"between the label and the control",files:"\u2014"},{slot:"inputGroupStart",host:"field",kind:"attribute",what:'a leading p-in
2768putgroup-addon \u2014 the "yourclub.com/club/" prefix pattern',files:"12"},{slot:"inputGroupEnd",host:"field",kind:"attribute",what:"a trailing p-inputgroup-addon \u2014 units, reset links, clear buttons",files:"14"},{slot:"afterInputContent",host:"field",kind:"attribute",what:"directly under the control, above the note",files:"\u2014"},{slot:"extraMessage",host:"field",kind:"attribute",what:"below the note and the validation message",files:"\u2014"},{slot:"#fileUploadContent",host:"field",kind:"template ref",what:"replaces the file-upload body for FILE_UPLOAD fields",files:"\u2014"}],fl=[{kind:"asterisk-aria",markup:'<span aria-hidden="true" class="required-asterisk">*</span>',uses:30,defined:"2_layout/forms.scss:550 \u2014 orange-500, position:absolute",verdict:"house"},{kind:"text-danger",markup:'<span class="text-danger">*</span>',uses:18,defined:"no global declaration \u2014 two component stylesheets declare a local copy",verdict:"undefined"},{kind:"bare",markup:"* directly in the label text",uses:13,defined:"n/a \u2014 inherits body colour by design",verdict:"drift"},{kind:"required",markup:'<span class="required">*</span>',uses:9,defined:"nowhere \u2014 only .required-asterisk exists",verdict:"undefined"},{kind:"asterisk-no-aria",markup:'<span class="required-asterisk">*</span> (no aria-hidden)',uses:2,defined:'2_layout/forms.scss:550 \u2014 styled, but read aloud as "star"',verdict:"drift"},{kind:"text-red",markup:'<span class="text-red"> *</span>',uses:1,defined:"1_base/modifiers.scss:648",verdict:"drift"},{kind:"indicator",markup:'<span class="required-indicator">*</span>',uses:1,defined:"nowhere",verdict:"undefined"}],bl=[{idiom:"<app-inline-alert>",home:"shared component",uses:662,files:324,verdict:"house"},{idiom:".form-error-message",home:"2_layout/forms.scss:508 \u2014 the dynamic form's per-field message",uses:95,files:42,verdict:"house"},{idiom:"error-message (class or binding)",home:"ad hoc",uses:97,files:44,verdict:"drift"},{idiom:"text-danger",home:"no global declaration \u2014 local in 2 component stylesheets",uses:83,files:36,verdict:"undefined"},{idiom:".form-error",home:"2_layout/forms.scss:18 \u2014 the dynamic form's form-level message",uses:106,files:43,verdict:"house"},{idiom:"inline errors?.\u2026 expression",home:"the template",uses:50,files:7,verdict:"drift"},{idiom:"showError binding",home:"ad hoc",uses:35,files:12,verdict:"drift"},{idiom:"errorMessage property",home:"ad hoc",uses:24,files:17,verdict:"drift"},{idiom:"errorText property",home:"ad hoc",uses:13,files:7,verdict:"drift"},{idiom:"invalid-feedback",home:"Bootstrap",uses:9,files:2,verdict:"deprecated"},{idiom:"is-invalid",home:"Bootstrap",uses:7,files:1,verdict:"deprecated"}],Sl=[{idiom:"<app-dialog-footer>",home:'shared component, slot="primary" / slot="secondary"',uses:566,files:202,verdict:"house"},{idiom:".form-action",home:"2_layout/forms.scss:796 \u2014 the dynamic form's own row",uses:120,files:82,verdict:"house"},{idiom:"d-flex justify-content-between",home:"ad hoc",uses:428,files:181,verdict:"drift"},{idiom:"d-flex justify-content-end",home:"ad hoc",uses:252,files:119,verdict:"drift"},{idiom:"text-right",home:"ad hoc, Bootstrap 4 spelling",uses:250,files:79,verdict:"drift"},{idiom:"appStickyFormButtons",home:"shared directive",uses:33,files:33,verdict:"live"},{idiom:"button-row",home:"ad hoc",uses:8,files:6,verdict:"drift"},{idiom:"form-actions (plural)",home:"nowhere \u2014 undefined class",uses:1,files:1,verdict:"undefined"},{idiom:"modal-footer",home:"Bootstrap",uses:1,files:1,verdict:"deprecated"}],El=[{name:"CMS settings rail",home:".pb-settings-column \u2014 3_modules/cms/pb-settings-column.scss",scale:"1 host, 34 content edit forms",what:"a sticky full-height right rail: p-tabs over p-accordion over projection-mode forms that autosave through (valueChanges) and show no submit button",anchor:"cms-rail",verdict:"live"},{name:"Calendar filter rail",home:".calendar-filters \u2014 3_modules/templates.scss:842",scale:"2 templates",what:"a left column of filter controls beside the content column; its declaration is commented out",anchor:"calendar-rail",verdict:"undefined"},{name:"Admin filter bar",home:"app-admin-filter \u2014 the shared component",scale:"74 templates",what:"a search-filter card with primary and advanced projection slots, plus Search and Reset",anchor:"admin-filter",verdict:"house"},{name:"Admin filter bar, [horizontal]",home:"the same component, second layout",scale:"2 templates",what:"meant to be a left filter rail beside projected content \u2014 renders with no CSS at all",anchor:"admin-filter-horizontal",verdict:"defect"},{name:"Report filter grid",home:"admin/report/*/filters.component.html",scale:"55 templates",what:"a bare .row of .col-md-* columns of .form-groups, driven by an external Run button",anchor:"report-grid",verdict:"drift"},{name:"Dialog form",home:"p-dialog + app-dialog-footer",scale:"387 templates, 217 with a dynamic form",what:"the most common chrome in the app; width comes from a styleClass, never inline styles",anchor:"dialog",verdict:"house"},{name:"Hand-rolled dialog",home:".sprocket-dialog",scale:"27 templates",what:"the prescribed escape hatch for when content projection into p-dialog will not work",anchor:"sprocket-dialog",verdict:"live"},{name:"Drawer form",home:"p-drawer",scale:"9 templates",what:"an edge-anchored panel hosting a form; header treatment varies by surface",anchor:"drawer",verdict:"live"},{name:"Multi-step wizard",home:"p-steps + one form per step",scale:"17 templates",what:"step chrome over separate dynamic forms, composed by @ViewChild \u2014 no step primitive exists in the metadata",anchor:"wizard",verdict:"live"},{name:"Tabbed form",home:"p-tabs",scale:"280 templates",what:"fields grouped across tabs; each tab needs its own formID or submits cross-fire",anchor:"tabbed",verdict:"live"},{name:"Accordion form",home:"p-accordion",scale:"25 templates",what:"collapsible field groups \u2014 how the CMS rail hides Permissions and
2768SEO",anchor:"accordion",verdict:"live"},{name:"Sticky action bar",home:"appStickyFormButtons + [buttonsSticky]",scale:"33 templates",what:"pins .form-action to the viewport bottom until the real row scrolls into view",anchor:"sticky",verdict:"live"},{name:"Narrow centered form",home:".form-container \u2014 2_layout/forms.scss:24",scale:"7 templates",what:"a max-width wrapper for a standalone form; the public checkout and auth shape",anchor:"narrow",verdict:"live"},{name:"Dashboard mini-form",home:"app-admin-dashboard-card header",scale:"18 templates",what:"a lone p-select used as a scope selector, with no form and no submit",anchor:"mini",verdict:"drift"}],vl=[{className:".form-group",home:"2_layout/forms.scss:30",does:"the field wrapper \u2014 position:relative, bottom margin, label and select rules",uses:1152,files:198,verdict:"house"},{className:".form-action",home:"2_layout/forms.scss:796",does:"the button row; .left-buttons / .right-buttons children, card and dialog overrides",uses:120,files:82,verdict:"house"},{className:".horizontal-form",home:"2_layout/forms.scss:345",does:"label beside control; ~180 lines of nested overrides for every control type",uses:120,files:77,verdict:"house"},{className:".form-row",home:"2_layout/forms.scss:76",does:"lays sibling .form-groups out side by side",uses:157,files:20,verdict:"live"},{className:".form-check",home:"2_layout/forms.scss:202",does:"checkbox and radio row wrapper",uses:127,files:14,verdict:"live"},{className:".form-error-message",home:"2_layout/forms.scss:508",does:"the per-field validation message",uses:95,files:42,verdict:"house"},{className:".edit-card",home:"2_layout/forms.scss:132",does:"file-upload chrome inside an editing card",uses:89,files:48,verdict:"live"},{className:".form-label",home:"2_layout/forms.scss:160, :176, :685",does:"declared three times at top level \u2014 see the defect register",uses:49,files:15,verdict:"defect"},{className:".required-asterisk",home:"2_layout/forms.scss:550",does:"orange, position:absolute, left:-0.4rem \u2014 needs a positioned .form-group",uses:34,files:19,verdict:"house"},{className:".custom-form",home:"2_layout/forms.scss:1385",does:"a one-off label/input grid used by two templates",uses:33,files:2,verdict:"drift"},{className:".form-dropdown",home:"2_layout/forms.scss:416 (nested in .horizontal-form)",does:"dropdown sizing \u2014 no effect outside a .horizontal-form",uses:26,files:8,verdict:"drift"},{className:".compact-form",home:"2_layout/forms.scss:477",does:"tighter label, row and button sizing",uses:22,files:5,verdict:"live"},{className:".form-check-inline",home:"2_layout/forms.scss:219",does:"lays checkboxes or radios in a row",uses:12,files:1,verdict:"live"},{className:".form-error-message-full",home:"2_layout/forms.scss:525",does:"full-width error under a horizontal-form field",uses:12,files:7,verdict:"live"},{className:".form-input-group",home:"2_layout/forms.scss:557",does:"groups the controls under a legend.form-label",uses:11,files:3,verdict:"live"},{className:".form-note",home:"2_layout/forms.scss:8",does:"the helper text under a control",uses:9,files:7,verdict:"live"},{className:".form-container",home:"2_layout/forms.scss:24",does:"max-width wrapper for a standalone form",uses:7,files:4,verdict:"live"},{className:".float-label",home:"2_layout/forms.scss:618",does:"the label-floats-into-the-box treatment, with .is-focused / .is-active states",uses:6,files:4,verdict:"drift"},{className:".file-upload-layout",home:"2_layout/forms.scss:1191",does:"preview image beside the file name",uses:5,files:2,verdict:"live"},{className:".dateAndTime",home:"2_layout/forms.scss:1356",does:"date picker plus time select, with its own reset button",uses:5,files:3,verdict:"live"},{className:".text-area",home:"2_layout/forms.scss:169",does:"label spacing for a textarea .form-group",uses:4,files:3,verdict:"live"},{className:".transpose-label",home:"dynamic-form-field.component.scss:5 \u2014 the field component's own stylesheet, not forms.scss",does:"flips the label below the control for [transposeLabel] and field.reverseLabel",uses:18,files:5,verdict:"drift"},{className:".wide-label",home:"2_layout/forms.scss:377",does:"widens the label column \u2014 only inside .horizontal-form",uses:3,files:3,verdict:"drift"},{className:".inline-form",home:"2_layout/forms.scss:441",does:"label and control on one line \u2014 only inside .horizontal-form",uses:3,files:2,verdict:"drift"},{className:".acknowledgement-checkbox",home:"2_layout/forms.scss:858",does:"the bordered consent checkbox block",uses:2,files:2,verdict:"live"},{className:".big-checkbox",home:"2_layout/forms.scss:233",does:"scales a checkbox up",uses:2,files:2,verdict:"live"},{className:".password-peek-toggle",home:"2_layout/forms.scss:1410",does:"the eye icon inside a password field",uses:2,files:2,verdict:"live"},{className:".form-group-inline",home:"2_layout/forms.scss:54",does:"label and control inline, outside .horizontal-form",uses:2,files:1,verdict:"drift"},{className:".form-group-list",home:"2_layout/forms.scss:1115",does:"a list-shaped group with its own label and input rules",uses:2,files:1,verdict:"drift"},{className:".donate-form",home:"2_layout/forms.scss:1045",does:"bespoke radio styling for the donations page",uses:2,files:1,verdict:"drift"},{className:".checkbox-group-pills",home:"2_layout/forms.scss:255",does:"the pill-shaped checkbox group emitted by CHECKBOX_GROUP_PILLS",uses:1,files:1,verdict:"live"},{className:".cc-input-group",home:"2_layout/forms.scss:990",does:"credit-card number field with its sc
2768heme icon row",uses:1,files:1,verdict:"live"},{className:".double-input",home:"2_layout/forms.scss:455",does:"two controls sharing one .form-group",uses:1,files:1,verdict:"drift"},{className:"select.auto-width",home:"2_layout/forms.scss:117",does:"lets a select size to its content",uses:1,files:1,verdict:"drift"},{className:".form-sticky-form-buttons-on",home:"2_layout/forms.scss:90",does:"the sticky state the directive toggles \u2014 applied from TS, never in markup",uses:0,files:0,verdict:"live"}],yl=[{className:".pb-settings-column",home:"3_modules/cms/pb-settings-column.scss:11",does:"the CMS right rail \u2014 ~130 lines re-specifying label, form-group, form-action and dropdown sizing for one host",uses:1,files:1,verdict:"live"},{className:".report-filters",home:"3_modules/admin-includes/report-filter.scss:1",does:"the advanced-filter container; the only scope where .resetBtn is styled",uses:0,files:0,verdict:"live"},{className:".resetBtn",home:"3_modules/admin-includes/report-filter.scss:23",does:"the \u21BA reset link \u2014 deliberately not in the btn-* namespace, and unstyled outside .report-filters",uses:0,files:0,verdict:"live"},{className:".search-filter",home:"3_modules/admin-includes/search-filter.scss:1",does:"the app-admin-filter card chrome",uses:0,files:0,verdict:"live"},{className:".masked-checkbox",home:"2_layout/buttons.scss:422",does:"hides the real checkbox behind a .btn-pill label",uses:0,files:0,verdict:"live"},{className:".btn-pill",home:"2_layout/buttons.scss:386",does:"the pill button that CHECKBOX_GROUP_PILLS renders",uses:0,files:0,verdict:"live"},{className:".sr-only",home:"1_base/modifiers.scss:2781",does:"visually hides a label \u2014 the single most common label class in the app",uses:161,files:0,verdict:"house"},{className:".half-width",home:"1_base/modifiers.scss:68",does:"the two-up column class the backend stamps into fieldContainerClass",uses:0,files:0,verdict:"live"},{className:"hr.form-section",home:"3_modules/templates.scss:676",does:"the divider between form sections \u2014 only styled on an <hr>",uses:66,files:26,verdict:"live"}],wl=[{className:".form-checkbox",home:"2_layout/forms.scss:278",does:"a hand-built checkmark checkbox \u2014 ~50 lines across 6 rule blocks",uses:0,files:0,verdict:"dead"},{className:".connected-dropdowns",home:"2_layout/forms.scss:1285",does:"joins adjacent dropdowns into one segmented control",uses:0,files:0,verdict:"dead"},{className:".input-adder",home:"2_layout/forms.scss:1331",does:"a repeatable add-a-row input",uses:0,files:0,verdict:"dead"},{className:".warning-checkbox",home:"2_layout/forms.scss:893",does:"a checkbox in a warning treatment",uses:0,files:0,verdict:"dead"},{className:".block-label",home:"2_layout/forms.scss:690",does:"display:block on a label",uses:0,files:0,verdict:"dead"},{className:".form-emphasis",home:"2_layout/forms.scss:113",does:"emphasised form text",uses:0,files:0,verdict:"dead"},{className:"select.reverse-select",home:"2_layout/forms.scss:769",does:"a select with its chevron on the left",uses:0,files:0,verdict:"dead"},{className:".dynamic-form-field-label",home:"2_layout/forms.scss:333",does:"a label class the dynamic form no longer emits",uses:0,files:0,verdict:"dead"}],Cl=[{className:".f-value",home:"emitted by dynamic-form-field view-only rendering",does:"nothing \u2014 no stylesheet anywhere declares it",uses:9,files:0,verdict:"undefined"},{className:".form-wrapper",home:"emitted by dynamic-form.component.html:2, plus 30 hand-written uses",does:"nothing globally \u2014 three component stylesheets define their own, the rest render bare",uses:30,files:24,verdict:"undefined"},{className:".form-group--field-header",home:"emitted by dynamic-form-field for field.fieldHeader",does:"nothing globally \u2014 one component stylesheet defines it",uses:1,files:1,verdict:"undefined"},{className:".timeDropDown",home:"emitted by the DATE + showTime branch",does:"nothing globally \u2014 one component stylesheet defines it",uses:2,files:1,verdict:"undefined"},{className:".text-danger",home:"no global declaration; local rules in create-scheduled-report and message-edit-bubble",does:"nothing outside those two components \u2014 everywhere else it is inert",uses:83,files:36,verdict:"undefined"},{className:".required",home:"used as a required marker in 9 places",does:"nothing \u2014 only .required-asterisk is declared",uses:9,files:0,verdict:"undefined"},{className:".required-indicator",home:"used once",does:"nothing",uses:1,files:0,verdict:"undefined"},{className:".form-actions",home:"used once, plural",does:"nothing \u2014 the real class is .form-action",uses:1,files:1,verdict:"undefined"},{className:".admin-filter-container / .filters-section / .content-section",home:"emitted by app-admin-filter's [horizontal] layout",does:"nothing \u2014 admin-filter.component.scss is a 0-byte file and no other stylesheet declares them",uses:3,files:1,verdict:"undefined"},{className:".calendar-filters",home:"used in 2 calendar templates",does:"nothing \u2014 its declaration at 3_modules/templates.scss:842 is commented out",uses:2,files:2,verdict:"undefined"}],_l=[{title:"Enter does nothing on ~280 screens",where:"the 305 orphan-control templates",measured:"305 templates carry controls with no <form>; 45 have an Enter handler; 1 has a submit button",tab:"defects",anchor:"noform",demonstrable:!0},{title:"28 of 74 required markers render unstyled",where:"across 36 templates",measured:".text-danger (18), .required (9), .required-indicator (1) have no global declaration",tab:"defects",anchor:"asterisk",demonstrable:!0},{title:".text-danger has no global declaration but is used 83 times",where:"36 templates",measured:"nothing in assets/css/sass declares it; two component stylesheets declare a local copy, so it works in exactly two components",tab:"defects",anchor:"text-danger",demonstrable:!0},{title:"app-admin-filter's [horizontal] layout has no CSS at all",where:"admin-filter.component.scss, bulk-cancel + advanced-bulk-edit",measured:"the stylesheet is 0 bytes; .admin-filter-container, .filters-section and .content-section are declared in no stylesheet in the app",tab:"defects",anchor:"admin-filter-horizontal",demonstrable:!0},{title:".calendar-filters is commented out",where:"3_modules/templates.scss:842-847",measured:"live in 2 templates; the declaration block is commented out, so its three --p-toggleswitch-* overrides never apply",tab:"defects",anchor:"calendar-filters",demonstrable:!0},{title:".form-dropdown only works inside .horizontal-form",where:"8 templates, 26 uses",measured:"declared only as a descendant of .horizontal-form",tab:"defects",anchor:"scoping",demonstrable:!0}
2768,{title:".resetBtn only works inside .report-filters",where:"report filter panels",measured:"declared only as a descendant of .report-filters \u2014 an unstyled anchor anywhere else",tab:"defects",anchor:"scoping",demonstrable:!0},{title:"56% of labels have no for attribute",where:"app-wide",measured:"1,657 labels, 723 with for= \u2014 PrimeNG controls need inputId, not the component's id",tab:"defects",anchor:"labels",demonstrable:!0},{title:"Four classes the code emits have no stylesheet",where:".f-value, .form-wrapper, .form-group--field-header, .timeDropDown",measured:"emitted by the dynamic form or used in 30 templates; declared globally nowhere",tab:"defects",anchor:"emitted-undefined",demonstrable:!0},{title:"8 form classes are dead",where:"2_layout/forms.scss",measured:"zero references in any .html and any .ts \u2014 roughly 80 lines",tab:"defects",anchor:"dead-checkbox",demonstrable:!0},{title:"DynamicFormFieldComponent.viewOnly is a dead @Input",where:"dynamic-form-field.component.ts:35",measured:"the template reads field.viewOnly 56 times and the input zero times; nothing copies one onto the other, so [viewOnly] on a projected field is inert \u2014 only the form-level [viewOnly], which sets field.viewOnly on every field, does anything",tab:"fields",anchor:"panel",demonstrable:!0},{title:"The disabled @Input reaches 5 of 29 controls",where:"dynamic-form-field.component.html",measured:"the bare input is read on 5 lines (autocomplete x2, slider, text input, p-select); the other 22 reads are field.disabled, which no input writes \u2014 so [disabled] silently skips checkbox, radio, multiselect, textarea, rating, switch, file upload, tree and pills",tab:"fields",anchor:"panel",demonstrable:!0},{title:"showCharacterCount is inert for any admin",where:"dynamic-form-field.component.ts:237",measured:"the getter is showCharacterCount || siteDataService.isAdmin, so the input cannot turn the count off; it also only ever shows on 5 of 29 types, and only while focused",tab:"fields",anchor:"panel",demonstrable:!1},{title:".form-label is declared three times",where:"2_layout/forms.scss:160, :176, :685",measured:"three top-level blocks, plus two more as legend.form-label inside .horizontal-form",tab:"contracts",anchor:"",demonstrable:!1},{title:"DynamicFormField.controlName is typed optional and is mandatory",where:"dynamic-form-field.model.ts:237",measured:"an unguarded fieldOptions.controlName.replace() \u2014 new DynamicFormField({key, label}) throws at construction; strictNullChecks is off so nothing flags it",tab:"fields",anchor:"",demonstrable:!1},{title:"Production console.log in the dynamic form",where:"validators.model.ts:232, dynamic-form.component.ts:444",measured:"fires on every min-validation and every submit",tab:"fields",anchor:"",demonstrable:!1},{title:"The form-builder system has one consumer",where:"shared/modules/form-builder/",measured:"the only steps / columnSpan / multiStep metadata in the codebase; reachable only from /form-builder-demo",tab:"architectures",anchor:"",demonstrable:!1},{title:"The styleguide is unreachable from the nav",where:"left-nav.component.html:529-537",measured:"the super-admin entry is commented out, so the harness is URL-only",tab:"",anchor:"",demonstrable:!1}],ft=[{label:"All",value:null},{label:"Spring 2026",value:1},{label:"Fall 2026",value:2}],kl=[{name:"U10 Blue",value:1},{name:"U12 Red",value:2},{name:"U14 Green",value:3}];var Bm=(a,r)=>r.value;function Wm(a,r){if(a&1&&(e(0,` 2769 `),n(1,"p-tab",4),e(2),t(),e(3,` 2770 `)),a&2){let l=r.$implicit;i(),m("value",l.value)("routerLink",l.value),i(),p(l.label)}}var Tl=(()=>{let r=class r{constructor(d,s){this.router=d,this.siteDataService=s,this.snapshotDate=Gn,this.tabs=[{value:"overview",label:"Overview"},{value:"fields",label:"Fields"},{value:"layout",label:"Layout & labels"},{value:"architectures",label:"Architectures"},{value:"contracts",label:"CSS contracts"},{value:"defects",label:"Defects"}],this.activeTab="overview",this.unsubscribe$=new He}ngOnInit(){this.siteDataService.hideSiteLoader(),this.setActiveTab(this.router.url),this.router.events.pipe(na(d=>d instanceof wa),Ct(this.unsubscribe$)).subscribe({next:d=>
2770{this.siteDataService.hideSiteLoader(),this.setActiveTab(d.urlAfterRedirects)},error:()=>{this.siteDataService.hideSiteLoader(),this.activeTab="overview"}})}ngOnDestroy(){this.unsubscribe$.next(),this.unsubscribe$.complete()}setActiveTab(d){let s=d.split("?")[0].split("#")[0].split("/").pop();this.activeTab=this.tabs.some(o=>o.value===s)?s:"overview"}};r.\u0275fac=function(s){return new(s||r)(A(Dt),A(R))},r.\u0275cmp=b({type:r,selectors:[["app-forms"]],standalone:!1,decls:43,vars:5,consts:[[1,"text-small","text-grey"],[3,"routerLink"],[3,"value"],[1,"mt-3"],[3,"value","routerLink"]],template:function(s,o){s&1&&(n(0,"h2"),e(1,"Forms"),t(),e(2,` 2771`),n(3,"p",0),e(4,` 2772 Every form flavor the app ships, rendered. There is one sanctioned system and a long tail of 2773 shapes that grew around it, so this page leads with the map, carries measured counts through 2774 every table, and marks each treatment with a verdict. Nothing here is a re-implementation 2775 \u2014 the samples are the real `),n(5,"code"),e(6,"app-dynamic-form"),t(),e(7,`, the real shared components and 2776 the real classes from `),n(8,"code"),e(9,"2_layout/forms.scss"),t(),e(10,`. If a sample looks wrong, the component 2777 or the partial is wrong. 2778`),t(),e(11,` 2779`),n(12,"p",0),e(13,` 2780 Counts are a grep snapshot of `),n(14,"code"),e(15,"ClientApp/src/app"),t(),e(16,` taken 2781 `),n(17,"strong"),e(18),t(),e(19,` over the 1,292 templates outside the styleguide \u2014 this 2782 page and the other harness pages are excluded, so a count is its real product consumers. 2783 Verdicts cover measurable defects only \u2014 a flavor being rare is described, not judged; 2784 the `),n(20,"a",1),e(21,"Overview"),t(),e(22,` tab defines all seven. Companion pages: 2785 `),n(23,"a",1),e(24,"system alerts"),t(),e(25,` owns the 2786 inline-alert matrix this page links to for validation, and 2787 `),n(26,"a",1),e(27,"color"),t(),e(28,` owns the undefined text 2788 modifiers that turn up again under required markers. 2789`),t(),e(29,` 2790 2791`),n(30,"p-tabs",2),e(31,` 2792 `),n(32,"p-tablist"),e(33,` 2793 `),S(34,Wm,4,3,null,null,Bm),t(),e(36,` 2794`),t(),e(37,` 2795 2796`),n(38,"div",3),e(39,` 2797 `),c(40,"router-outlet"),e(41,` 2798`),t(),e(42,` 2799`)),s&2&&(i(18),p(o.snapshotDate),i(2),m("routerLink","overview"),i(3),m("routerLink","/admin/styleguide/components/system-alerts"),i(3),m("routerLink","/admin/styleguide/global/color"),i(4),m("value",o.activeTab),i(4),E(o.tabs))},dependencies:[Mt,$,ct,pt,xt],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var Rm=a=>["../",a],Lm=(a,r)=>r.name,qm=(a,r)=>r.label;function Vm(a,r){if(a&1&&(e(0,` 2800 `),n(1,"tr"),e(2,` 2801 `),n(3,"td")(4,"a",13),e(5),t()(),e(6,` 2802 `),n(7,"td",14),e(8),t(),e(9,` 2803 `),n(10,"td",14),e(11),t(),e(12,` 2804 `),n(13,"td"),c(14,"app-sg-verdict",15),t(),e(15,` 2805 `),t(),e(16,` 2806 `)),a&2){let l=r.$implicit;i(4),m("routerLink",ie(5,Rm,l.tab)),i(),p(l.name),i(3),p(l.what),i(3),p(l.scale),i(3),m("verdict",l.verdict)}}function zm(a,r){if(a&1&&(e(0,` 2807 `),n(1,"tr"),e(2,` 2808 `),n(3,"td",14),e(4),t(),e(5,` 2809 `),n(6,"td")(7,"strong"),e(8),t()(),e(9,` 2810 `),n(10,"td",2),e(11),t(),e(12,` 2811 `),t(),e(13,` 2812 `)),a&2){let l=r.$implicit;i(4),p(l.label),i(4),p(l.value),i(3),p(l.note)}}var Il=(()=>
2812{let r=class r{constructor(){this.flavors=xl,this.orphanStats=hl}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-forms-overview"]],standalone:!1,decls:140,vars:1,consts:[[1,"card"],["side","shared"],[1,"text-small","text-grey"],[1,"overflow-x-auto"],[1,"table","table-bordered","table-hover","sg-doc-table"],[2,"width","16rem"],[2,"width","14rem"],[2,"width","8rem"],["id","legend",1,"card"],["id","numbers",1,"card"],[1,"table","table-bordered","sg-doc-table"],[2,"width","6rem"],[2,"width","26rem"],[3,"routerLink"],[1,"text-small"],[3,"verdict"]],template:function(s,o){s&1&&(n(0,"div",0),e(1,` 2813 `),n(2,"h3"),e(3,"The map"),t(),e(4,` 2814 `),n(5,"app-sg-caption",1),e(6,"every row is a tab on this page"),t(),e(7,` 2815 `),n(8,"p",2),e(9,` 2816 The headline is the ratio. `),n(10,"strong"),e(11,`656 templates carry a form control and 25 contain a 2817 `),n(12,"code"),e(13,"<form>"),t(),e(14," element."),t(),e(15,` Most of the gap is legitimate \u2014 2818 `),n(16,"code"),e(17,"app-dynamic-form"),t(),e(18," emits its own "),n(19,"code"),e(20,"<form>"),t(),e(21,`, covering 326 of them 2819 \u2014 but 305 templates are left with controls and no form at all. 2820 `),t(),e(22,` 2821 `),n(23,"div",3),e(24,` 2822 `),n(25,"table",4),e(26,` 2823 `),n(27,"thead"),e(28,` 2824 `),n(29,"tr"),e(30,` 2825 `),n(31,"th",5),e(32,"Flavor"),t(),e(33,` 2826 `),n(34,"th"),e(35,"What it is"),t(),e(36,` 2827 `),n(37,"th",6),e(38,"Scale"),t(),e(39,` 2828 `),n(40,"th",7),e(41,"Verdict"),t(),e(42,` 2829 `),t(),e(43,` 2830 `),t(),e(44,` 2831 `),n(45,"tbody"),e(46,` 2832 `),S(47,Vm,17,7,null,null,Lm),t(),e(49,` 2833 `),t(),e(50,` 2834 `),t(),e(51,` 2835`),t(),e(52,` 2836 2837`),n(53,"div",8),e(54,` 2838 `),n(55,"h3"),e(56,"The legend"),t(),e(57,` 2839 `),n(58,"app-sg-caption",1),e(59,"what the verdict pills mean, here and on every tab"),t(),e(60,` 2840 `),n(61,"p",2),e(62,` 2841 Six tables on this page mark each treatment with one of these. They are ordered from 2842 \u201Cuse this\u201D to \u201Cthis is broken\u201D. The distinction that matters most is 2843 `),n(63,"strong"),e(64,"dead"),t(),e(65," against "),n(66,"strong"),e(67,"undefined"),t(),e(68,`: dead CSS is harmless weight, while 2844 undefined markup names a treatment that does not exist, so the template reads as styled and 2845 renders bare. A verdict describes a measurement, never a preference \u2014 a treatment 2846 being rare or old is not by itself drift. 2847 `),t(),e(69,` 2848 `),c(70,"app-sg-verdict-legend"),e(71,` 2849`),t(),e(72,` 2850 2851`),n(73,"div",9),e(74,` 2852 `),n(75,"h3"),e(76,"The headline numbers"),t(),e(77,` 2853 `),n(78,"app-sg-caption",1),e(79,"measured over 1,292 templates, excluding the styleguide"),t(),e(80,` 2854 `),n(81,"div",3),e(82,` 2855 `),n(83,"table",10),e(84,` 2856 `),n(85,"thead"),e(86,` 2857 `),n(87,"tr"),e(88,` 2858 `),n(89,"th"),e(90,"Measure"),t(),e(91,` 2859 `),n(92,"th",11),e(93,"Count"),t(),e(94,` 2860 `),n(95,"th",12),e(96,"Note"),t(),e(97,` 2861 `),t(),e(98,` 2862 `),t(),e(99,` 2863 `),n(100,"tbody"),e(101,` 2864 `),S(102,zm,14,3,null,null,qm),t(),e(104,` 2865 `),t(),e(105,` 2866 `),t(),e(106,` 2867 `),n(107,"p",2),e(108,` 2868 Read the two middle rows together before quoting the number. The 326 templates that host 2869 `),n(109,"code"),e(110,"app-dynamic-form"),t(),e(111," are "),n(112,"strong"),e(113,"not"),t(),e(114,` part of the orphan population \u2014 2870 the component emits a real `),n(115,"code"),e(116,"<form [formGroup]>"),t(),e(117,` of its own 2871 (`),n(118,"code"),e(119,"dynamic-form.component.html:8"),t(),e(120,`), so they get submission, the form landmark and 2872 autofill grouping for free. That is the strongest practical argument the sanctioned system 2873 has, and the bare \u201C25 templates have a `),n(121,"code"),e(122,"<form>"),t(),e(123,`\u201D number reads as 2874 an emergency when it is not. 2875 `),t(),e(124,` 2876 `),n(125,"p",2),e(126,` 2877 The other number worth holding on to: `),n(127,"strong"),e(128,`327 of the 334 templates using the sanctioned 2878 system pass `),n(129,"code"),e(130,'[contentFieldsMode]="true"'),t()(),e(131,` and place every field by hand. 2879 So the controls are standardised and the layout is owned by 327 separate templates. That is 2880 not a defect \u2014 there is no column, section, fieldset, tab or step primitive in 2881 `),n(132,"code"),e(133,"FormMetadata"),t(),e(134,` for them to use \u2014 but it is why \u201Call our forms use the 2882 dynamic form system\u201D and \u201Cour forms look inconsistent\u201D are both true. The 2883 `),n(135,"a",13),e(136,"Architectures"),t(),e(137,` tab is the catalog of what those 327 2884 templates built instead. 2885 `),t(),e(138,` 2886`),t(),e(139,` 2887`)),s&2&&(i(47),E(o.flavors),i(55),E(o.orphanStats),i(33),m("routerLink","../architectures"))},dependencies:[$,X,ve,we],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var $n=(a,r)=>r.value,Ml=(a,r)=>r.id;function Um(a,r){if(a&1){let l=B();e(0,` 2888 `),n(1,"div",7),e(2,` 2889 `),n(3,"p-radioButton",52),g("ngModelChange",function(s){w(l);let o=u();return o.state.label=s,C(o.applyState())}),t(),e(4,` 2890 `),n(5,"label"),e(6),t(),e(7,` 2891 `),t(),e(8,` 2892 `)}if(a&2){let l=r.$implicit,d=u();i(3),m("value",l.value)("ngModel",d.state.label)("inputId","sgLabel"+l.value),i(2),pe("for","sgLabel"+l.value),i(),p(l.label)}}function Hm(a,r){if(a&1){let l=B();e(0,` 2893 `),n(1,"div",7),e(2,` 2894 `),n(3,"p-radioButton",53),M("ngModelChange",function(s){w(l);let o=u();return I(o.state.layout,s)||(o.state.layout=s),C(s)}),t(),e(4,` 2895 `),n(5,"label"),e(6),t(),e(7,` 2896 `),t(),e(8,` 2897 `)}if(a&2){let l=r.$implicit,d=u();i(3),m("value",l.value),T("ngModel",d.state.layout),m("inputId","sgLayout"+l.value),i(2),pe("for","sgLayout"+l.value),i(),p(l.label)}}function jm(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(" ",l.note," ")}}function Gm(a,r){if(a&1&&(e(0,` 2898 `),v(1,jm,1,1)),a&2){let l=r.$implicit,d=u();i(),y(l.value===d.state.label?1:-1)}}function $m(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(" ",l.note," ")}}function Km(a,r){if(a&1&&(e(0,` 2899 `),v(1,$m,1,1)),a&2){let l=r.$implicit,d=u();i(),y(l.value===d.state.layout?1:-1)}}function Xm(a,r){a&1&&(e(0,` 2900 `),n(1,"span",55),e(2,` 2901 TinyMCE \u2014 rendered once, at the bottom of this tab, so the 2902 page does not boot fifteen editors. 2903 `),t(),e(3,` 2904 `))}function Ym(a,r){if(a&1&&(e(0,` 2905 `),n(1,"app-dynamic-form-field",56),e(2,` 2906 `),t(),e(3,` 2907 `)),a&2){let l=u().$implicit,d=u();i(),m("fieldName",l.field.key)("hideLabel",d.state.label==="hidden")("transposeLabel",d.state.label==="transposed")("required",d.state.required)("disabled",d.state.disabled)("viewOnly",d.state.viewOnly)("errorMessage",d.forcedErrorMessage)("showCharacterCount",d.state.characterCount)("styleClass",d.fieldStyleClass)}}function Qm(a,r){if(a&1&&(e(0,` 2908 `),n(1,"tr"),e(2,` 2909 `),n(3,"td",54),e(4),t(),e(5,` 2910 `),n(6,"td")(7,"code",54),e(8),t()(),e(9,` 2911 `),n(10,"td",54),e(11),t(),e(12,` 2912 `),n(13,"td"),e(14,` 2913 `),v(15,Xm,4,0)(16,Ym,4,9),t(),e(17,` 2914 `),t(),e(18,` 2915 `)),a&2){let l=r.$implicit,d=u();i(4),p(l.id),i(4),p(l.name),i(3),p(l.control),i(4),y(l.id===d.DynamicFormFieldType.HTML_TEXT?15:16)}}function Jm(a,r){if(a&1&&(e(0,` 2916 `),n(1,"tr"),e(2,` 2917 `),n(3,"td",54),e(4),t(),e(5,` 2918 `),n(6,"td")(7,"code",54),e(8),t()(),e(9,` 2919 `),n(10,"td",54),e(11),t(),e(12,` 2920 `),n(13,"td"),e(14,` 2921 `),n(15,"app-dynamic-form-field",56),e(16,` 2922 `),t(),e(17,` 2923 `),t(),e(18,` 2924 `),t(),e(19,` 2925 `)),a&2){let l=r.$implicit,d=u();i(4),p(l.id),i(4),p(l.name),i(3),p(l.control),i(4),m("fieldName",l.field.key)("hideLabel",d.state.label==="hidden")("transposeLabel",d.state.label==="transposed")("required",d.state.required)("disabled",d.state.disabled)("viewOnly",d.state.viewOnly)("errorMessage",d.forcedErrorMessage)("showCharacterCount",d.state.characterCount)("styleClass",d.fieldStyleClass)}}var Fl=(()=>
2925{let r=class r{constructor(){this.DynamicFormFieldType=Y,this.state={required:!1,disabled:!1,viewOnly:!1,showError:!1,note:!1,noteTooltip:!1,labelTooltip:!1,placeholder:!1,characterCount:!1,fieldHeader:!1,label:"visible",layout:"vertical"},this.labelModes=[{value:"visible",label:"Visible",note:"the default \u2014 a <label> above the control"},{value:"hidden",label:"Hidden",note:'[hideLabel]="true" \u2014 no label element at all'},{value:"transposed",label:"Transposed",note:`[transposeLabel]="true" \u2192 .transpose-label, declared in the field component's own stylesheet`},{value:"float",label:"Float",note:"field.floatLabel \u2192 .float-label, 6 uses across 4 templates"}],this.layoutModes=[{value:"vertical",label:"Vertical",note:"the default \u2014 label above control"},{value:"horizontal",label:"Horizontal",note:'[horizontalForm]="true" \u2192 .horizontal-form, 77 templates'},{value:"compact",label:"Compact",note:".compact-form on the host \u2014 tighter label, row and button sizing"},{value:"twoUp",label:"Two-up",note:".form-row + Bootstrap columns per field \u2014 how the 327 projection hosts do it"}],this.fieldTypeRows=[this.typeRow(Y.TEXT,"TEXT","native <input>, sub-typed by DynamicFormFieldTextBoxType",{key:"ft_text",label:"Text"}),this.typeRow(Y.DROPDOWN,"DROPDOWN","<p-select>",{key:"ft_dropdown",label:"Dropdown",options:[{label:"One",value:1},{label:"Two",value:2}]}),this.typeRow(Y.CHECKBOX,"CHECKBOX",'<p-checkbox [binary]="true">',{key:"ft_checkbox",label:"Checkbox"}),this.typeRow(Y.FILE_UPLOAD,"FILE_UPLOAD","<app-file-upload>",{key:"ft_file",label:"File Upload"}),this.typeRow(Y.RADIO_GROUP,"RADIO_GROUP",'<p-radioButton> per option, in role="radiogroup"',{key:"ft_radio",label:"Radio Group",options:[{label:"Blue",value:1},{label:"Red",value:2}]}),this.typeRow(Y.TEXT_AREA,"TEXT_AREA",'native <textarea class="form-text-area">',{key:"ft_textarea",label:"Text Area"}),this.typeRow(Y.MULTISELECT,"MULTISELECT","<p-multiSelect>, virtual-scrolled over 50 options",{key:"ft_multi",label:"Multiselect",options:[{label:"Spring",value:1},{label:"Fall",value:2}]}),this.typeRow(Y.HTML_TEXT,"HTML_TEXT","TinyMCE <editor> \u2014 rendered once on this tab, see the note",{key:"ft_html",label:"Rich Text"}),this.typeRow(Y.CHECKBOX_GROUP,"CHECKBOX_GROUP",'<p-checkbox [binary]="false"> per option, in role="checkboxgroup"',{key:"ft_chkgroup",label:"Checkbox Group",options:[{label:"Email",value:1},{label:"SMS",value:2}]}),this.treeRow(),this.typeRow(Y.SELECT_BUTTON,"SELECT_BUTTON","<p-selectButton>",{key:"ft_selectbtn",label:"Select Button",options:[{label:"Yes",value:1},{label:"No",value:2}]}),this.typeRow(Y.STAR_RATING,"STAR_RATING","<p-rating>",{key:"ft_rating",label:"Star Rating"}),this.typeRow(Y.INPUT_SWITCH,"INPUT_SWITCH","<p-toggleswitch>",{key:"ft_switch",label:"Input Switch"}),this.typeRow(Y.MULTIPLE_FILE_UPLOAD,"MULTIPLE_FILE_UPLOAD","<app-multiple-file-upload>",{key:"ft_files",label:"Multiple File Upload"}),this.typeRow(Y.CHECKBOX_GROUP_PILLS,"CHECKBOX_GROUP_PILLS","hidden checkboxes behind .btn-pill.masked-checkbox labels",{key:"ft_pills",label:"Checkbox Group Pills",options:[{label:"U10",value:1},{label:"U12",value:2}]})],this.textBoxRows=[this.textRow(ae.TEXT,"TEXT","input[type=text]","tb_text","Text"),this.textRow(ae.DATE,"DATE",'<p-datepicker appendTo="body">',"tb_date","Date"),this.textRow(ae.EMAIL,"EMAIL","input[type=email] + email validator","tb_email","Email"),this.textRow(ae.NUMBER,"NUMBER","input[type=number], wheel-blurred","tb_number","Number"),this.textRow(ae.PASSWORD,"PASSWORD","input[type=password] + peek toggle + criteria checklist + strength meter","tb_password","Password"),this.textRow(ae.PHONE,"PHONE","input[type=tel] with appPhoneInputMask","tb_phone","Phone"),this.textRow(ae.URL,"URL","input[type=url] + url validator","tb_url","URL"),this.textRow(ae.CREDIT_CARD,"CREDIT_CARD","input[ccNumber] + live scheme icon row","tb_cc","Credit Card"),this.textRow(ae.BIRTHDATE,"BIRTHDATE",'input[pInputMask="99/99/9999"]',"tb_dob","Birthdate"),this.textRow(ae.COLOR_PICKER,"COLOR_PICKER","<p-colorPicker> + hex input + club-theme menu","tb_color","Color Picker"),this.textRow(ae.YEAR_PICKER,"YEAR_PICKER",'<p-datepicker view="year">',"tb_year","Year Picker"),this.textRow(ae.TIME,"TIME","input[type=time], or a text input + a time <select>","tb_time","Time"),this.textRow(ae.AUTO_COMPLETE,"AUTO_COMPLETE","<p-autoComplete>, driven by a handler on the field object","tb_auto","Autocomplete"),this.textRow(ae.RANGE_SLIDER,"RANGE_SLIDER","<p-slider> + a value readout","tb_range","Range Slider"),this.textRow(ae.CONFIRM_PASSWORD,"CONFIRM_PASSWORD","input[type=password] + a match indicator, no criteria UI","tb_confirm","Confirm Password")],this.allTypeFields=[...this.fieldTypeRows,...this.textBoxRows].map(d=>d.field),this.emptyEntity={},this.verticalFields=r.basicFields(),this.horizontalFields=r.basicFields(),this.viewOnlyFields=r.basicFields(),this.projectedFields=[new z({key:"city",controlName:"city",label:"City",required:!0}),new z({key:"state",controlName:"state",label:"State"}),new z({key:"postalCode",controlName:"postalCode",label:"Zip",validators:[{validatorType:Ga.ZIP_CODE}]})],this.viewOnlyEntity={firstName:"Dana",lastName:"Okafor",emailAddress:"[email protected]",genderID:1,notes:"Read-only rendering differs per field type \u2014 this is the TEXT_AREA one."}}get fieldStyleClass(){return this.state.layout==="twoUp"?"d-inline-block col-md-6":""}get formStyleClass(){return this.state.layout==="compact"?"compact-form":""}get forcedErrorMessage(){return this.state.showError?"This field is showing a forced error message.":void 0}applyState(){for(let d of this.allTypeFields)d.required=this.state.required,d.disabled=this.state.disabled,d.viewOnly=this.state.viewOnly,d.note=this.state.note?"A field note renders here, under the control.":void 0,d.noteTooltipText=this.state.noteTooltip?"The note carries its own tooltip, separate from the label one.":void 0,d.tooltipText=this.state.labelTooltip?"A label tooltip \u2014 an info icon beside the label text.":void 0,d.placeholder=this.state.placeholder?"Placeholder text":void 0,d.showCharacterCount=this.state.characterCount,d.maxLength=this.state.characterCount?40:void 0,d.fieldHeader=this.state.fieldHeader?"A field header":void 0,d.floatLabel=this.state.label==="float"}treeRow(){let d=new z({key:"ft_tree",controlName:"ft_tree",label:"Multi-select Tree",dynamicFormFieldTypeID:Y.MULTI_SELECT_TREE});return d.treeOptions={label:"All Programs",data:0,children:[{label:"Spring 2026",data:1},{label:"Fall 2026",data:2}]},{id:Y.MULTI_SELECT_TREE,name:"MULTI_SELECT_TREE",control:'<p-tree selectionMode="checkbox"> \u2014 bound by [selection], not a form control',field:d}}typeRow(d,s,o,x){return{id:d,name:s,control:o,field:new z({key:x.key,controlName:x.key,label:x.label,dynamicFormFieldTypeID:d,options:x.options})}}textRow(d,s,o,x,h){return{id:d,name:s,control:o,field:new z({key:x,label:h,controlName:x,dynamicFormFieldTypeID:Y.TEXT,dynamicFormFieldTextBoxTypeID:d})}}static basicFields(){return[new z({key:"firstName",controlName:"firstName",label:"First Name",required:!0}),new z({key:"lastName",controlName:"lastName",label:"Last Name",required:!0}),new z({key:"emailAddress",controlName:"emailAddress",label:"Email",required:!0,dynamicFormFieldTextBoxTypeID:ae.EMAIL}),new z({key:"genderID",controlName:"genderID",label:"Gender",dynamicFormFieldTypeID:Y.DROPDOWN,options:[{label:"Female",value:1},{label:"Male",value:2},{label:"Prefer not to say",value:3}]}),new z({key:"notes",controlName:"notes",label:"Notes",dynamicFormFieldTypeID:Y.TEXT_AREA,note:"A field note renders here, under the control."})]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-forms-fields"]],standalone:!1,decls:562,vars:44,consts:[["id","panel",1,"card"],["side","shared"],[1,"text-small","text-grey"],[1,"row"],[1,"col-md-4"],[1,"form-label"],[1,"form-input-group"],[1,"form-check"],["
2925inputId","sgReq",3,"ngModelChange","onChange","ngModel","binary"],["for","sgReq"],["inputId","sgDis",3,"ngModelChange","onChange","ngModel","binary"],["for","sgDis"],["inputId","sgVO",3,"ngModelChange","onChange","ngModel","binary"],["for","sgVO"],["inputId","sgErr",3,"ngModelChange","ngModel","binary"],["for","sgErr"],["inputId","sgNote",3,"ngModelChange","onChange","ngModel","binary"],["for","sgNote"],["inputId","sgNoteTip",3,"ngModelChange","onChange","ngModel","binary"],["for","sgNoteTip"],["inputId","sgLblTip",3,"ngModelChange","onChange","ngModel","binary"],["for","sgLblTip"],["inputId","sgPh",3,"ngModelChange","onChange","ngModel","binary"],["for","sgPh"],["inputId","sgCc",3,"ngModelChange","onChange","ngModel","binary"],["for","sgCc"],["inputId","sgFh",3,"ngModelChange","onChange","ngModel","binary"],["for","sgFh"],[1,"form-input-group","mb-3"],[1,"text-small","text-grey","mt-3"],["id","types",1,"card"],["formID","sgTypeGallery",3,"fields","entity","contentFieldsMode","showSubmitButton","horizontalForm","formClass"],[1,"text-medium-large","mt-4"],[1,"overflow-x-auto"],[1,"table","table-bordered","sg-doc-table"],[2,"width","3rem"],[2,"width","15rem"],[2,"width","22rem"],["fieldName","ft_html"],["id","sanctioned",1,"card"],["side","admin"],["formID","sgVertical","submitButtonText","Save",3,"fields","entity","showCancelButton"],["formID","sgHorizontal","submitButtonText","Save",3,"fields","entity","horizontalForm","showCancelButton"],["formID","sgProjected","submitButtonText","Save",3,"fields","entity","contentFieldsMode"],[1,"form-row"],["fieldName","city","styleClass","d-inline-block col-6 pl-0"],["fieldName","state","styleClass","d-inline-block col-3"],["fieldName","postalCode","styleClass","d-inline-block col-3 pr-0"],[1,"bg-grey-lt","border-all","border-radius","p-3","text-medium","overflow-x-auto"],["formID","sgViewOnly",3,"fields","entity","viewOnly","horizontalForm"],[3,"routerLink"],["id","gotchas",1,"card"],["name","sgLabelMode",3,"ngModelChange","value","ngModel","inputId"],["name","sgLayoutMode",3,"ngModelChange","value","ngModel","inputId"],[1,"text-small"],[1,"text-small","text-grey-lt"],[3,"fieldName","hideLabel","transposeLabel","required","disabled","viewOnly","errorMessage","showCharacterCount","styleClass"]],template:function(s,o){s&1&&(n(0,"div",0),e(1,` 2926 `),n(2,"h3"),e(3,"The permutation panel"),t(),e(4,` 2927 `),n(5,"app-sg-caption",1),e(6,"every toggle below drives all 29 controls at once"),t(),e(7,` 2928 `),n(8,"p",2),e(9,` 2929 `),n(10,"code"),e(11,"DynamicFormComponent"),t(),e(12," takes 48 inputs, "),n(13,"code"),e(14,"DynamicFormFieldComponent"),t(),e(15,` 2930 takes over seventy, and `),n(16,"code"),e(17,"DynamicFormField"),t(),e(18,` carries roughly sixty options. Reading 2931 that list tells you nothing about what any of it looks like, and no static page can render 2932 the combinations. So the controls below are the real fields, and these switches are the real 2933 state \u2014 flip one and watch which of the 29 controls actually respond. Several do not, 2934 and that is the point. 2935 `),t(),e(19,` 2936 `),n(20,"div",3),e(21,` 2937 `),n(22,"div",4),e(23,` 2938 `),n(24,"legend",5),e(25,"Field state"),t(),e(26,` 2939 `),n(27,"div",6),e(28,` 2940 `),n(29,"div",7),e(30,` 2941 `),n(31,"p-checkbox",8),M("ngModelChange",function(h){return I(o.state.required,h)||(o.state.required=h),h}),g("onChange",function(){return o.applyState()}),t(),e(32,` 2942 `),n(33,"label",9),e(34,"required \u2014 asterisk + validator"),t(),e(35,` 2943 `),t(),e(36,` 2944 `),n(37,"div",7),e(38,` 2945 `),n(39,"p-checkbox",10),M("ngModelChange",function(h){return I(o.state.disabled,h)||(o.state.disabled=h),h}),g("onChange",function(){return o.applyState()}),t(),e(40,` 2946 `),n(41,"label",11),e(42,"disabled \u2014 "),n(43,"code"),e(44,"field.disabled"),t(),e(45,`, not the 2947 `),n(46,"code"),e(47,"[disabled]"),t(),e(48," input"),t(),e(49,` 2948 `),t(),e(50,` 2949 `),n(51,"div",7),e(52,` 2950 `),n(53,"p-checkbox",12),M("ngModelChange",function(h){return I(o.state.viewOnly,h)||(o.state.viewOnly=h),h}),g("onChange",function(){return o.applyState()}),t(),e(54,` 2951 `),n(55,"label",13),e(56,"view-only \u2014 "),n(57,"code"),e(58,"field.viewOnly"),t(),e(59,`, renders 2952 `),n(60,"code"),e(61,".f-value"),t()(),e(62,` 2953 `),t(),e(63,` 2954 `),n(64,"div",7),e(65,` 2955 `),n(66,"p-checkbox",14),M("ngModelChange",function(h){return I(o.state.showError,h)||(o.state.showError=h),h}),t(),e(67,` 2956 `),n(68,"label",15),e(69,"show error \u2014 forced via "),n(70,"code"),e(71,"[errorMessage]"),t()(),e(72,` 2957 `),t(),e(73,` 2958 `),t(),e(74,` 2959 `),t(),e(75,` 2960 `),n(76,"div",4),e(77,` 2961 `),n(78,"legend",5),e(79,"Field decoration"),t(),e(80,` 2962 `),n(81,"div",6),e(82,` 2963 `),n(83,"div",7),e(84,` 2964 `),n(85,"p-checkbox",16),M("ngModelChange",function(h){return I(o.state.note,h)||(o.state.note=h),h}),g("onChange",function(){return o.applyState()}),t(),e(86,` 2965 `),n(87,"label",17),e(88,"note \u2014 "),n(89,"code"),e(90,"field.note"),t()(),e(91,` 2966 `),t(),e(92,` 2967 `),n(93,"div",7),e(94,` 2968 `),n(95,"p-checkbox",18),M("ngModelChange",function(h){return I(o.state.noteTooltip,h)||(o.state.noteTooltip=h),h}),g("onChange",function(){return o.applyState()}),t(),e(96,` 2969 `),n(97,"label",19),e(98,"note tooltip \u2014 "),n(99,"code"),e(100,"field.noteTooltipText"),t()(),e(101,` 2970 `),t(),e(102,` 2971 `),n(103,"div",7),e(104,` 2972 `),n(105,"p-checkbox",20),M("ngModelChange",function(h){return I(o.state.labelTooltip,h)||(o.state.labelTooltip=h),h}),g("onChange",function(){return o.applyState()}),t(),e(106,` 2973 `),n(107,"label",21),e(108,"label tooltip \u2014 "),n(109,"code"),e(110,"field.tooltipText"),t()(),e(111,` 2974 `),t(),e(112,` 2975 `),n(113,"div",7),e(114,` 2976 `),n(115,"p-checkbox",22),M("ngModelChange",function(h){return I(o.state.placeholder,h)||(o.state.placeholder=h),h}),g("onChange",function(){return o.applyState()}),t(),e(116,` 2977 `),n(117,"label",23),e(118,"placeholder \u2014 "),n(119,"code"),e(120,"field.placeholder"),t()(),e(121,` 2978 `),t(),e(122,` 2979 `),n(123,"div",7),e(124,` 2980 `),n(125,"p-checkbox",24),M("ngModelChange",function(h){return I(o.state.characterCount,h)||(o.state.characterCount=h),h}),g("onChange",function(){return o.applyState()}),t(),e(126,` 2981 `),n(127,"label",25),e(128,"character count \u2014 needs a "),n(129,"code"),e(130,"maxLength"),t(),e(131,`; already 2982 forced on here, see below`),t(),e(132,` 2983 `),t(),e(133,` 2984 `),n(134,"div",7),e(135,` 2985 `),n(136,"p-checkbox",26),M("ngModelChange",function(h){return I(o.state.fieldHeader,h)||(o.state.fieldHeader=h),h}),g("onChange",function(){return o.applyState()}),t(),e(137,` 2986 `),n(138,"label",27),e(139,"field header \u2014 "),n(140,"code"),e(141,"f
2986ield.fieldHeader"),t(),e(142,", undefined class"),t(),e(143,` 2987 `),t(),e(144,` 2988 `),t(),e(145,` 2989 `),t(),e(146,` 2990 `),n(147,"div",4),e(148,` 2991 `),n(149,"legend",5),e(150,"Label"),t(),e(151,` 2992 `),n(152,"div",28),e(153,` 2993 `),S(154,Um,9,5,null,null,$n),t(),e(156,` 2994 `),n(157,"legend",5),e(158,"Layout"),t(),e(159,` 2995 `),n(160,"div",6),e(161,` 2996 `),S(162,Hm,9,5,null,null,$n),t(),e(164,` 2997 `),t(),e(165,` 2998 `),t(),e(166,` 2999 `),n(167,"p",29),e(168,` 3000 `),n(169,"strong"),e(170,"Label:"),t(),e(171,` 3001 `),S(172,Gm,2,1,null,null,$n),e(174,` 3002 \xA0\xB7\xA0 3003 `),n(175,"strong"),e(176,"Layout:"),t(),e(177,` 3004 `),S(178,Km,2,1,null,null,$n),t(),e(180,` 3005 `),n(181,"p",2),e(182,` 3006 `),n(183,"strong"),e(184,"There are two ways to set most of these, and only one of them works."),t(),e(185,` 3007 `),n(186,"code"),e(187,"DynamicFormFieldComponent"),t(),e(188," declares "),n(189,"code"),e(190,"@Input() viewOnly"),t(),e(191,`, 3008 `),n(192,"code"),e(193,"@Input() disabled"),t(),e(194," and "),n(195,"code"),e(196,"@Input() required"),t(),e(197,`, and it also reads 3009 `),n(198,"code"),e(199,"field.viewOnly"),t(),e(200,", "),n(201,"code"),e(202,"field.disabled"),t(),e(203," and "),n(204,"code"),e(205,"field.required"),t(),e(206,` off 3010 the field object \u2014 but nothing copies one onto the other. The template reads 3011 `),n(207,"code"),e(208,"field.viewOnly"),t(),e(209," 56 times and the input "),n(210,"em"),e(211,"zero"),t(),e(212,` times, so 3012 `),n(213,"code"),e(214,"[viewOnly]"),t(),e(215,` on a projected field does nothing at all; the only thing that turns 3013 a field read-only is the form-level `),n(216,"code"),e(217,"[viewOnly]"),t(),e(218,`, which works because 3014 `),n(219,"code"),e(220,"setAllFieldsViewOnly()"),t(),e(221," writes "),n(222,"code"),e(223,"field.viewOnly = true"),t(),e(224,` on every field. 3015 `),n(225,"code"),e(226,"[disabled]"),t(),e(227," is read on 5 lines against 22 for "),n(228,"code"),e(229,"field.disabled"),t(),e(230,`, so it 3016 reaches the autocomplete, the slider, the text input and the select and silently skips the 3017 other two dozen. Only `),n(231,"code"),e(232,"required"),t(),e(233,` is read both ways. So this panel writes the 3018 field object, not the inputs. 3019 `),t(),e(234,` 3020 `),n(235,"p",2),e(236,` 3021 Three more things the panel makes visible that a table cannot. `),n(237,"strong"),e(238,`Not every control 3022 honours every flag even through the field object`),t(),e(239," \u2014 "),n(240,"code"),e(241,"viewOnly"),t(),e(242,` has 3023 a bespoke read-only rendering per type and some types have none, and the checkbox group 3024 reads `),n(243,"code"),e(244,"field.viewOnly"),t(),e(245," without "),n(246,"code"),e(247,"field.disabled"),t(),e(248,`. 3025 `),n(249,"strong"),e(250,"Character count is not actually yours to control"),t(),e(251,`: the 3026 `),n(252,"code"),e(253,"_showCharacterCount"),t(),e(254,` getter is 3027 `),n(255,"code"),e(256,"showCharacterCount || siteDataService.isAdmin"),t(),e(257,`, so on an admin-only page like 3028 this one the switch cannot turn it off \u2014 and it only ever appears on 5 of the 29 3029 types, only while focused. And `),n(258,"strong"),e(259,`a forced error is the only way to see the error 3030 state`),t(),e(260,`, because a pristine control never shows one \u2014 which is why validation 3031 display is so inconsistent across the app: most screens are built without anyone ever 3032 seeing it. 3033 `),t(),e(261,` 3034`),t(),e(262,` 3035 3036`),n(263,"div",30),e(264,` 3037 `),n(265,"h3"),e(266,"Every field type"),t(),e(267,` 3038 `),n(268,"app-sg-caption",1),e(269,"DynamicFormFieldType \xD7 DynamicFormFieldTextBoxType"),t(),e(270,` 3039 `),n(271,"p",2),e(272,` 3040 Fifteen field types, and the `),n(273,"code"),e(274,"TEXT"),t(),e(275,` type splits again into fifteen textbox 3041 sub-types \u2014 29 distinct controls in total. The rows below are built by iterating the 3042 real exported enums, so this table cannot drift from the model. The integer is the wire 3043 contract: the C# `),n(276,"code"),e(277,"DynamicFormFieldType"),t(),e(278,` is byte-for-byte identical. 3044 `),t(),e(279,` 3045 `),n(280,"p",2),e(281,` 3046 Both tables are projected into a single `),n(282,"code"),e(283,"[contentFieldsMode]"),t(),e(284,` form, so each 3047 control is backed by a real `),n(285,"code"),e(286,"FormControl"),t(),e(287,`. That is not a presentation choice 3048 \u2014 `),n(288,"code"),e(289,"app-dynamic-form-field"),t(),e(290," binds "),n(291,"code"),e(292,"[formGroup]"),t(),e(293,`, so one rendered 3049 outside a form throws. 3050 `),t(),e(294,` 3051 3052 `),n(295,"app-dynamic-form",31),e(296,` 3053 3054 `),n(297,"h4",32),e(298,"DynamicFormFieldType"),t(),e(299,` 3055 `),n(300,"div",33),e(301,` 3056 `),n(302,"table",34),e(303,` 3057 `),n(304,"thead"),e(305,` 3058 `),n(306,"tr"),e(307,` 3059 `),n(308,"th",35),e(309,"ID"),t(),e(310,` 3060 `),n(311,"th",36),e(312,"Name"),t(),e(313,` 3061 `),n(314,"th",37),e(315,"Renders"),t(),e(316,` 3062 `),n(317,"th"),e(318,"Live"),t(),e(319,` 3063 `),t(),e(320,` 3064 `),t(),e(321,` 3065 `),n(322,"tbody"),e(323,` 3066 `),S(324,Qm,19,4,null,null,Ml),t(),e(326,` 3067 `),t(),e(327,` 3068 `),t(),e(328,` 3069 3070 `),n(329,"h4",32),e(330,"DynamicFormFieldTextBoxType"),t(),e(331,` 3071 `),n(332,"p",2),e(333,` 3072 All of these are `),n(334,"code"),e(335,"dynamicFormFieldTypeID = TEXT"),t(),e(336,`. The sub-type decides whether 3073 you get a native input, a PrimeNG overlay control, or a bespoke composite. 3074 `),n(337,"code"),e(338,"CONFIRM_PASSWORD"),t(),e(339," maps to "),n(340,"code"),e(341,'type="password"'),t(),e(342,` deliberately \u2014 3075 omitting it would fall back to `),n(343,"code"),e(344,'type="text"'),t(),e(345,` and expose the value. 3076 `),t(),e(346,` 3077 `),n(347,"div",33),e(348,` 3078 `),n(349,"table",34),e(350,` 3079 `),n(351,"thead"),e(352,` 3080 `),n(353,"tr"),e(354,` 3081 `),n(355,"th",35),e(356,"ID"),t(),e(357,` 3082 `),n(358,"th",36),e(359,"Name"),t(),e(360,` 3083 `),n(361,"th",37),e(362,"Renders"),t(),e(363,` 3084 `),n(364,"th"),e(365,"Live"),t(),e(366,` 3085 `),t(),e(367,` 3086 `),t(),e(368,` 3087 `),n(369,"tbody"),e(370,` 3088 `),S(371,Jm,20,12,null,null,Ml),t(),e(373,` 3089 `),t(),e(374,` 3090 `),t(),e(375,` 3091 3092 `),n(376,"h4",32),e(377,"HTML_TEXT"),t(),e(378,`
3093 `),n(379,"app-sg-caption",1),e(380,"TinyMCE, configured by DynamicFormService.tinySettings"),t(),e(381,` 3094 `),c(382,"app-dynamic-form-field",38),e(383,` 3095 3096 `),t(),e(384,` 3097`),t(),e(385,` 3098 3099`),n(386,"div",39),e(387,` 3100 `),n(388,"h3"),e(389,"The four form modes"),t(),e(390,` 3101 `),n(391,"app-sg-caption",1),e(392,"app/shared/modules/form/dynamic-form \u2014 334 templates"),t(),e(393,` 3102 `),n(394,"p",2),e(395,` 3103 These four are form-level rather than field-level, so they are fixed samples rather than 3104 panel-driven. Each carries its own `),n(396,"code"),e(397,"formID"),t(),e(398,`, because 3105 `),n(399,"code"),e(400,"DynamicFormService"),t(),e(401,` is provided by the module rather than per component: one 3106 instance serves the whole tab and filters submits by that id. Submit one and the others stay 3107 quiet \u2014 without unique ids they would all light up together. 3108 `),t(),e(402,` 3109 3110 `),n(403,"h4",32),e(404,"Auto-render, vertical"),t(),e(405,` 3111 `),n(406,"app-sg-caption",40),e(407,"[fields] only \u2014 the component loops. 7 of 334 templates."),t(),e(408,` 3112 `),n(409,"app-dynamic-form",41),e(410,` 3113 `),t(),e(411,` 3114 3115 `),n(412,"h4",32),e(413,"Auto-render, horizontal"),t(),e(414,` 3116 `),n(415,"app-sg-caption",40),e(416,'[horizontalForm]="true" \u2014 77 templates carry .horizontal-form'),t(),e(417,` 3117 `),n(418,"p",2),e(419,` 3118 The same field array. `),n(420,"code"),e(421,".horizontal-form"),t(),e(422,` moves the label beside the control and 3119 carries roughly 180 lines of nested per-control overrides in 3120 `),n(423,"code"),e(424,"2_layout/forms.scss"),t(),e(425,". Three other classes \u2014 "),n(426,"code"),e(427,".form-dropdown"),t(),e(428,`, 3121 `),n(429,"code"),e(430,".wide-label"),t(),e(431,", "),n(432,"code"),e(433,".inline-form"),t(),e(434,` \u2014 only do anything inside it. 3122 `),t(),e(435,` 3123 `),n(436,"app-dynamic-form",42),e(437,` 3124 `),t(),e(438,` 3125 3126 `),n(439,"h4",32),e(440,"Content-projection mode \u2014 the house style"),t(),e(441,` 3127 `),n(442,"app-sg-caption",40),e(443,'[contentFieldsMode]="true" \u2014 327 of 334 templates'),t(),e(444,` 3128 `),n(445,"p",2),e(446,` 3129 The host places each field by `),n(447,"code"),e(448,"fieldName"),t(),e(449,` and supplies its own column classes. 3130 This is how every multi-column form in the app is built; there is no column or section 3131 primitive in the metadata. 3132 `),t(),e(450,` 3133 `),n(451,"app-dynamic-form",43),e(452,` 3134 `),n(453,"div",44),e(454,` 3135 `),c(455,"app-dynamic-form-field",45),e(456,` 3136 `),c(457,"app-dynamic-form-field",46),e(458,` 3137 `),c(459,"app-dynamic-form-field",47),e(460,` 3138 `),t(),e(461,` 3139 `),t(),e(462,` 3140 `),n(463,"pre",48),e(464,`<app-dynamic-form [contentFieldsMode]="true" [fields]="fields" [entity]="entity"> 3141 <div class="form-row"> 3142 <app-dynamic-form-field fieldName="city" styleClass="d-inline-block col-6 pl-0"></app-dynamic-form-field> 3143 <app-dynamic-form-field fieldName="state" styleClass="d-inline-block col-3"></app-dynamic-form-field> 3144 </div> 3145</app-dynamic-form>`),t(),e(465,` 3146 3147 `),n(466,"h4",32),e(467,"View-only mode"),t(),e(468,` 3148 `),n(469,"app-sg-caption",40),e(470,'[viewOnly]="true" \u2014 every field type has its own read-only rendering'),t(),e(471,` 3149 `),n(472,"app-dynamic-form",49),e(473,` 3150 `),t(),e(474,` 3151 `),n(475,"p",2),e(476,` 3152 The read-only values render into `),n(477,"code"),e(478,'<span class="f-value">'),t(),e(479,`. No stylesheet in 3153 the app declares `),n(480,"code"),e(481,".f-value"),t(),e(482,` \u2014 see the 3154 `),n(483,"a",50),e(484,"Defects"),t(),e(485,` tab. 3155 `),t(),e(486,` 3156`),t(),e(487,` 3157 3158`),n(488,"div",51),e(489,` 3159 `),n(490,"h3"),e(491,"Two things that bite when you build a field by hand"),t(),e(492,` 3160 `),n(493,"app-sg-caption",1),e(494,"found by building this tab"),t(),e(495,` 3161 `),n(496,"p",2),e(497,` 3162 `),n(498,"strong")(499,"code"),e(500,"DynamicFormField.controlName"),t(),e(501," is typed optional and is mandatory."),t(),e(502,` 3163 `),n(503,"code"),e(504,"dynamic-form-field.model.ts:237"),t(),e(505,` is 3164 `),n(506,"code"),e(507,"this.controlName = fieldOptions.controlName.replace(regex, '')"),t(),e(508,` \u2014 an 3165 unguarded dereference. Both `),n(509,"code"),e(510,"DynamicFormField"),t(),e(511,` and 3166 `),n(512,"code"),e(513,"DynamicFormFieldOptions"),t(),e(514," declare it "),n(515,"code"),e(516,"controlName?: string"),t(),e(517,`, and every 3167 sibling property in that constructor has a `),n(518,"code"),e(519,"||"),t(),e(520,` or ternary default 3168 (`),n(521,"code"),e(522,"name"),t(),e(523," even defaults to "),n(524,"code"),e(525,"key"),t(),e(526,`). So 3169 `),n(527,"code"),e(528),t(),e(529,` throws at 3170 construction. It never shows up in production because every real field arrives from backend 3171 metadata with `),n(530,"code"),e(531,"ControlName"),t(),e(532," populated, and "),n(533,"code"),e(534,"strictNullChecks"),t(),e(535,` is off so 3172 the compiler cannot flag it. The one-line fix is 3173 `),n(536,"code"),e(537,"fieldOptions.controlName || fieldOptions.key"),t(),e(538,`. Not applied \u2014 this page 3174 documents, it does not repair. 3175 `),t(),e(539,` 3176 `),n(540,"p",2),e(541,` 3177 `),n(542,"strong"),e(543,"Never bind "),n(544,"code"),e(545,'[fields]="aGetter()"'),t(),e(546," or "),n(547,"code"),e(548),t(),e(549,` 3178 inline.`),t(),e(550," Both hand "),n(551,"code"),e(552,"DynamicFormComponent"),t(),e(553,` a fresh reference on every 3179 change-detection pass, and its `),n(554,"code"),e(555,"ngOnChanges"),t(),e(556,` rebuilds the entire form each time 3180 \u2014 every keystroke resets the control you are typing into. Every field array and entity 3181 on this tab is a stable `),n(557,"code"),e(558,"readonly"),t(),e(559,` property for exactly that reason, which is also 3182 why the permutation panel mutates the existing field objects instead of building new ones. 3183 `),t(),e(560,` 3184`),t(),e(561,` 3185`)),s&2&&(i(31),T("ngModel",o.state.required),m("binary",!0),i(8),T("ngModel",o.state.disabled),m("binary",!0),i(14),T("ngModel",o.state.viewOnly),m("binary",!0),i(13),T("ngModel",o.state.showError),m("binary",!0),i(19),T("ngModel",o.state.note),m("binary",!0),i(10),T("ngModel",o.state.noteTooltip),m("binary",!0),i(10),T("ngModel",o.state.labelTooltip),m("binary",!0),i(10),T("ngModel",o.state.placeholder),m("binary",!0),i(10),T("ngModel",o.state.characterCount),m("binary",!0),i(11),T("ngModel",o.state.fieldHeader),m("binary",!0),i(18),E(o.labelModes),i(8),E(o.layoutModes),i(10),E(o.labelModes),i(6),E(o.layoutModes),i(117),m("fields",o.allTypeFields)("entity",o.emptyEntity)("contentFieldsMode",!0)("showSubmitButton",!1)("horizontalForm",o.state.layout==="horizontal")("formClass",o.formStyleClass),i(29),E(o.fieldTypeRows),i(47),E(o.textBoxRows),i(38),m("fields",o.verticalFields)("entity",o.emptyEntity)("showCancelButton",!0),i(27),m("fields",o.horizontalFields)("entity",o.emptyEntity)("horizontalForm",!0)("showCancelButton",!0),i(15),m("fields",o.projectedFields)("entity",o.emptyEntity)("contentFieldsMode",!0),i(21),m("fields",o.viewOnlyFields)("entity",o.viewOnlyEntity)("viewOnly",!0)("horizontalForm",!0),i(11),m("routerLink","../defects"),i(45),q("new DynamicFormField(","{"," key: 'x', label: 'X' ","}",")"),i(20),f('[entity]="',"{}",'"'))},dependencies:[U,H,Be,Ne,$,Oe,tt,X],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var $i=(a,r)=>r.idiom,Zm=(a,r)=>r.slot,ec=(a,r)=>r.label,tc=(a,r)=>r.markup;function nc(a,r){if(a&1&&(e(0,` 3186 `),n(1,"tr"),e(2,` 3187 `),n(3,"td")(4,"code",85),e(5),t()(),e(6,` 3188 `),n(7,"td",5),e(8),t(),e(9,` 3189 `),n(10,"td",85),e(11),t(),e(12,`
3190 `),n(13,"td"),c(14,"app-sg-verdict",86),t(),e(15,` 3191 `),t(),e(16,` 3192 `)),a&2){let l=r.$implicit;i(5),p(l.idiom),i(3),p(l.home),i(3),p(l.files||"\u2014"),i(3),m("verdict",l.verdict)}}function ic(a,r){if(a&1&&(e(0,` 3193 `),n(1,"tr"),e(2,` 3194 `),n(3,"td")(4,"code",85),e(5),t()(),e(6,` 3195 `),n(7,"td",85),e(8),t(),e(9,` 3196 `),n(10,"td",5),e(11),t(),e(12,` 3197 `),n(13,"td",85),e(14),t(),e(15,` 3198 `),n(16,"td",85),e(17),t(),e(18,` 3199 `),t(),e(19,` 3200 `)),a&2){let l=r.$implicit;i(5),p(l.slot),i(3),p(l.host),i(3),p(l.kind),i(3),p(l.what),i(3),p(l.files)}}function ac(a,r){if(a&1&&(e(0,` 3201 `),n(1,"option",87),e(2),t(),e(3,` 3202 `)),a&2){let l=r.$implicit;i(),m("ngValue",l.value),i(),p(l.label)}}function rc(a,r){a&1&&(e(0," "),n(1,"span",71),e(2,"*"),t(),e(3," "))}function oc(a,r){a&1&&(e(0," "),n(1,"span",89),e(2,"*"),t(),e(3," "))}function lc(a,r){a&1&&(e(0," "),n(1,"span",90),e(2,"*"),t(),e(3," "))}function sc(a,r){a&1&&(e(0," "),n(1,"span",91),e(2,"*"),t(),e(3," "))}function dc(a,r){a&1&&(e(0," "),n(1,"span",92),e(2," *"),t(),e(3," "))}function mc(a,r){a&1&&(e(0," "),n(1,"span",93),e(2,"*"),t(),e(3," "))}function cc(a,r){a&1&&(e(0," "),n(1,"span"),e(2,"*"),t(),e(3," "))}function pc(a,r){if(a&1&&(e(0,` 3203 `),n(1,"tr"),e(2,` 3204 `),n(3,"td"),e(4,` 3205 `),n(5,"span",88),e(6,` 3206 `),v(7,rc,4,0)(8,oc,4,0)(9,lc,4,0)(10,sc,4,0)(11,dc,4,0)(12,mc,4,0)(13,cc,4,0),e(14,` 3207 `),t(),e(15,` 3208 `),t(),e(16,` 3209 `),n(17,"td")(18,"code",85),e(19),t()(),e(20,` 3210 `),n(21,"td",85),e(22),t(),e(23,` 3211 `),n(24,"td",5),e(25),t(),e(26,` 3212 `),n(27,"td"),c(28,"app-sg-verdict",86),t(),e(29,` 3213 `),t(),e(30,` 3214 `)),a&2){let l,d=r.$implicit;i(7),y((l=d.kind)==="asterisk-aria"?7:l==="asterisk-no-aria"?8:l==="text-danger"?9:l==="required"?10:l==="text-red"?11:l==="indicator"?12:13),i(12),p(d.markup),i(3),p(d.uses),i(3),p(d.defined),i(3),m("verdict",d.verdict)}}function xc(a,r){if(a&1&&(e(0,` 3215 `),n(1,"tr"),e(2,` 3216 `),n(3,"td")(4,"code",85),e(5),t()(),e(6,` 3217 `),n(7,"td",5),e(8),t(),e(9,` 3218 `),n(10,"td",85),e(11),t(),e(12,` 3219 `),n(13,"td",85),e(14),t(),e(15,` 3220 `),n(16,"td"),c(17,"app-sg-verdict",86),t(),e(18,` 3221 `),t(),e(19,` 3222 `)),a&2){let l=r.$implicit;i(5),p(l.idiom),i(3),p(l.home),i(3),p(l.uses),i(3),p(l.files),i(3),m("verdict",l.verdict)}}function hc(a,r){if(a&1&&(e(0,` 3223 `),n(1,"tr"),e(2,` 3224 `),n(3,"td")(4,"code",85),e(5),t()(),e(6,` 3225 `),n(7,"td",5),e(8),t(),e(9,` 3226 `),n(10,"td",85),e(11),t(),e(12,` 3227 `),n(13,"td",85),e(14),t(),e(15,` 3228 `),n(16,"td"),c(17,"app-sg-verdict",86),t(),e(18,` 3229 `),t(),e(19,` 3230 `)),a&2){let l=r.$implicit;i(5),p(l.idiom),i(3),p(l.home),i(3),p(l.uses),i(3),p(l.files),i(3),m("verdict",l.verdict)}}var Al=(()=>{let r=class r{constructor(){this.layoutAxes=ul,this.slots=gl,this.asterisks=fl,this.errorIdioms=bl,this.footerIdioms=Sl,this.demoOptions=ft,this.linkOrigin="yourclub.sprocketsports.com",this.slotFields=[new z({key:"customURL",controlName:"customURL",label:"Custom URL"})],this.emptyEntity={},this.demo={}}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-forms-layout"]],standalone:!1,decls:664,vars:13,consts:[["inputGroupStart",""],["inputGroupEnd",""],[3,"compact"],["id","axes",1,"card"],["side","shared"],[1,"text-small","text-grey"],[3,"routerLink"],[1,"overflow-x-auto"],[1,"table","table-bordered","sg-doc-table"],[2,"width","20rem"],[2,"width","6rem"],[2,"width","8rem"],["id","slots",1,"card"],[2,"width","15rem"],[2,"width","5rem"],[1,"text-medium-large","mt-4"],["side","admin"],["formID","sgSlots","submitButtonText","Save",3,"fields","entity","contentFieldsMode","showCancelButton"],["beforeFormContent","",1,"sg-slot-outline","p-2","mb-2","text-smallest"],["beforeFormFieldsContent","",1,"sg-slot-outline","p-2","mb-2","text-smallest"],["fieldName","customURL"],[1,"text-smallest"],["afterInputContent","",1,"sg-slot-outline","p-2","mt-1","text-smallest"],["extraMessage","",1,"sg-slot-outline","p-2","mt-1","text-smallest"],["beforeSubmitButtonsContent","",1,"sg-slot-outline","p-2","mb-2","text-smallest"],["afterSubmitButtonsContent","",1,"sg-slot-outline","p-2","mt-2","text-smallest"],["afterFormContent","",1,"sg-slot-outline","p-2","mt-2","text-smallest"],["id","labels",1,"card"],[1,"row"],[1,"col-md-6"],[1,"form-group"],["for","sgNativeSelect"],["id","sgNativeSelect","name","sgNativeSelect",3,"ngModelChange","ngModel"],["for","sgPrimeSelect"],["inputId","sgPrimeSelect","optionLabel","label","optionValue","value","appendTo","body","styleClass","full-width",3,"ngModelChange","options","ngModel"],[1,"bg-grey-lt","border-all","border-radius","p-3","text-medium","overflow-x-auto"],["
3230id","asterisk",1,"card"],[2,"width","26rem"],[2,"width","4rem"],["id","errors",1,"card"],[2,"width","18rem"],[1,"col-md-4"],[1,"form-group","form-error"],["for","sgErrField"],["id","sgErrField","type","text","value","not-an-email","readonly",""],[1,"form-error-message"],[1,"form-error"],["alertType","error",3,"isInline"],["id","footers",1,"card"],[1,"row","form-action","no-gutters"],[1,"col","left-buttons"],["type","button",1,"btn","btn-lg"],[1,"col","right-buttons","text-right"],["type","button",1,"btn","btn-primary","btn-lg"],["slot","secondary"],["type","button",1,"btn"],["slot","primary"],["type","button",1,"btn","btn-primary"],["id","dividers",1,"card"],["for","sgSecA"],["id","sgSecA","type","text","placeholder","Enter text"],[1,"form-section"],["for","sgSecB"],["id","sgSecB","type","text","placeholder","Enter text"],["id","contracts-live",1,"card"],[1,"form-row"],["for","sgRowA"],["id","sgRowA","type","text","placeholder","Enter text"],["for","sgRowB"],["id","sgRowB","type","text","placeholder","Enter text"],["for","sgNote"],["aria-hidden","true",1,"required-asterisk"],["id","sgNote","type","text","placeholder","00"],[1,"form-note"],[1,"form-note-text"],[1,"form-label"],[1,"form-input-group"],[1,"form-check","form-check-inline"],["name","sgPref","value","email","inputId","sgPrefEmail"],["for","sgPrefEmail"],["name","sgPref","value","sms","inputId","sgPrefSms"],["for","sgPrefSms"],[1,"form-container"],["for","sgContained"],["
3230id","sgContained","type","text","placeholder","[email protected]"],[1,"text-small"],[3,"verdict"],[3,"ngValue"],[1,"form-group","d-inline-block","pl-3","mb-0"],[1,"required-asterisk"],[1,"text-danger"],[1,"required"],[1,"text-red"],[1,"required-indicator"]],template:function(s,o){if(s&1){let x=B();c(0,"app-sg-verdict-legend",2),e(1,` 3231 3232`),n(2,"div",3),e(3,` 3233 `),n(4,"h3"),e(5,"The layout axes"),t(),e(6,` 3234 `),n(7,"app-sg-caption",4),e(8,"what makes two dynamic forms look different"),t(),e(9,` 3235 `),n(10,"p",5),e(11,` 3236 The system has no grid, section, fieldset, tab or step primitive. Layout is a handful of 3237 booleans plus whatever Bootstrap classes the host injects per field, which is why the counts 3238 below are so lopsided \u2014 one axis is used by nearly everything and the rest by a handful 3239 of screens each. Flip between them live on the 3240 `),n(12,"a",6),e(13,"Fields"),t(),e(14,` tab. 3241 `),t(),e(15,` 3242 `),n(16,"div",7),e(17,` 3243 `),n(18,"table",8),e(19,` 3244 `),n(20,"thead"),e(21,` 3245 `),n(22,"tr"),e(23,` 3246 `),n(24,"th",9),e(25,"Axis"),t(),e(26,` 3247 `),n(27,"th"),e(28,"Home"),t(),e(29,` 3248 `),n(30,"th",10),e(31,"Files"),t(),e(32,` 3249 `),n(33,"th",11),e(34,"Verdict"),t(),e(35,` 3250 `),t(),e(36,` 3251 `),t(),e(37,` 3252 `),n(38,"tbody"),e(39,` 3253 `),S(40,nc,17,4,null,null,$i),t(),e(42,` 3254 `),t(),e(43,` 3255 `),t(),e(44,` 3256 `),n(45,"p",5),e(46,` 3257 `),n(47,"code"),e(48,"fieldContainerClass"),t(),e(49,` is set from the backend \u2014 the registration-agent view 3258 models declare `),n(50,"code"),e(51,"TwoUpLeft"),t(),e(52," / "),n(53,"code"),e(54,"TwoUpRight"),t(),e(55,` as 3259 `),n(56,"code"),e(57,"d-inline-block half-width align-top"),t(),e(58,` pairs, and two controllers stamp 3260 `),n(59,"code"),e(60,"form-group-md"),t(),e(61,` onto every field. So a form's column layout can be decided in C#, 3261 in the Angular host, or in neither, and nothing on the field says which. 3262 `),t(),e(62,` 3263`),t(),e(63,` 3264 3265`),n(64,"div",12),e(65,` 3266 `),n(66,"h3"),e(67,"The projection slots"),t(),e(68,` 3267 `),n(69,"app-sg-caption",4),e(70,"thirteen named slots \u2014 the extension API"),t(),e(71,` 3268 `),n(72,"p",5),e(73,` 3269 This is how the 327 projection-mode hosts add anything the metadata cannot describe: a URL 3270 prefix, a unit suffix, a reset link, an extra message under a control. 3271 `),n(74,"code"),e(75,"app-dynamic-form"),t(),e(76,` exposes six slots and 3272 `),n(77,"code"),e(78,"app-dynamic-form-field"),t(),e(79," exposes seven. Two are "),n(80,"code"),e(81,"TemplateRef"),t(),e(82,`s reached 3273 by a template reference variable; the rest are attribute selectors on a projected element. 3274 `),t(),e(83,` 3275 `),n(84,"div",7),e(85,` 3276 `),n(86,"table",8),e(87,` 3277 `),n(88,"thead"),e(89,` 3278 `),n(90,"tr"),e(91,` 3279 `),n(92,"th",13),e(93,"Slot"),t(),e(94,` 3280 `),n(95,"th",10),e(96,"Host"),t(),e(97,` 3281 `),n(98,"th",11),e(99,"Kind"),t(),e(100,` 3282 `),n(101,"th"),e(102,"Where it lands"),t(),e(103,` 3283 `),n(104,"th",14),e(105,"Files"),t(),e(106,` 3284 `),t(),e(107,` 3285 `),t(),e(108,` 3286 `),n(109,"tbody"),e(110,` 3287 `),S(111,ic,20,5,null,null,Zm),t(),e(113,` 3288 `),t(),e(114,` 3289 `),t(),e(115,` 3290 3291 `),n(116,"h4",15),e(117,"All six form slots, filled and outlined"),t(),e(118,` 3292 `),n(119,"app-sg-caption",16),e(120,"each dashed box is one slot"),t(),e(121,` 3293 `),n(122,"app-dynamic-form",17),e(123,` 3294 `),n(124,"div",18),e(125,"beforeFormContent \u2014 outside the <form>"),t(),e(126,` 3295 `),n(127,"div",19),e(128,"beforeFormFieldsContent \u2014 inside the <form>, above the fields"),t(),e(129,` 3296 `),n(130,"app-dynamic-form-field",20),e(131,` 3297 `),O(132,0,0),e(134,` 3298 `),n(135,"span",21),e(136),t(),e(137,` 3299 `),N(),e(138,` 3300 `),O(139,1,1),e(141,` 3301 `),n(142,"span",21),e(143,".html"),t(),e(144,` 3302 `),N(),e(145,` 3303 `),n(146,"div",22),e(147,"afterInputContent"),t(),e(148,` 3304 `),n(149,"div",23),e(150,"extraMessage"),t(),e(151,` 3305 `),t(),e(152,` 3306 `),n(153,"div",24),e(154,"beforeSubmitButtonsContent"),t(),e(155,` 3307 `),n(156,"div",25),e(157,"afterSubmitButtonsContent"),t(),e(158,` 3308 `),n(159,"div",26),e(160,"afterFormContent \u2014 outside the <form>"),t(),e(161,` 3309 `),t(),e(162,` 3310 `),n(163,"p",5),e(164,` 3311 The `),n(165,"code"),e(166,"inputGroupStart"),t(),e(167," / "),n(168,"code"),e(169,"inputGroupEnd"),t(),e(170,` pair is the only one in wide 3312 use \u2014 12 and 14 templates. It renders a real `),n(171,"code"),e(172,"p-inputgroup-addon"),t(),e(173,` around 3313 the control, which is why the prefix sits flush against the input rather than beside it. 3314 Note the `),n(174,"code"),e(175,"#inputGroupStart"),t(),e(176," template reference variable "),n(177,"em"),e(178,"and"),t(),e(179,` the bare 3315 `),n(180,"code"),e(181,"inputGroupStart"),t(),e(182,` attribute: the component declares both a 3316 `),n(183,"code"),e(184,"@ContentChild"),t(),e(185," and an "),n(186,"code"),e(187,"ng-content select"),t(),e(188,`, and the CMS settings rail 3317 supplies both. The attribute is what actually projects. 3318 `),t(),e(189,` 3319`),t(),e(190,` 3320 3321`),n(191,"div",27),e(192,` 3322 `),n(193,"h3"),e(194,"Labels"),t(),e(195,` 3323 `),n(196,"app-sg-caption",4),e(197,"1,657 labels across ~315 templates"),t(),e(198,` 3324 `),n(199,"p",5),e(200,` 3325 `),n(201,"strong"),e(202,"723 of 1,657 labels carry a "),n(203,"code"),e(204,"for"),t(),e(205," attribute"),t(),e(206,` \u2014 44%. The 3326 most common label class in the app is `),n(207,"code"),e(208,"sr-only"),t(),e(209,` (161 uses): a visually hidden 3327 label on a search box or filter. That is a legitimate pattern, and it is also why the raw 3328 label count overstates how many labels a user can see. 3329 `),t(),e(210,` 3330 `),n(211,"p",5),e(212,` 3331 The pairing rule differs by control, which is most of why the gap exists. A native input 3332 takes `),n(213,"code"),e(214,"for"),t(),e(215," \u2192 "),n(216,"code"),e(217,"id"),t(),e(218,`. A PrimeNG control renders its own inner 3333 element, so the label must point at `),n(219,"code"),e(220,"inputId"),t(),e(221,`, not at the component's 3334 `),n(222,"code"),e(223,"id"),t(),e(224,`. Both correct forms are below; the third, which looks identical and does 3335 nothing, is on the `),n(225,"a",6),e(226,"Defects"),t(),e(227,` tab. 3336 `),t(),e(228,` 3337 `),n(229,"div",28),e(230,` 3338 `),n(231,"div",29),e(232,` 3339 `),n(233,"app-sg-caption",16),e(234,"native \u2014 for \u2192 id"),t(),e(235,` 3340 `),n(236,"div",30),e(237,` 3341 `),n(238,"label",31),e(239,"Season"),t(),e(240,` 3342 `),n(241,"select",32),M("ngModelChange",function(_){return w(x),I(o.demo.nativeSelect,_)||(o.demo.nativeSelect=_),C(_)}),e(242,` 3343 `),S(243,ac,4,2,null,null,ec),t(),e(245,` 3344 `),t(),e(246,` 3345 `),t(),e(247,` 3346 `),n(248,"div",29),e(249,` 3347 `),n(250,"app-sg-caption",16),e(251,"PrimeNG \u2014 for \u2192 inputId"),t(),e(252,` 3348 `),n(253,"div",30),e(254,` 3349 `),n(255,"label",33),e(256,"Season"),t(),e(257,` 3350 `),n(258,"p-select",34),M("ngModelChange",function(_){return w(x),I(o.demo.primeSelect,_)||(o.demo.primeSelect=_),C(_)}),t(),e(259,` 3351 `),t(),e(260,` 3352 `),t(),e(261,` 3353 `),t(),e(262,` 3354 `),n(263,"pre",35),e(264,`<label for="season">Season</label> 3355<select id="season">\u2026</select> <!-- native: for -> id --> 3356<p-select inputId="season"></p-select> <!-- PrimeNG: for -> inputId -->`),t(),e(265,` 3357`),t(),e(266,` 3358 3359`),n(267,"div",36),e(268,` 3360 `),n(269,"h3"),e(270,"Required markers"),t(),e(271,` 3361 `),n(272,"app-sg-caption",4),e(273,"seven markups for one idea"),t(),e(274,` 3362 `),n(275,"p",5),e(276,` 3363 Seven different spans mark a field required, rendered below in order of how often they are 3364 used. Three of the seven reference classes that `),n(277,"strong"),e(278,`no global stylesheet 3365 declares`),t(),e(279,`, so those asterisks inherit body colour instead of the orange the design 3366 intends. `),n(280,"strong"),e(281,"28 of the 74 required markers in the app render unstyled"),t(),e(282,` \u2014 3367 and because the markup reads as deliberate at every call site, nothing about the template 3368 suggests it. 3369 `),t(),e(283,` 3370 `),n(284,"div",7),e(285,` 3371 `),n(286,"table",8),e(287,` 3372 `),n(288,"thead"),e(289,` 3373 `),n(290,"tr"),e(291,` 3374 `),n(292,"th",14),e(293,"Rendered"),t(),e(294,` 3375 `),n(295,"th",37),e(296,"Markup"),t(),e(297,` 3376 `),n(298,"th",38),e(299,"Uses"),t(),e(300,` 3377 `),n(301,"th"),e(302,"Declared"),t(),e(303,` 3378 `),n(304,"th",11),e(305,"Verdict"),t(),e(306,` 3379 `),t(),e(307,` 3380 `),t(),e(308,` 3381 `),n(309,"tbody"),e(310,` 3382 `),S(311,pc,31,5,null,null,tc),t(),e(313,` 3383 `),t(),e(314,` 3384 `),t(),e(315,` 3385 `),n(316,"p",5),e(317,` 3386 One more thing the rendering shows: `),n(318,"code"),e(319,".required-asterisk"),t(),e(320,` is 3387 `),n(321,"code"),e(322,"position: absolute; left: -0.4rem"),t(),e(323,`, so it only lands correctly inside a 3388 positioned `),n(324,"code"),e(325,".form-group"),t(),e(326,`. The cells above are wrapped in one for exactly that 3389 reason \u2014 drop the same span into an unpositioned container and it flies to the nearest 3390 positioned ancestor. 3391 `),t(),e(327,` 3392`),t(),e(328,` 3393 3394`),n(329,"div",39),e(330,` 3395 `),n(331,"h3"),e(332,"Validation display"),t(),e(333,` 3396 `),n(334,"app-sg-caption",4),e(335,"eleven idioms, three of them systematic"),t(),e(336,` 3397 `),n(337,"p",5),e(338,` 3398 There is no shared validation-message component. The dynamic form has two of its own 3399 \u2014 a per-field `),n(339,"code"),e(340,".form-error-message"),t(),e(341,` and a form-level 3400 `),n(342,"code"),e(343,".form-error"),t(),e(344," \u2014 and "),n(345,"code"),e(346,"app-inline-alert"),t(),e(347,` covers everything that is 3401 a notice rather than a field error. The remaining eight are ad hoc. Bootstrap's 3402 `),n(348,"code"),e(349,"is-invalid"),t(),e(350," / "),n(351,"code"),e(352,"invali
3402d-feedback"),t(),e(353,` survives in two files and is the 3403 only genuinely deprecated pair here. 3404 `),t(),e(354,` 3405 `),n(355,"div",7),e(356,` 3406 `),n(357,"table",8),e(358,` 3407 `),n(359,"thead"),e(360,` 3408 `),n(361,"tr"),e(362,` 3409 `),n(363,"th",40),e(364,"Idiom"),t(),e(365,` 3410 `),n(366,"th"),e(367,"Home"),t(),e(368,` 3411 `),n(369,"th",14),e(370,"Uses"),t(),e(371,` 3412 `),n(372,"th",14),e(373,"Files"),t(),e(374,` 3413 `),n(375,"th",11),e(376,"Verdict"),t(),e(377,` 3414 `),t(),e(378,` 3415 `),t(),e(379,` 3416 `),n(380,"tbody"),e(381,` 3417 `),S(382,xc,20,5,null,null,$i),t(),e(384,` 3418 `),t(),e(385,` 3419 `),t(),e(386,` 3420 3421 `),n(387,"h4",15),e(388,"The three systematic ones, rendered"),t(),e(389,` 3422 `),n(390,"div",28),e(391,` 3423 `),n(392,"div",41),e(393,` 3424 `),n(394,"app-sg-caption",4),e(395,".form-error-message \u2014 per field"),t(),e(396,` 3425 `),n(397,"div",42),e(398,` 3426 `),n(399,"label",43),e(400,"Email"),t(),e(401,` 3427 `),c(402,"input",44),e(403,` 3428 `),n(404,"div",45),e(405,"Email must be a valid email address"),t(),e(406,` 3429 `),t(),e(407,` 3430 `),t(),e(408,` 3431 `),n(409,"div",41),e(410,` 3432 `),n(411,"app-sg-caption",4),e(412,".form-error \u2014 form level"),t(),e(413,`
3433 `),n(414,"div",46),e(415,"That season is already published."),t(),e(416,` 3434 `),t(),e(417,` 3435 `),n(418,"div",41),e(419,` 3436 `),n(420,"app-sg-caption",4),e(421,"app-inline-alert \u2014 324 templates"),t(),e(422,` 3437 `),n(423,"app-inline-alert",47),e(424,` 3438 Fix the highlighted fields before saving. 3439 `),t(),e(425,` 3440 `),t(),e(426,` 3441 `),t(),e(427,` 3442 `),n(428,"p",5),e(429,` 3443 To see the dynamic form produce these itself rather than by hand, use the 3444 `),n(430,"strong"),e(431,"show error"),t(),e(432," switch on the "),n(433,"a",6),e(434,"Fields"),t(),e(435,` tab. 3445 `),n(436,"code"),e(437,".text-danger"),t(),e(438,` appears 83 times as an error treatment and has no global 3446 declaration \u2014 the same finding as the required markers, at four times the scale. 3447 `),t(),e(439,` 3448`),t(),e(440,` 3449 3450`),n(441,"div",48),e(442,` 3451 `),n(443,"h3"),e(444,"Action rows"),t(),e(445,` 3452 `),n(446,"app-sg-caption",4),e(447,"two systems and a long ad-hoc tail"),t(),e(448,` 3453 `),n(449,"p",5),e(450,` 3454 Where the buttons go has two real answers \u2014 `),n(451,"code"),e(452,".form-action"),t(),e(453,` when the dynamic 3455 form owns the row, `),n(454,"code"),e(455,"app-dialog-footer"),t(),e(456,` when a dialog does \u2014 and several 3456 hundred hand-rolled flex rows that arrive at approximately the same place. 3457 `),t(),e(457,` 3458 `),n(458,"div",7),e(459,` 3459 `),n(460,"table",8),e(461,` 3460 `),n(462,"thead"),e(463,` 3461 `),n(464,"tr"),e(465,` 3462 `),n(466,"th",9),e(467,"Idiom"),t(),e(468,` 3463 `),n(469,"th"),e(470,"Home"),t(),e(471,` 3464 `),n(472,"th",14),e(473,"Uses"),t(),e(474,` 3465 `),n(475,"th",14),e(476,"Files"),t(),e(477,` 3466 `),n(478,"th",11),e(479,"Verdict"),t(),e(480,` 3467 `),t(),e(481,` 3468 `),t(),e(482,` 3469 `),n(483,"tbody"),e(484,` 3470 `),S(485,hc,20,5,null,null,$i),t(),e(487,` 3471 `),t(),e(488,` 3472 `),t(),e(489,` 3473 3474 `),n(490,"h4",15),e(491,"The two systems rendered"),t(),e(492,` 3475 `),n(493,"app-sg-caption",16),e(494,'.form-action \u2014 buttonsPosition="spread"'),t(),e(495,` 3476 `),n(496,"div",49),e(497,` 3477 `),n(498,"div",50),e(499,` 3478 `),n(500,"button",51),e(501,"Cancel"),t(),e(502,` 3479 `),t(),e(503,` 3480 `),n(504,"div",52),e(505,` 3481 `),n(506,"button",51),e(507,"Delete"),t(),e(508,` 3482 `),n(509,"button",53),e(510,"Save"),t(),e(511,` 3483 `),t(),e(512,` 3484 `),t(),e(513,` 3485 `),n(514,"app-sg-caption",16),e(515,"app-dialog-footer \u2014 primary / secondary slots"),t(),e(516,` 3486 `),n(517,"app-dialog-footer"),e(518,` 3487 `),O(519,54),e(520,` 3488 `),n(521,"button",55),e(522,"Cancel"),t(),e(523,` 3489 `),N(),e(524,` 3490 `),O(525,56),e(526,` 3491 `),n(527,"button",57),e(528,"Save"),t(),e(529,` 3492 `),N(),e(530,` 3493 `),t(),e(531,` 3494`),t(),e(532,` 3495 3496`),n(533,"div",58),e(534,` 3497 `),n(535,"h3"),e(536,"Section dividers"),t(),e(537,` 3498 `),n(538,"app-sg-caption",4),e(539,"hr.form-section \u2014 66 uses across 26 templates"),t(),e(540,` 3499 `),n(541,"p",5),e(542,` 3500 The one way a long form gets broken into sections, and it is a horizontal rule rather than a 3501 primitive: `),n(543,"code"),e(544,"3_modules/templates.scss:676"),t(),e(545,` styles it only on an 3502 `),n(546,"code"),e(547,"<hr>"),t(),e(548,", so the same class on a "),n(549,"code"),e(550,"<div>"),t(),e(551,` does nothing. 3503 `),t(),e(552,` 3504 `),n(553,"div",30),e(554,` 3505 `),n(555,"label",59),e(556,"Contact name"),t(),e(557,` 3506 `),c(558,"input",60),e(559,` 3507 `),t(),e(560,` 3508 `),c(561,"hr",61),e(562,` 3509 `),n(563,"div",30),e(564,` 3510 `),n(565,"label",62),e(566,"Emergency contact"),t(),e(567,` 3511 `),c(568,"input",63),e(569,` 3512 `),t(),e(570,` 3513`),t(),e(571,` 3514 3515`),n(572,"div",64),e(573,` 3516 `),n(574,"h3"),e(575,"The live layout contracts, rendered"),t(),e(576,` 3517 `),n(577,"app-sg-caption",16),e(578,"the classes a projection-mode host reaches for"),t(),e(579,` 3518 `),n(580,"app-sg-caption",16),e(581,".form-row \u2014 siblings side by side"),t(),e(582,` 3519 `),n(583,"div",65),e(584,` 3520 `),n(585,"div",30),e(586,` 3521 `),n(587,"label",66),e(588,"First Name"),t(),e(589,` 3522 `),c(590,"input",67),e(591,` 3523 `),t(),e(592,` 3524 `),n(593,"div",30),e(594,` 3525 `),n(595,"label",68),e(596,"Last Name"),t(),e(597,` 3526 `),c(598,"input",69),e(599,` 3527 `),t(),e(600,` 3528 `),t(),e(601,` 3529 `),n(602,"app-sg-caption",16),e(603,".form-group with .form-note and a required asterisk"),t(),e(604,` 3530 `),n(605,"div",30),e(606,` 3531 `),n(607,"label",70),e(608,"Jersey Number "),n(609,"span",71),e(610,"*"),t()(),e(611,` 3532 `),c(612,"input",72),e(613,` 3533 `),n(614,"div",73),e(615,` 3534 `),n(616,"div",74),e(617,"Two digits. Must be unique on the roster."),t(),e(618,` 3535 `),t(),e(619,` 3536 `),t(),e(620,` 3537 `),n(621,"app-sg-caption",16),e(622,"legend.form-label + .form-input-group + .form-check-inline"),t(),e(623,` 3538 `),n(624,"div",30),e(625,` 3539 `),n(626,"legend",75),e(627,"Contact preference"),t(),e(628,` 3540 `),n(629,"div",76),e(630,` 3541 `),n(631,"div",77),e(632,` 3542 `),c(633,"p-radioButton",78),e(634,` 3543 `),n(635,"label",79),e(636,"Email"),t(),e(637,` 3544 `),t(),e(638,` 3545 `),n(639,"div",77),e(640,` 3546 `),c(641,"p-radioButton",80),e(642,` 3547 `),n(643,"label",81),e(644,"Text message"),t(),e(645,` 3548 `),t(),e(646,` 3549 `),t(),e(647,` 3550 `),t(),e(648,` 3551 `),n(649,"app-sg-caption",16),e(650,".form-container \u2014 the narrow standalone form wrapper"),t(),e(651,` 3552 `),n(652,"div",82),e(653,`
3553 `),n(654,"div",30),e(655,` 3554 `),n(656,"label",83),e(657,"Email"),t(),e(658,` 3555 `),c(659,"input",84),e(660,` 3556 `),t(),e(661,` 3557 `),t(),e(662,` 3558`),t(),e(663,` 3559`)}s&2&&(m("compact",!0),i(12),m("routerLink","../fields"),i(28),E(o.layoutAxes),i(71),E(o.slots),i(11),m("fields",o.slotFields)("entity",o.emptyEntity)("contentFieldsMode",!0)("showCancelButton",!0),i(14),f("",o.linkOrigin,"/club/"),i(89),m("routerLink","../defects"),i(16),T("ngModel",o.demo.nativeSelect),i(2),E(o.demoOptions),i(15),m("options",o.demoOptions),T("ngModel",o.demo.primeSelect),i(53),E(o.asterisks),i(71),E(o.errorIdioms),i(41),m("isInline",!0),i(10),m("routerLink","../fields"),i(52),E(o.footerIdioms))},dependencies:[Fe,Pe,ya,U,H,Be,Ne,$,le,it,ye,tt,X,ve,we],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var yc=()=>[],wc=(a,r)=>r.name;function Cc(a,r){if(a&1&&(e(0,` 3560 `),n(1,"tr"),e(2,` 3561 `),n(3,"td")(4,"a",132),e(5),t()(),e(6,` 3562 `),n(7,"td")(8,"code",133),e(9),t()(),e(10,` 3563 `),n(11,"td",133),e(12),t(),e(13,` 3564 `),n(14,"td",133),e(15),t(),e(16,` 3565 `),n(17,"td"),c(18,"app-sg-verdict",134),t(),e(19,` 3566 `),t(),e(20,` 3567 `)),a&2){let l=r.$implicit;i(4),m("routerLink",V(7,yc))("fragment",l.anchor),i(),p(l.name),i(4),p(l.home),i(3),p(l.what),i(3),p(l.scale),i(3),m("verdict",l.verdict)}}function _c(a,r){if(a&1){let l=B();e(0,` 3568 `),n(1,"app-dialog-footer"),e(2,` 3569 `),O(3,135),e(4,` 3570 `),n(5,"button",89),g("click",function(){w(l);let s=u();return C(s.dialogOpen=!1)}),e(6,"Cancel"),t(),e(7,` 3571 `),N(),e(8,` 3572 `),O(9,136),e(10,` 3573 `),n(11,"button",81),g("click",function(){w(l);let s=u();return C(s.dialogOpen=!1)}),e(12,"Save"),t(),e(13,` 3574 `),N(),e(14,` 3575 `),t(),e(15,` 3576 `)}}function kc(a,r){if(a&1){let l=B();e(0,` 3577 `),n(1,"div",137),e(2,` 3578 `),n(3,"div",138),e(4,` 3579 `),n(5,"div",139),e(6,` 3580 `),n(7,"span"),e(8,"Add Time Slot(s)"),t(),e(9,` 3581 `),n(10,"app-close-icon",140),g("close",function(){w(l);let s=u();return C(s.sprocketDialogOpen=!1)}),t(),e(11,` 3582 `),t(),e(12,` 3583 `),n(13,"div",141),e(14,` 3584 `),n(15,"div",35),e(16,` 3585 `),n(17,"label",142),e(18,"Start time"),t(),e(19,` 3586 `),c(20,"input",143),e(21,` 3587 `),t(),e(22,` 3588 `),n(23,"app-dialog-footer"),e(24,` 3589 `),O(25,136),e(26,`
3590 `),n(27,"button",81),g("click",function(){w(l);let s=u();return C(s.sprocketDialogOpen=!1)}),e(28,"Add"),t(),e(29,` 3591 `),N(),e(30,` 3592 `),t(),e(31,` 3593 `),t(),e(32,` 3594 `),t(),e(33,` 3595 `),t(),e(34,` 3596 `)}}function Tc(a,r){if(a&1&&(e(0,` 3597 `),n(1,"app-dynamic-form",144),e(2,` 3598 `),n(3,"div",84),e(4,` 3599 `),c(5,"app-dynamic-form-field",145),e(6,` 3600 `),c(7,"app-dynamic-form-field",146),e(8,` 3601 `),t(),e(9,` 3602 `),t(),e(10,` 3603 `)),a&2){let l=u();i(),m("fields",l.wizardStepOneFields)("entity",l.emptyEntity)("contentFieldsMode",!0)("showSubmitButton",!1)("showCancelButton",!1)}}function Ic(a,r){if(a&1&&(e(0,` 3604 `),n(1,"app-dynamic-form",147),e(2,` 3605 `),n(3,"div",84),e(4,` 3606 `),c(5,"app-dynamic-form-field",148),e(6,` 3607 `),c(7,"app-dynamic-form-field",149),e(8,` 3608 `),t(),e(9,` 3609 `),t(),e(10,` 3610 `)),a&2){let l=u();i(),m("fields",l.wizardStepTwoFields)("entity",l.emptyEntity)("contentFieldsMode",!0)("showSubmitButton",!1)("showCancelButton",!1)}}function Mc(a,r){a&1&&(e(0,` 3611 `),n(1,"p",5),e(2,` 3612 The review step reads values off the previous steps' form components \u2014 3613 which is why the host holds a `),n(3,"code"),e(4,"@Vie
3613wChild"),t(),e(5,` per step rather than 3614 one form. 3615 `),t(),e(6,` 3616 `))}var Wl=(()=>{let r=class r{constructor(){this.architectures=El,this.demoOptions=ft,this.demoTeams=kl,this.emptyEntity={},this.cmsFields=[new z({key:"title",controlName:"title",label:"Title",required:!0}),new z({key:"isFeatured",controlName:"isFeatured",label:"Feature this page",dynamicFormFieldTypeID:Y.CHECKBOX}),new z({key:"customURL",controlName:"customURL",label:"Custom URL"}),new z({key:"metaTitle",controlName:"metaTitle",label:"Meta title"}),new z({key:"metaDescription",controlName:"metaDescription",label:"Meta description",dynamicFormFieldTypeID:Y.TEXT_AREA})],this.dialogFields=[new z({key:"dlgFirstName",controlName:"dlgFirstName",label:"First Name",required:!0}),new z({key:"dlgLastName",controlName:"dlgLastName",label:"Last Name",required:!0})],this.drawerFields=[new z({key:"drwSubject",controlName:"drwSubject",label:"Subject"}),new z({key:"drwBody",controlName:"drwBody",label:"Message",dynamicFormFieldTypeID:Y.TEXT_AREA})],this.wizardStepOneFields=[new z({key:"wzName",controlName:"wzName",label:"Program Name",required:!0}),new z({key:"wzSeason",controlName:"wzSeason",label:"Season",dynamicFormFieldTypeID:Y.DROPDOWN,options:[{label:"Spring 2026",value:1},{label:"Fall 2026",value:2}]})],this.wizardStepTwoFields=[new z({key:"wzFee",controlName:"wzFee",label:"Registration Fee"}),new z({key:"wzCap",controlName:"wzCap",label:"Roster Cap"})],this.tabbedOneFields=[new z({key:"tabName",controlName:"tabName",label:"Team Name"})],this.tabbedTwoFields=[new z({key:"tabColor",controlName:"tabColor",label:"Team Color"})],this.accordionFields=[new z({key:"accVisible",controlName:"accVisible",label:"Visible to parents",dynamicFormFieldTypeID:Y.CHECKBOX}),new z({key:"accNotes",controlName:"accNotes",label:"Internal notes",dynamicFormFieldTypeID:Y.TEXT_AREA})],this.stickyFields=[new z({key:"stA",controlName:"stA",label:"Address Line 1"}),new z({key:"stB",controlName:"stB",label:"Address Line 2"}),new z({key:"stC",controlName:"stC",label:"City"}),new z({key:"stD",controlName:"stD",label:"State"}),new z({key:"stE",controlName:"stE",label:"Zip"}),new z({key:"stF",controlName:"stF",label:"Country"})],this.wizardSteps=[{label:"Basics"},{label:"Pricing"},{label:"Review"}],this.linkOrigin="yourclub.sprocketsports.com",this.cmsTab=0,this.tabbedTab=0,this.wizardStep=0,this.dialogOpen=!1,this.sprocketDialogOpen=!1,this.drawerOpen=!1,this.advancedFlyout={open:!1},this.horizontalFlyout={open:!1},this.demo={},this.calendarFilters={practices:!0,games:!0,other:!1}}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-forms-architectures"]],standalone:!1,decls:997,vars:92,consts:[["inputGroupStart",""],["footer",""],[3,"compact"],["id","index",1,"card"],["side","shared"],[1,"text-small","text-grey"],[3,"routerLink"],[1,"overflow-x-auto"],[1,"table","table-bordered","table-hover","sg-doc-table"],[2,"width","14rem"],[2,"width","18rem"],[2,"width","10rem"],[2,"width","8rem"],["id","cms-rail",1,"card"],["side","admin"],[1,"row"],[1,"col-lg-8"],[1,"border-all","border-radius","p-4","text-center","text-grey","text-small",2,"min-height","22rem"],[1,"col-lg-4"],[1,"pb-settings-column","admin-wrapper","border-left"],[1,"pb-editor-tabs",3,"valueChange","value"],[3,"value"],["formID","sgCms","buttonsPosition","left","submitButtonText","Save",3,"fields","entity","contentFieldsMode","showCancelButton"],["fieldName","title"],[1,"pb-checkbox"],["fieldName","isFeatured"],[1,"input-group-input"],["fieldName","customURL"],[1,"text-smallest"],["value","0"],["fieldName","metaTitle"],["fieldName","metaDescription"],["id","calendar-rail",1,"card"],[1,"col","col-md-auto","calendar-filters"],[1,"card",2,"min-width","16rem"],[1,"form-group"],["for","sgCalProgram"],["inputId","sgCalProgram","optionLabel","label","optionValue","value","appendTo","body","styleClass","full-width",3,"options"],["for","sgCalTeam"],["inputId","sgCalTeam","optionLabel","name","optionValue","value","placeholder","All","appendTo","body",3,"autofocusFilter","options","filter","showToggleAll","maxSelectedLabels"],[1,"form-label"],[1,"form-input-group"],[1,"form-check"],["
3616inputId","sgCalPr",3,"ngModelChange","ngModel"],["for","sgCalPr"],["inputId","sgCalGm",3,"ngModelChange","ngModel"],["for","sgCalGm"],["inputId","sgCalOt",3,"ngModelChange","ngModel"],["for","sgCalOt"],[1,"col"],[1,"border-all","border-radius","p-4","text-center","text-grey","text-small",2,"min-height","18rem"],["id","admin-filter",1,"card"],[3,"showAdvanced","hideReset","showAdvancedFlyout"],["primary",""],[1,"col-md-4"],["for","sgAdminSearch",1,"sr-only"],["id","sgAdminSearch","pInputText","","type","text","placeholder","Search",3,"ngModelChange","ngModel"],["advanced",""],["for","sgAdvSeason"],["inputId","sgAdvSeason","optionLabel","label","optionValue","value","appendTo","body","styleClass","full-width",3,"options"],["for","sgAdvAsOf"],["inputId","sgAdvAsOf","dateFormat","mm/dd/yy","placeholder","MM/DD/YYYY","appendTo","body",3,"ngModelChange","ngModel"],[1,"resetBtn",3,"click"],[1,"far","fa-redo-alt"],["id","admin-filter-horizontal",1,"card"],[3,"horizontal","showAdvanced","showAdvancedFlyout"],["horizontalFilters",""],["for","sgHzSeason"],["inputId","sgHzSeason","optionLabel","label","optionValue","value","appendTo","body","styleClass","full-width",3,"options"],["horizontalFiltersAdvancedFilters",""],["for","sgHzTeams"],["inputId","sgHzTeams","optionLabel","name","optionValue","value","placeholder","All","appendTo","body",3,"autofocusFilter","options","filter","maxSelectedLabels"],[1,"border-all","border-radius","p-4","text-center","text-grey","text-small"],["id","report-grid",1,"card"],["for","sgFilterSeason"],["inputId","sgFilterSeason","optionLabel","label","optionValue","value","appendTo","body","styleClass","full-width",3,"ngModelChange","ngModel","options"],["for","sgFilterTeams"],["inputId","sgFilterTeams","optionLabel","name","optionValue","value","placeholder","All","appendTo","body",3,"ngModelChange","autofocusFilter","ngModel","options","filter","showToggleAll","maxSelectedLabels"],["for","sgFilterAsOf"],["inputId","sgFilterAsOf","dateFormat","mm/dd/yy","placeholder","MM/DD/YYYY","appendTo","body",3,"ngModelChange","ngModel"],["id","dialog",1,"card"],["type","button",1,"btn","btn-primary",3,"click"],["header","Add Player","styleClass","mediumWidthDialog",3,"visibleChange","visible","modal"],["formID","sgDialog",3,"fields","entity","contentFieldsMode","showSubmitButton","showCancelButton","modalContent"],[1,"form-row"],["fieldName","dlgFirstName"],["fieldName","dlgLastName"],[1,"text-small","text-grey","mt-2"],["id","sprocket-dialog",1,"card"],["type","button",1,"btn",3,"click"],["id","drawer",1,"card"],["header","Message Attendees","position","right",3,"visibleChange","visible"],["formID","sgDrawer","submitButtonText","Send",3,"fields","entity","contentFieldsMode","showCancelButton"],["fieldName","drwSubject"],["fieldName","drwBody"],["id","wizard",1,"card"],[3,"model","readonly","activeIndex"],[1,"mt-3"],[1,"row","form-action","no-gutters"],[1,"col","left-buttons"],["type","button",1,"btn","btn-lg",3,"click","disabled"],[1,"col","right-buttons","text-right"],["type","button",1,"btn","btn-primary","btn-lg",3,"click","disabled"],["id","tabbed",1,"card"],[3,"valueChange","value"],["formID","sgTabbed1","submitButtonText","Save",3,"fields","entity","contentFieldsMode","showCancelButton"],["fieldName","tabName"],["formID","sgTabbed2","submitButtonText","Save",3,"fields","entity","contentFieldsMode","showCancelButton"],["fieldName","tabColor"],["id","accordion",1,"card"],["formID","sgAccordion","submitButtonText","Save",3,"fields","entity","contentFieldsMode","showCancelButton"],["fieldName","accVisible"],["value","1"],["fieldName","accNotes"],["id","sticky",1,"card"],["formID","sgSticky","submitButtonText","Save",3,"fields","entity","buttonsSticky","showCancelButton"],["id","narrow",1,"card"],[1,"form-container"],["for","sgNarrowEmail"],["id","sgNarrowEmail","type","text","placeholder","[email protected]"],["for","sgNarrowPass"],["id","sgNarrowPass","type","password"],["type","button",1,"btn","btn-primary","btn-lg"],["id","mini",1,"card"],[1,"col-md-6"],["panelTitle","Registrations"],["slot","filters",1,"row","card-filters"],[1,"col-12"],[1,"form-group","mb-0"],["for","sgMiniScope",1,"sr-only"],["inputId","sgMiniScope","optionLabel","label","optionValue","value","appendTo","body","styleClass","full-width",3,"ngModelChange","ngModel","options"],["id","missing",1,"card"],[3,"routerLink","fragment"],[1,"text-small"],[3,"verdict"],["slot","secondary"],["slot","primary"],[1,"sprocket-dialog"],[1,"sprocket-dialog-inner","mediumWidthDialog"],[1,"sprocket-dialog-header"],[3,"close"],[1,"sprocket-dialog-content","m-3"],["for","sgSprocketSlot"],["id","sgSprocketSlot","type","text","placeholder","6:00 PM"],["formID","sgWizard1",3,"fields","entity","contentFieldsMode","showSubmitButton","showCancelButton"],["fieldName","wzName"],["fieldName","wzSeason"],["formID","sgWizard2",3,"fields","entity","contentFieldsMode","showSubmitButton","showCancelButton"],["fieldName","wzFee"],["fieldName","wzCap"]],template:function(s,o){if(s&1){let x=B();c(0,"app-sg-verdict-legend",2),e(1,` 3617 3618`),n(2,"div",3),e(3,`
3619 `),n(4,"h3"),e(5,"The architectures"),t(),e(6,` 3620 `),n(7,"app-sg-caption",4),e(8,"fourteen shapes a form gets put inside"),t(),e(9,` 3621 `),n(10,"p",5),e(11,` 3622 The `),n(12,"a",6),e(13,"Fields"),t(),e(14,` tab covers what a control looks like. This one 3623 covers the container it sits in \u2014 the rails, panels, dialogs and step chrome the app 3624 actually ships. Every one of these exists because 3625 `),n(15,"strong")(16,"code"),e(17,"FormMetadata"),t(),e(18,` has no column, section, fieldset, tab or step 3626 primitive`),t(),e(19,`, so 327 templates each solved layout on their own. Where a real shared 3627 component exists, the sample below is that component; where none does, the markup is a 3628 faithful reproduction and is labelled as one. 3629 `),t(),e(20,` 3630 `),n(21,"div",7),e(22,` 3631 `),n(23,"table",8),e(24,` 3632 `),n(25,"thead"),e(26,` 3633 `),n(27,"tr"),e(28,` 3634 `),n(29,"th",9),e(30,"Architecture"),t(),e(31,` 3635 `),n(32,"th",10),e(33,"Home"),t(),e(34,` 3636 `),n(35,"th"),e(36,"What it is"),t(),e(37,` 3637 `),n(38,"th",11),e(39,"Scale"),t(),e(40,` 3638 `),n(41,"th",12),e(42,"Verdict"),t(),e(43,` 3639 `),t(),e(44,` 3640 `),t(),e(45,` 3641 `),n(46,"tbody"),e(47,` 3642 `),S(48,Cc,21,8,null,null,wc),t(),e(50,` 3643 `),t(),e(51,` 3644 `),t(),e(52,` 3645`),t(),e(53,` 3646 3647`),n(54,"div",13),e(55,` 3648 `),n(56,"h3"),e(57,"CMS settings rail"),t(),e(58,` 3649 `),n(59,"app-sg-caption",14),e(60,".pb-settings-column \u2014 page-builder-edit.component.html:145"),t(),e(61,` 3650 `),n(62,"p",5),e(63,` 3651 The most elaborate form architecture in the app, and it has exactly one host. A sticky 3652 full-height right column carrying `),n(64,"code"),e(65,"p-tabs"),t(),e(66," over "),n(67,"code"),e(68,"p-accordion"),t(),e(69,` over 3653 projection-mode forms, with `),n(70,"strong"),e(71,"34 separate content edit forms"),t(),e(72,` swapping into 3654 the Content tab as you select things on the canvas. It has its own stylesheet \u2014 3655 `),n(73,"code"),e(74,"3_modules/cms/pb-settings-column.scss"),t(),e(75,`, roughly 130 lines re-specifying label 3656 spacing, `),n(76,"code"),e(77,".form-group"),t(),e(78," margins, "),n(79,"code"),e(80,".form-action"),t(),e(81,` layout and dropdown 3657 widths for this one container. 3658 `),t(),e(82,` 3659 `),n(83,"p",5),e(84,` 3660 One behaviour here appears nowhere else. The content forms 3661 `),n(85,"strong"),e(86,"autosave"),t(),e(87," \u2014 "),n(88,"code"),e(89,'[showSubmitButton]="false"'),t(),e(90,` plus 3662 `),n(91,"code"),e(92,"(valueChanges)"),t(),e(93,", so there is no Save button at all. The "),n(94,"code"),e(95,".pb-checkbox"),t(),e(96,` wrapper 3663 flips a checkbox row to label-left / control-right, which is a layout the dynamic form 3664 cannot express on its own. 3665 `),t(),e(97,` 3666 `),n(98,"div",15),e(99,` 3667 `),n(100,"div",16),e(101,` 3668 `),n(102,"div",17),e(103,` 3669 the page canvas \u2014 not part of this demo 3670 `),t(),e(104,` 3671 `),t(),e(105,` 3672 `),n(106,"div",18),e(107,` 3673 `),n(108,"div",19),e(109,` 3674 `),n(110,"p-tabs",20),M("valueChange",function(_){return w(x),I(o.cmsTab,_)||(o.cmsTab=_),C(_)}),e(111,` 3675 `),n(112,"p-tablist"),e(113,` 3676 `),n(114,"p-tab",21),e(115,"Setup"),t(),e(116,` 3677 `),n(117,"p-tab",21),e(118,"Content"),t(),e(119,` 3678 `),t(),e(120,` 3679 `),n(121,"p-tabpanels"),e(122,` 3680 `),n(123,"p-tabpanel",21),e(124,` 3681 `),n(125,"app-dynamic-form",22),e(126,` 3682 `),c(127,"app-dynamic-form-field",23),e(128,` 3683 `),n(129,"div",24),e(130,` 3684 `),c(131,"app-dynamic-form-field",25),e(132,` 3685 `),t(),e(133,` 3686 `),n(134,"div",26),e(135,` 3687 `),n(136,"app-dynamic-form-field",27),e(137,` 3688 `),O(138,0,0),e(140,` 3689 `),n(141,"span",28),e(142),t(),e(143,` 3690 `),N(),e(144,` 3691 `),t(),e(145,` 3692 `),t(),e(146,` 3693 `),n(147,"p-accordion"),e(148,` 3694 `),n(149,"p-accordion-panel",29),e(150,` 3695 `),n(151,"p-accordion-header"),e(152,"SEO"),t(),e(153,` 3696 `),n(154,"p-accordion-content"),e(155,` 3697 `),c(156,"app-dynamic-form-field",30),e(157,` 3698 `),c(158,"app-dynamic-form-field",31),e(159,` 3699 `),t(),e(160,` 3700 `),t(),e(161,` 3701 `),t(),e(162,` 3702 `),t(),e(163,` 3703 `),t(),e(164,` 3704 `),n(165,"p-tabpanel",21),e(166,` 3705 `),n(167,"p",5),e(168,` 3706 In the real editor this panel swaps between 34 content-type edit 3707 forms \u2014 text, gallery, calendar, scoreboard and the rest 3708 \u2014 each its own projection-mode dynamic form with no submit 3709 button, saving through `),n(169,"code"),e(170,"(valueChanges)"),t(),e(171,`. 3710 `),t(),e(172,` 3711 `),t(),e(173,` 3712 `),t(),e(174,` 3713 `),t(),e(175,` 3714 `),t(),e(176,` 3715 `),t(),e(177,` 3716 `),t(),e(178,` 3717`),t(),e(179,` 3718 3719`),n(180,"div",32),e(181,` 3720 `),n(182,"h3"),e(183,"Calendar filter rail"),t(),e(184,` 3721 `),n(185,"app-sg-caption",4),e(186,".calendar-filters \u2014 reproduction, 2 templates"),t(),e(187,` 3722 `),n(188,"p",5),e(189,` 3723 A left column of filter controls beside the content column, in 3724 `),n(190,"code"),e(191,"club-calendar/calendar"),t(),e(192," and "),n(193,"code"),e(194,"schedule-sign-up/time-slots"),t(),e(195,`. There is 3725 no component \u2014 it is a `),n(196,"code"),e(197,"col col-md-auto"),t(),e(198," holding a "),n(199,"code"),e(200,".card"),t(),e(201,` of 3726 `),n(202,"code"),e(203,".form-group"),t(),e(204,`s, and the calendar reads
3726its height to size the results column 3727 beside it. 3728 `),t(),e(205,` 3729 `),n(206,"p",5),e(207,` 3730 `),n(208,"strong"),e(209,"Its class does nothing."),t(),e(210," "),n(211,"code"),e(212,".calendar-filters"),t(),e(213,` is declared at 3731 `),n(214,"code"),e(215,"3_modules/templates.scss:842"),t(),e(216,` and the whole block is commented out, so the three 3732 `),n(217,"code"),e(218,"--p-toggleswitch-*"),t(),e(219,` overrides that were meant to shrink the switches below never 3733 apply. They render at stock PrimeNG size. Nothing else in the rail depends on the class, 3734 which is why this went unnoticed. 3735 `),t(),e(220,` 3736 `),n(221,"div",15),e(222,` 3737 `),n(223,"div",33),e(224,` 3738 `),n(225,"div",34),e(226,` 3739 `),n(227,"div",35),e(228,` 3740 `),n(229,"label",36),e(230,"Program"),t(),e(231,` 3741 `),c(232,"p-select",37),e(233,` 3742 `),t(),e(234,` 3743 `),n(235,"div",35),e(236,` 3744 `),n(237,"label",38),e(238,"Team"),t(),e(239,` 3745 `),c(240,"p-multiSelect",39),e(241,` 3746 `),t(),e(242,` 3747 `),n(243,"div",35),e(244,` 3748 `),n(245,"legend",40),e(246,"Event types"),t(),e(247,` 3749 `),n(248,"div",41),e(249,` 3750 `),n(250,"div",42),e(251,` 3751 `),n(252,"p-toggleswitch",43),M("ngModelChange",function(_){return w(x),I(o.calendarFilters.practices,_)||(o.calendarFilters.practices=_),C(_)}),t(),e(253,` 3752 `),n(254,"label",44),e(255,"Practices"),t(),e(256,` 3753 `),t(),e(257,` 3754 `),n(258,"div",42),e(259,` 3755 `),n(260,"p-toggleswitch",45),M("ngModelChange",function(_){return w(x),I(o.calendarFilters.games,_)||(o.calendarFilters.games=_),C(_)}),t(),e(261,` 3756 `),n(262,"label",46),e(263,"Games"),t(),e(264,` 3757 `),t(),e(265,` 3758 `),n(266,"div",42),e(267,` 3759 `),n(268,"p-toggleswitch",47),M("ngModelChange",function(_){return w(x),I(o.calendarFilters.other,_)||(o.calendarFilters.other=_),C(_)}),t(),e(269,` 3760 `),n(270,"label",48),e(271,"Other"),t(),e(272,` 3761 `),t(),e(273,` 3762 `),t(),e(274,` 3763 `),t(),e(275,` 3764 `),t(),e(276,` 3765 `),t(),e(277,` 3766 `),n(278,"div",49),e(279,` 3767 `),n(280,"div",50),e(281,` 3768 the events column \u2014 sized from the filter card's height 3769 `),t(),e(282,` 3770 `),t(),e(283,` 3771 `),t(),e(284,` 3772`),t(),e(285,` 3773 3774`),n(286,"div",51),e(287,` 3775 `),n(288,"h3"),e(289,"Admin filter bar"),t(),e(290,` 3776 `),n(291,"app-sg-caption",4),e(292,"app-admin-filter \u2014 the real shared component, 74 templates"),t(),e(293,` 3777 `),n(294,"p",5),e(295,` 3778 The sanctioned filter chrome: a `),n(296,"code"),e(297,".card.search-filter"),t(),e(298,` with a 3779 `),n(299,"code"),e(300,"[primary]"),t(),e(301," slot always visible, an "),n(302,"code"),e(303,"[advanced]"),t(),e(304,` slot behind a Filters 3780 toggle, and Search and Reset buttons that emit `),n(305,"code"),e(306,"adminFilterSearch"),t(),e(307,` / 3781 `),n(308,"code"),e(309,"adminFilterReset"),t(),e(310,". The advanced panel carries "),n(311,"code"),e(312,".report-filters"),t(),e(313,`, 3782 which is what makes `),n(314,"code"),e(315,".resetBtn"),t(),e(316,` work inside a filter bar and nowhere else. 3783 `),t(),e(317,` 3784 `),n(318,"app-admin-filter",52),e(319,` 3785 `),O(320,53),e(321,` 3786 `),n(322,"div",54),e(323,` 3787 `),n(324,"div",35),e(325,` 3788 `),n(326,"label",55),e(327,"Search"),t(),e(328,` 3789 `),n(329,"input",56),M("ngModelChange",function(_){return w(x),I(o.demo.search,_)||(o.demo.search=_),C(_)}),t(),e(330,` 3790 `),t(),e(331,` 3791 `),t(),e(332,` 3792 `),N(),e(333,` 3793 `),O(334,57),e(335,` 3794 `),n(336,"div",15),e(337,` 3795 `),n(338,"div",54),e(339,` 3796 `),n(340,"div",35),e(341,` 3797 `),n(342,"label",58),e(343,"Season"),t(),e(344,`
3798 `),c(345,"p-select",59),e(346,` 3799 `),t(),e(347,` 3800 `),t(),e(348,` 3801 `),n(349,"div",54),e(350,` 3802 `),n(351,"div",35),e(352,` 3803 `),n(353,"label",60),e(354,"As of"),t(),e(355,` 3804 `),n(356,"p-inputgroup"),e(357,` 3805 `),n(358,"p-datepicker",61),M("ngModelChange",function(_){return w(x),I(o.demo.asOf,_)||(o.demo.asOf=_),C(_)}),t(),e(359,` 3806 `),n(360,"p-inputgroup-addon"),e(361,` 3807 `),n(362,"a",62),g("click",function(){return o.demo.asOf=void 0}),c(363,"i",63),t(),e(364,` 3808 `),t(),e(365,` 3809 `),t(),e(366,` 3810 `),t(),e(367,` 3811 `),t(),e(368,` 3812 `),t(),e(369,` 3813 `),N(),e(370,` 3814 `),t(),e(371,` 3815 `),n(372,"p",5),e(373,` 3816 Open Filters and compare that reset link with the one in the report grid below \u2014 same 3817 markup, and only this one is styled. 3818 `),t(),e(374,` 3819`),t(),e(375,` 3820 3821`),n(376,"div",64),e(377,` 3822 `),n(378,"h3"),e(379,"Admin filter bar \u2014 "),n(380,"code"),e(381,"[horizontal]"),t()(),e(382,` 3823 `),n(383,"app-sg-caption",4),e(384,"the same component, second layout \u2014 2 templates"),t(),e(385,` 3824 `),n(386,"p",5),e(387,` 3825 `),n(388,"code"),e(389,"app-admin-filter"),t(),e(390,` has a second layout, reached with 3826 `),n(391,"code"),e(392,'[horizontal]="true"'),t(),e(393,`. It projects into three different slots 3827 (`),n(394,"code"),e(395,"[horizontalFilters]"),t(),e(396,", "),n(397,"code"),e(398,"[horizontalFiltersAdvancedFilters]"),t(),e(399,`, and 3828 default content) and emits `),n(400,"code"),e(401,".admin-filter-container.horizontal-layout"),t(),e(402,` wrapping a 3829 `),n(403,"code"),e(404,".filters-section"),t(),e(405," beside a "),n(406,"code"),e(407,".content-section"),t(),e(408,` \u2014 the markup of a 3830 left filter rail with the page content to its right. 3831 `),t(),e(409,` 3832 `),n(410,"p",5),e(411,` 3833 `),n(412,"strong"),e(413,"None of those four classes is declared anywhere."),t(),e(414,` 3834 `),n(415,"code"),e(416,"admin-filter.component.scss"),t(),e(417,` is a 0-byte file, and no other stylesheet in the 3835 app mentions them. So the rail renders as stacked full-width blocks, which is what you see 3836 below \u2014 the filters above the content instead of beside it. Its two consumers, 3837 `),n(418,"code"),e(419,"bulk-cancel"),t(),e(420," and "),n(421,"code"),e(422,"advanced-bulk-edit"),t(),e(423,`, ship that way today. 3838 `),t(),e(424,` 3839 `),n(425,"app-admin-filter",65),e(426,` 3840 `),O(427,66),e(428,` 3841 `),n(429,"div",35),e(430,` 3842 `),n(431,"label",67),e(432,"Season"),t(),e(433,` 3843 `),c(434,"p-select",68),e(435,` 3844 `),t(),e(436,` 3845 `),N(),e(437,` 3846 `),O(438,69),e(439,` 3847 `),n(440,"div",35),e(441,` 3848 `),n(442,"label",70),e(443,"Teams"),t(),e(444,` 3849 `),c(445,"p-multiSelect",71),e(446,` 3850 `),t(),e(447,` 3851 `),N(),e(448,` 3852 `),n(449,"div",72),e(450,` 3853 the content section \u2014 meant to sit to the right of the filters 3854 `),t(),e(451,` 3855 `),t(),e(452,` 3856`),t(),e(453,` 3857 3858`),n(454,"div",73),e(455,` 3859 `),n(456,"h3"),e(457,"Report filter grid"),t(),e(458,` 3860 `),n(459,"app-sg-caption",14),e(460,"reproduction \u2014 admin/report/*/filters.component.html, 55 templates"),t(),e(461,` 3861 `),n(462,"p",5),e(463,` 3862 The most duplicated form shape in the codebase and the one with no owner: a bare 3863 `),n(464,"code"),e(465,".row"),t(),e(466," of "),n(467,"code"),e(468,".col-md-*"),t(),e(469,` columns, each holding a 3864 `),n(470,"code"),e(471,".form-group"),t(),e(472," with an unassociated "),n(473,"code"),e(474,"<label>"),t(),e(475,` and a 3865 `),n(476,"code"),e(477,"p-multiSelect"),t(),e(478," or "),n(479,"code"),e(480,"p-select"),t(),e(481," bound with "),n(482,"code"),e(483,"[(ngModel)]"),t(),e(484,`. No 3866 `),n(485,"code"),e(486,"<form>"),t(),e(487,`, no validation, no submit \u2014 an external Run button drives it. 3867 `),t(),e(488,` 3868 `),n(489,"div",15),e(490,` 3869 `),n(491,"div",54),e(492,` 3870 `),n(493,"div",35),e(494,` 3871 `),n(495,"label",74),e(496,"Season"),t(),e(497,` 3872 `),n(498,"p-select",75),M("ngModelChange",function(_){return w(x),I(o.demo.season,_)||(o.demo.season=_),C(_)}),e(499,` 3873 `),t(),e(500,` 3874 `),t(),e(501,` 3875 `),t(),e(502,` 3876 `),n(503,"div",54),e(504,` 3877 `),n(505,"div",35),e(506,` 3878 `),n(507,"label",76),e(508,"Teams"),t(),e(509,`
3879 `),n(510,"p-multiSelect",77),M("ngModelChange",function(_){return w(x),I(o.demo.teams,_)||(o.demo.teams=_),C(_)}),e(511,` 3880 `),t(),e(512,` 3881 `),t(),e(513,` 3882 `),t(),e(514,` 3883 `),n(515,"div",54),e(516,` 3884 `),n(517,"div",35),e(518,` 3885 `),n(519,"label",78),e(520,"As of"),t(),e(521,` 3886 `),n(522,"p-inputgroup"),e(523,` 3887 `),n(524,"p-datepicker",79),M("ngModelChange",function(_){return w(x),I(o.demo.asOf,_)||(o.demo.asOf=_),C(_)}),t(),e(525,` 3888 `),n(526,"p-inputgroup-addon"),e(527,` 3889 `),n(528,"a",62),g("click",function(){return o.demo.asOf=void 0}),c(529,"i",63),t(),e(530,` 3890 `),t(),e(531,` 3891 `),t(),e(532,` 3892 `),t(),e(533,` 3893 `),t(),e(534,` 3894 `),t(),e(535,` 3895 `),n(536,"p",5),e(537,` 3896 The reset link above is unstyled, deliberately \u2014 `),n(538,"code"),e(539,".resetBtn"),t(),e(540,` is declared 3897 only under `),n(541,"code"),e(542,".report-filters"),t(),e(543,`, and this grid is not inside one. The labels also 3898 have no `),n(544,"code"),e(545,"for"),t(),e(546,` in the real templates; they are paired here because the 3899 `),n(547,"a",6),e(548,"Layout & labels"),t(),e(549,` tab says to. 3900 `),t(),e(550,` 3901`),t(),e(551,` 3902 3903`),n(552,"div",80),e(553,` 3904 `),n(554,"h3"),e(555,"Dialog form"),t(),e(556,` 3905 `),n(557,"app-sg-caption",4),e(558,"p-dialog \u2014 387 templates, 217 hosting a dynamic form"),t(),e(559,` 3906 `),n(560,"p",5),e(561,` 3907 The most common chrome in the app. A `),n(562,"code"),e(563,"p-dialog"),t(),e(564,` whose width comes from one of the 3908 four sanctioned `),n(565,"code"),e(566,"styleClass"),t(),e(567,` values \u2014 never an inline style \u2014 hosting 3909 a projection-mode form, with `),n(568,"code"),e(569,"app-dialog-footer"),t(),e(570,` in the 3910 `),n(571,"code"),e(572,"#footer"),t(),e(573," slot. "),n(574,"code"),e(575,'[modalContent]="true"'),t(),e(576,` on the form drops the action 3911 row's bottom padding so it sits flush with the dialog footer. 3912 `),t(),e(577,` 3913 `),n(578,"button",81),g("click",function(){return o.dialogOpen=!0}),e(579,"Open dialog form"),t(),e(580,` 3914 `),n(581,"p-dialog",82),M("visibleChange",function(_){return w(x),I(o.dialogOpen,_)||(o.dialogOpen=_),C(_)}),e(582,` 3915 `),n(583,"app-dynamic-form",83),e(584,` 3916 `),n(585,"div",84),e(586,` 3917 `),c(587,"app-dynamic-form-field",85),e(588,` 3918 `),c(589,"app-dynamic-form-field",86),e(590,` 3919 `),t(),e(591,` 3920 `),t(),e(592,` 3921 `),k(593,_c,16,0,"ng-template",null,1,fe),e(595,` 3922 `),t(),e(596,` 3923 `),n(597,"p",87),e(598,` 3924 `),n(599,"strong"),e(600,"116 of the 305 orphan-control templates are dialogs"),t(),e(601,` \u2014 modals that 3925 collect input with no `),n(602,"code"),e(603,"<form>"),t(),e(604,` at all, so Enter does nothing. That is where 3926 the missing form element is most surprising, and it is the single largest slice of the 3927 finding on the `),n(605,"a",6),e(606,"Defects"),t(),e(607,` tab. 3928 `),t(),e(608,` 3929`),t(),e(609,` 3930 3931`),n(610,"div",88),e(611,` 3932 `),n(612,"h3"),e(613,"Hand-rolled dialog"),t(),e(614,` 3933 `),n(615,"app-sg-caption",14),e(616,".sprocket-dialog \u2014 reproduction, 27 templates"),t(),e(617,` 3934 `),n(618,"p",5),e(619,` 3935 The prescribed escape hatch: when content projection into `),n(620,"code"),e(621,"p-dialog"),t(),e(622,` will not 3936 work, the Angular standards call for this markup instead \u2014 3937 `),n(623,"code"),e(624,".sprocket-dialog"),t(),e(625," / "),n(626,"code"),e(627,".sprocket-dialog-inner"),t(),e(628,` with one of the same 3938 four width classes, a header row with `),n(629,"code"),e(630,"app-close-icon"),t(),e(631,`, and the body in 3939 `),n(632,"code"),e(633,".sprocket-dialog-content"),t(),e(634,`. It is a real CSS contract, not a component, so 3940 nothing enforces the structure. 3941 `),t(),e(635,` 3942 `),n(636,"button",89),g("click",function(){return o.sprocketDialogOpen=!0}),e(637,"Open hand-rolled dialog"),t(),e(638,` 3943 `),v(639,kc,35,0),t(),e(640,` 3944 3945`),n(641,"div",90),e(642,` 3946 `),n(643,"h3"),e(644,"Drawer form"),t(),e(645,` 3947 `),n(646,"app-sg-caption",4),e(647,"p-drawer \u2014 9 templates"),t(),e(648,` 3948 `),n(649,"p",5),e(650,` 3949 An edge-anchored panel hosting a form \u2014 used for event messaging, the cart, and the AI 3950 chat surfaces. The header treatment is not consistent across the nine: three different
3951 mechanisms and four close affordances, which is its own parked project. 3952 `),t(),e(651,` 3953 `),n(652,"button",81),g("click",function(){return o.drawerOpen=!0}),e(653,"Open drawer form"),t(),e(654,` 3954 `),n(655,"p-drawer",91),M("visibleChange",function(_){return w(x),I(o.drawerOpen,_)||(o.drawerOpen=_),C(_)}),e(656,` 3955 `),n(657,"app-dynamic-form",92),e(658,` 3956 `),c(659,"app-dynamic-form-field",93),e(660,` 3957 `),c(661,"app-dynamic-form-field",94),e(662,` 3958 `),t(),e(663,` 3959 `),t(),e(664,` 3960`),t(),e(665,` 3961 3962`),n(666,"div",95),e(667,` 3963 `),n(668,"h3"),e(669,"Multi-step wizard"),t(),e(670,` 3964 `),n(671,"app-sg-caption",4),e(672,"p-steps + one dynamic form per step \u2014 17 templates"),t(),e(673,` 3965 `),n(674,"p",5),e(675,` 3966 Step chrome over `),n(676,"strong"),e(677,"separate"),t(),e(678,` dynamic forms \u2014 one per step, each with its 3967 own `),n(679,"code"),e(680,"formID"),t(),e(681,", composed by the host through "),n(682,"code"),e(683,"@ViewChild"),t(),e(684,`. There is 3968 no step primitive in `),n(685,"code"),e(686,"FormMetadata"),t(),e(687,`, so the host owns the index, the validity 3969 gate between steps, and the accumulation of values across them. 3970 `),t(),e(688,` 3971 `),c(689,"p-steps",96),e(690,` 3972 `),n(691,"div",97),e(692,` 3973 `),v(693,Tc,11,5)(694,Ic,11,5)(695,Mc,7,0),e(696,` 3974 `),t(),e(697,` 3975 `),n(698,"div",98),e(699,` 3976 `),n(700,"div",99),e(701,` 3977 `),n(702,"button",100),g("click",function(){return o.wizardStep=o.wizardStep-1}),e(703,"Back"),t(),e(704,` 3978 `),t(),e(705,` 3979 `),n(706,"div",101),e(707,` 3980 `),n(708,"button",102),g("click",function(){return o.wizardStep=o.wizardStep+1}),e(709,"Next"),t(),e(710,` 3981 `),t(),e(711,` 3982 `),t(),e(712,` 3983`),t(),e(713,` 3984 3985`),n(714,"div",103),e(715,` 3986 `),n(716,"h3"),e(717,"Tabbed form"),t(),e(718,` 3987 `),n(719,"app-sg-caption",4),e(720,"p-tabs \u2014 280 templates"),t(),e(721,` 3988 `),n(722,"p",5),e(723,` 3989 Fields grouped across tabs. The one thing to get right: `),n(724,"strong"),e(725,`each tab's form needs its 3990 own `),n(726,"code"),e(727,"formID"),t()(),e(728,". "),n(729,"code"),e(730,"DynamicFormService"),t(),e(731,` is provided by 3991 `),n(732,"code"),e(733,"DynamicFormModule"),t(),e(734,` rather than per component, so a single service instance 3992 serves the whole page and filters `),n(735,"code"),e(736,"formSubmitted$"),t(),e(737," / "),n(738,"code"),e(739,"formError$"),t(),e(740,` by 3993 id \u2014 give two forms the same id and submitting one lights up the other. 3994 `),t(),e(741,` 3995 `),n(742,"p-tabs",104),M("valueChange",function(_){return w(x),I(o.tabbedTab,_)||(o.tabbedTab=_),C(_)}),e(743,` 3996 `),n(744,"p-tablist"),e(745,` 3997 `),n(746,"p-tab",21),e(747,"Team details"),t(),e(748,` 3998 `),n(749,"p-tab",21),e(750,"Appearance"),t(),e(751,` 3999 `),t(),e(752,` 4000 `),n(753,"p-tabpanels"),e(754,` 4001 `),n(755,"p-tabpanel",21),e(756,` 4002 `),n(757,"app-dynamic-form",105),e(758,` 4003 `),c(759,"app-dynamic-form-field",106),e(760,` 4004 `),t(),e(761,` 4005 `),t(),e(762,` 4006 `),n(763,"p-tabpanel",21),e(764,` 4007 `),n(765,"app-dynamic-form",107),e(766,` 4008 `),c(767,"app-dynamic-form-field",108),e(768,` 4009 `),t(),e(769,`
4010 `),t(),e(770,` 4011 `),t(),e(771,` 4012 `),t(),e(772,` 4013`),t(),e(773,` 4014 4015`),n(774,"div",109),e(775,` 4016 `),n(776,"h3"),e(777,"Accordion form"),t(),e(778,` 4017 `),n(779,"app-sg-caption",4),e(780,"p-accordion \u2014 25 templates"),t(),e(781,` 4018 `),n(782,"p",5),e(783,` 4019 Collapsible field groups \u2014 the closest thing the app has to a fieldset. This is how 4020 the CMS rail hides Permissions and SEO behind headers, and it is the only grouping mechanism 4021 that keeps every field in one `),n(784,"code"),e(785,"FormGroup"),t(),e(786,` while hiding most of them. 4022 `),t(),e(787,` 4023 `),n(788,"app-dynamic-form",110),e(789,` 4024 `),n(790,"p-accordion"),e(791,` 4025 `),n(792,"p-accordion-panel",29),e(793,` 4026 `),n(794,"p-accordion-header"),e(795,"Visibility"),t(),e(796,` 4027 `),n(797,"p-accordion-content"),e(798,` 4028 `),c(799,"app-dynamic-form-field",111),e(800,` 4029 `),t(),e(801,` 4030 `),t(),e(802,` 4031 `),n(803,"p-accordion-panel",112),e(804,` 4032 `),n(805,"p-accordion-header"),e(806,"Staff only"),t(),e(807,` 4033 `),n(808,"p-accordion-content"),e(809,` 4034 `),c(810,"app-dynamic-form-field",113),e(811,` 4035 `),t(),e(812,` 4036 `),t(),e(813,` 4037 `),t(),e(814,` 4038 `),t(),e(815,` 4039 `),n(816,"p",5),e(817,` 4040 Worth knowing: `),n(818,"code"),e(819),t(),e(820,` 4041 is what lets a projected field survive being nested inside an accordion, a tab or a table 4042 cell. Without `),n(821,"code"),e(822,"descendants"),t(),e(823,`, only direct children would be found. 4043 `),t(),e(824,` 4044`),t(),e(825,` 4045 4046`),n(826,"div",114),e(827,` 4047 `),n(828,"h3"),e(829,"Sticky action bar"),t(),e(830,` 4048 `),n(831,"app-sg-caption",4),e(832,"appStickyFormButtons + [buttonsSticky] \u2014 33 templates"),t(),e(833,` 4049 `),n(834,"p",5),e(835,` 4050 For forms long enough to scroll the Save button out of view. The directive pins 4051 `),n(836,"code"),e(837,".form-action"),t(),e(838,` to the viewport bottom and toggles 4052 `),n(839,"code"),e(840,".form-sticky-form-buttons-on"),t(),e(841,` from TypeScript \u2014 which is why that class 4053 never appears in any template and is `),n(842,"em"),e(843,"not"),t(),e(844,` dead code, unlike the eight on the 4054 `),n(845,"a",6),e(846,"CSS contracts"),t(),e(847,` tab. 4055 `),t(),e(848,` 4056 `),n(849,"app-dynamic-form",115),e(850,` 4057 `),t(),e(851,` 4058`),t(),e(852,` 4059 4060`),n(853,"div",116),e(854,` 4061 `),n(855,"h3"),e(856,"Narrow centered form"),t(),e(857,` 4062 `),n(858,"app-sg-caption",4),e(859,".form-container \u2014 7 templates"),t(),e(860,` 4063 `),n(861,"p",5),e(862,` 4064 A max-width wrapper for a standalone form \u2014 the public checkout, login and 4065 registration shape. These are also among the ~6 templates in the whole app with a 4066 hand-written `),n(863,"code"),e(864,"<form>"),t(),e(865," and a real "),n(866,"code"),e(867,"[formGroup]"),t(),e(868,`, because they 4067 predate the dynamic form system. 4068 `),t(),e(869,` 4069 `),n(870,"div",117),e(871,` 4070 `),n(872,"div",35),e(873,` 4071 `),n(874,"label",118),e(875,"Email"),t(),e(876,` 4072 `),c(877,"input",119),e(878,` 4073 `),t(),e(879,` 4074 `),n(880,"div",35),e(881,` 4075 `),n(882,"label",120),e(883,"Password"),t(),e(884,` 4076 `),c(885,"input",121),e(886,` 4077 `),t(),e(887,` 4078 `),n(888,"div",98),e(889,` 4079 `),n(890,"div",101),e(891,` 4080 `),n(892,"button",122),e(893,"Sign in"),t(),e(894,` 4081 `),t(),e(895,` 4082 `),t(),e(896,` 4083 `),t(),e(897,` 4084`),t(),e(898,` 4085 4086`),n(899,"div",123),e(900,` 4087 `),n(901,"h3"),e(902,"Dashboard mini-form"),t(),e(903,` 4088 `),n(904,"app-sg-caption",4),e(905,"app-admin-dashboard-card header \u2014 18 templates"),t(),e(906,` 4089 `),n(907,"p",5),e(908,` 4090 A lone `),n(909,"code"),e(910,"p-select"),t(),e(911,", "),n(912,"code"),e(913,"p-multiSelect"),t(),e(914," or "),n(915,"code"),e(916,"p-selectButton"),t(),e(917,` used 4091 as a scope selector, projected into `),n(918,"code"),e(919,"app-admin-dashboard-card"),t(),e(920,`'s 4092 `),n(921,"code"),e(922,'slot="filters"'),t(),e(923,". No form, usually an "),n(924,"code"),e(925,"sr-only"),t(),e(926,` label, no submit 4093 \u2014 changing it refetches the panel. Eighteen dashboard panels do this and each styles 4094 the control slightly differently, which is why it is marked drift rather than live: the slot 4095 is shared, the contents of it are not. 4096 `),t(),e(927,` 4097 `),n(928,"div",15),e(929,` 4098 `),n(930,"div",124),e(931,` 4099 `),n(932,"app-admin-dashboard-card",125),e(933,` 4100 `),n(934,"div",126),e(935,` 4101 `),n(936,"div",127),e(937,` 4102 `),n(938,"div",128),e(939,` 4103 `),n(940,"label",129),e(941,"Season"),t(),e(942,` 4104 `),n(943,"p-select",130),M("ngModelChange",function(_){return w(x),I(o.demo.scope,_)||(o.demo.scope=_),C(_)}),t(),e(944,` 4105 `),t(),e(945,` 4106 `),t(),e(946,` 4107 `),t(),e(947,` 4108 `),n(948,"p",5),e(949,"panel body"),t(),e(950,` 4109 `),t(),e(951,` 4110 `),t(),e(952,` 4111 `),t(),e(953,` 4112`),t(),e(954,` 4113 4114`),n(955,"div",131),e(956,` 4115 `),n(957,"h3"),e(958,"The layout metadata that already exists"),t(),e(959,` 4116 `),n(960,"app-sg-caption",4),e(961,"shared/modules/form-builder \u2014 one consumer"),t(),e(962,` 4117 `),n(963,"p",5),e(964,` 4118 Every architecture above is a workaround for the same absence: `),n(965,"code"),e(966,"FormMetadata"),t(),e(967,` has 4119 no column, section, fieldset, tab or step primitive, so each host builds its own. That 4120 metadata does exist in this codebase \u2014 just not in the system anyone uses. 4121 `),n(968,"code"),e(969,"shared/modules/form-builder/"),t(),e(970,` is a complete second forms system: a 4122 drag-and-drop builder with its own field model, its own string-keyed type enum, and 4123 `),n(971,"strong"),e(972,"the only "),n(973,"code"),e(974,"steps"),t(),e(975," / "),n(976,"code"),e(977,"columnSpan"),t(),e(978," / "),n(979,"code"),e(980,"multiStep"),t(),e(981,`
4124 metadata anywhere in the codebase`),t(),e(982,`. It holds 83 of the app's 93 4125 `),n(983,"code"),e(984,"formControlName"),t(),e(985,` occurrences. Its renderer appears in one template, reachable 4126 from `),n(986,"code"),e(987,"/form-builder-demo"),t(),e(988,", and it is not wired to "),n(989,"code"),e(990,"DynamicFormField"),t(),e(991,`. 4127 `),t(),e(992,` 4128 `),n(993,"p",5),e(994,` 4129 Nothing about that is a recommendation \u2014 the two models are unrelated and merging them 4130 is a real project. It is here because the fourteen shapes above look like independent 4131 decisions and are not: they are fourteen answers to one missing feature that was built once, 4132 somewhere else. 4133 `),t(),e(995,` 4134`),t(),e(996,` 4135`)}if(s&2){let x;m("compact",!0),i(12),m("routerLink","../fields"),i(36),E(o.architectures),i(62),T("value",o.cmsTab),i(4),m("value",0),i(3),m("value",1),i(6),m("value",0),i(2),m("fields",o.cmsFields)("entity",o.emptyEntity)("contentFieldsMode",!0)("showCancelButton",!1),i(17),f("",o.linkOrigin,"/club/"),i(23),m("value",1),i(67),m("options",o.demoOptions),i(8),m("autofocusFilter",!0)("options",o.demoTeams)("filter",!0)("showToggleAll",!0)("maxSelectedLabels",1),i(12),T("ngModel",o.calendarFilters.practices),i(8),T("ngModel",o.calendarFilters.games),i(8),T("ngModel",o.calendarFilters.other),i(50),m("showAdvanced",!0)("hideReset",!1)("showAdvancedFlyout",o.advancedFlyout),i(11),T("ngModel",o.demo.search),i(16),m("options",o.demoOptions),i(13),T("ngModel",o.demo.asOf),i(67),m("horizontal",!0)("showAdvanced",!0)("showAdvancedFlyout",o.horizontalFlyout),i(9),m("options",o.demoOptions),i(11),m("autofocusFilter",!0)("options",o.demoTeams)("filter",!0)("maxSelectedLabels",1),i(53),T("ngModel",o.demo.season),m("options",o.demoOptions),i(12),m("autofocusFilter",!0),T("ngModel",o.demo.teams),m("options",o.demoTeams)("filter",!0)("showToggleAll",!0)("maxSelectedLabels",1),i(14),T("ngModel",o.demo.asOf),i(23),m("routerLink","../layout"),i(34),T("visible",o.dialogOpen),m("modal",!0),i(2),m("fields",o.dialogFields)("entity",o.emptyEntity)("contentFieldsMode",!0)("showSubmitButton",!1)("showCancelButton",!1)("modalContent",!0),i(22),m("routerLink","../defects"),i(34),y(o.sprocketDialogOpen?639:-1),i(16),T("visible",o.drawerOpen),i(2),m("fields",o.drawerFields)("entity",o.emptyEntity)("contentFieldsMode",!0)("showCancelButton",!1),i(32),m("model",o.wizardSteps)("readonly",!0)("activeIndex",o.wizardStep),i(4),y((x=o.wizardStep)===0?693:x===1?694:695),i(9),m("disabled",o.wizardStep===0),i(6),m("disabled",o.wizardStep===2),i(34),T("value",o.tabbedTab),i(4),m("value",0),i(3),m("value",1),i(6),m("value",0),i(2),m("fields",o.tabbedOneFields)("entity",o.emptyEntity)("contentFieldsMode",!0)("showCancelButton",!1),i(6),m("value",1),i(2),m("fields",o.tabbedTwoFields)("entity",o.emptyEntity)("contentFieldsMode",!0)("showCancelButton",!1),i(23),m("fields",o.accordionFields)("entity",o.emptyEntity)("contentFieldsMode",!0)("showCancelButton",!1),i(31),q("@ContentChildren(\u2026, ","{"," descendants: true ","}",")"),i(26),m("routerLink","../contracts"),i(4),m("fields",o.stickyFields)("entity",o.emptyEntity)("buttonsSticky",!0)("showCancelButton",!0),i(94),T("ngModel",o.demo.scope),m("options",o.demoOptions)}},dependencies:[be,U,H,Be,Ne,$,Ua,ot,fn,wn,it,at,rt,Kt,za,ye,Yt,Nn,ct,Rn,Wn,pt,xt,mt,dt,kn,Tn,cn,Rt,X,ve,we],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var Kn=(a,r)=>
4135r.className;function Dc(a,r){if(a&1&&(e(0,` 4136 `),n(1,"tr"),e(2,` 4137 `),n(3,"td")(4,"code",18),e(5),t()(),e(6,` 4138 `),n(7,"td")(8,"code",18),e(9),t()(),e(10,` 4139 `),n(11,"td",3),e(12),t(),e(13,` 4140 `),n(14,"td",18),e(15),t(),e(16,` 4141 `),n(17,"td",18),e(18),t(),e(19,` 4142 `),n(20,"td"),c(21,"app-sg-verdict",19),t(),e(22,` 4143 `),t(),e(23,` 4144 `)),a&2){let l=r.$implicit;i(5),p(l.className),i(4),p(l.home),i(3),p(l.does),i(3),p(l.uses||"\u2014"),i(3),p(l.files||"\u2014"),i(3),m("verdict",l.verdict)}}function Fc(a,r){if(a&1&&(e(0,` 4145 `),n(1,"tr"),e(2,` 4146 `),n(3,"td")(4,"code",18),e(5),t()(),e(6,` 4147 `),n(7,"td")(8,"code",18),e(9),t()(),e(10,` 4148 `),n(11,"td",3),e(12),t(),e(13,` 4149 `),n(14,"td"),c(15,"app-sg-verdict",19),t(),e(16,` 4150 `),t(),e(17,` 4151 `)),a&2){let l=r.$implicit;i(5),p(l.className),i(4),p(l.home),i(3),p(l.does),i(3),m("verdict",l.verdict)}}function Pc(a,r){if(a&1&&(e(0,` 4152 `),n(1,"tr"),e(2,` 4153 `),n(3,"td")(4,"code",18),e(5),t()(),e(6,` 4154 `),n(7,"td")(8,"code",18),e(9),t()(),e(10,` 4155 `),n(11,"td",3),e(12),t(),e(13,` 4156 `),t(),e(14,` 4157 `)),a&2){let l=r.$implicit;i(5),p(l.className),i(4),p(l.home),i(3),p(l.does)}}function Ac(a,r){if(a&1&&(e(0,` 4158 `),n(1,"tr"),e(2,` 4159 `),n(3,"td")(4,"code",18),e(5),t()(),e(6,` 4160 `),n(7,"td",3),e(8),t(),e(9,` 4161 `),n(10,"td",18),e(11),t(),e(12,` 4162 `),n(13,"td",18),e(14),t(),e(15,` 4163 `),t(),e(16,` 4164 `)),a&2){let l=r.$implicit;i(5),p(l.className),i(3),p(l.home),i(3),p(l.does),i(3),p(l.uses)}}var Rl=(()=>{let r=class r{constructor(){this.contracts=vl,this.adjacentContracts=yl,this.deadContracts=wl,this.undefinedContracts=Cl}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-forms-contracts"]],standalone:!1,decls:255,vars:3,consts:[[3,"compact"],["id","digest",1,"card"],["side","shared"],[1,"text-small","text-grey"],[3,"routerLink"],[1,"overflow-x-auto"],[1,"table","table-bordered","table-hover","sg-doc-table"],[2,"width","16rem"],[2,"width","18rem"],[2,"width","5rem"],[2,"width","8rem"],["id","adjacent",1,"card"],[1,"table","table-bordered","sg-doc-table"],[2,"width","22rem"],["id","dead",1,"card"],[2,"width","20rem"],["id","undefined",1,"card"],[2,"width","24rem"],[1,"text-small"],[3,"verdict"]],template:function(s,o){s&1&&(c(0,"app-sg-verdict-legend",0),e(1,` 4165 4166`),n(2,"div",1),e(3,` 4167 `),n(4,"h3"),e(5,"The CSS contract digest"),t(),e(6,` 4168 `),n(7,"app-sg-caption",2),e(8,"2_layout/forms.scss \u2014 1,413 lines, ~200 selectors"),t(),e(9,` 4169 `),n(10,"p",3),e(11,` 4170 Every form class the app declares, what it does, and how much of the app depends on it. 4171 These are class-only contracts \u2014 no Angular component owns them, so nothing stops a 4172 template from using one in a context where it does nothing. The `),n(12,"code"),e(13,"drift"),t(),e(14,` entries 4173 scoped under `),n(15,"code"),e(16,".horizontal-form"),t(),e(17,` are exactly that case: they read as 4174 general-purpose modifiers and are not. See them fail on the 4175 `),n(18,"a",4),e(19,"Defects"),t(),e(20,` tab. 4176 `),t(),e(21,` 4177 `),n(22,"div",5),e(23,` 4178 `),n(24,"table",6),e(25,` 4179 `),n(26,"thead"),e(27,` 4180 `),n(28,"tr"),e(29,` 4181 `),n(30,"th",7),e(31,"Class"),t(),e(32,` 4182 `),n(33,"th",8),e(34,"Declared"),t(),e(35,` 4183 `),n(36,"th"),e(37,"What it does"),t(),e(38,` 4184 `),n(39,"th",9),e(40,"Uses"),t(),e(41,` 4185 `),n(42,"th",9),e(43,"Files"),t(),e(44,` 4186 `),n(45,"th",10),e(46,"Verdict"),t(),e(47,` 4187 `),t(),e(48,` 4188 `),t(),e(49,` 4189 `),n(50,"tbody"),e(51,` 4190 `),S(52,Dc,24,6,null,null,Kn),t(),e(54,` 4191 `),t(),e(55,` 4192 `),t(),e(56,` 4193 `),n(57,"p",3),e(58,` 4194 One row is a defect on its own terms: `),n(59,"strong")(60,"code"),e(61,".form-label"),t(),e(62,` is declared three 4195 times`),t(),e(63," at top level ("),n(64,"code"),e(65,":160"),t(),e(66,", "),n(67,"code"),e(68,":176"),t(),e(69,", "),n(70,"code"),e(71,":685"),t(),e(72,`), plus 4196 twice more as `),n(73,"code"),e(74,"legend.form-label"),t(),e(75," nested inside "),n(76,"code"),e(77,".horizontal-form"),t(),e(78,`. 4197 Line 176 reaches it through a shared selector list with `),n(79,"code"),e(80,".form-group input"),t(),e(81,` and 4198 `),n(82,"code"),e(83,".form-group label"),t(),e(84,`. The three blocks do not conflict outright, but resolving the 4199 value of any one property means reading all three \u2014 there is nothing visual to render, 4200 which is why it stays a table row. 4201 `),t(),e(85,` 4202`),t(),e(86,` 4203 4204`),n(87,"div",11),e(88,` 4205 `),n(89,"h3"),e(90,"Form contracts declared elsewhere"),t(),e(91,` 4206 `),n(92,"app-sg-caption",2),e(93,"not everything a form needs lives in forms.scss"),t(),e(94,` 4207 `),n(95,"p",3),e(96,` 4208 These partials own the rest. Two of them \u2014 `),n(97,"code"),e(98,".resetBtn"),t(),e(99,` and 4209 `),n(100,"code"),e(101,"hr.form-section"),t(),e(102,` \u2014 are scoped so tightly that using them anywhere else is 4210 silently a no-op, and `),n(103,"code"),e(104,".pb-settings-column"),t(),e(105,` is the largest single-consumer form 4211 contract in the app: ~130 lines re-specifying form layout for one host. 4212 `),t(),e(106,` 4213 `),n(107,"div",5),e(108,` 4214 `),n(109,"table",12),e(110,` 4215 `),n(111,"thead"),e(112,` 4216 `),n(113,"tr"),e(114,` 4217 `),n(115,"th",7),e(116,"Class"),t(),e(117,` 4218 `),n(118,"th",13),e(119,"Declared"),t(),e(120,` 4219 `),n(121,"th"),e(122,"What it does"),t(),e(123,` 4220 `),n(124,"th",10),e(125,"Verdict"),t(),e(126,` 4221 `),t(),e(127,` 4222 `),t(),e(128,` 4223 `),n(129,"tbody"),e(130,` 4224 `),S(131,Fc,18,4,null,null,Kn),t(),e(133,` 4225 `),t(),e(134,` 4226 `),t(),e(135,` 4227`),t(),e(136,` 4228 4229`),n(137,"div",14),e(138,` 4230 `),n(139,"h3"),e(140,"Dead \u2014 declared, never used"),t(),e(141,` 4231 `),n(142,"app-sg-caption",2),e(143,"measured, documented, not deleted"),t(),e(144,` 4232 `),n(145,"p",3),e(146,` 4233 Eight classes with zero references in any `),n(147,"code"),e(148,".html"),t(),e(149," "),n(1
423350,"em"),e(151,"and"),t(),e(152,` any 4234 `),n(153,"code"),e(154,".ts"),t(),e(155,` \u2014 roughly 80 lines, including a ~50-line hand-built checkmark checkbox 4235 that predates `),n(156,"code"),e(157,"p-checkbox"),t(),e(158,`. Dead CSS is harmless: it is weight, not breakage. 4236 `),t(),e(159,` 4237 `),n(160,"p",3),e(161,` 4238 `),n(162,"code"),e(163,".form-sticky-form-buttons-on"),t(),e(164,` looks like a ninth and is not. It never appears in 4239 markup either, but `),n(165,"code"),e(166,"sticky-form-buttons.directive.ts"),t(),e(167,` applies it from TypeScript 4240 \u2014 checking `),n(168,"code"),e(169,".html"),t(),e(170,` alone would have deleted a live class. That is the whole 4241 reason this list was measured against both file types. 4242 `),t(),e(171,` 4243 `),n(172,"div",5),e(173,` 4244 `),n(174,"table",12),e(175,` 4245 `),n(176,"thead"),e(177,` 4246 `),n(178,"tr"),e(179,` 4247 `),n(180,"th",8),e(181,"Class"),t(),e(182,` 4248 `),n(183,"th",15),e(184,"Declared"),t(),e(185,` 4249 `),n(186,"th"),e(187,"What it would have done"),t(),e(188,` 4250 `),t(),e(189,` 4251 `),t(),e(190,` 4252 `),n(191,"tbody"),e(192,` 4253 `),S(193,Pc,15,3,null,null,Kn),t(),e(195,` 4254 `),t(),e(196,` 4255 `),t(),e(197,` 4256`),t(),e(198,` 4257 4258`),n(199,"div",16),e(200,` 4259 `),n(201,"h3"),e(202,"Undefined \u2014 used, never declared"),t(),e(203,` 4260 `),n(204,"app-sg-caption",2),e(205,"the opposite failure, and the worse one"),t(),e(206,` 4261 `),n(207,"p",3),e(208,` 4262 Markup that names a treatment which does not exist. The template reads as styled and renders 4263 bare, and nothing at the call site suggests it. `),n(209,"strong"),e(210,`Four of these are emitted by the 4264 dynamic form itself`),t(),e(211,`, so the app ships markup referencing its own undeclared 4265 classes; two more come from `),n(212,"code"),e(213,"app-admin-filter"),t(),e(214,`'s second layout and from a 4266 commented-out block. `),n(215,"code"),e(216,".text-danger"),t(),e(217,` is the widest: 83 uses across 36 templates, 4267 and it is not Bootstrap-provided here because this app compiles a trimmed Bootstrap that 4268 never included it. Two component stylesheets declare a local copy, which is why it is not 4269 uniformly broken \u2014 it works in exactly two components. 4270 `),t(),e(218,` 4271 `),n(219,"div",5),e(220,` 4272 `),n(221,"table",12),e(222,` 4273 `),n(223,"thead"),e(224,` 4274 `),n(225,"tr"),e(226,` 4275 `),n(227,"th",8),e(228,"Class"),t(),e(229,` 4276 `),n(230,"th",17),e(231,"Where it comes from"),t(),e(232,` 4277 `),n(233,"th"),e(234,"What it does"),t(),e(235,` 4278 `),n(236,"th",9),e(237,"Uses"),t(),e(238,` 4279 `),t(),e(239,` 4280 `),t(),e(240,` 4281 `),n(241,"tbody"),e(242,` 4282 `),S(243,Ac,17,4,null,null,Kn),t(),e(245,` 4283 `),t(),e(246,` 4284 `),t(),e(247,` 4285 `),n(248,"p",3),e(249,` 4286 Every row above renders as a broken/correct pair on the 4287 `),n(250,"a",4),e(251,"Defects"),t(),e(252,` tab, which is the only way to see that a class 4288 does nothing \u2014 by definition it leaves no trace in the markup. 4289 `),t(),e(253,` 4290`),t(),e(254,` 4291`)),s&2&&(m("compact",!0),i(18),m("routerLink","../defects"),i(34),E(o.contracts),i(79),E(o.adjacentContracts),i(62),E(o.deadContracts),i(50),E(o.undefinedContracts),i(7),m("routerLink","../defects"))},dependencies:[$,X,ve,we],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var Oc=()=>[],Nc=(a,r)=>
4291r.title,Bc=(a,r)=>r.label;function Wc(a,r){if(a&1&&(e(0,` 4292 `),n(1,"a",86),e(2),t(),e(3,` 4293 `)),a&2){let l=u().$implicit;i(),m("routerLink",V(3,Oc))("fragment",l.anchor),i(),p(l.title)}}function Rc(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(` 4294 `,l.title,` 4295 `)}}function Lc(a,r){a&1&&e(0," below ")}function qc(a,r){a&1&&e(0," no visual ")}function Vc(a,r){if(a&1&&(e(0,` 4296 `),n(1,"tr"),e(2,` 4297 `),n(3,"td"),e(4,` 4298 `),v(5,Wc,4,4)(6,Rc,1,1),t(),e(7,` 4299 `),n(8,"td",2),e(9),t(),e(10,` 4300 `),n(11,"td",85),e(12),t(),e(13,` 4301 `),n(14,"td",2),e(15,` 4302 `),v(16,Lc,1,0)(17,qc,1,0),t(),e(18,` 4303 `),t(),e(19,` 4304 `)),a&2){let l=r.$implicit;i(5),y(l.demonstrable?5:6),i(4),p(l.where),i(3),p(l.measured),i(4),y(l.demonstrable?16:17)}}function zc(a,r){if(a&1&&(e(0,` 4305 `),n(1,"option",87),e(2),t(),e(3,` 4306 `)),a&2){let l=r.$implicit;i(),m("ngValue",l.value),i(),p(l.label)}}var Ll=(()=>{let r=class r{constructor(){this.snapshotDate=Gn,this.defects=_l,this.demoOptions=ft,this.viewOnlyFields=[new z({key:"dfName",controlName:"dfName",label:"First Name"})],this.headerFields=[new z({key:"dfHeader",controlName:"dfHeader",label:"Jersey Number",fieldHeader:"Uniform"})],this.viewOnlyEntity={dfName:"Dana"},this.emptyEntity={},this.demo={},this.calendarToggles={stock:!0,intended:!0}}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-forms-defects"]],standalone:!1,decls:750,vars:24,consts:[["id","register",1,"card"],["side","shared"],[1,"text-small","text-grey"],[1,"overflow-x-auto"],[1,"table","table-bordered","table-hover","sg-doc-table"],[2,"width","20rem"],[2,"width","18rem"],[2,"width","7rem"],["id","noform",1,"card"],[1,"row"],[1,"col-md-6"],["side","admin"],[3,"ngSubmit"],[1,"form-group"],["for","sgInForm"],["id","sgInForm","type","text","name","sgInForm","placeholder","Player name",3,"ngModelChange","ngModel"],["for","sgOutOfForm"],["id","sgOutOfForm","type","text","name","sgOutOfForm","placeholder","Player name",3,"ngModelChange","ngModel"],["id","asterisk",1,"card"],[1,"col-md-3"],["for","sgAstA"],["aria-hidden","true",1,"required-asterisk"],["id","sgAstA","type","text","placeholder","00"],["for","sgAstB"],[1,"text-danger"],["id","sgAstB","type","text","placeholder","00"],["for","sgAstC"],[1,"required"],["id","sgAstC","type","text","placeholder","00"],["for","sgAstD"],[1,"required-indicator"],["id","sgAstD","type","text","placeholder","00"],["id","text-danger",1,"card"],[1,"col-md-4"],[1,"form-group","form-error"],["for","sgTdA"],["id","sgTdA","type","text","value","not-an-email","readonly",""],[1,"form-error-message"],["for","sgTdB"],["id","sgTdB","type","text","value","not-an-email","readonly",""],["for","sgTdC"],["id","sgTdC","type","text","value","not-an-email","readonly",""],[1,"text-red"],["id","admin-filter-horizontal",1,"card"],["fragment","admin-filter-horizontal",3,"routerLink"],["id","calendar-filters",1,"card"],[1,"calendar-filters"],[1,"form-check"],["inputId","sgTogA",3,"ngModelChange","ngModel"],["for","sgTogA"],[1,"form-check",2,"--p-toggleswitch-handle-size",".5rem","--p-toggleswitch-width","1.5rem","--p-toggleswitch-height",".75rem"],["inputId","sgTogB",3,"ngModelChange","ngModel"],["for","sgTogB"],["id","scoping",1,"card"],[1,"horizontal-form"],[1,"form-group","form-dropdown"],["for","sgFdA"],["inputId","sgFdA","optionLabel","label","optionValue","value","appendTo","body",3,"options"],["for","sgFdB"],["inputId","sgFdB","optionLabel","label","optionValue","value","appendTo","body",3,"options"],[1,"row","mt-3"],[1,"report-filters","p-2"],[1,"resetBtn"],[1,"far","fa-redo-alt"],[1,"p-2"],["id","labels",1,"card"],["for","sgLblNative"],["id","sgLblNative","name","sgLblNative"],["for","sgLblGood"],["inputId","sgLblGood","optionLabel","label","optionValue","value","appendTo","body","styleClass","full-width",3,"ngModelChange","options","ngModel"],["for","sgLblBroken"],["id","sgLblBroken","optionLabel","label","optionValue","value","appendTo","body","styleClass","full-width",3,"ngModelChange","options","ngModel"],["id","emitted-undefined",1,"card"],["formID","sgDefectViewOnly",3,"fields","entity","viewOnly","horizontalForm"],["formID","sgDefectHeader",3,"fields","entity","contentFieldsMode","showSubmitButton","showCancelButton"],["fieldName","dfHeader"],["id","dead-checkbox",1,"card"],[1,"form-checkbox"],["type","checkbox"],[1,"checkmark"],["inputId","sgDeadChk",3,"binary"],["for","sgDeadChk"],["id","no-visual",1,"card"],[3,"routerLink"],["fragment","missing",3,"routerLink"],[1,"text-small"],[3,"routerLink","fragment"],[3,"ngValue"]],template:function(s,o){s&1&&(n(0,"div",0),e(1,` 4307 `),n(2,"h3"),e(3,"Defect register"),t(),e(4,` 4308 `),n(5,"app-sg-caption",1),e(6),t(),e(7,` 4309 `),n(8,"p",2),e(9,` 4310 Everything on this page that is measurably wrong, in one table. Each row is a measurement 4311 rather than an opinion. Ten of the fifteen have something to look at, and those are rendered 4312 below as a `),n(10,"strong"),e(11,"broken / correct pair"),t(),e(12,` \u2014 the markup as it ships beside the 4313 markup that works. The other five have no visual: a duplicated CSS declaration, an unguarded 4314 dereference, three `),n(13,"code"),e(14,"console.log"),t(),e(15,`s, an orphaned module and a commented-out nav 4315 entry. Those stay table rows, and they say so, so the absence reads as deliberate rather 4316 than as an oversight. 4317 `),t(),e(16,` 4318 `),n(17,"div",3),e(18,` 4319 `),n(19,"table",4),e(20,` 4320 `),n(21,"thead"),e(22,` 4321 `),n(23,"tr"),e(24,` 4322 `),n(25,"th",5),e(26,"Defect"),t(),e(27,` 4323 `),n(28,"th",6),e(29,"Where"),t(),e(30,` 4324 `),n(31,"th"),e(32,"Measured"),t(),e(33,` 4325 `),n(34,"th",7),e(35,"Rendered"),t(),e(36,` 4326 `),t(),e(37,` 4327 `),t(),e(38,` 4328 `),n(39,"tbody"),e(40,` 4329 `),S(41,Vc,20,4,null,null,Nc),t(),e(43,` 4330 `),t(),e(44,` 4331 `),t(),e(45,` 4332`),t(),e(46,` 4333 4334`),n(47,"div",8),e(48,` 4335 `),n(49,"h3"),e(50,"Enter does nothing on ~280 screens"),t(),e(51,` 4336 `),n(52,"app-sg-caption",1),e(53,"305 templates \u2014 the largest single finding"),t(),e(54,` 4337 `),n(55,"p",2),e(56,` 4338 A control does not need a `),n(57,"code"),e(58,"<form>"),t(),e(59,` to work, and plenty of these are 4339 deliberate \u2014 a filter panel driven by a Run button has nothing to submit. But the 4340 population is far larger than the deliberate cases, and the consequences are uniform: no 4341 implicit submission, no `),n(60,"code"),e(61,"ngSubmit"),t(),e(62,`, no form landmark for a screen reader, and 4342 browsers treat each control as unrelated for autofill. `),n(63,"strong"),e(64,`116 of the 305 sit inside a 4343 dialog`),t(),e(65,`, where the missing Enter is most surprising. 4344 `),t(),e(66,` 4345 `),n(67,"div",9),e(68,` 4346 `),n(69,"div",10),e(70,` 4347 `),n(71,"app-sg-caption",11),e(72,"correct \u2014 inside a <form>, Enter submits"),t(),e(73,` 4348 `),n(74,"form",12),g("ngSubmit",function(h){return h.preventDefault()}),e(75,` 4349 `),n(76,"div",13),e(77,` 4350 `),n(78,"label",14),e(79,"Search"),t(),e(80,` 4351 `),n(81,"input",15),M("ngModelChange",function(h){return I(o.demo.inForm,h)||(o.demo.inForm=h),h}),t(),e(82,` 4352 `),t(),e(83,` 4353 `),t(),e(84,` 4354 `),t(),e(85,` 4355 `),n(86,"div",10),e(87,` 4356 `),n(88,"app-sg-caption",11),e(89,"as it ships \u2014 no <form>, Enter is inert"),t(),e(90,` 4357 `),n(91,"div",13),e(92,` 4358 `),n(93,"label",16),e(94,"Search"),t(),e(95,` 4359 `),n(96,"input",17),M("ngModelChange",function(h){return I(o.demo.outOfForm,h)||(o.demo.outOfForm=h),h}),t(),e(97,` 4360 `),t(),e(98,` 4361 `),t(),e(99,` 4362 `),t(),e(100,` 4363 `),n(101,"p",2),e(102,` 4364 Type into both and press Enter. The left one fires a submit; the right one does nothing. 4365 That difference is the whole of the finding \u2014 the two look identical, which is exactly
4366 why it has never been noticed screen by screen. 4367 `),t(),e(103,` 4368`),t(),e(104,` 4369 4370`),n(105,"div",18),e(106,` 4371 `),n(107,"h3"),e(108,"28 of 74 required markers render unstyled"),t(),e(109,` 4372 `),n(110,"app-sg-caption",1),e(111,"three of seven markups reference classes that do not exist"),t(),e(112,` 4373 `),n(113,"p",2),e(114,` 4374 All four asterisks below sit in a positioned `),n(115,"code"),e(116,".form-group"),t(),e(117,`, so 4375 `),n(118,"code"),e(119,".required-asterisk"),t(),e(120,"'s "),n(121,"code"),e(122,"position: absolute; left: -0.4rem"),t(),e(123,` lands 4376 correctly. Only the first one is orange. The other three inherit body colour, and nothing at 4377 the call site distinguishes them \u2014 every one reads as a deliberate required marker. 4378 `),t(),e(124,` 4379 `),n(125,"div",9),e(126,` 4380 `),n(127,"div",19),e(128,` 4381 `),n(129,"app-sg-caption",11),e(130,"correct \u2014 .required-asterisk, 30 uses"),t(),e(131,` 4382 `),n(132,"div",13),e(133,` 4383 `),n(134,"label",20),e(135,"Jersey Number "),n(136,"span",21),e(137,"*"),t()(),e(138,` 4384 `),c(139,"input",22),e(140,` 4385 `),t(),e(141,` 4386 `),t(),e(142,` 4387 `),n(143,"div",19),e(144,` 4388 `),n(145,"app-sg-caption",11),e(146,"as it ships \u2014 .text-danger, 18 uses"),t(),e(147,` 4389 `),n(148,"div",13),e(149,` 4390 `),n(150,"label",23),e(151,"Jersey Number "),n(152,"span",24),e(153,"*"),t()(),e(154,` 4391 `),c(155,"input",25),e(156,` 4392 `),t(),e(157,` 4393 `),t(),e(158,` 4394 `),n(159,"div",19),e(160,` 4395 `),n(161,"app-sg-caption",11),e(162,"as it ships \u2014 .required, 9 uses"),t(),e(163,` 4396 `),n(164,"div",13),e(165,` 4397 `),n(166,"label",26),e(167,"Jersey Number "),n(168,"span",27),e(169,"*"),t()(),e(170,` 4398 `),c(171,"input",28),e(172,` 4399 `),t(),e(173,` 4400 `),t(),e(174,` 4401 `),n(175,"div",19),e(176,` 4402 `),n(177,"app-sg-caption",11),e(178,"as it ships \u2014 .required-indicator, 1 use"),t(),e(179,` 4403 `),n(180,"div",13),e(181,` 4404 `),n(182,"label",29),e(183,"Jersey Number "),n(184,"span",30),e(185,"*"),t()(),e(186,` 4405 `),c(187,"input",31),e(188,` 4406 `),t(),e(189,` 4407 `),t(),e(190,` 4408 `),t(),e(191,` 4409`),t(),e(192,` 4410 4411`),n(193,"div",32),e(194,` 4412 `),n(195,"h3")(196,"code"),e(197,".text-danger"),t(),e(198," is used 83 times and declared nowhere"),t(),e(199,` 4413 `),n(200,"app-sg-caption",1),e(201,"36 templates \u2014 error text rendering in body colour"),t(),e(202,` 4414 `),n(203,"p",2),e(204,` 4415 Nothing in `),n(205,"code"),e(206,"assets/css/sass"),t(),e(207,` declares it \u2014 this app compiles a trimmed 4416 Bootstrap that never included the class. Two component stylesheets declare a local copy 4417 (`),n(208,"code"),e(209,"create-scheduled-report/create.component.scss:2"),t(),e(210,` and 4418 `),n(211,"code"),e(212,"message-edit-bubble.component.scss:81"),t(),e(213,`), and three more declare only a 4419 `),n(214,"code"),e(215,":hover"),t(),e(216,` variant on top of a base colour that does not exist. So it works in 4420 exactly two components and is inert in the other 34 templates. 4421 `),t(),e(217,` 4422 `),n(218,"div",9),e(219,` 4423 `),n(220,"div",33),e(221,` 4424 `),n(222,"app-sg-caption",11),e(223,"correct \u2014 .form-error-message"),t(),e(224,` 4425 `),n(225,"div",34),e(226,` 4426 `),n(227,"label",35),e(228,"Email"),t(),e(229,` 4427 `),c(230,"input",36),e(231,` 4428 `),n(232,"div",37),e(233,"Email must be a valid email address"),t(),e(234,` 4429 `),t(),e(235,` 4430 `),t(),e(236,` 4431 `),n(237,"div",33),e(238,` 4432 `),n(239,"app-sg-caption",11),e(240,"as it ships \u2014 .text-danger"),t(),e(241,` 4433 `),n(242,"div",13),e(243,` 4434 `),n(244,"label",38),e(245,"Email"),t(),e(246,` 4435 `),c(247,"input",39),e(248,` 4436 `),n(249,"div",24),e(250,"Email must be a valid email address"),t(),e(251,` 4437 `),t(),e(252,` 4438 `),t(),e(253,` 4439 `),n(254,"div",33),e(255,` 4440 `),n(256,"app-sg-caption",11),e(257,"for comparison \u2014 .text-red is declared"),t(),e(258,` 4441 `),n(259,"div",13),e(260,` 4442 `),n(261,"label",40),e(262,"Email"),t(),e(263,` 4443 `),c(264,"input",41),e(265,` 4444 `),n(266,"div",42),e(267,"Email must be a valid email address"),t(),e(268,` 4445 `),t(),e(269,` 4446 `),t(),e(270,` 4447 `),t(),e(271,` 4448 `),n(272,"p",2),e(273,` 4449 Remediation is owned by the system-alert normalization project, which already tracks this 4450 class among its 407 no-op colored-text usages and proposes mapping it to 4451 `),n(274,"code"),e(275,".text-red"),t(),e(276,` \u2014 the third column above is what that would look like. 4452 `),t(),e(277,` 4453`),t(),e(278,` 4454 4455`),n(279,"div",43),e(280,` 4456 `),n(281,"h3")(282,"code"),e(283,"app-admin-filter"),t(),e(284,"'s "),n(285,"code"),e(286,"[horizontal]"),t(),e(287," layout has no CSS at all"),t(),e(288,` 4457 `),n(289,"app-sg-caption",1),e(290,"a shared component's second layout mode, unstyled"),t(),e(291,` 4458 `),n(292,"p",2),e(293,` 4459 `),n(294,"code"),e(295,"admin-filter.component.scss"),t(),e(296," is a "),n(297,"strong"),e(298,"0-byte file"),t(),e(299,`, and 4460 `),n(300,"code"),e(301,".admin-filter-container"),t(),e(302,", "),n(303,"code"),e(304,".filters-section"),t(),e(305,` and 4461 `),n(306,"code"),e(307,".content-section"),t(),e(308,` \u2014 the three classes that layout depends on \u2014 are 4462 declared in no stylesheet in the app. The mode emits the markup of a left filter rail beside
4463 projected content and renders as stacked full-width blocks. Its two consumers, 4464 `),n(309,"code"),e(310,"bulk-cancel"),t(),e(311," and "),n(312,"code"),e(313,"advanced-bulk-edit"),t(),e(314,`, ship that way. 4465 `),t(),e(315,` 4466 `),n(316,"p",2),e(317,` 4467 Both layouts are rendered on the 4468 `),n(318,"a",44),e(319,"Architectures"),t(),e(320,` 4469 tab, one after the other. This is the clearest case on the page of why undefined classes are 4470 worse than dead ones: the component's API, its projection slots and its class names all 4471 describe a rail, and reading the template gives you no reason to doubt it. 4472 `),t(),e(321,` 4473`),t(),e(322,` 4474 4475`),n(323,"div",45),e(324,` 4476 `),n(325,"h3")(326,"code"),e(327,".calendar-filters"),t(),e(328," is commented out"),t(),e(329,` 4477 `),n(330,"app-sg-caption",1),e(331,"3_modules/templates.scss:842-847 \u2014 live in 2 templates"),t(),e(332,` 4478 `),n(333,"p",2),e(334,` 4479 The declaration block exists in the partial and is entirely commented out, so its three 4480 `),n(335,"code"),e(336,"--p-toggleswitch-*"),t(),e(337,` overrides never apply. The two templates that carry the 4481 class \u2014 `),n(338,"code"),e(339,"club-calendar/calendar"),t(),e(340,` and 4482 `),n(341,"code"),e(342,"schedule-sign-up/time-slots"),t(),e(343,` \u2014 get stock PrimeNG toggle switches instead of 4483 the smaller ones the rail was designed around. Cosmetic, which is why it survived, and a 4484 good example of a class that is not dead and not working. 4485 `),t(),e(344,` 4486 `),n(345,"div",9),e(346,` 4487 `),n(347,"div",10),e(348,` 4488 `),n(349,"app-sg-caption",11),e(350,"as it ships \u2014 stock size, the class does nothing"),t(),e(351,` 4489 `),n(352,"div",46),e(353,` 4490 `),n(354,"div",47),e(355,` 4491 `),n(356,"p-toggleswitch",48),M("ngModelChange",function(h){return I(o.calendarToggles.stock,h)||(o.calendarToggles.stock=h),h}),t(),e(357,` 4492 `),n(358,"label",49),e(359,"Practices"),t(),e(360,` 4493 `),t(),e(361,` 4494 `),t(),e(362,` 4495 `),t(),e(363,` 4496 `),n(364,"div",10),e(365,` 4497 `),n(366,"app-sg-caption",11),e(367,"what the commented-out block intended"),t(),e(368,` 4498 `),n(369,"div",50),e(370,` 4499 `),n(371,"p-toggleswitch",51),M("ngModelChange",function(h){return I(o.calendarToggles.intended,h)||(o.calendarToggles.intended=h),h}),t(),e(372,` 4500 `),n(373,"label",52),e(374,"Practices"),t(),e(375,` 4501 `),t(),e(376,` 4502 `),t(),e(377,` 4503 `),t(),e(378,` 4504 `),n(379,"p",2),e(380,` 4505 The right-hand switch sets the same three custom properties inline, which is the only way to 4506 show what the partial would have done. It is a demonstration, not a proposed fix \u2014 4507 uncommenting the block is the fix, and this page does not apply it. 4508 `),t(),e(381,` 4509`),t(),e(382,` 4510 4511`),n(383,"div",53),e(384,` 4512 `),n(385,"h3"),e(386,"Classes that only work inside one container"),t(),e(387,` 4513 `),n(388,"app-sg-caption",1),e(389,".form-dropdown (26 uses), .resetBtn, .wide-label, .inline-form"),t(),e(390,` 4514 `),n(391,"p",2),e(392,` 4515 These are declared only as descendants of something else, so they read as general-purpose 4516 modifiers and silently do nothing outside their one scope. The pairs below are the same 4517 markup in both positions. 4518 `),t(),e(393,` 4519 `),n(394,"div",9),e(395,` 4520 `),n(396,"div",10),e(397,` 4521 `),n(398,"app-sg-caption",11),e(399,"correct \u2014 .form-dropdown inside .horizontal-form"),t(),e(400,` 4522 `),n(401,"div",54),e(402,` 4523 `),n(403,"div",55),e(404,` 4524 `),n(405,"label",56),e(406,"Season"),t(),e(407,` 4525 `),c(408,"p-select",57),e(409,` 4526 `),t(),e(410,` 4527 `),t(),e(411,` 4528 `),t(),e(412,` 4529 `),n(413,"div",10),e(414,` 4530 `),n(415,"app-sg-caption",11),e(416,"as it ships \u2014 the same class, outside one"),t(),e(417,` 4531 `),n(418,"div",55),e(419,` 4532 `),n(420,"label",58),e(421,"Season"),t(),e(422,` 4533 `),c(423,"p-select",59),e(424,`
4534 `),t(),e(425,` 4535 `),t(),e(426,` 4536 `),t(),e(427,` 4537 `),n(428,"div",60),e(429,` 4538 `),n(430,"div",10),e(431,` 4539 `),n(432,"app-sg-caption",11),e(433,"correct \u2014 .resetBtn inside .report-filters"),t(),e(434,` 4540 `),n(435,"div",61),e(436,` 4541 `),n(437,"a",62),c(438,"i",63),t(),e(439,` 4542 `),t(),e(440,` 4543 `),t(),e(441,` 4544 `),n(442,"div",10),e(443,` 4545 `),n(444,"app-sg-caption",11),e(445,"as it ships \u2014 the same anchor, outside one"),t(),e(446,` 4546 `),n(447,"div",64),e(448,` 4547 `),n(449,"a",62),c(450,"i",63),t(),e(451,` 4548 `),t(),e(452,` 4549 `),t(),e(453,` 4550 `),t(),e(454,` 4551 `),n(455,"p",2),e(456,` 4552 `),n(457,"code"),e(458,".resetBtn"),t(),e(459," is deliberately outside the "),n(460,"code"),e(461,"btn-*"),t(),e(462,` namespace because it is 4553 not a button variant, and that is fine. The problem is only that 55 report filter grids use 4554 it without being inside `),n(463,"code"),e(464,".report-filters"),t(),e(465,` \u2014 the advanced panel of 4555 `),n(466,"code"),e(467,"app-admin-filter"),t(),e(468,` is the one place that container exists. 4556 `),t(),e(469,` 4557`),t(),e(470,` 4558 4559`),n(471,"div",65),e(472,` 4560 `),n(473,"h3"),e(474,"56% of labels have no working association"),t(),e(475,` 4561 `),n(476,"app-sg-caption",1),e(477,"1,657 labels, 723 with a for attribute"),t(),e(478,` 4562 `),n(479,"p",2),e(480,` 4563 The pairing rule differs by control, and the third case below is the one that costs 4564 something: a PrimeNG component renders its own inner input, so `),n(481,"code"),e(482,"for"),t(),e(483,` pointed at 4565 the component's `),n(484,"code"),e(485,"id"),t(),e(486,` resolves to a wrapper element that is not a form control. 4566 The label looks associated in the markup, passes a casual review, and does nothing. 4567 `),t(),e(487,` 4568 `),n(488,"div",9),e(489,` 4569 `),n(490,"div",33),e(491,` 4570 `),n(492,"app-sg-caption",11),e(493,"correct \u2014 native, for \u2192 id"),t(),e(494,` 4571 `),n(495,"div",13),e(496,` 4572 `),n(497,"label",66),e(498,"Season"),t(),e(499,` 4573 `),n(500,"select",67),e(501,` 4574 `),S(502,zc,4,2,null,null,Bc),t(),e(504,` 4575 `),t(),e(505,` 4576 `),t(),e(506,` 4577 `),n(507,"div",33),e(508,` 4578 `),n(509,"app-sg-caption",11),e(510,"correct \u2014 PrimeNG, for \u2192 inputId"),t(),e(511,` 4579 `),n(512,"div",13),e(513,` 4580 `),n(514,"label",68),e(515,"Season"),t(),e(516,` 4581 `),n(517,"p-select",69),M("ngModelChange",function(h){return I(o.demo.goodLabel,h)||(o.demo.goodLabel=h),h}),t(),e(518,` 4582 `),t(),e(519,` 4583 `),t(),e(520,` 4584 `),n(521,"div",33),e(522,` 4585 `),n(523,"app-sg-caption",11),e(524,"as it ships \u2014 for \u2192 the component's id"),t(),e(525,` 4586 `),n(526,"div",13),e(527,` 4587 `),n(528,"label",70),e(529,"Season"),t(),e(530,` 4588 `),n(531,"p-select",71),M("ngModelChange",function(h){return I(o.demo.brokenLabel,h)||(o.demo.brokenLabel=h),h}),t(),e(532,` 4589 `),t(),e(533,` 4590 `),t(),e(534,` 4591 `),t(),e(535,` 4592 `),n(536,"p",2),e(537,` 4593 Click each of the three labels. The first two open their control; the third does nothing. 4594 Remediation across all ~820 bare labels is the parked label-for cleanup project. 4595 `),t(),e(538,` 4596`),t(),e(539,` 4597 4598`),n(540,"div",72),e(541,` 4599 `),n(542,"h3"),e(543,"Four classes the dynamic form emits have no stylesheet"),t(),e(544,` 4600 `),n(545,"app-sg-caption",1),e(546,".f-value, .form-wrapper, .form-group--field-header, .timeDropDown"),t(),e(547,` 4601 `),n(548,"p",2),e(549,` 4602 The app ships markup referencing its own undeclared classes. There is nothing to point at in 4603 a template \u2014 the class is right there in the component's HTML \u2014 so the only way 4604 to see it is beside something that is styled. 4605 `),t(),e(550,` 4606 `),n(551,"div",9),e(552,` 4607 `),n(553,"div",10),e(554,` 4608 `),n(555,"app-sg-caption",11),e(556,"as it ships \u2014 view-only value in .f-value"),t(),e(557,` 4609 `),n(558,"app-dynamic-form",73),e(559,` 4610 `),t(),e(560,` 4611 `),t(),e(561,` 4612 `),n(562,"div",10),e(563,` 4613 `),n(564,"app-sg-caption",11),e(565,"as it ships \u2014 field.fieldHeader in .form-group--field-header"),t(),e(566,` 4614 `),n(567,"app-dynamic-form",74),e(568,` 4615 `),c(569,"app-dynamic-form-field",75),e(570,` 4616 `),t(),e(571,` 4617 `),t(),e(572,` 4618 `),t(),e(573,` 4619 `),n(574,"p",2),e(575,` 4620 The read-only value on the left renders in body text with no treatment of any kind \u2014 4621 no label weight, no field chrome, nothing to distinguish a value from the prose around it. 4622 The field header on the right renders as an unstyled line above the label. Both classes exist 4623 in the component's template and in no stylesheet. 4624 `),n(576,"code"),e(577,".form-wrapper"),t(),e(578," is the widest of the four: "),n(579,"code"),e(580,"dynamic-form.component.html:2"),t(),e(581,` 4625 wraps `),n(582,"strong"),e(583,"every form in the app"),t(),e(584,` in it, plus 30 hand-written uses, and three 4626 component stylesheets define their own local version. 4627 `),t(),e(585,` 4628`),t(),e(586,` 4629 4630`),n(587,"div",76),e(588,` 4631 `),n(589,"h3"),e(590,"Eight dead classes \u2014 the one worth seeing"),t(),e(591,` 4632 `),n(592,"app-sg-caption",1),e(593,".form-checkbox \u2014 ~50 lines across 6 rule blocks"),t(),e(594,` 4633 `),n(595,"p",2),e(596,` 4634 Dead CSS has no visual by definition, but this one is different: it is a hand-built checkmark 4635 checkbox that predates `),n(597,"code"),e(598,"p-checkbox"),t(),e(599,`, and its stylesheet expects a specific markup 4636 shape. Below is that shape. Because the class is dead the CSS is gone, so the hidden n
4636ative 4637 input it was meant to replace shows through and the `),n(600,"code"),e(601,".checkmark"),t(),e(602,` span renders as 4638 nothing. 4639 `),t(),e(603,` 4640 `),n(604,"div",9),e(605,` 4641 `),n(606,"div",10),e(607,` 4642 `),n(608,"app-sg-caption",11),e(609,"as it would have been \u2014 the markup its CSS expects"),t(),e(610,` 4643 `),n(611,"div",77),e(612,` 4644 `),n(613,"label"),e(614,` 4645 `),c(615,"input",78),e(616,` 4646 `),c(617,"span",79),e(618,` 4647 Dead class \u2014 renders as a bare browser checkbox 4648 `),t(),e(619,` 4649 `),t(),e(620,` 4650 `),t(),e(621,` 4651 `),n(622,"div",10),e(623,` 4652 `),n(624,"app-sg-caption",11),e(625,"correct \u2014 what replaced it"),t(),e(626,` 4653 `),n(627,"div",47),e(628,` 4654 `),c(629,"p-checkbox",80),e(630,` 4655 `),n(631,"label",81),e(632,"p-checkbox, the sanctioned control"),t(),e(633,` 4656 `),t(),e(634,` 4657 `),t(),e(635,` 4658 `),t(),e(636,` 4659`),t(),e(637,` 4660 4661`),n(638,"div",82),e(639,` 4662 `),n(640,"h3"),e(641,"The five with no visual"),t(),e(642,` 4663 `),n(643,"app-sg-caption",1),e(644,"real, measured, and nothing to render"),t(),e(645,` 4664 `),n(646,"p",2),e(647,` 4665 Listed here rather than silently dropped, so the gap in the demos above reads as deliberate. 4666 `),t(),e(648,` 4667 `),n(649,"ul",2),e(650,` 4668 `),n(651,"li"),e(652,` 4669 `),n(653,"strong")(654,"code"),e(655,".form-label"),t(),e(656," is declared three times"),t(),e(657,` \u2014 4670 `),n(658,"code"),e(659,"forms.scss:160"),t(),e(660,", "),n(661,"code"),e(662,":176"),t(),e(663,", "),n(664,"code"),e(665,":685"),t(),e(666,`, plus twice more as 4671 `),n(667,"code"),e(668,"legend.form-label"),t(),e(669," inside "),n(670,"code"),e(671,".horizontal-form"),t(),e(672,`. The blocks do not 4672 conflict outright, so nothing renders wrong; resolving any one property just means 4673 reading all three. 4674 `),t(),e(673,` 4675 `),n(674,"li"),e(675,` 4676 `),n(676,"strong")(677,"code"),e(678,"DynamicFormField.controlName"),t(),e(679,` is typed optional and is 4677 mandatory`),t(),e(680," \u2014 "),n(681,"code"),e(682,"dynamic-form-field.model.ts:237"),t(),e(683,` dereferences it 4678 unguarded, so a hand-built field without one throws at construction. Nothing renders 4679 because nothing can. It only bites outside production code, which is exactly what this 4680 harness is; see the `),n(684,"a",83),e(685,"Fields"),t(),e(686,` tab. 4681 `),t(),e(687,` 4682 `),n(688,"li"),e(689,` 4683 `),n(690,"strong"),e(691,"Three production "),n(692,"code"),e(693,"console.log"),t(),e(694,"s"),t(),e(695,` \u2014 4684 `),n(696,"code"),e(697,"validators.model.ts:232"),t(),e(698,` fires on every min-validation, 4685 `),n(699,"code"),e(700,"dynamic-form.component.ts:444"),t(),e(701,` logs the whole form object on every submit, 4686 and `),n(702,"code"),e(703,"checkboxGroupCheck()"),t(),e(704,` logs its event. Open the console and submit any 4687 form on this page to see the second one. 4688 `),t(),e(705,` 4689 `),n(706,"li"),e(707,` 4690 `),n(708,"strong"),e(709,"The form-builder system has one consumer"),t(),e(710,` \u2014 4691 `),n(711,"code"),e(712,"shared/modules/form-builder/"),t(),e(713," holds the only "),n(714,"code"),e(715,"steps"),t(),e(716,` / 4692 `),n(717,"code"),e(718,"columnSpan"),t(),e(719," / "),n(720,"code"),e(721,"multiStep"),t(),e(722,` metadata in the codebase and is 4693 reachable only from `),n(723,"code"),e(724,"/form-builder-demo"),t(),e(725,`. Described on the 4694 `),n(726,"a",84),e(727,"Architectures"),t(),e(728,` tab. 4695 `),t(),e(729,` 4696 `),n(730,"li"),e(731,` 4697 `),n(732,"strong"),e(733,"The styleguide is unreachable from the nav"),t(),e(734,` \u2014 4698 `),n(735,"code"),e(736,"left-nav.component.html:529-537"),t(),e(737,`, the super-admin entry is commented out, so 4699 this harness is URL-only. `),n(738,"code"),e(739,"shared/constants.ts:25"),t(),e(740,` also still lists the dead 4700 `),n(741,"code"),e(742,"/styleguide"),t(),e(743," path; the route is "),n(744,"code"),e(745,"/admin/styleguide"),t(),e(746,`. 4701 `),t(),e(747,` 4702 `),t(),e(748,` 4703`),t(),e(749,` 4704`)),s&2&&(i(6),f("measured on ",o.snapshotDate," \u2014 nothing here is fixed by this page"),i(35),E(o.defects),i(40),T("ngModel",o.demo.inForm),i(15),T("ngModel",o.demo.outOfForm),i(222),m("routerLink","../architectures"),i(38),T("ngModel",o.calendarToggles.stock),i(15),T("ngModel",o.calendarToggles.intended),i(37),m("options",o.demoOptions),i(15),m("options",o.demoOptions),i(79),E(o.demoOptions),i(15),m("options",o.demoOptions),T("ngModel",o.demo.goodLabel),i(14),m("options",o.demoOptions),T("ngModel",o.demo.brokenLabel),i(27),m("fields",o.viewOnlyFields)("entity",o.viewOnlyEntity)("viewOnly",!0)("horizontalForm",!0),i(9),m("fields",o.headerFields)("entity",o.emptyEntity)("contentFieldsMode",!0)("showSubmitButton",!1)("showCancelButton",!1),i(62),m("binary",!0),i(55),m("routerLink","../fields"),i(42),m("routerLink","../architectures"))},dependencies:[Ea,Fe,Pe,be,U,fa,H,Sa,Be,Ne,$,Oe,ye,cn,X],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var ql=(()=>
4704{let r=class r{constructor(d){this.siteDataService=d}ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-tables"]],standalone:!1,decls:236,vars:0,consts:[[1,""],[1,"table"]],template:function(s,o){s&1&&(n(0,"div",0),e(1,` 4705 `),n(2,"h2"),e(3,"Tables"),t(),e(4,` 4706 `),n(5,"h3"),e(6,"Base Style"),t(),e(7,` 4707 `),n(8,"div",0),e(9,` 4708 `),n(10,"table",1),e(11,` 4709 `),n(12,"thead"),e(13,` 4710 `),n(14,"tr"),e(15,` 4711 `),n(16,"th"),e(17,"Table Head"),t(),e(18,` 4712 `),n(19,"th"),e(20,"Table Head"),t(),e(21,` 4713 `),n(22,"th"),e(23,"Table Head"),t(),e(24,` 4714 `),n(25,"th"),e(26,"Table Head"),t(),e(27,` 4715 `),n(28,"th"),e(29,"Table Head"),t(),e(30,` 4716 `),n(31,"th"),e(32,"Table Head"),t(),e(33,` 4717 `),n(34,"th"),e(35,"Table Head"),t(),e(36,` 4718 `),n(37,"th"),e(38,"Table Head"),t(),e(39,` 4719 `),t(),e(40,` 4720 `),t(),e(41,` 4721 `),n(42,"tbody"),e(43,` 4722 `),n(44,"tr"),e(45,` 4723 `),n(46,"td"),e(47,"Table Cell"),t(),e(48,` 4724 `),n(49,"td"),e(50,"Table Cell"),t(),e(51,` 4725 `),n(52,"td"),e(53,"Table Cell"),t(),e(54,` 4726 `),n(55,"td"),e(56,"Table Cell"),t(),e(57,` 4727 `),n(58,"td"),e(59,"Table Cell"),t(),e(60,` 4728 `),n(61,"td"),e(62,"Table Cell"),t(),e(63,` 4729 `),n(64,"td"),e(65,"Table Cell"),t(),e(66,` 4730 `),n(67,"td"),e(68,"Table Cell"),t(),e(69,` 4731 `),t(),e(70,` 4732 `),n(71,"tr"),e(72,` 4733 `),n(73,"td"),e(74,"Table Cell"),t(),e(75,` 4734 `),n(76,"td"),e(77,"Table Cell"),t(),e(78,` 4735 `),n(79,"td"),e(80,"Table Cell"),t(),e(81,` 4736 `),n(82,"td"),e(83,"Table Cell"),t(),e(84,` 4737 `),n(85,"td"),e(86,"Table Cell"),t(),e(87,` 4738 `),n(88,"td"),e(89,"Table Cell"),t(),e(90,` 4739 `),n(91,"td"),e(92,"Table Cell"),t(),e(93,` 4740 `),n(94,"td"),e(95,"Table Cell"),t(),e(96,` 4741 `),t(),e(97,` 4742 `),n(98,"tr"),e(99,` 4743 `),n(100,"td"),e(101,"Table Cell"),t(),e(102,` 4744 `),n(103,"td"),e(104,"Table Cell"),t(),e(105,` 4745 `),n(106,"td"),e(107,"Table Cell"),t(),e(108,` 4746 `),n(109,"td"),e(110,"Table Cell"),t(),e(111,` 4747 `),n(112,"td"),e(113,"Table Cell"),t(),e(114,` 4748 `),n(115,"td"),e(116,"Table Cell"),t(),e(117,` 4749 `),n(118,"td"),e(119,"Table Cell"),t(),e(120,` 4750 `),n(121,"td"),e(122,"Table Cell"),t(),e(123,` 4751 `),t(),e(124,` 4752 `),n(125,"tr"),e(126,` 4753 `),n(127,"td"),e(128,"Table Cell"),t(),e(129,` 4754 `),n(130,"td"),e(131,"Table Cell"),t(),e(132,` 4755 `),n(133,"td"),e(134,"Table Cell"),t(),e(135,` 4756 `),n(136,"td"),e(137,"Table Cell"),t(),e(138,` 4757 `),n(139,"td"),e(140,"Table Cell"),t(),e(141,` 4758 `),n(142,"td"),e(143,"Table Cell"),t(),e(144,` 4759 `),n(145,"td"),e(146,"Table Cell"),t(),e(147,` 4760 `),n(148,"td"),e(149,"Table Cell"),t(),e(150,` 4761 `),t(),e(151,` 4762 `),n(152,"tr"),e(153,` 4763 `),n(154,"td"),e(155,"Table Cell"),t(),e(156,` 4764 `),n(157,"td"),e(158,"Table Cell"),t(),e(159,` 4765 `),n(160,"td"),e(161,"Table Cell"),t(),e(162,` 4766 `),n(163,"td"),e(164,"Table Cell"),t(),e(165,` 4767 `),n(166,"td"),e(167,"Table Cell"),t(),e(168,` 4768 `),n(169,"td"),e(170,"Table Cell"),t(),e(171,` 4769 `),n(172,"td"),e(173,"Table Cell"),t(),e(174,` 4770 `),n(175,"td"),e(176,"Table Cell"),t(),e(177,` 4771 `),t(),e(178,` 4772 `),n(179,"tr"),e(180,` 4773 `),n(181,"td"),e(182,"Table Cell"),t(),e(183,` 4774 `),n(184,"td"),e(185,"Table Cell"),t(),e(186,` 4775 `),n(187,"td"),e(188,"Table Cell"),t(),e(189,` 4776 `),n(190,"td"),e(191,"Table Cell"),t(),e(192,` 4777 `),n(193,"td"),e(194,"Table Cell"),t(),e(195,` 4778 `),n(196,"td"),e(197,"Table Cell"),t(),e(198,` 4779 `),n(199,"td"),e(200,"Table Cell"),t(),e(201,` 4780 `),n(202,"td"),e(203,"Table Cell"),t(),e(204,` 4781 `),t(),e(205,` 4782 `),n(206,"tr"),e(207,` 4783 `),n(208,"td"),e(209,"Table Cell"),t(),e(210,` 4784 `),n(211,"td"),e(212,"Table Cell"),t(),e(213,` 4785 `),n(214,"td"),e(215,"Table Cell"),t(),e(216,` 4786 `),n(217,"td"),e(218,"Table Cell"),t(),e(219,` 4787 `),n(220,"td"),e(221,"Table Cell"),t(),e(222,` 4788 `),n(223,"td"),e(224,"Table Cell"),t(),e(225,` 4789 `),n(226,"td"),e(227,"Table Cell"),t(),e(228,` 4790 `),n(229,"td"),e(230,"Table Cell"),t(),e(231,` 4791 `),t(),e(232,` 4792 `),t(),e(233,` 4793 `),t(),e(234,` 4794 `),t(),e(235,` 4795 `),t())},encapsulation:2});let a=r;return a})();var Ul=(()=>
vendor: 7,304 bytes, lines 4795-4874
4795{let r=class r{constructor(d){this.siteDataService=d}ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-sg-utilities"]],standalone:!1,decls:484,vars:8,consts:[[1,"text-small","text-grey"],[1,"page"],[1,"section"],[1,"container-fluid"],[1,"row","mt-5"],[1,"col-12"],[1,"d-flex","align-items-center","flex-wrap","gap-3"],[1,"card","border-radius",2,"width","140px"],[1,"sub-head","mb-2"],[1,"card","border-radius-sm",2,"width","140px"],[1,"card","border-radius-lg",2,"width","140px"],[1,"card","border-radius-xl",2,"width","140px"],[1,"card","box-shadow-none",2,"width","180px"],[1,"d-block","mb-1"],[1,"text-smallest"],[1,"card","box-shadow-sm",2,"width","180px"],[1,"card","box-shadow",2,"width","180px"],[1,"card","box-shadow-md",2,"width","180px"],[1,"card","box-shadow-lg",2,"width","180px"],[1,"card","box-shadow-xl",2,"width","180px"],[1,"table","table-bordered","table-hover"],["status","default","text","Default Status"],["status","default","text","Default",3,"dots"],["status","default","text","Default","tooltipText","This is default"],["status","active","text","Active Status"],["status","active","text","Active",3,"dots"],["status","active","text","Active","tooltipText","Currently active"],["status","success","text","Success Status"],["status","success","text","Success",3,"dots"],["status","success","text","Success","tooltipText","Operation successful"],["status","error","text","Error Status"],["status","error","text","Error",3,"dots"],["status","error","text","Error","tooltipText","An error occurred"],["status","warning","text","Warning Status"],["status","warning","text","Warning",3,"dots"],["status","warning","text","Warning","tooltipText","Please review"],["status","note","text","Note Status"],["status","note","text","Note",3,"dots"],["status","note","text","Note","tooltipText","Important note"],[1,"table-info"],["colspan","4",1,"text-center"],["status","success"],["status","error",3,"dots"],["status","warning","tooltipText","Hover for info"],[1,"table","table-bordered"],[3,"pillCount"],[1,"mb-3"],[1,"btn","btn-primary"],[1,"btn","btn-secondary","ml-2"],[1,"btn","btn-tertiary","ml-2"],[1,"btn","ml-2"],[1,"btn","btn-primary","btn-sm"],[1,"btn","btn-secondary","btn-sm","ml-2"],["disabled","",1,"btn","btn-primary"],["disabled","",1,"btn","btn-secondary","ml-2"],["type","success"],["type","error"],["type","warning"],["type","info"],[1,"text-muted"]],template:function(s,o){s&1&&(n(0,"h2"),e(1,"Utilities & Misc"),t(),e(2,` 4796`),n(3,"p",0),e(4,` 4797 Border radius, box shadow, status indicators, badges, buttons, alerts, loading states and user 4798 components. Everything below was hidden behind `),n(5,"code"),e(6,"d-none"),t(),e(7,` on the old 4799 `),n(8,"code"),e(9,"/admin/ui-test-page"),t(),e(10,` landing and had not rendered in a long time \u2014 expect rough 4800 edges. The component sections here want splitting into `),n(11,"code"),e(12,"components/*"),t(),e(13,` pages. 4801`),t(),e(14,` 4802 4803`),n(15,"main",1),e(16,` 4804 `),n(17,"section",2),e(18,` 4805 `),n(19,"div",3),e(20,` 4806 `),n(21,"div",4),e(22,` 4807 `),n(23,"div",5),e(24,` 4808 `),n(25,"h2"),e(26,"Border Radius"),t(),e(27,` 4809 `),n(28,"div",6),e(29,` 4810 `),n(30,"div",7),e(31,` 4811 `),n(32,"div",8),e(33,"border-radius"),t(),e(34,` 4812 `),n(35,"code"),e(36,".border-radius"),t(),c(37,"br"),e(38,` 4813 `),n(39,"code"),e(40,"4px"),t(),e(41,` 4814 `),t(),e(42,` 4815 `),n(43,"div",9),e(44,` 4816 `),n(45,"div",8),e(46,"border-radius-sm"),t(),e(47,` 4817 `),n(48,"code"),e(49,".border-radius-sm"),t(),c(50,"br"),e(51,` 4818 `),n(52,"code"),e(53,"4px"),t(),e(54,` 4819 `),t(),e(55,` 4820 `),n(56,"div",10),e(57,` 4821 `),n(58,"div",8),e(59,"border-radius-lg"),t(),e(60,` 4822 `),n(61,"code"),e(62,".border-radius-lg"),t(),c(63,"br"),e(64,` 4823 `),n(65,"code"),e(66,"8px"),t(),e(67,` 4824 `),t(),e(68,` 4825 `),n(69,"div",11),e(70,` 4826 `),n(71,"div",8),e(72,"border-radius-xl"),t(),e(73,` 4827 `),n(74,"code"),e(75,".border-radius-xl"),t(),c(76,"br"),e(77,` 4828 `),n(78,"code"),e(79,"16px"),t(),e(80,` 4829 `),t(),e(81,` 4830 `),t(),e(82,` 4831 `),t(),e(83,` 4832 `),t(),e(84,` 4833 4834 `),n(85,"div",4),e(86,` 4835 `),n(87,"div",5),e(88,` 4836 `),n(89,"h2"),e(90,"Box Shadows"),t(),e(91,` 4837 `),n(92,"div",6),e(93,` 4838 `),n(94,"div",12),e(95,` 4839 `),n(96,"div",8),e(97,"box-shadow-none"),t(),e(98,` 4840 `),n(99,"code",13),e(100,".box-shadow-none"),t(),e(101,` 4841 `),n(102,"code",14),e(103,"none"),t(),e(104,` 4842 `),t(),e(105,` 4843 `),n(106,"div",15),e(107,` 4844 `),n(108,"div",8),e(109,"box-shadow-sm"),t(),e(110,` 4845 `),n(111,"code",13),e(112,".box-shadow-sm"),t(),e(113,` 4846 `),n(114,"code",14),e(115,"0 2px 4px rgba(0,0,0,0.1)"),t(),e(116,` 4847 `),t(),e(117,` 4848 `),n(118,"div",16),e(119,` 4849 `),n(120,"div",8),e(121,"box-shadow"),t(),e(122,` 4850 `),n(123,"code",13),e(124,".box-shadow"),t(),e(125,` 4851 `),n(126,"code",14),e(127,"0 1px 2px rgba(0,0,0,0.08), 0 3px 6px -2px rgba(0,0,0,0.04)"),t(),e(128,` 4852 `),t(),e(129,` 4853 `),n(130,"div",17),e(131,` 4854 `),n(132,"div",8),e(133,"box-shadow-md"),t(),e(134,` 4855 `),n(135,"code",13),e(136,".box-shadow-md"),t(),e(137,` 4856 `),n(138,"code",14),e(139,"0 2px 5px rgba(0,0,0,0.26)"),t(),e(140,` 4857 `),t(),e(141,` 4858 `),n(142,"div",18),e(143,` 4859 `),n(144,"div",8),e(145,"box-shadow-lg"),t(),e(146,` 4860 `),n(147,"code",13),e(148,".box-shadow-lg"),t(),e(149,` 4861 `),n(150,"code",14),e(151,"0 2px 8px rgba(0,0,0,0.1)"),t(),e(152,` 4862 `),t(),e(153,` 4863 `),n(154,"div",19),e(155,` 4864 `),n(156,"div",8),e(157,"box-shadow-xl"),t(),e(158,` 4865 `),n(159,"code",13),e(160,".box-shadow-xl"),t(),e(161,` 4866 `),n(162,"code",14),e(163,"0 5px 15px rgba(0,0,0,0.3)"),t(),e(164,` 4867 `),t(),e(165,` 4868 `),t(),e(166,` 4869 `),t(),e(167,` 4870 `),t(),e(168,` 4871 `),n(169,"div",4),e(170,` 4872 `),n(171,"div",5),e(172,` 4873 `),n(173,"h2"),e(174,"Status Indicator Component - All Status Variations"),t(),e(175,` 4874 `),n(176,"table",20),e(177,`
4875 `),n(178,"thead"),e(179,` 4876 `),n(180,"tr"),e(181,` 4877 `),n(182,"th"),e(183,"Status Type"),t(),e(184,` 4878 `),n(185,"th"),e(186,"Text Only"),t(),e(187,` 4879 `),n(188,"th"),e(189,"With Dots"),t(),e(190,` 4880 `),n(191,"th"),e(192,"With Tooltip"),t(),e(193,` 4881 `),t(),e(194,` 4882 `),t(),e(195,` 4883 `),n(196,"tbody"),e(197,` 4884 `),n(198,"tr"),e(199,` 4885 `),n(200,"td")(201,"code"),e(202,"default"),t()(),e(203,` 4886 `),n(204,"td"),c(205,"app-status-indicator",21),e(206,` 4887 `),t(),e(207,` 4888 `),n(208,"td"),c(209,"app-status-indicator",22),t(),e(210,` 4889 `),n(211,"td"),c(212,"app-status-indicator",23),t(),e(213,` 4890 `),t(),e(214,` 4891 `),n(215,"tr"),e(216,` 4892 `),n(217,"td")(218,"code"),e(219,"active"),t()(),e(220,` 4893 `),n(221,"td"),c(222,"app-status-indicator",24),e(223,` 4894 `),t(),e(224,` 4895 `),n(225,"td"),c(226,"app-status-indicator",25),t(),e(227,` 4896 `),n(228,"td"),c(229,"app-status-indicator",26),t(),e(230,` 4897 `),t(),e(231,` 4898 `),n(232,"tr"),e(233,` 4899 `),n(234,"td")(235,"code"),e(236,"success"),t()(),e(237,` 4900 `),n(238,"td"),c(239,"app-status-indicator",27),e(240,` 4901 `),t(),e(241,` 4902 `),n(242,"td"),c(243,"app-status-indicator",28),t(),e(244,` 4903 `),n(245,"td"),c(246,"app-status-indicator",29),t(),e(247,` 4904 `),t(),e(248,` 4905 `),n(249,"tr"),e(250,` 4906 `),n(251,"td")(252,"code"),e(253,"error"),t()(),e(254,` 4907 `),n(255,"td"),c(256,"app-status-indicator",30),e(257,` 4908 `),t(),e(258,` 4909 `),n(259,"td"),c(260,"app-status-indicator",31),t(),e(261,` 4910 `),n(262,"td"),c(263,"app-status-indicator",32),t(),e(264,` 4911 `),t(),e(265,` 4912 `),n(266,"tr"),e(267,` 4913 `),n(268,"td")(269,"code"),e(270,"warning"),t()(),e(271,` 4914 `),n(272,"td"),c(273,"app-status-indicator",33),e(274,` 4915 `),t(),e(275,` 4916 `),n(276,"td"),c(277,"app-status-indicator",34),t(),e(278,` 4917 `),n(279,"td"),c(280,"app-status-indicator",35),t(),e(281,` 4918 `),t(),e(282,` 4919 `),n(283,"tr"),e(284,` 4920 `),n(285,"td")(286,"code"),e(287,"note"),t()(),e(288,` 4921 `),n(289,"td"),c(290,"app-status-indicator",36),t(),e(291,` 4922 `),n(292,"td"),c(293,"app-status-indicator",37),t(),e(294,` 4923 `),n(295,"td"),c(296,"app-status-indicator",38),t(),e(297,` 4924 `),t(),e(298,` 4925 `),n(299,"tr",39),e(300,` 4926 `),n(301,"td",40)(302,"strong"),e(303,`Projected Content Example (no text 4927 prop)`),t()(),e(304,` 4928 `),t(),e(305,` 4929 `),n(306,"tr"),e(307,` 4930 `),n(308,"td")(309,"code"),e(310,"projected"),t()(),e(311,` 4931 `),n(312,"td")(313,"app-status-indicator",41),e(314,"Custom Content Here"),t(),e(315,` 4932 `),t(),e(316,` 4933 `),n(317,"td")(318,"app-status-indicator",42),e(319,`Error with 4934 dots`),t()(),e(320,`
4935 `),n(321,"td")(322,"app-status-indicator",43),e(323,`Hover 4936 me`),t()(),e(324,` 4937 `),t(),e(325,` 4938 `),t(),e(326,` 4939 `),t(),e(327,` 4940 `),t(),e(328,` 4941 `),t(),e(329,` 4942 4943 4944 `),n(330,"div",4),e(331,` 4945 `),n(332,"div",5),e(333,` 4946 `),n(334,"h2"),e(335,"Other Badge Components"),t(),e(336,` 4947 `),n(337,"table",44),e(338,` 4948 `),n(339,"thead"),e(340,` 4949 `),n(341,"tr"),e(342,` 4950 `),n(343,"th"),e(344,"Component"),t(),e(345,` 4951 `),n(346,"th"),e(347,"Example"),t(),e(348,` 4952 `),t(),e(349,` 4953 `),t(),e(350,` 4954 `),n(351,"tbody"),e(352,` 4955 `),n(353,"tr"),e(354,` 4956 `),n(355,"td"),e(356,"Pill Counter"),t(),e(357,` 4957 `),n(358,"td")(359,"app-pill-counter",45),e(360,"Notifications"),t()(),e(361,` 4958 `),t(),e(362,` 4959 `),t(),e(363,` 4960 `),t(),e(364,` 4961 `),t(),e(365,` 4962 `),t(),e(366,` 4963 4964 `),n(367,"div",4),e(368,` 4965 `),n(369,"div",5),e(370,` 4966 `),n(371,"h2"),e(372,"Buttons"),t(),e(373,` 4967 `),n(374,"div",46),e(375,` 4968 `),n(376,"button",47),e(377,"Primary Button"),t(),e(378,` 4969 `),n(379,"button",48),e(380,"Secondary Button"),t(),e(381,` 4970 `),n(382,"button",49),e(383,"Tertiary Button"),t(),e(384,` 4971 `),n(385,"button",50),e(386,"Default Button"),t(),e(387,` 4972 `),t(),e(388,` 4973 4974 `),n(389,"div",46),e(390,` 4975 `),n(391,"button",51),e(392,"Small Primary"),t(),e(393,` 4976 `),n(394,"button",52),e(395,"Small Secondary"),t(),e(396,` 4977 `),t(),e(397,` 4978 4979 `),n(398,"div",46),e(399,` 4980 `),n(400,"button",53),e(401,"Disabled Primary"),t(),e(402,` 4981 `),n(403,"button",54),e(404,"Disabled Secondary"),t(),e(405,` 4982 `),t(),e(406,` 4983 `),t(),e(407,` 4984 `),t(),e(408,` 4985 4986 `),n(409,"div",4),e(410,` 4987 `),n(411,"div",5),e(412,` 4988 `),n(413,"h2"),e(414,"Alerts & Messages"),t(),e(415,` 4989 `),n(416,"div",46),e(417,` 4990 `),n(418,"app-inline-alert",55),e(419,"This is a success message"),t(),e(420,` 4991 `),t(),e(421,` 4992 `),n(422,"div",46),e(423,` 4993 `),n(424,"app-inline-alert",56),e(425,"This is an error message"),t(),e(426,` 4994 `),t(),e(427,` 4995 `),n(428,"div",46),e(429,` 4996 `),n(430,"app-inline-alert",57),e(431,"This is a warning message"),t(),e(432,` 4997 `),t(),e(433,` 4998 `),n(434,"div",46),e(435,` 4999 `),n(436,"app-inline-alert",58),e(437,"This is an info message"),t(),e(438,` 5000 `),t(),e(439,` 5001 `),t(),e(440,` 5002 `),t(),e(441,` 5003 `),n(442,"div",4),e(443,` 5004 `),n(444,"div",5),e(445,` 5005 `),n(446,"h2"),e(447,"Loading States"),t(),e(448,` 5006 `),n(449,"div",46),e(450,` 5007 `),c(451,"app-skeleton-template"),e(452,` 5008 `),t(),e(453,` 5009 `),t(),e(454,` 5010 `),t(),e(455,` 5011 5012 `),n(456,"div",4),e(457,` 5013 `),n(458,"div",5),e(459,` 5014 `),n(460,"h2"),e(461,"User Components"),t(),e(462,` 5015 `),n(463,"div",46),e(464,` 5016 `),c(465,"app-user-initials"),e(466,` 5017 `),t(),e(467,` 5018 `),t(),e(468,` 5019 `),t(),e(469,` 5020 5021 `),n(470,"div",4),e(471,` 5022 `),n(472,"div",5),e(473,` 5023 `),n(474,"p",59),e(475,` 5024 `),n(476,"em"),e(477,"This page is only visible to Super Admins for testing purposes."),t(),e(478,` 5025 `),t(),e(479,` 5026 `),t(),e(480,` 5027 `),t(),e(481,` 5028 `),t(),e(482,` 5029 `),t(),e(483,` 5030`),t()),s&2&&(i(209),m("dots",!0),i(17),m("dots",!0),i(17),m("dots",!0),i(17),m("dots",!0),i(17),m("dots",!0),i(16),m("dots",!0),i(25),m("dots",!0),i(41),m("pillCount",5))},dependencies:[nt,sn,le,We,lt],encapsulation:2});let a=r;return a})();function jc(a,r){if(a&1&&(e(0,` 5031 `),n(1,"div",15),e(2,` 5032 `),c(3,"i",16),e(4,` 5033 `),n(5,"small",17),e(6),t(),e(7,` 5034 `),t(),e(8,` 5035 `)),a&2){let l=r.$implicit;i(),m("title",l.class),i(2),ne(l.class),i(3),p(l.name)}}function Gc(a,r){if(a&1&&(e(0,` 5036 `),n(1,"p",5),e(2),t(),e(3,` 5037 `)),a&2){let l=u();i(2),q("Showing ",l.filteredV7Icons.length," of ",l.v7NewIcons.length)}}function $c(a,r){if(a&1&&(e(0,` 5038 `),n(1,"div",18),e(2,` 5039 `),c(3,"i",16),e(4,` 5040 `),n(5,"small",17),e(6),t(),e(7,` 5041 `),t(),e(8,` 5042 `)),a&2){let l=r.$implicit;i(),m("title",l.class),i(2),ne(l.class),i(3),f("k",l.name)}}function Hl(a){return{name:a,class:`fa-regular fa-${a}`}}var Kc=["0","00","1","2","3","360-degrees","4","5","6","7","8","9","a","abacus","accent-grave","acorn","address-book","address-card","air-conditioner","airplay","alarm-clock","alarm-exclamation","alarm-plus","alarm-snooze","album","album-circle-plus","album-circle-user","album-collection","album-collection-circle-plus","album-collection-circle-user","alicorn","alien","alien-8bit","align-center","align-justify","align-left","align-right","align-slash","alt","amp-guitar","ampersand","anchor","anchor-circle-check","anchor-circle-exclamation","anchor-circle-xmark","anchor-lock","angel","angle","angle-90","angle-down","angle-left","angle-right","angle-up","angles-down","angles-left","angles-right","angles-up","angles-up-down","ankh","apartment","aperture","apostrophe","apple-core","apple-whole","archway","arrow-down","arrow-down-1-9","arrow-down-9-1","arrow-down-a-z","arrow-down-arrow-up","arrow-down-big-small","arrow-down-from-arc","arrow-down-from-dotted-line","arrow-down-from-line","arrow-down-left","arrow-down-left-and-arrow-up-right-to-center","arrow-down-long","arrow-down-right","arrow-down-short-wide","arrow-down-small-big","arrow-down-square-triangle","arrow-down-to-arc","arrow-down-to-bracket","arrow-down-to-dotted-line","arrow-down-to-line","arrow-down-to-square","arrow-down-triangle-square","arrow-down-up-across-line","arrow-down-up-lock","arrow-down-wide-short","arrow-down-z-a","arrow-left","arrow-left-from-arc","arrow-left-from-line","arrow-left-long","arrow-left-long-to-line","arrow-left-to-arc","arrow-left-to-line","arrow-pointer","arrow-progress","arrow-right","arrow-right-arrow-left","arrow-right-from-arc","arrow-right-from-bracket","arrow-right-from-line","arrow-right-long","arrow-right-long-to-line","arrow-right-to-arc","arrow-right-to-bracket","arrow-right-to-city","arrow-right-to-line","arrow-rotate-left","arrow-rotate-right","arrow-trend-down","arrow-trend-up","arrow-tur
5042n-down","arrow-turn-down-left","arrow-turn-down-right","arrow-turn-left","arrow-turn-left-down","arrow-turn-left-up","arrow-turn-right","arrow-turn-up","arrow-up","arrow-up-1-9","arrow-up-9-1","arrow-up-a-z","arrow-up-arrow-down","arrow-up-big-small","arrow-up-from-arc","arrow-up-from-bracket","arrow-up-from-dotted-line","arrow-up-from-ground-water","arrow-up-from-line","arrow-up-from-square","arrow-up-from-water-pump","arrow-up-left","arrow-up-left-from-circle","arrow-up-long","arrow-up-right","arrow-up-right-and-arrow-down-left-from-center","arrow-up-right-dots","arrow-up-right-from-square","arrow-up-short-wide","arrow-up-small-big","arrow-up-square-triangle","arrow-up-to-arc","arrow-up-to-dotted-line","arrow-up-to-line","arrow-up-triangle-square","arrow-up-wide-short","arrow-up-z-a","arrows-cross","arrows-down-to-line","arrows-down-to-people","arrows-from-dotted-line","arrows-from-line","arrows-left-right","arrows-left-right-to-line","arrows-maximize","arrows-minimize","arrows-repeat","arrows-repeat-1","arrows-retweet","arrows-rotate","arrows-rotate-reverse","arrows-spin","arrows-split-up-and-left","arrows-to-circle","arrows-to-dot","arrows-to-dotted-line","arrows-to-eye","arrows-to-line","arrows-turn-right","arrows-turn-to-dots","arrows-up-down","arrows-up-down-left-right","arrows-up-to-line","asterisk","at","atom","atom-simple","audio-description","audio-description-slash","austral-sign","avocado","award","award-simple","axe","axe-battle","b","baby","baby-carriage","backpack","backward","backward-fast","backward-step","bacon","bacteria","bacterium","badge","badge-check","badge-dollar","badge-percent","badge-sheriff","badger-honey","badminton","bag-seedling","bag-shopping","bag-shopping-minus","bag-shopping-plus","bagel","bags-shopping","baguette","bahai","baht-sign","ball-pile","balloon","balloons","ballot","ballot-check","ban","ban-bug","ban-parking","ban-smoking","banana","bandage","bangladeshi-taka-sign","banjo","barcode","barcode-read","barcode-scan","bars","bars-filter","bars-progress","bars-sort","bars-staggered","baseball","baseball-bat-ball","basket-shopping","basket-shopping-minus","basket-shopping-plus","basket-shopping-simple","basketball","basketball-hoop","bat","bath","battery-bolt","battery-empty","battery-exclamation","battery-full","battery-half","battery-low","battery-quarter","battery-slash","battery-three-quarters","bed","bed-bunk","bed-empty","bed-front","bed-pulse","bee","beer-mug","beer-mug-empty","bell","bell-concierge","bell-exclamation","bell-on","bell-plus","bell-ring","bell-school","bell-school-slash","bell-slash","bells","bench-tree","bezier-curve","bicycle","billboard","bin-bottles","bin-bottles-recycle","bin-recycle","binary","binary-circle-check","binary-lock","binary-slash","binoculars","biohazard","bird","bitcoin-sign","blanket","blanket-fire","blender","blender-phone","blinds","blinds-open","blinds-raised","block","block-brick","block-brick-fire","block-question","block-quote","blog","blueberries","bold","bolt","bolt-auto","bolt-lightning","bolt-slash","bomb","bone","bone-break","bong","book","book-arrow-right","book-arrow-up","book-atlas","book-bible","book-blank","book-bookmark","book-circle-arrow-right","book-circle-arrow-up","book-copy","book-font","book-heart","book-journal-whills","book-medical","book-open","book-open-cover","book-open-reader","book-quran","book-section","book-skull","book-sparkles","book-tanakh","book-user","bookmark","bookmark-slash","books","books-medical","boombox","boot","boot-heeled","booth-curtain","border-all","border-bottom","border-bottom-right","border-center-h","border-center-v","border-inner","border-left","border-none","border-outer","border-right","border-top","border-top-left","bore-hole","bottle-droplet","bottle-water","bow-arrow","bowl-chopsticks","bowl-chopsticks-noodles","bowl-food","bowl-hot","bowl-rice","bowl-scoop","bowl-scoops","bowl-soft-serve","bowl-spoon","bowling-ball","bowling-ball-pin","bowling-pins","box","box-archive","box-ballot","box-check","box-circle-check","box-dollar","box-heart","box-open","box-open-full","box-taped","box-tissue","boxes-packing","boxes-stacked","boxing-glove","bracket-curly","bracket-curly-right","bracket-round","bracket-round-right","bracket-square","bracket-square-right","brackets-curly","brackets-round","brackets-square","braille","brain","brain-arrow-curved-right","brain-circuit","brake-warning","brazilian-real-sign","bread-loaf","bread-slice","bread-slice-butter","bridge","bridge-circle-check","bridge-circle-exclamation","bridge-circle-xmark","bridge-lock","bridge-suspension","bridge-water","briefcase","briefcase-arrow-right","briefcase-blank","briefcase-medical","brightness","brightness-low","bring-forward","bring-front","broccoli","broom","broom-ball","broom-wide","browser","browsers","brush","bucket","bug","bug-slash","bugs","building","building-circle-arrow-right","building-circle-check","building-circle-exclamation","building-circle-xmark","building-columns","building-flag","building-lock","building-magnifying-glass","building-memo","building-ngo","building-shield","building-un","building-user","building-wheat","buildings","bulldozer","bullhorn","bullseye","bullseye-arrow","bullseye-pointer","buoy","buoy-mooring","burger","burger-cheese","burger-fries","burger-glass","burger-lettuce","burger-soda","burrito","burst","bus","bus-school","bus-simple","business-time","butter","c","cabin","cabinet-filing","cable-car","cactus","cake-candles","cake-slice","calculator","calculator-simple","calendar","calendar-arrow-down","calendar-arrow-up","calendar-check","calendar-circle-exclamation","calendar-circle-minus","calendar-circle-plus","calendar-circle-user","calendar-clock","calendar-day","calendar-days","calendar-exclamation","calendar-heart","calendar-image","calendar-lines","calendar-lines-pen","calendar-minus","calendar-pen","calendar-plus","calendar-range","calendar-star","calendar-users","calendar-week","calendar-xmark","calendars","camcorder","camera","camera-cctv","camera-movie","camera-polaroid","camera-retro","camera-rotate","camera-security","camera-slash","camera-viewfinder","camera-web","camera-web-slash","campfire","campground","can-food","candle-holder","candy","candy-bar","candy-cane","candy-corn","cannabis","cannon","capsules","car","car-battery","car-bolt","car-building","car-bump","car-burst","car-bus","car-circle-bolt","car-garage","car-mirrors","car-on","car-rear","car-side","car-side-bolt","car-tilt","car-tunnel","car-wash","car-wrench","caravan","caravan-simple","card-club","card-diamond","card-heart","card-spade","cards","cards-blank","caret-down","caret-left","caret-right","caret-up","carrot","cars","cart-arrow-down","cart-arrow-up","cart-circle-arrow-down","cart-circle-arrow-up","cart-circle-check","cart-circle-exclamation","cart-circle-plus","cart-circle-xmark","cart-flatbed","cart-flatbed-boxes","cart-flatbed-empty","cart-flatbed-suitcase","cart
5042-minus","cart-plus","cart-shopping","cart-shopping-fast","cart-xmark","cash-register","cassette-betamax","cassette-tape","cassette-vhs","castle","cat","cat-space","cauldron","cedi-sign","cent-sign","certificate","chair","chair-office","chalkboard","chalkboard-user","champagne-glass","champagne-glasses","charging-station","chart-area","chart-bar","chart-bullet","chart-candlestick","chart-column","chart-gantt","chart-kanban","chart-line","chart-line-down","chart-line-up","chart-line-up-down","chart-mixed","chart-mixed-up-circle-currency","chart-mixed-up-circle-dollar","chart-network","chart-pie","chart-pie-simple","chart-pie-simple-circle-currency","chart-pie-simple-circle-dollar","chart-pyramid","chart-radar","chart-scatter","chart-scatter-3d","chart-scatter-bubble","chart-simple","chart-simple-horizontal","chart-tree-map","chart-user","chart-waterfall","check","check-double","check-to-slot","cheese","cheese-swiss","cherries","chess","chess-bishop","chess-bishop-piece","chess-board","chess-clock","chess-clock-flip","chess-king","chess-king-piece","chess-knight","chess-knight-piece","chess-pawn","chess-pawn-piece","chess-queen","chess-queen-piece","chess-rook","chess-rook-piece","chestnut","chevron-down","chevron-left","chevron-right","chevron-up","chevrons-down","chevrons-left","chevrons-right","chevrons-up","chf-sign","child","child-combatant","child-dress","child-reaching","children","chimney","chopsticks","church","circle","circle-0","circle-1","circle-2","circle-3","circle-4","circle-5","circle-6","circle-7","circle-8","circle-9","circle-a","circle-ampersand","circle-arrow-down","circle-arrow-down-left","circle-arrow-down-right","circle-arrow-left","circle-arrow-right","circle-arrow-up","circle-arrow-up-left","circle-arrow-up-right","circle-b","circle-bolt","circle-book-open","circle-bookmark","circle-c","circle-calendar","circle-camera","circle-caret-down","circle-caret-left","circle-caret-right","circle-caret-up","circle-check","circle-chevron-down","circle-chevron-left","circle-chevron-right","circle-chevron-up","circle-d","circle-dashed","circle-divide","circle-dollar","circle-dollar-to-slot","circle-dot","circle-down","circle-down-left","circle-down-right","circle-e","circle-ellipsis","circle-ellipsis-vertical","circle-envelope","circle-euro","circle-exclamation","circle-exclamation-check","circle-f","circle-g","circle-h","circle-half","circle-half-stroke","circle-heart","circle-i","circle-info","circle-j","circle-k","circle-l","circle-left","circle-location-arrow","circle-m","circle-microphone","circle-microphone-lines","circle-minus","circle-n","circle-nodes","circle-notch","circle-o","circle-p","circle-parking","circle-pause","circle-phone","circle-phone-flip","circle-phone-hangup","circle-play","circle-plus","circle-q","circle-quarter","circle-quarter-stroke","circle-quarters","circle-question","circle-r","circle-radiation","circle-right","circle-s","circle-small","circle-sort","circle-sort-down","circle-sort-up","circle-star","circle-sterling","circle-stop","circle-t","circle-three-quarters","circle-three-quarters-stroke","circle-trash","circle-u","circle-up","circle-up-left","circle-up-right","circle-user","circle-v","circle-video","circle-w","circle-waveform-lines","circle-x","circle-xmark","circle-y","circle-yen","circle-z","circles-overlap","citrus","citrus-slice","city","clapperboard","clapperboard-play","clarinet","claw-marks","clipboard","clipboard-check","clipboard-list","clipboard-list-check","clipboard-medical","clipboard-prescription","clipboard-question","clipboard-user","clock","clock-desk","clock-eight","clock-eight-thirty","clock-eleven","clock-eleven-thirty","clock-five","clock-five-thirty","clock-four-thirty","clock-nine","clock-nine-thirty","clock-one","clock-one-thirty","clock-rotate-left","clock-seven","clock-seven-thirty","clock-six","clock-six-thirty","clock-ten","clock-ten-thirty","clock-three","clock-three-thirty","clock-twelve","clock-twelve-thirty","clock-two","clock-two-thirty","clone","closed-captioning","closed-captioning-slash","clothes-hanger","cloud","cloud-arrow-down","cloud-arrow-up","cloud-binary","cloud-bolt","cloud-bolt-moon","cloud-bolt-sun","cloud-check","cloud-drizzle","cloud-exclamation","cloud-fog","cloud-hail","cloud-hail-mixed","cloud-meatball","cloud-minus","cloud-moon","cloud-moon-rain","cloud-music","cloud-plus","cloud-question","cloud-rain","cloud-rainbow","cloud-showers","cloud-showers-heavy","cloud-showers-water","cloud-slash","cloud-sleet","cloud-snow","cloud-sun","cloud-sun-rain","cloud-word","cloud-xmark","clouds","clouds-moon","clouds-sun","clover","club","coconut","code","code-branch","code-commit","code-compare","code-fork","code-merge","code-pull-request","code-pull-request-closed","code-pull-request-draft","code-simple","coffee-bean","coffee-beans","coffee-pot","coffin","coffin-cross","coin","coin-blank","coin-front","coin-vertical","coins","colon","colon-sign","columns-3","comet","comma","command","comment","comment-arrow-down","comment-arrow-up","comment-arrow-up-right","comment-captions","comment-check","comment-code","comment-dollar","comment-dots","comment-exclamation","comment-heart","comment-image","comment-lines","comment-medical","comment-mid
5042dle","comment-middle-top","comment-minus","comment-music","comment-pen","comment-plus","comment-question","comment-quote","comment-slash","comment-smile","comment-sms","comment-text","comment-xmark","comments","comments-dollar","comments-question","comments-question-check","compact-disc","compass","compass-drafting","compass-slash","compress","compress-wide","computer","computer-classic","computer-mouse","computer-mouse-scrollwheel","computer-speaker","container-storage","conveyor-belt","conveyor-belt-arm","conveyor-belt-boxes","conveyor-belt-empty","cookie","cookie-bite","copy","copyright","corn","corner","couch","court-sport","cow","cowbell","cowbell-circle-plus","crab","crate-apple","crate-empty","credit-card","credit-card-blank","credit-card-front","cricket-bat-ball","croissant","crop","crop-simple","cross","crosshairs","crosshairs-simple","crow","crown","crutch","crutches","cruzeiro-sign","crystal-ball","cube","cubes","cubes-stacked","cucumber","cup-straw","cup-straw-swoosh","cup-togo","cupcake","curling-stone","custard","d","dagger","dash","database","deer","deer-rudolph","delete-left","delete-right","democrat","desktop","desktop-arrow-down","dharmachakra","diagram-cells","diagram-lean-canvas","diagram-nested","diagram-next","diagram-predecessor","diagram-previous","diagram-project","diagram-sankey","diagram-subtask","diagram-successor","diagram-venn","dial","dial-high","dial-low","dial-max","dial-med","dial-med-low","dial-min","dial-off","diamond","diamond-exclamation","diamond-half","diamond-half-stroke","diamond-turn-right","dice","dice-d10","dice-d12","dice-d20","dice-d4","dice-d6","dice-d8","dice-five","dice-four","dice-one","dice-six","dice-three","dice-two","dinosaur","diploma","disc-drive","disease","display","display-arrow-down","display-chart-up","display-chart-up-circle-currency","display-chart-up-circle-dollar","display-code","display-medical","display-slash","distribute-spacing-horizontal","distribute-spacing-vertical","ditto","divide","dna","do-not-enter","dog","dog-leashed","dollar-sign","dolly","dolly-empty","dolphin","dong-sign","donut","door-closed","door-open","dove","down","down-from-dotted-line","down-from-line","down-left","down-left-and-up-right-to-center","down-long","down-right","down-to-bracket","down-to-dotted-line","down-to-line","download","dragon","draw-circle","draw-polygon","draw-square","dreidel","drone","drone-front","droplet","droplet-degree","droplet-percent","droplet-slash","drum","drum-steelpan","drumstick","drumstick-bite","dryer","dryer-heat","duck","dumbbell","dumpster","dumpster-fire","dungeon","e","ear","ear-deaf","ear-listen","ear-muffs","earth-africa","earth-americas","earth-asia","earth-europe","earth-oceania","eclipse","egg","egg-fried","eggplant","eject","elephant","elevator","ellipsis","ellipsis-stroke","ellipsis-stroke-vertical","ellipsis-vertical","empty-set","engine","engine-warning","envelope","envelope-circle-check","envelope-dot","envelope-open","envelope-open-dollar","envelope-open-text","envelopes","envelopes-bulk","equals","eraser","escalator","ethernet","euro-sign","excavator","exclamation","expand","expand-wide","explosion","eye","eye-dropper","eye-dropper-full","eye-dropper-half","eye-evil","eye-low-vision","eye-slash","eyes","f","face-angry","face-angry-horns","face-anguished","face-anxious-sweat","face-astonished","face-awesome","face-beam-hand-over-mouth","face-clouds","face-confounded","face-confused","face-cowboy-hat","face-diagonal-mouth","face-disappointed","face-disguise","face-dizzy","face-dotted","face-downcast-sweat","face-drooling","face-exhaling","face-explode","face-expressionless","face-eyes-xmarks","face-fearful","face-flushed","face-frown","face-frown-open","face-frown-slight","face-glasses","face-grimace","face-grin","face-grin-beam","face-grin-beam-sweat","face-grin-hearts","face-grin-squint","face-grin-squint-tears","face-grin-stars","face-grin-tears","face-grin-tongue","face-grin-tongue-squint","face-grin-tongue-wink","face-grin-wide","face-grin-wink","face-hand-over-mouth","face-hand-peeking","face-hand-yawn","face-head-bandage","face-holding-back-tears","face-hushed","face-icicles","face-kiss","face-kiss-beam","face-kiss-closed-eyes","face-kiss-wink-heart","face-laugh","face-laugh-beam","face-laugh-squint","face-laugh-wink","face-lying","face-mask","face-meh","face-meh-blank","face-melting","face-monocle","face-nauseated","face-nose-steam","face-party","face-pensive","face-persevering","face-pleading","face-pouting","face-raised-eyebrow","face-relieved","face-rolling-eyes","face-sad-cry","face-sad-sweat","face-sad-tear","face-saluting","face-scream","face-shush","face-sleeping","face-sleepy","face-smile","face-smile-beam","face-smile-halo","face-smile-hearts","face-smile-horns","face-smile-plus","face-smile-relaxed","face-smile-tear","face-smile-tongue","face-smile-upside-down","face-smile-wink","face-smiling-hands","face-smirking","face-spiral-eyes","face-sunglasses","face-surprise","face-swear","face-thermometer","face-thinking","face-tired","face-tissue","face-tongue-money","face-tongue-sweat","face-unamused","face-viewfinder","face-vomit","face-weary","face-woozy","face-worried","face-zany","face-zipper","falafel","family","family-dress","family-pants","fan","fan-table","farm","faucet","faucet-drip","fax","feather","feather-pointed","fence","ferris-wheel","ferry","field-hockey-stick-ball","file","file-arrow-down","file-arrow-up","file-audio","file-binary","file-certificate","file-chart-column","file-chart-pie","file-check","file-circle-check","file-circle-exclamation","file-circle-info","file-circle-minus","file-circle-plus","file-circle-question","file-circle-xmark","file-code","file-contract","file-csv","file-dashed-line","file-doc","file-eps","file-excel","file-exclamation","file-ex
5042port","file-gif","file-heart","file-image","file-import","file-invoice","file-invoice-dollar","file-jpg","file-lines","file-lock","file-magnifying-glass","file-medical","file-minus","file-mov","file-mp3","file-mp4","file-music","file-pdf","file-pen","file-plus","file-plus-minus","file-png","file-powerpoint","file-ppt","file-prescription","file-shield","file-signature","file-slash","file-spreadsheet","file-svg","file-user","file-vector","file-video","file-waveform","file-word","file-xls","file-xmark","file-xml","file-zip","file-zipper","files","files-medical","fill","fill-drip","film","film-canister","film-simple","film-slash","films","filter","filter-circle-dollar","filter-circle-xmark","filter-list","filter-slash","filters","fingerprint","fire","fire-burner","fire-extinguisher","fire-flame","fire-flame-curved","fire-flame-simple","fire-hydrant","fire-smoke","fireplace","fish","fish-bones","fish-cooked","fish-fins","fishing-rod","flag","flag-checkered","flag-pennant","flag-swallowtail","flag-usa","flashlight","flask","flask-gear","flask-round-poison","flask-round-potion","flask-vial","flatbread","flatbread-stuffed","floppy-disk","floppy-disk-circle-arrow-right","floppy-disk-circle-xmark","floppy-disk-pen","floppy-disks","florin-sign","flower","flower-daffodil","flower-tulip","flute","flux-capacitor","flying-disc","folder","folder-arrow-down","folder-arrow-up","folder-bookmark","folder-check","folder-closed","folder-gear","folder-grid","folder-heart","folder-image","folder-magnifying-glass","folder-medical","folder-minus","folder-music","folder-open","folder-plus","folder-tree","folder-user","folder-xmark","folders","fondue-pot","font","font-case","football","football-helmet","fork","fork-knife","forklift","fort","forward","forward-fast","forward-step","frame","franc-sign","french-fries","frog","function","futbol","g","galaxy","gallery-thumbnails","game-board","game-board-simple","game-console-handheld","game-console-handheld-crank","gamepad","gamepad-modern","garage","garage-car","garage-open","garlic","gas-pump","gas-pump-slash","gauge","gauge-circle-bolt","gauge-circle-minus","gauge-circle-plus","gauge-high","gauge-low","gauge-max","gauge-min","gauge-simple","gauge-simple-high","gauge-simple-low","gauge-simple-max","gauge-simple-min","gavel","gear","gear-code","gear-complex","gear-complex-code","gears","gem","genderless","ghost","gif","gift","gift-card","gifts","gingerbread-man","glass","glass-citrus","glass-empty","glass-half","glass-water","glass-water-droplet","glasses","glasses-round","globe","globe-pointer","globe-snow","globe-stand","goal-net","golf-ball-tee","golf-club","golf-flag-hole","gopuram","graduation-cap","gramophone","grapes","grate","grate-droplet","greater-than","greater-than-equal","grid","grid-2","grid-2-plus","grid-4","grid-5","grid-dividers","grid-h
5042orizontal","grid-round","grid-round-2","grid-round-2-plus","grid-round-4","grid-round-5","grill","grill-fire","grill-hot","grip","grip-dots","grip-dots-vertical","grip-lines","grip-lines-vertical","grip-vertical","group-arrows-rotate","guarani-sign","guitar","guitar-electric","guitars","gun","gun-slash","gun-squirt","h","h1","h2","h3","h4","h5","h6","hammer","hammer-brush","hammer-crash","hammer-war","hamsa","hand","hand-back-fist","hand-back-point-down","hand-back-point-left","hand-back-point-ribbon","hand-back-point-right","hand-back-point-up","hand-dots","hand-fingers-crossed","hand-fist","hand-heart","hand-holding","hand-holding-box","hand-holding-circle-dollar","hand-holding-dollar","hand-holding-droplet","hand-holding-hand","hand-holding-heart","hand-holding-magic","hand-holding-medical","hand-holding-seedling","hand-holding-skull","hand-horns","hand-lizard","hand-love","hand-middle-finger","hand-peace","hand-point-down","hand-point-left","hand-point-ribbon","hand-point-right","hand-point-up","hand-pointer","hand-scissors","hand-sparkles","hand-spock","hand-wave","handcuffs","hands","hands-asl-interpreting","hands-bound","hands-bubbles","hands-clapping","hands-holding","hands-holding-child","hands-holding-circle","hands-holding-diamond","hands-holding-dollar","hands-holding-heart","hands-praying","handshake","handshake-angle","handshake-simple","handshake-simple-slash","handshake-slash","hanukiah","hard-drive","hashtag","hashtag-lock","hat-beach","hat-chef","hat-cowboy","hat-cowboy-side","hat-santa","hat-winter","hat-witch","hat-wizard","head-side","head-side-brain","head-side-cough","head-side-cough-slash","head-side-gear","head-side-goggles","head-side-headphones","head-side-heart","head-side-mask","head-side-medical","head-side-virus","heading","headphones","headphones-simple","headset","heart","heart-circle-bolt","heart-circle-check","heart-circle-exclamation","heart-circle-minus","heart-circle-plus","heart-circle-xmark","heart-crack","heart-half","heart-half-stroke","heart-pulse","heat","helicopter","helicopter-symbol","helmet-battle","helmet-safety","helmet-un","hexagon","hexagon-check","hexagon-divide","hexagon-exclamation","hexagon-image","hexagon-minus","hexagon-plus","hexagon-vertical-nft","hexagon-vertical-nft-slanted","hexagon-xmark","high-definition","highlighter","highlighter-line","hill-avalanche","hill-rockslide","hippo","hockey-mask","hockey-puck","hockey-stick-puck","hockey-sticks","holly-berry","honey-pot","hood-cloak","horizontal-rule","horse","horse-head","horse-saddle","hose","hose-reel","hospital","hospital-user","hospitals","hot-tub-person","hotdog","hotel","hourglass","hourglass-clock","hourglass-end","hourglass-half","hourglass-start","house","house-blank","house-building","house-chimney","house-chimney-blank","house-chimney-crack","house-chimney-heart","house-chimney-medical","house-chimney-user","house-chimney-window","house-circle-check","house-circle-exclamation","house-circle-xmark","house-crack","house-day","house-fire","house-flag","house-flood-water","house-flood-water-circle-arrow-right","house-heart","house-laptop","house-lock","house-medical","house-medical-circle-check","house-medical-circle-exclamation","house-medical-circle-xmark","house-medical-flag","house-night","house-person-leave","house-person-return","house-signal","house-tree","house-tsunami","house-turret","house-user","house-water","house-window","hryvnia-sign","hundred-points","hurricane","hyphen","i","i-cursor","ice-cream","ice-skate","icicles","icons","id-badge","id-card","id-card-cl
5042ip","igloo","image","image-landscape","image-polaroid","image-polaroid-user","image-portrait","image-slash","image-user","images","images-user","inbox","inbox-full","inbox-in","inbox-out","inboxes","indent","indian-rupee-sign","industry","industry-windows","infinity","info","inhaler","input-numeric","input-pipe","input-text","integral","interrobang","intersection","island-tropical","italic","j","jack-o-lantern","jar","jar-wheat","jedi","jet-fighter","jet-fighter-up","joint","joystick","jug","jug-bottle","jug-detergent","k","kaaba","kazoo","kerning","key","key-skeleton","key-skeleton-left-right","keyboard","keyboard-brightness","keyboard-brightness-low","keyboard-down","keyboard-left","keynote","khanda","kidneys","kip-sign","kit-medical","kitchen-set","kite","kiwi-bird","kiwi-fruit","knife","knife-kitchen","l","lacrosse-stick","lacrosse-stick-ball","lambda","lamp","lamp-desk","lamp-floor","lamp-street","land-mine-on","landmark","landmark-dome","landmark-flag","landmark-magnifying-glass","language","laptop","laptop-arrow-down","laptop-binary","laptop-code","laptop-file","laptop-medical","laptop-mobile","laptop-slash","lari-sign","lasso","lasso-sparkles","layer-group","layer-minus","layer-plus","leaf","leaf-heart","leaf-maple","leaf-oak","leafy-green","left","left-from-line","left-long","left-long-to-line","left-right","left-to-line","lemon","less-than","less-than-equal","life-ring","light-ceiling","light-emergency","light-emergency-on","light-switch","light-switch-off","light-switch-on","lightbulb","lightbulb-cfl","lightbulb-cfl-on","lightbulb-dollar","lightbulb-exclamation","lightbulb-exclamation-on","lightbulb-gear","lightbulb-on","lightbulb-slash","lighthouse","lights-holiday","line-columns","line-height","lines-leaning","link","link-horizontal","link-horizontal-slash","link-simple","link-simple-slash","link-slash","lips","lira-sign","list","list-check","list-dropdown","list-music","list-ol","list-radio","list-timeline","list-tree","list-ul","litecoin-sign","loader","lobster","location-arrow","location-arrow-up","location-check","location-crosshairs","location-crosshairs-slash","location-dot","location-dot-slash","location-exclamation","location-minus","location-pen","location-pin","location-pin-lock","location-pin-slash","location-plus","location-question","location-smile","location-xmark","lock","lock-a","lock-hashtag","lock-keyhole","lock-keyhole-open","lock-open","locust","lollipop","loveseat","luchador-mask","lungs","lungs-virus","m","mace","magnet","magnifying-glass","magnifying-glass-arrow-right","magnifying-glass-arrows-rotate","magnifying-glass-chart","magnifying-glass-dollar","magnifying-glass-location","magnifying-glass-minus","magnifying-glass-music","magnifying-glass-play","magnifying-glass-plus","magnifying-glass-waveform","mailbox","mailbox-flag-up","manat-sign","mandolin","mango","manhole","map","map-location","map-location-dot","map-pin","marker","mars","mars-and-venus","mars-and-venus-burst","mars-double","mars-stroke","mars-stroke-right","mars-stroke-up","martini-glass","martini-glass-citrus","martini-glass-empty","mask","mask-face","mask-snorkel","mask-ventilator","masks-theater","mattress-pillow","maximize","meat","medal","megaphone","melon","melon-slice","memo","memo-circle-check","memo-circle-info","memo-pad","memory","menorah","mercury","merge","message","message-arrow-down","message-arrow-up","message-arrow-up-right","message-bot","message-captions","message-check","message-code","message-dollar","message-dots","message-exclamation","message-heart","message-image","message-lines","message-medical","message-middle","message-middle-top","message-minus","message-music","message-pen","message-plus","message-question","message-quote","message-slash","message-smile","message-sms","message-text","message-xmark","messages","messages-dollar","messages-question","meteor","meter","meter-bolt","meter-droplet","meter-fire","microchip","microchip-ai","microphone","microphone-lines","microphone-lines-slash","microphone-slash","microphone-stand","microscope","microwave","mill-sign","minimize","minus","mistletoe","mitten","mobile","mobile-button","mobile-notch","mobile-retro","mobile-screen","mobile-screen-button","mobile-signal","mobile-signal-out","money-bill","money-bill-1","money-bill-1-wave","money-bill-simple","money-bill-simple-wave","money-bill-transfer","money-bill-trend-up","money-bill-wave","money-bill-wheat","money-bills","money-bills-simple","money-check","money-check-dollar","money-check-dollar-pen","money-check-pen","money-from-bracket","money-simple-from-bracket","monitor-waveform","monkey","monument","moon","moon-cloud","moon-over-sun","moon-stars","moped","mortar-pestle","mosque","mosquito","mosquito-net","motorcycle","mound","mountain","mountain-city","mountain-sun","mountains","mouse-field","mp3-player","mug","mug-hot","mug-marshmallows","mug-saucer","mug-tea","mug-tea-saucer","mushroom","music","music-magnifying-glass","music-note","music-note-slash","music-slas
5042h","mustache","n","naira-sign","narwhal","nesting-dolls","network-wired","neuter","newspaper","nfc","nfc-lock","nfc-magnifying-glass","nfc-pen","nfc-signal","nfc-slash","nfc-trash","nose","not-equal","notdef","note","note-medical","note-sticky","notebook","notes","notes-medical","o","object-exclude","object-group","object-intersect","object-subtract","object-ungroup","object-union","objects-align-bottom","objects-align-center-horizontal","objects-align-center-vertical","objects-align-left","objects-align-right","objects-align-top","objects-column","octagon","octagon-check","octagon-divide","octagon-exclamation","octagon-minus","octagon-plus","octagon-xmark","oil-can","oil-can-drip","oil-temperature","oil-well","olive","olive-branch","om","omega","onion","option","ornament","otter","outdent","outlet","oven","overline","p","page","page-caret-down","page-caret-up","pager","paint-roller","paintbrush","paintbrush-fine","paintbrush-pencil","palette","pallet","pallet-box","pallet-boxes","pan-food","pan-frying","pancakes","panel-ews","panel-fire","panorama","paper-plane","paper-plane-top","paperclip","paperclip-vertical","parachute-box","paragraph","paragraph-left","party-bell","party-horn","passport","paste","pause","paw","paw-claws","paw-simple","peace","peach","peanut","peanuts","peapod","pear","pedestal","pegasus","pen","pen-circle","pen-clip","pen-clip-slash","pen-fancy","pen-fancy-slash","pen-field","pen-line","pen-nib","pen-nib-slash","pen-paintbrush","pen-ruler","pen-slash","pen-swirl","pen-to-square","pencil","pencil-mechanical","pencil-slash","people","people-arrows","people-carry-box","people-dress","people-dress-simple","people-group","people-line","people-pants","people-pants-simple","people-pulling","people-robbery","people-roof","people-simple","pepper","pepper-hot","percent","period","person","person-arrow-down-to-line","person-arrow-up-from-line","person-biking","person-biking-mountain","person-booth","person-breastfeeding","person-burst","person-cane","person-carry-box","person-chalkboard","person-circle-check","person-circle-exclamation","person-circle-minus","person-circle-plus","person-circle-question","person-circle-xmark","person-digging","person-dolly","person-dolly-empty","person-dots-from-line","person-dress","person-dress-bur
5042st","person-dress-fairy","person-dress-simple","person-drowning","person-fairy","person-falling","person-falling-burst","person-from-portal","person-half-dress","person-harassing","person-hiking","person-military-pointing","person-military-rifle","person-military-to-person","person-pinball","person-praying","person-pregnant","person-rays","person-rifle","person-running","person-running-fast","person-seat","person-seat-reclined","person-shelter","person-sign","person-simple","person-skating","person-ski-jumping","person-ski-lift","person-skiing","person-skiing-nordic","person-sledding","person-snowboarding","person-snowmobiling","person-swimming","person-through-window","person-to-door","person-to-portal","person-walking","person-walking-arrow-loop-left","person-walking-arrow-right","person-walking-dashed-line-arrow-right","person-walking-luggage","person-walking-with-cane","peseta-sign","peso-sign","phone","phone-arrow-down-left","phone-arrow-right","phone-arrow-up-right","phone-flip","phone-hangup","phone-intercom","phone-missed","phone-office","phone-plus","phone-rotary","phone-slash","phone-volume","phone-xmark","photo-film","photo-film-music","pi","piano","piano-keyboard","pickaxe","pickleball","pie","pig","piggy-bank","pills","pinata","pinball","pineapple","pipe","pipe-circle-check","pipe-collar","pipe-section","pipe-smoking","pipe-valve","pizza","pizza-slice","place-of-worship","plane","plane-arrival","plane-circle-check","plane-circle-exclamation","plane-circle-xmark","plane-departure","plane-engines","plane-lock","plane-prop","plane-slash","plane-tail","plane-up","plane-up-slash","planet-moon","planet-ringed","plant-wilt","plate-utensils","plate-wheat","play","play-pause","plug","plug-circle-bolt","plug-circle-check","plug-circle-exclamation","plug-circle-minus","plug-circle-plus","plug-circle-xmark","plus","plus-large","plus-minus","podcast","podium","podium-star","police-box","poll-people","pompebled","poo","poo-storm","pool-8-ball","poop","popcorn","popsicle","pot-food","potato","power-off","prescription","prescription-bottle","prescription-bottle-medical","prescription-bottle-pill","presentation-screen","pretzel","print","print-magnifying-glass","print-slash","projector","pump","pump-medical","pump-soap","pumpkin","puzzle","puzzle-piece","puzzle-piece-simple","q","qrcode","question","quote-left","quote-right","quotes","r","rabbit","rabbit-running","raccoon","racquet","radar","radiation","radio","radio-tuner","rainbow","raindrops","ram","ramp-loading","ranking-star","raygun","receipt","record-vinyl","rectangle","rectangle-ad","rectangle-barcode","rectangle-code","rectangle-history","rectangle-history-circle-plus","rectangle-history-circle-user","rectangle-list","rectangle-pro","rectangle-terminal","rectangle-vertical","rectangle-vertical-history","rectangle-wide","rectangle-xmark","rectangles-mixed","recycle","reel","reflect-horizontal","reflect-vertical","refrigerator","registered","repeat","repeat-1","reply","reply-all","reply-clock","republican","restroom","restroom-simple","retweet","rhombus","ribbon","right","right-from-bracket","right-from-line","right-left","right-left-large","right-long","right-long-to-line","right-to-bracket","right-to-line","ring","ring-diamond","rings-wedding","road","road-barrier","road-bridge","road-circle-check","road-circle-exclamation","road-circle-xmark","road-lock","road-spikes","robot","robot-astromech","rocket","rocket-launch","roller-coaster","rotate","rotate-exclamation","rotate-left","rotate-reverse","rotate-right","route","route-highway","route-interstate","router","rss","ruble-sign","rug","rugby-ball","ruler","ruler-combined","ruler-horizontal","ruler-triangle","ruler-vertical","rupee-sign","rupiah-sign","rv","s","sack","sack-dollar","sack-xmark","sailboat","salad","salt-shaker","sandwich","satellite","satellite-dish","sausage","saxophone","saxophone-fire","scale-balanced","scale-unbalanced","scale-unbalanced-flip","scalpel","scalpel-line-dashed","scanner-gun","scanner-image","scanner-keyboard","scanner-touchscreen","scarecrow","scarf","school","school-circle-check","school-circle-exclamation","school-circle-xmark","school-flag","school-lock","scissors","screen-users","screencast","screwdriver","screwdriver-wrench","scribble","scroll","scroll-old","scroll-torah","scrubber","scythe","sd-card","sd-cards","seal","seal-exclamation","seal-question","seat-airline","section","seedling","semicolon","send-back","send-backward","sensor","sensor-cloud","sensor-fire","sensor-on","sensor-triangle-exclamation","server","shapes","share","share-all","share-from-square","share-nodes","sheep","sheet-plastic","shekel-sign","shelves","shelves-empty","shield","shield-cat","shield-check","shield-cross","shield-dog","shield-exclamation","shield-halved","shield-heart","shield-keyhole","shield-minus","shield-plus","shield-quartered","shield-slas
5042h","shield-virus","shield-xmark","ship","shirt","shirt-long-sleeve","shirt-running","shirt-tank-top","shish-kebab","shoe-prints","shop","shop-lock","shop-slash","shovel","shovel-snow","shower","shower-down","shredder","shrimp","shuffle","shutters","shuttle-space","shuttlecock","sickle","sidebar","sidebar-flip","sigma","sign-hanging","sign-post","sign-posts","sign-posts-wrench","signal","signal-bars","signal-bars-fair","signal-bars-good","signal-bars-slash","signal-bars-weak","signal-fair","signal-good","signal-slash","signal-stream","signal-stream-slash","signal-strong","signal-weak","signature","signature-lock","signature-slash","signs-post","sim-card","sim-cards","sink","siren","siren-on","sitemap","skeleton","skeleton-ribs","ski-boot","ski-boot-ski","skull","skull-cow","skull-crossbones","slash","slash-back","slash-forward","sleigh","slider","sliders","sliders-simple","sliders-up","slot-machine","smog","smoke","smoking","snake","snooze","snow-blowing","snowflake","snowflake-droplets","snowflakes","snowman","snowman-head","snowplow","soap","socks","soft-serve","solar-panel","solar-system","sort","sort-down","sort-up","spa","space-station-moon","space-station-moon-construction","spade","spaghetti-monster-flying","sparkle","sparkles","speaker","speakers","spell-check","spider","spider-black-widow","spider-web","spinner","spinner-scale","spinner-third","split","splotch","spoon","sportsball","spray-can","spray-can-sparkles","sprinkler","sprinkler-ceiling","square","square-0","square-1","square-2","square-3","square-4","square-5","square-6","square-7","square-8","square-9","square-a","square-a-lock","square-ampersand","square-arrow-down","square-arrow-down-left","square-arrow-down-right","square-arrow-left","square-arrow-right","square-arrow-up","square-arrow-up-left","square-arrow-up-right","square-b","square-bolt","square-c","square-caret-down","square-caret-left","square-caret-right","square-caret-up","square-check","square-chevron-down","square-chevron-left","square-chevron-right","square-chevron-up","square-code","square-d","square-dashed","square-dashed-circle-plus","square-divide","square-dollar","square-down","square-down-left","square-down-right","square-e","square-ellipsis","square-ellipsis-vertical","square-envelope","square-exclamation","square-f","square-fragile","square-full","square-g","square-h","square-heart","square-i","square-info","square-j","square-k","square-kanban","square-l","square-left","square-list","square-m","square-minus","square-n","square-nfi","square-o","square-p","square-parking","square-parking-slash","square-pen","square-person-confined","square-phone","square-phone-flip","square-phone-hangup","square-plus","square-poll-horizontal","square-poll-vertical","square-q","square-quarters","square-question","square-quote","square-r","square-right","square-ring","square-root","square-root-variable","square-rss","square-s","square-share-nodes","square-sliders","square-sliders-vertical","square-small","square-star","square-t","square-terminal","square-this-way-up","square-u","square-up","square-up-left","square-up-right","square-user","square-v","square-virus","square-w","square-x","square-xmark","square-y","square-z","squid","squirrel","staff","staff-snake","stairs","stamp","standard-definition","stapler","star","star-and-crescent","star-christmas","star-exclamation","star-half","star-half-stroke","star-of-david","star-of-life","star-sharp","star-sharp-half","star-sharp-half-stroke","star-shooting","starfighter","starfighter-twin-ion-engine","starfighter-twin-ion-engine-advanced","stars","starship","starship-freighter","steak","steering-wheel","sterling-sign","stethoscope","stocking","stomach","stop","stopwatch","stopwatch-20","store","store-lock","store-slash","strawberry","street-view","stretcher","strikethrough","stroopwafel","subscript","subtitles","subtitles-slash","suitcase","suitcase-medical","suitcase-rolling","sun","sun-bright","sun-cloud","sun-dust","sun-haze","sun-plant-wilt","sunglasses","sunrise","sunset","superscript","sushi","sushi-roll","swap","swap-arrows","swatchbook","sword","sword-laser","sword-laser-alt","swords","swords-laser","symbols","synagogue","syringe","t","t-rex","table","table-cells","table-cells-large","table-columns","table-layout","table-list","table-picnic","table-pivot","table-rows","table-tennis-paddle-ball","table-tree","tablet","tablet-button","tablet-rugged","tablet-screen","tablet-screen-button","tablets","tachograph-digital","taco","tag","tags","tally","tally-1","tally-2","tally-3","tally-4","tamale","tank-water","tape","tarp","tarp-droplet","taxi","taxi-bus","teddy-bear","teeth","teeth-open","telescope","temperature-arrow-down","temperature-arrow-up","temperature-empty","temperature-full","temperature-half","temperature-high","temperature-list","temperature-low","temperature-quarter","temperature-snow","temperature-sun","temperature-three-quarters","tenge-sign","tennis-ball","tent","tent-arrow-down-to-line","tent-arrow-left-right","tent-arrow-tur
5042n-left","tent-arrows-down","tent-double-peak","tents","terminal","text","text-height","text-size","text-slash","text-width","thermometer","theta","thought-bubble","thumbs-down","thumbs-up","thumbtack","tick","ticket","ticket-airline","ticket-perforated","ticket-simple","tickets","tickets-airline","tickets-perforated","tickets-simple","tilde","timeline","timeline-arrow","timer","tire","tire-flat","tire-pressure-warning","tire-rugged","toggle-large-off","toggle-large-on","toggle-off","toggle-on","toilet","toilet-paper","toilet-paper-blank","toilet-paper-blank-under","toilet-paper-check","toilet-paper-slash","toilet-paper-under","toilet-paper-under-slash","toilet-paper-xmark","toilet-portable","toilets-portable","tomato","tombstone","tombstone-blank","toolbox","tooth","toothbrush","torii-gate","tornado","tower-broadcast","tower-cell","tower-control","tower-observation","tractor","trademark","traffic-cone","traffic-light","traffic-light-go","traffic-light-slow","traffic-light-stop","trailer","train","train-subway","train-subway-tunnel","train-track","train-tram","train-tunnel","transformer-bolt","transgender","transporter","transporter-1","transporter-2","transporter-3","transporter-4","transporter-5","transporter-6","transporter-7","transporter-empty","trash","trash-arrow-up","trash-can","trash-can-arrow-up","trash-can-check","trash-can-clock","trash-can-list","trash-can-plus","trash-can-slash","trash-can-undo","trash-can-xmark","trash-check","trash-clock","trash-list","trash-plus","trash-slash","trash-undo","trash-xmark","treasure-chest","tree","tree-christmas","tree-city","tree-deciduous","tree-decorated","tree-large","tree-palm","trees","triangle","triangle-exclamation","triangle-instrument","triangle-person-digging","tricycle","tricycle-adult","trillium","trophy","trophy-star","trowel","trowel-bricks","truck","truck-arrow-right","truck-bolt","truck-clock","truck-container","truck-container-empty","truck-droplet","truck-fast","truck-field","truck-field-un","truck-fire","truck-flatbed","truck-front","truck-ladder","truck-medical","truck-monster","truck-moving","truck-pickup","truck-plane","truck-plow","truck-ramp","truck-ramp-box","truck-ramp-couch","truck-tow","truck-utensils","trumpet","tty","tty-answer","tugrik-sign","turkey","turkish-lira-sign","turn-down","turn-down-left","turn-down-right","turn-left","turn-left-down","turn-left-up","turn-right","turn-up","turntable","turtle","tv","tv-music","tv-retro","typewriter","u","ufo","ufo-beam","umbrella","umbrella-beach","umbrella-simple","underline","unicorn","uniform-martial-arts","union","universal-access","unlock","unlock-keyhole","up","up-down","up-down-left-right","up-from-bracket","up-from-dotted-line","up-from-line","up-left","up-long","up-right","up-right-and-down-left-from-center","up-right-from-square","up-to-dotted-line","up-to-line","upload","usb-drive","user","user-alien","user-astronaut","user-bounty-hunter","user-check","user-chef","user-clock","user-cowboy","user-crown","user-doctor","user-doctor-hair","user-doctor-hair-long","user-doctor-message","user-gear","user-graduate","user-group","user-group-crown","user-group-simple","user-hair","user-hair-buns","user-hair-long","user-hair-mullet","user-headset","user-helmet-safety","user-injured","user-large","user-large-slash","user-lock","user-magnifying-glass","user-minus","user-music","user-ninja","user-nurse","user-nurse-hair","user-nurse-hair-long","user-pen","user-pilot","user-pilot-tie","user-plus","user-police","user-police-tie","user-robot","user-robot-xmarks","user-secret","user-shakespeare","user-shield","user-slash","user-tag","user-tie","user-tie-hair","user-tie-hair-long","user-unlock","user-visor","user-vneck","user-vneck-hair","user-vneck-hair-long","user-xmark","users","users-between-lines","users-gear","users-line","users-medical","users-rays","users-rectangle","users-slash","users-viewfinder","utensils","utensils-slash","utility-pole","utility-pole-double","v","vacuum","vacuum-robot","value-absolute","van-shuttle","vault","vector-circle","vector-polygon","vector-square","vent-damper","venus","venus-double","venus-mars","vest","vest-patches","vial","vial-circle-check","vial-virus","vials","video","video-arrow-down-left","video-arrow-up-right","video-plus","video-slash","vihara","violin","virus","virus-covid","virus-covid-slash","virus-slash","viruses","voicemail","volcano","volleyball","volume","volume-high","volume-low","volume-off","volume-slash","volume-xmark","vr-cardboard","w","waffle","wagon-covered","walker","walkie-talkie","wallet","wand","wand-magic","wand-magic-sparkles","wand-sparkles","warehouse","warehouse-full","washing-machine","watch","watch-apple","watch-calculator","watch-fitness","wat
5042ch-smart","water","water-arrow-down","water-arrow-up","water-ladder","watermelon-slice","wave","wave-pulse","wave-sine","wave-square","wave-triangle","waveform","waveform-lines","waves-sine","webhook","weight-hanging","weight-scale","whale","wheat","wheat-awn","wheat-awn-circle-exclamation","wheat-awn-slash","wheat-slash","wheelchair","wheelchair-move","whiskey-glass","whiskey-glass-ice","whistle","wifi","wifi-exclamation","wifi-fair","wifi-slash","wifi-weak","wind","wind-turbine","wind-warning","window","window-flip","window-frame","window-frame-open","window-maximize","window-minimize","window-restore","windsock","wine-bottle","wine-glass","wine-glass-crack","wine-glass-empty","won-sign","worm","wreath","wreath-laurel","wrench","wrench-simple","x","x-ray","xmark","xmark-large","xmark-to-slot","xmarks-lines","y","yen-sign","yin-yang","z"],Xc=["aeropress","airplay-audio","alarm-minus","almost-equal-to","ant","aquarius","aries","arrow-archery","arrow-down-from-bracket","arrow-down-long-to-line","arrow-left-arrow-right","arrow-left-from-bracket","arrow-left-from-dotted-line","arrow-left-to-bracket","arrow-left-to-dotted-line","arrow-right-from-dotted-line","arrow-right-to-dotted-line","arrow-rotate-left-10","arrow-rotate-left-15","arrow-rotate-left-30","arrow-rotate-right-10","arrow-rotate-right-15","arrow-rotate-right-30","arrow-u-turn-down-left","arrow-u-turn-down-right","arrow-u-turn-left-down","arrow-u-turn-left-up","arrow-u-turn-right-down","arrow-u-turn-right-up","arrow-u-turn-up-left","arrow-u-turn-up-right","arrow-up-long-to-line","arrow-up-to-bracket","australian-dollar-sign","ball-yarn","bar-progress","bar-progress-empty","bar-progress-full","bar-progress-half","bar-progress-quarter","bar-progress-three-quarters","barn","baseball-bat","bicep","bin","book-open-lines","book-spine","bookmark-plus","bottle-baby","bow-archery","box-arrow-down","box-arrow-down-arrow-up","box-arrow-down-magnifying-glass","box-arrow-up","box-isometric","box-isometric-tape","box-magnifying-glass","bra","briefs","burst-new","bus-side","bus-stop","butterfly","caduceus","camera-circle-ellipsis","camera-clock","camera-shutter","cancer","canoe-person","capricorn","capsule","car-key","car-siren","car-siren-on","caret-large-down","caret-large-left","caret-large-right","caret-large-up","carpool","chart-diagram","chart-fft","chart-sine","chemex","chest-drawers","circle-austral","circle-australian-dollar","circle-baht","circle-bangladeshi-taka","circle-bitcoin","circle-brazilian-real","circle-cedi","circle-cent","circle-chf","circle-colon","circle-cruzeiro","circle-currency","circle-danish-krone","circle-dong","circle-equals","circle-eurozone","circle-florin","circle-franc","circle-gf","circle-guarani","circle-half-horizontal","circle-half-stroke-horizontal","circle-house","circle-hryvnia","circle-indian-rupee","circle-kip","circle-lari","circle-lira","circle-litecoin","circle-malaysian-ringgit","circle-manat","circle-mill","circle-moon","circle-naira","circle-norwegian-krone","circle-peruvian-soles","circle-peseta","circle-peso","circle-polish-zloty","circle-renminbi","circle-ruble","circle-rupee","circle-rupiah","circle-share-nodes","circle-shekel","circle-swedish-krona","circle-tenge","circle-tugrik","circle-turkish-lira","circle-user-circle-check","circle-user-circle-exclamation","circle-user-circle-minus","circle-user-circle-moon","circle-user-circle-plus","circle-user-circle-question","circle-user-circle-user","circle-user-circle-xmark","circle-user-clock","circle-wifi","circle-wifi-circle-wifi","circle-won","circleapore-dollar","circles-overlap-3","clipboard-clock","clipboard-exclamation","clone-plus","comment-dot","comment-nodes","comment-waveform","computer-mouse-button-left","computer-mouse-button-right","currency-sign","danish-krone-sign","desk","dialpad","diamonds-4","direction-left-right","direction-up-down","dot","down-from-bracket","down-long-to-line","down-up","dress","dresser","droplet-plus","ear-circle-checkmark","ear-triangle-exclamation","ear-waveform","envelope-circle-user","envelope-ribbon","eurozone-sign","eye-closed","face-shaking","face-shaking-horizontal","face-shaking-vertical","file-aiff","file-ban","file-brackets-curly","file-cad","file-css","file-fragment","file-half-dashed","file-html","file-icns","file-js","file-midi","file-odf","file-tex","file-wav","film-music","film-stack","folder-arrow-left","folder-arrow-right","foot-wing","garage-empty","gas-pump-left","gas-pump-right","gear-api","gear-complex-api","gemini","globe-wifi","globe-www","gpu","grid-2-minus","grid-round-2-minus","hand-holding-star","hand-shaka","head-side-circuit","head-side-speak","headphones-slash","heart-slash","hearts","hexagon-equals","hexagon-nodes","hexagon-nodes-bolt","hockey-stick","horseshoe","house-unlock","hydra","image-broken","image-circle-arrow-down","image-circle-check","image-circle-plus","image-circle-xmark","image-music","image-stack","input-password","jeans","jeans-straight","kayak","kettlebell","label","layer","left-from-bracket","left-from-dotted-line","left-to-bracket","left-to-dotted-line","leo","libra","lightbulb-message","link-broken","location-arrow-slash","lychee","mailbox-open-empty","mailbox-open-letter","malaysian-ringgit-sign","message-dot","message-waveform","microphone-circle-plus","microphone-circle-xmark","microphone-signal-meter","midi","mobile-arrow-down","mobile-rotate","mobile-rotate-reverse","mobile-slash","mobile-vibrate","mobile-vibrate-slash","moon-first-quarter","moon-full","moon-last-quarter","moon-new","moon-star","moon-waning-crescent","moon-waning-gibbous","moon-waxing-crescent","moon-waxing-gibbous","nas","non-binary","norwegian-krone-sign","notes-sticky","oar","oars","octagon-equals","octopus","open-captioning","opossum","owl","paintbrush-fine-slash","paintbrush-slash","panties","pants","pants-straight","pencil-line","pentagon","person-arms-raised","person-basketball","person-carry-empty","person-golfing","person-limbs-wide","person-meditating","person-seat-window","person-soccer","person-swimming-pool","person-swimming-water","person-water-arms-raised","person-waving","peruvian-soles-sign","phone-connection","phone-waveform","picture-in-picture","pisces","plane-flying","plane-landing-gear","play-flip","poker-chip","polish-zloty-sign","postage-stamp","pump-impeller","qrcode-read","rainbow-half","rectangle-4k","rectangle-api","rectangle-beta","rectangle-high-dynamic-range","rectangle-irc","rectangle-minus","rectangle-n-a","re
5042ctangle-new","rectangle-plus","rectangle-tall","rectangle-video-on-demand","reflect-both","remote","renminbi-sign","right-from-dotted-line","right-to-dotted-line","rocket-vertical","rows-3","sagittarius","school-unlock","scooter","scorpio","seat","seat-airline-window","seats","septagon","shield-user","ship-large","shirt-jersey","shoe","shop-24","shorts","shuttle-space-vertical","signapore-dollar-sign","single-quote-left","single-quote-right","slider-circle","sneaker","sneaker-running","snowmobile-blank","spine","spiral","square-austral","square-australian-dollar","square-baht","square-bangladeshi-taka","square-binary","square-bitcoin","square-brazilian-real","square-cedi","square-cent","square-chf","square-colon","square-cruzeiro","square-currency","square-danish-krone","square-dong","square-equals","square-euro","square-eurozone","square-florin","square-franc","square-guarani","square-half","square-half-horizontal","square-half-stroke","square-half-stroke-horizontal","square-hryvnia","square-indian-rupee","square-kip","square-lari","square-lira","square-litecoin","square-malaysian-ringgit","square-manat","square-microphone","square-mill","square-naira","square-norwegian-krone","square-peruvian-soles","square-peseta","square-peso","square-polish-zloty","square-renminbi","square-ruble","square-rupee","square-rupiah","square-shekel","square-sterling","square-swedish-krona","square-tenge","square-tugrik","square-turkish-lira","square-won","square-yen","squareapore-dollar","stadium","stair-car","stool","store-24","swedish-krona-sign","table-bar","table-cells-column-lock","table-cells-column-unlock","table-cells-columns","table-cells-header","table-cells-header-lock","table-cells-header-unlock","table-cells-lock","table-cells-merge","table-cells-row-lock","table-cells-row-unlock","table-cells-rows","table-cells-split","table-cells-unlock","table-columns-add-after","table-columns-add-before","table-columns-merge-next","table-columns-merge-previous","table-columns-remove-after","table-columns-remove-before","table-dining","table-rows-add-above","table-rows-add-below","table-rows-merge-next","table-rows-merge-previous","table-rows-remove-above","table-rows-remove-below","table-slash","tank-recovery","taurus","temperature-slash","tent-circus","thumbtack-angle","thumbtack-angle-slash","thumbtack-slash","tower-receive","train-stop","transducer","transmission","triple-chevrons-down","triple-chevrons-left","triple-chevrons-right","triple-chevrons-up","trombone","truck-suv","u-turn-down-left","u-turn-down-right","u-turn-left-down","u-turn-left-up","u-turn-right-down","u-turn-right-up","u-turn-up-left","u-turn-up-right","unicycle","up-long-to-line","up-to-bracket","user-beard","user-beard-bolt","user-chef-hair-long","user-circle-minus","user-circle-plus","user-dashed","user-doctor-hair-mullet","user-hat-tie","user-hat-tie-magnifying-glass","user-hoodie","user-key","user-message","user-microphone","user-pilot-hair-long","user-pilot-tie-hair-long","user-police-hair-long","user-police-tie-hair-long","user-question","user-sith","user-tie-hair-mullet","user-viewfinder","user-vneck-hair-mullet","utility-can","van","vial-vertical","video-down-to-line","video-question","virgo","wardrobe","water-temperature","wireless"],jl=(()=>{let r=class r{constructor(d){this.siteDataService=d,this.unsubscribe$=new He,this.v6Icons=Kc.map(Hl),this.v7NewIcons=Xc.map(Hl),this.searchTerm=""}ngOnInit(){this.siteDataService.hideSiteLoader()}get filteredV7Icons(){if(!this.searchTerm)return this.v7NewIcons;let d=this.searchTerm.toLowerCase();return this.v7NewIcons.filter(s=>s.name.includes(d))}ngOnDestroy(){this.unsubscribe$.next(),this.unsubscribe$.complete()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-font-test"]],standalone:!1,decls:57,vars:5,consts:[[1,"page"],["pageTitle","Font Awesome Regular \u2014 Icon Reference"],[1,"mb-5","card"],[1,"mb-1"],[1,"badge","badge-secondary","ml-2"],[1,"text-muted","mb-3"],[1,"row","no-gutters","flex-wrap"],[1,"card"],[1,"badge","badge-success","ml-2"],[1,"text-muted","mb-2"],[1,"mb-3",2,"max-width","400px"],[1,"fa-regular","fa-magnifying-glass"],["type","text","placeholder","Filter icons\u2026",1,"form-control",3,"ngModelChange","ngModel"],["type","button",1,"btn","btn-naked","btn-sm",3,"click","disabled"],[1,"fa-regular","fa-xmark"],[1,"col-6","col-sm-4","col-md-3","col-lg-2","p-2","d-flex","flex-column","align-items-center","text-center","border",3,"title"],[1,"mb-1",2,"font-size","1.5rem"],[1,"text-muted","text-smallest","word-break-all"],[1,"col-6","col-sm-4","col-md-3","col-lg-2","p-2","d-flex","flex-column","align-items-center","text-center","border","border-success",3,"title"]],template:function(s,o){s&1&&(n(0,"main",0),e(1,` 5043 `),c(2,"app-admin-header",1),e(3,` 5044 5045 `),e(4,` 5046 `),n(5,"section",2),e(6,` 5047 `),n(7,"h5",3),e(8,`Font Awesome 6.5.1 \u2014 Free Regular 5048 `),n(9,"span",4),e(10),t()(),e(11,` 5049 `),n(12,"p",5)(13,"code"),e(14,"fa-regular fa-name"),t()(),e(15,` 5050 `),n(16,"div",6),e(17,` 5051 `),S(18,jc,9,4,null,null,K),t(),e(20,` 5052 `),t(),e(21,` 5053 5054 `),e(22,` 5055 `),n(23,"section",7),e(24,` 5056 `),n(25,"h5",3),e(26,"New in Font Awesome 7 Pro \u2014 Classic Regular "),n(27,"span",8),e(28),t()(),e(29,` 5057 `),n(30,"p",9),e(31,"Classic (non-brand) icons not present in 6.5.
50571 free. Use "),n(32,"code"),e(33,"fa-regular fa-name"),t(),e(34,"."),t(),e(35,` 5058 `),n(36,"p-inputgroup",10),e(37,` 5059 `),n(38,"p-inputgroup-addon"),c(39,"i",11),t(),e(40,` 5060 `),n(41,"input",12),M("ngModelChange",function(h){return I(o.searchTerm,h)||(o.searchTerm=h),h}),t(),e(42,` 5061 `),n(43,"p-inputgroup-addon"),e(44,` 5062 `),n(45,"button",13),g("click",function(){return o.searchTerm=""}),c(46,"i",14),t(),e(47,` 5063 `),t(),e(48,` 5064 `),t(),e(49,` 5065 `),v(50,Gc,4,2),n(51,"div",6),e(52,` 5066 `),S(53,$c,9,4,null,null,K),t(),e(55,` 5067 `),t(),e(56,` 5068 `),t()),s&2&&(i(10),p(o.v6Icons.length),i(8),E(o.v6Icons),i(10),f("",o.v7NewIcons.length," new"),i(13),T("ngModel",o.searchTerm),i(4),m("disabled",!o.searchTerm),i(5),y(o.searchTerm?50:-1),i(3),E(o.filteredV7Icons))},dependencies:[be,U,H,gn,at,rt],encapsulation:2});let a=r;return a})();function Qc(a,r){a&1&&(e(0,` 5069 `),n(1,"div",10),e(2,` 5070 `),n(3,"div",11),e(4,` 5071 `),n(5,"div",12),e(6,"option 1: force our card style"),t(),e(7,` 5072 `),t(),e(8,` 5073 `),n(9,"div",11),e(10,` 5074 `),n(11,"div",12),e(12,"option 1: force our card style"),t(),e(13,` 5075 `),t(),e(14,` 5076 `),n(15,"div",11),e(16,` 5077 `),n(17,"div",12),e(18,"option 1: force our card style"),t(),e(19,` 5078 `),t(),e(20,` 5079 `),t(),e(21,` 5080 `))}function Jc(a,r){a&1&&(e(0,` 5081 `),n(1,"div",13),e(2,` 5082 `),n(3,"div",11)(4,"div",14),e(5,"option 2: forced bg's"),t()(),e(6,` 5083 `),n(7,"div",11)(8,"div",14),e(9,"option 2: forced bg's"),t()(),e(10,` 5084 `),n(11,"div",11)(12,"div",14),e(13,"option 2: forced bg's"),t()(),e(14,` 5085 `),t(),e(15,` 5086 `))}function Zc(a,r){a&1&&(e(0,` 5087 `),n(1,"app-inline-alert",21),e(2,"Blend mode is the fun one."),t(),e(3,` 5088 `)),a&2&&(i(),m("isInline",!0))}function ep(a,r){if(a&1){let l=B();e(0,` 5089 `),n(1,"div",22),e(2,` 5090 `),n(3,"div",11),e(4,` 5091 `),n(5,"div",12),e(6,` 5092 `),n(7,"h5"),e(8,"Start"),t(),e(9,` 5093 `),n(10,"div",24),e(11,` 5094 `),n(12,"label",25),e(13,"Color"),t(),e(14,` 5095 `),n(15,"p-colorPicker",26),M("ngModelChange",function(s){w(l);let o=u(3);return I(o.gradientStartColor,s)||(o.gradientStartColor=s),C(s)}),g("onChange",function(){w(l);let s=u(3);return C(s.updateCssVars())}),t(),e(16,` 5096 `),t(),e(17,` 5097 `),n(18,"div",27),e(19,` 5098 `),n(20,"label"),e(21,"Opacity"),t(),e(22,` 5099 `),n(23,"input",28),M("ngModelChange",function(s){w(l);let o=u(3);return I(o.gradientStartOpacity,s)||(o.gradientStartOpacity=s),C(s)}),g("input",function(){w(l);let s=u(3);return C(s.updateCssVars())}),t(),e(24,` 5100 `),t(),e(25,` 5101 `),t(),e(26,` 5102 `),t(),e(27,` 5103 `),n(28,"div",11),e(29,` 5104 `),n(30,"div",12),e(31,` 5105 `),n(32,"h5"),e(33,"End"),t(),e(34,` 5106 `),n(35,"div",24),e(36,` 5107 `),n(37,"label",25),e(38,"Color"),t(),e(39,` 5108 `),n(40,"p-colorPicker",26),M("ngModelChange",function(s){w(l);let o=u(3);return I(o.gradientEndColor,s)||(o.gradientEndColor=s),C(s)}),g("onChange",function(){w(l);let s=u(3);return C(s.updateCssVars())}),t(),e(41,` 5109 `),t(),e(42,` 5110 `),n(43,"div",27),e(44,` 5111 `),n(45,"label"),e(46,"Opacity"),t(),e(47,` 5112 `),n(48,"input",28),M("ngModelChange",function(s){w(l);let o=u(3);return I(o.gradientEndOpacity,s)||(o.gradientEndOpacity=s),C(s)}),g("input",function(){w(l);let s=u(3);return C(s.updateCssVars())}),t(),e(49,` 5113 `),t(),e(50,` 5114 `),t(),e(51,` 5115 `),t(),e(52,` 5116 `),t(),e(53,` 5117 `)}if(a&2){let l=u(3);i(15),T("ngModel",l.gradientStartColor),i(8),T("ngModel",l.gradientStartOpacity),m("min",0)("max",1)("step",.01),i(17),T("ngModel",l.gradientEndColor),i(8),T("ngModel",l.gradientEndOpacity),m("min",0)("max",1)("step",.01)}}function tp(a,r){if(a&1){let l=B();e(0,` 5118 `),n(1,"h5"),e(2,"Blend Mode"),t(),e(3,` 5119 `),n(4,"div",17),e(5,` 5120 `),n(6,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("multiply"))}),e(7,"multiply"),t(),e(8,` 5121 `),n(9,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("screen"))}),e(10,"screen"),t(),e(11,` 5122 `),n(12,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("overlay"))}),e(13,"overlay"),t(),e(14,` 5123 `),n(15,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("darken"))}),e(16,"darken"),t(),e(17,` 5124 `),n(18,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("lighten"))}),e(19,"lighten"),t(),e(20,` 5125 `),n(21,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("color-burn"))}),e(22,"color-burn"),t(),e(23,` 5126 `),n(24,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("color-dodge"))}),e(25,"color-dodge"),t(),e(26,` 5127 `),n(27,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("soft-light"))}),e(28,"soft-light"),t(),e(29,` 5128 `),n(30,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("hard-light"))}),e(31,"hard-light"),t(),e(32,` 5129 `),n(33,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("luminosity"))}),e(34,"luminosity"),t(),e(35,` 5130 `),n(36,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("hue"))}),e(37,"hue"),t(),e(38,` 5131 `),n(39,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("saturation"))}),e(40,"saturation"),t(),e(41,` 5132 `),n(42,"button",18),g("click",function(){w(l);let s=u(2);return C(s.setBlendMode("color"))}),e(43,"color"),t(),e(44,` 5133 `),t(),e(45,` 5134 `),n(46,"div",22),e(47,` 5135 `),n(48,"div",23),e(49,`
5136 `),n(50,"h5"),e(51,"Background Color"),t(),e(52,` 5137 `),n(53,"div",24),e(54,` 5138 `),n(55,"label",25),e(56,"Color"),t(),e(57,` 5139 `),n(58,"p-colorPicker",26),M("ngModelChange",function(s){w(l);let o=u(2);return I(o.backgroundColor,s)||(o.backgroundColor=s),C(s)}),g("onChange",function(){w(l);let s=u(2);return C(s.updateCssVars())}),t(),e(59,` 5140 `),t(),e(60,` 5141 `),n(61,"div",27),e(62,` 5142 `),n(63,"label"),e(64,"Opacity"),t(),e(65,` 5143 `),n(66,"input",28),M("ngModelChange",function(s){w(l);let o=u(2);return I(o.backgroundOpacity,s)||(o.backgroundOpacity=s),C(s)}),g("input",function(){w(l);let s=u(2);return C(s.updateCssVars())}),t(),e(67,` 5144 `),t(),e(68,` 5145 `),t(),e(69,` 5146 `),n(70,"div",11),e(71,` 5147 `),n(72,"div",29),e(73,` 5148 `),n(74,"h5",30),e(75,"Gradients"),t(),e(76,` 5149 `),n(77,"p-checkbox",31),M("ngModelChange",function(s){w(l);let o=u(2);return I(o.useGradients,s)||(o.useGradients=s),C(s)}),g("onChange",function(){w(l);let s=u(2);return C(s.updateCssVars())}),t(),e(78,` 5150 `),t(),e(79,` 5151 `),v(80,ep,54,10),t(),e(81,` 5152 `),t(),e(82,` 5153 `)}if(a&2){let l=u(2);i(6),j("active",l.currentBlendMode==="multiply"),i(3),j("active",l.currentBlendMode==="screen"),i(3),j("active",l.currentBlendMode==="overlay"),i(3),j("active",l.currentBlendMode==="darken"),i(3),j("active",l.currentBlendMode==="lighten"),i(3),j("active",l.currentBlendMode==="color-burn"),i(3),j("active",l.currentBlendMode==="color-dodge"),i(3),j("active",l.currentBlendMode==="soft-light"),i(3),j("active",l.currentBlendMode==="hard-light"),i(3),j("active",l.currentBlendMode==="luminosity"),i(3),j("active",l.currentBlendMode==="hue"),i(3),j("active",l.currentBlendMode==="saturation"),i(3),j("active",l.currentBlendMode==="color"),i(16),T("ngModel",l.backgroundColor),i(8),T("ngModel",l.backgroundOpacity),m("min",0)("max",1)("step",.01),i(11),T("ngModel",l.useGradients),m("binary",!0),i(3),y(l.useGradients?80:-1)}}function np(a,r){if(a&1){let l=B();e(0,` 5154 `),n(1,"div"),e(2,` 5155 `),n(3,"section",15),e(4,` 5156 `),n(5,"h3"),e(6,"Background Effect"),t(),e(7,` 5157 `),n(8,"div",16),e(9,` 5158 `),n(10,"div",17),e(11,` 5159 `),n(12,"button",18),g("click",function(){w(l);let s=u();return C(s.addBgEffect("tint"))}),e(13,"Tint/Overlay"),t(),e(14,` 5160 `),n(15,"button",18),g("click",function(){w(l);let s=u();return C(s.addBgEffect("gradient-fade"))}),e(16,"Gradient Fade"),t(),e(17,` 5161 `),n(18,"button",18),g("click",function(){w(l);let s=u();return C(s.addBgEffect("vignette"))}),e(19,"Vignette"),t(),e(20,` 5162 `),n(21,"button",18),g("click",function(){w(l);let s=u();return C(s.addBgEffect("color-wash"))}),e(22,"Color Wash"),t(),e(23,` 5163 `),n(24,"button",18),g("click",function(){w(l);let s=u();return C(s.addBgEffect("duotone"))}),e(25,"Duotone"),t(),e(26,` 5164 `),n(27,"button",18),g("click",function(){w(l);let s=u();return C(s.addBgEffect("blend-mode"))}),c(28,"i",19),e(29,"Blend Mode"),t(),e(30,` 5165 `),t(),e(31,` 5166 `),v(32,Zc,4,1),v(33,tp,83,34),t(),e(34,` 5167 `),t(),e(35,` 5168 `),n(36,"div",20),e(37,` 5169 `),n(38,"div",11)(39,"div",14),e(40,"option 3: css filters"),t()(),e(41,` 5170 `),n(42,"div",11)(43,"div",14),e(44,"option 3: css filters"),t()(),e(45,` 5171 `),n(46,"div",11)(47,"div",14),e(48,"option 3: css filters"),t()(),e(49,` 5172 `),t(),e(50,` 5173 `),t(),e(51,` 5174 `)}if(a&2){let l=u();i(12),j("active",l.currentEffect==="tint"),i(3),j("active",l.currentEffect==="gradient-fade"),i(3),j("active",l.currentEffect==="vignette"),i(3),j("active",l.currentEffect==="color-wash"),i(3),j("active",l.currentEffect==="duotone"),i(3),j("active",l.isBlendMode()),i(5),y(l.isBlendMode()?-1:32),i(),y(l.isBlendMode()?33:-1)}}var Gl=(()=>
5174{let r=class r{constructor(d,s,o){this.el=d,this.authorizeService=s,this.siteDataService=o,this.currentEffect=null,this.currentBlendMode=null,this.backgroundColor={r:0,g:0,b:0},this.gradientStartColor={r:0,g:0,b:0},this.gradientEndColor={r:0,g:0,b:0},this.backgroundOpacity=.6,this.gradientStartOpacity=.8,this.gradientEndOpacity=.8,this.useGradients=!1,this.useWhiteText=!1}ngOnInit(){this.authorizeService.getUser().subscribe(d=>{d&&(this.user=d)}),this.siteDataService.hideSiteLoader(),this.updateCssVars()}showOption(d){this.activeOption=d}addBgEffect(d){this.currentEffect=d,this.currentBlendMode=null,this.updateCssVars()}setBlendMode(d){this.currentEffect="blend-mode",this.currentBlendMode=d,this.updateCssVars()}isBlendMode(){return this.currentEffect==="blend-mode"}updateCssVars(){this.useWhiteText?this.el.nativeElement.style.setProperty("--base-text","#ffffff"):this.el.nativeElement.style.removeProperty("--base-text"),this.el.nativeElement.style.setProperty("--background-blend-mode",this.currentBlendMode??"normal"),this.el.nativeElement.style.setProperty("--background-color",this.toRgba(this.backgroundColor,this.backgroundOpacity)),this.useGradients?(this.el.nativeElement.style.setProperty("--gradient-start",this.toRgba(this.gradientStartColor,this.gradientStartOpacity)),this.el.nativeElement.style.setProperty("--gradient-end",this.toRgba(this.gradientEndColor,this.gradientEndOpacity))):(this.el.nativeElement.style.setProperty("--gradient-start","transparent"),this.el.nativeElement.style.setProperty("--gradient-end","transparent"))}toRgba(d,s){return d?typeof d=="object"?`rgba(${d.r},${d.g},${d.b},${s})`:`rgba(${d.replace(/^rgb\(|\)$/g,"")},${s})`:`rgba(0,0,0,${s})`}};r.\u0275fac=function(s){return new(s||r)(A(Ce),A(Ia),A(R))},r.\u0275cmp=b({type:r,selectors:[["app-background-test"]],standalone:!1,decls:43,vars:14,consts:[[1,"page"],[1,"bg-test",3,"ngClass"],["header-description",""],[1,"tabs"],["role","tablist",1,"tab-nav","no-bullets","inline-list"],[1,"nav-item"],["role","tab",1,"nav-link",3,"click"],[1,"d-flex","align-items-center","mb-3"],["inputId","textColorToggle",3,"ngModelChange","onChange","ngModel","binary"],["for","textColorToggle",1,"mb-0","ml-2"],[1,"option-1","row"],[1,"col"],[1,"card"],[1,"option-2","row"],[1,"border-all","border-radius","p-3"],[1,"card","edit-card","mb-4"],[1,"card-body"],[1,"d-flex","flex-wrap","gap-2","mb-3"],[1,"btn","btn-sm","mr-2",3,"click"],[1,"fa-solid","fa-stars","mr-1"],[1,"option-3","row"],[3,"isInline"],[1,"row"],[1,"col-auto"],[1,"form-group","d-flex","align-items-center"],[1,"mr-3"],["format","rgb",1,"d-block",3,"ngModelChange","onChange","ngModel"],[1,"form-group"],["type","range",3,"ngModelChange","input","ngModel","min","max","step"],[1,"d-flex","align-items-center","mb-2"],[1,"mb-0","mr-2"],[3,"ngModelChange","onChange","ngModel","binary"]],template:function(s,o){s&1&&(n(0,"main",0),e(1,` 5175 `),n(2,"div",1),e(3,` 5176 5177 `),n(4,"div",2),e(5,` 5178 Test and preview UI components in isolation. 5179 `),t(),e(6,` 5180 5181 `),n(7,"div",3),e(8,` 5182 `),n(9,"ul",4),e(10,` 5183 `),n(11,"li",5),e(12,` 5184 `),n(13,"a",6),g("click",function(){return o.showOption(1)}),e(14,"Option 1: Card Style"),t(),e(15,` 5185 `),t(),e(16,` 5186 `),n(17,"li",5),e(18,` 5187 `),n(19,"a",6),g("click",function(){return o.showOption(2)}),e(20,"Option 2: Forced Backgrounds"),t(),e(21,` 5188 `),t(),e(22,` 5189 `),n(23,"li",5),e(24,` 5190 `),n(25,"a",6),g("click",function(){return o.showOption(3)}),e(26,"Option 3: CSS Filters"),t(),e(27,` 5191 `),t(),e(28,` 5192 `),t(),e(29,` 5193 `),t(),e(30,` 5194 5195 `),n(31,"div",7),e(32,` 5196 `),n(33,"p-checkbox",8),M("ngModelChange",function(h){return I(o.useWhiteText,h)||(o.useWhiteText=h),h}),g("onChange",function(){return o.updateCssVars()}),t(),e(34,` 5197 `),n(35,"label",9),e(36,"White text"),t(),e(37,` 5198 `),t(),e(38,` 5199 5200 `),v(39,Qc,22,0),v(40,Jc,16,0),v(41,np,52,14),t(),e(42,` 5201 `),t()),s&2&&(i(2),j("option-4",o.activeOption===4),m("ngClass",o.currentEffect?"effect-"+o.currentEffect:""),i(9),j("active",o.activeOption===1),i(6),j("active",o.activeOption===2),i(6),j("active",o.activeOption===3),i(10),T("ngModel",o.useWhiteText),m("binary",!0),i(6),y(o.activeOption===1?39:-1),i(),y(o.activeOption===2?40:-1),i(),y(o.activeOption===3?41:-1))},dependencies:[It,be,va,U,H,le,Oe,jt],styles:["[_nghost-%COMP%]{--background-color: #111111;--background-image: url(https://i.redd.it/thas7cq703b61.jpg);--gradient-start: transparent;--gradient-end: transparent;--background-blend-mode: normal}*[_ngcontent-%COMP%]:not(.btn), .nav-link[_ngcontent-%COMP%]:not(.btn){color:var(--base-text)!important}.card[_ngcontent-%COMP%]{--base-text: #000}.bg-test[_ngcontent-%COMP%]{background-color:var(--background-color);background-image:linear-gradient(var(--gradient-start),var(--gradient-end)),var(--background-image);background-size:cover;background-blend-mode:var(--background-blend-mode);position:relative}.bg-test.effect-gradient-fade[_ngcontent-%COMP%]{background-image:linear-gradient(to bottom,transparent 50%,var(--background-color) 100%),var(--background-image)}.bg-test.effect-vignette[_ngcontent-%COMP%]{background-image:radial-gradient(ellipse at center,transparent 40%,rgba(0,0,0,.8) 100%),var(--background-image)}.bg-test.effect-duotone[_ngcontent-%COMP%]{--background-blend-mode: multiply}.option-2[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{background-color:#111;color:var(--base-text)}"]});let a=r;return a})();var $l=a=>({$implicit:a});function ip(a,r){a&1&&(O(0),e(1,` 5202 `),N())}function ap(a,r){if(a&1&&(e(0,` 5203 `),k(1,ip,2,0,"ng-container",4),e(2,` 5204 `)),a&2){let l=r.$implicit;u();let d=ue(29);i(),m("ngTemplateOutlet",d)("ngTemplateOutletContext",ie(2,$l,l))}}function rp(a,r){a&1&&(O(0),e(1,` 5205 `),N())}function op(a,r){if(a&1&&(e(0,` 5206 `),k(1,rp,2,0,"ng-container",4),e(2,` 5207 `)),a&2){let l=r.$implicit;u();let d=ue(29);i(),m("ngTemplateOutlet",d)("ngTemplateOutletContext",ie(2,$l,l))}}function lp(a,r){if(a&1&&(e(0,` 5208 `),n(1,"div",5),e(2,` 5209 `),n(3,"h3",6),e(4),t(),e(5,` 5210 `),n(6,"div",7),e(7,` 5211 `),c(8,"img",8),L(9,"safeUrl"),e(10,` 5212 `),t(),e(11,` 5213 `),e(12,` 5214 `),n(13,"div",9),e(14,` 5215 `),e(15,` 5216 `),e(16,` 5217 5218`),n(17,"div",10),e(18,` 5219 `),n(19,"div",11),e(20,"Size (KB)"),t(),e(21,` 5220 `),n(22,"div",12),e(23),t(),e(24,` 5221`),t(),e(25,` 5222`),n(26,"div",10),e(27,` 5223 `),n(28,"div",11),e(29,"Size (Bytes)"),t(),e(30,` 5224 `),n(31,"div",12),e(32),t(),e(33,` 5225`),t(),e(34,` 5226`),e(35,` 5227`),n(36,"div",13),e(37,` 5228 `),n(38,"div",11),e(39,"Dimensions"),t(),e(40,` 5229 `),n(41,"div",12),e(42),t(),e(43,` 5230`),t(),e(44,` 5231`),e(45,` 5232`),t(),e(46,` 5233`),t(),e(47,` 5234`)),a&2){let l=r.$implicit;i(4),p(l.documentType),i(4),m("src",ze(9,6,"./assets/img/image-test/"+l.fileName),kt),i(1
52345),p(l.fileSizeKb),i(9),p(l.fileSizeBytes),i(10),q("",l.imageSize.width," \xD7 ",l.imageSize.height)}}var Kl=(()=>{let r=class r{constructor(d){this.siteDataService=d,this.imageData=[{fileName:"VU-Banana-1000x1000.jpg",documentType:"JPEG",fileSizeKb:206,fileSizeBytes:206368,creationDate:"2025-05-15T21:02:00",modificationDate:"2025-05-15T21:02:00",imageSize:{width:1e3,height:1e3},imageDpi:72,colorModel:"RGB",colorProfile:"sRGB IEC61966-2.1"},{fileName:"VU-Banana-1000x1000.png",documentType:"PNG",fileSizeKb:187,fileSizeBytes:186687,creationDate:"2025-05-15T21:01:00",modificationDate:"2025-05-15T21:01:00",imageSize:{width:1e3,height:1e3},imageDpi:72,colorModel:"RGB",colorProfile:"Calibrated RGB Colorspace"},{fileName:"VU-Banana-1000x1000.gif",documentType:"GIF",fileSizeKb:75,fileSizeBytes:75189,creationDate:"2025-05-15T21:03:00",modificationDate:"2025-05-15T21:03:00",imageSize:{width:1e3,height:1e3},imageDpi:72,colorModel:"RGB",colorProfile:"sRGB IEC61966-2.1"},{fileName:"VU-Banana-1000x1000.webp",documentType:"WebP",fileSizeKb:55,fileSizeBytes:55176,creationDate:"2025-05-15T21:03:00",modificationDate:"2025-05-15T21:03:00",imageSize:{width:1e3,height:1e3},imageDpi:72,colorModel:"RGB",colorProfile:"sRGB IEC61966-2.1"}],this.imageDataResized=[{fileName:"VU-Banana-320x320.jpg",documentType:"JPEG ",fileSizeKb:38,fileSizeBytes:37973,creationDate:"2025-05-16T08:42:00",modificationDate:"2025-05-16T08:42:00",imageSize:{width:320,height:320},imageDpi:72,colorModel:"RGB",colorProfile:"sRGB IEC61966-2.1"},{fileName:"VU-Banana-320x320.png",documentType:"PNG ",fileSizeKb:32,fileSizeBytes:32140,creationDate:"2025-05-16T08:44:00",modificationDate:"2025-05-16T08:44:00",imageSize:{width:320,height:320},imageDpi:72,colorModel:"RGB",colorProfile:"sRGB IEC61966-2.1"},{fileName:"VU-Banana-320x320.gif",documentType:"GIF ",fileSizeKb:28,fileSizeBytes:27541,creationDate:"2025-05-16T08:44:00",modificationDate:"2025-05-16T08:44:00",imageSize:{width:320,height:320},imageDpi:72,colorModel:"RGB",colorProfile:"sRGB IEC61966-2.1"},{fileName:"VU-Banana-320x320.webp",documentType:"WebP ",fileSizeKb:19,fileSizeBytes:18824,creationDate:"2025-05-16T08:45:00",modificationDate:"2025-05-16T08:45:00",imageSize:{width:320,height:320},imageDpi:72,colorModel:"RGB",colorProfile:"sRGB IEC61966-2.1"}]}ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-image-test"]],standalone:!1,decls:30,vars:0,consts:[["imageDisplay",""],[1,"row","mb-5"],[1,"text-smallest"],["href","https://upload.wikimedia.org/wikipedia/commons/4/47/VU-Banana-1000x1000.png"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"col-md-3"],[1,"text-center"],[1,"mb-2"],[3,"src"],[1,"border-all","bg-white","text-small"],[1,"replace","row","border-bottom","mx-0"],[1,"col-6","fw-700"],[1,"col-6"],[1,"replace","row","mx-0"]],template:function(s,o){s&1&&(n(0,"main"),e(1,` 5235 `),n(2,"h1"),e(3,"Image Test"),t(),e(4,` 5236 5237 `),n(5,"h2"),e(6,"Original Size"),t(),e(7,` 5238 `),n(8,"div",1),e(9,` 5239 `),S(10,ap,3,4,null,null,K),t(),e(12,` 5240 5241 `),n(13,"h2"),e(14,"Reduced Size"),t(),e(15,` 5242 `),n(16,"div",1),e(17,` 5243 `),S(18,op,3,4,null,null,K),t(),e(20,` 5244 5245 `),n(21,"div",2),e(22,` 5246 `),n(23,"a",3),e(24,"https://upload.wikimedia.org/wikipedia/commons/4/47/VU-Banana-1000x1000.png"),t(),e(25,` 5247 `),t(),e(26,` 5248`),t(),e(27,` 5249 5250`),k(28,lp,48,8,"ng-template",null,0,fe)),s&2&&(i(10),E(o.imageData),i(8),E(o.imageDataResized))},dependencies:[De,qa],encapsulation:2});let a=r;return a})();var dp=()=>["/styleguide"],Xl=()=>["/admin"];function mp(a,r){if(a&1&&(e(0,` 5251 `),c(1,"app-pill",122),e(2,` 5252 `)),a&2){let l=r.$implicit;i(),m("status",l)("text",l)}}var Yl=(()=>{let r=class r{onPillClick(d){this.lastAction=d}constructor(d){this.siteDataService=d,this.statuses=["default","primary","secondary","active","success","warning","error","info","disabled","black","color1"],this.eventStatuses=["event","event-practice","event-club","event-sign-up","event-game","event-other"],this.lastAction="none yet"}ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-sg-pills"]],standalone:!1,decls:945,vars:57,consts:[[1,"text-small","text-grey"],["variant","tag","status","black","text","shared"],[3,"routerLink"],[1,"card"],[1,"table","table-bordered","table-hover"],["status","default"],["status","default","icon","fa-solid fa-check",3,"iconFirst"],["status","default","icon","fa-solid fa-check"],["status","default",3,"clickable"],["status","active"],["status","active","icon","fa-solid fa-circle-check",3,"iconFirst"],["status","active","icon","fa-solid fa-circle-check"],["status","active",3,"clickable"],["status","success"],["status","success","icon","fa-solid fa-check-circle",3,"iconFirst"],["status","success","icon","fa-solid fa-check-circle"],["status","success",3,"clickable"],["status","warning"],["status","warning","icon","fa-solid fa-exclamation-triangle",3,"iconFirst"],["status","warning","icon","fa-solid fa-exclamation-triangle"],["status","warning",3,"clickable"],["status","error"],["status","error","icon","fa-solid fa-exclamation-circle",3,"iconFirst"],["status","error","icon","fa-solid fa-exclamation-circle"],["status","error",3,"clickable"],["status","primary"],["status","primary","icon","fa-solid fa-star",3,"iconFirst"],["status","primary","icon","fa-solid fa-star"],["status","primary",3,"clickable"],["status","secondary"],["status","secondary","icon","fa-solid fa-info-circle",3,"iconFirst"],["status","secondary","icon","fa-solid fa-info-circle"],["status","secondary",3,"clickable"],["status","event"],["status","event","icon","fa-solid fa-calendar",3,"iconFirst"],["status","event","icon","fa-solid fa-calendar"],["status","event",3,"clickable"],["status","event-practice"],["status","event-practice","icon","fa-solid fa-whistle",3,"iconFirst"],["status","event-practice","icon","fa-solid fa-whistle"],["status","event-practice",3,"clickable"],["status","event-club"],["status","event-club","icon","fa-solid fa-pennant",3,"iconFirst"],["status","event-club","icon","fa-solid fa-pennant"],["status","event-club",3,"clickable"],["status","event-sign-up"],["status","event-sign-up","icon","fa-solid fa-clipboard-list",3,"iconFirst"],["status","event-sign-up","icon","fa-solid fa-clipboard-list"],["status","event-sign-up",3,"clickable"],["status","event-game"],["status","event-game","icon","fa-solid fa-futbol",3,"iconFirst"],["status","event-game","icon","fa-solid fa-futbol"],["status","event-game",3,"clickable"],["status","event-other"],["status","event-other","icon","fa-solid fa-ellipsis",3,"iconFirst"],["status","event-other","icon","fa-solid fa-ellipsis"],["status","event-other",3,"clickable"],["status","color1"],["status","color1","icon","fa-solid fa-palette",3,"iconFirst"],["status","color1","icon","fa-solid fa-palette"],["status","color1",3,"clickable"],["status","black"],["status","black","icon","fa-solid fa-circle",3,"iconFirst"],["status","black","icon","fa-solid fa-circle"],["status","black",3,"clickable"],[1,"table-info"],["colspan","5",1,"text-center"],["status","primary","tooltipText","This is a tooltip"],["status","success","icon","fa-solid fa-info-circle","tooltipText","Icon first with tooltip",3,"iconFirst"],["status","warning","icon","fa-solid fa-question-circle","tooltipText","More details here"],["status","active","tooltipText","Clickable with tooltip",3,"clickable"],["alertType","warning",3,"isInline"],["side","shared"],[1,"d-flex","flex-wrap","gap-3","align-items-center"],["styleClass","pill-green-700","text","pill-green-700"],["styleClass","pill-success-lt","text","pill-success-lt"],["styleClass","pill-stripe-test-mode","text","pill-stripe-test-mode"],["status","success","text","pill variant"],["status","success","text","tag variant","variant","tag"],["status","error","text","pill variant"],["status","error","text","tag variant","variant","tag"],["status","primary","text","Click me",3,"onClick","clickable"],["status","secondary","text","Back to the style guide",3,"clickable","routerLink"],["status","primary","text","Remove me","icon","fas fa-times","iconAriaLabel","Remove me",3,"onIconClick","iconClickable"],[1,"text-small","text-grey","mt-3"],[1,"row"],[1,"col-2"],["status","warning","text","Awaiting approval",3,"nowrap"],[1,"col-3"],["status","success","text","Full width",3,"fullWidth"],["text","Sample Tag"],["text","With Icon","icon","fa-solid fa-tag"],["text","Clickable",3,"clickable"],["colspan","3"],["text","Link Tag",3,"routerLink"],["text","Link + Icon","icon","fa-solid fa-link",3,"routerLink"],["text","app-tag"],["status","primary","text","app-pill tag variant","variant","tag"],[3,"pillCount"],["tooltipText","128 unread",3,"pillCount"],["status","active","text","Online"],["status","active","text","Active",3,"dots"],["status","active","text","Active","tooltipText","This item is currently active"],["status","success","text","Verified"],["status","success","text","Success",3,"dots"],["status","success","text","Success","tooltipText","Operation completed successfully"],["status","warning","text","Photo Flagged"],["status","warning","text","Warning",3,"dots"],["status","warning","text","Warning","tooltipText","This item requires attention"],["status","error","text","Failed"],["status","error","text","Error",3,"dots"],["status","error","text","Error","tooltipText","An error has occurred"],["status","note","text","Note"],["status","note","text","Info"],["status","note","text","Note",3,"dots"],["status","note","text","Note","tooltipText","Additional information available"],["status","default","text","Unknown"],["status","default","text","Default",3,"dots"],["status","default","text","Default","tooltipText","Status is unknown"],[1,"pill","pill-success"],[1,"pill","pill-error"],[1,"tab-pill"],[3,"status","text"]],template:function(s,o){s&1&&(n(0,"h2"),e(1,"Pills, Tags & Status Indicators"),t(),e(2,` 5253`),n(3,"p",0),e(4,` 5254 Everything here renders the app's own `),n(5,"code"),e(6,"app-pill"),t(),e(7,", "),n(8,"code"),e(9,"app-tag"),t(),e(10,`, 5255 `),n(11,"code"),e(12,"app-pill-counter"),t(),e(13," and "),n(14,"code"),e(15,"app-status-indicator"),t(),e(16,` against the real 5256 `),n(17,"code"),e(18,"3_modules/components/pill.scss"),t(),e(19,`. Nothing on this page carries harness-local 5257 styling \u2014 if a sample looks wrong, the component or the partial is wrong. 5258`),t(),e(20,` 5259`),n(21,"p",0),e(22,` 5260 Every sample here is marked `),c(23,"app-pill",1),e(24,` \u2014 5261 these render on the admin side and the member side both, and `),n(25,"code"),e(26,"pill.scss"),t(),e(27,` reads no 5262 theme tokens, so a club theme changes none of it. See 5263 `),n(28,"a",2),e(29,"admin vs member"),t(),e(30,`. 5264`),t(),e(31,` 5265 5266`),n(32,"div",3),e(33,` 5267 `),n(34,"h3"),e(35,"1. "),n(36,"code"),e(37,"app-pill"),t(),e(38," \u2014 status"),t(),e(39,` 5268 `),n(40,"p",0),e(41,` 5269 `),n(42,"code"),e(43,"status"),t(),e(44," maps straight to a "),n(45,"code"),e(46,".pill-<status>"),t(),e(47,` class. The matrix 5270 crosses every status with the icon and clickable options. 5271 `),t(),e(48,` 5272 5273 `),n(49,"table",4),e(50,` 5274 `),n(51,"thead"),e(52,` 5275 `),n(53,"tr"),e(54,` 5276 `),n(55,"th"),e(56,"Status Type"),t(),e(57,` 5277 `),n(58,"th"),e(59,"Text Only"),t(),e(60,` 5278 `),n(61,"th"),e(62,"With Icon (Left)"),t(),e(63,`
5279 `),n(64,"th"),e(65,"With Icon (Right)"),t(),e(66,` 5280 `),n(67,"th"),e(68,"Clickable"),t(),e(69,` 5281 `),t(),e(70,` 5282 `),t(),e(71,` 5283 `),n(72,"tbody"),e(73,` 5284 `),n(74,"tr"),e(75,` 5285 `),n(76,"td")(77,"code"),e(78,"default"),t()(),e(79,` 5286 `),n(80,"td")(81,"app-pill",5),e(82,"Default"),t()(),e(83,` 5287 `),n(84,"td")(85,"app-pill",6),e(86,"Default"),t()(),e(87,` 5288 `),n(88,"td")(89,"app-pill",7),e(90,"Default"),t()(),e(91,` 5289 `),n(92,"td")(93,"app-pill",8),e(94,"Clickable"),t()(),e(95,` 5290 `),t(),e(96,` 5291 `),n(97,"tr"),e(98,` 5292 `),n(99,"td")(100,"code"),e(101,"active"),t()(),e(102,` 5293 `),n(103,"td")(104,"app-pill",9),e(105,"Active"),t()(),e(106,` 5294 `),n(107,"td")(108,"app-pill",10),e(109,"Active"),t()(),e(110,` 5295 `),n(111,"td")(112,"app-pill",11),e(113,"Active"),t()(),e(114,` 5296 `),n(115,"td")(116,"app-pill",12),e(117,"Clickable"),t()(),e(118,` 5297 `),t(),e(119,` 5298 `),n(120,"tr"),e(121,` 5299 `),n(122,"td")(123,"code"),e(124,"success"),t()(),e(125,` 5300 `),n(126,"td")(127,"app-pill",13),e(128,"Success"),t()(),e(129,` 5301 `),n(130,"td")(131,"app-pill",14),e(132,"Success"),t()(),e(133,` 5302 `),n(134,"td")(135,"app-pill",15),e(136,"Success"),t()(),e(137,` 5303 `),n(138,"td")(139,"app-pill",16),e(140,"Clickable"),t()(),e(141,` 5304 `),t(),e(142,` 5305 `),n(143,"tr"),e(144,` 5306 `),n(145,"td")(146,"code"),e(147,"warning"),t()(),e(148,` 5307 `),n(149,"td")(150,"app-pill",17),e(151,"Warning"),t()(),e(152,` 5308 `),n(153,"td")(154,"app-pill",18),e(155,"Warning"),t()(),e(156,` 5309 `),n(157,"td")(158,"app-pill",19),e(159,"Warning"),t()(),e(160,` 5310 `),n(161,"td")(162,"app-pill",20),e(163,"Clickable"),t()(),e(164,` 5311 `),t(),e(165,` 5312 `),n(166,"tr"),e(167,` 5313 `),n(168,"td")(169,"code"),e(170,"error"),t()(),e(171,` 5314 `),n(172,"td")(173,"app-pill",21),e(174,"Error"),t()(),e(175,` 5315 `),n(176,"td")(177,"app-pill",22),e(178,"Error"),t()(),e(179,` 5316 `),n(180,"td")(181,"app-pill",23),e(182,"Error"),t()(),e(183,` 5317 `),n(184,"td")(185,"app-pill",24),e(186,"Clickable"),t()(),e(187,` 5318 `),t(),e(188,` 5319 `),n(189,"tr"),e(190,` 5320 `),n(191,"td")(192,"code"),e(193,"primary"),t()(),e(194,` 5321 `),n(195,"td")(196,"app-pill",25),e(197,"Primary"),t()(),e(198,` 5322 `),n(199,"td")(200,"app-pill",26),e(201,"Primary"),t()(),e(202,` 5323 `),n(203,"td")(204,"app-pill",27),e(205,"Primary"),t()(),e(206,` 5324 `),n(207,"td")(208,"app-pill",28),e(209,"Clickable"),t()(),e(210,` 5325 `),t(),e(211,` 5326 `),n(212,"tr"),e(213,` 5327 `),n(214,"td")(215,"code"),e(216,"secondary"),t()(),e(217,` 5328 `),n(218,"td")(219,"app-pill",29),e(220,"Secondary"),t()(),e(221,` 5329 `),n(222,"td")(223,"app-pill",30),e(224,"Secondary"),t()(),e(225,` 5330 `),n(226,"td")(227,"app-pill",31),e(228,"Secondary"),t(),e(229,` 5331 `),t(),e(230,` 5332 `),n(231,"td")(232,"app-pill",32),e(233,"Clickable"),t()(),e(234,` 5333 `),t(),e(235,` 5334 `),n(236,"tr"),e(237,` 5335 `),n(238,"td")(239,"code"),e(240,"event"),t()(),e(241,` 5336 `),n(242,"td")(243,"app-pill",33),e(244,"Event"),t()(),e(245,` 5337 `),n(246,"td")(247,"app-pill",34),e(248,"Event"),t()(),e(249,` 5338 `),n(250,"td")(251,"app-pill",35),e(252,"Event"),t()(),e(253,` 5339 `),n(254,"td")(255,"app-pill",36),e(256,"Clickable"),t()(),e(257,` 5340 `),t(),e(258,` 5341 `),n(259,"tr"),e(260,` 5342 `),n(261,"td")(262,"code"),e(263,"event-practice"),t()(),e(264,` 5343 `),n(265,"td")(266,"app-pill",37),e(267,"Practice"),t()(),e(268,` 5344 `),n(269,"td")(270,"app-pill",38),e(271,"Practice"),t()(),e(272,` 5345 `),n(273,"td")(274,"app-pill",39),e(275,"Practice"),t(),e(276,` 5346 `),t(),e(277,` 5347 `),n(278,"td")(279,"app-pill",40),e(280,"Clickable"),t()(),e(281,` 5348 `),t(),e(282,` 5349 `),n(283,"tr"),e(284,` 5350 `),n(285,"td")(286,"code"),e(287,"event-club"),t()(),e(288,` 5351 `),n(289,"td")(290,"app-pill",41),e(291,"Club Event"),t()(),e(292,` 5352 `),n(293,"td")(294,"app-pill",42),e(295,`Club 5353 Event`),t()(),e(296,` 5354 `),n(297,"td")(298,"app-pill",43),e(299,"Club Event"),t()(),e(300,` 5355 `),n(301,"td")(302,"app-pill",44),e(303,"Clickable"),t()(),e(304,` 5356 `),t(),e(305,` 5357 `),n(306,"tr"),e(307,` 5358 `),n(308,"td")(309,"code"),e(310,"event-sign-up"),t()(),e(311,` 5359 `),n(312,"td")(313,"app-pill",45),e(314,"Sign Up"),t()(),e(315,` 5360 `),n(316,"td")(317,"app-pill",46),e(318,"Sign Up"),t()(),e(319,` 5361 `),n(320,"td")(321,"app-pill",47),e(322,`Sign 5362 Up`),t()(),e(323,` 5363 `),n(324,"td")(325,"app-pill",48),e(326,"Clickable"),t()(),e(327,` 5364 `),t(),e(328,` 5365 `),n(329,"tr"),e(330,` 5366 `),n(331,"td")(332,"code"),e(333,"event-game"),t()(),e(334,` 5367 `),n(335,"td")(336,"app-pill",49),e(337,"Game"),t()(),e(338,` 5368 `),n(339,"td")(340,"app-pill",50),e(341,"Game"),t()(),e(342,` 5369 `),n(343,"td")(344,"app-pill",51),e(345,"Game"),t()(),e(346,` 5370 `),n(347,"td")(348,"app-pill",52),e(349,"Clickable"),t()(),e(350,` 5371 `),t(),e(351,` 5372 `),n(352,"tr"),e(353,` 5373 `),n(354,"td")(355,"code"),e(356,"event-other"),t()(),e(357,` 5374 `),n(358,"td")(359,"app-pill",53),e(360,"Other"),t()(),e(361,` 5375 `),n(362,"td")(363,"app-pill",54),e(364,"Other"),t()(),e(365,` 5376 `),n(366,"td")(367,"app-pill",55),e(368,"Other"),t()(),e(369,` 5377 `),n(370,"td")(371,"app-pill",56),e(372,"Clickable"),t()(),e(373,` 5378 `),t(),e(374,` 5379 `),n(375,"tr"),e(376,` 5380 `),n(377,"td")(378,"code"),e(379,"color1"),t()(),e(380,` 5381 `),n(381,"td")(382,"app-pill",57),e(383,"Color 1"),t()(),e(384,` 5382 `),n(385,"td")(386,"app-pill",58),e(387,`Color 5383 1`),t()(),e(388,` 5384 `),n(389,"td")(390,"app-pill",59),e(391,"Color 1"),t()(),e(392,` 5385 `),n(393,"td")(394,"app-pill",60),e(395,"Clickable"),t()(),e(396,` 5386 `),t(),e(397,` 5387 `),n(398,"tr"),e(399,` 5388 `),n(400,"td")(401,"code"),e(402,"black"),t()(),e(403,` 5389 `),n(404,"td")(405,"app-pill",61),e(406,"Black"),t()(),e(407,`
5390 `),n(408,"td")(409,"app-pill",62),e(410,"Black"),t()(),e(411,` 5391 `),n(412,"td")(413,"app-pill",63),e(414,"Black"),t()(),e(415,` 5392 `),n(416,"td")(417,"app-pill",64),e(418,"Clickable"),t()(),e(419,` 5393 `),t(),e(420,` 5394 `),n(421,"tr",65),e(422,` 5395 `),n(423,"td",66)(424,"strong"),e(425,`Examples with Tooltips (hover to 5396 see)`),t()(),e(426,` 5397 `),t(),e(427,` 5398 `),n(428,"tr"),e(429,` 5399 `),n(430,"td")(431,"code"),e(432,"With Tooltip"),t()(),e(433,` 5400 `),n(434,"td")(435,"app-pill",67),e(436,"Hover Me"),t()(),e(437,` 5401 `),n(438,"td")(439,"app-pill",68),e(440,"Info"),t()(),e(441,` 5402 `),n(442,"td")(443,"app-pill",69),e(444,"Help"),t()(),e(445,` 5403 `),n(446,"td")(447,"app-pill",70),e(448,"Click & Hover"),t()(),e(449,` 5404 `),t(),e(450,` 5405 `),t(),e(451,` 5406 `),t(),e(452,` 5407 5408 `),n(453,"app-inline-alert",71),e(454,` 5409 `),n(455,"strong"),e(456,"Three statuses have no stylesheet."),t(),e(457,` 5410 `),n(458,"code"),e(459,"default"),t(),e(460,", "),n(461,"code"),e(462,"info"),t(),e(463," and "),n(464,"code"),e(465,"disabled"),t(),e(466,` are on the component's 5411 `),n(467,"code"),e(468,"status"),t(),e(469," union, but "),n(470,"code"),e(471,".pill-default"),t(),e(472,", "),n(473,"code"),e(474,".pill-info"),t(),e(475,` and 5412 `),n(476,"code"),e(477,".pill-disabled"),t(),e(478," do not exist in "),n(479,"code"),e(480,"pill.scss"),t(),e(481,` \u2014 those three render as 5413 a bare `),n(482,"code"),e(483,".pill"),t(),e(484,` in the matrix above. 5414 `),t(),e(485,` 5415 5416 `),n(486,"app-sg-caption",72),e(487,"Event statuses \u2014 used by the calendar"),t(),e(488,` 5417 `),n(489,"div",73),e(490,` 5418 `),S(491,mp,3,2,null,null,K),t(),e(493,` 5419 5420 `),n(494,"app-sg-caption",72),e(495,` 5421 In `),n(496,"code"),e(497,"pill.scss"),t(),e(498," but not on the "),n(499,"code"),e(500,"status"),t(),e(501,` union \u2014 reachable only through 5422 `),n(502,"code"),e(503,"styleClass"),t(),e(504,` 5423 `),t(),e(505,` 5424 `),n(506,"div",73),e(507,` 5425 `),c(508,"app-pill",74),e(509,` 5426 `),c(510,"app-pill",75),e(511,` 5427 `),c(512,"app-pill",76),e(513,` 5428 `),t(),e(514,` 5429`),t(),e(515,` 5430 5431`),n(516,"div",3),e(517,` 5432 `),n(518,"h3"),e(519,"2. "),n(520,"code"),e(521,"app-pill"),t(),e(522," \u2014 variant"),t(),e(523,` 5433 `),n(524,"p",0),e(525,` 5434 `),n(526,"code"),e(527,'variant="tag"'),t(),e(528,` keeps the status color and swaps to the softer treatment: rounded 5435 corners, no uppercase, smaller text. 5436 `),t(),e(529,` 5437 5438 `),n(530,"app-sg-caption",72),e(531,`[variant]="'pill'" (default) vs [variant]="'tag'"`),t(),e(532,` 5439 `),n(533,"div",73),e(534,` 5440 `),c(535,"app-pill",77),e(536,` 5441 `),c(537,"app-pill",78),e(538,` 5442 `),c(539,"app-pill",79),e(540,` 5443 `),c(541,"app-pill",80),e(542,` 5444 `),t(),e(543,` 5445`),t(),e(544,` 5446 5447`),n(545,"div",3),e(546,` 5448 `),n(547,"h3"),e(548,"3. "),n(549,"code"),e(550,"app-pill"),t(),e(551," \u2014 interaction"),t(),e(552,` 5449 `),n(553,"p",0),e(554,` 5450 `),n(555,"code"),e(556,"clickable"),t(),e(557," without "),n(558,"code"),e(559,"routerLink"),t(),e(560," renders a "),n(561,"code"),e(562,"<button>"),t(),e(563,`; 5451 with one it renders an `),n(564,"code"),e(565,"<a>"),t(),e(566,`. Both are here because they produce different 5452 markup and only one is correct for a given call site. 5453 `),t(),e(567,` 5454 5455 `),n(568,"app-sg-caption",72),e(569,'[clickable]="true" (onClick) \u2014 renders a <button>'),t(),e(570,` 5456 `),n(571,"div",73),e(572,` 5457 `),n(573,"app-pill",81),g("onClick",function(){return o.onPillClick("the clickable pill")}),t(),e(574,` 5458 `),t(),e(575,` 5459 5460 `),n(576,"app-sg-caption",72),e(577,'[clickable]="true" [routerLink] \u2014 renders an <a>'),t(),e(578,` 5461 `),n(579,"div",73),e(580,` 5462 `),c(581,"app-pill",82),e(582,` 5463 `),t(),e(583,` 5464 5465 `),n(584,"app-sg-caption",72),e(585,'[iconClickable]="true" \u2014 the icon renders as a <button>
5465 and fires (onIconClick); the pill itself does not. Always pair it with [iconAriaLabel] \u2014 an icon font has no accessible name.'),t(),e(586,` 5466 `),n(587,"div",73),e(588,` 5467 `),n(589,"app-pill",83),g("onIconClick",function(){return o.onPillClick("the removable pill icon")}),t(),e(590,` 5468 `),t(),e(591,` 5469 5470 `),n(592,"p",84),e(593,"Last click: "),n(594,"strong"),e(595),t()(),e(596,` 5471`),t(),e(597,` 5472 5473`),n(598,"div",3),e(599,` 5474 `),n(600,"h3"),e(601,"4. "),n(602,"code"),e(603,"app-pill"),t(),e(604," \u2014 layout"),t(),e(605,` 5475 5476 `),n(606,"app-sg-caption",72),e(607,'[nowrap]="true" \u2014 inside a narrow column'),t(),e(608,` 5477 `),n(609,"div",85),e(610,` 5478 `),n(611,"div",86),e(612,` 5479 `),c(613,"app-pill",87),e(614,` 5480 `),t(),e(615,` 5481 `),t(),e(616,` 5482 5483 `),n(617,"app-sg-caption",72),e(618,'[fullWidth]="true" \u2014 fills its container and centers'),t(),e(619,` 5484 `),n(620,"div",85),e(621,` 5485 `),n(622,"div",88),e(623,` 5486 `),c(624,"app-pill",89),e(625,` 5487 `),t(),e(626,` 5488 `),t(),e(627,` 5489 5490 `),n(628,"app-sg-caption",72),e(629,"Content projection instead of [text]"),t(),e(630,` 5491 `),n(631,"div",73),e(632,` 5492 `),n(633,"app-pill",25)(634,"strong"),e(635,"Projected"),t(),e(636," content"),t(),e(637,` 5493 `),t(),e(638,` 5494`),t(),e(639,` 5495 5496`),n(640,"div",3),e(641,` 5497 `),n(642,"h3"),e(643,"5. "),n(644,"code"),e(645,"app-tag"),t()(),e(646,` 5498 `),n(647,"p",0),e(648,` 5499 A separate component from `),n(649,"code"),e(650,"app-pill"),t(),e(651,"'s "),n(652,"code"),e(653,'variant="tag"'),t(),e(654,`. Resolving that 5500 overlap is the job of the Pills / Badges / Tags audit \u2014 this page exists so the two can be 5501 compared. 5502 `),t(),e(655,` 5503 5504 `),n(656,"table",4),e(657,` 5505 `),n(658,"thead"),e(659,` 5506 `),n(660,"tr"),e(661,` 5507 `),n(662,"th"),e(663,"Variation"),t(),e(664,` 5508 `),n(665,"th"),e(666,"Text Only"),t(),e(667,` 5509 `),n(668,"th"),e(669,"With Icon (Left)"),t(),e(670,` 5510 `),n(671,"th"),e(672,"With Icon (Right)"),t(),e(673,` 5511 `),n(674,"th"),e(675,"Clickable"),t(),e(676,` 5512 `),t(),e(677,` 5513 `),t(),e(678,` 5514 `),n(679,"tbody"),e(680,` 5515 `),n(681,"tr"),e(682,` 5516 `),n(683,"td")(684,"code"),e(685,"default"),t()(),e(686,` 5517 `),n(687,"td"),c(688,"app-tag",90),t(),e(689,` 5518 `),n(690,"td"),c(691,"app-tag",91),t(),e(692,` 5519 `),n(693,"td"),c(694,"app-tag",91),t(),e(695,` 5520 `),n(696,"td"),c(697,"app-tag",92),t(),e(698,` 5521 `),t(),e(699,` 5522 `),n(700,"tr"),e(701,` 5523 `),n(702,"td")(703,"code"),e(704,"with routerLink"),t()(),e(705,` 5524 `),n(706,"td",93),c(707,"app-tag",94),t(),e(708,` 5525 `),n(709,"td"),c(710,"app-tag",95),t(),e(711,` 5526 `),t(),e(712,` 5527 `),t(),e(713,` 5528 `),t(),e(714,` 5529 5530 `),n(715,"app-sg-caption",72),e(716,`Side by side with app-pill [variant]="'tag'"`),t(),e(717,` 5531 `),n(718,"div",73),e(719,` 5532 `),c(720,"app-tag",96),e(721,` 5533 `),c(722,"app-pill",97),e(723,` 5534 `),t(),e(724,` 5535`),t(),e(725,` 5536 5537`),n(726,"div",3),e(727,` 5538 `),n(728,"h3"),e(729,"6. "),n(730,"code"),e(731,"app-pill-counter"),t()(),e(732,` 5539 5540 `),n(733,"app-sg-caption",72),e(734,'<app-pill-counter [pillCount]="\u2026">'),t(),e(735,` 5541 `),n(736,"div",73),e(737,` 5542 `),c(738,"app-pill-counter",98),e(739,` 5543 `),c(740,"app-pill-counter",98),e(741,` 5544 `),c(742,"app-pill-counter",98),e(743,` 5545 `),c(744,"app-pill-counter",99),e(745,` 5546 `),t(),e(746,` 5547`),t(),e(747,` 5548 5549`),n(748,"div",3),e(749,` 5550 `),n(750,"h3"),e(751,"7. "),n(752,"code"),e(753,"app-status-indicator"),t()(),e(754,` 5551 `),n(755,"p",0),e(756,` 5552 Chip-like, so it is in scope for the same audit \u2014 and its `),n(757,"code"),e(758,"status"),t(),e(759,` values are 5553 `),n(760,"em"),e(761,"not"),t(),e(762," the same set as "),n(763,"code"),e(764,"app-pill"),t(),e(765,`'s. 5554 `),t(),e(766,` 5555 5556 `),n(767,"table",4),e(768,` 5557 `),n(769,"thead"),e(770,` 5558 `),n(771,"tr"),e(772,` 5559 `),n(773,"th"),e(774,"Status"),t(),e(775,` 5560 `),n(776,"th"),e(777,"Default"),t(),e(778,`
5561 `),n(779,"th"),e(780,"Custom Text"),t(),e(781,` 5562 `),n(782,"th"),e(783,"Dots"),t(),e(784,` 5563 `),n(785,"th"),e(786,"With Tooltip"),t(),e(787,` 5564 `),t(),e(788,` 5565 `),t(),e(789,` 5566 `),n(790,"tbody"),e(791,` 5567 `),n(792,"tr"),e(793,` 5568 `),n(794,"td")(795,"code"),e(796,"active"),t()(),e(797,` 5569 `),n(798,"td"),c(799,"app-status-indicator",9),t(),e(800,` 5570 `),n(801,"td"),c(802,"app-status-indicator",100),t(),e(803,` 5571 `),n(804,"td"),c(805,"app-status-indicator",101),t(),e(806,` 5572 `),n(807,"td"),c(808,"app-status-indicator",102),t(),e(809,` 5573 `),t(),e(810,` 5574 `),n(811,"tr"),e(812,` 5575 `),n(813,"td")(814,"code"),e(815,"success"),t()(),e(816,` 5576 `),n(817,"td"),c(818,"app-status-indicator",13),t(),e(819,` 5577 `),n(820,"td"),c(821,"app-status-indicator",103),t(),e(822,` 5578 `),n(823,"td"),c(824,"app-status-indicator",104),t(),e(825,` 5579 `),n(826,"td"),c(827,"app-status-indicator",105),t(),e(828,` 5580 `),t(),e(829,` 5581 `),n(830,"tr"),e(831,` 5582 `),n(832,"td")(833,"code"),e(834,"warning"),t()(),e(835,` 5583 `),n(836,"td"),c(837,"app-status-indicator",17),t(),e(838,` 5584 `),n(839,"td"),c(840,"app-status-indicator",106),t(),e(841,` 5585 `),n(842,"td"),c(843,"app-status-indicator",107),t(),e(844,` 5586 `),n(845,"td"),c(846,"app-status-indicator",108),t(),e(847,` 5587 `),t(),e(848,` 5588 `),n(849,"tr"),e(850,` 5589 `),n(851,"td")(852,"code"),e(853,"error"),t()(),e(854,` 5590 `),n(855,"td"),c(856,"app-status-indicator",21),t(),e(857,` 5591 `),n(858,"td"),c(859,"app-status-indicator",109),t(),e(860,` 5592 `),n(861,"td"),c(862,"app-status-indicator",110),t(),e(863,` 5593 `),n(864,"td"),c(865,"app-status-indicator",111),t(),e(866,` 5594 `),t(),e(867,` 5595 `),n(868,"tr"),e(869,` 5596 `),n(870,"td")(871,"code"),e(872,"note"),t()(),e(873,` 5597 `),n(874,"td"),c(875,"app-status-indicator",112),t(),e(876,` 5598 `),n(877,"td"),c(878,"app-status-indicator",113),t(),e(879,` 5599 `),n(880,"td"),c(881,"app-status-indicator",114),t(),e(882,` 5600 `),n(883,"td"),c(884,"app-status-indicator",115),t(),e(885,` 5601 `),t(),e(886,` 5602 `),n(887,"tr"),e(888,` 5603 `),n(889,"td")(890,"code"),e(891,"default"),t()(),e(892,` 5604 `),n(893,"td"),c(894,"app-status-indicator",5),t(),e(895,` 5605 `),n(896,"td"),c(897,"app-status-indicator",116),t(),e(898,` 5606 `),n(899,"td"),c(900,"app-status-indicator",117),t(),e(901,` 5607 `),n(902,"td"),c(903,"app-status-indicator",118),t(),e(904,` 5608 `),t(),e(905,` 5609 `),t(),e(906,` 5610 `),t(),e(907,` 5611`),t(),e(908,` 5612 5613`),n(909,"div",3),e(910,` 5614 `),n(911,"h3"),e(912,"8. Raw classes"),t(),e(913,` 5615 `),n(914,"p",0),e(915,` 5616 Call sites that write the markup by hand instead of using the component. These are migration 5617 targets, not examples to copy. 5618 `),t(),e(916,` 5619 5620 `),n(917,"app-sg-caption",72),e(918,'<span class="pill pill-success"> \u2014 hand-rolled'),t(),e(919,` 5621 `),n(920,"div",73),e(921,` 5622 `),n(922,"span",119),e(923,"Hand-rolled"),t(),e(924,` 5623 `),n(925,"span",120),e(926,"Hand-rolled"),t(),e(927,` 5624 `),t(),e(928,` 5625 5626 `),n(929,"app-sg-caption",72),e(930,".tab-pill \u2014 the filter-tab treatment"),t(),e(931,` 5627 `),n(932,"div",73),e(933,` 5628 `),n(934,"span",121),e(935,"All"),t(),e(936,` 5629 `),n(937,"span",121),e(938,"Active"),t(),e(939,` 5630 `),n(940,"span",121),e(941,"Archived"),t(),e(942,` 5631 `),t(),e(943,` 5632`),t(),e(944,` 5633`)),s&2&&(i(28),m("routerLink","/admin/styleguide/global/admin-vs-member"),i(57),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(9),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(9),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(15),m("iconFirst",!0),i(8),m("clickable",!0),i(22),m("iconFirst",!0),i(8),m("clickable",!0),i(6),m("isInline",!0),i(38),E(o.eventStatuses),i(82),m("clickable",!0),i(8),m("clickable",!0)("routerLink",V(54,dp)),i(8),m("iconClickable",!0),i(6),p(o.lastAction),i(18),m("nowrap",!0),i(11),m("fullWidth",!0),i(73),m("clickable",!0),i(10),m("routerLink",V(55,Xl)),i(3),m("routerLink",V(56,Xl)),i(28),m("pillCount",0),i(2),m("pillCount",3),i(2),m("pillCount",42),i(2),m("pillCount",128),i(61),m("dots",!0),i(19),m("dots",!0),i(19),m("dots",!0),i(19),m("dots",!0),i(19),m("dots",!0),i(19),m("dots",!0))},dependencies:[$,nt,J,le,lt,bn,X],encapsulation:2});let a=r;return a})();function Xi(a){let r=(a||"").trim(),l=/^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)(?:[\s,/]+([\d.%]+))?\s*\)$/i.exec(r);if(l){let s=l[4],o=s===void 0?1:s.endsWith("%")?parseFloat(s)/100:parseFloat(s);return{r:+l[1],g:+l[2],b:+l[3],a:isNaN(o)?1:o}}let d=/^#?([a-f\d]{3}|[a-f\d]{6})$/i.exec(r);if(d){let s=d[1].length===3?d[1].split("").map(o=>o+o).join(""):d[1];return{r:parseInt(s.substr(0,2),16),g:parseInt(s.substr(2,2),16),b:parseInt(s.substr(4,2),16),a:1}}return null}function Yi(a,r){if(!a||!r)return a;let l=a.a;return{r:a.r*l+r.r*(1-l),g:a.g*l+r.g*(1-l),b:a.b*l+r.b*(1-l),a:1}}function Ki(a){let r=a/255;return r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4)}function Ql(a){return .2126*Ki(a.r)+.7152*Ki(a.g)+.0722*Ki(a.b)}function Jl(a,r){if(!a||!r)return null;let l=Ql(Yi(a,r)),d=Ql(r);return l>d?(l+.05)/(d+.05):(d+.05)/(l+.05)}function Qi(a){if(!a)return"";let r=l=>Math.round(l).toString(16).padStart(2,"0");return`#${r(a.r)}${r(a.g)}${r(a.b)}`}var cp=["editableSample"],pp=["namelessSample"],xp=["scaleSample"],hp=["pairingSample"],Xn=(a,r)=>
5633r.kind,Yn=(a,r)=>r.reach,Qn=(a,r)=>r.name,Zl=(a,r)=>r.title,up=(a,r)=>r.what;function gp(a,r){if(a&1&&(e(0,` 5634 `),n(1,"div"),e(2,` 5635 `),c(3,"app-pill",65),e(4,` 5636 `),n(5,"span",66),e(6),t(),e(7,` 5637 `),t(),e(8,` 5638 `)),a&2){let l=r.$implicit;i(3),m("status",l.status)("text",l.label),i(3),p(l.count)}}function fp(a,r){if(a&1&&(e(0,` 5639 `),n(1,"tr"),e(2,` 5640 `),n(3,"td"),c(4,"app-pill",65),t(),e(5,` 5641 `),n(6,"td",4),e(7),t(),e(8,` 5642 `),n(9,"td",67),e(10),t(),e(11,` 5643 `),n(12,"td",67),e(13),t(),e(14,` 5644 `),n(15,"td",67),e(16),t(),e(17,` 5645 `),t(),e(18,` 5646 `)),a&2){let l=r.$implicit,d=u();i(4),m("status",l.status)("text",l.label),i(3),p(l.means),i(3),p(l.verify),i(3),p(d.countFixed(l.kind)),i(3),p(d.countOpen(l.kind))}}function bp(a,r){if(a&1&&(e(0,` 5647 `),n(1,"div"),e(2,` 5648 `),c(3,"app-pill",65),e(4,` 5649 `),n(5,"span",66),e(6),t(),e(7,` 5650 `),t(),e(8,` 5651 `)),a&2){let l=r.$implicit;i(3),m("status",l.status)("text",l.label),i(3),p(l.count)}}function Sp(a,r){if(a&1&&(e(0,` 5652 `),n(1,"tr"),e(2,` 5653 `),n(3,"td"),c(4,"app-pill",65),t(),e(5,` 5654 `),n(6,"td",4),e(7),t(),e(8,` 5655 `),n(9,"td",67),e(10),t(),e(11,` 5656 `),n(12,"td",67),e(13),t(),e(14,` 5657 `),n(15,"td",67),e(16),t(),e(17,` 5658 `),t(),e(18,` 5659 `)),a&2){let l=r.$implicit,d=u();i(4),m("status",l.status)("text",l.label),i(3),p(l.means),i(3),p(l.verify),i(3),p(d.countFixedReach(l.reach)),i(3),p(d.countOpenReach(l.reach))}}function Ep(a,r){if(a&1&&(e(0,` 5660 `),n(1,"div",35),e(2,` 5661 `),c(3,"app-user-initials",68,3),e(5,` 5662 `),n(6,"div",47),e(7),t(),e(8,` 5663 `),t(),e(9,` 5664 `)),a&2){let l=r.$implicit;i(3),m("id",9)("size",l.name),i(4),p(l.name)}}function vp(a,r){if(a&1&&(e(0,` 5665 `),n(1,"div",35),e(2,` 5666 `),c(3,"app-user-initials",69),e(4,` 5667 `),n(5,"div",47),e(6),t(),e(7,` 5668 `),t(),e(8,` 5669 `)),a&2){let l=r.$implicit;i(3),m("id",9)("size",l.name)("showCircle",!1),i(3),p(l.name)}}function yp(a,r){if(a&1&&(e(0,` 5670 `),n(1,"tr"),e(2,` 5671 `),n(3,"td")(4,"code",67),e(5),t()(),e(6,` 5672 `),n(7,"td")(8,"code",67),e(9),t()(),e(10,` 5673 `),n(11,"td")(12,"code",67),e(13),t()(),e(14,` 5674 `),n(15,"td")(16,"code",67),e(17),t()(),e(18,` 5675 `),n(19,"td")(20,"code",67),e(21),t()(),e(22,` 5676 `),n(23,"td",67),e(24),t(),e(25,` 5677 `),t(),e(26,` 5678 `)),a&2){let l=r.$implicit;i(5),p(l.sizeInput),i(4),p(l.cssClass),i(4),p(l.box),i(4),p(l.fontSize),i(4),p(l.lineHeight),i(3),p(l.uses)}}function wp(a,r){a&1&&(e(0,` 5679 `),c(1,"app-pill",71),e(2,` 5680 `))}function Cp(a,r){a&1&&(e(0,` 5681 `),c(1,"app-pill",72),e(2,` 5682 `))}function _p(a,r){if(a&1&&(e(0,` 5683 `),n(1,"tr"),e(2,` 5684 `),n(3,"td")(4,"code",67),e(5),t()(),e(6,` 5685 `),n(7,"td",67),e(8),L(9,"number"),t(),e(10,` 5686 `),n(11,"td",67),e(12),L(13,"number"),n(14,"span",70),e(15),L(16,"number"),t(),e(17,` 5687 `),t(),e(18,` 5688 `),n(19,"td",67),e(20),L(21,"number"),t(),e(22,` 5689 `),n(23,"td",67),e(24),L(25,"number"),n(26,"span",70),e(27),L(28,"number"),t(),e(29,` 5690 `),t(),e(30,` 5691 `),n(31,"td"),e(32,` 5692 `),v(33,wp,3,0)(34,Cp,3,0),t(),e(35,` 5693 `),t(),e(36,` 5694 `)),a&2){let l=r.$implicit;i(5),p(l.name),i(3),f("",G(9,8,l.box16,"1.0-1"),"px"),i(4),f(` 5695 `,G(13,11,l.box24,"1.0-1"),`px 5696 `),i(3),f("\xD7",G(16,14,l.boxFactor,"1.2-2")),i(5),f("",G(21,17,l.glyph16,"1.0-1"),"px"),i(4),f(` 5697 `,G(25,20,l.glyph24,"1.0-1"),`px 5698 `),i(3),f("\xD7",G(28,23,l.glyphFactor,"1.2-2")),i(6),y(l.holds?33:34)}}function kp(a,r){if(a&1&&(e(0,` 5699 `),n(1,"div"),e(2,` 5700 `),c(3,"app-pill",65),e(4,` 5701 `),n(5,"span",66),e(6),t(),e(7,` 5702 `),t(),e(8,` 5703 `)),a&2){let l=r.$implicit;i(3),m("status",l.status)("text",l.label),i(3),p(l.count)}}function Tp(a,r){if(a&1&&(e(0,` 5704 `),n(1,"div"),e(2,` 5705 `),c(3,"app-pill",65),e(4,` 5706 `),n(5,"span",66),e(6),t(),e(7,` 5707 `),t(),e(8,` 5708 `)),a&2){let l=u().$implicit;i(3),m("status",l.status)("text",l.label),i(3),p(l.count)}}function Ip(a,r){if(a&1&&(e(0,` 5709 `),v(1,Tp,9,3)),a&2){let l=r.$implicit;i(),y(l.reach!=="none"?1:-1)}}function Mp(a,r){a&1&&(e(0,` 5710 `),n(1,"span",43),e(2,"\u2014"),t(),e(3,` 5711 `))}function Dp(a,r){if(a&1&&(e(0,` 5712 `),c(1,"app-pill",65),e(2,` 5713 `)),a&2){let l=u().$implicit,d=u();i(),m("status",d.reachStatus(l.a11y))("text",d.reachLabel(l.a11y))}}function Fp(a,r){a&1&&(e(0,` 5714 `),n(1,"span",76),e(2,"introduced"),t(),e(3,` 5715 `),n(4,"span",39),e(5,"by this change, fixed in it"),t(),e(6,` 5716 `))}function Pp(a,r){a&1&&(e(0,` 5717 `),n(1,"span",77),e(2,"pre-existing"),t(),e(3,` 5718 `))}function Ap(a,r){a&1&&(e(0," "),n(1,"a",78),e(2,"\xA71 probe"),t(),e(3," "))}function Op(a,r){a&1&&(e(0," "),n(1,"a",79),e(2,"below"),t(),e(3," "))}function Np(a,r){a&1&&(e(0," "),n(1,"a",79),e(2,"below"),t(),e(3," "))}function Bp(a,r){a&1&&(e(0," "),n(1,"a",80),e(2,"\xA73 probe"),t(),e(3," "))}function Wp(a,r){a&1&&(e(0," "),n(1,"span",81),e(2,"\u2014"),t(),e(3," "))}function Rp(a,r){if(a&1&&(e(0,` 5719 `),n(1,"tr"),e(2,` 5720 `),n(3,"td",73),e(4),n(5,"span",74),e(6),t(),e(7,` 5721 `),t(),e(8,` 5722 `),n(9,"td"),e(10,` 5723 `),c(11,"app-pill",65),e(12,` 5724 `),t(),e(13,` 5725 `),n(14,"td"),e(15,` 5726 `),v(16,Mp,4,0)(17,Dp,3,2),t(),e(18,` 5727 `),n(19,"td",75),e(20,` 5728 `),v(21,Fp,7,0)(22,Pp,4,0),t(),e(23,` 5729 `),n(24,"td",4),e(25),t(),e(26,` 5730 `),n(27,"td",67),e(28),t(),e(29,` 5731 `),n(30,"td",75),e(31,` 5732 `),v(32,Ap,4,0)(33,Op,4,0)(34,Np,4,0)(35,Bp,4,0)(36,Wp,4,0),e(37,` 5733 `),t(),e(38,` 5734 `),t(),e(39,` 5735 `)),a&2){let l,d=r.$implicit,s=u();i(4),f(` 5736 `,d.title,` 5737 `),i(2),p(d.where),i(5),m("status",s.kindStatus(d.kind))("text",s.kindLabel(d.kind)),i(5),y(d.a11y==="none"?16:17),i(5),y(d.origin==="introduced"?21:22),i(4),p(d.wrong),i(3),p(d.resolution),i(4),y((l=d.demo)==="scale"?32:l==="palette-copy"?33:l==="no-id"?34:l==="probe"?35:36)}}function Lp(a,r){a&1&&(e(0,` 5738 `),c(1,"app-pill",82),e(2,` 5739 `))}function qp(a,r){a&1&&(e(0,` 5740 `),c(1,"app-pill",83),e(2,` 5741 `))}function Vp(a,r){a&1&&(e(0,` 5742 `),c(1,"app-pill",84),e(2,` 5743 `))}function zp(a,r){if(a&1&&(e(0,` 5744 `),n(1,"tr"),e(2,` 5745 `),n(3,"td",67),e(4),t(),e(5,` 5746 `),n(6,"td",4),e(7),t(),e(8,` 5747 `),n(9,"td")(10,"code",67),e(11),t()(),e(12,` 5748 `),n(13,"td"),e(14,` 5749 `),v(15,Lp,3,0)(16,qp,3,0)(17,Vp,3,0),t(),e(18,` 5750 `),n(19,"td",4),e(20),t(),e(21,` 5751 `),t(),e(22,` 5752 `)),a&2){let l=r.$implicit;i(4),p(l.what),i(3),p(l.expected),i(4),p(l.actual),i(4),y(l.openBug?15:l.ok?16:17),i(5),p(l.why)}}function Up(a,r){a&1&&(e(0,` 5753 `),n(1,"tr"),e(2,` 5754 `),n(3,"td",85),e(4,` 5755 The editable control did not render. That is itself the open 5756 `),n(5,"code"),e(6,"playerID"),t(),e(7,` bug in \xA74 \u2014 check the sample above is 5757 not a blank gap. 5758 `),t(),e(8,` 5759 `),t(),e(9,` 5760 `))}function Hp(a,r){if(a&1&&(e(0,` 5761 `),n(1,"div"),e(2,` 5762 `),c(3,"app-pill",65),e(4,` 5763 `),n(5,"span",66),e(6),t(),e(7,` 5764 `),t(),e(8,` 5765 `)),a&2){let l=r.$implicit;i(3),m("status",l.status)("text",l.label),i(3),p(l.count)}}function jp(a,r){if(a&1&&(e(0,` 5766 `),n(1,"div"),e(2,` 5767 `),c(3,"app-pill",65),e(4,` 5768 `),n(5,"span",66),e(6),t(),e(7,` 5769 `),t(),e(8,` 5770 `)),a&2){let l=u().$implicit;i(3),m("status",l.status)("text",l.label),i(3),p(l.count)}}function Gp(a,r){if(a&1&&(e(0,` 5771 `),v(1,jp,9,3)),a&2){let l=r.$implicit;i(),y(l.reach!=="none"?1:-1)}}function $p(a,r){a&1&&(e(0,` 5772 `),n(1,"span",43),e(2,"\u2014"),t(),e(3,` 5773 `))}function Kp(a,r){if(a&1&&(e(0,` 5774 `),c(1,"app-pill",65),e(2,` 5775 `)),a&2){let l=u().$implicit,d=u();i(),m("status",d.reachStatus(l.a11y))("text",d.reachLabel(l.a11y))}}function Xp(a,r){a&1&&(e(0," "),n(1,"a",86),e(2,"below"),t(),e(3," "))}function Yp(a,r){a&1&&(e(0," "),n(1,"a",20),e(2,"below"),t(),e(3," "))}function Qp(a,r){a&1&&(e(0," "),n(1,"a",80),e(2,"\xA73 probe"),t(),e(3," "))}function Jp(a,r){a&1&&(e(0," "),n(1,"span",81),e(2,"\u2014"),t(),e(3," "))}function Zp(a,r){if(a&1&&(e(0,` 5776 `),n(1,"tr"),e(2,` 5777 `),n(3,"td",73),e(4),n(5,"span",74),e(6),t(),e(7,` 5778 `),t(),e(8,` 5779 `),n(9,"td"),e(10,` 5780 `),c(11,"app-pill",65),e(12,` 5781 `),t(),e(13,` 5782 `),n(14,"td"),e(15,` 5783 `),v(16,$p,4,0)(17,Kp,3,2),t(),e(18,` 5784 `),n(19,"td",4),e(20),t(),e(21,` 5785 `),n(22,"td",67),e(23),t(),e(24,` 5786 `),n(25,"td",75),e(26,` 5787 `),v(27,Xp,4,0)(28,Yp,4,0)(29,Qp,4,0)(30,Jp,4,0),e(31,` 5788 `),t(),e(32,` 5789 `),t(),e(33,` 5790 `)),a&2){let l,d=r.$implicit,s=u();i(4),f(` 5791 `,d.title,` 5792 `),i(2),p(d.where),i(5),m("status",s.kindStatus(d.kind))("text",s.kindLabel(d.kind)),i(5),y(d.a11y==="none"?16:17),i(4),p(d.wrong),i(3),p(d.resolution),i(4),y((l=d.demo)==="no-player-id"?27:l==="square"?28:l==="probe"?29:30)}}var vt={functional:{status:"error",label:"functional",means:"Something does not work \u2014 a throw, a control no keyboard can reach, an element that renders nothing.",verify:"Operate it. Looking at a screen will not find these."},visual:{status:"warning",label:"visual",means:"Pixels only. Wrong at worst looks wrong \u2014 a size, a fill, a radius, a fill that swallows its own initials.",verify:"Look at it."},copy:{status:"secondary",label:"copy",means:"Real text that says the wrong thing.",verify:"Read it."},hygiene:{status:"disabled",label:"hygiene",means:"No runtime effect in either direction \u2014 dead CSS, a duplicate DOM id nothing selects, a comment that lies.",verify:"grep. There is nothing to see."}},yt={only:{status:"error",label:"assistive only",means:"Nothing on screen changes either way. A mouse user could not tell the difference \u2014 the defect exists entirely in what gets announced or what a keyboard can reach.",verify:"A screen reader, or Tab. \xA73 reads the emitted attributes off a live component, which is as far as a probe gets."},affected:{status:"warning",label:"also assistive",means:"Visible or operable on screen, and carries an accessibility consequence on top \u2014 a duplicate id, an accessible name, a box that stops holding together when the root font size moves.",verify:"Whatever its kind asks for, plus the assistive path."}
5792,none:{status:"disabled",label:"none",means:"No accessibility dimension. Note that the initials themselves are decorative and aria-hidden, so a fill that swallows them is a look defect, not a contrast one.",verify:"Nothing extra."}},e0=(()=>{let r=class r{constructor(d,s){this.changeDetector=d,this.siteDataService=s,this.snapshotDate="2026-09-02",this.initialsCallSites=41,this.photoCallSites=42,this.sizes=[{name:"tiny",sizeInput:'size="tiny"',cssClass:".tiny-circle",box:"1.25rem",fontSize:"0.65rem",lineHeight:"1.25rem",uses:"1 \u2014 the message-pin sender"},{name:"small",sizeInput:'size="small"',cssClass:".small-circle",box:"2rem",fontSize:"0.65rem",lineHeight:"2rem",uses:"12"},{name:"default",sizeInput:'size="default"',cssClass:".default-circle",box:"2.5rem",fontSize:"0.875rem",lineHeight:"2.5rem",uses:"15 implicit + 2 explicit"},{name:"large",sizeInput:'size="large"',cssClass:".large-circle",box:"6.25rem",fontSize:"1.5rem",lineHeight:"6.25rem",uses:"11"},{name:"banner",sizeInput:'size="banner"',cssClass:".banner-circle",box:"7rem + 4px border",fontSize:"2.5rem",lineHeight:"7rem",uses:"1 \u2014 the player banner"}],this.kindOrder=["functional","visual","copy","hygiene"],this.kindLegend=this.kindOrder.map(o=>bt({kind:o},vt[o])),this.reachOrder=["only","affected","none"],this.reachLegend=this.reachOrder.map(o=>bt({reach:o},yt[o])),this.fixed=[{title:"Four sizes across three unit systems",kind:"visual",origin:"pre-existing",a11y:"affected",where:"player-profile-photo.scss",wrong:"The boxes were 20px, 2rem, 40px and 100px; the type inside them was 0.65rem, 0.65rem, 14px and 1.5rem. Half the scale tracked the root font size and half did not, so a box grew while its glyphs held still and the initials shrank into an emptier circle.",resolution:"The whole scale is rem, at the same rendered pixels for a 16px root. Probed above at two root sizes \u2014 both factors must read 1.50.",demo:"scale"},{title:"The fifth size existed only as a page override",kind:"visual",origin:"pre-existing",a11y:"none",where:"was player-banner.component.scss:17",wrong:"The banner avatar was a ::ng-deep block reaching into the component from a page stylesheet, because the component only offered four sizes.",resolution:"banner is a real size and the override is gone. p-skeleton reads the same scale through AVATAR_SIZE_BOX rather than hardcoding two pixel values, so the loading placeholder matches whichever size was asked for.",demo:"scale"},{title:"The palette existed twice, and the second copy got no foreground",kind:"visual",origin:"pre-existing",a11y:"none",where:"was message-avatar-group.component.scss:67-97",wrong:"The ten .userN fills were declared globally on span.user-initials and again privately on div.userN. Every global rule is element-qualified, so none of them reached the div \u2014 including the foreground, which fell through to the inherited --base-text. Dark text on the dark half of the palette, live in the staff-messaging header.",resolution:"The group renders app-user-initials for each slot and its thirty lines of .userN CSS are deleted, so it picks up the shared foreground automatically. Only the pie-slice geometry is still local, because that clipping is genuinely unique to it.",demo:"palette-copy"},{title:"The no-id avatar was invisible to everyone",kind:"visual",origin:"introduced",a11y:"none",where:"variables.scss \u2014 --user-avatar-none",wrong:"A user with no usable id got --grey-200, a near-white, under the shared translucent white foreground. Not low contrast \u2014 the initials were not there.",resolution:"--user-avatar-none is #D1D1D1, matched to the mobile client. Deliberately neutral rather than an eleventh person colour, and it takes --user-avatar-text-on-light rather than the shared white \u2014 dark type on that grey measures 9.42:1, where the white it replaced measured 1.41:1.",demo:"no-id"},{title:"The editable avatar was a click-only div",kind:"functional",origin:"pre-existing",a11y:"only",where:"player-profile-photo.component.html:35",wrong:"A div with a (click) handler \u2014 no role, no tabindex, no key handler \u2014 and a camera glyph drawn by a ::before with no text. Uploading, downloading and removing a profile photo was unreachable by keyboard and silent to a screen reader.",resolution:'A real <button type="button"> with an aria-label naming the action and the person. The p-menu it opens already handles its own keyboard once open.',demo:"probe"},{title:"Avatars read their initials out loud",kind:"functional",origin:"pre-existing",a11y:"only",
5792where:"user-initials.component.html \xB7 player-profile-photo.component.html",wrong:'Every avatar announced its two letters on top of whatever the host already said, and the photo divs carried an alt="" that was inert \u2014 alt is not a div attribute.',resolution:"The initials span and all three photo divs are aria-hidden. Avatars are decoration; every surface that shows one also shows the person's name in real text. A host that needs the person announced supplies that text itself.",demo:"probe"},{title:"A literal id was emitted once per editable avatar",kind:"hygiene",origin:"pre-existing",a11y:"affected",where:"player-profile-photo.component.html",wrong:'id="player-profile-image" was hardcoded inside a component that can appear more than once on a page, so two editable avatars produced duplicate ids.',resolution:"Dropped. Nothing selected it.",demo:"probe"},{title:"An unnamed avatar emitted a title containing one space",kind:"visual",origin:"pre-existing",a11y:"affected",where:"user-initials.component.html",wrong:'title="{{firstName}} {{lastName}}" interpolated both parts unconditionally, so an avatar with neither produced title=" " \u2014 a tooltip of nothing.',resolution:"The title is built from the parts that exist and bound as null when there are none, so the attribute is absent rather than empty.",demo:"probe"},{title:".no-bg was declared where it could not reach its callers",kind:"visual",origin:"pre-existing",a11y:"none",where:"was player-profile-photo.component.scss:11",wrong:"The class that strips the fill behind a transparent club logo lived in a component stylesheet, so emulated encapsulation scoped it to that component. Two other templates applied .no-bg to hand-rolled avatar divs and got nothing \u2014 those logos sat on a grey fill.",resolution:"Moved into the global partial beside .user-image, which it modifies. The !important went with it, since nothing needs to outrank now, and the editable branch gained the binding it was missing.",demo:"none"},{title:"An unguarded dereference after an optional chain",kind:"functional",origin:"pre-existing",a11y:"none",where:"message-avatar-group.component.html",wrong:"recipient?.clubUserID.toString() \u2014 the optional chain guards the recipient and then calls .toString() on the id regardless, which throws on a null id.",resolution:"Guarded when the group was converted to app-user-initials.",demo:"none"},{title:"The editable container lost its block formatting context",where:"player-profile-photo.component.scss",kind:"visual",origin:"introduced",a11y:"none",wrong:"Making the container a <button> handed it a UA-default inline-block, because .btn-a11y resets border, padding, margin, background and width but not display. Inside .player-profile-header the page rule centres the 100px box with margin: 0px auto, which computes to zero on an inline-block, and the box gained baseline descender space under it.",resolution:"display: block on the component's own .profile-image-container, restoring what the div had. Nothing else declares display on that element, so the rule cannot lose. Probed in \xA73.",demo:"probe"},{title:"Five override rules matched nothing",kind:"hygiene",origin:"pre-existing",a11y:"none",where:"templates.scss:421, :434, :476 \xB7 player-basic-info.component.scss:16 \xB7 player-profile-photo.component.scss:1",wrong:"A 70px avatar whose only call site passed a different size; an img rule for a class that only ever lands on a div; a .no-image circle no template asks for; a .player-profile-image-container that misspells the real class; and an icon rule whose <i> is commented out. Between them they carried a third foreground colour and a size for an element type that does not exist here.",resolution:"All five deleted. No rendered pixel moves.",demo:"none"}],this.open=[{title:"An editable avatar with no playerID renders nothing at all",kind:"functional",origin:"pre-existing",a11y:"none",where:"player-profile-photo.component.html:34",wrong:"The outer @if (player && !loading) passes, then @if (player && player.playerID) inside the editable branch drops the whole avatar. The @else skeleton belongs to the outer condition, so it does not fire either. A blank gap with no loading state and no fallback.",resolution:"The inner guard should gate the upload affordance, not the avatar. This is the only open bug that is visible on screen today \u2014 demoed beside this table.",demo:"no-player-id"},{title:"Square is 4px on the component and square-cornered in a roster card",kind:"visual",origin:"pre-existing",a11y:"none",where:"player-profile-photo.scss vs templates.scss:444",wrong:'[showCircle]="false" sets border-radius: 4px, and a .player-profile-header page rule resets it to unset. The same input produces two different shapes depen
5792ding on where the avatar is mounted.',resolution:"Pick one. Neither is obviously right, which is why it is here rather than fixed.",demo:"square"},{title:"Lazy loading guards on a different id than the loader resolves",kind:"functional",origin:"pre-existing",a11y:"none",where:"player-profile-photo.component.ts",wrong:'setupLazyLoading tests this.player?.userID. loadPhoto resolves player?.user?.userID || player?.userID || this.userID. A player carrying only user.userID with [lazy]="true" gets no observer and no eager load, so loading stays true and the skeleton never resolves.',resolution:"Resolve the id once, in a getter both paths read. Latent rather than live \u2014 all three current lazy call sites pass player.userID.",demo:"none"},{title:"playerNumber is computed, passed by ten call sites, and rendered nowhere",kind:"hygiene",origin:"pre-existing",a11y:"none",where:"both components \xB7 10 templates",wrong:"Both components seed playerNumber with a random 1-6 in ngOnInit and the shared template never reads it. Ten call sites compute (i + 1).toString() to feed it.",resolution:"Delete the input and the ten bindings. The probe below passes a value and confirms nothing in the rendered DOM carries it.",demo:"probe"},{title:"Two of the three photo-loading branches ignore clubImageUrl",kind:"functional",origin:"pre-existing",a11y:"none",where:"player-profile-photo.component.ts loadPhoto()",wrong:"Only the individual-access branch sets isClubLogo and falls back to the club logo. The teamID and registrationID branches never do, even when clubImageUrl is bound, so the same person shows initials on a team roster and a club logo elsewhere.",resolution:"Lift the fallback out of the one branch. The CSS half of this is fixed \u2014 the editable branch now binds .no-bg \u2014 but the loader asymmetry is not.",demo:"none"},{title:'The tryout cropper is titled "Player Photo Preview"',kind:"copy",origin:"pre-existing",a11y:"affected",where:"player-profile-photo.component.html",wrong:`One template serves both components and the cropper dialog header is a literal. The tryout flow's own menu labels say "Tryout Photo", so the two disagree inside one flow.`,resolution:"Make the header an input with the player wording as its default.",demo:"none"},{title:".icon-badge-camera declares no positioning context of its own",kind:"visual",origin:"pre-existing",a11y:"none",where:"modifiers.scss:2864",wrong:"The camera badge is absolutely positioned and relies on whichever container it lands in being positioned. It works because two separate rules happen to supply position: relative \u2014 one in the component stylesheet, one scoped to a .player-profile-header page selector.",resolution:"Give the badge its own context. Held back because the same badge class is used by the team-banner logo control, which is also a click-handling div with no keyboard path \u2014 a separate component and a separate change.",demo:"none"},{title:"A comment points at a mixin that does not exist",kind:"hygiene",origin:"pre-existing",a11y:"none",where:"modifiers.scss:2863",wrong:'"Uses the icon-badge mixin from variables.scss." There is no icon-badge mixin in variables.scss.',resolution:"Delete the sentence.",demo:"none"}],this.samplePlayer={playerID:1,userID:7},this.playerWithoutId={userID:7},this.scaleProbe=[],this.probes=[],this.paletteCopy=[],this.noId=[]}ngOnInit(){this.siteDataService.hideSiteLoader()}ngAfterViewInit(){this.remeasure()}remeasure(){this.scaleProbe=this.probeScale();let d=this.measurePairings();this.paletteCopy=d.filter(s=>s.label?.startsWith("group")),this.noId=d.filter(s=>s.label?.startsWith("no-id")),this.probes=this.probeLiveComponent(),this.changeDetector.detectChanges()}probeScale(){let d=document.documentElement,s=d.style.fontSize;d.style.fontSize="16px";let o=this.readScale();d.style.fontSize="24px";let x=this.readScale();return d.style.fontSize=s,this.sizes.map((h,_)=>{let se=o[_]?.box?x[_].box/o[_].box:0,qe=o[_]?.glyph?x[_].glyph/o[_].glyph:0;return{name:h.name,box16:o[_]?.box,box24:x[_]?.box,glyph16:o[_]?.glyph,glyph24:x[_]?.glyph,boxFactor:se,glyphFactor:qe,holds:!!se&&Math.abs(se-qe)<.02}})}readScale(){return(this.scaleSamples?.toArray()||[]).map(d=>{let s=d.nativeElement.querySelector(".user-initials")||d.nativeElement,o=getComputedStyle(s);return{box:this.declaredWidth(o),glyph:parseFloat(o.fontSize)}})}declaredWidth(d){let s=parseFloat(d.width);return d.boxSizing!=="border-box"?s:s+parseFloat(d.borderLeftWidth)+parseFloat(d.borderRightWidth)+parseFloat(d.paddingLeft)+parseFloat(d.paddingRight)}measurePairings(){return(this.pairingSamples?.toArray()||[]).map(d=>{let s=d.nativeElement,o=getComputedStyle(s.querySelector(".user-initials")||s),x=Xi(o.backgroundColor),h=Xi(o.color);return{label:s.dataset.label,fill:Qi(x),text:o.color,flattened:Qi(Yi(h,x)),ratio:Jl(h,x)}})}probeLiveComponent(){let s=this.editableSample?.nativeElement?.querySelector(".profile-image-container.editable");if(!s)return[];let o=getComputedStyle(s),x=getComputedStyle(s,"::before"),h=s.getAttribute("aria-label"),_=s.querySelector(".user-initials"),se=this.namelessSample?.nativeElement?.querySelector(".user-initials");return[{what:"the control is a button",expected:"BUTTON",actual:s.tagName,ok:s.tagName==="BUTTON",why:"A div with a click handler is not focusable and claims nothing. This is the fix for the click-only div."},{what:"type",expected:"button",actual:s.getAttribute("type")||"absent",ok:s.getAttribute("type")==="button",why:"Without it a button inside a form submits it, and the photo control sits inside player edit forms."},{what:"the control has a name",expected:"an aria-label",actual:h||"absent",ok:!!h,why:"The only text in the control is a ::before glyph, which no screen reader announces. Comes from editPhotoLabel, shared with the tryout component."},{what:"keyboard reachable",expected:"tabindex 0",actual:`${s.tabIndex}`,ok:s.tabIndex===0,why:"Native on a button. Upload, download and remove had no keyboard path at all before."},{what:"the avatar is decoration",expected:'aria-hidden="true"',actual:_?.getAttribute("aria-hidden")||"absent",ok:_?.getAttribute("aria-hidden")==="true",why:"Without it the avatar reads
5792its two letters out on top of the name the host already shows."},{what:"hiding it is safe",expected:"hidden avatar inside a named button",actual:h&&_?.getAttribute("aria-hidden")==="true"?"both hold":"one is missing",ok:!!h&&_?.getAttribute("aria-hidden")==="true",why:"The pair is load-bearing: hide the avatar without labelling the button and the control becomes nameless."},{what:"no hardcoded id",expected:"0 in the document",actual:`${document.querySelectorAll("#player-profile-image").length}`,ok:document.querySelectorAll("#player-profile-image").length===0,why:"The literal id used to be emitted once per editable avatar, so two on a page collided."},{what:"no title on an unnamed avatar",expected:"absent",actual:se?.hasAttribute("title")?`"${se.getAttribute("title")}"`:"absent",ok:!!se&&!se.hasAttribute("title"),why:"It used to interpolate both name parts unconditionally and emit a title of one space."},{what:"playerNumber reaches the DOM",expected:"no \u2014 the input is dead",actual:s.textContent?.includes("7")?"it renders":"nowhere",ok:!s.textContent?.includes("7"),why:'This sample passes playerNumber="7". Nothing renders it, which is the open bug: ten call sites compute a value the template never reads.',openBug:!0},{what:"the control still formats as a block",expected:"block",actual:o.display,ok:o.display==="block",why:"A <button> defaults to inline-block and .btn-a11y resets everything except display. Inline-block would zero the auto margins the .player-profile-header rule centres the box with, and sit it on a baseline."},{what:"the camera badge has a context",expected:"container relative, ::before absolute",actual:`${o.position}, ${x.position}`,ok:o.position==="relative"&&x.position==="absolute",why:"The badge declares no context of its own \u2014 an open bug. It works here because the component stylesheet supplies one; static would drop the glyph out of the corner.",openBug:!0}]}get scaleHolds(){return this.scaleProbe.filter(d=>d.holds).length}get probesPassing(){return this.probes.filter(d=>d.ok&&!d.openBug).length}get probesAsserted(){return this.probes.filter(d=>!d.openBug).length}get demoedFixed(){return this.fixed.filter(d=>d.demo!=="none").length}get demoedOpen(){return this.open.filter(d=>d.demo!=="none").length}get introduced(){return[...this.fixed,...this.open].filter(d=>d.origin==="introduced")}get preExisting(){return[...this.fixed,...this.open].filter(d=>d.origin==="pre-existing").length}reachStatus(d){return yt[d].status}reachLabel(d){return yt[d].label}reachTally(d){return this.reachOrder.map(s=>({reach:s,label:yt[s].label,status:yt[s].status,count:d.filter(o=>o.a11y===s).length})).filter(s=>s.count>0)}get allReachTally(){return this.reachTally([...this.fixed,...this.open])}countFixedReach(d){return this.fixed.filter(s=>s.a11y===d).length}countOpenReach(d){return this.open.filter(s=>s.a11y===d).length}countFixed(d){return this.fixed.filter(s=>s.kind===d).length}countOpen(d){return this.open.filter(s=>s.kind===d).length}kindStatus(d){return vt[d].status}kindLabel(d){return vt[d].label}tally(d){return this.kindOrder.map(s=>({kind:s,label:vt[s].label,status:vt[s].status,count:d.filter(o=>o.kind===s).length})).filter(s=>s.count>0)}get fixedTally(){return this.tally(this.fixed)}get openTally(){return this.tally(this.open)}get allTally(){return this.tally([...this.fixed,...this.open])}cannotBeSeen(d){return d.kind==="functional"||d.a11y==="only"}get needsOperating(){return[...this.fixed,...this.open].filter(d=>this.cannotBeSeen(d)).length}get fixedNeedsOperating(){return this.fixed.filter(d=>this.cannotBeSeen(d)).length}};r.\u0275fac=function(s){return new(s||r)(A(Ke),A(R))},r.\u0275cmp=b({type:r,selectors:[["app-avatars"]],viewQuery:function(s,o){if(s&1&&$e(cp,5,Ce)(pp,5,Ce)(xp,5,Ce)(hp,5,Ce),s&2){let x;xe(x=he())&&(o.editableSample=x.first),xe(x=he())&&(o.namelessSample=x.first),xe(x=he())&&(o.scaleSamples=x),xe(x=he())&&(o.pairingSamples=x)}},standalone:!1,decls:840,vars:51,consts:[["pairingSample",""],["editableSample",""],["namelessSample",""],["scaleSample",""],[1,"text-small","text-grey"],[3,"routerLink"],["type","button",1,"btn","btn-naked","btn-sm",3,"click"],["id","kinds",1,"card"],["side","shared"],[1,"text-small","fw-800","mb-1"],[1,"d-flex","flex-wrap","align-items-center","gap-3","mb-2"],[1,"overflow-x-auto","mb-4"],[1,"table","table-bordered","sg-doc-table"],[2,"width","9rem"],[2,"width","22rem"],[2,"width","5rem"],[1,"text-small","text-grey","mb-4"],["id","scale",1,"card"],[1,"d-flex","flex-wrap","align-items-end","gap-3","mb-3"],[1,"text-smallest","text-grey","mb-1"],["href","#square"],[1,"overflow-x-auto"],[1,"table","table-bordered","table-hover","sg-doc-table"],[2,"width","8rem"],[2,"width","7rem"],[1,"text-medium-large","mt-4"],[2,"width","11rem"],["id","fixed",1,"card"],["href","#kinds",1,"text-smallest"],[2,"width","17rem"],["id","palette-copy",1,"text-medium-large","mt-4"],[1,"row"],[1,"col-md-6","mb-3"],[1,"text-smallest","text-grey"],[1,"d-flex","flex-wrap","align-items-center","gap-3"],[1,"text-center"],["data-label","group-broken",1,"user-initials","default-circle",2,"background","var(--user-avatar-6)","color","var(--base-text)"],[1,"text-smallest","line-height-3","mt-1"],[1,"text-red"],[1,"text-grey-lt","d-block"],["data-label","group-fixed","firstName","Ada","lastName","Byron",3,"id"],["data-label","no-id-broken",1,"user-initials","default-circle",2,"background","var(--grey-200)","color","var(--user-avatar-text)"],["data-label","no-id-fixed","firstName","Ada","lastName","Byron",3,"id"],[1,"text-smallest","text-grey-lt"],["id","probe",1,"card"],[1,"d-flex","flex-wrap","align-items-start","gap-3","mb-3"],["firstName","Ada","lastName","Byron","size","large","playerNumber","7",3,"player","editable"],[1,"text-smallest","text-grey-lt","line-height-3","mt-1"],[1,"player-profile-header","text-center"],["firstName","Ada","lastName","Byron","size","large",3,"player","editable"],[3,"id"],[1,"text-smallest","text-grey-lt",2,"max-width","18rem"],[2,"width","13rem"],[2,"width","12rem"],[2,"width","14rem"],["id","open",1,"card"],[1,"row","mt-4"],["id","no-player-id",1,"col-md-6","mb-3"],[1,"d-flex","flex-wrap","align-items-start","gap-3"],["firstName","Ada","lastName","Byron","size","default",3,"player","editable"],[1,"sg-slot-outline","d-inline-block",2,"min-width","2.5rem","min-height","2.5rem"],[1,"text-smallest","text-red","line-height-3","mt-1"],["
5792id","square",1,"col-md-6","mb-3"],["firstName","Ada","lastName","Byron",3,"id","showCircle"],[1,"profile-image-container"],["variant","tag",3,"status","text"],[1,"text-small","fw-800","ms-1"],[1,"text-small"],["firstName","Ada","lastName","Byron",3,"id","size"],["firstName","Ada","lastName","Byron",3,"id","size","showCircle"],[1,"text-smallest","text-grey-lt","d-block"],["variant","tag","status","success","text","holds"],["variant","tag","status","error","text","split"],[1,"text-small","fw-800"],[1,"text-smallest","text-grey-lt","d-block","fw-400"],[1,"text-smallest"],[1,"text-red","fw-800"],[1,"text-grey"],["href","#scale"],["href","#palette-copy"],["href","#probe"],[1,"text-grey-lt"],["variant","tag","status","warning","text","open bug"],["variant","tag","status","success","text","pass"],["variant","tag","status","error","text","fail"],["colspan","5",1,"text-small","text-red"],["href","#no-player-id"]],template:function(s,o){s&1&&(n(0,"h2"),e(1,"Avatars"),t(),e(2,` 5793`),n(3,"p",4),e(4,` 5794 Every circle in the app that stands in for a person \u2014 the initials bubble, the profile 5795 photo, the club-logo fallback and the editable upload target. Two components render them: 5796 `),n(5,"code"),e(6,"<app-user-initials>"),t(),e(7),n(8,"code"),e(9,"id"),t(),e(10,`; 5797 `),n(11,"code"),e(12,"<app-player-profile-photo>"),t(),e(13),n(14,"code"),e(15,"<app-player-tryout-photo>"),t(),e(16,` shares its template with a different service. 5798`),t(),e(17,` 5799`),n(18,"p",4),e(19,` 5800 Neither component declares what an avatar looks like. The size scale, the circle and the 5801 fill/foreground pairing all live in the global 5802 `),n(20,"code"),e(21,"3_modules/components/player-profile-photo.scss"),t(),e(22,`, which arrives through 5803 `),n(23,"code"),e(24,"styles.scss"),t(),e(25,` \u2014 which is why a component-scoped rule cannot override it without 5804 `),n(26,"code"),e(27,"::ng-deep"),t(),e(28,`. The fill tokens are documented on 5805 `),n(29,"a",5),e(30,"color"),t(),e(31,` \xA79. 5806`),t(),e(32,` 5807`),n(33,"p",4),e(34,` 5808 `),n(35,"strong"),e(36,"Avatars are decorative."),t(),e(37,` The initials span and all three photo divs are 5809 `),n(38,"code"),e(39,"aria-hidden"),t(),e(40,`: every surface that shows an avatar also shows the person's name in 5810 real text beside it, and a host that needs the person announced supplies that text itself. 5811`),t(),e(41,` 5812`),n(42,"p",4),e(43,` 5813 Counts are a grep of `),n(44,"code"),e(45,"ClientApp/src"),t(),e(46," taken "),n(47,"strong"),e(48),t(),e(49,` with 5814 the styleguide excluded. `),n(50,"strong"),e(51,"Every number below is measured, not typed"),t(),e(52,` \u2014 the 5815 scale is probed at two root font sizes, the pairings are read off the rendered samples, and the 5816 probe table is read off a real mounted component. 5817 `),n(53,"button",6),g("click",function(){return o.remeasure()}),e(54,"Re-measure"),t(),e(55,` 5818`),t(),e(56,` 5819 5820`),n(57,"div",7),e(58,` 5821 `),n(59,"h3"),e(60,"The findings, on three axes"),t(),e(61,` 5822 `),n(62,"app-sg-caption",8),e(63),t(),e(64,` 5823 `),n(65,"p",4),e(66,` 5824 \xA72 and \xA74 carry these as columns. They classify the `),n(67,"em"),e(68,"defect"),t(),e(69,`, not whether it 5825 is fixed. `),n(70,"strong"),e(71,"Kind"),t(),e(72," is what sort of thing is wrong, "),n(73,"strong"),e(74,"accessibility"),t(),e(75,` 5826 is a separate question from it \u2014 a finding can be a plain visual defect that also 5827 breaks under a larger root font size, or carry no visible symptom at all \u2014 and 5828 `),n(76,"strong"),e(77,"origin"),t(),e(78,` says whether the defect predates this change. A pixel and a dead 5829 control are not the same risk, and neither is a pixel and a control no keyboard can reach. 5830 `),t(),e(79,` 5831 5832 `),n(80,"p",9),e(81,"Axis 1 \u2014 kind: what sort of thing is wrong"),t(),e(82,` 5833 `),n(83,"div",10),e(84,` 5834 `),S(85,gp,9,3,null,null,Xn),t(),e(87,` 5835 `),n(88,"div",11),e(89,` 5836 `),n(90,"table",12),e(91,` 5837 `),n(92,"thead"),e(93,` 5838 `),n(94,"tr"),e(95,` 5839 `),n(96,"th",13),e(97,"Kind"),t(),e(98,` 5840 `),n(99,"th"),e(100,"What it means"),t(),e(101,` 5841 `),n(102,"th",14),e(103,"How it has to be verified"),t(),e(104,` 5842 `),n(105,"th",15),e(106,"Fixed"),t(),e(107,` 5843 `),n(108,"th",15),e(109,"Open"),t(),e(110,` 5844 `),t(),e(111,` 5845 `),t(),e(112,` 5846 `),n(113,"tbody"),e(114,` 5847 `),S(115,fp,19,6,null,null,Xn),t(),e(117,` 5848 `),t(),e(118,` 5849 `),t(),e(119,` 5850 5851 `),n(120,"p",9),e(121,"Axis 2 \u2014 accessibility: independent of kind"),t(),e(122,` 5852 `),n(123,"div",10),e(124,` 5853 `),S(125,bp,9,3,null,null,Yn),t(),e(127,` 5854 `),n(128,"div",11),e(129,` 5855 `),n(130,"table",12),e(131,` 5856 `),n(132,"thead"),e(133,` 5857 `),n(134,"tr"),e(135,` 5858 `),n(136,"th",13),e(137,"Accessibility"),t(),e(138,` 5859 `),n(139,"th"),e(140,"What it means"),t(),e(141,` 5860 `),n(142,"th",14),e(143,"What it adds to the check"),t(),e(144,` 5861 `),n(145,"th",15),e(146,"Fixed"),t(),e(147,` 5862 `),n(148,"th",15),e(149,"Open"),t(),e(150,` 5863 `),t(),e(151,` 5864 `),t(),e(152,` 5865 `),n(153,"tbody"),e(154,` 5866 `),S(155,Sp,19,6,null,null,Yn),t(),e(157,` 5867 `),t(),e(158,` 5868 `),t(),e(159,` 5869 5870 `),n(160,"p",9),e(161,"Axis 3 \u2014 origin: whose bug it is"),t(),e(162,` 5871 `),n(163,"p",16),e(164,` 5872 `),n(165,"strong"),e(166),t(),e(167),n(168,"em"),e(169,"introduced"),t(),e(170,` in \xA72, and neither ships: the shared translucent 5873 foreground made the near-white no-id fill invisible, and the `),n(171,"code"),e(172,"<button>"),t(),e(173,` 5874 swap dropped a formatting context. Every one of the eight still open in \xA74 is 5875 inherited. 5876 `),t(),e(174,` 5877 `),n(175,"p",4),e(176,` 5878 Reading the axes together: `),n(177,"strong"),e(178),t(),e(179,` \u2014 everything 5879 `),n(180,"em"),e(181,"functional"),t(),e(182," on axis 1, plus everything "),n(183,"em"),e(184,"assistive only"),t(),e(185,` on axis 2. Those are 5880 the editable avatar's keyboard path, the `),n(186,"code"),e(187,"aria-hidden"),t(),e(188,` pass (both of which are 5881 assistive-only `),n(189,"em"),e(190,"and"),t(),e(191,` functional), and the null-id dereference in the staff-messaging 5882 cluster, which needs a recipient with no `),n(192,"code"),e(193,"clubUserID"),t(),e(194,` to exercise. The 5883 `),n(195,"em"),e(196,"also assistive"),t(),e(197,` rows are not in that count: each is visible or operable on screen 5884 and simply carries a second consequence \u2014 a duplicate DOM id, an accessible name, a 5885 box that stops holding together when the root font size moves. Everything else that shipped 5886 is pixels or dead code. 5887 `),t(),e(198,` 5888`),t(),e(199,` 5889 5890`),n(200,"div",17),e(201,` 5891 `),n(202,"h3"),e(203,"1. The scale"),t(),e(204,` 5892 `),n(205,"app-sg-caption",8),e(206,"player-profile-photo.scss \u2014 .tiny-circle / .small-circle / .default-circle / .large-circle / .banner-circle"),t(),e(207,` 5893 `),n(208,"p",4),e(209,` 5894 Five sizes, one unit. Every sample is a live `),n(210,"code"),e(211,"<app-user-initials>"),t(),e(212,`. The 5895 photo component takes the same `),n(213,"code"),e(214,"size"),t(),e(215,` input; it also still accepts the older 5896 `),n(216,"code"),e(217,"largeCircle"),t(),e(218," boolean, which decides only when "),n(219,"code"),e(220,"size"),t(),e(221,` is unset, so the 5897 forty existing callers are unaffected. 5898 `),t(),e(222,` 5899 `),n(223,"p",9),e(224,"Circle \u2014 "),n(225,"code"),e(226,'[showCircle]="true"'),t(),e(227,", the default"),t(),e(228,` 5900 `),n(229,"div",18),e(230,` 5901 `),S(231,Ep,10,3,null,null,Qn),t(),e(233,` 5902 `),n(234,"p",9),e(235,"Square \u2014 "),n(236,"code"),e(237,'[showCircle]="false"'),t()(),e(238,` 5903 `),n(239,"p",19),e(240,` 5904 Same boxes, same glyphs; `),n(241,"code"),e(242,".square"),t(),e(243,` changes only 5905 `),n(244,"code"),e(245,"border-radius"),t(),e(246," to "),n(247,"code"),e(248,"4px"),t(),e(249,`. One page rule resets that to 5906 `),n(250,"code"),e(251,"unset"),t(),e(252," \u2014 demoed in "),n(253,"a",20),e(254,"\xA74"),t(),e(255,`. 5907 `),t(),e(256,` 5908 `),n(257,"div",18),e(258,` 5909 `),S(259,vp,9,4,null,null,Qn),t(),e(261,` 5910 `),n(262,"div",21),e(263,` 5911 `),n(264,"table",22),e(265,` 5912 `),n(266,"thead"),e(267,` 5913 `),n(268,"tr"),e(269,` 5914 `),n(270,"th",13),e(271,"Input"),t(),e(272,` 5915 `),n(273,"th",13),e(274,"Class"),t(),e(275,` 5916 `),n(276,"th",23),e(277,"Box"),t(),e(278,` 5917 `),n(279,"th",24),e(280,"Font"),t(),e(281,` 5918 `),n(282,"th",24),e(283,"Line height"),t(),e(284,` 5919 `),n(285,"th"),e(286,"Call sites"),t(),e(287,` 5920 `),t(),e(288,` 5921 `),t(),e(289,` 5922 `),n(290,"tbody"),e(291,` 5923 `),S(292,yp,27,6,null,null,Qn),t(),e(294,` 5924 `),t(),e(295,` 5925 `),t(),e(296,` 5926 5927 `),n(297,"h4",25),e(298,"The unit invariant, probed"),t(),e(299,` 5928 `),n(300,"p",4),e(301,` 5929 A box and the glyphs inside it must share a unit, or the box scales with the reader's font
5930 size and the glyphs do not. Each size is measured twice \u2014 at a 16px root and again at 5931 24px, with the root restored before the numbers are read out, so the page never visibly 5932 resizes. `),n(302,"strong"),e(303,"Both factors must be 1.50."),t(),e(304,` 5933 `),t(),e(305,` 5934 `),n(306,"div",21),e(307,` 5935 `),n(308,"table",22),e(309,` 5936 `),n(310,"thead"),e(311,` 5937 `),n(312,"tr"),e(313,` 5938 `),n(314,"th",24),e(315,"Size"),t(),e(316,` 5939 `),n(317,"th",26),e(318,"Box \u2014 16px root"),t(),e(319,` 5940 `),n(320,"th",26),e(321,"Box \u2014 24px root"),t(),e(322,` 5941 `),n(323,"th",26),e(324,"Glyphs \u2014 16px root"),t(),e(325,` 5942 `),n(326,"th",26),e(327,"Glyphs \u2014 24px root"),t(),e(328,` 5943 `),n(329,"th"),e(330,"Both scale alike"),t(),e(331,` 5944 `),t(),e(332,` 5945 `),t(),e(333,` 5946 `),n(334,"tbody"),e(335,` 5947 `),S(336,_p,37,26,null,null,Qn),t(),e(338,` 5948 `),t(),e(339,` 5949 `),t(),e(340,` 5950 `),n(341,"p",4),e(342,` 5951 `),n(343,"strong"),e(344),t(),e(345,` sizes keep their proportions. 5952 The measurement is normalised to the width the stylesheet asked for: the app is border-box, 5953 so `),n(346,"code"),e(347,"getComputedStyle"),t(),e(348,` reports the content box, which is 8px short on 5954 `),n(349,"code"),e(350,"banner"),t(),e(351,` \u2014 the only size with a border, and deliberately a fixed 5955 `),n(352,"code"),e(353,"4px"),t(),e(354,` rather than a rem. Left unnormalised that fixed border reads as a broken 5956 unit ratio, which it is not. 5957 `),t(),e(355,` 5958`),t(),e(356,` 5959 5960`),n(357,"div",27),e(358,` 5961 `),n(359,"h3"),e(360,"2. Bugs fixed"),t(),e(361,` 5962 `),n(362,"app-sg-caption",8),e(363),t(),e(364,` 5963 `),n(365,"div",10),e(366,` 5964 `),S(367,kp,9,3,null,null,Xn),S(369,Ip,2,1,null,null,Yn),n(371,"a",28),e(372,"what these mean"),t(),e(373,` 5965 `),t(),e(374,` 5966 `),n(375,"p",4),e(376,` 5967 None of these is visible by eye \u2014 they are units, specificity, DOM attributes and one 5968 dereference. So the ones that can be shown are shown: the scale is probed in \xA71, the two 5969 colour findings are rendered broken beside fixed below, and the rest are read off a live 5970 component in \xA73. 5971 `),t(),e(377,` 5972 `),n(378,"div",21),e(379,` 5973 `),n(380,"table",12),e(381,` 5974 `),n(382,"thead"),e(383,` 5975 `),n(384,"tr"),e(385,` 5976 `),n(386,"th",29),e(387,"Bug"),t(),e(388,` 5977 `),n(389,"th",23),e(390,"Kind"),t(),e(391,` 5978 `),n(392,"th",23),e(393,"Accessibility"),t(),e(394,` 5979 `),n(395,"th",24),e(396,"Origin"),t(),e(397,` 5980 `),n(398,"th"),e(399,"What was wrong"),t(),e(400,` 5981 `),n(401,"th"),e(402,"What it is now"),t(),e(403,` 5982 `),n(404,"th",24),e(405,"Demo"),t(),e(406,` 5983 `),t(),e(407,` 5984 `),t(),e(408,` 5985 `),n(409,"tbody"),e(410,` 5986 `),S(411,Rp,40,9,null,null,Zl),t(),e(413,`
5987 `),t(),e(414,` 5988 `),t(),e(415,` 5989 5990 `),n(416,"h4",30),e(417,"The two colour findings, rendered"),t(),e(418,` 5991 `),n(419,"p",4),e(420,` 5992 Both are cases of initials that were not merely low-contrast but absent. Each pair below is 5993 the broken pairing reconstructed inline beside the shipping one, and every ratio is read off 5994 the rendered element with `),n(421,"code"),e(422,"getComputedStyle"),t(),e(423,`. 5995 `),t(),e(424,` 5996 `),n(425,"div",31),e(426,` 5997 `),n(427,"div",32),e(428,` 5998 `),n(429,"p",9),e(430,"The second copy of the palette"),t(),e(431,` 5999 `),n(432,"p",33),e(433,` 6000 A `),n(434,"code"),e(435,"div.userN"),t(),e(436,` got the fill and no foreground, so it inherited 6001 `),n(437,"code"),e(438,"--base-text"),t(),e(439,` \u2014 dark text on the dark half of the palette. The 6002 fixed one is a real `),n(440,"code"),e(441,"<app-user-initials>"),t(),e(442,`, which reaches the global 6003 rule because that rule is written `),n(443,"code"),e(444,"span.user-initials"),t(),e(445,`. 6004 `),t(),e(446,` 6005 `),n(447,"div",34),e(448,` 6006 `),n(449,"div",35),e(450,` 6007 `),n(451,"div",36,0),e(453,"AB"),t(),e(454,` 6008 `),n(455,"div",37),e(456,` 6009 `),n(457,"span",38),e(458),L(459,"number"),t(),e(460,` 6010 `),n(461,"span",39),e(462,"was: div.userN"),t(),e(463,` 6011 `),t(),e(464,` 6012 `),t(),e(465,` 6013 `),n(466,"div",35),e(467,` 6014 `),c(468,"app-user-initials",40,0),e(470,` 6015 `),n(471,"div",37),e(472,` 6016 `),n(473,"span"),e(474),L(475,"number"),t(),e(476,` 6017 `),n(477,"span",39),e(478,"now: app-user-initials"),t(),e(479,` 6018 `),t(),e(480,` 6019 `),t(),e(481,` 6020 `),t(),e(482,` 6021 `),t(),e(483,` 6022 `),n(484,"div",32),e(485,` 6023 `),n(486,"p",9),e(487,"The no-id avatar"),t(),e(488,` 6024 `),n(489,"p",33),e(490,` 6025 A user with no usable id fell through to `),n(491,"code"),e(492,"--grey-200"),t(),e(493,`, a near-white, under 6026 the shared translucent white. `),n(494,"code"),e(495,"--user-avatar-none"),t(),e(496," is "),n(497,"code"),e(498,"#D1D1D1"),t(),e(499,` 6027 now \u2014 neutral so it does not read as an eleventh person colour, and paired with 6028 `),n(500,"code"),e(501,"--user-avatar-text-on-light"),t(),e(502,` rather than the shared white, because white 6029 on a light grey is the failure being fixed. Matched to the mobile client, which 6030 renders the same grey. 6031 `),t(),e(503,` 6032 `),n(504,"div",34),e(505,` 6033 `),n(506,"div",35),e(507,` 6034 `),n(508,"div",41,0),e(510,"AB"),t(),e(511,` 6035 `),n(512,"div",37),e(513,` 6036 `),n(514,"span",38),e(515),L(516,"number"),t(),e(517,` 6037 `),n(518,"span",39),e(519,"was: --grey-200"),t(),e(520,` 6038 `),t(),e(521,` 6039 `),t(),e(522,` 6040 `),n(523,"div",35),e(524,` 6041 `),c(525,"app-user-initials",42,0),e(527,` 6042 `),n(528,"div",37),e(529,` 6043 `),n(530,"span"),e(531),L(532,"number"),t(),e(533,` 6044 `),n(534,"span",39),e(535,"now: --user-avatar-none"),t(),e(536,` 6045 `),t(),e(537,` 6046 `),t(),e(538,` 6047 `),t(),e(539,` 6048 `),t(),e(540,` 6049 `),t(),e(541,` 6050 `),n(542,"p",43),e(543,` 6051 The left-hand sample in each pair carries the shipping fill and the broken foreground 6052 inline; the classes and the global CSS underneath are otherwise the real ones. 6053 `),n(544,"strong"),e(545,"Neither number on the right is a pass mark"),t(),e(546,` \u2014 contrast on decorative 6054 text has no threshold to clear, and the right-hand pairing is not trying to reach one. The 6055 comparison is `),n(547,"em"),e(548,"invisible"),t(),e(549," against "),n(550,"em"),e(551,"visible"),t(),e(552,`: what made these two bugs is that 6056 the initials could not be seen at all, which no exemption covers. 6057 `),t(),e(553,` 6058`),t(),e(554,` 6059 6060`),n(555,"div",44),e(556,` 6061 `),n(557,"h3"),e(558,"3. Probed off a live component"),t(),e(559,` 6062 `),n(560,"app-sg-caption",8),e(561,"a real app-player-profile-photo, mounted on this page"),t(),e(562,` 6063 `),n(563,"p",4),e(564,` 6064 The avatar below is a real 6065 `),n(565,"code"),e(566,'<app-player-profile-photo [editable]="true">'),t(),e(567,`, not a replica of its 6066 markup, and every row is read off it with `),n(568,"code"),e(569,"getComputedStyle"),t(),e(570,` and 6067 `),n(571,"code"),e(572,"getAttribute"),t(),e(573,". "),n(574,"strong"),e(575,"Revert any of these and a row turns red."),t(),e(576,` It is 6068 safe to mount because `),n(577,"code"),e(578,"initialsOnly"),t(),e(579,` is the default, which short-circuits 6069 `),n(580,"code"),e(581,"loadPhoto()"),t(),e(582,` before it makes a request \u2014 that is also why the sample shows 6070 initials rather than a photograph. 6071 `),t(),e(583,` 6072 `),n(584,"div",45),e(585,` 6073 `),n(586,"div",35),e(587,` 6074 `),n(588,"div",null,1),e(590,` 6075 `),c(591,"app-player-profile-photo",46),e(592,` 6076 `),t(),e(593,` 6077 `),n(594,"div",47),e(595,"the component alone"),t(),e(596,` 6078 `),t(),e(597,` 6079 `),n(598,"div",48),e(599,` 6080 `),c(600,"app-player-profile-photo",49),e(601,` 6081 `),n(602,"div",47),e(603,` 6082 inside `),n(604,"code"),e(605,".player-profile-header"),t(),e(606,` 6083 `),t(),e(607,` 6084 `),t(),e(608,` 6085 `),n(609,"div",35),e(610,` 6086 `),n(611,"span",null,2),e(613,` 6087 `),c(614,"app-user-initials",50),e(615,` 6088 `),t(),e(616,` 6089 `),n(617,"div",47),e(618,"no name, no icon"),t(),e(619,` 6090 `),t(),e(620,` 6091 `),n(621,"p",51),e(622,` 6092 The probed instance is deliberately the `),n(623,"strong"),e(624,"bare"),t(),e(625,` one. The 6093 `),n(626,"code"),e(627,".player-profile-header"),t(),e(628,` page selector supplies a centred 100px box and a 6094 `),n(629,"code"),e(630,"position: relative"),t(),e(631,` of its own, so probing the wrapped instance would pass 6095 even if the component stopped declaring its own positioning context. 6096 `),t(),e(632,` 6097 `),t(),e(633,` 6098 `),n(634,"div",21),e(635,` 6099 `),n(636,"table",22),e(637,` 6100 `),n(638,"thead"),e(639,` 6101 `),n(640,"tr"),e(641,` 6102 `),n(642,"th",52),e(643,"What is probed"),t(),e(644,` 6103 `),n(645,"th",53),e(646,"Must be"),t(),e(647,` 6104 `),n(648,"th",54),e(649,"Reads"),t(),e(650,` 6105 `),n(651,"th",15),e(652,"\xA0"),t(),e(653,`
6106 `),n(654,"th"),e(655,"Why"),t(),e(656,` 6107 `),t(),e(657,` 6108 `),t(),e(658,` 6109 `),n(659,"tbody"),e(660,` 6110 `),S(661,zp,23,5,null,null,up),v(663,Up,10,0),t(),e(664,` 6111 `),t(),e(665,` 6112 `),t(),e(666,` 6113 `),n(667,"p",4),e(668,` 6114 `),n(669,"strong"),e(670),t(),e(671,` pass. The two rows marked 6115 `),n(672,"em"),e(673,"open bug"),t(),e(674,` are not assertions \u2014 they record the state of something still broken: 6116 `),n(675,"code"),e(676,"playerNumber"),t(),e(677," reaching nothing "),n(678,"em"),e(679,"is"),t(),e(680,` the dead input, and the camera badge 6117 holds its corner only because the component stylesheet happens to supply the positioning 6118 context the badge should declare itself. Both are in \xA74. 6119 `),t(),e(681,` 6120 `),n(682,"p",4),e(683,` 6121 Two things no probe can settle, and a person still has to: that `),n(684,"strong"),e(685,`Tab actually reaches 6122 the button`),t(),e(686,` and Enter or Space opens the options menu, and that the camera badge 6123 still looks pinned to the corner. 6124 `),t(),e(687,` 6125`),t(),e(688,` 6126 6127`),n(689,"div",55),e(690,` 6128 `),n(691,"h3"),e(692,"4. Bugs still open"),t(),e(693,` 6129 `),n(694,"app-sg-caption",8),e(695),t(),e(696,` 6130 `),n(697,"div",10),e(698,` 6131 `),S(699,Hp,9,3,null,null,Xn),S(701,Gp,2,1,null,null,Yn),n(703,"a",28),e(704,"what these mean"),t(),e(705,` 6132 `),t(),e(706,` 6133 `),n(707,"p",4),e(708,` 6134 Component-behaviour bugs rather than avatar-system ones, held for their own change. The 6135 first is the only one visible on screen today. `),n(709,"strong"),e(710,"All eight predate this change"),t(),e(711,` 6136 \u2014 none was introduced by it. 6137 `),t(),e(712,` 6138 `),n(713,"div",21),e(714,` 6139 `),n(715,"table",12),e(716,` 6140 `),n(717,"thead"),e(718,` 6141 `),n(719,"tr"),e(720,` 6142 `),n(721,"th",29),e(722,"Bug"),t(),e(723,` 6143 `),n(724,"th",23),e(725,"Kind"),t(),e(726,` 6144 `),n(727,"th",23),e(728,"Accessibility"),t(),e(729,` 6145 `),n(730,"th"),e(731,"What is wrong"),t(),e(732,` 6146 `),n(733,"th"),e(734,"What it should be"),t(),e(735,` 6147 `),n(736,"th",24),e(737,"Demo"),t(),e(738,` 6148 `),t(),e(739,` 6149 `),t(),e(740,` 6150 `),n(741,"tbody"),e(742,` 6151 `),S(743,Zp,34,8,null,null,Zl),t(),e(745,` 6152 `),t(),e(746,` 6153 `),t(),e(747,` 6154 6155 `),n(748,"div",56),e(749,` 6156 `),n(750,"div",57),e(751,` 6157 `),n(752,"p",9),e(753,"An editable avatar with no "),n(754,"code"),e(755,"playerID"),t()(),e(756,` 6158 `),n(757,"p",33),e(758,` 6159 Both samples are the same component with the same inputs; the right-hand one is 6160 passed a player object with no `),n(759,"code"),e(760,"playerID"),t(),e(761,". It renders "),n(762,"strong"),e(763,`nothing 6161 \u2014 not the avatar, not the skeleton`),t(),e(764,`, because the inner guard drops the 6162 avatar while the `),n(765,"code"),e(766,"@else"),t(),e(767,` skeleton belongs to the outer condition. The 6163 dashed box marks where it should be. 6164 `),t(),e(768,` 6165 `),n(769,"div",58),e(770,` 6166 `),n(771,"div",35),e(772,` 6167 `),c(773,"app-player-profile-photo",59),e(774,` 6168 `),n(775,"div",47),e(776,"with playerID"),t(),e(777,` 6169 `),t(),e(778,` 6170 `),n(779,"div",35),e(780,` 6171 `),n(781,"div",60),e(782,` 6172 `),c(783,"app-player-profile-photo",59),e(784,` 6173 `),t(),e(785,` 6174 `),n(786,"div",61),e(787,"without playerID"),t(),e(788,` 6175 `),t(),e(789,` 6176 `),t(),e(790,` 6177 `),t(),e(791,` 6178 `),n(792,"div",62),e(793,` 6179 `),n(794,"p",9),e(795,"Square, two ways"),t(),e(796,` 6180 `),n(797,"p",33),e(798,` 6181 `),n(799,"code"),e(800,'[showCircle]="false"'),t(),e(801," sets "),n(802,"code"),e(803,"border-radius: 4px"),t(),e(804,`. A 6182 `),n(805,"code"),e(806,".player-profile-header"),t(),e(807," page rule resets it to "),n(808,"code"),e(809,"unset"),t(),e(810,`, so 6183 the same input renders soft-cornered in most places and hard-cornered inside that 6184 container. Both below are the same component with the same input. 6185 `),t(),e(811,` 6186 `),n(812,"div",58),e(813,` 6187 `),n(814,"div",35),e(815,` 6188 `),c(816,"app-user-initials",63),e(817,` 6189 `),n(818,"div",47),e(819,"4px"),t(),e(820,` 6190 `),t(),e(821,` 6191 `),n(822,"div",48),e(823,` 6192 `),n(824,"div",64),e(825,` 6193 `),c(826,"app-user-initials",63),e(827,` 6194 `),t(),e(828,` 6195 `),n(829,"div",47),e(830,` 6196 inside `),n(831,"code"),e(832,".player-profile-header"),t(),e(833,` 6197 `),t(),e(834,` 6198 `),t(),e(835,` 6199 `),t(),e(836,` 6200 `),t(),e(837,` 6201 `),t(),e(838,` 6202`),t(),e(839,` 6203`)),s&2&&(i(7),f(" (",o.initialsCallSites,` call sites) draws initials or an 6204 icon and picks its fill from the last digit of `),i(6),f(" (",o.photoCallSites,`) loads a photo, falls back 6205 to a club logo, falls back to the first one, and owns upload, cropping and the skeleton. 6206 `),i(16),m("routerLink","/admin/styleguide/global/color"),i(19),p(o.snapshotDate),i(15),q("",o.fixed.length+o.open.length," findings \xB7 ",o.needsOperating," that cannot be verified by looking"),i(22),E(o.allTally),i(30),E(o.kindLegend),i(10),E(o.allReachTally),i(30),E(o.reachLegend),i(11),q("",o.preExisting," of the ",o.fixed.length+o.open.length,` findings predate this 6207 change.`),i(),f(" ",o.introduced.length,` were created by it and fixed inside it \u2014 6208 both are marked `),i(11),q("",o.fixedNeedsOperating," of the ",o.fixed.length,` fixed 6209 findings need operating rather than looking at`),i(53),E(o.sizes),i(28),E(o.sizes),i(33),E(o.sizes),i(44),E(o.scaleProbe),i(8),q("",o.scaleHolds," of ",o.scaleProbe.length),i(19),q("",o.fixed.length," findings \xB7 ",o.demoedFixed," demonstrated on this page"),i(4),E(o.fixedTally),i(2),E(o.reachTally(o.fixed)),i(42),E(o.fixed),i(47),f("",G(459,39,o.paletteCopy[0]==null?null:o.paletteCopy[0].ratio,"1.2-2"),":1"),i(10),m("id",6),i(6),f("",G(475,42,o.paletteCopy[1]==null?null:o.paletteCopy[1].ratio,"1.2-2"),":1"),i(41),f("",G(516,45,o.noId[0]==null?null:o.noId[0].ratio,"1.2-2"),":1"),i(10),m("id",0),i(6),f("",G(532,48,o.noId[1]==null?null:o.noId[1].ratio,"1.2-2"),":1"),i(60),m("player",o.samplePlayer)("editable",!0),i(9),m("player",o.samplePlayer)("editable",!0),i(14),m("id",4),i(47),E(o.probes),i(2),y(o.probes.length?-1:663),i(7),q("",o.probesPassing," of ",o.probesAsserted),i(25),q("",o.open.length," findings \xB7 ",o.demoedOpen," demonstrated on this page"),i(4),E(o.openTally),i(2),E(o.reachTally(o.open)),i(42),E(o.open),i(30),m("player",o.samplePlayer)("editable",!0),i(10),m("player",o.playerWithoutId)("editable",!0),i(33),m("id",7)("showCircle",!1),i(10),m("id",7)("showCircle",!1))},dependencies:[$,J,We,Co,X,Ye],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var _e=a=>({$implicit:a}),sx=()=>["/admin/styleguide/components/cards"],dx=(a,r)=>r.cls,t0=(a,r)=>r.where,wt=(a,r)=>r.name,mx=(a,r)=>
6209r.src,Ji=(a,r)=>r.ratio,n0=(a,r)=>r.team;function cx(a,r){a&1&&(e(0," "),n(1,"strong"),e(2,"yes"),t(),e(3," \u2014 compound "))}function px(a,r){a&1&&(e(0," "),n(1,"em"),e(2,"it is the base"),t(),e(3," "))}function xx(a,r){a&1&&e(0," no \u2014 standalone ")}function hx(a,r){if(a&1&&(e(0,` 6210 `),n(1,"strong",13),e(2),t(),e(3,` 6211 `),n(4,"div",28),e(5),t(),e(6,` 6212 `)),a&2){let l=u().$implicit;i(2),f("",l.withoutCard,"\xD7"),i(3),f("vs ",l.withCard,"\xD7 with")}}function ux(a,r){if(a&1&&(e(0,` 6213 never 6214 `),n(1,"div",28),e(2),t(),e(3,` 6215 `)),a&2){let l=u().$implicit;i(2),f("",l.withCard,"\xD7, all with")}}function gx(a,r){if(a&1&&(e(0,` 6216 `),n(1,"tr"),e(2,` 6217 `),n(3,"td"),e(4,` 6218 `),n(5,"code"),e(6),t(),e(7,` 6219 `),n(8,"div",28),e(9),t(),e(10,` 6220 `),t(),e(11,` 6221 `),n(12,"td"),e(13,` 6222 `),v(14,cx,4,0)(15,px,4,0)(16,xx,1,0),e(17,` 6223 `),t(),e(18,` 6224 `),n(19,"td"),e(20,` 6225 `),v(21,hx,7,2)(22,ux,4,1),t(),e(23,` 6226 `),n(24,"td")(25,"code"),e(26),t()(),e(27,` 6227 `),n(28,"td"),e(29),t(),e(30,` 6228 `),t(),e(31,` 6229 `)),a&2){let l,d=r.$implicit;i(6),p(d.cls),i(3),f("",d.files," files"),i(5),y((l=d.needsCard)==="yes"?14:l==="base"?15:16),i(7),y(d.withoutCard?21:22),i(5),p(d.scss),i(3),p(d.effect)}}function fx(a,r){if(a&1&&(e(0,` 6230 `),n(1,"li"),e(2),t(),e(3,` 6231 `)),a&2){let l=r.$implicit;i(2),p(l)}}function bx(a,r){if(a&1&&(e(0,` 6232 `),n(1,"li"),e(2),t(),e(3,` 6233 `)),a&2){let l=r.$implicit;i(2),p(l)}}function Sx(a,r){if(a&1&&(e(0,` 6234 `),n(1,"tr"),e(2,` 6235 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 6236 `),n(7,"td")(8,"code"),e(9),t()(),e(10,` 6237 `),n(11,"td")(12,"code"),e(13),t()(),e(14,` 6238 `),n(15,"td"),e(16),t(),e(17,` 6239 `),t(),e(18,` 6240 `)),a&2){let l=r.$implicit;i(5),p(l.name),i(4),p(l.type),i(4),p(l.fallback),i(3),p(l.note)}}function Ex(a,r){if(a&1&&(e(0,` 6241 `),n(1,"tr"),e(2,` 6242 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 6243 `),n(7,"td")(8,"code"),e(9),t()(),e(10,` 6244 `),n(11,"td")(12,"code"),e(13),t()(),e(14,` 6245 `),n(15,"td"),e(16),t(),e(17,` 6246 `),t(),e(18,` 6247 `)),a&2){let l=r.$implicit;i(5),f("(",l.name,")"),i(4),p(l.type),i(4),p(l.fallback),i(3),p(l.note)}}function vx(a,r){a&1&&(e(0,` 6248 `),n(1,"tr"),e(2,` 6249 `),n(3,"td",136),e(4,"No outputs."),t(),e(5,` 6250 `),t(),e(6,` 6251 `))}function yx(a,r){if(a&1&&(e(0,` 6252 `),n(1,"h4",128),e(2),t(),e(3,` 6253 `),n(4,"div",129),e(5,` 6254 `),c(6,"app-pill",130),e(7,` 6255 `),n(8,"span"),e(9),t(),e(10,` 6256 \xB7 6257 `),n(11,"span"),e(12),t(),e(13,` 6258 \xB7 6259 `),n(14,"span"),e(15,"root "),n(16,"code"),e(17),t()(),e(18,` 6260 \xB7 6261 `),n(19,"span")(20,"code"),e(21),t()(),e(22,` 6262 `),t(),e(23,` 6263 `),n(24,"p",131),e(25),t(),e(26,` 6264 6265 `),n(27,"div",5),e(28,` 6266 `),n(29,"div",6),e(30,` 6267 `),n(31,"div",3),e(32,` 6268 `),n(33,"strong",132),e(34,"Reach for it when"),t(),e(35,` 6269 `),n(36,"ul",133),e(37,` 6270 `),S(38,fx,4,1,null,null,K),t(),e(40,` 6271 `),t(),e(41,` 6272 `),t(),e(42,` 6273 `),n(43,"div",6),e(44,` 6274 `),n(45,"div",3),e(46,` 6275 `),n(47,"strong",13),e(48,"Reach for something else when"),t(),e(49,` 6276 `),n(50,"ul",133),e(51,` 6277 `),S(52,bx,4,1,null,null,K),t(),e(54,` 6278 `),t(),e(55,` 6279 `),t(),e(56,` 6280 `),t(),e(57,` 6281 6282 `),n(58,"table",134),e(59,` 6283 `),n(60,"thead"),e(61,` 6284 `),n(62,"tr"),e(63,`
6285 `),n(64,"th",12),e(65,"Input"),t(),e(66,` 6286 `),n(67,"th",12),e(68,"Type"),t(),e(69,` 6287 `),n(70,"th",135),e(71,"Default"),t(),e(72,` 6288 `),n(73,"th"),e(74,"Notes"),t(),e(75,` 6289 `),t(),e(76,` 6290 `),t(),e(77,` 6291 `),n(78,"tbody"),e(79,` 6292 `),S(80,Sx,19,4,null,null,wt),S(82,Ex,19,4,null,null,wt),v(84,vx,7,0),t(),e(85,` 6293 `),t(),e(86,` 6294`)),a&2){let l=r.$implicit;i(2),f("<",l.selector,">"),i(4),m("status",l.side==="admin"?"secondary":l.side==="member"?"primary":"black")("text",l.side),i(3),q("",l.files," ",l.files===1?"file":"files"),i(3),p(l.kind==="complete"?"complete card":l.kind==="content"?"card content":"not a card"),i(5),p(l.root),i(4),p(l.location),i(4),p(l.what),i(13),E(l.reachFor),i(14),E(l.avoid),i(28),E(l.inputs),i(2),E(l.outputs),i(2),y(l.outputs.length?-1:84)}}function wx(a,r){a&1&&de(0)}function Cx(a,r){if(a&1&&(e(0,` 6295 `),n(1,"div",137),e(2,` 6296 `),c(3,"app-null-card",138),e(4,` 6297 `),t(),e(5,` 6298 `)),a&2){let l=r.$implicit;i(3),m("image",l)("text",l)}}function _x(a,r){a&1&&de(0)}function kx(a,r){a&1&&de(0)}function Tx(a,r){a&1&&de(0)}function Ix(a,r){a&1&&de(0)}function Mx(a,r){a&1&&de(0)}function Dx(a,r){a&1&&de(0)}function Fx(a,r){a&1&&de(0)}function Px(a,r){if(a&1&&(e(0,` 6299 `),n(1,"tr"),e(2,` 6300 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 6301 `),n(7,"td")(8,"code"),e(9),t()(),e(10,` 6302 `),t(),e(11,` 6303 `)),a&2){let l=r.$implicit;i(5),p(l.where),i(2),j("text-red",!l.ok),i(2),p(l.value)}}function Ax(a,r){if(a&1&&(e(0,` 6304 `),n(1,"tr"),e(2,` 6305 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 6306 `),n(7,"td")(8,"code"),e(9),t()(),e(10,` 6307 `),t(),e(11,` 6308 `)),a&2){let l=r.$implicit;i(5),p(l.where),i(2),j("text-red",!l.ok),i(2),p(l.value)}}function Ox(a,r){a&1&&de(0)}function Nx(a,r){a&1&&(e(0,` 6309 `),c(1,"app-pill",153),e(2,` 6310 `))}function Bx(a,r){if(a&1&&(e(0,` 6311 `),c(1,"i",154),e(2)),a&2){let l=u().$implicit;i(2),f("",l.teams,` 6312 `)}}function Wx(a,r){if(a&1){let l=B();e(0,` 6313 `),n(1,"app-teaser-card",139),e(2,` 6314 `),n(3,"div",140),e(4,` 6315 `),n(5,"div",141),e(6,` 6316 `),n(7,"div",142),e(8),v(9,Nx,3,0),t(),e(10,` 6317 `),n(11,"div",143),e(12,` 6318 `),n(13,"a",85),e(14),t(),e(15,` 6319 `),t(),e(16,` 6320 `),t(),e(17,` 6321 `),n(18,"div",144),e(19,` 6322 `),n(20,"span",145),e(21,` 6323 `),c(22,"i",146),e(23),t(),e(24,` 6324 `),n(25,"span",147),e(26,` 6325 `),v(27,Bx,3,1),t(),e(28,` 6326 `),n(29,"div",148),e(30,` 6327 `),c(31,"i",149),e(32),t(),e(33,` 6328 `),n(34,"div",148),e(35,` 6329 `),n(36,"button",150),g("click",function(){w(l);let s=u();return C(s.onAction("teaser-card row options"))}),e(37,` 6330 `),c(38,"i",151),e(39,` 6331 `),n(40,"div",152),e(41,"Options"),t(),e(42,` 6332 `),t(),e(43,` 6333 `),t(),e(44,` 6334 `),t(),e(45,` 6335 `),t(),e(46,` 6336 `),t(),e(47,` 6337 `)}if(a&2){let l=r.$implicit;i(),m("image",l.image),i(7),f(` 6338 `,l.meta,` 6339 `),i(),y(l.image?-1:9),i(4),m("routerLink","/admin/styleguide/components/cards"),i(),p(l.name),i(9),f("",l.dates,` 6340 `),i(4),y(l.teams!==null?27:-1),i(5),f("",l.registrations,` 6341 `)}}function Rx(a,r){if(a&1&&(e(0,` 6342 `),n(1,"app-teaser-card",139),e(2,` 6343 `),n(3,"div",3),e(4),t(),e(5,` 6344 `),t(),e(6,` 6345 `)),a&2){let l=r.$implicit;i(),m("image",l.src),i(3),p(l.label)}}function Lx(a,r){if(a&1&&(e(0,` 6346 `),n(1,"tr")(2,"td")(3,"code"),e(4),t()(),n(5,"td")(6,"code"),e(7),t()(),n(8,"td"),e(9),t()(),e(10,` 6347 `)),a&2){let l=r.$implicit;i(4),p(l.ratio),i(3),p(l.floor),i(2),p(l.note)}}function qx(a,r){if(a&1&&(e(0,` 6348 `),n(1,"app-sg-caption",7),e(2),t(),e(3,`
6349 `),n(4,"app-teaser-card",155),e(5,` 6350 `),n(6,"div",3),e(7,"One line of body \u2014 well under every floor."),t(),e(8,` 6351 `),t(),e(9,` 6352 `)),a&2){let l=r.$implicit,d=u();i(2),q('aspectRatio="',l.ratio,'" \u2192 floor ',l.floor),i(2),m("image",d.teaserImg.fourThree)("aspectRatio",l.ratio)}}function Vx(a,r){if(a&1&&(e(0,` 6353 `),n(1,"app-teaser-card",155),e(2,` 6354 `),n(3,"div",3),e(4),c(5,"br"),e(6,` 6355 Three lines of body content.`),c(7,"br"),e(8,` 6356 All three cards should now be the `),n(9,"em"),e(10,"same"),t(),e(11,` height as each other \u2014 the floor stopped mattering. 6357 `),t(),e(12,` 6358 `),t(),e(13,` 6359 `)),a&2){let l=r.$implicit,d=u();i(),m("image",d.teaserImg.fourThree)("aspectRatio",l.ratio),i(3),q(` 6360 aspectRatio="`,l.ratio,'", floor ',l.floor,".")}}function zx(a,r){if(a&1&&(e(0,` 6361 `),n(1,"app-sg-caption",7),e(2),t(),e(3,` 6362 `),n(4,"app-teaser-card",156),e(5,` 6363 `),n(6,"div",3),e(7),t(),e(8,` 6364 `),t(),e(9,` 6365 `)),a&2){let l=r.$implicit,d=u();i(2),f('imageWidth="',l,'"'),i(2),m("image",d.teaserImg.fourThree)("imageWidth",l),i(3),f("Rail ",l," wide.")}}function Ux(a,r){if(a&1){let l=B();e(0,` 6366 `),n(1,"app-pill",163),g("onIconClick",function(){w(l);let s=u(3);return C(s.onAction("list-row-item-fluid chip remove"))}),e(2),n(3,"span",164),e(4),t(),e(5,` 6367 `),t(),e(6,` 6368 `)}if(a&2){let l=r.$implicit,d=u(2).$implicit;i(),m("status",l.head?"black":"secondary")("nowrap",!0)("iconClickable",!0)("iconAriaLabel","Remove "+l.team+" from "+d.name),i(),f("",l.head?"Head Coach":"Assistant Coach",` 6369 \u2022 `),i(2),p(l.team)}}function Hx(a,r){if(a&1&&(e(0,` 6370 `),S(1,Ux,7,6,null,null,n0)),a&2){let l=u().$implicit;i(),E(l.chips)}}function jx(a,r){a&1&&(e(0,` 6371 `),n(1,"em",165),e(2,"Not assigned to any team"),t(),e(3,` 6372 `))}function Gx(a,r){if(a&1){let l=B();e(0,` 6373 `),n(1,"div",157),e(2,` 6374 `),n(3,"div",140),e(4,` 6375 `),n(5,"div",141),e(6,` 6376 `),n(7,"div",158),e(8),t(),e(9,` 6377 `),n(10,"div",142),e(11),t(),e(12,` 6378 `),t(),e(13,` 6379 `),n(14,"div",159),e(15,` 6380 `),n(16,"div",160),e(17,` 6381 `),v(18,Hx,3,0)(19,jx,4,0),t(),e(20,` 6382 `),n(21,"div",161),e(22,` 6383 `),n(23,"button",101),g("click",function(){w(l);let s=u();return C(s.onAction("list-row-item-fluid row action"))}),e(24,` 6384 `),c(25,"i",162),e(26,`Assign to team 6385 `),t(),e(27,` 6386 `),t(),e(28,` 6387 `),t(),e(29,` 6388 `),t(),e(30,` 6389 `),t(),e(31,` 6390 `)}if(a&2){let l=r.$implicit;i(8),p(l.name),i(3),p(l.role),i(7),y(l.chips.length?18:19)}}function $x(a,r){if(a&1){let l=B();e(0,` 6391 `),n(1,"app-pill",163),g("onIconClick",function(){w(l);let s=u(3);return C(s.onAction("list-row-item-fluid chip remove"))}),e(2),n(3,"span",164),e(4),t(),e(5,` 6392 `),t(),e(6,` 6393 `)}if(a&2){let l=r.$implicit,d=u(2).$implicit;i(),m("status",l.head?"black":"secondary")("nowrap",!0)("iconClickable",!0)("iconAriaLabel","Remove "+l.team+" from "+d.name),i(),f("",l.head?"Head Coach":"Assistant Coach",` 6394 \u2022 `),i(2),p(l.team)}}function Kx(a,r){if(a&1&&(e(0,` 6395 `),S(1,$x,7,6,null,null,n0)),a&2){let l=u().$implicit;i(),E(l.chips)}}function Xx(a,r){a&1&&(e(0,` 6396 `),n(1,"em",165),e(2,"Not assigned to any team"),t(),e(3,` 6397 `))}function Yx(a,r){if(a&1){let l=B();e(0,` 6398 `),n(1,"div",157),e(2,` 6399 `),n(3,"div",166),e(4,` 6400 `),n(5,"div",141),e(6,` 6401 `),n(7,"div",158),e(8),t(),e(9,` 6402 `),n(10,"div",142),e(11),t(),e(12,` 6403 `),t(),e(13,` 6404 `),n(14,"div",159),e(15,` 6405 `),n(16,"div",167),e(17,` 6406 `),v(18,Kx,3,0)(19,Xx,4,0),t(),e(20,` 6407 `),n(21,"div",161),e(22,` 6408 `),n(23,"button",101),g("click",function(){w(l);let s=u();return C(s.onAction("list-row--fixed-body row action"))}),e(24,` 6409 `),c(25,"i",162),e(26,`Assign to team 6410 `),t(),e(27,` 6411 `),t(),e(28,` 6412 `),t(),e(29,` 6413 `),t(),e(30,` 6414 `),t(),e(31,` 6415 `)}if(a&2){let l=r.$implicit;i(8),p(l.name),i(3),p(l.role),i(7),y(l.chips.length?18:19)}}var i0=(()=>{let r=class r{onSettingsClick(){this.lastAction="settings"}onAction(d){this.lastAction=d}constructor(d){this.siteDataService=d,this.snapshotDate="2026-08-20",this.liveLoading=!1,this.liveError=!1,this.lastAction="none yet",this.imageType=Vi,this.imageTypeList=Object.values(Vi),this.calendarEventType=Ma,this.flavors=[{cls:"horizontal-form",files:77,scss:"2_layout/forms.scss:345",needsCard:"no",withCard:41,withoutCard:75,effect:"Labels flex to 30% so form rows read side-by-side. NOT A CARD CLASS \u2014 it is form layout, used off-card more often than on it. It is listed here only because 41 cards do carry it."},{cls:"edit-card",files:47,scss:"3_modules/components.scss:163",needsCard:"no",withCard:75,withoutCard:3,effect:"6px grey accent bar on top; flex card-header; styles field-view-only-row children."},{cls:"settings-card",files:37,scss:"3_modules/components.scss:233",needsCard:"no",withCard:62,withoutCard:0,effect:"Same 6px accent bar as edit-card, without the field-row styling."},{cls:"team-card",files:13,scss:"3_modules/admin.scss:700",needsCard:"no",withCard:15,withoutCard:0,effect:"padding: 0, grey filled header, tighter slot padding. Hardcodes an 8px header radius."},{cls:"table-card",files:12,scss:"3_modules/components.scss:66",needsCard:"base",withCard:18,withoutCard:0,effect:"Sibling of .card, not a modifier \u2014 see section 6. Works standalone."},{cls:"admin-card",files:6,scss:"3_modules/admin.scss:485",needsCard:"no",withCard:13,withoutCard:0,effect:"Bordered, full-bleed flex header with a smaller uppercase heading."}
6415,{cls:"dashboard-card",files:5,scss:"3_modules/components.scss:78",needsCard:"yes",withCard:6,withoutCard:0,effect:"1.5rem bottom margin, larger labels, and a hardcoded shadow \u2014 see section 7."},{cls:"clickable-card",files:4,scss:"3_modules/components.scss:99",needsCard:"yes",withCard:7,withoutCard:0,effect:"cursor: pointer plus a grey hover fill. The sanctioned click affordance."},{cls:"blog-card",files:3,scss:"3_modules/components.scss:225",needsCard:"no",withCard:5,withoutCard:0,effect:"padding: 0 and a hardcoded 4px radius."},{cls:"video-card",files:2,scss:"3_modules/components.scss:229",needsCard:"no",withCard:1,withoutCard:1,effect:"padding: 0, keeps the base overflow: hidden for embed clipping."},{cls:"filters-card",files:1,scss:"3_modules/components.scss:242",needsCard:"no",withCard:1,withoutCard:0,effect:"max-width: 325px. Nothing else."},{cls:"card-print",files:1,scss:"3_modules/components.scss:89",needsCard:"yes",withCard:3,withoutCard:0,effect:"Print-only: drops border, radius and padding; break-inside: avoid."}],this.nullCardDoc={selector:"app-null-card",kind:"complete",files:28,root:"<div [class.card]>",location:"components/cards/null-card/",side:"shared",what:"The standard empty state: an illustration, a message, and an optional call to action.",reachFor:["a list, table or panel has no rows yet","a filter returned nothing","a feature is not configured yet and you want to point at the thing that configures it"],avoid:['the emptiness is an error \u2014 use app-inline-alert. An empty state reads as "normal, nothing here yet".','you only need one line of grey text inside a card you already have \u2014 set [showCard]="false", or skip the component.'],inputs:[{name:"text",type:"string",fallback:"\u2014",note:"The message. Runs through the safeHtml pipe, so inline markup is allowed."},{name:"image",type:"ImageType | string",fallback:"FLAG",note:"Named illustration. Anything unrecognized silently falls back to the flag."},{name:"showCard",type:"boolean",fallback:"true",note:"false drops the .card wrapper, leaving illustration and text bare for nesting inside a card you already have."},{name:"showButton",type:"boolean",fallback:"false",note:"Reveals the CTA button. Nothing else renders it."},{name:"buttonText",type:"string",fallback:"'New'",note:"CTA label."},{name:"buttonIcon",type:"string",fallback:"''",note:"Font Awesome classes, e.g. fa-regular fa-plus. Omit for a text-only button."},{name:"styleClass",type:"string",fallback:"''",note:"Extra classes on the root element."}],outputs:[{name:"buttonClicked",type:"EventEmitter<void>",fallback:"\u2014",note:"Fires on the CTA. Only reachable while showButton is true."}]},this.userInfoCardDoc={selector:"app-user-info-view-only-card",kind:"complete",files:2,root:'<div class="card edit-card">',location:"components/cards/user-info-view-only-card/",side:"shared",what:"Renders dynamic-form field metadata as read-only label/value rows, with an optional Edit affordance in the header.",reachFor:["you already have DynamicFormField[] metadata plus an entity, and want the read view of it","a profile summary panel that hands off to a real form elsewhere"],avoid:['you are hand-writing the rows anyway \u2014 use class="card edit-card" with app-field-view-only-row directly.',"the values should be editable in place. This card never edits; it only emits (edit)."],inputs:[{name:"entity",type:"any",fallback:"\u2014",note:"The object values are read from. Each row reads entity[field.controlName]."},{name:"fields",type:"DynamicFormField[]",fallback:"\u2014",note:"Metadata. controlName and label are enough for a plain text row; required drives the missing-info highlight."},{name:"headerText",type:"string",fallback:"\u2014",note:"Card header heading."},{name:"isEditable",type:"boolean",fallback:"false",note:"Shows the Edit link in the header."}],outputs:[{name:"edit",type:"EventEmitter<any>",fallback:"\u2014",note:"Fires on the Edit link. The card does not change state \u2014 the host opens the form."}]},this.staffCardDoc={selector:"app-staff-card",kind:"complete",files:5,root:'<div class="staff-entry card">',location:"components/cards/staff-card/",side:"member",what:"A staff member: photo with club-logo fallback, name, title, and a contact block of profile-page, email, phone and bio-download links.",reachFor:["a public staff directory or coach listing"],avoid:["an admin-side people list \u2014 that is a table, not a card.","you have a bare user with no staffProfile. Everything below the name hangs off that object."],inputs:[{name:"clubUser",type:"ClubUser",fallback:"\u2014",note:"Required. Reads user.firstName / user.lastName, staffProgramAssignments, and the whole staffProfile sub-object \u2014 all unguarded."},{name:"clubLogoURL",type:"string",fallback:"\u2014",note:"Image fallback when staffProfile.profileImage is absent. Without it the photo column renders empty."}],outputs:[]},this.blogCardDoc={selector:"app-blog-card",kind:"complete",files:5,root:'<a class="card blog-card">',location:"components/cards/blog-card/",side:"member",what:"A blog post teaser for a grid: image, date, heading, excerpt.",reachFor:["a page-builder blog roll or a latest-news grid"],avoid:["anywhere keyboard access matters, until 7d is fixed \u2014 the root is an anchor with no href"],inputs:[{name:"blogTitle",type:"string",fallback:"\u2014",note:"Heading. Always rendered, even when empty."},{name:"blogExcerpt",type:"string",fallback:"\u2014",note:"Teaser text. Omitted entirely when falsy."},{name:"blogSavedOn",type:"Date | string",fallback:"\u2014",note:"Rendered MM.DD.YY. Omitted when falsy."},{name:"blogImage",type:"string",fallback:"\u2014",note:"Bound to [style.background-image], so it needs a full CSS value \u2014 url('\u2026'), not a bare path. A bare path silently renders nothing."},{name:"showClubLogo",type:"boolean",fallback:"false",note:"Pads and contains the image instead of cropping it \u2014 for a logo standing in for a missing hero."},{name:"fourByThreeRatio",type:"boolean",fallback:"false",note:"Forces a 3.97/3 aspect ratio on the image."},{name:"backgroundSize",type:"string",fallback:"\u2014",note:"CSS background-size override. Ignored while showClubLogo is true."}],outputs:[{name:"blogCardClick",type:"EventEmitter<void>",fallback:"\u2014",note:"The only way to navigate from this card. See 7d."}]},this.promoCardDoc={selector:"app-promo-card",kind:"not-a-card",files:12,root:'<div class="sprocket-promo-card">',location:"components/cards/promo-card/",side:"admin",what:"A full-width upsell interstitial: Premium Feature eyebrow, title, description, a checkbox feature list beside an optional screenshot, and a fixed contact-your-CSM footer.",reachFor:["a club navigated to a feature its plan does not include"],avoid:["anything inline \u2014 this is a whole-page takeover, not a panel.","you need a different call to action. The footer copy is hardcoded in the template."],inputs:[{name:"features",type:"string[]",fallback:"\u2014",note:"Required in practice \u2014 the template reads features.length unguarded, so omitting it throws. Pass [] for none. Each entry runs through safeHtml."},{name:"title",type:"string",fallback:"\u2014",note:"Heading plus the rule under it. Both omitted when falsy."},{name:"description",type:"string",fallback:"\u2014",note:"Centered lead paragraph, safeHtml."},{name:"image",type:"string",fallback:"\u2014",note:"Screenshot beside the feature list. Without it the list runs full width."},{name:"showPremiumFeature",type:"boolean",fallback:"true",note:"The Premium Feature eyebrow. On by default."}],outputs:[]},this.calendarCardDoc={selector:"app-calendar-card",kind:"not-a-card",files:8,root:'<div class="calendar-card"> \u2014 no .card',location:"components/cards/calendar-card/",side:"shared",what:"A date badge \u2014 weekday, day number, month \u2014 colour-coded by event type, stacking into two badges for a multi-day event.",reachFor:["the leading date column of an event, schedule or sign-up row"],avoid:["you expected card chrome. There is none \u2014 no border, shadow or padding from .card. It is a badge that happens to be named card."],inputs:[{name:"startDate",type:"Date",fallback:"\u2014",note:"Required. The date on the first badge."},{name:"endDate",type:"Date",fallback:"\u2014",note:"Required in practice \u2014 see the gotcha below. Equal to startDate for a single-day event; a later date adds the second badge and the connecting arrow."},{name:"clubEventTypeID",type:"CalendarEventType",fallback:"\u2014",note:"Drives the colour: GAME, PRACTICE, CLUB. Anything else renders the uncoloured default."},{name:"isDraft",type:"boolean",fallback:"false",note:"Adds the DRAFT r
6415ibbon and the muted treatment."}],outputs:[]},this.rosterCardDoc={selector:"app-roster-card-content",kind:"content",files:2,root:'<div class="row"> \u2014 no .card',location:"components/cards/roster-card-content/",side:"member",what:"The inside of a college-recruiting roster card: photo slot, name, committed badge, and a label/value row per enabled roster field. The consumer supplies the card.",reachFor:['a college-profile or recruiting roster grid \u2014 and wrap it yourself in <div class="roster-card card">, which is what both live consumers do'],avoid:["you expected it to be a card. It is not \u2014 it renders a bare .row and has no chrome of its own.","any other roster. Every row it renders is gated on CollegeProfileSettings.rosterFields, so it is specific to the college-profile feature."],inputs:[{name:"player",type:"RosterPlayer",fallback:"\u2014",note:"Required. The whole template is behind @if (player && collegeProfileSettings), so omitting it renders nothing rather than throwing \u2014 the best-guarded card component."},{name:"collegeProfileSettings",type:"CollegeProfileSettings",fallback:"\u2014",note:"Required. Its rosterFields drive which rows appear, via isColumnEnabled. No settings means no rows."},{name:"clubLogoURL",type:"string",fallback:"\u2014",note:"Photo-slot fallback when the player has no photo."},{name:"bgColor",type:"string",fallback:"'#003261'",note:"Committed-badge fill, fed from theme.colorPrimary. Format is #rrggbb \u2014 the # is part of the value. See defect 7g."},{name:"showProfileButton",type:"boolean",fallback:"false",note:"Reveals the View Profile button."},{name:"hideHeight",type:"boolean",fallback:"false",note:"DEAD \u2014 zero template references. Only the commented-out call site passes it."},{name:"hidePlayerCellPhone",type:"boolean",fallback:"false",note:"DEAD \u2014 zero template references; the cell-phone row is commented out. Only the commented-out call site passes it."}],outputs:[{name:"viewProfileButton",type:"EventEmitter<void>",fallback:"\u2014",note:"Fires from the View Profile button."}]},this.demoRosterPlayer={hasPhoto:!1,user:{firstName:"Priya",lastName:"Raghunathan"},playerClubData:{number:14,position:{name:"Midfielder"}},playerCollegeData:{school:"State University",gpa:3.82,height:68}},this.demoRosterSettings={rosterFields:[st.JERSEY_NUMBER,st.PRIMARY_POSITION,st.GPA,st.SCHOOL_COMMITTED_TO].map(s=>({rosterFieldID:s,zCollegeProfilePageRosterFieldID:s,displayValueForTeamPage:!0,displayValueForPlayerPage:!0,isDisabledInFieldOptions:!1,zCollegeProfilePageRosterField:{description:st[s].replace(/_/g," ")}}))},this.facilityCardDoc={selector:"app-facility-card",kind:"complete",files:1,root:"feature-local",location:"admin/club/practice-facility/facility-card/ \u2014 the only card component outside shared/",side:"admin",what:"A practice facility with its fields, statuses, and restore actions for soft-deleted rows.",reachFor:["nothing new \u2014 it is bound to the practice-facility feature and is not a general-purpose card"],avoid:["reuse. It takes a PracticeFacilityClubAssign and is declared in its own feature module, not ComponentsModule. Left in place by decision; listed here only so the inventory is complete."],inputs:[{name:"facility",type:"PracticeFacilityClubAssign",fallback:"\u2014",note:"Required."},{name:"isOpponentField",type:"boolean",fallback:"false",note:"Opponent-venue variant."},{name:"locationType",type:"string",fallback:"\u2014",note:"Label for the kind of location."},{name:"showRemovedFields",type:"boolean",fallback:"false",note:"Reveals soft-deleted fields with their restore affordance."}],outputs:[{name:"restoreEvent",type:"EventEmitter<void>",fallback:"\u2014",note:"Restore the whole facility."},{name:"restoreFieldEvent",type:"EventEmitter<{ practiceFacilityID, facilityFieldID }>",fallback:"\u2014",note:"Restore one field."}]},this.teaserCardDoc={selector:"app-teaser-card",kind:"complete",files:1,root:'<div class="card p-0">',location:"components/cards/teaser-card/",side:"shared",what:"A list row with a flush image rail down its left edge and whatever you project beside it. The chrome only \u2014 the row inside it is a separate CSS contract (list-row).",reachFor:["a scannable list of records where each row wants a thumbnail \u2014 programs, facilities, rosters","you want every row the same height regardless of what image was uploaded","the row content is yours to compose; this owns the card and the image, nothing else"],avoid:["the list wants column headers, sorting or frozen columns \u2014 that is p-table, and this contract deliberately has no headers.","there is no image. You get an empty grey rail; use a plain .card instead.","you need the image somewhere other than a left rail or a top banner \u2014 those are the only two shapes."],inputs:[{name:"image",type:"string | null",fallback:"\u2014",note:"Thumbn
6415ail src. Omit or pass null and the rail shows the --grey-200 placeholder rather than a broken image."},{name:"imageAlt",type:"string",fallback:"''",note:"Empty by default, which marks the image decorative and hides it from screen readers. Set it only when the image carries meaning the row text does not."},{name:"imageFit",type:"'cover' | 'contain'",fallback:"'cover'",note:"object-fit on the image. cover crops to fill the rail; contain letterboxes inside it."},{name:"aspectRatio",type:"string",fallback:"'4 / 3'",note:"Ratio of the rail, not of the file. With a rail width this sets a MINIMUM row height, which is what makes rows uniform. In banner mode it governs strictly."},{name:"imageWidth",type:"string",fallback:"'80px'",note:"Rail width at 768px and up. Any CSS length."},{name:"imageWidthMobile",type:"string",fallback:"'120px'",note:"Rail width below 768px. Ignored entirely when mobileFull is on."},{name:"mobileFull",type:"boolean",fallback:"false",note:"Below 768px, stack the card and run the image full width as a banner. UNVERIFIED \u2014 nothing in the app sets this."},{name:"styleClass",type:"string",fallback:"''",note:"Extra classes on the root .card."},{name:"link",type:"unknown[] | string | null",fallback:"\u2014",note:"Interactive mode. Covers the card with an <a [routerLink]> overlay. Wins over clickable. UNVERIFIED."},{name:"clickable",type:"boolean",fallback:"false",note:"Interactive mode. Covers the card with a <button> overlay that emits cardClick. UNVERIFIED."},{name:"(either mode)",type:"\u2014",fallback:"\u2014",note:"Setting link or clickable also adds .clickable-card to the root, for cursor: pointer and the grey hover fill. Overlay supplies semantics, class supplies look."},{name:"ariaLabel",type:"string",fallback:"''",note:"Accessible name for the overlay. REQUIRED whenever link or clickable is set \u2014 the overlay has no text of its own."}],outputs:[{name:"cardClick",type:"EventEmitter<void>",fallback:"\u2014",note:"Fires from the button overlay. Only reachable while clickable is true and link is unset."}]},this.teaserImg={square:"/assets/img/fpo-player-1.png",fourThree:"/assets/img/fpo-blog.png",wide:"/assets/img/fpo-box.png",veryWide:"/assets/img/team-snap-logo.png"},this.teaserNaturalRatios=[{src:"/assets/img/fpo-player-1.png",label:"203\xD7201 \u2014 natural 1.01"},{src:"/assets/img/fpo-box.png",label:"600\xD7300 \u2014 natural 2.00"},{src:"/assets/img/team-snap-logo.png",label:"1024\xD7225 \u2014 natural 4.55"}],this.teaserRatios=[{ratio:"16 / 9",floor:"45px",note:"shortest \u2014 body content decides the height here"},{ratio:"4 / 3",floor:"60px",note:"the default; ~8px of headroom over a two-line body"},{ratio:"1 / 1",floor:"80px",note:"roomiest \u2014 uniform even if a title wraps"}],this.teaserWidths=["80px","120px","10rem"],this.teaserRows=[{name:"U10 Spring Rec",meta:"League \u2022 Youth Rec",image:"/assets/img/fpo-blog.png",dates:"03/01/2026\u201305/30/2026",teams:12,registrations:148},{name:"Summer Skills Academy \u2014 Advanced Track for Returning Players and Alumni",meta:"Camp \u2022 Player Development",image:"/assets/img/fpo-box.png",dates:"06/15/2026\u201308/07/2026",teams:null,registrations:36},{name:"Fall Classic",meta:"Tournament \u2022 Open",image:null,dates:"09/12/2026\u201309/14/2026",teams:3,registrations:0}],this.fluidRows=[{name:"Al Ng",role:"Coach",chips:[{team:"Thunder U10",head:!0}]},{name:"Bartholomew Fitzgerald-Smythe",role:"Club Administrator",chips:[{team:"Wildcats Green U12 Travel Squad",head:!0},{team:"Rockets",head:!1},{team:"Comets U8",head:!1},{team:"Blue Jays Academy Elite",head:!0}]},{name:"Jo Ray",role:"Team Manager",chips:[]},{name:"Wu Li",role:"Assistant Coach",chips:[{team:"Northside Metropolitan Selects 2014 Boys White Travel",head:!0}]},{name:"Ten Teams",role:"Coach",chips:[{team:"Aces",head:!0},{team:"Bolts",head:!1},{team:"Comets",head:!1},{team:"Dynamo",head:!1},{team:"Eagles",head:!1},{team:"Falcons",head:!1},{team:"Gators",head:!1},{team:"Hawks",head:!1},{team:"Ipswich Rangers 2013 Girls Blue",head:!1},{team:"Jets",head:!1}]}],this.demoBlogImage="url('/assets/img/icon-empty-programs.png')",this.radiusSources=[{where:".card / .table-card base",value:"var(--theme-card-radius)",ok:!0},{where:".blog-card",value:"4px",ok:!1},{where:".team-card .card-header",value:"8px 8px 0 0",ok:!1}],this.shadowSources=[{where:".card / .table-card base",value:"var(--box-sha
6415dow)",ok:!0},{where:"public-site card scope",value:"var(--theme-card-shadow)",ok:!0},{where:".dashboard-card",value:"0 2px 8px rgba(0, 0, 0, 0.08)",ok:!1}],this.demoUser={firstName:"Dana",lastName:"Whitfield",email:"[email protected]",phone:"(503) 555-0142"},this.demoUserFields=[{controlName:"firstName",label:"First Name"},{controlName:"lastName",label:"Last Name"},{controlName:"email",label:"Email",required:!0},{controlName:"phone",label:"Phone"}],this.demoStaff={user:{firstName:"Marcus ",lastName:"Ortega"},staffProfile:{title:"Director of Coaching",email:"[email protected]",phone:"(503) 555-0188"},staffProgramAssignments:[{program:{name:"Fall Travel"}}]},this.demoStaffBare={user:{firstName:"Priya ",lastName:"Raghunathan"},staffProgramAssignments:[]},this.demoEventStart=new Date(2026,8,12),this.demoEventEnd=new Date(2026,8,14),this.promoFeatures=["Automated waitlists","Per-division pricing","Coach assignment rules"]}ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-sg-cards"]],standalone:!1,decls:3319,vars:131,consts:[["cardDoc",""],[1,"text-small","text-grey"],[1,"card"],[1,"text-small"],[1,"mt-4"],[1,"row"],[1,"col-md-6"],["side","shared"],[1,"m-0"],[1,"table","table-bordered","text-small","mb-0"],[1,"table","table-bordered","text-small","sg-doc-table"],[2,"width","8rem"],[2,"width","12rem"],[1,"text-red"],[1,"col-md-8"],[1,"card-header","sg-slot-outline"],["variant","tag","status","primary","styleClass","font-monospaced mb-1","text",".card-header"],[1,"mb-0"],[1,"card-subheading"],[1,"card-body","sg-slot-outline"],["variant","tag","status","primary","styleClass","font-monospaced mb-1","text",".card-body"],[1,"m-0","text-small"],[1,"card-footer","sg-slot-outline"],["variant","tag","status","primary","styleClass","font-monospaced mb-1","text",".card-footer"],["routerLink","/admin/styleguide/components/cards",1,"btn","btn-naked","btn-sm"],["type","button",1,"btn","btn-naked","btn-sm",3,"click"],["alertType","note",3,"isInline"],[2,"width","11rem"],[1,"text-smallest","text-grey-lt"],[2,"width","9rem"],[2,"width","13rem"],[1,"card","edit-card"],[1,"card-header"],[1,"header-action",3,"click"],[1,"card-body"],[1,"card","settings-card"],[1,"card","horizontal-form"],[1,"form-group"],["for","sg-card-hf-name"],["id","sg-card-hf-name","type","text","value","Fall Travel",1,"form-control"],["for","sg-card-hf-season"],["id","sg-card-hf-season",1,"form-control"],[1,"text-small","text-grey","mb-0","mt-3"],[1,"card","team-card"],[1,"card-footer"],["side","admin"],[1,"card","admin-card"],[1,"card-heading"],[1,"card","table-card"],[1,"table","mb-0"],[1,"table-card"],["type","button",1,"card","clickable-card","w-100","text-left",3,"click"],[1,"d-block","text-small"],[1,"card","dashboard-card"],[1,"col-md-4"],[1,"card","video-card"],[1,"bg-grey-lt","text-center","py-5","text-small"],[1,"card","filters-card"],[1,"card","card-print"],["side","member"],[1,"card","blog-card"],[1,"p-3"],[1,"mb-1"],[1,"border-left-lg","pl-3","mb-5"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],["text","No registrations yet.",3,"image"],["text","Nothing scheduled this week.","buttonText","New Event","buttonIcon","fa-regular fa-plus",3,"buttonClicked","image","showButton"],["text",'[showCard]="false" \u2014 no wrapper, for nesting.',3,"image","showCard"],["headerText","Contact Info",3,"edit","entity","fields","isEditable"],["headerText","Contact Info, read-only",3,"entity","fields"],[3,"clubUser"],["blogTitle","Tryout results are posted","blogExcerpt","Rosters for the fall travel program are final. Coaches will reach out to each family this week.",3,"blogCardClick","blogImage","blogSavedOn"],["blogTitle","No image supplied","blogExcerpt","The image block is omitted entirely rather than leaving a gap.",3,"blogCardClick","blogSavedOn"],["blogTitle","Club logo standing in","blogExcerpt","Padded and contained instead of cropped.",3,"blogCardClick","blogImage","showClubLogo","blogSavedOn"],["alertType","warning",3,"isInline"],[1,"d-flex","flex-wrap","gap-3","align-items-start"],[3,"startDate","endDate","clubEventTypeID"],[3,"startDate","endDate"],[3,"startDate","endDate","clubEventTypeID","isDraft"],[1,"roster-card","card"],[3,"viewProfileButton","player","collegeProfileSettings","showProfileButton"],[3,"player","collegeProfileSettings"],["title","Advanced Registration","description","Waitlists, per-division pricing and coach assignment rules.",3,"features"],[1,"border-left-lg","pl-3","mb-0"],["variant","tag","status","secondary","text","admin"],[3,"routerLink"],["panelTitle","Registrations"],["panelTitle","Team Health","settingsTitle","Team Health Settings",3,"settingsClick","hasSettings"],["panelTitle","Disputes"],["slot","titleSuffix","pTooltip","Suffix content sits inside the h2, so it inherits the heading size.",1,"fa-regular","fa-circle-info","ml-2"],["panelTitle","Financial Aid",3,"settingsClick","hasSettings"],["slot","headerActions","type","button",1,"btn","btn-naked","btn-sm","mr-2",3,"click"],[1,"fa-regular","fa-rotate-right","mr-1"],["panelTitle","Program Overview"],["slot","filters",1,"d-flex","flex-wrap","gap-3","align-items-center","mb-3"],["for","sg-card-season",1,"m-0","text-small"],["id","sg-card-season",1,"form-control","w-auto"],["panelTitle","Player Retention"],["slot","footer",1,"card-footer"],["routerLink","/styleguide",1,"btn","btn-naked","btn-sm"],[1,"d-flex","flex-wrap","gap-3","align-items-center","mb-3"],["type","button",1,"btn","btn-sm",3,"click"],["panelTitle","Alerts","skeletonHeight","220px",3,"settingsClick","hasSettings","loading","error"],["panelTitle","Loading","skeletonHeight","220px",3,"loading"],["panelTitle","Error, default message",3,"error"],["panelTitle","Error, custom message","errorMessage","Retention data is unavailable for this season.",3,"error"],["panelTitle","120px","skeletonHeight","120px",3,"loading"],["panelTitle","400px (default)",3,"loading"],["panelTitle","Flush body","bodyClass",""],["panelTitle","Full height","styleClass","full-height"],[1,"text-small","text-grey","mt-3"],[1,"mt-3"],[1,"table","table-bordered","text-small","mb-2",2,"max-width","34rem"],["alertType","error",3,"isInline"],[1,"text-small","mt-3"],[1,"text-small","text-grey","mt-2"],[1,"table","table-bordered","text-small","mb-2",2,"max-width","40rem"],[1,"table","table-bordered","text-small","sg-doc-table","mb-2",2,"max-width","40rem"],[2,"width","7rem"],["imageFit","cover",3,"image"],["imageFit","contain",3,"image"],["ariaLabel","Cards styleguide page",3,"image","link"],["ariaLabel","Run the demo action",3,"cardClick","image","clickable"],[3,"cardClick","image","clickable"],[1,"text-small","text-red"],[3,"image","mobileFull","aspectRatio"],["alertType","info",3,"isInline"],[2,"width","16rem"],[1,"font-monospaced","mb-1"],[1,"text-smallest","text-grey-lt","mb-2"],["variant","tag",3,"status","text"],[1,"text-small","mb-2"],[1,"text-green"],[1,"mb-2"],[1,"table","table-bordered","text-small","sg-doc-table","mb-2"],[2,"width","6rem"],["colspan","4",1,"text-grey-lt"],[1,"col-md-3","col-6"],[3,"image","text"],[3,"image"],[1,"list-row"],[1,"list-row-body"],[1,"text-grey","text-small"],[1,"line-height-1"],[1,"list-row-meta","text-small"],[1,"list-row-item"],[1,"fa-regular","fa-calendar","mr-1"],[1,"list-row-item","list-row-item-md"],[1,"list-row-item","list-row-item-sm"],[1,"fa-regular","fa-cart-shopping","mr-1"],["type","button",1,"btn","btn-sm","btn-tertiary","mb-0",3,"click"],[1,"fa-solid","fa-ellipsis"],[1,"sr-only"],["text","no image","status","secondary",1,"ml-2"],[1,"fa-regular","fa-users","mr-1"],[3,"image","as
6415pectRatio"],[3,"image","imageWidth"],[1,"card","p-3","mb-2"],[1,"fw-600"],[1,"list-row-meta"],[1,"list-row-item","list-row-item-fluid"],[1,"list-row-item","list-row-item-lg"],[1,"fa-regular","fa-plus","mr-1"],["variant","tag","icon","fa-regular fa-times",3,"onIconClick","status","nowrap","iconClickable","iconAriaLabel"],[1,"text-overflow-ellipsis"],[1,"text-small","text-grey-lt"],[1,"list-row","list-row--fixed-body"],[1,"list-row-item","list-row-item-fluid","justify-content-between","justify-content-md-end"]],template:function(s,o){if(s&1&&(e(0," "),n(1,"h2"),e(2,"Cards"),t(),e(3,` 6416`),n(4,"p",1),e(5,` 6417 \u201CCard\u201D in this app is overwhelmingly a `),n(6,"strong"),e(7,"CSS contract"),t(),e(8,`, not a component 6418 family. `),n(9,"code"),e(10,'class="card"'),t(),e(11," and its slots appear in "),n(12,"strong"),e(13,"388 template files"),t(),e(14,`; 6419 the eight card `),n(15,"em"),e(16,"components"),t(),e(17," account for "),n(18,"strong"),e(19,"66"),t(),e(20,` between them. So this page 6420 documents the CSS first (sections 2\u20133) and the components second (sections 4\u20135) \u2014 6421 that is the order in which you will actually reach for them. 6422`),t(),e(21,` 6423`),n(22,"p",1),e(23,` 6424 Counts are a grep snapshot of `),n(24,"code"),e(25,"ClientApp/src/app"),t(),e(26,` taken 6425 `),n(27,"strong"),e(28),t(),e(29,`, styleguide excluded. They drift weekly \u2014 re-grep before 6426 trusting one for a sweep. Full write-up: 6427 `),n(30,"code"),e(31,"docs/ui-migration-and-review/**/Card-System.md"),t(),e(32,`. 6428`),t(),e(33,` 6429`),n(34,"p",1),e(35,` 6430 Everything below renders against the real partials. No harness-local rule restyles a card \u2014 6431 if a sample looks wrong, the partial is wrong. 6432`),t(),e(36,` 6433 6434`),n(37,"div",2),e(38,` 6435 `),n(39,"h3"),e(40,"1. Which card do I reach for?"),t(),e(41,` 6436 `),n(42,"ul",3),e(43,` 6437 `),n(44,"li"),e(45,` 6438 `),n(46,"strong"),e(47,"Plain container, no special behavior"),t(),e(48," \u2192 "),n(49,"code"),e(50,'class="card"'),t(),e(51,`. 6439 You get white background, 1rem padding, 1rem bottom margin, border, shadow and the token 6440 radius for free. `),n(52,"strong"),e(53,"Do not re-add spacing."),t(),e(54,` 6441 `),t(),e(55,` 6442 `),n(56,"li"),e(57,` 6443 `),n(58,"strong"),e(59,"A known flavor"),t(),e(60,` \u2014 settings form, edit form, a card wrapping a table, 6444 a clickable card \u2192 use the flavor class from section 3. There are 6445 `),n(61,"strong"),e(62),t(),e(63,`; check before inventing one. 6446 `),t(),e(64,` 6447 `),n(65,"li"),e(66,` 6448 `),n(67,"strong"),e(68,"Content structure with its own inputs"),t(),e(69,` \u2014 a calendar entry, a staff 6449 member, a blog post, an empty state \u2192 use the component from section 4. 6450 `),t(),e(70,` 6451 `),n(71,"li"),e(72,` 6452 `),n(73,"strong"),e(74,"A dashboard panel"),t(),e(75," \u2192 "),n(76,"code"),e(77,"app-admin-dashboard-card"),t(),e(78,`, 6453 section 5. It is the only sanctioned dashboard chrome. 6454 `),t(),e(79,` 6455 `),n(80,"li"),e(81,` 6456 `),n(82,"strong"),e(83,"None of the above"),t(),e(84,` \u2192 it is probably a flavor, not a new component. 6457 A component earns its place by taking typed inputs or switching template structure, not 6458 by looking different. 6459 `),t(),e(85,` 6460 `),t(),e(86,` 6461`),t(),e(87,` 6462 6463`),n(88,"div",2),e(89,` 6464 `),n(90,"h3"),e(91,"2. The CSS contract"),t(),e(92,` 6465 `),n(93,"p",1),e(94,` 6466 `),n(95,"code"),e(96,".card"),t(),e(97," and "),n(98,"code"),e(99,".table-card"),t(),e(100,` share one rule block at 6467 `),n(101,"code"),e(102,"3_modules/components.scss:65"),t(),e(103,`. This is the layer 388 files are using. 6468 `),t(),e(104,` 6469 6470 `),n(105,"h4",4),e(106,"2a. What the base gives you"),t(),e(107,` 6471 `),n(108,"div",5),e(109,` 6472 `),n(110,"div",6),e(111,` 6473 `),n(112,"app-sg-caption",7),e(113,'class="card" \u2014 nothing else'),t(),e(114,` 6474 `),n(115,"div",2),e(116,` 6475 `),n(117,"p",8),e(118,` 6476 A bare `),n(119,"code"),e(120,".card"),t(),e(121,`. Padding, bottom margin, border, shadow, radius and
6477 the white fill all come from the base. 6478 `),t(),e(122,` 6479 `),t(),e(123,` 6480 `),t(),e(124,` 6481 `),n(125,"div",6),e(126,` 6482 `),n(127,"app-sg-caption",7),e(128,"the declarations you inherit"),t(),e(129,` 6483 `),n(130,"table",9),e(131,` 6484 `),n(132,"tbody"),e(133,` 6485 `),n(134,"tr")(135,"td")(136,"code"),e(137,"background-color"),t()(),n(138,"td")(139,"code"),e(140,"var(--color-white)"),t()()(),e(141,` 6486 `),n(142,"tr")(143,"td")(144,"code"),e(145,"color"),t()(),n(146,"td")(147,"code"),e(148,"var(--base-text)"),t(),e(149," = "),n(150,"code"),e(151,"var(--grey-900)"),t()()(),e(152,` 6487 `),n(153,"tr")(154,"td")(155,"code"),e(156,"--base-header"),t()(),n(157,"td")(158,"code"),e(159,"var(--blue-1000)"),t(),e(160," \u2014 see section 7"),t()(),e(161,` 6488 `),n(162,"tr")(163,"td")(164,"code"),e(165,"border"),t()(),n(166,"td")(167,"code"),e(168,"var(--border)"),t()()(),e(169,` 6489 `),n(170,"tr")(171,"td")(172,"code"),e(173,"border-radius"),t()(),n(174,"td")(175,"code"),e(176,"var(--theme-card-radius)"),t()()(),e(177,` 6490 `),n(178,"tr")(179,"td")(180,"code"),e(181,"box-shadow"),t()(),n(182,"td")(183,"code"),e(184,"var(--box-sha
6490dow)"),t()()(),e(185,` 6491 `),n(186,"tr")(187,"td")(188,"code"),e(189,"padding"),t()(),n(190,"td")(191,"code"),e(192,"1rem"),t(),e(193," \u2014 85 occurrences override it"),t()(),e(194,` 6492 `),n(195,"tr")(196,"td")(197,"code"),e(198,"margin"),t()(),n(199,"td")(200,"code"),e(201,"0 0 1rem 0"),t(),e(202," \u2014 37 files re-add it"),t()(),e(203,` 6493 `),n(204,"tr")(205,"td")(206,"code"),e(207,"position"),t()(),n(208,"td")(209,"code"),e(210,"relative"),t()()(),e(211,` 6494 `),n(212,"tr")(213,"td")(214,"code"),e(215,"overflow"),t()(),n(216,"td")(217,"code"),e(218,"hidden"),t(),e(219," \u2014 clips overlays, see section 7"),t()(),e(220,` 6495 `),t(),e(221,` 6496 `),t(),e(222,` 6497 `),t(),e(223,` 6498 `),t(),e(224,` 6499 6500 `),n(225,"h4",4),e(226,"2b. The slots"),t(),e(227,` 6501 `),n(228,"p",1),e(229,` 6502 Slots are plain classes, not projected templates \u2014 you write them yourself inside the 6503 card. Note the `),n(230,"em"),e(231,"Has base rule"),t(),e(232,` column: several widely-used slot names have 6504 `),n(233,"strong"),e(234,"no global styles at all"),t(),e(235,` and are inert hooks outside a flavor that styles 6505 them. That is a defect, not a design \u2014 see section 7. 6506 `),t(),e(236,` 6507 `),n(237,"table",10),e(238,` 6508 `),n(239,"thead"),e(240,` 6509 `),n(241,"tr"),e(242,` 6510 `),n(243,"th"),e(244,"Slot"),t(),e(245,` 6511 `),n(246,"th",11),e(247,"Files"),t(),e(248,` 6512 `),n(249,"th",12),e(250,"Has base rule"),t(),e(251,` 6513 `),n(252,"th"),e(253,"What it does"),t(),e(254,` 6514 `),t(),e(255,` 6515 `),t(),e(256,` 6516 `),n(257,"tbody"),e(258,` 6517 `),n(259,"tr"),e(260,` 6518 `),n(261,"td")(262,"code"),e(263,".card-header"),t()(),n(264,"td"),e(265,"94"),t(),e(266,` 6519 `),n(267,"td")(268,"code"),e(269,"components.scss:124"),t()(),e(270,` 6520 `),n(271,"td"),e(272,"1rem bottom margin; "),n(273,"code"),e(274,".no-gutters"),t(),e(275," and "),n(276,"code"),e(277,".card-header--with-accent"),t(),e(278," variants."),t(),e(279,` 6521 `),t(),e(280,` 6522 `),n(281,"tr"),e(282,` 6523 `),n(283,"td")(284,"code"),e(285,".card-body"),t()(),n(286,"td"),e(287,"89"),t(),e(288,` 6524 `),n(289,"td",13)(290,"strong"),e(291,"none"),t()(),e(292,` 6525 `),n(293,"td"),e(294,"Only ever styled "),n(295,"em"),e(296,"inside"),t(),e(297," "),n(298,"code"),e(299,".edit-card"),t(),e(300,", "),n(301,"code"),e(302,".team-card"),t(),e(303," or "),n(304,"code"),e(305,".admin-card"),t(),e(306,". On a plain card it is a no-op."),t(),e(307,` 6526 `),t(),e(308,` 6527 `),n(309,"tr"),e(310,` 6528 `),n(311,"td")(312,"code"),e(313,".card-footer"),t()(),n(314,"td"),e(315,"40"),t(),e(316,` 6529 `),n(317,"td")(318,"code"),e(319,"components.scss:258"),t()(),e(320,` 6530 `),n(321,"td"),e(322,"Negative side margins so the footer runs full-bleed to the card edge."),t(),e(323,` 6531 `),t(),e(324,` 6532 `),n(325,"tr"),e(326,` 6533 `),n(327,"td")(328,"code"),e(329,".card-heading"),t()(),n(330,"td"),e(331,"12"),t(),e(332,` 6534 `),n(333,"td")(334,"code"),e(335,"global.scss:273"),t()(),e(336,` 6535 `),n(337,"td"),e(338,"Heading treatment for a card title without an "),n(339,"code"),e(340,"h*"),t(),e(341,"."),t(),e(342,` 6536 `),t(),e(343,` 6537 `),n(344,"tr"),e(345,` 6538 `),n(346,"td")(347,"code"),e(348,".card-title"),t()(),n(349,"td"),e(350,"10"),t(),e(351,` 6539 `),n(352,"td",13)(353,"strong"),e(354,"none, anywhere"),t()(),e(355,` 6540 `),n(356,"td"),e(357,"Zero rules in the whole app. Ten files write it expecting Bootstrap, which is not loaded."),t(),e(358,` 6541 `),t(),e(359,` 6542 `),n(360,"tr"),e(361,` 6543 `),n(362,"td")(363,"code"),e(364,".card-subheading"),t()(),n(365,"td"),e(366,"8"),t(),e(367,` 6544 `),n(368,"td")(369,"code"),e(370,"global.scss:278"),t()(),e(371,` 6545 `),n(372,"td"),e(373,"Secondary line under the heading."),t(),e(374,` 6546 `),t(),e(375,` 6547 `),n(376,"tr"),e(377,` 6548 `),n(378,"td")(379,"code"),e(380,".card-sub-head"),t()(),n(381,"td"),e(382,"6"),t(),e(383,` 6549 `),n(384,"td")(385,"code"),e(386,"admin.scss:398"),t()(),e(387,` 6550 `),n(388,"td"),e(389,"Admin sub-header strip; has a "),n(390,"code"),e(391,".card-sub-head-flyouts"),t(),e(392," variant."),t(),e(393,` 6551 `),t(),e(394,` 6552 `),n(395,"tr"),e(396,` 6553 `),n(397,"td")(398,"code"),e(399,".card-tabs"),t()(),n(400,"td"),e(401,"4"),t(),e(402,` 6554 `),n(403,"td")(404,"code"),e(405,"admin.scss:285"),t()(),e(406,` 6555 `),n(407,"td"),e(408,"Tab strip docked to the card header."),t(),e(409,` 6556 `),t(),e(410,` 6557 `),n(411,"tr"),e(412,` 6558 `),n(413,"td")(414,"code"),e(415,".card-filters"),t()(),n(416,"td"),e(417,"3"),t(),e(418,` 6559 `),n(419,"td")(420,"code"),e(421,"admin.scss:505"),t()(),e(422,` 6560 `),n(423,"td"),e(424,"Filter row between header and body."),t(),e(425,` 6561 `),t(),e(426,` 6562 `),n(427,"tr"),e(428,` 6563 `),n(429,"td")(430,"code"),e(431,".card-scroll-content"),t()(),n(432,"td"),e(433,"2"),t(),e(434,` 6564 `),n(435,"td")(436,"code"),e(437,"components.scss:246"),t()(),e(438,` 6565 `),n(439,"td"),e(440,"200\u2013400px scroll region, full-bleed via negative margins."),t(),e(441,` 6566 `),t(),e(442,` 6567 `),n(443,"tr"),e(444,` 6568 `),n(445,"td")(446,"code"),e(447,".card-header-only"),t()(),n(448,"td"),e(449,"1"),t(),e(450,` 6569 `),n(451,"td")(452,"code"),e(453,"components.scss:136"),t()(),e(454,` 6570 `),n(455,"td"),e(456,"Used once, and only via "),n(457,"code"),e(458,"[ngClass]"),t(),e(459," in "),n(460,"code"),e(461,"facility-card"),t(),e(462,` \u2014 which is 6571 why a `),n(463,"code"),e(464,'class="\u2026"'),t(),e(465," grep reports it dead. Bindings hide usage; check both forms."),t(),e(466,` 6572 `),t(),e(467,` 6573 `),t(),e(468,` 6574 `),t(),e(469,` 6575 6576 `),n(470,"app-sg-caption",7),e(471,"header \xB7 body \xB7 footer, live \u2014 dashed outlines are harness-only"),t(),e(472,` 6577 `),n(473,"div",5),e(474,` 6578 `),n(475,"div",14),e(476,` 6579 `),n(477,"div",2),e(478,` 6580 `),n(479,"div",15),e(480,` 6581 `),c(481,"app-pill",16),e(482,` 6582 `),n(483,"h4",17),e(484,"Season Settings"),t(),e(485,` 6583 `),n(486,"div",18),e(487,".card-subheading sits under the heading"),t(),e(488,` 6584 `),t(),e(489,` 6585 `),n(490,"div",19),e(491,` 6586 `),c(492,"app-pill",20),e(493,` 6587 `),n(494,"p",21),e(495,` 6588 This body has no padding of its own \u2014 the 1rem you see is the 6589 `),n(496,"code"),e(497,".card"),t(),e(498,` base. That is the point of the table above. 6590 `),t(),e(499,` 6591 `),t(),e(500,` 6592 `),n(501,"div",22),e(502,` 6593 `),c(503,"app-pill",23),e(504,` 6594 `),n(505,"a",24),e(506,"View details"),t(),e(507,` 6595 `),n(508,"button",25),g("click",function(){return o.onAction("contract footer")}),e(509,`
6596 Recalculate 6597 `),t(),e(510,` 6598 `),t(),e(511,` 6599 `),t(),e(512,` 6600 `),t(),e(513,` 6601 `),t(),e(514,` 6602`),t(),e(515,` 6603 6604`),n(516,"div",2),e(517,` 6605 `),n(518,"h3"),e(519,"3. Modifiers & flavors"),t(),e(520,` 6606 `),n(521,"p",1),e(522),t(),e(523,` 6607 6608 `),n(524,"app-inline-alert",26),e(525,` 6609 `),n(526,"strong"),e(527,"Read the two middle columns together \u2014 the gap between them is the finding."),t(),e(528,` 6610 `),n(529,"em"),e(530,"Needs "),n(531,"code"),e(532,".card"),t()(),e(533,` is what the CSS enforces: three flavors are written nested 6611 inside the base rule, so they compile to `),n(534,"code"),e(535,".card.dashboard-card"),t(),e(536,` and do nothing 6612 without `),n(537,"code"),e(538,".card"),t(),e(539,`. The other nine are standalone rules that will apply to any element. 6613 `),n(540,"em"),e(541,"Used without it"),t(),e(542,` is what templates actually do. Where a standalone class is never used 6614 without `),n(543,"code"),e(544,".card"),t(),e(545,`, it is a card flavor that the CSS simply fails to say so \u2014 6615 and where it `),n(546,"strong"),e(547,"is"),t(),e(548,` used without, it is not really a card class at all. 6616 `),t(),e(549,` 6617 `),n(550,"p",1),e(551,` 6618 Worth knowing why the name cannot tell you: the family briefly had one class with BEM modifier 6619 naming, `),n(552,"code"),e(553,".card--accented"),t(),e(554,", and it was written "),n(555,"em"),e(556,"standalone"),t(),e(557,` \u2014 so the 6620 `),n(558,"code"),e(559,"--"),t(),e(560,' that implies "modifier of '),n(561,"code"),e(562,".card"),t(),e(563,`" was attached to the one class 6621 that did not require `),n(564,"code"),e(565,".card"),t(),e(566,`, while co-class-named ones like 6622 `),n(567,"code"),e(568,".card.image-header"),t(),e(569),n(570,"code"),e(571,"--"),t(),e(572,` naming believing it carries meaning here. 6623 `),t(),e(573,` 6624 6625 `),n(574,"h4",4),e(575,"3a. The census"),t(),e(576,` 6626 `),n(577,"table",10),e(578,` 6627 `),n(579,"thead"),e(580,` 6628 `),n(581,"tr"),e(582,` 6629 `),n(583,"th",27),e(584,"Class"),t(),e(585,` 6630 `),n(586,"th",11),e(587,"Needs "),n(588,"code"),e(589,".card"),t(),e(590,"?"),n(591,"div",28),e(592,"what the CSS requires"),t()(),e(593,` 6631 `),n(594,"th",29),e(595,"Used without it"),n(596,"div",28),e(597,"what templates do"),t()(),e(598,` 6632 `),n(599,"th",30),e(600,"Defined"),t(),e(601,` 6633 `),n(602,"th"),e(603,"Effect"),t(),e(604,` 6634 `),t(),e(605,` 6635 `),t(),e(606,` 6636 `),n(607,"tbody"),e(608,` 6637 `),S(609,gx,32,6,null,null,dx),t(),e(611,` 6638 `),t(),e(612,` 6639 `),n(613,"p",1),e(614,` 6640 `),n(615,"code"),e(616,"admin-card"),t(),e(617," and "),n(618,"code"),e(619,"team-card"),t(),e(620,` are real, SCSS-defined card flavors that 6641 the original census missed \u2014 between them they cover 19 files, more than 6642 `),n(621,"code"),e(622,"table-card"),t(),e(623,`. 6643 `),t(),e(624,` 6644 6645 `),n(625,"app-inline-alert",26),e(626,` 6646 `),n(627,"strong"),e(628,"Counting caveat that applies to every number on this page."),t(),e(629,` These counts match 6647 the class name inside a `),n(630,"code"),e(631,'class="\u2026"'),t(),e(632,` attribute. A class applied through 6648 `),n(633,"code"),e(634,"[ngClass]"),t(),e(635," or "),n(636,"code"),e(637,"[class.x]"),t(),e(638," does "),n(639,"em"),e(640,"not"),t(),e(641,` match \u2014 6649 `),n(642,"code"),e(643,".card-header-only"),t(),e(644,` read as dead for exactly that reason until 6650 `),n(645,"code"),e(646,"facility-card"),t(),e(647," turned up applying it via "),n(648,"code"),e(649,"[ngClass]"),t(),e(650),n(651,"code"),e(652,".html"),t(),e(653," "),n(654,"em"),e(655,"and"),t(),e(656," "),n(657,"code"),e(658,".ts"),t(),e(659,` before acting on one. 6651 `),t(),e(660,` 6652 6653 `),n(661,"h4",4),e(662,"3b. Live"),t(),e(663,` 6654 6655 `),n(664,"app-sg-caption",7),e(665,'class="card edit-card" \u2014 47 files'),t(),e(666,` 6656 `),n(667,"div",5),e(668,` 6657 `),n(669,"div",6),e(670,` 6658 `),n(671,"div",31),e(672,` 6659 `),n(673,"div",32),e(674,` 6660 `),n(675,"h4",17),e(676,"Contact Info"),t(),e(677,` 6661 `),n(678,"a",33),g("click",function(){return o.onAction("edit-card header action")}),e(679,"Edit"),t(),e(680,` 6662 `),t(),e(681,` 6663 `),n(682,"div",34),e(683,` 6664 `),n(684,"p",21),e(685,`6px grey accent bar on top; flex header with a trailing 6665 `),n(686,"code"),e(687,".header-action"),t(),e(688,"."),t(),e(689,` 6666 `),t(),e(690,` 6667 `),t(),e(691,` 6668 `),t(),e(692,` 6669 `),n(693,"div",6),e(694,` 6670 `),n(695,"app-sg-caption",7),e(696,'class="card settings-card" \u2014 37 files'),t(),e(697,` 6671 `),n(698,"div",35),e(699,` 6672 `),n(700,"h2"),e(701,"Notifications"),t(),e(702,` 6673 `),n(703,"p",21),e(704,` 6674 Same accent bar as `),n(705,"code"),e(706,"edit-card"),t(),e(707,`, without the field-row styling. 6675 `),n(708,"code"),e(709,"admin.scss"),t(),e(710," also restyles its "),n(711,"code"),e(712,"h2"),t(),e(713,`. 6676 `),t(),e(714,` 6677 `),t(),e(715,` 6678 `),t(),e(716,` 6679 `),t(),e(717,` 6680 6681 `),n(718,"app-sg-caption",7),e(719,'class="card horizontal-form" \u2014 77 files, the most-used flavor of all'),t(),e(720,` 6682 `),n(721,"div",5),e(722,` 6683 `),n(723,"div",14),e(724,` 6684 `),n(725,"div",36),e(726,` 6685 `),n(727,"div",37),e(728,` 6686 `),n(729,"label",38),e(730,"Program Name"),t(),e(731,` 6687 `),c(732,"input",39),e(733,` 6688 `),t(),e(734,` 6689 `),n(735,"div",37),e(736,` 6690 `),n(737,"label",40),e(738,"Season"),t(),e(739,` 6691 `),n(740,"select",41),e(741,` 6692 `),n(742,"option"),e(743,"Fall 2026"),t(),e(744,` 6693 `),n(745,"option"),e(746,"Spring 2027"),t(),e(747,` 6694 `),t(),e(748,` 6695 `),t(),e(749,` 6696 `),n(750,"p",42),e(751,` 6697 The flavor is what puts labels beside their controls at 30% width. Without it 6698 these stack. 6699 `),t(),e(752,` 6700 `),t(),e(753,` 6701 `),t(),e(754,` 6702 `),t(),e(755,` 6703 6704 `),n(756,"app-sg-caption",7),e(757,'class="card team-card" \u2014 13 files'),t(),e(758,` 6705 `),n(759,"div",5),e(760,` 6706 `),n(761,"div",6),e(762,` 6707 `),n(763,"div",43),e(764,` 6708 `),n(765,"div",32),e(766,` 6709 `),n(767,"h4",17),e(768,"U14 Boys Red"),t(),e(769,`
6710 `),t(),e(770,` 6711 `),n(771,"div",34),e(772,` 6712 `),n(773,"p",21),e(774,`Grey filled header, tighter slot padding, 6713 `),n(775,"code"),e(776,"padding: 0"),t(),e(777," on the card itself."),t(),e(778,` 6714 `),t(),e(779,` 6715 `),n(780,"div",44),e(781,` 6716 `),n(782,"a",24),e(783,"Roster"),t(),e(784,` 6717 `),t(),e(785,` 6718 `),t(),e(786,` 6719 `),t(),e(787,` 6720 `),n(788,"div",6),e(789,` 6721 `),n(790,"app-sg-caption",45),e(791,'class="card admin-card" \u2014 6 files'),t(),e(792,` 6722 `),n(793,"div",46),e(794,` 6723 `),n(795,"div",32),e(796,` 6724 `),n(797,"div",47),e(798,"Registration Summary"),t(),e(799,` 6725 `),t(),e(800,` 6726 `),n(801,"div",34),e(802,` 6727 `),n(803,"p",21),e(804,"Bordered full-bleed header, smaller uppercase heading."),t(),e(805,` 6728 `),t(),e(806,` 6729 `),t(),e(807,` 6730 `),t(),e(808,` 6731 `),t(),e(809,` 6732 6733 `),n(810,"app-sg-caption",7),e(811,'class="card table-card" \u2014 12 files. See section 6: this is a sibling, not a modifier.'),t(),e(812,` 6734 `),n(813,"div",5),e(814,` 6735 `),n(815,"div",6),e(816,` 6736 `),n(817,"div",48),e(818,` 6737 `),n(819,"table",49),e(820,` 6738 `),n(821,"thead")(822,"tr")(823,"th"),e(824,"Player"),t(),n(825,"th"),e(826,"Status"),t()()(),e(827,` 6739 `),n(828,"tbody"),e(829,` 6740 `),n(830,"tr")(831,"td"),e(832,"Dana Whitfield"),t(),n(833,"td"),e(834,"Registered"),t()(),e(835,` 6741 `),n(836,"tr")(837,"td"),e(838,"Marcus Ortega"),t(),n(839,"td"),e(840,"Waitlisted"),t()(),e(841,` 6742 `),t(),e(842,` 6743 `),t(),e(843,` 6744 `),t(),e(844,` 6745 `),t(),e(845,` 6746 `),n(846,"div",6),e(847,` 6747 `),n(848,"app-sg-caption",7),e(849,'class="table-card" alone \u2014 identical, because it is the same rule block'),t(),e(850,` 6748 `),n(851,"div",50),e(852,` 6749 `),n(853,"table",49),e(854,` 6750 `),n(855,"thead")(856,"tr")(857,"th"),e(858,"Player"),t(),n(859,"th"),e(860,"Status"),t()()(),e(861,` 6751 `),n(862,"tbody"),e(863,` 6752 `),n(864,"tr")(865,"td"),e(866,"Dana Whitfield"),t(),n(867,"td"),e(868,"Registered"),t()(),e(869,` 6753 `),n(870,"tr")(871,"td"),e(872,"Marcus Ortega"),t(),n(873,"td"),e(874,"Waitlisted"),t()(),e(875,` 6754 `),t(),e(876,` 6755 `),t(),e(877,` 6756 `),t(),e(878,` 6757 `),t(),e(879,` 6758 `),t(),e(880,` 6759 6760 `),n(881,"app-sg-caption",7),e(882,'class="card clickable-card" \u2014 4 files. The sanctioned click affordance; hover me.'),t(),e(883,` 6761 `),n(884,"div",5),e(885,` 6762 `),n(886,"div",6),e(887,` 6763 `),n(888,"button",51),g("click",function(){return o.onAction("clickable-card")}),e(889,` 6764 `),n(890,"span",52),e(891,` 6765 `),n(892,"code"),e(893,"cursor: pointer"),t(),e(894,` plus a grey hover fill. Put it on a 6766 `),n(895,"code"),e(896,"<button>"),t(),e(897," for an on-screen action or an "),n(898,"code"),e(899,"<a href>"),t(),e(900,` 6767 for navigation \u2014 the class supplies the look, not the semantics. 6768 `),t(),e(901,` 6769 `),t(),e(902,` 6770 `),t(),e(903,` 6771 `),n(904,"div",6),e(905,` 6772 `),n(906,"app-sg-caption",7),e(907,'class="card dashboard-card" \u2014 5 files. Bare class; the component is section 5.'),t(),e(908,` 6773 `),n(909,"div",53),e(910,` 6774 `),n(911,"label"),e(912,"1.5rem bottom margin and larger labels"),t(),e(913,` 6775 `),n(914,"p",21),e(915,` 6776 Its shadow is hardcoded rather than tokenized \u2014 defect 7j. 6777 `),t(),e(916,` 6778 `),t(),e(917,` 6779 `),t(),e(918,` 6780 `),t(),e(919,` 6781 6782 `),n(920,"app-sg-caption",7),e(921,'class="card video-card" (2 files) \xB7 class="card filters-card" (1) \xB7 class="card card-print" (1)'),t(),e(922,` 6783 `),n(923,"div",5),e(924,` 6784 `),n(925,"div",54),e(926,` 6785 `),n(927,"div",55),e(928,` 6786 `),n(929,"div",56),e(930,` 6787 `),n(931,"code"),e(932,"padding: 0"),t(),e(933,", keeps "),n(934,"code"),e(935,"overflow: hidden"),t(),e(936,` so an embed clips to 6788 the radius. 6789 `),t(),e(937,` 6790 `),t(),e(938,` 6791 `),t(),e(939,` 6792 `),n(940,"div",54),e(941,` 6793 `),n(942,"div",57),e(943,` 6794 `),n(944,"p",21)(945,"code"),e(946,"max-width: 325px"),t(),e(947,". That is the entire rule."),t(),e(948,` 6795 `),t(),e(949,` 6796 `),t(),e(950,` 6797 `),n(951,"div",54),e(952,` 6798 `),n(953,"div",58),e(954,` 6799 `),n(955,"p",21),e(956,` 6800 Identical on screen by design \u2014 the rule is `),n(957,"code"),e(958,"@media print"),t(),e(959,` only 6801 (drops border, radius, padding; adds `),n(960,"code"),e(961,"break-inside: avoid"),t(),e(962,`). 6802 `),t(),e(963,` 6803 `),t(),e(964,` 6804 `),t(),e(965,` 6805 `),t(),e(966,` 6806 6807 `),n(967,"app-sg-caption",59),e(968,'class="card blog-card" \u2014 3 files. The component is section 4.'),t(),e(969,` 6808 `),n(970,"div",5),e(971,` 6809 `),n(972,"div",6),e(973,` 6810 `),n(974,"div",60),e(975,` 6811 `),n(976,"div",61),e(977,` 6812 `),n(978,"h4",62),e(979,"Tryout results are posted"),t(),e(980,` 6813 `),n(981,"p",21),e(982,` 6814 `),n(983,"code"),e(984,"padding: 0"),t(),e(985," and a hardcoded "),n(986,"code"),e(987,"4px"),t(),e(988,` radius \u2014 the 6815 third of four radius sources, section 6. 6816 `),t(),e(989,` 6817 `),t(),e(990,` 6818 `),t(),e(991,` 6819 `),t(),e(992,` 6820 `),t(),e(993,` 6821 6822`),t(),e(994,` 6823 6824`),k(995,yx,87,10,"ng-template",null,0,fe),e(997,` 6825 6826`),n(998,"div",2),e(999,` 6827 `),n(1e3,"h3"),e(1001,"4. Component cards"),t(),e(1002,` 6828 `),n(1003,"p",1),e(1004,` 6829 Specialized content shapes layered on the same `),n(1005,"code"),e(1006,".card"),t(),e(1007,` base. Reach for one only 6830 when it takes typed inputs or switches template structure \u2014 not because it looks 6831 different. Each block below gives you the full input/output surface, when to use it, when not 6832 to, and a live sample. 6833 `),t(),e(1008,` 6834 6835 `),n(1009,"h4",4),e(1010,"Three kinds \u2014 settle this before you wrap anything"),t(),e(1011,` 6836 `),n(1012,"p",1),e(1013,` 6837 The first question is `),n(1014,"strong"),e(1015,"who renders the "),n(1016,"code"),e(1017,".card"),t()(),e(1018,`. Get it wrong and 6838 you get either no chrome at all or two nested cards. Not one of these nine tells you from its 6839 name, which is why this table is here. 6840 `),t(),e(1019,` 6841 `),n(1020,"table",10),e(1021,` 6842 `),n(1022,"thead"),e(1023,` 6843 `),n(1024,"tr"),e(1025,` 6844 `),n(1026,"th",27),e(1027,"Kind"),t(),e(1028,` 6845 `),n(1029,"th",27),e(1030,"Who renders "),n(1031,"code"),e(1032,".card"),t()(),e(1033,` 6846 `),n(1034,"th"),e(1035,"Components"),t(),e(1036,` 6847 `),t(),e(1037,` 6848 `),t(),e(1038,` 6849 `),n(1039,"tbody"),e(1040,` 6850 `),n(1041,"tr"),e(1042,` 6851 `),n(1043,"td")(1044,"strong"),e(1045,"Complete card"),t()(),e(1046,` 6852 `),n(1047,"td"),e(1048,"the component"),t(),e(1049,` 6853 `),n(1050,"td")(1051,"code"),e(1052,"admin-dashboard-card"),t(),e(1053,", "),n(1054,"code"),e(1055,"blog-card"),t(),e(1056,", "),n(1057,"code"),e(1058,"staff-card"),t(),e(1059,`, 6854 `),n(1060,"code"),e(1061,"user-info-view-only-card"),t(),e(1062,", "),n(1063,"code"),e(1064,"facility-card"),t(),e(1065,`, 6855 `),n(1066,"code"),e(1067,"null-card"),t(),e(1068," (by default)"),t(),e(1069,` 6856 `),t(),e(1070,` 6857 `),n(1071,"tr"),e(1072,` 6858 `),n(1073,"td")(1074,"strong"),e(1075,"Card content"),t()(),e(1076,` 6859 `),n(1077,"td")(1078,"strong"),e(1079,"you do"),t()(),e(1080,` 6860 `),n(1081,"td")(1082,"code"),e(1083,"roster-card"),t(),e(1084,", and "),n(1085,"code"),e(1086,"null-card"),t(),e(1087,` with 6861 `),n(1088,"code"),e(1089,'[showCard]="false"'),t()(),e(1090,` 6862 `),t(),e(1091,` 6863 `),n(1092,"tr"),e(1093,` 6864 `),n(1094,"td")(1095,"strong"),e(1096,"Not a card"),t()(),e(1097,`
6865 `),n(1098,"td"),e(1099,"nobody \u2014 own unrelated chrome"),t(),e(1100,` 6866 `),n(1101,"td")(1102,"code"),e(1103,"promo-card"),t(),e(1104," (a whole page section), "),n(1105,"code"),e(1106,"calendar-card"),t(),e(1107," (a date badge)"),t(),e(1108,` 6867 `),t(),e(1109,` 6868 `),t(),e(1110,` 6869 `),t(),e(1111,` 6870 `),n(1112,"app-inline-alert",26),e(1113,` 6871 `),n(1114,"code"),e(1115,"app-null-card"),t(),e(1116," is deliberately "),n(1117,"strong"),e(1118,"both"),t(),e(1119,`, via 6872 `),n(1120,"code"),e(1121,'[class.card]="showCard"'),t(),e(1122,` on its root. That is the sanctioned way to write a 6873 component that works standalone `),n(1123,"em"),e(1124,"and"),t(),e(1125,` nested \u2014 one boolean that toggles the 6874 wrapper, not two components. Copy that pattern rather than inventing another. 6875 `),t(),e(1126,` 6876 `),n(1127,"p",1),e(1128,` 6877 `),n(1129,"code"),e(1130,"app-admin-dashboard-card"),t(),e(1131,` is a complete card, documented in section 5 where it 6878 already had its own gallery. Every block below carries its kind in the meta strip. 6879 `),t(),e(1132,` 6880 `),n(1133,"app-inline-alert",26),e(1134,` 6881 `),n(1135,"strong"),e(1136,"Naming trap."),t(),e(1137," A grep for "),n(1138,"code"),e(1139,"*card*"),t(),e(1140,` matches 23 files, but 14 of them 6882 are `),n(1141,"strong"),e(1142,"payment"),t(),e(1143," cards \u2014 "),n(1144,"code"),e(1145,"cardholder-*"),t(),e(1146,`, 6883 `),n(1147,"code"),e(1148,"cancel-card-dialog"),t(),e(1149,", "),n(1150,"code"),e(1151,"replace-card-dialog"),t(),e(1152,`, 6884 `),n(1153,"code"),e(1154,"cardholder-card-status"),t(),e(1155,`. Different domain entirely. Exclude them from any sweep 6885 over this family. 6886 `),t(),e(1156,` 6887 6888 `),c(1157,"hr",4),e(1158,` 6889 6890 `),n(1159,"div",63),e(1160,` 6891 `),k(1161,wx,1,0,"ng-container",64),e(1162,` 6892 6893 `),n(1163,"app-sg-caption",7),e(1164,"the three shapes: message only \xB7 with a CTA \xB7 without the card wrapper"),t(),e(1165,` 6894 `),n(1166,"div",5),e(1167,` 6895 `),n(1168,"div",54),e(1169,` 6896 `),c(1170,"app-null-card",65),e(1171,` 6897 `),t(),e(1172,` 6898 `),n(1173,"div",54),e(1174,` 6899 `),n(1175,"app-null-card",66),g("buttonClicked",function(){return o.onAction("null-card CTA")}),t(),e(1176,` 6900 `),t(),e(1177,` 6901 `),n(1178,"div",54),e(1179,` 6902 `),c(1180,"app-null-card",67),e(1181,` 6903 `),t(),e(1182,` 6904 `),t(),e(1183,` 6905 6906 `),n(1184,"app-sg-caption",7),e(1185,"every ImageType \u2014 pick by meaning, not by looks"),t(),e(1186,` 6907 `),n(1187,"div",5),e(1188,` 6908 `),S(1189,Cx,6,2,null,null,K),t(),e(1191,` 6909 `),n(1192,"p",1),e(1193,` 6910 `),n(1194,"code"),e(1195,"[image]"),t(),e(1196," takes the "),n(1197,"code"),e(1198,"ImageType"),t(),e(1199,` string enum, never a raw path. An 6911 unrecognized value falls back to `),n(1200,"code"),e(1201),t(),e(1202,` silently, so a typo 6912 looks like a deliberate choice. `),n(1203,"strong"),e(1204,`Any new illustration card should extend this enum 6913 rather than invent a parallel convention`),t(),e(1205,` \u2014 that is the precedent Wave B follows. 6914 `),t(),e(1206,` 6915 `),t(),e(1207,` 6916 6917 `),n(1208,"div",63),e(1209,` 6918 `),k(1210,_x,1,0,"ng-container",64),e(1211,` 6919 6920 `),n(1212,"app-sg-caption",7),e(1213,"four fields, one of them required and empty \u2014 note the missing-info highlight"),t(),e(1214,` 6921 `),n(1215,"div",5),e(1216,` 6922 `),n(1217,"div",6),e(1218,` 6923 `),n(1219,"app-user-info-view-only-card",68),g("edit",function(){return o.onAction("view-only-card edit")}),t(),e(1220,` 6924 `),t(),e(1221,` 6925 `),n(1222,"div",6),e(1223,` 6926 `),n(1224,"app-sg-caption",7),e(1225,'[isEditable]="false" \u2014 no Edit link in the header'),t(),e(1226,` 6927 `),c(1227,"app-user-info-view-only-card",69),e(1228,` 6928 `),t(),e(1229,` 6929 `),t(),e(1230,` 6930 `),t(),e(1231,` 6931 6932 `),n(1232,"div",63),e(1233,` 6933 `),k(1234,kx,1,0,"ng-container",64),e(1235,` 6934 6935 `),n(1236,"app-sg-caption",59),e(1237,"with a program assignment and a full staffProfile"),t(),e(1238,` 6936 `),n(1239,"div",5),e(1240,` 6937 `),n(1241,"div",6),e(1242,` 6938 `),c(1243,"app-staff-card",70),e(1244,` 6939 `),t(),e(1245,` 6940 `),n(1246,"div",6),e(1247,` 6941 `),n(1248,"app-sg-caption",59),e(1249,"no staffProfile \u2014 everything below the name disappears"),t(),e(1250,` 6942 `),c(1251,"app-staff-card",70),e(1252,` 6943 `),t(),e(1253,` 6944 `),t(),e(1254,` 6945 `),t(),e(1255,` 6946 6947 `),n(1256,"div",63),e(1257,` 6948 `),k(1258,Tx,1,0,"ng-container",64),e(1259,` 6949 6950 `),n(1260,"app-sg-caption",59),e(1261,'with an image \xB7 text only \xB7 [showClubLogo]="true"'),t(),e(1262,` 6951 `),n(1263,"div",5),e(1264,` 6952 `),n(1265,"div",54),e(1266,` 6953 `),n(1267,"app-blog-card",71),g("blogCardClick",function(){return o.onAction("blog-card click")}),t(),e(1268,` 6954 `),t(),e(1269,` 6955 `),n(1270,"div",54),e(1271,` 6956 `),n(1272,"app-blog-card",72),g("blogCardClick",function(){return o.onAction("blog-card click")}),t(),e(1273,` 6957 `),t(),e(1274,` 6958 `),n(1275,"div",54),e(1276,` 6959 `),n(1277,"app-blog-card",73),g("blogCardClick",function(){return o.onAction("blog-card click")}),t(),e(1278,` 6960 `),t(),e(1279,` 6961 `),t(),e(1280,` 6962 `),n(1281,"app-inline-alert",74),e(1282,` 6963 `),n(1283,"strong"),e(1284,"Two traps."),t(),e(1285," "),n(1286,"code"),e(1287,"blogImage"),t(),e(1288,` is bound straight to 6964 `),n(1289,"code"),e(1290,"[style.background-image]"),t(),e(1291,`, so it must be a full CSS value \u2014 6965 `),n(1292,"code"),e(1293,"url('/path/img.png')"),t(),e(1294,", not "),n(1295,"code"),e(1296,"/path/img.png"),t(),e(1297,`. A bare path fail
6965s 6966 silently. And the root is an `),n(1298,"code"),e(1299,"<a>"),t(),e(1300," with no "),n(1301,"code"),e(1302,"href"),t(),e(1303,` firing a 6967 `),n(1304,"code"),e(1305,"(click)"),t(),e(1306,`, so it is not keyboard-reachable \u2014 defect 7f. 6968 `),t(),e(1307,` 6969 `),t(),e(1308,` 6970 6971 `),n(1309,"div",63),e(1310,` 6972 `),k(1311,Ix,1,0,"ng-container",64),e(1312,` 6973 6974 `),n(1313,"app-sg-caption",7),e(1314,"game \xB7 practice \xB7 club \xB7 no type \xB7 multi-day \xB7 draft"),t(),e(1315,` 6975 `),n(1316,"div",75),e(1317,` 6976 `),c(1318,"app-calendar-card",76),e(1319,` 6977 `),c(1320,"app-calendar-card",76),e(1321,` 6978 `),c(1322,"app-calendar-card",76),e(1323,` 6979 `),c(1324,"app-calendar-card",77),e(1325,` 6980 `),c(1326,"app-calendar-card",76),e(1327,` 6981 `),c(1328,"app-calendar-card",78),e(1329,` 6982 `),t(),e(1330,` 6983 `),n(1331,"app-inline-alert",74),e(1332,` 6984 `),n(1333,"strong")(1334,"code"),e(1335,"endDate"),t(),e(1336," is required, despite not looking it."),t(),e(1337,` 6985 `),n(1338,"code"),e(1339,"ngOnInit"),t(),e(1340," runs it through "),n(1341,"code"),e(1342,"UtcDatePipe"),t(),e(1343,` unconditionally, and 6986 Angular's date conversion `),n(1344,"em"),e(1345,"throws"),t(),e(1346,` on an invalid date rather than returning null 6987 \u2014 so omitting `),n(1347,"code"),e(1348,"endDate"),t(),e(1349,` takes the whole view down. Pass 6988 `),n(1350,"code"),e(1351,'[endDate]="startDate"'),t(),e(1352,` for a single-day event, which is what all eight real 6989 call sites do. See defect 7d. 6990 `),t(),e(1353,` 6991 `),n(1354,"p",1),e(1355,` 6992 Also note `),n(1356,"code"),e(1357,"isMultidayEvent"),t(),e(1358," is computed once in "),n(1359,"code"),e(1360,"ngOnInit"),t(),e(1361,`, so a 6993 date that changes after init will not restack the badge. 6994 `),t(),e(1362,` 6995 `),t(),e(1363,` 6996 6997 `),n(1364,"div",63),e(1365,` 6998 `),k(1366,Mx,1,0,"ng-container",64),e(1367,` 6999 7000 `),n(1368,"app-inline-alert",26),e(1369,` 7001 `),n(1370,"strong"),e(1371,"This is the card-content case."),t(),e(1372,` The component renders a bare 7002 `),n(1373,"code"),e(1374,".row"),t(),e(1375,`. Both live consumers wrap it in 7003 `),n(1376,"code"),e(1377,'<div class="roster-card card">'),t(),e(1378,` \u2014 the two samples below are the 7004 same component with and without that wrapper, which is the whole distinction the table at 7005 the top of this section is about. 7006 `),t(),e(1379,` 7007 7008 `),n(1380,"app-sg-caption",59),e(1381,"wrapped, as both real consumers do \u2014 this is the intended look"),t(),e(1382,` 7009 `),n(1383,"div",5),e(1384,` 7010 `),n(1385,"div",6),e(1386,` 7011 `),n(1387,"div",79),e(1388,` 7012 `),n(1389,"app-roster-card-content",80),g("viewProfileButton",function(){return o.onAction("roster view profile")}),t(),e(1390,` 7013 `),t(),e(1391,` 7014 `),t(),e(1392,` 7015 `),n(1393,"div",6),e(1394,` 7016 `),n(1395,"app-sg-caption",59),e(1396,"unwrapped \u2014 no border, no padding, no shadow. Not a bug; it has no chrome."),t(),e(1397,` 7017 `),c(1398,"app-roster-card-content",81),e(1399,` 7018 `),t(),e(1400,` 7019 `),t(),e(1401,` 7020 `),n(1402,"p",1),e(1403,` 7021 Rows are driven entirely by `),n(1404,"code"),e(1405,"collegeProfileSettings.rosterFields"),t(),e(1406,` \u2014 these 7022 samples enable four. Pass no settings and the component renders `),n(1407,"em"),e(1408,"nothing at all"),t(),e(1409,`, 7023 because the whole template sits behind 7024 `),n(1410,"code"),e(1411,"@if (player && collegeProfileSettings)"),t(),e(1412,`. That guard makes it the 7025 best-behaved card component on this page when starved of inputs, and it is also the one 7026 carrying the two worst defects \u2014 7a and 7g. Guarding quality and correctness are 7027 independent. 7028 `),t(),e(1413,` 7029 `),t(),e(1414,` 7030 7031 `),n(1415,"div",63),e(1416,` 7032 `),k(1417,Dx,1,0,"ng-container",64),e(1418,` 7033
7034 `),n(1419,"app-sg-caption",45),e(1420,"full width by design \u2014 this is a page, not a panel"),t(),e(1421,` 7035 `),c(1422,"app-promo-card",82),e(1423,` 7036 `),t(),e(1424,` 7037 7038 `),n(1425,"div",83),e(1426,` 7039 `),k(1427,Fx,1,0,"ng-container",64),e(1428,` 7040 `),n(1429,"p",1),e(1430,` 7041 Not rendered. It needs a `),n(1431,"code"),e(1432,"PracticeFacilityClubAssign"),t(),e(1433,` from its own feature and 7042 is documented here only so the inventory is complete \u2014 the point of the entry is 7043 that you should not reach for it. 7044 `),t(),e(1434,` 7045 `),t(),e(1435,` 7046`),t(),e(1436,` 7047 7048`),n(1437,"div",2),e(1438,` 7049 `),n(1439,"h3"),e(1440,"5. Dashboard cards"),t(),e(1441,` 7050 `),n(1442,"p",1),e(1443,` 7051 `),n(1444,"code"),e(1445,"app-admin-dashboard-card"),t(),e(1446,` is the chrome every admin-dashboard and 7052 analytics-dashboard panel sits inside \u2014 header, settings affordance, filters strip, body, 7053 footer, plus the loading and error states. A panel that hand-rolls any of this is a migration 7054 target. 7055 `),t(),e(1447,` 7056 `),n(1448,"p",1),e(1449,` 7057 Every sample here is marked `),c(1450,"app-pill",84),e(1451,` \u2014 7058 this component has no member-side call sites, so its styling is fixed and no club theme reaches 7059 it. See `),n(1452,"a",85),e(1453,"admin vs member"),t(),e(1454,`. 7060 `),t(),e(1455,` 7061 7062 `),n(1456,"h4",4),e(1457,"5.1 Minimum"),t(),e(1458,` 7063 `),n(1459,"p",1),e(1460,` 7064 `),n(1461,"code"),e(1462,"panelTitle"),t(),e(1463,` plus projected body content. Everything else is optional. 7065 `),t(),e(1464,` 7066 7067 `),n(1465,"app-sg-caption",45),e(1466,'<app-admin-dashboard-card [panelTitle]="\u2026">'),t(),e(1467,` 7068 `),n(1468,"div",5),e(1469,` 7069 `),n(1470,"div",6),e(1471,` 7070 `),n(1472,"app-admin-dashboard-card",86),e(1473,` 7071 `),n(1474,"p",8),e(1475,"Body content is the default content projection slot."),t(),e(1476,` 7072 `),t(),e(1477,` 7073 `),t(),e(1478,` 7074 `),t(),e(1479,` 7075 7076 `),n(1480,"h4",4),e(1481,"5.2 Header"),t(),e(1482,` 7077 7078 `),n(1483,"app-sg-caption",45),e(1484,'[hasSettings]="true" (settingsClick) \u2014 the \u22EE affordance'),t(),e(1485,` 7079 `),n(1486,"div",5),e(1487,` 7080 `),n(1488,"div",6),e(1489,` 7081 `),n(1490,"app-admin-dashboard-card",87),g("settingsClick",function(){return o.onSettingsClick()}),e(1491,` 7082 `),n(1492,"p",8),e(1493,"The settings button only appears when "),n(1494,"code"),e(1495,"hasSettings"),t(),e(1496," is set."),t(),e(1497,` 7083 `),t(),e(1498,` 7084 `),t(),e(1499,` 7085 `),t(),e(1500,` 7086 7087 `),n(1501,"app-sg-caption",45),e(1502,"slot=titleSuffix \u2014 renders immediately after the title text"),t(),e(1503,` 7088 `),n(1504,"div",5),e(1505,` 7089 `),n(1506,"div",6),e(1507,` 7090 `),n(1508,"app-admin-dashboard-card",88),e(1509,` 7091 `),c(1510,"i",89),e(1511,` 7092 `),n(1512,"p",8),e(1513,"Use this for an info icon or a count that belongs to the title."),t(),e(1514,` 7093 `),t(),e(1515,` 7094 `),t(),e(1516,` 7095 `),t(),e(1517,` 7096 7097 `),n(1518,"app-sg-caption",45),e(1519,"slot=headerActions \u2014 trailing edge, alongside the settings button"),t(),e(1520,` 7098 `),n(1521,"div",5),e(1522,` 7099 `),n(1523,"div",6),e(1524,` 7100 `),n(1525,"app-admin-dashboard-card",90),g("settingsClick",function(){return o.onSettingsClick()}),e(1526,` 7101 `),n(1527,"button",91),g("click",function(){return o.onAction("header action")}),e(1528,` 7102 `),c(1529,"i",92),e(1530,`Refresh 7103 `),t(),e(1531,` 7104 `),n(1532,"p",8),e(1533,"Header actions render before the settings button in source order."),t(),e(1534,` 7105 `),t(),e(1535,` 7106 `),t(),e(1536,` 7107 `),t(),e(1537,` 7108 7109 `),n(1538,"h4",4),e(1539,"5.3 Filters & footer"),t(),e(1540,` 7110 7111 `),n(1541,"app-sg-caption",45),e(1542,"slot=filters \u2014 sits between the header and the body, outside bodyClass"),t(),e(1543,` 7112 `),n(1544,"div",5),e(1545,` 7113 `),n(1546,"div",6),e(1547,` 7114 `),n(1548,"app-admin-dashboard-card",93),e(1549,` 7115 `),n(1550,"div",94),e(1551,` 7116 `),n(1552,"label",95),e(1553,"Season"),t(),e(1554,` 7117 `),n(1555,"select",96),e(1556,` 7118 `),n(1557,"option"),e(1558,"Fall 2026"),t(),e(1559,` 7119 `),n(1560,"option"),e(1561,"Spring 2026"),t(),e(1562,` 7120 `),t(),e(1563,` 7121 `),t(),e(1564,` 7122 `),n(1565,"p",8),e(1566,"The filters strip is its own slot so it is never clipped by the body padding."),t(),e(1567,` 7123 `),t(),e(1568,` 7124 `),t(),e(1569,` 7125 `),t(),e(1570,` 7126 7127 `),n(1571,"app-sg-caption",45),e(1572,"slot=footer \u2014 below the body, outside bodyClass"),t(),e(1573,` 7128 `),n(1574,"div",5),e(1575,` 7129 `),n(1576,"div",6),e(1577,` 7130 `),n(1578,"app-admin-dashboard-card",97),e(1579,` 7131 `),n(1580,"p",8),e(1581,"Footer actions are links or buttons depending on whether they navigate."),t(),e(1582,` 7132 `),n(1583,"div",98),e(1584,` 7133 `),n(1585,"a",99),e(1586,"View details"),t(),e(1587,` 7134 `),n(1588,"button",25),g("click",function(){return o.onAction("footer action")}),e(1589,` 7135 Recalculate 7136 `),t(),e(1590,` 7137 `),t(),e(1591,` 7138 `),t(),e(1592,` 7139 `),t(),e(1593,` 7140 `),t(),e(1594,` 7141 7142 `),n(1595,"h4",4),e(1596,"5.4 States"),t(),e(1597,` 7143 `),n(1598,"p",1),e(1599,` 7144 A panel is not done until all three render correctly. The live toggle drives one card through 7145 every state \u2014 that is the fastest way to catch a header that disappears under loading or a 7146 footer that survives an error. 7147 `),t(),e(1600,` 7148 7149 `),n(1601,"app-sg-caption",45),e(1602,"Live \u2014 flip the states on one card"),t(),e(1603,` 7150 `),n(1604,"div",100),e(1605,` 7151 `),n(1606,"button",101),g("click",function(){return o.liveLoading=!o.liveLoading}),e(1607),t(),e(1608,` 7152 `),n(1609,"button",101),g("click",function(){return o.liveError=!o.liveError}),e(1610),t(),e(1611,` 7153 `),t(),e(1612,` 7154 `),n(1613,"div",5),e(1614,` 7155 `),n(1615,"div",6),e(1616,` 7156 `),n(1617,"app-admin-dashboard-card",102),g("settingsClick",function(){return o.onSettingsClick()}),e(1618,` 7157 `),n(1619,"p",8),e(1620,"Loaded content."),t(),e(1621,` 7158 `),n(1622,"div",98),e(1623,` 7159 `),n(1624,"a",99),e(1625,"View all"),t(),e(1626,` 7160 `),t(),e(1627,` 7161 `),t(),e(1628,` 7162 `),t(),e(1629,` 7163 `),t(),e(1630,` 7164 7165 `),n(1631,"app-sg-caption",45),e(1632,'[loading]="true" \u2014 the whole card is replaced by a skeleton'),t(),e(1633,` 7166 `),n(1634,"div",5),e(1635,` 7167 `),n(1636,"div",6),e(1637,` 7168 `),n(1638,"app-admin-dashboard-card",103),e(1639,` 7169 `),n(1640,"p",8),e(1641,"Never rendered while loading."),t(),e(1642,` 7170 `),t(),e(1643,` 7171 `),t(),e(1644,` 7172 `),t(),e(1645,` 7173 7174 `),n(1646,"app-sg-caption",45),e(1647,'[error]="true" \u2014 chrome stays, body is replaced by an inline alert'),t(),e(1648,` 7175 `),n(1649,"div",5),e(1650,` 7176 `),n(1651,"div",6),e(1652,` 7177 `),n(1653,"app-admin-dashboard-card",104),e(1654,` 7178 `),n(1655,"p",8),e(1656,"Never rendered while errored."),t(),e(1657,` 7179 `),t(),e(1658,` 7180 `),t(),e(1659,` 7181 `),n(1660,"div",6),e(1661,` 7182 `),n(1662,"app-admin-dashboard-card",105),e(1663,` 7183 `),n(1664,"p",8),e(1665,"Never rendered while errored."),t(),e(1666,` 7184 `),t(),e(1667,` 7185 `),t(),e(1668,` 7186 `),t(),e(1669,` 7187 7188 `),n(1670,"h4",4),e(1671,"5.5 Sizing hooks"),t(),e(1672,` 7189 7190 `),n(1673,"app-sg-caption",45),e(1674,"[skeletonHeight] \u2014 default is 400px; match it to the loaded body"),t(),e(1675,` 7191 `),n(1676,"div",5),e(1677,` 7192 `),n(1678,"div",54),e(1679,` 7193 `),n(1680,"app-admin-dashboard-card",106),e(1681,` 7194 `),c(1682,"p",8),e(1683,` 7195 `),t(),e(1684,` 7196 `),t(),e(1685,` 7197 `),n(1686,"div",54),e(1687,` 7198 `),n(1688,"app-admin-dashboard-card",107),e(1689,` 7199 `),c(1690,"p",8),e(1691,` 7200 `),t(),e(1692,` 7201 `),t(),e(1693,` 7202 `),t(),e(1694,` 7203 7204 `),n(1695,"app-sg-caption",45),e(1696,'[bodyClass] \u2014 replaces the default "card-body" wrapper class'),t(),e(1697,` 7205 `),n(1698,"div",5),e(1699,` 7206 `),n(1700,"div",6),e(1701,` 7207 `),n(1702,"app-admin-dashboard-card",108),e(1703,`
7208 `),n(1704,"p",8),e(1705,"No "),n(1706,"code"),e(1707,"card-body"),t(),e(1708," padding \u2014 for a table that should meet the card edge."),t(),e(1709,` 7209 `),t(),e(1710,` 7210 `),t(),e(1711,` 7211 `),t(),e(1712,` 7212 7213 `),n(1713,"app-sg-caption",45),e(1714,"[styleClass] \u2014 extra classes on the .card element itself"),t(),e(1715,` 7214 `),n(1716,"div",5),e(1717,` 7215 `),n(1718,"div",6),e(1719,` 7216 `),n(1720,"app-admin-dashboard-card",109),e(1721,` 7217 `),n(1722,"p",8),e(1723,"Used when a card has to match the height of its row neighbor."),t(),e(1724,` 7218 `),t(),e(1725,` 7219 `),t(),e(1726,` 7220 `),t(),e(1727,` 7221 7222 `),n(1728,"h4",4),e(1729,"5.6 Naming gotcha"),t(),e(1730,` 7223 `),n(1731,"app-inline-alert",26),e(1732,` 7224 The title input is `),n(1733,"code"),e(1734,"panelTitle"),t(),e(1735,", not "),n(1736,"code"),e(1737,"title"),t(),e(1738,`. A static 7225 `),n(1739,"code"),e(1740,'title="\u2026"'),t(),e(1741,` would also land on the host element as the native HTML attribute and 7226 the browser's own tooltip would cover any PrimeNG tooltip inside the card. 7227 `),t(),e(1742,` 7228 7229 `),n(1743,"p",110),e(1744,"Last action: "),n(1745,"strong"),e(1746),t()(),e(1747,` 7230`),t(),e(1748,` 7231 7232`),n(1749,"div",2),e(1750,` 7233 `),n(1751,"h3"),e(1752,"6. Known divergences"),t(),e(1753,` 7234 `),n(1754,"p",1),e(1755,` 7235 Where the system disagrees with itself. Cosmetic or structural \u2014 none of these is a bug. 7236 Counts are a grep snapshot taken `),n(1756,"strong"),e(1757),t(),e(1758,` and drift. 7237 `),t(),e(1759,` 7238 7239 `),n(1760,"h4",111),e(1761,"6a. Spacing fights the base"),t(),e(1762,` 7240 `),n(1763,"p",1),e(1764,` 7241 `),n(1765,"code"),e(1766,".card"),t(),e(1767," already sets "),n(1768,"code"),e(1769,"margin: 0 0 1rem 0"),t(),e(1770,", yet "),n(1771,"strong"),e(1772,"20 files"),t(),e(1773,` 7242 add `),n(1774,"code"),e(1775,"mb-4"),t(),e(1776," and "),n(1777,"strong"),e(1778,"17"),t(),e(1779," add "),n(1780,"code"),e(1781,"mb-3"),t(),e(1782,`. 37 files overriding a 7243 default that already exists. 7244 `),t(),e(1783,` 7245 7246 `),n(1784,"h4",111),e(1785,"6b. Padding fights the base"),t(),e(1786,` 7247 `),n(1787,"p",1),e(1788,` 7248 `),n(1789,"code"),e(1790,".card"),t(),e(1791," sets "),n(1792,"code"),e(1793,"padding: 1rem"),t(),e(1794,"; "),n(1795,"strong"),e(1796,"85 occurrences"),t(),e(1797,` override 7249 it \u2014 `),n(1798,"code"),e(1799,"p-0"),t(),e(1800," \xD713, plus "),n(1801,"code"),e(1802,"pb-0"),t(),e(1803,", "),n(1804,"code"),e(1805,"pt-0 pb-0"),t(),e(1806,`, 7250 `),n(1807,"code"),e(1808,"p-4"),t(),e(1809,", "),n(1810,"code"),e(1811,"py-1"),t(),e(1812,`. When that many call sites reject a default, the default 7251 is wrong for a meaningful share of uses. 7252 `),t(),e(1813,` 7253 7254 `),n(1814,"h4",111),e(1815,"6c. Three radius sources"),t(),e(1816,` 7255 `),n(1817,"table",112),e(1818,` 7256 `),n(1819,"thead")(1820,"tr")(1821,"th"),e(1822,"Where"),t(),n(1823,"th"),e(1824,"Value"),t()()(),e(1825,` 7257 `),n(1826,"tbody"),e(1827,` 7258 `),S(1828,Px,12,4,null,null,t0),t(),e(1830,` 7259 `),t(),e(1831,` 7260 `),n(1832,"p",1),e(1833,` 7261 Only the first follows the token. The other two will not move when a club theme changes 7262 `),n(1834,"code"),e(1835,"--theme-card-radius"),t(),e(1836,". A fourth source, "),n(1837,"code"),e(1838,".card-shadow"),t(),e(1839,`'s hardcoded 7263 `),n(1840,"code"),e(1841,"8px"),t(),e(1842,`, was deleted with the dead flavors \u2014 see 6f. 7264 `),t(),e(1843,` 7265 7266 `),n(1844,"h4",111),e(1845,"6d. "),n(1846,"code"),e(1847,".table-card"),t(),e(1848," is a sibling, not a modifier"),t(),e(1849,` 7267 `),n(1850,"p",1),e(1851,` 7268 It sits in the same selector list as `),n(1852,"code"),e(1853,".card"),t(),e(1854,`, so it works standalone \u2014 both 7269 samples in 3b are identical. But `),n(1855,"strong"),e(1856,"12 files"),t(),e(1857,` write 7270 `),n(1858,"code"),e(1859,'class="card table-card"'),t(),e(1860,`, which reads like a modifier and applies the same 7271 declarations twice. Harmless; conceptually wrong. 7272 `),t(),e(1861,` 7273 7274 `),n(1862,"h4",111),e(1863,"6e. The CSS does not enforce the coupling it implies"),t(),e(1864,` 7275 `),n(1865,"p",1),e(1866,` 7276 Nine flavors are standalone rules that apply to any element; three are nested inside the base 7277 rule and are inert without `),n(1867,"code"),e(1868,".card"),t(),e(1869,`. The names are shaped identically either way, so 7278 the `),n(1870,"em"),e(1871,"Needs "),n(1872,"code"),e(1873,".card"),t()(),e(1874,` column in 3a is the only place the difference is visible. 7279 Six of the nine standalone ones are `),n(1875,"strong"),e(1876,"never"),t(),e(1877," used without "),n(1878,"code"),e(1879,".card"),t(),e(1880,` in 7280 practice \u2014 they are card flavors whose CSS just does not say so. 7281 `),t(),e(1881,` 7282 7283 `),n(1882,"h5",111),e(1883,"Should the standalone ones be nested into "),n(1884,"code"),e(1885,".card"),t(),e(1886,"?"),t(),e(1887,` 7284 `),n(1888,"p",1),e(1889),n(1890,"strong"),e(1891,"not as a sweep."),t(),e(1892,` It would enforce a 7285 coupling that is already true in practice, and two separate things block
7285it. 7286 `),t(),e(1893,` 7287 `),n(1894,"p",1),e(1895,` 7288 `),n(1896,"strong"),e(1897,"One \u2014 three of them really are used off-card,"),t(),e(1898,` so nesting breaks them 7289 outright. `),n(1899,"code"),e(1900,"horizontal-form"),t(),e(1901," (75 off-card vs 41 on), "),n(1902,"code"),e(1903,"edit-card"),t(),e(1904,` 7290 (3, all `),n(1905,"code"),e(1906,'class="message-groups edit-card p-0"'),t(),e(1907,"), "),n(1908,"code"),e(1909,"video-card"),t(),e(1910,` (1 of its 2, 7291 `),n(1911,"code"),e(1912,'class="video-card cursor-pointer"'),t(),e(1913,"). See the "),n(1914,"em"),e(1915,"Used without it"),t(),e(1916,` column. 7292 `),t(),e(1917,` 7293 `),n(1918,"p",1),e(1919,` 7294 `),n(1920,"strong"),e(1921,"Two \u2014 nesting raises specificity from "),n(1922,"code"),e(1923,"0,1,0"),t(),e(1924," to "),n(1925,"code"),e(1926,"0,2,0"),t(),e(1927,`, 7295 and existing overrides flip.`),t(),e(1928," The clearest case is a "),n(1929,"em"),e(1930,"global"),t(),e(1931,` 7296 `),n(1932,"code"),e(1933,".blog-card"),t(),e(1934," rule in "),n(1935,"code"),e(1936,"cms/pb-blog.scss:9"),t(),e(1937,` setting border, width and 7297 flex-basis: it wins on source order today and would start losing to a nested 7298 `),n(1938,"code"),e(1939,".card.blog-card"),t(),e(1940,`, silently changing blog-roll layout. Component-scoped overrides 7299 are less exposed \u2014 Angular's emulated encapsulation appends 7300 `),n(1941,"code"),e(1942,"[_ngcontent-x]"),t(),e(1943,", putting them at "),n(1944,"code"),e(1945,"0,2,0"),t(),e(1946,` already, so those stay a 7301 source-order tie. 7302 `),t(),e(1947,` 7303 `),n(1948,"p",1),e(1949,` 7304 So usage-cleanliness and specificity-safety are `),n(1950,"em"),e(1951,"different"),t(),e(1952,` tests, and 7305 `),n(1953,"code"),e(1954,"blog-card"),t(),e(1955,` passes the first while failing the second. Only 7306 `),n(1956,"code"),e(1957,"settings-card"),t(),e(1958,", "),n(1959,"code"),e(1960,"team-card"),t(),e(1961,", "),n(1962,"code"),e(1963,"admin-card"),t(),e(1964,` and 7307 `),n(1965,"code"),e(1966,"filters-card"),t(),e(1967,` clear both. If nesting is ever wanted, do it one class at a time with 7308 eyes on the affected surface \u2014 never as a batch. 7309 `),t(),e(1968,` 7310 7311 `),n(1969,"h5",111),e(1970,"Would BEM naming ("),n(1971,"code"),e(1972,".card--edit"),t(),e(1973,") be better?"),t(),e(1974,` 7312 `),n(1975,"p",1),e(1976,` 7313 In the abstract yes: `),n(1977,"code"),e(1978,'class="card card--edit"'),t(),e(1979,` states the coupling, and it 7314 namespaces generic names like `),n(1980,"code"),e(1981,".edit-card"),t(),e(1982," and "),n(1983,"code"),e(1984,".team-card"),t(),e(1985,` which 7315 currently sit in the global namespace where anything can collide with them. 7316 `),t(),e(1986,` 7317 `),n(1987,"p",1),e(1988,` 7318 `),n(1989,"strong"),e(1990,`But the useful half of BEM here is the nesting, not the name, and they are 7319 separable.`),t(),e(1991," "),n(1992,"code"),e(1993,".card--accented"),t(),e(1994,` proved it \u2014 perfect BEM naming, written 7320 standalone, modified nothing. A name that `),n(1995,"em"),e(1996,"says"),t(),e(1997,` modifier without a selector that 7321 `),n(1998,"em"),e(1999,"enforces"),t(),e(2e3,` it is decoration. Renaming would touch roughly 200 template files for zero 7322 behaviour change; nesting touches no templates and actually enforces. Since nesting is itself 7323 not recommended above, `),n(2001,"strong"),e(2002,`the standing decision is to change neither and document 7324 both`),t(),e(2003,` \u2014 which is what this section is. 7325 `),t(),e(2004,` 7326 7327 `),n(2005,"h4",111),e(2006),t(),e(2007,` 7328 `),n(2008,"p",1),e(2009,` 7329 Seven card selectors were defined in SCSS with `),n(2010,"strong"),e(2011,"zero"),t(),e(2012,` usages anywhere and have 7330 been deleted: flavors `),n(2013,"code"),e(2014,"card--accented"),t(),e(2015,", "),n(2016,"code"),e(2017,"card-shadow"),t(),e(2018,`, 7331 `),n(2019,"code"),e(2020,"image-header"),t(),e(2021,", "),n(2022,"code"),e(2023,"club-network-card"),t(),e(2024," and "),n(2025,"code"),e(2026,"view-only-card"),t(),e(2027,`, and 7332 slots `),n(2028,"code"),e(2029,"card-action"),t(),e(2030," and "),n(2031,"code"),e(2032,"card-body-head"),t(),e(2033,`. 7333 `),t(),e(2034,` 7334 `),n(2035,"p",1),e(2036,` 7335 Two things were checked first, and both are the reason this was safe rather than lucky. 7336 `),n(2037,"strong"),e(2038,"One:"),t(),e(2039," "),n(2040,"code"),e(2041,"view-only-card"),t(),e(2042,` shared its rule block with 7337 `),n(2043,"code"),e(2044,"edit-card"),t(),e(2045," and "),n(2046,"code"),e(2047,"settings-card"),t(),e(2048,", so only its "),n(2049,"em"),e(2050,"selector"),t(),e(2051,` came out 7338 \u2014 the rule is load-bearing and still applies to its two live siblings. 7339 `),n(2052,"strong"),e(2053,"Two:"),t(),e(2054," "),n(2055,"code"),e(2056,".card-shadow"),t(),e(2057,` the class is unrelated to 7340 `),n(2058,"code"),e(2059,"--theme-card-shadow"),t(),e(2060,` the token; the class is gone, the token is live and drives 7341 every card's shadow. Deleting a name that merely resembles a live one is the easy mistake here. 7342 `),t(),e(2061,` 7343 `),n(2062,"p",1),e(2063,` 7344 Searched before deleting: every `),n(2064,"code"),e(2065,".html"),t(),e(2066,", "),n(2067,"code"),e(2068,".ts"),t(),e(2069,", "),n(2070,"code"),e(2071,".cs"),t(),e(2072,`, 7345 `),n(2073,"code"),e(2074,".cshtml"),t(),e(2075,", "),n(2076,"code"),e(2077,".sql"),t(),e(2078," and "),n(2079,"code"),e(2080,".json"),t(),e(2081,` in the repo, on the bare token 7346 rather than `),n(2082,"code"),e(2083,'class="\u2026"'),t(),e(2084,", plus "),n(2085,"code"),e(2086,"@extend"),t(),e(2087,` across all SCSS. The one thing 7347 no search can reach is `),n(2088,"strong"),e(2089,"club-authored CMS content in the database"),t(),e(2090,` \u2014 if a 7348 club's saved page HTML references one of these classes, it loses that styling silently. 7349 `),n(2091,"code"),e(2092,"image-header"),t(),e(2093," and "),n(2094,"code"),e(2095,"club-net
7349work-card"),t(),e(2096,` are the two where that is even 7350 plausible. 7351 `),t(),e(2097,` 7352`),t(),e(2098,` 7353 7354`),n(2099,"div",2),e(2100,` 7355 `),n(2101,"h3"),e(2102,"7. Defects"),t(),e(2103,` 7356 `),n(2104,"p",1),e(2105,` 7357 Things that are wrong, not merely inconsistent, roughly in severity order. Counts are a grep 7358 snapshot taken `),n(2106,"strong"),e(2107),t(),e(2108,` and drift. 7359 `),t(),e(2109,` 7360 7361 `),n(2110,"h4",111),e(2111,"7a. "),n(2112,"code"),e(2113,"app-roster-card-content"),t(),e(2114," renders player-supplied HTML unsanitized, on public pages"),t(),e(2115,` 7362 `),n(2116,"app-inline-alert",113),e(2117,` 7363 `),n(2118,"strong"),e(2119,"Highest-severity defect in the card family."),t(),e(2120,` A player-entered value reaches 7364 `),n(2121,"code"),e(2122,"bypassSecurityTrustHtml"),t(),e(2123,` without escaping, on routes any visitor can load. 7365 `),t(),e(2124,` 7366 `),n(2125,"ol",114),e(2126,` 7367 `),n(2127,"li"),e(2128,` 7368 A player edits their own college profile. `),n(2129,"code"),e(2130,"Twitter"),t(),e(2131,", "),n(2132,"code"),e(2133,"Instagram"),t(),e(2134,` and 7369 `),n(2135,"code"),e(2136,"School"),t(),e(2137," are "),n(2138,"code"),e(2139,"[MaxLength(250)]"),t(),e(2140,` free text with 7370 `),n(2141,"strong"),e(2142,"no format validation"),t(),e(2143,` \u2014 no regex, no allow-list 7371 (`),n(2144,"code"),e(2145,"SprocketSports.ViewModels/Shared/PlayerCollegeData.cs"),t(),e(2146,`). 7372 `),t(),e(2147,` 7373 `),n(2148,"li"),e(2149,` 7374 `),n(2150,"code"),e(2151,"getTwitter()"),t(),e(2152,` interpolates that value into an HTML anchor string with 7375 `),n(2153,"strong"),e(2154,"no escaping"),t(),e(2155,". "),n(2156,"code"),e(2157,"getInstagram()"),t(),e(2158,` is the same shape. 7376 `),n(2159,"code"),e(2160,"getHighlightVideo()"),t(),e(2161," gates on "),n(2162,"code"),e(2163,"startsWith('http')"),t(),e(2164,` but still 7377 interpolates unescaped into an `),n(2165,"code"),e(2166,"href"),t(),e(2167,`, so an attribute break-out survives the gate. 7378 `),t(),e(2168,` 7379 `),n(2169,"li"),e(2170,` 7380 The template renders those strings through the `),n(2171,"code"),e(2172,"safeHtml"),t(),e(2173,` pipe, which is 7381 `),n(2174,"code"),e(2175,"bypassSecurityTrustHtml"),t(),e(2176,` and nothing else \u2014 a deliberate instruction to 7382 Angular to skip sanitization. 7383 `),t(),e(2177,` 7384 `),n(2178,"li"),e(2179,` 7385 `),n(2180,"code"),e(2181,"app-roster-card-content"),t(),e(2182," renders on "),n(2183,"strong"),e(2184,"public"),t(),e(2185,` routes: 7386 `),n(2186,"code"),e(2187,"team-overview/roster/"),t(),e(2188,", "),n(2189,"code"),e(2190,"college-profile/team/"),t(),e(2191,`, and the 7387 page-builder `),n(2192,"code"),e(2193,"college-recruiting-content"),t(),e(2194,`. 7388 `),t(),e(2195,` 7389 `),t(),e(2196,` 7390 `),n(2197,"p",1),e(2198,` 7391 `),n(2199,"strong"),e(2200,"The tell that this is a bug and not a policy:"),t(),e(2201,` the same component renders 7392 `),n(2202,"code"),e(2203,"School"),t(),e(2204," through plain "),n(2205,"code"),e(2206,"[innerHTML]"),t(),e(2207," "),n(2208,"em"),e(2209,"without"),t(),e(2210,` 7393 `),n(2211,"code"),e(2212,"safeHtml"),t(),e(2213,` \u2014 so Angular sanitizes that one. One component, two treatments of 7394 equally untrusted data. 7395 `),t(),e(2214,` 7396 `),n(2215,"p",1),e(2216,` 7397 `),n(2217,"strong"),e(2218,"Fix:"),t(),e(2219," stop building HTML in TypeScript. Bind "),n(2220,"code"),e(2221,"[href]"),t(),e(2222,` (which runs 7398 through Angular's URL sanitizer) and `),n(2223,"code"),e(2224),t(),e(2225,` (which escapes) in the 7399 template, and `),n(2226,"code"),e(2227,"safeHtml"),t(),e(2228," is not needed. "),n(2229,"code"),e(2230,"getTwitter(showString = false)"),t(),e(2231,` 7400 already returns the bare handle, so half the work exists. Add `),n(2232,"code"),e(2233,'rel="noopener"'),t(),e(2234,` 7401 while in there. 7402 `),t(),e(2235,` 7403 7404 `),n(2236,"h4",111),e(2237,"7b. "),n(2238,"code"),e(2239,"overflow: hidden"),t(),e(2240," on the base clips overlays"),t(),e(2241,` 7405 `),n(2242,"app-inline-alert",74),e(2243,` 7406 Any PrimeNG dropdown, datepicker or multiselect rendered inside a card is clipped at the card 7407 edge unless it appends to body. `),n(2244,"strong"),e(2245,`Do not \u201Cfix\u201D this by removing 7408 `),n(2246,"code"),e(2247,"overflow: hidden"),t()(),e(2248,` \u2014 it is load-bearing for radius clipping on 7409 image headers and video cards. The fix stays `),n(2249,"code"),e(2250,'appendTo="body"'),t(),e(2251,` at the overlay. 7410 `),t(),e(2252,` 7411 `),n(2253,"p",115),e(2254,` 7412 Same root cause as the appendTo-body audits. Stated here because the card is where the 7413 clipping originates. 7414 `),t(),e(2255,` 7415 7416 `),n(2256,"h4",111),e(2257,"7c. "),n(2258,"code"),e(2259,".card-body"),t(),e(2260," has no base rule \u2014 and 89 files write it"),t(),e(2261,` 7417 `),n(2262,"p",1),e(2263,` 7418 There is no global `),n(2264,"code"),e(2265,".card-body"),t(),e(2266,` declaration anyw
7418here. It is styled only 7419 `),n(2267,"em"),e(2268,"inside"),t(),e(2269," "),n(2270,"code"),e(2271,".edit-card"),t(),e(2272,", "),n(2273,"code"),e(2274,".team-card"),t(),e(2275,", "),n(2276,"code"),e(2277,".admin-card"),t(),e(2278,` 7420 and a dozen component stylesheets. On a plain `),n(2279,"code"),e(2280,".card"),t(),e(2281,` it does nothing, so the 89 7421 files that write it are relying on a hook that may or may not resolve. `),n(2282,"code"),e(2283,".card-title"),t(),e(2284,` 7422 is worse: `),n(2285,"strong"),e(2286,"zero rules in the entire app"),t(),e(2287,`, 10 files using it \u2014 those are 7423 expecting Bootstrap, which is not loaded. 7424 `),t(),e(2288,` 7425 7426 `),n(2289,"h4",111),e(2290,"7d. "),n(2291,"code"),e(2292,"app-calendar-card"),t(),e(2293," throws when "),n(2294,"code"),e(2295,"endDate"),t(),e(2296," is omitted"),t(),e(2297,` 7427 `),n(2298,"p",1),e(2299,` 7428 `),n(2300,"code"),e(2301,"ngOnInit"),t(),e(2302,` does 7429 `),n(2303,"code"),e(2304,"new Date(utcDatePipe.transform(new Date(this.endDate)))"),t(),e(2305,` with no guard. With 7430 `),n(2306,"code"),e(2307,"endDate"),t(),e(2308," undefined that reaches Angular's "),n(2309,"code"),e(2310,"toDate"),t(),e(2311,`, which 7431 `),n(2312,"strong"),e(2313,"throws "),n(2314,"code"),e(2315,"RuntimeError 2311"),t()(),e(2316,` rather than returning null \u2014 so 7432 the whole view fails, not just the badge. The input is not marked required and nothing in the 7433 signature warns you; all eight real call sites happen to pass it, which is why this has never 7434 been hit in the product. Either default `),n(2317,"code"),e(2318,"endDate"),t(),e(2319," to "),n(2320,"code"),e(2321,"startDate"),t(),e(2322,` or
7435 guard the pipe call. Separately, `),n(2323,"code"),e(2324,"isMultidayEvent"),t(),e(2325,` is computed once in 7436 `),n(2326,"code"),e(2327,"ngOnInit"),t(),e(2328,`, so a later date change never restacks the badge. 7437 `),t(),e(2329,` 7438 7439 `),n(2330,"h4",111),e(2331,"7e. "),n(2332,"code"),e(2333,"app-promo-card"),t(),e(2334," throws when "),n(2335,"code"),e(2336,"features"),t(),e(2337," is omitted"),t(),e(2338,` 7440 `),n(2339,"p",1),e(2340,` 7441 The template reads `),n(2341,"code"),e(2342,"features.length"),t(),e(2343,` unguarded in one place and 7442 `),n(2344,"code"),e(2345,"features?.length"),t(),e(2346,` in two others. The unguarded read wins, so omitting 7443 `),n(2347,"code"),e(2348,"[features]"),t(),e(2349," throws. Same fix either way \u2014 default it to "),n(2350,"code"),e(2351,"[]"),t(),e(2352,`. 7444 `),t(),e(2353,` 7445 7446 `),n(2354,"h4",111),e(2355,"7f. "),n(2356,"code"),e(2357,"app-blog-card"),t(),e(2358," uses an anchor as a button"),t(),e(2359,` 7447 `),n(2360,"p",1),e(2361,` 7448 Its root is `),n(2362,"code"),e(2363,"a.card.blog-card"),t(),e(2364," with "),n(2365,"strong"),e(2366,"no "),n(2367,"code"),e(2368,"href"),t()(),e(2369,`, firing a 7449 `),n(2370,"code"),e(2371,"(click)"),t(),e(2372,` output. That is not keyboard-focusable and announces as a link that goes 7450 nowhere. `),n(2373,"code"),e(2374,".clickable-card"),t(),e(2375,` already exists as the sanctioned pattern \u2014 7451 semantics pick the element (navigation \u2192 anchor with an href, on-screen action \u2192 7452 button), and the class supplies only the look. 7453 `),t(),e(2376,` 7454 7455 `),n(2377,"h4",111),e(2378,"7g. "),n(2379,"code"),e(2380,"app-roster-card-content"),t(),e(2381,"'s mobile badge has an invalid background colour"),t(),e(2382,` 7456 `),n(2383,"p",1),e(2384,` 7457 The same \u201CCommitted\u201D badge is rendered twice and the two bindings disagree by a 7458 `),n(2385,"code"),e(2386,"#"),t(),e(2387,`: 7459 `),t(),e(2388,` 7460 `),n(2389,"table",116),e(2390,` 7461 `),n(2391,"thead")(2392,"tr")(2393,"th"),e(2394,"Rendering"),t(),n(2395,"th"),e(2396,"Binding"),t(),n(2397,"th"),e(2398,"Result"),t()()(),e(2399,` 7462 `),n(2400,"tbody"),e(2401,` 7463 `),n(2402,"tr"),e(2403,` 7464 `),n(2404,"td"),e(2405,"desktop ("),n(2406,"code"),e(2407,"d-none d-sm-block"),t(),e(2408,")"),t(),e(2409,` 7465 `),n(2410,"td")(2411,"code"),e(2412,'[style.backgroundColor]="bgColor"'),t()(),e(2413,` 7466 `),n(2414,"td")(2415,"code"),e(2416,"#003261"),t(),e(2417," \u2713"),t(),e(2418,` 7467 `),t(),e(2419,` 7468 `),n(2420,"tr"),e(2421,` 7469 `),n(2422,"td"),e(2423,"mobile ("),n(2424,"code"),e(2425,"d-block d-sm-none"),t(),e(2426,")"),t(),e(2427,` 7470 `),n(2428,"td")(2429,"code"),e(2430,`[style.backgroundColor]="'#' + bgColor"`),t()(),e(2431,` 7471 `),n(2432,"td",13)(2433,"code"),e(2434,"##003261"),t(),e(2435," \u2014 invalid, no background"),t(),e(2436,` 7472 `),t(),e(2437,` 7473 `),t(),e(2438,` 7474 `),t(),e(2439,` 7475 `),n(2440,"p",1),e(2441,` 7476 `),n(2442,"code"),e(2443,"bgColor"),t(),e(2444," is "),n(2445,"code"),e(2446,"#rrggbb"),t(),e(2447,": its own default is "),n(2448,"code"),e(2449,"'#003261'"),t(),e(2450,`, it is 7477 fed from `),n(2451,"code"),e(2452,"theme.colorPrimary"),t(),e(2453,` which is used elsewhere as a raw CSS value, and 7478 `),n(2454,"code"),e(2455,"contrastChecker"),t(),e(2456,` \u2014 which this component calls on it \u2014 requires 7479 `),n(2457,"code"),e(2458,"length === 7"),t(),e(2459,`. So the desktop binding is right and the mobile one is broken, which 7480 is the harder of the two to notice. One-character fix. 7481 `),t(),e(2460,` 7482 7483 `),n(2461,"h4",111),e(2462,"7h. "),n(2463,"code"),e(2464,"app-roster-card-content"),t(),e(2465," fires an HTTP request per card and discards the result"),t(),e(2466,` 7484 `),n(2467,"p",1),e(2468,` 7485 When `),n(2469,"code"),e(2470,"player.hasPhoto"),t(),e(2471," is true, "),n(2472,"code"),e(2473,"ngOnInit"),t(),e(2474,` calls 7486 `),n(2475,"code"),e(2476,"getUserPhotoBase64Data()"),t(),e(2477," and assigns the result to "),n(2478,"code"),e(2479,"imageUrl"),t(),e(2480,`. 7487 `),n(2481,"strong")(2482,"code"),e(2483,"imageUrl"),t(),e(2484," is never read"),t(),e(2485,` \u2014 the photo slot renders 7488 `),n(2486,"code"),e(2487,"<ng-content>"),t(),e(2488,` projected by the consumer instead. A 30-player roster fires 30 7489 photo fetches whose results are thrown away. 7490 `),t(),e(2489,` 7491 `),n(2490,"p",1),e(2491,` 7492 Same component, more dead weight: `),n(2492,"code"),e(2493,"hideHeight"),t(),e(2494,` and 7493 `),n(2495,"code"),e(2496,"hidePlayerCellPhone"),t(),e(2497,` are inputs with zero template references (only the 7494 commented-out call site passes them), and `),n(2498,"code"),e(2499,"playerHe
7494ight()"),t(),e(2500,`, 7495 `),n(2501,"code"),e(2502,"getEmail()"),t(),e(2503,", "),n(2504,"code"),e(2505,"viewProfile()"),t(),e(2506,", "),n(2507,"code"),e(2508,"loading"),t(),e(2509,`, 7496 `),n(2510,"code"),e(2511,"showProfileModal"),t(),e(2512," and "),n(2513,"code"),e(2514,"selectedPlayer"),t(),e(2515,` are all unreferenced by the 7497 template. 7498 `),t(),e(2516,` 7499 7500 `),n(2517,"h4",111),e(2518,"7i. "),n(2519,"code"),e(2520,"app-roster-card-content"),t(),e(2521," is card content, not a card \u2014 "),n(2522,"strong"),e(2523,"resolved"),t()(),e(2524,` 7501 `),n(2525,"p",1),e(2526,` 7502 Its root element is a bare `),n(2527,"code"),e(2528,".row"),t(),e(2529,`. That is not itself wrong \u2014 see the 7503 three-kinds table in section 4 \u2014 but the old name, `),n(2530,"code"),e(2531,"app-roster-card"),t(),e(2532,`, said 7504 card, so consumers had to discover the distinction by reading the template. Renamed to 7505 `),n(2533,"strong")(2534,"code"),e(2535,"app-roster-card-content"),t()(),e(2536,` with the component-library 7506 reorganization. Both live consumers already wrapped it correctly, so no call-site behaviour 7507 changed. The `),n(2537,"code"),e(2538,".roster-card"),t(),e(2539,` CSS class is untouched \u2014 it belongs to the 7508 consumer's wrapper, not the component. 7509 `),t(),e(2540,` 7510 7511 `),n(2541,"h4",111),e(2542,"7j. Three competing shadows, one of them hardcoded"),t(),e(2543,` 7512 `),n(2544,"table",112),e(2545,` 7513 `),n(2546,"thead")(2547,"tr")(2548,"th"),e(2549,"Where"),t(),n(2550,"th"),e(2551,"Value"),t()()(),e(2552,` 7514 `),n(2553,"tbody"),e(2554,` 7515 `),S(2555,Ax,12,4,null,null,t0),t(),e(2557,` 7516 `),t(),e(2558,` 7517 `),n(2559,"p",1),e(2560,` 7518 The `),n(2561,"code"),e(2562,".dashboard-card"),t(),e(2563,` value bypasses the token layer entirely and will not follow 7519 a theme change. 7520 `),t(),e(2564,` 7521 7522 `),n(2565,"h4",111),e(2566,"7k. "),n(2567,"code"),e(2568,"--base-header: var(--blue-1000)"),t(),e(2569," on every card"),t(),e(2570,` 7523 `),n(2571,"p",1),e(2572,` 7524 Declared on the base for every card in the app. Whether that is the intended blue is studied 7525 in `),n(2573,"a",85),e(2574,"blues & links"),t(),e(2575,`, where 7526 it turns out to be one of several unrelated blues. 7527 `),t(),e(2576,` 7528`),t(),e(2577,` 7529 7530`),n(2578,"div",2),e(2579,` 7531 `),n(2580,"h3"),e(2581,"8. "),n(2582,"code"),e(2583,"app-teaser-card"),t(),e(2584," \u2014 the list-row card"),t(),e(2585,` 7532 `),n(2586,"p",1),e(2587,` 7533 The newest card, and the only one that is `),n(2588,"strong"),e(2589,"deliberately half a thing"),t(),e(2590,`. It owns 7534 the `),n(2591,"code"),e(2592,".card"),t(),e(2593,` chrome and a flush image rail; the row that sits beside the rail is a 7535 separate CSS contract called `),n(2594,"strong")(2595,"code"),e(2596,"list-row"),t()(),e(2597,` 7536 (`),n(2598,"code"),e(2599,"3_modules/components/list-row.scss"),t(),e(2600,`). Two pieces because the row has to work 7537 inside a raw `),n(2601,"code"),e(2602,".card"),t(),e(2603,` too \u2014 the roster pages use it without any card component. 7538 Full write-up: `),n(2604,"code"),e(2605,"docs/ui-migration-and-review/**/Result-Row-CSS-Contract.md"),t(),e(2606,`. 7539 `),t(),e(2607,` 7540 `),n(2608,"app-inline-alert",74),e(2609,` 7541 `),n(2610,"strong"),e(2611,"One live consumer, nothing eyeballed."),t(),e(2612,` Only the programs search page uses this, 7542 and no permutation below has been visually confirmed by a human. Three inputs 7543 (`),n(2613,"code"),e(2614,"mobileFull"),t(),e(2615,", "),n(2616,"code"),e(2617,"link"),t(),e(2618,", "),n(2619,"code"),e(2620,"clickable"),t(),e(2621,") have "),n(2622,"strong"),e(2623,"zero"),t(),e(2624,` 7544 call sites anywhere in the app \u2014 8f and 8g are the first time they have ever rendered. 7545 `),t(),e(2625,` 7546 7547 `),n(2626,"div",63),e(2627,` 7548 `),k(2628,Ox,1,0,"ng-container",64),e(2629,` 7549 7550 `),n(2630,"h4",4),e(2631,"8a. The real shape \u2014 rail + "),n(2632,"code"),e(2633,"list-row"),t(),e(2634," content"),t(),e(2635,` 7551 `),n(2636,"p",1),e(2637,`
7552 What programs search renders. Three rows chosen to stress the three things most likely to 7553 be wrong: a `),n(2638,"strong"),e(2639,"short"),t(),e(2640," title next to a "),n(2641,"strong"),e(2642,"wrapping"),t(),e(2643,` one (do the 7554 meta columns still line up?), a row whose team cell is `),n(2644,"strong"),e(2645,"empty"),t(),e(2646,`, and a row 7555 with `),n(2647,"strong"),e(2648,"no image"),t(),e(2649,`. 7556 `),t(),e(2650,` 7557 `),n(2651,"app-sg-caption",7),e(2652,"rail 80px \xB7 ratio 4/3 \xB7 body absorbs the leftover width"),t(),e(2653,` 7558 `),S(2654,Wx,48,8,null,null,wt),n(2656,"p",1),e(2657,` 7559 `),n(2658,"strong"),e(2659,"The size scale."),t(),e(2660," A bare "),n(2661,"code"),e(2662,"list-row-item"),t(),e(2663,` takes its content 7560 width; the four modifiers pin a cell to a fixed track above 768px, which is what actually 7561 holds a column when the cell's content varies row to row: 7562 `),n(2664,"code"),e(2665,"list-row-item-sm"),t(),e(2666," 3rem, "),n(2667,"code"),e(2668,"list-row-item-md"),t(),e(2669,` 5rem, 7563 `),n(2670,"code"),e(2671,"list-row-item-lg"),t(),e(2672," 7rem, "),n(2673,"code"),e(2674,"list-row-item-xl"),t(),e(2675,` 10rem. The fifth, 7564 `),n(2676,"code"),e(2677,"list-row-item-fluid"),t(),e(2678,`, is a definite 24rem like the others but wraps its 7565 contents instead of clipping them, and a row-level opt-in lets it stretch (8h). Below 7566 768px all of them flow to content \u2014 there are no columns to hold. 7567 `),c(2679,"br"),e(2680,` 7568 The steps are `),n(2681,"strong"),e(2682,"not"),t(),e(2683,` an arithmetic progression, deliberately. Each one was 7569 added to fit a real cell rather than to continue a pattern \u2014 `),n(2684,"code"),e(2685,"-xl"),t(),e(2686,` is 10rem 7570 because that is what active-teams' \u201CRoster Visible\u201D toggle needs, and cells are 7571 `),n(2687,"code"),e(2688,"min-width: 0; white-space: nowrap"),t(),e(2689,`, so an undersized step overflows visibly 7572 instead of widening. Add the next step when a cell needs it, at the width it needs. 7573 `),t(),e(2690,` 7574 `),n(2691,"p",1),e(2692,` 7575 `),n(2693,"strong"),e(2694,"What to check."),t(),e(2695,` The calendar, team, cart and options cells should form four 7576 straight columns down the three rows. If the short-title row's cells sit left of the 7577 long-title row's, the rail is not resolving to the same width on every row \u2014 that is 7578 the entire reason this contract exists. Row\xA02's empty team cell must still 7579 `),n(2696,"em"),e(2697,"hold"),t(),e(2698,` its 5rem column, or every cell after it shifts. The rail sits against the 7580 right edge; the body takes whatever is left. 7581 `),t(),e(2699,` 7582 7583 `),n(2700,"h4",4),e(2701,"8b. Uniform height regardless of what was uploaded"),t(),e(2702,` 7584 `),n(2703,"p",1),e(2704,` 7585 `),n(2705,"code"),e(2706,"aspect-ratio"),t(),e(2707," lives on the "),n(2708,"strong"),e(2709,"rail"),t(),e(2710,`, not on the 7586 `),n(2711,"code"),e(2712,"<img>"),t(),e(2713,`. So these three cards are the same height even though their source 7587 files range from square to 4.55:1. If the ratio were on the image, each row would take its 7588 height from the upload and the list would look ragged. 7589 `),t(),e(2714,` 7590 `),n(2715,"app-sg-caption",7),e(2716,"identical "),n(2717,"code"),e(2718,"aspectRatio"),t(),e(2719,", wildly different source files"),t(),e(2720,` 7591 `),S(2721,Rx,7,2,null,null,mx),n(2723,"h4",4),e(2724,"8c. "),n(2725,"code"),e(2726,"aspectRatio"),t(),e(2727," sets a floor, not a fixed height"),t(),e(2728,` 7592 `),n(2729,"p",1),e(2730,` 7593 In rail mode the rail's width is definite and its height is stretched to the row, so the 7594 ratio's real job is to give the row a `),n(2731,"strong"),e(2732,"minimum"),t(),e(2733,` height \u2014 7595 `),n(2734,"code"),e(2735,"width \xF7 ratio"),t(),e(2736,`. Content taller than the floor wins and the rail stretches
7596 past its ratio (the crop absorbs it). That is why uniformity holds only while every body is 7597 shorter than the floor. 7598 `),t(),e(2737,` 7599 `),n(2738,"table",117),e(2739,` 7600 `),n(2740,"thead")(2741,"tr")(2742,"th",118),e(2743,"ratio"),t(),n(2744,"th",29),e(2745,"floor at 80px"),t(),n(2746,"th"),e(2747,"effect"),t()()(),e(2748,` 7601 `),n(2749,"tbody"),e(2750,` 7602 `),S(2751,Lx,11,3,null,null,Ji),t(),e(2753,` 7603 `),t(),e(2754,` 7604 `),S(2755,qx,10,4,null,null,Ji),n(2757,"app-sg-caption",7),e(2758,"same ratios, but a body tall enough to beat the floor"),t(),e(2759,` 7605 `),S(2760,Vx,14,4,null,null,Ji),n(2762,"h4",4),e(2763,"8d. "),n(2764,"code"),e(2765,"imageWidth"),t()(),e(2766,` 7606 `),n(2767,"p",1),e(2768,` 7607 Desktop rail width. Reaches the CSS as `),n(2769,"code"),e(2770,"--teaser-card-thumb-width"),t(),e(2771,`, set with 7608 `),n(2772,"code"),e(2773,"style.setProperty"),t(),e(2774," on the host rather than "),n(2775,"code"),e(2776,"ngStyle"),t(),e(2777,` \u2014 the 7609 app's established pattern for custom properties. Changing this also moves the height floor, 7610 since the floor is `),n(2778,"code"),e(2779,"width \xF7 ratio"),t(),e(2780,`. 7611 `),t(),e(2781,` 7612 `),S(2782,zx,10,4,null,null,K),n(2784,"h4",4),e(2785,"8e. "),n(2786,"code"),e(2787,"imageFit"),t(),e(2788," and the empty rail"),t(),e(2789,` 7613 `),n(2790,"app-sg-caption",7),e(2791,"cover (crops to fill) \xB7 contain (letterboxes) \xB7 no image at all"),t(),e(2792,` 7614 `),n(2793,"app-teaser-card",119),e(2794,` 7615 `),n(2795,"div",3)(2796,"code"),e(2797,"cover"),t(),e(2798," \u2014 a 4.55:1 logo cropped hard to fill an 80\xD760 rail."),t(),e(2799,` 7616 `),t(),e(2800,` 7617 `),n(2801,"app-teaser-card",120),e(2802,` 7618 `),n(2803,"div",3)(2804,"code"),e(2805,"contain"),t(),e(2806," \u2014 whole logo visible, letterboxed against "),n(2807,"code"),e(2808,"--grey-200"),t(),e(2809,"."),t(),e(2810,` 7619 `),t(),e(2811,` 7620 `),n(2812,"app-teaser-card"),e(2813,` 7621 `),n(2814,"div",3),e(2815,"No "),n(2816,"code"),e(2817,"image"),t(),e(2818," \u2014 the rail is the bare "),n(2819,"code"),e(2820,"--grey-200"),t(),e(2821," placeholder, not a broken-image icon."),t(),e(2822,` 7622 `),t(),e(2823,` 7623 7624 `),n(2824,"h4",4),e(2825,"8f. Interactive mode \u2014 never used in the app"),t(),e(2826,` 7625 `),n(2827,"app-inline-alert",26),e(2828,` 7626 `),n(2829,"strong"),e(2830,"The two modes are mutually exclusive by contract."),t(),e(2831,` A passive card (every 7627 other sample on this page) lets the projected content own its links and buttons. An 7628 interactive card covers itself with an overlay, so `),n(2832,"strong"),e(2833,`projected content must hold no 7629 controls at all`),t(),e(2834,` \u2014 the overlay sits on top of them and they stop being 7630 reachable. Nothing enforces this; it is on you at review time. 7631 `),t(),e(2835,` 7632 `),n(2836,"p",1),e(2837,` 7633 Either mode also puts `),n(2838,"code"),e(2839,".clickable-card"),t(),e(2840,` on the root, so the card picks up the 7634 app's sanctioned click affordance \u2014 `),n(2841,"code"),e(2842,"cursor: pointer"),t(),e(2843,` and the 7635 `),n(2844,"code"),e(2845,"--grey-75"),t(),e(2846,` hover fill from section\xA03. This is the split 7f argues for: 7636 the overlay supplies the `),n(2847,"em"),e(2848,"semantics"),t(),e(2849,", the class supplies only the "),n(2850,"em"),e(2851,"look"),t(),e(2852,`. 7637 Hover any card in this group. 7638 `),t(),e(2853,` 7639 `),n(2854,"app-sg-caption",7)(2855,"code"),e(2856,"[link]"),t(),e(2857," \u2192 an "),n(2858,"code"),e(2859,"<a>"),t(),e(2860," overlay: real href, so Enter, ctrl+click and middle-click all work"),t(),e(2861,` 7640 `),n(2862,"app-teaser-card",121),e(2863,` 7641 `),n(2864,"div",3),e(2865,` 7642 Whole card navigates. Tab to it \u2014 focus should ring the `),n(2866,"em"),e(2867,"entire"),t(),e(2868,` card, not the image. 7643 `),t(),e(2869,` 7644 `),t(),e(2870,` 7645 `),n(2871,"app-sg-caption",7)(2872,"code"),e(2873,"[clickable]"),t(),e(2874," \u2192 a "),n(2875,"code"),e(2876,"<button>"),t(),e(2877," overlay: Enter "),n(2878,"em"),e(2879,"and"),t(),e(2880," Space"),t(),e(2881,`
7646 `),n(2882,"app-teaser-card",122),g("cardClick",function(){return o.onAction("teaser-card clickable overlay")}),e(2883,` 7647 `),n(2884,"div",3),e(2885,"Whole card is a button. Last action fired: "),n(2886,"code"),e(2887),t()(),e(2888,` 7648 `),t(),e(2889,` 7649 `),n(2890,"app-sg-caption",7),e(2891,"the defect: interactive with no "),n(2892,"code"),e(2893,"ariaLabel"),t()(),e(2894,` 7650 `),n(2895,"app-teaser-card",123),g("cardClick",function(){return o.onAction("teaser-card unnamed overlay")}),e(2896,` 7651 `),n(2897,"div",124),e(2898,` 7652 No `),n(2899,"code"),e(2900,"ariaLabel"),t(),e(2901,`. The overlay has no text of its own, so this is a 7653 `),n(2902,"strong"),e(2903,"button with no accessible name"),t(),e(2904,` \u2014 WCAG 4.1.2. A screen reader announces 7654 "button" and nothing else. `),n(2905,"code"),e(2906,"ariaLabel"),t(),e(2907,` is required, not optional, and the 7655 component does not make you supply it. 7656 `),t(),e(2908,` 7657 `),t(),e(2909,` 7658 7659 `),n(2910,"h4",4),e(2911,"8g. "),n(2912,"code"),e(2913,"mobileFull"),t(),e(2914," \u2014 banner mode"),t(),e(2915,` 7660 `),n(2916,"p",1),e(2917,` 7661 Below 768px the wrapper flips to a column and the image runs full width. This is also the 7662 only mode where `),n(2918,"code"),e(2919,"aspectRatio"),t(),e(2920," governs "),n(2921,"em"),e(2922,"strictly"),t(),e(2923,` rather than as a floor, 7663 because the width becomes definite and the height auto. 7664 `),t(),e(2924,` 7665 `),n(2925,"app-inline-alert",74),e(2926,` 7666 `),n(2927,"strong"),e(2928,"You cannot see this side-by-side."),t(),e(2929,` The switch is a 7667 `),n(2930,"code"),e(2931,"@media"),t(),e(2932," query on the "),n(2933,"em"),e(2934,"viewport"),t(),e(2935,`, not a container query, so narrowing 7668 this column does nothing \u2014 you have to narrow the browser window past 768px. That is 7669 worth knowing on its own: any future container-relative variant of this card needs 7670 `),n(2936,"code"),e(2937,"@container"),t(),e(2938,`, not a media query. 7671 `),t(),e(2939,` 7672 `),n(2940,"app-sg-caption",7),e(2941,'[mobileFull]="true" \u2014 narrow the window below 768px to see it change'),t(),e(2942,` 7673 `),n(2943,"app-teaser-card",125),e(2944,` 7674 `),n(2945,"div",3),e(2946,` 7675 Wide rail at desktop. Under 768px this should become a 3:1 banner with the text stacked 7676 beneath it. 7677 `),t(),e(2947,` 7678 `),t(),e(2948,` 7679 7680 `),n(2949,"h4",4),e(2950,"8h. "),n(2951,"code"),e(2952,"list-row-item-fluid"),t(),e(2953,` \u2014 the step for a collection, and the row 7681 variant that lets it stretch`),t(),e(2954,` 7682 `),n(2955,"p",1),e(2956,` 7683 For a cell holding a `),n(2957,"strong"),e(2958,"variable-length collection"),t(),e(2959,` rather than one value 7684 \u2014 assign-staff's team chips, where one person carries one chip and the next carries 7685 ten. Above 768px it is a `),n(2960,"strong"),e(2961,"definite 24rem"),t(),e(2962,`, exactly like the four size steps, 7686 which is how it holds its column. What makes it different is that it keeps the mobile 7687 layer's behaviour at desktop: the cell is itself a wrapping flex container with 7688 `),n(2963,"code"),e(2964,"white-space: normal"),t(),e(2965,`, so a collection with no upper bound makes the row 7689 `),n(2966,"em"),e(2967,"taller"),t(),e(2968,` instead of wider. 24rem was measured, not designed \u2014 it clears the 7690 widest chip on that page (17.6rem: a long team name plus its role) and fits two short 7691 chips side by side. 7692 `),t(),e(2969,` 7693 `),n(2970,"p",1),e(2971,` 7694 `),n(2972,"strong"),e(2973,"Two shapes, and they are not the same layout."),t(),e(2974,` On its own the cell is fixed 7695 at 24rem and the body absorbs all the slack. Add 7696 `),n(2975,"code"),e(2976,"list-row--fixed-body"),t(),e(2977," "),n(2978,"em"),e(2979,"to the row"),t(),e(2980,` and the definite half moves: the body 7697 pins to 12rem, the rail grows, and the fluid cell is released to 7698 `),n(2981,"code"),e(2982,"flex: 1 1 auto"),t(),e(2983,` so it takes every remaining pixel. Reach for the variant when 7699 the collection deserves the leftover width more than the identity does. Both are below, 7700 same five rows. 7701 `),t(),e(2984,` 7702 `),n(2985,"app-inline-alert",126),e(2986,` 7703 `),n(2987,"strong"),e(2988,"Exactly one half of the row must have a content-independent basis"),t(),e(2989,` \u2014 7704 the cell's 24rem in the first shape, the body's 12rem in the second. Give both halves 7705 `),n(2990,"code"),e(2991,"auto"),t(),e(2992,` and the cell starts at a different x on every row (measured 509 / 230 / 7706 526 / 396px across four rows); give both a length and the slack is thrown away. Adjust the 7707 rem values, not the structure. An earlier cut of this put the number on the rail with 7708 `),n(2993,"code"),e(2994,":has()"),t(),e(2995,` \u2014 that is gone, and n
7708o rule here needs it. 7709 `),t(),e(2996,` 7710 `),n(2997,"app-sg-caption",7),e(2998,"cell fixed 24rem \xB7 body absorbs the slack \xB7 content wraps"),t(),e(2999,` 7711 `),S(3e3,Gx,32,3,null,null,wt),n(3002,"app-sg-caption",7),e(3003,"+ "),n(3004,"code"),e(3005,"list-row--fixed-body"),t(),e(3006," \xB7 body fixed 12rem \xB7 cell stretches"),t(),e(3007,` 7712 `),S(3008,Yx,32,3,null,null,wt),n(3010,"p",1),e(3011,` 7713 `),n(3012,"strong"),e(3013,"What to check."),t(),e(3014,` In both sets every chip cell starts at the same x 7714 \u2014 including the empty row's \u201CNot assigned\u201D note \u2014 and so does the 7715 \u201CAssign to team\u201D cell, which keeps its own 7rem track. In the first set the chip 7716 cell should stay the same width as you resize while the name column grows; in the second it 7717 should grow with the window instead, fitting more chips per line before it wraps. Narrow the 7718 window and rows should get taller rather than spill. 7719 `),t(),e(3015,` 7720 `),n(3016,"p",1),e(3017,` 7721 `),n(3018,"strong"),e(3019,"Two known limits, both measured 2026-09-05."),t(),e(3020,` At exactly 768px the 7722 `),n(3021,"code"),e(3022,"--fixed-body"),t(),e(3023,` variant's action column goes ragged by ~15px on a row whose single 7723 chip cannot shrink. And a chip genuinely cannot shrink: the fourth row's 53-character team 7724 name is wrapped in `),n(3024,"code"),e(3025,"text-overflow-ellipsis"),t(),e(3026,", which does "),n(3027,"em"),e(3028,"nothing"),t(),e(3029,` here 7725 \u2014 it is an inline span inside a `),n(3030,"code"),e(3031,"nowrap"),t(),e(3032,` pill, so there is no axis for 7726 `),n(3033,"code"),e(3034,"overflow: hidden"),t(),e(3035,` to act on. That chip pokes ~28px left into the name column at 7727 768px, and below ~450px it overflows the card outright (13px at 414, 52px at 375). The fix 7728 belongs to the pill, not to this layout. 7729 `),t(),e(3036,` 7730 `),t(),e(3037,` 7731 7732 `),n(3038,"h4",4),e(3039,"Invariants you cannot infer from the markup"),t(),e(3040,` 7733 `),n(3041,"p",1),e(3042,` 7734 Flex has no template, so the contract leans on the rules below, and nothing in the code 7735 enforces any of them. 7736 This list is the cost of choosing classnames over a CSS grid track list \u2014 grid would have 7737 made the first two unnecessary. 7738 `),t(),e(3043,` 7739 `),n(3044,"table",10),e(3045,` 7740 `),n(3046,"thead")(3047,"tr")(3048,"th",127),e(3049,"Rule"),t(),n(3050,"th"),e(3051,"Why, and what breaks"),t()()(),e(3052,` 7741 `),n(3053,"tbody"),e(3054,` 7742 `),n(3055,"tr"),e(3056,` 7743 `),n(3057,"td")(3058,"strong"),e(3059,"Render every cell, even when empty"),t()(),e(3060,` 7744 `),n(3061,"td"),e(3062,"Put the "),n(3063,"code"),e(3064,"@if"),t(),e(3065," "),n(3066,"em"),e(3067,"inside"),t(),e(3068,` the cell, never around it. An omitted 7745 cell shifts every cell after it, on that row only, and the columns go ragged. 7746 Row\xA02 of 8a is the test case.`),t(),e(3069,` 7747 `),t(),e(3070,` 7748 `),n(3071,"tr"),e(3072,` 7749 `),n(3073,"td")(3074,"strong"),e(3075,"Give every meta cell a size class"),t()(),e(3076,` 7750 `),n(3077,"td"),e(3078,`Unless its content is identical on every row. An unsized 7751 `),n(3079,"code"),e(3080,"list-row-item"),t(),e(3081,` is content-width, so varying content \u2014 a jersey 7752 number present on some rows and blank on others \u2014 drifts every cell after it. 7753 The admin roster jersey cell is the one live exception: it is 7754 `),n(3082,"code"),e(3083,"-sm"),t(),e(3084,` while displaying and unsized while editing, because edit mode 7755 renders the same label and input on every row.`),t(),e(3085,` 7756 `),t(),e(3086,` 7757 `),n(3087,"tr"),e(3088,` 7758 `),n(3089,"td")(3090,"strong"),e(3091,"No wrapping utilities on a "),n(3092,"code"),e(3093,"list-row-item"),t()()(),e(3094,` 7759 `),n(3095,"td")(3096,"code"),e(3097,".nowrap"),t(),e(3098," ties with "),n(3099,"code"),e(3100,".list-row-item"),t(),e(3101,` on specificity and wins. 7760 The mobile layer deliberately leaves `),n(3102,"code"),e(3103,"white-space"),t(),e(3104,` unset so cells can 7761 wrap; a stray `),n(3105,"code"),e(3106,".nowrap"),t(),e(3107,` forces a nowrap date range to overflow a 320px 7762 screen. Two such classes were removed from programs search for exactly this.`),t(),e(3108,` 7763 `),t(),e(3109,` 7764 `),n(3110,"tr"),e(3111,` 7765 `),n(3112,"td")(3113,"strong"),e(3114,"768px is shared across two files"),t()(),e(3115,` 7766 `),n(3116,"td")(3117,"code"),e(3118,"teaser-card.component.scss"),t(),e(3119," and "),n(3120,"code"),e(3121,"list-row.scss"),t(),e(3122,` both key off 7767 768 and must agree. Each carries a one-line comment naming the other. Every query 7768 in both is `),n(3123,"code"),e(3124,"min-width"),t(),e(3125,` \u2014 deliberately, since the app has three 7769 competing conventions for this boundary (`),n(3126,"code"),e(3127,"768"),t(),e(3128,", "),n(3129,"code"),e(3130,"767"),t(),e(3131,`, 7770 `),n(3132,"code"),e(3133,"767.98"),t(),e(3134,") and the "),n(3135,"code"),e(3136,"@include sm"),t(),e(3137,"/"),n(3138,"code"),e(3139,"sm-min"),t(),e(3140,` mixins 7771 overlap at 767.`),t(),e(3141,` 7772 `),t(),e(3142,` 7773 `),n(3143,"tr"),e(3144,` 7774 `),n(3145,"td")(3146,"strong"),e(3147,"Interactive mode takes the whole card"),t()(),e(3148,` 7775 `),n(3149,"td"),e(3150,"Set "),n(3151,"code"),e(3152,"link"),t(),e(3153," or "),n(3154,"code"),e(3155,"clickable"),t(),e(3156,` and the projected content must 7776 contain no links or buttons, and `),n(3157,"code"),e(3158,"ariaLabel"),t(),e(3159," becomes mandatory. See 8f."),t(),e(3160,` 7777 `),t(),e(3161,` 7778 `),n(3162,"tr"),e(3163,` 7779 `),n(3164,"td")(3165,"strong"),e(3166,"A stretching cell needs a definite body"),t()(),e(3167,` 7780 `),n(3168,"td")(3169,"code"),e(3170,"list-row-item-fluid"),t(),e(3171,` stretches only under 7781 `),n(3172,"code"),e(3173,"list-row--fixed-body"),t(),e(3174,`, which pins the body to 12rem and releases the 7782 cell. The two halves are coupled and neither classname says so: a row basis of 7783 `),n(3175,"code"),e(3176,"auto"),t(),e(3177,` on both halves resolves to content width and the column goes 7784 ragged, and a width back on the cell stops it stretching. Adjust the rem values, 7785 not the structure. See 8h.`),t(),e(3178,`
7786 `),t(),e(3179,` 7787 `),t(),e(3180,` 7788 `),t(),e(3181,` 7789 7790 `),n(3182,"h4",4),e(3183,"Open issues"),t(),e(3184,` 7791 `),n(3185,"table",10),e(3186,` 7792 `),n(3187,"thead")(3188,"tr")(3189,"th",30),e(3190,"Issue"),t(),n(3191,"th"),e(3192,"Detail"),t()()(),e(3193,` 7793 `),n(3194,"tbody"),e(3195,` 7794 `),n(3196,"tr"),e(3197,` 7795 `),n(3198,"td"),e(3199,"Body width \u2014 "),n(3200,"strong"),e(3201,"settled"),t()(),e(3202,` 7796 `),n(3203,"td"),e(3204,"The body no longer has one. It is "),n(3205,"code"),e(3206,"flex: 1 1 0"),t(),e(3207,` and absorbs whatever the 7797 meta rail leaves; the rail is `),n(3208,"code"),e(3209,"flex: 0 0 auto"),t(),e(3210,` and sized by its cells. 7798 The old 45/55/65% scale was a `),n(3211,"em"),e(3212,"definite"),t(),e(3213,` width with 7799 `),n(3214,"code"),e(3215,"flex-shrink: 0"),t(),e(3216,`, so a page whose rail needed more than the remainder 7800 pushed it off the viewport \u2014 which is what the admin roster did at every 7801 width. Alignment was always coming from the definite `),n(3217,"code"),e(3218,"-sm"),t(),e(3219,"/"),n(3220,"code"),e(3221,"-md"),t(),e(3222,"/"),n(3223,"code"),e(3224,"-lg"),t(),e(3225,` 7802 cells, never from the body percentage.`),t(),e(3226,` 7803 `),t(),e(3227,` 7804 `),n(3228,"tr"),e(3229,` 7805 `),n(3230,"td"),e(3231,"Uniformity has ~8px of headroom"),t(),e(3232,` 7806 `),n(3233,"td"),e(3234,`80px at 4/3 gives a 60px floor; a two-line body is ~52px. One wrapping title pushes 7807 that row taller and breaks the uniform look. A `),n(3235,"code"),e(3236,"min-height"),t(),e(3237,` on the row is 7808 the direct lever; the ratio is the indirect one. Row\xA02 of 8a shows it.`),t(),e(3238,` 7809 `),t(),e(3239,` 7810 `),n(3240,"tr"),e(3241,` 7811 `),n(3242,"td"),e(3243,"Empty cells cost ~1rem on mobile"),t(),e(3244,` 7812 `),n(3245,"td"),e(3246,"Below 768 the cells flow with a "),n(3247,"code"),e(3248,"column-gap"),t(),e(3249,`, so an empty cell collapses 7813 to zero width but still contributes a gap either side. `),n(3250,"code"),e(3251,":empty"),t(),e(3252,` cannot 7814 collapse it because `),n(3253,"code"),e(3254,"preserveWhitespaces: true"),t(),e(3255,` is set in 7815 `),n(3256,"code"),e(3257,"tsconfig.json"),t(),e(3258,`. Accepted: it replaced an empty cell that used to eat a 7816 hard 50% of the mobile meta line.`),t(),e(3259,` 7817 `),t(),e(3260,` 7818 `),n(3261,"tr"),e(3262,` 7819 `),n(3263,"td"),e(3264,"Columns do not align below 768px"),t(),e(3265,` 7820 `),n(3266,"td"),e(3267,`By decision, not by accident. The size classes switch off and cells flow to content 7821 width, so a short date range shifts what follows. The reasoning is that a stacked 7822 card has no column for the eye to track \u2014 but it `),n(3268,"em"),e(3269,"is"),t(),e(3270,` a narrowing of a 7823 stated requirement, so it is written down rather than assumed.`),t(),e(3271,` 7824 `),t(),e(3272,` 7825 `),n(3273,"tr"),e(3274,` 7826 `),n(3275,"td"),e(3276,"No "),n(3277,"code"),e(3278,".spec.ts"),t()(),e(3279,` 7827 `),n(3280,"td"),e(3281,"Five of the nine components on this page have one. This does not."),t(),e(3282,` 7828 `),t(),e(3283,` 7829 `),n(3284,"tr"),e(3285,` 7830 `),n(3286,"td")(3287,"code"),e(3288,"link"),t(),e(3289," is not called "),n(3290,"code"),e(3291,"routerLink"),t(),e(3292," on purpose"),t(),e(3293,` 7831 `),n(3294,"td"),e(3295,"Angular's "),n(3296,"code"),e(3297,"RouterLink"),t(),e(3298," selector is a bare "),n(3299,"code"),e(3300,"[routerLink]"),t(),e(3301,`, so 7832 naming the input that would bind the directive to the host `),n(3302,"em"),e(3303,"as well"),t(),e(3304,` as the 7833 input \u2014 giving the host `),n(3305,"code"),e(3306,'tabindex="0"'),t(),e(3307,` with a click-only listener, 7834 i.e. a focusable element no keyboard can activate. `),n(3308,"code"),e(3309,"app-pill"),t(),e(3310,` and 7835 `),n(3311,"code"),e(3312,"app-tag"),t(),e(3313,` still carry that name and that defect (19 bindings between 7836 them); registered, not fixed.`),t(),e(3314,` 7837 `),t(),e(3315,` 7838 `),t(),e(3316,` 7839 `),t(),e(3317,` 7840`),t(),e(3318,` 7841`)),s&2){let x=ue(996);i(28),p(o.snapshotDate),i(34),p(o.flavors.length),i(460),f(` 7842 `,o.flavors.length,` classes, all of them in use. Anything defined and unused has been 7843 removed rather than documented \u2014 if it is unused, it is not worth a reader's attention. 7844 `),i(2),m("isInline",!0),i(45),f(` did. The naming was inverted from the coupling. Both were 7845 deleted as unused on `,o.snapshotDate,`, so the question is now moot in practice \u2014 it is 7846 recorded only so nobody reintroduces `),i(40),E(o.flavors),i(16),m("isInline",!0),i(25),f(`, which is the only 7847 reason it survived the `,o.snapshotDate,` scrub. Any number here can be low. Grep the bare 7848 token across `),i(462),m("isInline",!0),i(21),m("isInline",!0),i(28),m("ngTemplateOutlet",x)("ngTemplateOutletContext",ie(112,_e,o.nullCardDoc)),i(9),m("image",o.imageType.CHECKLIST),i(5),m("image",o.imageType.CALENDAR)("showButton",!0),i(5),m("image",o.imageType.RECEIPT)("showCard",!1),i(9),E(o.imageTypeList),i(12),p(o.imageType.FLAG),i(9),m("ngTemplateOutlet",x)("ngTemplateOutletContext",ie(114,_e,o.userInfoCardDoc)),i(9),m("entity",o.demoUser)("fields",o.demoUserFields)("isEditable",!0),i(8),m("entity",o.demoUser)("fields",o.demoUserFields),i(7),m("ngTemplateOutlet",x)("ngTemplateOutletContext",ie(116,_e,o.staffCardDoc)),i(9),m("clubUser",o.demoStaff),i(8),m("clubUser",o.demoStaffBare),i(7),m("ngTemplateOutlet",x)("ngTemplateOutletContext",ie(118,_e,o.blogCardDoc)),i(9),m("blogImage",o.demoBlogImage)("blogSavedOn",o.demoEventStart),i(5),m("blogSavedOn",o.demoEventStart),i(5),m("blogImage",o.demoBlogImage)("showClubLogo",!0)("blogSavedOn",o.demoEventStart),i(4),m("isInline",!0),i(30),m("ngTemplateOutlet",x)("ngTemplateOutletContext",ie(120,_e,o.calendarCardDoc)),i(7),m("startDate",o.demoEventStart)("endDate",o.demoEventStart)("clubEventTypeID",o.calendarEventType.GAME),i(2),m("startDate",o.demoEventStart)("endDate",o.demoEventStart)("clubEventTypeID",o.calendarEventType.PRACTICE),i(2),m("startDate",o.demoEventStart)("endDate",o.demoEventStart)("clubEventTypeID",o.calendarEventType.CLUB),i(2),m("startDate",o.demoEventStart)("endDate",o.demoEventStart),i(2),m("startDate",o.demoEventStart)("endDate",o.demoEventEnd)("clubEventTypeID",o.calendarEventType.GAME),i(2),m("startDate",o.demoEventStart)("endDate",o.demoEventStart)("clubEventTypeID",o.calendarEventType.CLUB)("isDraft",!0),i(3),m("isInline",!0),i(35),m("ngTemplateOutlet",x)("ngTemplateOutletContext",ie(122,_e,o.rosterCardDoc)),i(2),m("isInline",!0),i(21),m("player",o.demoRosterPlayer)("collegeProfileSettings",o.demoRosterSettings)("showProfileButton",!0),i(9),m("player",o.demoRosterPlayer)("collegeProfileSettings",o.demoRosterSettings),i(19),m("ngTemplateOutlet",x)("ngTemplateOutletContext",ie(124,_e,o.promoCardDoc)),i(5),m("features",o.promoFeatures),i(5),m("ngTemplateOutlet",x)("ngTemplateOutletContext",ie(126,_e,o.facilityCardDoc)),i(25),m("routerLink","/admin/styleguide/global/admin-vs-member"),i(38),m("hasSettings",!0),i(35),m("hasSettings",!0),i(82),f(` 7849 loading: `,o.liveLoading,` 7850 `),i(3),f(` 7851 error: `,o.liveError,` 7852 `),i(7),m("hasSettings",!0)("loading",o.liveLoading)("error",o.liveError),i(21),m("loading",!0),i(15),m("error",!0),i(9),m("error",!0),i(18),m("loading",!0),i(8),m("loading",!0),i(43),m("isInline",!0),i(15),p(o.lastAction),i(11),p(o.snapshotDate),i(71),E(o.radiusSources),i(61),f(` 7853 Asked and answered `,o.snapshotDate,": "),i(117),f("6f. Dead flavors and slots \u2014 removed ",o.snapshotDate),i(101),p(o.snapshotDate),i(9),m("isInline",!0),i(108),p("{{ }}"),i(18),m("isInline",!0),i(313),E(o.shadowSources),i(18),m("routerLink","/admin/styleguide/global/blues-and-links"),i(35),m("isInline",!0),i(20),m("ngTemplateOutlet",x)("ngTemplateOutletContext",ie(128,_e,o.teaserCardDoc)),i(26),E(o.teaserRows),i(67),E(o.teaserNaturalRatios),i(30),E(o.teaserRatios),i(4),E(o.teaserRatios),i(5),E(o.teaserRatios),i(22),E(o.teaserWidths),i(11),m("image",o.teaserImg.veryWide),i(8),m("image",o.teaserImg.veryWide),i(26),m("isInline",!0),i(35),m("image",o.teaserImg.square)("link",V(130,sx)),i(20),m("image",o.teaserImg.square)("clickable",!0),i(5),p(o.lastAction),i(8),m("image",o.teaserImg.square)("clickable",!0),i(30),m("isInline",!0),i(18),m("image",o.teaserImg.wide)("mobileFull",!0)("aspectRatio","3 / 1"),i(42),m("isInline",!0),i(15),E(o.fluidRows),i(8),E(o.fluidRows)}},dependencies:[De,Fe,Pe,$,J,le,un,ot,Sr,Sn,En,Cn,vn,yn,Mn,Oa,ut,X],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var a0=(a,r)=>
7853r.intent,Jx=(a,r)=>r.icon,Zx=(a,r)=>r.title,r0=(a,r)=>r.className;function e1(a,r){if(a&1&&(e(0,` 7854 `),n(1,"th"),e(2),t(),e(3,` 7855 `)),a&2){let l=r.$implicit;i(2),p(l)}}function t1(a,r){if(a&1&&(e(0,` 7856 `),c(1,"br"),e(2),L(3,"number")),a&2){let l=u().$implicit,d=u();i(2),f("",ze(3,1,d.intentUsage[l.intent].toastUses),` toasts 7857 `)}}function n1(a,r){if(a&1&&(e(0,` 7858 `),c(1,"span",36),e(2,` 7859 `),n(3,"div",37),e(4),t(),e(5,` 7860 `),n(6,"div",38),e(7),t(),e(8,` 7861 `)),a&2){let l=u().$implicit;i(),W("background-color",l.hex),i(3),p(l.hex),i(3),p(l.token)}}function i1(a,r){a&1&&(e(0,` 7862 `),n(1,"span",39),e(2,"\u2014"),t(),e(3,` 7863 `))}function a1(a,r){if(a&1&&(e(0,` 7864 `),n(1,"td"),e(2,` 7865 `),v(3,n1,9,4)(4,i1,4,0),t(),e(5,` 7866 `)),a&2){let l=r.$implicit;i(3),y(l?3:4)}}function r1(a,r){if(a&1&&(e(0,` 7867 `),n(1,"tr"),e(2,` 7868 `),n(3,"td"),e(4,` 7869 `),n(5,"code"),e(6),t(),e(7,` 7870 `),n(8,"div",34),e(9),v(10,t1,4,3),t(),e(11,` 7871 `),t(),e(12,` 7872 `),S(13,a1,6,1,null,null,da),n(15,"td"),e(16,` 7873 `),c(17,"p-badge",35),e(18,` 7874 `),t(),e(19,` 7875 `),t(),e(20,` 7876 `)),a&2){let l=r.$implicit,d=u();i(6),p(l.intent),i(3),f(` 7877 `,d.intentUsage[l.intent].alertType,` alerts 7878 `),i(),y(d.intentUsage[l.intent].toastUses?10:-1),i(3),E(l.cells),i(4),m("value",d.distinctToday(l))("severity",d.distinctToday(l)<=3?"success":"danger")}}function o1(a,r){if(a&1&&(e(0,` 7879 `),c(1,"span",36),e(2,` 7880 `),n(3,"div",37),e(4),t(),e(5,` 7881 `),n(6,"div",38),e(7),t(),e(8,` 7882 `),n(9,"div",42),e(10),t(),e(11,` 7883 `)),a&2){let l=u().$implicit;i(),W("background-color",l.accentProposed.hex),i(3),p(l.accentProposed.hex),i(3),p(l.accentProposed.token),i(3),f("",l.ratioProposed,":1")}}function l1(a,r){a&1&&(e(0,` 7884 `),n(1,"span",43),e(2,"no change"),t(),e(3,` 7885 `))}function s1(a,r){if(a&1&&(e(0,` 7886 `),n(1,"tr"),e(2,` 7887 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 7888 `),n(7,"td"),e(8,` 7889 `),c(9,"span",36),e(10,` 7890 `),n(11,"div",37),e(12),t(),e(13,` 7891 `),n(14,"div",38),e(15),t(),e(16,` 7892 `),t(),e(17,` 7893 `),n(18,"td"),e(19,` 7894 `),c(20,"span",36),e(21,` 7895 `),n(22,"div",37),e(23),t(),e(24,` 7896 `),n(25,"div",38),e(26),t(),e(27,` 7897 `),t(),e(28,` 7898 `),n(29,"td"),e(30,` 7899 `),c(31,"span",36),e(32,` 7900 `),n(33,"div",37),e(34),t(),e(35,` 7901 `),n(36,"div",38),e(37),t(),e(38,` 7902 `),n(39,"div",40),e(40),t(),e(41,` 7903 `),t(),e(42,` 7904 `),n(43,"td"),e(44,` 7905 `),v(45,o1,12,5)(46,l1,4,0),t(),e(47,` 7906 `),n(48,"td",40)(49,"code"),e(50),t()(),e(51,` 7907 `),n(52,"td"),e(53,` 7908 `),c(54,"p-badge",41),e(55,` 7909 `),t(),e(56,` 7910 `),t(),e(57,` 7911 `)),a&2){let l=r.$implicit,d=u();i(5),p(l.intent),i(4),W("background-color",l.fill.hex),i(3),p(l.fill.hex),i(3),p(l.fill.token),i(5),W("background-color",l.border.hex),i(3),p(l.border.hex),i(3),p(l.border.token),i(5),W("background-color",l.accentToday.hex),i(3),p(l.accentToday.hex),i(3),p(l.accentToday.token),i(2),j("text-red",l.changes),i(),f(` 7912 `,l.ratioToday,`:1 7913 `),i(5),y(l.changes?45:46),i(5),p(l.textModifier),i(4),m("value",d.distinctProposed(l))}}function d1(a,r){if(a&1&&(e(0,` 7914 `),n(1,"tr"),e(2,` 7915 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 7916 `),n(7,"td"),e(8,` 7917 `),n(9,"app-inline-alert",44),e(10,` 7918 The registration window closes Friday at 5:00pm. 7919 `),t(),e(11,` 7920 `),t(),e(12,` 7921 `),n(13,"td"),e(14,` 7922 `),n(15,"app-inline-alert",45),e(16,` 7923 The registration window closes Friday at 5:00pm. 7924 `),t(),e(17,` 7925 `),t(),e(18,` 7926 `),t(),e(19,` 7927 `)),a&2){let l=r.$implicit;i(5),p(l),i(4),m("isInline",!0)("alertType",l),i(6),m("isInline",!0)("alertType",l)("showIcon",!1)}}function m1(a,r){if(a&1&&(e(0,` 7928 `),n(1,"tr"),e(2,` 7929 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 7930 `),n(7,"td"),e(8,` 7931 `),n(9,"app-inline-alert",44),e(10,` 7932 The registration window closes Friday at 5:00pm. 7933 `),t(),e(11,` 7934 `),t(),e(12,` 7935 `),n(13,"td"),e(14,` 7936 `),n(15,"app-inline-alert",45),e(16,` 7937 The registration window closes Friday at 5:00pm. 7938 `),t(),e(17,` 7939 `),t(),e(18,` 7940 `),t(),e(19,` 7941 `)),a&2){let l=r.$implicit;i(5),p(l),i(4),m("isInline",!1)("alertType",l),i(6),m("isInline",!1)("alertType",l)("showIcon",!1)}}function c1(a,r){if(a&1&&(e(0,` 7942 `),n(1,"tr"),e(2,` 7943 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 7944 `),n(7,"td"),e(8),t(),e(9,` 7945 `),n(10,"td"),e(11,` 7946 `),n(12,"app-inline-alert",46),e(13,` 7947 Custom icon sample. 7948 `),t(),e(14,` 7949 `),t(),e(15,` 7950 `),t(),e(16,` 7951 `)),a&2){let l=r.$implicit;i(5),p(l.icon),i(3),p(l.uses),i(4),m("isInline",!0)("iconClass",l.icon)}}function p1(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;f(` 7952 `,l.uses,` 7953 `)}}function x1(a,r){a&1&&(e(0,` 7954 `),n(1,"app-pill",50),e(2,"dead"),t(),e(3,` 7955 `))}function h1(a,r){a&1&&(e(0,` 7956 `),n(1,"app-pill",51),e(2,"yes"),t(),e(3,` 7957 `))}function u1(a,r){if(a&1&&(e(0,` 7958 `),n(1,"tr"),e(2,` 7959 `),n(3,"td"),c(4,"span",49),t(),e(5,` 7960 `),n(6,"td")(7,"code"),e(8),t()(),e(9,` 7961 `),n(10,"td")(11,"span"),e(12,"The quick brown fox \u2014 12 spots left"),t()(),e(13,` 7962 `),n(14,"td",40)(15,"code"),e(16),t()(),e(17,` 7963 `),n(18,"td",40)(19,"code"),e(20),t()(),e(21,` 7964 `),n(22,"td"),e(23,` 7965 `),v(24,p1,1,1)(25,x1,4,0),t(),e(26,` 7966 `),n(27,"td"),e(28),t(),e(29,` 7967 `),n(30,"td"),e(31,` 7968 `),v(32,h1,4,0),t(),e(33,` 7969 `),t(),e(34,` 7970 `)),a&2){let l=r.$implicit;i(4),W("background-color",l.hex),i(4),f(".",l.className),i(3),ne(l.className),i(5),p(l.token),i(4),p(l.hex),i(4),y(l.uses?24:25),i(4),p(l.files),i(4),y(l.important?32:-1)}}function g1(a,r){if(a&1&&(e(0,` 7971 `),n(1,"h4",3),e(2),t(),e(3,` 7972 `),n(4,"p",0),e(5),t(),e(6,` 7973 `),n(7,"table",27),e(8,` 7974 `),n(9,"thead"),e(10,` 7975 `),n(11,"tr"),e(12,` 7976 `),c(13,"th",47),e(14,` 7977 `),n(15,"th",48),e(16,"Class"),t(),e(17,` 7978 `),n(18,"th"),e(19,"Sample"),t(),e(20,` 7979 `),n(21,"th",17),e(22,"Token"),t(),e(23,` 7980 `),n(24,"th",5),e(25,"Resolves to"),t(),e(26,` 7981 `),n(27,"th",6),e(28,"Uses"),t(),e(29,` 7982 `),n(30,"th",6),e(31,"Files"),t(),e(32,` 7983 `),n(33,"th",23),e(34,"!important"),t(),e(35,` 7984 `),t(),e(36,` 7985 `),t(),e(37,` 7986 `),n(38,"tbody"),e(39,` 7987 `),S(40,u1,35,10,null,null,r0),t(),e(42,` 7988 `),t(),e(43,` 7989 `)),a&2){let l=r.$implicit;i(2),p(l.title),i(3),p(l.blurb),i(35),E(l.rows)}}function f1(a,r){if(a&1&&(e(0,` 7990 `),n(1,"tr"),e(2,` 7991 `),n(3,"td")(4,"code"),e(5),t()(),e(6,` 7992 `),n(7,"td")(8,"span"),e(9,"The quick brown fox \u2014 12 spots left"),t()(),e(10,` 7993 `),n(11,"td"),e(12),t(),e(13,` 7994 `),n(14,"td"),e(15),t(),e(16,` 7995 `),n(17,"td",40),e(18),t(),e(19,` 7996 `),t(),e(20,` 7997 `)),a&2){let l=r.$implicit;i(5),f(".",l.className),i(3),ne(l.className),i(4),p(l.uses),i(3),p(l.files),i(3),p(l.likelyIntent)}}var o0=(()=>{let r=class r{distinctToday(d){return new Set(d.cells.filter(s=>!!s).map(s=>s.hex.toLowerCase())).size}distinctProposed(d){return new Set([d.fill.hex,d.border.hex,d.accentProposed.hex].map(s=>s.toLowerCase())).size}constructor(d){this.siteDataService=d,this.snapshotDate="2026-08-19",this.intents=["error","warning","success","info","note"],this.comparisonColumns=["Text modifier","Alert icon","Alert border","Alert fill","Toast text","Toast fill"],this.comparison=[{intent:"error",cells:[{token:".text-red \u2192 --red-700",hex:"#a11019"},{token:"--error \u2192 --red-700",hex:"#a11019"},{token:"--red-800",hex:"#7d0d14"},{token:"--red-100",hex:"#fdb5b8"},{token:"--red-700",hex:"#a11019"},{token:"--red-100",hex:"#fdb5b8"}]},{intent:"warning",cells:[{token:".text-warning \u2192 --yellow-600",hex:"#d39c36"},{token:"--yellow-700",hex:"#b0782a"},{token:"--yellow-500",hex:"#f5bf41"},{token:"--yellow-50",hex:"#ffe1b8"},{token:"--yellow-800",hex:"#8b501f"},{token:"--yellow-50",hex:"#ffe1b8"}]},{intent:"success",cells:[{token:".text-green \u2192 --green-700",hex:"#3c894d"},{token:"--success \u2192 --green-600",hex:"#4ca45a"},{token:"--success",hex:"#4ca45a"},{token:"--green-50",hex:"#ddf3d9"},{token:"--green-800",hex:"#2d6944"},{token:"--green-50",hex:"#ddf3d9"}]},{intent:"info",cells:[{token:".text-blue \u2192 --blue-900",hex:"#054584"},{token:"--blue-800",hex:"#0e58bb"},{token:"--blue-900",hex:"#054584"},{token:"--blue-50",hex:"#ebf7ff"},{token:"--blue-800",hex:"#0e58bb"},{token:"--blue-50",hex:"#ebf7ff"}]},{intent:"note",cells:[{token:".text-grey \u2192 --grey-800",hex:"#595c60"},{token:"--grey-700",hex:"#7f8489"},{token:"--grey-800",hex:"#595c60"},{token:"--grey-100",hex:"#f1f5f8"}
7997,null,null]}],this.intentUsage={error:{alertType:103,toast:"showSiteErrorAlert",toastUses:2363},warning:{alertType:246,toast:"showSiteWarnAlert",toastUses:44},success:{alertType:9,toast:"showSiteSuccessAlert",toastUses:1121},info:{alertType:141,toast:"showSiteInfoAlert",toastUses:43},note:{alertType:21,toast:"",toastUses:0}},this.modifierGroups=[{title:"Intent",blurb:"Colors that carry meaning. These are the ones that must agree with \xA71.",rows:[{className:"text-red",token:"var(--red-700)",hex:"#a11019",uses:93,files:50,important:!1},{className:"text-dark-red",token:"var(--red-800)",hex:"#7d0d14",uses:6,files:1,important:!1},{className:"text-warn",token:"var(--yellow-600)",hex:"#d39c36",uses:25,files:14,important:!1},{className:"text-warning",token:"var(--yellow-600)",hex:"#d39c36",uses:38,files:25,important:!1},{className:"text-yellow",token:"var(--yellow-300)",hex:"#ffd338",uses:1,files:1,important:!1},{className:"text-green",token:"var(--green-700)",hex:"#3c894d",uses:75,files:38,important:!1},{className:"text-green-alt",token:"var(--green-600)",hex:"#4ca45a",uses:5,files:5,important:!1},{className:"text-blue",token:"var(--blue-900)",hex:"#054584",uses:31,files:13,important:!1}]},{title:"Neutral & emphasis",blurb:'No semantic intent \u2014 these say "quieter" or "louder", not "something is wrong".',rows:[{className:"text-color-default",token:"var(--base-text)",hex:"#2e3032",uses:6,files:2,important:!1},{className:"text-grey",token:"var(--grey-800)",hex:"#595c60",uses:480,files:147,important:!1},{className:"text-grey-lt",token:"var(--grey-600)",hex:"#9ea5aa",uses:163,files:72,important:!0},{className:"text-navy",token:"var(--blue-1000)",hex:"#001537",uses:59,files:38,important:!0},{className:"text-white",token:"var(--color-white)",hex:"#ffffff",uses:28,files:11,important:!0}]},{title:"Links & headers",blurb:"Tied to a role in the page, not to a status.",rows:[{className:"text-primary-link",token:"var(--primary-link)",hex:"#1d6ae5",uses:147,files:71,important:!1},{className:"header-emphasis",token:"var(--blue-1000)",hex:"#001537",uses:0,files:0,important:!1},{className:"text-header-blue",token:"var(--blue-800) @ .8 opacity",hex:"#0e58bb",uses:1,files:1,important:!1}]},{title:"Highlight",blurb:"Sets background-color, not color \u2014 it lives in this block but is not a text color.",rows:[{className:"text-highlight",token:"var(--color-highlight)",hex:"#ffff00",uses:1,files:1,important:!0}]}],this.definedTotal=1065,this.ghostModifiers=[{className:"text-muted",uses:233,files:76,likelyIntent:"de-emphasised text \u2192 .text-grey-lt"},{className:"text-danger",uses:87,files:46,likelyIntent:"error text \u2192 .text-red"},{className:"text-primary",uses:43,files:31,likelyIntent:"link/brand text \u2192 .text-primary-link"},{className:"text-success",uses:30,files:24,likelyIntent:"success text \u2192 .text-green"},{className:"text-secondary",uses:6,files:2,likelyIntent:"de-emphasised text \u2192 .text-grey"},{className:"text-info",uses:5,files:5,likelyIntent:"info text \u2192 .text-blue"},{className:"text-black",uses:3,files:3,likelyIntent:"body text \u2192 .text-color-default"}],this.ghostTotal=this.ghostModifiers.reduce((s,o)=>s+o.uses,0),this.customIconSamples=[{icon:"fas fa-exclamation-triangle",uses:21},{icon:"far fa-info-circle",uses:5},{icon:"fa fa-exclamation-triangle",uses:5},{icon:"fa fa-exclamation-triangle text-warn",uses:5},{icon:"fa-duotone fa-gear",uses:2},{icon:"line-height-4",uses:6}],this.proposal=[{intent:"error",fill:{token:"--red-100",hex:"#fdb5b8"},border:{token:"--red-800",hex:"#7d0d14"},accentToday:{token:"--red-700",hex:"#a11019"},accentProposed:{token:"--red-700",hex:"#a11019"},ratioToday:"4.79",ratioProposed:"4.79",textModifier:".text-red",changes:!1},{intent:"warning",fill:{token:"--yellow-50",hex:"#ffe1b8"},border:{token:"--yellow-500",hex:"#f5bf41"},accentToday:{token:"--yellow-700",hex:"#b0782a"},accentProposed:{token:"--yellow-800",hex:"#8b501f"},ratioToday:"3.00",ratioProposed:"5.12",textModifier:".text-warning (--yellow-600 today)",changes:!0},{intent:"success",fill:{token:"--green-50",hex:"#ddf3d9"},border:{token:"--success",hex:"#4ca45a"},accentToday:{token:"--green-600",hex:"#4ca45a"},accentProposed:{token:"--green-800",hex:"#2d6944"},ratioToday:"2.65",ratioProposed:"5.57",textModifier:".text-green (--green-700 today)",changes:!0},{intent:"info",fill:{token:"--blue-50",hex:"#ebf7ff"},border:{token:"--blue-900",hex:"#054584"},accentToday:{token:"--blue-800",hex:"#0e58bb"},accentProposed:{token:"--blue-800",hex:"#0e58bb"},ratioToday:"6.16",ratioProposed:"6.16",textModifier:".text-blue (--blue-900 today)",changes:!0},{intent:"note",fill:{token:"--grey-100",hex:"#f1f5f8"},border:{token:"--grey-800",hex:"#595c60"},accentToday:{token:"--grey-700",hex:"#7f8489"},accentProposed:{token:"--grey-800",hex:"#595c60"},ratioToday:"3.44",ratioProposed:"6.13",textModifier:"(none \u2014 .text-grey is a neutral, not this intent)",changes:!0}]}
vendor: 4,143 bytes, lines 7997-8023
7997ngOnInit(){this.siteDataService.hideSiteLoader()}fireSuccessToast(){this.siteDataService.showSiteSuccessAlert("Your changes have been saved.")}fireErrorToast(){this.siteDataService.showSiteErrorAlert("There was a problem saving your changes.")}fireWarnToast(){this.siteDataService.showSiteWarnAlert("Some registrations were skipped.")}fireInfoToast(){this.siteDataService.showSiteInfoAlert("This program closes for registration on Friday.")}fireDefaultGetToast(){this.siteDataService.showSiteErrorAlertDefaultGET()}clearToasts(){this.siteDataService.clearAllSiteAlerts()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-sg-system-alerts"]],standalone:!1,decls:965,vars:12,consts:[[1,"text-small","text-grey"],[3,"routerLink"],[1,"card"],[1,"mt-3"],[1,"table","table-bordered","sg-doc-table"],[2,"width","7rem"],[2,"width","5rem"],[1,"mt-4"],[2,"width","16rem"],[1,"sg-swatch","sg-swatch--sm",2,"background-color","#8b501f"],[1,"sg-swatch","sg-swatch--sm",2,"background-color","#b0782a"],[1,"sg-swatch","sg-swatch--sm",2,"background-color","#2d6944"],[1,"sg-swatch","sg-swatch--sm",2,"background-color","#4ca45a"],[1,"text-small","text-grey","mb-0"],[1,"sg-swatch","sg-swatch--sm",2,"background-color","#e0222b"],["side","shared"],[1,"table","table-bordered"],[2,"width","14rem"],[1,"mb-3"],["alertType","warning",3,"isInline"],[1,"mb-0"],["alertType","error",3,"isInline"],[2,"width","20rem"],[2,"width","6rem"],["type","button",1,"btn","btn-primary","btn-sm",3,"click"],["type","button",1,"btn","btn-naked","btn-sm",3,"click"],[1,"text-red"],[1,"table","table-bordered","table-hover"],[1,"form-error-message"],[1,"form-error"],[2,"position","relative","padding-left","1rem"],[1,"required-asterisk"],[1,"text-medium"],[1,"text-green"],[1,"text-small","text-grey-lt","mt-1"],[3,"value","severity"],[1,"sg-swatch","sg-swatch--block"],[1,"font-monospaced","text-small","mt-1"],[1,"text-small","text-grey-lt"],[1,"text-grey-lt"],[1,"text-small"],["severity","success",3,"value"],[1,"text-small","text-green"],[1,"text-grey-lt","text-small"],[3,"isInline","alertType"],[3,"isInline","alertType","showIcon"],["alertType","warning",3,"isInline","iconClass"],[2,"width","3rem"],[2,"width","12rem"],[1,"sg-swatch","sg-swatch--dot"],["status","error"],["status","warning"]],template:function(s,o){s&1&&(n(0,"h2"),e(1,"System Alerts & Colored Text"),t(),e(2,` 7998`),n(3,"p",0),e(4,` 7999 Every way the app tells a user something went right, went wrong, or needs attention: 8000 the `),n(5,"code"),e(6,"app-inline-alert"),t(),e(7,` banner/inline component, the site-wide toast 8001 (`),n(8,"code"),e(9,"SiteDataService.showSite*Alert"),t(),e(10," \u2192 "),n(11,"code"),e(12,"p-toast"),t(),e(13,`), the form-validation 8002 text, and the `),n(14,"code"),e(15,".text-*"),t(),e(16,` color modifiers in 8003 `),n(17,"code"),e(18,"1_base/modifiers.scss"),t(),e(19,`. Everything renders against the real partials \u2014 no 8004 harness-local styling. If a sample looks wrong, the component or the partial is wrong. 8005`),t(),e(20,` 8006`),n(21,"p",0),e(22,` 8007 Usage counts are a grep snapshot of `),n(23,"code"),e(24,"ClientApp/src/app"),t(),e(25,` taken 8008 `),n(26,"strong"),e(27),t(),e(28,`, excluding the styleguide itself. They are static \u2014 re-grep 8009 before trusting them for a sweep. Full write-up: 8010 `),n(29,"code"),e(30,"docs/ui-migration-and-review/**/System-Alert-Normalization.md"),t(),e(31,`. 8011`),t(),e(32,` 8012`),n(33,"p",0),e(34,` 8013 The `),n(35,"code"),e(36,"info"),t(),e(37,` intent's blue is studied separately in 8014 `),n(38,"a",1),e(39,"blues & links"),t(),e(40,` \u2014 where it 8015 turns out to be one of several unrelated blues, alongside the link color, the heading color, and 8016 an emerald-green PrimeNG primary nobody overrode. 8017`),t(),e(41,` 8018 8019`),n(42,"div",2),e(43,` 8020 `),n(44,"h3"),e(45,"1. What color is an error? (and a warning, and a success\u2026)"),t(),e(46,` 8021 `),n(47,"p",0),e(48,` 8022 `),n(49,"strong"),e(50,"Read across a row."),t(),e(51,` Each row is one semantic intent; each column is one 8023 mechanism that expresses it. If the app agreed with itself, a row would be one or tw
8023o colors. 8024 The `),n(52,"em"),e(53,"distinct"),t(),e(54,` column counts how many it actually is \u2014 computed from the swatches 8025 beside it, not typed in by hand. 8026 `),t(),e(55,` 8027 8028 `),n(56,"h4",3),e(57,"1a. Today"),t(),e(58,` 8029 `),n(59,"table",4),e(60,` 8030 `),n(61,"thead"),e(62,` 8031 `),n(63,"tr"),e(64,` 8032 `),n(65,"th",5),e(66,"Intent"),t(),e(67,` 8033 `),S(68,e1,4,1,null,null,K),n(70,"th",6),e(71,"Distinct"),t(),e(72,` 8034 `),t(),e(73,` 8035 `),t(),e(74,` 8036 `),n(75,"tbody"),e(76,` 8037 `),S(77,r1,21,5,null,null,a0),t(),e(79,` 8038 `),t(),e(80,` 8039 8040 `),n(81,"p",0),e(82,` 8041 `),n(83,"strong"),e(84,"Toast columns were fixed 2026-08-19"),t(),e(85,` (Wave 4) \u2014 they were stock PrimeNG 8042 Aura (`),n(86,"code"),e(87,"#dc2626"),t(),e(88,", "),n(89,"code"),e(90,"#16a34a"),t(),e(91,`\u2026) and now read from our ramps via 8043 `),n(92,"code"),e(93,"ng-theme.scss"),t(),e(94,`. Error went 6 colors \u2192 3, info 5 \u2192 3. Fire the toasts in 8044 \xA73 next to the banners in \xA72b and they now match. 8045 `),t(),e(95,` 8046 8047 `),n(96,"h4",7),e(97,"1b. Proposed \u2014 one accent per intent (Wave 3, not yet built)"),t(),e(98,` 8048 `),n(99,"p",0),e(100,` 8049 Every row above collapses to `),n(101,"strong"),e(102,"three"),t(),e(103," colors: a "),n(104,"em"),e(105,"fill"),t(),e(106,`, a 8050 `),n(107,"em"),e(108,"border"),t(),e(109,", and one "),n(110,"em"),e(111,"accent"),t(),e(112,` shared by the alert icon, the toast summary, and the 8051 text modifier. Fill and border are already agreed \u2014 the only open value is the accent. 8052 `),t(),e(113,` 8053 `),n(114,"p",0),e(115,` 8054 The accent must clear `),n(116,"strong"),e(117,"4.5:1 on its own fill"),t(),e(118,`, because the toast summary is 8055 16px text. Three intents fail that today, which is why they move. This is not only a toast 8056 concern: `),n(119,"code"),e(120,"success"),t(),e(121,` at 2.65:1 fails even the 3:1 non-text threshold 8057 (WCAG 1.4.11) for the banner icon that ships right now. 8058 `),t(),e(122,` 8059 8060 `),n(123,"table",4),e(124,` 8061 `),n(125,"thead"),e(126,` 8062 `),n(127,"tr"),e(128,` 8063 `),n(129,"th",5),e(130,"Intent"),t(),e(131,` 8064 `),n(132,"th"),e(133,"Fill"),t(),e(134,` 8065 `),n(135,"th"),e(136,"Border"),t(),e(137,` 8066 `),n(138,"th"),e(139,"Accent today"),t(),e(140,` 8067 `),n(141,"th"),e(142,"Accent proposed"),t(),e(143,` 8068 `),n(144,"th",8),e(145,"Text modifier that adopts it"),t(),e(146,` 8069 `),n(147,"th",6),e(148,"Distinct"),t(),e(149,` 8070 `),t(),e(150,` 8071 `),t(),e(151,` 8072 `),n(152,"tbody"),e(153,` 8073 `),S(154,s1,58,19,null,null,a0),t(),e(156,` 8074 `),t(),e(157,` 8075 8076 `),n(158,"p",0),e(159,` 8077 `),n(160,"strong"),e(161,"The honest cost:"),t(),e(162,` three intents change color on 616 inline alerts and it is 8078 visible. `),n(163,"code"),e(164,"--yellow-800"),t(),e(165,` 8079 `),c(166,"span",9),e(167,` is a brown where 8080 `),n(168,"code"),e(169,"--yellow-700"),t(),e(170,` 8081 `),c(171,"span",10),e(172,` is a gold; 8082 `),n(173,"code"),e(174,"--green-800"),t(),e(175,` 8083 `),c(176,"span",11),e(177,` is a forest green 8084 against today's lighter 8085 `),c(178,"span",12),e(179,`. Darker, and more 8086 serious-looking. Compare them against the live samples in \xA72 before deciding. 8087 `),t(),e(180,` 8088 `),n(181,"p",13),e(182,` 8089 `),n(183,"code"),e(184,"note"),t(),e(185," gains no text modifier: "),n(186,"code"),e(187,".text-grey"),t(),e(188,` is a general-purpose 8090 neutral with 480 usages and does not mean "this is a note". That distinction is why the 8091 `),n(189,"code"),e(190,"modifiers.scss"),t(),e(191,` block is grouped Intent / Neutral \u2014 only the Intent group 8092 converges. Still unresolved either way: the `),n(192,"code"),e(193,"--warning"),t(),e(194,` token, read by 20 8093 component stylesheets for validation glyphs, resolves to `),n(195,"code"),e(196,"--red-500"),t(),e(197,` 8094 `),c(198,"span",14),e(199," "),n(200,"code"),e(201,"#e0222b"),t(),e(202,` 8095 \u2014 named `),n(203,"em"),e(204,"warning"),t(),e(205,", colored "),n(206,"em"),e(207,"red"),t(),e(208,`, belonging to neither row. 8096 `),t(),e(209,` 8097`),t(),e(210,` 8098 8099`),n(211,"div",2),e(212,` 8100 `),n(213,"h3"),e(214,"2. "),n(215,"code"),e(216,"app-inline-alert"),t(),e(217," \u2014 full permutation matrix"),t(),e(218,` 8101 `),n(219,"app-sg-caption",15),e(220,'<app-inline-alert [alertType]="\u2026" [isInline]="\u2026" [showIcon]="\u2026">'),t(),e(221,` 8102 `),n(222,"p",0),e(223,` 8103 `),n(224,"strong"),e(225,"616"),t(),e(226," tags across "),n(227,"strong"),e(228,"316"),t(),e(229," files. "),n(230,"code"),e(231,"isInline"),t(),e(232,` picks the 8104 shape: `),n(233,"code"),e(234,"true"),t(),e(235," (442 uses) is bare text + a small solid icon, "),n(236,"code"),e(237,"false"),t(),e(238,` 8105 (53 uses) adds the `),n(239,"code"),e(240,".form-info"),t(),e(241,` padded band with a 5px left border. 8106 `),n(242,"strong"),e(243,"89"),t(),e(244," tags set no "),n(245,"code"),e(246,"alertType"),t(),e(247,` at all and fall through to 8107 `),n(248,"code"),e(249,"info"),t(),e(250,`. 8108 `),t(),e(251,` 8109 8110 `),n(252,"h4",3),e(253,"2a. Inline form \u2014 "),n(254,"code"),e(255,'[isInline]="true"'),t(),e(256," (442 uses)"),t(),e(257,` 8111 `),n(258,"table",16),e(259,` 8112 `),n(260,"thead"),e(261,` 8113 `),n(262,"tr"),e(263,` 8114 `),n(264,"th",17),e(265,"alertType"),t(),e(266,` 8115 `),n(267,"th"),e(268,"With icon (default)"),t(),e(269,` 8116 `),n(270,"th"),e(271,'[showIcon]="false" (21 uses)'),t(),e(272,` 8117 `),t(),e(273,` 8118 `),t(),e(274,` 8119 `),n(275,"tbody"),e(276,` 8120 `),S(277,d1,20,6,null,null,K),t(),e(279,` 8121 `),t(),e(280,` 8122 8123 `),n(281,"h4",3),e(282,"2b. Banner form \u2014 "),n(283,"code"),e(284,'[isInline]="false"'),t(),e(285," (53 uses)"),t(),e(286,` 8124 `),n(287,"p",0),e(288,` 8125 This is the only shape that paints a background. The icon jumps to 8126 `),n(289,"code"),e(290,"fal text-jumbo"),t(),e(291,` (38px light-weight) and the wrapper picks up 8127 `),n(292,"code"),e(293,".form-info"),t(),e(294,`. 8128 `),t(),e(295,` 8129 `),n(296,"table",16),e(297,` 8130 `),n(298,"thead"),e(299,` 8131 `),n(300,"tr"),e(301,` 8132 `),n(302,"th",17),e(303,"alertType"),t(),e(304,` 8133 `),n(305,"th"),e(306,"With icon (default)"),t(),e(307,` 8134 `),n(308,"th"),e(309,'[showIcon]="false"'),t(),e(310,` 8135 `),t(),e(311,` 8136 `),t(),e(312,` 8137 `),n(313,"tbody"),e(314,` 8138 `),S(315,m1,20,6,null,null,K),t(),e(317,` 8139 `),t(),e(318,` 8140 8141 `),n(319,"h4",3),e(320,"2c. Long content & markup children"),t(),e(321,` 8142 `),n(322,"div",18),e(323,` 8143 `),n(324,"app-inline-alert",19),e(325,` 8144 `),n(326,"strong"),e(327,"This program is over capacity."),t(),e(328,` 8145 `),n(329,"p",20),e(330,` 8146 12 registrations are on the waitlist. Raising the cap admits them in the order they 8147 signed up; lowering it does not remove anyone already registered. 8148 `),t(),e(331,` 8149 `),t(),e(332,` 8150 `),t(),e(333,` 8151 `),n(334,"div",18),e(335,` 8152 `),n(336,"app-inline-alert",21),e(337,` 8153 A very long single-line message that has to wrap inside the flex row without pushing the 8154 icon out of alignment or letting the text collide with the icon gutter \u2014 the 8155 `),n(338,"code"),e(339,".min-width-0"),t(),e(340,` span on the content slot is what makes this behave. 8156 `),t(),e(341,` 8157 `),t(),e(342,` 8158
8159 `),n(343,"h4",3),e(344,"2d. Custom "),n(345,"code"),e(346,"iconClass"),t(),e(347," overrides (48 uses)"),t(),e(348,` 8160 `),n(349,"p",0),e(350,` 8161 Callers can replace the icon. The component `),n(351,"em"),e(352,"appends"),t(),e(353,` its own sizing classes to 8162 whatever is passed, so an override that already names a weight ends up with two 8163 (`),n(354,"code"),e(355,"fas \u2026 fal"),t(),e(356,`) \u2014 see \xA77. 8164 `),t(),e(357,` 8165 `),n(358,"table",16),e(359,` 8166 `),n(360,"thead"),e(361,` 8167 `),n(362,"tr"),e(363,` 8168 `),n(364,"th",22),e(365,"iconClass"),t(),e(366,` 8169 `),n(367,"th",23),e(368,"Uses"),t(),e(369,` 8170 `),n(370,"th"),e(371,"Rendered"),t(),e(372,` 8171 `),t(),e(373,` 8172 `),t(),e(374,` 8173 `),n(375,"tbody"),e(376,` 8174 `),S(377,c1,17,4,null,null,Jx),t(),e(379,` 8175 `),t(),e(380,` 8176`),t(),e(381,` 8177 8178`),n(382,"div",2),e(383,` 8179 `),n(384,"h3"),e(385,"3. Toasts \u2014 "),n(386,"code"),e(387,"SiteDataService.showSite*Alert"),t()(),e(388,` 8180 `),n(389,"app-sg-caption",15),e(390,"siteDataService.showSiteSuccessAlert('\u2026')"),t(),e(391,` 8181 `),n(392,"p",0),e(393,` 8182 `),n(394,"strong"),e(395,"3,571"),t(),e(396," call sites across "),n(397,"strong"),e(398,"751"),t(),e(399,` files \u2014 by volume this is the 8183 app's dominant alert surface. Every call funnels into one 8184 `),n(400,"code"),e(401,'<p-toast key="default" position="bottom-right">'),t(),e(402,` in 8185 `),n(403,"code"),e(404,"app.component.html"),t(),e(405,`. The summary line is hardcoded per method 8186 (`),n(406,"code"),e(407,"Success!"),t(),e(408," / "),n(409,"code"),e(410,"Error!"),t(),e(411," / "),n(412,"code"),e(413,"Warning!"),t(),e(414," / "),n(415,"code"),e(416,"Info"),t(),e(417,`); 8187 callers only supply the detail string. 8188 `),t(),e(418,` 8189 `),n(419,"p",0),e(420,` 8190 `),n(421,"code"),e(422,"app.module.ts"),t(),e(423,` registers the stock Aura preset, so severity colors used to be 8191 Aura's own green/blue/yellow/red. `),n(424,"code"),e(425,"ng-theme.scss"),t(),e(426,` now overrides the 8192 `),n(427,"code"),e(428),t(),e(429," tokens under "),n(430,"code"),e(431,"html:root"),t(),e(432,` \u2014 8193 fill and border match the \xA72b banner for the same intent. The summary/icon color is a 8194 `),n(433,"em"),e(434,"darker"),t(),e(435,` ramp step than the banner's icon on purpose: toast summary is 16px text and 8195 must clear 4.5:1, where an icon only needs 3:1. Copying the banner's icon color verbatim 8196 would have shipped `),n(436,"code"),e(437,"success"),t(),e(438," at 2.65:1 and "),n(439,"code"),e(440,"warn"),t(),e(441,` at 3.00:1. 8197 `),t(),e(442,` 8198 8199 `),n(443,"table",16),e(444,` 8200 `),n(445,"thead"),e(446,` 8201 `),n(447,"tr"),e(448,` 8202 `),n(449,"th"),e(450,"Method"),t(),e(451,` 8203 `),n(452,"th"),e(453,"Severity"),t(),e(454,` 8204 `),n(455,"th"),e(456,"Summary (hardcoded)"),t(),e(457,` 8205 `),n(458,"th"),e(459,"Life"),t(),e(460,` 8206 `),n(461,"th"),e(462,"Uses"),t(),e(463,` 8207 `),n(464,"th"),e(465,"Fire it"),t(),e(466,` 8208 `),t(),e(467,` 8209 `),t(),e(468,` 8210 `),n(469,"tbody"),e(470,` 8211 `),n(471,"tr"),e(472,` 8212 `),n(473,"td")(474,"code"),e(475,"showSiteSuccessAlert"),t()(),e(476,` 8213 `),n(477,"td")(478,"code"),e(479,"success"),t()(),e(480,` 8214 `),n(481,"td"),e(482,"Success!"),t(),e(483,` 8215 `),n(484,"td"),e(485,"3000ms"),t(),e(486,` 8216 `),n(487,"td"),e(488,"1,121"),t(),e(489,` 8217 `),n(490,"td")(491,"button",24),g("click",function(){return o.fireSuccessToast()}),e(492,"Fire"),t()(),e(493,` 8218 `),t(),e(494,` 8219 `),n(495,"tr"),e(496,` 8220 `),n(497,"td")(498,"code"),e(499,"showSiteErrorAlert"),t()(),e(500,` 8221 `),n(501,"td")(502,"code"),e(503,"error"),t()(),e(504,` 8222 `),n(505,"td"),e(506,"Error!"),t(),e(507,` 8223 `),n(508,"td"),e(509,"8000ms"),t(),e(510,` 8224 `),n(511,"td"),e(512,"2,363"),t(),e(513,` 8225 `),n(514,"td")(515,"button",24),g("click",function(){return o.fireErrorToast()}),e(516,"Fire"),t()(),e(517,` 8226 `),t(),e(518,` 8227 `),n(519,"tr"),e(520,`
8228 `),n(521,"td")(522,"code"),e(523,"showSiteWarnAlert"),t()(),e(524,` 8229 `),n(525,"td")(526,"code"),e(527,"warn"),t()(),e(528,` 8230 `),n(529,"td"),e(530,"Warning!"),t(),e(531,` 8231 `),n(532,"td"),e(533,"8000ms"),t(),e(534,` 8232 `),n(535,"td"),e(536,"44"),t(),e(537,` 8233 `),n(538,"td")(539,"button",24),g("click",function(){return o.fireWarnToast()}),e(540,"Fire"),t()(),e(541,` 8234 `),t(),e(542,` 8235 `),n(543,"tr"),e(544,` 8236 `),n(545,"td")(546,"code"),e(547,"showSiteInfoAlert"),t()(),e(548,` 8237 `),n(549,"td")(550,"code"),e(551,"info"),t()(),e(552,` 8238 `),n(553,"td"),e(554,"Info"),t(),e(555,` 8239 `),n(556,"td"),e(557,"8000ms"),t(),e(558,` 8240 `),n(559,"td"),e(560,"43"),t(),e(561,` 8241 `),n(562,"td")(563,"button",24),g("click",function(){return o.fireInfoToast()}),e(564,"Fire"),t()(),e(565,` 8242 `),t(),e(566,` 8243 `),n(567,"tr"),e(568,` 8244 `),n(569,"td")(570,"code"),e(571,"showSiteErrorAlertDefaultGET"),t()(),e(572,` 8245 `),n(573,"td")(574,"code"),e(575,"error"),t()(),e(576,` 8246 `),n(577,"td"),e(578,"Error! \u2014 "),n(579,"em"),e(580,'"There was a problem loading data"'),t()(),e(581,` 8247 `),n(582,"td"),e(583,"8000ms"),t(),e(584,` 8248 `),n(585,"td"),e(586,"151"),t(),e(587,` 8249 `),n(588,"td")(589,"button",24),g("click",function(){return o.fireDefaultGetToast()}),e(590,"Fire"),t()(),e(591,` 8250 `),t(),e(592,` 8251 `),t(),e(593,` 8252 `),t(),e(594,` 8253 `),n(595,"button",25),g("click",function(){return o.clearToasts()}),e(596,"clearAllSiteAlerts()"),t(),e(597,` 8254`),t(),e(598,` 8255 8256`),n(599,"div",2),e(600,` 8257 `),n(601,"h3"),e(602),L(603,"number"),t(),e(604,` 8258 `),n(605,"app-sg-caption",15),e(606,'1_base/modifiers.scss \u2014 "#region Text Colors"'),t(),e(607,` 8259 `),n(608,"p",0),e(609,` 8260 Grouped exactly as the SCSS is grouped, so this page and the partial read the same way. 8261 Sample text carries the live class \u2014 what you see is what the app renders. 8262 `),t(),e(610,` 8263 8264 `),S(611,g1,44,2,null,null,Zx),t(),e(613,` 8265 8266`),n(614,"div",2),e(615,` 8267 `),n(616,"h3"),e(617,"5. Colored text modifiers \u2014 "),n(618,"span",26),e(619,"undefined"),t(),e(620),t(),e(621,` 8268 `),n(622,"app-sg-caption",15),e(623,"no matching rule anywhere in src/"),t(),e(624,` 8269 `),n(625,"p",0),e(626,` 8270 These Bootstrap-style class names are used throughout the templates but are 8271 `),n(627,"strong"),e(628,"not defined"),t(),e(629," \u2014 not in "),n(630,"code"),e(631,"modifiers.scss"),t(),e(632,`, not in any other partial, 8272 not in PrimeNG, and PrimeFlex is not installed (it is commented out in 8273 `),n(633,"code"),e(634,"styles.scss"),t(),e(635,`). Each sample below carries the real class and inherits body color, 8274 which is the whole point: `),n(636,"strong"),e(637),t(),e(638,` 8275 `),t(),e(639,` 8276 8277 `),n(640,"table",27),e(641,` 8278 `),n(642,"thead"),e(643,` 8279 `),n(644,"tr"),e(645,` 8280 `),n(646,"th"),e(647,"Class"),t(),e(648,` 8281 `),n(649,"th"),e(650,"Sample (renders as body text)"),t(),e(651,` 8282 `),n(652,"th"),e(653,"Uses"),t(),e(654,` 8283 `),n(655,"th"),e(656,"Files"),t(),e(657,` 8284 `),n(658,"th"),e(659,"Almost certainly meant"),t(),e(660,` 8285 `),t(),e(661,` 8286 `),t(),e(662,` 8287 `),n(663,"tbody"),e(664,` 8288 `),S(665,f1,21,6,null,null,r0),t(),e(667,` 8289 `),t(),e(668,` 8290 8291 `),n(669,"p",13),e(670,` 8292 Two component stylesheets define a local `),n(671,"code"),e(672,".text-danger"),t(),e(673,` 8293 (`),n(674,"code"),e(675,"admin/report/create-scheduled-report"),t(),e(676,`, 8294 `),n(677,"code"),e(678,"shared/modules/components/message-edit-bubble"),t(),e(679,`), so the class works on those two 8295 screens and nowhere else. 8296 `),t(),e(680,` 8297`),t(),e(681,` 8298 8299`),n(682,"div",2),e(683,` 8300 `),n(684,"h3"),e(685,"6. Validation & form messaging"),t(),e(686,` 8301 `),n(687,"app-sg-caption",15),e(688,"2_layout/forms.scss"),t(),e(689,` 8302 `),n(690,"p",0),e(691,`
8303 A fourth palette. These carry their own reds and are not wired to 8304 `),n(692,"code"),e(693,"--error"),t(),e(694,", to "),n(695,"code"),e(696,".text-red"),t(),e(697,`, or to the inline-alert error color. 8305 `),t(),e(698,` 8306 8307 `),n(699,"table",16),e(700,` 8308 `),n(701,"thead"),e(702,` 8309 `),n(703,"tr"),e(704,` 8310 `),n(705,"th"),e(706,"Class"),t(),e(707,` 8311 `),n(708,"th"),e(709,"Sample"),t(),e(710,` 8312 `),n(711,"th"),e(712,"Color"),t(),e(713,` 8313 `),n(714,"th"),e(715,"Uses"),t(),e(716,` 8314 `),t(),e(717,` 8315 `),t(),e(718,` 8316 `),n(719,"tbody"),e(720,` 8317 `),n(721,"tr"),e(722,` 8318 `),n(723,"td")(724,"code"),e(725,".form-error-message"),t()(),e(726,` 8319 `),n(727,"td")(728,"span",28),e(729,"Email address is required."),t()(),e(730,` 8320 `),n(731,"td")(732,"code"),e(733,"var(--red-700)"),t(),e(734," #a11019"),t(),e(735,` 8321 `),n(736,"td"),e(737,"\u2014"),t(),e(738,` 8322 `),t(),e(739,` 8323 `),n(740,"tr"),e(741,` 8324 `),n(742,"td")(743,"code"),e(744,".form-error"),t()(),e(745,` 8325 `),n(746,"td")(747,"span",29),e(748,"Wrapper on "),n(749,"code"),e(750,".form-group"),t(),e(751,"; also the dynamic-form error slot."),t()(),e(752,` 8326 `),n(753,"td")(754,"code"),e(755,"color: var(--warning)"),t(),e(756," in ~10 component stylesheets"),t(),e(757,` 8327 `),n(758,"td"),e(759,"117"),t(),e(760,` 8328 `),t(),e(761,` 8329 `),n(762,"tr"),e(763,` 8330 `),n(764,"td")(765,"code"),e(766,".required-asterisk"),t()(),e(767,` 8331 `),n(768,"td")(769,"span",30)(770,"span",31),e(771,"*"),t(),e(772," Required field"),t()(),e(773,` 8332 `),n(774,"td")(775,"code"),e(776,"var(--orange-500)"),t(),e(777," #ff7500"),t(),e(778,` 8333 `),n(779,"td"),e(780,"\u2014"),t(),e(781,` 8334 `),t(),e(782,` 8335 `),t(),e(783,` 8336 `),t(),e(784,` 8337 8338 `),n(785,"p",13),e(786,` 8339 `),n(787,"code"),e(788,"--warning"),t(),e(789,` is declared under "Orphan Colors" as 8340 `),n(790,"code"),e(791,"var(--red-500)"),t(),e(792," \u2014 "),n(793,"strong"),e(794,"warning is red"),t(),e(795,`, not yellow. 20 stylesheets 8341 read it, mostly for validation glyphs. Meanwhile the inline alert's warning band is yellow 8342 and `),n(796,"code"),e(797,".text-warning"),t(),e(798," is "),n(799,"code"),e(800,"--yellow-600"),t(),e(801,`. Three different answers to 8343 "what color is a warning." 8344 `),t(),e(802,` 8345`),t(),e(803,` 8346 8347`),n(804,"div",2),e(805,` 8348 `),n(806,"h3"),e(807,"7. Where the mechanisms disagree"),t(),e(808,` 8349 `),n(809,"p",0),e(810,` 8350 The findings this page exists to make visible. Each is expanded in 8351 `),n(811,"code"),e(812,"docs/ui-migration-and-review/**/System-Alert-Normalization.md"),t(),e(813,`. 8352 `),t(),e(814,` 8353 `),n(815,"ol",32),e(816,` 8354 `),n(817,"li"),e(818,` 8355 `),n(819,"strong"),e(820),t(),e(821,` \u2014 \xA75. The largest single 8356 defect on the page and a pure find-replace once the mapping is agreed. 8357 `),t(),e(822,` 8358 `),n(823,"li"),e(824,` 8359 `),n(825,"strong")(826,"code"),e(827,"--warning"),t(),e(828," is red"),t(),e(829," ("),n(830,"code"),e(831,"--red-500"),t(),e(832,`) while every other 8360 warning surface is yellow \u2014 \xA76. 8361 `),t(),e(833,` 8362 `),n(834,"li"),e(835,` 8363 `),n(836,"strong",33),e(837,"Toasts used a different palette from everything else"),t(),e(838,` 8364 \u2014 stock Aura severity colors vs. our own family. `),n(839,"strong"),e(840,"Fixed 2026-08-19"),t(),e(841,` in 8365 `),n(842,"code"),e(843,"ng-theme.scss"),t(),e(844,` \u2014 \xA73. 8366 `),t(),e(845,` 8367 `),n(846,"li"),e(847,` 8368 `),n(848,"strong"),e(849,"Error red is inconsistent across mechanisms:"),t(),e(850,` inline-alert icon 8369 `),n(851,"code"),e(852,"--red-700"),t(),e(853,", inline-alert band border "),n(854,"code"),e(855,"--red-800"),t(),e(856,` on a 8370 `),n(857,"code"),e(858,"--red-100"),t(),e(859,` fill (#fdb5b8, a mid-tone pink used as a background), 8371 `),n(860,"code"),e(861,".text-red"),t(),e(862," "),n(863,"code"),e(864,"--red-700"),t(),e(865,", "),n(866,"code"),e(867,".text-dark-red"),t(),e(868,` 8372 `),n(869,"code"),e(870,"--red-800"),t(),e(871,", "),n(872,"code"),e(873,"--warning"),t(),e(874," "),n(875,"code"),e(876,"--red-500"),t(),e(877,`. 8373 `),t(),e(878,` 8374 `),n(879,"li"),e(880,`
8375 `),n(881,"strong"),e(882,"Two aliases for one thing:"),t(),e(883," "),n(884,"code"),e(885,".text-warn"),t(),e(886,` and 8376 `),n(887,"code"),e(888,".text-warning"),t(),e(889,` are the same rule (25 + 38 uses); 8377 `),n(890,"code"),e(891,".text-green"),t(),e(892," ("),n(893,"code"),e(894,"--green-700"),t(),e(895,") and "),n(896,"code"),e(897,".text-green-alt"),t(),e(898,` 8378 (`),n(899,"code"),e(900,"--green-600"),t(),e(901,`) differ by one step with no documented reason. 8379 `),t(),e(902,` 8380 `),n(903,"li"),e(904,` 8381 `),n(905,"strong")(906,"code"),e(907,"iconClass"),t(),e(908," is appended to, not replaced"),t(),e(909,` \u2014 the component does 8382 `),n(910,"code"),e(911,"this.iconClass += \u2026"),t(),e(912," inside "),n(913,"code"),e(914,"ngOnChanges"),t(),e(915,`, so a caller-supplied 8383 weight collides with the component's own, and any post-init input change appends the 8384 sizing classes a second time. 8385 `),t(),e(916,` 8386 `),n(917,"li"),e(918,` 8387 `),n(919,"strong"),e(920,"No toast equivalent for "),n(921,"code"),e(922,"note"),t()(),e(923,`, and no inline equivalent for 8388 the `),n(924,"code"),e(925,"showSiteErrorAlertDefaultGET"),t(),e(926,` convenience wrapper. 8389 `),t(),e(927,` 8390 `),n(928,"li"),e(929,` 8391 `),n(930,"strong"),e(931,"Four classes carry "),n(932,"code"),e(933,"!important"),t()(),e(934,` 8392 (`),n(935,"code"),e(936,".text-grey-lt"),t(),e(937,", "),n(938,"code"),e(939,".text-navy"),t(),e(940,", "),n(941,"code"),e(942,".text-white"),t(),e(943,`, and 8393 `),n(944,"code"),e(945,".text-highlight"),t(),e(946,`'s background) \u2014 \xA74. Nothing in the block explains why those 8394 four and not the other thirteen. 8395 `),t(),e(947,` 8396 `),n(948,"li"),e(949,` 8397 `),n(950,"strong"),e(951,"78 inline "),n(952,"code"),e(953,'style="color: \u2026"'),t(),e(954," attributes"),t(),e(955,` and 8398 `),n(956,"strong"),e(957,"194 hardcoded "),n(958,"code"),e(959,"color: #\u2026"),t(),e(960," declarations"),t(),e(961,` in component 8399 stylesheets sit outside the token system entirely. 8400 `),t(),e(962,` 8401 `),t(),e(963,` 8402`),t(),e(964,` 8403`)),s&2&&(i(27),p(o.snapshotDate),i(11),m("routerLink","/admin/styleguide/global/blues-and-links"),i(30),E(o.comparisonColumns),i(9),E(o.comparison),i(77),E(o.proposal),i(123),E(o.intents),i(38),E(o.intents),i(9),m("isInline",!1),i(12),m("isInline",!0),i(41),E(o.customIconSamples),i(51),q("--p-toast-","{","severity","}","-*"),i(174),f("4. Colored text modifiers \u2014 defined (",ze(603,10,o.definedTotal)," uses)"),i(9),E(o.modifierGroups),i(9),f(" (",o.ghostTotal," uses)"),i(17),f("",o.ghostTotal," usages render as no-ops."),i(28),E(o.ghostModifiers),i(155),f("",o.ghostTotal," colored-text usages are no-ops"))},dependencies:[$,J,le,Nt,X,Ye],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var b1=["*"];function S1(a,r){if(a&1&&(e(0,` 8404 `),c(1,"app-pill",5),e(2,` 8405 `)),a&2){let l=u();i(),m("text",l.moduleLabel)}}function E1(a,r){if(a&1&&(e(0,` 8406 `),c(1,"app-pill",6),e(2,` 8407 `)),a&2){let l=u();i(),m("text",l.note)}}var v1="shared/modules/components/",l0=(()=>
8407{let r=class r{constructor(){this.module="components",this.libraryRoot=v1}get moduleLabel(){return r.moduleLabels[this.module]}};r.moduleLabels={components:"ComponentsModule",message:"MessageModule",tooltip:"TooltipModule",standalone:"standalone"},r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-sg-specimen"]],inputs:{name:"name",path:"path",module:"module",note:"note"},standalone:!1,ngContentSelectors:b1,decls:19,vars:5,consts:[[1,"sg-specimen"],[1,"sg-specimen-head"],[1,"text-small"],[1,"text-smallest","text-grey-lt","ml-2"],[1,"sg-specimen-body"],["variant","tag","status","secondary",3,"text"],["variant","tag","status","warning",3,"text"]],template:function(s,o){s&1&&(ke(),n(0,"div",0),e(1,` 8408 `),n(2,"div",1),e(3,` 8409 `),n(4,"code",2),e(5),t(),e(6,` 8410 `),n(7,"span",3),e(8),t(),e(9,` 8411 `),v(10,S1,3,1),v(11,E1,3,1),t(),e(12,` 8412 `),n(13,"div",4),e(14,` 8413 `),Te(15),e(16,` 8414 `),t(),e(17,` 8415`),t(),e(18,` 8416`)),s&2&&(i(5),f("<",o.name,">"),i(3),q("",o.libraryRoot,"",o.path),i(2),y(o.module!=="components"?10:-1),i(),y(o.note?11:-1))},dependencies:[J],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var w1=()=>[],C1=()=>["Shared balance","Per-player ledger","Refunds"],_1=(a,r)=>r.anchor;function k1(a,r){if(a&1&&(e(0,` 8417 `),n(1,"li"),e(2,` 8418 `),n(3,"a",249)(4,"strong"),e(5),t()(),e(6,` 8419 `),n(7,"span",250),e(8),t(),e(9,` 8420 `),t(),e(10,` 8421 `)),a&2){let l=r.$implicit;i(3),m("href","#"+l.anchor,kt),i(2),p(l.title),i(3),q(" \u2014 ",l.count," \u2014 ",l.blurb)}}function T1(a,r){a&1&&(e(0,` 8422 `),c(1,"app-admin-nav-search-filter"),e(2,` 8423 `))}function I1(a,r){if(a&1){let l=B();e(0,` 8424 `),n(1,"app-roster-card-content",251),g("viewProfileButton",function(){w(l);let s=u();return C(s.noop())}),t(),e(2,` 8425 `)}if(a&2){let l=u();i(),m("player",l.rosterPlayer)("showProfileButton",!0)}}function M1(a,r){if(a&1&&(e(0,` 8426 `),n(1,"app-message-time-tag",252),e(2,` 8427 `),t(),e(3,` 8428 `)),a&2){let l=u();i(),m("start",l.calendarEvent.startDate)("end",l.calendarEvent.endDate)}}function D1(a,r){if(a&1){let l=B();e(0,` 8429 `),n(1,"app-ai-chat-window",253),g("closeChatEvent",function(){w(l);let s=u();return C(s.noop())}),t(),e(2,` 8430 `)}}function F1(a,r){if(a&1){let l=B();e(0,` 8431 `),n(1,"app-attendance-toggle",254),g("modalClosed",function(){w(l);let s=u();return C(s.noop())}),t(),e(2,` 8432 `)}if(a&2){let l=u();i(),m("calEvent",l.calendarEvent)("teamID",2228)}}function P1(a,r){if(a&1){let l=B();e(0,` 8433 `),n(1,"app-attendance-tracking-toggle",255),g("modalClosed",function(){w(l);let s=u();return C(s.noop())})("attendanceChanged",function(){w(l);let s=u();return C(s.noop())}),t(),e(2,` 8434 `)}if(a&2){let l=u();i(),m("calEvent",l.calendarEvent)}}function A1(a,r){if(a&1){let l=B();e(0,` 8435 `),n(1,"app-calendar-team-filter",256),g("toggleTeam",function(){w(l);let s=u();return C(s.noop())}),t(),e(2,` 8436 `)}if(a&2){let l=u();i(),m("team",l.team)("isAdmin",!0)}}function O1(a,r){a&1&&(e(0,` 8437 `),n(1,"app-consent-gated-third-party-content"),e(2,` 8438 `),n(3,"p",15),e(4,"Third-party content renders here once consent is given."),t(),e(5,` 8439 `),t(),e(6,` 8440 `))}function N1(a,r){if(a&1){let l=B();e(0,` 8441 `),n(1,"app-drag-drop-file-upload",257),g("filesChanged",function(){w(l);let s=u();return C(s.noop())})("onFileClick",function(){w(l);let s=u();return C(s.noop())}),t(),e(2,` 8442 `)}if(a&2){let l=u();i(),m("maxFiles",5)("existingFiles",l.existingFiles)}}function B1(a,r){if(a&1){let l=B();e(0,` 8443 `),n(1,"app-gif-picker",258),g("gifSelected",function(){w(l);let s=u();return C(s.noop())})("gifCancel",function(){w(l);let s=u();return C(s.noop())})("gifSearch",function(){w(l);let s=u();return C(s.noop())}),e(2,` 8444 `),t(),e(3,` 8445 `)}}function W1(a,r){if(a&1){let l=B();e(0,` 8446 `),n(1,"app-image-cropper",259),g("finalImage",function(){w(l);let s=u();return C(s.noop())})("onCancel",function(){w(l);let s=u();return C(s.noop())}),t(),e(2,` 8447 `)}if(a&2){let l=u();i(),m("imageURL",l.sampleImage)("icAspectRatio",1)("showCancel",!0)("showPresetDimensions",l.presetDimensions)}}function R1(a,r){if(a&1){let l=B();e(0,` 8448 `),n(1,"app-multiple-file-upload",260),g("onSelect",function(){w(l);let s=u();return C(s.noop())})("onDownload",function(){w(l);let s=u();return C(s.noop())})("onDelete",function(){w(l);let s=u();return C(s.noop())})("onChange",function(){w(l);let s=u();return C(s.noop())}),e(2,` 8449 `),t(),e(3,` 8450 `)}if(a&2){let l=u();i(),m("fGroup",l.fg)("files",l.documents)("fileLimit",5)}}function L1(a,r){if(a&1){let l=B();e(0,` 8451 `),n(1,"app-poll-details-view",261),g("close",function(){w(l);let s=u(2);return C(s.modals.pollDetails=!1)})("save",function(){w(l);let s=u(2);return C(s.noop())})("voteSubmitted",function(){w(l);let s=u(2);return C(s.noop())})("refreshPollRequested",function(){w(l);let s=u(2);return C(s.noop())})("deleteClicked",function(){w(l);let s=u(2);return C(s.noop())}),t(),e(2,` 8452 `)}if(a&2){let l=u(2);i(),m("existingPoll",l.poll)("readonly",!0)("clubUserID",1)}}function q1(a,r){if(a&1){let l=B();e(0,` 8453 `),n(1,"button",154),g("click",function(){w(l);let s=u();return C(s.open("pollDetails"))}),e(2,` 8454 Mount poll details 8455 `),t(),e(3,` 8456 `),v(4,L1,3,3)}if(a&2){let l=u();i(4),y(l.modals.pollDetails?4:-1)}}function V1(a,r){if(a&1&&(e(0,` 8457 `),n(1,"app-quick-rsvp-bubbles",262),e(2,` 8458 `),t(),e(3,` 8459 `),n(4,"app-quick-rsvp-bubbles",263),e(5,` 8460 `),t(),e(6,` 8461 `),n(7,"app-quick-rsvp-bubbles",264),e(8,` 8462 `),t(),e(9,` 8463 `)),a&2){let l=u();i(),m("event",l.calendarEvent)("teamID",2228),i(3),m("event",l.calendarEvent)("teamID",2228),i(3),m("event",l.calendarEvent)("teamID",2228)}}function z1(a,r){a&1&&(e(0,` 8464 `),c(1,"app-time-dots",265),e(2,` 8465 `),c(3,"app-time-dots",265),e(4,` 8466 `)),a&2&&(i(),m("durationInMinutes",45),i(2),m("durationInMinutes",90))}function U1(a,r){if(a&1){let l=B();e(0,` 8467 `),n(1,"app-yes-no-modal",266),g("onYesSelect",function(){w(l);let s=u();return C(s.modals.yesNo=!1)})("onNoSelect",function(){w(l);let s=u();return C(s.modals.yesNo=!1)}),e(2,` 8468 `),t(),e(3,` 8469 `)}}var s0=(()=>
8469{let r=class r{constructor(d){this.snapshotDate="2026-09-03",this.groups=[{anchor:"admin",title:"admin/",folder:"admin/",count:8,blurb:"Admin page chrome \u2014 headers, dashboard cards, filters."},{anchor:"agent-chat",title:"agent-chat/",folder:"agent-chat/",count:6,blurb:"The conversational agent surface."},{anchor:"cards",title:"cards/",folder:"cards/",count:8,blurb:"Card components. Also documented in depth on the cards page."},{anchor:"layout",title:"layout/",folder:"layout/",count:3,blurb:"Banners and sidebar tabs."},{anchor:"message",title:"message/",folder:"message/",count:10,blurb:"MessageModule \u2014 the messaging thread surface."},{anchor:"null-states",title:"null-states/",folder:"null-states/",count:2,blurb:"Empty and loading placeholders."},{anchor:"status-indicator",title:"status-indicator/",folder:"status-indicator/",count:2,blurb:"Status dots and their large variant."},{anchor:"root",title:"root-level",folder:"",count:59,blurb:"The 59 components that sit directly under the library root, alphabetical by folder."}],this.modals={yesNo:!1,fileViewer:!1,messageEdit:!1,messageEditModal:!1,messageReport:!1,messageThreadDetails:!1,pollDetails:!1,gifPicker:!1,imageCropper:!1},this.fg=new ba({specimenFile:new Wi(null),specimenFiles:new Wi(null)}),this.toggles=[{label:"Published",value:!0},{label:"Locked",value:!1}],this.navSteps=[{id:1,label:"Account",sections:[{id:1,label:"Contact"},{id:2,label:"Password"}]},{id:2,label:"Players",sections:[{id:3,label:"Roster"}]},{id:3,label:"Payment",sections:[]}],this.sidebarTabs=[{label:"Overview",icon:"fa-regular fa-chart-simple",routerLink:null,badge:null},{label:"Roster",icon:"fa-regular fa-users",routerLink:null,badge:"18"},{label:"Schedule",icon:"fa-regular fa-calendar",routerLink:null,badge:null}],this.menuItems=[{label:"Edit",icon:"fa fa-pen"},{label:"Duplicate",icon:"fa fa-copy"},{separator:!0},{label:"Delete",icon:"fa fa-trash"}],this.agentMessages=[{messageID:1,role:"user",text:"How many players still owe a balance?"},{messageID:2,role:"assistant",text:"Four players have an outstanding balance on the Fall 2026 program."}],this.agentQuestions=[{key:"season",label:"Which season?",type:"select",options:[{label:"Fall 2026",value:1},{label:"Spring 2027",value:2}]}],this.agentAnswer={summary:"Four players have an outstanding balance.",blocks:[{type:"text",text:"Balances range from $25 to $340."}]},this.rosterPlayer={user:{firstName:"Jordan",lastName:"Alvarez",email:"[email protected]",cellPhone:"(555) 010-1234"},playerClubData:{jerseyNumber:"17",position:"Midfield",height:`5' 9"`,graduationYear:2028},playerCollegeData:{gpa:"3.6",satScore:1280}},this.staffClubUser={user:{firstName:"Riley",lastName:"Chen",email:"[email protected]"},staffProfile:{title:"Director of Coaching",bio:"Fifteen seasons with the club."},staffProgramAssignments:[{programName:"Fall 2026 Travel"}]},this.gameResult={teamScore:3,opponentTeamScore:2,teamScorePeriod:[1,2],opponentTeamScorePeriod:[2,0]},this.calendarEvent={clubCalendarEventID:1,clubEventTypeID:1,title:"Practice \u2014 Field 3",startDate:new Date,endDate:new Date,rsvpGoing:12,rsvpNotGoing:2,rsvpMaybe:3},this.team={teamID:2228,teamName:"U14 Boys Blue",teamColor:"#003261"},this.weekEvents=[{title:"Practice",start:new Date,end:new Date(Date.now()+36e5)}],this.weekResources=[{id:"1",title:"Field 1"},{id:"2",title:"Field 2"}],this.trainingFocuses=[{clubTrainingFocusID:1,name:"Finishing"},{clubTrainingFocusID:2,name:"Possession"},{clubTrainingFocusID:3,name:"Set pieces"},{clubTrainingFocusID:4,name:"Pressing"}],this.viewOnlyFields=[{key:"firstName",label:"First Name",type:"textbox",required:!0,hidden:!1},{key:"email",label:"Email",type:"textbox",required:!1,hidden:!1}],this.viewOnlyEntity={firstName:"Jordan",email:"[email protected]"},this.mfaStatus={isEnrolled:!1,canEnroll:!0,methods:[]},this.pollOptions=[{pollOptionID:1,text:"Saturday morning",voteCount:7},{pollOptionID:2,text:"Saturday afternoon",voteCount:4},{pollOptionID:3,text:"Sunday morning",voteCount:2}],this.poll={pollID:1,question:"Which time works best for the makeup session?",isClosed:!1,totalVotes:13,options:this.pollOptions},this.quotedMessage={messageID:9,messageText:"Bring both jerseys on Saturday.",firstName:"Riley",lastName:"Chen"},this.pinnedMessages=[{messageID:9,messageText:"Bring both jerseys on Saturday.",firstName:"Riley",lastName:"Chen",sentDate:new Date().toISOString()}],this.reactions=[{emoji:"\u{1F44D}",count:3}],this.threadRecipients=[{clubUserID:1,firstName:"Jordan",lastName:"Alvarez"},{clubUserID:2,firstName:"Riley",lastName:"Chen"}],this.editableMessage={messageID:9,messageText:"Bring both jerseys on Saturday.",firstName:"Riley",lastName:"Chen"},this.existingFiles=[{fileName:"waiver-signed.pdf",fileSize:184320,url:null}],this.documents=[{documentID:1,fileName:"medical-release.pdf",fileSizeBytes:22e4}],this.presetDimensions=[{numerator:16,denominator:9,name:"Banner"},{numerator:1,denominator:1,name:"Square"}],this.reportReasons=[{label:"Spam",value:1},{label:"Harassment",value:2}],this.contextMenuConfig={canReply:!0,canReact:!0,canPin:!0,canEdit:!0,canDelete:!0,canReport:!0,canCopy:!0},this.sampleImage="/assets/img/sprocket-sm-circle.png",this.showLive=d.snapshot.queryParamMap.get("live")!=="0"}noop(){}open(d){this.modals[d]=!0}};r.\u0275fac=function(s){return new(s||r)(A(Ca))},r.\u0275cmp=b({type:r,selectors:[["app-sg-staging"]],standalone:!1,decls:972,vars:183,consts:[[1,"text-small","text-grey"],[1,"card"],[1,"text-small"],["variant","tag","status","warning","text","live data"],["variant","tag","status","warning","text","opens on demand"],["routerLink","../pills",1,"btn-a11y"],["routerLink","../avatars",1,"btn-a11y"],["routerLink","../cards",1,"btn-a11y"],["routerLink","../system-alerts",1,"btn-a11y"],["
8469id","admin"],["name","app-admin-header","path","admin/admin-header/admin-header.component.ts"],["pageTitle","Fall 2026 Travel","parentLinkText","Programs","parentLinkUrl","/admin/programs","primaryBtnText","Add Player","primaryBtnIcon","fa fa-plus","secondaryBtnText","Export","secondaryBtnIcon","fa fa-download",3,"backButtonClicked","primaryBtnAction","secondaryBtnAction","showBackButton","useBackButtonEmitter"],["name","app-admin-header-description","path","admin/admin-header/description/admin-header-description/admin-header-description.component.ts"],["name","app-admin-dashboard-card","path","admin/admin-dashboard-card/admin-dashboard-card.component.ts"],["panelTitle","Registrations",3,"settingsClick","hasSettings"],[1,"text-small","mb-0"],["name","app-admin-dashboard-card","path","admin/admin-dashboard-card/admin-dashboard-card.component.ts","note","loading + error states"],[1,"row"],[1,"col-md-6"],["panelTitle","Loading","skeletonHeight","120px",3,"loading"],["panelTitle","Error",3,"error"],["name","app-admin-dashboard-card-mini","path","admin/admin-dashboard-card-mini/admin-dashboard-card-mini.component.ts"],[1,"col-md-4"],["panelTitle","Active Players","panelSubtitle","248","trendTxt","+12 this week","panelTitleColorType","success",3,"trendDirection"],["panelTitle","Unpaid Invoices","panelSubtitle","17","trendTxt","-3 this week","panelTitleColorType","warning",3,"trendDirection"],["panelTitle","Open Waivers","panelSubtitle","0","trendTxt","no change",3,"trendDirection"],["name","app-admin-filter","path","admin/admin-filter/admin-filter.component.ts"],[3,"adminFilterSearch","adminFilterReset","advancedFiltersToggled","showAdvanced","showLabels"],["name","app-admin-nav-search-filter","path","admin/admin-nav-search-filter/admin-nav-search-filter.component.ts","note","live data"],["name","app-step-content-ui","path","admin/step-content/step-content/step-content-ui.component.ts"],["title","Program Details","titlePillText","Complete","titlePillStatus","success","utilityPillText","Required","utilityPillStatus","warning",3,"menuToggle","toggleChange","accordionToggle","toggles","isAccordion","expanded","dragDisabled"],["name","app-win-loss-record","path","admin/win-loss-record/win-loss-record.component.ts"],[3,"totalWins","totalLosses","totalDraws"],["id","agent-chat"],["name","app-agent-chat-panel","path","agent-chat/agent-chat-panel.component.ts"],["title","Registration Agent",3,"collapsedChange","canCollapse","collapsed"],["name","app-agent-chat-transcript","path","agent-chat/agent-chat-transcript.component.ts"],["assistantLabel","Sprocket","userLabel","You",3,"messages","avatarSrc"],["name","app-agent-chat-transcript","path","agent-chat/agent-chat-transcript.component.ts","note","empty state"],["emptyText","No messages yet.",3,"messages"],["name","app-agent-question-panel","path","agent-chat/agent-question-panel.component.ts"],["heading","A couple of details","hint","Answer what you can \u2014 the rest can wait.",3,"answeredChange","quickAnswer","questions"],["name","app-agent-answer-blocks","path","agent-chat/agent-answer-blocks.component.ts"],[3,"answer"],["name","app-agent-reply-selections","path","agent-chat/agent-reply-selections.component.ts"],[3,"selections"],["name","app-agent-reply-composer","path","agent-chat/agent-reply-composer.component.ts"],["label","Your reply","placeholder","Type a message\u2026","hint","Enter sends. Shift+Enter adds a line.","inputID","sgAgentReply",3,"valueChange","send","canSend"],["id","cards"],["name","app-blog-card","path","cards/blog-card/blog-card.component.ts"],[1,"col-md-5"],["blogTitle","Tryout results are posted","blogExcerpt","Rosters for the Fall 2026 travel program are now available in your account.",3,"blogCardClick","blogImage","blogSavedOn"],["name","app-calendar-card","path","cards/calendar-card/calendar-card.component.ts"],[3,"startDate","endDate","clubEventTypeID"],["name","app-null-card","path","cards/null-card/null-card.component.ts"],["text","No players have registered yet.","image","players","buttonText","Add Player","buttonIcon","fa fa-plus",3,"buttonClicked","showButton"],["name","app-promo-card","path","cards/promo-card/promo-card.component.ts"],["title","Team Accounts","description","
8469Let parents fund a shared team balance.",3,"features","image"],["name","app-roster-card-content","path","cards/roster-card-content/roster-card-content.component.ts","note","live data"],["name","app-staff-card","path","cards/staff-card/staff-card.component.ts"],[3,"clubUser"],["name","app-teaser-card","path","cards/teaser-card/teaser-card.component.ts","module","standalone"],["imageAlt","Club crest","ariaLabel","Open the Fall 2026 program",3,"cardClick","image","clickable"],[1,"mb-1"],[1,"text-small","text-grey","mb-0"],["name","app-user-info-view-only-card","path","cards/user-info-view-only-card/user-info-view-only-card.component.ts"],["headerText","Contact",3,"edit","entity","fields","isEditable"],["id","layout"],["name","app-global-banner-content","path","layout/global-banner-content/global-banner-content.component.ts"],["bannerSize","small","bannerTextAlign","center","bannerVerticalTextAlign","middle","textColor","#ffffff","bannerBg","#003261",3,"primaryBannerImage"],[1,"mb-0"],["name","app-sidebar-nav-tabs","path","layout/sidebar-nav-tabs/sidebar-nav-tabs.component.ts"],[3,"tabClick","tabs","activeTab","sticky"],["name","app-team-banner","path","layout/team-banner/team-banner.component.ts"],["headerText","U14 Boys Blue","eyebrowText","Fall 2026 Travel",3,"profileImageSelected","logoRemoved","logoUrl","canEditLogo"],["id","message"],["name","app-message-bubble","path","message/message-bubble.component.ts","module","message"],["firstName","Riley","lastName","Chen","messageText","Bring both jerseys on Saturday.",3,"replyClicked","reactClicked","editClicked","deleteMessageClicked","messageTextClicked","messageID","sentDate","reactions","canReply","canReact","canEdit","canDelete"],["name","app-message-bubble","path","message/message-bubble.component.ts","module","message","note","sender + deleted variants"],["firstName","You","lastName","","messageText","On it \u2014 see you at 9.",3,"isSender","messageID","sentDate"],["firstName","Riley","lastName","Chen",3,"messageID","isDeleted","sentDate"],["name","app-message-form","path","message/message-form/message-form.component.ts","module","message"],[3,"sendMessage","deleteQuote","pollCreated","sendEnabled","showFileUpload","showGifUpload","canAddPoll","messageLimit"],["name","app-message-quote","path","message/message-quote/message-quote.component.ts","module","message"],[3,"deleteQuote","quotedMessage","canDelete"],["name","app-message-time-tag","path","message/message-time-tag/message-time-tag.component.ts","module","message","note","live data"],["name","app-message-pin","path","message/message-pin/message-pin.component.ts","module","message","note","not mounted \u2014 unreachable"],["name","app-pinned-messages-panel","path","message/pinned-messages-panel/pinned-messages-panel.component.ts","module","message"],["variant","standard",3,"togglePanel","messageClicked","unpinClicked","pinnedMessages","totalPinned","showPanel"],["name","app-message-poll","path","message/message-poll/message-poll.component.ts","module","message"],[3,"voteSubmitted","pollUpdated","refreshPollRequested","poll","clubUserId"],["name","app-message-thread-header","path","message/message-thread-header/message-thread-header.component.ts","module","message","note","not mounted \u2014 unreachable"],["name","app-message-context-menu","path","message/message-context-menu/message-context-menu.component.ts","module","message","note","opens on demand"],["name","app-message-thread-details","path","message/message-thread-details/message-thread-details.component.ts","module","message","note","not mounted \u2014 unreachable"],["id","null-states"],["name","app-null-table-row","path","null-states/null-table-row/null-table-row.component.ts"],[1,"table"],["title","No results","text","No players match this filter.","buttonText","Clear filters","buttonIcon","fa fa-xmark",3,"buttonClicked","showButton"],["name","app-skeleton-template","path","null-states/skeleton-template/skeleton-template.component.ts"],["side","shared"],["skeletonType","text"],["skeletonType","table"],["skeletonType","form",3,"formFieldsCount"],["id","status-indicator"],["name","app-status-indicator","path","status-indicator/status-indicator.component.ts"],["status","active","text","Active"],["status","success","text","Paid"],["status","error","text","Overdue"],["status","warning","text","Pending"],["status","note","text","Draft"],["status","default","text","Unknown"],["status","active","text","Syncing",3,"dots"],["name","app-big-status-indicator","path","status-indicator/big-status-indicator/big-status-indicator.component.ts"],["status","success","text","All waivers signed",3,"showText"],["status","error","text","Payment failed",3,"showText"],["id","root"],["name","app-ai-chat-launcher","path","ai-chat-launcher/ai-chat-launcher.component.ts"],["text","Ask Coach Johnny",3,"chatBotClicked","showIcon"],["name","app-ai-chat-window","path","ai-chat-window/ai-chat-window.component.ts","note","live data"],["name","app-attendance-toggle","path","attendance-toggle/attendance-toggle.component.ts","note","live data"],["name","app-attendance-tracking-toggle","path","attendance-tracking-toggle/attendance-tracking-toggle.component.ts","note","live data"],["name","app-back-link","path","back-link/back-link.component.ts"],[3,"back"],["name","app-button-loader","path","button-loader/button-loader.component.ts"],["type","button","disabled","",1,"btn","btn-primary"],["name","app-calendar-team-filter","path","calendar-team-filter/calendar-team-filter.component.ts","note","live data"],["name","app-calendar-week-view","path","calendar-week-view/calendar-week-view.component.ts"],[3,"showEvent","addEvent","dropEvent","events","resources","selectedResources","currentDate"],["name","app-checkbox-button","path","checkbox-button/checkbox-button.component.ts"],["inputID","sgCbBtn1","inputLabel","Include inactive players",3,"valueChange","value"],["inputID","sgCbBtn2","input
8469Label","Disabled",3,"valueChange","disabled","value"],["name","app-checkbox-row","path","checkbox-row/checkbox-row.component.ts"],["controlType","radio","controlGroupName","sgRow","inputId","sgRow1","label","Pay in full","description","One charge today for the full season.",3,"selectionChange","optionValue"],["controlType","radio","controlGroupName","sgRow","inputId","sgRow2","label","Payment plan","description","Four monthly instalments.","color","green",3,"selectionChange","optionValue"],["controlType","checkbox","inputId","sgRow3","label","Disabled option","description","Not available for this program.",3,"disabledClick","disabled"],["name","app-close-icon","path","close-icon/close-icon.component.ts"],["ariaLabel","Close the staging specimen",3,"close"],["name","app-colorize-differential","path","colorize-differential/colorize-differential.component.ts"],[3,"differential"],["name","app-completion-status-bar","path","completion-status-bar/completion-status-bar.component.ts"],["tooltipText","72% of players have registered",3,"percentComplete"],["name","app-consent-gated-third-party-content","path","consent-gated-third-party-content/consent-gated-third-party-content.component.ts","note","live data"],["name","app-date-range-filter","path","date-range-filter/date-range-filter.component.ts"],["label","Date Range","preset","last90Days",3,"rangeChange"],["name","app-dialog-footer","path","dialog-footer/dialog-footer.component.ts"],["type","button",1,"btn","btn-secondary"],["type","button",1,"btn","btn-primary"],["name","app-drag-drop-file-upload","path","drag-drop-file-upload/drag-drop-file-upload.component.ts","note","live data"],["name","app-field-view-only-row","path","field-view-only-row/field-view-only-row.component.ts"],[3,"editClicked","field","entity","edit"],[3,"field","entity"],["name","app-file-upload","path","file-upload/file-upload.component.ts"],["fieldID","sgFileUpload","fieldName","Waiver","fControlName","specimenFile",3,"fileChange","onDownload","extraButtonClick","fGroup","canDownload"],["name","app-file-viewer-modal","path","file-viewer-modal/file-viewer-modal.component.ts","note","opens on demand"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["fileName","waiver-signed.pdf",3,"visibleChange","downloadFile","visible","viewUrl"],["name","app-focal-point-picker","path","focal-point-picker/focal-point-picker.component.ts"],["label","Focal Point",3,"focalPointChange","imageUrl"],["name","app-gif-picker","path","giphy/gif-picker.component.ts","module","message","note","opens on demand"],["name","app-health-score-status","path","health-score-status/health-score-status.component.ts"],["size","small"],["size","default"],["size","large"],["name","app-image-cropper","path","image-cropper/image-cropper.component.ts","note","opens on demand"],["name","app-inline-alert","path","inline-alert/inline-alert.component.ts"],["alertType","error"],["alertType","warning"],["alertType","success"],["alertType","info"],["alertType","note"],["name","app-masked-checkbox","path","masked-checkbox/masked-checkbox.component.ts"],["inputID","sgMasked1","label","Share my email with coaches","descriptionText","Coaches see your address on the roster.",3,"isCheckedChange","isChecked"],["name","app-message-edit-bubble","path","message-edit-bubble/message-edit-bubble.component.ts","note","opens on demand"],[3,"close","save","delete","pin","report","isVisible","message","canEdit","canDelete","canPin","canReport","reportReasons"],["name","app-message-edit-modal","path","message-edit-bubble/message-edit-modal.component.ts","note","not mounted \u2014 parked"],["name","app-message-report-modal","path","message-edit-bubble/message-report-modal.component.ts","note","not mounted \u2014 module-private"],["name","app-mfa-enrollment","path","mfa-enrollment/mfa-enrollment.component.ts"],[3,"enrolled","disabled","mfaStatus"],["name","app-multiple-file-upload","path","multiple-file-upload/multiple-file-upload.component.ts","note","live data"],["name","app-overlay-background","path","overlay-background/overlay-background.component.ts","note","fixed-position overlay"],["name","app-page-preview-frame","path","page-preview-frame/page-preview-frame.component.ts"],["heading","Home page","height","240px","emptyText","There is no preview to show yet.",3,"loaded","deviceChange","url","showDeviceToggle","showRefresh"],["name","app-pill","path","pill/pill.component.ts"],["status","default","text","Default"],["status","primary","text","Primary"],["status","secondary","text","Secondary"],["status","success","text","Success"],["status","warning","text","Warning"],["status","error","text","Error"],["status","success","text","With icon","icon","fa fa-check","ariaLabel","Marked complete",3,"onClick","clickable"],["variant","tag","status","black","text","Tag variant"],["name","app-pill-counter","path","pill-counter/
8469pill-counter.component.ts"],["tooltipText","No unread messages",3,"pillCount"],["tooltipText","12 unread messages",3,"pillCount"],["name","app-pip-status-bar","path","pip-status-bar/pip-status-bar.component.ts"],["ariaLabel","17 of 20 roster spots filled",3,"total","totalUsed"],["ariaLabel","4 of 20 roster spots filled",3,"total","totalUsed"],["name","app-player-status-styler","path","player-status-styler/player-status-styler.component.ts"],["statusTitle","Registered",3,"statusID"],["statusTitle","Waitlisted",3,"statusID"],["statusTitle","Withdrawn",3,"statusID"],["name","app-poll-details-view","path","poll-details-view/poll-details-view.component.ts","module","message","note","live data \xB7 opens on demand"],["name","app-poll-header","path","poll-header/poll-header.component.ts","module","message"],["question","Which time works best for the makeup session?","subtitle","13 votes",3,"refresh","isSender"],["name","app-poll-options","path","poll-options/poll-options.component.ts","module","message"],[3,"optionSelected","votesUpdated","options","totalVotes","hasVoted","selectedOptionId","leadingOptionId"],["name","app-quick-rsvp-bubbles","path","quick-rsvp-bubbles/quick-rsvp-bubbles.component.ts","note","live data"],["name","app-score-display","path","score-display/score-display.component.ts"],[3,"gameResult"],["name","app-side-nav","path","side-nav/side-nav.component.ts"],["header","Registration",3,"steps","activeStep","activeSecondaryStep"],["name","app-spinning-icon","path","spinning-icon/spinning-icon.component.ts"],["iconClass","fa-solid fa-spinner"],["name","app-split-button","path","split-button/split-button.component.ts"],["buttonText","Actions","buttonClass","btn-secondary",3,"menuItems"],["name","app-sport-item","path","sport-item/sport-item.component.ts"],[3,"sportID"],["name","app-star-rating","path","star-rating/star-rating.component.ts"],[3,"rating","fullWidth"],[3,"updateRating","rating","editable","fullWidth"],[3,"rating","circleStars","fullWidth"],["name","app-status-bar","path","status-bar/status-bar.component.ts"],["ariaLabel","88% of registrations complete",3,"percent"],["ariaLabel","45% of registrations complete",3,"percent"],["ariaLabel","12% of registrations complete",3,"percent"],["name","app-tag","path","tag/tag.component.ts"],["text","Goalkeeper"],["text","Clickable","icon","fa fa-xmark",3,"onClick","clickable"],["name","app-team-accounts-disclosure","path","team-accounts-disclosure/team-accounts-disclosure.component.ts"],["name","app-team-accounts-transactions-disclosure","path","team-accounts-transactions-disclosure/team-accounts-transactions-disclosure.component.ts"],["name","app-team-logo","path","team-logo/team-logo.component.ts"],[3,"logo"],["name","app-time-dots","path","time-dots/time-dots.component.ts","note","live data"],["name","app-title-link","path","title-link/title-link.component.ts"],["text","Edit program details"],["text","No icon",3,"showIcon","borderBottom"],["name","app-tooltip","path","tooltip/tooltip.component.ts","module","tooltip"],["tooltipText","Shown to members on the public roster.","tooltipPosition","right"],["tooltipText","This field is required.","status","error","tooltipPosition","top"],["tooltipText","Inline variant.",3,"isInline","useIcon","renderAsLink"],["name","app-training-focus-pills","path","training-focus-pills/training-focus-pills.component.ts"],[3,"focuses","maxVisible"],["name","app-ul-nav","path","ul-nav/ul-nav.component.ts"],["header","Checkout",3,"steps","activeStep"],["name","app-user-initials","path","user-initials/user-initials.component.ts"],["firstName","Jordan","lastName","Alvarez",3,"id"],["firstName","Riley","lastName","Chen","size","large",3,"id"],["firstName","Sam","lastName","Okafor",3,"id","showCircle"],["name","app-yes-no-modal","path","yes-no-modal/yes-no-modal.component.ts","note","opens on demand"],[1,"btn-a11y",3,"href"],[1,"text-grey"],[3,"viewProfileButton","player","showProfileButton"],[3,"start","end"],[3,"closeChatEvent"],[3,"modalClosed","calEvent","teamID"],[3,"modalClosed","attendanceChanged","calEvent"],["teamColor","#003261",3,"toggleTeam","team","isAdmin"],[3,"filesChanged","onFileClick","maxFiles","existingFiles"],[3,"gifSelected","gifCancel","gifSearch"],[3,"finalImage","onCancel","imageURL","icAspectRatio","showCancel","showPresetDimensions"],["fieldID","sgMultiUpload","fieldName","Documents","fControlName","specimenFiles",3,"onSelect","onDownload","onDelete","onChange","fGroup","files","fileLimit"],[3,"close","save","voteSubmitted","refreshPollRequested","deleteClicked","existingPoll","readonly","clubUserID"],["bubbleSize","default",3,"event","teamID"],["bubbleSize","small",3,"event","teamID"],["bubbleSize","tiny",3,"event","teamID"],[3,"durationInMinutes"],["headerText","Remove player?","modalText","This removes Jordan Alvarez from the roster. It cannot be undone.","yesButtonText","Remove","noButtonText","Cancel","alertType","warning",3,"onYesSelect","onNoSelect"]],template:function(s,o){s&1&&(n(0,"h2"),e(1,"Component Library \u2014 Staging"),t(),e(2,` 8470`),n(3,"p",0),e(4,` 8471 Every component in `),n(5,"code"),e(6,"shared/modules/components/"),t(),e(7,` mounted once, so the accessibility 8472 audit can reach the whole library from a single route. `),n(8,"strong"),e(9,"98 components"),t(),e(10,", in "),n(11,"strong"),e(12,"folder order"),t(),e(13,` \u2014 this is a raw staging area, not a designed page. The logical 8473 grouping is the next step; nothing here should be read as a recommended taxonomy. 8474`),t(),e(14,`
8475`),n(15,"p",0),e(16,` 8476 Specimens are the `),n(17,"strong"),e(18,"real components"),t(),e(19,` with realistic inputs, not replicas. Where one 8477 looks broken, the component is broken. Inventory taken `),n(20,"strong"),e(21),t(),e(22,`. 8478`),t(),e(23,` 8479 8480`),n(24,"div",1),e(25,` 8481 `),n(26,"h3"),e(27,"How to read this page"),t(),e(28,` 8482 `),n(29,"ul",2),e(30,` 8483 `),n(31,"li"),e(32,` 8484 Each specimen carries its `),n(33,"strong"),e(34,"selector"),t(),e(35,", its "),n(36,"strong"),e(37,"path"),t(),e(38,` under the 8485 library root, and \u2014 where it is not the default \u2014 its `),n(39,"strong"),e(40,"declaring module"),t(),e(41,`. 8486 Three modules feed this page: `),n(42,"code"),e(43,"ComponentsModule"),t(),e(44,` (86 exported), 8487 `),n(45,"code"),e(46,"MessageModule"),t(),e(47," (11), "),n(48,"code"),e(49,"TooltipModule"),t(),e(50,` (1), plus 8488 `),n(51,"code"),e(52,"app-teaser-card"),t(),e(53,`, the library's only standalone component. 8489 `),t(),e(54,` 8490 `),n(55,"li"),e(56,` 8491 `),c(57,"app-pill",3),e(58,` 8492 marks the `),n(59,"strong"),e(60,"11 components that touch a service in "),n(61,"code"),e(62,"ngOnInit"),t()(),e(63,`. 8493 Append `),n(64,"code"),e(65,"?live=0"),t(),e(66,` to the URL to skip creating them \u2014 the guard runs before they 8494 are constructed, so one that throws cannot take the page down with it. 8495 `),t(),e(67,` 8496 `),n(68,"li"),e(69,` 8497 `),c(70,"app-pill",4),e(71,` 8498 marks dialogs and overlays. They render nothing until launched, so each has a button 8499 rather than being mounted open. `),n(72,"strong"),e(73,`An axe sweep of this page will not see them 8500 unless they are opened first.`),t(),e(74,` 8501 `),t(),e(75,` 8502 `),n(76,"li"),e(77,` 8503 Four components here are also documented in depth on their own pages 8504 (`),n(78,"a",5),e(79,"pills & tags"),t(),e(80,`, 8505 `),n(81,"a",6),e(82,"avatars"),t(),e(83,`, 8506 `),n(84,"a",7),e(85,"cards"),t(),e(86,`, 8507 `),n(87,"a",8),e(88,"system alerts"),t(),e(89,`). 8508 That duplication is deliberate and temporary \u2014 it keeps this sweep complete, and the 8509 card sort resolves it. 8510 `),t(),e(90,` 8511 `),t(),e(91,` 8512`),t(),e(92,` 8513 8514`),n(93,"div",1),e(94,` 8515 `),n(95,"h3"),e(96,"Jump to"),t(),e(97,` 8516 `),n(98,"ul",2),e(99,` 8517 `),S(100,k1,11,4,null,null,_1),t(),e(102,` 8518`),t(),e(103,` 8519 8520`),e(104,` 8521`),n(105,"div",1),e(106,` 8522 `),n(107,"h3",9),e(108,"admin/ "),n(109,"span",0),e(110,"\u2014 8"),t()(),e(111,` 8523 8524 `),n(112,"app-sg-specimen",10),e(113,` 8525 `),n(114,"app-admin-header",11),g("backButtonClicked",function(){return o.noop()})("primaryBtnAction",function(){return o.noop()})("secondaryBtnAction",function(){return o.noop()}),t(),e(115,` 8526 `),t(),e(116,` 8527 8528 `),n(117,"app-sg-specimen",12),e(118,` 8529 `),n(119,"app-admin-header-description"),e(120,` 8530 Rosters lock 48 hours before the first scheduled game. 8531 `),t(),e(121,` 8532 `),t(),e(122,` 8533 8534 `),n(123,"app-sg-specimen",13),e(124,` 8535 `),n(125,"app-admin-dashboard-card",14),g("settingsClick",function(){return o.noop()}),e(126,` 8536 `),n(127,"p",15),e(128,"Panel body content is projected."),t(),e(129,` 8537 `),t(),e(130,` 8538 `),t(),e(131,` 8539 8540 `),n(132,"app-sg-specimen",16),e(133,` 8541 `),n(134,"div",17),e(135,` 8542 `),n(136,"div",18),e(137,` 8543 `),c(138,"app-admin-dashboard-card",19),e(139,` 8544 `),t(),e(140,` 8545 `),n(141,"div",18),e(142,` 8546 `),c(143,"app-admin-dashboard-card",20),e(144,` 8547 `),t(),e(145,` 8548 `),t(),e(146,` 8549 `),t(),e(147,` 8550 8551 `),n(148,"app-sg-specimen",21),e(149,` 8552 `),n(150,"div",17),e(151,` 8553 `),n(152,"div",22),e(153,` 8554 `),n(154,"app-admin-dashboard-card-mini",23),e(155,` 8555 `),t(),e(156,` 8556 `),t(),e(157,` 8557 `),n(158,"div",22),e(159,`
8558 `),n(160,"app-admin-dashboard-card-mini",24),e(161,` 8559 `),t(),e(162,` 8560 `),t(),e(163,` 8561 `),n(164,"div",22),e(165,` 8562 `),n(166,"app-admin-dashboard-card-mini",25),e(167,` 8563 `),t(),e(168,` 8564 `),t(),e(169,` 8565 `),t(),e(170,` 8566 `),t(),e(171,` 8567 8568 `),n(172,"app-sg-specimen",26),e(173,` 8569 `),n(174,"app-admin-filter",27),g("adminFilterSearch",function(){return o.noop()})("adminFilterReset",function(){return o.noop()})("advancedFiltersToggled",function(){return o.noop()}),e(175,` 8570 `),t(),e(176,` 8571 `),t(),e(177,` 8572 8573 `),n(178,"app-sg-specimen",28),e(179,` 8574 `),v(180,T1,3,0),t(),e(181,` 8575 8576 `),n(182,"app-sg-specimen",29),e(183,` 8577 `),n(184,"app-step-content-ui",30),g("menuToggle",function(){return o.noop()})("toggleChange",function(){return o.noop()})("accordionToggle",function(){return o.noop()}),e(185,` 8578 `),n(186,"p",15),e(187,"Step body content is projected."),t(),e(188,` 8579 `),t(),e(189,` 8580 `),t(),e(190,` 8581 8582 `),n(191,"app-sg-specimen",31),e(192,` 8583 `),c(193,"app-win-loss-record",32),e(194,` 8584 `),t(),e(195,` 8585`),t(),e(196,` 8586 8587`),e(197,` 8588`),n(198,"div",1),e(199,` 8589 `),n(200,"h3",33),e(201,"agent-chat/ "),n(202,"span",0),e(203,"\u2014 6"),t()(),e(204,` 8590 8591 `),n(205,"app-sg-specimen",34),e(206,` 8592 `),n(207,"app-agent-chat-panel",35),g("collapsedChange",function(){return o.noop()}),e(208,` 8593 `),n(209,"p",15),e(210,"Panel body content is projected."),t(),e(211,` 8594 `),t(),e(212,` 8595 `),t(),e(213,` 8596 8597 `),n(214,"app-sg-specimen",36),e(215,` 8598 `),c(216,"app-agent-chat-transcript",37),e(217,` 8599 `),t(),e(218,` 8600 8601 `),n(219,"app-sg-specimen",38),e(220,` 8602 `),c(221,"app-agent-chat-transcript",39),e(222,` 8603 `),t(),e(223,` 8604 8605 `),n(224,"app-sg-specimen",40),e(225,` 8606 `),n(226,"app-agent-question-panel",41),g("answeredChange",function(){return o.noop()})("quickAnswer",function(){return o.noop()}),t(),e(227,` 8607 `),t(),e(228,` 8608 8609 `),n(229,"app-sg-specimen",42),e(230,` 8610 `),c(231,"app-agent-answer-blocks",43),e(232,` 8611 `),t(),e(233,` 8612 8613 `),n(234,"app-sg-specimen",44),e(235,` 8614 `),c(236,"app-agent-reply-selections",45),e(237,` 8615 `),t(),e(238,` 8616 8617 `),n(239,"app-sg-specimen",46),e(240,` 8618 `),n(241,"app-agent-reply-composer",47),g("valueChange",function(){return o.noop()})("send",function(){return o.noop()}),t(),e(242,` 8619 `),t(),e(243,` 8620`),t(),e(244,` 8621 8622`),e(245,` 8623`),n(246,"div",1),e(247,` 8624 `),n(248,"h3",48),e(249,"cards/ "),n(250,"span",0),e(251,"\u2014 8"),t()(),e(252,` 8625 `),n(253,"p",0),e(254,` 8626 Documented in depth on `),n(255,"a",7),e(256,"the cards page"),t(),e(257,`. Mounted 8627 here so the sweep is complete. 8628 `),t(),e(258,` 8629 8630 `),n(259,"app-sg-specimen",49),e(260,` 8631 `),n(261,"div",17),e(262,` 8632 `),n(263,"div",50),e(264,` 8633 `),n(265,"app-blog-card",51),g("blogCardClick",function(){return o.noop()}),t(),e(266,` 8634 `),t(),e(267,` 8635 `),t(),e(268,` 8636 `),t(),e(269,` 8637 8638 `),n(270,"app-sg-specimen",52),e(271,` 8639 `),c(272,"app-calendar-card",53),e(273,` 8640 `),t(),e(274,` 8641 8642 `),n(275,"app-sg-specimen",54),e(276,` 8643 `),n(277,"app-null-card",55),g("buttonClicked",function(){return o.noop()}),t(),e(278,` 8644 `),t(),e(279,` 8645 8646 `),n(280,"app-sg-specimen",56),e(281,` 8647 `),c(282,"app-promo-card",57),e(283,` 8648 `),t(),e(284,` 8649 8650 `),n(285,"app-sg-specimen",58),e(286,` 8651 `),v(287,I1,3,2),t(),e(288,` 8652 8653 `),n(289,"app-sg-specimen",59),e(290,` 8654 `),c(291,"app-staff-card",60),e(292,` 8655 `),t(),e(293,` 8656 8657 `),n(294,"app-sg-specimen",61),e(295,` 8658 `),n(296,"app-teaser-card",62),g("cardClick",function(){return o.noop()}),e(297,` 8659 `),n(298,"h4",63),e(299,"Fall 2026 Travel"),t(),e(300,` 8660 `),n(301,"p",64),e(302,"Registration closes 15 September."),t(),e(303,` 8661 `),t(),e(304,` 8662 `),t(),e(305,` 8663 8664 `),n(306,"app-sg-specimen",65),e(307,` 8665 `),n(308,"app-user-info-view-only-card",66),g("edit",function(){return o.no
8665op()}),t(),e(309,` 8666 `),t(),e(310,` 8667`),t(),e(311,` 8668 8669`),e(312,` 8670`),n(313,"div",1),e(314,` 8671 `),n(315,"h3",67),e(316,"layout/ "),n(317,"span",0),e(318,"\u2014 3"),t()(),e(319,` 8672 8673 `),n(320,"app-sg-specimen",68),e(321,` 8674 `),n(322,"app-global-banner-content",69),e(323,` 8675 `),n(324,"h3",70),e(325,"Welcome to the club"),t(),e(326,` 8676 `),t(),e(327,` 8677 `),t(),e(328,` 8678 8679 `),n(329,"app-sg-specimen",71),e(330,` 8680 `),n(331,"app-sidebar-nav-tabs",72),g("tabClick",function(){return o.noop()}),t(),e(332,` 8681 `),t(),e(333,` 8682 8683 `),n(334,"app-sg-specimen",73),e(335,` 8684 `),n(336,"app-team-banner",74),g("profileImageSelected",function(){return o.noop()})("logoRemoved",function(){return o.noop()}),t(),e(337,` 8685 `),t(),e(338,` 8686`),t(),e(339,` 8687 8688`),e(340,` 8689`),n(341,"div",1),e(342,` 8690 `),n(343,"h3",75),e(344,"message/ "),n(345,"span",0),e(346,"\u2014 10"),t()(),e(347,` 8691 `),n(348,"p",0),e(349,` 8692 Declared by `),n(350,"code"),e(351,"MessageModule"),t(),e(352,", not "),n(353,"code"),e(354,"ComponentsModule"),t(),e(355,`. 8693 `),t(),e(356,` 8694 8695 `),n(357,"app-sg-specimen",76),e(358,` 8696 `),n(359,"app-message-bubble",77),g("replyClicked",function(){return o.noop()})("reactClicked",function(){return o.noop()})("editClicked",function(){return o.noop()})("deleteMessageClicked",function(){return o.noop()})("messageTextClicked",function(){return o.noop()}),t(),e(360,` 8697 `),t(),e(361,` 8698 8699 `),n(362,"app-sg-specimen",78),e(363,` 8700 `),c(364,"app-message-bubble",79),e(365,` 8701 `),c(366,"app-message-bubble",80),e(367,` 8702 `),t(),e(368,` 8703 8704 `),n(369,"app-sg-specimen",81),e(370,` 8705 `),n(371,"app-message-form",82),g("sendMessage",function(){return o.noop()})("deleteQuote",function(){return o.noop()})("pollCreated",function(){return o.noop()}),t(),e(372,` 8706 `),t(),e(373,` 8707 8708 `),n(374,"app-sg-specimen",83),e(375,` 8709 `),n(376,"app-message-quote",84),g("deleteQuote",function(){return o.noop()}),t(),e(377,` 8710 `),t(),e(378,` 8711 8712 `),n(379,"app-sg-specimen",85),e(380,` 8713 `),v(381,M1,4,2),t(),e(382,` 8714 8715 `),n(383,"app-sg-specimen",86),e(384,` 8716 `),n(385,"p",64),e(386,` 8717 Declared by `),n(387,"strong"),e(388,"no module"),t(),e(389,` and not standalone, and its selector appears in 8718 `),n(390,"strong"),e(391,"no template in the app"),t(),e(392,`. Nothing can render it. Inventory only. 8719 `),t(),e(393,` 8720 `),t(),e(394,` 8721 8722 `),n(395,"app-sg-specimen",87),e(396,` 8723 `),n(397,"app-pinned-messages-panel",88),g("togglePanel",function(){return o.noop()})("messageClicked",function(){return o.noop()})("unpinClicked",function(){return o.noop()}),t(),e(398,` 8724 `),t(),e(399,` 8725 8726 `),n(400,"app-sg-specimen",89),e(401,` 8727 `),n(402,"app-message-poll",90),g("voteSubmitted",function(){return o.noop()})("pollUpdated",function(){return o.noop()})("refreshPollRequested",function(){return o.noop()}),t(),e(403,` 8728 `),t(),e(404,` 8729 8730 `),n(405,"app-sg-specimen",91),e(406,` 8731 `),n(407,"p",64),e(408,` 8732 Declared by `),n(409,"strong"),e(410,"no module"),t(),e(411,` and not standalone, and its selector appears in 8733 `),n(412,"strong"),e(413,"no template in the app"),t(),e(414,`. Nothing can render it. Inventory only. 8734 `),t(),e(415,` 8735 `),t(),e(416,` 8736 8737 `),n(417,"app-sg-specimen",92),e(418,` 8738 `),n(419,"p",64),e(420,` 8739 Positioned from a long-press on a bubble; it has no standalone launch state. 8740 Test it in situ from the `),n(421,"code"),e(422,"app-message-bubble"),t(),e(423,` specimen above. 8741 `),t(),e(424,` 8742 `),t(),e(425,` 8743 8744 `),n(426,"app-sg-specimen",93),e(427,` 8745 `),n(428,"p",64),e(429,` 8746 Declared by `),n(430,"strong"),e(431,"no module"),t(),e(432,` and not standalone, and its selector appears in 8747 `),n(433,"strong"),e(434,"no template in the app"),t(),e(435,`. Nothing can render it. Inventory only \u2014 8748 note it injects `),n(436,"code"),e(437,"SiteDataService"),t(),e(438,` and fetches, so it was written to work. 8749 `),t(),e(439,` 8750 `),t(),e(440,` 8751`),t(),e(441,` 8752 8753`),e(442,` 8754`),n(443,"div",1),e(444,` 8755 `),n(445,"h3",94),e(446,"null-states/ "),n(447,"span",0),e(448,"\u2014 2"),t()(),e(449,` 8756 8757 `),n(450,"app-sg-specimen",95),e(451,` 8758 `),n(452,"table",96),e(453,` 8759 `),n(454,"tbody"),e(455,` 8760 `),n(456,"app-null-table-row",97),g("buttonClicked",function(){return o.no
8760op()}),t(),e(457,` 8761 `),t(),e(458,` 8762 `),t(),e(459,` 8763 `),t(),e(460,` 8764 8765 `),n(461,"app-sg-specimen",98),e(462,` 8766 `),n(463,"div",17),e(464,` 8767 `),n(465,"div",22),e(466,` 8768 `),n(467,"app-sg-caption",99),e(468,'skeletonType="text"'),t(),e(469,` 8769 `),c(470,"app-skeleton-template",100),e(471,` 8770 `),t(),e(472,` 8771 `),n(473,"div",22),e(474,` 8772 `),n(475,"app-sg-caption",99),e(476,'skeletonType="table"'),t(),e(477,` 8773 `),c(478,"app-skeleton-template",101),e(479,` 8774 `),t(),e(480,` 8775 `),n(481,"div",22),e(482,` 8776 `),n(483,"app-sg-caption",99),e(484,'skeletonType="form"'),t(),e(485,` 8777 `),c(486,"app-skeleton-template",102),e(487,` 8778 `),t(),e(488,` 8779 `),t(),e(489,` 8780 `),t(),e(490,` 8781`),t(),e(491,` 8782 8783`),e(492,` 8784`),n(493,"div",1),e(494,` 8785 `),n(495,"h3",103),e(496,"status-indicator/ "),n(497,"span",0),e(498,"\u2014 2"),t()(),e(499,` 8786 8787 `),n(500,"app-sg-specimen",104),e(501,` 8788 `),c(502,"app-status-indicator",105),e(503,` 8789 `),c(504,"app-status-indicator",106),e(505,` 8790 `),c(506,"app-status-indicator",107),e(507,` 8791 `),c(508,"app-status-indicator",108),e(509,` 8792 `),c(510,"app-status-indicator",109),e(511,` 8793 `),c(512,"app-status-indicator",110),e(513,` 8794 `),c(514,"app-status-indicator",111),e(515,` 8795 `),t(),e(516,` 8796 8797 `),n(517,"app-sg-specimen",112),e(518,` 8798 `),n(519,"app-big-status-indicator",113),e(520,` 8799 `),t(),e(521,` 8800 `),n(522,"app-big-status-indicator",114),e(523,` 8801 `),t(),e(524,` 8802 `),t(),e(525,` 8803`),t(),e(526,` 8804 8805`),e(527,` 8806`),n(528,"div",1),e(529,` 8807 `),n(530,"h3",115),e(531,"root-level "),n(532,"span",0),e(533,"\u2014 59"),t()(),e(534,` 8808 `),n(535,"p",0),e(536,` 8809 Alphabetical by folder. This is the group the card sort has the most to say about \u2014 it is 8810 alphabetical only because the filesystem is. 8811 `),t(),e(537,` 8812 8813 `),n(538,"app-sg-specimen",116),e(539,` 8814 `),n(540,"app-ai-chat-launcher",117),g("chatBotClicked",function(){return o.noop()}),e(541,` 8815 `),t(),e(542,` 8816 `),t(),e(543,` 8817 8818 `),n(544,"app-sg-specimen",118),e(545,` 8819 `),v(546,D1,3,0),t(),e(547,` 8820 8821 `),n(548,"app-sg-specimen",119),e(549,` 8822 `),v(550,F1,3,2),t(),e(551,` 8823 8824 `),n(552,"app-sg-specimen",120),e(553,` 8825 `),v(554,P1,3,1),t(),e(555,` 8826 8827 `),n(556,"app-sg-specimen",121),e(557,` 8828 `),n(558,"app-back-link",122),g("back",function(){return o.noop()}),t(),e(559,` 8829 `),t(),e(560,` 8830 8831 `),n(561,"app-sg-specimen",123),e(562,` 8832 `),n(563,"button",124),e(564,` 8833 `),c(565,"app-button-loader"),e(566,` Saving\u2026 8834 `),t(),e(567,` 8835 `),t(),e(568,` 8836 8837 `),n(569,"app-sg-specimen",125),e(570,` 8838 `),v(571,A1,3,2),t(),e(572,` 8839 8840 `),n(573,"app-sg-specimen",126),e(574,` 8841 `),n(575,"app-calendar-week-view",127),g("showEvent",function(){return o.noop()})("addEvent",function(){return o.noop()})("dropEvent",function(){return o.noop()}),t(),e(576,` 8842 `),t(),e(577,` 8843 8844 `),n(578,"app-sg-specimen",128),e(579,` 8845 `),n(580,"app-checkbox-button",129),g("valueChange",function(){return o.noop()}),t(),e(581,` 8846 `),n(582,"app-checkbox-button",130),g("valueChange",function(){return o.noop()}),t(),e(583,` 8847 `),t(),e(584,` 8848 8849 `),n(585,"app-sg-specimen",131),e(586,` 8850 `),n(587,"app-checkbox-row",132),g("selectionChange",function(){return o.noop()}),t(),e(588,` 8851 `),n(589,"app-checkbox-row",133),g("selectionChange",function(){return o.noop()}),t(),e(590,` 8852 `),n(591,"app-checkbox-row",134),g("disabledClick",function(){return o.noop()}),t(),e(592,` 8853 `),t(),e(593,` 8854 8855 `),n(594,"app-sg-specimen",135),e(595,` 8856 `),n(596,"app-close-icon",136),g("close",function(){return o.noop()}),t(),e(597,` 8857 `),t(),e(598,` 8858 8859 `),n(599,"app-sg-specimen",137),e(600,` 8860 `),c(601,"app-colorize-differential",138),e(602,` 8861 `),c(603,"app-colorize-differential",138),e(604,` 8862 `),c(605,"app-colorize-differential",138),e(606,` 8863 `),t(),e(607,` 8864 8865 `),n(608,"app-sg-specimen",139),e(609,` 8866 `),n(610,"app-completion-status-bar",140),e(611,` 8867 `),t(),e(612,` 8868 `),t(),e(613,` 8869 8870 `),n(614,"app-sg-specimen",141),e(615,` 8871 `),v(616,O1,7,0),t(),e(617,` 8872 8873 `),n(618,"app-sg-specimen",142),e(619,` 8874 `),n(620,"app-date-range-filter",143),g("rangeChange",function(){return o.no
8874op()}),t(),e(621,` 8875 `),t(),e(622,` 8876 8877 `),n(623,"app-sg-specimen",144),e(624,` 8878 `),n(625,"app-dialog-footer"),e(626,` 8879 `),n(627,"button",145),e(628,"Cancel"),t(),e(629,` 8880 `),n(630,"button",146),e(631,"Save"),t(),e(632,` 8881 `),t(),e(633,` 8882 `),t(),e(634,` 8883 8884 `),n(635,"app-sg-specimen",147),e(636,` 8885 `),v(637,N1,3,2),t(),e(638,` 8886 8887 `),n(639,"app-sg-specimen",148),e(640,` 8888 `),n(641,"app-field-view-only-row",149),g("editClicked",function(){return o.noop()}),t(),e(642,` 8889 `),n(643,"app-field-view-only-row",150),e(644,` 8890 `),t(),e(645,` 8891 `),t(),e(646,` 8892 8893 `),n(647,"app-sg-specimen",151),e(648,` 8894 `),n(649,"app-file-upload",152),g("fileChange",function(){return o.noop()})("onDownload",function(){return o.noop()})("extraButtonClick",function(){return o.noop()}),t(),e(650,` 8895 `),t(),e(651,` 8896 8897 `),n(652,"app-sg-specimen",153),e(653,` 8898 `),n(654,"button",154),g("click",function(){return o.open("fileViewer")}),e(655,` 8899 Open file viewer 8900 `),t(),e(656,` 8901 `),n(657,"app-file-viewer-modal",155),M("visibleChange",function(h){return I(o.modals.fileViewer,h)||(o.modals.fileViewer=h),h}),g("downloadFile",function(){return o.noop()}),t(),e(658,` 8902 `),t(),e(659,` 8903 8904 `),n(660,"app-sg-specimen",156),e(661,` 8905 `),n(662,"app-focal-point-picker",157),g("focalPointChange",function(){return o.noop()}),t(),e(663,` 8906 `),t(),e(664,` 8907 8908 `),n(665,"app-sg-specimen",158),e(666,` 8909 `),n(667,"button",154),g("click",function(){return o.open("gifPicker")}),e(668,` 8910 Open GIF picker 8911 `),t(),e(669,` 8912 `),v(670,B1,4,0),t(),e(671,` 8913 8914 `),n(672,"app-sg-specimen",159),e(673,` 8915 `),c(674,"app-health-score-status",160),e(675,` 8916 `),c(676,"app-health-score-status",161),e(677,` 8917 `),c(678,"app-health-score-status",162),e(679,` 8918 `),t(),e(680,` 8919 8920 `),n(681,"app-sg-specimen",163),e(682,` 8921 `),n(683,"button",154),g("click",function(){return o.open("imageCropper")}),e(684,` 8922 Mount cropper 8923 `),t(),e(685,` 8924 `),v(686,W1,3,4),t(),e(687,` 8925 8926 `),n(688,"app-sg-specimen",164),e(689,` 8927 `),n(690,"app-inline-alert",165),e(691,"Payment could not be processed."),t(),e(692,` 8928 `),n(693,"app-inline-alert",166),e(694,"Two waivers are still unsigned."),t(),e(695,` 8929 `),n(696,"app-inline-alert",167),e(697,"Registration complete."),t(),e(698,` 8930 `),n(699,"app-inline-alert",168),e(700,"Rosters lock 48 hours before the first game."),t(),e(701,` 8931 `),n(702,"app-inline-alert",169),e(703,"Draft \u2014 not yet visible to members."),t(),e(704,` 8932 `),t(),e(705,` 8933 8934 `),n(706,"app-sg-specimen",170),e(707,` 8935 `),n(708,"app-masked-checkbox",171),g("isCheckedChange",function(){return o.noop()}),t(),e(709,` 8936 `),t(),e(710,` 8937 8938 `),n(711,"app-sg-specimen",172),e(712,` 8939 `),n(713,"button",154),g("click",function(){return o.open("messageEdit")}),e(714,` 8940 Open edit bubble 8941 `),t(),e(715,` 8942 `),n(716,"app-message-edit-bubble",173),g("close",function(){return o.modals.messageEdit=!1})("save",function(){return o.noop()})("delete",function(){return o.noop()})("pin",function(){return o.noop()})("report",function(){return o.noop()}),t(),e(717,` 8943 `),t(),e(718,` 8944 8945 `),n(719,"app-sg-specimen",174),e(720,` 8946 `),n(721,"p",64),e(722,` 8947 Its declaration in `),n(723,"code"),e(724,"ComponentsModule"),t(),e(725,` and its only usage in 8948 `),n(726,"code"),e(727,"message-edit-bubble.component.html"),t(),e(728," are "),n(729,"strong"),e(730,"both commented out"),t(),e(731,`. 8949 Deliberately parked rather than broken. Inventory only. 8950 `),t(),e(732,` 8951 `),t(),e(733,` 8952 8953 `),n(734,"app-sg-specimen",175),e(735,` 8954 `),n(736,"p",64),e(737,` 8955 Declared by `),n(738,"code"),e(739,"ComponentsModule"),t(),e(740," but "),n(741,"strong"),e(742,"not exported"),t(),e(743,`, and used in 8956 exactly one template \u2014 `),n(744,"code"),e(745,"message-edit-bubble.component.html"),t(),e(746,`. It is a 8957 private sub-component, not part of the library surface. Reach it through 8958 `),n(747,"code"),e(748,"app-message-edit-bubble"),t(),e(749,` above. 8959 `),t(),e(750,` 8960 `),t(),e(751,` 8961 8962 `),n(752,"app-sg-specimen",176),e(753,` 8963 `),n(754,"app-mfa-enrollment",177),g("enrolled",function(){return o.no
8963op()})("disabled",function(){return o.noop()}),e(755,` 8964 `),t(),e(756,` 8965 `),t(),e(757,` 8966 8967 `),n(758,"app-sg-specimen",178),e(759,` 8968 `),v(760,R1,4,3),t(),e(761,` 8969 8970 `),n(762,"app-sg-specimen",179),e(763,` 8971 `),n(764,"p",64),e(765,` 8972 Covers the viewport when mounted, so it is not rendered here \u2014 it would sit over every 8973 other specimen. Test it from any dialog specimen on this page. 8974 `),t(),e(766,` 8975 `),t(),e(767,` 8976 8977 `),n(768,"app-sg-specimen",180),e(769,` 8978 `),n(770,"app-page-preview-frame",181),g("loaded",function(){return o.noop()})("deviceChange",function(){return o.noop()}),t(),e(771,` 8979 `),t(),e(772,` 8980 8981 `),n(773,"app-sg-specimen",182),e(774,` 8982 `),n(775,"p",0),e(776,` 8983 Full catalog on `),n(777,"a",5),e(778,"the pills & tags page"),t(),e(779,`. 8984 `),t(),e(780,` 8985 `),c(781,"app-pill",183),e(782,` 8986 `),c(783,"app-pill",184),e(784,` 8987 `),c(785,"app-pill",185),e(786,` 8988 `),c(787,"app-pill",186),e(788,` 8989 `),c(789,"app-pill",187),e(790,` 8990 `),c(791,"app-pill",188),e(792,` 8991 `),n(793,"app-pill",189),g("onClick",function(){return o.noop()}),t(),e(794,` 8992 `),c(795,"app-pill",190),e(796,` 8993 `),t(),e(797,` 8994 8995 `),n(798,"app-sg-specimen",191),e(799,` 8996 `),c(800,"app-pill-counter",192),e(801,` 8997 `),c(802,"app-pill-counter",193),e(803,` 8998 `),t(),e(804,` 8999 9000 `),n(805,"app-sg-specimen",194),e(806,` 9001 `),n(807,"app-pip-status-bar",195),e(808,` 9002 `),t(),e(809,` 9003 `),n(810,"app-pip-status-bar",196),e(811,` 9004 `),t(),e(812,` 9005 `),t(),e(813,` 9006 9007 `),n(814,"app-sg-specimen",197),e(815,` 9008 `),c(816,"app-player-status-styler",198),e(817,` 9009 `),c(818,"app-player-status-styler",199),e(819,` 9010 `),c(820,"app-player-status-styler",200),e(821,` 9011 `),t(),e(822,` 9012 9013 `),n(823,"app-sg-specimen",201),e(824,` 9014 `),v(825,q1,5,1),t(),e(826,` 9015 9016 `),n(827,"app-sg-specimen",202),e(828,` 9017 `),n(829,"app-poll-header",203),g("refresh",function(){return o.noop()}),t(),e(830,` 9018 `),t(),e(831,` 9019 9020 `),n(832,"app-sg-specimen",204),e(833,` 9021 `),n(834,"app-poll-options",205),g("optionSelected",function(){return o.noop()})("votesUpdated",function(){return o.noop()}),t(),e(835,` 9022 `),t(),e(836,` 9023 9024 `),n(837,"app-sg-specimen",206),e(838,` 9025 `),v(839,V1,10,6),t(),e(840,` 9026 9027 `),n(841,"app-sg-specimen",207),e(842,` 9028 `),c(843,"app-score-display",208),e(844,` 9029 `),t(),e(845,` 9030 9031 `),n(846,"app-sg-specimen",209),e(847,` 9032 `),c(848,"app-side-nav",210),e(849,` 9033 `),t(),e(850,` 9034 9035 `),n(851,"app-sg-specimen",211),e(852,` 9036 `),c(853,"app-spinning-icon"),e(854,` 9037 `),c(855,"app-spinning-icon",212),e(856,` 9038 `),t(),e(857,` 9039 9040 `),n(858,"app-sg-specimen",213),e(859,` 9041 `),n(860,"app-split-button",214),e(861,` 9042 `),t(),e(862,` 9043 `),t(),e(863,` 9044 9045 `),n(864,"app-sg-specimen",215),e(865,` 9046 `),c(866,"app-sport-item",216),e(867,` 9047 `),c(868,"app-sport-item",216),e(869,` 9048 `),c(870,"app-sport-item",216),e(871,` 9049 `),t(),e(872,` 9050 9051 `),n(873,"app-sg-specimen",217),e(874,` 9052 `),c(875,"app-star-rating",218),e(876,` 9053 `),n(877,"app-star-rating",219),g("updateRating",function(){return o.noop()}),t(),e(878,` 9054 `),c(879,"app-star-rating",220),e(880,` 9055 `),t(),e(881,` 9056 9057 `),n(882,"app-sg-specimen",221),e(883,` 9058 `),c(884,"app-status-bar",222),e(885,` 9059 `),c(886,"app-status-bar",223),e(887,` 9060 `),c(888,"app-status-bar",224),e(889,` 9061 `),t(),e(890,` 9062 9063 `),n(891,"app-sg-specimen",225),e(892,` 9064 `),c(893,"app-tag",226),e(894,` 9065 `),n(895,"app-tag",227),g("onClick",function(){return o.noop()}),t(),e(896,` 9066 `),t(),e(897,` 9067 9068 `),n(898,"app-sg-specimen",228),e(899,` 9069 `),c(900,"app-team-accounts-disclosure"),e(901,` 9070 `),t(),e(902,` 9071 9072 `),n(903,"app-sg-specimen",229),e(904,` 9073 `),c(905,"app-team-accounts-transactions-disclosure"),e(906,` 9074 `),t(),e(907,` 9075 9076 `),n(908,"app-sg-specimen",230),e(909,` 9077 `),c(910,"app-team-logo",231),e(911,` 9078 `),c(912,"app-team-logo",231),e(913,` 9079 `),t(),e(914,` 9080 9081 `),n(915,"app-sg-specimen",232),e(916,` 9082 `),v(917,z1,5,2),t(),e(918,` 9083 9084 `),n(919,"app-sg-specimen",233),e(920,` 9085 `),c(921,"app-title-link",234),e(922,` 9086 `),c(923,"app-title-link",235),e(924,` 9087 `),t(),e(925,` 9088 9089 `),n(926,"app-sg-specimen",236),e(927,` 9090 `),n(928,"app-tooltip",237),e(929,` 9091 `),t(),e(930,` 9092 `),n(931,"app-tooltip",238),e(932,` 9093 `),t(),e(933,` 9094 `),c(934,"app-tooltip",239),e(935,` 9095 `),t(),e(936,` 9096 9097 `),n(937,"app-sg-specimen",240),e(938,` 9098 `),n(939,"app-training-focus-pills",241),e(940,` 9099 `),t(),e(941,` 9100 `),t(),e(942,` 9101 9102 `),n(943,"app-sg-specimen",242),e(944,` 9103 `),c(945,"app-ul-nav",243),e(946,` 9104 `),t(),e(947,` 9105 9106 `),n(948,"app-sg-specimen",244),e(949,` 9107 `),n(950,"p",0),e(951,` 9108 Full catalog on `),n(952,"a",6),e(953,"the avatars page"),t(),e(954,`. 9109 `),t(),e(955,` 9110 `),c(956,"app-user-initials",245),e(957,` 9111 `),c(958,"app-user-initials",246),e(959,` 9112 `),n(960,"app-user-initials",247),e(961,` 9113 `),t(),e(962,` 9114 `),t(),e(963,` 9115 9116 `),n(964,"app-sg-specimen",248),e(965,` 9117 `),n(966,"button",154),g("click",function(){return o.open("yesNo")}),e(967,` 9118 Open confirm modal 9119 `),t(),e(968,` 9120 `),v(969,U1,4,0),t(),e(970,` 9121`),t(),e(971,` 9122`)),s&2&&(i(21),p(o.snapshotDate),i(79),E(o.groups),i(14),m("showBackButton",!0)("useBackButtonEmitter",!0),i(11),m("hasSettings",!0),i(13),m("loading",!0),i(5),m("error",!0),i(11),m("trendDirection","success"),i(6),m("trendDirection","danger"),i(6),m("trendDirection","none"),i(8),m("showAdvanced",!0)("showLabels",!0),i(6),y(o.showLive?180:-1),i(4),m("toggles",o.toggles)("isAccordion",!0)("expanded",!0)("dragDisabled",!0),i(9),m("totalWins",9)("totalLosses",3)("totalDraws",2),i(14),m("canCollapse",!0)("collapsed",!1),i(9),m("messages",o.agentMessages)("avatarSrc",o.sampleImage),i(5),m("messages",V(181,w1)),i(5),m("questions",o.agentQuestions),i(5),m("answer",o.agentAnswer),i(5),m("selections",null),i(5),m("canSend",!0),i(24),m("blogImage",o.sampleImage)("blogSavedOn",o.snapshotDate),i(7),m("startDate",o.calendarEvent.startDate)("endDate",o.calendarEvent.endD
9122ate)("clubEventTypeID",o.calendarEvent.clubEventTypeID),i(5),m("showButton",!0),i(5),m("features",V(182,C1))("image",o.sampleImage),i(5),y(o.showLive?287:-1),i(4),m("clubUser",o.staffClubUser),i(5),m("image",o.sampleImage)("clickable",!0),i(12),m("entity",o.viewOnlyEntity)("fields",o.viewOnlyFields)("isEditable",!0),i(14),m("primaryBannerImage",o.sampleImage),i(9),m("tabs",o.sidebarTabs)("activeTab",o.sidebarTabs[0])("sticky",!1),i(5),m("logoUrl",o.sampleImage)("canEditLogo",!0),i(23),m("messageID",9)("sentDate",o.calendarEvent.startDate.toISOString())("reactions",o.reactions)("canReply",!0)("canReact",!0)("canEdit",!0)("canDelete",!0),i(5),m("isSender",!0)("messageID",10)("sentDate",o.calendarEvent.startDate.toISOString()),i(2),m("messageID",11)("isDeleted",!0)("sentDate",o.calendarEvent.startDate.toISOString()),i(5),m("sendEnabled",!0)("showFileUpload",!0)("showGifUpload",!0)("canAddPoll",!0)("messageLimit",500),i(5),m("quotedMessage",o.quotedMessage)("canDelete",!0),i(5),y(o.showLive?381:-1),i(16),m("pinnedMessages",o.pinnedMessages)("totalPinned",1)("showPanel",!0),i(5),m("poll",o.poll)("clubUserId",1),i(54),m("showButton",!0),i(30),m("formFieldsCount",3),i(28),m("dots",!0),i(5),m("showText",!0),i(3),m("showText",!0),i(18),m("showIcon",!0),i(6),y(o.showLive?546:-1),i(4),y(o.showLive?550:-1),i(4),y(o.showLive?554:-1),i(17),y(o.showLive?571:-1),i(4),m("events",o.weekEvents)("resources",o.weekResources)("selectedResources",o.weekResources)("currentDate",o.calendarEvent.startDate),i(5),m("value",!0),i(2),m("disabled",!0)("value",!1),i(5),m("optionValue",1),i(2),m("optionValue",2),i(2),m("disabled",!0),i(10),m("differential",12),i(2),m("differential",0),i(2),m("differential",-7),i(5),m("percentComplete",72),i(6),y(o.showLive?616:-1),i(21),y(o.showLive?637:-1),i(4),m("field",o.viewOnlyFields[0])("entity",o.viewOnlyEntity)("edit",!0),i(2),m("field",o.viewOnlyFields[1])("entity",o.viewOnlyEntity),i(6),m("fGroup",o.fg)("canDownload",!1),i(8),T("visible",o.modals.fileViewer),m("viewUrl",null),i(5),m("imageUrl",o.sampleImage),i(8),y(o.modals.gifPicker?670:-1),i(16),y(o.modals.imageCropper?686:-1),i(22),m("isChecked",!0),i(8),m("isVisible",o.modals.messageEdit)("message",o.editableMessage)("canEdit",!0)("canDelete",!0)("canPin",!0)("canReport",!0)("reportReasons",o.reportReasons),i(38),m("mfaStatus",o.mfaStatus),i(6),y(o.showLive?760:-1),i(10),m("url",null)("showDeviceToggle",!0)("showRefresh",!0),i(23),m("clickable",!0),i(7),m("pillCount",0),i(2),m("pillCount",12),i(5),m("total",20)("totalUsed",17),i(3),m("total",20)("totalUsed",4),i(6),m("statusID",1),i(2),m("statusID",2),i(2),m("statusID",3),i(5),y(o.showLive?825:-1),i(4),m("isSender",!0),i(5),m("options",o.pollOptions)("totalVotes",13)("hasVoted",!0)("selectedOptionId",1)("leadingOptionId",1),i(5),y(o.showLive?839:-1),i(4),m("gameResult",o.gameResult),i(5),m("steps",o.navSteps)("activeStep",1)("activeSecondaryStep",1),i(12),m("menuItems",o.menuItems),i(6),m("sportID",1),i(2),m("sportID",2),i(2),m("sportID",3),i(5),m("rating",3)("fullWidth",!1),i(2),m("rating",4)("editable",!0)("fullWidth",!1),i(2),m("rating",2)("circleStars",!0)("fullWidth",!1),i(5),m("percent",88),i(2),m("percent",45),i(2),m("percent",12),i(7),m("clickable",!0),i(15),m("logo",o.sampleImage),i(2),m("logo",null),i(5),y(o.showLive?917:-1),i(6),m("showIcon",!1)("borderBottom",!1),i(11),m("isInline",!0)("useIcon",!1)("renderAsLink",!0),i(5),m("focuses",o.trainingFocuses)("maxVisible",3),i(6),m("steps",o.navSteps)("activeStep",2),i(11),m("id",1),i(2),m("id",2),i(2),m("id",3)("showCircle",!1),i(9),y(o.modals.yesNo?969:-1))},dependencies:[$,Xa,ar,nt,ir,J,xr,hr,ur,Ka,gr,sn,le,br,un,We,yr,fr,ot,Er,gn,vr,fn,cr,wn,wr,Ra,Cr,_r,kr,Tr,lt,bn,Ir,Mr,Dr,Sn,En,Cn,Fr,Pr,vn,yn,ja,Ar,Or,Nr,Br,Wr,Rr,Lr,qr,Vr,zr,Ur,ka,Hr,Gr,$r,Mn,Kr,Xr,Yr,Qr,Jr,Zr,it,eo,to,no,io,ao,lo,so,ro,oo,mo,co,po,xo,ho,Fo,Ao,Oo,ko,Po,Do,To,Io,Mo,No,ut,X,l0],styles:[".sg-swatch[_ngcontent-%COMP%]{display:inline-block;width:1.5rem;height:1.5rem;border:1px solid var(--border-color);border-radius:var(--border-radius);vertical-align:middle}.sg-swatch--sm[_ngcontent-%COMP%]{width:.75rem;height:.75rem;vertical-align:baseline}.sg-swatch--dot[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;border-radius:50%}.sg-swatch--lg[_ngcontent-%COMP%]{width:2.5rem;height:2.5rem}.sg-swatch--block[_ngcontent-%COMP%]{display:block;width:100%;min-width:3.5rem;height:2.25rem}.sg-swatch--tall[_ngcontent-%COMP%]{display:block;width:100%;height:150px;border:0;border-radius:0}.sg-slot-outline[_ngcontent-%COMP%]{outline:1px dashed var(--blue-400);outline-offset:-1px}.sg-doc-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:top}.sg-cta-replica[_ngcontent-%COMP%]{background-color:var(--theme-color-cta-buttons);border-color:var(--theme-color-cta-buttons)!important;padding:3px 28px;font-size:var(--text-medium-large);color:var(--theme-color-cta-buttons-contrast);text-transform:uppercase;transition:all .3s}.sg-cta-replica[_ngcontent-%COMP%]:hover{border-color:var(--theme-color-cta-buttons-contrast);color:var(--theme-color-cta-buttons--hover);background-color:var(--color-white)}.sg-specimen[_ngcontent-%COMP%]{border:1px dashed var(--border-color);border-radius:var(--border-radius);margin-bottom:1rem;background:var(--color-white)}.sg-specimen-head[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.35rem .75rem;border-bottom:1px dashed var(--border-color);background:var(--color-grey-100, #f7f7f7)}.sg-specimen-body[_ngcontent-%COMP%]{padding:.75rem;overflow-x:auto}"]});let a=r;return a})();var H1=["*"];function j1(a,r){if(a&1&&(n(0,"p",5),e(1),t()),a&2){let l=u();i(),p(l.description)}}var F=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-demo-wrapper"]],inputs:{title:"title",description:"description"},ngContentSelectors:H1,decls:19,vars:2,consts:[[1,"demo-wrapper"],[1,"d-flex","justify-content-between","align-items-start","mb-2"],[1,"mb-1"],["class","text-muted small mb-0",4,"ngIf"],[1,"demo-content"],[1,"text-muted","small","mb-0"]],template:function(s,o){s&1&&(ke(),n(0,"section",0),e(1,` 9123 `),n(2,"div",1),e(3,` 9124 `),n(4,"div"),e(5,` 9125 `),n(6,"h5",2),e(7),t(),e(8,` 9126 `),k(9,j1,2,1,"p",3),e(10,` 9127 `),t(),e(11,` 9128 `),t(),e(12,` 9129 `),n(13,"div",4),e(14,` 9130 `),Te(15),e(16,` 9131 `),t(),e(17,` 9132`),t(),e(18,` 9133`)),s&2&&(i(7),p(o.title),i(2),m("ngIf",o.description))},dependencies:[D,Xe],encapsulation:2});let a=r;return a})();function G1(a,r){if(a&1&&e(0),a&2){let l=u().$implicit;p(l.header)}}function $1(a,r){if(a&1&&(n(0,"p-accordion-panel"),e(1,` 9134 `),k(2,G1,1,1,"ng-template",3),e(3,`
9135 `),n(4,"p",4),e(5),t(),e(6,` 9136 `),t()),a&2){let l=r.$implicit;i(5),p(l.content)}}var Jn=(()=>{let r=class r{constructor(){this.items=[{header:"Header 1",content:"Content for panel 1."},{header:"Header 2",content:"Content for panel 2."},{header:"Header 3",content:"Content for panel 3."}]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-accordion-demo"]],decls:8,vars:2,consts:[["title","Accordion"],[3,"multiple"],[4,"ngFor","ngForOf"],["pAccordionHeader",""],[1,"mb-0"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9137 `),n(2,"p-accordion",1),e(3,` 9138 `),k(4,$1,7,1,"p-accordion-panel",2),e(5,` 9139 `),t(),e(6,` 9140`),t(),e(7,` 9141`)),s&2&&(i(2),m("multiple",!0),i(2),m("ngForOf",o.items))},dependencies:[D,Me,In,mt,dt,F],encapsulation:2});let a=r;return a})();var Zn=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-badge-demo"]],decls:12,vars:0,consts:[["title","Badge"],[1,"d-flex","align-items-center","gap-3","flex-wrap"],["value","8","severity","danger"],["value","2","severity","warn"],["value","5","severity","info"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9142 `),n(2,"div",1),e(3,` 9143 `),c(4,"p-badge",2),e(5,` 9144 `),c(6,"p-badge",3),e(7,` 9145 `),c(8,"p-badge",4),e(9,` 9146 `),t(),e(10,` 9147`),t(),e(11,` 9148`))},dependencies:[D,Bt,Nt,F],encapsulation:2});let a=r;return a})();var Q1=()=>[],ei=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-button-demo"]],decls:14,vars:2,consts:[["title","Buttons","description","Various PrimeNG Button variants."],[1,"d-flex","gap-2","flex-wrap"],["pButton","","type","button","label","Primary"],["pButton","","type","button","label","Secondary",1,"p-button-secondary"],["pButton","","type","button","label","Icon","icon","pi pi-check"],["label","Options","icon","pi pi-cog",3,"model"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9149 `),n(2,"div",1),e(3,` 9150 `),c(4,"button",2),e(5,` 9151 `),c(6,"button",3),e(7,` 9152 `),c(8,"button",4),e(9,` 9153 `),c(10,"p-splitButton",5),e(11,` 9154 `),t(),e(12,` 9155`),t(),e(13,` 9156`)),s&2&&(i(10),m("model",V(1,Q1)))},dependencies:[D,Se,et,ht,zn,F],encapsulation:2});let a=r;return a})();var ti=(()=>{let r=class r{constructor(d,s){this.messageService=d,this.confirmationService=s}showSuccess(){this.messageService.add({severity:"success",summary:"Success",detail:"Operation successful"})}confirmAction(){this.confirmationService.confirm({message:"Are you sure?",accept:()=>{this.showSuccess()}})}};r.\u0275fac=function(s){return new(s||r)(A(ce),A(Qe))},r.\u0275cmp=b({type:r,selectors:[["app-p-toast-demo"]],features:[Ie([ce,Qe])],decls:14,vars:0,consts:[["title","Toast & ConfirmDialog","description","Demo showing toast messages and confirm dialog."],[1,"d-flex","gap-2"],["pButton","","type","button","label","Show Success",3,"click"],["pButton","","type","button","label","Confirm",3,"click"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9157 `),c(2,"p-toast"),e(3,` 9158 `),c(4,"p-confirmDialog"),e(5,` 9159 `),n(6,"div",1),e(7,` 9160 `),n(8,"button",2),g("click",function(){return o.showSuccess()}),t(),e(9,` 9161 `),n(10,"button",3),g("click",function(){return o.confirmAction()}),t(),e(11,` 9162 `),t(),e(12,` 9163`),t(),e(13,` 9164`))},dependencies:[D,Ae,Ze,On,bo,F],encapsulation:2});let a=r;return a})();function eh(a,r){a&1&&(e(0,` 9165 `),n(1,"tr"),e(2,` 9166 `),n(3,"th"),e(4,"ID"),t(),e(5,` 9167 `),n(6,"th"),e(7,"Name"),t(),e(8,` 9168 `),n(9,"th"),e(10,"Price"),t(),e(11,` 9169 `),t(),e(12,` 9170 `))}function th(a,r){if(a&1&&(e(0,` 9171 `),n(1,"tr"),e(2,` 9172 `),n(3,"td"),e(4),t(),e(5,` 9173 `),n(6,"td"),e(7),t(),e(8,` 9174 `),n(9,"td"),e(10),L(11,"currency"),t(),e(12,` 9175 `),t(),e(13,` 9176 `)),a&2){let l=r.$implicit;i(4),p(l.id),i(3),p(l.name),i(3),p(ze(11,3,l.price))}}var ni=(()=>{let r=class r{constructor(){this.products=[{id:1,name:"Apple",price:1.2},{id:2,name:"Orange",price:.95},{id:3,name:"Banana",price:.6}]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-table-demo"]],decls:10,vars:1,consts:[["title","Table","description","Simple p-table with sample data."],[3,"value"],["pTemplate","header"],["pTemplate","body"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9177 `),n(2,"p-table",1),e(3,` 9178 `),k(4,eh,13,0,"ng-template",2),e(5,` 9179 `),k(6,th,14,5,"ng-template",3),e(7,` 9180 `),t(),e(8,` 9181`),t(),e(9,` 9182`)),s&2&&(i(2),m("value",o.products))},dependencies:[D,on,nr,oe,F,ga],encapsulation:2});let a=r;return a})();var ii=(()=>
9182{let r=class r{constructor(){this.items=[{label:"Profile",icon:"pi pi-user"},{label:"Settings",icon:"pi pi-cog"},{separator:!0},{label:"Logout",icon:"pi pi-sign-out"}]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-menu-demo"]],decls:8,vars:2,consts:[["menu",""],["title","Menu","description","Popup menu triggered by a button."],[3,"model","popup"],["pButton","","type","button","label","Toggle Menu","icon","pi pi-bars",3,"click"]],template:function(s,o){if(s&1){let x=B();n(0,"app-p-demo-wrapper",1),e(1,` 9183 `),c(2,"p-menu",2,0),e(4,` 9184 `),n(5,"button",3),g("click",function(_){w(x);let se=ue(3);return C(se.toggle(_))}),t(),e(6,` 9185`),t(),e(7,` 9186`)}s&2&&(i(2),m("model",o.items)("popup",!0))},dependencies:[D,Wt,Ba,Se,et,F],encapsulation:2});let a=r;return a})();function ah(a,r){a&1&&(e(0,` 9187 `),n(1,"span",4),e(2,"MyApp"),t(),e(3,` 9188 `))}function rh(a,r){a&1&&(e(0,` 9189 `),c(1,"input",5),e(2,` 9190 `))}var ai=(()=>{let r=class r{constructor(){this.items=[{label:"Home",icon:"pi pi-home"},{label:"Products",icon:"pi pi-shopping-bag",items:[{label:"New",icon:"pi pi-plus"},{label:"Search",icon:"pi pi-search"}]},{label:"Services",icon:"pi pi-server",items:[{label:"Web",icon:"pi pi-globe"},{label:"Mobile",icon:"pi pi-mobile"}]},{label:"Contact",icon:"pi pi-envelope"}]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-menubar-demo"]],decls:10,vars:1,consts:[["title","MenuBar","description","Horizontal navigation menubar with nested items."],[3,"model"],["pTemplate","start"],["pTemplate","end"],[1,"font-bold","me-3"],["type","text","pInputText","","placeholder","Search\u2026"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9191 `),n(2,"p-menubar",1),e(3,` 9192 `),k(4,ah,4,0,"ng-template",2),e(5,` 9193 `),k(6,rh,3,0,"ng-template",3),e(7,` 9194 `),t(),e(8,` 9195`),t(),e(9,` 9196`)),s&2&&(i(2),m("model",o.items))},dependencies:[D,zt,La,oe,F],encapsulation:2});let a=r;return a})();var ri=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-message-demo"]],decls:14,vars:0,consts:[["title","Message","description","Inline message components for each severity."],[1,"flex","flex-column","gap-2"],["severity","info","text","Informational message."],["severity","success","text","Operation completed successfully."],["severity","warn","text","Warning: check your inputs."],["severity","error","text","An error has occurred."]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9197 `),n(2,"div",1),e(3,` 9198 `),c(4,"p-message",2),e(5,` 9199 `),c(6,"p-message",3),e(7,` 9200 `),c(8,"p-message",4),e(9,` 9201 `),c(10,"p-message",5),e(11,` 9202 `),t(),e(12,` 9203`),t(),e(13,` 9204`))},dependencies:[D,Jt,Ya,F],encapsulation:2});let a=r;return a})();var sh=()=>({"min-width":"18rem"}),dh=(a,r)=>l=>l.name,oi=(()=>{let r=class r{constructor(){this.cities=[{name:"New York",code:"NY"},{name:"Rome",code:"RM"},{name:"London",code:"LDN"},{name:"Istanbul",code:"IST"},{name:"Paris",code:"PRS"}],this.selectedCities=[]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-multiselect-demo"]],decls:12,vars:7,consts:[["title","MultiSelect","description","Multi-select dropdown with search."],[1,"flex","flex-column","gap-2"],["optionLabel","name","placeholder","Select cities","display","chip",3,"ngModelChange","options","ngModel"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9205 `),n(2,"div",1),e(3,` 9206 `),n(4,"p-multiSelect",2),M("ngModelChange",function(h){return I(o.selectedCities,h)||(o.selectedCities=h),h}),e(5,` 9207 `),t(),e(6,` 9208 `),n(7,"small"),e(8),t(),e(9,` 9209 `),t(),e(10,` 9210`),t(),e(11,` 9211`)),s&2&&(i(4),te(V(6,sh)),m("options",o.cities),T("ngModel",o.selectedCities),i(4),f("Selected: ",o.selectedCities.length?o.selectedCities.map(Tt(5,dh,o)).join(", "):"None"))},dependencies:[D,Q,U,H,Qt,Yt,F],encapsulation:2});let a=r;return a})();var ch=()=>[5,10,20],li=(()=>{let r=class r{constructor(){this.first=0,this.rows=10,this.totalRecords=120}onPageChange(d){this.first=d.first,this.rows=d.rows}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-paginator-demo"]],decls:9,vars:7,consts:[["title","Paginator","description","120-record paginator showing page controls."],[3,"onPageChange","rows","totalRecords","rowsPerPageOptions"],[1,"mt-2","d-block"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9212 `),n(2,"p-paginator",1),g("onPageChange",function(h){return o.onPageChange(h)}),e(3,` 9213 `),t(),e(4,` 9214 `),n(5,"small",2),e(6),t(),e(7,` 9215`),t(),e(8,` 9216`)),s&2&&(i(2),m("rows",o.rows)("totalRecords",o.totalRecords)("rowsPerPageOptions",V(6,ch)),i(4),Ve("Showing records ",o.first+1," \u2013 ",o.first+o.rows," of ",o.totalRecords))},dependencies:[D,nn,er,F],encapsulation:2});let a=r;return a})();var si=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-panel-demo"]],decls:18,vars:1,consts:[["title","Panel","description","Collapsible content panel."],[1,"flex","flex-column","gap-3"],["header","Default Panel"],["header","Toggleable Panel",3,"toggleable"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9217 `),n(2,"div",1),e(3,` 9218 `),n(4,"p-panel",2),e(5,` 9219 `),n(6,"p"),e(7,"This is the default panel content. Lorem ipsum dolor sit amet, consectetur adipiscing elit."),t(),e(8,` 9220 `),t(),e(9,` 9221 `),n(10,"p-panel",3),e(11,` 9222 `),n(12,"p"),e(13,"This panel can be collapsed or expanded by clicking the toggle icon."),t(),e(14,` 9223 `),t(),e(15,` 9224 `),t(),e(16,` 9225`),t(),e(17,` 9226`)),s&2&&(i(10),m("toggleable",!0))},dependencies:[D,qn,vo,F],encapsulation:2});let a=r;return a})();var hh=()=>({width:"18rem"}),di=(()=>
9226{let r=class r{constructor(){this.items=[{label:"File",icon:"pi pi-fw pi-file",items:[{label:"New",icon:"pi pi-fw pi-plus"},{label:"Open",icon:"pi pi-fw pi-folder-open"},{label:"Download",icon:"pi pi-fw pi-download"}]},{label:"Edit",icon:"pi pi-fw pi-pencil",items:[{label:"Cut",icon:"pi pi-fw pi-scissors"},{label:"Copy",icon:"pi pi-fw pi-copy"},{label:"Paste",icon:"pi pi-fw pi-file"}]},{label:"Help",icon:"pi pi-fw pi-question",items:[{label:"Contents",icon:"pi pi-fw pi-book"},{label:"Search",icon:"pi pi-fw pi-search"}]}]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-panelmenu-demo"]],decls:5,vars:4,consts:[["title","PanelMenu","description","Vertical accordion-style menu."],[3,"model"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9227 `),c(2,"p-panelMenu",1),e(3,` 9228`),t(),e(4,` 9229`)),s&2&&(i(2),te(V(3,hh)),m("model",o.items))},dependencies:[D,Ut,Va,F],encapsulation:2});let a=r;return a})();function gh(a,r){if(a&1){let l=B();e(0,` 9230 `),n(1,"div",4),e(2,` 9231 `),n(3,"h6"),e(4,"Popover Content"),t(),e(5,` 9232 `),n(6,"p"),e(7,"This is a popover. It can display any content here."),t(),e(8,` 9233 `),n(9,"button",5),g("click",function(){w(l),u();let s=ue(3);return C(s.hide())}),t(),e(10,` 9234 `),t(),e(11,` 9235 `)}}var mi=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-popover-demo"]],decls:12,vars:0,consts:[["op",""],["content",""],["title","Popover","description","Popover triggered by a button click."],["pButton","","type","button","label","Show Popover","icon","pi pi-info-circle",3,"click"],[1,"p-3"],["pButton","","type","button","label","Close","size","small",3,"click"]],template:function(s,o){if(s&1){let x=B();n(0,"app-p-demo-wrapper",2),e(1,` 9236 `),n(2,"p-popover",null,0),e(4,` 9237 `),k(5,gh,12,0,"ng-template",null,1,fe),e(7,` 9238 `),t(),e(8,` 9239 `),n(9,"button",3),g("click",function(_){w(x);let se=ue(3);return C(se.toggle(_))}),t(),e(10,` 9240`),t(),e(11,` 9241`)}},dependencies:[D,Fn,fo,Se,et,F],encapsulation:2});let a=r;return a})();var bh=()=>({height:"6px"}),Sh=()=>({width:"50px",height:"50px"}),ci=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-progress-demo"]],decls:30,vars:7,consts:[["title","Progress","description","ProgressBar with static value and ProgressSpinner."],[1,"flex","flex-column","gap-4"],[1,"d-block","mb-1"],[3,"value"],["mode","indeterminate"],[1,"flex","align-items-center","gap-3"],["strokeWidth","4"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9242 `),n(2,"div",1),e(3,` 9243 `),n(4,"div"),e(5,` 9244 `),n(6,"label",2),e(7,"ProgressBar (75%)"),t(),e(8,` 9245 `),c(9,"p-progressBar",3),e(10,` 9246 `),t(),e(11,` 9247 `),n(12,"div"),e(13,` 9248 `),n(14,"label",2),e(15,"ProgressBar (indeterminate)"),t(),e(16,` 9249 `),c(17,"p-progressBar",4),e(18,` 9250 `),t(),e(19,` 9251 `),n(20,"div",5),e(21,` 9252 `),c(22,"p-progressSpinner",6),e(23,` 9253 `),n(24,"span"),e(25,"ProgressSpinner"),t(),e(26,` 9254 `),t(),e(27,` 9255 `),t(),e(28,` 9256`),t(),e(29,` 9257`)),s&2&&(i(9),m("value",75),i(8),te(V(5,bh)),i(5),te(V(6,Sh)))},dependencies:[D,Zt,Qa,Vn,yo,F],encapsulation:2});let a=r;return a})();function vh(a,r){if(a&1){let l=B();n(0,"div",4),e(1,` 9258 `),n(2,"p-radioButton",5),M("ngModelChange",function(s){w(l);let o=u();return I(o.selectedCity,s)||(o.selectedCity=s),C(s)}),t(),e(3,` 9259 `),n(4,"label",6),e(5),t(),e(6,` 9260 `),t()}if(a&2){let l=r.$implicit,d=u();i(2),m("inputId","rb-"+l)("value",l),T("ngModel",d.selectedCity),i(2),m("for","rb-"+l),i(),p(l)}}var pi=(()=>{let r=class r{constructor(){this.selectedCity="Chicago",this.cities=["Chicago","Los Angeles","New York","San Francisco"]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-radiobutton-demo"]],decls:13,vars:2,consts:[["title","RadioButton","description","Radio button group bound to a string value."],[1,"flex","flex-column","gap-2"],["class","flex align-items-center gap-2",4,"ngFor","ngForOf"],[1,"mt-1"],[1,"flex","align-items-center","gap-2"],["name","city",3,"ngModelChange","inputId","value","ngModel"],[3,"for"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9261 `),n(2,"div",1),e(3,` 9262 `),k(4,vh,7,5,"div",2),e(5,` 9263 `),n(6,"small",3),e(7,"Selected: "),n(8,"strong"),e(9),t()(),e(10,` 9264 `),t(),e(11,` 9265`),t(),e(12,` 9266`)),s&2&&(i(4),m("ngForOf",o.cities),i(5),p(o.selectedCity))},dependencies:[D,Me,Q,U,H,an,tt,F],encapsulation:2});let a=r;return a})();var xi=(()=>
9266{let r=class r{constructor(){this.val1=3,this.val2=4}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-rating-demo"]],decls:25,vars:4,consts:[["title","Rating","description","Interactive and read-only rating stars."],[1,"flex","flex-column","gap-3"],[1,"d-block","mb-1"],[3,"ngModelChange","ngModel"],[3,"ngModelChange","ngModel","readonly"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9267 `),n(2,"div",1),e(3,` 9268 `),n(4,"div"),e(5,` 9269 `),n(6,"label",2),e(7,"Interactive (out of 5)"),t(),e(8,` 9270 `),n(9,"p-rating",3),M("ngModelChange",function(h){return I(o.val1,h)||(o.val1=h),h}),t(),e(10,` 9271 `),n(11,"small"),e(12),t(),e(13,` 9272 `),t(),e(14,` 9273 `),n(15,"div"),e(16,` 9274 `),n(17,"label",2),e(18,"Read-only"),t(),e(19,` 9275 `),n(20,"p-rating",4),M("ngModelChange",function(h){return I(o.val2,h)||(o.val2=h),h}),t(),e(21,` 9276 `),t(),e(22,` 9277 `),t(),e(23,` 9278`),t(),e(24,` 9279`)),s&2&&(i(9),T("ngModel",o.val1),i(3),f("Value: ",o.val1),i(8),T("ngModel",o.val2),m("readonly",!0))},dependencies:[D,Q,U,H,pn,sr,F],encapsulation:2});let a=r;return a})();var Ch=()=>({width:"200px",height:"200px"});function _h(a,r){if(a&1&&(e(0,` 9280 `),n(1,"div",3),e(2),t(),e(3,` 9281 `)),a&2){let l=r.$implicit,d=r.options;i(),j("surface-ground",d.odd),i(),p(l)}}var hi=(()=>{let r=class r{constructor(){this.items=Array.from({length:100},(d,s)=>`Item ${s+1}`)}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-scroller-demo"]],decls:8,vars:5,consts:[["title","Scroller","description","Virtual scroller over 100 items, each 50px tall."],[3,"items","itemSize"],["pTemplate","item"],[1,"flex","align-items-center","p-2"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9282 `),n(2,"p-scroller",1),e(3,` 9283 `),k(4,_h,4,3,"ng-template",2),e(5,` 9284 `),t(),e(6,` 9285`),t(),e(7,` 9286`)),s&2&&(i(2),te(V(4,Ch)),m("items",o.items)("itemSize",50))},dependencies:[D,qt,Wa,oe,F],encapsulation:2});let a=r;return a})();function Th(a,r){if(a&1&&(n(0,"small"),e(1,"Selected: "),n(2,"strong"),e(3),t()()),a&2){let l=u();i(3),p(l.selectedCountry)}}var ui=(()=>{let r=class r{constructor(){this.suggestions=[],this.countries=["Australia","Austria","Belgium","Brazil","Canada","Denmark","Finland","France","Germany","India","Italy","Japan","Netherlands","Norway","Spain","Sweden","United Kingdom","United States"]}search(d){let s=d.query.toLowerCase();this.suggestions=this.countries.filter(o=>o.toLowerCase().startsWith(s))}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-autocomplete-demo"]],decls:13,vars:3,consts:[["title","AutoComplete","description","Type to search from a static list of countries."],[1,"flex","flex-column","gap-2"],["for","ac"],["inputId","ac","placeholder","Search countries\u2026",3,"ngModelChange","completeMethod","ngModel","suggestions"],[4,"ngIf"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9287 `),n(2,"div",1),e(3,` 9288 `),n(4,"label",2),e(5,"Country"),t(),e(6,` 9289 `),n(7,"p-autoComplete",3),M("ngModelChange",function(h){return I(o.selectedCountry,h)||(o.selectedCountry=h),h}),g("completeMethod",function(h){return o.search(h)}),t(),e(8,` 9290 `),k(9,Th,4,1,"small",4),e(10,` 9291 `),t(),e(11,` 9292`),t(),e(12,` 9293`)),s&2&&(i(7),T("ngModel",o.selectedCountry),m("suggestions",o.suggestions),i(2),m("ngIf",o.selectedCountry))},dependencies:[D,Xe,Q,U,H,xn,dr,F],encapsulation:2});let a=r;return a})();var gi=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-card-demo"]],decls:9,vars:0,consts:[["title","Card"],["header","Title","subheader","Subtitle"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9294 `),n(2,"p-card",1),e(3,` 9295 `),n(4,"p"),e(5,"Card body placeholder."),t(),e(6,` 9296 `),t(),e(7,` 9297`),t(),e(8,` 9298`))},dependencies:[D,Hn,qo,F],encapsulation:2});let a=r;return a})();function Dh(a,r){if(a&1&&(e(0,` 9299 `),n(1,"div",3),e(2,` 9300 `),n(3,"p",4),e(4),t(),e(5,` 9301 `),n(6,"p",5),e(7),t(),e(8,` 9302 `),n(9,"p",6),e(10),t(),e(11,` 9303 `),t(),e(12,` 9304 `)),a&2){let l=r.$implicit;i(4),p(l.name),i(3),p(l.category),i(3),f("$",l.price)}}var fi=(()=>
9304{let r=class r{constructor(){this.products=[{name:"Bamboo Watch",price:65,image:"bamboo-watch.jpg",category:"Accessories",rating:5},{name:"Black Watch",price:72,image:"black-watch.jpg",category:"Accessories",rating:4},{name:"Blue Band",price:79,image:"blue-band.jpg",category:"Fitness",rating:3},{name:"Blue T-Shirt",price:29,image:"blue-t-shirt.jpg",category:"Clothing",rating:5},{name:"Bracelet",price:15,image:"bracelet.jpg",category:"Accessories",rating:4}],this.responsiveOptions=[{breakpoint:"1199px",numVisible:3,numScroll:1},{breakpoint:"991px",numVisible:2,numScroll:1},{breakpoint:"767px",numVisible:1,numScroll:1}]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-carousel-demo"]],decls:8,vars:5,consts:[["title","Carousel","description","Responsive product carousel with 3 visible items."],[3,"value","numVisible","numScroll","circular","responsiveOptions"],["pTemplate","item"],[1,"border-1","surface-border","border-round","m-2","p-3","text-center"],[1,"font-bold","mb-1"],[1,"text-secondary"],[1,"text-lg","font-semibold"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9305 `),n(2,"p-carousel",1),e(3,` 9306 `),k(4,Dh,13,3,"ng-template",2),e(5,` 9307 `),t(),e(6,` 9308`),t(),e(7,` 9309`)),s&2&&(i(2),m("value",o.products)("numVisible",3)("numScroll",1)("circular",!0)("responsiveOptions",o.responsiveOptions))},dependencies:[D,An,Pn,oe,F],encapsulation:2});let a=r;return a})();var bi=(()=>{let r=class r{constructor(){this.barData={labels:["January","February","March","April","May","June","July"],datasets:[{label:"Dataset 1",data:[65,59,80,81,56,55,40],backgroundColor:"rgba(255,159,64,0.2)",borderColor:"rgb(255,159,64)",borderWidth:1},{label:"Dataset 2",data:[28,48,40,19,86,27,90],backgroundColor:"rgba(75,192,192,0.2)",borderColor:"rgb(75,192,192)",borderWidth:1}]},this.barOptions={responsive:!0},this.pieData={labels:["Red","Blue","Yellow"],datasets:[{data:[300,50,100],backgroundColor:["#FF6384","#36A2EB","#FFCE56"]}]},this.pieOptions={responsive:!0}}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-chart-demo"]],decls:22,vars:4,consts:[["title","Chart","description","Bar chart and Pie chart rendered via Chart.js."],[1,"row"],[1,"col-md-7"],["type","bar","height","250",3,"data","options"],[1,"col-md-5"],["type","pie","height","250",3,"data","options"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9310 `),n(2,"div",1),e(3,` 9311 `),n(4,"div",2),e(5,` 9312 `),n(6,"h6"),e(7,"Bar Chart"),t(),e(8,` 9313 `),c(9,"p-chart",3),e(10,` 9314 `),t(),e(11,` 9315 `),n(12,"div",4),e(13,` 9316 `),n(14,"h6"),e(15,"Pie Chart"),t(),e(16,` 9317 `),c(17,"p-chart",5),e(18,` 9318 `),t(),e(19,` 9319 `),t(),e(20,` 9320`),t(),e(21,` 9321`)),s&2&&(i(9),m("data",o.barData)("options",o.barOptions),i(8),m("data",o.pieData)("options",o.pieOptions))},dependencies:[D,Un,Lo,F],encapsulation:2});let a=r;return a})();var Si=(()=>{let r=class r{constructor(){this.checked1=!0,this.checked2=!1,this.checked3=!1,this.cities=[]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-checkbox-demo"]],decls:63,vars:11,consts:[["title","Checkbox","description","Boolean and multi-select checkbox demos."],[1,"flex","flex-column","gap-3"],[1,"flex","align-items-center","gap-2"],["inputId","cb1",3,"ngModelChange","ngModel","binary"],["for","cb1"],["inputId","cb2",3,"ngModelChange","ngModel","binary"],["for","cb2"],["inputId","cb3",3,"ngModelChange","ngModel","binary","disabled"],["for","cb3"],[1,"flex","gap-3"],["value","New York","inputId","ny",3,"ngModelChange","ngModel"],["for","ny"],["value","San Francisco","inputId","sf",3,"ngModelChange","ngModel"],["for","sf"],["value","Los Angeles","inputId","la",3,"ngModelChange","ngModel"],["for","la"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9322 `),n(2,"div",1),e(3,` 9323 `),n(4,"div",2),e(5,` 9324 `),n(6,"p-checkbox",3),M("ngModelChange",function(h){return I(o.checked1,h)||(o.checked1=h),h}),t(),e(7,` 9325 `),n(8,"label",4),e(9,"Checked by default"),t(),e(10,` 9326 `),t(),e(11,` 9327 `),n(12,"div",2),e(13,` 9328 `),n(14,"p-checkbox",5),M("ngModelChange",function(h){return I(o.checked2,h)||(o.checked2=h),h}),t(),e(15,` 9329 `),n(16,"label",6),e(17,"Unchecked by default"),t(),e(18,` 9330 `),t(),e(19,` 9331 `),n(20,"div",2),e(21,` 9332 `),n(22,"p-checkbox",7),M("ngModelChange",function(h){return I(o.checked3,h)||(o.checked3=h),h}),t(),e(23,` 9333 `),n(24,"label",8),e(25,"Disabled"),t(),e(26,` 9334 `),t(),e(27,` 9335 `),n(28,"p"),e(29,"Multi-select group:"),t(),e(30,` 9336 `),n(31,"div",9),e(32,` 9337 `),n(33,"div",2),e(34,`
9338 `),n(35,"p-checkbox",10),M("ngModelChange",function(h){return I(o.cities,h)||(o.cities=h),h}),t(),e(36,` 9339 `),n(37,"label",11),e(38,"New York"),t(),e(39,` 9340 `),t(),e(40,` 9341 `),n(41,"div",2),e(42,` 9342 `),n(43,"p-checkbox",12),M("ngModelChange",function(h){return I(o.cities,h)||(o.cities=h),h}),t(),e(44,` 9343 `),n(45,"label",13),e(46,"San Francisco"),t(),e(47,` 9344 `),t(),e(48,` 9345 `),n(49,"div",2),e(50,` 9346 `),n(51,"p-checkbox",14),M("ngModelChange",function(h){return I(o.cities,h)||(o.cities=h),h}),t(),e(52,` 9347 `),n(53,"label",15),e(54,"Los Angeles"),t(),e(55,` 9348 `),t(),e(56,` 9349 `),t(),e(57,` 9350 `),n(58,"small"),e(59),t(),e(60,` 9351 `),t(),e(61,` 9352`),t(),e(62,` 9353`)),s&2&&(i(6),T("ngModel",o.checked1),m("binary",!0),i(8),T("ngModel",o.checked2),m("binary",!0),i(8),T("ngModel",o.checked3),m("binary",!0)("disabled",!0),i(13),T("ngModel",o.cities),i(8),T("ngModel",o.cities),i(8),T("ngModel",o.cities),i(8),f("Selected: ",o.cities.join(", ")||"None"))},dependencies:[D,Q,U,H,$t,Oe,F],encapsulation:2});let a=r;return a})();var Ei=(()=>{let r=class r{constructor(){this.color1="#1976d2",this.color2={r:255,g:100,b:50}}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-colorpicker-demo"]],decls:25,vars:4,consts:[["title","ColorPicker","description","Inline and popup color pickers."],[1,"flex","gap-4","align-items-start","flex-wrap"],[1,"flex","flex-column","align-items-center","gap-2"],[3,"ngModelChange","ngModel"],["format","rgb",3,"ngModelChange","ngModel","inline"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9354 `),n(2,"div",1),e(3,` 9355 `),n(4,"div",2),e(5,` 9356 `),n(6,"label"),e(7,"Hex (popup)"),t(),e(8,` 9357 `),n(9,"p-colorPicker",3),M("ngModelChange",function(h){return I(o.color1,h)||(o.color1=h),h}),t(),e(10,` 9358 `),n(11,"small"),e(12),t(),e(13,` 9359 `),t(),e(14,` 9360 `),n(15,"div",2),e(16,` 9361 `),n(17,"label"),e(18,"RGB (inline)"),t(),e(19,` 9362 `),n(20,"p-colorPicker",4),M("ngModelChange",function(h){return I(o.color2,h)||(o.color2=h),h}),t(),e(21,` 9363 `),t(),e(22,` 9364 `),t(),e(23,` 9365`),t(),e(24,` 9366`)),s&2&&(i(9),T("ngModel",o.color1),i(3),p(o.color1),i(8),T("ngModel",o.color2),m("inline",!0))},dependencies:[D,Q,U,H,Gt,jt,F],encapsulation:2});let a=r;return a})();var c0=` 9367 .p-tag { 9368 display: inline-flex; 9369 align-items: center; 9370 justify-content: center; 9371 background: dt('tag.primary.background'); 9372 color: dt('tag.primary.color'); 9373 font-size: dt('tag.font.size'); 9374 font-weight: dt('tag.font.weight'); 9375 padding: dt('tag.padding'); 9376 border-radius: dt('tag.border.radius'); 9377 gap: dt('tag.gap'); 9378 } 9379 9380 .p-tag-icon { 9381 font-size: dt('tag.icon.size'); 9382 width: dt('tag.icon.size'); 9383 height: dt('tag.icon.size'); 9384 } 9385 9386 .p-tag-rounded { 9387 border-radius: dt('tag.rounded.border.radius'); 9388 } 9389 9390 .p-tag-success { 9391 background: dt('tag.success.background'); 9392 color: dt('tag.success.color'); 9393 } 9394 9395 .p-tag-info { 9396 background: dt('tag.info.background'); 9397 color: dt('tag.info.color'); 9398 } 9399 9400 .p-tag-warn { 9401 background: dt('tag.warn.background'); 9402 color: dt('tag.warn.color'); 9403 } 9404 9405 .p-tag-danger { 9406 background: dt('tag.danger.background'); 9407 color: dt('tag.danger.color'); 9408 } 9409 9410 .p-tag-secondary { 9411 background: dt('tag.secondary.background'); 9412 color: dt('tag.secondary.color'); 9413 } 9414 9415 .p-tag-contrast { 9416 background: dt('tag.contrast.background'); 9417 color: dt('tag.contrast.color'); 9418 } 9419`;var Nh=["icon"],Bh=["*"];function Wh(a,r){if(a&1&&c(0,"span",4),a&2){let l=u(2);ne(l.cx("icon")),m("ngClass",l.icon)("pBind",l.ptm("icon"))}}function Rh(a,r){if(a&1&&(O(0),k(1,Wh,1,4,"span",3),N()),a&2){let l=u();i(),m("ngIf",l.icon)}}function Lh(a,r){}function qh(a,r){a&1&&k(0,Lh,0,0,"ng-template")}function Vh(a,r){if(a&1&&(n(0,"span",2),k(1,qh,1,0,null,5),t()),a&2){let l=u();ne(l.cx("icon")),m("pBind",l.ptm("icon")),i(),m("ngTemplateOutlet",l.iconTemplate||l._iconTemplate)}}var zh={root:({instance:a})=>["p-tag p-component",{"p-tag-info":a.severity==="info","p-tag-success":a.severity==="success","p-tag-warn":a.severity==="warn","p-tag-danger":a.severity==="danger","p-tag-secondary":a.severity==="secondary","p-tag-contrast":a.severity==="contrast","p-tag-rounded":a.rounded}],icon:"p-tag-icon",label:"p-tag-label"},p0=(()=>{class a extends Da{name="tag";style=c0;classes=zh;static \u0275fac=(()=>{let l;return function(s){return(l||(l=Ni(a)))(s||a)}})();static \u0275prov=ia({token:a,factory:a.\u0275fac})}return a})();var x0=new aa("TAG_INSTANCE"),Zi=(()=>{class a extends Aa{componentName="Tag";
9419$pcTag=_t(x0,{optional:!0,skipSelf:!0})??void 0;bindDirectiveInstance=_t(St,{self:!0});onAfterViewChecked(){this.bindDirectiveInstance.setAttrs(this.ptms(["host","root"]))}styleClass;severity;value;icon;rounded;iconTemplate;templates;_iconTemplate;_componentStyle=_t(p0);onAfterContentInit(){this.templates?.forEach(l=>{l.getType()==="icon"&&(this._iconTemplate=l.template)})}get dataP(){return this.cn({rounded:this.rounded,[this.severity]:this.severity})}static \u0275fac=(()=>{let l;return function(s){return(l||(l=Ni(a)))(s||a)}})();static \u0275cmp=b({type:a,selectors:[["p-tag"]],contentQueries:function(d,s,o){if(d&1&&ma(o,Nh,4)(o,oe,4),d&2){let x;xe(x=he())&&(s.iconTemplate=x.first),xe(x=he())&&(s.templates=x)}},hostVars:3,hostBindings:function(d,s){d&2&&(pe("data-p",s.dataP),ne(s.cn(s.cx("root"),s.styleClass)))},inputs:{styleClass:"styleClass",severity:"severity",value:"value",icon:"icon",rounded:[2,"rounded","rounded",pa]},features:[Ie([p0,{provide:x0,useExisting:a},{provide:Pa,useExisting:a}]),la([St]),sa],ngContentSelectors:Bh,decls:5,vars:6,consts:[[4,"ngIf"],[3,"class","pBind",4,"ngIf"],[3,"pBind"],[3,"class","ngClass","pBind",4,"ngIf"],[3,"ngClass","pBind"],[4,"ngTemplateOutlet"]],template:function(d,s){d&1&&(ke(),Te(0),k(1,Rh,2,1,"ng-container",0)(2,Vh,2,4,"span",1),n(3,"span",2),e(4),t()),d&2&&(i(),m("ngIf",!s.iconTemplate&&!s._iconTemplate),i(),m("ngIf",s.iconTemplate||s._iconTemplate),i(),ne(s.cx("label")),m("pBind",s.ptm("label")),i(),p(s.value))},dependencies:[D,It,Xe,De,Ft,St],encapsulation:2,changeDetection:0})}return a})(),h0=(()=>{class a{static \u0275fac=function(d){return new(d||a)};static \u0275mod=Ge({type:a});static \u0275inj=je({imports:[Zi,Ft,Ft]})}return a})();function Hh(a,r){if(a&1&&(n(0,"div",5),e(1,` 9420 `),n(2,"div"),e(3,` 9421 `),n(4,"p",6),e(5),t(),e(6,` 9422 `),n(7,"small",7),e(8),t(),e(9,` 9423 `),t(),e(10,` 9424 `),n(11,"div",8),e(12,` 9425 `),n(13,"span",9),e(14),t(),e(15,` 9426 `),c(16,"p-tag",10),e(17,` 9427 `),t(),e(18,` 9428 `),t()),a&2){let l=r.$implicit,d=u(2);i(5),p(l.name),i(3),p(l.category),i(6),f("$",l.price),i(2),m("value",l.inventoryStatus)("severity",d.getSeverity(l.inventoryStatus))}}function jh(a,r){if(a&1&&(e(0,` 9429 `),n(1,"div",3),e(2,` 9430 `),k(3,Hh,19,5,"div",4),e(4,` 9431 `),t(),e(5,` 9432 `)),a&2){let l=r.$implicit;i(3),m("ngForOf",l)}}var vi=(()=>{let r=class r{constructor(){this.products=[{name:"Bamboo Watch",price:65,category:"Accessories",inventoryStatus:"INSTOCK",rating:5},{name:"Black Watch",price:72,category:"Accessories",inventoryStatus:"LOWSTOCK",rating:4},{name:"Blue Band",price:79,category:"Fitness",inventoryStatus:"OUTOFSTOCK",rating:3},{name:"Blue T-Shirt",price:29,category:"Clothing",inventoryStatus:"INSTOCK",rating:5},{name:"Bracelet",price:15,category:"Accessories",inventoryStatus:"INSTOCK",rating:4},{name:"Brown Purse",price:120,category:"Accessories",inventoryStatus:"INSTOCK",rating:4}]}getSeverity(d){switch(d){case"INSTOCK":return"success";case"LOWSTOCK":return"warn";default:return"danger"}}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-dataview-demo"]],decls:8,vars:1,consts:[["title","DataView","description","Filterable product list using p-dataView."],[3,"value"],["pTemplate","list"],[1,"flex","flex-column","gap-2"],["class","flex justify-content-between align-items-center border-bottom-1 surface-border py-2",4,"ngFor","ngForOf"],[1,"flex","justify-content-between","align-items-center","border-bottom-1","surface-border","py-2"],[1,"font-bold","mb-0"],[1,"text-secondary"],[1,"flex","align-items-center","gap-3"],[1,"font-semibold"],[3,"value","severity"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9433 `),n(2,"p-dataView",1),e(3,` 9434 `),k(4,jh,6,1,"ng-template",2),e(5,` 9435 `),t(),e(6,` 9436`),t(),e(7,` 9437`)),s&2&&(i(2),m("value",o.products))},dependencies:[D,Me,Ln,Eo,oe,Se,h0,Zi,F],encapsulation:2});let a=r;return a})();var yi=(()=>{let r=class r{constructor(){this.date1=null,this.date2=new Date,this.rangeDate=null}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-datepicker-demo"]],decls:30,vars:4,consts:[["title","DatePicker","description","Basic, pre-filled, and date-range pickers."],[1,"flex","flex-column","gap-4"],[1,"d-block","mb-1"],["placeholder","Select a date",3,"ngModelChange","ngModel"],[3,"ngModelChange","ngModel"],["selectionMode","range","placeholder","Select date range",3,"ngModelChange","ngModel","readonlyInput"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9438 `),n(2,"div",1),e(3,` 9439 `),n(4,"div"),e(5,` 9440 `),n(6,"label",2),e(7,"Basic"),t(),e(8,` 9441 `),n(9,"p-datepicker",3),M("ngModelChange",function(h){return I(o.date1,h)||(o.date1=h),h}),t(),e(10,` 9442 `),t(),e(11,` 9443 `),n(12,"div"),e(13,` 9444 `),n(14,"label",2),e(15,"Pre-filled with Today"),t(),e(16,` 9445 `),n(17,"p-datepicker",4),M("ngModelChange",function(h){return I(o.date2,h)||(o.date2=h),h}),t(),e(18,` 9446 `),t(),e(19,` 9447 `),n(20,"div"),e(21,` 9448 `),n(22,"label",2),e(23,"Date Range"),t(),e(24,` 9449 `),n(25,"p-datepicker",5),M("ngModelChange",function(h){return I(o.rangeDate,h)||(o.rangeDate=h),h}),t(),e(26,` 9450 `),t(),e(27,` 9451 `),t(),e(28,` 9452`),t(),e(29,` 9453`)),s&2&&(i(9),T("ngModel",o.date1),i(8),T("ngModel",o.date2),i(8),T("ngModel",o.rangeDate),m("readonlyInput",!0))},dependencies:[D,Q,U,H,Xt,Kt,F],encapsulation:2});let a=r;return a})();var wi=(()=>
9453{let r=class r{constructor(){this.visible=!1}open(){this.visible=!0}close(){this.visible=!1}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-dialog-demo"]],decls:4,vars:0,consts:[["title","Dialog","description","Basic dialog opened via a button."]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9454`),e(2,` 9455`),t(),e(3,` 9456`))},dependencies:[D,Ht,Se,F],encapsulation:2});let a=r;return a})();function Xh(a,r){a&1&&(e(0,` 9457 `),n(1,"p"),e(2,"Drag and drop files here to upload."),t(),e(3,` 9458 `))}var Ci=(()=>{let r=class r{constructor(d){this.messageService=d}onUpload(d){this.messageService.add({severity:"info",summary:"File Uploaded",detail:d.files[0]?.name})}};r.\u0275fac=function(s){return new(s||r)(A(ce))},r.\u0275cmp=b({type:r,selectors:[["app-p-fileupload-demo"]],features:[Ie([ce])],decls:27,vars:4,consts:[["title","FileUpload","description","Single and multiple file upload components."],[1,"flex","flex-column","gap-4"],[1,"d-block","mb-2"],["mode","basic","name","demo[]","chooseLabel","Browse",3,"auto"],["name","demo[]","accept","image/*",3,"onUpload","uploadHandler","multiple","maxFileSize","customUpload"],["pTemplate","empty"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9459 `),c(2,"p-toast"),e(3,` 9460 `),n(4,"div",1),e(5,` 9461 `),n(6,"div"),e(7,` 9462 `),n(8,"label",2),e(9,"Basic"),t(),e(10,` 9463 `),c(11,"p-fileUpload",3),e(12,` 9464 `),t(),e(13,` 9465 `),n(14,"div"),e(15,` 9466 `),n(16,"label",2),e(17,"Advanced (multiple)"),t(),e(18,` 9467 `),n(19,"p-fileUpload",4),g("onUpload",function(h){return o.onUpload(h)})("uploadHandler",function(h){return o.onUpload(h)}),e(20,` 9468 `),k(21,Xh,4,0,"ng-template",5),e(22,` 9469 `),t(),e(23,` 9470 `),t(),e(24,` 9471 `),t(),e(25,` 9472`),t(),e(26,` 9473`)),s&2&&(i(11),m("auto",!1),i(8),m("multiple",!0)("maxFileSize",1e6)("customUpload",!0))},dependencies:[D,en,Ja,oe,Ae,Ze,F],encapsulation:2});let a=r;return a})();var _i=(()=>{let r=class r{constructor(){this.textValue="",this.numberValue=null,this.price=49.99,this.textareaValue=""}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-inputs-demo"]],decls:52,vars:5,consts:[["title","Inputs","description","InputText, InputNumber with currency, InputGroup with addon, and Textarea."],[1,"flex","flex-column","gap-4"],["for","it1",1,"d-block","mb-1"],["id","it1","type","text","pInputText","","placeholder","Type something\u2026",1,"w-full",3,"ngModelChange","ngModel"],["for","in1",1,"d-block","mb-1"],["id","in1","placeholder","Enter a number",3,"ngModelChange","ngModel","showButtons"],["for","in2",1,"d-block","mb-1"],["id","in2","mode","currency","currency","USD","locale","en-US",3,"ngModelChange","ngModel"],[1,"d-block","mb-1"],[1,"pi","pi-user"],["type","text","pInputText","","placeholder","Username"],["for","ta1",1,"d-block","mb-1"],["id","ta1","pTextarea","","rows","4","cols","30","placeholder","Enter a description\u2026",1,"w-full",3,"ngModelChange","ngModel"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9474 `),n(2,"div",1),e(3,` 9475 `),n(4,"div"),e(5,` 9476 `),n(6,"label",2),e(7,"InputText"),t(),e(8,` 9477 `),n(9,"input",3),M("ngModelChange",function(h){return I(o.textValue,h)||(o.textValue=h),h}),t(),e(10,` 9478 `),t(),e(11,` 9479 `),n(12,"div"),e(13,` 9480 `),n(14,"label",4),e(15,"InputNumber (integer)"),t(),e(16,` 9481 `),n(17,"p-inputNumber",5),M("ngModelChange",function(h){return I(o.numberValue,h)||(o.numberValue=h),h}),t(),e(18,` 9482 `),t(),e(19,` 9483 `),n(20,"div"),e(21,` 9484 `),n(22,"label",6),e(23,"InputNumber (currency)"),t(),e(24,` 9485 `),n(25,"p-inputNumber",7),M("ngModelChange",function(h){return I(o.price,h)||(o.price=h),h}),t(),e(26,` 9486 `),t(),e(27,` 9487 `),n(28,"div"),e(29,` 9488 `),n(30,"label",8),e(31,"InputGroup with addon"),t(),e(32,` 9489 `),n(33,"p-inputGroup"),e(34,` 9490 `),n(35,"p-inputGroupAddon"),c(36,"i",9),t(),e(37,` 9491 `),c(38,"input",10),e(39,` 9492 `),t(),e(40,` 9493 `),t(),e(41,` 9494 `),n(42,"div"),e(43,` 9495 `),n(44,"label",11),e(45,"Textarea"),t(),e(46,` 9496 `),n(47,"textarea",12),M("ngModelChange",function(h){return I(o.textareaValue,h)||(o.textareaValue=h),h}),t(),e(48,` 9497 `),t(),e(49,` 9498 `),t(),e(50,` 9499`),t(),e(51,` 9500`)),s&2&&(i(9),T("ngModel",o.textValue),i(8),T("ngModel",o.numberValue),m("showButtons",!0),i(8),T("ngModel",o.price),i(22),T("ngModel",o.textareaValue))},dependencies:[D,Q,be,U,H,Lt,Rt,tn,Za,dn,at,mn,rt,_n,jr,F],encapsulation:2});let a=r;return a})();var u0=()=>({width:"15rem"}),Jh=(a,r)=>
9500l=>l.name,ki=(()=>{let r=class r{constructor(){this.cities=[{name:"New York",code:"NY"},{name:"Rome",code:"RM"},{name:"London",code:"LDN"},{name:"Istanbul",code:"IST"},{name:"Paris",code:"PRS"}],this.selectedCity=null,this.selectedCities=[]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-listbox-demo"]],decls:30,vars:15,consts:[["title","ListBox","description","Single-select and multi-select listboxes."],[1,"row"],[1,"col-md-6"],[1,"mb-1"],["optionLabel","name",3,"ngModelChange","options","ngModel"],[1,"mt-1","d-block"],["optionLabel","name",3,"ngModelChange","options","ngModel","multiple","checkbox"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9501 `),n(2,"div",1),e(3,` 9502 `),n(4,"div",2),e(5,` 9503 `),n(6,"p",3),e(7,"Single select"),t(),e(8,` 9504 `),n(9,"p-listbox",4),M("ngModelChange",function(h){return I(o.selectedCity,h)||(o.selectedCity=h),h}),e(10,` 9505 `),t(),e(11,` 9506 `),n(12,"small",5),e(13),t(),e(14,` 9507 `),t(),e(15,` 9508 `),n(16,"div",2),e(17,` 9509 `),n(18,"p",3),e(19,"Multiple select"),t(),e(20,` 9510 `),n(21,"p-listbox",6),M("ngModelChange",function(h){return I(o.selectedCities,h)||(o.selectedCities=h),h}),e(22,` 9511 `),t(),e(23,` 9512 `),n(24,"small",5),e(25),t(),e(26,` 9513 `),t(),e(27,` 9514 `),t(),e(28,` 9515`),t(),e(29,` 9516`)),s&2&&(i(9),te(V(13,u0)),m("options",o.cities),T("ngModel",o.selectedCity),i(4),f("Selected: ",(o.selectedCity==null?null:o.selectedCity.name)||"None"),i(8),te(V(14,u0)),m("options",o.cities),T("ngModel",o.selectedCities),m("multiple",!0)("checkbox",!0),i(4),f("Selected: ",o.selectedCities.length?o.selectedCities.map(Tt(12,Jh,o)).join(", "):"None"))},dependencies:[D,Q,U,H,Dn,go,F],encapsulation:2});let a=r;return a})();var eu=()=>({"min-width":"14rem"}),Ti=(()=>{let r=class r{constructor(){this.cities=[{name:"New York",code:"NY"},{name:"Rome",code:"RM"},{name:"London",code:"LDN"},{name:"Istanbul",code:"IST"},{name:"Paris",code:"PRS"}],this.selectedCity=null}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-select-demo"]],decls:12,vars:6,consts:[["title","Select","description","Dropdown select with city options."],[1,"flex","flex-column","gap-2"],["optionLabel","name","placeholder","Select a City",3,"ngModelChange","options","ngModel"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9517 `),n(2,"div",1),e(3,` 9518 `),n(4,"p-select",2),M("ngModelChange",function(h){return I(o.selectedCity,h)||(o.selectedCity=h),h}),e(5,` 9519 `),t(),e(6,` 9520 `),n(7,"small"),e(8),t(),e(9,` 9521 `),t(),e(10,` 9522`),t(),e(11,` 9523`)),s&2&&(i(4),te(V(5,eu)),m("options",o.cities),T("ngModel",o.selectedCity),i(4),f("Selected: ",(o.selectedCity==null?null:o.selectedCity.name)||"None"))},dependencies:[D,Q,U,H,Vt,ye,F],encapsulation:2});let a=r;return a})();function nu(a,r){if(a&1&&(e(0,` 9524 `),c(1,"i"),e(2,` 9525 `)),a&2){let l=r.$implicit;i(),ne(l.icon)}}var Ii=(()=>{let r=class r{constructor(){this.sizes=[{label:"Small",value:"sm"},{label:"Medium",value:"md"},{label:"Large",value:"lg"}],this.selectedSize="md",this.justifyOptions=[{icon:"pi pi-align-left",justify:"Left"},{icon:"pi pi-align-right",justify:"Right"},{icon:"pi pi-align-center",justify:"Center"},{icon:"pi pi-align-justify",justify:"Justify"}],this.selectedJustify=this.justifyOptions[0]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-selectbutton-demo"]],decls:28,vars:5,consts:[["title","SelectButton","description","Single and icon-only SelectButton demos."],[1,"flex","flex-column","gap-4"],[1,"d-block","mb-1"],["optionLabel","label","optionValue","value",3,"ngModelChange","options","ngModel"],["optionLabel","icon",3,"ngModelChange","options","ngModel"],["pTemplate","item"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9526 `),n(2,"div",1),e(3,` 9527 `),n(4,"div"),e(5,` 9528 `),n(6,"label",2),e(7,"Size selector"),t(),e(8,` 9529 `),n(9,"p-selectButton",3),M("ngModelChange",function(h){return I(o.selectedSize,h)||(o.selectedSize=h),h}),t(),e(10,` 9530 `),n(11,"small"),e(12),t(),e(13,` 9531 `),t(),e(14,` 9532 `),n(15,"div"),e(16,` 9533 `),n(17,"label",2),e(18,"Justify (icon only)"),t(),e(19,` 9534 `),n(20,"p-selectButton",4),M("ngModelChange",function(h){return I(o.selectedJustify,h)||(o.selectedJustify=h),h}
9534),e(21,` 9535 `),k(22,nu,3,2,"ng-template",5),e(23,` 9536 `),t(),e(24,` 9537 `),t(),e(25,` 9538 `),t(),e(26,` 9539`),t(),e(27,` 9540`)),s&2&&(i(9),m("options",o.sizes),T("ngModel",o.selectedSize),i(3),f("Selected: ",o.selectedSize),i(8),m("options",o.justifyOptions),T("ngModel",o.selectedJustify))},dependencies:[D,Q,U,H,rn,tr,oe,F],encapsulation:2});let a=r;return a})();var Mi=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-skeleton-demo"]],decls:38,vars:0,consts:[["title","Skeleton","description","Placeholder shapes while content loads."],[1,"row"],[1,"col-md-6"],[1,"mb-1"],["width","100%","height","150px"],["width","80%","styleClass","mb-2",1,"mt-2"],["width","60%"],[1,"flex","gap-2"],["shape","circle","size","4rem"],[1,"flex","flex-column","gap-2","flex-grow-1"],["width","100%","height","1rem"],["width","75%","height","1rem"],["width","50%","height","1rem"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9541 `),n(2,"div",1),e(3,` 9542 `),n(4,"div",2),e(5,` 9543 `),n(6,"p",3),e(7,"Rectangle"),t(),e(8,` 9544 `),c(9,"p-skeleton",4),e(10,` 9545 `),c(11,"p-skeleton",5),e(12,` 9546 `),c(13,"p-skeleton",6),e(14,` 9547 `),t(),e(15,` 9548 `),n(16,"div",2),e(17,` 9549 `),n(18,"p",3),e(19,"Card-like"),t(),e(20,` 9550 `),n(21,"div",7),e(22,` 9551 `),c(23,"p-skeleton",8),e(24,` 9552 `),n(25,"div",9),e(26,` 9553 `),c(27,"p-skeleton",10),e(28,` 9554 `),c(29,"p-skeleton",11),e(30,` 9555 `),c(31,"p-skeleton",12),e(32,` 9556 `),t(),e(33,` 9557 `),t(),e(34,` 9558 `),t(),e(35,` 9559 `),t(),e(36,` 9560`),t(),e(37,` 9561`))},dependencies:[D,ln,rr,F],encapsulation:2});let a=r;return a})();var Di=(()=>{let r=class r{constructor(){this.val1=40,this.rangeVal=[20,80]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-slider-demo"]],decls:22,vars:6,consts:[["title","Slider","description","Basic and range sliders."],[1,"flex","flex-column","gap-4",2,"max-width","400px"],[1,"d-block","mb-1"],[3,"ngModelChange","ngModel"],[3,"ngModelChange","ngModel","range"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9562 `),n(2,"div",1),e(3,` 9563 `),n(4,"div"),e(5,` 9564 `),n(6,"label",2),e(7),t(),e(8,` 9565 `),n(9,"p-slider",3),M("ngModelChange",function(h){return I(o.val1,h)||(o.val1=h),h}),t(),e(10,` 9566 `),t(),e(11,` 9567 `),n(12,"div"),e(13,` 9568 `),n(14,"label",2),e(15),t(),e(16,` 9569 `),n(17,"p-slider",4),M("ngModelChange",function(h){return I(o.rangeVal,h)||(o.rangeVal=h),h}),t(),e(18,` 9570 `),t(),e(19,` 9571 `),t(),e(20,` 9572`),t(),e(21,` 9573`)),s&2&&(i(7),f("Basic (",o.val1,")"),i(2),T("ngModel",o.val1),i(6),q("Range (",o.rangeVal[0]," \u2013 ",o.rangeVal[1],")"),i(2),T("ngModel",o.rangeVal),m("range",!0))},dependencies:[D,Q,U,H,hn,mr,F],encapsulation:2});let a=r;return a})();var Fi=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-slidemenu-demo"]],decls:17,vars:0,consts:[["title","SlideMenu","description","SlideMenu was removed in PrimeNG v21."],[1,"text-warning"],[1,"pi","pi-exclamation-triangle","me-2"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9574 `),n(2,"p",1),e(3,` 9575 `),c(4,"i",2),e(5,` 9576 `),n(6,"strong"),e(7,"SlideMenu"),t(),e(8,` is not available in PrimeNG v21. It was deprecated and removed. 9577 Consider using `),n(9,"strong"),e(10,"TieredMenu"),t(),e(11," or "),n(12,"strong"),e(13,"PanelMenu"),t(),e(14,` as alternatives. 9578 `),t(),e(15,` 9579`),t(),e(16,` 9580`))},dependencies:[D,F],encapsulation:2});let a=r;return a})();var Pi=(()=>{let r=class r{constructor(){this.activeIndex=0,this.items=[{label:"Personal Info"},{label:"Account"},{label:"Review"},{label:"Confirm"}]}};r.\u0275fac=function(s){return new(s||r)},r.\u0275cmp=b({type:r,selectors:[["app-p-steps-demo"]],decls:12,vars:5,consts:[["title","Steps","description","Step-by-step wizard progress indicator."],[3,"activeIndexChange","model","activeIndex","readonly"],[1,"flex","justify-content-between","mt-3"],["pButton","","type","button","label","Back","icon","pi pi-arrow-left",3,"click","disabled"],["pButton","","type","button","label","Next","icon","pi pi-arrow-right","iconPos","right",3,"click","disabled"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9581 `),n(2,"p-steps",1),M("activeIndexChange",function(h){return I(o.activeIndex,h)||(o.activeIndex=h),h}),t(),e(3,` 9582 `),n(4,"div",2),e(5,` 9583 `),n(6,"button",3),g("click",function(){return o.activeIndex=o.activeIndex-1}),t(),e(7,` 9584 `),n(8,"button",4),g("click",function(){return o.activeIndex=o.activeIndex+1}),t(),e(9,` 9585 `),t(),e(10,` 9586`),t(),e(11,` 9587`)),s&2&&(i(2),m("model",o.items),T("activeIndex",o.activeIndex),m("readonly",!1),i(4),m("disabled",o.activeIndex===0),i(2),m("disabled",o.activeIndex===o.items.length-1))},dependencies:[D,Bn,Nn,F],encapsulation:2});let a=r;return a})();var Ai=(()=>
9587{let r=class r{constructor(d){this.messageService=d,this.items=[{label:"Update",icon:"pi pi-refresh",command:()=>this.toast("Update")},{label:"Delete",icon:"pi pi-times",command:()=>this.toast("Delete")},{label:"Angular.io",icon:"pi pi-info",url:"http://angular.io"}]}save(){this.toast("Save")}toast(d){this.messageService.add({severity:"info",summary:d,detail:`${d} action triggered`})}};r.\u0275fac=function(s){return new(s||r)(A(ce))},r.\u0275cmp=b({type:r,selectors:[["app-p-splitbutton-demo"]],features:[Ie([ce])],decls:7,vars:1,consts:[["title","SplitButton","description","A button with a dropdown of secondary actions."],["label","Save","icon","pi pi-save",3,"onClick","model"]],template:function(s,o){s&1&&(n(0,"app-p-demo-wrapper",0),e(1,` 9588 `),c(2,"p-toast"),e(3,` 9589 `),n(4,"p-splitButton",1),g("onClick",function(){return o.save()}),t(),e(5,` 9590`),t(),e(6,` 9591`)),s&2&&(i(4),m("model",o.items))},dependencies:[D,ht,zn,Ae,Ze,F],encapsulation:2});let a=r;return a})();function du(a,r){if(a&1){let l=B();n(0,"li"),e(1,` 9592 `),n(2,"button",13),g("click",function(){let s=w(l).$implicit,o=u();return C(o.selectCategory(s.categoryID))}),e(3),t(),e(4,` 9593 `),t()}if(a&2){let l=r.$implicit,d=u();j("active",d.selectedCategory===l.categoryID),i(2),pe("aria-pressed",d.selectedCategory===l.categoryID),i(),p(l.name)}}function mu(a,r){a&1&&(O(0),e(1,` 9594 `),n(2,"div",14)(3,"h4"),e(4,"Accordion"),t(),c(5,"app-p-accordion-demo"),t(),e(6,` 9595 `),N())}function cu(a,r){a&1&&(O(0),e(1,` 9596 `),n(2,"div",14)(3,"h4"),e(4,"AutoComplete"),t(),c(5,"app-p-autocomplete-demo"),t(),e(6,` 9597 `),N())}function pu(a,r){a&1&&(O(0),e(1,` 9598 `),n(2,"div",14)(3,"h4"),e(4,"Badge"),t(),c(5,"app-p-badge-demo"),t(),e(6,` 9599 `),N())}function xu(a,r){a&1&&(O(0),e(1,` 9600 `),n(2,"div",14)(3,"h4"),e(4,"Button"),t(),c(5,"app-p-button-demo"),t(),e(6,` 9601 `),N())}function hu(a,r){a&1&&(O(0),e(1,` 9602 `),n(2,"div",14)(3,"h4"),e(4,"Card"),t(),c(5,"app-p-card-demo"),t(),e(6,` 9603 `),N())}function uu(a,r){a&1&&(O(0),e(1,` 9604 `),n(2,"div",14)(3,"h4"),e(4,"Carousel"),t(),c(5,"app-p-carousel-demo"),t(),e(6,` 9605 `),N())}function gu(a,r){a&1&&(O(0),e(1,` 9606 `),n(2,"div",14)(3,"h4"),e(4,"Chart"),t(),c(5,"app-p-chart-demo"),t(),e(6,` 9607 `),N())}function fu(a,r){a&1&&(O(0),e(1,` 9608 `),n(2,"div",14)(3,"h4"),e(4,"Checkbox"),t(),c(5,"app-p-checkbox-demo"),t(),e(6,` 9609 `),N())}function bu(a,r){a&1&&(O(0),e(1,` 9610 `),n(2,"div",14)(3,"h4"),e(4,"ColorPicker"),t(),c(5,"app-p-colorpicker-demo"),t(),e(6,` 9611 `),N())}function Su(a,r){a&1&&(O(0),e(1,` 9612 `),n(2,"div",14)(3,"h4"),e(4,"ConfirmDialog"),t(),n(5,"p"),e(6,"Confirm dialog demo lives here."),t()(),e(7,` 9613 `),N())}function Eu(a,r){a&1&&(O(0),e(1,` 9614 `),n(2,"div",14)(3,"h4"),e(4,"DataView"),t(),c(5,"app-p-dataview-demo"),t(),e(6,` 9615 `),N())}function vu(a,r){a&1&&(O(0),e(1,` 9616 `),n(2,"div",14)(3,"h4"),e(4,"DatePicker"),t(),c(5,"app-p-datepicker-demo"),t(),e(6,` 9617 `),N())}function yu(a,r){a&1&&(O(0),e(1,` 9618 `),n(2,"div",14)(3,"h4"),e(4,"Dialog"),t(),c(5,"app-p-dialog-demo"),t(),e(6,` 9619 `),N())}function wu(a,r){a&1&&(O(0),e(1,` 9620 `),n(2,"div",14)(3,"h4"),e(4,"FileUpload"),t(),c(5,"app-p-fileupload-demo"),t(),e(6,` 9621 `),N())}function Cu(a,r){a&1&&(O(0),e(1,` 9622 `),n(2,"div",14)(3,"h4"),e(4,"Inputs"),t(),c(5,"app-p-inputs-demo"),t(),e(6,` 9623 `),N())}function _u(a,r){a&1&&(O(0),e(1,` 9624 `),n(2,"div",14)(3,"h4"),e(4,"Listbox"),t(),c(5,"app-p-listbox-demo"),t(),e(6,` 9625 `),N())}function ku(a,r){a&1&&(O(0),e(1,` 9626 `),n(2,"div",14)(3,"h4"),e(4,"Menu / Menubar / SlideMenu"),t(),e(5,` 9627 `),c(6,"app-p-menu-demo"),e(7,` 9628 `),c(8,"app-p-menubar-demo"),e(9,` 9629 `),c(10,"app-p-slidemenu-demo"),e(11,` 9630 `),t(),e(12,` 9631 `),N())}function Tu(a,r){a&1&&(O(0),e(1,` 9632 `),n(2,"div",14)(3,"h4"),e(4,"Message"),t(),c(5,"app-p-message-demo"),t(),e(6,` 9633 `),N())}function Iu(a,r){a&1&&(O(0),e(1,` 9634 `),n(2,"div",14)(3,"h4"),e(4,"MultiSelect"),t(),c(5,"app-p-multiselect-demo"),t(),e(6,` 9635 `),N())}function Mu(a,r){a&1&&(O(0),e(1,` 9636 `),n(2,"div",14)(3,"h4"),e(4,"Paginator"),t(),c(5,"app-p-paginator-demo"),t(),e(6,` 9637 `),N())}function Du(a,r){a&1&&(O(0),e(1,` 9638 `),n(2,"div",14)(3,"h4"),e(4,"Panel"),t(),c(5,"app-p-panel-demo")(6,"app-p-panelmenu-demo"),t(),e(7,` 9639 `),N())}function Fu(a,r){a&1&&(O(0),e(1,` 9640 `),n(2,"div",14)(3,"h4"),e(4,"Popover"),t(),c(5,"app-p-popover-demo"),t(),e(6,` 9641 `),N())}function Pu(a,r){a&1&&(O(0),e(1,` 9642 `),n(2,"div",14)(3,"h4"),e(4,"ProgressBar / ProgressSpinner"),t(),c(5,"app-p-progress-demo"),t(),e(6,` 9643 `),N())}function Au(a,r){a&1&&(O(0),e(1,` 9644 `),n(2,"div",14)(3,"h4"),e(4,"RadioButton"),t(),c(5,"app-p-radiobutton-demo"),t(),e(6,` 9645 `),N())}function Ou(a,r){a&1&&(O(0),e(1,` 9646 `),n(2,"div",14)(3,"h4"),e(4,"Rating"),t(),c(5,"app-p-rating-demo"),t(),e(6,` 9647 `),N())}function Nu(a,r){a&1&&(O(0),e(1,` 9648 `),n(2,"div",14)(3,"h4"),e(4,"Scroller"),t(),c(5,"app-p-scroller-demo"),t(),e(6,` 9649 `),N())}function Bu(a,r){a&1&&(O(0),e(1,` 9650 `),n(2,"div",14)(3,"h4"),e(4,"Select"),t(),c(5,"app-p-select-demo"),t(),e(6,` 9651 `),N())}function Wu(a,r){a&1&&(O(0),e(1,` 9652 `),n(2,"div",14)(3,"h4"),e(4,"SelectButton"),t(),c(5,"app-p-selectbutton-demo"),t(),e(6,` 9653 `),N())}function Ru(a,r){a&1&&(O(0),e(1,` 9654 `),n(2,"div",14)(3,"h4"),e(4,"Skeleton"),t(),c(5,"app-p-skeleton-demo"),t(),e(6,` 9655 `),N())}function Lu(a,r){a&1&&(O(0),e(1,` 9656 `),n(2,"div",14)(3,"h4"),e(4,"Slider"),t(),c(5,"app-p-slider-demo"),t(),e(6,` 9657 `),N())}function qu(a,r){a&1&&(O(0),e(1,` 9658 `),n(2,"div",14)(3,"h4"),e(4,"SplitButton"),t(),c(5,"app-p-splitbutton-demo"),t(),e(6,` 9659 `),N())}function Vu(a,r){a&1&&(O(0),e(1,` 9660 `),n(2,"div",14)(3,"h4"),e(4,"Steps"),t(),c(5,"app-p-steps-demo"),t(),e(6,` 9661 `),N())}function zu(a,r){a&1&&(O(0),e(1,` 9662 `),n(2,"div",14)(3,"h4"),e(4,"Table"),t(),c(5,"app-p-table-demo"),t(),e(6,` 9663 `),N())}function Uu(a,r){a&1&&(O(0),e(1,` 9664 `),n(2,"div",14)(3,"h4"),e(4,"Toast"),t(),c(5,"app-p-toast-demo"),t(),e(6,` 9665 `),N())}function Hu(a,r){a&1&&(O(0),e(1,` 9666 `),n(2,"div",14)(3,"p"),e(4,"Select a category from the left to view its demo."),t()(),e(5,` 9667 `),N())}var g0=(()=>{let r=class r{selectCategory(d){this.selectedCategory=d}constructor(d){this.siteDataService=d,this.accordionItems=[{header:"Overview",content:"This is the overview content for the accordion demo."},{header:"Details",content:"Detailed information can go here. Use this area to show component props or examples."},{header:"Notes",content:"Additional notes and usage tips."}],this.categories=["accordion","autocomplete","badge","button","card","carousel","chart","checkbox","colorpicker","confirmdialog","dataview","datepicker","dialog","divider","dragdrop","drawer","fileupload","input","listbox","menu","message","multiselect","paginator","panel","popover","progress","radiobutton","rating","scroller","select","selectbutton","skeleton","slider","splitbutton","steps","table","tabs","textarea","tieredmenu","toast","toggleswitch","toolbar","tooltip","tree","treeselect","treetable"].map(s=>({categoryID:s,name:s.charAt(0).toUpperCase()+s.slice(1)})),this.selectedCategory=this.categories.length?this.categories[0].categoryID:""}
9667ngOnInit(){this.siteDataService.hideSiteLoader()}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-p-primeng-demo"]],standalone:!1,decls:108,vars:36,consts:[[1,"section"],[1,"container-fluid"],[1,"row","mt-4"],[1,"col-12"],[1,"text-muted"],[1,"row","mt-3"],[1,"col-auto"],[1,"page-navigation","bg-white","position-sticky-top"],[3,"active",4,"ngFor","ngForOf"],[1,"col-md-9"],[3,"ngSwitch"],[4,"ngSwitchCase"],[4,"ngSwitchDefault"],["type","button",1,"btn-a11y","nav-link",3,"click"],[1,"demo-area","mb-4"]],template:function(s,o){s&1&&(n(0,"section",0),e(1,` 9668 `),n(2,"div",1),e(3,` 9669 `),n(4,"div",2),e(5,` 9670 `),n(6,"div",3),e(7,` 9671 `),n(8,"h2"),e(9,"PrimeNG Demo"),t(),e(10,` 9672 `),n(11,"p",4),e(12,"Placeholder area for PrimeNG component demos. Add components here."),t(),e(13,` 9673 `),t(),e(14,` 9674 `),t(),e(15,` 9675 9676 `),n(16,"div",5),e(17,` 9677 `),n(18,"div",6),e(19,` 9678 `),n(20,"nav",7),e(21,` 9679 `),n(22,"ul"),e(23,` 9680 `),k(24,du,5,4,"li",8),e(25,` 9681 `),t(),e(26,` 9682 `),t(),e(27,` 9683 `),t(),e(28,` 9684 9685 `),n(29,"div",9),e(30,` 9686 `),n(31,"div",10),e(32,` 9687 `),k(33,mu,7,0,"ng-container",11),e(34,` 9688 `),k(35,cu,7,0,"ng-container",11),e(36,` 9689 `),k(37,pu,7,0,"ng-container",11),e(38,` 9690 `),k(39,xu,7,0,"ng-container",11),e(40,` 9691 `),k(41,hu,7,0,"ng-container",11),e(42,` 9692 `),k(43,uu,7,0,"ng-container",11),e(44,` 9693 `),k(45,gu,7,0,"ng-container",11),e(46,` 9694 `),k(47,fu,7,0,"ng-container",11),e(48,` 9695 `),k(49,bu,7,0,"ng-container",11),e(50,` 9696 `),k(51,Su,8,0,"ng-container",11),e(52,` 9697 `),k(53,Eu,7,0,"ng-container",11),e(54,` 9698 `),k(55,vu,7,0,"ng-container",11),e(56,` 9699 `),k(57,yu,7,0,"ng-container",11),e(58,` 9700 `),k(59,wu,7,0,"ng-container",11),e(60,` 9701 `),k(61,Cu,7,0,"ng-container",11),e(62,` 9702 `),k(63,_u,7,0,"ng-container",11),e(64,` 9703 `),k(65,ku,13,0,"ng-container",11),e(66,` 9704 `),k(67,Tu,7,0,"ng-container",11),e(68,` 9705 `),k(69,Iu,7,0,"ng-container",11),e(70,` 9706 `),k(71,Mu,7,0,"ng-container",11),e(72,` 9707 `),k(73,Du,8,0,"ng-container",11),e(74,` 9708 `),k(75,Fu,7,0,"ng-container",11),e(76,` 9709 `),k(77,Pu,7,0,"ng-container",11),e(78,` 9710 `),k(79,Au,7,0,"ng-container",11),e(80,` 9711 `),k(81,Ou,7,0,"ng-container",11),e(82,` 9712 `),k(83,Nu,7,0,"ng-container",11),e(84,` 9713 `),k(85,Bu,7,0,"ng-container",11),e(86,` 9714 `),k(87,Wu,7,0,"ng-container",11),e(88,` 9715 `),k(89,Ru,7,0,"ng-container",11),e(90,` 9716 `),k(91,Lu,7,0,"ng-container",11),e(92,` 9717 `),k(93,qu,7,0,"ng-container",11),e(94,` 9718 `),k(95,Vu,7,0,"ng-container",11),e(96,` 9719 `),k(97,zu,7,0,"ng-container",11),e(98,` 9720 `),k(99,Uu,7,0,"ng-container",11),e(100,` 9721 `),k(101,Hu,6,0,"ng-container",12),e(102,` 9722 `),t(),e(103,` 9723 `),t(),e(104,` 9724 `),t(),e(105,` 9725 `),t(),e(106,` 9726`),t(),e(107,` 9727`)),s&2&&(i(24),m("ngForOf",o.categories),i(7),m("ngSwitch",o.selectedCategory),i(2),m("ngSwitchCase","accordion"),i(2),m("ngSwitchCase","autocomplete"),i(2),m("ngSwitchCase","badge"),i(2),m("ngSwitchCase","button"),i(2),m("ngSwitchCase","card"),i(2),m("ngSwitchCase","carousel"),i(2),m("ngSwitchCase","chart"),i(2),m("ngSwitchCase","checkbox"),i(2),m("ngSwitchCase","colorpicker"),i(2),m("ngSwitchCase","confirmdialog"),i(2),m("ngSwitchCase","dataview"),i(2),m("ngSwitchCase","datepicker"),i(2),m("ngSwitchCase","dialog"),i(2),m("ngSwitchCase","fileupload"),i(2),m("ngSwitchCase","input"),i(2),m("ngSwitchCase","listbox"),i(2),m("ngSwitchCase","menu"),i(2),m("ngSwitchCase","message"),i(2),m("ngSwitchCase","multiselect"),i(2),m("ngSwitchCase","paginator"),i(2),m("ngSwitchCase","panel"),i(2),m("ngSwitchCase","popover"),i(2),m("ngSwitchCase","progress"),i(2),m("ngSwitchCase","radiobutton"),i(2),m("ngSwitchCase","rating"),i(2),m("ngSwitchCase","scroller"),i(2),m("ngSwitchCase","select"),i(2),m("ngSwitchCase","selectbutton"),i(2),m("ngSwitchCase","skeleton"),i(2),m("ngSwitchCase","slider"),i(2),m("ngSwitchCase","splitbutton"),i(2),m("ngSwitchCase","steps"),i(2),m("ngSwitchCase","table"),i(2),m("ngSwitchCase","toast"))},dependencies:[Me,xa,ha,ua,Jn,Zn,ei,ti,ni,ii,ai,ri,oi,li,si,di,mi,ci,pi,xi,hi,ui,gi,fi,bi,Si,Ei,vi,yi,wi,Ci,_i,ki,Ti,Ii,Mi,Di,Fi,Pi,Ai],encapsulation:2});let a=r;return a})();var f0=(()=>
9727{let r=class r{constructor(d){this.siteDataService=d}ngOnInit(){this.siteDataService.hideSiteLoader()}updateColor(d){let s=d.target,o=document.getElementById("CMSButtons");o&&o.style.setProperty("--global-text-color",s.value)}updateBackground(d){let s=d.target,o=document.getElementById("CMSButtons");o&&o.style.setProperty("--global-background-color",s.value)}updateRadii(d){let s=d.target,o=document.getElementById("CMSButtons");o&&o.style.setProperty("--global-radius",s.value)}};r.\u0275fac=function(s){return new(s||r)(A(R))},r.\u0275cmp=b({type:r,selectors:[["app-cms-buttons"]],standalone:!1,decls:54,vars:0,consts:[[1,"p-3",2,"background","#eee"],["id","CMSButtons",1,"full-width"],[1,"btn","btn-lg","btn-primary"],[1,"btn","btn-lg","btn-outline"],[1,"btn","btn-lg","btn-naked"],[1,"full-width","mt-5"],[1,"mt-3"],["type","color","value","#fff",3,"input"],["type","color","value","#4f46e5",3,"input"],["id","radiusSelect",1,"mt-3",3,"change"],["value","0"],["value","0.375rem"],["value","1000px"]],template:function(s,o){s&1&&(n(0,"div",0),e(1,` 9728 `),n(2,"h2"),e(3,"CMS Buttons"),t(),e(4,` 9729 9730 `),n(5,"div",1),e(6,` 9731 `),n(7,"button",2),e(8,"Primary"),t(),e(9,` 9732 `),n(10,"button",3),e(11,"Outline"),t(),e(12,` 9733 `),n(13,"button",4),e(14,"Text"),t(),e(15,` 9734 `),t(),e(16,` 9735 `),n(17,"div",5),e(18,` 9736 `),n(19,"p"),e(20,"Buttons don't actually work like this but it is close. This can be refined to figure out potential issues."),t(),e(21,` 9737 `),t(),e(22,` 9738`),c(23,"hr"),e(24,` 9739 `),n(25,"div",5),e(26,` 9740 `),n(27,"h3"),e(28,"Global settings"),t(),e(29,` 9741 `),n(30,"label",6),e(31,` 9742 `),n(32,"input",7),g("input",function(h){return o.updateColor(h)}),t(),e(33,` 9743 Text Color 9744 `),t(),e(34,` 9745 `),n(35,"label",6),e(36,` 9746 `),n(37,"input",8),g("input",function(h){return o.updateBackgroun
9746d(h)}),t(),e(38,` 9747 Background Color 9748 `),t(),e(39,` 9749 9750 `),n(40,"select",9),g("change",function(h){return o.updateRadii(h)}),e(41,` 9751 `),n(42,"option",10),e(43,"Sharp"),t(),e(44,` 9752 `),n(45,"option",11),e(46,"Rounded"),t(),e(47,` 9753 `),n(48,"option",12),e(49,"Capsule"),t(),e(50,` 9754 `),t(),e(51,` 9755 `),t(),e(52,` 9756`),t(),e(53,` 9757`))},dependencies:[Fe,Pe],styles:[".btn-primary[_ngcontent-%COMP%]{background:var(--global-background-color, #1d6ae5);color:var(--global-text-color, #fff);border-radius:var(--global-radius)}.btn-outline[_ngcontent-%COMP%]{color:var(--global-text-color, #fff);border-radius:var(--global-radius);background:transparent;border-color:var(--global-background-color, #1d6ae5)}.btn-naked[_ngcontent-%COMP%]{color:var(--global-text-color, #fff);border-radius:var(--global-radius)}label[_ngcontent-%COMP%]{width:100%;display:block}"]});let a=r;return a})();var b0=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275mod=Ge({type:r}),r.\u0275inj=je({imports:[Ri.forChild([{path:"",component:Go,children:[{path:"",component:Ho},{path:"global/admin-vs-member",component:$o},{path:"global/fonts",component:Ko},{path:"global/color",component:Jo},{path:"global/contrast",component:al},{path:"global/blues-and-links",component:rl}
9757,{path:"global/primeng-upgrade-debt",component:dl},{path:"global/typography",component:ml},{path:"global/buttons",component:cl},{path:"global/grid",component:pl},{path:"global/forms",component:Tl,children:[{path:"overview",component:Il},{path:"fields",component:Fl},{path:"layout",component:Al},{path:"architectures",component:Wl},{path:"contracts",component:Rl},{path:"defects",component:Ll},{path:"",redirectTo:"overview",pathMatch:"full"}]},{path:"global/tables",component:ql},{path:"global/utilities",component:Ul},{path:"global/font-test",component:jl},{path:"global/background-test",component:Gl},{path:"components/pills",component:Yl},{path:"components/avatars",component:e0},{path:"components/cards",component:i0},{path:"components/system-alerts",component:o0},{path:"components/staging",component:s0},{path:"primeng",component:g0},{path:"cms/buttons",component:f0},{path:"image-test",component:Kl},{path:"",redirectTo:"",pathMatch:"full"}]}]),Ri]});let a=r;return a})();var D6=(()=>{let r=class r{};r.\u0275fac=function(s){return new(s||r)},r.\u0275mod=Ge({type:r}),r.\u0275inj=je({providers:[ce,Qe,Fa()],imports:[D,Q,wo,Wo,Bo,pr,ut,b0,In,xn,Bt,Se,Hn,An,Un,$t,Gt,On,Ln,Xt,Ht,Vo,Ro,Ha,en,dn,mn,lr,tn,Lt,Dn,Wt,zt,Jt,Qt,nn,qn,Ut,Fn,Zt,Vn,an,pn,qt,Vt,rn,ln,hn,ht,Bn,on,So,_n,_o,Ae,or,zo,Na,$a,uo,Uo,F,Jn,Zn,ei,ti,ni,ii,ai,ri,oi,li,si,di,mi,ci,pi,xi,hi,ui,gi,fi,bi,Si,Ei,vi,yi,wi,Ci,_i,ki,Ti,Ii,Mi,Di,Fi,Pi,Ai]});let a=r;return a})();export{D6 as a};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.