@tamagui/select 2.7.7 → 3.0.0-beta.1091.1

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 (248) hide show
  1. package/dist/cjs/Select.cjs +406 -467
  2. package/dist/cjs/Select.native.cjs +495 -0
  3. package/dist/cjs/Select.native.js +445 -492
  4. package/dist/cjs/Select.native.js.map +1 -1
  5. package/dist/cjs/SelectContent.cjs +79 -79
  6. package/dist/cjs/SelectContent.native.cjs +29 -0
  7. package/dist/cjs/SelectContent.native.js +17 -22
  8. package/dist/cjs/SelectContent.native.js.map +1 -1
  9. package/dist/cjs/SelectImpl.cjs +305 -320
  10. package/dist/cjs/SelectImpl.native.cjs +29 -0
  11. package/dist/cjs/SelectImpl.native.js +16 -24
  12. package/dist/cjs/SelectImpl.native.js.map +1 -1
  13. package/dist/cjs/SelectItem.cjs +256 -205
  14. package/dist/cjs/SelectItem.native.cjs +288 -0
  15. package/dist/cjs/SelectItem.native.js +264 -213
  16. package/dist/cjs/SelectItem.native.js.map +1 -1
  17. package/dist/cjs/SelectItemText.cjs +48 -79
  18. package/dist/cjs/SelectItemText.native.cjs +73 -0
  19. package/dist/cjs/SelectItemText.native.js +49 -79
  20. package/dist/cjs/SelectItemText.native.js.map +1 -1
  21. package/dist/cjs/SelectScrollButton.cjs +110 -130
  22. package/dist/cjs/SelectScrollButton.native.cjs +37 -0
  23. package/dist/cjs/SelectScrollButton.native.js +24 -22
  24. package/dist/cjs/SelectScrollButton.native.js.map +1 -1
  25. package/dist/cjs/SelectTrigger.cjs +68 -84
  26. package/dist/cjs/SelectTrigger.native.cjs +90 -0
  27. package/dist/cjs/SelectTrigger.native.js +70 -66
  28. package/dist/cjs/SelectTrigger.native.js.map +1 -1
  29. package/dist/cjs/SelectViewport.cjs +121 -142
  30. package/dist/cjs/SelectViewport.native.cjs +72 -0
  31. package/dist/cjs/SelectViewport.native.js +53 -50
  32. package/dist/cjs/SelectViewport.native.js.map +1 -1
  33. package/dist/cjs/constants.cjs +20 -22
  34. package/dist/cjs/constants.native.cjs +40 -0
  35. package/dist/cjs/constants.native.js +20 -21
  36. package/dist/cjs/constants.native.js.map +1 -1
  37. package/dist/cjs/context.cjs +37 -48
  38. package/dist/cjs/context.native.cjs +57 -0
  39. package/dist/cjs/context.native.js +39 -49
  40. package/dist/cjs/context.native.js.map +1 -1
  41. package/dist/cjs/index.cjs +14 -11
  42. package/dist/cjs/index.native.cjs +26 -0
  43. package/dist/cjs/index.native.js +14 -10
  44. package/dist/cjs/index.native.js.map +1 -1
  45. package/dist/cjs/selectionController.cjs +343 -0
  46. package/dist/cjs/selectionController.native.cjs +407 -0
  47. package/dist/cjs/selectionController.native.js +409 -0
  48. package/dist/cjs/selectionController.native.js.map +1 -0
  49. package/dist/cjs/types.cjs +9 -11
  50. package/dist/cjs/types.native.cjs +18 -0
  51. package/dist/cjs/types.native.js +9 -10
  52. package/dist/cjs/types.native.js.map +1 -1
  53. package/dist/esm/Select.mjs +381 -443
  54. package/dist/esm/Select.mjs.map +1 -1
  55. package/dist/esm/Select.native.js +420 -469
  56. package/dist/esm/Select.native.js.map +1 -1
  57. package/dist/esm/SelectContent.mjs +67 -61
  58. package/dist/esm/SelectContent.mjs.map +1 -1
  59. package/dist/esm/SelectContent.native.js +4 -5
  60. package/dist/esm/SelectContent.native.js.map +1 -1
  61. package/dist/esm/SelectImpl.mjs +291 -295
  62. package/dist/esm/SelectImpl.mjs.map +1 -1
  63. package/dist/esm/SelectImpl.native.js +5 -8
  64. package/dist/esm/SelectImpl.native.js.map +1 -1
  65. package/dist/esm/SelectItem.mjs +240 -181
  66. package/dist/esm/SelectItem.mjs.map +1 -1
  67. package/dist/esm/SelectItem.native.js +249 -191
  68. package/dist/esm/SelectItem.native.js.map +1 -1
  69. package/dist/esm/SelectItemText.mjs +33 -55
  70. package/dist/esm/SelectItemText.mjs.map +1 -1
  71. package/dist/esm/SelectItemText.native.js +34 -56
  72. package/dist/esm/SelectItemText.native.js.map +1 -1
  73. package/dist/esm/SelectScrollButton.mjs +95 -107
  74. package/dist/esm/SelectScrollButton.mjs.map +1 -1
  75. package/dist/esm/SelectScrollButton.native.js +11 -7
  76. package/dist/esm/SelectScrollButton.native.js.map +1 -1
  77. package/dist/esm/SelectTrigger.mjs +56 -58
  78. package/dist/esm/SelectTrigger.mjs.map +1 -1
  79. package/dist/esm/SelectTrigger.native.js +54 -44
  80. package/dist/esm/SelectTrigger.native.js.map +1 -1
  81. package/dist/esm/SelectViewport.mjs +107 -119
  82. package/dist/esm/SelectViewport.mjs.map +1 -1
  83. package/dist/esm/SelectViewport.native.js +44 -39
  84. package/dist/esm/SelectViewport.native.js.map +1 -1
  85. package/dist/esm/constants.mjs +1 -0
  86. package/dist/esm/constants.mjs.map +1 -1
  87. package/dist/esm/constants.native.js +1 -0
  88. package/dist/esm/constants.native.js.map +1 -1
  89. package/dist/esm/context.mjs +20 -28
  90. package/dist/esm/context.mjs.map +1 -1
  91. package/dist/esm/context.native.js +23 -31
  92. package/dist/esm/context.native.js.map +1 -1
  93. package/dist/esm/index.js +13 -3
  94. package/dist/esm/index.mjs +13 -3
  95. package/dist/esm/index.native.js +13 -3
  96. package/dist/esm/selectionController.mjs +315 -0
  97. package/dist/esm/selectionController.mjs.map +1 -0
  98. package/dist/esm/selectionController.native.js +377 -0
  99. package/dist/esm/selectionController.native.js.map +1 -0
  100. package/dist/esm/types.mjs +0 -2
  101. package/dist/esm/types.native.js +0 -2
  102. package/dist/jsx/Select.mjs +381 -443
  103. package/dist/jsx/Select.mjs.map +1 -1
  104. package/dist/jsx/Select.native.cjs +495 -0
  105. package/dist/jsx/Select.native.js +445 -492
  106. package/dist/jsx/Select.native.js.map +1 -1
  107. package/dist/jsx/SelectContent.mjs +67 -61
  108. package/dist/jsx/SelectContent.mjs.map +1 -1
  109. package/dist/jsx/SelectContent.native.cjs +29 -0
  110. package/dist/jsx/SelectContent.native.js +17 -22
  111. package/dist/jsx/SelectContent.native.js.map +1 -1
  112. package/dist/jsx/SelectImpl.mjs +291 -295
  113. package/dist/jsx/SelectImpl.mjs.map +1 -1
  114. package/dist/jsx/SelectImpl.native.cjs +29 -0
  115. package/dist/jsx/SelectImpl.native.js +16 -24
  116. package/dist/jsx/SelectImpl.native.js.map +1 -1
  117. package/dist/jsx/SelectItem.mjs +240 -181
  118. package/dist/jsx/SelectItem.mjs.map +1 -1
  119. package/dist/jsx/SelectItem.native.cjs +288 -0
  120. package/dist/jsx/SelectItem.native.js +264 -213
  121. package/dist/jsx/SelectItem.native.js.map +1 -1
  122. package/dist/jsx/SelectItemText.mjs +33 -55
  123. package/dist/jsx/SelectItemText.mjs.map +1 -1
  124. package/dist/jsx/SelectItemText.native.cjs +73 -0
  125. package/dist/jsx/SelectItemText.native.js +49 -79
  126. package/dist/jsx/SelectItemText.native.js.map +1 -1
  127. package/dist/jsx/SelectScrollButton.mjs +95 -107
  128. package/dist/jsx/SelectScrollButton.mjs.map +1 -1
  129. package/dist/jsx/SelectScrollButton.native.cjs +37 -0
  130. package/dist/jsx/SelectScrollButton.native.js +24 -22
  131. package/dist/jsx/SelectScrollButton.native.js.map +1 -1
  132. package/dist/jsx/SelectTrigger.mjs +56 -58
  133. package/dist/jsx/SelectTrigger.mjs.map +1 -1
  134. package/dist/jsx/SelectTrigger.native.cjs +90 -0
  135. package/dist/jsx/SelectTrigger.native.js +70 -66
  136. package/dist/jsx/SelectTrigger.native.js.map +1 -1
  137. package/dist/jsx/SelectViewport.mjs +107 -119
  138. package/dist/jsx/SelectViewport.mjs.map +1 -1
  139. package/dist/jsx/SelectViewport.native.cjs +72 -0
  140. package/dist/jsx/SelectViewport.native.js +53 -50
  141. package/dist/jsx/SelectViewport.native.js.map +1 -1
  142. package/dist/jsx/constants.mjs +1 -0
  143. package/dist/jsx/constants.mjs.map +1 -1
  144. package/dist/jsx/constants.native.cjs +40 -0
  145. package/dist/jsx/constants.native.js +20 -21
  146. package/dist/jsx/constants.native.js.map +1 -1
  147. package/dist/jsx/context.mjs +20 -28
  148. package/dist/jsx/context.mjs.map +1 -1
  149. package/dist/jsx/context.native.cjs +57 -0
  150. package/dist/jsx/context.native.js +39 -49
  151. package/dist/jsx/context.native.js.map +1 -1
  152. package/dist/jsx/index.js +13 -3
  153. package/dist/jsx/index.mjs +13 -3
  154. package/dist/jsx/index.native.cjs +26 -0
  155. package/dist/jsx/index.native.js +14 -10
  156. package/dist/jsx/index.native.js.map +1 -1
  157. package/dist/jsx/selectionController.mjs +315 -0
  158. package/dist/jsx/selectionController.mjs.map +1 -0
  159. package/dist/jsx/selectionController.native.cjs +407 -0
  160. package/dist/jsx/selectionController.native.js +409 -0
  161. package/dist/jsx/selectionController.native.js.map +1 -0
  162. package/dist/jsx/types.mjs +0 -2
  163. package/dist/jsx/types.native.cjs +18 -0
  164. package/dist/jsx/types.native.js +9 -10
  165. package/dist/jsx/types.native.js.map +1 -1
  166. package/package.json +31 -30
  167. package/src/Select.tsx +478 -378
  168. package/src/SelectContent.tsx +46 -16
  169. package/src/SelectImpl.native.tsx +0 -8
  170. package/src/SelectImpl.tsx +149 -160
  171. package/src/SelectItem.tsx +280 -159
  172. package/src/SelectItemText.tsx +16 -33
  173. package/src/SelectScrollButton.native.tsx +13 -4
  174. package/src/SelectScrollButton.tsx +57 -42
  175. package/src/SelectTrigger.tsx +77 -53
  176. package/src/SelectViewport.native.tsx +42 -25
  177. package/src/SelectViewport.tsx +60 -60
  178. package/src/context.tsx +6 -2
  179. package/src/index.tsx +5 -2
  180. package/src/selectionController.ts +404 -0
  181. package/src/types.tsx +105 -59
  182. package/types/Select.d.ts +139 -201
  183. package/types/Select.d.ts.map +1 -1
  184. package/types/SelectContent.d.ts +1 -1
  185. package/types/SelectContent.d.ts.map +1 -1
  186. package/types/SelectContent.native.d.ts.map +1 -1
  187. package/types/SelectImpl.d.ts +2 -1
  188. package/types/SelectImpl.d.ts.map +1 -1
  189. package/types/SelectImpl.native.d.ts +1 -5
  190. package/types/SelectImpl.native.d.ts.map +1 -1
  191. package/types/SelectItem.d.ts +13 -16
  192. package/types/SelectItem.d.ts.map +1 -1
  193. package/types/SelectItemText.d.ts +9 -13
  194. package/types/SelectItemText.d.ts.map +1 -1
  195. package/types/SelectScrollButton.d.ts +15 -2
  196. package/types/SelectScrollButton.d.ts.map +1 -1
  197. package/types/SelectScrollButton.native.d.ts +16 -3
  198. package/types/SelectScrollButton.native.d.ts.map +1 -1
  199. package/types/SelectTrigger.d.ts +11 -23
  200. package/types/SelectTrigger.d.ts.map +1 -1
  201. package/types/SelectViewport.d.ts +11 -38
  202. package/types/SelectViewport.d.ts.map +1 -1
  203. package/types/SelectViewport.native.d.ts +15 -4
  204. package/types/SelectViewport.native.d.ts.map +1 -1
  205. package/types/context.d.ts +2 -0
  206. package/types/context.d.ts.map +1 -1
  207. package/types/index.d.ts +5 -2
  208. package/types/index.d.ts.map +1 -1
  209. package/types/selectionController.d.ts +90 -0
  210. package/types/selectionController.d.ts.map +1 -0
  211. package/types/types.d.ts +66 -50
  212. package/types/types.d.ts.map +1 -1
  213. package/dist/cjs/BubbleSelect.cjs +0 -50
  214. package/dist/cjs/BubbleSelect.native.js +0 -30
  215. package/dist/cjs/BubbleSelect.native.js.map +0 -1
  216. package/dist/cjs/useSelectBreakpointActive.cjs +0 -32
  217. package/dist/cjs/useSelectBreakpointActive.native.js +0 -35
  218. package/dist/cjs/useSelectBreakpointActive.native.js.map +0 -1
  219. package/dist/esm/BubbleSelect.mjs +0 -27
  220. package/dist/esm/BubbleSelect.mjs.map +0 -1
  221. package/dist/esm/BubbleSelect.native.js +0 -4
  222. package/dist/esm/BubbleSelect.native.js.map +0 -1
  223. package/dist/esm/index.js.map +0 -1
  224. package/dist/esm/index.mjs.map +0 -1
  225. package/dist/esm/index.native.js.map +0 -1
  226. package/dist/esm/types.mjs.map +0 -1
  227. package/dist/esm/types.native.js.map +0 -1
  228. package/dist/esm/useSelectBreakpointActive.mjs +0 -7
  229. package/dist/esm/useSelectBreakpointActive.mjs.map +0 -1
  230. package/dist/esm/useSelectBreakpointActive.native.js +0 -7
  231. package/dist/esm/useSelectBreakpointActive.native.js.map +0 -1
  232. package/dist/jsx/BubbleSelect.mjs +0 -27
  233. package/dist/jsx/BubbleSelect.mjs.map +0 -1
  234. package/dist/jsx/BubbleSelect.native.js +0 -30
  235. package/dist/jsx/BubbleSelect.native.js.map +0 -1
  236. package/dist/jsx/index.js.map +0 -1
  237. package/dist/jsx/index.mjs.map +0 -1
  238. package/dist/jsx/types.mjs.map +0 -1
  239. package/dist/jsx/useSelectBreakpointActive.mjs +0 -7
  240. package/dist/jsx/useSelectBreakpointActive.mjs.map +0 -1
  241. package/dist/jsx/useSelectBreakpointActive.native.js +0 -35
  242. package/dist/jsx/useSelectBreakpointActive.native.js.map +0 -1
  243. package/src/BubbleSelect.tsx +0 -50
  244. package/src/useSelectBreakpointActive.tsx +0 -7
  245. package/types/BubbleSelect.d.ts +0 -2
  246. package/types/BubbleSelect.d.ts.map +0 -1
  247. package/types/useSelectBreakpointActive.d.ts +0 -3
  248. package/types/useSelectBreakpointActive.d.ts.map +0 -1
@@ -1,304 +1,300 @@
1
1
  import { autoUpdate, inner, offset, size, useClick, useFloatingRaw, useInnerOffset, useInteractions, useListNavigation, useRole, useTypeahead } from "@tamagui/floating";
2
2
  import { useIsomorphicLayoutEffect } from "@tamagui/constants";
3
- import { useEvent, useIsTouchDevice } from "@tamagui/core";
3
+ import { createChangeEventDetails, useEvent, useIsTouchDevice } from "@tamagui/core";
4
+ import { composeEventHandlers } from "@tamagui/helpers";
4
5
  import * as React from "react";
5
- import { flushSync } from "react-dom";
6
6
  import { SCROLL_ARROW_THRESHOLD } from "./constants.mjs";
7
7
  import { SelectItemParentProvider, SelectProvider, useSelectContext, useSelectItemParentContext } from "./context.mjs";
8
8
  import { jsx } from "react/jsx-runtime";
9
- const SelectInlineImpl = props => {
10
- const {
11
- scope,
12
- children,
13
- open = false,
14
- listContentRef,
15
- setActiveIndexFast
16
- } = props;
17
- const selectContext = useSelectContext(scope);
18
- const selectItemParentContext = useSelectItemParentContext(scope);
19
- const {
20
- setActiveIndex,
21
- selectedIndex,
22
- activeIndexRef
23
- } = selectContext;
24
- const {
25
- setOpen,
26
- setSelectedIndex
27
- } = selectItemParentContext;
28
- const [scrollTop, setScrollTop] = React.useState(0);
29
- const touch = useIsTouchDevice();
30
- const listItemsRef = React.useRef([]);
31
- const overflowRef = React.useRef(null);
32
- const upArrowRef = React.useRef(null);
33
- const downArrowRef = React.useRef(null);
34
- const allowSelectRef = React.useRef(false);
35
- const allowMouseUpRef = React.useRef(true);
36
- const selectTimeoutRef = React.useRef(null);
37
- const state = React.useRef({
38
- isMouseOutside: false,
39
- isTyping: false
40
- });
41
- const [controlledScrolling, setControlledScrolling] = React.useState(false);
42
- const [fallback, setFallback] = React.useState(false);
43
- const [innerOffset, setInnerOffset] = React.useState(0);
44
- const [blockSelection, setBlockSelection] = React.useState(false);
45
- const floatingStyle = React.useRef({});
46
- React.useEffect(() => {
47
- if (open) setActiveIndexFast(selectedIndex ?? 0);else {
48
- setScrollTop(0);
49
- setFallback(false);
50
- setActiveIndexFast(null);
51
- setControlledScrolling(false);
52
- }
53
- }, [open, selectedIndex, setActiveIndexFast]);
54
- useIsomorphicLayoutEffect(() => {
55
- if (!open) return;
56
- const mouseUp = e => {
57
- if (state.current.isMouseOutside) setOpen(false);
58
- };
59
- document.addEventListener("mouseup", mouseUp);
60
- return () => {
61
- document.removeEventListener("mouseup", mouseUp);
62
- };
63
- }, [open]);
64
- const {
65
- x,
66
- y,
67
- strategy,
68
- refs,
69
- update,
70
- placement: computedPlacement
71
- } = useFloatingRaw({
72
- open,
73
- placement: "bottom-start",
74
- whileElementsMounted: autoUpdate,
75
- middleware: [size({
76
- apply({
77
- rects: {
78
- reference: {
79
- width
80
- }
81
- }
82
- }) {
83
- Object.assign(floatingStyle.current, {
84
- minWidth: width + 8
85
- });
86
- if (refs.floating.current) Object.assign(refs.floating.current.style, floatingStyle.current);
87
- }
88
- }), inner({
89
- listRef: listItemsRef,
90
- overflowRef,
91
- index: selectedIndex,
92
- offset: innerOffset,
93
- onFallbackChange: setFallback,
94
- padding: 10,
95
- minItemsVisible: touch ? 10 : 4,
96
- referenceOverflowThreshold: 20
97
- }), offset({
98
- crossAxis: -5
99
- })]
100
- });
101
- const floatingRef = refs.floating;
102
- const showUpArrow = open && scrollTop > SCROLL_ARROW_THRESHOLD;
103
- const showDownArrow = open && floatingRef.current && scrollTop < floatingRef.current.scrollHeight - floatingRef.current.clientHeight - SCROLL_ARROW_THRESHOLD;
104
- const isScrollable = showDownArrow || showUpArrow;
105
- useIsomorphicLayoutEffect(() => {
106
- if (typeof window === "undefined") return;
107
- window.addEventListener("resize", update);
108
- if (open) update();
109
- return () => window.removeEventListener("resize", update);
110
- }, [update, open]);
111
- const onMatch = useEvent(index => {
112
- return (open ? setActiveIndex : setSelectedIndex)(index);
113
- });
114
- const dataRef = React.useRef({});
115
- dataRef.current.placement = computedPlacement;
116
- const interactionContext = {
117
- open,
118
- onOpenChange: val => setOpen(val),
119
- refs: {
120
- reference: refs.reference,
121
- floating: refs.floating,
122
- domReference: refs.reference
123
- },
124
- elements: {
125
- reference: refs.reference?.current || null,
126
- floating: refs.floating?.current || null,
127
- domReference: refs.reference?.current || null
128
- },
129
- dataRef
130
- };
131
- const interactionsProps = [useClick(interactionContext, {
132
- event: "mousedown",
133
- keyboardHandlers: false
134
- }), useRole(interactionContext, {
135
- role: "listbox"
136
- }), useInnerOffset(interactionContext, {
137
- enabled: !fallback && isScrollable,
138
- onChange: setInnerOffset,
139
- overflowRef,
140
- scrollRef: refs.floating
141
- }), useListNavigation(interactionContext, {
142
- listRef: listItemsRef,
143
- activeIndex: selectContext.activeIndex ?? 0,
144
- selectedIndex,
145
- onNavigate: index => {
146
- if (index !== null) setActiveIndex(index);
147
- },
148
- scrollItemIntoView: false
149
- }), useTypeahead(interactionContext, {
150
- listRef: listContentRef,
151
- onMatch,
152
- selectedIndex,
153
- activeIndex: selectContext.activeIndex,
154
- onTypingChange: e => {
155
- state.current.isTyping = e;
156
- }
157
- })];
158
- const interactions = useInteractions(React.useMemo(() => {
159
- return interactionsProps;
160
- }, interactionsProps));
161
- const interactionsContext = React.useMemo(() => {
162
- return {
163
- ...interactions,
164
- getReferenceProps() {
165
- return interactions.getReferenceProps({
166
- ref: refs.reference,
167
- className: "SelectTrigger",
168
- onKeyDown(event) {
169
- if (event.key === "Enter" || event.code === "Space" || event.key === " " && !state.current.isTyping) {
170
- event.preventDefault();
171
- setOpen(true);
172
- }
173
- }
174
- });
175
- },
176
- getFloatingProps(props2) {
177
- return interactions.getFloatingProps({
178
- ref: refs.floating,
179
- className: "Select",
180
- ...props2,
181
- style: {
182
- position: strategy,
183
- top: y ?? "",
184
- left: x ?? "",
185
- outline: 0,
186
- scrollbarWidth: "none",
187
- ...floatingStyle.current,
188
- ...props2?.style
189
- },
190
- onPointerEnter() {
191
- setControlledScrolling(false);
192
- state.current.isMouseOutside = false;
193
- },
194
- onPointerLeave() {
195
- state.current.isMouseOutside = true;
196
- },
197
- onPointerMove() {
198
- state.current.isMouseOutside = false;
199
- setControlledScrolling(false);
200
- },
201
- onKeyDown() {
202
- setControlledScrolling(true);
203
- },
204
- onContextMenu(e) {
205
- e.preventDefault();
206
- },
207
- onScroll(event) {
208
- flushSync(() => {
209
- setScrollTop(event.currentTarget.scrollTop);
210
- });
211
- }
212
- });
213
- }
214
- };
215
- }, [refs.reference.current, x, y, refs.floating.current, interactions]);
216
- useIsomorphicLayoutEffect(() => {
217
- if (open) {
218
- allowMouseUpRef.current = false;
219
- selectTimeoutRef.current = setTimeout(() => {
220
- allowSelectRef.current = true;
221
- allowMouseUpRef.current = true;
222
- }, 300);
223
- return () => {
224
- clearTimeout(selectTimeoutRef.current);
225
- };
226
- }
227
- allowSelectRef.current = false;
228
- allowMouseUpRef.current = true;
229
- setInnerOffset(0);
230
- setFallback(false);
231
- setBlockSelection(false);
232
- }, [open]);
233
- useIsomorphicLayoutEffect(() => {
234
- if (!open && state.current.isMouseOutside) state.current.isMouseOutside = false;
235
- }, [open]);
236
- useIsomorphicLayoutEffect(() => {
237
- function onPointerDown(e) {
238
- const target = e.target;
239
- if (!(refs.floating.current?.contains(target) || upArrowRef.current?.contains(target) || downArrowRef.current?.contains(target))) {
240
- setOpen(false);
241
- setControlledScrolling(false);
242
- }
243
- }
244
- if (open) {
245
- document.addEventListener("pointerdown", onPointerDown);
246
- return () => {
247
- document.removeEventListener("pointerdown", onPointerDown);
248
- };
249
- }
250
- }, [open, refs, setOpen]);
251
- React.useEffect(() => {
252
- if (!open) return;
253
- const scrollActiveIntoView = index => {
254
- if (controlledScrolling && index != null) listItemsRef.current[index]?.scrollIntoView({
255
- block: "nearest"
256
- });
257
- setScrollTop(refs.floating.current?.scrollTop ?? 0);
258
- };
259
- scrollActiveIntoView(activeIndexRef.current);
260
- return selectItemParentContext.activeIndexSubscribe(scrollActiveIntoView);
261
- }, [open, refs, controlledScrolling, selectItemParentContext.activeIndexSubscribe]);
262
- React.useEffect(() => {
263
- if (open && fallback) {
264
- if (selectedIndex != null) listItemsRef.current[selectedIndex]?.scrollIntoView({
265
- block: "nearest"
266
- });
267
- }
268
- }, [open, fallback, selectedIndex]);
269
- useIsomorphicLayoutEffect(() => {
270
- if (refs.floating.current && fallback) refs.floating.current.style.maxHeight = "";
271
- }, [refs, fallback]);
272
- const floatingContext = React.useMemo(() => ({
273
- refs,
274
- dataRef
275
- }), [refs]);
276
- return /* @__PURE__ */jsx(SelectProvider, {
277
- scope,
278
- ...selectContext,
279
- setScrollTop,
280
- setInnerOffset,
281
- fallback,
282
- floatingContext,
283
- canScrollDown: !!showDownArrow,
284
- canScrollUp: !!showUpArrow,
285
- controlledScrolling,
286
- blockSelection,
287
- upArrowRef,
288
- downArrowRef,
289
- update,
290
- children: /* @__PURE__ */jsx(SelectItemParentProvider, {
291
- scope,
292
- ...selectItemParentContext,
293
- allowMouseUpRef,
294
- allowSelectRef,
295
- dataRef,
296
- interactions: interactionsContext,
297
- listRef: listItemsRef,
298
- selectTimeoutRef,
299
- children
300
- })
301
- });
9
+
10
+ const SelectInlineImpl = (props) => {
11
+ const { scope, children, open = false, listContentRef } = props;
12
+ const selectContext = useSelectContext(scope);
13
+ const selectItemParentContext = useSelectItemParentContext(scope);
14
+ const { setActiveIndex, selectedIndex, activeIndexRef } = selectContext;
15
+ const { requestOpenChange, registry } = selectItemParentContext;
16
+ const touch = useIsTouchDevice();
17
+ const listItemsRef = selectItemParentContext.listRef;
18
+ const overflowRef = React.useRef(null);
19
+ const upArrowRef = React.useRef(null);
20
+ const downArrowRef = React.useRef(null);
21
+ const allowSelectRef = React.useRef(false);
22
+ const allowMouseUpRef = React.useRef(true);
23
+ const selectTimeoutRef = React.useRef(null);
24
+ const latestKeyboardEventRef = React.useRef(void 0);
25
+ const state = React.useRef({
26
+ isMouseOutside: false,
27
+ isTyping: false
28
+ });
29
+ const [controlledScrolling, setControlledScrolling] = React.useState(false);
30
+ const [fallback, setFallback] = React.useState(false);
31
+ const [innerOffset, setInnerOffset] = React.useState(0);
32
+ const [blockSelection, setBlockSelection] = React.useState(false);
33
+ React.useEffect(() => {
34
+ if (!open) {
35
+ setCanScrollUp(false);
36
+ setCanScrollDown(false);
37
+ setFallback(false);
38
+ setControlledScrolling(false);
39
+ }
40
+ }, [open]);
41
+ useIsomorphicLayoutEffect(() => {
42
+ if (!open) return;
43
+ const mouseUp = (e) => {
44
+ if (state.current.isMouseOutside) requestOpenChange(false, createChangeEventDetails("outside-press", e));
45
+ };
46
+ document.addEventListener("mouseup", mouseUp);
47
+ return () => {
48
+ document.removeEventListener("mouseup", mouseUp);
49
+ };
50
+ }, [open]);
51
+ const { x, y, strategy, refs, update, placement: computedPlacement } = useFloatingRaw({
52
+ open,
53
+ placement: "bottom-start",
54
+ whileElementsMounted: autoUpdate,
55
+ middleware: [
56
+ size({ apply({ rects, elements }) {
57
+ elements.floating.style.minWidth = `${rects.reference.width + 8}px`;
58
+ } }),
59
+ inner({
60
+ listRef: listItemsRef,
61
+ overflowRef,
62
+ index: selectedIndex,
63
+ offset: innerOffset,
64
+ onFallbackChange: setFallback,
65
+ padding: 10,
66
+ minItemsVisible: touch ? 10 : 4,
67
+ referenceOverflowThreshold: 20
68
+ }),
69
+ offset({ crossAxis: -4 })
70
+ ]
71
+ });
72
+ const [canScrollUp, setCanScrollUp] = React.useState(false);
73
+ const [canScrollDown, setCanScrollDown] = React.useState(false);
74
+ const updateScrollArrows = React.useCallback(() => {
75
+ const el = refs.floating.current;
76
+ if (!el) return;
77
+ setCanScrollUp(el.scrollTop > SCROLL_ARROW_THRESHOLD);
78
+ setCanScrollDown(el.scrollTop < el.scrollHeight - el.clientHeight - SCROLL_ARROW_THRESHOLD);
79
+ }, [refs]);
80
+ const showUpArrow = open && canScrollUp;
81
+ const showDownArrow = open && canScrollDown;
82
+ const isScrollable = showDownArrow || showUpArrow;
83
+ useIsomorphicLayoutEffect(() => {
84
+ if (open) update();
85
+ }, [update, open]);
86
+ const onMatch = useEvent((index) => {
87
+ if (!open) return;
88
+ setActiveIndex(index, {
89
+ reason: "keyboard",
90
+ event: latestKeyboardEventRef.current,
91
+ trigger: void 0,
92
+ index
93
+ });
94
+ });
95
+ const dataRef = React.useRef({});
96
+ dataRef.current.placement = computedPlacement;
97
+ const onOpenChange = useEvent((nextOpen, event, reason) => {
98
+ requestOpenChange(nextOpen, createChangeEventDetails(reason === "list-navigation" ? "keyboard" : "trigger-press", event, refs.reference.current));
99
+ });
100
+ const referenceElement = refs.reference.current || null;
101
+ const floatingElement = refs.floating.current || null;
102
+ const interactionContext = React.useMemo(() => ({
103
+ open,
104
+ onOpenChange,
105
+ refs: {
106
+ reference: refs.reference,
107
+ floating: refs.floating,
108
+ domReference: refs.reference
109
+ },
110
+ elements: {
111
+ reference: referenceElement,
112
+ floating: floatingElement,
113
+ domReference: referenceElement
114
+ },
115
+ dataRef
116
+ }), [
117
+ open,
118
+ onOpenChange,
119
+ refs,
120
+ referenceElement,
121
+ floatingElement
122
+ ]);
123
+ const interactionsProps = [
124
+ useClick(interactionContext, {
125
+ event: "mousedown",
126
+ keyboardHandlers: false
127
+ }),
128
+ useRole(interactionContext, { role: "listbox" }),
129
+ useInnerOffset(interactionContext, {
130
+ enabled: !fallback && isScrollable,
131
+ onChange: setInnerOffset,
132
+ overflowRef,
133
+ scrollRef: refs.floating
134
+ }),
135
+ useListNavigation(interactionContext, {
136
+ listRef: listItemsRef,
137
+ activeIndex: null,
138
+ selectedIndex,
139
+ onNavigate: (index) => {
140
+ if (index !== null) setActiveIndex(index, {
141
+ reason: "list-navigation",
142
+ event: latestKeyboardEventRef.current,
143
+ trigger: void 0,
144
+ index
145
+ });
146
+ },
147
+ disabledIndices: registry.getDisabledIndices(),
148
+ scrollItemIntoView: false,
149
+ focusItemOnHover: false
150
+ }),
151
+ useTypeahead(interactionContext, {
152
+ listRef: listContentRef,
153
+ onMatch,
154
+ selectedIndex,
155
+ activeIndex: null,
156
+ onTypingChange: (e) => {
157
+ state.current.isTyping = e;
158
+ }
159
+ })
160
+ ];
161
+ const interactions = useInteractions(React.useMemo(() => {
162
+ return interactionsProps;
163
+ }, interactionsProps));
164
+ const interactionsContext = React.useMemo(() => {
165
+ return {
166
+ getReferenceProps(props2 = {}) {
167
+ return interactions.getReferenceProps({
168
+ ...props2,
169
+ onKeyDown: composeEventHandlers(props2.onKeyDown, (event) => {
170
+ latestKeyboardEventRef.current = event.nativeEvent || event;
171
+ if (event.key === "Enter" || event.code === "Space" || event.key === " " && !state.current.isTyping) {
172
+ event.preventDefault();
173
+ requestOpenChange(true, createChangeEventDetails("keyboard", event.nativeEvent || event, refs.reference.current));
174
+ }
175
+ })
176
+ });
177
+ },
178
+ getFloatingProps(props2) {
179
+ return interactions.getFloatingProps({
180
+ ref: refs.floating,
181
+ ...props2,
182
+ onPointerEnter() {
183
+ setControlledScrolling(false);
184
+ state.current.isMouseOutside = false;
185
+ },
186
+ onPointerLeave() {
187
+ state.current.isMouseOutside = true;
188
+ },
189
+ onPointerMove() {
190
+ state.current.isMouseOutside = false;
191
+ setControlledScrolling(false);
192
+ },
193
+ onKeyDown(event) {
194
+ latestKeyboardEventRef.current = event.nativeEvent || event;
195
+ setControlledScrolling(true);
196
+ },
197
+ onContextMenu(e) {
198
+ e.preventDefault();
199
+ },
200
+ onScroll: updateScrollArrows
201
+ });
202
+ }
203
+ };
204
+ }, [
205
+ refs,
206
+ interactions,
207
+ requestOpenChange,
208
+ updateScrollArrows
209
+ ]);
210
+ const floatingPosition = React.useMemo(() => ({
211
+ position: strategy,
212
+ top: y ?? "",
213
+ left: x ?? ""
214
+ }), [
215
+ strategy,
216
+ x,
217
+ y
218
+ ]);
219
+ useIsomorphicLayoutEffect(() => {
220
+ if (open) {
221
+ allowMouseUpRef.current = false;
222
+ selectTimeoutRef.current = setTimeout(() => {
223
+ allowSelectRef.current = true;
224
+ allowMouseUpRef.current = true;
225
+ }, 300);
226
+ return () => {
227
+ clearTimeout(selectTimeoutRef.current);
228
+ };
229
+ }
230
+ allowSelectRef.current = false;
231
+ allowMouseUpRef.current = true;
232
+ setInnerOffset(0);
233
+ setFallback(false);
234
+ setBlockSelection(false);
235
+ }, [open]);
236
+ useIsomorphicLayoutEffect(() => {
237
+ if (!open && state.current.isMouseOutside) state.current.isMouseOutside = false;
238
+ }, [open]);
239
+ React.useEffect(() => {
240
+ if (!open) return;
241
+ const scrollActiveIntoView = (index) => {
242
+ if (controlledScrolling && index != null) listItemsRef.current[index]?.scrollIntoView({ block: "nearest" });
243
+ updateScrollArrows();
244
+ };
245
+ scrollActiveIntoView(activeIndexRef.current);
246
+ return selectItemParentContext.activeIndexSubscribe(scrollActiveIntoView);
247
+ }, [
248
+ open,
249
+ controlledScrolling,
250
+ selectItemParentContext.activeIndexSubscribe,
251
+ updateScrollArrows
252
+ ]);
253
+ React.useEffect(() => {
254
+ if (open && fallback) {
255
+ if (selectedIndex != null) listItemsRef.current[selectedIndex]?.scrollIntoView({ block: "nearest" });
256
+ }
257
+ }, [
258
+ open,
259
+ fallback,
260
+ selectedIndex
261
+ ]);
262
+ useIsomorphicLayoutEffect(() => {
263
+ if (refs.floating.current && fallback) refs.floating.current.style.maxHeight = "";
264
+ }, [refs, fallback]);
265
+ const floatingContext = React.useMemo(() => ({
266
+ refs,
267
+ dataRef
268
+ }), [refs]);
269
+ return /* @__PURE__ */ jsx(SelectProvider, {
270
+ scope,
271
+ ...selectContext,
272
+ updateScrollArrows,
273
+ setInnerOffset,
274
+ fallback,
275
+ floatingContext,
276
+ interactions: interactionsContext,
277
+ floatingPosition,
278
+ canScrollDown: !!showDownArrow,
279
+ canScrollUp: !!showUpArrow,
280
+ controlledScrolling,
281
+ blockSelection,
282
+ upArrowRef,
283
+ downArrowRef,
284
+ update,
285
+ children: /* @__PURE__ */ jsx(SelectItemParentProvider, {
286
+ scope,
287
+ ...selectItemParentContext,
288
+ allowMouseUpRef,
289
+ allowSelectRef,
290
+ dataRef,
291
+ getItemProps: interactions.getItemProps,
292
+ listRef: listItemsRef,
293
+ selectTimeoutRef,
294
+ children
295
+ })
296
+ });
302
297
  };
298
+
303
299
  export { SelectInlineImpl };
304
300
  //# sourceMappingURL=SelectImpl.mjs.map