Current section

Files

Jump to
moon lib moon design form auth_code input.ex
Raw

lib/moon/design/form/auth_code/input.ex

defmodule Moon.Design.Form.AuthCode.Input do
@moduledoc false
use Moon.StatelessComponent, slot: "input"
import Phoenix.HTML.Form
import Moon.Helpers.Form
alias Surface.Components.Form.HiddenInput
@doc "Id attribute for DOM element"
prop(id, :string, from_context: :id)
@doc "Data-testid attribute for DOM element"
prop(testid, :string)
@doc "Additional Tailwind classes"
prop(class, :css_class)
@doc "Will be got from AuthCode in most cases"
prop(disabled, :boolean, from_context: :disabled)
@doc "Will be got from AuthCode in most cases"
prop(placeholder, :string, from_context: :placeholder)
@doc "Will be got from AuthCode in most cases"
prop(type, :string, from_context: :type)
@doc "Will be got from AuthCode in most cases"
prop(length, :integer, from_context: :length)
@doc "Name of the field, usually should be taken from context"
prop(field, :atom, from_context: {Surface.Components.Form.Field, :field})
@doc "Form info, usually should be taken from context"
prop(form, :form, from_context: {Surface.Components.Form, :form})
@doc "Will be got from AuthCode in most cases"
prop(error, :boolean, from_context: :error)
@doc "Will be got from AuthCode in most cases"
prop(allowed_characters, :string, from_context: :allowed_characters)
@doc "Will be got from AuthCode in most cases"
prop(value, :string, from_context: :value)
def render(assigns) do
~F"""
{#for index <- 0..(@length - 1)}
<input
class={[
merge(
input_classes(assigns) ++
[
"h-[72px] w-full max-w-[48px] rounded-moon-i-sm text-moon-24",
"px-0",
"focus:ring-0",
"focus-visible::shadow-input-focus focus-visible::outline-none",
"moon-error:focus:ring-0 moon-error:text-chichi ",
"invalid:text-chichi ",
"leading-[3.5rem] text-moon-24",
[
"shadow-input focus:shadow-input hover:shadow-input cursor-not-allowed": @disabled
],
@class
]
),
"text-center"
]}
maxlength={@length}
{=@type}
autocomplete="off"
placeholder={String.at(@placeholder, index)}
data-testid={@testid}
error={@error || has_error(@form, @field)}
{...input_attributes(@allowed_characters)}
value={String.at(@value || input_value(@form, @field) || "", index)}
{=@disabled}
aria-label={"Character #{index + 1}"}
/>
{/for}
<HiddenInput {=@id} value={@value} />
"""
end
defp input_attributes("alpha") do
[type: "text", inputmode: "text", pattern: "[a-zA-Z]{1}"]
end
defp input_attributes("alphanumeric") do
[type: "text", inputmode: "text", pattern: "[a-zA-Z0-9]{1}"]
end
defp input_attributes("numeric") do
[type: "tel", inputmode: "numeric", pattern: "[0-9]{1}", min: "0", max: "9"]
end
end