defmodule Corex.Timer do @moduledoc ~S''' Phoenix implementation of [Zag.js Timer](https://zagjs.com/components/react/timer). ## Examples ### Basic ```heex <.timer id="t" start_ms={60_000} class="timer"> <:start_trigger><.icon name="hero-play" class="icon" /> <:pause_trigger><.icon name="hero-pause" class="icon" /> <:resume_trigger><.icon name="hero-play" class="icon" /> <:reset_trigger><.icon name="hero-arrow-path" class="icon" /> ``` ### Countdown ```heex <.timer id="t" countdown start_ms={90_000} target_ms={0} auto_start class="timer"> <:start_trigger><.icon name="hero-play" class="icon" /> <:pause_trigger><.icon name="hero-pause" class="icon" /> <:resume_trigger><.icon name="hero-play" class="icon" /> <:reset_trigger><.icon name="hero-arrow-path" class="icon" /> ``` Required slots: `:start_trigger`, `:pause_trigger`, `:resume_trigger`, `:reset_trigger`. ## Styling Use data attributes to target elements: ```css [data-scope="timer"][data-part="root"] {} [data-scope="timer"][data-part="area"] {} [data-scope="timer"][data-part="item"] {} [data-scope="timer"][data-part="separator"] {} [data-scope="timer"][data-part="control"] {} [data-scope="timer"][data-part="action-trigger"] {} ``` If you wish to use the default Corex styling, you can use the class `timer` on the component. This requires to install `Mix.Tasks.Corex.Design` first and import the component css file. ```css @import "../corex/main.css"; @import "../corex/tokens/themes/neo/light.css"; @import "../corex/components/timer.css"; ``` You can then use modifiers ```heex <.timer class="timer timer--accent timer--lg"> ``` Learn more about modifiers and [Corex Design](https://corex-ui.com/components/timer#modifiers) ''' @doc type: :component use Phoenix.Component alias Corex.Timer.Anatomy.{Props, Root, Area, Control, Item, Separator, ActionTrigger} alias Corex.Timer.Connect attr(:id, :string, required: false) attr(:countdown, :boolean, default: false) attr(:start_ms, :integer, default: 0) attr(:target_ms, :integer, default: nil) attr(:auto_start, :boolean, default: false) attr(:interval, :integer, default: 1000) attr(:on_tick, :string, default: nil) attr(:on_complete, :string, default: nil) attr(:rest, :global) slot(:start_trigger, required: true) slot(:pause_trigger, required: true) slot(:resume_trigger, required: true) slot(:reset_trigger, required: true) def timer(assigns) do assigns = assigns |> assign_new(:id, fn -> "timer-#{System.unique_integer([:positive])}" end) |> assign(:time_values, time_values(assigns.start_ms)) |> assign(:running, assigns.auto_start) |> assign(:paused, false) ~H"""