Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 24 additions & 2 deletions src/calendar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,18 @@ import YearDropdown from "./year_dropdown";
import type { ClickOutsideHandler } from "./click_outside_wrapper";
import type { Day } from "date-fns";

const visuallyHiddenStyle: React.CSSProperties = {
position: "absolute",
width: "1px",
height: "1px",
padding: 0,
margin: "-1px",
overflow: "hidden",
clipPath: "inset(50%)",
whiteSpace: "nowrap",
border: 0,
};

interface YearDropdownProps extends React.ComponentPropsWithoutRef<
typeof YearDropdown
> {}
Expand Down Expand Up @@ -517,7 +529,12 @@ export default class Calendar extends Component<CalendarProps, CalendarState> {
className={`react-datepicker__day-name ${disabled ? "react-datepicker__day-name--disabled" : ""}`}
role="columnheader"
>
<span className="react-datepicker__sr-only">Week number</span>
<span
className="react-datepicker__sr-only"
style={visuallyHiddenStyle}
>
Week number
</span>
<span aria-hidden="true">{this.props.weekLabel || "#"}</span>
</div>,
);
Expand Down Expand Up @@ -568,7 +585,12 @@ export default class Calendar extends Component<CalendarProps, CalendarState> {
disabled ? "react-datepicker__day-name--disabled" : "",
)}
>
<span className="react-datepicker__sr-only">{fullDayName}</span>
<span
className="react-datepicker__sr-only"
style={visuallyHiddenStyle}
>
{fullDayName}
</span>
<span aria-hidden="true">{weekDayName}</span>
</div>
);
Expand Down
29 changes: 29 additions & 0 deletions src/test/calendar_test.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2446,6 +2446,35 @@ describe("Calendar", () => {
});
});

it("should keep sr-only day name and week number spans visually hidden via inline styles", () => {
const { container } = render(
<Calendar
dateFormat={DATE_FORMAT}
onSelect={() => {}}
onClickOutside={() => {}}
dropdownMode="scroll"
showWeekNumbers
/>,
);

const srOnlySpans = container.querySelectorAll(
".react-datepicker__day-name > span.react-datepicker__sr-only",
);
expect(srOnlySpans).toHaveLength(8);

srOnlySpans.forEach((span) => {
const { style } = span as HTMLElement;
expect(style.position).toBe("absolute");
expect(style.width).toBe("1px");
expect(style.height).toBe("1px");
expect(style.padding).toBe("0px");
expect(style.margin).toBe("-1px");
expect(style.overflow).toBe("hidden");
expect(style.clipPath).toBe("inset(50%)");
expect(style.whiteSpace).toBe("nowrap");
});
});

it("should have a next-button with the provided aria-label for year", () => {
const ariaLabel = "A label in my native language for next year";
const { container } = render(
Expand Down
Loading