defmodule Moon.Design.Form.Radio.Button do @moduledoc "Single component of the Radio, renders to a label" use Moon.StatelessComponent, slot: "option" alias Moon.Design.Form.Field.Label alias Moon.Design.Form.Radio.Indicator alias Surface.Components.Form.RadioButton import Phoenix.HTML.Form, only: [input_value: 2] @doc "Id to be given to the label tag" prop(id, :string) @doc "Data-testid attribute value" prop(testid, :string) @doc "Additional CSS classes for the label" prop(class, :css_class) @doc "Field name, surface-style" prop(field, :atom, from_context: {Surface.Components.Form.Field, :field}) @doc "Form, surface-style" prop(form, :form, from_context: {Surface.Components.Form, :form}) @doc "Making the radio selected, use it outside the form. In most cases is set by Radio component" prop(is_selected, :boolean, from_context: :is_selected) prop(on_click, :event, from_context: :on_click) prop(value, :string, from_context: :value) prop(disabled, :boolean, from_context: :disabled) @doc "Label to be shown when no default slot is given" prop(label, :string) @doc "Size of the label" prop(size, :string, values!: ~w(sm md lg), default: "md") @doc "Inner content - put label & here" slot(default) def render(assigns) do ~F""" """ end defp is_selected(%{value: value, form: form, field: field}) do "#{value}" == "#{input_value(form, field)}" end end