@qartisan/playwright-loupe 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +40 -1
- package/README.md +22 -6
- package/dist/config/resolve.js +3 -1
- package/dist/config/types.d.ts +6 -1
- package/dist/config/validate.js +9 -2
- package/dist/core/build.js +21 -0
- package/dist/core/categories.d.ts +4 -5
- package/dist/core/categories.js +75 -34
- package/dist/core/scope.d.ts +10 -0
- package/dist/core/scope.js +34 -4
- package/dist/core/signature.d.ts +3 -2
- package/dist/core/signature.js +46 -5
- package/dist/renderer/index.html +3 -2
- package/dist/shared/color.d.ts +47 -0
- package/dist/shared/color.js +180 -0
- package/dist/shared/palette.d.ts +37 -0
- package/dist/shared/palette.js +91 -0
- package/licenses/DM-Sans-OFL.txt +93 -0
- package/package.json +7 -3
package/dist/renderer/index.html
CHANGED
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<title>Loupe report</title>
|
|
7
|
-
<script type="module">var e={title:`Loupe report`,theme:`system`,screenshots:{defaultView:`side-by-side`}},t=[`passed`,`failed`,`flaky`,`skipped`];function n(e){return JSON.parse(document.getElementById(e)?.textContent??``)}function r(){try{return{...e,...n(`loupe-settings`)}}catch{return e}}function i(e,t={},n=[]){let r=document.createElement(e);return t.className&&(r.className=t.className),t.text!==void 0&&(r.textContent=t.text),r.append(...n),r}function a(e){return e<1e3?`${e} ms`:`${(e/1e3).toFixed(1)} s`}function o(e,n){let{run:r}=e,o=t.map(e=>i(`li`,{className:`count status-${e}`},[i(`span`,{className:`count-value`,text:String(r.stats[e])}),i(`span`,{className:`count-label`,text:e})])),s=[`${r.stats.total} tests`,a(r.durationMs),`${r.scope} run`,`Playwright ${r.playwrightVersion}`,...r.environment.name?[r.environment.name]:[],...r.git.commit?[r.git.commit.slice(0,8)]:[]];return i(`header`,{className:`summary`},[i(`h1`,{text:n}),i(`p`,{className:`meta`},[i(`span`,{className:`badge status-${r.status}`,text:r.status}),document.createTextNode(` ${s.join(` · `)}`)]),i(`ul`,{className:`counts`},o)])}function s(e){let t={title:``,suites:new Map,tests:[]};for(let n of e){let e=t;for(let t of[n.file,...n.suitePath]){let n=e.suites.get(t);n||(n={title:t,suites:new Map,tests:[]},e.suites.set(t,n)),e=n}e.tests.push(n)}return t}function c(e){return i(`li`,{className:`test`},[i(`span`,{className:`badge status-${e.outcome}`,text:e.outcome}),i(`span`,{className:`title`,text:e.title}),i(`span`,{className:`attempts`,text:e.attempts.length>1?`${e.attempts.length} attempts`:``})])}function l(e,t){return i(`li`,{className:`suite depth-${Math.min(t,3)}`},[i(`span`,{className:t===0?`file`:`suite-title`,text:e.title}),i(`ul`,{className:`tests`},[...[...e.suites.values()].map(e=>l(e,t+1)),...e.tests.map(c)])])}function u(e,t){let n=s(t);return i(`section`,{className:`project`},[i(`h2`,{text:`${e||`(no project)`} (${t.length})`}),i(`ul`,{className:`suites`},[...n.suites.values()].map(e=>l(e,0)))])}function d(e){let t=r(),a;try{a=n(`loupe-data`)}catch{e.append(i(`p`,{className:`error`,text:`Loupe: could not read report data.`}));return}if(a.schemaVersion!==1){e.append(i(`p`,{className:`error`,text:`Loupe: unsupported schema version ${String(a.schemaVersion)}.`}));return}document.title=t.title;let s=new Map(a.projects.map(e=>[e.name,[]]));for(let e of a.tests)s.set(e.project,[...s.get(e.project)??[],e]);e.append(o(a,t.title),...[...s].map(([e,t])=>u(e,t)))}d(document.getElementById(`app`)??document.body);</script>
|
|
8
|
-
<style>:root{--bg:#fff;--fg:#1f2328;--muted:#656d76;--border:#d0d7de;--surface:#f6f8fa;--passed:#1a7f37;--failed:#cf222e;--flaky:#9a6700;--skipped:#6e7781;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--bg:#0d1117;--fg:#e6edf3;--muted:#8d96a0;--border:#30363d;--surface:#161b22;--passed:#3fb950;--failed:#f85149;--flaky:#d29922;--skipped:#8d96a0}}*{box-sizing:border-box}body{background:var(--bg);color:var(--fg);margin:0;font:14px/1.5 system-ui,-apple-system,Segoe UI,sans-serif}main{max-width:960px;margin:0 auto;padding:24px 16px}h1{margin:0 0 4px;font-size:22px}h2{margin:0 0 8px;font-size:16px}.meta{color:var(--muted);margin:0 0 16px}.counts{flex-wrap:wrap;gap:8px;margin:0 0 24px;padding:0;list-style:none;display:flex}.count{border:1px solid var(--border);background:var(--surface);border-radius:6px;flex-direction:column;min-width:96px;padding:8px 12px;display:flex}.count-value{font-size:20px;font-weight:600}.count-label{color:var(--muted);text-transform:capitalize}.project{margin-bottom:24px}.suites{border:1px solid var(--border);border-radius:6px;margin:0;padding:0;list-style:none}.suites>.suite{border-top:1px solid var(--border);padding:6px 12px}.suites>.suite:first-child{border-top:0}.tests{margin:0;padding:0 0 0 16px;list-style:none}.suite .file{color:var(--muted);overflow-wrap:anywhere;font-size:12px}.suite .suite-title{font-weight:600}.test{grid-template-columns:72px 1fr auto;align-items:baseline;gap:4px 12px;padding:2px 0;display:grid}.test .attempts{color:var(--muted);font-size:12px}.badge{text-transform:uppercase;font-size:12px;font-weight:600}.status-passed{color:var(--passed)}.status-failed,.status-timedout,.status-interrupted{color:var(--failed)}.status-flaky{color:var(--flaky)}.status-skipped{color:var(--skipped)}.error{color:var(--failed)}
|
|
7
|
+
<script type="module">var e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h={},g=[],_=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,v=Array.isArray;function y(e,t){for(var n in t)e[n]=t[n];return e}function ee(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function b(t,n,r){var i,a,o,s={};for(o in n)o==`key`?i=n[o]:o==`ref`?a=n[o]:s[o]=n[o];if(arguments.length>2&&(s.children=arguments.length>3?e.call(arguments,2):r),typeof t==`function`&&t.defaultProps!=null)for(o in t.defaultProps)s[o]===void 0&&(s[o]=t.defaultProps[o]);return x(t,s,i,a,null)}function x(e,r,i,a,o){var s={type:e,props:r,key:i,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++n,__i:-1,__u:0};return o==null&&t.vnode!=null&&t.vnode(s),s}function S(e){return e.children}function te(e,t){this.props=e,this.context=t}function C(e,t){if(t==null)return e.__?C(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type==`function`?C(e):null}function w(e){if(e.__P&&e.__d){var n=e.__v,r=n.__e,i=[],a=[],o=y({},n);o.__v=n.__v+1,t.vnode&&t.vnode(o),se(e.__P,o,n,e.__n,e.__P.namespaceURI,32&n.__u?[r]:null,i,r??C(n),!!(32&n.__u),a),o.__v=n.__v,o.__.__k[o.__i]=o,le(i,o,a),n.__e=n.__=null,o.__e!=r&&T(o)}}function T(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),T(e)}function E(e){(!e.__d&&(e.__d=!0)&&i.push(e)&&!D.__r++||a!=t.debounceRendering)&&((a=t.debounceRendering)||o)(D)}function D(){try{for(var e,t=1;i.length;)i.length>t&&i.sort(s),e=i.shift(),t=i.length,w(e)}finally{i.length=D.__r=0}}function ne(e,t,n,r,i,a,o,s,c,l,u){var d,f,p,m,_,v,y=r&&r.__k||g,ee=t.length;for(c=O(n,t,y,c,ee),d=0;d<ee;d++)(p=n.__k[d])!=null&&(f=p.__i!=-1&&y[p.__i]||h,p.__i=d,v=se(e,p,f,i,a,o,s,c,l,u),m=p.__e,p.ref&&f.ref!=p.ref&&(f.ref&&fe(f.ref,null,p),u.push(p.ref,p.__c||m,p)),_==null&&m!=null&&(_=m),4&p.__u?(c=re(p,c,e),f.__e&&(f.__e=null)):typeof p.type==`function`&&v!==void 0?c=v:m&&(c=m.nextSibling),p.__u&=-7);return n.__e=_,c}function O(e,t,n,r,i){var a,o,s,c,l,u=n.length,d=u,f=0;for(e.__k=Array(i),a=0;a<i;a++)(o=t[a])!=null&&typeof o!=`boolean`&&typeof o!=`function`?(typeof o==`string`||typeof o==`number`||typeof o==`bigint`||o.constructor==String?o=e.__k[a]=x(null,o,null,null,null):v(o)?o=e.__k[a]=x(S,{children:o},null,null,null):o.constructor===void 0&&o.__b>0?o=e.__k[a]=x(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):e.__k[a]=o,c=a+f,o.__=e,o.__b=e.__b+1,s=null,(l=o.__i=ie(o,n,c,d))!=-1&&(d--,(s=n[l])&&(s.__u|=2)),s==null||s.__v==null?(l==-1&&(i>u?f--:i<u&&f++),typeof o.type!=`function`&&(o.__u|=4)):l!=c&&(l==c-1?f--:l==c+1?f++:(l>c?f--:f++,o.__u|=4))):e.__k[a]=null;if(d)for(a=0;a<u;a++)(s=n[a])!=null&&!(2&s.__u)&&(s.__e==r&&(r=C(s)),pe(s,s));return r}function re(e,t,n){var r,i;if(typeof e.type==`function`){for(r=e.__k,i=0;r&&i<r.length;i++)r[i]&&(r[i].__=e,t=re(r[i],t,n));return t}e.__e!=t&&(t&&e.type&&!t.parentNode&&(t=C(e)),t=n.insertBefore(e.__e,t||null));do t&&=t.nextSibling;while(t!=null&&t.nodeType==8);return t}function ie(e,t,n,r){var i,a,o,s=e.key,c=e.type,l=t[n],u=l!=null&&!(2&l.__u);if(l===null&&s==null||u&&s==l.key&&c==l.type)return n;if(r>+!!u){for(i=n-1,a=n+1;i>=0||a<t.length;)if((l=t[o=i>=0?i--:a++])!=null&&!(2&l.__u)&&s==l.key&&c==l.type)return o}return-1}function ae(e,t,n){t[0]==`-`?e.setProperty(t,n??``):e[t]=n==null?``:typeof n!=`number`||_.test(t)?n:n+`px`}function k(e,t,n,r,i){var a,o;n:if(t==`style`){if(typeof n==`string`)e.style.cssText=n;else{if(typeof r==`string`&&(e.style.cssText=r=``),r)for(t in r)n&&t in n||ae(e.style,t,``);if(n)for(t in n)r&&n[t]==r[t]||ae(e.style,t,n[t])}}else if(t[0]==`o`&&t[1]==`n`)a=t!=(t=t.replace(d,`$1`)),o=t.toLowerCase(),t=o in e||t==`onFocusOut`||t==`onFocusIn`?o.slice(2):t.slice(2),e.l||={},e.l[t+a]=n,n?r?n[u]=r[u]:(n[u]=f,e.addEventListener(t,a?m:p,a)):e.removeEventListener(t,a?m:p,a);else{if(i==`http://www.w3.org/2000/svg`)t=t.replace(/xlink(H|:h)/,`h`).replace(/sName$/,`s`);else if(t!=`width`&&t!=`height`&&t!=`href`&&t!=`list`&&t!=`form`&&t!=`tabIndex`&&t!=`download`&&t!=`rowSpan`&&t!=`colSpan`&&t!=`role`&&t!=`popover`&&t in e)try{e[t]=n??``;break n}catch{}typeof n==`function`||(n==null||!1===n&&t[4]!=`-`?e.removeAttribute(t):e.setAttribute(t,t==`popover`&&n==1?``:n))}}function oe(e){return function(n){if(this.l){var r=this.l[n.type+e];if(n[l]==null)n[l]=f++;else if(n[l]<r[u])return;return r(t.event?t.event(n):n)}}}function se(e,n,r,i,a,o,s,c,l,u){var d,f,p,m,h,_,b,x,w,T,E,D,O,re,ie,ae,k=n.type;if(n.constructor!==void 0)return null;128&r.__u&&(l=!!(32&r.__u),o=[c=n.__e=r.__e]),(d=t.__b)&&d(n);n:if(typeof k==`function`){f=s.length;try{if(w=n.props,T=k.prototype&&k.prototype.render,E=(d=k.contextType)&&i[d.__c],D=d?E?E.props.value:d.__:i,r.__c?x=(p=n.__c=r.__c).__=p.__E:(T?n.__c=p=new k(w,D):(n.__c=p=new te(w,D),p.constructor=k,p.render=me),E&&E.sub(p),p.state||(p.state={}),p.__n=i,m=p.__d=!0,p.__h=[],p._sb=[]),T&&p.__s==null&&(p.__s=p.state),T&&k.getDerivedStateFromProps!=null&&(p.__s==p.state&&(p.__s=y({},p.__s)),y(p.__s,k.getDerivedStateFromProps(w,p.__s))),h=p.props,_=p.state,p.__v=n,m)T&&k.getDerivedStateFromProps==null&&p.componentWillMount!=null&&p.componentWillMount(),T&&p.componentDidMount!=null&&p.__h.push(p.componentDidMount);else{if(T&&k.getDerivedStateFromProps==null&&w!==h&&p.componentWillReceiveProps!=null&&p.componentWillReceiveProps(w,D),n.__v==r.__v||!p.__e&&p.shouldComponentUpdate!=null&&!1===p.shouldComponentUpdate(w,p.__s,D)){n.__v!=r.__v&&(p.props=w,p.state=p.__s,p.__d=!1),n.__e=r.__e,n.__k=r.__k,n.__k.some(function(e){e&&(e.__=n)}),g.push.apply(p.__h,p._sb),p._sb=[],p.__h.length&&s.push(p),c=C(r);break n}p.componentWillUpdate!=null&&p.componentWillUpdate(w,p.__s,D),T&&p.componentDidUpdate!=null&&p.__h.push(function(){p.componentDidUpdate(h,_,b)})}if(p.context=D,p.props=w,p.__P=e,p.__e=!1,O=t.__r,re=0,T)p.state=p.__s,p.__d=!1,O&&O(n),d=p.render(p.props,p.state,p.context),g.push.apply(p.__h,p._sb),p._sb=[];else do p.__d=!1,O&&O(n),d=p.render(p.props,p.state,p.context),p.state=p.__s;while(p.__d&&++re<25);p.state=p.__s,p.getChildContext!=null&&(i=y(y({},i),p.getChildContext())),T&&!m&&p.getSnapshotBeforeUpdate!=null&&(b=p.getSnapshotBeforeUpdate(h,_)),ie=d!=null&&d.type===S&&d.key==null?ue(d.props.children):d,c=ne(e,v(ie)?ie:[ie],n,r,i,a,o,s,c,l,u),p.base=n.__e,n.__u&=-161,p.__h.length&&s.push(p),x&&(p.__E=p.__=null)}catch(e){if(s.length=f,n.__v=null,l||o!=null){if(e.then){for(n.__u|=l?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;o!=null&&(o[o.indexOf(c)]=null),n.__e=c}else if(o!=null)for(ae=o.length;ae--;)ee(o[ae])}else n.__e=r.__e;n.__k??=r.__k||[],e.then||ce(n),t.__e(e,n,r)}}else o==null&&n.__v==r.__v?(n.__k=r.__k,n.__e=r.__e):c=n.__e=de(r.__e,n,r,i,a,o,s,l,u);return(d=t.diffed)&&d(n),128&n.__u?void 0:c}function ce(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(ce))}function le(e,n,r){for(var i=0;i<r.length;i++)fe(r[i],r[++i],r[++i]);t.__c&&t.__c(n,e),e.some(function(n){try{e=n.__h,n.__h=[],e.some(function(e){e.call(n)})}catch(e){t.__e(e,n.__v)}})}function ue(e){return typeof e!=`object`||!e||e.__b>0?e:v(e)?e.map(ue):e.constructor===void 0?y({},e):null}function de(n,r,i,a,o,s,c,l,u){var d,f,p,m,g,_,y,b=i.props||h,x=r.props,S=r.type;if(S==`svg`?o=`http://www.w3.org/2000/svg`:S==`math`?o=`http://www.w3.org/1998/Math/MathML`:o||=`http://www.w3.org/1999/xhtml`,s!=null){for(d=0;d<s.length;d++)if((g=s[d])&&`setAttribute`in g==!!S&&(S?g.localName==S:g.nodeType==3)){n=g,s[d]=null;break}}if(n==null){if(S==null)return document.createTextNode(x);n=document.createElementNS(o,S,x.is&&x),l&&=(t.__m&&t.__m(r,s),!1),s=null}if(S==null)b===x||l&&n.data==x||(n.data=x);else{if(s=S==`textarea`&&x.defaultValue!=null?null:s&&e.call(n.childNodes),!l&&s!=null)for(b={},d=0;d<n.attributes.length;d++)b[(g=n.attributes[d]).name]=g.value;for(d in b)g=b[d],d==`dangerouslySetInnerHTML`?p=g:d==`children`||d in x||d==`value`&&`defaultValue`in x||d==`checked`&&`defaultChecked`in x||k(n,d,null,g,o);for(d in x)g=x[d],d==`children`?m=g:d==`dangerouslySetInnerHTML`?f=g:d==`value`?_=g:d==`checked`?y=g:l&&typeof g!=`function`||b[d]===g||k(n,d,g,b[d],o);if(f)l||p&&(f.__html==p.__html||f.__html==n.innerHTML)||(n.innerHTML=f.__html),r.__k=[];else if(p&&(n.innerHTML=``),ne(r.type==`template`?n.content:n,v(m)?m:[m],r,i,a,S==`foreignObject`?`http://www.w3.org/1999/xhtml`:o,s,c,s?s[0]:i.__k&&C(i,0),l,u),s!=null)for(d=s.length;d--;)ee(s[d]);l&&S!=`textarea`||(d=`value`,S==`progress`&&_==null?n.removeAttribute(`value`):_!=null&&(_!==n[d]||S==`progress`&&!_||S==`option`&&_!=b[d])&&k(n,d,_,b[d],o),d=`checked`,y!=null&&y!=n[d]&&k(n,d,y,b[d],o))}return n}function fe(e,n,r){try{if(typeof e==`function`){var i=typeof e.__u==`function`;i&&e.__u(),i&&n==null||(e.__u=e(n))}else e.current=n}catch(e){t.__e(e,r)}}function pe(e,n,r){var i,a;if(t.unmount&&t.unmount(e),(i=e.ref)&&(i.current&&i.current!=e.__e||fe(i,null,n)),(i=e.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(e){t.__e(e,n)}i.base=i.__P=i.__n=null}if(i=e.__k)for(a=0;a<i.length;a++)i[a]&&pe(i[a],n,r||typeof e.type!=`function`);r||ee(e.__e),e.__c=e.__=e.__e=void 0}function me(e,t,n){return this.constructor(e,n)}function he(n,r,i){var a,o,s,c;r==document&&(r=document.documentElement),t.__&&t.__(n,r),o=(a=typeof i==`function`)?null:i&&i.__k||r.__k,s=[],c=[],se(r,n=(!a&&i||r).__k=b(S,null,[n]),o||h,h,r.namespaceURI,!a&&i?[i]:o?null:r.firstChild?e.call(r.childNodes):null,s,!a&&i?i:o?o.__e:r.firstChild,a,c),le(s,n,c),n.props.children=null}e=g.slice,t={__e:function(e,t,n,r){for(var i,a,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((a=i.constructor)&&a.getDerivedStateFromError!=null&&(i.setState(a.getDerivedStateFromError(e)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(e,r||{}),o=i.__d),o)return i.__E=i}catch(t){e=t}throw e}},n=0,r=function(e){return e!=null&&e.constructor===void 0},te.prototype.setState=function(e,t){var n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=y({},this.state);typeof e==`function`&&(e=e(y({},n),this.props)),e&&y(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),E(this))},te.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),E(this))},te.prototype.render=S,i=[],o=typeof Promise==`function`?Promise.prototype.then.bind(Promise.resolve()):setTimeout,s=function(e,t){return e.__v.__b-t.__v.__b},D.__r=0,c=Math.random().toString(8),l=`__d`+c,u=`__a`+c,d=/(PointerCapture)$|Capture$/i,f=0,p=oe(!1),m=oe(!0);var A,j,ge,_e,ve=0,ye=[],M=t,be=M.__b,xe=M.__r,Se=M.diffed,Ce=M.__c,we=M.unmount,Te=M.__;function Ee(e,t){M.__h&&M.__h(j,e,ve||t),ve=0;var n=j.__H||(j.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function De(e){return ve=1,Oe(Le,e)}function Oe(e,t,n){var r=Ee(A++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):Le(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);t!==n&&(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=j,!j.__f)){var i=function(e,t,n){if(!r.__c.__H)return!0;var i=!1,o=r.__c.props!==e;if(r.__c.__H.__.some(function(e){if(e.__N){i=!0;var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(o=!0)}}),a){var s=a.call(this,e,t,n);return i?s||o:s}return!i||o};j.__f=!0;var a=j.shouldComponentUpdate,o=j.componentWillUpdate;j.componentWillUpdate=function(e,t,n){if(this.__e){var r=a;a=void 0,i(e,t,n),a=r}o&&o.call(this,e,t,n)},j.shouldComponentUpdate=i}return r.__N||r.__}function ke(e,t){var n=Ee(A++,3);!M.__s&&Ie(n.__H,t)&&(n.__=e,n.u=t,j.__H.__h.push(n))}function Ae(e,t){var n=Ee(A++,4);!M.__s&&Ie(n.__H,t)&&(n.__=e,n.u=t,j.__h.push(n))}function N(e){return ve=5,P(function(){return{current:e}},[])}function P(e,t){var n=Ee(A++,7);return Ie(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function je(){for(var e;e=ye.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(Pe),t.__h.some(Fe),t.__h=[]}catch(n){t.__h=[],M.__e(n,e.__v)}}}M.__b=function(e){j=null,be&&be(e)},M.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),Te&&Te(e,t)},M.__r=function(e){xe&&xe(e),A=0;var t=(j=e.__c).__H;t&&(ge===j?(t.__h=[],j.__h=[],t.__.some(function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0})):(t.__h.some(Pe),t.__h.some(Fe),t.__h=[],A=0)),ge=j},M.diffed=function(e){Se&&Se(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(ye.push(t)!==1&&_e===M.requestAnimationFrame||((_e=M.requestAnimationFrame)||Ne)(je)),t.__H.__.some(function(e){e.u&&=(e.__H=e.u,void 0)})),ge=j=null},M.__c=function(e,t){t.some(function(e){try{e.__h.some(Pe),e.__h=e.__h.filter(function(e){return!e.__||Fe(e)})}catch(n){t.some(function(e){e.__h&&=[]}),t=[],M.__e(n,e.__v)}}),Ce&&Ce(e,t)},M.unmount=function(e){we&&we(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(e){try{Pe(e)}catch(e){t=e}}),n.__H=void 0,t&&M.__e(t,n.__v))};var Me=typeof requestAnimationFrame==`function`;function Ne(e){var t,n=function(){clearTimeout(r),Me&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);Me&&(t=requestAnimationFrame(n))}function Pe(e){var t=j,n=e.__c;typeof n==`function`&&(e.__c=void 0,n()),j=t}function Fe(e){var t=j;e.__c=e.__(),j=t}function Ie(e,t){return!e||e.length!==t.length||t.some(function(t,n){return t!==e[n]})}function Le(e,t){return typeof t==`function`?t(e):t}var Re=Symbol.for(`preact-signals`);function ze(){if(I>1)I--;else{var e,t=!1;for((function(){var e=qe;for(qe=void 0;e!==void 0;){var t=e.S;if(t.v===e.v)for(var n=t.t;n!==void 0;n=n.x)n.i===e.i&&(n.i=t.i);e=e.o}})();Ue!==void 0;){var n=Ue;for(Ue=void 0,We++;n!==void 0;){var r=n.u;if(n.u=void 0,n.f&=-3,!(8&n.f)&&Xe(n))try{n.c()}catch(n){t||=(e=n,!0)}n=r}}if(We=0,I--,t)throw e}}function Be(e){if(I>0)return e();Ke=++Ge,I++;try{return e()}finally{ze()}}var Ve,F=void 0;function He(e){var t=F,n=Ve;F=void 0,Ve=void 0;try{return e()}finally{F=t,Ve=n}}var Ue=void 0,I=0,We=0,Ge=0,Ke=0,qe=void 0,Je=0;function Ye(e){if(F!==void 0){var t=e.n;if(t===void 0||t.t!==F)return t={i:0,S:e,p:F.s,n:void 0,t:F,e:void 0,x:void 0,r:t},F.s!==void 0&&(F.s.n=t),F.s=t,e.n=t,32&F.f&&e.S(t),t;if(t.i===-1)return t.i=0,t.n!==void 0&&(t.n.p=t.p,t.p!==void 0&&(t.p.n=t.n),t.p=F.s,t.n=void 0,F.s.n=t,F.s=t),t}}function L(e,t){this.v=e,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=t?.watched,this.Z=t?.unwatched,this.name=t?.name}L.prototype.brand=Re,L.prototype.h=function(){return!0},L.prototype.S=function(e){var t=this,n=this.t;n!==e&&e.e===void 0&&(e.x=n,this.t=e,n===void 0?He(function(){var e;(e=t.W)==null||e.call(t)}):n.e=e)},L.prototype.U=function(e){var t=this;if(this.t!==void 0){var n=e.e,r=e.x;n!==void 0&&(n.x=r,e.e=void 0),r!==void 0&&(r.e=n,e.x=void 0),e===this.t&&(this.t=r,r===void 0&&He(function(){var e;(e=t.Z)==null||e.call(t)}))}},L.prototype.subscribe=function(e){var t=this;return V(function(){var n=t.value;He(function(){return e(n)})},{name:`sub`})},L.prototype.valueOf=function(){return this.value},L.prototype.toString=function(){return this.value+``},L.prototype.toJSON=function(){return this.value},L.prototype.peek=function(){var e=this;return He(function(){return e.value})},Object.defineProperty(L.prototype,"value",{get:function(){var e=Ye(this);return e!==void 0&&(e.i=this.i),this.v},set:function(e){if(e!==this.v){if(We>100)throw Error(`Cycle detected`);(function(e){I!==0&&We===0&&e.l!==Ke&&(e.l=Ke,qe={S:e,v:e.v,i:e.i,o:qe})})(this),this.v=e,this.i++,Je++,I++;try{for(var t=this.t;t!==void 0;t=t.x)t.t.N()}finally{ze()}}}});function R(e,t){return new L(e,t)}function Xe(e){for(var t=e.s;t!==void 0;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return!0;return!1}function Ze(e){for(var t=e.s;t!==void 0;t=t.n){var n=t.S.n;if(n!==void 0&&(t.r=n),t.S.n=t,t.i=-1,t.n===void 0){e.s=t;break}}}function Qe(e){for(var t=e.s,n=void 0;t!==void 0;){var r=t.p;t.i===-1?(t.S.U(t),r!==void 0&&(r.n=t.n),t.n!==void 0&&(t.n.p=r)):n=t,t.S.n=t.r,t.r!==void 0&&(t.r=void 0),t=r}e.s=n}function z(e,t){L.call(this,void 0,t),this.x=e,this.s=void 0,this.g=Je-1,this.f=4}z.prototype=new L,z.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if((36&this.f)==32||(this.f&=-5,this.g===Je))return!0;if(this.g=Je,this.f|=1,this.i>0&&!Xe(this))return this.f&=-2,!0;var e=F;try{Ze(this),F=this;var t=this.x();(16&this.f||this.v!==t||this.i===0)&&(this.v=t,this.f&=-17,this.i++)}catch(e){this.v=e,this.f|=16,this.i++}return F=e,Qe(this),this.f&=-2,!0},z.prototype.S=function(e){if(this.t===void 0){this.f|=36;for(var t=this.s;t!==void 0;t=t.n)t.S.S(t)}L.prototype.S.call(this,e)},z.prototype.U=function(e){if(this.t!==void 0&&(L.prototype.U.call(this,e),this.t===void 0)){this.f&=-33;for(var t=this.s;t!==void 0;t=t.n)t.S.U(t)}},z.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var e=this.t;e!==void 0;e=e.x)e.t.N()}},Object.defineProperty(z.prototype,"value",{get:function(){if(1&this.f)throw Error(`Cycle detected`);var e=Ye(this);if(this.h(),e!==void 0&&(e.i=this.i),16&this.f)throw this.v;return this.v}});function $e(e,t){return new z(e,t)}function et(e){var t=e.m;if(e.m=void 0,typeof t==`function`){I++;var n=F;F=void 0;try{t()}catch(t){throw e.f&=-2,e.f|=8,tt(e),t}finally{F=n,ze()}}}function tt(e){for(var t=e.s;t!==void 0;t=t.n)t.S.U(t);e.x=void 0,e.s=void 0,et(e)}function nt(e){if(F!==this)throw Error(`Out-of-order effect`);Qe(this),F=e,this.f&=-2,8&this.f&&tt(this),ze()}function B(e,t){this.x=e,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=t?.name,Ve&&Ve.push(this)}B.prototype.c=function(){var e=this.S();try{if(8&this.f||this.x===void 0)return;var t=this.x();typeof t==`function`&&(this.m=t)}finally{e()}},B.prototype.S=function(){if(1&this.f)throw Error(`Cycle detected`);this.f|=1,this.f&=-9,et(this),Ze(this),I++;var e=F;return F=this,nt.bind(this,e)},B.prototype.N=function(){2&this.f||(this.f|=2,this.u=Ue,Ue=this)},B.prototype.d=function(){this.f|=8,1&this.f||tt(this)},B.prototype.dispose=function(){this.d()};function V(e,t){var n=new B(e,t);try{n.c()}catch(e){throw n.d(),e}var r=n.d.bind(n);return r[Symbol.dispose]=r,r}var rt,it,at=typeof window<`u`&&!!window.__PREACT_SIGNALS_DEVTOOLS__,ot=[];V(function(){rt=this.N})();function H(e,n){t[e]=n.bind(null,t[e]||function(){})}function st(e){if(it){var t=it;it=void 0,t()}it=e&&e.S()}function ct(e){var t=this,n=e.data,i=ut(n);i.name=`ReactiveDom`,i.value=n;var a=P(function(){for(var e=t,n=t.__v;n=n.__;)if(n.__c){n.__c.__$f|=4;break}var a=$e(function(){var e=i.value.value;return e===0?0:!0===e?``:e||``}),o=$e(function(){return!Array.isArray(a.value)&&!r(a.value)}),s=V(function(){if(this.N=pt,o.value){var t=a.value;e.__v&&e.__v.__e&&e.__v.__e.nodeType===3&&(e.__v.__e.data=t)}}),c=t.__$u.d;return t.__$u.d=function(){s(),c.call(this)},[o,a]},[]),o=a[0],s=a[1];return o.value?s.peek():s.value}ct.displayName=`ReactiveTextNode`,Object.defineProperties(L.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:ct},props:{configurable:!0,get:function(){var e=this;return{data:{get value(){return e.value}}}}},__b:{configurable:!0,value:1}}),H(`__b`,function(e,t){if(st(),typeof t.type==`string`){var n,r=t.props;for(var i in r)if(i!==`children`){var a=r[i];a instanceof L&&(n||(t.__np=n={}),n[i]=a,r[i]=a.peek())}}e(t)}),H(`__r`,function(e,t){if(e(t),t.type!==S){st();var n,r=t.__c;r&&(r.__$f&=-2,(n=r.__$u)===void 0&&(r.__$u=n=function(e,t){var n;return V(function(){n=this},{name:t}),n.c=e,n}(function(e){return function(){var t;at&&((t=this.y)==null||t.call(this)),e.__$f|=1,e.setState({})}}(r),typeof t.type==`function`?t.type.displayName||t.type.name:``))),st(n)}}),H(`__e`,function(e,t,n,r){st(),e(t,n,r)}),H(`diffed`,function(e,t){st();var n;if(typeof t.type==`string`&&(n=t.__e)){var r=t.__np,i=t.props,a=n.U;if(a)for(var o in a){var s=a[o];s===void 0||r&&o in r||(s.d(),a[o]=void 0)}if(r)for(var c in a||(a={},n.U=a),r){var l=a[c],u=r[c];l===void 0?(l=lt(n,c,u,i),a[c]=l):l.o(u,i)}}e(t)});function lt(e,t,n,r){var i=t in e&&e.ownerSVGElement===void 0,a=R(n);return{o:function(e,t){a.value=e,r=t},d:V(function(){this.N=pt;var n=a.value.value;r[t]!==n&&(r[t]=n,i?e[t]=n:n!=null&&(!1!==n||t[4]===`-`)?e.setAttribute(t,n):e.removeAttribute(t))})}}H(`unmount`,function(e,t){if(typeof t.type==`string`){var n=t.__e;if(n){var r=n.U;if(r)for(var i in n.U=void 0,r){var a=r[i];a&&a.d()}}var o=t.__np;if(o){var s=t.props;for(var c in o)s[c]=o[c]}t.__np=void 0}else{var l=t.__c;if(l){l.__$f|=8;var u=l.__$u;u&&(l.__$u=void 0,u.d())}}e(t)}),H(`__h`,function(e,t,n,r){r<3&&(t.__$f|=2),e(t,n,r)}),te.prototype.shouldComponentUpdate=function(e,t){if(this.__R)return!0;var n=this.__$u,r=n&&n.s!==void 0;for(var i in t)return!0;if(this.__f||typeof this.u==`boolean`&&!0===this.u){var a=2&this.__$f;if(!(r||a||4&this.__$f)||1&this.__$f)return!0}else if(!(r||4&this.__$f)||3&this.__$f)return!0;for(var o in e)if(o!==`__source`&&e[o]!==this.props[o])return!0;for(var s in this.props)if(!(s in e))return!0;return!1};function ut(e,t){return P(function(){return R(e,t)},[])}var dt=function(e){queueMicrotask(function(){queueMicrotask(e)})};function ft(){Be(function(){for(var e;e=ot.shift();)rt.call(e)})}function pt(){ot.push(this)===1&&(t.requestAnimationFrame||dt)(ft)}function mt(e){try{return window.localStorage.getItem(e)}catch{return null}}function ht(e,t){try{window.localStorage.setItem(e,t)}catch{}}var gt=`loupe.sidebar`,_t=`(max-width: 760px)`;function vt(){return window.matchMedia(_t).matches}var U=R(!vt()&&mt(gt)!==`closed`);function yt(){U.value=!U.value,vt()||ht(gt,U.value?`open`:`closed`)}var bt=R(null);function xt(e){U.value=!0,bt.value={key:e,seq:(bt.value?.seq??0)+1}}var St=/^(0|[1-9]\d*)$/,Ct={"run-errors":{page:`errors`}};function wt(e){try{return decodeURIComponent(e)}catch{return null}}function Tt(e){return wt(e)??e}function Et(e){let t={};for(let[n,r]of new URLSearchParams(e))n!==``&&(t[n]=r);return t}function Dt(e){let t=e.split(`/`).filter(e=>e!==``).map(wt);if(t.some(e=>e===null))return{page:`not-found`,path:e};let[n,r,i,a]=t;if(t.length===0)return{page:`dashboard`};if(t.length===1&&(n===`errors`||n===`health`))return{page:n};if(n===`errors`&&r===`category`&&t.length===3&&i!==void 0)return{page:`errors`,category:i};if(t.length===1&&n!==void 0&&Object.hasOwn(Ct,n))return Ct[n];if(n===`group`&&r!==void 0&&t.length===2)return{page:`group`,signature:r};if(n===`test`&&r!==void 0){if(t.length===2)return{page:`test`,id:r,repeatEachIndex:0};if(t.length===4&&i===`repeat`&&a!==void 0&&St.test(a))return{page:`test`,id:r,repeatEachIndex:Number(a)}}return{page:`not-found`,path:e}}function Ot(e){let t=e.startsWith(`#`)?e.slice(1):e,n=t.indexOf(`?`),r=n===-1?t:t.slice(0,n),i=n===-1?``:t.slice(n+1);return{route:Dt(r),query:Et(i)}}function kt(e){switch(e.page){case`dashboard`:return`/`;case`errors`:return e.category===void 0?`/errors`:`/errors/category/${encodeURIComponent(e.category)}`;case`health`:return`/health`;case`test`:{let t=`/test/${encodeURIComponent(e.id)}`;return e.repeatEachIndex===0?t:`${t}/repeat/${e.repeatEachIndex}`}case`group`:return`/group/${encodeURIComponent(e.signature)}`;case`not-found`:return e.path.startsWith(`/`)?e.path:`/${e.path}`}}function At(e){let t=Object.entries(e.query).sort(([e],[t])=>e<t?-1:+(e>t)),n=new URLSearchParams(t).toString();return`#${kt(e.route)}${n?`?${n}`:``}`}function jt(e){let t=((e.startsWith(`#`)?e.slice(1):e).split(`?`)[0]??``).split(`/`).filter(e=>e!==``);return t.length!==1||!Object.hasOwn(Ct,Tt(t[0]))?null:At(Ot(e))}function Mt(){let e=jt(window.location.hash);e&&window.history.replaceState(window.history.state,``,e)}Mt();var Nt=R(Ot(window.location.hash));window.addEventListener(`hashchange`,()=>{Mt(),Nt.value=Ot(window.location.hash)});function W(e){return At({route:e,query:Nt.value.query})}function Pt(e){window.location.hash=W(e)}var Ft=[`passed`,`failed`,`flaky`,`skipped`];function It(e,t){return t.status!==e.expectedStatus&&t.status!==`skipped`}function Lt(e){let t=new Map;for(let n of e.tests)for(let e of n.attempts)if(It(n,e))for(let r of e.errors){let i=t.get(r.signature);i||(i={signature:r.signature,category:r.category??`Uncategorized`,message:r.message,tests:[],failed:0,flaky:0},t.set(r.signature,i));let a=i.tests[i.tests.length-1];a?.test===n?a.attempts.includes(e.index)||a.attempts.push(e.index):(i.tests.push({test:n,attempts:[e.index]}),n.outcome===`failed`?i.failed+=1:n.outcome===`flaky`&&(i.flaky+=1))}return[...t.values()]}function Rt(e){return e.map((e,t)=>({group:e,index:t})).sort((e,t)=>t.group.failed-e.group.failed||t.group.flaky-e.group.flaky||e.index-t.index).map(({group:e})=>e)}function zt(e){return e.split(`
|
|
8
|
+
`).find(e=>e.trim()!==``)?.trim()??``}var Bt=/^(?:Error: )?(?:expect(?:\.soft|\.poll)?\(\w+\)\.(?:not\.)?\w+\([^)]*\)(?: failed)?|Timed out \d+ms waiting for expect\(.*)$/,Vt=/^\s*Locator:\s+(.+?)\s*$/m,Ht=/^\s*(?:- )?\u2190 (\d{3}\b.*?)\s*$/m;function Ut(e){let t=zt(e);if(!Bt.test(t))return t;let n=Vt.exec(e);if(n)return`Locator: ${n[1]}`;let r=Ht.exec(e);return r?`\u2190 ${r[1]}`:t}function Wt(e){return{headline:Ut(e.message),firstTest:e.tests[0]?.test??null,others:Math.max(0,e.tests.length-1)}}function Gt(e,t){let n=new Map;for(let e of t){let t=n.get(e.category);t||(t={tests:new Set,groups:[]},n.set(e.category,t)),t.groups.push(e);for(let{test:n}of e.tests)t.tests.add(n)}let r=e.categories.map(e=>e.name);return[...r.filter(e=>n.has(e)),...[...n.keys()].filter(e=>!r.includes(e))].map(e=>{let t=n.get(e);return{name:e,tests:t.tests.size,groups:t.groups}})}function Kt(e){let{stats:t,status:n,errors:r}=e.run;return t.failed>0||n!==`passed`||r.length>0?`failed`:t.flaky>0?`flaky`:`passed`}function qt(e){return Ft.filter(t=>e[t]>0).map(t=>({outcome:t,count:e[t],share:e.total>0?e[t]/e.total:0}))}function Jt(e){let t=e.total-e.skipped;return t>0?e.passed/t:null}var Yt=`Pass rate: passed / (total − skipped). Skipped tests are excluded; flaky tests do not count as passed.`;function Xt(e){let t=e*100;return t>99&&t<100?`99%`:t>0&&t<1?`<1%`:`${Math.round(t)}%`}function Zt(e){return e.projects.filter(e=>e.stats.total>0).map(t=>{let n=e.tests.filter(e=>e.project===t.name).reduce((e,t)=>e+t.durationMs,0);return{project:t,passRate:Jt(t.stats),durationMs:n}})}function Qt(e){return e.dimensions.map(t=>{let n=new Map,r=e=>{let r=n.get(e);return r||(r={value:e,passed:0,failed:0,flaky:0,skipped:0,total:0,unknown:t.values!==null&&!t.values.includes(e),caseVariants:[]},n.set(e,r)),r};for(let e of t.values??[])r(e);let i=0;for(let n of e.tests){let e=n.dimensions[t.name]??[];e.length===0&&(i+=1);for(let t of new Set(e)){let e=r(t);e[n.outcome]+=1,e.total+=1}}let a=t.values??[],o=[...n.keys()].filter(e=>!a.includes(e)).sort((e,t)=>e.localeCompare(t)),s=[...a,...o].map(e=>n.get(e)),c=an(s.map(e=>e.value));for(let e of s)e.caseVariants=c.get(e.value)??[];return{definition:t,values:s,without:i}})}function $t(e){return e.values.length<=8?`bars`:`tiles`}function en(e){return e.failed>0?`failed`:e.flaky>0?`flaky`:e.passed>0?`passed`:e.skipped>0?`skipped`:`none`}var tn={failed:0,flaky:1,passed:2,skipped:3,none:4};function nn(e){return e.map((e,t)=>({row:e,index:t,status:en(e)})).sort((e,t)=>tn[e.status]-tn[t.status]||t.row.failed-e.row.failed||t.row.flaky-e.row.flaky||e.index-t.index).map(({row:e})=>e)}function rn(e){let t=t=>e.filter(e=>en(e)===t).length,n=[[t(`passed`),`all passed`],[t(`failed`),`with failures`],[t(`flaky`),`flaky`],[t(`skipped`),`skipped only`],[t(`none`),`without tests`]];return[`${e.length} ${e.length===1?`value`:`values`}`,...n.filter(([e])=>e>0).map(([e,t])=>`${e} ${t}`)].join(` · `)}function an(e){let t=new Map;for(let n of new Set(e)){let e=n.toLowerCase();t.set(e,[...t.get(e)??[],n])}let n=new Map;for(let e of t.values())if(!(e.length<2))for(let t of e)n.set(t,e.filter(e=>e!==t));return n}function on(e){return e.tests.filter(e=>e.outcome===`flaky`).map(e=>({test:e,error:e.attempts.find(t=>It(e,t))?.errors[0]??null}))}function sn(e,t=10){return e.tests.filter(e=>e.outcome!==`skipped`&&e.durationMs>0).map((e,t)=>({test:e,index:t})).sort((e,t)=>t.test.durationMs-e.test.durationMs||e.index-t.index).slice(0,t).map(({test:e})=>e)}var cn=[`skip`,`fixme`];function ln(e){return e.tests.filter(e=>e.outcome===`skipped`).map(e=>{let t=[...e.annotations,...e.attempts[e.attempts.length-1]?.annotations??[]].find(e=>cn.includes(e.type));return{test:e,kind:t?t.type:null,reason:t?.description?.trim()||null}})}var un=[{name:`blue`,reference:`#466cc8`,light:{text:`#385db7`,bg:`#eaf0fe`,border:`#5981df`},dark:{text:`#9ebdff`,bg:`#18233c`,border:`#577cd3`}},{name:`cyan`,reference:`#0a7da1`,light:{text:`#0a708f`,bg:`#e0f4fd`,border:`#2b8fb4`},dark:{text:`#60cdf5`,bg:`#002837`,border:`#268cb1`}},{name:`teal`,reference:`#04837c`,light:{text:`#09726c`,bg:`#dbf7f4`,border:`#29958e`},dark:{text:`#6ed2c9`,bg:`#002b28`,border:`#25928b`}},{name:`violet`,reference:`#8656b7`,light:{text:`#7747a7`,bg:`#f4ecfe`,border:`#9e6ed2`},dark:{text:`#cfaafc`,bg:`#2a1d37`,border:`#9468c3`}},{name:`magenta`,reference:`#ad4681`,light:{text:`#9d3772`,bg:`#feeaf3`,border:`#cc629d`},dark:{text:`#f79dcc`,bg:`#351928`,border:`#bb598f`}},{name:`orange`,reference:`#ab5803`,light:{text:`#954d09`,bg:`#feece1`,border:`#c6702b`},dark:{text:`#f9a970`,bg:`#361d0a`,border:`#bc671f`}},{name:`brown`,reference:`#745f43`,light:{text:`#3c2d18`,bg:`#f5e9d9`,border:`#60503a`},dark:{text:`#b7a182`,bg:`#302412`,border:`#ae9779`}},{name:`gold`,reference:`#b9a542`,light:{text:`#736308`,bg:`#f5f1da`,border:`#9a861a`},dark:{text:`#d2be5d`,bg:`#2b2403`,border:`#94800e`}}],dn={name:`neutral`,reference:`#6b6b6b`,light:{text:`#636363`,bg:`#f0f0f0`,border:`#868686`},dark:{text:`#bebebe`,bg:`#242424`,border:`#808080`}};un.map(e=>e.name);function fn(e){let t=e.toLowerCase();return[...un,dn].find(e=>e.reference===t)??null}var pn={light:[`#f7f5f0`,`#ffffff`,`#eeeae2`],dark:[`#080808`,`#0d0d0d`,`#161616`]},mn=4.5,hn=/^#[0-9a-fA-F]{6}$/;function gn(e){return hn.test(e)}function _n(e){if(!gn(e))throw TypeError(`not a #rrggbb color: ${e}`);let t=Number.parseInt(e.slice(1),16);return[t>>16&255,t>>8&255,t&255]}function vn([e,t,n]){return`#${[e,t,n].map(e=>Math.round(Math.min(255,Math.max(0,e))).toString(16).padStart(2,`0`)).join(``)}`}function yn(e){let t=e/255;return t<=.04045?t/12.92:((t+.055)/1.055)**2.4}function bn(e){return(e<=.0031308?e*12.92:1.055*e**(1/2.4)-.055)*255}function xn(e){let[t,n,r]=_n(e).map(yn);return .2126*t+.7152*n+.0722*r}function Sn(e,t){let[n,r]=[xn(e),xn(t)].sort((e,t)=>t-e);return(n+.05)/(r+.05)}function Cn(e){let[t,n,r]=_n(e).map(yn),i=Math.cbrt(.4122214708*t+.5363325363*n+.0514459929*r),a=Math.cbrt(.2119034982*t+.6806995451*n+.1073969566*r),o=Math.cbrt(.0883024619*t+.2817188376*n+.6299787005*r),s=.2104542553*i+.793617785*a-.0040720468*o,c=1.9779984951*i-2.428592205*a+.4505937099*o,l=.0259040371*i+.7827717662*a-.808675766*o,u=Math.atan2(l,c)*180/Math.PI;return{l:s,c:Math.hypot(c,l),h:u<0?u+360:u}}function wn({l:e,c:t,h:n}){let r=t*Math.cos(n*Math.PI/180),i=t*Math.sin(n*Math.PI/180),a=(e+.3963377774*r+.2158037573*i)**3,o=(e-.1055613458*r-.0638541728*i)**3,s=(e-.0894841775*r-1.291485548*i)**3;return[4.0767416621*a-3.3077115913*o+.2309699292*s,-1.2684380046*a+2.6097574011*o-.3413193965*s,-.0041960863*a-.7034186147*o+1.707614701*s]}function Tn(e){let t=e.c;for(;;){let n=wn({...e,c:t});if(n.every(e=>e>=-1e-4&&e<=1.0001)||t<=0)return vn(n.map(e=>bn(Math.min(1,Math.max(0,e)))));t=Math.max(0,t-.005)}}function En(e,t,n,r){let i=t<n?.01:-.01;for(let a=t;i>0?a<=n:a>=n;a+=i){let t=Tn({...e,l:a});if(r(t))return t}return Tn({...e,l:n})}function Dn(e,t){let n=Cn(e),r=n.c<.02?0:n.c,i=pn[t];if(t===`light`){let e=Tn({...n,l:.955,c:Math.min(r,.03)});return{text:En({...n,c:Math.min(r,.16)},.5,0,t=>Sn(t,e)>=mn),bg:e,border:En({...n,c:Math.min(r,.18)},.66,0,t=>[e,...i].every(e=>Sn(t,e)>=3))}}let a=Tn({...n,l:.26,c:Math.min(r,.05)});return{text:En({...n,c:Math.min(r,.12)},.8,1,e=>Sn(e,a)>=mn),bg:a,border:En({...n,c:Math.min(r,.14)},.6,1,e=>[a,...i].every(t=>Sn(e,t)>=3))}}var On=new Map;function kn(e){let t=e&&gn(e)?e.toLowerCase():dn.reference,n=On.get(t);if(!n){let e=fn(t);n=e?{light:e.light,dark:e.dark}:{light:Dn(t,`light`),dark:Dn(t,`dark`)},On.set(t,n)}return n}function An(e){let{light:t,dark:n}=kn(e);return{"--cat-text-light":t.text,"--cat-bg-light":t.bg,"--cat-border-light":t.border,"--cat-text-dark":n.text,"--cat-bg-dark":n.bg,"--cat-border-dark":n.border}}function jn(e){return new Map(e.map(e=>[e.name,e.color]))}function Mn(e){if(e<1e3)return`${Math.round(e)} ms`;if(e<6e4)return`${(e/1e3).toFixed(1)} s`;let t=Math.round(e/1e3);if(t<3600)return`${Math.floor(t/60)} min ${String(t%60).padStart(2,`0`)} s`;let n=Math.round(t/60);return`${Math.floor(n/60)} h ${String(n%60).padStart(2,`0`)} min`}function G(e,t,n=`${t}s`){return`${e} ${e===1?t:n}`}var Nn=`\0`;function Pn(){return{total:0,passed:0,failed:0,flaky:0,skipped:0}}function Fn(e,t){return`t${Nn}${e}${Nn}${t}`}function In(e){return`p${Nn}${e}`}function Ln(e,t,n){return{kind:e,key:t,labels:[n],children:[],counts:Pn(),line:1/0}}function Rn(e,t){return e.line===t.line?e.kind===`test`&&t.kind===`test`?e.column-t.column||e.repeatEachIndex-t.repeatEachIndex:e.kind===t.kind?zn(e).localeCompare(zn(t)):e.kind===`test`?1:-1:e.line-t.line}function zn(e){return e.kind===`test`?e.title:e.labels.join(` › `)}function Bn(e){for(let t of e.children){if(t.kind===`test`)e.counts.total+=1,e.counts[t.outcome]+=1;else{Bn(t);for(let n of[`total`,`passed`,`failed`,`flaky`,`skipped`])e.counts[n]+=t.counts[n]}e.line=Math.min(e.line,t.line)}e.kind===`project`?e.children.sort((e,t)=>zn(e).localeCompare(zn(t))):e.children.sort(Rn)}function Vn(e){let t=e;for(;;){let e=t.children.length===1?t.children[0]:void 0;if(t.kind===`project`||e?.kind!==`suite`)break;t={...t,labels:[...t.labels,...e.labels],children:e.children}}return{...t,children:t.children.map(e=>e.kind===`test`?e:Vn(e))}}function Hn(e){let t=new Map;for(let n of e.projects)t.set(n.name,Ln(`project`,In(n.name),n.name||`(unnamed project)`));let n=new Map;for(let r of e.tests){let e=t.get(r.project);e||(e=Ln(`project`,In(r.project),r.project||`(unnamed project)`),t.set(r.project,e));let i=[[`file`,r.file],...r.suitePath.map(e=>[`suite`,e])];for(let[t,r]of i){let i=`${e.key}${Nn}${t===`file`?`f`:`s`}${Nn}${r}`,a=n.get(i);a||(a=Ln(t,i,r),n.set(i,a),e.children.push(a)),e=a}e.children.push(Un(r))}let r=[...t.values()].filter(e=>e.children.length>0);for(let e of r)Bn(e);return r.map(Vn)}function Un(e){return{kind:`test`,key:Fn(e.id,e.repeatEachIndex),testId:e.id,repeatEachIndex:e.repeatEachIndex,title:e.title,outcome:e.outcome,line:e.line,column:e.column}}function Wn(e,t){let n=[],r=(e,i,a)=>{e.forEach((o,s)=>{n.push({node:o,level:i,parentKey:a,position:s+1,siblings:e.length}),o.kind!==`test`&&t.has(o.key)&&r(o.children,i+1,o.key)})};return r(e,1,null),n}function Gn(e,t){for(let n of e){if(n.key===t)return[];if(n.kind===`test`)continue;let e=Gn(n.children,t);if(e)return[n.key,...e]}return null}function Kn(e){return e.flatMap(e=>e.kind===`test`?[]:[e.key,...Kn(e.children)])}var qn=0;Array.isArray;function K(e,n,r,i,a,o){n||={};var s,c,l=n;if(`ref`in l)for(c in l={},n)c==`ref`?s=n[c]:l[c]=n[c];var u={type:e,props:l,key:r,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--qn,__i:-1,__u:0,__source:a,__self:o};if(typeof e==`function`&&(s=e.defaultProps))for(c in s)l[c]===void 0&&(l[c]=s[c]);return t.vnode&&t.vnode(u),u}function q({name:e,color:t}){return K(`span`,{class:`category-badge`,style:An(t),title:`Category: ${e}`,children:e})}function J({children:e,class:t}){return K(`svg`,{class:`icon ${t??``}`,viewBox:`0 0 16 16`,width:`16`,height:`16`,"aria-hidden":`true`,focusable:`false`,children:e})}var Jn={passed:`Passed`,failed:`Failed`,flaky:`Flaky`,skipped:`Skipped`};function Y(e){return Jn[e]}function X({outcome:e,labelled:t=!1,decorative:n=!1}){let r={passed:K(`path`,{d:`M4.5 8.2l2.3 2.3 4.7-4.9`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`}),failed:K(`path`,{d:`M5.5 5.5l5 5m0-5l-5 5`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`}),flaky:K(`path`,{d:`M10.9 5.6A3.6 3.6 0 0 0 4.6 7M5.1 10.4A3.6 3.6 0 0 0 11.4 9M10.9 3.6v2h-2M5.1 12.4v-2h2`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`}),skipped:K(`path`,{d:`M5 8h6`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`})}[e];return K(`span`,{class:`outcome-icon outcome-${e}`,title:t||n?void 0:Jn[e],"aria-hidden":n?`true`:void 0,children:[K(J,{children:[K(`circle`,{cx:`8`,cy:`8`,r:`7`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.4`}),r]}),!n&&K(`span`,{class:t?`outcome-text`:`visually-hidden`,children:Jn[e]})]})}function Yn(e){return K(J,{...e,children:K(`path`,{d:`M6 4l4 4-4 4`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.6`,"stroke-linecap":`round`,"stroke-linejoin":`round`})})}function Xn(e){return K(J,{...e,children:[K(`rect`,{x:`1.5`,y:`2.5`,width:`13`,height:`11`,rx:`1.5`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.3`}),K(`path`,{d:`M6 2.5v11`,stroke:`currentColor`,"stroke-width":`1.3`})]})}function Zn(e){return K(J,{...e,children:[K(`rect`,{x:`1.5`,y:`2.5`,width:`13`,height:`9`,rx:`1.5`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.3`}),K(`path`,{d:`M5.5 14h5M8 11.5V14`,stroke:`currentColor`,"stroke-width":`1.3`,"stroke-linecap":`round`})]})}function Qn(e){return K(J,{...e,children:[K(`circle`,{cx:`8`,cy:`8`,r:`3`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.3`}),K(`path`,{d:`M8 1v1.6M8 13.4V15M1 8h1.6M13.4 8H15M3 3l1.1 1.1M11.9 11.9L13 13M3 13l1.1-1.1M11.9 4.1L13 3`,stroke:`currentColor`,"stroke-width":`1.3`,"stroke-linecap":`round`})]})}function $n(e){return K(J,{...e,children:K(`path`,{d:`M13.5 9.6A5.8 5.8 0 0 1 6.4 2.5a5.8 5.8 0 1 0 7.1 7.1z`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.3`,"stroke-linejoin":`round`})})}function er(e){return K(J,{...e,children:K(`path`,{d:`M2 2.5h5v5H2zM9 2.5h5v3H9zM9 7.5h5v6H9zM2 9.5h5v4H2z`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.3`,"stroke-linejoin":`round`})})}function Z(e){return K(J,{...e,children:[K(`path`,{d:`M8 1.8l6.5 11.4H1.5z`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.3`,"stroke-linejoin":`round`}),K(`path`,{d:`M8 6.2v3.3`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`}),K(`circle`,{cx:`8`,cy:`11.4`,r:`.9`,fill:`currentColor`})]})}function tr(e){return K(J,{...e,children:[K(`circle`,{cx:`8`,cy:`8`,r:`6.3`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.3`}),K(`path`,{d:`M8 4.6v4`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`}),K(`circle`,{cx:`8`,cy:`11.1`,r:`.9`,fill:`currentColor`})]})}function nr(e){return K(J,{...e,children:K(`path`,{d:`M1.5 8.5h3l1.5-4 2.5 7 1.8-4.5 1 1.5h3.2`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.3`,"stroke-linecap":`round`,"stroke-linejoin":`round`})})}function rr({group:e}){return K(`span`,{class:`group-split`,children:[`failed`,`flaky`].filter(t=>e[t]>0).map(t=>K(`span`,{class:`group-split-part split-${t}`,children:[K(X,{outcome:t,decorative:!0}),e[t],` `,t]},t))})}var ir=`https://github.com/qartisan/playwright-loupe/blob/main/docs/config.md#dimensions`;function ar(e){return W({page:`test`,id:e.id,repeatEachIndex:e.repeatEachIndex})}function or(e){return e||`(unnamed project)`}function sr({rate:e}){return K(`span`,{class:`pass-rate`,title:Yt,children:[K(`strong`,{children:Xt(e)}),` pass rate`,K(`span`,{class:`visually-hidden`,children:` (skipped tests excluded)`})]})}function Q({id:e,title:t,note:n,class:r,children:i}){return K(`section`,{class:`widget ${r??``}`,"aria-labelledby":e,children:[K(`h2`,{id:e,children:t}),n&&K(`p`,{class:`widget-note`,children:n}),i]})}function cr({report:e}){let t=Kt(e),{stats:n}=e.run,r=qt(n),i=Jt(n),a=r.map(({outcome:e,count:t})=>`${t} ${Y(e).toLowerCase()}`).join(`, `);return K(`section`,{class:`widget widget-verdict`,"aria-labelledby":`w-verdict`,children:[K(`h2`,{id:`w-verdict`,class:`visually-hidden`,children:`Verdict`}),K(`div`,{class:`verdict`,children:[K(`p`,{class:`verdict-outcome outcome-${t}`,"data-verdict":t,children:[K(X,{outcome:t,decorative:!0}),K(`span`,{children:Y(t)})]}),K(`p`,{class:`verdict-meta`,children:[i!==null&&K(S,{children:[K(sr,{rate:i}),` ·`,` `]}),G(n.total,`test`),` in `,K(`strong`,{children:Mn(e.run.durationMs)})]})]}),r.length>0&&K(S,{children:[K(`div`,{class:`outcome-bar`,role:`img`,"aria-label":a,children:r.map(({outcome:e,count:t,share:n})=>K(`span`,{class:`outcome-bar-part bar-${e}`,style:{flexGrow:n},title:`${t} ${Y(e).toLowerCase()}`},e))}),K(`ul`,{class:`outcome-legend`,"aria-hidden":`true`,children:r.map(({outcome:e,count:t})=>K(`li`,{children:[K(X,{outcome:e,decorative:!0}),t,` `,Y(e).toLowerCase()]},e))})]})]})}function lr({errors:e}){return K(Q,{id:`w-run-errors`,class:`widget-run-errors`,title:K(S,{children:[K(Z,{}),G(e.length,`error`),` outside tests`]}),note:`A file that failed to load, a global setup or teardown, a worker teardown: Playwright may have run fewer tests.`,children:[K(`ul`,{class:`widget-list`,children:e.slice(0,3).map((e,t)=>K(`li`,{children:K(`code`,{children:Ut(e.message)})},t))}),K(`p`,{class:`widget-more`,children:K(`a`,{href:W({page:`errors`}),children:`See the errors`})})]})}function ur({error:e,color:t}){let n=e.location?`${e.location.file}:${e.location.line}:${e.location.column}`:null;return K(`li`,{class:`run-error`,children:[K(`div`,{class:`run-error-meta`,children:[e.category&&K(q,{name:e.category,color:t}),e.project!==null&&K(`span`,{children:[`Project `,e.project||`(unnamed)`]}),n&&K(`code`,{children:n})]}),K(`pre`,{class:`message error-message`,children:e.message}),e.snippet&&K(`pre`,{class:`code-snippet`,children:e.snippet}),e.stack&&e.stack!==e.message&&K(`details`,{children:[K(`summary`,{children:`Stack trace`}),K(`pre`,{class:`stack`,children:e.stack})]})]})}function dr({group:e,colors:t}){let{headline:n,firstTest:r,others:i}=Wt(e);return K(`a`,{class:`group-row`,href:W({page:`group`,signature:e.signature}),children:[K(`span`,{class:`group-row-head`,children:[K(q,{name:e.category,color:t.get(e.category)}),K(rr,{group:e})]}),r&&K(`span`,{class:`group-test`,children:[r.title,i>0&&K(`span`,{class:`muted`,children:[` +`,G(i,`other`)]})]}),K(`code`,{class:`group-message`,children:n})]})}function fr({groups:e,colors:t}){return K(`ol`,{class:`widget-list group-list`,children:e.map(e=>K(`li`,{children:K(dr,{group:e,colors:t})},e.signature))})}function pr({categories:e,colors:t}){let n=Math.max(...e.map(e=>e.tests),1);return K(`ul`,{class:`widget-list category-bars`,children:e.map(e=>K(`li`,{children:K(`a`,{class:`category-bar-row`,href:W({page:`errors`,category:e.name}),children:[K(q,{name:e.name,color:t.get(e.name)}),K(`span`,{class:`category-bar-track`,"aria-hidden":`true`,children:K(`span`,{class:`category-bar`,style:{...An(t.get(e.name)),width:`${e.tests/n*100}%`}})}),K(`span`,{class:`group-count`,children:G(e.tests,`test`)})]})},e.name))})}function mr({categories:e,colors:t,open:n}){return K(`ul`,{class:`widget-list category-list`,children:e.map(e=>K(`li`,{"data-category":e.name,children:K(`details`,{open:e.name===n,children:[K(`summary`,{children:[K(Yn,{class:`chevron`}),K(q,{name:e.name,color:t.get(e.name)}),K(`span`,{class:`muted`,children:G(e.groups.length,`error group`)}),K(`span`,{class:`group-count`,children:G(e.tests,`test`)})]}),K(fr,{groups:e.groups,colors:t})]})},e.name))})}function hr({projects:e}){return K(`ul`,{class:`project-cards`,children:e.map(({project:e,passRate:t,durationMs:n})=>K(`li`,{children:K(`button`,{type:`button`,class:`project-card`,"aria-controls":`sidebar`,title:`Show this project in the sidebar`,onClick:()=>xt(In(e.name)),children:[K(`span`,{class:`project-name`,children:or(e.name)}),K(`span`,{class:`counts`,children:[`passed`,`failed`,`flaky`,`skipped`].filter(t=>e.stats[t]>0).map(t=>K(`span`,{class:`count`,children:[K(X,{outcome:t,decorative:!0}),e.stats[t],` `,K(`span`,{class:`visually-hidden`,children:Y(t).toLowerCase()})]},t))}),K(`span`,{class:`project-meta`,children:[G(e.stats.total,`test`),t!==null&&K(S,{children:[` · `,K(sr,{rate:t})]}),` `,`· `,Mn(n),` test time`]})]})},e.name))})}function gr({value:e}){return K(`td`,{class:e===0?`zero`:void 0,children:e})}var _r=[`passed`,`failed`,`flaky`,`skipped`];function vr(e){let t=_r.filter(t=>e[t]>0).map(t=>`${e[t]} ${t}`);return t.length>0?t.join(`, `):`no tests`}function yr(e){return[...e.unknown?[`unknown value`]:[],...e.caseVariants.length>0?[`likely duplicate of ${e.caseVariants.join(`, `)}`]:[]]}function br({row:e}){return K(S,{children:[e.unknown&&K(`span`,{class:`hygiene-flag flag-unknown`,title:`Not among the values declared in the config`,children:[K(Z,{}),`unknown value`]}),e.caseVariants.length>0&&K(`span`,{class:`hygiene-flag flag-case`,title:`Differs from another value only by case. Tags are case-sensitive, so they are counted apart.`,children:[K(Z,{}),`likely duplicate of `,e.caseVariants.join(`, `)]})]})}function xr({values:e}){return K(`ul`,{class:`dimension-bars`,children:e.map(e=>K(`li`,{class:`dimension-bar-row`,"data-value":e.value,children:[K(`span`,{class:`dimension-value-cell`,children:[K(`span`,{class:`dimension-value`,children:e.value}),K(br,{row:e})]}),K(`span`,{class:`outcome-bar dimension-bar`,role:`img`,"aria-label":`${e.value}: ${vr(e)}`,title:vr(e),children:_r.filter(t=>e[t]>0).map(t=>K(`span`,{class:`outcome-bar-part bar-${t}`,style:{flexGrow:e[t]}},t))}),K(`span`,{class:`dimension-bar-counts`,"aria-hidden":`true`,children:[`failed`,`flaky`].filter(t=>e[t]>0).map(t=>K(`span`,{class:`count`,children:[K(X,{outcome:t,decorative:!0}),e[t]]},t))}),K(`span`,{class:`dimension-total`,"aria-hidden":`true`,children:e.total})]},e.value))})}var Sr={failed:`with failures`,flaky:`flaky`,passed:`all passed`,skipped:`skipped only`,none:`no tests`},$=R(null);function Cr(e,t){let n=$.value;n?.key===e&&n.source===t&&($.value=null)}function wr(e){e.key===`Escape`&&$.value&&($.value=null)}function Tr({name:e,values:t}){return ke(()=>(document.addEventListener(`keydown`,wr),()=>{document.removeEventListener(`keydown`,wr),$.value?.key.startsWith(`${e}\u0000`)&&($.value=null)}),[e]),K(S,{children:[K(`p`,{class:`tile-summary`,children:rn(t)}),K(`ul`,{class:`dimension-tiles`,"aria-label":`${e} values`,children:nn(t).map(t=>{let n=en(t),r=yr(t),i=[vr(t),...r].join(`; `),a=`${e}\u0000${t.value}`,o=$.value?.key===a;return K(`li`,{class:`dimension-tile tile-${n}${o?` tooltip-open`:``}`,tabIndex:0,"data-value":t.value,"data-status":n,onPointerEnter:()=>$.value={key:a,source:`hover`},onPointerLeave:()=>Cr(a,`hover`),onFocus:()=>$.value={key:a,source:`focus`},onBlur:()=>Cr(a,`focus`),children:[n===`none`?K(`span`,{class:`tile-icon-none`,"aria-hidden":`true`}):K(X,{outcome:n,decorative:!0}),K(`span`,{class:`tile-value`,children:t.value}),r.length>0&&K(Z,{class:`tile-flag`}),K(`span`,{class:`visually-hidden`,children:[`: `,Sr[n],`, `,i]}),K(`span`,{class:`tile-details`,"aria-hidden":`true`,hidden:!o,children:[K(`strong`,{children:t.value}),K(`span`,{children:Sr[n]}),K(`span`,{children:vr(t)}),r.map(e=>K(`span`,{class:`tile-note`,children:e},e))]})]},t.value)})})]})}function Er({distribution:e}){let{definition:t,values:n,without:r}=e,i=`w-dimension-${t.name}`,a=$t(e);return K(`section`,{class:`widget widget-dimension`,"aria-labelledby":i,"data-dimension":t.name,"data-representation":a,children:[K(`h2`,{id:i,children:t.name}),K(`p`,{class:`widget-note`,children:[`From `,t.source===`tag`?`tags @${t.key}:…`:`annotations of type "${t.key}"`,r>0&&` · ${G(r,`test`)} without a value`]}),a===`bars`?K(xr,{values:n}):K(Tr,{name:t.name,values:n}),K(`details`,{class:`dimension-table`,children:[K(`summary`,{children:[K(Yn,{class:`chevron`}),`Table`]}),K(`table`,{class:`data-table`,children:[K(`thead`,{children:K(`tr`,{children:[K(`th`,{scope:`col`,children:`Value`}),_r.map(e=>K(`th`,{scope:`col`,children:K(X,{outcome:e,labelled:!0})},e)),K(`th`,{scope:`col`,children:`Total`})]})}),K(`tbody`,{children:n.map(e=>K(`tr`,{children:[K(`th`,{scope:`row`,children:[K(`span`,{class:`dimension-value`,children:e.value}),K(br,{row:e})]}),_r.map(t=>K(gr,{value:e[t]},t)),K(gr,{value:e.total})]},e.value))})]})]}),t.values===null&&K(`p`,{class:`widget-hint`,children:[`No expected values are configured, so typos cannot be flagged as unknown. Declare them with `,K(`code`,{children:`values`}),` in`,` `,K(`a`,{href:ir,target:`_blank`,rel:`noopener noreferrer`,children:`the dimension definition`}),`.`]})]})}function Dr({test:e,children:t,aside:n}){return K(`div`,{class:`test-line`,children:[K(X,{outcome:e.outcome}),K(`span`,{class:`test-text`,children:[K(`a`,{href:ar(e),children:e.title}),K(`span`,{class:`test-where`,children:[or(e.project),` · `,e.file,e.repeatEachIndex>0&&` · repeat ${e.repeatEachIndex}`]}),t]}),n]})}function Or(e){return`${e.id}/${e.repeatEachIndex}`}function kr({tests:e}){return K(Q,{id:`w-slowest`,class:`widget-slowest`,title:`Slowest tests`,note:`Total duration, retries included.`,children:K(`ol`,{class:`widget-list`,children:e.map(e=>K(`li`,{children:K(Dr,{test:e,aside:K(`span`,{class:`duration`,children:Mn(e.durationMs)}),children:e.attempts.length>1&&K(`span`,{class:`test-where`,children:G(e.attempts.length,`attempt`)})})},Or(e)))})})}function Ar({tests:e}){return K(Q,{id:`w-skipped`,class:`widget-skipped`,title:`Skipped tests`,children:K(`ul`,{class:`widget-list`,children:e.map(({test:e,kind:t,reason:n})=>K(`li`,{children:K(Dr,{test:e,children:K(`span`,{class:`test-where`,children:[t===`fixme`&&K(`span`,{class:`skip-kind`,children:`fixme`}),` `,n??K(`span`,{class:`muted`,children:`No reason given`})]})})},Or(e)))})})}function jr({tests:e,colors:t}){return K(Q,{id:`w-flaky`,class:`widget-flaky`,title:`Flaky tests`,note:`Failed, then passed on a retry: the error of the failing attempt.`,children:K(`ul`,{class:`widget-list`,children:e.map(({test:e,error:n})=>K(`li`,{children:K(Dr,{test:e,children:n&&K(`span`,{class:`flaky-error`,children:[n.category&&K(q,{name:n.category,color:t.get(n.category)}),K(`code`,{children:Ut(n.message)})]})})},Or(e)))})})}function Mr({report:e,groups:t,category:n}){let r=N(null);ke(()=>{if(n===void 0)return;let e=[...r.current?.querySelectorAll(`[data-category]`)??[]].find(e=>e.dataset.category===n);e?.scrollIntoView({block:`start`}),e?.querySelector(`summary`)?.focus({preventScroll:!0})},[n]);let i=P(()=>Rt(t),[t]),a=P(()=>Gt(e,t),[e,t]),o=P(()=>jn(e.categories),[e]),{errors:s}=e.run;return K(`div`,{class:`page view view-errors`,ref:r,children:[K(`h1`,{children:`Errors`}),s.length===0&&t.length===0&&K(`p`,{class:`muted`,children:`No errors in this run.`}),s.length>0&&K(Q,{id:`w-run-errors`,class:`widget-run-error-list`,title:G(s.length,`run error`),note:`Reported outside any test: a file that failed to load, a global setup or teardown, a worker teardown. Playwright may have run fewer tests because of them.`,children:K(`ol`,{class:`run-errors`,children:s.map((e,t)=>K(ur,{error:e,color:e.category?o.get(e.category):void 0},t))})}),i.length>0&&K(Q,{id:`w-groups`,class:`widget-groups`,title:G(i.length,`error group`),note:`Errors grouped by normalized signature: most failed tests first, then most flaky tests.`,children:K(fr,{groups:i,colors:o})}),a.length>0&&K(Q,{id:`w-categories`,class:`widget-categories`,title:`Error categories`,note:`Failing tests per category; flaky tests count, and a test can be in several categories.`,children:K(mr,{categories:a,colors:o,open:n},n)})]})}function Nr({message:e=`This page does not exist in this report.`}){return K(`div`,{class:`page`,children:[K(`h1`,{children:`Not found`}),K(`p`,{children:e}),K(`p`,{children:K(`a`,{href:W({page:`dashboard`}),children:`Back to the dashboard`})})]})}function Pr(e){return e===0?`first run`:`retry ${e}`}function Fr({report:e,group:t}){if(!t)return K(Nr,{message:`No error group with this signature in this report.`});let n=jn(e.categories).get(t.category);return K(`div`,{class:`page group-page`,children:[K(`p`,{class:`breadcrumb`,children:`Error group`}),K(`h1`,{children:[G(t.tests.length,`test`),` failing with this error`]}),K(`dl`,{class:`group-meta`,children:[K(`div`,{children:[K(`dt`,{children:`Category`}),K(`dd`,{children:K(q,{name:t.category,color:n})})]}),K(`div`,{children:[K(`dt`,{children:`Tests`}),K(`dd`,{children:K(rr,{group:t})})]}),K(`div`,{children:[K(`dt`,{children:`Signature`}),K(`dd`,{children:K(`code`,{children:t.signature})})]})]}),K(`h2`,{children:`Sample message`}),K(`pre`,{class:`message group-sample`,children:t.message}),K(`h2`,{children:`Affected tests`}),K(`table`,{class:`affected-tests`,children:[K(`thead`,{children:K(`tr`,{children:[K(`th`,{scope:`col`,children:`Test`}),K(`th`,{scope:`col`,children:`Project`}),K(`th`,{scope:`col`,children:`File`}),K(`th`,{scope:`col`,children:`Error in`})]})}),K(`tbody`,{children:t.tests.map(({test:e,attempts:t})=>K(`tr`,{children:[K(`td`,{children:K(`span`,{class:`test-cell`,children:[K(X,{outcome:e.outcome}),K(`a`,{href:W({page:`test`,id:e.id,repeatEachIndex:e.repeatEachIndex}),children:[...e.suitePath,e.title].join(` › `)}),e.repeatEachIndex>0&&K(`span`,{class:`row-note`,children:[`repeat `,e.repeatEachIndex]})]})}),K(`td`,{children:e.project||`(unnamed project)`}),K(`td`,{children:K(`code`,{children:[e.file,`:`,e.line]})}),K(`td`,{children:[t.map(Pr).join(`, `),K(`span`,{class:`muted`,children:[` of `,G(e.attempts.length,`attempt`)]})]})]},`${e.id}/${e.repeatEachIndex}`))})]})]})}function Ir({report:e}){let t=P(()=>({dimensions:Qt(e).filter(e=>e.values.length>0),slowest:sn(e),skipped:ln(e),flaky:on(e)}),[e]),n=P(()=>jn(e.categories),[e]),r=t.dimensions.length+t.slowest.length+t.skipped.length+t.flaky.length===0;return K(`div`,{class:`page view view-health`,children:[K(`h1`,{children:`Suite health`}),r&&K(`p`,{class:`muted`,children:`No dimension, slow, skipped or flaky test to show for this run.`}),t.dimensions.length>0&&K(`div`,{class:`widget-grid dimension-grid`,children:t.dimensions.map(e=>K(Er,{distribution:e},e.definition.name))}),(t.slowest.length>0||t.skipped.length>0||t.flaky.length>0)&&K(`div`,{class:`widget-grid`,children:[t.slowest.length>0&&K(kr,{tests:t.slowest}),t.flaky.length>0&&K(jr,{tests:t.flaky,colors:n}),t.skipped.length>0&&K(Ar,{tests:t.skipped})]})]})}function Lr({report:e,groups:t}){let n=P(()=>({categories:Gt(e,t),projects:Zt(e)}),[e,t]),r=P(()=>jn(e.categories),[e]);return K(`div`,{class:`page view view-overview`,children:[K(`h1`,{children:`Overview`}),K(cr,{report:e}),e.run.errors.length>0&&K(lr,{errors:e.run.errors}),n.categories.length>0&&K(Q,{id:`w-categories`,class:`widget-categories`,title:`Error categories`,note:K(S,{children:[`Failing tests per category. `,K(`a`,{href:W({page:`errors`}),children:[`All `,G(t.length,`error group`)]})]}),children:K(pr,{categories:n.categories,colors:r})}),n.projects.length>0&&K(Q,{id:`w-projects`,class:`widget-projects`,title:`Projects`,children:K(hr,{projects:n.projects})})]})}function Rr({test:e}){return e?K(`div`,{class:`page`,children:[K(`p`,{class:`breadcrumb`,children:[e.project||`(unnamed project)`,e.file,...e.suitePath].map((e,t)=>K(`span`,{class:`label-part`,children:e},t))}),K(`h1`,{class:`test-title`,children:[e.title,e.repeatEachIndex>0&&K(`span`,{class:`row-note`,children:[` repeat `,e.repeatEachIndex]})]}),K(X,{outcome:e.outcome,labelled:!0})]}):K(Nr,{message:`No test with this id in this report.`})}function zr({version:e}){return K(`footer`,{class:`footer`,children:[`Loupe — a reporter for Playwright `,K(`span`,{class:`muted`,children:[`· v`,e]})]})}var Br=[`system`,`light`,`dark`],Vr=`loupe.theme`,Hr=R(`system`);function Ur(e){return typeof e==`string`&&Br.includes(e)}function Wr(e){let t=mt(Vr);Hr.value=Ur(t)?t:Ur(e)?e:`system`,V(()=>{let e=document.documentElement;Hr.value===`system`?delete e.dataset.theme:e.dataset.theme=Hr.value})}function Gr(e){Hr.value=e,ht(Vr,e)}var Kr={passed:`Passed`,failed:`Failed`,timedout:`Timed out`,interrupted:`Interrupted`},qr={env:`LOUPE_RUN_SCOPE=partial`,"file-filter":`file filter`,grep:`grep filter`,"project-filter":`project filter`,"last-failed":`--last-failed`,"only-changed":`--only-changed`,"test-list":`test list`,only:`test.only`,shard:`single shard`,list:`--list (no test ran)`};function Jr(e){return qr[e]??e}var Yr={system:`System theme`,light:`Light theme`,dark:`Dark theme`},Xr={system:Zn,light:Qn,dark:$n};function Zr(){return K(`div`,{class:`theme-switch`,role:`group`,"aria-label":`Theme`,children:Br.map(e=>{let t=Xr[e];return K(`button`,{type:`button`,class:`icon-button`,"aria-pressed":Hr.value===e,title:Yr[e],onClick:()=>Gr(e),children:[K(t,{}),K(`span`,{class:`visually-hidden`,children:Yr[e]})]},e)})})}function Qr({report:e,title:t}){let{run:n}=e,r=[[`Duration`,Mn(n.durationMs),new Date(n.startedAt).toLocaleString()]];return n.git.branch&&r.push([`Branch`,n.git.branch]),n.git.commit&&r.push([`Commit`,n.git.commit.slice(0,8),n.git.commit]),n.environment.name&&r.push([`Environment`,n.environment.name]),K(S,{children:[K(`header`,{class:`header`,children:[K(`button`,{type:`button`,class:`icon-button`,"aria-controls":`sidebar`,"aria-expanded":U.value,title:U.value?`Hide sidebar`:`Show sidebar`,onClick:yt,children:[K(Xn,{}),K(`span`,{class:`visually-hidden`,children:U.value?`Hide sidebar`:`Show sidebar`})]}),K(`div`,{class:`brand`,children:[K(`span`,{class:`wordmark`,children:`Loupe`}),K(`a`,{class:`title`,href:W({page:`dashboard`}),children:t})]}),K(`span`,{class:`run-status run-${n.status}`,children:[K(X,{outcome:n.status===`passed`?`passed`:`failed`,decorative:!0}),Kr[n.status]??n.status]}),K(`ul`,{class:`counts`,"aria-label":`Test counts`,children:Ft.map(e=>K(`li`,{class:n.stats[e]===0?`count zero`:`count`,title:Y(e),children:[K(X,{outcome:e}),K(`span`,{class:`count-value`,children:n.stats[e]})]},e))}),K(`dl`,{class:`run-meta`,children:r.map(([e,t,n])=>K(`div`,{title:n,children:[K(`dt`,{children:e}),K(`dd`,{children:t})]},e))}),K(Zr,{})]}),n.scope===`partial`&&K(`div`,{class:`banner banner-partial`,role:`note`,children:[K(Z,{}),K(`p`,{children:[K(`strong`,{children:`Partial run.`}),` Only part of the suite ran, so these results do not cover every test.`,n.scopeReasons.length>0&&K(S,{children:[` `,`Detected from: `,n.scopeReasons.map(Jr).join(`, `),`.`]})]})]})]})}function $r({roots:e,route:t}){let n=t.page===`test`?Fn(t.id,t.repeatEachIndex):null,[r,i]=De(()=>new Set(e.map(e=>e.key))),[a,o]=De(null),s=N(new Map),c=N(!1),l=N(!1),[u,d]=De(null),f=N(null),p=bt.value;Ae(()=>{p&&e.some(e=>e.key===p.key)&&(d(p.key),i(e=>e.has(p.key)?e:new Set([...e,p.key])),f.current=p.key,o(p.key))},[e,p]),Ae(()=>{n&&d(null)},[n]),Ae(()=>{if(!n)return;let t=Gn(e,n);t&&(l.current=!0,o(n),i(e=>t.every(t=>e.has(t))?e:new Set([...e,...t])))},[e,n]);let m=P(()=>Wn(e,r),[e,r]),h=P(()=>new Map(m.map((e,t)=>[e.node.key,t])),[m]),g=a!==null&&h.has(a)?a:n!==null&&h.has(n)?n:m[0]?.node.key??null;if(Ae(()=>{l.current&&n&&s.current.has(n)&&(l.current=!1,s.current.get(n)?.scrollIntoView({block:`nearest`}));let e=f.current===null?void 0:s.current.get(f.current);e&&(f.current=null,e.focus({preventScroll:!0}),e.scrollIntoView({block:`nearest`})),c.current&&g&&(c.current=!1,s.current.get(g)?.focus())}),e.length===0)return K(`p`,{class:`tree-empty`,children:`No tests in this run.`});let _=e=>{e&&(c.current=!0,o(e.node.key))},v=(e,t)=>{i(n=>{if(n.has(e)===t)return n;let r=new Set(n);return t?r.add(e):r.delete(e),r})};return K(`div`,{class:`tree-section`,children:[K(`div`,{class:`tree-toolbar`,children:[K(`h2`,{id:`tree-heading`,children:`Tests`}),K(`button`,{type:`button`,class:`text-button`,onClick:()=>i(new Set(Kn(e))),children:`Expand all`}),K(`button`,{type:`button`,class:`text-button`,onClick:()=>i(new Set),children:`Collapse all`})]}),K(`ul`,{class:`tree`,role:`tree`,"aria-labelledby":`tree-heading`,onKeyDown:e=>{if(g===null||e.altKey||e.ctrlKey||e.metaKey)return;let t=h.get(g)??0,n=m[t];if(!n)return;let{node:i}=n,a=i.kind!==`test`,o=a&&r.has(i.key);switch(e.key){case`ArrowDown`:_(m[t+1]);break;case`ArrowUp`:_(m[t-1]);break;case`Home`:_(m[0]);break;case`End`:_(m[m.length-1]);break;case`ArrowRight`:a&&!o?v(i.key,!0):o&&_(m[t+1]);break;case`ArrowLeft`:o?v(i.key,!1):n.parentKey!==null&&_(m[h.get(n.parentKey)??-1]);break;case`Enter`:case` `:i.kind===`test`?Pt({page:`test`,id:i.testId,repeatEachIndex:i.repeatEachIndex}):v(i.key,!o);break;default:return}e.preventDefault()},children:m.map(e=>{let{key:t}=e.node,i={ref:e=>{e?s.current.set(t,e):s.current.delete(t)},role:`treeitem`,"aria-level":e.level,"aria-setsize":e.siblings,"aria-posinset":e.position,tabIndex:t===g?0:-1,style:{"--level":e.level},onFocus:()=>o(t)};return e.node.kind===`test`?K(`li`,{...i,class:`tree-row tree-test`,"aria-selected":t===n,children:K(ei,{node:e.node})},t):K(`li`,{...i,class:`tree-row tree-group tree-${e.node.kind}${t===u?` revealed`:``}`,"aria-expanded":r.has(t),children:K(ti,{node:e.node,onToggle:()=>v(t,!r.has(t))})},t)})})]})}function ei({node:e}){return K(`a`,{class:`row-content`,tabIndex:-1,href:W({page:`test`,id:e.testId,repeatEachIndex:e.repeatEachIndex}),children:[K(X,{outcome:e.outcome}),K(`span`,{class:`row-label`,children:e.title}),e.repeatEachIndex>0&&K(`span`,{class:`row-note`,children:[`repeat `,e.repeatEachIndex]})]})}function ti({node:e,onToggle:t}){let{counts:n}=e,r=[G(n.total,`test`),`${n.failed} failed`,...n.flaky>0?[`${n.flaky} flaky`]:[]].join(`, `);return K(`div`,{class:`row-content`,onClick:t,children:[K(Yn,{class:`chevron`}),K(`span`,{class:`row-label`,title:e.labels.join(` › `),children:e.labels.map((e,t)=>K(`span`,{class:`label-part`,children:e},t))}),K(`span`,{class:`row-counts`,title:r,children:[K(`span`,{class:`visually-hidden`,children:r}),n.failed>0&&K(`span`,{class:`badge badge-failed`,"aria-hidden":`true`,children:n.failed}),K(`span`,{class:`row-total`,"aria-hidden":`true`,children:n.total})]})]})}function ni({page:e,route:t,children:n,class:r}){return K(`li`,{children:K(`a`,{class:`nav-link ${r??``}`,href:W({page:e}),"aria-current":t.page===e?`page`:void 0,children:n})})}function ri({report:e,tree:t,route:n,open:r}){let i=e.run.errors.length;return K(`nav`,{id:`sidebar`,class:`sidebar`,"aria-label":`Report`,hidden:!r,children:[K(`ul`,{class:`nav-fixed`,children:[K(ni,{page:`dashboard`,route:n,children:[K(er,{}),K(`span`,{children:`Overview`})]}),K(ni,{page:`errors`,route:n,class:i>0?`nav-has-run-errors`:void 0,children:[K(tr,{}),K(`span`,{children:`Errors`}),i>0&&K(`span`,{class:`nav-marker`,title:G(i,`run error`),children:[K(Z,{}),K(`span`,{class:`badge badge-failed`,children:i}),K(`span`,{class:`visually-hidden`,children:[`, `,G(i,`run error`)]})]})]}),K(ni,{page:`health`,route:n,children:[K(nr,{}),K(`span`,{children:`Suite health`})]})]}),K($r,{roots:t,route:n})]})}function ii({report:e,settings:t}){let n=P(()=>Hn(e),[e]),r=P(()=>new Map(e.tests.map(e=>[Fn(e.id,e.repeatEachIndex),e])),[e]),i=P(()=>Lt(e),[e]),{route:a}=Nt.value,o=N(null);ke(()=>{(a.page!==`errors`||a.category===void 0)&&o.current?.scrollTo(0,0),vt()&&(U.value=!1)},[JSON.stringify(a)]);let s;switch(a.page){case`dashboard`:s=K(Lr,{report:e,groups:i});break;case`errors`:s=K(Mr,{report:e,groups:i,category:a.category});break;case`health`:s=K(Ir,{report:e});break;case`test`:s=K(Rr,{test:r.get(Fn(a.id,a.repeatEachIndex))});break;case`group`:s=K(Fr,{report:e,group:i.find(e=>e.signature===a.signature)});break;case`not-found`:s=K(Nr,{})}return K(`div`,{class:`app ${U.value?`sidebar-open`:`sidebar-closed`}`,children:[K(Qr,{report:e,title:t.title}),K(`div`,{class:`layout`,children:[K(ri,{report:e,tree:n,route:a,open:U.value}),K(`main`,{class:`main`,ref:o,tabIndex:-1,children:[s,K(zr,{version:e.generator.version})]})]})]})}var ai={title:`Loupe report`,theme:`system`,screenshots:{defaultView:`side-by-side`}};function oi(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function si(e){let t;try{t=JSON.parse(e??``)}catch{return{ok:!1,message:`The report data is missing or is not valid JSON.`}}return oi(t)?t.schemaVersion===1?!oi(t.run)||!Array.isArray(t.tests)||!Array.isArray(t.projects)?{ok:!1,message:`The report data is incomplete: run, projects or tests is missing.`}:{ok:!0,report:t}:{ok:!1,message:`Unsupported report schema version ${JSON.stringify(t.schemaVersion)}: this renderer reads version 1.`}:{ok:!1,message:`The report data is not a Loupe report.`}}function ci(e){try{let t=JSON.parse(e??``);return oi(t)?{...ai,...t,screenshots:{...ai.screenshots,...oi(t.screenshots)?t.screenshots:{}}}:ai}catch{return ai}}var li=ci(document.getElementById(`loupe-settings`)?.textContent);document.title=li.title,Wr(li.theme);var ui=si(document.getElementById(`loupe-data`)?.textContent),di=document.getElementById(`app`)??document.body;he(ui.ok?K(ii,{report:ui.report,settings:li}):K(`div`,{class:`load-error`,role:`alert`,children:[K(`h1`,{children:`Loupe could not open this report`}),K(`p`,{children:ui.message})]}),di);</script>
|
|
9
|
+
<style>@font-face{font-family:DM Sans;font-style:normal;font-weight:400;font-display:swap;src:url(data:font/woff2;base64,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)format("woff2")}@font-face{font-family:DM Sans;font-style:normal;font-weight:600;font-display:swap;src:url(data:font/woff2;base64,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)format("woff2")}:root{--bg:#f7f5f0;--bg-card:#fff;--bg-muted:#eeeae2;--fg:#111;--fg-secondary:#666;--border:#e8e4dc;--border-control:#8a857c;--status-passed:#3e6e51;--status-failed:#b3261e;--status-flaky:#6b4a05;--status-flaky-bg:#fbf0d9;--status-skipped:#666;--shadow:0 8px 24px #1111111f;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#080808;--bg-card:#0d0d0d;--bg-muted:#161616;--fg:#f0ede8;--fg-secondary:#8a8a8a;--border:#262626;--border-control:#6b6b6b;--status-passed:#7da88a;--status-failed:#f28b82;--status-flaky:#f0cf8a;--status-flaky-bg:#1f1705;--status-skipped:#8a8a8a;--shadow:0 8px 24px #0009;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:root:not([data-theme=light]) .category-badge,:root:not([data-theme=light]) .category-bar{--cat-text:var(--cat-text-dark);--cat-bg:var(--cat-bg-dark);--cat-border:var(--cat-border-dark)}}:root[data-theme=dark]{--bg:#080808;--bg-card:#0d0d0d;--bg-muted:#161616;--fg:#f0ede8;--fg-secondary:#8a8a8a;--border:#262626;--border-control:#6b6b6b;--status-passed:#7da88a;--status-failed:#f28b82;--status-flaky:#f0cf8a;--status-flaky-bg:#1f1705;--status-skipped:#8a8a8a;--shadow:0 8px 24px #0009;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:root{--font-sans:"DM Sans", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace}.category-badge,.category-bar{--cat-text:var(--cat-text-light);--cat-bg:var(--cat-bg-light);--cat-border:var(--cat-border-light)}:root[data-theme=dark] .category-badge,:root[data-theme=dark] .category-bar{--cat-text:var(--cat-text-dark);--cat-bg:var(--cat-bg-dark);--cat-border:var(--cat-border-dark)}*{box-sizing:border-box}html,body{height:100%}body{background:var(--bg);color:var(--fg);font:14px/1.5 var(--font-sans);margin:0}#app{height:100%}a{color:var(--fg);text-decoration:underline;-webkit-text-decoration-color:var(--border-control);text-decoration-color:var(--border-control);text-underline-offset:2px}a:hover{text-decoration-color:currentColor}:focus-visible{outline:2px solid var(--fg);outline-offset:2px}code,pre,kbd{font-family:var(--font-mono);font-size:12.5px}h1,h2,h3,strong,b{font-weight:600}[hidden]{display:none!important}.visually-hidden{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.muted{color:var(--fg-secondary)}.icon{flex:none;display:block}.app{flex-direction:column;height:100%;display:flex}.layout{flex:1;min-height:0;display:flex;position:relative}.main{flex-direction:column;flex:1;min-width:0;display:flex;overflow:auto}.main:focus{outline:none}.main>.page{flex:1}.header{border-bottom:1px solid var(--border);background:var(--bg-card);flex-wrap:wrap;align-items:center;gap:8px 16px;padding:8px 16px;display:flex}.brand{align-items:baseline;gap:10px;min-width:0;display:flex}.wordmark{color:var(--status-passed);letter-spacing:-.01em;font-size:18px;font-weight:600}.header .title{min-width:0;color:inherit;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;text-decoration:none;overflow:hidden}.header .title:hover{text-decoration:underline}.run-status{border:1px solid;border-radius:999px;align-items:center;gap:4px;padding:1px 8px 1px 4px;font-size:12px;font-weight:600;display:inline-flex}.run-passed{color:var(--status-passed)}.run-failed,.run-timedout,.run-interrupted{color:var(--status-failed)}.counts{gap:12px;margin:0;padding:0;list-style:none;display:flex}.count{font-variant-numeric:tabular-nums;align-items:center;gap:4px;font-weight:600;display:flex}.count.zero{font-weight:400}.count.zero .outcome-icon{color:var(--fg-secondary)}.run-meta{color:var(--fg-secondary);flex-wrap:wrap;gap:4px 16px;margin:0;font-size:13px;display:flex}.run-meta div{gap:4px;min-width:0;display:flex}.run-meta dt:after{content:":"}.run-meta dd{color:var(--fg);text-overflow:ellipsis;white-space:nowrap;margin:0;overflow:hidden}.theme-switch{border:1px solid var(--border-control);border-radius:6px;margin-left:auto;display:flex}.theme-switch .icon-button{border-radius:0}.theme-switch .icon-button:first-child{border-radius:5px 0 0 5px}.theme-switch .icon-button:last-child{border-radius:0 5px 5px 0}.theme-switch [aria-pressed=true]{background:var(--bg-muted);color:var(--fg)}.icon-button{width:30px;height:30px;color:var(--fg-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;padding:0;display:inline-flex}.icon-button:hover{background:var(--bg-muted);color:var(--fg)}.text-button{color:var(--fg-secondary);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:2px 6px;font-size:12px}.text-button:hover{background:var(--bg-card);color:var(--fg)}.banner{border-bottom:1px solid var(--border);background:var(--status-flaky-bg);color:var(--status-flaky);align-items:flex-start;gap:8px;padding:8px 16px;display:flex}.banner .icon{margin-top:2px}.banner p{margin:0}.outcome-icon{align-items:center;gap:6px;display:inline-flex}.outcome-passed{color:var(--status-passed)}.outcome-failed{color:var(--status-failed)}.outcome-flaky{color:var(--status-flaky)}.outcome-skipped{color:var(--status-skipped)}.outcome-text{font-weight:600}.badge{text-align:center;font-variant-numeric:tabular-nums;border-radius:999px;min-width:20px;padding:0 6px;font-size:12px;font-weight:600;line-height:16px;display:inline-block}.badge-failed{color:var(--status-failed);border:1px solid}.category-badge{border:1px solid var(--cat-border);background:var(--cat-bg);max-width:100%;color:var(--cat-text);white-space:nowrap;text-overflow:ellipsis;border-radius:999px;align-items:center;padding:0 8px;font-size:12px;font-weight:600;line-height:20px;display:inline-flex;overflow:hidden}.sidebar{border-right:1px solid var(--border);background:var(--bg-muted);flex-direction:column;flex:none;width:340px;max-width:85vw;display:flex;overflow:auto}.nav-fixed{border-bottom:1px solid var(--border);margin:0;padding:8px;list-style:none}.nav-link{color:inherit;border-radius:6px;align-items:center;gap:8px;padding:4px 8px;text-decoration:none;display:flex}.nav-link:hover{background:var(--bg-card)}.nav-link[aria-current=page]{background:var(--bg-card);box-shadow:inset 3px 0 0 var(--fg);font-weight:600}.nav-link .icon{color:var(--fg-secondary)}.nav-marker{align-items:center;gap:4px;margin-left:auto;display:inline-flex}.nav-marker .icon{color:var(--status-failed)}.tree-section{padding:8px 0}.tree-toolbar{align-items:center;gap:2px;padding:0 8px 4px 16px;display:flex}.tree-toolbar h2{color:var(--fg-secondary);text-transform:uppercase;letter-spacing:.04em;flex:1;margin:0;font-size:12px;font-weight:600}.tree-empty{color:var(--fg-secondary);padding:0 16px}.tree{margin:0;padding:0 8px;list-style:none}.tree-row{outline-offset:-2px;border-radius:6px}.row-content{min-height:28px;padding:2px 8px 2px calc((var(--level) - 1) * 16px + 8px);color:inherit;cursor:pointer;align-items:center;gap:6px;text-decoration:none;display:flex}.tree-row:hover{background:var(--bg-card)}.tree-test[aria-selected=true],.tree-row.revealed{background:var(--bg-card);box-shadow:inset 3px 0 0 var(--fg)}.tree-test[aria-selected=true]{font-weight:600}.chevron{color:var(--fg-secondary);transition:transform .1s}.tree-group[aria-expanded=true]>.row-content .chevron{transform:rotate(90deg)}.tree-project>.row-content{font-weight:600}.row-label{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.label-part+.label-part:before{content:" › ";color:var(--fg-secondary)}.row-note{color:var(--fg-secondary);font-size:12px;font-weight:400}.row-counts{flex:none;align-items:center;gap:6px;display:flex}.row-total{min-width:20px;color:var(--fg-secondary);text-align:right;font-variant-numeric:tabular-nums;font-size:12px}.page{padding:24px}.page h1{margin:0 0 12px;font-size:22px;line-height:1.3}.breadcrumb{color:var(--fg-secondary);overflow-wrap:anywhere;margin:0 0 4px;font-size:13px}.test-title{overflow-wrap:anywhere}pre.message{background:var(--bg-muted);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:6px;margin:0;padding:8px 12px;overflow:auto}.run-errors{flex-direction:column;gap:16px;margin:0;padding:0;list-style:none;display:flex}.run-error{border:1px solid var(--border);border-left:3px solid var(--status-failed);background:var(--bg-card);border-radius:6px;padding:12px 16px}.run-error-meta{color:var(--fg-secondary);flex-wrap:wrap;align-items:center;gap:4px 12px;font-size:13px;display:flex}.run-error pre{background:var(--bg-muted);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:6px;margin:8px 0 0;padding:8px 12px;overflow:auto}.run-error details{margin-top:8px}.run-error summary{color:var(--fg-secondary);cursor:pointer}.load-error{max-width:640px;margin:48px auto;padding:0 16px}.load-error h1{color:var(--status-failed);font-size:20px}.page{container-type:inline-size}.view{flex-direction:column;gap:16px;display:flex}.view>*,.view h1{max-width:1280px}.view>h1{margin-bottom:0}.widget{border:1px solid var(--border);background:var(--bg-card);border-radius:8px;min-width:0;padding:16px}.widget>h2{margin:0 0 12px;font-size:15px;line-height:1.3}.widget-note{color:var(--fg-secondary);margin:-8px 0 12px;font-size:13px}.widget-hint{color:var(--fg-secondary);margin:12px 0 0;font-size:13px}.widget-list{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.widget-list>li{border-top:1px solid var(--border)}.widget-list>li:first-child{border-top:0}.widget-more{margin:8px 0 0}.widget-grid{grid-template-columns:repeat(auto-fit,minmax(max(380px,50% - 8px),1fr));align-items:start;gap:16px;display:grid}.widget-grid>:last-child:nth-child(odd){grid-column:1/-1}@container (width<=900px){.widget-grid{grid-template-columns:minmax(0,1fr)}}.verdict{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 32px;display:flex}.verdict-outcome{align-items:center;gap:10px;margin:0;font-size:22px;font-weight:600;display:flex}.verdict-outcome .icon{width:28px;height:28px}.verdict-outcome.outcome-flaky{background:var(--status-flaky-bg);border-radius:8px;padding:2px 12px 2px 8px}.verdict-meta{color:var(--fg-secondary);font-variant-numeric:tabular-nums;margin:0}.verdict-meta strong{color:var(--fg)}.outcome-bar{border-radius:5px;gap:2px;height:10px;margin:12px 0 8px;display:flex;overflow:hidden}.outcome-bar-part{flex-basis:0;min-width:4px}.bar-passed{background:var(--status-passed)}.bar-failed{background:var(--status-failed)}.bar-flaky{background:var(--status-flaky)}.bar-skipped{background:var(--status-skipped)}.outcome-legend{color:var(--fg-secondary);font-variant-numeric:tabular-nums;flex-wrap:wrap;gap:4px 16px;margin:0;padding:0;font-size:13px;list-style:none;display:flex}.outcome-legend li{align-items:center;gap:4px;display:flex}.widget-run-errors{border-left:3px solid var(--status-failed)}.widget-run-errors h2{align-items:center;gap:8px;display:flex}.widget-run-errors h2 .icon{color:var(--status-failed)}.widget-run-errors .widget-list code{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.widget-run-errors .widget-list li{padding:6px 0}.group-row{color:inherit;flex-direction:column;gap:2px;padding:8px 4px;text-decoration:none;display:flex}.group-row:hover{background:var(--bg-muted)}.group-row-head{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:4px 12px;display:flex}.group-test{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.group-row:hover .group-test{text-decoration:underline}.group-message{color:var(--fg-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.group-count{font-variant-numeric:tabular-nums;white-space:nowrap;font-weight:600}.group-split{font-variant-numeric:tabular-nums;white-space:nowrap;flex-wrap:wrap;gap:4px 12px;font-weight:600;display:inline-flex}.group-split-part{align-items:center;gap:4px;display:inline-flex}.category-bars{grid-template-columns:minmax(0,max-content) minmax(40px,1fr) auto;display:grid}.category-bars>li{grid-column:1/-1;grid-template-columns:subgrid;display:grid}.category-bar-row{grid-column:1/-1;grid-template-columns:subgrid;color:inherit;align-items:center;gap:8px;padding:6px 4px;text-decoration:none;display:grid}.category-bar-row:hover{background:var(--bg-muted)}.category-bar-row .category-badge{justify-self:start}.category-bar-track{height:8px;display:block}.category-bar{background:var(--cat-border);border-radius:4px;min-width:4px;height:100%;display:block}.category-list>li>details>summary{cursor:pointer;align-items:center;gap:8px;padding:8px 4px;list-style:none;display:flex}.category-list>li>details>summary::-webkit-details-marker{display:none}.category-list>li>details>summary:hover{background:var(--bg-muted)}.category-list summary .chevron{transition:transform .1s}.category-list details[open]>summary .chevron{transform:rotate(90deg)}.category-list summary .group-count{margin-left:auto}.category-list .widget-list{margin:0 0 8px 28px}.project-cards{flex-wrap:wrap;gap:12px;margin:0;padding:0;list-style:none;display:flex}.project-cards>li{flex:240px;min-width:0}.project-card{border:1px solid var(--border-control);background:var(--bg-card);width:100%;height:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;border-radius:8px;flex-direction:column;gap:6px;padding:12px;display:flex}.project-card:hover{background:var(--bg-muted)}.project-name{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.project-card .counts{flex-wrap:wrap;font-size:13px}.project-meta{color:var(--fg-secondary);font-size:13px}.data-table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%}.data-table th,.data-table td{border-top:1px solid var(--border);text-align:right;vertical-align:top;padding:6px 8px}.data-table thead th{color:var(--fg-secondary);border-top:0;font-size:12px;font-weight:600}.data-table thead th .outcome-icon{justify-content:flex-end}.data-table th:first-child,.data-table td:first-child{text-align:left}.data-table .zero{color:var(--fg-secondary)}.data-table tbody th{overflow-wrap:anywhere;font-weight:400}.dimension-bars{grid-template-columns:minmax(0,max-content) minmax(60px,1fr) auto auto;align-items:center;gap:0 12px;margin:0;padding:0;list-style:none;display:grid}.dimension-bar-row{grid-column:1/-1;grid-template-columns:subgrid;border-top:1px solid var(--border);align-items:center;padding:6px 0;display:grid}.dimension-bar-row:first-child{border-top:0}.dimension-value-cell{overflow-wrap:anywhere;min-width:0}.dimension-bar{height:10px;margin:0}.dimension-bar:empty{background:var(--bg-muted)}.dimension-bar-counts{justify-content:flex-end;gap:10px;font-size:13px;display:flex}.dimension-bar-counts .count{font-weight:600}.dimension-total{min-width:28px;color:var(--fg-secondary);text-align:right;font-variant-numeric:tabular-nums;font-size:13px}.tile-summary{margin:0 0 10px;font-size:13px}.dimension-tiles{grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:6px;margin:0;padding:0;list-style:none;display:grid}.dimension-tile{border:1px solid var(--border);border-left:4px solid var(--tile-color);background:var(--bg-card);cursor:default;border-radius:6px;align-items:center;gap:6px;min-width:0;padding:6px 8px;font-size:13px;display:flex;position:relative}.dimension-tile:hover,.dimension-tile:focus-visible{background:var(--bg-muted)}.tile-failed{--tile-color:var(--status-failed)}.tile-flaky{--tile-color:var(--status-flaky);background:var(--status-flaky-bg)}.tile-passed{--tile-color:var(--status-passed)}.tile-skipped,.tile-none{--tile-color:var(--status-skipped)}.tile-failed .tile-value,.tile-flaky .tile-value{font-weight:600}.tile-value{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.tile-icon-none{border:1.4px dashed var(--status-skipped);border-radius:50%;flex:none;width:16px;height:16px}.tile-flag{color:var(--status-flaky)}.tile-details{z-index:5;border:1px solid var(--border-control);background:var(--bg-card);min-width:180px;max-width:280px;box-shadow:var(--shadow);color:var(--fg);overflow-wrap:anywhere;border-radius:6px;flex-direction:column;gap:2px;padding:8px 10px;font-weight:400;display:none;position:absolute;bottom:calc(100% + 6px);left:0}.tooltip-open .tile-details{display:flex}.tile-details:after{content:"";height:8px;position:absolute;top:100%;left:0;right:0}.tile-note{color:var(--status-flaky)}.dimension-table{margin-top:12px}.dimension-table>summary{color:var(--fg-secondary);cursor:pointer;align-items:center;gap:4px;font-size:13px;list-style:none;display:inline-flex}.dimension-table>summary::-webkit-details-marker{display:none}.dimension-table>summary:hover{color:var(--fg)}.dimension-table[open]>summary .chevron{transform:rotate(90deg)}.dimension-table>.data-table{margin-top:8px}.pass-rate{cursor:help}.pass-rate strong{color:var(--fg)}.hygiene-flag{color:var(--status-flaky);align-items:center;gap:4px;margin-top:2px;font-size:12px;display:flex}.test-line{align-items:center;gap:8px;padding:6px 0;display:flex}.test-line .test-text{flex:1;min-width:0}.test-line .test-text a{overflow-wrap:anywhere}.test-line .test-where{color:var(--fg-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;display:block;overflow:hidden}.test-line .duration{font-variant-numeric:tabular-nums;flex:none}.skip-kind{border:1px solid var(--border-control);text-transform:uppercase;border-radius:4px;padding:0 6px;font-size:11px;font-weight:600}.flaky-error{align-items:center;gap:8px;min-width:0;margin-top:2px;display:flex}.flaky-error code{color:var(--fg-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.group-meta{flex-wrap:wrap;align-items:center;gap:8px 16px;margin:0 0 16px;display:flex}.group-meta div{align-items:center;gap:6px;display:flex}.group-meta dt{color:var(--fg-secondary)}.group-meta dd{margin:0}.group-page h2{margin:24px 0 8px;font-size:16px}.affected-tests{border-collapse:collapse;width:100%}.affected-tests th,.affected-tests td{border-top:1px solid var(--border);text-align:left;vertical-align:top;overflow-wrap:anywhere;padding:6px 8px}.affected-tests thead th{color:var(--fg-secondary);border-top:0;font-size:12px;font-weight:600}.affected-tests .test-cell{align-items:flex-start;gap:6px;display:flex}.footer{border-top:1px solid var(--border);color:var(--fg-secondary);padding:16px 24px;font-size:12px}@media (width<=760px){.header{padding:8px 12px}.run-meta{order:10;width:100%}.sidebar{z-index:10;box-shadow:var(--shadow);position:absolute;inset:0 auto 0 0}.page{padding:16px}.footer{padding:12px 16px}.affected-tests thead{display:none}.affected-tests tr{border-top:1px solid var(--border);padding:6px 0;display:block}.affected-tests td{border:0;padding:2px 0;display:block}}
|
|
9
10
|
/*$vite$:1*/</style>
|
|
10
11
|
</head>
|
|
11
12
|
<body>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color math shared by the renderer (deriving category colors at render time)
|
|
3
|
+
* and the tests (contrast and distance checks): WCAG 2 contrast, CIEDE2000
|
|
4
|
+
* and OKLCH. Pure functions, no DOM, no Node imports.
|
|
5
|
+
*/
|
|
6
|
+
export type Rgb = readonly [number, number, number];
|
|
7
|
+
/** Text, background and border of a badge, for one theme. */
|
|
8
|
+
export interface Triplet {
|
|
9
|
+
text: string;
|
|
10
|
+
bg: string;
|
|
11
|
+
border: string;
|
|
12
|
+
}
|
|
13
|
+
export type ThemeName = 'light' | 'dark';
|
|
14
|
+
/** Surfaces a category badge or swatch may sit on, per theme (the renderer's --bg, --bg-card, --bg-muted). */
|
|
15
|
+
export declare const SURFACES: Readonly<Record<ThemeName, readonly string[]>>;
|
|
16
|
+
/** WCAG 2.x thresholds: normal text, and non-text UI (borders, icons). */
|
|
17
|
+
export declare const TEXT_CONTRAST = 4.5;
|
|
18
|
+
export declare const UI_CONTRAST = 3;
|
|
19
|
+
export declare function isHex(value: string): boolean;
|
|
20
|
+
export declare function parseHex(hex: string): Rgb;
|
|
21
|
+
export declare function toHex([r, g, b]: Rgb): string;
|
|
22
|
+
/** WCAG relative luminance. */
|
|
23
|
+
export declare function luminance(hex: string): number;
|
|
24
|
+
/** WCAG contrast ratio, from 1 to 21. */
|
|
25
|
+
export declare function contrast(a: string, b: string): number;
|
|
26
|
+
export interface Oklch {
|
|
27
|
+
l: number;
|
|
28
|
+
c: number;
|
|
29
|
+
/** Degrees, 0–360. */
|
|
30
|
+
h: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function toOklch(hex: string): Oklch;
|
|
33
|
+
/** OKLCH to hex, reducing chroma until the color fits in sRGB. */
|
|
34
|
+
export declare function fromOklch(color: Oklch): string;
|
|
35
|
+
export declare function toLab(hex: string): Rgb;
|
|
36
|
+
/** CIEDE2000 color difference; about 2 is barely noticeable, 15+ reads as a different color. */
|
|
37
|
+
export declare function deltaE2000(a: string, b: string): number;
|
|
38
|
+
/** Why a triplet fails the contrast rules, empty when it passes. */
|
|
39
|
+
export declare function tripletProblems(triplet: Triplet, theme: ThemeName): string[];
|
|
40
|
+
/**
|
|
41
|
+
* Badge colors for any color, per theme: a tinted background, and text and
|
|
42
|
+
* border of the same hue whose lightness is moved until the contrast rules
|
|
43
|
+
* pass (text 4.5:1 on the background, border 3:1 on the background and on the
|
|
44
|
+
* page surfaces). The result always passes: at worst the text and border go
|
|
45
|
+
* to the end of the lightness range, black or white.
|
|
46
|
+
*/
|
|
47
|
+
export declare function deriveTriplet(hex: string, theme: ThemeName): Triplet;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color math shared by the renderer (deriving category colors at render time)
|
|
3
|
+
* and the tests (contrast and distance checks): WCAG 2 contrast, CIEDE2000
|
|
4
|
+
* and OKLCH. Pure functions, no DOM, no Node imports.
|
|
5
|
+
*/
|
|
6
|
+
/** Surfaces a category badge or swatch may sit on, per theme (the renderer's --bg, --bg-card, --bg-muted). */
|
|
7
|
+
export const SURFACES = {
|
|
8
|
+
light: ['#f7f5f0', '#ffffff', '#eeeae2'],
|
|
9
|
+
dark: ['#080808', '#0d0d0d', '#161616'],
|
|
10
|
+
};
|
|
11
|
+
/** WCAG 2.x thresholds: normal text, and non-text UI (borders, icons). */
|
|
12
|
+
export const TEXT_CONTRAST = 4.5;
|
|
13
|
+
export const UI_CONTRAST = 3;
|
|
14
|
+
const HEX = /^#[0-9a-fA-F]{6}$/;
|
|
15
|
+
export function isHex(value) {
|
|
16
|
+
return HEX.test(value);
|
|
17
|
+
}
|
|
18
|
+
export function parseHex(hex) {
|
|
19
|
+
if (!isHex(hex))
|
|
20
|
+
throw new TypeError(`not a #rrggbb color: ${hex}`);
|
|
21
|
+
const value = Number.parseInt(hex.slice(1), 16);
|
|
22
|
+
return [(value >> 16) & 255, (value >> 8) & 255, value & 255];
|
|
23
|
+
}
|
|
24
|
+
export function toHex([r, g, b]) {
|
|
25
|
+
return `#${[r, g, b].map((channel) => Math.round(Math.min(255, Math.max(0, channel))).toString(16).padStart(2, '0')).join('')}`;
|
|
26
|
+
}
|
|
27
|
+
function toLinear(channel) {
|
|
28
|
+
const c = channel / 255;
|
|
29
|
+
return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
30
|
+
}
|
|
31
|
+
function fromLinear(value) {
|
|
32
|
+
const c = value <= 0.0031308 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055;
|
|
33
|
+
return c * 255;
|
|
34
|
+
}
|
|
35
|
+
/** WCAG relative luminance. */
|
|
36
|
+
export function luminance(hex) {
|
|
37
|
+
const [r, g, b] = parseHex(hex).map(toLinear);
|
|
38
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
39
|
+
}
|
|
40
|
+
/** WCAG contrast ratio, from 1 to 21. */
|
|
41
|
+
export function contrast(a, b) {
|
|
42
|
+
const [light, dark] = [luminance(a), luminance(b)].sort((x, y) => y - x);
|
|
43
|
+
return (light + 0.05) / (dark + 0.05);
|
|
44
|
+
}
|
|
45
|
+
export function toOklch(hex) {
|
|
46
|
+
const [r, g, b] = parseHex(hex).map(toLinear);
|
|
47
|
+
const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
|
|
48
|
+
const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
|
|
49
|
+
const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
|
|
50
|
+
const L = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;
|
|
51
|
+
const A = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;
|
|
52
|
+
const B = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;
|
|
53
|
+
const h = (Math.atan2(B, A) * 180) / Math.PI;
|
|
54
|
+
return { l: L, c: Math.hypot(A, B), h: h < 0 ? h + 360 : h };
|
|
55
|
+
}
|
|
56
|
+
/** Linear sRGB of an OKLCH color; may fall outside [0, 1] when out of gamut. */
|
|
57
|
+
function oklchToLinear({ l: L, c, h }) {
|
|
58
|
+
const A = c * Math.cos((h * Math.PI) / 180);
|
|
59
|
+
const B = c * Math.sin((h * Math.PI) / 180);
|
|
60
|
+
const l = (L + 0.3963377774 * A + 0.2158037573 * B) ** 3;
|
|
61
|
+
const m = (L - 0.1055613458 * A - 0.0638541728 * B) ** 3;
|
|
62
|
+
const s = (L - 0.0894841775 * A - 1.291485548 * B) ** 3;
|
|
63
|
+
return [
|
|
64
|
+
4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
|
|
65
|
+
-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
|
|
66
|
+
-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
/** OKLCH to hex, reducing chroma until the color fits in sRGB. */
|
|
70
|
+
export function fromOklch(color) {
|
|
71
|
+
let c = color.c;
|
|
72
|
+
for (;;) {
|
|
73
|
+
const rgb = oklchToLinear({ ...color, c });
|
|
74
|
+
if (rgb.every((channel) => channel >= -1e-4 && channel <= 1 + 1e-4) || c <= 0) {
|
|
75
|
+
return toHex(rgb.map((channel) => fromLinear(Math.min(1, Math.max(0, channel)))));
|
|
76
|
+
}
|
|
77
|
+
c = Math.max(0, c - 0.005);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/* CIELAB (D65) and CIEDE2000, the perceptual distance between two colors. */
|
|
81
|
+
export function toLab(hex) {
|
|
82
|
+
const [r, g, b] = parseHex(hex).map(toLinear);
|
|
83
|
+
const x = (0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / 0.95047;
|
|
84
|
+
const y = 0.2126729 * r + 0.7151522 * g + 0.072175 * b;
|
|
85
|
+
const z = (0.0193339 * r + 0.119192 * g + 0.9503041 * b) / 1.08883;
|
|
86
|
+
const f = (t) => (t > 216 / 24389 ? Math.cbrt(t) : (24389 / 27 * t + 16) / 116);
|
|
87
|
+
return [116 * f(y) - 16, 500 * (f(x) - f(y)), 200 * (f(y) - f(z))];
|
|
88
|
+
}
|
|
89
|
+
const rad = (degrees) => (degrees * Math.PI) / 180;
|
|
90
|
+
const deg = (radians) => (radians * 180) / Math.PI;
|
|
91
|
+
/** CIEDE2000 color difference; about 2 is barely noticeable, 15+ reads as a different color. */
|
|
92
|
+
export function deltaE2000(a, b) {
|
|
93
|
+
const [L1, a1, b1] = toLab(a);
|
|
94
|
+
const [L2, a2, b2] = toLab(b);
|
|
95
|
+
const C1 = Math.hypot(a1, b1);
|
|
96
|
+
const C2 = Math.hypot(a2, b2);
|
|
97
|
+
const Cbar7 = ((C1 + C2) / 2) ** 7;
|
|
98
|
+
const G = 0.5 * (1 - Math.sqrt(Cbar7 / (Cbar7 + 25 ** 7)));
|
|
99
|
+
const ap1 = (1 + G) * a1;
|
|
100
|
+
const ap2 = (1 + G) * a2;
|
|
101
|
+
const Cp1 = Math.hypot(ap1, b1);
|
|
102
|
+
const Cp2 = Math.hypot(ap2, b2);
|
|
103
|
+
const hue = (bb, ap) => (bb === 0 && ap === 0 ? 0 : (deg(Math.atan2(bb, ap)) + 360) % 360);
|
|
104
|
+
const hp1 = hue(b1, ap1);
|
|
105
|
+
const hp2 = hue(b2, ap2);
|
|
106
|
+
const dL = L2 - L1;
|
|
107
|
+
const dC = Cp2 - Cp1;
|
|
108
|
+
let dh = 0;
|
|
109
|
+
if (Cp1 * Cp2 !== 0) {
|
|
110
|
+
dh = hp2 - hp1;
|
|
111
|
+
if (dh > 180)
|
|
112
|
+
dh -= 360;
|
|
113
|
+
else if (dh < -180)
|
|
114
|
+
dh += 360;
|
|
115
|
+
}
|
|
116
|
+
const dH = 2 * Math.sqrt(Cp1 * Cp2) * Math.sin(rad(dh / 2));
|
|
117
|
+
const Lbar = (L1 + L2) / 2;
|
|
118
|
+
const Cbar = (Cp1 + Cp2) / 2;
|
|
119
|
+
let hbar = hp1 + hp2;
|
|
120
|
+
if (Cp1 * Cp2 !== 0) {
|
|
121
|
+
if (Math.abs(hp1 - hp2) <= 180)
|
|
122
|
+
hbar /= 2;
|
|
123
|
+
else
|
|
124
|
+
hbar = hp1 + hp2 < 360 ? (hbar + 360) / 2 : (hbar - 360) / 2;
|
|
125
|
+
}
|
|
126
|
+
const T = 1 - 0.17 * Math.cos(rad(hbar - 30)) + 0.24 * Math.cos(rad(2 * hbar)) + 0.32 * Math.cos(rad(3 * hbar + 6)) - 0.2 * Math.cos(rad(4 * hbar - 63));
|
|
127
|
+
const SL = 1 + (0.015 * (Lbar - 50) ** 2) / Math.sqrt(20 + (Lbar - 50) ** 2);
|
|
128
|
+
const SC = 1 + 0.045 * Cbar;
|
|
129
|
+
const SH = 1 + 0.015 * Cbar * T;
|
|
130
|
+
const Cbar7p = Cbar ** 7;
|
|
131
|
+
const RT = -2 * Math.sqrt(Cbar7p / (Cbar7p + 25 ** 7)) * Math.sin(rad(60 * Math.exp(-(((hbar - 275) / 25) ** 2))));
|
|
132
|
+
return Math.sqrt((dL / SL) ** 2 + (dC / SC) ** 2 + (dH / SH) ** 2 + RT * (dC / SC) * (dH / SH));
|
|
133
|
+
}
|
|
134
|
+
/* Contrast rules for a category badge, and deriving a badge from any color. */
|
|
135
|
+
/** Why a triplet fails the contrast rules, empty when it passes. */
|
|
136
|
+
export function tripletProblems(triplet, theme) {
|
|
137
|
+
const problems = [];
|
|
138
|
+
const text = contrast(triplet.text, triplet.bg);
|
|
139
|
+
if (text < TEXT_CONTRAST)
|
|
140
|
+
problems.push(`text ${triplet.text} on ${triplet.bg}: ${text.toFixed(2)}`);
|
|
141
|
+
for (const background of [triplet.bg, ...SURFACES[theme]]) {
|
|
142
|
+
const border = contrast(triplet.border, background);
|
|
143
|
+
if (border < UI_CONTRAST)
|
|
144
|
+
problems.push(`border ${triplet.border} on ${background}: ${border.toFixed(2)}`);
|
|
145
|
+
}
|
|
146
|
+
return problems;
|
|
147
|
+
}
|
|
148
|
+
/** Steps lightness from `start` towards `end` until `passes`; the end value when nothing passes. */
|
|
149
|
+
function adjustLightness(base, start, end, passes) {
|
|
150
|
+
const step = start < end ? 0.01 : -0.01;
|
|
151
|
+
for (let l = start; step > 0 ? l <= end : l >= end; l += step) {
|
|
152
|
+
const hex = fromOklch({ ...base, l });
|
|
153
|
+
if (passes(hex))
|
|
154
|
+
return hex;
|
|
155
|
+
}
|
|
156
|
+
return fromOklch({ ...base, l: end });
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Badge colors for any color, per theme: a tinted background, and text and
|
|
160
|
+
* border of the same hue whose lightness is moved until the contrast rules
|
|
161
|
+
* pass (text 4.5:1 on the background, border 3:1 on the background and on the
|
|
162
|
+
* page surfaces). The result always passes: at worst the text and border go
|
|
163
|
+
* to the end of the lightness range, black or white.
|
|
164
|
+
*/
|
|
165
|
+
export function deriveTriplet(hex, theme) {
|
|
166
|
+
const base = toOklch(hex);
|
|
167
|
+
// Greys (no hue) stay grey.
|
|
168
|
+
const chroma = base.c < 0.02 ? 0 : base.c;
|
|
169
|
+
const surfaces = SURFACES[theme];
|
|
170
|
+
if (theme === 'light') {
|
|
171
|
+
const bg = fromOklch({ ...base, l: 0.955, c: Math.min(chroma, 0.03) });
|
|
172
|
+
const text = adjustLightness({ ...base, c: Math.min(chroma, 0.16) }, 0.5, 0, (t) => contrast(t, bg) >= TEXT_CONTRAST);
|
|
173
|
+
const border = adjustLightness({ ...base, c: Math.min(chroma, 0.18) }, 0.66, 0, (b) => [bg, ...surfaces].every((surface) => contrast(b, surface) >= UI_CONTRAST));
|
|
174
|
+
return { text, bg, border };
|
|
175
|
+
}
|
|
176
|
+
const bg = fromOklch({ ...base, l: 0.26, c: Math.min(chroma, 0.05) });
|
|
177
|
+
const text = adjustLightness({ ...base, c: Math.min(chroma, 0.12) }, 0.8, 1, (t) => contrast(t, bg) >= TEXT_CONTRAST);
|
|
178
|
+
const border = adjustLightness({ ...base, c: Math.min(chroma, 0.14) }, 0.6, 1, (b) => [bg, ...surfaces].every((surface) => contrast(b, surface) >= UI_CONTRAST));
|
|
179
|
+
return { text, bg, border };
|
|
180
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category palette: the single source of truth for category colors, imported
|
|
3
|
+
* by the reporter (names → reference colors written to the report) and by the
|
|
4
|
+
* renderer (reference colors → per-theme badge colors).
|
|
5
|
+
*
|
|
6
|
+
* Each entry has a name usable in the config (`color: 'teal'`), a reference
|
|
7
|
+
* color (the `#rrggbb` value the report carries) and hand-tuned text /
|
|
8
|
+
* background / border triplets per theme. The hues avoid reds and greens, so
|
|
9
|
+
* a category never reads as a failed or passed status. The contrast and
|
|
10
|
+
* distance rules are checked by `test/palette.test.ts`.
|
|
11
|
+
*
|
|
12
|
+
* The order matters: categories without a configured color take the free
|
|
13
|
+
* entries in this order.
|
|
14
|
+
*
|
|
15
|
+
* Kept free of Node imports so the renderer can import it.
|
|
16
|
+
*/
|
|
17
|
+
export interface PaletteTriplet {
|
|
18
|
+
text: string;
|
|
19
|
+
bg: string;
|
|
20
|
+
border: string;
|
|
21
|
+
}
|
|
22
|
+
export interface PaletteEntry {
|
|
23
|
+
name: string;
|
|
24
|
+
/** The `#rrggbb` color written to the report for this entry. */
|
|
25
|
+
reference: string;
|
|
26
|
+
light: PaletteTriplet;
|
|
27
|
+
dark: PaletteTriplet;
|
|
28
|
+
}
|
|
29
|
+
export declare const PALETTE_ENTRIES: readonly PaletteEntry[];
|
|
30
|
+
/** The uncategorized bucket: neutral grey, not selectable by name. */
|
|
31
|
+
export declare const NEUTRAL_ENTRY: PaletteEntry;
|
|
32
|
+
/** Names accepted by `categories.rules[].color`, in palette order. */
|
|
33
|
+
export declare const PALETTE_NAMES: readonly string[];
|
|
34
|
+
/** Reference color of a palette entry; throws for an unknown name (config validation reports it first). */
|
|
35
|
+
export declare function paletteReference(name: string): string;
|
|
36
|
+
/** The palette entry (or the neutral one) whose reference color is `hex`, case-insensitive; null for any other color. */
|
|
37
|
+
export declare function paletteEntryByReference(hex: string): PaletteEntry | null;
|