@clayui/tooltip 3.77.0 → 3.78.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/TooltipProvider.js +124 -229
- package/lib/useAlign.d.ts +18 -0
- package/lib/useAlign.js +121 -0
- package/lib/useClosestTitle.d.ts +23 -0
- package/lib/useClosestTitle.js +138 -0
- package/lib/useTooltipState.d.ts +13 -0
- package/lib/useTooltipState.js +51 -0
- package/package.json +3 -3
- package/src/TooltipProvider.tsx +128 -307
- package/src/__tests__/index.tsx +28 -0
- package/src/useAlign.ts +137 -0
- package/src/useClosestTitle.ts +170 -0
- package/src/useTooltipState.ts +43 -0
package/lib/TooltipProvider.js
CHANGED
|
@@ -9,14 +9,18 @@ exports.default = void 0;
|
|
|
9
9
|
|
|
10
10
|
var _shared = require("@clayui/shared");
|
|
11
11
|
|
|
12
|
-
var _domAlign = require("dom-align");
|
|
13
|
-
|
|
14
12
|
var _react = _interopRequireWildcard(require("react"));
|
|
15
13
|
|
|
16
14
|
var _warning = _interopRequireDefault(require("warning"));
|
|
17
15
|
|
|
18
16
|
var _Tooltip = _interopRequireDefault(require("./Tooltip"));
|
|
19
17
|
|
|
18
|
+
var _useAlign = require("./useAlign");
|
|
19
|
+
|
|
20
|
+
var _useClosestTitle2 = require("./useClosestTitle");
|
|
21
|
+
|
|
22
|
+
var _useTooltipState2 = require("./useTooltipState");
|
|
23
|
+
|
|
20
24
|
var _excluded = ["type"];
|
|
21
25
|
|
|
22
26
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -37,62 +41,21 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
|
|
|
37
41
|
|
|
38
42
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
39
43
|
|
|
40
|
-
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; }
|
|
41
|
-
|
|
42
|
-
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; }
|
|
43
|
-
|
|
44
44
|
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; }
|
|
45
45
|
|
|
46
46
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
47
47
|
|
|
48
48
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
49
49
|
|
|
50
|
-
var
|
|
51
|
-
var ALIGNMENTS_MAP = {
|
|
52
|
-
bottom: ['tc', 'bc'],
|
|
53
|
-
'bottom-left': ['tl', 'bl'],
|
|
54
|
-
'bottom-right': ['tr', 'br'],
|
|
55
|
-
left: ['cr', 'cl'],
|
|
56
|
-
right: ['cl', 'cr'],
|
|
57
|
-
top: ['bc', 'tc'],
|
|
58
|
-
'top-left': ['bl', 'tl'],
|
|
59
|
-
'top-right': ['br', 'tr']
|
|
60
|
-
};
|
|
61
|
-
var ALIGNMENTS_INVERSE_MAP = {
|
|
62
|
-
bctc: 'top',
|
|
63
|
-
bltl: 'top-left',
|
|
64
|
-
brtr: 'top-right',
|
|
65
|
-
clcr: 'right',
|
|
66
|
-
crcl: 'left',
|
|
67
|
-
tcbc: 'bottom',
|
|
68
|
-
tlbl: 'bottom-left',
|
|
69
|
-
trbr: 'bottom-right'
|
|
70
|
-
};
|
|
71
|
-
var BOTTOM_OFFSET = [0, 7];
|
|
72
|
-
var LEFT_OFFSET = [-7, 0];
|
|
73
|
-
var RIGHT_OFFSET = [7, 0];
|
|
74
|
-
var TOP_OFFSET = [0, -7];
|
|
75
|
-
var OFFSET_MAP = {
|
|
76
|
-
bctc: TOP_OFFSET,
|
|
77
|
-
bltl: TOP_OFFSET,
|
|
78
|
-
brtr: TOP_OFFSET,
|
|
79
|
-
clcr: RIGHT_OFFSET,
|
|
80
|
-
crcl: LEFT_OFFSET,
|
|
81
|
-
tcbc: BOTTOM_OFFSET,
|
|
82
|
-
tlbl: BOTTOM_OFFSET,
|
|
83
|
-
trbr: BOTTOM_OFFSET
|
|
84
|
-
};
|
|
50
|
+
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; }
|
|
85
51
|
|
|
86
|
-
var
|
|
87
|
-
bctc: 'top-left',
|
|
88
|
-
tcbc: 'bottom-left'
|
|
89
|
-
});
|
|
52
|
+
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; }
|
|
90
53
|
|
|
91
54
|
var initialState = {
|
|
92
55
|
align: 'top',
|
|
56
|
+
floating: false,
|
|
93
57
|
message: '',
|
|
94
|
-
setAsHTML: false
|
|
95
|
-
show: false
|
|
58
|
+
setAsHTML: false
|
|
96
59
|
};
|
|
97
60
|
var TRIGGER_HIDE_EVENTS = ['dragstart', 'mouseout', 'mouseup', 'pointerup', 'touchend'];
|
|
98
61
|
var TRIGGER_SHOW_EVENTS = ['mouseover', 'mouseup', 'pointerdown', 'touchstart'];
|
|
@@ -102,19 +65,13 @@ var reducer = function reducer(state, _ref) {
|
|
|
102
65
|
payload = _objectWithoutProperties(_ref, _excluded);
|
|
103
66
|
|
|
104
67
|
switch (type) {
|
|
105
|
-
case '
|
|
68
|
+
case 'update':
|
|
106
69
|
return _objectSpread(_objectSpread({}, state), payload);
|
|
107
70
|
|
|
108
|
-
case '
|
|
109
|
-
return _objectSpread(_objectSpread(_objectSpread({}, state), payload), {}, {
|
|
110
|
-
show: true
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
case 'hide':
|
|
71
|
+
case 'reset':
|
|
114
72
|
return _objectSpread(_objectSpread({}, state), {}, {
|
|
115
73
|
align: initialState.align,
|
|
116
|
-
floating:
|
|
117
|
-
show: false
|
|
74
|
+
floating: false
|
|
118
75
|
});
|
|
119
76
|
|
|
120
77
|
default:
|
|
@@ -122,37 +79,6 @@ var reducer = function reducer(state, _ref) {
|
|
|
122
79
|
}
|
|
123
80
|
};
|
|
124
81
|
|
|
125
|
-
function matches(element, selectorString) {
|
|
126
|
-
if (element.matches) {
|
|
127
|
-
return element.matches(selectorString);
|
|
128
|
-
} else if (element.msMatchesSelector) {
|
|
129
|
-
return element.msMatchesSelector(selectorString);
|
|
130
|
-
} else if (element.webkitMatchesSelector) {
|
|
131
|
-
return element.webkitMatchesSelector(selectorString);
|
|
132
|
-
} else {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function closestAncestor(node, s) {
|
|
138
|
-
var element = node;
|
|
139
|
-
var ancestor = node;
|
|
140
|
-
|
|
141
|
-
if (!document.documentElement.contains(element)) {
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
do {
|
|
146
|
-
if (matches(ancestor, s)) {
|
|
147
|
-
return ancestor;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
ancestor = ancestor.parentElement;
|
|
151
|
-
} while (ancestor !== null);
|
|
152
|
-
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
82
|
var TooltipProvider = function TooltipProvider(_ref2) {
|
|
157
83
|
var _ref2$autoAlign = _ref2.autoAlign,
|
|
158
84
|
autoAlign = _ref2$autoAlign === void 0 ? true : _ref2$autoAlign,
|
|
@@ -175,103 +101,81 @@ var TooltipProvider = function TooltipProvider(_ref2) {
|
|
|
175
101
|
_useReducer2$$message = _useReducer2$.message,
|
|
176
102
|
message = _useReducer2$$message === void 0 ? '' : _useReducer2$$message,
|
|
177
103
|
setAsHTML = _useReducer2$.setAsHTML,
|
|
178
|
-
show = _useReducer2$.show,
|
|
179
104
|
dispatch = _useReducer2[1];
|
|
180
105
|
|
|
181
|
-
var mousePosition = (0, _shared.useMousePosition)(20); // Using `any` type since TS incorrectly infers setTimeout to be from NodeJS
|
|
182
|
-
|
|
183
|
-
var timeoutIdRef = (0, _react.useRef)();
|
|
184
|
-
var targetRef = (0, _react.useRef)(null);
|
|
185
|
-
var titleNodeRef = (0, _react.useRef)(null);
|
|
186
106
|
var tooltipRef = (0, _react.useRef)(null);
|
|
187
|
-
var saveTitle = (0, _react.useCallback)(function (element) {
|
|
188
|
-
titleNodeRef.current = element;
|
|
189
|
-
var title = element.getAttribute('title');
|
|
190
|
-
|
|
191
|
-
if (title) {
|
|
192
|
-
element.setAttribute('data-restore-title', title);
|
|
193
|
-
element.removeAttribute('title');
|
|
194
|
-
} else if (element.tagName === 'svg') {
|
|
195
|
-
var titleTag = element.querySelector('title');
|
|
196
|
-
|
|
197
|
-
if (titleTag) {
|
|
198
|
-
element.setAttribute('data-restore-title', titleTag.innerHTML);
|
|
199
|
-
titleTag.remove();
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}, []);
|
|
203
|
-
var restoreTitle = (0, _react.useCallback)(function () {
|
|
204
|
-
var element = titleNodeRef.current;
|
|
205
|
-
|
|
206
|
-
if (element) {
|
|
207
|
-
var title = element.getAttribute('data-restore-title');
|
|
208
|
-
|
|
209
|
-
if (title) {
|
|
210
|
-
if (element.tagName === 'svg') {
|
|
211
|
-
var titleTag = document.createElement('title');
|
|
212
|
-
titleTag.innerHTML = title;
|
|
213
|
-
element.appendChild(titleTag);
|
|
214
|
-
} else {
|
|
215
|
-
element.setAttribute('title', title);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
element.removeAttribute('data-restore-title');
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
titleNodeRef.current = null;
|
|
222
|
-
}
|
|
223
|
-
}, []);
|
|
224
|
-
var handleHide = (0, _react.useCallback)(function (event) {
|
|
225
|
-
var _tooltipRef$current, _targetRef$current;
|
|
226
107
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
108
|
+
var _useInteractionFocus = (0, _shared.useInteractionFocus)(),
|
|
109
|
+
getInteraction = _useInteractionFocus.getInteraction,
|
|
110
|
+
isFocusVisible = _useInteractionFocus.isFocusVisible;
|
|
111
|
+
|
|
112
|
+
var isHovered = (0, _react.useRef)(false);
|
|
113
|
+
var isFocused = (0, _react.useRef)(false);
|
|
114
|
+
|
|
115
|
+
var _useTooltipState = (0, _useTooltipState2.useTooltipState)({
|
|
116
|
+
delay: delay
|
|
117
|
+
}),
|
|
118
|
+
close = _useTooltipState.close,
|
|
119
|
+
isOpen = _useTooltipState.isOpen,
|
|
120
|
+
open = _useTooltipState.open;
|
|
121
|
+
|
|
122
|
+
var _useClosestTitle = (0, _useClosestTitle2.useClosestTitle)({
|
|
123
|
+
onClick: (0, _react.useCallback)(function () {
|
|
124
|
+
isFocused.current = false;
|
|
125
|
+
isHovered.current = false;
|
|
126
|
+
}, []),
|
|
127
|
+
onHide: (0, _react.useCallback)(function () {
|
|
128
|
+
if (!isHovered.current && !isFocused.current) {
|
|
129
|
+
dispatch({
|
|
130
|
+
type: 'reset'
|
|
131
|
+
});
|
|
132
|
+
close();
|
|
133
|
+
}
|
|
134
|
+
}, []),
|
|
135
|
+
tooltipRef: tooltipRef
|
|
136
|
+
}),
|
|
137
|
+
getProps = _useClosestTitle.getProps,
|
|
138
|
+
onHide = _useClosestTitle.onHide,
|
|
139
|
+
target = _useClosestTitle.target,
|
|
140
|
+
titleNode = _useClosestTitle.titleNode;
|
|
141
|
+
|
|
142
|
+
(0, _useAlign.useAlign)({
|
|
143
|
+
align: align,
|
|
144
|
+
autoAlign: autoAlign,
|
|
145
|
+
floating: floating,
|
|
146
|
+
isOpen: isOpen,
|
|
147
|
+
onAlign: (0, _react.useCallback)(function (align) {
|
|
148
|
+
return dispatch({
|
|
149
|
+
align: align,
|
|
150
|
+
type: 'update'
|
|
151
|
+
});
|
|
152
|
+
}, []),
|
|
153
|
+
sourceElement: tooltipRef,
|
|
154
|
+
targetElement: titleNode
|
|
155
|
+
});
|
|
156
|
+
var onShow = (0, _react.useCallback)(function (event) {
|
|
157
|
+
if (isHovered.current || isFocused.current) {
|
|
158
|
+
var _props = getProps(event);
|
|
230
159
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
});
|
|
234
|
-
clearTimeout(timeoutIdRef.current);
|
|
235
|
-
restoreTitle();
|
|
160
|
+
if (_props) {
|
|
161
|
+
var _ref3;
|
|
236
162
|
|
|
237
|
-
if (targetRef.current) {
|
|
238
|
-
targetRef.current.removeEventListener('click', handleHide);
|
|
239
|
-
targetRef.current = null;
|
|
240
|
-
}
|
|
241
|
-
}, []);
|
|
242
|
-
var handleShow = (0, _react.useCallback)(function (event) {
|
|
243
|
-
var target = event.target;
|
|
244
|
-
var hasTitle = target && (target.hasAttribute('title') || target.hasAttribute('data-title'));
|
|
245
|
-
var titleNode = hasTitle ? target : closestAncestor(target, '[title], [data-title]');
|
|
246
|
-
|
|
247
|
-
if (titleNode) {
|
|
248
|
-
targetRef.current = target;
|
|
249
|
-
target.addEventListener('click', handleHide);
|
|
250
|
-
var title = titleNode.getAttribute('title') || titleNode.getAttribute('data-title') || '';
|
|
251
|
-
saveTitle(titleNode);
|
|
252
|
-
var customDelay = titleNode.getAttribute('data-tooltip-delay');
|
|
253
|
-
var newAlign = titleNode.getAttribute('data-tooltip-align');
|
|
254
|
-
|
|
255
|
-
var _setAsHTML = !!titleNode.getAttribute('data-title-set-as-html');
|
|
256
|
-
|
|
257
|
-
var isFloating = titleNode.getAttribute('data-tooltip-floating');
|
|
258
|
-
clearTimeout(timeoutIdRef.current);
|
|
259
|
-
timeoutIdRef.current = setTimeout(function () {
|
|
260
163
|
dispatch({
|
|
261
|
-
align:
|
|
262
|
-
floating:
|
|
263
|
-
message: title,
|
|
264
|
-
setAsHTML:
|
|
265
|
-
type: '
|
|
164
|
+
align: (_ref3 = _props.align) !== null && _ref3 !== void 0 ? _ref3 : align,
|
|
165
|
+
floating: _props.floating,
|
|
166
|
+
message: _props.title,
|
|
167
|
+
setAsHTML: _props.setAsHTML,
|
|
168
|
+
type: 'update'
|
|
266
169
|
});
|
|
267
|
-
|
|
170
|
+
open(isFocused.current, _props.delay ? Number(_props.delay) : undefined);
|
|
171
|
+
}
|
|
268
172
|
}
|
|
269
|
-
}, []);
|
|
173
|
+
}, [align]);
|
|
270
174
|
(0, _react.useEffect)(function () {
|
|
271
175
|
var handleEsc = function handleEsc(event) {
|
|
272
|
-
if (
|
|
176
|
+
if (isOpen && event.key === _shared.Keys.Esc) {
|
|
273
177
|
event.stopImmediatePropagation();
|
|
274
|
-
|
|
178
|
+
onHide();
|
|
275
179
|
}
|
|
276
180
|
};
|
|
277
181
|
|
|
@@ -279,81 +183,70 @@ var TooltipProvider = function TooltipProvider(_ref2) {
|
|
|
279
183
|
return function () {
|
|
280
184
|
return document.removeEventListener('keyup', handleEsc, true);
|
|
281
185
|
};
|
|
282
|
-
}, [
|
|
186
|
+
}, [isOpen]);
|
|
187
|
+
|
|
188
|
+
var onHoverStart = function onHoverStart(event) {
|
|
189
|
+
if (getInteraction() === 'pointer') {
|
|
190
|
+
isHovered.current = true;
|
|
191
|
+
} else {
|
|
192
|
+
isHovered.current = false;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
onShow(event);
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
var onHoverEnd = function onHoverEnd(event) {
|
|
199
|
+
isFocused.current = false;
|
|
200
|
+
isHovered.current = false;
|
|
201
|
+
onHide(event);
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
var onFocus = function onFocus(event) {
|
|
205
|
+
if (isFocusVisible()) {
|
|
206
|
+
isFocused.current = true;
|
|
207
|
+
onShow(event);
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
var onBlur = function onBlur(event) {
|
|
212
|
+
isFocused.current = false;
|
|
213
|
+
isHovered.current = false;
|
|
214
|
+
onHide(event);
|
|
215
|
+
};
|
|
216
|
+
|
|
283
217
|
(0, _react.useEffect)(function () {
|
|
284
218
|
if (scope) {
|
|
285
219
|
var disposeShowEvents = TRIGGER_SHOW_EVENTS.map(function (eventName) {
|
|
286
|
-
return (0, _shared.delegate)(document.body, eventName, scope,
|
|
220
|
+
return (0, _shared.delegate)(document.body, eventName, scope, onHoverStart);
|
|
287
221
|
});
|
|
288
222
|
var disposeHideEvents = TRIGGER_HIDE_EVENTS.map(function (eventName) {
|
|
289
|
-
return (0, _shared.delegate)(document.body, eventName, "".concat(scope, ", .tooltip"),
|
|
223
|
+
return (0, _shared.delegate)(document.body, eventName, "".concat(scope, ", .tooltip"), onHoverEnd);
|
|
290
224
|
});
|
|
225
|
+
var disposeShowFocus = (0, _shared.delegate)(document.body, 'focus', "".concat(scope, ", .tooltip"), onFocus, true);
|
|
226
|
+
var disposeCloseBlur = (0, _shared.delegate)(document.body, 'blur', "".concat(scope, ", .tooltip"), onBlur, true);
|
|
291
227
|
return function () {
|
|
292
|
-
disposeShowEvents.forEach(function (
|
|
293
|
-
var dispose =
|
|
228
|
+
disposeShowEvents.forEach(function (_ref4) {
|
|
229
|
+
var dispose = _ref4.dispose;
|
|
294
230
|
return dispose();
|
|
295
231
|
});
|
|
296
|
-
disposeHideEvents.forEach(function (
|
|
297
|
-
var dispose =
|
|
232
|
+
disposeHideEvents.forEach(function (_ref5) {
|
|
233
|
+
var dispose = _ref5.dispose;
|
|
298
234
|
return dispose();
|
|
299
235
|
});
|
|
236
|
+
disposeShowFocus.dispose();
|
|
237
|
+
disposeCloseBlur.dispose();
|
|
300
238
|
};
|
|
301
239
|
}
|
|
302
|
-
}, [
|
|
303
|
-
(0, _react.useEffect)(function () {
|
|
304
|
-
if (tooltipRef.current && show && floating) {
|
|
305
|
-
var points = ALIGNMENTS_MAP[align || 'top'];
|
|
306
|
-
|
|
307
|
-
var _mousePosition = _slicedToArray(mousePosition, 2),
|
|
308
|
-
clientX = _mousePosition[0],
|
|
309
|
-
clientY = _mousePosition[1];
|
|
310
|
-
|
|
311
|
-
(0, _domAlign.alignPoint)(tooltipRef.current, {
|
|
312
|
-
clientX: clientX,
|
|
313
|
-
clientY: clientY
|
|
314
|
-
}, {
|
|
315
|
-
offset: OFFSET_MAP[points.join('')],
|
|
316
|
-
points: points
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
}, [show, floating]);
|
|
320
|
-
(0, _react.useEffect)(function () {
|
|
321
|
-
if (titleNodeRef.current && tooltipRef.current && !floating) {
|
|
322
|
-
var points = ALIGNMENTS_MAP[align || 'top'];
|
|
323
|
-
var alignment = (0, _shared.doAlign)({
|
|
324
|
-
overflow: {
|
|
325
|
-
adjustX: autoAlign,
|
|
326
|
-
adjustY: autoAlign
|
|
327
|
-
},
|
|
328
|
-
points: points,
|
|
329
|
-
sourceElement: tooltipRef.current,
|
|
330
|
-
targetElement: titleNodeRef.current
|
|
331
|
-
});
|
|
332
|
-
var alignmentString = alignment.points.join('');
|
|
333
|
-
var pointsString = points.join('');
|
|
334
|
-
|
|
335
|
-
if (alignment.overflow.adjustX) {
|
|
336
|
-
dispatch({
|
|
337
|
-
align: ALIGNMENTS_FORCE_MAP[alignmentString],
|
|
338
|
-
type: 'align'
|
|
339
|
-
});
|
|
340
|
-
} else if (pointsString !== alignmentString) {
|
|
341
|
-
dispatch({
|
|
342
|
-
align: ALIGNMENTS_INVERSE_MAP[alignmentString],
|
|
343
|
-
type: 'align'
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}, [align, show]);
|
|
240
|
+
}, [onShow]);
|
|
348
241
|
"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;
|
|
349
242
|
"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;
|
|
350
243
|
"production" !== "production" ? (0, _warning.default)((children === null || children === void 0 ? void 0 : children.type) !== _react.default.Fragment, '<TooltipProvider />: React Fragment is not allowed as a child to TooltipProvider. Child must be a single HTML element that accepts `onMouseOver` and `onMouseOut`.') : void 0;
|
|
351
244
|
var titleContent = contentRenderer({
|
|
352
|
-
targetNode:
|
|
245
|
+
targetNode: target.current,
|
|
353
246
|
title: message
|
|
354
247
|
});
|
|
355
248
|
|
|
356
|
-
var tooltip =
|
|
249
|
+
var tooltip = isOpen && /*#__PURE__*/_react.default.createElement(_shared.ClayPortal, containerProps, /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
|
|
357
250
|
alignPosition: align,
|
|
358
251
|
ref: tooltipRef,
|
|
359
252
|
show: true
|
|
@@ -365,8 +258,10 @@ var TooltipProvider = function TooltipProvider(_ref2) {
|
|
|
365
258
|
|
|
366
259
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, scope ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, tooltip, children) : children && /*#__PURE__*/_react.default.cloneElement(children, _objectSpread(_objectSpread({}, children.props), {}, {
|
|
367
260
|
children: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children.props.children, tooltip),
|
|
368
|
-
|
|
369
|
-
|
|
261
|
+
onBlur: onBlur,
|
|
262
|
+
onFocus: onFocus,
|
|
263
|
+
onMouseOut: onHoverEnd,
|
|
264
|
+
onMouseOver: onHoverStart
|
|
370
265
|
})));
|
|
371
266
|
};
|
|
372
267
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPDX-FileCopyrightText: © 2019 Liferay, Inc. <https://liferay.com>
|
|
3
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
declare const ALIGNMENTS: readonly ["top", "top-right", "right", "bottom-right", "bottom", "bottom-left", "left", "top-left"];
|
|
7
|
+
export declare type Align = typeof ALIGNMENTS[number];
|
|
8
|
+
declare type Props = {
|
|
9
|
+
align: Align;
|
|
10
|
+
autoAlign: boolean;
|
|
11
|
+
floating: boolean;
|
|
12
|
+
isOpen: boolean;
|
|
13
|
+
onAlign: (align: Align) => void;
|
|
14
|
+
sourceElement: React.MutableRefObject<HTMLElement | null>;
|
|
15
|
+
targetElement: React.MutableRefObject<HTMLElement | null>;
|
|
16
|
+
};
|
|
17
|
+
export declare function useAlign({ align, autoAlign, floating, isOpen, onAlign, sourceElement, targetElement, }: Props): void;
|
|
18
|
+
export {};
|
package/lib/useAlign.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useAlign = useAlign;
|
|
7
|
+
|
|
8
|
+
var _shared = require("@clayui/shared");
|
|
9
|
+
|
|
10
|
+
var _domAlign = require("dom-align");
|
|
11
|
+
|
|
12
|
+
var _react = require("react");
|
|
13
|
+
|
|
14
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
15
|
+
|
|
16
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
17
|
+
|
|
18
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
19
|
+
|
|
20
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
21
|
+
|
|
22
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
23
|
+
|
|
24
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
25
|
+
|
|
26
|
+
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; }
|
|
27
|
+
|
|
28
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
29
|
+
|
|
30
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
31
|
+
|
|
32
|
+
var ALIGNMENTS = ['top', 'top-right', 'right', 'bottom-right', 'bottom', 'bottom-left', 'left', 'top-left'];
|
|
33
|
+
var ALIGNMENTS_MAP = {
|
|
34
|
+
bottom: ['tc', 'bc'],
|
|
35
|
+
'bottom-left': ['tl', 'bl'],
|
|
36
|
+
'bottom-right': ['tr', 'br'],
|
|
37
|
+
left: ['cr', 'cl'],
|
|
38
|
+
right: ['cl', 'cr'],
|
|
39
|
+
top: ['bc', 'tc'],
|
|
40
|
+
'top-left': ['bl', 'tl'],
|
|
41
|
+
'top-right': ['br', 'tr']
|
|
42
|
+
};
|
|
43
|
+
var ALIGNMENTS_INVERSE_MAP = {
|
|
44
|
+
bctc: 'top',
|
|
45
|
+
bltl: 'top-left',
|
|
46
|
+
brtr: 'top-right',
|
|
47
|
+
clcr: 'right',
|
|
48
|
+
crcl: 'left',
|
|
49
|
+
tcbc: 'bottom',
|
|
50
|
+
tlbl: 'bottom-left',
|
|
51
|
+
trbr: 'bottom-right'
|
|
52
|
+
};
|
|
53
|
+
var BOTTOM_OFFSET = [0, 7];
|
|
54
|
+
var LEFT_OFFSET = [-7, 0];
|
|
55
|
+
var RIGHT_OFFSET = [7, 0];
|
|
56
|
+
var TOP_OFFSET = [0, -7];
|
|
57
|
+
var OFFSET_MAP = {
|
|
58
|
+
bctc: TOP_OFFSET,
|
|
59
|
+
bltl: TOP_OFFSET,
|
|
60
|
+
brtr: TOP_OFFSET,
|
|
61
|
+
clcr: RIGHT_OFFSET,
|
|
62
|
+
crcl: LEFT_OFFSET,
|
|
63
|
+
tcbc: BOTTOM_OFFSET,
|
|
64
|
+
tlbl: BOTTOM_OFFSET,
|
|
65
|
+
trbr: BOTTOM_OFFSET
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
var ALIGNMENTS_FORCE_MAP = _objectSpread(_objectSpread({}, ALIGNMENTS_INVERSE_MAP), {}, {
|
|
69
|
+
bctc: 'top-left',
|
|
70
|
+
tcbc: 'bottom-left'
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
function useAlign(_ref) {
|
|
74
|
+
var align = _ref.align,
|
|
75
|
+
autoAlign = _ref.autoAlign,
|
|
76
|
+
floating = _ref.floating,
|
|
77
|
+
isOpen = _ref.isOpen,
|
|
78
|
+
onAlign = _ref.onAlign,
|
|
79
|
+
sourceElement = _ref.sourceElement,
|
|
80
|
+
targetElement = _ref.targetElement;
|
|
81
|
+
var mousePosition = (0, _shared.useMousePosition)(20);
|
|
82
|
+
(0, _react.useEffect)(function () {
|
|
83
|
+
if (sourceElement.current && isOpen && floating) {
|
|
84
|
+
var points = ALIGNMENTS_MAP[align || 'top'];
|
|
85
|
+
|
|
86
|
+
var _mousePosition = _slicedToArray(mousePosition, 2),
|
|
87
|
+
clientX = _mousePosition[0],
|
|
88
|
+
clientY = _mousePosition[1];
|
|
89
|
+
|
|
90
|
+
(0, _domAlign.alignPoint)(sourceElement.current, {
|
|
91
|
+
clientX: clientX,
|
|
92
|
+
clientY: clientY
|
|
93
|
+
}, {
|
|
94
|
+
offset: OFFSET_MAP[points.join('')],
|
|
95
|
+
points: points
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}, [isOpen, floating]);
|
|
99
|
+
(0, _react.useEffect)(function () {
|
|
100
|
+
if (targetElement.current && sourceElement.current && !floating) {
|
|
101
|
+
var points = ALIGNMENTS_MAP[align || 'top'];
|
|
102
|
+
var alignment = (0, _shared.doAlign)({
|
|
103
|
+
overflow: {
|
|
104
|
+
adjustX: autoAlign,
|
|
105
|
+
adjustY: autoAlign
|
|
106
|
+
},
|
|
107
|
+
points: points,
|
|
108
|
+
sourceElement: sourceElement.current,
|
|
109
|
+
targetElement: targetElement.current
|
|
110
|
+
});
|
|
111
|
+
var alignmentString = alignment.points.join('');
|
|
112
|
+
var pointsString = points.join('');
|
|
113
|
+
|
|
114
|
+
if (alignment.overflow.adjustX) {
|
|
115
|
+
onAlign(ALIGNMENTS_FORCE_MAP[alignmentString]);
|
|
116
|
+
} else if (pointsString !== alignmentString) {
|
|
117
|
+
onAlign(ALIGNMENTS_INVERSE_MAP[alignmentString]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}, [align, isOpen]);
|
|
121
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPDX-FileCopyrightText: © 2019 Liferay, Inc. <https://liferay.com>
|
|
3
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
declare type Props = {
|
|
7
|
+
onHide: () => void;
|
|
8
|
+
onClick: () => void;
|
|
9
|
+
tooltipRef: React.MutableRefObject<HTMLElement | null>;
|
|
10
|
+
};
|
|
11
|
+
export declare function useClosestTitle(props: Props): {
|
|
12
|
+
getProps: (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
|
|
13
|
+
align: string | null;
|
|
14
|
+
delay: string | null;
|
|
15
|
+
floating: boolean;
|
|
16
|
+
setAsHTML: boolean;
|
|
17
|
+
title: string;
|
|
18
|
+
} | undefined;
|
|
19
|
+
onHide: (event?: any) => null | undefined;
|
|
20
|
+
target: React.MutableRefObject<HTMLElement | null>;
|
|
21
|
+
titleNode: React.MutableRefObject<HTMLElement | null>;
|
|
22
|
+
};
|
|
23
|
+
export {};
|