defmodule MoonWeb.Components.PropsTable do @moduledoc false use MoonWeb, :stateless_component alias Moon.Design.Table alias Moon.Design.Table.Column prop(title, :string, default: "Props") prop(data, :list) prop(module, :module) slot(default) def render(assigns) do ~F"""
{(@module && "#{@module} props" |> String.replace("Elixir.Moon.Design.", "")) || @title}
{@module.__moduledoc__()}
{item.name} {item.type} {item.required} {item.default} {item.description}
""" end defp data_from_module(module) do # Button / IconButton variant property fix ((module.__props__() |> Enum.map(fn prop -> %{ :name => "#{prop[:name]}", :type => (Keyword.get(prop[:opts], :values!) || Keyword.get(prop[:opts], :values) || ["#{prop[:type]}"]) |> Enum.join(" | ") |> String.replace( "fill | outline | ghost | primary | secondary | tertiary", "fill | outline | ghost" ), :required => (Keyword.get(prop[:opts], :required, false) && "Yes") || "No", :default => Keyword.get(prop[:opts], :default) |> inspect() |> String.replace(~r/^nil$/, "-"), :description => prop[:doc] || "-" } end)) ++ (module.__slots__() |> Enum.map(fn prop -> %{ :name => "#{prop[:name]}", :type => "slot", :required => (Keyword.get(prop[:opts], :required, false) && "Yes") || "No", :default => "-", :description => prop[:doc] || "-" } end))) |> Enum.filter(&(!String.starts_with?(&1[:description], "Experimental:"))) |> Enum.filter(&(!String.starts_with?(&1[:description], "Deprecated:"))) end end