document-tabs
Builds Avatar Badge Button Checkbox CommandPalette ContextMenu DescriptionList Divider EmptyState Icon List Menu Popover ProgressBar Tabs Tag 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 document_tabs(window: &mut Window, cx: &mut App) -> AnyElement {
if !cx.has_global::<SceneDocumentTabs>() {
// An icon-only trigger still has to be nameable, so it carries the
// strip's own word for what moved into it.
let name = cx.strings().text(StringKey::TabMoreTabs);
let overflow = cx.new(|cx| {
Menu::new("scene.document-tabs.overflow", window, cx)
.trigger_icon(Icon::AltArrowDown)
.trigger_name(name)
});
cx.set_global(SceneDocumentTabs { overflow });
}
let overflow = cx.global::<SceneDocumentTabs>().overflow.clone();
let theme = cx.theme().clone();
stack(&theme)
.w(px(620.0))
.child(caption(
&theme,
"clean, unsaved, saving, save failed — three marks, and silence for the fourth",
))
.child(
Tabs::new("scene.document-tabs.editor")
.tabs([
TabItem::new("readme", "README.md").closable(true),
TabItem::new("main", "main.rs").dirty().closable(true),
TabItem::new("theme", "theme.json").saving().closable(true),
TabItem::new("notes", "notes.md")
.save_failed("The workspace is read-only.")
.closable(true),
])
.selected("main")
.on_select(|_, _, _| {})
.on_close(|_, _, _| {}),
)
.child(caption(
&theme,
"past the declared limit the rest go to a menu, which stays reachable from the keyboard",
))
.child(
Tabs::new("scene.document-tabs.overflowing")
.tabs([
TabItem::new("one", "adapter.rs").closable(true),
TabItem::new("two", "catalog.rs").dirty().closable(true),
TabItem::new("three", "harness.rs").closable(true),
TabItem::new("four", "registry.rs").closable(true),
TabItem::new("five", "transport.rs").dirty().closable(true),
])
.selected("two")
.overflow_after(3)
.overflow_menu(overflow)
.on_select(|_, _, _| {})
.on_close(|_, _, _| {}),
)
.into_any_element()
}