defmodule MusicLibraryWeb.ChartComponents do use MusicLibraryWeb, :live_component @doc """ Renders a horizontal bar chart. ## Examples <.vertical_bar_chart data={[{"Artist 1", 5}, {"Artist 2", 3}]} label_fn={&elem(&1, 0)} value_fn={&elem(&1, 1)} width={400} height={300} color_class="fill-red-500" /> """ attr :data, :list, required: true attr :label_fn, :any, required: true attr :value_fn, :any, required: true attr :width, :integer, default: 400 attr :height, :integer, default: 300 attr :color_class, :string, required: true attr :class, :string, default: "" attr :datum_click, :any, default: nil, doc: "the function for handling phx-click on each datum" def vertical_bar_chart(assigns) do assigns = assigns |> assign(:padding, 40) |> assign(:max_value, max_value(assigns.data, assigns.value_fn)) # Account for labels and padding |> assign(:chart_width, assigns.width - 150 - 40) # Account for bottom padding |> assign(:chart_height, assigns.height - 40) |> assign(:bar_height, calculate_bar_height(assigns.data, assigns.height - 40)) ~H"""