Corex. Marquee
(Corex v0.1.1)
View Source
Phoenix implementation of Zag.js Marquee.
Anatomy
Minimal
<.marquee
class="marquee"
items={[
%{name: "Apple", logo: "🍎"},
%{name: "Banana", logo: "🍌"},
%{name: "Cherry", logo: "🍒"}
]}
duration={20}
spacing="2rem"
pause_on_interaction
>
<:item :let={item}>
<span>{item.logo}</span>
<span>{item.name}</span>
</:item>
</.marquee>Custom slots
<.marquee
class="marquee"
items={[
%{name: "Home", icon: "hero-home"},
%{name: "User", icon: "hero-user"},
%{name: "Cog", icon: "hero-cog-6-tooth"}
]}
duration={25}
spacing="2rem"
pause_on_interaction
>
<:item :let={item}>
<.heroicon name={item.icon} />
<span>{item.name}</span>
</:item>
</.marquee>API
Requires a stable id on <.marquee>.
| Function | Action | Returns |
|---|---|---|
pause/1 | Pause animation (client) | %Phoenix.LiveView.JS{} |
pause/2 | Pause animation (server) | socket |
resume/1 | Resume animation (client) | %Phoenix.LiveView.JS{} |
resume/2 | Resume animation (server) | socket |
toggle_pause/1 | Toggle pause (client) | %Phoenix.LiveView.JS{} |
toggle_pause/2 | Toggle pause (server) | socket |
Events
Pick an event name and pass it to on_* on <.marquee>.
Server events
| Event | When | Payload |
|---|---|---|
on_pause_change="marquee_pause_changed" | Pause state changes | %{"id" => id, "paused" => boolean} |
on_loop_complete="marquee_loop_complete" | One loop finishes | %{"id" => id} |
on_complete="marquee_complete" | All loops finish (loop_count > 0) | %{"id" => id} |
Client events
| Event | When | event.detail |
|---|---|---|
on_pause_change_client="marquee-pause-changed" | Pause state changes | id, paused |
on_loop_complete_client="marquee-loop-complete" | One loop finishes | id |
on_complete_client="marquee-complete" | All loops finish | id |
Style
Target parts with data-scope and data-part, or use Corex Design: import tokens and marquee.css, then set class="marquee" on <.marquee>.
[data-scope="marquee"][data-part="root"] {}
[data-scope="marquee"][data-part="viewport"] {}
[data-scope="marquee"][data-part="content"] {}
[data-scope="marquee"][data-part="item"] {}
[data-scope="marquee"][data-part="edge"] {}@import "../corex/main.css";
@import "../corex/tokens/themes/neo/light.css";
@import "../corex/components/marquee.css";Stack modifiers on the host (class on <.marquee>).
Color
| Modifier | Classes |
|---|---|
| Default | marquee |
| Accent | marquee marquee--accent |
| Brand | marquee marquee--brand |
| Alert | marquee marquee--alert |
| Info | marquee marquee--info |
| Success | marquee marquee--success |
Size
| Modifier | Classes |
|---|---|
| SM | marquee marquee--sm |
| MD | marquee marquee--md |
| LG | marquee marquee--lg |
| XL | marquee marquee--xl |
Summary
API
Pause the marquee from a control (phx-click).
Pause from handle_event. Pushes marquee_pause.
Resume the marquee from a control (phx-click).
Resume from handle_event. Pushes marquee_resume.
Toggle paused state from a control (phx-click).
Toggle pause from handle_event. Pushes marquee_toggle_pause.
Components
Attributes
id(:string)aria_label(:string) - Accessible name for the marquee region. Defaults to "Marquee: {id}" when omitted. Defaults tonil.items(:list) (required) - List of maps for each marquee item.duration(:integer) - Animation duration in seconds. Defaults to20.side(:string) - Defaults to"end". Must be one of"start","end","top", or"bottom".speed(:integer) - Animation speed in pixels per second. Defaults to100.spacing(:string) - Spacing between items. Defaults to"1rem".pause_on_interaction(:boolean) - Whether to pause the animation on interaction. Defaults tofalse.paused(:boolean) - Whether the marquee starts paused. Defaults tofalse.delay(:integer) - Delay before starting the animation in seconds. Defaults to0.loop_count(:integer) - Number of times to loop the animation, setting to 0 creates an infinite loop. Defaults to0.reverse(:boolean) - Whether to reverse the animation. Defaults tofalse.respect_reduced_motion(:boolean) - When false, animation runs even when user has prefers-reduced-motion. Defaults totrue.dir(:string) - Defaults tonil.Must be one ofnil,"ltr", or"rtl".on_pause_change(:string) - Server event when pause status changes. Defaults tonil.on_pause_change_client(:string) - Client event when pause status changes. Defaults tonil.on_loop_complete(:string) - Server event when one loop completes. Defaults tonil.on_loop_complete_client(:string) - Client event when one loop completes. Defaults tonil.on_complete(:string) - Server event when all loops complete (finite loops only). Defaults tonil.on_complete_client(:string) - Client event when all loops complete (finite loops only). Defaults tonil.- Global attributes are accepted.
Slots
item(required) - Accepts attributes:class(:string)
API
Pause the marquee from a control (phx-click).
<.action phx-click={Corex.Marquee.pause("my-marquee")}>Pause</.action>
<.marquee
id="my-marquee"
class="marquee"
items={[%{name: "A"}, %{name: "B"}]}
duration={20}
spacing="2rem"
>
<:item :let={item}><span>{item.name}</span></:item>
</.marquee>document.getElementById("my-marquee")?.dispatchEvent(
new CustomEvent("corex:marquee:pause", { bubbles: false })
);
Pause from handle_event. Pushes marquee_pause.
<.action phx-click="pause_marquee">Pause</.action>
<.marquee
id="my-marquee"
class="marquee"
items={[%{name: "A"}, %{name: "B"}]}
duration={20}
spacing="2rem"
>
<:item :let={item}><span>{item.name}</span></:item>
</.marquee>def handle_event("pause_marquee", _, socket) do
{:noreply, Corex.Marquee.pause(socket, "my-marquee")}
end
Resume the marquee from a control (phx-click).
<.action phx-click={Corex.Marquee.resume("my-marquee")}>Resume</.action>
<.marquee
id="my-marquee"
class="marquee"
items={[%{name: "A"}, %{name: "B"}]}
duration={20}
spacing="2rem"
paused
>
<:item :let={item}><span>{item.name}</span></:item>
</.marquee>document.getElementById("my-marquee")?.dispatchEvent(
new CustomEvent("corex:marquee:resume", { bubbles: false })
);
Resume from handle_event. Pushes marquee_resume.
<.action phx-click="resume_marquee">Resume</.action>
<.marquee
id="my-marquee"
class="marquee"
items={[%{name: "A"}, %{name: "B"}]}
duration={20}
spacing="2rem"
paused
>
<:item :let={item}><span>{item.name}</span></:item>
</.marquee>def handle_event("resume_marquee", _, socket) do
{:noreply, Corex.Marquee.resume(socket, "my-marquee")}
end
Toggle paused state from a control (phx-click).
<.action phx-click={Corex.Marquee.toggle_pause("my-marquee")}>Toggle</.action>
<.marquee
id="my-marquee"
class="marquee"
items={[%{name: "A"}, %{name: "B"}]}
duration={20}
spacing="2rem"
>
<:item :let={item}><span>{item.name}</span></:item>
</.marquee>document.getElementById("my-marquee")?.dispatchEvent(
new CustomEvent("corex:marquee:toggle-pause", { bubbles: false })
);
Toggle pause from handle_event. Pushes marquee_toggle_pause.
<.action phx-click="toggle_marquee">Toggle</.action>
<.marquee
id="my-marquee"
class="marquee"
items={[%{name: "A"}, %{name: "B"}]}
duration={20}
spacing="2rem"
>
<:item :let={item}><span>{item.name}</span></:item>
</.marquee>def handle_event("toggle_marquee", _, socket) do
{:noreply, Corex.Marquee.toggle_pause(socket, "my-marquee")}
end