diff --git a/assets/profile-banner-dark.svg b/assets/profile-banner-dark.svg
new file mode 100644
index 0000000..ac74db5
--- /dev/null
+++ b/assets/profile-banner-dark.svg
@@ -0,0 +1 @@
+
diff --git a/assets/profile-banner-light.svg b/assets/profile-banner-light.svg
new file mode 100644
index 0000000..c04f57c
--- /dev/null
+++ b/assets/profile-banner-light.svg
@@ -0,0 +1 @@
+
diff --git a/assets/readme-banner-small.png b/assets/readme-banner-small.png
deleted file mode 100644
index 74eb73c..0000000
Binary files a/assets/readme-banner-small.png and /dev/null differ
diff --git a/assets/readme-banner.png b/assets/readme-banner.png
deleted file mode 100644
index fa7a1da..0000000
Binary files a/assets/readme-banner.png and /dev/null differ
diff --git a/branding/README.md b/branding/README.md
index 11e2df2..eed8acb 100644
--- a/branding/README.md
+++ b/branding/README.md
@@ -24,6 +24,7 @@ Ink `#26241F` · Paper `#FAF6EE`.
| Asset | File | Use |
|-------|------|-----|
| README hero banner | `social/org-readme-banner.png` | `.github/profile/README.md`, repo READMEs |
+| Profile banner (animated) | `../assets/profile-banner-light.svg`, `../assets/profile-banner-dark.svg` | `profile/README.md`, light and dark themes; see [Profile banner](#profile-banner) |
| Avatar — light | `social/avatar-light.png` | Org/profile avatar (640×640) |
| Avatar — dark | `social/avatar-dark.png` | Dark backgrounds |
| Avatar — gold tint | `social/avatar-tint.png` | Accent / alt avatar |
@@ -34,6 +35,16 @@ Ink `#26241F` · Paper `#FAF6EE`.
Browse everything live in **Brand Assets.dc.html**.
+## Profile banner
+
+`profile-banner/generate.py` draws both banners. It embeds `profile-banner/logo-72.png` and the fonts in
+`profile-banner/fonts`, cut down to the characters the banner uses (SIL Open Font License, texts alongside).
+After changing the copy or the colors, run:
+
+```bash
+uv run branding/profile-banner/generate.py
+```
+
## Developer Notes
The *.xcf files in this folder are GIMP projects.
diff --git a/branding/profile-banner/fonts/OFL-bricolage-grotesque.txt b/branding/profile-banner/fonts/OFL-bricolage-grotesque.txt
new file mode 100644
index 0000000..4dfd4fe
--- /dev/null
+++ b/branding/profile-banner/fonts/OFL-bricolage-grotesque.txt
@@ -0,0 +1,93 @@
+Copyright 2022 The Bricolage Grotesque Project Authors (https://github.com/ateliertriay/bricolage)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/branding/profile-banner/fonts/OFL-instrument-sans.txt b/branding/profile-banner/fonts/OFL-instrument-sans.txt
new file mode 100644
index 0000000..d41633c
--- /dev/null
+++ b/branding/profile-banner/fonts/OFL-instrument-sans.txt
@@ -0,0 +1,93 @@
+Copyright 2022 The Instrument Sans Project Authors (https://github.com/Instrument/instrument-sans)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/branding/profile-banner/fonts/OFL-jetbrains-mono.txt b/branding/profile-banner/fonts/OFL-jetbrains-mono.txt
new file mode 100644
index 0000000..821a3da
--- /dev/null
+++ b/branding/profile-banner/fonts/OFL-jetbrains-mono.txt
@@ -0,0 +1,93 @@
+Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: https://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/branding/profile-banner/fonts/bricolage-grotesque-latin.woff2 b/branding/profile-banner/fonts/bricolage-grotesque-latin.woff2
new file mode 100644
index 0000000..b908aff
Binary files /dev/null and b/branding/profile-banner/fonts/bricolage-grotesque-latin.woff2 differ
diff --git a/branding/profile-banner/fonts/instrument-sans-latin.woff2 b/branding/profile-banner/fonts/instrument-sans-latin.woff2
new file mode 100644
index 0000000..665fa65
Binary files /dev/null and b/branding/profile-banner/fonts/instrument-sans-latin.woff2 differ
diff --git a/branding/profile-banner/fonts/jetbrains-mono-latin.woff2 b/branding/profile-banner/fonts/jetbrains-mono-latin.woff2
new file mode 100644
index 0000000..2ca6ac6
Binary files /dev/null and b/branding/profile-banner/fonts/jetbrains-mono-latin.woff2 differ
diff --git a/branding/profile-banner/generate.py b/branding/profile-banner/generate.py
new file mode 100644
index 0000000..7a63d0b
--- /dev/null
+++ b/branding/profile-banner/generate.py
@@ -0,0 +1,505 @@
+# /// script
+# requires-python = ">=3.9"
+# dependencies = ["fonttools[woff]"]
+# ///
+"""Generate the animated banner of the organization profile README.
+
+Writes assets/profile-banner-light.svg and assets/profile-banner-dark.svg.
+Run from anywhere in the repository:
+
+ uv run branding/profile-banner/generate.py
+
+The fonts in ./fonts are subset to the characters the banner uses and embedded,
+together with ./logo-72.png (branding/logo.png scaled to 72 px), so the SVG files
+load nothing else. Edit the copy in the scene functions below and run it again.
+"""
+
+import base64
+import html
+import io
+from pathlib import Path
+
+from fontTools import subset
+from fontTools.ttLib import TTFont
+from fontTools.varLib import instancer
+
+HERE = Path(__file__).resolve().parent
+FONTS = HERE / "fonts"
+ASSETS = HERE.parent.parent / "assets"
+
+W, H = 880, 280
+SCENE_SECONDS = 3.5
+
+FONT_FILES = {
+ "b": "bricolage-grotesque-latin.woff2",
+ "s": "instrument-sans-latin.woff2",
+ "m": "jetbrains-mono-latin.woff2",
+}
+FAMILY = {"b": "Bricolage Grotesque", "s": "Instrument Sans", "m": "JetBrains Mono"}
+WEIGHTS = {"b": "700", "s": "400 700", "m": "400 800"}
+
+# ---------------------------------------------------------------- measuring
+
+_instances = {}
+
+
+def _instance(ff, weight, opsz=None):
+ key = (ff, weight, opsz)
+ if key not in _instances:
+ font = TTFont(FONTS / FONT_FILES[ff])
+ location = {"wght": weight}
+ if ff == "b":
+ location["opsz"] = opsz or 36
+ _instances[key] = instancer.instantiateVariableFont(font, location)
+ return _instances[key]
+
+
+def measure(text, ff, size, weight=400, ls=0.0):
+ """Advance width of `text` in px, without kerning."""
+ font = _instance(ff, weight, size if ff == "b" else None)
+ cmap = font.getBestCmap()
+ hmtx = font["hmtx"]
+ upem = font["head"].unitsPerEm
+ width = 0
+ for ch in text:
+ glyph = cmap.get(ord(ch))
+ width += hmtx[glyph][0] if glyph else upem * 0.5
+ return width * size / upem + ls * size * len(text)
+
+
+USED = {"b": set(), "s": set(), "m": set()}
+
+# ---------------------------------------------------------------- palette
+
+LIGHT = dict(
+ page="#FFFFFF", card="#F7F5EF", cardStroke="#E4DFD1", ink="#171A2E", muted="#5A5E70",
+ faint="#7D8092", yellow="#FFC20A", green="#40B385", indigo="#4051B5", panel="#FFFFFF",
+ panelStroke="#E4DFD1", strip="#F4F1E8", addBg="#E1F3E9", addText="#1F5E43", delBg="#FBE6E3",
+ delText="#8A2A1C", warnBg="#FFF4D6", warnIcon="#B7791F", noteBg="#ECEFFB", noteIcon="#4051B5",
+ track="#E4DFD1", fill="#171A2E", shadow="#171A2E", shadowOpacity="0.16", avatar="#171A2E",
+ button="#4051B5", highlight="#E1F3E9", line="#E4DFD1", cursorFill="#FFFFFF", cursorStroke="#171A2E",
+)
+DARK = dict(
+ page="#0D1117", card="#16182A", cardStroke="#2A2E48", ink="#F4F2EC", muted="#A9AEC8",
+ faint="#8A8FAD", yellow="#FFC20A", green="#40B385", indigo="#8E9CF5", panel="#1E2136",
+ panelStroke="#353A5C", strip="#262A45", addBg="#173628", addText="#A3E2C2", delBg="#3A1F25",
+ delText="#F4B9AF", warnBg="#3A3220", warnIcon="#F2C14E", noteBg="#262B4D", noteIcon="#8E9CF5",
+ track="#353A5C", fill="#F4F2EC", shadow="#000000", shadowOpacity="0.45", avatar="#8E9CF5",
+ button="#5566D1", highlight="#173628", line="#353A5C", cursorFill="#FFFFFF", cursorStroke="#16182A",
+)
+
+# ---------------------------------------------------------------- primitives
+
+
+def esc(s):
+ return html.escape(s, quote=True)
+
+
+def text(x, y, s, ff, size, fill, weight=400, anchor=None, ls=None, cls=None):
+ # SVG collapses leading spaces, so indent code by position instead
+ indent = len(s) - len(s.lstrip(" "))
+ if indent and ff == "m":
+ x += indent * measure(" ", "m", size)
+ s = s.lstrip(" ")
+ USED[ff].update(s)
+ attrs = [f'x="{x:g}"', f'y="{y:g}"', f'class="ff-{ff}{(" " + cls) if cls else ""}"',
+ f'font-size="{size:g}"', f'font-weight="{weight}"', f'fill="{fill}"']
+ if anchor:
+ attrs.append(f'text-anchor="{anchor}"')
+ if ls:
+ attrs.append(f'letter-spacing="{ls * size:.2f}"')
+ return f'
-
- ### Lint and format your C/C++ code in every workflow — GitHub Actions, pre-commit hooks, and CLI.
-
- [](https://cpp-linter.github.io/)
- [](https://github.com/cpp-linter/cpp-linter-action)
- [](https://github.com/cpp-linter/cpp-linter-hooks)
- [](https://github.com/cpp-linter/cpp-linter)
- [](https://github.com/cpp-linter/.github/blob/main/LICENSE)
- [](https://opencollective.com/cpp-linter)
-
-
-
- ![]() - shenxianpeng - - |
-
-
- ![]() - 2bndy5 - - |
-
- Made with ❤️ by the cpp-linter community -
+ + +