fix(runtime): show transport failures in app error outlets

Make failed hemx requests visibly recoverable by updating root-scoped data-hemx-error outlets while preserving fail-closed non-2xx handling and inspectable hemx:error events. The v0 generated-app exemplar now includes a transport error outlet alongside generated field-error targets.

req: runtime/005

req: examples/001

req: canonical_authoring/003
This commit is contained in:
slhx agent
2026-06-22 22:26:33 +02:00
parent f1aa232c94
commit de6ecd469f
7 changed files with 31 additions and 4 deletions
+6 -1
View File
@@ -133,7 +133,7 @@ impl Hemplate for Todos {
fn render_into(&self, buf: &mut String) -> Result<(), hemplate::error::HemplateError> {
use std::fmt::Write as _;
buf.push_str("<section data-hemx-root=\"todos\">\n <form data-hemx-handle=\"add_todo\" data-hemx-form=\"new_todo\">\n <label>New todo\n <input name=\"title\" required=\"required\">\n </label>\n <button type=\"submit\">Add</button>\n <p data-hemx-error-for=\"title\"></p>\n </form>\n\n <p data-hemx-slot=\"summary\">");
buf.push_str("<section data-hemx-root=\"todos\">\n <form data-hemx-handle=\"add_todo\" data-hemx-form=\"new_todo\">\n <label>New todo\n <input name=\"title\" required=\"required\">\n </label>\n <button type=\"submit\">Add</button>\n <p data-hemx-error-for=\"title\"></p>\n </form>\n\n <p data-hemx-error role=\"status\" hidden=\"hidden\"></p>\n\n <p data-hemx-slot=\"summary\">");
write!(buf, "{}", hemplate::HtmlEscape(&self.summary))?;
buf.push_str("</p>\n <p data-hemx-slot=\"notice\">");
write!(buf, "{}", hemplate::HtmlEscape(&self.notice))?;
@@ -627,6 +627,11 @@ mod tests {
2,
"add and rename forms expose generated field-error targets"
);
assert_eq!(
document.select(&selector("[data-hemx-error]")).count(),
1,
"the app exposes one root-scoped transport error outlet"
);
}
// req: canonical_authoring/003 req: test/005
+1
View File
@@ -4,6 +4,7 @@
<button type="submit">Add</button>
<p data-hemx-error-for="title"></p>
</form>
<p data-hemx-error role="status" hidden="hidden"></p>
<p data-hemx-slot="summary">{+ self.summary +}</p>
<p data-hemx-slot="notice">{+ self.notice +}</p>
<ul data-hemx-slot="todo_row">