Thirteen years, nearly 4,000 commits, and over 120 contributors later: Excalibur.js is v1.0.0!
Highlights new in v1
- 2D Lighting
- Pause System
- Serialization System
- Faster Realistic Physics
- MULTI-pass Materials & Post-processors
- Sound: a real Web Audio mixer and sound manager
- Plugin API
- Excalibur CLI for doing upgrades and codemods!
Breaking Changes
We have done our best to write codemods to auto-upgrade everything https://github.com/excaliburjs/create-excalibur
-
ESM Only output
-
Time units are implicitly milliseconds everywhere, with no
Mssuffix on public API:Engine.currentFrameElapsedMs->currentFrameElapsed,Engine.currentFrameLagMs->currentFrameLag,FrameStats.elapsedMs->elapsed,GifFrame.delayMs->delay,ClockOptions.defaultUpdateMs->defaultUpdateSound,SoundTrackandPlayOptionsposition/duration,seek(),getPlaybackPosition(),getTotalPlaybackDuration()andSoundTrack.scheduledStartTimeare now in milliseconds (previously seconds).sound.play({ duration: 500 })now plays for half a second.
-
API naming is now consistent: synchronous boolean state is always a getter (
isX), side-effecting calls are verb methods, and async state is a Promise property that never has anisX()form. Zero-argisX()/hasX()methods became getters, drop the parentheses:Entity.isKilled(andActor),Engine.isRunning,Engine.isDisposed,Clock.isRunning,Scene.isCurrentScene,CollisionContact.isCanceled,CoroutineInstance.isRunning/isCompleteSoundandSoundTrack:isPlaying,isPaused,isStoppedLoadable.isLoaded(Resource,ImageSource,Font,Gif,Sound,SoundManager,DefaultLoader)Matrix/AffineMatrix.isIdentity,Transform.isMirrored,BoundingBox.hasZeroDimensions,Camera.hasChanged,ActionQueue.hasNext/isComplete,Graphic.isStale,RendererPlugin.hasPendingDraws,WebAudio.isUnlocked,Serializer.isInitialized- Methods that mutate or do real work stay verbs:
PolygonCollider.isConvex->checkConvex()(O(n)), the mutatinghasChangedgetter onSparseHashGridand its collision processor ->refreshAndCheckChanged(), and everytoggleEnabled(enabled)on the input classes ->setEnabled(enabled)(it takes an explicit value, it never toggled) - Settable booleans follow the same
isXnaming as the already-shippedisVisible: thevisibleoption onActorOptions,TriggerOptionsandGraphicsComponentOptionsis nowisVisible, andParticle.visibleis nowParticle.isVisible Tile.solid(TileMapandIsometricMaptiles) and thesolidtile option are nowisSolidGarbageCollector.running()is now the getterisRunning;FontTextInstance.disposedis nowisDisposedSlide({ easingFunction })is nowSlide({ easing }), matching every other transition; previouslyeasingwas silently ignored bySlide- Pausing:
Actor.paused(aPauseComponent, not a boolean) andParticle.pausedare now the read-onlypauseComponent,PauseComponent.pausedis now the read-onlyisPaused, andPauseComponentInterfaceis nowPauseComponentOptions. UseActor.canPauseandActor.isPausedfor everyday code - Spelling:
isOffScreen->isOffscreen(one word, like the web platform'sOffscreenCanvas; "on screen" stays split:forceOnScreen,onScreenOnly,getOnScreenTiles()),isHiDpi->isHiDPIonEngineandScreen, andFuture.isCompleted->isComplete - Renamed:
Color.equal->Color.equals - Renamed:
Engine.loadingComplete->Engine.isLoaded;Engine.ready(boolean) ->Engine.isReady;Engine.isReady()(Promise) ->await engine.ready;Animation.done->Animation.isComplete;Timer.completeandTransition.complete->isComplete;Gamepad.connected->Gamepad.isConnected;SystemManager.initialized->isInitialized;Engine.toggleInputEnabled(enabled)->Engine.setInputEnabled(enabled); graph edge optiondirected->isDirected;PointerEvent.active/WheelEvent.active->isActive;Transition.started->hasStarted;Gamepads.enabled(polling opt-in) ->Gamepads.pollingEnabled
-
Sound: the audio implementation abstraction has been removed and Web Audio is the only implementation.
ex.WebAudioInstanceis replaced byex.SoundTrack(returned bySound.instancesandNativeSoundEvent.track), and theex.Audio,ex.AudioImplementation,ex.ExResponse,ex.ExResponseTypeandex.ExResponseTypesLookupexports are gone (pass the response type string tonew ex.Resource(path, 'arraybuffer')instead). Per-track volume moved to the owningSound, soSoundTrackhas novolume. -
Sound.play()always starts a new track and never changes the Sound's configuration. Previouslyplay()resumed paused tracks, andplay(volume)/play({ volume })permanently setSound.volume. Use the newSound.resume()to continue paused (or seeked) tracks, andplay({ volume, pitch, playbackRate, loop, position, duration, scheduledStartTime, onPlay })for one-off overrides that apply to that track only (volumemultipliesSound.volume).play(volume: number)still works as a one-off volume but is deprecated. The unusedSound.scheduledStartTimeproperty is removed, use the play option. TheonPlayhook'ssourceis now the track's per-play volume gain (anAudioNode); the buffer source is available asbufferSourcefor param automation. -
SoundManager.play(name, volume)is nowplay(name, options?)taking the samePlayOptions, andSoundConfig.channels(a list) is now a singlechannel. -
SoundManageris now a real Web Audio mixer (Sound.output → mix gain → SoundChannel → SoundManager.output → speakers) instead of multiplying volumes intoSound.volumeon each play:- A sound routes through a single
channel(SoundConfig.channel,SoundManager.setChannel()) rather than a list ofchannels;addChannel()/removeChannel()are removed. Channel volume and mute apply to the whole channel viaSoundChannel(manager.getChannel('music'),manager.channel.setVolume/mute/...). SoundManager.volumeis the master volume (defaultVolumeis removed) andplay(name, volume)passesvolumethrough toSound.play()untouched;setVolume/getVolumeread and write the sound's mix gain and never writeSound.volume.- Muting (sound, channel or master) silences playback instead of pausing it, so muted sounds still play and are audible mid-clip when unmuted.
mute()/unmute()/toggle()with no argument act on the master output. SoundManager.play()andSoundManager.channel.play()resolve to aboolean(false when the sound was unknown or dropped by a concurrency cap) instead ofvoid.ChannelCollectionis constructed with only the manager, and the quasi-internal_muted,_isMuted(),_getEffectiveVolume()and_activeTrackCount()members are replaced byisMuted()andplayingCount().
- A sound routes through a single
-
Behavior change - Excalibur screen space is now consistently rooted at the top-left of the safe content area (
Screen.contentArea) across the whole API. Previously the clipping display modes (FitScreenAndFill,FitContainerAndFill,FitScreenAndZoom,FitContainerAndZoom) disagreed about where screen space started:CoordPlane.Screenentities and pointer events were rooted at the content area's corner, butScreen.worldToScreenCoordinatesreturned raw canvas/resolution coordinates andScreen.contentArea.left/topcarried the canvas-space inset. Every API now shares the single content-area-rooted definition, which fixes several pointer, transition, andunsafeAreabugs in the clipping display modes, but is a breaking change for code that relied on the old canvas-rooted values:Screen.worldToScreenCoordinates(point)now returns coordinates rooted at the content area (previously the raw camera projection in canvas/resolution coordinates).Screen.screenToWorldCoordinatesis the exact inverse, as before.Screen.contentAreais now always rooted at(0, 0), andScreen.unsafeArea.topLeftis negative by the clip amount. The canvas-space inset thatcontentArea.left/topused to carry is available from the newScreen.contentAreaOffset.- Display modes that never clip (
Fixed,FitScreen,FillScreen,FitContainer,FillContainer) have a(0, 0)offset and are unaffected.
If you need the old canvas-rooted values, for example to position an HTML overlay over the canvas, shim them by adding
Screen.contentAreaOffsetback:// Before: worldToScreenCoordinates returned canvas coordinates const canvasPos = engine.screen.worldToScreenCoordinates(actor.pos).add(engine.screen.contentAreaOffset); // Before: contentArea.topLeft was the safe area corner in canvas coordinates const safeAreaCorner = engine.screen.contentAreaOffset.clone();
-
Behavior change -
rotateBy({angleRadiansOffset, duration})with norotationTypenow rotates by exactly the signed offset provided, preserving full and multiple turns, instead of taking the shortest path to the canonicalized target orientation. Offsets larger thanMath.PInow travel in the direction of their sign (previously they rotated the shorter way around), and2 * Math.PIperforms a full revolution (previously a no-op). Pass an explicitrotationTypeto keep path-based behavior -
Behavior change - TileMap now uses 'separate' as the
compositeStrategyas a better default. Commonly TileMap is used to build levels, so this default aligns with the common use. -
Removed old legacy
ex.EasingFunctionsin favor of the [0, 1] common easing functions -
Removed EaseTo/EaseBy/actor.actions.(easeTo|easeBy) Action in favor of MoveTo/MoveBy/actor.actions.(moveTo|moveBy) Action with easing support
-
Removed
body.sleepingin favor ofisSleeping -
Removed
entity.activein favor ofisActive -
Removed
actor.getGlobalPos()in favor ofactor.globalPosgetter/setter -
Removed
actor.getGlobalRotation()in favor ofactor.globalRotationgetter/setter -
Removed
actor.getGlobalScale()in favor ofactor.globalScalegetter/setter -
Removed
BoundingBox.drawin favor ofBoundingBox.debug -
Removed typo in
engine.isFullScreennowengine.isFullscreen -
Removed unused
tag-query.ts -
Removed
world.queryTags,world.query(...)can query tags -
Removed
Animation.durationPerFrameMsin favor ofAnimation.durationPerFrame -
Removed
Vector.sizein favor ofVector.magnitude -
Behavior change - Font/Text now render more accurately and faster be using less texture space, this unfortunately is a breaking change becuase text will render slightly different.
-
Breaking change -
Material.update()now passes aMaterialContextto its callback instead of the compositeShader. The context carries the material's declarativeuniformsdictionary (the recommended way to change values — they reach the composite shader and are forwarded to every pipeline pass), plusshaders/shadersByNamefor direct access to every compiled shader the material drives. Update code likematerial.update(shader => shader.trySetUniformFloatVector('iMouse', pos))tomaterial.update(context => context.uniforms.iMouse = pos) -
Build: Docusaurus now throws the build on broken markdown links, broken anchors, and broken markdown images instead of warning. Any custom docs/blog content must have valid internal links, anchors, and images.
-
Build: The engine
tsconfig.jsonnow usesmodule: "esnext"withmoduleResolution: "bundler"(previouslymodule: "es2015"/moduleResolution: "node"), anddownlevelIterationhas been removed. The per-packagetsconfig.jsonoverrides indirector,entity-component-system,graphics, andresourceshave been removed in favor of the single enginetsconfig.json. Consumers importing source directly may need bundler-compatible tooling. -
Build: TypeDoc runner has been replaced by
site/scripts/gen-typedoc-api.mjs. -
Removed all remaining deprecated/legacy API ahead of v1:
ex.Shapein favor ofex.Colliders(Colliders.Box/Polygon/Circle/Edge/Capsule)ColliderComponent.set()in favor ofuse()ActorArgsin favor ofActorOptions,ParticleEmitterArgsin favor ofParticleEmitterOptions,ex.Poolin favor ofex.ArenaPoolPostProcessor.getShader()/getLayout()single-pass path,PostProcessor.process(source, destination)is now required (useShaderPipelinePostProcessororShaderPass);ex.ScreenShaderremoved along with thev_texcoordvarying (usev_uv)Sound.play(volume: number)in favor ofSound.play({ volume })Flags.useLegacyImageRenderer(),ExcaliburGraphicsContextWebGL.imageRendererand the legacyex.imagerenderer,ex.image-v2is the only image rendererex.EventTypes, the lowercase event-name type aliases ofex.Events(ex.Events.kill,ex.Events.pointerup, ...),AddedComponent/RemovedComponentmessages and type guards,TagsComponentUtil.addItemToArray(Util.removeItemFromArraystays, no longer deprecated)CapturePointerConfig,Particle.DefaultConfig, and the exports ofGifParser,StreamandLegacyWebAudioSource(internal only now)- rAF/cAF/AudioContext-prefix polyfills, only the
requestIdleCallbackshim remains
Deprecated
ex.Poolrenamed toex.ArenaPool
What's Changed
- chore: lowercase all files by @eonarheim in #3632
- [blog] New blogpost on EventEmitters and Pub/Sub systems by @jyoung4242 in #3634
- chore: Update dependency @types/node to v22.19.3 by @renovate[bot] in #3636
- chore: Update dependency mermaid to v11.12.2 by @renovate[bot] in #3637
- chore: Update dependency prettier to v3.7.4 by @renovate[bot] in #3638
- chore: Update dependency @storybook/html-vite to v9.1.17 by @renovate[bot] in #3639
- chore: Update dependency excalibur to v0.32.0 by @renovate[bot] in #3640
- chore: Update dependency excalibur-jasmine to v0.5.0 by @renovate[bot] in #3641
- chore: Update dependency jasmine to v5.13.0 by @renovate[bot] in #3642
- chore: Update dependency jasmine-core to v5.13.0 by @renovate[bot] in #3643
- fix: socket fix site by @eonarheim in #3647
- [DOCS] New How to tutorial for ECS Primer by @jyoung4242 in #3644
- chore: Update dependency monaco-editor to v0.55.1 by @renovate[bot] in #3645
- chore: Update dependency puppeteer to v24.34.0 by @renovate[bot] in #3646
- Custom Graphics Tutorial by @jyoung4242 in #3648
- [DOCS] New Collider Tutorial by @jyoung4242 in #3651
- [docs] type fix in ecs tutorial by @jyoung4242 in #3653
- docs: composite explainer + format by @eonarheim in #3652
- updated tutorial example by @jyoung4242 in #3654
- Update description of Excalibur event emitters by @jyoung4242 in #3657
- docs: Action primer completed by @jyoung4242 in #3659
- docs: Updated welcome and why Excalibur pages to highlight new tutorials by @jyoung4242 in #3660
- Fix typos in How-tos > Actions by @sweenist in #3661
- feat: [#3649] Add rgb and lrgb color lerp modes by @keasy9 in #3658
- chore: Update dependency @types/jasmine to v5.1.15 by @renovate[bot] in #3671
- chore: Update dependency @types/node to v22.19.7 by @renovate[bot] in #3672
- chore: Update dependency unplugin-raw to v0.6.4 by @renovate[bot] in #3673
- chore: Update babel monorepo by @renovate[bot] in #3675
- chore: Update dependency playwright to v1.58.1 by @renovate[bot] in #3677
- chore: Update dependency prettier to v3.8.1 by @renovate[bot] in #3678
- chore: Update dependency puppeteer to v24.36.1 by @renovate[bot] in #3679
- feat: update graph component by @sylfel in #3681
- chore: Update dependency tsdown to v0.20.2 by @renovate[bot] in #3680
- perf: Impove text/font rasterization and rendering perf by reducing sizes lossless by @eonarheim in #3687
- chore: Update dependency webpack to v5.104.1 [SECURITY] by @renovate[bot] in #3691
- docs: add keyboard import by @Sebring in #3685
- docs: add Level import to periodic pipes tutorial by @Sebring in #3684
- Fix reference to game.screen in ground initialization by @AphonicChaos in #3669
- docs: Refactor Bird movement snippet and fix indentation by @davidagredano in #3668
- chore(deps): bump markdown-it from 14.1.0 to 14.1.1 in /site by @dependabot[bot] in #3686
- chore(deps): bump webpack from 5.95.0 to 5.105.0 in /site by @dependabot[bot] in #3683
- chore(deps): bump lodash from 4.17.21 to 4.17.23 in /site by @dependabot[bot] in #3674
- chore(deps): bump diff from 5.2.0 to 5.2.2 in /site by @dependabot[bot] in #3667
- chore(deps): bump lodash-es and mermaid in /site by @dependabot[bot] in #3693
- chore(deps): bump ajv in /site by @dependabot[bot] in #3694
- fix(site): patch /api page crash from read-only Function.length by @KakkoiDev in #3695
- feat: Add conversion between Color and float array by @keasy9 in #3692
- docs: include ex to argument by @Sebring in #3697
- Sound from blob by @gsilis in #3689
- chore: Update dependency @eslint/eslintrc to v3.3.4 by @renovate[bot] in #3700
- chore: Update dependency storybook to v9.1.19 [SECURITY] by @renovate[bot] in #3698
- chore: Update dependency @storybook/html-vite to v9.1.19 by @renovate[bot] in #3701
- chore: Update dependency @types/node to v22.19.13 by @renovate[bot] in #3702
- chore: Update dependency @types/react to v18.3.28 by @renovate[bot] in #3703
- chore: Update dependency playwright to v1.58.2 by @renovate[bot] in #3704
- chore: Update dependency tsdown to v0.20.3 by @renovate[bot] in #3705
- #3706 Fix typo in custom graphics tutorial by @denetor in #3707
- [feat] extend the components class to add json/serialize/deserialize to component properties by @jyoung4242 in #3617
- [feat] PauseComponent by @jyoung4242 in #3656
- chore: Update dependency @babel/preset-env to v7.29.2 by @renovate[bot] in #3711
- chore: Update dependency @eslint/eslintrc to v3.3.5 by @renovate[bot] in #3712
- chore: Update dependency @types/node to v22.19.15 by @renovate[bot] in #3713
- chore: Update dependency serve to v14.2.6 by @renovate[bot] in #3714
- chore: Update storybook monorepo to v9.1.20 by @renovate[bot] in #3715
- chore: Update dependency babel-loader to v10.1.1 by @renovate[bot] in #3716
- chore: Update dependency mermaid to v11.14.0 by @renovate[bot] in #3717
- chore: Update dependency playwright to v1.59.1 by @renovate[bot] in #3718
- chore: Update dependency puppeteer to v24.40.0 by @renovate[bot] in #3719
- chore: Update dependency tsdown to v0.21.7 by @renovate[bot] in #3720
- chore: Update dependency vite to v7.3.2 [SECURITY] by @renovate[bot] in #3725
- chore: Update dependency vite to v6.4.2 [SECURITY] by @renovate[bot] in #3726
- docs: Add playground link by @eonarheim in #3727
- Added ButtonDown and ButtonUp events by @Nimgoble in #3729
- chore: Update dependency @babel/preset-env to v7.29.3 by @renovate[bot] in #3732
- chore: Update dependency @types/node to v22.19.17 by @renovate[bot] in #3733
- chore: Update dependency prettier to v3.8.3 by @renovate[bot] in #3734
- chore: Update dependency ts-loader to v9.5.7 by @renovate[bot] in #3735
- chore: Update dependency tsdown to v0.21.10 by @renovate[bot] in #3736
- chore: Update dependency puppeteer to v24.42.0 by @renovate[bot] in #3737
- chore: Update dependency unplugin-raw to v0.7.0 by @renovate[bot] in #3738
- chore: Update dependency vite-plugin-static-copy to v3.4.0 by @renovate[bot] in #3739
- Added isTouchOrPenEvent to limit what can trigger pointerenter and po… by @Nimgoble in #3731
- fix: Add GamepadEvents export to enhance gamepad input handling by @jyoung4242 in #3743
- docs: fix typo "wether" → "whether" in actor.ts JSDoc by @premsreelathasugeendran in #3744
- Fix some typos and remove ambiguity in screens-display.mdx by @rjpgt in #3708
- chore: Update dependency mermaid to v11.15.0 [SECURITY] by @renovate[bot] in #3746
- fix: [#3696] instanceof in vite prod mode by @eonarheim in #3742
- fix: Enhance pointer event handling by adding coordPlane check for graphics tracking, also added world to screen space conversion on pointer event check by @jyoung4242 in #3747
- fix: [#3748] Circle-based CPU particles respect Z by @eonarheim in #3750
- perf: tweak pause to use tags, faster iteration by @eonarheim in #3751
- chore: upgrade vite 8 by @eonarheim in #3753
- chore: Update babel monorepo to v7.29.7 by @renovate[bot] in #3762
- chore: Update dependency @types/node to v22.19.19 by @renovate[bot] in #3763
- fix: timer numRepeats if no max was ever set by @eonarheim in #3754
- fix: pointer wheel memory leak for legacy browsers by @eonarheim in #3757
- fix: ActionQueue used incorrect splice to remove by @eonarheim in #3755
- fix: timer.off() errant splice by @eonarheim in #3759
- fix: onPreTransform draw overrides the wrong prop by @eonarheim in #3760
- fix: Pause behavior when canPause changes, bump pause priority by @eonarheim in #3761
- fix: missing meet/follow target by @eonarheim in #3741
- fix: deserialize type confusion by @eonarheim in #3758
- fix: once event handlers removed on off by @eonarheim in #3769
- fix: possible mem leak on query entity removal by @eonarheim in #3768
- chore: Update dependency @types/react to v18.3.30 by @renovate[bot] in #3764
- docs: Cleanup prose/links/grammar/spelling by @eonarheim in #3770
- chore: Update dependency vite to v7.3.5 by @renovate[bot] in #3765
- chore: update vitest by @eonarheim in #3772
- fix: [#3468] Actions interrupted mid run with clearActions() by @eonarheim in #3771
- feat: Add shouldAlwaysTick to graphics that evolve over time by @eonarheim in #3773
- fix: scale actions after completion by @eonarheim in #3774
- fix: update NineSlice rendering logic and add visual test images #3777 by @jyoung4242 in #3782
- fix: local shader test false positive by @eonarheim in #3784
- fix: uniform block vs buffer confusion by @eonarheim in #3785
- fix: HSL Color format string + random color bugs by @eonarheim in #3783
- chore: Update dependency vite to v8.0.16 [SECURITY] by @renovate[bot] in #3786
- feat: update playground layout and add console output by @chrisk-7777 in #3787
- fix: Resource/Gif loading edgecases by @eonarheim in #3775
- fix: matrix math when non-uniform scale+rotation are in play by @eonarheim in #3780
- fix: double screen resize by @eonarheim in #3779
- chore: Update dependency @types/react to v18.3.31 by @renovate[bot] in #3789
- chore: Update dependency @vitejs/plugin-react to v6.0.3 by @renovate[bot] in #3790
- chore: Update dependency concurrently to v9.2.3 by @renovate[bot] in #3791
- chore: TS6 Upgrades + Typedoc update by @eonarheim in #3793
- feat: Implement Plugin System by @eonarheim in #3670
- chore: Update coverallsapp/github-action action to v2.3.8 by @renovate[bot] in #3799
- chore: Update dependency @eslint/eslintrc to v3.3.6 by @renovate[bot] in #3800
- chore: Update dependency @vitejs/plugin-react to v6.0.5 by @renovate[bot] in #3801
- chore: Update dependency @vscode/codicons to ^0.0.45 by @renovate[bot] in #3802
- chore: Update dependency concurrently to v9.2.4 by @renovate[bot] in #3803
- chore: Update dependency vite-plugin-static-copy to v4.1.1 by @renovate[bot] in #3805
- chore: Update react monorepo by @renovate[bot] in #3807
- chore: Update dependency @base-ui/react to v1.6.0 by @renovate[bot] in #3809
- chore: Update actions/setup-node action to v6.5.0 by @renovate[bot] in #3808
- chore: Update dependency @fontsource-variable/jetbrains-mono to v5.3.0 by @renovate[bot] in #3810
- chore: Update dependency mermaid to v11.16.1 [SECURITY] by @renovate[bot] in #3814
- fix+feat: World-Screen-Page conversions New debug screen dimensions by @eonarheim in #3818
- feat: glsl tagged template literal by @eonarheim in #3821
- feat: material devtools registry by @eonarheim in #3819
- chore: Update dependency typedoc to v0.28.20 by @renovate[bot] in #3804
- chore: Update docusaurus monorepo to v3.10.2 by @renovate[bot] in #3806
- fix: cpu particle double return bug by @eonarheim in #3778
- fix: accidental shadowing in solver, could be foot gun by @eonarheim in #3756
- docs: Improve embedded DX on docs page by @eonarheim in #3822
- chore: add missing tests by @eonarheim in #3825
- feat: Lighting by @eonarheim in #3824
- docs: update audio codecs link by @EpocDotFr in #3827
- feat: Shader Pipelines by @eonarheim in #3828
- fix: Native pointer id bug + Child actor lights not working + RotateByWithOptions 2Pi discovery + Fixed my shadow math by @eonarheim in #3826
- chore: Update dependency @types/react-dom to v19.2.5 by @renovate[bot] in #3830
- chore: Update vitest monorepo to v4.1.11 by @renovate[bot] in #3831
- chore: Update dependency @eslint/eslintrc to v3.3.7 by @renovate[bot] in #3834
- chore: Update dependency @base-ui/react to v1.7.0 by @renovate[bot] in #3832
- chore: Update dependency @types/node to v22.20.1 by @renovate[bot] in #3833
- chore: Update dependency @vitejs/plugin-react to v6.1.1 by @renovate[bot] in #3835
- chore: Update dependency mermaid to v11.17.2 by @renovate[bot] in #3838
- chore: Update dependency monaco-editor to v0.56.0 by @renovate[bot] in #3839
- remove!: deprecations for v1 by @eonarheim in #3635
- chore: add deprecations for v1 by @eonarheim in #3655
- perf: Better realistic collision perf + CI benches by @eonarheim in #3842
- feat: new 3D/4D vectors + shader uniform api by @jyoung4242 in #3843
- Rename 'fcn' to 'action' in timer example by @Adamduehansen in #3853
- feat: better benchmark prs by @eonarheim in #3855
- fix: Tweak new material/pipeline api for better ergonomics by @eonarheim in #3852
- fix: Native pointer cancel could leave pointers stuck by @eonarheim in #3850
- build(deps): bump browserslist from 4.28.4 to 4.28.8 in /site by @dependabot[bot] in #3836
- build(deps-dev): bump postcss-selector-parser from 7.1.1 to 7.1.5 by @dependabot[bot] in #3837
- build(deps-dev): bump fast-uri from 3.1.5 to 3.1.7 by @dependabot[bot] in #3840
- build(deps): bump fast-uri from 3.1.5 to 3.1.7 in /site by @dependabot[bot] in #3841
- chore(deps): bump colord from 2.9.3 to 2.10.0 in /site by @dependabot[bot] in #3844
- chore(deps): bump joi from 17.13.4 to 17.13.7 in /site by @dependabot[bot] in #3847
- chore(deps): bump svgo from 3.3.4 to 3.3.5 in /site by @dependabot[bot] in #3846
- chore(deps): bump js-yaml from 4.3.1 to 4.3.2 in /site by @dependabot[bot] in #3848
- chore(deps): bump @vitest/mocker, @storybook/html-vite and storybook by @dependabot[bot] in #3845
- fix: image load soft lock on error by @eonarheim in #3854
- chore(deps-dev): bump browserslist from 4.28.2 to 4.29.0 by @dependabot[bot] in #3856
- docs: Update welcome page by @jedeen in #3860
- docs: Update remaining intro pages by @jedeen in #3862
- chore: Update dependency @types/node to v22.20.4 by @renovate[bot] in #3863
- chore: Update dependency @typescript/twoslash to v3.2.13 by @renovate[bot] in #3864
- chore: Update storybook monorepo to v10.6.1 by @renovate[bot] in #3870
- chore: Update dependency @typescript/vfs to v1.6.5 by @renovate[bot] in #3865
- chore: Update dependency karma-spec-reporter to v0.0.37 by @renovate[bot] in #3866
- chore: Update dependency @base-ui/react to v1.8.0 by @renovate[bot] in #3871
- fix:! prefer null for empty by @eonarheim in #3879
- chore(deps): bump proxy-addr from 2.0.7 to 2.0.8 in /site by @dependabot[bot] in #3878
- chore(deps): bump shell-quote from 1.9.0 to 1.12.0 in /site by @dependabot[bot] in #3876
- chore(deps): bump joi from 17.13.7 to 17.13.8 in /site by @dependabot[bot] in #3877
- chore(deps): bump source-map-js from 1.2.1 to 1.2.2 in /site by @dependabot[bot] in #3875
- chore(deps): bump compression from 1.8.1 to 1.8.2 in /site by @dependabot[bot] in #3874
- chore(deps): bump markdown-it from 14.3.0 to 14.3.2 in /site by @dependabot[bot] in #3872
- chore(deps): bump brace-expansion from 1.1.18 to 1.1.21 in /site by @dependabot[bot] in #3869
- chore(deps): bump fast-uri from 3.1.7 to 3.1.8 in /site by @dependabot[bot] in #3868
- chore(deps): bump image-size from 2.0.2 to 2.0.4 in /site by @dependabot[bot] in #3859
- chore(deps): bump shell-quote and concurrently by @dependabot[bot] in #3881
- chore(deps): bump source-map-js from 1.2.1 to 1.2.2 in /playground by @dependabot[bot] in #3880
- fix!: system lifecycles match rest of engine by @eonarheim in #3858
- chore(deps-dev): bump postcss-selector-parser from 7.1.5 to 7.1.6 by @dependabot[bot] in #3882
- chore(deps): bump dompurify from 3.4.13 to 3.4.17 in /site by @dependabot[bot] in #3867
- chore: Update dependency vite to v8.1.6 [SECURITY] by @renovate[bot] in #3887
- chore: Update dependency storybook to v10.6.2 [SECURITY] by @renovate[bot] in #3891
- feat: Sound + SoundManager Refactor, expose web audio graph by @eonarheim in #3857
- chore(deps): bump markdown-it from 14.3.2 to 14.3.3 in /site by @dependabot[bot] in #3889
- chore(deps): bump launch-editor from 2.14.1 to 2.14.2 in /site by @dependabot[bot] in #3888
- chore(deps): bump follow-redirects from 1.16.0 to 1.16.1 in /site by @dependabot[bot] in #3885
- chore(deps): bump follow-redirects from 1.16.0 to 1.16.1 by @dependabot[bot] in #3884
- chore(deps): bump brace-expansion by @dependabot[bot] in #3883
- [#3280] Fix RepeatForever reset by @snowyukitty in #3873
- fix tilemap colliders not following a moved tilemap by @rubenmarcus in #3861
- fix(input): clear PointerEventReceiver events independently of PointerSystem (#3356) by @MohammadYusif in #3781
- fix: force entity/component cleanup on scene deactivate by @eonarheim in #3904
- chore(deps): bump fast-uri from 3.1.8 to 3.1.9 in /site by @dependabot[bot] in #3894
- chore(deps): bump body-parser from 1.20.6 to 1.20.9 in /site by @dependabot[bot] in #3893
- chore: Update dependency @types/node to v22.20.5 by @renovate[bot] in #3896
- chore: Update dependency @vitejs/plugin-react to v6.1.2 by @renovate[bot] in #3897
- chore: Update storybook monorepo to v10.6.5 by @renovate[bot] in #3898
- chore: Update vitest monorepo to v4.1.12 by @renovate[bot] in #3899
- chore: Update dependency ts-loader to v9.6.2 by @renovate[bot] in #3910
- chore: Update dependency puppeteer to v25.16.0 by @renovate[bot] in #3909
- chore: Update dependency monaco-editor to v0.57.0 by @renovate[bot] in #3901
- chore(deps): bump joi from 17.13.8 to 17.13.9 in /site by @dependabot[bot] in #3907
- chore(deps): bump follow-redirects from 1.16.1 to 1.16.2 in /site by @dependabot[bot] in #3906
- chore(deps): bump qs and body-parser by @dependabot[bot] in #3905
- chore(deps): bump postcss-selector-parser in /site by @dependabot[bot] in #3908
- chore: Update dependency @base-ui/react to v1.9.0 by @renovate[bot] in #3900
- chore: Update dependency playwright to v1.64.1 by @renovate[bot] in #3902
- fix: test types by @eonarheim in #3911
- chore!: Breaks api getter setter for v1 by @eonarheim in #3912
- chore!: more name breaks by @eonarheim in #3913
- fix: event types by @eonarheim in #3914
- fix: time units consistency (always milliseconds) by @eonarheim in #3915
- fix: more api consistency updates by @eonarheim in #3916
- fix: errant load warning by @eonarheim in #3918
New Contributors
- @sweenist made their first contribution in #3661
- @keasy9 made their first contribution in #3658
- @sylfel made their first contribution in #3681
- @Sebring made their first contribution in #3685
- @AphonicChaos made their first contribution in #3669
- @davidagredano made their first contribution in #3668
- @KakkoiDev made their first contribution in #3695
- @gsilis made their first contribution in #3689
- @denetor made their first contribution in #3707
- @Nimgoble made their first contribution in #3729
- @premsreelathasugeendran made their first contribution in #3744
- @rjpgt made their first contribution in #3708
- @EpocDotFr made their first contribution in #3827
- @snowyukitty made their first contribution in #3873
- @rubenmarcus made their first contribution in #3861
- @MohammadYusif made their first contribution in #3781
Full Changelog: v0.32.0...v1.0.0
