smart-tooltip-delay
Smart tooltip delay experience in a breeze.
This tiny library can help you create a tooltip experience where the first one is shown with a delay and any subsequent ones are shown immediately or with a different delay. After a defined amount of time of no tooltip activity, the original tooltip delay is restored.
The GIF above shows a smart tooltip delay where tooltips are shown after 600ms, but once the first one is shown, any subsequent ones are shown immediately. After 2500ms of no tooltip activity the original 600ms delay is restored.
Interested in working on projects like this? Close is looking for great engineers to join our team!
Install
yarn add @closeio/smart-tooltip-delay
Benefits
- Extremely lightweight (less than 400B minzipped).
- Library-agnostic approach — you can combine multiple tooltip libraries and have the smart delay working for each.
- No other 3rd-party dependencies.
API
When instantiating SmartTooltipDelay
, you can provide an object with 3 options:
delay
– default delay for each tooltipnoDelay
– delay set for each subsequently shown tooltip (going from delay
to noDelay
)resetAfterTime
– time in milliseconds after which the default delay is restored (going from noDelay
to delay
)
Usage
To integrate with a tooltip library, follow these steps:
const instance = new SmartTooltipDelay({ delay: 600, noDelay: 0, resetAfterTime: 2500 })
- Set your tooltip library's delay dynamically using
instance.getCurrentDelay()
whenever the user attempts to show a tooltip - Whenever a tooltip is shown, call
instance.show()
- Whenever a tooltip is hidden, call
instance.hide()
- Enjoy smart tooltip experience
You can create a single SmartTooltipDelay
instance for the entire app or you can create instances for each button toolbar.
Example using Tippy.js
This example uses a single shared smart delay and a tooltip library called Tippy.js.
sharedDelay.js
import SmartTooltipDelay from '@closeio/smart-tooltip-delay';
export default new SmartTooltipDelay({
delay: 600,
noDelay: 0,
resetAfterTime: 2500,
});
MyTooltip.js
import sharedSmartDelay from './sharedDelay.js';
export default function MyTooltip({ content /** … more props … */ }) {
const delayArrayRef = useRef([sharedSmartDelay.getCurrentDelay(), 0]);
const handleOnTrigger = useCallback(() => {
delayArrayRef.current[0] = sharedSmartDelay.getCurrentDelay();
}, []);
const handleOnShow = useCallback(() => {
sharedSmartDelay.show();
}, []);
const handleOnHide = useCallback(() => {
sharedSmartDelay.hide();
}, []);
return (
<Tippy
delay={delayArrayRef.current}
onTrigger={handleOnTrigger}
onShow={handleOnShow}
onHide={handleOnHide}
// … more props
>
{content}
</Tippy>
);
}
Example using Bootstrap v2.3.2 Tooltips
This example uses a single shared smart delay and a tooltips from the Bootstrap framework.
sharedDelay.js
import SmartTooltipDelay from '@closeio/smart-tooltip-delay';
export default new SmartTooltipDelay({
delay: 600,
noDelay: 0,
resetAfterTime: 2500,
});
applySmartDelay.js
import $ from 'jquery';
import sharedSmartDelay from './sharedDelay.js';
export default function applySmartDelay() {
$.fn.tooltip.defaults.delay = { show: sharedSmartDelay.getCurrentDelay() };
const Tooltip = $.fn.tooltip.Constructor;
const _enter = Tooltip.prototype.enter;
Tooltip.prototype.enter = function (e) {
const self = $(e.currentTarget).data(this.type);
if (self && self.options && self.options.hasSmartDelay) {
self.options.delay = { show: sharedSmartDelay.getCurrentDelay() };
}
_enter.call(this, e);
};
const _getOptions = Tooltip.prototype.getOptions;
Tooltip.prototype.getOptions = function (initialOptions) {
const options = _getOptions.call(this, initialOptions);
options.hasSmartDelay = !initialOptions.delay && initialOptions.delay !== 0;
return options;
};
$(document).on({
'show.bs.tooltip': sharedSmartDelay.show,
'hide.bs.tooltip': sharedSmartDelay.hide,
});
}
License
MIT © Close