lib/moon/design/form/group.ex

defmodule Moon.Design.Form.Group do
  @moduledoc """
  Component for visual groupping Form.Input & Form.Select
  """

  use Moon.StatelessComponent

  @doc "Id attribute for DOM element"
  prop(id, :string)
  @doc "Data-testid attribute for DOM element"
  prop(testid, :string)
  @doc "Additional Tailwind classes"
  prop(class, :css_class)
  @doc "Additional Tailwind classes"
  prop(field_class, :css_class, from_context: :field_class)
  @doc "Group orientation"
  prop(orientation, :string, values!: ~w(horizontal vertical), default: "vertical")

  @doc "Inner content of the component"
  slot(default, required: true)

  def render(assigns) do
    ~F"""
    <div
      class={merge([
        "flex border-none bg-goku rounded-moon-i-sm h-fit",
        (@orientation == "horizontal" && "flex-row") || "flex-col",
        @class
      ])}
      {=@id}
      data-testid={@testid}
    >
      <#slot context_put={
        field_class:
          merge([
            (@orientation == "vertical" &&
               [
                 "not-last:rounded-bl-none not-last:rounded-br-none not-last:not(:moon-error):input-bbb-hidden",
                 "not-first:rounded-tl-none not-first:rounded-tr-none not-first:not(:moon-error):input-tbb-hidden"
               ]) ||
              [
                "flex-1 basis-1/2",
                "not-last:rtl:rounded-bl-none not-last:rtl:rounded-tl-none not-last:rtl:not(:moon-error):input-lsb-hidden",
                "not-last:ltr:rounded-br-none not-last:ltr:rounded-tr-none not-last:ltr:not(:moon-error):input-rsb-hidden",
                "not-first:rtl:rounded-tr-none not-first:rtl:rounded-br-none not-first:rtl:not(:moon-error):input-rsb-hidden",
                "not-first:ltr:rounded-tl-none not-first:ltr:rounded-bl-none not-first:ltr:not(:moon-error):input-lsb-hidden"
              ] ++
                [@field_class]
          ])
      } />
    </div>
    """
  end
end