From c4f0f4669443a8cf4e348331a6e5cdddd0b05afa Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 18:36:47 +0000 Subject: [PATCH 1/2] Draw the page background and the topic map from prepared images The paper texture, the corner pattern and the "Best of three" topic map now look as in the prototype without a shader library or WebGL. scripts/make-background.py computes them ahead of time, following the prototype's recipe and Paper Shaders' halftone shader, and writes three small images to src/assets/background/: a 140px paper tile, the corner pattern's ink on a polar grid, and the map's ink. The browser only lays the dots out and draws them once on a canvas, and on resize stretches what is drawn until resizing stops. - Background.astro, behind every page and the 404: the paper, the corner pattern at 6%, the hole around the map and, on articles, the band behind the centred 720px column. - TopicMap.astro: the map, with its orange dots as buttons or links that send a topicmap:pick event, and a data-picked state. - Intro.astro: the two-column intro of Home and About, with the map. - map-preview.astro: a temporary page to review the intro and the map, until the home (#31) uses them. - Scripts are kept out of the HTML, as the Content-Security-Policy only allows the site's own. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_013MdjUerTCBDeF5DG9puDd2 --- AGENTS.md | 1 + astro.config.mjs | 8 +- docs/redesign/README.md | 2 +- scripts/make-background.py | 269 ++++++++++++++++++++++++++ src/assets/background/corner.png | Bin 0 -> 40811 bytes src/assets/background/map.png | Bin 0 -> 20620 bytes src/assets/background/paper.png | Bin 0 -> 30144 bytes src/components/Background.astro | 260 +++++++++++++++++++++++++ src/components/Intro.astro | 104 ++++++++++ src/components/TopicMap.astro | 314 +++++++++++++++++++++++++++++++ src/data/topic-map.json | 83 ++++++++ src/layouts/Layout.astro | 19 +- src/pages/404.astro | 2 + src/pages/documents.astro | 4 +- src/pages/map-preview.astro | 34 ++++ 15 files changed, 1096 insertions(+), 4 deletions(-) create mode 100644 scripts/make-background.py create mode 100644 src/assets/background/corner.png create mode 100644 src/assets/background/map.png create mode 100644 src/assets/background/paper.png create mode 100644 src/components/Background.astro create mode 100644 src/components/Intro.astro create mode 100644 src/components/TopicMap.astro create mode 100644 src/data/topic-map.json create mode 100644 src/pages/map-preview.astro diff --git a/AGENTS.md b/AGENTS.md index 2ee8e4a..dd8ad55 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,6 +7,7 @@ Josselin Perrus's personal site: an Astro 7 static site served by Cloudflare Wor - `src/`: pages, layouts and components. Pages are built in the `Frame` component, which holds the header and the footer; the portfolio view of `/documents/` has its own. - `src/styles/`: `tokens.css` holds the colours and fonts as custom properties, `global.css` the base styles, and `legacy.css` the content styles of the pages not yet rebuilt in the redesign. - `src/fonts/`: the self-hosted fonts, DejaVu Sans Mono and Newsreader, subset by `scripts/subset-fonts.py`, with their licences. The site loads no outside fonts. +- The page background (`src/components/Background.astro`: the paper texture and the corner pattern) and the topic map (`TopicMap.astro`, inside the `Intro` of Home and About) are drawn on canvases from small images in `src/assets/background/`. `scripts/make-background.py` makes those images, from the map's land in `src/data/topic-map.json`; rerun it after changing either, and commit its output. The site loads no shader library. - `src/content/writing/`: git submodule of [meaningfool-writing](https://github.com/meaningfool/meaningfool-writing), which holds every article, activity log and image. Read its `AGENTS.md` before editing content. - `src/content.config.ts`: the content collection, built from `articles/*.md` and `daily-logs/*.md` in the submodule. - `docs/document-sharing.md`: how the encrypted portfolio links on `/documents/` work and how to create them. diff --git a/astro.config.mjs b/astro.config.mjs index d5e09bf..f8a7364 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -18,7 +18,8 @@ export default defineConfig({ }), }, integrations: [sitemap({ - filter: (page) => !/^\/documents\/?$/.test(new URL(page).pathname), + // TEMPORARY (#30): /map-preview/ shows the intro and the map until the home uses them; #31 deletes it. + filter: (page) => !/^\/(documents|map-preview)\/?$/.test(new URL(page).pathname), serialize: (item) => ({ ...item, lastmod: lastModified.get(new URL(item.url).pathname) }), }), trailingSlashRedirects()], site: 'https://meaningfool.net', @@ -29,6 +30,11 @@ export default defineConfig({ vite: { resolve: { preserveSymlinks: true + }, + build: { + // Scripts stay in their own files, never inline: the Content-Security-Policy (public/_headers) only allows + // scripts from the site. Other assets keep Vite's default, inline under 4 KB. + assetsInlineLimit: (file) => (file.endsWith('.js') ? false : undefined) } } }); diff --git a/docs/redesign/README.md b/docs/redesign/README.md index 8cbe61f..54810d0 100644 --- a/docs/redesign/README.md +++ b/docs/redesign/README.md @@ -26,5 +26,5 @@ python3 docs/redesign/prototype/build.py ## Where the site differs from the prototype -- The prototype loads `@paper-design/shaders` from jsDelivr and computes the background and the map in the browser. The site prepares them at build time (#30). +- The prototype loads `@paper-design/shaders` from jsDelivr and computes the background and the map in the browser. The site prepares them ahead of time with `scripts/make-background.py`, which writes small images to `src/assets/background/`, and only lays out and draws the dots in the browser (#30). - The prototype uses Menlo and loads Newsreader from Google Fonts. The site self-hosts DejaVu Sans Mono and Newsreader (#29). diff --git a/scripts/make-background.py b/scripts/make-background.py new file mode 100644 index 0000000..4c9f35e --- /dev/null +++ b/scripts/make-background.py @@ -0,0 +1,269 @@ +"""Make the data files the page background and the topic map are drawn from, in src/assets/background/. + +The prototype (docs/redesign/prototype/) computed all three in the browser and printed two of them with Paper Shaders' +Halftone Dots shader. The site does that work here instead, once, and ships the results as small images. The browser +only places the dots and draws them on a canvas (src/components/Background.astro and TopicMap.astro), with no shader +library and no WebGL. + +- paper.png: a 140px tile of the paper texture, at 2x. It is the shader's output for a plain white image (hex grid, + "gooey" dots in a colour 87% of the way from #f2f1e8 to #2b2b2b, grain 61%, 10px dot spacing), computed pixel by + pixel as the shader does, then laid at 6% on the white page. The dots repeat every 14px; the grain is the shader's + value noise made to wrap around the tile, so the tile repeats without a seam. +- corner.png: the ink of the corner pattern, the "Ripple" rings around the top-right corner, made with the prototype's + recipe (three rings, each 60% as dark as the one inside it, twist 165%). It is drawn on a polar grid around the corner: + one column per 1/4 degree, from along the top edge (left) to straight down the right edge (right), and 768 rows from + the corner out to 1.5 times the reach (142% of the window's short side). Each pixel is how big a dot is there, as a + share of the largest, after the prototype's blur and tone curve. The browser lays the dots on their own grid (7px + apart, at 14 degrees) and reads each dot's size from this image. +- map.png: the topic map ("Best of three"), in the 420 x 300 box of the prototype: the image the prototype gave the + shader, 255 x (1 - ink), with the ink made from the land's patches in src/data/topic-map.json. The browser lays grey + dots 7.8px apart over the map's box and reads each dot's size from it, as the shader does. + +Run from the repository root, with numpy and Pillow installed (pip install numpy pillow): + + python3 scripts/make-background.py + +The settings below are the prototype's. The same settings give the same files. +""" +import json +import math +import os + +import numpy as np +from PIL import Image + +ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..") +OUT = os.path.join(ROOT, "src", "assets", "background") +MAP_SPEC = os.path.join(ROOT, "src", "data", "topic-map.json") + + +def smoothstep(e0, e1, x): + t = np.clip((x - e0) / (e1 - e0), 0.0, 1.0) + return t * t * (3 - 2 * t) + + +def hex_rgb(h): + return np.array([int(h[i:i + 2], 16) for i in (1, 3, 5)], dtype=float) + + +def save_png(path, pixels): + """Grey levels, or RGB colours, which are saved with a palette of exactly the colours used.""" + pixels = np.ascontiguousarray(pixels, dtype=np.uint8) + if pixels.ndim == 2: + image = Image.fromarray(pixels, "L") + else: + colours, index = np.unique(pixels.reshape(-1, 3), axis=0, return_inverse=True) + assert len(colours) <= 256 + image = Image.fromarray(index.reshape(pixels.shape[:2]).astype(np.uint8), "P") + image.putpalette(colours.flatten().tolist()) + image.save(path, optimize=True) + print(os.path.relpath(path, ROOT), os.path.getsize(path), "bytes") + + +# Paper --------------------------------------------------------------------------------------------------------------- + +PAPER = { + "back": "#f2f1e8", # the paper + "ink": "#2b2b2b", + "dots": 87, # dot colour, % of the way from the paper to the ink + "grain": 61, # grain overlay, % + "spacing": 10, # px, the setting the prototype turns into the shader's size + "opacity": 6, # % the layer is shown at, over the white page + "radius": 1.25, + "contrast": 0.4, + "grain_mixer": 0.2, + "grain_size": 0.5, +} +# For gooey dots on the hex grid, the shader's cells are 6 x 0.7 of the spacing (42px), with a dot every 1/6 of a cell +# (7px) where its row and column add up to an even number: dots 9.9px apart, a pattern that repeats every 14px. +STEP = PAPER["spacing"] * 0.7 +PERIOD = 2 * STEP +TILE = 140 # CSS px: ten repeats of the pattern +SCALE = 2 # device pixels per CSS px, as the shader renders at least at 2x +# The shader's grain has mix(2000, 200, grain size) = 1100 cells across the window: 1.31px on a 1440px wide one. +GRAIN_PX = 1440 / (2000 + (200 - 2000) * PAPER["grain_size"]) +GRAIN_CELLS = round(TILE / GRAIN_PX) + + +def wrapping_noise(cells, size, seed): + """Value noise as the shader's valueNoise(), smooth between random values on a grid of cells x cells that wraps.""" + values = np.random.default_rng(seed).random((cells, cells)) + p = (np.arange(size) + 0.5) / size * cells + i = np.floor(p).astype(int) + f = p - i + f = f * f * (3 - 2 * f) + i0, i1 = i % cells, (i + 1) % cells + a = values[np.ix_(i0, i0)] + b = values[np.ix_(i0, i1)] + c = values[np.ix_(i1, i0)] + d = values[np.ix_(i1, i1)] + fx, fy = f[None, :], f[:, None] + return (a * (1 - fx) + b * fx) * (1 - fy) + (c * (1 - fx) + d * fx) * fy + + +def paper_tile(): + """The Halftone Dots shader (gooey dots, hex grid) on a plain white image, as in the shader's source.""" + size = TILE * SCALE + xy = (np.arange(size) + 0.5) / SCALE # CSS px + x, y = np.meshgrid(xy, xy) + # Distance to the nearest dot: dots at (STEP i, STEP j) with i + j even. + dist = np.full(x.shape, np.inf) + for ox, oy in ((0, 0), (PERIOD, 0), (0, PERIOD), (PERIOD, PERIOD), (STEP, STEP)): + dist = np.minimum(dist, np.hypot(np.mod(x, PERIOD) - ox, np.mod(y, PERIOD) - oy)) + contrast = 15 * PAPER["contrast"] ** 1.5 + lum = 1 / (1 + math.exp(-contrast * (1 - 0.5))) # white, through the shader's sigmoid + size_radius = 0.42 * PAPER["radius"] * (1 - lum) # in cells + d = dist / (6 * STEP) # in cells + shape = (1 - smoothstep(0, size_radius, d)) ** (2 + PAPER["radius"]) + gy, gx = np.gradient(shape) + aa = np.maximum(np.abs(gx) + np.abs(gy), 1e-9) # the shader's fwidth() + shape = smoothstep(0.5 - aa, 0.5 + aa, shape) + + grain = smoothstep(0.55, 0.7 + 0.2 * PAPER["grain_mixer"], wrapping_noise(GRAIN_CELLS, size, 1)) + shape = shape * (1 - grain * PAPER["grain_mixer"]) + + back = hex_rgb(PAPER["back"]) / 255 + ink = hex_rgb(PAPER["ink"]) + front = np.round(hex_rgb(PAPER["back"]) + (ink - hex_rgb(PAPER["back"])) * PAPER["dots"] / 100) / 255 + color = front * shape[..., None] + back * (1 - shape[..., None]) + + overlay = 0.5 * (wrapping_noise(GRAIN_CELLS, size, 2) + wrapping_noise(GRAIN_CELLS, size, 3)) + v = overlay ** 1.3 * 2 - 1 + strength = 0.5 * (PAPER["grain"] / 100 * np.abs(v)) ** 0.8 + target = (v >= 0).astype(float)[..., None] + color = color + (target - color) * strength[..., None] + + alpha = PAPER["opacity"] / 100 + page = 1 - alpha + alpha * color # over white + return np.round(np.clip(page, 0, 1) * 255) + + +# Corner pattern ------------------------------------------------------------------------------------------------------ + +# The dot spacing and the reach are also in Background.astro, which lays the dots out (with the grid at 14 degrees). +CORNER = {"spacing": 7, "reach": 142, "rings": 3, "fade": 60, "twist": 165} +# The prototype's darkness response (line density, blur in dot spacings, tone curve) and its pixel grid, 1/4 of the dot +# spacing. +FIT = { + "dens": 0.1407, "gain": 0.784, "gamma": 0.7615, "blur": 0.22, + "tone": [[0, 0], [0.203, 0.179], [0.225, 0.195], [0.257, 0.223], [0.295, 0.285], [0.331, 0.33], [0.381, 0.413], + [0.427, 0.44], [0.451, 0.46], [0.468, 0.483], [0.49, 0.507], [0.519, 0.542], [0.554, 0.59], [0.6, 0.646], + [0.649, 0.712], [0.717, 0.841], [0.763, 0.956], [1, 1]], +} +CELL = CORNER["spacing"] / 4 +# Corner rings, inner first: each ring's five curves give the distance from the corner (in reach units) at nine angles, +# from along the top edge (first) to straight down the right edge (last). +RIPPLE = [ + [[0.204, 0.197, 0.189, 0.185, 0.186, 0.195, 0.208, 0.224, 0.238], [0.156, 0.201, 0.285, 0.368, 0.411, 0.394, 0.325, 0.236, 0.17], + [0.495, 0.582, 0.617, 0.583, 0.496, 0.394, 0.321, 0.311, 0.37], [0.463, 0.413, 0.369, 0.34, 0.33, 0.342, 0.373, 0.419, 0.471], + [0.483, 0.465, 0.448, 0.439, 0.441, 0.453, 0.471, 0.486, 0.494]], + [[0.442, 0.458, 0.485, 0.516, 0.541, 0.555, 0.555, 0.542, 0.522], [0.713, 0.716, 0.714, 0.699, 0.668, 0.618, 0.552, 0.476, 0.401], + [0.664, 0.68, 0.689, 0.685, 0.663, 0.624, 0.57, 0.51, 0.457], [0.475, 0.416, 0.365, 0.328, 0.31, 0.313, 0.336, 0.374, 0.422], + [0.77, 0.775, 0.787, 0.802, 0.814, 0.818, 0.813, 0.801, 0.787]], + [[0.8, 0.804, 0.82, 0.843, 0.863, 0.874, 0.869, 0.849, 0.822], [0.622, 0.751, 0.898, 1.033, 1.129, 1.168, 1.147, 1.072, 0.96], + [0.968, 1.061, 1.188, 1.306, 1.376, 1.377, 1.308, 1.192, 1.067], [1.407, 1.413, 1.397, 1.354, 1.286, 1.202, 1.113, 1.034, 0.979], + [1.068, 1.097, 1.121, 1.131, 1.124, 1.101, 1.071, 1.043, 1.027]], +] +ANGLES = 360 # columns, half the prototype's polar grid: finer gives the same dots +ROWS = 768 # rows, from the corner out to RMAX: 2.5px each on a 1440 x 900 window +RMAX = 1.5 # reach units: the outer ring ends at 1.43 (Background.astro's ROWS_REACH) +REACH_PX = 900 * CORNER["reach"] / 100 # the reach on a 1440 x 900 window, where the blur is measured +SAMPLES = 1200 # points along each line of a bundle + + +def twisted(curves, pct): + """Twist scales how far the inner curves swing from the edges' midline.""" + c = np.array(curves, dtype=float) + mid = (c[0] + c[-1]) / 2 + out = mid + (c - mid) * pct / 100 + out[0], out[-1] = c[0], c[-1] + return out + + +def catmull_rom(vs, u): + """Smooth curve through values at evenly spaced points (Catmull-Rom, clamped ends), as the prototype's curve().""" + n = len(vs) - 1 + i = np.clip(np.floor(u * n).astype(int), 0, n - 1) + t = np.clip(u * n - i, 0, 1) + p0, p1, p2, p3 = vs[np.maximum(i - 1, 0)], vs[i], vs[i + 1], vs[np.minimum(i + 2, n)] + return 0.5 * (2 * p1 + (-p0 + p2) * t + (2 * p0 - 5 * p1 + 4 * p2 - p3) * t * t + (-p0 + 3 * p1 - 3 * p2 + p3) * t ** 3) + + +def tone(d): + t = np.array(FIT["tone"]) + return np.interp(d, t[:, 0], t[:, 1]) + + +def corner_field(): + """The prototype's cornerInk() and blur, on a polar grid in reach units instead of the window's pixels.""" + row = RMAX / ROWS # reach units per row + u = (np.arange(ANGLES) + 0.5) / ANGLES + s = (np.arange(SAMPLES) + 0.5) / SAMPLES + bern = np.stack([math.comb(4, k) * s ** k * (1 - s) ** (4 - k) for k in range(5)], axis=1) # SAMPLES x 5 + polar = np.zeros((ROWS + 1, ANGLES)) + cols = np.broadcast_to(np.arange(ANGLES), (SAMPLES, ANGLES)) + for j, ring in enumerate(RIPPLE[:CORNER["rings"]]): + cv = np.stack([catmull_rom(c, u) for c in twisted(ring, CORNER["twist"])]) # 5 x ANGLES + y = bern @ cv # SAMPLES x ANGLES: each line of the bundle, in reach units + share = FIT["dens"] * (CORNER["fade"] / 100) ** j / SAMPLES / row + fy = y / row - 0.5 + i0 = np.floor(fy).astype(int) + t = fy - i0 + for rows, weight in ((i0, 1 - t), (i0 + 1, t)): + ok = (rows >= 0) & (rows <= ROWS) + np.add.at(polar, (rows[ok], cols[ok]), weight[ok] * share) + ink = 1 - np.exp(-polar[:ROWS]) + + # The prototype blurs the ink on the window's grid, by 0.88 of a 1.75px cell. Do the same here around each point of + # the polar grid, for the reach of a 1440 x 900 window: along the radius, then along each arc. + sigma_px = FIT["blur"] * 4 * CELL + ink = blur_rows(ink.T, sigma_px / (row * REACH_PX)).T + radius = (np.arange(ROWS) + 0.5) * row * REACH_PX # px from the corner + per_col = (math.pi / 2) / ANGLES * np.maximum(radius, 1) # px along the arc per column + for r in range(ROWS): + ink[r] = blur_rows(ink[r][None, :], min(40, sigma_px / per_col[r]))[0] + + dark = tone(np.minimum(1, FIT["gain"] * ink) ** FIT["gamma"]) + assert dark[-8:].max() == 0, "the outer ring reaches past RMAX" + return np.round(dark * 255) + + +def blur_rows(a, sigma): + """Gaussian blur along the last axis, with nothing beyond the ends (as the prototype's blur1d).""" + if sigma < 0.05: + return a + r = int(math.ceil(3 * sigma)) + k = np.exp(-np.arange(-r, r + 1) ** 2 / (2 * sigma * sigma)) + k /= k.sum() + return np.stack([np.convolve(line, k, mode="same") for line in a]) + + +# Topic map ----------------------------------------------------------------------------------------------------------- + + +def map_image(): + """The prototype's source(): ink where the patches gather. (Its mask of where there is ink at all, which also fades + the land over the outer 4% of the box, is computed from this image in the browser.)""" + spec = json.load(open(MAP_SPEC)) + w, h = spec["box"] + k = spec["fit"]["scale"] + cx, cy = spec["fit"]["centre"] + # "Best of three" runs past the right edge of the box, so it is drawn 7% smaller about the centre of its land. + patches = [(0.5 + (x - cx) * k, 0.5 + (y - cy) * k, r * k, wt) for x, y, r, wt in spec["patches"]] + u, v = np.meshgrid(np.arange(w) / w, np.arange(h) / h) + s = np.zeros_like(u) + for x, y, r, wt in patches: + s += wt * np.exp(-((u - x) ** 2 + (v - y) ** 2) / (2 * r * r)) + ink = 0.62 * (1 - np.exp(-1.3 * np.maximum(0, s))) + return np.round(255 * (1 - ink)) + + +def main(): + os.makedirs(OUT, exist_ok=True) + save_png(os.path.join(OUT, "paper.png"), paper_tile()) + save_png(os.path.join(OUT, "corner.png"), corner_field()) + save_png(os.path.join(OUT, "map.png"), map_image()) + + +if __name__ == "__main__": + main() diff --git a/src/assets/background/corner.png b/src/assets/background/corner.png new file mode 100644 index 0000000000000000000000000000000000000000..a70d01cfeee5cfe440982c1deb45fd4fd21d981b GIT binary patch literal 40811 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 literal 0 HcmV?d00001 diff --git a/src/assets/background/map.png b/src/assets/background/map.png new file mode 100644 index 0000000000000000000000000000000000000000..d5ced29542cde25ba7aea0e9283d7b2d0cdd6c56 GIT binary patch literal 20620 zcmV)SK(fDyP))UBjwJx|p!)y6bk6DNsgf8D%!4gh%{{nCshUwz+{6q<_;oA>TwLHg2mnBT|LVK= z;rb7{kLEqvPl~Vnd;RD?z5L$)6Myhm0nx=L{=ElDb{7nxg2$tRHC9`g{(nLVe{Dgj zzo_h~wyAXA?`)|0tDkt7u8rvrp(L+g-tPiwi;V0L3+A+c)>xo)h0Vuc`ok#6*Dmx| z{@jI^5h#G*QY_Mp~*lMZg21KYG-FrN*^wu`lpOZ zev3`whe65^xz8?)N?(KAJRQBn*@WC@d#Ef{e*z_e-~8tTPZR%Ln2wYnT{}JhDV8|R z>s;Wnhv_og`#mWAc7Q(kRPo=*ip-nrO=_3r?JcQ{LG$efunS}Q-oW(d@cF=##eXG; z_8@tvZd{(fighr;?Z+CX-;2^e0MKjC7yng(;y!MXDjeSCw_idO-ldP(=lu?s_YWd; z`;_tjzz&)KlT@+k#@~f_6ug{%^dBN-H@V)|jp?5U==wS1|A~fVJ|wiZ##Fx0eLyPk z*kiSgPT%A5{u+cXUdjJNdy&njbsljalddqT04mYiqk0knJC_&?cvPWpu3-8iK=Oqc^HH4efA0a>K(>oZbrn414AH~&4>v$Xd-?!Mn{Uf+ zgXY`dvPaGT-T-ug(<`R5H>6}m29pb@`p50*_UcmLH(Y1=P2uLXy61oI0ZM=+oJ@u2 z%H8b^$wE_pxbk{0qx4smAMoQpd~C1@?=FmKcUZy;kWkEjU_O*jR8UZ$|Hya)K^X5~ z{a=EAIX?QJ`1%iH0n&VT0aW4f_8GXT*L8%%8Ihpi#He3qf2k*wuzu(dq4awbKl#WJ z0S}1K7>LaGEKn(Z*uA9dq@iDS>?lDA6UxS%0DmV+^7Ws?Zv;y4e<=p;Ex~l_@CsY@ zWp5K+Y~XQk;p>=7q*~Fp$0hl86T>eDsUw(=`A{2FP9DnA&?X|`3`q;5Zb&G&yqGly z6yx$%;IcpXt+ph;!vV?-7WWo)M1-op1xWY)E;jm%vr~WPAew(6<7EBaZ$e3ab9|C3 zsN@o-BO{bQ$v$tv6#d<0ND61y>ESFy3nPz{fk(59Z_FO#EBMFkoz>ad11Fjs%eZF#jRq z6ijL7?(zxA8Bs!L;*_uS#Hm6lWkX*^NWRPO$quXyP$f=BVL|2-{q`n#a5aYlrXp*A zl+JZmr#OY{tk#55q7+Q&b(CI4NPbI1s)5Qld64{P&Zs_SO2t9e1tbF!3Mx$FY8#|b z97@x{eFIAJ+BZLMRQO6nlG@BLrQi{p2$%DD{oSo8x#TVfB+VHnN(&#vqB681lh4E_ z8VRMB0{HDWzh+Z%QQ^fKALqVxY-}i_wajUggr@^RDhRoPs_}Kxiab6tzL-@9kCMTq zN*->ENnZG#d=Q9aY}W`ns7=yFdQ%rY(U#*Y2T_ zi!;gH_vAA^Q0_clG$FaeNmdm+|KW|}gPkdD-Cg1B0!SzuSmJ4RdOWQ^s2!O!PY|wP zdd17hhv53C$CLCGUf|SU!m-1L?;T!ncaqOYSLycv34{I66-r<%sSZmQp8b^!Kwd@b z6~u6x-AMrI;?5EPJPL%kz{#LAak8egP44#T_XH_iTP~2o@v2Oc2l@OeSYaiv=MVD2 z=N~bq%(}K_B>ww&VNOSci1Qa)hqrfkn~IPFDcX=RB#t-@nC3AFDu?&sqwMzL%PU~L zf)`eqgE*izIAJUcMR2%)$)0MfBs@KKSrPIeK>-jeP6bTen5@gY2}_?aBKa^@FWZv1 z&#oYgDR>M?9AN4n^)wYtDfv5Jx4QtznG$tRM~V|yPH%;!>U=a&`XJ%10^=5{51@t4 zmc)Jw10qtI)3L#bw`pET@G5_Y_xZOgGYk{z2+_i)aH6yP;2mBFOSi_ffk-|D)iq$~ zQ#>(9p@m0ka~df)K(wVRn99^)AChhkNi%EU0TuUmG*FtRz}`CT{(6eOzWpGO7B*Wdo-jp~d57Xmqf)c{6k0jd!TpitjXdomZ zeO>NCO-TaNCccfqSMG3~^PEME?<}06Ibmx0!8J^~+#w|nIct#WC~HiK z7}4U>-=td;iVw9NA~40fjM7~bduv4Q!!1r12dCnMkDB!O?mAOUmM-1b6|Q7g3UU(Ht9Y9oNQ-rmFiqQ$K+4Zp0)M*I2VJU?dbaE_k;?g*2AR!SEF$tlNdOW3Y6fhkwRhn;r z&V%@jk5eLUuZmbhT30uhi6%-0BM|}+0+=v$TQb=LKyb<~_m<0Q=CCQ0+LEp$Gvz+x zTQ_n?h=qB;B+|_U5s`?n5fPDy5CS4CmwW-!f$pHS2-?tbDy)gUDS4DU-_%)=n}S&= z(MUywIz%!%eIyJ(`b#SJChGTaKiGkW#j@i->?JcV1?0qKb@LwP@kf|FNQ6YhM2)D4 z2niAU?4gE9K_c#_m0n8g=7iSq734{K7H}b5d5kXevL`4sLlr_IB%%;?n55g&D&=bO zAmO3+41+kXn;U{sqjaUlC`HBq3nF1YnVC=KnP?4f*F9b1)}-}U+dH0e<@B(FG{W?( zLa&(K|3{P}HnC0dtbg8PWJ=_|Ln|nPBDAIi0#LL-V$>dmR0_vcsn-=`0E@Qmjd*6Q zE+X;#YR%~6b09TR2Sn)Ms4;O9Y0~;_*G-}$WVnR}CV^w#uj7QT1Q2mh`TNDiC13ow z!pIgH2S`i{B(pT4shye*okGEjLV_qF( zWaN>Bj9Zo@aOfchCeSnWtZrJAMoq0a#RQPhW3+%Dw-6IgH!KMFLifQJHMM5uVY&io zuf^#9n)6Y2b|;_bsVGg52nidvanY9F??uXxl3JJ$fwxTA!~>xmNxfuvyve`pG= zKR<9BAadsyZ#)ZJDuHt$+?KWTi07} zS6sz@5t312>f@3Dr4*DRNqb!jcTo`_yE`V47S3M*q;d0A!sRtc)5VdiZNjoh%r(-z z%4rdwe8M|2JA;x1Ntl|fC&lM@Dk6ymIy0_iNlovB9@d!8@e(@Oi`3>9jrUCPg7! zN`Ehw!n2}MFF5pr5;#jzbZM2!!}G@f`k6`o$Y}-z-DegRS;VEVrUMhln?& zbp?g`X;x_b#^6GiIqR(hQ1-L3!lU~DM&c#4vfsq z+#MIAxLY!ov;+2yIZ+!Qrc)e)6uT}XIT9LB|Dq<-9BCMIEIl#t(z z?7?V^98E2Qg;`D}15q1KW4ZEJNwL!v?lkM_v)*N_XRwAb5e!Ue5O=!Vm|hm`EZKpi z|Bc85r7`UoAIa%?N4FSoELw129Z4A%Oq4FnBqEI1kAa;U6*OR$t`Z!_dg1-NOe3P< zN*qKOeL_(+jqPbRo?)Y?04V=dI>TYYWFAug?{Sl?Fd1Yew(Q}V+);tjG$pGWT7u+0 z#D7Ty#pUy4R2tHFv~fZ9WXSc*&|#5?)e zXMn*%0pi&8nZ~mWY23h@K1nX#MN1;nzIIw|kk0H`s?kL$Qy`l?30|Q|m_zMkIo9=( zz?#*501gF3ISz;b!pubHup?{(a8}Eq2Dq5 zr_J@Cw5}-=uehYwObketz!dZJs#dg6BKBE>XJ{_OTx(q%ND(EMc54=AlZxfD1;Kb- z!gcq7Pn9+r3D(`M?;YdX@a)H9A%cOp>xmYvPmj47b)Btf~*Rb!jX$#n7>5&#!j2yqb{R-XY(7h!+dumTAhH(uU*yiN%8U_ta%27G~n zz3lmQM!n-C2b(JR-kuqTNGY0KE_%-o+Xi7PdruSbL$yFg?)#>nIii9L7A zoWSN)S?zNTi?hC>Aqh*-?b4E9p7&<0dM0(Acxt45Bz9=ghh8KBKqBE4caex1k-EG{g2cFWOKOzA3BovM2xM{GzXNhr8i!S@&?&VeSa1Z*9+8IvrW zomUbB@$LquosSofTIUiL768OXt+hrodtHN0X2D28NRt`O^u096rO=5sXY_><At`~MH$zbM&i)g(Hg<1 z_6h?q2{WG^q|T%!Xn^bVjuk~l)-!TW(G{p>21Js*gQ4G>`3P~jzTU&)+&C5}twXdi z>~OYpKp9qa4bm)ju!%~jo_5al8yzFr7W1rmnNfe2hpaLQAoUzUW?fzcP=tl)To|?1 z`j9Olc}50!FKtOjHZ#-=0Hx>4G5ZT+j+~p&?!X)FKJbMndp~MX%vq5E2=&l(ACovG z4oSg;c*&3yB_eVC29!Y1b}>%#ZES=H!mc?%G7f>nRUy z9HGF1wCe3qAR%i4h@Mj1>sf>YO&na(84r37LpPwZ2_TkOjFT!Tz4z!kOa9T6R-KO- z;(6z`1rl0G4qC>lA}V1@Q*dudPRm^rAzAVzCMem_uA;FN5yChw@91!j)XcrMEB-`H zMD08~NCHG{wN~`1QoO1wuM=D^X*%cu*HADpWudHOVL&RV&OZB{v^9H3!60cBtSB^R zby)M*XW%wbUH8YrNRLXcFHsZ=-NHmKH-r^;5dlz0keEmW(NazjaDar=I#NVr-Q7ru zNis??tzP-wM9C+LRvsa^&#oeUl&!Bdw~wnz&cJ8c(Hztub$C9h z6I*{a{j0d(60^5MTf-Lsl0nBq%OC3{SY|<_b_f7bYe?4Ju~Tue9D8%&h4qe}BWg0o zt6b*BUL3(%jf^sP7`gI=4N3h`nM*m)VRHe*aWx&h%5+n#WDF2;Dh^52NB3ujxI8uq zI;{2^07};zB1Rh2joz^VKx7d?qUXs1h}0Unj$i^Q&JbZ|zOUH^oQb6yX9)>7d(Ng= zO1K(EHl-^$W>#Pab>+ieFZj-qR@~`hl2i1D$%VY}M5kK^SAJG;XxC>eR*FFAyv-+0 z+=-cL004jlfX_C{5!g?-CXUR(bqi7)YDHn}4~U{s$xV4K1% zm^w=;PebS#$RTy?5h5ByzQGk)k`ZcT+wKe1$Iz%qeSaJK(VQAP<%Itnx5`T4F2 zKF=hY;K@`AoQkP}b50$Tx{lGL%ZDt$yaCgGoIgJdVlpGK7@6qVdOz;>nu~xiGP37c z+Ah142rZ-5$~brI390r|Mla?+tE=>D#$ahbyy*~2oT6QB?;$gAhsOg(c5#TQK6`5|OjqMiTHj>p@NA3xq6 z2chuu*Ux|bd@?=++i?)U`TpzI`}@g2?RcZjCC-Nk&&O> zx;vLNOkkXR{f^_%ZHY;w8M-h{-2j@Cv^r-|R1IxjiYCP)LnlzeT(MWSze3*4b+g}&C z;!%rTXpk`~5E5rdkkfCT@2q^iY|BD@Fr1O}L`VRF1VR!gxxH@6wg$M)$Y?vNxY;K> z)Jr@~wP!T#Xvd=`cSOhI2ji3R`0?X$An^HoKA-RJPeu}K?MZM7GXqj<4MF&1=Ea;l z&*%I5sH!h=sYW5V-iaQh!DNkTdxV^`b2SHVNu&X3Ak;tXS`}00Oprtf1cuC+HKWyb z+|4vQ;?>d;8#$h7d!y7Y4-4Ig(e-PsHADn#4;Fen1&_y%A4eOe(hoK)%;%Hge1D!o z$K!D{kn=owaAx>C&-eFV@6VH=gD6B>VB(Pw#fl^9A{xvH86(YA&7Jc9d9QoWwvY03YS@41kNZn)f_~`Q5N(yugR(2Zbq;k+fjkz~1 z2&J3E0VqK2Ae58e|NZY@Poc-j=K;^>`;!IRaWn+(v;5Cf1Q7sFoPtb}mglCy1VfQ> zX?HXwzbJALRK<0Xw8#+P*@DyqtED_)L}_7X%GZH}&-YUZso^QlU+>Qo=r|q^!ZFh?!XRDiTJ;Y- zn@wse^F*n_2U0<3mYkQcj~+nR?zQFVCPEcqUxaOO(%;C_$B~Tu*fixWmw29xpt{N! z$hL#gXjlh{^JQ74Ff*_|ECW;IvbTkV1+WQVKg?o3sLlZx7Jly_u^={D!FR@zk+Vri z?A9w=j$+-A4z2>I+0C)bz_q6oyqy?Rnh53jq&0QpNJ4-~)Yd^{r!16d8>eMR=L!-? zy|)0)fuJe*nP!?v+6(0(k-<^HehfWP7^po6=y)77IG^2J42+0KP@q38)5jIL%7_FE zOjbBf(Q)ZQ#wgDXJ7*`WXKcxlQm~jb^EE(`kW7er{^taV7FWP?1631y4IB;5xtTP@ zG&^pdfgNT7D@^EU484I1opEyZBhoJvf0RoK!Y7g_flSgrqVYi#+SNTo~cSIi*izny^re070Nn z=2xS6m4AIQY6xd9gbz_U>ZD6#;Rhi1aMe@#CWy=cFk8HK6jQ}nE+!Yni_hAnUfzVl zf|{8)PzGt?0|EkvXU&2gao0TDrt>3pn9i=ZHZH-hXy2!!t}P|jS(foNc568b^@=< z`<&0`sdWF=+A$`k=|DPrji>{HB!D~=hvOi&AEUT}3B)X%ux6x(qwQR51j*tfARtHD zhG93mfC?HrV{$01tbFv(R!a08%F);UWmr2w(z*tdNr;s1~>SC9-B2jXk<*VXvM}^`pllOH`ohMz`buXD}i?DiuK~aS#hh4D@0PX7IRs>hpY_?+YZP5u8TWi$iLB zElXLw?^>YCN(;GeOo&!yGBq|O_LJpkFS158HKgwD;;sd7YPF*tJq8bGaZo6LB;zoq zDH`gWDACFnda=MH;aK@Q%d;=kWn9V6ODVAkpZq+Z=lSd)jgu}SfHVTs?ofQGQYsNj zEvx2ypj4)GnQw0kgA$BUy0%c-pQYU{J4`v~tFxmkVM2EC!89a`dT# zvxP|KEg{m`J@JdUmQ?NNNFV}qsYV`$eX!1PHC=;(p2JFlWEYhCsx8|v7E)8|CNiH^ zNGmYHL-GnOe?S<+lwAs=cc!|(1I^SI*NI8yDxKPrNbPA8l^_%25yLPyL}4PeBVJT7SLm0Dn2Z+<}t5xrUbw$Bzzs1hdRUyOTKF2j7E~OR{I3W}kU$SF{Y-?{l0 z?O5zwT^1!-n}SPUmn;eL(Ll*0a~q=VI_Wgx;1t>2TVt)$$QEXCHI#-hPEtai0}8C7 z`9! zZ|JR9?2-h@GVYa%V1KOF<5kfwa1@ zMx2{W?=PSfL_5*-|JnL zS`JTV;@rY#o+FKR(ANk}xZVXtX_cygiBMuBGAbZ2g<6fCprI&{*4@X;lT^Qk0;uvp zn<_;TOGBl`tR0gj@2YT{VWdev(;zm2P0q|DESy@SStc8k*=IF)Se`3}9!4QE2hlt$ zjOIEa;&Up-vfWl=MmfkH%iJ_9BuU@clDH^9)VngY57e67J8d z@szwI0c}0uM%+-$)`lgW0~0ZAA|{~7PglTLbK@3fO3o}|8K`yTdWMCjRJ<%zT|?4QelAa{5DwHSIE*t*pPFtN@8*!~vFG=vbnR zc&(VEC~2v@%I*6v>XyW_kKPe-gjNgFK)R=2VN*?Nk*E4kp`2v5x~|ri(k2$wQG8=} z05!C&1z88R+55=ZF-Y{SAnsLfLc@5{@n=tPYNs9y^oC@j-<;Xg0GS+06I$Ah8 z!fi4Ws|zu@D^IXI;JD##=WG8i*0Sn16F$qJLw?Gmn&*W#! zAR7}#(kMl#2@?Zis39#3*Df z%B=#o?hd>$Wtdi#W2{MEQ-2bb1;yq=t7FT6j3~TBG-6W&V~ZTiwoBMUVbjDFmPU}7 zk|Dn6;1;cPamB8$sN@NFP3!#ClB#I~`s<2Wq|vHnp?7x>jH!glG!=UvJ!l0O2{Feu z8hQEHHaz5LsE})eV$q&28vB%1OtlGA45>3>T)iQKWMqVw!<%P32a`kUb=WSCs0bb% z15W;AxjSo2S1_%v1**FXBhJ21I;Pc`M0l=XK~jk(5Nqfz$EyO9dtQD{bM^XgDyb}r zMYAA{owi16jDX`hGJzPYcN!ZtY&qaWy+5Oe?}#>DEP7ay?y6sV-Xcui;q{>8Wlm^{>M$+RvKoY<=gT6f^b>$m}(x~2v-K9P)Y2*%Qdzfx;(HWGRSAsjVaJe+A+P%~S z!wQ-Lr9&w}$~m_MTF9MW;-aYIN^fEaDSfvhu?LB9C=S}6GCn%EJ25mUi;>+Q3MyVs zBI^v>DAvJoW@L$I|LW!){V1W7=cTth-}_~V{eRfwG{}av~GAwfeD<3 zs#Z=Hn{n^)oWMRX#v^28F*=8b;75Pr0yn$xmYi%^^=G)sqv)E1*>Nck$wf#qELJc= zi-Lm7lmJgeK5?+K)!#``DS@h2YEW9c;OBcb(P{Up=L<*}jSiw~ve>NG17sXs;8vm8 z3{|LV)7q_e4Ux$t4oAi|qmY6gC+F{iN;zWe`naIflW<}{h82^TnVHzs@dT^AKB3t+ z=X#lC&hwqm^L!5ZCstimr^I4phUelOiM~c${x7CXB=wu*^=e*W1dU}(hb2vzmd7&~xf{(f zVB?@CSe5g2vn;AesFz8I)LtWGC3A%_+kwaR;nL%cm}FOKDN7egPhK`M34$Bl2ZVHx zwS!&DltxhUAg!>ZC@r@qm`7Eur<>01IWRg`_5fxfP}KccBV*2#rY34)9f&6YmniwI zlNdJII7=ZlCQ56h$ruz_gF0Zn>~r0RW*TpL2Z-z5O2|`V4zvR~>vtX`f2LKpA)b0* zCogzD-vLoKB_1Kk&hAO1!>$Q=!H5zd8r>Oz7?Q>9>h)!_N^J*{CnFD%wW10pW8_EI zK;d~W$`nLzjk;zPs>jo)BsREZ*JLt>P`?`rwR}=Q31m&5spIn;gNZ$B?rojjX|uag zzzc<5zz%xj0t$BEU-`rDG9AkP<)?5F!T>^Z9%}-{0S#@8@|60JheS$MF!61|%x+h?cIL zBX6Vwhy6u^J%Zxg9gnWv+V6%=V>goRbpLKw^&B{{^L8jWysNG3+2b-u8bPrK9uz+{ zv~LK2&v)YXu7FL#sdy_g^Fvt9^ZEY%>({UM_ve!tfLc2q&$lk{Z1Zl@UJOgO*588K zGixWa+=fW2mNQ_Q^oLcN3No~D_<12bY{;Z`^Zcx_ZmJT8q1EZ^Dn_{O!4tsi<`7Ei z6S<}8cbH@=3#)IZB|V?-zkdGw_4EDxJQ)z%@pzs~{an^sPZN|-YtBmr*W^*E1Z;?A zFnJE$*)2UVbE4H>v^6A!=v-cpbyRlzvbZOAR}VF#q=kyc6)h(|Tq)y{-CIKC3aRnQ z(Ie9Pub)4E{`~cRj)elxljk6#9$?TC%k2@-1gBczWliFlU11vkNqv$TOMtjsK}^NY z746tgGmFn&!0u7P%o~YaFsHxjrz2hH+7(&tA|JwX@Ccm}v?QZ3iq%L!O=>c2)AEz#>gaVHRgfD64UeVmG(x8boFVS4*os zuVZs{$7w-i!x*u$1`-En4e5VF6HNtiyY|z}_7rJCKq#O^WlVyu>3cq(&-drBBo?6d zd_E7WAgSFzP4BA0gVFoUF?L>xZc4-9nTCZJ8lc}FAp&!Km2FTAh}^QUDe9W`xPl=Y zxlISfZe~N`N9BkbX6o2_A>!(NKDR6F$d$pfL8TuV=cIK~;`8LLZa)uAqfVsT(v@Ja zD}7Y;Yne=TC!a8mrG6(BMBQMw!NV2QmPO0!9D?9Rm`l>8bQb}5sMOPudh|j_(E$Rg< znB{^AAGQh|TcbCj4yer|+><*lANtd!S?Pj-5c0@^2atI}O zS0IY4aC?BNeasMIwPQW&t_RlC`{Z-RqvbPAm@yQIwA4_16tW>sj8%r+rx>z5QJJ$? zce+o&_wNb>NBext&>!tM&%PR$+Ho95J6a<$D2e4>#M5k1$Q6_{=>{TuZ?pUzI$cP! z_cA2kDvO@|q~zF^F1&3U;gr&KGZz9mZ-{5t5`+v>=&uvv(I@DS<8iV8 zwUL6qy*=I@$I+;fnI1By1~J}_NGrRx;VG!nmyTMp;&z5A&M}JH@@o(}`Q$Tc`s#7P zmgP*MIF~po%IADYF@}^jGo#8hAq1F`dnRBHxgRFd4Tr4zozo_|YNy^>}ixI2><}w;ykhM{7h& zs7Y+DBSlE+CdG5}DB9XFde-3H-|a@tNBq!=-7KkcA}j;Oxp&uqXJeD6`p(r*Qz17& z&y3NUD`eF>C=^Mzjfm<)jnDvT?3V1sAO;{hj^pw6cs!1y8JQ-hO)%XZv5`n4q>fSN zi8Gi!VOR(!0QVrdHOs49r!Z*_o?4@ceWAm9JZ14FMCXW1BJ4N!p}6q|)9Qi^aVPbB zcYe&H6uBhh*!?q{-8}U5mN*Sj49a?g_)9Y(y2HH%<_P&f^;fB=u}hU z7)rn$|6vscr}Z++sVF&TH%h~(o9+<6okMbE5;9W=qh?R;5?y~5I1WhN+nvYQR6R74 ztk#Pef44ztdAtQs8$-_B|BNQY(qsh)o55|pwf8IfCID^ChFZg^AhEiN6mKPl|H2kdyG4~5hlRk?YQ)Irk|v<0V6%2rI%(@CGCkT zo00hC3%=8UROJo@O2OX&z62EHNR&XbA_jS?L5iN&Fh5;%)uc(^@N6O*c8G!)_5!Gr zj!!N02?<4z<`K!!>}Iz@G$LuQj|cI*FUQs0$i^;ZSrHpg7YBO+(KL=f=ZF;j9pJ4& z!DdDYbcM=+dyPi#=%Ok0d>09zYjjD|9VsUIAR~*F-3J*OMZd^9r*Z9BV))3nO0#7t2rH)|VSf(fdG+YW&Ykf7YN zzGIiE9GRfU2}fNKTk?*Y%iDeJX*kx-Q0`!YZ5n4uA_gRwiNh^U7^Gmqt#;{`vlW}M5s^VS zh(hX|^Tc!f1A*u^XEBwwh*2OofESfxBp$*?Uf*q;xIO)ob@uJL>KN3 zy+9CdVS;^*kW6U29o6LU4O7!}(Z~9VzN!bzI{Us`7pC_ShDq9(Y*t>1LZ>YO^@EoU zULpB5R^)=dAp{|!5DEzj@{0Jr%4C;I2G8IyvLI>6#JW55F)2Dc@HP^#x-@N zB)vGy?}sLr!^1FGS9`nY@SHJ01xp=<(9Ep|@%BrctdOoD(R5qdZ@L&Lp=)9S$6qCF zfwVG*>Fv&w=b)HNyx9@Ctk}|;3}YYg-R2UjwCOP-)QxHMQgVl{pj09S38AE9bCkjW zcOK8=4pY>Da%;sT3h0zF0Hh0PiNmN#6PX*ern~FT?wQ7rDvI1H-=Wo{bj4A>6hqn5 zrt!T98_wOu;+-lzY=TlyaL6ESATky-{p)d+an~r>++o~2R2`?3$4dab>J*)kG#8gE zMm@J95@hlqo&40HOGEn3dsK5!;8^rH$NEk_pXakLB|UYVPol1{>yu(6 zLWjX}w~($1M@k5AivaLO9nGT@E`EX6E(}Ehs1Ly8O=jQbT+;pP4{E8 z%Qd#%dS^-?b&Q^BNI@XRP#C~6hw{Ye94*BVL|n$8L~A0vD>hU`hsu<$psBswx~C3+ z&)Je`(oXgxEp|P~s<)ERETv*Esopq!eYr23Z+faYNPl9B$Np%oz*6{?%fn+)S z=BDo`X@hPpQ`Ciwv%c!F5wG=OigqemxY1dk>SLau9U($%M}YTsloPxXB)9;lwxO3S z312CV>*BM?dXUaPrijvrN@%3hKwvcJx(Q-e?FU5fz7{9UPlt{9T%EOaIb>Yqfo3gx zP>vy6W^i`2NxpafF6ItbSXCe;h~Vq)4rOsvEMZba*Rb?S3#75L-MG3wK+?;v2%|~Y zCE-U<>T`Txgo@E_-ZX4Ww+6?`l^6v-ox;)5DJ6(pQMD+mO3g!w4lhCkm*(Tpaodl- zCnkvz+qGhhWG#u-J`1xEX3m&*A>ob@xt5X{|3ea-tLluXtY!m(Ud_>I0Vza)ZXaX) z*DYR!t+UHPsY>!Hlr9X&;&XdWdex3}mPb5F82uedn4}dwFd?AD$f%4j#c%43cd(-i zvt%(wtpzdb20@gPw6gowe$5s|J( zt3h7-B11miU}Sg+J&e#;W9vD#X0{!by1Ax6!!o9|hIlHvw*V88l?jB+0qF&h3Y02f z_7Iuc??*wpt&S&3Ow8}rgmj4PJWrNFVTa7zI|0*>wEN@q2d1u|mDF0V)OGY|jEw}C zl+lnd^7|PPK8DgBmrWG%e?MtScUVE#meWxpSq2hOlD=X(6iqX$gwH#%bi)(_5 zmqLS3JyOcBF`{Wj%anXM)%S5DIbNz7UKy4yZ0Zu82+>y$v$wogTV`h6EhoM^ugiB4 zXJ_4M8tF|S?#>X)Nv+0=yt0nL=jeZ_H6m)E#(;h!FUHB(?d(a`AIDu;Z{z0*h(7A> zN^j?sTjC10QWejxan;3adfLG;*>3zzczp33x`~pQzI<9RDsf6g0iG$q#BSLX6!|Ey_tnJcKSy*&y#HM9!mRy@%SIQg)yEsc(TFccP z8k3rdNSf6}d5xNtcomf{8|{g=l3)t@o5vTuoup47I0sB}=EY(t(`6b$SXhmO29PFc zn4_YgO_V!*!TGv&3{&df&hkyJF?yjln<0`-H8$*A+d^~~ljK!zr#&3W`2!f zb`(NHGVNLrIKCL^NGbGcPxHhDSglyA? zxjW40P?~iFSesG-(bwEv)&5kOP*)=Yr*4)PcRZ>uIZuVM*5X5d_4OVJ@kB07| zn$b)eW<>I32835Y+6NzW2syPyGl~m~;EcO$<1;a7>+K|3MGleZh;Yu=X|f?&F7=C} z^7B|kW2bHieo|?b?(*@d_4=L38r-HKgqKmeWB`lK6vAq_5D6jlMeI3eC~}YETf7~p zdXJAu%e{eH8jN$jK+3DZG#a*l!ofRz=5u=cedi3FnaZ+uQ^Eo{_U?KIDxwOh*HaV=(CimAX00s9mm1apsymTx9Wa2 zaga-I=RbtgIGRikRtGg!ETp^-q&{bmDdq>@3yH(lo>WZE#H5gjJ4-Tx5K^Ed_tjjn<`kt+wZTW2 zQ-)@3hyno_F_Z#6;qY+g417MH@9*#L@6YFX4v^Y$oR8)F;;QOe?Bw_|LWbdcWdqKV zY*3OgStQ%v5Gr?GVpDQsm_m#1XfrUmCC-!60_Gfh;elSu0Y4DH?-}N-!TbBK_h0Yt zeaRalwst(ulcy3idO;toZS(kgND3Er4WJYdm7{XvBAb*rOWhd}s2rtYgw(s_+0P+` zeE?vUweuPC`eamAxJ1tL`Fwx>_4EDx{dqDAAhmW(h=`b++79l1#qotk#FgVq4}sqI zhDB3e2VJTdD5cM{|L$kVX=b}NVQ4vDFuvI54On}jyR#7*8Bso;&-Y*NzkaBgJZ(~b@$kwVBK5OG%Fea&gsQ{!dWAJpA{5XrLKCSaP zcW45|HbPyMyQ=BojL?0f4LE@F;opy}p;#Yiy<4}Yon?DrA-(5W$?3}+;y}exq zksp1Ppa@M)cNl+1d750SX=(iR6;nza2%YX&OQoOZd5ZKoJ9@S?MGw1!lKb{oJF`+| z$;EotT-y>|!2)t;OBX3$thXCGqEYTXnklFHjBeFHAaG0T;vv4|^1vy#EqRc>(a5Os z+FAM9h<-=YPpaC$rXOSuRD~@iW0CFiz=YA@sA})1X-?;5Amci0|HUh|geh&nxg8#` zr1^^#VA?yH??}Nnd4rU`NNOt#YR8W@7Q z<;G}zbsF__#Bpa^uI7F{1+VjlBu*l5;q<`nqV%;lxjJl>x3XIaKkbMNnIUC$x=DU5 z<=RjjUnvh+zN8E?4beCPw8ku>%52SgOnM^T^vrd^i~wKu)$ zxXQXH1kH?r0zI~>DxjtI0Pft~UWrx4dI;j4T=u#h;5;Wi9(@Z)Yg1{Zq>jNiSW>!# zA}J=hEnWU!Tz|nurGhW9JJ)-R5Ul1*qoNXI`>)~BxUaLn!pz?0gyzR9MX$))Se>+r{j1$-rn9GeWebPufx>0z!wXwvT4cr24F50=owa^ z$Q*8Nio{{F;!W!8TtmW_7;3gyNan8m9bRP)0KKI*#^0zNPg52;9*?)TzME>U1G#z7 z?apWp?`*%DhCq3JlEBQ_zmcC^RQQ-{7V@t*W@e3#`ES60g7thl0`SqNW* zq`jlVNa=G)!}!}MO(_Rwhw(UkpGn^NytyBX#(ZK=@K$G54{y|v@@j=Y=I*vxL;%j^ za+SBMFBVp7A$0txk(uAKYIW$$26qkXmy&S2^>+X?3~9+-cH+{QF(kX6>iU5EdqKL* z+v5o;9b+#%QBc^LXL|>bm7cLZt+FPEg~@y-D6I`G-E{i;FqTm(a+5Z2tI+m)CjH>W zdhxCv8@hhDvm=C3Vyn@b{|}DN)ERDA#Fg{AOTj{wZb+923Ym2nbAx$0uU%iVmq9}L z7JP79YrTE#g&M721@GjW(6Sf+c0?g?WRhhS0q7zgz+)@aeHDDo@vWZf7_v!tyR^s}jJ60cl zF$K>8OU1up*mSeR6zoNs%r3WiGe2}b$rL$*m$zMII$Lx>43bRVesGt9!>7_a*Mvr$ z5Zv&$ZhYwR%`VP-jRp_^KSVcgZKG)z)Iw82Rd3D1s1rS+5mnl&c#+%T%PIJ4E=n_^ zkCgtty}%mpc-2!|(-cbr2#v7A`j#r`ub$=-SHmJWL|>;#0|p`;Q3(-*kOVfZD9h_F zrr?)GA+P=L#XlV10FSKgajTmm&bif#)B0DkB!m!*C6&eLdIFaeDc^o2KU@fjk8j3m z)4KFcTN_`$v>$SgpDqi1_-KTF7_7!6>IJCIEw1-+ZAY7|Ve>1NPJvsVjox z{3rnMRTz&?nvYNKOgga|lZbIs!v-WPv!ANnxJ&GOL|T>3Cc$fiOF~C|c4LPI1)I&Q#QuyL~{yKZVad zNEwT}pfsYAh9z|H42-A?MJ7wqbw9GL*txo@&A?F|-hQFDTV@3Qm|Nv3Un)3!n~OZ) z3qi>(oy8gR1;uD|Dohq5(j_g9YDoBp0s5vY z_*#mzs@cPoz}k&$wlf{KgO)${Gw|yj6Z%C%3FrgPHc11);Gk)^2mr!sBlc`ZkRUHZ@)}O^F_0`q5u!NBoX7Vj*FM_mhR}`k?7krrVrrkx# z%yyYC3R-DSixPO*I^U9A+vmxKrD#x_3@^8tf+67tnzFweqOT?n!IW0r0Ra%q3K1DX zJ6&T(WObVcM$43fqC>2A7AbfQlHm*4W(F3%&TV432IL>Y=pLkf>QI`JmAS*UE(wJB z`Fy^=caUIgJ~VsitNCWj5vU6eCciTv#ScikmSfBs@H%VwXCV5HO=M_x^NN@0T~WGg zgLJv7Ay7p^G%rdqgkELg+7^ljB~8L@I&Ki6Jw(yj!AG)&KZ4O`DP5H*4NF4J@aDNu zM7Zm>43H2>1b}9T)E#G~np)pkQa&rC|1@^Rc!WumYQq`&XEAyKq)Ub!td&yU;q`l; zc&>QiDYJ8)EP_BHwmjp8GSe*CeR^k8JP!|*C)y=s8CJetW)1%sMxSq=o9ef7c&=_d z_lF2fk)8A8$@=P3R@7|`q{{E4I4MO_BHy1S`-xgoAce<(6lYLga&~_TqgOz>Fr~ub zxv*r`_;o!bVeV35+zDVvgrp!rm_nERaTaTjx3MAGx6~79^;Kv0$1wUr)6eG)10}H8 zgB$aJRriLKfKP%C07Px?q85&ozjKEr1C4icbeq@Jn^;~OdiX0qinN1}J4}Z+S0;PG zXW_}=L8OtBTPkDo{tik(2fR%kTrPeGkzuB!fb^=f`-2#LnPwa)J}$>w#-ii;(g7uG zLwdOpktX3#2s+&7cM6g5Zst3yH*$^9RXylWLh?zFYE!Bmp5R*If`9}f)XsLC$D=3T z#3Fqr`#3sC-rXg!fR{k>=9CZ$Q!qP>w$ARK3`j3q(n}7{qXdEg#7IJPFrSaE2=eUN z9kq6}V@S7P^mbLlqN)smLkOvOmzqgM$`F!C7=4k_WlaeHDwF`Ab(?C(@xC;6Xl^{T zxgB^*a{ewKl>jTBSEB?e7`bRv?xy%>lZDTKwCO9QuvDUi*lp){Oocw9a;ZIa>+J+K z`CS0%Vyvb#qG&}}uY>(-vhR;s(#GMvf>OtbT076xPO<~75_3B#myASt0KjZbTYNTF z6qoS)l^A`U<8X}-n;ntQaoFF9&385H|{>G%?gCOk|n!bS2 zSZ&9`hAd>4mxK77ZvvHK7uL1}m>geaLW+=83iu#K|7jq-gi>6p%#ISIRs=gks`+}kc2~s9khNAx{j6OJF z{t`+?w!K<2YO#R=A!|oY#H$*D0cR-bZ*p@OL{a`DF#4zrzz0yWF3$^rOR%B}q8&&j zN)S*<`0R~nyVm+I!sx?V4Ie|P*fW~#2wXI>dlZ8lUOD3o9*Y{E3=q0$=2G(Kufgcc zAQdR(z@!SR^_vH1w+>kVDw2P={uC7F=d#x_yjYOOORqtoq*YAbEzru z_hR%}x$iwn8)J$vd3X{+uYeTgkul~IMe%2AMt{NV#J7V~T)fKV1&BNn)w_#$bcIqz zq;zrn63`_>=pXN+e_A;I7A0c|h2M){eE_3i2N|j2ZI{peM_}}Y?FJVpy$aI>KAWX+ zcni~O7PNur@5JaUD<}kBGo~up+h9{bv|SEf@kc7S?jX7$L;ek%p|9)-xkBk0rUcc? z2&Ds4m9imhGP&YZ^w*ow7eRUnr3;uUbW%8y{guNjpwf)3aeHo<98q3<} zMKh5NbT4c^$2vGA)49my?le{Z9-8r&LApVygek$Xx1pQG=Np51Ay2rIO#6Ev`VNpj r2U9ki{Qeb?3Y0Fec^RU=3M2Tx%sH!yvcPJT00000NkvXXu0mjfUe^GM literal 0 HcmV?d00001 diff --git a/src/assets/background/paper.png b/src/assets/background/paper.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b18ef4b4117d99006ddc0ba003ed00e289062b GIT binary patch literal 30144 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 literal 0 HcmV?d00001 diff --git a/src/components/Background.astro b/src/components/Background.astro new file mode 100644 index 0000000..38792f8 --- /dev/null +++ b/src/components/Background.astro @@ -0,0 +1,260 @@ +--- +// The page background, fixed behind every page's frame: the paper texture, and the corner pattern (rings of dots +// around the top-right corner) at 6%. scripts/make-background.py prepares both: the paper as a tile, the pattern's +// ink as an image the script below reads each dot's size from. No shader library, no WebGL. +// +// The pattern alone makes way, so the paper keeps going: around the topic map (TopicMap.astro), clear inside the +// ellipse that fits the map's box and back to full strength at 1.55 times that size; on a page with the centred 720px +// text column (textColumn), behind a band as wide as the column, fading out between 16px and 112px on each side. +interface Props { + /** The page has the centred 720px text column of articles: the pattern is cleared behind it. */ + textColumn?: boolean; +} + +const { textColumn = false } = Astro.props; +--- + + + + + + diff --git a/src/components/Intro.astro b/src/components/Intro.astro new file mode 100644 index 0000000..39b04b8 --- /dev/null +++ b/src/components/Intro.astro @@ -0,0 +1,104 @@ +--- +// The intro of Home and About: the text on the left at 500px, the topic map on the right, from 480px to 636px wide. +// The map is taller than the text and spills 84px above and below it without making the intro taller. Below 1120px +// the map goes under the text, up to 560px wide. The columns are top-aligned, so the label, the title and the map sit +// at the same place on both pages whatever the length of the text. +// +// +// Customer success,
Product,
AI agents.
+// I'm Josselin Perrus, product manager turned builder… +//
…
+//
+// +// - label: the small line above the title. +// - slot "title": the title, inside the

. A in it is in the accent colour, for the full stop. +// - default slot: the text under the title, in muted grey, up to 52 characters wide. +// - slot "after": anything under the text, such as buttons and links. It comes 18px under the text. +// - links, mapLabel: passed to TopicMap, to make the orange dots links and to name the map for screen readers. +import TopicMap, { type Topic } from './TopicMap.astro'; + +interface Props { + label: string; + links?: Partial>; + mapLabel?: string; +} + +const { label, links, mapLabel } = Astro.props; +--- + +
+
+

{label}

+

+
+ +
+
+ +
+
+ + diff --git a/src/components/TopicMap.astro b/src/components/TopicMap.astro new file mode 100644 index 0000000..41bf929 --- /dev/null +++ b/src/components/TopicMap.astro @@ -0,0 +1,314 @@ +--- +// The topic map, "Best of three": three islands in grey halftone dots, named in grey capitals, with an orange dot +// for each of the site's three topics. scripts/make-background.py turns the land (src/data/topic-map.json) into +// map.png; the script below lays the dots 7.8px apart over the map's box, whatever its size, and reads each dot's size +// from that image, as the prototype's shader did. No shader library, no WebGL. +// +// The orange dots are the map's interface (see the PR for #30, and Intro.astro): +// - Each dot has its topic in data-topic: customer-success, product or ai-agents. +// - Clicking one sends a "topicmap:pick" event from the element. It bubbles, and event.detail.topic is the +// dot's topic. It can be cancelled: calling preventDefault() stops a link dot from following its link. +// - With `links`, the dots are links, for example to the matching part of a page; otherwise they are buttons. +// - Setting data-picked="" on the element marks that dot as picked and dims the others; removing it +// clears the pick. Button dots get aria-pressed to match. +import spec from '../data/topic-map.json'; +import mapUrl from '../assets/background/map.png?url'; + +export type Topic = 'customer-success' | 'product' | 'ai-agents'; + +interface Props { + /** Turns the dots into links, for example { 'customer-success': '#customer-success' }. */ + links?: Partial>; + /** What screen readers announce for the map. */ + label?: string; +} + +const { links = {}, label = 'Map of the writing: Customer success, Product and AI agents' } = Astro.props; +const [boxW, boxH] = spec.box; + +// "Best of three" runs past the right edge of its box, so the prototype draws it 7% smaller about the centre of its +// land. Labels and dots move with it (make-background.py does the same to the land). +const { scale, centre } = spec.fit; +const place = ([x, y]: number[]) => { + const at = (v: number, c: number) => ((0.5 + (v - c) * scale) * 100).toFixed(2) + '%'; + return `left: ${at(x, centre[0])}; top: ${at(y, centre[1])}`; +}; +const topics = spec.topics.map((t) => ({ ...t, id: t.id as Topic, href: links[t.id as Topic] })); +--- + + + + +
+ {topics.map((t) => {t.area})} + {topics.map((t) => + t.href ? ( + + {t.name} + + ) : ( + + ), + )} +
+
+ + + + diff --git a/src/data/topic-map.json b/src/data/topic-map.json new file mode 100644 index 0000000..74418e8 --- /dev/null +++ b/src/data/topic-map.json @@ -0,0 +1,83 @@ +{ + "box": [420, 300], + "fit": { "scale": 0.927, "centre": [0.546, 0.533] }, + "topics": [ + {"id": "customer-success", "name": "Customer success", "area": "IDENTIFY THE VALUE", "areaAt": [0.2, 0.15], "dotAt": [0.2, 0.25], "nameSide": "right"}, + {"id": "product", "name": "Product", "area": "DECIDE WHAT TO BUILD", "areaAt": [0.45, 0.91], "dotAt": [0.45, 0.81], "nameSide": "right"}, + {"id": "ai-agents", "name": "AI agents", "area": "SOFTWARE FACTORY", "areaAt": [0.85, 0.33], "dotAt": [0.85, 0.44], "nameSide": "left"} + ], + "patches": [ + [0.2, 0.25, 0.12, 0.72], + [0.3, 0.207, 0.087, 0.3], + [0.131, 0.213, 0.076, 0.307], + [0.23, 0.315, 0.067, 0.353], + [0.191, 0.242, 0.04, 0.45], + [0.306, 0.258, 0.035, 0.749], + [0.226, 0.337, 0.033, 0.462], + [0.085, 0.304, 0.029, 0.384], + [0.059, 0.289, 0.054, -0.7], + [0.226, 0.383, 0.037, 0.782], + [0.239, 0.462, 0.043, 0.487], + [0.255, 0.527, 0.042, 0.829], + [0.269, 0.582, 0.044, 0.915], + [0.303, 0.655, 0.034, 0.624], + [0.329, 0.711, 0.045, 0.647], + [0.45, 0.81, 0.11, 0.82], + [0.44, 0.857, 0.074, 0.396], + [0.389, 0.83, 0.076, 0.453], + [0.359, 0.836, 0.061, 0.385], + [0.459, 0.805, 0.04, 0.6], + [0.519, 0.776, 0.032, 0.767], + [0.557, 0.749, 0.024, 0.522], + [0.462, 0.666, 0.022, 0.676], + [0.561, 0.671, 0.021, 0.471], + [0.379, 0.831, 0.034, 0.451], + [0.52, 0.63, 0.042, 0.95], + [0.545, 0.54, 0.036, 0.8], + [0.565, 0.46, 0.028, 0.62], + [0.58, 0.4, 0.016, 0.9], + [0.566, 0.726, 0.037, 0.615], + [0.592, 0.684, 0.034, 0.665], + [0.62, 0.663, 0.043, 0.352], + [0.673, 0.63, 0.038, 0.63], + [0.716, 0.594, 0.034, 0.529], + [0.85, 0.44, 0.13, 0.8], + [0.967, 0.431, 0.092, 0.343], + [0.761, 0.462, 0.075, 0.397], + [0.817, 0.518, 0.088, 0.429], + [0.856, 0.446, 0.04, 0.62], + [0.786, 0.325, 0.038, 0.63], + [0.925, 0.229, 0.031, 0.717], + [0.858, 0.275, 0.025, 0.476], + [0.863, 0.515, 0.036, 0.597], + [0.939, 0.474, 0.027, 0.332], + [0.333, 0.253, 0.039, 0.39], + [0.385, 0.264, 0.031, 0.368], + [0.464, 0.272, 0.028, 0.33], + [0.506, 0.259, 0.03, 0.361], + [0.563, 0.262, 0.036, 0.383], + [0.594, 0.282, 0.036, 0.335], + [0.651, 0.287, 0.027, 0.341], + [0.691, 0.317, 0.035, 0.339], + [0.374, 0.351, 0.039, 0.324], + [0.406, 0.383, 0.035, 0.305], + [0.468, 0.387, 0.037, 0.286], + [0.528, 0.401, 0.034, 0.277], + [0.559, 0.417, 0.033, 0.328], + [0.624, 0.411, 0.027, 0.273], + [0.684, 0.421, 0.039, 0.343], + [0.565, 0.352, 0.012, 0.725], + [0.602, 0.364, 0.009, 0.764], + [0.463, 0.32, 0.016, 1.286], + [0.634, 0.37, 0.01, 0.677], + [0.518, 0.342, 0.01, 0.881], + [0.454, 0.32, 0.01, 0.699], + [0.681, 0.364, 0.012, 0.768], + [0.419, 0.286, 0.013, 0.643], + [0.435, 0.314, 0.021, 1.158], + [0.372, 0.274, 0.01, 0.81], + [0.05, 0.55, 0.018, 0.895], + [0.94, 0.78, 0.021, 0.978], + [0.3, 0.94, 0.018, 0.966] + ] +} diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 21f7a94..fbbefc4 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -1,15 +1,30 @@ --- import '../styles/global.css'; import '../styles/legacy.css'; +import Background from '../components/Background.astro'; import Frame from '../components/Frame.astro'; import monoFont from '../fonts/dejavu-sans-mono.woff2?url'; +interface Props { + title?: string; + description?: string; + ogImage?: string; + type?: 'website' | 'article'; + /** The page has the articles' centred 720px text column, which the background's corner pattern makes way for. + Articles have it by default. */ + textColumn?: boolean; + /** Ask search engines not to index the page. */ + noindex?: boolean; +} + // Accept props for meta tags const { title = 'meaningfool', description = 'Personal site of Josselin Perrus, product manager in Paris', ogImage = new URL('/og-default.jpg', Astro.site).toString(), - type = 'website' + type = 'website', + textColumn = type === 'article', + noindex = false, } = Astro.props; // Use Astro's built-in URL handling for canonical URLs @@ -26,6 +41,7 @@ const canonical = canonicalURL.toString(); {title} + {noindex && } @@ -52,6 +68,7 @@ const canonical = canonicalURL.toString(); + diff --git a/src/pages/404.astro b/src/pages/404.astro index 6e3d663..4568f14 100644 --- a/src/pages/404.astro +++ b/src/pages/404.astro @@ -1,5 +1,6 @@ --- import '../styles/global.css'; +import Background from '../components/Background.astro'; import Frame from '../components/Frame.astro'; import NotFound from '../components/NotFound.astro'; import monoFont from '../fonts/dejavu-sans-mono.woff2?url'; @@ -17,6 +18,7 @@ import monoFont from '../fonts/dejavu-sans-mono.woff2?url'; + diff --git a/src/pages/documents.astro b/src/pages/documents.astro index beaa3ed..afe778c 100644 --- a/src/pages/documents.astro +++ b/src/pages/documents.astro @@ -1,5 +1,6 @@ --- import '../styles/tokens.css'; +import Background from '../components/Background.astro'; import Frame from '../components/Frame.astro'; import NotFound from '../components/NotFound.astro'; --- @@ -26,7 +27,8 @@ import NotFound from '../components/NotFound.astro'; -
+ {/* The not-found view looks like /404.html, background included. The portfolio view keeps its plain page. */} +