v16.4.0-canary.21
- Bump to swc v78: #98268
- Create next.config.ts when generating apps with
pnpm new-test: #98364 - test(evals): accept LayoutProps in App Router migration: #98365
- [test] Run deploy tests against local JavaScript changes by default: #98353
- [test] Resolve
workspace:*packages to the version under test: #98330 - turbo-tasks: explicit GC root anchoring + cross-session orphan reclamation: #96857
- [PPF] Fix missing runtime-follow up if hints are stale: #98278
- Instant validation for caches excluded from prerenders: #98342
- [PPF] Model caches with
stale < MIN_SHELL_STALEas prefetch-only data: #98339 - docs: document excluding content from a prefetch in the prefetching g…: #98175
- docs: add unstable_navigation and unstable_prefetch API references: #98122
- Fix turbopacks webpack loader setup to support options being optional: #98270
- [ci] Align build-and-deploy triggers with build-and-test: #98331
- test: stabilize server action HMR update: #98322
Huge thanks to @mischnic, @lubieowoce, @aurorascharff, @unstubbable, @eps1lon, @lukesandberg, @icyJoseph, @jimmyhmiller, and @sokra for helping!
v0.4.1
- Use canary as the prerelease channel by @matiasngf in https://github.com/vercel-labs/vgpu/pull/408
- Harden canary releases and production authorization by @matiasngf in https://github.com/vercel-labs/vgpu/pull/410
- docs: clarify npm trusted publisher action by @matiasngf in https://github.com/vercel-labs/vgpu/pull/412
- docs: add "TypeGPU Liquid Glass" example by @matiasngf in https://github.com/vercel-labs/vgpu/pull/418
- chore(release): prepare v0.4.1 by @matiasngf in https://github.com/vercel-labs/vgpu/pull/419
Full Changelog: https://github.com/vercel-labs/vgpu/compare/v0.4.0...v0.4.1
v4.1.0
- Add an opt-in modebar button for downloading Plotly figures as JSON [#7990, #8022], with thanks to @gokul-debugger for the contribution!
- Add
legend.groupdoubleclickto set the group behavior for a legend double-click [#7997], with thanks to @rascal-sl for the contribution!
- Increase default double-click delay threshold to 500ms (from 300) [#8014]
- Correct the
showspikesaxis attribute description to clarify that it applies for allhovermodevalues except whenhovermodeis false [#7981], with thanks for @CAOShurong for the contribution! - Update country-iso-search to v0.1.2 to fix issue with UTF-8 characters being decoded incorrectly [#7994]
- Compile TypeScript files under
src/to JavaScript during packaging to fix Node resolution [#8000] - Include type defs in appropriate partial bundles [#8001]
- Add TypeScript declarations for the modular
lib/entry points [#8009] - Handle regex enum values when generating schema types [#8010]
- Include trace-contributed layout attributes in generated types [#8020]
- Resolve the per-point marker color for hover labels in
scattergl,quivertraces [#8027]
r186
https://github.com/mrdoob/three.js/wiki/Migration-Guide#185--186 https://github.com/mrdoob/three.js/milestone/99?closed=1
- Global
- Add linting for tsl/. #34488 (@ycw)
- Clean up. #34499 (@Mugen87)
- AnimationObjectGroup
- Fix stale index bookkeeping in uncache() and unsubscribe_(). #34035 (@sean-kim05, @Mugen87)
- Backend
Renderer: AddresetState()function. #33877 (@pepperoni505, @Mugen87)
- Backends
- Don't scale render target viewports by the pixel ratio. #34333 (@mrdoob, @claude)
- BatchedMesh
- Mark visibility dirty in setGeometryIdAt(). #34096 (@wrangelvid)
- BezierInterpolant
- Make
interpolate_()more robust. #33934 (@Mugen87)
- Make
- Bindings
- Remove cached bind groups in
_destroyBindings(). #33954 (@Mugen87) - Fix
_destroyBindings(). #34014 (@Mugen87) - Fix stale storage buffer attributes. #34388 (@Mugen87)
- Remove cached bind groups in
- BufferGeometry
- Clean up serialization/deserilization. #34044 (@Mugen87)
- Core
- Fix some
copy()andtoJSON()implementations. #34083 (@Mugen87) - Don't check against default values in
toJSON(). #34178 (@Mugen87) - Initialize render targets with valid dimensions. #34380 (@204a, @Mugen87)
- Fix some
- Frustum
- Improve docs. #34093 (@Mugen87)
- Geometries
- Delete the disposed geometry's own attributes. #33939 (@sashankaryal, @Mugen87)
- ImageBitmapLoader
- Fix regression in
load(). #34151 (@Mugen87) - Avoid mutating loader options. #34500 (@cuishuang, @Mugen87)
- Fix regression in
- KeyframeTrack
- Serialize/deserialize tangent data. #34400 (@Mugen87)
- Material
- Add serialization/deserialization support for clipping planes. #34084 (@Mugen87)
- MathUtils
- Fix large isPowerOfTwo values. #34459 (@lprnmns, @Mugen87)
- MeshPhysicalMaterial
- Add support for retroreflectivity. #33949 (@bhouston)
- Fix diffuse Fresnel blend for
retroreflective. #34057 (@Mugen87)
- Object3D
- Add
intersectsFrustum(). #34065 (@Mugen87) - Add
dispose(). #34141 (@Mugen87)
- Add
- PMREMGenerator
- Replace separable blur with spiral blur on both renderers. #32367 (@mrdoob, @claude)
- QuadMesh
- Optimize rendering by bypassing MVP transforms. #33917 (@sunag)
- Ray
- New watertight intersectTriangle(). #33661 (@Mugen87)
- Handle empty spheres in intersectSphere(). #34016 (@sean-kim05)
- Renderer
- Don't use MSAA for fullscreen-passes. #33936 (@Mugen87)
- Fix operator-precedence bug. #33943 (@Mugen87)
- Fix computation of
_projScreenMatrix. #33947 (@Mugen87) - Clear inactive render lists. #33941 (@Mugen87)
- Warn when using removed PCFSoftShadowMap. 1b7d5f7aed0bef0303ccceeb036f977584c84330 (@mrdoob, @claude)
- Remove remaining PCFSoftShadowMap code. #33987 (@mrdoob, @claude)
- Clarify PCFSoftShadowMap warning. 4d0de92db18c49a44a821762a43420dbdb7c29e8 (@mrdoob, @claude)
- Use
WeakMapinInfo. #34045 (@Mugen87) - Simplify
_getFrameBufferTarget(). #34157 (@Mugen87) - Introduce
dispose()async. #34364 (@sunag)
- Renderers
- honor renderOrder with reversed depth buffer. #33945 (@LLiJJing, @claude)
- Refactor sort key negate. #33948 (@Mugen87)
- Optimize multi-scattering energy compensation. #34046 (@Mugen87)
- Optimize DFG LUT sampling. #34055 (@Mugen87)
- RenderTarget
- Introduce storage flags for MSAA. #33974 (@Mugen87)
- RenderTarget3D
- Fix texture setup. #34117 (@Mugen87)
- Shaders
- Fix multi-scattering energy compensation, remove BRDF_GGX_Multiscatter. #33983 (@mrdoob, @claude)
- Fix iridescence IBL multiscattering and transposed XYZ_TO_REC709. #33984 (@mrdoob, @claude)
- Improve energy conservation for diffuse and sheen lighting. #33985 (@mrdoob, @claude)
- Make comments more explicit. #34038 (@WestLangley)
- Add environment lighting support for retroreflective materials. #33995 (@mrdoob, @bhouston, @claude)
- Source
- Reanme to
TextureSource. #34202 (@Mugen87)
- Reanme to
- src
- Remove deprecated code. #33886 (@linbingquan)
- Src
- Improve retroreflection nomenclature. #34079 (@WestLangley)
- Clean up. #34161 (@WestLangley)
- Clean up. #34272 (@WestLangley)
- SunLight
- Clean up. #34258 (@mrdoob, @claude)
- Reduce cascade count to 2. 52184ab39216913eb2984cbcffaf0efe1b677378 (@mrdoob, @claude)
- TimestampQueryPool
- Clear timestamps Map on query resolution and dispose. #34243 (@sunag)
- TorusGeometry
- Forward thetaStart and thetaLength in fromJSON(). #34034 (@sean-kim05, @Mugen87)
- Tour
- Add Playground Projects and Templates. #34437 (@sunag)
- Vector3
- Clean up comments. #34037 (@WestLangley)
- WebGLAnimation
- Schedule next frame before the loop callback. #34448 (@aktanazat, @Mugen87)
- WebGLBackend
- Fix usage of
storeMultisampledDepthBuffer. #34142 (@Mugen87) - Add support for MinEquation and MaxEquation. #34146 (@tonybart1337)
- Make clear of default framebuffer more consistent. #34502 (@WilliamLiu-1997, @Mugen87)
- Fix usage of
- WebGLOutput
- Match depth texture format to stencil setting. #34008 (@sawa-zen, @Mugen87)
- Optimize MSAA support. #34030 (@Mugen87)
- WebGLRenderer
- Fix
clearLayerUpdates()call. #33989 (@Mugen87) - Tighten multi-scattering check. #34047 (@Mugen87)
- Fix color texture check for
BatchedMesh. #34056 (@Mugen87) - Optimize readRenderTargetPixels capability checks. #34183 (@dli7319, @Mugen87)
- Support Node Materials in
compile(). #34232 (@Mugen87) - Add SunLight with cascaded shadow maps. #34221 (@mrdoob, @claude)
- Make GL init more robust. #34299 (@Mugen87)
- Unbind PIXEL_PACK_BUFFER after async readback. #34321 (@TheBlek, @cursoragent)
- fix compileAsync() crashing when a tracked material is disposed mid-flight. #34378 (@kvvasuu, @Mugen87)
- Honor clipping in
compile(). #34507 (@Mugen87)
- Fix
- WebGLTextures
- Improve max textures warning. 7cab421ee0a0790bfc45e672fdf1702ff401e5f6 (@Mugen87)
- WebGLTextureUtils
- Delete
PIXEL_PACK_BUFFERafter copy. #34323 (@Mugen87)
- Delete
- WebGPU
- Allow read_write storage buffers and atomic ops in non-compute stages. #33626 (@SebastianBaltes, @claude)
- WebGPUAttributeUtils
- Fix interleaved buffer handling for integer attributes. #34098 (@Ryan-G7, @Mugen87)
- WebGPUBackend
- WebGPUBackend - Fix type of _getDefaultRenderPassDescriptor. #33969 (@cmhhelgeson)
- Check for render bundle/occlusion query combination. #34286 (@Mugen87)
- compare GPU bind groups by handle in _draw(). #34276 (@jjmhalew, @Mugen87, @claude)
- WebGPURenderer
- Use
UnfilterableFloatfor NORM16 textures. #33910 (@Mugen87) - Do not render shadow maps when precompile. #33924 (@Mugen87)
- Honor resolve flags in WebGPU backend. #33946 (@Mugen87)
- Fix stale occlusion queries. #33959 (@Mugen87)
- Make occlusion queries more robust. #33972 (@Mugen87)
- Add support for
TRANSIENT_ATTACHMENT. #33977 (@Mugen87) - Add missing
layerUpdatessupport toCompressedArrayTexture. #33996 (@Mugen87) - Support shared depth texture between multiple passes. #34042 (@sunag)
- Support dynamic swapping of the lighting system. #34050 (@sunag)
- Fix XR shadows. #34088 (@cabanier, @Mugen87)
- Introduce compileComputeAsync(). #32551 (@RenaudRohlinger)
- Fix native WebGPU XR camera selection. #34112 (@cabanier)
- Fix
copyTextureToBuffer()3D and array textures when using WebGL. #34129 (@Mugen87) - Fix transmission during WebXR rendering. #34114 (@cabanier)
- Enable MSAA for native XR layers. #34143 (@cabanier)
- Add MSAA support to WebXR WebGPU. #34120 (@cabanier)
- Support material blend color and alpha. #34154 (@Mugen87)
- Introduce refresh types for render objects. #34162 (@Mugen87)
- Add DirectRenderPipeline. #34166 (@cabanier, @Mugen87, @sunag)
- Fix draw offsets of
BatchedMesh. #34212 (@Mugen87) - Fix timestamp query limits. #34236 (@sunag)
- Refresh shared uniform buffers. #34283 (@cabanier, @Mugen87)
- Make cache key for bind groups more robust. #34288 (@Mugen87)
- Add clipping + stencil demo. #34325 (@Mugen87)
- Dispose render objects when the renderer is disposed. #34327 (@wcandillon, @Mugen87)
- Add missing material properties to state checks. #34406 (@Mugen87)
- Fix viewport regression with array cameras. #34424 (@Mugen87)
- Fix integer array texture bindings. #34422 (@WilliamLiu-1997, @Mugen87)
- Add
packed_4x8_integer_dot_productsupport. #34451 (@Mugen87)
- Use
- WebGPUUtils
- Refactor
getTextureSampleData(). #34121 (@Mugen87)
- Refactor
- WebXR
- Restore camera properties at session end. #34152 (@Mugen87)
Nodes
- Nodes
- Make node buffer binding labels deterministic. #34069 (@RenaudRohlinger)
- Add
renderer.debug.onNodeBuilderCreatedcallback. #34068 (@RenaudRohlinger) - Remove top-level side effects for better tree-shaking. #34332 (@mrdoob, @claude)
- Add
updateBeforeandupdateAftersupport for compute stage. #34401 (@sunag)
- Batch
- Support
positionPrevious. #34100 (@Mugen87)
- Support
- BitcountNode
- Fix GLSL Bitcount + add test coverage for BRDF/BSDF, depth, color space, type constructors, and bit operations. #34350 (@bhouston, @Mugen87)
- ContextNode
- Avoid redundant calls. #34251 (@sunag)
- DFGLUT
- Mention direct lighting use in headers, fix generator output path. d60e5bd8688dbef0c0efab901cb2ddae2ecd447b (@mrdoob, @claude)
- GLSLNodeBuilder
- TSL Bug: Fix bitcast(uint, 'int')'s GLSL polyfill return type. #34429 (@bhouston)
- TSL Bug: bitcast() fails unnecessary between int and uint vector types. #34430 (@bhouston, @Mugen87)
- LightsNode
- Introduce
getBuiltinLights. #33909 (@sunag) - Detect dynamic shadow map size changes. #34360 (@Mugen87)
- Introduce
- Line2NodeMaterial
- Implement
setupPosition(). #34005 (@Mugen87, @sunag)
- Implement
- MathNode
- Fix integer
min()/max()on the WebGL backend. #34018 (@mrcljx, @Mugen87) - TSL Unit Tests - Fix determinant() type inference reporting the matrix's own type instead of float. #34341 (@bhouston, @Mugen87)
- Fix integer
- MathUtils
- TSL Unit Tests - Fix sinc() removable singularity computing a literal 0/0. #34337 (@bhouston, @Mugen87)
- TSL Unit Tests - Fix gain() JS-ternary-on-a-Node bug and wrong base formula; fix pcurve() NaN exponent. #34340 (@bhouston, @Mugen87)
- MeshPhysicalNodeMaterial
- Fix specular nodes. #34164 (@Mugen87)
- ModelNode
- Support
ArrayCamerain highp matrix nodes. #34384 (@Mugen87)
- Support
- MRTNode
- Fix blend modes bug in
merge(). #34248 (@Mugen87) - Allow clear colors per attachment. #34250 (@Mugen87)
- Fix blend modes bug in
- NodeBuilder
- Check for reserved keywords. #33871 (@Mugen87)
- NodeFunction
- Filter initial spaces and comments. #34363 (@sunag)
- NodeManager
- Correctly dispose of background mesh. #34108 (@Mugen87)
- NodeMaterial
- Improve scene lighting enabled check. #34052 (@sunag)
- NodeMaterialObserver
- Honor
retroreflectiveand fix updates with nested render calls. #33992 (@mrdoob, @claude) - Add geometry version check. #34064 (@Mugen87)
- Fix stale render object cache. #34076 (@Mugen87)
- Monitor dispose for geometries and textures. #34287 (@Mugen87)
- Track shadow map sizes. #34361 (@Mugen87)
- Honor
- PMREMNode
- Handle unresolved PMREM during setup. #33881 (@jure)
- ReferenceElementNode
- Move into own file. #34245 (@Mugen87)
- RotateNode
- TSL Unit Tests - Fix rotate() 3D Euler-angle path rotating in the wrong direction. #34338 (@bhouston, @Mugen87)
- Add support for Euler Order. #34348 (@WestLangley)
- RTTNode
- Add
autoUpdate,resolutionScaleand preserve defaulttype. #34307 (@sunag) - Fix reset and restore renderer state. #34385 (@sunag)
- Keep the renderer state per instance. #34508 (@mrdoob, @claude)
- Add
- ScreenNode
- Refactor DPR handling. #34186 (@Mugen87)
- ShadowNode
- Fix
WeakMapusage. #33964 (@Mugen87) - Move shadow material and render object helpers to base class. #34312 (@sunag)
- Fix
- Skinning
- Support bone counts exceeding UBO limit. #34200 (@Mugen87)
- StorageTextureNode
- Preserve integer store values. #34423 (@WilliamLiu-1997)
- SubgroupFunctionNode
- TSL Unit Tests: Workgroups, StorageBuffer Atomics, Compute builtins, Barriers and Subgroups. #34431 (@bhouston)
- TSL Bug: Fix
subgroupAll()/subgroupAny()parameter length. #34432 (@bhouston) - TSL Bug: Fix subgroup broadcast first param length. #34433 (@bhouston, @Mugen87)
- TextureNode
- Add
isPlainGather(). #34119 (@Mugen87) - Refactor
isPlainGather(). #34201 (@Mugen87)
- Add
- ToonLightingModel
- Use the view space normal for the gradient irradiance. #34247 (@lazerg)
- TSL
- Respect texture format when sampling textures. #33875 (@sunag)
- Make
textureSize()more robust. #33925 (@Mugen87) - Inline transform of normal and tangent. #33938 (@WestLangley)
- Do not export
PMREMUtils. #33986 (@sunag) - Fixing rbmax / rbmin calculation of
getParallaxCorrectNormal(). #34007 (@Mugen87) - Fix update range clear bug in
Instance. #34022 (@explodi, @Mugen87) - Support individual
lightingperpass(). #34051 (@sunag) - Add
OnAfterObjectUpdate(). #34101 (@Mugen87) - Fix update of previous instance matrix data. #34107 (@Mugen87)
- Add
batchIndirectIndex. #34111 (@Mugen87) - Support primitive values in custom
structconstructors. #34113 (@sunag) - Build CodeNode includes as references. #34132 (@Ryan-G7, @Mugen87, @sunag)
- Remove export of 'append'. #34156 (@Methuselah96)
- Add
horizontalRotationoption tobillboarding(). #34197 (@sunag) - Add
4x8pack/unpack functions. #34263 (@Mugen87) - Update exports in Three.TSL. #34310 (@sunag)
- Honor type in
toAttribute(). #34347 (@Mugen87) - Add TSL GPU unit test coverage for LTC area lights, point light, SH irradiance, equirect/spritesheet UV, and post-processing utils. #34358 (@bhouston)
- Add warnings to GPGPU Nodes. #34291 (@cmhhelgeson)
- Add atomic workgroup array support. #34428 (@WilliamLiu-1997, @bhouston)
- Add missing clamp to
V_Neubelt(). #34449 (@Mugen87)
- UniformArrayNode
- Fix
update()overwrite. #33962 (@Mugen87)
- Fix
- WGSLNodeBuilder
- TSL Unit Tests - Fix faceForward() WGSL capitalization bug. #34342 (@bhouston, @Mugen87)
- WGSLNodeFunction
- Add missing WGSL-TSL type entry. #34099 (@Mugen87)
Addons
- Addons
- Disable depth buffer when possible. #34043 (@Mugen87)
- Fix typos. #34105 (@pailhead)
- Gaussian Splat renderer / loader using TSL for WebGPU/WebGL + glTF import. #33950 (@bhouston, @Mugen87)
- 3DMLoader
- add views, namedViews, and strings to userData. #34498 (@YCoCg)
- 3MFLoader
- Basic support of Beam Lattice. #34267 (@Mugen87)
- AST
- TSL & Transpiler: Support parameterless loops (do ... while). #34209 (@sunag)
- BufferGeometryUtils
- Let
toTrianglesDrawMode()modify geometries in-place. #33878 (@Mugen87) - avoid vertex hash overflow at zero tolerance. #34390 (@hamedrabah, @Mugen87)
- Let
- CityGenerator
- Improved city example. #33906 (@mrdoob, @claude)
- CSS2DRenderer
- Support Rotation. #33474 (@WestLangley)
- FBXLoader
- Support multiple clips in single timeline. #34167 (@Mugen87)
- Fix missing
userDatacopy. #34302 (@Mugen87) - Use global
URLinstead ofwindow.URL. #34328 (@hybridherbst)
- FirstPersonControls
- Make keyboard movement world axis aligned. f88964a17e29a61e26ad4981754bb68ebf62264d (@mrdoob, @claude)
- Restore R/F shortcuts and unify example look speed. #34485 (@mrdoob)
- GaussianSplatMesh
- Fix sort invalidation for transforms. #34233 (@gqfx, @Mugen87)
- Add support for per-mesh bounding box, frustum culling. #34254 (@gkjohnson)
- Inline splat data reads to improve bounding box generation performance. #34262 (@gkjohnson)
- Pack RGBA8 colors in storage buffers. #34255 (@gqfx)
- Add support for raycasting. #34284 (@gkjohnson, @bhouston)
- GaussianSplatPLYLoader
- PLYGaussianSplatLoader -> GaussianSplatPLYLoader. #34292 (@WestLangley)
- GaussianSplatUtils
- Simplify GaussianSplatUtils via ThreeJS math classes. #34223 (@bhouston)
- Global
- Remove deprecated code. #33880 (@Mugen87)
- GLTFExporter
- Cache normal maps. #33940 (@Mugen87)
- Implement ability to export with a copyright notice. #34138 (@Mirei3D, @Mugen87)
- GLTFGaussianSplatLoaderExtension
- Optimize Gaussian Splat loading. #34205 (@bhouston)
- View-dependent Gaussian Splatting via Spherical Harmonics. #34215 (@bhouston)
- GLTFLoader
- Fix EXT_mesh_gpu_instancing custom instance attributes shared across nodes. #33927 (@sebgoubier, @Mugen87)
- Skip skinning without skin attributes. #33988 (@0b5vr, @Mugen87)
- Fix KHR_texture_transform support when rotation is specified. #34033 (@zeux)
- HTMLMesh
- Improve form controls support. #34172 (@Mugen87)
- Inspector
- Stop keyboard events from leaking into the app. 0696807d586ab1c04b8fcedc71079559c07f1ddf (@mrdoob, @claude)
- Add
debounce(). #33932 (@Mugen87) - resolve bare three imports in TSL graph loader. #33965 (@bhushan6)
- Fix
TSLGraphEditorraycasting and refactor primary pass retrieval. #34133 (@sunag) - Use absolute positioning and add alignment configuration. #34137 (@sunag)
- Add split screen, list grid mode and revisions. #34140 (@sunag)
- Fix split screen overlay alignment on sub-window canvases. #34203 (@sunag)
- Add Color Grading extension and improve lifecycle API. #34216 (@sunag)
- Optimize Timeline tab rendering with virtual scrolling. #34230 (@sunag)
- Polish split screen divider and select dark theme. #34318 (@sunag)
- Implement disposal support and improve split screen handling. #34383 (@sunag)
- Support nonce and CSP compliance. #34396 (@sunag)
- LightProbeGrid
- Rename to LightProbeGridWebGL. #33911 (@mrdoob, @claude)
- Add WebGPURenderer version. #33913 (@mrdoob, @claude)
- Support incremental baking. #34486 (@mrdoob)
- LightProbeGridWebGL
- Fix SunLight integration. #34370 (@Mugen87)
- MaterialXLoader
- Materialx upgrade. #33485 (@bhouston, @cursoragent, @sunag)
- OrbitControls
- Improve
disconnect(). #34504 (@Mugen87)
- Improve
- PCDLoader
- Fix regex to remove comments. #34199 (@Virtycle, @Mugen87)
- PLYGaussianSplatLoader
- a dedicated loader for Gaussian splat PLYs. #34278 (@bhouston)
- Rename
- GaussianSplatMesh -> GaussianSplat. #34306 (@WestLangley)
- Rhino3dmLoader
- performance, PBR materials, editor import. #34180 (@fraguada)
- SimplifyModifier
- Refactor implementation. #34021 (@Mugen87)
- Sky
- Sky, SkyMesh: More realistic clouds. #33942 (@mrdoob, @claude)
- Fix FP16 overflow. #34058 (@Mugen87)
- Sky, SkyMesh: Slow down default cloud speed. 04679755feb07e1d7ad256307d5c4a7bb8043f92 (@mrdoob, @claude)
- Sky/SkyMesh
- Remove
upuniform. #34354 (@Mugen87)
- Remove
- SkyscraperGenerator
- Cheaper weathering noise. #33900 (@mrdoob, @claude)
- SPZLoader
- add support for SPZ version 4 in SPZLoader and add new SPZ v4 example. #34222 (@bhouston)
- SunLight
- Move to addons. #34326 (@mrdoob, @claude)
- TrackballControls
- Avoid updating
_movePrevtoo often. #34173 (@Mugen87) - Implemented multi-touch rotate. #34249 (@surdu, @Mugen87)
- Avoid updating
- Transpiler
- Add GLSL preprocessor directives and macro support. #34206 (@sunag)
- Add
arraysupport. #34208 (@sunag)
- TubePainter
- Properly transform normals. #34061 (@WestLangley)
- UnrealBloomPass
- Don't request depth buffer. #34036 (@Mugen87)
- Merge adjacent taps into bilinear fetches. #34479 (@mrdoob, @claude)
- USDLoader
- Resolve connected attribute values. #34309 (@cabanier)
- VolumeSlice
- Move property declarations. #34130 (@Mugen87)
- WebGLXRFallback
- Detect WebGPU XR support upfront. #34080 (@cabanier)
- WebGPURenderer
- Add SunLight support. #34259 (@mrdoob, @claude)
- XRControllerModelFactory
- Fix profile hot-swap. #34266 (@Mugen87)
Addons / Nodes
- TSL
- Add
softParticles(). #33887 (@Mugen87) - Support primitive values in
array(). #33929 (@sunag) - Introduce
OnBeforeRenderPipelineandOnAfterRenderPipelineand update context directly on material. #34025 (@sunag) - Fix angle bug in
hashBlur(). #34077 (@Mugen87) - Pass
stepSizetoRaymarchingBoxcallback. #34257 (@sunag)
- Add
- Addons
- Add
TAAUtilsfor shared functions. #34458 (@Mugen87)
- Add
- BloomNode
- Add faster blur strategy. #33923 (@Mugen87)
- ClusteredLightsNode
- Add
dispose(), optimizecreate(). #34375 (@204a, @Mugen87)
- Add
- CSMShadowNode
- Fix frame-late bug. #34213 (@Mugen87)
- DenoiseNode
- Dispose internal noise texture. #34418 (@204a)
- DepthOfFieldNode
- Fix render target leak on repeated setup. #34188 (@cl0nazepamm, @Mugen87)
- DotScreenNode/RGBShiftNode
- Make ctor more flexible. #34417 (@Mugen87)
- DualKawaseBloomNode
- Added DualKawaseBloomNode. #33920 (@mrdoob, @claude)
- Remove DualKawaseBloomNode. #33979 (@mrdoob, @claude)
- GTAONode
- Add Quadratic ray stepping, smooth sphere falloff. #33895 (@Mugen87)
- Improve code example. #33902 (@Mugen87)
- Clip-space ray marching and loop micro-optimizations. #33903 (@mrdoob, @Mugen87, @claude)
- Fix banding issue. #33919 (@marcofugaro, @Mugen87)
- Optimize code. #33930 (@Mugen87)
- Bake sample count into the shader. #33931 (@Mugen87)
- Dispose internal noise texture. #34369 (@204a, @Mugen87)
- Nodes
- More consistent
dispose()usage. #34419 (@Mugen87)
- More consistent
- OITPassNode
- Add node for Order Independent Transparency. #34253 (@Mugen87)
- Improve MSAA support. #34274 (@Mugen87)
- PassNode
- Fix pixel ratio in derived passes. #34453 (@Mugen87)
- SMAANode
- Fix and simplification. #34031 (@sunag)
- SSAAPassNode
- Use single-sample render targets. #34367 (@204a, @Mugen87)
- SSAONode
- Add
SSAONodeanddepthAwareBlur. #33921 (@mrdoob, @claude)
- Add
- SSRNode
- Clean up. #34377 (@Mugen87)
- VXGINode
- Voxel Cone Tracing for Diffuse GI. #34402 (@Mugen87)
- WebGLNodesHandler
- Reuse collected lights and preparation data. #34219 (@hybridherbst)
- Fix error with
getCanvasTargetin WebGLRenderer. #34303 (@hybridherbst)
- WoodNodeMaterial
- Specialize single-octave noise. #33970 (@mrdoob, @claude)
Docs
- Fix heading typo in CONTRIBUTING.md. 6cac81241961e3b68b0a5992cf325b4e9db8b3af (@mrdoob)
- Improve descriptions. #34027 (@Mugen87)
- Resolve reamining TODOs. #34029 (@Mugen87)
- Matrix4: Improve inline documentation. #34067 (@WestLangley)
- Fix typos and a wrong parameter name in JSDoc comments. #34169 (@xdroberto)
- fix broken TSL anchor links for roughnessNode and metalnessNode. #34170 (@latent-9)
- Drop JSDoc params the functions no longer take. #34226 (@darkdi)
- Drop three more JSDoc params in WGSLNodeBuilder. #34237 (@darkdi)
- Fix usage of
@classtag. #34244 (@Mugen87) - Fix broken cross-links to texture utils pages. #34271 (@FirmaSpring)
- Improve
BundleGroup. #34305 (@Mugen87) - Tour of TSL. #34085 (@sunag)
- IndexNode - Update JSDoc. #34413 (@cmhhelgeson, @Mugen87)
- LoopNode - Update JSDoc. #34415 (@cmhhelgeson, @Mugen87)
Manual
- Remove
i18n. #33997 (@Mugen87) - Add Addons section anchor. #34017 (@zackabrah)
- Add anchors to headings. #34020 (@zackabrah)
- Slowed down colourshift effect in scenegraph tutorial. #34048 (@chesterblack)
Examples
- Improve performance of clustered lights demo. #33901 (@Mugen87)
- webgl_postprocessing_pixel: Snap Objects to Pixel Grid. #33908 (@zalo, @claude)
- Add SSAO blur toggle in webgpu_postprocessing_ao. 70820b8d96b7cb2221a24c8170429b4169745a01 (@mrdoob, @claude)
- Optimise PNGs across the repo. #33882 (@Chubercik)
- Skip TRAA for SSAO in webgpu_postprocessing_ao. 84569eb27a3e070e6a4844e59e906ea0ee26c4cb (@mrdoob, @claude)
- Use FXAA in clustered light demo. #33935 (@Mugen87)
- Removed (wip) from webgpu. d51eb061e673cb9ec7f22c0277eefe925d7e2f05 (@mrdoob)
- Clean up. #33981 (@WestLangley)
- Clean up. #33994 (@Mugen87)
- Refresh external links in /examples. #34001 (@bhouston)
- Clean up. #34010 (@Mugen87)
- Properly transform normal vectors. #34015 (@WestLangley)
- Clean up. #34026 (@Mugen87)
- More clean up. #34028 (@Mugen87)
- Properly transform normal. #34039 (@WestLangley)
- Add
webgpu_deferredexample. #34049 (@sunag) - Optimize backdrop water demo. #34086 (@Mugen87)
- Refined the
webgl_volume_perlinwith bisection based refinement. #34090 (@mmmovania, @Mugen87) - Refined the
webgpu_volume_perlinwith bisection based refinement. #34094 (@mmmovania, @Mugen87) - Update webgl_volume_perlin.html. be6469cce5f91576c9efc8dc984c7ae3970197d3 (@Mugen87)
- Eliminate branch divergence in volume refinement loops. #34097 (@WestLangley)
- Clean up. #34148 (@Mugen87)
- Clean up. #34185 (@Mugen87)
- Change preset in backdrop area. #34195 (@Mugen87)
- Make example links clickable in title & info. #34207 (@bhouston, @Mugen87)
- Make material arrays demo more interesting. #34220 (@Mugen87)
- Optimize rain demo. #34229 (@Mugen87)
- Replace sun-like DirectionalLights with SunLight. #34228 (@mrdoob, @claude)
- Clean up. #34273 (@WestLangley)
- Update tags.json. 04008d6f255b9e2c92244244f484bd4508a14908 (@Mugen87)
- Rename Gaussian Splat Example. #34293 (@WestLangley, @Mugen87)
- Update webgl_lightprobes_sponza screenshot for two sun cascades. 5c81184a805495f5394aa50ad4c33d5f332a4b37 (@mrdoob, @claude)
- Add post-processing volumetric fog example. #34319 (@sunag)
- Remove
ecsy. #34359 (@Mugen87) - Clean up. #34408 (@Mugen87)
- Update tags. #34411 (@Mugen87)
- Optimize glTF asset. #34435 (@Mugen87)
- Optimize glTF asset. #34436 (@Mugen87)
- Improve tags. #34472 (@Mugen87)
- Clean up tags. #34473 (@Mugen87)
- Add Sculptor addon. #33164 (@mrdoob, @claude)
- Improve fog scattering trees and performance. #34491 (@mrdoob)
- Refine custom fog terrain and resource handling. 511de1d2ee7c89f534b457d72e4ea4a7b20b50d4 (@mrdoob)
- Update custom fog screenshot. e0119d1b87122d74701db34a04354e8979aff98e (@mrdoob)
- Use SunLight in WebGPU examples. #34476 (@mrdoob, @claude)
- Improve webgpu_materials_retroreflective. #33990 (@mrdoob, @claude)
Devtools
- Clean up, light count and 1.17. #34387 (@mrdoob, @claude)
- Object details, box highlight and 1.18. #34399 (@mrdoob, @claude)
Editor
- Don't use picker object with skeletons. #34062 (@Mugen87)
- Fix animation selection. #34322 (@Mugen87)
- Add group selection. #34144 (@Mugen87)
Tests
- Try to fix the webgpu async timeouts. #34225 (@pailhead, @claude)
- GPU-native unit tests for TSL. #34331 (@bhouston)
- fix lint error. #34345 (@linbingquan)
- Update screenshots. #34346 (@Mugen87)
- Add TSL GPU unit test coverage for math, packing, conversion, vector/matrix, logic/bitwise, color, tone mapping, and procedural helpers. #34349 (@bhouston, @Mugen87)
- Unit tests: import unbuilt source instead of build/ output. #34362 (@bhouston)
- Remove empty QUnit.module scaffolding. #34409 (@samuel7james)
- TSL Tests: Give each GPU unit test kernel its own random canary value. #34427 (@bhouston)
- Stabilize input and video screenshots. #34474 (@mrdoob)
Utils
- Dev: Improve
preview.js. #34407 (@Mugen87) - Support branches in changelog.js. f64ed0d50506064c99445e4b72ff0f82b387968e (@mrdoob, @claude)
- Improve changelog.js. 16e1f0369b3ea976a581ca651de868818c9f0a9b (@mrdoob, @claude)
- Rename Tour of TSL to TSL Guide. #34457 (@mrdoob, @claude)
- Update TSL links in llms build. c4ffe022f2a4f982b42b7da5af79a87066a138ae (@mrdoob, @claude)
Build
- Deprecate CommonJS build. #33891 (@mrdoob, @claude)
- Remove minified builds. #33893 (@mrdoob, @claude)
CI
- Comment on PRs with E2E screenshot failures. #33971 (@mrdoob, @claude)
- Add Core to bundle size report. #34330 (@mrdoob, @claude)
- fix grammar. #34482 (@linbingquan, @Mugen87)
quasar-v2.31.0
[!IMPORTANT] Behavior changes worth checking before you upgrade:
- A readonly QInput/QSelect/QFile/QField now reflects focus: it shows the focused styling (highlight, floated label,
hide-hinthint), emitsfocus/blurand validates on blur withlazy-rules. Onlydisablenow exempts a field from counting as focused, matching the existing rule that onlydisableexempts it from validation.config.dark: 'auto'resolves again on SSR/SSG apps, on the client once it takes over. It has silently been a plain lightfalsesince v2.18.2. The first paint stays light (the server cannot know the preference), so the documented cookie approach remains the way to a flash-free page.- The
faandfa-IRlanguage packs render Persian digits in QDate, QTime and QPagination, through the new root-levelformatNumberpack key.- QStepper's horizontal DOM lost its
.q-panel.scrollwrapper element; its classes moved onto.q-stepper__step-content, now a direct descendant of.q-stepper__step.- The
q-transition--field-message-*classes no longer exist. Restyle a QField message swap through.q-field__messages--animatedinstead; the leave half of the animation (the old message fading out under the new one) is gone.
- feat(QColor):
paletteslot, and the picker is fully keyboard-accessible -> the palette view had no way to be customized: swatches were plain divs, laid out 10 per row, reachable by pointer only. The new scopedpaletteslot replaces the default swatches while keeping the other views and the view switcher, handing over the resolved colors (palette), aselect(color)function and aneditableflag. The default swatches become buttons following the roving tabindex pattern (arrows move, Up/Down by one visual row, Home/End jump to the edges, Enter/Space picks), and the spectrum panel, the last pointer-only part of the picker, becomes a WAI-ARIA slider over its two axes: arrows step the saturation and the brightness by one, ten with Shift, Home/End and PageUp/PageDown jump. Both follow the visual direction in RTL, both draw a two-tone inset focus ring that stays visible on any color, and the spectrum spells out its value through two new lang-pack keys,colorPicker.saturationandcolorPicker.brightness, translated across every pack (#8613) - feat(ui): shadow colors are CSS custom properties -> since v2.11 the elevation shadows are drawn with a light color while in Dark Mode, but the color was baked into the built CSS through the
$shadow-color/$dark-shadow-colorSass variables, so the UMD build, the Vite plugin and every other prebuilt-CSS flavour had no way to revert or tune it short of restyling each component. Both colors are now declared on:rootas--q-shadow-colorand--q-dark-shadow-color, with the Sass variables as their defaults so existing Sass overrides keep working. Nothing moves by a pixel out of the box, and the pre-v2.11 look is a one-liner (body.body--dark { --q-dark-shadow-color: #000 });transparentremoves the shadows altogether. The tints are derived onbody, so the tokens are read at the:root/bodylevel (abody.body--darkrule,setCssVar()), not on a deeper element (#15144) - feat(Lang):
formatNumberpack key, localized digits in QDate, QTime and QPagination -> a Persian calendar coupled with thefa-IRpack showed Persian month names next to Western day numbers, with no way to change that short of a font that remaps the ASCII digit glyphs. Language packs (and thelocaleprop) can now define an optional root-levelformatNumber(value), which receives the ASCII digit string the component would display, zero-padded where it is padded ("5", "05", "1403"), and returns the localized rendering. QDate routes its day cells, navigation year, years grid, header title and subtitle, the "N days" count and the day buttons'aria-labelthrough it, QTime its header units and clock face, QPagination its page buttons and theiraria-label. Model strings, date hashes and QTime'sstringModelstay ASCII. Thefaandfa-IRpacks opt in; every other pack is unchanged (#12735) - feat(QTable):
autoWidthin the column definition -> shrinking a column to its content required a per-columnheader-cellandbody-cellslot override with<q-th auto-width>/<q-td auto-width>, cumbersome for dynamically built columns, the only alternative being an undocumented class throughclassesandheaderClasses. A column can now simply declareautoWidth: true, which applies to the auto-rendered cells as well as to QTh/QTd fed with the slot props (#8206)
- fix(QMenu/QDialog): the portal opening over a closing one takes the focus -> a QMenu item or a QDialog button carrying
v-close-popupthat opens a dialog made the two portals compete for focus, and the closing one won on both counts: the dialog opened without focus in its autofocus field (on Android the soft keyboard never showed), and it had captured, as the element to return focus to, an element inside the closing portal, destroyed with it, so closing the dialog dropped focus altogether. A portal closing while another one sits on top of it in its opening transition now hands its own anchor to the opener instead of restoring focus itself; portals that take no focus (no-focus, hover-shown menus) or that are already fully open decline the hand-off, so everything else is unchanged (#8211) - fix(QField): a readonly field reflects focus like a native readonly control -> the focused state was gated on the field being editable, so a focus event landing while
readonlywas still true got dropped and nothing re-synced afterwards: a handler flippingreadonlyoff and callingfocus()in the same tick left the input holding DOM focus with the field unfocused, label resting over the caret. The gate itself was the problem, not its timing, since a readonly control stays in the tab order and a keyboard user tabbing onto it got no visible focus indication at all. The focused state now mirrors DOM focus, onlydisablekeeping a field from counting as focused. See the note at the top (#16056) - fix(QField): forward focus from the
controlslot wrapper to the control -> with acontrolslot, autofocus,focus()and every other way of focusing the field (QForm/QDialog/QMenu autofocus,clearValue, a click around the control) landed on theq-field__nativewrapper: the field looked focused and emittedfocus, but the slotted control never received the caret. The wrapper now forwards any focus it receives to the element bound to the slot scope id, else to the first focusable element of the slot, and keeps it only when the slot holds nothing focusable (#12648) - fix(QField): no more one compositor layer per field on Chromium -> every QField label carried
backface-visibility: hidden, which Chromium answers with a permanent compositor layer per label. With a few hundred fields on a page each hover repaint re-runs the layer assignment pass against all of those interleaved layers and it goes quadratic: on the reported layout (100 rows x 5 labelled number inputs) headless Chromium held ~22 fps with 50-67 ms frames while native inputs held 60. The rule dates from the Qv1 stylesheets with no recorded purpose and the settled label renders pixel-identical without it. Measured after: 6 composited layers instead of 461, ~65 ms of Layerize per hover sweep instead of ~1.7 s (#16024) - fix(QSelect): typed text wins over the model's automatic highlight on Enter -> opening the list (and every filter completion) highlights the option mirroring the current value. With
new-value-mode/@new-value, Enter or Tab then re-selected that option and silently dropped the text the user had just typed,@new-valuenever being emitted. The highlight now remembers whether it was placed automatically or by the user, and only the automatic one yields to typed text under new-value mode: navigated or hovered options still win,fill-input's filled-in label is not user text so Enter right after opening still re-selects, and selects without new-value mode never consult it (#16514) - fix(QStepper): the steps stay mounted across an orientation switch -> a stepper bound to
$q.screen(:vertical="$q.screen.lt.sm") lost the active step's content, form state included, whenever the viewport crossed the breakpoint, andkeep-alivecould not bridge it either, the two orientations rendering different trees with two different caches. Both orientations now render every QStep under.q-stepper__content, with one plain Transition per step driving the vertical height slide and the horizontal slide alike.keep-alive-max, which the vertical mode never honoured, is now counted by the stepper itself, and the stepper'stransition-durationalso drives the vertical slides (default unchanged). See the note at the top (#9703) - fix(QStepper): a nested stepper keeps its own orientation -> the horizontal and vertical layout rules hung off the stepper root with descendant selectors, so a stepper nested inside a step of the other orientation matched both rule sets and source order decided: a vertical stepper inside a horizontal one drew a horizontal connector after its active label, lost its vertical connectors and got clipped by the tab overflow; a horizontal one inside a vertical stepper lost the connector before each dot and received the vertical content padding. Every orientation rule now hangs off a per-element modifier class instead of the root; no selector gained a class and several lost one, so existing overrides keep their targets and their precedence (#16516)
- fix(QStepper): show the prefix on an active erroring step with
active-icon="none"-> the header decided the dot's content with two computeds that disagreed on which state wins, so an active step that also haderror, withactive-iconset tonone, got neither the icon nor the prefix and the dot was left empty; a step-levelactive/error/done-iconofnonehit the same blank. The state icon is now resolved once, with the step prop taking precedence over the stepper one, and both the prefix decision and the rendered icon derive from it (#15259) - fix(QDrawer): mini-mode items stay put when the standard layout takes over -> in mini mode the item's side section was flex-centered inside the drawer's content box, which only agrees with the standard layout's 16px anchor when that box is exactly 56px wide. An unbordered drawer gives 57px, and on a display whose scale factor is not a whole number Chromium and WebKit snap the 1px border to a fraction of a pixel, so the centered icon landed on a fractional position and visibly jumped once the mini animation restored the standard layout (Mac Retina and 1x displays are exact, which is why it could not be reproduced there). The drawer now hands its current width to CSS as the
--q-drawer-widthcustom property, documented as usable by user CSS, and the mini rule sizes the item from it, so 24px icons land on the standard inset at any scale factor, bordered or not (#18320) - fix(QDrawer): iOS Safari's edge navigation swipe stays out of the drawer gestures -> on iOS Safari, swiping in from the screen edge to open a drawer also ran the browser's back/forward navigation gesture: the page slid towards the previous history entry while the drawer followed the finger. The same happened when the backdrop of a right-side drawer was swiped from the left edge to close it. The opener strip and the backdrop now cancel the touch sequence once the pan direction is detected, which is what leaves the page in Safari's hands, while a vertical move (and so the page scroll) is left alone
- fix(prevent-scroll): the page background keeps painting under the iOS scroll lock -> the iOS lock pins the body with
position: fixed, which collapses the root element to zero height, and a body background propagates to the canvas with the root box as its positioning area: a gradient or a cover-sized image stopped painting the moment a popup locked the page, showing a blank canvas behind the dialog. A solid color needs no positioning area, which is why the default dark page never showed it, and desktop and Android use the viewport clip lock, so only iOS was affected. The lock class now gives the root elementmin-height: 100%,min-heightso userhtml { height }rules still win (#16799) - fix(QResizeObserver): track padding and border changes of the observed element -> the component emits
offsetWidth/offsetHeight, the border box, but observed the default content box, so a padding or border change on the observed element itself grew the border box without touching the content box and no notification fired. QHeader, QFooter and QDrawer size the layout through it, so apadding-top: env(safe-area-inset-top)rule placed on.q-header(the iOS PWA status-bar pattern) left QPageContainer with a page padding that ignored the inset until the device rotated. Padding on the toolbar child, which is what Quasar's ownq-ios-padding/q-safe-area-paddingrules use, was already tracked (#7526) - fix(QPage): the children's vertical margins stay inside the page -> QPage was a plain block with no padding or border, so a first child's top margin (a
q-mt-mdcard, say) collapsed through it and pushed the page down inside QPageContainer; together with the page'smin-heightthe layout then exceeded the viewport and the window grew a scrollbar even when the content fit the screen. A last child's bottom margin did the same at the other end. The page now establishes a block formatting context, through a zero-specificity rule so display utilities on the page and user overrides keep winning (#9536) - fix(Dark):
'auto'resolves on SSR/SSG clients once they take over -> since v2.18.2 the ssr-client build reads its initial dark state from the server-emitted body class, and the server renders'auto'as light, soconfig.dark: 'auto'ended up as a plainfalseon every SSR/SSG app: no media query listener, light forever. The server now flags an'auto'render with a body attribute, and the client resolves it on takeover unless the app already set an explicit value meanwhile. A SSR+PWA shell boot, which has no server markup to read, starts from the config like an SPA does; the config was silently dropped there too. See the note at the top (#7530) - fix(debounce): guard reentrant immediate calls -> a debounced function created with the
immediateoption could re-enter itself from within its own invocation and fire again instead of being held back for the wait period (#18544) - fix(morph): give up on a destination detached before the first frame ->
morph()defers its work to arequestAnimationFramecallback, and when the destination's subtree was removed in between (av-ifor an unmount in the same tick as the model change) the validity check still accepted it, because a detached subtree keeps itsparentNode, and the fixed-position parent walk then reachednulland threw insidegetComputedStyle
- perf(QField): message swaps animate with a CSS keyframe instead of a Transition -> every field with a hint, rules, a counter or an explicit
errorprop rendered a Transition component around its messages element, only to animate the hint-to-error swap. With Vue 3.5 that instance is about a quarter of a QInput's mount JS (2000 labelled inputs with hints: 148 ms to 113 ms on Chromium), and it was the single biggest item in the reporter's own devtools timeline. The messages element is keyed by its content, so a swap already re-creates it, and a keyframe on the new element reproduces the enter half of the old transition; nothing animates on page load and no field gets a composited layer at mount. See the note at the top (#12369) - perf(ui): 2D transforms are written as 2D instead of the 3D variants -> Chromium gives any 3D transform function its own compositor layer, permanently, and with hundreds of instances on a page every repaint re-runs the layer assignment against all of them. The production stylesheet never shipped these (the minifier flattens them), but
quasar devcompiles the Sass verbatim, so dev servers paid for a layer per radio, checkbox, toggle, slider ring, linear progress, date indicator, tree arrow, spinner and notification badge; the JS-built strings (QLinearProgress, QCircularProgress and through it QKnob, QAjaxBar, Ripple, QTabs' indicator) reached production as written, so those are a production win too. Every value is rewritten as its exact 2D equivalent and the minifiedquasar.prod.css/quasar.rtl.prod.cssare byte-identical before and after. QLayout's layer hack and QParallax's media transform stay 3D on purpose
Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:
electron v44.3.0
- Added the
ELECTRON_DEBUG_DRAGGABLE_REGIONSenvironment variable, which visualizes and logs draggable regions in unpackaged apps to help debug custom title bars. #53627 (Also in 43, 45)
- File System Access permission requests and the
file-system-access-restrictedevent are scoped to the requesting document, grants are reset when the origin's last page closes, and write access works in in-memory sessions. #53691 (Also in 42, 43, 45) - Fixed Ctrl+Y not yanking text killed with Ctrl+K in text fields on macOS. #53714 (Also in 45)
- Fixed
Trayicons not appearing when running inside Flatpak or Snap sandboxes on Linux. #53653 (Also in 45) - Fixed
app.getGPUInfo('complete')stalling the GPU process for several seconds on some Windows systems. #53644 (Also in 45) - Fixed
session.setPermissionCheckHandlerreceiving the top-level origin and a nullwebContentsforhidandusbchecks made from a subframe. #53688 (Also in 42, 43, 45) - Fixed
webContents.on(),removeListener()andremoveAllListeners()throwing "Object has been destroyed" forconsole-messagelisteners after the WebContents was destroyed. #53494 (Also in 42, 43, 45) - Fixed a crash on Linux when
process.envwas written while another thread was reading the environment, and a memory leak when a worker thread exits. #53509 (Also in 42, 43, 45) - Fixed a possible crash on Windows when a file dialog was shown for a window that was being closed at the same time. #53583 (Also in 42, 43, 45)
- Fixed a renderer crash when the main process sent IPC to, or a page navigated, a same-process
window.open()child whosecontextIsolationdiffered from its opener's. #53539 (Also in 42, 43, 45) - Fixed a spurious
node_initerror being logged when creating aShadowRealmwith Node.js integration enabled. #53579 (Also in 45) - Fixed crashes in
setDisplayMediaRequestHandlerwhen the granted frame had been destroyed or another tab was granted by id. #53672 (Also in 42, 43, 45) - Fixed several non-functional DevTools integrations: the Security panel's "View certificate" button, Ctrl+wheel zooming inside DevTools, and DevTools keyboard shortcuts (e.g. F8) while the inspected page has focus. #53630 (Also in 43, 45)
- Fixed window state not being persisted when a window entered or left fullscreen, or was maximized or unmaximized, without also being moved or resized. #53576 (Also in 45)
- Internal
<webview>,window.close()andexecuteJavaScriptreply IPCs are validated against the sending frame. #53723 (Also in 42, 43, 45) <webview>withoutallowpopupsalso blocks links opened into a new window by modifier-click, and such windows navigate as the clicking document rather than as a browser-initiated load. #53721 (Also in 42, 43, 45)getUserMediawithchromeMediaSource: 'desktop'no longer accepts WebContents source ids; usechromeMediaSource: 'tab'withwebContents.getMediaSourceId()orsetDisplayMediaRequestHandlerto capture a WebContents. #53709 (Also in 42, 43, 45)nodeIntegrationInWorkernow applies only to workers created by frames that themselves have Node integration; enablenodeIntegrationInSubFramesto keep Node in workers created by subframes. #53711 (Also in 42, 43, 45)openExternalpermission requests started by a frame that has since gone away are attributed to that frame's origin rather than to the navigating page. #53699 (Also in 42, 43, 45)pointerLockandkeyboardLockpermission requests now report the requesting frame, andexecCommand('paste')requires user activation in the frame that calls it. #53693 (Also in 42, 43, 45)
@quasar/app-vite-v3.8.3
- feat(app-vite): build -> quasar.config file > build >
publicPathnow accepts the relative"./"value, for a build that can be served from any folder without knowing its URL prefix upfront (assets are referenced relative to index.html, which is Vite's own relative base shortcut). The publicPath formatter used to root every non-URL value, so"./"became"/./", which Vite normalizes to"/": the option silently produced a root-absolute build instead. It is available for the SPA and PWA modes with Vue Router in"hash"mode only, since a relative build cannot work with history mode (the router has no way to know the prefix) nor server-side. Vue Router then derives its base from the page URL, and the dev server keeps serving from the root, same as Vite does (#16945)
Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:
electron v42.11.3
- File System Access permission requests and the
file-system-access-restrictedevent are scoped to the requesting document, grants are reset when the origin's last page closes, and write access works in in-memory sessions. #53695 (Also in 43, 44, 45) - Fixed
session.setPermissionCheckHandlerreceiving the top-level origin and a nullwebContentsforhidandusbchecks made from a subframe. #53736 (Also in 43, 44, 45) - Fixed
webContents.on(),removeListener()andremoveAllListeners()throwing "Object has been destroyed" forconsole-messagelisteners after the WebContents was destroyed. #53497 (Also in 43, 44, 45) - Fixed a crash on Linux when
process.envwas written while another thread was reading the environment, and a memory leak when a worker thread exits. #53511 (Also in 43, 44, 45) - Fixed a possible crash on Windows when a file dialog was shown for a window that was being closed at the same time. #53585 (Also in 43, 44, 45)
- Fixed a renderer crash when the main process sent IPC to, or a page navigated, a same-process
window.open()child whosecontextIsolationdiffered from its opener's. #53541 (Also in 43, 44, 45) - Fixed crashes in
setDisplayMediaRequestHandlerwhen the granted frame had been destroyed or another tab was granted by id. #53674 (Also in 43, 44, 45) - Internal
<webview>,window.close()andexecuteJavaScriptreply IPCs are validated against the sending frame. #53727 (Also in 43, 44, 45) <webview>withoutallowpopupsalso blocks links opened into a new window by modifier-click, and such windows navigate as the clicking document rather than as a browser-initiated load. #53719 (Also in 43, 44, 45)getUserMediawithchromeMediaSource: 'desktop'no longer accepts WebContents source ids; usechromeMediaSource: 'tab'withwebContents.getMediaSourceId()orsetDisplayMediaRequestHandlerto capture a WebContents. #53710 (Also in 43, 44, 45)nodeIntegrationInWorkernow applies only to workers created by frames that themselves have Node integration; enablenodeIntegrationInSubFramesto keep Node in workers created by subframes. #53713 (Also in 43, 44, 45)openExternalpermission requests started by a frame that has since gone away are attributed to that frame's origin rather than to the navigating page. #53697 (Also in 43, 44, 45)pointerLockandkeyboardLockpermission requests now report the requesting frame, andexecCommand('paste')requires user activation in the frame that calls it. #53702 (Also in 43, 44, 45)
astro@7.3.2
-
#17896
a548223Thanks @matthewp! - Fixes<script>/<style>rendering in MDX so that only literal content (including content injected by remark/rehype plugins) is treated as trusted markup. A dynamic value passed as a<script>/<style>child (e.g.<script>{value}</script>) is now escaped like any other element's content instead of being rendered raw. Useset:htmlto explicitly opt a dynamic value back into raw rendering. -
#17931
c1a6a89Thanks @astro-factory! - Fixes the dev toolbar returning a 504 "Outdated Optimize Dep" error when a workspace-linked package imports a dependency that Vite's initial scan did not discover -
#17908
42e9188Thanks @astro-factory! - Fixes i18n fallback routing replacing the first substring match instead of the actual locale segment, which mangled paths like/energy/en/aboutinto/esergy/en/about -
#17936
4b92ddcThanks @astro-factory! - Fixes sessions breaking in dev mode with the Cloudflare adapter when middleware is present -
Updated dependencies [
a548223]:- @astrojs/markdown-satteri@0.4.1
@astrojs/markdown-satteri@0.4.1
- #17896
a548223Thanks @matthewp! - Fixes<script>/<style>rendering in MDX so that only literal content (including content injected by remark/rehype plugins) is treated as trusted markup. A dynamic value passed as a<script>/<style>child (e.g.<script>{value}</script>) is now escaped like any other element's content instead of being rendered raw. Useset:htmlto explicitly opt a dynamic value back into raw rendering.