diff --git a/NOTICE.md b/NOTICE.md
index 75ea700..43a4b08 100644
--- a/NOTICE.md
+++ b/NOTICE.md
@@ -8,4 +8,4 @@ The built website uses MathJax 3.2.2 (Apache-2.0) for SVG mathematical typesetti
Python build dependencies retain their own licenses: Mistune (BSD-3-Clause), Jinja2 (BSD-3-Clause), PyYAML (MIT), Pillow (HPND), Beautiful Soup (MIT), and Playwright (Apache-2.0). They are development/build dependencies, not copies of the theory.
-The VDM wordmark is a resized derivative of the author-supplied branding. The small mark and favicon use official VDM branding: the build requests https://www.vdm.io/VDM.png first and can use the official organization's GitHub avatar if that endpoint rejects acquisition. The selected source and digest are recorded, not silently substituted. Brand assets are excluded from the prose and code licenses; no trademark or endorsement rights are granted.
+The VDM wordmark is a transparent lettering-only derivative of the author-supplied branding, extended with THEORY on the same baseline; original glyphs are reused where available, with matching R/Y forms. The small mark and favicon use official VDM branding: the build requests https://www.vdm.io/VDM.png first and can use the official organization's GitHub avatar if that endpoint rejects acquisition. The selected source and digest are recorded, not silently substituted. Brand assets are excluded from the prose and code licenses; no trademark or endorsement rights are granted.
diff --git a/tests/test_branding.py b/tests/test_branding.py
new file mode 100644
index 0000000..2d327e6
--- /dev/null
+++ b/tests/test_branding.py
@@ -0,0 +1,40 @@
+"""Protect the transparent wordmark asset and its single-line presentation. MIT."""
+from pathlib import Path
+import unittest
+from PIL import Image
+from bs4 import BeautifulSoup
+from jinja2 import Environment, FileSystemLoader
+from scripts.build import Article
+
+ROOT = Path(__file__).resolve().parents[1]
+
+
+class WordmarkTests(unittest.TestCase):
+ def test_png_has_transparent_canvas_and_visible_lettering(self):
+ with Image.open(ROOT / 'web/static/wordmark.png') as image:
+ self.assertEqual(image.format, 'PNG')
+ self.assertGreater(image.width, image.height * 10)
+ alpha = image.convert('RGBA').getchannel('A')
+ self.assertEqual(alpha.getextrema()[0], 0)
+ self.assertGreater(alpha.getextrema()[1], 240)
+ for x, y in ((0, 0), (image.width - 1, 0), (0, image.height - 1), (image.width - 1, image.height - 1)):
+ self.assertEqual(alpha.getpixel((x, y)), 0)
+ histogram = alpha.histogram()
+ self.assertGreater(histogram[0], image.width * image.height // 4)
+ self.assertGreater(sum(histogram[241:]), image.width * image.height // 4)
+
+ def test_homepage_uses_one_image_without_a_separate_caption(self):
+ template = Environment(loader=FileSystemLoader(ROOT / 'web/templates')).get_template('page.html')
+ article = Article('index.md', {'title': 'Home', 'section': 'Overview'}, '', b'', '/', 'index.html')
+ markup = template.render(article=article, config={'title': 'VDMT', 'url': 'https://theory.vdm.io', 'version': '0.1.0'}, sections=[], toc=[], commit='test')
+ wordmark = BeautifulSoup(markup, 'html.parser').select_one('.wordmark')
+ self.assertIsNotNone(wordmark)
+ self.assertEqual(len(wordmark.select('img')), 1)
+ self.assertEqual(wordmark.select_one('img')['src'], '/assets/wordmark.png')
+ self.assertEqual(wordmark.select_one('img')['alt'], 'Vast Development Method Theory')
+ self.assertEqual(wordmark.get_text(strip=True), '')
+ self.assertFalse((ROOT / 'web/static/wordmark.webp').exists())
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/web/static/BRAND-NOTICE.txt b/web/static/BRAND-NOTICE.txt
index 07b6683..5916076 100644
--- a/web/static/BRAND-NOTICE.txt
+++ b/web/static/BRAND-NOTICE.txt
@@ -1,6 +1,10 @@
VDM branding identifies this official Vast Development Method publication.
-wordmark.webp is a resized derivative of vast_development_method.jpg supplied
-by the publication's originator.
+wordmark.png is a transparent, lettering-only derivative of the originator's
+supplied vast_development_method.jpg. The original VAST DEVELOPMENT METHOD
+lettering is isolated from its decorative background. THEORY is composed on the
+same baseline, reusing the source T/H/E/O glyphs and matching R/Y
+letterforms. No claim is made to have recovered or redistributed the original
+font file. The image contains no background plate or decorative mosaic.
The small mark and favicon are derived from official VDM branding. The build
first requests https://www.vdm.io/VDM.png. When that endpoint rejects automated
diff --git a/web/static/wordmark.css b/web/static/wordmark.css
new file mode 100644
index 0000000..6cce14d
--- /dev/null
+++ b/web/static/wordmark.css
@@ -0,0 +1,24 @@
+/* Transparent, lettering-only homepage wordmark. SPDX-License-Identifier: MIT */
+.wordmark {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ margin: 4px 0 28px;
+ padding: 0;
+ border: 0;
+ border-radius: 0;
+ background: transparent;
+ box-shadow: none;
+}
+.wordmark img {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ height: auto;
+ background: transparent;
+}
+/* Keep the same transparent asset and letterforms when the effective theme
+ changes, including both system changes and the reader's manual override. */
+:root[data-theme="dark"] .wordmark img {
+ filter: brightness(1.16) saturate(.94);
+}
diff --git a/web/static/wordmark.png b/web/static/wordmark.png
new file mode 100644
index 0000000..8750841
Binary files /dev/null and b/web/static/wordmark.png differ
diff --git a/web/static/wordmark.webp b/web/static/wordmark.webp
deleted file mode 100644
index d96dd18..0000000
Binary files a/web/static/wordmark.webp and /dev/null differ
diff --git a/web/templates/page.html b/web/templates/page.html
index b285ba5..533d909 100644
--- a/web/templates/page.html
+++ b/web/templates/page.html
@@ -22,6 +22,7 @@
window.MathJax = {tex:{inlineMath:[['\\(','\\)']],displayMath:[['$$','$$']],processEscapes:true},svg:{fontCache:'global'},options:{skipHtmlTags:['script','noscript','style','textarea','pre','code']}};
+
@@ -50,7 +51,7 @@