@atlaskit/react-select 2.2.1 → 2.4.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.
- package/CHANGELOG.md +29 -0
- package/dist/cjs/compiled/components/containers.compiled.css +26 -0
- package/dist/cjs/compiled/components/containers.js +119 -0
- package/dist/cjs/compiled/components/control.compiled.css +51 -0
- package/dist/cjs/compiled/components/control.js +66 -0
- package/dist/cjs/compiled/components/group.compiled.css +12 -0
- package/dist/cjs/compiled/components/group.js +81 -0
- package/dist/cjs/compiled/components/indicators.compiled.css +24 -0
- package/dist/cjs/compiled/components/indicators.js +157 -0
- package/dist/cjs/compiled/components/input.compiled.css +49 -0
- package/dist/cjs/compiled/components/input.js +69 -0
- package/dist/cjs/compiled/components/internal/a11y-text.compiled.css +15 -0
- package/dist/cjs/compiled/components/internal/a11y-text.js +23 -0
- package/dist/cjs/compiled/components/internal/dummy-input.compiled.css +17 -0
- package/dist/cjs/compiled/components/internal/dummy-input.js +30 -0
- package/dist/cjs/compiled/components/internal/required-input.compiled.css +8 -0
- package/dist/cjs/compiled/components/internal/required-input.js +34 -0
- package/dist/cjs/compiled/components/live-region.js +177 -0
- package/dist/cjs/compiled/components/menu.compiled.css +19 -0
- package/dist/cjs/compiled/components/menu.js +491 -0
- package/dist/cjs/compiled/components/multi-value.compiled.css +56 -0
- package/dist/cjs/compiled/components/multi-value.js +199 -0
- package/dist/cjs/compiled/components/option.compiled.css +22 -0
- package/dist/cjs/compiled/components/option.js +57 -0
- package/dist/cjs/compiled/components/placeholder.compiled.css +7 -0
- package/dist/cjs/compiled/components/placeholder.js +45 -0
- package/dist/cjs/compiled/components/single-value.compiled.css +13 -0
- package/dist/cjs/compiled/components/single-value.js +46 -0
- package/dist/cjs/components/containers.js +12 -72
- package/dist/cjs/components/control.js +11 -96
- package/dist/cjs/components/group.js +15 -53
- package/dist/cjs/components/indicators.js +15 -107
- package/dist/cjs/components/input.js +12 -81
- package/dist/cjs/components/internal/a11y-text.js +6 -25
- package/dist/cjs/components/internal/dummy-input.js +8 -36
- package/dist/cjs/components/internal/notify-open-layer-observer.js +1 -0
- package/dist/cjs/components/internal/required-input.js +7 -31
- package/dist/cjs/components/internal/scroll-manager.js +19 -17
- package/dist/cjs/components/live-region.js +6 -164
- package/dist/cjs/components/menu.js +24 -399
- package/dist/cjs/components/multi-value.js +21 -197
- package/dist/cjs/components/option.js +11 -68
- package/dist/cjs/components/placeholder.js +11 -20
- package/dist/cjs/components/single-value.js +11 -26
- package/dist/cjs/emotion/components/containers.js +2 -0
- package/dist/cjs/emotion/components/control.js +2 -0
- package/dist/cjs/emotion/components/group.js +1 -0
- package/dist/cjs/emotion/components/indicators.js +1 -0
- package/dist/cjs/emotion/components/input.js +1 -1
- package/dist/cjs/emotion/components/internal/a11y-text.js +1 -0
- package/dist/cjs/emotion/components/internal/dummy-input.js +1 -0
- package/dist/cjs/emotion/components/internal/required-input.js +2 -0
- package/dist/cjs/emotion/components/internal/scroll-manager.js +2 -0
- package/dist/cjs/emotion/components/live-region.js +1 -1
- package/dist/cjs/emotion/components/menu.js +1 -1
- package/dist/cjs/emotion/components/multi-value.js +1 -1
- package/dist/cjs/emotion/components/option.js +2 -0
- package/dist/cjs/emotion/components/placeholder.js +2 -0
- package/dist/cjs/emotion/components/single-value.js +2 -0
- package/dist/cjs/utils.js +2 -1
- package/dist/es2019/compiled/components/containers.compiled.css +26 -0
- package/dist/es2019/compiled/components/containers.js +115 -0
- package/dist/es2019/compiled/components/control.compiled.css +51 -0
- package/dist/es2019/compiled/components/control.js +58 -0
- package/dist/es2019/compiled/components/group.compiled.css +12 -0
- package/dist/es2019/compiled/components/group.js +72 -0
- package/dist/es2019/compiled/components/indicators.compiled.css +24 -0
- package/dist/es2019/compiled/components/indicators.js +144 -0
- package/dist/es2019/compiled/components/input.compiled.css +49 -0
- package/dist/es2019/compiled/components/input.js +59 -0
- package/dist/es2019/compiled/components/internal/a11y-text.compiled.css +15 -0
- package/dist/es2019/compiled/components/internal/a11y-text.js +11 -0
- package/dist/es2019/compiled/components/internal/dummy-input.compiled.css +17 -0
- package/dist/es2019/compiled/components/internal/dummy-input.js +19 -0
- package/dist/es2019/compiled/components/internal/required-input.compiled.css +8 -0
- package/dist/es2019/compiled/components/internal/required-input.js +23 -0
- package/dist/es2019/compiled/components/live-region.js +171 -0
- package/dist/es2019/compiled/components/menu.compiled.css +19 -0
- package/dist/es2019/compiled/components/menu.js +478 -0
- package/dist/es2019/compiled/components/multi-value.compiled.css +56 -0
- package/dist/es2019/compiled/components/multi-value.js +190 -0
- package/dist/es2019/compiled/components/option.compiled.css +22 -0
- package/dist/es2019/compiled/components/option.js +48 -0
- package/dist/es2019/compiled/components/placeholder.compiled.css +7 -0
- package/dist/es2019/compiled/components/placeholder.js +36 -0
- package/dist/es2019/compiled/components/single-value.compiled.css +13 -0
- package/dist/es2019/compiled/components/single-value.js +37 -0
- package/dist/es2019/components/containers.js +10 -87
- package/dist/es2019/components/control.js +8 -103
- package/dist/es2019/components/group.js +9 -54
- package/dist/es2019/components/indicators.js +11 -113
- package/dist/es2019/components/input.js +7 -83
- package/dist/es2019/components/internal/a11y-text.js +6 -26
- package/dist/es2019/components/internal/dummy-input.js +7 -36
- package/dist/es2019/components/internal/notify-open-layer-observer.js +1 -0
- package/dist/es2019/components/internal/required-input.js +6 -32
- package/dist/es2019/components/internal/scroll-manager.js +16 -16
- package/dist/es2019/components/live-region.js +5 -168
- package/dist/es2019/components/menu.js +14 -412
- package/dist/es2019/components/multi-value.js +12 -216
- package/dist/es2019/components/option.js +7 -75
- package/dist/es2019/components/placeholder.js +7 -25
- package/dist/es2019/components/single-value.js +7 -31
- package/dist/es2019/emotion/components/containers.js +1 -0
- package/dist/es2019/emotion/components/control.js +1 -0
- package/dist/es2019/emotion/components/group.js +1 -0
- package/dist/es2019/emotion/components/indicators.js +1 -0
- package/dist/es2019/emotion/components/input.js +1 -0
- package/dist/es2019/emotion/components/internal/a11y-text.js +1 -0
- package/dist/es2019/emotion/components/internal/dummy-input.js +1 -0
- package/dist/es2019/emotion/components/internal/required-input.js +1 -0
- package/dist/es2019/emotion/components/internal/scroll-manager.js +2 -0
- package/dist/es2019/emotion/components/live-region.js +2 -0
- package/dist/es2019/emotion/components/menu.js +2 -0
- package/dist/es2019/emotion/components/multi-value.js +1 -0
- package/dist/es2019/emotion/components/option.js +1 -0
- package/dist/es2019/emotion/components/placeholder.js +1 -0
- package/dist/es2019/emotion/components/single-value.js +1 -0
- package/dist/es2019/utils.js +1 -0
- package/dist/esm/compiled/components/containers.compiled.css +26 -0
- package/dist/esm/compiled/components/containers.js +110 -0
- package/dist/esm/compiled/components/control.compiled.css +51 -0
- package/dist/esm/compiled/components/control.js +57 -0
- package/dist/esm/compiled/components/group.compiled.css +12 -0
- package/dist/esm/compiled/components/group.js +71 -0
- package/dist/esm/compiled/components/indicators.compiled.css +24 -0
- package/dist/esm/compiled/components/indicators.js +148 -0
- package/dist/esm/compiled/components/input.compiled.css +49 -0
- package/dist/esm/compiled/components/input.js +59 -0
- package/dist/esm/compiled/components/internal/a11y-text.compiled.css +15 -0
- package/dist/esm/compiled/components/internal/a11y-text.js +13 -0
- package/dist/esm/compiled/components/internal/dummy-input.compiled.css +17 -0
- package/dist/esm/compiled/components/internal/dummy-input.js +20 -0
- package/dist/esm/compiled/components/internal/required-input.compiled.css +8 -0
- package/dist/esm/compiled/components/internal/required-input.js +24 -0
- package/dist/esm/compiled/components/live-region.js +168 -0
- package/dist/esm/compiled/components/menu.compiled.css +19 -0
- package/dist/esm/compiled/components/menu.js +485 -0
- package/dist/esm/compiled/components/multi-value.compiled.css +56 -0
- package/dist/esm/compiled/components/multi-value.js +187 -0
- package/dist/esm/compiled/components/option.compiled.css +22 -0
- package/dist/esm/compiled/components/option.js +47 -0
- package/dist/esm/compiled/components/placeholder.compiled.css +7 -0
- package/dist/esm/compiled/components/placeholder.js +35 -0
- package/dist/esm/compiled/components/single-value.compiled.css +13 -0
- package/dist/esm/compiled/components/single-value.js +36 -0
- package/dist/esm/components/containers.js +12 -73
- package/dist/esm/components/control.js +8 -97
- package/dist/esm/components/group.js +11 -54
- package/dist/esm/components/indicators.js +15 -109
- package/dist/esm/components/input.js +8 -83
- package/dist/esm/components/internal/a11y-text.js +6 -26
- package/dist/esm/components/internal/dummy-input.js +7 -37
- package/dist/esm/components/internal/notify-open-layer-observer.js +1 -0
- package/dist/esm/components/internal/required-input.js +7 -32
- package/dist/esm/components/internal/scroll-manager.js +16 -16
- package/dist/esm/components/live-region.js +5 -163
- package/dist/esm/components/menu.js +21 -401
- package/dist/esm/components/multi-value.js +17 -199
- package/dist/esm/components/option.js +8 -69
- package/dist/esm/components/placeholder.js +8 -21
- package/dist/esm/components/single-value.js +8 -27
- package/dist/esm/emotion/components/containers.js +1 -0
- package/dist/esm/emotion/components/control.js +1 -0
- package/dist/esm/emotion/components/group.js +1 -0
- package/dist/esm/emotion/components/indicators.js +1 -0
- package/dist/esm/emotion/components/input.js +1 -0
- package/dist/esm/emotion/components/internal/a11y-text.js +1 -0
- package/dist/esm/emotion/components/internal/dummy-input.js +1 -0
- package/dist/esm/emotion/components/internal/required-input.js +1 -0
- package/dist/esm/emotion/components/internal/scroll-manager.js +2 -0
- package/dist/esm/emotion/components/live-region.js +2 -0
- package/dist/esm/emotion/components/menu.js +2 -0
- package/dist/esm/emotion/components/multi-value.js +1 -0
- package/dist/esm/emotion/components/option.js +1 -0
- package/dist/esm/emotion/components/placeholder.js +1 -0
- package/dist/esm/emotion/components/single-value.js +1 -0
- package/dist/esm/utils.js +2 -1
- package/dist/types/compiled/components/containers.d.ts +53 -0
- package/dist/types/compiled/components/control.d.ts +41 -0
- package/dist/types/compiled/components/group.d.ts +54 -0
- package/dist/types/compiled/components/indicators.d.ts +72 -0
- package/dist/types/compiled/components/input.d.ts +36 -0
- package/dist/types/compiled/components/internal/a11y-text.d.ts +3 -0
- package/dist/types/compiled/components/internal/dummy-input.d.ts +8 -0
- package/dist/types/compiled/components/internal/required-input.d.ts +10 -0
- package/dist/types/compiled/components/live-region.d.ts +19 -0
- package/dist/types/compiled/components/menu.d.ts +115 -0
- package/dist/types/compiled/components/multi-value.d.ts +57 -0
- package/dist/types/compiled/components/option.d.ts +48 -0
- package/dist/types/compiled/components/placeholder.d.ts +21 -0
- package/dist/types/compiled/components/single-value.d.ts +27 -0
- package/dist/types/components/containers.d.ts +6 -11
- package/dist/types/components/control.d.ts +4 -9
- package/dist/types/components/group.d.ts +8 -10
- package/dist/types/components/index.d.ts +21 -21
- package/dist/types/components/indicators.d.ts +7 -12
- package/dist/types/components/input.d.ts +3 -8
- package/dist/types/components/internal/a11y-text.d.ts +2 -7
- package/dist/types/components/internal/dummy-input.d.ts +3 -8
- package/dist/types/components/internal/required-input.d.ts +0 -4
- package/dist/types/components/internal/scroll-manager.d.ts +2 -7
- package/dist/types/components/live-region.d.ts +2 -8
- package/dist/types/components/menu.d.ts +10 -15
- package/dist/types/components/multi-value.d.ts +19 -13
- package/dist/types/components/option.d.ts +3 -8
- package/dist/types/components/placeholder.d.ts +3 -8
- package/dist/types/components/single-value.d.ts +3 -8
- package/dist/types/select.d.ts +21 -21
- package/dist/types/types.d.ts +3 -0
- package/dist/types-ts4.5/compiled/components/containers.d.ts +53 -0
- package/dist/types-ts4.5/compiled/components/control.d.ts +41 -0
- package/dist/types-ts4.5/compiled/components/group.d.ts +54 -0
- package/dist/types-ts4.5/compiled/components/indicators.d.ts +72 -0
- package/dist/types-ts4.5/compiled/components/input.d.ts +36 -0
- package/dist/types-ts4.5/compiled/components/internal/a11y-text.d.ts +3 -0
- package/dist/types-ts4.5/compiled/components/internal/dummy-input.d.ts +8 -0
- package/dist/types-ts4.5/compiled/components/internal/required-input.d.ts +10 -0
- package/dist/types-ts4.5/compiled/components/live-region.d.ts +19 -0
- package/dist/types-ts4.5/compiled/components/menu.d.ts +115 -0
- package/dist/types-ts4.5/compiled/components/multi-value.d.ts +57 -0
- package/dist/types-ts4.5/compiled/components/option.d.ts +48 -0
- package/dist/types-ts4.5/compiled/components/placeholder.d.ts +21 -0
- package/dist/types-ts4.5/compiled/components/single-value.d.ts +27 -0
- package/dist/types-ts4.5/components/containers.d.ts +6 -11
- package/dist/types-ts4.5/components/control.d.ts +4 -9
- package/dist/types-ts4.5/components/group.d.ts +8 -10
- package/dist/types-ts4.5/components/index.d.ts +21 -21
- package/dist/types-ts4.5/components/indicators.d.ts +7 -12
- package/dist/types-ts4.5/components/input.d.ts +3 -8
- package/dist/types-ts4.5/components/internal/a11y-text.d.ts +2 -7
- package/dist/types-ts4.5/components/internal/dummy-input.d.ts +3 -8
- package/dist/types-ts4.5/components/internal/required-input.d.ts +0 -4
- package/dist/types-ts4.5/components/internal/scroll-manager.d.ts +2 -7
- package/dist/types-ts4.5/components/live-region.d.ts +2 -8
- package/dist/types-ts4.5/components/menu.d.ts +10 -15
- package/dist/types-ts4.5/components/multi-value.d.ts +19 -13
- package/dist/types-ts4.5/components/option.d.ts +3 -8
- package/dist/types-ts4.5/components/placeholder.d.ts +3 -8
- package/dist/types-ts4.5/components/single-value.d.ts +3 -8
- package/dist/types-ts4.5/select.d.ts +21 -21
- package/dist/types-ts4.5/types.d.ts +3 -0
- package/package.json +11 -3
- package/dist/cjs/emotion/components/index.js +0 -52
- package/dist/cjs/emotion/components/internal/notify-open-layer-observer.js +0 -21
- package/dist/es2019/emotion/components/index.js +0 -41
- package/dist/es2019/emotion/components/internal/notify-open-layer-observer.js +0 -16
- package/dist/esm/emotion/components/index.js +0 -43
- package/dist/esm/emotion/components/internal/notify-open-layer-observer.js +0 -15
- package/dist/types/emotion/components/index.d.ts +0 -67
- package/dist/types/emotion/components/internal/notify-open-layer-observer.d.ts +0 -11
- package/dist/types-ts4.5/emotion/components/index.d.ts +0 -67
- package/dist/types-ts4.5/emotion/components/internal/notify-open-layer-observer.d.ts +0 -11
|
@@ -1,275 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* @jsxRuntime classic
|
|
4
|
-
* @jsx jsx
|
|
5
|
-
*/
|
|
6
|
-
import { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react';
|
|
7
|
-
import { jsx } from '@emotion/react';
|
|
8
|
-
import { autoUpdate } from '@floating-ui/dom';
|
|
9
|
-
import { createPortal } from 'react-dom';
|
|
10
|
-
import useLayoutEffect from 'use-isomorphic-layout-effect';
|
|
1
|
+
/* eslint-disable @repo/internal/react/no-unsafe-spread-props */
|
|
2
|
+
import React from 'react';
|
|
11
3
|
import { fg } from '@atlaskit/platform-feature-flags';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
// ==============================
|
|
16
|
-
// Menu
|
|
17
|
-
// ==============================
|
|
18
|
-
|
|
19
|
-
// Get Menu Placement
|
|
20
|
-
// ------------------------------
|
|
21
|
-
|
|
22
|
-
function getMenuPlacement({
|
|
23
|
-
maxHeight: preferredMaxHeight,
|
|
24
|
-
menuEl,
|
|
25
|
-
minHeight,
|
|
26
|
-
placement: preferredPlacement,
|
|
27
|
-
shouldScroll,
|
|
28
|
-
isFixedPosition,
|
|
29
|
-
controlHeight
|
|
30
|
-
}) {
|
|
31
|
-
const scrollParent = getScrollParent(menuEl);
|
|
32
|
-
const defaultState = {
|
|
33
|
-
placement: 'bottom',
|
|
34
|
-
maxHeight: preferredMaxHeight
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
// something went wrong, return default state
|
|
38
|
-
if (!menuEl || !menuEl.offsetParent) {
|
|
39
|
-
return defaultState;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// we can't trust `scrollParent.scrollHeight` --> it may increase when
|
|
43
|
-
// the menu is rendered
|
|
44
|
-
const {
|
|
45
|
-
height: scrollHeight,
|
|
46
|
-
top: scrollParentTop
|
|
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
|
-
// use menuTop - scrollParentTop for the actual top space of menu in the scroll container
|
|
59
|
-
const menuTopFromParent = fg('design-system-select-fix-placement') ? menuTop - scrollParentTop : menuTop;
|
|
60
|
-
const marginBottom = parseInt(getComputedStyle(menuEl).marginBottom, 10);
|
|
61
|
-
const marginTop = parseInt(getComputedStyle(menuEl).marginTop, 10);
|
|
62
|
-
const viewSpaceAbove = containerTop - marginTop;
|
|
63
|
-
const viewSpaceBelow = viewHeight - menuTopFromParent;
|
|
64
|
-
const scrollSpaceAbove = viewSpaceAbove + scrollTop;
|
|
65
|
-
const scrollSpaceBelow = scrollHeight - scrollTop - menuTopFromParent;
|
|
66
|
-
const scrollDown = menuBottom - viewHeight + scrollTop + marginBottom;
|
|
67
|
-
const scrollUp = scrollTop + menuTop - marginTop;
|
|
68
|
-
const scrollDuration = 160;
|
|
69
|
-
switch (preferredPlacement) {
|
|
70
|
-
case 'auto':
|
|
71
|
-
case 'bottom':
|
|
72
|
-
// 1: the menu will fit, do nothing
|
|
73
|
-
if (viewSpaceBelow >= menuHeight) {
|
|
74
|
-
return {
|
|
75
|
-
placement: 'bottom',
|
|
76
|
-
maxHeight: preferredMaxHeight
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// 2: the menu will fit, if scrolled
|
|
81
|
-
if (scrollSpaceBelow >= menuHeight && !isFixedPosition) {
|
|
82
|
-
if (shouldScroll) {
|
|
83
|
-
animatedScrollTo(scrollParent, scrollDown, scrollDuration);
|
|
84
|
-
}
|
|
85
|
-
return {
|
|
86
|
-
placement: 'bottom',
|
|
87
|
-
maxHeight: preferredMaxHeight
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// 3: the menu will fit, if constrained
|
|
92
|
-
if (!isFixedPosition && scrollSpaceBelow >= minHeight || isFixedPosition && viewSpaceBelow >= minHeight) {
|
|
93
|
-
if (shouldScroll) {
|
|
94
|
-
animatedScrollTo(scrollParent, scrollDown, scrollDuration);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// we want to provide as much of the menu as possible to the user,
|
|
98
|
-
// so give them whatever is available below rather than the minHeight.
|
|
99
|
-
const constrainedHeight = isFixedPosition ? viewSpaceBelow - marginBottom : scrollSpaceBelow - marginBottom;
|
|
100
|
-
return {
|
|
101
|
-
placement: 'bottom',
|
|
102
|
-
maxHeight: constrainedHeight
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// 4. Forked beviour when there isn't enough space below
|
|
107
|
-
|
|
108
|
-
// AUTO: flip the menu, render above
|
|
109
|
-
if (preferredPlacement === 'auto' || isFixedPosition) {
|
|
110
|
-
// may need to be constrained after flipping
|
|
111
|
-
let constrainedHeight = preferredMaxHeight;
|
|
112
|
-
const spaceAbove = isFixedPosition ? viewSpaceAbove : scrollSpaceAbove;
|
|
113
|
-
if (spaceAbove >= minHeight) {
|
|
114
|
-
constrainedHeight = Math.min(spaceAbove - marginBottom - controlHeight, preferredMaxHeight);
|
|
115
|
-
}
|
|
116
|
-
return {
|
|
117
|
-
placement: 'top',
|
|
118
|
-
maxHeight: constrainedHeight
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// BOTTOM: allow browser to increase scrollable area and immediately set scroll
|
|
123
|
-
if (preferredPlacement === 'bottom') {
|
|
124
|
-
if (shouldScroll) {
|
|
125
|
-
scrollTo(scrollParent, scrollDown);
|
|
126
|
-
}
|
|
127
|
-
return {
|
|
128
|
-
placement: 'bottom',
|
|
129
|
-
maxHeight: preferredMaxHeight
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
break;
|
|
133
|
-
case 'top':
|
|
134
|
-
// 1: the menu will fit, do nothing
|
|
135
|
-
if (viewSpaceAbove >= menuHeight) {
|
|
136
|
-
return {
|
|
137
|
-
placement: 'top',
|
|
138
|
-
maxHeight: preferredMaxHeight
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// 2: the menu will fit, if scrolled
|
|
143
|
-
if (scrollSpaceAbove >= menuHeight && !isFixedPosition) {
|
|
144
|
-
if (shouldScroll) {
|
|
145
|
-
animatedScrollTo(scrollParent, scrollUp, scrollDuration);
|
|
146
|
-
}
|
|
147
|
-
return {
|
|
148
|
-
placement: 'top',
|
|
149
|
-
maxHeight: preferredMaxHeight
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// 3: the menu will fit, if constrained
|
|
154
|
-
if (!isFixedPosition && scrollSpaceAbove >= minHeight || isFixedPosition && viewSpaceAbove >= minHeight) {
|
|
155
|
-
let constrainedHeight = preferredMaxHeight;
|
|
156
|
-
|
|
157
|
-
// we want to provide as much of the menu as possible to the user,
|
|
158
|
-
// so give them whatever is available below rather than the minHeight.
|
|
159
|
-
if (!isFixedPosition && scrollSpaceAbove >= minHeight || isFixedPosition && viewSpaceAbove >= minHeight) {
|
|
160
|
-
constrainedHeight = isFixedPosition ? viewSpaceAbove - marginTop : scrollSpaceAbove - marginTop;
|
|
161
|
-
}
|
|
162
|
-
if (shouldScroll) {
|
|
163
|
-
animatedScrollTo(scrollParent, scrollUp, scrollDuration);
|
|
164
|
-
}
|
|
165
|
-
return {
|
|
166
|
-
placement: 'top',
|
|
167
|
-
maxHeight: constrainedHeight
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// 4. not enough space, the browser WILL NOT increase scrollable area when
|
|
172
|
-
// absolutely positioned element rendered above the viewport (only below).
|
|
173
|
-
// Flip the menu, render below
|
|
174
|
-
return {
|
|
175
|
-
placement: 'bottom',
|
|
176
|
-
maxHeight: preferredMaxHeight
|
|
177
|
-
};
|
|
178
|
-
default:
|
|
179
|
-
throw new Error(`Invalid placement provided "${preferredPlacement}".`);
|
|
180
|
-
}
|
|
181
|
-
return defaultState;
|
|
182
|
-
}
|
|
4
|
+
import Compiled, { LoadingMessage as CompiledLoadingMessage, menuCSS as compiledMenuCSS, MenuList as CompiledMenuList, menuListCSS as compiledMenuListCSS, MenuPlacer as CompiledMenuPlacer, MenuPortal as CompiledMenuPortal, menuPortalCSS as compiledMenuPortalCSS, NoOptionsMessage as CompiledNoOptionsMessage } from '../compiled/components/menu';
|
|
5
|
+
import Emotion, { LoadingMessage as EmotionLoadingMessage, menuCSS as emotionMenuCSS, MenuList as EmotionMenuList, menuListCSS as emotionMenuListCSS, MenuPlacer as EmotionMenuPlacer, MenuPortal as EmotionMenuPortal, menuPortalCSS as emotionMenuPortalCSS, NoOptionsMessage as EmotionNoOptionsMessage } from '../emotion/components/menu';
|
|
183
6
|
|
|
184
7
|
// Menu Component
|
|
185
8
|
// ------------------------------
|
|
186
9
|
|
|
187
|
-
|
|
188
|
-
const placementToCSSProp = {
|
|
189
|
-
bottom: 'top',
|
|
190
|
-
top: 'bottom'
|
|
191
|
-
};
|
|
192
|
-
return placement ? placementToCSSProp[placement] : 'bottom';
|
|
193
|
-
}
|
|
194
|
-
const coercePlacement = p => p === 'auto' ? 'bottom' : p;
|
|
195
|
-
export const menuCSS = ({
|
|
196
|
-
placement
|
|
197
|
-
}) => ({
|
|
198
|
-
label: 'menu',
|
|
199
|
-
[alignToControl(placement)]: '100%',
|
|
200
|
-
position: 'absolute',
|
|
201
|
-
width: '100%',
|
|
202
|
-
zIndex: 1,
|
|
203
|
-
borderRadius: "var(--ds-border-radius, 4px)",
|
|
204
|
-
marginBottom: "var(--ds-space-100, 8px)",
|
|
205
|
-
marginTop: "var(--ds-space-100, 8px)",
|
|
206
|
-
backgroundColor: "var(--ds-surface-overlay, white)",
|
|
207
|
-
boxShadow: "var(--ds-shadow-overlay, 0 0 0 1px hsl(0deg 0% 0% / 10%), 0 4px 11px hsl(0deg 0% 0% / 10%))"
|
|
208
|
-
});
|
|
209
|
-
const PortalPlacementContext = /*#__PURE__*/createContext(null);
|
|
10
|
+
export const menuCSS = props => fg('compiled-react-select') ? compiledMenuCSS() : emotionMenuCSS(props);
|
|
210
11
|
|
|
211
12
|
// NOTE: internal only
|
|
212
13
|
// eslint-disable-next-line @repo/internal/react/require-jsdoc
|
|
213
|
-
export const MenuPlacer = props =>
|
|
214
|
-
|
|
215
|
-
children,
|
|
216
|
-
minMenuHeight,
|
|
217
|
-
maxMenuHeight,
|
|
218
|
-
menuPlacement,
|
|
219
|
-
menuPosition,
|
|
220
|
-
menuShouldScrollIntoView
|
|
221
|
-
} = props;
|
|
222
|
-
const {
|
|
223
|
-
setPortalPlacement
|
|
224
|
-
} = useContext(PortalPlacementContext) || {};
|
|
225
|
-
const ref = useRef(null);
|
|
226
|
-
const [maxHeight, setMaxHeight] = useState(maxMenuHeight);
|
|
227
|
-
const [placement, setPlacement] = useState(null);
|
|
228
|
-
// The minimum height of the control
|
|
229
|
-
const controlHeight = 38;
|
|
230
|
-
useLayoutEffect(() => {
|
|
231
|
-
const menuEl = ref.current;
|
|
232
|
-
if (!menuEl) {
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// DO NOT scroll if position is fixed
|
|
237
|
-
const isFixedPosition = menuPosition === 'fixed';
|
|
238
|
-
const shouldScroll = menuShouldScrollIntoView && !isFixedPosition;
|
|
239
|
-
const state = getMenuPlacement({
|
|
240
|
-
maxHeight: maxMenuHeight,
|
|
241
|
-
menuEl,
|
|
242
|
-
minHeight: minMenuHeight,
|
|
243
|
-
placement: menuPlacement,
|
|
244
|
-
shouldScroll,
|
|
245
|
-
isFixedPosition,
|
|
246
|
-
controlHeight
|
|
247
|
-
});
|
|
248
|
-
setMaxHeight(state.maxHeight);
|
|
249
|
-
setPlacement(state.placement);
|
|
250
|
-
setPortalPlacement === null || setPortalPlacement === void 0 ? void 0 : setPortalPlacement(state.placement);
|
|
251
|
-
}, [maxMenuHeight, menuPlacement, menuPosition, menuShouldScrollIntoView, minMenuHeight, setPortalPlacement, controlHeight]);
|
|
252
|
-
return children({
|
|
253
|
-
ref,
|
|
254
|
-
placerProps: {
|
|
255
|
-
...props,
|
|
256
|
-
placement: placement || coercePlacement(menuPlacement),
|
|
257
|
-
maxHeight
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
};
|
|
261
|
-
const Menu = props => {
|
|
262
|
-
const {
|
|
263
|
-
children,
|
|
264
|
-
innerRef,
|
|
265
|
-
innerProps
|
|
266
|
-
} = props;
|
|
267
|
-
return jsx("div", _extends({}, getStyleProps(props, 'menu', {
|
|
268
|
-
menu: true
|
|
269
|
-
}), {
|
|
270
|
-
ref: innerRef
|
|
271
|
-
}, innerProps), children);
|
|
272
|
-
};
|
|
14
|
+
export const MenuPlacer = props => fg('compiled-react-select') ? /*#__PURE__*/React.createElement(CompiledMenuPlacer, props) : /*#__PURE__*/React.createElement(EmotionMenuPlacer, props);
|
|
15
|
+
const Menu = props => fg('compiled-react-select') ? /*#__PURE__*/React.createElement(Compiled, props) : /*#__PURE__*/React.createElement(Emotion, props);
|
|
273
16
|
|
|
274
17
|
// eslint-disable-next-line @repo/internal/react/require-jsdoc
|
|
275
18
|
export default Menu;
|
|
@@ -278,35 +21,10 @@ export default Menu;
|
|
|
278
21
|
// Menu List
|
|
279
22
|
// ==============================
|
|
280
23
|
|
|
281
|
-
export const menuListCSS = (
|
|
282
|
-
maxHeight
|
|
283
|
-
}) => ({
|
|
284
|
-
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
|
-
});
|
|
24
|
+
export const menuListCSS = props => fg('compiled-react-select') ? compiledMenuListCSS() : emotionMenuListCSS(props);
|
|
292
25
|
|
|
293
26
|
// eslint-disable-next-line @repo/internal/react/require-jsdoc
|
|
294
|
-
export const MenuList = props =>
|
|
295
|
-
const {
|
|
296
|
-
children,
|
|
297
|
-
innerProps,
|
|
298
|
-
innerRef,
|
|
299
|
-
isMulti
|
|
300
|
-
} = props;
|
|
301
|
-
return jsx("div", _extends({}, getStyleProps(props, 'menuList', {
|
|
302
|
-
'menu-list': true,
|
|
303
|
-
'menu-list--is-multi': isMulti
|
|
304
|
-
}), {
|
|
305
|
-
ref: innerRef
|
|
306
|
-
}, innerProps, {
|
|
307
|
-
tabIndex: -1
|
|
308
|
-
}), children);
|
|
309
|
-
};
|
|
27
|
+
export const MenuList = props => fg('compiled-react-select') ? /*#__PURE__*/React.createElement(CompiledMenuList, props) : /*#__PURE__*/React.createElement(EmotionMenuList, props);
|
|
310
28
|
|
|
311
29
|
// ==============================
|
|
312
30
|
// Menu Notices
|
|
@@ -319,132 +37,16 @@ const noticeCSS = ({}) => ({
|
|
|
319
37
|
export const noOptionsMessageCSS = noticeCSS;
|
|
320
38
|
export const loadingMessageCSS = noticeCSS;
|
|
321
39
|
// eslint-disable-next-line @repo/internal/react/require-jsdoc
|
|
322
|
-
export const NoOptionsMessage = (
|
|
323
|
-
children = 'No options',
|
|
324
|
-
innerProps,
|
|
325
|
-
...restProps
|
|
326
|
-
}) => {
|
|
327
|
-
return jsx("div", _extends({}, getStyleProps({
|
|
328
|
-
...restProps,
|
|
329
|
-
children,
|
|
330
|
-
innerProps
|
|
331
|
-
}, 'noOptionsMessage', {
|
|
332
|
-
'menu-notice': true,
|
|
333
|
-
'menu-notice--no-options': true
|
|
334
|
-
}), {
|
|
335
|
-
// eslint-disable-next-line jsx-a11y/role-has-required-aria-props
|
|
336
|
-
role: "option"
|
|
337
|
-
}, innerProps), jsx(Text, {
|
|
338
|
-
color: "color.text.subtle"
|
|
339
|
-
}, children));
|
|
340
|
-
};
|
|
40
|
+
export const NoOptionsMessage = props => fg('compiled-react-select') ? /*#__PURE__*/React.createElement(CompiledNoOptionsMessage, props) : /*#__PURE__*/React.createElement(EmotionNoOptionsMessage, props);
|
|
341
41
|
|
|
342
42
|
// eslint-disable-next-line @repo/internal/react/require-jsdoc
|
|
343
|
-
export const LoadingMessage = (
|
|
344
|
-
children = 'Loading...',
|
|
345
|
-
innerProps,
|
|
346
|
-
...restProps
|
|
347
|
-
}) => {
|
|
348
|
-
return jsx("div", _extends({}, getStyleProps({
|
|
349
|
-
...restProps,
|
|
350
|
-
children,
|
|
351
|
-
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
|
-
};
|
|
43
|
+
export const LoadingMessage = props => fg('compiled-react-select') ? /*#__PURE__*/React.createElement(CompiledLoadingMessage, props) : /*#__PURE__*/React.createElement(EmotionLoadingMessage, props);
|
|
362
44
|
|
|
363
45
|
// ==============================
|
|
364
46
|
// Menu Portal
|
|
365
47
|
// ==============================
|
|
366
48
|
|
|
367
|
-
export const menuPortalCSS = (
|
|
368
|
-
rect,
|
|
369
|
-
offset,
|
|
370
|
-
position
|
|
371
|
-
}) => ({
|
|
372
|
-
left: rect.left,
|
|
373
|
-
position: position,
|
|
374
|
-
top: offset,
|
|
375
|
-
width: rect.width,
|
|
376
|
-
zIndex: 1
|
|
377
|
-
});
|
|
378
|
-
// eslint-disable-next-line @repo/internal/react/require-jsdoc
|
|
379
|
-
export const MenuPortal = props => {
|
|
380
|
-
const {
|
|
381
|
-
appendTo,
|
|
382
|
-
children,
|
|
383
|
-
controlElement,
|
|
384
|
-
innerProps,
|
|
385
|
-
menuPlacement,
|
|
386
|
-
menuPosition
|
|
387
|
-
} = props;
|
|
388
|
-
const menuPortalRef = useRef(null);
|
|
389
|
-
const cleanupRef = useRef(null);
|
|
390
|
-
const [placement, setPortalPlacement] = useState(coercePlacement(menuPlacement));
|
|
391
|
-
const portalPlacementContext = useMemo(() => ({
|
|
392
|
-
setPortalPlacement
|
|
393
|
-
}), []);
|
|
394
|
-
const [computedPosition, setComputedPosition] = useState(null);
|
|
395
|
-
const updateComputedPosition = useCallback(() => {
|
|
396
|
-
if (!controlElement) {
|
|
397
|
-
return;
|
|
398
|
-
}
|
|
399
|
-
const rect = getBoundingClientObj(controlElement);
|
|
400
|
-
const scrollDistance = menuPosition === 'fixed' ? 0 : window.pageYOffset;
|
|
401
|
-
const offset = rect[placement] + scrollDistance;
|
|
402
|
-
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)) {
|
|
403
|
-
setComputedPosition({
|
|
404
|
-
offset,
|
|
405
|
-
rect
|
|
406
|
-
});
|
|
407
|
-
}
|
|
408
|
-
}, [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]);
|
|
409
|
-
useLayoutEffect(() => {
|
|
410
|
-
updateComputedPosition();
|
|
411
|
-
}, [updateComputedPosition]);
|
|
412
|
-
const runAutoUpdate = useCallback(() => {
|
|
413
|
-
if (typeof cleanupRef.current === 'function') {
|
|
414
|
-
cleanupRef.current();
|
|
415
|
-
cleanupRef.current = null;
|
|
416
|
-
}
|
|
417
|
-
if (controlElement && menuPortalRef.current) {
|
|
418
|
-
cleanupRef.current = autoUpdate(controlElement, menuPortalRef.current, updateComputedPosition, {
|
|
419
|
-
elementResize: 'ResizeObserver' in window
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
}, [controlElement, updateComputedPosition]);
|
|
423
|
-
useLayoutEffect(() => {
|
|
424
|
-
runAutoUpdate();
|
|
425
|
-
}, [runAutoUpdate]);
|
|
426
|
-
const setMenuPortalElement = useCallback(menuPortalElement => {
|
|
427
|
-
menuPortalRef.current = menuPortalElement;
|
|
428
|
-
runAutoUpdate();
|
|
429
|
-
}, [runAutoUpdate]);
|
|
430
|
-
|
|
431
|
-
// bail early if required elements aren't present
|
|
432
|
-
if (!appendTo && menuPosition !== 'fixed' || !computedPosition) {
|
|
433
|
-
return null;
|
|
434
|
-
}
|
|
49
|
+
export const menuPortalCSS = props => fg('compiled-react-select') ? compiledMenuPortalCSS() : emotionMenuPortalCSS(props);
|
|
435
50
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
ref: setMenuPortalElement
|
|
439
|
-
}, getStyleProps({
|
|
440
|
-
...props,
|
|
441
|
-
offset: computedPosition.offset,
|
|
442
|
-
position: menuPosition,
|
|
443
|
-
rect: computedPosition.rect
|
|
444
|
-
}, 'menuPortal', {
|
|
445
|
-
'menu-portal': true
|
|
446
|
-
}), innerProps), children);
|
|
447
|
-
return jsx(PortalPlacementContext.Provider, {
|
|
448
|
-
value: portalPlacementContext
|
|
449
|
-
}, appendTo ? /*#__PURE__*/createPortal(menuWrapper, appendTo) : menuWrapper);
|
|
450
|
-
};
|
|
51
|
+
// eslint-disable-next-line @repo/internal/react/require-jsdoc
|
|
52
|
+
export const MenuPortal = props => fg('compiled-react-select') ? /*#__PURE__*/React.createElement(CompiledMenuPortal, props) : /*#__PURE__*/React.createElement(EmotionMenuPortal, props);
|