@tamagui/select 2.7.7 → 3.0.0-beta.1093.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,473 +1,411 @@
1
1
  import { Adapt, AdaptParent, useAdaptIsActive } from "@tamagui/adapt";
2
2
  import { useComposedRefs } from "@tamagui/compose-refs";
3
3
  import { isWeb, useIsomorphicLayoutEffect } from "@tamagui/constants";
4
- import { createStyledContext, getVariableValue, styled, useEvent, useGet } from "@tamagui/core";
4
+ import { Text, View, createChangeEventDetails, createStyledContext, createStyledHOC, styled } from "@tamagui/core";
5
5
  import { FocusScopeController } from "@tamagui/focus-scope";
6
- import { getSpace } from "@tamagui/get-token";
7
6
  import { withStaticProperties } from "@tamagui/helpers";
8
- import { Separator } from "@tamagui/separator";
9
- import { SheetController } from "@tamagui/sheet/controller";
10
- import { XStack, YStack } from "@tamagui/stacks";
11
- import { Paragraph, SizableText } from "@tamagui/text";
12
7
  import { useControllableState } from "@tamagui/use-controllable-state";
13
8
  import * as React from "react";
14
- import { SelectItemParentProvider, SelectProvider, SelectZIndexContext, useSelectContext, useSelectItemParentContext } from "./context.mjs";
9
+ import { SelectItemParentProvider, SelectNativeComponentContext, SelectProvider, SelectZIndexContext, useSelectContext, useSelectItemParentContext } from "./context.mjs";
15
10
  import { SelectContent } from "./SelectContent.mjs";
16
11
  import { SelectInlineImpl } from "./SelectImpl.mjs";
17
12
  import { SelectItem, useSelectItemContext } from "./SelectItem.mjs";
18
- import { ITEM_TEXT_NAME, SelectItemText } from "./SelectItemText.mjs";
13
+ import { SelectItemText } from "./SelectItemText.mjs";
19
14
  import { SelectScrollDownButton, SelectScrollUpButton } from "./SelectScrollButton.mjs";
20
15
  import { SelectTrigger } from "./SelectTrigger.mjs";
21
16
  import { SelectViewport } from "./SelectViewport.mjs";
22
- import { useShowSelectSheet } from "./useSelectBreakpointActive.mjs";
23
- import { Fragment, jsx } from "react/jsx-runtime";
24
- const SelectValueFrame = styled(SizableText, {
25
- name: "SelectValue",
26
- userSelect: "none"
17
+ import { createSelectItemRegistry, createSelectSelectionController, selectedValuesFromSelection } from "./selectionController.mjs";
18
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
19
+
20
+ const SelectValueFrame = styled(Text, { displayName: "SelectValue" });
21
+ const SelectValue = createStyledHOC(SelectValueFrame, function SelectValue2({ scope, children: childrenProp, placeholder, ...props }, forwardedRef) {
22
+ const context = useSelectContext(scope);
23
+ const itemParentContext = useSelectItemParentContext(scope);
24
+ const composedRefs = useComposedRefs(forwardedRef, context.onValueNodeChange);
25
+ const isEmptyValue = context.selectedValues.length === 0;
26
+ const [, rerender] = React.useReducer((version) => version + 1, 0);
27
+ useIsomorphicLayoutEffect(() => itemParentContext.registry.subscribe(rerender), [itemParentContext.registry]);
28
+ const registeredValue = context.mode === "multiple" ? context.selectedValues.map((value, index) => /* @__PURE__ */ jsxs(React.Fragment, { children: [index > 0 ? ", " : null, itemParentContext.registry.getItem(value)?.label ?? value] }, value)) : itemParentContext.registry.getItem(context.selectedValues[0])?.label ?? context.value;
29
+ const children = childrenProp !== void 0 ? childrenProp : context.renderValue ? context.renderValue(context.value) : registeredValue;
30
+ const selectValueChildren = isEmptyValue ? placeholder ?? children : children;
31
+ return /* @__PURE__ */ jsx(SelectValueFrame, {
32
+ pointerEvents: "none",
33
+ ref: composedRefs,
34
+ ...props,
35
+ children: selectValueChildren
36
+ });
27
37
  });
28
- const SelectValue = SelectValueFrame.styleable(function SelectValue2({
29
- scope,
30
- children: childrenProp,
31
- placeholder,
32
- ...props
33
- }, forwardedRef) {
34
- const context = useSelectContext(scope);
35
- const itemParentContext = useSelectItemParentContext(scope);
36
- const composedRefs = useComposedRefs(forwardedRef, context.onValueNodeChange);
37
- const isEmptyValue = context.value == null || context.value === "";
38
- const renderedValue = context.renderValue?.(context.value);
39
- const children = childrenProp ?? renderedValue ?? itemParentContext.selectedItem ?? context.value;
40
- const selectValueChildren = isEmptyValue ? placeholder ?? children : children;
41
- return /* @__PURE__ */jsx(SelectValueFrame, {
42
- ...(!props.unstyled && {
43
- size: itemParentContext.size,
44
- ellipsis: true,
45
- pointerEvents: "none"
46
- }),
47
- ref: composedRefs,
48
- ...props,
49
- children: unwrapSelectItem(selectValueChildren)
50
- });
38
+ const SelectIcon = styled(View, {
39
+ displayName: "SelectIcon",
40
+ "aria-hidden": true
51
41
  });
52
- function unwrapSelectItem(selectValueChildren) {
53
- return React.Children.map(selectValueChildren, child => {
54
- if (child) {
55
- if (child.type?.staticConfig?.componentName === ITEM_TEXT_NAME) return child.props.children;
56
- if (child.props?.children) return unwrapSelectItem(child.props.children);
57
- }
58
- return child;
59
- });
60
- }
61
- const SelectIcon = styled(XStack, {
62
- name: "SelectIcon",
63
- "aria-hidden": true,
64
- children: /* @__PURE__ */jsx(Paragraph, {
65
- children: "▼"
66
- })
67
- });
68
- const SelectItemIndicatorFrame = styled(XStack, {
69
- name: "SelectItemIndicator"
70
- });
71
- const SelectItemIndicator = React.forwardRef(function SelectItemIndicator2(props, forwardedRef) {
72
- const {
73
- scope,
74
- ...itemIndicatorProps
75
- } = props;
76
- const context = useSelectItemParentContext(scope);
77
- const itemContext = useSelectItemContext(scope);
78
- if (context.shouldRenderWebNative) return null;
79
- return itemContext.isSelected ? /* @__PURE__ */jsx(SelectItemIndicatorFrame, {
80
- "aria-hidden": true,
81
- ...itemIndicatorProps,
82
- ref: forwardedRef
83
- }) : null;
42
+ const SelectItemIndicatorFrame = styled(View, { displayName: "SelectItemIndicator" });
43
+ const SelectItemIndicator = createStyledHOC(SelectItemIndicatorFrame, function SelectItemIndicator2(props, forwardedRef) {
44
+ const { scope, ...itemIndicatorProps } = props;
45
+ const context = useSelectItemParentContext(scope);
46
+ const itemContext = useSelectItemContext(scope);
47
+ if (context.shouldRenderWebNative) return null;
48
+ return itemContext.isSelected ? /* @__PURE__ */ jsx(SelectItemIndicatorFrame, {
49
+ "aria-hidden": true,
50
+ ...itemIndicatorProps,
51
+ ref: forwardedRef
52
+ }) : null;
84
53
  });
85
- const SelectIndicatorFrame = styled(YStack, {
86
- name: "SelectIndicator",
87
- variants: {
88
- unstyled: {
89
- false: {
90
- position: "absolute",
91
- top: 0,
92
- left: 0,
93
- pointerEvents: "none",
94
- zIndex: 10,
95
- backgroundColor: "$background",
96
- borderRadius: 0
97
- }
98
- }
99
- },
100
- defaultVariants: {
101
- unstyled: process.env.TAMAGUI_HEADLESS === "1"
102
- }
54
+ const SelectIndicatorFrame = styled(View, {
55
+ displayName: "SelectIndicator",
56
+ position: "absolute",
57
+ top: 0,
58
+ left: 0,
59
+ pointerEvents: "none",
60
+ zIndex: 10
103
61
  });
104
- const SelectIndicator = SelectIndicatorFrame.styleable(function SelectIndicator2({
105
- scope,
106
- ...props
107
- }, forwardedRef) {
108
- const itemContext = useSelectItemParentContext(scope);
109
- const context = useSelectContext(scope);
110
- const [layout, setLayout] = React.useState(null);
111
- const rafRef = React.useRef(0);
112
- React.useLayoutEffect(() => {
113
- const update = index => {
114
- if (typeof index !== "number") return;
115
- cancelAnimationFrame(rafRef.current);
116
- rafRef.current = requestAnimationFrame(() => {
117
- const node = itemContext.listRef?.current?.[index];
118
- if (node) setLayout({
119
- width: Math.round(node.offsetWidth),
120
- height: Math.round(node.offsetHeight),
121
- x: Math.round(node.offsetLeft),
122
- y: Math.round(node.offsetTop)
123
- });
124
- });
125
- };
126
- if (context.open && context.activeIndexRef.current !== null) update(context.activeIndexRef.current);
127
- return itemContext.activeIndexSubscribe(update);
128
- }, [context.open, itemContext.listRef]);
129
- if (!layout) return null;
130
- return /* @__PURE__ */jsx(SelectIndicatorFrame, {
131
- ref: forwardedRef,
132
- ...props,
133
- width: layout.width,
134
- height: layout.height,
135
- x: layout.x,
136
- y: layout.y
137
- });
62
+ const SelectIndicator = createStyledHOC(SelectIndicatorFrame, function SelectIndicator2({ scope, ...props }, forwardedRef) {
63
+ const itemContext = useSelectItemParentContext(scope);
64
+ const context = useSelectContext(scope);
65
+ const [layout, setLayout] = React.useState(null);
66
+ const rafRef = React.useRef(0);
67
+ useIsomorphicLayoutEffect(() => {
68
+ const update = (index) => {
69
+ if (typeof index !== "number") return;
70
+ cancelAnimationFrame(rafRef.current);
71
+ rafRef.current = requestAnimationFrame(() => {
72
+ const node = itemContext.listRef?.current?.[index];
73
+ if (node) setLayout({
74
+ width: Math.round(node.offsetWidth),
75
+ height: Math.round(node.offsetHeight),
76
+ x: Math.round(node.offsetLeft),
77
+ y: Math.round(node.offsetTop)
78
+ });
79
+ });
80
+ };
81
+ if (context.open && context.activeIndexRef.current !== null) update(context.activeIndexRef.current);
82
+ return itemContext.activeIndexSubscribe(update);
83
+ }, [context.open, itemContext.listRef]);
84
+ if (!layout) return null;
85
+ return /* @__PURE__ */ jsx(SelectIndicatorFrame, {
86
+ ref: forwardedRef,
87
+ ...props,
88
+ width: layout.width,
89
+ height: layout.height,
90
+ x: layout.x,
91
+ y: layout.y
92
+ });
138
93
  });
139
94
  const GROUP_NAME = "SelectGroup";
140
- const {
141
- Provider: SelectGroupContextProvider,
142
- useStyledContext: useSelectGroupContext
143
- } = createStyledContext({
144
- id: ""
145
- }, "SelectGroup");
146
- const SelectGroupFrame = styled(YStack, {
147
- name: GROUP_NAME,
148
- width: "100%"
149
- });
150
- const NativeSelectTextFrame = styled(SizableText, {
151
- render: "select",
152
- backgroundColor: "$background",
153
- borderColor: "$borderColor",
154
- hoverStyle: {
155
- backgroundColor: "$backgroundHover"
156
- }
157
- });
158
- const NativeSelectFrame = styled(YStack, {
159
- name: "NativeSelect",
160
- variants: {
161
- size: {
162
- "...size": (val, extras) => {
163
- const {
164
- tokens
165
- } = extras;
166
- const paddingHorizontal = getVariableValue(tokens.space[val]);
167
- return {
168
- borderRadius: tokens.radius[val] ?? val,
169
- minHeight: tokens.size[val],
170
- paddingRight: paddingHorizontal + 20,
171
- paddingLeft: paddingHorizontal,
172
- paddingVertical: getSpace(val, {
173
- shift: -3
174
- })
175
- };
176
- }
177
- },
178
- unstyled: {
179
- false: {
180
- borderWidth: 1,
181
- borderColor: "$borderColor",
182
- userSelect: "none",
183
- outlineWidth: 0,
184
- paddingRight: 10
185
- }
186
- }
187
- },
188
- defaultVariants: {
189
- size: "$2",
190
- unstyled: process.env.TAMAGUI_HEADLESS === "1" ? true : false
191
- }
95
+ const { Provider: SelectGroupContextProvider, useStyledContext: useSelectGroupContext } = createStyledContext({ id: "" }, "SelectGroup");
96
+ const SelectGroupFrame = styled(View, { displayName: GROUP_NAME });
97
+ const NativeSelect = styled(Text, {
98
+ displayName: "NativeSelect",
99
+ render: "select"
192
100
  });
193
- const SelectGroup = React.forwardRef((props, forwardedRef) => {
194
- const {
195
- scope,
196
- ...groupProps
197
- } = props;
198
- const groupId = React.useId();
199
- const context = useSelectContext(scope);
200
- const itemParentContext = useSelectItemParentContext(scope);
201
- const size = itemParentContext.size ?? "$true";
202
- const nativeSelectRef = React.useRef(null);
203
- const content = (() => {
204
- if (itemParentContext.shouldRenderWebNative) return /* @__PURE__ */jsx(NativeSelectFrame, {
205
- asChild: true,
206
- size,
207
- value: context.value,
208
- id: itemParentContext.id,
209
- children: /* @__PURE__ */jsx(NativeSelectTextFrame, {
210
- onChange: event => {
211
- itemParentContext.onChange(event.currentTarget.value);
212
- },
213
- size,
214
- ref: nativeSelectRef,
215
- style: {
216
- color: "var(--color)",
217
- appearance: "none"
218
- },
219
- children: props.children
220
- })
221
- });
222
- return /* @__PURE__ */jsx(SelectGroupFrame, {
223
- role: "group",
224
- "aria-labelledby": groupId,
225
- ...groupProps,
226
- ref: forwardedRef
227
- });
228
- })();
229
- return /* @__PURE__ */jsx(SelectGroupContextProvider, {
230
- scope,
231
- id: groupId || "",
232
- children: content
233
- });
101
+ const SelectGroup = createStyledHOC(SelectGroupFrame, (props, forwardedRef) => {
102
+ const { scope, ...groupProps } = props;
103
+ const groupId = React.useId();
104
+ const context = useSelectContext(scope);
105
+ const itemParentContext = useSelectItemParentContext(scope);
106
+ const StyledNativeSelect = React.useContext(SelectNativeComponentContext);
107
+ const nativeSelectRef = React.useRef(null);
108
+ const content = (() => {
109
+ if (itemParentContext.shouldRenderWebNative) return /* @__PURE__ */ jsx(NativeSelect, {
110
+ ...StyledNativeSelect && {
111
+ render: StyledNativeSelect,
112
+ size: itemParentContext.size,
113
+ style: { appearance: "none" }
114
+ },
115
+ ...groupProps,
116
+ value: context.value,
117
+ multiple: context.mode === "multiple",
118
+ name: itemParentContext.name,
119
+ form: itemParentContext.form,
120
+ id: itemParentContext.id,
121
+ onChange: ((event) => {
122
+ const value = context.mode === "multiple" ? Array.from(event.currentTarget.selectedOptions, (option) => option.value) : event.currentTarget.value;
123
+ itemParentContext.changeNativeValue(value, event.nativeEvent);
124
+ }),
125
+ ref: nativeSelectRef,
126
+ children: props.children
127
+ });
128
+ return /* @__PURE__ */ jsx(SelectGroupFrame, {
129
+ role: "group",
130
+ "aria-labelledby": groupId,
131
+ ...groupProps,
132
+ ref: forwardedRef
133
+ });
134
+ })();
135
+ return /* @__PURE__ */ jsx(SelectGroupContextProvider, {
136
+ scope,
137
+ id: groupId || "",
138
+ children: content
139
+ });
234
140
  });
235
141
  SelectGroup.displayName = GROUP_NAME;
236
- const SelectLabelFrame = styled(SizableText, {
237
- name: "SelectLabel",
238
- variants: {
239
- unstyled: {
240
- false: {
241
- size: "$true",
242
- ellipsis: true,
243
- maxWidth: "100%",
244
- cursor: "default"
245
- }
246
- },
247
- size: {
248
- "...size": (val, {
249
- tokens
250
- }) => {
251
- return {
252
- paddingHorizontal: tokens.space[val],
253
- paddingVertical: getSpace(tokens.space[val], {
254
- shift: -4
255
- })
256
- };
257
- }
258
- }
259
- },
260
- defaultVariants: {
261
- unstyled: process.env.TAMAGUI_HEADLESS === "1"
262
- }
142
+ const SelectLabelFrame = styled(Text, { displayName: "SelectLabel" });
143
+ const SelectLabel = createStyledHOC(SelectLabelFrame, (props, forwardedRef) => {
144
+ const { scope, ...labelProps } = props;
145
+ const context = useSelectItemParentContext(scope);
146
+ const groupContext = useSelectGroupContext(scope);
147
+ if (context.shouldRenderWebNative) return null;
148
+ return /* @__PURE__ */ jsx(SelectLabelFrame, {
149
+ render: "div",
150
+ id: groupContext.id,
151
+ ...labelProps,
152
+ ref: forwardedRef
153
+ });
263
154
  });
264
- const SelectLabel = SelectLabelFrame.styleable((props, forwardedRef) => {
265
- const {
266
- scope,
267
- ...labelProps
268
- } = props;
269
- const context = useSelectItemParentContext(scope);
270
- const groupContext = useSelectGroupContext(scope);
271
- if (context.shouldRenderWebNative) return null;
272
- return /* @__PURE__ */jsx(SelectLabelFrame, {
273
- render: "div",
274
- id: groupContext.id,
275
- size: context.size,
276
- ...labelProps,
277
- ref: forwardedRef
278
- });
279
- });
280
- const SelectSeparator = styled(Separator, {
281
- name: "SelectSeparator"
282
- });
283
- const SelectSheetController = props => {
284
- const context = useSelectContext(props.scope);
285
- const showSheet = useShowSelectSheet(context);
286
- const isAdapted = useAdaptIsActive(context.adaptScope);
287
- const getShowSheet = useGet(showSheet);
288
- return /* @__PURE__ */jsx(SheetController, {
289
- onOpenChange: val => {
290
- if (getShowSheet()) props.onOpenChange(val);
291
- },
292
- open: context.open,
293
- hidden: !isAdapted,
294
- children: props.children
295
- });
155
+ const SelectSeparator = styled(View, { displayName: "SelectSeparator" });
156
+ const SelectSheetImpl = (props) => {
157
+ return /* @__PURE__ */ jsx(Fragment, { children: props.children });
296
158
  };
297
- const SelectSheetImpl = props => {
298
- return /* @__PURE__ */jsx(Fragment, {
299
- children: props.children
300
- });
301
- };
302
- const Select = withStaticProperties(function Select2(props) {
303
- const adaptScope = `AdaptSelect${props.scope || ""}`;
304
- return /* @__PURE__ */jsx(AdaptParent, {
305
- scope: adaptScope,
306
- portal: true,
307
- children: /* @__PURE__ */jsx(SelectInner, {
308
- scope: props.scope,
309
- adaptScope,
310
- ...props
311
- })
312
- });
313
- }, {
314
- Adapt,
315
- Content: SelectContent,
316
- Group: SelectGroup,
317
- Icon: SelectIcon,
318
- Item: SelectItem,
319
- ItemIndicator: SelectItemIndicator,
320
- ItemText: SelectItemText,
321
- Label: SelectLabel,
322
- ScrollDownButton: SelectScrollDownButton,
323
- ScrollUpButton: SelectScrollUpButton,
324
- Trigger: SelectTrigger,
325
- Value: SelectValue,
326
- Viewport: SelectViewport,
327
- Indicator: SelectIndicator,
328
- FocusScope: FocusScopeController
159
+ function SelectRoot(props) {
160
+ const adaptScope = `AdaptSelect${props.scope || ""}`;
161
+ const [open, requestOpenChange] = useControllableState({
162
+ prop: props.open,
163
+ defaultProp: props.defaultOpen || false,
164
+ onChange: props.onOpenChange
165
+ });
166
+ const handleAdaptOpenChange = React.useCallback((nextOpen) => {
167
+ requestOpenChange(nextOpen, createChangeEventDetails(nextOpen ? "trigger-press" : "outside-press"));
168
+ }, [requestOpenChange]);
169
+ return /* @__PURE__ */ jsx(AdaptParent, {
170
+ scope: adaptScope,
171
+ adaptChildren: props.children,
172
+ open,
173
+ onOpenChange: handleAdaptOpenChange,
174
+ children: /* @__PURE__ */ jsx(SelectInner, {
175
+ ...props,
176
+ scope: props.scope,
177
+ adaptScope,
178
+ open,
179
+ requestOpenChange
180
+ })
181
+ });
182
+ }
183
+ const Select = withStaticProperties(SelectRoot, {
184
+ Root: SelectRoot,
185
+ Adapt,
186
+ Content: SelectContent,
187
+ Group: SelectGroup,
188
+ Icon: SelectIcon,
189
+ Item: SelectItem,
190
+ ItemIndicator: SelectItemIndicator,
191
+ ItemText: SelectItemText,
192
+ Label: SelectLabel,
193
+ ScrollDownButton: SelectScrollDownButton,
194
+ ScrollUpButton: SelectScrollUpButton,
195
+ Separator: SelectSeparator,
196
+ Trigger: SelectTrigger,
197
+ Value: SelectValue,
198
+ Viewport: SelectViewport,
199
+ Indicator: SelectIndicator,
200
+ FocusScope: FocusScopeController
329
201
  });
330
202
  function useEmitter() {
331
- const listenersRef = React.useRef(/* @__PURE__ */new Set());
332
- return [React.useCallback(value => {
333
- listenersRef.current.forEach(l => l(value));
334
- }, []), React.useCallback(listener => {
335
- listenersRef.current.add(listener);
336
- return () => {
337
- listenersRef.current.delete(listener);
338
- };
339
- }, [])];
203
+ const listenersRef = React.useRef(/* @__PURE__ */ new Set());
204
+ return [React.useCallback((value) => {
205
+ listenersRef.current.forEach((l) => l(value));
206
+ }, []), React.useCallback((listener) => {
207
+ listenersRef.current.add(listener);
208
+ return () => {
209
+ listenersRef.current.delete(listener);
210
+ };
211
+ }, [])];
340
212
  }
341
213
  function SelectInner(props) {
342
- const {
343
- scope = "",
344
- adaptScope,
345
- native,
346
- children,
347
- open: openProp,
348
- defaultOpen,
349
- onOpenChange,
350
- value: valueProp,
351
- defaultValue,
352
- onValueChange,
353
- disablePreventBodyScroll,
354
- size: sizeProp = "$true",
355
- onActiveChange,
356
- dir,
357
- id,
358
- renderValue,
359
- lazyMount,
360
- zIndex
361
- } = props;
362
- const SelectImpl = useAdaptIsActive(adaptScope) || !isWeb ? SelectSheetImpl : SelectInlineImpl;
363
- const forceUpdate = React.useReducer(() => ({}), {})[1];
364
- const [selectedItem, setSelectedItem] = React.useState(null);
365
- const [open, setOpen] = useControllableState({
366
- prop: openProp,
367
- defaultProp: defaultOpen || false,
368
- onChange: onOpenChange
369
- });
370
- const [value, setValue] = useControllableState({
371
- prop: valueProp,
372
- defaultProp: defaultValue || "",
373
- onChange: onValueChange,
374
- transition: true
375
- });
376
- React.useEffect(() => {
377
- if (open) emitValue(value);
378
- }, [open]);
379
- React.useEffect(() => {
380
- emitValue(value);
381
- }, [value]);
382
- const activeIndexRef = React.useRef(null);
383
- const [activeIndex, setActiveIndexState] = React.useState(null);
384
- const [emitValue, valueSubscribe] = useEmitter();
385
- const [emitActiveIndex, activeIndexSubscribe] = useEmitter();
386
- const selectedIndexRef = React.useRef(null);
387
- const listContentRef = React.useRef([]);
388
- const [selectedIndex, setSelectedIndex] = React.useState(0);
389
- const [valueNode, setValueNode] = React.useState(null);
390
- useIsomorphicLayoutEffect(() => {
391
- selectedIndexRef.current = selectedIndex;
392
- });
393
- const shouldRenderWebNative = isWeb && (native === true || native === "web" || Array.isArray(native) && native.includes("web"));
394
- const setActiveIndexFast = React.useCallback(index => {
395
- if (activeIndexRef.current !== index) {
396
- activeIndexRef.current = index;
397
- if (typeof index === "number") emitActiveIndex(index);
398
- }
399
- }, [emitActiveIndex]);
400
- const setActiveIndex = React.useCallback(index => {
401
- setActiveIndexFast(index);
402
- setActiveIndexState(index);
403
- }, [setActiveIndexFast]);
404
- const content = /* @__PURE__ */jsx(SelectItemParentProvider, {
405
- scopeName: scope,
406
- scope,
407
- adaptScope,
408
- initialValue: React.useMemo(() => value, [open]),
409
- size: sizeProp,
410
- activeIndexSubscribe,
411
- activeIndexRef,
412
- valueSubscribe,
413
- setOpen,
414
- id,
415
- onChange: React.useCallback(val => {
416
- setValue(val);
417
- emitValue(val);
418
- }, []),
419
- onActiveChange: useEvent((value2, index) => {
420
- onActiveChange?.(value2, index);
421
- }),
422
- setSelectedIndex,
423
- setValueAtIndex: React.useCallback((index, value2) => {
424
- listContentRef.current[index] = value2;
425
- }, []),
426
- shouldRenderWebNative,
427
- setActiveIndexFast,
428
- selectedItem,
429
- setSelectedItem,
430
- children: /* @__PURE__ */jsx(SelectProvider, {
431
- scope,
432
- scopeName: scope,
433
- adaptScope,
434
- disablePreventBodyScroll,
435
- dir,
436
- blockSelection: false,
437
- fallback: false,
438
- forceUpdate,
439
- valueNode,
440
- onValueNodeChange: setValueNode,
441
- activeIndex,
442
- activeIndexRef,
443
- selectedIndex,
444
- setActiveIndex,
445
- value,
446
- open,
447
- native,
448
- renderValue,
449
- lazyMount,
450
- children: /* @__PURE__ */jsx(SelectSheetController, {
451
- onOpenChange: setOpen,
452
- scope,
453
- children: shouldRenderWebNative ? children : /* @__PURE__ */jsx(SelectImpl, {
454
- activeIndexRef,
455
- listContentRef,
456
- selectedIndexRef,
457
- setActiveIndexFast,
458
- ...props,
459
- open,
460
- value,
461
- children
462
- })
463
- })
464
- })
465
- });
466
- if (zIndex !== void 0) return /* @__PURE__ */jsx(SelectZIndexContext.Provider, {
467
- value: zIndex,
468
- children: content
469
- });
470
- return content;
214
+ const { scope = "", adaptScope, native, children, open, requestOpenChange, defaultOpen: _defaultOpen, onOpenChange: _onOpenChange, value: valueProp, defaultValue, onValueChange, multiple = false, name, form, disablePreventBodyScroll, size: sizeProp = true, onActiveChange, dir, id, renderValue, lazyMount, zIndex } = props;
215
+ const SelectImpl = useAdaptIsActive(adaptScope) ? SelectSheetImpl : SelectInlineImpl;
216
+ const mode = multiple ? "multiple" : "single";
217
+ const [valueState, requestValueChange] = useControllableState({
218
+ prop: valueProp,
219
+ defaultProp: defaultValue ?? (mode === "multiple" ? [] : ""),
220
+ onChange: onValueChange,
221
+ transition: true
222
+ });
223
+ const value = React.useMemo(() => mode === "multiple" ? selectedValuesFromSelection(mode, valueState) : typeof valueState === "string" ? valueState : "", [mode, valueState]);
224
+ const selectedValues = React.useMemo(() => selectedValuesFromSelection(mode, value), [mode, value]);
225
+ const [, rerenderRegistry] = React.useReducer((version) => version + 1, 0);
226
+ const registryRef = React.useRef(null);
227
+ if (!registryRef.current) registryRef.current = createSelectItemRegistry(rerenderRegistry);
228
+ const registry = registryRef.current;
229
+ const controllerRef = React.useRef(null);
230
+ if (!controllerRef.current) controllerRef.current = createSelectSelectionController({
231
+ mode,
232
+ value,
233
+ registry
234
+ });
235
+ const controller = controllerRef.current;
236
+ controller.setMode(mode);
237
+ controller.setValue(value);
238
+ React.useEffect(() => {}, [props.id, requestOpenChange]);
239
+ const activeIndexRef = React.useRef(null);
240
+ const [emitActiveIndex, activeIndexSubscribe] = useEmitter();
241
+ const selectedIndexRef = React.useRef(null);
242
+ const lastPointerRef = React.useRef({
243
+ x: -1,
244
+ y: -1
245
+ });
246
+ const listContentRef = React.useRef([]);
247
+ const listRef = React.useRef([]);
248
+ const [valueNode, setValueNode] = React.useState(null);
249
+ const selectedIndex = Math.max(0, controller.selectionAnchorIndex());
250
+ listContentRef.current = registry.getTypeaheadLabels();
251
+ const itemNodes = registry.getNodes();
252
+ listRef.current.length = itemNodes.length;
253
+ for (let i = 0; i < itemNodes.length; i++) listRef.current[i] = itemNodes[i];
254
+ useIsomorphicLayoutEffect(() => {
255
+ selectedIndexRef.current = selectedIndex;
256
+ });
257
+ const shouldRenderWebNative = isWeb && (native === true || native === "web" || Array.isArray(native) && native.includes("web"));
258
+ const setActiveIndex = React.useCallback((index, details) => {
259
+ if (activeIndexRef.current === index) return;
260
+ activeIndexRef.current = index;
261
+ controller.setActiveIndex(index);
262
+ emitActiveIndex(index);
263
+ if (typeof index === "number") {
264
+ const item = registry.getItems()[index];
265
+ if (item && details) onActiveChange?.(item.value, details);
266
+ }
267
+ }, [
268
+ controller,
269
+ emitActiveIndex,
270
+ onActiveChange,
271
+ registry
272
+ ]);
273
+ const activeDetails = React.useCallback((reason, index, event) => ({
274
+ reason,
275
+ event,
276
+ trigger: void 0,
277
+ index
278
+ }), []);
279
+ const moveActive = React.useCallback((direction, event) => {
280
+ const nextIndex = registry.nextEnabledIndex(activeIndexRef.current, direction);
281
+ if (nextIndex >= 0) setActiveIndex(nextIndex, activeDetails("keyboard", nextIndex, event));
282
+ }, [
283
+ activeDetails,
284
+ registry,
285
+ setActiveIndex
286
+ ]);
287
+ const typeaheadRef = React.useRef({
288
+ text: "",
289
+ timeout: null
290
+ });
291
+ const search = React.useCallback((text, event) => {
292
+ clearTimeout(typeaheadRef.current.timeout);
293
+ typeaheadRef.current.text += text;
294
+ let nextIndex = registry.findTypeaheadIndex(typeaheadRef.current.text, activeIndexRef.current);
295
+ if (nextIndex < 0 && typeaheadRef.current.text.length > 1) {
296
+ typeaheadRef.current.text = text;
297
+ nextIndex = registry.findTypeaheadIndex(text, activeIndexRef.current);
298
+ }
299
+ typeaheadRef.current.timeout = setTimeout(() => {
300
+ typeaheadRef.current.text = "";
301
+ }, 750);
302
+ if (nextIndex >= 0) setActiveIndex(nextIndex, activeDetails("keyboard", nextIndex, event));
303
+ }, [
304
+ activeDetails,
305
+ registry,
306
+ setActiveIndex
307
+ ]);
308
+ React.useEffect(() => {
309
+ return () => clearTimeout(typeaheadRef.current.timeout);
310
+ }, []);
311
+ React.useEffect(() => {
312
+ if (open) {
313
+ const nextIndex = controller.initialActiveIndex();
314
+ if (nextIndex >= 0) setActiveIndex(nextIndex, activeDetails("list-navigation", nextIndex));
315
+ } else setActiveIndex(null);
316
+ }, [
317
+ open,
318
+ selectedIndex,
319
+ registry.getItems().length
320
+ ]);
321
+ const content = /* @__PURE__ */ jsxs(SelectItemParentProvider, {
322
+ scopeName: scope,
323
+ scope,
324
+ adaptScope,
325
+ mode,
326
+ selectedValues,
327
+ registry,
328
+ size: sizeProp,
329
+ activeIndexSubscribe,
330
+ activeIndexRef,
331
+ requestOpenChange,
332
+ id,
333
+ name,
334
+ form,
335
+ selectValue: React.useCallback((nextItemValue, details) => {
336
+ const item = registry.getItem(nextItemValue);
337
+ if (!item || item.disabled) return;
338
+ controller.setMode(mode);
339
+ controller.setValue(value);
340
+ const previousValue = controller.value;
341
+ requestValueChange(controller.toggle(nextItemValue), details);
342
+ if (details.isCanceled) {
343
+ controller.setValue(previousValue);
344
+ return;
345
+ }
346
+ if (controller.shouldCloseOnSelect) requestOpenChange(false, createChangeEventDetails(details.reason === "keyboard" ? "keyboard" : "item-press", details.event, details.trigger));
347
+ }, [
348
+ controller,
349
+ mode,
350
+ registry,
351
+ requestOpenChange,
352
+ requestValueChange,
353
+ value
354
+ ]),
355
+ changeNativeValue: React.useCallback((nextValue, event) => {
356
+ const details = createChangeEventDetails("native-change", event);
357
+ requestValueChange(nextValue, details);
358
+ if (!details.isCanceled) controller.setValue(nextValue);
359
+ }, [controller, requestValueChange]),
360
+ shouldRenderWebNative,
361
+ setActiveIndex,
362
+ selectedIndex,
363
+ lastPointerRef,
364
+ listRef,
365
+ moveActive,
366
+ search,
367
+ children: [/* @__PURE__ */ jsx(SelectProvider, {
368
+ scope,
369
+ scopeName: scope,
370
+ adaptScope,
371
+ disablePreventBodyScroll,
372
+ dir,
373
+ blockSelection: false,
374
+ fallback: false,
375
+ valueNode,
376
+ onValueNodeChange: setValueNode,
377
+ activeIndexRef,
378
+ selectedIndex,
379
+ setActiveIndex,
380
+ value,
381
+ mode,
382
+ selectedValues,
383
+ open,
384
+ native,
385
+ renderValue,
386
+ lazyMount,
387
+ children: shouldRenderWebNative ? children : /* @__PURE__ */ jsx(SelectImpl, {
388
+ activeIndexRef,
389
+ listContentRef,
390
+ selectedIndexRef,
391
+ ...props,
392
+ open,
393
+ value,
394
+ children
395
+ })
396
+ }), isWeb && !shouldRenderWebNative && name ? (mode === "multiple" ? selectedValues : [value]).map((inputValue) => /* @__PURE__ */ jsx("input", {
397
+ type: "hidden",
398
+ name,
399
+ form,
400
+ value: inputValue
401
+ }, inputValue)) : null]
402
+ });
403
+ if (zIndex !== void 0) return /* @__PURE__ */ jsx(SelectZIndexContext.Provider, {
404
+ value: zIndex,
405
+ children: content
406
+ });
407
+ return content;
471
408
  }
472
- export { Select, SelectGroupFrame, SelectIcon, SelectSeparator };
409
+
410
+ export { Select, SelectGroup, SelectGroupFrame, SelectIcon, SelectIndicator, SelectIndicatorFrame, SelectItemIndicator, SelectItemIndicatorFrame, SelectLabel, SelectLabelFrame, SelectRoot, SelectSeparator, SelectValue, SelectValueFrame };
473
411
  //# sourceMappingURL=Select.mjs.map