UNPKG

@14islands/r3f-scroll-rig

Version:

Progressively enhance any React website with WebGL using @react-three/fiber

434 lines (267 loc) 15.1 kB
# Changelog ## v8.15.0 - `useWindowSize` - Feat: export added - `StickyScrollScene` - Fix: better sticky area calculation when reloading while scrolled down ## v8.14.0 - `SmoothScrollbar` - Feat: now using `lenis` import - `preloadScene` - Feat: Switched to object literal for arguments to match other render API functions - Fix: `scene` and `camera` props are now optional - `UseCanvas` - Fix: `id` prop is now passed to the child - `powerups` add type declaration ## v8.13.0 - `ScrollScene` improved portal support - `StickyScrollScene` improvements ## v8.12.0 - Upgrade `@studio-freight/lenis` to `v1.0.23` - `SmoothScrollbar` Passing in children is now obsolete and not needed. The only reason was to set `pointer-events: none` on the children while scrolling. We now do this directly on `doucment.documentElement`. This change makes it easier to dynamically import and conditionally render the scrollbar to split the bundle. ## v8.11.0 - Upgrade `@studio-freight/lenis` to `v1.0.16` ## v8.10.0 - Upgrade `@studio-freight/lenis` to `v1.0.10` - `GlobalCanvas` - Add back: `as` props to allow changing the default R3F Canvas component. Prep work for supporting custom tree shaked canvas or perhaps react-three-offscreen in the future ## v8.9.0 Simplify render logic and improve camera controls. - `ViewportScrollScene` - Feat: now uses portal state enclave for camera so you can use OrbitControls or pass in a custom camera as a child. - Feat: No longer clears depth by default - Feat: added `hud` prop to clear depth - Feat: aadded `camera` prop to allow overriding default camera settings - specifying `fov` will calculate distance to match the DOM - Removed `renderOrder` - can be set manually on children instead - `ScrollScene` - Removed `renderOrder` - can be set manually on children instead - `GlobalCanvas` - Fix: make sure `viewport` is correct after resize when using default perspective camera - Feat: `camera` prop now allows overriding `fov`. If `fov` is specified, the camera distance will be calculated to match DOM size. - Feat: Default camera FoV now set to 50 - Removed: `globalClearAlpha` - can be controlled by other useFrames with higher or lower priority instead - Removed: `as` - always renders as a default R3F Canvas. `react-xr` no longer uses VRCanvas and ARCanvas. - `useImageAsTexture` - Fix: better support for next/image loading="lazy" - `SmoothScrollbar` - Fix: make sure binding an onScroll callback fires an initial scroll event ## v8.8.0 Added some properties to help support having multiple SmoothScrollbar on the page at the same time. The usecase is to open a Modal on top of the current page which also needs to be smooth scrolled. - `useTracker` - Added `wrapper` option to get initial scroll offset from DOM element instead of the window object. - Added `scroll` prop to `update({ scroll })` to update tracker with custom scroll state. Useful when having a secondary scrollbar mounted. - `SmoothScrollbar` - Added `onScroll` prop to register a scroll event callback. - Added `updateGlobalState` prop. True by default. Set it to false to disable updating the global scroll state. Useful when having a secondary scrollbar mounted. ## v8.7.0 - `scrollInContainer` - Feat: Added experimental `scrollInContainer` prop which scrolls inside the body element instead of the default window. This can be used to avoid scrolling away the URL bar on mobile. It also enables the `smoothTouch` setting in Lenis which emulates scroll using touch events. - `useTracker` - Fix: Matches height of canvas element instead of window.innerHeight if possible. (Fixes position problems on mobile where canvas is 100vh) ## v8.6.0 - All files converted to TypeScript ## v8.5.0 - Fixed SSR warnings by replacing `uesLayoutEffect` with `useIsomorphicLayoutEffect` - `GlobalCanvas` - removed `loadingFallback` - children can now be a render function (optional). It accepts the global canvas children from useCanvas as a single parameter. This can be used to add suspense boundaries. ```jsx <GlobalCanvas> {(globalChildren) => ( <Suspense fallback={null}> {globalChildren} <AnotherPersistentComponent /> </Suspense> )} </GlobalCanvas> ``` - `useImageAsTexture` - Added WebP Accept header to fetch request if supported by brower - Notifies the DefaultLoadingManager that something is loading while waiting for the DOM image load. - Added global css with classes that can hide DOM elements when canvas is active `import "@14islands/r3f-scroll-rig/css";` - Global export `styles` added to access CSS class names from Javascript. ```jsx import { styles } from '@14islands/r3f-scroll-rig' function Component() { return <div className={styles.hidden}>I will be `visibility: hidden` if WebGL is supported</div> } ``` - Removed `useCanvasRef` - use exported classnames and global CSS to hide elements via SSR instead to avoid FOUC - `SmoothScrollbar` - Replaced global html classname `js-has-smooth-scrollbar` with two classes: `js-smooth-scrollbar-enabled` and `js-smooth-scrollbar-disabled` - `useCanvas` - improved option `dispose:false` to keep unused meshes mounted. Now passes an `inactive` prop to the component which is true if no hook is using the mesh. - `useTracker` - new call signature - first argument is always the DOM ref - second argument is the optional config settings for the IntersectionObserver ## v8.4.0 - `GlobalCanvas` - `children` can now be a render function which accepts all global children as a single argument. Can be used if you need to wrap all canvas children with a parent. ## v8.3.0 - `useTracker` hook - Added `autoUpdate` configuration which decides if the tracker automatically updates on scroll events. True by default. - The `update` callback will now always recalculate positions even if element is outside viewport in case user wants to turn off autUpdate and take control. - `SmoothScrollbar` - Added `horizontal` prop ## v8.1.0 - `useTracker` hook - Added `threshold` prop which can used to customize the underlying Intersection Observer of the tracked DOM element - `ScrollScene` and `ViewportScrollScene` - Added `inViewportThreshold` prop which is passed to `useTracker` as `threshold` ## v8.0.0 Complete refactor with focus on reducing complexity. Now uses mostly R3F defaults and `<GlobalCanvas>` accepts all R3F Canvas props. Advanced use-cases are enabled only when setting `frameloop="demand"` - so most users won't have to worry about this. ### New peer deps: - @react-three/fiber `">=8.0.0"` - Three.js `>=0.139.0` is now required for colorManagement ### New features - Started adding typescript - Uses `https://github.com/studio-freight/lenis` scrollbar - New hook `useTracker` that tracks DOM elements - refactored `ScrollScene` and `ViewportScrollScene` to use this internally. - New hook `useCanvasRef` which can be used to hide tracked DOM elements when the canvas is active. - New hook `useImageAsTexture` which loads images from the DOM and suspends via useLoader. Replaces the old `useImgTagAsTexture` which did not suspend properly and was more of a hack. ### Breaking Changes: - Removed `useImgTagAsTexture`. Use `useImageAsTexture` instead. - `ScrollScene` and `ViewportScrollScene` - Renamed `el` prop to `track` - `inViewportMargin` is now a string and maps to IntersectionObserver `rootMargin` - Removed `lerp`, `lerpOffset`. Uses the SmoothScrollbar position directly. - Removed `setInViewportProp` prop. Instead uses IntersectionObserver to always set `inViewport` prop. - Removed `updateLayout` - relac position using the `reflow()` method from `useSrcollRig()` instead. - Removed `positionFixed` - suggest implementing manually in some other way using `useTracker`. - Removed `autoRender` - suggest implementing manually in a custom component using `useTracker`. - Removed `resizeDelay` - Removed `hiddenStyle` - use `useCanvasRef` instead to control how tracked DOM elements are hidden. - `VirtualScrollbar` and `HijackedScrollbar` removed. Use `SmoothScrollbar` instead which is similar to the old hijacked version. - `GlobalCanvas` - Removed `config` prop and added individual props instead: - Added `debug` to turn on shader compile errors and show console.logs - Added `scaleMultiplier` to control viewport units scaling - Added `globalRender` - enable/disable built-in render loop - Added `globalPriority` - enable/disable built-in render loop - Added `globalAutoClear?: boolean` to control if `gl.clearDepth()` is called before render in global render loop. Default `false` - render as HUD on top of viewports without clearing them. - Added `globalClearDepth?: boolean` to control `gl.autoClear` in global render loop. Default `true`. - Renamed `fallback` property to `loadingFallback` for global Suspense fallback as R3F Canvas already has a prop with this name - examples/ folder removed - added new import target `@14islands/r3f-scroll-rig/powerups` with useful helpers - might become separate repo later ## v7.0.0 - update to R3f v7 - Enables autoRender by default if frameloop="always" ## v6.0.0 - Updated to R3F v6 api. ## v2.1.0 ### ViewportScrollScene, ScrollScene, ScrollDomPortal - `lerpOffset` is now a factor that is multiplied with the lerp instead of added. Default value is now `1` instead of `0`. ## v2.0.0 Breaking upgrade. Simplify and remove as much as possible. - `requestFrame` is now removed. please use `invalidate` to trigger useFrame - global render pass now run with priority `1000` - `renderFullscreen` has been renamed to `requestRender` - use this to trigger a global render pass. - `renderScissor` and `renderViewport` now renders immediately. use `useFrame() priority` to render before or after global render - `preloadScene` now runs with priority `0` - `ScrollScene` and `ViewportScrollScene` runs with priority `1` by default - `ScrollScene` and `ViewportScrollScene` now accepts a `priority` prop to change the `useFrame` priority. - all `pause` and `suspend` logic has been removed ## v1.11.0 Added `stdlib` export target with the following reusable components: - WebGLText - WebGLImage - ParallaxScrollScene - StickyScrollScene E.g. `import { StickyScrollScene } from '@14islands/r3f-scroll-rig/stdlib` ## v1.10.0 ### GlobalCanvas - Added back Stats component. `fps` config and querystring now works again ### HijackedScrollbar - New experimental scrollbar with animates `window.scrollTo` instead of translating sections with CSS. ## v1.9.21 ### ScrollDom (Experimental) - Removed. Consider using `ScrollPortal` or use `drei`'s `HTML` component instead. ### ScrollDomPortal - Removed `framer-motion` dependency. ### ViewportScrollScene - Removed `framer-motion` dependency. ### VirtualScrollbar - Removed `framer-motion` dependency. ### ScrollScene - Removed experimental `softDirection` - Removed `framer-motion` dependency. ## v1.9.17 ### GlobalCanvas - Added config option `subpixelScrolling` that affects ScrollScene. If false, the scroll poition will be rounded to an integer (browsers usually do this with normal scroll) ## v1.9.13 ### ScrollDomPortal - `portalEl` now needs to be passed as an argument. GlobalCanvas no longer provides a default portal. ## v1.9.12 ### GlobalCanvas - `antialias` and `depth` are now `true` by default. - `VirtualScrolbar` now uses same lerp & restDelta as Canvas components ## v1.9.0 ### GlobalRenderer - No more automatic switching between global vs scissor renders. To make it more predictable, scissor passes are always rendered if requested. ### ScrollScene - `scissor` is now false by default ## v1.8.0 ### VirtualScrollbar - New prop `scrollToTop` (false by default) to automatically scroll to top of page when scrollbar mounts. (used to be true by default) ## v1.7.1 ### GlobalRenderer - `gl.autoClear` is now only turned off if we have viewports renderering before main global render call. This fixes background alpha glitch on Oculus browser and WebXR clearing issues. ## v1.7.0 ### GlobalCanvas - New property `as` to support rendering the global canvas as a `VRCanvas` for instance. ## v1.6.0 ### ViewportScrollScene - `PerspectiveCameraScene` renamed to `ViewportScrollScene` with optional property `orthographic` to switch between orthographic and perspective cameras. Both are scaled to fit the viewport exactly. ### GlobalCanvas - Uses custom cameras for global `scaleMultiplier` to work properly. Bypasses all built-in @react-three/fiber camera logic. Property `orthogonal` is used to select which camera. - added `fps` setting to the `config` propery which overrides scroll-rig config Querystring value for `fps` and `debug` override this config. - Default pixelRatio scaling can now be turned off with `config={{autoPixelRatio: false}}` - turned stencil buffer on by default (not sure disabling did anything good for perf anyway) - removed gl properties `preserveDrawingBuffer: false` and `premultipliedAlpha: true` that are default in threejs anyway to simplify ## v1.5.0 ### ScrollScene - Deprecated `layoutOffset` and `layoutLerp`. Should be implemented by child component. ## v1.4.0 ### ScrollScene - Deprecated `state` prop passed to child. Replaced by `scrollState` ### PerspectiveCameraScene - Deprecated `state` prop passed to child. Replaced by `scrollState` - Accepts `scaleMultiplier` prop which overrides global setting ## v1.3.0 ### GlobalCanvas - `config` propery which overrides scroll-rig config. Props that might be useful to change are `debug`, `scaleMultiplier`, `scrollLerp`. - `scaleMultiplier` config added which affects PerspectiveCameraScene and ScrollScene scaling. Used to scale pixels vs viewport units (1 by default, i.e. 1px = 1 viewport unit). Suggest using `0.001` for perspective scenes to avoid depth buffer sorting issues etc. (1000px == 1 viewport unit) ### ScrollScene - Scale scene using global `config.scaleMultiplier` ### PerspectiveCameraScene - Scale scene using global `config.scaleMultiplier` ### ResizeManager - Fix broken resize logic under some race conditions ## v1.2.0 ### GlobalRenderer - Viewport scenes can now renderOnTop to render after global queue - depth is no longer disabled - config.fbo is removed, implement in your app instead - `renderScissor`is deprecated ### PerspectiveScrollScene - Uses `createPortal` instead of nested scene and all of its problems (sweet!) - New prop `renderOnTop` to render after global render ## v1.0: ### GlobalCanvas - WebGL 2.0 by default - `resizeOnHeight` added to GlobalCanvas (default true) ### ScrollScene - `live` flag is now called `updateLayout` - `getOffset` -> `layoutOffset` - `scene` prop passed to children is no longer a ref ### PerspectiveScrollScene - Uses `createPortal` instead of nested scene and all of its problems (sweet!) GlobalRenderer - colorManagement=true + gl.toneMapping = NoToneMapping to match hex with DOM ### ResizeManager - `resizeOnWebFontLoaded` added to ResizeManager