Packages
Multi-surface application runtime for Elixir. One TEA module renders to terminal, browser (LiveView), SSH, and MCP (agents). 30+ widgets, flexbox + CSS grid, AI agent runtime, distributed swarm with CRDTs, time-travel debugging, session recording, sandboxed REPL, and agentic commerce.
Current section
Files
Jump to
Current section
Files
examples/scripts/event_handling.exs
# This example demonstrates event handling using the Raxol.UI.Components.Input.Button and Raxol.UI.Components.Input.TextField components.
defmodule Raxol.Docs.Guides.Examples.Interactive.EventHandlingTest do
use Raxol.Core.Runtime.Application
import Raxol.View.Elements
# Define the application state (model)
defmodule State do
defstruct count: 0,
text_value: ""
end
@impl true
def init(_opts) do
# Initial state
%State{}
end
@impl true
def update(message, model) do
case message do
# Handle the :on_click event from the button
{:button_clicked} ->
IO.puts("Increment button clicked!")
%State{model | count: model.count + 1}
# Handle the :on_change event from the text input
{:text_changed, new_value} ->
IO.puts("Text input changed: #{new_value}")
%State{model | text_value: new_value}
# Catch-all for other messages
_ ->
model
end
end
@impl true
def view(model = %State{}) do
view do
column(
gap: 15,
padding: 10,
style: "border: 1px solid #ccc; width: 300px;"
) do
# Display the current count
text(
content: "Current Count: #{model.count}",
style: "font-size: 1.2em;"
)
# Button that sends a :button_clicked message on click
button(
content: "Increment",
# Send this tuple as the message
on_click: {:button_clicked},
style: :primary
)
# Text input that sends :text_changed message on change
text_input(
id: "my-text-input",
placeholder: "Type something...",
value: model.text_value,
# Send {:text_changed, new_value}
on_change: {:text_changed}
)
# Display the current text value
text(content: "You typed: #{model.text_value}")
end
end
end
# Function to run the example directly
def main do
Raxol.start_link(__MODULE__, [])
# For CI/test/demo: sleep for 2 seconds, then exit. Adjust as needed.
Process.sleep(2000)
end
end
# To run this example: mix run -e "Raxol.Docs.Guides.Examples.Interactive.EventHandlingTest.main()"
# (Assuming Raxol is a dependency or mix project is set up)