Skip to content

Commit 0f8369d

Browse files
TMHSDigitalclaude
andcommitted
feat(gallery): jump-to nav on detail pages, header-safe anchor offset
Add a jump-to chip row (Run, Exit codes, Source, Related) built only from anchors that exist on each page, and offset anchored sections below the sticky site header. Regenerated docs/gallery. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
1 parent e1447f5 commit 0f8369d

135 files changed

Lines changed: 294 additions & 141 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎docs/gallery/anvil/index.html‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<meta name="twitter:title" content="Anvil (anvil) — Showcase — Blender Developer Tools" />
2525
<meta name="twitter:description" content="A procedural blacksmith anvil on a timber stump through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract." />
2626
<link rel="preload" href="../../fonts/inter-regular.woff2" as="font" type="font/woff2" crossorigin />
27-
<link rel="stylesheet" href="../gallery.css?v=160a8a8c00" />
27+
<link rel="stylesheet" href="../gallery.css?v=cde6fee965" />
2828
<script>document.documentElement.classList.add('js');</script>
2929
</head>
3030
<body>
@@ -57,6 +57,7 @@ <h1>Anvil</h1>
5757
<pre id="runCmd">blender --background --python showcase/anvil/anvil.py --</pre>
5858
<button class="copy-btn" id="copyRun" type="button">Copy</button>
5959
</div>
60+
<nav class="jumpnav" aria-label="On this page"><span class="tag">jump to</span> <a href="#run">Run</a> <a href="#exit-codes">Exit codes</a> <a href="#source">Source</a> <a href="#related">Related</a></nav>
6061
<section class="detail-section md">
6162
<p>A showcase piece, not an example. Procedural London-pattern anvil on a coopered timber stump (16 jittered staves, chord-lofted iron hoops, a sawn head, spreading foot, pinched waist, one slotted face with hardy and pritchel through-holes, oval-lofted horn) then the shipped pipeline: unique-cell UVs, Cycles high-to-low normal bake, LOD chain, convex collider, Unity glTF export.</p>
6263
<p>The face is one <code>add_slotted_slab</code> so hardy/pritchel are real holes in a single shell, not nubs glued onto stacked boxes. Hoops evaluate the same <code>host_outer_r</code> chord as the stave flats. <code>--round-band</code> is the falsifier: a circle of <code>radius_at(z)</code> instead of the chord.</p>

‎docs/gallery/apothecary-shelf/index.html‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<meta name="twitter:title" content="Apothecary Shelf (apothecary-shelf) — Showcase — Blender Developer Tools" />
2525
<meta name="twitter:description" content="A procedural apothecary shelf — housed shelves, gallery rails, a drawer bank and an arched crest, stocked with fifteen lathed bottles, flasks and glazed jars, each corked or lidded and labelled — carried through UVs, bake, LOD, convex collider, and Unity glTF, asserting recomputed budgets rather than an API contract." />
2626
<link rel="preload" href="../../fonts/inter-regular.woff2" as="font" type="font/woff2" crossorigin />
27-
<link rel="stylesheet" href="../gallery.css?v=160a8a8c00" />
27+
<link rel="stylesheet" href="../gallery.css?v=cde6fee965" />
2828
<script>document.documentElement.classList.add('js');</script>
2929
</head>
3030
<body>
@@ -57,6 +57,7 @@ <h1>Apothecary Shelf</h1>
5757
<pre id="runCmd">blender --background --python showcase/apothecary-shelf/apothecary_shelf.py --</pre>
5858
<button class="copy-btn" id="copyRun" type="button">Copy</button>
5959
</div>
60+
<nav class="jumpnav" aria-label="On this page"><span class="tag">jump to</span> <a href="#exit-codes">Exit codes</a> <a href="#source">Source</a> <a href="#related">Related</a></nav>
6061
<section class="detail-section md">
6162
<p>An apothecary shelf: a stained carcass with three shelves housed in its sides, a gallery rail along each shelf, lapped back boards, a bank of three drawers with brass knobs and an arched crest, stocked with fifteen vessels in five forms (bottle, flask, jar, albarello, vial). Every vessel is corked or lidded and carries a paper label. <strong>A showcase piece, not an example</strong> — it witnesses no API contract. It asserts that generated geometry meets declared asset budgets, recomputed from the finished mesh.</p>
6263
<h2 id="what-it-composes">What it composes<a class="anchor" href="#what-it-composes" aria-label="Link to this section">#</a></h2>

‎docs/gallery/archery-target/index.html‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<meta name="twitter:title" content="Archery Target (archery-target) — Showcase — Blender Developer Tools" />
2525
<meta name="twitter:description" content="A procedural archery range target on a turf patch — a 1.10 m compressed-straw boss coiled from rope courses that show on its back and round its edge, bound with doubled jute twine drawn tight over the crests; an 80 cm ten-zone World Archery face in aged inks with ring lines, an X ring and a printed X, held by four target pins; a timber easel leaning it back 12° on toe skids with knee braces, a ledge with a stop lip on a bolted rail and gussets, a numbered butt board, a strap hinge pinned to a rear leg in a steel ferrule and foot, and a splay chain between eye bolts; five carbon arrows in the face with cresting, nocks and three vanes, one glancing into the straw edge, one snapped with its fletched half on the grass, and a leather quiver of arrows lying among grass tufts — through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract." />
2626
<link rel="preload" href="../../fonts/inter-regular.woff2" as="font" type="font/woff2" crossorigin />
27-
<link rel="stylesheet" href="../gallery.css?v=160a8a8c00" />
27+
<link rel="stylesheet" href="../gallery.css?v=cde6fee965" />
2828
<script>document.documentElement.classList.add('js');</script>
2929
</head>
3030
<body>
@@ -57,6 +57,7 @@ <h1>Archery Target</h1>
5757
<pre id="runCmd">blender --background --python showcase/archery-target/archery_target.py --</pre>
5858
<button class="copy-btn" id="copyRun" type="button">Copy</button>
5959
</div>
60+
<nav class="jumpnav" aria-label="On this page"><span class="tag">jump to</span> <a href="#run">Run</a> <a href="#exit-codes">Exit codes</a> <a href="#source">Source</a> <a href="#related">Related</a></nav>
6061
<section class="detail-section md">
6162
<p>A showcase piece, not an example, and the fifth in the <code>sports</code> category. It builds a procedural archery range target on a turf patch:</p>
6263
<ul><li>a 1.10 m compressed-straw boss, 0.28 m thick, built as one turned coil. Seventeen rope courses show as relief on its back, round its edge and on the annulus around the face; inside 0.43 m the face is pressed flat. The straw shader runs its fibres round the coil from a per-vertex coil coordinate, and every rope course has its own tone;</li><li>eight doubled jute bindings over the edge, laid tight on the envelope over the crests so they bridge the grooves, their ends diving into the straw;</li><li>an 80 cm World Archery face: ten zones 4 cm wide (gold, red, blue, black, white) with black ring lines (a white one in the black), the X ring and a printed X, pinned through the white by four target pins with green heads;</li><li>a timber easel leaning the boss back 12°: two front legs tenoned into toe skids, each triangulated by a toe and a heel knee brace; a rail on the legs&#x27; front faces with carriage bolts, a ledge with a stop lip on the rail and two gussets; a white butt board numbered 12 above the boss; a head block behind the leg tops; a strap hinge (two leaves, three knuckles, a riveted pin) to a single rear leg in a steel ferrule on a steel foot; a stretcher, and a taut chain between two eye bolts limiting the splay;</li><li>five carbon arrows in the face (turned points, cresting, nocks, three vanes at 120° with an off-white cock vane), a sixth glancing into the straw edge, a seventh snapped off in the black with its fletched half lying on the grass; and</li><li>a leather quiver lying on the turf, with a belt loop and three bands, holding three arrows whose tips rest on its floor, among grass tufts.</li></ul>

‎docs/gallery/armature-bend/index.html‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<meta name="twitter:title" content="Armature Bend (armature-bend) — Examples — Blender Developer Tools" />
2525
<meta name="twitter:description" content="Rigging end to end in the data API — edit_bones chain construction, name-bound vertex groups with smoothstep blend zones, posing, and depsgraph evaluation — bending a ribbed bellows hose through rest, half, and full curl." />
2626
<link rel="preload" href="../../fonts/inter-regular.woff2" as="font" type="font/woff2" crossorigin />
27-
<link rel="stylesheet" href="../gallery.css?v=160a8a8c00" />
27+
<link rel="stylesheet" href="../gallery.css?v=cde6fee965" />
2828
<script>document.documentElement.classList.add('js');</script>
2929
</head>
3030
<body>
@@ -56,6 +56,7 @@ <h1>Armature Bend</h1>
5656
<pre id="runCmd">blender --background --python examples/armature-bend/armature_bend.py --</pre>
5757
<button class="copy-btn" id="copyRun" type="button">Copy</button>
5858
</div>
59+
<nav class="jumpnav" aria-label="On this page"><span class="tag">jump to</span> <a href="#run">Run</a> <a href="#exit-codes">Exit codes</a> <a href="#source">Source</a> <a href="#related">Related</a></nav>
5960
<section class="detail-section md">
6061
<p>A runnable example that rigs a tapered, ribbed bellows hose with a four-bone armature chain — <code>edit_bones</code> construction, name-bound vertex groups with smoothstep blend zones, a posed curl — and checks the depsgraph-evaluated result against closed-form linear blend skinning, following <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/skills/mesh-editing-and-bmesh/SKILL.md"><code>mesh-editing-and-bmesh</code></a> and <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/skills/depsgraph-and-evaluated-data/SKILL.md"><code>depsgraph-and-evaluated-data</code></a>.</p>
6162
<p><strong>What it witnesses:</strong> the three contracts AI-generated rigging code most often gets wrong.</p>

‎docs/gallery/attribute-domain-shear/index.html‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<meta name="twitter:title" content="Attribute Domain Shear (attribute-domain-shear) — Examples — Blender Developer Tools" />
2525
<meta name="twitter:description" content="POINT vs CORNER color-attribute domains on a shared-vertex fan: CORNER stays exact per face while a naive per-wedge POINT loop shears to the last write at the hub. A striped parasol keeps crisp stripes under CORNER and smears, with one panel turned the wrong color, under POINT; the measured shear equals the palette closed form." />
2626
<link rel="preload" href="../../fonts/inter-regular.woff2" as="font" type="font/woff2" crossorigin />
27-
<link rel="stylesheet" href="../gallery.css?v=160a8a8c00" />
27+
<link rel="stylesheet" href="../gallery.css?v=cde6fee965" />
2828
<script>document.documentElement.classList.add('js');</script>
2929
</head>
3030
<body>
@@ -56,6 +56,7 @@ <h1>Attribute Domain Shear</h1>
5656
<pre id="runCmd">blender --background --python examples/attribute-domain-shear/attribute_domain_shear.py --</pre>
5757
<button class="copy-btn" id="copyRun" type="button">Copy</button>
5858
</div>
59+
<nav class="jumpnav" aria-label="On this page"><span class="tag">jump to</span> <a href="#run">Run</a> <a href="#exit-codes">Exit codes</a> <a href="#source">Source</a> <a href="#related">Related</a></nav>
5960
<section class="detail-section md">
6061
<p>A runnable example that witnesses what <code>POINT</code> versus <code>CORNER</code> <strong>means</strong> on <code>Mesh.color_attributes</code> once the mesh has shared vertices — the domain is not a storage detail, it decides where colors can live. Companion to <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/examples/color-attribute-wheel"><code>color-attribute-wheel</code></a> (which covers <code>color_attributes.new()</code> versus the deprecated alias, CORNER sizing == <code>len(loops)</code>, and <code>active_color</code>); this example covers the trap one step later, when AI code knows the API exists but authors per-face colors into a <code>POINT</code>-domain attribute.</p>
6162
<p><strong>Pipeline arc neighbors:</strong> attribute authoring in <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/examples/color-attribute-wheel"><code>color-attribute-wheel</code></a>, mesh topology gates in <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/examples/mesh-hygiene-audit"><code>mesh-hygiene-audit</code></a>, tangent-space UV contracts in <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/examples/triangulate-tangents"><code>triangulate-tangents</code></a>.</p>

‎docs/gallery/bake-normal-high-to-low/index.html‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<meta name="twitter:title" content="Bake Normal High To Low (bake-normal-high-to-low) — Examples — Blender Developer Tools" />
2525
<meta name="twitter:description" content="A collapse-decimated hatch plate receiving a Cycles cage-baked tangent normal map from a ribbed high-poly source" />
2626
<link rel="preload" href="../../fonts/inter-regular.woff2" as="font" type="font/woff2" crossorigin />
27-
<link rel="stylesheet" href="../gallery.css?v=160a8a8c00" />
27+
<link rel="stylesheet" href="../gallery.css?v=cde6fee965" />
2828
<script>document.documentElement.classList.add('js');</script>
2929
</head>
3030
<body>
@@ -56,6 +56,7 @@ <h1>Bake Normal High To Low</h1>
5656
<pre id="runCmd">blender --background --python examples/bake-normal-high-to-low/bake_normal_high_to_low.py --</pre>
5757
<button class="copy-btn" id="copyRun" type="button">Copy</button>
5858
</div>
59+
<nav class="jumpnav" aria-label="On this page"><span class="tag">jump to</span> <a href="#run">Run</a> <a href="#exit-codes">Exit codes</a> <a href="#source">Source</a> <a href="#related">Related</a></nav>
5960
<section class="detail-section md">
6061
<p>A runnable example that cage-bakes a ribbed bronze hatch plate onto a <code>DECIMATE COLLAPSE</code> LOD and asserts the tangent-space normal map carries measurable surface detail — following <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/skills/bake-high-to-low/SKILL.md"><code>bake-high-to-low</code></a>.</p>
6162
<p><strong>What it witnesses:</strong> Cycles selected-to-active normal bake is a statistical process, not a byte-identical one. A high-poly source produces a map that deviates from flat tangent <code>(0.5, 0.5, 1.0)</code>; the same bake from an undisplaced source does not.</p>

‎docs/gallery/bamboo-clump/index.html‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<meta name="twitter:title" content="Bamboo Clump (bamboo-clump) — Showcase — Blender Developer Tools" />
2525
<meta name="twitter:description" content="A procedural clump of seven clumping-bamboo culms rising from a 0.6 m rhizome mass on a lobed hummock of leaf-litter soil, five jointed rhizome knuckles breaking the soil at the outer culms&#x27; feet; each culm splayed out from the soil, then leaning and arching to a fine whip, ringed with 99 raised nodes at a pitch short at the foot, long through the middle and short again at the tip, its lowest three nodes still in papery sheaths and a fresh culm white-waxed below every node; 107 arching branches, one or two to a node, carrying 815 slim leaves with a droop of their own; three young shoots and litter off the hummock, through UVs, bake, LOD, collider and Unity glTF, asserting recomputed budgets rather than an API contract." />
2626
<link rel="preload" href="../../fonts/inter-regular.woff2" as="font" type="font/woff2" crossorigin />
27-
<link rel="stylesheet" href="../gallery.css?v=160a8a8c00" />
27+
<link rel="stylesheet" href="../gallery.css?v=cde6fee965" />
2828
<script>document.documentElement.classList.add('js');</script>
2929
</head>
3030
<body>
@@ -57,6 +57,7 @@ <h1>Bamboo Clump</h1>
5757
<pre id="runCmd">blender --background --python showcase/bamboo-clump/bamboo_clump.py --</pre>
5858
<button class="copy-btn" id="copyRun" type="button">Copy</button>
5959
</div>
60+
<nav class="jumpnav" aria-label="On this page"><span class="tag">jump to</span> <a href="#run">Run</a> <a href="#exit-codes">Exit codes</a> <a href="#source">Source</a> <a href="#related">Related</a></nav>
6061
<section class="detail-section md">
6162
<p>A showcase piece, not an example, and a <code>nature</code> piece. It builds a procedural, game-ready clump of clumping bamboo on a low mound of leaf-litter soil:</p>
6263
<ul><li>a soil disc 2.2 × 2.0 m: a gentle litter heap of 60 mm, a lobed rhizome hummock heaving 120 mm more under the clump (gaussian radius 0.36 m), and a collar of soil heaped round every culm&#x27;s foot, rolled down to the floor at its rim;</li><li>five rhizome knuckles breaking the soil: short, fat, jointed sausages, 1.15 times their culm&#x27;s foot radius, each running in to an outer culm&#x27;s foot, their axis sunk 0.32 of their radius under the soil the whole way so they are bedded along their length;</li><li>seven culms rising from a rhizome mass about 0.6 m across, 2.71 to 4.55 m tall above the soil and 4.6 to 7.4 cm across at the first node. Each outer culm leaves the soil already leaning 7° out from the clump&#x27;s centre, then leans further and arches, swaying a little about its bearing. A culm is buried 45 mm in the soil, flares at the foot, tapers to 0.57–0.60 of its foot radius at the last node, and above it thins fast into a fine whip. Culm sections are ten-sided. Tone runs from a fresh, deep-green culm heavily powdered with white wax just under every node to an old one gone yellow;</li><li>99 nodes, 11 to 18 a culm. A node is a raised ring (a six-point profile revolved about the culm: crest 3.5 mm proud of the wall, inner wall 3 mm inside it), a collar darker than its culm with a pale sheath scar on its crest. Internodes are close at the foot, long through the middle and close again toward the tip: mean pitch 0.249–0.257 m a culm, the middle third 0.079 to 0.106 m longer than the first;</li><li>21 papery culm sheaths still clasping the lowest three nodes of each culm: a sleeve wrapped from just above the node&#x27;s ridge, its inner wall bitten 1.5 mm into the culm, thinning from 2.6 mm proud at its foot to a ragged, diagonal top whose lip curls off the culm;</li><li>107 leafy branches. Every node from 30% of the way up carries a first branch, turning round the culm by the golden angle; above 42% a second, shorter and flatter one often joins it, and above 62% nearly always. Each is a six-sided slender stem that springs up at 44–78° and arches over by its own sag, so some ride high and some hang. The top node&#x27;s branch rises nearly upright and plumes the whip. Leaves number 6–12 on a first branch and 4–7 on a second, more toward the crown, and each branch&#x27;s leaves share a length and a droop, so tufts differ from each other more than leaves in a tuft do: 815 slim, pointed blades in all, diamond-section with a pale midrib and strawy tip;</li><li>three young shoots in overlapping sheaths pushing out of the soil beside the clump (0.27–0.62 m), their husks stepping out at each sheath edge and greening at the tip;</li><li>36 dry leaves and five fallen culm sheaths lying in the litter, off the hummock. Each is a thick lens with its belly 1–2.5 mm under the soil and its flanks leaning 11–15° (sheaths 10–14°), steeper than the soil&#x27;s slope where litter is laid (outside 0.44 of the disc&#x27;s radius), so no flank can lie in the soil&#x27;s own plane.</li></ul>

0 commit comments

Comments
 (0)