index.js 75 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306
  1. var $cg2C9$babelruntimehelpersextends = require("@babel/runtime/helpers/extends");
  2. var $cg2C9$react = require("react");
  3. var $cg2C9$reactdom = require("react-dom");
  4. var $cg2C9$radixuinumber = require("@radix-ui/number");
  5. var $cg2C9$radixuiprimitive = require("@radix-ui/primitive");
  6. var $cg2C9$radixuireactcollection = require("@radix-ui/react-collection");
  7. var $cg2C9$radixuireactcomposerefs = require("@radix-ui/react-compose-refs");
  8. var $cg2C9$radixuireactcontext = require("@radix-ui/react-context");
  9. var $cg2C9$radixuireactdirection = require("@radix-ui/react-direction");
  10. var $cg2C9$radixuireactdismissablelayer = require("@radix-ui/react-dismissable-layer");
  11. var $cg2C9$radixuireactfocusguards = require("@radix-ui/react-focus-guards");
  12. var $cg2C9$radixuireactfocusscope = require("@radix-ui/react-focus-scope");
  13. var $cg2C9$radixuireactid = require("@radix-ui/react-id");
  14. var $cg2C9$radixuireactpopper = require("@radix-ui/react-popper");
  15. var $cg2C9$radixuireactportal = require("@radix-ui/react-portal");
  16. var $cg2C9$radixuireactprimitive = require("@radix-ui/react-primitive");
  17. var $cg2C9$radixuireactslot = require("@radix-ui/react-slot");
  18. var $cg2C9$radixuireactusecallbackref = require("@radix-ui/react-use-callback-ref");
  19. var $cg2C9$radixuireactusecontrollablestate = require("@radix-ui/react-use-controllable-state");
  20. var $cg2C9$radixuireactuselayouteffect = require("@radix-ui/react-use-layout-effect");
  21. var $cg2C9$radixuireactuseprevious = require("@radix-ui/react-use-previous");
  22. var $cg2C9$radixuireactvisuallyhidden = require("@radix-ui/react-visually-hidden");
  23. var $cg2C9$ariahidden = require("aria-hidden");
  24. var $cg2C9$reactremovescroll = require("react-remove-scroll");
  25. function $parcel$export(e, n, v, s) {
  26. Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
  27. }
  28. function $parcel$interopDefault(a) {
  29. return a && a.__esModule ? a.default : a;
  30. }
  31. $parcel$export(module.exports, "createSelectScope", () => $1345bda09ffc1bc6$export$286727a75dc039bd);
  32. $parcel$export(module.exports, "Select", () => $1345bda09ffc1bc6$export$ef9b1a59e592288f);
  33. $parcel$export(module.exports, "SelectTrigger", () => $1345bda09ffc1bc6$export$3ac1e88a1c0b9f1);
  34. $parcel$export(module.exports, "SelectValue", () => $1345bda09ffc1bc6$export$e288731fd71264f0);
  35. $parcel$export(module.exports, "SelectIcon", () => $1345bda09ffc1bc6$export$99b400cabb58c515);
  36. $parcel$export(module.exports, "SelectPortal", () => $1345bda09ffc1bc6$export$b2af6c9944296213);
  37. $parcel$export(module.exports, "SelectContent", () => $1345bda09ffc1bc6$export$c973a4b3cb86a03d);
  38. $parcel$export(module.exports, "SelectViewport", () => $1345bda09ffc1bc6$export$9ed6e7b40248d36d);
  39. $parcel$export(module.exports, "SelectGroup", () => $1345bda09ffc1bc6$export$ee25a334c55de1f4);
  40. $parcel$export(module.exports, "SelectLabel", () => $1345bda09ffc1bc6$export$f67338d29bd972f8);
  41. $parcel$export(module.exports, "SelectItem", () => $1345bda09ffc1bc6$export$13ef48a934230896);
  42. $parcel$export(module.exports, "SelectItemText", () => $1345bda09ffc1bc6$export$3572fb0fb821ff49);
  43. $parcel$export(module.exports, "SelectItemIndicator", () => $1345bda09ffc1bc6$export$6b9198de19accfe6);
  44. $parcel$export(module.exports, "SelectScrollUpButton", () => $1345bda09ffc1bc6$export$d8117927658af6d7);
  45. $parcel$export(module.exports, "SelectScrollDownButton", () => $1345bda09ffc1bc6$export$ff951e476c12189);
  46. $parcel$export(module.exports, "SelectSeparator", () => $1345bda09ffc1bc6$export$eba4b1df07cb1d3);
  47. $parcel$export(module.exports, "SelectArrow", () => $1345bda09ffc1bc6$export$314f4cb8f8099628);
  48. $parcel$export(module.exports, "Root", () => $1345bda09ffc1bc6$export$be92b6f5f03c0fe9);
  49. $parcel$export(module.exports, "Trigger", () => $1345bda09ffc1bc6$export$41fb9f06171c75f4);
  50. $parcel$export(module.exports, "Value", () => $1345bda09ffc1bc6$export$4c8d1a57a761ef94);
  51. $parcel$export(module.exports, "Icon", () => $1345bda09ffc1bc6$export$f04a61298a47a40f);
  52. $parcel$export(module.exports, "Portal", () => $1345bda09ffc1bc6$export$602eac185826482c);
  53. $parcel$export(module.exports, "Content", () => $1345bda09ffc1bc6$export$7c6e2c02157bb7d2);
  54. $parcel$export(module.exports, "Viewport", () => $1345bda09ffc1bc6$export$d5c6c08dc2d3ca7);
  55. $parcel$export(module.exports, "Group", () => $1345bda09ffc1bc6$export$eb2fcfdbd7ba97d4);
  56. $parcel$export(module.exports, "Label", () => $1345bda09ffc1bc6$export$b04be29aa201d4f5);
  57. $parcel$export(module.exports, "Item", () => $1345bda09ffc1bc6$export$6d08773d2e66f8f2);
  58. $parcel$export(module.exports, "ItemText", () => $1345bda09ffc1bc6$export$d6e5bf9c43ea9319);
  59. $parcel$export(module.exports, "ItemIndicator", () => $1345bda09ffc1bc6$export$c3468e2714d175fa);
  60. $parcel$export(module.exports, "ScrollUpButton", () => $1345bda09ffc1bc6$export$2f60d3ec9ad468f2);
  61. $parcel$export(module.exports, "ScrollDownButton", () => $1345bda09ffc1bc6$export$bf1aedc3039c8d63);
  62. $parcel$export(module.exports, "Separator", () => $1345bda09ffc1bc6$export$1ff3c3f08ae963c0);
  63. $parcel$export(module.exports, "Arrow", () => $1345bda09ffc1bc6$export$21b07c8f274aebd5);
  64. const $1345bda09ffc1bc6$var$OPEN_KEYS = [
  65. ' ',
  66. 'Enter',
  67. 'ArrowUp',
  68. 'ArrowDown'
  69. ];
  70. const $1345bda09ffc1bc6$var$SELECTION_KEYS = [
  71. ' ',
  72. 'Enter'
  73. ];
  74. /* -------------------------------------------------------------------------------------------------
  75. * Select
  76. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$SELECT_NAME = 'Select';
  77. const [$1345bda09ffc1bc6$var$Collection, $1345bda09ffc1bc6$var$useCollection, $1345bda09ffc1bc6$var$createCollectionScope] = $cg2C9$radixuireactcollection.createCollection($1345bda09ffc1bc6$var$SELECT_NAME);
  78. const [$1345bda09ffc1bc6$var$createSelectContext, $1345bda09ffc1bc6$export$286727a75dc039bd] = $cg2C9$radixuireactcontext.createContextScope($1345bda09ffc1bc6$var$SELECT_NAME, [
  79. $1345bda09ffc1bc6$var$createCollectionScope,
  80. $cg2C9$radixuireactpopper.createPopperScope
  81. ]);
  82. const $1345bda09ffc1bc6$var$usePopperScope = $cg2C9$radixuireactpopper.createPopperScope();
  83. const [$1345bda09ffc1bc6$var$SelectProvider, $1345bda09ffc1bc6$var$useSelectContext] = $1345bda09ffc1bc6$var$createSelectContext($1345bda09ffc1bc6$var$SELECT_NAME);
  84. const [$1345bda09ffc1bc6$var$SelectNativeOptionsProvider, $1345bda09ffc1bc6$var$useSelectNativeOptionsContext] = $1345bda09ffc1bc6$var$createSelectContext($1345bda09ffc1bc6$var$SELECT_NAME);
  85. const $1345bda09ffc1bc6$export$ef9b1a59e592288f = (props)=>{
  86. const { __scopeSelect: __scopeSelect , children: children , open: openProp , defaultOpen: defaultOpen , onOpenChange: onOpenChange , value: valueProp , defaultValue: defaultValue , onValueChange: onValueChange , dir: dir , name: name , autoComplete: autoComplete , disabled: disabled , required: required } = props;
  87. const popperScope = $1345bda09ffc1bc6$var$usePopperScope(__scopeSelect);
  88. const [trigger, setTrigger] = $cg2C9$react.useState(null);
  89. const [valueNode, setValueNode] = $cg2C9$react.useState(null);
  90. const [valueNodeHasChildren, setValueNodeHasChildren] = $cg2C9$react.useState(false);
  91. const direction = $cg2C9$radixuireactdirection.useDirection(dir);
  92. const [open = false, setOpen] = $cg2C9$radixuireactusecontrollablestate.useControllableState({
  93. prop: openProp,
  94. defaultProp: defaultOpen,
  95. onChange: onOpenChange
  96. });
  97. const [value, setValue] = $cg2C9$radixuireactusecontrollablestate.useControllableState({
  98. prop: valueProp,
  99. defaultProp: defaultValue,
  100. onChange: onValueChange
  101. });
  102. const triggerPointerDownPosRef = $cg2C9$react.useRef(null); // We set this to true by default so that events bubble to forms without JS (SSR)
  103. const isFormControl = trigger ? Boolean(trigger.closest('form')) : true;
  104. const [nativeOptionsSet, setNativeOptionsSet] = $cg2C9$react.useState(new Set()); // The native `select` only associates the correct default value if the corresponding
  105. // `option` is rendered as a child **at the same time** as itself.
  106. // Because it might take a few renders for our items to gather the information to build
  107. // the native `option`(s), we generate a key on the `select` to make sure React re-builds it
  108. // each time the options change.
  109. const nativeSelectKey = Array.from(nativeOptionsSet).map((option)=>option.props.value
  110. ).join(';');
  111. return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactpopper.Root, popperScope, /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$SelectProvider, {
  112. required: required,
  113. scope: __scopeSelect,
  114. trigger: trigger,
  115. onTriggerChange: setTrigger,
  116. valueNode: valueNode,
  117. onValueNodeChange: setValueNode,
  118. valueNodeHasChildren: valueNodeHasChildren,
  119. onValueNodeHasChildrenChange: setValueNodeHasChildren,
  120. contentId: $cg2C9$radixuireactid.useId(),
  121. value: value,
  122. onValueChange: setValue,
  123. open: open,
  124. onOpenChange: setOpen,
  125. dir: direction,
  126. triggerPointerDownPosRef: triggerPointerDownPosRef,
  127. disabled: disabled
  128. }, /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$Collection.Provider, {
  129. scope: __scopeSelect
  130. }, /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$SelectNativeOptionsProvider, {
  131. scope: props.__scopeSelect,
  132. onNativeOptionAdd: $cg2C9$react.useCallback((option)=>{
  133. setNativeOptionsSet((prev)=>new Set(prev).add(option)
  134. );
  135. }, []),
  136. onNativeOptionRemove: $cg2C9$react.useCallback((option)=>{
  137. setNativeOptionsSet((prev)=>{
  138. const optionsSet = new Set(prev);
  139. optionsSet.delete(option);
  140. return optionsSet;
  141. });
  142. }, [])
  143. }, children)), isFormControl ? /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$BubbleSelect, {
  144. key: nativeSelectKey,
  145. "aria-hidden": true,
  146. required: required,
  147. tabIndex: -1,
  148. name: name,
  149. autoComplete: autoComplete,
  150. value: value // enable form autofill
  151. ,
  152. onChange: (event)=>setValue(event.target.value)
  153. ,
  154. disabled: disabled
  155. }, value === undefined ? /*#__PURE__*/ $cg2C9$react.createElement("option", {
  156. value: ""
  157. }) : null, Array.from(nativeOptionsSet)) : null));
  158. };
  159. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$ef9b1a59e592288f, {
  160. displayName: $1345bda09ffc1bc6$var$SELECT_NAME
  161. });
  162. /* -------------------------------------------------------------------------------------------------
  163. * SelectTrigger
  164. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$TRIGGER_NAME = 'SelectTrigger';
  165. const $1345bda09ffc1bc6$export$3ac1e88a1c0b9f1 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  166. const { __scopeSelect: __scopeSelect , disabled: disabled = false , ...triggerProps } = props;
  167. const popperScope = $1345bda09ffc1bc6$var$usePopperScope(__scopeSelect);
  168. const context = $1345bda09ffc1bc6$var$useSelectContext($1345bda09ffc1bc6$var$TRIGGER_NAME, __scopeSelect);
  169. const isDisabled = context.disabled || disabled;
  170. const composedRefs = $cg2C9$radixuireactcomposerefs.useComposedRefs(forwardedRef, context.onTriggerChange);
  171. const getItems = $1345bda09ffc1bc6$var$useCollection(__scopeSelect);
  172. const [searchRef, handleTypeaheadSearch, resetTypeahead] = $1345bda09ffc1bc6$var$useTypeaheadSearch((search)=>{
  173. const enabledItems = getItems().filter((item)=>!item.disabled
  174. );
  175. const currentItem = enabledItems.find((item)=>item.value === context.value
  176. );
  177. const nextItem = $1345bda09ffc1bc6$var$findNextItem(enabledItems, search, currentItem);
  178. if (nextItem !== undefined) context.onValueChange(nextItem.value);
  179. });
  180. const handleOpen = ()=>{
  181. if (!isDisabled) {
  182. context.onOpenChange(true); // reset typeahead when we open
  183. resetTypeahead();
  184. }
  185. };
  186. return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactpopper.Anchor, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  187. asChild: true
  188. }, popperScope), /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.button, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  189. type: "button",
  190. role: "combobox",
  191. "aria-controls": context.contentId,
  192. "aria-expanded": context.open,
  193. "aria-required": context.required,
  194. "aria-autocomplete": "none",
  195. dir: context.dir,
  196. "data-state": context.open ? 'open' : 'closed',
  197. disabled: isDisabled,
  198. "data-disabled": isDisabled ? '' : undefined,
  199. "data-placeholder": context.value === undefined ? '' : undefined
  200. }, triggerProps, {
  201. ref: composedRefs // Enable compatibility with native label or custom `Label` "click" for Safari:
  202. ,
  203. onClick: $cg2C9$radixuiprimitive.composeEventHandlers(triggerProps.onClick, (event)=>{
  204. // Whilst browsers generally have no issue focusing the trigger when clicking
  205. // on a label, Safari seems to struggle with the fact that there's no `onClick`.
  206. // We force `focus` in this case. Note: this doesn't create any other side-effect
  207. // because we are preventing default in `onPointerDown` so effectively
  208. // this only runs for a label "click"
  209. event.currentTarget.focus();
  210. }),
  211. onPointerDown: $cg2C9$radixuiprimitive.composeEventHandlers(triggerProps.onPointerDown, (event)=>{
  212. // prevent implicit pointer capture
  213. // https://www.w3.org/TR/pointerevents3/#implicit-pointer-capture
  214. const target = event.target;
  215. if (target.hasPointerCapture(event.pointerId)) target.releasePointerCapture(event.pointerId);
  216. // only call handler if it's the left button (mousedown gets triggered by all mouse buttons)
  217. // but not when the control key is pressed (avoiding MacOS right click)
  218. if (event.button === 0 && event.ctrlKey === false) {
  219. handleOpen();
  220. context.triggerPointerDownPosRef.current = {
  221. x: Math.round(event.pageX),
  222. y: Math.round(event.pageY)
  223. }; // prevent trigger from stealing focus from the active item after opening.
  224. event.preventDefault();
  225. }
  226. }),
  227. onKeyDown: $cg2C9$radixuiprimitive.composeEventHandlers(triggerProps.onKeyDown, (event)=>{
  228. const isTypingAhead = searchRef.current !== '';
  229. const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
  230. if (!isModifierKey && event.key.length === 1) handleTypeaheadSearch(event.key);
  231. if (isTypingAhead && event.key === ' ') return;
  232. if ($1345bda09ffc1bc6$var$OPEN_KEYS.includes(event.key)) {
  233. handleOpen();
  234. event.preventDefault();
  235. }
  236. })
  237. })));
  238. });
  239. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$3ac1e88a1c0b9f1, {
  240. displayName: $1345bda09ffc1bc6$var$TRIGGER_NAME
  241. });
  242. /* -------------------------------------------------------------------------------------------------
  243. * SelectValue
  244. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$VALUE_NAME = 'SelectValue';
  245. const $1345bda09ffc1bc6$export$e288731fd71264f0 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  246. // We ignore `className` and `style` as this part shouldn't be styled.
  247. const { __scopeSelect: __scopeSelect , className: className , style: style , children: children , placeholder: placeholder , ...valueProps } = props;
  248. const context = $1345bda09ffc1bc6$var$useSelectContext($1345bda09ffc1bc6$var$VALUE_NAME, __scopeSelect);
  249. const { onValueNodeHasChildrenChange: onValueNodeHasChildrenChange } = context;
  250. const hasChildren = children !== undefined;
  251. const composedRefs = $cg2C9$radixuireactcomposerefs.useComposedRefs(forwardedRef, context.onValueNodeChange);
  252. $cg2C9$radixuireactuselayouteffect.useLayoutEffect(()=>{
  253. onValueNodeHasChildrenChange(hasChildren);
  254. }, [
  255. onValueNodeHasChildrenChange,
  256. hasChildren
  257. ]);
  258. return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.span, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({}, valueProps, {
  259. ref: composedRefs // we don't want events from the portalled `SelectValue` children to bubble
  260. ,
  261. style: {
  262. pointerEvents: 'none'
  263. }
  264. }), context.value === undefined && placeholder !== undefined ? placeholder : children);
  265. });
  266. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$e288731fd71264f0, {
  267. displayName: $1345bda09ffc1bc6$var$VALUE_NAME
  268. });
  269. /* -------------------------------------------------------------------------------------------------
  270. * SelectIcon
  271. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$ICON_NAME = 'SelectIcon';
  272. const $1345bda09ffc1bc6$export$99b400cabb58c515 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  273. const { __scopeSelect: __scopeSelect , children: children , ...iconProps } = props;
  274. return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.span, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  275. "aria-hidden": true
  276. }, iconProps, {
  277. ref: forwardedRef
  278. }), children || '▼');
  279. });
  280. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$99b400cabb58c515, {
  281. displayName: $1345bda09ffc1bc6$var$ICON_NAME
  282. });
  283. /* -------------------------------------------------------------------------------------------------
  284. * SelectPortal
  285. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$PORTAL_NAME = 'SelectPortal';
  286. const $1345bda09ffc1bc6$export$b2af6c9944296213 = (props)=>{
  287. return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactportal.Portal, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  288. asChild: true
  289. }, props));
  290. };
  291. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$b2af6c9944296213, {
  292. displayName: $1345bda09ffc1bc6$var$PORTAL_NAME
  293. });
  294. /* -------------------------------------------------------------------------------------------------
  295. * SelectContent
  296. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$CONTENT_NAME = 'SelectContent';
  297. const $1345bda09ffc1bc6$export$c973a4b3cb86a03d = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  298. const context = $1345bda09ffc1bc6$var$useSelectContext($1345bda09ffc1bc6$var$CONTENT_NAME, props.__scopeSelect);
  299. const [fragment, setFragment] = $cg2C9$react.useState(); // setting the fragment in `useLayoutEffect` as `DocumentFragment` doesn't exist on the server
  300. $cg2C9$radixuireactuselayouteffect.useLayoutEffect(()=>{
  301. setFragment(new DocumentFragment());
  302. }, []);
  303. if (!context.open) {
  304. const frag = fragment;
  305. return frag ? /*#__PURE__*/ $cg2C9$reactdom.createPortal(/*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$SelectContentProvider, {
  306. scope: props.__scopeSelect
  307. }, /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$Collection.Slot, {
  308. scope: props.__scopeSelect
  309. }, /*#__PURE__*/ $cg2C9$react.createElement("div", null, props.children))), frag) : null;
  310. }
  311. return /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$SelectContentImpl, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({}, props, {
  312. ref: forwardedRef
  313. }));
  314. });
  315. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$c973a4b3cb86a03d, {
  316. displayName: $1345bda09ffc1bc6$var$CONTENT_NAME
  317. });
  318. /* -------------------------------------------------------------------------------------------------
  319. * SelectContentImpl
  320. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$CONTENT_MARGIN = 10;
  321. const [$1345bda09ffc1bc6$var$SelectContentProvider, $1345bda09ffc1bc6$var$useSelectContentContext] = $1345bda09ffc1bc6$var$createSelectContext($1345bda09ffc1bc6$var$CONTENT_NAME);
  322. const $1345bda09ffc1bc6$var$CONTENT_IMPL_NAME = 'SelectContentImpl';
  323. const $1345bda09ffc1bc6$var$SelectContentImpl = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  324. const { __scopeSelect: __scopeSelect , position: position = 'item-aligned' , onCloseAutoFocus: onCloseAutoFocus , onEscapeKeyDown: onEscapeKeyDown , onPointerDownOutside: onPointerDownOutside , side: //
  325. // PopperContent props
  326. side , sideOffset: sideOffset , align: align , alignOffset: alignOffset , arrowPadding: arrowPadding , collisionBoundary: collisionBoundary , collisionPadding: collisionPadding , sticky: sticky , hideWhenDetached: hideWhenDetached , avoidCollisions: avoidCollisions , //
  327. ...contentProps } = props;
  328. const context = $1345bda09ffc1bc6$var$useSelectContext($1345bda09ffc1bc6$var$CONTENT_NAME, __scopeSelect);
  329. const [content, setContent] = $cg2C9$react.useState(null);
  330. const [viewport, setViewport] = $cg2C9$react.useState(null);
  331. const composedRefs = $cg2C9$radixuireactcomposerefs.useComposedRefs(forwardedRef, (node)=>setContent(node)
  332. );
  333. const [selectedItem, setSelectedItem] = $cg2C9$react.useState(null);
  334. const [selectedItemText, setSelectedItemText] = $cg2C9$react.useState(null);
  335. const getItems = $1345bda09ffc1bc6$var$useCollection(__scopeSelect);
  336. const [isPositioned, setIsPositioned] = $cg2C9$react.useState(false);
  337. const firstValidItemFoundRef = $cg2C9$react.useRef(false); // aria-hide everything except the content (better supported equivalent to setting aria-modal)
  338. $cg2C9$react.useEffect(()=>{
  339. if (content) return $cg2C9$ariahidden.hideOthers(content);
  340. }, [
  341. content
  342. ]); // Make sure the whole tree has focus guards as our `Select` may be
  343. // the last element in the DOM (because of the `Portal`)
  344. $cg2C9$radixuireactfocusguards.useFocusGuards();
  345. const focusFirst = $cg2C9$react.useCallback((candidates)=>{
  346. const [firstItem, ...restItems] = getItems().map((item)=>item.ref.current
  347. );
  348. const [lastItem] = restItems.slice(-1);
  349. const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;
  350. for (const candidate of candidates){
  351. // if focus is already where we want to go, we don't want to keep going through the candidates
  352. if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;
  353. candidate === null || candidate === void 0 || candidate.scrollIntoView({
  354. block: 'nearest'
  355. }); // viewport might have padding so scroll to its edges when focusing first/last items.
  356. if (candidate === firstItem && viewport) viewport.scrollTop = 0;
  357. if (candidate === lastItem && viewport) viewport.scrollTop = viewport.scrollHeight;
  358. candidate === null || candidate === void 0 || candidate.focus();
  359. if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;
  360. }
  361. }, [
  362. getItems,
  363. viewport
  364. ]);
  365. const focusSelectedItem = $cg2C9$react.useCallback(()=>focusFirst([
  366. selectedItem,
  367. content
  368. ])
  369. , [
  370. focusFirst,
  371. selectedItem,
  372. content
  373. ]); // Since this is not dependent on layout, we want to ensure this runs at the same time as
  374. // other effects across components. Hence why we don't call `focusSelectedItem` inside `position`.
  375. $cg2C9$react.useEffect(()=>{
  376. if (isPositioned) focusSelectedItem();
  377. }, [
  378. isPositioned,
  379. focusSelectedItem
  380. ]); // prevent selecting items on `pointerup` in some cases after opening from `pointerdown`
  381. // and close on `pointerup` outside.
  382. const { onOpenChange: onOpenChange , triggerPointerDownPosRef: triggerPointerDownPosRef } = context;
  383. $cg2C9$react.useEffect(()=>{
  384. if (content) {
  385. let pointerMoveDelta = {
  386. x: 0,
  387. y: 0
  388. };
  389. const handlePointerMove = (event)=>{
  390. var _triggerPointerDownPo, _triggerPointerDownPo2, _triggerPointerDownPo3, _triggerPointerDownPo4;
  391. pointerMoveDelta = {
  392. x: Math.abs(Math.round(event.pageX) - ((_triggerPointerDownPo = (_triggerPointerDownPo2 = triggerPointerDownPosRef.current) === null || _triggerPointerDownPo2 === void 0 ? void 0 : _triggerPointerDownPo2.x) !== null && _triggerPointerDownPo !== void 0 ? _triggerPointerDownPo : 0)),
  393. y: Math.abs(Math.round(event.pageY) - ((_triggerPointerDownPo3 = (_triggerPointerDownPo4 = triggerPointerDownPosRef.current) === null || _triggerPointerDownPo4 === void 0 ? void 0 : _triggerPointerDownPo4.y) !== null && _triggerPointerDownPo3 !== void 0 ? _triggerPointerDownPo3 : 0))
  394. };
  395. };
  396. const handlePointerUp = (event)=>{
  397. // If the pointer hasn't moved by a certain threshold then we prevent selecting item on `pointerup`.
  398. if (pointerMoveDelta.x <= 10 && pointerMoveDelta.y <= 10) event.preventDefault();
  399. else // otherwise, if the event was outside the content, close.
  400. if (!content.contains(event.target)) onOpenChange(false);
  401. document.removeEventListener('pointermove', handlePointerMove);
  402. triggerPointerDownPosRef.current = null;
  403. };
  404. if (triggerPointerDownPosRef.current !== null) {
  405. document.addEventListener('pointermove', handlePointerMove);
  406. document.addEventListener('pointerup', handlePointerUp, {
  407. capture: true,
  408. once: true
  409. });
  410. }
  411. return ()=>{
  412. document.removeEventListener('pointermove', handlePointerMove);
  413. document.removeEventListener('pointerup', handlePointerUp, {
  414. capture: true
  415. });
  416. };
  417. }
  418. }, [
  419. content,
  420. onOpenChange,
  421. triggerPointerDownPosRef
  422. ]);
  423. $cg2C9$react.useEffect(()=>{
  424. const close = ()=>onOpenChange(false)
  425. ;
  426. window.addEventListener('blur', close);
  427. window.addEventListener('resize', close);
  428. return ()=>{
  429. window.removeEventListener('blur', close);
  430. window.removeEventListener('resize', close);
  431. };
  432. }, [
  433. onOpenChange
  434. ]);
  435. const [searchRef, handleTypeaheadSearch] = $1345bda09ffc1bc6$var$useTypeaheadSearch((search)=>{
  436. const enabledItems = getItems().filter((item)=>!item.disabled
  437. );
  438. const currentItem = enabledItems.find((item)=>item.ref.current === document.activeElement
  439. );
  440. const nextItem = $1345bda09ffc1bc6$var$findNextItem(enabledItems, search, currentItem);
  441. if (nextItem) /**
  442. * Imperative focus during keydown is risky so we prevent React's batching updates
  443. * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332
  444. */ setTimeout(()=>nextItem.ref.current.focus()
  445. );
  446. });
  447. const itemRefCallback = $cg2C9$react.useCallback((node, value, disabled)=>{
  448. const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;
  449. const isSelectedItem = context.value !== undefined && context.value === value;
  450. if (isSelectedItem || isFirstValidItem) {
  451. setSelectedItem(node);
  452. if (isFirstValidItem) firstValidItemFoundRef.current = true;
  453. }
  454. }, [
  455. context.value
  456. ]);
  457. const handleItemLeave = $cg2C9$react.useCallback(()=>content === null || content === void 0 ? void 0 : content.focus()
  458. , [
  459. content
  460. ]);
  461. const itemTextRefCallback = $cg2C9$react.useCallback((node, value, disabled)=>{
  462. const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;
  463. const isSelectedItem = context.value !== undefined && context.value === value;
  464. if (isSelectedItem || isFirstValidItem) setSelectedItemText(node);
  465. }, [
  466. context.value
  467. ]);
  468. const SelectPosition = position === 'popper' ? $1345bda09ffc1bc6$var$SelectPopperPosition : $1345bda09ffc1bc6$var$SelectItemAlignedPosition; // Silently ignore props that are not supported by `SelectItemAlignedPosition`
  469. const popperContentProps = SelectPosition === $1345bda09ffc1bc6$var$SelectPopperPosition ? {
  470. side: side,
  471. sideOffset: sideOffset,
  472. align: align,
  473. alignOffset: alignOffset,
  474. arrowPadding: arrowPadding,
  475. collisionBoundary: collisionBoundary,
  476. collisionPadding: collisionPadding,
  477. sticky: sticky,
  478. hideWhenDetached: hideWhenDetached,
  479. avoidCollisions: avoidCollisions
  480. } : {};
  481. return /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$SelectContentProvider, {
  482. scope: __scopeSelect,
  483. content: content,
  484. viewport: viewport,
  485. onViewportChange: setViewport,
  486. itemRefCallback: itemRefCallback,
  487. selectedItem: selectedItem,
  488. onItemLeave: handleItemLeave,
  489. itemTextRefCallback: itemTextRefCallback,
  490. focusSelectedItem: focusSelectedItem,
  491. selectedItemText: selectedItemText,
  492. position: position,
  493. isPositioned: isPositioned,
  494. searchRef: searchRef
  495. }, /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$reactremovescroll.RemoveScroll, {
  496. as: $cg2C9$radixuireactslot.Slot,
  497. allowPinchZoom: true
  498. }, /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactfocusscope.FocusScope, {
  499. asChild: true // we make sure we're not trapping once it's been closed
  500. ,
  501. trapped: context.open,
  502. onMountAutoFocus: (event)=>{
  503. // we prevent open autofocus because we manually focus the selected item
  504. event.preventDefault();
  505. },
  506. onUnmountAutoFocus: $cg2C9$radixuiprimitive.composeEventHandlers(onCloseAutoFocus, (event)=>{
  507. var _context$trigger;
  508. (_context$trigger = context.trigger) === null || _context$trigger === void 0 || _context$trigger.focus({
  509. preventScroll: true
  510. });
  511. event.preventDefault();
  512. })
  513. }, /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactdismissablelayer.DismissableLayer, {
  514. asChild: true,
  515. disableOutsidePointerEvents: true,
  516. onEscapeKeyDown: onEscapeKeyDown,
  517. onPointerDownOutside: onPointerDownOutside // When focus is trapped, a focusout event may still happen.
  518. ,
  519. onFocusOutside: (event)=>event.preventDefault()
  520. ,
  521. onDismiss: ()=>context.onOpenChange(false)
  522. }, /*#__PURE__*/ $cg2C9$react.createElement(SelectPosition, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  523. role: "listbox",
  524. id: context.contentId,
  525. "data-state": context.open ? 'open' : 'closed',
  526. dir: context.dir,
  527. onContextMenu: (event)=>event.preventDefault()
  528. }, contentProps, popperContentProps, {
  529. onPlaced: ()=>setIsPositioned(true)
  530. ,
  531. ref: composedRefs,
  532. style: {
  533. // flex layout so we can place the scroll buttons properly
  534. display: 'flex',
  535. flexDirection: 'column',
  536. // reset the outline by default as the content MAY get focused
  537. outline: 'none',
  538. ...contentProps.style
  539. },
  540. onKeyDown: $cg2C9$radixuiprimitive.composeEventHandlers(contentProps.onKeyDown, (event)=>{
  541. const isModifierKey = event.ctrlKey || event.altKey || event.metaKey; // select should not be navigated using tab key so we prevent it
  542. if (event.key === 'Tab') event.preventDefault();
  543. if (!isModifierKey && event.key.length === 1) handleTypeaheadSearch(event.key);
  544. if ([
  545. 'ArrowUp',
  546. 'ArrowDown',
  547. 'Home',
  548. 'End'
  549. ].includes(event.key)) {
  550. const items = getItems().filter((item)=>!item.disabled
  551. );
  552. let candidateNodes = items.map((item)=>item.ref.current
  553. );
  554. if ([
  555. 'ArrowUp',
  556. 'End'
  557. ].includes(event.key)) candidateNodes = candidateNodes.slice().reverse();
  558. if ([
  559. 'ArrowUp',
  560. 'ArrowDown'
  561. ].includes(event.key)) {
  562. const currentElement = event.target;
  563. const currentIndex = candidateNodes.indexOf(currentElement);
  564. candidateNodes = candidateNodes.slice(currentIndex + 1);
  565. }
  566. /**
  567. * Imperative focus during keydown is risky so we prevent React's batching updates
  568. * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332
  569. */ setTimeout(()=>focusFirst(candidateNodes)
  570. );
  571. event.preventDefault();
  572. }
  573. })
  574. }))))));
  575. });
  576. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$var$SelectContentImpl, {
  577. displayName: $1345bda09ffc1bc6$var$CONTENT_IMPL_NAME
  578. });
  579. /* -------------------------------------------------------------------------------------------------
  580. * SelectItemAlignedPosition
  581. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$ITEM_ALIGNED_POSITION_NAME = 'SelectItemAlignedPosition';
  582. const $1345bda09ffc1bc6$var$SelectItemAlignedPosition = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  583. const { __scopeSelect: __scopeSelect , onPlaced: onPlaced , ...popperProps } = props;
  584. const context = $1345bda09ffc1bc6$var$useSelectContext($1345bda09ffc1bc6$var$CONTENT_NAME, __scopeSelect);
  585. const contentContext = $1345bda09ffc1bc6$var$useSelectContentContext($1345bda09ffc1bc6$var$CONTENT_NAME, __scopeSelect);
  586. const [contentWrapper, setContentWrapper] = $cg2C9$react.useState(null);
  587. const [content, setContent] = $cg2C9$react.useState(null);
  588. const composedRefs = $cg2C9$radixuireactcomposerefs.useComposedRefs(forwardedRef, (node)=>setContent(node)
  589. );
  590. const getItems = $1345bda09ffc1bc6$var$useCollection(__scopeSelect);
  591. const shouldExpandOnScrollRef = $cg2C9$react.useRef(false);
  592. const shouldRepositionRef = $cg2C9$react.useRef(true);
  593. const { viewport: viewport , selectedItem: selectedItem , selectedItemText: selectedItemText , focusSelectedItem: focusSelectedItem } = contentContext;
  594. const position = $cg2C9$react.useCallback(()=>{
  595. if (context.trigger && context.valueNode && contentWrapper && content && viewport && selectedItem && selectedItemText) {
  596. const triggerRect = context.trigger.getBoundingClientRect(); // -----------------------------------------------------------------------------------------
  597. // Horizontal positioning
  598. // -----------------------------------------------------------------------------------------
  599. const contentRect = content.getBoundingClientRect();
  600. const valueNodeRect = context.valueNode.getBoundingClientRect();
  601. const itemTextRect = selectedItemText.getBoundingClientRect();
  602. if (context.dir !== 'rtl') {
  603. const itemTextOffset = itemTextRect.left - contentRect.left;
  604. const left = valueNodeRect.left - itemTextOffset;
  605. const leftDelta = triggerRect.left - left;
  606. const minContentWidth = triggerRect.width + leftDelta;
  607. const contentWidth = Math.max(minContentWidth, contentRect.width);
  608. const rightEdge = window.innerWidth - $1345bda09ffc1bc6$var$CONTENT_MARGIN;
  609. const clampedLeft = $cg2C9$radixuinumber.clamp(left, [
  610. $1345bda09ffc1bc6$var$CONTENT_MARGIN,
  611. rightEdge - contentWidth
  612. ]);
  613. contentWrapper.style.minWidth = minContentWidth + 'px';
  614. contentWrapper.style.left = clampedLeft + 'px';
  615. } else {
  616. const itemTextOffset = contentRect.right - itemTextRect.right;
  617. const right = window.innerWidth - valueNodeRect.right - itemTextOffset;
  618. const rightDelta = window.innerWidth - triggerRect.right - right;
  619. const minContentWidth = triggerRect.width + rightDelta;
  620. const contentWidth = Math.max(minContentWidth, contentRect.width);
  621. const leftEdge = window.innerWidth - $1345bda09ffc1bc6$var$CONTENT_MARGIN;
  622. const clampedRight = $cg2C9$radixuinumber.clamp(right, [
  623. $1345bda09ffc1bc6$var$CONTENT_MARGIN,
  624. leftEdge - contentWidth
  625. ]);
  626. contentWrapper.style.minWidth = minContentWidth + 'px';
  627. contentWrapper.style.right = clampedRight + 'px';
  628. } // -----------------------------------------------------------------------------------------
  629. // Vertical positioning
  630. // -----------------------------------------------------------------------------------------
  631. const items = getItems();
  632. const availableHeight = window.innerHeight - $1345bda09ffc1bc6$var$CONTENT_MARGIN * 2;
  633. const itemsHeight = viewport.scrollHeight;
  634. const contentStyles = window.getComputedStyle(content);
  635. const contentBorderTopWidth = parseInt(contentStyles.borderTopWidth, 10);
  636. const contentPaddingTop = parseInt(contentStyles.paddingTop, 10);
  637. const contentBorderBottomWidth = parseInt(contentStyles.borderBottomWidth, 10);
  638. const contentPaddingBottom = parseInt(contentStyles.paddingBottom, 10);
  639. const fullContentHeight = contentBorderTopWidth + contentPaddingTop + itemsHeight + contentPaddingBottom + contentBorderBottomWidth; // prettier-ignore
  640. const minContentHeight = Math.min(selectedItem.offsetHeight * 5, fullContentHeight);
  641. const viewportStyles = window.getComputedStyle(viewport);
  642. const viewportPaddingTop = parseInt(viewportStyles.paddingTop, 10);
  643. const viewportPaddingBottom = parseInt(viewportStyles.paddingBottom, 10);
  644. const topEdgeToTriggerMiddle = triggerRect.top + triggerRect.height / 2 - $1345bda09ffc1bc6$var$CONTENT_MARGIN;
  645. const triggerMiddleToBottomEdge = availableHeight - topEdgeToTriggerMiddle;
  646. const selectedItemHalfHeight = selectedItem.offsetHeight / 2;
  647. const itemOffsetMiddle = selectedItem.offsetTop + selectedItemHalfHeight;
  648. const contentTopToItemMiddle = contentBorderTopWidth + contentPaddingTop + itemOffsetMiddle;
  649. const itemMiddleToContentBottom = fullContentHeight - contentTopToItemMiddle;
  650. const willAlignWithoutTopOverflow = contentTopToItemMiddle <= topEdgeToTriggerMiddle;
  651. if (willAlignWithoutTopOverflow) {
  652. const isLastItem = selectedItem === items[items.length - 1].ref.current;
  653. contentWrapper.style.bottom = "0px";
  654. const viewportOffsetBottom = content.clientHeight - viewport.offsetTop - viewport.offsetHeight;
  655. const clampedTriggerMiddleToBottomEdge = Math.max(triggerMiddleToBottomEdge, selectedItemHalfHeight + (isLastItem ? viewportPaddingBottom : 0) + viewportOffsetBottom + contentBorderBottomWidth);
  656. const height = contentTopToItemMiddle + clampedTriggerMiddleToBottomEdge;
  657. contentWrapper.style.height = height + 'px';
  658. } else {
  659. const isFirstItem = selectedItem === items[0].ref.current;
  660. contentWrapper.style.top = "0px";
  661. const clampedTopEdgeToTriggerMiddle = Math.max(topEdgeToTriggerMiddle, contentBorderTopWidth + viewport.offsetTop + (isFirstItem ? viewportPaddingTop : 0) + selectedItemHalfHeight);
  662. const height = clampedTopEdgeToTriggerMiddle + itemMiddleToContentBottom;
  663. contentWrapper.style.height = height + 'px';
  664. viewport.scrollTop = contentTopToItemMiddle - topEdgeToTriggerMiddle + viewport.offsetTop;
  665. }
  666. contentWrapper.style.margin = `${$1345bda09ffc1bc6$var$CONTENT_MARGIN}px 0`;
  667. contentWrapper.style.minHeight = minContentHeight + 'px';
  668. contentWrapper.style.maxHeight = availableHeight + 'px'; // -----------------------------------------------------------------------------------------
  669. onPlaced === null || onPlaced === void 0 || onPlaced(); // we don't want the initial scroll position adjustment to trigger "expand on scroll"
  670. // so we explicitly turn it on only after they've registered.
  671. requestAnimationFrame(()=>shouldExpandOnScrollRef.current = true
  672. );
  673. }
  674. }, [
  675. getItems,
  676. context.trigger,
  677. context.valueNode,
  678. contentWrapper,
  679. content,
  680. viewport,
  681. selectedItem,
  682. selectedItemText,
  683. context.dir,
  684. onPlaced
  685. ]);
  686. $cg2C9$radixuireactuselayouteffect.useLayoutEffect(()=>position()
  687. , [
  688. position
  689. ]); // copy z-index from content to wrapper
  690. const [contentZIndex, setContentZIndex] = $cg2C9$react.useState();
  691. $cg2C9$radixuireactuselayouteffect.useLayoutEffect(()=>{
  692. if (content) setContentZIndex(window.getComputedStyle(content).zIndex);
  693. }, [
  694. content
  695. ]); // When the viewport becomes scrollable at the top, the scroll up button will mount.
  696. // Because it is part of the normal flow, it will push down the viewport, thus throwing our
  697. // trigger => selectedItem alignment off by the amount the viewport was pushed down.
  698. // We wait for this to happen and then re-run the positining logic one more time to account for it.
  699. const handleScrollButtonChange = $cg2C9$react.useCallback((node)=>{
  700. if (node && shouldRepositionRef.current === true) {
  701. position();
  702. focusSelectedItem === null || focusSelectedItem === void 0 || focusSelectedItem();
  703. shouldRepositionRef.current = false;
  704. }
  705. }, [
  706. position,
  707. focusSelectedItem
  708. ]);
  709. return /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$SelectViewportProvider, {
  710. scope: __scopeSelect,
  711. contentWrapper: contentWrapper,
  712. shouldExpandOnScrollRef: shouldExpandOnScrollRef,
  713. onScrollButtonChange: handleScrollButtonChange
  714. }, /*#__PURE__*/ $cg2C9$react.createElement("div", {
  715. ref: setContentWrapper,
  716. style: {
  717. display: 'flex',
  718. flexDirection: 'column',
  719. position: 'fixed',
  720. zIndex: contentZIndex
  721. }
  722. }, /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.div, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({}, popperProps, {
  723. ref: composedRefs,
  724. style: {
  725. // When we get the height of the content, it includes borders. If we were to set
  726. // the height without having `boxSizing: 'border-box'` it would be too big.
  727. boxSizing: 'border-box',
  728. // We need to ensure the content doesn't get taller than the wrapper
  729. maxHeight: '100%',
  730. ...popperProps.style
  731. }
  732. }))));
  733. });
  734. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$var$SelectItemAlignedPosition, {
  735. displayName: $1345bda09ffc1bc6$var$ITEM_ALIGNED_POSITION_NAME
  736. });
  737. /* -------------------------------------------------------------------------------------------------
  738. * SelectPopperPosition
  739. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$POPPER_POSITION_NAME = 'SelectPopperPosition';
  740. const $1345bda09ffc1bc6$var$SelectPopperPosition = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  741. const { __scopeSelect: __scopeSelect , align: align = 'start' , collisionPadding: collisionPadding = $1345bda09ffc1bc6$var$CONTENT_MARGIN , ...popperProps } = props;
  742. const popperScope = $1345bda09ffc1bc6$var$usePopperScope(__scopeSelect);
  743. return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactpopper.Content, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({}, popperScope, popperProps, {
  744. ref: forwardedRef,
  745. align: align,
  746. collisionPadding: collisionPadding,
  747. style: {
  748. // Ensure border-box for floating-ui calculations
  749. boxSizing: 'border-box',
  750. ...popperProps.style,
  751. '--radix-select-content-transform-origin': 'var(--radix-popper-transform-origin)',
  752. '--radix-select-content-available-width': 'var(--radix-popper-available-width)',
  753. '--radix-select-content-available-height': 'var(--radix-popper-available-height)',
  754. '--radix-select-trigger-width': 'var(--radix-popper-anchor-width)',
  755. '--radix-select-trigger-height': 'var(--radix-popper-anchor-height)'
  756. }
  757. }));
  758. });
  759. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$var$SelectPopperPosition, {
  760. displayName: $1345bda09ffc1bc6$var$POPPER_POSITION_NAME
  761. });
  762. /* -------------------------------------------------------------------------------------------------
  763. * SelectViewport
  764. * -----------------------------------------------------------------------------------------------*/ const [$1345bda09ffc1bc6$var$SelectViewportProvider, $1345bda09ffc1bc6$var$useSelectViewportContext] = $1345bda09ffc1bc6$var$createSelectContext($1345bda09ffc1bc6$var$CONTENT_NAME, {});
  765. const $1345bda09ffc1bc6$var$VIEWPORT_NAME = 'SelectViewport';
  766. const $1345bda09ffc1bc6$export$9ed6e7b40248d36d = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  767. const { __scopeSelect: __scopeSelect , ...viewportProps } = props;
  768. const contentContext = $1345bda09ffc1bc6$var$useSelectContentContext($1345bda09ffc1bc6$var$VIEWPORT_NAME, __scopeSelect);
  769. const viewportContext = $1345bda09ffc1bc6$var$useSelectViewportContext($1345bda09ffc1bc6$var$VIEWPORT_NAME, __scopeSelect);
  770. const composedRefs = $cg2C9$radixuireactcomposerefs.useComposedRefs(forwardedRef, contentContext.onViewportChange);
  771. const prevScrollTopRef = $cg2C9$react.useRef(0);
  772. return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$react.Fragment, null, /*#__PURE__*/ $cg2C9$react.createElement("style", {
  773. dangerouslySetInnerHTML: {
  774. __html: `[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`
  775. }
  776. }), /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$Collection.Slot, {
  777. scope: __scopeSelect
  778. }, /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.div, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  779. "data-radix-select-viewport": "",
  780. role: "presentation"
  781. }, viewportProps, {
  782. ref: composedRefs,
  783. style: {
  784. // we use position: 'relative' here on the `viewport` so that when we call
  785. // `selectedItem.offsetTop` in calculations, the offset is relative to the viewport
  786. // (independent of the scrollUpButton).
  787. position: 'relative',
  788. flex: 1,
  789. overflow: 'auto',
  790. ...viewportProps.style
  791. },
  792. onScroll: $cg2C9$radixuiprimitive.composeEventHandlers(viewportProps.onScroll, (event)=>{
  793. const viewport = event.currentTarget;
  794. const { contentWrapper: contentWrapper , shouldExpandOnScrollRef: shouldExpandOnScrollRef } = viewportContext;
  795. if (shouldExpandOnScrollRef !== null && shouldExpandOnScrollRef !== void 0 && shouldExpandOnScrollRef.current && contentWrapper) {
  796. const scrolledBy = Math.abs(prevScrollTopRef.current - viewport.scrollTop);
  797. if (scrolledBy > 0) {
  798. const availableHeight = window.innerHeight - $1345bda09ffc1bc6$var$CONTENT_MARGIN * 2;
  799. const cssMinHeight = parseFloat(contentWrapper.style.minHeight);
  800. const cssHeight = parseFloat(contentWrapper.style.height);
  801. const prevHeight = Math.max(cssMinHeight, cssHeight);
  802. if (prevHeight < availableHeight) {
  803. const nextHeight = prevHeight + scrolledBy;
  804. const clampedNextHeight = Math.min(availableHeight, nextHeight);
  805. const heightDiff = nextHeight - clampedNextHeight;
  806. contentWrapper.style.height = clampedNextHeight + 'px';
  807. if (contentWrapper.style.bottom === '0px') {
  808. viewport.scrollTop = heightDiff > 0 ? heightDiff : 0; // ensure the content stays pinned to the bottom
  809. contentWrapper.style.justifyContent = 'flex-end';
  810. }
  811. }
  812. }
  813. }
  814. prevScrollTopRef.current = viewport.scrollTop;
  815. })
  816. }))));
  817. });
  818. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$9ed6e7b40248d36d, {
  819. displayName: $1345bda09ffc1bc6$var$VIEWPORT_NAME
  820. });
  821. /* -------------------------------------------------------------------------------------------------
  822. * SelectGroup
  823. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$GROUP_NAME = 'SelectGroup';
  824. const [$1345bda09ffc1bc6$var$SelectGroupContextProvider, $1345bda09ffc1bc6$var$useSelectGroupContext] = $1345bda09ffc1bc6$var$createSelectContext($1345bda09ffc1bc6$var$GROUP_NAME);
  825. const $1345bda09ffc1bc6$export$ee25a334c55de1f4 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  826. const { __scopeSelect: __scopeSelect , ...groupProps } = props;
  827. const groupId = $cg2C9$radixuireactid.useId();
  828. return /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$SelectGroupContextProvider, {
  829. scope: __scopeSelect,
  830. id: groupId
  831. }, /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.div, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  832. role: "group",
  833. "aria-labelledby": groupId
  834. }, groupProps, {
  835. ref: forwardedRef
  836. })));
  837. });
  838. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$ee25a334c55de1f4, {
  839. displayName: $1345bda09ffc1bc6$var$GROUP_NAME
  840. });
  841. /* -------------------------------------------------------------------------------------------------
  842. * SelectLabel
  843. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$LABEL_NAME = 'SelectLabel';
  844. const $1345bda09ffc1bc6$export$f67338d29bd972f8 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  845. const { __scopeSelect: __scopeSelect , ...labelProps } = props;
  846. const groupContext = $1345bda09ffc1bc6$var$useSelectGroupContext($1345bda09ffc1bc6$var$LABEL_NAME, __scopeSelect);
  847. return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.div, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  848. id: groupContext.id
  849. }, labelProps, {
  850. ref: forwardedRef
  851. }));
  852. });
  853. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$f67338d29bd972f8, {
  854. displayName: $1345bda09ffc1bc6$var$LABEL_NAME
  855. });
  856. /* -------------------------------------------------------------------------------------------------
  857. * SelectItem
  858. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$ITEM_NAME = 'SelectItem';
  859. const [$1345bda09ffc1bc6$var$SelectItemContextProvider, $1345bda09ffc1bc6$var$useSelectItemContext] = $1345bda09ffc1bc6$var$createSelectContext($1345bda09ffc1bc6$var$ITEM_NAME);
  860. const $1345bda09ffc1bc6$export$13ef48a934230896 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  861. const { __scopeSelect: __scopeSelect , value: value , disabled: disabled = false , textValue: textValueProp , ...itemProps } = props;
  862. const context = $1345bda09ffc1bc6$var$useSelectContext($1345bda09ffc1bc6$var$ITEM_NAME, __scopeSelect);
  863. const contentContext = $1345bda09ffc1bc6$var$useSelectContentContext($1345bda09ffc1bc6$var$ITEM_NAME, __scopeSelect);
  864. const isSelected = context.value === value;
  865. const [textValue, setTextValue] = $cg2C9$react.useState(textValueProp !== null && textValueProp !== void 0 ? textValueProp : '');
  866. const [isFocused, setIsFocused] = $cg2C9$react.useState(false);
  867. const composedRefs = $cg2C9$radixuireactcomposerefs.useComposedRefs(forwardedRef, (node)=>{
  868. var _contentContext$itemR;
  869. return (_contentContext$itemR = contentContext.itemRefCallback) === null || _contentContext$itemR === void 0 ? void 0 : _contentContext$itemR.call(contentContext, node, value, disabled);
  870. });
  871. const textId = $cg2C9$radixuireactid.useId();
  872. const handleSelect = ()=>{
  873. if (!disabled) {
  874. context.onValueChange(value);
  875. context.onOpenChange(false);
  876. }
  877. };
  878. return /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$SelectItemContextProvider, {
  879. scope: __scopeSelect,
  880. value: value,
  881. disabled: disabled,
  882. textId: textId,
  883. isSelected: isSelected,
  884. onItemTextChange: $cg2C9$react.useCallback((node)=>{
  885. setTextValue((prevTextValue)=>{
  886. var _node$textContent;
  887. return prevTextValue || ((_node$textContent = node === null || node === void 0 ? void 0 : node.textContent) !== null && _node$textContent !== void 0 ? _node$textContent : '').trim();
  888. });
  889. }, [])
  890. }, /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$Collection.ItemSlot, {
  891. scope: __scopeSelect,
  892. value: value,
  893. disabled: disabled,
  894. textValue: textValue
  895. }, /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.div, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  896. role: "option",
  897. "aria-labelledby": textId,
  898. "data-highlighted": isFocused ? '' : undefined // `isFocused` caveat fixes stuttering in VoiceOver
  899. ,
  900. "aria-selected": isSelected && isFocused,
  901. "data-state": isSelected ? 'checked' : 'unchecked',
  902. "aria-disabled": disabled || undefined,
  903. "data-disabled": disabled ? '' : undefined,
  904. tabIndex: disabled ? undefined : -1
  905. }, itemProps, {
  906. ref: composedRefs,
  907. onFocus: $cg2C9$radixuiprimitive.composeEventHandlers(itemProps.onFocus, ()=>setIsFocused(true)
  908. ),
  909. onBlur: $cg2C9$radixuiprimitive.composeEventHandlers(itemProps.onBlur, ()=>setIsFocused(false)
  910. ),
  911. onPointerUp: $cg2C9$radixuiprimitive.composeEventHandlers(itemProps.onPointerUp, handleSelect),
  912. onPointerMove: $cg2C9$radixuiprimitive.composeEventHandlers(itemProps.onPointerMove, (event)=>{
  913. if (disabled) {
  914. var _contentContext$onIte;
  915. (_contentContext$onIte = contentContext.onItemLeave) === null || _contentContext$onIte === void 0 || _contentContext$onIte.call(contentContext);
  916. } else // even though safari doesn't support this option, it's acceptable
  917. // as it only means it might scroll a few pixels when using the pointer.
  918. event.currentTarget.focus({
  919. preventScroll: true
  920. });
  921. }),
  922. onPointerLeave: $cg2C9$radixuiprimitive.composeEventHandlers(itemProps.onPointerLeave, (event)=>{
  923. if (event.currentTarget === document.activeElement) {
  924. var _contentContext$onIte2;
  925. (_contentContext$onIte2 = contentContext.onItemLeave) === null || _contentContext$onIte2 === void 0 || _contentContext$onIte2.call(contentContext);
  926. }
  927. }),
  928. onKeyDown: $cg2C9$radixuiprimitive.composeEventHandlers(itemProps.onKeyDown, (event)=>{
  929. var _contentContext$searc;
  930. const isTypingAhead = ((_contentContext$searc = contentContext.searchRef) === null || _contentContext$searc === void 0 ? void 0 : _contentContext$searc.current) !== '';
  931. if (isTypingAhead && event.key === ' ') return;
  932. if ($1345bda09ffc1bc6$var$SELECTION_KEYS.includes(event.key)) handleSelect(); // prevent page scroll if using the space key to select an item
  933. if (event.key === ' ') event.preventDefault();
  934. })
  935. }))));
  936. });
  937. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$13ef48a934230896, {
  938. displayName: $1345bda09ffc1bc6$var$ITEM_NAME
  939. });
  940. /* -------------------------------------------------------------------------------------------------
  941. * SelectItemText
  942. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$ITEM_TEXT_NAME = 'SelectItemText';
  943. const $1345bda09ffc1bc6$export$3572fb0fb821ff49 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  944. // We ignore `className` and `style` as this part shouldn't be styled.
  945. const { __scopeSelect: __scopeSelect , className: className , style: style , ...itemTextProps } = props;
  946. const context = $1345bda09ffc1bc6$var$useSelectContext($1345bda09ffc1bc6$var$ITEM_TEXT_NAME, __scopeSelect);
  947. const contentContext = $1345bda09ffc1bc6$var$useSelectContentContext($1345bda09ffc1bc6$var$ITEM_TEXT_NAME, __scopeSelect);
  948. const itemContext = $1345bda09ffc1bc6$var$useSelectItemContext($1345bda09ffc1bc6$var$ITEM_TEXT_NAME, __scopeSelect);
  949. const nativeOptionsContext = $1345bda09ffc1bc6$var$useSelectNativeOptionsContext($1345bda09ffc1bc6$var$ITEM_TEXT_NAME, __scopeSelect);
  950. const [itemTextNode, setItemTextNode] = $cg2C9$react.useState(null);
  951. const composedRefs = $cg2C9$radixuireactcomposerefs.useComposedRefs(forwardedRef, (node)=>setItemTextNode(node)
  952. , itemContext.onItemTextChange, (node)=>{
  953. var _contentContext$itemT;
  954. return (_contentContext$itemT = contentContext.itemTextRefCallback) === null || _contentContext$itemT === void 0 ? void 0 : _contentContext$itemT.call(contentContext, node, itemContext.value, itemContext.disabled);
  955. });
  956. const textContent = itemTextNode === null || itemTextNode === void 0 ? void 0 : itemTextNode.textContent;
  957. const nativeOption = $cg2C9$react.useMemo(()=>/*#__PURE__*/ $cg2C9$react.createElement("option", {
  958. key: itemContext.value,
  959. value: itemContext.value,
  960. disabled: itemContext.disabled
  961. }, textContent)
  962. , [
  963. itemContext.disabled,
  964. itemContext.value,
  965. textContent
  966. ]);
  967. const { onNativeOptionAdd: onNativeOptionAdd , onNativeOptionRemove: onNativeOptionRemove } = nativeOptionsContext;
  968. $cg2C9$radixuireactuselayouteffect.useLayoutEffect(()=>{
  969. onNativeOptionAdd(nativeOption);
  970. return ()=>onNativeOptionRemove(nativeOption)
  971. ;
  972. }, [
  973. onNativeOptionAdd,
  974. onNativeOptionRemove,
  975. nativeOption
  976. ]);
  977. return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$react.Fragment, null, /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.span, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  978. id: itemContext.textId
  979. }, itemTextProps, {
  980. ref: composedRefs
  981. })), itemContext.isSelected && context.valueNode && !context.valueNodeHasChildren ? /*#__PURE__*/ $cg2C9$reactdom.createPortal(itemTextProps.children, context.valueNode) : null);
  982. });
  983. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$3572fb0fb821ff49, {
  984. displayName: $1345bda09ffc1bc6$var$ITEM_TEXT_NAME
  985. });
  986. /* -------------------------------------------------------------------------------------------------
  987. * SelectItemIndicator
  988. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$ITEM_INDICATOR_NAME = 'SelectItemIndicator';
  989. const $1345bda09ffc1bc6$export$6b9198de19accfe6 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  990. const { __scopeSelect: __scopeSelect , ...itemIndicatorProps } = props;
  991. const itemContext = $1345bda09ffc1bc6$var$useSelectItemContext($1345bda09ffc1bc6$var$ITEM_INDICATOR_NAME, __scopeSelect);
  992. return itemContext.isSelected ? /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.span, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  993. "aria-hidden": true
  994. }, itemIndicatorProps, {
  995. ref: forwardedRef
  996. })) : null;
  997. });
  998. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$6b9198de19accfe6, {
  999. displayName: $1345bda09ffc1bc6$var$ITEM_INDICATOR_NAME
  1000. });
  1001. /* -------------------------------------------------------------------------------------------------
  1002. * SelectScrollUpButton
  1003. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$SCROLL_UP_BUTTON_NAME = 'SelectScrollUpButton';
  1004. const $1345bda09ffc1bc6$export$d8117927658af6d7 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  1005. const contentContext = $1345bda09ffc1bc6$var$useSelectContentContext($1345bda09ffc1bc6$var$SCROLL_UP_BUTTON_NAME, props.__scopeSelect);
  1006. const viewportContext = $1345bda09ffc1bc6$var$useSelectViewportContext($1345bda09ffc1bc6$var$SCROLL_UP_BUTTON_NAME, props.__scopeSelect);
  1007. const [canScrollUp1, setCanScrollUp] = $cg2C9$react.useState(false);
  1008. const composedRefs = $cg2C9$radixuireactcomposerefs.useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);
  1009. $cg2C9$radixuireactuselayouteffect.useLayoutEffect(()=>{
  1010. if (contentContext.viewport && contentContext.isPositioned) {
  1011. const viewport = contentContext.viewport;
  1012. function handleScroll() {
  1013. const canScrollUp = viewport.scrollTop > 0;
  1014. setCanScrollUp(canScrollUp);
  1015. }
  1016. handleScroll();
  1017. viewport.addEventListener('scroll', handleScroll);
  1018. return ()=>viewport.removeEventListener('scroll', handleScroll)
  1019. ;
  1020. }
  1021. }, [
  1022. contentContext.viewport,
  1023. contentContext.isPositioned
  1024. ]);
  1025. return canScrollUp1 ? /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$SelectScrollButtonImpl, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({}, props, {
  1026. ref: composedRefs,
  1027. onAutoScroll: ()=>{
  1028. const { viewport: viewport , selectedItem: selectedItem } = contentContext;
  1029. if (viewport && selectedItem) viewport.scrollTop = viewport.scrollTop - selectedItem.offsetHeight;
  1030. }
  1031. })) : null;
  1032. });
  1033. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$d8117927658af6d7, {
  1034. displayName: $1345bda09ffc1bc6$var$SCROLL_UP_BUTTON_NAME
  1035. });
  1036. /* -------------------------------------------------------------------------------------------------
  1037. * SelectScrollDownButton
  1038. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$SCROLL_DOWN_BUTTON_NAME = 'SelectScrollDownButton';
  1039. const $1345bda09ffc1bc6$export$ff951e476c12189 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  1040. const contentContext = $1345bda09ffc1bc6$var$useSelectContentContext($1345bda09ffc1bc6$var$SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);
  1041. const viewportContext = $1345bda09ffc1bc6$var$useSelectViewportContext($1345bda09ffc1bc6$var$SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);
  1042. const [canScrollDown1, setCanScrollDown] = $cg2C9$react.useState(false);
  1043. const composedRefs = $cg2C9$radixuireactcomposerefs.useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);
  1044. $cg2C9$radixuireactuselayouteffect.useLayoutEffect(()=>{
  1045. if (contentContext.viewport && contentContext.isPositioned) {
  1046. const viewport = contentContext.viewport;
  1047. function handleScroll() {
  1048. const maxScroll = viewport.scrollHeight - viewport.clientHeight; // we use Math.ceil here because if the UI is zoomed-in
  1049. // `scrollTop` is not always reported as an integer
  1050. const canScrollDown = Math.ceil(viewport.scrollTop) < maxScroll;
  1051. setCanScrollDown(canScrollDown);
  1052. }
  1053. handleScroll();
  1054. viewport.addEventListener('scroll', handleScroll);
  1055. return ()=>viewport.removeEventListener('scroll', handleScroll)
  1056. ;
  1057. }
  1058. }, [
  1059. contentContext.viewport,
  1060. contentContext.isPositioned
  1061. ]);
  1062. return canScrollDown1 ? /*#__PURE__*/ $cg2C9$react.createElement($1345bda09ffc1bc6$var$SelectScrollButtonImpl, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({}, props, {
  1063. ref: composedRefs,
  1064. onAutoScroll: ()=>{
  1065. const { viewport: viewport , selectedItem: selectedItem } = contentContext;
  1066. if (viewport && selectedItem) viewport.scrollTop = viewport.scrollTop + selectedItem.offsetHeight;
  1067. }
  1068. })) : null;
  1069. });
  1070. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$ff951e476c12189, {
  1071. displayName: $1345bda09ffc1bc6$var$SCROLL_DOWN_BUTTON_NAME
  1072. });
  1073. const $1345bda09ffc1bc6$var$SelectScrollButtonImpl = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  1074. const { __scopeSelect: __scopeSelect , onAutoScroll: onAutoScroll , ...scrollIndicatorProps } = props;
  1075. const contentContext = $1345bda09ffc1bc6$var$useSelectContentContext('SelectScrollButton', __scopeSelect);
  1076. const autoScrollTimerRef = $cg2C9$react.useRef(null);
  1077. const getItems = $1345bda09ffc1bc6$var$useCollection(__scopeSelect);
  1078. const clearAutoScrollTimer = $cg2C9$react.useCallback(()=>{
  1079. if (autoScrollTimerRef.current !== null) {
  1080. window.clearInterval(autoScrollTimerRef.current);
  1081. autoScrollTimerRef.current = null;
  1082. }
  1083. }, []);
  1084. $cg2C9$react.useEffect(()=>{
  1085. return ()=>clearAutoScrollTimer()
  1086. ;
  1087. }, [
  1088. clearAutoScrollTimer
  1089. ]); // When the viewport becomes scrollable on either side, the relevant scroll button will mount.
  1090. // Because it is part of the normal flow, it will push down (top button) or shrink (bottom button)
  1091. // the viewport, potentially causing the active item to now be partially out of view.
  1092. // We re-run the `scrollIntoView` logic to make sure it stays within the viewport.
  1093. $cg2C9$radixuireactuselayouteffect.useLayoutEffect(()=>{
  1094. var _activeItem$ref$curre;
  1095. const activeItem = getItems().find((item)=>item.ref.current === document.activeElement
  1096. );
  1097. activeItem === null || activeItem === void 0 || (_activeItem$ref$curre = activeItem.ref.current) === null || _activeItem$ref$curre === void 0 || _activeItem$ref$curre.scrollIntoView({
  1098. block: 'nearest'
  1099. });
  1100. }, [
  1101. getItems
  1102. ]);
  1103. return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.div, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  1104. "aria-hidden": true
  1105. }, scrollIndicatorProps, {
  1106. ref: forwardedRef,
  1107. style: {
  1108. flexShrink: 0,
  1109. ...scrollIndicatorProps.style
  1110. },
  1111. onPointerDown: $cg2C9$radixuiprimitive.composeEventHandlers(scrollIndicatorProps.onPointerDown, ()=>{
  1112. if (autoScrollTimerRef.current === null) autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);
  1113. }),
  1114. onPointerMove: $cg2C9$radixuiprimitive.composeEventHandlers(scrollIndicatorProps.onPointerMove, ()=>{
  1115. var _contentContext$onIte3;
  1116. (_contentContext$onIte3 = contentContext.onItemLeave) === null || _contentContext$onIte3 === void 0 || _contentContext$onIte3.call(contentContext);
  1117. if (autoScrollTimerRef.current === null) autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);
  1118. }),
  1119. onPointerLeave: $cg2C9$radixuiprimitive.composeEventHandlers(scrollIndicatorProps.onPointerLeave, ()=>{
  1120. clearAutoScrollTimer();
  1121. })
  1122. }));
  1123. });
  1124. /* -------------------------------------------------------------------------------------------------
  1125. * SelectSeparator
  1126. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$SEPARATOR_NAME = 'SelectSeparator';
  1127. const $1345bda09ffc1bc6$export$eba4b1df07cb1d3 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  1128. const { __scopeSelect: __scopeSelect , ...separatorProps } = props;
  1129. return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactprimitive.Primitive.div, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({
  1130. "aria-hidden": true
  1131. }, separatorProps, {
  1132. ref: forwardedRef
  1133. }));
  1134. });
  1135. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$eba4b1df07cb1d3, {
  1136. displayName: $1345bda09ffc1bc6$var$SEPARATOR_NAME
  1137. });
  1138. /* -------------------------------------------------------------------------------------------------
  1139. * SelectArrow
  1140. * -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$ARROW_NAME = 'SelectArrow';
  1141. const $1345bda09ffc1bc6$export$314f4cb8f8099628 = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  1142. const { __scopeSelect: __scopeSelect , ...arrowProps } = props;
  1143. const popperScope = $1345bda09ffc1bc6$var$usePopperScope(__scopeSelect);
  1144. const context = $1345bda09ffc1bc6$var$useSelectContext($1345bda09ffc1bc6$var$ARROW_NAME, __scopeSelect);
  1145. const contentContext = $1345bda09ffc1bc6$var$useSelectContentContext($1345bda09ffc1bc6$var$ARROW_NAME, __scopeSelect);
  1146. return context.open && contentContext.position === 'popper' ? /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactpopper.Arrow, ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({}, popperScope, arrowProps, {
  1147. ref: forwardedRef
  1148. })) : null;
  1149. });
  1150. /*#__PURE__*/ Object.assign($1345bda09ffc1bc6$export$314f4cb8f8099628, {
  1151. displayName: $1345bda09ffc1bc6$var$ARROW_NAME
  1152. });
  1153. /* -----------------------------------------------------------------------------------------------*/ const $1345bda09ffc1bc6$var$BubbleSelect = /*#__PURE__*/ $cg2C9$react.forwardRef((props, forwardedRef)=>{
  1154. const { value: value , ...selectProps } = props;
  1155. const ref = $cg2C9$react.useRef(null);
  1156. const composedRefs = $cg2C9$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref);
  1157. const prevValue = $cg2C9$radixuireactuseprevious.usePrevious(value); // Bubble value change to parents (e.g form change event)
  1158. $cg2C9$react.useEffect(()=>{
  1159. const select = ref.current;
  1160. const selectProto = window.HTMLSelectElement.prototype;
  1161. const descriptor = Object.getOwnPropertyDescriptor(selectProto, 'value');
  1162. const setValue = descriptor.set;
  1163. if (prevValue !== value && setValue) {
  1164. const event = new Event('change', {
  1165. bubbles: true
  1166. });
  1167. setValue.call(select, value);
  1168. select.dispatchEvent(event);
  1169. }
  1170. }, [
  1171. prevValue,
  1172. value
  1173. ]);
  1174. /**
  1175. * We purposefully use a `select` here to support form autofill as much
  1176. * as possible.
  1177. *
  1178. * We purposefully do not add the `value` attribute here to allow the value
  1179. * to be set programatically and bubble to any parent form `onChange` event.
  1180. * Adding the `value` will cause React to consider the programatic
  1181. * dispatch a duplicate and it will get swallowed.
  1182. *
  1183. * We use `VisuallyHidden` rather than `display: "none"` because Safari autofill
  1184. * won't work otherwise.
  1185. */ return /*#__PURE__*/ $cg2C9$react.createElement($cg2C9$radixuireactvisuallyhidden.VisuallyHidden, {
  1186. asChild: true
  1187. }, /*#__PURE__*/ $cg2C9$react.createElement("select", ($parcel$interopDefault($cg2C9$babelruntimehelpersextends))({}, selectProps, {
  1188. ref: composedRefs,
  1189. defaultValue: value
  1190. })));
  1191. });
  1192. $1345bda09ffc1bc6$var$BubbleSelect.displayName = 'BubbleSelect';
  1193. function $1345bda09ffc1bc6$var$useTypeaheadSearch(onSearchChange) {
  1194. const handleSearchChange = $cg2C9$radixuireactusecallbackref.useCallbackRef(onSearchChange);
  1195. const searchRef = $cg2C9$react.useRef('');
  1196. const timerRef = $cg2C9$react.useRef(0);
  1197. const handleTypeaheadSearch = $cg2C9$react.useCallback((key)=>{
  1198. const search = searchRef.current + key;
  1199. handleSearchChange(search);
  1200. (function updateSearch(value) {
  1201. searchRef.current = value;
  1202. window.clearTimeout(timerRef.current); // Reset `searchRef` 1 second after it was last updated
  1203. if (value !== '') timerRef.current = window.setTimeout(()=>updateSearch('')
  1204. , 1000);
  1205. })(search);
  1206. }, [
  1207. handleSearchChange
  1208. ]);
  1209. const resetTypeahead = $cg2C9$react.useCallback(()=>{
  1210. searchRef.current = '';
  1211. window.clearTimeout(timerRef.current);
  1212. }, []);
  1213. $cg2C9$react.useEffect(()=>{
  1214. return ()=>window.clearTimeout(timerRef.current)
  1215. ;
  1216. }, []);
  1217. return [
  1218. searchRef,
  1219. handleTypeaheadSearch,
  1220. resetTypeahead
  1221. ];
  1222. }
  1223. /**
  1224. * This is the "meat" of the typeahead matching logic. It takes in a list of items,
  1225. * the search and the current item, and returns the next item (or `undefined`).
  1226. *
  1227. * We normalize the search because if a user has repeatedly pressed a character,
  1228. * we want the exact same behavior as if we only had that one character
  1229. * (ie. cycle through items starting with that character)
  1230. *
  1231. * We also reorder the items by wrapping the array around the current item.
  1232. * This is so we always look forward from the current item, and picking the first
  1233. * item will always be the correct one.
  1234. *
  1235. * Finally, if the normalized search is exactly one character, we exclude the
  1236. * current item from the values because otherwise it would be the first to match always
  1237. * and focus would never move. This is as opposed to the regular case, where we
  1238. * don't want focus to move if the current item still matches.
  1239. */ function $1345bda09ffc1bc6$var$findNextItem(items, search, currentItem) {
  1240. const isRepeated = search.length > 1 && Array.from(search).every((char)=>char === search[0]
  1241. );
  1242. const normalizedSearch = isRepeated ? search[0] : search;
  1243. const currentItemIndex = currentItem ? items.indexOf(currentItem) : -1;
  1244. let wrappedItems = $1345bda09ffc1bc6$var$wrapArray(items, Math.max(currentItemIndex, 0));
  1245. const excludeCurrentItem = normalizedSearch.length === 1;
  1246. if (excludeCurrentItem) wrappedItems = wrappedItems.filter((v)=>v !== currentItem
  1247. );
  1248. const nextItem = wrappedItems.find((item)=>item.textValue.toLowerCase().startsWith(normalizedSearch.toLowerCase())
  1249. );
  1250. return nextItem !== currentItem ? nextItem : undefined;
  1251. }
  1252. /**
  1253. * Wraps an array around itself at a given start index
  1254. * Example: `wrapArray(['a', 'b', 'c', 'd'], 2) === ['c', 'd', 'a', 'b']`
  1255. */ function $1345bda09ffc1bc6$var$wrapArray(array, startIndex) {
  1256. return array.map((_, index)=>array[(startIndex + index) % array.length]
  1257. );
  1258. }
  1259. const $1345bda09ffc1bc6$export$be92b6f5f03c0fe9 = $1345bda09ffc1bc6$export$ef9b1a59e592288f;
  1260. const $1345bda09ffc1bc6$export$41fb9f06171c75f4 = $1345bda09ffc1bc6$export$3ac1e88a1c0b9f1;
  1261. const $1345bda09ffc1bc6$export$4c8d1a57a761ef94 = $1345bda09ffc1bc6$export$e288731fd71264f0;
  1262. const $1345bda09ffc1bc6$export$f04a61298a47a40f = $1345bda09ffc1bc6$export$99b400cabb58c515;
  1263. const $1345bda09ffc1bc6$export$602eac185826482c = $1345bda09ffc1bc6$export$b2af6c9944296213;
  1264. const $1345bda09ffc1bc6$export$7c6e2c02157bb7d2 = $1345bda09ffc1bc6$export$c973a4b3cb86a03d;
  1265. const $1345bda09ffc1bc6$export$d5c6c08dc2d3ca7 = $1345bda09ffc1bc6$export$9ed6e7b40248d36d;
  1266. const $1345bda09ffc1bc6$export$eb2fcfdbd7ba97d4 = $1345bda09ffc1bc6$export$ee25a334c55de1f4;
  1267. const $1345bda09ffc1bc6$export$b04be29aa201d4f5 = $1345bda09ffc1bc6$export$f67338d29bd972f8;
  1268. const $1345bda09ffc1bc6$export$6d08773d2e66f8f2 = $1345bda09ffc1bc6$export$13ef48a934230896;
  1269. const $1345bda09ffc1bc6$export$d6e5bf9c43ea9319 = $1345bda09ffc1bc6$export$3572fb0fb821ff49;
  1270. const $1345bda09ffc1bc6$export$c3468e2714d175fa = $1345bda09ffc1bc6$export$6b9198de19accfe6;
  1271. const $1345bda09ffc1bc6$export$2f60d3ec9ad468f2 = $1345bda09ffc1bc6$export$d8117927658af6d7;
  1272. const $1345bda09ffc1bc6$export$bf1aedc3039c8d63 = $1345bda09ffc1bc6$export$ff951e476c12189;
  1273. const $1345bda09ffc1bc6$export$1ff3c3f08ae963c0 = $1345bda09ffc1bc6$export$eba4b1df07cb1d3;
  1274. const $1345bda09ffc1bc6$export$21b07c8f274aebd5 = $1345bda09ffc1bc6$export$314f4cb8f8099628;
  1275. //# sourceMappingURL=index.js.map