@atlaskit/react-select 0.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.
- package/CHANGELOG.md +9 -0
- package/LICENSE.md +11 -0
- package/README.md +10 -0
- package/async/package.json +15 -0
- package/base/package.json +15 -0
- package/creatable/package.json +15 -0
- package/dist/cjs/accessibility/helpers.js +34 -0
- package/dist/cjs/accessibility/index.js +74 -0
- package/dist/cjs/async-creatable.js +27 -0
- package/dist/cjs/async.js +30 -0
- package/dist/cjs/builtins.js +18 -0
- package/dist/cjs/components/containers.js +100 -0
- package/dist/cjs/components/control.js +67 -0
- package/dist/cjs/components/group.js +79 -0
- package/dist/cjs/components/index.js +53 -0
- package/dist/cjs/components/indicators.js +214 -0
- package/dist/cjs/components/input.js +93 -0
- package/dist/cjs/components/internal/a11y-text.js +34 -0
- package/dist/cjs/components/internal/dummy-input.js +43 -0
- package/dist/cjs/components/internal/index.js +34 -0
- package/dist/cjs/components/internal/required-input.js +43 -0
- package/dist/cjs/components/internal/scroll-manager.js +57 -0
- package/dist/cjs/components/internal/use-scroll-capture.js +132 -0
- package/dist/cjs/components/internal/use-scroll-lock.js +149 -0
- package/dist/cjs/components/live-region.js +153 -0
- package/dist/cjs/components/menu.js +464 -0
- package/dist/cjs/components/multi-value.js +129 -0
- package/dist/cjs/components/option.js +62 -0
- package/dist/cjs/components/placeholder.js +39 -0
- package/dist/cjs/components/single-value.js +46 -0
- package/dist/cjs/creatable.js +30 -0
- package/dist/cjs/diacritics.js +274 -0
- package/dist/cjs/filters.js +50 -0
- package/dist/cjs/index.js +55 -0
- package/dist/cjs/nonce-provider.js +30 -0
- package/dist/cjs/select.js +1803 -0
- package/dist/cjs/state-manager.js +31 -0
- package/dist/cjs/styles.js +66 -0
- package/dist/cjs/theme.js +42 -0
- package/dist/cjs/types.js +5 -0
- package/dist/cjs/use-async.js +156 -0
- package/dist/cjs/use-creatable.js +114 -0
- package/dist/cjs/use-state-manager.js +83 -0
- package/dist/cjs/utils.js +357 -0
- package/dist/es2019/accessibility/helpers.js +24 -0
- package/dist/es2019/accessibility/index.js +72 -0
- package/dist/es2019/async-creatable.js +17 -0
- package/dist/es2019/async.js +16 -0
- package/dist/es2019/builtins.js +4 -0
- package/dist/es2019/components/containers.js +100 -0
- package/dist/es2019/components/control.js +62 -0
- package/dist/es2019/components/group.js +74 -0
- package/dist/es2019/components/index.js +41 -0
- package/dist/es2019/components/indicators.js +211 -0
- package/dist/es2019/components/input.js +88 -0
- package/dist/es2019/components/internal/a11y-text.js +25 -0
- package/dist/es2019/components/internal/dummy-input.js +36 -0
- package/dist/es2019/components/internal/index.js +4 -0
- package/dist/es2019/components/internal/required-input.js +35 -0
- package/dist/es2019/components/internal/scroll-manager.js +49 -0
- package/dist/es2019/components/internal/use-scroll-capture.js +128 -0
- package/dist/es2019/components/internal/use-scroll-lock.js +143 -0
- package/dist/es2019/components/live-region.js +151 -0
- package/dist/es2019/components/menu.js +466 -0
- package/dist/es2019/components/multi-value.js +134 -0
- package/dist/es2019/components/option.js +57 -0
- package/dist/es2019/components/placeholder.js +34 -0
- package/dist/es2019/components/single-value.js +41 -0
- package/dist/es2019/creatable.js +15 -0
- package/dist/es2019/diacritics.js +264 -0
- package/dist/es2019/filters.js +36 -0
- package/dist/es2019/index.js +8 -0
- package/dist/es2019/nonce-provider.js +19 -0
- package/dist/es2019/select.js +1766 -0
- package/dist/es2019/state-manager.js +22 -0
- package/dist/es2019/styles.js +56 -0
- package/dist/es2019/theme.js +36 -0
- package/dist/es2019/types.js +1 -0
- package/dist/es2019/use-async.js +117 -0
- package/dist/es2019/use-creatable.js +81 -0
- package/dist/es2019/use-state-manager.js +60 -0
- package/dist/es2019/utils.js +309 -0
- package/dist/esm/accessibility/helpers.js +24 -0
- package/dist/esm/accessibility/index.js +68 -0
- package/dist/esm/async-creatable.js +17 -0
- package/dist/esm/async.js +16 -0
- package/dist/esm/builtins.js +12 -0
- package/dist/esm/components/containers.js +96 -0
- package/dist/esm/components/control.js +62 -0
- package/dist/esm/components/group.js +74 -0
- package/dist/esm/components/index.js +43 -0
- package/dist/esm/components/indicators.js +209 -0
- package/dist/esm/components/input.js +88 -0
- package/dist/esm/components/internal/a11y-text.js +27 -0
- package/dist/esm/components/internal/dummy-input.js +37 -0
- package/dist/esm/components/internal/index.js +4 -0
- package/dist/esm/components/internal/required-input.js +36 -0
- package/dist/esm/components/internal/scroll-manager.js +49 -0
- package/dist/esm/components/internal/use-scroll-capture.js +126 -0
- package/dist/esm/components/internal/use-scroll-lock.js +143 -0
- package/dist/esm/components/live-region.js +148 -0
- package/dist/esm/components/menu.js +460 -0
- package/dist/esm/components/multi-value.js +122 -0
- package/dist/esm/components/option.js +57 -0
- package/dist/esm/components/placeholder.js +34 -0
- package/dist/esm/components/single-value.js +41 -0
- package/dist/esm/creatable.js +15 -0
- package/dist/esm/diacritics.js +268 -0
- package/dist/esm/filters.js +43 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/nonce-provider.js +20 -0
- package/dist/esm/select.js +1794 -0
- package/dist/esm/state-manager.js +22 -0
- package/dist/esm/styles.js +58 -0
- package/dist/esm/theme.js +36 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/use-async.js +149 -0
- package/dist/esm/use-creatable.js +107 -0
- package/dist/esm/use-state-manager.js +76 -0
- package/dist/esm/utils.js +328 -0
- package/dist/types/accessibility/helpers.d.ts +5 -0
- package/dist/types/accessibility/index.d.ts +125 -0
- package/dist/types/async-creatable.d.ts +10 -0
- package/dist/types/async.d.ts +9 -0
- package/dist/types/builtins.d.ts +5 -0
- package/dist/types/components/containers.d.ts +50 -0
- package/dist/types/components/control.d.ts +33 -0
- package/dist/types/components/group.d.ts +53 -0
- package/dist/types/components/index.d.ts +73 -0
- package/dist/types/components/indicators.d.ts +72 -0
- package/dist/types/components/input.d.ts +33 -0
- package/dist/types/components/internal/a11y-text.d.ts +8 -0
- package/dist/types/components/internal/dummy-input.d.ts +9 -0
- package/dist/types/components/internal/index.d.ts +4 -0
- package/dist/types/components/internal/required-input.d.ts +10 -0
- package/dist/types/components/internal/scroll-manager.d.ts +17 -0
- package/dist/types/components/internal/use-scroll-capture.d.ts +12 -0
- package/dist/types/components/internal/use-scroll-lock.d.ts +9 -0
- package/dist/types/components/live-region.d.ts +24 -0
- package/dist/types/components/menu.d.ts +130 -0
- package/dist/types/components/multi-value.d.ts +47 -0
- package/dist/types/components/option.d.ts +49 -0
- package/dist/types/components/placeholder.d.ts +22 -0
- package/dist/types/components/single-value.d.ts +28 -0
- package/dist/types/creatable.d.ts +10 -0
- package/dist/types/diacritics.d.ts +1 -0
- package/dist/types/filters.d.ts +15 -0
- package/dist/types/index.d.ts +28 -0
- package/dist/types/nonce-provider.d.ts +8 -0
- package/dist/types/select.d.ts +616 -0
- package/dist/types/state-manager.d.ts +17 -0
- package/dist/types/styles.d.ts +68 -0
- package/dist/types/theme.d.ts +27 -0
- package/dist/types/types.d.ts +134 -0
- package/dist/types/use-async.d.ts +31 -0
- package/dist/types/use-creatable.d.ts +46 -0
- package/dist/types/use-state-manager.d.ts +15 -0
- package/dist/types/utils.d.ts +44 -0
- package/dist/types-ts4.5/accessibility/helpers.d.ts +5 -0
- package/dist/types-ts4.5/accessibility/index.d.ts +125 -0
- package/dist/types-ts4.5/async-creatable.d.ts +10 -0
- package/dist/types-ts4.5/async.d.ts +9 -0
- package/dist/types-ts4.5/builtins.d.ts +5 -0
- package/dist/types-ts4.5/components/containers.d.ts +50 -0
- package/dist/types-ts4.5/components/control.d.ts +33 -0
- package/dist/types-ts4.5/components/group.d.ts +53 -0
- package/dist/types-ts4.5/components/index.d.ts +73 -0
- package/dist/types-ts4.5/components/indicators.d.ts +72 -0
- package/dist/types-ts4.5/components/input.d.ts +33 -0
- package/dist/types-ts4.5/components/internal/a11y-text.d.ts +8 -0
- package/dist/types-ts4.5/components/internal/dummy-input.d.ts +9 -0
- package/dist/types-ts4.5/components/internal/index.d.ts +4 -0
- package/dist/types-ts4.5/components/internal/required-input.d.ts +10 -0
- package/dist/types-ts4.5/components/internal/scroll-manager.d.ts +17 -0
- package/dist/types-ts4.5/components/internal/use-scroll-capture.d.ts +12 -0
- package/dist/types-ts4.5/components/internal/use-scroll-lock.d.ts +9 -0
- package/dist/types-ts4.5/components/live-region.d.ts +24 -0
- package/dist/types-ts4.5/components/menu.d.ts +130 -0
- package/dist/types-ts4.5/components/multi-value.d.ts +47 -0
- package/dist/types-ts4.5/components/option.d.ts +49 -0
- package/dist/types-ts4.5/components/placeholder.d.ts +22 -0
- package/dist/types-ts4.5/components/single-value.d.ts +28 -0
- package/dist/types-ts4.5/creatable.d.ts +10 -0
- package/dist/types-ts4.5/diacritics.d.ts +1 -0
- package/dist/types-ts4.5/filters.d.ts +15 -0
- package/dist/types-ts4.5/index.d.ts +28 -0
- package/dist/types-ts4.5/nonce-provider.d.ts +8 -0
- package/dist/types-ts4.5/select.d.ts +616 -0
- package/dist/types-ts4.5/state-manager.d.ts +17 -0
- package/dist/types-ts4.5/styles.d.ts +68 -0
- package/dist/types-ts4.5/theme.d.ts +27 -0
- package/dist/types-ts4.5/types.d.ts +134 -0
- package/dist/types-ts4.5/use-async.d.ts +31 -0
- package/dist/types-ts4.5/use-creatable.d.ts +46 -0
- package/dist/types-ts4.5/use-state-manager.d.ts +15 -0
- package/dist/types-ts4.5/utils.d.ts +44 -0
- package/package.json +83 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
const STYLE_KEYS = ['boxSizing', 'height', 'overflow', 'paddingRight', 'position'];
|
|
3
|
+
const LOCK_STYLES = {
|
|
4
|
+
boxSizing: 'border-box',
|
|
5
|
+
// account for possible declaration `width: 100%;` on body
|
|
6
|
+
overflow: 'hidden',
|
|
7
|
+
position: 'relative',
|
|
8
|
+
height: '100%'
|
|
9
|
+
};
|
|
10
|
+
function preventTouchMove(e) {
|
|
11
|
+
e.preventDefault();
|
|
12
|
+
}
|
|
13
|
+
function allowTouchMove(e) {
|
|
14
|
+
e.stopPropagation();
|
|
15
|
+
}
|
|
16
|
+
function preventInertiaScroll() {
|
|
17
|
+
const top = this.scrollTop;
|
|
18
|
+
const totalScroll = this.scrollHeight;
|
|
19
|
+
const currentScroll = top + this.offsetHeight;
|
|
20
|
+
if (top === 0) {
|
|
21
|
+
this.scrollTop = 1;
|
|
22
|
+
} else if (currentScroll === totalScroll) {
|
|
23
|
+
this.scrollTop = top - 1;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// `ontouchstart` check works on most browsers
|
|
28
|
+
// `maxTouchPoints` works on IE10/11 and Surface
|
|
29
|
+
function isTouchDevice() {
|
|
30
|
+
// eslint-disable-next-line compat/compat
|
|
31
|
+
return 'ontouchstart' in window || navigator.maxTouchPoints;
|
|
32
|
+
}
|
|
33
|
+
const canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
|
|
34
|
+
let activeScrollLocks = 0;
|
|
35
|
+
const listenerOptions = {
|
|
36
|
+
capture: false,
|
|
37
|
+
passive: false
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// TODO: Fill in the hook {description}.
|
|
41
|
+
/**
|
|
42
|
+
* {description}.
|
|
43
|
+
*/
|
|
44
|
+
export default function useScrollLock({
|
|
45
|
+
isEnabled,
|
|
46
|
+
accountForScrollbars = true
|
|
47
|
+
}) {
|
|
48
|
+
const originalStyles = useRef({});
|
|
49
|
+
const scrollTarget = useRef(null);
|
|
50
|
+
const addScrollLock = useCallback(touchScrollTarget => {
|
|
51
|
+
if (!canUseDOM) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const target = document.body;
|
|
55
|
+
const targetStyle = target && target.style;
|
|
56
|
+
if (accountForScrollbars) {
|
|
57
|
+
// store any styles already applied to the body
|
|
58
|
+
STYLE_KEYS.forEach(key => {
|
|
59
|
+
const val = targetStyle && targetStyle[key];
|
|
60
|
+
originalStyles.current[key] = val;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// apply the lock styles and padding if this is the first scroll lock
|
|
65
|
+
if (accountForScrollbars && activeScrollLocks < 1) {
|
|
66
|
+
const currentPadding = parseInt(originalStyles.current.paddingRight, 10) || 0;
|
|
67
|
+
const clientWidth = document.body ? document.body.clientWidth : 0;
|
|
68
|
+
const adjustedPadding = window.innerWidth - clientWidth + currentPadding || 0;
|
|
69
|
+
Object.keys(LOCK_STYLES).forEach(key => {
|
|
70
|
+
const val = LOCK_STYLES[key];
|
|
71
|
+
if (targetStyle) {
|
|
72
|
+
targetStyle[key] = val;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
if (targetStyle) {
|
|
76
|
+
targetStyle.paddingRight = `${adjustedPadding}px`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// account for touch devices
|
|
81
|
+
if (target && isTouchDevice()) {
|
|
82
|
+
// Mobile Safari ignores { overflow: hidden } declaration on the body.
|
|
83
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
84
|
+
target.addEventListener('touchmove', preventTouchMove, listenerOptions);
|
|
85
|
+
|
|
86
|
+
// Allow scroll on provided target
|
|
87
|
+
if (touchScrollTarget) {
|
|
88
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
89
|
+
touchScrollTarget.addEventListener('touchstart', preventInertiaScroll, listenerOptions);
|
|
90
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
91
|
+
touchScrollTarget.addEventListener('touchmove', allowTouchMove, listenerOptions);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// increment active scroll locks
|
|
96
|
+
activeScrollLocks += 1;
|
|
97
|
+
}, [accountForScrollbars]);
|
|
98
|
+
const removeScrollLock = useCallback(touchScrollTarget => {
|
|
99
|
+
if (!canUseDOM) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const target = document.body;
|
|
103
|
+
const targetStyle = target && target.style;
|
|
104
|
+
|
|
105
|
+
// safely decrement active scroll locks
|
|
106
|
+
activeScrollLocks = Math.max(activeScrollLocks - 1, 0);
|
|
107
|
+
|
|
108
|
+
// reapply original body styles, if any
|
|
109
|
+
if (accountForScrollbars && activeScrollLocks < 1) {
|
|
110
|
+
STYLE_KEYS.forEach(key => {
|
|
111
|
+
const val = originalStyles.current[key];
|
|
112
|
+
if (targetStyle) {
|
|
113
|
+
targetStyle[key] = val;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// remove touch listeners
|
|
119
|
+
if (target && isTouchDevice()) {
|
|
120
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
121
|
+
target.removeEventListener('touchmove', preventTouchMove, listenerOptions);
|
|
122
|
+
if (touchScrollTarget) {
|
|
123
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
124
|
+
touchScrollTarget.removeEventListener('touchstart', preventInertiaScroll, listenerOptions);
|
|
125
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
126
|
+
touchScrollTarget.removeEventListener('touchmove', allowTouchMove, listenerOptions);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}, [accountForScrollbars]);
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
if (!isEnabled) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const element = scrollTarget.current;
|
|
135
|
+
addScrollLock(element);
|
|
136
|
+
return () => {
|
|
137
|
+
removeScrollLock(element);
|
|
138
|
+
};
|
|
139
|
+
}, [isEnabled, addScrollLock, removeScrollLock]);
|
|
140
|
+
return element => {
|
|
141
|
+
scrollTarget.current = element;
|
|
142
|
+
};
|
|
143
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jsxRuntime classic
|
|
3
|
+
* @jsx jsx
|
|
4
|
+
*/
|
|
5
|
+
import { Fragment, useMemo } from 'react';
|
|
6
|
+
import { jsx } from '@emotion/react';
|
|
7
|
+
import { defaultAriaLiveMessages } from '../accessibility';
|
|
8
|
+
import A11yText from './internal/a11y-text';
|
|
9
|
+
|
|
10
|
+
// ==============================
|
|
11
|
+
// Root Container
|
|
12
|
+
// ==============================
|
|
13
|
+
|
|
14
|
+
// eslint-disable-next-line @repo/internal/react/require-jsdoc
|
|
15
|
+
const LiveRegion = props => {
|
|
16
|
+
const {
|
|
17
|
+
ariaSelection,
|
|
18
|
+
focusedOption,
|
|
19
|
+
focusedValue,
|
|
20
|
+
focusableOptions,
|
|
21
|
+
isFocused,
|
|
22
|
+
selectValue,
|
|
23
|
+
selectProps,
|
|
24
|
+
id,
|
|
25
|
+
isAppleDevice
|
|
26
|
+
} = props;
|
|
27
|
+
const {
|
|
28
|
+
ariaLiveMessages,
|
|
29
|
+
getOptionLabel,
|
|
30
|
+
inputValue,
|
|
31
|
+
isMulti,
|
|
32
|
+
isOptionDisabled,
|
|
33
|
+
isSearchable,
|
|
34
|
+
menuIsOpen,
|
|
35
|
+
options,
|
|
36
|
+
screenReaderStatus,
|
|
37
|
+
tabSelectsValue,
|
|
38
|
+
isLoading
|
|
39
|
+
} = selectProps;
|
|
40
|
+
const ariaLabel = selectProps['aria-label'];
|
|
41
|
+
const ariaLive = selectProps['aria-live'];
|
|
42
|
+
|
|
43
|
+
// Update aria live message configuration when prop changes
|
|
44
|
+
const messages = useMemo(() => ({
|
|
45
|
+
...defaultAriaLiveMessages,
|
|
46
|
+
...(ariaLiveMessages || {})
|
|
47
|
+
}), [ariaLiveMessages]);
|
|
48
|
+
|
|
49
|
+
// Update aria live selected option when prop changes
|
|
50
|
+
const ariaSelected = useMemo(() => {
|
|
51
|
+
let message = '';
|
|
52
|
+
if (ariaSelection && messages.onChange) {
|
|
53
|
+
const {
|
|
54
|
+
option,
|
|
55
|
+
options: selectedOptions,
|
|
56
|
+
removedValue,
|
|
57
|
+
removedValues,
|
|
58
|
+
value
|
|
59
|
+
} = ariaSelection;
|
|
60
|
+
// select-option when !isMulti does not return option so we assume selected option is value
|
|
61
|
+
const asOption = val => !Array.isArray(val) ? val : null;
|
|
62
|
+
|
|
63
|
+
// If there is just one item from the action then get its label
|
|
64
|
+
const selected = removedValue || option || asOption(value);
|
|
65
|
+
const label = selected ? getOptionLabel(selected) : '';
|
|
66
|
+
|
|
67
|
+
// If there are multiple items from the action then return an array of labels
|
|
68
|
+
const multiSelected = selectedOptions || removedValues || undefined;
|
|
69
|
+
const labels = multiSelected ? multiSelected.map(getOptionLabel) : [];
|
|
70
|
+
const onChangeProps = {
|
|
71
|
+
// multiSelected items are usually items that have already been selected
|
|
72
|
+
// or set by the user as a default value so we assume they are not disabled
|
|
73
|
+
isDisabled: selected && isOptionDisabled(selected, selectValue),
|
|
74
|
+
label,
|
|
75
|
+
labels,
|
|
76
|
+
...ariaSelection
|
|
77
|
+
};
|
|
78
|
+
message = messages.onChange(onChangeProps);
|
|
79
|
+
}
|
|
80
|
+
return message;
|
|
81
|
+
}, [ariaSelection, messages, isOptionDisabled, selectValue, getOptionLabel]);
|
|
82
|
+
const ariaFocused = useMemo(() => {
|
|
83
|
+
let focusMsg = '';
|
|
84
|
+
const focused = focusedOption || focusedValue;
|
|
85
|
+
const isSelected = !!(focusedOption && selectValue && selectValue.includes(focusedOption));
|
|
86
|
+
if (focused && messages.onFocus) {
|
|
87
|
+
const onFocusProps = {
|
|
88
|
+
focused,
|
|
89
|
+
label: getOptionLabel(focused),
|
|
90
|
+
isDisabled: isOptionDisabled(focused, selectValue),
|
|
91
|
+
isSelected,
|
|
92
|
+
options: focusableOptions,
|
|
93
|
+
context: focused === focusedOption ? 'menu' : 'value',
|
|
94
|
+
selectValue,
|
|
95
|
+
isAppleDevice
|
|
96
|
+
};
|
|
97
|
+
focusMsg = messages.onFocus(onFocusProps);
|
|
98
|
+
}
|
|
99
|
+
return focusMsg;
|
|
100
|
+
}, [focusedOption, focusedValue, getOptionLabel, isOptionDisabled, messages, focusableOptions, selectValue, isAppleDevice]);
|
|
101
|
+
const ariaResults = useMemo(() => {
|
|
102
|
+
let resultsMsg = '';
|
|
103
|
+
if (menuIsOpen && options.length && !isLoading && messages.onFilter) {
|
|
104
|
+
const resultsMessage = screenReaderStatus({
|
|
105
|
+
count: focusableOptions.length
|
|
106
|
+
});
|
|
107
|
+
resultsMsg = messages.onFilter({
|
|
108
|
+
inputValue,
|
|
109
|
+
resultsMessage
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return resultsMsg;
|
|
113
|
+
}, [focusableOptions, inputValue, menuIsOpen, messages, options, screenReaderStatus, isLoading]);
|
|
114
|
+
const isInitialFocus = (ariaSelection === null || ariaSelection === void 0 ? void 0 : ariaSelection.action) === 'initial-input-focus';
|
|
115
|
+
const ariaGuidance = useMemo(() => {
|
|
116
|
+
let guidanceMsg = '';
|
|
117
|
+
if (messages.guidance) {
|
|
118
|
+
const context = focusedValue ? 'value' : menuIsOpen ? 'menu' : 'input';
|
|
119
|
+
guidanceMsg = messages.guidance({
|
|
120
|
+
'aria-label': ariaLabel,
|
|
121
|
+
context,
|
|
122
|
+
isDisabled: focusedOption && isOptionDisabled(focusedOption, selectValue),
|
|
123
|
+
isMulti,
|
|
124
|
+
isSearchable,
|
|
125
|
+
tabSelectsValue,
|
|
126
|
+
isInitialFocus
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return guidanceMsg;
|
|
130
|
+
}, [ariaLabel, focusedOption, focusedValue, isMulti, isOptionDisabled, isSearchable, menuIsOpen, messages, selectValue, tabSelectsValue, isInitialFocus]);
|
|
131
|
+
const ScreenReaderText = jsx(Fragment, null, jsx("span", {
|
|
132
|
+
id: "aria-selection"
|
|
133
|
+
}, ariaSelected), jsx("span", {
|
|
134
|
+
id: "aria-focused"
|
|
135
|
+
}, ariaFocused), jsx("span", {
|
|
136
|
+
id: "aria-results"
|
|
137
|
+
}, ariaResults), jsx("span", {
|
|
138
|
+
id: "aria-guidance"
|
|
139
|
+
}, ariaGuidance));
|
|
140
|
+
return jsx(Fragment, null, jsx(A11yText, {
|
|
141
|
+
id: id
|
|
142
|
+
}, isInitialFocus && ScreenReaderText), jsx(A11yText, {
|
|
143
|
+
"aria-live": ariaLive,
|
|
144
|
+
"aria-atomic": "false",
|
|
145
|
+
"aria-relevant": "additions text",
|
|
146
|
+
role: "log"
|
|
147
|
+
}, isFocused && !isInitialFocus && ScreenReaderText));
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// eslint-disable-next-line @repo/internal/react/require-jsdoc
|
|
151
|
+
export default LiveRegion;
|