From 04c1d49a15ffeddc57283ac03060df1c46477887 Mon Sep 17 00:00:00 2001 From: Alex Swearingen Date: Tue, 29 Sep 2026 15:57:30 -0500 Subject: [PATCH 1/2] Adopt the shared SlopCop documentation design Move the docs onto the foundation stylesheet shared with DataFlowBench: Apfel Grotezk and JetBrains Mono, restrained chamfers, and a centred content column with the contents list floating beside it. Tables sit in a scroll box and their long identifiers wrap at separators instead of widening the page. The landing page leads with a full-width verdict above equal columns, and scripts/preview-published-docs.sh renders the published releases locally for review. Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/astro.config.mjs | 17 +- docs/public/favicon.svg | 5 +- docs/src/assets/mark.svg | 6 + docs/src/components/LandingResults.astro | 365 ++---- docs/src/fonts/ApfelGrotezk-Fett.woff2 | Bin 0 -> 20128 bytes docs/src/fonts/ApfelGrotezk-Mittel.woff2 | Bin 0 -> 20564 bytes docs/src/fonts/ApfelGrotezk-Regular.woff2 | Bin 0 -> 19852 bytes docs/src/fonts/JetBrainsMono-wght.woff2 | Bin 0 -> 40404 bytes docs/src/fonts/OFL.txt | 100 ++ docs/src/plugins/rehype-table-scroll.mjs | 99 ++ docs/src/styles/foundation.css | 1278 +++++++++++++++++++++ docs/src/styles/usagebench.css | 462 +------- scripts/preview-published-docs.sh | 71 ++ 13 files changed, 1706 insertions(+), 697 deletions(-) create mode 100644 docs/src/assets/mark.svg create mode 100644 docs/src/fonts/ApfelGrotezk-Fett.woff2 create mode 100644 docs/src/fonts/ApfelGrotezk-Mittel.woff2 create mode 100644 docs/src/fonts/ApfelGrotezk-Regular.woff2 create mode 100644 docs/src/fonts/JetBrainsMono-wght.woff2 create mode 100644 docs/src/fonts/OFL.txt create mode 100644 docs/src/plugins/rehype-table-scroll.mjs create mode 100644 docs/src/styles/foundation.css create mode 100755 scripts/preview-published-docs.sh diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 9e1115b..24afcd2 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -1,5 +1,6 @@ import { defineConfig } from 'astro/config'; import starlight from '@astrojs/starlight'; +import { rehypeTableScroll } from './src/plugins/rehype-table-scroll.mjs'; const site = process.env.PUBLIC_DOCS_SITE ?? 'https://usagebench.brokk.ai'; const productionBase = process.env.PUBLIC_DOCS_BASE ?? '/'; @@ -8,12 +9,26 @@ const isDev = process.argv.includes('dev'); export default defineConfig({ site, base: isDev ? '/' : productionBase, + markdown: { + // Each table in a scroll box, so a wide one pans instead of overflowing. + rehypePlugins: [rehypeTableScroll], + }, integrations: [ starlight({ title: 'UsageBench', description: 'LSP-parity and recurring regression evidence for Bifrost usage analysis.', - customCss: ['./src/styles/usagebench.css'], + // The foundation is shared with DataFlowBench and kept identical to its + // copy; usagebench.css layers this site's own accent and pages on top. + customCss: ['./src/styles/foundation.css', './src/styles/usagebench.css'], favicon: '/favicon.svg', + logo: { src: './src/assets/mark.svg', alt: '' }, + expressiveCode: { + styleOverrides: { + borderRadius: '0px', + codeFontFamily: "'JetBrains Mono', ui-monospace, monospace", + uiFontFamily: "'Apfel Grotezk', ui-sans-serif, system-ui, sans-serif", + }, + }, editLink: { baseUrl: 'https://github.com/BrokkAi/usagebench/edit/main/docs/', }, diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg index 3abdb2a..287bd96 100644 --- a/docs/public/favicon.svg +++ b/docs/public/favicon.svg @@ -1,5 +1,6 @@ - - + + + diff --git a/docs/src/assets/mark.svg b/docs/src/assets/mark.svg new file mode 100644 index 0000000..287bd96 --- /dev/null +++ b/docs/src/assets/mark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/src/components/LandingResults.astro b/docs/src/components/LandingResults.astro index ada69d1..721f7d1 100644 --- a/docs/src/components/LandingResults.astro +++ b/docs/src/components/LandingResults.astro @@ -126,85 +126,84 @@ function width(value: number, shared: number): string { } --- -

- Immutable evidence · UsageBench {published ? legacyResult.release : '(unpublished)'} -

- {published && rows.length > 0 ? ( <> - +

+ Against ten reference language servers on the reviewed legacy core, + Bifrost is exact on more cases than the reference server in{' '} + {bifrostAhead} of {rows.length} comparisons, level in{' '} + {level}, and behind in {referenceAhead} + {behind.length > 0 ? ` (${behind.map((row) => row.name).join(', ')})` : ''}. +

+
+

+ Each language server is compared only on the cases it and Bifrost both + answer, so a reference server is never charged for an operation it does + not offer. These {legacy.caseCount} cases are the reviewed legacy core: + selected retrospectively from an analyzer-informed corpus, then + re-reviewed from source alone. It is the broadest comparison we publish, + and deliberately not a preregistered one; the{' '} + prospective slices carry that stronger claim over + fewer languages. +

+

+ UsageBench is BrokkAi's own + benchmark: we build it to measure where Bifrost + {' '}stands against established language servers, and to keep ourselves + honest while doing it. Every number here is generated from digest-bound + freeze evidence we cannot edit after the fact — our own misses and + regressions included. +

+
-
-

Frozen evidence · {breadthTotal} cases

-
    - {breadth.map((slice) => ( -
  • -

    {slice.tier}

    -

    {slice.caseCount} cases

    -

    {slice.label}

    -

    - {slice.release ? {slice.release} : 'no published result'} - {slice.detailed ? ' · detailed below' : ''} -

    -
  • - ))} -
-

- Each slice keeps its own denominator and they are never pooled. The - preregistered slices select and review sources before any analyzer runs; - the legacy core was selected retrospectively and re-reviewed from source - alone. -

-
+

Evidence slices

+
+

+ {breadthTotal} cases are frozen across {breadth.length} slices. Each keeps + its own denominator and they are never pooled: the preregistered slices + select and review sources before any analyzer runs, while the legacy core + was selected retrospectively. +

+
+ {breadth.map((slice) => ( +
+
{slice.label}
+
{slice.caseCount}cases
+
+ {slice.tier} · {slice.release ?? 'no published result'} +
+
+ ))} +
+
+

Legacy core, server by server

+

+ Strict-contract conformance across {totalShared} shared case comparisons, + from release {legacyResult.release} at revision{' '} + {(legacyResult.revision ?? '').slice(0, 12)}. A case counts as + exact only with complete token ranges, no unallowed extras, and the one + reviewed navigation target. Disagreement is a contract result, not an + automatic defect verdict — the{' '} + evidence map has every hash and + denominator. +

{rows.map((row) => ( -
-
-

{row.name}

- {row.toolVersion} +
+
+

{row.name}

+

{row.toolVersion}

-
- Bifrost -
-
-
- {row.strict.bifrostExact}/{row.strict.shared} - {row.name} -
-
-
- {row.strict.referenceExact}/{row.strict.shared} +
+ Bifrost + + {row.strict.bifrostExact}/{row.strict.shared} + Reference + + {row.strict.referenceExact}/{row.strict.shared}
-
+
Both exact
{row.bothExact}
Bifrost only
{row.bifrostOnly}
Reference only
{row.referenceOnly}
@@ -212,215 +211,49 @@ function width(value: number, shared: number): string {
))}
- -

- Strict-contract conformance across {totalShared} shared case comparisons, - from release {legacyResult.release} at revision{' '} - {(legacyResult.revision ?? '').slice(0, 12)}. A case counts as - exact only with complete token ranges, no unallowed extras, and the one - reviewed navigation target. Disagreement is a contract result, not an - automatic defect verdict — see the{' '} - evidence map for every hash and - denominator. -

) : ( - + )} diff --git a/docs/src/fonts/ApfelGrotezk-Fett.woff2 b/docs/src/fonts/ApfelGrotezk-Fett.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..73d6417fb2a87e9dc3e991ecd6bd1e20a1047cc2 GIT binary patch literal 20128 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

WZ7)}jU^o)@fzAq9$lo-AY&&-#`vdm0vWFFH ziOb5jJ&2z_jiZq?VH-JFMaeBH)*NSVNqG><5=)DZV%TLk{Rwk=zE)742Ag;FV7F5z z^ZhLJ_v~rmnlWLmw;_l3?*|a52l6$9Y4R?T?ww?>gCMsHxli8r25*au;7Eeyn>DkL z(ZkXYuGnIN2pi0!23)oL4E12eSJRIBFUFs%%| z`4fq*KpR=cPd!7Uz?603QDoY)a7GA3^C@%R46H0<>V5x+u6HV+Jy@X-Qc;3hEYb=V zU+jxJ@$A%pAD^i2g2D>(Zbd}33>fV9y&d9tEc0N}jr+EH@nK0*qVjTTxX=|@3+KCj zMS^u&=?Ny1I?Dnw`HrFbOJEPnX((#o_09yb0qQ0R#7i{;e4r+uCh)1O=?SmOcRk_m zL++%8yMx?&ba_QyJ^WvBjg`%#2TS=cGQ&cJTKy?D1S1wh3m+@IW1-E$aC@6eYyh!~ z$eqSpX+j)%JR^I%Av+cRZkY-bc|O-Nyhw}X@_Kw$AA5-Z4IY1XX(mT*mTi(zS7u*bWuLM$J7by+jaO!^D$HSL zcHk;aqV(G4DK66^h-bh2pgU^Gxp@kpbaatzY78EbVHzC#r71OcWR72^kaK%w$j5?3 zE1i^jJK=x2a4C$~4UV3r-lQ8Ycn%5{j8DO+BjH{<-WF~ngW&kK!ajFORmu77gfdwnzAzec-A5#RT6o%?C?5JpP74Q_{u{DrxQ8735DJ5*xqWJ0=8gd{RD1=}f zOu&H`ybWSbmTy*!OuD@sRmf0>w6v26|&yDIxohNi=}!DLpx6@C5T&eiC+v$~j9 zG5^ogKeTJ!6~2WMspJ4Rnon8eOzxDen^;VFa3>ecwv*ThJFrumwBX{c$MFftDe-e= z#N}iqbL!)WCdhvdsq;d`w~Uf4pb3^h+!3h1_}9+G)>RIPj*;)4cfkmywBWPv7B)#) z_(NF{+nbM_eYPtlF)r=&#cdIXxQi}!X!X1ub2VhqJ+#fpOKEqO=_EXd70-+fu_0+g zC^YsxP0Ie0FW*VKd-EAVn-3p3DI=6MMPV|?$3dqFV=B@N$=&(Vk&X8fIlQyy)9_Cx8T~$ z6P(CQK7a1oL!{78i$Gfw63-^vMRrEQyu>Y>ae~!s?UGGqHj)Mp>p1dKPDd#xo=sU* zkQGM~&>v4K>*UEr(^>H*WYWEFcI#xinu$u19;gq1txY^5Gg+b~U5S10i#>mJ_V?p# zW-Ta4SlWliVlWZ#)h-4LUhN{{QNT_W z5tqF5U(&Sq#ToC8>TS-msk^dsXKBXI?s)X%#?92E_$BGvIM)SMvA%a&CmVjbEckma zCsBnDlj(8KjzuLU6>nc!w9!GohV0$vo!;CIQ?%Ql&XwLKYWAKFh0!ejP`;sVN^5GP zlbTQBFuCVy4r*gV_Tyb4CN@5}d+H(3rP+Q^qW7&`v3%WHtyP7jyjo!TSOTjtqUaJc zj$=@>!91QvbJ-nf4z?#MD?wjt^|Dp20y^CH5wG6f9XHB&6q}-9 ztT|c;yF&ui-=urZh=gy(BdK_5o2Am53sgX9a1!Kv1hfF)i?n}ClvW-ai)VKN7WHRi z8o)aipP^s=?F;V&%)J9Y8jyCqt9xryxR?DmA#9+gky?LM8M9`4cO2cDtm-WvGxzXL zX+Exb*-s>B9FE*Omy`*ewiKet{4PVa1el<0+FPh?)tSKw8DcM@KYY7_} zO+i+saxQh}JYji8HJ9(*H9~gQM=xhX#T>;NKMlNtIdcTIkw`i4&i}udKl=+CY``HV zZBD0Ih*Qp09nIg81@dO=6)*bSvpev`_bV~6s%JNa*jv6H(!uIeH@9|?o#rcI>gaGA8gloC+GRSk~Ud;LA$JU?Wqr_D(VURNZV|+==Rcl5-urG zbuOn7_9J=EZ^&fWx$L8PT(1BwYC-dT5!C28Dd9_5H7XKLA*Hcp(#GkD4KNW&mXcR2Jj%#IL0f4v(}GgB4I>3tF%KdW#x_YXwn}S) z5ClR*QB3rqi4;g8MAZvQWsJELhqRM|$X%1UA53XA)k;@0A|chFgf%S5x~Pz>@Z}O( zNJ_FIC9L{}g6f305~k+CHT8W8%L{w*QXHj4-h&c!qOM-v_@_GI;f$pUpOkW(VI0S4 zM++J7`G^#1B0p8jhB?E?&tw`;EHxsd;mZ?W42g>-G@~&N%;2*_vN_EyU-KD(Oa(*Q zOjS~61_6d9Ju#YrP}~-HuO$hNx2HRu5nyRp4!Ez!Af=O4xLvyz61RoC84-$FRWGiS z?&i8GZCmw5cYfT)4XJAw*os>X<$97}`v7uj0)mzwnN9J!aEVS?)vZA2+u_BJ(Oir+2>tkf#a-|ow_BdeVGP5 z==t(vhBYSD`Rf%;M@4Md_m`q#KC>_Nis%gto8jyk-Ehs$S{+IiwNW(j5XOO%AYLs1 zF>w0eyqE-eDT*2vgD{I!3@6c=6MB;f>qc@4V^ddie^?v|w+vd$iqX;}nf`k<2{|0W z6qH{`t>~bO)R7+wKLj)NmMm@%%Pd3ExL?C-yk#`d5PXIWUXE&o-W1aG2hEM*!}1$5 z_FdD^fi~(uYrhbfO#aL*^OFpxNb<$eiwq(y!BnJ4H|g!58cr|quFto4L%%cX#noG* zLu2-luBEwi6|z3vFBC44v(VA+8**NT$x4OL1IjTZvY|*bNTq^T_`OdFy{2~z{Tyy@ z#X-VJaPjUwE22s8Wm4K`wB(3}f4>6ipjMAz8eLPQic07$--|vCl5U@fXjMh<`sRtI z*k(_&B-U$4f)@5j!%Wh`fs(%NiU zj04H|TK=J99M>&CdhU2wWlv|4Z=#&(TJl6oFu{yoGX~4vwzB(s143s%kxGjku7`qHJcY0__z==TDj($T9wBZ*A;3=Y zt23Acd0;p(x2_;u;gitSgYdvUrEm=eaUcZ5gdYe${^J?AG~ilJ@}o)<>}W8m5c55>oTNPsgEUVlcRBt*c|vL0!7RG8 zYR@r_nG;7xN*O~4X65?bLhYZx{&{e>l;r&>V-3Ea_gHU^-q9dIuQ!{U4{iPTpn@N7 zR)jOFmj%$gK$OKLBISqE^AaFfs6<)XuVS~2Yjo0GZ~YB2)&x_`ve|C?TyVz|Z+!(L z63E8ZjcZEF+S{qF_q@+&Q%e6YLs3Q(Qm8;M!iFwO*g-jFE|AA0)gXgyYN(@~e#V(s zgr+G~naWYI7O6^lth6xxg!O^)!hq5k_8~PSp3K2*os5X>BK_Z>{TG; ztGYk2)JqAOMYh`0x|gD&;Zpe=`m^881({c{KGHfD%ZiqkFIu$J(9ELMQ*7vd#Almh z;IODc=DCTglp*E!H&Y69wA2bk3$Oe$ftF3CZp@2q3DFQ$Cr8qXTxuLa`SkXMYv;LI zS&(c2C=l20QetB8)a2GXTUf#j%R%b#Pzvi@W>s?c=QS^2fu*jERf(B3mrFQg$-hcFp=BXm3CiF_$7m6Nr(r zE}cR<=sb+l^%;fnn$V)QEahpaQtY}E{!>Q*fVNoSDa8xZTtEybcqEcF3p>U*;eu}7u=J3fYPPH;R z91Sf#sdzbr^snL7JCBf?$=|aGq@#h6eX0np2CDg*njl3BzTmZe@XQGpw3lYymsyxM z7cuj8=7B_sVF8YszuXa(5Y`~>0|^YmOtKZuX}8F^eKctqErp3RPlF`Pt|YS&wsy>r z%C$7p3*lb7vD|m8BmH>|p|@AElt#myEhOxOV@X9l-dfI^g+*|#Ij1qp7?vr+ty(%f ztDdP1KwebHkbBVM4}%xbu*oFzSLZb@$KXMkpL`LRxv~bM?sy%Mfp9_;j51nvUbJ-P z=!hP25|9I63-&Fd(f)3r4X>=-85d%wq|XZ7#6FR>)b6i8rZMcRUcyZ!PJ75mt9%YK zSv&OwR4KFZ=P(`U1ijLeidGhay|B>~JJLb@G4-f6&{8x}L`8k-Y>5b-s#O#VsJ3b4 zMSJRp-8a+Atinl$ah)=MLE+prENZ^9wS-^~hpAv-Kn4=Y7Ai{B$rz7Qn`z{4+VLhr zqp=yyoc_v16o%4%Q$b0dq#}2Q9*)z{k@su;^q`7G3f>lK-$^f>HxMloS8?vs0JOf> ztle}KMvL?e4}Pm@Wc*fR-a6q4_;c~3<4cLLzhJzj+B2xEiL($R7|4*tkflsDcXBI!WI^@S@}C&ZCQkJm(a&4n6?gad#T>#(yrmMG|m z&YHST_#lWUHOJ!V&B>8xrq|)l$OitenY3aS1|Y7!R3QYjtsq1PSY0#pwsQi8}`a{lUZk?8Um{?A-E~#e?^78_MExkTplR|FlCY4?Xt8 zGta&7(kox#U-$^0kbz8O{Y7UllBCI!r%0O)LFl0t86Jz2XCitol3s{}SCkQg$Y$#! z$owUV#XuG?gBe`l1Y}sVslWzd!*oXenOE*aYH$r&0xrx~;-}9m7b%HAs>Hdyj@WXQ z5-NkpQ7$^EaO0{}ji*LEzVnkPapAmDms}xnpNiAxq(`94EI7*(h+-9TQ^}Y&lTm4XEx+|Sd_A>QZsge4HAaI3JaLNK!3YPfiS1z-!3V-6L-KO%?wx+ZU z6!R~K)U_oIvZ9#De6=(tjh~b)YvemxN^>^ARNmP#W(XrRu`Aqacah^(xmR9%#!9W^?6=U0cXf7N4{q{9 z0GH3C4lA6Odtb~GS|1-0@+X4&KY{>h0D!^9>1VPQqf9l&So18@VzF(e+u^9y&bwi! zTkbe~{23q1waQLp={eacnN!nff`Bz43A?>)f{YT2iUHaA1r`&D>i+_R8?2OjQpSTX zX-D{ofQ>(q03n#{B1lC_#F7L{O15k%;&+YrSkh$T$kG;9I|%zocnG3GM2NE`8uXyj zQ!na4a*!K9R%&okW{9!W$HJt-WX)8E!+TOwO{X-&Oj5JxZ%VVxAvMo@&K6imYVl;H zmOLV})G8{gZKJlsZW?X7wWSW951tfHof&mj2 zY&dX@H1wp9o}uFb_y%g}2K?d|VUcINN%+D)mewp@K@9Cx(x#bCW=17#rdecWr)hJ{ zWiSuWi#)4s!Ixg3Z5QGLd5Pv_3mtY8&oSpX6$cSw)QF@R4~QouKTcrPu}bwoe@H@$ z3MB#w3WziO202cs-FRJssEr7+D5V=Cn8B(n1^^Mbc<=N4I61p1H^a?wv)xQsDgK2Q z3QbZj`&TUDB+2@JC`r=(U%uRQl79`BHgUZwkW}Ans+u$cKrjU;B}M`xO$ES=nX8Dv~!h*6QR z+>d(ftJWbI%W58|C9jz8CW6S{{T9N4m4QP%5)BN1J90(x+lXr#aYdmXWyl|5oEEEX z%3V1@h;rAx^K?WNZ2i=5@C#6YxP5W}q?-4N=dtNnCScW!J#lS`4lwNdJG|t7XCPq@ zn|copv;YA7l^6qdxjp~_h=i<)CCyPQ1As1~FxdF8Yp3Ivm+1l4G%~5C%_X0KZ26aK(o1VuEa&F>gCCm!b`Ft}rAqs9d-$51kU~*WaWPYaUYi7Oa5}zId-TpR&jL#= zv)WeM?Xbro$6QT-?g=r%7a(ZKH}CxN$XI$NcT*ObOC548%tv^SSw&~?4|9BgUsHKI z)aHM|Oy)E3vGDo`H=3H3j+G}b7P<2x#EKFvQA`066v~sYK$R2+b#ecYX6p*H$tlO3aMESlT*1*5LldrUMEa2GPpmJ6L6in_Hk#f@ z24iRp)5-*9len75T{9oE_?pez6#nK5v{10cf-DkZiBQXhTPe&6@ivOHL6R-f?UZS^ z47+68tBw6y+b72n9UNBdj8f+mIjzK5)oNW+?}j?pwRJ#8M{E0E^7=Z~zU%=j6^~jU zm?Y1<{4c7w5=tty_!3JlGzV-L_lWxVWj}M%Djo%fdI6(PK?0e=XB3FSSd9Md!E*X#BJq>F@OCO%gO7}<)CSz#O# z=Ss@3jCj@w^sj!f(D6Y$cfI-FSvGP3Fi$b&M8oNs;<&!leF8SLc-bbIV`QcxV5-Fj z&8!1yhbLDLbg!}Ygp)+?+XrLz;T4TdQs-b z<(q_HNoF4lo--TT2;hver4l_!>^XysODbe1=`PF?n^bU{C>ecf_R2f z^bN#4pPuO!`ZQx99BZ@zcNyiOXqqZ1N6WRF6w`zJ4Z!O=aARN?9m#kykDW*7@yDO{ zn3?7ml+9Su84V9RDNCoa13MPTlW8B0oLm8Li@`laA945Wd^3Q-b*2+KOX5*nFJ1cp zHPul~6P#@3MtzcV0ntQ?5vP|}!dDrmeF1Q9-tFdsvD=BlI8IBr&AAC;Z}N7nW904H zkF5x6F!5FH9+ik|lF~Kua z{f5@(&C_hTQ>I($i3=bLo&`W?9TKiM0N@E`j@)MjClQ2NpG0yf9!Ra9#1LWDNla!p zPGU>)?<5XQ377I%3vm)(NE1#H3hEdUxwidjMT|cRZ6r%$kg1ajjSLbr8Pe^!FHMay zOL12fqIFV9PW22Dbf!R9EMy5U;v0T0X7081By@t1_gym2Ot~zbtS43<&2l>yxAIFIZ0Y0 z5yHj+L1Fm5jY85*y36eUPe@K=Y;XnktESa}L>-e(Qfi0;Q{5d1B+fDzrP9dZQIxcc^hoIZvEZsTg9g>n4sTJ3*)FR* z^0I$V^oTY)Hu&;WlNU8Rk0>{1FPDc9;*o@KKoTwxAV3HqURg{HW( z)1kbjVAr`Jk=;o6BL7c+&u{H>p9B;K5rvgB0jEKnND^uu!snll{aE)r#J&KD#LyBY zh^@rFrEO2*O;9jku)e^3`x6Cp=fy%{5cu$6FensyyTBk&2z&?x0uLU99`;_{nzkU%nO+6phyP+Z?qCo=KHjnm! zt!V@dj1ucPr}G1X?Bf5Tut_?VAPYhjqD=uiVB_@;(gFj=>*u3Q`?Dc=%iWi}Ze;m0 zLq&w9DMTD%M#;vBDYQ;iQ_o49_!3dCrN+4r>E8eU$+r68FjeKb>(<%B-C_dgb~T2C zAz^9}Q$$CM2{A?5+&Y*MQ(jtp|+y7IwZ2t_ocZ78BS#YGYROp!wxoG4NyO@j4t}p;8aWLYo29&%6D0vsu zC6E^ca1+SAkYkl9r%aF=2(8X0NbNoGGUZ6gN$U_|mqXFHD2kM>)>OaHk?}G{9nS1+ z02KgA?goH_DhN~Ai7F5IC-UV<^#}`A#na_7SVlj~;>G4ub*!UdaZt6E)4VJ{VNZj? zFy`tpu)1z+YiojniX#`6D286I#n|vj=enp&etzfs|KBwsz4zUSs-upoiii<0Mnr5; z{X35t2p$2==1BK9@sTzJmv|H}j4@CYgzaDS6VcBB82&}WU$EgDeB_G9nEj{l_aDDL zCrS1%cgb~*`&o&#PXJW|goQ`Q8zqp2j=@A$Q)QcFt|ApGt+qjfo%T5Bs8i1S$}JBJ zcHe&*FK;8*?L`9D@8p8^Xjs@M|h zHfueMmUh%rEzcT7X=z8`9+u`n1ZO24aE5UOh>}<#a9pe6aS4PVlhp;Sl4L>FcB^a7 zqcy+bTA5;zrswJny2{>K!)TBl(%b>jT8*}R4Q*vjryF>v8$a$X_lNZ7wCq8sSO7xJ zDJVHuvGHuk_)fMnu}uhi5hWrox}oQOucp`XwJFxPW7wamG@}`wjn1N0G!qdER?XF` z+%t&dC}4$w5qCxyuO>vyJ7iwwg>X*{;}Cpy!_EhHFas2BCCXAx=ycqP;E-t2Fx?dE zb?FeAH7o3R2)mHw@Yseq6UGTe7WTU7qo!xf%hU^-Pf}K46;@b?soauT z8UD1m9N)i7|5z4ir%k%4H~*^n8>(h4NDreK*zl z-OR4kHOmrW+AtDGIU_9SZG1sh>Ab?cliFdGe(cA(~l=0xPUn z-yn74gfDfw?v}@1`Nbdk&`R)u9P<<_x6BIFYHZNrf|~{!noj;R$UKXURG={NlJrci z0w}g?&#_P6x!dE-#(!3EyxW>P+x2{P7MS-A2N&}ZD8hJ2g0R%mXq~pvR!#P4b<#PP zUG=f>imL2%_YbUy+n#XEKY8o#{&VVZnK^k_#0K=V(}$N{&F0|b=I(8#3#@Xj4=lIY zLF>G(-#$lUH@38Pbas{8w6dCAVdYh|rW=2SF;w!B7G-I|Rq0u^R}pvHMxBpuOUgc( ze9K$`i`S;cgY(XleLNO ziIwWvPU2${d?e!+^fWur6+?Gq;%G5oIXKq2X-{oo|F@XCEd+bv>*Wm~_!djzSstm8 zZF?gbiWoX2^SGIUB}rL{r!h5$aXu-}?X!Vv1T+s;{k0*T==Br^UvWrWr8*P)lBvot}QM zumW+KR}oGUC@ggnzyn5&8m!UkuY$~X1dU3K6AlsM^#gRqP4$|Y`^~QtH@`t#H@`*v zleSXLA`i~aMzUwaDS#CB214TGT6L0ZE)MJm4^|9oB*I4gh?&csJV!=L)hvx^W)O=- z$KM5<@(tnyA8wtaU~L`TXqNG2v{~wYB#UAkKgN1N{LY^r>~->LcX#cWwLGU>jkxy5 zvdwS(!97iG6u~HQ-OQUpPB?87OR@72UqAM2@I9m)`=Ny6GE3s)Gc(lc;*1)ch;D0- z3^9x!J)rCsDFvDOdOhMa<3e?*@Ew18^L51G<4|T?3Y&KD(86!xzu`?O^PxPa%Mml~ z4!*M6o}zU^t6rc*6Q{P=#l{`>$J%V?coWf?$?$?7rW+-LQ!*IyB9hag0QHgV)I*4j z_>B&Nvil)T;?o^QN(zd2ibyBN5zpO)JGK6N{QLp%PjYf|3yIWkcQ<7ARaLxr5+%kR zX#^ulP(*=-NE*hF8LU|Acu19y!=AU{xCc9?0tPlBody{d6wAbz&~D(s2`|BL7~-fP zDN`gcVngM~*DX}n-SmBcxT-PHcCkScJ(s5gFB<_uieL(*saX%MT*<}ThNSIl&Ro7ATC07a7oyl} z%I7~AF;=X0CmzxtEam^EOa`{#5h;K~nFK{5$i`2QG$Qkh>4azFY}%m-^mgO}yk$Pi z_-ay679;K?Z1|rM7G;Z{-fn4>ndl9e`mvL{Xzv6vx(#huG3lr;l zPr?_~F`<~N4W~P%oY{_MTz9vRHd)WFu8WM%Opg;rR`KMUyx7WTYL%~fwNS5b&PDwB z{Qb)_9nAR-=0B5aYKEZByX}`XVNC&EzS^rz!vTUugH}k0g%C}F>EDR^bmyh3Bk#HahEsH{ zf}&>{d|-xff39+=y48d{&D5Y9q~Dy$9cnFg?16N`C4hpCswhBp6ICM*8W}!41IeGL z5ratNR6;aOnp<09?a2_Wnz&y0JC7FDS^tynIhSbbpo<#1WbnrNiRlon6WwFI)3G>l z>N81{xeBgeM$CK)`0a-0PD{;84!KxA0PZgz-b`#8QG~!7I~zjQkr5RPIrVq)G7@ibN_qaOG*uf zj8e5aBRwvzB%Q+?{cakPd%&QEY6yUQc=0-rzaj7B5#~lh=$G&_MCyBlUEwOiIY2jV zp-Ky0j45Bn;f-f%LuK>uxn+&YT(^aZc4#ens{z$wonF{fEuABKBH_uC`vHE0WK}OC zgq*_5PWbaOA2RLfZ*TA1=;^sOK8%xHLw{-H3*7UDa8AUd0Y+FjF?v_1rM=7)P4kdD9dyqRd=d2)QiU8lv*X^h_6SVNqDB z1)!Q!QYx`&2Il3P$ieH4+#+fQ@yYS+!&`7qmt!}A2(YVyHne{r z3Yrph!gO>jG*>|fzB=gG0Yv+{t3fQW^T9P}A$B6@ffi?eGjs;@LZSwfq8;EC2?r9Q z2cacMjNXP;qIW`vfyuU=zye}a`TkIM@GZ0lk_88Ktm#1!2J$pgPnri74|`|M=%DsDb^=g3NXk83YNnnC`-BmZ&4f&b;kofCl9Wgb|t6` zRznrkz$Z}M&Whkuum-9aKrl=kK0;($nvU(Z=?PGd1gkvs!q5JyhgPDY2~W^jYWKi} z&01a3P0P~XLoMA&w(HE4o1KT@LA#6v-wHmgXrbO1{#-EbK96V>8rb_3QaZ z`7i7q`|ax?j*oJxsHcot+L+O0iQgC2+k<*~M8=gYb738P0Gr`9AIT5?t(pgBwul$) zGJZ)|vX|0j`Lb$hTz+1WTkz^wo7S^y&pNc8e}Vp9N4KEOxLLQ=+wtwm_R}udr|p~e zE0?*%KH@NOj5tfYcK2|Pb8i=L1kZv(L51K`!7jlm!F9m{!Qa`TLZ{G<$Ck){owTHI z$$by5j#DSlGwB36nf`*_O@Bj|(j6*^;Hbw^~2)ntzQxu{p{7#X5m`i&@UBW6oMVR-g5bZMtZys9*BL z|EB!!y!~s<_W1Dmd zj}M;{zBqhi_}=h54W9?wBN{f#)0)jEYu9SGYOiX`v>aK#MZd_|kq`Nms&rRtjjhOf zsy2M=XD9aSPRu7;cRF1scK$5zq?df)3*VjS%PqR0d*J^645Nci#oY#h{$L%&z^Kf? zXMuEfJ?)qUQtVteuwp-`imqLAF&V}w#ZQ}r6-sALW&nC*+*VMFCA>F-(8?qU!9)XJ zk{W>^Vh5#jMxBWOydDkMWrzMww{fmTnh0ZUO~9L>#Nsm(V4-6%@O7wbF5p*~6BGun z-MbyZoMYfxS*a9X#1@9Y0cQuTtBs^xTdnTa67k$+kqdlvcW>DhE^2fxF7$ z%kblkaPCood7JMK487q=_eF6#z2HibwZd>~gyEoe)eiQy!M*Y|?7w|!Y+T&%u@X&( z^7)Lx*_^JS(R+UUz=5O2_cryn{uFZjaXjdKi(q_Zwwo;Y4(iQs3b3}#A5)UV%V6m7 z?|EYYi|8XQn~r!ayK`B#{m-8cvG+I4vY6X|Lu5n%E{~Q+G(NsyH>48KC=DCEB8I98YZP2EW|ceSc@| z;Y?i$JQW{fz%JiU^Ic)W4Qpxw{yPTv`kBsv4|m&A5d+-|VmZxaXClGf%@-PiPhmqC z9N=0MF@V9}%Y>$HEDlthtud9wI|^~hS6fgj{(m0fl62~Wt|(0ha@$;Ju_G8_oOv9I zA)mpM*qtfP+}6)ns0LA}^wTpQiuT8}zxvE`a7dhWXl$bs7mTo9q@`?za8H?$0t?lR>q3?lxF@+xZh^{T#Y9qD2<3gzTUzu01=e{>0 z9{Bd4I)U(6I^oyU^v@bY$jLH3Z-=U47R9IHcTlDn*V-AUHJxjTj*jbn;$Y76#FI%@ z5j<3yFQ>B7vQZWOiADPahBe%-NSslR!;uV5hE|Kzm@E%ds9MGRrzGk(HzyMX7nH1Pb|i3(OG z6JFc~SZRep?dkYq(Tm6Kg-U9g%^Z|(hI_N8#y3vZRduhYzJ&syJd=+Yg*y~^!L@CA zg~qu*D;}A02PwR@wQSSkmnk|v%19C|%-_MRK~ZVrStH^7;TDbaoV`kr!7iFRE!iJL z@@2|#T4kPSRir@Gd(wy)0F9b$#$>{S7SMY>0Iuu?1~2TsPa=ARK^9LpFmI5Z#kMed zJvnc+9#z|Ss5fw4RkwlB)d7Enr{bwN8to$id0)$>z|+%B;hc>_j9!JwMqz)a+IOAc zNk$~?xp-o^Fy2YIuy-b%uu)vq?*-eSUv4@pv$*kV91X9mL|IEl*8A}shY zmJMCQJ{FC`&)kO54|MGZrz9%*LoB)jKe&X}JGoEuHs0RG=^<&^rLnXb+kj!yx7R&; zb;v0yrdnN{K-`!u14YB+`A(t%#GAd68hK#fDPR1O9H66!el_Aju^Qus!IBP)&kOWs z;Cc?Kz-Cpk=sMMMG@V1#Tb_#6oIc!JXAOE04}`(OFYZ2Px$75ouS3yYW%_@tMff5u zqB{{9tK7!Pui)?^TbnA3=3(UMqKy3Rrh9J{&!5C1b@k0M?7-QJU>YQgHS@3TC|zwM zGkLD0oT7}M4o~uf+3~qiB`;-X)+yF3lU`7kuF4=af|STsm;t zII}T}V?Ire=R{elc&ATVH7-KWALdFd=CK)Uy3rHz*AZuq2N~xq*_$?Z2Ok`738YQ9 z;pHG=%r9b_uH<5_jV;Arh#es0Y6O=?aMcO1O()WAcSDF#R9|fB2|Lw|!;7XLZ2)Xu zKzKiq@V1%o(OlAZuA-5W2(i>Y0PU=%8L(Ik};U@7J`_l?*RFb&Bj5$2t2($e7*!2P> zevxBRxoNO`&G&sp0m-DE9fV``0M9Q@MB>%fL8)r2q+qv=0>Xxqhcjr^jdc0;mCFxh zQx7Htc{3uLH>2|aud=#SYHuWRq%Zb+w&0N)0I@QkMZ?Xed?E^8y<3_IPTi~yO4!RP zP5JHGf1q?C(m~}u84Rxw(9nhH9v2n+_{y*FCw0j$_@M%hm<-4ZYtqnw$8 z^f`qX^Th;V8my{XycBK^hmdL=!zR*izXVe+Bsn$$gK1vlDOTi?lvQR-`WFmDSmD#7 zHQ|Vj?{f+NdRdtf1wLTB+R%anYFjLRuYq1u)u_GPl_dXBUIWmZ=Yef}>kZ{cjIo$; z-E2f9NYA$(xqitET*$LtSTzscnR_>H&2UX9o|cgCZTw&`cj-aMQa*X1cULiwyHe`E zDFyxOly~E9)b=gIy*P(n-EQ|pRi#X6#;|B4&8dA{bleXq){&LMFq%lr`_~Xa9L^jD ziD+WdX;PTQ0zOc*J;6C4y+u3BNXj`DNt{qxF#Sj*h3pXhp_$<1`P^Qzx)Gh#fc>;ktd4>oI?xWO{=*9367i0rHRN(7ImyyA=PG#26t*7RAl}NM zVdcSaap=pBlUAepCI^^z}yZ>U@8kn@tb zGneqB(UjQND#ajE{5LM2@bLo9V2J^ZW{;xf=1wWD1G~Ku3c{7xjA~Do|}0c zpCFz!0IXc=)M1U=K--#Y1guE_EhVBSG_S!osHK-CAwwl@!h}0(x_k4Ub|9( zEt z=bAWwAH>YR`ed^y5QBbC6njc#L|5C45fjZzg#(Xtiim98QL)Om{9^?R?xyM*R#wM^ zzUET)^0mo}Hn^mIDHBWMlGEe6eB0u7^1CNRr8je3{f^%mR~q3Iu-Z6!DC^V~7aI;R zCu%(g3~v`d+keKz_c?4A_i!Arp*5=YO^V=RKe0vLK8o!#FMhnqpLsM)`Ol!?hqqNx zxizSWVq1P-%KeC?0|pkf66W1)p6SwO)PmJi0}Ei{G-@(l^w*;qQ-IYS?oUk;sU>0l z=bYGqt!hsvW_j z`z!wC@6fZTKkYBMx1Com4=wE6bJ~F^dnRrFW@&8tnzXeCSAR2d=7sp;Un^&xn3O&0 zo4pGs@0c7Ry&Kh&zEbuym?h?x0V8_Tl%i+W=ifARbkt36)Tm!lv`c@R0v~Slk;sQR zOXa<#vw%Z>*od^HM#Pr^;#q*I{!p_C_@vllU=|^>^8yYk@lz|Mn8%rV?r?n}4sJ9| z{}kVv$AI(2J%g*IM%AiVKT0vzNw+82Ilcz8F7Bd$Cd#0wkA|(C^z3F!kkuLtT#;S&6qLsBXF_ET*~>Lg#& z9DF? z0IEty5t@rb4bBoeefUV;ar4}P+`PRPqO-`&(v01yThh#lB{QaunF%i1D3<#1@mVY{ zp@T}$5$q4m*qg_HUZm~;pn`fJFp`Hyx^}1Fz*2$5l zD3nF(RDtN43Pq3i%CW&>y!{l2kw?#xZy7hcW9DNNnF0px{dp4M+x|hi)FIR6dV8<^ ztOIgRSv`1~(>fS+c2bwl>X zP4Ds{RTSQTOY7g?sU~$>M*;1LbOg$_OS#db>7UvvRX{CT$?6DnkKS{0 zsoAMv&u#iq+X}gV&z%06PV_R6bU1XP7}|5Jf!GF$jyAIgQ(!cXg;6f40b3I7*)uvikR%FGFY^?R^BBkb6bKRLin}}3k)<4B8>gwwTj3!F6HPS zxhmo&^dhhri?I%e*<>s1L>Hwap05{KPG%9UkE+LfDEc-X5Zmck&Ww&WdatP01YYSL zKM4M4RqSoh=ppDna*q;w8BoXi%h&&^+btROCHOZ98vmf7GQHe zV9E3cek94(nM`aga+B3(C{lVG=$B@?7eM6$qWyY89$O7*G1XADy@z_JtgX@**nVIF z@58h4Y}_90kC$@Y=e4AXz8SO)w(y%qI>HrW&k>_=+}TXaHRJN(^FNt;rmxeIRxDfO z!W(Uj*^fKpX_ErhkiKa!B#IjMfh?ru(H7;RLQj$s)st*UP6hBkO|J>*Hon&r{`Fi` zM}ZF*t2VS?pV}6yG|*rwu<4YN+S1V)`w?N(6=&jn{iZmJZti}cF7F2GPIVmZwT(tw zrpEV2mbT!E-o*CsAdsJ+x*sB6@8%V#^HR9Y!*YdV1%_Rlbqe^JJR{ zDXk|lQd#nKyC5}F2aFbdbnpE)?)&}q?#MpzElmEHm&iv``yn71!IRcI^m2SR!Nj|t zJW!@r*(`2T@t3sxz|^}k5qc4Rl0AHe+Eod2#%H?EXRx)89?}u4s>wj!v2l*?CYik5 z^B1n6UF(19M&jKF9|Qe=q20LXzk9#CyV1+U&+=~ZQ7%1qe>#-#i(pJ&DZY>-x?Xy- z=tjONPg-UAZlEkVTHnegZ8?KPA5A}_q1`%Q~>BR;kx(%N@KCF9&ZSh&}@ zypRj+RtkFw=Pcr!6x;oye1o$+x9>Z_{Tp#XIX=q+ypajm=^)*`jyn?TH29;&ON#EW z7va&zFKJBaSSv>ZOn#)q_u zmP4`2$5*9*=ix1Q3%-G$10OYcj6{{x_W2qz=s}@Z;Ml9RgwMpy`ubu1o~b=jC4In8 zwa;BUqf#hBRqkks^hbg4>E{+o37#t6oQ=hq^Abt;K&>K54S`nQtCO+&k+@lRkn6i@ zy+8H_ag0V2`aAeUx87&*+hW2$;{dNkT1baNF zE%3rG0WxlZZi98?&G-ezg3=toMwlvoG6XX3b0YISY$ijUYD=wjeFl?%U__EI%$8ob zfjP9u0_WnxI2Rvj?SXS&PgSn7g$SMog+U4K#t5h5#pTgkP;X}Hr=KZS}* ze%VU97|s_ShKJ)}c(^fi^Ue(c>dvWd;A5Jp;RbK6RV$!ju~Z+6oxW=ljyMIo+cqdA3~)|lnIH( zjlL+LWGv1FcDcOa{jhWr% zQ6{{d-Aq_0Q%Mr zbPZ{a)ZrqWLuZ6PXTc_F21GIejw;p(mC^|Jl^q}SNy8EbZL2MFxF3i8-45^;%W2Gz zd>WM~FPYy1c>KOjb*P$xQd%&H1*yRskJd~dHv&R-iL!g8ZGT`v!fEU$)09_?(z$_6 zT%*)wl8`1zvT5aJi>y)f=Qc?34aZoTO_tNd(#GOStD8=cEj|y24eKh+QPA|G334vI z=`JZ7#WD=C1`V%A&T60o0g1_pl;(@Ykuc6j8SSJ(n?x>Kmd=~bU4&PiZExv?`3L1V zxqW0S&A=v*t%wJc#lM?OGuOhqxa$8wuj{46?M_ECz+XlIZ&lOx`mA9|BCg~h)T1Dn zzYg%dRKin{g!wwa<2uVbp77*Yk`#+nJOU2Np8vRxaE$3Dsw^TqR_h2TgU)bvG z5)|%v7S*SNqD`eGoaks#cH*hiXHHziqGaWV;LYT;gh*yVUHph+*$-;Yy$1!?QTIOZ zckR{53E`;+9~L5oW~Ne$eMXddknamE{$k>1s8enDiu-hnn}#UR1pH1ye^j6=wC8$W zSNDRoPv1-~;J zrc50B{^3-c6kx5nF`9$o)pyd(dyN82LiBT+6mun!iX@*7gWWdOC~#6s$HPFz&K~K zH8#QDcI52Ydtac)^?=BpVM#DKUqe)yp-Z!XUia%!NEgOVRI8EbBb81^WzkQA#)L5f z=wVSC0CiBM?DtfIgvweI6)lr|0nZ;k3n?E&%DU)*KuhIGbokXghEGqIR;UxhyU63^ z;3FAH_~X@PXUFQ?M2-py>^cFwM?;VWc+-0Cgu$F(Vg_@`Al|eq2s$(nLm~FU*6TBY7s!Y%n!y_o$Pl1HM<$ez zI68u+XuM&Qh9r?>r%J1`(f0}~J+OO2PkuJ%6{>x6J`?xp1JUyE?D7I{eRX1DNs;YV zT|U<}VeK2+OdMj5p0sKf7c!cH#Qh2Dl^*-7gm=Zl)8Pw=PUx6vtU3M4SF_OB#Wzgi zD*I_eS0EzV9)G{ljU)5SzGfd86ggHXM-xp5ASoLXb`LYJ>se$GfU{A&@%hh_0X z*ww;aCchG<9uZ9u%%_}!%PB%Z&BHV2s`Wd8okiG@C zr_fEjx`K=I-=u78+S+ zC;EiL=75T8KcIWZ+Nm#OtVN-}#~fSa4#-gZ>7;(KZkZPcz4_6R_Y<$cnEM1h*7QlJ z7VovgK47fnJ04ms zl8|W&udx>M`6>rCS90h^Z6x)a^4bV?4<+PKA?W}>wE>Sv2a(yVZIo@gvU3(Bv{|{t z=$tNaONu6@^F}MV=wrZjd}VqTB|Q}dEHn_XiVX#$EHgL+bw^NJuNEO{Q&n$MQ&R6_ z$Kb%QcL&Zp6`HL)Y4q)U?lFThaMi;;WPbPfA18@j!QNQHWW@L!!k6M$j^sz&SmI9D zZ%A!)(*1`Ul9GHNIaZ^3i!oQNU0pSOB!70l&AD7wXeCRmAVxF}3Xh(~LyD_o74T$s zcTL*r%2l4bW0t6o;fbkiR^;kG6LK3@_N_I_qCW)4_|LrtU zt_s7yA$A)d_x~WBK^YuzNcUy&a~`wec{+9}T>OAhuPBi^;|-ReVVBK7c4fOcTN=~e z-`g3c{AC+MxNh3f%FPfSQo0^2v-iG0Q&ZoF(%wG#)C}cCU7#l$EMWc`4nm9-(FaIi z6>)P+%meXKvVvFJmtiHPEo<@<=1B=#Gn-0e8KVT1Qn)<^62xkpRwa$Avy{=cjNr!TTV=r zE3>QXQ2vV)!Qxrftr&XQzhHawtlZSMq5QZsZHSqXJ#l#WNM z-}t|A;bM|Ah8<>Azvua*(WG+ok)2)!|1dF5?0?DGK~Web*2Pn#A8-H2tW|9m*XW zK=P7OK&Mq_BV3_u;95SEIop64I)Inu7IWov!E<}=E#bUBk}|>$&`C0h-;C6h;6s`a z9R@y=_#1hJG(1*kiOyb0W9N_A)7w{chtcEv!(0m=oOe&xwO*enj4*j6(%0Ma${O&i^HRzTuR}f} z3Lrihh=(35a1jAr|A>G>ox<~$?aF`{?diM42!~`*p6@CUh4~j^K*5~2j}C~QjUGD? z(J^go@0t1nLn#&wd9k-DvKmFVZ`_6$sU(Az=29L7lZxgz1719SKEf#o*^cdGl{zcD zW45uPYvM{psIzl;s0UU~`Cj1@Z!Bgt$w1(GpeP{RP&|8WZ(%yy2yR3-VVoCN|XgH}gU$nA@zqvcUyQ&!KGun?!gslB)m>k}PlY2^PNi2OhI-F>@0pbU%4 zwFj!|N03E7E+vHZWOw~E;*wql%NFkZd|K^pxq3Sr zN9_l$b!>#MXm)V-Yv0+kb>~Z?eQ#m!e$eigULIy6X7niH6VWjWOlL?BfaT48PxqgG z5VgWX18)-$1(VtepB8q3e54LGg@dKzX+^bdOyf%(GDJ}fRM4SDsq$RXrTTBmKcpSX z$T$=vu+5pqi(1oz8<2TJdG%&=7?pK1)_p_^hV0#sc0OEq>+qrsP}wX zU2iQlxqe~2(_IJ(4NF_t5t7MdXr{27B)RQSZFt;n($Wn6GG$7Qbezfm(*Xa&1rS+B zc+|nBFN1h}M3dV68S`F<@iaKFvA&d^wl^`}48)#qZC&Rb9Ma!=`J z;D3&}v{({G@lpkokFuA7`_}H=yK!&CgOp3P=F^l-Ys@F~FGm+DZFLXIr0I# z&#n+CW^+Rk#a<|mT6R5FuL@iMsYf6;U@szu9m7@t0G_hUA!w zc-c3xqh!L;+r+Q4KHanEhZTrc%3_X8_F>4-)@LJ9tiRydx5vPJqq$flTV-rePqb9_ ze~!p3Cmf0>X=RWUj8)-~FTLBI8o<1yik6>53L@M_s63}1L*p|A?wB+AFOPP%J^Avf z)6C9H@IqVF4@IyIN?_ff^6|(6fWX~h@(SCt<7)$}Fv?lMJ&E?S?K>{t&Sk!d z%5Dj;ofY1Z=oq_u_-S3Yt*dSF>TK*U03cI%_8pSjD2SL5kg2 zICH8AwGlUJ95H5Q$Cj#bbPN+c5U`!eSI(SbT&%A&4Jluy5Z^dY@l(S$%>tWsQSlf_ zss~!cPiEo+DJILJLT;4B2V;ocegK|QY%z)PkdKTk!*>P5yr8c{K}gBNA*Cas)z7ffp~50s&CKf8G$uNfA*f z=J{~)-<1YPiU#tkezkoI&ML~? zK?Nj$?D&Dh#&Ii#?!*HU6fljN2OiKbMm8vL)GQ<2smCpimcx%Y5&_CW=}lJ}c!Q_~ zM6q40RG}x(0nmF%4?z?ONYAiTZQEXEf4M?64^DYRGQ}ULLG?2zUQ;jkMYz+tPhd%IFan4zg0Occ6@rTc{HU6KLW8A&1BfdAABw}u;? zkiks0s(xz0(dZx@t@0;k*d*nksP>wSbj_?^RShs$67A3oMbJAIjdG9`WV=TAoOhP! zG2?uVilaC{ph{98Nu$Y9P#^1*=qZ#ylKxYhhy${A)$m?@uO=1*gPYjjgauie4NN&W zQ8BSN(z4WGqfFuJN&bWv3ZC?&e&R1D8IAIUZq7t#WVfptHOK~LuoABYA;^``6cbd) z%Y(DwlE>*mNmm<_||9op|}f(e=gjBe`7;dZ#yd|MJdb%~?+2xibxqNf?)ThV}dlZNio za|_g#)FaU~9oXWu(K(cDU2_Rf#Fl8ej6(@@7`o`>Mmf)i@~mm+lilbVK|HQ$p*QI_ z!(CeAd9Itc^uo}Hp$kV1F@2Y}Xc>F=r@8P%{=*^qicB!QOx^&K=xYG_9AH)`1_R<2 zT?sn3fkpd@l_Yhl#Nz?4*+`~c>(6OnTv5!o`&j~+I4+&yt4!i|&!W2&-yTu3hh=+q z?NOy;kLJpY{{N*N)&Hhhbne|%y}FiB{qM%>e~N3y8Q~0|)=rgs`WPNBe|>$0iD6=q zW|~Yn@;NN@kuo(l*yW%$cm3#HY(xv~#|4%}w__6*7op zCGmlC|MqCn?y?@&X>?tFGaBC9$SbOVLW?N6@l6am=(^e(YU*N-3;2N>?kmO|SN}KA z$NdT4`BO#JnZ9YV6i{%=VmsW4F1NXc4)#Tt>+WukdfEHKW4W-z_q+O+`eWG?HC}b8 z3)MyHD)l{ellrNeq3%}qso#dx>-;-X>K)c`@Txq`-NO1jwv7i|_3atD&}#G4F4&!g z74B2%)#Au>)6KO1e*V@jjSYIVnHO9x_C~ z;^XWWQiUAG-rU4DWqz@NkH$}PhOREPAv9DS7ZSq7b>cJcr7p|MFL)U1@*f__`LrXN z@|mO0tQ<|A=SWosBV{e|{EUO+=oXrT9u06}ZfQP-Tx{ey{2{GGU}rTU>>HTAemCwe z03hDud3VU)%SeiwQ^pe#HDq$~N$?GEH39P1KpAJx7ru?-bK_cFhm)5dFBtV$vpuuSc!0&9r)g`w+6=^7uM~}xV(wEaOa?Um zjkJWXNz3G}B3>@UxcE!T$F$L#CJe0TJTGZ@kO?CkGJ-){QckI-kx2~Hk9wd#Cwlm> z4IHP((Fv3aCx-V>g~y2$SN~2yKOmX1{oxaWLsyQM&T_nX+feg6M^~_7D&N6{AQk)s z9madn5qt$M@5|F@ln#d8Kx^QeDQ+C7&8Q~c(wmm4pHmKzmt-k=K;>mqrGI|&ow0V& z_kTC10bdQE@`~|)Vyv)kOxKD&Zu2q*Q*RBFKGtVRJS?^Zfs+$FxHptU9xExXn+-CN zMlO_4VUAItbX{BiYN7@X`O@pJZG`rC}LyFY>+oh(g&VG;8xDylX zl$Xp(i8+t>2#X&C4C%vnf>NGB@$r^ILfV~a8&_dOUZK|t63@FYJAxz>F7bWVXB1Bo zQGVTn29l@a>JUCj=;Vi0kphZuCQ-M7;$BG7-bSd;9OeKYU(RQq+*%8MNP$BRIcZM*N5st1T6pIt zdz;Ggt6mfD96D;E5 zMchIWw^GEd7csRWu3p47i?}uscV!{ChX!GudIs~t_i(TM1`7Af`_ z_>J#nMIbN^fEv5#A%OzjQ(F3(eBKDe*Ho+cmOAB*?-SC6v}7B2{~mJjZA$>G;q#&* z;FD664uBxC5-gPC?Oc8k9u)u(K_vZ?)ITl)geTzu%bNMQ`o~qko!hcJGeFvRO~yEO zLFW~jMBw8v*Rz(&Igau*%N9k=or2^g7X^p~Wd(0VpYF24o8@FQa1BYPnmP6KZ=;2 z88ZcC&-CAw{%0sRnaBo~!3CFuJocOw#{uQQONPOX&=|r^ZZ^w}zrdA7I7=j+d8f(n zbCV$pN47kCvnSC-zBtAlKdu4}uI4Gkb9=G`?&&l1DVTfaI>QSvR{lEM5JY$1GiE7| zO3y-8#;G~mk4P!jvY9T<&cmv)wUIp;u=ijn` zONHUg1X-m;=k+MlLc1;atN$aecrEjDmF;oug@gtps&@-DLI_Dz=M&ak34*nnRK?x2 zEtAQjn{`--$qeyo2|;5MwKtbIQxpLnop_Wk^^xFo%kqztxDo!-XRw?s5}sEz`ZVD2 z7@o&p-N&%I9tW@TU*B;u-33^*o>b|+8I;iV>;!HJDW4b`^J-&6Jh71|jFC@g^CN~2emYYSL?LCd zNH7iIDA&)V-ni(;W|hi?O**b=U}%8cSG?NkV2o#A}g)ub@!XaHrs-{0sa!&Y8y|DwiDVx*F5diL}<6q`D(U@ z(7q{!TK*B)uNA4y8D2VE;O(MLKE9e}VbZgN0@~M43Z4G z19^t_Qh}UDuseCwZUM-Gv5Uxfm~n1eF_(qL$4)!&i*TUzb{339Cm6w!45dZ|H5FY19 zA*Lw+RB&qy90K_&Y|-jfYQM!et;K;vaY2&!)+h=}DjLXR$P>u#PbKjulh*!%{0(uz z5O1M2&%L-|r@rT8oE#)%oVfld+c%AyD$`|Mr`zJgAkTddije;>l~Rlnu@>KJjKF}G ze%)lIwYcB*a?A@uSRg#Bz=)kf1oEWVIoyGr@WB727J@IQ1T(Pw=eD0RRIgC2C@cR`EnCfJKa$w8F)hCQEsL(~k65 zQp<&>BEzMu1~!8jLETd1N+ zx@E4n?%4Jq+aTyKn|q7f!SFu5uGdYq?t{-z6H=udxT zGXd5AW%h?Bk^TB`t^bE(i&=QsT*nAM881F0)Ix+(+2xBfiO~c}CKgqq95dK`XfBJd zEK;PzVjn5DM5P+5d}_7rw!WPI-&vv6F-Lsiq@#`PgzK*9@s0b==;NXkQ!%bGgk^+2 z=59GLCr_X7wU*Qxly$sSQ`jg_odBCCZ4qtyW5iPf9VMs(7gmMg8LLeHu8iSvIOWpgL`~R4t;Zwc1@6bF$T7a$OUXD< z6tY=3NY)6Hc^XJCogpIbNbm~DICUI%giK*$`ZlPOa^$yug4Yj#qaV)0TiW|=7y%!B45Tt8H7MI-uPvL%;@A1i*I` z14?uOfDo|ji1!@FAcoI0$Y78*hzqfCkSR{bAdAx5EQfhikTK}OyMjSi>YV%W=;I&c z)Aed75poYU)nrzbR3+vpLP=D-m6xGd%`^Limaf(WB?`!^5GBbX#mZ=4nFZ49bCoMJ zYmS$-)HJR+)+AQxW+;xZ%fc{b`eoGInPHAaO3ll3kzy<+DYO*-Ih3MAQq!U+-%$H? zecK7n1rH}h&65+V#DMY{=6aw^x!59wIlM1M2}GHsSfR7cQTEe$7AuZHM?iClQsacv zIy?HQS=UP(tBSY6-)I)Nya;3YRL86~p4_eG@GJ DkRz}F literal 0 HcmV?d00001 diff --git a/docs/src/fonts/JetBrainsMono-wght.woff2 b/docs/src/fonts/JetBrainsMono-wght.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cd5102a44c763f1cfe9f2b199fd5d7257491c0dd GIT binary patch literal 40404 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 wrapper does the +// scrolling; see "Tables" in foundation.css. +// +// Cells hold identifiers, paths and digests that have no spaces. Left alone +// they either force their column wide or, allowed to break anywhere, crumble +// a character at a time. Instead each long token gets a `` after its own +// separators — `_ - / . :` — and a long hex digest splits into even pieces of +// at most sixteen characters, so it wraps where a reader would split it. +// +// Kept identical in the UsageBench repository. + +/** Tokens shorter than this never need a break. */ +const LONG = 14; +const SEPARATOR = /[_\-/.:]/; +const HEX_RUN = /^[0-9a-f]{16,}$/i; + +/** Splits one long token into pieces, each ending where a break belongs. */ +function pieces(token) { + if (HEX_RUN.test(token)) { + // Even pieces of at most sixteen: a 40-character revision in three, a + // 64-character digest in four. + const size = Math.ceil(token.length / Math.ceil(token.length / 16)); + return token.match(new RegExp(`.{1,${size}}`, 'g')); + } + const out = []; + let start = 0; + for (let i = 0; i < token.length - 1; i++) { + if (SEPARATOR.test(token[i])) { + out.push(token.slice(start, i + 1)); + start = i + 1; + } + } + out.push(token.slice(start)); + return out; +} + +/** Text node → text and `` nodes, or null when nothing is long. */ +function breakText(value) { + const parts = value.split(/(\s+)/); + if (!parts.some((part) => part.length >= LONG && !/\s/.test(part))) return null; + const nodes = []; + let pending = ''; + for (const part of parts) { + if (part.length < LONG || /\s/.test(part)) { + pending += part; + continue; + } + const split = pieces(part); + split.forEach((piece, index) => { + pending += piece; + if (index < split.length - 1) { + nodes.push({ type: 'text', value: pending }); + nodes.push({ type: 'element', tagName: 'wbr', properties: {}, children: [] }); + pending = ''; + } + }); + } + if (pending) nodes.push({ type: 'text', value: pending }); + return nodes; +} + +/** @param {any} node */ +function addBreaks(node) { + if (!Array.isArray(node.children)) return; + node.children = node.children.flatMap((child) => { + if (child.type === 'text') return breakText(child.value) ?? [child]; + addBreaks(child); + return [child]; + }); +} + +/** @param {any} node */ +function wrapTables(node) { + if (!Array.isArray(node.children)) return; + node.children = node.children.map((child) => { + if (child.type === 'element' && child.tagName === 'table') { + addBreaks(child); + return { + type: 'element', + tagName: 'div', + properties: { className: ['ds-table'] }, + children: [child], + }; + } + wrapTables(child); + return child; + }); +} + +export function rehypeTableScroll() { + return (/** @type {any} */ tree) => wrapTables(tree); +} diff --git a/docs/src/styles/foundation.css b/docs/src/styles/foundation.css new file mode 100644 index 0000000..bbddb4c --- /dev/null +++ b/docs/src/styles/foundation.css @@ -0,0 +1,1278 @@ +/* ========================================================================== + Benchmark site foundation + -------------------------------------------------------------------------- + Shared, byte for byte, by the DataFlowBench and UsageBench documentation + sites: edit it in one repository and copy it to the other. Everything + site-specific — the accent colour, the analyzer palette, page layout — lives + in each site's own stylesheet, which loads after this one and sets the + `--ds-accent*` tokens this file reads. + + The language is borrowed from the Brokk SlopCop design system and turned + down for reading: a near-black ground, bone-white type, hairline rules and + chamfered panels, with one accent per site and nothing rounded, glowing or + decorative. Separation comes from hairlines, not from fills. SlopCop's + display face and its red are deliberately not carried over: these are + reference pages, read for minutes at a time, not a landing page. + + Starlight's own styles live in cascade layers, so every rule here — which is + unlayered — wins over them without `!important`. + ========================================================================== */ + +/* ---- Type --------------------------------------------------------------- + Apfel Grotezk for everything a reader reads; JetBrains Mono for evidence + only — identifiers, digests, paths, code and the numbers in tables and + charts (Apfel's figures are proportional and it has no `tnum` feature, so + any column of numbers is set in the mono). Both are OFL; see + `src/fonts/OFL.txt`. */ +@font-face { + font-family: 'Apfel Grotezk'; + src: url('../fonts/ApfelGrotezk-Regular.woff2') format('woff2'); + font-weight: 400; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: 'Apfel Grotezk'; + src: url('../fonts/ApfelGrotezk-Mittel.woff2') format('woff2'); + font-weight: 500 600; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: 'Apfel Grotezk'; + src: url('../fonts/ApfelGrotezk-Fett.woff2') format('woff2'); + font-weight: 700 900; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: 'JetBrains Mono'; + src: url('../fonts/JetBrainsMono-wght.woff2') format('woff2-variations'); + font-weight: 100 800; + font-style: normal; + font-display: swap; +} + +/* ---- Tokens: dark (the primary theme) ------------------------------------ */ +:root { + color-scheme: dark; + + /* Grounds, darkest out. They differ by a few percent on purpose. */ + --ds-canvas: #07080a; + --ds-well: #0b0c0e; + --ds-surface: #0e1012; + --ds-control: #131517; + --ds-surface-hover: #17191c; + + /* Hairlines. */ + --ds-line-soft: #1f2124; + --ds-line: #2e3134; + --ds-line-strong: #45484b; + + /* Text. All three clear 4.5:1 on every ground above. */ + --ds-text: #f2f0eb; + --ds-text-2: #c2c0bb; + --ds-text-3: #9a9da0; + + /* The accent is the site's. These are neutral fallbacks only. */ + --ds-accent: #8a8d90; + --ds-accent-text: #d6d4cf; + --ds-accent-low: #16181a; + --ds-accent-line: #5d6063; + + /* Figures and code. */ + --ds-code-text: #d4d1cb; + + --ds-shadow-panel: 0 18px 40px rgb(0 0 0 / 0.32); + --ds-shadow-float: 0 12px 28px rgb(0 0 0 / 0.45); + + --ds-font: 'Apfel Grotezk', ui-sans-serif, system-ui, -apple-system, + 'Segoe UI', sans-serif; + --ds-font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, + Consolas, monospace; + + --ds-duration: 160ms; + --ds-measure: 45rem; + + /* One spacing scale for everything the components lay out. Paragraphs keep + Starlight's 1rem flow; a figure, grid or statement sits `--ds-space-lg` + from its neighbours; a caption sits `--ds-space-sm` under its figure; the + inside of a card is padded `--ds-space-md`–`lg` and separated in `sm`s. */ + --ds-space-2xs: 0.25rem; + --ds-space-xs: 0.5rem; + --ds-space-sm: 0.75rem; + --ds-space-md: 1rem; + --ds-space-lg: 1.5rem; + --ds-space-xl: 2.5rem; + --ds-card-pad: 1.25rem; +} + +/* ---- Tokens: light ------------------------------------------------------ + Warm paper rather than white, ink rather than black, the same hairline + structure. The site stylesheet sets light accents alongside. */ +:root[data-theme='light'] { + color-scheme: light; + + --ds-canvas: #f7f6f2; + --ds-well: #efeee9; + --ds-surface: #fbfaf7; + --ds-control: #f1f0eb; + --ds-surface-hover: #ebeae4; + + --ds-line-soft: #e4e2dc; + --ds-line: #d2d0c9; + --ds-line-strong: #a9a7a0; + + --ds-text: #15171a; + --ds-text-2: #3a3d41; + --ds-text-3: #5c5f63; + + --ds-accent: #5c5f63; + --ds-accent-text: #2b2d30; + --ds-accent-low: #ebeae4; + --ds-accent-line: #a9a7a0; + + --ds-code-text: #2a2c2f; + + --ds-shadow-panel: 0 14px 32px rgb(40 36 28 / 0.08); + --ds-shadow-float: 0 10px 24px rgb(40 36 28 / 0.14); +} + +/* ---- The chamfer --------------------------------------------------------- + Nothing is rounded. Controls and panels have their corners cut, drawn with + `corner-shape: bevel` so the border, the fill, the shadow and the focus + ring all follow the cut and nothing inside is clipped (the chart tooltips + and the dialog's scroll area both depend on that). A browser without + `corner-shape` gets square corners: the cut tokens are zero until the + feature query sets them, so no one ever sees a rounded fallback. Use them + as `border-radius: var(--ds-cut-…); corner-shape: bevel;`. */ +:root { + --ds-cut-tick: 0px; + --ds-cut-badge: 0px; + --ds-cut-chip: 0px; + --ds-cut-control: 0px; + --ds-cut-panel: 0px; + --ds-cut-lead: 0px; +} +@supports (corner-shape: bevel) { + :root { + --ds-cut-tick: 2px; + --ds-cut-badge: 4px; + --ds-cut-chip: 6px; + --ds-cut-control: 8px; + --ds-cut-panel: 14px; + /* The longer cut a chip or paper panel takes at its top-left corner. */ + --ds-cut-lead: 10px; + } +} + +/* ---- Starlight's variables, mapped onto the tokens ---------------------- + Most components on both sites read Starlight's grey ramp and hairlines, so + this mapping is what carries the palette into them. The hue ramps (orange, + green, purple, red, blue) are deliberately left alone: the analyzer + palettes are built from them and must not shift. */ +:root, +::backdrop { + --sl-font: var(--ds-font); + --sl-font-mono: var(--ds-font-mono); + + --sl-color-white: var(--ds-text); + --sl-color-gray-1: #e2e0db; + --sl-color-gray-2: var(--ds-text-2); + --sl-color-gray-3: var(--ds-text-3); + --sl-color-gray-4: #64676b; + --sl-color-gray-5: var(--ds-line-strong); + --sl-color-gray-6: var(--ds-control); + --sl-color-black: var(--ds-canvas); + + --sl-color-text: var(--ds-text-2); + --sl-color-bg: var(--ds-canvas); + --sl-color-bg-nav: var(--ds-canvas); + --sl-color-bg-sidebar: var(--ds-canvas); + --sl-color-bg-inline-code: var(--ds-control); + --sl-color-hairline-light: var(--ds-line); + --sl-color-hairline: var(--ds-line-soft); + --sl-color-hairline-shade: var(--ds-canvas); + --sl-color-backdrop-overlay: rgb(3 4 5 / 0.72); + + --sl-shadow-md: var(--ds-shadow-float); + --sl-shadow-lg: var(--ds-shadow-panel); + + --sl-text-h1: clamp(2rem, 1.5rem + 1.6vw, 2.625rem); + --sl-text-h2: 1.75rem; + --sl-text-h3: 1.3125rem; + --sl-text-h4: 1.125rem; + --sl-text-h5: 1rem; + --sl-line-height: 1.65; + --sl-line-height-headings: 1.15; + + --sl-nav-height: 4rem; +} + +:root[data-theme='light'], +[data-theme='light'] ::backdrop { + --sl-color-white: var(--ds-text); + --sl-color-gray-1: #24272a; + --sl-color-gray-2: var(--ds-text-2); + --sl-color-gray-3: var(--ds-text-3); + --sl-color-gray-4: #8d9094; + --sl-color-gray-5: var(--ds-line-strong); + --sl-color-gray-6: var(--ds-control); + --sl-color-gray-7: var(--ds-surface); + --sl-color-black: var(--ds-canvas); + + --sl-color-text: var(--ds-text-2); + --sl-color-bg: var(--ds-canvas); + --sl-color-bg-nav: var(--ds-canvas); + --sl-color-bg-sidebar: var(--ds-canvas); + --sl-color-bg-inline-code: var(--ds-control); + --sl-color-hairline-light: var(--ds-line); + --sl-color-hairline: var(--ds-line-soft); + --sl-color-hairline-shade: var(--ds-line); + --sl-color-backdrop-overlay: rgb(40 36 28 / 0.35); +} + +/* ---- Base -------------------------------------------------------------- */ +body { + background: var(--ds-canvas); + color: var(--ds-text-2); + font-family: var(--ds-font); + font-kerning: normal; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; +} + +::selection { + background: var(--ds-accent-low); + color: var(--ds-text); +} + +/* One focus ring everywhere: 2px of the accent, clear of the shape. */ +:focus-visible { + outline: 2px solid var(--ds-accent); + outline-offset: 3px; +} + +/* ---- Header -------------------------------------------------------------- */ +/* Starlight names both the bar and its inner row `.header`; only the bar + draws the rule. */ +header.header { + border-bottom: 1px solid var(--ds-line-soft); + background: color-mix(in srgb, var(--ds-canvas) 92%, transparent); + backdrop-filter: blur(8px); +} + +.site-title { + gap: 0.6rem; + font-size: 1.3125rem; + font-weight: 500; + letter-spacing: -0.03em; + color: var(--ds-text); +} +.site-title img { + height: 1.6rem; + width: auto; +} + +button[data-open-modal] { + border-radius: var(--ds-cut-control); + corner-shape: bevel; +} +@media (min-width: 50rem) { + button[data-open-modal] { + border-color: var(--ds-line-strong); + background-color: var(--ds-control); + color: var(--ds-text-3); + transition: + border-color var(--ds-duration) ease, + color var(--ds-duration) ease; + } + button[data-open-modal]:hover { + border-color: var(--ds-accent-line); + color: var(--ds-text); + } +} +button[data-open-modal] > kbd { + border-radius: var(--ds-cut-badge); + corner-shape: bevel; + background-color: var(--ds-surface); + font-family: var(--ds-font-mono); +} + +site-search dialog { + border-radius: var(--ds-cut-panel); + corner-shape: bevel; + border-color: var(--ds-line-strong); + background-color: var(--ds-surface); +} + +starlight-theme-select select, +starlight-lang-select select { + font-family: var(--ds-font); +} + +/* ---- Page geometry ------------------------------------------------------- + The content and its contents list travel together as one block right of + the sidebar: the column of content first, then a narrow contents column + beside it. The block is the same width on every page, so the text and the + contents list sit in the same place on every page, and anything wide — + tables, charts, card grids — fits the column rather than moving it. + + On a large display the room the block leaves is split one part left to + two right, so the text lands a little left of centre, where the eye + starts, without a wide empty margin beside the sidebar. On a narrower + display the block simply fills the room, one gutter each side, and the + contents list and its gap narrow before the column does. Pages without a + contents list give its room to the content. + + On a large display the whole scale grows a little — 16px at 1440px wide, + 18px at 2560px — so the sidebars stay readable. Breakpoints are unaffected: + media queries resolve rem against the browser default, not this size. */ +html { + font-size: clamp(100%, 0.8393rem + 0.1786vw, 112.5%); +} +:root { + --sl-sidebar-width: 17rem; + --ds-column: 56rem; + --sl-content-width: var(--ds-column); + --ds-toc-width: clamp(11rem, 16vw - 1rem, 14rem); + --ds-toc-gap: clamp(2rem, 6vw - 3.5rem, 3rem); + --ds-page-pad: clamp(2.5rem, 4vw, 4rem); + --ds-page-width: calc(var(--ds-column) + var(--ds-toc-gap) + var(--ds-toc-width)); + --ds-page-lead: 0.3333; +} +@media screen and (min-width: 72rem) { + :root[data-has-sidebar] { + --sl-content-pad-x: var(--ds-page-pad); + } + :root[data-has-sidebar] .main-frame > .lg\:sl-flex { + --ds-page-start: max( + var(--ds-page-pad), + (100% - var(--ds-page-width)) * var(--ds-page-lead) + ); + margin-inline-start: var(--ds-page-start); + width: min(var(--ds-page-width), 100% - var(--ds-page-start) - var(--ds-page-pad)); + } + /* The content pane takes the block; the panels inside it add no gutter of + their own, and their rules span only the content. */ + :root[data-has-sidebar] .main-pane { + order: 1; + flex: 1 1 0; + min-width: 0; + width: auto; + } + :root[data-has-sidebar] .main-pane .content-panel { + padding-inline: 0; + } + :root[data-has-sidebar] .main-pane .sl-container { + max-width: none; + margin-inline: 0; + } + /* Starlight pins the contents pane to the window at full width; here it + is a column of the block that follows the reader down the page. */ + :root[data-has-sidebar] .right-sidebar-container { + order: 2; + flex: 0 0 var(--ds-toc-width); + width: auto; + margin-inline-start: var(--ds-toc-gap); + } + :root[data-has-sidebar] .right-sidebar { + position: sticky; + top: var(--sl-nav-height); + width: auto; + height: auto; + max-height: calc(100vh - var(--sl-nav-height)); + padding-top: 0; + border-inline-start: 0; + } + :root[data-has-sidebar] .right-sidebar-panel { + padding: 2rem 0; + } + :root[data-has-sidebar] .right-sidebar-panel .sl-container { + width: auto; + max-width: none; + } + /* The search box starts where the content does: the header's first column + runs to the sidebar's edge plus the block's offset. The percentage is the + header row's width, which is the window's less the bar's own padding. */ + :root[data-has-sidebar] .header { + --__main-column-fr: max( + var(--ds-page-pad), + ( + 100% + 2 * var(--sl-nav-pad-x) - var(--sl-sidebar-width) - + var(--ds-page-width) + ) * var(--ds-page-lead) + ); + } +} + +/* ---- Sidebar ------------------------------------------------------------- + Section labels quiet, links a step quieter, and the current page marked by + a short accent rule rather than a filled pill. */ +.sidebar-pane { + border-inline-end: 1px solid var(--ds-line-soft); +} +.sidebar-content .large, +.sidebar-content a { + font-size: 0.9375rem; +} +.sidebar-content .large { + font-weight: 500; + letter-spacing: -0.01em; + color: var(--ds-text); +} +.sidebar-content a { + position: relative; + border-radius: 0; + color: var(--ds-text-3); + transition: color var(--ds-duration) ease; +} +.sidebar-content a:hover, +.sidebar-content a:focus-visible { + color: var(--ds-text); +} +/* The top-level entries sit on the same step as a group label. */ +.sidebar-content .top-level > li > a { + color: var(--ds-text-2); + font-weight: 500; +} +.sidebar-content [aria-current='page'], +.sidebar-content [aria-current='page']:hover, +.sidebar-content [aria-current='page']:focus { + color: var(--ds-text); + background: transparent; + font-weight: 500; +} +.sidebar-content [aria-current='page']::before { + content: ''; + position: absolute; + inset-block: 0.35em; + inset-inline-start: -1px; + width: 2px; + background: var(--ds-accent); +} +/* Top-level current pages have no rail to sit on; give them a tick instead. */ +.sidebar-content .top-level > li > a[aria-current='page']::before { + inset-inline-start: -0.35rem; +} +.sidebar-content ul ul li { + border-inline-start-color: var(--ds-line-soft); +} +.sidebar-content summary { + border-radius: 0; +} +.sidebar-content .caret { + color: var(--ds-text-3); +} + +/* ---- Right-hand contents --------------------------------------------------- */ +.right-sidebar-panel h2 { + font-size: var(--sl-text-sm); + font-weight: 500; + color: var(--ds-text-3); + letter-spacing: 0; +} +.right-sidebar-panel a, +starlight-toc a { + font-size: var(--sl-text-sm); + line-height: 1.4; + border-radius: 0; + color: var(--ds-text-3); +} +.right-sidebar-panel a:hover { + color: var(--ds-text); +} +starlight-toc a[aria-current='true'] { + color: var(--ds-accent-text); + box-shadow: inset 2px 0 0 var(--ds-accent); +} +.right-sidebar { + border-inline-start-color: var(--ds-line-soft); +} + +/* ---- Page title and content --------------------------------------------- */ +.content-panel { + border-top-color: var(--ds-line-soft); +} +.content-panel h1, +#_top { + font-weight: 500; + letter-spacing: -0.035em; + line-height: 1.08; + color: var(--ds-text); + text-wrap: balance; +} + +.sl-markdown-content { + font-size: 1.0625rem; +} +.sl-markdown-content :is(h1, h2, h3, h4, h5, h6) { + font-weight: 500; + color: var(--ds-text); + text-wrap: balance; +} +.sl-markdown-content h2 { + letter-spacing: -0.03em; + line-height: 1.12; +} +.sl-markdown-content h3 { + letter-spacing: -0.02em; + line-height: 1.2; +} +.sl-markdown-content h4, +.sl-markdown-content h5 { + letter-spacing: -0.01em; +} +/* A section starts with a hairline across the column, not with space alone. */ +.sl-markdown-content :is(h2, .sl-heading-wrapper.level-h2):not(:first-child) { + margin-top: 2.75rem; + padding-top: 1.5rem; + border-top: 1px solid var(--ds-line); +} +.sl-markdown-content .sl-heading-wrapper.level-h2 > h2 { + margin-top: 0; + padding-top: 0; + border-top: 0; +} +.sl-markdown-content :is(h3, .sl-heading-wrapper.level-h3):not(:first-child) { + margin-top: 2.25rem; +} +.sl-markdown-content .sl-anchor-link { + color: var(--ds-text-3); +} + +.sl-markdown-content :is(p, li, dd) { + text-wrap: pretty; +} +.sl-markdown-content strong { + color: var(--ds-text); + font-weight: 500; +} + +.sl-markdown-content a:not(:where(.not-content *)) { + color: var(--ds-accent-text); + text-decoration-thickness: 1px; + text-underline-offset: 0.18em; + text-decoration-color: color-mix(in srgb, currentColor 45%, transparent); + transition: text-decoration-color var(--ds-duration) ease; +} +.sl-markdown-content a:not(:where(.not-content *)):hover { + text-decoration-color: currentColor; +} + +/* Lists: 6px octagon ticks in the accent. Ordered lists keep their numbers. */ +.sl-markdown-content ul:not([class]):not(:where(.not-content *)) { + list-style: none; + padding-inline-start: 1.25rem; +} +.sl-markdown-content ul:not([class]):not(:where(.not-content *)) > li { + position: relative; +} +.sl-markdown-content ul:not([class]):not(:where(.not-content *)) > li::before { + content: ''; + position: absolute; + inset-inline-start: -1.1rem; + top: 0.66em; + width: 6px; + height: 6px; + background: var(--ds-accent); + clip-path: polygon(30% 0, 70% 0, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0 70%, 0 30%); +} +.sl-markdown-content ol:not([class]) > li::marker { + color: var(--ds-text-3); + font-family: var(--ds-font-mono); + font-size: 0.85em; +} + +.sl-markdown-content hr { + border-color: var(--ds-line); +} + +.sl-markdown-content blockquote { + border-inline-start: 1px solid var(--ds-line-strong); + color: var(--ds-text-2); +} + +/* Inline code is evidence: mono, a hairline chip, never coloured by kind. */ +.sl-markdown-content :not(pre) > code:not(:where(.not-content *)), +.sl-markdown-content code:not(:where(pre *, .not-content *)) { + font-family: var(--ds-font-mono); + font-size: 0.8em; + color: var(--ds-code-text); + background: var(--ds-control); + border: 1px solid var(--ds-line-soft); + border-radius: var(--ds-cut-badge); + corner-shape: bevel; + padding: 0.05em 0.3em; + overflow-wrap: anywhere; +} +.sl-markdown-content a code:not(:where(pre *, .not-content *)) { + color: inherit; +} + +kbd { + font-family: var(--ds-font-mono); +} + +/* ---- Tables -------------------------------------------------------------- + Plain tables on the canvas: a quiet head under a rule, body rows divided by + the softest hairline, no zebra, no side borders. */ +.sl-markdown-content table:not(:where(.not-content *)) { + border-collapse: collapse; + font-size: 0.9375rem; + line-height: 1.5; +} +/* Every table spans the column, so tables line up with each other and with + the rules between sections. A table with more columns than the column has + room for pans inside its box (the `.ds-table` wrapper every markdown table + gets, from rehype-table-scroll) rather than running under the contents + list, and it pans before its cells get too narrow to read: each column is + owed about 5rem — 4rem from eight columns up, where they are mostly + figures — so a table of many columns keeps a floor of its own, short of + the column on a 1440px display. + Text wraps between words, and identifiers and digests only at the break + points the plugin gives them — after `_ - / . :`, and in even pieces of + at most sixteen characters of a hash — never mid-token (inline code + elsewhere may break anywhere; in a cell that let the column shrink below + its longest token and split `v0.2.0`). Numbers, the right-aligned + cells, never break; their headers wrap over them. */ +.sl-markdown-content .ds-table { + overflow-x: auto; +} +.sl-markdown-content .ds-table > table { + display: table; + width: 100%; + overflow: visible; +} +.sl-markdown-content .ds-table > table:has(tr > :nth-child(4)) { min-width: 20rem; } +.sl-markdown-content .ds-table > table:has(tr > :nth-child(5)) { min-width: 25rem; } +.sl-markdown-content .ds-table > table:has(tr > :nth-child(6)) { min-width: 30rem; } +.sl-markdown-content .ds-table > table:has(tr > :nth-child(7)) { min-width: 35rem; } +.sl-markdown-content .ds-table > table:has(tr > :nth-child(8)) { min-width: 36rem; } +.sl-markdown-content .ds-table > table:has(tr > :nth-child(10)) { min-width: 42rem; } +.sl-markdown-content .ds-table > table:has(tr > :nth-child(12)) { min-width: 48rem; } +.sl-markdown-content .ds-table :is(td, th), +.sl-markdown-content .ds-table :is(td, th) code { + overflow-wrap: normal; +} +.sl-markdown-content .ds-table td code { + white-space: normal; +} +.sl-markdown-content .ds-table td[align='right'] { + white-space: nowrap; +} +.sl-markdown-content :is(th, td):not(:where(.not-content *)) { + border: 0; + border-bottom: 1px solid var(--ds-line-soft); + padding: 0.55rem 1.1rem 0.55rem 0; + background: transparent; + vertical-align: top; +} +.sl-markdown-content :is(th, td):last-child:not(:where(.not-content *)) { + padding-inline-end: 0; +} +/* Tables of many columns are mostly short figures: a tighter gap between + them keeps a twelve-column table inside a 1440px display. */ +.sl-markdown-content .ds-table > table:has(tr > :nth-child(8)) :is(th, td):not(:last-child) { + padding-inline-end: 0.7rem; +} +.sl-markdown-content thead th:not(:where(.not-content *)) { + border-bottom: 1px solid var(--ds-line); + color: var(--ds-text-3); + font-size: var(--sl-text-xs); + font-weight: 500; + text-wrap: balance; +} +.sl-markdown-content tbody th:not(:where(.not-content *)) { + color: var(--ds-text); + font-weight: 500; +} +.sl-markdown-content tbody tr:not(:where(.not-content *)) { + background: transparent; +} +.sl-markdown-content td:not(:where(.not-content *)) { + color: var(--ds-text-2); +} + +/* ---- Code blocks (Expressive Code) ---------------------------------------- */ +.expressive-code { + --ec-brdRad: 0px; + font-family: var(--ds-font-mono); +} +.expressive-code .frame, +.expressive-code figure { + border-radius: var(--ds-cut-control); + corner-shape: bevel; +} +.expressive-code pre { + border-color: var(--ds-line) !important; + background: var(--ds-well) !important; +} +.expressive-code .frame.has-title .header, +.expressive-code .frame.is-terminal .header { + background: var(--ds-surface) !important; + border-color: var(--ds-line) !important; +} +.expressive-code .frame .header::before { + border-color: var(--ds-line) !important; +} +.expressive-code .copy button { + border-radius: var(--ds-cut-badge); + corner-shape: bevel; +} + +/* ---- Asides -------------------------------------------------------------- + A notice, not a banner: a quiet panel with a hairline, the aside's kind in + its title, and the colour kept to a 2px rule on the leading edge. */ +.starlight-aside { + border: 1px solid var(--ds-line); + border-inline-start: 2px solid var(--sl-color-asides-border, var(--ds-accent)); + border-radius: 0; + background: var(--ds-surface); + padding: 1rem 1.25rem; +} +.starlight-aside--note { + --sl-color-asides-border: var(--ds-accent); + --sl-color-asides-text-accent: var(--ds-accent-text); +} +.starlight-aside__title { + font-weight: 500; + font-size: var(--sl-text-sm); + letter-spacing: 0; +} +.starlight-aside__content { + color: var(--ds-text-2); +} + +/* ---- Details --------------------------------------------------------------- + Native disclosures in running content read as an accordion row: the summary + in text, a plus that turns into a cross when open. Components that style + their own `details` carry a class and are left alone. */ +.sl-markdown-content details:not([class]) { + border-top: 1px solid var(--ds-line); + border-bottom: 1px solid var(--ds-line); + padding: 0; +} +.sl-markdown-content details:not([class]) + details:not([class]) { + margin-top: 0; + border-top: 0; +} +/* Starlight's own disclosure look (a side rule and a chevron) gives way to + the hairline row for every disclosure in content, classed or not. */ +.sl-markdown-content details:not(:where(.not-content *)) { + border-inline-start: 0; + padding-inline-start: 0; +} +.sl-markdown-content summary:not(:where(.not-content *)) { + margin-inline-start: 0; + padding-inline-start: 0; +} +.sl-markdown-content summary:not(:where(.not-content *))::before { + content: none; +} +.sl-markdown-content details:not([class]) > summary { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 0.75rem 0; + cursor: pointer; + list-style: none; + color: var(--ds-text); + font-weight: 500; +} +.sl-markdown-content details:not([class]) > summary::-webkit-details-marker { + display: none; +} +.sl-markdown-content details:not([class]) > summary::after { + content: '+'; + flex: none; + font-family: var(--ds-font-mono); + font-size: 1.1rem; + line-height: 1; + color: var(--ds-text-3); + transition: transform var(--ds-duration) ease; +} +.sl-markdown-content details:not([class])[open] > summary::after { + transform: rotate(45deg); +} +.sl-markdown-content details:not([class]) > summary:hover { + color: var(--ds-accent-text); +} +.sl-markdown-content details:not([class]) > :not(summary) { + margin-bottom: 1rem; +} + +/* ---- Cards, badges, tabs (Starlight's components) ------------------------- */ +.card { + border: 1px solid var(--ds-line); + border-radius: var(--ds-cut-panel); + corner-shape: bevel; + background: var(--ds-surface); + box-shadow: none; +} +.card .icon { + border-radius: 0; +} +.sl-badge { + border-radius: var(--ds-cut-badge); + corner-shape: bevel; + font-family: var(--ds-font); + font-weight: 500; +} +starlight-tabs [role='tablist'] { + border-bottom-color: var(--ds-line); +} +starlight-tabs [role='tab'][aria-selected='true'] { + color: var(--ds-text); + border-color: var(--ds-accent); +} + +/* ---- Pagination ------------------------------------------------------------ + Previous and next take slants: each keeps the corners on its outer side + square and cuts the two that point the way it goes, so the pair reads as a + pair of arrows. */ +.pagination-links a { + border: 1px solid var(--ds-line-strong); + background: var(--ds-control); + box-shadow: none; + color: var(--ds-text-3); + font-size: var(--sl-text-sm); + transition: + border-color var(--ds-duration) ease, + color var(--ds-duration) ease; +} +.pagination-links a[rel='prev'] { + border-radius: var(--ds-cut-panel) 0 0 var(--ds-cut-panel); + corner-shape: bevel; +} +.pagination-links a[rel='next'] { + border-radius: 0 var(--ds-cut-panel) var(--ds-cut-panel) 0; + corner-shape: bevel; +} +.pagination-links a:hover { + border-color: var(--ds-accent-line); + color: var(--ds-text-2); +} +.pagination-links .link-title { + font-size: var(--sl-text-xl); + font-weight: 500; + letter-spacing: -0.02em; + color: var(--ds-text); +} + +/* ---- Footer ---------------------------------------------------------------- */ +footer .meta { + color: var(--ds-text-3); + font-size: var(--sl-text-sm); +} +footer .meta a { + color: var(--ds-text-3); +} +footer .meta a:hover { + color: var(--ds-text); +} + +/* ========================================================================== + Shared component vocabulary + -------------------------------------------------------------------------- + Classes the sites' own components compose. Component-scoped styles may add + to them, but the look of a label, a panel, a chip or a figure is decided + here once. + ========================================================================== */ + +/* A small label above a block: sentence case, never uppercase or tracked. */ +.ds-label { + margin: 0; + font-size: var(--sl-text-xs); + font-weight: 500; + line-height: 1.4; + letter-spacing: 0; + color: var(--ds-text-3); +} + +/* A panel: the one surface that sits on the canvas with its own ground. */ +.ds-panel { + border: 1px solid var(--ds-line-strong); + border-radius: var(--ds-cut-panel); + corner-shape: bevel; + background: var(--ds-surface); + box-shadow: var(--ds-shadow-panel); +} + +/* A quieter frame for a figure or a card within a grid. */ +.ds-frame { + border: 1px solid var(--ds-line); + border-radius: var(--ds-cut-control); + corner-shape: bevel; + background: var(--ds-surface); +} + +/* A chip: a toggle, a filter, an in-page link. */ +.ds-chip { + display: inline-flex; + align-items: center; + gap: 0.4rem; + min-height: 2.25rem; + padding: 0 0.8rem; + border: 1px solid var(--ds-line-strong); + border-radius: var(--ds-cut-lead) var(--ds-cut-chip) var(--ds-cut-chip) + var(--ds-cut-chip); + corner-shape: bevel; + background: var(--ds-control); + color: var(--ds-text-2); + font-size: var(--sl-text-sm); + font-weight: 500; + line-height: 1; + text-decoration: none; + white-space: nowrap; + cursor: pointer; + transition: + border-color var(--ds-duration) ease, + color var(--ds-duration) ease, + background-color var(--ds-duration) ease; +} +.ds-chip:hover { + border-color: var(--ds-accent-line); + color: var(--ds-text); +} +.ds-chip[aria-pressed='true'], +.ds-chip[aria-current='true'], +.ds-chip.is-selected { + border-color: var(--ds-accent); + background: var(--ds-accent-low); + color: var(--ds-text); +} + +/* A small quiet button, e.g. "Confusion matrix". */ +.ds-button { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.35rem 0.7rem; + border: 1px solid var(--ds-line-strong); + border-radius: var(--ds-cut-lead) var(--ds-cut-badge) var(--ds-cut-badge) + var(--ds-cut-badge); + corner-shape: bevel; + background: var(--ds-control); + color: var(--ds-text-2); + font-family: var(--ds-font); + font-size: var(--sl-text-xs); + font-weight: 500; + line-height: 1.2; + letter-spacing: 0; + text-transform: none; + white-space: nowrap; + cursor: pointer; + transition: + border-color var(--ds-duration) ease, + color var(--ds-duration) ease; +} +.ds-button:hover { + border-color: var(--ds-accent); + color: var(--ds-text); +} + +/* Numbers that sit in rows or columns. */ +.ds-num { + font-family: var(--ds-font-mono); + font-variant-numeric: tabular-nums; + letter-spacing: -0.01em; +} + +/* A statement: the one sentence a page exists to say, set larger than the + prose around it and marked by a rule rather than boxed. */ +.ds-statement { + margin: var(--ds-space-lg) 0 0; + max-width: var(--ds-measure); + padding-inline-start: var(--ds-space-lg); + border-inline-start: 2px solid var(--ds-accent); + font-size: clamp(1.1875rem, 1.05rem + 0.45vw, 1.375rem); + font-weight: 500; + line-height: 1.4; + letter-spacing: -0.015em; + color: var(--ds-text); + text-wrap: pretty; +} +.ds-statement strong { + font-weight: 500; + white-space: nowrap; + color: var(--ds-accent-text); +} + +/* Figures: a row of numbers, each above what it counts, divided by hairlines. + Written as a

of
; the number is shown first. The + column count comes from `--ds-figures-cols` (3 by default), and a row of + four folds to two by two on a narrow screen. */ +.ds-figures { + --ds-figures-cols: 3; + display: grid; + grid-template-columns: repeat(var(--ds-figures-cols), minmax(0, 1fr)); + margin: var(--ds-space-lg) 0 0; + padding: 0; + border-block: 1px solid var(--ds-line); +} +.ds-figures > div { + display: flex; + flex-direction: column; + gap: var(--ds-space-2xs); + min-width: 0; + margin: 0 !important; + padding: var(--ds-space-md) var(--ds-space-md) var(--ds-space-md) 0; +} +.ds-figures > div + div { + padding-inline-start: var(--ds-space-md); + border-inline-start: 1px solid var(--ds-line-soft); +} +.ds-figures :is(dt, dd) { + margin: 0 !important; + padding: 0; +} +.ds-figures dt { + font-size: var(--sl-text-sm); + font-weight: 400; + line-height: 1.4; + color: var(--ds-text-2); +} +.ds-figures dd { + order: -1; + font-family: var(--ds-font-mono); + font-size: 1.75rem; + font-weight: 500; + font-variant-numeric: tabular-nums; + line-height: 1.1; + letter-spacing: -0.02em; + color: var(--ds-text); +} +.ds-figures .ds-figure-unit { + margin-inline-start: 0.35em; + font-family: var(--ds-font); + font-size: var(--sl-text-sm); + font-weight: 400; + letter-spacing: 0; + color: var(--ds-text-3); +} +/* A second
under the label: provenance, in small type. */ +.ds-figures dd.ds-figure-meta { + order: 0; + font-family: var(--ds-font); + font-size: var(--sl-text-xs); + font-weight: 400; + line-height: 1.4; + letter-spacing: 0; + color: var(--ds-text-3); +} +.ds-figures[data-cols='4'] { + --ds-figures-cols: 4; +} +@media (max-width: 40rem) { + .ds-figures[data-cols='4'] { + --ds-figures-cols: 2; + } + .ds-figures[data-cols='4'] > div:nth-child(odd) { + padding-inline-start: 0; + border-inline-start: 0; + } + .ds-figures[data-cols='4'] > div:nth-child(n + 3) { + border-top: 1px solid var(--ds-line-soft); + } +} +/* On a phone a row of three reads as a list: each number beside its label. */ +@media (max-width: 36rem) { + .ds-figures:not(.is-compact, [data-cols='4']) { + grid-template-columns: minmax(0, 1fr); + } + .ds-figures:not(.is-compact, [data-cols='4']) > div { + display: grid; + grid-template-columns: 6rem minmax(0, 1fr); + column-gap: var(--ds-space-sm); + align-items: baseline; + padding: var(--ds-space-sm) 0; + border-inline-start: 0; + } + .ds-figures:not(.is-compact, [data-cols='4']) > div + div { + padding-inline-start: 0; + border-inline-start: 0; + border-top: 1px solid var(--ds-line-soft); + } + .ds-figures:not(.is-compact, [data-cols='4']) dd:not(.ds-figure-meta) { + grid-column: 1; + grid-row: 1 / span 2; + font-size: 1.5rem; + } + .ds-figures:not(.is-compact, [data-cols='4']) dt, + .ds-figures:not(.is-compact, [data-cols='4']) .ds-figure-meta { + grid-column: 2; + } + .ds-figures:not(.is-compact, [data-cols='4']) .ds-figure-unit { + display: block; + margin: 0; + font-size: var(--sl-text-xs); + } +} +/* Inside a card: smaller numbers, no closing rule, and the card's own inset. */ +.ds-figures.is-compact { + margin-top: var(--ds-space-lg); + border-top-color: var(--ds-line-soft); + border-bottom: 0; +} +.ds-figures.is-compact > div { + padding-block: var(--ds-space-sm) 0; + padding-inline-end: var(--ds-space-sm); +} +.ds-figures.is-compact > div + div { + padding-inline-start: var(--ds-space-sm); +} +.ds-figures.is-compact dt { + font-size: var(--sl-text-xs); + color: var(--ds-text-3); +} +.ds-figures.is-compact dd { + font-size: 1.125rem; +} + +/* A card in a grid: a name, one line of identity under it, then its body. + The head has no rule under it; spacing separates it. */ +.ds-card { + display: flex; + flex-direction: column; + min-width: 0; + margin: 0 !important; + padding: var(--ds-space-md) var(--ds-card-pad) var(--ds-card-pad); + border: 1px solid var(--ds-line); + border-radius: var(--ds-cut-control); + corner-shape: bevel; + background: var(--ds-surface); +} +.ds-card > * { + margin-top: 0; +} +.ds-card-head { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: var(--ds-space-2xs); + margin: 0 0 var(--ds-space-md) !important; +} +.ds-card-name { + display: flex; + align-items: center; + gap: var(--ds-space-xs); + margin: 0 !important; + font-size: var(--sl-text-base); + font-weight: 500; + line-height: 1.3; + letter-spacing: -0.01em; + color: var(--ds-text); +} +.ds-card-meta { + margin: 0 !important; + overflow: hidden; + font-family: var(--ds-font-mono); + font-size: var(--sl-text-2xs); + line-height: 1.4; + color: var(--ds-text-3); + white-space: nowrap; + text-overflow: ellipsis; +} + +/* Bars: label, track, value, on one grid so every row in a card — and every + card in a grid — starts its track at the same place. */ +.ds-bars { + display: grid; + grid-template-columns: var(--ds-bars-label, 7rem) minmax(0, 1fr) auto; + align-items: center; + gap: var(--ds-space-xs) var(--ds-space-sm); + margin: 0; +} +.ds-bars > * { + margin: 0 !important; +} +.ds-bars-label { + overflow: hidden; + font-size: var(--sl-text-sm); + color: var(--ds-text-2); + white-space: nowrap; + text-overflow: ellipsis; +} +.ds-bars-value { + min-width: 3.25rem; + font-family: var(--ds-font-mono); + font-size: var(--sl-text-xs); + font-variant-numeric: tabular-nums; + text-align: end; + white-space: nowrap; + color: var(--ds-text); +} +.ds-bars-value small { + font-size: 1em; + color: var(--ds-text-3); +} +.ds-track { + display: flex; + height: 0.5rem; + overflow: hidden; + background: var(--ds-control); + box-shadow: inset 0 0 0 1px var(--ds-line-soft); +} +.ds-track > * { + height: 100%; +} + +/* A split: two things read side by side once the column has room for both + at a readable width — a passage and the figures it introduces, or two + independent paragraphs. Each keeps its own reading order; nothing flows from + one column into the other. Below the breakpoint they simply stack. */ +@media (min-width: 100rem) { + .ds-split { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + align-items: start; + gap: var(--ds-space-lg) var(--ds-space-xl); + } + .ds-split > * { + margin-top: 0 !important; + } + .ds-split > :is(p, ul, ol) + :is(p, ul, ol) { + max-width: var(--ds-measure); + } + /* In the second column a row of four figures folds to two by two. */ + .ds-split .ds-figures[data-cols='4'] { + --ds-figures-cols: 2; + } + .ds-split .ds-figures[data-cols='4'] > div:nth-child(odd) { + padding-inline-start: 0; + border-inline-start: 0; + } + .ds-split .ds-figures[data-cols='4'] > div:nth-child(n + 3) { + border-top: 1px solid var(--ds-line-soft); + } +} + +/* A figure caption. */ +.ds-caption { + margin: var(--ds-space-sm) 0 0; + max-width: var(--ds-measure); + color: var(--ds-text-3); + font-size: var(--sl-text-sm); + line-height: 1.55; +} + +/* ---- Motion ------------------------------------------------------------------ */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + transition-duration: 0s !important; + animation-duration: 0s !important; + animation-iteration-count: 1 !important; + scroll-behavior: auto !important; + } +} + +/* ---- Print ---------------------------------------------------------------- */ +@media print { + .ds-panel, + .ds-frame { + box-shadow: none; + } +} diff --git a/docs/src/styles/usagebench.css b/docs/src/styles/usagebench.css index d994823..04278c2 100644 --- a/docs/src/styles/usagebench.css +++ b/docs/src/styles/usagebench.css @@ -1,443 +1,49 @@ +/* UsageBench's own layer over the shared foundation (foundation.css, which is + kept identical to DataFlowBench's copy). This file holds what is particular + to this site: its orange accent and the Bifrost and reference-server + colours. */ + +/* ---- Accent --------------------------------------------------------------- + Two sets of names, on purpose. The `--sl-color-accent*` trio is Starlight's + accent and keeps the orange published since the first release. The + `--ds-accent*` tokens are the interface accent — focus rings, selected + controls, list ticks, links — tuned for contrast on the foundation's grounds + from the same orange. */ :root { - --sl-font: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; - --sl-font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; --sl-color-accent-low: #552013; --sl-color-accent: #ff6b4a; --sl-color-accent-high: #ffe0d8; - --sl-color-white: #f4f6f8; - --sl-color-gray-1: #e8ebef; - --sl-color-gray-2: #c5cad2; - --sl-color-gray-3: #8e96a3; - --sl-color-gray-4: #596170; - --sl-color-gray-5: #353c48; - --sl-color-gray-6: #1c222c; - --sl-color-black: #090b10; - --sl-content-width: 74rem; - --sl-sidebar-width: 16rem; - --usagebench-toc-width: 11rem; - --usagebench-bifrost: #ff866b; - --usagebench-reference: #61c7dc; -} - -body { - background: - radial-gradient(circle at 82% 8%, rgb(255 107 74 / 0.16), transparent 25rem), - linear-gradient(rgb(255 255 255 / 0.025) 1px, transparent 1px), - linear-gradient(90deg, rgb(255 255 255 / 0.025) 1px, transparent 1px), - #090b10; - background-size: auto, 36px 36px, 36px 36px, auto; -} - -.hero h1, -.sl-markdown-content h1, -.sl-markdown-content h2 { - letter-spacing: -0.025em; -} - -.card { - background: linear-gradient(180deg, rgb(255 255 255 / 0.045), rgb(255 255 255 / 0.012)); - border-color: rgb(255 107 74 / 0.28); - border-radius: 0.45rem; -} - -.sl-markdown-content table { - font-size: 0.88rem; - width: 100%; -} - -.sl-markdown-content th { - color: var(--sl-color-white); -} - -.sl-markdown-content code:not(:where(.not-content *)) { - color: var(--sl-color-accent-high); -} - -.evidence-note { - border-left: 3px solid var(--sl-color-accent); - color: var(--sl-color-gray-2); - margin-block: 1.75rem; - padding-left: 1rem; -} - -.snapshot-kicker { - color: var(--sl-color-accent-high); - font-family: var(--sl-font-mono); - font-size: 0.78rem; - font-weight: 700; - letter-spacing: 0.12em; - margin-bottom: -0.5rem; -} - -.landing-headline { - font-size: clamp(2rem, 4.5vw, 3rem); - max-width: 24ch; -} - -.verdict-panel { - background: - linear-gradient(115deg, rgb(255 107 74 / 0.18), transparent 52%), - rgb(255 255 255 / 0.035); - border: 1px solid rgb(255 107 74 / 0.45); - border-radius: 0.55rem; - margin-block: 1.25rem 1.5rem; - padding: clamp(1.15rem, 3vw, 1.7rem); -} - -.verdict-panel > span { - color: var(--sl-color-accent-high); - display: block; - font-family: var(--sl-font-mono); - font-size: 0.72rem; - font-weight: 700; - letter-spacing: 0.12em; - text-transform: uppercase; -} - -.verdict-panel strong { - color: var(--sl-color-white); - display: block; - font-size: clamp(1.45rem, 3.3vw, 2.25rem); - letter-spacing: -0.035em; - line-height: 1.15; - margin-top: 0.55rem; - max-width: 30ch; -} - -.verdict-panel p { - color: var(--sl-color-gray-2); - font-size: 1rem; - margin: 0.75rem 0 0; - max-width: 68ch; -} - -.verdict-panel p b { - color: var(--sl-color-white); -} - -.execution-contrast { - background: - linear-gradient(135deg, rgb(255 107 74 / 0.14), transparent 55%), - rgb(255 255 255 / 0.025); - border: 1px solid rgb(255 107 74 / 0.32); - border-radius: 0.45rem; - padding: 1.1rem 1.2rem; -} - -.execution-contrast > span { - color: var(--sl-color-accent-high); - display: block; - font-family: var(--sl-font-mono); - font-size: 0.72rem; - font-weight: 700; - letter-spacing: 0.1em; -} - -.execution-contrast strong { - color: var(--sl-color-white); - display: block; - font-size: 1.2rem; - letter-spacing: -0.02em; - margin-top: 0.45rem; -} - -.execution-contrast p { - color: var(--sl-color-gray-2); - margin: 0.55rem 0 0; -} - -.evidence-summary { - display: grid; - gap: 0.75rem; - grid-template-columns: repeat(4, minmax(0, 1fr)); - margin-block: 1.75rem; -} - -.evidence-summary__item { - background: rgb(255 255 255 / 0.025); - border: 1px solid rgb(255 255 255 / 0.14); - border-top: 3px solid var(--sl-color-gray-4); - border-radius: 0.45rem; - margin-top: 0 !important; - padding: 0.95rem; -} - -.evidence-summary__item--published { - border-color: rgb(255 134 107 / 0.35); - border-top-color: var(--usagebench-bifrost); -} - -.evidence-summary__item--pending { - border-color: rgb(97 199 220 / 0.35); - border-top-color: var(--usagebench-reference); -} - -.evidence-summary__item--retrospective { - border-color: rgb(187 146 255 / 0.35); - border-top-color: #bb92ff; -} - -.evidence-summary__item--development { - border-color: rgb(255 255 255 / 0.2); - border-top-color: var(--sl-color-gray-3); -} - -.evidence-summary__item > span { - color: var(--sl-color-gray-2); - display: block; - font-size: 0.72rem; - font-weight: 700; - letter-spacing: 0.04em; - line-height: 1.25; - min-height: 2.5em; - text-transform: uppercase; -} - -.evidence-summary__item strong { - color: var(--sl-color-white); - display: block; - font-size: clamp(1.55rem, 3vw, 2.15rem); - letter-spacing: -0.06em; - line-height: 1.05; - margin-top: 0.5rem; -} - -.evidence-summary__item small { - color: var(--sl-color-gray-3); - font-size: 0.42em; - letter-spacing: -0.02em; -} -.evidence-summary__item p { - color: var(--sl-color-gray-3); - font-size: 0.76rem; - line-height: 1.45; - margin: 0.55rem 0 0; -} - -.result-summary { - display: grid; - gap: 0.75rem; - grid-template-columns: repeat(auto-fit, minmax(min(100%, 17.5rem), 1fr)); - margin-block: 2rem; -} - -.result-summary--headline { - grid-template-columns: repeat(2, minmax(0, 1fr)); - margin-bottom: 2.75rem; -} - -.profile-scorecard { - display: grid; - gap: 0.75rem; - grid-template-columns: repeat(3, minmax(0, 1fr)); - margin-top: 1rem; -} - -.profile-result { - background: rgb(255 255 255 / 0.025); - border: 1px solid rgb(97 199 220 / 0.28); - border-top: 3px solid var(--usagebench-reference); - border-radius: 0.45rem; - margin-top: 0 !important; - padding: 1rem; -} - -.profile-result--bifrost-leads { - border-color: rgb(255 134 107 / 0.3); - border-top-color: var(--usagebench-bifrost); -} - -.profile-result > div { - align-items: baseline; - display: flex; - flex-wrap: wrap; - gap: 0.35rem; -} - -.profile-result span { - color: var(--sl-color-white); - font-weight: 750; -} - -.profile-result small { - color: var(--sl-color-gray-3); - font-size: 0.72rem; -} - -.profile-result > strong { - color: var(--sl-color-gray-4); - display: block; - font-size: 2rem; - letter-spacing: -0.06em; - line-height: 1; - margin-top: 0.7rem; -} - -.profile-result .profile-score--bifrost { - color: var(--usagebench-bifrost); -} - -.profile-result .profile-score--reference { - color: var(--usagebench-reference); -} - -.profile-result p { - color: var(--sl-color-gray-3); - font-size: 0.78rem; - margin: 0.45rem 0 0; -} - -.scorecard-key { - align-items: center; - color: var(--sl-color-gray-3); - display: flex; - flex-wrap: wrap; - font-size: 0.78rem; - gap: 0.45rem 1rem; - margin-top: 0.7rem; -} - -.scorecard-key--bifrost, -.scorecard-key--reference { - align-items: center; - display: inline-flex; - font-weight: 700; - gap: 0.35rem; -} + --ds-accent: #ff6b4a; + --ds-accent-text: #ffa48f; + --ds-accent-low: #26120d; + --ds-accent-line: #6e2d1e; -.scorecard-key--bifrost { - color: var(--usagebench-bifrost); -} - -.scorecard-key--reference { - color: var(--usagebench-reference); -} - -.scorecard-key--bifrost::before, -.scorecard-key--reference::before { - background: currentcolor; - border-radius: 50%; - content: ""; - height: 0.58rem; - width: 0.58rem; -} - -.result-metric { - background: linear-gradient(145deg, rgb(255 107 74 / 0.12), rgb(255 255 255 / 0.025)); - border: 1px solid rgb(255 107 74 / 0.28); - border-radius: 0.45rem; - margin-top: 0 !important; - padding: 1rem; -} - -.result-metric > span { - color: var(--sl-color-gray-2); - display: block; - font-size: 0.76rem; - font-weight: 700; - letter-spacing: 0.04em; - min-height: 2.3em; - text-transform: uppercase; -} - -.result-metric strong { - color: var(--sl-color-white); - display: block; - font-size: clamp(1.8rem, 4vw, 2.6rem); - letter-spacing: -0.06em; - line-height: 1.1; - margin-top: 0.45rem; -} - -.result-metric strong small { - color: var(--sl-color-gray-3); - font-size: 0.5em; - letter-spacing: -0.03em; -} - -.metric-comparison { - display: grid; - gap: 0.8rem; - grid-template-columns: repeat(2, minmax(0, 1fr)); - margin-top: 0.55rem; -} - -.metric-side { - border-top: 2px solid currentcolor; - margin-top: 0 !important; - min-width: 0; - padding-top: 0.45rem; -} - -.metric-side--bifrost { - color: var(--usagebench-bifrost); -} - -.metric-side--reference { - color: var(--usagebench-reference); -} - -.metric-side > span { - color: currentcolor; - display: block; - font-size: 0.68rem; - font-weight: 700; - letter-spacing: 0.035em; - line-height: 1.2; - min-height: 2.4em; - text-transform: uppercase; -} - -.result-metric .metric-side strong { - color: currentcolor; - font-size: clamp(1.45rem, 3.2vw, 2.2rem); - letter-spacing: -0.055em; - margin-top: 0.1rem; + --usagebench-bifrost: #ff866b; + --usagebench-reference: #61c7dc; } -.result-metric p { - color: var(--sl-color-gray-3); - font-size: 0.78rem; - margin: 0.35rem 0 0; -} +:root[data-theme='light'] { + --sl-color-accent-low: #ffe3dc; + --sl-color-accent: #c73e1d; + --sl-color-accent-high: #7a2410; -@media (min-width: 72rem) { - .right-sidebar-container { - width: max( - var(--usagebench-toc-width), - calc( - var(--usagebench-toc-width) + - (100% - var(--sl-content-width) - var(--usagebench-toc-width)) / 2 - ) - ) !important; - } + --ds-accent: #c73e1d; + --ds-accent-text: #a3331a; + --ds-accent-low: #fbe7e1; + --ds-accent-line: #eaa593; - html[data-has-sidebar][data-has-toc] .main-pane { - width: min( - calc(100% - var(--usagebench-toc-width)), - calc( - var(--sl-content-width) + - (100% - var(--sl-content-width) - var(--usagebench-toc-width)) / 2 - ) - ) !important; - } + --usagebench-bifrost: #c73e1d; + --usagebench-reference: #0e7f96; } -@media (max-width: 30rem) { - .evidence-summary, - .result-summary--headline, - .profile-scorecard { - grid-template-columns: 1fr; - } - - .result-metric > span { - min-height: auto; - } +/* ---- Widths --------------------------------------------------------------- + The foundation sets one column for every page, and tables span it. Running + text keeps one fixed measure whatever the column's width. */ +.sl-markdown-content :where(p, ul:not([class]), ol:not([class]), blockquote, dl) { + max-width: var(--ds-measure); } -@media (min-width: 30.01rem) and (max-width: 56rem) { - .evidence-summary { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } +.sl-markdown-content table:not(:where(.not-content *)) { + font-size: 0.875rem; } diff --git a/scripts/preview-published-docs.sh b/scripts/preview-published-docs.sh new file mode 100755 index 0000000..24038be --- /dev/null +++ b/scripts/preview-published-docs.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +# Render the docs locally from the published immutable releases, as the Docs +# workflow does before it builds: download each release's bundle, verify it +# against its checksum and tag, then generate the evidence map and the result +# pages from it. Without this the site renders its "no published comparison" +# state, which is what the committed tree deliberately holds. +# +# The generated pages are written into the working tree. Run with --restore to +# put the committed, unpublished state back before committing. +# +# usage: scripts/preview-published-docs.sh [--restore] +# Release tags default to the ones the live site is built from; override with +# V1_RELEASE_TAG, V2_RELEASE_TAG and LEGACY_RELEASE_TAG (empty to omit legacy). +set -euo pipefail + +repo_root="$(cd "$(dirname "$0")/.." && pwd)" +cd "$repo_root" + +generated=( + docs/src/content/docs/results/case-comparison.md + docs/src/content/docs/results/evidence.md + docs/src/content/docs/results/index.md + docs/src/data/evidence.json +) + +if [[ "${1:-}" == --restore ]]; then + git checkout -- "${generated[@]}" + echo "restored the committed, unpublished docs state" + exit 0 +fi + +v1_tag="${V1_RELEASE_TAG-v0.2.0}" +v2_tag="${V2_RELEASE_TAG-v0.3.4}" +legacy_tag="${LEGACY_RELEASE_TAG-v0.3.1}" + +cache="${XDG_CACHE_HOME:-$HOME/.cache}/usagebench/publication" +work="$(mktemp -d)" +trap 'rm -rf "$work"' EXIT + +git fetch --quiet --tags origin + +# Prints the path of the verified, extracted bundle for one release. +fetch_bundle() { + local slot="$1" tag="$2" + local archive="usagebench-${tag}.tar.gz" + local revision + revision="$(git rev-parse --verify "refs/tags/$tag^{}")" + mkdir -p "$cache/$tag" + if [[ ! -f "$cache/$tag/$archive" || ! -f "$cache/$tag/$archive.sha256" ]]; then + gh release download "$tag" --pattern "$archive" --pattern "$archive.sha256" \ + --dir "$cache/$tag" --clobber >&2 + fi + local args=(--archive "$cache/$tag/$archive" --checksum "$cache/$tag/$archive.sha256" + --extract-to "$work/$slot" --tag "$tag" --revision "$revision") + [[ "$slot" == v1 ]] && args+=(--historical-v1) + python3 scripts/validate-publication-bundle.py "${args[@]}" >&2 + echo "$work/$slot/usagebench-$tag" +} + +bundles=(--bundle "$(fetch_bundle v1 "$v1_tag")") +v2_bundle="$(fetch_bundle v2 "$v2_tag")" +bundles+=(--bundle "$v2_bundle") +if [[ -n "$legacy_tag" ]]; then + bundles+=(--bundle "$(fetch_bundle legacy "$legacy_tag")") +fi + +python3 scripts/generate-docs-evidence.py "${bundles[@]}" +python3 scripts/generate-docs-results.py --bundle "$v2_bundle" + +echo "docs now render ${v2_tag} (v2), ${v1_tag} (v1)${legacy_tag:+ and ${legacy_tag} (legacy)}." +echo "run $0 --restore before committing." From 35893743fd98696ff74dd9248000032d9c52f15c Mon Sep 17 00:00:00 2001 From: Alex Swearingen Date: Tue, 29 Sep 2026 15:57:38 -0500 Subject: [PATCH 2/2] Move the docs to usagebench.slopcop.com and prepare them for search Point the production site, CNAME, citation and README at usagebench.slopcop.com, and name SlopCop as the benchmark's publisher on the landing page. GitHub links stay on the BrokkAi organisation. For search and link previews: a robots.txt that names the generated sitemap, a social card image with its Open Graph and Twitter tags, WebSite structured data naming the site and its publisher, and a distinct search description for the generated case-comparison page. Co-Authored-By: Claude Opus 5.5 (1M context) --- .github/workflows/docs.yml | 2 +- CITATION.cff | 2 +- docs/README.md | 2 +- docs/astro.config.mjs | 25 ++++++++++++++++++++++- docs/public/CNAME | 2 +- docs/public/og-image.png | Bin 0 -> 63981 bytes docs/src/components/LandingResults.astro | 2 +- docs/src/content/docs/index.mdx | 2 +- docs/src/pages/robots.txt.ts | 8 ++++++++ scripts/generate-docs-results.py | 5 ++++- 10 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 docs/public/og-image.png create mode 100644 docs/src/pages/robots.txt.ts diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index b70e2d1..8c1bf3a 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -205,7 +205,7 @@ jobs: run: npm run build working-directory: docs env: - PUBLIC_DOCS_SITE: https://usagebench.brokk.ai + PUBLIC_DOCS_SITE: https://usagebench.slopcop.com PUBLIC_DOCS_BASE: / - name: Upload Pages artifact diff --git a/CITATION.cff b/CITATION.cff index c1cbd0f..cd6ce10 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -13,7 +13,7 @@ version: "0.3.5" date-released: "2026-09-03" repository-code: "https://github.com/BrokkAi/usagebench" repository-artifact: "https://github.com/BrokkAi/usagebench/releases" -url: "https://usagebench.brokk.ai/" +url: "https://usagebench.slopcop.com/" license: MIT keywords: - static analysis diff --git a/docs/README.md b/docs/README.md index c61b10f..8877f07 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,4 +11,4 @@ npm run build npm run dev ``` -Production builds use `https://usagebench.brokk.ai` at the root path. +Production builds use `https://usagebench.slopcop.com` at the root path. diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 24afcd2..0c433ab 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -2,9 +2,11 @@ import { defineConfig } from 'astro/config'; import starlight from '@astrojs/starlight'; import { rehypeTableScroll } from './src/plugins/rehype-table-scroll.mjs'; -const site = process.env.PUBLIC_DOCS_SITE ?? 'https://usagebench.brokk.ai'; +const site = process.env.PUBLIC_DOCS_SITE ?? 'https://usagebench.slopcop.com'; const productionBase = process.env.PUBLIC_DOCS_BASE ?? '/'; const isDev = process.argv.includes('dev'); +/** The published root, for the absolute URLs social cards need. */ +const siteRoot = new URL(productionBase.replace(/\/?$/, '/'), site); export default defineConfig({ site, @@ -21,6 +23,27 @@ export default defineConfig({ // copy; usagebench.css layers this site's own accent and pages on top. customCss: ['./src/styles/foundation.css', './src/styles/usagebench.css'], favicon: '/favicon.svg', + // Starlight writes the title, description and canonical URL per page; + // this adds the card a shared link previews with, and names the site + // and its publisher for search results. + head: [ + { tag: 'meta', attrs: { property: 'og:image', content: new URL('og-image.png', siteRoot).href } }, + { tag: 'meta', attrs: { property: 'og:image:width', content: '1200' } }, + { tag: 'meta', attrs: { property: 'og:image:height', content: '630' } }, + { tag: 'meta', attrs: { property: 'og:image:alt', content: 'UsageBench: how does Bifrost measure up against language servers?' } }, + { tag: 'meta', attrs: { name: 'twitter:image', content: new URL('og-image.png', siteRoot).href } }, + { + tag: 'script', + attrs: { type: 'application/ld+json' }, + content: JSON.stringify({ + '@context': 'https://schema.org', + '@type': 'WebSite', + name: 'UsageBench', + url: siteRoot.href, + publisher: { '@type': 'Organization', name: 'SlopCop', url: 'https://slopcop.com' }, + }), + }, + ], logo: { src: './src/assets/mark.svg', alt: '' }, expressiveCode: { styleOverrides: { diff --git a/docs/public/CNAME b/docs/public/CNAME index e7d25b5..c061984 100644 --- a/docs/public/CNAME +++ b/docs/public/CNAME @@ -1 +1 @@ -usagebench.brokk.ai +usagebench.slopcop.com diff --git a/docs/public/og-image.png b/docs/public/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..508118d1bc31d8b8231a85059fd4416abc2d4ae8 GIT binary patch literal 63981 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 literal 0 HcmV?d00001 diff --git a/docs/src/components/LandingResults.astro b/docs/src/components/LandingResults.astro index 721f7d1..44ccbb5 100644 --- a/docs/src/components/LandingResults.astro +++ b/docs/src/components/LandingResults.astro @@ -147,7 +147,7 @@ function width(value: number, shared: number): string { fewer languages.

- UsageBench is BrokkAi's own + UsageBench is SlopCop's own benchmark: we build it to measure where Bifrost {' '}stands against established language servers, and to keep ourselves honest while doing it. Every number here is generated from digest-bound diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index aaa7ae3..f7cc44c 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -1,6 +1,6 @@ --- title: How does Bifrost measure up against language servers? -description: BrokkAi's benchmark for tracking Bifrost against established LSP implementations, published only from immutable freeze evidence. +description: SlopCop's benchmark for tracking Bifrost against established LSP implementations, published only from immutable freeze evidence. tableOfContents: false --- diff --git a/docs/src/pages/robots.txt.ts b/docs/src/pages/robots.txt.ts new file mode 100644 index 0000000..a971be8 --- /dev/null +++ b/docs/src/pages/robots.txt.ts @@ -0,0 +1,8 @@ +import type { APIRoute } from 'astro'; + +// Every page is public; the sitemap Starlight generates lists them. Built +// from the configured site so a preview build points at its own sitemap. +export const GET: APIRoute = ({ site }) => { + const sitemap = new URL(`${import.meta.env.BASE_URL.replace(/\/?$/, '/')}sitemap-index.xml`, site); + return new Response(`User-agent: *\nAllow: /\n\nSitemap: ${sitemap.href}\n`); +}; diff --git a/scripts/generate-docs-results.py b/scripts/generate-docs-results.py index bafaffc..df2451f 100644 --- a/scripts/generate-docs-results.py +++ b/scripts/generate-docs-results.py @@ -44,12 +44,15 @@ "results.md": { "output": "index.md", "title": "Current evaluation result", + # Completes "Immutable …" in the page's search description. + "summary": "results for the reviewed evaluation slice", # Rendered at /results/, so sibling pages are one segment away. "sibling_prefix": "", }, "case-comparison.md": { "output": "case-comparison.md", "title": "Evaluation case comparison", + "summary": "cases separating Bifrost from the reference servers", # Rendered at /results/case-comparison/, so siblings need to climb. "sibling_prefix": "../", }, @@ -107,7 +110,7 @@ def _published_page(summary: dict[str, Any], source: str, spec: dict[str, str]) ) body = TOP_LEVEL_HEADING.sub("## ", body) tag = summary["release"] - description = f"Immutable {tag} results for the reviewed evaluation slice." + description = f"Immutable {tag} {spec['summary']}." return ( _frontmatter(spec["title"], description) + _provenance_note(summary, spec["sibling_prefix"])