@fluentui/react-utilities 9.5.3 → 9.6.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/CHANGELOG.json +24 -1
- package/CHANGELOG.md +15 -2
- package/dist/index.d.ts +25 -0
- package/lib/events/index.js +2 -0
- package/lib/events/index.js.map +1 -0
- package/lib/events/mouseTouchHelpers.js +38 -0
- package/lib/events/mouseTouchHelpers.js.map +1 -0
- package/lib/hooks/useOnClickOutside.js +20 -14
- package/lib/hooks/useOnClickOutside.js.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib-amd/events/index.js +6 -0
- package/lib-amd/events/index.js.map +1 -0
- package/lib-amd/events/mouseTouchHelpers.js +39 -0
- package/lib-amd/events/mouseTouchHelpers.js.map +1 -0
- package/lib-amd/hooks/useOnClickOutside.js +13 -15
- package/lib-amd/hooks/useOnClickOutside.js.map +1 -1
- package/lib-amd/index.js +5 -2
- package/lib-amd/index.js.map +1 -1
- package/lib-commonjs/events/index.js +8 -0
- package/lib-commonjs/events/index.js.map +1 -0
- package/lib-commonjs/events/mouseTouchHelpers.js +47 -0
- package/lib-commonjs/events/mouseTouchHelpers.js.map +1 -0
- package/lib-commonjs/hooks/useOnClickOutside.js +20 -14
- package/lib-commonjs/hooks/useOnClickOutside.js.map +1 -1
- package/lib-commonjs/index.js +20 -1
- package/lib-commonjs/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.json
CHANGED
@@ -2,7 +2,30 @@
|
|
2
2
|
"name": "@fluentui/react-utilities",
|
3
3
|
"entries": [
|
4
4
|
{
|
5
|
-
"date": "
|
5
|
+
"date": "Wed, 15 Feb 2023 11:41:24 GMT",
|
6
|
+
"tag": "@fluentui/react-utilities_v9.6.0",
|
7
|
+
"version": "9.6.0",
|
8
|
+
"comments": {
|
9
|
+
"minor": [
|
10
|
+
{
|
11
|
+
"author": "jirivyhnalek@microsoft.com",
|
12
|
+
"package": "@fluentui/react-utilities",
|
13
|
+
"commit": "4e349194f193d7371de6040c7c69cf071b87be56",
|
14
|
+
"comment": "feat: Add event helpers to ease working with mouse and touch"
|
15
|
+
}
|
16
|
+
],
|
17
|
+
"patch": [
|
18
|
+
{
|
19
|
+
"author": "lingfangao@hotmail.com",
|
20
|
+
"package": "@fluentui/react-utilities",
|
21
|
+
"commit": "087d981aab96bef2e332a373069a19bc702a7ca2",
|
22
|
+
"comment": "fix(useOnClickOutside): iframe focus detection uses `contains`"
|
23
|
+
}
|
24
|
+
]
|
25
|
+
}
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"date": "Mon, 13 Feb 2023 23:43:13 GMT",
|
6
29
|
"tag": "@fluentui/react-utilities_v9.5.3",
|
7
30
|
"version": "9.5.3",
|
8
31
|
"comments": {
|
package/CHANGELOG.md
CHANGED
@@ -1,12 +1,25 @@
|
|
1
1
|
# Change Log - @fluentui/react-utilities
|
2
2
|
|
3
|
-
This log was last generated on
|
3
|
+
This log was last generated on Wed, 15 Feb 2023 11:41:24 GMT and should not be manually modified.
|
4
4
|
|
5
5
|
<!-- Start content -->
|
6
6
|
|
7
|
+
## [9.6.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-utilities_v9.6.0)
|
8
|
+
|
9
|
+
Wed, 15 Feb 2023 11:41:24 GMT
|
10
|
+
[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-utilities_v9.5.3..@fluentui/react-utilities_v9.6.0)
|
11
|
+
|
12
|
+
### Minor changes
|
13
|
+
|
14
|
+
- feat: Add event helpers to ease working with mouse and touch ([PR #26784](https://github.com/microsoft/fluentui/pull/26784) by jirivyhnalek@microsoft.com)
|
15
|
+
|
16
|
+
### Patches
|
17
|
+
|
18
|
+
- fix(useOnClickOutside): iframe focus detection uses `contains` ([PR #26845](https://github.com/microsoft/fluentui/pull/26845) by lingfangao@hotmail.com)
|
19
|
+
|
7
20
|
## [9.5.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-utilities_v9.5.3)
|
8
21
|
|
9
|
-
Mon, 13 Feb 2023 23:
|
22
|
+
Mon, 13 Feb 2023 23:43:13 GMT
|
10
23
|
[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-utilities_v9.5.2..@fluentui/react-utilities_v9.5.3)
|
11
24
|
|
12
25
|
### Patches
|
package/dist/index.d.ts
CHANGED
@@ -86,6 +86,15 @@ export declare type FluentTriggerComponent = {
|
|
86
86
|
*/
|
87
87
|
export declare type ForwardRefComponent<Props> = ObscureEventName extends keyof Props ? Required<Props>[ObscureEventName] extends React_2.PointerEventHandler<infer Element> ? React_2.ForwardRefExoticComponent<Props & React_2.RefAttributes<Element>> : never : never;
|
88
88
|
|
89
|
+
/**
|
90
|
+
* Returns an object with clientX, clientY for TouchOrMouseEvent.
|
91
|
+
* Returns zeros in case the event is not a mouse or a touch event.
|
92
|
+
*/
|
93
|
+
export declare function getEventClientCoords(event: TouchOrMouseEvent): {
|
94
|
+
clientX: number;
|
95
|
+
clientY: number;
|
96
|
+
};
|
97
|
+
|
89
98
|
/**
|
90
99
|
* Given an element tagname and user props, filters the props to only allowed props for the given
|
91
100
|
* element type.
|
@@ -211,6 +220,11 @@ export declare function isHTMLElement(element?: unknown): element is HTMLElement
|
|
211
220
|
*/
|
212
221
|
export declare function isInteractiveHTMLElement(element: unknown): boolean;
|
213
222
|
|
223
|
+
/**
|
224
|
+
* Returns true if event is a mouse event. Useful when sharing logic between touch and mouse interactions.
|
225
|
+
*/
|
226
|
+
export declare function isMouseEvent(event: TouchOrMouseEvent): event is MouseEvent | React_2.MouseEvent;
|
227
|
+
|
214
228
|
/**
|
215
229
|
* Guard method that validates if a shorthand is a slot
|
216
230
|
* can be used to extends properties provided by a slot
|
@@ -255,6 +269,11 @@ declare type IsSingleton<T extends string> = {
|
|
255
269
|
[K in T]: Exclude<T, K> extends never ? true : false;
|
256
270
|
}[T];
|
257
271
|
|
272
|
+
/**
|
273
|
+
* Returns true if event is a touch event. Useful when sharing logic between touch and mouse interactions.
|
274
|
+
*/
|
275
|
+
export declare function isTouchEvent(event: TouchOrMouseEvent): event is TouchEvent | React_2.TouchEvent;
|
276
|
+
|
258
277
|
/**
|
259
278
|
* @internal
|
260
279
|
* Combine two event callbacks into a single callback function that calls each one in order.
|
@@ -280,6 +299,8 @@ declare type IsSingleton<T extends string> = {
|
|
280
299
|
*/
|
281
300
|
export declare function mergeCallbacks<Args extends unknown[]>(callback1: ((...args: Args) => void) | undefined, callback2: ((...args: Args) => void) | undefined): (...args: Args) => void;
|
282
301
|
|
302
|
+
export declare type NativeTouchOrMouseEvent = MouseEvent | TouchEvent;
|
303
|
+
|
283
304
|
declare type ObjectSlotProps<S extends SlotPropsRecord> = {
|
284
305
|
[K in keyof S]-?: ExtractSlotProps<S[K]> extends AsIntrinsicElement<infer As> ? UnionToIntersection<JSX.IntrinsicElements[As]> : ExtractSlotProps<S[K]> extends React_2.ComponentType<infer P> ? P : never;
|
285
306
|
};
|
@@ -307,6 +328,8 @@ declare type ObscureEventName = 'onLostPointerCaptureCapture';
|
|
307
328
|
*/
|
308
329
|
declare type PropsWithoutRef<P> = 'ref' extends keyof P ? (P extends unknown ? Omit<P, 'ref'> : P) : P;
|
309
330
|
|
331
|
+
export declare type ReactTouchOrMouseEvent = React_2.MouseEvent | React_2.TouchEvent;
|
332
|
+
|
310
333
|
/**
|
311
334
|
* A Ref function which can be treated like a ref object in that it has an attached
|
312
335
|
* current property, which will be updated as the ref is evaluated.
|
@@ -407,6 +430,8 @@ export declare const SSRProvider: React_2.FC<{
|
|
407
430
|
children: React_2.ReactNode;
|
408
431
|
}>;
|
409
432
|
|
433
|
+
export declare type TouchOrMouseEvent = NativeTouchOrMouseEvent | ReactTouchOrMouseEvent;
|
434
|
+
|
410
435
|
/**
|
411
436
|
* A trigger may have a children that could be either:
|
412
437
|
* 1. A single element
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC","sourcesContent":["export * from './mouseTouchHelpers';\n"]}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
/**
|
2
|
+
* Returns true if event is a touch event. Useful when sharing logic between touch and mouse interactions.
|
3
|
+
*/
|
4
|
+
export function isTouchEvent(event) {
|
5
|
+
return event.type.startsWith('touch');
|
6
|
+
}
|
7
|
+
/**
|
8
|
+
* Returns true if event is a mouse event. Useful when sharing logic between touch and mouse interactions.
|
9
|
+
*/
|
10
|
+
export function isMouseEvent(event) {
|
11
|
+
return event.type.startsWith('mouse') || ['click', 'contextmenu', 'dblclick'].indexOf(event.type) > -1;
|
12
|
+
}
|
13
|
+
/**
|
14
|
+
* Returns an object with clientX, clientY for TouchOrMouseEvent.
|
15
|
+
* Returns zeros in case the event is not a mouse or a touch event.
|
16
|
+
*/
|
17
|
+
export function getEventClientCoords(event) {
|
18
|
+
if (isMouseEvent(event)) {
|
19
|
+
return {
|
20
|
+
clientX: event.clientX,
|
21
|
+
clientY: event.clientY
|
22
|
+
};
|
23
|
+
} else if (isTouchEvent(event)) {
|
24
|
+
return {
|
25
|
+
clientX: event.touches[0].clientX,
|
26
|
+
clientY: event.touches[0].clientY
|
27
|
+
};
|
28
|
+
} else {
|
29
|
+
if (process.env.NODE_ENV !== 'production') {
|
30
|
+
throw new Error('@fluentui/react-utilities]: Unable to get clientX. Unknown event type.');
|
31
|
+
}
|
32
|
+
return {
|
33
|
+
clientX: 0,
|
34
|
+
clientY: 0
|
35
|
+
};
|
36
|
+
}
|
37
|
+
}
|
38
|
+
//# sourceMappingURL=mouseTouchHelpers.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"mappings":"AAQA;;;AAGA,OAAM,SAAUA,YAAY,CAACC,KAAwB;EACnD,OAAOA,KAAK,CAACC,IAAI,CAACC,UAAU,CAAC,OAAO,CAAC;AACvC;AAEA;;;AAGA,OAAM,SAAUC,YAAY,CAACH,KAAwB;EACnD,OAAOA,KAAK,CAACC,IAAI,CAACC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,CAAC,CAACE,OAAO,CAACJ,KAAK,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxG;AAEA;;;;AAIA,OAAM,SAAUI,oBAAoB,CAACL,KAAwB;EAC3D,IAAIG,YAAY,CAACH,KAAK,CAAC,EAAE;IACvB,OAAO;MAAEM,OAAO,EAAEN,KAAK,CAACM,OAAO;MAAEC,OAAO,EAAEP,KAAK,CAACO;IAAO,CAAE;GAC1D,MAAM,IAAIR,YAAY,CAACC,KAAK,CAAC,EAAE;IAC9B,OAAO;MAAEM,OAAO,EAAEN,KAAK,CAACQ,OAAO,CAAC,CAAC,CAAC,CAACF,OAAO;MAAEC,OAAO,EAAEP,KAAK,CAACQ,OAAO,CAAC,CAAC,CAAC,CAACD;IAAO,CAAE;GAChF,MAAM;IACL,IAAIE,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC,MAAM,IAAIC,KAAK,CAAC,wEAAwE,CAAC;;IAE3F,OAAO;MAAEN,OAAO,EAAE,CAAC;MAAEC,OAAO,EAAE;IAAC,CAAE;;AAErC","names":["isTouchEvent","event","type","startsWith","isMouseEvent","indexOf","getEventClientCoords","clientX","clientY","touches","process","env","NODE_ENV","Error"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/events/mouseTouchHelpers.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type NativeTouchOrMouseEvent = MouseEvent | TouchEvent;\n\nexport type ReactTouchOrMouseEvent = React.MouseEvent | React.TouchEvent;\n\nexport type TouchOrMouseEvent = NativeTouchOrMouseEvent | ReactTouchOrMouseEvent;\n\n/**\n * Returns true if event is a touch event. Useful when sharing logic between touch and mouse interactions.\n */\nexport function isTouchEvent(event: TouchOrMouseEvent): event is TouchEvent | React.TouchEvent {\n return event.type.startsWith('touch');\n}\n\n/**\n * Returns true if event is a mouse event. Useful when sharing logic between touch and mouse interactions.\n */\nexport function isMouseEvent(event: TouchOrMouseEvent): event is MouseEvent | React.MouseEvent {\n return event.type.startsWith('mouse') || ['click', 'contextmenu', 'dblclick'].indexOf(event.type) > -1;\n}\n\n/**\n * Returns an object with clientX, clientY for TouchOrMouseEvent.\n * Returns zeros in case the event is not a mouse or a touch event.\n */\nexport function getEventClientCoords(event: TouchOrMouseEvent): { clientX: number; clientY: number } {\n if (isMouseEvent(event)) {\n return { clientX: event.clientX, clientY: event.clientY };\n } else if (isTouchEvent(event)) {\n return { clientX: event.touches[0].clientX, clientY: event.touches[0].clientY };\n } else {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error('@fluentui/react-utilities]: Unable to get clientX. Unknown event type.');\n }\n return { clientX: 0, clientY: 0 };\n }\n}\n"]}
|
@@ -13,7 +13,7 @@ export const useOnClickOutside = options => {
|
|
13
13
|
contains: containsProp
|
14
14
|
} = options;
|
15
15
|
const timeoutId = React.useRef(undefined);
|
16
|
-
useIFrameFocus(
|
16
|
+
useIFrameFocus(options);
|
17
17
|
const listener = useEventCallback(ev => {
|
18
18
|
const contains = containsProp || ((parent, child) => !!(parent === null || parent === void 0 ? void 0 : parent.contains(child)));
|
19
19
|
const isOutside = refs.every(ref => !contains(ref.current || null, ev.target));
|
@@ -75,31 +75,37 @@ const FUI_FRAME_EVENT = 'fuiframefocus';
|
|
75
75
|
*
|
76
76
|
* Polls the value of `document.activeElement`. If it is an iframe, then dispatch
|
77
77
|
* a custom DOM event. When the custom event is received call the provided callback
|
78
|
-
*
|
79
|
-
* @param enableFrameFocusDispatch - boolean flag to start dispatching events
|
80
|
-
* @param targetDocument - the document to dispatch events and set timeouts
|
81
|
-
* @param pollDuration - in milliseconds
|
82
78
|
*/
|
83
|
-
const useIFrameFocus =
|
79
|
+
const useIFrameFocus = options => {
|
80
|
+
const {
|
81
|
+
disabled,
|
82
|
+
element: targetDocument,
|
83
|
+
callback,
|
84
|
+
contains: containsProp = (parent, child) => !!(parent === null || parent === void 0 ? void 0 : parent.contains(child)),
|
85
|
+
pollDuration = 1000,
|
86
|
+
refs
|
87
|
+
} = options;
|
84
88
|
const timeoutRef = React.useRef();
|
85
89
|
const listener = useEventCallback(e => {
|
86
|
-
|
90
|
+
const contains = containsProp || ((parent, child) => !!(parent === null || parent === void 0 ? void 0 : parent.contains(child)));
|
91
|
+
const isOutside = refs.every(ref => !contains(ref.current || null, e.target));
|
92
|
+
if (isOutside && !disabled) {
|
87
93
|
callback(e);
|
88
94
|
}
|
89
95
|
});
|
90
96
|
// Adds listener to the custom iframe focus event
|
91
97
|
React.useEffect(() => {
|
92
|
-
if (
|
98
|
+
if (!disabled) {
|
93
99
|
targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.addEventListener(FUI_FRAME_EVENT, listener, true);
|
100
|
+
return () => {
|
101
|
+
targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.removeEventListener(FUI_FRAME_EVENT, listener, true);
|
102
|
+
};
|
94
103
|
}
|
95
|
-
|
96
|
-
targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.removeEventListener(FUI_FRAME_EVENT, listener, true);
|
97
|
-
};
|
98
|
-
}, [targetDocument, enableFrameFocusDispatch, listener]);
|
104
|
+
}, [targetDocument, disabled, listener]);
|
99
105
|
// Starts polling for the active element
|
100
106
|
React.useEffect(() => {
|
101
107
|
var _a;
|
102
|
-
if (
|
108
|
+
if (!disabled) {
|
103
109
|
timeoutRef.current = (_a = targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.defaultView) === null || _a === void 0 ? void 0 : _a.setInterval(() => {
|
104
110
|
const activeElement = targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.activeElement;
|
105
111
|
if ((activeElement === null || activeElement === void 0 ? void 0 : activeElement.tagName) === 'IFRAME' || (activeElement === null || activeElement === void 0 ? void 0 : activeElement.tagName) === 'WEBVIEW') {
|
@@ -114,6 +120,6 @@ const useIFrameFocus = (enableFrameFocusDispatch, targetDocument, callback, poll
|
|
114
120
|
var _a;
|
115
121
|
(_a = targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.defaultView) === null || _a === void 0 ? void 0 : _a.clearTimeout(timeoutRef.current);
|
116
122
|
};
|
117
|
-
}, [targetDocument,
|
123
|
+
}, [targetDocument, disabled, pollDuration]);
|
118
124
|
};
|
119
125
|
//# sourceMappingURL=useOnClickOutside.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"mappings":"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","names":["React","useEventCallback","useOnClickOutside","options","refs","callback","element","disabled","contains","containsProp","timeoutId","useRef","undefined","useIFrameFocus","listener","ev","parent","child","isOutside","every","ref","current","target","useEffect","currentEvent","getWindowEvent","window","conditionalHandler","event","addEventListener","setTimeout","removeEventListener","clearTimeout","ownerDocument","defaultView","FUI_FRAME_EVENT","enableFrameFocusDispatch","targetDocument","pollDuration","timeoutRef","e","setInterval","activeElement","tagName","CustomEvent","bubbles","dispatchEvent"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/hooks/useOnClickOutside.ts"],"sourcesContent":["import * as React from 'react';\nimport { useEventCallback } from './useEventCallback';\n\n/**\n * @internal\n */\nexport type UseOnClickOrScrollOutsideOptions = {\n /**\n * The element to listen for the click event\n */\n element: Document | undefined;\n /**\n * Refs to elements that check if the click is outside\n */\n refs: React.MutableRefObject<HTMLElement | undefined | null>[];\n\n /**\n * By default uses element.contains, but custom contain function can be provided\n * @param parentRef - provided parent ref\n * @param child - event target element\n */\n contains?(parent: HTMLElement | null, child: HTMLElement): boolean;\n\n /**\n * Disables event listeners\n */\n disabled?: boolean;\n\n /**\n * Called if the click is outside the element refs\n */\n callback: (ev: MouseEvent | TouchEvent) => void;\n};\n\n/**\n * @internal\n * Utility to perform checks where a click/touch event was made outside a component\n */\nexport const useOnClickOutside = (options: UseOnClickOrScrollOutsideOptions) => {\n const { refs, callback, element, disabled, contains: containsProp } = options;\n const timeoutId = React.useRef<number | undefined>(undefined);\n useIFrameFocus(!disabled, element, callback as (e: Event) => void);\n\n const listener = useEventCallback((ev: MouseEvent | TouchEvent) => {\n const contains: UseOnClickOrScrollOutsideOptions['contains'] =\n containsProp || ((parent, child) => !!parent?.contains(child));\n\n const isOutside = refs.every(ref => !contains(ref.current || null, ev.target as HTMLElement));\n if (isOutside && !disabled) {\n callback(ev);\n }\n });\n\n React.useEffect(() => {\n // Store the current event to avoid triggering handlers immediately\n // Note this depends on a deprecated but extremely well supported quirk of the web platform\n // https://github.com/facebook/react/issues/20074\n let currentEvent = getWindowEvent(window);\n\n const conditionalHandler = (event: MouseEvent | TouchEvent) => {\n // Skip if this event is the same as the one running when we added the handlers\n if (event === currentEvent) {\n currentEvent = undefined;\n return;\n }\n\n listener(event);\n };\n\n if (!disabled) {\n // use capture phase because React can update DOM before the event bubbles to the document\n element?.addEventListener('click', conditionalHandler, true);\n element?.addEventListener('touchstart', conditionalHandler, true);\n element?.addEventListener('contextmenu', conditionalHandler, true);\n }\n\n // Garbage collect this event after it's no longer useful to avoid memory leaks\n timeoutId.current = window.setTimeout(() => {\n currentEvent = undefined;\n }, 1);\n\n return () => {\n element?.removeEventListener('click', conditionalHandler, true);\n element?.removeEventListener('touchstart', conditionalHandler, true);\n element?.removeEventListener('contextmenu', conditionalHandler, true);\n\n clearTimeout(timeoutId.current);\n currentEvent = undefined;\n };\n }, [listener, element, disabled]);\n};\n\nconst getWindowEvent = (target: Node | Window): Event | undefined => {\n if (target) {\n if (typeof (target as Window).window === 'object' && (target as Window).window === target) {\n // eslint-disable-next-line deprecation/deprecation\n return target.event;\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (target as Node).ownerDocument?.defaultView?.event ?? undefined;\n }\n\n return undefined;\n};\n\nconst FUI_FRAME_EVENT = 'fuiframefocus';\n\n/**\n * Since click events do not propagate past iframes, we use focus to detect if a\n * click has happened inside an iframe, since the only ways of focusing inside an\n * iframe are:\n * - clicking inside\n * - tabbing inside\n *\n * Polls the value of `document.activeElement`. If it is an iframe, then dispatch\n * a custom DOM event. When the custom event is received call the provided callback\n *\n * @param enableFrameFocusDispatch - boolean flag to start dispatching events\n * @param targetDocument - the document to dispatch events and set timeouts\n * @param pollDuration - in milliseconds\n */\nconst useIFrameFocus = (\n enableFrameFocusDispatch: boolean,\n targetDocument: Document | undefined,\n callback: (e: Event) => void,\n pollDuration: number = 1000,\n) => {\n const timeoutRef = React.useRef<number>();\n\n const listener = useEventCallback((e: Event) => {\n if (callback) {\n callback(e);\n }\n });\n\n // Adds listener to the custom iframe focus event\n React.useEffect(() => {\n if (enableFrameFocusDispatch) {\n targetDocument?.addEventListener(FUI_FRAME_EVENT, listener, true);\n }\n return () => {\n targetDocument?.removeEventListener(FUI_FRAME_EVENT, listener, true);\n };\n }, [targetDocument, enableFrameFocusDispatch, listener]);\n\n // Starts polling for the active element\n React.useEffect(() => {\n if (enableFrameFocusDispatch) {\n timeoutRef.current = targetDocument?.defaultView?.setInterval(() => {\n const activeElement = targetDocument?.activeElement;\n if (activeElement?.tagName === 'IFRAME' || activeElement?.tagName === 'WEBVIEW') {\n const event = new CustomEvent(FUI_FRAME_EVENT, { bubbles: true });\n activeElement.dispatchEvent(event);\n }\n }, pollDuration);\n }\n return () => {\n targetDocument?.defaultView?.clearTimeout(timeoutRef.current);\n };\n }, [targetDocument, enableFrameFocusDispatch, pollDuration]);\n};\n"]}
|
1
|
+
{"version":3,"mappings":"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","names":["React","useEventCallback","useOnClickOutside","options","refs","callback","element","disabled","contains","containsProp","timeoutId","useRef","undefined","useIFrameFocus","listener","ev","parent","child","isOutside","every","ref","current","target","useEffect","currentEvent","getWindowEvent","window","conditionalHandler","event","addEventListener","setTimeout","removeEventListener","clearTimeout","ownerDocument","defaultView","FUI_FRAME_EVENT","targetDocument","pollDuration","timeoutRef","e","setInterval","activeElement","tagName","CustomEvent","bubbles","dispatchEvent"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/hooks/useOnClickOutside.ts"],"sourcesContent":["import * as React from 'react';\nimport { useEventCallback } from './useEventCallback';\n\n/**\n * @internal\n */\nexport type UseOnClickOrScrollOutsideOptions = {\n /**\n * The element to listen for the click event\n */\n element: Document | undefined;\n /**\n * Refs to elements that check if the click is outside\n */\n refs: React.MutableRefObject<HTMLElement | undefined | null>[];\n\n /**\n * By default uses element.contains, but custom contain function can be provided\n * @param parentRef - provided parent ref\n * @param child - event target element\n */\n contains?(parent: HTMLElement | null, child: HTMLElement): boolean;\n\n /**\n * Disables event listeners\n */\n disabled?: boolean;\n\n /**\n * Called if the click is outside the element refs\n */\n callback: (ev: MouseEvent | TouchEvent) => void;\n};\n\n/**\n * @internal\n * Utility to perform checks where a click/touch event was made outside a component\n */\nexport const useOnClickOutside = (options: UseOnClickOrScrollOutsideOptions) => {\n const { refs, callback, element, disabled, contains: containsProp } = options;\n const timeoutId = React.useRef<number | undefined>(undefined);\n useIFrameFocus(options);\n\n const listener = useEventCallback((ev: MouseEvent | TouchEvent) => {\n const contains: UseOnClickOrScrollOutsideOptions['contains'] =\n containsProp || ((parent, child) => !!parent?.contains(child));\n\n const isOutside = refs.every(ref => !contains(ref.current || null, ev.target as HTMLElement));\n if (isOutside && !disabled) {\n callback(ev);\n }\n });\n\n React.useEffect(() => {\n // Store the current event to avoid triggering handlers immediately\n // Note this depends on a deprecated but extremely well supported quirk of the web platform\n // https://github.com/facebook/react/issues/20074\n let currentEvent = getWindowEvent(window);\n\n const conditionalHandler = (event: MouseEvent | TouchEvent) => {\n // Skip if this event is the same as the one running when we added the handlers\n if (event === currentEvent) {\n currentEvent = undefined;\n return;\n }\n\n listener(event);\n };\n\n if (!disabled) {\n // use capture phase because React can update DOM before the event bubbles to the document\n element?.addEventListener('click', conditionalHandler, true);\n element?.addEventListener('touchstart', conditionalHandler, true);\n element?.addEventListener('contextmenu', conditionalHandler, true);\n }\n\n // Garbage collect this event after it's no longer useful to avoid memory leaks\n timeoutId.current = window.setTimeout(() => {\n currentEvent = undefined;\n }, 1);\n\n return () => {\n element?.removeEventListener('click', conditionalHandler, true);\n element?.removeEventListener('touchstart', conditionalHandler, true);\n element?.removeEventListener('contextmenu', conditionalHandler, true);\n\n clearTimeout(timeoutId.current);\n currentEvent = undefined;\n };\n }, [listener, element, disabled]);\n};\n\nconst getWindowEvent = (target: Node | Window): Event | undefined => {\n if (target) {\n if (typeof (target as Window).window === 'object' && (target as Window).window === target) {\n // eslint-disable-next-line deprecation/deprecation\n return target.event;\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (target as Node).ownerDocument?.defaultView?.event ?? undefined;\n }\n\n return undefined;\n};\n\nconst FUI_FRAME_EVENT = 'fuiframefocus';\n\ninterface UseIFrameFocusOptions extends UseOnClickOrScrollOutsideOptions {\n /**\n * Millisecond duration to poll\n */\n pollDuration?: number;\n}\n\n/**\n * Since click events do not propagate past iframes, we use focus to detect if a\n * click has happened inside an iframe, since the only ways of focusing inside an\n * iframe are:\n * - clicking inside\n * - tabbing inside\n *\n * Polls the value of `document.activeElement`. If it is an iframe, then dispatch\n * a custom DOM event. When the custom event is received call the provided callback\n */\nconst useIFrameFocus = (options: UseIFrameFocusOptions) => {\n const {\n disabled,\n element: targetDocument,\n callback,\n contains: containsProp = (parent, child) => !!parent?.contains(child),\n pollDuration = 1000,\n refs,\n } = options;\n const timeoutRef = React.useRef<number>();\n\n const listener = useEventCallback((e: Event) => {\n const contains = containsProp || ((parent, child) => !!parent?.contains(child));\n\n const isOutside = refs.every(ref => !contains(ref.current || null, e.target as HTMLElement));\n if (isOutside && !disabled) {\n callback(e as MouseEvent);\n }\n });\n\n // Adds listener to the custom iframe focus event\n React.useEffect(() => {\n if (!disabled) {\n targetDocument?.addEventListener(FUI_FRAME_EVENT, listener, true);\n return () => {\n targetDocument?.removeEventListener(FUI_FRAME_EVENT, listener, true);\n };\n }\n }, [targetDocument, disabled, listener]);\n\n // Starts polling for the active element\n React.useEffect(() => {\n if (!disabled) {\n timeoutRef.current = targetDocument?.defaultView?.setInterval(() => {\n const activeElement = targetDocument?.activeElement;\n if (activeElement?.tagName === 'IFRAME' || activeElement?.tagName === 'WEBVIEW') {\n const event = new CustomEvent(FUI_FRAME_EVENT, { bubbles: true });\n activeElement.dispatchEvent(event);\n }\n }, pollDuration);\n }\n return () => {\n targetDocument?.defaultView?.clearTimeout(timeoutRef.current);\n };\n }, [targetDocument, disabled, pollDuration]);\n};\n"]}
|
package/lib/index.js
CHANGED
@@ -3,4 +3,5 @@ export { IdPrefixProvider, resetIdsForTests, useControllableState, useEventCallb
|
|
3
3
|
export { canUseDOM, useIsSSR, SSRProvider } from './ssr/index';
|
4
4
|
export { clamp, getNativeElementProps, getPartitionedNativeProps, getRTLSafeKey, mergeCallbacks, isHTMLElement, isInteractiveHTMLElement } from './utils/index';
|
5
5
|
export { applyTriggerPropsToChildren, getTriggerChild, isFluentTrigger } from './trigger/index';
|
6
|
+
export { isTouchEvent, isMouseEvent, getEventClientCoords } from './events/index';
|
6
7
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"mappings":"AAAA,SAASA,QAAQ,EAAEC,gBAAgB,EAAEC,mBAAmB,QAAQ,iBAAiB;AAgBjF,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,oBAAoB,EACpBC,gBAAgB,EAChBC,aAAa,EACbC,cAAc,EACdC,KAAK,EACLC,yBAAyB,EACzBC,aAAa,EACbC,iBAAiB,EACjBC,kBAAkB,EAClBC,WAAW,EACXC,iBAAiB,EACjBC,UAAU,QACL,eAAe;AAGtB,SAASC,SAAS,EAAEC,QAAQ,EAAEC,WAAW,QAAQ,aAAa;AAE9D,SACEC,KAAK,EACLC,qBAAqB,EACrBC,yBAAyB,EACzBC,aAAa,EACbC,cAAc,EACdC,aAAa,EACbC,wBAAwB,QACnB,eAAe;AAEtB,SAASC,2BAA2B,EAAEC,eAAe,EAAEC,eAAe,QAAQ,iBAAiB","names":["getSlots","resolveShorthand","isResolvedShorthand","IdPrefixProvider","resetIdsForTests","useControllableState","useEventCallback","useFirstMount","useForceUpdate","useId","useIsomorphicLayoutEffect","useMergedRefs","useOnClickOutside","useOnScrollOutside","usePrevious","useScrollbarWidth","useTimeout","canUseDOM","useIsSSR","SSRProvider","clamp","getNativeElementProps","getPartitionedNativeProps","getRTLSafeKey","mergeCallbacks","isHTMLElement","isInteractiveHTMLElement","applyTriggerPropsToChildren","getTriggerChild","isFluentTrigger"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/index.ts"],"sourcesContent":["export { getSlots, resolveShorthand, isResolvedShorthand } from './compose/index';\nexport type {\n ExtractSlotProps,\n ComponentProps,\n ComponentState,\n ForwardRefComponent,\n ResolveShorthandFunction,\n ResolveShorthandOptions,\n Slot,\n Slots,\n SlotClassNames,\n SlotPropsRecord,\n SlotRenderFunction,\n SlotShorthandValue,\n} from './compose/index';\n\nexport {\n IdPrefixProvider,\n resetIdsForTests,\n useControllableState,\n useEventCallback,\n useFirstMount,\n useForceUpdate,\n useId,\n useIsomorphicLayoutEffect,\n useMergedRefs,\n useOnClickOutside,\n useOnScrollOutside,\n usePrevious,\n useScrollbarWidth,\n useTimeout,\n} from './hooks/index';\nexport type { RefObjectFunction, UseControllableStateOptions, UseOnClickOrScrollOutsideOptions } from './hooks/index';\n\nexport { canUseDOM, useIsSSR, SSRProvider } from './ssr/index';\n\nexport {\n clamp,\n getNativeElementProps,\n getPartitionedNativeProps,\n getRTLSafeKey,\n mergeCallbacks,\n isHTMLElement,\n isInteractiveHTMLElement,\n} from './utils/index';\n\nexport { applyTriggerPropsToChildren, getTriggerChild, isFluentTrigger } from './trigger/index';\n\nexport type { FluentTriggerComponent, TriggerProps } from './trigger/index';\n"]}
|
1
|
+
{"version":3,"mappings":"AAAA,SAASA,QAAQ,EAAEC,gBAAgB,EAAEC,mBAAmB,QAAQ,iBAAiB;AAgBjF,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,oBAAoB,EACpBC,gBAAgB,EAChBC,aAAa,EACbC,cAAc,EACdC,KAAK,EACLC,yBAAyB,EACzBC,aAAa,EACbC,iBAAiB,EACjBC,kBAAkB,EAClBC,WAAW,EACXC,iBAAiB,EACjBC,UAAU,QACL,eAAe;AAGtB,SAASC,SAAS,EAAEC,QAAQ,EAAEC,WAAW,QAAQ,aAAa;AAE9D,SACEC,KAAK,EACLC,qBAAqB,EACrBC,yBAAyB,EACzBC,aAAa,EACbC,cAAc,EACdC,aAAa,EACbC,wBAAwB,QACnB,eAAe;AAEtB,SAASC,2BAA2B,EAAEC,eAAe,EAAEC,eAAe,QAAQ,iBAAiB;AAQ/F,SAASC,YAAY,EAAEC,YAAY,EAAEC,oBAAoB,QAAQ,gBAAgB","names":["getSlots","resolveShorthand","isResolvedShorthand","IdPrefixProvider","resetIdsForTests","useControllableState","useEventCallback","useFirstMount","useForceUpdate","useId","useIsomorphicLayoutEffect","useMergedRefs","useOnClickOutside","useOnScrollOutside","usePrevious","useScrollbarWidth","useTimeout","canUseDOM","useIsSSR","SSRProvider","clamp","getNativeElementProps","getPartitionedNativeProps","getRTLSafeKey","mergeCallbacks","isHTMLElement","isInteractiveHTMLElement","applyTriggerPropsToChildren","getTriggerChild","isFluentTrigger","isTouchEvent","isMouseEvent","getEventClientCoords"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/index.ts"],"sourcesContent":["export { getSlots, resolveShorthand, isResolvedShorthand } from './compose/index';\nexport type {\n ExtractSlotProps,\n ComponentProps,\n ComponentState,\n ForwardRefComponent,\n ResolveShorthandFunction,\n ResolveShorthandOptions,\n Slot,\n Slots,\n SlotClassNames,\n SlotPropsRecord,\n SlotRenderFunction,\n SlotShorthandValue,\n} from './compose/index';\n\nexport {\n IdPrefixProvider,\n resetIdsForTests,\n useControllableState,\n useEventCallback,\n useFirstMount,\n useForceUpdate,\n useId,\n useIsomorphicLayoutEffect,\n useMergedRefs,\n useOnClickOutside,\n useOnScrollOutside,\n usePrevious,\n useScrollbarWidth,\n useTimeout,\n} from './hooks/index';\nexport type { RefObjectFunction, UseControllableStateOptions, UseOnClickOrScrollOutsideOptions } from './hooks/index';\n\nexport { canUseDOM, useIsSSR, SSRProvider } from './ssr/index';\n\nexport {\n clamp,\n getNativeElementProps,\n getPartitionedNativeProps,\n getRTLSafeKey,\n mergeCallbacks,\n isHTMLElement,\n isInteractiveHTMLElement,\n} from './utils/index';\n\nexport { applyTriggerPropsToChildren, getTriggerChild, isFluentTrigger } from './trigger/index';\n\nexport type { FluentTriggerComponent, TriggerProps } from './trigger/index';\n\n/**\n * Event utils\n */\nexport type { NativeTouchOrMouseEvent, ReactTouchOrMouseEvent, TouchOrMouseEvent } from './events/index';\nexport { isTouchEvent, isMouseEvent, getEventClientCoords } from './events/index';\n"]}
|
@@ -0,0 +1,6 @@
|
|
1
|
+
define(["require", "exports", "tslib", "./mouseTouchHelpers"], function (require, exports, tslib_1, mouseTouchHelpers_1) {
|
2
|
+
"use strict";
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
4
|
+
tslib_1.__exportStar(mouseTouchHelpers_1, exports);
|
5
|
+
});
|
6
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../packages/react-components/react-utilities/src/events/index.ts"],"names":[],"mappings":";;;IAAA,mDAAoC","sourcesContent":["export * from './mouseTouchHelpers';\n"]}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
define(["require", "exports"], function (require, exports) {
|
2
|
+
"use strict";
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
4
|
+
exports.getEventClientCoords = exports.isMouseEvent = exports.isTouchEvent = void 0;
|
5
|
+
/**
|
6
|
+
* Returns true if event is a touch event. Useful when sharing logic between touch and mouse interactions.
|
7
|
+
*/
|
8
|
+
function isTouchEvent(event) {
|
9
|
+
return event.type.startsWith('touch');
|
10
|
+
}
|
11
|
+
exports.isTouchEvent = isTouchEvent;
|
12
|
+
/**
|
13
|
+
* Returns true if event is a mouse event. Useful when sharing logic between touch and mouse interactions.
|
14
|
+
*/
|
15
|
+
function isMouseEvent(event) {
|
16
|
+
return event.type.startsWith('mouse') || ['click', 'contextmenu', 'dblclick'].indexOf(event.type) > -1;
|
17
|
+
}
|
18
|
+
exports.isMouseEvent = isMouseEvent;
|
19
|
+
/**
|
20
|
+
* Returns an object with clientX, clientY for TouchOrMouseEvent.
|
21
|
+
* Returns zeros in case the event is not a mouse or a touch event.
|
22
|
+
*/
|
23
|
+
function getEventClientCoords(event) {
|
24
|
+
if (isMouseEvent(event)) {
|
25
|
+
return { clientX: event.clientX, clientY: event.clientY };
|
26
|
+
}
|
27
|
+
else if (isTouchEvent(event)) {
|
28
|
+
return { clientX: event.touches[0].clientX, clientY: event.touches[0].clientY };
|
29
|
+
}
|
30
|
+
else {
|
31
|
+
if (process.env.NODE_ENV !== 'production') {
|
32
|
+
throw new Error('@fluentui/react-utilities]: Unable to get clientX. Unknown event type.');
|
33
|
+
}
|
34
|
+
return { clientX: 0, clientY: 0 };
|
35
|
+
}
|
36
|
+
}
|
37
|
+
exports.getEventClientCoords = getEventClientCoords;
|
38
|
+
});
|
39
|
+
//# sourceMappingURL=mouseTouchHelpers.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"mouseTouchHelpers.js","sourceRoot":"","sources":["../../../../../../../../packages/react-components/react-utilities/src/events/mouseTouchHelpers.ts"],"names":[],"mappings":";;;;IAQA;;OAEG;IACH,SAAgB,YAAY,CAAC,KAAwB;QACnD,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAFD,oCAEC;IAED;;OAEG;IACH,SAAgB,YAAY,CAAC,KAAwB;QACnD,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzG,CAAC;IAFD,oCAEC;IAED;;;OAGG;IACH,SAAgB,oBAAoB,CAAC,KAAwB;QAC3D,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;YACvB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;SAC3D;aAAM,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;YAC9B,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjF;aAAM;YACL,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE;gBACzC,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;aAC3F;YACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;SACnC;IACH,CAAC;IAXD,oDAWC","sourcesContent":["import * as React from 'react';\n\nexport type NativeTouchOrMouseEvent = MouseEvent | TouchEvent;\n\nexport type ReactTouchOrMouseEvent = React.MouseEvent | React.TouchEvent;\n\nexport type TouchOrMouseEvent = NativeTouchOrMouseEvent | ReactTouchOrMouseEvent;\n\n/**\n * Returns true if event is a touch event. Useful when sharing logic between touch and mouse interactions.\n */\nexport function isTouchEvent(event: TouchOrMouseEvent): event is TouchEvent | React.TouchEvent {\n return event.type.startsWith('touch');\n}\n\n/**\n * Returns true if event is a mouse event. Useful when sharing logic between touch and mouse interactions.\n */\nexport function isMouseEvent(event: TouchOrMouseEvent): event is MouseEvent | React.MouseEvent {\n return event.type.startsWith('mouse') || ['click', 'contextmenu', 'dblclick'].indexOf(event.type) > -1;\n}\n\n/**\n * Returns an object with clientX, clientY for TouchOrMouseEvent.\n * Returns zeros in case the event is not a mouse or a touch event.\n */\nexport function getEventClientCoords(event: TouchOrMouseEvent): { clientX: number; clientY: number } {\n if (isMouseEvent(event)) {\n return { clientX: event.clientX, clientY: event.clientY };\n } else if (isTouchEvent(event)) {\n return { clientX: event.touches[0].clientX, clientY: event.touches[0].clientY };\n } else {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error('@fluentui/react-utilities]: Unable to get clientX. Unknown event type.');\n }\n return { clientX: 0, clientY: 0 };\n }\n}\n"]}
|
@@ -9,7 +9,7 @@ define(["require", "exports", "react", "./useEventCallback"], function (require,
|
|
9
9
|
var useOnClickOutside = function (options) {
|
10
10
|
var refs = options.refs, callback = options.callback, element = options.element, disabled = options.disabled, containsProp = options.contains;
|
11
11
|
var timeoutId = React.useRef(undefined);
|
12
|
-
useIFrameFocus(
|
12
|
+
useIFrameFocus(options);
|
13
13
|
var listener = useEventCallback_1.useEventCallback(function (ev) {
|
14
14
|
var contains = containsProp || (function (parent, child) { return !!(parent === null || parent === void 0 ? void 0 : parent.contains(child)); });
|
15
15
|
var isOutside = refs.every(function (ref) { return !contains(ref.current || null, ev.target); });
|
@@ -72,32 +72,30 @@ define(["require", "exports", "react", "./useEventCallback"], function (require,
|
|
72
72
|
*
|
73
73
|
* Polls the value of `document.activeElement`. If it is an iframe, then dispatch
|
74
74
|
* a custom DOM event. When the custom event is received call the provided callback
|
75
|
-
*
|
76
|
-
* @param enableFrameFocusDispatch - boolean flag to start dispatching events
|
77
|
-
* @param targetDocument - the document to dispatch events and set timeouts
|
78
|
-
* @param pollDuration - in milliseconds
|
79
75
|
*/
|
80
|
-
var useIFrameFocus = function (
|
81
|
-
|
76
|
+
var useIFrameFocus = function (options) {
|
77
|
+
var disabled = options.disabled, targetDocument = options.element, callback = options.callback, _a = options.contains, containsProp = _a === void 0 ? function (parent, child) { return !!(parent === null || parent === void 0 ? void 0 : parent.contains(child)); } : _a, _b = options.pollDuration, pollDuration = _b === void 0 ? 1000 : _b, refs = options.refs;
|
82
78
|
var timeoutRef = React.useRef();
|
83
79
|
var listener = useEventCallback_1.useEventCallback(function (e) {
|
84
|
-
|
80
|
+
var contains = containsProp || (function (parent, child) { return !!(parent === null || parent === void 0 ? void 0 : parent.contains(child)); });
|
81
|
+
var isOutside = refs.every(function (ref) { return !contains(ref.current || null, e.target); });
|
82
|
+
if (isOutside && !disabled) {
|
85
83
|
callback(e);
|
86
84
|
}
|
87
85
|
});
|
88
86
|
// Adds listener to the custom iframe focus event
|
89
87
|
React.useEffect(function () {
|
90
|
-
if (
|
88
|
+
if (!disabled) {
|
91
89
|
targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.addEventListener(FUI_FRAME_EVENT, listener, true);
|
90
|
+
return function () {
|
91
|
+
targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.removeEventListener(FUI_FRAME_EVENT, listener, true);
|
92
|
+
};
|
92
93
|
}
|
93
|
-
|
94
|
-
targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.removeEventListener(FUI_FRAME_EVENT, listener, true);
|
95
|
-
};
|
96
|
-
}, [targetDocument, enableFrameFocusDispatch, listener]);
|
94
|
+
}, [targetDocument, disabled, listener]);
|
97
95
|
// Starts polling for the active element
|
98
96
|
React.useEffect(function () {
|
99
97
|
var _a;
|
100
|
-
if (
|
98
|
+
if (!disabled) {
|
101
99
|
timeoutRef.current = (_a = targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.defaultView) === null || _a === void 0 ? void 0 : _a.setInterval(function () {
|
102
100
|
var activeElement = targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.activeElement;
|
103
101
|
if ((activeElement === null || activeElement === void 0 ? void 0 : activeElement.tagName) === 'IFRAME' || (activeElement === null || activeElement === void 0 ? void 0 : activeElement.tagName) === 'WEBVIEW') {
|
@@ -110,7 +108,7 @@ define(["require", "exports", "react", "./useEventCallback"], function (require,
|
|
110
108
|
var _a;
|
111
109
|
(_a = targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.defaultView) === null || _a === void 0 ? void 0 : _a.clearTimeout(timeoutRef.current);
|
112
110
|
};
|
113
|
-
}, [targetDocument,
|
111
|
+
}, [targetDocument, disabled, pollDuration]);
|
114
112
|
};
|
115
113
|
});
|
116
114
|
//# sourceMappingURL=useOnClickOutside.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useOnClickOutside.js","sourceRoot":"","sources":["../../../../../../../../packages/react-components/react-utilities/src/hooks/useOnClickOutside.ts"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport { useEventCallback } from './useEventCallback';\n\n/**\n * @internal\n */\nexport type UseOnClickOrScrollOutsideOptions = {\n /**\n * The element to listen for the click event\n */\n element: Document | undefined;\n /**\n * Refs to elements that check if the click is outside\n */\n refs: React.MutableRefObject<HTMLElement | undefined | null>[];\n\n /**\n * By default uses element.contains, but custom contain function can be provided\n * @param parentRef - provided parent ref\n * @param child - event target element\n */\n contains?(parent: HTMLElement | null, child: HTMLElement): boolean;\n\n /**\n * Disables event listeners\n */\n disabled?: boolean;\n\n /**\n * Called if the click is outside the element refs\n */\n callback: (ev: MouseEvent | TouchEvent) => void;\n};\n\n/**\n * @internal\n * Utility to perform checks where a click/touch event was made outside a component\n */\nexport const useOnClickOutside = (options: UseOnClickOrScrollOutsideOptions) => {\n const { refs, callback, element, disabled, contains: containsProp } = options;\n const timeoutId = React.useRef<number | undefined>(undefined);\n useIFrameFocus(!disabled, element, callback as (e: Event) => void);\n\n const listener = useEventCallback((ev: MouseEvent | TouchEvent) => {\n const contains: UseOnClickOrScrollOutsideOptions['contains'] =\n containsProp || ((parent, child) => !!parent?.contains(child));\n\n const isOutside = refs.every(ref => !contains(ref.current || null, ev.target as HTMLElement));\n if (isOutside && !disabled) {\n callback(ev);\n }\n });\n\n React.useEffect(() => {\n // Store the current event to avoid triggering handlers immediately\n // Note this depends on a deprecated but extremely well supported quirk of the web platform\n // https://github.com/facebook/react/issues/20074\n let currentEvent = getWindowEvent(window);\n\n const conditionalHandler = (event: MouseEvent | TouchEvent) => {\n // Skip if this event is the same as the one running when we added the handlers\n if (event === currentEvent) {\n currentEvent = undefined;\n return;\n }\n\n listener(event);\n };\n\n if (!disabled) {\n // use capture phase because React can update DOM before the event bubbles to the document\n element?.addEventListener('click', conditionalHandler, true);\n element?.addEventListener('touchstart', conditionalHandler, true);\n element?.addEventListener('contextmenu', conditionalHandler, true);\n }\n\n // Garbage collect this event after it's no longer useful to avoid memory leaks\n timeoutId.current = window.setTimeout(() => {\n currentEvent = undefined;\n }, 1);\n\n return () => {\n element?.removeEventListener('click', conditionalHandler, true);\n element?.removeEventListener('touchstart', conditionalHandler, true);\n element?.removeEventListener('contextmenu', conditionalHandler, true);\n\n clearTimeout(timeoutId.current);\n currentEvent = undefined;\n };\n }, [listener, element, disabled]);\n};\n\nconst getWindowEvent = (target: Node | Window): Event | undefined => {\n if (target) {\n if (typeof (target as Window).window === 'object' && (target as Window).window === target) {\n // eslint-disable-next-line deprecation/deprecation\n return target.event;\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (target as Node).ownerDocument?.defaultView?.event ?? undefined;\n }\n\n return undefined;\n};\n\nconst FUI_FRAME_EVENT = 'fuiframefocus';\n\n/**\n * Since click events do not propagate past iframes, we use focus to detect if a\n * click has happened inside an iframe, since the only ways of focusing inside an\n * iframe are:\n * - clicking inside\n * - tabbing inside\n *\n * Polls the value of `document.activeElement`. If it is an iframe, then dispatch\n * a custom DOM event. When the custom event is received call the provided callback\n *\n * @param enableFrameFocusDispatch - boolean flag to start dispatching events\n * @param targetDocument - the document to dispatch events and set timeouts\n * @param pollDuration - in milliseconds\n */\nconst useIFrameFocus = (\n enableFrameFocusDispatch: boolean,\n targetDocument: Document | undefined,\n callback: (e: Event) => void,\n pollDuration: number = 1000,\n) => {\n const timeoutRef = React.useRef<number>();\n\n const listener = useEventCallback((e: Event) => {\n if (callback) {\n callback(e);\n }\n });\n\n // Adds listener to the custom iframe focus event\n React.useEffect(() => {\n if (enableFrameFocusDispatch) {\n targetDocument?.addEventListener(FUI_FRAME_EVENT, listener, true);\n }\n return () => {\n targetDocument?.removeEventListener(FUI_FRAME_EVENT, listener, true);\n };\n }, [targetDocument, enableFrameFocusDispatch, listener]);\n\n // Starts polling for the active element\n React.useEffect(() => {\n if (enableFrameFocusDispatch) {\n timeoutRef.current = targetDocument?.defaultView?.setInterval(() => {\n const activeElement = targetDocument?.activeElement;\n if (activeElement?.tagName === 'IFRAME' || activeElement?.tagName === 'WEBVIEW') {\n const event = new CustomEvent(FUI_FRAME_EVENT, { bubbles: true });\n activeElement.dispatchEvent(event);\n }\n }, pollDuration);\n }\n return () => {\n targetDocument?.defaultView?.clearTimeout(timeoutRef.current);\n };\n }, [targetDocument, enableFrameFocusDispatch, pollDuration]);\n};\n"]}
|
1
|
+
{"version":3,"file":"useOnClickOutside.js","sourceRoot":"","sources":["../../../../../../../../packages/react-components/react-utilities/src/hooks/useOnClickOutside.ts"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport { useEventCallback } from './useEventCallback';\n\n/**\n * @internal\n */\nexport type UseOnClickOrScrollOutsideOptions = {\n /**\n * The element to listen for the click event\n */\n element: Document | undefined;\n /**\n * Refs to elements that check if the click is outside\n */\n refs: React.MutableRefObject<HTMLElement | undefined | null>[];\n\n /**\n * By default uses element.contains, but custom contain function can be provided\n * @param parentRef - provided parent ref\n * @param child - event target element\n */\n contains?(parent: HTMLElement | null, child: HTMLElement): boolean;\n\n /**\n * Disables event listeners\n */\n disabled?: boolean;\n\n /**\n * Called if the click is outside the element refs\n */\n callback: (ev: MouseEvent | TouchEvent) => void;\n};\n\n/**\n * @internal\n * Utility to perform checks where a click/touch event was made outside a component\n */\nexport const useOnClickOutside = (options: UseOnClickOrScrollOutsideOptions) => {\n const { refs, callback, element, disabled, contains: containsProp } = options;\n const timeoutId = React.useRef<number | undefined>(undefined);\n useIFrameFocus(options);\n\n const listener = useEventCallback((ev: MouseEvent | TouchEvent) => {\n const contains: UseOnClickOrScrollOutsideOptions['contains'] =\n containsProp || ((parent, child) => !!parent?.contains(child));\n\n const isOutside = refs.every(ref => !contains(ref.current || null, ev.target as HTMLElement));\n if (isOutside && !disabled) {\n callback(ev);\n }\n });\n\n React.useEffect(() => {\n // Store the current event to avoid triggering handlers immediately\n // Note this depends on a deprecated but extremely well supported quirk of the web platform\n // https://github.com/facebook/react/issues/20074\n let currentEvent = getWindowEvent(window);\n\n const conditionalHandler = (event: MouseEvent | TouchEvent) => {\n // Skip if this event is the same as the one running when we added the handlers\n if (event === currentEvent) {\n currentEvent = undefined;\n return;\n }\n\n listener(event);\n };\n\n if (!disabled) {\n // use capture phase because React can update DOM before the event bubbles to the document\n element?.addEventListener('click', conditionalHandler, true);\n element?.addEventListener('touchstart', conditionalHandler, true);\n element?.addEventListener('contextmenu', conditionalHandler, true);\n }\n\n // Garbage collect this event after it's no longer useful to avoid memory leaks\n timeoutId.current = window.setTimeout(() => {\n currentEvent = undefined;\n }, 1);\n\n return () => {\n element?.removeEventListener('click', conditionalHandler, true);\n element?.removeEventListener('touchstart', conditionalHandler, true);\n element?.removeEventListener('contextmenu', conditionalHandler, true);\n\n clearTimeout(timeoutId.current);\n currentEvent = undefined;\n };\n }, [listener, element, disabled]);\n};\n\nconst getWindowEvent = (target: Node | Window): Event | undefined => {\n if (target) {\n if (typeof (target as Window).window === 'object' && (target as Window).window === target) {\n // eslint-disable-next-line deprecation/deprecation\n return target.event;\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (target as Node).ownerDocument?.defaultView?.event ?? undefined;\n }\n\n return undefined;\n};\n\nconst FUI_FRAME_EVENT = 'fuiframefocus';\n\ninterface UseIFrameFocusOptions extends UseOnClickOrScrollOutsideOptions {\n /**\n * Millisecond duration to poll\n */\n pollDuration?: number;\n}\n\n/**\n * Since click events do not propagate past iframes, we use focus to detect if a\n * click has happened inside an iframe, since the only ways of focusing inside an\n * iframe are:\n * - clicking inside\n * - tabbing inside\n *\n * Polls the value of `document.activeElement`. If it is an iframe, then dispatch\n * a custom DOM event. When the custom event is received call the provided callback\n */\nconst useIFrameFocus = (options: UseIFrameFocusOptions) => {\n const {\n disabled,\n element: targetDocument,\n callback,\n contains: containsProp = (parent, child) => !!parent?.contains(child),\n pollDuration = 1000,\n refs,\n } = options;\n const timeoutRef = React.useRef<number>();\n\n const listener = useEventCallback((e: Event) => {\n const contains = containsProp || ((parent, child) => !!parent?.contains(child));\n\n const isOutside = refs.every(ref => !contains(ref.current || null, e.target as HTMLElement));\n if (isOutside && !disabled) {\n callback(e as MouseEvent);\n }\n });\n\n // Adds listener to the custom iframe focus event\n React.useEffect(() => {\n if (!disabled) {\n targetDocument?.addEventListener(FUI_FRAME_EVENT, listener, true);\n return () => {\n targetDocument?.removeEventListener(FUI_FRAME_EVENT, listener, true);\n };\n }\n }, [targetDocument, disabled, listener]);\n\n // Starts polling for the active element\n React.useEffect(() => {\n if (!disabled) {\n timeoutRef.current = targetDocument?.defaultView?.setInterval(() => {\n const activeElement = targetDocument?.activeElement;\n if (activeElement?.tagName === 'IFRAME' || activeElement?.tagName === 'WEBVIEW') {\n const event = new CustomEvent(FUI_FRAME_EVENT, { bubbles: true });\n activeElement.dispatchEvent(event);\n }\n }, pollDuration);\n }\n return () => {\n targetDocument?.defaultView?.clearTimeout(timeoutRef.current);\n };\n }, [targetDocument, disabled, pollDuration]);\n};\n"]}
|
package/lib-amd/index.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
define(["require", "exports", "./compose/index", "./hooks/index", "./ssr/index", "./utils/index", "./trigger/index"], function (require, exports, index_1, index_2, index_3, index_4, index_5) {
|
1
|
+
define(["require", "exports", "./compose/index", "./hooks/index", "./ssr/index", "./utils/index", "./trigger/index", "./events/index"], function (require, exports, index_1, index_2, index_3, index_4, index_5, index_6) {
|
2
2
|
"use strict";
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
4
|
-
exports.isFluentTrigger = exports.getTriggerChild = exports.applyTriggerPropsToChildren = exports.isInteractiveHTMLElement = exports.isHTMLElement = exports.mergeCallbacks = exports.getRTLSafeKey = exports.getPartitionedNativeProps = exports.getNativeElementProps = exports.clamp = exports.SSRProvider = exports.useIsSSR = exports.canUseDOM = exports.useTimeout = exports.useScrollbarWidth = exports.usePrevious = exports.useOnScrollOutside = exports.useOnClickOutside = exports.useMergedRefs = exports.useIsomorphicLayoutEffect = exports.useId = exports.useForceUpdate = exports.useFirstMount = exports.useEventCallback = exports.useControllableState = exports.resetIdsForTests = exports.IdPrefixProvider = exports.isResolvedShorthand = exports.resolveShorthand = exports.getSlots = void 0;
|
4
|
+
exports.getEventClientCoords = exports.isMouseEvent = exports.isTouchEvent = exports.isFluentTrigger = exports.getTriggerChild = exports.applyTriggerPropsToChildren = exports.isInteractiveHTMLElement = exports.isHTMLElement = exports.mergeCallbacks = exports.getRTLSafeKey = exports.getPartitionedNativeProps = exports.getNativeElementProps = exports.clamp = exports.SSRProvider = exports.useIsSSR = exports.canUseDOM = exports.useTimeout = exports.useScrollbarWidth = exports.usePrevious = exports.useOnScrollOutside = exports.useOnClickOutside = exports.useMergedRefs = exports.useIsomorphicLayoutEffect = exports.useId = exports.useForceUpdate = exports.useFirstMount = exports.useEventCallback = exports.useControllableState = exports.resetIdsForTests = exports.IdPrefixProvider = exports.isResolvedShorthand = exports.resolveShorthand = exports.getSlots = void 0;
|
5
5
|
Object.defineProperty(exports, "getSlots", { enumerable: true, get: function () { return index_1.getSlots; } });
|
6
6
|
Object.defineProperty(exports, "resolveShorthand", { enumerable: true, get: function () { return index_1.resolveShorthand; } });
|
7
7
|
Object.defineProperty(exports, "isResolvedShorthand", { enumerable: true, get: function () { return index_1.isResolvedShorthand; } });
|
@@ -32,5 +32,8 @@ define(["require", "exports", "./compose/index", "./hooks/index", "./ssr/index",
|
|
32
32
|
Object.defineProperty(exports, "applyTriggerPropsToChildren", { enumerable: true, get: function () { return index_5.applyTriggerPropsToChildren; } });
|
33
33
|
Object.defineProperty(exports, "getTriggerChild", { enumerable: true, get: function () { return index_5.getTriggerChild; } });
|
34
34
|
Object.defineProperty(exports, "isFluentTrigger", { enumerable: true, get: function () { return index_5.isFluentTrigger; } });
|
35
|
+
Object.defineProperty(exports, "isTouchEvent", { enumerable: true, get: function () { return index_6.isTouchEvent; } });
|
36
|
+
Object.defineProperty(exports, "isMouseEvent", { enumerable: true, get: function () { return index_6.isMouseEvent; } });
|
37
|
+
Object.defineProperty(exports, "getEventClientCoords", { enumerable: true, get: function () { return index_6.getEventClientCoords; } });
|
35
38
|
});
|
36
39
|
//# sourceMappingURL=index.js.map
|
package/lib-amd/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/react-components/react-utilities/src/index.ts"],"names":[],"mappings":";;;;IAAS,iGAAA,QAAQ,OAAA;IAAE,yGAAA,gBAAgB,OAAA;IAAE,4GAAA,mBAAmB,OAAA;IAiBtD,yGAAA,gBAAgB,OAAA;IAChB,yGAAA,gBAAgB,OAAA;IAChB,6GAAA,oBAAoB,OAAA;IACpB,yGAAA,gBAAgB,OAAA;IAChB,sGAAA,aAAa,OAAA;IACb,uGAAA,cAAc,OAAA;IACd,8FAAA,KAAK,OAAA;IACL,kHAAA,yBAAyB,OAAA;IACzB,sGAAA,aAAa,OAAA;IACb,0GAAA,iBAAiB,OAAA;IACjB,2GAAA,kBAAkB,OAAA;IAClB,oGAAA,WAAW,OAAA;IACX,0GAAA,iBAAiB,OAAA;IACjB,mGAAA,UAAU,OAAA;IAIH,kGAAA,SAAS,OAAA;IAAE,iGAAA,QAAQ,OAAA;IAAE,oGAAA,WAAW,OAAA;IAGvC,8FAAA,KAAK,OAAA;IACL,8GAAA,qBAAqB,OAAA;IACrB,kHAAA,yBAAyB,OAAA;IACzB,sGAAA,aAAa,OAAA;IACb,uGAAA,cAAc,OAAA;IACd,sGAAA,aAAa,OAAA;IACb,iHAAA,wBAAwB,OAAA;IAGjB,oHAAA,2BAA2B,OAAA;IAAE,wGAAA,eAAe,OAAA;IAAE,wGAAA,eAAe,OAAA","sourcesContent":["export { getSlots, resolveShorthand, isResolvedShorthand } from './compose/index';\nexport type {\n ExtractSlotProps,\n ComponentProps,\n ComponentState,\n ForwardRefComponent,\n ResolveShorthandFunction,\n ResolveShorthandOptions,\n Slot,\n Slots,\n SlotClassNames,\n SlotPropsRecord,\n SlotRenderFunction,\n SlotShorthandValue,\n} from './compose/index';\n\nexport {\n IdPrefixProvider,\n resetIdsForTests,\n useControllableState,\n useEventCallback,\n useFirstMount,\n useForceUpdate,\n useId,\n useIsomorphicLayoutEffect,\n useMergedRefs,\n useOnClickOutside,\n useOnScrollOutside,\n usePrevious,\n useScrollbarWidth,\n useTimeout,\n} from './hooks/index';\nexport type { RefObjectFunction, UseControllableStateOptions, UseOnClickOrScrollOutsideOptions } from './hooks/index';\n\nexport { canUseDOM, useIsSSR, SSRProvider } from './ssr/index';\n\nexport {\n clamp,\n getNativeElementProps,\n getPartitionedNativeProps,\n getRTLSafeKey,\n mergeCallbacks,\n isHTMLElement,\n isInteractiveHTMLElement,\n} from './utils/index';\n\nexport { applyTriggerPropsToChildren, getTriggerChild, isFluentTrigger } from './trigger/index';\n\nexport type { FluentTriggerComponent, TriggerProps } from './trigger/index';\n"]}
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/react-components/react-utilities/src/index.ts"],"names":[],"mappings":";;;;IAAS,iGAAA,QAAQ,OAAA;IAAE,yGAAA,gBAAgB,OAAA;IAAE,4GAAA,mBAAmB,OAAA;IAiBtD,yGAAA,gBAAgB,OAAA;IAChB,yGAAA,gBAAgB,OAAA;IAChB,6GAAA,oBAAoB,OAAA;IACpB,yGAAA,gBAAgB,OAAA;IAChB,sGAAA,aAAa,OAAA;IACb,uGAAA,cAAc,OAAA;IACd,8FAAA,KAAK,OAAA;IACL,kHAAA,yBAAyB,OAAA;IACzB,sGAAA,aAAa,OAAA;IACb,0GAAA,iBAAiB,OAAA;IACjB,2GAAA,kBAAkB,OAAA;IAClB,oGAAA,WAAW,OAAA;IACX,0GAAA,iBAAiB,OAAA;IACjB,mGAAA,UAAU,OAAA;IAIH,kGAAA,SAAS,OAAA;IAAE,iGAAA,QAAQ,OAAA;IAAE,oGAAA,WAAW,OAAA;IAGvC,8FAAA,KAAK,OAAA;IACL,8GAAA,qBAAqB,OAAA;IACrB,kHAAA,yBAAyB,OAAA;IACzB,sGAAA,aAAa,OAAA;IACb,uGAAA,cAAc,OAAA;IACd,sGAAA,aAAa,OAAA;IACb,iHAAA,wBAAwB,OAAA;IAGjB,oHAAA,2BAA2B,OAAA;IAAE,wGAAA,eAAe,OAAA;IAAE,wGAAA,eAAe,OAAA;IAQ7D,qGAAA,YAAY,OAAA;IAAE,qGAAA,YAAY,OAAA;IAAE,6GAAA,oBAAoB,OAAA","sourcesContent":["export { getSlots, resolveShorthand, isResolvedShorthand } from './compose/index';\nexport type {\n ExtractSlotProps,\n ComponentProps,\n ComponentState,\n ForwardRefComponent,\n ResolveShorthandFunction,\n ResolveShorthandOptions,\n Slot,\n Slots,\n SlotClassNames,\n SlotPropsRecord,\n SlotRenderFunction,\n SlotShorthandValue,\n} from './compose/index';\n\nexport {\n IdPrefixProvider,\n resetIdsForTests,\n useControllableState,\n useEventCallback,\n useFirstMount,\n useForceUpdate,\n useId,\n useIsomorphicLayoutEffect,\n useMergedRefs,\n useOnClickOutside,\n useOnScrollOutside,\n usePrevious,\n useScrollbarWidth,\n useTimeout,\n} from './hooks/index';\nexport type { RefObjectFunction, UseControllableStateOptions, UseOnClickOrScrollOutsideOptions } from './hooks/index';\n\nexport { canUseDOM, useIsSSR, SSRProvider } from './ssr/index';\n\nexport {\n clamp,\n getNativeElementProps,\n getPartitionedNativeProps,\n getRTLSafeKey,\n mergeCallbacks,\n isHTMLElement,\n isInteractiveHTMLElement,\n} from './utils/index';\n\nexport { applyTriggerPropsToChildren, getTriggerChild, isFluentTrigger } from './trigger/index';\n\nexport type { FluentTriggerComponent, TriggerProps } from './trigger/index';\n\n/**\n * Event utils\n */\nexport type { NativeTouchOrMouseEvent, ReactTouchOrMouseEvent, TouchOrMouseEvent } from './events/index';\nexport { isTouchEvent, isMouseEvent, getEventClientCoords } from './events/index';\n"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"mappings":";;;;;;AAAAA","names":["tslib_1"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/events/index.ts"],"sourcesContent":["export * from './mouseTouchHelpers';\n"]}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.getEventClientCoords = exports.isMouseEvent = exports.isTouchEvent = void 0;
|
7
|
+
/**
|
8
|
+
* Returns true if event is a touch event. Useful when sharing logic between touch and mouse interactions.
|
9
|
+
*/
|
10
|
+
function isTouchEvent(event) {
|
11
|
+
return event.type.startsWith('touch');
|
12
|
+
}
|
13
|
+
exports.isTouchEvent = isTouchEvent;
|
14
|
+
/**
|
15
|
+
* Returns true if event is a mouse event. Useful when sharing logic between touch and mouse interactions.
|
16
|
+
*/
|
17
|
+
function isMouseEvent(event) {
|
18
|
+
return event.type.startsWith('mouse') || ['click', 'contextmenu', 'dblclick'].indexOf(event.type) > -1;
|
19
|
+
}
|
20
|
+
exports.isMouseEvent = isMouseEvent;
|
21
|
+
/**
|
22
|
+
* Returns an object with clientX, clientY for TouchOrMouseEvent.
|
23
|
+
* Returns zeros in case the event is not a mouse or a touch event.
|
24
|
+
*/
|
25
|
+
function getEventClientCoords(event) {
|
26
|
+
if (isMouseEvent(event)) {
|
27
|
+
return {
|
28
|
+
clientX: event.clientX,
|
29
|
+
clientY: event.clientY
|
30
|
+
};
|
31
|
+
} else if (isTouchEvent(event)) {
|
32
|
+
return {
|
33
|
+
clientX: event.touches[0].clientX,
|
34
|
+
clientY: event.touches[0].clientY
|
35
|
+
};
|
36
|
+
} else {
|
37
|
+
if (process.env.NODE_ENV !== 'production') {
|
38
|
+
throw new Error('@fluentui/react-utilities]: Unable to get clientX. Unknown event type.');
|
39
|
+
}
|
40
|
+
return {
|
41
|
+
clientX: 0,
|
42
|
+
clientY: 0
|
43
|
+
};
|
44
|
+
}
|
45
|
+
}
|
46
|
+
exports.getEventClientCoords = getEventClientCoords;
|
47
|
+
//# sourceMappingURL=mouseTouchHelpers.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"mappings":";;;;;;AAQA;;;AAGA,SAAgBA,YAAY,CAACC,KAAwB;EACnD,OAAOA,KAAK,CAACC,IAAI,CAACC,UAAU,CAAC,OAAO,CAAC;AACvC;AAFAC;AAIA;;;AAGA,SAAgBC,YAAY,CAACJ,KAAwB;EACnD,OAAOA,KAAK,CAACC,IAAI,CAACC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,CAAC,CAACG,OAAO,CAACL,KAAK,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxG;AAFAE;AAIA;;;;AAIA,SAAgBG,oBAAoB,CAACN,KAAwB;EAC3D,IAAII,YAAY,CAACJ,KAAK,CAAC,EAAE;IACvB,OAAO;MAAEO,OAAO,EAAEP,KAAK,CAACO,OAAO;MAAEC,OAAO,EAAER,KAAK,CAACQ;IAAO,CAAE;GAC1D,MAAM,IAAIT,YAAY,CAACC,KAAK,CAAC,EAAE;IAC9B,OAAO;MAAEO,OAAO,EAAEP,KAAK,CAACS,OAAO,CAAC,CAAC,CAAC,CAACF,OAAO;MAAEC,OAAO,EAAER,KAAK,CAACS,OAAO,CAAC,CAAC,CAAC,CAACD;IAAO,CAAE;GAChF,MAAM;IACL,IAAIE,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC,MAAM,IAAIC,KAAK,CAAC,wEAAwE,CAAC;;IAE3F,OAAO;MAAEN,OAAO,EAAE,CAAC;MAAEC,OAAO,EAAE;IAAC,CAAE;;AAErC;AAXAL","names":["isTouchEvent","event","type","startsWith","exports","isMouseEvent","indexOf","getEventClientCoords","clientX","clientY","touches","process","env","NODE_ENV","Error"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/events/mouseTouchHelpers.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type NativeTouchOrMouseEvent = MouseEvent | TouchEvent;\n\nexport type ReactTouchOrMouseEvent = React.MouseEvent | React.TouchEvent;\n\nexport type TouchOrMouseEvent = NativeTouchOrMouseEvent | ReactTouchOrMouseEvent;\n\n/**\n * Returns true if event is a touch event. Useful when sharing logic between touch and mouse interactions.\n */\nexport function isTouchEvent(event: TouchOrMouseEvent): event is TouchEvent | React.TouchEvent {\n return event.type.startsWith('touch');\n}\n\n/**\n * Returns true if event is a mouse event. Useful when sharing logic between touch and mouse interactions.\n */\nexport function isMouseEvent(event: TouchOrMouseEvent): event is MouseEvent | React.MouseEvent {\n return event.type.startsWith('mouse') || ['click', 'contextmenu', 'dblclick'].indexOf(event.type) > -1;\n}\n\n/**\n * Returns an object with clientX, clientY for TouchOrMouseEvent.\n * Returns zeros in case the event is not a mouse or a touch event.\n */\nexport function getEventClientCoords(event: TouchOrMouseEvent): { clientX: number; clientY: number } {\n if (isMouseEvent(event)) {\n return { clientX: event.clientX, clientY: event.clientY };\n } else if (isTouchEvent(event)) {\n return { clientX: event.touches[0].clientX, clientY: event.touches[0].clientY };\n } else {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error('@fluentui/react-utilities]: Unable to get clientX. Unknown event type.');\n }\n return { clientX: 0, clientY: 0 };\n }\n}\n"]}
|
@@ -19,7 +19,7 @@ const useOnClickOutside = options => {
|
|
19
19
|
contains: containsProp
|
20
20
|
} = options;
|
21
21
|
const timeoutId = React.useRef(undefined);
|
22
|
-
useIFrameFocus(
|
22
|
+
useIFrameFocus(options);
|
23
23
|
const listener = useEventCallback_1.useEventCallback(ev => {
|
24
24
|
const contains = containsProp || ((parent, child) => !!(parent === null || parent === void 0 ? void 0 : parent.contains(child)));
|
25
25
|
const isOutside = refs.every(ref => !contains(ref.current || null, ev.target));
|
@@ -82,31 +82,37 @@ const FUI_FRAME_EVENT = 'fuiframefocus';
|
|
82
82
|
*
|
83
83
|
* Polls the value of `document.activeElement`. If it is an iframe, then dispatch
|
84
84
|
* a custom DOM event. When the custom event is received call the provided callback
|
85
|
-
*
|
86
|
-
* @param enableFrameFocusDispatch - boolean flag to start dispatching events
|
87
|
-
* @param targetDocument - the document to dispatch events and set timeouts
|
88
|
-
* @param pollDuration - in milliseconds
|
89
85
|
*/
|
90
|
-
const useIFrameFocus =
|
86
|
+
const useIFrameFocus = options => {
|
87
|
+
const {
|
88
|
+
disabled,
|
89
|
+
element: targetDocument,
|
90
|
+
callback,
|
91
|
+
contains: containsProp = (parent, child) => !!(parent === null || parent === void 0 ? void 0 : parent.contains(child)),
|
92
|
+
pollDuration = 1000,
|
93
|
+
refs
|
94
|
+
} = options;
|
91
95
|
const timeoutRef = React.useRef();
|
92
96
|
const listener = useEventCallback_1.useEventCallback(e => {
|
93
|
-
|
97
|
+
const contains = containsProp || ((parent, child) => !!(parent === null || parent === void 0 ? void 0 : parent.contains(child)));
|
98
|
+
const isOutside = refs.every(ref => !contains(ref.current || null, e.target));
|
99
|
+
if (isOutside && !disabled) {
|
94
100
|
callback(e);
|
95
101
|
}
|
96
102
|
});
|
97
103
|
// Adds listener to the custom iframe focus event
|
98
104
|
React.useEffect(() => {
|
99
|
-
if (
|
105
|
+
if (!disabled) {
|
100
106
|
targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.addEventListener(FUI_FRAME_EVENT, listener, true);
|
107
|
+
return () => {
|
108
|
+
targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.removeEventListener(FUI_FRAME_EVENT, listener, true);
|
109
|
+
};
|
101
110
|
}
|
102
|
-
|
103
|
-
targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.removeEventListener(FUI_FRAME_EVENT, listener, true);
|
104
|
-
};
|
105
|
-
}, [targetDocument, enableFrameFocusDispatch, listener]);
|
111
|
+
}, [targetDocument, disabled, listener]);
|
106
112
|
// Starts polling for the active element
|
107
113
|
React.useEffect(() => {
|
108
114
|
var _a;
|
109
|
-
if (
|
115
|
+
if (!disabled) {
|
110
116
|
timeoutRef.current = (_a = targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.defaultView) === null || _a === void 0 ? void 0 : _a.setInterval(() => {
|
111
117
|
const activeElement = targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.activeElement;
|
112
118
|
if ((activeElement === null || activeElement === void 0 ? void 0 : activeElement.tagName) === 'IFRAME' || (activeElement === null || activeElement === void 0 ? void 0 : activeElement.tagName) === 'WEBVIEW') {
|
@@ -121,6 +127,6 @@ const useIFrameFocus = (enableFrameFocusDispatch, targetDocument, callback, poll
|
|
121
127
|
var _a;
|
122
128
|
(_a = targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.defaultView) === null || _a === void 0 ? void 0 : _a.clearTimeout(timeoutRef.current);
|
123
129
|
};
|
124
|
-
}, [targetDocument,
|
130
|
+
}, [targetDocument, disabled, pollDuration]);
|
125
131
|
};
|
126
132
|
//# sourceMappingURL=useOnClickOutside.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"mappings":"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","names":["useOnClickOutside","options","refs","callback","element","disabled","contains","containsProp","timeoutId","React","useRef","undefined","useIFrameFocus","listener","useEventCallback_1","ev","parent","child","isOutside","every","ref","current","target","useEffect","currentEvent","getWindowEvent","window","conditionalHandler","event","addEventListener","setTimeout","removeEventListener","clearTimeout","exports","ownerDocument","defaultView","FUI_FRAME_EVENT","enableFrameFocusDispatch","targetDocument","pollDuration","timeoutRef","e","setInterval","activeElement","tagName","CustomEvent","bubbles","dispatchEvent"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/hooks/useOnClickOutside.ts"],"sourcesContent":["import * as React from 'react';\nimport { useEventCallback } from './useEventCallback';\n\n/**\n * @internal\n */\nexport type UseOnClickOrScrollOutsideOptions = {\n /**\n * The element to listen for the click event\n */\n element: Document | undefined;\n /**\n * Refs to elements that check if the click is outside\n */\n refs: React.MutableRefObject<HTMLElement | undefined | null>[];\n\n /**\n * By default uses element.contains, but custom contain function can be provided\n * @param parentRef - provided parent ref\n * @param child - event target element\n */\n contains?(parent: HTMLElement | null, child: HTMLElement): boolean;\n\n /**\n * Disables event listeners\n */\n disabled?: boolean;\n\n /**\n * Called if the click is outside the element refs\n */\n callback: (ev: MouseEvent | TouchEvent) => void;\n};\n\n/**\n * @internal\n * Utility to perform checks where a click/touch event was made outside a component\n */\nexport const useOnClickOutside = (options: UseOnClickOrScrollOutsideOptions) => {\n const { refs, callback, element, disabled, contains: containsProp } = options;\n const timeoutId = React.useRef<number | undefined>(undefined);\n useIFrameFocus(!disabled, element, callback as (e: Event) => void);\n\n const listener = useEventCallback((ev: MouseEvent | TouchEvent) => {\n const contains: UseOnClickOrScrollOutsideOptions['contains'] =\n containsProp || ((parent, child) => !!parent?.contains(child));\n\n const isOutside = refs.every(ref => !contains(ref.current || null, ev.target as HTMLElement));\n if (isOutside && !disabled) {\n callback(ev);\n }\n });\n\n React.useEffect(() => {\n // Store the current event to avoid triggering handlers immediately\n // Note this depends on a deprecated but extremely well supported quirk of the web platform\n // https://github.com/facebook/react/issues/20074\n let currentEvent = getWindowEvent(window);\n\n const conditionalHandler = (event: MouseEvent | TouchEvent) => {\n // Skip if this event is the same as the one running when we added the handlers\n if (event === currentEvent) {\n currentEvent = undefined;\n return;\n }\n\n listener(event);\n };\n\n if (!disabled) {\n // use capture phase because React can update DOM before the event bubbles to the document\n element?.addEventListener('click', conditionalHandler, true);\n element?.addEventListener('touchstart', conditionalHandler, true);\n element?.addEventListener('contextmenu', conditionalHandler, true);\n }\n\n // Garbage collect this event after it's no longer useful to avoid memory leaks\n timeoutId.current = window.setTimeout(() => {\n currentEvent = undefined;\n }, 1);\n\n return () => {\n element?.removeEventListener('click', conditionalHandler, true);\n element?.removeEventListener('touchstart', conditionalHandler, true);\n element?.removeEventListener('contextmenu', conditionalHandler, true);\n\n clearTimeout(timeoutId.current);\n currentEvent = undefined;\n };\n }, [listener, element, disabled]);\n};\n\nconst getWindowEvent = (target: Node | Window): Event | undefined => {\n if (target) {\n if (typeof (target as Window).window === 'object' && (target as Window).window === target) {\n // eslint-disable-next-line deprecation/deprecation\n return target.event;\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (target as Node).ownerDocument?.defaultView?.event ?? undefined;\n }\n\n return undefined;\n};\n\nconst FUI_FRAME_EVENT = 'fuiframefocus';\n\n/**\n * Since click events do not propagate past iframes, we use focus to detect if a\n * click has happened inside an iframe, since the only ways of focusing inside an\n * iframe are:\n * - clicking inside\n * - tabbing inside\n *\n * Polls the value of `document.activeElement`. If it is an iframe, then dispatch\n * a custom DOM event. When the custom event is received call the provided callback\n *\n * @param enableFrameFocusDispatch - boolean flag to start dispatching events\n * @param targetDocument - the document to dispatch events and set timeouts\n * @param pollDuration - in milliseconds\n */\nconst useIFrameFocus = (\n enableFrameFocusDispatch: boolean,\n targetDocument: Document | undefined,\n callback: (e: Event) => void,\n pollDuration: number = 1000,\n) => {\n const timeoutRef = React.useRef<number>();\n\n const listener = useEventCallback((e: Event) => {\n if (callback) {\n callback(e);\n }\n });\n\n // Adds listener to the custom iframe focus event\n React.useEffect(() => {\n if (enableFrameFocusDispatch) {\n targetDocument?.addEventListener(FUI_FRAME_EVENT, listener, true);\n }\n return () => {\n targetDocument?.removeEventListener(FUI_FRAME_EVENT, listener, true);\n };\n }, [targetDocument, enableFrameFocusDispatch, listener]);\n\n // Starts polling for the active element\n React.useEffect(() => {\n if (enableFrameFocusDispatch) {\n timeoutRef.current = targetDocument?.defaultView?.setInterval(() => {\n const activeElement = targetDocument?.activeElement;\n if (activeElement?.tagName === 'IFRAME' || activeElement?.tagName === 'WEBVIEW') {\n const event = new CustomEvent(FUI_FRAME_EVENT, { bubbles: true });\n activeElement.dispatchEvent(event);\n }\n }, pollDuration);\n }\n return () => {\n targetDocument?.defaultView?.clearTimeout(timeoutRef.current);\n };\n }, [targetDocument, enableFrameFocusDispatch, pollDuration]);\n};\n"]}
|
1
|
+
{"version":3,"mappings":"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","names":["useOnClickOutside","options","refs","callback","element","disabled","contains","containsProp","timeoutId","React","useRef","undefined","useIFrameFocus","listener","useEventCallback_1","ev","parent","child","isOutside","every","ref","current","target","useEffect","currentEvent","getWindowEvent","window","conditionalHandler","event","addEventListener","setTimeout","removeEventListener","clearTimeout","exports","ownerDocument","defaultView","FUI_FRAME_EVENT","targetDocument","pollDuration","timeoutRef","e","setInterval","activeElement","tagName","CustomEvent","bubbles","dispatchEvent"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/hooks/useOnClickOutside.ts"],"sourcesContent":["import * as React from 'react';\nimport { useEventCallback } from './useEventCallback';\n\n/**\n * @internal\n */\nexport type UseOnClickOrScrollOutsideOptions = {\n /**\n * The element to listen for the click event\n */\n element: Document | undefined;\n /**\n * Refs to elements that check if the click is outside\n */\n refs: React.MutableRefObject<HTMLElement | undefined | null>[];\n\n /**\n * By default uses element.contains, but custom contain function can be provided\n * @param parentRef - provided parent ref\n * @param child - event target element\n */\n contains?(parent: HTMLElement | null, child: HTMLElement): boolean;\n\n /**\n * Disables event listeners\n */\n disabled?: boolean;\n\n /**\n * Called if the click is outside the element refs\n */\n callback: (ev: MouseEvent | TouchEvent) => void;\n};\n\n/**\n * @internal\n * Utility to perform checks where a click/touch event was made outside a component\n */\nexport const useOnClickOutside = (options: UseOnClickOrScrollOutsideOptions) => {\n const { refs, callback, element, disabled, contains: containsProp } = options;\n const timeoutId = React.useRef<number | undefined>(undefined);\n useIFrameFocus(options);\n\n const listener = useEventCallback((ev: MouseEvent | TouchEvent) => {\n const contains: UseOnClickOrScrollOutsideOptions['contains'] =\n containsProp || ((parent, child) => !!parent?.contains(child));\n\n const isOutside = refs.every(ref => !contains(ref.current || null, ev.target as HTMLElement));\n if (isOutside && !disabled) {\n callback(ev);\n }\n });\n\n React.useEffect(() => {\n // Store the current event to avoid triggering handlers immediately\n // Note this depends on a deprecated but extremely well supported quirk of the web platform\n // https://github.com/facebook/react/issues/20074\n let currentEvent = getWindowEvent(window);\n\n const conditionalHandler = (event: MouseEvent | TouchEvent) => {\n // Skip if this event is the same as the one running when we added the handlers\n if (event === currentEvent) {\n currentEvent = undefined;\n return;\n }\n\n listener(event);\n };\n\n if (!disabled) {\n // use capture phase because React can update DOM before the event bubbles to the document\n element?.addEventListener('click', conditionalHandler, true);\n element?.addEventListener('touchstart', conditionalHandler, true);\n element?.addEventListener('contextmenu', conditionalHandler, true);\n }\n\n // Garbage collect this event after it's no longer useful to avoid memory leaks\n timeoutId.current = window.setTimeout(() => {\n currentEvent = undefined;\n }, 1);\n\n return () => {\n element?.removeEventListener('click', conditionalHandler, true);\n element?.removeEventListener('touchstart', conditionalHandler, true);\n element?.removeEventListener('contextmenu', conditionalHandler, true);\n\n clearTimeout(timeoutId.current);\n currentEvent = undefined;\n };\n }, [listener, element, disabled]);\n};\n\nconst getWindowEvent = (target: Node | Window): Event | undefined => {\n if (target) {\n if (typeof (target as Window).window === 'object' && (target as Window).window === target) {\n // eslint-disable-next-line deprecation/deprecation\n return target.event;\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (target as Node).ownerDocument?.defaultView?.event ?? undefined;\n }\n\n return undefined;\n};\n\nconst FUI_FRAME_EVENT = 'fuiframefocus';\n\ninterface UseIFrameFocusOptions extends UseOnClickOrScrollOutsideOptions {\n /**\n * Millisecond duration to poll\n */\n pollDuration?: number;\n}\n\n/**\n * Since click events do not propagate past iframes, we use focus to detect if a\n * click has happened inside an iframe, since the only ways of focusing inside an\n * iframe are:\n * - clicking inside\n * - tabbing inside\n *\n * Polls the value of `document.activeElement`. If it is an iframe, then dispatch\n * a custom DOM event. When the custom event is received call the provided callback\n */\nconst useIFrameFocus = (options: UseIFrameFocusOptions) => {\n const {\n disabled,\n element: targetDocument,\n callback,\n contains: containsProp = (parent, child) => !!parent?.contains(child),\n pollDuration = 1000,\n refs,\n } = options;\n const timeoutRef = React.useRef<number>();\n\n const listener = useEventCallback((e: Event) => {\n const contains = containsProp || ((parent, child) => !!parent?.contains(child));\n\n const isOutside = refs.every(ref => !contains(ref.current || null, e.target as HTMLElement));\n if (isOutside && !disabled) {\n callback(e as MouseEvent);\n }\n });\n\n // Adds listener to the custom iframe focus event\n React.useEffect(() => {\n if (!disabled) {\n targetDocument?.addEventListener(FUI_FRAME_EVENT, listener, true);\n return () => {\n targetDocument?.removeEventListener(FUI_FRAME_EVENT, listener, true);\n };\n }\n }, [targetDocument, disabled, listener]);\n\n // Starts polling for the active element\n React.useEffect(() => {\n if (!disabled) {\n timeoutRef.current = targetDocument?.defaultView?.setInterval(() => {\n const activeElement = targetDocument?.activeElement;\n if (activeElement?.tagName === 'IFRAME' || activeElement?.tagName === 'WEBVIEW') {\n const event = new CustomEvent(FUI_FRAME_EVENT, { bubbles: true });\n activeElement.dispatchEvent(event);\n }\n }, pollDuration);\n }\n return () => {\n targetDocument?.defaultView?.clearTimeout(timeoutRef.current);\n };\n }, [targetDocument, disabled, pollDuration]);\n};\n"]}
|
package/lib-commonjs/index.js
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.isFluentTrigger = exports.getTriggerChild = exports.applyTriggerPropsToChildren = exports.isInteractiveHTMLElement = exports.isHTMLElement = exports.mergeCallbacks = exports.getRTLSafeKey = exports.getPartitionedNativeProps = exports.getNativeElementProps = exports.clamp = exports.SSRProvider = exports.useIsSSR = exports.canUseDOM = exports.useTimeout = exports.useScrollbarWidth = exports.usePrevious = exports.useOnScrollOutside = exports.useOnClickOutside = exports.useMergedRefs = exports.useIsomorphicLayoutEffect = exports.useId = exports.useForceUpdate = exports.useFirstMount = exports.useEventCallback = exports.useControllableState = exports.resetIdsForTests = exports.IdPrefixProvider = exports.isResolvedShorthand = exports.resolveShorthand = exports.getSlots = void 0;
|
6
|
+
exports.getEventClientCoords = exports.isMouseEvent = exports.isTouchEvent = exports.isFluentTrigger = exports.getTriggerChild = exports.applyTriggerPropsToChildren = exports.isInteractiveHTMLElement = exports.isHTMLElement = exports.mergeCallbacks = exports.getRTLSafeKey = exports.getPartitionedNativeProps = exports.getNativeElementProps = exports.clamp = exports.SSRProvider = exports.useIsSSR = exports.canUseDOM = exports.useTimeout = exports.useScrollbarWidth = exports.usePrevious = exports.useOnScrollOutside = exports.useOnClickOutside = exports.useMergedRefs = exports.useIsomorphicLayoutEffect = exports.useId = exports.useForceUpdate = exports.useFirstMount = exports.useEventCallback = exports.useControllableState = exports.resetIdsForTests = exports.IdPrefixProvider = exports.isResolvedShorthand = exports.resolveShorthand = exports.getSlots = void 0;
|
7
7
|
var index_1 = /*#__PURE__*/require("./compose/index");
|
8
8
|
Object.defineProperty(exports, "getSlots", {
|
9
9
|
enumerable: true,
|
@@ -189,4 +189,23 @@ Object.defineProperty(exports, "isFluentTrigger", {
|
|
189
189
|
return index_5.isFluentTrigger;
|
190
190
|
}
|
191
191
|
});
|
192
|
+
var index_6 = /*#__PURE__*/require("./events/index");
|
193
|
+
Object.defineProperty(exports, "isTouchEvent", {
|
194
|
+
enumerable: true,
|
195
|
+
get: function () {
|
196
|
+
return index_6.isTouchEvent;
|
197
|
+
}
|
198
|
+
});
|
199
|
+
Object.defineProperty(exports, "isMouseEvent", {
|
200
|
+
enumerable: true,
|
201
|
+
get: function () {
|
202
|
+
return index_6.isMouseEvent;
|
203
|
+
}
|
204
|
+
});
|
205
|
+
Object.defineProperty(exports, "getEventClientCoords", {
|
206
|
+
enumerable: true,
|
207
|
+
get: function () {
|
208
|
+
return index_6.getEventClientCoords;
|
209
|
+
}
|
210
|
+
});
|
192
211
|
//# sourceMappingURL=index.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"mappings":";;;;;;AAAA;AAASA;EAAAC;EAAAC;IAAA,uBAAQ;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,+BAAgB;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,kCAAmB;EAAA;AAAA;AAgBxD;AACEF;EAAAC;EAAAC;IAAA,+BAAgB;EAAA;AAAA;AAChBF;EAAAC;EAAAC;IAAA,+BAAgB;EAAA;AAAA;AAChBF;EAAAC;EAAAC;IAAA,mCAAoB;EAAA;AAAA;AACpBF;EAAAC;EAAAC;IAAA,+BAAgB;EAAA;AAAA;AAChBF;EAAAC;EAAAC;IAAA,4BAAa;EAAA;AAAA;AACbF;EAAAC;EAAAC;IAAA,6BAAc;EAAA;AAAA;AACdF;EAAAC;EAAAC;IAAA,oBAAK;EAAA;AAAA;AACLF;EAAAC;EAAAC;IAAA,wCAAyB;EAAA;AAAA;AACzBF;EAAAC;EAAAC;IAAA,4BAAa;EAAA;AAAA;AACbF;EAAAC;EAAAC;IAAA,gCAAiB;EAAA;AAAA;AACjBF;EAAAC;EAAAC;IAAA,iCAAkB;EAAA;AAAA;AAClBF;EAAAC;EAAAC;IAAA,0BAAW;EAAA;AAAA;AACXF;EAAAC;EAAAC;IAAA,gCAAiB;EAAA;AAAA;AACjBF;EAAAC;EAAAC;IAAA,yBAAU;EAAA;AAAA;AAIZ;AAASF;EAAAC;EAAAC;IAAA,wBAAS;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,uBAAQ;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,0BAAW;EAAA;AAAA;AAEzC;AACEF;EAAAC;EAAAC;IAAA,oBAAK;EAAA;AAAA;AACLF;EAAAC;EAAAC;IAAA,oCAAqB;EAAA;AAAA;AACrBF;EAAAC;EAAAC;IAAA,wCAAyB;EAAA;AAAA;AACzBF;EAAAC;EAAAC;IAAA,4BAAa;EAAA;AAAA;AACbF;EAAAC;EAAAC;IAAA,6BAAc;EAAA;AAAA;AACdF;EAAAC;EAAAC;IAAA,4BAAa;EAAA;AAAA;AACbF;EAAAC;EAAAC;IAAA,uCAAwB;EAAA;AAAA;AAG1B;AAASF;EAAAC;EAAAC;IAAA,0CAA2B;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,8BAAe;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,8BAAe;EAAA;AAAA","names":["Object","enumerable","get"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/index.ts"],"sourcesContent":["export { getSlots, resolveShorthand, isResolvedShorthand } from './compose/index';\nexport type {\n ExtractSlotProps,\n ComponentProps,\n ComponentState,\n ForwardRefComponent,\n ResolveShorthandFunction,\n ResolveShorthandOptions,\n Slot,\n Slots,\n SlotClassNames,\n SlotPropsRecord,\n SlotRenderFunction,\n SlotShorthandValue,\n} from './compose/index';\n\nexport {\n IdPrefixProvider,\n resetIdsForTests,\n useControllableState,\n useEventCallback,\n useFirstMount,\n useForceUpdate,\n useId,\n useIsomorphicLayoutEffect,\n useMergedRefs,\n useOnClickOutside,\n useOnScrollOutside,\n usePrevious,\n useScrollbarWidth,\n useTimeout,\n} from './hooks/index';\nexport type { RefObjectFunction, UseControllableStateOptions, UseOnClickOrScrollOutsideOptions } from './hooks/index';\n\nexport { canUseDOM, useIsSSR, SSRProvider } from './ssr/index';\n\nexport {\n clamp,\n getNativeElementProps,\n getPartitionedNativeProps,\n getRTLSafeKey,\n mergeCallbacks,\n isHTMLElement,\n isInteractiveHTMLElement,\n} from './utils/index';\n\nexport { applyTriggerPropsToChildren, getTriggerChild, isFluentTrigger } from './trigger/index';\n\nexport type { FluentTriggerComponent, TriggerProps } from './trigger/index';\n"]}
|
1
|
+
{"version":3,"mappings":";;;;;;AAAA;AAASA;EAAAC;EAAAC;IAAA,uBAAQ;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,+BAAgB;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,kCAAmB;EAAA;AAAA;AAgBxD;AACEF;EAAAC;EAAAC;IAAA,+BAAgB;EAAA;AAAA;AAChBF;EAAAC;EAAAC;IAAA,+BAAgB;EAAA;AAAA;AAChBF;EAAAC;EAAAC;IAAA,mCAAoB;EAAA;AAAA;AACpBF;EAAAC;EAAAC;IAAA,+BAAgB;EAAA;AAAA;AAChBF;EAAAC;EAAAC;IAAA,4BAAa;EAAA;AAAA;AACbF;EAAAC;EAAAC;IAAA,6BAAc;EAAA;AAAA;AACdF;EAAAC;EAAAC;IAAA,oBAAK;EAAA;AAAA;AACLF;EAAAC;EAAAC;IAAA,wCAAyB;EAAA;AAAA;AACzBF;EAAAC;EAAAC;IAAA,4BAAa;EAAA;AAAA;AACbF;EAAAC;EAAAC;IAAA,gCAAiB;EAAA;AAAA;AACjBF;EAAAC;EAAAC;IAAA,iCAAkB;EAAA;AAAA;AAClBF;EAAAC;EAAAC;IAAA,0BAAW;EAAA;AAAA;AACXF;EAAAC;EAAAC;IAAA,gCAAiB;EAAA;AAAA;AACjBF;EAAAC;EAAAC;IAAA,yBAAU;EAAA;AAAA;AAIZ;AAASF;EAAAC;EAAAC;IAAA,wBAAS;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,uBAAQ;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,0BAAW;EAAA;AAAA;AAEzC;AACEF;EAAAC;EAAAC;IAAA,oBAAK;EAAA;AAAA;AACLF;EAAAC;EAAAC;IAAA,oCAAqB;EAAA;AAAA;AACrBF;EAAAC;EAAAC;IAAA,wCAAyB;EAAA;AAAA;AACzBF;EAAAC;EAAAC;IAAA,4BAAa;EAAA;AAAA;AACbF;EAAAC;EAAAC;IAAA,6BAAc;EAAA;AAAA;AACdF;EAAAC;EAAAC;IAAA,4BAAa;EAAA;AAAA;AACbF;EAAAC;EAAAC;IAAA,uCAAwB;EAAA;AAAA;AAG1B;AAASF;EAAAC;EAAAC;IAAA,0CAA2B;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,8BAAe;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,8BAAe;EAAA;AAAA;AAQtE;AAASF;EAAAC;EAAAC;IAAA,2BAAY;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,2BAAY;EAAA;AAAA;AAAEF;EAAAC;EAAAC;IAAA,mCAAoB;EAAA;AAAA","names":["Object","enumerable","get"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/index.ts"],"sourcesContent":["export { getSlots, resolveShorthand, isResolvedShorthand } from './compose/index';\nexport type {\n ExtractSlotProps,\n ComponentProps,\n ComponentState,\n ForwardRefComponent,\n ResolveShorthandFunction,\n ResolveShorthandOptions,\n Slot,\n Slots,\n SlotClassNames,\n SlotPropsRecord,\n SlotRenderFunction,\n SlotShorthandValue,\n} from './compose/index';\n\nexport {\n IdPrefixProvider,\n resetIdsForTests,\n useControllableState,\n useEventCallback,\n useFirstMount,\n useForceUpdate,\n useId,\n useIsomorphicLayoutEffect,\n useMergedRefs,\n useOnClickOutside,\n useOnScrollOutside,\n usePrevious,\n useScrollbarWidth,\n useTimeout,\n} from './hooks/index';\nexport type { RefObjectFunction, UseControllableStateOptions, UseOnClickOrScrollOutsideOptions } from './hooks/index';\n\nexport { canUseDOM, useIsSSR, SSRProvider } from './ssr/index';\n\nexport {\n clamp,\n getNativeElementProps,\n getPartitionedNativeProps,\n getRTLSafeKey,\n mergeCallbacks,\n isHTMLElement,\n isInteractiveHTMLElement,\n} from './utils/index';\n\nexport { applyTriggerPropsToChildren, getTriggerChild, isFluentTrigger } from './trigger/index';\n\nexport type { FluentTriggerComponent, TriggerProps } from './trigger/index';\n\n/**\n * Event utils\n */\nexport type { NativeTouchOrMouseEvent, ReactTouchOrMouseEvent, TouchOrMouseEvent } from './events/index';\nexport { isTouchEvent, isMouseEvent, getEventClientCoords } from './events/index';\n"]}
|