defmodule Corex.Editable do @moduledoc ~S''' Phoenix implementation of [Zag.js Editable](https://zagjs.com/components/react/editable). ## Examples ### Basic ```heex <.editable id="edit" value="Click to edit" class="editable"> <:label>Name <:edit_trigger><.icon name="hero-pencil-square" class="icon" /> <:submit_trigger><.icon name="hero-check" class="icon" /> <:cancel_trigger><.icon name="hero-x-mark" class="icon" /> ``` Required slots: `:label`, `:edit_trigger`, `:submit_trigger`, `:cancel_trigger`. Preview value is managed by the component and the Editable TS hook. ## Styling Use data attributes: `[data-scope="editable"][data-part="root"]`, `area`, `label`, `input`, `preview`, `edit-trigger`, `control`, `submit-trigger`, `cancel-trigger`. ''' @doc type: :component use Phoenix.Component alias Corex.Editable.Anatomy.{ Props, Root, Area, Label, Input, Preview, EditTrigger, Triggers, SubmitTrigger, CancelTrigger } alias Corex.Editable.Connect attr(:id, :string, required: false) attr(:value, :string, default: "") attr(:controlled, :boolean, default: false) attr(:disabled, :boolean, default: false) attr(:read_only, :boolean, default: false) attr(:required, :boolean, default: false) attr(:invalid, :boolean, default: false) attr(:name, :string, default: nil) attr(:form, :string, default: nil) attr(:dir, :string, default: nil, values: [nil, "ltr", "rtl"]) attr(:edit, :boolean, default: false) attr(:controlled_edit, :boolean, default: false) attr(:default_edit, :boolean, default: false) attr(:placeholder, :string, default: nil) attr(:activation_mode, :string, default: nil, values: [nil, "dblclick", "focus"]) attr(:select_on_focus, :boolean, default: true) attr(:on_value_change, :string, default: nil) attr(:on_value_change_client, :string, default: nil) attr(:rest, :global) slot(:label, required: true) slot(:edit_trigger, required: true) slot(:submit_trigger, required: true) slot(:cancel_trigger, required: true) def editable(assigns) do empty = String.trim(assigns[:value] || "") == "" editing = assigns[:default_edit] || false value_text = if(empty, do: assigns[:placeholder] || "", else: assigns[:value] || "") assigns = assigns |> assign_new(:id, fn -> "editable-#{System.unique_integer([:positive])}" end) |> assign_new(:dir, fn -> "ltr" end) |> assign(:empty, empty) |> assign(:editing, editing) |> assign(:value_text, value_text) ~H"""
{@value_text}
""" end end