"use client";
import {
type AnchorHTMLAttributes,
type ButtonHTMLAttributes,
type ReactElement,
type ReactNode,
} from "react";
import { type ComponentWithRippleProps } from "../interaction/types.js";
import { useElementInteraction } from "../interaction/useElementInteraction.js";
import { useHigherContrastChildren } from "../interaction/useHigherContrastChildren.js";
import { type CustomLinkComponent } from "../link/Link.js";
import { useKeyboardMovementContext } from "../movement/useKeyboardMovementProvider.js";
import { useEnsuredId } from "../useEnsuredId.js";
import { type BaseTabClassNameOptions, tab } from "./tabStyles.js";
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { type useTabs } from "./useTabs.js";
/**
* @since 6.0.0
*/
export interface BaseTabProps
extends ComponentWithRippleProps, BaseTabClassNameOptions {
/**
* Set this to `true` if the tab is currently active.
*
* This is normally provided by the {@link useTabs} hook.
*/
active: boolean;
/**
* An optional icon to render with the with the {@link children}. The default
* behavior will render this icon before the children.
*
* @see {@link iconAfter}
* @see {@link stacked}
*/
icon?: ReactNode;
/**
* Set this to `true` to render the {@link icon} after the {@link children}.
*
* @defaultValue `false`
*/
iconAfter?: boolean;
}
/**
* @since 6.0.0
*/
export interface TabButtonProps
extends BaseTabProps, ButtonHTMLAttributes {
as?: "button";
}
/**
* @since 6.0.0
*/
export interface TabLinkProps
extends BaseTabProps, AnchorHTMLAttributes {
as: CustomLinkComponent;
}
/**
* @since 6.0.0
*/
export type TabProps = TabButtonProps | TabLinkProps;
/**
* **Client Component**
*
* This component should usually be used with the `TabsList` component and
* `useTabs` hook.
*
* @see {@link https://react-md.dev/components/tabs | Tabs Demos}
* @see {@link useTabs}
* @since 6.0.0
*/
export function Tab(props: TabProps): ReactElement {
const {
id: propId,
as: Component = "button",
active,
activeIndicator,
verticalActiveIndicator,
icon,
iconAfter,
stacked,
className,
children: propChildren,
onBlur,
onClick,
onKeyDown,
onKeyUp,
onMouseDown,
onMouseUp,
onMouseLeave,
onDragStart,
onTouchStart,
onTouchEnd,
onTouchMove,
disableRipple,
...remaining
} = props as TabButtonProps;
const { disabled } = props as TabButtonProps;
const id = useEnsuredId(propId, "tab");
const { activeDescendantId } = useKeyboardMovementContext();
const { ripples, handlers } = useElementInteraction({
mode: disableRipple ? "none" : undefined,
onBlur,
onClick,
onKeyDown,
onKeyUp,
onMouseDown,
onMouseUp,
onMouseLeave,
onDragStart,
onTouchStart,
onTouchEnd,
onTouchMove,
disabled,
});
const isLink = Component !== "button";
const children = useHigherContrastChildren(propChildren);
let buttonOnlyProps: Record | undefined;
if (!isLink) {
buttonOnlyProps = { type: "button" };
}
return (
{icon}
{children}
{ripples}
);
}