use leptos::prelude::*;
use leptos::text_prop::TextProp;
use lepticons::{Icon, LucideGlyph};
#[component]
#[allow(clippy::too_many_arguments)]
pub fn MruStrip(
mru: RwSignal<Vec<LucideGlyph>>,
on_select: Callback<LucideGlyph>,
#[prop(into, optional)]
class: Option<TextProp>,
#[prop(into, optional)]
header_class: Option<TextProp>,
#[prop(into, optional)]
item_class: Option<TextProp>,
#[prop(into, optional)]
items_class: Option<TextProp>,
#[prop(into, optional)]
header_text: Option<TextProp>,
#[prop(default = true)]
show_header: bool,
#[prop(into, optional)]
icon_size: Option<TextProp>,
#[prop(into, optional)]
icon_stroke: Option<TextProp>,
#[prop(into, optional)]
icon_stroke_width: Option<TextProp>,
#[prop(into, optional)]
icon_fill: Option<TextProp>,
) -> impl IntoView {
let header_text = header_text.unwrap_or_else(|| "Recently used".into());
let icon_size = icon_size.unwrap_or_else(|| "20".into());
let icon_stroke = icon_stroke.unwrap_or_else(|| "currentColor".into());
let icon_stroke_width = icon_stroke_width.unwrap_or_else(|| "1.5".into());
let icon_fill = icon_fill.unwrap_or_else(|| "none".into());
let has_class = class.is_some();
let has_header_class = header_class.is_some();
let has_item_class = item_class.is_some();
let has_items_class = items_class.is_some();
view! {
<div class=move || class.as_ref().map(|c| c.get().to_string()).unwrap_or_default()
style=move || if has_class {
""
} else {
"padding:0.25rem 0.75rem 0.5rem;\
border-bottom:1px solid var(--lp-border,#e5e5e5)"
}>
{show_header.then(|| {
let header_class = header_class.clone();
view! {
<div class=move || header_class.as_ref().map(|c| c.get().to_string()).unwrap_or_default()
style=move || if has_header_class {
""
} else {
"font-size:0.6875rem;font-weight:500;letter-spacing:0.04em;\
text-transform:uppercase;\
color:var(--lp-text-muted,#999);\
margin-bottom:0.25rem"
}>
{move || header_text.get().to_string()}
</div>
}
})}
<div role="list"
class=move || items_class.as_ref().map(|c| c.get().to_string()).unwrap_or_default()
style=move || if has_items_class {
""
} else {
"display:flex;flex-wrap:wrap;gap:0.25rem"
}>
{move || mru.get().into_iter().map(|icon| {
let label = icon.kebab_name();
let item_class_inner = item_class.clone();
let size = icon_size.clone();
let stroke = icon_stroke.clone();
let stroke_width = icon_stroke_width.clone();
let fill = icon_fill.clone();
view! {
<div role="listitem"
aria-label=label.clone()
title=label
class=move || item_class_inner.as_ref().map(|c| c.get().to_string()).unwrap_or_default()
style=move || if has_item_class {
""
} else {
"padding:0.375rem;\
border-radius:var(--lp-radius,0.5rem);\
background:var(--lp-bg,#f5f5f5);\
cursor:pointer;display:flex"
}
tabindex="0"
on:click=move |_| on_select.run(icon)
on:keydown=move |ev: web_sys::KeyboardEvent| {
if ev.key() == "Enter" || ev.key() == " " {
ev.prevent_default();
on_select.run(icon);
}
}>
<Icon glyph=icon
size=move || size.get()
stroke=move || stroke.get()
stroke_width=move || stroke_width.get()
fill=move || fill.get()
/>
</div>
}
}).collect::<Vec<_>>()}
</div>
</div>
}
}