Skip to content

Commit ac418ad

Browse files
TMHSDigitalclaude
andcommitted
feat(showcase): add pine-tree (nature)
This is the first piece in the nature category, a game-ready Scots pine about 7.2 m tall. The trunk is one lathe from a five-lobed buttress flare up to a leader bud. It tapers, sways slightly and carries ten bark ridges. Five surface roots dive into the ground. Ten seeded whorls of 4-6 crooked, tapered limbs start inside the bark. Each limb has alternating side branches, and faceted needled shoots grow on the outer wood: every quad of a thin core is pulled out into a forward-leaning tuft, and the growth tips are lighter. There are four broken stubs, two dead lower branches and hanging cones. It has four materials: bark (grey plates changing to fox-red), needles, cone and deadwood. A tree has no joinery, so the piece-specific budgets are organic invariants: the branch seat in the trunk, the whorl tier spacing, trunk plumb and crown balance. Blender: E:\Blender-Developer-Tools\.scratch\5.2\blender-5.2.1-windows-x64\blender.exe reports "Blender 5.2.1 LTS". 4.5 LTS and 5.1 are left to CI (not run locally). Recomputed budgets (5.2.1): - 34210 tris (band 32500-36000); LOD1 0.5000, LOD2 0.2200 - 4 materials: bark 4348, needle 22800, cone 1664, deadwood 172 faces - UVs in 0..1, overlap 0; AABB 4.775 x 5.261 x 7.226 m, zmin 0 - trunk-hull collider 48 tris (ceiling 60); bake FINISHED; glTF 3299868 B - hygiene all 0, including coplanar cross-shell pairs. The first run measured 28 pairs, from mirrored fork shoots sharing a start point; the forks are now staggered. - branch seat: 50 limbs and 6 dead members; base centre / bark radius on the same bearing is 0.4268-0.4743 (band 0.25-0.75) - 10 whorls [6,5,4,4,5,5,6,6,4,5]; gaps 0.4495-0.5742 m (band 0.40-0.68); spread <= 0.0312 m - trunk lean 0.355 deg (max 1.0); needle-mass centroid 0.0191 m off the base axis (max 0.15); breast-height diameter 0.2665 m (0.266 +/- 0.02) - 1 connected component (671 shells) - two default runs print identical measurements Falsifiers (flag -> measured -> exit): - --skip-decimate -> LOD1 ratio 1.0000 -> 9 - --stray-vert -> loose_v 1 -> 15 - --lift-z -> zmin 0.05000 -> 16 - --float-branches -> seat ratio up to 1.2675 (50/50 limbs found) -> 17 - --lean-crown -> lean 1.711 deg (balance 0.0711, in band) -> 19 - --bunch-whorls -> whorl gaps 0.2258..0.7970 m -> 20 - --drop-cones -> 15 components -> 21 The envelope was unchanged under every falsifier. --lean-crown moves X by 0.3 mm against a 10 mm tolerance. Render: render_hero.py wrote the hero and preview. Framing: fill y 0.828, min margin 0.067. Asset-quality floors pass (edge90 0.170). A violation is remapped to exit 22. Asset sheet (docs/gallery/asset-sheets/pine-tree.webp): it is not the least-designed object in the lineup. It reads unambiguously as a pine, with tiered whorls, needled shoots, a red upper bole and a rooted flare, and it has more modelled structure than the hydrant. Weak points: a 7 m tree fitted to the panel is small, and from the panel's high view the crown is open enough that the limb skeleton shows. A first draft with star-section needle masses read as holly, and a sparser second draft read as a sapling. Both were rebuilt before this sheet. Contact sheet: luma 0.223 against calibration 0.237-0.243 (slightly dark); stage 0.218 against 0.192-0.252; warm wedge +0.156 against +0.092/+0.105 (warmer than calibration: the pool lands on the floor behind the tree); saturation 0.191 against 0.153-0.237. Thumbnail legibility is good: the silhouette reads as a conifer. Subject fill is limited by the proportions of a tall tree, with 0.83 vertical fill and 0.33 horizontal. Also updated: README, CLAUDE.md and ROADMAP counts and entries, the asset_sheet.py SELECT row, catalog.json, plugin.json and the regenerated gallery. build_gallery, check_site_links (93 pages, 0 failures), check_falsifier_targets, check_exit_code_readme, check_engine_id and check_gallery_images all pass. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 892ce37 commit ac418ad

52 files changed

Lines changed: 5869 additions & 83 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.

‎.cursor-plugin/plugin.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@
175175
"showcase/butter-churn",
176176
"showcase/bookshelf",
177177
"showcase/book-trolley",
178-
"showcase/basketball-hoop"
178+
"showcase/basketball-hoop",
179+
"showcase/pine-tree"
179180
]
180181
}

‎CLAUDE.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ rules/<rule-name>.mdc - Anti-pattern rules, 9 total
2222
templates/<template-name>/ - Starter projects, 3 total
2323
snippets/<snippet-name>.py - Standalone code patterns, 27 total
2424
examples/<name>/ - Runnable smoke-gated examples, 60 total (+ gallery.json)
25-
showcase/<name>/ - Budget-conformance props, 37 pieces, each with a gallery `category` (sibling of examples/; see showcase/README.md § Categories)
25+
showcase/<name>/ - Budget-conformance props, 38 pieces, each with a gallery `category` (sibling of examples/; see showcase/README.md § Categories)
2626
scripts/build_gallery.py - Regenerates docs/gallery/ from examples/gallery.json + showcase/gallery.json
2727
scripts/site/ - Vendored landing-page build (Jinja2); tokens.css is the shared palette
2828
tests/check_site_links.py - Internal link/anchor/alt gate over the built site (docs/)

‎README.md‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
</p>
1919

2020
<p align="center">
21-
<strong>16 skills</strong> &nbsp;&bull;&nbsp; <strong>9 rules</strong> &nbsp;&bull;&nbsp; <strong>3 templates</strong> &nbsp;&bull;&nbsp; <strong>27 snippets</strong> &nbsp;&bull;&nbsp; <strong>60 examples</strong> &nbsp;&bull;&nbsp; <strong>37 showcase pieces</strong>
21+
<strong>16 skills</strong> &nbsp;&bull;&nbsp; <strong>9 rules</strong> &nbsp;&bull;&nbsp; <strong>3 templates</strong> &nbsp;&bull;&nbsp; <strong>27 snippets</strong> &nbsp;&bull;&nbsp; <strong>60 examples</strong> &nbsp;&bull;&nbsp; <strong>38 showcase pieces</strong>
2222
</p>
2323

2424
<p align="center">
@@ -37,7 +37,7 @@
3737

3838
## Overview
3939

40-
This repository ships **16 skills, 9 rules, 3 templates, 27 snippets, 60 examples, and 37 showcase pieces** for Blender Python development targeting Blender 5.2 LTS (current stable) with Blender 4.5 LTS fallback support. Blender 5.1 is prior stable.
40+
This repository ships **16 skills, 9 rules, 3 templates, 27 snippets, 60 examples, and 38 showcase pieces** for Blender Python development targeting Blender 5.2 LTS (current stable) with Blender 4.5 LTS fallback support. Blender 5.1 is prior stable.
4141

4242
The content is consumed by AI coding agents reading these files directly from a checkout — **there is no MCP server in this repository, and none is required**. Cursor applies `rules/*.mdc` automatically wherever their scope globs match and takes skills by name in chat; Claude Code reads `skills/` and `rules/` from the project workspace, or from this repo kept as a referenced checkout. Any agent that can read files in a workspace can use it the same way. There is no build step for the content — edit the Markdown and Python files directly.
4343

@@ -106,7 +106,7 @@ per-script exit-code model, are in
106106
Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](showcase/README.md).
107107

108108
<details>
109-
<summary><strong>37 showcase pieces</strong> — click to expand the preview grid</summary>
109+
<summary><strong>38 showcase pieces</strong> — click to expand the preview grid</summary>
110110

111111
<p align="center">
112112
<a href="showcase/shipping-crate/"><img src="showcase/shipping-crate/preview.webp" width="24%" alt="Shipping crate: a wooden slat crate stencilled PORT ROYAL and NO 17, with iron corner brackets and an end handle, on a dark studio floor, warm wedge on the back wall" /></a>
@@ -146,6 +146,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
146146
<a href="showcase/bookshelf/"><img src="showcase/bookshelf/preview.webp" width="24%" alt="Bookshelf: a stained wooden bookcase of cloth and leather hardbacks, some standing, some stacked flat and two leaning on their neighbours, on a dark studio floor" /></a>
147147
<a href="showcase/book-trolley/"><img src="showcase/book-trolley/preview.webp" width="24%" alt="Book trolley: a double-sided wooden library book truck on four casters, two sloped troughs of hardbacks leaning back spines out and loose books stacked on its deck, on a dark studio floor" /></a>
148148
<a href="showcase/basketball-hoop/"><img src="showcase/basketball-hoop/preview.webp" width="24%" alt="Basketball hoop: an outdoor in-ground goal with a padded steel gooseneck pole, a framed backboard with a red shooter's square, an orange rim and a white corded net, on a dark studio floor" /></a>
149+
<a href="showcase/pine-tree/"><img src="showcase/pine-tree/preview.webp" width="24%" alt="Pine tree: a 7 m Scots pine with a red-barked trunk on a flared, rooted base and ten tiers of drooping branches carrying spiky needled shoots, on a dark studio floor" /></a>
149150
</p>
150151

151152
[`shipping-crate`](showcase/shipping-crate/) — procedural crate through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets. Falsifier `--skip-decimate` exits 9.
@@ -218,6 +219,8 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
218219

219220
[`basketball-hoop`](showcase/basketball-hoop/) — the first `sports` piece: procedural in-ground basketball goal (gooseneck pole swept in one piece, braced board, regulation rim, twelve-loop tapered net), whose rim top height, inside diameter, board gap and level, and every net loop threaded on its rim hook, are recomputed from the mesh, through the same pipeline. Falsifiers `--drop-net` exits 18, `--tilt-rim` 19, `--loose-pad` 20.
220221

222+
[`pine-tree`](showcase/pine-tree/) — the first `nature` piece: procedural Scots pine (buttressed trunk from root flare to leader, ten seeded whorls of crooked limbs, faceted needled shoots, dead stubs, hanging cones), whose every limb's seat in the bark, whorl spacing, trunk plumb and crown balance are recomputed from the mesh, through the same pipeline. Falsifiers `--float-branches` exits 17, `--lean-crown` 19, `--bunch-whorls` 20.
223+
221224
</details>
222225

223226
## Examples

‎ROADMAP.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ Not committed; target list for the next content version. (v0.3.0 shipped the smo
157157
- Weathervane as a game-prop showcase piece — arrow and cardinal arms on a spindle: the arrow's pivot bore coaxial with the spindle and the arrow statically balanced (centroid on the pivot axis within a band)
158158
- Showcase pieces above this line are category `village`. Candidates for the other categories (`showcase/README.md` § Categories):
159159
- **Sports:** ~~basketball hoop (pole, backboard, rim, hung net)~~ **SHIPPED** as `showcase/basketball-hoop/` — gooseneck pole on a bolted anchor plate, braced framed board with painted square, regulation rim, twelve-loop net hung on the rim hooks; `--drop-net` exits 18 on the loops threaded through the hooks while the envelope holds, `--tilt-rim` 19 on rim height/size/level, `--skip-decimate` 9 on the LOD1 ratio band; soccer goal (tube frame, netting), tennis net on posts, weight rack with plates and dumbbells; alternates bowling pins and ball, skateboard
160-
- **Nature:** pine tree (trunk, tiered branch whorls), boulder cluster, fallen log with fungus, tree stump with mushrooms; alternates flowering shrub, cattail reeds
160+
- **Nature:** ~~pine tree (trunk, tiered branch whorls)~~ **SHIPPED** as `showcase/pine-tree/` — buttressed trunk with surface roots, ten seeded whorls of limbs seated in the bark, faceted needled shoots, dead stubs and cones; `--float-branches` exits 17 on the branch seat, `--lean-crown` 19 on trunk plumb, `--bunch-whorls` 20 on whorl spacing, while the envelope holds; boulder cluster, fallen log with fungus, tree stump with mushrooms; alternates flowering shrub, cattail reeds
161161
- **Household:** articulated desk lamp, office chair (five-star base, casters), kitchen stool, mini fridge; alternates floor fan, laundry basket
162162
- **Vehicles:** traffic cone and barrier set, quad drone, hover bike, sci-fi cargo loader; alternates sci-fi supply crate
163163
- `persistent` app-handler witness — handlers registered without `@bpy.app.handlers.persistent` are dropped by `wm.read_homefile`/file load while persistent ones survive; assert the registered-handler set before and after a reload (silent loss AI code hits)

‎docs/gallery/anvil/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ <h1>anvil</h1>
358358
<p>A procedural blacksmith anvil on a timber stump through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
359359
</header>
360360
<main id="main">
361-
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../wheelbarrow/" aria-label="Previous showcase piece: wheelbarrow"><span aria-hidden="true">&larr;</span> wheelbarrow</a><span class="pager-pos hud">14 of 37 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../water-trough/" aria-label="Next showcase piece: water-trough">water-trough <span aria-hidden="true">&rarr;</span></a></nav>
361+
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../wheelbarrow/" aria-label="Previous showcase piece: wheelbarrow"><span aria-hidden="true">&larr;</span> wheelbarrow</a><span class="pager-pos hud">14 of 38 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../water-trough/" aria-label="Next showcase piece: water-trough">water-trough <span aria-hidden="true">&rarr;</span></a></nav>
362362
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A forged-steel anvil with a hammer-polished face and a flared, squared waist on a hooped timber stump, a cross-peen hammer on the floor and forge light on its flank.">
363363
<img src="../assets/anvil-hero.webp" alt="A forged-steel anvil with a hammer-polished face and a flared, squared waist on a hooped timber stump, a cross-peen hammer on the floor and forge light on its flank." width="1280" height="720" fetchpriority="high" />
364364
</button>
@@ -3716,7 +3716,7 @@ <h3><a href="../wooden-barrel/">wooden-barrel</a></h3>
37163716
</article>
37173717
</div>
37183718
</section>
3719-
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../wheelbarrow/" aria-label="Previous showcase piece: wheelbarrow"><span aria-hidden="true">&larr;</span> wheelbarrow</a><span class="pager-pos hud">14 of 37 showcase pieces</span><a rel="next" href="../water-trough/" aria-label="Next showcase piece: water-trough">water-trough <span aria-hidden="true">&rarr;</span></a></nav>
3719+
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../wheelbarrow/" aria-label="Previous showcase piece: wheelbarrow"><span aria-hidden="true">&larr;</span> wheelbarrow</a><span class="pager-pos hud">14 of 38 showcase pieces</span><a rel="next" href="../water-trough/" aria-label="Next showcase piece: water-trough">water-trough <span aria-hidden="true">&rarr;</span></a></nav>
37203720
</main>
37213721
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
37223722
<button class="lightbox-close" type="button" autofocus>Close</button>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ <h1>apothecary-shelf</h1>
358358
<p>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.</p>
359359
</header>
360360
<main id="main">
361-
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../brazier/" aria-label="Previous showcase piece: brazier"><span aria-hidden="true">&larr;</span> brazier</a><span class="pager-pos hud">32 of 37 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../wooden-yoke/" aria-label="Next showcase piece: wooden-yoke">wooden-yoke <span aria-hidden="true">&rarr;</span></a></nav>
361+
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../brazier/" aria-label="Previous showcase piece: brazier"><span aria-hidden="true">&larr;</span> brazier</a><span class="pager-pos hud">32 of 38 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../wooden-yoke/" aria-label="Next showcase piece: wooden-yoke">wooden-yoke <span aria-hidden="true">&rarr;</span></a></nav>
362362
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A stained wooden shelf with an arched crest, gallery rails and three brass-knobbed drawers, stocked with labelled glass bottles and flasks and cream and blue glazed jars.">
363363
<img src="../assets/apothecary-shelf-hero.webp" alt="A stained wooden shelf with an arched crest, gallery rails and three brass-knobbed drawers, stocked with labelled glass bottles and flasks and cream and blue glazed jars." width="1280" height="720" fetchpriority="high" />
364364
</button>
@@ -3733,7 +3733,7 @@ <h3><a href="../wooden-barrel/">wooden-barrel</a></h3>
37333733
</article>
37343734
</div>
37353735
</section>
3736-
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../brazier/" aria-label="Previous showcase piece: brazier"><span aria-hidden="true">&larr;</span> brazier</a><span class="pager-pos hud">32 of 37 showcase pieces</span><a rel="next" href="../wooden-yoke/" aria-label="Next showcase piece: wooden-yoke">wooden-yoke <span aria-hidden="true">&rarr;</span></a></nav>
3736+
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../brazier/" aria-label="Previous showcase piece: brazier"><span aria-hidden="true">&larr;</span> brazier</a><span class="pager-pos hud">32 of 38 showcase pieces</span><a rel="next" href="../wooden-yoke/" aria-label="Next showcase piece: wooden-yoke">wooden-yoke <span aria-hidden="true">&rarr;</span></a></nav>
37373737
</main>
37383738
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
37393739
<button class="lightbox-close" type="button" autofocus>Close</button>
59.2 KB
Loading
36.6 KB
Loading

‎docs/gallery/basketball-hoop/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ <h1>basketball-hoop</h1>
358358
<p>A procedural in-ground basketball goal — one-sweep gooseneck pole, braced framed backboard, regulation rim on a bolted flange and a twelve-loop tapered net hung on the rim hooks — through UVs, bake, LOD, convex collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
359359
</header>
360360
<main id="main">
361-
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../book-trolley/" aria-label="Previous showcase piece: book-trolley"><span aria-hidden="true">&larr;</span> book-trolley</a><span class="pager-pos hud">37 of 37 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><span></span></nav>
361+
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../book-trolley/" aria-label="Previous showcase piece: book-trolley"><span aria-hidden="true">&larr;</span> book-trolley</a><span class="pager-pos hud">37 of 38 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../pine-tree/" aria-label="Next showcase piece: pine-tree">pine-tree <span aria-hidden="true">&rarr;</span></a></nav>
362362
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: An outdoor basketball goal: padded steel gooseneck pole on a bolted plate, braced framed backboard with a red shooter&#x27;s square, an orange rim and a white corded net.">
363363
<img src="../assets/basketball-hoop-hero.webp" alt="An outdoor basketball goal: padded steel gooseneck pole on a bolted plate, braced framed backboard with a red shooter&#x27;s square, an orange rim and a white corded net." width="1280" height="720" fetchpriority="high" />
364364
</button>
@@ -3403,7 +3403,7 @@ <h3><a href="../wooden-barrel/">wooden-barrel</a></h3>
34033403
</article>
34043404
</div>
34053405
</section>
3406-
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../book-trolley/" aria-label="Previous showcase piece: book-trolley"><span aria-hidden="true">&larr;</span> book-trolley</a><span class="pager-pos hud">37 of 37 showcase pieces</span><span></span></nav>
3406+
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../book-trolley/" aria-label="Previous showcase piece: book-trolley"><span aria-hidden="true">&larr;</span> book-trolley</a><span class="pager-pos hud">37 of 38 showcase pieces</span><a rel="next" href="../pine-tree/" aria-label="Next showcase piece: pine-tree">pine-tree <span aria-hidden="true">&rarr;</span></a></nav>
34073407
</main>
34083408
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
34093409
<button class="lightbox-close" type="button" autofocus>Close</button>

‎docs/gallery/book-trolley/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ <h1>book-trolley</h1>
358358
<p>A procedural library book truck — arched end panels standing in skids on four swivel casters, a flat deck, and on each side two sloped troughs, a tilted shelf and a backrest square to it, filled with forty-seven rounded-spine hardbacks spines out and two loose stacks — carried through UVs, bake, LOD, convex collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
359359
</header>
360360
<main id="main">
361-
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../bookshelf/" aria-label="Previous showcase piece: bookshelf"><span aria-hidden="true">&larr;</span> bookshelf</a><span class="pager-pos hud">36 of 37 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../basketball-hoop/" aria-label="Next showcase piece: basketball-hoop">basketball-hoop <span aria-hidden="true">&rarr;</span></a></nav>
361+
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../bookshelf/" aria-label="Previous showcase piece: bookshelf"><span aria-hidden="true">&larr;</span> bookshelf</a><span class="pager-pos hud">36 of 38 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../basketball-hoop/" aria-label="Next showcase piece: basketball-hoop">basketball-hoop <span aria-hidden="true">&rarr;</span></a></nav>
362362
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A double-sided wooden library book trolley on four casters, its two sloped troughs of cloth and leather hardbacks leaning back spines out, with loose books stacked on the bottom deck.">
363363
<img src="../assets/book-trolley-hero.webp" alt="A double-sided wooden library book trolley on four casters, its two sloped troughs of cloth and leather hardbacks leaning back spines out, with loose books stacked on the bottom deck." width="1280" height="720" fetchpriority="high" />
364364
</button>
@@ -4095,7 +4095,7 @@ <h3><a href="../wooden-barrel/">wooden-barrel</a></h3>
40954095
</article>
40964096
</div>
40974097
</section>
4098-
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../bookshelf/" aria-label="Previous showcase piece: bookshelf"><span aria-hidden="true">&larr;</span> bookshelf</a><span class="pager-pos hud">36 of 37 showcase pieces</span><a rel="next" href="../basketball-hoop/" aria-label="Next showcase piece: basketball-hoop">basketball-hoop <span aria-hidden="true">&rarr;</span></a></nav>
4098+
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../bookshelf/" aria-label="Previous showcase piece: bookshelf"><span aria-hidden="true">&larr;</span> bookshelf</a><span class="pager-pos hud">36 of 38 showcase pieces</span><a rel="next" href="../basketball-hoop/" aria-label="Next showcase piece: basketball-hoop">basketball-hoop <span aria-hidden="true">&rarr;</span></a></nav>
40994099
</main>
41004100
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
41014101
<button class="lightbox-close" type="button" autofocus>Close</button>

0 commit comments

Comments
 (0)