defmodule Doggo.Components.Drawer do @moduledoc false @behaviour Doggo.Component use Phoenix.Component @impl true def doc do """ Renders a drawer with a `brand`, `top`, and `bottom` slot. All slots are optional, and you can render any content in them. If you want to use the drawer as a sidebar, you can use the `vertical_nav/1` and `vertical_nav_section/1` components. """ end @impl true def usage do """ Minimal example: ```heex <.drawer> <:main>Content ``` With all slots: ```heex <.drawer> <:header>Doggo <:main>Content at the top <:footer>Content at the bottom ``` With navigation and sections: ```heex <.drawer> <:header> <.link navigate={~p"/"}>App <:main> <.vertical_nav label="Main"> <:item> <.link navigate={~p"/dashboard"}>Dashboard <:item> <.vertical_nav_nested> <:title>Content <:item current_page> <.link navigate={~p"/posts"}>Posts <:item> <.link navigate={~p"/comments"}>Comments <.vertical_nav_section> <:title>Search <:item> <:footer> <.vertical_nav label="User menu"> <:item> <.link navigate={~p"/settings"}>Settings <:item> <.link navigate={~p"/logout"}>Logout ``` """ end @impl true def config do [ type: :layout, since: "0.6.0", maturity: :experimental, modifiers: [] ] end @impl true def nested_classes(base_class) do [ "#{base_class}-footer", "#{base_class}-header", "#{base_class}-main" ] end @impl true def attrs_and_slots do quote do attr :rest, :global, doc: "Any additional HTML attributes." slot :header, doc: "Optional slot for the brand name or logo." slot :main, doc: """ Slot for content that is rendered after the brand, at the start of the side bar. """ slot :footer, doc: """ Slot for content that is rendered at the end of the drawer, potentially pinned to the bottom, if there is enough room. """ end end @impl true def init_block(_opts, _extra) do [] end @impl true def render(assigns) do ~H""" """ end end