#!/usr/bin/env -S uv run --script # /// script # dependencies = [ # "nicegui==3.16.0", # ] # /// from datetime import UTC from datetime import datetime from nicegui import events from nicegui import ui OPTIONS = { "python": "Python", "typescript": "TypeScript", "rust": "Rust", } with ui.card().classes("w-140 max-w-full"): ui.label("Select event mechanics").classes("text-xl font-semibold") event_log = ui.log(max_lines=12).classes("w-full h-64") def record(event_name: str, payload: object) -> None: timestamp = datetime.now(UTC).astimezone().strftime("%H:%M:%S") event_log.push(f"{timestamp} {event_name}: {payload!r}") def handle_change(event: events.ValueChangeEventArguments) -> None: record("on_change event.value", event.value) def handle_model_update(event: events.GenericEventArguments) -> None: record("js_handler -> handler event.args", event.args) language = ( ui.select( options=OPTIONS, value="python", label="Language", on_change=handle_change, with_input=True, clearable=True, ) .props("outlined options-dense") .classes("w-full text-h6") ) language.on("popup-show", lambda: record("popup-show", None), args=[]) language.on("popup-hide", lambda: record("popup-hide", None), args=[]) # This only fires when the value is changed from the browser side (not from the button) language.on( "update:model-value", handler=handle_model_update, js_handler="(...args) => emit(...args)", ) with ui.row().classes("w-full justify-end"): ui.button("Set Rust", on_click=lambda: language.set_value("rust")) ui.button("Clear log", on_click=event_log.clear).props("flat") if __name__ in {"__main__", "__mp_main__"}: ui.run(port=8888, reload=True)