Packages
moon
2.87.7
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
lib/moon/design/form/radio.ex
defmodule Moon.Design.Form.Radio do
@moduledoc "Radio(group) component. For using both inside and outside the form"
use Moon.StatelessComponent
alias Moon.Design.Form.Field
alias Surface.Components.Dynamic.Component
import Moon.Helpers.MakeList
@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)
@doc "Well, disabled"
prop(disabled, :boolean)
@doc "Value of the selected option, use it outside the form"
prop(value, :any)
@doc "On-change event, will be propagated to underlying options"
prop(on_change, :event)
@doc "List of options to be rendered when no option slot is given"
prop(options, :keyword, default: [])
@doc "Module for rendering options"
prop(option_module, :atom, default: __MODULE__.Button)
@doc "See Moon.Design.Field documentation"
prop(hide_errors, :boolean)
@doc "See Moon.Design.Field documentation"
prop(hint, :string)
@doc "List of options for Radiogroup "
slot(option)
@doc "Additional slot, here you able to add anything"
slot(default)
def render(assigns) do
~F"""
<Field {=@field} {=@id} {=@testid} {=@class} {=@hide_errors} {=@hint} attrs={role: "radiogroup"}>
{#if slot_assigned?(:option)}
{#for option <- make_list(@option)}
<#slot
{option}
context_put={
value: option.value,
is_selected: "#{@value}" == "#{option.value}",
on_click: @on_change,
disabled: @disabled
}
/>
{/for}
{#else}
<Component
:for={{value, title} <- @options}
module={@option_module}
on_click={@on_change}
{=value}
is_selected={"#{@value}" == "#{value}"}
{=@disabled}
label={title}
/>
{/if}
<#slot />
</Field>
"""
end
end