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