From 2fa04ad4c157997e27134f0763390038a40a56fd Mon Sep 17 00:00:00 2001
From: Joe Blau <1218847+joeblau@users.noreply.github.com>
Date: Tue, 13 Oct 2026 19:05:44 -0700
Subject: [PATCH 1/2] Adopt pinned HIG presentation in Chart docs and demo
---
.github/workflows/docs.yml | 2 +
apps/docs/README.md | 3 +
apps/docs/app/global.css | 121 +++++++---------
apps/docs/app/layout.tsx | 8 +-
apps/docs/components/chart-preview.tsx | 7 +-
apps/docs/components/copy-button.tsx | 14 +-
apps/docs/components/install-command.tsx | 29 +---
apps/docs/components/search.tsx | 1 +
apps/docs/content/docs/playground.mdx | 2 +-
apps/docs/fonts/README.md | 2 +-
apps/docs/fonts/SpaceGrotesk-Bold.ttf | Bin 116056 -> 0 bytes
apps/docs/fonts/SpaceGrotesk-OFL.txt | 93 ------------
apps/docs/lib/og-card.tsx | 13 +-
apps/docs/scripts/check-export.mjs | 2 +-
apps/docs/scripts/hig-tokens.mjs | 46 ++++++
apps/docs/scripts/measure-hig.mjs | 20 +++
apps/docs/scripts/prepare-demo.mjs | 14 +-
apps/docs/scripts/preview.mjs | 2 +-
apps/docs/scripts/test-hig-browser.mjs | 130 +++++++++++++++++
apps/docs/styles/hig.generated.css | 67 +++++++++
apps/docs/styles/tokens.generated.css | 172 -----------------------
apps/docs/vendor/hig/LICENSE | 5 +
apps/docs/vendor/hig/manifest.json | 151 ++++++++++++++++++++
apps/docs/vendor/hig/provenance.json | 11 ++
apps/docs/vendor/hig/tokens.css | 35 +++++
docs/hig-adoption/README.md | 42 ++++++
docs/hig-adoption/after-home.png | Bin 0 -> 203612 bytes
docs/hig-adoption/after-mobile.png | Bin 0 -> 214069 bytes
docs/hig-adoption/after-playground.png | Bin 0 -> 341051 bytes
docs/hig-adoption/before-home.png | Bin 0 -> 191231 bytes
docs/hig-adoption/before-playground.png | Bin 0 -> 327888 bytes
docs/hig-adoption/browser.json | 35 +++++
docs/hig-adoption/size-report.json | 34 +++++
docs/hig-adoption/validation.txt | 10 ++
package.json | 5 +-
35 files changed, 689 insertions(+), 387 deletions(-)
delete mode 100644 apps/docs/fonts/SpaceGrotesk-Bold.ttf
delete mode 100644 apps/docs/fonts/SpaceGrotesk-OFL.txt
create mode 100644 apps/docs/scripts/hig-tokens.mjs
create mode 100644 apps/docs/scripts/measure-hig.mjs
create mode 100644 apps/docs/scripts/test-hig-browser.mjs
create mode 100644 apps/docs/styles/hig.generated.css
delete mode 100644 apps/docs/styles/tokens.generated.css
create mode 100644 apps/docs/vendor/hig/LICENSE
create mode 100644 apps/docs/vendor/hig/manifest.json
create mode 100644 apps/docs/vendor/hig/provenance.json
create mode 100644 apps/docs/vendor/hig/tokens.css
create mode 100644 docs/hig-adoption/README.md
create mode 100644 docs/hig-adoption/after-home.png
create mode 100644 docs/hig-adoption/after-mobile.png
create mode 100644 docs/hig-adoption/after-playground.png
create mode 100644 docs/hig-adoption/before-home.png
create mode 100644 docs/hig-adoption/before-playground.png
create mode 100644 docs/hig-adoption/browser.json
create mode 100644 docs/hig-adoption/size-report.json
create mode 100644 docs/hig-adoption/validation.txt
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 135e3e9..cdf4f77 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -32,6 +32,8 @@ jobs:
- run: npm ci
- run: npm run docs:build
- run: npm run docs:check
+ - run: npm run lint
+ - run: npm run docs:test
- uses: actions/upload-pages-artifact@v5
with:
path: apps/docs/out
diff --git a/apps/docs/README.md b/apps/docs/README.md
index 9290edf..45639bb 100644
--- a/apps/docs/README.md
+++ b/apps/docs/README.md
@@ -95,3 +95,6 @@ chrome's `--cts-font`/`--cts-mono` at Bloxwap Sans/Mono, and sets the canvas
line, drawing labels and scales) to Bloxwap Mono. The standalone playground and
SDK presets retain their existing font defaults.
Static social-image font provenance is recorded in `fonts/README.md`.
+
+HIG presentation, pinned candidate provenance, validation, exceptions and upgrade/rollback
+instructions are recorded in [the adoption report](../../docs/hig-adoption/README.md).
diff --git a/apps/docs/app/global.css b/apps/docs/app/global.css
index 5ea52c6..dc875fa 100644
--- a/apps/docs/app/global.css
+++ b/apps/docs/app/global.css
@@ -1,7 +1,8 @@
@import 'tailwindcss';
@import 'fumadocs-ui/css/neutral.css';
@import 'fumadocs-ui/css/preset.css';
-@import '../styles/tokens.generated.css';
+@import '../vendor/hig/tokens.css';
+@import '../styles/hig.generated.css';
@theme inline {
--font-sans: var(--font-bloxwap-sans), ui-rounded, system-ui, sans-serif;
@@ -62,31 +63,31 @@ html > body[data-scroll-locked] {
}
#nd-page h1 {
- font-family: var(--font-docs-display), var(--font-sans);
+ font-family: var(--font-sans);
font-size: clamp(1.875rem, 3vw, 2.5rem);
- font-weight: 700;
+ font-weight: 600;
letter-spacing: -0.035em;
line-height: 1.2;
}
#nd-page > p {
- font-size: 1.125rem;
- line-height: 1.6;
+ font-size: var(--type-body-size);
+ line-height: var(--type-body-line);
}
.prose {
- line-height: 1.75;
+ line-height: 1.5;
}
.prose h2 {
- font-family: var(--font-docs-display), var(--font-sans);
+ font-family: var(--font-sans);
font-size: 1.375rem;
- font-weight: 700;
+ font-weight: 600;
letter-spacing: -0.02em;
}
.prose h3 {
- font-weight: 700;
+ font-weight: 600;
}
.prose a:not([data-card]):not(.not-prose a) {
@@ -109,7 +110,7 @@ html > body[data-scroll-locked] {
.prose [data-card='true'] h3 {
font-size: 1rem;
- font-weight: 700;
+ font-weight: 600;
}
#nd-sidebar {
@@ -140,7 +141,7 @@ html > body[data-scroll-locked] {
border-radius: var(--radius-full);
transition: background-color var(--duration-fast) var(--ease-spring), color var(--duration-fast) var(--ease-spring);
font-size: 0.875rem;
- font-weight: 700;
+ font-weight: 600;
}
.docs-app-link:hover {
@@ -148,54 +149,6 @@ html > body[data-scroll-locked] {
color: var(--bloxwap-green);
}
-/*
- * Scale layer from the monorepo's plain-UI system (packages/plain-ui/scripts/gen-tokens-css.mjs,
- * values from @workspace/tokens). The palette and radius steps come from tokens.generated.css;
- * the shared --text-* names repeat Tailwind's identical rem values.
- */
-:root {
- --radius-2xl: 1rem;
- --radius-full: 9999px;
- --text-xs: 0.75rem;
- --text-sm: 0.875rem;
- --text-base: 1rem;
- --text-lg: 1.125rem;
- --text-xl: 1.25rem;
- --text-2xl: 1.5rem;
- --text-3xl: 1.875rem;
- --text-4xl: 2.25rem;
- --text-5xl: 3rem;
- --text-6xl: 3.75rem;
- --space-xs: 0.25rem;
- --space-sm: 0.5rem;
- --space-md: 0.75rem;
- --space-lg: 1rem;
- --space-xl: 1.25rem;
- --space-2xl: 1.5rem;
- --space-3xl: 2rem;
- --space-4xl: 2.5rem;
- --space-5xl: 3rem;
- --space-6xl: 4rem;
- --duration-fast: 180ms;
- --duration-base: 260ms;
- --duration-slow: 320ms;
- --ease-spring: cubic-bezier(0.22, 1, 0.36, 1);
- --ease-standard: ease-out;
- --icon-md: 16px;
- --control-h: 3rem;
- --control-h-sm: 2.25rem;
- --control-h-md: 2.75rem;
- --control-min-w: 6rem;
-}
-
-@media (prefers-reduced-motion: reduce) {
- :root {
- --duration-fast: 0ms;
- --duration-base: 0ms;
- --duration-slow: 0ms;
- }
-}
-
/*
* Buttons: plain-UI's .btn family (www button.tsx: pill, h-12, text-base semibold, pressed scale).
* The primary fill is brand green with black text, as in www's .nav-cta/.submit and the app's CTAs.
@@ -205,7 +158,7 @@ html > body[data-scroll-locked] {
align-items: center;
justify-content: center;
gap: var(--space-sm);
- height: var(--control-h);
+ min-height: var(--control-h);
min-width: var(--control-min-w);
padding: 0 var(--space-xl);
border: 1px solid transparent;
@@ -213,7 +166,8 @@ html > body[data-scroll-locked] {
background: var(--bloxwap-green);
color: var(--bloxwap-black);
font: 600 var(--text-base) / 1 var(--font-sans);
- white-space: nowrap;
+ white-space: normal;
+ overflow-wrap: anywhere;
cursor: pointer;
text-decoration: none;
touch-action: manipulation;
@@ -240,7 +194,7 @@ html > body[data-scroll-locked] {
.brand img { flex: none; width: 28px; height: 28px; }
.brand-product { border-left: 1px solid var(--border); padding-left: var(--space-md); color: var(--muted-foreground); font-size: var(--text-sm); }
.hero h1, .principles h2, .start-grid h2, .guide-links h3, .not-found h1 {
- font-family: var(--font-docs-display), var(--font-sans);
+ font-family: var(--font-sans);
}
/* Same box as the Fumadocs header (max-w --fd-layout-width, 16px padding), so content lines up with the nav. */
.home { width: 100%; max-width: var(--fd-layout-width, 1400px); padding: var(--space-5xl) var(--space-lg) 0; margin: 0 auto; }
@@ -249,9 +203,9 @@ html > body[data-scroll-locked] {
.hero-copy { min-width: 0; }
.eyebrow { display: flex; align-items: center; gap: var(--space-sm); color: var(--color-fd-muted-foreground); font: var(--text-2xs) / 1.5 var(--font-mono); letter-spacing: .09em; }
.status-dot { width: 6px; height: 6px; border-radius: var(--radius-full); background: var(--color-fd-primary); }
-.hero h1 { margin: var(--space-xl) 0 0; font-size: clamp(var(--text-5xl), 4.4vw, 4rem); line-height: 1.07; font-weight: 700; letter-spacing: -.04em; }
+.hero h1 { margin: var(--space-xl) 0 0; font-size: clamp(var(--text-5xl), 4.4vw, 4rem); line-height: 1.07; font-weight: 600; letter-spacing: -.04em; }
.hero h1 span { color: var(--color-fd-foreground); }
-.hero-description { max-width: 35rem; margin-top: var(--space-xl); color: var(--color-fd-muted-foreground); line-height: 1.75; font-size: var(--text-lg); }
+.hero-description { max-width: 35rem; margin-top: var(--space-xl); color: var(--color-fd-muted-foreground); line-height: 1.5; font-size: var(--text-lg); }
.hero-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-md); margin: var(--space-2xl) 0 var(--space-xl); }
.package-install { width: fit-content; max-width: 100%; margin-top: var(--space-2xl); }
.install-tabs { display: inline-flex; max-width: 100%; gap: var(--space-xs); padding: var(--space-xs); border-radius: var(--radius-full); background: var(--card); }
@@ -263,7 +217,7 @@ html > body[data-scroll-locked] {
.install-tabs button:hover { color: var(--foreground); }
.install-tabs button[aria-selected='true'] { background: var(--muted); color: var(--foreground); }
.install-command {
- display: flex; align-items: center; gap: var(--space-lg); min-width: 0; margin-top: var(--space-md);
+ display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--space-lg); min-width: 0; margin-top: var(--space-md);
padding: var(--space-xs) var(--space-xs) var(--space-xs) var(--space-xl); border-radius: var(--radius-full);
background: var(--card); font: 600 var(--text-sm) / 1.5 var(--font-mono);
}
@@ -330,7 +284,7 @@ button[data-search-full] kbd {
scroll-margin-top: 5rem;
}
.preview-intro { display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-lg); margin-bottom: var(--space-2xl); }
-.preview-intro h2 { margin: 0; font-size: var(--text-3xl); letter-spacing: -.04em; line-height: 1.2; font-weight: 700; }
+.preview-intro h2 { margin: 0; font-size: var(--text-3xl); letter-spacing: -.04em; line-height: 1.2; font-weight: 600; }
.preview-intro > p:not(.eyebrow) { margin: 0; max-width: 25rem; color: var(--color-fd-muted-foreground); font-size: var(--text-sm); line-height: 1.7; }
.preview-intro--section { align-items: center; text-align: center; }
.preview-actions { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-xs); }
@@ -362,10 +316,10 @@ button[data-search-full] kbd {
padding: var(--space-xl);
}
.feature-number { color: var(--color-fd-primary); font: var(--text-2xs) var(--font-mono); }
-.principles h2 { font-size: var(--text-base); font-weight: 700; margin: var(--space-md) 0 var(--space-sm); }
+.principles h2 { font-size: var(--text-base); font-weight: 600; margin: var(--space-md) 0 var(--space-sm); }
.principles p { font-size: var(--text-sm); color: var(--color-fd-muted-foreground); line-height: 1.7; }
.start-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-6xl); padding: var(--space-5xl) 0 var(--space-6xl); }
-.start-grid h2 { margin: var(--space-xl) 0; font-size: var(--text-3xl); letter-spacing: -.04em; line-height: 1.2; font-weight: 700; }
+.start-grid h2 { margin: var(--space-xl) 0; font-size: var(--text-3xl); letter-spacing: -.04em; line-height: 1.2; font-weight: 600; }
.start-grid > div > p:last-child { color: var(--color-fd-muted-foreground); font-size: var(--text-sm); max-width: 25rem; line-height: 1.7; }
.guide-links { display: grid; gap: var(--space-md); }
.guide-links a {
@@ -376,7 +330,7 @@ button[data-search-full] kbd {
.guide-links a > span { font: var(--text-2xs) var(--font-mono); color: var(--color-fd-muted-foreground); }
.guide-links a > svg { flex: none; margin-left: auto; width: var(--icon-md); height: var(--icon-md); color: var(--color-fd-muted-foreground); transition: color var(--duration-fast) var(--ease-spring), transform var(--duration-fast) var(--ease-spring); }
.guide-links a:hover > svg { color: var(--color-fd-primary); transform: translateX(2px); }
-.guide-links h3 { font-size: var(--text-sm); margin-bottom: var(--space-xs); font-weight: 700; transition: color var(--duration-fast) var(--ease-spring); }
+.guide-links h3 { font-size: var(--text-sm); margin-bottom: var(--space-xs); font-weight: 600; transition: color var(--duration-fast) var(--ease-spring); }
.guide-links a:hover h3 { color: var(--color-fd-primary); }
.guide-links p { color: var(--color-fd-muted-foreground); font-size: var(--text-xs); }
/* Full-bleed rule; content inset to the header's box so both edges line up with the nav. */
@@ -438,3 +392,32 @@ button[data-search-full] kbd {
.start-grid { padding: var(--space-4xl) 0; }
.chart-frame { height: clamp(320px, 72svh, 600px); }
}
+
+/* HIG type roles and adaptive targets; the dense chart keeps compact controls. */
+body { font-size: var(--type-body-size); line-height: var(--type-body-line); }
+.hero h1 { font-size: clamp(var(--type-title-size), 4.4vw, var(--type-display-size)); line-height: 1.0833; font-weight: var(--type-display-weight); }
+#nd-page h1 { font-size: var(--type-title-size); line-height: var(--type-title-line); font-weight: var(--type-title-weight); }
+.install-tabs button { min-height: var(--control-h-sm); }
+.install-feedback, .copy-feedback { color: var(--destructive); font-size: var(--type-caption-size); }
+.btn--icon { min-height: var(--control-h-sm); }
+@media (pointer: coarse) {
+ .btn--sm, .btn--icon, .install-tabs button, .docs-app-link, #nd-page .edit-on-github { min-height: var(--control-h); }
+ .btn--icon { min-width: var(--control-h); }
+}
+@media (prefers-reduced-motion: reduce) {
+ *, *::before, *::after { animation-duration: 0ms !important; transition-duration: 0ms !important; scroll-behavior: auto !important; }
+ .btn:active, .guide-links a:hover > svg { transform: none; }
+}
+
+@theme inline {
+ --color-background: var(--background); --color-foreground: var(--foreground);
+ --color-card: var(--card); --color-card-foreground: var(--card-foreground);
+ --color-muted: var(--muted); --color-muted-foreground: var(--muted-foreground);
+ --color-border: var(--border); --color-primary: var(--primary);
+ --color-bloxwap-green: var(--hig-action); --color-bloxwap-black: var(--hig-background);
+ --text-3xs: 0.625rem; --text-2xs: 0.6875rem;
+}
+
+.search-error { color: var(--destructive); padding: var(--space-lg); }
+
+.install-command .copy-feedback { grid-column: 1 / -1; padding-inline-end: var(--space-lg); }
diff --git a/apps/docs/app/layout.tsx b/apps/docs/app/layout.tsx
index f1c56c3..bb6ab2a 100644
--- a/apps/docs/app/layout.tsx
+++ b/apps/docs/app/layout.tsx
@@ -1,5 +1,4 @@
import type { Metadata } from 'next';
-import localFont from 'next/font/local';
import { BloxwapSans as sans } from '@bloxwap/font/sans';
import { BloxwapMono as mono } from '@bloxwap/font/mono';
import type { ReactNode } from 'react';
@@ -8,11 +7,6 @@ import { basePath, siteUrl } from '@/lib/site';
import { homeSocial, socialImagePath, socialMetadata } from '@/lib/social';
import './global.css';
-const display = localFont({
- src: '../fonts/SpaceGrotesk-Bold.ttf', weight: '700',
- variable: '--font-docs-display', display: 'swap',
-});
-
export const metadata: Metadata = {
metadataBase: new URL(`${siteUrl}${basePath}/`),
title: { default: '@bloxwap/chart — Financial charts for your interface', template: '%s · @bloxwap/chart' },
@@ -22,7 +16,7 @@ export const metadata: Metadata = {
};
export default function RootLayout({ children }: { children: ReactNode }) {
- return
+ return
{children}
diff --git a/apps/docs/components/chart-preview.tsx b/apps/docs/components/chart-preview.tsx
index a10df0b..015b3a6 100644
--- a/apps/docs/components/chart-preview.tsx
+++ b/apps/docs/components/chart-preview.tsx
@@ -11,10 +11,11 @@ import { assetUrl } from '@/lib/site';
export function ChartPreview({ children }: { children?: ReactNode }) {
const container = useRef(null);
const iframe = useRef(null);
+ const [loaded, setLoaded] = useState(false);
const [fullscreen, setFullscreen] = useState(false);
const [canFullscreen, setCanFullscreen] = useState(false);
// Name the file: `next dev` does not map directory URLs in public/ to index.html.
- const demoUrl = assetUrl('/chart-demo/demo/index.html');
+ const demoUrl = assetUrl('/chart-demo/demo/index.html?lockedTheme=dark');
useEffect(() => {
setCanFullscreen(document.fullscreenEnabled);
@@ -68,8 +69,10 @@ export function ChartPreview({ children }: { children?: ReactNode }) {
}
+ Interactive candlestick chart with price and volume readouts, interval selection, drawings, pan and zoom. Live market data may be unavailable; choose a synthetic market in the playground to explore offline.
+ {!loaded && Loading chart playground…
}
-
+
;
}
diff --git a/apps/docs/components/copy-button.tsx b/apps/docs/components/copy-button.tsx
index c386d44..e921ddf 100644
--- a/apps/docs/components/copy-button.tsx
+++ b/apps/docs/components/copy-button.tsx
@@ -1,10 +1,12 @@
'use client';
-import { useEffect, useState } from 'react';
+import { useEffect, useRef, useState } from 'react';
import { Check, Copy } from 'lucide-react';
/** A quiet icon button that copies `text`, with a check mark and a screen-reader status on success. */
export function CopyButton({ text, label }: { text: string; label: string }) {
+ const pending = useRef(false);
+ const [busy, setBusy] = useState(false);
const [result, setResult] = useState<'copied' | 'failed' | null>(null);
useEffect(() => {
@@ -14,19 +16,25 @@ export function CopyButton({ text, label }: { text: string; label: string }) {
}, [result]);
async function copy() {
+ if (pending.current) return;
+ pending.current = true;
+ setBusy(true);
try {
await navigator.clipboard.writeText(text);
setResult('copied');
} catch {
setResult('failed');
+ } finally {
+ pending.current = false;
+ setBusy(false);
}
}
return <>
-
+
{result === 'copied' ? : }
-
+
{result === 'copied' ? 'Code copied to clipboard.' : result === 'failed' ? 'Could not copy. Select the code to copy it manually.' : ''}
>;
diff --git a/apps/docs/components/install-command.tsx b/apps/docs/components/install-command.tsx
index 0c2b06c..f1bc0b3 100644
--- a/apps/docs/components/install-command.tsx
+++ b/apps/docs/components/install-command.tsx
@@ -1,7 +1,7 @@
'use client';
-import { useEffect, useId, useState } from 'react';
-import { Check, Copy } from 'lucide-react';
+import { useId, useState } from 'react';
+import { CopyButton } from './copy-button';
const managers = [
{ name: 'bun', command: 'bun add @bloxwap/chart' },
@@ -13,28 +13,10 @@ const managers = [
export function InstallCommand() {
const id = useId();
const [selected, setSelected] = useState(0);
- const [copyResult, setCopyResult] = useState<{ command: string; success: boolean } | null>(null);
const { command } = managers[selected];
- const result = copyResult?.command === command ? copyResult : null;
-
- useEffect(() => {
- if (!copyResult) return;
- const timer = window.setTimeout(() => setCopyResult(null), copyResult.success ? 2000 : 5000);
- return () => window.clearTimeout(timer);
- }, [copyResult]);
function select(index: number) {
setSelected(index);
- setCopyResult(null);
- }
-
- async function copy() {
- try {
- await navigator.clipboard.writeText(command);
- setCopyResult({ command, success: true });
- } catch {
- setCopyResult({ command, success: false });
- }
}
return
@@ -64,13 +46,8 @@ export function InstallCommand() {
$
{command}
-
- {result?.success ? : }
-
+
-
- {result ? result.success ? 'Command copied to clipboard.' : 'Could not copy. Select the command to copy it manually.' : ''}
-
Bun · Node.js · Browsers · Workers
;
}
diff --git a/apps/docs/components/search.tsx b/apps/docs/components/search.tsx
index eb2b538..11d05a7 100644
--- a/apps/docs/components/search.tsx
+++ b/apps/docs/components/search.tsx
@@ -18,6 +18,7 @@ export default function StaticSearch(props: SharedProps) {
+ {query.error && Search is unavailable. Use the documentation navigation or close search and try again.
}
diff --git a/apps/docs/content/docs/playground.mdx b/apps/docs/content/docs/playground.mdx
index e42f05b..4e62f6c 100644
--- a/apps/docs/content/docs/playground.mdx
+++ b/apps/docs/content/docs/playground.mdx
@@ -16,7 +16,7 @@ This is the same playground served by `npm run demo`, using the local `@bloxwap/
5. Choose a drawing tool in the rail and place its points on the chart. Use **Undo** and **Redo** to experiment with your drawings.
6. Right-click the chart, an indicator, or a drawing for its [context menu](/docs/guides/toolbar-settings#context-menus). **Settings…** opens the chart settings, the study's settings, or the drawing's style bar.
7. Open the gear at the bottom of the control rail to change candles, scales, labels, and canvas appearance.
-8. Pick a light, dark, or system theme from the theme menu, or collapse the drawing rail for more canvas space.
+8. The docs embed pins the HIG dark theme. Open the playground in its own window to pick a light, dark, or system theme. Collapse the drawing rail for more canvas space.
On screens under 600px wide, the control rail's buttons move into the header and the drawing rail starts collapsed. Use the toolbar toggle to show it.
diff --git a/apps/docs/fonts/README.md b/apps/docs/fonts/README.md
index 73bbd33..45fc4e5 100644
--- a/apps/docs/fonts/README.md
+++ b/apps/docs/fonts/README.md
@@ -3,7 +3,7 @@
Web body text uses Bloxwap Sans and code uses Bloxwap Mono from the exact
`@bloxwap/font@0.1.2` dependency. The Next.js exports self-host variable weights
100–900, italics, and script companions without requests to Google Fonts.
-Space Grotesk Bold remains the heading face, with its adjacent OFL notice.
+HIG headings use Bloxwap Sans too; the unused Space Grotesk face and notice were removed.
`BloxwapSans-Bold.ttf` (700) and `BloxwapSans-Black.ttf` (900) are static
instances of `fonts/BloxwapSans/BloxwapSans-Variable.woff2` from the published
diff --git a/apps/docs/fonts/SpaceGrotesk-Bold.ttf b/apps/docs/fonts/SpaceGrotesk-Bold.ttf
deleted file mode 100644
index f8eb245d1ec7fd02d77f5a9b55ef6afc4c9ed1c1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 116056
zcmbrn3t-gMl|O#({mv_sWRgtY$uOD8Ox}}8$eUymCX>m7ya*v;0tgAufDvMN7$?$3N=FXKxp7+X@?y6`&R+NTS&j6XffnCa~Ng(YQ`)ysbl*vIkw;L4kZM&BE{
z=bso$cmn9gS8m;GGak=+fU*2bxW9YN=-QiBl<*10GMsomX6?`>;9>EoZwJ-CcI4JI
zuUVhEp0U||j7=UHUOlub3J!0*ESs$moumT4~H_bU8$4&StSJV|r(D~t&PV{wm;
zY+N}M|Et~rV+Fey)4z7p(DyF8nq3Y3GTEp{vh4w
z7l4y78&i~f*>b`waR-raV`lL%bBjH!OdLX9$b2FN=^^~SpZT}}*DIJ!j3Ku&pF;T~
zNRQ(F(ojB*d>P9Yoh(fpVGUwEGb_896*yDGC^HBz@cLM;m|!iU9oG{`jm*uTVj1#!
zn6+>ttKcz{=S79QZc!Ei7Ug1RwxG1rX9G~kGj{Ry@m4Hg6n*~2KB6A@%&ZhM2hG4;<>$`)Sk%;T%g~S=sK5G
z3Bjr;4_}9W%e*jjk8&i%s^)Z!K4&8p@^k3hIp*g9<`-?uuZ%N4dy|>?{j5feutwz~
z`ZAwcgoU}}c+i-9K~gGlpT_ITMB^7uG>%`EXpF-NV=eBV{Dd1OKf{<;A%7m}H=+C-
z%F2PwR3IpVi)
zBEAbJ;#F$fo6ITBA`w4+NmAAWhWPc$G>o!0kV1S+y!?fU;KFHm@)zJ;#*LHz3!a~Y
z{1-^CApIKY9XSt-lW$`#{4z8bsv-3-KXC6+@aeOmc|mhSO_g$v&^-Bqq@cYte~{9U
zDrg?fNO$Aj7|Wo!H8sCzj(tgz^Dh#H=3qF{e5W?1pe%*W5eLymAMk&NWn=E!L@mY?
ziN6V1fw?GN0Y7M1smRB@Y_x9&=Jp82fOuj8I7TLeVi8~_0DF;TD5sDbAOmWUwzDK<
zIr8HuYe9ZHe(z#wN-1Q)2wNRWgAv!Oa2=TlrX_U02stIX@8tW@o)K1#q
zwMf*)44w~}Lg|%IdJ6foNDm_&MzSIOh~=}7k+&iL2+tjbJfbwhybOyE*I|4K*NrTR
zy@-0BflT^4W|Q;%3*^BU$%?6a6BtX9^AnSwgye=#^D=X5PNIAd(h0PKWCvY`a?KIk
z-;dv4CP%KkPq?ToEL-lzIMcP1F_0mrQI8*G{g5-bmWkxeX=atlF!@8|`p|W_+|5Y_
zO~JDid2N_HJ5{FMD-gLDA6m00r-U_2vkS?OHd)oAQ2TIA>lqeXpXPb|CixIb%CXS(
zm&mXw8Ap6TuupwX`Z7FW85o&|W#Iwf3}1)yuxt$HUm_dD2cY-0Qp9s4Kf`HChK6Nn
zI45~Z^EjMHhN|=WZ_EELU};W-la$q0)QS0h?K(qnm{01O9Z{$97S>$+##)>tUPV9l
zt82Y@0^>b_Ypf4QX?z3Z;Rco#uK#b%NpAoi7FydMi+oP5BYRj`WZ9QpW6n;&Oa0?X
z1|3?Z3+i!)uPNu>n7lw`;@K<8k3go5Fso({?tR%>MS9t0=py~hBJ=gEl=5%_o?N8a
zQ@n`ATAj$9ERN<^nGxQ?VNT}%1(3f3Ss`H}m>
zdL2<)gx2FLpCg)3y0RSnC-p&@t2)3>R2=}iBI&|L^wY?aQ1&+ZkwLm~SU-lW&c(eN
zf>UhF6`A;Nz`tLIe$$V(uE!cW!UnPSO8p_S4dO-CAa(3f=3^hQQYDuaGO`Dz^$OAl
z(tsmh=40Rk{0=AJrFE|`{9D-^TI;F2U*4m&v_XFyFCK-LL6o$oo2QDjk*vC#|9FP>)hg0bi=v~E3GZH;ZWq)f9
z-InhFeUZr4l=f!$_bB)lDSZFR9Bp%k66uky$Y;Z_pc{Pzl7f_kZ!U9M))H%-b)I#hb)9vib-VQr>wVS-
ztzWl3V*OuRv@PD2Y|F4&ZP~V5TdA$wR%`RydTlq`ZnfQIyVrKm_HEmvw(r@#Z~LL`
zgzYD`Q?{Sm{=uGTPqEwV+4fw!+umniX8%UE$kt`YWt+2;voo@-*+toH*@M}ubI#=b
z@tyL&Y9=Sq(^zI>rL2}UvL*18Y-dMg50CI4@#p#b{5=0m6pGTR9{x-`BVG`1z=5Je
z4-?Qshmt#^hX!kmHOXqR+N@4%q1A1zvihu@*2UHl>$r87^-o|A==+@?$nQJf`Qy8~
zbH;P}bAfk8-hS_G$i}xjk^FcXt$Ex1cFx=4><4Gh{repRj}P%Ipx9@)MB8`_WGg=6
zW$}u5RT1DsozkXsQyG1fPNi4rQwEjw(8rkqub{F+nNaVk-^x~HT$xbzD0`KC%6{d5
za$2Yg9J#18aa$c{okq)tphE#=IP0UA%}F^D?%EbwYZ!vbDUPUB{NQKGwz-vFo{y
zH}WR%?`p`S4%Wn5*($yWy1+cv%;zb3wwRZ4H+S(8*3NVI5}wEH;y1iQxt-_prM!zn
z)8Xs*^@;|X-wHm&*Ya%fTVBB{c@!U)V+VKkQTXzue0%b0d$&NSb&u&*Z7>CiY9V0e0#rJHs}yU$f2Z
zWww>Q!nUyAuyOV(yOsS5yN&%HwhL?OSJ+!@H~V+Cll>dJo&5*f1Mawkz0D7cU$DK9
zYIm}C*xl^+@Pz(>-Ov8W?!%gUuQ<=1<+IpV*?InRae@7bJ-|NX&x()PgX}-qLs(hA
z#{SH{&i;%4QZcZHVOf8|{()QAx4?DZW|!Cz_E+{D=roVAN&ddl!@diq{2ui4$GO6e
zaV`5k*YJ;(yV(!8fjz;aSb)c}6FiRnn8&lHcmn$gc=l&
z40f8QbG;bgZzu&ksQifE&hHkt@n`sR;xhjQKcl4ZO~T3_6Tjy#DYN)R<$L_E$`kxk
z<@@}9m1F!f^LLd7eyhOBA*%UItijBXb*!gdjZ2q#6#s7~|$p2k&@wb#>
z{vV2)zo``QOUe)VW#vgesRRU9P6(m=SSZR?Wxq~~|N=2&-EAR95;^*Roa+|VQJg6iqex;S)sJy4t
zLEe1>Yx!}=!A;@;B}r*gTClQz23gu6ZWV{ce<_{fWo1zO6%uy2_(b`svQSKji^@qQ
zLrGKaQ1*(4#eec%-XNCn1>#fXI&NkEC?4S}`6}@(@$CR}*#hjk{^kLjt>Yv!E$9g7
z7B21&RAdJ72L{*J_FvZ@5II9XGhpFbxze#B({2y2fdFfA_)kFMHx2rV1Kbs`4X!B;
z2$#d|uonjumu=OLm84|mYYHSb*#-xF$3;?;?|6>V6c9~)`D{BqkBfWs-ml^!OX#dfq_g=D-hGPGQfKK
z1FVC9?f9M95wOygwPWaHJX=W+C$((Fz`&}ZfdDTW7zp)Xz_tqgarg#`16r4@*%r{`
z453f@rk?(Q-r)-v96pQy9vLhS=p?y83EQgU`V~GK-K6ejs?DeGfM&3HWk6eK$IT|&
ze%pT3b-YxY0}3tZAMD8->K*8J4A=*30q??o+{+}ogql(u(7OUrO+_c5m`bV}@YCUQ
zfL$EEp@3MiCcsysApw11aUjZNqt=?xEe%@%5VY4jI6xqSe%V^1>qL}^H8uMR?Nf{s
z?V8C*F)9{bgeIWvIfJ(5{f;3TR7q@>NdpqFWulScR$^!!Lw>c2*w1-9;KWmSc&clW
z51EMn9ljsOVk@p0LzL;T4-|rl<6OsuXb!9z@)rldG-%sDXbU8OY{dbytD~>~xMr1qz!`{L?HDf(B)U2l^mi;&
z3p4E~Pn6|JuH($ybY1^(v$-k2hkSvABARkwE#L7t`ijR_fTv(Al$@Ua<1`OJF5iBP
zFsh9&v^(%v_!|5`_vsPLWV$fXGb&)^Gx1T=GM*3u=XE
z?&}Yj9X?xgzy$V-b%5o3w!xpKrE!+P5}D8EBMKzp9v?cMWGD*UU6h#(_D(?`lZ%Q2
zsjlOk@-)z!@^sg6h4Kv7aSi2}uH#zDEw1A_%4fNb>nXRojvFY?avhJNyvPM=sPqr$
z20>|u%^l!3&}=CVxFT+*Ox?U$y;&S_Gk5Cdn0nLZVu84#&+R8V^%J$L)X&KN+0j26
z+Lev|QSLzhD0iZNl;@y-l;@&vYF;wFq!TyC1V8`M>S$K$#n{>^@ae>)|
z$F)4UxgSE2MzK7CJf8sCKziJ;i~VF9QW*uLSrU3=vDovAJ!nBoaW{dHeUbI$9xu`myjq
z>S9Hz;XFAB6t0ErN(rO_OapP6Bf*ZxFkc|Lsc7|nx5H-h><7-enP4`ziZ7sZ_`=Y(
zz#z#K?}GjxYiwFu=8rYG+Kd4oNm?U>HtI(U94&(Z9Y%ZRbj8f#Me3@gX&PMR2xzgW
zLfC1VhB9$IH~{%@2GkuWMH8E4mx+yYRmu-RLG!6yCw6vVrnxcm)DE?{
zjvKMo5cf;Y|G#7D)@w1?{|grry-ALF95tEt2!62-gxc8(0bE-Yrb-)r)fL%k%!n?b
z-b|5T9!QX^PJ3u4nBj@;Kow?r`{$H*03AC)9=T&ZPC2#!T1Ig4YB|-}46s3}lP-p+PP$k@b<)L3
zf@#CWDuSVl)dWKqYY2ue*2;GIaWyR4MOW)&yXb1YY!_YKDBDF>BeGp|b(3rtU2Tx<
zqN|Odv1e)kN9C`87dLKJFB@?=MnosDfDgYmVXeg_!E9D931*9gp&JCV6%W@>VZBBE
zl244Qm-NJ~>Lr111D<*n<#zRw0CuRC1h5mZ4O93gLmf}0qoo_fG+cd
zMkviNny{7)_=*CC)d9uXGag>hix~{S7ki;j@_Vt?sV3j(ai;hEgfZ7F4J)K;uW^oc
zw#IHq)@h8Pf(E5h6zDQFvLM>`bJMPvU4~uST};EG0TSo?IrE18sN`ql<@O(U@_h?n
zB<$;_->dw`^Xd0V15*o_e<1UC9u=K3?1DehyKiNmgv1T{c#U;Rxp3%GH5yalNj`Z;
zKywdPZ~u?At8~oom+Hdb@Ri2opE!e=asj@|P!5mU1bkeh6hS9W)1Ap0ac1&kcu<0q
zA5Ye>W%%pF-$S@QI_V1k2JA9rjd+3gDQjfyN8y2^zgOY&8|NqZIbjrgL_nN@{a&Li
zf>-lt<)Wrcb6E3%wp}}-J*<6Jdr?=Y>(lMgyYz?k?;92w9yh!d)faVd)S;-yqF#@>
zVBBCl9WA0qqtC^dV%Eew67x~4Ikqi!JocH`4^1vpuj#1iv$%@5`{O>1&yRmRAwI#E
zFqZJ5Im6sy-fX_#{Dk=p^CyX#L`$M8(UZ6+aYN$P#NCOHCBByUe&VM|hNRl04N0#g
zcP6h&-jV!p@>9vLB%e(&rWB?orH-Y3oEl6srlq81r@7N=(^}Gc)0U+@pY}@HTWKGp
zeUi@7W75;oZRxJ`nsk49Px{jI;q=YvyV4J&Kb-z(dLaFD`itqWrJqaxF#XdEO-6i%
zB_lthBEy@}nbDsyobhnRv5coPp38VS$B2k_04+R
zng-v0snug`v-VjBrRRT7R%cd!)~c-0tQ}eVvOcjfTMT^vPV8)WY;Cqa+n{a4Hg4Nv
zyWe)$_PFgS+q1TpY;V}!vt6)VvKz6hk!|m>FSQTbx7v@|pRzw|f64xa{XP2y`=x9{
zc2c%2+m&6D?a%JXel7c4_J`S@Idl%Q!|Et>JmGlL@uAc0taY|Hd!5Ui>z!MjyPfws
z4>=!mo^U?nJmY-b`L6RL=Vv)RIZx)C%6TE@>!y~};f{et`5lG2j?lF^dAB~O>U
zSDI1kFWp`G^6Z}3yJuf4YbblD>`d8b<+Rd3a@s71B3wmGgjHFNxPdgi=4=c75F)#_?XYxmW$x|q7OI%i#Jou{s?
zuCH#eZgbtfx`TB`>Yk`OS@(S1D|PSIed1xB7*Cp~)6?%+7egZ=dgB-{Zcge9!t`^1b2vu!%LrG^I5;n`)Xmo0c|>H0^3S*z|bQ
z>84kj-t#lR#b4w1`+NLL{losv{$2h9{)hdK`UC#c{ulkPHS3y9%^A(P&1EfVEzTBi
zYi{e|){||$ZST#inYVA=sd?wyOWU`$pKL$V{#N@(9jwFL;q0jDXzRGQ<5b5B9Tz&&
zI{P{|bUxmBvMZ@;Y1hMDuXerHb+Oyfozd;;Zs_jmUeSGSzGZ&@{K5H8%zvYY^~Cga
z_8jPWvFF{Mj~47*5LobfFY7h**7mmaF6v$1yRG-$-lM%w_deJAa_^f9TNZXNT(OhUeT(|m_wDWb@H)eFBiD^D5{r@+EnD>A_4}_s*T1U&>Hb&y
zKf>R|f%bvkffWO<4ZJn*;lQQEn#D1TEsI@?2Nw@79$$Q7@u|gU7QeY9X^CZtYl&xx
zf60!eqf2)z-M94M(j!ZsSbB2l^Gjb@`qt7*H>BNAaYN4yr*3$6nQ>X!vc=2BmhH#i
zL(7gX`(SzD@{#3FE`NIYGs{06%pU9++&1{o;3I>N4W1Z$X7JU)vxDb{G(+)2mZ83(
z!J$1v_Ya*NIzM!AMd6BND;{6*@yfK7-jxrpd~cO!Rokk*Rhw5GToqV#e$~a*hgY9m
z(}uskHG^wL*1Wss{F=|!Zd<#1?E`C%u06K)#MSP=7uUbG{)6?GZY;a8_Qv)b
zci*`G#zQwAyYY>YjFG~Ts*$Hgo*j8@gKdp0iJc>l)dH=Z9gk1id3Z1jVhb8lXB^S+x8-hAZd3uE15E5^2t?Hzky
z?2)l!W2eU69Xr1%Ws`N2d(*N_Yc_4&w0G0fo8I4aakFmoj?H^EAKZLti)KsG7Uve%
zmWnO@Eqz-?x9r|>aLeH>k8U};HEnCf)}E~+TTgF&aqDYa-{1Q2){k%Lzh&^2(OcfQ
z<=ib7#@V=GJbv6ZzG3|2c<@&5t!=mV-+J`cW4E5V^~|lW-umXP=Wo5ZO>9fqR=BNU
zTkp1I+eWwT*tT!m!EHyjo!Iuwwlmw#ZZ~aTw0-^d{o9Xie|r0K+h5+Xd&j9AFYI`A
z$Jrg{cU;^lcA9o(?9AO+v$K8YqMa*tZrHhP=iZ$!OqeE8Cae?giH36R%CYHSylW
zC%0*COS;W@o9niU+dQ}VZ@d4tBew-^d-k?hZhHkf&GN|!r9`P?bu22D8$^_0T{QNhn7AI9V9SjhuGRVeCY#M1
z&slq0Q@6j{=Ck>#DoRUSg&C>wS>~)L9gE{8lP;x5o1I&kP*GKGFH1>INYXiS>}6Fb
z$aUDWbtp(ltgNW2uCA)8L=j4o9r#^UUY3%QoSdZ7>Gdem0|hVuL6VN!2iC0{;GOgx
zJi~2u)zx*ubNGJPVvDibiX6_;#U=AgOFLawcUnx6%aW60LE61$g~(m8X3dJrZ?0G~
z==JcR$LsY3g~!WXDcSB=ZLB3d)9%QQPjdU5j)p=duRP1BHCW<~I4l+iCFn(hnejCY
z?Mlz0S+TbeR25t!)-tUYTd9mWx^#-*+{wEci#A3X0H;q#NYES7i^>zr6CHUDePX%d
zFrR$?+B6>#{MCG
zxG=|Ia
z>*maonU<0e7h^Q&SQgLH8&p;a4K%TV$`45?vX$jD_MN*Qet7p+?%Cbk+S1e0(%QWH
z9@AIveEiO@-m_h2Z0K3k{=~fN7u1_g+i^%mOwlqHBq{RdN03eqxsGeKPA!HEP|@HHsx`ByJi(qE{`2wYg3s~n;92e$r^mlH{=@MQ
zZbXutW>Kubn|n2GE!SwA8bTYzq6n+bkTH!l!N*SqU*eYFd%*bp@!)>|E@Iqr*nuxpsyRM3I!cegv0S6d1-al)Ip42h1Mo9=+F=sBqHRm_G&8id`5xo>
z+syi`22G!Tb;~iz^EyETjlwl+1saAqrNxe@
zoK9Da4MryclL_CxJzTSAPwP8c
z^3;sM)R1$8CVR32GL}b=+_tBp#5H@IclK;GZC&s4l~h(BCUSf{c<)V{LVQYcCWfS#
z9>E0=F`q|?7#5RYp5jvUAhDcthvGm-%)k47@Gb6s@&kym;CY@B{9f?yh{q&v(Ol4>
z4lT>_S|mL%5yT*RD4c@$RLisp2^vG1q>4Qml=Xr#r^nUyDW!Nej@qXKXX7N893h~9
z(9>&`@HoY>IAV5uq71VL6XYz76dFiP{L8K8TmQ1lJpSf5N!mxmipzenWP+fYGyTqpU(}b0d)}mzus-$jWmUO#pOpx_K-XrgFK97nR1<&5`kJ;L5D~HVe-V8
zI7>+~WyWPf2FCJO-4!x0NtYKA)wD1srSRT8hY#=yfSY4;69dZ;x!Y?+@u9G8yLDnu64H4|tQ)u{US4rsbsPq$I@{St?JRngY4g5+g~c
zPfjW?PgZ7mm9*RbO5gf6rD(3(#=uJ@I+gHQW+GNZBW%WhZEv
z!fb4gx5~)57PCdmu*5;O>vUn+PAjt>Jyz*zv!-JuW+{%uG`m5S#39P+lZnD|eVa+*
zQs0Uyk1OA`Cw_ObXtV&mWId&+J!|(MQ&c6Td2Y}
z+(__VQc7wnvo*-b=#rlJJj@Uxt?pI2u5Q6~K|eoL;*Ek*kW$@Fe3bBr+2?
z(1i5Sawwj(uwxoST=snBt9#}(H_zMiRnviS{z93gZoZEE__3*C27x@75dsL;E^&-@(q}UmI-RJcF>>~VZGoAnWo|-
zxkfTg*|zj{zq$XtezX7frSB~^FGd|l#Gp)mvElLqR2SACsYk{#x3|c^#TN?rSQbkH
z-YnISM5R2nyt-UTq^eSW{i}!WHsAfwuYUc|J?485)wksG<=}UN-{MN}vZOttLZv<&
z#qzy5s0Ur?j1bh*B$7IbSq@`mh(^g5KYH+>`QU>e{TKgL@HOrVR{od7=?2au&?#EB
zT~7)&!-SjS4RCZM@u5T|CM2qud8HjoAcrF5=8J;?{$}tozVvZ^Z~WHBgJbbqfdf({
z7yRPlK}e`lcIN5$IKc(Us5r=|0;Yr3ql4DNq5p8hTB?iYk*mw77o@#v!+MXZE>$oc
z81$MCkgN@XcNw`JXQ-#1_0Gm)TD?wtje78yb~&c6GxShcV;bDdB$_F%k{nSNcnW-t5LzWars>2im+Y02DqvgomF{#nWQA
z7L@k*TjI?VJIo2K)-cUOq%O|j+RJ{A#T`j=*ly@wDrlaLH5V3TO0tkNhq(rCg2$&u_nZZo_E%yb(|E>!PiqvMhG3
zsj~m)A86`lmwQZeH+9E!Z<^bUoV+%7%%-Kis8*UZcbW;@nlbpW-%)Ij-4XzqWzvLIZy>zI$U`X@=+W$@2OQ)~}?y>o$7Yn~eT>
z^Zdr9cA_iJ_J~|5PfDrrLW31x7n%&F)@Z~KCY~$OP)laXj->3c5j`ycU;~6a2rU!l
zm_}di^`#Tl<+U&|g8!3NTzNx7@C|OQsp)FIgfkp8qOXfHsP{asbYfc!GMs!kkA1Q?
zWci=fauc$MHpY-lm}x)ZK3Yn&j<6rDvZ1QW_2dppM%x~J^!NXH^hvUycK-CjB>TlL
zRQ&9D(BR8#$(9MM{vlfubW@V}r&!nS>j)%cHM1C`xRqK)uBv4$H%93dsb;8=on8kj
zgK?njngI*m(MEuJ^TJT*Ty7VE3aD2!5HlgMzX@##Ey!^sVo=N&mS{s3S!KzpTuu#(
z=c&<|zG&HDj`hs0^g_4_9?qx6
z1AR|si)6&AHxn(!+M*$2L!BYh|D1gs$BGYr{+uC5ujV4@ikCC!|bm<8ztRW)P_PDxnRD7#`s
zD{J5C_it@iziT@?>S{YXv2gUn_l$W$*=R=#mJa!awzNQ&^q?)YR*!|(>X6}&WjahL
zS~C>VdkQhwT5Y}-a)e}#bd{h}pqXADnu=G$4tP^ip@6DuHBr%=2SzZ$$(1_A2x@mA
zKJpw1i8BNU*dU=zU7$Tpt?}l)bzR-HSfyVSCq1*mD|B&2aFXXoEYlHkaz@{=^P3HCD@Ld1df@!d*D|F@FzyQ9$x6JxzmSJTTnB0HHyK!4sk5%*sqj
zg5p`g3qm?hUbS3Up?OZ5k6~?R%68;QLpx$O8ykyUh50T^#iELl{)HP7wisqRow@nh
zmYOA%H=FvptrhuMsj2A(t#fiv-F!O
zLb*eA@6r%s0HI|L>OmAI`I!^qVq?e|PYNRr-$O=-i)Blz
z3Ew5vN`iz`l>u)eXR1aeZSiSu9-0-lO{E(eJjIo;fPn@T<1=0
zrde2~T)5z}u@t37YB@8;1uD=EZn8uQ{|QgoiyN#v(@P_Vhm;)2uh1{}>uAfhZCc4c
zpJ&tNNSjs*o3?_-2S4NY2QTonhu)1JrbO!t`5G5VUt>n(`cg1+eF^y*GvYG-CSN1>
z?|A5;9Xr4FwVfTU^P8HxOn2QKxbvQS?hM?0*H~}osjm6G?Wf@Bq;Z6*#CJni(KGk}
z@LQ@AxD(Qcr+om^t{nLA^$s{uxiBx=d*2_#va{R+H3o7BkGas7JmQH+T%`8FnMIEA
zX*rk2@?6eDmy~lPbmcZ;c;D!%eMGoW?a76uOMFe$b^f~A)?F~X+BP>;FT+lto8Q_u
zZ)k2(a)P&1Q&u;(&K%#lzNUI*ldMQx&$nJ8oR(_`
zWHidXJ6<|}Tl21NZ)0n7`GI$Xn6m$pQ!-HNyTw$quFY(!X=*4jmKGftj~_cW8lO9V
zZj665`PT%=NwEg)HDX3%7Q`t+U>6OFhl0giU|ocGQ9W)@V%6;<6Qm{Jjc^FTSji}Y
zu3t(1?qo+YC#N?b3qJnw`ihaFI*05_qK-T
z9gbls8iTS9T%zH64OJXTqL7z^Gcw`QiAqT!GQqnsy(tt)rfi)a`!N{Ouu4fAgeASV
zcy~AXe66jOMa9wIa%l
zcB}Kq2i~(`=djD$KDCR94RUOgV>c6y9<6>|Sbr;+>7dBAb5@XNcW1lPQt6D*_BV?6CH2X@Uxu$2UxB1rYEqCv(g`d@&(9%@D*6SPZo;$C-p`m@A$+N!s
z&)3~tvw2NnLrX(jlCxrEOHA{+x-nn1p{B91#!&4eUZt^zRe_Pu^*W4NtWc3&GzBZA
zx(!3##uT{?gE>^4D0xrOVYb{Jlk}(H0siTyvBr$NY6t&T{Mf_6=2T}!66mEc3&z<4
zdgZWk)=2YVmceP{<;H`BF0Q+?#Fp6$)q<*BLeS&dug&)?cOt2iyKEW3GokGG|*
zp`oqC+uSj)wWYnoRJx=grgW}TZ#FnRg)!9&OG*}2#}s;;2D9Edw=||WShxbBd2`&&=F@aZa&fEuJ%CyafW=XsrN8B7R~mYEanqxG$GLrp(7>
z0*lA7NAl{XR+g8c28cy+XOj0Jo^T(dS}u-Q#p~9QImMUWEuKU8oxuMb@H?dJ(PIBm
ztHXvghtxwH0z{qy(SvH?RfbJ~7jRxrR?i^DM9+F4-ffnQ^wh+Jc({=CTD%>^5n{=3
z10uVsb2vysqe-MarWMc0+_WiE_PoduAMYrV{pVG)#%J*=B0}(^Y`58+9sDSQ7Ej8y
zHhI0!B{`-JxJReux(V2>2%W%6qNV+J9Y};`5{dL^E7s8-Tsl~`-6{WQ=QBhm^8doB
z3b!}ZI(V5vgbOzf&NpX5r~uYvHaRM}v|$jAoZzX+t&
zFHF|p4E2@1lYENFL2K20cs(!Y@jQ1T_~whso=bR#1KQ-9G_q%vT)bdSzw~fhXh0nj|QuV
zM5RMKKq62n65YfE-+&N}w#$d<8}p`$)in-p(RI7KB!-fkLj)6l%Ji4h((1
z!|inAxol@*p#jScxw@|%j;KZ>UJ;J?+X8n&ap~O3sJ)W)-Xx6DI=4nb%9||W6g-z1R%{Fud9Pr>m7$Mj|(NZWK
zw)YXA3Hp%_0rZ0jy8?=q$QN+VIj#iM;Fdz+U1zX~s{!!G6sQkg|ba(}d@&hHb?AQSQSm
zqF5?003QfTFU}TlhUmFC9!J8fIy8I`UnIYDFXlJq<@gE;8*}n}8*_d61&z5mjfMCr
z``9?SOcYJN0@~yr*RAq@@w#^$CzRk5Np9rlk4hTR+E=5T#Juyuyw%G%pP%4m7kb{A
zNx2bWx@z!G6&N^Lqm4#bp+U+>D8tdw8t}44P3NRyImdw
z8hF3(Y4Yuco{i;3qZqmd98F?AqGdvukQzyy?Ze((d}@$hy-z+t+Q$wF#TMX|y@MWz?6S;R!yH
zkWgLScHei7JsSU=AC7T%r!U6WDZfY#Ay!W`VqM6>2*3{3>x2%zV2B~?`{)(uqFCls
zp8@EWtA;5Ik^v8ItK9}2JlmFU&qrVKHbJL>Yx`x7`iKR<_w|ce9Gk0~rw2uje4Ddad&14-s8oJ3iGf7pJg>@6a^t4
zcJNl3+@({)3&9QuO_P1oK&YlbH=w)F#mS`;zM*aom9UbGgp3RsyPH^9o?4xkSDlJ)
zbVZ+9U7f1OH#(T7PfgY5;Tr*8)p>e-UNyd5-ECS=bwy1{?c#3of?7oR%WgNN#mTjgNzrvfUu2o*detC^@omffg(iEO;Av`+en}d<%4}{Cb
z)*0~2!sQCTITAkH9-Zi(QT|l8oyuao?@QJ@xk%iJ_XdU9kGDGgBM`~BdnFm;8i!YN
z+@Xq;61bE&H;mz~5``%1XpRL$69xXnB1z4a`^DJC48>JtdQ0gEW`L3PH$F1pO^b(H
zJU%fVzIthjAQTOs7>YDal)fi;#gJDbt{<*3^LddNJpb8e2!UPkMA=#Mrcm^@jPJ*?
zq|&4e>pWuR(MKH$XdCUg?7NJimt&`v7vT+OM3b527^78TJczlUg4c;6CpRt9WFReavi^v2!0YgKHhSKN=ZzB1K+lU`Q9RXE<$6)X
zPF$lL?e<;^9_^k{PVH9lZ=F$2yd}#OzVzC7x@VM!@#w{N_9L}D;4Q@Fhw$jZTYgzS
zOW(v;h~uJUfIrA
z0P4j`1~m+L&@Zec1RsZToe1?y@)hF5L*;sLgG$fIbC@SO*-nDb!`qX8K+h?%y)==5
zkK%G;$$FvvJ&MbMCr5fYG5KMI4@y-4BPTbIl9Sb7a|mG=6cEvvy8HU`ckMyqUT!E_
zFqh8{{x`B$$3uKQ)h>99w(;2D$EqC`{5WKX(U>oleM&$b#QSfkG@DTl9$$moA)HI)
zSP?wrYDgXu4~|JZkl?`cD|SS}Us+y6b}aDBECgP=p}ukO-V*k}l~?_)rikuEA@8K?yzH76~Vqo}6GBjWQ_VNmmPlBQQM5Aa@LC
zL)BzRk4jH4qogPinneQCi9}MqV0ll=>!$}tM+aXydg8=U{;(>qdCd(s^0#ihA-Lnw
zL*8$GM?G^B8m~?{F3IQ*jqgt-9cbLA%Q3#qxJ~fj*-pu`1W!EsEOPMdka}OnY)gD8
zD451KvmE0Y!gpnPxSnj(gV=A-Tg5XJ;+HhEt3u*WrFzA(2DM&UF6WpmSN3_;av3`<
z;Q=A}4vQ4}ab+S$0Un}DSta|6-4XP6CEoc-c@PIy%K?d%EMfL(Nz
zc~gOKVGfrC_C3iTjKg(;Rwz0FC=bCTKt;iBS$aY`sVI4N_!cNw9+3^;6;dn*oE`$O?oKF~ZbofWJoSZmlj1X)H2U5w0mx2J{lvydN;gLG?
zuvCm{m`(4rP9K&EUGbZ@?ArsQuC|9edu|IpNEwb!B_%~3o#NeGgF{r8;PR90d`cOI
z?W{*jbJ%+C+5`>{mOfSse+@~j2@ot!F)18+C-hST!j=_%tU-_6PmM-50Gi@VHpdq7
z0;@I3K<;6@(mKcK$hOFX5|ZQ)JPt9mrt^1$$?
zy$@{u&D9+f7kA@x>C)%+54VmvC`elGrh7TS}ln|2|O8i6{fcs=YL{h2y<<@9r1aXcnw8p(h+udbFe
zZ+)%5&RQ;u&WErh+b$r{kaDk;ub=
zfJ8M6TJ9&RruT=}Z@lUHy=A5DGUKSJs=uMWBh74GP};VtGWY}GtthXIy&u1UH0~l8~)-uG`WBhD1POyg#%JGwN_mcl)Ir!}FuTc&@YsF&{590Kv
z;B{i@jB;8lRs7r7(|Ca5s{c#W;C=gccnkdAM(M3cCLO}avH8ytEu`5+X8#Zb9%7L&
zyg0(4N*YHt{HXcaC5{rg&2Q&+8EmdokD*mnS0Pe5H#ZN8W-dbGQlV<9&bTYWH_N-W
z`Vg8>?oTyGSLBt{x^jy0Yi7IZiWUv{w#*O5b8_#NPGiT02F|lHi@R*zqWYw`)rppR
zS6$1Q@l|{M8@pOGt(~2%nifoy5FN+|l8c@ZJ#P?gQ{@O31|4L%au)}WhTv0Wc{boN
z&!Kl+T~71-#5Kx6|AuS9gZ?whX`ZY2x3omU(>#~u3jTwDYvS+f50@{ZGXWuZn$K9n
zr`k{BOL(BChkOY#ZeI4wiE^}aFpLNB^bzG<+ak*e55W^2SXQueegS65m1}wq%Ao`N
zoeGa{ic<%?ELZM&LzYkeFS6fKc_^0r%x_hAh&P@vUC!5#383QV&C}g^C|uS;i{_
z
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