defmodule Corex.EmailInput do @moduledoc ~S''' Email input component with Corex design and form field support. ## Examples ### Basic ```heex <.email_input id="email" name="user[email]" class="email-input"> <:label>Email ``` ### With icon ```heex <.email_input id="email" name="user[email]" class="email-input"> <:label>Email <:icon><.icon name="hero-envelope" class="icon" /> ``` ### With form field ```heex <.email_input field={@form[:email]} class="email-input"> <:label>Email <:error :let={msg}> <.icon name="hero-exclamation-circle" class="icon" /> {msg} ``` ## Styling Use data attributes to target elements: ```css [data-scope="email-input"][data-part="root"] {} [data-scope="email-input"][data-part="label"] {} [data-scope="email-input"][data-part="control"] {} [data-scope="email-input"][data-part="icon"] {} [data-scope="email-input"][data-part="input"] {} [data-scope="email-input"][data-part="error"] {} ``` Use `data-no-icon` on the root when the icon slot is not provided for proper border radius styling. Use the class `email-input` on the component for default Corex styling. ''' @doc type: :component use Phoenix.Component attr(:id, :string, required: false) attr(:name, :string, required: false) attr(:value, :any, default: nil) attr(:form, :string, required: false) attr(:errors, :list, default: [], doc: "List of error messages to display") attr(:class, :any, default: nil) attr(:field, Phoenix.HTML.FormField, doc: "A form field struct from the form, e.g. @form[:email]" ) attr(:rest, :global, include: ~w(autocomplete disabled maxlength minlength pattern placeholder readonly required cols list form) ) slot(:label, required: false) slot(:icon, required: false) slot(:error, required: false) do attr(:class, :string, required: false) end def email_input(%{field: %Phoenix.HTML.FormField{} = field} = assigns) do errors = if Phoenix.Component.used_input?(field), do: field.errors, else: [] assigns = assigns |> assign(field: nil) |> assign(:errors, Enum.map(errors, &Corex.Gettext.translate_error(&1))) |> assign_new(:id, fn -> field.id end) |> assign_new(:name, fn -> field.name end) |> assign_new(:value, fn -> field.value end) |> assign_new(:form, fn -> field.form.id end) email_input(assigns) end def email_input(assigns) do assigns = assigns |> assign_new(:id, fn -> "email-input-#{System.unique_integer([:positive])}" end) ~H"""
{render_slot(@error, msg)}
""" end end