Packages
phoenix_duskmoon
9.4.0
9.9.2
9.9.1
9.9.0
9.8.0
9.7.1
9.7.0
9.6.4
9.6.3
9.6.2
9.6.1
9.6.0
9.5.4
9.5.3
9.5.2
9.5.1
9.5.0
9.4.3
9.4.2
9.4.1
9.4.0
9.3.0
9.2.0
9.1.4
9.1.3
9.1.1
9.1.1-rc.1
retired
9.0.1
9.0.0-rc.3
9.0.0-rc.2
9.0.0-rc.1
8.0.0
7.2.1
7.2.0
7.1.3
7.1.2
7.1.1
6.3.2
6.3.1
6.3.0
6.2.0
6.1.3
6.1.2
6.1.1
6.1.0
6.0.10
6.0.9
6.0.8
6.0.7
6.0.6
6.0.5
6.0.4
6.0.3
6.0.2
6.0.1
6.0.0
5.2.0-beta.5
5.2.0-beta.4
5.2.0-beta.3
5.2.0-beta.2
5.2.0-beta.1
5.1.0
5.0.6
5.0.5
5.0.4
5.0.3
5.0.2
5.0.1
5.0.0
4.6.6
4.6.5
4.6.4
4.6.3
4.6.2
4.6.1
4.6.0
4.5.2
4.5.1
4.5.0
4.4.4
4.4.3
4.4.2
4.4.1
4.4.0
4.3.2
4.3.1
4.3.0
4.2.0
4.1.1
4.1.0
4.0.0
Duskmoon UI component library for Phoenix LiveView
Current section
Files
Jump to
Current section
Files
lib/phoenix_duskmoon/component/data_display/timeline.ex
defmodule PhoenixDuskmoon.Component.DataDisplay.Timeline do
@moduledoc """
Timeline component for displaying chronological events.
Uses CSS classes from `@duskmoon-dev/core` (no custom element).
## Examples
<.dm_timeline>
<:item title="Order Placed" time="Jan 1, 2026">
Your order has been placed successfully.
</:item>
<:item title="Shipped" time="Jan 3, 2026" color="success">
Package is on its way.
</:item>
<:item title="Delivered" time="Jan 5, 2026" color="success" completed>
Package delivered.
</:item>
</.dm_timeline>
"""
use Phoenix.Component
import PhoenixDuskmoon.Component.Icon.Icons
import PhoenixDuskmoon.Component.Helpers, only: [css_color: 1]
@doc """
Renders a timeline with chronological items.
## Examples
<.dm_timeline>
<:item title="Step 1">First step content.</:item>
<:item title="Step 2" color="success" active>Current step.</:item>
</.dm_timeline>
"""
@doc type: :component
attr(:id, :any, default: nil, doc: "HTML id attribute")
attr(:class, :any, default: nil, doc: "additional CSS classes")
attr(:size, :string,
default: nil,
values: [nil, "sm", "lg"],
doc: "timeline size variant"
)
attr(:layout, :string,
default: nil,
values: [nil, "alternate", "right", "horizontal"],
doc: "timeline layout variant"
)
attr(:rest, :global)
slot(:item, required: true, doc: "Timeline item") do
attr(:title, :string, doc: "Item title text")
attr(:time, :string, doc: "Item time/date text")
attr(:icon, :string, doc: "MDI icon name for the marker")
attr(:color, :string, doc: "Item color: primary, secondary, success, warning, error")
attr(:completed, :boolean, doc: "Mark item as completed")
attr(:active, :boolean, doc: "Mark item as the current/active item")
attr(:loading, :boolean, doc: "Show loading animation on marker")
attr(:class, :any, doc: "Additional CSS classes for the item")
end
def dm_timeline(assigns) do
~H"""
<div
id={@id}
class={[
"timeline",
@size && "timeline-#{@size}",
@layout && "timeline-#{@layout}",
@class
]}
role="list"
{@rest}
>
<div
:for={item <- @item}
role="listitem"
aria-current={item[:active] && "true"}
class={[
"timeline-item",
item[:color] && "timeline-item-#{css_color(item[:color])}",
item[:completed] && "completed",
item[:active] && "active",
item[:loading] && "loading",
item[:class]
]}
>
<div class="timeline-marker">
<.dm_mdi
:if={item[:icon]}
name={item[:icon]}
class="timeline-marker-icon"
aria-hidden="true"
/>
<span :if={!item[:icon]} class="timeline-marker-dot" aria-hidden="true" />
</div>
<div class="timeline-content">
<div :if={item[:title]} class="timeline-title">{item[:title]}</div>
<div :if={item[:time]} class="timeline-time">{item[:time]}</div>
<div class="timeline-description">{render_slot(item)}</div>
</div>
</div>
</div>
"""
end
end