{
"files": [
{
"content": "defmodule Shadix.Components.Empty do\n @moduledoc \"\"\"\n Empty state components, ported from shadcn/ui (new-york-v4) \"empty\".\n\n Exposes `empty/1`, `empty_header/1`, `empty_media/1`, `empty_title/1`,\n `empty_description/1`, and `empty_content/1`. `empty_media/1` carries a\n `variant` axis (`default` / `icon`).\n \"\"\"\n use Phoenix.Component\n import Shadix.Cn\n\n @empty_media_variants %{\n \"default\" => \"bg-transparent\",\n \"icon\" =>\n \"flex size-10 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6\"\n }\n\n attr(:class, :string, default: nil)\n attr(:rest, :global)\n slot(:inner_block, required: true)\n\n def empty(assigns) do\n class =\n cn([\n \"flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12\",\n assigns.class\n ])\n\n assigns = assign(assigns, :computed_class, class)\n\n ~H\"\"\"\n <div data-slot=\"empty\" class={@computed_class} {@rest}>{render_slot(@inner_block)}</div>\n \"\"\"\n end\n\n attr(:class, :string, default: nil)\n attr(:rest, :global)\n slot(:inner_block, required: true)\n\n def empty_header(assigns) do\n class =\n cn([\n \"flex max-w-sm flex-col items-center gap-2 text-center\",\n assigns.class\n ])\n\n assigns = assign(assigns, :computed_class, class)\n\n ~H\"\"\"\n <div data-slot=\"empty-header\" class={@computed_class} {@rest}>{render_slot(@inner_block)}</div>\n \"\"\"\n end\n\n attr(:class, :string, default: nil)\n attr(:variant, :string, default: \"default\", values: ~w(default icon))\n attr(:rest, :global)\n slot(:inner_block, required: true)\n\n def empty_media(assigns) do\n class =\n cn([\n \"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n Map.fetch!(@empty_media_variants, assigns.variant),\n assigns.class\n ])\n\n assigns = assign(assigns, :computed_class, class)\n\n ~H\"\"\"\n <div data-slot=\"empty-icon\" data-variant={@variant} class={@computed_class} {@rest}>\n {render_slot(@inner_block)}\n </div>\n \"\"\"\n end\n\n attr(:class, :string, default: nil)\n attr(:rest, :global)\n slot(:inner_block, required: true)\n\n def empty_title(assigns) do\n class = cn([\"text-lg font-medium tracking-tight\", assigns.class])\n assigns = assign(assigns, :computed_class, class)\n\n ~H\"\"\"\n <div data-slot=\"empty-title\" class={@computed_class} {@rest}>{render_slot(@inner_block)}</div>\n \"\"\"\n end\n\n attr(:class, :string, default: nil)\n attr(:rest, :global)\n slot(:inner_block, required: true)\n\n def empty_description(assigns) do\n class =\n cn([\n \"text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n assigns.class\n ])\n\n assigns = assign(assigns, :computed_class, class)\n\n ~H\"\"\"\n <div data-slot=\"empty-description\" class={@computed_class} {@rest}>\n {render_slot(@inner_block)}\n </div>\n \"\"\"\n end\n\n attr(:class, :string, default: nil)\n attr(:rest, :global)\n slot(:inner_block, required: true)\n\n def empty_content(assigns) do\n class =\n cn([\n \"flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance\",\n assigns.class\n ])\n\n assigns = assign(assigns, :computed_class, class)\n\n ~H\"\"\"\n <div data-slot=\"empty-content\" class={@computed_class} {@rest}>{render_slot(@inner_block)}</div>\n \"\"\"\n end\nend\n",
"path": "empty.ex"
}
],
"hooks": [],
"name": "empty",
"npm_deps": [],
"registry_deps": [
"cn"
]
}