From ee18196618703f7785ea8476c8251adcef0712d3 Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Fri, 3 Jul 2026 16:43:31 -0400 Subject: [PATCH] docs: redesign the site as a Blender viewport session MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The landing page and gallery now share one bespoke design system built from Blender's own UI vernacular. The hero is a viewport: perspective grid floor with the red-X/green-Y origin lines, HUD corners carrying the mode indicator, axis gizmo, pack counts as a statistics overlay, and the smoke-gate claim as the render status line. Sections are Blender panels, the topbar is Blender's topbar, the footer is its status bar. Editorial one-pager replaces the collapsed-card layout: every skill, rule, snippet, and example is visible on one scroll, with benefit-led headers and the CI-artifact claim as the thesis. Barlow Condensed (self-hosted) joins Inter and JetBrains Mono; selection orange #ff8c19 is the single accent; axis colors appear only where they encode axes. Dark only — the theme toggle is retired. The changelog panel (which only linked to release notes) is now a Releases status-bar link. Verified at desktop and 390px mobile: copy button, stat count-up boot, chips, and lightbox all work; reduced-motion skips the boot sequence. Co-Authored-By: Claude Fable 5 --- docs/gallery/DESIGN_NOTES.md | 79 +- docs/gallery/depsgraph-export/index.html | 154 +-- docs/gallery/gn-sdf-remesh/index.html | 154 +-- docs/gallery/index.html | 154 +-- docs/gallery/swatch-grid/index.html | 154 +-- docs/gallery/turntable/index.html | 154 +-- scripts/build_gallery.py | 154 +-- scripts/site/build_site.py | 22 +- scripts/site/fonts/barlow-condensed-500.woff2 | Bin 0 -> 21424 bytes scripts/site/fonts/barlow-condensed-600.woff2 | Bin 0 -> 22308 bytes scripts/site/template.html.j2 | 1172 ++++++----------- site.json | 4 - 12 files changed, 832 insertions(+), 1369 deletions(-) create mode 100644 scripts/site/fonts/barlow-condensed-500.woff2 create mode 100644 scripts/site/fonts/barlow-condensed-600.woff2 diff --git a/docs/gallery/DESIGN_NOTES.md b/docs/gallery/DESIGN_NOTES.md index a0f6718..ff9858a 100644 --- a/docs/gallery/DESIGN_NOTES.md +++ b/docs/gallery/DESIGN_NOTES.md @@ -1,48 +1,31 @@ -# Gallery design direction — prototype for the Option-2 fleet facelift - -This local gallery (`docs/gallery/`, generated by `scripts/build_gallery.py` from -`examples/gallery.json`) is the **deliberate prototype** for the eventual shared-template -facelift tracked in [Developer-Tools-Directory#86](https://github.com/TMHSDigital/Developer-Tools-Directory/issues/86) -and the ROADMAP "Fleet Pages examples support" candidate. The markup here is throwaway on -migration; the **data** (`gallery.json`) and the **visual direction** below are what carry over. - -## Tokens (aligned to the fleet landing page so the two never clash) - -| Token | Dark | Light | Notes | -| --- | --- | --- | --- | -| `--bg` | `#0d1117` | `#f6f8fa` | matches landing's GitHub-dark base | -| `--surface` | `#161b22` | `#ffffff` | card background | -| `--surface-2` | `#1c2128` | `#f0f2f5` | toggle / inline code | -| `--border` | `#30363d` | `#d0d7de` | | -| `--text` | `#e6edf3` | `#1f2328` | | -| `--text-dim` | `#8b949e` | `#656d76` | secondary text | -| `--accent` / `--accent-light` | `#7c3aed` / `#a78bfa` | same | from `site.json`; shared with landing | -| `--radius` / `--radius-lg` | `8px` / `12px` | — | cards use `-lg` | -| font | `'Inter', system-ui…` | — | landing ships the Inter webfont; the prototype uses the same stack and falls back to system sans (no coupling to the fleet font files) | - -## Type scale -- Page title `h1`: `clamp(1.9rem, 4vw, 2.6rem)`, `letter-spacing: -0.02em` — fluid hero. -- Card title `h2`: `1.22rem`. -- Body: `1rem` / `line-height: 1.6`; secondary `0.9rem`; tag `0.68rem` uppercase. - -## Layout -- Container `max-width: 1080px`, centered, `1.25rem` side padding. -- Grid: **1 column** mobile → **2 columns at ≥720px**, `align-items: stretch` so paired cards share a row height. -- **Heroes are a uniform 16:9** (`aspect-ratio: 16/9; object-fit: cover`). This was a deliberate revision: the first cut used mixed aspects (8:3 swatch panorama + 16:9 stills) with `align-items: start`, which — confirmed by headless screenshots — left a ragged empty gap under the short card on desktop. The swatch hero was re-rendered at 16:9 so all three share an aspect; with uniform heroes `object-fit: cover` no longer crops anything. Keep new heroes 16:9. -- Card is a flex column; the "View example" link is pinned to the bottom (`margin-top: auto`) so footers align across a row. Hover lifts `-3px` with an accent-tinted border and soft shadow. - -## Theme -- Tri-state **auto / light / dark** mirroring the landing: `data-theme` on ``, persisted in `localStorage['theme']` — **the same key the landing uses**, so a visitor's choice carries across both pages. -- FOUC guard runs before first paint. `theme-color` meta per scheme. Toggle cycles auto→light→dark with a sun/moon glyph and an accurate `aria-label`. - -## Navigation / discoverability -- The landing→gallery link is **template-blocked** (the landing nav is fleet-generated). The gallery compensates with self-sufficient outbound nav: a top-bar **back link to the landing** (`../`) and a **GitHub repo link**, plus per-card links to each example on GitHub. A visitor who arrives via the README or a direct link can always navigate out. - -## Accessibility -- Skip-to-content link; `:focus-visible` outlines (accent, 2px); `prefers-reduced-motion` disables hover transform + smooth scroll; descriptive `alt` per hero ("``"); single `h1`, card titles as `h2`. - -## What the fleet template should adopt (not the markup, the direction) -1. The token set above as CSS variables, light/dark parity with the existing landing palette. -2. An **Examples grid** section reading `gallery.json` (per-entry `name/dir/teaches/witnessesFix/hero/preview`), cards styled as here. -3. A **nav link to the gallery** (closes the landing→gallery cross-link gap — impossible today without a template edit). -4. Standardize heroes at **16:9** with `object-fit: cover` and `align-items: stretch` for an even grid; pin card footers (`margin-top: auto`). (Supersedes the first cut's mixed-aspect/`align-items: start` approach, which read as ragged — see Layout.) +# Site design — the Blender viewport system + +The whole site (landing page `docs/index.html` via `scripts/site/`, gallery +`docs/gallery/` via `scripts/build_gallery.py`) shares one design system: the +site reads as a Blender viewport session. This replaced the earlier purple +fleet-template look (2026-07-03); the previous plan to upstream that look into +the shared template was dropped — the fleet template only scaffolds new tools, +and each tool's site evolves independently after that. + +## Vocabulary + +- **Conceit**: topbar = Blender's topbar, footer = its status bar, sections = + its panels (caret + mono label headers), hero = a viewport with a + perspective grid floor, red-X/green-Y origin lines, and HUD overlays in the + corners (mode, axis gizmo, statistics overlay with the pack counts, render + status `smoke-gated · exit 0`). +- **Color**: Blender panel grays (`#1a1b1e` bg, `#222327` panel, `#3a3b40` + border). ONE accent: selection orange `#ff8c19` (Blender's selected-object + outline; cards use it as a hover outline). Axis colors + `#ff3352 / #8bdc00 / #2890ff` appear only in the gizmo and grid origin + lines — they encode, never decorate. Dark only; there is no theme toggle. +- **Type**: Barlow Condensed 600 uppercase for display; Inter for body; + JetBrains Mono for every HUD label, stat, name, and chip. Fonts are + self-hosted in `scripts/site/fonts/` and deployed to `docs/fonts/` by the + landing build — gallery pages reference them at `../fonts/` / `../../fonts/`. +- **Copy**: benefit-led headers ("Every render here is a CI artifact"), the + smoke-gate claim is the headline thesis. + +Keep both builders in this system when editing either; the tokens are +duplicated (template.html.j2 and build_gallery.py SHELL) — change them in +both places. diff --git a/docs/gallery/depsgraph-export/index.html b/docs/gallery/depsgraph-export/index.html index 12dfcc6..49537b7 100644 --- a/docs/gallery/depsgraph-export/index.html +++ b/docs/gallery/depsgraph-export/index.html @@ -7,8 +7,7 @@ - - + @@ -18,90 +17,85 @@ - - @@ -168,7 +166,6 @@ Examples Gallery
GitHub -
@@ -263,28 +260,13 @@

Source

depsgraph-export render, full size
- Generated from examples/gallery.json by scripts/build_gallery.py. -  •  CC-BY-NC-ND-4.0 +
+ generated from examples/gallery.json + CC-BY-NC-ND-4.0 + exit 0 +
@@ -168,7 +166,6 @@ Examples Gallery
GitHub -
@@ -337,28 +334,13 @@

Source

gn-sdf-remesh render, full size
- Generated from examples/gallery.json by scripts/build_gallery.py. -  •  CC-BY-NC-ND-4.0 +
+ generated from examples/gallery.json + CC-BY-NC-ND-4.0 + exit 0 +
@@ -168,7 +166,6 @@ Blender Developer Tools
GitHub -
@@ -233,28 +230,13 @@

depsgraph-export

- Generated from examples/gallery.json by scripts/build_gallery.py. -  •  CC-BY-NC-ND-4.0 +
+ generated from examples/gallery.json + CC-BY-NC-ND-4.0 + exit 0 +
@@ -168,7 +166,6 @@ Examples Gallery
GitHub -
@@ -435,28 +432,13 @@

Source

swatch-grid render, full size
- Generated from examples/gallery.json by scripts/build_gallery.py. -  •  CC-BY-NC-ND-4.0 +
+ generated from examples/gallery.json + CC-BY-NC-ND-4.0 + exit 0 +
@@ -168,7 +166,6 @@ Examples Gallery
GitHub -
@@ -339,28 +336,13 @@

Source

turntable render, full size
- Generated from examples/gallery.json by scripts/build_gallery.py. -  •  CC-BY-NC-ND-4.0 +
+ generated from examples/gallery.json + CC-BY-NC-ND-4.0 + exit 0 +
@@ -210,33 +208,17 @@ __BACKLABEL__
GitHub -
__CONTENT__
- Generated from examples/gallery.json by scripts/build_gallery.py. -  •  CC-BY-NC-ND-4.0 +
+ generated from examples/gallery.json + CC-BY-NC-ND-4.0 + exit 0 +
diff --git a/scripts/site/build_site.py b/scripts/site/build_site.py index 389c524..13ae6ed 100644 --- a/scripts/site/build_site.py +++ b/scripts/site/build_site.py @@ -80,6 +80,14 @@ def _extract_trigger_section(body: str) -> list[str]: return triggers +def _truncate_words(text: str, limit: int) -> str: + """Cut *text* at a word boundary under *limit* chars, with an ellipsis.""" + if len(text) <= limit: + return text + cut = text[:limit].rsplit(" ", 1)[0].rstrip(",;:") + return cut + "…" + + def parse_skills(repo_root: Path) -> list[dict]: skills_dir = repo_root / "skills" if not skills_dir.is_dir(): @@ -97,7 +105,7 @@ def parse_skills(repo_root: Path) -> list[dict]: name = meta.get("name", "").replace("-", " ").replace("_", " ").title() if not name: name = skill_dir.name.replace("-", " ").replace("_", " ").title() - description = meta.get("description", "")[:200] + description = _truncate_words(meta.get("description", ""), 200) if not description: for line in body.splitlines(): @@ -154,7 +162,7 @@ def parse_rules(repo_root: Path) -> list[dict]: key, _, val = stripped.partition(":") key_lower = key.strip().lower() if key_lower == "description": - description = val.strip()[:200] + description = _truncate_words(val.strip(), 200) elif key_lower in ("globs", "scope"): scope = val.strip() continue @@ -163,6 +171,7 @@ def parse_rules(repo_root: Path) -> list[dict]: results.append({ "name": name, + "slug": rule_file.stem, "description": description, "scope": scope, }) @@ -371,6 +380,15 @@ def main(): "example_count": len(examples), "snippet_count": len(plugin.get("snippets", [])), "template_count": len(plugin.get("templates", [])), + # basenames for display: snippets/foo-bar.py -> foo-bar + "snippets": [ + {"name": p.split("/")[-1].removesuffix(".py"), "path": p} + for p in plugin.get("snippets", []) + ], + "templates": [ + {"name": p.split("/")[-1], "path": p} + for p in plugin.get("templates", []) + ], "mcp_tools": mcp_tools, "mcp_tool_count": len(mcp_tools), "mcp_grouped": mcp_grouped, diff --git a/scripts/site/fonts/barlow-condensed-500.woff2 b/scripts/site/fonts/barlow-condensed-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e30e2395f93890ed62beb172f637adb6f5e6cd31 GIT binary patch literal 21424 zcmV({K+?Z=Pew8T0RR9108_945dZ)H0K-H808>o>0RR9100000000000000000000 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 P@hkDC@xQ5j#o*l>+`3n* literal 0 HcmV?d00001 diff --git a/scripts/site/fonts/barlow-condensed-600.woff2 b/scripts/site/fonts/barlow-condensed-600.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..da60c9a90e758f7924dfac415f24961ee74c59c9 GIT binary patch literal 22308 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 PKP}bZXI*N7khDDj=5*Dq literal 0 HcmV?d00001 diff --git a/scripts/site/template.html.j2 b/scripts/site/template.html.j2 index a94313a..5e14880 100644 --- a/scripts/site/template.html.j2 +++ b/scripts/site/template.html.j2 @@ -1,887 +1,461 @@ - - - {% set og_image = site.ogImage | default('https://tmhsdigital.github.io/Developer-Tools-Directory/assets/logo.png', true) %} - {{ plugin.displayName }} + + + {{ plugin.displayName }} — Blender Python that actually runs {% if site.canonical %}{% endif %} - - + {% if site.favicon %}{% endif %} + + + {% if site.canonical %}{% endif %} - + {% set og_image = site.ogImage | default('', true) %} + {% if og_image %}{% endif %} - + - - {% if site.favicon %}{% endif %} - - - + {% if og_image %}{% endif %} + - - - - + -
+ +
+
+ - -
-
- {% if plugin.logo %}{% endif %} -

{{ plugin.displayName }}

-

{{ plugin.description }}

-
- {% if skill_count %}
0
Skills
{% endif %} - {% if rule_count %}
0
Rules
{% endif %} - {% if mcp_tool_count %}
0
MCP Tools
{% endif %} - {% if snippet_count %}
0
Snippets
{% endif %} - {% if template_count %}
0
Templates
{% endif %} - {% if example_count %}
0
Examples
{% endif %} + - {% if site.compatibility %} -
- {% if site.compatibility.cursor %} - - - Cursor {{ site.compatibility.cursor }} - - {% endif %} - {% if site.compatibility.os %} - - - {{ site.compatibility.os | join(' / ') }} - - {% endif %} - {% if site.compatibility.node %} - - - Node {{ site.compatibility.node }} - - {% endif %} - {% if site.compatibility.claude %} - - - {{ site.compatibility.claude }} - - {% endif %} + - {% endif %} - -
- - - GitHub - - {% if site.links.npm %} - - - npm - - {% endif %} +
+ {% if skill_count %}Skills0{% endif %} + {% if rule_count %}Rules0{% endif %} + {% if snippet_count %}Snippets0{% endif %} + {% if template_count %}Templates0{% endif %} + {% if example_count %}Examples0{% endif %} +
+
+ smoke-gated on 4.5 LTS + 5.1 · exit 0
- {% if site.quickStart %} -
-
{{ site.quickStart.title | default('Get started') }}
-
{{ site.quickStart.command }}
- +
+

Blender Python
that actually runs.

+

Skills, rules, snippets, and starter templates that teach Cursor and Claude Code + the bpy that works — + every pattern executed headless on Blender 4.5 LTS and 5.1 before it ships.

+
+
$ git clone {{ site.links.github | default(plugin.repository) }}
+ +
+
- {% endif %} -
-
+
+
- -
+
- - {% if skills %} -
-
-

Skills

- {{ skill_count }} -
- -
+ {% if examples %} +
+
+ + Render Result + {{ example_count }} frames
-
- Skills list -
- {% for skill in skills %} -
- - {{ skill.name }} - {{ skill.description }} - -
- {% if skill.triggers %} -
- Triggers -
    {% for t in skill.triggers %}
  • {{ t }}
  • {% endfor %}
-
- {% endif %} - {% if skill.tools %} -
- MCP Tools -
{% for tool in skill.tools %}{{ tool }}{% endfor %}
-
- {% endif %} - {{ skill.category }} +
+

Every render here is a CI artifact.

+

These aren't mockups. Each example runs headless on Blender 4.5 LTS and 5.1 in the + smoke workflow, asserts its own correctness, and exits non-zero if the API drifted. The render is + what the code produced.

+
+ {% for ex in examples %} + + {{ ex.name }} render +
+ {{ ex.name }} + {{ ex.teaches }}
-
+ {% endfor %}
-
-
- {% endif %} - - - {% if rules %} -
-
-

Rules

- {{ rule_count }} -
- -
+ Open the gallery — code, README, and full-size renders →
-
- Rules list -
- - - - {% for rule in rules %} - - - - - - {% endfor %} - -
NameScopeDescription
{{ rule.name }}{{ rule.scope }}{{ rule.description }}
-
-
{% endif %} - - {% if examples %} -
-
-

Examples

- {{ example_count }} - + {% if skills %} +
+
+ + Skills + {{ skill_count }} loaded
-
{% endif %} - - {% if mcp_tools %} -
-
-

MCP Tools

- {{ mcp_tool_count }} - {% if mcp_grouped | length > 1 %} -
- -
- {% endif %} -
-
- - - / -
+ {% if rules %} +
+
+ + Rules + {{ rule_count }} active
- {% if mcp_grouped | length > 1 %} - {% for category, tools in mcp_grouped.items() %} -
- {{ category }} {{ tools | length }} -
- - - - {% for tool in tools %} - - - - - {% endfor %} - -
NameDescription
{{ tool.name }}{{ tool.description }}
-
-
- {% endfor %} - {% else %} - - +
+

Anti-patterns, caught before they ship.

+

Always-on guardrails for the failure modes that make Blender Python look right + and run wrong: ops in loops, leaked bmesh, deprecated context dicts, per-vertex Python loops.

+
NameDescription
+ - {% for tool in mcp_tools %} - - - + {% for rule in rules %} + + + + {% endfor %}
RuleScopeFlags
{{ tool.name }}{{ tool.description }}
{{ rule.slug | default(rule.name) }}{{ rule.scope }}{{ rule.description }}
- {% endif %} -
- {% endif %} - - - {% if site.installSteps %} -
-
-

Installation

-
- -
-
- Installation steps -
-
    - {% for step in site.installSteps %} -
  1. {{ step | safe }}
  2. - {% endfor %} -
-
-
{% endif %} - - {% if has_changelog %} -
-
-

Changelog

-
- -
+ {% if snippets %} +
+
+ + Snippets + {{ snippet_count }} patterns
-
- Recent changelog -
- {% for entry in changelog %} -
- v{{ entry.version }} - {% if entry.date %}{{ entry.date }}{% endif %} - {% for sec in entry.sections %} -
{{ sec.heading }}
-
    - {% for item in sec.entries %}
  • {{ item }}
  • {% endfor %} -
- {% endfor %} -
+
+

Canonical patterns, five to fifty lines.

+

Standalone, paste-ready answers to the questions that come up every session: + the right way to create and delete objects, read bulk vertex data, bind properties, bridge + the 4.x/5.x API boundary.

+
+ {% for sn in snippets %} + {{ sn.name }} {% endfor %} - View full changelog on GitHub →
-
+ {% if templates %} +

Plus {{ template_count }} starter templates: + {% for t in templates %}{{ t.name }}{% if not loop.last %} and {% endif %}{% endfor %} + — a complete Extensions-Platform add-on and a headless batch job with CI exit codes.

+ {% endif %} +
{% endif %} - - {% if site.relatedTools %} -
- - -
- - - - - diff --git a/site.json b/site.json index de14af7..da80091 100644 --- a/site.json +++ b/site.json @@ -1,8 +1,4 @@ { - "accent": "#7c3aed", - "accentLight": "#a78bfa", - "heroGradientFrom": "#0d1117", - "heroGradientTo": "#161b22", "canonical": "https://tmhsdigital.github.io/Blender-Developer-Tools/", "favicon": "assets/favicon.svg", "ogImage": "https://tmhsdigital.github.io/Blender-Developer-Tools/gallery/assets/swatch-grid-hero.webp",