Current section
Files
Jump to
Current section
Files
src/m3e/drawer_container.gleam
//// DrawerContainer is a container for one or two sliding drawers.
////
//// This file was generated:
//// By: m3e/generator version 0.1.0
//// At: 2026-05-05T14:38:23+10:00
////
//// DO NOT EDIT
////
import gleam/list
import lustre/attribute.{type Attribute}
import lustre/element.{type Element}
import m3e/attr
import m3e/drawer_mode.{type DrawerMode}
// --- Types ---
/// DrawerContainer is a View Model for this component
///
/// ## Fields:
///
/// - end: Whether the end drawer is open.
/// - end_mode: The behavior mode of the end drawer.
/// - end_divider: Whether to show a divider between the end drawer and content for `side` mode.
/// - start: Whether the start drawer is open.
/// - start_mode: The behavior mode of the start drawer.
/// - start_divider: Whether to show a divider between the start drawer and content for `side` mode.
///
pub opaque type DrawerContainer {
DrawerContainer(
end: End,
end_mode: DrawerMode,
end_divider: EndDivider,
start: Start,
start_mode: DrawerMode,
start_divider: StartDivider,
)
}
/// End is whether the end drawer is open.
///
pub type End {
IsEnd
IsNotEnd
}
/// EndDivider is whether to show a divider between the end drawer and content for `side` mode.
///
pub type EndDivider {
IsEndDivider
IsNotEndDivider
}
/// Start is whether the start drawer is open.
///
pub type Start {
IsStart
IsNotStart
}
/// StartDivider is whether to show a divider between the start drawer and content for `side` mode.
///
pub type StartDivider {
IsStartDivider
IsNotStartDivider
}
// --- Defaults ---
pub const default_end: End = IsNotEnd
pub const default_end_mode: DrawerMode = drawer_mode.Side
pub const default_end_divider: EndDivider = IsNotEndDivider
pub const default_start: Start = IsNotStart
pub const default_start_mode: DrawerMode = drawer_mode.Side
pub const default_start_divider: StartDivider = IsNotStartDivider
/// Slots are used in child elements to insert content into this component
///
pub type Slot {
Start
// Renders the start drawer.
End
// Renders the end drawer.
}
// --- Configuration ---
/// Config is a public record for configuring this component.
///
pub type Config {
Config(
end: End,
end_mode: DrawerMode,
end_divider: EndDivider,
start: Start,
start_mode: DrawerMode,
start_divider: StartDivider,
)
}
/// default_config is the default configuration for this component.
///
pub fn default_config() -> Config {
Config(
end: IsNotEnd,
end_mode: drawer_mode.Side,
end_divider: IsNotEndDivider,
start: IsNotStart,
start_mode: drawer_mode.Side,
start_divider: IsNotStartDivider,
)
}
// --- Constructors ---
/// from_config creates a new DrawerContainer from the given configuration.
///
pub fn from_config(config: Config) -> DrawerContainer {
DrawerContainer(
end: config.end,
end_mode: config.end_mode,
end_divider: config.end_divider,
start: config.start,
start_mode: config.start_mode,
start_divider: config.start_divider,
)
}
/// new creates a new DrawerContainer with the default configuration.
///
pub fn new() -> DrawerContainer {
from_config(default_config())
}
// --- Setters ---
/// end sets the value of end for this DrawerContainer.
///
pub fn end(record: DrawerContainer, end: End) -> DrawerContainer {
DrawerContainer(..record, end: end)
}
/// end_mode sets the value of end_mode for this DrawerContainer.
///
pub fn end_mode(
record: DrawerContainer,
end_mode: DrawerMode,
) -> DrawerContainer {
DrawerContainer(..record, end_mode: end_mode)
}
/// end_divider sets the value of end_divider for this DrawerContainer.
///
pub fn end_divider(
record: DrawerContainer,
end_divider: EndDivider,
) -> DrawerContainer {
DrawerContainer(..record, end_divider: end_divider)
}
/// start sets the value of start for this DrawerContainer.
///
pub fn start(record: DrawerContainer, start: Start) -> DrawerContainer {
DrawerContainer(..record, start: start)
}
/// start_mode sets the value of start_mode for this DrawerContainer.
///
pub fn start_mode(
record: DrawerContainer,
start_mode: DrawerMode,
) -> DrawerContainer {
DrawerContainer(..record, start_mode: start_mode)
}
/// start_divider sets the value of start_divider for this DrawerContainer.
///
pub fn start_divider(
record: DrawerContainer,
start_divider: StartDivider,
) -> DrawerContainer {
DrawerContainer(..record, start_divider: start_divider)
}
// --- Renderers ---
/// render creates a Lustre Element for a DrawerContainer
///
pub fn render(
model: DrawerContainer,
attributes: List(Attribute(msg)),
children: List(Element(msg)),
) -> Element(msg) {
element.element(
"m3e-drawer-container",
list.flatten([
[
attr.boolean("end", model.end == IsEnd),
attr.with_default(
"end-mode",
drawer_mode.to_string(model.end_mode),
drawer_mode.to_string(default_end_mode),
),
attr.boolean("end-divider", model.end_divider == IsEndDivider),
attr.boolean("start", model.start == IsStart),
attr.with_default(
"start-mode",
drawer_mode.to_string(model.start_mode),
drawer_mode.to_string(default_start_mode),
),
attr.boolean("start-divider", model.start_divider == IsStartDivider),
],
attributes,
])
|> list.filter(fn(a) { a != attribute.none() }),
children,
)
}
/// render_config creates a Lustre Element from a DrawerContainer Config
///
pub fn render_config(
c: Config,
attributes: List(Attribute(msg)),
children: List(Element(msg)),
) -> Element(msg) {
render(from_config(c), attributes, children)
}
/// slot returns a Lustre Attribute(msg) for the given slot name
///
pub fn slot(s: Slot) -> Attribute(msg) {
case s {
Start -> attribute.attribute("slot", "start")
End -> attribute.attribute("slot", "end")
}
}