@tamagui/select 1.0.1-beta.113 → 1.0.1-beta.114

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 (109) hide show
  1. package/dist/cjs/Select.js +50 -558
  2. package/dist/cjs/Select.js.map +2 -2
  3. package/dist/cjs/SelectContent.js +53 -0
  4. package/dist/cjs/SelectContent.js.map +7 -0
  5. package/dist/cjs/SelectContent.native.js +31 -0
  6. package/dist/cjs/SelectContent.native.js.map +7 -0
  7. package/dist/cjs/SelectImpl.js +393 -0
  8. package/dist/cjs/SelectImpl.js.map +7 -0
  9. package/dist/cjs/SelectScrollButton.js +128 -0
  10. package/dist/cjs/SelectScrollButton.js.map +7 -0
  11. package/dist/cjs/SelectScrollButton.native.js +32 -0
  12. package/dist/cjs/SelectScrollButton.native.js.map +7 -0
  13. package/dist/cjs/SelectViewport.js +96 -0
  14. package/dist/cjs/SelectViewport.js.map +7 -0
  15. package/dist/cjs/SelectViewport.native.js +43 -0
  16. package/dist/cjs/SelectViewport.native.js.map +7 -0
  17. package/dist/cjs/constants.js +47 -0
  18. package/dist/cjs/constants.js.map +7 -0
  19. package/dist/cjs/context.js +38 -0
  20. package/dist/cjs/context.js.map +7 -0
  21. package/dist/cjs/index.js +19 -0
  22. package/dist/cjs/index.js.map +2 -2
  23. package/dist/cjs/types.js +17 -0
  24. package/dist/cjs/types.js.map +7 -0
  25. package/dist/esm/Select.js +33 -565
  26. package/dist/esm/Select.js.map +2 -2
  27. package/dist/esm/SelectContent.js +26 -0
  28. package/dist/esm/SelectContent.js.map +7 -0
  29. package/dist/esm/SelectContent.native.js +7 -0
  30. package/dist/esm/SelectContent.native.js.map +7 -0
  31. package/dist/esm/SelectImpl.js +378 -0
  32. package/dist/esm/SelectImpl.js.map +7 -0
  33. package/dist/esm/SelectScrollButton.js +100 -0
  34. package/dist/esm/SelectScrollButton.js.map +7 -0
  35. package/dist/esm/SelectScrollButton.native.js +7 -0
  36. package/dist/esm/SelectScrollButton.native.js.map +7 -0
  37. package/dist/esm/SelectViewport.js +68 -0
  38. package/dist/esm/SelectViewport.js.map +7 -0
  39. package/dist/esm/SelectViewport.native.js +16 -0
  40. package/dist/esm/SelectViewport.native.js.map +7 -0
  41. package/dist/esm/constants.js +17 -0
  42. package/dist/esm/constants.js.map +7 -0
  43. package/dist/esm/context.js +11 -0
  44. package/dist/esm/context.js.map +7 -0
  45. package/dist/esm/index.js +13 -0
  46. package/dist/esm/index.js.map +2 -2
  47. package/dist/esm/types.js +1 -0
  48. package/dist/esm/types.js.map +7 -0
  49. package/dist/jsx/Select.js +32 -515
  50. package/dist/jsx/Select.js.map +2 -2
  51. package/dist/jsx/SelectContent.js +19 -0
  52. package/dist/jsx/SelectContent.js.map +7 -0
  53. package/dist/jsx/SelectContent.native.js +7 -0
  54. package/dist/jsx/SelectContent.native.js.map +7 -0
  55. package/dist/jsx/SelectImpl.js +366 -0
  56. package/dist/jsx/SelectImpl.js.map +7 -0
  57. package/dist/jsx/SelectScrollButton.js +78 -0
  58. package/dist/jsx/SelectScrollButton.js.map +7 -0
  59. package/dist/jsx/SelectScrollButton.native.js +7 -0
  60. package/dist/jsx/SelectScrollButton.native.js.map +7 -0
  61. package/dist/jsx/SelectViewport.js +57 -0
  62. package/dist/jsx/SelectViewport.js.map +7 -0
  63. package/dist/jsx/SelectViewport.native.js +14 -0
  64. package/dist/jsx/SelectViewport.native.js.map +7 -0
  65. package/dist/jsx/constants.js +17 -0
  66. package/dist/jsx/constants.js.map +7 -0
  67. package/dist/jsx/context.js +11 -0
  68. package/dist/jsx/context.js.map +7 -0
  69. package/dist/jsx/index.js +13 -0
  70. package/dist/jsx/index.js.map +2 -2
  71. package/dist/jsx/types.js +1 -0
  72. package/dist/jsx/types.js.map +7 -0
  73. package/package.json +12 -12
  74. package/src/Select.tsx +57 -881
  75. package/src/SelectContent.native.tsx +5 -0
  76. package/src/SelectContent.tsx +34 -0
  77. package/src/SelectImpl.tsx +511 -0
  78. package/src/SelectScrollButton.native.tsx +7 -0
  79. package/src/SelectScrollButton.tsx +150 -0
  80. package/src/SelectViewport.native.tsx +17 -0
  81. package/src/SelectViewport.tsx +86 -0
  82. package/src/constants.tsx +7 -0
  83. package/src/context.tsx +9 -0
  84. package/src/index.tsx +7 -0
  85. package/src/types.tsx +83 -0
  86. package/types/Select.d.ts +140 -298
  87. package/types/Select.d.ts.map +1 -1
  88. package/types/SelectContent.d.ts +4 -0
  89. package/types/SelectContent.d.ts.map +1 -0
  90. package/types/SelectContent.native.d.ts +4 -0
  91. package/types/SelectContent.native.d.ts.map +1 -0
  92. package/types/SelectImpl.d.ts +9 -0
  93. package/types/SelectImpl.d.ts.map +1 -0
  94. package/types/SelectScrollButton.d.ts +6 -0
  95. package/types/SelectScrollButton.d.ts.map +1 -0
  96. package/types/SelectScrollButton.native.d.ts +4 -0
  97. package/types/SelectScrollButton.native.d.ts.map +1 -0
  98. package/types/SelectViewport.d.ts +127 -0
  99. package/types/SelectViewport.d.ts.map +1 -0
  100. package/types/SelectViewport.native.d.ts +54 -0
  101. package/types/SelectViewport.native.d.ts.map +1 -0
  102. package/types/constants.d.ts +8 -0
  103. package/types/constants.d.ts.map +1 -0
  104. package/types/context.d.ts +17 -0
  105. package/types/context.d.ts.map +1 -0
  106. package/types/index.d.ts +2 -0
  107. package/types/index.d.ts.map +1 -1
  108. package/types/types.d.ts +74 -0
  109. package/types/types.d.ts.map +1 -0
@@ -29,18 +29,16 @@ __export(Select_exports, {
29
29
  SelectSeparator: () => SelectSeparator,
30
30
  SelectSheetContents: () => SelectSheetContents,
31
31
  SelectTrigger: () => SelectTrigger,
32
- SelectViewport: () => SelectViewport,
33
- SelectViewportFrame: () => SelectViewportFrame,
34
- createSelectScope: () => createSelectScope
32
+ getVisualOffsetTop: () => getVisualOffsetTop,
33
+ isFirefox: () => isFirefox,
34
+ useSelectBreakpointActive: () => useSelectBreakpointActive,
35
+ useShowSelectSheet: () => useShowSelectSheet
35
36
  });
36
37
  module.exports = __toCommonJS(Select_exports);
37
- var import_react_dom_interactions = require("@floating-ui/react-dom-interactions");
38
- var import_react_use_previous = require("@radix-ui/react-use-previous");
39
38
  var import_compose_refs = require("@tamagui/compose-refs");
40
39
  var import_core = require("@tamagui/core");
41
40
  var import_core2 = require("@tamagui/core");
42
41
  var import_core3 = require("@tamagui/core");
43
- var import_create_context = require("@tamagui/create-context");
44
42
  var import_list_item = require("@tamagui/list-item");
45
43
  var import_portal = require("@tamagui/portal");
46
44
  var import_separator = require("@tamagui/separator");
@@ -50,22 +48,17 @@ var import_text = require("@tamagui/text");
50
48
  var import_use_controllable_state = require("@tamagui/use-controllable-state");
51
49
  var React = __toESM(require("react"));
52
50
  var ReactDOM = __toESM(require("react-dom"));
53
- const SELECT_NAME = "Select";
54
- const WINDOW_PADDING = 8;
55
- const SCROLL_ARROW_VELOCITY = 8;
56
- const SCROLL_ARROW_THRESHOLD = 8;
57
- const MIN_HEIGHT = 80;
58
- const FALLBACK_THRESHOLD = 16;
51
+ var import_constants = require("./constants");
52
+ var import_context = require("./context");
53
+ var import_SelectContent = require("./SelectContent");
54
+ var import_SelectImpl = require("./SelectImpl");
55
+ var import_SelectScrollButton = require("./SelectScrollButton");
56
+ var import_SelectViewport = require("./SelectViewport");
59
57
  const userAgent = typeof navigator !== "undefined" && navigator.userAgent || "";
60
58
  const isFirefox = userAgent.toLowerCase().includes("firefox");
61
- if (isFirefox) {
62
- document.body.classList.add("firefox");
63
- }
64
59
  function getVisualOffsetTop() {
65
60
  return !/^((?!chrome|android).)*safari/i.test(userAgent) ? (visualViewport == null ? void 0 : visualViewport.offsetTop) ?? 0 : 0;
66
61
  }
67
- const [createSelectContext, createSelectScope] = (0, import_create_context.createContextScope)(SELECT_NAME);
68
- const [SelectProvider, useSelectContext] = createSelectContext(SELECT_NAME);
69
62
  const TRIGGER_NAME = "SelectTrigger";
70
63
  const SelectTrigger = React.forwardRef((props, forwardedRef) => {
71
64
  const {
@@ -74,7 +67,7 @@ const SelectTrigger = React.forwardRef((props, forwardedRef) => {
74
67
  "aria-labelledby": ariaLabelledby,
75
68
  ...triggerProps
76
69
  } = props;
77
- const context = useSelectContext(TRIGGER_NAME, __scopeSelect);
70
+ const context = (0, import_context.useSelectContext)(TRIGGER_NAME, __scopeSelect);
78
71
  const labelledBy = ariaLabelledby;
79
72
  return /* @__PURE__ */ React.createElement(import_list_item.ListItem, {
80
73
  backgrounded: true,
@@ -107,14 +100,15 @@ const SelectValueFrame = (0, import_core2.styled)(import_text.Paragraph, {
107
100
  name: VALUE_NAME,
108
101
  selectable: false
109
102
  });
110
- const SelectValue = SelectValueFrame.extractable(React.forwardRef(({ __scopeSelect, children, placeholder }, forwardedRef) => {
111
- const context = useSelectContext(VALUE_NAME, __scopeSelect);
103
+ const SelectValue = SelectValueFrame.extractable(React.forwardRef(({ __scopeSelect, children: childrenProp, placeholder }, forwardedRef) => {
104
+ const context = (0, import_context.useSelectContext)(VALUE_NAME, __scopeSelect);
112
105
  const { onValueNodeHasChildrenChange } = context;
113
- const hasChildren = children !== void 0;
106
+ const hasChildren = childrenProp !== void 0;
114
107
  const composedRefs = (0, import_compose_refs.useComposedRefs)(forwardedRef, context.onValueNodeChange);
115
108
  React.useLayoutEffect(() => {
116
109
  onValueNodeHasChildrenChange(hasChildren);
117
110
  }, [onValueNodeHasChildrenChange, hasChildren]);
111
+ const children = childrenProp ?? context.selectedItem;
118
112
  return /* @__PURE__ */ React.createElement(SelectValueFrame, {
119
113
  size: context.size,
120
114
  ref: composedRefs,
@@ -127,80 +121,8 @@ const SelectIcon = (0, import_core2.styled)(import_stacks.XStack, {
127
121
  "aria-hidden": true,
128
122
  children: /* @__PURE__ */ React.createElement(import_text.Paragraph, null, "\u25BC")
129
123
  });
130
- const CONTENT_NAME = "SelectContent";
131
- const SelectContent = ({ children, __scopeSelect }) => {
132
- const context = useSelectContext(CONTENT_NAME, __scopeSelect);
133
- const themeName = (0, import_core2.useThemeName)();
134
- const showSheet = useShowSelectSheet(context);
135
- const contents = /* @__PURE__ */ React.createElement(import_core2.Theme, {
136
- name: themeName
137
- }, children);
138
- if (showSheet && context.open) {
139
- return contents;
140
- }
141
- return /* @__PURE__ */ React.createElement(import_react_dom_interactions.FloatingPortal, null, context.open ? /* @__PURE__ */ React.createElement(import_react_dom_interactions.FloatingOverlay, {
142
- lockScroll: true
143
- }, contents) : /* @__PURE__ */ React.createElement("div", {
144
- style: { display: "none" }
145
- }, contents));
146
- };
147
- const VIEWPORT_NAME = "SelectViewport";
148
- const SelectViewportFrame = (0, import_core2.styled)(import_stacks.ThemeableStack, {
149
- name: VIEWPORT_NAME,
150
- backgroundColor: "$background",
151
- elevate: true,
152
- bordered: true,
153
- overflow: "scroll",
154
- userSelect: "none",
155
- variants: {
156
- size: {
157
- "...size": (val, { tokens }) => {
158
- return {
159
- borderRadius: tokens.radius[val] ?? val
160
- };
161
- }
162
- }
163
- },
164
- defaultVariants: {
165
- size: "$2"
166
- }
167
- });
168
- const SelectViewport = React.forwardRef((props, forwardedRef) => {
169
- var _a;
170
- const { __scopeSelect, children, ...viewportProps } = props;
171
- const context = useSelectContext(VIEWPORT_NAME, __scopeSelect);
172
- const { style, ...floatingProps } = ((_a = context.interactions) == null ? void 0 : _a.getFloatingProps()) ?? {};
173
- const breakpointActive = useSelectBreakpointActive(context.sheetBreakpoint);
174
- if (breakpointActive || !import_core.isWeb) {
175
- return /* @__PURE__ */ React.createElement(import_portal.PortalItem, {
176
- hostName: `${context.scopeKey}SheetContents`
177
- }, children);
178
- }
179
- if (!context.floatingContext) {
180
- return null;
181
- }
182
- delete style["scrollbarWidth"];
183
- delete style["listStyleType"];
184
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("style", {
185
- dangerouslySetInnerHTML: {
186
- __html: `[data-tamagui-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-tamagui-select-viewport]::-webkit-scrollbar{display:none}`
187
- }
188
- }), /* @__PURE__ */ React.createElement(import_react_dom_interactions.FloatingFocusManager, {
189
- context: context.floatingContext,
190
- preventTabbing: true
191
- }, /* @__PURE__ */ React.createElement(SelectViewportFrame, {
192
- size: context.size,
193
- "data-tamagui-select-viewport": "",
194
- role: "presentation",
195
- ...viewportProps,
196
- ref: forwardedRef,
197
- ...floatingProps,
198
- ...style
199
- }, children)));
200
- });
201
- SelectViewport.displayName = VIEWPORT_NAME;
202
124
  const ITEM_NAME = "SelectItem";
203
- const [SelectItemContextProvider, useSelectItemContext] = createSelectContext(ITEM_NAME);
125
+ const [SelectItemContextProvider, useSelectItemContext] = (0, import_context.createSelectContext)(ITEM_NAME);
204
126
  const SelectItem = React.forwardRef((props, forwardedRef) => {
205
127
  const {
206
128
  __scopeSelect,
@@ -210,7 +132,7 @@ const SelectItem = React.forwardRef((props, forwardedRef) => {
210
132
  index,
211
133
  ...itemProps
212
134
  } = props;
213
- const context = useSelectContext(ITEM_NAME, __scopeSelect);
135
+ const context = (0, import_context.useSelectContext)(ITEM_NAME, __scopeSelect);
214
136
  const isSelected = context.value === value;
215
137
  const [textValue, setTextValue] = React.useState(textValueProp ?? "");
216
138
  const [isFocused, setIsFocused] = React.useState(false);
@@ -228,6 +150,8 @@ const SelectItem = React.forwardRef((props, forwardedRef) => {
228
150
  dataRef
229
151
  } = context;
230
152
  const composedRefs = (0, import_compose_refs.useComposedRefs)(forwardedRef, (node) => {
153
+ if (!import_core.isWeb)
154
+ return;
231
155
  if (node instanceof HTMLElement) {
232
156
  if (listRef) {
233
157
  listRef.current[index] = node;
@@ -304,17 +228,26 @@ const SelectItemTextFrame = (0, import_core2.styled)(import_text.Paragraph, {
304
228
  });
305
229
  const SelectItemText = React.forwardRef((props, forwardedRef) => {
306
230
  const { __scopeSelect, className, ...itemTextProps } = props;
307
- const context = useSelectContext(ITEM_TEXT_NAME, __scopeSelect);
231
+ const context = (0, import_context.useSelectContext)(ITEM_TEXT_NAME, __scopeSelect);
308
232
  const itemContext = useSelectItemContext(ITEM_TEXT_NAME, __scopeSelect);
309
233
  const ref = React.useRef(null);
310
234
  const composedRefs = (0, import_compose_refs.useComposedRefs)(forwardedRef, ref, itemContext.onItemTextChange);
311
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(SelectItemTextFrame, {
235
+ const isSelected = itemContext.isSelected && context.valueNode && !context.valueNodeHasChildren;
236
+ const contents = /* @__PURE__ */ React.createElement(SelectItemTextFrame, {
312
237
  className,
313
238
  size: context.size,
314
239
  id: itemContext.textId,
315
240
  ...itemTextProps,
316
241
  ref: composedRefs
317
- }), itemContext.isSelected && context.valueNode && !context.valueNodeHasChildren ? ReactDOM.createPortal(itemTextProps.children, context.valueNode) : null);
242
+ });
243
+ if (!import_core.isWeb) {
244
+ React.useEffect(() => {
245
+ if (isSelected) {
246
+ context.setSelectedItem(contents);
247
+ }
248
+ }, [isSelected]);
249
+ }
250
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, contents, import_core.isWeb && isSelected ? ReactDOM.createPortal(itemTextProps.children, context.valueNode) : null);
318
251
  });
319
252
  SelectItemText.displayName = ITEM_TEXT_NAME;
320
253
  const ITEM_INDICATOR_NAME = "SelectItemIndicator";
@@ -332,7 +265,7 @@ const SelectItemIndicator = React.forwardRef((props, forwardedRef) => {
332
265
  });
333
266
  SelectItemIndicator.displayName = ITEM_INDICATOR_NAME;
334
267
  const GROUP_NAME = "SelectGroup";
335
- const [SelectGroupContextProvider, useSelectGroupContext] = createSelectContext(GROUP_NAME);
268
+ const [SelectGroupContextProvider, useSelectGroupContext] = (0, import_context.createSelectContext)(GROUP_NAME);
336
269
  const SelectGroupFrame = (0, import_core2.styled)(import_stacks.YStack, {
337
270
  name: GROUP_NAME,
338
271
  width: "100%"
@@ -354,7 +287,7 @@ SelectGroup.displayName = GROUP_NAME;
354
287
  const LABEL_NAME = "SelectLabel";
355
288
  const SelectLabel = React.forwardRef((props, forwardedRef) => {
356
289
  const { __scopeSelect, ...labelProps } = props;
357
- const context = useSelectContext(LABEL_NAME, __scopeSelect);
290
+ const context = (0, import_context.useSelectContext)(LABEL_NAME, __scopeSelect);
358
291
  const groupContext = useSelectGroupContext(LABEL_NAME, __scopeSelect);
359
292
  return /* @__PURE__ */ React.createElement(import_list_item.ListItem, {
360
293
  componentName: LABEL_NAME,
@@ -366,95 +299,6 @@ const SelectLabel = React.forwardRef((props, forwardedRef) => {
366
299
  });
367
300
  });
368
301
  SelectLabel.displayName = LABEL_NAME;
369
- const SCROLL_UP_BUTTON_NAME = "SelectScrollUpButton";
370
- const SelectScrollUpButton = React.forwardRef((props, forwardedRef) => {
371
- return /* @__PURE__ */ React.createElement(SelectScrollButtonImpl, {
372
- componentName: SCROLL_UP_BUTTON_NAME,
373
- ...props,
374
- dir: "up",
375
- ref: forwardedRef
376
- });
377
- });
378
- SelectScrollUpButton.displayName = SCROLL_UP_BUTTON_NAME;
379
- const SCROLL_DOWN_BUTTON_NAME = "SelectScrollDownButton";
380
- const SelectScrollDownButton = React.forwardRef((props, forwardedRef) => {
381
- return /* @__PURE__ */ React.createElement(SelectScrollButtonImpl, {
382
- componentName: SCROLL_DOWN_BUTTON_NAME,
383
- ...props,
384
- dir: "down",
385
- ref: forwardedRef
386
- });
387
- });
388
- SelectScrollDownButton.displayName = SCROLL_DOWN_BUTTON_NAME;
389
- const SelectScrollButtonImpl = React.memo(React.forwardRef((props, forwardedRef) => {
390
- var _a;
391
- const { __scopeSelect, dir, componentName, ...scrollIndicatorProps } = props;
392
- const { floatingRef, increaseHeight, forceUpdate, ...context } = useSelectContext(componentName, __scopeSelect);
393
- const intervalRef = React.useRef();
394
- const loopingRef = React.useRef(false);
395
- const isVisible = context[dir === "down" ? "canScrollDown" : "canScrollUp"];
396
- const { x, y, reference, floating, strategy, update, refs } = (0, import_react_dom_interactions.useFloating)({
397
- strategy: "fixed",
398
- placement: dir === "up" ? "top" : "bottom",
399
- middleware: [(0, import_react_dom_interactions.offset)(({ rects }) => -rects.floating.height)]
400
- });
401
- const composedRefs = (0, import_compose_refs.useComposedRefs)(forwardedRef, floating);
402
- React.useLayoutEffect(() => {
403
- if (!floatingRef)
404
- return;
405
- reference(floatingRef.current);
406
- }, [reference, floatingRef == null ? void 0 : floatingRef.current]);
407
- React.useEffect(() => {
408
- if (!refs.reference.current || !refs.floating.current || !isVisible) {
409
- return;
410
- }
411
- const cleanup = (0, import_react_dom_interactions.autoUpdate)(refs.reference.current, refs.floating.current, update, {
412
- animationFrame: true
413
- });
414
- return () => {
415
- clearInterval(intervalRef.current);
416
- loopingRef.current = false;
417
- cleanup();
418
- };
419
- }, [isVisible, update, refs.floating, refs.reference]);
420
- if (!isVisible) {
421
- return null;
422
- }
423
- const handleScrollArrowChange = () => {
424
- if (!floatingRef)
425
- return;
426
- const floating2 = floatingRef.current;
427
- const isUp = dir === "up";
428
- if (floating2) {
429
- const value = isUp ? -SCROLL_ARROW_VELOCITY : SCROLL_ARROW_VELOCITY;
430
- const multi = isUp && floating2.scrollTop <= SCROLL_ARROW_THRESHOLD * 2 || !isUp && floating2.scrollTop >= floating2.scrollHeight - floating2.clientHeight - SCROLL_ARROW_THRESHOLD * 2 ? 2 : 1;
431
- floating2.scrollTop += multi * (isUp ? -SCROLL_ARROW_VELOCITY : SCROLL_ARROW_VELOCITY);
432
- increaseHeight == null ? void 0 : increaseHeight(floating2, multi === 2 ? value * 2 : value);
433
- forceUpdate();
434
- }
435
- };
436
- return /* @__PURE__ */ React.createElement(import_stacks.YStack, {
437
- ref: composedRefs,
438
- componentName,
439
- "aria-hidden": true,
440
- ...scrollIndicatorProps,
441
- zIndex: 1e3,
442
- position: strategy,
443
- left: x || 0,
444
- top: y || 0,
445
- width: `calc(${(((_a = floatingRef == null ? void 0 : floatingRef.current) == null ? void 0 : _a.offsetWidth) ?? 0) - 2}px)`,
446
- onPointerMove: () => {
447
- if (!loopingRef.current) {
448
- intervalRef.current = setInterval(handleScrollArrowChange, 1e3 / 60);
449
- loopingRef.current = true;
450
- }
451
- },
452
- onPointerLeave: () => {
453
- loopingRef.current = false;
454
- clearInterval(intervalRef.current);
455
- }
456
- });
457
- }));
458
302
  const SelectSeparator = (0, import_core2.styled)(import_separator.Separator, {
459
303
  name: "SelectSeparator"
460
304
  });
@@ -467,7 +311,7 @@ const useShowSelectSheet = (context) => {
467
311
  return context.open === false ? false : breakpointActive;
468
312
  };
469
313
  const SelectSheetController = (props) => {
470
- const context = useSelectContext("SelectSheetController", props.__scopeSelect);
314
+ const context = (0, import_context.useSelectContext)("SelectSheetController", props.__scopeSelect);
471
315
  const showSheet = useShowSelectSheet(context);
472
316
  const breakpointActive = useSelectBreakpointActive(context.sheetBreakpoint);
473
317
  const getShowSheet = (0, import_core2.useGet)(showSheet);
@@ -483,368 +327,12 @@ const SelectSheetController = (props) => {
483
327
  };
484
328
  const SHEET_CONTENTS_NAME = "SelectSheetContents";
485
329
  const SelectSheetContents = ({ __scopeSelect }) => {
486
- const context = useSelectContext(SHEET_CONTENTS_NAME, __scopeSelect);
330
+ const context = (0, import_context.useSelectContext)(SHEET_CONTENTS_NAME, __scopeSelect);
487
331
  return /* @__PURE__ */ React.createElement(import_portal.PortalHost, {
488
332
  name: `${context.scopeKey}SheetContents`
489
333
  });
490
334
  };
491
335
  SelectSheetContents.displayName = SHEET_CONTENTS_NAME;
492
- const SelectInlineImpl = (props) => {
493
- const {
494
- __scopeSelect,
495
- children,
496
- open = false,
497
- activeIndexRef,
498
- selectedIndexRef,
499
- listContentRef
500
- } = props;
501
- const selectContext = useSelectContext("SelectSheetImpl", __scopeSelect);
502
- const { setActiveIndex, setOpen, setSelectedIndex, selectedIndex, activeIndex, forceUpdate } = selectContext;
503
- const [showArrows, setShowArrows] = React.useState(false);
504
- const [scrollTop, setScrollTop] = React.useState(0);
505
- const prevActiveIndex = (0, import_react_use_previous.usePrevious)(activeIndex);
506
- const listItemsRef = React.useRef([]);
507
- const [controlledScrolling, setControlledScrolling] = React.useState(false);
508
- const [middlewareType, setMiddlewareType] = React.useState("align");
509
- React.useEffect(() => {
510
- const frame = requestAnimationFrame(() => {
511
- setShowArrows(open);
512
- if (!open) {
513
- setScrollTop(0);
514
- setMiddlewareType("align");
515
- setActiveIndex(null);
516
- setControlledScrolling(false);
517
- }
518
- });
519
- return () => {
520
- cancelAnimationFrame(frame);
521
- };
522
- }, [open, setActiveIndex]);
523
- function getFloatingPadding(floating2) {
524
- var _a;
525
- if (!floating2) {
526
- return 0;
527
- }
528
- return Number((_a = getComputedStyle(floating2).paddingLeft) == null ? void 0 : _a.replace("px", ""));
529
- }
530
- const { x, y, reference, floating, strategy, context, refs, middlewareData, update } = (0, import_react_dom_interactions.useFloating)({
531
- open,
532
- onOpenChange: setOpen,
533
- placement: "bottom",
534
- middleware: middlewareType === "align" ? [
535
- (0, import_react_dom_interactions.offset)(({ rects }) => {
536
- const index = activeIndexRef.current ?? selectedIndexRef.current;
537
- if (index == null) {
538
- return 0;
539
- }
540
- const item = listItemsRef.current[index];
541
- if (item == null) {
542
- return 0;
543
- }
544
- const offsetTop = item.offsetTop;
545
- const itemHeight = item.offsetHeight;
546
- const height = rects.reference.height;
547
- return -offsetTop - height - (itemHeight - height) / 2;
548
- }),
549
- {
550
- name: "size",
551
- async fn(args) {
552
- var _a;
553
- const {
554
- elements: { floating: floating2 },
555
- rects: { reference: reference2 },
556
- middlewareData: middlewareData2
557
- } = args;
558
- const overflow = await (0, import_react_dom_interactions.detectOverflow)(args, {
559
- padding: WINDOW_PADDING
560
- });
561
- const top = Math.max(0, overflow.top);
562
- const bottom = Math.max(0, overflow.bottom);
563
- const nextY = args.y + top;
564
- if ((_a = middlewareData2.size) == null ? void 0 : _a.skip) {
565
- return {
566
- y: nextY,
567
- data: {
568
- y: middlewareData2.size.y
569
- }
570
- };
571
- }
572
- Object.assign(floating2.style, {
573
- maxHeight: `${floating2.scrollHeight - Math.abs(top + bottom)}px`,
574
- minWidth: `${reference2.width + getFloatingPadding(floating2) * 2}px`
575
- });
576
- return {
577
- y: nextY,
578
- data: {
579
- y: top,
580
- skip: true
581
- },
582
- reset: {
583
- rects: true
584
- }
585
- };
586
- }
587
- }
588
- ] : [
589
- (0, import_react_dom_interactions.offset)(5),
590
- (0, import_react_dom_interactions.flip)(),
591
- (0, import_react_dom_interactions.size)({
592
- apply({ rects, availableHeight, elements }) {
593
- Object.assign(elements.floating.style, {
594
- width: `${rects.reference.width}px`,
595
- maxHeight: `${availableHeight}px`
596
- });
597
- },
598
- padding: WINDOW_PADDING
599
- })
600
- ]
601
- });
602
- const floatingRef = refs.floating;
603
- const showUpArrow = showArrows && scrollTop > SCROLL_ARROW_THRESHOLD;
604
- const showDownArrow = showArrows && floatingRef.current && scrollTop < floatingRef.current.scrollHeight - floatingRef.current.clientHeight - SCROLL_ARROW_THRESHOLD;
605
- const interactions = (0, import_react_dom_interactions.useInteractions)([
606
- (0, import_react_dom_interactions.useClick)(context, { pointerDown: true }),
607
- (0, import_react_dom_interactions.useRole)(context, { role: "listbox" }),
608
- (0, import_react_dom_interactions.useDismiss)(context),
609
- (0, import_react_dom_interactions.useListNavigation)(context, {
610
- listRef: listItemsRef,
611
- activeIndex,
612
- selectedIndex,
613
- onNavigate: setActiveIndex
614
- }),
615
- (0, import_react_dom_interactions.useTypeahead)(context, {
616
- listRef: listContentRef,
617
- onMatch: open ? setActiveIndex : setSelectedIndex,
618
- selectedIndex,
619
- activeIndex
620
- })
621
- ]);
622
- const increaseHeight = React.useCallback((floating2, amount = 0) => {
623
- if (middlewareType === "fallback") {
624
- return;
625
- }
626
- const currentMaxHeight = Number(floating2.style.maxHeight.replace("px", ""));
627
- const currentTop = Number(floating2.style.top.replace("px", ""));
628
- const rect = floating2.getBoundingClientRect();
629
- const rectTop = rect.top;
630
- const rectBottom = rect.bottom;
631
- const viewportHeight = (visualViewport == null ? void 0 : visualViewport.height) ?? 0;
632
- const visualMaxHeight = viewportHeight - WINDOW_PADDING * 2;
633
- if (amount < 0 && selectedIndexRef.current != null && Math.round(rectBottom) < Math.round(viewportHeight + getVisualOffsetTop() - WINDOW_PADDING)) {
634
- floating2.style.maxHeight = `${Math.min(visualMaxHeight, currentMaxHeight - amount)}px`;
635
- }
636
- if (amount > 0 && Math.round(rectTop) > Math.round(WINDOW_PADDING - getVisualOffsetTop()) && floating2.scrollHeight > floating2.offsetHeight) {
637
- const nextTop = Math.max(WINDOW_PADDING + getVisualOffsetTop(), currentTop - amount);
638
- const nextMaxHeight = Math.min(visualMaxHeight, currentMaxHeight + amount);
639
- Object.assign(floating2.style, {
640
- maxHeight: `${nextMaxHeight}px`,
641
- top: `${nextTop}px`
642
- });
643
- if (nextTop - WINDOW_PADDING > getVisualOffsetTop()) {
644
- floating2.scrollTop -= nextMaxHeight - currentMaxHeight + getFloatingPadding(floating2);
645
- }
646
- return currentTop - nextTop;
647
- }
648
- }, [middlewareType, selectedIndexRef]);
649
- const touchPageYRef = React.useRef(null);
650
- const handleWheel = React.useCallback((event) => {
651
- var _a;
652
- const pinching = event.ctrlKey;
653
- const currentTarget = event.currentTarget;
654
- function isWheelEvent(event2) {
655
- return typeof event2.deltaY === "number";
656
- }
657
- function isTouchEvent(event2) {
658
- return event2.touches != null;
659
- }
660
- if (Math.abs(((currentTarget == null ? void 0 : currentTarget.offsetHeight) ?? 0) - (((visualViewport == null ? void 0 : visualViewport.height) ?? 0) - WINDOW_PADDING * 2)) > 1 && !pinching) {
661
- event.preventDefault();
662
- } else if (isWheelEvent(event) && isFirefox) {
663
- currentTarget.scrollTop += event.deltaY;
664
- }
665
- if (!pinching) {
666
- let delta = 5;
667
- if (isTouchEvent(event)) {
668
- const currentPageY = touchPageYRef.current;
669
- const pageY = (_a = event.touches[0]) == null ? void 0 : _a.pageY;
670
- if (pageY != null) {
671
- touchPageYRef.current = pageY;
672
- if (currentPageY != null) {
673
- delta = currentPageY - pageY;
674
- }
675
- }
676
- }
677
- increaseHeight(currentTarget, isWheelEvent(event) ? event.deltaY : delta);
678
- setScrollTop(currentTarget.scrollTop);
679
- forceUpdate();
680
- }
681
- }, [forceUpdate, increaseHeight]);
682
- React.useEffect(() => {
683
- function onTouchEnd() {
684
- touchPageYRef.current = null;
685
- }
686
- const floating2 = floatingRef.current;
687
- if (open && floating2 && middlewareType === "align") {
688
- floating2.addEventListener("wheel", handleWheel);
689
- floating2.addEventListener("touchmove", handleWheel);
690
- floating2.addEventListener("touchend", onTouchEnd, { passive: true });
691
- return () => {
692
- floating2.removeEventListener("wheel", handleWheel);
693
- floating2.removeEventListener("touchmove", handleWheel);
694
- floating2.removeEventListener("touchend", onTouchEnd);
695
- };
696
- }
697
- }, [open, floatingRef, handleWheel, middlewareType]);
698
- React.useEffect(() => {
699
- window.addEventListener("resize", update);
700
- return () => {
701
- window.removeEventListener("resize", update);
702
- };
703
- }, [update]);
704
- React.useLayoutEffect(() => {
705
- var _a;
706
- const floating2 = floatingRef.current;
707
- if (open && controlledScrolling && floating2) {
708
- const item = activeIndex != null ? listItemsRef.current[activeIndex] : selectedIndex != null ? listItemsRef.current[selectedIndex] : null;
709
- if (item && prevActiveIndex != null) {
710
- const itemHeight = ((_a = listItemsRef.current[prevActiveIndex]) == null ? void 0 : _a.offsetHeight) ?? 0;
711
- const floatingHeight = floating2.offsetHeight;
712
- const top = item.offsetTop;
713
- const bottom = top + itemHeight;
714
- if (top < floating2.scrollTop + 20) {
715
- const diff = floating2.scrollTop - top + 20;
716
- floating2.scrollTop -= diff;
717
- if (activeIndex != selectedIndex && activeIndex != null) {
718
- increaseHeight(floating2, -diff);
719
- }
720
- } else if (bottom > floatingHeight + floating2.scrollTop - 20) {
721
- const diff = bottom - floatingHeight - floating2.scrollTop + 20;
722
- floating2.scrollTop += diff;
723
- if (activeIndex != selectedIndex && activeIndex != null) {
724
- floating2.scrollTop -= increaseHeight(floating2, diff) ?? 0;
725
- }
726
- }
727
- }
728
- }
729
- }, [
730
- open,
731
- controlledScrolling,
732
- prevActiveIndex,
733
- activeIndex,
734
- selectedIndex,
735
- floatingRef,
736
- increaseHeight
737
- ]);
738
- React.useLayoutEffect(() => {
739
- var _a;
740
- const floating2 = refs.floating.current;
741
- const reference2 = refs.reference.current;
742
- if (open && floating2 && reference2 && floating2.offsetHeight < floating2.scrollHeight) {
743
- const referenceRect = reference2.getBoundingClientRect();
744
- if (middlewareType === "fallback") {
745
- const item = listItemsRef.current[selectedIndex];
746
- if (item) {
747
- floating2.scrollTop = item.offsetTop - floating2.clientHeight + referenceRect.height;
748
- }
749
- return;
750
- }
751
- floating2.scrollTop = (_a = middlewareData.size) == null ? void 0 : _a.y;
752
- const closeToBottom = ((visualViewport == null ? void 0 : visualViewport.height) ?? 0) + getVisualOffsetTop() - referenceRect.bottom < FALLBACK_THRESHOLD;
753
- const closeToTop = referenceRect.top < FALLBACK_THRESHOLD;
754
- if (floating2.offsetHeight < MIN_HEIGHT || closeToTop || closeToBottom) {
755
- setMiddlewareType("fallback");
756
- }
757
- }
758
- }, [
759
- open,
760
- increaseHeight,
761
- selectedIndex,
762
- middlewareType,
763
- refs.floating,
764
- refs.reference,
765
- middlewareData
766
- ]);
767
- React.useLayoutEffect(() => {
768
- if (open && selectedIndex != null) {
769
- requestAnimationFrame(() => {
770
- var _a;
771
- (_a = listItemsRef.current[selectedIndex]) == null ? void 0 : _a.focus({ preventScroll: true });
772
- });
773
- }
774
- }, [listItemsRef, selectedIndex, open]);
775
- React.useEffect(() => {
776
- const frame = requestAnimationFrame(() => {
777
- setShowArrows(open);
778
- if (!open) {
779
- setScrollTop(0);
780
- setMiddlewareType("align");
781
- setActiveIndex(null);
782
- setControlledScrolling(false);
783
- }
784
- });
785
- return () => cancelAnimationFrame(frame);
786
- }, [open]);
787
- return /* @__PURE__ */ React.createElement(SelectProvider, {
788
- scope: __scopeSelect,
789
- ...selectContext,
790
- increaseHeight,
791
- floatingRef,
792
- setValueAtIndex: (index, value) => {
793
- listContentRef.current[index] = value;
794
- },
795
- interactions: {
796
- ...interactions,
797
- getReferenceProps() {
798
- return interactions.getReferenceProps({
799
- ref: reference,
800
- className: "SelectTrigger",
801
- onKeyDown(event) {
802
- if (event.key === "Enter" || event.key === " " && !context.dataRef.current.typing) {
803
- event.preventDefault();
804
- setOpen(true);
805
- }
806
- }
807
- });
808
- },
809
- getFloatingProps(props2) {
810
- return interactions.getFloatingProps({
811
- ref: floating,
812
- className: "Select",
813
- ...props2,
814
- style: {
815
- position: strategy,
816
- top: y ?? "",
817
- left: x ?? "",
818
- outline: 0,
819
- listStyleType: "none",
820
- scrollbarWidth: "none",
821
- userSelect: "none",
822
- ...props2 == null ? void 0 : props2.style
823
- },
824
- onPointerEnter() {
825
- setControlledScrolling(false);
826
- },
827
- onPointerMove() {
828
- setControlledScrolling(false);
829
- },
830
- onKeyDown() {
831
- setControlledScrolling(true);
832
- },
833
- onScroll(event) {
834
- setScrollTop(event.currentTarget.scrollTop);
835
- }
836
- });
837
- }
838
- },
839
- floatingContext: context,
840
- activeIndex,
841
- canScrollDown: !!showDownArrow,
842
- canScrollUp: !!showUpArrow,
843
- controlledScrolling: true,
844
- dataRef: context.dataRef,
845
- listRef: listItemsRef
846
- }, children);
847
- };
848
336
  const SelectSheetImpl = (props) => {
849
337
  return /* @__PURE__ */ React.createElement(React.Fragment, null, props.children);
850
338
  };
@@ -858,13 +346,14 @@ const Select = (0, import_core2.withStaticProperties)((props) => {
858
346
  value: valueProp,
859
347
  defaultValue,
860
348
  onValueChange,
861
- size: sizeProp,
349
+ size: sizeProp = "$4",
862
350
  sheetBreakpoint = false,
863
351
  dir
864
352
  } = props;
865
353
  const isSheet = useSelectBreakpointActive(sheetBreakpoint);
866
- const SelectImpl = isSheet ? SelectSheetImpl : SelectInlineImpl;
354
+ const SelectImpl = isSheet ? SelectSheetImpl : import_SelectImpl.SelectInlineImpl;
867
355
  const forceUpdate = React.useReducer(() => ({}), {})[1];
356
+ const [selectedItem, setSelectedItem] = React.useState(null);
868
357
  const [open, setOpen] = (0, import_use_controllable_state.useControllableState)({
869
358
  prop: openProp,
870
359
  defaultProp: defaultOpen || false,
@@ -886,9 +375,11 @@ const Select = (0, import_core2.withStaticProperties)((props) => {
886
375
  selectedIndexRef.current = selectedIndex;
887
376
  activeIndexRef.current = activeIndex;
888
377
  });
889
- return /* @__PURE__ */ React.createElement(SelectProvider, {
378
+ return /* @__PURE__ */ React.createElement(import_context.SelectProvider, {
890
379
  dir,
891
380
  size: sizeProp,
381
+ selectedItem,
382
+ setSelectedItem,
892
383
  forceUpdate,
893
384
  valueNode,
894
385
  onValueNodeChange: setValueNode,
@@ -920,22 +411,22 @@ const Select = (0, import_core2.withStaticProperties)((props) => {
920
411
  value
921
412
  }, children)));
922
413
  }, {
923
- Content: SelectContent,
414
+ Content: import_SelectContent.SelectContent,
924
415
  Group: SelectGroup,
925
416
  Icon: SelectIcon,
926
417
  Item: SelectItem,
927
418
  ItemIndicator: SelectItemIndicator,
928
419
  ItemText: SelectItemText,
929
420
  Label: SelectLabel,
930
- ScrollDownButton: SelectScrollDownButton,
931
- ScrollUpButton: SelectScrollUpButton,
421
+ ScrollDownButton: import_SelectScrollButton.SelectScrollDownButton,
422
+ ScrollUpButton: import_SelectScrollButton.SelectScrollUpButton,
932
423
  Trigger: SelectTrigger,
933
424
  Value: SelectValue,
934
- Viewport: SelectViewport,
425
+ Viewport: import_SelectViewport.SelectViewport,
935
426
  SheetContents: SelectSheetContents,
936
427
  Sheet: import_sheet.Sheet
937
428
  });
938
- Select.displayName = SELECT_NAME;
429
+ Select.displayName = import_constants.SELECT_NAME;
939
430
  // Annotate the CommonJS export names for ESM import in node:
940
431
  0 && (module.exports = {
941
432
  Select,
@@ -946,8 +437,9 @@ Select.displayName = SELECT_NAME;
946
437
  SelectSeparator,
947
438
  SelectSheetContents,
948
439
  SelectTrigger,
949
- SelectViewport,
950
- SelectViewportFrame,
951
- createSelectScope
440
+ getVisualOffsetTop,
441
+ isFirefox,
442
+ useSelectBreakpointActive,
443
+ useShowSelectSheet
952
444
  });
953
445
  //# sourceMappingURL=Select.js.map