Skip to content

Commit 8202fc7

Browse files
TMHSDigitalclaude
andcommitted
feat(showcase): add office-chair (household)
The second piece in the household category: an ergonomic task chair. A polished aluminium five-star base (crowned spokes with two channels and a centre rib underneath, socket bosses on a 0.305 m circle) stands on five twin-wheel casters, each on a plumb chrome swivel stem with a washer, a nylon web and hood, a chrome axle and two crowned wheels trailing 30 mm, each swivelled its own way. A chrome gas lift rises from the hub through a two-stage telescoping cover into the socket of a graphite tilt mechanism with a spring housing, a knurled knob and two lever paddles. The seat is a moulded pan under a contoured cushion (tapered, bowed plan, dish, side bolsters, waterfall front, panel seam, piped welt). An aluminium spine carries a reclined mesh back (warm-white frame, sheer woven panel, arched top, lumbar pad on straps, cross bar and hub plate) and a headrest on its own stem. Two height-adjustable T-arms. Nine materials: fabric, mesh, shell, nylon, aluminium, chrome, tread, leatherette, steel. 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): - 35992 tris (band 35200-36800); LOD1 0.5000, LOD2 0.2200 - 9 materials: fabric 2110, mesh 1424, shell 2168, nylon 4178, aluminium 4307, chrome 1308, tread 1920, leatherette 1624, steel 538 faces - UVs in 0..1, overlap 0; AABB 0.6781 x 0.6928 x 1.2788 m, zmin 0 - collider 995 tris (ceiling 1040); bake FINISHED; glTF 2708432 B - hygiene all 0, zero coplanar cross-shell pairs on the first run: the twin wheels' treads are crowned so no profile segment keeps its radius (mirrored twins would otherwise share tread planes), the welt is offset along the profile normal, the headrest stem starts 14 mm above the spine end inside the shared hub plate - 10 wheels, every lowest vertex at 0.00000 - star: spoke and boss gaps 72 deg (worst error 0.00003 deg), bosses and stems on 0.305 m (spread 0), stems plumb 0.000 deg, coaxial 0.0 mm, seated 34 mm (band 25-40) - gas lift: 0.0 mm off hub and socket axes, tilt 0, seated 52 / 28 mm - 5 armrest pairs mirrored and level (0.0 mm, eps 0.5), seat 0.4904 m, arms 0.1966 m over it, star diameter 0.6599 m, mass centre 0.2154 m inside the caster contact hull (29.18 kg, floor 0.12) - one connected assembly, 80 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-caster -> caster 3 body lifted: highest wheel bottom 0.00500 -> 16 - --skew-spoke -> spoke 0 turned 3 deg: worst gap error 3.000 deg -> 17 - --offset-column -> 0.00300 m off hub and socket axes -> 18 - --uneven-arms -> right arm raised on its bracket: mirror 0.01000 m -> 19 - --loose-wheel -> wheel slid off its axle end: 2 components -> 20 Envelope and tris unchanged under every falsifier; every earlier budget green. --skew-spoke first targeted spoke 1, which moved xmin 5.7 mm; it now turns spoke 0, which sets no extent. Render: render_hero.py wrote hero and preview. Framing fill x 0.272, y 0.850, margins 0.072-0.366 (tall subject: height carries the band). Asset-quality floors pass (edge90 0.024); a violation remaps to exit 21. Asset sheet (docs/gallery/asset-sheets/office-chair.webp): not the least- designed object in the lineup; the hydrant is plainer. It reads at once as a mesh-back task chair with headrest, T-arms, gas lift and five-star base on casters. Weak point: a tall narrow chair is small in its tile, so the knob, levers, seam and caster hoods are hard to see at panel size. Contact sheet: luma 0.2424 against calibration 0.2369-0.2428 (in band). Stage 0.2167 against 0.1919-0.2517 (in band). Wedge warmth +0.1142 against -0.1440/+0.1052/+0.0921 (warm pool on the wall). Saturation 0.2393 against 0.1525-0.2367 (slightly above: tangerine upholstery). Thumbnail legibility good; subject fill in width is the lowest in the lineup. The first draft measured luma 0.199; relit by raising the key, fill, rim and wedge. 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 (98 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 cdbf893 commit 8202fc7

57 files changed

Lines changed: 6423 additions & 94 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
@@ -180,6 +180,7 @@
180180
"showcase/desk-lamp",
181181
"showcase/quad-drone",
182182
"showcase/soccer-goal",
183-
"showcase/fallen-log"
183+
"showcase/fallen-log",
184+
"showcase/office-chair"
184185
]
185186
}

‎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, 42 pieces, each with a gallery `category` (sibling of examples/; see showcase/README.md § Categories)
25+
showcase/<name>/ - Budget-conformance props, 43 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>42 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>43 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 42 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 43 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>42 showcase pieces</strong> — click to expand the preview grid</summary>
109+
<summary><strong>43 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>
@@ -151,6 +151,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
151151
<a href="showcase/quad-drone/"><img src="showcase/quad-drone/preview.webp" width="24%" alt="Quad drone: a white-and-graphite camera quadcopter on four carbon arms with red lock rings, twin-blade props, rubber-footed skids and a three-axis gimbal camera, on a dark studio floor" /></a>
152152
<a href="showcase/soccer-goal/"><img src="showcase/soccer-goal/preview.webp" width="24%" alt="Soccer goal: a white 5 by 2 m youth goal with sloped rear supports and a sagging diamond-mesh net edged in red rope, on a turf patch with a painted goal line, on a dark studio floor" /></a>
153153
<a href="showcase/fallen-log/"><img src="showcase/fallen-log/preview.webp" width="24%" alt="Fallen log: a mossy log settled into a soil mound, its dark furrowed bark peeled in patches, a hollow ringed butt, tiers of shelf fungi, toadstools, ferns and fallen leaves, on a dark studio floor" /></a>
154+
<a href="showcase/office-chair/"><img src="showcase/office-chair/preview.webp" width="24%" alt="Office chair: a tangerine-upholstered mesh-back task chair with a headrest, T-arms, a chrome gas lift and a polished five-star base on twin-wheel casters, on a dark studio floor" /></a>
154155
</p>
155156

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

234235
[`fallen-log`](showcase/fallen-log/) — the second `nature` piece: procedural fallen forest log (one furrowed lathe along a bowed axis, bark peeled to sapwood scored by beetle galleries, a rotted hollow saw-cut butt with growth rings, a splintered snapped top, broken branch stubs, moss cushions on the top and shaded side, three tiers of bracket fungi, a soil mound with toadstools, ferns and fallen leaves), whose bed along its length, brackets rooted in the bark, mass centre over its contact patch, moss on up- and shade-facing surfaces and ground cover rooted in the soil are recomputed from the mesh, through the same pipeline. Falsifiers `--hump-ground` exits 17, `--float-fungi` 18, `--tilt-ground` 19, `--sunny-moss` 20, `--float-litter` 21.
235236

237+
[`office-chair`](showcase/office-chair/) — the second `household` piece: procedural ergonomic task chair (polished aluminium five-star base with ribbed spokes and five swivelled twin-wheel casters, a chrome gas lift in a telescoping cover under a tilt mechanism with knob and levers, a contoured upholstered seat with a piped welt, a reclined mesh back with a lumbar pad and headrest on an aluminium spine, height-adjustable T-arms), whose ten wheels on the floor, five-star spacing with plumb swivel stems on one circle, gas-lift column coaxial with hub and socket, mirrored level armrests with seat height and mass centre inside the caster contact hull, and single connected assembly are recomputed from the mesh, through the same pipeline. Falsifiers `--float-caster` exits 16, `--skew-spoke` 17, `--offset-column` 18, `--uneven-arms` 19, `--loose-wheel` 20.
238+
236239
</details>
237240

238241
## Examples

‎ROADMAP.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ Not committed; target list for the next content version. (v0.3.0 shipped the smo
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)~~ **SHIPPED** as `showcase/soccer-goal/` — 5 × 2 m youth goal, oval extrusion mitred and welded at the corners, cast brackets, foot connectors and hubs, sloped supports and a staked steel ground frame, sagging diamond-mesh net on a red head rope through 53 clips, turf patch with a goal line; `--float-bar` exits 16 on every ground bar bedded in the turf, `--short-support` 17 on the supports seated in their sockets, `--unclip-net` 18 on the head rope through every clip, `--wide-mouth` 19 on the clear mouth size, `--taut-net` 20 on the back panel's sag, while the envelope holds; tennis net on posts, weight rack with plates and dumbbells; alternates bowling pins and ball, skateboard
160160
- **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~~ **SHIPPED** as `showcase/fallen-log/` — furrowed log on a bowed axis with peeled, galleried sapwood, a hollow saw-cut butt, a splintered top, broken stubs, moss cushions, three tiers of bracket fungi, and a soil mound with toadstools, ferns and fallen leaves; `--hump-ground` exits 17 on the log bedded along its length, `--float-fungi` 18 on the brackets rooted in the bark, `--tilt-ground` 19 on the mass centre over the contact patch, `--sunny-moss` 20 on moss facing up or into the shade, `--float-litter` 21 on the ground cover rooted in the soil, while the envelope holds; tree stump with mushrooms; alternates flowering shrub, cattail reeds
161-
- **Household:** ~~articulated desk lamp~~ **SHIPPED** as `showcase/desk-lamp/` — stepped cast base, parallelogram arm sections pinned through knuckle bosses, three springs hung on cross bars, domed shade with reflector, lamp, flex and plugged cable; `--offset-pin` exits 17 on the pins coaxial with their eyes, `--unhook-spring` 18 on the spring ends seated on their bars, `--hollow-base` 19 on the mass centre over the base footprint, while the envelope holds; office chair (five-star base, casters), kitchen stool, mini fridge; alternates floor fan, laundry basket
161+
- **Household:** ~~articulated desk lamp~~ **SHIPPED** as `showcase/desk-lamp/` — stepped cast base, parallelogram arm sections pinned through knuckle bosses, three springs hung on cross bars, domed shade with reflector, lamp, flex and plugged cable; `--offset-pin` exits 17 on the pins coaxial with their eyes, `--unhook-spring` 18 on the spring ends seated on their bars, `--hollow-base` 19 on the mass centre over the base footprint, while the envelope holds; ~~office chair (five-star base, casters)~~ **SHIPPED** as `showcase/office-chair/` — polished five-star base with ribbed spokes and swivelled twin-wheel casters, chrome gas lift in a telescoping cover, tilt mechanism with knob and levers, contoured seat with a piped welt, reclined mesh back with lumbar pad and headrest on an aluminium spine, height-adjustable T-arms; `--float-caster` exits 16 on every wheel on the floor, `--skew-spoke` 17 on the five-star spacing and plumb stems, `--offset-column` 18 on the gas lift coaxial with hub and socket, `--uneven-arms` 19 on mirrored level armrests, `--loose-wheel` 20 on one connected assembly, while the envelope holds; kitchen stool, mini fridge; alternates floor fan, laundry basket
162162
- **Vehicles:** ~~quad drone~~ **SHIPPED** as `showcase/quad-drone/` — two-tone moulded shell with battery, GPS, grilles and visor, four folding arms hinged on pinned clevises, slotted motors with twisted two-blade props, rubber-footed skids, three-axis gimbal camera; `--float-foot` exits 16 on every foot grounded, `--unlock-arm` 17 on the motor axes on an exact X, `--long-blades` 18 on the prop-disc clearance, `--narrow-skids` 19 on the mass centre inside the landing footprint, `--drop-lens` 20 on one connected assembly, while the envelope holds; traffic cone and barrier set, 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)
164164
- Link vs append witness — `bpy.data.libraries.load(link=True)` yields a linked, non-editable datablock (`library` set, `is_editable` False) while append yields a local copy; write a temp .blend with `bpy.data.libraries.write`, then assert both paths

‎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 42 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 43 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 42 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 43 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 42 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 43 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 42 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 43 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>
55.8 KB
Loading
23.7 KB
Loading

0 commit comments

Comments
 (0)