@trail-ui/react
Version:
94 lines (92 loc) • 2.67 kB
JavaScript
// src/card/card.tsx
import { clsx, dataAttr } from "@trail-ui/shared-utils";
import {
card,
filterVariantProps
} from "@trail-ui/theme";
import { filterDOMProps, mergeProps } from "@react-aria/utils";
import {
createContext,
forwardRef,
useMemo
} from "react";
import { useButton, useFocusRing, useHover } from "react-aria";
import { useContextProps } from "react-aria-components";
import { jsx } from "react/jsx-runtime";
var CardContext = createContext({});
function Card(props, ref) {
[props, ref] = useContextProps(props, ref, CardContext);
const ctx = props;
const { elementType, children, autoFocus, className, classNames, onPress, ...cardProps } = props;
const variantProps = filterVariantProps(props, card.variantKeys);
const Component = elementType || (props.isPressable ? "button" : "div");
let componentProps = cardProps;
if (typeof Component === "string") {
componentProps = filterDOMProps(cardProps);
}
const baseStyles = clsx(classNames == null ? void 0 : classNames.base, className);
const { buttonProps, isPressed } = useButton(
{
elementType: Component,
onPress,
isDisabled: !props.isPressable,
...cardProps
},
ref
);
const { focusProps, isFocused, isFocusVisible } = useFocusRing({ autoFocus });
const { hoverProps, isHovered } = useHover({
isDisabled: !props.isHoverable,
...cardProps
});
const slots = useMemo(
() => card({
...variantProps
}),
[variantProps]
);
const context = useMemo(
() => ({
isPressable: ctx.isPressable,
isDisabled: ctx.isDisabled,
isFooterBlurred: ctx.isFooterBlurred,
disableAnimation: ctx.disableAnimation,
fullWidth: ctx.fullWidth,
slots,
classNames
}),
[
ctx.isPressable,
ctx.isDisabled,
ctx.isFooterBlurred,
ctx.disableAnimation,
ctx.fullWidth,
slots,
classNames
]
);
return /* @__PURE__ */ jsx(
Component,
{
...mergeProps(
props.isPressable ? { ...buttonProps, ...focusProps, role: "button" } : {},
props.isHoverable ? hoverProps : {},
componentProps
),
ref,
className: slots.base({ class: baseStyles }),
tabIndex: props.isPressable ? 0 : -1,
"data-disabled": dataAttr(props.isDisabled),
"data-pressed": dataAttr(isPressed),
"data-hovered": dataAttr(isHovered),
"data-focused": dataAttr(isFocused),
"data-focus-visible": dataAttr(isFocusVisible),
children: /* @__PURE__ */ jsx(CardContext.Provider, { value: context, children })
}
);
}
var _Card = forwardRef(Card);
export {
CardContext,
_Card
};