diff --git a/docs/api.html b/docs/api.html
index 940c7a4..56eae2d 100644
--- a/docs/api.html
+++ b/docs/api.html
@@ -10,8 +10,8 @@
-
-
+
+
diff --git a/docs/blend-modes.html b/docs/blend-modes.html
index ca9c294..3942d06 100644
--- a/docs/blend-modes.html
+++ b/docs/blend-modes.html
@@ -10,8 +10,8 @@
-
-
+
+
diff --git a/docs/examples.html b/docs/examples.html
index a2c0c0b..3610d8f 100644
--- a/docs/examples.html
+++ b/docs/examples.html
@@ -10,8 +10,8 @@
-
-
+
+
diff --git a/docs/index.html b/docs/index.html
index 08c86da..dba5ca7 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -10,8 +10,8 @@
-
-
+
+
diff --git a/docs/operations.html b/docs/operations.html
index f193568..8020161 100644
--- a/docs/operations.html
+++ b/docs/operations.html
@@ -10,8 +10,8 @@
-
-
+
+
diff --git a/docs/previews/brightness.jpg b/docs/previews/brightness.jpg
index b6d7540..0483e41 100644
Binary files a/docs/previews/brightness.jpg and b/docs/previews/brightness.jpg differ
diff --git a/docs/previews/chaining.jpg b/docs/previews/chaining.jpg
index d248669..65953e3 100644
Binary files a/docs/previews/chaining.jpg and b/docs/previews/chaining.jpg differ
diff --git a/docs/previews/color_burn.jpg b/docs/previews/color_burn.jpg
index 04a6c5f..057b6d0 100644
Binary files a/docs/previews/color_burn.jpg and b/docs/previews/color_burn.jpg differ
diff --git a/docs/previews/color_dodge.jpg b/docs/previews/color_dodge.jpg
index 838b110..6226857 100644
Binary files a/docs/previews/color_dodge.jpg and b/docs/previews/color_dodge.jpg differ
diff --git a/docs/previews/contrast.jpg b/docs/previews/contrast.jpg
index d7ea213..db09665 100644
Binary files a/docs/previews/contrast.jpg and b/docs/previews/contrast.jpg differ
diff --git a/docs/previews/curve_red.jpg b/docs/previews/curve_red.jpg
index 260482a..422410a 100644
Binary files a/docs/previews/curve_red.jpg and b/docs/previews/curve_red.jpg differ
diff --git a/docs/previews/curve_rgb.jpg b/docs/previews/curve_rgb.jpg
index dd8901c..4346c00 100644
Binary files a/docs/previews/curve_rgb.jpg and b/docs/previews/curve_rgb.jpg differ
diff --git a/docs/previews/darken.jpg b/docs/previews/darken.jpg
index da4196b..b56996d 100644
Binary files a/docs/previews/darken.jpg and b/docs/previews/darken.jpg differ
diff --git a/docs/previews/grayscale.jpg b/docs/previews/grayscale.jpg
index a209b6c..9e4df11 100644
Binary files a/docs/previews/grayscale.jpg and b/docs/previews/grayscale.jpg differ
diff --git a/docs/previews/hard_light.jpg b/docs/previews/hard_light.jpg
index a2ea5b0..3878e4e 100644
Binary files a/docs/previews/hard_light.jpg and b/docs/previews/hard_light.jpg differ
diff --git a/docs/previews/hue.jpg b/docs/previews/hue.jpg
index 7a81d0c..da79676 100644
Binary files a/docs/previews/hue.jpg and b/docs/previews/hue.jpg differ
diff --git a/docs/previews/lighten.jpg b/docs/previews/lighten.jpg
index 44251aa..8b76413 100644
Binary files a/docs/previews/lighten.jpg and b/docs/previews/lighten.jpg differ
diff --git a/docs/previews/lightness.jpg b/docs/previews/lightness.jpg
index d105a3b..c2375d4 100644
Binary files a/docs/previews/lightness.jpg and b/docs/previews/lightness.jpg differ
diff --git a/docs/previews/linear_burn.jpg b/docs/previews/linear_burn.jpg
index 3f15ca3..c1570aa 100644
Binary files a/docs/previews/linear_burn.jpg and b/docs/previews/linear_burn.jpg differ
diff --git a/docs/previews/linear_dodge.jpg b/docs/previews/linear_dodge.jpg
index edbe0d4..0bcf075 100644
Binary files a/docs/previews/linear_dodge.jpg and b/docs/previews/linear_dodge.jpg differ
diff --git a/docs/previews/linear_light.jpg b/docs/previews/linear_light.jpg
index 9e28704..ad5f438 100644
Binary files a/docs/previews/linear_light.jpg and b/docs/previews/linear_light.jpg differ
diff --git a/docs/previews/multiply.jpg b/docs/previews/multiply.jpg
index 371a5ed..5fc92cd 100644
Binary files a/docs/previews/multiply.jpg and b/docs/previews/multiply.jpg differ
diff --git a/docs/previews/overlay.jpg b/docs/previews/overlay.jpg
index 47dd2c6..2163157 100644
Binary files a/docs/previews/overlay.jpg and b/docs/previews/overlay.jpg differ
diff --git a/docs/previews/pin_light.jpg b/docs/previews/pin_light.jpg
index 471ca63..99ad3e1 100644
Binary files a/docs/previews/pin_light.jpg and b/docs/previews/pin_light.jpg differ
diff --git a/docs/previews/resize.jpg b/docs/previews/resize.jpg
index b25d68c..ff59fe7 100644
Binary files a/docs/previews/resize.jpg and b/docs/previews/resize.jpg differ
diff --git a/docs/previews/saturation.jpg b/docs/previews/saturation.jpg
index c32fec0..30f1a03 100644
Binary files a/docs/previews/saturation.jpg and b/docs/previews/saturation.jpg differ
diff --git a/docs/previews/screen.jpg b/docs/previews/screen.jpg
index fa25aba..120f9b5 100644
Binary files a/docs/previews/screen.jpg and b/docs/previews/screen.jpg differ
diff --git a/docs/previews/soft_light.jpg b/docs/previews/soft_light.jpg
index 707357a..8401f54 100644
Binary files a/docs/previews/soft_light.jpg and b/docs/previews/soft_light.jpg differ
diff --git a/docs/previews/vivid_light.jpg b/docs/previews/vivid_light.jpg
index e768c97..7d51ef3 100644
Binary files a/docs/previews/vivid_light.jpg and b/docs/previews/vivid_light.jpg differ
diff --git a/scripts/docs_layout.py b/scripts/docs_layout.py
index 2b0de9d..d2b3f39 100644
--- a/scripts/docs_layout.py
+++ b/scripts/docs_layout.py
@@ -8,9 +8,12 @@
from __future__ import annotations
+import hashlib
import html
import re
from dataclasses import dataclass
+from functools import cache
+from pathlib import Path
REPO_URL = "https://github.com/subwaymatch/layer-is-python"
@@ -37,6 +40,20 @@ class Page:
# The Layer.is logo (docs/assets/logo.svg), used in the sidebar and as favicon.
LOGO = "assets/logo.svg"
+ASSETS_DIR = Path(__file__).resolve().parent.parent / "docs" / "assets"
+
+
+@cache
+def asset_url(name: str) -> str:
+ """URL of a file in docs/assets/ with a hash of its contents appended.
+
+ GitHub Pages serves assets under fixed names with a 10-minute cache, so
+ without this a browser can pair a freshly built page with a stale
+ stylesheet. The hash gives every version of a file its own URL.
+ """
+ digest = hashlib.sha256((ASSETS_DIR / name).read_bytes()).hexdigest()[:10]
+ return f"assets/{name}?v={digest}"
+
# GitHub's "mark-github" octicon (MIT licensed, github.com/primer/octicons).
GITHUB_ICON = (
'