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 @@
{{ article.meta.section }}{{ minutes }} min read ยท Edition {{ config.version }}
- {% if article.path == 'index.md' %}
Vast Development MethodTHEORY
{% endif %} + {% if article.path == 'index.md' %}
Vast Development Method Theory
{% endif %}
Read MarkdownDownload MarkdownSource
{{ article.rendered|safe }}
Evidence profile{{ article.meta.evidence }}How to read a claim