## KilledByAPixel/LittleJS — v1.18.15…v1.18.26

_247+ commits._

### Features
- **Add release build system** (2970581)
- **Add engineStep to advance the engine one frame at a time** (68e12f5)
- **Add LittleJS + JS13k section to README** (84cf953)
- **Add feature to load sprites and animations from texture sheets at runtime** (7e7d616)
- **add sourcePadding to loadSprite for pre padded source images** (4e1cd26)
- **add loadAtlas to import TexturePacker and Aseprite atlases** (35b0f9b)
- **add texture sheet plugin, loadSprite packs images at runtime** (df3095d)
- **add TileInfo columns so frame() can wrap multi row animations** (1390dd5)
- **add Three.js plugin section to README for 3D rendering support** (9fd536a)
- **add option to use strict mode in code execution** (18ee656)
- **add three.js plugin: render a 3D scene behind the LittleJS canvas** (c5dfc0a)
- **add three.js platformer to example browser and README** (673cd59)
- **add three.js platformer example: 3D game driven by LittleJS** (cb237b9)
- **add three.js example to README** (666469f)
- **add three.js example to example browser** (d6b2d00)
- **add three.js example: 3D layer behind LittleJS canvas** (25a7622)
- **feat: tile padding setting and default texture button in particle editor** (50f4e03)
- **feat: drag and drop custom texture in particle editor** (63b8fcd)
- **feat(particles): add emitSize handling in particle settings** (37ead4f)
- **feat(input): track lastInputDevice; derive isUsingGamepad from it** (8be7aa9)
- **feat(Color): add withAlpha method to create color copies with specified alpha** (06b080a)
- **feat(camera): add cameraFit function to adjust camera position and scale based on world space rectangle** (6dbde96)
- **feat(color): add setAlpha method to modify color alpha and return self** (5fdbb94)

### Fixes
- **Fix three.js canvas missing from screenshots and video capture** (16090ab)
- **Fix image font dropping a row of pixels** (24578ba)
- **Fix alignment in Engine globals block to column 23** (e28c3a6)
- **try to fix npm** (e0958a6)
- **fix: ensure newline at end of file in multiple scripts** (ad248ed)
- **three.js platformer: fix pushing into box sides, desync coin spin** (1f11a13)
- **fix: tile collision ignored layer position offset** (3e601fa)
- **fix: use padded tiles.png in particle editor instead of bleed shrink** (4ba6658)
- **fix: replace HMR with full page reload to avoid ghost listeners and duplicate render loop** (548ba2f)
- **fix(math): oscillate produced out-of-range values for negative time** (af4ae52)
- **fix(tween): assert when a tweenProperty path fails to resolve** (9a222d1)
- **fix(newgrounds): handle non-JSON API responses gracefully** (99b798f)
- **clean(box2d): fix drawFixture useWebGL param casing** (4720503)
- **fix(debug): disconnect video capture audio node when capture ends** (0c8872e)
- **fix(tileLayer): render ignored drawSize** (735cb65)
- **clean(examples): fix spaceGame bullet spawn angle and missing semicolons** (270e67d)
- **fix(ui): showConfirmDialog returns the menu object as documented** (1fc024a)
- **fix(input): suppress touch delta jump when the primary finger changes** (4ec90eb)
- **fix(box2d): setFilterData changes were not applied to existing contacts** (a318844)
- **fix(box2d): prismatic and wheel joint axis used wrong body frame** (e4dd7b8)
- **fix(box2d): joint referenceAngle sign was reversed** (3c6b588)
- **fix(box2d): setPosition flipped the body angle** (151e837)
- **fix(math): isPowerOfTwo no longer returns true for zero** (7608316)
- **fix(input): preserve wasPressed flag on key release with WASD emulation** (717a356)
- **fix: don't suppress partner collision callback when an object self-destructs** (cc4198f)
- **fix(ui,input): stop dialog-close crash and touch passthrough while paused** (2336537)

### Backend
- **1.18.26** (8bdf434)
- **Low Resolution Output** (c0ff3b1)
- **low res demo** (d6af080)
- **background gradient** (40b827b)
- **Document the docs build workflow in CLAUDE.md** (057e0e3)
- **build docs** (c17fb9c)
- **Move docs build into the repository** (32eef77)
- **Merge branch 'main' of https://github.com/KilledByAPixel/LittleJS into main** (9720a9d)
- **1.18.25** (5b4d22e)
- **Guard engineStep against release-build RAF double-scheduling and correct timeScale documentation** (3fb11ac)
- **Document headless testing with engineStep in REFERENCE.md** (58c101d)
- **Cap engineStep at a maximum frame count to prevent runaway loops** (b46e67f)
- **readSaveData asserts its default is an object** (50337de)
- **1.18.24** (9d80ab4)
- **sourcePadding can be a vec2 for asymmetric source gutters** (a1171b1)
- **1.18.23** (b409c32)
- **1.18.22.1** (c6ff145)
- **1.18.22** (2d37e79)
- **comments** (8877eaa)
- **Increase texture sheet size to 2048 for improved sprite packing and update demo to utilize smaller sheet size. Adjust rendering logic to display multiple texture sheets and modify animation frame stepping.** (a615a95)
- **reorder** (75f15a9)
- **clean** (9d4dfd7)
- **clean** (a4dbb44)
- **grapple** (9186125)
- **clean** (8765f0a)
- **smaller** (79bd830)
- **front and restart button** (0c116b8)
- **3 sides** (29ccbba)
- **remove unused variables and simplify game initialization of shorts** (ca69b2b)
- **back out default** (a4f0d5c)
- **set default button parameter for mouseWasPressed function** (49052c6)
- **tweak** (1af5b6b)
- **simplify** (2116bb1)
- **rename** (dd95a18)
- **rename** (4ed09eb)
- **clean** (4ff7d74)
- **clean** (c352fec)
- **clean** (3c8d81b)
- **cleaner** (dd2f596)
- **smaller** (b693dfa)
- **skydreams** (1c6f7a3)
- **smaller** (f011a54)
- **cleaner** (3eb7b5d)
- **skydream** (ac1dba6)
- **enable webgl** (68cc0a2)
- **build** (2af7381)
- **1.18.21** (b1fe790)
- **three.js plugin and examples: comment and cleanup polish pass** (c4871a3)
- **refactor comments for clarity in platformer and side scroller examples** (fc8cdc7)
- **three.js plugin: review fixes for camera realign, guards, and doc warnings** (b351960)
- **rewrite platformer on three.js plugin, move to threejs/platformer** (663756b)
- **rewrite three.js example on the plugin, move to threejs/sideScroller** (e215370)
- **three.js platformer: fixed-rate camera smoothing, derive start pos from offset** (79e5a3d)
- **three.js example: remove square from player marker, keep crosshair** (8b5cd43)
- **three.js example: skip default 2D rect render for mesh objects** (accf7d2)
- **three.js example: review fixes for fog scaling, destroy forwarding, style sync** (4724c5d)
- **three.js example: MeshObject pattern, player, parallax demo content** (4397ba6)
- **build** (c19a024)
- **1.18.20** (7db83b6)
- **update physics before object updates in engineObjectsUpdate function** (9e5ff06)
- **Enhance README with AI Friendly resources** (3d29eec)
- **1.18.19.1** (785d4a4)
- **1.18.19** (5fdd6eb)
- **docs** (f4ec68b)
- **clean(build): use path.basename for extra file copies** (543fb85)
- **clean(box2d): remove always-true condition in addEdgeLoop** (966a760)
- **clean(postProcess): comment the canvas clear trick** (0f252d0)
- **clean(particles): remove incorrect comment about collideCallback** (f585ff9)
- **1.18.19** (5ffc847)
- **clean** (84a102b)
- **Refactor setAdditiveBlendMode to remove context parameter** (8808b98)
- **1.18.18** (daa683b)
- **build** (e3b47e2)
- **increase inputMouseMoveThreshold** (ed26a00)
- **clean** (2a0a5ea)
- **build** (ed7715f)
- **build** (121bd6d)
- **build** (8ceb939)
- **1.18.17.1** (acafc15)

### Tests
- **test: SoundInstance state machine and input surface coverage** (4519228)
- **test: guard REFERENCE.md against export drift** (bb00771)
- **test(inputDevice): correct default value for inputMouseMoveThreshold in tests** (5f227f7)

### Docs
- **docs: expand REFERENCE.md with missing public API** (499d6de)
- **docs: fix PostProcessPlugin class description and soundVolume note** (219a8fe)
- **docs(particles): example comment listed params that are not passed** (fee7039)
- **docs: SoundInstance method is resume, not unpause** (1709a33)
- **docs: correct and expand REFERENCE.md** (47d6fe8)
- **docs: fix JSDoc inaccuracies in audio and timer** (90736ed)
- **docs(input): fix keyboard-scan comment and annotate gamepad constants** (39d8b9b)

### Chore
- **refactor: rename TileInfo.tile() to TileInfo.index()** (bb08b2c)
- **build: rebuild engine with oscillate and doc fixes** (8a1be1a)
- **build: rebuild engine with tileLayer, debug, and plugin fixes** (0fb12c2)
- **build: rebuild engine with box2d, input, and ui fixes** (384688d)
- **build: rebuild engine with input, math, and doc fixes** (14def98)
- **refactor(particles): improve additive blend mode handling in particle drawing** (29e35bd)
- **ci: skip Electron binary download in test workflow** (5fb3dd0)
- **refactor(blending): rename setBlendMode to setAdditiveBlendMode for clarity** (f3fea73)
- **refactor(drawUtilities): enhance documentation for nine-slice and three-slice functions** (aff4f12)
- **refactor(camera): improve comments in cameraFit function for clarity** (2bfd1bc)
- **refactor(camera): improve cameraFit function for better margin and inset handling** (560f4a2)
- **refactor(uiSystem): rename UIObject pos to nativePos** (747b873)

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