_= attribute and describe
what you want as JSON: an action, its roles, and a trigger. The element validates the JSON,
wires the trigger, and dispatches
lse:validated / lse:executed / lse:error events along the way.
trigger="click" — toggle .active on a sidebarClick the button. The element attaches its own listener; no _=, no onclick.
trigger.event sugar — add .highlightedSame effect, no trigger attribute. The element reads the wire-format trigger.event field — the form an LLM would most naturally emit.
.highlighted on clickactionValid JSON, but missing the required action field. The element fires lse:error and reveals its slot="error" child.
All lse:* events bubble. Watch the lifecycle.
<lse-intent> reads inline JSON from a child <script type="application/lse+json"> (or fetches it via src=).trigger attribute (or the JSON trigger.event sugar) wires a DOM listener. When it fires, the element delegates to window.hyperfixi.evalLSENode(node, this).lse:validated, lse:executed, lse:error.NO_RUNTIME warning diagnostic instead of executing.trigger="load" (default) — fire on connectedCallback.trigger="click" / any DOM event — wire addEventListener on the element.trigger="submit" — wire to the closest ancestor <form>; preventDefault is called.trigger="intersect" — fire once when the element scrolls into view (IntersectionObserver).trigger="manual" — never fire automatically; the caller invokes element.refresh().lse:error before any DOM mutation is attempted._=. Under the hood, the JSON deserializes to the same SemanticNode shape hyperscript compiles to — one execution model, two front-ends.src="/intents/foo.json", so intents can live in static files or be served from an API."action": "toggle" to "add" or "remove" and watch the diagnostics adapt.trigger="intersect" and a tall spacer above the element — it'll fire on scroll-in.<lse-intent src="/intents/toggle.json">._="on click toggle .active on #sidebar" — same effect, different ergonomics.