@atlaskit/react-select 2.7.6 → 3.0.1

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 (273) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/cjs/components/containers.compiled.css +26 -0
  3. package/dist/cjs/components/containers.js +80 -13
  4. package/dist/cjs/components/control.js +50 -9
  5. package/dist/cjs/components/group.js +60 -12
  6. package/dist/cjs/components/indicators.js +128 -15
  7. package/dist/cjs/components/input.js +50 -9
  8. package/dist/cjs/components/internal/a11y-text.js +14 -7
  9. package/dist/cjs/components/internal/dummy-input.js +21 -7
  10. package/dist/cjs/components/internal/required-input.js +24 -8
  11. package/dist/cjs/components/live-region.js +101 -7
  12. package/dist/cjs/components/menu.js +436 -27
  13. package/dist/cjs/components/multi-value.js +148 -22
  14. package/dist/cjs/components/option.js +41 -9
  15. package/dist/cjs/components/placeholder.js +29 -9
  16. package/dist/cjs/components/single-value.js +30 -9
  17. package/dist/cjs/select.js +1 -1
  18. package/dist/es2019/components/containers.compiled.css +26 -0
  19. package/dist/es2019/components/containers.js +93 -10
  20. package/dist/es2019/components/control.js +54 -8
  21. package/dist/es2019/components/group.js +67 -9
  22. package/dist/es2019/components/indicators.js +131 -11
  23. package/dist/es2019/components/input.js +53 -7
  24. package/dist/es2019/components/internal/a11y-text.js +12 -6
  25. package/dist/es2019/components/internal/dummy-input.js +19 -7
  26. package/dist/es2019/components/internal/required-input.js +22 -6
  27. package/dist/es2019/components/live-region.js +104 -6
  28. package/dist/es2019/components/menu.js +444 -19
  29. package/dist/es2019/components/multi-value.js +157 -15
  30. package/dist/es2019/components/option.js +45 -7
  31. package/dist/es2019/components/placeholder.js +33 -7
  32. package/dist/es2019/components/single-value.js +34 -7
  33. package/dist/es2019/select.js +1 -1
  34. package/dist/esm/components/containers.compiled.css +26 -0
  35. package/dist/esm/components/containers.js +78 -12
  36. package/dist/esm/components/control.js +51 -8
  37. package/dist/esm/components/group.js +60 -11
  38. package/dist/esm/components/indicators.js +127 -15
  39. package/dist/esm/components/input.js +50 -8
  40. package/dist/esm/components/internal/a11y-text.js +12 -6
  41. package/dist/esm/components/internal/dummy-input.js +20 -7
  42. package/dist/esm/components/internal/required-input.js +22 -7
  43. package/dist/esm/components/live-region.js +99 -6
  44. package/dist/esm/components/menu.js +437 -27
  45. package/dist/esm/components/multi-value.js +148 -21
  46. package/dist/esm/components/option.js +41 -8
  47. package/dist/esm/components/placeholder.js +29 -8
  48. package/dist/esm/components/single-value.js +30 -8
  49. package/dist/esm/select.js +1 -1
  50. package/dist/types/components/containers.d.ts +12 -8
  51. package/dist/types/components/control.d.ts +7 -3
  52. package/dist/types/components/group.d.ts +10 -6
  53. package/dist/types/components/index.d.ts +21 -21
  54. package/dist/types/components/indicators.d.ts +12 -8
  55. package/dist/types/components/input.d.ts +8 -4
  56. package/dist/types/components/internal/a11y-text.d.ts +2 -2
  57. package/dist/types/components/internal/dummy-input.d.ts +7 -3
  58. package/dist/types/components/internal/required-input.d.ts +4 -0
  59. package/dist/types/components/live-region.d.ts +0 -2
  60. package/dist/types/components/menu.d.ts +17 -13
  61. package/dist/types/components/multi-value.d.ts +13 -9
  62. package/dist/types/components/option.d.ts +8 -4
  63. package/dist/types/components/placeholder.d.ts +8 -4
  64. package/dist/types/components/single-value.d.ts +8 -4
  65. package/dist/types/select.d.ts +23 -25
  66. package/dist/types-ts4.5/components/containers.d.ts +12 -8
  67. package/dist/types-ts4.5/components/control.d.ts +7 -3
  68. package/dist/types-ts4.5/components/group.d.ts +10 -6
  69. package/dist/types-ts4.5/components/index.d.ts +21 -21
  70. package/dist/types-ts4.5/components/indicators.d.ts +12 -8
  71. package/dist/types-ts4.5/components/input.d.ts +8 -4
  72. package/dist/types-ts4.5/components/internal/a11y-text.d.ts +2 -2
  73. package/dist/types-ts4.5/components/internal/dummy-input.d.ts +7 -3
  74. package/dist/types-ts4.5/components/internal/required-input.d.ts +4 -0
  75. package/dist/types-ts4.5/components/live-region.d.ts +0 -2
  76. package/dist/types-ts4.5/components/menu.d.ts +17 -13
  77. package/dist/types-ts4.5/components/multi-value.d.ts +13 -9
  78. package/dist/types-ts4.5/components/option.d.ts +8 -4
  79. package/dist/types-ts4.5/components/placeholder.d.ts +8 -4
  80. package/dist/types-ts4.5/components/single-value.d.ts +8 -4
  81. package/dist/types-ts4.5/select.d.ts +23 -25
  82. package/package.json +3 -3
  83. package/dist/cjs/compiled/components/control.js +0 -65
  84. package/dist/cjs/compiled/components/group.js +0 -80
  85. package/dist/cjs/compiled/components/indicators.js +0 -158
  86. package/dist/cjs/compiled/components/input.js +0 -65
  87. package/dist/cjs/compiled/components/internal/a11y-text.js +0 -24
  88. package/dist/cjs/compiled/components/internal/dummy-input.js +0 -30
  89. package/dist/cjs/compiled/components/internal/required-input.js +0 -35
  90. package/dist/cjs/compiled/components/live-region.js +0 -117
  91. package/dist/cjs/compiled/components/menu.js +0 -489
  92. package/dist/cjs/compiled/components/multi-value.js +0 -173
  93. package/dist/cjs/compiled/components/option.js +0 -56
  94. package/dist/cjs/compiled/components/placeholder.js +0 -44
  95. package/dist/cjs/compiled/components/single-value.js +0 -45
  96. package/dist/cjs/emotion/components/containers.js +0 -117
  97. package/dist/cjs/emotion/components/control.js +0 -112
  98. package/dist/cjs/emotion/components/group.js +0 -72
  99. package/dist/cjs/emotion/components/indicators.js +0 -140
  100. package/dist/cjs/emotion/components/input.js +0 -94
  101. package/dist/cjs/emotion/components/internal/a11y-text.js +0 -37
  102. package/dist/cjs/emotion/components/internal/dummy-input.js +0 -45
  103. package/dist/cjs/emotion/components/internal/index.js +0 -34
  104. package/dist/cjs/emotion/components/internal/required-input.js +0 -45
  105. package/dist/cjs/emotion/components/internal/scroll-manager.js +0 -59
  106. package/dist/cjs/emotion/components/internal/use-scroll-capture.js +0 -132
  107. package/dist/cjs/emotion/components/internal/use-scroll-lock.js +0 -149
  108. package/dist/cjs/emotion/components/live-region.js +0 -120
  109. package/dist/cjs/emotion/components/menu.js +0 -456
  110. package/dist/cjs/emotion/components/multi-value.js +0 -199
  111. package/dist/cjs/emotion/components/option.js +0 -84
  112. package/dist/cjs/emotion/components/placeholder.js +0 -36
  113. package/dist/cjs/emotion/components/single-value.js +0 -42
  114. package/dist/es2019/compiled/components/control.js +0 -58
  115. package/dist/es2019/compiled/components/group.js +0 -72
  116. package/dist/es2019/compiled/components/indicators.js +0 -146
  117. package/dist/es2019/compiled/components/input.js +0 -56
  118. package/dist/es2019/compiled/components/internal/a11y-text.js +0 -13
  119. package/dist/es2019/compiled/components/internal/dummy-input.js +0 -20
  120. package/dist/es2019/compiled/components/internal/required-input.js +0 -25
  121. package/dist/es2019/compiled/components/live-region.js +0 -112
  122. package/dist/es2019/compiled/components/menu.js +0 -477
  123. package/dist/es2019/compiled/components/multi-value.js +0 -165
  124. package/dist/es2019/compiled/components/option.js +0 -48
  125. package/dist/es2019/compiled/components/placeholder.js +0 -36
  126. package/dist/es2019/compiled/components/single-value.js +0 -37
  127. package/dist/es2019/emotion/components/containers.js +0 -114
  128. package/dist/es2019/emotion/components/control.js +0 -108
  129. package/dist/es2019/emotion/components/group.js +0 -60
  130. package/dist/es2019/emotion/components/indicators.js +0 -131
  131. package/dist/es2019/emotion/components/input.js +0 -87
  132. package/dist/es2019/emotion/components/internal/a11y-text.js +0 -28
  133. package/dist/es2019/emotion/components/internal/dummy-input.js +0 -38
  134. package/dist/es2019/emotion/components/internal/index.js +0 -4
  135. package/dist/es2019/emotion/components/internal/required-input.js +0 -36
  136. package/dist/es2019/emotion/components/internal/scroll-manager.js +0 -51
  137. package/dist/es2019/emotion/components/internal/use-scroll-capture.js +0 -128
  138. package/dist/es2019/emotion/components/internal/use-scroll-lock.js +0 -143
  139. package/dist/es2019/emotion/components/live-region.js +0 -120
  140. package/dist/es2019/emotion/components/menu.js +0 -452
  141. package/dist/es2019/emotion/components/multi-value.js +0 -203
  142. package/dist/es2019/emotion/components/option.js +0 -79
  143. package/dist/es2019/emotion/components/placeholder.js +0 -29
  144. package/dist/es2019/emotion/components/single-value.js +0 -35
  145. package/dist/esm/compiled/components/control.js +0 -57
  146. package/dist/esm/compiled/components/group.js +0 -71
  147. package/dist/esm/compiled/components/indicators.js +0 -150
  148. package/dist/esm/compiled/components/input.js +0 -56
  149. package/dist/esm/compiled/components/internal/a11y-text.js +0 -15
  150. package/dist/esm/compiled/components/internal/dummy-input.js +0 -21
  151. package/dist/esm/compiled/components/internal/required-input.js +0 -26
  152. package/dist/esm/compiled/components/live-region.js +0 -109
  153. package/dist/esm/compiled/components/menu.js +0 -484
  154. package/dist/esm/compiled/components/multi-value.js +0 -162
  155. package/dist/esm/compiled/components/option.js +0 -47
  156. package/dist/esm/compiled/components/placeholder.js +0 -35
  157. package/dist/esm/compiled/components/single-value.js +0 -36
  158. package/dist/esm/emotion/components/containers.js +0 -110
  159. package/dist/esm/emotion/components/control.js +0 -104
  160. package/dist/esm/emotion/components/group.js +0 -66
  161. package/dist/esm/emotion/components/indicators.js +0 -135
  162. package/dist/esm/emotion/components/input.js +0 -90
  163. package/dist/esm/emotion/components/internal/a11y-text.js +0 -30
  164. package/dist/esm/emotion/components/internal/dummy-input.js +0 -39
  165. package/dist/esm/emotion/components/internal/index.js +0 -4
  166. package/dist/esm/emotion/components/internal/required-input.js +0 -37
  167. package/dist/esm/emotion/components/internal/scroll-manager.js +0 -51
  168. package/dist/esm/emotion/components/internal/use-scroll-capture.js +0 -126
  169. package/dist/esm/emotion/components/internal/use-scroll-lock.js +0 -143
  170. package/dist/esm/emotion/components/live-region.js +0 -117
  171. package/dist/esm/emotion/components/menu.js +0 -456
  172. package/dist/esm/emotion/components/multi-value.js +0 -193
  173. package/dist/esm/emotion/components/option.js +0 -76
  174. package/dist/esm/emotion/components/placeholder.js +0 -28
  175. package/dist/esm/emotion/components/single-value.js +0 -34
  176. package/dist/types/compiled/components/control.d.ts +0 -41
  177. package/dist/types/compiled/components/group.d.ts +0 -54
  178. package/dist/types/compiled/components/indicators.d.ts +0 -72
  179. package/dist/types/compiled/components/input.d.ts +0 -36
  180. package/dist/types/compiled/components/internal/a11y-text.d.ts +0 -3
  181. package/dist/types/compiled/components/internal/dummy-input.d.ts +0 -8
  182. package/dist/types/compiled/components/internal/required-input.d.ts +0 -10
  183. package/dist/types/compiled/components/live-region.d.ts +0 -17
  184. package/dist/types/compiled/components/menu.d.ts +0 -115
  185. package/dist/types/compiled/components/multi-value.d.ts +0 -57
  186. package/dist/types/compiled/components/option.d.ts +0 -48
  187. package/dist/types/compiled/components/placeholder.d.ts +0 -21
  188. package/dist/types/compiled/components/single-value.d.ts +0 -27
  189. package/dist/types/emotion/components/containers.d.ts +0 -54
  190. package/dist/types/emotion/components/control.d.ts +0 -42
  191. package/dist/types/emotion/components/group.d.ts +0 -52
  192. package/dist/types/emotion/components/indicators.d.ts +0 -73
  193. package/dist/types/emotion/components/input.d.ts +0 -37
  194. package/dist/types/emotion/components/internal/a11y-text.d.ts +0 -8
  195. package/dist/types/emotion/components/internal/dummy-input.d.ts +0 -9
  196. package/dist/types/emotion/components/internal/index.d.ts +0 -4
  197. package/dist/types/emotion/components/internal/required-input.d.ts +0 -10
  198. package/dist/types/emotion/components/internal/scroll-manager.d.ts +0 -17
  199. package/dist/types/emotion/components/internal/use-scroll-capture.d.ts +0 -12
  200. package/dist/types/emotion/components/internal/use-scroll-lock.d.ts +0 -9
  201. package/dist/types/emotion/components/live-region.d.ts +0 -23
  202. package/dist/types/emotion/components/menu.d.ts +0 -116
  203. package/dist/types/emotion/components/multi-value.d.ts +0 -47
  204. package/dist/types/emotion/components/option.d.ts +0 -49
  205. package/dist/types/emotion/components/placeholder.d.ts +0 -22
  206. package/dist/types/emotion/components/single-value.d.ts +0 -28
  207. package/dist/types-ts4.5/compiled/components/control.d.ts +0 -41
  208. package/dist/types-ts4.5/compiled/components/group.d.ts +0 -54
  209. package/dist/types-ts4.5/compiled/components/indicators.d.ts +0 -72
  210. package/dist/types-ts4.5/compiled/components/input.d.ts +0 -36
  211. package/dist/types-ts4.5/compiled/components/internal/a11y-text.d.ts +0 -3
  212. package/dist/types-ts4.5/compiled/components/internal/dummy-input.d.ts +0 -8
  213. package/dist/types-ts4.5/compiled/components/internal/required-input.d.ts +0 -10
  214. package/dist/types-ts4.5/compiled/components/live-region.d.ts +0 -17
  215. package/dist/types-ts4.5/compiled/components/menu.d.ts +0 -115
  216. package/dist/types-ts4.5/compiled/components/multi-value.d.ts +0 -57
  217. package/dist/types-ts4.5/compiled/components/option.d.ts +0 -48
  218. package/dist/types-ts4.5/compiled/components/placeholder.d.ts +0 -21
  219. package/dist/types-ts4.5/compiled/components/single-value.d.ts +0 -27
  220. package/dist/types-ts4.5/emotion/components/containers.d.ts +0 -54
  221. package/dist/types-ts4.5/emotion/components/control.d.ts +0 -42
  222. package/dist/types-ts4.5/emotion/components/group.d.ts +0 -52
  223. package/dist/types-ts4.5/emotion/components/indicators.d.ts +0 -73
  224. package/dist/types-ts4.5/emotion/components/input.d.ts +0 -37
  225. package/dist/types-ts4.5/emotion/components/internal/a11y-text.d.ts +0 -8
  226. package/dist/types-ts4.5/emotion/components/internal/dummy-input.d.ts +0 -9
  227. package/dist/types-ts4.5/emotion/components/internal/index.d.ts +0 -4
  228. package/dist/types-ts4.5/emotion/components/internal/required-input.d.ts +0 -10
  229. package/dist/types-ts4.5/emotion/components/internal/scroll-manager.d.ts +0 -17
  230. package/dist/types-ts4.5/emotion/components/internal/use-scroll-capture.d.ts +0 -12
  231. package/dist/types-ts4.5/emotion/components/internal/use-scroll-lock.d.ts +0 -9
  232. package/dist/types-ts4.5/emotion/components/live-region.d.ts +0 -23
  233. package/dist/types-ts4.5/emotion/components/menu.d.ts +0 -116
  234. package/dist/types-ts4.5/emotion/components/multi-value.d.ts +0 -47
  235. package/dist/types-ts4.5/emotion/components/option.d.ts +0 -49
  236. package/dist/types-ts4.5/emotion/components/placeholder.d.ts +0 -22
  237. package/dist/types-ts4.5/emotion/components/single-value.d.ts +0 -28
  238. /package/dist/cjs/{compiled/components → components}/control.compiled.css +0 -0
  239. /package/dist/cjs/{compiled/components → components}/group.compiled.css +0 -0
  240. /package/dist/cjs/{compiled/components → components}/indicators.compiled.css +0 -0
  241. /package/dist/cjs/{compiled/components → components}/input.compiled.css +0 -0
  242. /package/dist/cjs/{compiled/components → components}/internal/a11y-text.compiled.css +0 -0
  243. /package/dist/cjs/{compiled/components → components}/internal/dummy-input.compiled.css +0 -0
  244. /package/dist/cjs/{compiled/components → components}/internal/required-input.compiled.css +0 -0
  245. /package/dist/cjs/{compiled/components → components}/menu.compiled.css +0 -0
  246. /package/dist/cjs/{compiled/components → components}/multi-value.compiled.css +0 -0
  247. /package/dist/cjs/{compiled/components → components}/option.compiled.css +0 -0
  248. /package/dist/cjs/{compiled/components → components}/placeholder.compiled.css +0 -0
  249. /package/dist/cjs/{compiled/components → components}/single-value.compiled.css +0 -0
  250. /package/dist/es2019/{compiled/components → components}/control.compiled.css +0 -0
  251. /package/dist/es2019/{compiled/components → components}/group.compiled.css +0 -0
  252. /package/dist/es2019/{compiled/components → components}/indicators.compiled.css +0 -0
  253. /package/dist/es2019/{compiled/components → components}/input.compiled.css +0 -0
  254. /package/dist/es2019/{compiled/components → components}/internal/a11y-text.compiled.css +0 -0
  255. /package/dist/es2019/{compiled/components → components}/internal/dummy-input.compiled.css +0 -0
  256. /package/dist/es2019/{compiled/components → components}/internal/required-input.compiled.css +0 -0
  257. /package/dist/es2019/{compiled/components → components}/menu.compiled.css +0 -0
  258. /package/dist/es2019/{compiled/components → components}/multi-value.compiled.css +0 -0
  259. /package/dist/es2019/{compiled/components → components}/option.compiled.css +0 -0
  260. /package/dist/es2019/{compiled/components → components}/placeholder.compiled.css +0 -0
  261. /package/dist/es2019/{compiled/components → components}/single-value.compiled.css +0 -0
  262. /package/dist/esm/{compiled/components → components}/control.compiled.css +0 -0
  263. /package/dist/esm/{compiled/components → components}/group.compiled.css +0 -0
  264. /package/dist/esm/{compiled/components → components}/indicators.compiled.css +0 -0
  265. /package/dist/esm/{compiled/components → components}/input.compiled.css +0 -0
  266. /package/dist/esm/{compiled/components → components}/internal/a11y-text.compiled.css +0 -0
  267. /package/dist/esm/{compiled/components → components}/internal/dummy-input.compiled.css +0 -0
  268. /package/dist/esm/{compiled/components → components}/internal/required-input.compiled.css +0 -0
  269. /package/dist/esm/{compiled/components → components}/menu.compiled.css +0 -0
  270. /package/dist/esm/{compiled/components → components}/multi-value.compiled.css +0 -0
  271. /package/dist/esm/{compiled/components → components}/option.compiled.css +0 -0
  272. /package/dist/esm/{compiled/components → components}/placeholder.compiled.css +0 -0
  273. /package/dist/esm/{compiled/components → components}/single-value.compiled.css +0 -0
@@ -1,452 +0,0 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
- /**
3
- * @jsxRuntime classic
4
- * @jsx jsx
5
- */
6
- import { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react';
7
-
8
- // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled
9
- import { jsx } from '@emotion/react';
10
- import { autoUpdate } from '@floating-ui/dom';
11
- import { createPortal } from 'react-dom';
12
- import useLayoutEffect from 'use-isomorphic-layout-effect';
13
- import { Text } from '@atlaskit/primitives';
14
- import { animatedScrollTo, getBoundingClientObj, getScrollParent, getScrollTop, getStyleProps, normalizedHeight, scrollTo } from '../../utils';
15
-
16
- // ==============================
17
- // Menu
18
- // ==============================
19
-
20
- // Get Menu Placement
21
- // ------------------------------
22
-
23
- function getMenuPlacement({
24
- maxHeight: preferredMaxHeight,
25
- menuEl,
26
- minHeight,
27
- placement: preferredPlacement,
28
- shouldScroll,
29
- isFixedPosition,
30
- controlHeight
31
- }) {
32
- const scrollParent = getScrollParent(menuEl);
33
- const defaultState = {
34
- placement: 'bottom',
35
- maxHeight: preferredMaxHeight
36
- };
37
-
38
- // something went wrong, return default state
39
- if (!menuEl || !menuEl.offsetParent) {
40
- return defaultState;
41
- }
42
-
43
- // we can't trust `scrollParent.scrollHeight` --> it may increase when
44
- // the menu is rendered
45
- const {
46
- height: scrollHeight
47
- } = scrollParent.getBoundingClientRect();
48
- const {
49
- bottom: menuBottom,
50
- height: menuHeight,
51
- top: menuTop
52
- } = menuEl.getBoundingClientRect();
53
- const {
54
- top: containerTop
55
- } = menuEl.offsetParent.getBoundingClientRect();
56
- const viewHeight = isFixedPosition ? window.innerHeight : normalizedHeight(scrollParent);
57
- const scrollTop = getScrollTop(scrollParent);
58
- const menuTopFromParent = menuTop;
59
- const marginBottom = parseInt(getComputedStyle(menuEl).marginBottom, 10);
60
- const marginTop = parseInt(getComputedStyle(menuEl).marginTop, 10);
61
- const viewSpaceAbove = containerTop - marginTop;
62
- const viewSpaceBelow = viewHeight - menuTopFromParent;
63
- const scrollSpaceAbove = viewSpaceAbove + scrollTop;
64
- const scrollSpaceBelow = scrollHeight - scrollTop - menuTopFromParent;
65
- const scrollDown = menuBottom - viewHeight + scrollTop + marginBottom;
66
- const scrollUp = scrollTop + menuTop - marginTop;
67
- const scrollDuration = 160;
68
- switch (preferredPlacement) {
69
- case 'auto':
70
- case 'bottom':
71
- // 1: the menu will fit, do nothing
72
- if (viewSpaceBelow >= menuHeight) {
73
- return {
74
- placement: 'bottom',
75
- maxHeight: preferredMaxHeight
76
- };
77
- }
78
-
79
- // 2: the menu will fit, if scrolled
80
- if (scrollSpaceBelow >= menuHeight && !isFixedPosition) {
81
- if (shouldScroll) {
82
- animatedScrollTo(scrollParent, scrollDown, scrollDuration);
83
- }
84
- return {
85
- placement: 'bottom',
86
- maxHeight: preferredMaxHeight
87
- };
88
- }
89
-
90
- // 3: the menu will fit, if constrained
91
- if (!isFixedPosition && scrollSpaceBelow >= minHeight || isFixedPosition && viewSpaceBelow >= minHeight) {
92
- if (shouldScroll) {
93
- animatedScrollTo(scrollParent, scrollDown, scrollDuration);
94
- }
95
-
96
- // we want to provide as much of the menu as possible to the user,
97
- // so give them whatever is available below rather than the minHeight.
98
- const constrainedHeight = isFixedPosition ? viewSpaceBelow - marginBottom : scrollSpaceBelow - marginBottom;
99
- return {
100
- placement: 'bottom',
101
- maxHeight: constrainedHeight
102
- };
103
- }
104
-
105
- // 4. Forked beviour when there isn't enough space below
106
-
107
- // AUTO: flip the menu, render above
108
- if (preferredPlacement === 'auto' || isFixedPosition) {
109
- // may need to be constrained after flipping
110
- let constrainedHeight = preferredMaxHeight;
111
- const spaceAbove = isFixedPosition ? viewSpaceAbove : scrollSpaceAbove;
112
- if (spaceAbove >= minHeight) {
113
- constrainedHeight = Math.min(spaceAbove - marginBottom - controlHeight, preferredMaxHeight);
114
- }
115
- return {
116
- placement: 'top',
117
- maxHeight: constrainedHeight
118
- };
119
- }
120
-
121
- // BOTTOM: allow browser to increase scrollable area and immediately set scroll
122
- if (preferredPlacement === 'bottom') {
123
- if (shouldScroll) {
124
- scrollTo(scrollParent, scrollDown);
125
- }
126
- return {
127
- placement: 'bottom',
128
- maxHeight: preferredMaxHeight
129
- };
130
- }
131
- break;
132
- case 'top':
133
- // 1: the menu will fit, do nothing
134
- if (viewSpaceAbove >= menuHeight) {
135
- return {
136
- placement: 'top',
137
- maxHeight: preferredMaxHeight
138
- };
139
- }
140
-
141
- // 2: the menu will fit, if scrolled
142
- if (scrollSpaceAbove >= menuHeight && !isFixedPosition) {
143
- if (shouldScroll) {
144
- animatedScrollTo(scrollParent, scrollUp, scrollDuration);
145
- }
146
- return {
147
- placement: 'top',
148
- maxHeight: preferredMaxHeight
149
- };
150
- }
151
-
152
- // 3: the menu will fit, if constrained
153
- if (!isFixedPosition && scrollSpaceAbove >= minHeight || isFixedPosition && viewSpaceAbove >= minHeight) {
154
- let constrainedHeight = preferredMaxHeight;
155
-
156
- // we want to provide as much of the menu as possible to the user,
157
- // so give them whatever is available below rather than the minHeight.
158
- if (!isFixedPosition && scrollSpaceAbove >= minHeight || isFixedPosition && viewSpaceAbove >= minHeight) {
159
- constrainedHeight = isFixedPosition ? viewSpaceAbove - marginTop : scrollSpaceAbove - marginTop;
160
- }
161
- if (shouldScroll) {
162
- animatedScrollTo(scrollParent, scrollUp, scrollDuration);
163
- }
164
- return {
165
- placement: 'top',
166
- maxHeight: constrainedHeight
167
- };
168
- }
169
-
170
- // 4. not enough space, the browser WILL NOT increase scrollable area when
171
- // absolutely positioned element rendered above the viewport (only below).
172
- // Flip the menu, render below
173
- return {
174
- placement: 'bottom',
175
- maxHeight: preferredMaxHeight
176
- };
177
- default:
178
- throw new Error(`Invalid placement provided "${preferredPlacement}".`);
179
- }
180
- return defaultState;
181
- }
182
-
183
- // Menu Component
184
- // ------------------------------
185
-
186
- function alignToControl(placement) {
187
- const placementToCSSProp = {
188
- bottom: 'top',
189
- top: 'bottom'
190
- };
191
- return placement ? placementToCSSProp[placement] : 'bottom';
192
- }
193
- const coercePlacement = p => p === 'auto' ? 'bottom' : p;
194
- export const menuCSS = ({
195
- placement
196
- }) => ({
197
- label: 'menu',
198
- [alignToControl(placement)]: '100%',
199
- position: 'absolute',
200
- width: '100%',
201
- zIndex: 1,
202
- borderRadius: "var(--ds-border-radius, 4px)",
203
- marginBottom: "var(--ds-space-100, 8px)",
204
- marginTop: "var(--ds-space-100, 8px)",
205
- backgroundColor: "var(--ds-surface-overlay, white)",
206
- boxShadow: "var(--ds-shadow-overlay, 0 0 0 1px hsl(0deg 0% 0% / 10%), 0 4px 11px hsl(0deg 0% 0% / 10%))"
207
- });
208
- const PortalPlacementContext = /*#__PURE__*/createContext(null);
209
-
210
- // NOTE: internal only
211
- // eslint-disable-next-line @repo/internal/react/require-jsdoc
212
- export const MenuPlacer = props => {
213
- const {
214
- children,
215
- minMenuHeight,
216
- maxMenuHeight,
217
- menuPlacement,
218
- menuPosition,
219
- menuShouldScrollIntoView
220
- } = props;
221
- const {
222
- setPortalPlacement
223
- } = useContext(PortalPlacementContext) || {};
224
- const ref = useRef(null);
225
- const [maxHeight, setMaxHeight] = useState(maxMenuHeight);
226
- const [placement, setPlacement] = useState(null);
227
- // The minimum height of the control
228
- const controlHeight = 38;
229
- useLayoutEffect(() => {
230
- const menuEl = ref.current;
231
- if (!menuEl) {
232
- return;
233
- }
234
-
235
- // DO NOT scroll if position is fixed
236
- const isFixedPosition = menuPosition === 'fixed';
237
- const shouldScroll = menuShouldScrollIntoView && !isFixedPosition;
238
- const state = getMenuPlacement({
239
- maxHeight: maxMenuHeight,
240
- menuEl,
241
- minHeight: minMenuHeight,
242
- placement: menuPlacement,
243
- shouldScroll,
244
- isFixedPosition,
245
- controlHeight
246
- });
247
- setMaxHeight(state.maxHeight);
248
- setPlacement(state.placement);
249
- setPortalPlacement === null || setPortalPlacement === void 0 ? void 0 : setPortalPlacement(state.placement);
250
- }, [maxMenuHeight, menuPlacement, menuPosition, menuShouldScrollIntoView, minMenuHeight, setPortalPlacement, controlHeight]);
251
- return children({
252
- ref,
253
- placerProps: {
254
- ...props,
255
- placement: placement || coercePlacement(menuPlacement),
256
- maxHeight
257
- }
258
- });
259
- };
260
- const Menu = props => {
261
- const {
262
- children,
263
- innerRef,
264
- innerProps
265
- } = props;
266
- const styles = getStyleProps(props, 'menu', {
267
- menu: true
268
- });
269
- return jsx("div", _extends({}, styles, {
270
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop
271
- className: styles.className || '-menu',
272
- ref: innerRef
273
- }, innerProps), children);
274
- };
275
-
276
- // eslint-disable-next-line @repo/internal/react/require-jsdoc
277
- export default Menu;
278
-
279
- // ==============================
280
- // Menu List
281
- // ==============================
282
-
283
- export const menuListCSS = ({
284
- maxHeight
285
- }) => ({
286
- maxHeight,
287
- overflowY: 'auto',
288
- position: 'relative',
289
- // required for offset[Height, Top] > keyboard scroll
290
- WebkitOverflowScrolling: 'touch',
291
- paddingTop: "var(--ds-space-100, 8px)",
292
- paddingBottom: "var(--ds-space-100, 8px)"
293
- });
294
-
295
- // eslint-disable-next-line @repo/internal/react/require-jsdoc
296
- export const MenuList = props => {
297
- const {
298
- children,
299
- innerProps,
300
- innerRef,
301
- isMulti
302
- } = props;
303
- return jsx("div", _extends({}, getStyleProps(props, 'menuList', {
304
- 'menu-list': true,
305
- 'menu-list--is-multi': isMulti
306
- }), {
307
- ref: innerRef
308
- }, innerProps, {
309
- tabIndex: -1
310
- }), children);
311
- };
312
-
313
- // ==============================
314
- // Menu Notices
315
- // ==============================
316
-
317
- const noticeCSS = ({}) => ({
318
- textAlign: 'center',
319
- padding: `${"var(--ds-space-100, 8px)"} ${"var(--ds-space-150, 12px)"}`
320
- });
321
- export const noOptionsMessageCSS = noticeCSS;
322
- export const loadingMessageCSS = noticeCSS;
323
- // eslint-disable-next-line @repo/internal/react/require-jsdoc
324
- export const NoOptionsMessage = ({
325
- children = 'No options',
326
- innerProps,
327
- ...restProps
328
- }) => {
329
- return jsx("div", _extends({}, getStyleProps({
330
- ...restProps,
331
- children,
332
- innerProps
333
- }, 'noOptionsMessage', {
334
- 'menu-notice': true,
335
- 'menu-notice--no-options': true
336
- }), {
337
- // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
338
- role: "option"
339
- }, innerProps), jsx(Text, {
340
- color: "color.text.subtle"
341
- }, children));
342
- };
343
-
344
- // eslint-disable-next-line @repo/internal/react/require-jsdoc
345
- export const LoadingMessage = ({
346
- children = 'Loading...',
347
- innerProps,
348
- ...restProps
349
- }) => {
350
- return jsx("div", _extends({}, getStyleProps({
351
- ...restProps,
352
- children,
353
- innerProps
354
- }, 'loadingMessage', {
355
- 'menu-notice': true,
356
- 'menu-notice--loading': true
357
- }), innerProps, {
358
- // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
359
- role: "option"
360
- }), jsx(Text, {
361
- color: "color.text.subtle"
362
- }, children));
363
- };
364
-
365
- // ==============================
366
- // Menu Portal
367
- // ==============================
368
-
369
- export const menuPortalCSS = ({
370
- rect,
371
- offset,
372
- position
373
- }) => ({
374
- left: rect.left,
375
- position: position,
376
- top: offset,
377
- width: rect.width,
378
- zIndex: 1
379
- });
380
- // eslint-disable-next-line @repo/internal/react/require-jsdoc
381
- export const MenuPortal = props => {
382
- const {
383
- appendTo,
384
- children,
385
- controlElement,
386
- innerProps,
387
- menuPlacement,
388
- menuPosition
389
- } = props;
390
- const menuPortalRef = useRef(null);
391
- const cleanupRef = useRef(null);
392
- const [placement, setPortalPlacement] = useState(coercePlacement(menuPlacement));
393
- const portalPlacementContext = useMemo(() => ({
394
- setPortalPlacement
395
- }), []);
396
- const [computedPosition, setComputedPosition] = useState(null);
397
- const updateComputedPosition = useCallback(() => {
398
- if (!controlElement) {
399
- return;
400
- }
401
- const rect = getBoundingClientObj(controlElement);
402
- const scrollDistance = menuPosition === 'fixed' ? 0 : window.pageYOffset;
403
- const offset = rect[placement] + scrollDistance;
404
- 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)) {
405
- setComputedPosition({
406
- offset,
407
- rect
408
- });
409
- }
410
- }, [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]);
411
- useLayoutEffect(() => {
412
- updateComputedPosition();
413
- }, [updateComputedPosition]);
414
- const runAutoUpdate = useCallback(() => {
415
- if (typeof cleanupRef.current === 'function') {
416
- cleanupRef.current();
417
- cleanupRef.current = null;
418
- }
419
- if (controlElement && menuPortalRef.current) {
420
- cleanupRef.current = autoUpdate(controlElement, menuPortalRef.current, updateComputedPosition, {
421
- elementResize: 'ResizeObserver' in window
422
- });
423
- }
424
- }, [controlElement, updateComputedPosition]);
425
- useLayoutEffect(() => {
426
- runAutoUpdate();
427
- }, [runAutoUpdate]);
428
- const setMenuPortalElement = useCallback(menuPortalElement => {
429
- menuPortalRef.current = menuPortalElement;
430
- runAutoUpdate();
431
- }, [runAutoUpdate]);
432
-
433
- // bail early if required elements aren't present
434
- if (!appendTo && menuPosition !== 'fixed' || !computedPosition) {
435
- return null;
436
- }
437
-
438
- // same wrapper element whether fixed or portalled
439
- const menuWrapper = jsx("div", _extends({
440
- ref: setMenuPortalElement
441
- }, getStyleProps({
442
- ...props,
443
- offset: computedPosition.offset,
444
- position: menuPosition,
445
- rect: computedPosition.rect
446
- }, 'menuPortal', {
447
- 'menu-portal': true
448
- }), innerProps), children);
449
- return jsx(PortalPlacementContext.Provider, {
450
- value: portalPlacementContext
451
- }, appendTo ? /*#__PURE__*/createPortal(menuWrapper, appendTo) : menuWrapper);
452
- };
@@ -1,203 +0,0 @@
1
- /**
2
- * @jsxRuntime classic
3
- * @jsx jsx
4
- */
5
-
6
- // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled
7
- import { css, jsx } from '@emotion/react';
8
- import CrossIcon from '@atlaskit/icon/core/close';
9
- import LegacySelectClearIcon from '@atlaskit/icon/glyph/select-clear';
10
- import { fg } from '@atlaskit/platform-feature-flags';
11
- import { getStyleProps } from '../../utils';
12
- export const multiValueCSS = ({
13
- isDisabled,
14
- isFocused
15
- }) => {
16
- let backgroundColor;
17
- let color;
18
- if (isDisabled) {
19
- // Use the basic neutral background so it is slightly separate from the
20
- // field's background
21
- backgroundColor = "var(--ds-background-neutral, #091E420F)";
22
- color = "var(--ds-text-disabled, #091E424F)";
23
- } else if (isFocused) {
24
- backgroundColor = "var(--ds-background-selected, #E9F2FF)";
25
- color = "var(--ds-text-selected, hsl(0, 0%, 20%))";
26
- } else {
27
- backgroundColor = fg('platform-component-visual-refresh') ? "var(--ds-background-neutral-subtle-hovered, #091E420F)" : "var(--ds-background-neutral, #091E420F)";
28
- color = "var(--ds-text, hsl(0, 0%, 20%))";
29
- }
30
- return {
31
- label: 'multiValue',
32
- display: 'flex',
33
- minWidth: 0,
34
- // resolves flex/text-overflow bug
35
- margin: "var(--ds-space-025, 2px)",
36
- borderRadius: "var(--ds-border-radius-050, 2px)",
37
- backgroundColor,
38
- boxShadow: isFocused ? `0 0 0 2px ${"var(--ds-surface, transparent)"}, 0 0 0 4px ${"var(--ds-border-focused, transparent)"}` : 'none',
39
- maxWidth: '100%',
40
- '@media screen and (-ms-high-contrast: active)': {
41
- border: isFocused ? '1px solid transparent' : 'none'
42
- },
43
- color,
44
- ...(fg('platform-component-visual-refresh') && {
45
- borderRadius: "var(--ds-border-radius-100, 4px)",
46
- // Hardcode this color for visual refresh as there is no token color yet
47
- borderColor: '#B7B9BE',
48
- borderWidth: "var(--ds-border-width, 1px)",
49
- borderStyle: 'solid',
50
- backgroundColor: "var(--ds-background-input, #FFFFFF)"
51
- })
52
- };
53
- };
54
- export const multiValueLabelCSS = ({
55
- cropWithEllipsis,
56
- isDisabled
57
- }) => ({
58
- overflow: 'hidden',
59
- textOverflow: cropWithEllipsis || cropWithEllipsis === undefined ? 'ellipsis' : undefined,
60
- whiteSpace: 'nowrap',
61
- borderRadius: "var(--ds-border-radius-050, 2px)",
62
- // eslint-disable-next-line @atlaskit/design-system/use-tokens-typography
63
- fontSize: '85%',
64
- font: "var(--ds-font-body-UNSAFE_small, normal 400 12px/16px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, \"Helvetica Neue\", sans-serif)",
65
- padding: "var(--ds-space-025, 2px)",
66
- color: isDisabled ? "var(--ds-text-disabled, #091E424F)" : 'inherit',
67
- paddingLeft: "var(--ds-space-075, 6px)",
68
- ...(fg('platform-component-visual-refresh') && {
69
- font: "var(--ds-font-body, normal 400 14px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, \"Helvetica Neue\", sans-serif)",
70
- paddingTop: 0,
71
- paddingBottom: 0,
72
- paddingLeft: "var(--ds-space-050, 4px)"
73
- })
74
- });
75
- export const multiValueRemoveCSS = ({
76
- isFocused
77
- }) => ({
78
- alignItems: 'center',
79
- display: 'flex',
80
- backgroundColor: isFocused ? "var(--ds-UNSAFE-transparent, transparent)" : undefined,
81
- fill: isFocused ? "var(--ds-text-selected, #000)" : "var(--ds-text, #000)",
82
- paddingLeft: "var(--ds-space-025, 2px)",
83
- paddingRight: "var(--ds-space-025, 2px)",
84
- borderRadius: '0px 2px 2px 0px',
85
- // DSP-6470 we should style like Tag once we have the :has selector
86
- ':hover': {
87
- backgroundColor: "var(--ds-background-danger-hovered, #FFD5D2)",
88
- fill: "var(--ds-text-danger, #000)"
89
- },
90
- ':active': {
91
- backgroundColor: "var(--ds-background-danger-pressed, #FD9891)",
92
- fill: "var(--ds-text-danger, #000)"
93
- },
94
- ...(fg('platform-component-visual-refresh') && {
95
- backgroundColor: "var(--ds-background-neutral-subtle, #00000000)",
96
- border: 'none',
97
- alignItems: 'center',
98
- justifyContent: 'center',
99
- alignSelf: 'center',
100
- appearance: 'none',
101
- borderRadius: "var(--ds-border-radius, 4px)",
102
- color: "var(--ds-text, #172B4D)",
103
- padding: "var(--ds-space-025, 2px)",
104
- marginRight: "var(--ds-space-025, 2px)",
105
- ':focus-visible': {
106
- outlineOffset: "var(--ds-space-negative-025, -2px)"
107
- },
108
- ':hover': {
109
- backgroundColor: "var(--ds-background-neutral-subtle-hovered, #091E420F)"
110
- },
111
- ':active': {
112
- backgroundColor: "var(--ds-background-neutral-subtle-pressed, #091E4224)"
113
- }
114
- })
115
- });
116
- const MultiValueGeneric = ({
117
- children,
118
- innerProps
119
- }) => jsx("div", innerProps, children);
120
-
121
- // eslint-disable-next-line @repo/internal/react/require-jsdoc
122
- export const MultiValueContainer = MultiValueGeneric;
123
-
124
- // eslint-disable-next-line @repo/internal/react/require-jsdoc
125
- export const MultiValueLabel = MultiValueGeneric;
126
- const disabledStyles = css({
127
- display: 'none'
128
- });
129
- const enabledStyles = css({
130
- display: 'inherit'
131
- });
132
- export function MultiValueRemove({
133
- isDisabled,
134
- innerProps
135
- }) {
136
- return (
137
- // The Remove button is intentionally excluded from the tab order, please avoid assigning a non-negative tabIndex to it. Context: https://hello.atlassian.net/wiki/spaces/A11YKB/pages/3031993460/Clear+Options+on+an+Input+Field
138
- jsx("div", innerProps, jsx("div", {
139
- css: isDisabled ? disabledStyles : enabledStyles,
140
- "data-testid": isDisabled ? 'hide-clear-icon' : 'show-clear-icon'
141
- }, jsx(CrossIcon, {
142
- label: "",
143
- color: "currentColor",
144
- LEGACY_fallbackIcon: LegacySelectClearIcon,
145
- LEGACY_primaryColor: "transparent",
146
- LEGACY_secondaryColor: "inherit",
147
- LEGACY_size: "small",
148
- size: "small"
149
- })))
150
- );
151
- }
152
- const MultiValue = props => {
153
- const {
154
- children,
155
- components,
156
- data,
157
- innerProps,
158
- isDisabled,
159
- removeProps,
160
- selectProps
161
- } = props;
162
- const {
163
- Container,
164
- Label,
165
- Remove
166
- } = components;
167
- const ariaLabel = typeof children === 'string' ? children : data.label;
168
- return jsx(Container, {
169
- data: data,
170
- innerProps: {
171
- ...getStyleProps(props, 'multiValue', {
172
- 'multi-value': true,
173
- 'multi-value--is-disabled': isDisabled
174
- }),
175
- ...innerProps
176
- },
177
- selectProps: selectProps
178
- }, jsx(Label, {
179
- data: data,
180
- innerProps: {
181
- ...getStyleProps(props, 'multiValueLabel', {
182
- 'multi-value__label': true
183
- })
184
- },
185
- selectProps: selectProps
186
- }, children), jsx(Remove, {
187
- data: data,
188
- innerProps: {
189
- ...getStyleProps(props, 'multiValueRemove', {
190
- 'multi-value__remove': true
191
- }),
192
- role: 'button',
193
- tabIndex: -1,
194
- 'aria-label': `${ariaLabel || 'option'}, remove`,
195
- ...removeProps
196
- },
197
- isDisabled: isDisabled,
198
- selectProps: selectProps
199
- }));
200
- };
201
-
202
- // eslint-disable-next-line @repo/internal/react/require-jsdoc
203
- export default MultiValue;