@bookjane2/bookjane-design-library 9.0.31 → 9.0.33
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/BKJEllipsisMenu/BKJEllipsisMenu.d.ts.map +1 -1
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.js +5 -4
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.js.map +1 -1
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.stories.d.ts +2 -0
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.stories.d.ts.map +1 -1
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.stories.js +30 -0
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.stories.js.map +1 -1
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.styled.d.ts +1 -1
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.styled.d.ts.map +1 -1
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.styled.js +6 -1
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.styled.js.map +1 -1
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.test.d.ts +2 -0
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.test.d.ts.map +1 -0
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.test.js +126 -0
- package/lib/components/BKJEllipsisMenu/BKJEllipsisMenu.test.js.map +1 -0
- package/lib/components/BKJPagination/BKJPagination.d.ts.map +1 -1
- package/lib/components/BKJPagination/BKJPagination.js +1 -1
- package/lib/components/BKJPagination/BKJPagination.js.map +1 -1
- package/lib/components/BKJPagination/BKJPagination.styled.d.ts +1 -1
- package/lib/components/BKJPagination/BKJPagination.styled.d.ts.map +1 -1
- package/lib/components/BKJPagination/BKJPagination.styled.js +1 -1
- package/lib/components/BKJPagination/BKJPagination.test.d.ts +2 -0
- package/lib/components/BKJPagination/BKJPagination.test.d.ts.map +1 -0
- package/lib/components/BKJPagination/BKJPagination.test.js +79 -0
- package/lib/components/BKJPagination/BKJPagination.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJEllipsisMenu.d.ts","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAoB,MAAM,OAAO,CAAC;AAQ7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"BKJEllipsisMenu.d.ts","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAoB,MAAM,OAAO,CAAC;AAQ7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAoChE,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,qBAAqB,CAcrD,CAAC"}
|
|
@@ -5,12 +5,13 @@ import { Flex } from '../Flex/index.js';
|
|
|
5
5
|
import { BKJEllipsisMenuUIStateProvider, useBKJEllipsisMenuUIStateContext, } from './BKJEllipsisMenu.context.js';
|
|
6
6
|
import { BKJEllipsisMenuIconWrapper } from './BKJEllipsisMenu.styled.js';
|
|
7
7
|
import { BKJEllipsisMenuDropdown } from './BKJEllipsisMenuDropdown.js';
|
|
8
|
-
const Component = ({ triggerRef, children }) => {
|
|
8
|
+
const Component = ({ triggerRef, ariaLabel, consumerProps, children }) => {
|
|
9
9
|
const { toggleMenu, isOpen } = useBKJEllipsisMenuUIStateContext();
|
|
10
|
-
return (_jsxs(Fragment, { children: [_jsx(BKJEllipsisMenuIconWrapper, { onClick: toggleMenu, children: _jsx(Flex, {
|
|
10
|
+
return (_jsxs(Fragment, { children: [_jsx(BKJEllipsisMenuIconWrapper, { ref: triggerRef, ...consumerProps, type: "button", "aria-label": ariaLabel, "aria-haspopup": "menu", "aria-expanded": isOpen, onClick: toggleMenu, children: _jsx(Flex, { height: "38px", minHeight: "38px", justifyContent: "center", alignItems: "center", children: _jsx(BKJIcon, { iconName: "Ellipsis" }) }) }), isOpen && triggerRef.current && (_jsx(BKJEllipsisMenuDropdown, { triggerRef: triggerRef, children: children }))] }));
|
|
11
11
|
};
|
|
12
|
-
export const BKJEllipsisMenu = ({ children, ...
|
|
12
|
+
export const BKJEllipsisMenu = ({ children, 'aria-label': ariaLabelProp, ...rest }) => {
|
|
13
13
|
const triggerRef = useRef(null);
|
|
14
|
-
|
|
14
|
+
const ariaLabel = ariaLabelProp === undefined ? 'More options' : ariaLabelProp;
|
|
15
|
+
return (_jsx(BKJEllipsisMenuUIStateProvider, { children: _jsx(Component, { triggerRef: triggerRef, ariaLabel: ariaLabel, consumerProps: rest, children: children }) }));
|
|
15
16
|
};
|
|
16
17
|
//# sourceMappingURL=BKJEllipsisMenu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJEllipsisMenu.js","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAM,QAAQ,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,GACjC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"BKJEllipsisMenu.js","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAM,QAAQ,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,GACjC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,SAAS,GAIV,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC1D,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,gCAAgC,EAAE,CAAC;IAClE,OAAO,CACL,MAAC,QAAQ,eACP,KAAC,0BAA0B,IACzB,GAAG,EAAE,UAAiB,KAClB,aAAa,EACjB,IAAI,EAAC,QAAQ,gBACD,SAAS,mBACP,MAAM,mBACL,MAAM,EACrB,OAAO,EAAE,UAAU,YAEnB,KAAC,IAAI,IACH,MAAM,EAAC,MAAM,EACb,SAAS,EAAC,MAAM,EAChB,cAAc,EAAC,QAAQ,EACvB,UAAU,EAAC,QAAQ,YAEnB,KAAC,OAAO,IAAC,QAAQ,EAAC,UAAU,GAAG,GAC1B,GACoB,EAC5B,MAAM,IAAI,UAAU,CAAC,OAAO,IAAI,CAC/B,KAAC,uBAAuB,IAAC,UAAU,EAAE,UAAU,YAAG,QAAQ,GAA2B,CACtF,IACQ,CACZ,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAA8B,CAAC,EACzD,QAAQ,EACR,YAAY,EAAE,aAAa,EAC3B,GAAG,IAAI,EACR,EAAE,EAAE;IACH,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;IAC/E,OAAO,CACL,KAAC,8BAA8B,cAC7B,KAAC,SAAS,IAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,YACzE,QAAQ,GACC,GACmB,CAClC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -6,4 +6,6 @@ declare const _default: {
|
|
|
6
6
|
};
|
|
7
7
|
export default _default;
|
|
8
8
|
export declare const Default: import("@storybook/core/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, IBKJEllipsisMenuProps>;
|
|
9
|
+
export declare const WithCustomLabel: import("@storybook/core/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, IBKJEllipsisMenuProps>;
|
|
10
|
+
export declare const OpenedByDefault: import("@storybook/core/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, IBKJEllipsisMenuProps>;
|
|
9
11
|
//# sourceMappingURL=BKJEllipsisMenu.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJEllipsisMenu.stories.d.ts","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.stories.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BKJEllipsisMenu.stories.d.ts","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.stories.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;;;;;;AAEhE,wBAIE;AAaF,eAAO,MAAM,OAAO,iHAA2B,CAAC;AAehD,eAAO,MAAM,eAAe,iHAA0C,CAAC;AAsBvE,eAAO,MAAM,eAAe,iHAA0C,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { userEvent, within } from '@storybook/test';
|
|
2
3
|
import { BKJMenuItem } from '../BKJMenuItem/index.js';
|
|
3
4
|
import { Flex } from '../Flex/index.js';
|
|
4
5
|
import { BKJEllipsisMenu } from './BKJEllipsisMenu.js';
|
|
@@ -12,4 +13,33 @@ const BKJMenuTemplate = () => {
|
|
|
12
13
|
};
|
|
13
14
|
export const Default = BKJMenuTemplate.bind({});
|
|
14
15
|
Default.args = {};
|
|
16
|
+
const BKJMenuTemplateWithCustomLabel = () => {
|
|
17
|
+
return (_jsx(Flex, { flexDirection: "row-reverse", width: "100%", children: _jsxs(BKJEllipsisMenu, { "aria-label": "Row actions for shift 12345", children: [_jsx(BKJMenuItem, { children: "Export CSV" }), _jsx(BKJMenuItem, { children: "Export XLSX" })] }) }));
|
|
18
|
+
};
|
|
19
|
+
export const WithCustomLabel = BKJMenuTemplateWithCustomLabel.bind({});
|
|
20
|
+
WithCustomLabel.args = {};
|
|
21
|
+
WithCustomLabel.parameters = {
|
|
22
|
+
docs: {
|
|
23
|
+
description: {
|
|
24
|
+
story: 'Renders BKJEllipsisMenu with a consumer-supplied `aria-label`. The default `"More options"` is overridden by the prop value. Use this pattern when the row context (e.g., "Row actions for shift 12345") gives screen-reader users more useful information than a generic label.',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
const BKJMenuTemplateOpenedByDefault = () => {
|
|
29
|
+
return (_jsx(Flex, { flexDirection: "row-reverse", width: "100%", children: _jsxs(BKJEllipsisMenu, { children: [_jsx(BKJMenuItem, { children: "Export CSV" }), _jsx(BKJMenuItem, { children: "Export XLSX" })] }) }));
|
|
30
|
+
};
|
|
31
|
+
export const OpenedByDefault = BKJMenuTemplateOpenedByDefault.bind({});
|
|
32
|
+
OpenedByDefault.args = {};
|
|
33
|
+
OpenedByDefault.play = async ({ canvasElement }) => {
|
|
34
|
+
const canvas = within(canvasElement);
|
|
35
|
+
const trigger = await canvas.findByRole('button', { name: 'More options' });
|
|
36
|
+
await userEvent.click(trigger);
|
|
37
|
+
};
|
|
38
|
+
OpenedByDefault.parameters = {
|
|
39
|
+
docs: {
|
|
40
|
+
description: {
|
|
41
|
+
story: 'Renders BKJEllipsisMenu in the open state via a play function. Use this story to verify the Storybook a11y addon reports zero violations with the menu-popup mounted via Portal. The trigger has `aria-expanded="true"` after the play function fires.',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
};
|
|
15
45
|
//# sourceMappingURL=BKJEllipsisMenu.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJEllipsisMenu.stories.js","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAe;IACb,KAAK,EAAE,gCAAgC;IACvC,SAAS,EAAE,eAAe;IAC1B,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,eAAe,GAAmC,GAAG,EAAE;IAC3D,OAAO,CACL,KAAC,IAAI,IAAC,aAAa,EAAC,aAAa,EAAC,KAAK,EAAC,MAAM,YAC5C,MAAC,eAAe,eACd,KAAC,WAAW,6BAAyB,EACrC,KAAC,WAAW,8BAA0B,IACtB,GACb,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAEhD,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"BKJEllipsisMenu.stories.js","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAe;IACb,KAAK,EAAE,gCAAgC;IACvC,SAAS,EAAE,eAAe;IAC1B,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,eAAe,GAAmC,GAAG,EAAE;IAC3D,OAAO,CACL,KAAC,IAAI,IAAC,aAAa,EAAC,aAAa,EAAC,KAAK,EAAC,MAAM,YAC5C,MAAC,eAAe,eACd,KAAC,WAAW,6BAAyB,EACrC,KAAC,WAAW,8BAA0B,IACtB,GACb,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAEhD,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;AAElB,MAAM,8BAA8B,GAAmC,GAAG,EAAE;IAC1E,OAAO,CACL,KAAC,IAAI,IAAC,aAAa,EAAC,aAAa,EAAC,KAAK,EAAC,MAAM,YAC5C,MAAC,eAAe,kBAAY,6BAA6B,aACvD,KAAC,WAAW,6BAAyB,EACrC,KAAC,WAAW,8BAA0B,IACtB,GACb,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,8BAA8B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvE,eAAe,CAAC,IAAI,GAAG,EAAE,CAAC;AAC1B,eAAe,CAAC,UAAU,GAAG;IAC3B,IAAI,EAAE;QACJ,WAAW,EAAE;YACX,KAAK,EACH,kRAAkR;SACrR;KACF;CACF,CAAC;AAEF,MAAM,8BAA8B,GAAmC,GAAG,EAAE;IAC1E,OAAO,CACL,KAAC,IAAI,IAAC,aAAa,EAAC,aAAa,EAAC,KAAK,EAAC,MAAM,YAC5C,MAAC,eAAe,eACd,KAAC,WAAW,6BAAyB,EACrC,KAAC,WAAW,8BAA0B,IACtB,GACb,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,8BAA8B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvE,eAAe,CAAC,IAAI,GAAG,EAAE,CAAC;AAC1B,eAAe,CAAC,IAAI,GAAG,KAAK,EAAE,EAAE,aAAa,EAAkC,EAAE,EAAE;IACjF,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IAC5E,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC,CAAC;AACF,eAAe,CAAC,UAAU,GAAG;IAC3B,IAAI,EAAE;QACJ,WAAW,EAAE;YACX,KAAK,EACH,wPAAwP;SAC3P;KACF;CACF,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const BKJEllipsisMenuIconWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").
|
|
1
|
+
export declare const BKJEllipsisMenuIconWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, {
|
|
2
2
|
ref?: any;
|
|
3
3
|
}>> & string;
|
|
4
4
|
//# sourceMappingURL=BKJEllipsisMenu.styled.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJEllipsisMenu.styled.d.ts","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.styled.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B;
|
|
1
|
+
{"version":3,"file":"BKJEllipsisMenu.styled.d.ts","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.styled.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B;UAAyB,GAAG;YAgBlE,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import styled from 'styled-components';
|
|
2
|
-
export const BKJEllipsisMenuIconWrapper = styled.
|
|
2
|
+
export const BKJEllipsisMenuIconWrapper = styled.button `
|
|
3
3
|
min-height: 38px;
|
|
4
4
|
height: 38px;
|
|
5
5
|
width: 38px;
|
|
@@ -7,6 +7,11 @@ export const BKJEllipsisMenuIconWrapper = styled.div `
|
|
|
7
7
|
display: flex;
|
|
8
8
|
justify-content: center;
|
|
9
9
|
align-items: center;
|
|
10
|
+
border: none;
|
|
11
|
+
background: none;
|
|
12
|
+
padding: 0;
|
|
13
|
+
font: inherit;
|
|
14
|
+
color: inherit;
|
|
10
15
|
&:hover {
|
|
11
16
|
cursor: pointer;
|
|
12
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJEllipsisMenu.styled.js","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.styled.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"BKJEllipsisMenu.styled.js","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.styled.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,CAAe;;;;;;;;;;;;;;;;CAgBrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BKJEllipsisMenu.test.d.ts","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { 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 { BKJEllipsisMenu } from './BKJEllipsisMenu.js';
|
|
8
|
+
describe('BKJEllipsisMenu trigger structural contract (FR-001 / FR-002)', () => {
|
|
9
|
+
it('renders the trigger as a real <button> element with type="button"', () => {
|
|
10
|
+
renderWithTheme(_jsx(BKJEllipsisMenu, { children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
11
|
+
const trigger = screen.getByRole('button', { name: 'More options' });
|
|
12
|
+
expect(trigger.tagName).toBe('BUTTON');
|
|
13
|
+
expect(trigger).toHaveAttribute('type', 'button');
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
describe('BKJEllipsisMenu trigger keyboard activation (FR-001 / FR-009 (vi)–(vii))', () => {
|
|
17
|
+
it('opens the menu when Enter is pressed on the focused trigger', async () => {
|
|
18
|
+
const user = userEvent.setup();
|
|
19
|
+
renderWithTheme(_jsx(BKJEllipsisMenu, { children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
20
|
+
const trigger = screen.getByRole('button', { name: 'More options' });
|
|
21
|
+
trigger.focus();
|
|
22
|
+
expect(document.activeElement).toBe(trigger);
|
|
23
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
24
|
+
await user.keyboard('{Enter}');
|
|
25
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
26
|
+
});
|
|
27
|
+
it('opens the menu when Space is pressed on the focused trigger', async () => {
|
|
28
|
+
const user = userEvent.setup();
|
|
29
|
+
renderWithTheme(_jsx(BKJEllipsisMenu, { children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
30
|
+
const trigger = screen.getByRole('button', { name: 'More options' });
|
|
31
|
+
trigger.focus();
|
|
32
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
33
|
+
await user.keyboard(' ');
|
|
34
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
35
|
+
});
|
|
36
|
+
it('is reachable via Tab from a sibling element', async () => {
|
|
37
|
+
const user = userEvent.setup();
|
|
38
|
+
renderWithTheme(_jsxs(_Fragment, { children: [_jsx("button", { "data-testid": "sibling", children: "Sibling" }), _jsx(BKJEllipsisMenu, { children: _jsx(BKJMenuItem, { children: "Export CSV" }) })] }));
|
|
39
|
+
const sibling = screen.getByTestId('sibling');
|
|
40
|
+
sibling.focus();
|
|
41
|
+
expect(document.activeElement).toBe(sibling);
|
|
42
|
+
await user.tab();
|
|
43
|
+
const trigger = screen.getByRole('button', { name: 'More options' });
|
|
44
|
+
expect(document.activeElement).toBe(trigger);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('BKJEllipsisMenu accessible-name resolution (FR-003 / FR-004)', () => {
|
|
48
|
+
it('applies aria-label="More options" by default when no prop is supplied', () => {
|
|
49
|
+
renderWithTheme(_jsx(BKJEllipsisMenu, { children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
50
|
+
const trigger = screen.getByRole('button', { name: 'More options' });
|
|
51
|
+
expect(trigger).toHaveAttribute('aria-label', 'More options');
|
|
52
|
+
});
|
|
53
|
+
it('honours consumer-supplied aria-label override', () => {
|
|
54
|
+
renderWithTheme(_jsx(BKJEllipsisMenu, { "aria-label": "Row actions for shift 12345", children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
55
|
+
const trigger = screen.getByRole('button', { name: 'Row actions for shift 12345' });
|
|
56
|
+
expect(trigger).toHaveAttribute('aria-label', 'Row actions for shift 12345');
|
|
57
|
+
});
|
|
58
|
+
it('passes empty-string aria-label through verbatim (does not fall back to default)', () => {
|
|
59
|
+
const { container } = renderWithTheme(_jsx(BKJEllipsisMenu, { "aria-label": "", children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
60
|
+
const trigger = container.querySelector('button');
|
|
61
|
+
expect(trigger).not.toBeNull();
|
|
62
|
+
expect(trigger).toHaveAttribute('aria-label', '');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('BKJEllipsisMenu Ellipsis icon decorative inheritance (WEB-4841 / SC-011)', () => {
|
|
66
|
+
it('renders the inner <svg> with aria-hidden="true" (inherited from BKJIcon default)', () => {
|
|
67
|
+
const { container } = renderWithTheme(_jsx(BKJEllipsisMenu, { children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
68
|
+
const svg = container.querySelector('button svg');
|
|
69
|
+
expect(svg).not.toBeNull();
|
|
70
|
+
expect(svg).toHaveAttribute('aria-hidden', 'true');
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('BKJEllipsisMenu axe-clean accessible-name states (FR-009 axe sweep)', () => {
|
|
74
|
+
it('reports zero axe violations with the default aria-label and the menu closed', async () => {
|
|
75
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(BKJEllipsisMenu, { children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
76
|
+
expect(axeResults).toHaveNoViolations();
|
|
77
|
+
});
|
|
78
|
+
it('reports zero axe violations with a consumer-supplied aria-label and the menu closed', async () => {
|
|
79
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(BKJEllipsisMenu, { "aria-label": "Row actions for shift 12345", children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
80
|
+
expect(axeResults).toHaveNoViolations();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('BKJEllipsisMenu trigger menu-popup state ARIA (FR-002 / Clarification Q4)', () => {
|
|
84
|
+
it('carries aria-haspopup="menu", aria-expanded="false", and NO aria-controls when closed', () => {
|
|
85
|
+
renderWithTheme(_jsx(BKJEllipsisMenu, { children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
86
|
+
const trigger = screen.getByRole('button', { name: 'More options' });
|
|
87
|
+
expect(trigger).toHaveAttribute('aria-haspopup', 'menu');
|
|
88
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
89
|
+
expect(trigger).not.toHaveAttribute('aria-controls');
|
|
90
|
+
});
|
|
91
|
+
it('flips aria-expanded to "true" after the trigger is clicked, and STILL has no aria-controls', async () => {
|
|
92
|
+
const user = userEvent.setup();
|
|
93
|
+
renderWithTheme(_jsx(BKJEllipsisMenu, { children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
94
|
+
const trigger = screen.getByRole('button', { name: 'More options' });
|
|
95
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
96
|
+
await user.click(trigger);
|
|
97
|
+
expect(trigger).toHaveAttribute('aria-haspopup', 'menu');
|
|
98
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
99
|
+
expect(trigger).not.toHaveAttribute('aria-controls');
|
|
100
|
+
});
|
|
101
|
+
it('reports zero axe violations with the menu open (default aria-label)', async () => {
|
|
102
|
+
const user = userEvent.setup();
|
|
103
|
+
const { container } = renderWithTheme(_jsx(BKJEllipsisMenu, { children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
104
|
+
const trigger = screen.getByRole('button', { name: 'More options' });
|
|
105
|
+
await user.click(trigger);
|
|
106
|
+
const axeResults = await axe(container);
|
|
107
|
+
expect(axeResults).toHaveNoViolations();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('BKJEllipsisMenu consumer override exclusion (FR-006)', () => {
|
|
111
|
+
it('silently overrides consumer-supplied type / aria-haspopup / aria-expanded / onClick', async () => {
|
|
112
|
+
const user = userEvent.setup();
|
|
113
|
+
const consumerOnClick = jest.fn();
|
|
114
|
+
const Adversarial = BKJEllipsisMenu;
|
|
115
|
+
renderWithTheme(_jsx(Adversarial, { type: "submit", "aria-haspopup": "dialog", "aria-expanded": true, onClick: consumerOnClick, "aria-label": "Custom", children: _jsx(BKJMenuItem, { children: "Export CSV" }) }));
|
|
116
|
+
const trigger = screen.getByRole('button', { name: 'Custom' });
|
|
117
|
+
expect(trigger).toHaveAttribute('type', 'button');
|
|
118
|
+
expect(trigger).toHaveAttribute('aria-haspopup', 'menu');
|
|
119
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
120
|
+
expect(trigger).toHaveAttribute('aria-label', 'Custom');
|
|
121
|
+
await user.click(trigger);
|
|
122
|
+
expect(consumerOnClick).not.toHaveBeenCalled();
|
|
123
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=BKJEllipsisMenu.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BKJEllipsisMenu.test.js","sourceRoot":"","sources":["../../../src/components/BKJEllipsisMenu/BKJEllipsisMenu.test.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,QAAQ,CAAC,+DAA+D,EAAE,GAAG,EAAE;IAC7E,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,eAAe,CACb,KAAC,eAAe,cACd,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0EAA0E,EAAE,GAAG,EAAE;IACxF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/B,eAAe,CACb,KAAC,eAAe,cACd,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAE1D,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAE/B,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/B,eAAe,CACb,KAAC,eAAe,cACd,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAE1D,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEzB,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/B,eAAe,CACb,8BACE,gCAAoB,SAAS,wBAAiB,EAC9C,KAAC,eAAe,cACd,KAAC,WAAW,6BAAyB,GACrB,IACjB,CACJ,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7C,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QAEjB,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8DAA8D,EAAE,GAAG,EAAE;IAC5E,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,eAAe,CACb,KAAC,eAAe,cACd,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,eAAe,CACb,KAAC,eAAe,kBAAY,6BAA6B,YACvD,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC;QACpF,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,YAAY,EAAE,6BAA6B,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,CACnC,KAAC,eAAe,kBAAY,EAAE,YAC5B,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0EAA0E,EAAE,GAAG,EAAE;IACxF,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,CACnC,KAAC,eAAe,cACd,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qEAAqE,EAAE,GAAG,EAAE;IACnF,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAkB,CAC7C,KAAC,eAAe,cACd,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAkB,CAC7C,KAAC,eAAe,kBAAY,6BAA6B,YACvD,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2EAA2E,EAAE,GAAG,EAAE;IACzF,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC/F,eAAe,CACb,KAAC,eAAe,cACd,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;QAC1G,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/B,eAAe,CACb,KAAC,eAAe,cACd,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAE1D,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE1B,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,CACnC,KAAC,eAAe,cACd,KAAC,WAAW,6BAAyB,GACrB,CACnB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACrE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE1B,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACpE,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,eAA+D,CAAC;QACpF,eAAe,CACb,KAAC,WAAW,IACV,IAAI,EAAC,QAAQ,mBACC,QAAQ,mBACP,IAAI,EACnB,OAAO,EAAE,eAAe,gBACb,QAAQ,YAEnB,KAAC,WAAW,6BAAyB,GACzB,CACf,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE/D,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAExD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1B,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJPagination.d.ts","sourceRoot":"","sources":["../../../src/components/BKJPagination/BKJPagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"BKJPagination.d.ts","sourceRoot":"","sources":["../../../src/components/BKJPagination/BKJPagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA8CvD,CAAC"}
|
|
@@ -2,6 +2,6 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { BKJIcon } from '../BKJIcon/index.js';
|
|
3
3
|
import { BKJPaginationButton, BKJPaginationDisplay, BKJPaginationText, BKJPaginationWrapper, } from './BKJPagination.styled.js';
|
|
4
4
|
export const BKJPagination = ({ disabled = false, pageCount, currentPage = 1, onFirstPage, onLastPage, onNextPage, onPrevPage, }) => {
|
|
5
|
-
return (_jsxs(BKJPaginationWrapper, { children: [_jsx(BKJPaginationButton, { disabled: disabled || currentPage <= 1, onClick: onFirstPage, children: _jsx(BKJIcon, { iconName: "ChevronDoubleLeft" }) }), _jsx(BKJPaginationButton, { disabled: disabled || currentPage <= 1, onClick: onPrevPage, children: _jsx(BKJIcon, { iconName: "ChevronLeft" }) }), _jsx(BKJPaginationDisplay, { children: _jsxs(BKJPaginationText, { children: [currentPage, " of ", pageCount] }) }), _jsx(BKJPaginationButton, { disabled: disabled || currentPage >= pageCount, onClick: onNextPage, children: _jsx(BKJIcon, { iconName: "ChevronRight" }) }), _jsx(BKJPaginationButton, { disabled: disabled || currentPage >= pageCount, onClick: onLastPage, children: _jsx(BKJIcon, { iconName: "ChevronDoubleRight" }) })] }));
|
|
5
|
+
return (_jsxs(BKJPaginationWrapper, { "aria-label": "Pagination", children: [_jsx(BKJPaginationButton, { "aria-label": "First page", disabled: disabled || currentPage <= 1, onClick: onFirstPage, children: _jsx(BKJIcon, { iconName: "ChevronDoubleLeft" }) }), _jsx(BKJPaginationButton, { "aria-label": "Previous page", disabled: disabled || currentPage <= 1, onClick: onPrevPage, children: _jsx(BKJIcon, { iconName: "ChevronLeft" }) }), _jsx(BKJPaginationDisplay, { role: "status", "aria-live": "polite", children: _jsxs(BKJPaginationText, { children: [currentPage, " of ", pageCount] }) }), _jsx(BKJPaginationButton, { "aria-label": "Next page", disabled: disabled || currentPage >= pageCount, onClick: onNextPage, children: _jsx(BKJIcon, { iconName: "ChevronRight" }) }), _jsx(BKJPaginationButton, { "aria-label": "Last page", disabled: disabled || currentPage >= pageCount, onClick: onLastPage, children: _jsx(BKJIcon, { iconName: "ChevronDoubleRight" }) })] }));
|
|
6
6
|
};
|
|
7
7
|
//# sourceMappingURL=BKJPagination.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJPagination.js","sourceRoot":"","sources":["../../../src/components/BKJPagination/BKJPagination.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAGhC,MAAM,CAAC,MAAM,aAAa,GAAkC,CAAC,EAC3D,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,WAAW,GAAG,CAAC,EACf,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,GACX,EAAE,EAAE;IACH,OAAO,CACL,MAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"BKJPagination.js","sourceRoot":"","sources":["../../../src/components/BKJPagination/BKJPagination.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAGhC,MAAM,CAAC,MAAM,aAAa,GAAkC,CAAC,EAC3D,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,WAAW,GAAG,CAAC,EACf,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,GACX,EAAE,EAAE;IACH,OAAO,CACL,MAAC,oBAAoB,kBAAY,YAAY,aAC3C,KAAC,mBAAmB,kBACP,YAAY,EACvB,QAAQ,EAAE,QAAQ,IAAI,WAAW,IAAI,CAAC,EACtC,OAAO,EAAE,WAAW,YAEpB,KAAC,OAAO,IAAC,QAAQ,EAAC,mBAAmB,GAAG,GACpB,EACtB,KAAC,mBAAmB,kBACP,eAAe,EAC1B,QAAQ,EAAE,QAAQ,IAAI,WAAW,IAAI,CAAC,EACtC,OAAO,EAAE,UAAU,YAEnB,KAAC,OAAO,IAAC,QAAQ,EAAC,aAAa,GAAG,GACd,EACtB,KAAC,oBAAoB,IAAC,IAAI,EAAC,QAAQ,eAAW,QAAQ,YACpD,MAAC,iBAAiB,eACf,WAAW,UAAM,SAAS,IACT,GACC,EACvB,KAAC,mBAAmB,kBACP,WAAW,EACtB,QAAQ,EAAE,QAAQ,IAAI,WAAW,IAAI,SAAS,EAC9C,OAAO,EAAE,UAAU,YAEnB,KAAC,OAAO,IAAC,QAAQ,EAAC,cAAc,GAAG,GACf,EACtB,KAAC,mBAAmB,kBACP,WAAW,EACtB,QAAQ,EAAE,QAAQ,IAAI,WAAW,IAAI,SAAS,EAC9C,OAAO,EAAE,UAAU,YAEnB,KAAC,OAAO,IAAC,QAAQ,EAAC,oBAAoB,GAAG,GACrB,IACD,CACxB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const BKJPaginationWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<
|
|
1
|
+
export declare const BKJPaginationWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, never>> & string;
|
|
2
2
|
export declare const BKJPaginationButton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, {
|
|
3
3
|
disabled?: boolean;
|
|
4
4
|
}>> & string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BKJPagination.styled.d.ts","sourceRoot":"","sources":["../../../src/components/BKJPagination/BKJPagination.styled.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"BKJPagination.styled.d.ts","sourceRoot":"","sources":["../../../src/components/BKJPagination/BKJPagination.styled.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,uNAOhC,CAAC;AAEF,eAAO,MAAM,mBAAmB;eAA8B,OAAO;YAsBpE,CAAC;AAEF,eAAO,MAAM,oBAAoB,6NAQhC,CAAC;AAEF,eAAO,MAAM,iBAAiB,yOAM7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BKJPagination.test.d.ts","sourceRoot":"","sources":["../../../src/components/BKJPagination/BKJPagination.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { screen } from '@testing-library/react';
|
|
4
|
+
import userEvent from '@testing-library/user-event';
|
|
5
|
+
import { renderAndCheckA11y, renderWithTheme } from '../../test-utils/index.js';
|
|
6
|
+
import { BKJPagination } from './BKJPagination.js';
|
|
7
|
+
const noop = () => undefined;
|
|
8
|
+
describe('BKJPagination — Accessibility (FR-007)', () => {
|
|
9
|
+
it('a) jest-axe zero violations on default render', async () => {
|
|
10
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(BKJPagination, { pageCount: 10, currentPage: 5, onFirstPage: noop, onPrevPage: noop, onNextPage: noop, onLastPage: noop }));
|
|
11
|
+
expect(axeResults).toHaveNoViolations();
|
|
12
|
+
});
|
|
13
|
+
it('b) outer element is <nav aria-label="Pagination">', () => {
|
|
14
|
+
renderWithTheme(_jsx(BKJPagination, { pageCount: 10, currentPage: 5, onFirstPage: noop, onPrevPage: noop, onNextPage: noop, onLastPage: noop }));
|
|
15
|
+
const nav = screen.getByRole('navigation', { name: 'Pagination' });
|
|
16
|
+
expect(nav.tagName).toBe('NAV');
|
|
17
|
+
});
|
|
18
|
+
it('c) four buttons carry hardcoded English aria-labels', () => {
|
|
19
|
+
renderWithTheme(_jsx(BKJPagination, { pageCount: 10, currentPage: 5, onFirstPage: noop, onPrevPage: noop, onNextPage: noop, onLastPage: noop }));
|
|
20
|
+
const buttons = screen.getAllByRole('button');
|
|
21
|
+
expect(buttons).toHaveLength(4);
|
|
22
|
+
buttons.forEach((b) => expect(b.tagName).toBe('BUTTON'));
|
|
23
|
+
expect(screen.getByRole('button', { name: 'First page' })).toBeInTheDocument();
|
|
24
|
+
expect(screen.getByRole('button', { name: 'Previous page' })).toBeInTheDocument();
|
|
25
|
+
expect(screen.getByRole('button', { name: 'Next page' })).toBeInTheDocument();
|
|
26
|
+
expect(screen.getByRole('button', { name: 'Last page' })).toBeInTheDocument();
|
|
27
|
+
});
|
|
28
|
+
it('d) BKJPaginationDisplay carries role="status" + aria-live="polite"', () => {
|
|
29
|
+
renderWithTheme(_jsx(BKJPagination, { pageCount: 10, currentPage: 5, onFirstPage: noop, onPrevPage: noop, onNextPage: noop, onLastPage: noop }));
|
|
30
|
+
const display = screen.getByRole('status');
|
|
31
|
+
expect(display).toHaveAttribute('aria-live', 'polite');
|
|
32
|
+
});
|
|
33
|
+
it('e) native disabled attribute set on First+Prev at first-page state', () => {
|
|
34
|
+
renderWithTheme(_jsx(BKJPagination, { pageCount: 10, currentPage: 1, onFirstPage: noop, onPrevPage: noop, onNextPage: noop, onLastPage: noop }));
|
|
35
|
+
expect(screen.getByRole('button', { name: 'First page' })).toBeDisabled();
|
|
36
|
+
expect(screen.getByRole('button', { name: 'Previous page' })).toBeDisabled();
|
|
37
|
+
expect(screen.getByRole('button', { name: 'Next page' })).not.toBeDisabled();
|
|
38
|
+
expect(screen.getByRole('button', { name: 'Last page' })).not.toBeDisabled();
|
|
39
|
+
});
|
|
40
|
+
it('f) live-region textContent reads "X of N" and mutates on Next click', async () => {
|
|
41
|
+
const user = userEvent.setup();
|
|
42
|
+
function Stateful() {
|
|
43
|
+
const [page, setPage] = React.useState(5);
|
|
44
|
+
return (_jsx(BKJPagination, { pageCount: 10, currentPage: page, onFirstPage: () => setPage(1), onPrevPage: () => setPage(page - 1), onNextPage: () => setPage(page + 1), onLastPage: () => setPage(10) }));
|
|
45
|
+
}
|
|
46
|
+
renderWithTheme(_jsx(Stateful, {}));
|
|
47
|
+
const display = screen.getByRole('status');
|
|
48
|
+
expect(display).toHaveTextContent('5 of 10');
|
|
49
|
+
await user.click(screen.getByRole('button', { name: 'Next page' }));
|
|
50
|
+
expect(display).toHaveTextContent('6 of 10');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('BKJPagination — Keyboard operability (FR-008)', () => {
|
|
54
|
+
it('Tab traverses First → Prev → Next → Last; Enter and Space activate', async () => {
|
|
55
|
+
const user = userEvent.setup();
|
|
56
|
+
const onFirstPage = jest.fn();
|
|
57
|
+
const onPrevPage = jest.fn();
|
|
58
|
+
const onNextPage = jest.fn();
|
|
59
|
+
const onLastPage = jest.fn();
|
|
60
|
+
renderWithTheme(_jsx(BKJPagination, { pageCount: 10, currentPage: 5, onFirstPage: onFirstPage, onPrevPage: onPrevPage, onNextPage: onNextPage, onLastPage: onLastPage }));
|
|
61
|
+
await user.tab();
|
|
62
|
+
expect(document.activeElement).toBe(screen.getByRole('button', { name: 'First page' }));
|
|
63
|
+
await user.keyboard('{Enter}');
|
|
64
|
+
expect(onFirstPage).toHaveBeenCalledTimes(1);
|
|
65
|
+
await user.tab();
|
|
66
|
+
expect(document.activeElement).toBe(screen.getByRole('button', { name: 'Previous page' }));
|
|
67
|
+
await user.keyboard(' ');
|
|
68
|
+
expect(onPrevPage).toHaveBeenCalledTimes(1);
|
|
69
|
+
await user.tab();
|
|
70
|
+
expect(document.activeElement).toBe(screen.getByRole('button', { name: 'Next page' }));
|
|
71
|
+
await user.keyboard('{Enter}');
|
|
72
|
+
expect(onNextPage).toHaveBeenCalledTimes(1);
|
|
73
|
+
await user.tab();
|
|
74
|
+
expect(document.activeElement).toBe(screen.getByRole('button', { name: 'Last page' }));
|
|
75
|
+
await user.keyboard(' ');
|
|
76
|
+
expect(onLastPage).toHaveBeenCalledTimes(1);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=BKJPagination.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BKJPagination.test.js","sourceRoot":"","sources":["../../../src/components/BKJPagination/BKJPagination.test.tsx"],"names":[],"mappings":"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"}
|