use std::sync::Arc;
use chrono::NaiveDate;
use leptos::prelude::*;
#[component]
pub fn CalendarWeekdayHeader(
#[prop(optional)]
labels: Option<[String; 7]>,
) -> impl IntoView {
let labels = labels
.unwrap_or_else(|| ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"].map(String::from));
view! {
<div class="orbital-calendar__weekdays" role="row">
{labels.into_iter().map(|label| view! {
<span class="orbital-calendar__weekday" role="columnheader">{label}</span>
}).collect_view()}
</div>
}
}
#[derive(Clone)]
pub struct CalendarDayProps {
pub date: NaiveDate,
pub day_number: u32,
pub weekday_label: Option<&'static str>,
pub selected: bool,
pub today: bool,
pub other_month: bool,
pub disabled: bool,
pub aria_label: String,
pub tabindex: &'static str,
pub on_select: Callback<()>,
pub on_focus: Callback<()>,
}
#[derive(Clone)]
pub struct CalendarMonthButtonProps {
pub month: u32,
pub label: String,
pub selected: bool,
pub on_select: Callback<()>,
}
pub type CalendarDayRenderer = Arc<dyn Fn(CalendarDayProps) -> AnyView + Send + Sync>;
pub type CalendarMonthButtonRenderer =
Arc<dyn Fn(CalendarMonthButtonProps) -> AnyView + Send + Sync>;
pub fn default_calendar_day(props: CalendarDayProps) -> impl IntoView {
view! {
<div
class="orbital-calendar-item"
class=("orbital-calendar-item--other-month", props.other_month)
class=("orbital-calendar-item--today", props.today)
class=("orbital-calendar-item--selected", props.selected)
class=("orbital-calendar-item--disabled", props.disabled)
role="gridcell"
tabindex=props.tabindex
aria-label=props.aria_label
aria-selected=props.selected
aria-disabled=props.disabled
on:click=move |_| props.on_select.run(())
on:focus=move |_| props.on_focus.run(())
>
<div class="orbital-calendar-item__header">
<span class="orbital-calendar-item__header-day">{props.day_number}</span>
</div>
<div class="orbital-calendar-item__bar"></div>
</div>
}
}
pub fn default_calendar_month_button(props: CalendarMonthButtonProps) -> impl IntoView {
view! {
<button
type="button"
class="orbital-date-picker__month-button"
class=("orbital-date-picker__month-button--selected", props.selected)
on:click=move |_| props.on_select.run(())
>
{props.label}
</button>
}
}