failure-panel
Builds DescriptionList FailurePanel List Timeline


The code that drew it
A still frame holds a repeating animation at its first frame and a one-shot at its last, because a still of a moving thing is not reproducible. Run the gallery to review motion.
fn failure_panel(_window: &mut Window, cx: &mut App) -> AnyElement {
let theme = cx.theme().clone();
// A failure, not a refusal. Retrying a refusal would only be refused
// again, so the retry here is offered against something that can succeed
// on a second attempt; refusals are shown by ToolCallCard instead.
let failed: Result<(), &str> = Err("The runs service did not respond.");
stack(&theme)
.w(px(560.0))
.child(caption(
&theme,
"the host's own words, kept on screen; the retry belongs to the host",
))
.children(
FailurePanel::from_result("scene.failure.query", &failed).map(|panel| {
panel
.title("Runs")
.detail("The connection timed out after 30 seconds.")
.attempts(3)
.on_retry(|_, _| {})
}),
)
.into_any_element()
}