ropav 0.1.7 → 0.1.8
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/README.md +1 -1
- package/dist/ancestry.js +136 -0
- package/dist/calendar.css +173 -0
- package/dist/calendar.js +714 -0
- package/dist/calendar2.js +37 -0
- package/dist/chevron-left.js +12 -0
- package/dist/color-picker.js +38 -88
- package/dist/combobox.css +251 -0
- package/dist/combobox.js +410 -0
- package/dist/components/calendar/calendar.d.ts +30 -0
- package/dist/components/calendar/calendarBehavior.d.ts +49 -0
- package/dist/components/calendar/index.d.ts +3 -0
- package/dist/components/calendar/index.js +3 -0
- package/dist/components/calendar/types.d.ts +53 -0
- package/dist/components/calendar/useCalendar.d.ts +24 -0
- package/dist/components/color-picker/useColorPickerDrag.d.ts +1 -1
- package/dist/components/color-picker/useColorPickerSaturation.d.ts +1 -1
- package/dist/components/color-picker/useColorPickerSlider.d.ts +1 -1
- package/dist/components/combobox/combobox.d.ts +29 -0
- package/dist/components/combobox/comboboxModel.d.ts +4 -0
- package/dist/components/combobox/index.d.ts +3 -0
- package/dist/components/combobox/index.js +2 -0
- package/dist/components/combobox/types.d.ts +43 -0
- package/dist/components/combobox/useCombobox.d.ts +45 -0
- package/dist/components/date-picker/date-picker.d.ts +33 -0
- package/dist/components/date-picker/datePickerModel.d.ts +10 -0
- package/dist/components/date-picker/index.d.ts +4 -0
- package/dist/components/date-picker/index.js +2 -0
- package/dist/components/date-picker/types.d.ts +57 -0
- package/dist/components/date-picker/useDatePicker.d.ts +29 -0
- package/dist/components/date-picker/useDatePickerValueState.d.ts +21 -0
- package/dist/components/dropdown-menu/dropdown-menu-content.d.ts +2 -2
- package/dist/components/dropdown-menu/dropdown-menu-sub-content.d.ts +2 -2
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +2 -2
- package/dist/components/dropdown-menu/dropdownMenuContext.d.ts +7 -18
- package/dist/components/dropdown-menu/dropdownMenuInteraction.d.ts +3 -3
- package/dist/components/dropdown-menu/dropdownMenuInteractionTypes.d.ts +58 -29
- package/dist/components/dropdown-menu/useDropdownMenuDataController.d.ts +4 -3
- package/dist/components/dropdown-menu/useDropdownMenuDataRegistration.d.ts +6 -4
- package/dist/components/dropdown-menu/useDropdownMenuPresentation.d.ts +3 -4
- package/dist/components/dropdown-menu/useDropdownMenuTargetBindings.d.ts +5 -5
- package/dist/components/dropzone/dropzone.d.ts +31 -0
- package/dist/components/dropzone/dropzoneModel.d.ts +16 -0
- package/dist/components/dropzone/index.d.ts +3 -0
- package/dist/components/dropzone/index.js +2 -0
- package/dist/components/dropzone/types.d.ts +56 -0
- package/dist/components/dropzone/useDropzone.d.ts +25 -0
- package/dist/components/file-input/file-input.d.ts +29 -0
- package/dist/components/file-input/index.d.ts +3 -0
- package/dist/components/file-input/index.js +2 -0
- package/dist/components/file-input/types.d.ts +37 -0
- package/dist/components/file-input/useFileInput.d.ts +15 -0
- package/dist/components/floating/index.js +1 -1
- package/dist/components/floating/useFloatingPosition.d.ts +1 -13
- package/dist/components/floating/useFloatingTargetLifecycle.d.ts +32 -0
- package/dist/components/floating/useHoverDisclosure.d.ts +10 -0
- package/dist/components/hover-card/hover-card.d.ts +25 -0
- package/dist/components/hover-card/index.d.ts +3 -0
- package/dist/components/hover-card/index.js +2 -0
- package/dist/components/hover-card/types.d.ts +45 -0
- package/dist/components/hover-card/useHoverCard.d.ts +22 -0
- package/dist/components/hover-card/useHoverCardDisclosure.d.ts +19 -0
- package/dist/components/multi-select/index.d.ts +3 -0
- package/dist/components/multi-select/index.js +2 -0
- package/dist/components/multi-select/multi-select.d.ts +30 -0
- package/dist/components/multi-select/multiSelectModel.d.ts +3 -0
- package/dist/components/multi-select/types.d.ts +49 -0
- package/dist/components/multi-select/useMultiSelect.d.ts +46 -0
- package/dist/components/number-input/useNumberInput.d.ts +1 -3
- package/dist/components/popover/usePopoverBindings.d.ts +3 -6
- package/dist/components/scroll-area/useScrollArea.d.ts +4 -4
- package/dist/components/scroll-area/useScrollAreaAttributes.d.ts +3 -3
- package/dist/components/scroll-area/useScrollAreaPointer.d.ts +1 -1
- package/dist/components/segmented-control/index.d.ts +3 -0
- package/dist/components/segmented-control/index.js +2 -0
- package/dist/components/segmented-control/segmented-control.d.ts +26 -0
- package/dist/components/segmented-control/types.d.ts +47 -0
- package/dist/components/segmented-control/useSegmentedControl.d.ts +15 -0
- package/dist/components/select/useSelect.d.ts +31 -19
- package/dist/components/slider/useRangeSlider.d.ts +1 -1
- package/dist/components/slider/useRangeSliderPointer.d.ts +1 -1
- package/dist/components/tags-input/index.d.ts +3 -0
- package/dist/components/tags-input/index.js +2 -0
- package/dist/components/tags-input/tags-input.d.ts +27 -0
- package/dist/components/tags-input/tagsInputModel.d.ts +12 -0
- package/dist/components/tags-input/types.d.ts +37 -0
- package/dist/components/tags-input/useTagsInput.d.ts +23 -0
- package/dist/components/tooltip/useTooltipTargetBindings.d.ts +12 -0
- package/dist/date-picker.css +49 -0
- package/dist/date-picker.js +809 -0
- package/dist/dialog.js +9 -20
- package/dist/direction.js +6 -0
- package/dist/dropdown-menu.css +21 -3
- package/dist/dropdown-menu.js +341 -261
- package/dist/dropzone.css +135 -0
- package/dist/dropzone.js +431 -0
- package/dist/file-input.css +135 -0
- package/dist/file-input.js +198 -0
- package/dist/hover-card.css +80 -0
- package/dist/hover-card.js +402 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +14 -3
- package/dist/internal/composables/useOverlayLayer.d.ts +12 -0
- package/dist/modal.js +1 -1
- package/dist/multi-select.css +316 -0
- package/dist/multi-select.js +481 -0
- package/dist/nativeChoice.js +169 -0
- package/dist/number-input.css +18 -18
- package/dist/number-input.js +36 -38
- package/dist/pagination.js +1 -10
- package/dist/pointerSession.js +130 -0
- package/dist/popover.css +21 -3
- package/dist/popover.js +37 -62
- package/dist/scroll-area.js +52 -62
- package/dist/segmented-control.css +176 -0
- package/dist/segmented-control.js +382 -0
- package/dist/select.css +50 -48
- package/dist/select.js +121 -271
- package/dist/slider.js +70 -129
- package/dist/tags-input.css +197 -0
- package/dist/tags-input.js +380 -0
- package/dist/tooltip.js +35 -30
- package/dist/useEditableOptionList.js +216 -0
- package/dist/useFlatOptionCollection.js +134 -0
- package/dist/useFloatingPosition.js +4 -160
- package/dist/useFloatingTargetLifecycle.js +127 -0
- package/dist/useFormControl.js +1 -0
- package/dist/{floating.js → useHoverDisclosure.js} +338 -421
- package/dist/useNativeChoiceTransaction.js +46 -0
- package/dist/useNativeFileSelection.js +86 -0
- package/dist/useOverlayZIndex.js +246 -15
- package/dist/utils/date.d.ts +13 -0
- package/dist/utils/dateAvailability.d.ts +7 -0
- package/dist/utils/dom/ancestry.d.ts +1 -0
- package/dist/utils/dom/direction.d.ts +2 -0
- package/dist/utils/dom/files.d.ts +3 -0
- package/dist/utils/dom/nativeChoice.d.ts +17 -0
- package/dist/utils/dom/pointerSession.d.ts +20 -0
- package/dist/utils/dom/scroll.d.ts +2 -1
- package/dist/utils/optionFilter.d.ts +5 -0
- package/docs/public-floating-api.md +7 -4
- package/docs/public-styles-api.md +25 -12
- package/package.json +39 -3
- package/src/styles/_mixins.scss +26 -0
- package/src/styles/styles-manifest.json +1 -2
- package/dist/components/floating/hoverDisclosureInteractionModel.d.ts +0 -42
- package/dist/components/floating/useHoverDisclosureInteractions.d.ts +0 -32
- package/dist/components/floating/useHoverDisclosureOpenState.d.ts +0 -25
- package/dist/components/floating/useHoverDisclosureTargetBinding.d.ts +0 -27
- package/dist/components/select/useSelectNativeControl.d.ts +0 -9
- package/dist/components/select/useSelectNativeValue.d.ts +0 -9
- package/dist/pointer.js +0 -9
- package/dist/utils/dom/pointer.d.ts +0 -2
|
@@ -1,52 +1,57 @@
|
|
|
1
1
|
import { t as useControllableValue } from "./useControllableValue.js";
|
|
2
|
-
import {
|
|
2
|
+
import { t as isElement } from "./query.js";
|
|
3
3
|
import { r as normalizeDelay } from "./number.js";
|
|
4
|
-
import { i as isNodeWithinElement, r as isEventWithinTargets } from "./events.js";
|
|
4
|
+
import { i as isNodeWithinElement, n as isEventWithinElement, r as isEventWithinTargets } from "./events.js";
|
|
5
|
+
import { t as useFloatingTargetLifecycle } from "./useFloatingTargetLifecycle.js";
|
|
5
6
|
import { computed, onBeforeUnmount, onMounted, shallowRef, toValue, watch } from "vue";
|
|
6
|
-
//#region src/components/floating/
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
//#region src/components/floating/useHoverDisclosure.ts
|
|
8
|
+
var DEFAULT_OPEN_DELAY = 0;
|
|
9
|
+
var DEFAULT_CLOSE_DELAY = 0;
|
|
10
|
+
var TOUCH_CLICK_EXPIRY_DELAY = 500;
|
|
11
|
+
function useHoverDisclosure(options = {}) {
|
|
12
|
+
return useHoverDisclosureImplementation(options).disclosure;
|
|
13
|
+
}
|
|
14
|
+
function useHoverDisclosureWithExternalDismissal(options) {
|
|
15
|
+
return useHoverDisclosureImplementation(options, true);
|
|
16
|
+
}
|
|
17
|
+
function useHoverDisclosureImplementation(options, dismissalRouted = false) {
|
|
18
|
+
const interaction = createInteractionState();
|
|
19
|
+
const targets = createTargetState();
|
|
20
|
+
const commands = useHoverDisclosureOpenState(options, interaction, () => {
|
|
21
|
+
targets.contentElement = null;
|
|
22
|
+
});
|
|
23
|
+
const runtime = useHoverDisclosureInteractions({
|
|
24
|
+
commands,
|
|
25
|
+
dismissalRouted,
|
|
26
|
+
interaction,
|
|
27
|
+
options,
|
|
28
|
+
state: commands.state,
|
|
29
|
+
targets
|
|
30
|
+
});
|
|
31
|
+
useHoverDisclosureTargetBinding({
|
|
32
|
+
commands,
|
|
33
|
+
options,
|
|
34
|
+
runtime,
|
|
35
|
+
targets,
|
|
36
|
+
useDocumentDismissal: !dismissalRouted
|
|
37
|
+
});
|
|
9
38
|
return {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
39
|
+
disclosure: {
|
|
40
|
+
isOpen: commands.isOpen,
|
|
41
|
+
isDisabled: commands.isDisabled,
|
|
42
|
+
state: commands.state,
|
|
43
|
+
triggerProps: runtime.triggerProps,
|
|
44
|
+
contentProps: runtime.contentProps,
|
|
45
|
+
open: commands.open,
|
|
46
|
+
close: commands.close,
|
|
47
|
+
toggle: commands.toggle
|
|
48
|
+
},
|
|
49
|
+
dismissalHandlers: {
|
|
50
|
+
escapeKeyDown: runtime.onDocumentKeydown,
|
|
51
|
+
pointerDownOutside: runtime.onOutsidePointerdown
|
|
14
52
|
}
|
|
15
53
|
};
|
|
16
54
|
}
|
|
17
|
-
function hasActiveHoverDisclosureInteraction(state) {
|
|
18
|
-
return state.triggerHovered || state.contentHovered || state.triggerFocused || state.contentFocused || state.touchPinned;
|
|
19
|
-
}
|
|
20
|
-
function reduceHoverDisclosureInteraction(state, action) {
|
|
21
|
-
switch (action.type) {
|
|
22
|
-
case "hover": return setPartInteraction(state, action.part, "hover", action.active);
|
|
23
|
-
case "focus": return setPartInteraction(state, action.part, "focus", action.active);
|
|
24
|
-
case "pointer-down": return {
|
|
25
|
-
...state,
|
|
26
|
-
touchClickPending: false,
|
|
27
|
-
touchPointerActive: action.touch
|
|
28
|
-
};
|
|
29
|
-
case "pointer-up": return {
|
|
30
|
-
...state,
|
|
31
|
-
touchClickPending: action.touch && state.touchPointerActive,
|
|
32
|
-
touchPointerActive: false
|
|
33
|
-
};
|
|
34
|
-
case "pointer-cancel": return {
|
|
35
|
-
...state,
|
|
36
|
-
touchClickPending: false,
|
|
37
|
-
touchPointerActive: false
|
|
38
|
-
};
|
|
39
|
-
case "consume-touch-click": return {
|
|
40
|
-
...state,
|
|
41
|
-
touchClickPending: false
|
|
42
|
-
};
|
|
43
|
-
case "set-touch-pinned": return {
|
|
44
|
-
...state,
|
|
45
|
-
touchPinned: action.pinned
|
|
46
|
-
};
|
|
47
|
-
case "reset": return resetInteraction(state, action.part);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
55
|
function createInteractionState() {
|
|
51
56
|
return {
|
|
52
57
|
contentFocused: false,
|
|
@@ -58,40 +63,214 @@ function createInteractionState() {
|
|
|
58
63
|
triggerHovered: false
|
|
59
64
|
};
|
|
60
65
|
}
|
|
61
|
-
function
|
|
62
|
-
if (part === "trigger" && interaction === "hover") return {
|
|
63
|
-
...state,
|
|
64
|
-
triggerHovered: active
|
|
65
|
-
};
|
|
66
|
-
if (part === "trigger") return {
|
|
67
|
-
...state,
|
|
68
|
-
triggerFocused: active
|
|
69
|
-
};
|
|
70
|
-
if (interaction === "hover") return {
|
|
71
|
-
...state,
|
|
72
|
-
contentHovered: active
|
|
73
|
-
};
|
|
66
|
+
function createTargetState() {
|
|
74
67
|
return {
|
|
75
|
-
|
|
76
|
-
|
|
68
|
+
contentElement: null,
|
|
69
|
+
resolvedContentTarget: shallowRef(null),
|
|
70
|
+
resolvedInteractionTarget: shallowRef(null),
|
|
71
|
+
triggerElement: null
|
|
77
72
|
};
|
|
78
73
|
}
|
|
74
|
+
function hasActiveInteraction(state) {
|
|
75
|
+
return state.triggerHovered || state.contentHovered || state.triggerFocused || state.contentFocused || state.touchPinned;
|
|
76
|
+
}
|
|
77
|
+
function hasPendingTouchInteraction(state) {
|
|
78
|
+
return state.touchPointerActive || state.touchClickPending;
|
|
79
|
+
}
|
|
80
|
+
function setPartInteraction(state, part, kind, active) {
|
|
81
|
+
if (part === "trigger" && kind === "hover") {
|
|
82
|
+
state.triggerHovered = active;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (part === "trigger") {
|
|
86
|
+
state.triggerFocused = active;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (kind === "hover") {
|
|
90
|
+
state.contentHovered = active;
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
state.contentFocused = active;
|
|
94
|
+
}
|
|
79
95
|
function resetInteraction(state, part) {
|
|
80
|
-
if (part === "all"
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
96
|
+
if (part === "all" || part === "trigger") {
|
|
97
|
+
state.triggerFocused = false;
|
|
98
|
+
state.triggerHovered = false;
|
|
99
|
+
}
|
|
100
|
+
if (part === "all" || part === "content") {
|
|
101
|
+
state.contentFocused = false;
|
|
102
|
+
state.contentHovered = false;
|
|
103
|
+
}
|
|
104
|
+
if (part === "all") {
|
|
105
|
+
state.touchClickPending = false;
|
|
106
|
+
state.touchPinned = false;
|
|
107
|
+
state.touchPointerActive = false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function useHoverDisclosureOpenState(options, interaction, onContentClosed) {
|
|
111
|
+
const controlledOpen = computed(() => toValue(options.open));
|
|
112
|
+
const isDisabled = computed(() => Boolean(toValue(options.disabled)));
|
|
113
|
+
let pendingChangeDetails;
|
|
114
|
+
const controllableOpen = useControllableValue({
|
|
115
|
+
modelValue: () => controlledOpen.value,
|
|
116
|
+
defaultValue: () => options.defaultOpen === true && !isDisabled.value,
|
|
117
|
+
onChange: (nextOpen) => {
|
|
118
|
+
if (pendingChangeDetails) options.onOpenChange?.(nextOpen, pendingChangeDetails);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
const openState = controllableOpen.value;
|
|
122
|
+
const isOpen = computed(() => !isDisabled.value && openState.value);
|
|
123
|
+
const state = computed(() => isOpen.value ? "open" : "closed");
|
|
124
|
+
let requestedOpen = openState.value;
|
|
125
|
+
let openTimer;
|
|
126
|
+
let closeTimer;
|
|
127
|
+
let disposed = false;
|
|
128
|
+
function request(change) {
|
|
129
|
+
if (change.open) requestOpen(change);
|
|
130
|
+
else requestClose(change);
|
|
131
|
+
}
|
|
132
|
+
function requestOpen(change) {
|
|
133
|
+
if (change.timing === "immediate") {
|
|
134
|
+
clearTimers();
|
|
135
|
+
setOpen(true, change.reason, change.event);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (disposed || isDisabled.value) return;
|
|
139
|
+
clearCloseTimer();
|
|
140
|
+
clearOpenTimer();
|
|
141
|
+
if (requestedOpen) return;
|
|
142
|
+
const delay = normalizeDelay(toValue(options.openDelay), DEFAULT_OPEN_DELAY);
|
|
143
|
+
if (delay === 0) {
|
|
144
|
+
setOpen(true, change.reason, change.event);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
openTimer = setTimeout(() => {
|
|
148
|
+
openTimer = void 0;
|
|
149
|
+
if (!interaction.triggerHovered || isDisabled.value) return;
|
|
150
|
+
setOpen(true, change.reason, change.event);
|
|
151
|
+
}, delay);
|
|
152
|
+
}
|
|
153
|
+
function requestClose(change) {
|
|
154
|
+
if (change.timing === "immediate") {
|
|
155
|
+
clearTimers();
|
|
156
|
+
setOpen(false, change.reason, change.event);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
clearOpenTimer();
|
|
160
|
+
clearCloseTimer();
|
|
161
|
+
if (disposed || hasActiveInteraction(interaction)) return;
|
|
162
|
+
closeTimer = setTimeout(() => {
|
|
163
|
+
closeTimer = void 0;
|
|
164
|
+
if (hasActiveInteraction(interaction)) return;
|
|
165
|
+
setOpen(false, change.reason, change.event);
|
|
166
|
+
}, normalizeDelay(toValue(options.closeDelay), DEFAULT_CLOSE_DELAY));
|
|
167
|
+
}
|
|
168
|
+
function setOpen(nextOpen, reason, event) {
|
|
169
|
+
if (disposed || nextOpen && isDisabled.value || requestedOpen === nextOpen) return;
|
|
170
|
+
requestedOpen = nextOpen;
|
|
171
|
+
pendingChangeDetails = {
|
|
172
|
+
reason,
|
|
173
|
+
event
|
|
174
|
+
};
|
|
175
|
+
try {
|
|
176
|
+
controllableOpen.setValue(nextOpen);
|
|
177
|
+
} finally {
|
|
178
|
+
pendingChangeDetails = void 0;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function cancelScheduledClose() {
|
|
182
|
+
clearCloseTimer();
|
|
183
|
+
}
|
|
184
|
+
function isRequestedOpen() {
|
|
185
|
+
return requestedOpen;
|
|
186
|
+
}
|
|
187
|
+
function open() {
|
|
188
|
+
request({
|
|
189
|
+
open: true,
|
|
190
|
+
reason: "programmatic",
|
|
191
|
+
timing: "immediate"
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
function close() {
|
|
195
|
+
interaction.touchPinned = false;
|
|
196
|
+
request({
|
|
197
|
+
open: false,
|
|
198
|
+
reason: "programmatic",
|
|
199
|
+
timing: "immediate"
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
function toggle() {
|
|
203
|
+
if (requestedOpen || isOpen.value) close();
|
|
204
|
+
else open();
|
|
205
|
+
}
|
|
206
|
+
function clearOpenTimer() {
|
|
207
|
+
if (openTimer === void 0) return;
|
|
208
|
+
clearTimeout(openTimer);
|
|
209
|
+
openTimer = void 0;
|
|
210
|
+
}
|
|
211
|
+
function clearCloseTimer() {
|
|
212
|
+
if (closeTimer === void 0) return;
|
|
213
|
+
clearTimeout(closeTimer);
|
|
214
|
+
closeTimer = void 0;
|
|
215
|
+
}
|
|
216
|
+
function clearTimers() {
|
|
217
|
+
clearOpenTimer();
|
|
218
|
+
clearCloseTimer();
|
|
219
|
+
}
|
|
220
|
+
watch([openState, controllableOpen.isControlled], ([value]) => {
|
|
221
|
+
requestedOpen = value;
|
|
222
|
+
if (value) return;
|
|
223
|
+
resetInteraction(interaction, "content");
|
|
224
|
+
interaction.touchPinned = false;
|
|
225
|
+
onContentClosed();
|
|
226
|
+
}, { flush: "sync" });
|
|
227
|
+
watch(isDisabled, (disabled) => {
|
|
228
|
+
if (!disabled) return;
|
|
229
|
+
resetInteraction(interaction, "all");
|
|
230
|
+
request({
|
|
231
|
+
open: false,
|
|
232
|
+
reason: "disabled",
|
|
233
|
+
timing: "immediate"
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
onBeforeUnmount(() => {
|
|
237
|
+
disposed = true;
|
|
238
|
+
clearTimers();
|
|
239
|
+
});
|
|
86
240
|
return {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
241
|
+
cancelScheduledClose,
|
|
242
|
+
close,
|
|
243
|
+
isDisabled,
|
|
244
|
+
isOpen,
|
|
245
|
+
isRequestedOpen,
|
|
246
|
+
open,
|
|
247
|
+
request,
|
|
248
|
+
state,
|
|
249
|
+
toggle
|
|
90
250
|
};
|
|
91
251
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
function
|
|
252
|
+
function useHoverDisclosureInteractions({ commands, dismissalRouted, interaction, options, state, targets }) {
|
|
253
|
+
let touchClickExpiryTimer;
|
|
254
|
+
function clearTouchClickExpiryTimer() {
|
|
255
|
+
if (touchClickExpiryTimer === void 0) return;
|
|
256
|
+
clearTimeout(touchClickExpiryTimer);
|
|
257
|
+
touchClickExpiryTimer = void 0;
|
|
258
|
+
}
|
|
259
|
+
function clearPendingTouchClick() {
|
|
260
|
+
clearTouchClickExpiryTimer();
|
|
261
|
+
interaction.touchClickPending = false;
|
|
262
|
+
}
|
|
263
|
+
function scheduleTouchClickExpiry() {
|
|
264
|
+
clearTouchClickExpiryTimer();
|
|
265
|
+
touchClickExpiryTimer = setTimeout(() => {
|
|
266
|
+
touchClickExpiryTimer = void 0;
|
|
267
|
+
interaction.touchClickPending = false;
|
|
268
|
+
}, TOUCH_CLICK_EXPIRY_DELAY);
|
|
269
|
+
}
|
|
270
|
+
function originatesInContent(event) {
|
|
271
|
+
const contentTarget = targets.resolvedContentTarget.value;
|
|
272
|
+
return contentTarget !== null && contentTarget !== targets.resolvedInteractionTarget.value && isEventWithinElement(event, contentTarget);
|
|
273
|
+
}
|
|
95
274
|
function rememberTarget(part, event) {
|
|
96
275
|
const currentTarget = isElement(event.currentTarget) ? event.currentTarget : null;
|
|
97
276
|
if (part === "trigger") {
|
|
@@ -103,146 +282,112 @@ function useHoverDisclosureInteractions({ commands, interaction, options, state,
|
|
|
103
282
|
function onTriggerPointerenter(event) {
|
|
104
283
|
rememberTarget("trigger", event);
|
|
105
284
|
if (event.pointerType === "touch" || commands.isDisabled.value) return;
|
|
106
|
-
interaction
|
|
107
|
-
type: "hover",
|
|
108
|
-
part: "trigger",
|
|
109
|
-
active: true
|
|
110
|
-
});
|
|
285
|
+
setPartInteraction(interaction, "trigger", "hover", true);
|
|
111
286
|
requestOpen("hover", event, "delayed");
|
|
112
287
|
}
|
|
113
288
|
function onTriggerPointerleave(event) {
|
|
114
289
|
rememberTarget("trigger", event);
|
|
115
290
|
if (event.pointerType === "touch") return;
|
|
116
|
-
interaction
|
|
117
|
-
type: "hover",
|
|
118
|
-
part: "trigger",
|
|
119
|
-
active: false
|
|
120
|
-
});
|
|
291
|
+
setPartInteraction(interaction, "trigger", "hover", false);
|
|
121
292
|
requestClose("hover", event, "delayed");
|
|
122
293
|
}
|
|
123
294
|
function onContentPointerenter(event) {
|
|
124
295
|
rememberTarget("content", event);
|
|
125
296
|
if (event.pointerType === "touch" || commands.isDisabled.value) return;
|
|
126
|
-
interaction
|
|
127
|
-
type: "hover",
|
|
128
|
-
part: "content",
|
|
129
|
-
active: true
|
|
130
|
-
});
|
|
297
|
+
setPartInteraction(interaction, "content", "hover", true);
|
|
131
298
|
commands.cancelScheduledClose();
|
|
132
299
|
}
|
|
133
300
|
function onContentPointerleave(event) {
|
|
134
301
|
rememberTarget("content", event);
|
|
135
302
|
if (event.pointerType === "touch") return;
|
|
136
|
-
interaction
|
|
137
|
-
type: "hover",
|
|
138
|
-
part: "content",
|
|
139
|
-
active: false
|
|
140
|
-
});
|
|
303
|
+
setPartInteraction(interaction, "content", "hover", false);
|
|
141
304
|
requestClose("hover", event, "delayed");
|
|
142
305
|
}
|
|
143
306
|
function onTriggerFocusin(event) {
|
|
144
307
|
rememberTarget("trigger", event);
|
|
145
|
-
if (commands.isDisabled.value || toValue(options.openOnFocus) === false) return;
|
|
146
|
-
interaction
|
|
147
|
-
type: "focus",
|
|
148
|
-
part: "trigger",
|
|
149
|
-
active: true
|
|
150
|
-
});
|
|
308
|
+
if (commands.isDisabled.value || toValue(options.openOnFocus) === false || hasPendingTouchInteraction(interaction)) return;
|
|
309
|
+
setPartInteraction(interaction, "trigger", "focus", true);
|
|
151
310
|
requestOpen("focus", event, "immediate");
|
|
152
311
|
}
|
|
153
312
|
function onTriggerFocusout(event) {
|
|
154
313
|
rememberTarget("trigger", event);
|
|
155
314
|
if (!focusLeavesCurrentTarget(event)) return;
|
|
156
|
-
interaction
|
|
157
|
-
type: "focus",
|
|
158
|
-
part: "trigger",
|
|
159
|
-
active: false
|
|
160
|
-
});
|
|
315
|
+
setPartInteraction(interaction, "trigger", "focus", false);
|
|
161
316
|
requestClose("focus", event, "delayed");
|
|
162
317
|
}
|
|
163
318
|
function onContentFocusin(event) {
|
|
164
319
|
rememberTarget("content", event);
|
|
165
320
|
if (commands.isDisabled.value) return;
|
|
166
|
-
interaction
|
|
167
|
-
type: "focus",
|
|
168
|
-
part: "content",
|
|
169
|
-
active: true
|
|
170
|
-
});
|
|
321
|
+
setPartInteraction(interaction, "content", "focus", true);
|
|
171
322
|
commands.cancelScheduledClose();
|
|
172
323
|
}
|
|
173
324
|
function onContentFocusout(event) {
|
|
174
325
|
rememberTarget("content", event);
|
|
175
326
|
if (!focusLeavesCurrentTarget(event)) return;
|
|
176
|
-
interaction
|
|
177
|
-
type: "focus",
|
|
178
|
-
part: "content",
|
|
179
|
-
active: false
|
|
180
|
-
});
|
|
327
|
+
setPartInteraction(interaction, "content", "focus", false);
|
|
181
328
|
requestClose("focus", event, "delayed");
|
|
182
329
|
}
|
|
183
330
|
function onTriggerPointerdown(event) {
|
|
331
|
+
if (originatesInContent(event)) return;
|
|
184
332
|
rememberTarget("trigger", event);
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
touch: event.pointerType === "touch"
|
|
188
|
-
});
|
|
333
|
+
clearPendingTouchClick();
|
|
334
|
+
interaction.touchPointerActive = event.pointerType === "touch";
|
|
189
335
|
}
|
|
190
336
|
function onTriggerPointerup(event) {
|
|
337
|
+
if (originatesInContent(event)) return;
|
|
191
338
|
rememberTarget("trigger", event);
|
|
192
|
-
interaction.
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
});
|
|
339
|
+
interaction.touchClickPending = event.pointerType === "touch" && interaction.touchPointerActive;
|
|
340
|
+
interaction.touchPointerActive = false;
|
|
341
|
+
if (interaction.touchClickPending) scheduleTouchClickExpiry();
|
|
196
342
|
}
|
|
197
343
|
function onTriggerPointercancel(event) {
|
|
344
|
+
if (originatesInContent(event)) return;
|
|
198
345
|
rememberTarget("trigger", event);
|
|
199
|
-
|
|
346
|
+
clearTouchClickExpiryTimer();
|
|
347
|
+
interaction.touchClickPending = false;
|
|
348
|
+
interaction.touchPointerActive = false;
|
|
200
349
|
}
|
|
201
350
|
function onTriggerClick(event) {
|
|
351
|
+
if (originatesInContent(event)) return;
|
|
202
352
|
rememberTarget("trigger", event);
|
|
203
|
-
|
|
204
|
-
if (!
|
|
205
|
-
interaction.
|
|
353
|
+
clearTouchClickExpiryTimer();
|
|
354
|
+
if (!interaction.touchClickPending) return;
|
|
355
|
+
interaction.touchClickPending = false;
|
|
206
356
|
if (getTouchBehavior() !== "toggle" || commands.isDisabled.value) return;
|
|
207
357
|
event.preventDefault();
|
|
208
|
-
if (
|
|
209
|
-
interaction.
|
|
210
|
-
type: "set-touch-pinned",
|
|
211
|
-
pinned: false
|
|
212
|
-
});
|
|
358
|
+
if (interaction.touchPinned || commands.isRequestedOpen()) {
|
|
359
|
+
interaction.touchPinned = false;
|
|
213
360
|
requestClose("touch", event, "immediate");
|
|
214
361
|
return;
|
|
215
362
|
}
|
|
216
|
-
interaction.
|
|
217
|
-
type: "set-touch-pinned",
|
|
218
|
-
pinned: true
|
|
219
|
-
});
|
|
363
|
+
interaction.touchPinned = true;
|
|
220
364
|
requestOpen("touch", event, "immediate");
|
|
221
365
|
}
|
|
222
366
|
function onContentPointerdown(event) {
|
|
223
367
|
rememberTarget("content", event);
|
|
224
368
|
}
|
|
225
|
-
function
|
|
226
|
-
if (event.key !== "Escape" || toValue(options.closeOnEscape) === false || !commands.isOpen.value) return;
|
|
227
|
-
interaction.
|
|
228
|
-
type: "set-touch-pinned",
|
|
229
|
-
pinned: false
|
|
230
|
-
});
|
|
369
|
+
function requestEscapeClose(event) {
|
|
370
|
+
if (event.key !== "Escape" || toValue(options.closeOnEscape) === false || !commands.isOpen.value) return false;
|
|
371
|
+
interaction.touchPinned = false;
|
|
231
372
|
requestClose("escape", event, "immediate");
|
|
373
|
+
return true;
|
|
374
|
+
}
|
|
375
|
+
function onKeydown(event) {
|
|
376
|
+
if (dismissalRouted || !requestEscapeClose(event)) return;
|
|
377
|
+
event.stopPropagation();
|
|
378
|
+
}
|
|
379
|
+
function onDocumentKeydown(event) {
|
|
380
|
+
requestEscapeClose(event);
|
|
232
381
|
}
|
|
233
382
|
function onOutsidePointerdown(event) {
|
|
234
|
-
if (!interaction.
|
|
235
|
-
interaction.
|
|
236
|
-
type: "set-touch-pinned",
|
|
237
|
-
pinned: false
|
|
238
|
-
});
|
|
383
|
+
if (!interaction.touchPinned) return;
|
|
384
|
+
interaction.touchPinned = false;
|
|
239
385
|
requestClose("outside", event, "immediate");
|
|
240
386
|
}
|
|
241
387
|
function onTargetDetached(part) {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
});
|
|
388
|
+
clearPendingTouchClick();
|
|
389
|
+
if (part === "trigger") interaction.touchPointerActive = false;
|
|
390
|
+
resetInteraction(interaction, part);
|
|
246
391
|
requestClose("hover", void 0, "delayed");
|
|
247
392
|
}
|
|
248
393
|
function requestOpen(reason, event, timing) {
|
|
@@ -286,23 +431,19 @@ function useHoverDisclosureInteractions({ commands, interaction, options, state,
|
|
|
286
431
|
}
|
|
287
432
|
});
|
|
288
433
|
watch(() => getTouchBehavior(), (behavior) => {
|
|
289
|
-
if (behavior === "toggle" || !interaction.
|
|
290
|
-
interaction.
|
|
291
|
-
type: "set-touch-pinned",
|
|
292
|
-
pinned: false
|
|
293
|
-
});
|
|
434
|
+
if (behavior === "toggle" || !interaction.touchPinned) return;
|
|
435
|
+
interaction.touchPinned = false;
|
|
294
436
|
requestClose("touch", void 0, "immediate");
|
|
295
437
|
});
|
|
438
|
+
onBeforeUnmount(clearTouchClickExpiryTimer);
|
|
296
439
|
return {
|
|
297
|
-
|
|
298
|
-
contentListeners: presentation.contentListeners,
|
|
299
|
-
isOutsideDismissalActive: () => interaction.read().touchPinned,
|
|
300
|
-
onDocumentKeydown: onKeydown,
|
|
301
|
-
onOutsidePointerdown,
|
|
302
|
-
onTargetDetached,
|
|
303
|
-
triggerListeners: presentation.triggerListeners
|
|
304
|
-
},
|
|
440
|
+
contentListeners: presentation.contentListeners,
|
|
305
441
|
contentProps: presentation.contentProps,
|
|
442
|
+
isOutsideDismissalActive: () => interaction.touchPinned,
|
|
443
|
+
onDocumentKeydown,
|
|
444
|
+
onOutsidePointerdown,
|
|
445
|
+
onTargetDetached,
|
|
446
|
+
triggerListeners: presentation.triggerListeners,
|
|
306
447
|
triggerProps: presentation.triggerProps
|
|
307
448
|
};
|
|
308
449
|
}
|
|
@@ -344,195 +485,8 @@ function focusLeavesCurrentTarget(event) {
|
|
|
344
485
|
const currentTarget = isElement(event.currentTarget) ? event.currentTarget : null;
|
|
345
486
|
return !isNodeWithinElement(event.relatedTarget, currentTarget);
|
|
346
487
|
}
|
|
347
|
-
|
|
348
|
-
//#region src/components/floating/useHoverDisclosureOpenState.ts
|
|
349
|
-
var defaultOpenDelay = 0;
|
|
350
|
-
var defaultCloseDelay = 0;
|
|
351
|
-
function useHoverDisclosureOpenState({ interaction, onContentClosed, options }) {
|
|
352
|
-
const controlledOpen = computed(() => toValue(options.open));
|
|
353
|
-
const isDisabled = computed(() => Boolean(toValue(options.disabled)));
|
|
354
|
-
let pendingChangeDetails;
|
|
355
|
-
const controllableOpen = useControllableValue({
|
|
356
|
-
modelValue: () => controlledOpen.value,
|
|
357
|
-
defaultValue: () => options.defaultOpen === true && !isDisabled.value,
|
|
358
|
-
onChange: (nextOpen) => {
|
|
359
|
-
if (pendingChangeDetails) options.onOpenChange?.(nextOpen, pendingChangeDetails);
|
|
360
|
-
}
|
|
361
|
-
});
|
|
362
|
-
const openState = controllableOpen.value;
|
|
363
|
-
const isOpen = computed(() => !isDisabled.value && openState.value);
|
|
364
|
-
const state = computed(() => isOpen.value ? "open" : "closed");
|
|
365
|
-
let requestedOpen = openState.value;
|
|
366
|
-
let openTimer;
|
|
367
|
-
let closeTimer;
|
|
368
|
-
let disposed = false;
|
|
369
|
-
function request(change) {
|
|
370
|
-
if (change.open) requestOpen(change);
|
|
371
|
-
else requestClose(change);
|
|
372
|
-
}
|
|
373
|
-
function requestOpen(change) {
|
|
374
|
-
if (change.timing === "immediate") {
|
|
375
|
-
clearTimers();
|
|
376
|
-
setOpen(true, change.reason, change.event);
|
|
377
|
-
return;
|
|
378
|
-
}
|
|
379
|
-
if (disposed || isDisabled.value) return;
|
|
380
|
-
clearCloseTimer();
|
|
381
|
-
clearOpenTimer();
|
|
382
|
-
if (requestedOpen) return;
|
|
383
|
-
const delay = normalizeDelay(toValue(options.openDelay), defaultOpenDelay);
|
|
384
|
-
if (delay === 0) {
|
|
385
|
-
setOpen(true, change.reason, change.event);
|
|
386
|
-
return;
|
|
387
|
-
}
|
|
388
|
-
openTimer = setTimeout(() => {
|
|
389
|
-
openTimer = void 0;
|
|
390
|
-
if (!interaction.read().triggerHovered || isDisabled.value) return;
|
|
391
|
-
setOpen(true, change.reason, change.event);
|
|
392
|
-
}, delay);
|
|
393
|
-
}
|
|
394
|
-
function requestClose(change) {
|
|
395
|
-
if (change.timing === "immediate") {
|
|
396
|
-
clearTimers();
|
|
397
|
-
setOpen(false, change.reason, change.event);
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
clearOpenTimer();
|
|
401
|
-
clearCloseTimer();
|
|
402
|
-
if (disposed || hasActiveHoverDisclosureInteraction(interaction.read())) return;
|
|
403
|
-
closeTimer = setTimeout(() => {
|
|
404
|
-
closeTimer = void 0;
|
|
405
|
-
if (hasActiveHoverDisclosureInteraction(interaction.read())) return;
|
|
406
|
-
setOpen(false, change.reason, change.event);
|
|
407
|
-
}, normalizeDelay(toValue(options.closeDelay), defaultCloseDelay));
|
|
408
|
-
}
|
|
409
|
-
function setOpen(nextOpen, reason, event) {
|
|
410
|
-
if (disposed || nextOpen && isDisabled.value || requestedOpen === nextOpen) return;
|
|
411
|
-
requestedOpen = nextOpen;
|
|
412
|
-
pendingChangeDetails = {
|
|
413
|
-
reason,
|
|
414
|
-
event
|
|
415
|
-
};
|
|
416
|
-
try {
|
|
417
|
-
controllableOpen.setValue(nextOpen);
|
|
418
|
-
} finally {
|
|
419
|
-
pendingChangeDetails = void 0;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
function cancelScheduledClose() {
|
|
423
|
-
clearCloseTimer();
|
|
424
|
-
}
|
|
425
|
-
function isRequestedOpen() {
|
|
426
|
-
return requestedOpen;
|
|
427
|
-
}
|
|
428
|
-
function open() {
|
|
429
|
-
request({
|
|
430
|
-
open: true,
|
|
431
|
-
reason: "programmatic",
|
|
432
|
-
timing: "immediate"
|
|
433
|
-
});
|
|
434
|
-
}
|
|
435
|
-
function close() {
|
|
436
|
-
interaction.send({
|
|
437
|
-
type: "set-touch-pinned",
|
|
438
|
-
pinned: false
|
|
439
|
-
});
|
|
440
|
-
request({
|
|
441
|
-
open: false,
|
|
442
|
-
reason: "programmatic",
|
|
443
|
-
timing: "immediate"
|
|
444
|
-
});
|
|
445
|
-
}
|
|
446
|
-
function toggle() {
|
|
447
|
-
if (requestedOpen || isOpen.value) close();
|
|
448
|
-
else open();
|
|
449
|
-
}
|
|
450
|
-
function clearOpenTimer() {
|
|
451
|
-
if (openTimer === void 0) return;
|
|
452
|
-
clearTimeout(openTimer);
|
|
453
|
-
openTimer = void 0;
|
|
454
|
-
}
|
|
455
|
-
function clearCloseTimer() {
|
|
456
|
-
if (closeTimer === void 0) return;
|
|
457
|
-
clearTimeout(closeTimer);
|
|
458
|
-
closeTimer = void 0;
|
|
459
|
-
}
|
|
460
|
-
function clearTimers() {
|
|
461
|
-
clearOpenTimer();
|
|
462
|
-
clearCloseTimer();
|
|
463
|
-
}
|
|
464
|
-
watch([openState, controllableOpen.isControlled], ([value]) => {
|
|
465
|
-
requestedOpen = value;
|
|
466
|
-
if (value) return;
|
|
467
|
-
interaction.send({
|
|
468
|
-
type: "reset",
|
|
469
|
-
part: "content"
|
|
470
|
-
});
|
|
471
|
-
interaction.send({
|
|
472
|
-
type: "set-touch-pinned",
|
|
473
|
-
pinned: false
|
|
474
|
-
});
|
|
475
|
-
onContentClosed();
|
|
476
|
-
}, { flush: "sync" });
|
|
477
|
-
watch(isDisabled, (disabled) => {
|
|
478
|
-
if (!disabled) return;
|
|
479
|
-
interaction.send({
|
|
480
|
-
type: "reset",
|
|
481
|
-
part: "all"
|
|
482
|
-
});
|
|
483
|
-
request({
|
|
484
|
-
open: false,
|
|
485
|
-
reason: "disabled",
|
|
486
|
-
timing: "immediate"
|
|
487
|
-
});
|
|
488
|
-
});
|
|
489
|
-
onBeforeUnmount(() => {
|
|
490
|
-
disposed = true;
|
|
491
|
-
clearTimers();
|
|
492
|
-
});
|
|
493
|
-
return {
|
|
494
|
-
cancelScheduledClose,
|
|
495
|
-
close,
|
|
496
|
-
isDisabled,
|
|
497
|
-
isOpen,
|
|
498
|
-
isRequestedOpen,
|
|
499
|
-
open,
|
|
500
|
-
request,
|
|
501
|
-
state,
|
|
502
|
-
toggle
|
|
503
|
-
};
|
|
504
|
-
}
|
|
505
|
-
//#endregion
|
|
506
|
-
//#region src/components/floating/useHoverDisclosureTargetBinding.ts
|
|
507
|
-
function createHoverDisclosureTargetState() {
|
|
508
|
-
return {
|
|
509
|
-
contentElement: null,
|
|
510
|
-
resolvedContentTarget: shallowRef(null),
|
|
511
|
-
resolvedInteractionTarget: shallowRef(null),
|
|
512
|
-
triggerElement: null
|
|
513
|
-
};
|
|
514
|
-
}
|
|
515
|
-
function useHoverDisclosureTargetBinding({ adapter, isOpen, options, targets }) {
|
|
488
|
+
function useHoverDisclosureTargetBinding({ commands, options, runtime, targets, useDocumentDismissal }) {
|
|
516
489
|
let documentListenersActive = false;
|
|
517
|
-
function syncInteractionTarget() {
|
|
518
|
-
targets.resolvedInteractionTarget.value = resolveInteractionTarget(toValue(options.interactionTarget));
|
|
519
|
-
}
|
|
520
|
-
function syncContentTarget() {
|
|
521
|
-
targets.resolvedContentTarget.value = resolveContentTarget(toValue(options.contentTarget));
|
|
522
|
-
}
|
|
523
|
-
function syncTargets() {
|
|
524
|
-
syncInteractionTarget();
|
|
525
|
-
syncContentTarget();
|
|
526
|
-
}
|
|
527
|
-
function bindTarget(part, target, listeners, cleanup) {
|
|
528
|
-
setCurrentTarget(part, target);
|
|
529
|
-
for (const [type, listener] of listeners) target.addEventListener(type, listener);
|
|
530
|
-
cleanup(() => {
|
|
531
|
-
for (const [type, listener] of listeners) target.removeEventListener(type, listener);
|
|
532
|
-
clearCurrentTarget(part, target);
|
|
533
|
-
adapter.onTargetDetached(part);
|
|
534
|
-
});
|
|
535
|
-
}
|
|
536
490
|
function setCurrentTarget(part, target) {
|
|
537
491
|
if (part === "trigger") targets.triggerElement = target;
|
|
538
492
|
else targets.contentElement = target;
|
|
@@ -541,60 +495,59 @@ function useHoverDisclosureTargetBinding({ adapter, isOpen, options, targets })
|
|
|
541
495
|
if (part === "trigger" && targets.triggerElement === target) targets.triggerElement = null;
|
|
542
496
|
if (part === "content" && targets.contentElement === target) targets.contentElement = null;
|
|
543
497
|
}
|
|
498
|
+
function connectTarget(part, target) {
|
|
499
|
+
setCurrentTarget(part, target);
|
|
500
|
+
return () => {
|
|
501
|
+
clearCurrentTarget(part, target);
|
|
502
|
+
runtime.onTargetDetached(part);
|
|
503
|
+
};
|
|
504
|
+
}
|
|
544
505
|
function onDocumentPointerdown(event) {
|
|
545
|
-
if (!
|
|
506
|
+
if (!runtime.isOutsideDismissalActive()) return;
|
|
546
507
|
if (isEventInsideTargets(event, targets)) return;
|
|
547
|
-
|
|
508
|
+
runtime.onOutsidePointerdown(event);
|
|
548
509
|
}
|
|
549
510
|
function setDocumentListeners(active) {
|
|
550
|
-
if (typeof document === "undefined" || active === documentListenersActive) return;
|
|
511
|
+
if (!useDocumentDismissal || typeof document === "undefined" || active === documentListenersActive) return;
|
|
551
512
|
documentListenersActive = active;
|
|
552
513
|
if (active) {
|
|
553
|
-
document.addEventListener("keydown",
|
|
514
|
+
document.addEventListener("keydown", runtime.onDocumentKeydown);
|
|
554
515
|
document.addEventListener("pointerdown", onDocumentPointerdown, true);
|
|
555
516
|
return;
|
|
556
517
|
}
|
|
557
|
-
document.removeEventListener("keydown",
|
|
518
|
+
document.removeEventListener("keydown", runtime.onDocumentKeydown);
|
|
558
519
|
document.removeEventListener("pointerdown", onDocumentPointerdown, true);
|
|
559
520
|
}
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
521
|
+
const fallbackTarget = shallowRef(null);
|
|
522
|
+
const interactionTargetLifecycle = useFloatingTargetLifecycle({
|
|
523
|
+
target: () => toValue(options.interactionTarget),
|
|
524
|
+
fallback: fallbackTarget,
|
|
525
|
+
getTargetElement: (reference) => {
|
|
526
|
+
if (isElement(reference)) return reference;
|
|
527
|
+
return isElement(reference.contextElement) ? reference.contextElement : null;
|
|
528
|
+
}
|
|
563
529
|
});
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
530
|
+
const contentTargetLifecycle = useFloatingTargetLifecycle({
|
|
531
|
+
target: () => toValue(options.contentTarget),
|
|
532
|
+
fallback: fallbackTarget
|
|
567
533
|
});
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
534
|
+
targets.resolvedInteractionTarget = interactionTargetLifecycle.targetElement;
|
|
535
|
+
targets.resolvedContentTarget = contentTargetLifecycle.targetElement;
|
|
536
|
+
interactionTargetLifecycle.bindTarget({
|
|
537
|
+
connect: (target) => connectTarget("trigger", target),
|
|
538
|
+
listeners: runtime.triggerListeners
|
|
573
539
|
});
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
flush: "sync",
|
|
578
|
-
immediate: true
|
|
540
|
+
contentTargetLifecycle.bindTarget({
|
|
541
|
+
connect: (target) => connectTarget("content", target),
|
|
542
|
+
listeners: runtime.contentListeners
|
|
579
543
|
});
|
|
580
|
-
watch(isOpen, setDocumentListeners, { flush: "sync" });
|
|
581
|
-
watch(isOpen, syncTargets, { flush: "post" });
|
|
544
|
+
watch(commands.isOpen, setDocumentListeners, { flush: "sync" });
|
|
582
545
|
onMounted(() => {
|
|
583
|
-
|
|
584
|
-
|
|
546
|
+
setDocumentListeners(commands.isOpen.value);
|
|
547
|
+
});
|
|
548
|
+
onBeforeUnmount(() => {
|
|
549
|
+
setDocumentListeners(false);
|
|
585
550
|
});
|
|
586
|
-
onBeforeUnmount(() => setDocumentListeners(false));
|
|
587
|
-
}
|
|
588
|
-
function resolveInteractionTarget(target) {
|
|
589
|
-
if (!target) return null;
|
|
590
|
-
if (typeof target === "string") return querySelectorSafe(target);
|
|
591
|
-
if (isElement(target)) return target;
|
|
592
|
-
return isElement(target.contextElement) ? target.contextElement : null;
|
|
593
|
-
}
|
|
594
|
-
function resolveContentTarget(target) {
|
|
595
|
-
if (!target) return null;
|
|
596
|
-
if (typeof target === "string") return querySelectorSafe(target);
|
|
597
|
-
return isElement(target) ? target : null;
|
|
598
551
|
}
|
|
599
552
|
function isEventInsideTargets(event, targets) {
|
|
600
553
|
return isEventWithinTargets(event, [
|
|
@@ -605,40 +558,4 @@ function isEventInsideTargets(event, targets) {
|
|
|
605
558
|
].filter((element) => element !== null));
|
|
606
559
|
}
|
|
607
560
|
//#endregion
|
|
608
|
-
|
|
609
|
-
function useHoverDisclosure(options = {}) {
|
|
610
|
-
const interaction = createHoverDisclosureInteractionModel();
|
|
611
|
-
const targets = createHoverDisclosureTargetState();
|
|
612
|
-
const openState = useHoverDisclosureOpenState({
|
|
613
|
-
interaction,
|
|
614
|
-
onContentClosed: () => {
|
|
615
|
-
targets.contentElement = null;
|
|
616
|
-
},
|
|
617
|
-
options
|
|
618
|
-
});
|
|
619
|
-
const { bindingAdapter, contentProps, triggerProps } = useHoverDisclosureInteractions({
|
|
620
|
-
commands: openState,
|
|
621
|
-
interaction,
|
|
622
|
-
options,
|
|
623
|
-
state: openState.state,
|
|
624
|
-
targets
|
|
625
|
-
});
|
|
626
|
-
useHoverDisclosureTargetBinding({
|
|
627
|
-
adapter: bindingAdapter,
|
|
628
|
-
isOpen: openState.isOpen,
|
|
629
|
-
options,
|
|
630
|
-
targets
|
|
631
|
-
});
|
|
632
|
-
return {
|
|
633
|
-
isOpen: openState.isOpen,
|
|
634
|
-
isDisabled: openState.isDisabled,
|
|
635
|
-
state: openState.state,
|
|
636
|
-
triggerProps,
|
|
637
|
-
contentProps,
|
|
638
|
-
open: openState.open,
|
|
639
|
-
close: openState.close,
|
|
640
|
-
toggle: openState.toggle
|
|
641
|
-
};
|
|
642
|
-
}
|
|
643
|
-
//#endregion
|
|
644
|
-
export { useHoverDisclosure as t };
|
|
561
|
+
export { useHoverDisclosureWithExternalDismissal as n, useHoverDisclosure as t };
|