@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,473 +1,412 @@
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 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;
27
+ const children = childrenProp !== void 0 ? childrenProp : context.renderValue ? context.renderValue(context.value) : registeredValue;
28
+ const selectValueChildren = isEmptyValue ? placeholder ?? children : children;
29
+ return /* @__PURE__ */ jsx(SelectValueFrame, {
30
+ pointerEvents: "none",
31
+ ref: composedRefs,
32
+ ...props,
33
+ children: selectValueChildren
34
+ });
27
35
  });
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
- });
36
+ const SelectIcon = styled(View, {
37
+ displayName: "SelectIcon",
38
+ "aria-hidden": true
51
39
  });
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;
40
+ const SelectItemIndicatorFrame = styled(View, { displayName: "SelectItemIndicator" });
41
+ const SelectItemIndicator = createStyledHOC(SelectItemIndicatorFrame, function SelectItemIndicator2(props, forwardedRef) {
42
+ const { scope, ...itemIndicatorProps } = props;
43
+ const context = useSelectItemParentContext(scope);
44
+ const itemContext = useSelectItemContext(scope);
45
+ if (context.shouldRenderWebNative) return null;
46
+ return itemContext.isSelected ? /* @__PURE__ */ jsx(SelectItemIndicatorFrame, {
47
+ "aria-hidden": true,
48
+ ...itemIndicatorProps,
49
+ ref: forwardedRef
50
+ }) : null;
84
51
  });
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
- }
52
+ const SelectIndicatorFrame = styled(View, {
53
+ displayName: "SelectIndicator",
54
+ position: "absolute",
55
+ top: 0,
56
+ left: 0,
57
+ pointerEvents: "none",
58
+ zIndex: 10
103
59
  });
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
- });
60
+ const SelectIndicator = createStyledHOC(SelectIndicatorFrame, function SelectIndicator2({ scope, ...props }, forwardedRef) {
61
+ const itemContext = useSelectItemParentContext(scope);
62
+ const context = useSelectContext(scope);
63
+ const [layout, setLayout] = React.useState(null);
64
+ const rafRef = React.useRef(0);
65
+ React.useLayoutEffect(() => {
66
+ const update = (index) => {
67
+ if (typeof index !== "number") return;
68
+ cancelAnimationFrame(rafRef.current);
69
+ rafRef.current = requestAnimationFrame(() => {
70
+ const node = itemContext.listRef?.current?.[index];
71
+ if (node) setLayout({
72
+ width: Math.round(node.offsetWidth),
73
+ height: Math.round(node.offsetHeight),
74
+ x: Math.round(node.offsetLeft),
75
+ y: Math.round(node.offsetTop)
76
+ });
77
+ });
78
+ };
79
+ if (context.open && context.activeIndexRef.current !== null) update(context.activeIndexRef.current);
80
+ return itemContext.activeIndexSubscribe(update);
81
+ }, [context.open, itemContext.listRef]);
82
+ if (!layout) return null;
83
+ return /* @__PURE__ */ jsx(SelectIndicatorFrame, {
84
+ ref: forwardedRef,
85
+ ...props,
86
+ width: layout.width,
87
+ height: layout.height,
88
+ x: layout.x,
89
+ y: layout.y
90
+ });
138
91
  });
139
92
  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
- }
93
+ const { Provider: SelectGroupContextProvider, useStyledContext: useSelectGroupContext } = createStyledContext({ id: "" }, "SelectGroup");
94
+ const SelectGroupFrame = styled(View, { displayName: GROUP_NAME });
95
+ const NativeSelect = styled(Text, {
96
+ displayName: "NativeSelect",
97
+ render: "select"
192
98
  });
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
- });
99
+ const SelectGroup = createStyledHOC(SelectGroupFrame, (props, forwardedRef) => {
100
+ const { scope, ...groupProps } = props;
101
+ const groupId = React.useId();
102
+ const context = useSelectContext(scope);
103
+ const itemParentContext = useSelectItemParentContext(scope);
104
+ const StyledNativeSelect = React.useContext(SelectNativeComponentContext);
105
+ const nativeSelectRef = React.useRef(null);
106
+ const content = (() => {
107
+ if (itemParentContext.shouldRenderWebNative) return /* @__PURE__ */ jsx(NativeSelect, {
108
+ ...StyledNativeSelect && {
109
+ render: StyledNativeSelect,
110
+ size: itemParentContext.size,
111
+ style: { appearance: "none" }
112
+ },
113
+ ...groupProps,
114
+ value: context.value,
115
+ multiple: context.mode === "multiple",
116
+ name: itemParentContext.name,
117
+ form: itemParentContext.form,
118
+ id: itemParentContext.id,
119
+ onChange: ((event) => {
120
+ const value = context.mode === "multiple" ? Array.from(event.currentTarget.selectedOptions, (option) => option.value) : event.currentTarget.value;
121
+ itemParentContext.changeNativeValue(value, event.nativeEvent);
122
+ }),
123
+ ref: nativeSelectRef,
124
+ children: props.children
125
+ });
126
+ return /* @__PURE__ */ jsx(SelectGroupFrame, {
127
+ role: "group",
128
+ "aria-labelledby": groupId,
129
+ ...groupProps,
130
+ ref: forwardedRef
131
+ });
132
+ })();
133
+ return /* @__PURE__ */ jsx(SelectGroupContextProvider, {
134
+ scope,
135
+ id: groupId || "",
136
+ children: content
137
+ });
234
138
  });
235
139
  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
- }
140
+ const SelectLabelFrame = styled(Text, { displayName: "SelectLabel" });
141
+ const SelectLabel = createStyledHOC(SelectLabelFrame, (props, forwardedRef) => {
142
+ const { scope, ...labelProps } = props;
143
+ const context = useSelectItemParentContext(scope);
144
+ const groupContext = useSelectGroupContext(scope);
145
+ if (context.shouldRenderWebNative) return null;
146
+ return /* @__PURE__ */ jsx(SelectLabelFrame, {
147
+ render: "div",
148
+ id: groupContext.id,
149
+ ...labelProps,
150
+ ref: forwardedRef
151
+ });
263
152
  });
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
- });
153
+ const SelectSeparator = styled(View, { displayName: "SelectSeparator" });
154
+ const SelectSheetImpl = (props) => {
155
+ return /* @__PURE__ */ jsx(Fragment, { children: props.children });
296
156
  };
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
157
+ function SelectRoot(props) {
158
+ const adaptScope = `AdaptSelect${props.scope || ""}`;
159
+ const [open, requestOpenChange] = useControllableState({
160
+ prop: props.open,
161
+ defaultProp: props.defaultOpen || false,
162
+ onChange: props.onOpenChange
163
+ });
164
+ return /* @__PURE__ */ jsx(AdaptParent, {
165
+ scope: adaptScope,
166
+ open,
167
+ onOpenChange: React.useCallback((nextOpen) => {
168
+ requestOpenChange(nextOpen, createChangeEventDetails(nextOpen ? "trigger-press" : "outside-press"));
169
+ }, [requestOpenChange]),
170
+ children: /* @__PURE__ */ jsx(SelectInner, {
171
+ ...props,
172
+ scope: props.scope,
173
+ adaptScope,
174
+ open,
175
+ requestOpenChange
176
+ })
177
+ });
178
+ }
179
+ const Select = withStaticProperties(SelectRoot, {
180
+ Root: SelectRoot,
181
+ Adapt,
182
+ Content: SelectContent,
183
+ Group: SelectGroup,
184
+ Icon: SelectIcon,
185
+ Item: SelectItem,
186
+ ItemIndicator: SelectItemIndicator,
187
+ ItemText: SelectItemText,
188
+ Label: SelectLabel,
189
+ ScrollDownButton: SelectScrollDownButton,
190
+ ScrollUpButton: SelectScrollUpButton,
191
+ Separator: SelectSeparator,
192
+ Trigger: SelectTrigger,
193
+ Value: SelectValue,
194
+ Viewport: SelectViewport,
195
+ Indicator: SelectIndicator,
196
+ FocusScope: FocusScopeController
329
197
  });
330
198
  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
- }, [])];
199
+ const listenersRef = React.useRef(/* @__PURE__ */ new Set());
200
+ return [React.useCallback((value) => {
201
+ listenersRef.current.forEach((l) => l(value));
202
+ }, []), React.useCallback((listener) => {
203
+ listenersRef.current.add(listener);
204
+ return () => {
205
+ listenersRef.current.delete(listener);
206
+ };
207
+ }, [])];
340
208
  }
341
209
  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;
210
+ 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;
211
+ const SelectImpl = useAdaptIsActive(adaptScope) ? SelectSheetImpl : SelectInlineImpl;
212
+ const mode = multiple ? "multiple" : "single";
213
+ const [valueState, requestValueChange] = useControllableState({
214
+ prop: valueProp,
215
+ defaultProp: defaultValue ?? (mode === "multiple" ? [] : ""),
216
+ onChange: onValueChange,
217
+ transition: true
218
+ });
219
+ const value = React.useMemo(() => mode === "multiple" ? selectedValuesFromSelection(mode, valueState) : typeof valueState === "string" ? valueState : "", [mode, valueState]);
220
+ const selectedValues = React.useMemo(() => selectedValuesFromSelection(mode, value), [mode, value]);
221
+ const [, rerenderRegistry] = React.useReducer((version) => version + 1, 0);
222
+ const registryRef = React.useRef(null);
223
+ if (!registryRef.current) registryRef.current = createSelectItemRegistry(rerenderRegistry);
224
+ const registry = registryRef.current;
225
+ const controllerRef = React.useRef(null);
226
+ if (!controllerRef.current) controllerRef.current = createSelectSelectionController({
227
+ mode,
228
+ value,
229
+ registry
230
+ });
231
+ const controller = controllerRef.current;
232
+ controller.setMode(mode);
233
+ controller.setValue(value);
234
+ React.useEffect(() => {}, [props.id, requestOpenChange]);
235
+ const activeIndexRef = React.useRef(null);
236
+ const [activeIndex, setActiveIndexState] = React.useState(null);
237
+ const [emitActiveIndex, activeIndexSubscribe] = useEmitter();
238
+ const selectedIndexRef = React.useRef(null);
239
+ const listContentRef = React.useRef([]);
240
+ const listRef = React.useRef([]);
241
+ const [valueNode, setValueNode] = React.useState(null);
242
+ const selectedIndex = Math.max(0, controller.selectionAnchorIndex());
243
+ listContentRef.current = registry.getTypeaheadLabels();
244
+ listRef.current.length = registry.getItems().length;
245
+ useIsomorphicLayoutEffect(() => {
246
+ selectedIndexRef.current = selectedIndex;
247
+ });
248
+ const shouldRenderWebNative = isWeb && (native === true || native === "web" || Array.isArray(native) && native.includes("web"));
249
+ const setActiveIndexFast = React.useCallback((index, details) => {
250
+ if (activeIndexRef.current !== index) {
251
+ activeIndexRef.current = index;
252
+ controller.setActiveIndex(index);
253
+ if (typeof index === "number") {
254
+ emitActiveIndex(index);
255
+ const item = registry.getItems()[index];
256
+ if (item && details) onActiveChange?.(item.value, details);
257
+ }
258
+ }
259
+ }, [
260
+ controller,
261
+ emitActiveIndex,
262
+ onActiveChange,
263
+ registry
264
+ ]);
265
+ const setActiveIndex = React.useCallback((index, details) => {
266
+ setActiveIndexFast(index, details);
267
+ setActiveIndexState(index);
268
+ }, [setActiveIndexFast]);
269
+ const activeDetails = React.useCallback((reason, index, event) => ({
270
+ reason,
271
+ event,
272
+ trigger: void 0,
273
+ index
274
+ }), []);
275
+ const moveActive = React.useCallback((direction, event) => {
276
+ const nextIndex = registry.nextEnabledIndex(activeIndexRef.current, direction);
277
+ if (nextIndex >= 0) setActiveIndex(nextIndex, activeDetails("keyboard", nextIndex, event));
278
+ }, [
279
+ activeDetails,
280
+ registry,
281
+ setActiveIndex
282
+ ]);
283
+ const typeaheadRef = React.useRef({
284
+ text: "",
285
+ timeout: null
286
+ });
287
+ const search = React.useCallback((text, event) => {
288
+ clearTimeout(typeaheadRef.current.timeout);
289
+ typeaheadRef.current.text += text;
290
+ let nextIndex = registry.findTypeaheadIndex(typeaheadRef.current.text, activeIndexRef.current);
291
+ if (nextIndex < 0 && typeaheadRef.current.text.length > 1) {
292
+ typeaheadRef.current.text = text;
293
+ nextIndex = registry.findTypeaheadIndex(text, activeIndexRef.current);
294
+ }
295
+ typeaheadRef.current.timeout = setTimeout(() => {
296
+ typeaheadRef.current.text = "";
297
+ }, 750);
298
+ if (nextIndex >= 0) setActiveIndex(nextIndex, activeDetails("keyboard", nextIndex, event));
299
+ }, [
300
+ activeDetails,
301
+ registry,
302
+ setActiveIndex
303
+ ]);
304
+ React.useEffect(() => {
305
+ return () => clearTimeout(typeaheadRef.current.timeout);
306
+ }, []);
307
+ React.useEffect(() => {
308
+ if (open) {
309
+ const nextIndex = controller.initialActiveIndex();
310
+ if (nextIndex >= 0) setActiveIndex(nextIndex, activeDetails("list-navigation", nextIndex));
311
+ } else {
312
+ setActiveIndexFast(null);
313
+ setActiveIndexState(null);
314
+ }
315
+ }, [
316
+ open,
317
+ selectedIndex,
318
+ registry.getItems().length
319
+ ]);
320
+ const content = /* @__PURE__ */ jsxs(SelectItemParentProvider, {
321
+ scopeName: scope,
322
+ scope,
323
+ adaptScope,
324
+ mode,
325
+ selectedValues,
326
+ registry,
327
+ size: sizeProp,
328
+ activeIndexSubscribe,
329
+ activeIndexRef,
330
+ requestOpenChange,
331
+ id,
332
+ name,
333
+ form,
334
+ selectValue: React.useCallback((nextItemValue, details) => {
335
+ const item = registry.getItem(nextItemValue);
336
+ if (!item || item.disabled) return;
337
+ controller.setMode(mode);
338
+ controller.setValue(value);
339
+ const previousValue = controller.value;
340
+ requestValueChange(controller.toggle(nextItemValue), details);
341
+ if (details.isCanceled) {
342
+ controller.setValue(previousValue);
343
+ return;
344
+ }
345
+ if (controller.shouldCloseOnSelect) requestOpenChange(false, createChangeEventDetails(details.reason === "keyboard" ? "keyboard" : "item-press", details.event, details.trigger));
346
+ }, [
347
+ controller,
348
+ mode,
349
+ registry,
350
+ requestOpenChange,
351
+ requestValueChange,
352
+ value
353
+ ]),
354
+ changeNativeValue: React.useCallback((nextValue, event) => {
355
+ const details = createChangeEventDetails("native-change", event);
356
+ requestValueChange(nextValue, details);
357
+ if (!details.isCanceled) controller.setValue(nextValue);
358
+ }, [controller, requestValueChange]),
359
+ shouldRenderWebNative,
360
+ setActiveIndexFast,
361
+ listRef,
362
+ moveActive,
363
+ search,
364
+ children: [/* @__PURE__ */ jsx(SelectProvider, {
365
+ scope,
366
+ scopeName: scope,
367
+ adaptScope,
368
+ disablePreventBodyScroll,
369
+ dir,
370
+ blockSelection: false,
371
+ fallback: false,
372
+ valueNode,
373
+ onValueNodeChange: setValueNode,
374
+ activeIndex,
375
+ activeIndexRef,
376
+ selectedIndex,
377
+ setActiveIndex,
378
+ value,
379
+ mode,
380
+ selectedValues,
381
+ activeItem: activeIndex == null ? void 0 : registry.getItems()[activeIndex]?.value,
382
+ selectionAnchor: controller.selectionAnchor()?.value,
383
+ open,
384
+ native,
385
+ renderValue,
386
+ lazyMount,
387
+ children: shouldRenderWebNative ? children : /* @__PURE__ */ jsx(SelectImpl, {
388
+ activeIndexRef,
389
+ listContentRef,
390
+ selectedIndexRef,
391
+ setActiveIndexFast,
392
+ ...props,
393
+ open,
394
+ value,
395
+ children
396
+ })
397
+ }), isWeb && !shouldRenderWebNative && name ? (mode === "multiple" ? selectedValues : [value]).map((inputValue) => /* @__PURE__ */ jsx("input", {
398
+ type: "hidden",
399
+ name,
400
+ form,
401
+ value: inputValue
402
+ }, inputValue)) : null]
403
+ });
404
+ if (zIndex !== void 0) return /* @__PURE__ */ jsx(SelectZIndexContext.Provider, {
405
+ value: zIndex,
406
+ children: content
407
+ });
408
+ return content;
471
409
  }
472
- export { Select, SelectGroupFrame, SelectIcon, SelectSeparator };
410
+
411
+ export { Select, SelectGroup, SelectGroupFrame, SelectIcon, SelectIndicator, SelectIndicatorFrame, SelectItemIndicator, SelectItemIndicatorFrame, SelectLabel, SelectLabelFrame, SelectRoot, SelectSeparator, SelectValue, SelectValueFrame };
473
412
  //# sourceMappingURL=Select.mjs.map