@cerebruminc/cerebellum 17.3.1 → 17.3.2
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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# react-component-lib-boilerplate
|
|
2
2
|
|
|
3
|
+
## [17.3.2](https://github.com/cerebruminc/cerebellum/compare/v17.3.1...v17.3.2) (2026-06-15)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **toggle:** add aria-checked and aria-label to Toggle switch (FRN-3162) ([06a1896](https://github.com/cerebruminc/cerebellum/commit/06a1896e1712b5accfe0d95baccdb7b23af7c75a))
|
|
9
|
+
|
|
3
10
|
## [17.3.1](https://github.com/cerebruminc/cerebellum/compare/v17.3.0...v17.3.1) (2026-06-11)
|
|
4
11
|
|
|
5
12
|
|
package/package.json
CHANGED
|
@@ -20,6 +20,39 @@ describe("Toggle", () => {
|
|
|
20
20
|
});
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
+
test("has aria-checked true when active", () => {
|
|
24
|
+
render(<ThemedToggle active onToggle={jest.fn()} />);
|
|
25
|
+
const toggle = screen.getByRole("switch");
|
|
26
|
+
expect(toggle).toHaveAttribute("aria-checked", "true");
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("has aria-checked false when inactive", () => {
|
|
30
|
+
render(<ThemedToggle active={false} onToggle={jest.fn()} />);
|
|
31
|
+
const toggle = screen.getByRole("switch");
|
|
32
|
+
expect(toggle).toHaveAttribute("aria-checked", "false");
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("sets aria-label when provided", () => {
|
|
36
|
+
render(<ThemedToggle active onToggle={jest.fn()} aria-label="Dark mode" />);
|
|
37
|
+
const toggle = screen.getByRole("switch", { name: "Dark mode" });
|
|
38
|
+
expect(toggle).toBeInTheDocument();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("toggles on Space key press", async () => {
|
|
42
|
+
const mockOnToggle = jest.fn();
|
|
43
|
+
render(<ThemedToggle active onToggle={mockOnToggle} />);
|
|
44
|
+
const toggle = screen.getByRole("switch");
|
|
45
|
+
toggle.focus();
|
|
46
|
+
await userEvent.keyboard(" ");
|
|
47
|
+
expect(mockOnToggle).toHaveBeenCalledTimes(1);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("has aria-disabled true when disabled", () => {
|
|
51
|
+
render(<ThemedToggle active={false} disabled onToggle={jest.fn()} />);
|
|
52
|
+
const toggle = screen.getByRole("switch");
|
|
53
|
+
expect(toggle).toHaveAttribute("aria-disabled", "true");
|
|
54
|
+
});
|
|
55
|
+
|
|
23
56
|
test("renders disabled Toggle", async () => {
|
|
24
57
|
const mockOnClick = jest.fn();
|
|
25
58
|
render(<ThemedToggle active={false} disabled onToggle={mockOnClick} />);
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import React, { FC, KeyboardEvent } from "react";
|
|
2
2
|
|
|
3
|
-
import { pressedEnter } from "../../helpers/accessibility";
|
|
3
|
+
import { pressedEnter, pressedSpacebar } from "../../helpers/accessibility";
|
|
4
4
|
|
|
5
5
|
import { ActiveTrack, Base, ClickPadding, Focus, Knob, KnobColor, TrackBox } from "./ToggleStyles";
|
|
6
6
|
import { ToggleType } from "./types";
|
|
7
7
|
|
|
8
8
|
export const Toggle: FC<ToggleType> = ({
|
|
9
9
|
active,
|
|
10
|
+
"aria-label": ariaLabel,
|
|
10
11
|
clickPadding = 15,
|
|
11
12
|
children,
|
|
12
13
|
disabled,
|
|
@@ -33,8 +34,17 @@ export const Toggle: FC<ToggleType> = ({
|
|
|
33
34
|
onToggle?.(event);
|
|
34
35
|
}
|
|
35
36
|
}}
|
|
37
|
+
onKeyDown={(event: KeyboardEvent<HTMLSpanElement>) => {
|
|
38
|
+
if (!disabled && pressedSpacebar(event)) {
|
|
39
|
+
event.preventDefault();
|
|
40
|
+
onToggle?.(event);
|
|
41
|
+
}
|
|
42
|
+
}}
|
|
36
43
|
$disabled={disabled}
|
|
37
44
|
role="switch"
|
|
45
|
+
aria-checked={active}
|
|
46
|
+
aria-disabled={disabled}
|
|
47
|
+
aria-label={ariaLabel}
|
|
38
48
|
tabIndex={!onToggle || disabled ? -1 : 0}
|
|
39
49
|
>
|
|
40
50
|
<Base disabled={disabled} $knobSize={knobSize} $trackHeight={trackHeight} $width={width}>
|
|
@@ -3,6 +3,8 @@ import { KeyboardEvent, MouseEvent } from "react";
|
|
|
3
3
|
export interface ToggleType {
|
|
4
4
|
/** The current state of the Toggle */
|
|
5
5
|
active: boolean;
|
|
6
|
+
/** Accessible label for the toggle switch. Required when Toggle is used without a visible label or wrapping <label> element. */
|
|
7
|
+
"aria-label"?: string;
|
|
6
8
|
children?: React.ReactNode;
|
|
7
9
|
/** Clickable space added around Toggle, in pixels. Pass `0` to disable */
|
|
8
10
|
clickPadding?: number | string;
|