Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RangeControl: Improve initial hover interaction with Tooltip #20219

Merged
merged 8 commits into from
Feb 20, 2020

Conversation

ItsJonQ
Copy link

@ItsJonQ ItsJonQ commented Feb 13, 2020

Description

This update improves the initial hover/mouseenter experience with the RangeControl's Tooltip. This is achieved be debouncing the interaction. By debouncing, the Tooltip rendering is less jarring when there are multiple RangeControl components next to each other.

A Storybook story was added to test and simulate this experience.

Lastly, the utility functions/hooks from RangeControl was abstracted to a dedicated utils.js file under the component directory.

How has this been tested?

  • Tested in Storybook
  • Tested in local development

Screenshots

Before

before

After

after

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

Follow up to:
#19916

This update improves the initial hover/mouseenter experience with the RangeControl's Tooltip. This is achieved be debouncing the interaction. By debouncing, the Tooltip rendering is less jarring when there are multiple `RangeControl` components next to each other.

A Storybook story was added to test and simulate this experience.

Lastly, the utility functions/hooks from `RangeControl` was abstracted to a dedicated `utils.js` file under the component directory.
Comment on lines 63 to 65
if ( timeoutRef.current ) {
window.clearTimeout( timeoutRef.current );
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor, but: window.clearTimeout will not complain if you give it undefined. Thus, the condition is not strictly necessary.

Copy link
Author

@ItsJonQ ItsJonQ Feb 14, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh! Thanks for the heads up :). I'll make that update

Edit: I've noticed the clearTimeout guard in other parts of Gutenberg as well. Maybe something to adjust in the future (when we get around to it 😊 )

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I could imagine an argument on the basis of: Being explicit makes it clearer that there's an expectation that it might be unassigned. So even if not necessary, one might think it could help maintainability. For me, I think the benefits of simplifying it are slightly more (both in expressiveness, and smaller bundle size), so I'd lean more on the side of avoiding it.

packages/components/src/range-control/utils.js Outdated Show resolved Hide resolved
packages/components/src/range-control/utils.js Outdated Show resolved Hide resolved
@aduth
Copy link
Member

aduth commented Feb 14, 2020

I don't know where best to report this, but I see some strange behavior using the range control in the Column block "Percentage width". Specifically, when the range knob is all the way to the left, sometimes clicking and dragging it will not move it. It's not consistent, but definitely disorienting when it happens. It seems like it's just not capturing the "drag" intention, because it otherwise just acts like default text selection when moving my mouse while mousedown.

@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 14, 2020

@aduth Ah! Thanks for reporting! @jorgefilipecosta reported similar issues that I'm working on resolving in this PR:

#20247

Apologies for the 🐛 !

Copy link
Member

@aduth aduth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 assuming that the bug I observed isn't introduced here.

Comment on lines 14 to 17
* @param {number} value The value to clamp
* @param {number} min The minimum value
* @param {number} max The maxinum value
* @return {number} A (float) number
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two things:

  • Each "column" of the docblock should be aligned, specifically the descriptions in this case.
  • @return should be separated by a newline (and is not subject to alignment with @param parts)
 * @param {number} value The value to clamp
 * @param {number} min   The minimum value
 * @param {number} max   The maxinum value
 *
 * @return {number} A (float) number

Comment on lines 27 to 32
const [ value, _setValue ] = useState( floatClamp( valueProp, min, max ) );
const valueRef = useRef( value );

const setValue = ( nextValue ) => {
_setValue( floatClamp( nextValue, min, max ) );
};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I don't usually care for _ prefixing, typically because there's usually a better way to distinguish whatever it is we're otherwise assuming to be "the same". In this case, one is responsible for directly setting the state value. The other sets the state value, but within particular constraints. Thus, I could imagine some naming like setValue and something like setClampedValue.

@@ -25,6 +19,8 @@ import Button from '../button';
import Dashicon from '../dashicon';

import { color } from '../utils/colors';

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change

(We shouldn't want or need the extra lines amongst these imports, unless there's rhyme or reason to it)

@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 20, 2020

@aduth Thank you for your feedback! I just pushed those changes <3

@github-actions
Copy link

Size Change: +41 B (0%)

Total Size: 861 kB

Filename Size Change
build/components/index.js 190 kB +41 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.01 kB 0 B
build/annotations/index.js 3.43 kB 0 B
build/api-fetch/index.js 3.39 kB 0 B
build/autop/index.js 2.58 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/index.js 6.02 kB 0 B
build/block-directory/style-rtl.css 760 B 0 B
build/block-directory/style.css 760 B 0 B
build/block-editor/index.js 104 kB 0 B
build/block-editor/style-rtl.css 9.78 kB 0 B
build/block-editor/style.css 9.77 kB 0 B
build/block-library/editor-rtl.css 7.67 kB 0 B
build/block-library/editor.css 7.67 kB 0 B
build/block-library/index.js 114 kB 0 B
build/block-library/style-rtl.css 7.47 kB 0 B
build/block-library/style.css 7.48 kB 0 B
build/block-library/theme-rtl.css 669 B 0 B
build/block-library/theme.css 671 B 0 B
build/block-serialization-default-parser/index.js 1.65 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 57.6 kB 0 B
build/components/style-rtl.css 16.1 kB 0 B
build/components/style.css 16 kB 0 B
build/compose/index.js 5.76 kB 0 B
build/core-data/index.js 10.5 kB 0 B
build/data-controls/index.js 1.04 kB 0 B
build/data/index.js 8.22 kB 0 B
build/date/index.js 5.36 kB 0 B
build/deprecated/index.js 771 B 0 B
build/dom-ready/index.js 569 B 0 B
build/dom/index.js 3.06 kB 0 B
build/edit-post/index.js 90.7 kB 0 B
build/edit-post/style-rtl.css 8.69 kB 0 B
build/edit-post/style.css 8.68 kB 0 B
build/edit-site/index.js 2.71 kB 0 B
build/edit-site/style-rtl.css 2.62 kB 0 B
build/edit-site/style.css 2.62 kB 0 B
build/edit-widgets/index.js 4.36 kB 0 B
build/edit-widgets/style-rtl.css 2.8 kB 0 B
build/edit-widgets/style.css 2.79 kB 0 B
build/editor/editor-styles-rtl.css 327 B 0 B
build/editor/editor-styles.css 328 B 0 B
build/editor/index.js 45.1 kB 0 B
build/editor/style-rtl.css 4.13 kB 0 B
build/editor/style.css 4.11 kB 0 B
build/element/index.js 4.45 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/index.js 7.6 kB 0 B
build/format-library/style-rtl.css 500 B 0 B
build/format-library/style.css 501 B 0 B
build/hooks/index.js 1.92 kB 0 B
build/html-entities/index.js 621 B 0 B
build/i18n/index.js 3.45 kB 0 B
build/is-shallow-equal/index.js 711 B 0 B
build/keyboard-shortcuts/index.js 2.3 kB 0 B
build/keycodes/index.js 1.68 kB 0 B
build/list-reusable-blocks/index.js 2.99 kB 0 B
build/list-reusable-blocks/style-rtl.css 215 B 0 B
build/list-reusable-blocks/style.css 216 B 0 B
build/media-utils/index.js 4.84 kB 0 B
build/notices/index.js 1.57 kB 0 B
build/nux/index.js 3.02 kB 0 B
build/nux/style-rtl.css 616 B 0 B
build/nux/style.css 613 B 0 B
build/plugins/index.js 2.54 kB 0 B
build/primitives/index.js 1.49 kB 0 B
build/priority-queue/index.js 878 B 0 B
build/redux-routine/index.js 2.84 kB 0 B
build/rich-text/index.js 14.3 kB 0 B
build/server-side-render/index.js 2.54 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 4 kB 0 B
build/viewport/index.js 1.61 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.18 kB 0 B

compressed-size-action

@ItsJonQ ItsJonQ merged commit 56c043c into master Feb 20, 2020
@ItsJonQ ItsJonQ deleted the update/range-control-tooltip-initial-interaction branch February 20, 2020 20:14
@github-actions github-actions bot added this to the Gutenberg 7.6 milestone Feb 20, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Components /packages/components
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants