///|
pub(all) enum MarkerVariant {
MarkerDefault
MarkerSeparator
MarkerBorder
} derive(Debug, Eq)
///|
const MarkerBaseStyle : String = "position:relative;display:flex;width:100%;min-height:1rem;align-items:center;gap:0.5rem;color:var(--rui-marker-fg,var(--rui-muted-foreground,oklch(0.556 0 0)));box-shadow:var(--rui-marker-shadow,none);font-size:0.875rem;line-height:1.25rem;text-align:start;outline:none"
///|
fn marker_variant_value(variant : MarkerVariant) -> String {
match variant {
MarkerDefault => "default"
MarkerSeparator => "separator"
MarkerBorder => "border"
}
}
///|
fn marker_variant_style(variant : MarkerVariant) -> String {
match variant {
MarkerDefault => ""
MarkerSeparator => "justify-content:center"
MarkerBorder =>
"border-bottom:1px solid var(--rui-border,oklch(0.922 0 0));padding-bottom:0.5rem"
}
}
///|
pub fn[C : @html.IsChildren] marker(
variant? : MarkerVariant = MarkerDefault,
id? : String,
class? : String,
title? : String,
attrs? : @html.Attrs,
style? : Array[String] = [],
children : C,
) -> @html.Html {
@html.div(
id?,
class?,
title?,
attrs=ui_attrs(attrs)
.data_set("slot", "marker")
.data_set("variant", marker_variant_value(variant)),
style=ui_styles([MarkerBaseStyle, marker_variant_style(variant)], style),
children,
)
}
///|
#cfg(target="js")
fn marker_bind_disabled_link(attrs : @html.Attrs, disabled : Bool) -> Unit {
if disabled {
ignore(
attrs.on_click(event => {
event.prevent_default()
@cmd.none
}),
)
}
}
///|
#cfg(not(target="js"))
fn marker_bind_disabled_link(attrs : @html.Attrs, disabled : Bool) -> Unit {
ignore((attrs, disabled))
}
///|
/// Render the marker `asChild` anchor path as a native, focusable link.
pub fn[C : @html.IsChildren] marker_link(
href~ : String,
variant? : MarkerVariant = MarkerDefault,
disabled? : Bool = false,
aria_label? : String,
target? : @html.Target = Self,
rel? : String,
download? : String,
escape? : Bool = false,
on_click? : @cmd.Cmd,
id? : String,
class? : String,
title? : String,
attrs? : @html.Attrs,
style? : Array[String] = [],
children : C,
) -> @html.Html {
let element_attrs = ui_attrs(attrs)
.data_set("slot", "marker")
.data_set("variant", marker_variant_value(variant))
if aria_label is Some(label) {
ignore(element_attrs.aria_label(label))
}
if disabled {
ignore(
element_attrs.aria_disabled("true").data_set("disabled", "").tabindex(-1),
)
} else if on_click is Some(command) {
ignore(element_attrs.on_click(_ => command))
}
marker_bind_disabled_link(element_attrs, disabled)
@html.a(
href~,
target~,
rel?,
download?,
id?,
class?,
title?,
attrs=element_attrs,
style=ui_styles(
[
UiBoxSizing,
UiFontSans,
UiTransition,
MarkerBaseStyle,
marker_variant_style(variant),
"text-decoration:underline;text-underline-offset:3px;cursor:pointer",
ui_disabled_style(disabled),
],
style,
),
children,
escape~,
)
}
///|
pub fn[C : @html.IsChildren] marker_icon(
id? : String,
class? : String,
title? : String,
attrs? : @html.Attrs,
style? : Array[String] = [],
children : C,
) -> @html.Html {
@html.span(
id?,
class?,
title?,
attrs=ui_attrs(attrs).data_set("slot", "marker-icon").aria_hidden("true"),
style=ui_styles(
[
"display:inline-flex;width:1rem;height:1rem;flex-shrink:0;align-items:center;justify-content:center;--rui-icon-size:1rem",
],
style,
),
children,
)
}
///|
pub fn[C : @html.IsChildren] marker_content(
id? : String,
class? : String,
title? : String,
attrs? : @html.Attrs,
style? : Array[String] = [],
children : C,
) -> @html.Html {
@html.span(
id?,
class?,
title?,
attrs=ui_attrs(attrs).data_set("slot", "marker-content"),
style=ui_styles(["min-width:0;overflow-wrap:anywhere"], style),
children,
)
}