From a67463452c1364a08df0fea528b96302b83d571b Mon Sep 17 00:00:00 2001 From: Niranjan Pradeep Date: Sat, 30 Mar 2024 05:07:09 +0530 Subject: [PATCH] Fix scrollbar thumb crash and UX --- src/css/layout/ScrollbarLayout.css | 34 +++++++++------------ src/plugins/Scrollbar.js | 48 ++---------------------------- src/stubs/cssVar.js | 1 - 3 files changed, 17 insertions(+), 66 deletions(-) diff --git a/src/css/layout/ScrollbarLayout.css b/src/css/layout/ScrollbarLayout.css index 42428d47..6986ec1c 100644 --- a/src/css/layout/ScrollbarLayout.css +++ b/src/css/layout/ScrollbarLayout.css @@ -27,13 +27,6 @@ .ScrollbarLayout/mainHorizontal { height: var(--scrollbar-size); left: 0; - transition-property: background-color height; -} - -/* Touching the scroll-track directly makes the scroll-track bolder */ -.ScrollbarLayout/mainHorizontal.public/Scrollbar/mainActive, -.ScrollbarLayout/mainHorizontal:hover { - height: var(--scrollbar-size-large); } .ScrollbarLayout/face { @@ -41,9 +34,11 @@ overflow: hidden; position: absolute; z-index: 1; - transition-duration: 250ms; - transition-timing-function: ease; - transition-property: width; + + /* keep the thumb aligned to the center */ + display: flex; + justify-content: center; + align-items: center; } /** @@ -57,7 +52,9 @@ content: ''; display: block; position: absolute; - transition: background-color 250ms ease; + transition-duration: 250ms; + transition-timing-function: ease; + transition-property: background-color, height, width; } .ScrollbarLayout/faceHorizontal { @@ -67,10 +64,8 @@ } .ScrollbarLayout/faceHorizontal:after { - bottom: var(--scrollbar-face-margin); - left: 0; - top: var(--scrollbar-face-margin); width: 100%; + height: calc(100% - var(--scrollbar-face-margin) * 2); } .fixedDataTable_isRTL .ScrollbarLayout/faceHorizontal, @@ -79,9 +74,10 @@ left: auto; } +/* expand horizontal scrollbar face when active */ .ScrollbarLayout/faceHorizontal.public/Scrollbar/faceActive:after, .ScrollbarLayout/main:hover .ScrollbarLayout/faceHorizontal:after { - bottom: calc(var(--scrollbar-face-margin)/2); + height: calc(100% - var(--scrollbar-face-margin)); } .ScrollbarLayout/faceVertical { @@ -92,13 +88,11 @@ .ScrollbarLayout/faceVertical:after { height: 100%; - left: var(--scrollbar-face-margin); - right: var(--scrollbar-face-margin); - top: 0; + width: calc(100% - var(--scrollbar-face-margin) * 2); } +/* expand veritcal scrollbar face when active */ .ScrollbarLayout/main:hover .ScrollbarLayout/faceVertical:after, .ScrollbarLayout/faceVertical.public/Scrollbar/faceActive:after { - left: calc(var(--scrollbar-face-margin)/2); - right: calc(var(--scrollbar-face-margin)/2); + width: calc(100% - var(--scrollbar-face-margin)); } diff --git a/src/plugins/Scrollbar.js b/src/plugins/Scrollbar.js index ec3442b0..0ede2940 100644 --- a/src/plugins/Scrollbar.js +++ b/src/plugins/Scrollbar.js @@ -33,8 +33,6 @@ const FACE_MARGIN_2 = FACE_MARGIN * 2; const FACE_SIZE_MIN = 30; const KEYBOARD_SCROLL_AMOUNT = 40; -let _lastScrolledScrollbar = null; - class Scrollbar extends React.PureComponent { static propTypes = { contentSize: PropTypes.number.isRequired, @@ -110,7 +108,7 @@ class Scrollbar extends React.PureComponent { let faceStyle; const isHorizontal = this.state.isHorizontal; const isVertical = !isHorizontal; - const isActive = this.state.focused || this.state.isDragging; + const isActive = this.state.isDragging; const faceSize = this.state.faceSize; const isOpaque = this.props.isOpaque; const verticalTop = this.props.verticalTop || 0; @@ -182,8 +180,6 @@ class Scrollbar extends React.PureComponent { return (
{ @@ -313,15 +306,10 @@ class Scrollbar extends React.PureComponent { position = maxPosition; } - const isDragging = this._mouseMoveTracker - ? this._mouseMoveTracker.isDragging() - : false; - // This function should only return flat values that can be compared quiclky // by `ReactComponentWithPureRenderMixin`. const state = { faceSize, - isDragging, isHorizontal, position, scale, @@ -358,6 +346,8 @@ class Scrollbar extends React.PureComponent { }; _onMouseDown = (/*object*/ event) => { + this.setState({ isDragging: true }); + /** @type {object} */ let nextState; @@ -387,7 +377,6 @@ class Scrollbar extends React.PureComponent { nextState = {}; } - nextState.focused = true; this._setNextState(nextState); this._mouseMoveTracker.captureMouseMoves(event); @@ -535,32 +524,6 @@ class Scrollbar extends React.PureComponent { ); }; - _onFocus = () => { - this.setState({ - focused: true, - }); - }; - - _onBlur = () => { - this.setState({ - focused: false, - }); - }; - - _blur = () => { - const el = ReactDOM.findDOMNode(this); - if (!el) { - return; - } - - try { - this._onBlur(); - el.blur(); - } catch (oops) { - // pass - } - }; - getTouchX = (/*object*/ e) => { return Math.round( e.targetTouches[0].clientX - e.target.getBoundingClientRect().x @@ -593,11 +556,6 @@ class Scrollbar extends React.PureComponent { } return; } - - if (willScroll && _lastScrolledScrollbar !== this) { - _lastScrolledScrollbar && _lastScrolledScrollbar._blur(); - _lastScrolledScrollbar = this; - } }; _didScroll = () => { diff --git a/src/stubs/cssVar.js b/src/stubs/cssVar.js index 8b59d160..6d6eb1b2 100644 --- a/src/stubs/cssVar.js +++ b/src/stubs/cssVar.js @@ -19,7 +19,6 @@ const CSS_VARS = { '--scrollbar-face-margin': '4px', '--scrollbar-face-radius': '6px', '--scrollbar-size': '15px', - '--scrollbar-size-large': '17px', '--scrollbar-track-color': '#fff', '--border-color': '#d3d3d3', '--fbui-white': '#fff',