radio.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. "use client";
  2. import { useState } from "react";
  3. import type { ComponentRenderProps } from "./types";
  4. import { baseClass, getCustomClass } from "./utils";
  5. export function Radio({ element }: ComponentRenderProps) {
  6. const { props } = element;
  7. const customClass = getCustomClass(props);
  8. const options = (props.options as string[]) || [];
  9. const [selected, setSelected] = useState(0);
  10. return (
  11. <div className={`space-y-1 ${baseClass} ${customClass}`}>
  12. {props.label ? (
  13. <div className="text-[10px] text-muted-foreground mb-1 text-left">
  14. {props.label as string}
  15. </div>
  16. ) : null}
  17. {options.map((opt, i) => (
  18. <label
  19. key={i}
  20. className="flex items-center gap-2 text-xs cursor-pointer"
  21. onClick={() => setSelected(i)}
  22. >
  23. <div
  24. className={`w-3.5 h-3.5 border border-border rounded-full flex items-center justify-center transition-colors ${selected === i ? "border-foreground" : ""}`}
  25. >
  26. {selected === i && (
  27. <div className="w-2 h-2 rounded-full bg-foreground" />
  28. )}
  29. </div>
  30. {opt}
  31. </label>
  32. ))}
  33. </div>
  34. );
  35. }