@fluentui-copilot/react-preview 0.5.3 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +31 -1
- package/CHANGELOG.md +11 -2
- package/dist/index.d.ts +12 -1
- package/lib/components/Preview/Preview.types.js.map +1 -1
- package/lib/components/Preview/usePreview.js +18 -12
- package/lib/components/Preview/usePreview.js.map +1 -1
- package/lib-commonjs/components/Preview/Preview.types.js.map +1 -1
- package/lib-commonjs/components/Preview/usePreview.js +17 -13
- package/lib-commonjs/components/Preview/usePreview.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.json
CHANGED
|
@@ -2,7 +2,37 @@
|
|
|
2
2
|
"name": "@fluentui-copilot/react-preview",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "Fri,
|
|
5
|
+
"date": "Fri, 06 Sep 2024 19:17:40 GMT",
|
|
6
|
+
"tag": "@fluentui-copilot/react-preview_v0.5.4",
|
|
7
|
+
"version": "0.5.4",
|
|
8
|
+
"comments": {
|
|
9
|
+
"patch": [
|
|
10
|
+
{
|
|
11
|
+
"author": "makotom@microsoft.com",
|
|
12
|
+
"package": "@fluentui-copilot/react-preview",
|
|
13
|
+
"commit": "2a0f7bac90a8e65fa591a660f107ab8a79bee774",
|
|
14
|
+
"comment": "feat: Adding showDelay and hideDelay props to Preview component to control the delay in opening/closing it when opened by hover."
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"date": "Wed, 04 Sep 2024 18:11:50 GMT",
|
|
21
|
+
"tag": "@fluentui-copilot/react-preview_v0.5.3",
|
|
22
|
+
"version": "0.5.3",
|
|
23
|
+
"comments": {
|
|
24
|
+
"none": [
|
|
25
|
+
{
|
|
26
|
+
"author": "makotom@microsoft.com",
|
|
27
|
+
"package": "@fluentui-copilot/react-preview",
|
|
28
|
+
"commit": "6c540d99d0a351ca0b736ea12c1e3b0c5730984f",
|
|
29
|
+
"comment": "chore: Cherry-picking package updates from 0.18.1 release back to main."
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"date": "Fri, 23 Aug 2024 01:05:09 GMT",
|
|
6
36
|
"tag": "@fluentui-copilot/react-preview_v0.5.3",
|
|
7
37
|
"version": "0.5.3",
|
|
8
38
|
"comments": {
|
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
# Change Log - @fluentui-copilot/react-preview
|
|
2
2
|
|
|
3
|
-
This log was last generated on Fri,
|
|
3
|
+
This log was last generated on Fri, 06 Sep 2024 19:17:40 GMT and should not be manually modified.
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## [0.5.4](https://github.com/microsoft/fluentai/tree/@fluentui-copilot/react-preview_v0.5.4)
|
|
8
|
+
|
|
9
|
+
Fri, 06 Sep 2024 19:17:40 GMT
|
|
10
|
+
[Compare changes](https://github.com/microsoft/fluentai/compare/@fluentui-copilot/react-preview_v0.5.3..@fluentui-copilot/react-preview_v0.5.4)
|
|
11
|
+
|
|
12
|
+
### Patches
|
|
13
|
+
|
|
14
|
+
- feat: Adding showDelay and hideDelay props to Preview component to control the delay in opening/closing it when opened by hover. ([PR #2137](https://github.com/microsoft/fluentai/pull/2137) by makotom@microsoft.com)
|
|
15
|
+
|
|
7
16
|
## [0.5.3](https://github.com/microsoft/fluentai/tree/@fluentui-copilot/react-preview_v0.5.3)
|
|
8
17
|
|
|
9
|
-
Fri, 23 Aug 2024 01:
|
|
18
|
+
Fri, 23 Aug 2024 01:05:09 GMT
|
|
10
19
|
[Compare changes](https://github.com/microsoft/fluentai/compare/@fluentui-copilot/react-preview_v0.5.2..@fluentui-copilot/react-preview_v0.5.3)
|
|
11
20
|
|
|
12
21
|
### Patches
|
package/dist/index.d.ts
CHANGED
|
@@ -119,7 +119,18 @@ export declare type PreviewMetadataState = ComponentState<PreviewMetadataSlots>;
|
|
|
119
119
|
/**
|
|
120
120
|
* Preview Props
|
|
121
121
|
*/
|
|
122
|
-
export declare type PreviewProps = Omit<PopoverProps, 'mouseLeaveDelay' | 'openOnHover'
|
|
122
|
+
export declare type PreviewProps = Omit<PopoverProps, 'mouseLeaveDelay' | 'openOnHover'> & {
|
|
123
|
+
/**
|
|
124
|
+
* Sets the delay in milliseconds for closing the Preview on mouse leaving its trigger or popover surface when it was opened by hover.
|
|
125
|
+
* @default 250
|
|
126
|
+
*/
|
|
127
|
+
hideDelay?: number;
|
|
128
|
+
/**
|
|
129
|
+
* Sets the delay in milliseconds for opening the Preview on hovering its trigger.
|
|
130
|
+
* @default 250
|
|
131
|
+
*/
|
|
132
|
+
showDelay?: number;
|
|
133
|
+
};
|
|
123
134
|
|
|
124
135
|
/**
|
|
125
136
|
* State used in rendering Preview
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Preview.types.ts"],"sourcesContent":["import type { PopoverProps, PopoverState } from '@fluentui/react-components';\n\n/**\n * Preview Props\n */\nexport type PreviewProps = Omit<PopoverProps, 'mouseLeaveDelay' | 'openOnHover'
|
|
1
|
+
{"version":3,"sources":["Preview.types.ts"],"sourcesContent":["import type { PopoverProps, PopoverState } from '@fluentui/react-components';\n\n/**\n * Preview Props\n */\nexport type PreviewProps = Omit<PopoverProps, 'mouseLeaveDelay' | 'openOnHover'> & {\n /**\n * Sets the delay in milliseconds for closing the Preview on mouse leaving its trigger or popover surface when it was opened by hover.\n * @default 250\n */\n hideDelay?: number;\n\n /**\n * Sets the delay in milliseconds for opening the Preview on hovering its trigger.\n * @default 250\n */\n showDelay?: number;\n};\n\n/**\n * State used in rendering Preview\n */\nexport type PreviewState = PopoverState & {\n /**\n * Whether the Preview was opened by click or keyboard and is therefore locked until intentional interaction to close it.\n */\n isPreviewLocked: boolean;\n};\n"],"names":[],"rangeMappings":";;","mappings":"AAmBA;;CAEC,GACD,WAKE"}
|
|
@@ -3,13 +3,13 @@ import { Enter, Escape } from '@fluentui/keyboard-keys';
|
|
|
3
3
|
import { mergeCallbacks, resolvePositioningShorthand, useFluent, useId, useIsomorphicLayoutEffect, usePopover_unstable } from '@fluentui/react-components';
|
|
4
4
|
import { useTimeout } from '@fluentui/react-utilities';
|
|
5
5
|
import { addOpenedByHoverPreview, closeAllOpenedByHoverPreviews, removeOpenedByHoverPreview } from '../../utils';
|
|
6
|
-
const
|
|
6
|
+
const POPOVER_MOUSE_DELAY = 250;
|
|
7
7
|
const POPOVER_KEYBOARD_HIDE_DELAY = 0;
|
|
8
|
-
const getDelay = type => {
|
|
8
|
+
const getDelay = (type, popoverMouseHideDelay) => {
|
|
9
9
|
if (type === 'focus' || type === 'blur') {
|
|
10
10
|
return POPOVER_KEYBOARD_HIDE_DELAY;
|
|
11
11
|
}
|
|
12
|
-
return
|
|
12
|
+
return popoverMouseHideDelay;
|
|
13
13
|
};
|
|
14
14
|
/**
|
|
15
15
|
* Create the state required to render Preview.
|
|
@@ -22,16 +22,19 @@ const getDelay = type => {
|
|
|
22
22
|
*/
|
|
23
23
|
export const usePreview_unstable = props => {
|
|
24
24
|
const {
|
|
25
|
+
hideDelay = POPOVER_MOUSE_DELAY,
|
|
25
26
|
onOpenChange,
|
|
26
27
|
open,
|
|
27
28
|
positioning,
|
|
29
|
+
showDelay = POPOVER_MOUSE_DELAY,
|
|
28
30
|
unstable_disableAutoFocus
|
|
29
31
|
} = props;
|
|
30
32
|
const children = React.Children.toArray(props.children);
|
|
31
33
|
const {
|
|
32
34
|
targetDocument
|
|
33
35
|
} = useFluent();
|
|
34
|
-
const [
|
|
36
|
+
const [setEnterTimeout, clearEnterTimeout] = useTimeout();
|
|
37
|
+
const [setLeaveTimeout, clearLeaveTimeout] = useTimeout();
|
|
35
38
|
const [disableAutoFocus, setDisableAutoFocus] = React.useState(true);
|
|
36
39
|
const {
|
|
37
40
|
current: previewInternalState
|
|
@@ -62,6 +65,7 @@ export const usePreview_unstable = props => {
|
|
|
62
65
|
previewInternalState.openByHoverOverPopover = false;
|
|
63
66
|
previewInternalState.openByKeyboard = false;
|
|
64
67
|
setIsPopoverOpen(isOpen());
|
|
68
|
+
clearEnterTimeout();
|
|
65
69
|
};
|
|
66
70
|
React.useEffect(() => {
|
|
67
71
|
return () => {
|
|
@@ -82,12 +86,14 @@ export const usePreview_unstable = props => {
|
|
|
82
86
|
closeAllOpenedByHoverPreviews(popoverSurfaceId);
|
|
83
87
|
addOpenedByHoverPreview(popoverSurfaceId, closeCallback);
|
|
84
88
|
}
|
|
85
|
-
|
|
89
|
+
setEnterTimeout(() => {
|
|
90
|
+
setIsPopoverOpen(isOpen());
|
|
91
|
+
}, showDelay);
|
|
86
92
|
};
|
|
87
93
|
const handleTriggerTargetLeave = e => {
|
|
88
94
|
previewInternalState.openByHoverOverTrigger = false;
|
|
89
95
|
triggerMousedOver.current = false;
|
|
90
|
-
|
|
96
|
+
setLeaveTimeout(() => {
|
|
91
97
|
setIsPopoverOpen(isOpen());
|
|
92
98
|
// We want to call onOpenChange only if the popover is actually closing when leaving the trigger
|
|
93
99
|
if (!previewInternalState.openByClick && !previewInternalState.openByKeyboard && !previewInternalState.openByHoverOverPopover && isPopoverOpen) {
|
|
@@ -96,7 +102,7 @@ export const usePreview_unstable = props => {
|
|
|
96
102
|
});
|
|
97
103
|
removeOpenedByHoverPreview(popoverSurfaceId);
|
|
98
104
|
}
|
|
99
|
-
}, getDelay(e.type));
|
|
105
|
+
}, getDelay(e.type, hideDelay));
|
|
100
106
|
};
|
|
101
107
|
const handleTriggerClick = e => {
|
|
102
108
|
// Setting preventDefaultClose so that onPopoverOpenChange does not apply its logic when click is on the trigger as we want to control that behavior.
|
|
@@ -128,7 +134,7 @@ export const usePreview_unstable = props => {
|
|
|
128
134
|
};
|
|
129
135
|
const handleTriggerKeyDown = e => {
|
|
130
136
|
if (e.key === Enter) {
|
|
131
|
-
|
|
137
|
+
clearLeaveTimeout();
|
|
132
138
|
// Setting default prevented so that Enter key does not trigger a click event or onPopoverOpenChange.
|
|
133
139
|
e.preventDefault();
|
|
134
140
|
// We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via keyboard.
|
|
@@ -156,7 +162,7 @@ export const usePreview_unstable = props => {
|
|
|
156
162
|
};
|
|
157
163
|
const handlePopoverTargetLeave = e => {
|
|
158
164
|
previewInternalState.openByHoverOverPopover = false;
|
|
159
|
-
|
|
165
|
+
setLeaveTimeout(() => {
|
|
160
166
|
setIsPopoverOpen(isOpen());
|
|
161
167
|
// We want to call onOpenChange only if the popover is actually closing when leaving the popover
|
|
162
168
|
if (!previewInternalState.openByClick && !previewInternalState.openByKeyboard && !previewInternalState.openByHoverOverTrigger) {
|
|
@@ -165,7 +171,7 @@ export const usePreview_unstable = props => {
|
|
|
165
171
|
});
|
|
166
172
|
removeOpenedByHoverPreview(popoverSurfaceId);
|
|
167
173
|
}
|
|
168
|
-
}, getDelay(e.type));
|
|
174
|
+
}, getDelay(e.type, hideDelay));
|
|
169
175
|
};
|
|
170
176
|
popoverTrigger = React.cloneElement(popoverTrigger, {
|
|
171
177
|
...popoverTrigger.props,
|
|
@@ -195,7 +201,7 @@ export const usePreview_unstable = props => {
|
|
|
195
201
|
const onDocumentKeyDown = e => {
|
|
196
202
|
const openedByHover = !previewInternalState.openByClick && !previewInternalState.openByKeyboard;
|
|
197
203
|
if (openedByHover && e.key === Escape) {
|
|
198
|
-
|
|
204
|
+
clearLeaveTimeout();
|
|
199
205
|
// We set state back to its default if the Escape key has been pressed
|
|
200
206
|
setDisableAutoFocus(true);
|
|
201
207
|
closeCallback();
|
|
@@ -220,7 +226,7 @@ export const usePreview_unstable = props => {
|
|
|
220
226
|
if (!preventDefaultClose.current) {
|
|
221
227
|
// We set all open state to false if preventDefaultClose was not set to true and the popover is closing.
|
|
222
228
|
if (!data.open) {
|
|
223
|
-
|
|
229
|
+
clearLeaveTimeout();
|
|
224
230
|
closeCallback();
|
|
225
231
|
removeOpenedByHoverPreview(popoverSurfaceId);
|
|
226
232
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["usePreview.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Enter, Escape } from '@fluentui/keyboard-keys';\nimport {\n mergeCallbacks,\n resolvePositioningShorthand,\n useFluent,\n useId,\n useIsomorphicLayoutEffect,\n usePopover_unstable,\n} from '@fluentui/react-components';\nimport { useTimeout } from '@fluentui/react-utilities';\nimport type { OnOpenChangeData, OpenPopoverEvents } from '@fluentui/react-components';\n\nimport { addOpenedByHoverPreview, closeAllOpenedByHoverPreviews, removeOpenedByHoverPreview } from '../../utils';\nimport type { PreviewProps, PreviewState } from './Preview.types';\n\ntype PreviewInternalState = {\n openByClick: boolean;\n openByHoverOverTrigger: boolean;\n openByHoverOverPopover: boolean;\n openByKeyboard: boolean;\n};\n\nconst POPOVER_MOUSE_HIDE_DELAY = 500;\nconst POPOVER_KEYBOARD_HIDE_DELAY = 0;\n\nconst getDelay = (type: string): number => {\n if (type === 'focus' || type === 'blur') {\n return POPOVER_KEYBOARD_HIDE_DELAY;\n }\n\n return POPOVER_MOUSE_HIDE_DELAY;\n};\n\ntype TargetEvent<T> = React.MouseEvent<T> | React.FocusEvent<T>;\n\n/**\n * Create the state required to render Preview.\n *\n * The returned state can be modified with hooks such as usePreviewStyles_unstable,\n * before being passed to renderPreview_unstable.\n *\n * @param props - props from this instance of Preview\n * @param ref - reference to root HTMLElement of Preview\n */\nexport const usePreview_unstable = (props: PreviewProps): PreviewState => {\n const { onOpenChange, open, positioning, unstable_disableAutoFocus } = props;\n\n const children = React.Children.toArray(props.children) as React.ReactElement[];\n\n const { targetDocument } = useFluent();\n const [setTimeout, clearTimeout] = useTimeout();\n\n const [disableAutoFocus, setDisableAutoFocus] = React.useState(true);\n\n const { current: previewInternalState } = React.useRef<PreviewInternalState>({\n openByClick: false,\n openByHoverOverTrigger: false,\n openByHoverOverPopover: false,\n openByKeyboard: false,\n });\n const triggerMousedOver = React.useRef(false);\n\n const isOpen = () => {\n return (\n previewInternalState.openByClick ||\n previewInternalState.openByHoverOverTrigger ||\n previewInternalState.openByHoverOverPopover ||\n previewInternalState.openByKeyboard\n );\n };\n\n const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);\n const preventDefaultClose = React.useRef(false);\n\n let popoverTrigger: React.ReactElement | undefined = undefined;\n let popoverSurface: React.ReactElement | undefined = undefined;\n if (children.length === 2) {\n popoverTrigger = children[0];\n popoverSurface = children[1];\n } else if (children.length === 1) {\n popoverSurface = children[0];\n }\n\n const popoverSurfaceId = useId('preview-surface', popoverSurface?.props.id);\n\n const closeCallback = () => {\n previewInternalState.openByClick = false;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n previewInternalState.openByKeyboard = false;\n setIsPopoverOpen(isOpen());\n };\n\n React.useEffect(() => {\n return () => {\n // Remove all instances of the current popover from the openedByHoverPreviewManager when the component is unmounted.\n removeOpenedByHoverPreview(popoverSurfaceId);\n };\n }, [popoverSurfaceId]);\n\n if (popoverSurface && popoverTrigger) {\n const handleTriggerTargetEnter = (e: TargetEvent<HTMLSpanElement>): void => {\n previewInternalState.openByHoverOverTrigger = true;\n triggerMousedOver.current = true;\n\n // We want to disable auto focus only if the popover is being opened by hovering over the trigger\n if (!previewInternalState.openByClick && !previewInternalState.openByKeyboard && !isPopoverOpen) {\n setDisableAutoFocus(true);\n onOpenChange?.(e, { open: true });\n closeAllOpenedByHoverPreviews(popoverSurfaceId);\n addOpenedByHoverPreview(popoverSurfaceId, closeCallback);\n }\n\n setIsPopoverOpen(isOpen());\n };\n\n const handleTriggerTargetLeave = (e: TargetEvent<HTMLSpanElement>): void => {\n previewInternalState.openByHoverOverTrigger = false;\n triggerMousedOver.current = false;\n\n setTimeout(() => {\n setIsPopoverOpen(isOpen());\n\n // We want to call onOpenChange only if the popover is actually closing when leaving the trigger\n if (\n !previewInternalState.openByClick &&\n !previewInternalState.openByKeyboard &&\n !previewInternalState.openByHoverOverPopover &&\n isPopoverOpen\n ) {\n onOpenChange?.(e, { open: false });\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n }, getDelay(e.type));\n };\n\n const handleTriggerClick = (e: TargetEvent<HTMLSpanElement>): void => {\n // Setting preventDefaultClose so that onPopoverOpenChange does not apply its logic when click is on the trigger as we want to control that behavior.\n preventDefaultClose.current = true;\n\n // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via click.\n setDisableAutoFocus(false);\n\n const tmpOpenByHoverOverTrigger = previewInternalState.openByHoverOverTrigger;\n\n // If openByKeyboard is true, then the popover was already opened via keyboard and we always want to close it.\n previewInternalState.openByClick = previewInternalState.openByKeyboard\n ? false\n : !previewInternalState.openByClick;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n previewInternalState.openByKeyboard = false;\n\n // We set triggerMousedOver to false when clicking, since we just interacted with the trigger via click, and not hover.\n if (triggerMousedOver.current) {\n previewInternalState.openByClick = false;\n triggerMousedOver.current = false;\n }\n // If it was not moused over, we want to prevent the default click action from opening a link, so the preview can open first\n else {\n e.preventDefault();\n }\n\n if (!tmpOpenByHoverOverTrigger) {\n onOpenChange?.(e, { open: previewInternalState.openByClick });\n }\n\n if (!isOpen()) {\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n setIsPopoverOpen(isOpen());\n };\n\n const handleTriggerKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>): void => {\n if (e.key === Enter) {\n clearTimeout();\n\n // Setting default prevented so that Enter key does not trigger a click event or onPopoverOpenChange.\n e.preventDefault();\n\n // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via keyboard.\n setDisableAutoFocus(false);\n\n const tmpOpenByHoverOverTrigger = previewInternalState.openByHoverOverTrigger;\n\n // If openByClick is true, then the popover was already opened via click and we always want to close it.\n previewInternalState.openByKeyboard = previewInternalState.openByClick\n ? false\n : !previewInternalState.openByKeyboard;\n previewInternalState.openByClick = false;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n\n if (!tmpOpenByHoverOverTrigger) {\n onOpenChange?.(e, { open: previewInternalState.openByKeyboard });\n }\n\n if (!isOpen()) {\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n setIsPopoverOpen(isOpen());\n }\n };\n\n const handlePopoverTargetEnter = (e: TargetEvent<HTMLDivElement>): void => {\n previewInternalState.openByHoverOverPopover = true;\n setIsPopoverOpen(isOpen());\n };\n\n const handlePopoverTargetLeave = (e: TargetEvent<HTMLDivElement>): void => {\n previewInternalState.openByHoverOverPopover = false;\n setTimeout(() => {\n setIsPopoverOpen(isOpen());\n\n // We want to call onOpenChange only if the popover is actually closing when leaving the popover\n if (\n !previewInternalState.openByClick &&\n !previewInternalState.openByKeyboard &&\n !previewInternalState.openByHoverOverTrigger\n ) {\n onOpenChange?.(e, { open: false });\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n }, getDelay(e.type));\n };\n\n popoverTrigger = React.cloneElement(popoverTrigger, {\n ...popoverTrigger.props,\n children: React.cloneElement(popoverTrigger.props.children as React.ReactElement, {\n ...popoverTrigger.props.children.props,\n onBlur: mergeCallbacks(popoverTrigger.props.children.props.onBlur, handleTriggerTargetLeave),\n onClick: mergeCallbacks(popoverTrigger.props.children.props.onClick, handleTriggerClick),\n onKeyDown: mergeCallbacks(popoverTrigger.props.children.props.onKeyDown, handleTriggerKeyDown),\n onMouseEnter: mergeCallbacks(popoverTrigger.props.children.props.onMouseEnter, handleTriggerTargetEnter),\n onMouseLeave: mergeCallbacks(popoverTrigger.props.children.props.onMouseLeave, handleTriggerTargetLeave),\n }),\n });\n\n popoverSurface = React.cloneElement(popoverSurface, {\n ...popoverSurface.props,\n 'aria-labelledby':\n popoverSurface.props['aria-labelledby'] ?? popoverSurface.props['aria-label'] ? undefined : popoverSurfaceId,\n id: popoverSurfaceId,\n onMouseEnter: mergeCallbacks(popoverSurface.props.onMouseEnter, handlePopoverTargetEnter),\n onMouseLeave: mergeCallbacks(popoverSurface.props.onMouseLeave, handlePopoverTargetLeave),\n onFocus: mergeCallbacks(popoverSurface.props.onFocus, handlePopoverTargetEnter),\n });\n }\n\n // Hitting Escape key should close the popover if it was opened by hover.\n // This is necessary to attach to the document because focus is likely not within the trigger or popover.\n useIsomorphicLayoutEffect(() => {\n if (isPopoverOpen) {\n const onDocumentKeyDown = (e: KeyboardEvent) => {\n const openedByHover = !previewInternalState.openByClick && !previewInternalState.openByKeyboard;\n\n if (openedByHover && e.key === Escape) {\n clearTimeout();\n\n // We set state back to its default if the Escape key has been pressed\n setDisableAutoFocus(true);\n closeCallback();\n removeOpenedByHoverPreview(popoverSurfaceId);\n\n onOpenChange?.(e as unknown as OpenPopoverEvents, { open: false });\n\n e.stopPropagation();\n }\n };\n\n targetDocument?.addEventListener('keydown', onDocumentKeyDown, { capture: true });\n\n return () => {\n targetDocument?.removeEventListener('keydown', onDocumentKeyDown, { capture: true });\n };\n }\n }, [targetDocument, isPopoverOpen]);\n\n const onPopoverOpenChange = (e: OpenPopoverEvents, data: OnOpenChangeData): void => {\n if (!preventDefaultClose.current) {\n // We set all open state to false if preventDefaultClose was not set to true and the popover is closing.\n if (!data.open) {\n clearTimeout();\n closeCallback();\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n onOpenChange?.(e, data);\n }\n\n preventDefaultClose.current = false;\n };\n\n let resolvedChildren = children as [JSX.Element, JSX.Element] | JSX.Element;\n if (popoverSurface) {\n if (popoverTrigger) {\n resolvedChildren = [popoverTrigger, popoverSurface];\n } else {\n resolvedChildren = popoverSurface;\n }\n }\n\n const popoverState = usePopover_unstable({\n ...props,\n children: resolvedChildren,\n onOpenChange: onPopoverOpenChange,\n open: open ?? isPopoverOpen,\n positioning:\n typeof positioning === 'string'\n ? { autoSize: true, ...resolvePositioningShorthand(positioning) }\n : { autoSize: true, ...positioning },\n unstable_disableAutoFocus: unstable_disableAutoFocus ?? disableAutoFocus,\n });\n\n return {\n ...popoverState,\n isPreviewLocked: previewInternalState.openByClick || previewInternalState.openByKeyboard,\n };\n};\n"],"names":["React","Enter","Escape","mergeCallbacks","resolvePositioningShorthand","useFluent","useId","useIsomorphicLayoutEffect","usePopover_unstable","useTimeout","addOpenedByHoverPreview","closeAllOpenedByHoverPreviews","removeOpenedByHoverPreview","POPOVER_MOUSE_HIDE_DELAY","POPOVER_KEYBOARD_HIDE_DELAY","getDelay","type","usePreview_unstable","props","onOpenChange","open","positioning","unstable_disableAutoFocus","children","Children","toArray","targetDocument","setTimeout","clearTimeout","disableAutoFocus","setDisableAutoFocus","useState","current","previewInternalState","useRef","openByClick","openByHoverOverTrigger","openByHoverOverPopover","openByKeyboard","triggerMousedOver","isOpen","isPopoverOpen","setIsPopoverOpen","preventDefaultClose","popoverTrigger","undefined","popoverSurface","length","popoverSurfaceId","id","closeCallback","useEffect","handleTriggerTargetEnter","e","handleTriggerTargetLeave","handleTriggerClick","tmpOpenByHoverOverTrigger","preventDefault","handleTriggerKeyDown","key","handlePopoverTargetEnter","handlePopoverTargetLeave","cloneElement","onBlur","onClick","onKeyDown","onMouseEnter","onMouseLeave","onFocus","onDocumentKeyDown","openedByHover","stopPropagation","addEventListener","capture","removeEventListener","onPopoverOpenChange","data","resolvedChildren","popoverState","autoSize","isPreviewLocked"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["usePreview.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Enter, Escape } from '@fluentui/keyboard-keys';\nimport {\n mergeCallbacks,\n resolvePositioningShorthand,\n useFluent,\n useId,\n useIsomorphicLayoutEffect,\n usePopover_unstable,\n} from '@fluentui/react-components';\nimport { useTimeout } from '@fluentui/react-utilities';\nimport type { OnOpenChangeData, OpenPopoverEvents } from '@fluentui/react-components';\n\nimport { addOpenedByHoverPreview, closeAllOpenedByHoverPreviews, removeOpenedByHoverPreview } from '../../utils';\nimport type { PreviewProps, PreviewState } from './Preview.types';\n\ntype PreviewInternalState = {\n openByClick: boolean;\n openByHoverOverTrigger: boolean;\n openByHoverOverPopover: boolean;\n openByKeyboard: boolean;\n};\n\nconst POPOVER_MOUSE_DELAY = 250;\nconst POPOVER_KEYBOARD_HIDE_DELAY = 0;\n\nconst getDelay = (type: string, popoverMouseHideDelay: number): number => {\n if (type === 'focus' || type === 'blur') {\n return POPOVER_KEYBOARD_HIDE_DELAY;\n }\n\n return popoverMouseHideDelay;\n};\n\ntype TargetEvent<T> = React.MouseEvent<T> | React.FocusEvent<T>;\n\n/**\n * Create the state required to render Preview.\n *\n * The returned state can be modified with hooks such as usePreviewStyles_unstable,\n * before being passed to renderPreview_unstable.\n *\n * @param props - props from this instance of Preview\n * @param ref - reference to root HTMLElement of Preview\n */\nexport const usePreview_unstable = (props: PreviewProps): PreviewState => {\n const {\n hideDelay = POPOVER_MOUSE_DELAY,\n onOpenChange,\n open,\n positioning,\n showDelay = POPOVER_MOUSE_DELAY,\n unstable_disableAutoFocus,\n } = props;\n\n const children = React.Children.toArray(props.children) as React.ReactElement[];\n\n const { targetDocument } = useFluent();\n const [setEnterTimeout, clearEnterTimeout] = useTimeout();\n const [setLeaveTimeout, clearLeaveTimeout] = useTimeout();\n\n const [disableAutoFocus, setDisableAutoFocus] = React.useState(true);\n\n const { current: previewInternalState } = React.useRef<PreviewInternalState>({\n openByClick: false,\n openByHoverOverTrigger: false,\n openByHoverOverPopover: false,\n openByKeyboard: false,\n });\n const triggerMousedOver = React.useRef(false);\n\n const isOpen = () => {\n return (\n previewInternalState.openByClick ||\n previewInternalState.openByHoverOverTrigger ||\n previewInternalState.openByHoverOverPopover ||\n previewInternalState.openByKeyboard\n );\n };\n\n const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);\n const preventDefaultClose = React.useRef(false);\n\n let popoverTrigger: React.ReactElement | undefined = undefined;\n let popoverSurface: React.ReactElement | undefined = undefined;\n if (children.length === 2) {\n popoverTrigger = children[0];\n popoverSurface = children[1];\n } else if (children.length === 1) {\n popoverSurface = children[0];\n }\n\n const popoverSurfaceId = useId('preview-surface', popoverSurface?.props.id);\n\n const closeCallback = () => {\n previewInternalState.openByClick = false;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n previewInternalState.openByKeyboard = false;\n setIsPopoverOpen(isOpen());\n clearEnterTimeout();\n };\n\n React.useEffect(() => {\n return () => {\n // Remove all instances of the current popover from the openedByHoverPreviewManager when the component is unmounted.\n removeOpenedByHoverPreview(popoverSurfaceId);\n };\n }, [popoverSurfaceId]);\n\n if (popoverSurface && popoverTrigger) {\n const handleTriggerTargetEnter = (e: TargetEvent<HTMLSpanElement>): void => {\n previewInternalState.openByHoverOverTrigger = true;\n triggerMousedOver.current = true;\n\n // We want to disable auto focus only if the popover is being opened by hovering over the trigger\n if (!previewInternalState.openByClick && !previewInternalState.openByKeyboard && !isPopoverOpen) {\n setDisableAutoFocus(true);\n onOpenChange?.(e, { open: true });\n closeAllOpenedByHoverPreviews(popoverSurfaceId);\n addOpenedByHoverPreview(popoverSurfaceId, closeCallback);\n }\n\n setEnterTimeout(() => {\n setIsPopoverOpen(isOpen());\n }, showDelay);\n };\n\n const handleTriggerTargetLeave = (e: TargetEvent<HTMLSpanElement>): void => {\n previewInternalState.openByHoverOverTrigger = false;\n triggerMousedOver.current = false;\n\n setLeaveTimeout(() => {\n setIsPopoverOpen(isOpen());\n\n // We want to call onOpenChange only if the popover is actually closing when leaving the trigger\n if (\n !previewInternalState.openByClick &&\n !previewInternalState.openByKeyboard &&\n !previewInternalState.openByHoverOverPopover &&\n isPopoverOpen\n ) {\n onOpenChange?.(e, { open: false });\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n }, getDelay(e.type, hideDelay));\n };\n\n const handleTriggerClick = (e: TargetEvent<HTMLSpanElement>): void => {\n // Setting preventDefaultClose so that onPopoverOpenChange does not apply its logic when click is on the trigger as we want to control that behavior.\n preventDefaultClose.current = true;\n\n // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via click.\n setDisableAutoFocus(false);\n\n const tmpOpenByHoverOverTrigger = previewInternalState.openByHoverOverTrigger;\n\n // If openByKeyboard is true, then the popover was already opened via keyboard and we always want to close it.\n previewInternalState.openByClick = previewInternalState.openByKeyboard\n ? false\n : !previewInternalState.openByClick;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n previewInternalState.openByKeyboard = false;\n\n // We set triggerMousedOver to false when clicking, since we just interacted with the trigger via click, and not hover.\n if (triggerMousedOver.current) {\n previewInternalState.openByClick = false;\n triggerMousedOver.current = false;\n }\n // If it was not moused over, we want to prevent the default click action from opening a link, so the preview can open first\n else {\n e.preventDefault();\n }\n\n if (!tmpOpenByHoverOverTrigger) {\n onOpenChange?.(e, { open: previewInternalState.openByClick });\n }\n\n if (!isOpen()) {\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n setIsPopoverOpen(isOpen());\n };\n\n const handleTriggerKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>): void => {\n if (e.key === Enter) {\n clearLeaveTimeout();\n\n // Setting default prevented so that Enter key does not trigger a click event or onPopoverOpenChange.\n e.preventDefault();\n\n // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via keyboard.\n setDisableAutoFocus(false);\n\n const tmpOpenByHoverOverTrigger = previewInternalState.openByHoverOverTrigger;\n\n // If openByClick is true, then the popover was already opened via click and we always want to close it.\n previewInternalState.openByKeyboard = previewInternalState.openByClick\n ? false\n : !previewInternalState.openByKeyboard;\n previewInternalState.openByClick = false;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n\n if (!tmpOpenByHoverOverTrigger) {\n onOpenChange?.(e, { open: previewInternalState.openByKeyboard });\n }\n\n if (!isOpen()) {\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n setIsPopoverOpen(isOpen());\n }\n };\n\n const handlePopoverTargetEnter = (e: TargetEvent<HTMLDivElement>): void => {\n previewInternalState.openByHoverOverPopover = true;\n setIsPopoverOpen(isOpen());\n };\n\n const handlePopoverTargetLeave = (e: TargetEvent<HTMLDivElement>): void => {\n previewInternalState.openByHoverOverPopover = false;\n setLeaveTimeout(() => {\n setIsPopoverOpen(isOpen());\n\n // We want to call onOpenChange only if the popover is actually closing when leaving the popover\n if (\n !previewInternalState.openByClick &&\n !previewInternalState.openByKeyboard &&\n !previewInternalState.openByHoverOverTrigger\n ) {\n onOpenChange?.(e, { open: false });\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n }, getDelay(e.type, hideDelay));\n };\n\n popoverTrigger = React.cloneElement(popoverTrigger, {\n ...popoverTrigger.props,\n children: React.cloneElement(popoverTrigger.props.children as React.ReactElement, {\n ...popoverTrigger.props.children.props,\n onBlur: mergeCallbacks(popoverTrigger.props.children.props.onBlur, handleTriggerTargetLeave),\n onClick: mergeCallbacks(popoverTrigger.props.children.props.onClick, handleTriggerClick),\n onKeyDown: mergeCallbacks(popoverTrigger.props.children.props.onKeyDown, handleTriggerKeyDown),\n onMouseEnter: mergeCallbacks(popoverTrigger.props.children.props.onMouseEnter, handleTriggerTargetEnter),\n onMouseLeave: mergeCallbacks(popoverTrigger.props.children.props.onMouseLeave, handleTriggerTargetLeave),\n }),\n });\n\n popoverSurface = React.cloneElement(popoverSurface, {\n ...popoverSurface.props,\n 'aria-labelledby':\n popoverSurface.props['aria-labelledby'] ?? popoverSurface.props['aria-label'] ? undefined : popoverSurfaceId,\n id: popoverSurfaceId,\n onMouseEnter: mergeCallbacks(popoverSurface.props.onMouseEnter, handlePopoverTargetEnter),\n onMouseLeave: mergeCallbacks(popoverSurface.props.onMouseLeave, handlePopoverTargetLeave),\n onFocus: mergeCallbacks(popoverSurface.props.onFocus, handlePopoverTargetEnter),\n });\n }\n\n // Hitting Escape key should close the popover if it was opened by hover.\n // This is necessary to attach to the document because focus is likely not within the trigger or popover.\n useIsomorphicLayoutEffect(() => {\n if (isPopoverOpen) {\n const onDocumentKeyDown = (e: KeyboardEvent) => {\n const openedByHover = !previewInternalState.openByClick && !previewInternalState.openByKeyboard;\n\n if (openedByHover && e.key === Escape) {\n clearLeaveTimeout();\n\n // We set state back to its default if the Escape key has been pressed\n setDisableAutoFocus(true);\n closeCallback();\n removeOpenedByHoverPreview(popoverSurfaceId);\n\n onOpenChange?.(e as unknown as OpenPopoverEvents, { open: false });\n\n e.stopPropagation();\n }\n };\n\n targetDocument?.addEventListener('keydown', onDocumentKeyDown, { capture: true });\n\n return () => {\n targetDocument?.removeEventListener('keydown', onDocumentKeyDown, { capture: true });\n };\n }\n }, [targetDocument, isPopoverOpen]);\n\n const onPopoverOpenChange = (e: OpenPopoverEvents, data: OnOpenChangeData): void => {\n if (!preventDefaultClose.current) {\n // We set all open state to false if preventDefaultClose was not set to true and the popover is closing.\n if (!data.open) {\n clearLeaveTimeout();\n closeCallback();\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n onOpenChange?.(e, data);\n }\n\n preventDefaultClose.current = false;\n };\n\n let resolvedChildren = children as [JSX.Element, JSX.Element] | JSX.Element;\n if (popoverSurface) {\n if (popoverTrigger) {\n resolvedChildren = [popoverTrigger, popoverSurface];\n } else {\n resolvedChildren = popoverSurface;\n }\n }\n\n const popoverState = usePopover_unstable({\n ...props,\n children: resolvedChildren,\n onOpenChange: onPopoverOpenChange,\n open: open ?? isPopoverOpen,\n positioning:\n typeof positioning === 'string'\n ? { autoSize: true, ...resolvePositioningShorthand(positioning) }\n : { autoSize: true, ...positioning },\n unstable_disableAutoFocus: unstable_disableAutoFocus ?? disableAutoFocus,\n });\n\n return {\n ...popoverState,\n isPreviewLocked: previewInternalState.openByClick || previewInternalState.openByKeyboard,\n };\n};\n"],"names":["React","Enter","Escape","mergeCallbacks","resolvePositioningShorthand","useFluent","useId","useIsomorphicLayoutEffect","usePopover_unstable","useTimeout","addOpenedByHoverPreview","closeAllOpenedByHoverPreviews","removeOpenedByHoverPreview","POPOVER_MOUSE_DELAY","POPOVER_KEYBOARD_HIDE_DELAY","getDelay","type","popoverMouseHideDelay","usePreview_unstable","props","hideDelay","onOpenChange","open","positioning","showDelay","unstable_disableAutoFocus","children","Children","toArray","targetDocument","setEnterTimeout","clearEnterTimeout","setLeaveTimeout","clearLeaveTimeout","disableAutoFocus","setDisableAutoFocus","useState","current","previewInternalState","useRef","openByClick","openByHoverOverTrigger","openByHoverOverPopover","openByKeyboard","triggerMousedOver","isOpen","isPopoverOpen","setIsPopoverOpen","preventDefaultClose","popoverTrigger","undefined","popoverSurface","length","popoverSurfaceId","id","closeCallback","useEffect","handleTriggerTargetEnter","e","handleTriggerTargetLeave","handleTriggerClick","tmpOpenByHoverOverTrigger","preventDefault","handleTriggerKeyDown","key","handlePopoverTargetEnter","handlePopoverTargetLeave","cloneElement","onBlur","onClick","onKeyDown","onMouseEnter","onMouseLeave","onFocus","onDocumentKeyDown","openedByHover","stopPropagation","addEventListener","capture","removeEventListener","onPopoverOpenChange","data","resolvedChildren","popoverState","autoSize","isPreviewLocked"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Preview.types.ts"],"sourcesContent":["import type { PopoverProps, PopoverState } from '@fluentui/react-components';\n\n/**\n * Preview Props\n */\nexport type PreviewProps = Omit<PopoverProps, 'mouseLeaveDelay' | 'openOnHover'
|
|
1
|
+
{"version":3,"sources":["Preview.types.ts"],"sourcesContent":["import type { PopoverProps, PopoverState } from '@fluentui/react-components';\n\n/**\n * Preview Props\n */\nexport type PreviewProps = Omit<PopoverProps, 'mouseLeaveDelay' | 'openOnHover'> & {\n /**\n * Sets the delay in milliseconds for closing the Preview on mouse leaving its trigger or popover surface when it was opened by hover.\n * @default 250\n */\n hideDelay?: number;\n\n /**\n * Sets the delay in milliseconds for opening the Preview on hovering its trigger.\n * @default 250\n */\n showDelay?: number;\n};\n\n/**\n * State used in rendering Preview\n */\nexport type PreviewState = PopoverState & {\n /**\n * Whether the Preview was opened by click or keyboard and is therefore locked until intentional interaction to close it.\n */\n isPreviewLocked: boolean;\n};\n"],"names":[],"rangeMappings":";;","mappings":"AAmBA;;CAEC"}
|
|
@@ -14,19 +14,20 @@ const _keyboardkeys = require("@fluentui/keyboard-keys");
|
|
|
14
14
|
const _reactcomponents = require("@fluentui/react-components");
|
|
15
15
|
const _reactutilities = require("@fluentui/react-utilities");
|
|
16
16
|
const _utils = require("../../utils");
|
|
17
|
-
const
|
|
17
|
+
const POPOVER_MOUSE_DELAY = 250;
|
|
18
18
|
const POPOVER_KEYBOARD_HIDE_DELAY = 0;
|
|
19
|
-
const getDelay = (type)=>{
|
|
19
|
+
const getDelay = (type, popoverMouseHideDelay)=>{
|
|
20
20
|
if (type === 'focus' || type === 'blur') {
|
|
21
21
|
return POPOVER_KEYBOARD_HIDE_DELAY;
|
|
22
22
|
}
|
|
23
|
-
return
|
|
23
|
+
return popoverMouseHideDelay;
|
|
24
24
|
};
|
|
25
25
|
const usePreview_unstable = (props)=>{
|
|
26
|
-
const { onOpenChange, open, positioning, unstable_disableAutoFocus } = props;
|
|
26
|
+
const { hideDelay = POPOVER_MOUSE_DELAY, onOpenChange, open, positioning, showDelay = POPOVER_MOUSE_DELAY, unstable_disableAutoFocus } = props;
|
|
27
27
|
const children = _react.Children.toArray(props.children);
|
|
28
28
|
const { targetDocument } = (0, _reactcomponents.useFluent)();
|
|
29
|
-
const [
|
|
29
|
+
const [setEnterTimeout, clearEnterTimeout] = (0, _reactutilities.useTimeout)();
|
|
30
|
+
const [setLeaveTimeout, clearLeaveTimeout] = (0, _reactutilities.useTimeout)();
|
|
30
31
|
const [disableAutoFocus, setDisableAutoFocus] = _react.useState(true);
|
|
31
32
|
const { current: previewInternalState } = _react.useRef({
|
|
32
33
|
openByClick: false,
|
|
@@ -55,6 +56,7 @@ const usePreview_unstable = (props)=>{
|
|
|
55
56
|
previewInternalState.openByHoverOverPopover = false;
|
|
56
57
|
previewInternalState.openByKeyboard = false;
|
|
57
58
|
setIsPopoverOpen(isOpen());
|
|
59
|
+
clearEnterTimeout();
|
|
58
60
|
};
|
|
59
61
|
_react.useEffect(()=>{
|
|
60
62
|
return ()=>{
|
|
@@ -77,12 +79,14 @@ const usePreview_unstable = (props)=>{
|
|
|
77
79
|
(0, _utils.closeAllOpenedByHoverPreviews)(popoverSurfaceId);
|
|
78
80
|
(0, _utils.addOpenedByHoverPreview)(popoverSurfaceId, closeCallback);
|
|
79
81
|
}
|
|
80
|
-
|
|
82
|
+
setEnterTimeout(()=>{
|
|
83
|
+
setIsPopoverOpen(isOpen());
|
|
84
|
+
}, showDelay);
|
|
81
85
|
};
|
|
82
86
|
const handleTriggerTargetLeave = (e)=>{
|
|
83
87
|
previewInternalState.openByHoverOverTrigger = false;
|
|
84
88
|
triggerMousedOver.current = false;
|
|
85
|
-
|
|
89
|
+
setLeaveTimeout(()=>{
|
|
86
90
|
setIsPopoverOpen(isOpen());
|
|
87
91
|
// We want to call onOpenChange only if the popover is actually closing when leaving the trigger
|
|
88
92
|
if (!previewInternalState.openByClick && !previewInternalState.openByKeyboard && !previewInternalState.openByHoverOverPopover && isPopoverOpen) {
|
|
@@ -91,7 +95,7 @@ const usePreview_unstable = (props)=>{
|
|
|
91
95
|
});
|
|
92
96
|
(0, _utils.removeOpenedByHoverPreview)(popoverSurfaceId);
|
|
93
97
|
}
|
|
94
|
-
}, getDelay(e.type));
|
|
98
|
+
}, getDelay(e.type, hideDelay));
|
|
95
99
|
};
|
|
96
100
|
const handleTriggerClick = (e)=>{
|
|
97
101
|
// Setting preventDefaultClose so that onPopoverOpenChange does not apply its logic when click is on the trigger as we want to control that behavior.
|
|
@@ -123,7 +127,7 @@ const usePreview_unstable = (props)=>{
|
|
|
123
127
|
};
|
|
124
128
|
const handleTriggerKeyDown = (e)=>{
|
|
125
129
|
if (e.key === _keyboardkeys.Enter) {
|
|
126
|
-
|
|
130
|
+
clearLeaveTimeout();
|
|
127
131
|
// Setting default prevented so that Enter key does not trigger a click event or onPopoverOpenChange.
|
|
128
132
|
e.preventDefault();
|
|
129
133
|
// We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via keyboard.
|
|
@@ -151,7 +155,7 @@ const usePreview_unstable = (props)=>{
|
|
|
151
155
|
};
|
|
152
156
|
const handlePopoverTargetLeave = (e)=>{
|
|
153
157
|
previewInternalState.openByHoverOverPopover = false;
|
|
154
|
-
|
|
158
|
+
setLeaveTimeout(()=>{
|
|
155
159
|
setIsPopoverOpen(isOpen());
|
|
156
160
|
// We want to call onOpenChange only if the popover is actually closing when leaving the popover
|
|
157
161
|
if (!previewInternalState.openByClick && !previewInternalState.openByKeyboard && !previewInternalState.openByHoverOverTrigger) {
|
|
@@ -160,7 +164,7 @@ const usePreview_unstable = (props)=>{
|
|
|
160
164
|
});
|
|
161
165
|
(0, _utils.removeOpenedByHoverPreview)(popoverSurfaceId);
|
|
162
166
|
}
|
|
163
|
-
}, getDelay(e.type));
|
|
167
|
+
}, getDelay(e.type, hideDelay));
|
|
164
168
|
};
|
|
165
169
|
popoverTrigger = /*#__PURE__*/ _react.cloneElement(popoverTrigger, {
|
|
166
170
|
...popoverTrigger.props,
|
|
@@ -190,7 +194,7 @@ const usePreview_unstable = (props)=>{
|
|
|
190
194
|
const onDocumentKeyDown = (e)=>{
|
|
191
195
|
const openedByHover = !previewInternalState.openByClick && !previewInternalState.openByKeyboard;
|
|
192
196
|
if (openedByHover && e.key === _keyboardkeys.Escape) {
|
|
193
|
-
|
|
197
|
+
clearLeaveTimeout();
|
|
194
198
|
// We set state back to its default if the Escape key has been pressed
|
|
195
199
|
setDisableAutoFocus(true);
|
|
196
200
|
closeCallback();
|
|
@@ -218,7 +222,7 @@ const usePreview_unstable = (props)=>{
|
|
|
218
222
|
if (!preventDefaultClose.current) {
|
|
219
223
|
// We set all open state to false if preventDefaultClose was not set to true and the popover is closing.
|
|
220
224
|
if (!data.open) {
|
|
221
|
-
|
|
225
|
+
clearLeaveTimeout();
|
|
222
226
|
closeCallback();
|
|
223
227
|
(0, _utils.removeOpenedByHoverPreview)(popoverSurfaceId);
|
|
224
228
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["usePreview.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Enter, Escape } from '@fluentui/keyboard-keys';\nimport {\n mergeCallbacks,\n resolvePositioningShorthand,\n useFluent,\n useId,\n useIsomorphicLayoutEffect,\n usePopover_unstable,\n} from '@fluentui/react-components';\nimport { useTimeout } from '@fluentui/react-utilities';\nimport type { OnOpenChangeData, OpenPopoverEvents } from '@fluentui/react-components';\n\nimport { addOpenedByHoverPreview, closeAllOpenedByHoverPreviews, removeOpenedByHoverPreview } from '../../utils';\nimport type { PreviewProps, PreviewState } from './Preview.types';\n\ntype PreviewInternalState = {\n openByClick: boolean;\n openByHoverOverTrigger: boolean;\n openByHoverOverPopover: boolean;\n openByKeyboard: boolean;\n};\n\nconst POPOVER_MOUSE_HIDE_DELAY = 500;\nconst POPOVER_KEYBOARD_HIDE_DELAY = 0;\n\nconst getDelay = (type: string): number => {\n if (type === 'focus' || type === 'blur') {\n return POPOVER_KEYBOARD_HIDE_DELAY;\n }\n\n return POPOVER_MOUSE_HIDE_DELAY;\n};\n\ntype TargetEvent<T> = React.MouseEvent<T> | React.FocusEvent<T>;\n\n/**\n * Create the state required to render Preview.\n *\n * The returned state can be modified with hooks such as usePreviewStyles_unstable,\n * before being passed to renderPreview_unstable.\n *\n * @param props - props from this instance of Preview\n * @param ref - reference to root HTMLElement of Preview\n */\nexport const usePreview_unstable = (props: PreviewProps): PreviewState => {\n const { onOpenChange, open, positioning, unstable_disableAutoFocus } = props;\n\n const children = React.Children.toArray(props.children) as React.ReactElement[];\n\n const { targetDocument } = useFluent();\n const [setTimeout, clearTimeout] = useTimeout();\n\n const [disableAutoFocus, setDisableAutoFocus] = React.useState(true);\n\n const { current: previewInternalState } = React.useRef<PreviewInternalState>({\n openByClick: false,\n openByHoverOverTrigger: false,\n openByHoverOverPopover: false,\n openByKeyboard: false,\n });\n const triggerMousedOver = React.useRef(false);\n\n const isOpen = () => {\n return (\n previewInternalState.openByClick ||\n previewInternalState.openByHoverOverTrigger ||\n previewInternalState.openByHoverOverPopover ||\n previewInternalState.openByKeyboard\n );\n };\n\n const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);\n const preventDefaultClose = React.useRef(false);\n\n let popoverTrigger: React.ReactElement | undefined = undefined;\n let popoverSurface: React.ReactElement | undefined = undefined;\n if (children.length === 2) {\n popoverTrigger = children[0];\n popoverSurface = children[1];\n } else if (children.length === 1) {\n popoverSurface = children[0];\n }\n\n const popoverSurfaceId = useId('preview-surface', popoverSurface?.props.id);\n\n const closeCallback = () => {\n previewInternalState.openByClick = false;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n previewInternalState.openByKeyboard = false;\n setIsPopoverOpen(isOpen());\n };\n\n React.useEffect(() => {\n return () => {\n // Remove all instances of the current popover from the openedByHoverPreviewManager when the component is unmounted.\n removeOpenedByHoverPreview(popoverSurfaceId);\n };\n }, [popoverSurfaceId]);\n\n if (popoverSurface && popoverTrigger) {\n const handleTriggerTargetEnter = (e: TargetEvent<HTMLSpanElement>): void => {\n previewInternalState.openByHoverOverTrigger = true;\n triggerMousedOver.current = true;\n\n // We want to disable auto focus only if the popover is being opened by hovering over the trigger\n if (!previewInternalState.openByClick && !previewInternalState.openByKeyboard && !isPopoverOpen) {\n setDisableAutoFocus(true);\n onOpenChange?.(e, { open: true });\n closeAllOpenedByHoverPreviews(popoverSurfaceId);\n addOpenedByHoverPreview(popoverSurfaceId, closeCallback);\n }\n\n setIsPopoverOpen(isOpen());\n };\n\n const handleTriggerTargetLeave = (e: TargetEvent<HTMLSpanElement>): void => {\n previewInternalState.openByHoverOverTrigger = false;\n triggerMousedOver.current = false;\n\n setTimeout(() => {\n setIsPopoverOpen(isOpen());\n\n // We want to call onOpenChange only if the popover is actually closing when leaving the trigger\n if (\n !previewInternalState.openByClick &&\n !previewInternalState.openByKeyboard &&\n !previewInternalState.openByHoverOverPopover &&\n isPopoverOpen\n ) {\n onOpenChange?.(e, { open: false });\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n }, getDelay(e.type));\n };\n\n const handleTriggerClick = (e: TargetEvent<HTMLSpanElement>): void => {\n // Setting preventDefaultClose so that onPopoverOpenChange does not apply its logic when click is on the trigger as we want to control that behavior.\n preventDefaultClose.current = true;\n\n // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via click.\n setDisableAutoFocus(false);\n\n const tmpOpenByHoverOverTrigger = previewInternalState.openByHoverOverTrigger;\n\n // If openByKeyboard is true, then the popover was already opened via keyboard and we always want to close it.\n previewInternalState.openByClick = previewInternalState.openByKeyboard\n ? false\n : !previewInternalState.openByClick;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n previewInternalState.openByKeyboard = false;\n\n // We set triggerMousedOver to false when clicking, since we just interacted with the trigger via click, and not hover.\n if (triggerMousedOver.current) {\n previewInternalState.openByClick = false;\n triggerMousedOver.current = false;\n }\n // If it was not moused over, we want to prevent the default click action from opening a link, so the preview can open first\n else {\n e.preventDefault();\n }\n\n if (!tmpOpenByHoverOverTrigger) {\n onOpenChange?.(e, { open: previewInternalState.openByClick });\n }\n\n if (!isOpen()) {\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n setIsPopoverOpen(isOpen());\n };\n\n const handleTriggerKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>): void => {\n if (e.key === Enter) {\n clearTimeout();\n\n // Setting default prevented so that Enter key does not trigger a click event or onPopoverOpenChange.\n e.preventDefault();\n\n // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via keyboard.\n setDisableAutoFocus(false);\n\n const tmpOpenByHoverOverTrigger = previewInternalState.openByHoverOverTrigger;\n\n // If openByClick is true, then the popover was already opened via click and we always want to close it.\n previewInternalState.openByKeyboard = previewInternalState.openByClick\n ? false\n : !previewInternalState.openByKeyboard;\n previewInternalState.openByClick = false;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n\n if (!tmpOpenByHoverOverTrigger) {\n onOpenChange?.(e, { open: previewInternalState.openByKeyboard });\n }\n\n if (!isOpen()) {\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n setIsPopoverOpen(isOpen());\n }\n };\n\n const handlePopoverTargetEnter = (e: TargetEvent<HTMLDivElement>): void => {\n previewInternalState.openByHoverOverPopover = true;\n setIsPopoverOpen(isOpen());\n };\n\n const handlePopoverTargetLeave = (e: TargetEvent<HTMLDivElement>): void => {\n previewInternalState.openByHoverOverPopover = false;\n setTimeout(() => {\n setIsPopoverOpen(isOpen());\n\n // We want to call onOpenChange only if the popover is actually closing when leaving the popover\n if (\n !previewInternalState.openByClick &&\n !previewInternalState.openByKeyboard &&\n !previewInternalState.openByHoverOverTrigger\n ) {\n onOpenChange?.(e, { open: false });\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n }, getDelay(e.type));\n };\n\n popoverTrigger = React.cloneElement(popoverTrigger, {\n ...popoverTrigger.props,\n children: React.cloneElement(popoverTrigger.props.children as React.ReactElement, {\n ...popoverTrigger.props.children.props,\n onBlur: mergeCallbacks(popoverTrigger.props.children.props.onBlur, handleTriggerTargetLeave),\n onClick: mergeCallbacks(popoverTrigger.props.children.props.onClick, handleTriggerClick),\n onKeyDown: mergeCallbacks(popoverTrigger.props.children.props.onKeyDown, handleTriggerKeyDown),\n onMouseEnter: mergeCallbacks(popoverTrigger.props.children.props.onMouseEnter, handleTriggerTargetEnter),\n onMouseLeave: mergeCallbacks(popoverTrigger.props.children.props.onMouseLeave, handleTriggerTargetLeave),\n }),\n });\n\n popoverSurface = React.cloneElement(popoverSurface, {\n ...popoverSurface.props,\n 'aria-labelledby':\n popoverSurface.props['aria-labelledby'] ?? popoverSurface.props['aria-label'] ? undefined : popoverSurfaceId,\n id: popoverSurfaceId,\n onMouseEnter: mergeCallbacks(popoverSurface.props.onMouseEnter, handlePopoverTargetEnter),\n onMouseLeave: mergeCallbacks(popoverSurface.props.onMouseLeave, handlePopoverTargetLeave),\n onFocus: mergeCallbacks(popoverSurface.props.onFocus, handlePopoverTargetEnter),\n });\n }\n\n // Hitting Escape key should close the popover if it was opened by hover.\n // This is necessary to attach to the document because focus is likely not within the trigger or popover.\n useIsomorphicLayoutEffect(() => {\n if (isPopoverOpen) {\n const onDocumentKeyDown = (e: KeyboardEvent) => {\n const openedByHover = !previewInternalState.openByClick && !previewInternalState.openByKeyboard;\n\n if (openedByHover && e.key === Escape) {\n clearTimeout();\n\n // We set state back to its default if the Escape key has been pressed\n setDisableAutoFocus(true);\n closeCallback();\n removeOpenedByHoverPreview(popoverSurfaceId);\n\n onOpenChange?.(e as unknown as OpenPopoverEvents, { open: false });\n\n e.stopPropagation();\n }\n };\n\n targetDocument?.addEventListener('keydown', onDocumentKeyDown, { capture: true });\n\n return () => {\n targetDocument?.removeEventListener('keydown', onDocumentKeyDown, { capture: true });\n };\n }\n }, [targetDocument, isPopoverOpen]);\n\n const onPopoverOpenChange = (e: OpenPopoverEvents, data: OnOpenChangeData): void => {\n if (!preventDefaultClose.current) {\n // We set all open state to false if preventDefaultClose was not set to true and the popover is closing.\n if (!data.open) {\n clearTimeout();\n closeCallback();\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n onOpenChange?.(e, data);\n }\n\n preventDefaultClose.current = false;\n };\n\n let resolvedChildren = children as [JSX.Element, JSX.Element] | JSX.Element;\n if (popoverSurface) {\n if (popoverTrigger) {\n resolvedChildren = [popoverTrigger, popoverSurface];\n } else {\n resolvedChildren = popoverSurface;\n }\n }\n\n const popoverState = usePopover_unstable({\n ...props,\n children: resolvedChildren,\n onOpenChange: onPopoverOpenChange,\n open: open ?? isPopoverOpen,\n positioning:\n typeof positioning === 'string'\n ? { autoSize: true, ...resolvePositioningShorthand(positioning) }\n : { autoSize: true, ...positioning },\n unstable_disableAutoFocus: unstable_disableAutoFocus ?? disableAutoFocus,\n });\n\n return {\n ...popoverState,\n isPreviewLocked: previewInternalState.openByClick || previewInternalState.openByKeyboard,\n };\n};\n"],"names":["onOpenChange","POPOVER_MOUSE_HIDE_DELAY","POPOVER_KEYBOARD_HIDE_DELAY","getDelay","type","positioning","targetDocument","open","disableAutoFocus","unstable_disableAutoFocus","previewInternalState","openByHoverOverTrigger","toArray","props","children","openByHoverOverPopover","openByKeyboard","useFluent","setTimeout","triggerMousedOver","React","useRef","setDisableAutoFocus","useState","current","isPopoverOpen","openByClick","preventDefaultClose","undefined","length","popoverSurface","isOpen","popoverSurfaceId","setIsPopoverOpen","useId","id","removeOpenedByHoverPreview","e","closeAllOpenedByHoverPreviews","addOpenedByHoverPreview","handleTriggerTargetLeave","handleTriggerClick","preventDefault","tmpOpenByHoverOverTrigger","handleTriggerKeyDown","popoverTrigger","cloneElement","mergeCallbacks","onKeyDown","onMouseLeave","onBlur","onClick","onMouseEnter","handlePopoverTargetEnter","_popoverSurface_props_arialabelledby","useIsomorphicLayoutEffect","onDocumentKeyDown","openedByHover","closeCallback","key","Escape","capture","addEventListener","removeEventListener","onPopoverOpenChange","clearTimeout","data","resolvedChildren","autoSize","resolvePositioningShorthand","isPreviewLocked","popoverState"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["usePreview.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Enter, Escape } from '@fluentui/keyboard-keys';\nimport {\n mergeCallbacks,\n resolvePositioningShorthand,\n useFluent,\n useId,\n useIsomorphicLayoutEffect,\n usePopover_unstable,\n} from '@fluentui/react-components';\nimport { useTimeout } from '@fluentui/react-utilities';\nimport type { OnOpenChangeData, OpenPopoverEvents } from '@fluentui/react-components';\n\nimport { addOpenedByHoverPreview, closeAllOpenedByHoverPreviews, removeOpenedByHoverPreview } from '../../utils';\nimport type { PreviewProps, PreviewState } from './Preview.types';\n\ntype PreviewInternalState = {\n openByClick: boolean;\n openByHoverOverTrigger: boolean;\n openByHoverOverPopover: boolean;\n openByKeyboard: boolean;\n};\n\nconst POPOVER_MOUSE_DELAY = 250;\nconst POPOVER_KEYBOARD_HIDE_DELAY = 0;\n\nconst getDelay = (type: string, popoverMouseHideDelay: number): number => {\n if (type === 'focus' || type === 'blur') {\n return POPOVER_KEYBOARD_HIDE_DELAY;\n }\n\n return popoverMouseHideDelay;\n};\n\ntype TargetEvent<T> = React.MouseEvent<T> | React.FocusEvent<T>;\n\n/**\n * Create the state required to render Preview.\n *\n * The returned state can be modified with hooks such as usePreviewStyles_unstable,\n * before being passed to renderPreview_unstable.\n *\n * @param props - props from this instance of Preview\n * @param ref - reference to root HTMLElement of Preview\n */\nexport const usePreview_unstable = (props: PreviewProps): PreviewState => {\n const {\n hideDelay = POPOVER_MOUSE_DELAY,\n onOpenChange,\n open,\n positioning,\n showDelay = POPOVER_MOUSE_DELAY,\n unstable_disableAutoFocus,\n } = props;\n\n const children = React.Children.toArray(props.children) as React.ReactElement[];\n\n const { targetDocument } = useFluent();\n const [setEnterTimeout, clearEnterTimeout] = useTimeout();\n const [setLeaveTimeout, clearLeaveTimeout] = useTimeout();\n\n const [disableAutoFocus, setDisableAutoFocus] = React.useState(true);\n\n const { current: previewInternalState } = React.useRef<PreviewInternalState>({\n openByClick: false,\n openByHoverOverTrigger: false,\n openByHoverOverPopover: false,\n openByKeyboard: false,\n });\n const triggerMousedOver = React.useRef(false);\n\n const isOpen = () => {\n return (\n previewInternalState.openByClick ||\n previewInternalState.openByHoverOverTrigger ||\n previewInternalState.openByHoverOverPopover ||\n previewInternalState.openByKeyboard\n );\n };\n\n const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);\n const preventDefaultClose = React.useRef(false);\n\n let popoverTrigger: React.ReactElement | undefined = undefined;\n let popoverSurface: React.ReactElement | undefined = undefined;\n if (children.length === 2) {\n popoverTrigger = children[0];\n popoverSurface = children[1];\n } else if (children.length === 1) {\n popoverSurface = children[0];\n }\n\n const popoverSurfaceId = useId('preview-surface', popoverSurface?.props.id);\n\n const closeCallback = () => {\n previewInternalState.openByClick = false;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n previewInternalState.openByKeyboard = false;\n setIsPopoverOpen(isOpen());\n clearEnterTimeout();\n };\n\n React.useEffect(() => {\n return () => {\n // Remove all instances of the current popover from the openedByHoverPreviewManager when the component is unmounted.\n removeOpenedByHoverPreview(popoverSurfaceId);\n };\n }, [popoverSurfaceId]);\n\n if (popoverSurface && popoverTrigger) {\n const handleTriggerTargetEnter = (e: TargetEvent<HTMLSpanElement>): void => {\n previewInternalState.openByHoverOverTrigger = true;\n triggerMousedOver.current = true;\n\n // We want to disable auto focus only if the popover is being opened by hovering over the trigger\n if (!previewInternalState.openByClick && !previewInternalState.openByKeyboard && !isPopoverOpen) {\n setDisableAutoFocus(true);\n onOpenChange?.(e, { open: true });\n closeAllOpenedByHoverPreviews(popoverSurfaceId);\n addOpenedByHoverPreview(popoverSurfaceId, closeCallback);\n }\n\n setEnterTimeout(() => {\n setIsPopoverOpen(isOpen());\n }, showDelay);\n };\n\n const handleTriggerTargetLeave = (e: TargetEvent<HTMLSpanElement>): void => {\n previewInternalState.openByHoverOverTrigger = false;\n triggerMousedOver.current = false;\n\n setLeaveTimeout(() => {\n setIsPopoverOpen(isOpen());\n\n // We want to call onOpenChange only if the popover is actually closing when leaving the trigger\n if (\n !previewInternalState.openByClick &&\n !previewInternalState.openByKeyboard &&\n !previewInternalState.openByHoverOverPopover &&\n isPopoverOpen\n ) {\n onOpenChange?.(e, { open: false });\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n }, getDelay(e.type, hideDelay));\n };\n\n const handleTriggerClick = (e: TargetEvent<HTMLSpanElement>): void => {\n // Setting preventDefaultClose so that onPopoverOpenChange does not apply its logic when click is on the trigger as we want to control that behavior.\n preventDefaultClose.current = true;\n\n // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via click.\n setDisableAutoFocus(false);\n\n const tmpOpenByHoverOverTrigger = previewInternalState.openByHoverOverTrigger;\n\n // If openByKeyboard is true, then the popover was already opened via keyboard and we always want to close it.\n previewInternalState.openByClick = previewInternalState.openByKeyboard\n ? false\n : !previewInternalState.openByClick;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n previewInternalState.openByKeyboard = false;\n\n // We set triggerMousedOver to false when clicking, since we just interacted with the trigger via click, and not hover.\n if (triggerMousedOver.current) {\n previewInternalState.openByClick = false;\n triggerMousedOver.current = false;\n }\n // If it was not moused over, we want to prevent the default click action from opening a link, so the preview can open first\n else {\n e.preventDefault();\n }\n\n if (!tmpOpenByHoverOverTrigger) {\n onOpenChange?.(e, { open: previewInternalState.openByClick });\n }\n\n if (!isOpen()) {\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n setIsPopoverOpen(isOpen());\n };\n\n const handleTriggerKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>): void => {\n if (e.key === Enter) {\n clearLeaveTimeout();\n\n // Setting default prevented so that Enter key does not trigger a click event or onPopoverOpenChange.\n e.preventDefault();\n\n // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via keyboard.\n setDisableAutoFocus(false);\n\n const tmpOpenByHoverOverTrigger = previewInternalState.openByHoverOverTrigger;\n\n // If openByClick is true, then the popover was already opened via click and we always want to close it.\n previewInternalState.openByKeyboard = previewInternalState.openByClick\n ? false\n : !previewInternalState.openByKeyboard;\n previewInternalState.openByClick = false;\n previewInternalState.openByHoverOverTrigger = false;\n previewInternalState.openByHoverOverPopover = false;\n\n if (!tmpOpenByHoverOverTrigger) {\n onOpenChange?.(e, { open: previewInternalState.openByKeyboard });\n }\n\n if (!isOpen()) {\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n setIsPopoverOpen(isOpen());\n }\n };\n\n const handlePopoverTargetEnter = (e: TargetEvent<HTMLDivElement>): void => {\n previewInternalState.openByHoverOverPopover = true;\n setIsPopoverOpen(isOpen());\n };\n\n const handlePopoverTargetLeave = (e: TargetEvent<HTMLDivElement>): void => {\n previewInternalState.openByHoverOverPopover = false;\n setLeaveTimeout(() => {\n setIsPopoverOpen(isOpen());\n\n // We want to call onOpenChange only if the popover is actually closing when leaving the popover\n if (\n !previewInternalState.openByClick &&\n !previewInternalState.openByKeyboard &&\n !previewInternalState.openByHoverOverTrigger\n ) {\n onOpenChange?.(e, { open: false });\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n }, getDelay(e.type, hideDelay));\n };\n\n popoverTrigger = React.cloneElement(popoverTrigger, {\n ...popoverTrigger.props,\n children: React.cloneElement(popoverTrigger.props.children as React.ReactElement, {\n ...popoverTrigger.props.children.props,\n onBlur: mergeCallbacks(popoverTrigger.props.children.props.onBlur, handleTriggerTargetLeave),\n onClick: mergeCallbacks(popoverTrigger.props.children.props.onClick, handleTriggerClick),\n onKeyDown: mergeCallbacks(popoverTrigger.props.children.props.onKeyDown, handleTriggerKeyDown),\n onMouseEnter: mergeCallbacks(popoverTrigger.props.children.props.onMouseEnter, handleTriggerTargetEnter),\n onMouseLeave: mergeCallbacks(popoverTrigger.props.children.props.onMouseLeave, handleTriggerTargetLeave),\n }),\n });\n\n popoverSurface = React.cloneElement(popoverSurface, {\n ...popoverSurface.props,\n 'aria-labelledby':\n popoverSurface.props['aria-labelledby'] ?? popoverSurface.props['aria-label'] ? undefined : popoverSurfaceId,\n id: popoverSurfaceId,\n onMouseEnter: mergeCallbacks(popoverSurface.props.onMouseEnter, handlePopoverTargetEnter),\n onMouseLeave: mergeCallbacks(popoverSurface.props.onMouseLeave, handlePopoverTargetLeave),\n onFocus: mergeCallbacks(popoverSurface.props.onFocus, handlePopoverTargetEnter),\n });\n }\n\n // Hitting Escape key should close the popover if it was opened by hover.\n // This is necessary to attach to the document because focus is likely not within the trigger or popover.\n useIsomorphicLayoutEffect(() => {\n if (isPopoverOpen) {\n const onDocumentKeyDown = (e: KeyboardEvent) => {\n const openedByHover = !previewInternalState.openByClick && !previewInternalState.openByKeyboard;\n\n if (openedByHover && e.key === Escape) {\n clearLeaveTimeout();\n\n // We set state back to its default if the Escape key has been pressed\n setDisableAutoFocus(true);\n closeCallback();\n removeOpenedByHoverPreview(popoverSurfaceId);\n\n onOpenChange?.(e as unknown as OpenPopoverEvents, { open: false });\n\n e.stopPropagation();\n }\n };\n\n targetDocument?.addEventListener('keydown', onDocumentKeyDown, { capture: true });\n\n return () => {\n targetDocument?.removeEventListener('keydown', onDocumentKeyDown, { capture: true });\n };\n }\n }, [targetDocument, isPopoverOpen]);\n\n const onPopoverOpenChange = (e: OpenPopoverEvents, data: OnOpenChangeData): void => {\n if (!preventDefaultClose.current) {\n // We set all open state to false if preventDefaultClose was not set to true and the popover is closing.\n if (!data.open) {\n clearLeaveTimeout();\n closeCallback();\n removeOpenedByHoverPreview(popoverSurfaceId);\n }\n\n onOpenChange?.(e, data);\n }\n\n preventDefaultClose.current = false;\n };\n\n let resolvedChildren = children as [JSX.Element, JSX.Element] | JSX.Element;\n if (popoverSurface) {\n if (popoverTrigger) {\n resolvedChildren = [popoverTrigger, popoverSurface];\n } else {\n resolvedChildren = popoverSurface;\n }\n }\n\n const popoverState = usePopover_unstable({\n ...props,\n children: resolvedChildren,\n onOpenChange: onPopoverOpenChange,\n open: open ?? isPopoverOpen,\n positioning:\n typeof positioning === 'string'\n ? { autoSize: true, ...resolvePositioningShorthand(positioning) }\n : { autoSize: true, ...positioning },\n unstable_disableAutoFocus: unstable_disableAutoFocus ?? disableAutoFocus,\n });\n\n return {\n ...popoverState,\n isPreviewLocked: previewInternalState.openByClick || previewInternalState.openByKeyboard,\n };\n};\n"],"names":["hideDelay","POPOVER_MOUSE_DELAY","POPOVER_KEYBOARD_HIDE_DELAY","getDelay","type","popoverMouseHideDelay","targetDocument","useFluent","onOpenChange","setEnterTimeout","open","positioning","disableAutoFocus","showDelay","current","previewInternalState","openByHoverOverPopover","toArray","props","children","openByKeyboard","triggerMousedOver","clearEnterTimeout","useTimeout","setLeaveTimeout","openByClick","setDisableAutoFocus","React","useState","preventDefaultClose","popoverTrigger","popoverSurface","openByHoverOverTrigger","useRef","isOpen","popoverSurfaceId","useId","setIsPopoverOpen","useEffect","length","removeOpenedByHoverPreview","closeCallback","handleTriggerTargetEnter","closeAllOpenedByHoverPreviews","addOpenedByHoverPreview","handleTriggerTargetLeave","e","handleTriggerClick","isPopoverOpen","tmpOpenByHoverOverTrigger","clearLeaveTimeout","handlePopoverTargetEnter","handlePopoverTargetLeave","cloneElement","onBlur","mergeCallbacks","onMouseLeave","onMouseEnter","onFocus","_popoverSurface_props_arialabelledby","useIsomorphicLayoutEffect","undefined","openedByHover","Escape","stopPropagation","key","onPopoverOpenChange","removeEventListener","onDocumentKeyDown","data","resolvedChildren","popoverState","autoSize","resolvePositioningShorthand","unstable_disableAutoFocus"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|