Current section
Files
Jump to
Current section
Files
src/m3e/menu.gleam
//// Menu is presents a list of choices on a temporary surface.
////
//// This file was generated by m3e/generator
////
//// DO NOT EDIT
////
import gleam/list
import lustre/attribute.{type Attribute}
import lustre/element.{type Element}
import m3e/attr
import m3e/menu_position_x.{type MenuPositionX}
import m3e/menu_position_y.{type MenuPositionY}
import m3e/menu_variant.{type MenuVariant}
// --- Types ---
/// Menu is a View Model for this component
///
/// ## Fields:
///
/// - position_x: The position of the menu, on the x-axis.
/// - position_y: The position of the menu, on the y-axis.
/// - variant: The appearance variant of the menu.
/// - submenu: A value indicating whether the menu is a submenu.
///
pub opaque type Menu {
Menu(
position_x: MenuPositionX,
position_y: MenuPositionY,
variant: MenuVariant,
submenu: Submenu,
)
}
/// Submenu is a value indicating whether the menu is a submenu.
///
pub type Submenu {
IsSubmenu
IsNotSubmenu
}
// --- Defaults ---
pub const default_position_x: MenuPositionX = menu_position_x.After
pub const default_position_y: MenuPositionY = menu_position_y.Below
pub const default_variant: MenuVariant = menu_variant.Standard
pub const default_submenu: Submenu = IsNotSubmenu
// --- Configuration ---
/// Config is a public record for configuring this component.
///
pub type Config {
Config(
position_x: MenuPositionX,
position_y: MenuPositionY,
variant: MenuVariant,
submenu: Submenu,
)
}
/// default_config is the default configuration for this component.
///
pub fn default_config() -> Config {
Config(
position_x: menu_position_x.After,
position_y: menu_position_y.Below,
variant: menu_variant.Standard,
submenu: IsNotSubmenu,
)
}
// --- Constructors ---
/// from_config creates a new Menu from the given configuration.
///
pub fn from_config(config: Config) -> Menu {
Menu(
position_x: config.position_x,
position_y: config.position_y,
variant: config.variant,
submenu: config.submenu,
)
}
/// new creates a new Menu with the default configuration.
///
pub fn new() -> Menu {
from_config(default_config())
}
// --- Setters ---
/// position_x sets the value of position_x for this Menu.
///
pub fn position_x(record: Menu, position_x: MenuPositionX) -> Menu {
Menu(..record, position_x: position_x)
}
/// position_y sets the value of position_y for this Menu.
///
pub fn position_y(record: Menu, position_y: MenuPositionY) -> Menu {
Menu(..record, position_y: position_y)
}
/// variant sets the value of variant for this Menu.
///
pub fn variant(record: Menu, variant: MenuVariant) -> Menu {
Menu(..record, variant: variant)
}
/// submenu sets the value of submenu for this Menu.
///
pub fn submenu(record: Menu, submenu: Submenu) -> Menu {
Menu(..record, submenu: submenu)
}
// --- Renderers ---
/// render creates a Lustre Element for a Menu
///
pub fn render(
model: Menu,
attributes: List(Attribute(msg)),
children: List(Element(msg)),
) -> Element(msg) {
element.element(
"m3e-menu",
list.flatten([
[
attr.with_default(
"position-x",
menu_position_x.to_string(model.position_x),
menu_position_x.to_string(default_position_x),
),
attr.with_default(
"position-y",
menu_position_y.to_string(model.position_y),
menu_position_y.to_string(default_position_y),
),
attr.with_default(
"variant",
menu_variant.to_string(model.variant),
menu_variant.to_string(default_variant),
),
attr.boolean("submenu", model.submenu == IsSubmenu),
],
attributes,
])
|> list.filter(fn(a) { a != attribute.none() }),
children,
)
}
/// render_config creates a Lustre Element from a Menu Config
///
pub fn render_config(
c: Config,
attributes: List(Attribute(msg)),
children: List(Element(msg)),
) -> Element(msg) {
render(from_config(c), attributes, children)
}