65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
if Code.ensure_loaded?(Surface) do
 | 
						|
  defmodule Heroicons.Surface.Icon do
 | 
						|
    @moduledoc """
 | 
						|
    A Surface component for rendering Heroicons.
 | 
						|
 | 
						|
    ## Examples
 | 
						|
 | 
						|
        <Heroicons.Surface.Icon name="academic-cap" type="outline" class="h-4 w-4" />
 | 
						|
    """
 | 
						|
 | 
						|
    use Surface.Component
 | 
						|
 | 
						|
    @doc "The name of the icon"
 | 
						|
    prop name, :string, required: true
 | 
						|
 | 
						|
    @doc """
 | 
						|
    The type of the icon
 | 
						|
 | 
						|
    Required if default type is not configured.
 | 
						|
    """
 | 
						|
    prop type, :string
 | 
						|
 | 
						|
    @doc "The class of the icon"
 | 
						|
    prop class, :css_class
 | 
						|
 | 
						|
    @doc "All options are forwarded to the underlying SVG tag as HTML attributes"
 | 
						|
    prop opts, :keyword, default: []
 | 
						|
 | 
						|
    def render(assigns) do
 | 
						|
      type_opts = type_to_opts(assigns)
 | 
						|
      class_opts = class_to_opts(assigns)
 | 
						|
 | 
						|
      opts =
 | 
						|
        assigns.opts
 | 
						|
        |> Keyword.merge(type_opts)
 | 
						|
        |> Keyword.merge(class_opts)
 | 
						|
 | 
						|
      assigns = assign(assigns, opts: opts)
 | 
						|
 | 
						|
      ~F"""
 | 
						|
      {Heroicons.icon(@name, @opts)}
 | 
						|
      """
 | 
						|
    end
 | 
						|
 | 
						|
    defp type_to_opts(assigns) do
 | 
						|
      type = assigns[:type] || Heroicons.default_type()
 | 
						|
 | 
						|
      unless type do
 | 
						|
        raise ArgumentError,
 | 
						|
              "type prop is required if default type is not configured."
 | 
						|
      end
 | 
						|
 | 
						|
      [type: type]
 | 
						|
    end
 | 
						|
 | 
						|
    defp class_to_opts(assigns) do
 | 
						|
      if assigns[:class] do
 | 
						|
        [class: Surface.css_class(assigns.class)]
 | 
						|
      else
 | 
						|
        []
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |