@bookjane2/bookjane-design-library 9.0.38 → 9.0.39
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.
- package/lib/components/BKJDropdownMenu/BKJDropdownMenu.d.ts.map +1 -1
- package/lib/components/BKJDropdownMenu/BKJDropdownMenu.js +34 -3
- package/lib/components/BKJDropdownMenu/BKJDropdownMenu.js.map +1 -1
- package/lib/components/BKJDropdownMenu/BKJDropdownMenu.test.d.ts +2 -0
- package/lib/components/BKJDropdownMenu/BKJDropdownMenu.test.d.ts.map +1 -0
- package/lib/components/BKJDropdownMenu/BKJDropdownMenu.test.js +162 -0
- package/lib/components/BKJDropdownMenu/BKJDropdownMenu.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJDropdownMenu.d.ts","sourceRoot":"","sources":["../../../src/components/BKJDropdownMenu/BKJDropdownMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAKvE,OAAO,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"BKJDropdownMenu.d.ts","sourceRoot":"","sources":["../../../src/components/BKJDropdownMenu/BKJDropdownMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAKvE,OAAO,EAAE,EAAE,EAA8E,MAAM,OAAO,CAAC;AAKvG,MAAM,MAAM,qBAAqB,GAAG,eAAe,GAAG;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,qBAAqB,CA2JrD,CAAC"}
|
|
@@ -12,6 +12,9 @@ export const BKJDropdownMenu = ({ children, label, listRightLeftOffset = 0, ...b
|
|
|
12
12
|
const [isOpen, setOpen] = useState(false);
|
|
13
13
|
const buttonRef = useRef();
|
|
14
14
|
const dropdownRef = useRef();
|
|
15
|
+
const triggerRef = useRef(null);
|
|
16
|
+
const wrapperRef = useRef(null);
|
|
17
|
+
const shouldFocusFirstOnOpen = useRef(false);
|
|
15
18
|
const [buttonElement, setButtonElement] = useState();
|
|
16
19
|
const [dropdownElement, setDropdownElement] = useState();
|
|
17
20
|
const [targetElement, setTargetElement] = useState(getDesignLibraryElementNode('dropdown-root'));
|
|
@@ -22,6 +25,25 @@ export const BKJDropdownMenu = ({ children, label, listRightLeftOffset = 0, ...b
|
|
|
22
25
|
}
|
|
23
26
|
}
|
|
24
27
|
}, []);
|
|
28
|
+
const handleTriggerKeyDown = (event) => {
|
|
29
|
+
buttonProps.onKeyDown?.(event);
|
|
30
|
+
if (event.defaultPrevented)
|
|
31
|
+
return;
|
|
32
|
+
if ((event.key === 'Enter' || event.key === ' ') && !isOpen) {
|
|
33
|
+
shouldFocusFirstOnOpen.current = true;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const handleWrapperKeyDown = (event) => {
|
|
37
|
+
if (event.key === 'Escape') {
|
|
38
|
+
event.preventDefault();
|
|
39
|
+
setOpen(false);
|
|
40
|
+
triggerRef.current?.focus();
|
|
41
|
+
}
|
|
42
|
+
else if (event.key === 'Enter' || event.key === ' ') {
|
|
43
|
+
setOpen(false);
|
|
44
|
+
triggerRef.current?.focus();
|
|
45
|
+
}
|
|
46
|
+
};
|
|
25
47
|
useClickOutside([buttonRef && buttonRef.current, dropdownRef && dropdownRef.current, dropdownElement], handleClose);
|
|
26
48
|
useMouseOutside([buttonRef && buttonRef.current, dropdownRef && dropdownRef.current, dropdownElement], handleClose);
|
|
27
49
|
useEffect(() => {
|
|
@@ -33,6 +55,15 @@ export const BKJDropdownMenu = ({ children, label, listRightLeftOffset = 0, ...b
|
|
|
33
55
|
}
|
|
34
56
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
35
57
|
}, []);
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
if (isOpen && shouldFocusFirstOnOpen.current) {
|
|
60
|
+
wrapperRef.current?.firstElementChild?.focus();
|
|
61
|
+
shouldFocusFirstOnOpen.current = false;
|
|
62
|
+
}
|
|
63
|
+
else if (!isOpen) {
|
|
64
|
+
shouldFocusFirstOnOpen.current = false;
|
|
65
|
+
}
|
|
66
|
+
}, [isOpen]);
|
|
36
67
|
const modifiers = useMemo(() => {
|
|
37
68
|
return [
|
|
38
69
|
{
|
|
@@ -74,9 +105,9 @@ export const BKJDropdownMenu = ({ children, label, listRightLeftOffset = 0, ...b
|
|
|
74
105
|
style: popperStyles,
|
|
75
106
|
...attributes['popper'],
|
|
76
107
|
}), [attributes, popperStyles]);
|
|
77
|
-
return (_jsxs(Fragment, { children: [_jsxs(BKJButton, { ...buttonProps, ref: mergeRefs([buttonRef, setButtonElement]), onMouseOver: () => setOpen(true), onClick: (e) => {
|
|
108
|
+
return (_jsxs(Fragment, { children: [_jsxs(BKJButton, { "aria-expanded": isOpen, ...buttonProps, ref: mergeRefs([buttonRef, setButtonElement, triggerRef]), onKeyDown: handleTriggerKeyDown, onMouseOver: () => setOpen(true), onClick: (e) => {
|
|
78
109
|
buttonProps.onClick && buttonProps.onClick(e);
|
|
79
|
-
setOpen(
|
|
80
|
-
}, children: [_jsx("div", { children: label }), _jsx(BKJIcon, { color: "White", iconName: isOpen ? 'ArrowUp' : 'ArrowDown' })] }), isOpen && targetElement && (_jsx(Portal, { targetElement: targetElement, children: _jsx(BKJDropdownMenuWrapper, { role: "menu", "aria-label": "Menu", ...popperProps, ref: mergeRefs([dropdownRef, setDropdownElement]), onClick: () => setOpen(false), children: children }) }))] }));
|
|
110
|
+
setOpen((prev) => !prev);
|
|
111
|
+
}, children: [_jsx("div", { children: label }), _jsx(BKJIcon, { color: "White", iconName: isOpen ? 'ArrowUp' : 'ArrowDown' })] }), isOpen && targetElement && (_jsx(Portal, { targetElement: targetElement, children: _jsx(BKJDropdownMenuWrapper, { role: "menu", "aria-label": "Menu", ...popperProps, ref: mergeRefs([dropdownRef, setDropdownElement, wrapperRef]), onKeyDown: handleWrapperKeyDown, onClick: () => setOpen(false), children: children }) }))] }));
|
|
81
112
|
};
|
|
82
113
|
//# sourceMappingURL=BKJDropdownMenu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJDropdownMenu.js","sourceRoot":"","sources":["../../../src/components/BKJDropdownMenu/BKJDropdownMenu.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,wDAAwD,CAAC;AACrG,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"BKJDropdownMenu.js","sourceRoot":"","sources":["../../../src/components/BKJDropdownMenu/BKJDropdownMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BKJDropdownMenu.test.d.ts","sourceRoot":"","sources":["../../../src/components/BKJDropdownMenu/BKJDropdownMenu.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { fireEvent, screen } from '@testing-library/react';
|
|
3
|
+
import userEvent from '@testing-library/user-event';
|
|
4
|
+
import { axe } from 'jest-axe';
|
|
5
|
+
import { renderAndCheckA11y, renderWithTheme } from '../../test-utils/index.js';
|
|
6
|
+
import { BKJMenuItem } from '../BKJMenuItem/index.js';
|
|
7
|
+
import { BKJDropdownMenu } from './BKJDropdownMenu.js';
|
|
8
|
+
const renderMenu = (menuItemOnClicks) => renderWithTheme(_jsxs(BKJDropdownMenu, { width: "207px", variant: "PurpleSolid", label: "Invite Members", children: [_jsx(BKJMenuItem, { onClick: menuItemOnClicks?.[0], children: "Invite via Text Message" }), _jsx(BKJMenuItem, { onClick: menuItemOnClicks?.[1], children: "Invite via Email" }), _jsx(BKJMenuItem, { onClick: menuItemOnClicks?.[2], children: "Import via Spreadsheet" })] }));
|
|
9
|
+
const openMenuViaKeyboard = async (user) => {
|
|
10
|
+
const trigger = screen.getByRole('button', { name: 'Invite Members' });
|
|
11
|
+
trigger.focus();
|
|
12
|
+
await user.keyboard('{Enter}');
|
|
13
|
+
return trigger;
|
|
14
|
+
};
|
|
15
|
+
describe('BKJDropdownMenu axe sweeps (FR-010)', () => {
|
|
16
|
+
it('has no axe violations when closed', async () => {
|
|
17
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(BKJDropdownMenu, { width: "207px", variant: "PurpleSolid", label: "X", children: _jsx(BKJMenuItem, { children: "One" }) }));
|
|
18
|
+
expect(axeResults).toHaveNoViolations();
|
|
19
|
+
});
|
|
20
|
+
it('has no axe violations when open', async () => {
|
|
21
|
+
const user = userEvent.setup();
|
|
22
|
+
const { container } = renderWithTheme(_jsxs(BKJDropdownMenu, { width: "207px", variant: "PurpleSolid", label: "X", children: [_jsx(BKJMenuItem, { children: "One" }), _jsx(BKJMenuItem, { children: "Two" })] }));
|
|
23
|
+
const trigger = screen.getByRole('button', { name: 'X' });
|
|
24
|
+
trigger.focus();
|
|
25
|
+
await user.keyboard('{Enter}');
|
|
26
|
+
expect(screen.getByRole('menu')).toBeInTheDocument();
|
|
27
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('BKJDropdownMenu trigger ARIA (FR-004)', () => {
|
|
31
|
+
it('trigger has aria-expanded="false" when closed', () => {
|
|
32
|
+
renderMenu();
|
|
33
|
+
const trigger = screen.getByRole('button', { name: 'Invite Members' });
|
|
34
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
35
|
+
});
|
|
36
|
+
it('trigger has aria-expanded="true" when open', async () => {
|
|
37
|
+
const user = userEvent.setup();
|
|
38
|
+
renderMenu();
|
|
39
|
+
const trigger = await openMenuViaKeyboard(user);
|
|
40
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
41
|
+
});
|
|
42
|
+
it('trigger reverts to aria-expanded="false" after closing via Escape', async () => {
|
|
43
|
+
const user = userEvent.setup();
|
|
44
|
+
renderMenu();
|
|
45
|
+
const trigger = await openMenuViaKeyboard(user);
|
|
46
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
47
|
+
await user.keyboard('{Escape}');
|
|
48
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('BKJDropdownMenu keyboard open + focus shift (FR-002 / FR-008 trim)', () => {
|
|
52
|
+
it('opens menu and focuses first menuitem on Enter when trigger focused', async () => {
|
|
53
|
+
const user = userEvent.setup();
|
|
54
|
+
renderMenu();
|
|
55
|
+
const trigger = screen.getByRole('button', { name: 'Invite Members' });
|
|
56
|
+
trigger.focus();
|
|
57
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
58
|
+
await user.keyboard('{Enter}');
|
|
59
|
+
expect(screen.getByRole('menu')).toBeInTheDocument();
|
|
60
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
61
|
+
expect(document.activeElement).toBe(screen.getByRole('menuitem', { name: 'Invite via Text Message' }));
|
|
62
|
+
});
|
|
63
|
+
it('opens menu and focuses first menuitem on Space when trigger focused', async () => {
|
|
64
|
+
const user = userEvent.setup();
|
|
65
|
+
renderMenu();
|
|
66
|
+
const trigger = screen.getByRole('button', { name: 'Invite Members' });
|
|
67
|
+
trigger.focus();
|
|
68
|
+
await user.keyboard(' ');
|
|
69
|
+
expect(screen.getByRole('menu')).toBeInTheDocument();
|
|
70
|
+
expect(document.activeElement).toBe(screen.getByRole('menuitem', { name: 'Invite via Text Message' }));
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('BKJDropdownMenu Escape close + focus restore (FR-007 Escape branch)', () => {
|
|
74
|
+
it('Escape closes the menu and restores focus to the trigger', async () => {
|
|
75
|
+
const user = userEvent.setup();
|
|
76
|
+
renderMenu();
|
|
77
|
+
const trigger = await openMenuViaKeyboard(user);
|
|
78
|
+
const items = screen.getAllByRole('menuitem');
|
|
79
|
+
items[1].focus();
|
|
80
|
+
expect(document.activeElement).toBe(items[1]);
|
|
81
|
+
await user.keyboard('{Escape}');
|
|
82
|
+
expect(screen.queryByRole('menu')).not.toBeInTheDocument();
|
|
83
|
+
expect(document.activeElement).toBe(trigger);
|
|
84
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('BKJDropdownMenu Enter/Space activation (FR-007 Enter/Space close branch)', () => {
|
|
88
|
+
it('Enter on focused menuitem fires consumer onClick, closes menu, restores focus', async () => {
|
|
89
|
+
const user = userEvent.setup();
|
|
90
|
+
const onClick = jest.fn();
|
|
91
|
+
renderMenu([undefined, onClick, undefined]);
|
|
92
|
+
const trigger = await openMenuViaKeyboard(user);
|
|
93
|
+
const items = screen.getAllByRole('menuitem');
|
|
94
|
+
items[1].focus();
|
|
95
|
+
await user.keyboard('{Enter}');
|
|
96
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
97
|
+
expect(screen.queryByRole('menu')).not.toBeInTheDocument();
|
|
98
|
+
expect(document.activeElement).toBe(trigger);
|
|
99
|
+
});
|
|
100
|
+
it('Space on focused menuitem fires consumer onClick, closes menu, restores focus', async () => {
|
|
101
|
+
const user = userEvent.setup();
|
|
102
|
+
const onClick = jest.fn();
|
|
103
|
+
renderMenu([undefined, onClick, undefined]);
|
|
104
|
+
const trigger = await openMenuViaKeyboard(user);
|
|
105
|
+
const items = screen.getAllByRole('menuitem');
|
|
106
|
+
items[1].focus();
|
|
107
|
+
await user.keyboard(' ');
|
|
108
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
109
|
+
expect(screen.queryByRole('menu')).not.toBeInTheDocument();
|
|
110
|
+
expect(document.activeElement).toBe(trigger);
|
|
111
|
+
});
|
|
112
|
+
it('mouse click on menuitem closes menu without shifting focus to trigger (Q2)', async () => {
|
|
113
|
+
const user = userEvent.setup();
|
|
114
|
+
const onClick = jest.fn();
|
|
115
|
+
renderMenu([undefined, onClick, undefined]);
|
|
116
|
+
const trigger = await openMenuViaKeyboard(user);
|
|
117
|
+
const items = screen.getAllByRole('menuitem');
|
|
118
|
+
fireEvent.click(items[1]);
|
|
119
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
120
|
+
expect(screen.queryByRole('menu')).not.toBeInTheDocument();
|
|
121
|
+
expect(document.activeElement).not.toBe(trigger);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('BKJDropdownMenu existing UX preserved (FR-014)', () => {
|
|
125
|
+
it('mouseover on trigger opens the menu', () => {
|
|
126
|
+
renderMenu();
|
|
127
|
+
const trigger = screen.getByRole('button', { name: 'Invite Members' });
|
|
128
|
+
fireEvent.mouseOver(trigger);
|
|
129
|
+
expect(screen.getByRole('menu')).toBeInTheDocument();
|
|
130
|
+
});
|
|
131
|
+
it('click after mouseover toggles the menu closed (existing mouse UX)', () => {
|
|
132
|
+
renderMenu();
|
|
133
|
+
const trigger = screen.getByRole('button', { name: 'Invite Members' });
|
|
134
|
+
fireEvent.mouseOver(trigger);
|
|
135
|
+
expect(screen.getByRole('menu')).toBeInTheDocument();
|
|
136
|
+
fireEvent.click(trigger);
|
|
137
|
+
expect(screen.queryByRole('menu')).not.toBeInTheDocument();
|
|
138
|
+
});
|
|
139
|
+
it('keyboard click on focused trigger toggles menu open and closed', async () => {
|
|
140
|
+
const user = userEvent.setup();
|
|
141
|
+
renderMenu();
|
|
142
|
+
const trigger = screen.getByRole('button', { name: 'Invite Members' });
|
|
143
|
+
trigger.focus();
|
|
144
|
+
await user.keyboard('{Enter}');
|
|
145
|
+
expect(screen.getByRole('menu')).toBeInTheDocument();
|
|
146
|
+
await user.keyboard('{Escape}');
|
|
147
|
+
expect(screen.queryByRole('menu')).not.toBeInTheDocument();
|
|
148
|
+
});
|
|
149
|
+
it('trigger button has type="button" attribute', () => {
|
|
150
|
+
renderMenu();
|
|
151
|
+
const trigger = screen.getByRole('button', { name: 'Invite Members' });
|
|
152
|
+
expect(trigger).toHaveAttribute('type', 'button');
|
|
153
|
+
});
|
|
154
|
+
it('wrapper carries role="menu" and aria-label="Menu" when open', async () => {
|
|
155
|
+
const user = userEvent.setup();
|
|
156
|
+
renderMenu();
|
|
157
|
+
await openMenuViaKeyboard(user);
|
|
158
|
+
const wrapper = screen.getByRole('menu');
|
|
159
|
+
expect(wrapper).toHaveAttribute('aria-label', 'Menu');
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=BKJDropdownMenu.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BKJDropdownMenu.test.js","sourceRoot":"","sources":["../../../src/components/BKJDropdownMenu/BKJDropdownMenu.test.tsx"],"names":[],"mappings":"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"}
|