@fluentui/react-utilities 9.5.2 → 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.
Files changed (34) hide show
  1. package/CHANGELOG.json +39 -1
  2. package/CHANGELOG.md +24 -2
  3. package/dist/index.d.ts +25 -0
  4. package/lib/compose/resolveShorthand.js +3 -1
  5. package/lib/compose/resolveShorthand.js.map +1 -1
  6. package/lib/events/index.js +2 -0
  7. package/lib/events/index.js.map +1 -0
  8. package/lib/events/mouseTouchHelpers.js +38 -0
  9. package/lib/events/mouseTouchHelpers.js.map +1 -0
  10. package/lib/hooks/useOnClickOutside.js +20 -14
  11. package/lib/hooks/useOnClickOutside.js.map +1 -1
  12. package/lib/index.js +1 -0
  13. package/lib/index.js.map +1 -1
  14. package/lib-amd/compose/resolveShorthand.js +1 -1
  15. package/lib-amd/compose/resolveShorthand.js.map +1 -1
  16. package/lib-amd/events/index.js +6 -0
  17. package/lib-amd/events/index.js.map +1 -0
  18. package/lib-amd/events/mouseTouchHelpers.js +39 -0
  19. package/lib-amd/events/mouseTouchHelpers.js.map +1 -0
  20. package/lib-amd/hooks/useOnClickOutside.js +13 -15
  21. package/lib-amd/hooks/useOnClickOutside.js.map +1 -1
  22. package/lib-amd/index.js +5 -2
  23. package/lib-amd/index.js.map +1 -1
  24. package/lib-commonjs/compose/resolveShorthand.js +3 -1
  25. package/lib-commonjs/compose/resolveShorthand.js.map +1 -1
  26. package/lib-commonjs/events/index.js +8 -0
  27. package/lib-commonjs/events/index.js.map +1 -0
  28. package/lib-commonjs/events/mouseTouchHelpers.js +47 -0
  29. package/lib-commonjs/events/mouseTouchHelpers.js.map +1 -0
  30. package/lib-commonjs/hooks/useOnClickOutside.js +20 -14
  31. package/lib-commonjs/hooks/useOnClickOutside.js.map +1 -1
  32. package/lib-commonjs/index.js +20 -1
  33. package/lib-commonjs/index.js.map +1 -1
  34. package/package.json +1 -1
package/CHANGELOG.json CHANGED
@@ -2,7 +2,45 @@
2
2
  "name": "@fluentui/react-utilities",
3
3
  "entries": [
4
4
  {
5
- "date": "Fri, 10 Feb 2023 08:46:47 GMT",
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",
29
+ "tag": "@fluentui/react-utilities_v9.5.3",
30
+ "version": "9.5.3",
31
+ "comments": {
32
+ "patch": [
33
+ {
34
+ "author": "yuanboxue@microsoft.com",
35
+ "package": "@fluentui/react-utilities",
36
+ "commit": "3d12f79c3d790ac28b00f54dd8fc6d23970cf6ed",
37
+ "comment": "fix: `resolveShorthand` should resolve an object as its copy"
38
+ }
39
+ ]
40
+ }
41
+ },
42
+ {
43
+ "date": "Fri, 10 Feb 2023 08:50:01 GMT",
6
44
  "tag": "@fluentui/react-utilities_v9.5.2",
7
45
  "version": "9.5.2",
8
46
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,34 @@
1
1
  # Change Log - @fluentui/react-utilities
2
2
 
3
- This log was last generated on Fri, 10 Feb 2023 08:46:47 GMT and should not be manually modified.
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
+
20
+ ## [9.5.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-utilities_v9.5.3)
21
+
22
+ Mon, 13 Feb 2023 23:43:13 GMT
23
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-utilities_v9.5.2..@fluentui/react-utilities_v9.5.3)
24
+
25
+ ### Patches
26
+
27
+ - fix: `resolveShorthand` should resolve an object as its copy ([PR #26825](https://github.com/microsoft/fluentui/pull/26825) by yuanboxue@microsoft.com)
28
+
7
29
  ## [9.5.2](https://github.com/microsoft/fluentui/tree/@fluentui/react-utilities_v9.5.2)
8
30
 
9
- Fri, 10 Feb 2023 08:46:47 GMT
31
+ Fri, 10 Feb 2023 08:50:01 GMT
10
32
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-utilities_v9.5.1..@fluentui/react-utilities_v9.5.2)
11
33
 
12
34
  ### 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
@@ -17,7 +17,9 @@ export const resolveShorthand = (value, options) => {
17
17
  if (typeof value === 'string' || typeof value === 'number' || Array.isArray(value) || /*#__PURE__*/isValidElement(value)) {
18
18
  resolvedShorthand.children = value;
19
19
  } else if (typeof value === 'object') {
20
- resolvedShorthand = value;
20
+ resolvedShorthand = {
21
+ ...value
22
+ };
21
23
  }
22
24
  return defaultProps ? {
23
25
  ...defaultProps,
@@ -1 +1 @@
1
- {"version":3,"mappings":"AAAA,SAASA,cAAc,QAAQ,OAAO;AAkBtC;;;;;;AAMA,OAAO,MAAMC,gBAAgB,GAA6B,CAACC,KAAK,EAAEC,OAAO,KAAI;EAC3E,MAAM;IAAEC,QAAQ,GAAG,KAAK;IAAEC;EAAY,CAAE,GAAGF,OAAO,IAAI,EAAE;EACxD,IAAID,KAAK,KAAK,IAAI,IAAKA,KAAK,KAAKI,SAAS,IAAI,CAACF,QAAS,EAAE;IACxD,OAAOE,SAAS;;EAGlB,IAAIC,iBAAiB,GAAG,EAAsB;EAE9C,IAAI,OAAOL,KAAK,KAAK,QAAQ,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIM,KAAK,CAACC,OAAO,CAACP,KAAK,CAAC,iBAAIF,cAAc,CAACE,KAAK,CAAC,EAAE;IAC3GK,iBAAiB,CAACG,QAAQ,GAAGR,KAAK;GACnC,MAAM,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IACpCK,iBAAiB,GAAGL,KAAK;;EAG3B,OAAOG,YAAY,GAAG;IAAE,GAAGA,YAAY;IAAE,GAAGE;EAAiB,CAAE,GAAGA,iBAAiB;AACrF,CAAC","names":["isValidElement","resolveShorthand","value","options","required","defaultProps","undefined","resolvedShorthand","Array","isArray","children"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/compose/resolveShorthand.ts"],"sourcesContent":["import { isValidElement } from 'react';\nimport type { ReplaceNullWithUndefined, SlotShorthandValue, UnknownSlotProps } from './types';\n\nexport type ResolveShorthandOptions<Props, Required extends boolean = false> = {\n required?: Required;\n defaultProps?: Props;\n};\n\nexport type ResolveShorthandFunction<Props extends UnknownSlotProps = UnknownSlotProps> = {\n <P extends Props | null>(\n value: P | SlotShorthandValue | undefined,\n options?: ResolveShorthandOptions<P, true>,\n ): ReplaceNullWithUndefined<P>;\n <P extends Props | null>(value: P | SlotShorthandValue | undefined, options?: ResolveShorthandOptions<P, boolean>):\n | ReplaceNullWithUndefined<P>\n | undefined;\n};\n\n/**\n * Resolves shorthands into slot props, to ensure normalization of the signature\n * being passed down to getSlots method\n * @param value - the base shorthand props\n * @param options - options to resolve shorthand props\n */\nexport const resolveShorthand: ResolveShorthandFunction = (value, options) => {\n const { required = false, defaultProps } = options || {};\n if (value === null || (value === undefined && !required)) {\n return undefined;\n }\n\n let resolvedShorthand = {} as UnknownSlotProps;\n\n if (typeof value === 'string' || typeof value === 'number' || Array.isArray(value) || isValidElement(value)) {\n resolvedShorthand.children = value;\n } else if (typeof value === 'object') {\n resolvedShorthand = value;\n }\n\n return defaultProps ? { ...defaultProps, ...resolvedShorthand } : resolvedShorthand;\n};\n"]}
1
+ {"version":3,"mappings":"AAAA,SAASA,cAAc,QAAQ,OAAO;AAkBtC;;;;;;AAMA,OAAO,MAAMC,gBAAgB,GAA6B,CAACC,KAAK,EAAEC,OAAO,KAAI;EAC3E,MAAM;IAAEC,QAAQ,GAAG,KAAK;IAAEC;EAAY,CAAE,GAAGF,OAAO,IAAI,EAAE;EACxD,IAAID,KAAK,KAAK,IAAI,IAAKA,KAAK,KAAKI,SAAS,IAAI,CAACF,QAAS,EAAE;IACxD,OAAOE,SAAS;;EAGlB,IAAIC,iBAAiB,GAAG,EAAsB;EAE9C,IAAI,OAAOL,KAAK,KAAK,QAAQ,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIM,KAAK,CAACC,OAAO,CAACP,KAAK,CAAC,iBAAIF,cAAc,CAACE,KAAK,CAAC,EAAE;IAC3GK,iBAAiB,CAACG,QAAQ,GAAGR,KAAK;GACnC,MAAM,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IACpCK,iBAAiB,GAAG;MAAE,GAAGL;IAAK,CAAE;;EAGlC,OAAOG,YAAY,GAAG;IAAE,GAAGA,YAAY;IAAE,GAAGE;EAAiB,CAAE,GAAGA,iBAAiB;AACrF,CAAC","names":["isValidElement","resolveShorthand","value","options","required","defaultProps","undefined","resolvedShorthand","Array","isArray","children"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/compose/resolveShorthand.ts"],"sourcesContent":["import { isValidElement } from 'react';\nimport type { ReplaceNullWithUndefined, SlotShorthandValue, UnknownSlotProps } from './types';\n\nexport type ResolveShorthandOptions<Props, Required extends boolean = false> = {\n required?: Required;\n defaultProps?: Props;\n};\n\nexport type ResolveShorthandFunction<Props extends UnknownSlotProps = UnknownSlotProps> = {\n <P extends Props | null>(\n value: P | SlotShorthandValue | undefined,\n options?: ResolveShorthandOptions<P, true>,\n ): ReplaceNullWithUndefined<P>;\n <P extends Props | null>(value: P | SlotShorthandValue | undefined, options?: ResolveShorthandOptions<P, boolean>):\n | ReplaceNullWithUndefined<P>\n | undefined;\n};\n\n/**\n * Resolves shorthands into slot props, to ensure normalization of the signature\n * being passed down to getSlots method\n * @param value - the base shorthand props\n * @param options - options to resolve shorthand props\n */\nexport const resolveShorthand: ResolveShorthandFunction = (value, options) => {\n const { required = false, defaultProps } = options || {};\n if (value === null || (value === undefined && !required)) {\n return undefined;\n }\n\n let resolvedShorthand = {} as UnknownSlotProps;\n\n if (typeof value === 'string' || typeof value === 'number' || Array.isArray(value) || isValidElement(value)) {\n resolvedShorthand.children = value;\n } else if (typeof value === 'object') {\n resolvedShorthand = { ...value };\n }\n\n return defaultProps ? { ...defaultProps, ...resolvedShorthand } : resolvedShorthand;\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './mouseTouchHelpers';
2
+ //# sourceMappingURL=index.js.map
@@ -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(!disabled, element, callback);
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 = (enableFrameFocusDispatch, targetDocument, callback, pollDuration = 1000) => {
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
- if (callback) {
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 (enableFrameFocusDispatch) {
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
- return () => {
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 (enableFrameFocusDispatch) {
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, enableFrameFocusDispatch, pollDuration]);
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"]}
@@ -18,7 +18,7 @@ define(["require", "exports", "tslib", "react"], function (require, exports, tsl
18
18
  resolvedShorthand.children = value;
19
19
  }
20
20
  else if (typeof value === 'object') {
21
- resolvedShorthand = value;
21
+ resolvedShorthand = tslib_1.__assign({}, value);
22
22
  }
23
23
  return defaultProps ? tslib_1.__assign(tslib_1.__assign({}, defaultProps), resolvedShorthand) : resolvedShorthand;
24
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"resolveShorthand.js","sourceRoot":"","sources":["../../../../../../../../packages/react-components/react-utilities/src/compose/resolveShorthand.ts"],"names":[],"mappings":";;;;IAkBA;;;;;OAKG;IACI,IAAM,gBAAgB,GAA6B,UAAC,KAAK,EAAE,OAAO;QACjE,IAAA,KAAqC,OAAO,IAAI,EAAE,EAAhD,gBAAgB,EAAhB,QAAQ,mBAAG,KAAK,KAAA,EAAE,YAAY,kBAAkB,CAAC;QACzD,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,EAAE;YACxD,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,iBAAiB,GAAG,EAAsB,CAAC;QAE/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,sBAAc,CAAC,KAAK,CAAC,EAAE;YAC3G,iBAAiB,CAAC,QAAQ,GAAG,KAAK,CAAC;SACpC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YACpC,iBAAiB,GAAG,KAAK,CAAC;SAC3B;QAED,OAAO,YAAY,CAAC,CAAC,uCAAM,YAAY,GAAK,iBAAiB,EAAG,CAAC,CAAC,iBAAiB,CAAC;IACtF,CAAC,CAAC;IAfW,QAAA,gBAAgB,oBAe3B","sourcesContent":["import { isValidElement } from 'react';\nimport type { ReplaceNullWithUndefined, SlotShorthandValue, UnknownSlotProps } from './types';\n\nexport type ResolveShorthandOptions<Props, Required extends boolean = false> = {\n required?: Required;\n defaultProps?: Props;\n};\n\nexport type ResolveShorthandFunction<Props extends UnknownSlotProps = UnknownSlotProps> = {\n <P extends Props | null>(\n value: P | SlotShorthandValue | undefined,\n options?: ResolveShorthandOptions<P, true>,\n ): ReplaceNullWithUndefined<P>;\n <P extends Props | null>(value: P | SlotShorthandValue | undefined, options?: ResolveShorthandOptions<P, boolean>):\n | ReplaceNullWithUndefined<P>\n | undefined;\n};\n\n/**\n * Resolves shorthands into slot props, to ensure normalization of the signature\n * being passed down to getSlots method\n * @param value - the base shorthand props\n * @param options - options to resolve shorthand props\n */\nexport const resolveShorthand: ResolveShorthandFunction = (value, options) => {\n const { required = false, defaultProps } = options || {};\n if (value === null || (value === undefined && !required)) {\n return undefined;\n }\n\n let resolvedShorthand = {} as UnknownSlotProps;\n\n if (typeof value === 'string' || typeof value === 'number' || Array.isArray(value) || isValidElement(value)) {\n resolvedShorthand.children = value;\n } else if (typeof value === 'object') {\n resolvedShorthand = value;\n }\n\n return defaultProps ? { ...defaultProps, ...resolvedShorthand } : resolvedShorthand;\n};\n"]}
1
+ {"version":3,"file":"resolveShorthand.js","sourceRoot":"","sources":["../../../../../../../../packages/react-components/react-utilities/src/compose/resolveShorthand.ts"],"names":[],"mappings":";;;;IAkBA;;;;;OAKG;IACI,IAAM,gBAAgB,GAA6B,UAAC,KAAK,EAAE,OAAO;QACjE,IAAA,KAAqC,OAAO,IAAI,EAAE,EAAhD,gBAAgB,EAAhB,QAAQ,mBAAG,KAAK,KAAA,EAAE,YAAY,kBAAkB,CAAC;QACzD,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,EAAE;YACxD,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,iBAAiB,GAAG,EAAsB,CAAC;QAE/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,sBAAc,CAAC,KAAK,CAAC,EAAE;YAC3G,iBAAiB,CAAC,QAAQ,GAAG,KAAK,CAAC;SACpC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YACpC,iBAAiB,wBAAQ,KAAK,CAAE,CAAC;SAClC;QAED,OAAO,YAAY,CAAC,CAAC,uCAAM,YAAY,GAAK,iBAAiB,EAAG,CAAC,CAAC,iBAAiB,CAAC;IACtF,CAAC,CAAC;IAfW,QAAA,gBAAgB,oBAe3B","sourcesContent":["import { isValidElement } from 'react';\nimport type { ReplaceNullWithUndefined, SlotShorthandValue, UnknownSlotProps } from './types';\n\nexport type ResolveShorthandOptions<Props, Required extends boolean = false> = {\n required?: Required;\n defaultProps?: Props;\n};\n\nexport type ResolveShorthandFunction<Props extends UnknownSlotProps = UnknownSlotProps> = {\n <P extends Props | null>(\n value: P | SlotShorthandValue | undefined,\n options?: ResolveShorthandOptions<P, true>,\n ): ReplaceNullWithUndefined<P>;\n <P extends Props | null>(value: P | SlotShorthandValue | undefined, options?: ResolveShorthandOptions<P, boolean>):\n | ReplaceNullWithUndefined<P>\n | undefined;\n};\n\n/**\n * Resolves shorthands into slot props, to ensure normalization of the signature\n * being passed down to getSlots method\n * @param value - the base shorthand props\n * @param options - options to resolve shorthand props\n */\nexport const resolveShorthand: ResolveShorthandFunction = (value, options) => {\n const { required = false, defaultProps } = options || {};\n if (value === null || (value === undefined && !required)) {\n return undefined;\n }\n\n let resolvedShorthand = {} as UnknownSlotProps;\n\n if (typeof value === 'string' || typeof value === 'number' || Array.isArray(value) || isValidElement(value)) {\n resolvedShorthand.children = value;\n } else if (typeof value === 'object') {\n resolvedShorthand = { ...value };\n }\n\n return defaultProps ? { ...defaultProps, ...resolvedShorthand } : resolvedShorthand;\n};\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(!disabled, element, callback);
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 (enableFrameFocusDispatch, targetDocument, callback, pollDuration) {
81
- if (pollDuration === void 0) { pollDuration = 1000; }
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
- if (callback) {
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 (enableFrameFocusDispatch) {
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
- return function () {
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 (enableFrameFocusDispatch) {
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, enableFrameFocusDispatch, pollDuration]);
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":";;;;IAkCA;;;OAGG;IACI,IAAM,iBAAiB,GAAG,UAAC,OAAyC;QACjE,IAAA,IAAI,GAA0D,OAAO,KAAjE,EAAE,QAAQ,GAAgD,OAAO,SAAvD,EAAE,OAAO,GAAuC,OAAO,QAA9C,EAAE,QAAQ,GAA6B,OAAO,SAApC,EAAY,YAAY,GAAK,OAAO,SAAZ,CAAa;QAC9E,IAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAqB,SAAS,CAAC,CAAC;QAC9D,cAAc,CAAC,OAAO,CAAC,CAAC;QAExB,IAAM,QAAQ,GAAG,mCAAgB,CAAC,UAAC,EAA2B;YAC5D,IAAM,QAAQ,GACZ,YAAY,IAAI,CAAC,UAAC,MAAM,EAAE,KAAK,IAAK,OAAA,CAAC,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,CAAC,KAAK,CAAC,CAAA,EAAzB,CAAyB,CAAC,CAAC;YAEjE,IAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAA,GAAG,IAAI,OAAA,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,EAAE,CAAC,MAAqB,CAAC,EAAxD,CAAwD,CAAC,CAAC;YAC9F,IAAI,SAAS,IAAI,CAAC,QAAQ,EAAE;gBAC1B,QAAQ,CAAC,EAAE,CAAC,CAAC;aACd;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,SAAS,CAAC;YACd,mEAAmE;YACnE,2FAA2F;YAC3F,iDAAiD;YACjD,IAAI,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YAE1C,IAAM,kBAAkB,GAAG,UAAC,KAA8B;gBACxD,+EAA+E;gBAC/E,IAAI,KAAK,KAAK,YAAY,EAAE;oBAC1B,YAAY,GAAG,SAAS,CAAC;oBACzB,OAAO;iBACR;gBAED,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC,CAAC;YAEF,IAAI,CAAC,QAAQ,EAAE;gBACb,0FAA0F;gBAC1F,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBAC7D,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,gBAAgB,CAAC,YAAY,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBAClE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,gBAAgB,CAAC,aAAa,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;aACpE;YAED,+EAA+E;YAC/E,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;gBACpC,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC,EAAE,CAAC,CAAC,CAAC;YAEN,OAAO;gBACL,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBAChE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,CAAC,YAAY,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBACrE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBAEtE,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAChC,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC;IApDW,QAAA,iBAAiB,qBAoD5B;IAEF,IAAM,cAAc,GAAG,UAAC,MAAqB;;QAC3C,IAAI,MAAM,EAAE;YACV,IAAI,OAAQ,MAAiB,CAAC,MAAM,KAAK,QAAQ,IAAK,MAAiB,CAAC,MAAM,KAAK,MAAM,EAAE;gBACzF,mDAAmD;gBACnD,OAAO,MAAM,CAAC,KAAK,CAAC;aACrB;YAED,mDAAmD;YACnD,OAAO,MAAA,MAAA,MAAC,MAAe,CAAC,aAAa,0CAAE,WAAW,0CAAE,KAAK,mCAAI,SAAS,CAAC;SACxE;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,IAAM,eAAe,GAAG,eAAe,CAAC;IASxC;;;;;;;;;OASG;IACH,IAAM,cAAc,GAAG,UAAC,OAA8B;QAElD,IAAA,QAAQ,GAMN,OAAO,SAND,EACC,cAAc,GAKrB,OAAO,QALc,EACvB,QAAQ,GAIN,OAAO,SAJD,EACR,KAGE,OAAO,SAH4D,EAA3D,YAAY,mBAAG,UAAC,MAAM,EAAE,KAAK,IAAK,OAAA,CAAC,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,CAAC,KAAK,CAAC,CAAA,EAAzB,CAAyB,KAAA,EACrE,KAEE,OAAO,aAFU,EAAnB,YAAY,mBAAG,IAAI,KAAA,EACnB,IAAI,GACF,OAAO,KADL,CACM;QACZ,IAAM,UAAU,GAAG,KAAK,CAAC,MAAM,EAAU,CAAC;QAE1C,IAAM,QAAQ,GAAG,mCAAgB,CAAC,UAAC,CAAQ;YACzC,IAAM,QAAQ,GAAG,YAAY,IAAI,CAAC,UAAC,MAAM,EAAE,KAAK,IAAK,OAAA,CAAC,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,CAAC,KAAK,CAAC,CAAA,EAAzB,CAAyB,CAAC,CAAC;YAEhF,IAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAA,GAAG,IAAI,OAAA,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,MAAqB,CAAC,EAAvD,CAAuD,CAAC,CAAC;YAC7F,IAAI,SAAS,IAAI,CAAC,QAAQ,EAAE;gBAC1B,QAAQ,CAAC,CAAe,CAAC,CAAC;aAC3B;QACH,CAAC,CAAC,CAAC;QAEH,iDAAiD;QACjD,KAAK,CAAC,SAAS,CAAC;YACd,IAAI,CAAC,QAAQ,EAAE;gBACb,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,gBAAgB,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAClE,OAAO;oBACL,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,mBAAmB,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACvE,CAAC,CAAC;aACH;QACH,CAAC,EAAE,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAEzC,wCAAwC;QACxC,KAAK,CAAC,SAAS,CAAC;;YACd,IAAI,CAAC,QAAQ,EAAE;gBACb,UAAU,CAAC,OAAO,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,0CAAE,WAAW,CAAC;oBAC5D,IAAM,aAAa,GAAG,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,aAAa,CAAC;oBACpD,IAAI,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,MAAK,QAAQ,IAAI,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,MAAK,SAAS,EAAE;wBAC/E,IAAM,OAAK,GAAG,IAAI,WAAW,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;wBAClE,aAAa,CAAC,aAAa,CAAC,OAAK,CAAC,CAAC;qBACpC;gBACH,CAAC,EAAE,YAAY,CAAC,CAAC;aAClB;YACD,OAAO;;gBACL,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,0CAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAChE,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,cAAc,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC","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
@@ -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"]}
@@ -23,7 +23,9 @@ const resolveShorthand = (value, options) => {
23
23
  if (typeof value === 'string' || typeof value === 'number' || Array.isArray(value) || react_1.isValidElement(value)) {
24
24
  resolvedShorthand.children = value;
25
25
  } else if (typeof value === 'object') {
26
- resolvedShorthand = value;
26
+ resolvedShorthand = {
27
+ ...value
28
+ };
27
29
  }
28
30
  return defaultProps ? {
29
31
  ...defaultProps,
@@ -1 +1 @@
1
- {"version":3,"mappings":";;;;;;AAAA;AAkBA;;;;;;AAMO,MAAMA,gBAAgB,GAA6B,CAACC,KAAK,EAAEC,OAAO,KAAI;EAC3E,MAAM;IAAEC,QAAQ,GAAG,KAAK;IAAEC;EAAY,CAAE,GAAGF,OAAO,IAAI,EAAE;EACxD,IAAID,KAAK,KAAK,IAAI,IAAKA,KAAK,KAAKI,SAAS,IAAI,CAACF,QAAS,EAAE;IACxD,OAAOE,SAAS;;EAGlB,IAAIC,iBAAiB,GAAG,EAAsB;EAE9C,IAAI,OAAOL,KAAK,KAAK,QAAQ,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIM,KAAK,CAACC,OAAO,CAACP,KAAK,CAAC,IAAIQ,sBAAc,CAACR,KAAK,CAAC,EAAE;IAC3GK,iBAAiB,CAACI,QAAQ,GAAGT,KAAK;GACnC,MAAM,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IACpCK,iBAAiB,GAAGL,KAAK;;EAG3B,OAAOG,YAAY,GAAG;IAAE,GAAGA,YAAY;IAAE,GAAGE;EAAiB,CAAE,GAAGA,iBAAiB;AACrF,CAAC;AAfYK,wBAAgB","names":["resolveShorthand","value","options","required","defaultProps","undefined","resolvedShorthand","Array","isArray","react_1","children","exports"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/compose/resolveShorthand.ts"],"sourcesContent":["import { isValidElement } from 'react';\nimport type { ReplaceNullWithUndefined, SlotShorthandValue, UnknownSlotProps } from './types';\n\nexport type ResolveShorthandOptions<Props, Required extends boolean = false> = {\n required?: Required;\n defaultProps?: Props;\n};\n\nexport type ResolveShorthandFunction<Props extends UnknownSlotProps = UnknownSlotProps> = {\n <P extends Props | null>(\n value: P | SlotShorthandValue | undefined,\n options?: ResolveShorthandOptions<P, true>,\n ): ReplaceNullWithUndefined<P>;\n <P extends Props | null>(value: P | SlotShorthandValue | undefined, options?: ResolveShorthandOptions<P, boolean>):\n | ReplaceNullWithUndefined<P>\n | undefined;\n};\n\n/**\n * Resolves shorthands into slot props, to ensure normalization of the signature\n * being passed down to getSlots method\n * @param value - the base shorthand props\n * @param options - options to resolve shorthand props\n */\nexport const resolveShorthand: ResolveShorthandFunction = (value, options) => {\n const { required = false, defaultProps } = options || {};\n if (value === null || (value === undefined && !required)) {\n return undefined;\n }\n\n let resolvedShorthand = {} as UnknownSlotProps;\n\n if (typeof value === 'string' || typeof value === 'number' || Array.isArray(value) || isValidElement(value)) {\n resolvedShorthand.children = value;\n } else if (typeof value === 'object') {\n resolvedShorthand = value;\n }\n\n return defaultProps ? { ...defaultProps, ...resolvedShorthand } : resolvedShorthand;\n};\n"]}
1
+ {"version":3,"mappings":";;;;;;AAAA;AAkBA;;;;;;AAMO,MAAMA,gBAAgB,GAA6B,CAACC,KAAK,EAAEC,OAAO,KAAI;EAC3E,MAAM;IAAEC,QAAQ,GAAG,KAAK;IAAEC;EAAY,CAAE,GAAGF,OAAO,IAAI,EAAE;EACxD,IAAID,KAAK,KAAK,IAAI,IAAKA,KAAK,KAAKI,SAAS,IAAI,CAACF,QAAS,EAAE;IACxD,OAAOE,SAAS;;EAGlB,IAAIC,iBAAiB,GAAG,EAAsB;EAE9C,IAAI,OAAOL,KAAK,KAAK,QAAQ,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIM,KAAK,CAACC,OAAO,CAACP,KAAK,CAAC,IAAIQ,sBAAc,CAACR,KAAK,CAAC,EAAE;IAC3GK,iBAAiB,CAACI,QAAQ,GAAGT,KAAK;GACnC,MAAM,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IACpCK,iBAAiB,GAAG;MAAE,GAAGL;IAAK,CAAE;;EAGlC,OAAOG,YAAY,GAAG;IAAE,GAAGA,YAAY;IAAE,GAAGE;EAAiB,CAAE,GAAGA,iBAAiB;AACrF,CAAC;AAfYK,wBAAgB","names":["resolveShorthand","value","options","required","defaultProps","undefined","resolvedShorthand","Array","isArray","react_1","children","exports"],"sourceRoot":"../src/","sources":["packages/react-components/react-utilities/src/compose/resolveShorthand.ts"],"sourcesContent":["import { isValidElement } from 'react';\nimport type { ReplaceNullWithUndefined, SlotShorthandValue, UnknownSlotProps } from './types';\n\nexport type ResolveShorthandOptions<Props, Required extends boolean = false> = {\n required?: Required;\n defaultProps?: Props;\n};\n\nexport type ResolveShorthandFunction<Props extends UnknownSlotProps = UnknownSlotProps> = {\n <P extends Props | null>(\n value: P | SlotShorthandValue | undefined,\n options?: ResolveShorthandOptions<P, true>,\n ): ReplaceNullWithUndefined<P>;\n <P extends Props | null>(value: P | SlotShorthandValue | undefined, options?: ResolveShorthandOptions<P, boolean>):\n | ReplaceNullWithUndefined<P>\n | undefined;\n};\n\n/**\n * Resolves shorthands into slot props, to ensure normalization of the signature\n * being passed down to getSlots method\n * @param value - the base shorthand props\n * @param options - options to resolve shorthand props\n */\nexport const resolveShorthand: ResolveShorthandFunction = (value, options) => {\n const { required = false, defaultProps } = options || {};\n if (value === null || (value === undefined && !required)) {\n return undefined;\n }\n\n let resolvedShorthand = {} as UnknownSlotProps;\n\n if (typeof value === 'string' || typeof value === 'number' || Array.isArray(value) || isValidElement(value)) {\n resolvedShorthand.children = value;\n } else if (typeof value === 'object') {\n resolvedShorthand = { ...value };\n }\n\n return defaultProps ? { ...defaultProps, ...resolvedShorthand } : resolvedShorthand;\n};\n"]}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ const tslib_1 = /*#__PURE__*/require("tslib");
7
+ tslib_1.__exportStar(require("./mouseTouchHelpers"), exports);
8
+ //# sourceMappingURL=index.js.map
@@ -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(!disabled, element, callback);
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 = (enableFrameFocusDispatch, targetDocument, callback, pollDuration = 1000) => {
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
- if (callback) {
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 (enableFrameFocusDispatch) {
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
- return () => {
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 (enableFrameFocusDispatch) {
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, enableFrameFocusDispatch, pollDuration]);
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"]}
@@ -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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui/react-utilities",
3
- "version": "9.5.2",
3
+ "version": "9.6.0",
4
4
  "description": "A set of general React-specific utilities.",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",