lily/event

Event handlers attach browser events to DOM elements using CSS selectors. Each handler produces a message that gets sent to the Store.

Handlers target elements using standard CSS selector strings and use event delegation for dynamic elements (e.g., on_click with data-msg attributes). They’re set up once and persist until page unload

import lily/event

pub fn main() {
  store.new(Model(count: 0), with: update)
  |> component.mount("#app", to_html: element.to_string, view: app)
  |> event.on_click(selector: "#increment", handler: fn() { Increment })
  |> event.on_click(selector: "#decrement", handler: fn() { Decrement })
  |> event.on_input(selector: "#name", decoder: decode_name_input)
  |> client.start
}

fn decode_name_input(event: Dynamic) -> Result(Message, Nil) {
  use target <- result.try(dynamic.field("target", dynamic.dynamic)(event))
  use value <- result.try(dynamic.field("value", dynamic.string)(target))
  Ok(SetName(value))
}

All event handlers are JavaScript-only (@target(javascript)).

Values

pub fn on_blur(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires when an element loses focus.

pub fn on_change(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(String) -> message,
) -> client.Runtime(model, message)

Fires when an input value changes (after focus is lost). For real-time updates, use on_input instead.

pub fn on_click(
  runtime: client.Runtime(model, message),
  selector selector: String,
  decoder decoder: fn(String) -> Result(message, Nil),
) -> client.Runtime(model, message)

Fires on click events using event delegation with data-msg attributes. The decoder receives the data-msg attribute value and should return the corresponding message. Elements must have a data-msg attribute to trigger this handler.

pub fn on_context_menu(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires when the context menu is opened (usually right-click). Provides mouse coordinates (x, y) relative to the viewport.

pub fn on_copy(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires when text is copied to the clipboard.

pub fn on_cut(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires when text is cut to the clipboard.

pub fn on_double_click(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires on double-click events.

pub fn on_drag(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires repeatedly while an element is being dragged. Provides current mouse coordinates (x, y). Note: This fires many times during a drag operation, consider throttling if performing expensive operations.

pub fn on_drag_end(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires once when a drag operation ends (mouse released).

pub fn on_drag_over(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires repeatedly when a dragged element is over a valid drop target. Provides mouse coordinates (x, y). Note: You may need to call event.preventDefault() in the browser to enable dropping.

pub fn on_drag_start(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires once when a drag operation starts. Provides initial mouse coordinates (x, y).

pub fn on_drop(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires when a dragged element is dropped on a valid drop target. Provides drop coordinates (x, y).

pub fn on_focus(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires when an element receives focus.

pub fn on_input(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(String) -> message,
) -> client.Runtime(model, message)

Fires immediately when an input value changes. For delayed updates (after blur), use on_change instead.

pub fn on_key_down(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(String) -> message,
) -> client.Runtime(model, message)

Fires when a key is pressed down. Receives the key name (e.g., “Enter”, “ArrowUp”, “a”).

pub fn on_key_up(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(String) -> message,
) -> client.Runtime(model, message)

Fires when a key is released. Receives the key name (e.g., “Enter”, “ArrowUp”, “a”).

pub fn on_mouse_down(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires when a mouse button is pressed down. Provides mouse coordinates (x, y) relative to the viewport.

pub fn on_mouse_enter(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires when the mouse enters an element’s boundary. Does not bubble.

pub fn on_mouse_leave(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires when the mouse leaves an element’s boundary. Does not bubble.

pub fn on_mouse_move(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires repeatedly while the mouse moves over an element. Provides current mouse coordinates (x, y). Note: This can fire very frequently, consider throttling for expensive operations.

pub fn on_mouse_up(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires when a mouse button is released. Provides mouse coordinates (x, y) relative to the viewport.

pub fn on_paste(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires when text is pasted from the clipboard.

pub fn on_pointer_down(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires when a pointer (mouse, pen, touch) is pressed down. Provides pointer coordinates (x, y). Pointer events unify mouse, touch, and pen input.

pub fn on_pointer_move(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires repeatedly while a pointer moves over an element. Provides current pointer coordinates (x, y). Pointer events unify mouse, touch, and pen input.

pub fn on_pointer_up(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires when a pointer (mouse, pen, touch) is released. Provides pointer coordinates (x, y). Pointer events unify mouse, touch, and pen input.

pub fn on_resize(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires when an element is resized. Typically used on window with selector “window”.

pub fn on_scroll(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires when an element’s scroll position changes.

pub fn on_submit(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires when a form is submitted. Prevents the browser’s default form submission behavior automatically.

pub fn on_touch_end(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn() -> message,
) -> client.Runtime(model, message)

Fires when all touches are removed from the screen.

pub fn on_touch_move(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires repeatedly while a touch point moves across the screen. Provides touch coordinates (x, y). Note: This can fire very frequently.

pub fn on_touch_start(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Int, Int) -> message,
) -> client.Runtime(model, message)

Fires when a touch point is placed on the screen. Provides initial touch coordinates (x, y).

pub fn on_wheel(
  runtime: client.Runtime(model, message),
  selector selector: String,
  handler handler: fn(Float, Float) -> message,
) -> client.Runtime(model, message)

Fires when the mouse wheel is scrolled. Provides scroll deltas (delta_x, delta_y) indicating scroll direction and amount.

Search Document