defmodule AdminUI.Card do @moduledoc """ Implement of card components from https://ui.shadcn.com/docs/components/card """ use AdminUI.Component use Gettext, backend: Octafest.Gettext import AdminUI.Icon import AdminUI.Typography import AdminUI.Menu import AdminUI.DropdownMenu import AdminUI.Button @doc """ Render dropdown menu ## Examples: <.card id={@user.id} action={[{:patch, ~q"/"}, {:sr_label, dgettext("admin", "Say hello") ]} > <.card_header> <.card_accent_text>Title <.card_menu> <.card_menu_action icon="lucide-settings" patch={~q"/"}> <%= dgettext("admin", "Settings") %> <.card_footer> <.card_muted_text> <%= dgettext("admin", "Edited %{time}", time: @user.updated_at) %> """ attr :id, :string, default: nil attr :action, :list, default: nil attr :rest, :global slot :inner_block, required: true @spec card(map()) :: Phoenix.LiveView.Rendered.t() def card(assigns) do ~H"""
  • <.card_action :if={@action} {@action} /> <%= render_slot(@inner_block) %>
  • """ end slot :inner_block, required: true @spec card_accent_text(map()) :: Phoenix.LiveView.Rendered.t() def card_accent_text(assigns) do ~H"""
    <%= render_slot(@inner_block) %>
    """ end slot :inner_block, required: true @spec card_muted_text(map()) :: Phoenix.LiveView.Rendered.t() def card_muted_text(assigns) do ~H"""
    <%= render_slot(@inner_block) %>
    """ end attr :sr_label, :string, required: true attr :label, :string, default: nil attr :class, :any, default: nil attr :rest, :global, include: ~w(navigate patch href replace method csrf_token download hreflang referrerpolicy rel target type) def card_action(assigns) do ~H""" <.link {@rest} data-action class="[grid-area:action] justify-self-end self-end before:absolute before:inset-0 hovered:outline-none hovered:ring-0" >
    <%= @sr_label %>
    <.text text={@label || dgettext("admin", "View")} /> <.icon icon="lucide-chevron-right" class="size-4" />
    """ end slot :inner_block, required: true def card_menu(assigns) do ~H""" <.dropdown_menu class="[grid-area:menu] justify-self-end opacity-5 group-hovered/card:opacity-100 z-10"> <.dropdown_menu_trigger> <.button variant="btn-outline" size="btn-icon" class="overflow-hidden rounded-full"> <.icon icon="lucide-settings" class="size-5" /> <.dropdown_menu_content side="bottom" align="end"> <.menu> <.menu_group> <%= render_slot(@inner_block) %> """ end attr :icon, :string, default: nil attr :class, :string, default: nil attr :disabled, :boolean, default: false attr :rest, :global, include: ~w(disabled form name value download hreflang referrerpolicy rel target type navigate patch href replace method type csrf_token) slot :inner_block, required: true def card_menu_action(%{"phx-click": nil} = assigns) do ~H""" <.link {@rest}> <.menu_item class={@class} disabled={@disabled}> <.icon :if={@icon} icon={@icon} class="size-4 mr-2" /> <%= render_slot(@inner_block) %> """ end def card_menu_action(assigns) do ~H""" """ end slot :inner_block, required: true def card_footer(assigns) do ~H"""

    <%= render_slot(@inner_block) %>
    """ end slot :inner_block, required: true def card_header(assigns) do ~H"""
    <%= render_slot(@inner_block) %>
    """ end attr :text, :string, required: true def card_footer_muted_text(assigns) do ~H""" <.card_footer> <.card_muted_text> <.text text={@text} /> """ end end