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

_22 commits._

### Backend
- **Version 1.23.1, with the docs rebuilt: a level's block map in a game that has loaded no image shows plain blocks, a color for each type, where it asserted; EDITOR.md has a tested way to keep a level as a script for a game opened from disk, says a block map's sheet, and says that changing the editors' own tools takes an engine build of one's own, a changed copy of the file can not be loaded beside the engine; the package keeps its build script, jsconfig and bat files, the release zip is made of the same list** (6abaa95)
- **The npm package ships REFERENCE.md and EDITOR.md, and leaves out the build script, the jsconfig files and the bat file; CI checks the release bundle against the source too, and its job only reads the repo** (9396388)
- **Two hot paths make less each draw: the points of a transformed polygon, a circle's sides, are written into vectors kept for it; and the canvas a tinted Canvas2D draw works in is made again only when its size changes; smoke checks for a tinted tile and for a tinted texture with clear texels** (2ce900f)
- **glTF: KHR_materials_emissive_strength is read, so emission above 1 from Blender is as bright as it was made; a model that needs KHR_texture_basisu says so, and one that may use it says its textures are left out; a signed normalized value at its lowest reads as -1; the opaque decode of an image makes its room before it binds its framebuffer, and puts the bindings back whatever happens** (1b36345)
- **Small plugin fixes from the 2026-10-02 review: a tween callback that throws no longer leaves the list being walked held, which had every later update make a list of its own; the post process work canvas is made again only when the canvas changes size; a destroyed UIVideo lets go of its media; an atlas tag with no frames no longer drops the groups after it** (d22a729)
- **2D editor edge cases from the 2026-10-02 review: the undo list keeps the last 100 edits as the 3D editor's does; a level's file name is read as it is on disk, so a url with a percent in it matches the file picked; an autosave that storage had no room for marks the older one it still has, and a reload that brings that one back says it is older; a file that could not be written says so before it downloads; an object with no type in a Tiled map is passed by with no warning** (95d8846)
- **COPYRIGHT.txt has the ZzFXM notice, the plugin ships in every bundle, and the plugin's header says what it is a port of** (25bd268)
- **Opaque billboards are instanced: a sprite object, or a drawBillboard with no blend, is one more instance of the shared quad, batched as a mesh's uses are, so every sprite of a sheet is one instanced draw with nothing written per corner, its see through texels cut out by the shader; one that blends still goes through the stream in its sorted place. A billboard is unlit by a flag on its batch, in the instances and in the stream, and no longer sets the draw state and sets it back at every draw, which had every billboard pay the full state compare; a smoke check draws an opaque sprite** (e71e73a)
- **The build and the docs build make their output in a folder of their own and put it in dist and docs when all of it is there, so a step that fails leaves them whole; the deprecated names are kept until 1.25 at least; the README says what the engine has now: the 2D and 3D level editors and the guide to making them a game's own, prefabs, voxel maps, spotlights and lens flares, parallax, the effects library, pinch to zoom, scenes, and 100+ shorts; docs rebuilt** (be4c232)
- **Two reviews of 2026-10-02: a prefab's saves and its unsaved mark go by the prefab's name, so one closed and opened again keeps its saves in order and is not said to be in its file after an undo back past a Save; a UI button pressed and let go inside one frame is clicked once; a polygon side count that is not whole or is below zero no longer loops for ever; a click on a 2D editor object leaves its numbers as written, with no undo step; applying a waiting autosave leaves object layers it does not know about; what a game's tool adds through edit3D.change gets ids; a glTF texture is smooth or hard edged as its sampler says; a sound made with sound off counts as loaded; a timer set below zero is all the way through; setAdditiveBlendMode works headless; the release LevelEditor has keys, buttons and tools; jsconfig no longer names a folder that is gone** (f786464)
- **Docs template, the review's fixes: the outline marks the entry a deep link or click lands on, not the one above it; an old #.name link is turned into #name on load and when the hash changes; a getter shows its return as its type; an entry whose owner is not a namespace or class, the Ease curves, goes under the nearest rendered owner with its dotted name; a method named under the namespace by a @memberof is a build warning** (11e3abd)
- **Docs template: the look, dark with a light theme behind the toggle, the sidebar drawer and filter, search over the built index, the outline column marking what is in view; a member documented with @property alone takes its type from it; checked at desktop and phone widths** (ace0bb2)
- **Docs template: publish.js hands jsdoc's doclets to the renderer and writes the pages, the search index and the static files; the config points at tools/docs and clean-jsdoc-theme is gone; no source pages and no Global page, the site is a third of the size** (46edbdd)
- **Docs template: the class page with its crumb, inheritance both ways and the inherited names, the constructor first, members then methods, and the search rows** (d6b84c5)
- **Docs template: entries as one block each, a signature line with the return type and the GitHub source link, params as a compact list with optional and default inline, a param whose type jsdoc rejected read back from its tag with its optional flag and description, examples highlighted, and the namespace page with its index** (ffa31e9)
- **Docs template: the page shell with the header, the sidebar tree of namespaces and their classes, the outline column, and the README as the homepage** (6a94e22)
- **Docs template: types as html with the documented names linked, the raw type of a tag jsdoc rejected read from the comment, and a four color highlighter for the examples** (36e1f64)
- **Docs template: the model, namespaces in the REFERENCE order holding classes and entries, inheritance by short name, internal symbols left out, with a fixture the test runs jsdoc on** (a45282c)
- **Review 2026-10-01 pass 6 fixes: an edit inside a prefab that is undone there no longer leaves its autosave behind, to come back on a reload, and the level's other edits stay in it; a prefab edited again while an async onSave was still keeping an older save stays marked as not in its file; onSave is typed to take an async function, set on the editor or as a method of a class** (4d2a825)
- **Smoke suite: the Canvas2D text check looks for yellow anywhere in the square the letter is drawn in; one pixel at its middle is half the background's with the font the GitHub runner has, and the job failed there** (a72b36e)

### Docs
- **Docs: the homepage images are back, the last build had failed after jsdoc on the template's own warning and the images are copied after; the warning was a stray @memberof on UISystemPlugin.destroyObjects, dropped, so the method is on its class page; the header shows the logo in place of the favicon** (1eb2a8c)
- **Docs: AGENTS.md says where the site's template lives and how it is tested; the site rebuilt with it** (04a4efc)

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