feat(runtime): add tiny trigger timing conventions

Add boring runtime-level trigger timing primitives for delay, revealed, and interval while keeping them as attribute conventions rather than core effects or plugin surfaces. Promote lazy-load, infinite-scroll, progress-bar, value-select, and reset-user-input in examples/html_examples to runnable hemx patterns with exact htmx slugs and generated resources.

req: convention/001

req: convention/003

req: convention/005

req: htmx_equivalents/001

req: htmx_equivalents/002

req: examples/001
This commit is contained in:
slhx agent
2026-06-23 07:51:43 +02:00
parent 0922a46e21
commit cd7f64e5a3
9 changed files with 376 additions and 23 deletions
+19 -6
View File
@@ -101,19 +101,32 @@ fn runtime_interval_dispatch_avoids_duplicate_timers() {
let source = hemx_js::RUNTIME_JS;
assert!(source.contains("const everyTimers = new WeakMap()"));
assert!(source.contains("forEachElement(root, (el) =>"));
assert!(source.contains("!el.hasAttribute(\"data-hemx-every\") || everyTimers.has(el)"));
assert!(
source.contains("if (!el.hasAttribute(\"data-hemx-every\") || everyTimers.has(el)) return")
);
assert!(source.contains("data-hemx-interval"));
assert!(source.contains(
"setInterval(() => document.contains(el) ? send(el, \"every\") : stopPolling(el), ms)"
"eventName = el.hasAttribute(\"data-hemx-interval\") ? \"interval\" : \"every\""
));
assert!(source.contains(
"setInterval(() => document.contains(el) ? send(el, eventName) : stopPolling(el), ms)"
));
assert!(source.contains("function stopPolling(el)"));
assert!(source.contains("clearInterval(everyTimers.get(el))"));
assert!(source.contains("everyTimers.delete(el)"));
}
#[test]
fn runtime_supports_tiny_delay_and_revealed_scheduling() {
// req: convention/001 req: convention/003 req: convention/005
let source = hemx_js::RUNTIME_JS;
assert!(source.contains("data-hemx-delay"));
assert!(source.contains("setTimeout(() => send(el, eventName, source), delay)"));
assert!(source.contains("const revealObservers = new WeakMap()"));
assert!(source.contains("const revealed = new WeakSet()"));
assert!(source.contains("data-hemx-revealed"));
assert!(source.contains("typeof IntersectionObserver === \"undefined\""));
assert!(source.contains("schedule(entry.target, \"revealed\")"));
}
#[test]
fn runtime_toggles_pending_conventions_around_requests() {
// req: convention/007 req: convention/008