@tamagui/floating 2.0.0-rc.4 → 2.0.0-rc.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/dist/cjs/Floating.cjs +7 -5
  2. package/dist/cjs/Floating.native.js +19 -13
  3. package/dist/cjs/Floating.native.js.map +1 -1
  4. package/dist/cjs/index.cjs +46 -13
  5. package/dist/cjs/index.native.js +46 -13
  6. package/dist/cjs/index.native.js.map +1 -1
  7. package/dist/cjs/interactions/PopupTriggerMap.cjs +49 -0
  8. package/dist/cjs/interactions/PopupTriggerMap.native.js +97 -0
  9. package/dist/cjs/interactions/PopupTriggerMap.native.js.map +1 -0
  10. package/dist/cjs/interactions/createFloatingEvents.cjs +50 -0
  11. package/dist/cjs/interactions/createFloatingEvents.native.js +56 -0
  12. package/dist/cjs/interactions/createFloatingEvents.native.js.map +1 -0
  13. package/dist/cjs/interactions/safePolygon.cjs +273 -0
  14. package/dist/cjs/interactions/safePolygon.native.js +284 -0
  15. package/dist/cjs/interactions/safePolygon.native.js.map +1 -0
  16. package/dist/cjs/interactions/types.cjs +18 -0
  17. package/dist/cjs/interactions/types.native.js +21 -0
  18. package/dist/cjs/interactions/types.native.js.map +1 -0
  19. package/dist/cjs/interactions/useClick.cjs +124 -0
  20. package/dist/cjs/interactions/useClick.native.js +132 -0
  21. package/dist/cjs/interactions/useClick.native.js.map +1 -0
  22. package/dist/cjs/interactions/useDelayGroup.cjs +115 -0
  23. package/dist/cjs/interactions/useDelayGroup.native.js +125 -0
  24. package/dist/cjs/interactions/useDelayGroup.native.js.map +1 -0
  25. package/dist/cjs/interactions/useFocus.cjs +130 -0
  26. package/dist/cjs/interactions/useFocus.native.js +139 -0
  27. package/dist/cjs/interactions/useFocus.native.js.map +1 -0
  28. package/dist/cjs/interactions/useHover.cjs +357 -0
  29. package/dist/cjs/interactions/useHover.native.js +373 -0
  30. package/dist/cjs/interactions/useHover.native.js.map +1 -0
  31. package/dist/cjs/interactions/useInnerOffset.cjs +128 -0
  32. package/dist/cjs/interactions/useInnerOffset.native.js +141 -0
  33. package/dist/cjs/interactions/useInnerOffset.native.js.map +1 -0
  34. package/dist/cjs/interactions/useInteractions.cjs +105 -0
  35. package/dist/cjs/interactions/useInteractions.native.js +216 -0
  36. package/dist/cjs/interactions/useInteractions.native.js.map +1 -0
  37. package/dist/cjs/interactions/useListNavigation.cjs +418 -0
  38. package/dist/cjs/interactions/useListNavigation.native.js +433 -0
  39. package/dist/cjs/interactions/useListNavigation.native.js.map +1 -0
  40. package/dist/cjs/interactions/useRole.cjs +122 -0
  41. package/dist/cjs/interactions/useRole.native.js +136 -0
  42. package/dist/cjs/interactions/useRole.native.js.map +1 -0
  43. package/dist/cjs/interactions/useTypeahead.cjs +143 -0
  44. package/dist/cjs/interactions/useTypeahead.native.js +159 -0
  45. package/dist/cjs/interactions/useTypeahead.native.js.map +1 -0
  46. package/dist/cjs/interactions/utils.cjs +208 -0
  47. package/dist/cjs/interactions/utils.native.js +227 -0
  48. package/dist/cjs/interactions/utils.native.js.map +1 -0
  49. package/dist/cjs/middleware/inner.cjs +118 -0
  50. package/dist/cjs/middleware/inner.native.js +130 -0
  51. package/dist/cjs/middleware/inner.native.js.map +1 -0
  52. package/dist/cjs/useFloating.cjs +35 -28
  53. package/dist/cjs/useFloating.native.js +51 -47
  54. package/dist/cjs/useFloating.native.js.map +1 -1
  55. package/dist/esm/Floating.native.js +6 -3
  56. package/dist/esm/Floating.native.js.map +1 -1
  57. package/dist/esm/index.js +17 -34
  58. package/dist/esm/index.js.map +1 -6
  59. package/dist/esm/index.mjs +16 -2
  60. package/dist/esm/index.mjs.map +1 -1
  61. package/dist/esm/index.native.js +16 -2
  62. package/dist/esm/index.native.js.map +1 -1
  63. package/dist/esm/interactions/PopupTriggerMap.mjs +24 -0
  64. package/dist/esm/interactions/PopupTriggerMap.mjs.map +1 -0
  65. package/dist/esm/interactions/PopupTriggerMap.native.js +69 -0
  66. package/dist/esm/interactions/PopupTriggerMap.native.js.map +1 -0
  67. package/dist/esm/interactions/createFloatingEvents.mjs +25 -0
  68. package/dist/esm/interactions/createFloatingEvents.mjs.map +1 -0
  69. package/dist/esm/interactions/createFloatingEvents.native.js +28 -0
  70. package/dist/esm/interactions/createFloatingEvents.native.js.map +1 -0
  71. package/dist/esm/interactions/safePolygon.mjs +248 -0
  72. package/dist/esm/interactions/safePolygon.mjs.map +1 -0
  73. package/dist/esm/interactions/safePolygon.native.js +256 -0
  74. package/dist/esm/interactions/safePolygon.native.js.map +1 -0
  75. package/dist/esm/interactions/types.mjs +2 -0
  76. package/dist/esm/interactions/types.mjs.map +1 -0
  77. package/dist/esm/interactions/types.native.js +2 -0
  78. package/dist/esm/interactions/types.native.js.map +1 -0
  79. package/dist/esm/interactions/useClick.mjs +99 -0
  80. package/dist/esm/interactions/useClick.mjs.map +1 -0
  81. package/dist/esm/interactions/useClick.native.js +104 -0
  82. package/dist/esm/interactions/useClick.native.js.map +1 -0
  83. package/dist/esm/interactions/useDelayGroup.mjs +77 -0
  84. package/dist/esm/interactions/useDelayGroup.mjs.map +1 -0
  85. package/dist/esm/interactions/useDelayGroup.native.js +84 -0
  86. package/dist/esm/interactions/useDelayGroup.native.js.map +1 -0
  87. package/dist/esm/interactions/useFocus.mjs +105 -0
  88. package/dist/esm/interactions/useFocus.mjs.map +1 -0
  89. package/dist/esm/interactions/useFocus.native.js +111 -0
  90. package/dist/esm/interactions/useFocus.native.js.map +1 -0
  91. package/dist/esm/interactions/useHover.mjs +320 -0
  92. package/dist/esm/interactions/useHover.mjs.map +1 -0
  93. package/dist/esm/interactions/useHover.native.js +333 -0
  94. package/dist/esm/interactions/useHover.native.js.map +1 -0
  95. package/dist/esm/interactions/useInnerOffset.mjs +92 -0
  96. package/dist/esm/interactions/useInnerOffset.mjs.map +1 -0
  97. package/dist/esm/interactions/useInnerOffset.native.js +102 -0
  98. package/dist/esm/interactions/useInnerOffset.native.js.map +1 -0
  99. package/dist/esm/interactions/useInteractions.mjs +80 -0
  100. package/dist/esm/interactions/useInteractions.mjs.map +1 -0
  101. package/dist/esm/interactions/useInteractions.native.js +188 -0
  102. package/dist/esm/interactions/useInteractions.native.js.map +1 -0
  103. package/dist/esm/interactions/useListNavigation.mjs +393 -0
  104. package/dist/esm/interactions/useListNavigation.mjs.map +1 -0
  105. package/dist/esm/interactions/useListNavigation.native.js +405 -0
  106. package/dist/esm/interactions/useListNavigation.native.js.map +1 -0
  107. package/dist/esm/interactions/useRole.mjs +86 -0
  108. package/dist/esm/interactions/useRole.mjs.map +1 -0
  109. package/dist/esm/interactions/useRole.native.js +97 -0
  110. package/dist/esm/interactions/useRole.native.js.map +1 -0
  111. package/dist/esm/interactions/useTypeahead.mjs +118 -0
  112. package/dist/esm/interactions/useTypeahead.mjs.map +1 -0
  113. package/dist/esm/interactions/useTypeahead.native.js +131 -0
  114. package/dist/esm/interactions/useTypeahead.native.js.map +1 -0
  115. package/dist/esm/interactions/utils.mjs +162 -0
  116. package/dist/esm/interactions/utils.mjs.map +1 -0
  117. package/dist/esm/interactions/utils.native.js +178 -0
  118. package/dist/esm/interactions/utils.native.js.map +1 -0
  119. package/dist/esm/middleware/inner.mjs +82 -0
  120. package/dist/esm/middleware/inner.mjs.map +1 -0
  121. package/dist/esm/middleware/inner.native.js +91 -0
  122. package/dist/esm/middleware/inner.native.js.map +1 -0
  123. package/dist/esm/useFloating.mjs +8 -3
  124. package/dist/esm/useFloating.mjs.map +1 -1
  125. package/dist/esm/useFloating.native.js +25 -23
  126. package/dist/esm/useFloating.native.js.map +1 -1
  127. package/package.json +8 -10
  128. package/src/Floating.native.tsx +1 -0
  129. package/src/index.ts +49 -0
  130. package/src/interactions/PopupTriggerMap.ts +30 -0
  131. package/src/interactions/createFloatingEvents.ts +34 -0
  132. package/src/interactions/safePolygon.ts +500 -0
  133. package/src/interactions/types.ts +165 -0
  134. package/src/interactions/useClick.ts +148 -0
  135. package/src/interactions/useDelayGroup.ts +114 -0
  136. package/src/interactions/useFocus.ts +164 -0
  137. package/src/interactions/useHover.ts +453 -0
  138. package/src/interactions/useInnerOffset.ts +116 -0
  139. package/src/interactions/useInteractions.ts +101 -0
  140. package/src/interactions/useListNavigation.ts +578 -0
  141. package/src/interactions/useRole.ts +103 -0
  142. package/src/interactions/useTypeahead.ts +173 -0
  143. package/src/interactions/utils.ts +234 -0
  144. package/src/middleware/inner.ts +141 -0
  145. package/src/useFloating.tsx +13 -1
  146. package/types/Floating.native.d.ts +1 -0
  147. package/types/Floating.native.d.ts.map +1 -1
  148. package/types/index.d.ts +17 -2
  149. package/types/index.d.ts.map +1 -1
  150. package/types/interactions/PopupTriggerMap.d.ts +8 -0
  151. package/types/interactions/PopupTriggerMap.d.ts.map +1 -0
  152. package/types/interactions/createFloatingEvents.d.ts +7 -0
  153. package/types/interactions/createFloatingEvents.d.ts.map +1 -0
  154. package/types/interactions/safePolygon.d.ts +4 -0
  155. package/types/interactions/safePolygon.d.ts.map +1 -0
  156. package/types/interactions/types.d.ts +123 -0
  157. package/types/interactions/types.d.ts.map +1 -0
  158. package/types/interactions/useClick.d.ts +3 -0
  159. package/types/interactions/useClick.d.ts.map +1 -0
  160. package/types/interactions/useDelayGroup.d.ts +23 -0
  161. package/types/interactions/useDelayGroup.d.ts.map +1 -0
  162. package/types/interactions/useFocus.d.ts +3 -0
  163. package/types/interactions/useFocus.d.ts.map +1 -0
  164. package/types/interactions/useHover.d.ts +6 -0
  165. package/types/interactions/useHover.d.ts.map +1 -0
  166. package/types/interactions/useInnerOffset.d.ts +3 -0
  167. package/types/interactions/useInnerOffset.d.ts.map +1 -0
  168. package/types/interactions/useInteractions.d.ts +8 -0
  169. package/types/interactions/useInteractions.d.ts.map +1 -0
  170. package/types/interactions/useListNavigation.d.ts +3 -0
  171. package/types/interactions/useListNavigation.d.ts.map +1 -0
  172. package/types/interactions/useRole.d.ts +3 -0
  173. package/types/interactions/useRole.d.ts.map +1 -0
  174. package/types/interactions/useTypeahead.d.ts +3 -0
  175. package/types/interactions/useTypeahead.d.ts.map +1 -0
  176. package/types/interactions/utils.d.ts +46 -0
  177. package/types/interactions/utils.d.ts.map +1 -0
  178. package/types/middleware/inner.d.ts +14 -0
  179. package/types/middleware/inner.d.ts.map +1 -0
  180. package/types/useFloating.d.ts +7 -1
  181. package/types/useFloating.d.ts.map +1 -1
  182. package/dist/cjs/Floating.js +0 -15
  183. package/dist/cjs/Floating.js.map +0 -6
  184. package/dist/cjs/index.js +0 -34
  185. package/dist/cjs/index.js.map +0 -6
  186. package/dist/cjs/useFloating.js +0 -46
  187. package/dist/cjs/useFloating.js.map +0 -6
  188. package/dist/esm/Floating.js +0 -2
  189. package/dist/esm/Floating.js.map +0 -6
  190. package/dist/esm/useFloating.js +0 -23
  191. package/dist/esm/useFloating.js.map +0 -6
@@ -0,0 +1,173 @@
1
+ import { useLayoutEffect, useMemo, useRef } from 'react'
2
+ import { useEvent } from '@tamagui/use-event'
3
+ import type { ElementProps, FloatingInteractionContext, UseTypeaheadProps } from './types'
4
+ import { clearTimeoutIfSet, stopEvent } from './utils'
5
+
6
+ // typeahead: character buffer matching against list items
7
+ // ported from floating-ui/react useTypeahead
8
+ export function useTypeahead(
9
+ context: FloatingInteractionContext,
10
+ props: UseTypeaheadProps
11
+ ): ElementProps {
12
+ const { open, dataRef } = context
13
+ const {
14
+ listRef,
15
+ activeIndex,
16
+ onMatch: unstable_onMatch,
17
+ onTypingChange: unstable_onTypingChange,
18
+ enabled = true,
19
+ findMatch = null,
20
+ resetMs = 750,
21
+ ignoreKeys = [],
22
+ selectedIndex = null,
23
+ } = props
24
+
25
+ const timeoutIdRef = useRef(-1)
26
+ const stringRef = useRef('')
27
+ const prevIndexRef = useRef<number | null>(selectedIndex ?? activeIndex ?? -1)
28
+ const matchIndexRef = useRef<number | null>(null)
29
+
30
+ // stable callbacks via useEvent
31
+ const onMatch = useEvent(unstable_onMatch || (() => {}))
32
+ const onTypingChange = useEvent(unstable_onTypingChange || (() => {}))
33
+
34
+ // latest-value refs
35
+ const findMatchRef = useRef(findMatch)
36
+ findMatchRef.current = findMatch
37
+ const ignoreKeysRef = useRef(ignoreKeys)
38
+ ignoreKeysRef.current = ignoreKeys
39
+
40
+ useLayoutEffect(() => {
41
+ if (open) {
42
+ clearTimeoutIfSet(timeoutIdRef)
43
+ matchIndexRef.current = null
44
+ stringRef.current = ''
45
+ }
46
+ }, [open])
47
+
48
+ useLayoutEffect(() => {
49
+ // sync arrow key navigation but not typeahead navigation
50
+ if (open && stringRef.current === '') {
51
+ prevIndexRef.current = selectedIndex ?? activeIndex ?? -1
52
+ }
53
+ }, [open, selectedIndex, activeIndex])
54
+
55
+ const setTypingChange = (value: boolean) => {
56
+ if (value) {
57
+ if (!dataRef.current.typing) {
58
+ dataRef.current.typing = value
59
+ onTypingChange(value)
60
+ }
61
+ } else {
62
+ if (dataRef.current.typing) {
63
+ dataRef.current.typing = value
64
+ onTypingChange(value)
65
+ }
66
+ }
67
+ }
68
+
69
+ const onKeyDown = (event: React.KeyboardEvent) => {
70
+ function getMatchingIndex(
71
+ list: Array<string | null>,
72
+ orderedList: Array<string | null>,
73
+ string: string
74
+ ) {
75
+ const str = findMatchRef.current
76
+ ? findMatchRef.current(orderedList, string)
77
+ : orderedList.find(
78
+ (text) => text?.toLocaleLowerCase().indexOf(string.toLocaleLowerCase()) === 0
79
+ )
80
+
81
+ return str ? list.indexOf(str) : -1
82
+ }
83
+
84
+ const listContent = listRef.current
85
+
86
+ if (stringRef.current.length > 0 && stringRef.current[0] !== ' ') {
87
+ if (getMatchingIndex(listContent, listContent, stringRef.current) === -1) {
88
+ setTypingChange(false)
89
+ } else if (event.key === ' ') {
90
+ stopEvent(event)
91
+ }
92
+ }
93
+
94
+ if (
95
+ listContent == null ||
96
+ ignoreKeysRef.current.includes(event.key) ||
97
+ // character key
98
+ event.key.length !== 1 ||
99
+ // modifier key
100
+ event.ctrlKey ||
101
+ event.metaKey ||
102
+ event.altKey
103
+ ) {
104
+ return
105
+ }
106
+
107
+ if (open && event.key !== ' ') {
108
+ stopEvent(event)
109
+ setTypingChange(true)
110
+ }
111
+
112
+ // bail out if the list contains a word like "llama" or "aaron"
113
+ const allowRapidSuccessionOfFirstLetter = listContent.every((text) =>
114
+ text ? text[0]?.toLocaleLowerCase() !== text[1]?.toLocaleLowerCase() : true
115
+ )
116
+
117
+ // allows the user to cycle through items that start with the same letter
118
+ // in rapid succession
119
+ if (allowRapidSuccessionOfFirstLetter && stringRef.current === event.key) {
120
+ stringRef.current = ''
121
+ prevIndexRef.current = matchIndexRef.current
122
+ }
123
+
124
+ stringRef.current += event.key
125
+ clearTimeoutIfSet(timeoutIdRef)
126
+ timeoutIdRef.current = window.setTimeout(() => {
127
+ stringRef.current = ''
128
+ prevIndexRef.current = matchIndexRef.current
129
+ setTypingChange(false)
130
+ }, resetMs)
131
+
132
+ const prevIndex = prevIndexRef.current
133
+
134
+ const index = getMatchingIndex(
135
+ listContent,
136
+ [
137
+ ...listContent.slice((prevIndex || 0) + 1),
138
+ ...listContent.slice(0, (prevIndex || 0) + 1),
139
+ ],
140
+ stringRef.current
141
+ )
142
+
143
+ if (index !== -1) {
144
+ onMatch(index)
145
+ matchIndexRef.current = index
146
+ } else if (event.key !== ' ') {
147
+ stringRef.current = ''
148
+ setTypingChange(false)
149
+ }
150
+ }
151
+
152
+ const reference: ElementProps['reference'] = useMemo(
153
+ () => ({ onKeyDown: onKeyDown as any }),
154
+ [open, enabled]
155
+ )
156
+
157
+ const floating: ElementProps['floating'] = useMemo(
158
+ () => ({
159
+ onKeyDown: onKeyDown as any,
160
+ onKeyUp(event: React.KeyboardEvent) {
161
+ if (event.key === ' ') {
162
+ setTypingChange(false)
163
+ }
164
+ },
165
+ }),
166
+ [open, enabled]
167
+ )
168
+
169
+ return useMemo(
170
+ () => (enabled ? { reference, floating } : {}),
171
+ [enabled, reference, floating]
172
+ )
173
+ }
@@ -0,0 +1,234 @@
1
+ // shared utilities for interaction hooks, ported from floating-ui/react
2
+
3
+ export function getDocument(node: Element | null | undefined): Document {
4
+ return node?.ownerDocument || document
5
+ }
6
+
7
+ export function contains(parent?: Element | null, child?: Element | null): boolean {
8
+ if (!parent || !child) return false
9
+ const rootNode = child.getRootNode?.()
10
+ if (parent.contains(child)) return true
11
+ // shadow DOM support
12
+ if (rootNode && isShadowRoot(rootNode)) {
13
+ let next: any = child
14
+ while (next) {
15
+ if (parent === next) return true
16
+ next = next.parentNode || next.host
17
+ }
18
+ }
19
+ return false
20
+ }
21
+
22
+ function isShadowRoot(node: Node): node is ShadowRoot {
23
+ return node instanceof ShadowRoot
24
+ }
25
+
26
+ export function getTarget(event: Event): EventTarget | null {
27
+ if ('composedPath' in event) {
28
+ return event.composedPath()[0]
29
+ }
30
+ return (event as Event).target
31
+ }
32
+
33
+ export function activeElement(doc: Document): Element | null {
34
+ let el = doc.activeElement
35
+ while (el?.shadowRoot?.activeElement != null) {
36
+ el = el.shadowRoot.activeElement
37
+ }
38
+ return el
39
+ }
40
+
41
+ export function isHTMLElement(value: unknown): value is HTMLElement {
42
+ return value instanceof HTMLElement
43
+ }
44
+
45
+ export function isElement(value: unknown): value is Element {
46
+ return value instanceof Element
47
+ }
48
+
49
+ const TYPEABLE_SELECTOR =
50
+ "input:not([type='hidden']):not([disabled])," +
51
+ "[contenteditable]:not([contenteditable='false']),textarea:not([disabled])"
52
+
53
+ export function isTypeableElement(element: unknown): boolean {
54
+ return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR)
55
+ }
56
+
57
+ export function isTypeableCombobox(element: Element | null): boolean {
58
+ if (!element) return false
59
+ return element.getAttribute('role') === 'combobox' && isTypeableElement(element)
60
+ }
61
+
62
+ function getPlatform(): string {
63
+ const uaData = (navigator as any).userAgentData as any
64
+ if (uaData?.platform) return uaData.platform
65
+ return navigator.platform
66
+ }
67
+
68
+ function getUserAgent(): string {
69
+ const uaData = (navigator as any).userAgentData as any
70
+ if (uaData && Array.isArray(uaData.brands)) {
71
+ return uaData.brands.map(({ brand, version }: any) => `${brand}/${version}`).join(' ')
72
+ }
73
+ return navigator.userAgent
74
+ }
75
+
76
+ export function isSafari(): boolean {
77
+ return /apple/i.test(navigator.vendor)
78
+ }
79
+
80
+ export function isMac(): boolean {
81
+ return getPlatform().toLowerCase().startsWith('mac') && !navigator.maxTouchPoints
82
+ }
83
+
84
+ function isJSDOM(): boolean {
85
+ return getUserAgent().includes('jsdom/')
86
+ }
87
+
88
+ export function matchesFocusVisible(element: Element | null): boolean {
89
+ if (!element || isJSDOM()) return true
90
+ try {
91
+ return element.matches(':focus-visible')
92
+ } catch {
93
+ return true
94
+ }
95
+ }
96
+
97
+ export function isMouseLikePointerType(
98
+ pointerType: string | undefined,
99
+ strict?: boolean
100
+ ): boolean {
101
+ const values: Array<string | undefined> = ['mouse', 'pen']
102
+ if (!strict) {
103
+ values.push('', undefined)
104
+ }
105
+ return values.includes(pointerType)
106
+ }
107
+
108
+ export function clearTimeoutIfSet(timeoutRef: { current: number }): void {
109
+ if (timeoutRef.current !== -1) {
110
+ clearTimeout(timeoutRef.current)
111
+ timeoutRef.current = -1
112
+ }
113
+ }
114
+
115
+ export function stopEvent(event: Event | React.SyntheticEvent): void {
116
+ event.preventDefault()
117
+ event.stopPropagation()
118
+ }
119
+
120
+ export function isVirtualClick(event: MouseEvent | PointerEvent): boolean {
121
+ if ((event as any).mozInputSource === 0 && event.isTrusted) return true
122
+ if (isAndroid() && (event as PointerEvent).pointerType) {
123
+ return event.type === 'click' && event.buttons === 1
124
+ }
125
+ return event.detail === 0 && !(event as PointerEvent).pointerType
126
+ }
127
+
128
+ export function isVirtualPointerEvent(event: PointerEvent): boolean {
129
+ if (isJSDOM()) return false
130
+ return (
131
+ (!isAndroid() && event.width === 0 && event.height === 0) ||
132
+ (isAndroid() &&
133
+ event.width === 1 &&
134
+ event.height === 1 &&
135
+ event.pressure === 0 &&
136
+ event.detail === 0 &&
137
+ event.pointerType === 'mouse') ||
138
+ (event.width < 1 &&
139
+ event.height < 1 &&
140
+ event.pressure === 0 &&
141
+ event.detail === 0 &&
142
+ event.pointerType === 'touch')
143
+ )
144
+ }
145
+
146
+ function isAndroid(): boolean {
147
+ const re = /android/i
148
+ return re.test(getPlatform()) || re.test(getUserAgent())
149
+ }
150
+
151
+ // focus enqueue helper
152
+ let rafId = 0
153
+ export function enqueueFocus(
154
+ el: HTMLElement | null,
155
+ options: { preventScroll?: boolean; cancelPrevious?: boolean; sync?: boolean } = {}
156
+ ): void {
157
+ const { preventScroll = false, cancelPrevious = true, sync = false } = options
158
+ cancelPrevious && cancelAnimationFrame(rafId)
159
+ const exec = () => el?.focus({ preventScroll })
160
+ if (sync) {
161
+ exec()
162
+ } else {
163
+ rafId = requestAnimationFrame(exec)
164
+ }
165
+ }
166
+
167
+ // list navigation utilities
168
+
169
+ type DisabledIndices = Array<number> | ((index: number) => boolean)
170
+
171
+ export function isListIndexDisabled(
172
+ listRef: { current: Array<HTMLElement | null> },
173
+ index: number,
174
+ disabledIndices?: DisabledIndices
175
+ ): boolean {
176
+ if (typeof disabledIndices === 'function') return disabledIndices(index)
177
+ if (disabledIndices) return disabledIndices.includes(index)
178
+ const element = listRef.current[index]
179
+ return (
180
+ element == null ||
181
+ element.hasAttribute('disabled') ||
182
+ element.getAttribute('aria-disabled') === 'true'
183
+ )
184
+ }
185
+
186
+ export function findNonDisabledListIndex(
187
+ listRef: { current: Array<HTMLElement | null> },
188
+ {
189
+ startingIndex = -1,
190
+ decrement = false,
191
+ disabledIndices,
192
+ amount = 1,
193
+ }: {
194
+ startingIndex?: number
195
+ decrement?: boolean
196
+ disabledIndices?: DisabledIndices
197
+ amount?: number
198
+ } = {}
199
+ ): number {
200
+ let index = startingIndex
201
+ do {
202
+ index += decrement ? -amount : amount
203
+ } while (
204
+ index >= 0 &&
205
+ index <= listRef.current.length - 1 &&
206
+ isListIndexDisabled(listRef, index, disabledIndices)
207
+ )
208
+ return index
209
+ }
210
+
211
+ export function getMinListIndex(
212
+ listRef: { current: Array<HTMLElement | null> },
213
+ disabledIndices: DisabledIndices | undefined
214
+ ): number {
215
+ return findNonDisabledListIndex(listRef, { disabledIndices })
216
+ }
217
+
218
+ export function getMaxListIndex(
219
+ listRef: { current: Array<HTMLElement | null> },
220
+ disabledIndices: DisabledIndices | undefined
221
+ ): number {
222
+ return findNonDisabledListIndex(listRef, {
223
+ decrement: true,
224
+ startingIndex: listRef.current.length,
225
+ disabledIndices,
226
+ })
227
+ }
228
+
229
+ export function isIndexOutOfListBounds(
230
+ listRef: { current: Array<HTMLElement | null> },
231
+ index: number
232
+ ): boolean {
233
+ return index < 0 || index >= listRef.current.length
234
+ }
@@ -0,0 +1,141 @@
1
+ import * as ReactDOM from 'react-dom'
2
+ import { detectOverflow, offset } from '@floating-ui/react-dom'
3
+ import type { Middleware, MiddlewareState } from '@floating-ui/react-dom'
4
+
5
+ // ported from floating-ui/react/_deprecated-inner.ts
6
+ // positions the floating element so an inner list item aligns with the reference
7
+
8
+ export interface InnerProps {
9
+ listRef: React.RefObject<Array<HTMLElement | null>>
10
+ index: number | null
11
+ offset?: number
12
+ overflowRef: React.RefObject<any>
13
+ onFallbackChange?: null | ((fallback: boolean) => void)
14
+ padding?: number
15
+ minItemsVisible?: number
16
+ referenceOverflowThreshold?: number
17
+ scrollRef?: React.RefObject<HTMLElement | null>
18
+ }
19
+
20
+ function getArgsWithCustomFloatingHeight(state: MiddlewareState, height: number) {
21
+ return {
22
+ ...state,
23
+ rects: {
24
+ ...state.rects,
25
+ floating: {
26
+ ...state.rects.floating,
27
+ height,
28
+ },
29
+ },
30
+ }
31
+ }
32
+
33
+ export const inner = (props: InnerProps): Middleware => ({
34
+ name: 'inner',
35
+ options: props,
36
+ async fn(state: MiddlewareState) {
37
+ const {
38
+ listRef,
39
+ overflowRef,
40
+ onFallbackChange,
41
+ offset: innerOffset = 0,
42
+ index = 0,
43
+ minItemsVisible = 4,
44
+ referenceOverflowThreshold = 0,
45
+ scrollRef,
46
+ padding = 0,
47
+ } = props
48
+
49
+ const {
50
+ rects,
51
+ elements: { floating },
52
+ } = state
53
+
54
+ const item = listRef.current?.[index ?? 0]
55
+ const scrollEl = scrollRef?.current || floating
56
+
57
+ const clientTop = floating.clientTop || scrollEl.clientTop
58
+ const floatingIsBordered = floating.clientTop !== 0
59
+ const scrollElIsBordered = scrollEl.clientTop !== 0
60
+ const floatingIsScrollEl = floating === scrollEl
61
+
62
+ if (!item || index == null) {
63
+ onFallbackChange?.(true)
64
+ return {}
65
+ }
66
+
67
+ // use the offset middleware to compute the y position that aligns
68
+ // the selected item's center with the reference's center
69
+ const nextArgs = {
70
+ ...state,
71
+ ...(await offset(
72
+ -item.offsetTop -
73
+ floating.clientTop -
74
+ rects.reference.height / 2 -
75
+ item.offsetHeight / 2 -
76
+ innerOffset
77
+ ).fn(state)),
78
+ }
79
+
80
+ const detectOverflowOptions = { padding }
81
+
82
+ const overflow = await detectOverflow(
83
+ getArgsWithCustomFloatingHeight(
84
+ nextArgs,
85
+ scrollEl.scrollHeight + clientTop + floating.clientTop
86
+ ),
87
+ detectOverflowOptions
88
+ )
89
+
90
+ const refOverflow = await detectOverflow(nextArgs, {
91
+ ...detectOverflowOptions,
92
+ elementContext: 'reference',
93
+ })
94
+
95
+ const diffY = Math.max(0, overflow.top)
96
+ const nextY = nextArgs.y + diffY
97
+ const isScrollable = scrollEl.scrollHeight > scrollEl.clientHeight
98
+ const rounder = isScrollable ? (v: number) => v : Math.round
99
+
100
+ const maxHeight = rounder(
101
+ Math.max(
102
+ 0,
103
+ scrollEl.scrollHeight +
104
+ ((floatingIsBordered && floatingIsScrollEl) || scrollElIsBordered
105
+ ? clientTop * 2
106
+ : 0) -
107
+ diffY -
108
+ Math.max(0, overflow.bottom)
109
+ )
110
+ )
111
+
112
+ scrollEl.style.maxHeight = `${maxHeight}px`
113
+ scrollEl.scrollTop = diffY
114
+
115
+ // check if we should fall back to standard positioning
116
+ if (onFallbackChange) {
117
+ const shouldFallback =
118
+ scrollEl.offsetHeight <
119
+ item.offsetHeight * Math.min(minItemsVisible, listRef.current?.length ?? 0) -
120
+ 1 ||
121
+ refOverflow.top >= -referenceOverflowThreshold ||
122
+ refOverflow.bottom >= -referenceOverflowThreshold
123
+
124
+ ReactDOM.flushSync(() => onFallbackChange(shouldFallback))
125
+ }
126
+
127
+ if (overflowRef) {
128
+ ;(overflowRef as any).current = await detectOverflow(
129
+ getArgsWithCustomFloatingHeight(
130
+ { ...nextArgs, y: nextY },
131
+ scrollEl.offsetHeight + clientTop + floating.clientTop
132
+ ),
133
+ detectOverflowOptions
134
+ )
135
+ }
136
+
137
+ return {
138
+ y: nextY,
139
+ }
140
+ },
141
+ })
@@ -1,6 +1,7 @@
1
1
  import React from 'react'
2
2
 
3
3
  import * as Floating from './Floating'
4
+ import type { PopupTriggerMap } from './interactions/PopupTriggerMap'
4
5
 
5
6
  export type UseFloatingFn = typeof Floating.useFloating
6
7
 
@@ -16,11 +17,22 @@ export type UseFloatingReturn = Floating.UseFloatingReturn & {
16
17
  context?: any
17
18
  getFloatingProps?: (props: { ref: any; [key: string]: any }) => any
18
19
  getReferenceProps?: (props: { ref: any; [key: string]: any }) => any
20
+ // extended by useFloatingContext for hoverable popovers/tooltips
21
+ open?: boolean
22
+ onHoverReference?: (event: any) => void
23
+ onLeaveReference?: () => void
24
+ triggerElements?: PopupTriggerMap
19
25
  }
20
26
 
21
- export const FloatingOverrideContext = React.createContext<UseFloatingFn | null>(null)
27
+ export type UseFloatingOverrideFn = (props?: UseFloatingProps) => UseFloatingReturn
28
+
29
+ export const FloatingOverrideContext = React.createContext<UseFloatingOverrideFn | null>(
30
+ null
31
+ )
22
32
 
23
33
  export const useFloating = (props: UseFloatingProps): UseFloatingReturn => {
34
+ 'use no memo'
35
+
24
36
  const context = React.useContext(FloatingOverrideContext)
25
37
  return (context || Floating.useFloating)?.({
26
38
  ...props,
@@ -1,6 +1,7 @@
1
1
  import type { ComputePositionReturn } from '@floating-ui/react-native';
2
2
  import type { RefObject } from 'react';
3
3
  export declare const autoUpdate: () => void;
4
+ export declare const getOverflowAncestors: () => never[];
4
5
  export * from '@floating-ui/react-native';
5
6
  export declare const platform: null;
6
7
  export declare type UseFloatingReturn = Data & {
@@ -1 +1 @@
1
- {"version":3,"file":"Floating.native.d.ts","sourceRoot":"","sources":["../src/Floating.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,eAAO,MAAM,UAAU,YAAW,CAAA;AAElC,cAAc,2BAA2B,CAAA;AAEzC,eAAO,MAAM,QAAQ,MAAO,CAAA;AAE5B,MAAM,CAAC,OAAO,MAAM,iBAAiB,GAAG,IAAI,GAAG;IAC7C,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7B,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;IAC9B,IAAI,EAAE;QACJ,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;QACzB,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;QACxB,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;QAC5B,YAAY,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;QACjC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;QAChC,eAAe,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;KACrC,CAAA;IACD,QAAQ,EAAE;QACR,SAAS,EAAE,GAAG,CAAA;QACd,QAAQ,EAAE,GAAG,CAAA;QACb,YAAY,EAAE,GAAG,CAAA;KAClB,CAAA;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,CAAC,KAAK,EAAE;YAChB,WAAW,EAAE;gBACX,aAAa,EAAE;oBACb,CAAC,EAAE,MAAM,CAAA;oBACT,CAAC,EAAE,MAAM,CAAA;iBACV,CAAA;aACF,CAAA;SACF,KAAK,IAAI,CAAA;QACV,mBAAmB,EAAE,EAAE,CAAA;KACxB,CAAA;CACF,CAAA;AAED,KAAK,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG;IACnD,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACjB,CAAA"}
1
+ {"version":3,"file":"Floating.native.d.ts","sourceRoot":"","sources":["../src/Floating.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,eAAO,MAAM,UAAU,YAAW,CAAA;AAClC,eAAO,MAAM,oBAAoB,eAAW,CAAA;AAE5C,cAAc,2BAA2B,CAAA;AAEzC,eAAO,MAAM,QAAQ,MAAO,CAAA;AAE5B,MAAM,CAAC,OAAO,MAAM,iBAAiB,GAAG,IAAI,GAAG;IAC7C,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7B,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;IAC9B,IAAI,EAAE;QACJ,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;QACzB,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;QACxB,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;QAC5B,YAAY,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;QACjC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;QAChC,eAAe,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;KACrC,CAAA;IACD,QAAQ,EAAE;QACR,SAAS,EAAE,GAAG,CAAA;QACd,QAAQ,EAAE,GAAG,CAAA;QACb,YAAY,EAAE,GAAG,CAAA;KAClB,CAAA;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,CAAC,KAAK,EAAE;YAChB,WAAW,EAAE;gBACX,aAAa,EAAE;oBACb,CAAC,EAAE,MAAM,CAAA;oBACT,CAAC,EAAE,MAAM,CAAA;iBACV,CAAA;aACF,CAAA;SACF,KAAK,IAAI,CAAA;QACV,mBAAmB,EAAE,EAAE,CAAA;KACxB,CAAA;CACF,CAAA;AAED,KAAK,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG;IACnD,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACjB,CAAA"}
package/types/index.d.ts CHANGED
@@ -1,4 +1,19 @@
1
1
  export type { AlignedPlacement, Alignment, ArrowOptions, AutoPlacementOptions, AutoUpdateOptions, Axis, Boundary, ClientRectObject, ComputePositionConfig, ComputePositionReturn, Coords, DetectOverflowOptions, Dimensions, ElementContext, ElementRects, Elements, FlipOptions, FloatingElement, HideOptions, InlineOptions, Length, Middleware, MiddlewareData, MiddlewareReturn, MiddlewareState, NodeScroll, OffsetOptions, Padding, Placement, Platform, Rect, ReferenceElement, ReferenceType, RootBoundary, ShiftOptions, Side, SideObject, SizeOptions, Strategy, UseFloatingData, UseFloatingOptions, VirtualElement, } from './Floating';
2
- export { arrow, autoPlacement, autoUpdate, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size, } from './Floating';
3
- export { useFloating, FloatingOverrideContext, type UseFloatingReturn, type UseFloatingProps, type UseFloatingFn, } from './useFloating';
2
+ export { arrow, autoPlacement, autoUpdate, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size, } from './Floating';
3
+ export { useFloating, FloatingOverrideContext, type UseFloatingReturn, type UseFloatingProps, type UseFloatingFn, type UseFloatingOverrideFn, } from './useFloating';
4
+ export { useFloating as useFloatingRaw } from './Floating';
5
+ export { createFloatingEvents } from './interactions/createFloatingEvents';
6
+ export { PopupTriggerMap } from './interactions/PopupTriggerMap';
7
+ export { useInteractions } from './interactions/useInteractions';
8
+ export { useHover } from './interactions/useHover';
9
+ export { safePolygon } from './interactions/safePolygon';
10
+ export { useFocus } from './interactions/useFocus';
11
+ export { useRole } from './interactions/useRole';
12
+ export { useClick } from './interactions/useClick';
13
+ export { useListNavigation } from './interactions/useListNavigation';
14
+ export { useTypeahead } from './interactions/useTypeahead';
15
+ export { useInnerOffset } from './interactions/useInnerOffset';
16
+ export { FloatingDelayGroup, useDelayGroup, useDelayGroupContext, } from './interactions/useDelayGroup';
17
+ export { inner } from './middleware/inner';
18
+ export type { ElementProps, FloatingEvents, FloatingInteractionContext, OpenChangeReason, UseHoverProps, HandleCloseFn, SafePolygonOptions, UseFocusProps, UseRoleProps, UseClickProps, UseListNavigationProps, UseTypeaheadProps, UseInnerOffsetProps, Delay, } from './interactions/types';
4
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,MAAM,EACN,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,eAAe,EACf,WAAW,EACX,aAAa,EACb,MAAM,EACN,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,aAAa,EACb,OAAO,EACP,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,WAAW,EACX,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,cAAc,GACf,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,KAAK,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,UAAU,EACV,MAAM,EACN,QAAQ,EACR,KAAK,EACL,IAAI,GACL,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,MAAM,EACN,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,eAAe,EACf,WAAW,EACX,aAAa,EACb,MAAM,EACN,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,aAAa,EACb,OAAO,EACP,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,WAAW,EACX,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,cAAc,GACf,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,KAAK,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,IAAI,EACJ,oBAAoB,EACpB,IAAI,EACJ,MAAM,EACN,UAAU,EACV,MAAM,EACN,QAAQ,EACR,KAAK,EACL,IAAI,GACL,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAA;AAItB,OAAO,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,YAAY,CAAA;AAG1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAG1E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,oBAAoB,GACrB,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAG1C,YAAY,EACV,YAAY,EACZ,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,GACN,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,8 @@
1
+ export declare class PopupTriggerMap {
2
+ private map;
3
+ private elements;
4
+ add(id: string, element: Element): void;
5
+ delete(id: string): void;
6
+ hasElement(element: Element): boolean;
7
+ }
8
+ //# sourceMappingURL=PopupTriggerMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PopupTriggerMap.d.ts","sourceRoot":"","sources":["../../src/interactions/PopupTriggerMap.ts"],"names":[],"mappings":"AAKA,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,QAAQ,CAAqB;IAErC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAShC,MAAM,CAAC,EAAE,EAAE,MAAM;IAQjB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;CAGtC"}
@@ -0,0 +1,7 @@
1
+ export type FloatingEvents = {
2
+ emit(event: string, data?: any): void;
3
+ on(event: string, handler: (data?: any) => void): void;
4
+ off(event: string, handler: (data?: any) => void): void;
5
+ };
6
+ export declare function createFloatingEvents(): FloatingEvents;
7
+ //# sourceMappingURL=createFloatingEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFloatingEvents.d.ts","sourceRoot":"","sources":["../../src/interactions/createFloatingEvents.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;IACrC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAA;IACtD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAA;CACxD,CAAA;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAuBrD"}
@@ -0,0 +1,4 @@
1
+ import type { HandleCloseFn, SafePolygonOptions } from './types';
2
+ export type { SafePolygonOptions };
3
+ export declare function safePolygon(options?: SafePolygonOptions): HandleCloseFn;
4
+ //# sourceMappingURL=safePolygon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safePolygon.d.ts","sourceRoot":"","sources":["../../src/interactions/safePolygon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAgChE,YAAY,EAAE,kBAAkB,EAAE,CAAA;AAoFlC,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,aAAa,CA+X3E"}