• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

alma-oss / spirit-design-system / 28939730421

08 Jul 2026 11:07AM UTC coverage: 86.38% (+1.8%) from 84.534%
28939730421

push

github

dlouhak
test(repo): update E2E tests

2710 of 3624 branches covered (74.78%)

Branch coverage included in aggregate %.

7412 of 8094 relevant lines covered (91.57%)

221.25 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

80.0
/packages/web-react/src/components/Dropdown/Dropdown.tsx
1
'use client';
2

3
import classNames from 'classnames';
171✔
4
import React, { type KeyboardEventHandler, type MutableRefObject, useCallback, useRef } from 'react';
171✔
5
import { useOverlay, useStyleProps } from '../../hooks';
171✔
6
import { type SpiritDropdownProps } from '../../types';
7
import { DropdownProvider } from './DropdownContext';
171✔
8
import { useDropdownStyleProps } from './useDropdownStyleProps';
171✔
9

10
const Dropdown = (props: SpiritDropdownProps) => {
171✔
11
  const {
12
    children,
13
    enableAutoClose = true,
176✔
14
    fullWidthMode,
15
    id,
16
    isOpen = false,
5✔
17
    onAutoClose,
18
    onToggle,
19
    placement,
20
    triggerRef: externalTriggerRef,
21
    ...rest
22
  } = props;
176✔
23
  const { classProps, props: modifiedProps } = useDropdownStyleProps({ isOpen, ...rest });
176✔
24
  const { styleProps, props: transferProps } = useStyleProps(modifiedProps);
176✔
25
  const { onKeyDown: onUserKeyDown, ...otherProps } = transferProps;
176✔
26

27
  const dropdownRef = useRef<HTMLDivElement>(null);
176✔
28
  const internalTriggerRef = useRef<HTMLElement | null>(null);
176✔
29
  const triggerRef: MutableRefObject<HTMLElement | null | undefined> = externalTriggerRef ?? internalTriggerRef;
176✔
30

31
  const closeOverlay = useCallback(() => {
176✔
32
    if (!isOpen) {
1!
33
      return;
×
34
    }
35

36
    onToggle();
1✔
37

38
    queueMicrotask(() => {
1✔
39
      triggerRef.current?.focus();
1✔
40
    });
41
  }, [isOpen, onToggle, triggerRef]);
42

43
  const closeOverlayFromOutside = useCallback(
176✔
44
    (event: Event) => {
45
      if (!isOpen) {
×
46
        return;
×
47
      }
48

49
      onAutoClose?.(event);
×
50
      onToggle();
×
51
    },
52
    [isOpen, onAutoClose, onToggle],
53
  );
54

55
  const { onOverlayKeyDown } = useOverlay({
176✔
56
    isOpen,
57
    overlayRef: dropdownRef,
58
    onClose: closeOverlay,
59
    closeOnInteractOutside: enableAutoClose,
60
    onCloseOnInteractOutside: closeOverlayFromOutside,
61
  });
62

63
  const handleKeyDown: KeyboardEventHandler<HTMLElement> = useCallback(
176✔
64
    (event) => {
65
      onUserKeyDown?.(event);
7✔
66
      onOverlayKeyDown(event);
7✔
67
    },
68
    [onOverlayKeyDown, onUserKeyDown],
69
  );
70
  const mergedProps = { ...otherProps, onKeyDown: handleKeyDown };
176✔
71

72
  return (
176✔
73
    <DropdownProvider value={{ id, isOpen, fullWidthMode, placement, onToggle, dropdownRef, triggerRef }}>
74
      <div
75
        ref={dropdownRef}
76
        className={classNames(classProps.root, styleProps.className)}
77
        style={styleProps.style}
78
        {...mergedProps}
79
      >
80
        {children}
81
      </div>
82
    </DropdownProvider>
83
  );
84
};
85

86
Dropdown.spiritComponent = 'Dropdown';
171✔
87

88
export default Dropdown;
175✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc