///|
pub fn[Msg, NextMsg] View::map(
  self : View[Msg],
  map : (Msg) -> NextMsg,
) -> View[NextMsg] {
  { adapter: self.adapter.map(map) }
}

///|
pub fn[Msg] View::key(self : View[Msg], value : String) -> View[Msg] {
  self.apply_modifier(KeyModifier::{ key: Key::new(value) }.to_any_modifier())
}

///|
pub fn[Msg] View::font(self : View[Msg], font : FontSpec) -> View[Msg] {
  self.apply_modifier(FontModifier::{ font, }.to_any_modifier())
}

///|
pub fn[Msg] View::foreground(self : View[Msg], color : Color) -> View[Msg] {
  self.apply_modifier(ForegroundModifier::{ color, }.to_any_modifier())
}

///|
pub fn[Msg] View::title(self : View[Msg]) -> View[Msg] {
  let theme = Theme::neutral()
  self.font(theme.typography.title)
}

///|
pub fn[Msg] View::caption(self : View[Msg]) -> View[Msg] {
  let theme = Theme::neutral()
  self.font(theme.typography.caption)
}

///|
pub fn[Msg] View::mono(self : View[Msg]) -> View[Msg] {
  let theme = Theme::neutral()
  self.font({ ..theme.typography.body, families: FontFamilyStack::monospace() })
}

///|
pub fn[Msg] View::background(self : View[Msg], color : Color) -> View[Msg] {
  self.background_brush(Brush::solid(color))
}

///|
pub fn[Msg] View::background_brush(
  self : View[Msg],
  brush : Brush,
) -> View[Msg] {
  self.apply_modifier(BackgroundModifier::{ brush, }.to_any_modifier())
}

///|
pub fn[Msg] View::corner_radius(self : View[Msg], radius : Double) -> View[Msg] {
  self.apply_modifier(CornerRadiusModifier::{ radius, }.to_any_modifier())
}

///|
pub fn[Msg] View::opacity(self : View[Msg], opacity : Double) -> View[Msg] {
  self.apply_modifier(OpacityModifier::{ opacity, }.to_any_modifier())
}

///|
pub fn[Msg] View::shadow(self : View[Msg], style : ShadowStyle) -> View[Msg] {
  self.apply_modifier(ShadowModifier::{ style, }.to_any_modifier())
}

///|
pub fn[Msg] View::border(self : View[Msg], style : BorderStyle) -> View[Msg] {
  self.apply_modifier(BorderModifier::{ style, }.to_any_modifier())
}

///|
pub fn[Msg] View::offset(
  self : View[Msg],
  dx? : Double = 0.0,
  dy? : Double = 0.0,
) -> View[Msg] {
  self.apply_modifier(OffsetModifier::{ dx, dy }.to_any_modifier())
}

///|
pub fn[Msg] View::clip(self : View[Msg]) -> View[Msg] {
  self.apply_modifier(ClipModifier::{  }.to_any_modifier())
}

///|
pub fn[Msg] View::scale(
  self : View[Msg],
  sx? : Double = 1.0,
  sy? : Double = 1.0,
) -> View[Msg] {
  self.apply_modifier(ScaleModifier::{ sx, sy }.to_any_modifier())
}

///|
pub fn[Msg] View::transition(
  self : View[Msg],
  spec? : TransitionSpec = TransitionSpec::new(),
  progress? : Double = 1.0,
  reduced_motion? : Bool = false,
) -> View[Msg] {
  self.apply_transition_style(spec.sample(progress, reduced_motion~).style)
}

///|
pub fn[Msg] View::presence(
  self : View[Msg],
  present~ : Bool,
  spec? : TransitionSpec = TransitionSpec::fade(),
  progress? : Double = 1.0,
  reduced_motion? : Bool = false,
) -> View[Msg] {
  let sample = spec.presence(present~, progress~, reduced_motion~)
  if sample.present {
    self.apply_transition_style(sample.style)
  } else {
    empty_view()
  }
}

///|
fn[Msg] View::apply_transition_style(
  self : View[Msg],
  style : TransitionStyle,
) -> View[Msg] {
  let mut view = self
  view = view.opacity(style.opacity)
  if style.offset.x != 0.0 || style.offset.y != 0.0 {
    view = view.offset(dx=style.offset.x, dy=style.offset.y)
  }
  if style.scale.x != 1.0 || style.scale.y != 1.0 {
    view = view.scale(sx=style.scale.x, sy=style.scale.y)
  }
  match style.foreground {
    Some(color) => view.foreground(color)
    None => view
  }
}

///|
pub fn[Msg] View::disabled(
  self : View[Msg],
  disabled? : Bool = true,
) -> View[Msg] {
  self.apply_modifier(DisabledModifier::{ disabled, }.to_any_modifier())
}

///|
pub fn[Msg] View::accessibility_label(
  self : View[Msg],
  label : String,
) -> View[Msg] {
  self.apply_modifier(AccessibilityLabelModifier::{ label, }.to_any_modifier())
}

///|
pub fn[Msg] View::semantic_id(
  self : View[Msg],
  semantic_id : SemanticId,
) -> View[Msg] {
  self.apply_modifier(SemanticIdModifier::{ semantic_id, }.to_any_modifier())
}

///|
pub fn[Msg] View::semantics_composition(
  self : View[Msg],
  composition : SemanticsComposition,
) -> View[Msg] {
  self.apply_modifier(
    SemanticsCompositionModifier::{ composition, }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::semantics_boundary(self : View[Msg]) -> View[Msg] {
  self.semantics_composition(SemanticsComposition::Boundary)
}

///|
pub fn[Msg] View::merge_descendant_semantics(self : View[Msg]) -> View[Msg] {
  self.semantics_composition(SemanticsComposition::MergeDescendants)
}

///|
pub fn[Msg] View::hide_semantics(self : View[Msg]) -> View[Msg] {
  self.semantics_composition(SemanticsComposition::Hidden)
}

///|
pub fn[Msg] View::semantics_role(
  self : View[Msg],
  role : SemanticsRole,
) -> View[Msg] {
  self.apply_modifier(SemanticsRoleModifier::{ role, }.to_any_modifier())
}

///|
pub fn[Msg] View::semantics_level(self : View[Msg], level : Int) -> View[Msg] {
  self.apply_modifier(SemanticsLevelModifier::{ level, }.to_any_modifier())
}

///|
pub fn[Msg] View::semantics_url(self : View[Msg], url : String) -> View[Msg] {
  self.apply_modifier(SemanticsUrlModifier::{ url, }.to_any_modifier())
}

///|
pub fn[Msg] View::semantics_selected(
  self : View[Msg],
  selected? : Bool = true,
) -> View[Msg] {
  self.apply_modifier(
    SemanticsSelectedModifier::{ selected, }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::semantics_pressed(
  self : View[Msg],
  pressed? : Bool = true,
) -> View[Msg] {
  self.apply_modifier(SemanticsPressedModifier::{ pressed, }.to_any_modifier())
}

///|
pub fn[Msg] View::semantics_checked(
  self : View[Msg],
  checked? : SemanticsCheckedState = SemanticsCheckedState::Checked,
) -> View[Msg] {
  self.apply_modifier(SemanticsCheckedModifier::{ checked, }.to_any_modifier())
}

///|
pub fn[Msg] View::semantics_expanded(
  self : View[Msg],
  expanded? : Bool = true,
) -> View[Msg] {
  self.apply_modifier(
    SemanticsExpandedModifier::{ expanded, }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::semantics_invalid(
  self : View[Msg],
  invalid? : Bool = true,
) -> View[Msg] {
  self.apply_modifier(SemanticsInvalidModifier::{ invalid, }.to_any_modifier())
}

///|
pub fn[Msg] View::semantics_required(
  self : View[Msg],
  required? : Bool = true,
) -> View[Msg] {
  self.apply_modifier(
    SemanticsRequiredModifier::{ required, }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::semantics_description(
  self : View[Msg],
  description : String,
) -> View[Msg] {
  self.apply_modifier(
    SemanticsDescriptionModifier::{ description, }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::semantics_state(
  self : View[Msg],
  read_only? : Bool,
  busy? : Bool,
  multiline? : Bool,
  password? : Bool,
  modal? : Bool,
) -> View[Msg] {
  self.apply_modifier(
    SemanticsMetadataModifier::{
      info: ViewSemanticsInfo::new(
        read_only?,
        busy?,
        multiline?,
        password?,
        modal?,
      ),
    }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::semantics_numeric(
  self : View[Msg],
  numeric : SemanticsNumericValue,
) -> View[Msg] {
  self.apply_modifier(
    SemanticsMetadataModifier::{ info: ViewSemanticsInfo::new(numeric~) }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::semantics_text_metadata(
  self : View[Msg],
  text : SemanticsTextValue,
) -> View[Msg] {
  self.apply_modifier(
    SemanticsMetadataModifier::{ info: ViewSemanticsInfo::new(text~) }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::semantics_collection(
  self : View[Msg],
  collection : SemanticsCollectionInfo,
) -> View[Msg] {
  self.apply_modifier(
    SemanticsMetadataModifier::{ info: ViewSemanticsInfo::new(collection~) }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::semantics_relations(
  self : View[Msg],
  relations : SemanticsRelationsDeclaration,
) -> View[Msg] {
  self.apply_modifier(
    SemanticsMetadataModifier::{ info: ViewSemanticsInfo::new(relations~) }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::semantics_live(
  self : View[Msg],
  live : SemanticsLive,
  live_atomic? : Bool = false,
) -> View[Msg] {
  self.apply_modifier(
    SemanticsMetadataModifier::{
      info: ViewSemanticsInfo::new(live~, live_atomic~),
    }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::focusable(
  self : View[Msg],
  focusable? : Bool = true,
) -> View[Msg] {
  self.apply_modifier(FocusableModifier::{ focusable, }.to_any_modifier())
}

///|
pub fn[Msg] View::focus_trap(
  self : View[Msg],
  enabled? : Bool = true,
) -> View[Msg] {
  self.apply_modifier(FocusTrapModifier::{ trap: enabled }.to_any_modifier())
}

///|
pub fn[Msg] View::on_tap(self : View[Msg], message : Msg) -> View[Msg] {
  self.apply_modifier(OnTapModifier::{ message, }.to_any_modifier())
}

///|
pub fn[Msg] View::on_secondary_tap(
  self : View[Msg],
  message : Msg,
) -> View[Msg] {
  self.apply_modifier(OnSecondaryTapModifier::{ message, }.to_any_modifier())
}

///|
pub fn[Msg] View::on_long_press(self : View[Msg], message : Msg) -> View[Msg] {
  self.apply_modifier(OnLongPressModifier::{ message, }.to_any_modifier())
}

///|
pub fn[Msg] View::on_double_tap(self : View[Msg], message : Msg) -> View[Msg] {
  self.apply_modifier(OnDoubleTapModifier::{ message, }.to_any_modifier())
}

///|
pub fn[Msg] View::on_drag(
  self : View[Msg],
  handler : (DragGestureEvent) -> Msg,
) -> View[Msg] {
  self.apply_modifier(OnDragModifier::{ handler, }.to_any_modifier())
}

///|
pub fn[Msg] View::on_drag_with_frame(
  self : View[Msg],
  handler : (DragGestureEvent, Rect) -> Msg,
) -> View[Msg] {
  self.apply_modifier(OnDragWithFrameModifier::{ handler, }.to_any_modifier())
}

///|
pub fn[Msg] View::on_file_drop(
  self : View[Msg],
  handler : (Array[String], Point) -> Msg,
) -> View[Msg] {
  self.apply_modifier(OnFileDropModifier::{ handler, }.to_any_modifier())
}

///|
pub fn[Msg] View::keyboard_shortcut(
  self : View[Msg],
  shortcut : KeyboardShortcut,
) -> View[Msg] {
  self.apply_modifier(KeyboardShortcutModifier::{ shortcut, }.to_any_modifier())
}

///|
pub fn[Msg] View::flexible(
  self : View[Msg],
  weight? : Double = 1.0,
) -> View[Msg] {
  self.apply_modifier(
    FlexibleModifier::{ weight: max_double(0.0, weight) }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::layout_priority(
  self : View[Msg],
  priority : Double,
) -> View[Msg] {
  self.apply_modifier(LayoutPriorityModifier::{ priority, }.to_any_modifier())
}

///|
pub fn[Msg] View::expanded(
  self : View[Msg],
  weight? : Double = 1.0,
) -> View[Msg] {
  self.flexible(weight~)
}

///|
pub fn[Msg] View::align(
  self : View[Msg],
  alignment? : Alignment = Alignment::center(),
) -> View[Msg] {
  self.apply_modifier(AlignModifier::{ alignment, }.to_any_modifier())
}

///|
pub fn[Msg] View::aspect_ratio(self : View[Msg], ratio : Double) -> View[Msg] {
  self.apply_modifier(
    AspectRatioModifier::{ ratio: max_double(0.01, ratio) }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::intrinsic_width(self : View[Msg]) -> View[Msg] {
  self.apply_modifier(IntrinsicWidthModifier::{  }.to_any_modifier())
}

///|
pub fn[Msg] View::intrinsic_height(self : View[Msg]) -> View[Msg] {
  self.apply_modifier(IntrinsicHeightModifier::{  }.to_any_modifier())
}

///|
pub fn[Msg] View::repaint_boundary(self : View[Msg]) -> View[Msg] {
  self.apply_modifier(RepaintBoundaryModifier::{  }.to_any_modifier())
}

///|
pub fn[Msg] View::padding(self : View[Msg], value : Double) -> View[Msg] {
  self.apply_modifier(
    PaddingModifier::{ insets: Insets::all(value) }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::spacing(self : View[Msg], spacing : Double) -> View[Msg] {
  self.apply_modifier(SpacingModifier::{ spacing, }.to_any_modifier())
}

///|
pub fn[Msg] View::main_axis_alignment(
  self : View[Msg],
  alignment : MainAxisAlignment,
) -> View[Msg] {
  self.apply_modifier(
    MainAxisAlignmentModifier::{ alignment, }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::cross_axis_alignment(
  self : View[Msg],
  alignment : CrossAxisAlignment,
) -> View[Msg] {
  self.apply_modifier(
    CrossAxisAlignmentModifier::{ alignment, }.to_any_modifier(),
  )
}

///|
pub fn[Msg] View::theme(self : View[Msg], theme : Theme) -> View[Msg] {
  self.apply_modifier(ThemeModifier::{ theme, }.to_any_modifier())
}

///|
pub fn[Msg] View::environment(
  self : View[Msg],
  environment : Environment,
) -> View[Msg] {
  self.apply_modifier(EnvironmentModifier::{ environment, }.to_any_modifier())
}

///|
pub fn[Msg] View::frame(
  self : View[Msg],
  width? : Double,
  height? : Double,
  min_width? : Double,
  min_height? : Double,
  max_width? : Double,
  max_height? : Double,
) -> View[Msg] {
  self.apply_modifier(
    FrameModifier::{
      width,
      height,
      min_width,
      min_height,
      max_width,
      max_height,
    }.to_any_modifier(),
  )
}