@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.
Files changed (197) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE.md +11 -0
  3. package/README.md +10 -0
  4. package/async/package.json +15 -0
  5. package/base/package.json +15 -0
  6. package/creatable/package.json +15 -0
  7. package/dist/cjs/accessibility/helpers.js +34 -0
  8. package/dist/cjs/accessibility/index.js +74 -0
  9. package/dist/cjs/async-creatable.js +27 -0
  10. package/dist/cjs/async.js +30 -0
  11. package/dist/cjs/builtins.js +18 -0
  12. package/dist/cjs/components/containers.js +100 -0
  13. package/dist/cjs/components/control.js +67 -0
  14. package/dist/cjs/components/group.js +79 -0
  15. package/dist/cjs/components/index.js +53 -0
  16. package/dist/cjs/components/indicators.js +214 -0
  17. package/dist/cjs/components/input.js +93 -0
  18. package/dist/cjs/components/internal/a11y-text.js +34 -0
  19. package/dist/cjs/components/internal/dummy-input.js +43 -0
  20. package/dist/cjs/components/internal/index.js +34 -0
  21. package/dist/cjs/components/internal/required-input.js +43 -0
  22. package/dist/cjs/components/internal/scroll-manager.js +57 -0
  23. package/dist/cjs/components/internal/use-scroll-capture.js +132 -0
  24. package/dist/cjs/components/internal/use-scroll-lock.js +149 -0
  25. package/dist/cjs/components/live-region.js +153 -0
  26. package/dist/cjs/components/menu.js +464 -0
  27. package/dist/cjs/components/multi-value.js +129 -0
  28. package/dist/cjs/components/option.js +62 -0
  29. package/dist/cjs/components/placeholder.js +39 -0
  30. package/dist/cjs/components/single-value.js +46 -0
  31. package/dist/cjs/creatable.js +30 -0
  32. package/dist/cjs/diacritics.js +274 -0
  33. package/dist/cjs/filters.js +50 -0
  34. package/dist/cjs/index.js +55 -0
  35. package/dist/cjs/nonce-provider.js +30 -0
  36. package/dist/cjs/select.js +1803 -0
  37. package/dist/cjs/state-manager.js +31 -0
  38. package/dist/cjs/styles.js +66 -0
  39. package/dist/cjs/theme.js +42 -0
  40. package/dist/cjs/types.js +5 -0
  41. package/dist/cjs/use-async.js +156 -0
  42. package/dist/cjs/use-creatable.js +114 -0
  43. package/dist/cjs/use-state-manager.js +83 -0
  44. package/dist/cjs/utils.js +357 -0
  45. package/dist/es2019/accessibility/helpers.js +24 -0
  46. package/dist/es2019/accessibility/index.js +72 -0
  47. package/dist/es2019/async-creatable.js +17 -0
  48. package/dist/es2019/async.js +16 -0
  49. package/dist/es2019/builtins.js +4 -0
  50. package/dist/es2019/components/containers.js +100 -0
  51. package/dist/es2019/components/control.js +62 -0
  52. package/dist/es2019/components/group.js +74 -0
  53. package/dist/es2019/components/index.js +41 -0
  54. package/dist/es2019/components/indicators.js +211 -0
  55. package/dist/es2019/components/input.js +88 -0
  56. package/dist/es2019/components/internal/a11y-text.js +25 -0
  57. package/dist/es2019/components/internal/dummy-input.js +36 -0
  58. package/dist/es2019/components/internal/index.js +4 -0
  59. package/dist/es2019/components/internal/required-input.js +35 -0
  60. package/dist/es2019/components/internal/scroll-manager.js +49 -0
  61. package/dist/es2019/components/internal/use-scroll-capture.js +128 -0
  62. package/dist/es2019/components/internal/use-scroll-lock.js +143 -0
  63. package/dist/es2019/components/live-region.js +151 -0
  64. package/dist/es2019/components/menu.js +466 -0
  65. package/dist/es2019/components/multi-value.js +134 -0
  66. package/dist/es2019/components/option.js +57 -0
  67. package/dist/es2019/components/placeholder.js +34 -0
  68. package/dist/es2019/components/single-value.js +41 -0
  69. package/dist/es2019/creatable.js +15 -0
  70. package/dist/es2019/diacritics.js +264 -0
  71. package/dist/es2019/filters.js +36 -0
  72. package/dist/es2019/index.js +8 -0
  73. package/dist/es2019/nonce-provider.js +19 -0
  74. package/dist/es2019/select.js +1766 -0
  75. package/dist/es2019/state-manager.js +22 -0
  76. package/dist/es2019/styles.js +56 -0
  77. package/dist/es2019/theme.js +36 -0
  78. package/dist/es2019/types.js +1 -0
  79. package/dist/es2019/use-async.js +117 -0
  80. package/dist/es2019/use-creatable.js +81 -0
  81. package/dist/es2019/use-state-manager.js +60 -0
  82. package/dist/es2019/utils.js +309 -0
  83. package/dist/esm/accessibility/helpers.js +24 -0
  84. package/dist/esm/accessibility/index.js +68 -0
  85. package/dist/esm/async-creatable.js +17 -0
  86. package/dist/esm/async.js +16 -0
  87. package/dist/esm/builtins.js +12 -0
  88. package/dist/esm/components/containers.js +96 -0
  89. package/dist/esm/components/control.js +62 -0
  90. package/dist/esm/components/group.js +74 -0
  91. package/dist/esm/components/index.js +43 -0
  92. package/dist/esm/components/indicators.js +209 -0
  93. package/dist/esm/components/input.js +88 -0
  94. package/dist/esm/components/internal/a11y-text.js +27 -0
  95. package/dist/esm/components/internal/dummy-input.js +37 -0
  96. package/dist/esm/components/internal/index.js +4 -0
  97. package/dist/esm/components/internal/required-input.js +36 -0
  98. package/dist/esm/components/internal/scroll-manager.js +49 -0
  99. package/dist/esm/components/internal/use-scroll-capture.js +126 -0
  100. package/dist/esm/components/internal/use-scroll-lock.js +143 -0
  101. package/dist/esm/components/live-region.js +148 -0
  102. package/dist/esm/components/menu.js +460 -0
  103. package/dist/esm/components/multi-value.js +122 -0
  104. package/dist/esm/components/option.js +57 -0
  105. package/dist/esm/components/placeholder.js +34 -0
  106. package/dist/esm/components/single-value.js +41 -0
  107. package/dist/esm/creatable.js +15 -0
  108. package/dist/esm/diacritics.js +268 -0
  109. package/dist/esm/filters.js +43 -0
  110. package/dist/esm/index.js +8 -0
  111. package/dist/esm/nonce-provider.js +20 -0
  112. package/dist/esm/select.js +1794 -0
  113. package/dist/esm/state-manager.js +22 -0
  114. package/dist/esm/styles.js +58 -0
  115. package/dist/esm/theme.js +36 -0
  116. package/dist/esm/types.js +1 -0
  117. package/dist/esm/use-async.js +149 -0
  118. package/dist/esm/use-creatable.js +107 -0
  119. package/dist/esm/use-state-manager.js +76 -0
  120. package/dist/esm/utils.js +328 -0
  121. package/dist/types/accessibility/helpers.d.ts +5 -0
  122. package/dist/types/accessibility/index.d.ts +125 -0
  123. package/dist/types/async-creatable.d.ts +10 -0
  124. package/dist/types/async.d.ts +9 -0
  125. package/dist/types/builtins.d.ts +5 -0
  126. package/dist/types/components/containers.d.ts +50 -0
  127. package/dist/types/components/control.d.ts +33 -0
  128. package/dist/types/components/group.d.ts +53 -0
  129. package/dist/types/components/index.d.ts +73 -0
  130. package/dist/types/components/indicators.d.ts +72 -0
  131. package/dist/types/components/input.d.ts +33 -0
  132. package/dist/types/components/internal/a11y-text.d.ts +8 -0
  133. package/dist/types/components/internal/dummy-input.d.ts +9 -0
  134. package/dist/types/components/internal/index.d.ts +4 -0
  135. package/dist/types/components/internal/required-input.d.ts +10 -0
  136. package/dist/types/components/internal/scroll-manager.d.ts +17 -0
  137. package/dist/types/components/internal/use-scroll-capture.d.ts +12 -0
  138. package/dist/types/components/internal/use-scroll-lock.d.ts +9 -0
  139. package/dist/types/components/live-region.d.ts +24 -0
  140. package/dist/types/components/menu.d.ts +130 -0
  141. package/dist/types/components/multi-value.d.ts +47 -0
  142. package/dist/types/components/option.d.ts +49 -0
  143. package/dist/types/components/placeholder.d.ts +22 -0
  144. package/dist/types/components/single-value.d.ts +28 -0
  145. package/dist/types/creatable.d.ts +10 -0
  146. package/dist/types/diacritics.d.ts +1 -0
  147. package/dist/types/filters.d.ts +15 -0
  148. package/dist/types/index.d.ts +28 -0
  149. package/dist/types/nonce-provider.d.ts +8 -0
  150. package/dist/types/select.d.ts +616 -0
  151. package/dist/types/state-manager.d.ts +17 -0
  152. package/dist/types/styles.d.ts +68 -0
  153. package/dist/types/theme.d.ts +27 -0
  154. package/dist/types/types.d.ts +134 -0
  155. package/dist/types/use-async.d.ts +31 -0
  156. package/dist/types/use-creatable.d.ts +46 -0
  157. package/dist/types/use-state-manager.d.ts +15 -0
  158. package/dist/types/utils.d.ts +44 -0
  159. package/dist/types-ts4.5/accessibility/helpers.d.ts +5 -0
  160. package/dist/types-ts4.5/accessibility/index.d.ts +125 -0
  161. package/dist/types-ts4.5/async-creatable.d.ts +10 -0
  162. package/dist/types-ts4.5/async.d.ts +9 -0
  163. package/dist/types-ts4.5/builtins.d.ts +5 -0
  164. package/dist/types-ts4.5/components/containers.d.ts +50 -0
  165. package/dist/types-ts4.5/components/control.d.ts +33 -0
  166. package/dist/types-ts4.5/components/group.d.ts +53 -0
  167. package/dist/types-ts4.5/components/index.d.ts +73 -0
  168. package/dist/types-ts4.5/components/indicators.d.ts +72 -0
  169. package/dist/types-ts4.5/components/input.d.ts +33 -0
  170. package/dist/types-ts4.5/components/internal/a11y-text.d.ts +8 -0
  171. package/dist/types-ts4.5/components/internal/dummy-input.d.ts +9 -0
  172. package/dist/types-ts4.5/components/internal/index.d.ts +4 -0
  173. package/dist/types-ts4.5/components/internal/required-input.d.ts +10 -0
  174. package/dist/types-ts4.5/components/internal/scroll-manager.d.ts +17 -0
  175. package/dist/types-ts4.5/components/internal/use-scroll-capture.d.ts +12 -0
  176. package/dist/types-ts4.5/components/internal/use-scroll-lock.d.ts +9 -0
  177. package/dist/types-ts4.5/components/live-region.d.ts +24 -0
  178. package/dist/types-ts4.5/components/menu.d.ts +130 -0
  179. package/dist/types-ts4.5/components/multi-value.d.ts +47 -0
  180. package/dist/types-ts4.5/components/option.d.ts +49 -0
  181. package/dist/types-ts4.5/components/placeholder.d.ts +22 -0
  182. package/dist/types-ts4.5/components/single-value.d.ts +28 -0
  183. package/dist/types-ts4.5/creatable.d.ts +10 -0
  184. package/dist/types-ts4.5/diacritics.d.ts +1 -0
  185. package/dist/types-ts4.5/filters.d.ts +15 -0
  186. package/dist/types-ts4.5/index.d.ts +28 -0
  187. package/dist/types-ts4.5/nonce-provider.d.ts +8 -0
  188. package/dist/types-ts4.5/select.d.ts +616 -0
  189. package/dist/types-ts4.5/state-manager.d.ts +17 -0
  190. package/dist/types-ts4.5/styles.d.ts +68 -0
  191. package/dist/types-ts4.5/theme.d.ts +27 -0
  192. package/dist/types-ts4.5/types.d.ts +134 -0
  193. package/dist/types-ts4.5/use-async.d.ts +31 -0
  194. package/dist/types-ts4.5/use-creatable.d.ts +46 -0
  195. package/dist/types-ts4.5/use-state-manager.d.ts +15 -0
  196. package/dist/types-ts4.5/utils.d.ts +44 -0
  197. 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;