Timeline: a vertical sequence of events with a marker rail. No Fluxon equivalent. Pure presentational server render; no JS hook.
<.timeline label_position={:leading}>
<.timeline_item status={:done} label="Deployed" at="2h ago" title="enventory" />
<.timeline_item status={:active} label="Deploying" at="40s" title="foodfeed" open>
<:detail>
<pre>==> Building releaseCompiling 12 files (.ex) Generated foodfeed app</pre>
</:detail>
</.timeline_item>
<.timeline_item status={:pending} label="Queued" at="just now" title="skusync">
Waiting on the build.
</.timeline_item>
</.timeline>The root is an ordered list (<ol>): items are steps in sequence, which
matters for screen readers. Each item paints a marker (dot, optional icon,
or a custom :marker slot such as an avatar) on a left rail; a connector
line runs between consecutive markers and is hidden on the last item via
CSS :last-child (callers never pass a flag).
status colors the marker through data-status. The label text is the
state word (e.g. "Deployed", "Failed") and must be set whenever status is
meaningful so state is never color-only. at is a preformatted
timestamp/relative string from the caller; the component does not format
time.
label_position={:leading} on timeline/1 places each item's at in a
fixed-width column left of the marker rail (timestamps scan as a column).
Items inherit that value and may override. Tune the column with
--lui-timeline-label-w.
When :detail is present the title/label/at row becomes a native
<details>/<summary> disclosure (no accordion, no JS hook). open
sets the initial expanded state.
Summary
Functions
Attributes
class(:any) - Extra classes merged onto the root element. Defaults tonil.label_position(:atom) - Where items placeat::inline(default, inside content) or:leading(fixed column left of the marker rail). Inherited by items unless overridden. Defaults to:inline. Must be one of:inline, or:leading.- Global attributes are accepted. Arbitrary HTML/
phx-*attributes passed through.
Slots
inner_block(required) - One or moretimeline_item/1children.
Attributes
title(:string) - Primary line (e.g. app or event name). Defaults tonil.label(:string) - State word (e.g. "Deployed", "Failed"). Set whenever status is meaningful. Defaults tonil.at(:string) - Preformatted timestamp or relative string; not formatted by the component. Defaults tonil.status(:atom) - Marker status; rendered as data-status for CSS coloring. Defaults to:neutral. Must be one of:done,:active,:pending,:danger, or:neutral.icon(:string) - Optional lantern icon name rendered inside the marker instead of the plain dot. Defaults tonil.label_position(:atom) - Where to placeat(:inlineor:leading). Inherits from the parenttimeline/1when omitted; parent defaults to:inline. Defaults tonil.open(:boolean) - When:detailis present, whether the disclosure starts open. Defaults tofalse.class(:any) - Extra classes merged onto the item root. Defaults tonil.- Global attributes are accepted. Arbitrary HTML/
phx-*attributes passed through.
Slots
inner_block- Optional body/description under the title.detail- Collapsible body revealed under a native disclosure. When present, title/label/at become the summary.marker- Custom marker content (e.g. an avatar). Replaces the status dot andicon. Sized by CSS so rail alignment is preserved.