import gleam/list import gleam/option.{type Option, None, Some} import gleam/string pub type PaintComponent { FillComponent StrokeComponent MarkerComponent } pub type PaintOrder = List(PaintComponent) pub fn paint_order_to_string(value: PaintOrder) -> String { value |> list.map(fn(comp) { case comp { FillComponent -> "fill" StrokeComponent -> "stroke" MarkerComponent -> "marker" } }) |> string.join(" ") } pub type Styles { Styles( fill: Option(String), stroke: Option(String), stroke_width: Option(Float), paint_order: Option(List(PaintComponent)), ) } pub fn new() { Styles(fill: None, stroke: None, stroke_width: None, paint_order: None) } pub fn with_fill(styles: Styles, fill: String) { Styles(..styles, fill: Some(fill)) } pub fn with_stroke(styles: Styles, stroke: String) { Styles(..styles, stroke: Some(stroke)) } pub fn with_stroke_width(styles: Styles, stroke_width: Float) { Styles(..styles, stroke_width: Some(stroke_width)) } pub fn with_paint_order(styles: Styles, paint_order: PaintOrder) { Styles(..styles, paint_order: Some(paint_order)) }