@ringcentral/spring-base 1.12.0 → 1.13.0
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/config.js +32 -12
- package/contexts.js +42 -24
- package/hooks.js +1630 -613
- package/index.js +15 -17
- package/liveAnnouncer.js +303 -1
- package/package.json +2 -2
- package/src/hooks/useButton/useButton.d.ts +1 -1
- package/typings.js +7 -0
- package/utils.js +835 -81
- package/chunks/index.js +0 -234
- package/chunks/twMerge.js +0 -503
package/chunks/twMerge.js
DELETED
|
@@ -1,503 +0,0 @@
|
|
|
1
|
-
import { unstable_ownerWindow } from '@mui/utils';
|
|
2
|
-
import { isValidElement } from 'react';
|
|
3
|
-
import isPlainObject from 'lodash/isPlainObject';
|
|
4
|
-
import { rcConfiguration } from '../config.js';
|
|
5
|
-
import { extendTailwindMerge } from 'tailwind-merge';
|
|
6
|
-
|
|
7
|
-
const ownerWindow = unstable_ownerWindow;
|
|
8
|
-
|
|
9
|
-
const ARIA_HIDDEN = 'aria-hidden';
|
|
10
|
-
const TOP_LAYER_ATTR = 'data-sui-top-layer';
|
|
11
|
-
const alwaysVisibleSelector = `[data-live-announcer="true"], [${TOP_LAYER_ATTR}]`;
|
|
12
|
-
const ARIA_HIDDEN_REF_COUNT_MAP = '__SUI_ARIA_HIDE_OUTSIDE_REF_COUNT_MAP__';
|
|
13
|
-
const INERT_REF_COUNT_MAP = '__SUI_ARIA_HIDE_OUTSIDE_INERT_REF_COUNT_MAP__';
|
|
14
|
-
const getRefCountMap = (window, mechanism) => {
|
|
15
|
-
const key = mechanism === 'inert' ? INERT_REF_COUNT_MAP : ARIA_HIDDEN_REF_COUNT_MAP;
|
|
16
|
-
if (!window[key]) {
|
|
17
|
-
window[key] = new WeakMap();
|
|
18
|
-
}
|
|
19
|
-
return window[key];
|
|
20
|
-
};
|
|
21
|
-
const OBSERVER_STACK = '__SUI_ARIA_HIDE_OUTSIDE_OBSERVER_STACK__';
|
|
22
|
-
const getObserverStack = (window) => {
|
|
23
|
-
if (!window[OBSERVER_STACK]) {
|
|
24
|
-
window[OBSERVER_STACK] = [];
|
|
25
|
-
}
|
|
26
|
-
return window[OBSERVER_STACK];
|
|
27
|
-
};
|
|
28
|
-
const isElement = (node) => {
|
|
29
|
-
return (typeof node === 'object' &&
|
|
30
|
-
node != null &&
|
|
31
|
-
'nodeType' in node &&
|
|
32
|
-
node.nodeType === 1);
|
|
33
|
-
};
|
|
34
|
-
const isAlwaysVisibleNode = (node) => {
|
|
35
|
-
return (node.getAttribute('data-live-announcer') === 'true' ||
|
|
36
|
-
node.hasAttribute(TOP_LAYER_ATTR));
|
|
37
|
-
};
|
|
38
|
-
const createAriaHideOutsideController = (targets, options = {}) => {
|
|
39
|
-
const isLegacyRoot = isElement(options);
|
|
40
|
-
const configuredRoot = isLegacyRoot
|
|
41
|
-
? options
|
|
42
|
-
: options.root;
|
|
43
|
-
const currentWindow = ownerWindow(configuredRoot ?? targets[0]);
|
|
44
|
-
if (!currentWindow) {
|
|
45
|
-
return {
|
|
46
|
-
addTarget: () => { },
|
|
47
|
-
removeTarget: () => { },
|
|
48
|
-
dispose: () => { },
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
const root = configuredRoot ?? currentWindow.document.body;
|
|
52
|
-
const shouldUseInert = !isLegacyRoot &&
|
|
53
|
-
options.shouldUseInert &&
|
|
54
|
-
'inert' in currentWindow.HTMLElement.prototype;
|
|
55
|
-
const visibleNodes = new Set(targets);
|
|
56
|
-
const targetNodes = new Set(targets);
|
|
57
|
-
const automaticVisibleNodes = new Set();
|
|
58
|
-
const hiddenNodes = new Set();
|
|
59
|
-
const targetPaths = new Map();
|
|
60
|
-
const getTargetPath = (target) => {
|
|
61
|
-
const path = [];
|
|
62
|
-
let node = target;
|
|
63
|
-
while (node && root.contains(node)) {
|
|
64
|
-
path.push(node);
|
|
65
|
-
if (node === root) {
|
|
66
|
-
break;
|
|
67
|
-
}
|
|
68
|
-
node = node.parentElement;
|
|
69
|
-
}
|
|
70
|
-
return path;
|
|
71
|
-
};
|
|
72
|
-
for (const target of targets) {
|
|
73
|
-
targetPaths.set(target, getTargetPath(target));
|
|
74
|
-
}
|
|
75
|
-
const observerStack = getObserverStack(currentWindow);
|
|
76
|
-
const getHideMechanism = (node) => shouldUseInert && node instanceof currentWindow.HTMLElement
|
|
77
|
-
? 'inert'
|
|
78
|
-
: 'aria-hidden';
|
|
79
|
-
const getHidden = (node, mechanism) => mechanism === 'inert'
|
|
80
|
-
? node.inert
|
|
81
|
-
: node.getAttribute(ARIA_HIDDEN) === 'true';
|
|
82
|
-
const setHidden = (node, mechanism, hidden) => {
|
|
83
|
-
if (mechanism === 'inert') {
|
|
84
|
-
node.inert = hidden;
|
|
85
|
-
}
|
|
86
|
-
else if (hidden) {
|
|
87
|
-
node.setAttribute(ARIA_HIDDEN, 'true');
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
node.removeAttribute(ARIA_HIDDEN);
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
const restoreHiddenNode = (node) => {
|
|
94
|
-
if (!hiddenNodes.delete(node)) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
const mechanism = getHideMechanism(node);
|
|
98
|
-
const refCountMap = getRefCountMap(currentWindow, mechanism);
|
|
99
|
-
const count = refCountMap.get(node);
|
|
100
|
-
if (typeof count !== 'number') {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
if (count === 1) {
|
|
104
|
-
setHidden(node, mechanism, false);
|
|
105
|
-
refCountMap.delete(node);
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
refCountMap.set(node, count - 1);
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
const hide = (node) => {
|
|
112
|
-
if (hiddenNodes.has(node)) {
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
const mechanism = getHideMechanism(node);
|
|
116
|
-
const refCountMap = getRefCountMap(currentWindow, mechanism);
|
|
117
|
-
const refCount = refCountMap.get(node) ?? 0;
|
|
118
|
-
if (getHidden(node, mechanism) && refCount === 0) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
if (refCount === 0) {
|
|
122
|
-
setHidden(node, mechanism, true);
|
|
123
|
-
}
|
|
124
|
-
hiddenNodes.add(node);
|
|
125
|
-
refCountMap.set(node, refCount + 1);
|
|
126
|
-
};
|
|
127
|
-
const addAlwaysVisibleNode = (node) => {
|
|
128
|
-
automaticVisibleNodes.add(node);
|
|
129
|
-
visibleNodes.add(node);
|
|
130
|
-
};
|
|
131
|
-
const addAlwaysVisibleNodes = (node) => {
|
|
132
|
-
if (isAlwaysVisibleNode(node)) {
|
|
133
|
-
addAlwaysVisibleNode(node);
|
|
134
|
-
}
|
|
135
|
-
for (const alwaysVisibleNode of node.querySelectorAll(alwaysVisibleSelector)) {
|
|
136
|
-
addAlwaysVisibleNode(alwaysVisibleNode);
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
const removeDisconnectedAlwaysVisibleNodes = (node) => {
|
|
140
|
-
for (const alwaysVisibleNode of automaticVisibleNodes) {
|
|
141
|
-
if (!node.contains(alwaysVisibleNode) ||
|
|
142
|
-
root.contains(alwaysVisibleNode)) {
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
automaticVisibleNodes.delete(alwaysVisibleNode);
|
|
146
|
-
if (!targetNodes.has(alwaysVisibleNode)) {
|
|
147
|
-
visibleNodes.delete(alwaysVisibleNode);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
};
|
|
151
|
-
const containsNode = (nodes, node) => {
|
|
152
|
-
for (const candidate of nodes) {
|
|
153
|
-
if (candidate.contains(node)) {
|
|
154
|
-
return true;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
return false;
|
|
158
|
-
};
|
|
159
|
-
const containsVisibleNode = (node, nodes) => {
|
|
160
|
-
for (const visibleNode of nodes) {
|
|
161
|
-
if (node.contains(visibleNode)) {
|
|
162
|
-
return true;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return false;
|
|
166
|
-
};
|
|
167
|
-
const isCoveredByHiddenNode = (node) => {
|
|
168
|
-
let ancestor = node.parentElement;
|
|
169
|
-
while (ancestor && root.contains(ancestor)) {
|
|
170
|
-
if (hiddenNodes.has(ancestor)) {
|
|
171
|
-
return !(ancestor === node.parentElement &&
|
|
172
|
-
ancestor.getAttribute('role') === 'row');
|
|
173
|
-
}
|
|
174
|
-
ancestor = ancestor.parentElement;
|
|
175
|
-
}
|
|
176
|
-
return false;
|
|
177
|
-
};
|
|
178
|
-
const shouldAdoptHiddenNode = (node) => {
|
|
179
|
-
return (root.contains(node) &&
|
|
180
|
-
!hiddenNodes.has(node) &&
|
|
181
|
-
!containsNode(visibleNodes, node) &&
|
|
182
|
-
!containsVisibleNode(node, visibleNodes) &&
|
|
183
|
-
!isCoveredByHiddenNode(node));
|
|
184
|
-
};
|
|
185
|
-
const acceptNode = (node) => {
|
|
186
|
-
if (visibleNodes.has(node) ||
|
|
187
|
-
(node.parentElement &&
|
|
188
|
-
hiddenNodes.has(node.parentElement) &&
|
|
189
|
-
node.parentElement.getAttribute('role') !== 'row')) {
|
|
190
|
-
return currentWindow.NodeFilter.FILTER_REJECT;
|
|
191
|
-
}
|
|
192
|
-
if (containsVisibleNode(node, visibleNodes)) {
|
|
193
|
-
return currentWindow.NodeFilter.FILTER_SKIP;
|
|
194
|
-
}
|
|
195
|
-
return currentWindow.NodeFilter.FILTER_ACCEPT;
|
|
196
|
-
};
|
|
197
|
-
const walk = (walkRoot, includeRoot) => {
|
|
198
|
-
addAlwaysVisibleNodes(walkRoot);
|
|
199
|
-
const rootFilter = acceptNode(walkRoot);
|
|
200
|
-
if (includeRoot && rootFilter === currentWindow.NodeFilter.FILTER_ACCEPT) {
|
|
201
|
-
hide(walkRoot);
|
|
202
|
-
}
|
|
203
|
-
if (rootFilter === currentWindow.NodeFilter.FILTER_REJECT) {
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
const walker = currentWindow.document.createTreeWalker(walkRoot, currentWindow.NodeFilter.SHOW_ELEMENT, { acceptNode });
|
|
207
|
-
let node = walker.nextNode();
|
|
208
|
-
while (node != null) {
|
|
209
|
-
hide(node);
|
|
210
|
-
node = walker.nextNode();
|
|
211
|
-
}
|
|
212
|
-
};
|
|
213
|
-
const addTarget = (target) => {
|
|
214
|
-
if (!root.contains(target)) {
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
targetNodes.add(target);
|
|
218
|
-
visibleNodes.add(target);
|
|
219
|
-
const path = getTargetPath(target);
|
|
220
|
-
const restoredAncestorIndexes = [];
|
|
221
|
-
for (let index = 0; index < path.length; index++) {
|
|
222
|
-
if (index > 0 && hiddenNodes.has(path[index])) {
|
|
223
|
-
restoredAncestorIndexes.push(index);
|
|
224
|
-
}
|
|
225
|
-
restoreHiddenNode(path[index]);
|
|
226
|
-
}
|
|
227
|
-
targetPaths.set(target, path);
|
|
228
|
-
for (const index of restoredAncestorIndexes) {
|
|
229
|
-
const ancestor = path[index];
|
|
230
|
-
const pathChild = path[index - 1];
|
|
231
|
-
for (const child of ancestor.children) {
|
|
232
|
-
if (child !== pathChild) {
|
|
233
|
-
walk(child, true);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
};
|
|
238
|
-
const removeTarget = (target) => {
|
|
239
|
-
if (!targetNodes.delete(target)) {
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
if (!automaticVisibleNodes.has(target)) {
|
|
243
|
-
visibleNodes.delete(target);
|
|
244
|
-
}
|
|
245
|
-
const targetPath = targetPaths.get(target);
|
|
246
|
-
targetPaths.delete(target);
|
|
247
|
-
const connectedAncestor = targetPath?.find((node) => root.contains(node));
|
|
248
|
-
if (!connectedAncestor) {
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
let walkRoot = connectedAncestor;
|
|
252
|
-
while (walkRoot.parentElement &&
|
|
253
|
-
walkRoot.parentElement !== root &&
|
|
254
|
-
!containsVisibleNode(walkRoot.parentElement, visibleNodes)) {
|
|
255
|
-
walkRoot = walkRoot.parentElement;
|
|
256
|
-
}
|
|
257
|
-
walk(walkRoot, true);
|
|
258
|
-
};
|
|
259
|
-
if (observerStack.length) {
|
|
260
|
-
observerStack[observerStack.length - 1].disconnect();
|
|
261
|
-
}
|
|
262
|
-
walk(root, false);
|
|
263
|
-
const processChanges = (changes) => {
|
|
264
|
-
for (const change of changes) {
|
|
265
|
-
if (change.type !== 'childList') {
|
|
266
|
-
continue;
|
|
267
|
-
}
|
|
268
|
-
for (const node of change.removedNodes) {
|
|
269
|
-
if (isElement(node)) {
|
|
270
|
-
removeDisconnectedAlwaysVisibleNodes(node);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
if (!change.target.isConnected || change.addedNodes.length === 0) {
|
|
274
|
-
continue;
|
|
275
|
-
}
|
|
276
|
-
if (!containsNode(visibleNodes, change.target) &&
|
|
277
|
-
!containsNode(hiddenNodes, change.target)) {
|
|
278
|
-
for (const node of change.addedNodes) {
|
|
279
|
-
if (isElement(node) && root.contains(node)) {
|
|
280
|
-
walk(node, true);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
};
|
|
286
|
-
const observer = new currentWindow.MutationObserver(processChanges);
|
|
287
|
-
observer.observe(root, { childList: true, subtree: true });
|
|
288
|
-
const observerWrapper = {
|
|
289
|
-
observe() {
|
|
290
|
-
observer.observe(root, { childList: true, subtree: true });
|
|
291
|
-
},
|
|
292
|
-
resume(releasedHiddenNodes, releasedAlwaysVisibleNodes) {
|
|
293
|
-
for (const node of releasedAlwaysVisibleNodes) {
|
|
294
|
-
if (root.contains(node)) {
|
|
295
|
-
addAlwaysVisibleNode(node);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
for (const node of releasedHiddenNodes) {
|
|
299
|
-
if (shouldAdoptHiddenNode(node)) {
|
|
300
|
-
hide(node);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
observerWrapper.observe();
|
|
304
|
-
},
|
|
305
|
-
disconnect() {
|
|
306
|
-
observer.disconnect();
|
|
307
|
-
},
|
|
308
|
-
};
|
|
309
|
-
observerStack.push(observerWrapper);
|
|
310
|
-
let isCleanedUp = false;
|
|
311
|
-
const dispose = () => {
|
|
312
|
-
if (isCleanedUp) {
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
isCleanedUp = true;
|
|
316
|
-
const pendingChanges = observer.takeRecords();
|
|
317
|
-
observer.disconnect();
|
|
318
|
-
processChanges(pendingChanges);
|
|
319
|
-
if (observerWrapper === observerStack[observerStack.length - 1]) {
|
|
320
|
-
observerStack.pop();
|
|
321
|
-
const previousObserver = observerStack[observerStack.length - 1];
|
|
322
|
-
if (previousObserver?.resume) {
|
|
323
|
-
previousObserver.resume(hiddenNodes, automaticVisibleNodes);
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
previousObserver?.observe();
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
else {
|
|
330
|
-
observerStack.splice(observerStack.indexOf(observerWrapper), 1);
|
|
331
|
-
}
|
|
332
|
-
for (const node of [...hiddenNodes]) {
|
|
333
|
-
restoreHiddenNode(node);
|
|
334
|
-
}
|
|
335
|
-
targetPaths.clear();
|
|
336
|
-
targetNodes.clear();
|
|
337
|
-
automaticVisibleNodes.clear();
|
|
338
|
-
};
|
|
339
|
-
return {
|
|
340
|
-
addTarget: (target) => {
|
|
341
|
-
if (!isCleanedUp) {
|
|
342
|
-
addTarget(target);
|
|
343
|
-
}
|
|
344
|
-
},
|
|
345
|
-
removeTarget: (target) => {
|
|
346
|
-
if (!isCleanedUp) {
|
|
347
|
-
removeTarget(target);
|
|
348
|
-
}
|
|
349
|
-
},
|
|
350
|
-
dispose,
|
|
351
|
-
};
|
|
352
|
-
};
|
|
353
|
-
const ariaHideOutside = (targets, options = {}) => createAriaHideOutsideController(targets, options).dispose;
|
|
354
|
-
|
|
355
|
-
const combineProps = (baseProps, newProps, coverPropKeys) => innerCombineProps({
|
|
356
|
-
baseProps,
|
|
357
|
-
newProps,
|
|
358
|
-
coverPropKeys,
|
|
359
|
-
});
|
|
360
|
-
const combineClasses = (baseClasses, newClasses) => innerCombineProps({
|
|
361
|
-
baseProps: baseClasses,
|
|
362
|
-
newProps: newClasses,
|
|
363
|
-
combineAllString: true,
|
|
364
|
-
});
|
|
365
|
-
const innerCombineProps = (params) => {
|
|
366
|
-
const { baseProps, newProps } = params;
|
|
367
|
-
if (!newProps || Object.keys(newProps).length === 0) {
|
|
368
|
-
return baseProps;
|
|
369
|
-
}
|
|
370
|
-
const outputProps = mergeChildProps(params);
|
|
371
|
-
return {
|
|
372
|
-
...newProps,
|
|
373
|
-
...outputProps,
|
|
374
|
-
};
|
|
375
|
-
};
|
|
376
|
-
function mergeChildProps({ baseProps, newProps, combineAllString, coverPropKeys, }) {
|
|
377
|
-
const result = Object.keys(baseProps || {}).reduce((output, curr) => {
|
|
378
|
-
const prop = baseProps[curr];
|
|
379
|
-
const propTo = newProps[curr];
|
|
380
|
-
if (propTo !== undefined) {
|
|
381
|
-
switch (typeof prop) {
|
|
382
|
-
case 'undefined':
|
|
383
|
-
output[curr] = propTo;
|
|
384
|
-
break;
|
|
385
|
-
case 'object': {
|
|
386
|
-
if (!isValidElement(propTo) &&
|
|
387
|
-
!isValidElement(prop) &&
|
|
388
|
-
isPlainObject(propTo) &&
|
|
389
|
-
isPlainObject(prop)) {
|
|
390
|
-
output[curr] = mergeChildProps({
|
|
391
|
-
baseProps: prop,
|
|
392
|
-
newProps: propTo || {},
|
|
393
|
-
combineAllString: combineAllString || curr === 'classes',
|
|
394
|
-
});
|
|
395
|
-
}
|
|
396
|
-
else {
|
|
397
|
-
output[curr] = propTo;
|
|
398
|
-
}
|
|
399
|
-
break;
|
|
400
|
-
}
|
|
401
|
-
case 'string':
|
|
402
|
-
if (combineAllString || curr === 'className') {
|
|
403
|
-
output[curr] = [prop, propTo]
|
|
404
|
-
.filter((x) => typeof x === 'string' && x)
|
|
405
|
-
.join(' ');
|
|
406
|
-
}
|
|
407
|
-
else {
|
|
408
|
-
output[curr] = propTo;
|
|
409
|
-
}
|
|
410
|
-
break;
|
|
411
|
-
case 'boolean':
|
|
412
|
-
case 'symbol':
|
|
413
|
-
case 'bigint':
|
|
414
|
-
case 'number':
|
|
415
|
-
output[curr] = propTo;
|
|
416
|
-
break;
|
|
417
|
-
case 'function':
|
|
418
|
-
if (coverPropKeys && coverPropKeys.includes(curr) && propTo) {
|
|
419
|
-
output[curr] = propTo;
|
|
420
|
-
}
|
|
421
|
-
else {
|
|
422
|
-
output[curr] = (...args) => {
|
|
423
|
-
propTo?.(...args);
|
|
424
|
-
prop?.(...args);
|
|
425
|
-
};
|
|
426
|
-
}
|
|
427
|
-
break;
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
else {
|
|
431
|
-
output[curr] = prop;
|
|
432
|
-
}
|
|
433
|
-
return output;
|
|
434
|
-
}, {});
|
|
435
|
-
if (Object.keys(result).length === 0) {
|
|
436
|
-
return undefined;
|
|
437
|
-
}
|
|
438
|
-
return {
|
|
439
|
-
...newProps,
|
|
440
|
-
...result,
|
|
441
|
-
};
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
function logInDev({ scope, message, level = 'warn', condition = true, }) {
|
|
445
|
-
if (process.env.NODE_ENV !== 'production' &&
|
|
446
|
-
condition &&
|
|
447
|
-
!rcConfiguration.WARNING_IGNORE) {
|
|
448
|
-
const log = `SPRING [${scope}]: ${message}`;
|
|
449
|
-
if (process.env.NODE_ENV === 'test' && level === 'error') {
|
|
450
|
-
throw Error(log);
|
|
451
|
-
}
|
|
452
|
-
console[level](log);
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
const isRef = (obj) => {
|
|
457
|
-
return obj && 'current' in obj;
|
|
458
|
-
};
|
|
459
|
-
|
|
460
|
-
const getRefElement = (ref) => {
|
|
461
|
-
if (typeof ref === 'function') {
|
|
462
|
-
return ref();
|
|
463
|
-
}
|
|
464
|
-
if (typeof ref === 'object' && isRef(ref)) {
|
|
465
|
-
return ref.current;
|
|
466
|
-
}
|
|
467
|
-
return ref;
|
|
468
|
-
};
|
|
469
|
-
|
|
470
|
-
const twMerge = extendTailwindMerge({
|
|
471
|
-
extend: {
|
|
472
|
-
classGroups: {
|
|
473
|
-
typography: [
|
|
474
|
-
{
|
|
475
|
-
typography: [() => true],
|
|
476
|
-
},
|
|
477
|
-
],
|
|
478
|
-
'focus-ring-rounded': [
|
|
479
|
-
'focus-ring-rounded',
|
|
480
|
-
{
|
|
481
|
-
'focus-ring-rounded': [() => true],
|
|
482
|
-
},
|
|
483
|
-
],
|
|
484
|
-
'focus-ring-border': [
|
|
485
|
-
'focus-ring-border',
|
|
486
|
-
{
|
|
487
|
-
'focus-ring-border': [() => true],
|
|
488
|
-
},
|
|
489
|
-
],
|
|
490
|
-
'focus-ring-border-recoup': [
|
|
491
|
-
'focus-ring-border-recoup',
|
|
492
|
-
'no-focus-ring-border-recoup',
|
|
493
|
-
],
|
|
494
|
-
'focus-ring': [
|
|
495
|
-
{
|
|
496
|
-
'focus-ring': [() => true],
|
|
497
|
-
},
|
|
498
|
-
],
|
|
499
|
-
},
|
|
500
|
-
},
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
export { ariaHideOutside as a, combineClasses as b, combineProps as c, createAriaHideOutsideController as d, getRefElement as g, isRef as i, logInDev as l, ownerWindow as o, twMerge as t };
|