From 353983d1e08c9629baaca9cc3fd1c56cbe34bd55 Mon Sep 17 00:00:00 2001 From: Will Manning Date: Wed, 4 Nov 2026 07:29:00 -0500 Subject: [PATCH 1/2] Code reads like an editor's: Blue keywords, purple functions, teal types, and pink strings Copies the design system's new syntax colours (system v97). Keywords are blue-soft in Dark and blue in Light; functions take a purple tint; the new syntax-type token gives types, classes, and traits a teal tint; strings, numbers, and constants take a pink tint. Code no longer uses the green and orange status hues. Every colour holds 4.96:1 or better on raised. Signed-off-by: Will Manning --- src/styles/vortex-tokens.css | 25 ++++++++++++++----------- src/styles/vortex.css | 3 ++- src/vendor/vortex-design/SHA256SUMS | 2 +- src/vendor/vortex-design/code-block.js | 7 +++---- tests/unit/code-block.test.ts | 6 ++++-- 5 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/styles/vortex-tokens.css b/src/styles/vortex-tokens.css index d8ba2350..0a69aeb4 100644 --- a/src/styles/vortex-tokens.css +++ b/src/styles/vortex-tokens.css @@ -1,7 +1,7 @@ /* Vortex design system tokens, copied by tools/site-styles.mjs. Edit the system, then run tools/site-styles.mjs; do not edit here. Made by: node tools/site-styles.mjs --sections base,brand,site,blog,tables,focus --faces --vx-face --base - sha256 0c19f1b05e81282363f609d0a883c212e3d849cd6e0aa8687866d15858b3790d */ + sha256 a7ae816f9bc980e73641f7b6b1b8f885494472fa08d1f6c8488a99bbb8170352 */ :root, [data-theme="dark"] { --white: #ffffff; --grey-50: #fcfcf9; @@ -41,10 +41,11 @@ --on-accent: var(--white); --focus-ring: var(--accent-ink); --error-ink: #f26a6b; - --syntax-plain: var(--grey-400); - --syntax-keyword: var(--green); - --syntax-function: var(--orange); - --syntax-string: var(--white); + --syntax-plain: var(--grey-300); + --syntax-keyword: var(--blue-soft); + --syntax-function: #c9a8f5; + --syntax-type: #6fcfd6; + --syntax-string: #f2a0c2; --syntax-comment: var(--grey-450); --chart-vortex: var(--accent); --chart-muted: var(--grey-600); @@ -82,9 +83,10 @@ --focus-ring: var(--accent-ink); --error-ink: #c42b2e; --syntax-plain: var(--grey-600); - --syntax-keyword: #0b7538; - --syntax-function: #a8460f; - --syntax-string: var(--black); + --syntax-keyword: var(--blue); + --syntax-function: #6d24b5; + --syntax-type: #0a6b75; + --syntax-string: #a8205b; --syntax-comment: var(--grey-500); --chart-vortex: var(--accent); --chart-muted: var(--grey-300); @@ -120,9 +122,10 @@ --focus-ring: var(--accent-ink); --error-ink: #c42b2e; --syntax-plain: var(--grey-600); - --syntax-keyword: #0b7538; - --syntax-function: #a8460f; - --syntax-string: var(--black); + --syntax-keyword: var(--blue); + --syntax-function: #6d24b5; + --syntax-type: #0a6b75; + --syntax-string: #a8205b; --syntax-comment: var(--grey-500); --chart-vortex: var(--accent); --chart-muted: var(--grey-300); diff --git a/src/styles/vortex.css b/src/styles/vortex.css index dbd96324..529d09ff 100644 --- a/src/styles/vortex.css +++ b/src/styles/vortex.css @@ -1,7 +1,7 @@ /* Vortex design system components (sections: base, brand, site, blog, tables, focus), copied by tools/site-styles.mjs. Edit the system, then run tools/site-styles.mjs; do not edit here. Made by: node tools/site-styles.mjs --sections base,brand,site,blog,tables,focus --faces --vx-face --base - sha256 a172f171c9faa54c438aab2fb6b4ccdc4e737905b23986dea33d692a785b9a32 */ + sha256 82d318845b84ff15660bcad8ab61386594b28ae71d0a9d75c09c2a5616c54ed6 */ /* ------------------------------------------------------------------ base */ /* Every component sizes with border-box, so it draws the same under a site's reset or none. */ @@ -724,6 +724,7 @@ html:has(.vx-header.has-tools) { scroll-padding-top: calc(var(--space-64) + var( } .vx-tok-key { color: var(--syntax-keyword); } .vx-tok-fn { color: var(--syntax-function); } +.vx-tok-type { color: var(--syntax-type); } .vx-tok-str { color: var(--syntax-string); } .vx-tok-com { color: var(--syntax-comment); font-style: italic; } .vx-code-inline, diff --git a/src/vendor/vortex-design/SHA256SUMS b/src/vendor/vortex-design/SHA256SUMS index 62f4d89a..0de166c0 100644 --- a/src/vendor/vortex-design/SHA256SUMS +++ b/src/vendor/vortex-design/SHA256SUMS @@ -7,7 +7,7 @@ f2525a6e79b5dd2b0485fff414938125f774aa3cf7bb0f829615226362d7cbd5 ascii-core.js b59c1b277849e9c6adcd1e84468fea3b59945be1b1d9fe6a2f386bc0882b7fc2 callout.d.ts dacdc197af6ae4fe546907d9578e36f32343d9ff4112c641a00428c6c28fed2f callout.js 1f540989def6dfe2f98fcd537de2ce3cfed2baf07f458287ad15ab53462a165d code-block.d.ts -ca2d7629c9a0178ebb94e0f5211df44bf908516a2418187f496fce16c176e95d code-block.js +c14d5d902bb8e35ff18070d7757dd882177ab2f854cdaa77e3dfa5ea346ea8e5 code-block.js 0c888f22fbce806a23dfa33f8412492781e697d79b03d46f52d7b164a1e68607 cover.d.ts fade12fdb73a1e944d5b12413cedd7310c8a91cf7d9c03e087783ecf58dcfb5b cover.js f2637460ba584e680f9901515397ff36e1172d3d09951bfeec0f190077542c01 theme.d.ts diff --git a/src/vendor/vortex-design/code-block.js b/src/vendor/vortex-design/code-block.js index db0f638f..62ce2a35 100644 --- a/src/vendor/vortex-design/code-block.js +++ b/src/vendor/vortex-design/code-block.js @@ -12,6 +12,7 @@ const PLAIN = "var(--syntax-plain)"; const KEYWORD = "var(--syntax-keyword)"; const FUNCTION = "var(--syntax-function)"; +const TYPE = "var(--syntax-type)"; const STRING = "var(--syntax-string)"; const COMMENT = "var(--syntax-comment)"; @@ -22,10 +23,8 @@ export const shikiTheme = { tokenColors: [ { scope: ["keyword", "storage.type", "storage.modifier", "variable.language"], settings: { foreground: KEYWORD } }, { scope: ["keyword.operator", "punctuation"], settings: { foreground: PLAIN } }, - { - scope: ["entity.name.function", "support.function", "entity.name.type", "entity.name.class", "support.type", "support.class", "entity.other.inherited-class"], - settings: { foreground: FUNCTION }, - }, + { scope: ["entity.name.function", "support.function"], settings: { foreground: FUNCTION } }, + { scope: ["entity.name.type", "entity.name.class", "support.type", "support.class", "entity.other.inherited-class"], settings: { foreground: TYPE } }, { scope: ["string", "constant", "punctuation.definition.string", "punctuation.definition.char", "markup.inline.raw"], settings: { foreground: STRING } }, { scope: ["comment", "punctuation.definition.comment"], settings: { foreground: COMMENT, fontStyle: "italic" } }, ], diff --git a/tests/unit/code-block.test.ts b/tests/unit/code-block.test.ts index 184fcf5f..4ea52c16 100644 --- a/tests/unit/code-block.test.ts +++ b/tests/unit/code-block.test.ts @@ -50,7 +50,7 @@ describe("shikiTheme", () => { } }); - it("maps the CodeBlock card's four roles", () => { + it("maps each of the CodeBlock card's roles", () => { const colour = (scope: string) => ruleFor(scope)?.settings.foreground; for (const [scope, want] of [ ["keyword.control.rust", "keyword"], @@ -58,7 +58,9 @@ describe("shikiTheme", () => { ["keyword.other.DML.sql", "keyword"], ["entity.name.function.rust", "function"], ["entity.name.function.macro.rust", "function"], - ["entity.name.type.primitive.rust", "function"], + ["entity.name.type.primitive.rust", "type"], + ["entity.name.type.struct.rust", "type"], + ["support.type.primitive.ts", "type"], ["string.quoted.double.rust", "string"], ["punctuation.definition.string.begin.rust", "string"], ["constant.numeric.decimal.rust", "string"], From 8b50fc1bc6e3135a9c0790c09db3565a62dd228c Mon Sep 17 00:00:00 2001 From: Will Manning Date: Wed, 4 Nov 2026 09:15:23 -0500 Subject: [PATCH 2/2] Headings drop Funnel Display: titles in Geist, section headings in Geist Mono The design system has two faces now (Decisions, Made 21). Titles and big figures take --font-display, which is var(--font-sans). A post's section headings and bench's headings are Geist Mono. next/font stops loading Funnel Display, and the share cards set the title in Geist Medium. The recopy also brings the system's skip link, the header's link position, and the 54ch excerpt measure, so #183 and #186 can drop their own rules. Signed-off-by: Will Manning --- CLAUDE.md | 2 +- REUSE.toml | 6 +-- src/app/(bench)/bench/layout.test.ts | 4 +- src/bench/styles/globals.css | 6 +-- src/bench/styles/tokens.test.ts | 8 ++++ src/lib/fonts.ts | 12 ++--- src/lib/og-assets/FunnelDisplay-Medium.ttf | Bin 33968 -> 0 bytes src/lib/og-assets/Geist-Medium.ttf | Bin 0 -> 78324 bytes src/lib/og.tsx | 10 ++--- src/styles/vortex-tokens.css | 4 +- src/styles/vortex.css | 49 ++++++++++++++++++--- tests/unit/og.test.ts | 5 ++- tests/unit/styles.test.ts | 9 ++-- 13 files changed, 78 insertions(+), 37 deletions(-) delete mode 100644 src/lib/og-assets/FunnelDisplay-Medium.ttf create mode 100644 src/lib/og-assets/Geist-Medium.ttf diff --git a/CLAUDE.md b/CLAUDE.md index b35798f2..11926323 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -50,7 +50,7 @@ This is a Next.js 16 marketing website for Vortex, a columnar file format, drawn - **Design system**: `src/styles/vortex-tokens.css` and `src/styles/vortex.css` are copies of the Vortex design system's styles (change the system, not the copies), and the markup uses its `vx-` classes - **ASCII mark**: `src/components/ascii-mark` mounts the system's renderer (`src/vendor/vortex-design/`) on the homepage and the 404, with the static symbol as its fallback - **Themes**: Dark only, except the blog, which carries the ThemeSwitch (`src/lib/theme.ts`) -- **Custom Fonts**: Geist, Geist Mono and Funnel Display, self-hosted through `next/font` +- **Custom Fonts**: Geist and Geist Mono, self-hosted through `next/font` ### Component Structure diff --git a/REUSE.toml b/REUSE.toml index c5c45697..d6ee6f1c 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -152,13 +152,13 @@ SPDX-FileCopyrightText = "The Apache Software Foundation" SPDX-License-Identifier = "LicenseRef-Third-Party" # The fonts the post Open Graph images set their text in (src/lib/og.tsx). They are the design -# system's Funnel Display and Geist Mono, as Google Fonts distributes them, under the SIL Open +# system's Geist and Geist Mono, as the Geist project distributes them, under the SIL Open # Font License. next/og cannot read the woff2 files next/font serves. The Geist Mono file has its # GSUB table removed, because next/og's font parser cannot read its contextual alternates. The # licence allows a modified version, and the font names no Reserved Font Name. [[annotations]] -path = "src/lib/og-assets/FunnelDisplay-Medium.ttf" -SPDX-FileCopyrightText = "2024 The Funnel Project Authors (https://github.com/Dicotype/Funnel)" +path = "src/lib/og-assets/Geist-Medium.ttf" +SPDX-FileCopyrightText = "2024 The Geist Project Authors (https://github.com/vercel/geist-font.git)" SPDX-License-Identifier = "OFL-1.1" [[annotations]] diff --git a/src/app/(bench)/bench/layout.test.ts b/src/app/(bench)/bench/layout.test.ts index 5431e5d8..b29da629 100644 --- a/src/app/(bench)/bench/layout.test.ts +++ b/src/app/(bench)/bench/layout.test.ts @@ -22,7 +22,7 @@ vi.mock('@/components/layout/footer', () => ({ createElement('footer', { 'data-origin': origin, 'data-solid': String(solid) }), })); // next/font is a build step; its classes set the design system's --vx-face-* variables. -vi.mock('@/lib/fonts', () => ({ FONT_CLASSES: 'face-sans face-mono face-display' })); +vi.mock('@/lib/fonts', () => ({ FONT_CLASSES: 'face-sans face-mono' })); // The layout reads the request's host for the base of bench's paths. const requestHeaders = vi.hoisted(() => new Headers({ host: 'bench.vortex.dev' })); @@ -58,7 +58,7 @@ describe('RootLayout', () => { }); it("self-hosts the system's faces, as the site does, with no request to Google Fonts", () => { - expect(load(false).documentElement.className).toBe('no-js face-sans face-mono face-display'); + expect(load(false).documentElement.className).toBe('no-js face-sans face-mono'); expect(html).not.toMatch(/googleapis|gstatic/); }); diff --git a/src/bench/styles/globals.css b/src/bench/styles/globals.css index 2f84020d..d9049238 100644 --- a/src/bench/styles/globals.css +++ b/src/bench/styles/globals.css @@ -53,15 +53,15 @@ body { line-height: 1.6; } -/* All headings use Funnel Display, mirroring v2's - * `h1, h2, h3, h4, h5, h6` rule. */ +/* All headings use Geist Mono, like the group names: bench is mono first, + * and the system sets a post's section headings in Geist Mono too. */ h1, h2, h3, h4, h5, h6 { - font-family: var(--font-display); + font-family: var(--font-mono); letter-spacing: -0.02em; } diff --git a/src/bench/styles/tokens.test.ts b/src/bench/styles/tokens.test.ts index 26eb5956..662bb805 100644 --- a/src/bench/styles/tokens.test.ts +++ b/src/bench/styles/tokens.test.ts @@ -88,6 +88,14 @@ describe("bench's stylesheet on the system's tokens", () => { } }); + // Will, 4 Nov: bench's group names in Geist Mono are the model for its headings. bench is mono + // first, and the system sets a post's section headings in Geist Mono too. + it('sets every heading in Geist Mono', () => { + for (const h of ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']) { + expect(lastValue(h, 'font-family'), h).toBe('var(--font-mono)'); + } + }); + it('writes its own colours only into its own variables', () => { const HEX = /#[0-9a-f]{3,8}\b/i; for (const d of decls.filter((x) => HEX.test(x.value))) { diff --git a/src/lib/fonts.ts b/src/lib/fonts.ts index fd868548..7c93e7d2 100644 --- a/src/lib/fonts.ts +++ b/src/lib/fonts.ts @@ -1,6 +1,6 @@ -import { Funnel_Display, Geist, Geist_Mono } from "next/font/google"; +import { Geist, Geist_Mono } from "next/font/google"; -// The design system's three faces, self-hosted by next/font, for both root +// The design system's two faces, self-hosted by next/font, for both root // layouts: the marketing site's and bench's. The tokens read them through // these variables (src/styles/vortex-tokens.css), which carry next/font's // metrics-matched fallback faces as well as the fonts. @@ -14,11 +14,5 @@ const geistMono = Geist_Mono({ subsets: ["latin"] }); -const funnelDisplay = Funnel_Display({ - weight: ["500", "600"], - variable: "--vx-face-display", - subsets: ["latin"] -}); - /** The classes that set the faces' variables, for the root ``. */ -export const FONT_CLASSES = `${geistSans.variable} ${geistMono.variable} ${funnelDisplay.variable}`; +export const FONT_CLASSES = `${geistSans.variable} ${geistMono.variable}`; diff --git a/src/lib/og-assets/FunnelDisplay-Medium.ttf b/src/lib/og-assets/FunnelDisplay-Medium.ttf deleted file mode 100644 index 161adb50d1ab4029f256a568cb3278b6da550f2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33968 zcmdVDd3;sH`3F36&Rw#TkQD;iZb(ANezWfh*;leJBq1St$O1{&S6RcZh>Ex&Zb+?F zp=e$CS=(Ccu2tJA#iiCNRconICHKDHXU@4dH$Z=Fe}BC1=gnc}%z4f;&ph+YGc(UT zGv~rMW6TwihOxrD`~sgF+?O&Y1q1qG;iAf#JDpz%Wh`(xV{_IN*3{)1gVXP2%;iPK zw1bs3(Q!>%qP2|i7l7YhQ=3z}_Rzp}cy7mYc;`^Z@~2+&ngH(GD8Qq)V+?edE8ctH zZr3}ww&%T7r|w}a<1@wzUhM1c=$ha6?QigYAKoYS0bsw=?o~Xe<2kr*Xnf6)f0p0Q zm`6NlJ~BAc*>O|zwlm=O0>Y<59cz~Jt!zK==Kw!oxMQe$>l07>j4^xA*PLHIGB&=m zNOy{{S)VYb-?MzQdwHL3-wxnA0blhluAeX?1VkxF9A82;(xpDDn{yq509M!X-1( z|G{L1-bY>Ud`#~@p7n=$W_!~KltXgVF^Qn~(@3X50qr0=Nw4F%S-JCjSqbkG7;1Ek zv9GcjE3v@xiWgS0vn=2TNvVhC5l-)Jr1w&z9FAK6lfje3;*fSh*uxwEnZrDAaispt zK4X7D3i9Cn>ix&ScR|`6!HWeW4q=IilUXg|dbR`cE_O5GBkUyNhuDjVUt*sk{xhga zJey~OUKOunGH>7=h`af6yrmKui$VxNa78(?z+%8^Wm?_=Tqj^jyp1oxTgmnB zmW~#!W$kQ`tzp~QL3SH^p8b=DawE^;rJ%EhZ|D2?Px;IIJ^l&*nqQXeBo8S-ijcCU z4bp^kSUM&>F1;^(CS8;vaoI->mSf~}xkzr7d*rS1e))F!gnUYVR(@ChR^y_XtqIY@ zX)-l!nmwAEHODm%Yo65nQuC(PQyZx5(r(w@r~QLYt8>%M)y>nj>iTsnbz5|Mbx-PE z*1f0uSTE~m=zaB}dZRu|U#f4=cj`yc0P8&b}@G8cGY%m zb^~^+>>jdv-0pe1SM1)i``GSFyYKC__OA9L_V?PqYX3X?Pwc<4|K1_mAkoX$AC?(_$zKRf;1$>i+d9Ozu_ywdqP=Y7t%I3IWZjq`Udl8dv8kBh-2$|c2R zt;=?o-_3BDkuziUj6*Z-m~mpp=@}PheCH~;I=lL~*0>J2u5sPw`he?WuFtr>==zrH zIoH3qUUXw_j&1>NS#G6n4Q`!oBW@FJ_q#pn_O#ot+}?Ei%g}cA1?ud-?3^W*?e;boTwTADjK`?BCA5F#D3P#@E9)*f+*E!?)4*Dc^7B zxXl@x^TynWx%G3m&OJEyp1Hr6`**(}ziz)1et+_x<)7hS<=^JN+W%hv$Nhip|Gxis z0doT)1F{2l2Yeam5x5{QEwChTY2b>$?SZ!ho(?=8BnP<$g$88?H3y9a-4*mi(7B*5 zg8m-#gF!Yp8r%)O27_UN!DvV`EHsoFx}fFgya?1&JP^~U;=wc;+*ljS#yH`}qFD;t zgnoCL>$yAk@NIbV#P)Xg{XLz1tQB>hVIK-S21(Dj*enEbTg4!=A7 z{vO~FFgw66ASfUtASNI+ATQvdz@VU+KS&rk8Agp5mdcK?huInKz`eL158>fFiYM|E zp2JJ{BJ|HLJ^=bYp#MwhJ@h1<>;U>9puYw5zX@;;@Cld`5FqHMSn1Qq%-AzjnSb|Z zzKb!_py^%5-hmRxJE70?weHd{5;`wLJ-*n#Vk4EjEA+0vNS;r+l8$7?r ze~&TXON;{F@XOqUk-$ruBgIL{QYwVpPBf&Y(x5aht)VoYRv~PnAZ?X)Dlpra+wmDZ z8WPFom5_G~_vZoJljm_qw1NZo=1$xh@+soQ+>OV98z<(>W?~fehfISp>P53yX2eLE z!m?N~D`jPD5k}M|*2%h9KO0~pXiFa+%qt-CUN(kS-i%Rhg5AIlVZ=ScjS$ev{%V#Zzz&0opv*gDKaTbLW$hWY$D%t$-X7k09_ z825c)DfqGLnGfc)K+Jgtb`uL?huJ)K3yWlTVU{_@7O-1cD7zc8-~B9}oxm)1k|nSQ zSrYpZ^!s7VC6BN)_7j%L9%K3JXDp9Bf!XD0R?hy1RkEM63d}84>=&$t{fbqyU$O@F z8_Ya!v&HN+wv@fYmaw;22m3ASVZX zVcySccrE6r#k_?#@oLO&&Ag5`vOe}c>t?@Wz3dNcn0>_OqqogNpALf#r}GS9Z+Y|C zG#Y3~^KZx8uB15&$3UT^F>6cTsA-vHN~hJd#s){rW=ls^xQ>NMqiWiYxk^jbv^|TH zV$`%Fi@{)|(05`X{P$|wnFm2u3fu*9-KwTZS9;X68??V!O_TOyD`^a9PG}90mvd;D zS{H7^KbNQSat$<4tvmG84*f~Vt3!&R-ALO;(GIz61g+3zz1KjdL+Di&cp1{Yko7p) zvD=z1fSwKG>PFr?K*!LAgP^t+TF@p1XiCiu5=r5pE4e zlrr2a)$(mAQ{AU{hyYf-$UO!)l^%d`DN2L@8_uSeYvHB?eY*qsNJ>i)Q`xKWOnd|Y zM&;(9-%xrSG6@he|L-MqrCe8|l-1yJ8K^Epn?yl+-B;1JV9|KmiMoxWC8<54#M2P^ zbS3(79=Iw-Op+*t6iLqGh&zNV%8`%sf$BCYTHBVAtu9R0n8;~5b1ezSU}lXGa#m7l zpk9ozv=Zace@eF+T=hZ&NdBYKa$TvJ0n_+dh*~X&G^n;pKM26c7=vJh6i6SbC2hF~ z!0a@NTmyL13Hbz|U034X2iU04-LR|V-wW!5u@bsrk$Lo0GK`*9&V0<23?soid;^p6 z3d(BPBZD2|!x;PTXZAVG`2lQVVNPuT8(vtAc%n3?8F6`K8Mv+}%L`zs)s^K)V*v|z zZFMPP#$ahUfGVwiWUO!OFqb)CHp5!+iZ}Xy`9}9I-_XpcP!on3DAKrWDa-QCxuaun zoZZ>kG1kqFbaoCcXZw0aJ386U!T#P3wgoHTLAFlB<02jwao@;j*DzbUe0b#$YZ+U) ze2mqPQ+kmo!BfPpBBpgX7o#8-t2-J^3F0VXg(Gi~c0;UzBs7@Y?F7UNF@|;Q4Vnr=4lz>~yh@n-8A&UEH)@t(8q2-ybSgFI9DT~PMt z>c#41(-)+zC3_Em2<@>98gW#57ZwWd}%w+?<3%gt<{df4f(3tCRwH zfa{sSmN0W1$DKSAM-dbmkQaj>VbdU%a)MzgO_k~ex+DjMGPMq^;yHH*ZFcXK6D&0$%ULHp z4#6}6ATQ;i+~FcG(c-{S;6X^!JHort3qg2CR6Iq-8q6XgEC4nNwUuadk~#EyHex;d z9yqLWI`W4hdz9PvG;R!2lV0#Sd8DXAJ}C!$xO@)2L7t*(BIfM?C{VeI;1t#}KMK-oto7f92Y^4$;--adfW5%{csc8k-B}0jb-djCKEek`H{$*egb$Gp z<-cHF6yz}EL69C2p-R2CO21+rnnid=d6m@`z->B=Deh8d=XpR#$4}2C0LE zTor)J|A)=A1e9O!ABEePP9w9KR|e@e)cH21zbX{7V96%PO~89g3H%;57jm8pnU+Y8 zu?U1Z1S3Kyf{S{ORPW)qhe*E%o*Rpjc0*4H@3$;K+@Hoe?oJknbhz|1M$<;Ky=I7Y zX|^MTvJ8Hnbs^*cu|VjnTAVBqWW;j>r|=D0ZFx#?wZ z!3Q=6R=`i-RWV{Nif0LYF8o;jERhGmFY*I?Q$Z|=8+b50U~ltz@SOC)<_{5`j`{G3 zrNZyA0Dh=QtcKFzk&0qZ@n~p54EvPF(i(!tVdXc-2H<;(hm3~cw*7g6R%@i;Jez)>*4uniKA={3l3LgW-o~E9en%^BXMcw0 zb}2gx|I;1pPTmRY)dSu(FW8el!UN~a=D_pX4UbYUe0Tlu!7hV;X$U?m#Won`BYZjR z(iQNT&48cG51uX!y9ajqarm=#!RjNgNfxa7F<3*7!D`4AYoa#R4lh_Xto&aHzuX!4 z=N^PMJ_{eC7Pi#==+E|8RqccyZx1|q+u-~93|^n-;hlVj>G?Q3b2r1@BzyM>*g}Eu zc-{y-z85P-JN8SylCR>cu{X1pujA|a2EGyA>CJo#zm9L^+puG^gYV?K_yjzK?_)K* zAAZ31;0OEze44+5Z|xjAugh6F+P$h}=iH(bMD72zzik5baO2sAmVimPmL3Je5 znE0F+V@#})&6ubw>*!oL-mNPW<*3kHU4;Uzuz|)W$oa#)&Xs*DhkH9lR}Kw!tQ^-@ zDkbQu75r)&{DeeZjerWGak0sCkIhfX*VRs8#l`06>V!y~>!uN|Q(3Q5Sl8B#_7C^! z8U#VdhR*)c&Xq$wgWYTF8@l?tN4v-R$8-(7qaCZd9h;_J>Y4;d*DSI*G+QO4>rk4Z zLoKC4ZHCS%j4r{Xu3Ow3x~(tt-D;lhY4SHZ^jc9geUQI>e-tf)v5eREt2z3W98&*) zA`)Yg(jtkrEs~@gRAf0gC8b#7Lfx@1vT{`1`&WtgWBqIB z{TMpbFeSSCv8PQ4!~KGQpc|8$qTb`wyHUC4#CR?59_=6LqFx6T>Jse*2aWHw!BOP@ z(B!Wi9TEABF+!oymy+y7-8x5xmfDNzQA)+h6)kLxSr`QuiV9Qs08D*ORPQ2R6mu)3j~85IPefG>mD6u5knoL%h;TuWkbs_j+2Liyim&CKl!Az7>#Kq zOlw-ub$Q!)z<&s{Mo|m4M z&S0F!x{ycUgaPNt@)>JxtXiEl&hR8ST|{n)=^V}j!(h4-JP^lN$?7*@PUL!8A4`}c za6Ul;ZwKR2wp@fX@`!Z$R1Ul6sWiJY$U!S#vQr3Wo1n-sKUiryOw!6&3U2E4!MigdZUbX}q@Mi;IN#*?4UM>kXFq|@n`_IsU9dr|wP z_A~8A+V{2Z;CfyAlJ*7dv)U)Lk7*y$-j8rhdsKT^dq6v(-KyQ7U8P;F9l&#!woTiJ zt6E!zP^~S{W@}Tm@ra|eVcH<=9IcnuRqLSDXiVB5%_Yq@nhTmwkvgyWz2sR;gy(&lotiD0b((R_u%=J5RMVoV*DTVMX!3B1 zAQ@)~B5PoJcs1 za|t)g*UNk4?eZphjXWw3;=DpTPA$|TRe|#hgK{p;F(l$NLpZKr*$*KY=No2X=l4m( zIyf`Fmo7?Q!q@i^PC&c^kKaqu3(~XF6VhY4&!mT>`w<_Lj*2r9$D{+|n!rxz25FVF zTpEzNq&A$OXq2j@GO0kymQtm7DGFDZ6oh?MFUeJMkTl%HFJZs+f^@&-;-B*K*ol3c zG*g}{Vw@*I`cA}=a)C&vi#P>w9d@^%n=(NR@?yj_A~wKE=G;%DD`di~5a~?{M7({2 z(h{e)h$$VbK*ZZ}5f6%T2L&fLi@fO~9uzbO)iiN+yOO3{?0Fel&Z7lniHM^GwFr@J z5plnObclF_V(Dd(?v$y%OVu<JstJw-8aP$Cobk%nXt6XwrFe51g>QQ$8lI($f^*JAXb zG|6E|;JhQ=mQb443h4z4u4)B-t*Awf0)JGb*NgZ^N?O2o zi}cS#yj#H(@j8m-0+D`MgVC73EXw*;VBRj`mqm#$i}Ym$BJf`m@dqN;2LzX##oG@E zF3qQyy-5&uTwvZK;tGM|C*D3lWwF%)=K+!=dw|M9Ou62rSQ=C@L5)8zC_E!%{tVW{ zoIfKVts-s`@kYUaxhQ3$z}zVK-zXqIR^S42mq_mt>6ZlNO9Jw}h+h)$BNR)OB7IWS z^rUE!lcJP$0`sJxe^N~oSHD-%$R%NwLnqo8X4GKZ=|o$QIMHUrPUsG-^yoy}7I;!m zV%DT*MYh8K0gHsJx zUavzES6rB-uDY;xoPIrv)#H^Hm)?eqxO5O!6qj@&og?A{BAzYcEwCIod}Y9tOAt%K z!XS^n7gn?mXuT-3VHVc@b8rHs5Np#Wcs_#R3Ezk}6KKH{wB+4rn^QQ|QO2IaRRf>K zJ7^sUlB^WIm8j$1K4pE#AIUpW;+rV#oIHMwYgq1+mx`+eaXqd@S6wA?9>qj+9R&*h&SQdBdxjW8pT;DLkk%&^e;20>xFc$-Zz+an-3A|@^7tVv*QrdXWP<$M{z`H+CTBhoZ(aK2c?^@5*v zktTm4my9AUc7l1ANN*AGL5d|MFHT4k&!XJjBHktF+#ujT67iSjW56NLA;+#0V$AcD zOR3lYh_`1&-d_v&3Xxtb(szpV1C)k$2C)<((gMPt7dXEXIIoE`B2eBa;$0#>EBJXy zq>oT6DW#u4TIuWm`AGdUjMPtIyna-S*UyRZ`hA>eTMplm1bQ@TV65R0R1Wswl#|7@ zCs_hG?a9(88;>ysV=&GJ+>a;x;f@s-ypd6Oz#Uk~tpw1b{X(M0S%Apzh+R25?Ad(= zZ`ITA?T+KjL@my~&|dsk*onJxA8rQrksaXoc0_PNn8DKdJlsPtzG;E)!2W5zz`jSA zMA~G24`pA%6Q%6gcjk}8(?4PXwa$11Mca z8Z>}$0V~h15MM$*OIcHIzeNqHJWJ`=xx|x&iUPd=o|GKlLIzX3z6$E!qUH+MI33`$ z$H@m{s$};%$;zS2ehv$R-2YF1;KJq)ysLlaS5aq%7!V88{DSrEBlPzF@;ALaqM$&` z_nTiu`gVG<;Fu3tN-)1?Q=ZoHUgV|`g_$3*V2USv6JhyNsefy!18`pzWlWeS%->=U zz{7%xH{%HZvR*2s+Z8@3mxT{#i~48b)A~k~C2)mg%`ccA0S?uaq>FqCUx2IaV7Xf; z{;T`7`Mf&!zreGtr7BMa6Z}DZi8ylaM{+0DLhz zh}7+BTF|k)vD}q5!_$Oqebka6P3Ax{RofCRYQ8XC5>rn|`QiP01hGJ;Xj-%c`KNjU z+Q$45N=Dh{0i_IuKAzByQ zwT%t0^kfQ(9=xTVpD`Ww}U-YW4&q-VH@N79=MqQB6S=qZ-`^oG(( zEK=5Xx52Ttg+;37dju|N2U%T0PZWIgzefc`<#_sA1?P&`rsb?}t_8Ec{7({7HL_q| zQBx{G=>u_uq1MdWE7V?~T4NR(z!NjB&9jgn;EEhoNm;bm3V+XhNYQzV<}2k{=CP@F zQz?r^n?If^jm3!`sg$Bvs?m5Gi|-AhvEIA~UpU+cfA-yCU;R_=0^9C0?26B2f5Dd` z{@CdaS>~8-9mK6L1uoZQ%lgOLyjQv}jBf%~zS(pZ-gHZxU zNtuYV;CYb6o;Jtn#P{IRqK34m{1A4JwOC(2 zjl9p`(u%dd2K&X&0df|*&06>aUc~OjuW@N$oxjX{#2VZIyYKJAKK%ffFT5&btA31c zCOpK~gENKfW{C3$vxEd^2nl-g03LwTUqL(waWD@?JP-Er44fVa$H^0tBkf$kGl&{% zg&YHf99>W^Pe93cUDa(-ZHt?|>mjr*)4(yQc#3jM+ zv&Ey={ba)49dIl{#V7`wnLl{IDLKsGn*mdUT*e}f= zAom%1=I-Vre74ya&oQDzceKnZTzw*@)bvY%V;2hjfWE!jiB>rR+0%DRIFo_iK=LLz zi*IMK>Ld9v$c{mBI5CQ~oF7ij_`$Q_hn3?jz+Bn87|-5A_#MLU5&nSiKEekWZ_eTV zM}+eTA0m8&@G-(C2!BHO6hT5Q%Ovt?%d}(I;1=jMFVHP;kY6&@^A^*+r{!~(gNoz| zT0iT+LtLuF>*s_px!-DHt2ZMVcxKRiRthOj<2b4cI9FArWNjEg*QQ`r{Gig4bbx`xRVvXY8reBzXo4oSn=hrtoSV!e6uTj zY~faTJAV(A#=V$wW$zFfD1~>lc{z z_43UTli%A2Xw6%z{B;0g{dB(WJg!m9c zV1k-3wDKE^mZg^@MU=y{ty$R(ZW_Dz+SL5slr`CD z=^4wD;^ULZw-9UoMvlgA$XtBn6ciGY5TBT6M0wtZkPt(V&eOvSWh5D0B>vKdC%U_z z*wB7+`;3DwD;hT4aKomC6)p#7wBPK~`^=^-Pxa=ktuLy$bI+bTD+}w^<&eAtZPD7~ z)27ybRkX&H@J47nwNk9tPpQ7Vpg;x_k8hhUcHT;q1qH$3Ou=Cz&Pov{SPjAN8jek1^4v+5 zXUuHA)FOri<26e2GL&Ln%rr_TVL+&V9x&yqU_jI6- zd8(Im$K+Wl+f>SLHTCkJ%HgCM3ZK#)f=@41lGh171r-~3Bff|t{;z~LOoLOuQRq}n zgOh|6c=a?m^(O^hgVEngU-Tyh-eSQwyGo}-e^TJ>Vq{WkOZ#9rmoR3q)b_KzQlhDj zA25xgp6Aw(HpZDR%JI;~`PbA&Qb*Fq#DoMx0(ylf8p5E{@n=>(*46jqhK`$;xZL18 z+*q?dFMnNCR#(~uE+?gK)%tFB>U(+j(g|}fwB)w7aNnQ$mHQ_6*Du*hqI_3r)K|pogTKDqPd-s~k zio-n_R*K`ziDxQ^GC zex#Hj*+SdUD4bRT(rJ`{v2V;xpOA#wCVA>HFs$$G-TU2l{9zt!TouP}Fr8Yva_v`Z zRc-q_a?B7sp?;)oF#EZ|t@Ya7R!;7fR!#0vbJGk? zBM@aVxDf%PTyn%@)NH>AGTkoqO=3@U@&;*yxQ4cth&raIa{ka#$7%3Jc*#ZGAxF?h z-4*;cST-apg$~W43Vbnae9?EznZlxQL*Gv@CQNZejV=W~V4ACPm7etciYk@0pGZ}g zcR>%(o2XCrVCwlo@4k!p6?8?tv($ROF6wtByn!9Ffm2^m@T;c5X)IOXHTX_a zj4{Nw4gES;dRDmTD++!K(LoQ7GyfL#tizZQK;vXXXp&{x_D=HF3sXU72ntQ&>ICjB zsvgR{eqNfKwy@`C>sL1=mnEm?qV6jf%e*?JZ1cgO3!4uH2AF=Fx*(x4@$PO2BDx}> zBJu7X2qWe=|DE4myK{QC9Gl4L3o(WHPf3MZQQ>Z};7+uH=5KNW)-I9LTEW|xV4dVJ z#$nh-lVBi^7j}ji+4*zhr+Ru$jW6EftC5mT{l<>4DsYL18y7OUNCItV#YNr8=^FS5wmj`jW5=q%Wb{Q->SD%&bD2{7y9gqrZE?CK41przq_Gd>Vy=MB;Alqf&^2 zHj_4bV;x1>n2-=9S&S=ENIeF5ZljbEPtF{;trpF*;b+}7M+g37dQa8N=TlRPU50+L zLeb6@KN*}+JjSDr?cQ_OU3+#Pv($DHwROY#8{E>&NamuLATj$)vCI!`x;`<%n7qfd z@^XG@Y5rw7e7rxs$wz~k@HL)edX7Jyo1P(TH}q0zQfOtFs`dMYR$d8jM1Qu7bl?FN z6XD~_CG$n;HPnBesC}qWOx$Sg&`_bRkS9z`VPSfE3!UW$?s~@ldfoD_#+J~#C43!U(oI@D-*kewwnE#w#n^8)%XCi1A9b9n`!14+LO>R54gz*wMe!XMvb`a(L5@YotLzX%*ryLwT(MtC5o7Czt? zdBHEiF;^83zcm<9+(8jGtr!Ps-XyyzK}?|hk)bkuuB`NSGcom3?EAbnq!D%E^@T;c5X(UwOHTbQBYtgAw zXA-48w0cwUTdZ_ksh(DNJJ!%s{L|`9!S4V*$pw}GPE070rrDA#f_l@LBV429@?p~% zOm)N3q08?OF4|fHD~jgU4%z6gUNU}9N9K+fZg@cZ)6Hi!_Z_-$;5iM<^vS!V4hooH zhbC_%9z=d2!!AXJyk6AtN_Ybgv4NAU6#S}baFUe*ufZ3@G+V+-kiEbkSqq#C_UIs^ zL3ZY`ra#^BruK~^ra$r6yFbx<%J1jfP4Dwy(O+!LjQma`uP&4ws5|Cbyy^L z5M{}W!NVAM*74dBlBxnNutJ+=PeG?}8*HGdR@^EZ=oD_v=Tj8sT5(%cTvwcx?NXt7 z-pE$M@kNa%WER8H=u8@<7HWX8p$zE|9*yX#_`HpZC&AM* zP>lWLM3{#$C_!;6@IW!~OQuEFg=j19FX&6%Ja(!iFFxO4!tKCF$*7+uY$UI4bFnEw z-%(~PbD40i7@K^nqU&^gdNw{u%CoD<$!>N^j~|JyOKDo_mXfs~Y;jL?Ok`Z~)`s}X zmYA^g=GbL5Ilhte!(zEhc5yLUJQQ=%t2iU-rOwHr1~f3ODlDu{GZd-0A1xX13qO!Q zq4Dj`t6!h9aPwGgQ&VkebF))Y{F2?$bEY$~31$12EZJASvTyO?zWU;#VhqH}?6(ne z!h9@7V8yFq>r_cHV&U4-vZuUkPwVK-Ub||Of7NQ<8_ni9Ivpe&ChRkDnGDf$=nfr4Dpb#x3eBM3MPU2^XoM@-v!nwwHhUU`V`RtJ%Bt!*HDzGu zfC=al3o~o*y$bzqk+SlD%}F*7jo_9M3PvZXlL0GAd73IUUw3@Q^|N<0v}k8_<=1V@ zzjbFxzkm4t{JZy*Ha3;iw6}v&=WT)U(=g_!Of{M^-d-wvd>QKiexVhYvzUNjlp_$vA zzhcKkWqJ7`xyW?d7{6-;Tp2Yb6%{3>AFDGvQJ7iT3gABgzCcd0QtwpY*De+KAA;teZ0OXO;l@U(@GSDVGU=DX zWtU24CQdzmY2`jtGiqVL z={?cL-2PtEw>;qZ`^9ME+24L`I>J5Ee}`I@z}`n5)bc(-sSSgM+7h5-Z3(&P@)MSp z(3ArE0l{;v`4;vy;AlDiq8Nt>4zE-ONif-Tg1swfE7)ynJ3|-o4NQ^P=b7?LxeZ~h z-PFVvL@$r#KQ`Tpo9Q5U35DI9CUwFGr}SJ^^I#3o5}Gs_hLm#CdAbeeABdXMT~yfZ zFX!%Cv326Wfr*3ph5WVMON>d0iG$l#zzA(PeAx6L;?iQ%gH&6TApI02cugU& z{-9CBA9s*Yu>X2l(%ler#pg2d*t;e!K%C+rRg0 zbuQUoQGTGkV_#X>{*JoV*1FoZHr1La+t-fSV^v>sOHc3O=02(`Srm5&8JrTes_nfN zv>|B8YHt=z!{p3z zSGS{7XO`@>E+b`L7^>P+lAMuLTE4HNr`YEQuedq2y-(KnxV!!k5geZzHnI?AR77rk zcJ&169&tSncXk|TDcZDb@w{wr)4Q{*GN3k8xLT}oby3p+iHBhCK4sdxd@ZvU(+kXC zVVziQB+HE5w7)>V2H zoC=$^!A8l*2SgKJsKL!0bDhE%Y+C9Zegh?oH!sXtU!T|QtGQ1#X}^}9Ba@A6Pcq@K zx6ou`)8ZsEN_q(6fCu(~us3X(o&Hrh7{=yw=EG>dvKURW>69_?+QpEryGpNF>XYv_ zHF?wcq0ZjqH?x|7lC1IVDyUnZle=ZHn6&duZ>m<{*Sy4Hp3{synZui=>`{y)@bB~U zQk&Jv5Zx2z0ldU+s~{$y{=B&4x(4*dv9!#UORG&{J`}k`uQ{vqni$evmxvDw}3T&u@}428VXuboid+6uxob^yvZ9 z#%07m<+&iAMXg>E5~%N3Lr}C2C|RLxf1z3xz%%eR=5)+3^mbt=f_U74r+qAdtJgVKc z=efhTX>LWfO8zK?$rJn`Q?1fQ^52BK-h;g0Wx_AYP#pwS8+ZeL(`5=y(oyiMrol-P z3cN;GOM*LTH@Kq{EAFzEK?-FHzR zJw_v{xeG?T1Y?p~c|8W!^1Vr>O9!6Oo|!PSBrjv?*F)Q-22&A#V)De+_*CLf zQ(C|JTF{1|DJa!M!L71^Qau!C%{L_DV6?_O@C1u@%2$RTP=fdVFQ$iha|1s-)Lzkvy)F8J+Obm z^asoO%(6)1Uz%nrttlN4*5?i2DU{uc-=7keHixCDzTa+ruV)X4_YzKfZQ*;R_rVEl zw;HRzj>gGrcv>VVUROtL`7Ds_N}q6lOGr zg~iA7bsdYU+Lu&UFR4mc5NR|j`wG*R=YOJE35w*4+X{+`_XTTpF~WkZ&Gex+WJ;I}mEA05W0TiT z+~%-LS6foqTwl0(dwOx@!i80iTeW4^)m5)wn3q+&sC1Xpn&IU1qOA0S!K{SDobKB*CR{N|<;qRJm znXOIh*l_qRr*(r#8TBRQH9`LT7b{Zw6piEP#Fu10* z_V8`@KX~VggB}wz3X&GLYBm0S+0|=u3$JS_sb5lA(A?ql%5!ghysR@Ode8OveW6v0 zYB%PO)E5^wmSB}NqR;}Nk)1JU!R$nkeQi~mpgb67Njq(;~M|&+(oN$3b)kXde5EL7dA?~wYaFh z*=cwn(Rko?V`BDbSoqn(RW?Z@vy-?YcGN7{bD-X2Go50mxXc_#h-O#{`)907u z#AME$TRBqgV)eEmM^h$98m5v>~i|5Z;6K%KCGcI}>c7CrHP zr6;=ozuXgJpzk;Q*FAChQS`*+2R(PY6ecw*J+TT-*y~zL8vdi6h?Nz5{I)%Dln@iHMd=}FL3Q+-9w=EOO8#7w zO#eFvdhJx%h6HzI#tFq92lj830ww#;{@R$8b#8||dFsky8nd{wX|lNS?!%_vsPr>X zv(KTU^KpJX8NX#nR*KDxG;JnT98a_g6C*Xp&dL=Wd{ft??~+4{DU`TX_(xb%E!ZP8auKzYW`&#B;w)>cyJQ%VD-Jto#x?E)R|5d zXmJvWt(IZv%Cb!f{WJEsB&j(s^8oH*`o?tLbjd8!VWVM$WUT zfW!>uAc_1sqVya%;PhB4Vi|%)r43)yf~r9*CE3=C??ds4q4SH<(+V9XoDZ$8T%D7M z;%7@4*4l<=C(f~y-#cntl9N^+N##$~9y(ye{}uBI-=QO|VEBDY4qNRKACcl{MZVhR zd_Oq{-&{}>9$vH{qA)zX@RB7F0U+sQI4_lQvF`IhuL(^`3Jp#2_6~(s>XUHDQ19)n z4-M7-sxdFQb|`45(r(bM68GBVyvDo*5xg|3HOD=;#}HIEHd-HK=m~buZq07R7ChPq zZX?){;jqBkGGU(m$q9CGYZD8-Z1w#uCMhw}clkPCw@yD)v zyZ(qj<;JrfBCcne|HdDeQ)nJ&z@R#lhp#uiGlRB6u6Ubo!0X5Hay{PCI|F`W_AEa` z{nd7@HyRif6@b8JM+OE&Q2_3Ip3Q#2Ke!TibzmeRMDgq>x*;3Mk$r>T+@b%ihOLHW z9nM3)8OJZ+;RMA+DGa}^p~7SMrHjk)dwPI>t=Yo+tZ>buuWh+ zOmwMj@^-1~o_Z?5T*iwaQ5roI^)l-4p@^6F+2Zo@;)$~A>ax?Vmk%8>FYPs%c28XH zLmofmNmujGEGW^m0iDqMl~+}lO_Y?Cm7MOoJh7Wgy-Ur94qa|Vo)F|Yjy$kY#6C6V z&d>y8hC(MAJ>fH@{4~3ezVqWP%i}U~@>1iLx0EK(cPI&^r$ZKH-kKJJpOTGDy)~;c zWH3DO=B!)?jeSn`kwp66If$#HN(l`KGz_Av&;o;I=>%H%P^~=Cp-6lEN)u8tGE(Bp zT1Vp2u#|{fe%eYfHwy#@Ln^awO^royF=@AEE()Pmu0;vUQ3B>4eBFeNV54U(pL6UO zzHI8he3AZdLO*jkPgOCnCdPLLZhps(@j0jZWyk)@2J|s?w8pMHbVYgQU$dhakMWH0 z*b%=eP4EoR;yz~`&*VEpRL*8+}?26#BZQ8Mt^Hz*nHSc96=em4o#=$Vn5 z6E`0d0sjm$K-HYtfk%N2D(v?b>}$;#{IjaLvjS<-053r-8o#wOAG}10G9!tnX>hDR zz)O_imHx+#Xx<^sr_=7MaU4SL{nn$89(eT8=t=w$ueR@#LXF<~Ae;A~n}=WL!`C(_ zFGkR%uTLo-;Or4_4K1$0^pJ;7%XpmWRlHe(FVB|X4Sc%r`dfGWX;tpV?N9zFBk9A} ze*XMv$zk9-?D?D7z$AUImTaET6k)Va#dnqJ=?QWfs2@rx+cN5)OG{_kKX9XC$2O;q zaeQ<7enRrGKdmo6@XIyJpV(Pkym3)dmZQe2EFq^0OVM0osi$UbQdMO8Pu6UIzQ66K z*YO0?uM%@}6VnO{*Q|JL-{7NL@-s$`wl(gn3ZFkeJZrSHY(>`m&^*(!0eTiRqC*{}lavF)sv4k6Sq{R?gT)BNz-l_R zYTd$wss;11LUxV*?7@tj{FGO=tXgGy@VD<2)K;hT6{Oe1={1g#dExCV)+EOplQ(V} zHXUAbF(W-K8>RX{;)y8Lo-{7sO$;4I7^S$lJhbWh^+ikjPxC+9?_9QW;&Kpu`bWG5 zo3q8bC=tJ)EF?ZapZF~Y#2cFbz42%!xyE3&vXsDPOy?IB=-YV@*yUyz3%Cw|I zy*usy5!`u*<1oVODuU>dpO~F^RQDUHt;bPZ~lKQ_iOJ7p7$!qeCMd{XE<9 zVv4;ro~6;5t?{dSQj%ll2Sfn8q#(Lrt|q#xa}~eECET~dBhVqjKQJ0yRAyP`4e~#s zHSX}Th+5FmY>VEwNTG3=c#e_`K`t0a{iLL+d2^~l>WnVU>3nE=Ny+wyIxY8#iN3V7 zzKII;UYXmUkvwuLdv}UP> z@8sECU8b}AUejN>yQzgcn*Kq7Xr}Ww_`R6x#jZH!Y_hDb=^y(#wmKI7;;Ld}tKveE z@VP`%5`V)AL83vx0H-nP66T0@7zG%k$X9!*@3egRvW7~WdLz~^FmJ{CzCM1MA2to* zi!8*TkPYMrP;f_YmT9?ZR81!gW}$8}x3epUVFaV8esrwd4*!YbEZv|T*-CbUI@6y` z-w_uU8nBW&5|RXsgexd{CJ{YvPyDbh2-VbBX)4LFI=ex=NpGPnlJ%oRI~g|eezb-k zda&ZaOM+!L{i9DZSM{Deb=AIot9o14xbL1(g2QXAbU<M6w~V=jXvr3!WkztDCB_T2(8dr-q9!F&`0u=<6H9`++y!=XtwzVxGI^-j({b(M7s z;(cR1>*;A$Jw45i^X!EWs;^pky)p7mqR zJ&rrN^A@HW!{VLi`t+4Iu5qlYc3Hn9BRerNIM#Wt_h9vsb1ct!;JdDhJ!Fr)2rA#+?S&j-u4-(%^EUgem#H1^BvB$b-7(*wJS5m zI^tqW77cf0XDpa7c%3I|<-njJ4YbEfjAXGDCc?95Lq&mfH$6e`(9sT2RJ zkF1U%pr^H2uiCB;QI6@`fXK)In?MDhkMdU_{3gpg>I0SR0w`yKGK~~OSK)Q?0{DG> zc=(fH+EuA%Tfp&2^1H82m^Uv$>simYnKnwgE#r6JJ$`Ojsg)I{dtSmkPpwvJnfzYT znKtrmTh0xi118E_i2p%kM0yQ%$2u>^Mt)STDnrw=D0{}q!ISv+@*s^UX z#sDS3MBydoHQ3l>HNniN(fHwzQfOXx=yj*@V`G5^2h>i@>8lst{~%PIdM>owP`io}*m$8ka> z6*WP7=h*OM>-pgi`bS2RN}E0J+lhS?oR(3JzMh<)kn6V0Ozj;`??=j6|m{+I0hsO^-hLeLw?vU=o+sB~WdD4B7 zhsaH(iT8mb<{_PXZ!rDO(tU>%T!GKoD^eWai`f^XYut^V@+;Y!mH_0XF@1@$I>5_! zpoa00%JRkxs_)pnb#G5^H&J;^)6#MU7I92WeX*yzr>A=lvEAAV&Nv&E?&6=z1)|T< z=&o#HieF2JNUe_2v}vOwBBHfzny6~&t_9`MfuW&+(d7$Jrw64w`A_ic)53Ov1plS& z!Xtvy4Tkh!CH4*q@!QcAFi?VXN%(r zy;MOZV-{p~M1`ls#F#EN&Iy>MTU}=t zm$D#6DG!-5Cxn8PlRz6zU_@QTNm85N zyn<-24w@$pLmOX^ldkTQ7=FnIAS`#jeU8B}XRg8U3c_5ZrTgXw1crqL2F$nINe;)+ zYG@Al}!BXSEOEx#5cE sM)9on3%qX<&#JcLxmi4`T8ihz;#t)MM0gGU%NG8B0DS;0f&c&j diff --git a/src/lib/og-assets/Geist-Medium.ttf b/src/lib/og-assets/Geist-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..97712e55158b9d480bb143583e6b410fdcc6a34b GIT binary patch literal 78324 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 z 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 z≠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 | undefined; function loadOgFonts() { ogFonts ??= Promise.all([ - readFile(join(process.cwd(), "src/lib/og-assets/FunnelDisplay-Medium.ttf")), + readFile(join(process.cwd(), "src/lib/og-assets/Geist-Medium.ttf")), readFile(join(process.cwd(), "src/lib/og-assets/GeistMono-Regular.ttf")) ]).then(([display, mono]) => ({ display, mono })); return ogFonts; @@ -116,7 +116,7 @@ const OG_COVER = { width: 792, height: 408, clear: 384 } as const; /** * A post's Open Graph image: the post's Cover, drawn from its slug, on the * right, and on the left the site and the blog in Geist Mono over its title - * in Funnel Display. + * in Geist. */ export async function renderPostOgImage(props: { slug: string; @@ -204,7 +204,7 @@ export async function renderPostOgImage(props: {
32 ? 60 : 68, fontWeight: 500, lineHeight: 1.04, @@ -230,7 +230,7 @@ export async function renderPostOgImage(props: { { ...OG_SIZE, fonts: [ - { name: "Funnel Display", data: display, weight: 500, style: "normal" }, + { name: "Geist", data: display, weight: 500, style: "normal" }, { name: "Geist Mono", data: mono, weight: 400, style: "normal" } ] } diff --git a/src/styles/vortex-tokens.css b/src/styles/vortex-tokens.css index 0a69aeb4..94323240 100644 --- a/src/styles/vortex-tokens.css +++ b/src/styles/vortex-tokens.css @@ -1,7 +1,7 @@ /* Vortex design system tokens, copied by tools/site-styles.mjs. Edit the system, then run tools/site-styles.mjs; do not edit here. Made by: node tools/site-styles.mjs --sections base,brand,site,blog,tables,focus --faces --vx-face --base - sha256 a7ae816f9bc980e73641f7b6b1b8f885494472fa08d1f6c8488a99bbb8170352 */ + sha256 bc548874946fb5a4c2dcd0a7d31446b38ef81bba86ca56268214600c39893b8c */ :root, [data-theme="dark"] { --white: #ffffff; --grey-50: #fcfcf9; @@ -167,7 +167,7 @@ --control-sm: 28px; --app-row: 36px; --vx-motion: 150ms ease-out; - --font-display: var(--vx-face-display, "Funnel Display"), var(--vx-face-sans, Geist), sans-serif; + --font-display: var(--font-sans); --font-sans: var(--vx-face-sans, Geist), system-ui, sans-serif; --font-mono: var(--vx-face-mono, "Geist Mono"), ui-monospace, monospace; } diff --git a/src/styles/vortex.css b/src/styles/vortex.css index 529d09ff..1352d676 100644 --- a/src/styles/vortex.css +++ b/src/styles/vortex.css @@ -1,7 +1,7 @@ /* Vortex design system components (sections: base, brand, site, blog, tables, focus), copied by tools/site-styles.mjs. Edit the system, then run tools/site-styles.mjs; do not edit here. Made by: node tools/site-styles.mjs --sections base,brand,site,blog,tables,focus --faces --vx-face --base - sha256 82d318845b84ff15660bcad8ab61386594b28ae71d0a9d75c09c2a5616c54ed6 */ + sha256 d109f7cc38896a0f9542ab6b9205736a54db6c79b33bb82111ac83874e109e13 */ /* ------------------------------------------------------------------ base */ /* Every component sizes with border-box, so it draws the same under a site's reset or none. */ @@ -19,6 +19,37 @@ clip-path: inset(50%); white-space: nowrap; } +/* The skip link, a page's first tab stop (WCAG 2.4.1): "Skip to content", to #main. Hidden as + vx-sr-only until it has focus, then at the top left above a sticky header, on ground in ink in + the label voice, with the shared focus ring. No script: the fragment moves focus to main, which + takes it (tabindex="-1"), so the next Tab starts in the content. Main draws no ring, the system's + or the browser's: around the whole page, it marks nothing a reader can use. */ +.vx-skip-link { + position: fixed; + top: var(--space-8); + left: var(--space-8); + z-index: 1200; + padding: var(--space-8) var(--space-12); + border-radius: var(--radius-control); + background: var(--ground); + color: var(--ink); + font-family: var(--font-mono); + font-size: 12px; + line-height: 1.3; + font-weight: 500; + text-decoration: none; +} +.vx-skip-link:not(:focus) { + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; +} +main[tabindex="-1"]:focus { + outline: none; +} .vx-card { background: var(--surface); border: 1px solid var(--line); @@ -392,9 +423,11 @@ [data-theme="system"] .vx-header-mark.is-light { display: block; } } .vx-header-label { margin: 0; padding-left: var(--space-12); border-left: 1px solid var(--edge); line-height: 16px; } -.vx-header-nav { display: flex; gap: var(--space-24); margin-left: auto; } +/* The links follow the wordmark and the end group takes the slack, so the links stay put when the + end group's width changes (the blog's ThemeSwitch). */ +.vx-header-nav { display: flex; gap: var(--space-24); } .vx-header-end { display: flex; align-items: center; gap: var(--space-16); margin-left: auto; } -.vx-header-nav + .vx-header-end { margin-left: 0; } +.vx-header-nav + .vx-header-end { margin-left: auto; } @media (max-width: 760px) { .vx-btn-count { display: none; } } @@ -815,7 +848,9 @@ html:has(.vx-header.has-tools) { scroll-padding-top: calc(var(--space-64) + var( .vx-post-row:hover { background: var(--wash); } .vx-post-row-meta { grid-row: span 2; display: grid; align-content: start; gap: var(--space-4); padding-top: var(--space-4); } .vx-post-row-title { margin: 0; } -.vx-post-row-excerpt { margin: 0; color: var(--ink-muted); } +/* A reading measure: at 14px, 54ch of Geist (a ch is its zero, wider than most letters) holds about + 72 characters of prose. */ +.vx-post-row-excerpt { max-width: 54ch; margin: 0; color: var(--ink-muted); } @container (max-width: 560px) { .vx-post-row { grid-template-columns: minmax(0, 1fr); } .vx-post-row-meta { grid-row: auto; display: flex; flex-wrap: wrap; gap: var(--space-4) var(--space-12); padding-top: 0; } @@ -862,9 +897,9 @@ html:has(.vx-header.has-tools) { scroll-padding-top: calc(var(--space-64) + var( } .vx-article-byline { margin: 0; } .vx-prose > * { margin: 0 0 1.1em; } -.vx-prose > h2 { margin: 2em 0 0.6em; font: 500 28px/1.15 var(--font-display); letter-spacing: -0.02em; color: var(--ink); } -.vx-prose > h3 { margin: 1.6em 0 0.5em; font: 600 22px/1.2 var(--font-display); letter-spacing: -0.02em; color: var(--ink); } -.vx-prose > h4 { margin: 1.4em 0 0.4em; font: 600 18px/1.25 var(--font-display); letter-spacing: -0.01em; color: var(--ink); } +.vx-prose > h2 { margin: 2em 0 0.6em; font: 500 28px/1.15 var(--font-mono); letter-spacing: -0.02em; color: var(--ink); } +.vx-prose > h3 { margin: 1.6em 0 0.5em; font: 600 22px/1.2 var(--font-mono); letter-spacing: -0.02em; color: var(--ink); } +.vx-prose > h4 { margin: 1.4em 0 0.4em; font: 600 18px/1.25 var(--font-mono); letter-spacing: -0.01em; color: var(--ink); } .vx-prose > h5, .vx-prose > h6 { margin: 1.4em 0 0.4em; font-size: 1em; font-weight: 600; color: var(--ink); } .vx-prose > :is(h2, h3, h4, h5, h6) { position: relative; scroll-margin-top: var(--space-24); } diff --git a/tests/unit/og.test.ts b/tests/unit/og.test.ts index c0932525..d49ce64b 100644 --- a/tests/unit/og.test.ts +++ b/tests/unit/og.test.ts @@ -24,7 +24,7 @@ describe("a post's Open Graph image", () => { new URL("../../src/lib/og.tsx", import.meta.url), "utf8" ); - for (const f of ["FunnelDisplay-Medium.ttf", "GeistMono-Regular.ttf"]) { + for (const f of ["Geist-Medium.ttf", "GeistMono-Regular.ttf"]) { assert.ok(og.includes(f), f); assert.ok( readFileSync(new URL(`../../src/lib/og-assets/${f}`, import.meta.url)) @@ -32,6 +32,7 @@ describe("a post's Open Graph image", () => { f ); } - assert.match(og, /fontFamily: "Funnel Display"/); + assert.match(og, /fontFamily: "Geist"/); + assert.doesNotMatch(og, /Funnel/); }); }); diff --git a/tests/unit/styles.test.ts b/tests/unit/styles.test.ts index 7c4a2e6e..1c633969 100644 --- a/tests/unit/styles.test.ts +++ b/tests/unit/styles.test.ts @@ -9,24 +9,27 @@ const read = (path: string) => describe("the site's copy of the design system styles", () => { const tokens = read("src/styles/vortex-tokens.css"); - it("names a font family only in the three --font-* tokens", () => { + it("names a font family only in the --font-sans and --font-mono tokens", () => { // A literal name would skip next/font's metrics-matched fallback face and shift layout on swap. assert.doesNotMatch( tokens, /font-family:\s*("Funnel Display"|Geist|"Geist Mono")/ ); - for (const role of ["display", "sans", "mono"]) { + for (const role of ["sans", "mono"]) { assert.match( tokens, new RegExp(`--font-${role}: var\\(--vx-face-`), role ); } + // The heading role follows the sans face: the system has two faces. + assert.match(tokens, /--font-display: var\(--font-sans\);/); }); it("gets each --vx-face-* variable from next/font, on both root layouts", () => { const fonts = read("src/lib/fonts.ts"); - for (const face of ["display", "sans", "mono"]) { + assert.doesNotMatch(fonts, /Funnel|--vx-face-display/); + for (const face of ["sans", "mono"]) { assert.match(fonts, new RegExp(`variable: "--vx-face-${face}"`), face); } for (const layout of [