@clayui/tooltip
Advanced tools
Comparing version
@@ -12,4 +12,2 @@ "use strict"; | ||
var _domAlign = require("dom-align"); | ||
var _react = _interopRequireWildcard(require("react")); | ||
@@ -21,2 +19,8 @@ | ||
var _useAlign = require("./useAlign"); | ||
var _useClosestTitle2 = require("./useClosestTitle"); | ||
var _useTooltipState2 = require("./useTooltipState"); | ||
var _excluded = ["type"]; | ||
@@ -42,6 +46,2 @@ | ||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } | ||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } | ||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } | ||
@@ -53,48 +53,11 @@ | ||
var ALIGNMENTS = ['top', 'top-right', 'right', 'bottom-right', 'bottom', 'bottom-left', 'left', 'top-left']; | ||
var ALIGNMENTS_MAP = { | ||
bottom: ['tc', 'bc'], | ||
'bottom-left': ['tl', 'bl'], | ||
'bottom-right': ['tr', 'br'], | ||
left: ['cr', 'cl'], | ||
right: ['cl', 'cr'], | ||
top: ['bc', 'tc'], | ||
'top-left': ['bl', 'tl'], | ||
'top-right': ['br', 'tr'] | ||
}; | ||
var ALIGNMENTS_INVERSE_MAP = { | ||
bctc: 'top', | ||
bltl: 'top-left', | ||
brtr: 'top-right', | ||
clcr: 'right', | ||
crcl: 'left', | ||
tcbc: 'bottom', | ||
tlbl: 'bottom-left', | ||
trbr: 'bottom-right' | ||
}; | ||
var BOTTOM_OFFSET = [0, 7]; | ||
var LEFT_OFFSET = [-7, 0]; | ||
var RIGHT_OFFSET = [7, 0]; | ||
var TOP_OFFSET = [0, -7]; | ||
var OFFSET_MAP = { | ||
bctc: TOP_OFFSET, | ||
bltl: TOP_OFFSET, | ||
brtr: TOP_OFFSET, | ||
clcr: RIGHT_OFFSET, | ||
crcl: LEFT_OFFSET, | ||
tcbc: BOTTOM_OFFSET, | ||
tlbl: BOTTOM_OFFSET, | ||
trbr: BOTTOM_OFFSET | ||
}; | ||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } | ||
var ALIGNMENTS_FORCE_MAP = _objectSpread(_objectSpread({}, ALIGNMENTS_INVERSE_MAP), {}, { | ||
bctc: 'top-left', | ||
tcbc: 'bottom-left' | ||
}); | ||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } | ||
var initialState = { | ||
align: 'top', | ||
floating: false, | ||
message: '', | ||
setAsHTML: false, | ||
show: false | ||
setAsHTML: false | ||
}; | ||
@@ -109,15 +72,9 @@ var TRIGGER_HIDE_EVENTS = ['dragstart', 'mouseout', 'mouseup', 'pointerup', 'touchend']; | ||
switch (type) { | ||
case 'align': | ||
case 'update': | ||
return _objectSpread(_objectSpread({}, state), payload); | ||
case 'show': | ||
return _objectSpread(_objectSpread(_objectSpread({}, state), payload), {}, { | ||
show: true | ||
}); | ||
case 'hide': | ||
case 'reset': | ||
return _objectSpread(_objectSpread({}, state), {}, { | ||
align: initialState.align, | ||
floating: undefined, | ||
show: false | ||
floating: false | ||
}); | ||
@@ -130,33 +87,2 @@ | ||
function matches(element, selectorString) { | ||
if (element.matches) { | ||
return element.matches(selectorString); | ||
} else if (element.msMatchesSelector) { | ||
return element.msMatchesSelector(selectorString); | ||
} else if (element.webkitMatchesSelector) { | ||
return element.webkitMatchesSelector(selectorString); | ||
} else { | ||
return false; | ||
} | ||
} | ||
function closestAncestor(node, s) { | ||
var element = node; | ||
var ancestor = node; | ||
if (!document.documentElement.contains(element)) { | ||
return null; | ||
} | ||
do { | ||
if (matches(ancestor, s)) { | ||
return ancestor; | ||
} | ||
ancestor = ancestor.parentElement; | ||
} while (ancestor !== null); | ||
return null; | ||
} | ||
var TooltipProvider = function TooltipProvider(_ref2) { | ||
@@ -184,99 +110,77 @@ var _ref2$autoAlign = _ref2.autoAlign, | ||
setAsHTML = _useReducer2$.setAsHTML, | ||
show = _useReducer2$.show, | ||
dispatch = _useReducer2[1]; | ||
var mousePosition = (0, _shared.useMousePosition)(20); // Using `any` type since TS incorrectly infers setTimeout to be from NodeJS | ||
var timeoutIdRef = (0, _react.useRef)(); | ||
var targetRef = (0, _react.useRef)(null); | ||
var titleNodeRef = (0, _react.useRef)(null); | ||
var tooltipRef = (0, _react.useRef)(null); | ||
var saveTitle = (0, _react.useCallback)(function (element) { | ||
titleNodeRef.current = element; | ||
var title = element.getAttribute('title'); | ||
if (title) { | ||
element.setAttribute('data-restore-title', title); | ||
element.removeAttribute('title'); | ||
} else if (element.tagName === 'svg') { | ||
var titleTag = element.querySelector('title'); | ||
var _useInteractionFocus = (0, _shared.useInteractionFocus)(), | ||
getInteraction = _useInteractionFocus.getInteraction, | ||
isFocusVisible = _useInteractionFocus.isFocusVisible; | ||
if (titleTag) { | ||
element.setAttribute('data-restore-title', titleTag.innerHTML); | ||
titleTag.remove(); | ||
} | ||
} | ||
}, []); | ||
var restoreTitle = (0, _react.useCallback)(function () { | ||
var element = titleNodeRef.current; | ||
var isHovered = (0, _react.useRef)(false); | ||
var isFocused = (0, _react.useRef)(false); | ||
if (element) { | ||
var title = element.getAttribute('data-restore-title'); | ||
var _useTooltipState = (0, _useTooltipState2.useTooltipState)({ | ||
delay: delay | ||
}), | ||
close = _useTooltipState.close, | ||
isOpen = _useTooltipState.isOpen, | ||
open = _useTooltipState.open; | ||
if (title) { | ||
if (element.tagName === 'svg') { | ||
var titleTag = document.createElement('title'); | ||
titleTag.innerHTML = title; | ||
element.appendChild(titleTag); | ||
} else { | ||
element.setAttribute('title', title); | ||
} | ||
element.removeAttribute('data-restore-title'); | ||
var _useClosestTitle = (0, _useClosestTitle2.useClosestTitle)({ | ||
onClick: (0, _react.useCallback)(function () { | ||
isFocused.current = false; | ||
isHovered.current = false; | ||
}, []), | ||
onHide: (0, _react.useCallback)(function () { | ||
if (!isHovered.current && !isFocused.current) { | ||
dispatch({ | ||
type: 'reset' | ||
}); | ||
close(); | ||
} | ||
}, []), | ||
tooltipRef: tooltipRef | ||
}), | ||
getProps = _useClosestTitle.getProps, | ||
onHide = _useClosestTitle.onHide, | ||
target = _useClosestTitle.target, | ||
titleNode = _useClosestTitle.titleNode; | ||
titleNodeRef.current = null; | ||
} | ||
}, []); | ||
var handleHide = (0, _react.useCallback)(function (event) { | ||
var _tooltipRef$current, _targetRef$current; | ||
(0, _useAlign.useAlign)({ | ||
align: align, | ||
autoAlign: autoAlign, | ||
floating: floating, | ||
isOpen: isOpen, | ||
onAlign: (0, _react.useCallback)(function (align) { | ||
return dispatch({ | ||
align: align, | ||
type: 'update' | ||
}); | ||
}, []), | ||
sourceElement: tooltipRef, | ||
targetElement: titleNode | ||
}); | ||
var onShow = (0, _react.useCallback)(function (event) { | ||
if (isHovered.current || isFocused.current) { | ||
var _props = getProps(event); | ||
if (event && ((_tooltipRef$current = tooltipRef.current) !== null && _tooltipRef$current !== void 0 && _tooltipRef$current.contains(event.relatedTarget) || (_targetRef$current = targetRef.current) !== null && _targetRef$current !== void 0 && _targetRef$current.contains(event.relatedTarget))) { | ||
return; | ||
} | ||
if (_props) { | ||
var _ref3; | ||
dispatch({ | ||
type: 'hide' | ||
}); | ||
clearTimeout(timeoutIdRef.current); | ||
restoreTitle(); | ||
if (targetRef.current) { | ||
targetRef.current.removeEventListener('click', handleHide); | ||
targetRef.current = null; | ||
} | ||
}, []); | ||
var handleShow = (0, _react.useCallback)(function (event) { | ||
var target = event.target; | ||
var hasTitle = target && (target.hasAttribute('title') || target.hasAttribute('data-title')); | ||
var titleNode = hasTitle ? target : closestAncestor(target, '[title], [data-title]'); | ||
if (titleNode) { | ||
targetRef.current = target; | ||
target.addEventListener('click', handleHide); | ||
var title = titleNode.getAttribute('title') || titleNode.getAttribute('data-title') || ''; | ||
saveTitle(titleNode); | ||
var customDelay = titleNode.getAttribute('data-tooltip-delay'); | ||
var newAlign = titleNode.getAttribute('data-tooltip-align'); | ||
var _setAsHTML = !!titleNode.getAttribute('data-title-set-as-html'); | ||
var isFloating = titleNode.getAttribute('data-tooltip-floating'); | ||
clearTimeout(timeoutIdRef.current); | ||
timeoutIdRef.current = setTimeout(function () { | ||
dispatch({ | ||
align: newAlign || align, | ||
floating: Boolean(isFloating), | ||
message: title, | ||
setAsHTML: _setAsHTML, | ||
type: 'show' | ||
align: (_ref3 = _props.align) !== null && _ref3 !== void 0 ? _ref3 : align, | ||
floating: _props.floating, | ||
message: _props.title, | ||
setAsHTML: _props.setAsHTML, | ||
type: 'update' | ||
}); | ||
}, customDelay ? Number(customDelay) : delay); | ||
open(isFocused.current, _props.delay ? Number(_props.delay) : undefined); | ||
} | ||
} | ||
}, []); | ||
}, [align]); | ||
(0, _react.useEffect)(function () { | ||
var handleEsc = function handleEsc(event) { | ||
if (show && event.key === _shared.Keys.Esc) { | ||
if (isOpen && event.key === _shared.Keys.Esc) { | ||
event.stopImmediatePropagation(); | ||
handleHide(); | ||
onHide(); | ||
} | ||
@@ -289,68 +193,57 @@ }; | ||
}; | ||
}, [show]); | ||
}, [isOpen]); | ||
var onHoverStart = function onHoverStart(event) { | ||
if (getInteraction() === 'pointer') { | ||
isHovered.current = true; | ||
} else { | ||
isHovered.current = false; | ||
} | ||
onShow(event); | ||
}; | ||
var onHoverEnd = function onHoverEnd(event) { | ||
isFocused.current = false; | ||
isHovered.current = false; | ||
onHide(event); | ||
}; | ||
var onFocus = function onFocus(event) { | ||
if (isFocusVisible()) { | ||
isFocused.current = true; | ||
onShow(event); | ||
} | ||
}; | ||
var onBlur = function onBlur(event) { | ||
isFocused.current = false; | ||
isHovered.current = false; | ||
onHide(event); | ||
}; | ||
(0, _react.useEffect)(function () { | ||
if (scope) { | ||
var disposeShowEvents = TRIGGER_SHOW_EVENTS.map(function (eventName) { | ||
return (0, _shared.delegate)(document.body, eventName, scope, handleShow); | ||
return (0, _shared.delegate)(document.body, eventName, scope, onHoverStart); | ||
}); | ||
var disposeHideEvents = TRIGGER_HIDE_EVENTS.map(function (eventName) { | ||
return (0, _shared.delegate)(document.body, eventName, "".concat(scope, ", .tooltip"), handleHide); | ||
return (0, _shared.delegate)(document.body, eventName, "".concat(scope, ", .tooltip"), onHoverEnd); | ||
}); | ||
var disposeShowFocus = (0, _shared.delegate)(document.body, 'focus', "".concat(scope, ", .tooltip"), onFocus, true); | ||
var disposeCloseBlur = (0, _shared.delegate)(document.body, 'blur', "".concat(scope, ", .tooltip"), onBlur, true); | ||
return function () { | ||
disposeShowEvents.forEach(function (_ref3) { | ||
var dispose = _ref3.dispose; | ||
disposeShowEvents.forEach(function (_ref4) { | ||
var dispose = _ref4.dispose; | ||
return dispose(); | ||
}); | ||
disposeHideEvents.forEach(function (_ref4) { | ||
var dispose = _ref4.dispose; | ||
disposeHideEvents.forEach(function (_ref5) { | ||
var dispose = _ref5.dispose; | ||
return dispose(); | ||
}); | ||
disposeShowFocus.dispose(); | ||
disposeCloseBlur.dispose(); | ||
}; | ||
} | ||
}, [handleShow]); | ||
(0, _react.useEffect)(function () { | ||
if (tooltipRef.current && show && floating) { | ||
var points = ALIGNMENTS_MAP[align || 'top']; | ||
var _mousePosition = _slicedToArray(mousePosition, 2), | ||
clientX = _mousePosition[0], | ||
clientY = _mousePosition[1]; | ||
(0, _domAlign.alignPoint)(tooltipRef.current, { | ||
clientX: clientX, | ||
clientY: clientY | ||
}, { | ||
offset: OFFSET_MAP[points.join('')], | ||
points: points | ||
}); | ||
} | ||
}, [show, floating]); | ||
(0, _react.useEffect)(function () { | ||
if (titleNodeRef.current && tooltipRef.current && !floating) { | ||
var points = ALIGNMENTS_MAP[align || 'top']; | ||
var alignment = (0, _shared.doAlign)({ | ||
overflow: { | ||
adjustX: autoAlign, | ||
adjustY: autoAlign | ||
}, | ||
points: points, | ||
sourceElement: tooltipRef.current, | ||
targetElement: titleNodeRef.current | ||
}); | ||
var alignmentString = alignment.points.join(''); | ||
var pointsString = points.join(''); | ||
if (alignment.overflow.adjustX) { | ||
dispatch({ | ||
align: ALIGNMENTS_FORCE_MAP[alignmentString], | ||
type: 'align' | ||
}); | ||
} else if (pointsString !== alignmentString) { | ||
dispatch({ | ||
align: ALIGNMENTS_INVERSE_MAP[alignmentString], | ||
type: 'align' | ||
}); | ||
} | ||
} | ||
}, [align, show]); | ||
}, [onShow]); | ||
"production" !== "production" ? (0, _warning.default)(typeof children === 'undefined' && typeof scope !== 'undefined' || typeof scope === 'undefined' && typeof children !== 'undefined', '<TooltipProvider />: You must use at least one of the following props: `children` or `scope`.') : void 0; | ||
@@ -360,7 +253,7 @@ "production" !== "production" ? (0, _warning.default)(typeof children !== 'undefined' || typeof scope !== 'undefined', '<TooltipProvider />: If you want to use `scope`, use <TooltipProvider /> as a singleton and do not pass `children`.') : void 0; | ||
var titleContent = contentRenderer({ | ||
targetNode: targetRef.current, | ||
targetNode: target.current, | ||
title: message | ||
}); | ||
var tooltip = show && /*#__PURE__*/_react.default.createElement(_shared.ClayPortal, containerProps, /*#__PURE__*/_react.default.createElement(_Tooltip.default, { | ||
var tooltip = isOpen && /*#__PURE__*/_react.default.createElement(_shared.ClayPortal, containerProps, /*#__PURE__*/_react.default.createElement(_Tooltip.default, { | ||
alignPosition: align, | ||
@@ -377,4 +270,6 @@ ref: tooltipRef, | ||
children: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children.props.children, tooltip), | ||
onMouseOut: handleHide, | ||
onMouseOver: handleShow | ||
onBlur: onBlur, | ||
onFocus: onFocus, | ||
onMouseOut: onHoverEnd, | ||
onMouseOver: onHoverStart | ||
}))); | ||
@@ -381,0 +276,0 @@ }; |
{ | ||
"name": "@clayui/tooltip", | ||
"version": "3.77.0", | ||
"version": "3.78.0", | ||
"description": "ClayTooltip component", | ||
@@ -29,3 +29,3 @@ "license": "BSD-3-Clause", | ||
"dependencies": { | ||
"@clayui/shared": "^3.77.0", | ||
"@clayui/shared": "^3.78.0", | ||
"classnames": "^2.2.6", | ||
@@ -43,3 +43,3 @@ "dom-align": "^1.12.2", | ||
], | ||
"gitHead": "edd3cfe3a397c48057632f76945b2ae9be1bfa58" | ||
"gitHead": "128788059d168c956b392363054933db34c67cab" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
52228
38.19%22
69.23%1366
38.54%Updated