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