@tamagui/select 2.0.0-rc.4 → 2.0.0-rc.40

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