@tamagui/select 2.7.7 → 3.0.0-beta.643.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,3 +1,4 @@
1
+
1
2
  var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -5,336 +6,315 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
5
6
  var __getProtoOf = Object.getPrototypeOf;
6
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
8
  var __export = (target, all) => {
8
- for (var name in all) __defProp(target, name, {
9
- get: all[name],
10
- enumerable: true
11
- });
9
+ for (var name in all) __defProp(target, name, {
10
+ get: all[name],
11
+ enumerable: true
12
+ });
12
13
  };
13
14
  var __copyProps = (to, from, except, desc) => {
14
- if (from && typeof from === "object" || typeof from === "function") {
15
- for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
- get: () => from[key],
17
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
- });
19
- }
20
- return to;
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
17
+ get: () => from[key],
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
21
+ return to;
21
22
  };
22
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
- // If the importer is in node compatibility mode or this is not an ESM
24
- // file that has been converted to a CommonJS file using a Babel-
25
- // compatible transform (i.e. "__esModule" has not been set), then set
26
- // "default" to the CommonJS "module.exports" for node compatibility.
27
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
28
- value: mod,
29
- enumerable: true
23
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
24
+ value: mod,
25
+ enumerable: true
30
26
  }) : target, mod));
31
- var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
32
- value: true
33
- }), mod);
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
28
  var SelectImpl_exports = {};
35
- __export(SelectImpl_exports, {
36
- SelectInlineImpl: () => SelectInlineImpl
37
- });
29
+ __export(SelectImpl_exports, { SelectInlineImpl: () => SelectInlineImpl });
38
30
  module.exports = __toCommonJS(SelectImpl_exports);
39
31
  var import_floating = require("@tamagui/floating");
40
32
  var import_constants = require("@tamagui/constants");
41
33
  var import_core = require("@tamagui/core");
34
+ var import_helpers = require("@tamagui/helpers");
42
35
  var React = __toESM(require("react"), 1);
43
36
  var import_react_dom = require("react-dom");
44
37
  var import_constants2 = require("./constants.cjs");
45
38
  var import_context = require("./context.cjs");
46
39
  var import_jsx_runtime = require("react/jsx-runtime");
47
- const SelectInlineImpl = props => {
48
- const {
49
- scope,
50
- children,
51
- open = false,
52
- listContentRef,
53
- setActiveIndexFast
54
- } = props;
55
- const selectContext = (0, import_context.useSelectContext)(scope);
56
- const selectItemParentContext = (0, import_context.useSelectItemParentContext)(scope);
57
- const {
58
- setActiveIndex,
59
- selectedIndex,
60
- activeIndexRef
61
- } = selectContext;
62
- const {
63
- setOpen,
64
- setSelectedIndex
65
- } = selectItemParentContext;
66
- const [scrollTop, setScrollTop] = React.useState(0);
67
- const touch = (0, import_core.useIsTouchDevice)();
68
- const listItemsRef = React.useRef([]);
69
- const overflowRef = React.useRef(null);
70
- const upArrowRef = React.useRef(null);
71
- const downArrowRef = React.useRef(null);
72
- const allowSelectRef = React.useRef(false);
73
- const allowMouseUpRef = React.useRef(true);
74
- const selectTimeoutRef = React.useRef(null);
75
- const state = React.useRef({
76
- isMouseOutside: false,
77
- isTyping: false
78
- });
79
- const [controlledScrolling, setControlledScrolling] = React.useState(false);
80
- const [fallback, setFallback] = React.useState(false);
81
- const [innerOffset, setInnerOffset] = React.useState(0);
82
- const [blockSelection, setBlockSelection] = React.useState(false);
83
- const floatingStyle = React.useRef({});
84
- React.useEffect(() => {
85
- if (open) setActiveIndexFast(selectedIndex ?? 0);else {
86
- setScrollTop(0);
87
- setFallback(false);
88
- setActiveIndexFast(null);
89
- setControlledScrolling(false);
90
- }
91
- }, [open, selectedIndex, setActiveIndexFast]);
92
- (0, import_constants.useIsomorphicLayoutEffect)(() => {
93
- if (!open) return;
94
- const mouseUp = e => {
95
- if (state.current.isMouseOutside) setOpen(false);
96
- };
97
- document.addEventListener("mouseup", mouseUp);
98
- return () => {
99
- document.removeEventListener("mouseup", mouseUp);
100
- };
101
- }, [open]);
102
- const {
103
- x,
104
- y,
105
- strategy,
106
- refs,
107
- update,
108
- placement: computedPlacement
109
- } = (0, import_floating.useFloatingRaw)({
110
- open,
111
- placement: "bottom-start",
112
- whileElementsMounted: import_floating.autoUpdate,
113
- middleware: [(0, import_floating.size)({
114
- apply({
115
- rects: {
116
- reference: {
117
- width
118
- }
119
- }
120
- }) {
121
- Object.assign(floatingStyle.current, {
122
- minWidth: width + 8
123
- });
124
- if (refs.floating.current) Object.assign(refs.floating.current.style, floatingStyle.current);
125
- }
126
- }), (0, import_floating.inner)({
127
- listRef: listItemsRef,
128
- overflowRef,
129
- index: selectedIndex,
130
- offset: innerOffset,
131
- onFallbackChange: setFallback,
132
- padding: 10,
133
- minItemsVisible: touch ? 10 : 4,
134
- referenceOverflowThreshold: 20
135
- }), (0, import_floating.offset)({
136
- crossAxis: -5
137
- })]
138
- });
139
- const floatingRef = refs.floating;
140
- const showUpArrow = open && scrollTop > import_constants2.SCROLL_ARROW_THRESHOLD;
141
- const showDownArrow = open && floatingRef.current && scrollTop < floatingRef.current.scrollHeight - floatingRef.current.clientHeight - import_constants2.SCROLL_ARROW_THRESHOLD;
142
- const isScrollable = showDownArrow || showUpArrow;
143
- (0, import_constants.useIsomorphicLayoutEffect)(() => {
144
- if (typeof window === "undefined") return;
145
- window.addEventListener("resize", update);
146
- if (open) update();
147
- return () => window.removeEventListener("resize", update);
148
- }, [update, open]);
149
- const onMatch = (0, import_core.useEvent)(index => {
150
- return (open ? setActiveIndex : setSelectedIndex)(index);
151
- });
152
- const dataRef = React.useRef({});
153
- dataRef.current.placement = computedPlacement;
154
- const interactionContext = {
155
- open,
156
- onOpenChange: val => setOpen(val),
157
- refs: {
158
- reference: refs.reference,
159
- floating: refs.floating,
160
- domReference: refs.reference
161
- },
162
- elements: {
163
- reference: refs.reference?.current || null,
164
- floating: refs.floating?.current || null,
165
- domReference: refs.reference?.current || null
166
- },
167
- dataRef
168
- };
169
- const interactionsProps = [(0, import_floating.useClick)(interactionContext, {
170
- event: "mousedown",
171
- keyboardHandlers: false
172
- }), (0, import_floating.useRole)(interactionContext, {
173
- role: "listbox"
174
- }), (0, import_floating.useInnerOffset)(interactionContext, {
175
- enabled: !fallback && isScrollable,
176
- onChange: setInnerOffset,
177
- overflowRef,
178
- scrollRef: refs.floating
179
- }), (0, import_floating.useListNavigation)(interactionContext, {
180
- listRef: listItemsRef,
181
- activeIndex: selectContext.activeIndex ?? 0,
182
- selectedIndex,
183
- onNavigate: index => {
184
- if (index !== null) setActiveIndex(index);
185
- },
186
- scrollItemIntoView: false
187
- }), (0, import_floating.useTypeahead)(interactionContext, {
188
- listRef: listContentRef,
189
- onMatch,
190
- selectedIndex,
191
- activeIndex: selectContext.activeIndex,
192
- onTypingChange: e => {
193
- state.current.isTyping = e;
194
- }
195
- })];
196
- const interactions = (0, import_floating.useInteractions)(React.useMemo(() => {
197
- return interactionsProps;
198
- }, interactionsProps));
199
- const interactionsContext = React.useMemo(() => {
200
- return {
201
- ...interactions,
202
- getReferenceProps() {
203
- return interactions.getReferenceProps({
204
- ref: refs.reference,
205
- className: "SelectTrigger",
206
- onKeyDown(event) {
207
- if (event.key === "Enter" || event.code === "Space" || event.key === " " && !state.current.isTyping) {
208
- event.preventDefault();
209
- setOpen(true);
210
- }
211
- }
212
- });
213
- },
214
- getFloatingProps(props2) {
215
- return interactions.getFloatingProps({
216
- ref: refs.floating,
217
- className: "Select",
218
- ...props2,
219
- style: {
220
- position: strategy,
221
- top: y ?? "",
222
- left: x ?? "",
223
- outline: 0,
224
- scrollbarWidth: "none",
225
- ...floatingStyle.current,
226
- ...props2?.style
227
- },
228
- onPointerEnter() {
229
- setControlledScrolling(false);
230
- state.current.isMouseOutside = false;
231
- },
232
- onPointerLeave() {
233
- state.current.isMouseOutside = true;
234
- },
235
- onPointerMove() {
236
- state.current.isMouseOutside = false;
237
- setControlledScrolling(false);
238
- },
239
- onKeyDown() {
240
- setControlledScrolling(true);
241
- },
242
- onContextMenu(e) {
243
- e.preventDefault();
244
- },
245
- onScroll(event) {
246
- (0, import_react_dom.flushSync)(() => {
247
- setScrollTop(event.currentTarget.scrollTop);
248
- });
249
- }
250
- });
251
- }
252
- };
253
- }, [refs.reference.current, x, y, refs.floating.current, interactions]);
254
- (0, import_constants.useIsomorphicLayoutEffect)(() => {
255
- if (open) {
256
- allowMouseUpRef.current = false;
257
- selectTimeoutRef.current = setTimeout(() => {
258
- allowSelectRef.current = true;
259
- allowMouseUpRef.current = true;
260
- }, 300);
261
- return () => {
262
- clearTimeout(selectTimeoutRef.current);
263
- };
264
- }
265
- allowSelectRef.current = false;
266
- allowMouseUpRef.current = true;
267
- setInnerOffset(0);
268
- setFallback(false);
269
- setBlockSelection(false);
270
- }, [open]);
271
- (0, import_constants.useIsomorphicLayoutEffect)(() => {
272
- if (!open && state.current.isMouseOutside) state.current.isMouseOutside = false;
273
- }, [open]);
274
- (0, import_constants.useIsomorphicLayoutEffect)(() => {
275
- function onPointerDown(e) {
276
- const target = e.target;
277
- if (!(refs.floating.current?.contains(target) || upArrowRef.current?.contains(target) || downArrowRef.current?.contains(target))) {
278
- setOpen(false);
279
- setControlledScrolling(false);
280
- }
281
- }
282
- if (open) {
283
- document.addEventListener("pointerdown", onPointerDown);
284
- return () => {
285
- document.removeEventListener("pointerdown", onPointerDown);
286
- };
287
- }
288
- }, [open, refs, setOpen]);
289
- React.useEffect(() => {
290
- if (!open) return;
291
- const scrollActiveIntoView = index => {
292
- if (controlledScrolling && index != null) listItemsRef.current[index]?.scrollIntoView({
293
- block: "nearest"
294
- });
295
- setScrollTop(refs.floating.current?.scrollTop ?? 0);
296
- };
297
- scrollActiveIntoView(activeIndexRef.current);
298
- return selectItemParentContext.activeIndexSubscribe(scrollActiveIntoView);
299
- }, [open, refs, controlledScrolling, selectItemParentContext.activeIndexSubscribe]);
300
- React.useEffect(() => {
301
- if (open && fallback) {
302
- if (selectedIndex != null) listItemsRef.current[selectedIndex]?.scrollIntoView({
303
- block: "nearest"
304
- });
305
- }
306
- }, [open, fallback, selectedIndex]);
307
- (0, import_constants.useIsomorphicLayoutEffect)(() => {
308
- if (refs.floating.current && fallback) refs.floating.current.style.maxHeight = "";
309
- }, [refs, fallback]);
310
- const floatingContext = React.useMemo(() => ({
311
- refs,
312
- dataRef
313
- }), [refs]);
314
- return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_context.SelectProvider, {
315
- scope,
316
- ...selectContext,
317
- setScrollTop,
318
- setInnerOffset,
319
- fallback,
320
- floatingContext,
321
- canScrollDown: !!showDownArrow,
322
- canScrollUp: !!showUpArrow,
323
- controlledScrolling,
324
- blockSelection,
325
- upArrowRef,
326
- downArrowRef,
327
- update,
328
- children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_context.SelectItemParentProvider, {
329
- scope,
330
- ...selectItemParentContext,
331
- allowMouseUpRef,
332
- allowSelectRef,
333
- dataRef,
334
- interactions: interactionsContext,
335
- listRef: listItemsRef,
336
- selectTimeoutRef,
337
- children
338
- })
339
- });
340
- };
40
+ const SelectInlineImpl = (props) => {
41
+ const { scope, children, open = false, listContentRef } = props;
42
+ const selectContext = (0, import_context.useSelectContext)(scope);
43
+ const selectItemParentContext = (0, import_context.useSelectItemParentContext)(scope);
44
+ const { setActiveIndex, selectedIndex, activeIndexRef } = selectContext;
45
+ const { requestOpenChange, registry } = selectItemParentContext;
46
+ const [scrollTop, setScrollTop] = React.useState(0);
47
+ const touch = (0, import_core.useIsTouchDevice)();
48
+ const listItemsRef = selectItemParentContext.listRef;
49
+ const overflowRef = React.useRef(null);
50
+ const upArrowRef = React.useRef(null);
51
+ const downArrowRef = React.useRef(null);
52
+ const allowSelectRef = React.useRef(false);
53
+ const allowMouseUpRef = React.useRef(true);
54
+ const selectTimeoutRef = React.useRef(null);
55
+ const latestKeyboardEventRef = React.useRef(void 0);
56
+ const state = React.useRef({
57
+ isMouseOutside: false,
58
+ isTyping: false
59
+ });
60
+ const [controlledScrolling, setControlledScrolling] = React.useState(false);
61
+ const [fallback, setFallback] = React.useState(false);
62
+ const [innerOffset, setInnerOffset] = React.useState(0);
63
+ const [blockSelection, setBlockSelection] = React.useState(false);
64
+ const floatingStyle = React.useRef({});
65
+ React.useEffect(() => {
66
+ if (!open) {
67
+ setScrollTop(0);
68
+ setFallback(false);
69
+ setControlledScrolling(false);
70
+ }
71
+ }, [open]);
72
+ (0, import_constants.useIsomorphicLayoutEffect)(() => {
73
+ if (!open) return;
74
+ const mouseUp = (e) => {
75
+ if (state.current.isMouseOutside) requestOpenChange(false, (0, import_core.createChangeEventDetails)("outside-press", e));
76
+ };
77
+ document.addEventListener("mouseup", mouseUp);
78
+ return () => {
79
+ document.removeEventListener("mouseup", mouseUp);
80
+ };
81
+ }, [open]);
82
+ const { x, y, strategy, refs, update, placement: computedPlacement } = (0, import_floating.useFloatingRaw)({
83
+ open,
84
+ placement: "bottom-start",
85
+ whileElementsMounted: import_floating.autoUpdate,
86
+ middleware: [
87
+ (0, import_floating.size)({ apply({ rects: { reference: { width } } }) {
88
+ Object.assign(floatingStyle.current, { minWidth: width + 8 });
89
+ if (refs.floating.current) Object.assign(refs.floating.current.style, floatingStyle.current);
90
+ } }),
91
+ (0, import_floating.inner)({
92
+ listRef: listItemsRef,
93
+ overflowRef,
94
+ index: selectedIndex,
95
+ offset: innerOffset,
96
+ onFallbackChange: setFallback,
97
+ padding: 10,
98
+ minItemsVisible: touch ? 10 : 4,
99
+ referenceOverflowThreshold: 20
100
+ }),
101
+ (0, import_floating.offset)({ crossAxis: -5 })
102
+ ]
103
+ });
104
+ const floatingRef = refs.floating;
105
+ const showUpArrow = open && scrollTop > import_constants2.SCROLL_ARROW_THRESHOLD;
106
+ const showDownArrow = open && floatingRef.current && scrollTop < floatingRef.current.scrollHeight - floatingRef.current.clientHeight - import_constants2.SCROLL_ARROW_THRESHOLD;
107
+ const isScrollable = showDownArrow || showUpArrow;
108
+ (0, import_constants.useIsomorphicLayoutEffect)(() => {
109
+ if (typeof window === "undefined") return;
110
+ window.addEventListener("resize", update);
111
+ if (open) update();
112
+ return () => window.removeEventListener("resize", update);
113
+ }, [update, open]);
114
+ const onMatch = (0, import_core.useEvent)((index) => {
115
+ if (!open) return;
116
+ setActiveIndex(index, {
117
+ reason: "keyboard",
118
+ event: latestKeyboardEventRef.current,
119
+ trigger: void 0,
120
+ index
121
+ });
122
+ });
123
+ const dataRef = React.useRef({});
124
+ dataRef.current.placement = computedPlacement;
125
+ const interactionContext = {
126
+ open,
127
+ onOpenChange: (nextOpen, event, reason) => {
128
+ requestOpenChange(nextOpen, (0, import_core.createChangeEventDetails)(reason === "list-navigation" ? "keyboard" : "trigger-press", event, refs.reference.current));
129
+ },
130
+ refs: {
131
+ reference: refs.reference,
132
+ floating: refs.floating,
133
+ domReference: refs.reference
134
+ },
135
+ elements: {
136
+ reference: refs.reference?.current || null,
137
+ floating: refs.floating?.current || null,
138
+ domReference: refs.reference?.current || null
139
+ },
140
+ dataRef
141
+ };
142
+ const interactionsProps = [
143
+ (0, import_floating.useClick)(interactionContext, {
144
+ event: "mousedown",
145
+ keyboardHandlers: false
146
+ }),
147
+ (0, import_floating.useRole)(interactionContext, { role: "listbox" }),
148
+ (0, import_floating.useInnerOffset)(interactionContext, {
149
+ enabled: !fallback && isScrollable,
150
+ onChange: setInnerOffset,
151
+ overflowRef,
152
+ scrollRef: refs.floating
153
+ }),
154
+ (0, import_floating.useListNavigation)(interactionContext, {
155
+ listRef: listItemsRef,
156
+ activeIndex: selectContext.activeIndex ?? 0,
157
+ selectedIndex,
158
+ onNavigate: (index) => {
159
+ if (index !== null) setActiveIndex(index, {
160
+ reason: "list-navigation",
161
+ event: latestKeyboardEventRef.current,
162
+ trigger: void 0,
163
+ index
164
+ });
165
+ },
166
+ disabledIndices: registry.getDisabledIndices(),
167
+ scrollItemIntoView: false
168
+ }),
169
+ (0, import_floating.useTypeahead)(interactionContext, {
170
+ listRef: listContentRef,
171
+ onMatch,
172
+ selectedIndex,
173
+ activeIndex: selectContext.activeIndex,
174
+ onTypingChange: (e) => {
175
+ state.current.isTyping = e;
176
+ }
177
+ })
178
+ ];
179
+ const interactions = (0, import_floating.useInteractions)(React.useMemo(() => {
180
+ return interactionsProps;
181
+ }, interactionsProps));
182
+ const interactionsContext = React.useMemo(() => {
183
+ return {
184
+ ...interactions,
185
+ getReferenceProps(props2 = {}) {
186
+ return interactions.getReferenceProps({
187
+ ...props2,
188
+ onKeyDown: (0, import_helpers.composeEventHandlers)(props2.onKeyDown, (event) => {
189
+ latestKeyboardEventRef.current = event.nativeEvent || event;
190
+ if (event.key === "Enter" || event.code === "Space" || event.key === " " && !state.current.isTyping) {
191
+ event.preventDefault();
192
+ requestOpenChange(true, (0, import_core.createChangeEventDetails)("keyboard", event.nativeEvent || event, refs.reference.current));
193
+ }
194
+ })
195
+ });
196
+ },
197
+ getFloatingProps(props2) {
198
+ return interactions.getFloatingProps({
199
+ ref: refs.floating,
200
+ className: "Select",
201
+ ...props2,
202
+ style: {
203
+ position: strategy,
204
+ top: y ?? "",
205
+ left: x ?? "",
206
+ outline: 0,
207
+ scrollbarWidth: "none",
208
+ ...floatingStyle.current,
209
+ ...props2?.style
210
+ },
211
+ onPointerEnter() {
212
+ setControlledScrolling(false);
213
+ state.current.isMouseOutside = false;
214
+ },
215
+ onPointerLeave() {
216
+ state.current.isMouseOutside = true;
217
+ },
218
+ onPointerMove() {
219
+ state.current.isMouseOutside = false;
220
+ setControlledScrolling(false);
221
+ },
222
+ onKeyDown(event) {
223
+ latestKeyboardEventRef.current = event.nativeEvent || event;
224
+ setControlledScrolling(true);
225
+ },
226
+ onContextMenu(e) {
227
+ e.preventDefault();
228
+ },
229
+ onScroll(event) {
230
+ (0, import_react_dom.flushSync)(() => {
231
+ setScrollTop(event.currentTarget.scrollTop);
232
+ });
233
+ }
234
+ });
235
+ }
236
+ };
237
+ }, [
238
+ refs.reference.current,
239
+ x,
240
+ y,
241
+ refs.floating.current,
242
+ interactions
243
+ ]);
244
+ (0, import_constants.useIsomorphicLayoutEffect)(() => {
245
+ if (open) {
246
+ allowMouseUpRef.current = false;
247
+ selectTimeoutRef.current = setTimeout(() => {
248
+ allowSelectRef.current = true;
249
+ allowMouseUpRef.current = true;
250
+ }, 300);
251
+ return () => {
252
+ clearTimeout(selectTimeoutRef.current);
253
+ };
254
+ }
255
+ allowSelectRef.current = false;
256
+ allowMouseUpRef.current = true;
257
+ setInnerOffset(0);
258
+ setFallback(false);
259
+ setBlockSelection(false);
260
+ }, [open]);
261
+ (0, import_constants.useIsomorphicLayoutEffect)(() => {
262
+ if (!open && state.current.isMouseOutside) state.current.isMouseOutside = false;
263
+ }, [open]);
264
+ React.useEffect(() => {
265
+ if (!open) return;
266
+ const scrollActiveIntoView = (index) => {
267
+ if (controlledScrolling && index != null) listItemsRef.current[index]?.scrollIntoView({ block: "nearest" });
268
+ setScrollTop(refs.floating.current?.scrollTop ?? 0);
269
+ };
270
+ scrollActiveIntoView(activeIndexRef.current);
271
+ return selectItemParentContext.activeIndexSubscribe(scrollActiveIntoView);
272
+ }, [
273
+ open,
274
+ refs,
275
+ controlledScrolling,
276
+ selectItemParentContext.activeIndexSubscribe
277
+ ]);
278
+ React.useEffect(() => {
279
+ if (open && fallback) {
280
+ if (selectedIndex != null) listItemsRef.current[selectedIndex]?.scrollIntoView({ block: "nearest" });
281
+ }
282
+ }, [
283
+ open,
284
+ fallback,
285
+ selectedIndex
286
+ ]);
287
+ (0, import_constants.useIsomorphicLayoutEffect)(() => {
288
+ if (refs.floating.current && fallback) refs.floating.current.style.maxHeight = "";
289
+ }, [refs, fallback]);
290
+ const floatingContext = React.useMemo(() => ({
291
+ refs,
292
+ dataRef
293
+ }), [refs]);
294
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_context.SelectProvider, {
295
+ scope,
296
+ ...selectContext,
297
+ setScrollTop,
298
+ setInnerOffset,
299
+ fallback,
300
+ floatingContext,
301
+ canScrollDown: !!showDownArrow,
302
+ canScrollUp: !!showUpArrow,
303
+ controlledScrolling,
304
+ blockSelection,
305
+ upArrowRef,
306
+ downArrowRef,
307
+ update,
308
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_context.SelectItemParentProvider, {
309
+ scope,
310
+ ...selectItemParentContext,
311
+ allowMouseUpRef,
312
+ allowSelectRef,
313
+ dataRef,
314
+ interactions: interactionsContext,
315
+ listRef: listItemsRef,
316
+ selectTimeoutRef,
317
+ children
318
+ })
319
+ });
320
+ };