UNPKG

overlayscrollbars

Version:

A javascript scrollbar plugin that hides the native scrollbars, provides custom styleable overlay scrollbars, and preserves the native functionality and feel.

437 lines (276 loc) 24 kB
# Changelog ## 2.11.3 ### Improvements - Introduce and document the new `CSS Custom Properties`: `--os-viewport-overflow-x` and `--os-viewport-overflow-y` which can be used to better control the `overflow` style of the `viewport` element. - Support for the `auto` value for overwrites of the `overflow` style of the `viewport`. ## 2.11.2 ### Improvements - Streamline css styles for the viewport and wrapper elements to allow overwrites of the `overflow` property. [#718](https://github.com/KingSora/OverlayScrollbars/issues/718) ### Bug Fixes - Initialization bridging via `data-overlayscrollbars-initialize` attribute conflicted with the `showNativeOverlaidScrollbars: true` option when initialized to the body element. [#713](https://github.com/KingSora/OverlayScrollbars/issues/713) ## 2.11.1 ### Improvements - Use the ResizeObservers `options.box` option to remove the need for additional DOM elements in supported browsers. - Significant performance improvements in the `update` logic. ## 2.11.0 ### Features - Add the possibility to define a [`trusted type policy`](https://developer.mozilla.org/en-US/docs/Web/API/Trusted_Types_API) for websites with a CSP. [#697](https://github.com/KingSora/OverlayScrollbars/issues/697) ### Improvements - Change `ScrollAnimationTimeline` keyframes to not animate css-custom-properties to improve scroll performance. [#705](https://github.com/KingSora/OverlayScrollbars/issues/705) ## 2.10.1 ### Improvements - Add `pen` to the list of "hoverable" pointer devices. [#690](https://github.com/KingSora/OverlayScrollbars/issues/690) ## 2.10.0 ### Features - The option `scrollbars.clickScroll` now supports the value `'instant'`. The `ClickScrollPlugin` is not required for it to work. [#645](https://github.com/KingSora/OverlayScrollbars/issues/645) ### Improvements - Rewrite `clickScroll` animation for better performance and to support in and out easing for a smoother animation. ## 2.9.2 ### Improvements - Improve initialization and update performance by determining if a non-default scroll direction is possible before measuring scroll coordinates. [#655](https://github.com/KingSora/OverlayScrollbars/issues/655) ## 2.9.1 ### Improvements - Resilience against `scroll-behavior: smooth` style when scrolling should be instant. ## 2.9.0 ### Features - Add the possibility to define a [`nonce`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/nonce) value for websites with a CSP. [#646](https://github.com/KingSora/OverlayScrollbars/pull/646) ### Improvements - Reduced bundle size due to removed compatiblity code. - `clickScroll` will not cancel on fast clicks / taps. [#650](https://github.com/KingSora/OverlayScrollbars/issues/650) - Add easing to the `clickScroll` animation. - The scrollbar-handle offset and size calculations are now entirely in CSS and will not force reflows. - Use custom css properties for setting the scrollbar-handle offset and size. ### Bug Fixes - Only take the initial scroll coordinates from the `viewport` element if it has a scrollable overflow. (Otherwise take the initial scroll coordinates from the target element) [#652](https://github.com/KingSora/OverlayScrollbars/issues/652) ## 2.8.4 ### Improvements - The scrollbar handle size is now updated if the corresponding scrollbar element has an transition. ## 2.8.3 ### Improvements - Improvements to update performance. - Added automated e2e performance metrics. ## 2.8.2 ### Bug Fixes - Fix a bug where children attribute mutations were not picked up if the new attribute value was an empty string. ## 2.8.1 ### Improvements - Improve the `scrollCoordinates` logic introduced in `v2.8.0` to have better defaults in cases of ambiguity. - The `scroll` event is not propagated if it is an result of `scrollCoordinates` detection during update. - Focus management improvements. ## 2.8.0 ### Breaking Changes - Although not a major release, I've decided to remove the `rtlScrollBehavior` field from the `Environment` object. The reason for it is a switch of how the library now detects scroll coordinates for non default flow directions. The replacement for this field is the `scrollCoordinates` field of the `State` object for each instance. ### Features - Support non default flow directions (block and inline) not only `direction: rtl`. [#625](https://github.com/KingSora/OverlayScrollbars/issues/625) - A new field `scrollCoordinates` in the `State` object. It indicates the min. and max. scroll coordinates for the viewport. (useful for non default flow direction scrolling) - A new field `scrollCoordinatesChanged` in the `updateHints` object. It indicates whether the scroll coordinates changed in an update. ### Improvements - Fix a Firefox only behavior where releasing a scrollbar handle over an anchor would trigger the anchor and navigate to it. - Change `zoom` detection: instead of the `window.resize` event, the `window.matchMedia` event is used. - Greatly improve how dragging and releasing the scrollbar handle behaves for `scroll-snapped` viewports. ### Bug Fixes - Fix a bug here pointer capture was released too early for wacom pen devices. [#630](https://github.com/KingSora/OverlayScrollbars/issues/630) ## 2.7.3 ### Improvements - Use `{ preventScroll: true }` when focusing viewport to prevent unwanted scrolling. [#629](https://github.com/KingSora/OverlayScrollbars/issues/629) - Make the scrollbars hidden when `@media print` applies. [#628](https://github.com/KingSora/OverlayScrollbars/issues/628) ## 2.7.2 ### Bug Fixes - Handle case where `document.defaultView` is `null`. [#627](https://github.com/KingSora/OverlayScrollbars/issues/627) ## 2.7.1 ### Improvements - When interacting with a scrollbar the `viewport` element gets focused under certain conditions. (Like e.g. the previously focused element is not and interactive element.) - Move the environment styles from the stylesheet into javascript to remove the requirement of loaded styles for correct functionality. ## 2.7.0 ### Improvements - Improvements for running in `deno` and `bun`. - Initialization as the `body` element is now detected as such when the tag name of the target element is `"body"`. Previously this detection was done with `target === target.ownerDocument.body` which would not work when creating a new body element in memory. - If a non generated `elements.viewport` element is provided during initialization its scroll position will be taken as the initial scroll position instead of the scroll position of the `target` element. - When interacting with the scrollbars itself the `scrollbars.autoHideDelay` will now apply when the scrollbars would be auto hidden when the interaction ends. ## 2.6.1 ### Bug Fixes - Fully remove lingering IE11 compatibility code which overwrote previously set `height` styles. ## 2.6.0 ### Improvements - Add `focusin` and `focusout` to the focus and blur event management when wrapping and unwrapping elements. [#605](https://github.com/KingSora/OverlayScrollbars/issues/605) - The `scrollbars.visibility` option was unintuitive to use for adjusting visibility per axis. Its now only applied if the scrollbars scroll axis is able to have a scrollable overflow. [#611](https://github.com/KingSora/OverlayScrollbars/issues/611) ## 2.5.0 ### Breaking Changes - Although not a major release, I've decided to drop `IE11` support in this version. This change should be beneficial to the majority of users. - The size of the js bundle decreased by `~6%`. - The size of the css bundle decreased by `~18%`. - The fields `flexboxGlue` and `cssCustomProperties` are removed from the `Environment`. (returning object from `OverlayScrollbars.env()`) ### Improvements - Streamlining of scroll related calculations, including RTL direction. - Focus and Blur event management when wrapping and unwrapping elements during initialization and destroy. [#605](https://github.com/KingSora/OverlayScrollbars/issues/605) ## 2.4.7 ### Improvements - Adapt the `exports` field in the `package.json` for correct `commonjs` and `module` handling. - Additional types exports: `Elements`, `State`, `CloneableScrollbarElements`, `ScrollbarElements`, `StaticInitialization` and `DynamicInitialization`. - Remove obsolete styles when initializing `OverlayScrollbars` on the `body` element and the browser supports native scrollbar hiding. [#601](https://github.com/KingSora/OverlayScrollbars/issues/601) - Move code to the `ScrollbarsHidingPlugin` for better treeshaking. ## 2.4.6 ### Bug Fixes - If the pointer (mouse, pen etc.) is interacting with the scrollbar, the `autoHide` option will wait until the interaction is finished. [#597](https://github.com/KingSora/OverlayScrollbars/issues/597) - `ScrollTimeline` animations are not canceled anymore when they are updated. Instead the animations keyframe effect is switched out preventing flickering. [#598](https://github.com/KingSora/OverlayScrollbars/issues/598) ## 2.4.5 ### Improvements - Its now possible to have a height / width transition on the scrollbar-handle. [#587](https://github.com/KingSora/OverlayScrollbars/issues/587) ## 2.4.4 ### Bug Fixes - Fix a bug where ScrollTimeline animation keyframe could contain `NaN` or `Infinity` values triggering a warning. [#581](https://github.com/KingSora/OverlayScrollbars/issues/581) - Treat explicitly assigned `undefined` values for options as if they would be left out. [#586](https://github.com/KingSora/OverlayScrollbars/issues/586) ## 2.4.3 ### Bug Fixes - Bug where the instance wasn't updated when the `window` resized. [#578](https://github.com/KingSora/OverlayScrollbars/issues/578) ### Improvements - Further improvements to the update strategy to make finer grained updates. ## 2.4.2 ### Improvements - Makes custom instance plugins compatible with "pure" environments such as `react` and all other component frameworks / libraries. ## 2.4.1 ### Improvements - Add compatibility `exports` field to `package.json` so the `'overlayscrollbars/styles/overlayscrollbars.css'` import works in all node versions. [#570](https://github.com/KingSora/OverlayScrollbars/issues/570) ## 2.4.0 ### Features - Finalize and document the plugin system which makes it possible to create "static" and / or "instance" plugins. - The static `OverlayScrollbars.plugin` function returns a "static" plugins instance(s) for the registered plugins. - A new `instance.plugin` function which returns a "instance" plugins instance. - window `resize` events will now update instances only if it is needed and only what is needed. ### Improvements - Small internal rewrite to improve stability, performance and bundle size. - Improvements the documentation and README. ## 2.3.2 ### Bug Fixes - The [`element.animate`](https://developer.mozilla.org/en-US/docs/Web/API/Element/animate) api is only called when the browser supports the [ScrollTimeline API](https://developer.mozilla.org/en-US/docs/Web/API/ScrollTimeline). [#562](https://github.com/KingSora/OverlayScrollbars/issues/562) ## 2.3.1 ### Bug Fixes - Fix direction `rtl` visual scrollbar handle behavior in browser which support the [ScrollTimeline API](https://developer.mozilla.org/en-US/docs/Web/API/ScrollTimeline). - Fix double tap behavior for interactive elements on `iOS` devices if `autoHide` is `leave` or `move`. [#560](https://github.com/KingSora/OverlayScrollbars/discussions/560) [#285](https://github.com/KingSora/OverlayScrollbars/discussions/285) - Fix incorrect scrollbar handle calculation when overscroll on safari occurred. [#559](https://github.com/KingSora/OverlayScrollbars/discussions/559) ## 2.3.0 ### Features - Make use of the new [ScrollTimeline API](https://developer.mozilla.org/en-US/docs/Web/API/ScrollTimeline) in supported browsers. - Add the option `scrollbars.autoHideSuspend` to make it possible to suspend the autoHide functionality until the first scroll interaction was performed. The default value for this option is `false` for backwards compatibility reasons but is recommended to be `true` for better accessibility. - Add a CSS selector to bridge deferred initializations visually. ### Bug Fixes - Fix a bug where a change wasn't detected properly when the target element was hidden initially. [#546](https://github.com/KingSora/OverlayScrollbars/discussions/546) - Fixed a bug where the scroll offset was reset to `0` sometimes after initialization when the target was the `body` element. ### Improvements - Add online examples to README. ## 2.2.1 ### Bug Fixes - Fix an issue where the `viewport` element could be wider than the `host` element. [#538](https://github.com/KingSora/OverlayScrollbars/issues/538) ### Improvements - Instead of `offsetWidth` & `offsetHeight` use the corresponding properties from the `getBoundingClientRect` object to increase accuracy of scrollbar calculations. [#542](https://github.com/KingSora/OverlayScrollbars/issues/542) ## 2.2.0 ### Improvements - Force the `scroll-behavior` css property to be `auto` when the user interacts with a scrollbar to prevent smooth scrolling to apply where it shouldn't. [#515](https://github.com/KingSora/OverlayScrollbars/issues/515) - The `viewort`, `padding` and `content` elements don't use the `class` attribute anymore for their styling. Instead each of them uses its own `data-overlayscrollbars-*` attribute. This has been done so that 3rd party libraries aren't conflicting with classnames from overlayscrollbars or vice versa. Selectors like `.os-viewport`, `.os-padding` or `.os-content` won't work anymore. [#526](https://github.com/KingSora/OverlayScrollbars/issues/526) [#530](https://github.com/KingSora/OverlayScrollbars/issues/530) ## 2.1.1 ### Bug Fixes - Fixed a bug where pointer events weren't released properly after drag or click scrolling. [#512](https://github.com/KingSora/OverlayScrollbars/issues/512) ### Improvements - The `os-theme-dark` and `os-theme-light` themes now use `border-box` box-sizing as their default. - Improve the `README.md` documentation for initialization, styling and and the browser global version. [#509](https://github.com/KingSora/OverlayScrollbars/issues/509) ## 2.1.0 ### Bug Fixes - Fix a bug where initial `RTL` direction wasn't detected properly. ### Features - Introduce `CSS Custom Properties` to improve theming and styling of scrollbars. [#478](https://github.com/KingSora/OverlayScrollbars/issues/478) ### Improvements - Improve pointer event handling on scrollbar handle and track. - Improve the README documentation with a styling section. ## 2.0.3 ### Bug Fixes - Revert the `viewport` and `padding` style `position: relative` change introduced in `v2.0.2` due to breaking behavior. [#489](https://github.com/KingSora/OverlayScrollbars/issues/489) is considered a design limitation. ## 2.0.2 ### Bug Fixes - The `viewport` and `padding` elements won't have the style `position: relative` anymore if its not needed. The style is only needed for older browsers. ([#489](https://github.com/KingSora/OverlayScrollbars/issues/489)) ## 2.0.1 ### Bug Fixes - The custom scrollbars are now always hidden if the `showNativeOverlaidScrollbars` option is `true`. ### Improvements - The initialization to the `body` element respects now `overflow: hidden` style overrides of the `html` and `body` element. ([#477](https://github.com/KingSora/OverlayScrollbars/issues/477)) - `data-overlayscrollbars-initialize` is now automatically removed if the instance is destroyed or canceled. - `data-overlayscrollbars-initialize` now always sets `overflow: auto` to prevent elements to be suddenly cropped after initialization. - removed obsolete `!important` styles ## 2.0.0 OverlayScrollbars was rewritten from the ground up in `TypeScript` in a functional manner. The rewrite comes with multiple benefits: - The library is **much** smaller now (about **50% smaller** fully treeshaken) - Modern browsers benefit greatly because compat code is inside `plugins` which are treeshaken if unused - Multiple performance optimizations were made due to the new structure - Framework Components benefit of the `pure` parameter for `options` and `events` (same input produces same output) - TypeScript definitions are always up to date (`@types/overlayscrollbars` is obsolete now) ### New Features: - If applied to `body` all the native functionality in modern browsers (e.g. swipe down to refresh on mobile, scroll restoration etc.) is preserved ([#376](https://github.com/KingSora/OverlayScrollbars/issues/376), [#425](https://github.com/KingSora/OverlayScrollbars/issues/425), [#273](https://github.com/KingSora/OverlayScrollbars/issues/273), [#320](https://github.com/KingSora/OverlayScrollbars/issues/320)) - If you scroll while the cursor hovers a scrollbar element the viewport is now scrolled ([#128](https://github.com/KingSora/OverlayScrollbars/issues/128), [#322](https://github.com/KingSora/OverlayScrollbars/issues/322)) - The initialization process can be fully customized now. This makes it possible to itegrate with other plugins / libraries ([#432](https://github.com/KingSora/OverlayScrollbars/issues/432), [#304](https://github.com/KingSora/OverlayScrollbars/issues/304), [#149](https://github.com/KingSora/OverlayScrollbars/issues/149), [#148](https://github.com/KingSora/OverlayScrollbars/issues/148), [#139](https://github.com/KingSora/OverlayScrollbars/issues/139), [#49](https://github.com/KingSora/OverlayScrollbars/issues/49)) - Scrollbars can be cloned and positioned anywhere in the DOM tree. ([#404](https://github.com/KingSora/OverlayScrollbars/issues/404), [#323](https://github.com/KingSora/OverlayScrollbars/issues/323), [#158](https://github.com/KingSora/OverlayScrollbars/issues/158), [#17](https://github.com/KingSora/OverlayScrollbars/issues/17)) - The update behavior of the `MutationObserver` for the content can be customized with the `update` options. ([#307](https://github.com/KingSora/OverlayScrollbars/issues/307), [#183](https://github.com/KingSora/OverlayScrollbars/issues/183), [#23](https://github.com/KingSora/OverlayScrollbars/issues/23)) - Works now without adjustments with CSS-Grid, CSS-Flexbox etc. - Supports all kind of input devices additionally to `mouse` and `touch`. (Uses native pointer-events now) - Exports a `esm` version which can be treeshaken ### Breaking changes: - Browser support changed. The minimal version is now IE11. - There is no default export anymore. The main entry point is now the `OverlayScrollbars` named export. - The `styles` are now exported under a different path. Read the docs for more info. - The `scroll` function is missing. (WIP will be added as a plugin) - Initialization to `textarea` element is not suppored. (WIP will be added as a plugin) - `extensions` are replaced with `plugins`. Plugins are more powerful but work nothing like `extensions`. - Any helper functions for `extensions` are removed. - `TypesScript` definitions changed completely. - `CSS` styles changed completely. - There is no `jQuery` version anymore and no `jQuery` compat functionality - The following changed for the `initialization`: - Arrays of elements are not supported anymore. If you want to initialize the plugin to multiple elements, you have to loop over them. - Since the initialization is now fully customizable, the plugin won't have special behavior anymore if it has children with `os-` classnames - The third parameter are `events` now instead of `eventsions` since `extensions` are removed - The following **options** were removed / replaced / renamed: - `resize` is removed - `sizeAutoCapable` is removed (works always now) - `clipAlways` is removed (works automatically now) - `normalizeRTL` is removed since the `scroll` function isn't implemented yet there is nothing to normalize - `autoUpdate` is removed since all browser support the `MutationObserver` api there is no need for customizing a update loop - `autoUpdateInterval` is removed - `className` is replaced with `scrollbars.theme` - `updateOnLoad` is replaced with `update.elementEvents` - `nativeScrollbarsOverlaid.initialize` is replaced with the `Initialization` concept. You can pass a object as target now where you can specify when to cancel the initialization of the plugin. - `nativeScrollbarsOverlaid.showNativeScrollbars`: is renamed to `showNativeOverlaidScrollbars` - `scrollbars.dragScrolling` is renamed to `scrollbars.dragScroll` - `scrollbars.clickScrolling` is renamed to `scrollbars.clickScroll` and animates the scroll change only with the `ClickScrollPlugin` otherwise its instant - `scrollbars.touchSupport` is replaced with `scrollbars.pointers` - `scrollbars.snapHandle` is removed - `textarea` is removed since `textarea` initialization isn't possible yet - `callbacks` is removed / replaced with the `events` concept. You can pass listeners / callback separately to the options. The `this` context is now `undefined` as a replacement each event recieves the `instance` as its first argument. - `onScrollStart` is removed - `onScrollStop` is removed - `onInitialized` is replaced with the `initialized` event - `onUpdated` is replaced with the `updated` the - `onDestroyed` is replaced with the `destroyed` event - `onScroll` is replaced with the `scroll` event - `onInitializationWithdrawn` is replaced with the `destroyed` event (if the second argument `canceled` is `true`) - `onOverflowChanged` is replaced with the `updated` event (its second argument holds the information whether the overflow changed) - `onOverflowAmountChanged` is replaced with the`updated` event (its second argument holds the information whether the overflow amount changed and how much) - `onDirectionChanged` is replaced with the `updated` event (its second argument holds the information whether the direction changed) - `onContentSizeChanged` is replaced with the `updated` event (its second argument holds the information whether the content got mutated) - `onHostSizeChanged` is replaced with the `updated` event (its second argument holds the information whether the host got mutated / its size changed) - The following **instance methods** were removed / replaced / renamed: - `sleep()` is removed since it doesn't fit into the new structure and shouldn't be needed anymore - `ext()` is removed - `addExt()` is removed - `removeExt()` is removed - `scroll()` is removed (WIP) - `scrollStop()` is removed (WIP) - `getElements()` is renamed to `elements()` and doesn't support any argumens anymore. - `getState()` is renamed to `state()` and doesn't support any argumens anymore. - The following **static methods** were removed / replaced / renamed: - `extension()` is removed - `defaultOptions()` is replaced with `env().getDefaultOptions()` and `env().setDefaultOptions()` - `globals()` is replaced with `env()` - If you used any fields from the `globals()` result, please refer to the TypeScript definitions for the correct replacement in `env()` ### Theming changes: - Because scrollbars can be cloned and positioned anywhere in the DOM, themes which worked in `v1` have to be adapted slightly: - `.os-scrollbar` elements now don't rely on its parent element. Selectors like `.os-theme-dark > .os-scrollbar-vertical` are now `.os-theme-dark.os-scrollbar-vertical` - the `.os-host-rtl` class is replaced with `.os-scrollbar-rtl`. Selectors like `.os-theme-dark.os-host-rtl > .os-scrollbar-horizontal` are now `.os-theme-dark.os-scrollbar-rtl.os-scrollbar-horizontal`