///|
/// Long press and the adjacent Help action replace hover, without nested buttons.
pub fn[C : @minimoon.IsChildren] sidebar_menu_button_with_tooltip(
scope : SidebarSurfaceScope,
id~ : String,
tooltip~ : String,
children : C,
target? : @minimoon.Route,
is_active? : Bool = false,
variant? : SidebarMenuButtonVariant = SidebarMenuButtonDefault,
size? : SidebarMenuButtonSize = SidebarMenuDefault,
disabled? : Bool = false,
aria_label? : String = "",
on_tap? : @minimoon.Cmd,
icon? : @minimoon.Node,
tooltip_side? : Side = Right,
tooltip_align? : Alignment = Center,
tooltip_side_offset? : Double = 4.0,
tooltip_align_offset? : Double = 0.0,
tooltip_show_arrow? : Bool = true,
class? : String = "",
) -> @minimoon.Node {
let eligible = sidebar_icon_only(scope) && !disabled && scope.owner.visible
let show = if eligible {
(scope.owner.send)(
ShowTooltip({
id,
side: tooltip_side,
align: tooltip_align,
gap: tooltip_side_offset,
offset: tooltip_align_offset,
bounds: None,
}),
)
} else {
@minimoon.none
}
let button = sidebar_menu_button(
scope,
id~,
event_key=id + "/action",
children,
target?,
is_active~,
variant~,
size~,
disabled~,
aria_label=if aria_label == "" { tooltip } else { aria_label },
on_tap?,
icon?,
class~,
)
let tip = match scope.owner.transient.tooltip {
Some(tip) if tip.id == id && eligible =>
@minimoon.layer(id=id + "-tooltip-layer", [
@minimoon.tap_view(
on_tap=(scope.owner.send)(CloseTooltip),
event_key=id + "/tooltip-dismiss",
style="position:fixed;left:0;right:0;top:0;bottom:0;",
@minimoon.nothing(),
),
ui_container(
"sidebar-tooltip",
id=id + "-tooltip",
class="mmui-surface",
style=surface_style(TooltipSurface, tip.bounds),
semantics=@minimoon.semantics(role=@minimoon.TooltipRole),
[
if tooltip_show_arrow {
@minimoon.span(semantics=@minimoon.semantics(hidden=true), "◆")
} else {
@minimoon.nothing()
},
@minimoon.text(tooltip),
@minimoon.button(
on_tap=(scope.owner.send)(CloseTooltip),
event_key=id + "/tooltip-close",
"Close",
),
],
),
])
_ => @minimoon.nothing()
}
@minimoon.fragment([
@minimoon.touch_view(
on_long_press=@minimoon.Emit(_ => show),
event_key=id + "/hint",
button,
),
if eligible {
@minimoon.button(
on_tap=show,
event_key=id + "/help",
semantics=@minimoon.semantics(label="Explain " + tooltip),
"?",
)
} else {
@minimoon.nothing()
},
tip,
])
}