@tamagui/select 1.0.1-beta.151 → 1.0.1-beta.152

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 (48) hide show
  1. package/dist/cjs/BubbleSelect.js +24 -19
  2. package/dist/cjs/BubbleSelect.js.map +1 -1
  3. package/dist/cjs/Select.js +342 -301
  4. package/dist/cjs/Select.js.map +2 -2
  5. package/dist/cjs/SelectContent.js +18 -15
  6. package/dist/cjs/SelectContent.js.map +1 -1
  7. package/dist/cjs/SelectContent.native.js.map +1 -1
  8. package/dist/cjs/SelectImpl.js +9 -4
  9. package/dist/cjs/SelectImpl.js.map +2 -2
  10. package/dist/cjs/SelectScrollButton.js +109 -95
  11. package/dist/cjs/SelectScrollButton.js.map +2 -2
  12. package/dist/cjs/SelectViewport.js +49 -35
  13. package/dist/cjs/SelectViewport.js.map +2 -2
  14. package/dist/cjs/SelectViewport.native.js +5 -7
  15. package/dist/cjs/SelectViewport.native.js.map +1 -1
  16. package/dist/cjs/context.js.map +1 -1
  17. package/dist/esm/BubbleSelect.js +20 -18
  18. package/dist/esm/BubbleSelect.js.map +1 -1
  19. package/dist/esm/Select.js +338 -300
  20. package/dist/esm/Select.js.map +2 -2
  21. package/dist/esm/SelectContent.js +18 -12
  22. package/dist/esm/SelectContent.js.map +1 -1
  23. package/dist/esm/SelectContent.native.js.map +1 -1
  24. package/dist/esm/SelectImpl.js +5 -3
  25. package/dist/esm/SelectImpl.js.map +2 -2
  26. package/dist/esm/SelectScrollButton.js +105 -94
  27. package/dist/esm/SelectScrollButton.js.map +2 -2
  28. package/dist/esm/SelectViewport.js +45 -34
  29. package/dist/esm/SelectViewport.js.map +1 -1
  30. package/dist/esm/SelectViewport.native.js +5 -4
  31. package/dist/esm/SelectViewport.native.js.map +1 -1
  32. package/dist/esm/context.js.map +1 -1
  33. package/dist/esm/index.js.map +1 -1
  34. package/dist/jsx/BubbleSelect.js +20 -18
  35. package/dist/jsx/BubbleSelect.js.map +1 -1
  36. package/dist/jsx/Select.js +217 -196
  37. package/dist/jsx/Select.js.map +2 -2
  38. package/dist/jsx/SelectContent.js.map +1 -1
  39. package/dist/jsx/SelectContent.native.js.map +1 -1
  40. package/dist/jsx/SelectImpl.js.map +2 -2
  41. package/dist/jsx/SelectScrollButton.js +79 -69
  42. package/dist/jsx/SelectScrollButton.js.map +1 -1
  43. package/dist/jsx/SelectViewport.js +25 -23
  44. package/dist/jsx/SelectViewport.js.map +1 -1
  45. package/dist/jsx/SelectViewport.native.js.map +1 -1
  46. package/dist/jsx/context.js.map +1 -1
  47. package/dist/jsx/index.js.map +1 -1
  48. package/package.json +12 -12
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/SelectViewport.tsx"],
4
4
  "sourcesContent": ["import { FloatingFocusManager } from '@floating-ui/react-dom-interactions'\nimport { TamaguiElement, isWeb } from '@tamagui/core'\nimport { styled } from '@tamagui/core'\nimport { PortalItem } from '@tamagui/portal'\nimport { ThemeableStack } from '@tamagui/stacks'\nimport * as React from 'react'\n\nimport { VIEWPORT_NAME } from './constants'\nimport { useSelectContext } from './context'\nimport { useSelectBreakpointActive } from './Select'\nimport { ScopedProps, SelectViewportProps } from './types'\n\n/* -------------------------------------------------------------------------------------------------\n * SelectViewport\n * -----------------------------------------------------------------------------------------------*/\n\nexport const SelectViewportFrame = styled(ThemeableStack, {\n name: VIEWPORT_NAME,\n backgroundColor: '$background',\n elevate: true,\n bordered: true,\n overflow: 'scroll',\n userSelect: 'none',\n\n variants: {\n size: {\n '...size': (val, { tokens }) => {\n return {\n borderRadius: tokens.radius[val] ?? val,\n }\n },\n },\n },\n\n defaultVariants: {\n size: '$2',\n },\n})\n\nexport const SelectViewport = React.forwardRef<TamaguiElement, SelectViewportProps>(\n (props: ScopedProps<SelectViewportProps>, forwardedRef) => {\n const { __scopeSelect, children, ...viewportProps } = props\n const context = useSelectContext(VIEWPORT_NAME, __scopeSelect)\n const breakpointActive = useSelectBreakpointActive(context.sheetBreakpoint)\n\n if (breakpointActive || !isWeb) {\n return <PortalItem hostName={`${context.scopeKey}SheetContents`}>{children}</PortalItem>\n }\n\n if (!context.floatingContext) {\n return null\n }\n\n if (!context.open) {\n return children\n }\n\n const {\n style: { scrollbarWidth, listStyleType, ...restStyle },\n ...floatingProps\n } = context.interactions!.getFloatingProps()\n\n return (\n <>\n <style\n dangerouslySetInnerHTML={{\n __html: selectViewportCSS,\n }}\n />\n <FloatingFocusManager context={context.floatingContext} preventTabbing>\n <SelectViewportFrame\n size={context.size}\n // @ts-ignore\n role=\"presentation\"\n {...viewportProps}\n ref={forwardedRef}\n {...floatingProps}\n {...restStyle}\n >\n {children}\n </SelectViewportFrame>\n </FloatingFocusManager>\n </>\n )\n }\n)\n\nSelectViewport.displayName = VIEWPORT_NAME\n\nconst selectViewportCSS = `\n.is_SelectViewport {\n scrollbar-width: none;\n -webkit-overflow-scrolling: touch;\n overscroll-behavior: contain;\n}\n\n.is_SelectViewport::-webkit-scrollbar{\n display:none\n}\n`\n"],
5
- "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAOO,MAAM,sBAAsB,OAAO,gBAAgB;AAAA,EACxD,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EAEZ,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,WAAW,CAAC,KAAK,EAAE,aAAa;AAC9B,eAAO;AAAA,UACL,cAAc,OAAO,OAAO,QAAQ;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF,CAAC;AAEM,MAAM,iBAAiB,MAAM,WAClC,CAAC,OAAyC,iBAAiB;AACzD,QAAM,EAAE,eAAe,aAAa,kBAAkB;AACtD,QAAM,UAAU,iBAAiB,eAAe,aAAa;AAC7D,QAAM,mBAAmB,0BAA0B,QAAQ,eAAe;AAE1E,MAAI,oBAAoB,CAAC,OAAO;AAC9B,WAAO,oCAAC;AAAA,MAAW,UAAU,GAAG,QAAQ;AAAA,OAA0B,QAAS;AAAA,EAC7E;AAEA,MAAI,CAAC,QAAQ,iBAAiB;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,MAAM;AACjB,WAAO;AAAA,EACT;AAEA,QAAM;AAAA,IACJ,OAAO,EAAE,gBAAgB,kBAAkB;AAAA,OACxC;AAAA,MACD,QAAQ,aAAc,iBAAiB;AAE3C,SACE,0DACE,oCAAC;AAAA,IACC,yBAAyB;AAAA,MACvB,QAAQ;AAAA,IACV;AAAA,GACF,GACA,oCAAC;AAAA,IAAqB,SAAS,QAAQ;AAAA,IAAiB,gBAAc;AAAA,KACpE,oCAAC;AAAA,IACC,MAAM,QAAQ;AAAA,IAEd,MAAK;AAAA,IACJ,GAAG;AAAA,IACJ,KAAK;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,KAEH,QACH,CACF,CACF;AAEJ,CACF;AAEA,eAAe,cAAc;AAE7B,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
5
+ "mappings": "AA8Ca,SAiBP,UAjBO,KAiBP,YAjBO;AA9Cb,SAAS,4BAA4B;AACrC,SAAyB,aAAa;AACtC,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,YAAY,WAAW;AAEvB,SAAS,qBAAqB;AAC9B,SAAS,wBAAwB;AACjC,SAAS,iCAAiC;AAOnC,MAAM,sBAAsB,OAAO,gBAAgB;AAAA,EACxD,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EAEZ,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,WAAW,CAAC,KAAK,EAAE,OAAO,MAAM;AAC9B,eAAO;AAAA,UACL,cAAc,OAAO,OAAO,QAAQ;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,aAAa,cAAc,IAAI;AACtD,UAAM,UAAU,iBAAiB,eAAe,aAAa;AAC7D,UAAM,mBAAmB,0BAA0B,QAAQ,eAAe;AAE1E,QAAI,oBAAoB,CAAC,OAAO;AAC9B,aAAO,oBAAC;AAAA,QAAW,UAAU,GAAG,QAAQ;AAAA,QAA0B;AAAA,OAAS;AAAA,IAC7E;AAEA,QAAI,CAAC,QAAQ,iBAAiB;AAC5B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,QAAQ,MAAM;AACjB,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,MACJ,OAAO,EAAE,gBAAgB,kBAAkB,UAAU;AAAA,SAClD;AAAA,IACL,IAAI,QAAQ,aAAc,iBAAiB;AAE3C,WACE;AAAA,MACE;AAAA,4BAAC;AAAA,UACC,yBAAyB;AAAA,YACvB,QAAQ;AAAA,UACV;AAAA,SACF;AAAA,QACA,oBAAC;AAAA,UAAqB,SAAS,QAAQ;AAAA,UAAiB,gBAAc;AAAA,UACpE,8BAAC;AAAA,YACC,MAAM,QAAQ;AAAA,YAEd,MAAK;AAAA,YACJ,GAAG;AAAA,YACJ,KAAK;AAAA,YACJ,GAAG;AAAA,YACH,GAAG;AAAA,YAEH;AAAA,WACH;AAAA,SACF;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;AAE7B,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -1,13 +1,14 @@
1
+ import { jsx } from "react/jsx-runtime";
1
2
  import { PortalItem } from "@tamagui/portal";
2
- import * as React from "react";
3
3
  import { VIEWPORT_NAME } from "./constants";
4
4
  import { useSelectContext } from "./context";
5
5
  const SelectViewport = (props) => {
6
6
  const { __scopeSelect, children } = props;
7
7
  const context = useSelectContext(VIEWPORT_NAME, __scopeSelect);
8
- return /* @__PURE__ */ React.createElement(PortalItem, {
9
- hostName: `${context.scopeKey}SheetContents`
10
- }, children);
8
+ return /* @__PURE__ */ jsx(PortalItem, {
9
+ hostName: `${context.scopeKey}SheetContents`,
10
+ children
11
+ });
11
12
  };
12
13
  SelectViewport.displayName = VIEWPORT_NAME;
13
14
  export {
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/SelectViewport.native.tsx"],
4
4
  "sourcesContent": ["import { PortalItem } from '@tamagui/portal'\nimport * as React from 'react'\n\nimport { VIEWPORT_NAME } from './constants'\nimport { useSelectContext } from './context'\nimport { ScopedProps, SelectViewportProps } from './types'\n\nexport const SelectViewport = (props: ScopedProps<SelectViewportProps>) => {\n const { __scopeSelect, children } = props\n const context = useSelectContext(VIEWPORT_NAME, __scopeSelect)\n return <PortalItem hostName={`${context.scopeKey}SheetContents`}>{children}</PortalItem>\n}\n\nSelectViewport.displayName = VIEWPORT_NAME\n"],
5
- "mappings": "AAAA;AACA;AAEA;AACA;AAGO,MAAM,iBAAiB,CAAC,UAA4C;AACzE,QAAM,EAAE,eAAe,aAAa;AACpC,QAAM,UAAU,iBAAiB,eAAe,aAAa;AAC7D,SAAO,oCAAC;AAAA,IAAW,UAAU,GAAG,QAAQ;AAAA,KAA0B,QAAS;AAC7E;AAEA,eAAe,cAAc;",
5
+ "mappings": "AAUS;AAVT,SAAS,kBAAkB;AAG3B,SAAS,qBAAqB;AAC9B,SAAS,wBAAwB;AAG1B,MAAM,iBAAiB,CAAC,UAA4C;AACzE,QAAM,EAAE,eAAe,SAAS,IAAI;AACpC,QAAM,UAAU,iBAAiB,eAAe,aAAa;AAC7D,SAAO,oBAAC;AAAA,IAAW,UAAU,GAAG,QAAQ;AAAA,IAA0B;AAAA,GAAS;AAC7E;AAEA,eAAe,cAAc;",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/context.tsx"],
4
4
  "sourcesContent": ["import { createContextScope } from '@tamagui/create-context'\n\nimport { SELECT_NAME } from './constants'\nimport { SelectContextValue } from './types'\n\nexport const [createSelectContext, createSelectScope] = createContextScope(SELECT_NAME)\n\nexport const [SelectProvider, useSelectContext] =\n createSelectContext<SelectContextValue>(SELECT_NAME)\n"],
5
- "mappings": "AAAA;AAEA;AAGO,MAAM,CAAC,qBAAqB,qBAAqB,mBAAmB,WAAW;AAE/E,MAAM,CAAC,gBAAgB,oBAC5B,oBAAwC,WAAW;",
5
+ "mappings": "AAAA,SAAS,0BAA0B;AAEnC,SAAS,mBAAmB;AAGrB,MAAM,CAAC,qBAAqB,iBAAiB,IAAI,mBAAmB,WAAW;AAE/E,MAAM,CAAC,gBAAgB,gBAAgB,IAC5C,oBAAwC,WAAW;",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.tsx"],
4
4
  "sourcesContent": ["export * from './Select'\nexport type {\n SelectContentProps,\n SelectProps,\n SelectScrollButtonProps,\n SelectViewportProps,\n} from './types'\nexport * from './context'\n"],
5
- "mappings": "AAAA;AAOA;",
5
+ "mappings": "AAAA,cAAc;AAOd,cAAc;",
6
6
  "names": []
7
7
  }
@@ -1,22 +1,24 @@
1
1
  import { usePrevious } from "@radix-ui/react-use-previous";
2
2
  import { useComposedRefs } from "@tamagui/compose-refs";
3
3
  import * as React from "react";
4
- const BubbleSelect = React.forwardRef((props, forwardedRef) => {
5
- const { value, ...selectProps } = props;
6
- const ref = React.useRef(null);
7
- const composedRefs = useComposedRefs(forwardedRef, ref);
8
- const prevValue = usePrevious(value);
9
- React.useEffect(() => {
10
- const select = ref.current;
11
- const selectProto = window.HTMLSelectElement.prototype;
12
- const descriptor = Object.getOwnPropertyDescriptor(selectProto, "value");
13
- const setValue = descriptor.set;
14
- if (prevValue !== value && setValue) {
15
- const event = new Event("change", { bubbles: true });
16
- setValue.call(select, value);
17
- select.dispatchEvent(event);
18
- }
19
- }, [prevValue, value]);
20
- return null;
21
- });
4
+ const BubbleSelect = React.forwardRef(
5
+ (props, forwardedRef) => {
6
+ const { value, ...selectProps } = props;
7
+ const ref = React.useRef(null);
8
+ const composedRefs = useComposedRefs(forwardedRef, ref);
9
+ const prevValue = usePrevious(value);
10
+ React.useEffect(() => {
11
+ const select = ref.current;
12
+ const selectProto = window.HTMLSelectElement.prototype;
13
+ const descriptor = Object.getOwnPropertyDescriptor(selectProto, "value");
14
+ const setValue = descriptor.set;
15
+ if (prevValue !== value && setValue) {
16
+ const event = new Event("change", { bubbles: true });
17
+ setValue.call(select, value);
18
+ select.dispatchEvent(event);
19
+ }
20
+ }, [prevValue, value]);
21
+ return null;
22
+ }
23
+ );
22
24
  //# sourceMappingURL=BubbleSelect.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/BubbleSelect.tsx"],
4
4
  "sourcesContent": ["import { usePrevious } from '@radix-ui/react-use-previous'\nimport { useComposedRefs } from '@tamagui/compose-refs'\nimport * as React from 'react'\n\n/* -----------------------------------------------------------------------------------------------*/\nconst BubbleSelect = React.forwardRef<HTMLSelectElement, React.ComponentPropsWithoutRef<'select'>>(\n (props, forwardedRef) => {\n const { value, ...selectProps } = props\n const ref = React.useRef<HTMLSelectElement>(null)\n const composedRefs = useComposedRefs(forwardedRef, ref)\n const prevValue = usePrevious(value)\n\n // Bubble value change to parents (e.g form change event)\n React.useEffect(() => {\n const select = ref.current!\n const selectProto = window.HTMLSelectElement.prototype\n const descriptor = Object.getOwnPropertyDescriptor(selectProto, 'value') as PropertyDescriptor\n const setValue = descriptor.set\n if (prevValue !== value && setValue) {\n const event = new Event('change', { bubbles: true })\n setValue.call(select, value)\n select.dispatchEvent(event)\n }\n }, [prevValue, value])\n\n /**\n * We purposefully use a `select` here to support form autofill as much\n * as possible.\n *\n * We purposefully do not add the `value` attribute here to allow the value\n * to be set programatically and bubble to any parent form `onChange` event.\n * Adding the `value` will cause React to consider the programatic\n * dispatch a duplicate and it will get swallowed.\n *\n * We use `VisuallyHidden` rather than `display: \"none\"` because Safari autofill\n * won't work otherwise.\n */\n // TODO\n return null\n // return (\n // <VisuallyHidden asChild>\n // <select {...selectProps} ref={composedRefs} defaultValue={value} />\n // </VisuallyHidden>\n // )\n }\n)\n"],
5
- "mappings": "AAAA;AACA;AACA;AAGA,MAAM,eAAe,MAAM,WACzB,CAAC,OAAO,iBAAiB;AACvB,QAAM,EAAE,UAAU,gBAAgB;AAClC,QAAM,MAAM,MAAM,OAA0B,IAAI;AAChD,QAAM,eAAe,gBAAgB,cAAc,GAAG;AACtD,QAAM,YAAY,YAAY,KAAK;AAGnC,QAAM,UAAU,MAAM;AACpB,UAAM,SAAS,IAAI;AACnB,UAAM,cAAc,OAAO,kBAAkB;AAC7C,UAAM,aAAa,OAAO,yBAAyB,aAAa,OAAO;AACvE,UAAM,WAAW,WAAW;AAC5B,QAAI,cAAc,SAAS,UAAU;AACnC,YAAM,QAAQ,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC;AACnD,eAAS,KAAK,QAAQ,KAAK;AAC3B,aAAO,cAAc,KAAK;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,WAAW,KAAK,CAAC;AAerB,SAAO;AAMT,CACF;",
5
+ "mappings": "AAAA,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,YAAY,WAAW;AAGvB,MAAM,eAAe,MAAM;AAAA,EACzB,CAAC,OAAO,iBAAiB;AACvB,UAAM,EAAE,UAAU,YAAY,IAAI;AAClC,UAAM,MAAM,MAAM,OAA0B,IAAI;AAChD,UAAM,eAAe,gBAAgB,cAAc,GAAG;AACtD,UAAM,YAAY,YAAY,KAAK;AAGnC,UAAM,UAAU,MAAM;AACpB,YAAM,SAAS,IAAI;AACnB,YAAM,cAAc,OAAO,kBAAkB;AAC7C,YAAM,aAAa,OAAO,yBAAyB,aAAa,OAAO;AACvE,YAAM,WAAW,WAAW;AAC5B,UAAI,cAAc,SAAS,UAAU;AACnC,cAAM,QAAQ,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC;AACnD,iBAAS,KAAK,QAAQ,KAAK;AAC3B,eAAO,cAAc,KAAK;AAAA,MAC5B;AAAA,IACF,GAAG,CAAC,WAAW,KAAK,CAAC;AAerB,WAAO;AAAA,EAMT;AACF;",
6
6
  "names": []
7
7
  }
@@ -18,38 +18,44 @@ import { SelectInlineImpl } from "./SelectImpl";
18
18
  import { SelectScrollDownButton, SelectScrollUpButton } from "./SelectScrollButton";
19
19
  import { SelectViewport } from "./SelectViewport";
20
20
  const TRIGGER_NAME = "SelectTrigger";
21
- const SelectTrigger = React.forwardRef((props, forwardedRef) => {
22
- const {
23
- __scopeSelect,
24
- disabled = false,
25
- "aria-labelledby": ariaLabelledby,
26
- ...triggerProps
27
- } = props;
28
- const context = useSelectContext(TRIGGER_NAME, __scopeSelect);
29
- const labelledBy = ariaLabelledby;
30
- return <ListItem componentName={TRIGGER_NAME} backgrounded radiused hoverTheme pressTheme focusTheme focusable borderWidth={1} size={context.size} aria-expanded={context.open} aria-autocomplete="none" aria-labelledby={labelledBy} dir={context.dir} disabled={disabled} data-disabled={disabled ? "" : void 0} {...triggerProps} ref={forwardedRef} {...process.env.TAMAGUI_TARGET === "web" && context.interactions ? context.interactions.getReferenceProps() : {
31
- onPress() {
32
- context.setOpen(!context.open);
33
- }
34
- }} />;
35
- });
21
+ const SelectTrigger = React.forwardRef(
22
+ (props, forwardedRef) => {
23
+ const {
24
+ __scopeSelect,
25
+ disabled = false,
26
+ "aria-labelledby": ariaLabelledby,
27
+ ...triggerProps
28
+ } = props;
29
+ const context = useSelectContext(TRIGGER_NAME, __scopeSelect);
30
+ const labelledBy = ariaLabelledby;
31
+ return <ListItem componentName={TRIGGER_NAME} backgrounded radiused hoverTheme pressTheme focusTheme focusable borderWidth={1} size={context.size} aria-expanded={context.open} aria-autocomplete="none" aria-labelledby={labelledBy} dir={context.dir} disabled={disabled} data-disabled={disabled ? "" : void 0} {...triggerProps} ref={forwardedRef} {...process.env.TAMAGUI_TARGET === "web" && context.interactions ? context.interactions.getReferenceProps() : {
32
+ onPress() {
33
+ context.setOpen(!context.open);
34
+ }
35
+ }} />;
36
+ }
37
+ );
36
38
  SelectTrigger.displayName = TRIGGER_NAME;
37
39
  const VALUE_NAME = "SelectValue";
38
40
  const SelectValueFrame = styled(Paragraph, {
39
41
  name: VALUE_NAME,
40
42
  selectable: false
41
43
  });
42
- const SelectValue = SelectValueFrame.extractable(React.forwardRef(({ __scopeSelect, children: childrenProp, placeholder }, forwardedRef) => {
43
- const context = useSelectContext(VALUE_NAME, __scopeSelect);
44
- const { onValueNodeHasChildrenChange } = context;
45
- const hasChildren = childrenProp !== void 0;
46
- const composedRefs = useComposedRefs(forwardedRef, context.onValueNodeChange);
47
- useIsomorphicLayoutEffect(() => {
48
- onValueNodeHasChildrenChange(hasChildren);
49
- }, [onValueNodeHasChildrenChange, hasChildren]);
50
- const children = childrenProp ?? context.selectedItem;
51
- return <SelectValueFrame size={context.size} ref={composedRefs} pointerEvents="none">{context.value === void 0 && placeholder !== void 0 ? placeholder : children}</SelectValueFrame>;
52
- }));
44
+ const SelectValue = SelectValueFrame.extractable(
45
+ React.forwardRef(
46
+ ({ __scopeSelect, children: childrenProp, placeholder }, forwardedRef) => {
47
+ const context = useSelectContext(VALUE_NAME, __scopeSelect);
48
+ const { onValueNodeHasChildrenChange } = context;
49
+ const hasChildren = childrenProp !== void 0;
50
+ const composedRefs = useComposedRefs(forwardedRef, context.onValueNodeChange);
51
+ useIsomorphicLayoutEffect(() => {
52
+ onValueNodeHasChildrenChange(hasChildren);
53
+ }, [onValueNodeHasChildrenChange, hasChildren]);
54
+ const children = childrenProp ?? context.selectedItem;
55
+ return <SelectValueFrame size={context.size} ref={composedRefs} pointerEvents="none">{context.value === void 0 && placeholder !== void 0 ? placeholder : children}</SelectValueFrame>;
56
+ }
57
+ )
58
+ );
53
59
  SelectValue.displayName = VALUE_NAME;
54
60
  const SelectIcon = styled(XStack, {
55
61
  name: "SelectIcon",
@@ -58,121 +64,127 @@ const SelectIcon = styled(XStack, {
58
64
  });
59
65
  const ITEM_NAME = "SelectItem";
60
66
  const [SelectItemContextProvider, useSelectItemContext] = createSelectContext(ITEM_NAME);
61
- const SelectItem = React.forwardRef((props, forwardedRef) => {
62
- const {
63
- __scopeSelect,
64
- value,
65
- disabled = false,
66
- textValue: textValueProp,
67
- index,
68
- ...itemProps
69
- } = props;
70
- const context = useSelectContext(ITEM_NAME, __scopeSelect);
71
- const isSelected = context.value === value;
72
- const textId = useId();
73
- const {
74
- selectedIndex,
75
- setSelectedIndex,
76
- listRef,
77
- open,
78
- setOpen,
79
- onChange,
80
- setActiveIndex,
81
- allowMouseUpRef,
82
- allowSelectRef,
83
- setValueAtIndex,
84
- selectTimeoutRef,
85
- dataRef
86
- } = context;
87
- const composedRefs = useComposedRefs(forwardedRef, (node) => {
88
- if (!isWeb)
89
- return;
90
- if (node instanceof HTMLElement) {
91
- if (listRef) {
92
- listRef.current[index] = node;
67
+ const SelectItem = React.forwardRef(
68
+ (props, forwardedRef) => {
69
+ const {
70
+ __scopeSelect,
71
+ value,
72
+ disabled = false,
73
+ textValue: textValueProp,
74
+ index,
75
+ ...itemProps
76
+ } = props;
77
+ const context = useSelectContext(ITEM_NAME, __scopeSelect);
78
+ const isSelected = context.value === value;
79
+ const textId = useId();
80
+ const {
81
+ selectedIndex,
82
+ setSelectedIndex,
83
+ listRef,
84
+ open,
85
+ setOpen,
86
+ onChange,
87
+ setActiveIndex,
88
+ allowMouseUpRef,
89
+ allowSelectRef,
90
+ setValueAtIndex,
91
+ selectTimeoutRef,
92
+ dataRef
93
+ } = context;
94
+ const composedRefs = useComposedRefs(forwardedRef, (node) => {
95
+ if (!isWeb)
96
+ return;
97
+ if (node instanceof HTMLElement) {
98
+ if (listRef) {
99
+ listRef.current[index] = node;
100
+ }
93
101
  }
102
+ });
103
+ React.useEffect(() => {
104
+ setValueAtIndex(index, value);
105
+ }, [index, setValueAtIndex, value]);
106
+ function handleSelect() {
107
+ setSelectedIndex(index);
108
+ onChange(value);
109
+ setOpen(false);
94
110
  }
95
- });
96
- React.useEffect(() => {
97
- setValueAtIndex(index, value);
98
- }, [index, setValueAtIndex, value]);
99
- function handleSelect() {
100
- setSelectedIndex(index);
101
- onChange(value);
102
- setOpen(false);
103
- }
104
- const selectItemProps = context.interactions ? context.interactions.getItemProps({
105
- onTouchStart() {
106
- allowSelectRef.current = true;
107
- allowMouseUpRef.current = false;
108
- },
109
- onKeyDown(event) {
110
- if (event.key === "Enter" || event.key === " " && !dataRef?.current.typing) {
111
- event.preventDefault();
112
- handleSelect();
113
- } else {
111
+ const selectItemProps = context.interactions ? context.interactions.getItemProps({
112
+ onTouchStart() {
114
113
  allowSelectRef.current = true;
114
+ allowMouseUpRef.current = false;
115
+ },
116
+ onKeyDown(event) {
117
+ if (event.key === "Enter" || event.key === " " && !dataRef?.current.typing) {
118
+ event.preventDefault();
119
+ handleSelect();
120
+ } else {
121
+ allowSelectRef.current = true;
122
+ }
123
+ },
124
+ onClick() {
125
+ if (allowSelectRef.current) {
126
+ setSelectedIndex(index);
127
+ setOpen(false);
128
+ }
129
+ },
130
+ onMouseUp() {
131
+ if (!allowMouseUpRef.current) {
132
+ return;
133
+ }
134
+ if (allowSelectRef.current) {
135
+ handleSelect();
136
+ }
137
+ clearTimeout(selectTimeoutRef.current);
138
+ selectTimeoutRef.current = setTimeout(() => {
139
+ allowSelectRef.current = true;
140
+ });
115
141
  }
116
- },
117
- onClick() {
118
- if (allowSelectRef.current) {
119
- setSelectedIndex(index);
120
- setOpen(false);
121
- }
122
- },
123
- onMouseUp() {
124
- if (!allowMouseUpRef.current) {
125
- return;
126
- }
127
- if (allowSelectRef.current) {
128
- handleSelect();
129
- }
130
- clearTimeout(selectTimeoutRef.current);
131
- selectTimeoutRef.current = setTimeout(() => {
132
- allowSelectRef.current = true;
133
- });
134
- }
135
- }) : {
136
- onPress: handleSelect
137
- };
138
- return <SelectItemContextProvider scope={__scopeSelect} value={value} textId={textId || ""} isSelected={isSelected}><ListItem backgrounded pressTheme focusTheme componentName={ITEM_NAME} ref={composedRefs} aria-labelledby={textId} aria-selected={isSelected} data-state={isSelected ? "active" : "inactive"} aria-disabled={disabled || void 0} data-disabled={disabled ? "" : void 0} tabIndex={disabled ? void 0 : -1} size={context.size} {...itemProps} {...selectItemProps} /></SelectItemContextProvider>;
139
- });
142
+ }) : {
143
+ onPress: handleSelect
144
+ };
145
+ return <SelectItemContextProvider scope={__scopeSelect} value={value} textId={textId || ""} isSelected={isSelected}><ListItem backgrounded pressTheme focusTheme componentName={ITEM_NAME} ref={composedRefs} aria-labelledby={textId} aria-selected={isSelected} data-state={isSelected ? "active" : "inactive"} aria-disabled={disabled || void 0} data-disabled={disabled ? "" : void 0} tabIndex={disabled ? void 0 : -1} size={context.size} {...itemProps} {...selectItemProps} /></SelectItemContextProvider>;
146
+ }
147
+ );
140
148
  SelectItem.displayName = ITEM_NAME;
141
149
  const ITEM_TEXT_NAME = "SelectItemText";
142
150
  const SelectItemTextFrame = styled(Paragraph, {
143
151
  name: ITEM_TEXT_NAME,
144
152
  selectable: false
145
153
  });
146
- const SelectItemText = React.forwardRef((props, forwardedRef) => {
147
- const { __scopeSelect, className, ...itemTextProps } = props;
148
- const context = useSelectContext(ITEM_TEXT_NAME, __scopeSelect);
149
- const itemContext = useSelectItemContext(ITEM_TEXT_NAME, __scopeSelect);
150
- const ref = React.useRef(null);
151
- const composedRefs = useComposedRefs(forwardedRef, ref);
152
- const isSelected = itemContext.isSelected && context.valueNode && !context.valueNodeHasChildren;
153
- const contents = <SelectItemTextFrame className={className} size={context.size} id={itemContext.textId} {...itemTextProps} ref={composedRefs} />;
154
- if (!isWeb) {
155
- React.useEffect(() => {
156
- if (isSelected) {
157
- context.setSelectedItem(contents);
158
- }
159
- }, [isSelected]);
154
+ const SelectItemText = React.forwardRef(
155
+ (props, forwardedRef) => {
156
+ const { __scopeSelect, className, ...itemTextProps } = props;
157
+ const context = useSelectContext(ITEM_TEXT_NAME, __scopeSelect);
158
+ const itemContext = useSelectItemContext(ITEM_TEXT_NAME, __scopeSelect);
159
+ const ref = React.useRef(null);
160
+ const composedRefs = useComposedRefs(forwardedRef, ref);
161
+ const isSelected = itemContext.isSelected && context.valueNode && !context.valueNodeHasChildren;
162
+ const contents = <SelectItemTextFrame className={className} size={context.size} id={itemContext.textId} {...itemTextProps} ref={composedRefs} />;
163
+ if (!isWeb) {
164
+ React.useEffect(() => {
165
+ if (isSelected) {
166
+ context.setSelectedItem(contents);
167
+ }
168
+ }, [isSelected]);
169
+ }
170
+ return <>
171
+ {contents}
172
+ {isWeb && isSelected ? ReactDOM.createPortal(itemTextProps.children, context.valueNode) : null}
173
+ </>;
160
174
  }
161
- return <>
162
- {contents}
163
- {isWeb && isSelected ? ReactDOM.createPortal(itemTextProps.children, context.valueNode) : null}
164
- </>;
165
- });
175
+ );
166
176
  SelectItemText.displayName = ITEM_TEXT_NAME;
167
177
  const ITEM_INDICATOR_NAME = "SelectItemIndicator";
168
178
  const SelectItemIndicatorFrame = styled(XStack, {
169
179
  name: ITEM_TEXT_NAME
170
180
  });
171
- const SelectItemIndicator = React.forwardRef((props, forwardedRef) => {
172
- const { __scopeSelect, ...itemIndicatorProps } = props;
173
- const itemContext = useSelectItemContext(ITEM_INDICATOR_NAME, __scopeSelect);
174
- return itemContext.isSelected ? <SelectItemIndicatorFrame aria-hidden {...itemIndicatorProps} ref={forwardedRef} /> : null;
175
- });
181
+ const SelectItemIndicator = React.forwardRef(
182
+ (props, forwardedRef) => {
183
+ const { __scopeSelect, ...itemIndicatorProps } = props;
184
+ const itemContext = useSelectItemContext(ITEM_INDICATOR_NAME, __scopeSelect);
185
+ return itemContext.isSelected ? <SelectItemIndicatorFrame aria-hidden {...itemIndicatorProps} ref={forwardedRef} /> : null;
186
+ }
187
+ );
176
188
  SelectItemIndicator.displayName = ITEM_INDICATOR_NAME;
177
189
  const GROUP_NAME = "SelectGroup";
178
190
  const [SelectGroupContextProvider, useSelectGroupContext] = createSelectContext(GROUP_NAME);
@@ -180,19 +192,23 @@ const SelectGroupFrame = styled(YStack, {
180
192
  name: GROUP_NAME,
181
193
  width: "100%"
182
194
  });
183
- const SelectGroup = React.forwardRef((props, forwardedRef) => {
184
- const { __scopeSelect, ...groupProps } = props;
185
- const groupId = useId();
186
- return <SelectGroupContextProvider scope={__scopeSelect} id={groupId || ""}><SelectGroupFrame role="group" aria-labelledby={groupId} {...groupProps} ref={forwardedRef} /></SelectGroupContextProvider>;
187
- });
195
+ const SelectGroup = React.forwardRef(
196
+ (props, forwardedRef) => {
197
+ const { __scopeSelect, ...groupProps } = props;
198
+ const groupId = useId();
199
+ return <SelectGroupContextProvider scope={__scopeSelect} id={groupId || ""}><SelectGroupFrame role="group" aria-labelledby={groupId} {...groupProps} ref={forwardedRef} /></SelectGroupContextProvider>;
200
+ }
201
+ );
188
202
  SelectGroup.displayName = GROUP_NAME;
189
203
  const LABEL_NAME = "SelectLabel";
190
- const SelectLabel = React.forwardRef((props, forwardedRef) => {
191
- const { __scopeSelect, ...labelProps } = props;
192
- const context = useSelectContext(LABEL_NAME, __scopeSelect);
193
- const groupContext = useSelectGroupContext(LABEL_NAME, __scopeSelect);
194
- return <ListItem componentName={LABEL_NAME} fontWeight="800" id={groupContext.id} size={context.size} {...labelProps} ref={forwardedRef} />;
195
- });
204
+ const SelectLabel = React.forwardRef(
205
+ (props, forwardedRef) => {
206
+ const { __scopeSelect, ...labelProps } = props;
207
+ const context = useSelectContext(LABEL_NAME, __scopeSelect);
208
+ const groupContext = useSelectGroupContext(LABEL_NAME, __scopeSelect);
209
+ return <ListItem componentName={LABEL_NAME} fontWeight="800" id={groupContext.id} size={context.size} {...labelProps} ref={forwardedRef} />;
210
+ }
211
+ );
196
212
  SelectLabel.displayName = LABEL_NAME;
197
213
  const SelectSeparator = styled(Separator, {
198
214
  name: "SelectSeparator"
@@ -225,66 +241,71 @@ SelectSheetContents.displayName = SHEET_CONTENTS_NAME;
225
241
  const SelectSheetImpl = (props) => {
226
242
  return <>{props.children}</>;
227
243
  };
228
- const Select = withStaticProperties((props) => {
229
- const {
230
- __scopeSelect,
231
- children,
232
- open: openProp,
233
- defaultOpen,
234
- onOpenChange,
235
- value: valueProp,
236
- defaultValue,
237
- onValueChange,
238
- size: sizeProp = "$4",
239
- sheetBreakpoint = false,
240
- dir
241
- } = props;
242
- const isSheet = useSelectBreakpointActive(sheetBreakpoint);
243
- const SelectImpl = isSheet ? SelectSheetImpl : SelectInlineImpl;
244
- const forceUpdate = React.useReducer(() => ({}), {})[1];
245
- const [selectedItem, setSelectedItem] = React.useState(null);
246
- const [open, setOpen] = useControllableState({
247
- prop: openProp,
248
- defaultProp: defaultOpen || false,
249
- onChange: onOpenChange,
250
- strategy: "most-recent-wins"
251
- });
252
- const [value, setValue] = useControllableState({
253
- prop: valueProp,
254
- defaultProp: defaultValue || "",
255
- onChange: onValueChange,
256
- strategy: "most-recent-wins"
257
- });
258
- const [activeIndex, setActiveIndex] = React.useState(null);
259
- const selectedIndexRef = React.useRef(null);
260
- const activeIndexRef = React.useRef(null);
261
- const listContentRef = React.useRef([]);
262
- const [selectedIndex, setSelectedIndex] = React.useState(Math.max(0, listContentRef.current.indexOf(value)));
263
- const [valueNode, setValueNode] = React.useState(null);
264
- const [valueNodeHasChildren, setValueNodeHasChildren] = React.useState(false);
265
- useIsomorphicLayoutEffect(() => {
266
- selectedIndexRef.current = selectedIndex;
267
- activeIndexRef.current = activeIndex;
268
- });
269
- return <SelectProvider dir={dir} blockSelection={false} size={sizeProp} fallback={false} selectedItem={selectedItem} setSelectedItem={setSelectedItem} forceUpdate={forceUpdate} valueNode={valueNode} onValueNodeChange={setValueNode} onValueNodeHasChildrenChange={setValueNodeHasChildren} valueNodeHasChildren={valueNodeHasChildren} scopeKey={__scopeSelect ? Object.keys(__scopeSelect)[0] : ""} sheetBreakpoint={sheetBreakpoint} scope={__scopeSelect} setValueAtIndex={(index, value2) => {
270
- listContentRef.current[index] = value2;
271
- }} activeIndex={activeIndex} onChange={setValue} selectedIndex={selectedIndex} setActiveIndex={setActiveIndex} setOpen={setOpen} setSelectedIndex={setSelectedIndex} value={value} open={open}><SelectSheetController onChangeOpen={setOpen} __scopeSelect={__scopeSelect}><SelectImpl activeIndexRef={activeIndexRef} listContentRef={listContentRef} selectedIndexRef={selectedIndexRef} {...props} open={open} value={value}>{children}</SelectImpl></SelectSheetController></SelectProvider>;
272
- }, {
273
- Content: SelectContent,
274
- Group: SelectGroup,
275
- Icon: SelectIcon,
276
- Item: SelectItem,
277
- ItemIndicator: SelectItemIndicator,
278
- ItemText: SelectItemText,
279
- Label: SelectLabel,
280
- ScrollDownButton: SelectScrollDownButton,
281
- ScrollUpButton: SelectScrollUpButton,
282
- Trigger: SelectTrigger,
283
- Value: SelectValue,
284
- Viewport: SelectViewport,
285
- SheetContents: SelectSheetContents,
286
- Sheet
287
- });
244
+ const Select = withStaticProperties(
245
+ (props) => {
246
+ const {
247
+ __scopeSelect,
248
+ children,
249
+ open: openProp,
250
+ defaultOpen,
251
+ onOpenChange,
252
+ value: valueProp,
253
+ defaultValue,
254
+ onValueChange,
255
+ size: sizeProp = "$4",
256
+ sheetBreakpoint = false,
257
+ dir
258
+ } = props;
259
+ const isSheet = useSelectBreakpointActive(sheetBreakpoint);
260
+ const SelectImpl = isSheet ? SelectSheetImpl : SelectInlineImpl;
261
+ const forceUpdate = React.useReducer(() => ({}), {})[1];
262
+ const [selectedItem, setSelectedItem] = React.useState(null);
263
+ const [open, setOpen] = useControllableState({
264
+ prop: openProp,
265
+ defaultProp: defaultOpen || false,
266
+ onChange: onOpenChange,
267
+ strategy: "most-recent-wins"
268
+ });
269
+ const [value, setValue] = useControllableState({
270
+ prop: valueProp,
271
+ defaultProp: defaultValue || "",
272
+ onChange: onValueChange,
273
+ strategy: "most-recent-wins"
274
+ });
275
+ const [activeIndex, setActiveIndex] = React.useState(null);
276
+ const selectedIndexRef = React.useRef(null);
277
+ const activeIndexRef = React.useRef(null);
278
+ const listContentRef = React.useRef([]);
279
+ const [selectedIndex, setSelectedIndex] = React.useState(
280
+ Math.max(0, listContentRef.current.indexOf(value))
281
+ );
282
+ const [valueNode, setValueNode] = React.useState(null);
283
+ const [valueNodeHasChildren, setValueNodeHasChildren] = React.useState(false);
284
+ useIsomorphicLayoutEffect(() => {
285
+ selectedIndexRef.current = selectedIndex;
286
+ activeIndexRef.current = activeIndex;
287
+ });
288
+ return <SelectProvider dir={dir} blockSelection={false} size={sizeProp} fallback={false} selectedItem={selectedItem} setSelectedItem={setSelectedItem} forceUpdate={forceUpdate} valueNode={valueNode} onValueNodeChange={setValueNode} onValueNodeHasChildrenChange={setValueNodeHasChildren} valueNodeHasChildren={valueNodeHasChildren} scopeKey={__scopeSelect ? Object.keys(__scopeSelect)[0] : ""} sheetBreakpoint={sheetBreakpoint} scope={__scopeSelect} setValueAtIndex={(index, value2) => {
289
+ listContentRef.current[index] = value2;
290
+ }} activeIndex={activeIndex} onChange={setValue} selectedIndex={selectedIndex} setActiveIndex={setActiveIndex} setOpen={setOpen} setSelectedIndex={setSelectedIndex} value={value} open={open}><SelectSheetController onChangeOpen={setOpen} __scopeSelect={__scopeSelect}><SelectImpl activeIndexRef={activeIndexRef} listContentRef={listContentRef} selectedIndexRef={selectedIndexRef} {...props} open={open} value={value}>{children}</SelectImpl></SelectSheetController></SelectProvider>;
291
+ },
292
+ {
293
+ Content: SelectContent,
294
+ Group: SelectGroup,
295
+ Icon: SelectIcon,
296
+ Item: SelectItem,
297
+ ItemIndicator: SelectItemIndicator,
298
+ ItemText: SelectItemText,
299
+ Label: SelectLabel,
300
+ ScrollDownButton: SelectScrollDownButton,
301
+ ScrollUpButton: SelectScrollUpButton,
302
+ Trigger: SelectTrigger,
303
+ Value: SelectValue,
304
+ Viewport: SelectViewport,
305
+ SheetContents: SelectSheetContents,
306
+ Sheet
307
+ }
308
+ );
288
309
  Select.displayName = SELECT_NAME;
289
310
  export {
290
311
  Select,