@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,466 @@
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
+ 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';
11
+ import { animatedScrollTo, getBoundingClientObj, getScrollParent, getScrollTop, getStyleProps, normalizedHeight, scrollTo } from '../utils';
12
+
13
+ // ==============================
14
+ // Menu
15
+ // ==============================
16
+
17
+ // Get Menu Placement
18
+ // ------------------------------
19
+
20
+ export function getMenuPlacement({
21
+ maxHeight: preferredMaxHeight,
22
+ menuEl,
23
+ minHeight,
24
+ placement: preferredPlacement,
25
+ shouldScroll,
26
+ isFixedPosition,
27
+ controlHeight
28
+ }) {
29
+ const scrollParent = getScrollParent(menuEl);
30
+ const defaultState = {
31
+ placement: 'bottom',
32
+ maxHeight: preferredMaxHeight
33
+ };
34
+
35
+ // something went wrong, return default state
36
+ if (!menuEl || !menuEl.offsetParent) {
37
+ return defaultState;
38
+ }
39
+
40
+ // we can't trust `scrollParent.scrollHeight` --> it may increase when
41
+ // the menu is rendered
42
+ const {
43
+ height: scrollHeight
44
+ } = scrollParent.getBoundingClientRect();
45
+ const {
46
+ bottom: menuBottom,
47
+ height: menuHeight,
48
+ top: menuTop
49
+ } = menuEl.getBoundingClientRect();
50
+ const {
51
+ top: containerTop
52
+ } = menuEl.offsetParent.getBoundingClientRect();
53
+ const viewHeight = isFixedPosition ? window.innerHeight : normalizedHeight(scrollParent);
54
+ const scrollTop = getScrollTop(scrollParent);
55
+ const marginBottom = parseInt(getComputedStyle(menuEl).marginBottom, 10);
56
+ const marginTop = parseInt(getComputedStyle(menuEl).marginTop, 10);
57
+ const viewSpaceAbove = containerTop - marginTop;
58
+ const viewSpaceBelow = viewHeight - menuTop;
59
+ const scrollSpaceAbove = viewSpaceAbove + scrollTop;
60
+ const scrollSpaceBelow = scrollHeight - scrollTop - menuTop;
61
+ const scrollDown = menuBottom - viewHeight + scrollTop + marginBottom;
62
+ const scrollUp = scrollTop + menuTop - marginTop;
63
+ const scrollDuration = 160;
64
+ switch (preferredPlacement) {
65
+ case 'auto':
66
+ case 'bottom':
67
+ // 1: the menu will fit, do nothing
68
+ if (viewSpaceBelow >= menuHeight) {
69
+ return {
70
+ placement: 'bottom',
71
+ maxHeight: preferredMaxHeight
72
+ };
73
+ }
74
+
75
+ // 2: the menu will fit, if scrolled
76
+ if (scrollSpaceBelow >= menuHeight && !isFixedPosition) {
77
+ if (shouldScroll) {
78
+ animatedScrollTo(scrollParent, scrollDown, scrollDuration);
79
+ }
80
+ return {
81
+ placement: 'bottom',
82
+ maxHeight: preferredMaxHeight
83
+ };
84
+ }
85
+
86
+ // 3: the menu will fit, if constrained
87
+ if (!isFixedPosition && scrollSpaceBelow >= minHeight || isFixedPosition && viewSpaceBelow >= minHeight) {
88
+ if (shouldScroll) {
89
+ animatedScrollTo(scrollParent, scrollDown, scrollDuration);
90
+ }
91
+
92
+ // we want to provide as much of the menu as possible to the user,
93
+ // so give them whatever is available below rather than the minHeight.
94
+ const constrainedHeight = isFixedPosition ? viewSpaceBelow - marginBottom : scrollSpaceBelow - marginBottom;
95
+ return {
96
+ placement: 'bottom',
97
+ maxHeight: constrainedHeight
98
+ };
99
+ }
100
+
101
+ // 4. Forked beviour when there isn't enough space below
102
+
103
+ // AUTO: flip the menu, render above
104
+ if (preferredPlacement === 'auto' || isFixedPosition) {
105
+ // may need to be constrained after flipping
106
+ let constrainedHeight = preferredMaxHeight;
107
+ const spaceAbove = isFixedPosition ? viewSpaceAbove : scrollSpaceAbove;
108
+ if (spaceAbove >= minHeight) {
109
+ constrainedHeight = Math.min(spaceAbove - marginBottom - controlHeight, preferredMaxHeight);
110
+ }
111
+ return {
112
+ placement: 'top',
113
+ maxHeight: constrainedHeight
114
+ };
115
+ }
116
+
117
+ // BOTTOM: allow browser to increase scrollable area and immediately set scroll
118
+ if (preferredPlacement === 'bottom') {
119
+ if (shouldScroll) {
120
+ scrollTo(scrollParent, scrollDown);
121
+ }
122
+ return {
123
+ placement: 'bottom',
124
+ maxHeight: preferredMaxHeight
125
+ };
126
+ }
127
+ break;
128
+ case 'top':
129
+ // 1: the menu will fit, do nothing
130
+ if (viewSpaceAbove >= menuHeight) {
131
+ return {
132
+ placement: 'top',
133
+ maxHeight: preferredMaxHeight
134
+ };
135
+ }
136
+
137
+ // 2: the menu will fit, if scrolled
138
+ if (scrollSpaceAbove >= menuHeight && !isFixedPosition) {
139
+ if (shouldScroll) {
140
+ animatedScrollTo(scrollParent, scrollUp, scrollDuration);
141
+ }
142
+ return {
143
+ placement: 'top',
144
+ maxHeight: preferredMaxHeight
145
+ };
146
+ }
147
+
148
+ // 3: the menu will fit, if constrained
149
+ if (!isFixedPosition && scrollSpaceAbove >= minHeight || isFixedPosition && viewSpaceAbove >= minHeight) {
150
+ let constrainedHeight = preferredMaxHeight;
151
+
152
+ // we want to provide as much of the menu as possible to the user,
153
+ // so give them whatever is available below rather than the minHeight.
154
+ if (!isFixedPosition && scrollSpaceAbove >= minHeight || isFixedPosition && viewSpaceAbove >= minHeight) {
155
+ constrainedHeight = isFixedPosition ? viewSpaceAbove - marginTop : scrollSpaceAbove - marginTop;
156
+ }
157
+ if (shouldScroll) {
158
+ animatedScrollTo(scrollParent, scrollUp, scrollDuration);
159
+ }
160
+ return {
161
+ placement: 'top',
162
+ maxHeight: constrainedHeight
163
+ };
164
+ }
165
+
166
+ // 4. not enough space, the browser WILL NOT increase scrollable area when
167
+ // absolutely positioned element rendered above the viewport (only below).
168
+ // Flip the menu, render below
169
+ return {
170
+ placement: 'bottom',
171
+ maxHeight: preferredMaxHeight
172
+ };
173
+ default:
174
+ throw new Error(`Invalid placement provided "${preferredPlacement}".`);
175
+ }
176
+ return defaultState;
177
+ }
178
+
179
+ // Menu Component
180
+ // ------------------------------
181
+
182
+ function alignToControl(placement) {
183
+ const placementToCSSProp = {
184
+ bottom: 'top',
185
+ top: 'bottom'
186
+ };
187
+ return placement ? placementToCSSProp[placement] : 'bottom';
188
+ }
189
+ const coercePlacement = p => p === 'auto' ? 'bottom' : p;
190
+ export const menuCSS = ({
191
+ placement,
192
+ theme: {
193
+ borderRadius,
194
+ spacing,
195
+ colors
196
+ }
197
+ }, unstyled) => ({
198
+ label: 'menu',
199
+ [alignToControl(placement)]: '100%',
200
+ position: 'absolute',
201
+ width: '100%',
202
+ zIndex: 1,
203
+ ...(unstyled ? {} : {
204
+ backgroundColor: colors.neutral0,
205
+ borderRadius: borderRadius,
206
+ boxShadow: '0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1)',
207
+ marginBottom: spacing.menuGutter,
208
+ marginTop: spacing.menuGutter
209
+ })
210
+ });
211
+ const PortalPlacementContext = /*#__PURE__*/createContext(null);
212
+
213
+ // NOTE: internal only
214
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
215
+ export const MenuPlacer = props => {
216
+ const {
217
+ children,
218
+ minMenuHeight,
219
+ maxMenuHeight,
220
+ menuPlacement,
221
+ menuPosition,
222
+ menuShouldScrollIntoView,
223
+ theme
224
+ } = props;
225
+ const {
226
+ setPortalPlacement
227
+ } = useContext(PortalPlacementContext) || {};
228
+ const ref = useRef(null);
229
+ const [maxHeight, setMaxHeight] = useState(maxMenuHeight);
230
+ const [placement, setPlacement] = useState(null);
231
+ const {
232
+ controlHeight
233
+ } = theme.spacing;
234
+ useLayoutEffect(() => {
235
+ const menuEl = ref.current;
236
+ if (!menuEl) {
237
+ return;
238
+ }
239
+
240
+ // DO NOT scroll if position is fixed
241
+ const isFixedPosition = menuPosition === 'fixed';
242
+ const shouldScroll = menuShouldScrollIntoView && !isFixedPosition;
243
+ const state = getMenuPlacement({
244
+ maxHeight: maxMenuHeight,
245
+ menuEl,
246
+ minHeight: minMenuHeight,
247
+ placement: menuPlacement,
248
+ shouldScroll,
249
+ isFixedPosition,
250
+ controlHeight
251
+ });
252
+ setMaxHeight(state.maxHeight);
253
+ setPlacement(state.placement);
254
+ setPortalPlacement === null || setPortalPlacement === void 0 ? void 0 : setPortalPlacement(state.placement);
255
+ }, [maxMenuHeight, menuPlacement, menuPosition, menuShouldScrollIntoView, minMenuHeight, setPortalPlacement, controlHeight]);
256
+ return children({
257
+ ref,
258
+ placerProps: {
259
+ ...props,
260
+ placement: placement || coercePlacement(menuPlacement),
261
+ maxHeight
262
+ }
263
+ });
264
+ };
265
+ const Menu = props => {
266
+ const {
267
+ children,
268
+ innerRef,
269
+ innerProps
270
+ } = props;
271
+ return jsx("div", _extends({}, getStyleProps(props, 'menu', {
272
+ menu: true
273
+ }), {
274
+ ref: innerRef
275
+ }, innerProps), children);
276
+ };
277
+
278
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
279
+ export default Menu;
280
+
281
+ // ==============================
282
+ // Menu List
283
+ // ==============================
284
+
285
+ export const menuListCSS = ({
286
+ maxHeight,
287
+ theme: {
288
+ spacing: {
289
+ baseUnit
290
+ }
291
+ }
292
+ }, unstyled) => ({
293
+ maxHeight,
294
+ overflowY: 'auto',
295
+ position: 'relative',
296
+ // required for offset[Height, Top] > keyboard scroll
297
+ WebkitOverflowScrolling: 'touch',
298
+ ...(unstyled ? {} : {
299
+ paddingBottom: baseUnit,
300
+ paddingTop: baseUnit
301
+ })
302
+ });
303
+
304
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
305
+ export const MenuList = props => {
306
+ const {
307
+ children,
308
+ innerProps,
309
+ innerRef,
310
+ isMulti
311
+ } = props;
312
+ return jsx("div", _extends({}, getStyleProps(props, 'menuList', {
313
+ 'menu-list': true,
314
+ 'menu-list--is-multi': isMulti
315
+ }), {
316
+ //@ts-ignore
317
+ ref: innerRef
318
+ }, innerProps), children);
319
+ };
320
+
321
+ // ==============================
322
+ // Menu Notices
323
+ // ==============================
324
+
325
+ const noticeCSS = ({
326
+ theme: {
327
+ spacing: {
328
+ baseUnit
329
+ },
330
+ colors
331
+ }
332
+ }, unstyled) => ({
333
+ textAlign: 'center',
334
+ ...(unstyled ? {} : {
335
+ color: colors.neutral40,
336
+ padding: `${baseUnit * 2}px ${baseUnit * 3}px`
337
+ })
338
+ });
339
+ export const noOptionsMessageCSS = noticeCSS;
340
+ export const loadingMessageCSS = noticeCSS;
341
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
342
+ export const NoOptionsMessage = ({
343
+ children = 'No options',
344
+ innerProps,
345
+ ...restProps
346
+ }) => {
347
+ return (
348
+ //@ts-ignore
349
+ jsx("div", _extends({}, getStyleProps({
350
+ ...restProps,
351
+ children,
352
+ innerProps
353
+ }, 'noOptionsMessage', {
354
+ 'menu-notice': true,
355
+ 'menu-notice--no-options': true
356
+ }), {
357
+ // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
358
+ role: "option"
359
+ }, innerProps), children)
360
+ );
361
+ };
362
+
363
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
364
+ export const LoadingMessage = ({
365
+ children = 'Loading...',
366
+ innerProps,
367
+ ...restProps
368
+ }) => {
369
+ return jsx("div", _extends({}, getStyleProps({
370
+ ...restProps,
371
+ children,
372
+ innerProps
373
+ }, 'loadingMessage', {
374
+ 'menu-notice': true,
375
+ 'menu-notice--loading': true
376
+ }), innerProps), children);
377
+ };
378
+
379
+ // ==============================
380
+ // Menu Portal
381
+ // ==============================
382
+
383
+ export const menuPortalCSS = ({
384
+ rect,
385
+ offset,
386
+ position
387
+ }) => ({
388
+ left: rect.left,
389
+ position: position,
390
+ top: offset,
391
+ width: rect.width,
392
+ zIndex: 1
393
+ });
394
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
395
+ export const MenuPortal = props => {
396
+ const {
397
+ appendTo,
398
+ children,
399
+ controlElement,
400
+ innerProps,
401
+ menuPlacement,
402
+ menuPosition
403
+ } = props;
404
+ const menuPortalRef = useRef(null);
405
+ const cleanupRef = useRef(null);
406
+ const [placement, setPortalPlacement] = useState(coercePlacement(menuPlacement));
407
+ const portalPlacementContext = useMemo(() => ({
408
+ setPortalPlacement
409
+ }), []);
410
+ const [computedPosition, setComputedPosition] = useState(null);
411
+ const updateComputedPosition = useCallback(() => {
412
+ if (!controlElement) {
413
+ return;
414
+ }
415
+ const rect = getBoundingClientObj(controlElement);
416
+ const scrollDistance = menuPosition === 'fixed' ? 0 : window.pageYOffset;
417
+ const offset = rect[placement] + scrollDistance;
418
+ 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)) {
419
+ setComputedPosition({
420
+ offset,
421
+ rect
422
+ });
423
+ }
424
+ }, [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]);
425
+ useLayoutEffect(() => {
426
+ updateComputedPosition();
427
+ }, [updateComputedPosition]);
428
+ const runAutoUpdate = useCallback(() => {
429
+ if (typeof cleanupRef.current === 'function') {
430
+ cleanupRef.current();
431
+ cleanupRef.current = null;
432
+ }
433
+ if (controlElement && menuPortalRef.current) {
434
+ cleanupRef.current = autoUpdate(controlElement, menuPortalRef.current, updateComputedPosition, {
435
+ elementResize: 'ResizeObserver' in window
436
+ });
437
+ }
438
+ }, [controlElement, updateComputedPosition]);
439
+ useLayoutEffect(() => {
440
+ runAutoUpdate();
441
+ }, [runAutoUpdate]);
442
+ const setMenuPortalElement = useCallback(menuPortalElement => {
443
+ menuPortalRef.current = menuPortalElement;
444
+ runAutoUpdate();
445
+ }, [runAutoUpdate]);
446
+
447
+ // bail early if required elements aren't present
448
+ if (!appendTo && menuPosition !== 'fixed' || !computedPosition) {
449
+ return null;
450
+ }
451
+
452
+ // same wrapper element whether fixed or portalled
453
+ const menuWrapper = jsx("div", _extends({
454
+ ref: setMenuPortalElement
455
+ }, getStyleProps({
456
+ ...props,
457
+ offset: computedPosition.offset,
458
+ position: menuPosition,
459
+ rect: computedPosition.rect
460
+ }, 'menuPortal', {
461
+ 'menu-portal': true
462
+ }), innerProps), children);
463
+ return jsx(PortalPlacementContext.Provider, {
464
+ value: portalPlacementContext
465
+ }, appendTo ? /*#__PURE__*/createPortal(menuWrapper, appendTo) : menuWrapper);
466
+ };
@@ -0,0 +1,134 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ /**
3
+ * @jsxRuntime classic
4
+ * @jsx jsx
5
+ */
6
+
7
+ import { jsx } from '@emotion/react';
8
+ import { getStyleProps } from '../utils';
9
+ import { CrossIcon } from './indicators';
10
+ export const multiValueCSS = ({
11
+ theme: {
12
+ spacing,
13
+ borderRadius,
14
+ colors
15
+ }
16
+ }, unstyled) => ({
17
+ label: 'multiValue',
18
+ display: 'flex',
19
+ minWidth: 0,
20
+ // resolves flex/text-overflow bug
21
+ ...(unstyled ? {} : {
22
+ backgroundColor: colors.neutral10,
23
+ borderRadius: borderRadius / 2,
24
+ margin: spacing.baseUnit / 2
25
+ })
26
+ });
27
+ export const multiValueLabelCSS = ({
28
+ theme: {
29
+ borderRadius,
30
+ colors
31
+ },
32
+ cropWithEllipsis
33
+ }, unstyled) => ({
34
+ overflow: 'hidden',
35
+ textOverflow: cropWithEllipsis || cropWithEllipsis === undefined ? 'ellipsis' : undefined,
36
+ whiteSpace: 'nowrap',
37
+ ...(unstyled ? {} : {
38
+ borderRadius: borderRadius / 2,
39
+ color: colors.neutral80,
40
+ fontSize: '85%',
41
+ padding: 3,
42
+ paddingLeft: 6
43
+ })
44
+ });
45
+ export const multiValueRemoveCSS = ({
46
+ theme: {
47
+ spacing,
48
+ borderRadius,
49
+ colors
50
+ },
51
+ isFocused
52
+ }, unstyled) => ({
53
+ alignItems: 'center',
54
+ display: 'flex',
55
+ ...(unstyled ? {} : {
56
+ borderRadius: borderRadius / 2,
57
+ backgroundColor: isFocused ? colors.dangerLight : undefined,
58
+ paddingLeft: spacing.baseUnit,
59
+ paddingRight: spacing.baseUnit,
60
+ ':hover': {
61
+ backgroundColor: colors.dangerLight,
62
+ color: colors.danger
63
+ }
64
+ })
65
+ });
66
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
67
+ export const MultiValueGeneric = ({
68
+ children,
69
+ innerProps
70
+ }) => jsx("div", innerProps, children);
71
+
72
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
73
+ export const MultiValueContainer = MultiValueGeneric;
74
+
75
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
76
+ export const MultiValueLabel = MultiValueGeneric;
77
+ export function MultiValueRemove({
78
+ children,
79
+ innerProps
80
+ }) {
81
+ return jsx("div", _extends({
82
+ role: "button"
83
+ }, innerProps), children || jsx(CrossIcon, {
84
+ size: 14
85
+ }));
86
+ }
87
+ const MultiValue = props => {
88
+ const {
89
+ children,
90
+ components,
91
+ data,
92
+ innerProps,
93
+ isDisabled,
94
+ removeProps,
95
+ selectProps
96
+ } = props;
97
+ const {
98
+ Container,
99
+ Label,
100
+ Remove
101
+ } = components;
102
+ return jsx(Container, {
103
+ data: data,
104
+ innerProps: {
105
+ ...getStyleProps(props, 'multiValue', {
106
+ 'multi-value': true,
107
+ 'multi-value--is-disabled': isDisabled
108
+ }),
109
+ ...innerProps
110
+ },
111
+ selectProps: selectProps
112
+ }, jsx(Label, {
113
+ data: data,
114
+ innerProps: {
115
+ ...getStyleProps(props, 'multiValueLabel', {
116
+ 'multi-value__label': true
117
+ })
118
+ },
119
+ selectProps: selectProps
120
+ }, children), jsx(Remove, {
121
+ data: data,
122
+ innerProps: {
123
+ ...getStyleProps(props, 'multiValueRemove', {
124
+ 'multi-value__remove': true
125
+ }),
126
+ 'aria-label': `Remove ${children || 'option'}`,
127
+ ...removeProps
128
+ },
129
+ selectProps: selectProps
130
+ }));
131
+ };
132
+
133
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
134
+ export default MultiValue;
@@ -0,0 +1,57 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ /**
3
+ * @jsxRuntime classic
4
+ * @jsx jsx
5
+ */
6
+
7
+ import { jsx } from '@emotion/react';
8
+ import { getStyleProps } from '../utils';
9
+ export const optionCSS = ({
10
+ isDisabled,
11
+ isFocused,
12
+ isSelected,
13
+ theme: {
14
+ spacing,
15
+ colors
16
+ }
17
+ }, unstyled) => ({
18
+ label: 'option',
19
+ cursor: 'default',
20
+ display: 'block',
21
+ fontSize: 'inherit',
22
+ width: '100%',
23
+ userSelect: 'none',
24
+ WebkitTapHighlightColor: 'rgba(0, 0, 0, 0)',
25
+ ...(unstyled ? {} : {
26
+ backgroundColor: isSelected ? colors.primary : isFocused ? colors.primary25 : 'transparent',
27
+ color: isDisabled ? colors.neutral20 : isSelected ? colors.neutral0 : 'inherit',
28
+ padding: `${spacing.baseUnit * 2}px ${spacing.baseUnit * 3}px`,
29
+ // provide some affordance on touch devices
30
+ ':active': {
31
+ backgroundColor: !isDisabled ? isSelected ? colors.primary : colors.primary50 : undefined
32
+ }
33
+ })
34
+ });
35
+ const Option = props => {
36
+ const {
37
+ children,
38
+ isDisabled,
39
+ isFocused,
40
+ isSelected,
41
+ innerRef,
42
+ innerProps
43
+ } = props;
44
+ return jsx("div", _extends({}, getStyleProps(props, 'option', {
45
+ option: true,
46
+ 'option--is-disabled': isDisabled,
47
+ 'option--is-focused': isFocused,
48
+ 'option--is-selected': isSelected
49
+ }), {
50
+ //@ts-ignore
51
+ ref: innerRef
52
+ // aria-disabled={isDisabled}
53
+ }, innerProps), children);
54
+ };
55
+
56
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
57
+ export default Option;
@@ -0,0 +1,34 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ /**
3
+ * @jsxRuntime classic
4
+ * @jsx jsx
5
+ */
6
+
7
+ import { jsx } from '@emotion/react';
8
+ import { getStyleProps } from '../utils';
9
+ export const placeholderCSS = ({
10
+ theme: {
11
+ spacing,
12
+ colors
13
+ }
14
+ }, unstyled) => ({
15
+ label: 'placeholder',
16
+ gridArea: '1 / 1 / 2 / 3',
17
+ ...(unstyled ? {} : {
18
+ color: colors.neutral50,
19
+ marginLeft: spacing.baseUnit / 2,
20
+ marginRight: spacing.baseUnit / 2
21
+ })
22
+ });
23
+ const Placeholder = props => {
24
+ const {
25
+ children,
26
+ innerProps
27
+ } = props;
28
+ return jsx("div", _extends({}, getStyleProps(props, 'placeholder', {
29
+ placeholder: true
30
+ }), innerProps), children);
31
+ };
32
+
33
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
34
+ export default Placeholder;