@bookjane2/bookjane-design-library 9.0.32 → 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.
@@ -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;AAyBhE,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,qBAAqB,CASrD,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, { ref: triggerRef, height: "38px", minHeight: "38px", justifyContent: "center", alignItems: "center", children: _jsx(BKJIcon, { iconName: "Ellipsis" }) }) }), isOpen && triggerRef.current && (_jsx(BKJEllipsisMenuDropdown, { triggerRef: triggerRef, children: children }))] }));
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, ...props }) => {
12
+ export const BKJEllipsisMenu = ({ children, 'aria-label': ariaLabelProp, ...rest }) => {
13
13
  const triggerRef = useRef(null);
14
- return (_jsx(BKJEllipsisMenuUIStateProvider, { children: _jsx(Component, { ...props, triggerRef: triggerRef, children: children }) }));
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,GAA6B,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;IACvE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,gCAAgC,EAAE,CAAC;IAClE,OAAO,CACL,MAAC,QAAQ,eACP,KAAC,0BAA0B,IAAC,OAAO,EAAE,UAAU,YAC7C,KAAC,IAAI,IACH,GAAG,EAAE,UAAiB,EACtB,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,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IACnF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,CACL,KAAC,8BAA8B,cAC7B,KAAC,SAAS,OAAK,KAAK,EAAE,UAAU,EAAE,UAAU,YACzC,QAAQ,GACC,GACmB,CAClC,CAAC;AACJ,CAAC,CAAC"}
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":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;;;;;;AAEhE,wBAIE;AAaF,eAAO,MAAM,OAAO,iHAA2B,CAAC"}
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").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
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;UAAsB,GAAG;YAW/D,CAAC"}
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.div `
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,GAAG,CAAe;;;;;;;;;;;CAWlE,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=BKJEllipsisMenu.test.d.ts.map
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bookjane2/bookjane-design-library",
3
- "version": "9.0.32",
3
+ "version": "9.0.33",
4
4
  "main": "./lib/index.js",
5
5
  "typings": "./lib/index.d.ts",
6
6
  "engines": {