defmodule Corex.PasswordInput do @moduledoc ~S''' Phoenix implementation of [Zag.js Password Input](https://zagjs.com/components/react/password-input). ## Examples ### Basic ```heex <.password_input id="pwd" class="password-input"> <:label>Password <:visible_indicator><.icon name="hero-eye" /> <:hidden_indicator><.icon name="hero-eye-slash" /> ``` ## Styling Use data attributes to target elements: ```css [data-scope="password-input"][data-part="root"] {} [data-scope="password-input"][data-part="label"] {} [data-scope="password-input"][data-part="control"] {} [data-scope="password-input"][data-part="input"] {} [data-scope="password-input"][data-part="visibility-trigger"] {} [data-scope="password-input"][data-part="indicator"] {} ``` If you wish to use the default Corex styling, you can use the class `password-input` on the component. This requires to install `Mix.Tasks.Corex.Design` first and import the component css file. ```css @import "../corex/main.css"; @import "../corex/tokens/themes/neo/light.css"; @import "../corex/components/password-input.css"; ``` You can then use modifiers ```heex <.password_input class="password-input password-input--accent password-input--lg"> <:visible_indicator><.icon name="hero-eye" /> <:hidden_indicator><.icon name="hero-eye-slash" /> ``` Learn more about modifiers and [Corex Design](https://corex-ui.com/components/password-input#modifiers) ''' @doc type: :component use Phoenix.Component alias Corex.PasswordInput.Anatomy.{ Props, Root, Label, Control, Input, VisibilityTrigger, Indicator } alias Corex.PasswordInput.Connect attr(:id, :string, required: false) attr(:visible, :boolean, default: false) attr(:controlled_visible, :boolean, default: false) attr(:disabled, :boolean, default: false) attr(:invalid, :boolean, default: false) attr(:read_only, :boolean, default: false) attr(:required, :boolean, default: false) attr(:ignore_password_managers, :boolean, default: false) attr(:name, :string, default: nil) attr(:form, :string, default: nil) attr(:dir, :string, default: nil, values: [nil, "ltr", "rtl"]) attr(:auto_complete, :string, default: "current-password", values: ["current-password", "new-password"] ) attr(:on_visibility_change, :string, default: nil) attr(:on_visibility_change_client, :string, default: nil) attr(:rest, :global) slot(:label, required: false) slot(:visible_indicator, required: true, doc: "Icon shown when password is visible") slot(:hidden_indicator, required: true, doc: "Icon shown when password is hidden") def password_input(assigns) do assigns = assigns |> assign_new(:id, fn -> "password-input-#{System.unique_integer([:positive])}" end) |> assign_new(:dir, fn -> "ltr" end) ~H"""