@bookjane2/bookjane-design-library 9.0.37 → 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/lib/components/BKJToastMessage/BKJToastMessage.js +2 -2
- package/lib/components/BKJToastMessage/BKJToastMessage.js.map +1 -1
- package/lib/components/BKJToastMessage/BKJToastMessage.stories.d.ts +2 -0
- package/lib/components/BKJToastMessage/BKJToastMessage.stories.d.ts.map +1 -1
- package/lib/components/BKJToastMessage/BKJToastMessage.stories.js +30 -0
- package/lib/components/BKJToastMessage/BKJToastMessage.stories.js.map +1 -1
- package/lib/components/BKJToastMessage/BKJToastMessage.test.d.ts +2 -0
- package/lib/components/BKJToastMessage/BKJToastMessage.test.d.ts.map +1 -0
- package/lib/components/BKJToastMessage/BKJToastMessage.test.js +54 -0
- package/lib/components/BKJToastMessage/BKJToastMessage.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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"}
|
|
@@ -4,9 +4,9 @@ import { getIcon } from './BKJToastMessage.utils.js';
|
|
|
4
4
|
export function BKJToastMessage({ message, variant }) {
|
|
5
5
|
const Icon = getIcon(variant);
|
|
6
6
|
if (typeof message === 'string') {
|
|
7
|
-
return (_jsxs(ToastWrapper, { children: [_jsx(ToastIconWrapper, { variant: variant, children: _jsx(Icon, {}) }), _jsx(BKJToastTextWrapper, { children: _jsx(BKJToastText, { children: message }) })] }));
|
|
7
|
+
return (_jsxs(ToastWrapper, { children: [_jsx(ToastIconWrapper, { variant: variant, "aria-hidden": "true", "data-testid": "bkj-toast-icon", children: _jsx(Icon, {}) }), _jsx(BKJToastTextWrapper, { children: _jsx(BKJToastText, { children: message }) })] }));
|
|
8
8
|
}
|
|
9
9
|
const Component = message;
|
|
10
|
-
return (_jsxs(ToastWrapper, { children: [_jsx(ToastIconWrapper, { variant: variant, children: _jsx(Icon, {}) }), _jsx(BKJToastTextWrapper, { children: _jsx(BKJToastText, { children: _jsx(Component, {}) }) })] }));
|
|
10
|
+
return (_jsxs(ToastWrapper, { children: [_jsx(ToastIconWrapper, { variant: variant, "aria-hidden": "true", "data-testid": "bkj-toast-icon", children: _jsx(Icon, {}) }), _jsx(BKJToastTextWrapper, { children: _jsx(BKJToastText, { children: _jsx(Component, {}) }) })] }));
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=BKJToastMessage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJToastMessage.js","sourceRoot":"","sources":["../../../src/components/BKJToastMessage/BKJToastMessage.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,YAAY,GACb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGlD,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,EAAoB;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,CACL,MAAC,YAAY,eACX,KAAC,gBAAgB,IAAC,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"BKJToastMessage.js","sourceRoot":"","sources":["../../../src/components/BKJToastMessage/BKJToastMessage.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,YAAY,GACb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGlD,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,EAAoB;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,CACL,MAAC,YAAY,eACX,KAAC,gBAAgB,IAAC,OAAO,EAAE,OAAO,iBAAc,MAAM,iBAAa,gBAAgB,YACjF,KAAC,IAAI,KAAG,GACS,EACnB,KAAC,mBAAmB,cAClB,KAAC,YAAY,cAAE,OAAO,GAAgB,GAClB,IACT,CAChB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAa,CAAC;IAChC,OAAO,CACL,MAAC,YAAY,eACX,KAAC,gBAAgB,IAAC,OAAO,EAAE,OAAO,iBAAc,MAAM,iBAAa,gBAAgB,YACjF,KAAC,IAAI,KAAG,GACS,EACnB,KAAC,mBAAmB,cAClB,KAAC,YAAY,cACX,KAAC,SAAS,KAAG,GACA,GACK,IACT,CAChB,CAAC;AACJ,CAAC"}
|
|
@@ -23,5 +23,7 @@ declare const setup: {
|
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
25
|
export declare const Default: import("@storybook/core/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, IBKJToastMessage>;
|
|
26
|
+
export declare const Warning: import("@storybook/core/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, IBKJToastMessage>;
|
|
27
|
+
export declare const Error: import("@storybook/core/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, IBKJToastMessage>;
|
|
26
28
|
export default setup;
|
|
27
29
|
//# sourceMappingURL=BKJToastMessage.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJToastMessage.stories.d.ts","sourceRoot":"","sources":["../../../src/components/BKJToastMessage/BKJToastMessage.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,QAAA,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;CAqBV,CAAC;AAIF,eAAO,MAAM,OAAO,4GAAoB,CAAC;AAOzC,eAAe,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"BKJToastMessage.stories.d.ts","sourceRoot":"","sources":["../../../src/components/BKJToastMessage/BKJToastMessage.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,QAAA,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;CAqBV,CAAC;AAIF,eAAO,MAAM,OAAO,4GAAoB,CAAC;AAOzC,eAAO,MAAM,OAAO,4GAAoB,CAAC;AAiBzC,eAAO,MAAM,KAAK,4GAAoB,CAAC;AAiBvC,eAAe,KAAK,CAAC"}
|
|
@@ -29,5 +29,35 @@ Default.args = {
|
|
|
29
29
|
message: 'shift saved successfully.',
|
|
30
30
|
variant: 'Success',
|
|
31
31
|
};
|
|
32
|
+
export const Warning = Template.bind({});
|
|
33
|
+
Warning.args = {
|
|
34
|
+
message: 'Heads up — your changes are unsaved.',
|
|
35
|
+
variant: 'Warning',
|
|
36
|
+
};
|
|
37
|
+
Warning.parameters = {
|
|
38
|
+
docs: {
|
|
39
|
+
description: {
|
|
40
|
+
story: 'The variant icon (warning triangle) is decorative and hidden from assistive technology via `aria-hidden`. ' +
|
|
41
|
+
"The variant's meaning MUST be carried by the consumer-supplied `message` text — for example: " +
|
|
42
|
+
'"Warning: Unsaved changes." or "Heads up — your changes are unsaved." ' +
|
|
43
|
+
'Do NOT rely on the icon shape or background color alone to convey the variant meaning to a screen-reader user.',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
export const Error = Template.bind({});
|
|
48
|
+
Error.args = {
|
|
49
|
+
message: 'Error: shift could not be saved.',
|
|
50
|
+
variant: 'Error',
|
|
51
|
+
};
|
|
52
|
+
Error.parameters = {
|
|
53
|
+
docs: {
|
|
54
|
+
description: {
|
|
55
|
+
story: 'The variant icon (red disc with exclamation mark) is decorative and hidden from assistive technology via `aria-hidden`. ' +
|
|
56
|
+
"The variant's meaning MUST be carried by the consumer-supplied `message` text — for example: " +
|
|
57
|
+
'"Error: shift could not be saved." ' +
|
|
58
|
+
'Do NOT rely on the icon shape or background color alone to convey the variant meaning to a screen-reader user.',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
};
|
|
32
62
|
export default setup;
|
|
33
63
|
//# sourceMappingURL=BKJToastMessage.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJToastMessage.stories.js","sourceRoot":"","sources":["../../../src/components/BKJToastMessage/BKJToastMessage.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,MAAM,KAAK,GAAG;IACZ,KAAK,EAAE,wBAAwB;IAC/B,SAAS,EAAE,eAAe;IAC1B,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;aACb;SACF;QACD,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;aACb;SACF;QACD,OAAO,EAAE;YACP,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;YACxC,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;aACf;SACF;KACF;CACF,CAAC;AAEF,MAAM,QAAQ,GAA8B,CAAC,IAAI,EAAE,EAAE,CAAC,KAAC,eAAe,OAAK,IAAI,GAAI,CAAC;AAEpF,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzC,OAAO,CAAC,IAAI,GAAG;IACb,sCAAsC;IACtC,OAAO,EAAE,2BAA2B;IACpC,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"BKJToastMessage.stories.js","sourceRoot":"","sources":["../../../src/components/BKJToastMessage/BKJToastMessage.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,MAAM,KAAK,GAAG;IACZ,KAAK,EAAE,wBAAwB;IAC/B,SAAS,EAAE,eAAe;IAC1B,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;aACb;SACF;QACD,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;aACb;SACF;QACD,OAAO,EAAE;YACP,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;YACxC,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;aACf;SACF;KACF;CACF,CAAC;AAEF,MAAM,QAAQ,GAA8B,CAAC,IAAI,EAAE,EAAE,CAAC,KAAC,eAAe,OAAK,IAAI,GAAI,CAAC;AAEpF,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzC,OAAO,CAAC,IAAI,GAAG;IACb,sCAAsC;IACtC,OAAO,EAAE,2BAA2B;IACpC,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzC,OAAO,CAAC,IAAI,GAAG;IACb,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,SAAS;CACnB,CAAC;AACF,OAAO,CAAC,UAAU,GAAG;IACnB,IAAI,EAAE;QACJ,WAAW,EAAE;YACX,KAAK,EACH,4GAA4G;gBAC5G,+FAA+F;gBAC/F,wEAAwE;gBACxE,gHAAgH;SACnH;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvC,KAAK,CAAC,IAAI,GAAG;IACX,OAAO,EAAE,kCAAkC;IAC3C,OAAO,EAAE,OAAO;CACjB,CAAC;AACF,KAAK,CAAC,UAAU,GAAG;IACjB,IAAI,EAAE;QACJ,WAAW,EAAE;YACX,KAAK,EACH,0HAA0H;gBAC1H,+FAA+F;gBAC/F,qCAAqC;gBACrC,gHAAgH;SACnH;KACF;CACF,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BKJToastMessage.test.d.ts","sourceRoot":"","sources":["../../../src/components/BKJToastMessage/BKJToastMessage.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { screen } from '@testing-library/react';
|
|
3
|
+
import { renderAndCheckA11y, renderWithTheme } from '../../test-utils/index.js';
|
|
4
|
+
import { BKJToastMessage } from './BKJToastMessage.js';
|
|
5
|
+
describe('BKJToastMessage / Accessibility', () => {
|
|
6
|
+
it('has no accessibility violations on the Success variant render', async () => {
|
|
7
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(BKJToastMessage, { variant: "Success", message: "Shift saved successfully." }));
|
|
8
|
+
expect(axeResults).toHaveNoViolations();
|
|
9
|
+
});
|
|
10
|
+
it('has no accessibility violations on the Warning variant render', async () => {
|
|
11
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(BKJToastMessage, { variant: "Warning", message: "Heads up \u2014 your changes are unsaved." }));
|
|
12
|
+
expect(axeResults).toHaveNoViolations();
|
|
13
|
+
});
|
|
14
|
+
it('has no accessibility violations on the Error variant render', async () => {
|
|
15
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(BKJToastMessage, { variant: "Error", message: "Error: shift could not be saved." }));
|
|
16
|
+
expect(axeResults).toHaveNoViolations();
|
|
17
|
+
});
|
|
18
|
+
it('has no accessibility violations on the custom-FC message branch', async () => {
|
|
19
|
+
const CustomMessage = () => _jsx("span", { children: "Shift saved." });
|
|
20
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(BKJToastMessage, { variant: "Success", message: CustomMessage }));
|
|
21
|
+
expect(axeResults).toHaveNoViolations();
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe('BKJToastMessage / Decorative icon hiding', () => {
|
|
25
|
+
it.each(['Success', 'Warning', 'Error'])('icon-wrapper carries aria-hidden="true" on the %s variant', (variant) => {
|
|
26
|
+
renderWithTheme(_jsx(BKJToastMessage, { variant: variant, message: "Shift saved successfully." }));
|
|
27
|
+
const iconWrapper = screen.getByTestId('bkj-toast-icon');
|
|
28
|
+
expect(iconWrapper).toHaveAttribute('aria-hidden', 'true');
|
|
29
|
+
});
|
|
30
|
+
it('message text is NOT inside an aria-hidden subtree (string-message branch)', () => {
|
|
31
|
+
renderWithTheme(_jsx(BKJToastMessage, { variant: "Success", message: "Shift saved successfully." }));
|
|
32
|
+
const messageEl = screen.getByText('Shift saved successfully.');
|
|
33
|
+
let cursor = messageEl;
|
|
34
|
+
while (cursor && cursor !== document.body) {
|
|
35
|
+
expect(cursor).not.toHaveAttribute('aria-hidden', 'true');
|
|
36
|
+
cursor = cursor.parentElement;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
it('message text renders queryable output AND icon stays hidden on the custom-FC branch', () => {
|
|
40
|
+
const CustomMessage = () => _jsx("span", { children: "Shift saved." });
|
|
41
|
+
renderWithTheme(_jsx(BKJToastMessage, { variant: "Success", message: CustomMessage }));
|
|
42
|
+
expect(screen.getByText('Shift saved.')).toBeInTheDocument();
|
|
43
|
+
expect(screen.getByTestId('bkj-toast-icon')).toHaveAttribute('aria-hidden', 'true');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('BKJToastMessage / Live-region boundary (defensive)', () => {
|
|
47
|
+
it.each(['Success', 'Warning', 'Error'])('no element on the %s variant carries role="alert", role="status", or aria-live', (variant) => {
|
|
48
|
+
const { container } = renderWithTheme(_jsx(BKJToastMessage, { variant: variant, message: "Shift saved successfully." }));
|
|
49
|
+
expect(screen.queryAllByRole('alert')).toHaveLength(0);
|
|
50
|
+
expect(screen.queryAllByRole('status')).toHaveLength(0);
|
|
51
|
+
expect(container.querySelectorAll('[aria-live]')).toHaveLength(0);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=BKJToastMessage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BKJToastMessage.test.js","sourceRoot":"","sources":["../../../src/components/BKJToastMessage/BKJToastMessage.test.tsx"],"names":[],"mappings":"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"}
|