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 & 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 & Computing"> 25 <meta property="og:title" content="Interactive Notebooks on Graphics, Math & 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,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) 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,d09GRgABAAAAAAY4AA8AAAAAB6gAAQABAAAAAAAAAAAAAAAAAAAAAAAAAABHREVGAAABWAAAACEAAAAmADcAEkdQT1MAAAF8AAAAiAAAAL7Z3N4IR1NVQgAAAgQAAAA5AAAAOu2e8oxPUy8yAAACQAAAAFAAAABgcwDDDVNUQVQAAAKQAAAASQAAAFpe4k
1486MxY21hcAAAAtwAAABAAAAAXCHOHuFnYXNwAAADHAAAABAAAAAQABUAI2dseWYAAAMsAAAA/gAAAP4NiO3kaGVhZAAABCwAAAA2AAAANiBi6pdoaGVhAAAEZAAAACIAAAAkD1wHHmhtdHgAAASIAAAAIAAAACAcYgPtbG9jYQAABKgAAAAQAAAAEgC8AIdtYXhwAAAEuAAAABwAAAAgACcBCG5hbWUAAATUAAABIQAAAlw0v114cG9zdAAABfgAAABAAAAAUqA7+9d42mNgZGBi4GOAAAkgj42BCUgyAzEjUIQDTLMDAAYPAEoAAAB42hyJJQICQBRE3yzuTt5IIlPRgssBcHfn5iT0yygC/OTo4CpVaj3s6HFcY2fHyQo7nwyP2PXgvMXiBHi/MYAwm8FxRXKz2qwIA0J/BEMWNz6iCD8g3IAX0fiuKBBEOJF5ujP4AP1bJ/w5QxrxmQxMFas06zaw6Wwg00Ek01wWD7AIOwCrExOOeNpjYGRgYOBisABCVhc3nxAGleTKohwGhfSi1GwGhYzUpCIGhZzEkjwGBQYQYAER//+DSAAw7gsEAAAAeNpjYGGJZJzAwMrAwGrMcvb/fYZZIJphBtNZBiOmSQxIwIGBgRmZ7+7v787YyMAgf4+j9+8KBgaOf0zdDAyM80FyLB6s24CUAgMLADA2EDV42h3EAQaEUBgGwPn+shbAWrAWBKBLRVQEeHSNDtThosGIeOvwfR7VMbc14VjWFrK1aU+vvHwMgsrPjE5U/jmpC1GkF26DNwewAAAAeNpjYGBgAmJmIBYBkoxgmoXBA0jzMXAA5diALF4GBYYF8r7y9/7/B/JQ+Yz/v/5//D/1wc4HmkDdKAAAJN4Q4gABAAMACAAKAA0AB///AA8AAgCW/+wFggXNABQAKQAABSImAjU0PgQzMgARFA4EJzI+BDU0JiMiDgQVFBYWArGw8XotVn+kx3T2ARUoUHigyHNWkndbPiC9p1aUel1AIVakFIwBAK196tGtfkX+z/7xeefQrX5GlTxskq/CZcjeOWmQr8RphL5mAP//AKn/7Ab4Bc0AJwAEAXYAAAAHAAf+vP+hAAIB7QTGA/MGKAALACAAAAE1PgI3MwcOAgcHJiY1NDY2MzIWFRQGBgcGBhUUFhcCzxQpJxGvARpGTSaQS1cbOCsjLyA1IQEBLysE2BkpYmkxFS1mZy8SClxMMVAvKSghLRgCBAkFHiwGAAAAAAEAAAADAMU+83x4Xw889QALCAAAAAAA2czC0wAAAADhe9up/CL93AnVCH8AAgAGAAIAAAAAAAB42mNgZGDg6P27goGBs+iP0h8RzqvMLxiuMiADDgCtsgeLAAAEzQDBAAAAAAIUAAACFAAABcQAlgIUAAAHOgCpBFsB7XjaY0AAWyD0YqgHAARLAUR42mNgZGBg4GCYwCDGUMbACuYhADMDIwAbSQEweNp90DVSRUEQQNGLu2a4u0sECe6uKd/9z1MkZR1ExCyBRZGjXUXjUmNnfKaBCq7JIye/BLjJqVTnUMuDOpdy7tR5THKrzqeVK3UB9VyqC2kmrK5kktFX50A5neocSqlX5yPnq+vFlepGEewRIYZPmgAOWxgcMuI0xyQI4xEXRcQxkYcUSRZTjEhyCeGQwMITD+OK0wxjcIgxwjZLbEhtESHLPgGpXYZYxROnSRDiiAgOrtiQpZUJhhmVNPG+r/V9Z+uXnR8rp1lmW9Ky6N/bvvjn+fMYLC5w3v/byjijSBEdECdC66/v2sHBkCRCCNnFLD4SLQwOMk/ve+RcjV2MBLICnyDDhDBkkFGMpBhpIkRFWTxcRjB6p6s39r0AKOlYcgAAAHjaY2BiYPj/BYjnMBgxYAMcDAyMTIzMDMwMRowsjKyMbCx+oT4+TM5B7KV5mQYGjgYg2tDNxAVCu7gCALBpDKg=) 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.