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

alma-oss / spirit-design-system / 25500013980

07 May 2026 01:50PM UTC coverage: 84.089% (-0.3%) from 84.395%
25500013980

Pull #2631

github

adamkudrna
feat(web,web-react)!: drop `Tag` appearance feature flag #DS-2456

BREAKING CHANGE: The new `Tag` appearance (`inline-flex` layout with explicit
height and inside spacing) is now default. Delete the `$enable-v5-tag-appearance`
Sass variable and the `spirit-feature-enable-v5-tag-appearance` CSS class from
your project — they have no effect. See the Tag: Appearance Feature Flag Removed
sections in the web and web-react package Migration Guides to version 5.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pull Request #2631: feat(web,web-react)!: drop `Tag` appearance feature flag #DS-2456

2274 of 3120 branches covered (72.88%)

Branch coverage included in aggregate %.

7149 of 8086 relevant lines covered (88.41%)

197.08 hits per line

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

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

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

11
const UncontrolledDropdown = (props: UncontrolledDropdownProps) => {
189✔
12
  const {
13
    children,
14
    enableAutoClose = true,
6✔
15
    fullWidthMode,
16
    id,
17
    onAutoClose,
18
    placement,
19
    triggerRef: externalTriggerRef,
20
    ...rest
21
  } = props;
6✔
22
  const { classProps, props: modifiedProps } = useDropdownStyleProps(rest);
6✔
23
  const { styleProps, props: transferProps } = useStyleProps(modifiedProps);
6✔
24
  const { onKeyDown: onUserKeyDown, ...otherProps } = transferProps;
6✔
25

26
  const dropdownRef = useRef<HTMLDivElement>(null);
6✔
27
  const triggerRef = useRef<HTMLElement | null>(null);
6✔
28
  const mergedTriggerRef: MutableRefObject<HTMLElement | null | undefined> = externalTriggerRef ?? triggerRef;
6✔
29

30
  const { isOpen, toggleHandler: onToggle } = useDropdown({
6✔
31
    dropdownRef,
32
    triggerRef: mergedTriggerRef,
33
    enableAutoClose,
34
    onAutoClose,
35
  });
36
  const closeOverlay = useCallback(() => {
6✔
37
    if (!isOpen) {
1!
38
      return;
×
39
    }
40

41
    onToggle();
1✔
42

43
    queueMicrotask(() => {
1✔
44
      mergedTriggerRef.current?.focus();
1✔
45
    });
46
  }, [isOpen, mergedTriggerRef, onToggle]);
47

48
  const { onOverlayKeyDown } = useOverlay({
6✔
49
    isOpen,
50
    overlayRef: dropdownRef,
51
    onClose: closeOverlay,
52
    closeOnInteractOutside: false,
53
  });
54

55
  const handleKeyDown: KeyboardEventHandler<HTMLElement> = useCallback(
6✔
56
    (event) => {
57
      onUserKeyDown?.(event);
2✔
58
      onOverlayKeyDown(event);
2✔
59
    },
60
    [onOverlayKeyDown, onUserKeyDown],
61
  );
62
  const mergedProps = { ...otherProps, onKeyDown: handleKeyDown };
6✔
63

64
  return (
6✔
65
    <DropdownProvider
66
      value={{ id, isOpen, fullWidthMode, placement, onToggle, dropdownRef, triggerRef: mergedTriggerRef }}
67
    >
68
      <div
69
        ref={dropdownRef}
70
        {...styleProps}
71
        {...mergedProps}
72
        className={classNames(classProps.root, styleProps.className)}
73
      >
74
        {children}
75
      </div>
76
    </DropdownProvider>
77
  );
78
};
79

80
UncontrolledDropdown.spiritComponent = 'UncontrolledDropdown';
189✔
81

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

© 2026 Coveralls, Inc