@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.
- package/dist/cjs/Select.js +10 -193
- package/dist/cjs/Select.js.map +2 -2
- package/dist/cjs/SelectContent.js +8 -2
- package/dist/cjs/SelectContent.js.map +1 -1
- package/dist/cjs/SelectImpl.js +2 -2
- package/dist/cjs/SelectImpl.js.map +1 -1
- package/dist/cjs/SelectItem.js +181 -0
- package/dist/cjs/SelectItem.js.map +6 -0
- package/dist/cjs/SelectTrigger.js +98 -0
- package/dist/cjs/SelectTrigger.js.map +6 -0
- package/dist/cjs/SelectViewport.js +23 -31
- package/dist/cjs/SelectViewport.js.map +2 -2
- package/dist/cjs/useSelectItemContext.js +180 -0
- package/dist/cjs/useSelectItemContext.js.map +6 -0
- package/dist/esm/Select.js +5 -187
- package/dist/esm/Select.js.map +2 -2
- package/dist/esm/SelectContent.js +8 -2
- package/dist/esm/SelectContent.js.map +1 -1
- package/dist/esm/SelectImpl.js +2 -2
- package/dist/esm/SelectImpl.js.map +1 -1
- package/dist/esm/SelectItem.js +149 -0
- package/dist/esm/SelectItem.js.map +6 -0
- package/dist/esm/SelectTrigger.js +64 -0
- package/dist/esm/SelectTrigger.js.map +6 -0
- package/dist/esm/SelectViewport.js +23 -21
- package/dist/esm/SelectViewport.js.map +2 -2
- package/dist/esm/useSelectItemContext.js +146 -0
- package/dist/esm/useSelectItemContext.js.map +6 -0
- package/dist/jsx/Select.js +5 -186
- package/dist/jsx/Select.js.map +2 -2
- package/dist/jsx/Select.mjs +5 -186
- package/dist/jsx/Select.mjs.map +2 -2
- package/dist/jsx/SelectContent.js +4 -2
- package/dist/jsx/SelectContent.js.map +1 -1
- package/dist/jsx/SelectContent.mjs +4 -2
- package/dist/jsx/SelectContent.mjs.map +1 -1
- package/dist/jsx/SelectImpl.js +2 -2
- package/dist/jsx/SelectImpl.js.map +1 -1
- package/dist/jsx/SelectImpl.mjs +2 -2
- package/dist/jsx/SelectImpl.mjs.map +1 -1
- package/dist/jsx/SelectItem.js +140 -0
- package/dist/jsx/SelectItem.js.map +6 -0
- package/dist/jsx/SelectItem.mjs +140 -0
- package/dist/jsx/SelectItem.mjs.map +6 -0
- package/dist/jsx/SelectTrigger.js +58 -0
- package/dist/jsx/SelectTrigger.js.map +6 -0
- package/dist/jsx/SelectTrigger.mjs +58 -0
- package/dist/jsx/SelectTrigger.mjs.map +6 -0
- package/dist/jsx/SelectViewport.js +25 -20
- package/dist/jsx/SelectViewport.js.map +2 -2
- package/dist/jsx/SelectViewport.mjs +25 -20
- package/dist/jsx/SelectViewport.mjs.map +2 -2
- package/dist/jsx/useSelectItemContext.js +137 -0
- package/dist/jsx/useSelectItemContext.js.map +6 -0
- package/dist/jsx/useSelectItemContext.mjs +137 -0
- package/dist/jsx/useSelectItemContext.mjs.map +6 -0
- package/package.json +19 -18
- package/src/Select.tsx +6 -245
- package/src/SelectContent.tsx +10 -10
- package/src/SelectImpl.tsx +2 -2
- package/src/SelectItem.tsx +188 -0
- package/src/SelectTrigger.tsx +74 -0
- package/src/SelectViewport.tsx +40 -32
- package/src/types.tsx +1 -0
- package/types/Select.d.ts +169 -100
- package/types/Select.d.ts.map +1 -1
- package/types/SelectContent.d.ts.map +1 -1
- package/types/SelectItem.d.ts +27 -0
- package/types/SelectItem.d.ts.map +1 -0
- package/types/SelectTrigger.d.ts +87 -0
- package/types/SelectTrigger.d.ts.map +1 -0
- package/types/SelectViewport.d.ts +168 -5
- package/types/SelectViewport.d.ts.map +1 -1
- package/types/types.d.ts +1 -0
- package/types/types.d.ts.map +1 -1
- package/types/useSelectItemContext.d.ts +145 -0
- 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
|
-
|
|
36
|
+
unstyled: false
|
|
32
37
|
}
|
|
33
38
|
});
|
|
34
|
-
const SelectViewport =
|
|
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
|
-
|
|
78
|
-
|
|
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;
|
|
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.
|
|
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.
|
|
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
|
-
"@tamagui/
|
|
40
|
-
"@tamagui/
|
|
41
|
-
"@tamagui/
|
|
42
|
-
"@tamagui/
|
|
43
|
-
"@tamagui/
|
|
44
|
-
"@tamagui/
|
|
45
|
-
"@tamagui/
|
|
46
|
-
"@tamagui/
|
|
47
|
-
"@tamagui/
|
|
48
|
-
"@tamagui/
|
|
49
|
-
"@tamagui/
|
|
50
|
-
"@tamagui/
|
|
51
|
-
"@tamagui/
|
|
52
|
-
"@tamagui/use-
|
|
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.
|
|
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"
|