UNPKG

@trail-ui/react

Version:
94 lines (92 loc) 2.67 kB
// 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 };