import type { HTMLAttributes } from "react"; import { forwardRef } from "react"; import cn from "classnames"; import { TextIconSpacing } from "@react-md/icon"; import type { InteractionStatesOptions } from "@react-md/states"; import { useInteractionStates } from "@react-md/states"; import { bem, useKeyboardFocusableElement } from "@react-md/utils"; import type { TabConfig } from "./types"; export interface TabProps extends TabConfig, HTMLAttributes, Omit, "disableSpacebarClick"> { /** * The id for the tab. This is required for a11y and linking the `TabPanel` to * a specific tab. */ id: string; /** * Boolean if the tab is currently active. Only one tab should be active at a * time. */ active: boolean; /** * The id for the `TabPanel` that the `Tab` controls. This is really just used * to create an `aria-controls` attribute on the `Tab` itself, but Googling * this results in some "interesting" results showing `aria-controls` doesn't * really do much so this prop can be omitted. * * In addition, if you are using dynamically rendered tab panels, this value * should only be provided when the tab becomes active as the `id` will not * exist in the DOM until then and will be invalid. */ panelId?: string; } const block = bem("rmd-tab"); /** * The `Tab` is a low-level component that just renders an accessible tab widget * along with some general styles and an optional icon. */ export const Tab = forwardRef(function Tab( { className: propClassName, contentStyle, contentClassName, disabled = false, icon, stacked = false, iconAfter = false, children, active, panelId, disableRipple, disableProgrammaticRipple, rippleTimeout, rippleClassNames, rippleClassName, rippleContainerClassName, enablePressedAndRipple, ...props }, ref ) { const { ripples, className, handlers } = useInteractionStates({ handlers: props, className: propClassName, disabled, disableRipple, disableProgrammaticRipple, rippleTimeout, rippleClassNames, rippleClassName, rippleContainerClassName, enablePressedAndRipple, }); const refCallback = useKeyboardFocusableElement(ref); return ( ); });