PageSourceSearch

https://rreusser.github.io/notebooks/

html rreusser.github.io collected 2026-10-03 09:52:01 UTC 184,625 bytes, 4,225 lines download raw bytes

1<!doctype html><html lang="en" data-notebook-theme="air"><head>
2  <meta charset="utf-8">
3  <meta name="viewport" content="width=device-width, initial-scale=1.0">
4  
4<script>
5    (function() {
6      const DARK_THEMES = new Set(['ink', 'midnight', 'near-midnight', 'deep-space', 'ocean-floor', 'coffee', 'slate']);
7      const html = document.documentElement;
8      const notebookDark = DARK_THEMES.has(html.dataset.notebookTheme);
9      const saved = localStorage.getItem('theme');
10      const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
11      const wantDark = saved === 'dark' || (!saved && prefersDark);
12      if (wantDark && !notebookDark) html.dataset.dark = '';
13      else if (!wantDark && notebookDark) html.dataset.light = '';
14      html.classList.toggle('theme-is-dark', wantDark);
15    })();
16  </script>
16
17  <title>Interactive Notebooks on Graphics, Math &amp; Computing | ricky reusser</title>
18  <meta name="author" content="Ricky Reusser">
19  <meta property="og:site_name" content="Ricky Reusser's Notebooks">
20  <meta property="og:type" content="website">
21  <meta property="article:author" content="Ricky Reusser">
22  
23  <meta name="twitter:card" content="summary">
24  <meta name="twitter:title" content="Interactive Notebooks on Graphics, Math &amp; Computing">
25  <meta property="og:title" content="Interactive Notebooks on Graphics, Math &amp; Computing">
26  <meta name="twitter:description" content="Interactive notebooks on graphics, math, and creative coding by Ricky Reusser.">
27  <meta name="description" content="Interactive notebooks on graphics, math, and creative coding by Ricky Reusser.">
28  <meta property="og:description" content="Interactive notebooks on graphics, math, and creative coding by Ricky Reusser.">
29  <meta name="theme-color" media="(prefers-color-scheme: light)" content="#ca4747">
30  <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#ca4747">
31  <link rel="icon" type="image/svg+xml" href="/assets/favicon-BDxUaiJg.svg">
32  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
33  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
34  <link rel="canonical" href="https://rreusser.github.io/notebooks/">
35  <meta property="og:url" content="https://rreusser.github.io/notebooks/">
36  <link rel="alternate" type="application/rss+xml" title="Ricky Reusser's Notebooks" href="/feed.xml">
37  <meta name="google-site-verification" content="KXGAL2Z3EABwICzkx8zUwRndwyFy1xusXRNM4TiCSWA">
38  
38<script type="application/ld+json">{
39  "@context": "https://schema.org",
40  "@type": "CollectionPage",
41  "name": "Interactive Notebooks on Graphics, Math & Computing",
42  "url": "https://rreusser.github.io/notebooks/",
43  "description": "Interactive notebooks on graphics, math, and creative coding by Ricky Reusser.",
44  "author": {
45    "@id": "https://rreusser.github.io/#person"
46  },
47  "mainEntity": {
48    "@type": "ItemList",
49    "itemListElement": [
50      {
51        "@type": "ListItem",
52        "position": 1,
53        "url": "https://rreusser.github.io/notebooks/intentional-anonymity/",
54        "name": "Intentional Anonymity"
55      },
56      {
57        "@type": "ListItem",
58        "position": 2,
59        "url": "https://rreusser.github.io/notebooks/time-until-totality/",
60        "name": "Time Until Totality"
61      },
62      {
63        "@type": "ListItem",
64        "position": 3,
65        "url": "https://rreusser.github.io/notebooks/smooth-life/",
66        "name": "SmoothLife"
67      },
68      {
69        "@type": "ListItem",
70        "position": 4,
71        "url": "https://rreusser.github.io/notebooks/mobius-strip/",
72        "name": "An Elastic Möbius Strip"
73      },
74      {
75        "@type": "ListItem",
76        "position": 5,
77        "url": "https://rreusser.github.io/notebooks/zooming-aperiodic-monotile/",
78        "name": "Zooming Aperiodic Monotile"
79      },
80      {
81        "@type": "ListItem",
82        "position": 6,
83        "url": "https://rreusser.github.io/notebooks/aperiodic-monotile/",
84        "name": "Rendering the Aperiodic Monotile"
85      },
86      {
87        "@type": "ListItem",
88        "position": 7,
89        "url": "https://rreusser.github.io/notebooks/line-sweep-terrain-lighting/",
90        "name": "Line-Sweep Terrain Lighting"
91      },
92      {
93        "@type": "ListItem",
94        "position": 8,
95        "url": "https://rreusser.github.io/notebooks/costa-surface/",
96        "name": "Costa's Minimal Surface"
97      },
98      {
99        "@type": "ListItem",
100        "position": 9,
101        "url": "https://rreusser.github.io/notebooks/kerr-geodesics/",
102        "name": "Geodesics in Kerr Spacetime"
103      },
104      {
105        "@type": "ListItem",
106        "position": 10,
107        "url": "https://rreusser.github.io/notebooks/rewriting-my-website-in-observable-notebook-kit/",
108        "name": "Rewriting My Website in Observable Notebook Kit"
109      },
110      {
111        "@type": "ListItem",
112        "position": 11,
113        "url": "https://rreusser.github.io/notebooks/boys-surface/",
114        "name": "Boy's Surface"
115      },
116      {
117        "@type": "ListItem",
118        "position": 12,
119        "url": "https://rreusser.github.io/notebooks/denali/",
120        "name": "Denali Terrain"
121      },
122      {
123        "@type": "ListItem",
124        "position": 13,
125        "url": "https://rreusser.github.io/notebooks/visualizing-sloan-digital-sky-survey-data/",
126        "name": "Visualizing Sloan Digital Sky Survey Data"
127      },
128      {
129        "@type": "ListItem",
130        "position": 14,
131        "url": "https://rreusser.github.io/notebooks/hess-smith-panel-solver/",
132        "name": "Hess-Smith Panel Method"
133      },
134      {
135        "@type": "ListItem",
136        "position": 15,
137        "url": "https://rreusser.github.io/notebooks/multiscale-turing-patterns/",
138        "name": "Multi-Scale Turing Patterns in WebGPU"
139      },
140      {
141        "@type": "ListItem",
142        "position": 16,
143        "url": "https://rreusser.github.io/notebooks/strange-attractors-in-webgpu/",
144        "name": "Strange Attractors in WebGPU"
145      },
146      {
147        "@type": "ListItem",
148        "position": 17,
149        "url": "https://rreusser.github.io/notebooks/webgpu-lines/",
150        "name": "WebGPU Instanced Lines"
151      },
152      {
153        "@type": "ListItem",
154        "position": 18,
155        "url": "https://rreusser.github.io/notebooks/plot-with-zoom/",
156        "name": "Zoomable Multi-Layer Plots in Notebook Kit"
157      },
158      {
159        "@type": "ListItem",
160        "position": 19,
161        "url": "https://rreusser.github.io/notebooks/simulating-the-2d-kuramoto-sivashinsky-equation-in-webgpu/",
162        "name": "Simulating the 2D Kuramoto-Sivashinsky Equation in WebGPU"
163      },
164      {
165        "@type": "ListItem",
166        "position": 20,
167        "url": "https://rreusser.github.io/notebooks/perfectly-matched-layers-for-the-wave-equation/",
168        "name": "Perfectly Matched Layers for the Wave Equation"
169      },
170      {
171        "@type": "ListItem",
172        "position": 21,
173        "url": "https://rreusser.github.io/notebooks/reflecting-on-two-years-of-yoga/",
174        "name": "Reflecting on Two Years of Yoga"
175      },
176      {
177        "@type": "ListItem",
178        "position": 22,
179        "url": "https://rreusser.github.io/notebooks/of-noise-and-neighbors/",
180        "name": "Of Noise and Neighbors"
181      },
182      {
183        "@type": "ListItem",
184        "position": 23,
185        "url": "https://rreusser.github.io/notebooks/hello-observable-notebooks-2/",
186        "name": "Hello, Observable Notebooks 2.0!"
187      },
188      {
189        "@type": "ListItem",
190        "position": 24,
191        "url": "https://rreusser.github.io/notebooks/clifford-and-de-jong-attractors/",
192        "name": "Clifford and de Jong Attractors"
193      },
194      {
195        "@type": "ListItem",
196        "position": 25,
197        "url": "https://rreusser.github.io/notebooks/chaotic-magnetic-pendulum/",
198        "name": "Chaotic Magnetic Pendulum"
199      },
200      {
201        "@type": "ListItem",
202        "position": 26,
203        "url": "https://rreusser.github.io/notebooks/spring-training/",
204        "name": "Spring Training on the Treadmill"
205      },
206      {
207        "@type": "ListItem",
208        "position": 27,
209        "url": "https://rreusser.github.io/notebooks/speed-climbing-world-record-progression/",
210        "name": "Speed Climbing World Record Progression"
211      },
212      {
213        "@type": "ListItem",
214        "position": 28,
215        "url": "https://rreusser.github.io/notebooks/sliced-optimal-transport/",
216        "name": "Sliced Optimal Transport"
217      },
218      {
219        "@type": "ListItem",
220        "position": 29,
221        "url": "https://rreusser.github.io/notebooks/shanks-transformation/",
222        "name": "Series Acceleration with Shanks Transformation"
223      },
224      {
225        "@type": "ListItem",
226        "position": 30,
227        "url": "https://rreusser.github.io/notebooks/cubic-basis-vs-hermite-interpolation/",
228        "name": "Cubic basis vs. Hermite interpolation"
229      },
230      {
231        "@type": "ListItem",
232        "position": 31,
233        "url": "https://rreusser.github.io/notebooks/bicubic-texture-interpolation-using-linear-filtering/",
234        "name": "Bicubic Texture Interpolation using Linear Filtering"
235      },
236      {
237        "@type": "ListItem",
238        "position": 32,
239        "url": "https://rreusser.github.io/notebooks/knocking-down-the-gates-with-jacobi/",
240        "name": "Knocking Down the Gates with our Friend Jacobi"
241      },
242      {
243        "@type": "ListItem",
244        "position": 33,
245        "url": "https://rreusser.github.io/notebooks/night-and-day/",
246        "name": "Night and Day"
247      },
248      {
249        "@type": "ListItem",
250        "position": 34,
251        "url": "https://rreusser.github.io/notebooks/fast-generalized-winding-numbers-in-2d/",
252        "name": "Fast Generalized Winding Numbers in 2D"
253      },
254      {
255        "@type": "ListItem",
256        "position": 35,
257        "url": "https://rreusser.github.io/notebooks/pure-css-periodic-three-body-orbits/",
258        "name": "HTML+CSS Periodic Three-Body Orbits"
259      },
260      {
261        "@type": "ListItem",
262        "position": 36,
263        "url": "https://rreusser.github.io/notebooks/lawsons-klein-bottle/",
264        "name": "Lawson's Klein Bottle"
265      },
266      {
267        "@type": "ListItem",
268        "position": 37,
269        "url": "https://rreusser.github.io/notebooks/computing-pi-with-the-bailey-borwein-plouffe-formula/",
270        "name": "Computing π with the Bailey-Borwein-Plouffe Formula"
271      },
272      {
273        "@type": "ListItem",
274        "position": 38,
275        "url": "https://rreusser.github.io/notebooks/double-pendulum-map/",
276        "name": "The Double Pendulum Map"
277      },
278      {
279        "@type": "ListItem",
280        "position": 39,
281        "url": "https://rreusser.github.io/notebooks/malkus-waterwheel/",
282        "name": "Malkus Waterwheel"
283      },
284      {
285        "@type": "ListItem",
286        "position": 40,
287        "url": "https://rreusser.github.io/notebooks/point-cloud-point-opacity/",
288        "name": "Selecting the Right Opacity for 2D Point Clouds"
289      },
290      {
291        "@type": "ListItem",
292        "position": 41,
293        "url": "https://rreusser.github.io/notebooks/adaptive-contouring-in-fragment-shaders/",
294        "name": "Adaptive Contouring in Fragment Shaders"
295      },
296      {
297        "@type": "ListItem",
298        "position": 42,
299        "url": "https://rreusser.github.io/notebooks/webgpu-voronoi-diagrams-using-the-jump-flooding-algorithm/",
300        "name": "WebGPU Voronoi Diagrams using the Jump Flooding Algorithm"
301      },
302      {
303        "@type": "ListItem",
304        "position": 43,
305        "url": "https://rreusser.github.io/notebooks/sphere-eversion/",
306        "name": "Sphere Eversion"
307      },
308      {
309        "@type": "ListItem",
310        "position": 44,
311        "url": "https://rreusser.github.io/notebooks/transparency-for-3d-surfaces/",
312        "name": "Transparency for 3D Surfaces"
313      },
314      {
315        "@type": "ListItem",
316        "position": 45,
317        "url": "https://rreusser.github.io/notebooks/charmin-nanotubes-and-toiletpaperfullerenes/",
318        "name": "Toiletpaperfullerenes and Charmin Nanotubes"
319      },
320      {
321        "@type": "ListItem",
322        "position": 46,
323        "url": "https://rreusser.github.io/notebooks/particle-mesh-gravity/",
324        "name": "Particle-Mesh Gravity in WebGPU"
325      },
326      {
327        "@type": "ListItem",
328        "position": 47,
329        "url": "https://rreusser.github.io/notebooks/periodic-planar-three-body-orbits/",
330        "name": "Periodic Planar Three-Body Orbits"
331      },
332      {
333        "@type": "ListItem",
334        "position": 48,
335        "url": "https://rreusser.github.io/notebooks/multi-scale-turing-pattern-gallery-2/",
336        "name": "Multi-Scale Turing Pattern Gallery 2"
337      },
338      {
339        "@type": "ListItem",
340        "position": 49,
341        "url": "https://rreusser.github.io/notebooks/multi-scale-turing-pattern-gallery-1/",
342        "name": "Multi-Scale Turing Pattern Gallery 1"
343      },
344      {
345        "@type": "ListItem",
346        "position": 50,
347        "url": "https://rreusser.github.io/notebooks/aligning-3d-scans/",
348        "name": "Aligning 3D Scans"
349      },
350      {
351        "@type": "ListItem",
352        "position": 51,
353        "url": "https://rreusser.github.io/notebooks/things-i-learned-the-hard-way-using-react-native/",
354        "name": "Things I Learned the Hard Way Using React Native"
355      },
356      {
357        "@type": "ListItem",
358        "position": 52,
359        "url": "https://rreusser.github.io/notebooks/a-series-of-unfortunate-things-i-programmed-one-time/",
360        "name": "A Series of Unfortunate Things I Programmed One Time"
361      }
362    ]
363  }
364}</script>
364
365  <style type="text/css">/* Copyright 2025 Observable, Inc. */
366
367:root {
368  --serif: "Source Serif 4 Variable", ui-serif, serif;
369  --sans-serif: "Inter Variable", ui-sans-serif, sans-serif;
370  --monospace: "Spline Sans Mono Variable", Menlo, Consolas, monospace;
371  --monospace-font: 14px/1.5 var(--monospace);
372  --max-width: calc(1024px - 4 * 16px); /* max-w-5xl p-4 */
373}
374
375html {
376  font: 17px/1.5 var(--serif);
377  -webkit-text-size-adjust: 100%;
378  -webkit-font-smoothing: antialiased;
379  -moz-osx-font-smoothing: grayscale;
380}
381
382body {
383  background: var(--theme-background);
384  color: var(--theme-foreground);
385  margin: 16px 0;
386  padding: 16px 24px;
387}
388
389main {
390  margin: auto;
391  max-width: var(--max-width);
392}
393
394h1,
395h2,
396h3,
397h4,
398h5,
399h6 {
400  color: var(--theme-foreground-alt);
401  font-weight: 700;
402  line-height: 1.15;
403  margin-top: 0;
404  margin-bottom: 0.25rem;
405  text-wrap: balance;
406}
407
408h2 + p,
409h3 + p,
410h4 + p,
411h2 + table,
412h3 + table,
413h4 + table {
414  margin-top: 0;
415}
416
417.observablehq:first-of-type h1 + h2 {
418  color: var(--theme-foreground);
419  font-size: 20px;
420  font-style: italic;
421  font-weight: normal;
422  margin-bottom: 1rem; /* see h2 ~ p */
423}
424
425a[href] {
426  color: var(--theme-foreground-focus);
427  text-decoration: none;
428}
429
430a[href]:hover,
431a[href]:focus {
432  text-decoration: underline;
433}
434
435pre,
436code,
437tt {
438  font-family: var(--monospace);
439  font-size: 82.35294117%; /* from 17px to 14px */
440}
441
442pre code,
443figcaption code {
444  font-size: inherit;
445}
446
447pre[data-language] {
448  position: relative;
449}
450
451pre[data-language]::before {
452  content: attr(data-language);
453  position: sticky;
454  top: 0;
455  left: 0;
456  height: 0;
457  display: block;
458  text-align: right;
459  margin-right: -4px;
460  pointer-events: none;
461  font-size: 12px;
462  line-height: 21px;
463  color: var(--theme-foreground-muted);
464}
465
466h1 code,
467h2 code,
468h3 code,
469h4 code,
470h5 code,
471h6 code {
472  font-size: 88.235294117%; /* from 17px to 15px */
473}
474
475h2[id] a[href],
476h3[id] a[href] {
477  color: inherit;
478}
479
480pre {
481  line-height: 1.5;
482}
483
484img {
485  max-width: 100%;
486}
487
488p,
489table,
490figure,
491figcaption,
492h1,
493h2,
494h3,
495h4,
496h5,
497h6,
498.katex-display {
499  max-width: 640px;
500}
501
502blockquote,
503ol,
504ul {
505  max-width: 600px;
506}
507
508blockquote {
509  margin: 1rem 1.5rem;
510}
511
512ul,
513ol {
514  padding-left: 28px;
515}
516
517hr {
518  height: 1px;
519  margin: 1rem 0;
520  padding: 1rem 0;
521  border: none;
522  background: no-repeat center/100% 1px
523    linear-gradient(to right, var(--theme-foreground-faintest), var(--theme-foreground-faintest));
524}
525
526pre {
527  background-color: var(--theme-background-alt);
528  border-radius: 4px;
529  margin: 1rem -1rem;
530  min-height: 1.5em;
531  padding: 4px 1rem;
532  overflow-x: auto;
533  overscroll-behavior-x: none;
534  box-sizing: border-box;
535}
536
537pre > code:only-child {
538  display: block;
539  width: fit-content;
540}
541
542input:not([type]),
543input[type="email"],
544input[type="number"],
545input[type="password"],
546input[type="range"],
547input[type="search"],
548input[type="tel"],
549input[type="text"],
550input[type="url"] {
551  width: 240px;
552}
553
554input,
555canvas,
556button {
557  vertical-align: middle;
558}
559
560button,
561input,
562textarea {
563  accent-color: var(--theme-foreground-focus);
564}
565
566table {
567  width: 100%;
568  border-collapse: collapse;
569  font: 13px/1.2 var(--sans-serif);
570}
571
572table pre,
573table code,
574table tt {
575  font-size: inherit;
576  line-height: inherit;
577}
578
579th > pre:only-child,
580td > pre:only-child {
581  margin: 0;
582  padding: 0;
583}
584
585th {
586  color: var(--theme-foreground);
587  text-align: left;
588  vertical-align: bottom;
589}
590
591td {
592  color: var(--theme-foreground-alt);
593  vertical-align: top;
594}
595
596th,
597td {
598  padding: 3px 6.5px 3px 0;
599}
600
601th:last-child,
602td:last-child {
603  padding-right: 0;
604}
605
606tr:not(:last-child) {
607  border-bottom: solid 1px var(--theme-foreground-faintest);
608}
609
610thead tr {
611  border-bottom: solid 1px var(--theme-foreground-fainter);
612}
613
614figure,
615table {
616  margin: 1rem 0;
617}
618
619figure img {
620  max-width: 100%;
621}
622
623figure > h2,
624figure > h3 {
625  font-family: var(--sans-serif);
626}
627
628figure > h2 {
629  font-size: 20px;
630}
631
632figure > h3 {
633  font-size: 16px;
634  font-weight: normal;
635}
636
637figcaption {
638  font: small var(--sans-serif);
639  color: var(--theme-foreground-muted);
640}
641
642.observablehq--collapsed,
643.observablehq--expanded.observablehq--inspect a {
644  cursor: pointer;
645}
646
647.observablehq--caret {
648  margin-right: 4px;
649  vertical-align: baseline;
650}
651
652.observablehq--field {
653  text-indent: -1rem;
654  margin-left: 1rem;
655}
656
657.observablehq--inspect {
658  font: var(--monospace-font);
659  overflow-x: auto;
660  white-space: pre;
661  display: block;
662  padding: 2px 0;
663}
664
665.observablehq--inspect.observablehq--import {
666  white-space: normal;
667}
668
669.observablehq--inspect::-webkit-scrollbar {
670  display: none;
671}
672
673.observablehq--error .observablehq--inspect {
674  word-break: break-all;
675  white-space: pre-wrap;
676}
677
678.observablehq--string-expand {
679  margin-left: 6px;
680  padding: 2px 6px;
681  border-radius: 2px;
682  font-size: 80%;
683  background: var(--theme-background-alt);
684  cursor: pointer;
685  vertical-align: middle;
686}
687
688.observablehq--keyword {
689  color: var(--syntax-keyword);
690}
691
692.observablehq--index,
693.observablehq--key {
694  color: var(--syntax-definition);
695}
696
697.observablehq--symbol,
698.observablehq--regexp,
699.observablehq--string {
700  color: var(--syntax-string);
701}
702
703.observablehq--null {
704  color: var(--syntax-keyword);
705}
706
707.observablehq--undefined {
708  color: var(--syntax-variable);
709}
710
711.observablehq--prototype-key {
712  color: var(--syntax-comment);
713}
714
715.observablehq--bigint,
716.observablehq--boolean,
717.observablehq--date,
718.observablehq--forbidden,
719.observablehq--number {
720  color: var(--syntax-literal);
721}
722
723.observablehq--error {
724  color: var(--theme-error);
725}
726
727.observablehq--cell {
728  position: relative;
729  margin: 17px 0;
730  min-height: 1px; /* prevent margin collapse when empty */
731}
732
733.tok-link {
734  color: var(--syntax-link);
735}
736
737.tok-strong {
738  font-weight: 600;
739}
740
741.tok-emphasis {
742  font-style: italic;
743}
744
745.tok-keyword {
746  color: var(--syntax-keyword);
747}
748
749.tok-atom {
750  color: var(--syntax-atom);
751}
752
753.tok-literal {
754  color: var(--syntax-literal);
755}
756
757.tok-string {
758  color: var(--syntax-string);
759}
760
761.tok-comment {
762  color: var(--syntax-comment);
763}
764
765.tok-invalid {
766  color: var(--syntax-invalid);
767}
768
769.tok-variable {
770  color: var(--syntax-variable);
771}
772
773.tok-definition {
774  color: var(--syntax-definition);
775}
776
777.tok-meta {
778  color: var(--syntax-meta);
779}
780
781.plot-d6a7b5 {
782  --plot-background: var(--theme-background);
783}
784
785p .plot-d6a7b5 {
786  display: inline-block;
787}
788
789.observablehq--cell:empty {
790  min-height: 0;
791}
792
793.observablehq--cell:not(:empty) + pre {
794  margin-top: -11px;
795}
796
797/* spline-sans-mono-latin-ext-wght-normal */
798
799@font-face {
800  font-family: 'Spline Sans Mono Variable';
801  font-style: normal;
802  font-display: swap;
803  font-weight: 300 700;
804  src: url(/assets/spline-sans-mono-latin-ext-wght-normal-Dh0aNLWd.woff2) format('woff2-variations');
805  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
806}
807
808/* spline-sans-mono-latin-wght-normal */
809
810@font-face {
811  font-family: 'Spline Sans Mono Variable';
812  font-style: normal;
813  font-display: swap;
814  font-weight: 300 700;
815  src: url(/assets/spline-sans-mono-latin-wght-normal-DlaB5ohX.woff2) format('woff2-variations');
816  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
817}
818
819/* spline-sans-mono-latin-ext-wght-italic */
820
821@font-face {
822  font-family: 'Spline Sans Mono Variable';
823  font-style: italic;
824  font-display: swap;
825  font-weight: 300 700;
826  src: url(/assets/spline-sans-mono-latin-ext-wght-italic-RJy045_w.woff2) format('woff2-variations');
827  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
828}
829
830/* spline-sans-mono-latin-wght-italic */
831
832@font-face {
833  font-family: 'Spline Sans Mono Variable';
834  font-style: italic;
835  font-display: swap;
836  font-weight: 300 700;
837  src: url(/assets/spline-sans-mono-latin-wght-italic-DPjO1keU.woff2) format('woff2-variations');
838  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
839}
840
841/* source-serif-4-cyrillic-ext-wght-normal */
842
843@font-face {
844  font-family: 'Source Serif 4 Variable';
845  font-style: normal;
846  font-display: swap;
847  font-weight: 200 900;
848  src: url(/assets/source-serif-4-cyrillic-ext-wght-normal-cHuGMAiY.woff2) format('woff2-variations');
849  unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
850}
851
852/* source-serif-4-cyrillic-wght-normal */
853
854@font-face {
855  font-family: 'Source Serif 4 Variable';
856  font-style: normal;
857  font-display: swap;
858  font-weight: 200 900;
859  src: url(/assets/source-serif-4-cyrillic-wght-normal-DwHjdM4S.woff2) format('woff2-variations');
860  unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
861}
862
863/* source-serif-4-greek-wght-normal */
864
865@font-face {
866  font-family: 'Source Serif 4 Variable';
867  font-style: normal;
868  font-display: swap;
869  font-weight: 200 900;
870  src: url(/assets/source-serif-4-greek-wght-normal-ece1310W.woff2) format('woff2-variations');
871  unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;
872}
873
874/* source-serif-4-vietnamese-wght-normal */
875
876@font-face {
877  font-family: 'Source Serif 4 Variable';
878  font-style: normal;
879  font-display: swap;
880  font-weight: 200 900;
881  src: url(/assets/source-serif-4-vietnamese-wght-normal-D-yuW59g.woff2) format('woff2-variations');
882  unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
883}
884
885/* source-serif-4-latin-ext-wght-normal */
886
887@font-face {
888  font-family: 'Source Serif 4 Variable';
889  font-style: normal;
890  font-display: swap;
891  font-weight: 200 900;
892  src: url(/assets/source-serif-4-latin-ext-wght-normal-CxNHBx-q.woff2) format('woff2-variations');
893  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1D
893BF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
894}
895
896/* source-serif-4-latin-wght-normal */
897
898@font-face {
899  font-family: 'Source Serif 4 Variable';
900  font-style: normal;
901  font-display: swap;
902  font-weight: 200 900;
903  src: url(/assets/source-serif-4-latin-wght-normal-D9elroTD.woff2) format('woff2-variations');
904  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
905}
906
907/* source-serif-4-cyrillic-ext-wght-italic */
908
909@font-face {
910  font-family: 'Source Serif 4 Variable';
911  font-style: italic;
912  font-display: swap;
913  font-weight: 200 900;
914  src: url(/assets/source-serif-4-cyrillic-ext-wght-italic-BXuSHrjR.woff2) format('woff2-variations');
915  unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
916}
917
918/* source-serif-4-cyrillic-wght-italic */
919
920@font-face {
921  font-family: 'Source Serif 4 Variable';
922  font-style: italic;
923  font-display: swap;
924  font-weight: 200 900;
925  src: url(/assets/source-serif-4-cyrillic-wght-italic-RLIThRd4.woff2) format('woff2-variations');
926  unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
927}
928
929/* source-serif-4-greek-wght-italic */
930
931@font-face {
932  font-family: 'Source Serif 4 Variable';
933  font-style: italic;
934  font-display: swap;
935  font-weight: 200 900;
936  src: url(/assets/source-serif-4-greek-wght-italic-F2ziEGcb.woff2) format('woff2-variations');
937  unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;
938}
939
940/* source-serif-4-vietnamese-wght-italic */
941
942@font-face {
943  font-family: 'Source Serif 4 Variable';
944  font-style: italic;
945  font-display: swap;
946  font-weight: 200 900;
947  src: url(/assets/source-serif-4-vietnamese-wght-italic-C3q834ic.woff2) format('woff2-variations');
948  unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
949}
950
951/* source-serif-4-latin-ext-wght-italic */
952
953@font-face {
954  font-family: 'Source Serif 4 Variable';
955  font-style: italic;
956  font-display: swap;
957  font-weight: 200 900;
958  src: url(/assets/source-serif-4-latin-ext-wght-italic-CpkvI5hy.woff2) format('woff2-variations');
959  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
960}
961
962/* source-serif-4-latin-wght-italic */
963
964@font-face {
965  font-family: 'Source Serif 4 Variable';
966  font-style: italic;
967  font-display: swap;
968  font-weight: 200 900;
969  src: url(/assets/source-serif-4-latin-wght-italic-D2yaqPoE.woff2) format('woff2-variations');
970  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
971}
972
973/* inter-cyrillic-ext-wght-normal */
974
975@font-face {
976  font-family: 'Inter Variable';
977  font-style: normal;
978  font-display: swap;
979  font-weight: 100 900;
980  src: url(/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2) format('woff2-variations');
981  unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
982}
983
984/* inter-cyrillic-wght-normal */
985
986@font-face {
987  font-family: 'Inter Variable';
988  font-style: normal;
989  font-display: swap;
990  font-weight: 100 900;
991  src: url(/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2) format('woff2-variations');
992  unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
993}
994
995/* inter-greek-ext-wght-normal */
996
997@font-face {
998  font-family: 'Inter Variable';
999  font-style: normal;
1000  font-display: swap;
1001  font-weight: 100 900;
1002  src: url(/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2) format('woff2-variations');
1003  unicode-range: U+1F00-1FFF;
1004}
1005
1006/* inter-greek-wght-normal */
1007
1008@font-face {
1009  font-family: 'Inter Variable';
1010  font-style: normal;
1011  font-display: swap;
1012  font-weight: 100 900;
1013  src: url(/assets/inter-greek-wght-normal-CkhJZR-_.woff2) format('woff2-variations');
1014  unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;
1015}
1016
1017/* inter-vietnamese-wght-normal */
1018
1019@font-face {
1020  font-family: 'Inter Variable';
1021  font-style: normal;
1022  font-display: swap;
1023  font-weight: 100 900;
1024  src: url(/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2) format('woff2-variations');
1025  unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
1026}
1027
1028/* inter-latin-ext-wght-normal */
1029
1030@font-face {
1031  font-family: 'Inter Variable';
1032  font-style: normal;
1033  font-display: swap;
1034  font-weight: 100 900;
1035  src: url(/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2) format('woff2-variations');
1036  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1D
1036BF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
1037}
1038
1039/* inter-latin-wght-normal */
1040
1041@font-face {
1042  font-family: 'Inter Variable';
1043  font-style: normal;
1044  font-display: swap;
1045  font-weight: 100 900;
1046  src: url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2) format('woff2-variations');
1047  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
1048}
1049
1050/* inter-cyrillic-ext-wght-italic */
1051
1052@font-face {
1053  font-family: 'Inter Variable';
1054  font-style: italic;
1055  font-display: swap;
1056  font-weight: 100 900;
1057  src: url(/assets/inter-cyrillic-ext-wght-italic-B5xAaiFk.woff2) format('woff2-variations');
1058  unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
1059}
1060
1061/* inter-cyrillic-wght-italic */
1062
1063@font-face {
1064  font-family: 'Inter Variable';
1065  font-style: italic;
1066  font-display: swap;
1067  font-weight: 100 900;
1068  src: url(/assets/inter-cyrillic-wght-italic-DzZdc28x.woff2) format('woff2-variations');
1069  unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
1070}
1071
1072/* inter-greek-ext-wght-italic */
1073
1074@font-face {
1075  font-family: 'Inter Variable';
1076  font-style: italic;
1077  font-display: swap;
1078  font-weight: 100 900;
1079  src: url(/assets/inter-greek-ext-wght-italic-DcOpz6Lw.woff2) format('woff2-variations');
1080  unicode-range: U+1F00-1FFF;
1081}
1082
1083/* inter-greek-wght-italic */
1084
1085@font-face {
1086  font-family: 'Inter Variable';
1087  font-style: italic;
1088  font-display: swap;
1089  font-weight: 100 900;
1090  src: url(/assets/inter-greek-wght-italic-CILZdfAp.woff2) format('woff2-variations');
1091  unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;
1092}
1093
1094/* inter-vietnamese-wght-italic */
1095
1096@font-face {
1097  font-family: 'Inter Variable';
1098  font-style: italic;
1099  font-display: swap;
1100  font-weight: 100 900;
1101  src: url(/assets/inter-vietnamese-wght-italic-K3WlGtc8.woff2) format('woff2-variations');
1102  unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
1103}
1104
1105/* inter-latin-ext-wght-italic */
1106
1107@font-face {
1108  font-family: 'Inter Variable';
1109  font-style: italic;
1110  font-display: swap;
1111  font-weight: 100 900;
1112  src: url(/assets/inter-latin-ext-wght-italic-0pjOp8NU.woff2) format('woff2-variations');
1113  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
1114}
1115
1116/* inter-latin-wght-italic */
1117
1118@font-face {
1119  font-family: 'Inter Variable';
1120  font-style: italic;
1121  font-display: swap;
1122  font-weight: 100 900;
1123  src: url(/assets/inter-latin-wght-italic-DpCbqKDY.woff2) format('woff2-variations');
1124  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
1125}
1126
1127/* open-sans-cyrillic-ext-300-normal */
1128
1129@font-face {
1130  font-family: 'Open Sans';
1131  font-style: normal;
1132  font-display: swap;
1133  font-weight: 300;
1134  src: url(/assets/open-sans-cyrillic-ext-300-normal-RCDFgCku.woff2) format('woff2'), url(/assets/open-sans-cyrillic-ext-300-normal-DNhGUWnd.woff) format('woff');
1135  unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
1136}
1137
1138/* open-sans-cyrillic-300-normal */
1139
1140@font-face {
1141  font-family: 'Open Sans';
1142  font-style: normal;
1143  font-display: swap;
1144  font-weight: 300;
1145  src: url(/assets/open-sans-cyrillic-300-normal-CSZZSjYT.woff2) format('woff2'), url(/assets/open-sans-cyrillic-300-normal-BUfzCPOU.woff) format('woff');
1146  unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
1147}
1148
1149/* open-sans-greek-ext-300-normal */
1150
1151@font-face {
1152  font-family: 'Open Sans';
1153  font-style: normal;
1154  font-display: swap;
1155  font-weight: 300;
1156  src: url(data:font/woff2;base64,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) format('woff2'), url(data:font/woff;base64,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) format('woff');
1157  unicode-range: U+1F00-1FFF;
1158}
1159
1160/* open-sans-greek-300-normal */
1161
1162@font-face {
1163  font-family: 'Open Sans';
1164  font-style: normal;
1165  font-display: swap;
1166  font-weight: 300;
1167  src: url(/assets/open-sans-greek-300-normal-DYVZ0lxF.woff2) format('woff2'), url(/assets/open-sans-greek-300-normal-TsoYJRKh.woff) format('woff');
1168  unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;
1169}
1170
1171/* open-sans-hebrew-300-normal */
1172
1173@font-face {
1174  font-family: 'Open Sans';
1175  font-style: normal;
1176  font-display: swap;
1177  font-weight: 300;
1178  src: url(/assets/open-sans-hebrew-300-normal-Cxzo_SFy.woff2) format('woff2'), url(/assets/open-sans-hebrew-300-normal-D7f9KBvB.woff) format('woff');
1179  unicode-range: U+0307-0308,U+0590-05FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F;
1180}
1181
1182/* open-sans-math-300-normal */
1183
1184@font-face {
1185  font-family: 'Open Sans';
1186  font-style: normal;
1187  font-display: swap;
1188  font-weight: 300;
1189  src: url(/assets/open-sans-math-300-normal-DSroN9_k.woff2) format('woff2'), url(/assets/open-sans-math-300-normal-DESENJMq.woff) format('woff');
1190  unicode-range: U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2
1190038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF;
1191}
1192
1193/* open-sans-symbols-300-normal */
1194
1195@font-face {
1196  font-family: 'Open Sans';
1197  font-style: normal;
1198  font-display: swap;
1199  font-weight: 300;
1200  src: url(/assets/open-sans-symbols-300-normal-BzBjWUeC.woff2) format('woff2'), url(/assets/open-sans-symbols-300-normal-BJ1m92xs.woff) format('woff');
1201  unicode-range: U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF;
1202}
1203
1204/* open-sans-vietnamese-300-normal */
1205
1206@font-face {
1207  font-family: 'Open Sans';
1208  font-style: normal;
1209  font-display: swap;
1210  font-weight: 300;
1211  src: url(/assets/open-sans-vietnamese-300-normal-CScQ2qfJ.woff2) format('woff2'), url(/assets/open-sans-vietnamese-300-normal-BGj0RAzw.woff) format('woff');
1212  unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
1213}
1214
1215/* open-sans-latin-ext-300-normal */
1216
1217@font-face {
1218  font-family: 'Open Sans';
1219  font-style: normal;
1220  font-display: swap;
1221  font-weight: 300;
1222  src: url(/assets/open-sans-latin-ext-300-normal-DgyrAwpy.woff2) format('woff2'), url(/assets/open-sans-latin-ext-300-normal-hLcLv40m.woff) format('woff');
1223  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
1224}
1225
1226/* open-sans-latin-300-normal */
1227
1228@font-face {
1229  font-family: 'Open Sans';
1230  font-style: normal;
1231  font-display: swap;
1232  font-weight: 300;
1233  src: url(/assets/open-sans-latin-300-normal-D5gIFPXQ.woff2) format('woff2'), url(/assets/open-sans-latin-300-normal-BKswzCSr.woff) format('woff');
1234  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
1235}
1236
1237/* open-sans-cyrillic-ext-400-normal */
1238
1239@font-face {
1240  font-family: 'Open Sans';
1241  font-style: normal;
1242  font-display: swap;
1243  font-weight: 400;
1244  src: url(/assets/open-sans-cyrillic-ext-400-normal-B28g4zcY.woff2) format('woff2'), url(/assets/open-sans-cyrillic-ext-400-normal-CtkCLoLZ.woff) format('woff');
1245  unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
1246}
1247
1248/* open-sans-cyrillic-400-normal */
1249
1250@font-face {
1251  font-family: 'Open Sans';
1252  font-style: normal;
1253  font-display: swap;
1254  font-weight: 400;
1255  src: url(/assets/open-sans-cyrillic-400-normal-DvjyhnTk.woff2) format('woff2'), url(/assets/open-sans-cyrillic-400-normal-XMp_Qeuo.woff) format('woff');
1256  unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
1257}
1258
1259/* open-sans-greek-ext-400-normal */
1260
1261@font-face {
1262  font-family: 'Open Sans';
1263  font-style: normal;
1264  font-display: swap;
1265  font-weight: 400;
1266  src: url(data:font/woff2;base64,d09GMgABAAAAAA6sABIAAAAAG0wAAA5LAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbgTYcOgZgP1NUQVReAFwIgXwJnxQREAqCLIIwCxIAATYCJAMgBCAFhHgHUgyFHxsCGiMR9ouyak72lwf0EKkl7s9wN0JaXnxFW664YKMz95rWNgND06WzDBJh8AcbDrc05D+PZ/25Ly+psJ0O1A92mJW6Hil/Jwt3BCzI7reU/fZj206/gL8+8JBJw8UuJEr8hJDOqjWb3RAqwq1uHSCZqtEBAuHe3hPJ7n4wDDTEPJAwlIA8A9acWKOJ34tOTPGZSSL0lUhp9MXK/N5Uk3Sr9CYdKYM36ZD27FZEqjhFbb0AnQJQksvhlnpev8nt8pFK51bj4/90Zu2XbGUnB
1266B3wUpcUHdxVBTWN54/G1p+R7MksjrUcIilsBZ095irvihqBuuuuvPKKtqN7f67eJBTtSGSzLIZkgmMoosTS9kr/vSNBYLAieT8hIEhgIAggEAC91LritzFiGnKICxen5cGzvrmmDJ7CGn8pPEX+dTXwlK2tq4AHHAA0DQNAYHsyAVd56Up0IBrk4MFdC4mTXdFGPcpgPFs4n/lkDmI9UjwMqNZrGtJdDzfUIwhbuSre3qAvYXZ/LJcn9TiYdvGuBtR6LYo35DJthgiIE/lzAPbKiMGFMtuK5JI+EPA7LFmZS+hBIPp9/fh/pwH9/2wUoEMAwJPE2wF4wEEg6CEAcGXvJwascUNdERHQeIrqCKB/2emjCB957oIABkaRYI4A1aMjOW0G2L06hzQMGyqB1RrWJBdyJDkr9PgLSwAs8ODwTI9+/2jb1b9J2m/aJ5r/w7s+vAGEpCC5YBJvh3u8AU+CC9C+Vt/Kyf/d8R+joKL1GwCnnbVztfCkHjoH+WqHbHJG+3aeRLkRe5XaaJ8Wx41nBvrsddSI79GvKUkZtcCeg866xZGruzfb4xDRnRFwSU8638hIi56GhKStKB2O322LY865pNeY3ZmBal0GbYpPPqHdgFE7ite/6Hs06TBkW5LQrIv92bbb61Q/LLSIRrg0kz0onPKl7Nm9a+fgQH9fb093V2dHe1trS3NTY0N9XW1NdVVlRXlZaUlxUWH7cTObTqrgv/n6qy+vS2efXz0bjwb9Lz7/7NPLXrfTLj56N1tbbaQxi17wxWyt2UiiMTYx603DWliF+ywYNgQZWH05tHlLae0Uawg0crEjTGXdGDkiJQ4Wdvfnuxzx5aC0lMsKcO1aY0VWNXZxmQ+DtHDoMvG5MXS3BdfVY5vR+6xMgJmEaQQfsK2iIr6/utGfZzFsHGPNsGY7o7VELxv1sb+YzsifLaU2SKkuTyqxf/Kca4SW0oL9jesQt4IF0iNGNfT42+JDefCECBZc9a3UAG+s1IVDy899V1LDmpyr40Ml/i2xbjYiyXmsSx9Go6QP46WtyxN4HibsL2TmLvy5i/V4BQEu+XzLA7Hh11Ynqenl0A9POFXLdqUu36+dunVSo+ilMDwykjLF6Vb8Ro56rKzrI6LHy77sBc2e3i8/7BGsSTAOExvhrLzW6dri6crp6unG3OacilimX4Jn/AslMZjkV7PZTE3wUhpO1Oj903arGgVczjwPp+BVF7NIzq0lckl40Nd41vuTldL+msumURmvVOfJIzQbeaSJ4Uu6IoZBMABOead4ExQRn4KMLG3SK+1S41pueGW9R7I8U+xi9ctyksfy7OJS2gfldSaWR8bVpQ+8kcsNL7JhzvZ5CxS6Ey68fZKhkVK33DK5Io81bz4mKSvE1uRJIH4tyETyvR/R/356nBxHtEsbSN3sHJk7R5ecJCe+BTcCzHj8V845p9fvZZ0rIkjf3qobF8ATCAdod66ilnOt3etps0F5hIlpNRuXgyhfmP611QBXkYQW7Vn4IExCdFRLK9ZivrCu1XLkKOemOKWQr2S5E3URG161kwNNIQNoEGDJH7Ys6Z9nXFrJXzzlkY1yKqs0CYomTsnsxNsTrWYjTSG5xuKTSQZq7n53mNysj6w5qTxXpfsG+/F13gLdENqY5V5bQpZwt/RxPq1EEYWwoHRoNU0d4YFlwMzOXLAxbiUo1Dwm5QdKgDzg4/uQ4jbouFOFWO2h8VQEllTrWRp7CgfO2J8r4KUi4Yz3eS129NrQJvNeeJkEEGCvO17yeieSrZR20OR1udoqAVdrndwbR6a+52ACrqwG4VBa8dIn78h7BOZGK+mZJt2ECwsfuap/LPxtYWnJBRl3s7C/fybhVnar4RlrBfV+5zxvQe2+mx5gaQFFCSxFuodGsWWBYAjL7hsfF04MhxnYdxUxCLeRgsQz2NBulbN2dkvwIw7aVE1Srb+vidQFwqI3MNiRSuE9mXmEc5aAc3LlDWvKqKDTbIJScABUF4w7gHArZoBwFelZxKGJi8vvayH0H5stZ+l5LAEWFiN27RiY3KkBZXcteOCH4aK00CfJQtlM17uAWK0ctxJoxRI9V93dEqWBLlvlEl9X+1oyyRa1TUs5JODNkYHKLtKm3KFUmxPFwIihg0pO954zbCch1DeJ32hqzPDwVYh7D6MpSGCRUXV8cGZz6xmsc20r34ogi3q1RHiwOL1+PwyI1lI/U939bzfplGnXX47Lw7mWGfSa59I6Pug1EckxoqMKL+5Iec/BJuzEU4dk6entiCbjlCaDrzRarq3WrJeVwaMjA2HcyPpxxS88GveeDDw/g9KCkwImKEAmAVwnXU8kHmBoQLwjLfAvJGmYd0cQOTSSWQZmHkSZbHND1jnt99OXdL5vAUN1aMaBgMRLnpu4MgxY2UW14OLIavH16dTM0FoNOMp3rDsvKg8dghMBYMGKjMP1rzjcBWGlJfA6S1UC4kl0J7gyi+dPTtqDfovnGqWeQIb3s5XwWGvGxa270+XcwfJPkGIPTmAPhV/2PBjArF3ymhzZsT2IJDtlW7BupIym/
126676s+abnwGpFwHFaR63PgigHgDNc8rG0SUdcKMfIhaoQ5JeqgPAu4gxyTNuf+LW6IUF2HkuDa8KXfMyNScVE5K83tgtq0SElZVDY92XECTnVSIt1bugD3wCNSVh/9mOw9xHEl3xheZ/YS+mJwKNpNiSsJNDrXEH0ZijPcGNTokHeCntSRaZfu1CgqOTkH/UUBj/9/7y5DY1B8c1tQCFjr8M/8yAdPDZuAWEr2Dk/Wzi2P6GX3P9g0sOmSC1IDZvoSFzfA8fmi1z6iWLxVhfP1ie6D9Casl3xheNARD4WDzgnIRhU+Ai/hYleD+3l8CvjFxiVljNKD5PDb4QS/h4jYwka1lDcc8BbHb8qPauQW7RFbixM2Y65VfgJ8I5PEwZas76fCZYEnvNFvwQK9rywMSf9I2h+NxathbQW1r65usN/xqbItQh0Nfz4W+2HXA0X/k6bcgymL+02BqDnxm85CbRSdd9J9V/ZDC2A0Gwq7b6OqVGhfG0uQfwvSJHe63iuxLrLjn/4E3ldppXoor94uVk8ZiLtU5q2dQhwe8HLstu8LMgca7ZQZSn7IlRIptCc+tteW2sQBOhhhAU6TWNDMksPZgfjYHOQrGWeGWZLiNlPqT6B02Zytna9+eqrxpHXX3+but/5xDT60VtNXW+9Jl/5jXeo923jyKtvttItbyw14TyBzcqrBNEbwT/+c+h6p281dr2kLH/4vTOK6/Tjf5WeOPtv6ckncoLOfLgtO+aeT966/q7dWUkPfnZ3se3tbWfOvrmt0HZ3+Ldz/jn7zpYSs91+3fYPQksnH7MuvCNo+hx/ctHqTnulqai+aPKUefHe/YkhP92+zH3lEp8YievAaRZAOuj+36LtJQAg7VvpT/G5OyKtQo1bNNTAK3vlhMTbBCZbGe78/wZugnfSJJ85wmRCqMMh8S4C4uWwZ2U5fqJjoqhsKX+O9EKPpZ0qeXy1bdZvetPArX7r2Yf/wLaPWt8508pJUjwACQyAwp9tZXT1ILRXoNae7NHz5/AQ9DOXMNJ0CpeCvJSfpKofV48rwDAHHAx2xGMvsPttvWAgAFZcJIC4AcD5RBWdBCeZiVUH/3cKmIInOzmuxMlOEWEY65TgQdk6KyZh2lEEmBEDnQQjrrwGb3oLhbHATREsMFJk9O6BHJXKrVUhWZ21yhRbLwOhmhhVWhrTBpyKcvIXVAiqTvBodZUZiHe11lOpWKW6YmEcaqlMYgNUWNU702JpMvf6VcjtKl8rFjn8QMssaFRhlFT01I1GVXmCloJq1dA6NQi+GeJcmrMKUimU3ThrZ+3KdB04r5FOG7x6zI6g4SgcIa5BY/qeUZjuRrqYrs1Tt4XHuDdEVUPwXjKLqTXDSrdQ5ap2TgRCoxW1WNrQ9An3LseSUXfJLNoqOpFcrrafxnvQAxUJEMjhJJLE/1uS5zrxRi8Xw45K5VbJZeqAzveJfH7XYWvbJDaZpSmEhekwN/3ODPupoWATgxkbwYz00GOoLWKgNX2dzno61tX06KhaaKueoaWaoqnyo6EuTF3tlqmpQ6gqqayiNGUFMyUFnRUVmYLCgLycmZwMZ1lZJiNrIS3lmZR0l5SqJiFhLC6amEhlUbFHRPgJCxSS7Js3X5xgn6z5YNUe76wLbwx7pU2Q4ixAGT/l1sNH7rxkDw/2bhgXcOYkMg6iBfsLGNsz9LA+TWF5OsH8FILR9WdwMDptnlGrpBAF+QcQrh/v8/yjHBzrAnsVdp9nHtSg7wHq/kCiBQIuAC4ixL0iKiQiOjJYQ8mtoSiHRi8PmeaeujwM/OD/9aDQOW4tOyHRqTgS7YpTtasW2ayIMlfMKldtvJP/wAWbZlVMslHRyZJCq6EM1ahK6gvSDxKDetHpkh/A7SCDrFcEmSl6lak21sl+YIIdgs8n0p20OZDnTb1Tp+WkBgxZywM0FLgmN0BDAV/2soA0FICyl+dfJtqo9o+PI3J+amBzbv7NAhA5X73M2ILs/Mtc2KjOr4UXXq+3thbe0MKbSCTMrkkrhU0hqnjDawDIBBUZTj+WUftcLlQI) format('woff2'), url(data:font/woff;base64,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) format('woff');
1267  unicode-range: U+1F00-1FFF;
1268}
1269
1270/* open-sans-greek-400-normal */
1271
1272@font-face {
1273  font-family: 'Open Sans';
1274  font-style: normal;
1275  font-display: swap;
1276  font-weight: 400;
1277  src: url(/assets/open-sans-greek-400-normal-BKm6CSmU.woff2) format('woff2'), url(/assets/open-sans-greek-400-normal-yVf9KAAO.woff) format('woff');
1278  unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;
1279}
1280
1281/* open-sans-hebrew-400-normal */
1282
1283@font-face {
1284  font-family: 'Open Sans';
1285  font-style: normal;
1286  font-display: swap;
1287  font-weight: 400;
1288  src: url(/assets/open-sans-hebrew-400-normal-C3uFZKNA.woff2) format('woff2'), url(/assets/open-sans-hebrew-400-normal-Cowz_U6T.woff) format('woff');
1289  unicode-range: U+0307-0308,U+0590-05FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F;
1290}
1291
1292/* open-sans-math-400-normal */
1293
1294@font-face {
1295  font-family: 'Open Sans';
1296  font-style: normal;
1297  font-display: swap;
1298  font-weight: 400;
1299  src: url(/assets/open-sans-math-400-normal-C76BUjK0.woff2) format('woff2'), url(/assets/open-sans-math-400-normal-Cs0GbA_j.woff) format('woff');
1300  unicode-range: U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2
1300038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF;
1301}
1302
1303/* open-sans-symbols-400-normal */
1304
1305@font-face {
1306  font-family: 'Open Sans';
1307  font-style: normal;
1308  font-display: swap;
1309  font-weight: 400;
1310  src: url(/assets/open-sans-symbols-400-normal-OZvd8qMe.woff2) format('woff2'), url(/assets/open-sans-symbols-400-normal-B5VgOMNH.woff) format('woff');
1311  unicode-range: U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF;
1312}
1313
1314/* open-sans-vietnamese-400-normal */
1315
1316@font-face {
1317  font-family: 'Open Sans';
1318  font-style: normal;
1319  font-display: swap;
1320  font-weight: 400;
1321  src: url(/assets/open-sans-vietnamese-400-normal-Dqpvjuft.woff2) format('woff2'), url(/assets/open-sans-vietnamese-400-normal-DCU23d-J.woff) format('woff');
1322  unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
1323}
1324
1325/* open-sans-latin-ext-400-normal */
1326
1327@font-face {
1328  font-family: 'Open Sans';
1329  font-style: normal;
1330  font-display: swap;
1331  font-weight: 400;
1332  src: url(/assets/open-sans-latin-ext-400-normal-URAvo6nN.woff2) format('woff2'), url(/assets/open-sans-latin-ext-400-normal-BfzJ9CTS.woff) format('woff');
1333  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
1334}
1335
1336/* open-sans-latin-400-normal */
1337
1338@font-face {
1339  font-family: 'Open Sans';
1340  font-style: normal;
1341  font-display: swap;
1342  font-weight: 400;
1343  src: url(/assets/open-sans-latin-400-normal-Bk63H6sG.woff2) format('woff2'), url(/assets/open-sans-latin-400-normal-DKniycaP.woff) format('woff');
1344  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
1345}
1346
1347/* open-sans-cyrillic-ext-700-normal */
1348
1349@font-face {
1350  font-family: 'Open Sans';
1351  font-style: normal;
1352  font-display: swap;
1353  font-weight: 700;
1354  src: url(/assets/open-sans-cyrillic-ext-700-normal-BWp9aGB1.woff2) format('woff2'), url(/assets/open-sans-cyrillic-ext-700-normal-hbT5P32v.woff) format('woff');
1355  unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
1356}
1357
1358/* open-sans-cyrillic-700-normal */
1359
1360@font-face {
1361  font-family: 'Open Sans';
1362  font-style: normal;
1363  font-display: swap;
1364  font-weight: 700;
1365  src: url(/assets/open-sans-cyrillic-700-normal-Db4W_Rwa.woff2) format('woff2'), url(/assets/open-sans-cyrillic-700-normal-FWckWEfO.woff) format('woff');
1366  unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
1367}
1368
1369/* open-sans-greek-ext-700-normal */
1370
1371@font-face {
1372  font-family: 'Open Sans';
1373  font-style: normal;
1374  font-display: swap;
1375  font-weight: 700;
1376  src: url(data:font/woff2;base64,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) format('woff2'), url(data:font/woff;base64,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) format('woff');
1377  unicode-range: U+1F00-1FFF;
1378}
1379
1380/* open-sans-greek-700-normal */
1381
1382@font-face {
1383  font-family: 'Open Sans';
1384  font-style: normal;
1385  font-display: swap;
1386  font-weight: 700;
1387  src: url(/assets/open-sans-greek-700-normal-YcFp24oM.woff2) format('woff2'), url(/assets/open-sans-greek-700-normal-bcfTBw-h.woff) format('woff');
1388  unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;
1389}
1390
1391/* open-sans-hebrew-700-normal */
1392
1393@font-face {
1394  font-family: 'Open Sans';
1395  font-style: normal;
1396  font-display: swap;
1397  font-weight: 700;
1398  src: url(/assets/open-sans-hebrew-700-normal-DnAL3HC_.woff2) format('woff2'), url(/assets/open-sans-hebrew-700-normal-CZc_Q6SQ.woff) format('woff');
1399  unicode-range: U+0307-0308,U+0590-05FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F;
1400}
1401
1402/* open-sans-math-700-normal */
1403
1404@font-face {
1405  font-family: 'Open Sans';
1406  font-style: normal;
1407  font-display: swap;
1408  font-weight: 700;
1409  src: url(/assets/open-sans-math-700-normal-EYnC2qGX.woff2) format('woff2'), url(/assets/open-sans-math-700-normal-B7X9EnEK.woff) format('woff');
1410  unicode-range: U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF;
1411}
1412
1413/* open-sans-symbols-700-normal */
1414
1415@font-face {
1416  font-family: 'Open Sans';
1417  font-style: normal;
1418  font-display: swap;
1419  font-weight: 700;
1420  src: url(/assets/open-sans-symbols-700-normal-DfXrtqu8.woff2) format('woff2'), url(/assets/open-sans-symbols-700-normal-DNvDgxgv.woff) format('woff');
1421  unicode-range: U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF;
1422}
1423
1424/* open-sans-vietnamese-700-normal */
1425
1426@font-face {
1427  font-family: 'Open Sans';
1428  font-style: normal;
1429  font-display: swap;
1430  font-weight: 700;
1431  src: url(/assets/open-sans-vietnamese-700-normal-C0rmKuKj.woff2) format('woff2'), url(/assets/open-sans-vietnamese-700-normal-BwQSBZ9d.woff) format('woff');
1432  unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
1433}
1434
1435/* open-sans-latin-ext-700-normal */
1436
1437@font-face {
1438  font-family: 'Open Sans';
1439  font-style: normal;
1440  font-display: swap;
1441  font-weight: 700;
1442  src: url(/assets/open-sans-latin-ext-700-normal-DatbY7Hl.woff2) format('woff2'), url(/assets/open-sans-latin-ext-700-normal-IE4yTLg1.woff) format('woff');
1443  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1D
1443BF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
1444}
1445
1446/* open-sans-latin-700-normal */
1447
1448@font-face {
1449  font-family: 'Open Sans';
1450  font-style: normal;
1451  font-display: swap;
1452  font-weight: 700;
1453  src: url(/assets/open-sans-latin-700-normal-CceUhp2e.woff2) format('woff2'), url(/assets/open-sans-latin-700-normal-CZCQA30i.woff) format('woff');
1454  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
1455}
1456
1457/* open-sans-cyrillic-ext-400-italic */
1458
1459@font-face {
1460  font-family: 'Open Sans';
1461  font-style: italic;
1462  font-display: swap;
1463  font-weight: 400;
1464  src: url(/assets/open-sans-cyrillic-ext-400-italic-DTxbCGjE.woff2) format('woff2'), url(/assets/open-sans-cyrillic-ext-400-italic-j4MbU4yU.woff) format('woff');
1465  unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
1466}
1467
1468/* open-sans-cyrillic-400-italic */
1469
1470@font-face {
1471  font-family: 'Open Sans';
1472  font-style: italic;
1473  font-display: swap;
1474  font-weight: 400;
1475  src: url(/assets/open-sans-cyrillic-400-italic-BUPR0S1h.woff2) format('woff2'), url(/assets/open-sans-cyrillic-400-italic-DGpcSWlQ.woff) format('woff');
1476  unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
1477}
1478
1479/* open-sans-greek-ext-400-italic */
1480
1481@font-face {
1482  font-family: 'Open Sans';
1483  font-style: italic;
1484  font-display: swap;
1485  font-weight: 400;
1486  src: url(data:font/woff2;base64,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) format('woff2'), url(data:font/woff;base64,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) format('woff');
1487  unicode-range: U+1F00-1FFF;
1488}
1489
1490/* open-sans-greek-400-italic */
1491
1492@font-face {
1493  font-family: 'Open Sans';
1494  font-style: italic;
1495  font-display: swap;
1496  font-weight: 400;
1497  src: url(/assets/open-sans-greek-400-italic-CilYwb5U.woff2) format('woff2'), url(/assets/open-sans-greek-400-italic-BuH7C3yF.woff) format('woff');
1498  unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;
1499}
1500
1501/* open-sans-hebrew-400-italic */
1502
1503@font-face {
1504  font-family: 'Open Sans';
1505  font-style: italic;
1506  font-display: swap;
1507  font-weight: 400;
1508  src: url(/assets/open-sans-hebrew-400-italic-CXPP0jOX.woff2) format('woff2'), url(/assets/open-sans-hebrew-400-italic-D5O-QnBO.woff) format('woff');
1509  unicode-range: U+0307-0308,U+0590-05FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F;
1510}
1511
1512/* open-sans-math-400-italic */
1513
1514@font-face {
1515  font-family: 'Open Sans';
1516  font-style: italic;
1517  font-display: swap;
1518  font-weight: 400;
1519  src: url(/assets/open-sans-math-400-italic-BsO0csMs.woff2) format('woff2'), url(/assets/open-sans-math-400-italic-CAApjVH7.woff) format('woff');
1520  unicode-range: U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF;
1521}
1522
1523/* open-sans-symbols-400-italic */
1524
1525@font-face {
1526  font-family: 'Open Sans';
1527  font-style: italic;
1528  font-display: swap;
1529  font-weight: 400;
1530  src: url(/assets/open-sans-symbols-400-italic-0Ch9q1R9.woff2) format('woff2'), url(/assets/open-sans-symbols-400-italic-DdEf8Kfy.woff) format('woff');
1531  unicode-range: U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF;
1532}
1533
1534/* open-sans-vietnamese-400-italic */
1535
1536@font-face {
1537  font-family: 'Open Sans';
1538  font-style: italic;
1539  font-display: swap;
1540  font-weight: 400;
1541  src: url(/assets/open-sans-vietnamese-400-italic-BLoWRDoa.woff2) format('woff2'), url(/assets/open-sans-vietnamese-400-italic-B-vHoAQ6.woff) format('woff');
1542  unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
1543}
1544
1545/* open-sans-latin-ext-400-italic */
1546
1547@font-face {
1548  font-family: 'Open Sans';
1549  font-style: italic;
1550  font-display: swap;
1551  font-weight: 400;
1552  src: url(/assets/open-sans-latin-ext-400-italic-BF0ugEcP.woff2) format('woff2'), url(/assets/open-sans-latin-ext-400-italic-7zHzNkY4.woff) format('woff');
1553  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1D
1553BF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
1554}
1555
1556/* open-sans-latin-400-italic */
1557
1558@font-face {
1559  font-family: 'Open Sans';
1560  font-style: italic;
1561  font-display: swap;
1562  font-weight: 400;
1563  src: url(/assets/open-sans-latin-400-italic-oaOkCnEp.woff2) format('woff2'), url(/assets/open-sans-latin-400-italic-BEURUQpT.woff) format('woff');
1564  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
1565}
1566
1567:root {
1568  --rrtheme-color: #ca4747;
1569}
1570
1571.sr-only {
1572  position: absolute;
1573  width: 1px;
1574  height: 1px;
1575  padding: 0;
1576  margin: -1px;
1577  overflow: hidden;
1578  clip: rect(0, 0, 0, 0);
1579  white-space: nowrap;
1580  border: 0;
1581}
1582
1583.skip-link {
1584  position: absolute;
1585  top: -100%;
1586  left: 0;
1587  padding: 8px 16px;
1588  background: var(--rrtheme-color);
1589  color: white;
1590  font-family: "Open Sans", sans-serif;
1591  font-size: 14px;
1592  text-decoration: none;
1593  z-index: 9999;
1594}
1595
1596.skip-link:focus {
1597  top: 0;
1598}
1599
1600html,
1601body {
1602  display: flex;
1603  margin: 0;
1604  padding: 0;
1605  overflow-x: hidden;
1606  min-height: 100vh;
1607  flex-direction: column;
1608}
1609
1610html {
1611  background-color: var(--rrtheme-color);
1612}
1613
1614body {
1615  max-width: 100%;
1616}
1617
1618.container {
1619  padding: 50px 20px;
1620  flex: 1;
1621  background-color: var(--theme-background);
1622  border-top: 1px solid rgba(128, 128, 128, 0.3);
1623}
1624
1625nav {
1626  padding: 2px;
1627  box-sizing: border-box;
1628  display: flex;
1629  align-items: center;
1630  background: var(--rrtheme-color);
1631  font-family: "Open Sans", sans-serif;
1632  font-size: 16px;
1633  -webkit-font-smoothing: auto;
1634}
1635
1636nav .menu__item {
1637  padding: 5px 8px;
1638  font-size: 0.9em;
1639  text-shadow: 0 0 1px #000;
1640}
1641
1642nav .menu__item.theme-toggle {
1643  padding-right: 12px;
1644}
1645
1646nav .menu__item[href] {
1647  color: white;
1648}
1649
1650a[href] {
1651  color: var(--rrtheme-color);
1652  text-decoration: none;
1653}
1654
1655main {
1656  max-width: var(--max-width);
1657  margin: auto;
1658  width: 100%;
1659  padding-bottom: 100px;
1660}
1661
1662main h1,
1663main h2,
1664main h3,
1665main h4,
1666main h5,
1667main h6 {
1668  font-family: "Open Sans", sans-serif;
1669  -webkit-font-smoothing: auto;
1670}
1671
1672main summary {
1673  cursor: pointer;
1674}
1675
1676main details {
1677  margin: 1.5em 0;
1678}
1679
1680main details[open] {
1681  border-left: 3px solid #ccc;
1682  padding-left: 1em;
1683}
1684
1685main details[open] > summary {
1686  margin-left: -1em;
1687  padding-left: 1em;
1688  border-left: 3px solid transparent;
1689  margin-bottom: 0.5em;
1690}
1691
1692main figure {
1693  width: fit-content;
1694  margin: 4em auto;
1695  max-width: 100%;
1696}
1697
1698main figure img {
1699  display: block;
1700}
1701
1702main figure figcaption {
1703  width: 0;
1704  min-width: 100%;
1705}
1706
1707main figure.fluid {
1708  width: auto;
1709}
1710
1711main figure.fluid figcaption {
1712  width: auto;
1713  min-width: 0;
1714}
1715
1716hr {
1717  margin: 3em 0;
1718}
1719
1720/* Pull-quote blockquote. Plain <blockquote> is left unstyled so that
1721   code-generated or Markdown-default blockquotes are not affected. */
1722
1723blockquote.quote {
1724  border-left: 3px solid var(--rrtheme-color);
1725  margin: 1.5em 0;
1726  padding: 0.4em 0 0.4em 1.25em;
1727  font-style: italic;
1728  color: var(--theme-foreground-alt);
1729}
1730
1731blockquote.quote p {
1732  margin: 0;
1733}
1734
1735blockquote.quote .quote__attribution {
1736  margin-top: 0.6em;
1737  margin-bottom: 0;
1738  font-style: normal;
1739  font-size: 0.875em;
1740  color: var(--theme-foreground-muted);
1741}
1742
1743blockquote.quote .quote__attribution::before {
1744  content: '\2014\a0';
1745}
1746
1747/* Landing page section links (root index only, scoped via header.has-image) */
1748
1749body:has(header.has-image) main .observablehq--cell:first-child ul {
1750  list-style: none;
1751  display: flex;
1752  flex-direction: row;
1753  gap: 32px;
1754  justify-content: center;
1755  flex-wrap: nowrap;
1756  padding: 8px 0;
1757  margin: 0;
1758}
1759
1760@media (max-width: 480px) {
1761  body:has(header.has-image) main .observablehq--cell:first-child ul {
1762    flex-direction: column;
1763    align-items: center;
1764    gap: 12px;
1765  }
1766}
1767
1768body:has(header.has-image) main .observablehq--cell:first-child ul li {
1769  padding: 0;
1770}
1771
1772body:has(header.has-image) main .observablehq--cell:first-child ul li a {
1773  font-size: 1.4rem;
1774  font-weight: 300;
1775  font-family: "Open Sans", sans-serif;
1776  -webkit-font-smoothing: auto;
1777  text-decoration: none;
1778  color: var(--rrtheme-color);
1779}
1780
1781body:has(header.has-image) main .observablehq--cell:first-child ul li a:hover {
1782  text-decoration: underline;
1783}
1784
1785header {
1786  color: white;
1787  font-weight: 200;
1788  width: 100%;
1789  margin: 0 auto;
1790  background-color: var(--rrtheme-color);
1791  text-align: center;
1792  padding: 80px 20px;
1793  position: relative;
1794  font-family: "Open Sans", sans-serif;
1795  -webkit-font-smoothing: auto;
1796  box-sizing: border-box;
1797}
1798
1799header.has-image {
1800  background-size: cover;
1801  background-position: center 30%;
1802  padding: 120px 20px;
1803}
1804
1805header.has-image > * {
1806  position: relative;
1807}
1808
1809header.has-image h1 {
1810  display: inline-block;
1811  padding: 6px 16px;
1812  text-shadow: 0 1px 8px rgba(0, 0, 0, 0.8), 0 2px 24px rgba(0, 0, 0, 0.5), 0 0 80px rgba(0, 0, 0, 0.9);
1813}
1814
1815header.has-image,
1816header.has-image * {
1817  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.7);
1818}
1819
1820nav:has(+ header.has-image) .menu__item {
1821  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
1822}
1823
1824nav:has(+ header.has-image) {
1825  background: rgba(0, 0, 0, 0);
1826  backdrop-filter: blur(6px);
1827  -webkit-backdrop-filter: blur(6px);
1828  position: absolute;
1829  width: 100%;
1830  z-index: 1;
1831}
1832
1833body:has(header.has-image) {
1834  background-color: var(--rrtheme-color);
1835}
1836
1837header h1 {
1838  max-width: 640px;
1839  margin-left: auto;
1840  margin-right: auto;
1841}
1842
1843header .author,
1844header time {
1845  color: inherit;
1846  font-family: inherit;
1847  font-style: normal;
1848  font-weight: inherit;
1849}
1850
1851header h1,
1852header p,
1853header a[href] {
1854  color: white;
1855}
1856
1857header .byline {
1858  margin-top: 20px;
1859  margin-bottom: 20px;
1860}
1861
1862.header__tags {
1863  display: flex;
1864  flex-wrap: wrap;
1865  gap: 5px;
1866  justify-content: center;
1867  margin-bottom: 16px;
1868}
1869
1870.header__tag {
1871  font-family: "Open Sans", sans-serif;
1872  font-size: 10px;
1873  font-weight: 600;
1874  letter-spacing: 0.06em;
1875  text-transform: uppercase;
1876  text-decoration: none;
1877  color: rgba(255, 255, 255, 0.6);
1878  background: rgba(255, 255, 255, 0.12);
1879  padding: 2px 7px;
1880  border-radius: 3px;
1881  transition: color 0.15s, background 0.15s;
1882}
1883
1884.header__tag:hover {
1885  color: rgba(255, 255, 255, 0.9);
1886  background: rgba(255, 255, 255, 0.22);
1887}
1888
1889header h1 {
1890  font-size: 34px;
1891  font-weight: 200;
1892}
1893
1894@media (max-width: 640px) {
1895  header {
1896    text-align: left;
1897  }
1898
1899  .header__tags {
1900    justify-content: flex-start;
1901  }
1902}
1903
1904main h1,
1905main h2,
1906main h3,
1907main h4,
1908main h5,
1909main h6 {
1910  font-weight: 400;
1911  margin-bottom: 1em;
1912}
1913
1914main h2 {
1915  margin-top: 3em;
1916}
1917
1918main h3 {
1919  margin-top: 2em;
1920}
1921
1922main figcaption {
1923  margin-top: 1em;
1924  opacity: 1;
1925  /* Off-foreground — set captions apart from body prose without making
1926     them hard to read. Mixes 20% of the opposing background into the
1927     foreground (slightly darkened white in dark mode, slightly lightened
1928     black in light mode). */
1929  color: color-mix(in srgb, var(--theme-foreground) 80%, var(--theme-background-b));
1930}
1931
1932main .katex-display {
1933  overflow-x: scroll;
1934  padding-top: 8px;
1935  padding-bottom: 8px;
1936}
1937
1938.comments_meta {
1939  display: flex;
1940  flex-direction: row;
1941  justify-content: space-between;
1942}
1943
1944.comments {
1945  padding: 30px 20px 0;
1946  font-family: var(--sans-serif);
1947}
1948
1949.comments_count {
1950  font-weight: 700;
1951}
1952
1953.comments_loading {
1954  display: flex;
1955  flex-direction: column;
1956  align-items: center;
1957  margin-bottom: 10px;
1958  color: var(--theme-foreground-muted);
1959}
1960
1961.comments .spinner {
1962  margin-bottom: 5px;
1963}
1964
1965.comment[href] {
1966  display: flex;
1967  flex-direction: column;
1968  border: 1px solid var(--theme-foreground-faintest);
1969  border-radius: 5px;
1970  margin: 15px 0;
1971  padding: 15px;
1972  color: var(--theme-foreground);
1973  text-decoration: none;
1974}
1975
1976.comment[href]:visited {
1977  color: var(--theme-foreground);
1978}
1979
1980.comment[href]:hover {
1981  border-color: var(--theme-foreground-muted);
1982  text-decoration: none;
1983}
1984
1985.comment[href]:last-child {
1986  margin-bottom: 0;
1987}
1988
1989.comment_meta {
1990  display: flex;
1991  flex-direction: row;
1992  align-items: flex-start;
1993  justify-content: space-between;
1994  gap: 10px;
1995  font-size: 13px;
1996}
1997
1998.comment_ago {
1999  color: var(--theme-foreground-muted);
2000}
2001
2002.comment_ago:visited {
2003  color: var(--theme-foreground-muted);
2004}
2005
2006.comment_user {
2007  display: flex;
2008  flex-direction: row;
2009  align-items: center;
2010  justify-content: flex-start;
2011  color: var(--theme-foreground);
2012  text-decoration: none;
2013  font-family: var(--sans-serif);
2014  font-weight: 700;
2015}
2016
2017.comment_user:visited {
2018  color: var(--theme-foreground);
2019}
2020
2021.comment_commenter {
2022  font-weight: 400;
2023  color: var(--theme-foreground-muted);
2024}
2025
2026.comment_content p {
2027  color: var(--theme-foreground);
2028}
2029
2030.comment_content p:first-child {
2031  margin-top: 10px;
2032}
2033
2034.comment_content p:last-child {
2035  margin-bottom: 0;
2036}
2037
2038.comment_user img {
2039  margin-right: 10px;
2040  border-radius: 2px;
2041  border: 1px solid var(--theme-foreground-faintest);
2042  width: 30px;
2043  height: 30px;
2044}
2045
2046.threebody{width:60px;height:60px;position:relative}
2047
2048.threebody-o{position:absolute;top:50%;left:50%}
2049
2050.threebody-o>div{position:absolute;animation:3s infinite linear}
2051
2052.threebody-o>div:after{content:'';position:absolute;width:12px;height:12px;border-radius:100%;transform:translate(-50%,-50%);background:inherit}
2053
2054.threebody-o>div:nth-child(1){background:#a0d323;animation-name:threebody-0}
2055
2056.threebody-o>div:nth-child(2){background:#23a0d3;animation-name:threebody-1}
2057
2058.threebody-o>div:nth-child(3){background:#d323a0;animation-name:threebody-2}
2059
2060@keyframes threebody-0{from{transform:rotate(0)translatex(0.01px)rotate(0)translatex(0.01px)rotate(0)translatex(0.03px)rotate(0)translatex(0.07px)rotate(0)translatex(0.16px)rotate(0)translatex(0.41px)rotate(0)translatex(1.3px)rotate(0)translatex(8px)rotate(0)translatex(-17px)rotate(0)translatex(0.21px)rotate(0)translatex(0.01px)}to{transform:rotate(-31turn)translatex(0.01px)rotate(4turn)translatex(0.01px)rotate(4turn)translatex(0.03px)rotate(4turn)translatex(0.07px)rotate(4turn)translatex(0.16px)rotate(4turn)translatex(0.41px)rotate(4turn)translatex(1.3px)rotate(4turn)translatex(8px)rotate(4turn)translatex(-17px)rotate(4turn)translatex(0.21px)rotate(8turn)translatex(0.01px)}}
2061
2062@keyframes threebody-1{from{transform:rotate(0)translatex(-0.01px)rotate(0)translatex(0.01px)rotate(0)translatex(-0.03px)rotate(0)translatex(0.07px)rotate(0)translatex(-0.16px)rotate(0)translatex(0.41px)rotate(0)translatex(-1.3px)rotate(0)translatex(8px)rotate(0)translatex(17px)rotate(0)translatex(0.21px)rotate(0)translatex(0.01px)}to{transform:rotate(-31turn)translatex(-0.01px)rotate(4turn)translatex(0.01px)rotate(4turn)translatex(-0.03px)rotate(4turn)translatex(0.07px)rotate(4turn)translatex(-0.16px)rotate(4turn)translatex(0.41px)rotate(4turn)translatex(-1.3px)rotate(4turn)translatex(8px)rotate(4turn)translatex(17px)rotate(4turn)translatex(0.21px)rotate(8turn)translatex(0.01px)}}
2063
2064@keyframes threebody-2{from{transform:rotate(0)translatex(-0.01px)rotate(0)translatex(-0.03px)rotate(0)translatex(-0.13px)rotate(0)translatex(-0.81px)rotate(0)translatex(-16px)rotate(0)translatex(-0.42px)rotate(0)translatex(-0.02px)}to{transform:rotate(-35turn)translatex(-0.01px)rotate(8turn)translatex(-0.03px)rotate(8turn)translatex(-0.13px)rotate(8turn)translatex(-0.81px)rotate(8turn)translatex(-16px)rotate(8turn)translatex(-0.42px)rotate(8turn)translatex(-0.02px)}}
2065
2066footer {
2067  background: var(--rrtheme-color);
2068  color: white;
2069  font-family: "Open Sans", sans-serif;
2070  padding: 30px 20px;
2071  display: flex;
2072  justify-content: center;
2073  align-items: center;
2074  gap: 20px;
2075}
2076
2077.footer__attrib {
2078}
2079
2080.footer__rss[href],
2081.footer__rss[href]:visited {
2082  color: white;
2083  display: flex;
2084  align-items: center;
2085  gap: 4px;
2086}
2087
2088.footer__rss:hover {
2089  opacity: 0.8;
2090}
2091
2092.footer__rss .icon {
2093  width: 14px;
2094  height: 14px;
2095}
2096
2097.index {
2098  padding: 0;
2099  margin: 0 auto;
2100  max-width: 1200px;
2101  list-style-type: none;
2102  display: grid;
2103  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
2104  gap: 24px;
2105}
2106
2107.index__item {
2108  margin: 0;
2109  border-radius: 8px;
2110  overflow: hidden;
2111  background: #f8f8f8;
2112  border: 1px solid rgba(0, 0, 0, 0.06);
2113  transition: transform 0.15s ease, box-shadow 0.15s ease;
2114  position: relative;
2115}
2116
2117.index__item:hover {
2118  transform: translateY(-2px);
2119  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
2120}
2121
2122.index__link {
2123  display: block;
2124  text-decoration: none;
2125  color: inherit;
2126}
2127
2128.index__image-container {
2129  aspect-ratio: 1200 / 630;
2130  overflow: hidden;
2131  background: linear-gradient(135deg, #e8e8e8 0%, #d8d8d8 100%);
2132}
2133
2134.index__image {
2135  width: 100%;
2136  height: 100%;
2137  object-fit: cover;
2138  display: block;
2139}
2140
2141.index__placeholder {
2142  width: 100%;
2143  height: 100%;
2144  background: linear-gradient(135deg, #eee 0%, #ddd 50%, #ccc 100%);
2145  position: relative;
2146}
2147
2148.index__placeholder::after {
2149  content: '';
2150  position: absolute;
2151  top: 50%;
2152  left: 50%;
2153  transform: translate(-50%, -50%);
2154  width: 48px;
2155  height: 48px;
2156  border: 3px solid #bbb;
2157  border-radius: 50%;
2158  opacity: 0.5;
2159}
2160
2161.index__content {
2162  padding: 16px;
2163}
2164
2165.index__title {
2166  font-family: "Open Sans", sans-serif;
2167  font-weight: 400;
2168  font-size: 15px;
2169  line-height: 1.4;
2170  margin: 0 0 6px 0;
2171  color: #333;
2172}
2173
2174.index__title-link {
2175  color: inherit;
2176  text-decoration: none;
2177}
2178
2179.index__title-link::after {
2180  content: '';
2181  position: absolute;
2182  inset: 0;
2183}
2184
2185.index__item:hover .index__title-link {
2186  color: var(--rrtheme-color);
2187  text-decoration: underline;
2188}
2189
2190.index__meta {
2191  display: flex;
2192  flex-wrap: wrap;
2193  align-items: center;
2194  gap: 6px;
2195}
2196
2197.index__date {
2198  font-family: "Open Sans", sans-serif;
2199  font-size: 12px;
2200  color: #888;
2201  text-transform: uppercase;
2202}
2203
2204.index__tags {
2205  display: flex;
2206  flex-wrap: wrap;
2207  gap: 4px;
2208}
2209
2210.index__tag {
2211  font-family: "Open Sans", sans-serif;
2212  font-size: 10px;
2213  font-weight: 600;
2214  color: #666;
2215  background: #e8e8e8;
2216  padding: 2px 6px;
2217  border-radius: 3px;
2218  text-transform: uppercase;
2219  letter-spacing: 0.02em;
2220  text-decoration: none;
2221  cursor: pointer;
2222  transition: background-color 0.15s ease, color 0.15s ease;
2223  position: relative;
2224  z-index: 1;
2225}
2226
2227.index__tag:hover {
2228  background: #d0d0d0;
2229  color: #444;
2230}
2231
2232a.index__tag,
2233a.index__tag:visited,
2234a.index__tag:active {
2235  color: #666;
2236}
2237
2238.index__active-filter {
2239  display: flex;
2240  align-items: center;
2241  gap: 8px;
2242  padding: 10px 14px;
2243  background: #f5f5f5;
2244  border: 1px solid rgba(0, 0, 0, 0.08);
2245  border-radius: 6px;
2246}
2247
2248.index__filter-label {
2249  font-family: "Open Sans", sans-serif;
2250  font-size: 13px;
2251  color: #666;
2252}
2253
2254.index__filter-tag {
2255  display: inline-flex;
2256  align-items: center;
2257  gap: 6px;
2258  font-family: "Open Sans", sans-serif;
2259  font-size: 12px;
2260  font-weight: 600;
2261  color: #fff;
2262  background: #555;
2263  padding: 4px 8px;
2264  border-radius: 4px;
2265  text-transform: uppercase;
2266  letter-spacing: 0.02em;
2267}
2268
2269.index__filter-remove,
2270.index__filter-remove:visited,
2271.index__filter-remove:active {
2272  display: inline-flex;
2273  align-items: center;
2274  justify-content: center;
2275  width: 16px;
2276  height: 16px;
2277  font-size: 16px;
2278  line-height: 1;
2279  color: #fff;
2280  text-decoration: none;
2281  opacity: 0.7;
2282  transition: opacity 0.15s ease;
2283}
2284
2285.index__filter-remove:hover {
2286  color: #fff;
2287  opacity: 1;
2288}
2289
2290.resource-links {
2291  display: flex;
2292  gap: 1rem;
2293  justify-content: center;
2294}
2295
2296.resource-link {
2297  vertical-align: middle;
2298}
2299
2300.resource-link .icon {
2301  position: relative;
2302  top: 2px;
2303  width: 15px;
2304}
2305
2306/* Recent notebooks (root index) */
2307
2308.recent-notebooks {
2309  max-width: 800px;
2310  margin: 3em auto 1em;
2311  padding: 0 0 1em;
2312}
2313
2314.recent-notebooks__heading {
2315  font-family: "Open Sans", sans-serif;
2316  font-weight: 400;
2317  font-size: 1.4em;
2318  margin: 0 0 1em;
2319  color: var(--theme-foreground);
2320}
2321
2322.recent-notebooks__list {
2323  margin: 0;
2324}
2325
2326.recent-notebooks__list .index__description {
2327  display: block;
2328}
2329
2330.recent-notebooks__more {
2331  margin: 1.5em 0 0;
2332  font-family: "Open Sans", sans-serif;
2333  font-size: 14px;
2334}
2335
2336html[data-dark] .recent-notebooks__heading,
2337html.theme-is-dark:not([data-light]) .recent-notebooks__heading {
2338  color: #ebebeb;
2339}
2340
2341/* See also (notebook pages). Reuses the recent-notebooks card list, but sits at
2342   the article's reading width and is ruled off from the notebook body above it. */
2343
2344.see-also {
2345  max-width: 640px;
2346  margin: 0 auto 1em;
2347  padding-top: 2.5em;
2348  border-top: 1px solid rgba(128, 128, 128, 0.3);
2349}
2350
2351/* Comments (notebook pages). A collapsible "> Comments" disclosure holding the
2352   giscus and Mastodon widgets. Sits at the article's reading width and is ruled
2353   off from the notebook body above it, matching the see-also treatment. */
2354
2355.comments-toggle {
2356  max-width: 640px;
2357  margin: 0 auto 1em;
2358  padding-top: 2.5em;
2359  border-top: 1px solid rgba(128, 128, 128, 0.3);
2360  font-family: var(--sans-serif);
2361}
2362
2363/* Matches .recent-notebooks__heading ("See also") so the two section labels
2364   read as a set. */
2365
2366.comments-toggle__summary {
2367  cursor: pointer;
2368  font-family: "Open Sans", sans-serif;
2369  font-weight: 400;
2370  font-size: 1.4em;
2371  color: var(--theme-foreground);
2372  list-style: none;
2373  user-select: none;
2374  display: flex;
2375  align-items: center;
2376}
2377
2378.comments-toggle__count {
2379  color: var(--theme-foreground-muted);
2380}
2381
2382.comments-toggle__count:not(:empty) {
2383  margin-left: 0.35em;
2384}
2385
2386/* Replace the default disclosure marker with a triangle that rotates from
2387   pointing right (">") when closed to pointing down ("v") when open. */
2388
2389.comments-toggle__summary::-webkit-details-marker {
2390  display: none;
2391}
2392
2393.comments-toggle__summary::before {
2394  content: "\25B8"; /* ▸ */
2395  display: inline-block;
2396  margin-right: 0.45em;
2397  font-size: 0.7em;
2398  transition: transform 0.15s ease;
2399}
2400
2401.comments-toggle[open] > .comments-toggle__summary::before {
2402  transform: rotate(90deg);
2403}
2404
2405html[data-dark] .comments-toggle__summary,
2406html.theme-is-dark:not([data-light]) .comments-toggle__summary {
2407  color: #ebebeb;
2408}
2409
2410.comments-toggle__body {
2411  padding-top: 0.5em;
2412}
2413
2414/* The two widgets already carry their own spacing; keep them from butting into
2415   each other when both render. */
2416
2417.comments-toggle__body #comment-root {
2418  margin: 1em auto 0;
2419  max-width: 640px;
2420}
2421
2422/* On index pages, tighten the gap between the intro prose and the cards
2423   that follow (overrides the 100px padding-bottom on main). The container's
2424   own 50px bottom padding still provides breathing room above the footer. */
2425
2426.container:has(> .nbindex) main,
2427.container:has(> .recent-notebooks:not(.see-also)) main {
2428  padding-bottom: 24px;
2429}
2430
2431/* A notebook body wants more air above the rule than an index intro does.
2432   giscus is above see-also on every article page, so it's the usual first rule. */
2433
2434.container:has(> .see-also) main,
2435.container:has(> .giscus-comments) main {
2436  padding-bottom: 60px;
2437}
2438
2439/* Notebooks index (year-grouped typographic list; full-color thumbnails always
2440   shown in the left column).
2441   The active-filter indicator above the list is shared with the old markup, so
2442   its .index__active-filter / .index__filter-* styles above still apply. */
2443
2444.nbindex {
2445  max-width: 900px;
2446  margin: 0 auto;
2447}
2448
2449/* Reused for the "See also" and homepage "Recent notebooks" lists, which are
2450   flat (no year groups) and carry no date. Fills the narrower section it sits in. */
2451
2452.nbindex--compact {
2453  max-width: none;
2454}
2455
2456.nbindex__group-header {
2457  display: flex;
2458  align-items: baseline;
2459  gap: 20px;
2460  margin: 38px 0 6px;
2461}
2462
2463.nbindex__group:first-child .nbindex__group-header {
2464  margin-top: 8px;
2465}
2466
2467.nbindex__year {
2468  font-family: var(--monospace);
2469  font-size: 13px;
2470  letter-spacing: 0.14em;
2471  color: #ca4747;
2472}
2473
2474.nbindex__rule {
2475  flex: 1;
2476  height: 1px;
2477  background: rgba(0, 0, 0, 0.1);
2478}
2479
2480.nbindex__count {
2481  font-family: var(--monospace);
2482  font-size: 12px;
2483  color: #9a9a9a;
2484}
2485
2486.nbindex__row {
2487  position: relative;
2488  display: grid;
2489  grid-template-columns: 128px 1fr;
2490  gap: 22px;
2491  padding: 15px 14px;
2492  margin: 0 -14px;
2493  border-radius: 8px;
2494  transition: background 0.18s ease;
2495}
2496
2497.nbindex__row:hover {
2498  background: rgba(0, 0, 0, 0.03);
2499}
2500
2501.nbindex__media {
2502  display: flex;
2503  flex-direction: column;
2504  gap: 7px;
2505}
2506
2507.nbindex__thumbwrap {
2508  width: 128px;
2509  height: 72px;
2510  border-radius: 6px;
2511  overflow: hidden;
2512  background: #ececec;
2513}
2514
2515.nbindex__thumb {
2516  width: 100%;
2517  height: 100%;
2518  object-fit: cover;
2519  display: block;
2520}
2521
2522.nbindex__thumb--empty {
2523  background: linear-gradient(135deg, #e8e8e8 0%, #d6d6d6 100%);
2524}
2525
2526.nbindex__date {
2527  font-family: var(--monospace);
2528  font-size: 12px;
2529  color: #6f6f6f;
2530  letter-spacing: 0.02em;
2531}
2532
2533.nbindex__body {
2534  display: flex;
2535  flex-direction: column;
2536  gap: 6px;
2537  min-width: 0;
2538}
2539
2540.nbindex__title {
2541  font-family: var(--serif);
2542  font-size: 22px;
2543  font-weight: 500;
2544  line-height: 1.25;
2545  color: #262626;
2546  margin: 0;
2547}
2548
2549/* a.-qualified so these beat the base `a[href]` link color (equal specificity,
2550   won on source order). */
2551
2552a.nbindex__title-link {
2553  color: #262626;
2554  text-decoration: none;
2555}
2556
2557/* Overlay makes the whole row clickable while keeping the tag links (which sit
2558   above it via z-index) independently navigable. */
2559
2560.nbindex__title-link::after {
2561  content: '';
2562  position: absolute;
2563  inset: 0;
2564  border-radius: 8px;
2565}
2566
2567.nbindex__row:hover .nbindex__title-link {
2568  color: #ca4747;
2569}
2570
2571/* Metadata footer row, sits below the description. Above the row's click overlay
2572   via z-index so individual tags remain independently navigable. */
2573
2574.nbindex__tags {
2575  display: flex;
2576  align-items: center;
2577  gap: 14px;
2578  flex-wrap: wrap;
2579  margin-top: 2px;
2580  position: relative;
2581  z-index: 1;
2582}
2583
2584a.nbindex__tag,
2585a.nbindex__tag:visited,
2586a.nbindex__tag:active {
2587  font-family: var(--monospace);
2588  font-size: 10.5px;
2589  letter-spacing: 0.06em;
2590  text-transform: uppercase;
2591  color: #8a8a8a;
2592  text-decoration: none;
2593  transition: color 0.15s ease;
2594}
2595
2596a.nbindex__tag:hover {
2597  color: #ca4747;
2598}
2599
2600.nbindex__desc {
2601  font-family: var(--serif);
2602  font-size: 16px;
2603  line-height: 1.5;
2604  color: #5f5f5f;
2605  max-width: 640px;
2606  margin: 0;
2607}
2608
2609/* Narrow screens: keep the thumbnail (smaller) and tighten the title. Touch
2610   devices don't hover, so the grayscale->color reveal simply doesn't fire; the
2611   desaturated thumbnail is the resting state. */
2612
2613@media (max-width: 640px) {
2614  .nbindex {
2615    max-width: none;
2616  }
2617  .nbindex__row {
2618    grid-template-columns: 96px 1fr;
2619    gap: 16px;
2620  }
2621  .nbindex__thumbwrap {
2622    width: 96px;
2623    height: 54px;
2624  }
2625  .nbindex__title {
2626    font-size: 19px;
2627  }
2628}
2629
2630/* Description (hidden in grid, shown in list) */
2631
2632.index__description {
2633  display: none;
2634  font-size: 14px;
2635  line-height: 1.5;
2636  color: #666;
2637  margin: 8px 0 0 0;
2638}
2639
2640/* List view */
2641
2642.index--list {
2643  display: flex;
2644  flex-direction: column;
2645  gap: 16px;
2646  max-width: 800px;
2647}
2648
2649.index--list .index__item {
2650  display: flex;
2651  flex-direction: row;
2652  align-items: stretch;
2653  border-radius: 6px;
2654  border: 1px solid rgba(0, 0, 0, 0.05);
2655}
2656
2657.index--list .index__image-container {
2658  flex-shrink: 0;
2659  width: 180px;
2660}
2661
2662.index--list .index__content {
2663  flex: 1;
2664  padding: 12px 16px;
2665}
2666
2667.index--list .index__title {
2668  font-size: 17px;
2669  margin-bottom: 4px;
2670}
2671
2672.index--list .index__description {
2673  display: block;
2674}
2675
2676@media(max-width: 640px) {
2677  .index {
2678    grid-template-columns: 1fr;
2679    gap: 16px;
2680  }
2681  /* Force grid view styles even if index--list class is present */
2682  .index--list {
2683    display: grid;
2684    grid-template-columns: 1fr;
2685    gap: 16px;
2686    max-width: none;
2687  }
2688  .index--list .index__item {
2689    display: block;
2690    flex-direction: unset;
2691    align-items: unset;
2692    border-radius: 8px;
2693    border: 1px solid rgba(0, 0, 0, 0.06);
2694  }
2695  .index--list .index__image-container {
2696    width: 100%;
2697    flex-shrink: unset;
2698  }
2699  .index--list .index__content {
2700    flex: unset;
2701    padding: 16px;
2702  }
2703  .index--list .index__title {
2704    font-size: 15px;
2705    margin: 0 0 6px 0;
2706  }
2707  .index--list .index__description {
2708    display: none;
2709  }
2710  .resource-links {
2711    justify-content: flex-start;
2712  }
2713}
2714
2715/* Expandable component styles */
2716
2717.expandable-container {
2718  position: relative;
2719  width: 100%;
2720}
2721
2722.expandable-content {
2723  position: relative;
2724  z-index: 1;
2725}
2726
2727.expandable-content figure {
2728  margin: 0;
2729}
2730
2731.expandable-content.expanded {
2732  background: var(--theme-background);
2733}
2734
2735.expandable-overlay {
2736  position: fixed;
2737  top: 0;
2738  left: 0;
2739  width: 100%;
2740  height: 100%;
2741  background: rgba(0, 0, 0, 0.5);
2742  opacity: 0;
2743  pointer-events: none;
2744  transition: opacity 0.2s ease;
2745  z-index: 9998;
2746}
2747
2748/* Button bar container */
2749
2750.expandable-button-bar {
2751  position: absolute;
2752  display: flex;
2753  gap: 0;
2754  z-index: 1000;
2755  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
2756  border-radius: 4px;
2757  overflow: hidden;
2758  backdrop-filter: blur(8px);
2759}
2760
2761.expandable-toggle {
2762  width: 28px;
2763  height: 28px;
2764  border: none;
2765  border-radius: 0;
2766  background: var(--theme-background-alt);
2767  color: var(--theme-foreground-muted);
2768  font-size: 16px;
2769  cursor: pointer;
2770  display: flex;
2771  align-items: center;
2772  justify-content: center;
2773  transition: background 0.15s ease, color 0.15s ease;
2774  border-right: 1px solid var(--theme-foreground-faintest);
2775}
2776
2777.expandable-toggle:last-child {
2778  border-right: none;
2779}
2780
2781.expandable-toggle:hover {
2782  background: var(--theme-foreground-faintest);
2783  color: var(--theme-foreground);
2784}
2785
2786/* Floating controls panel */
2787
2788.expandable-controls-panel {
2789  position: fixed;
2790  z-index: 10000;
2791  background: var(--theme-background);
2792  border-radius: 8px;
2793  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
2794  overflow: hidden;
2795  max-width: min(360px, calc(100vw - 32px));
2796  max-height: calc(100vh - 32px);
2797}
2798
2799.expandable-controls-header {
2800  display: flex;
2801  align-items: center;
2802  justify-content: space-between;
2803  padding: 5px 10px;
2804  background: var(--theme-background-alt, #f5f5f5);
2805  border-bottom: 1px solid var(--theme-foreground-faintest, #e0e0e0);
2806  cursor: move;
2807  user-select: none;
2808  font-family: system-ui, -apple-system, sans-serif;
2809  font-size: 12px;
2810  font-weight: 500;
2811  color: var(--theme-foreground-muted, #555);
2812}
2813
2814.expandable-controls-toggle {
2815  border: none;
2816  background: none;
2817  cursor: pointer;
2818  font-size: 12px;
2819  color: var(--theme-foreground-muted, #666);
2820  padding: 4px 8px;
2821  border-radius: 4px;
2822  transition: background 0.15s ease;
2823}
2824
2825.expandable-controls-toggle:hover {
2826  background: var(--theme-foreground-faintest, rgba(0, 0, 0, 0.1));
2827}
2828
2829.expandable-controls-content {
2830  /* border-box so style.height set by the resize handler matches what
2831     offsetHeight reports — otherwise the 30 px of padding would be added
2832     on the first drag and the box would jump. */
2833  box-sizing: border-box;
2834  padding: 12px;
2835  padding-bottom: 18px; /* leave room for the resize grip */
2836  overflow-y: auto;
2837  min-height: 100px;
2838  max-height: calc(100vh - 100px);
2839  height: auto;
2840  display: flex;
2841  flex-direction: column;
2842  gap: 4px;
2843}
2844
2845/* Custom resize handle. CSS `resize: vertical` is broken on iOS Safari for
2846   non-textareas, so we render our own grip and drive height changes via
2847   Pointer Events (which unifies mouse + touch). */
2848
2849.expandable-controls-resize {
2850  position: absolute;
2851  bottom: 0;
2852  right: 0;
2853  width: 22px;
2854  height: 22px;
2855  cursor: ns-resize;
2856  touch-action: none;
2857  display: flex;
2858  align-items: flex-end;
2859  justify-content: flex-end;
2860  padding: 4px;
2861  color: var(--theme-foreground-muted, #888);
2862  opacity: 0.55;
2863}
2864
2865.expandable-controls-resize:hover { opacity: 1; }
2866
2867.expandable-controls-resize svg { display: block; }
2868
2869.expandable-controls-content details {
2870  margin: 4px 0;
2871}
2872
2873/* SDSS controls styling */
2874
2875.sdss-controls {
2876  max-width: 100%;
2877}
2878
2879.sdss-controls > div[id^="scope-"] {
2880  width: min(100%, 500px) !important;
2881}
2882
2883.sdss-controls .range {
2884  display: flex;
2885  align-items: center;
2886  gap: 8px;
2887}
2888
2889.sdss-controls .range-slider {
2890  flex: 1 1 auto;
2891}
2892
2893.sdss-controls .range-output {
2894  flex: 0 0 auto;
2895  min-width: 75px;
2896  text-align: right;
2897  font-variant-numeric: tabular-nums;
2898}
2899
2900/* Smooth theme transitions */
2901
2902html,
2903.container,
2904.index__item,
2905.index__active-filter {
2906  transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease, filter 0.3s ease;
2907}
2908
2909/* Theme toggle button */
2910
2911.nav-short {
2912  display: none;
2913}
2914
2915.theme-toggle {
2916  margin-left: auto;
2917  background: none;
2918  border: none;
2919  cursor: pointer;
2920  padding: 5px 8px;
2921  display: flex;
2922  align-items: center;
2923  color: white;
2924  flex-shrink: 0;
2925  filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.8));
2926}
2927
2928@media (max-width: 480px) {
2929  .nav-full { display: none; }
2930  .nav-short { display: inline; }
2931  nav .menu__item { padding: 5px 5px; }
2932}
2933
2934.theme-toggle__moon {
2935  display: none;
2936}
2937
2938html.theme-is-dark .theme-toggle__moon {
2939  display: block;
2940}
2941
2942html.theme-is-dark .theme-toggle__sun {
2943  display: none;
2944}
2945
2946/* SVG files loaded as <img> have hardcoded dark colors designed for light backgrounds.
2947   invert(1) flips dark→light; hue-rotate(180deg) compensates so colored elements
2948   return approximately to their original hue.
2949   html[data-dark]: light notebook forced dark — invert the light SVGs.
2950   html[data-light]: dark notebook forced light — the SVG is already dark, leave it alone
2951   (no rule needed; the filter only applies when explicitly dark). */
2952
2953html[data-dark] main img[src$=".svg"] {
2954  filter: invert(1) hue-rotate(180deg);
2955}
2956
2957/* Light mode override — applied to dark-themed notebooks when user wants light */
2958
2959html[data-light] {
2960  color-scheme: light;
2961
2962  /* theme-air.css base colors */
2963  --theme-foreground: #1b1e23;
2964  --theme-foreground-focus: #3b5fc0;
2965  --theme-background-a: #ffffff;
2966
2967  /* abstract-light.css derived values */
2968  --theme-background-b: color-mix(in srgb, var(--theme-foreground) 4%, var(--theme-background-a));
2969  --theme-background: var(--theme-background-a);
2970  --theme-background-alt: var(--theme-background-b);
2971  --theme-foreground-alt: color-mix(in srgb, var(--theme-foreground) 90%, var(--theme-background-a));
2972  --theme-foreground-muted: color-mix(in srgb, var(--theme-foreground) 60%, var(--theme-background-a));
2973  --theme-foreground-faint: color-mix(in srgb, var(--theme-foreground) 50%, var(--theme-background-a));
2974  --theme-foreground-fainter: color-mix(in srgb, var(--theme-foreground) 30%, var(--theme-background-a));
2975  --theme-foreground-faintest: color-mix(in srgb, var(--theme-foreground) 14%, var(--theme-background-a));
2976
2977  /* syntax-light.css overrides */
2978  --syntax-keyword: #e36209;
2979  --syntax-atom: #032f62;
2980  --syntax-literal: #6f42c1;
2981  --syntax-string: #22863a;
2982  --syntax-definition: #005cc5;
2983  --syntax-meta: #d73a49;
2984}
2985
2986/* Dark mode override — applied to light-themed notebooks when user wants dark */
2987
2988html[data-dark] {
2989  color-scheme: dark;
2990
2991  /* theme-ink.css base colors */
2992  --theme-foreground: #ebebeb;
2993  --theme-foreground-focus: oklch(0.712564 0.257662 265.758);
2994  --theme-background-b: #212121;
2995
2996  /* abstract-dark.css derived values */
2997  --theme-background-a: color-mix(in srgb, var(--theme-foreground) 4%, var(--theme-background-b));
2998  --theme-background: var(--theme-background-a);
2999  --theme-background-alt: var(--theme-background-b);
3000  --theme-foreground-alt: color-mix(in srgb, var(--theme-foreground) 90%, var(--theme-background-b));
3001  --theme-foreground-muted: color-mix(in srgb, var(--theme-foreground) 60%, var(--theme-background-b));
3002  --theme-foreground-faint: color-mix(in srgb, var(--theme-foreground) 50%, var(--theme-background-b));
3003  --theme-foreground-fainter: color-mix(in srgb, var(--theme-foreground) 30%, var(--theme-background-b));
3004  --theme-foreground-faintest: color-mix(in srgb, var(--theme-foreground) 14%, var(--theme-background-b));
3005
3006  /* syntax-dark.css overrides */
3007  --syntax-keyword: #ffa657;
3008  --syntax-atom: #a5d6ff;
3009  --syntax-literal: #d2a8ff;
3010  --syntax-string: #7ee787;
3011  --syntax-definition: #79c0ff;
3012  --syntax-meta: #ff7b72;
3013}
3014
3015html[data-dark] :is(main, .container) a[href],
3016html.theme-is-dark:not([data-light]) :is(main, .container) a[href] {
3017  color: #d55b5b;
3018}
3019
3020html[data-dark] body:has(header.has-image) main .observablehq--cell:first-child ul li a,
3021html.theme-is-dark:not([data-light]) body:has(header.has-image) main .observablehq--cell:first-child ul li a {
3022  color: #d55b5b;
3023}
3024
3025html[data-dark] :is(main, .container) h1[id] a[href],
3026html[data-dark] :is(main, .container) h2[id] a[href],
3027html[data-dark] :is(main, .container) h3[id] a[href],
3028html[data-dark] :is(main, .container) h4[id] a[href],
3029html[data-dark] :is(main, .container) h5[id] a[href],
3030html[data-dark] :is(main, .container) h6[id] a[href],
3031html.theme-is-dark:not([data-light]) :is(main, .container) h1[id] a[href],
3032html.theme-is-dark:not([data-light]) :is(main, .container) h2[id] a[href],
3033html.theme-is-dark:not([data-light]) :is(main, .container) h3[id] a[href],
3034html.theme-is-dark:not([data-light]) :is(main, .container) h4[id] a[href],
3035html.theme-is-dark:not([data-light]) :is(main, .container) h5[id] a[href],
3036html.theme-is-dark:not([data-light]) :is(main, .container) h6[id] a[href] {
3037  color: #ebebeb;
3038}
3039
3040html[data-dark] :is(main, .container) h1,
3041html[data-dark] :is(main, .container) h2,
3042html[data-dark] :is(main, .container) h3,
3043html[data-dark] :is(main, .container) h4,
3044html[data-dark] :is(main, .container) h5,
3045html[data-dark] :is(main, .container) h6,
3046html.theme-is-dark:not([data-light]) :is(main, .container) h1,
3047html.theme-is-dark:not([data-light]) :is(main, .container) h2,
3048html.theme-is-dark:not([data-light]) :is(main, .container) h3,
3049html.theme-is-dark:not([data-light]) :is(main, .container) h4,
3050html.theme-is-dark:not([data-light]) :is(main, .container) h5,
3051html.theme-is-dark:not([data-light]) :is(main, .container) h6 {
3052  color: #ebebeb;
3053}
3054
3055html[data-dark] main details[open] {
3056  border-left-color: #444;
3057}
3058
3059/* Index page dark overrides.
3060   Cards also appear in the "See also" section of notebook pages, and a notebook
3061   that declares a dark theme of its own (near-midnight, ink, ...) never gets
3062   data-dark: the theme script only sets that when it has to force a light
3063   notebook dark. So every card rule needs the theme-is-dark variant too. */
3064
3065html[data-dark] .index__item,
3066html.theme-is-dark:not([data-light]) .index__item {
3067  background: #222222;
3068  border-color: rgba(255, 255, 255, 0.08);
3069}
3070
3071html[data-dark] .index__item:hover,
3072html.theme-is-dark:not([data-light]) .index__item:hover {
3073  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
3074}
3075
3076html[data-dark] .index__image-container,
3077html.theme-is-dark:not([data-light]) .index__image-container {
3078  background: linear-gradient(135deg, #333 0%, #2a2a2a 100%);
3079}
3080
3081html[data-dark] .index__placeholder,
3082html.theme-is-dark:not([data-light]) .index__placeholder {
3083  background: linear-gradient(135deg, #333 0%, #2a2a2a 50%, #222 100%);
3084}
3085
3086html[data-dark] .index__placeholder::after,
3087html.theme-is-dark:not([data-light]) .index__placeholder::after {
3088  border-color: #555;
3089}
3090
3091html[data-dark] .index__title,
3092html.theme-is-dark:not([data-light]) .index__title {
3093  color: #ddd;
3094}
3095
3096html[data-dark] .index__item:hover .index__title-link,
3097html.theme-is-dark:not([data-light]) .index__item:hover .index__title-link {
3098  color: #d55b5b;
3099}
3100
3101html[data-dark] .index__date,
3102html.theme-is-dark:not([data-light]) .index__date {
3103  color: #999;
3104}
3105
3106html[data-dark] .index__tag {
3107  color: #ccc;
3108  background: #3a3a3a;
3109}
3110
3111html[data-dark] .index__tag:hover {
3112  background: #4a4a4a;
3113  color: #eee;
3114}
3115
3116html[data-dark] .container a.index__tag,
3117html[data-dark] .container a.index__tag:visited,
3118html[data-dark] .container a.index__tag:active,
3119html.theme-is-dark:not([data-light]) .container a.index__tag,
3120html.theme-is-dark:not([data-light]) .container a.index__tag:visited,
3121html.theme-is-dark:not([data-light]) .container a.index__tag:active {
3122  color: #ccc;
3123}
3124
3125html[data-dark] .container a.index__filter-remove,
3126html[data-dark] .container a.index__filter-remove:visited,
3127html[data-dark] .container a.index__filter-remove:active,
3128html.theme-is-dark:not([data-light]) .container a.index__filter-remove,
3129html.theme-is-dark:not([data-light]) .container a.index__filter-remove:visited,
3130html.theme-is-dark:not([data-light]) .container a.index__filter-remove:active {
3131  color: #fff;
3132}
3133
3134html[data-dark] .index__active-filter {
3135  background: #2a2a2a;
3136  border-color: rgba(255, 255, 255, 0.1);
3137}
3138
3139html[data-dark] .index__filter-label {
3140  color: #aaa;
3141}
3142
3143html[data-dark] .index__description,
3144html.theme-is-dark:not([data-light]) .index__description {
3145  color: #aaa;
3146}
3147
3148html[data-dark] .index--list .index__item,
3149html.theme-is-dark:not([data-light]) .index--list .index__item {
3150  border-color: rgba(255, 255, 255, 0.06);
3151}
3152
3153/* Notebooks index dark overrides. Mirrors the prototype's dark tokens. Uses both
3154   the data-dark (light notebook forced dark) and theme-is-dark:not([data-light])
3155   (notebook with its own dark theme) selector families, per the card convention. */
3156
3157html[data-dark] .nbindex__year,
3158html.theme-is-dark:not([data-light]) .nbindex__year {
3159  color: #e06b5b;
3160}
3161
3162html[data-dark] .nbindex__rule,
3163html.theme-is-dark:not([data-light]) .nbindex__rule {
3164  background: rgba(255, 255, 255, 0.08);
3165}
3166
3167html[data-dark] .nbindex__count,
3168html.theme-is-dark:not([data-light]) .nbindex__count {
3169  color: #5c5c5c;
3170}
3171
3172html[data-dark] .nbindex__row:hover,
3173html.theme-is-dark:not([data-light]) .nbindex__row:hover {
3174  background: rgba(255, 255, 255, 0.03);
3175}
3176
3177html[data-dark] .nbindex__date,
3178html.theme-is-dark:not([data-light]) .nbindex__date {
3179  color: #6f6f6f;
3180}
3181
3182html[data-dark] .nbindex__thumbwrap,
3183html.theme-is-dark:not([data-light]) .nbindex__thumbwrap {
3184  background: #262626;
3185}
3186
3187html[data-dark] .nbindex__thumb--empty,
3188html.theme-is-dark:not([data-light]) .nbindex__thumb--empty {
3189  background: linear-gradient(135deg, #333 0%, #262626 100%);
3190}
3191
3192html[data-dark] .container a.nbindex__title-link,
3193html.theme-is-dark:not([data-light]) .container a.nbindex__title-link {
3194  color: #ededed;
3195}
3196
3197html[data-dark] .container .nbindex__row:hover a.nbindex__title-link,
3198html.theme-is-dark:not([data-light]) .container .nbindex__row:hover a.nbindex__title-link {
3199  color: #f0897a;
3200}
3201
3202html[data-dark] .container a.nbindex__tag,
3203html[data-dark] .container a.nbindex__tag:visited,
3204html[data-dark] .container a.nbindex__tag:active,
3205html.theme-is-dark:not([data-light]) .container a.nbindex__tag,
3206html.theme-is-dark:not([data-light]) .container a.nbindex__tag:visited,
3207html.theme-is-dark:not([data-light]) .container a.nbindex__tag:active {
3208  color: #7d7d7d;
3209}
3210
3211html[data-dark] .nbindex__tag:hover,
3212html.theme-is-dark:not([data-light]) .nbindex__tag:hover {
3213  color: #f0897a;
3214}
3215
3216html[data-dark] .nbindex__desc,
3217html.theme-is-dark:not([data-light]) .nbindex__desc {
3218  color: #a2a2a2;
3219}
3220  </style>
3221  <style> main { max-width: 640px; }</style>
3222<meta name="generator" content="Observable Notebook Kit v2.2.0">  
3222<script type="module" crossorigin src="/assets/index-D6F8y5-P.js"></script>
3222
3223</head>
3224<body>
3225  <a href="#main-content" class="skip-link">Skip to main content</a>
3226  <nav class="menu" aria-label="Site navigation">
3227    <a class="menu__item" href="/"><span class="nav-full">rreusser.github.io</span><span class="nav-short">rreusser</span></a>
3228    <a class="menu__item" href="/notebooks/">notebooks</a>
3229    <a class="menu__item" href="/sketches/">sketches</a>
3230    <a class="menu__item" href="/trains-and-trails/">running</a>
3231    <button id="theme-toggle" class="menu__item theme-toggle" aria-label="Toggle dark mode" title="Toggle dark mode">
3232      <svg class="theme-toggle__moon" width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
3233        <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
3234      </svg>
3235      <svg class="theme-toggle__sun" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
3236        <circle cx="12" cy="12" r="5"></circle>
3237        <line x1="12" y1="1" x2="12" y2="3"></line>
3238        <line x1="12" y1="21" x2="12" y2="23"></line>
3239        <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
3240        <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
3241        <line x1="1" y1="12" x2="3" y2="12"></line>
3242        <line x1="21" y1="12" x2="23" y2="12"></line>
3243        <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
3244        <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
3245      </svg>
3246    </button>
3247  </nav>
3248  <header>
3249    <h1>notebooks</h1>
3250    <div class="byline">
3251      
3252      
3253    </div>
3254    <div class="resource-links">
3255    </div>
3256  </header>
3257  <div class="container">
3258    <article>
3259      <h1 class="sr-only">notebooks</h1>
3260      <main id="main-content"><div id="cell-2" class="observablehq observablehq--cell"><div><p>This page contains interactive notebooks on numerical computing, computer graphics, and whatever else may have been on my mind at various times over the last decade. I’m pretty indifferent toward some, but there are a few I’ve really kinda poured my heart into. Maybe you’ll find something interesting!</p>
3261<p>The notebooks are built with <a href="https://observablehq.com/notebook-kit/">Observable Notebook Kit</a>
3261. Most of them are migrated versions of original <a href="https://observablehq.com/@rreusser">Observable notebooks</a> or <a href="https://idyll-lang.org/docs">Idyll</a> documents. I’ve been trying to pull these experiments together into a more coherent form though, so that’s why you’ll find links to earlier versions of many of the notebooks. You can read more about the migration process in <a href="/notebooks/rewriting-my-website-in-observable-notebook-kit/">Rewriting My Website in Observable Notebook Kit</a>.</p>
3262<p>Comments? Questions? Contact me on <a rel="me" href="https://mathstodon.xyz/@rreusser">Mastodon</a> or <a rel="me" href="https://bsky.app/profile/rreusser.bsky.social">Bluesky</a> or on this site’s <a href="https://github.com/rreusser/rreusser.github.io/issues">GitHub issue tracker</a>.</p>
3263</div></div></main>
3264    </article>
3265      <div id="index-filter-container"></div>
3266      <div class="nbindex" id="index-list">
3267        <section class="nbindex__group" data-year="2026">
3268          <div class="nbindex__group-header">
3269            <span class="nbindex__year">2026</span>
3270            <span class="nbindex__rule"></span>
3271            <span class="nbindex__count" data-count="19 notebooks">19 notebooks</span>
3272          </div>
3273          <div class="nbindex__row" data-tags="writing,ai">
3274            <div class="nbindex__media">
3275              <div class="nbindex__thumbwrap">
3276                <img class="nbindex__thumb" src="/meta/intentional-anonymity.webp" alt="" width="128" height="72" loading="lazy">
3277              </div>
3278              <span class="nbindex__date">JUL 21, 2026</span>
3279            </div>
3280            <div class="nbindex__body">
3281              <h2 class="nbindex__title"><a href="intentional-anonymity/" class="nbindex__title-link">Intentional Anonymity</a></h2>
3282              <p class="nbindex__desc">Thoughts on anonymity, accidental and otherwise</p>
3283              <div class="nbindex__tags">
3284                <a href="/notebooks/?tag=writing" class="nbindex__tag" rel="nofollow">writing</a><a href="/notebooks/?tag=ai" class="nbindex__tag" rel="nofollow">ai</a>
3285              </div>
3286            </div>
3287          </div>
3288          <div class="nbindex__row" data-tags="maps,astronomy,data visualization">
3289            <div class="nbindex__media">
3290              <div class="nbindex__thumbwrap">
3291                <img class="nbindex__thumb" src="/meta/time-until-totality.webp" alt="" width="128" height="72" loading="lazy">
3292              </div>
3293              <span class="nbindex__date">JUL 14, 2026</span>
3294            </div>
3295            <div class="nbindex__body">
3296              <h2 class="nbindex__title"><a href="time-until-totality/" class="nbindex__title-link">Time Until Totality</a></h2>
3297              <p class="nbindex__desc">A world map colored by how long until each location next sees totality</p>
3298              <div class="nbindex__tags">
3299                <a href="/notebooks/?tag=maps" class="nbindex__tag" rel="nofollow">maps</a><a href="/notebooks/?tag=astronomy" class="nbindex__tag" rel="nofollow">astronomy</a><a href="/notebooks/?tag=data%20visualization" class="nbindex__tag" rel="nofollow">data visualization</a>
3300              </div>
3301            </div>
3302          </div>
3303          <div class="nbindex__row" data-tags="webgpu,pde,cellular-automata">
3304            <div class="nbindex__media">
3305              <div class="nbindex__thumbwrap">
3306                <img class="nbindex__thumb" src="/meta/smooth-life.webp" alt="" width="128" height="72" loading="lazy">
3307              </div>
3308              <span class="nbindex__date">JUL 9, 2026</span>
3309            </div>
3310            <div class="nbindex__body">
3311              <h2 class="nbindex__title"><a href="smooth-life/" class="nbindex__title-link">SmoothLife</a></h2>
3312              <p class="nbindex__desc">Conway's Game of Life generalized to a continuous domain, computed in WebGPU</p>
3313              <div class="nbindex__tags">
3314                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=pde" class="nbindex__tag" rel="nofollow">pde</a><a href="/notebooks/?tag=cellular-automata" class="nbindex__tag" rel="nofollow">cellular-automata</a>
3315              </div>
3316            </div>
3317          </div>
3318          <div class="nbindex__row" data-tags="webgpu,physics,ai,math">
3319            <div class="nbindex__media">
3320              <div class="nbindex__thumbwrap">
3321                <img class="nbindex__thumb" src="/meta/mobius-strip.webp" alt="" width="128" height="72" loading="lazy">
3322              </div>
3323              <span class="nbindex__date">MAY 17, 2026</span>
3324            </div>
3325            <div class="nbindex__body">
3326              <h2 class="nbindex__title"><a href="mobius-strip/" class="nbindex__title-link">An Elastic Möbius Strip</a></h2>
3327              <p class="nbindex__desc">Möbius strips as a test problem for doing some real linear algebra in the browser</p>
3328              <div class="nbindex__tags">
3329                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=physics" class="nbindex__tag" rel="nofollow">physics</a><a href="/notebooks/?tag=ai" class="nbindex__tag" rel="nofollow">ai</a><a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a>
3330              </div>
3331            </div>
3332          </div>
3333          <div class="nbindex__row" data-tags="math,webgpu">
3334            <div class="nbindex__media">
3335              <div class="nbindex__thumbwrap">
3336                <img class="nbindex__thumb" src="/meta/zooming-aperiodic-monotile.webp" alt="" width="128" height="72" loading="lazy">
3337              </div>
3338              <span class="nbindex__date">APR 28, 2026</span>
3339            </div>
3340            <div class="nbindex__body">
3341              <h2 class="nbindex__title"><a href="zooming-aperiodic-monotile/" class="nbindex__title-link">Zooming Aperiodic Monotile</a></h2>
3342              <p class="nbindex__desc">A (sort of) infinite zooming spectre aperiodic monotile</p>
3343              <div class="nbindex__tags">
3344                <a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a><a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a>
3345              </div>
3346            </div>
3347          </div>
3348          <div class="nbindex__row" data-tags="math,webgpu">
3349            <div class="nbindex__media">
3350              <div class="nbindex__thumbwrap">
3351                <img class="nbindex__thumb" src="/meta/aperiodic-monotile.webp" alt="" width="128" height="72" loading="lazy">
3352              </div>
3353              <span class="nbindex__date">APR 25, 2026</span>
3354            </div>
3355            <div class="nbindex__body">
3356              <h2 class="nbindex__title"><a href="aperiodic-monotile/" class="nbindex__title-link">Rendering the Aperiodic Monotile</a></h2>
3357              <p class="nbindex__desc">Rendering the spectre a chiral aperiodic monotile of Smith, Myers, Kaplan, and Goodman-Strauss</p>
3358              <div class="nbindex__tags">
3359                <a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a><a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a>
3360              </div>
3361            </div>
3362          </div>
3363          <div class="nbindex__row" data-tags="maps,webgpu,graphics">
3364            <div class="nbindex__media">
3365              <div class="nbindex__thumbwrap">
3366                <img class="nbindex__thumb" src="/meta/line-sweep-terrain-lighting.webp" alt="" width="128" height="72" loading="lazy">
3367              </div>
3368              <span class="nbindex__date">APR 19, 2026</span>
3369            </div>
3370            <div class="nbindex__body">
3371              <h2 class="nbindex__title"><a href="line-sweep-terrain-lighting/" class="nbindex__title-link">Line-Sweep Terrain Lighting</a></h2>
3372              <p class="nbindex__desc">Terrain shadowing and ambient occlusion for web maps using fast horizon visibility</p>
3373              <div class="nbindex__tags">
3374                <a href="/notebooks/?tag=maps" class="nbindex__tag" rel="nofollow">maps</a><a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=graphics" class="nbindex__tag" rel="nofollow">graphics</a>
3375              </div>
3376            </div>
3377          </div>
3378          <div class="nbindex__row" data-tags="webgpu,math">
3379            <div class="nbindex__media">
3380              <div class="nbindex__thumbwrap">
3381                <img class="nbindex__thumb" src="/meta/costa-surface.webp" alt="" width="128" height="72" loading="lazy">
3382              </div>
3383              <span class="nbindex__date">MAR 17, 2026</span>
3384            </div>
3385            <div class="nbindex__body">
3386              <h2 class="nbindex__title"><a href="costa-surface/" class="nbindex__title-link">Costa's Minimal Surface</a></h2>
3387              <p class="nbindex__desc">Trying to untangle the parameterization of Costa's minimal surface</p>
3388              <div class="nbindex__tags">
3389                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a>
3390              </div>
3391            </div>
3392          </div>
3393          <div class="nbindex__row" data-tags="webgpu,physics">
3394            <div class="nbindex__media">
3395              <div class="nbindex__thumbwrap">
3396                <img class="nbindex__thumb" src="/meta/kerr-geodesics.webp" alt="" width="128" height="72" loading="lazy">
3397              </div>
3398              <span class="nbindex__date">MAR 15, 2026</span>
3399            </div>
3400            <div class="nbindex__body">
3401              <h2 class="nbindex__title"><a href="kerr-geodesics/" class="nbindex__title-link">Geodesics in Kerr Spacetime</a></h2>
3402              <p class="nbindex__desc">Plotting and raytracing geodesics around a spinning black hold</p>
3403              <div class="nbindex__tags">
3404                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=physics" class="nbindex__tag" rel="nofollow">physics</a>
3405              </div>
3406            </div>
3407          </div>
3408          <div class="nbindex__row" data-tags="programming,meta">
3409            <div class="nbindex__media">
3410              <div class="nbindex__thumbwrap">
3411                <img class="nbindex__thumb" src="/meta/rewriting-my-website-in-observable-notebook-kit.webp" alt="" width="128" height="72" loading="lazy">
3412              </div>
3413              <span class="nbindex__date">MAR 11, 2026</span>
3414            </div>
3415            <div class="nbindex__body">
3416              <h2 class="nbindex__title"><a href="rewriting-my-website-in-observable-notebook-kit/" class="nbindex__title-link">Rewriting My Website in Observable Notebook Kit</a></h2>
3417              <p class="nbindex__desc">How I migrated this website from Idyll to Observable Notebook Kit</p>
3418              <div class="nbindex__tags">
3419                <a href="/notebooks/?tag=programming" class="nbindex__tag" rel="nofollow">programming</a><a href="/notebooks/?tag=meta" class="nbindex__tag" rel="nofollow">meta</a>
3420              </div>
3421            </div>
3422          </div>
3423          <div class="nbindex__row" data-tags="webgpu,math">
3424            <div class="nbindex__media">
3425              <div class="nbindex__thumbwrap">
3426                <img class="nbindex__thumb" src="/meta/boys-surface.webp" alt="" width="128" height="72" loading="lazy">
3427              </div>
3428              <span class="nbindex__date">FEB 28, 2026</span>
3429            </div>
3430            <div class="nbindex__body">
3431              <h2 class="nbindex__title"><a href="boys-surface/" class="nbindex__title-link">Boy's Surface</a></h2>
3432              <p class="nbindex__desc">Boy's surface, an immersion of the real projective plane in three-dimensional Euclidean space</p>
3433              <div class="nbindex__tags">
3434                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a>
3435              </div>
3436            </div>
3437          </div>
3438          <div class="nbindex__row" data-tags="webgpu,graphics,maps">
3439            <div class="nbindex__media">
3440              <div class="nbindex__thumbwrap">
3441                <img class="nbindex__thumb" src="/meta/denali.webp" alt="" width="128" height="72" loading="lazy">
3442              </div>
3443              <span class="nbindex__date">FEB 8, 2026</span>
3444            </div>
3445            <div class="nbindex__body">
3446              <h2 class="nbindex__title"><a href="denali/" class="nbindex__title-link">Denali Terrain</a></h2>
3447              <p class="nbindex__desc">Cobbling together a 3D WebGPU terrain viewer</p>
3448              <div class="nbindex__tags">
3449                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=graphics" class="nbindex__tag" rel="nofollow">graphics</a><a href="/notebooks/?tag=maps" class="nbindex__tag" rel="nofollow">maps</a>
3450              </div>
3451            </div>
3452          </div>
3453          <div class="nbindex__row" data-tags="webgpu,astronomy,data visualization">
3454            <div class="nbindex__media">
3455              <div class="nbindex__thumbwrap">
3456                <img class="nbindex__thumb" src="/meta/visualizing-sloan-digital-sky-survey-data.webp" alt="" width="128" height="72" loading="lazy">
3457              </div>
3458              <span class="nbindex__date">FEB 1, 2026</span>
3459            </div>
3460            <div class="nbindex__body">
3461              <h2 class="nbindex__title"><a href="visualizing-sloan-digital-sky-survey-data/" class="nbindex__title-link">Visualizing Sloan Digital Sky Survey Data</a></h2>
3462              <p class="nbindex__desc">Visualizing 3.3 million galaxies and quasars from the Sloan Digital Sky Survey</p>
3463              <div class="nbindex__tags">
3464                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=astronomy" class="nbindex__tag" rel="nofollow">astronomy</a><a href="/notebooks/?tag=data%20visualization" class="nbindex__tag" rel="nofollow">data visualization</a>
3465              </div>
3466            </div>
3467          </div>
3468          <div class="nbindex__row" data-tags="physics,aerodynamics">
3469            <div class="nbindex__media">
3470              <div class="nbindex__thumbwrap">
3471                <img class="nbindex__thumb" src="/meta/hess-smith-panel-solver.webp" alt="" width="128" height="72" loading="lazy">
3472              </div>
3473              <span class="nbindex__date">JAN 25, 2026</span>
3474            </div>
3475            <div class="nbindex__body">
3476              <h2 class="nbindex__title"><a href="hess-smith-panel-solver/" class="nbindex__title-link">Hess-Smith Panel Method</a></h2>
3477              <p class="nbindex__desc">Using the Hess-Smith panel method to compute the aerodynamic flow around an airfoil</p>
3478              <div class="nbindex__tags">
3479                <a href="/notebooks/?tag=physics" class="nbindex__tag" rel="nofollow">physics</a><a href="/notebooks/?tag=aerodynamics" class="nbindex__tag" rel="nofollow">aerodynamics</a>
3480              </div>
3481            </div>
3482          </div>
3483          <div class="nbindex__row" data-tags="webgpu,pde">
3484            <div class="nbindex__media">
3485              <div class="nbindex__thumbwrap">
3486                <img class="nbindex__thumb" src="/meta/multiscale-turing-patterns.webp" alt="" width="128" height="72" loading="lazy">
3487              </div>
3488              <span class="nbindex__date">JAN 20, 2026</span>
3489            </div>
3490            <div class="nbindex__body">
3491              <h2 class="nbindex__title"><a href="multiscale-turing-patterns/" class="nbindex__title-link">Multi-Scale Turing Patterns in WebGPU</a></h2>
3492              <p class="nbindex__desc">Interactive multi-scale Turing patterns in WebGPU</p>
3493              <div class="nbindex__tags">
3494                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=pde" class="nbindex__tag" rel="nofollow">pde</a>
3495              </div>
3496            </div>
3497          </div>
3498          <div class="nbindex__row" data-tags="webgpu,chaos">
3499            <div class="nbindex__media">
3500              <div class="nbindex__thumbwrap">
3501                <img class="nbindex__thumb" src="/meta/strange-attractors-in-webgpu.webp" alt="" width="128" height="72" loading="lazy">
3502              </div>
3503              <span class="nbindex__date">JAN 17, 2026</span>
3504            </div>
3505            <div class="nbindex__body">
3506              <h2 class="nbindex__title"><a href="strange-attractors-in-webgpu/" class="nbindex__title-link">Strange Attractors in WebGPU</a></h2>
3507              <p class="nbindex__desc">Integrating and rendering strange attractors in WebGPU from start to finish</p>
3508              <div class="nbindex__tags">
3509                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=chaos" class="nbindex__tag" rel="nofollow">chaos</a>
3510              </div>
3511            </div>
3512          </div>
3513          <div class="nbindex__row" data-tags="webgpu,graphics">
3514            <div class="nbindex__media">
3515              <div class="nbindex__thumbwrap">
3516                <img class="nbindex__thumb" src="/meta/webgpu-lines.webp" alt="" width="128" height="72" loading="lazy">
3517              </div>
3518              <span class="nbindex__date">JAN 16, 2026</span>
3519            </div>
3520            <div class="nbindex__body">
3521              <h2 class="nbindex__title"><a href="webgpu-lines/" class="nbindex__title-link">WebGPU Instanced Lines</a></h2>
3522              <p class="nbindex__desc">GPU-accelerated line rendering for WebGPU</p>
3523              <div class="nbindex__tags">
3524                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=graphics" class="nbindex__tag" rel="nofollow">graphics</a>
3525              </div>
3526            </div>
3527          </div>
3528          <div class="nbindex__row" data-tags="tutorial,programming">
3529            <div class="nbindex__media">
3530              <div class="nbindex__thumbwrap">
3531                <img class="nbindex__thumb" src="/meta/plot-with-zoom.webp" alt="" width="128" height="72" loading="lazy">
3532              </div>
3533              <span class="nbindex__date">JAN 13, 2026</span>
3534            </div>
3535            <div class="nbindex__body">
3536              <h2 class="nbindex__title"><a href="plot-with-zoom/" class="nbindex__title-link">Zoomable Multi-Layer Plots in Notebook Kit</a></h2>
3537              <p class="nbindex__desc">Interactive mathematical plotting in Observable Notebook Kit</p>
3538              <div class="nbindex__tags">
3539                <a href="/notebooks/?tag=tutorial" class="nbindex__tag" rel="nofollow">tutorial</a><a href="/notebooks/?tag=programming" class="nbindex__tag" rel="nofollow">programming</a>
3540              </div>
3541            </div>
3542          </div>
3543          <div class="nbindex__row" data-tags="webgpu,pde">
3544            <div class="nbindex__media">
3545              <div class="nbindex__thumbwrap">
3546                <img class="nbindex__thumb" src="/meta/simulating-the-2d-kuramoto-sivashinsky-equation-in-webgpu.webp" alt="" width="128" height="72" loading="lazy">
3547              </div>
3548              <span class="nbindex__date">JAN 10, 2026</span>
3549            </div>
3550            <div class="nbindex__body">
3551              <h2 class="nbindex__title"><a href="simulating-the-2d-kuramoto-sivashinsky-equation-in-webgpu/" class="nbindex__title-link">Simulating the 2D Kuramoto-Sivashinsky Equation in WebGPU</a></h2>
3552              <p class="nbindex__desc">The 2D Kuramoto-Sivashinsky equation, a chaotic PDE modeling pattern formation in combustion fronts and thin films</p>
3553              <div class="nbindex__tags">
3554                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=pde" class="nbindex__tag" rel="nofollow">pde</a>
3555              </div>
3556            </div>
3557          </div>
3558        </section>
3559        <section class="nbindex__group" data-year="2025">
3560          <div class="nbindex__group-header">
3561            <span class="nbindex__year">2025</span>
3562            <span class="nbindex__rule"></span>
3563            <span class="nbindex__count" data-count="5 notebooks">5 notebooks</span>
3564          </div>
3565          <div class="nbindex__row" data-tags="webgl,pde">
3566            <div class="nbindex__media">
3567              <div class="nbindex__thumbwrap">
3568                <img class="nbindex__thumb" src="/meta/perfectly-matched-layers-for-the-wave-equation.webp" alt="" width="128" height="72" loading="lazy">
3569              </div>
3570              <span class="nbindex__date">DEC 31, 2025</span>
3571            </div>
3572            <div class="nbindex__body">
3573              <h2 class="nbindex__title"><a href="perfectly-matched-layers-for-the-wave-equation/" class="nbindex__title-link">Perfectly Matched Layers for the Wave Equation</a></h2>
3574              <p class="nbindex__desc">An quick application of Perfectly Matched Layers for absorbing boundary conditions</p>
3575              <div class="nbindex__tags">
3576                <a href="/notebooks/?tag=webgl" class="nbindex__tag" rel="nofollow">webgl</a><a href="/notebooks/?tag=pde" class="nbindex__tag" rel="nofollow">pde</a>
3577              </div>
3578            </div>
3579          </div>
3580          <div class="nbindex__row" data-tags="writing,data visualization">
3581            <div class="nbindex__media">
3582              <div class="nbindex__thumbwrap">
3583                <img class="nbindex__thumb" src="/meta/reflecting-on-two-years-of-yoga.webp" alt="" width="128" height="72" loading="lazy">
3584              </div>
3585              <span class="nbindex__date">DEC 27, 2025</span>
3586            </div>
3587            <div class="nbindex__body">
3588              <h2 class="nbindex__title"><a href="reflecting-on-two-years-of-yoga/" class="nbindex__title-link">Reflecting on Two Years of Yoga</a></h2>
3589              <p class="nbindex__desc">Contemplating where we're at after attending yoga pretty consistently for a couple years</p>
3590              <div class="nbindex__tags">
3591                <a href="/notebooks/?tag=writing" class="nbindex__tag" rel="nofollow">writing</a><a href="/notebooks/?tag=data%20visualization" class="nbindex__tag" rel="nofollow">data visualization</a>
3592              </div>
3593            </div>
3594          </div>
3595          <div class="nbindex__row" data-tags="writing">
3596            <div class="nbindex__media">
3597              <div class="nbindex__thumbwrap">
3598                <img class="nbindex__thumb" src="/meta/of-noise-and-neighbors.jpg" alt="" width="128" height="72" loading="lazy">
3599              </div>
3600              <span class="nbindex__date">SEP 29, 2025</span>
3601            </div>
3602            <div class="nbindex__body">
3603              <h2 class="nbindex__title"><a href="of-noise-and-neighbors/" class="nbindex__title-link">Of Noise and Neighbors</a></h2>
3604              <p class="nbindex__desc">A brief window into two years of strife with a neighbor</p>
3605              <div class="nbindex__tags">
3606                <a href="/notebooks/?tag=writing" class="nbindex__tag" rel="nofollow">writing</a>
3607              </div>
3608            </div>
3609          </div>
3610          <div class="nbindex__row" data-tags="tutorial,meta">
3611            <div class="nbindex__media">
3612              <div class="nbindex__thumbwrap">
3613                <img class="nbindex__thumb" src="/meta/hello-observable-notebooks-2.webp" alt="" width="128" height="72" loading="lazy">
3614              </div>
3615              <span class="nbindex__date">AUG 3, 2025</span>
3616            </div>
3617            <div class="nbindex__body">
3618              <h2 class="nbindex__title"><a href="hello-observable-notebooks-2/" class="nbindex__title-link">Hello, Observable Notebooks 2.0!</a></h2>
3619              <p class="nbindex__desc">Kicking the tires of Observable's new notebook tooling!</p>
3620              <div class="nbindex__tags">
3621                <a href="/notebooks/?tag=tutorial" class="nbindex__tag" rel="nofollow">tutorial</a><a href="/notebooks/?tag=meta" class="nbindex__tag" rel="nofollow">meta</a>
3622              </div>
3623            </div>
3624          </div>
3625          <div class="nbindex__row" data-tags="chaos">
3626            <div class="nbindex__media">
3627              <div class="nbindex__thumbwrap">
3628                <img class="nbindex__thumb" src="/meta/clifford-and-de-jong-attractors.webp" alt="" width="128" height="72" loading="lazy">
3629              </div>
3630              <span class="nbindex__date">MAY 16, 2025</span>
3631            </div>
3632            <div class="nbindex__body">
3633              <h2 class="nbindex__title"><a href="clifford-and-de-jong-attractors/" class="nbindex__title-link">Clifford and de Jong Attractors</a></h2>
3634              <p class="nbindex__desc">Clifford and de Jong strange attractors</p>
3635              <div class="nbindex__tags">
3636                <a href="/notebooks/?tag=chaos" class="nbindex__tag" rel="nofollow">chaos</a>
3637              </div>
3638            </div>
3639          </div>
3640        </section>
3641        <section class="nbindex__group" data-year="2024">
3642          <div class="nbindex__group-header">
3643            <span class="nbindex__year">2024</span>
3644            <span class="nbindex__rule"></span>
3645            <span class="nbindex__count" data-count="3 notebooks">3 notebooks</span>
3646          </div>
3647          <div class="nbindex__row" data-tags="chaos,physics,webgl,webgpu">
3648            <div class="nbindex__media">
3649              <div class="nbindex__thumbwrap">
3650                <img class="nbindex__thumb" src="/meta/chaotic-magnetic-pendulum.webp" alt="" width="128" height="72" loading="lazy">
3651              </div>
3652              <span class="nbindex__date">AUG 7, 2024</span>
3653            </div>
3654            <div class="nbindex__body">
3655              <h2 class="nbindex__title"><a href="chaotic-magnetic-pendulum/" class="nbindex__title-link">Chaotic Magnetic Pendulum</a></h2>
3656              <p class="nbindex__desc">Interactive visualization of a magnetic pendulum demonstrating chaotic dynamics</p>
3657              <div class="nbindex__tags">
3658                <a href="/notebooks/?tag=chaos" class="nbindex__tag" rel="nofollow">chaos</a><a href="/notebooks/?tag=physics" class="nbindex__tag" rel="nofollow">physics</a><a href="/notebooks/?tag=webgl" class="nbindex__tag" rel="nofollow">webgl</a><a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a>
3659              </div>
3660            </div>
3661          </div>
3662          <div class="nbindex__row" data-tags="personal,data visualization">
3663            <div class="nbindex__media">
3664              <div class="nbindex__thumbwrap">
3665                <img class="nbindex__thumb" src="/meta/spring-training.webp" alt="" width="128" height="72" loading="lazy">
3666              </div>
3667              <span class="nbindex__date">JUN 8, 2024</span>
3668            </div>
3669            <div class="nbindex__body">
3670              <h2 class="nbindex__title"><a href="spring-training/" class="nbindex__title-link">Spring Training on the Treadmill</a></h2>
3671              <p class="nbindex__desc">Quantifying treadmill efforts (to the point of injury)</p>
3672              <div class="nbindex__tags">
3673                <a href="/notebooks/?tag=personal" class="nbindex__tag" rel="nofollow">personal</a><a href="/notebooks/?tag=data%20visualization" class="nbindex__tag" rel="nofollow">data visualization</a>
3674              </div>
3675            </div>
3676          </div>
3677          <div class="nbindex__row" data-tags="data visualization">
3678            <div class="nbindex__media">
3679              <div class="nbindex__thumbwrap">
3680                <img class="nbindex__thumb" src="/meta/speed-climbing-world-record-progression.webp" alt="" width="128" height="72" loading="lazy">
3681              </div>
3682              <span class="nbindex__date">MAY 3, 2024</span>
3683            </div>
3684            <div class="nbindex__body">
3685              <h2 class="nbindex__title"><a href="speed-climbing-world-record-progression/" class="nbindex__title-link">Speed Climbing World Record Progression</a></h2>
3686              <p class="nbindex__desc">Plotting and extrapolating trends in competitive speed climbing</p>
3687              <div class="nbindex__tags">
3688                <a href="/notebooks/?tag=data%20visualization" class="nbindex__tag" rel="nofollow">data visualization</a>
3689              </div>
3690            </div>
3691          </div>
3692        </section>
3693        <section class="nbindex__group" data-year="2023">
3694          <div class="nbindex__group-header">
3695            <span class="nbindex__year">2023</span>
3696            <span class="nbindex__rule"></span>
3697            <span class="nbindex__count" data-count="4 notebooks">4 notebooks</span>
3698          </div>
3699          <div class="nbindex__row" data-tags="algorithms,image processing">
3700            <div class="nbindex__media">
3701              <div class="nbindex__thumbwrap">
3702                <img class="nbindex__thumb" src="/meta/sliced-optimal-transport.webp" alt="" width="128" height="72" loading="lazy">
3703              </div>
3704              <span class="nbindex__date">NOV 28, 2023</span>
3705            </div>
3706            <div class="nbindex__body">
3707              <h2 class="nbindex__title"><a href="sliced-optimal-transport/" class="nbindex__title-link">Sliced Optimal Transport</a></h2>
3708              <p class="nbindex__desc">Approximate pixel redistribution between images using sliced optimal transport</p>
3709              <div class="nbindex__tags">
3710                <a href="/notebooks/?tag=algorithms" class="nbindex__tag" rel="nofollow">algorithms</a>
3710<a href="/notebooks/?tag=image%20processing" class="nbindex__tag" rel="nofollow">image processing</a>
3711              </div>
3712            </div>
3713          </div>
3714          <div class="nbindex__row" data-tags="math,numerics">
3715            <div class="nbindex__media">
3716              <div class="nbindex__thumbwrap">
3717                <img class="nbindex__thumb" src="/meta/shanks-transformation.webp" alt="" width="128" height="72" loading="lazy">
3718              </div>
3719              <span class="nbindex__date">SEP 23, 2023</span>
3720            </div>
3721            <div class="nbindex__body">
3722              <h2 class="nbindex__title"><a href="shanks-transformation/" class="nbindex__title-link">Series Acceleration with Shanks Transformation</a></h2>
3723              <p class="nbindex__desc">The Shanks transformation for series acceleration, applied to the arctangent formula for π</p>
3724              <div class="nbindex__tags">
3725                <a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a><a href="/notebooks/?tag=numerics" class="nbindex__tag" rel="nofollow">numerics</a>
3726              </div>
3727            </div>
3728          </div>
3729          <div class="nbindex__row" data-tags="math">
3730            <div class="nbindex__media">
3731              <div class="nbindex__thumbwrap">
3732                <img class="nbindex__thumb" src="/meta/cubic-basis-vs-hermite-interpolation.webp" alt="" width="128" height="72" loading="lazy">
3733              </div>
3734              <span class="nbindex__date">MAY 13, 2023</span>
3735            </div>
3736            <div class="nbindex__body">
3737              <h2 class="nbindex__title"><a href="cubic-basis-vs-hermite-interpolation/" class="nbindex__title-link">Cubic basis vs. Hermite interpolation</a></h2>
3738              <p class="nbindex__desc">Comparing cubic interpolation using different basis functions</p>
3739              <div class="nbindex__tags">
3740                <a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a>
3741              </div>
3742            </div>
3743          </div>
3744          <div class="nbindex__row" data-tags="webgl,graphics">
3745            <div class="nbindex__media">
3746              <div class="nbindex__thumbwrap">
3747                <img class="nbindex__thumb" src="/meta/bicubic-texture-interpolation-using-linear-filtering.webp" alt="" width="128" height="72" loading="lazy">
3748              </div>
3749              <span class="nbindex__date">JAN 6, 2023</span>
3750            </div>
3751            <div class="nbindex__body">
3752              <h2 class="nbindex__title"><a href="bicubic-texture-interpolation-using-linear-filtering/" class="nbindex__title-link">Bicubic Texture Interpolation using Linear Filtering</a></h2>
3753              <p class="nbindex__desc">Smooth bicubic texture filtering using the GPU's built-in bilinear interpolation</p>
3754              <div class="nbindex__tags">
3755                <a href="/notebooks/?tag=webgl" class="nbindex__tag" rel="nofollow">webgl</a><a href="/notebooks/?tag=graphics" class="nbindex__tag" rel="nofollow">graphics</a>
3756              </div>
3757            </div>
3758          </div>
3759        </section>
3760        <section class="nbindex__group" data-year="2022">
3761          <div class="nbindex__group-header">
3762            <span class="nbindex__year">2022</span>
3763            <span class="nbindex__rule"></span>
3764            <span class="nbindex__count" data-count="4 notebooks">4 notebooks</span>
3765          </div>
3766          <div class="nbindex__row" data-tags="math,physics">
3767            <div class="nbindex__media">
3768              <div class="nbindex__thumbwrap">
3769                <img class="nbindex__thumb" src="/meta/knocking-down-the-gates-with-jacobi.webp" alt="" width="128" height="72" loading="lazy">
3770              </div>
3771              <span class="nbindex__date">NOV 16, 2022</span>
3772            </div>
3773            <div class="nbindex__body">
3774              <h2 class="nbindex__title"><a href="knocking-down-the-gates-with-jacobi/" class="nbindex__title-link">Knocking Down the Gates with our Friend Jacobi</a></h2>
3775              <p class="nbindex__desc">Using Jacobi elliptic functions to solve an optimization problem about falling poles and large-amplitude pendulum dynamics</p>
3776              <div class="nbindex__tags">
3777                <a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a><a href="/notebooks/?tag=physics" class="nbindex__tag" rel="nofollow">physics</a>
3778              </div>
3779            </div>
3780          </div>
3781          <div class="nbindex__row" data-tags="maps">
3782            <div class="nbindex__media">
3783              <div class="nbindex__thumbwrap">
3784                <img class="nbindex__thumb" src="/meta/night-and-day.webp" alt="" width="128" height="72" loading="lazy">
3785              </div>
3786              <span class="nbindex__date">OCT 24, 2022</span>
3787            </div>
3788            <div class="nbindex__body">
3789              <h2 class="nbindex__title"><a href="night-and-day/" class="nbindex__title-link">Night and Day</a></h2>
3790              <p class="nbindex__desc">Earth's solar terminator on a Mapbox map using NASA Black Marble imagery and WebGL shaders</p>
3791              <div class="nbindex__tags">
3792                <a href="/notebooks/?tag=maps" class="nbindex__tag" rel="nofollow">maps</a>
3793              </div>
3794            </div>
3795          </div>
3796          <div class="nbindex__row" data-tags="math,webgl">
3797            <div class="nbindex__media">
3798              <div class="nbindex__thumbwrap">
3799                <img class="nbindex__thumb" src="/meta/fast-generalized-winding-numbers-in-2d.webp" alt="" width="128" height="72" loading="lazy">
3800              </div>
3801              <span class="nbindex__date">SEP 7, 2022</span>
3802            </div>
3803            <div class="nbindex__body">
3804              <h2 class="nbindex__title"><a href="fast-generalized-winding-numbers-in-2d/" class="nbindex__title-link">Fast Generalized Winding Numbers in 2D</a></h2>
3805              <p class="nbindex__desc">Fast generalized winding numbers in 2D for robust inside-outside queries on arbitrary polygons</p>
3806              <div class="nbindex__tags">
3807                <a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a><a href="/notebooks/?tag=webgl" class="nbindex__tag" rel="nofollow">webgl</a>
3808              </div>
3809            </div>
3810          </div>
3811          <div class="nbindex__row" data-tags="css,physics,chaos">
3812            <div class="nbindex__media">
3813              <div class="nbindex__thumbwrap">
3814                <img class="nbindex__thumb" src="/meta/pure-css-periodic-three-body-orbits.webp" alt="" width="128" height="72" loading="lazy">
3815              </div>
3816              <span class="nbindex__date">FEB 26, 2022</span>
3817            </div>
3818            <div class="nbindex__body">
3819              <h2 class="nbindex__title"><a href="pure-css-periodic-three-body-orbits/" class="nbindex__title-link">HTML+CSS Periodic Three-Body Orbits</a></h2>
3820              <p class="nbindex__desc">Animating periodic three-body orbits using pure CSS keyframe animations generated from Fourier decomposition</p>
3821              <div class="nbindex__tags">
3822                <a href="/notebooks/?tag=css" class="nbindex__tag" rel="nofollow">css</a><a href="/notebooks/?tag=physics" class="nbindex__tag" rel="nofollow">physics</a><a href="/notebooks/?tag=chaos" class="nbindex__tag" rel="nofollow">chaos</a>
3823              </div>
3824            </div>
3825          </div>
3826        </section>
3827        <section class="nbindex__group" data-year="2021">
3828          <div class="nbindex__group-header">
3829            <span class="nbindex__year">2021</span>
3830            <span class="nbindex__rule"></span>
3831            <span class="nbindex__count" data-count="4 notebooks">4 notebooks</span>
3832          </div>
3833          <div class="nbindex__row" data-tags="webgpu,math">
3834            <div class="nbindex__media">
3835              <div class="nbindex__thumbwrap">
3836                <img class="nbindex__thumb" src="/meta/lawsons-klein-bottle.webp" alt="" width="128" height="72" loading="lazy">
3837              </div>
3838              <span class="nbindex__date">SEP 18, 2021</span>
3839            </div>
3840            <div class="nbindex__body">
3841              <h2 class="nbindex__title"><a href="lawsons-klein-bottle/" class="nbindex__title-link">Lawson's Klein Bottle</a></h2>
3842              <p class="nbindex__desc">Lawson's Klein bottle, a generalization of the Clifford torus in 4D space</p>
3843              <div class="nbindex__tags">
3844                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a>
3845              </div>
3846            </div>
3847          </div>
3848          <div class="nbindex__row" data-tags="math,numerics">
3849            <div class="nbindex__media">
3850              <div class="nbindex__thumbwrap">
3851                <img class="nbindex__thumb" src="/meta/computing-pi-with-the-bailey-borwein-plouffe-formula.webp" alt="" width="128" height="72" loading="lazy">
3852              </div>
3853              <span class="nbindex__date">MAY 24, 2021</span>
3854            </div>
3855            <div class="nbindex__body">
3856              <h2 class="nbindex__title"><a href="computing-pi-with-the-bailey-borwein-plouffe-formula/" class="nbindex__title-link">Computing π with the Bailey-Borwein-Plouffe Formula</a></h2>
3857              <p class="nbindex__desc">Computing hexadecimal digits of π at arbitrary positions using the Bailey-Borwein-Plouffe formula</p>
3858              <div class="nbindex__tags">
3859                <a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a><a href="/notebooks/?tag=numerics" class="nbindex__tag" rel="nofollow">numerics</a>
3860              </div>
3861            </div>
3862          </div>
3863          <div class="nbindex__row" data-tags="chaos,physics,webgl">
3864            <div class="nbindex__media">
3865              <div class="nbindex__thumbwrap">
3866                <img class="nbindex__thumb" src="/meta/double-pendulum-map.webp" alt="" width="128" height="72" loading="lazy">
3867              </div>
3868              <span class="nbindex__date">MAY 14, 2021</span>
3869            </div>
3870            <div class="nbindex__body">
3871              <h2 class="nbindex__title"><a href="double-pendulum-map/" class="nbindex__title-link">The Double Pendulum Map</a></h2>
3872              <p class="nbindex__desc">Visualizing the phase space of simple and compound double pendulums</p>
3873              <div class="nbindex__tags">
3874                <a href="/notebooks/?tag=chaos" class="nbindex__tag" rel="nofollow">chaos</a><a href="/notebooks/?tag=physics" class="nbindex__tag" rel="nofollow">physics</a><a href="/notebooks/?tag=webgl" class="nbindex__tag" rel="nofollow">webgl</a>
3875              </div>
3876            </div>
3877          </div>
3878          <div class="nbindex__row" data-tags="chaos,physics">
3879            <div class="nbindex__media">
3880              <div class="nbindex__thumbwrap">
3881                <img class="nbindex__thumb" src="/meta/malkus-waterwheel.webp" alt="" width="128" height="72" loading="lazy">
3882              </div>
3883              <span class="nbindex__date">FEB 13, 2021</span>
3884            </div>
3885            <div class="nbindex__body">
3886              <h2 class="nbindex__title"><a href="malkus-waterwheel/" class="nbindex__title-link">Malkus Waterwheel</a></h2>
3887              <p class="nbindex__desc">A chaotic mechanical system whose dynamics map to the Lorenz attractor</p>
3888              <div class="nbindex__tags">
3889                <a href="/notebooks/?tag=chaos" class="nbindex__tag" rel="nofollow">chaos</a><a href="/notebooks/?tag=physics" class="nbindex__tag" rel="nofollow">physics</a>
3890              </div>
3891            </div>
3892          </div>
3893        </section>
3894        <section class="nbindex__group" data-year="2020">
3895          <div class="nbindex__group-header">
3896            <span class="nbindex__year">2020</span>
3897            <span class="nbindex__rule"></span>
3898            <span class="nbindex__count" data-count="6 notebooks">6 notebooks</span>
3899          </div>
3900          <div class="nbindex__row" data-tags="webgl,graphics">
3901            <div class="nbindex__media">
3902              <div class="nbindex__thumbwrap">
3903                <img class="nbindex__thumb" src="/meta/point-cloud-point-opacity.webp" alt="" width="128" height="72" loading="lazy">
3904              </div>
3905              <span class="nbindex__date">DEC 8, 2020</span>
3906            </div>
3907            <div class="nbindex__body">
3908              <h2 class="nbindex__title"><a href="point-cloud-point-opacity/" class="nbindex__title-link">Selecting the Right Opacity for 2D Point Clouds</a></h2>
3909              <p class="nbindex__desc">An opacity formula for consistent visual appearance in brute-force point cloud rendering</p>
3910              <div class="nbindex__tags">
3911                <a href="/notebooks/?tag=webgl" class="nbindex__tag" rel="nofollow">webgl</a><a href="/notebooks/?tag=graphics" class="nbindex__tag" rel="nofollow">graphics</a>
3912              </div>
3913            </div>
3914          </div>
3915          <div class="nbindex__row" data-tags="webgl,graphics">
3916            <div class="nbindex__media">
3917              <div class="nbindex__thumbwrap">
3918                <img class="nbindex__thumb" src="/meta/adaptive-contouring-in-fragment-shaders.webp" alt="" width="128" height="72" loading="lazy">
3919              </div>
3920              <span class="nbindex__date">NOV 21, 2020</span>
3921            </div>
3922            <div class="nbindex__body">
3923              <h2 class="nbindex__title"><a href="adaptive-contouring-in-fragment-shaders/" class="nbindex__title-link">Adaptive Contouring in Fragment Shaders</a></h2>
3924              <p class="nbindex__desc">Adaptive contour rendering in fragment shaders using screen-space derivatives for smooth, resolution-independent contour lines</p>
3925              <div class="nbindex__tags">
3926                <a href="/notebooks/?tag=webgl" class="nbindex__tag" rel="nofollow">webgl</a><a href="/notebooks/?tag=graphics" class="nbindex__tag" rel="nofollow">graphics</a>
3927              </div>
3928            </div>
3929          </div>
3930          <div class="nbindex__row" data-tags="webgpu,algorithms">
3931            <div class="nbindex__media">
3932              <div class="nbindex__thumbwrap">
3933                <img class="nbindex__thumb" src="/meta/webgpu-voronoi-diagrams-using-the-jump-flooding-algorithm.webp" alt="" width="128" height="72" loading="lazy">
3934              </div>
3935              <span class="nbindex__date">JUL 9, 2020</span>
3936            </div>
3937            <div class="nbindex__body">
3938              <h2 class="nbindex__title"><a href="webgpu-voronoi-diagrams-using-the-jump-flooding-algorithm/" class="nbindex__title-link">WebGPU Voronoi Diagrams using the Jump Flooding Algorithm</a></h2>
3939              <p class="nbindex__desc">Computing Voronoi diagrams and distance fields on the GPU using the Jump Flooding Algorithm</p>
3940              <div class="nbindex__tags">
3941                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=algorithms" class="nbindex__tag" rel="nofollow">algorithms</a>
3942              </div>
3943            </div>
3944          </div>
3945          <div class="nbindex__row" data-tags="math,webgl">
3946            <div class="nbindex__media">
3947              <div class="nbindex__thumbwrap">
3948                <img class="nbindex__thumb" src="/meta/sphere-eversion.webp" alt="" width="128" height="72" loading="lazy">
3949              </div>
3950              <span class="nbindex__date">JUN 29, 2020</span>
3951            </div>
3952            <div class="nbindex__body">
3953              <h2 class="nbindex__title"><a href="sphere-eversion/" class="nbindex__title-link">Sphere Eversion</a></h2>
3954              <p class="nbindex__desc">The Bednorz and Bednorz analytic sphere eversion, a continuous deformation turning a sphere inside out without creasing or tearing</p>
3955              <div class="nbindex__tags">
3956                <a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a><a href="/notebooks/?tag=webgl" class="nbindex__tag" rel="nofollow">webgl</a>
3957              </div>
3958            </div>
3959          </div>
3960          <div class="nbindex__row" data-tags="webgpu,graphics">
3961            <div class="nbindex__media">
3962              <div class="nbindex__thumbwrap">
3963                <img class="nbindex__thumb" src="/meta/transparency-for-3d-surfaces.webp" alt="" width="128" height="72" loading="lazy">
3964              </div>
3965              <span class="nbindex__date">JUN 13, 2020</span>
3966            </div>
3967            <div class="nbindex__body">
3968              <h2 class="nbindex__title"><a href="transparency-for-3d-surfaces/" class="nbindex__title-link">Transparency for 3D Surfaces</a></h2>
3969              <p class="nbindex__desc">A comparison of three approaches to rendering transparent 3D surfaces in WebGPU</p>
3970              <div class="nbindex__tags">
3971                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=graphics" class="nbindex__tag" rel="nofollow">graphics</a>
3972              </div>
3973            </div>
3974          </div>
3975          <div class="nbindex__row" data-tags="math">
3976            <div class="nbindex__media">
3977              <div class="nbindex__thumbwrap">
3978                <img class="nbindex__thumb" src="/meta/charmin-nanotubes-and-toiletpaperfullerenes.webp" alt="" width="128" height="72" loading="lazy">
3979              </div>
3980              <span class="nbindex__date">MAY 1, 2020</span>
3981            </div>
3982            <div class="nbindex__body">
3983              <h2 class="nbindex__title"><a href="charmin-nanotubes-and-toiletpaperfullerenes/" class="nbindex__title-link">Toiletpaperfullerenes and Charmin Nanotubes</a></h2>
3984              <p class="nbindex__desc">Constructing fullerenes with toilet paper tubes</p>
3985              <div class="nbindex__tags">
3986                <a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a>
3987              </div>
3988            </div>
3989          </div>
3990        </section>
3991        <section class="nbindex__group" data-year="2019">
3992          <div class="nbindex__group-header">
3993            <span class="nbindex__year">2019</span>
3994            <span class="nbindex__rule"></span>
3995            <span class="nbindex__count" data-count="3 notebooks">3 notebooks</span>
3996          </div>
3997          <div class="nbindex__row" data-tags="webgpu,physics,pde">
3998            <div class="nbindex__media">
3999              <div class="nbindex__thumbwrap">
4000                <img class="nbindex__thumb" src="/meta/particle-mesh-gravity.webp" alt="" width="128" height="72" loading="lazy">
4001              </div>
4002              <span class="nbindex__date">NOV 3, 2019</span>
4003            </div>
4004            <div class="nbindex__body">
4005              <h2 class="nbindex__title"><a href="particle-mesh-gravity/" class="nbindex__title-link">Particle-Mesh Gravity in WebGPU</a></h2>
4006              <p class="nbindex__desc">2D gravitational N-body simulation using the particle-mesh method</p>
4007              <div class="nbindex__tags">
4008                <a href="/notebooks/?tag=webgpu" class="nbindex__tag" rel="nofollow">webgpu</a><a href="/notebooks/?tag=physics" class="nbindex__tag" rel="nofollow">physics</a><a href="/notebooks/?tag=pde" class="nbindex__tag" rel="nofollow">pde</a>
4009              </div>
4010            </div>
4011          </div>
4012          <div class="nbindex__row" data-tags="chaos,physics,webgl">
4013            <div class="nbindex__media">
4014              <div class="nbindex__thumbwrap">
4015                <img class="nbindex__thumb" src="/meta/periodic-planar-three-body-orbits.webp" alt="" width="128" height="72" loading="lazy">
4016              </div>
4017              <span class="nbindex__date">SEP 1, 2019</span>
4018            </div>
4019            <div class="nbindex__body">
4020              <h2 class="nbindex__title"><a href="periodic-planar-three-body-orbits/" class="nbindex__title-link">Periodic Planar Three-Body Orbits</a></h2>
4021              <p class="nbindex__desc">A catalog of periodic three-body orbits with topological classification via free group words</p>
4022              <div class="nbindex__tags">
4023                <a href="/notebooks/?tag=chaos" class="nbindex__tag" rel="nofollow">chaos</a><a href="/notebooks/?tag=physics" class="nbindex__tag" rel="nofollow">physics</a><a href="/notebooks/?tag=webgl" class="nbindex__tag" rel="nofollow">webgl</a>
4024              </div>
4025            </div>
4026          </div>
4027          <div class="nbindex__row" data-tags="generative,gallery">
4028            <div class="nbindex__media">
4029              <div class="nbindex__thumbwrap">
4030                <img class="nbindex__thumb" src="/meta/multi-scale-turing-pattern-gallery-2.webp" alt="" width="128" height="72" loading="lazy">
4031              </div>
4032              <span class="nbindex__date">MAR 15, 2019</span>
4033            </div>
4034            <div class="nbindex__body">
4035              <h2 class="nbindex__title"><a href="multi-scale-turing-pattern-gallery-2/" class="nbindex__title-link">Multi-Scale Turing Pattern Gallery 2</a></h2>
4036              <p class="nbindex__desc">Another gallery of multi-scale Turing patterns</p>
4037              <div class="nbindex__tags">
4038                <a href="/notebooks/?tag=generative" class="nbindex__tag" rel="nofollow">generative</a><a href="/notebooks/?tag=gallery" class="nbindex__tag" rel="nofollow">gallery</a>
4039              </div>
4040            </div>
4041          </div>
4042        </section>
4043        <section class="nbindex__group" data-year="2018">
4044          <div class="nbindex__group-header">
4045            <span class="nbindex__year">2018</span>
4046            <span class="nbindex__rule"></span>
4047            <span class="nbindex__count" data-count="2 notebooks">2 notebooks</span>
4048          </div>
4049          <div class="nbindex__row" data-tags="generative,gallery">
4050            <div class="nbindex__media">
4051              <div class="nbindex__thumbwrap">
4052                <img class="nbindex__thumb" src="/meta/multi-scale-turing-pattern-gallery-1.webp" alt="" width="128" height="72" loading="lazy">
4053              </div>
4054              <span class="nbindex__date">OCT 19, 2018</span>
4055            </div>
4056            <div class="nbindex__body">
4057              <h2 class="nbindex__title"><a href="multi-scale-turing-pattern-gallery-1/" class="nbindex__title-link">Multi-Scale Turing Pattern Gallery 1</a></h2>
4058              <p class="nbindex__desc">A gallery of multi-scale Turing patterns</p>
4059              <div class="nbindex__tags">
4060                <a href="/notebooks/?tag=generative" class="nbindex__tag" rel="nofollow">generative</a><a href="/notebooks/?tag=gallery" class="nbindex__tag" rel="nofollow">gallery</a>
4061              </div>
4062            </div>
4063          </div>
4064          <div class="nbindex__row" data-tags="math">
4065            <div class="nbindex__media">
4066              <div class="nbindex__thumbwrap">
4067                <img class="nbindex__thumb" src="/meta/aligning-3d-scans.webp" alt="" width="128" height="72" loading="lazy">
4068              </div>
4069              <span class="nbindex__date">JUL 28, 2018</span>
4070            </div>
4071            <div class="nbindex__body">
4072              <h2 class="nbindex__title"><a href="aligning-3d-scans/" class="nbindex__title-link">Aligning 3D Scans</a></h2>
4073              <p class="nbindex__desc">Automatically orienting 3D scans by computing principal axes from surface normals</p>
4074              <div class="nbindex__tags">
4075                <a href="/notebooks/?tag=math" class="nbindex__tag" rel="nofollow">math</a>
4076              </div>
4077            </div>
4078          </div>
4079        </section>
4080        <section class="nbindex__group" data-year="2016">
4081          <div class="nbindex__group-header">
4082            <span class="nbindex__year">2016</span>
4083            <span class="nbindex__rule"></span>
4084            <span class="nbindex__count" data-count="1 notebook">1 notebook</span>
4085          </div>
4086          <div class="nbindex__row" data-tags="programming">
4087            <div class="nbindex__media">
4088              <div class="nbindex__thumbwrap">
4089                <img class="nbindex__thumb" src="/meta/things-i-learned-the-hard-way-using-react-native.webp" alt="" width="128" height="72" loading="lazy">
4090              </div>
4091              <span class="nbindex__date">MAY 5, 2016</span>
4092            </div>
4093            <div class="nbindex__body">
4094              <h2 class="nbindex__title"><a href="things-i-learned-the-hard-way-using-react-native/" class="nbindex__title-link">Things I Learned the Hard Way Using React Native</a></h2>
4095              <p class="nbindex__desc">An obsolete collection of lessons learned from eight months of React Native development</p>
4096              <div class="nbindex__tags">
4097                <a href="/notebooks/?tag=programming" class="nbindex__tag" rel="nofollow">programming</a>
4098              </div>
4099            </div>
4100          </div>
4101        </section>
4102        <section class="nbindex__group" data-year="2015">
4103          <div class="nbindex__group-header">
4104            <span class="nbindex__year">2015</span>
4105            <span class="nbindex__rule"></span>
4106            <span class="nbindex__count" data-count="1 notebook">1 notebook</span>
4107          </div>
4108          <div class="nbindex__row" data-tags="writing,programming">
4109            <div class="nbindex__media">
4110              <div class="nbindex__thumbwrap">
4111                <img class="nbindex__thumb" src="/meta/a-series-of-unfortunate-things-i-programmed-one-time.webp" alt="" width="128" height="72" loading="lazy">
4112              </div>
4113              <span class="nbindex__date">MAR 16, 2015</span>
4114            </div>
4115            <div class="nbindex__body">
4116              <h2 class="nbindex__title"><a href="a-series-of-unfortunate-things-i-programmed-one-time/" class="nbindex__title-link">A Series of Unfortunate Things I Programmed One Time</a></h2>
4117              <p class="nbindex__desc">Reflections on a decade of programming projects</p>
4118              <div class="nbindex__tags">
4119                <a href="/notebooks/?tag=writing" class="nbindex__tag" rel="nofollow">writing</a><a href="/notebooks/?tag=programming" class="nbindex__tag" rel="nofollow">programming</a>
4120              </div>
4121            </div>
4122          </div>
4123        </section>
4124      </div>
4125      
4125<script>
4126        (function() {
4127          const urlParams = new URLSearchParams(window.location.search);
4128          const activeTag = urlParams.get('tag');
4129          if (!activeTag) return;
4130
4131          // Show filter indicator
4132          const filterContainer = document.getElementById('index-filter-container');
4133          filterContainer.innerHTML = `
4134            <div class="index__active-filter">
4135              <span class="index__filter-label">Filtered by:</span>
4136              <span class="index__filter-tag">
4137                ${activeTag}
4138                <a href="./" class="index__filter-remove" aria-label="Remove filter">×</a>
4139              </span>
4140            </div>
4141          `;
4142
4143          // Filter rows (case-insensitive), then update per-year counts and hide
4144          // year groups that end up empty.
4145          const activeTagLower = activeTag.toLowerCase();
4146          document.querySelectorAll('.nbindex__group').forEach(group => {
4147            let visible = 0;
4148            group.querySelectorAll('.nbindex__row').forEach(row => {
4149              const tags = (row.dataset.tags || '').split(',').filter(Boolean);
4150              const match = tags.some(t => t.toLowerCase() === activeTagLower);
4151              row.style.display = match ? '' : 'none';
4152              if (match) visible++;
4153            });
4154            if (visible === 0) {
4155              group.style.display = 'none';
4156            } else {
4157              const count = group.querySelector('.nbindex__count');
4158              if (count) count.textContent = `${visible} notebook${visible === 1 ? '' : 's'}`;
4159            }
4160          });
4161        })();
4162      </script>
4162
4163
4164  </div>
4165  <footer>
4166    <div class="footer__attrib">© 2026 Ricky Reusser</div>
4167    <a href="/feed.xml" class="footer__rss">
4168      <svg class="icon" viewBox="0 0 24 24" fill="currentColor" width="14" height="14">
4169        <circle cx="6.5" cy="17.5" r="2.5"></circle>
4170        <path d="M4 4a16 16 0 0 1 16 16h-4A12 12 0 0 0 4 8V4z"></path>
4171        <path d="M4 10a10 10 0 0 1 10 10h-4a6 6 0 0 0-6-6v-4z"></path>
4172      </svg>
4173      RSS
4174    </a>
4175  </footer>
4176  
4176<script>
4177    (function() {
4178      const DARK_THEMES = new Set(['ink', 'midnight', 'near-midnight', 'deep-space', 'ocean-floor', 'coffee', 'slate']);
4179      const html = document.documentElement;
4180      const notebookDark = DARK_THEMES.has(html.dataset.notebookTheme);
4181      document.getElementById('theme-toggle').addEventListener('click', function() {
4182        const wantDark = !html.classList.contains('theme-is-dark');
4183        delete html.dataset.dark;
4184        delete html.dataset.light;
4185        if (wantDark && !notebookDark) html.dataset.dark = '';
4186        else if (!wantDark && notebookDark) html.dataset.light = '';
4187        html.classList.toggle('theme-is-dark', wantDark);
4188        localStorage.setItem('theme', wantDark ? 'dark' : 'light');
4189      });
4190    })();
4191  </script>
4191
4192
4193
4194<style type="text/css">:root {
4195  --syntax-link: var(--theme-foreground-focus);
4196  --syntax-keyword: #e36209;
4197  --syntax-atom: #032f62;
4198  --syntax-literal: #6f42c1;
4199  --syntax-string: #22863a;
4200  --syntax-comment: var(--theme-foreground-muted);
4201  --syntax-invalid: var(--theme-error);
4202  --syntax-definition: #005cc5;
4203  --syntax-variable: var(--theme-foreground-alt);
4204  --syntax-meta: #d73a49;
4205}
4206
4207:root {
4208  --theme-background-b: color-mix(in srgb, var(--theme-foreground) 4%, var(--theme-background-a));
4209  --theme-background: var(--theme-background-a);
4210  --theme-background-alt: var(--theme-background-b);
4211  --theme-foreground-alt: color-mix(in srgb, var(--theme-foreground) 90%, var(--theme-background-a));
4212  --theme-foreground-muted: color-mix(in srgb, var(--theme-foreground) 60%, var(--theme-background-a));
4213  --theme-foreground-faint: color-mix(in srgb, var(--theme-foreground) 50%, var(--theme-background-a));
4214  --theme-foreground-fainter: color-mix(in srgb, var(--theme-foreground) 30%, var(--theme-background-a));
4215  --theme-foreground-faintest: color-mix(in srgb, var(--theme-foreground) 14%, var(--theme-background-a));
4216  --theme-error: #e7040f;
4217  color-scheme: light;
4218}
4219
4220:root {
4221  --theme-foreground: #1b1e23;
4222  --theme-foreground-focus: #3b5fc0;
4223  --theme-background-a: #ffffff;
4224}
4225</style></body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.