index.tsx 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import clsx from "clsx";
  2. import type { ComponentProps, ReactNode } from "react";
  3. import { UnstyledToolbar } from "../UnstyledToolbar/index.js";
  4. type Props = ComponentProps<"div"> & {
  5. header: ReactNode | ReactNode[];
  6. children: ReactNode | ReactNode[];
  7. full?: boolean;
  8. } & (
  9. | { toolbar?: undefined }
  10. | { toolbar: ReactNode | ReactNode[]; toolbarLabel: string }
  11. );
  12. export const Card = ({ header, children, full, ...props }: Props) => (
  13. <div className="rounded-2xl border border-stone-300 dark:border-steel-600">
  14. <div className="flex w-full flex-row items-center justify-between overflow-hidden rounded-t-2xl bg-beige-100 p-4 dark:bg-steel-900">
  15. <h2 className="text-lg font-medium">{header}</h2>
  16. {props.toolbar && (
  17. <UnstyledToolbar
  18. aria-label={props.toolbarLabel}
  19. className="flex flex-row gap-2"
  20. >
  21. {props.toolbar}
  22. </UnstyledToolbar>
  23. )}
  24. </div>
  25. <div
  26. className={clsx({
  27. "overflow-hidden rounded-b-2xl bg-beige-100 px-4 pb-4 dark:bg-steel-900":
  28. !full,
  29. })}
  30. >
  31. {children}
  32. </div>
  33. </div>
  34. );