@tamagui/select 1.39.9 → 1.41.0

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 (77) hide show
  1. package/dist/cjs/Select.js +10 -193
  2. package/dist/cjs/Select.js.map +2 -2
  3. package/dist/cjs/SelectContent.js +8 -2
  4. package/dist/cjs/SelectContent.js.map +1 -1
  5. package/dist/cjs/SelectImpl.js +2 -2
  6. package/dist/cjs/SelectImpl.js.map +1 -1
  7. package/dist/cjs/SelectItem.js +181 -0
  8. package/dist/cjs/SelectItem.js.map +6 -0
  9. package/dist/cjs/SelectTrigger.js +98 -0
  10. package/dist/cjs/SelectTrigger.js.map +6 -0
  11. package/dist/cjs/SelectViewport.js +23 -31
  12. package/dist/cjs/SelectViewport.js.map +2 -2
  13. package/dist/cjs/useSelectItemContext.js +180 -0
  14. package/dist/cjs/useSelectItemContext.js.map +6 -0
  15. package/dist/esm/Select.js +5 -187
  16. package/dist/esm/Select.js.map +2 -2
  17. package/dist/esm/SelectContent.js +8 -2
  18. package/dist/esm/SelectContent.js.map +1 -1
  19. package/dist/esm/SelectImpl.js +2 -2
  20. package/dist/esm/SelectImpl.js.map +1 -1
  21. package/dist/esm/SelectItem.js +149 -0
  22. package/dist/esm/SelectItem.js.map +6 -0
  23. package/dist/esm/SelectTrigger.js +64 -0
  24. package/dist/esm/SelectTrigger.js.map +6 -0
  25. package/dist/esm/SelectViewport.js +23 -21
  26. package/dist/esm/SelectViewport.js.map +2 -2
  27. package/dist/esm/useSelectItemContext.js +146 -0
  28. package/dist/esm/useSelectItemContext.js.map +6 -0
  29. package/dist/jsx/Select.js +5 -186
  30. package/dist/jsx/Select.js.map +2 -2
  31. package/dist/jsx/Select.mjs +5 -186
  32. package/dist/jsx/Select.mjs.map +2 -2
  33. package/dist/jsx/SelectContent.js +4 -2
  34. package/dist/jsx/SelectContent.js.map +1 -1
  35. package/dist/jsx/SelectContent.mjs +4 -2
  36. package/dist/jsx/SelectContent.mjs.map +1 -1
  37. package/dist/jsx/SelectImpl.js +2 -2
  38. package/dist/jsx/SelectImpl.js.map +1 -1
  39. package/dist/jsx/SelectImpl.mjs +2 -2
  40. package/dist/jsx/SelectImpl.mjs.map +1 -1
  41. package/dist/jsx/SelectItem.js +140 -0
  42. package/dist/jsx/SelectItem.js.map +6 -0
  43. package/dist/jsx/SelectItem.mjs +140 -0
  44. package/dist/jsx/SelectItem.mjs.map +6 -0
  45. package/dist/jsx/SelectTrigger.js +58 -0
  46. package/dist/jsx/SelectTrigger.js.map +6 -0
  47. package/dist/jsx/SelectTrigger.mjs +58 -0
  48. package/dist/jsx/SelectTrigger.mjs.map +6 -0
  49. package/dist/jsx/SelectViewport.js +25 -20
  50. package/dist/jsx/SelectViewport.js.map +2 -2
  51. package/dist/jsx/SelectViewport.mjs +25 -20
  52. package/dist/jsx/SelectViewport.mjs.map +2 -2
  53. package/dist/jsx/useSelectItemContext.js +137 -0
  54. package/dist/jsx/useSelectItemContext.js.map +6 -0
  55. package/dist/jsx/useSelectItemContext.mjs +137 -0
  56. package/dist/jsx/useSelectItemContext.mjs.map +6 -0
  57. package/package.json +19 -18
  58. package/src/Select.tsx +6 -245
  59. package/src/SelectContent.tsx +10 -10
  60. package/src/SelectImpl.tsx +2 -2
  61. package/src/SelectItem.tsx +188 -0
  62. package/src/SelectTrigger.tsx +74 -0
  63. package/src/SelectViewport.tsx +40 -32
  64. package/src/types.tsx +1 -0
  65. package/types/Select.d.ts +169 -100
  66. package/types/Select.d.ts.map +1 -1
  67. package/types/SelectContent.d.ts.map +1 -1
  68. package/types/SelectItem.d.ts +27 -0
  69. package/types/SelectItem.d.ts.map +1 -0
  70. package/types/SelectTrigger.d.ts +87 -0
  71. package/types/SelectTrigger.d.ts.map +1 -0
  72. package/types/SelectViewport.d.ts +168 -5
  73. package/types/SelectViewport.d.ts.map +1 -1
  74. package/types/types.d.ts +1 -0
  75. package/types/types.d.ts.map +1 -1
  76. package/types/useSelectItemContext.d.ts +145 -0
  77. package/types/useSelectItemContext.d.ts.map +1 -0
@@ -1,4 +1,5 @@
1
1
  import { FloatingFocusManager } from "@floating-ui/react";
2
+ import { AnimatePresence } from "@tamagui/animate-presence";
2
3
  import {
3
4
  composeRefs,
4
5
  isWeb,
@@ -7,18 +8,22 @@ import {
7
8
  import { styled } from "@tamagui/core";
8
9
  import { PortalItem } from "@tamagui/portal";
9
10
  import { ThemeableStack } from "@tamagui/stacks";
10
- import * as React from "react";
11
11
  import { VIEWPORT_NAME } from "./constants";
12
12
  import { ForwardSelectContext, useSelectContext } from "./context";
13
13
  import { useSelectBreakpointActive } from "./useSelectBreakpointActive";
14
14
  const SelectViewportFrame = styled(ThemeableStack, {
15
15
  name: VIEWPORT_NAME,
16
- backgroundColor: "$background",
17
- elevate: true,
18
- bordered: true,
19
- userSelect: "none",
20
- outlineWidth: 0,
21
16
  variants: {
17
+ unstyled: {
18
+ false: {
19
+ size: "$2",
20
+ backgroundColor: "$background",
21
+ elevate: true,
22
+ bordered: true,
23
+ userSelect: "none",
24
+ outlineWidth: 0
25
+ }
26
+ },
22
27
  size: {
23
28
  "...size": (val, { tokens }) => {
24
29
  return {
@@ -28,11 +33,11 @@ const SelectViewportFrame = styled(ThemeableStack, {
28
33
  }
29
34
  },
30
35
  defaultVariants: {
31
- size: "$2"
36
+ unstyled: false
32
37
  }
33
38
  });
34
- const SelectViewport = React.forwardRef(
35
- (props, forwardedRef) => {
39
+ const SelectViewport = SelectViewportFrame.styleable(
40
+ function SelectViewport2(props, forwardedRef) {
36
41
  const { __scopeSelect, children, disableScroll, ...viewportProps } = props;
37
42
  const context = useSelectContext(VIEWPORT_NAME, __scopeSelect);
38
43
  const breakpointActive = useSelectBreakpointActive(context.sheetBreakpoint);
@@ -51,35 +56,35 @@ const SelectViewport = React.forwardRef(
51
56
  if (breakpointActive || !isWeb) {
52
57
  return <PortalItem hostName={`${context.scopeKey}SheetContents`}><ForwardSelectContext context={context}>{children}</ForwardSelectContext></PortalItem>;
53
58
  }
54
- if (!context.floatingContext) {
55
- return null;
56
- }
57
- if (!context.open) {
58
- return <>{children}</>;
59
- }
60
59
  const {
61
60
  style: { scrollbarWidth, listStyleType, overflow, ...restStyle },
62
61
  ...floatingProps
63
62
  } = context.interactions.getFloatingProps();
64
63
  return <>
65
- {!disableScroll && <style
64
+ {!disableScroll && !props.unstyled && <style
66
65
  dangerouslySetInnerHTML={{
67
66
  __html: selectViewportCSS
68
67
  }}
69
68
  />}
70
- <FloatingFocusManager context={context.floatingContext}><SelectViewportFrame
69
+ <FloatingFocusManager context={context.floatingContext}><AnimatePresence>{context.open ? <SelectViewportFrame
70
+ key="select-viewport"
71
71
  size={context.size}
72
72
  role="presentation"
73
73
  {...viewportProps}
74
74
  ref={composedRefs}
75
75
  {...floatingProps}
76
76
  {...restStyle}
77
- overflow={disableScroll ? void 0 : overflow ?? "scroll"}
78
- >{children}</SelectViewportFrame></FloatingFocusManager>
77
+ {...!props.unstyled && {
78
+ overflow: disableScroll ? void 0 : overflow ?? "scroll"
79
+ }}
80
+ >{children}</SelectViewportFrame> : null}</AnimatePresence></FloatingFocusManager>
81
+ {
82
+ /* keep in dom to allow for portal to the trigger... very hacky! we should fix */
83
+ }
84
+ {!context.open && <div style={{ display: "none" }}>{props.children}</div>}
79
85
  </>;
80
86
  }
81
87
  );
82
- SelectViewport.displayName = VIEWPORT_NAME;
83
88
  const selectViewportCSS = `
84
89
  .is_SelectViewport {
85
90
  scrollbar-width: none;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/SelectViewport.tsx"],
4
- "mappings": "AAAA,SAAS,4BAA4B;AACrC;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,YAAY,WAAW;AAEvB,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB,wBAAwB;AAEvD,SAAS,iCAAiC;AAMnC,MAAM,sBAAsB,OAAO,gBAAgB;AAAA,EACxD,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAAA,EAEd,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,WAAW,CAAC,KAAK,EAAE,OAAO,MAAM;AAC9B,eAAO;AAAA,UACL,cAAc,OAAO,OAAO,GAAG,KAAK;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF,CAAC;AAEM,MAAM,iBAAiB,MAAM;AAAA,EAClC,CAAC,OAAyC,iBAAiB;AACzD,UAAM,EAAE,eAAe,UAAU,eAAe,GAAG,cAAc,IAAI;AACrE,UAAM,UAAU,iBAAiB,eAAe,aAAa;AAC7D,UAAM,mBAAmB,0BAA0B,QAAQ,eAAe;AAE1E,8BAA0B,MAAM;AAC9B,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,UAAM,eAAe;AAAA,MACnB;AAAA,MACA,QAAQ,iBAAiB,KAAK;AAAA,IAChC;AACA,QAAI,QAAQ,uBAAuB;AACjC,aAAO,GAAG,SAAS;AAAA,IACrB;AAEA,QAAI,oBAAoB,CAAC,OAAO;AAC9B,aACE,CAAC,WAAW,UAAU,GAAG,QAAQ,yBAC/B,CAAC,qBAAqB,SAAS,UAAU,SAAS,EAAjD,qBACH,EAFC;AAAA,IAIL;AAEA,QAAI,CAAC,QAAQ,iBAAiB;AAC5B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,QAAQ,MAAM;AACjB,aAAO,GAAG,SAAS;AAAA,IACrB;AAEA,UAAM;AAAA,MACJ,OAAO,EAAE,gBAAgB,eAAe,UAAU,GAAG,UAAU;AAAA,MAC/D,GAAG;AAAA,IACL,IAAI,QAAQ,aAAc,iBAAiB;AAE3C,WACE;AAAA,OACG,CAAC,iBACA,CAAC;AAAA,QACC,yBAAyB;AAAA,UACvB,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,MAEF,CAAC,qBAAqB,SAAS,QAAQ,iBACrC,CAAC;AAAA,QACC,MAAM,QAAQ;AAAA,QAEd,KAAK;AAAA,YACD;AAAA,QACJ,KAAK;AAAA,YACD;AAAA,YACA;AAAA,QACJ,UAAU,gBAAgB,SAAY,YAAY;AAAA,QAEjD,SACH,EAXC,oBAYH,EAbC;AAAA,IAcH;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;AAE7B,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
5
- "names": []
4
+ "mappings": "AAAA,SAAS,4BAA4B;AACrC,SAAS,uBAAuB;AAChC;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAG/B,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB,wBAAwB;AAEvD,SAAS,iCAAiC;AAMnC,MAAM,sBAAsB,OAAO,gBAAgB;AAAA,EACxD,MAAM;AAAA,EAEN,UAAU;AAAA,IACR,UAAU;AAAA,MACR,OAAO;AAAA,QACL,MAAM;AAAA,QACN,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IAEA,MAAM;AAAA,MACJ,WAAW,CAAC,KAAK,EAAE,OAAO,MAAM;AAC9B,eAAO;AAAA,UACL,cAAc,OAAO,OAAO,GAAG,KAAK;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB;AAAA,IACf,UAAU;AAAA,EACZ;AACF,CAAC;AAEM,MAAM,iBAAiB,oBAAoB;AAAA,EAChD,SAASA,gBAAe,OAAyC,cAAc;AAC7E,UAAM,EAAE,eAAe,UAAU,eAAe,GAAG,cAAc,IAAI;AACrE,UAAM,UAAU,iBAAiB,eAAe,aAAa;AAC7D,UAAM,mBAAmB,0BAA0B,QAAQ,eAAe;AAE1E,8BAA0B,MAAM;AAC9B,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,UAAM,eAAe;AAAA,MACnB;AAAA,MACA,QAAQ,iBAAiB,KAAK;AAAA,IAChC;AAEA,QAAI,QAAQ,uBAAuB;AACjC,aAAO,GAAG,SAAS;AAAA,IACrB;AAEA,QAAI,oBAAoB,CAAC,OAAO;AAC9B,aACE,CAAC,WAAW,UAAU,GAAG,QAAQ,yBAC/B,CAAC,qBAAqB,SAAS,UAAU,SAAS,EAAjD,qBACH,EAFC;AAAA,IAIL;AAEA,UAAM;AAAA,MACJ,OAAO,EAAE,gBAAgB,eAAe,UAAU,GAAG,UAAU;AAAA,MAC/D,GAAG;AAAA,IACL,IAAI,QAAQ,aAAc,iBAAiB;AAE3C,WACE;AAAA,OACG,CAAC,iBAAiB,CAAC,MAAM,YACxB,CAAC;AAAA,QACC,yBAAyB;AAAA,UACvB,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,MAEF,CAAC,qBAAqB,SAAS,QAAQ,iBACrC,CAAC,iBACE,QAAQ,OACP,CAAC;AAAA,QACC,IAAI;AAAA,QACJ,MAAM,QAAQ;AAAA,QAEd,KAAK;AAAA,YACD;AAAA,QACJ,KAAK;AAAA,YACD;AAAA,YACA;AAAA,YACC,CAAC,MAAM,YAAY;AAAA,UACtB,UAAU,gBAAgB,SAAY,YAAY;AAAA,QACpD;AAAA,QAEC,SACH,EAdC,uBAeC,KACN,EAlBC,gBAmBH,EApBC;AAAA;AAAA;AAAA;AAAA,OAuBA,CAAC,QAAQ,QAAQ,CAAC,IAAI,OAAO,EAAE,SAAS,OAAO,IAAI,MAAM,SAAS,EAAhD;AAAA,IACrB;AAAA,EAEJ;AACF;AAEA,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
5
+ "names": ["SelectViewport"]
6
6
  }
@@ -0,0 +1,137 @@
1
+ import { useComposedRefs } from "@tamagui/compose-refs";
2
+ import { isWeb, isWebTouchable, useIsomorphicLayoutEffect } from "@tamagui/core";
3
+ import { ListItem } from "@tamagui/list-item";
4
+ import * as React from "react";
5
+ import { createSelectContext, useSelectContext } from "./context";
6
+ const ITEM_NAME = "SelectItem";
7
+ const [SelectItemContextProvider, useSelectItemContext] = createSelectContext(ITEM_NAME);
8
+ const SelectItem = ListItem.styleable(
9
+ (props, forwardedRef) => {
10
+ const {
11
+ __scopeSelect,
12
+ value,
13
+ disabled = false,
14
+ textValue: textValueProp,
15
+ index,
16
+ ...itemProps
17
+ } = props;
18
+ const context = useSelectContext(ITEM_NAME, __scopeSelect);
19
+ const isSelected = context.value === value;
20
+ const textId = React.useId();
21
+ const {
22
+ selectedIndex,
23
+ setSelectedIndex,
24
+ listRef,
25
+ open,
26
+ setOpen,
27
+ onChange,
28
+ activeIndex,
29
+ allowMouseUpRef,
30
+ allowSelectRef,
31
+ setValueAtIndex,
32
+ selectTimeoutRef,
33
+ dataRef
34
+ } = context;
35
+ const composedRefs = useComposedRefs(forwardedRef, (node) => {
36
+ if (!isWeb)
37
+ return;
38
+ if (node instanceof HTMLElement) {
39
+ if (listRef) {
40
+ listRef.current[index] = node;
41
+ }
42
+ }
43
+ });
44
+ useIsomorphicLayoutEffect(() => {
45
+ setValueAtIndex(index, value);
46
+ }, [index, setValueAtIndex, value]);
47
+ function handleSelect() {
48
+ setSelectedIndex(index);
49
+ onChange(value);
50
+ setOpen(false);
51
+ }
52
+ const selectItemProps = context.interactions ? context.interactions.getItemProps({
53
+ ...isWebTouchable ? {
54
+ onTouchStart() {
55
+ allowSelectRef.current = true;
56
+ allowMouseUpRef.current = false;
57
+ }
58
+ } : {
59
+ onTouchMove() {
60
+ allowSelectRef.current = true;
61
+ allowMouseUpRef.current = false;
62
+ },
63
+ onTouchEnd() {
64
+ allowSelectRef.current = false;
65
+ allowMouseUpRef.current = true;
66
+ }
67
+ },
68
+ onKeyDown(event) {
69
+ if (event.key === "Enter" || event.key === " " && !dataRef?.current.typing) {
70
+ event.preventDefault();
71
+ handleSelect();
72
+ } else {
73
+ allowSelectRef.current = true;
74
+ }
75
+ },
76
+ onClick() {
77
+ if (allowSelectRef.current) {
78
+ setSelectedIndex(index);
79
+ setOpen(false);
80
+ }
81
+ },
82
+ onMouseUp() {
83
+ if (!allowMouseUpRef.current) {
84
+ return;
85
+ }
86
+ if (allowSelectRef.current) {
87
+ handleSelect();
88
+ }
89
+ clearTimeout(selectTimeoutRef.current);
90
+ selectTimeoutRef.current = setTimeout(() => {
91
+ allowSelectRef.current = true;
92
+ });
93
+ }
94
+ }) : {
95
+ onPress: handleSelect
96
+ };
97
+ const isActive = activeIndex === index;
98
+ React.useEffect(() => {
99
+ if (isActive) {
100
+ listRef?.current[index]?.focus();
101
+ }
102
+ }, [isActive]);
103
+ return <SelectItemContextProvider
104
+ scope={__scopeSelect}
105
+ value={value}
106
+ textId={textId || ""}
107
+ isSelected={isSelected}
108
+ >{context.shouldRenderWebNative ? <option value={value}>{props.children}</option> : <ListItem
109
+ tag="div"
110
+ componentName={ITEM_NAME}
111
+ backgrounded
112
+ pressTheme
113
+ hoverTheme
114
+ focusTheme
115
+ cursor="default"
116
+ outlineWidth={0}
117
+ ref={composedRefs}
118
+ aria-labelledby={textId}
119
+ aria-selected={isSelected}
120
+ data-state={isSelected ? "active" : "inactive"}
121
+ aria-disabled={disabled || void 0}
122
+ data-disabled={disabled ? "" : void 0}
123
+ tabIndex={disabled ? void 0 : -1}
124
+ size={context.size}
125
+ {...itemProps}
126
+ {...selectItemProps}
127
+ {...isActive && {
128
+ theme: "active"
129
+ }}
130
+ />}</SelectItemContextProvider>;
131
+ }
132
+ );
133
+ SelectItem.displayName = ITEM_NAME;
134
+ export {
135
+ SelectItem
136
+ };
137
+ //# sourceMappingURL=useSelectItemContext.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/useSelectItemContext.tsx"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,137 @@
1
+ import { useComposedRefs } from "@tamagui/compose-refs";
2
+ import { isWeb, isWebTouchable, useIsomorphicLayoutEffect } from "@tamagui/core";
3
+ import { ListItem } from "@tamagui/list-item";
4
+ import * as React from "react";
5
+ import { createSelectContext, useSelectContext } from "./context";
6
+ const ITEM_NAME = "SelectItem";
7
+ const [SelectItemContextProvider, useSelectItemContext] = createSelectContext(ITEM_NAME);
8
+ const SelectItem = ListItem.styleable(
9
+ (props, forwardedRef) => {
10
+ const {
11
+ __scopeSelect,
12
+ value,
13
+ disabled = false,
14
+ textValue: textValueProp,
15
+ index,
16
+ ...itemProps
17
+ } = props;
18
+ const context = useSelectContext(ITEM_NAME, __scopeSelect);
19
+ const isSelected = context.value === value;
20
+ const textId = React.useId();
21
+ const {
22
+ selectedIndex,
23
+ setSelectedIndex,
24
+ listRef,
25
+ open,
26
+ setOpen,
27
+ onChange,
28
+ activeIndex,
29
+ allowMouseUpRef,
30
+ allowSelectRef,
31
+ setValueAtIndex,
32
+ selectTimeoutRef,
33
+ dataRef
34
+ } = context;
35
+ const composedRefs = useComposedRefs(forwardedRef, (node) => {
36
+ if (!isWeb)
37
+ return;
38
+ if (node instanceof HTMLElement) {
39
+ if (listRef) {
40
+ listRef.current[index] = node;
41
+ }
42
+ }
43
+ });
44
+ useIsomorphicLayoutEffect(() => {
45
+ setValueAtIndex(index, value);
46
+ }, [index, setValueAtIndex, value]);
47
+ function handleSelect() {
48
+ setSelectedIndex(index);
49
+ onChange(value);
50
+ setOpen(false);
51
+ }
52
+ const selectItemProps = context.interactions ? context.interactions.getItemProps({
53
+ ...isWebTouchable ? {
54
+ onTouchStart() {
55
+ allowSelectRef.current = true;
56
+ allowMouseUpRef.current = false;
57
+ }
58
+ } : {
59
+ onTouchMove() {
60
+ allowSelectRef.current = true;
61
+ allowMouseUpRef.current = false;
62
+ },
63
+ onTouchEnd() {
64
+ allowSelectRef.current = false;
65
+ allowMouseUpRef.current = true;
66
+ }
67
+ },
68
+ onKeyDown(event) {
69
+ if (event.key === "Enter" || event.key === " " && !dataRef?.current.typing) {
70
+ event.preventDefault();
71
+ handleSelect();
72
+ } else {
73
+ allowSelectRef.current = true;
74
+ }
75
+ },
76
+ onClick() {
77
+ if (allowSelectRef.current) {
78
+ setSelectedIndex(index);
79
+ setOpen(false);
80
+ }
81
+ },
82
+ onMouseUp() {
83
+ if (!allowMouseUpRef.current) {
84
+ return;
85
+ }
86
+ if (allowSelectRef.current) {
87
+ handleSelect();
88
+ }
89
+ clearTimeout(selectTimeoutRef.current);
90
+ selectTimeoutRef.current = setTimeout(() => {
91
+ allowSelectRef.current = true;
92
+ });
93
+ }
94
+ }) : {
95
+ onPress: handleSelect
96
+ };
97
+ const isActive = activeIndex === index;
98
+ React.useEffect(() => {
99
+ if (isActive) {
100
+ listRef?.current[index]?.focus();
101
+ }
102
+ }, [isActive]);
103
+ return <SelectItemContextProvider
104
+ scope={__scopeSelect}
105
+ value={value}
106
+ textId={textId || ""}
107
+ isSelected={isSelected}
108
+ >{context.shouldRenderWebNative ? <option value={value}>{props.children}</option> : <ListItem
109
+ tag="div"
110
+ componentName={ITEM_NAME}
111
+ backgrounded
112
+ pressTheme
113
+ hoverTheme
114
+ focusTheme
115
+ cursor="default"
116
+ outlineWidth={0}
117
+ ref={composedRefs}
118
+ aria-labelledby={textId}
119
+ aria-selected={isSelected}
120
+ data-state={isSelected ? "active" : "inactive"}
121
+ aria-disabled={disabled || void 0}
122
+ data-disabled={disabled ? "" : void 0}
123
+ tabIndex={disabled ? void 0 : -1}
124
+ size={context.size}
125
+ {...itemProps}
126
+ {...selectItemProps}
127
+ {...isActive && {
128
+ theme: "active"
129
+ }}
130
+ />}</SelectItemContextProvider>;
131
+ }
132
+ );
133
+ SelectItem.displayName = ITEM_NAME;
134
+ export {
135
+ SelectItem
136
+ };
137
+ //# sourceMappingURL=useSelectItemContext.mjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/useSelectItemContext.tsx"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/select",
3
- "version": "1.39.9",
3
+ "version": "1.41.0",
4
4
  "sideEffects": [
5
5
  "*.css"
6
6
  ],
@@ -31,25 +31,26 @@
31
31
  }
32
32
  },
33
33
  "dependencies": {
34
- "@floating-ui/react": "^0.24.3",
34
+ "@floating-ui/react": "^0.24.7",
35
35
  "@floating-ui/react-dom": "^2.0.1",
36
36
  "@floating-ui/react-native": "^0.10.1",
37
37
  "@radix-ui/react-use-previous": "^1.0.0",
38
- "@tamagui/adapt": "1.39.9",
39
- "@tamagui/compose-refs": "1.39.9",
40
- "@tamagui/core": "1.39.9",
41
- "@tamagui/create-context": "1.39.9",
42
- "@tamagui/dismissable": "1.39.9",
43
- "@tamagui/focus-scope": "1.39.9",
44
- "@tamagui/get-token": "1.39.9",
45
- "@tamagui/list-item": "1.39.9",
46
- "@tamagui/portal": "1.39.9",
47
- "@tamagui/separator": "1.39.9",
48
- "@tamagui/sheet": "1.39.9",
49
- "@tamagui/stacks": "1.39.9",
50
- "@tamagui/text": "1.39.9",
51
- "@tamagui/use-controllable-state": "1.39.9",
52
- "@tamagui/use-event": "1.39.9"
38
+ "@tamagui/adapt": "1.41.0",
39
+ "@tamagui/animate-presence": "1.41.0",
40
+ "@tamagui/compose-refs": "1.41.0",
41
+ "@tamagui/core": "1.41.0",
42
+ "@tamagui/create-context": "1.41.0",
43
+ "@tamagui/dismissable": "1.41.0",
44
+ "@tamagui/focus-scope": "1.41.0",
45
+ "@tamagui/get-token": "1.41.0",
46
+ "@tamagui/list-item": "1.41.0",
47
+ "@tamagui/portal": "1.41.0",
48
+ "@tamagui/separator": "1.41.0",
49
+ "@tamagui/sheet": "1.41.0",
50
+ "@tamagui/stacks": "1.41.0",
51
+ "@tamagui/text": "1.41.0",
52
+ "@tamagui/use-controllable-state": "1.41.0",
53
+ "@tamagui/use-event": "1.41.0"
53
54
  },
54
55
  "peerDependencies": {
55
56
  "react": "*",
@@ -57,7 +58,7 @@
57
58
  "react-native": "*"
58
59
  },
59
60
  "devDependencies": {
60
- "@tamagui/build": "1.39.9",
61
+ "@tamagui/build": "1.41.0",
61
62
  "react": "^18.2.0",
62
63
  "react-dom": "^18.2.0",
63
64
  "react-native": "^0.72.1"