@acusti/dropdown 0.19.0 → 0.21.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.
@@ -15,6 +15,7 @@ export declare type Props = {
15
15
  hasItems?: boolean;
16
16
  isOpenOnMount?: boolean;
17
17
  isSearchable?: boolean;
18
+ keepOpenOnSubmit?: boolean;
18
19
  label?: string;
19
20
  /** Only usable in conjunction with {isSearchable: true}; used as search input’s name */
20
21
  name?: string;
package/dist/Dropdown.js CHANGED
@@ -1,16 +1,16 @@
1
- // TODO add mouseout event handler to check event.target and clear active element
2
- // whenever mouse leaves it
1
+ // TODO fix searching to match on significant parts of value (i.e. not parts that are the same)
2
+ // could also match on ukt-values (see searchable Font Weight example in storybook docs)
3
3
  import InputText from '@acusti/input-text';
4
4
  import { Style } from '@acusti/styling';
5
5
  import useIsOutOfBounds from '@acusti/use-is-out-of-bounds';
6
- import classnames from 'classnames';
6
+ import clsx from 'clsx';
7
7
  import * as React from 'react';
8
8
  import { BODY_CLASS_NAME, BODY_SELECTOR, LABEL_CLASS_NAME, LABEL_TEXT_CLASS_NAME, ROOT_CLASS_NAME, STYLES, TRIGGER_CLASS_NAME, } from './styles.js';
9
9
  import { getActiveItemElement, getItemElements, ITEM_SELECTOR, KEY_EVENT_ELEMENTS, setActiveItem, } from './helpers.js';
10
- const { Children, Fragment, useCallback, useLayoutEffect, useRef, useState } = React;
10
+ const { Children, Fragment, useCallback, useEffect, useRef, useState } = React;
11
11
  const noop = () => { };
12
12
  const CHILDREN_ERROR = '@acusti/dropdown requires either 1 child (the dropdown body) or 2 children: the dropdown trigger and the dropdown body.';
13
- const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems = true, isOpenOnMount, isSearchable, label, name, onClick, onMouseDown, onMouseUp, onSubmitItem, placeholder, tabIndex, value, }) => {
13
+ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems = true, isOpenOnMount, isSearchable, keepOpenOnSubmit = !hasItems, label, name, onClick, onMouseDown, onMouseUp, onSubmitItem, placeholder, tabIndex, value, }) => {
14
14
  const childrenCount = Children.count(children);
15
15
  if (childrenCount !== 1 && childrenCount !== 2) {
16
16
  if (childrenCount === 0) {
@@ -37,14 +37,16 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
37
37
  const isOpenRef = useRef(isOpen);
38
38
  const isOpeningRef = useRef(isOpening);
39
39
  const isTriggerFromPropsRef = useRef(isOpening);
40
+ const keepOpenOnSubmitRef = useRef(keepOpenOnSubmit);
40
41
  const onSubmitItemRef = useRef(onSubmitItem);
41
42
  const valueRef = useRef(value);
42
- useLayoutEffect(() => {
43
+ useEffect(() => {
43
44
  allowEmptyRef.current = allowEmpty;
44
45
  hasItemsRef.current = hasItems;
45
46
  isOpenRef.current = isOpen;
46
47
  isOpeningRef.current = isOpening;
47
48
  isTriggerFromPropsRef.current = isTriggerFromProps;
49
+ keepOpenOnSubmitRef.current = keepOpenOnSubmit;
48
50
  onSubmitItemRef.current = onSubmitItem;
49
51
  valueRef.current = value;
50
52
  }, [
@@ -53,6 +55,7 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
53
55
  isOpen,
54
56
  isOpening,
55
57
  isTriggerFromProps,
58
+ keepOpenOnSubmit,
56
59
  onSubmitItem,
57
60
  value,
58
61
  ]);
@@ -65,12 +68,18 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
65
68
  closingTimerRef.current = null;
66
69
  }
67
70
  }, []);
68
- const handleSubmitItem = useCallback(() => {
71
+ const handleSubmitItem = useCallback((event) => {
69
72
  var _a;
70
- if (isOpenRef.current) {
71
- // A short timeout before closing is better UX when user selects an item so dropdown
72
- // doesn’t close before expected. It also enables using <Link />s in the dropdown body.
73
- closingTimerRef.current = setTimeout(closeDropdown, 90);
73
+ const eventTarget = event.target;
74
+ if (isOpenRef.current && !keepOpenOnSubmitRef.current) {
75
+ const keepOpen = eventTarget.closest('[data-ukt-keep-open]');
76
+ // Don’t close dropdown if event occurs w/in data-ukt-keep-open element
77
+ if (!(keepOpen === null || keepOpen === void 0 ? void 0 : keepOpen.dataset.uktKeepOpen) ||
78
+ keepOpen.dataset.uktKeepOpen === 'false') {
79
+ // A short timeout before closing is better UX when user selects an item so dropdown
80
+ // doesn’t close before expected. It also enables using <Link />s in the dropdown body.
81
+ closingTimerRef.current = setTimeout(closeDropdown, 90);
82
+ }
74
83
  }
75
84
  if (!hasItemsRef.current)
76
85
  return;
@@ -137,6 +146,56 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
137
146
  }
138
147
  }
139
148
  }, []);
149
+ const handleMouseOut = useCallback((event) => {
150
+ if (!hasItemsRef.current)
151
+ return;
152
+ const activeItem = getActiveItemElement(dropdownElementRef.current);
153
+ if (!activeItem)
154
+ return;
155
+ const eventRelatedTarget = event.relatedTarget;
156
+ if (activeItem !== event.target || activeItem.contains(eventRelatedTarget)) {
157
+ return;
158
+ }
159
+ // If user moused out of activeItem (not into a descendant), it’s no longer active
160
+ delete activeItem.dataset.uktActive;
161
+ }, []);
162
+ const handleMouseDown = useCallback((event) => {
163
+ if (onMouseDown)
164
+ onMouseDown(event);
165
+ if (isOpenRef.current)
166
+ return;
167
+ setIsOpen(true);
168
+ setIsOpening(true);
169
+ mouseDownPositionRef.current = {
170
+ clientX: event.clientX,
171
+ clientY: event.clientY,
172
+ };
173
+ isOpeningTimerRef.current = setTimeout(() => {
174
+ setIsOpening(false);
175
+ isOpeningTimerRef.current = null;
176
+ }, 1000);
177
+ }, [onMouseDown]);
178
+ const handleMouseUp = useCallback((event) => {
179
+ if (onMouseUp)
180
+ onMouseUp(event);
181
+ // If dropdown isn’t open or is already closing, do nothing
182
+ if (!isOpenRef.current || closingTimerRef.current)
183
+ return;
184
+ const eventTarget = event.target;
185
+ // If click was outside dropdown body, don’t trigger submit
186
+ if (!eventTarget.closest(BODY_SELECTOR)) {
187
+ // Don’t close dropdown if isOpening or search input is focused
188
+ if (!isOpeningRef.current &&
189
+ inputElementRef.current !== eventTarget.ownerDocument.activeElement) {
190
+ closeDropdown();
191
+ }
192
+ return;
193
+ }
194
+ // If dropdown has no items and click was within dropdown body, do nothing
195
+ if (!hasItemsRef.current)
196
+ return;
197
+ handleSubmitItem(event);
198
+ }, [closeDropdown, handleSubmitItem, onMouseUp]);
140
199
  const cleanupEventListenersRef = useRef(noop);
141
200
  const handleRef = useCallback((ref) => {
142
201
  dropdownElementRef.current = ref;
@@ -153,25 +212,16 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
153
212
  inputElement = ref.firstElementChild.querySelector('input:not([type=radio]):not([type=checkbox]):not([type=range]),textarea');
154
213
  inputElementRef.current = inputElement;
155
214
  }
156
- const handleMouseDown = ({ clientX, clientY, target }) => {
215
+ const handleGlobalMouseDown = ({ target }) => {
157
216
  const eventTarget = target;
158
217
  if (dropdownElementRef.current &&
159
218
  !dropdownElementRef.current.contains(eventTarget)) {
160
219
  // Close dropdown on an outside click
161
220
  closeDropdown();
162
- return;
163
221
  }
164
- if (isOpenRef.current)
165
- return;
166
- setIsOpen(true);
167
- setIsOpening(true);
168
- mouseDownPositionRef.current = { clientX, clientY };
169
- isOpeningTimerRef.current = setTimeout(() => {
170
- setIsOpening(false);
171
- isOpeningTimerRef.current = null;
172
- }, 1000);
173
222
  };
174
- const handleMouseUp = ({ target }) => {
223
+ const handleGlobalMouseUp = ({ target }) => {
224
+ var _a;
175
225
  if (!isOpenRef.current || closingTimerRef.current)
176
226
  return;
177
227
  // If still isOpening (gets set false 1s after open triggers), set it to false onMouseUp
@@ -183,22 +233,13 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
183
233
  }
184
234
  return;
185
235
  }
186
- const isTargetInBody = target.closest(BODY_SELECTOR);
187
- // If mouseup is on dropdown body and there are no items, don’t close the dropdown
188
- if (!hasItemsRef.current && isTargetInBody)
189
- return;
190
- // If mouseup is on an item, trigger submit item, else close the dropdown
191
- if (isTargetInBody) {
192
- handleSubmitItem();
193
- }
194
- else if (!inputElementRef.current ||
195
- (dropdownElementRef.current &&
196
- dropdownElementRef.current.contains(ownerDocument.activeElement))) {
197
- // If dropdown is searchable and ref is still focused, this won’t be invoked
236
+ const eventTarget = target;
237
+ // Only handle mouseup events from outside the dropdown here
238
+ if (!((_a = dropdownElementRef.current) === null || _a === void 0 ? void 0 : _a.contains(eventTarget))) {
198
239
  closeDropdown();
199
240
  }
200
241
  };
201
- const handleKeyDown = (event) => {
242
+ const handleGlobalKeyDown = (event) => {
202
243
  const { altKey, ctrlKey, key, metaKey } = event;
203
244
  const eventTarget = event.target;
204
245
  const dropdownElement = dropdownElementRef.current;
@@ -214,7 +255,7 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
214
255
  // If dropdown is closed, don’t handle key events if event target isn’t within dropdown
215
256
  if (!isEventTargetingDropdown)
216
257
  return;
217
- // Open the dropdown on spacebar, enter, or if isSearchable and user hits the up/down arrows
258
+ // Open the dropdown on spacebar, enter, or if isSearchable and user hits the ↑/↓ arrows
218
259
  if (key === ' ' ||
219
260
  key === 'Enter' ||
220
261
  (hasItemsRef.current &&
@@ -262,7 +303,7 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
262
303
  // If dropdown isOpen, handle submitting the value
263
304
  if (key === 'Enter' || (key === ' ' && !inputElementRef.current)) {
264
305
  onEventHandled();
265
- handleSubmitItem();
306
+ handleSubmitItem(event);
266
307
  return;
267
308
  }
268
309
  // If dropdown isOpen, handle closing it on escape or spacebar if !hasItems
@@ -315,10 +356,10 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
315
356
  }
316
357
  };
317
358
  // Close dropdown if any element is focused outside of this dropdown
318
- const handleFocusIn = (event) => {
359
+ const handleGlobalFocusIn = ({ target }) => {
319
360
  if (!isOpenRef.current)
320
361
  return;
321
- const eventTarget = event.target;
362
+ const eventTarget = target;
322
363
  // If focused element is a descendant or a parent of the dropdown, do nothing
323
364
  if (!dropdownElementRef.current ||
324
365
  dropdownElementRef.current.contains(eventTarget) ||
@@ -327,15 +368,15 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
327
368
  }
328
369
  closeDropdown();
329
370
  };
330
- document.addEventListener('focusin', handleFocusIn);
331
- document.addEventListener('keydown', handleKeyDown);
332
- document.addEventListener('mousedown', handleMouseDown);
333
- document.addEventListener('mouseup', handleMouseUp);
371
+ document.addEventListener('focusin', handleGlobalFocusIn);
372
+ document.addEventListener('keydown', handleGlobalKeyDown);
373
+ document.addEventListener('mousedown', handleGlobalMouseDown);
374
+ document.addEventListener('mouseup', handleGlobalMouseUp);
334
375
  if (ownerDocument !== document) {
335
- ownerDocument.addEventListener('focusin', handleFocusIn);
336
- ownerDocument.addEventListener('keydown', handleKeyDown);
337
- ownerDocument.addEventListener('mousedown', handleMouseDown);
338
- ownerDocument.addEventListener('mouseup', handleMouseUp);
376
+ ownerDocument.addEventListener('focusin', handleGlobalFocusIn);
377
+ ownerDocument.addEventListener('keydown', handleGlobalKeyDown);
378
+ ownerDocument.addEventListener('mousedown', handleGlobalMouseDown);
379
+ ownerDocument.addEventListener('mouseup', handleGlobalMouseUp);
339
380
  }
340
381
  // If dropdown should be open on mount, focus it
341
382
  if (isOpenOnMount) {
@@ -365,15 +406,15 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
365
406
  inputElement.addEventListener('input', handleInput);
366
407
  }
367
408
  cleanupEventListenersRef.current = () => {
368
- document.removeEventListener('focusin', handleFocusIn);
369
- document.removeEventListener('keydown', handleKeyDown);
370
- document.removeEventListener('mousedown', handleMouseDown);
371
- document.removeEventListener('mouseup', handleMouseUp);
409
+ document.removeEventListener('focusin', handleGlobalFocusIn);
410
+ document.removeEventListener('keydown', handleGlobalKeyDown);
411
+ document.removeEventListener('mousedown', handleGlobalMouseDown);
412
+ document.removeEventListener('mouseup', handleGlobalMouseUp);
372
413
  if (ownerDocument !== document) {
373
- ownerDocument.removeEventListener('focusin', handleFocusIn);
374
- ownerDocument.removeEventListener('keydown', handleKeyDown);
375
- ownerDocument.removeEventListener('mousedown', handleMouseDown);
376
- ownerDocument.removeEventListener('mouseup', handleMouseUp);
414
+ ownerDocument.removeEventListener('focusin', handleGlobalFocusIn);
415
+ ownerDocument.removeEventListener('keydown', handleGlobalKeyDown);
416
+ ownerDocument.removeEventListener('mousedown', handleGlobalMouseDown);
417
+ ownerDocument.removeEventListener('mouseup', handleGlobalMouseUp);
377
418
  }
378
419
  if (inputElement) {
379
420
  inputElement.removeEventListener('input', handleInput);
@@ -398,15 +439,15 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
398
439
  }
399
440
  return (React.createElement(Fragment, null,
400
441
  React.createElement(Style, null, STYLES),
401
- React.createElement("div", { className: classnames(ROOT_CLASS_NAME, className, {
442
+ React.createElement("div", { className: clsx(ROOT_CLASS_NAME, className, {
402
443
  disabled,
403
444
  'is-open': isOpen,
404
445
  'is-searchable': isSearchable,
405
- }), onClick: onClick, onMouseDown: onMouseDown, onMouseUp: onMouseUp, onMouseMove: handleMouseMove, onMouseOver: handleMouseOver, ref: handleRef, tabIndex: isSearchable || inputElementRef.current || !isTriggerFromProps
446
+ }), onClick: onClick, onMouseDown: handleMouseDown, onMouseUp: handleMouseUp, onMouseMove: handleMouseMove, onMouseOut: handleMouseOut, onMouseOver: handleMouseOver, ref: handleRef, tabIndex: isSearchable || inputElementRef.current || !isTriggerFromProps
406
447
  ? undefined
407
448
  : 0 },
408
449
  trigger,
409
- isOpen ? (React.createElement("div", { className: classnames(BODY_CLASS_NAME, {
450
+ isOpen ? (React.createElement("div", { className: clsx(BODY_CLASS_NAME, {
410
451
  'calculating-position': !outOfBounds.hasLayout,
411
452
  'has-items': hasItems,
412
453
  'out-of-bounds-bottom': outOfBounds.bottom,
@@ -30,6 +30,7 @@ export type Props = {|
30
30
  hasItems?: boolean,
31
31
  isOpenOnMount?: boolean,
32
32
  isSearchable?: boolean,
33
+ keepOpenOnSubmit?: boolean,
33
34
  label?: string,
34
35
 
35
36
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../src/Dropdown.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../src/Dropdown.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acusti/dropdown",
3
- "version": "0.19.0",
3
+ "version": "0.21.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": "./dist/Dropdown.js",
@@ -22,17 +22,16 @@
22
22
  "homepage": "https://github.com/acusti/uikit/tree/main/packages/dropdown#readme",
23
23
  "devDependencies": {
24
24
  "@types/react": "^18.0.15",
25
- "classnames": "^2",
26
25
  "typescript": "^4.8.4"
27
26
  },
28
27
  "dependencies": {
29
28
  "@acusti/input-text": "^0.11.0",
30
29
  "@acusti/matchmaking": "^0.3.0",
31
30
  "@acusti/styling": "^0.5.3",
32
- "@acusti/use-is-out-of-bounds": "^0.5.0"
31
+ "@acusti/use-is-out-of-bounds": "^0.5.0",
32
+ "clsx": "^1.1.1"
33
33
  },
34
34
  "peerDependencies": {
35
- "classnames": "^2",
36
35
  "react": "^16.8 || ^17 || ^18",
37
36
  "react-dom": "^16.8 || ^17 || ^18"
38
37
  }
package/src/Dropdown.tsx CHANGED
@@ -1,9 +1,9 @@
1
- // TODO add mouseout event handler to check event.target and clear active element
2
- // whenever mouse leaves it
1
+ // TODO fix searching to match on significant parts of value (i.e. not parts that are the same)
2
+ // could also match on ukt-values (see searchable Font Weight example in storybook docs)
3
3
  import InputText from '@acusti/input-text';
4
4
  import { Style } from '@acusti/styling';
5
5
  import useIsOutOfBounds from '@acusti/use-is-out-of-bounds';
6
- import classnames from 'classnames';
6
+ import clsx from 'clsx';
7
7
  import * as React from 'react';
8
8
 
9
9
  import {
@@ -37,6 +37,7 @@ export type Props = {
37
37
  hasItems?: boolean;
38
38
  isOpenOnMount?: boolean;
39
39
  isSearchable?: boolean;
40
+ keepOpenOnSubmit?: boolean;
40
41
  label?: string;
41
42
  /** Only usable in conjunction with {isSearchable: true}; used as search input’s name */
42
43
  name?: string;
@@ -59,7 +60,7 @@ type TimeoutID = ReturnType<typeof setTimeout>;
59
60
 
60
61
  type MousePosition = { clientX: number; clientY: number };
61
62
 
62
- const { Children, Fragment, useCallback, useLayoutEffect, useRef, useState } = React;
63
+ const { Children, Fragment, useCallback, useEffect, useRef, useState } = React;
63
64
 
64
65
  const noop = () => {};
65
66
 
@@ -74,6 +75,7 @@ const Dropdown: React.FC<Props> = ({
74
75
  hasItems = true,
75
76
  isOpenOnMount,
76
77
  isSearchable,
78
+ keepOpenOnSubmit = !hasItems,
77
79
  label,
78
80
  name,
79
81
  onClick,
@@ -115,15 +117,17 @@ const Dropdown: React.FC<Props> = ({
115
117
  const isOpenRef = useRef(isOpen);
116
118
  const isOpeningRef = useRef(isOpening);
117
119
  const isTriggerFromPropsRef = useRef(isOpening);
120
+ const keepOpenOnSubmitRef = useRef(keepOpenOnSubmit);
118
121
  const onSubmitItemRef = useRef(onSubmitItem);
119
122
  const valueRef = useRef(value);
120
123
 
121
- useLayoutEffect(() => {
124
+ useEffect(() => {
122
125
  allowEmptyRef.current = allowEmpty;
123
126
  hasItemsRef.current = hasItems;
124
127
  isOpenRef.current = isOpen;
125
128
  isOpeningRef.current = isOpening;
126
129
  isTriggerFromPropsRef.current = isTriggerFromProps;
130
+ keepOpenOnSubmitRef.current = keepOpenOnSubmit;
127
131
  onSubmitItemRef.current = onSubmitItem;
128
132
  valueRef.current = value;
129
133
  }, [
@@ -132,6 +136,7 @@ const Dropdown: React.FC<Props> = ({
132
136
  isOpen,
133
137
  isOpening,
134
138
  isTriggerFromProps,
139
+ keepOpenOnSubmit,
135
140
  onSubmitItem,
136
141
  value,
137
142
  ]);
@@ -146,43 +151,56 @@ const Dropdown: React.FC<Props> = ({
146
151
  }
147
152
  }, []);
148
153
 
149
- const handleSubmitItem = useCallback(() => {
150
- if (isOpenRef.current) {
151
- // A short timeout before closing is better UX when user selects an item so dropdown
152
- // doesn’t close before expected. It also enables using <Link />s in the dropdown body.
153
- closingTimerRef.current = setTimeout(closeDropdown, 90);
154
- }
154
+ const handleSubmitItem = useCallback(
155
+ (event: Event | React.SyntheticEvent<HTMLElement>) => {
156
+ const eventTarget = event.target as HTMLElement;
157
+ if (isOpenRef.current && !keepOpenOnSubmitRef.current) {
158
+ const keepOpen = eventTarget.closest(
159
+ '[data-ukt-keep-open]',
160
+ ) as HTMLElement | null;
161
+ // Don’t close dropdown if event occurs w/in data-ukt-keep-open element
162
+ if (
163
+ !keepOpen?.dataset.uktKeepOpen ||
164
+ keepOpen.dataset.uktKeepOpen === 'false'
165
+ ) {
166
+ // A short timeout before closing is better UX when user selects an item so dropdown
167
+ // doesn’t close before expected. It also enables using <Link />s in the dropdown body.
168
+ closingTimerRef.current = setTimeout(closeDropdown, 90);
169
+ }
170
+ }
155
171
 
156
- if (!hasItemsRef.current) return;
172
+ if (!hasItemsRef.current) return;
157
173
 
158
- const nextElement = getActiveItemElement(dropdownElementRef.current);
159
- if (!nextElement) {
160
- // If not allowEmpty, don’t allow submitting an empty item
161
- if (!allowEmptyRef.current) return;
162
- // If we have an input element as trigger & the user didn’t clear the text, do nothing
163
- if (inputElementRef.current?.value) return;
164
- }
174
+ const nextElement = getActiveItemElement(dropdownElementRef.current);
175
+ if (!nextElement) {
176
+ // If not allowEmpty, don’t allow submitting an empty item
177
+ if (!allowEmptyRef.current) return;
178
+ // If we have an input element as trigger & the user didn’t clear the text, do nothing
179
+ if (inputElementRef.current?.value) return;
180
+ }
165
181
 
166
- const label = nextElement?.innerText || '';
167
- const nextValue = nextElement?.dataset.uktValue || label;
168
- const nextItem = { element: nextElement, value: nextValue };
169
- if (inputElementRef.current) {
170
- inputElementRef.current.value = label;
171
- if (
172
- inputElementRef.current ===
173
- inputElementRef.current.ownerDocument.activeElement
174
- ) {
175
- inputElementRef.current.blur();
182
+ const label = nextElement?.innerText || '';
183
+ const nextValue = nextElement?.dataset.uktValue || label;
184
+ const nextItem = { element: nextElement, value: nextValue };
185
+ if (inputElementRef.current) {
186
+ inputElementRef.current.value = label;
187
+ if (
188
+ inputElementRef.current ===
189
+ inputElementRef.current.ownerDocument.activeElement
190
+ ) {
191
+ inputElementRef.current.blur();
192
+ }
176
193
  }
177
- }
178
194
 
179
- // If parent is controlling Dropdown via props.value and nextValue is the same, do nothing
180
- if (valueRef.current && valueRef.current === nextValue) return;
195
+ // If parent is controlling Dropdown via props.value and nextValue is the same, do nothing
196
+ if (valueRef.current && valueRef.current === nextValue) return;
181
197
 
182
- if (onSubmitItemRef.current) {
183
- onSubmitItemRef.current(nextItem);
184
- }
185
- }, [closeDropdown]);
198
+ if (onSubmitItemRef.current) {
199
+ onSubmitItemRef.current(nextItem);
200
+ }
201
+ },
202
+ [closeDropdown],
203
+ );
186
204
 
187
205
  const handleMouseMove = useCallback(
188
206
  ({ clientX, clientY }: React.MouseEvent<HTMLElement>) => {
@@ -227,6 +245,64 @@ const Dropdown: React.FC<Props> = ({
227
245
  }
228
246
  }, []);
229
247
 
248
+ const handleMouseOut = useCallback((event: React.MouseEvent<HTMLElement>) => {
249
+ if (!hasItemsRef.current) return;
250
+ const activeItem = getActiveItemElement(dropdownElementRef.current);
251
+ if (!activeItem) return;
252
+ const eventRelatedTarget = event.relatedTarget as HTMLElement;
253
+ if (activeItem !== event.target || activeItem.contains(eventRelatedTarget)) {
254
+ return;
255
+ }
256
+ // If user moused out of activeItem (not into a descendant), it’s no longer active
257
+ delete activeItem.dataset.uktActive;
258
+ }, []);
259
+
260
+ const handleMouseDown = useCallback(
261
+ (event: React.MouseEvent<HTMLElement>) => {
262
+ if (onMouseDown) onMouseDown(event);
263
+ if (isOpenRef.current) return;
264
+
265
+ setIsOpen(true);
266
+ setIsOpening(true);
267
+ mouseDownPositionRef.current = {
268
+ clientX: event.clientX,
269
+ clientY: event.clientY,
270
+ };
271
+ isOpeningTimerRef.current = setTimeout(() => {
272
+ setIsOpening(false);
273
+ isOpeningTimerRef.current = null;
274
+ }, 1000);
275
+ },
276
+ [onMouseDown],
277
+ );
278
+
279
+ const handleMouseUp = useCallback(
280
+ (event: React.MouseEvent<HTMLElement>) => {
281
+ if (onMouseUp) onMouseUp(event);
282
+ // If dropdown isn’t open or is already closing, do nothing
283
+ if (!isOpenRef.current || closingTimerRef.current) return;
284
+
285
+ const eventTarget = event.target as HTMLElement;
286
+ // If click was outside dropdown body, don’t trigger submit
287
+ if (!eventTarget.closest(BODY_SELECTOR)) {
288
+ // Don’t close dropdown if isOpening or search input is focused
289
+ if (
290
+ !isOpeningRef.current &&
291
+ inputElementRef.current !== eventTarget.ownerDocument.activeElement
292
+ ) {
293
+ closeDropdown();
294
+ }
295
+ return;
296
+ }
297
+
298
+ // If dropdown has no items and click was within dropdown body, do nothing
299
+ if (!hasItemsRef.current) return;
300
+
301
+ handleSubmitItem(event);
302
+ },
303
+ [closeDropdown, handleSubmitItem, onMouseUp],
304
+ );
305
+
230
306
  const cleanupEventListenersRef = useRef<() => void>(noop);
231
307
 
232
308
  const handleRef = useCallback(
@@ -249,7 +325,7 @@ const Dropdown: React.FC<Props> = ({
249
325
  inputElementRef.current = inputElement;
250
326
  }
251
327
 
252
- const handleMouseDown = ({ clientX, clientY, target }: MouseEvent) => {
328
+ const handleGlobalMouseDown = ({ target }: MouseEvent) => {
253
329
  const eventTarget = target as HTMLElement;
254
330
  if (
255
331
  dropdownElementRef.current &&
@@ -257,21 +333,10 @@ const Dropdown: React.FC<Props> = ({
257
333
  ) {
258
334
  // Close dropdown on an outside click
259
335
  closeDropdown();
260
- return;
261
336
  }
262
-
263
- if (isOpenRef.current) return;
264
-
265
- setIsOpen(true);
266
- setIsOpening(true);
267
- mouseDownPositionRef.current = { clientX, clientY };
268
- isOpeningTimerRef.current = setTimeout(() => {
269
- setIsOpening(false);
270
- isOpeningTimerRef.current = null;
271
- }, 1000);
272
337
  };
273
338
 
274
- const handleMouseUp = ({ target }: MouseEvent) => {
339
+ const handleGlobalMouseUp = ({ target }: MouseEvent) => {
275
340
  if (!isOpenRef.current || closingTimerRef.current) return;
276
341
 
277
342
  // If still isOpening (gets set false 1s after open triggers), set it to false onMouseUp
@@ -284,25 +349,14 @@ const Dropdown: React.FC<Props> = ({
284
349
  return;
285
350
  }
286
351
 
287
- const isTargetInBody = (target as HTMLElement).closest(BODY_SELECTOR);
288
-
289
- // If mouseup is on dropdown body and there are no items, don’t close the dropdown
290
- if (!hasItemsRef.current && isTargetInBody) return;
291
-
292
- // If mouseup is on an item, trigger submit item, else close the dropdown
293
- if (isTargetInBody) {
294
- handleSubmitItem();
295
- } else if (
296
- !inputElementRef.current ||
297
- (dropdownElementRef.current &&
298
- dropdownElementRef.current.contains(ownerDocument.activeElement))
299
- ) {
300
- // If dropdown is searchable and ref is still focused, this won’t be invoked
352
+ const eventTarget = target as HTMLElement;
353
+ // Only handle mouseup events from outside the dropdown here
354
+ if (!dropdownElementRef.current?.contains(eventTarget)) {
301
355
  closeDropdown();
302
356
  }
303
357
  };
304
358
 
305
- const handleKeyDown = (event: KeyboardEvent) => {
359
+ const handleGlobalKeyDown = (event: KeyboardEvent) => {
306
360
  const { altKey, ctrlKey, key, metaKey } = event;
307
361
  const eventTarget = event.target as HTMLElement;
308
362
  const dropdownElement = dropdownElementRef.current;
@@ -319,7 +373,7 @@ const Dropdown: React.FC<Props> = ({
319
373
  if (!isOpenRef.current) {
320
374
  // If dropdown is closed, don’t handle key events if event target isn’t within dropdown
321
375
  if (!isEventTargetingDropdown) return;
322
- // Open the dropdown on spacebar, enter, or if isSearchable and user hits the up/down arrows
376
+ // Open the dropdown on spacebar, enter, or if isSearchable and user hits the ↑/↓ arrows
323
377
  if (
324
378
  key === ' ' ||
325
379
  key === 'Enter' ||
@@ -376,7 +430,7 @@ const Dropdown: React.FC<Props> = ({
376
430
  // If dropdown isOpen, handle submitting the value
377
431
  if (key === 'Enter' || (key === ' ' && !inputElementRef.current)) {
378
432
  onEventHandled();
379
- handleSubmitItem();
433
+ handleSubmitItem(event);
380
434
  return;
381
435
  }
382
436
  // If dropdown isOpen, handle closing it on escape or spacebar if !hasItems
@@ -432,10 +486,10 @@ const Dropdown: React.FC<Props> = ({
432
486
  };
433
487
 
434
488
  // Close dropdown if any element is focused outside of this dropdown
435
- const handleFocusIn = (event: Event) => {
489
+ const handleGlobalFocusIn = ({ target }: Event) => {
436
490
  if (!isOpenRef.current) return;
437
491
 
438
- const eventTarget = event.target as HTMLElement;
492
+ const eventTarget = target as HTMLElement;
439
493
  // If focused element is a descendant or a parent of the dropdown, do nothing
440
494
  if (
441
495
  !dropdownElementRef.current ||
@@ -448,16 +502,16 @@ const Dropdown: React.FC<Props> = ({
448
502
  closeDropdown();
449
503
  };
450
504
 
451
- document.addEventListener('focusin', handleFocusIn);
452
- document.addEventListener('keydown', handleKeyDown);
453
- document.addEventListener('mousedown', handleMouseDown);
454
- document.addEventListener('mouseup', handleMouseUp);
505
+ document.addEventListener('focusin', handleGlobalFocusIn);
506
+ document.addEventListener('keydown', handleGlobalKeyDown);
507
+ document.addEventListener('mousedown', handleGlobalMouseDown);
508
+ document.addEventListener('mouseup', handleGlobalMouseUp);
455
509
 
456
510
  if (ownerDocument !== document) {
457
- ownerDocument.addEventListener('focusin', handleFocusIn);
458
- ownerDocument.addEventListener('keydown', handleKeyDown);
459
- ownerDocument.addEventListener('mousedown', handleMouseDown);
460
- ownerDocument.addEventListener('mouseup', handleMouseUp);
511
+ ownerDocument.addEventListener('focusin', handleGlobalFocusIn);
512
+ ownerDocument.addEventListener('keydown', handleGlobalKeyDown);
513
+ ownerDocument.addEventListener('mousedown', handleGlobalMouseDown);
514
+ ownerDocument.addEventListener('mouseup', handleGlobalMouseUp);
461
515
  }
462
516
 
463
517
  // If dropdown should be open on mount, focus it
@@ -492,16 +546,16 @@ const Dropdown: React.FC<Props> = ({
492
546
  }
493
547
 
494
548
  cleanupEventListenersRef.current = () => {
495
- document.removeEventListener('focusin', handleFocusIn);
496
- document.removeEventListener('keydown', handleKeyDown);
497
- document.removeEventListener('mousedown', handleMouseDown);
498
- document.removeEventListener('mouseup', handleMouseUp);
549
+ document.removeEventListener('focusin', handleGlobalFocusIn);
550
+ document.removeEventListener('keydown', handleGlobalKeyDown);
551
+ document.removeEventListener('mousedown', handleGlobalMouseDown);
552
+ document.removeEventListener('mouseup', handleGlobalMouseUp);
499
553
 
500
554
  if (ownerDocument !== document) {
501
- ownerDocument.removeEventListener('focusin', handleFocusIn);
502
- ownerDocument.removeEventListener('keydown', handleKeyDown);
503
- ownerDocument.removeEventListener('mousedown', handleMouseDown);
504
- ownerDocument.removeEventListener('mouseup', handleMouseUp);
555
+ ownerDocument.removeEventListener('focusin', handleGlobalFocusIn);
556
+ ownerDocument.removeEventListener('keydown', handleGlobalKeyDown);
557
+ ownerDocument.removeEventListener('mousedown', handleGlobalMouseDown);
558
+ ownerDocument.removeEventListener('mouseup', handleGlobalMouseUp);
505
559
  }
506
560
 
507
561
  if (inputElement) {
@@ -554,15 +608,16 @@ const Dropdown: React.FC<Props> = ({
554
608
  <Fragment>
555
609
  <Style>{STYLES}</Style>
556
610
  <div
557
- className={classnames(ROOT_CLASS_NAME, className, {
611
+ className={clsx(ROOT_CLASS_NAME, className, {
558
612
  disabled,
559
613
  'is-open': isOpen,
560
614
  'is-searchable': isSearchable,
561
615
  })}
562
616
  onClick={onClick}
563
- onMouseDown={onMouseDown}
564
- onMouseUp={onMouseUp}
617
+ onMouseDown={handleMouseDown}
618
+ onMouseUp={handleMouseUp}
565
619
  onMouseMove={handleMouseMove}
620
+ onMouseOut={handleMouseOut}
566
621
  onMouseOver={handleMouseOver}
567
622
  ref={handleRef}
568
623
  tabIndex={
@@ -574,7 +629,7 @@ const Dropdown: React.FC<Props> = ({
574
629
  {trigger}
575
630
  {isOpen ? (
576
631
  <div
577
- className={classnames(BODY_CLASS_NAME, {
632
+ className={clsx(BODY_CLASS_NAME, {
578
633
  'calculating-position': !outOfBounds.hasLayout,
579
634
  'has-items': hasItems,
580
635
  'out-of-bounds-bottom': outOfBounds.bottom,