defmodule ChiyaWeb.PublicComponents do use Phoenix.Component use Phoenix.VerifiedRoutes, endpoint: ChiyaWeb.Endpoint, router: ChiyaWeb.Router, statics: ChiyaWeb.static_paths() import ChiyaWeb.Format import ChiyaWeb.Markdown, only: [render: 1] import Phoenix.HTML, only: [raw: 1] @doc """ Renders a [Hero Icon](https://heroicons.com). Hero icons come in three styles – outline, solid, and mini. By default, the outline style is used, but solid an mini may be applied by using the `-solid` and `-mini` suffix. You can customize the size and colors of the icons by setting width, height, and background color classes. Icons are extracted from your `priv/hero_icons` directory and bundled within your compiled app.css by the plugin in your `assets/tailwind.config.js`. ## Examples <.icon name="hero-cake" /> <.icon name="hero-cake-solid" /> <.icon name="hero-cake-mini" /> <.icon name="hero-bolt" class="bg-blue-500 w-10 h-10" /> """ attr :name, :string, required: true attr :class, :string, default: nil def icon(%{name: "hero-" <> _} = assigns) do ~H""" """ end @doc """ Renders a middot as divider """ def dot(assigns), do: ~H""" · """ @doc """ Renders a horizontal line """ def line(assigns), do: ~H"""
""" attr :text, :string, default: "⌘" def divider(assigns) do ~H"""
<%= assigns.text %>
""" end @doc """ Renders a note-header with title. """ attr :class, :string, default: nil attr :class_title, :string, default: nil attr :class_subtitle, :string, default: nil slot :title, required: true slot :subtitle, required: false def header(assigns) do ~H"""

<%= render_slot(@title) %>

<%= render_slot(@subtitle) %>

""" end attr :layout, :atom, default: :list attr :notes, :list, required: true def note_list(assigns) do case assigns.layout do :gallery -> note_list_gallery(assigns) :microblog -> note_list_microblog(assigns) _ -> note_list_headers(assigns) end end def note_list_headers(assigns) do ~H"""
<%= for note <- assigns.notes do %>
<%= note.name %> <%= pretty_date(note.published_at) %>

<%= String.slice(note.content, 0..150) %>

<% end %>
""" end attr :note, :map, required: true def note_list_microblog(assigns) do ~H"""
<%= for note <- assigns.notes do %>
<.featured_images note={note} />
<%= raw(render(note.content)) %>
<.dot /> Permalink <%= if not Enum.empty?(note.images) do %> <.dot /> <.icon name="hero-photo" /> <% end %>
<.divider /> <% end %>
""" end def note_list_gallery(assigns) do ~H""" """ end def featured_images(assigns) do images = main_images(assigns.note) case Enum.count(images) do 0 -> ~H"""
""" 1 -> assigns = assign(assigns, :image, List.first(images)) ~H"""
""" 2 -> assigns = assigns |> assign(:first, Enum.at(images, 0)) |> assign(:second, Enum.at(images, 1)) ~H"""
""" 3 -> assigns = assigns |> assign(:first, Enum.at(images, 0)) |> assign(:second, Enum.at(images, 1)) |> assign(:third, Enum.at(images, 2)) ~H"""
""" end end defp gallery_name(note), do: "gallery-#{note.id}" defp main_images(note), do: Enum.filter(note.images, fn image -> image.featured end) end