## KilledByAPixel/LittleJS — v1.23.1…v1.24.0

_34 commits._

### Features
- **Example browser: the write-ups link out. In a code span, each name the docs' index knows links to its docs entry in a new tab, the page loading docs/search.js for the map, a namespace's entry winning over a class member's and a name two classes share left plain; from See also on, an example's name links to that example and switches to it in the page, clearing a search that had hidden it, and the start-up picks the example by name the same way; a test keeps every See also naming a listed example, and the write-ups that pointed at REFERENCE and EDITOR.md now link or lean on the docs links** (a23e3b0)

### Fixes
- **1.24.0: the scene flare fix in its changelog, and dist and the zip built again** (af60777)
- **dist rebuilt after the ZzFX comment fix** (e14ce62)

### Backend
- **Review 2026-10-02 pass 3: the 3D editor's scene baseline keeps whether an earlier level's scene gave the sun a lens flare, so an edit of this level's scene, or its undo, no longer takes it away; DeepScan: tileLayersFromLDtk reads the tilesets of a missing project as none** (55b26d9)
- **1.24.0: LDtk tiles stacked in one cell go in layers of their own above it, as LDtk draws them, found loading LDtk's own sample projects; dist, docs and zip built again** (895663a)
- **1.24.0: lens flares on lights and in the 3D level editor, triangle accurate 3D picking, LDtk levels, Tiled tileset margin and spacing, a write-up for every short, and the changelog; dist and docs built for the release** (1fb0dfb)
- **LDtk levels load: tileLayersFromLDtk makes a level of an LDtk project a Tiled map, for tileLayersLoad, objectLayersLoad and the level editor; a Tiled tileset kept in the map with a margin or a spacing is read where its tiles are** (0762213)
- **Tests: the review round files that are about one subject are named for it, subject first, so a subject's tests sort together: r4-box2d is box2d.r4, r5-3d is render3d.r5** (ec7b145)
- **dist is committed only for a release: the site is built and deployed by a workflow on every push to main, so the live examples run the engine of the source they are in, and the tests no longer ask that the committed bundles match the source** (2c9d69a)
- **CHANGELOG.md, started from the release notes of 1.20.0 on with what is not released yet on top, and in the npm package; a root index.html that goes to the example browser; the README links the reference and the changelog** (9ec12c7)
- **A level's scene block has lensFlare, the sun's lens flare, with a checkbox in the 3D editor's Scene box: on makes one unless the sun has a flare already, off takes away only the one a scene made** (d85dadb)
- **Lens flare, before it is released: a flare that would not draw, off the screen or of a light that is off, sends no ray; a DirectionalLight3D's flare is far away where it shines from; a flare whose light is destroyed goes with it; getScreenPos and isHidden in place of getSunScreenPos and isSunHidden, since a flare may be a light's; the 3D example has the sun's flare and one on each orb** (e7839be)
- **Light3D.addFlare() gives a light its lens flare and returns it, and light.flare is only ever the flare: a property that took true and gave back an object could not be typed; the level Light's property is lensFlare** (54448ba)
- **Review 2026-10-02 pass 2: a light's flare is its child, so it stays with a persistent light through a scene change; a flare destroyed on its own is no longer the light's, and true makes another; the TypeScript way to change a light's flare is written down and type checked** (2065574)
- **3D Lens Flare short: the lamp is gone, and H makes every ghost a hexagon, with no streaks among them** (9d8ee95)
- **ZzFX** (175dc95)
- **No mention of ZzFXM is left: REFERENCE loses the removal note, and the docs are rebuilt without its pages and its place in every sidebar** (0e4f364)
- **Physics short: Space pushes each box toward the mouse** (248a835)
- **3D picking hits a mesh on its triangles: render3D.pick, engineObjectsRaycast3D and the 3D editor test the faces that show, both sides of a doubleSided mesh, after the sphere and the box as quick rejects, so a click beside a ball or a cone no longer takes it; a mesh seen from inside is not hit, as it is not drawn; the lens flare's lamp check goes by the light being inside the lamp's box** (a6b28c5)
- **Lens flare: light.flare = true gives a Light3D a flare of its own, destroyed with it, and a level's Light has a flare property; three more shapes, hex, streak and star; an element may be a tile of the game's own, turned, and wider than tall; shapes, glowSize and ghostSize shape the made flare** (bbf8de0)
- **Three shorts the write-ups showed were missing: Text, what drawText can do, size, outline, alignment, fonts and styles, rows, a squeezed line, a turned one and text placed in pixels; Random, rand and its family beside a seeded RandomGenerator that gives the same dots for the same seed; and Physics, the engine's own objects falling, bouncing by restitution, sliding by friction, a balloon with negative gravityScale, and a sensor that lets boxes through from collideWithObject** (9406727)
- **ZzFXM is gone: the tracker music plugin was made for the js13k size limit and no one needs it in the engine, so its plugin, exports, build entry, tests, docs namespace, FAQ answers and copyright notice are removed, the shorts and the starter no longer load it, and REFERENCE's Deprecated section says a game with a song in that format includes ZzFXM itself and hands its samples to a Sound** (d45fa03)
- **Shorts: a pocketed cue ball comes back where it started; the 3D Voxels player floats in water, rising to its surface, and can jump out; the 3D Puzzle blocks stand on the floor and no longer reach a little under it; Particle Options names its effect once, so the title follows a changed one** (3f9be65)
- **Shorts, what writing them up turned up: the lander is safe by the cosine of its angle, so one that has turned all the way around and is upright lands; the maze reaches its top row and works at even sizes, checking the room two cells away is inside the outer wall; Vibrate's buttons take a tap and Input's point follows a touch outside the touch gamepad; Object Raycast draws its rectangles upright, as the ray tests them; in 3D Shaders the sun is low behind the wall, whose shadow now falls across the two objects as its comment says; the 3D Voxels player starts on a hill and wades through water; the ball track reaches its rightmost cell; the image font text has no empty first line; the list says value noise, the shape builders and more tween features; and comments that said the wrong thing, lines that did nothing and missing semicolons** (7d35dfa)
- **Shorts: every short has its write-up, what it shows, how its code works, things to try in the editor and where to look next, each claim checked against the engine source and each edit it suggests run in the example browser; a test keeps every listed short and full example with one** (61d2f65)
- **Example browser: the info box is under the code, a quarter of the column's height, and always there at the same size, so the page does not change from one example to the next; Show Info, beside Live Edit, hides it and is remembered; a full example has its write-up in shorts.js, and a short with none yet shows its description; the example list has the space under the preview back** (0ed12b1)
- **DeepScan: a test put the circle side count back with a condition whose two branches were the same; it puts back the count it had** (f9418b8)
- **3D Basics: its write-up's last lines within 80 columns** (13b4988)
- **Short info, the review's fixes: a star in the middle of words or sums in a write-up stays a star and is not read as italic; the tile sheet has tiles 0 to 13, 3D Shapes does not have every mesh builder, and ambientColor is the light from above that setSky had set** (2032205)
- **AGENTS.md: a short's info block** (a3980e8)
- **Shorts: Hello World, Particles, Tile Layer, Pong Game and 3D Basics have their write-up, what the example shows, how its code works, things to try in the editor and where to look next, as the pattern for the rest** (43daec6)
- **Shorts: what a short is about is in its info block at the bottom of the file, where the example browser shows it, and no longer in a comment at its top; a test keeps a short starting with code and its one block comment last** (66ad18b)
- **Example browser: the info box, under the preview and its buttons and above the example list, the two sharing the height, scrolling on its own and hidden for an example with no write-up; in the stacked layout of a narrow window it is at most 40% of the window tall** (2cb2d67)
- **Example browser: a short can end with its write-up, a block comment that starts /* info, which the browser takes off the code it shows and runs and turns from markdown into html for a box of its own** (22c7ee0)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/KilledByAPixel/LittleJS?utm_source=github-action)._