import type { ReactNode } from "react"; import { createContext, use, useMemo } from "react"; import type { VariantProps } from "tailwind-variants"; import { tv } from "../../core/tv"; import { AccentScope } from "../containers/AccentScope"; import { View } from "../primitives/View"; import { type MultiSelectionGroupProps, useMultiSelectionValue, } from "../selection/MultiSelectionContext"; import { CheckboxContextProvider } from "./CheckboxContext"; const checkboxCardGroupVariants = tv({ base: "gap-xs", variants: { layout: { list: "flex-col", stack: "flex-row flex-wrap", }, }, defaultVariants: { layout: "list" }, }); type CheckboxCardGroupVariantProps = VariantProps< typeof checkboxCardGroupVariants >; export type CheckboxCardGroupLayout = NonNullable< CheckboxCardGroupVariantProps["layout"] >; export type CheckboxCardGroupVariant = "outlined" | "tonal"; interface CheckboxCardGroupAppearance { layout: CheckboxCardGroupLayout; variant: CheckboxCardGroupVariant; } const CheckboxCardGroupAppearanceContext = createContext({ layout: "list", variant: "tonal", }); /** Lets a card size itself for the row it flows in and take the group's material. */ export function useCheckboxCardGroupAppearance(): CheckboxCardGroupAppearance { return use(CheckboxCardGroupAppearanceContext); } export interface CheckboxCardGroupProps extends MultiSelectionGroupProps, CheckboxCardGroupVariantProps { /** The material every card shares: a checked card takes the accent, the * others the neutral theme. */ variant?: CheckboxCardGroupVariant; className?: string; } export function CheckboxCardGroup({ values, defaultValues, onValuesChange, accent, disabled, layout, variant, className, children, ...props }: CheckboxCardGroupProps): ReactNode { const context = useMultiSelectionValue({ values, defaultValues, onValuesChange, disabled, }); const appearance = useMemo( () => ({ layout: layout ?? "list", variant: variant ?? "tonal" }), [layout, variant], ); return ( {children} ); }