@atlaskit/react-select 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/cjs/compiled/components/containers.compiled.css +26 -0
  3. package/dist/cjs/compiled/components/containers.js +119 -0
  4. package/dist/cjs/compiled/components/control.compiled.css +51 -0
  5. package/dist/cjs/compiled/components/control.js +66 -0
  6. package/dist/cjs/compiled/components/group.compiled.css +12 -0
  7. package/dist/cjs/compiled/components/group.js +81 -0
  8. package/dist/cjs/compiled/components/indicators.compiled.css +24 -0
  9. package/dist/cjs/compiled/components/indicators.js +157 -0
  10. package/dist/cjs/compiled/components/input.compiled.css +49 -0
  11. package/dist/cjs/compiled/components/input.js +69 -0
  12. package/dist/cjs/compiled/components/internal/a11y-text.compiled.css +15 -0
  13. package/dist/cjs/compiled/components/internal/a11y-text.js +23 -0
  14. package/dist/cjs/compiled/components/internal/dummy-input.compiled.css +17 -0
  15. package/dist/cjs/compiled/components/internal/dummy-input.js +30 -0
  16. package/dist/cjs/compiled/components/internal/required-input.compiled.css +8 -0
  17. package/dist/cjs/compiled/components/internal/required-input.js +34 -0
  18. package/dist/cjs/compiled/components/live-region.js +177 -0
  19. package/dist/cjs/compiled/components/menu.compiled.css +19 -0
  20. package/dist/cjs/compiled/components/menu.js +491 -0
  21. package/dist/cjs/compiled/components/multi-value.compiled.css +56 -0
  22. package/dist/cjs/compiled/components/multi-value.js +199 -0
  23. package/dist/cjs/compiled/components/option.compiled.css +22 -0
  24. package/dist/cjs/compiled/components/option.js +57 -0
  25. package/dist/cjs/compiled/components/placeholder.compiled.css +7 -0
  26. package/dist/cjs/compiled/components/placeholder.js +45 -0
  27. package/dist/cjs/compiled/components/single-value.compiled.css +13 -0
  28. package/dist/cjs/compiled/components/single-value.js +46 -0
  29. package/dist/cjs/components/containers.js +12 -72
  30. package/dist/cjs/components/control.js +11 -96
  31. package/dist/cjs/components/group.js +15 -53
  32. package/dist/cjs/components/indicators.js +15 -107
  33. package/dist/cjs/components/input.js +12 -81
  34. package/dist/cjs/components/internal/a11y-text.js +6 -25
  35. package/dist/cjs/components/internal/dummy-input.js +8 -36
  36. package/dist/cjs/components/internal/notify-open-layer-observer.js +1 -0
  37. package/dist/cjs/components/internal/required-input.js +7 -31
  38. package/dist/cjs/components/internal/scroll-manager.js +19 -17
  39. package/dist/cjs/components/live-region.js +6 -164
  40. package/dist/cjs/components/menu.js +26 -181
  41. package/dist/cjs/components/multi-value.js +21 -197
  42. package/dist/cjs/components/option.js +11 -68
  43. package/dist/cjs/components/placeholder.js +11 -20
  44. package/dist/cjs/components/single-value.js +11 -26
  45. package/dist/cjs/emotion/components/containers.js +113 -0
  46. package/dist/cjs/emotion/components/control.js +112 -0
  47. package/dist/cjs/emotion/components/group.js +72 -0
  48. package/dist/cjs/emotion/components/indicators.js +138 -0
  49. package/dist/cjs/emotion/components/input.js +94 -0
  50. package/dist/cjs/emotion/components/internal/a11y-text.js +37 -0
  51. package/dist/cjs/emotion/components/internal/dummy-input.js +45 -0
  52. package/dist/cjs/emotion/components/internal/required-input.js +45 -0
  53. package/dist/cjs/emotion/components/live-region.js +182 -0
  54. package/dist/cjs/emotion/components/menu.js +456 -0
  55. package/dist/cjs/emotion/components/multi-value.js +224 -0
  56. package/dist/cjs/emotion/components/option.js +84 -0
  57. package/dist/cjs/emotion/components/placeholder.js +36 -0
  58. package/dist/cjs/emotion/components/single-value.js +42 -0
  59. package/dist/cjs/utils.js +2 -1
  60. package/dist/es2019/compiled/components/containers.compiled.css +26 -0
  61. package/dist/es2019/compiled/components/containers.js +115 -0
  62. package/dist/es2019/compiled/components/control.compiled.css +51 -0
  63. package/dist/es2019/compiled/components/control.js +58 -0
  64. package/dist/es2019/compiled/components/group.compiled.css +12 -0
  65. package/dist/es2019/compiled/components/group.js +72 -0
  66. package/dist/es2019/compiled/components/indicators.compiled.css +24 -0
  67. package/dist/es2019/compiled/components/indicators.js +144 -0
  68. package/dist/es2019/compiled/components/input.compiled.css +49 -0
  69. package/dist/es2019/compiled/components/input.js +59 -0
  70. package/dist/es2019/compiled/components/internal/a11y-text.compiled.css +15 -0
  71. package/dist/es2019/compiled/components/internal/a11y-text.js +11 -0
  72. package/dist/es2019/compiled/components/internal/dummy-input.compiled.css +17 -0
  73. package/dist/es2019/compiled/components/internal/dummy-input.js +19 -0
  74. package/dist/es2019/compiled/components/internal/required-input.compiled.css +8 -0
  75. package/dist/es2019/compiled/components/internal/required-input.js +23 -0
  76. package/dist/es2019/compiled/components/live-region.js +171 -0
  77. package/dist/es2019/compiled/components/menu.compiled.css +19 -0
  78. package/dist/es2019/compiled/components/menu.js +478 -0
  79. package/dist/es2019/compiled/components/multi-value.compiled.css +56 -0
  80. package/dist/es2019/compiled/components/multi-value.js +190 -0
  81. package/dist/es2019/compiled/components/option.compiled.css +22 -0
  82. package/dist/es2019/compiled/components/option.js +48 -0
  83. package/dist/es2019/compiled/components/placeholder.compiled.css +7 -0
  84. package/dist/es2019/compiled/components/placeholder.js +36 -0
  85. package/dist/es2019/compiled/components/single-value.compiled.css +13 -0
  86. package/dist/es2019/compiled/components/single-value.js +37 -0
  87. package/dist/es2019/components/containers.js +10 -87
  88. package/dist/es2019/components/control.js +8 -103
  89. package/dist/es2019/components/group.js +9 -54
  90. package/dist/es2019/components/indicators.js +11 -113
  91. package/dist/es2019/components/input.js +7 -83
  92. package/dist/es2019/components/internal/a11y-text.js +6 -26
  93. package/dist/es2019/components/internal/dummy-input.js +7 -36
  94. package/dist/es2019/components/internal/notify-open-layer-observer.js +1 -0
  95. package/dist/es2019/components/internal/required-input.js +6 -32
  96. package/dist/es2019/components/internal/scroll-manager.js +16 -16
  97. package/dist/es2019/components/live-region.js +5 -168
  98. package/dist/es2019/components/menu.js +14 -192
  99. package/dist/es2019/components/multi-value.js +12 -216
  100. package/dist/es2019/components/option.js +7 -75
  101. package/dist/es2019/components/placeholder.js +7 -25
  102. package/dist/es2019/components/single-value.js +7 -31
  103. package/dist/es2019/emotion/components/containers.js +110 -0
  104. package/dist/es2019/emotion/components/control.js +108 -0
  105. package/dist/es2019/emotion/components/group.js +60 -0
  106. package/dist/es2019/emotion/components/indicators.js +129 -0
  107. package/dist/es2019/emotion/components/input.js +87 -0
  108. package/dist/es2019/emotion/components/internal/a11y-text.js +28 -0
  109. package/dist/es2019/emotion/components/internal/dummy-input.js +38 -0
  110. package/dist/es2019/emotion/components/internal/required-input.js +36 -0
  111. package/dist/es2019/emotion/components/live-region.js +180 -0
  112. package/dist/es2019/emotion/components/menu.js +452 -0
  113. package/dist/es2019/emotion/components/multi-value.js +228 -0
  114. package/dist/es2019/emotion/components/option.js +79 -0
  115. package/dist/es2019/emotion/components/placeholder.js +29 -0
  116. package/dist/es2019/emotion/components/single-value.js +35 -0
  117. package/dist/es2019/utils.js +1 -0
  118. package/dist/esm/compiled/components/containers.compiled.css +26 -0
  119. package/dist/esm/compiled/components/containers.js +110 -0
  120. package/dist/esm/compiled/components/control.compiled.css +51 -0
  121. package/dist/esm/compiled/components/control.js +57 -0
  122. package/dist/esm/compiled/components/group.compiled.css +12 -0
  123. package/dist/esm/compiled/components/group.js +71 -0
  124. package/dist/esm/compiled/components/indicators.compiled.css +24 -0
  125. package/dist/esm/compiled/components/indicators.js +148 -0
  126. package/dist/esm/compiled/components/input.compiled.css +49 -0
  127. package/dist/esm/compiled/components/input.js +59 -0
  128. package/dist/esm/compiled/components/internal/a11y-text.compiled.css +15 -0
  129. package/dist/esm/compiled/components/internal/a11y-text.js +13 -0
  130. package/dist/esm/compiled/components/internal/dummy-input.compiled.css +17 -0
  131. package/dist/esm/compiled/components/internal/dummy-input.js +20 -0
  132. package/dist/esm/compiled/components/internal/required-input.compiled.css +8 -0
  133. package/dist/esm/compiled/components/internal/required-input.js +24 -0
  134. package/dist/esm/compiled/components/live-region.js +168 -0
  135. package/dist/esm/compiled/components/menu.compiled.css +19 -0
  136. package/dist/esm/compiled/components/menu.js +485 -0
  137. package/dist/esm/compiled/components/multi-value.compiled.css +56 -0
  138. package/dist/esm/compiled/components/multi-value.js +187 -0
  139. package/dist/esm/compiled/components/option.compiled.css +22 -0
  140. package/dist/esm/compiled/components/option.js +47 -0
  141. package/dist/esm/compiled/components/placeholder.compiled.css +7 -0
  142. package/dist/esm/compiled/components/placeholder.js +35 -0
  143. package/dist/esm/compiled/components/single-value.compiled.css +13 -0
  144. package/dist/esm/compiled/components/single-value.js +36 -0
  145. package/dist/esm/components/containers.js +12 -73
  146. package/dist/esm/components/control.js +8 -97
  147. package/dist/esm/components/group.js +11 -54
  148. package/dist/esm/components/indicators.js +15 -109
  149. package/dist/esm/components/input.js +8 -83
  150. package/dist/esm/components/internal/a11y-text.js +6 -26
  151. package/dist/esm/components/internal/dummy-input.js +7 -37
  152. package/dist/esm/components/internal/notify-open-layer-observer.js +1 -0
  153. package/dist/esm/components/internal/required-input.js +7 -32
  154. package/dist/esm/components/internal/scroll-manager.js +16 -16
  155. package/dist/esm/components/live-region.js +5 -163
  156. package/dist/esm/components/menu.js +24 -182
  157. package/dist/esm/components/multi-value.js +17 -199
  158. package/dist/esm/components/option.js +8 -69
  159. package/dist/esm/components/placeholder.js +8 -21
  160. package/dist/esm/components/single-value.js +8 -27
  161. package/dist/esm/emotion/components/containers.js +106 -0
  162. package/dist/esm/emotion/components/control.js +104 -0
  163. package/dist/esm/emotion/components/group.js +66 -0
  164. package/dist/esm/emotion/components/indicators.js +133 -0
  165. package/dist/esm/emotion/components/input.js +90 -0
  166. package/dist/esm/emotion/components/internal/a11y-text.js +30 -0
  167. package/dist/esm/emotion/components/internal/dummy-input.js +39 -0
  168. package/dist/esm/emotion/components/internal/required-input.js +37 -0
  169. package/dist/esm/emotion/components/live-region.js +177 -0
  170. package/dist/esm/emotion/components/menu.js +456 -0
  171. package/dist/esm/emotion/components/multi-value.js +218 -0
  172. package/dist/esm/emotion/components/option.js +76 -0
  173. package/dist/esm/emotion/components/placeholder.js +28 -0
  174. package/dist/esm/emotion/components/single-value.js +34 -0
  175. package/dist/esm/utils.js +2 -1
  176. package/dist/types/compiled/components/containers.d.ts +53 -0
  177. package/dist/types/compiled/components/control.d.ts +41 -0
  178. package/dist/types/compiled/components/group.d.ts +54 -0
  179. package/dist/types/compiled/components/indicators.d.ts +72 -0
  180. package/dist/types/compiled/components/input.d.ts +36 -0
  181. package/dist/types/compiled/components/internal/a11y-text.d.ts +3 -0
  182. package/dist/types/compiled/components/internal/dummy-input.d.ts +8 -0
  183. package/dist/types/compiled/components/internal/required-input.d.ts +10 -0
  184. package/dist/types/compiled/components/live-region.d.ts +19 -0
  185. package/dist/types/compiled/components/menu.d.ts +115 -0
  186. package/dist/types/compiled/components/multi-value.d.ts +57 -0
  187. package/dist/types/compiled/components/option.d.ts +48 -0
  188. package/dist/types/compiled/components/placeholder.d.ts +21 -0
  189. package/dist/types/compiled/components/single-value.d.ts +27 -0
  190. package/dist/types/components/containers.d.ts +6 -11
  191. package/dist/types/components/control.d.ts +4 -9
  192. package/dist/types/components/group.d.ts +8 -10
  193. package/dist/types/components/index.d.ts +21 -21
  194. package/dist/types/components/indicators.d.ts +7 -12
  195. package/dist/types/components/input.d.ts +3 -8
  196. package/dist/types/components/internal/a11y-text.d.ts +2 -7
  197. package/dist/types/components/internal/dummy-input.d.ts +3 -8
  198. package/dist/types/components/internal/required-input.d.ts +0 -4
  199. package/dist/types/components/internal/scroll-manager.d.ts +2 -7
  200. package/dist/types/components/live-region.d.ts +2 -8
  201. package/dist/types/components/menu.d.ts +10 -15
  202. package/dist/types/components/multi-value.d.ts +19 -13
  203. package/dist/types/components/option.d.ts +3 -8
  204. package/dist/types/components/placeholder.d.ts +3 -8
  205. package/dist/types/components/single-value.d.ts +3 -8
  206. package/dist/types/emotion/components/containers.d.ts +54 -0
  207. package/dist/types/emotion/components/control.d.ts +42 -0
  208. package/dist/types/emotion/components/group.d.ts +52 -0
  209. package/dist/types/emotion/components/indicators.d.ts +73 -0
  210. package/dist/types/emotion/components/input.d.ts +37 -0
  211. package/dist/types/emotion/components/internal/a11y-text.d.ts +8 -0
  212. package/dist/types/emotion/components/internal/dummy-input.d.ts +9 -0
  213. package/dist/types/emotion/components/internal/required-input.d.ts +10 -0
  214. package/dist/types/emotion/components/live-region.d.ts +25 -0
  215. package/dist/types/emotion/components/menu.d.ts +116 -0
  216. package/dist/types/emotion/components/multi-value.d.ts +47 -0
  217. package/dist/types/emotion/components/option.d.ts +49 -0
  218. package/dist/types/emotion/components/placeholder.d.ts +22 -0
  219. package/dist/types/emotion/components/single-value.d.ts +28 -0
  220. package/dist/types/select.d.ts +21 -21
  221. package/dist/types/types.d.ts +3 -0
  222. package/dist/types-ts4.5/compiled/components/containers.d.ts +53 -0
  223. package/dist/types-ts4.5/compiled/components/control.d.ts +41 -0
  224. package/dist/types-ts4.5/compiled/components/group.d.ts +54 -0
  225. package/dist/types-ts4.5/compiled/components/indicators.d.ts +72 -0
  226. package/dist/types-ts4.5/compiled/components/input.d.ts +36 -0
  227. package/dist/types-ts4.5/compiled/components/internal/a11y-text.d.ts +3 -0
  228. package/dist/types-ts4.5/compiled/components/internal/dummy-input.d.ts +8 -0
  229. package/dist/types-ts4.5/compiled/components/internal/required-input.d.ts +10 -0
  230. package/dist/types-ts4.5/compiled/components/live-region.d.ts +19 -0
  231. package/dist/types-ts4.5/compiled/components/menu.d.ts +115 -0
  232. package/dist/types-ts4.5/compiled/components/multi-value.d.ts +57 -0
  233. package/dist/types-ts4.5/compiled/components/option.d.ts +48 -0
  234. package/dist/types-ts4.5/compiled/components/placeholder.d.ts +21 -0
  235. package/dist/types-ts4.5/compiled/components/single-value.d.ts +27 -0
  236. package/dist/types-ts4.5/components/containers.d.ts +6 -11
  237. package/dist/types-ts4.5/components/control.d.ts +4 -9
  238. package/dist/types-ts4.5/components/group.d.ts +8 -10
  239. package/dist/types-ts4.5/components/index.d.ts +21 -21
  240. package/dist/types-ts4.5/components/indicators.d.ts +7 -12
  241. package/dist/types-ts4.5/components/input.d.ts +3 -8
  242. package/dist/types-ts4.5/components/internal/a11y-text.d.ts +2 -7
  243. package/dist/types-ts4.5/components/internal/dummy-input.d.ts +3 -8
  244. package/dist/types-ts4.5/components/internal/required-input.d.ts +0 -4
  245. package/dist/types-ts4.5/components/internal/scroll-manager.d.ts +2 -7
  246. package/dist/types-ts4.5/components/live-region.d.ts +2 -8
  247. package/dist/types-ts4.5/components/menu.d.ts +10 -15
  248. package/dist/types-ts4.5/components/multi-value.d.ts +19 -13
  249. package/dist/types-ts4.5/components/option.d.ts +3 -8
  250. package/dist/types-ts4.5/components/placeholder.d.ts +3 -8
  251. package/dist/types-ts4.5/components/single-value.d.ts +3 -8
  252. package/dist/types-ts4.5/emotion/components/containers.d.ts +54 -0
  253. package/dist/types-ts4.5/emotion/components/control.d.ts +42 -0
  254. package/dist/types-ts4.5/emotion/components/group.d.ts +52 -0
  255. package/dist/types-ts4.5/emotion/components/indicators.d.ts +73 -0
  256. package/dist/types-ts4.5/emotion/components/input.d.ts +37 -0
  257. package/dist/types-ts4.5/emotion/components/internal/a11y-text.d.ts +8 -0
  258. package/dist/types-ts4.5/emotion/components/internal/dummy-input.d.ts +9 -0
  259. package/dist/types-ts4.5/emotion/components/internal/required-input.d.ts +10 -0
  260. package/dist/types-ts4.5/emotion/components/live-region.d.ts +25 -0
  261. package/dist/types-ts4.5/emotion/components/menu.d.ts +116 -0
  262. package/dist/types-ts4.5/emotion/components/multi-value.d.ts +47 -0
  263. package/dist/types-ts4.5/emotion/components/option.d.ts +49 -0
  264. package/dist/types-ts4.5/emotion/components/placeholder.d.ts +22 -0
  265. package/dist/types-ts4.5/emotion/components/single-value.d.ts +28 -0
  266. package/dist/types-ts4.5/select.d.ts +21 -21
  267. package/dist/types-ts4.5/types.d.ts +3 -0
  268. package/package.json +10 -2
@@ -0,0 +1,177 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ /* eslint-disable @atlaskit/platform/ensure-feature-flag-prefix */
5
+ /**
6
+ * @jsxRuntime classic
7
+ * @jsx jsx
8
+ * @jsxFrag React.Fragment
9
+ */
10
+ import React, { Fragment, useMemo, useRef } from 'react';
11
+
12
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled
13
+ import { jsx } from '@emotion/react';
14
+ import { fg } from '@atlaskit/platform-feature-flags';
15
+ import { defaultAriaLiveMessages } from '../../accessibility';
16
+ import A11yText from './internal/a11y-text';
17
+
18
+ // ==============================
19
+ // Root Container
20
+ // ==============================
21
+
22
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
23
+ var LiveRegion = function LiveRegion(props) {
24
+ var ariaSelection = props.ariaSelection,
25
+ focusedOption = props.focusedOption,
26
+ focusedValue = props.focusedValue,
27
+ focusableOptions = props.focusableOptions,
28
+ isFocused = props.isFocused,
29
+ selectValue = props.selectValue,
30
+ selectProps = props.selectProps,
31
+ id = props.id,
32
+ isAppleDevice = props.isAppleDevice;
33
+ var ariaLiveMessages = selectProps.ariaLiveMessages,
34
+ getOptionLabel = selectProps.getOptionLabel,
35
+ inputValue = selectProps.inputValue,
36
+ isMulti = selectProps.isMulti,
37
+ isOptionDisabled = selectProps.isOptionDisabled,
38
+ isSearchable = selectProps.isSearchable,
39
+ label = selectProps.label,
40
+ menuIsOpen = selectProps.menuIsOpen,
41
+ options = selectProps.options,
42
+ screenReaderStatus = selectProps.screenReaderStatus,
43
+ tabSelectsValue = selectProps.tabSelectsValue,
44
+ isLoading = selectProps.isLoading;
45
+ var ariaLabel = selectProps['aria-label'] || label;
46
+ var ariaLive = selectProps['aria-live'];
47
+
48
+ // for safari, we will use minimum support from aria-live region
49
+ var isA11yImprovementEnabled = fg('design_system_select-a11y-improvement') && !isAppleDevice;
50
+
51
+ // Update aria live message configuration when prop changes
52
+ var messages = useMemo(function () {
53
+ return _objectSpread(_objectSpread({}, defaultAriaLiveMessages), ariaLiveMessages || {});
54
+ }, [ariaLiveMessages]);
55
+
56
+ // Update aria live selected option when prop changes
57
+ var ariaSelected = useMemo(function () {
58
+ var message = '';
59
+ if (isA11yImprovementEnabled && menuIsOpen) {
60
+ // we don't need to have selected message when the menu is open
61
+ return '';
62
+ }
63
+ if (ariaSelection && messages.onChange) {
64
+ var option = ariaSelection.option,
65
+ selectedOptions = ariaSelection.options,
66
+ removedValue = ariaSelection.removedValue,
67
+ removedValues = ariaSelection.removedValues,
68
+ value = ariaSelection.value;
69
+ // select-option when !isMulti does not return option so we assume selected option is value
70
+ var asOption = function asOption(val) {
71
+ return !Array.isArray(val) ? val : null;
72
+ };
73
+
74
+ // If there is just one item from the action then get its label
75
+ var selected = removedValue || option || asOption(value);
76
+ var _label = selected ? getOptionLabel(selected) : '';
77
+
78
+ // If there are multiple items from the action then return an array of labels
79
+ var multiSelected = selectedOptions || removedValues || undefined;
80
+ var labels = multiSelected ? multiSelected.map(getOptionLabel) : [];
81
+ if (isA11yImprovementEnabled && !_label && !labels.length) {
82
+ // return empty string if no labels provided
83
+ return '';
84
+ }
85
+ var onChangeProps = _objectSpread({
86
+ // multiSelected items are usually items that have already been selected
87
+ // or set by the user as a default value so we assume they are not disabled
88
+ isDisabled: selected && isOptionDisabled(selected, selectValue),
89
+ label: _label,
90
+ labels: labels
91
+ }, ariaSelection);
92
+ message = messages.onChange(onChangeProps);
93
+ }
94
+ return message;
95
+ }, [ariaSelection, messages, isOptionDisabled, selectValue, getOptionLabel, isA11yImprovementEnabled, menuIsOpen]);
96
+ var prevInputValue = useRef('');
97
+ var ariaFocused = useMemo(function () {
98
+ var focusMsg = '';
99
+ var focused = focusedOption || focusedValue;
100
+ var isSelected = !!(focusedOption && selectValue && selectValue.includes(focusedOption));
101
+ if (inputValue === prevInputValue.current && isA11yImprovementEnabled) {
102
+ // only announce focus option when searching when ff is on and the input value changed
103
+ // for safari, we will announce for all
104
+ return '';
105
+ }
106
+ if (focused && messages.onFocus) {
107
+ var onFocusProps = {
108
+ focused: focused,
109
+ label: getOptionLabel(focused),
110
+ isDisabled: isOptionDisabled(focused, selectValue),
111
+ isSelected: isSelected,
112
+ options: focusableOptions,
113
+ context: focused === focusedOption ? 'menu' : 'value',
114
+ selectValue: selectValue,
115
+ isMulti: isMulti
116
+ };
117
+ focusMsg = messages.onFocus(onFocusProps);
118
+ }
119
+ prevInputValue.current = inputValue;
120
+ return focusMsg;
121
+ }, [inputValue, focusedOption, focusedValue, getOptionLabel, isOptionDisabled, messages, focusableOptions, selectValue, isA11yImprovementEnabled, isMulti]);
122
+ var ariaResults = useMemo(function () {
123
+ var resultsMsg = '';
124
+ if (menuIsOpen && options.length && !isLoading && messages.onFilter) {
125
+ var resultsMessage = screenReaderStatus({
126
+ count: focusableOptions.length
127
+ });
128
+ resultsMsg = messages.onFilter({
129
+ inputValue: inputValue,
130
+ resultsMessage: resultsMessage
131
+ });
132
+ }
133
+ return resultsMsg;
134
+ }, [focusableOptions, inputValue, menuIsOpen, messages, options, screenReaderStatus, isLoading]);
135
+ var isInitialFocus = (ariaSelection === null || ariaSelection === void 0 ? void 0 : ariaSelection.action) === 'initial-input-focus';
136
+ var ariaGuidance = useMemo(function () {
137
+ if (fg('design_system_select-a11y-improvement')) {
138
+ // don't announce guidance at all when ff is on
139
+ return '';
140
+ }
141
+ var guidanceMsg = '';
142
+ if (messages.guidance) {
143
+ var context = focusedValue ? 'value' : menuIsOpen ? 'menu' : 'input';
144
+ guidanceMsg = messages.guidance({
145
+ 'aria-label': ariaLabel,
146
+ context: context,
147
+ isDisabled: focusedOption && isOptionDisabled(focusedOption, selectValue),
148
+ isMulti: isMulti,
149
+ isSearchable: isSearchable,
150
+ tabSelectsValue: tabSelectsValue,
151
+ isInitialFocus: isInitialFocus
152
+ });
153
+ }
154
+ return guidanceMsg;
155
+ }, [ariaLabel, focusedOption, focusedValue, isMulti, isOptionDisabled, isSearchable, menuIsOpen, messages, selectValue, tabSelectsValue, isInitialFocus]);
156
+ var ScreenReaderText = jsx(Fragment, null, jsx("span", {
157
+ id: "aria-selection"
158
+ }, ariaSelected), jsx("span", {
159
+ id: "aria-results"
160
+ }, ariaResults), !fg('design_system_select-a11y-improvement') && jsx(React.Fragment, null, jsx("span", {
161
+ id: "aria-focused"
162
+ }, ariaFocused), jsx("span", {
163
+ id: "aria-guidance"
164
+ }, ariaGuidance)));
165
+ return jsx(Fragment, null, jsx(A11yText, {
166
+ id: id
167
+ }, isInitialFocus && ScreenReaderText), jsx(A11yText, {
168
+ "aria-live": ariaLive // Should be undefined by default unless a specific use case requires it
169
+ ,
170
+ "aria-atomic": fg('design_system_select-a11y-improvement') ? undefined : 'false',
171
+ "aria-relevant": fg('design_system_select-a11y-improvement') ? undefined : 'additions text',
172
+ role: fg('design_system_select-a11y-improvement') ? 'status' : 'log'
173
+ }, isFocused && !isInitialFocus && ScreenReaderText));
174
+ };
175
+
176
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
177
+ export default LiveRegion;
@@ -0,0 +1,456 @@
1
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
2
+ import _objectDestructuringEmpty from "@babel/runtime/helpers/objectDestructuringEmpty";
3
+ import _extends from "@babel/runtime/helpers/extends";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
6
+ var _excluded = ["children", "innerProps"],
7
+ _excluded2 = ["children", "innerProps"];
8
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
+ /**
11
+ * @jsxRuntime classic
12
+ * @jsx jsx
13
+ */
14
+ import { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react';
15
+
16
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled
17
+ import { jsx } from '@emotion/react';
18
+ import { autoUpdate } from '@floating-ui/dom';
19
+ import { createPortal } from 'react-dom';
20
+ import useLayoutEffect from 'use-isomorphic-layout-effect';
21
+ import { fg } from '@atlaskit/platform-feature-flags';
22
+ import { Text } from '@atlaskit/primitives';
23
+ import { animatedScrollTo, getBoundingClientObj, getScrollParent, getScrollTop, getStyleProps, normalizedHeight, scrollTo } from '../../utils';
24
+
25
+ // ==============================
26
+ // Menu
27
+ // ==============================
28
+
29
+ // Get Menu Placement
30
+ // ------------------------------
31
+
32
+ function getMenuPlacement(_ref) {
33
+ var preferredMaxHeight = _ref.maxHeight,
34
+ menuEl = _ref.menuEl,
35
+ minHeight = _ref.minHeight,
36
+ preferredPlacement = _ref.placement,
37
+ shouldScroll = _ref.shouldScroll,
38
+ isFixedPosition = _ref.isFixedPosition,
39
+ controlHeight = _ref.controlHeight;
40
+ var scrollParent = getScrollParent(menuEl);
41
+ var defaultState = {
42
+ placement: 'bottom',
43
+ maxHeight: preferredMaxHeight
44
+ };
45
+
46
+ // something went wrong, return default state
47
+ if (!menuEl || !menuEl.offsetParent) {
48
+ return defaultState;
49
+ }
50
+
51
+ // we can't trust `scrollParent.scrollHeight` --> it may increase when
52
+ // the menu is rendered
53
+ var _scrollParent$getBoun = scrollParent.getBoundingClientRect(),
54
+ scrollHeight = _scrollParent$getBoun.height,
55
+ scrollParentTop = _scrollParent$getBoun.top;
56
+ var _menuEl$getBoundingCl = menuEl.getBoundingClientRect(),
57
+ menuBottom = _menuEl$getBoundingCl.bottom,
58
+ menuHeight = _menuEl$getBoundingCl.height,
59
+ menuTop = _menuEl$getBoundingCl.top;
60
+ var _menuEl$offsetParent$ = menuEl.offsetParent.getBoundingClientRect(),
61
+ containerTop = _menuEl$offsetParent$.top;
62
+ var viewHeight = isFixedPosition ? window.innerHeight : normalizedHeight(scrollParent);
63
+ var scrollTop = getScrollTop(scrollParent);
64
+ // use menuTop - scrollParentTop for the actual top space of menu in the scroll container
65
+ var menuTopFromParent = fg('design-system-select-fix-placement') ? menuTop - scrollParentTop : menuTop;
66
+ var marginBottom = parseInt(getComputedStyle(menuEl).marginBottom, 10);
67
+ var marginTop = parseInt(getComputedStyle(menuEl).marginTop, 10);
68
+ var viewSpaceAbove = containerTop - marginTop;
69
+ var viewSpaceBelow = viewHeight - menuTopFromParent;
70
+ var scrollSpaceAbove = viewSpaceAbove + scrollTop;
71
+ var scrollSpaceBelow = scrollHeight - scrollTop - menuTopFromParent;
72
+ var scrollDown = menuBottom - viewHeight + scrollTop + marginBottom;
73
+ var scrollUp = scrollTop + menuTop - marginTop;
74
+ var scrollDuration = 160;
75
+ switch (preferredPlacement) {
76
+ case 'auto':
77
+ case 'bottom':
78
+ // 1: the menu will fit, do nothing
79
+ if (viewSpaceBelow >= menuHeight) {
80
+ return {
81
+ placement: 'bottom',
82
+ maxHeight: preferredMaxHeight
83
+ };
84
+ }
85
+
86
+ // 2: the menu will fit, if scrolled
87
+ if (scrollSpaceBelow >= menuHeight && !isFixedPosition) {
88
+ if (shouldScroll) {
89
+ animatedScrollTo(scrollParent, scrollDown, scrollDuration);
90
+ }
91
+ return {
92
+ placement: 'bottom',
93
+ maxHeight: preferredMaxHeight
94
+ };
95
+ }
96
+
97
+ // 3: the menu will fit, if constrained
98
+ if (!isFixedPosition && scrollSpaceBelow >= minHeight || isFixedPosition && viewSpaceBelow >= minHeight) {
99
+ if (shouldScroll) {
100
+ animatedScrollTo(scrollParent, scrollDown, scrollDuration);
101
+ }
102
+
103
+ // we want to provide as much of the menu as possible to the user,
104
+ // so give them whatever is available below rather than the minHeight.
105
+ var constrainedHeight = isFixedPosition ? viewSpaceBelow - marginBottom : scrollSpaceBelow - marginBottom;
106
+ return {
107
+ placement: 'bottom',
108
+ maxHeight: constrainedHeight
109
+ };
110
+ }
111
+
112
+ // 4. Forked beviour when there isn't enough space below
113
+
114
+ // AUTO: flip the menu, render above
115
+ if (preferredPlacement === 'auto' || isFixedPosition) {
116
+ // may need to be constrained after flipping
117
+ var _constrainedHeight = preferredMaxHeight;
118
+ var spaceAbove = isFixedPosition ? viewSpaceAbove : scrollSpaceAbove;
119
+ if (spaceAbove >= minHeight) {
120
+ _constrainedHeight = Math.min(spaceAbove - marginBottom - controlHeight, preferredMaxHeight);
121
+ }
122
+ return {
123
+ placement: 'top',
124
+ maxHeight: _constrainedHeight
125
+ };
126
+ }
127
+
128
+ // BOTTOM: allow browser to increase scrollable area and immediately set scroll
129
+ if (preferredPlacement === 'bottom') {
130
+ if (shouldScroll) {
131
+ scrollTo(scrollParent, scrollDown);
132
+ }
133
+ return {
134
+ placement: 'bottom',
135
+ maxHeight: preferredMaxHeight
136
+ };
137
+ }
138
+ break;
139
+ case 'top':
140
+ // 1: the menu will fit, do nothing
141
+ if (viewSpaceAbove >= menuHeight) {
142
+ return {
143
+ placement: 'top',
144
+ maxHeight: preferredMaxHeight
145
+ };
146
+ }
147
+
148
+ // 2: the menu will fit, if scrolled
149
+ if (scrollSpaceAbove >= menuHeight && !isFixedPosition) {
150
+ if (shouldScroll) {
151
+ animatedScrollTo(scrollParent, scrollUp, scrollDuration);
152
+ }
153
+ return {
154
+ placement: 'top',
155
+ maxHeight: preferredMaxHeight
156
+ };
157
+ }
158
+
159
+ // 3: the menu will fit, if constrained
160
+ if (!isFixedPosition && scrollSpaceAbove >= minHeight || isFixedPosition && viewSpaceAbove >= minHeight) {
161
+ var _constrainedHeight2 = preferredMaxHeight;
162
+
163
+ // we want to provide as much of the menu as possible to the user,
164
+ // so give them whatever is available below rather than the minHeight.
165
+ if (!isFixedPosition && scrollSpaceAbove >= minHeight || isFixedPosition && viewSpaceAbove >= minHeight) {
166
+ _constrainedHeight2 = isFixedPosition ? viewSpaceAbove - marginTop : scrollSpaceAbove - marginTop;
167
+ }
168
+ if (shouldScroll) {
169
+ animatedScrollTo(scrollParent, scrollUp, scrollDuration);
170
+ }
171
+ return {
172
+ placement: 'top',
173
+ maxHeight: _constrainedHeight2
174
+ };
175
+ }
176
+
177
+ // 4. not enough space, the browser WILL NOT increase scrollable area when
178
+ // absolutely positioned element rendered above the viewport (only below).
179
+ // Flip the menu, render below
180
+ return {
181
+ placement: 'bottom',
182
+ maxHeight: preferredMaxHeight
183
+ };
184
+ default:
185
+ throw new Error("Invalid placement provided \"".concat(preferredPlacement, "\"."));
186
+ }
187
+ return defaultState;
188
+ }
189
+
190
+ // Menu Component
191
+ // ------------------------------
192
+
193
+ function alignToControl(placement) {
194
+ var placementToCSSProp = {
195
+ bottom: 'top',
196
+ top: 'bottom'
197
+ };
198
+ return placement ? placementToCSSProp[placement] : 'bottom';
199
+ }
200
+ var coercePlacement = function coercePlacement(p) {
201
+ return p === 'auto' ? 'bottom' : p;
202
+ };
203
+ export var menuCSS = function menuCSS(_ref2) {
204
+ var placement = _ref2.placement;
205
+ return _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({
206
+ label: 'menu'
207
+ }, alignToControl(placement), '100%'), "position", 'absolute'), "width", '100%'), "zIndex", 1), "borderRadius", "var(--ds-border-radius, 4px)"), "marginBottom", "var(--ds-space-100, 8px)"), "marginTop", "var(--ds-space-100, 8px)"), "backgroundColor", "var(--ds-surface-overlay, white)"), "boxShadow", "var(--ds-shadow-overlay, 0 0 0 1px hsl(0deg 0% 0% / 10%), 0 4px 11px hsl(0deg 0% 0% / 10%))");
208
+ };
209
+ var PortalPlacementContext = /*#__PURE__*/createContext(null);
210
+
211
+ // NOTE: internal only
212
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
213
+ export var MenuPlacer = function MenuPlacer(props) {
214
+ var children = props.children,
215
+ minMenuHeight = props.minMenuHeight,
216
+ maxMenuHeight = props.maxMenuHeight,
217
+ menuPlacement = props.menuPlacement,
218
+ menuPosition = props.menuPosition,
219
+ menuShouldScrollIntoView = props.menuShouldScrollIntoView;
220
+ var _ref4 = useContext(PortalPlacementContext) || {},
221
+ setPortalPlacement = _ref4.setPortalPlacement;
222
+ var ref = useRef(null);
223
+ var _useState = useState(maxMenuHeight),
224
+ _useState2 = _slicedToArray(_useState, 2),
225
+ maxHeight = _useState2[0],
226
+ setMaxHeight = _useState2[1];
227
+ var _useState3 = useState(null),
228
+ _useState4 = _slicedToArray(_useState3, 2),
229
+ placement = _useState4[0],
230
+ setPlacement = _useState4[1];
231
+ // The minimum height of the control
232
+ var controlHeight = 38;
233
+ useLayoutEffect(function () {
234
+ var menuEl = ref.current;
235
+ if (!menuEl) {
236
+ return;
237
+ }
238
+
239
+ // DO NOT scroll if position is fixed
240
+ var isFixedPosition = menuPosition === 'fixed';
241
+ var shouldScroll = menuShouldScrollIntoView && !isFixedPosition;
242
+ var state = getMenuPlacement({
243
+ maxHeight: maxMenuHeight,
244
+ menuEl: menuEl,
245
+ minHeight: minMenuHeight,
246
+ placement: menuPlacement,
247
+ shouldScroll: shouldScroll,
248
+ isFixedPosition: isFixedPosition,
249
+ controlHeight: controlHeight
250
+ });
251
+ setMaxHeight(state.maxHeight);
252
+ setPlacement(state.placement);
253
+ setPortalPlacement === null || setPortalPlacement === void 0 || setPortalPlacement(state.placement);
254
+ }, [maxMenuHeight, menuPlacement, menuPosition, menuShouldScrollIntoView, minMenuHeight, setPortalPlacement, controlHeight]);
255
+ return children({
256
+ ref: ref,
257
+ placerProps: _objectSpread(_objectSpread({}, props), {}, {
258
+ placement: placement || coercePlacement(menuPlacement),
259
+ maxHeight: maxHeight
260
+ })
261
+ });
262
+ };
263
+ var Menu = function Menu(props) {
264
+ var children = props.children,
265
+ innerRef = props.innerRef,
266
+ innerProps = props.innerProps;
267
+ return jsx("div", _extends({}, getStyleProps(props, 'menu', {
268
+ menu: true
269
+ }), {
270
+ ref: innerRef
271
+ }, innerProps), children);
272
+ };
273
+
274
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
275
+ export default Menu;
276
+
277
+ // ==============================
278
+ // Menu List
279
+ // ==============================
280
+
281
+ export var menuListCSS = function menuListCSS(_ref5) {
282
+ var maxHeight = _ref5.maxHeight;
283
+ return {
284
+ maxHeight: maxHeight,
285
+ overflowY: 'auto',
286
+ position: 'relative',
287
+ // required for offset[Height, Top] > keyboard scroll
288
+ WebkitOverflowScrolling: 'touch',
289
+ paddingTop: "var(--ds-space-100, 8px)",
290
+ paddingBottom: "var(--ds-space-100, 8px)"
291
+ };
292
+ };
293
+
294
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
295
+ export var MenuList = function MenuList(props) {
296
+ var children = props.children,
297
+ innerProps = props.innerProps,
298
+ innerRef = props.innerRef,
299
+ isMulti = props.isMulti;
300
+ return jsx("div", _extends({}, getStyleProps(props, 'menuList', {
301
+ 'menu-list': true,
302
+ 'menu-list--is-multi': isMulti
303
+ }), {
304
+ ref: innerRef
305
+ }, innerProps, {
306
+ tabIndex: -1
307
+ }), children);
308
+ };
309
+
310
+ // ==============================
311
+ // Menu Notices
312
+ // ==============================
313
+
314
+ var noticeCSS = function noticeCSS(_ref6) {
315
+ _objectDestructuringEmpty(_ref6);
316
+ return {
317
+ textAlign: 'center',
318
+ padding: "var(--ds-space-100, 8px)".concat(" ", "var(--ds-space-150, 12px)")
319
+ };
320
+ };
321
+ export var noOptionsMessageCSS = noticeCSS;
322
+ export var loadingMessageCSS = noticeCSS;
323
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
324
+ export var NoOptionsMessage = function NoOptionsMessage(_ref7) {
325
+ var _ref7$children = _ref7.children,
326
+ children = _ref7$children === void 0 ? 'No options' : _ref7$children,
327
+ innerProps = _ref7.innerProps,
328
+ restProps = _objectWithoutProperties(_ref7, _excluded);
329
+ return jsx("div", _extends({}, getStyleProps(_objectSpread(_objectSpread({}, restProps), {}, {
330
+ children: children,
331
+ innerProps: innerProps
332
+ }), 'noOptionsMessage', {
333
+ 'menu-notice': true,
334
+ 'menu-notice--no-options': true
335
+ }), {
336
+ // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
337
+ role: "option"
338
+ }, innerProps), jsx(Text, {
339
+ color: "color.text.subtle"
340
+ }, children));
341
+ };
342
+
343
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
344
+ export var LoadingMessage = function LoadingMessage(_ref8) {
345
+ var _ref8$children = _ref8.children,
346
+ children = _ref8$children === void 0 ? 'Loading...' : _ref8$children,
347
+ innerProps = _ref8.innerProps,
348
+ restProps = _objectWithoutProperties(_ref8, _excluded2);
349
+ return jsx("div", _extends({}, getStyleProps(_objectSpread(_objectSpread({}, restProps), {}, {
350
+ children: children,
351
+ innerProps: innerProps
352
+ }), 'loadingMessage', {
353
+ 'menu-notice': true,
354
+ 'menu-notice--loading': true
355
+ }), innerProps, {
356
+ // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
357
+ role: "option"
358
+ }), jsx(Text, {
359
+ color: "color.text.subtle"
360
+ }, children));
361
+ };
362
+
363
+ // ==============================
364
+ // Menu Portal
365
+ // ==============================
366
+
367
+ export var menuPortalCSS = function menuPortalCSS(_ref9) {
368
+ var rect = _ref9.rect,
369
+ offset = _ref9.offset,
370
+ position = _ref9.position;
371
+ return {
372
+ left: rect.left,
373
+ position: position,
374
+ top: offset,
375
+ width: rect.width,
376
+ zIndex: 1
377
+ };
378
+ };
379
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
380
+ export var MenuPortal = function MenuPortal(props) {
381
+ var appendTo = props.appendTo,
382
+ children = props.children,
383
+ controlElement = props.controlElement,
384
+ innerProps = props.innerProps,
385
+ menuPlacement = props.menuPlacement,
386
+ menuPosition = props.menuPosition;
387
+ var menuPortalRef = useRef(null);
388
+ var cleanupRef = useRef(null);
389
+ var _useState5 = useState(coercePlacement(menuPlacement)),
390
+ _useState6 = _slicedToArray(_useState5, 2),
391
+ placement = _useState6[0],
392
+ setPortalPlacement = _useState6[1];
393
+ var portalPlacementContext = useMemo(function () {
394
+ return {
395
+ setPortalPlacement: setPortalPlacement
396
+ };
397
+ }, []);
398
+ var _useState7 = useState(null),
399
+ _useState8 = _slicedToArray(_useState7, 2),
400
+ computedPosition = _useState8[0],
401
+ setComputedPosition = _useState8[1];
402
+ var updateComputedPosition = useCallback(function () {
403
+ if (!controlElement) {
404
+ return;
405
+ }
406
+ var rect = getBoundingClientObj(controlElement);
407
+ var scrollDistance = menuPosition === 'fixed' ? 0 : window.pageYOffset;
408
+ var offset = rect[placement] + scrollDistance;
409
+ if (offset !== (computedPosition === null || computedPosition === void 0 ? void 0 : computedPosition.offset) || rect.left !== (computedPosition === null || computedPosition === void 0 ? void 0 : computedPosition.rect.left) || rect.width !== (computedPosition === null || computedPosition === void 0 ? void 0 : computedPosition.rect.width)) {
410
+ setComputedPosition({
411
+ offset: offset,
412
+ rect: rect
413
+ });
414
+ }
415
+ }, [controlElement, menuPosition, placement, computedPosition === null || computedPosition === void 0 ? void 0 : computedPosition.offset, computedPosition === null || computedPosition === void 0 ? void 0 : computedPosition.rect.left, computedPosition === null || computedPosition === void 0 ? void 0 : computedPosition.rect.width]);
416
+ useLayoutEffect(function () {
417
+ updateComputedPosition();
418
+ }, [updateComputedPosition]);
419
+ var runAutoUpdate = useCallback(function () {
420
+ if (typeof cleanupRef.current === 'function') {
421
+ cleanupRef.current();
422
+ cleanupRef.current = null;
423
+ }
424
+ if (controlElement && menuPortalRef.current) {
425
+ cleanupRef.current = autoUpdate(controlElement, menuPortalRef.current, updateComputedPosition, {
426
+ elementResize: 'ResizeObserver' in window
427
+ });
428
+ }
429
+ }, [controlElement, updateComputedPosition]);
430
+ useLayoutEffect(function () {
431
+ runAutoUpdate();
432
+ }, [runAutoUpdate]);
433
+ var setMenuPortalElement = useCallback(function (menuPortalElement) {
434
+ menuPortalRef.current = menuPortalElement;
435
+ runAutoUpdate();
436
+ }, [runAutoUpdate]);
437
+
438
+ // bail early if required elements aren't present
439
+ if (!appendTo && menuPosition !== 'fixed' || !computedPosition) {
440
+ return null;
441
+ }
442
+
443
+ // same wrapper element whether fixed or portalled
444
+ var menuWrapper = jsx("div", _extends({
445
+ ref: setMenuPortalElement
446
+ }, getStyleProps(_objectSpread(_objectSpread({}, props), {}, {
447
+ offset: computedPosition.offset,
448
+ position: menuPosition,
449
+ rect: computedPosition.rect
450
+ }), 'menuPortal', {
451
+ 'menu-portal': true
452
+ }), innerProps), children);
453
+ return jsx(PortalPlacementContext.Provider, {
454
+ value: portalPlacementContext
455
+ }, appendTo ? /*#__PURE__*/createPortal(menuWrapper, appendTo) : menuWrapper);
456
+ };