defmodule PhoenixKit.Modules.Shop.Web.Components.ShopCards do
@moduledoc """
Reusable product display components for the shop storefront.
Provides product card and pagination components shared between
the main catalog page and category pages.
"""
use Phoenix.Component
import PhoenixKitWeb.Components.Core.Icon, only: [icon: 1]
alias PhoenixKit.Modules.Shop
alias PhoenixKit.Modules.Shop.Translations
alias PhoenixKit.Modules.Shop.Web.Components.FilterHelpers
alias PhoenixKit.Modules.Shop.Web.Helpers
@doc """
Renders a product card with image, title, price, and optional category badge.
"""
attr :product, :map, required: true
attr :currency, :any, required: true
attr :language, :string, default: "en"
attr :filter_qs, :string, default: ""
attr :show_category, :boolean, default: false
def product_card(assigns) do
assigns =
assigns
|> assign(:product_title, Translations.get(assigns.product, :title, assigns.language))
|> assign(:product_url, Shop.product_url(assigns.product, assigns.language))
|> assign(:product_image_url, Helpers.first_image(assigns.product))
|> assign(
:category_name,
if(assigns.show_category && assigns.product.category,
do: Translations.get(assigns.product.category, :name, assigns.language),
else: nil
)
)
~H"""
<.link
navigate={@product_url <> @filter_qs}
class="card bg-base-100 shadow-md hover:shadow-xl transition-all hover:-translate-y-1"
>
<% else %>
Showing {min(@page * @per_page, @total_products)} of {@total_products} products