@atlaskit/react-select 3.0.0 → 3.0.2

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 (276) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/components/containers.compiled.css +26 -0
  3. package/dist/cjs/components/containers.js +80 -12
  4. package/dist/cjs/components/control.js +50 -7
  5. package/dist/cjs/components/group.js +60 -10
  6. package/dist/cjs/components/indicators.js +128 -13
  7. package/dist/cjs/components/input.js +50 -7
  8. package/dist/cjs/components/internal/a11y-text.js +14 -5
  9. package/dist/cjs/components/internal/dummy-input.js +21 -5
  10. package/dist/cjs/components/internal/required-input.js +24 -6
  11. package/dist/cjs/components/live-region.js +101 -5
  12. package/dist/cjs/components/menu.js +436 -25
  13. package/dist/cjs/components/multi-value.js +148 -17
  14. package/dist/cjs/components/option.js +41 -7
  15. package/dist/cjs/components/placeholder.js +29 -7
  16. package/dist/cjs/components/single-value.js +30 -7
  17. package/dist/es2019/components/containers.compiled.css +26 -0
  18. package/dist/es2019/components/containers.js +93 -9
  19. package/dist/es2019/components/control.js +54 -6
  20. package/dist/es2019/components/group.js +67 -7
  21. package/dist/es2019/components/indicators.js +131 -9
  22. package/dist/es2019/components/input.js +53 -5
  23. package/dist/es2019/components/internal/a11y-text.js +12 -4
  24. package/dist/es2019/components/internal/dummy-input.js +19 -5
  25. package/dist/es2019/components/internal/required-input.js +22 -4
  26. package/dist/es2019/components/live-region.js +104 -4
  27. package/dist/es2019/components/menu.js +444 -17
  28. package/dist/es2019/components/multi-value.js +158 -11
  29. package/dist/es2019/components/option.js +45 -5
  30. package/dist/es2019/components/placeholder.js +33 -5
  31. package/dist/es2019/components/single-value.js +34 -5
  32. package/dist/esm/components/containers.compiled.css +26 -0
  33. package/dist/esm/components/containers.js +78 -11
  34. package/dist/esm/components/control.js +51 -6
  35. package/dist/esm/components/group.js +60 -9
  36. package/dist/esm/components/indicators.js +127 -13
  37. package/dist/esm/components/input.js +50 -6
  38. package/dist/esm/components/internal/a11y-text.js +12 -4
  39. package/dist/esm/components/internal/dummy-input.js +20 -5
  40. package/dist/esm/components/internal/required-input.js +22 -5
  41. package/dist/esm/components/live-region.js +99 -4
  42. package/dist/esm/components/menu.js +437 -25
  43. package/dist/esm/components/multi-value.js +148 -16
  44. package/dist/esm/components/option.js +41 -6
  45. package/dist/esm/components/placeholder.js +29 -6
  46. package/dist/esm/components/single-value.js +30 -6
  47. package/dist/types/components/containers.d.ts +12 -8
  48. package/dist/types/components/control.d.ts +7 -3
  49. package/dist/types/components/group.d.ts +10 -6
  50. package/dist/types/components/index.d.ts +21 -21
  51. package/dist/types/components/indicators.d.ts +12 -8
  52. package/dist/types/components/input.d.ts +8 -4
  53. package/dist/types/components/internal/a11y-text.d.ts +2 -2
  54. package/dist/types/components/internal/dummy-input.d.ts +7 -3
  55. package/dist/types/components/internal/required-input.d.ts +4 -0
  56. package/dist/types/components/live-region.d.ts +0 -2
  57. package/dist/types/components/menu.d.ts +17 -13
  58. package/dist/types/components/multi-value.d.ts +13 -9
  59. package/dist/types/components/option.d.ts +8 -4
  60. package/dist/types/components/placeholder.d.ts +8 -4
  61. package/dist/types/components/single-value.d.ts +8 -4
  62. package/dist/types/select.d.ts +23 -23
  63. package/dist/types/styles.d.ts +21 -21
  64. package/dist/types/types.d.ts +1 -4
  65. package/dist/types/utils.d.ts +1 -1
  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 -23
  82. package/dist/types-ts4.5/styles.d.ts +21 -21
  83. package/dist/types-ts4.5/types.d.ts +1 -4
  84. package/dist/types-ts4.5/utils.d.ts +1 -1
  85. package/package.json +2 -4
  86. package/dist/cjs/compiled/components/control.js +0 -65
  87. package/dist/cjs/compiled/components/group.js +0 -80
  88. package/dist/cjs/compiled/components/indicators.js +0 -158
  89. package/dist/cjs/compiled/components/input.js +0 -65
  90. package/dist/cjs/compiled/components/internal/a11y-text.js +0 -24
  91. package/dist/cjs/compiled/components/internal/dummy-input.js +0 -30
  92. package/dist/cjs/compiled/components/internal/required-input.js +0 -35
  93. package/dist/cjs/compiled/components/live-region.js +0 -117
  94. package/dist/cjs/compiled/components/menu.js +0 -489
  95. package/dist/cjs/compiled/components/multi-value.js +0 -173
  96. package/dist/cjs/compiled/components/option.js +0 -56
  97. package/dist/cjs/compiled/components/placeholder.js +0 -44
  98. package/dist/cjs/compiled/components/single-value.js +0 -45
  99. package/dist/cjs/emotion/components/containers.js +0 -117
  100. package/dist/cjs/emotion/components/control.js +0 -112
  101. package/dist/cjs/emotion/components/group.js +0 -72
  102. package/dist/cjs/emotion/components/indicators.js +0 -140
  103. package/dist/cjs/emotion/components/input.js +0 -94
  104. package/dist/cjs/emotion/components/internal/a11y-text.js +0 -37
  105. package/dist/cjs/emotion/components/internal/dummy-input.js +0 -45
  106. package/dist/cjs/emotion/components/internal/index.js +0 -34
  107. package/dist/cjs/emotion/components/internal/required-input.js +0 -45
  108. package/dist/cjs/emotion/components/internal/scroll-manager.js +0 -59
  109. package/dist/cjs/emotion/components/internal/use-scroll-capture.js +0 -132
  110. package/dist/cjs/emotion/components/internal/use-scroll-lock.js +0 -149
  111. package/dist/cjs/emotion/components/live-region.js +0 -120
  112. package/dist/cjs/emotion/components/menu.js +0 -456
  113. package/dist/cjs/emotion/components/multi-value.js +0 -199
  114. package/dist/cjs/emotion/components/option.js +0 -84
  115. package/dist/cjs/emotion/components/placeholder.js +0 -36
  116. package/dist/cjs/emotion/components/single-value.js +0 -42
  117. package/dist/es2019/compiled/components/control.js +0 -58
  118. package/dist/es2019/compiled/components/group.js +0 -72
  119. package/dist/es2019/compiled/components/indicators.js +0 -146
  120. package/dist/es2019/compiled/components/input.js +0 -56
  121. package/dist/es2019/compiled/components/internal/a11y-text.js +0 -13
  122. package/dist/es2019/compiled/components/internal/dummy-input.js +0 -20
  123. package/dist/es2019/compiled/components/internal/required-input.js +0 -25
  124. package/dist/es2019/compiled/components/live-region.js +0 -112
  125. package/dist/es2019/compiled/components/menu.js +0 -477
  126. package/dist/es2019/compiled/components/multi-value.js +0 -165
  127. package/dist/es2019/compiled/components/option.js +0 -48
  128. package/dist/es2019/compiled/components/placeholder.js +0 -36
  129. package/dist/es2019/compiled/components/single-value.js +0 -37
  130. package/dist/es2019/emotion/components/containers.js +0 -114
  131. package/dist/es2019/emotion/components/control.js +0 -108
  132. package/dist/es2019/emotion/components/group.js +0 -60
  133. package/dist/es2019/emotion/components/indicators.js +0 -131
  134. package/dist/es2019/emotion/components/input.js +0 -87
  135. package/dist/es2019/emotion/components/internal/a11y-text.js +0 -28
  136. package/dist/es2019/emotion/components/internal/dummy-input.js +0 -38
  137. package/dist/es2019/emotion/components/internal/index.js +0 -4
  138. package/dist/es2019/emotion/components/internal/required-input.js +0 -36
  139. package/dist/es2019/emotion/components/internal/scroll-manager.js +0 -51
  140. package/dist/es2019/emotion/components/internal/use-scroll-capture.js +0 -128
  141. package/dist/es2019/emotion/components/internal/use-scroll-lock.js +0 -143
  142. package/dist/es2019/emotion/components/live-region.js +0 -120
  143. package/dist/es2019/emotion/components/menu.js +0 -452
  144. package/dist/es2019/emotion/components/multi-value.js +0 -203
  145. package/dist/es2019/emotion/components/option.js +0 -79
  146. package/dist/es2019/emotion/components/placeholder.js +0 -29
  147. package/dist/es2019/emotion/components/single-value.js +0 -35
  148. package/dist/esm/compiled/components/control.js +0 -57
  149. package/dist/esm/compiled/components/group.js +0 -71
  150. package/dist/esm/compiled/components/indicators.js +0 -150
  151. package/dist/esm/compiled/components/input.js +0 -56
  152. package/dist/esm/compiled/components/internal/a11y-text.js +0 -15
  153. package/dist/esm/compiled/components/internal/dummy-input.js +0 -21
  154. package/dist/esm/compiled/components/internal/required-input.js +0 -26
  155. package/dist/esm/compiled/components/live-region.js +0 -109
  156. package/dist/esm/compiled/components/menu.js +0 -484
  157. package/dist/esm/compiled/components/multi-value.js +0 -162
  158. package/dist/esm/compiled/components/option.js +0 -47
  159. package/dist/esm/compiled/components/placeholder.js +0 -35
  160. package/dist/esm/compiled/components/single-value.js +0 -36
  161. package/dist/esm/emotion/components/containers.js +0 -110
  162. package/dist/esm/emotion/components/control.js +0 -104
  163. package/dist/esm/emotion/components/group.js +0 -66
  164. package/dist/esm/emotion/components/indicators.js +0 -135
  165. package/dist/esm/emotion/components/input.js +0 -90
  166. package/dist/esm/emotion/components/internal/a11y-text.js +0 -30
  167. package/dist/esm/emotion/components/internal/dummy-input.js +0 -39
  168. package/dist/esm/emotion/components/internal/index.js +0 -4
  169. package/dist/esm/emotion/components/internal/required-input.js +0 -37
  170. package/dist/esm/emotion/components/internal/scroll-manager.js +0 -51
  171. package/dist/esm/emotion/components/internal/use-scroll-capture.js +0 -126
  172. package/dist/esm/emotion/components/internal/use-scroll-lock.js +0 -143
  173. package/dist/esm/emotion/components/live-region.js +0 -117
  174. package/dist/esm/emotion/components/menu.js +0 -456
  175. package/dist/esm/emotion/components/multi-value.js +0 -193
  176. package/dist/esm/emotion/components/option.js +0 -76
  177. package/dist/esm/emotion/components/placeholder.js +0 -28
  178. package/dist/esm/emotion/components/single-value.js +0 -34
  179. package/dist/types/compiled/components/control.d.ts +0 -41
  180. package/dist/types/compiled/components/group.d.ts +0 -54
  181. package/dist/types/compiled/components/indicators.d.ts +0 -72
  182. package/dist/types/compiled/components/input.d.ts +0 -36
  183. package/dist/types/compiled/components/internal/a11y-text.d.ts +0 -3
  184. package/dist/types/compiled/components/internal/dummy-input.d.ts +0 -8
  185. package/dist/types/compiled/components/internal/required-input.d.ts +0 -10
  186. package/dist/types/compiled/components/live-region.d.ts +0 -17
  187. package/dist/types/compiled/components/menu.d.ts +0 -115
  188. package/dist/types/compiled/components/multi-value.d.ts +0 -57
  189. package/dist/types/compiled/components/option.d.ts +0 -48
  190. package/dist/types/compiled/components/placeholder.d.ts +0 -21
  191. package/dist/types/compiled/components/single-value.d.ts +0 -27
  192. package/dist/types/emotion/components/containers.d.ts +0 -54
  193. package/dist/types/emotion/components/control.d.ts +0 -42
  194. package/dist/types/emotion/components/group.d.ts +0 -52
  195. package/dist/types/emotion/components/indicators.d.ts +0 -73
  196. package/dist/types/emotion/components/input.d.ts +0 -37
  197. package/dist/types/emotion/components/internal/a11y-text.d.ts +0 -8
  198. package/dist/types/emotion/components/internal/dummy-input.d.ts +0 -9
  199. package/dist/types/emotion/components/internal/index.d.ts +0 -4
  200. package/dist/types/emotion/components/internal/required-input.d.ts +0 -10
  201. package/dist/types/emotion/components/internal/scroll-manager.d.ts +0 -17
  202. package/dist/types/emotion/components/internal/use-scroll-capture.d.ts +0 -12
  203. package/dist/types/emotion/components/internal/use-scroll-lock.d.ts +0 -9
  204. package/dist/types/emotion/components/live-region.d.ts +0 -23
  205. package/dist/types/emotion/components/menu.d.ts +0 -116
  206. package/dist/types/emotion/components/multi-value.d.ts +0 -47
  207. package/dist/types/emotion/components/option.d.ts +0 -49
  208. package/dist/types/emotion/components/placeholder.d.ts +0 -22
  209. package/dist/types/emotion/components/single-value.d.ts +0 -28
  210. package/dist/types-ts4.5/compiled/components/control.d.ts +0 -41
  211. package/dist/types-ts4.5/compiled/components/group.d.ts +0 -54
  212. package/dist/types-ts4.5/compiled/components/indicators.d.ts +0 -72
  213. package/dist/types-ts4.5/compiled/components/input.d.ts +0 -36
  214. package/dist/types-ts4.5/compiled/components/internal/a11y-text.d.ts +0 -3
  215. package/dist/types-ts4.5/compiled/components/internal/dummy-input.d.ts +0 -8
  216. package/dist/types-ts4.5/compiled/components/internal/required-input.d.ts +0 -10
  217. package/dist/types-ts4.5/compiled/components/live-region.d.ts +0 -17
  218. package/dist/types-ts4.5/compiled/components/menu.d.ts +0 -115
  219. package/dist/types-ts4.5/compiled/components/multi-value.d.ts +0 -57
  220. package/dist/types-ts4.5/compiled/components/option.d.ts +0 -48
  221. package/dist/types-ts4.5/compiled/components/placeholder.d.ts +0 -21
  222. package/dist/types-ts4.5/compiled/components/single-value.d.ts +0 -27
  223. package/dist/types-ts4.5/emotion/components/containers.d.ts +0 -54
  224. package/dist/types-ts4.5/emotion/components/control.d.ts +0 -42
  225. package/dist/types-ts4.5/emotion/components/group.d.ts +0 -52
  226. package/dist/types-ts4.5/emotion/components/indicators.d.ts +0 -73
  227. package/dist/types-ts4.5/emotion/components/input.d.ts +0 -37
  228. package/dist/types-ts4.5/emotion/components/internal/a11y-text.d.ts +0 -8
  229. package/dist/types-ts4.5/emotion/components/internal/dummy-input.d.ts +0 -9
  230. package/dist/types-ts4.5/emotion/components/internal/index.d.ts +0 -4
  231. package/dist/types-ts4.5/emotion/components/internal/required-input.d.ts +0 -10
  232. package/dist/types-ts4.5/emotion/components/internal/scroll-manager.d.ts +0 -17
  233. package/dist/types-ts4.5/emotion/components/internal/use-scroll-capture.d.ts +0 -12
  234. package/dist/types-ts4.5/emotion/components/internal/use-scroll-lock.d.ts +0 -9
  235. package/dist/types-ts4.5/emotion/components/live-region.d.ts +0 -23
  236. package/dist/types-ts4.5/emotion/components/menu.d.ts +0 -116
  237. package/dist/types-ts4.5/emotion/components/multi-value.d.ts +0 -47
  238. package/dist/types-ts4.5/emotion/components/option.d.ts +0 -49
  239. package/dist/types-ts4.5/emotion/components/placeholder.d.ts +0 -22
  240. package/dist/types-ts4.5/emotion/components/single-value.d.ts +0 -28
  241. /package/dist/cjs/{compiled/components → components}/control.compiled.css +0 -0
  242. /package/dist/cjs/{compiled/components → components}/group.compiled.css +0 -0
  243. /package/dist/cjs/{compiled/components → components}/indicators.compiled.css +0 -0
  244. /package/dist/cjs/{compiled/components → components}/input.compiled.css +0 -0
  245. /package/dist/cjs/{compiled/components → components}/internal/a11y-text.compiled.css +0 -0
  246. /package/dist/cjs/{compiled/components → components}/internal/dummy-input.compiled.css +0 -0
  247. /package/dist/cjs/{compiled/components → components}/internal/required-input.compiled.css +0 -0
  248. /package/dist/cjs/{compiled/components → components}/menu.compiled.css +0 -0
  249. /package/dist/cjs/{compiled/components → components}/multi-value.compiled.css +0 -0
  250. /package/dist/cjs/{compiled/components → components}/option.compiled.css +0 -0
  251. /package/dist/cjs/{compiled/components → components}/placeholder.compiled.css +0 -0
  252. /package/dist/cjs/{compiled/components → components}/single-value.compiled.css +0 -0
  253. /package/dist/es2019/{compiled/components → components}/control.compiled.css +0 -0
  254. /package/dist/es2019/{compiled/components → components}/group.compiled.css +0 -0
  255. /package/dist/es2019/{compiled/components → components}/indicators.compiled.css +0 -0
  256. /package/dist/es2019/{compiled/components → components}/input.compiled.css +0 -0
  257. /package/dist/es2019/{compiled/components → components}/internal/a11y-text.compiled.css +0 -0
  258. /package/dist/es2019/{compiled/components → components}/internal/dummy-input.compiled.css +0 -0
  259. /package/dist/es2019/{compiled/components → components}/internal/required-input.compiled.css +0 -0
  260. /package/dist/es2019/{compiled/components → components}/menu.compiled.css +0 -0
  261. /package/dist/es2019/{compiled/components → components}/multi-value.compiled.css +0 -0
  262. /package/dist/es2019/{compiled/components → components}/option.compiled.css +0 -0
  263. /package/dist/es2019/{compiled/components → components}/placeholder.compiled.css +0 -0
  264. /package/dist/es2019/{compiled/components → components}/single-value.compiled.css +0 -0
  265. /package/dist/esm/{compiled/components → components}/control.compiled.css +0 -0
  266. /package/dist/esm/{compiled/components → components}/group.compiled.css +0 -0
  267. /package/dist/esm/{compiled/components → components}/indicators.compiled.css +0 -0
  268. /package/dist/esm/{compiled/components → components}/input.compiled.css +0 -0
  269. /package/dist/esm/{compiled/components → components}/internal/a11y-text.compiled.css +0 -0
  270. /package/dist/esm/{compiled/components → components}/internal/dummy-input.compiled.css +0 -0
  271. /package/dist/esm/{compiled/components → components}/internal/required-input.compiled.css +0 -0
  272. /package/dist/esm/{compiled/components → components}/menu.compiled.css +0 -0
  273. /package/dist/esm/{compiled/components → components}/multi-value.compiled.css +0 -0
  274. /package/dist/esm/{compiled/components → components}/option.compiled.css +0 -0
  275. /package/dist/esm/{compiled/components → components}/placeholder.compiled.css +0 -0
  276. /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;