@tamagui/select 1.47.4 → 1.47.6

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 (62) hide show
  1. package/dist/cjs/Select.js +82 -40
  2. package/dist/cjs/Select.js.map +1 -1
  3. package/dist/cjs/SelectContent.js +2 -1
  4. package/dist/cjs/SelectContent.js.map +1 -1
  5. package/dist/cjs/SelectImpl.js +38 -23
  6. package/dist/cjs/SelectImpl.js.map +2 -2
  7. package/dist/cjs/SelectItem.js +24 -12
  8. package/dist/cjs/SelectItem.js.map +1 -1
  9. package/dist/cjs/SelectTrigger.js +7 -6
  10. package/dist/cjs/SelectTrigger.js.map +1 -1
  11. package/dist/cjs/SelectViewport.js +6 -5
  12. package/dist/cjs/SelectViewport.js.map +1 -1
  13. package/dist/cjs/context.js +19 -4
  14. package/dist/cjs/context.js.map +1 -1
  15. package/dist/esm/Select.js +89 -41
  16. package/dist/esm/Select.js.map +1 -1
  17. package/dist/esm/SelectContent.js +3 -2
  18. package/dist/esm/SelectContent.js.map +1 -1
  19. package/dist/esm/SelectImpl.js +42 -23
  20. package/dist/esm/SelectImpl.js.map +1 -1
  21. package/dist/esm/SelectItem.js +28 -13
  22. package/dist/esm/SelectItem.js.map +1 -1
  23. package/dist/esm/SelectTrigger.js +8 -7
  24. package/dist/esm/SelectTrigger.js.map +1 -1
  25. package/dist/esm/SelectViewport.js +11 -6
  26. package/dist/esm/SelectViewport.js.map +1 -1
  27. package/dist/esm/context.js +14 -3
  28. package/dist/esm/context.js.map +1 -1
  29. package/dist/jsx/Select.js +66 -22
  30. package/dist/jsx/Select.js.map +1 -1
  31. package/dist/jsx/SelectContent.js +3 -2
  32. package/dist/jsx/SelectContent.js.map +1 -1
  33. package/dist/jsx/SelectImpl.js +38 -23
  34. package/dist/jsx/SelectImpl.js.map +1 -1
  35. package/dist/jsx/SelectItem.js +28 -13
  36. package/dist/jsx/SelectItem.js.map +1 -1
  37. package/dist/jsx/SelectTrigger.js +8 -7
  38. package/dist/jsx/SelectTrigger.js.map +1 -1
  39. package/dist/jsx/SelectViewport.js +11 -6
  40. package/dist/jsx/SelectViewport.js.map +1 -1
  41. package/dist/jsx/context.js +14 -3
  42. package/dist/jsx/context.js.map +1 -1
  43. package/package.json +19 -19
  44. package/src/Select.tsx +101 -49
  45. package/src/SelectContent.tsx +3 -2
  46. package/src/SelectImpl.tsx +46 -23
  47. package/src/SelectItem.tsx +33 -14
  48. package/src/SelectTrigger.tsx +8 -7
  49. package/src/SelectViewport.tsx +13 -6
  50. package/src/context.tsx +24 -8
  51. package/src/types.tsx +24 -18
  52. package/types/Select.d.ts.map +1 -1
  53. package/types/SelectContent.d.ts.map +1 -1
  54. package/types/SelectImpl.d.ts +2 -1
  55. package/types/SelectImpl.d.ts.map +1 -1
  56. package/types/SelectItem.d.ts.map +1 -1
  57. package/types/SelectTrigger.d.ts.map +1 -1
  58. package/types/SelectViewport.d.ts.map +1 -1
  59. package/types/context.d.ts +23 -2
  60. package/types/context.d.ts.map +1 -1
  61. package/types/types.d.ts +23 -16
  62. package/types/types.d.ts.map +1 -1
@@ -6,7 +6,10 @@ import {
6
6
  } from "@tamagui/core";
7
7
  import { ListItem } from "@tamagui/list-item";
8
8
  import * as React from "react";
9
- import { createSelectContext, useSelectContext } from "./context";
9
+ import {
10
+ createSelectContext,
11
+ useSelectItemParentContext
12
+ } from "./context";
10
13
  const ITEM_NAME = "SelectItem";
11
14
  const [SelectItemContextProvider, useSelectItemContext] = createSelectContext(ITEM_NAME);
12
15
  const SelectItem = React.forwardRef(
@@ -19,23 +22,36 @@ const SelectItem = React.forwardRef(
19
22
  index,
20
23
  ...itemProps
21
24
  } = props;
22
- const context = useSelectContext(ITEM_NAME, __scopeSelect);
23
- const isSelected = context.value === value;
24
- const textId = React.useId();
25
+ const context = useSelectItemParentContext(ITEM_NAME, __scopeSelect);
25
26
  const {
26
- selectedIndex,
27
27
  setSelectedIndex,
28
28
  listRef,
29
- open,
30
29
  setOpen,
31
30
  onChange,
32
- activeIndex,
31
+ activeIndexSubscribe,
32
+ valueSubscribe,
33
33
  allowMouseUpRef,
34
34
  allowSelectRef,
35
35
  setValueAtIndex,
36
36
  selectTimeoutRef,
37
- dataRef
37
+ dataRef,
38
+ interactions,
39
+ shouldRenderWebNative,
40
+ size
38
41
  } = context;
42
+ const [isSelected, setSelected] = React.useState(false);
43
+ const [isActive, setActive] = React.useState(false);
44
+ React.useEffect(() => {
45
+ return activeIndexSubscribe((i) => {
46
+ setActive(index === i);
47
+ });
48
+ }, [index]);
49
+ React.useEffect(() => {
50
+ return valueSubscribe((val) => {
51
+ setSelected(val === value);
52
+ });
53
+ }, [value]);
54
+ const textId = React.useId();
39
55
  const composedRefs = useComposedRefs(forwardedRef, (node) => {
40
56
  if (!isWeb)
41
57
  return;
@@ -53,7 +69,7 @@ const SelectItem = React.forwardRef(
53
69
  onChange(value);
54
70
  setOpen(false);
55
71
  }
56
- const selectItemProps = context.interactions ? context.interactions.getItemProps({
72
+ const selectItemProps = interactions ? interactions.getItemProps({
57
73
  ...isWebTouchable ? {
58
74
  onTouchStart() {
59
75
  allowSelectRef.current = true;
@@ -98,8 +114,7 @@ const SelectItem = React.forwardRef(
98
114
  }) : {
99
115
  onPress: handleSelect
100
116
  };
101
- const isActive = activeIndex === index;
102
- React.useLayoutEffect(() => {
117
+ useIsomorphicLayoutEffect(() => {
103
118
  if (isActive) {
104
119
  listRef?.current[index]?.focus();
105
120
  }
@@ -109,7 +124,7 @@ const SelectItem = React.forwardRef(
109
124
  value={value}
110
125
  textId={textId || ""}
111
126
  isSelected={isSelected}
112
- >{context.shouldRenderWebNative ? <option value={value}>{props.children}</option> : <ListItem
127
+ >{shouldRenderWebNative ? <option value={value}>{props.children}</option> : <ListItem
113
128
  tag="div"
114
129
  componentName={ITEM_NAME}
115
130
  backgrounded
@@ -125,7 +140,7 @@ const SelectItem = React.forwardRef(
125
140
  aria-disabled={disabled || void 0}
126
141
  data-disabled={disabled ? "" : void 0}
127
142
  tabIndex={disabled ? void 0 : -1}
128
- size={context.size}
143
+ size={size}
129
144
  {...itemProps}
130
145
  {...selectItemProps}
131
146
  />}</SelectItemContextProvider>;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/SelectItem.tsx"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -1,17 +1,18 @@
1
1
  import { useComposedRefs } from "@tamagui/compose-refs";
2
2
  import { ListItem } from "@tamagui/list-item";
3
3
  import * as React from "react";
4
- import { useSelectContext } from "./context";
4
+ import { useSelectContext, useSelectItemParentContext } from "./context";
5
5
  const TRIGGER_NAME = "SelectTrigger";
6
6
  const SelectTrigger = React.forwardRef(
7
7
  function SelectTrigger2(props, forwardedRef) {
8
8
  const { __scopeSelect, disabled = false, unstyled = false, ...triggerProps } = props;
9
9
  const context = useSelectContext(TRIGGER_NAME, __scopeSelect);
10
+ const itemParentContext = useSelectItemParentContext(TRIGGER_NAME, __scopeSelect);
10
11
  const composedRefs = useComposedRefs(
11
12
  forwardedRef,
12
13
  context.floatingContext?.refs.setReference
13
14
  );
14
- if (context.shouldRenderWebNative) {
15
+ if (itemParentContext.shouldRenderWebNative) {
15
16
  return null;
16
17
  }
17
18
  return <ListItem
@@ -30,7 +31,7 @@ const SelectTrigger = React.forwardRef(
30
31
  },
31
32
  borderWidth: 1
32
33
  }}
33
- size={context.size}
34
+ size={itemParentContext.size}
34
35
  aria-expanded={context.open}
35
36
  aria-autocomplete="none"
36
37
  dir={context.dir}
@@ -38,15 +39,15 @@ const SelectTrigger = React.forwardRef(
38
39
  data-disabled={disabled ? "" : void 0}
39
40
  {...triggerProps}
40
41
  ref={composedRefs}
41
- {...process.env.TAMAGUI_TARGET === "web" && context.interactions ? {
42
- ...context.interactions.getReferenceProps(),
42
+ {...process.env.TAMAGUI_TARGET === "web" && itemParentContext.interactions ? {
43
+ ...itemParentContext.interactions.getReferenceProps(),
43
44
  onMouseDown() {
44
45
  context.floatingContext?.update();
45
- context.setOpen(!context.open);
46
+ itemParentContext.setOpen(!context.open);
46
47
  }
47
48
  } : {
48
49
  onPress() {
49
- context.setOpen(!context.open);
50
+ itemParentContext.setOpen(!context.open);
50
51
  }
51
52
  }}
52
53
  />;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/SelectTrigger.tsx"],
4
- "mappings": "AAAA,SAAS,uBAAuB;AAEhC,SAAS,gBAA+B;AACxC,YAAY,WAAW;AAEvB,SAAS,wBAAwB;AAMjC,MAAM,eAAe;AAId,MAAM,gBAAgB,MAAM;AAAA,EACjC,SAASA,eAAc,OAAwC,cAAc;AAC3E,UAAM,EAAE,eAAe,WAAW,OAAO,WAAW,OAAO,GAAG,aAAa,IAAI;AAE/E,UAAM,UAAU,iBAAiB,cAAc,aAAa;AAC5D,UAAM,eAAe;AAAA,MACnB;AAAA,MACA,QAAQ,iBAAiB,KAAK;AAAA,IAChC;AAIA,QAAI,QAAQ,uBAAuB;AACjC,aAAO;AAAA,IACT;AAEA,WACE,CAAC;AAAA,MACC,eAAe;AAAA,MACf,UAAU;AAAA,UACL,CAAC,YAAY;AAAA,QAChB,cAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,YAAY;AAAA,UACV,cAAc;AAAA,UACd,cAAc;AAAA,UACd,cAAc;AAAA,QAChB;AAAA,QACA,aAAa;AAAA,MACf;AAAA,MACA,MAAM,QAAQ;AAAA,MAEd,eAAe,QAAQ;AAAA,MACvB,kBAAkB;AAAA,MAClB,KAAK,QAAQ;AAAA,MACb,UAAU;AAAA,MACV,eAAe,WAAW,KAAK;AAAA,UAC3B;AAAA,MACJ,KAAK;AAAA,UACA,QAAQ,IAAI,mBAAmB,SAAS,QAAQ,eACjD;AAAA,QACE,GAAG,QAAQ,aAAa,kBAAkB;AAAA,QAC1C,cAAc;AACZ,kBAAQ,iBAAiB,OAAO;AAChC,kBAAQ,QAAQ,CAAC,QAAQ,IAAI;AAAA,QAC/B;AAAA,MACF,IACA;AAAA,QACE,UAAU;AACR,kBAAQ,QAAQ,CAAC,QAAQ,IAAI;AAAA,QAC/B;AAAA,MACF;AAAA,IACN;AAAA,EAEJ;AACF;",
4
+ "mappings": "AAAA,SAAS,uBAAuB;AAEhC,SAAS,gBAA+B;AACxC,YAAY,WAAW;AAEvB,SAAS,kBAAkB,kCAAkC;AAM7D,MAAM,eAAe;AAId,MAAM,gBAAgB,MAAM;AAAA,EACjC,SAASA,eAAc,OAAwC,cAAc;AAC3E,UAAM,EAAE,eAAe,WAAW,OAAO,WAAW,OAAO,GAAG,aAAa,IAAI;AAE/E,UAAM,UAAU,iBAAiB,cAAc,aAAa;AAC5D,UAAM,oBAAoB,2BAA2B,cAAc,aAAa;AAChF,UAAM,eAAe;AAAA,MACnB;AAAA,MACA,QAAQ,iBAAiB,KAAK;AAAA,IAChC;AAIA,QAAI,kBAAkB,uBAAuB;AAC3C,aAAO;AAAA,IACT;AAEA,WACE,CAAC;AAAA,MACC,eAAe;AAAA,MACf,UAAU;AAAA,UACL,CAAC,YAAY;AAAA,QAChB,cAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,YAAY;AAAA,UACV,cAAc;AAAA,UACd,cAAc;AAAA,UACd,cAAc;AAAA,QAChB;AAAA,QACA,aAAa;AAAA,MACf;AAAA,MACA,MAAM,kBAAkB;AAAA,MAExB,eAAe,QAAQ;AAAA,MACvB,kBAAkB;AAAA,MAClB,KAAK,QAAQ;AAAA,MACb,UAAU;AAAA,MACV,eAAe,WAAW,KAAK;AAAA,UAC3B;AAAA,MACJ,KAAK;AAAA,UACA,QAAQ,IAAI,mBAAmB,SAAS,kBAAkB,eAC3D;AAAA,QACE,GAAG,kBAAkB,aAAa,kBAAkB;AAAA,QACpD,cAAc;AACZ,kBAAQ,iBAAiB,OAAO;AAChC,4BAAkB,QAAQ,CAAC,QAAQ,IAAI;AAAA,QACzC;AAAA,MACF,IACA;AAAA,QACE,UAAU;AACR,4BAAkB,QAAQ,CAAC,QAAQ,IAAI;AAAA,QACzC;AAAA,MACF;AAAA,IACN;AAAA,EAEJ;AACF;",
5
5
  "names": ["SelectTrigger"]
6
6
  }
@@ -9,7 +9,11 @@ import { styled } from "@tamagui/core";
9
9
  import { PortalItem } from "@tamagui/portal";
10
10
  import { ThemeableStack } from "@tamagui/stacks";
11
11
  import { VIEWPORT_NAME } from "./constants";
12
- import { ForwardSelectContext, useSelectContext } from "./context";
12
+ import {
13
+ ForwardSelectContext,
14
+ useSelectContext,
15
+ useSelectItemParentContext
16
+ } from "./context";
13
17
  import { useSelectBreakpointActive } from "./useSelectBreakpointActive";
14
18
  const SelectViewportFrame = styled(ThemeableStack, {
15
19
  name: VIEWPORT_NAME,
@@ -40,6 +44,7 @@ const SelectViewport = SelectViewportFrame.styleable(
40
44
  function SelectViewport2(props, forwardedRef) {
41
45
  const { __scopeSelect, children, disableScroll, ...viewportProps } = props;
42
46
  const context = useSelectContext(VIEWPORT_NAME, __scopeSelect);
47
+ const itemContext = useSelectItemParentContext(VIEWPORT_NAME, __scopeSelect);
43
48
  const breakpointActive = useSelectBreakpointActive(context.sheetBreakpoint);
44
49
  useIsomorphicLayoutEffect(() => {
45
50
  if (context.update) {
@@ -50,13 +55,13 @@ const SelectViewport = SelectViewportFrame.styleable(
50
55
  forwardedRef,
51
56
  context.floatingContext?.refs.setFloating
52
57
  );
53
- if (context.shouldRenderWebNative) {
58
+ if (itemContext.shouldRenderWebNative) {
54
59
  return <>{children}</>;
55
60
  }
56
61
  if (breakpointActive || !isWeb) {
57
- return <PortalItem hostName={`${context.scopeKey}SheetContents`}><ForwardSelectContext context={context}>{children}</ForwardSelectContext></PortalItem>;
62
+ return <PortalItem hostName={`${context.scopeKey}SheetContents`}><ForwardSelectContext itemContext={itemContext} context={context}>{children}</ForwardSelectContext></PortalItem>;
58
63
  }
59
- if (!context.interactions) {
64
+ if (!itemContext.interactions) {
60
65
  if (process.env.NODE_ENV === "development") {
61
66
  console.warn(`No interactions provided to Select, potentially missing Adapt`);
62
67
  }
@@ -65,7 +70,7 @@ const SelectViewport = SelectViewportFrame.styleable(
65
70
  const {
66
71
  style: { scrollbarWidth, listStyleType, overflow, ...restStyle },
67
72
  ...floatingProps
68
- } = context.interactions.getFloatingProps();
73
+ } = itemContext.interactions.getFloatingProps();
69
74
  return <>
70
75
  {!disableScroll && !props.unstyled && <style
71
76
  dangerouslySetInnerHTML={{
@@ -74,7 +79,7 @@ const SelectViewport = SelectViewportFrame.styleable(
74
79
  />}
75
80
  <FloatingFocusManager context={context.floatingContext}><AnimatePresence>{context.open ? <SelectViewportFrame
76
81
  key="select-viewport"
77
- size={context.size}
82
+ size={itemContext.size}
78
83
  role="presentation"
79
84
  {...viewportProps}
80
85
  ref={composedRefs}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/SelectViewport.tsx"],
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,QAAI,CAAC,QAAQ,cAAc;AACzB,UAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,gBAAQ,KAAK,+DAA+D;AAAA,MAC9E;AAEA,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,MACJ,OAAO,EAAE,gBAAgB,eAAe,UAAU,GAAG,UAAU;AAAA,MAC/D,GAAG;AAAA,IACL,IAAI,QAAQ,aAAa,iBAAiB;AAE1C,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;",
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;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,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,cAAc,2BAA2B,eAAe,aAAa;AAC3E,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,YAAY,uBAAuB;AACrC,aAAO,GAAG,SAAS;AAAA,IACrB;AAEA,QAAI,oBAAoB,CAAC,OAAO;AAC9B,aACE,CAAC,WAAW,UAAU,GAAG,QAAQ,yBAC/B,CAAC,qBAAqB,aAAa,aAAa,SAAS,UACtD,SACH,EAFC,qBAGH,EAJC;AAAA,IAML;AAEA,QAAI,CAAC,YAAY,cAAc;AAC7B,UAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,gBAAQ,KAAK,+DAA+D;AAAA,MAC9E;AAEA,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,MACJ,OAAO,EAAE,gBAAgB,eAAe,UAAU,GAAG,UAAU;AAAA,MAC/D,GAAG;AAAA,IACL,IAAI,YAAY,aAAa,iBAAiB;AAE9C,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,YAAY;AAAA,QAElB,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
5
  "names": ["SelectViewport"]
6
6
  }
@@ -2,14 +2,25 @@ import { createContextScope } from "@tamagui/create-context";
2
2
  import { SELECT_NAME } from "./constants";
3
3
  const [createSelectContext, createSelectScope] = createContextScope(SELECT_NAME);
4
4
  const [SelectProvider, useSelectContext] = createSelectContext(SELECT_NAME);
5
- const ForwardSelectContext = (props) => {
6
- return <SelectProvider isInSheet scope={props.__scopeSelect} {...props.context}>{props.children}</SelectProvider>;
5
+ const [createSelectItemParentContext, createSelectItemParentScope] = createContextScope(SELECT_NAME + "ItemParent");
6
+ const [SelectItemParentProvider, useSelectItemParentContext] = createSelectContext(SELECT_NAME);
7
+ const ForwardSelectContext = ({
8
+ __scopeSelect,
9
+ context,
10
+ itemContext,
11
+ children
12
+ }) => {
13
+ return <SelectProvider isInSheet scope={__scopeSelect} {...context}><SelectItemParentProvider scope={__scopeSelect} {...itemContext}>{children}</SelectItemParentProvider></SelectProvider>;
7
14
  };
8
15
  export {
9
16
  ForwardSelectContext,
17
+ SelectItemParentProvider,
10
18
  SelectProvider,
11
19
  createSelectContext,
20
+ createSelectItemParentContext,
21
+ createSelectItemParentScope,
12
22
  createSelectScope,
13
- useSelectContext
23
+ useSelectContext,
24
+ useSelectItemParentContext
14
25
  };
15
26
  //# sourceMappingURL=context.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/context.tsx"],
4
- "mappings": "AAAA,SAAS,0BAA0B;AAEnC,SAAS,mBAAmB;AAGrB,MAAM,CAAC,qBAAqB,iBAAiB,IAClD,mBAAmB,WAAW;AAEzB,MAAM,CAAC,gBAAgB,gBAAgB,IAC5C,oBAAwC,WAAW;AAE9C,MAAM,uBAAuB,CAClC,UACG;AACH,SACE,CAAC,eAAe,UAAU,OAAO,MAAM,mBAAmB,MAAM,UAC7D,MAAM,SACT,EAFC;AAIL;",
4
+ "mappings": "AAAA,SAAS,0BAA0B;AAEnC,SAAS,mBAAmB;AAGrB,MAAM,CAAC,qBAAqB,iBAAiB,IAAI,mBAAmB,WAAW;AAE/E,MAAM,CAAC,gBAAgB,gBAAgB,IAC5C,oBAAwC,WAAW;AAI9C,MAAM,CAAC,+BAA+B,2BAA2B,IACtE,mBAAmB,cAAc,YAAY;AAExC,MAAM,CAAC,0BAA0B,0BAA0B,IAChE,oBAAkD,WAAW;AAExD,MAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAIO;AACL,SACE,CAAC,eAAe,UAAU,OAAO,mBAAmB,SAClD,CAAC,yBAAyB,OAAO,mBAAmB,cACjD,SACH,EAFC,yBAGH,EAJC;AAML;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/select",
3
- "version": "1.47.4",
3
+ "version": "1.47.6",
4
4
  "sideEffects": [
5
5
  "*.css"
6
6
  ],
@@ -34,23 +34,23 @@
34
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
- "@tamagui/adapt": "1.47.4",
38
- "@tamagui/animate-presence": "1.47.4",
39
- "@tamagui/compose-refs": "1.47.4",
40
- "@tamagui/core": "1.47.4",
41
- "@tamagui/create-context": "1.47.4",
42
- "@tamagui/dismissable": "1.47.4",
43
- "@tamagui/focus-scope": "1.47.4",
44
- "@tamagui/get-token": "1.47.4",
45
- "@tamagui/list-item": "1.47.4",
46
- "@tamagui/portal": "1.47.4",
47
- "@tamagui/separator": "1.47.4",
48
- "@tamagui/sheet": "1.47.4",
49
- "@tamagui/stacks": "1.47.4",
50
- "@tamagui/text": "1.47.4",
51
- "@tamagui/use-controllable-state": "1.47.4",
52
- "@tamagui/use-event": "1.47.4",
53
- "@tamagui/use-previous": "1.47.4"
37
+ "@tamagui/adapt": "1.47.6",
38
+ "@tamagui/animate-presence": "1.47.6",
39
+ "@tamagui/compose-refs": "1.47.6",
40
+ "@tamagui/core": "1.47.6",
41
+ "@tamagui/create-context": "1.47.6",
42
+ "@tamagui/dismissable": "1.47.6",
43
+ "@tamagui/focus-scope": "1.47.6",
44
+ "@tamagui/get-token": "1.47.6",
45
+ "@tamagui/list-item": "1.47.6",
46
+ "@tamagui/portal": "1.47.6",
47
+ "@tamagui/separator": "1.47.6",
48
+ "@tamagui/sheet": "1.47.6",
49
+ "@tamagui/stacks": "1.47.6",
50
+ "@tamagui/text": "1.47.6",
51
+ "@tamagui/use-controllable-state": "1.47.6",
52
+ "@tamagui/use-event": "1.47.6",
53
+ "@tamagui/use-previous": "1.47.6"
54
54
  },
55
55
  "peerDependencies": {
56
56
  "react": "*",
@@ -58,7 +58,7 @@
58
58
  "react-native": "*"
59
59
  },
60
60
  "devDependencies": {
61
- "@tamagui/build": "1.47.4",
61
+ "@tamagui/build": "1.47.6",
62
62
  "react": "^18.2.0",
63
63
  "react-dom": "^18.2.0",
64
64
  "react-native": "^0.72.1"
package/src/Select.tsx CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  getVariableValue,
9
9
  isWeb,
10
10
  styled,
11
+ useEvent,
11
12
  useGet,
12
13
  useIsomorphicLayoutEffect,
13
14
  withStaticProperties,
@@ -23,7 +24,13 @@ import { useControllableState } from '@tamagui/use-controllable-state'
23
24
  import * as React from 'react'
24
25
 
25
26
  import { SELECT_NAME } from './constants'
26
- import { SelectProvider, createSelectContext, useSelectContext } from './context'
27
+ import {
28
+ SelectItemParentProvider,
29
+ SelectProvider,
30
+ createSelectContext,
31
+ useSelectContext,
32
+ useSelectItemParentContext,
33
+ } from './context'
27
34
  import { SelectContent } from './SelectContent'
28
35
  import { SelectInlineImpl } from './SelectImpl'
29
36
  import { SelectItem, useSelectItemContext } from './SelectItem'
@@ -62,6 +69,7 @@ const SelectValue = SelectValueFrame.styleable<SelectValueProps>(function Select
62
69
  ) {
63
70
  // We ignore `className` and `style` as this part shouldn't be styled.
64
71
  const context = useSelectContext(VALUE_NAME, __scopeSelect)
72
+ const itemParentContext = useSelectItemParentContext(VALUE_NAME, __scopeSelect)
65
73
  const composedRefs = useComposedRefs(forwardedRef, context.onValueNodeChange)
66
74
  const children = childrenProp ?? context.selectedItem
67
75
  const isEmptyValue = context.value == null || context.value === ''
@@ -69,7 +77,7 @@ const SelectValue = SelectValueFrame.styleable<SelectValueProps>(function Select
69
77
 
70
78
  return (
71
79
  <SelectValueFrame
72
- size={context.size as any}
80
+ size={itemParentContext.size as any}
73
81
  ref={composedRefs}
74
82
  // we don't want events from the portalled `SelectValue` children to bubble
75
83
  // through the item they came from
@@ -135,6 +143,7 @@ const SelectItemText = React.forwardRef<TamaguiTextElement, SelectItemTextProps>
135
143
  (props: ScopedProps<SelectItemTextProps>, forwardedRef) => {
136
144
  const { __scopeSelect, className, ...itemTextProps } = props
137
145
  const context = useSelectContext(ITEM_TEXT_NAME, __scopeSelect)
146
+ const itemParentContext = useSelectItemParentContext(ITEM_TEXT_NAME, __scopeSelect)
138
147
  const ref = React.useRef<TamaguiTextElement | null>(null)
139
148
  const composedRefs = useComposedRefs(forwardedRef, ref)
140
149
  const itemContext = useSelectItemContext(ITEM_TEXT_NAME, __scopeSelect)
@@ -143,14 +152,14 @@ const SelectItemText = React.forwardRef<TamaguiTextElement, SelectItemTextProps>
143
152
  () => (
144
153
  <SelectItemTextFrame
145
154
  className={className}
146
- size={context.size as any}
155
+ size={itemParentContext.size as any}
147
156
  id={itemContext.textId}
148
157
  {...itemTextProps}
149
158
  ref={composedRefs}
150
159
  />
151
160
  ),
152
161
  // eslint-disable-next-line react-hooks/exhaustive-deps
153
- [props, context.size, className, itemContext.textId]
162
+ [props, itemParentContext.size, className, itemContext.textId]
154
163
  )
155
164
 
156
165
  // until portals work in sub-trees on RN, use this just for native:
@@ -161,7 +170,7 @@ const SelectItemText = React.forwardRef<TamaguiTextElement, SelectItemTextProps>
161
170
  // eslint-disable-next-line react-hooks/exhaustive-deps
162
171
  }, [isSelected, contents])
163
172
 
164
- if (context.shouldRenderWebNative) {
173
+ if (itemParentContext.shouldRenderWebNative) {
165
174
  return <>{props.children}</>
166
175
  }
167
176
 
@@ -199,7 +208,7 @@ type SelectItemIndicatorProps = GetProps<typeof SelectItemIndicatorFrame>
199
208
  const SelectItemIndicator = React.forwardRef<TamaguiElement, SelectItemIndicatorProps>(
200
209
  (props: ScopedProps<SelectItemIndicatorProps>, forwardedRef) => {
201
210
  const { __scopeSelect, ...itemIndicatorProps } = props
202
- const context = useSelectContext(ITEM_INDICATOR_NAME, __scopeSelect)
211
+ const context = useSelectItemParentContext(ITEM_INDICATOR_NAME, __scopeSelect)
203
212
  const itemContext = useSelectItemContext(ITEM_INDICATOR_NAME, __scopeSelect)
204
213
 
205
214
  if (context.shouldRenderWebNative) {
@@ -279,18 +288,19 @@ const SelectGroup = React.forwardRef<TamaguiElement, SelectGroupProps>(
279
288
  const groupId = React.useId()
280
289
 
281
290
  const context = useSelectContext(GROUP_NAME, __scopeSelect)
282
- const size = context.size ?? '$true'
291
+ const itemParentContext = useSelectItemParentContext(GROUP_NAME, __scopeSelect)
292
+ const size = itemParentContext.size ?? '$true'
283
293
  const nativeSelectRef = React.useRef<HTMLSelectElement>(null)
284
294
 
285
295
  const content = (function () {
286
- if (context.shouldRenderWebNative) {
296
+ if (itemParentContext.shouldRenderWebNative) {
287
297
  return (
288
298
  // @ts-expect-error until we support typing based on tag
289
299
  <NativeSelectFrame asChild size={size} value={context.value}>
290
300
  <NativeSelectTextFrame
291
301
  // @ts-ignore it's ok since tag="select"
292
302
  onChange={(event: React.ChangeEvent<HTMLSelectElement>) => {
293
- context.onChange(event.currentTarget.value)
303
+ itemParentContext.onChange(event.currentTarget.value)
294
304
  }}
295
305
  size={size as FontSizeTokens}
296
306
  ref={nativeSelectRef}
@@ -336,7 +346,7 @@ export type SelectLabelProps = ListItemProps
336
346
  const SelectLabel = React.forwardRef<TamaguiElement, SelectLabelProps>(
337
347
  (props: ScopedProps<SelectLabelProps>, forwardedRef) => {
338
348
  const { __scopeSelect, ...labelProps } = props
339
- const context = useSelectContext(LABEL_NAME, __scopeSelect)
349
+ const context = useSelectItemParentContext(LABEL_NAME, __scopeSelect)
340
350
  const groupContext = useSelectGroupContext(LABEL_NAME, __scopeSelect)
341
351
 
342
352
  if (context.shouldRenderWebNative) {
@@ -446,6 +456,17 @@ export const Select = withStaticProperties(
446
456
  })
447
457
 
448
458
  const [activeIndex, setActiveIndex] = React.useState<number | null>(0)
459
+
460
+ const [emitValue, valueSubscribe] = useEmitter<any>()
461
+ const [emitActiveIndex, activeIndexSubscribe] = useEmitter<number>()
462
+
463
+ React.useEffect(() => {
464
+ // to go after the item mount 🤷‍♂️
465
+ queueMicrotask(() => {
466
+ emitValue(value)
467
+ })
468
+ }, [value])
469
+
449
470
  const selectedIndexRef = React.useRef<number | null>(null)
450
471
  const activeIndexRef = React.useRef<number | null>(null)
451
472
  const listContentRef = React.useRef<string[]>([])
@@ -465,50 +486,64 @@ export const Select = withStaticProperties(
465
486
 
466
487
  return (
467
488
  <AdaptProvider>
468
- <SelectProvider
469
- dir={dir}
470
- blockSelection={false}
471
- size={sizeProp}
472
- fallback={false}
473
- selectedItem={selectedItem}
474
- setSelectedItem={setSelectedItem}
475
- forceUpdate={forceUpdate}
476
- valueNode={valueNode}
477
- onValueNodeChange={setValueNode}
478
- scopeKey={scopeKey}
479
- sheetBreakpoint={sheetBreakpoint}
489
+ <SelectItemParentProvider
480
490
  scope={__scopeSelect}
481
- setValueAtIndex={(index, value) => {
482
- listContentRef.current[index] = value
483
- }}
484
- activeIndex={activeIndex}
485
- onChange={setValue}
486
- selectedIndex={selectedIndex}
487
- setActiveIndex={setActiveIndex}
491
+ size={sizeProp}
492
+ activeIndexSubscribe={activeIndexSubscribe}
493
+ valueSubscribe={valueSubscribe}
488
494
  setOpen={setOpen}
495
+ onChange={React.useCallback((val) => {
496
+ setValue(val)
497
+ emitValue(val)
498
+ }, [])}
489
499
  setSelectedIndex={setSelectedIndex}
490
- value={value}
491
- open={open}
492
- native={native}
500
+ setValueAtIndex={React.useCallback((index, value) => {
501
+ listContentRef.current[index] = value
502
+ }, [])}
493
503
  shouldRenderWebNative={shouldRenderWebNative}
494
504
  >
495
- <SelectSheetController onOpenChange={setOpen} __scopeSelect={__scopeSelect}>
496
- {shouldRenderWebNative ? (
497
- children
498
- ) : (
499
- <SelectImpl
500
- activeIndexRef={activeIndexRef}
501
- listContentRef={listContentRef}
502
- selectedIndexRef={selectedIndexRef}
503
- {...props}
504
- open={open}
505
- value={value}
506
- >
507
- {children}
508
- </SelectImpl>
509
- )}
510
- </SelectSheetController>
511
- </SelectProvider>
505
+ <SelectProvider
506
+ scope={__scopeSelect}
507
+ dir={dir}
508
+ blockSelection={false}
509
+ fallback={false}
510
+ selectedItem={selectedItem}
511
+ setSelectedItem={setSelectedItem}
512
+ forceUpdate={forceUpdate}
513
+ valueNode={valueNode}
514
+ onValueNodeChange={setValueNode}
515
+ scopeKey={scopeKey}
516
+ sheetBreakpoint={sheetBreakpoint}
517
+ activeIndex={activeIndex}
518
+ selectedIndex={selectedIndex}
519
+ setActiveIndex={React.useCallback((index) => {
520
+ setActiveIndex(index)
521
+ if (typeof index === 'number') {
522
+ emitActiveIndex(index)
523
+ }
524
+ }, [])}
525
+ value={value}
526
+ open={open}
527
+ native={native}
528
+ >
529
+ <SelectSheetController onOpenChange={setOpen} __scopeSelect={__scopeSelect}>
530
+ {shouldRenderWebNative ? (
531
+ children
532
+ ) : (
533
+ <SelectImpl
534
+ activeIndexRef={activeIndexRef}
535
+ listContentRef={listContentRef}
536
+ selectedIndexRef={selectedIndexRef}
537
+ {...props}
538
+ open={open}
539
+ value={value}
540
+ >
541
+ {children}
542
+ </SelectImpl>
543
+ )}
544
+ </SelectSheetController>
545
+ </SelectProvider>
546
+ </SelectItemParentProvider>
512
547
  </AdaptProvider>
513
548
  )
514
549
  },
@@ -530,5 +565,22 @@ export const Select = withStaticProperties(
530
565
  }
531
566
  )
532
567
 
568
+ function useEmitter<A>() {
569
+ const listeners = React.useRef<Set<Function>>()
570
+ if (!listeners.current) {
571
+ listeners.current = new Set()
572
+ }
573
+ const emit = (value: A) => {
574
+ listeners.current!.forEach((l) => l(value))
575
+ }
576
+ const subscribe = React.useCallback((listener: (val: A) => void) => {
577
+ listeners.current!.add(listener)
578
+ return () => {
579
+ listeners.current!.delete(listener)
580
+ }
581
+ }, [])
582
+ return [emit, subscribe] as const
583
+ }
584
+
533
585
  // @ts-ignore
534
586
  Select.displayName = SELECT_NAME
@@ -2,7 +2,7 @@ import { FloatingOverlay, FloatingPortal } from '@floating-ui/react'
2
2
  import { Theme, useIsTouchDevice, useThemeName } from '@tamagui/core'
3
3
  import { FocusScope, FocusScopeProps } from '@tamagui/focus-scope'
4
4
 
5
- import { useSelectContext } from './context'
5
+ import { useSelectContext, useSelectItemParentContext } from './context'
6
6
  import { SelectContentProps } from './types'
7
7
  import { useShowSelectSheet } from './useSelectBreakpointActive'
8
8
 
@@ -19,6 +19,7 @@ export const SelectContent = ({
19
19
  ...focusScopeProps
20
20
  }: SelectContentProps & FocusScopeProps) => {
21
21
  const context = useSelectContext(CONTENT_NAME, __scopeSelect)
22
+ const itemParentContext = useSelectItemParentContext(CONTENT_NAME, __scopeSelect)
22
23
  const themeName = useThemeName()
23
24
  const showSheet = useShowSelectSheet(context)
24
25
 
@@ -30,7 +31,7 @@ export const SelectContent = ({
30
31
 
31
32
  const touch = useIsTouchDevice()
32
33
 
33
- if (context.shouldRenderWebNative) {
34
+ if (itemParentContext.shouldRenderWebNative) {
34
35
  return <>{children}</>
35
36
  }
36
37