import type { AnchorHTMLAttributes, ReactNode } from "react"; import { forwardRef, useCallback } from "react"; import cn from "classnames"; import { bem } from "@react-md/utils"; import { Link } from "./Link"; export interface SkipToMainContentProps extends AnchorHTMLAttributes { /** * An id to use for the link. */ id?: string; /** * The id to use for the `
` content that should be focused once this * link is clicked. */ mainId: string; /** * The children to display once the link has been keyboard focused. */ children?: ReactNode; /** * Boolean if the skip to main content link should be unstyled so that you can * provide your own styles. This is just helpful if you are using this * component in a multiple places and don't want to keep overriding the * default styles each time. * * Note: there will still be the "base" link styles, font size, and z-index. * The `$rmd-link-skip-styles` and `$rmd-link-skip-active-styles` will not be * applied. */ unstyled?: boolean; } const block = bem("rmd-link-skip"); /** * This component allows you to create a screen-reader only/keyboard focusable * only link that allows a user to skip to the main content of the page. This is * extremely useful when you have a lot of navigation items that must be tabbed * through before the main content can be focused and this component should * normally be the first focusable element on your page. */ export const SkipToMainContent = forwardRef< HTMLAnchorElement, SkipToMainContentProps >(function SkipToMainContent( { id = "skip-to-main-content", children = "Skip to main content", unstyled = false, mainId, className, onClick, ...props }, ref ) { const handleClick = useCallback( (event: React.MouseEvent) => { if (onClick) { onClick(event); } event.preventDefault(); const main = document.getElementById(mainId); if (!main) { if (process.env.NODE_ENV !== "production") { /* eslint-disable no-console */ const foundMain = document.querySelector("main"); const foundMainId = foundMain && foundMain.id; console.error( `Unable to find a main element to focus with an id of: "${mainId}".` ); if (foundMainId) { console.error( `However, a "
" element was found with an id: "${foundMainId}". Should this be the "mainId" prop for the "SkipToMainContent" component?` ); } } return; } main.focus(); }, [mainId, onClick] ); return ( {children} ); });