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

_144 commits._

### Features
- **feat: add gameRender function to display engine font and characters** (d6e6213)
- **feat: add comprehensive LittleJS engine quick reference sheet** (2ab611a)
- **Add gradient noise functions and update drawRectGradient parameters** (f52ab49)
- **feat: add 1D and 2D gradient noise functions with corresponding tests** (4304a24)
- **feat: add glDrawUntextured function for optimized untextured rectangle drawing** (d7e6888)
- **Add primitive count tracking for enhanced debugging** (f85b035)
- **feat: add drawCircleGradient for radial gradient circles** (0d829e3)
- **feat: add property annotations for clarity in Medal, NewgroundsPlugin, PathFinder, and Tween classes** (8820d0f)
- **feat: add method to drop collinear nodes in path smoothing** (1cea233)
- **ui: add anchor property for screen/parent-relative positioning** (01db8ff)

### Fixes
- **fix(engine): ensure rootElement defaults to document.body if not provided** (a556318)
- **fix(engine): remove unused dpad digital style input handling** (eefe189)
- **fix(newgrounds): bail early when first API call fails so offline games don't freeze** (adea7dd)
- **fix(engine): zero first-frame delta and add release-build double-init guard** (2184358)
- **fix(audio): plug node-graph leak, harden getCurrentTime, cancel stacked fades** (be25c06)
- **fix: smallMoveUp zero-gravity defaults to step-up; refine mirror docs** (0e2c4de)
- **fix(postProcess): bind default framebuffer before rendering** (9591ebf)
- **fix: reset glBatchCount on context loss so restore doesn't draw garbage** (758b849)
- **fix: smallMoveUp follows gravity sign so inverted gravity works** (910fc16)
- **fix: tile collision and tile layer issues found in deep-dive review** (f05e368)
- **fix(platformer example): handle undefined getData return at level edges** (c0bacfc)
- **fix(uiLayout): adjust button dimensions and text height for better layout** (3e7a7cf)
- **fix: updatePhysics also bails mid-loop when collision callback destroys self** (fbb1909)
- **fix: wrap sign/hypot/log2 in function expressions so .d.ts gets signatures** (1ac3ec5)
- **fix(music short): fall back to 0 when musicInstance is undefined** (a2f3e5b)
- **fix(breakoutTutorial): correct wall position comments** (4559413)
- **fix(breakout example): correct wall position comments** (c8c03c5)
- **fix(examples): add viewport meta to all example index.html files** (0e5b095)
- **fix(pathFinder): A* diagonal step blocked only by walls, not by cost** (25dd094)
- **fix: guard EngineObject.addChild and updatePhysics against destroyed self** (c341361)
- **fix: drawTextScreen preserves canvas state; isOnScreen handles cameraScale=0** (f246d11)
- **fix: tolerate localStorage failures in readSaveData and writeSaveData** (e5d4b2d)
- **fix: Sound.getDuration returns 0 (not undefined) when loading** (54274cd)
- **fix(tweenSystem): clamp Ease.EXPO and Ease.ELASTIC at boundary inputs** (8672461)
- **fix: glMakeOutline miter limit is a dimensionless ratio, not a length** (bbbfcdd)
- **fix: correct randInCircle annulus distribution and make isOverlapping symmetric** (b9f8438)
- **fix: add local directory to .gitignore** (10298f7)
- **fix: add type-guard annotation to isArray helper** (ff89cfa)
- **fix: add time=0 default to debugLine** (bb91f23)
- **fix(uiSystem): clear destroyed-object refs, dedup drag listeners, fire onChange on slider nav** (c9cd32e)
- **fix(tweenSystem): reuse same Tween object across loop iterations** (c6dec01)
- **fix: export zzfxM from plugins** (ddcbf60)
- **fix(newgrounds): handle API error responses without crashing** (6b441ee)
- **fix(box2d): setMassData no longer silently ignores zero values** (0940505)
- **fix(platformer example): correct ladder left/right check and init walkSoundTime** (4aa64c3)
- **fix(box2d example): SoftBodyObject/ClothObject grid typos** (60470b7)
- **fix(postProcess): restore UNPACK_FLIP_Y_WEBGL after render** (39ba959)
- **fix(box2d): debug DrawTransform, destroy tracking, raw-body contact listeners** (2ae3a14)
- **fix: guard speak and speakStop against missing speechSynthesis global** (9fdb3f8)
- **fix: clamp randInCircle minRadius/radius ratio to avoid NaN** (560e199)
- **fix: rename formatTime sign local to avoid Math.sign shadow; Timer.getPercent returns 1 for zero-duration elapsed** (a041e15)
- **fix: accumulate mouseWheel across frame instead of overwriting** (4ef7f75)
- **fix: add release-build safety return after poly-too-large assert** (1b982ab)
- **fix: add WHITE color defaults and tighten TileInfo.frame bounds check** (260e0b8)
- **fix: remove redundant particle collide callback with wrong arg shape** (a0e8e47)
- **fix: assert poly batch size, hoist sin/cos out of transform loop, fix typo** (273a16b)
- **fix: parenthesize collision data index computation in TileCollisionLayer** (d2729a8)
- **fix: export missing setTouchGamepadDisplayTime** (5fade25)
- **fix: anchor fade-out ramp at current volume and return undefined when sound is loading** (cbf23ef)
- **fix: simplify child removal logic in EngineObject class** (0cd728f)
- **fix: correct member reference for canvasClearColor in engineSettings.js** (f84962e)
- **fix: correct array indexing in TileLayer class for better readability** (bb321d6)
- **fix: correct reference to API quick reference sheet filename** (9d3fd21)
- **fix: synchronize mipmaps with new texture data in glSetTextureData** (334657d)
- **fix: update speak function parameters to change language position** (9be2665)
- **fix: reorder buttons in gameInit for correct display order** (10d946a)
- **fix: correct player size in constructor to match intended dimensions** (9f0c212)
- **fix: adjust 1D noise curve positioning to center it in the view** (1894063)
- **fix: update default colorBottom in drawRectGradient to CLEAR_WHITE is is the same as drawCircleGradient** (7959035)
- **fix: rotate drawCircleGradient boundary vertex per call** (4606d0a)
- **fix: drawCircleGradient leaks a spoke when stacked at the same position** (06caea9)
- **fix: update drawCircleGradient to use GREEN as color** (e560b79)
- **fix: update drawCircleGradient to use CLEAR_WHITE as default outer color** (75f90cd)
- **fix: update shapes rendering for improved visuals and consistency** (649816e)
- **fix: update default maxLoop to 1000 and reduce debugTime to 1 for improved performance** (e102294)
- **fix: reduce debugTime from 2 to 1 for improved performance** (39697e8)
- **fix: increase maxLoop limit for pathfinding to improve performance** (2f29478)
- **fix: update A* pathfinding heuristic to use octile distance for improved accuracy** (7963ab9)

### Backend
- **Revise Hello World game description and script path** (699b452)
- **build** (e0141e9)
- **build** (ea3c8ae)
- **1.18.15** (139ef11)
- **build** (c33849f)
- **build docs** (9de95b1)
- **build** (ed2c5f7)
- **build** (c622fac)
- **build** (430d396)
- **build** (af40166)
- **build** (a35b0eb)
- **build** (205d2ee)
- **build** (3a5d4e9)
- **1.18.14** (508b91d)
- **build** (c6b65e5)
- **build** (1f13781)
- **build** (485d430)
- **Bump version to 1.18.13 and update engine font handling** (190d835)
- **Refactor font system: rename FontImage to ImageFont and update references** (2d09690)
- **Enhance touch gamepad start button activation logic** (8d5792f)
- **build** (a930d69)
- **build** (6e86a6c)
- **improve RandomGenerator.floatSign to not call float twice** (1966c5d)
- **clean** (27c520d)
- **1.18.12.1** (43dcc41)
- **1.18.12** (bf8834c)
- **Bump engine version to 1.18.11.1 in both release and engine files** (0560331)
- **build** (3a1408c)
- **bump version to 1.18.11** (6a1bddc)
- **1.18.11** (1e20cbf)
- **build** (fa054d1)
- **Update Box2D integration description in README** (46b3b22)
- **build docs** (dc0be3f)
- **1.18.10** (60f3931)
- **1.18.9** (49ca521)
- **allow faster time scale without clamping** (1027e14)
- **build** (e0def0d)
- **1.18.8** (0caa216)
- **cleanup: rename isString to isStringLike, revert audio init, drop dead tween.js** (d5de98b)
- **ui: enhance hamburger menu toggle button with stacked lines and adjust size** (089379b)
- **ui: document anchor property and demo top-left anchor** (ff5de44)
- **ui: migrate remaining shorts to anchor-based positioning** (4a1e21a)
- **Update package.json to include additional files in the distribution** (c69da1a)

### Docs
- **docs: enhance FAQ with additional questions and formatting improvements** (3451dd0)
- **docs: update README with minimal Hello World example and improve links** (5ae38b7)
- **docs(vite-starter): clarify Node 20.19+ requirement comes from Vite** (f7bd6fd)
- **docs(REFERENCE): correct defaults and signatures** (2c887ea)
- **docs(FAQ): correct cameraPos name and postProcess defaults** (12b426c)
- **docs: clarify EngineObject.mirror affects rendering only** (75f0a6d)
- **docs: clarify ParticleEmitter fadeRate splits between fade-in and fade-out** (9f5bd13)
- **docs: correct debugText JSDoc title** (d90003c)
- **docs: clarify padding and bleed parameters in TileInfo constructor** (05e0f06)
- **docs: clarify drawCircleGradient performance characteristics and limitation** (9d43d53)
- **docs: demo drawCircleGradient in the shapes short** (e18779c)
- **docs: enhance README with Box2D integration details and link** (474c168)
- **docs: update AI-related links in README for clarity and consistency** (cac484e)
- **docs: clarify instructions on keeping agent-generated files under .claude/** (a531170)

### Chore
- **chore: declare Node 18+ engine requirement** (d112a49)
- **build: drop --warning_level=VERBOSE from Closure Compiler call** (ab99ff6)
- **refactor: use min alias and add missing parameter defaults** (bbd8eb7)
- **refactor: use isArray helper instead of raw Array.isArray** (ba8ab70)
- **refactor: rename FontImage to ImageFont and update related references** (0104f10)
- **refactor: rename drawCircleGradient to drawEllipseGradient and update related logic** (440f4f7)
- **refactor: simplify untextured drawing logic in WebGL** (574785c)
- **refactor: update color sampling in gameRender to use separate noise regions** (618b4bf)
- **style: align drawCircleGradient with surrounding draw function style** (afcaa17)

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