-module(legos@input). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/legos/input.gleam"). -export([placeholder/2, label_right/2, label_left/2, label_above/2, label_below/2, label_hidden/1, default_checkbox/1, option_with/2, thumb/1, default_thumb/0, option/2, slider/8, radio/5, radio_row/5, focused_on_load/0, text_input/5, spell_checked/5, search/5, username/5, email/5, new_password/6, current_password/6, multiline/6, button/3, checkbox/5]). -export_type([placeholder/1, label_location/0, label/1, text_kind/0, text_input/0, text_config/1, option_state/0, radio_option/2, thumb/1, box/0, redistributed/1, orientation/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. -type placeholder(VFN) :: {placeholder, list(legos@internal@model:attribute(legos@internal@model:aligned(), VFN)), legos@internal@model:element(VFN)}. -type label_location() :: on_right | on_left | above | below. -type label(VFO) :: {label, label_location(), list(legos@internal@model:attribute(legos@internal@model:aligned(), VFO)), legos@internal@model:element(VFO)} | {hidden_label, binary()}. -type text_kind() :: {text_input_node, binary()} | text_area. -type text_input() :: {text_input, text_kind(), boolean(), gleam@option:option(binary())}. -type text_config(VFP) :: {text_config, fun((binary()) -> VFP), binary(), gleam@option:option(placeholder(VFP)), label(VFP)}. -type option_state() :: idle | focused | selected. -type radio_option(VFQ, VFR) :: {radio_option, VFQ, fun((option_state()) -> legos@internal@model:element(VFR))}. -type thumb(VFS) :: {thumb, list(legos@internal@model:attribute(legos@internal@model:aligned(), VFS))}. -type box() :: {box, integer(), integer(), integer(), integer()}. -type redistributed(VFT) :: {redistributed, list(legos@internal@model:attribute(legos@internal@model:aligned(), VFT)), list(legos@internal@model:attribute(legos@internal@model:aligned(), VFT)), list(legos@internal@model:attribute(legos@internal@model:aligned(), VFT)), list(legos@internal@model:attribute(legos@internal@model:aligned(), VFT)), list(legos@internal@model:attribute(legos@internal@model:aligned(), VFT))}. -type orientation() :: row | column. -file("src/legos/input.gleam", 30). ?DOC(" Create a placeholder for text inputs\n"). -spec placeholder( list(legos@internal@model:attribute(legos@internal@model:aligned(), VFU)), legos@internal@model:element(VFU) ) -> placeholder(VFU). placeholder(Attrs, Content) -> {placeholder, Attrs, Content}. -file("src/legos/input.gleam", 56). ?DOC(" Create a label positioned to the right\n"). -spec label_right( list(legos@internal@model:attribute(legos@internal@model:aligned(), VFZ)), legos@internal@model:element(VFZ) ) -> label(VFZ). label_right(Attrs, Content) -> {label, on_right, Attrs, Content}. -file("src/legos/input.gleam", 64). ?DOC(" Create a label positioned to the left\n"). -spec label_left( list(legos@internal@model:attribute(legos@internal@model:aligned(), VGE)), legos@internal@model:element(VGE) ) -> label(VGE). label_left(Attrs, Content) -> {label, on_left, Attrs, Content}. -file("src/legos/input.gleam", 72). ?DOC(" Create a label positioned above\n"). -spec label_above( list(legos@internal@model:attribute(legos@internal@model:aligned(), VGJ)), legos@internal@model:element(VGJ) ) -> label(VGJ). label_above(Attrs, Content) -> {label, above, Attrs, Content}. -file("src/legos/input.gleam", 80). ?DOC(" Create a label positioned below\n"). -spec label_below( list(legos@internal@model:attribute(legos@internal@model:aligned(), VGO)), legos@internal@model:element(VGO) ) -> label(VGO). label_below(Attrs, Content) -> {label, below, Attrs, Content}. -file("src/legos/input.gleam", 88). ?DOC(" Create a hidden label for accessibility (screen readers only)\n"). -spec label_hidden(binary()) -> label(any()). label_hidden(Text) -> {hidden_label, Text}. -file("src/legos/input.gleam", 92). -spec is_stacked(label(any())) -> boolean(). is_stacked(Label) -> case Label of {label, on_right, _, _} -> false; {label, on_left, _, _} -> false; {label, above, _, _} -> true; {label, below, _, _} -> true; {hidden_label, _} -> true end. -file("src/legos/input.gleam", 102). -spec hidden_label_attribute(label(VGX)) -> legos@internal@model:attribute(legos@internal@model:aligned(), VGX). hidden_label_attribute(Label) -> case Label of {hidden_label, Text_label} -> {describe, {label, Text_label}}; {label, _, _, _} -> no_attribute end. -file("src/legos/input.gleam", 162). -spec has_focus_style( legos@internal@model:attribute(legos@internal@model:aligned(), any()) ) -> boolean(). has_focus_style(Attr) -> case Attr of {style_class, _, {pseudo_selector, focus, _}} -> true; _ -> false end. -file("src/legos/input.gleam", 155). -spec focus_default( list(legos@internal@model:attribute(legos@internal@model:aligned(), VHG)) ) -> legos@internal@model:attribute(legos@internal@model:aligned(), VHG). focus_default(Attrs) -> case gleam@list:any(Attrs, fun has_focus_style/1) of true -> no_attribute; false -> legos@internal@model:html_class(<<"focusable"/utf8>>) end. -file("src/legos/input.gleam", 249). -spec default_checkbox(boolean()) -> legos@internal@model:element(any()). default_checkbox(Checked) -> legos@element:el( [legos@internal@model:html_class(<<"focusable"/utf8>>), legos@element:width(legos@element:px(14)), legos@element:height(legos@element:px(14)), legos@font:color(legos@color:white()), legos@element:center_y(), legos@font:size(9), legos@font:center(), legos@border:rounded(3), legos@border:color(case Checked of true -> legos@color:rgb( 59.0 / 255.0, 153.0 / 255.0, 252.0 / 255.0 ); false -> legos@color:rgb( 211.0 / 255.0, 211.0 / 255.0, 211.0 / 255.0 ) end), legos@border:shadow(case Checked of true -> legos@color:rgba( 238.0 / 255.0, 238.0 / 255.0, 238.0 / 255.0, +0.0 ); false -> legos@color:rgb( 238.0 / 255.0, 238.0 / 255.0, 238.0 / 255.0 ) end, {0, 0}, 1, 1), legos@background:color(case Checked of true -> legos@color:rgb( 59.0 / 255.0, 153.0 / 255.0, 252.0 / 255.0 ); false -> legos@color:white() end), legos@border:width(case Checked of true -> 0; false -> 1 end), legos@element:in_front( legos@element:el( [legos@border:color(legos@color:white()), legos@element:height(legos@element:px(6)), legos@element:width(legos@element:px(9)), legos@element:rotate(-45.0), legos@element:center_x(), legos@element:center_y(), legos@element:move_up(1.0), legos@element:transparent(not Checked), legos@border:width_each(2, 2, 0, 0)], empty ) )], empty ). -file("src/legos/input.gleam", 508). ?DOC(" Create a radio option with custom styling\n"). -spec option_with( VKD, fun((option_state()) -> legos@internal@model:element(VKE)) ) -> radio_option(VKD, VKE). option_with(Value, View) -> {radio_option, Value, View}. -file("src/legos/input.gleam", 544). ?DOC(" Create a slider thumb\n"). -spec thumb( list(legos@internal@model:attribute(legos@internal@model:aligned(), VLC)) ) -> thumb(VLC). thumb(Attrs) -> {thumb, Attrs}. -file("src/legos/input.gleam", 549). ?DOC(" Default slider thumb\n"). -spec default_thumb() -> thumb(any()). default_thumb() -> {thumb, [legos@element:width(legos@element:px(16)), legos@element:height(legos@element:px(16)), legos@border:rounded(8), legos@border:width(1), legos@border:color(legos@color:rgb(0.5, 0.5, 0.5)), legos@background:color(legos@color:white())]}. -file("src/legos/input.gleam", 1376). -spec is_fill(legos@internal@model:length()) -> boolean(). is_fill(Len) -> case Len of {fill, _} -> true; content -> false; {px, _} -> false; {pct, _} -> false; {screen_pct, _} -> false; {min, _, L} -> is_fill(L); {max, _, L@1} -> is_fill(L@1) end. -file("src/legos/input.gleam", 1122). -spec redistribute_over(boolean(), boolean()) -> fun((redistributed(VMK), legos@internal@model:attribute(legos@internal@model:aligned(), VMK)) -> redistributed(VMK)). redistribute_over(Is_multiline, Stacked) -> fun(Els, Attr) -> case Attr of {nearby, _, _} -> {redistributed, erlang:element(2, Els), [Attr | erlang:element(3, Els)], erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)}; {width, Width} -> case is_fill(Width) of true -> {redistributed, [Attr | erlang:element(2, Els)], [Attr | erlang:element(3, Els)], erlang:element(4, Els), [Attr | erlang:element(5, Els)], erlang:element(6, Els)}; false -> case Stacked of true -> {redistributed, [Attr | erlang:element(2, Els)], erlang:element(3, Els), erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)}; false -> {redistributed, erlang:element(2, Els), [Attr | erlang:element(3, Els)], erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)} end end; {height, Height} -> case Stacked of false -> {redistributed, [Attr | erlang:element(2, Els)], [Attr | erlang:element(3, Els)], erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)}; true -> case is_fill(Height) of true -> {redistributed, [Attr | erlang:element(2, Els)], [Attr | erlang:element(3, Els)], erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)}; false -> {redistributed, erlang:element(2, Els), [Attr | erlang:element(3, Els)], erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)} end end; {align_x, _} -> {redistributed, [Attr | erlang:element(2, Els)], erlang:element(3, Els), erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)}; {align_y, _} -> {redistributed, [Attr | erlang:element(2, Els)], erlang:element(3, Els), erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)}; {style_class, _, {spacing_style, _, _, _}} -> {redistributed, [Attr | erlang:element(2, Els)], [Attr | erlang:element(3, Els)], [Attr | erlang:element(4, Els)], [Attr | erlang:element(5, Els)], erlang:element(6, Els)}; {style_class, _, {padding_style, _, T, R, B, L}} -> case Is_multiline of true -> {redistributed, erlang:element(2, Els), [Attr | erlang:element(3, Els)], erlang:element(4, Els), erlang:element(5, Els), [Attr | erlang:element(6, Els)]}; false -> New_height = legos@element:html_attribute( lustre@attribute:style( <<"height"/utf8>>, <<<<"calc(1.0em + "/utf8, (gleam_stdlib:float_to_string( 2.0 * gleam@float:min(T, B) ))/binary>>/binary, "px)"/utf8>> ) ), New_line_height = legos@element:html_attribute( lustre@attribute:style( <<"line-height"/utf8>>, <<<<"calc(1.0em + "/utf8, (gleam_stdlib:float_to_string( 2.0 * gleam@float:min(T, B) ))/binary>>/binary, "px)"/utf8>> ) ), New_top = T - gleam@float:min(T, B), New_bottom = B - gleam@float:min(T, B), Reduced_vertical_padding = {style_class, legos@internal@flag:padding(), {padding_style, legos@internal@model:padding_name_float( New_top, R, New_bottom, L ), New_top, R, New_bottom, L}}, {redistributed, erlang:element(2, Els), [Reduced_vertical_padding | erlang:element(3, Els)], erlang:element(4, Els), [New_height, New_line_height | erlang:element(5, Els)], [Attr | erlang:element(6, Els)]} end; {style_class, _, {border_width, _, _, _, _, _}} -> {redistributed, erlang:element(2, Els), [Attr | erlang:element(3, Els)], erlang:element(4, Els), erlang:element(5, Els), [Attr | erlang:element(6, Els)]}; {style_class, _, {transform, _}} -> {redistributed, erlang:element(2, Els), [Attr | erlang:element(3, Els)], erlang:element(4, Els), erlang:element(5, Els), [Attr | erlang:element(6, Els)]}; {style_class, _, {font_size, _}} -> {redistributed, [Attr | erlang:element(2, Els)], erlang:element(3, Els), erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)}; {style_class, _, {font_family, _, _}} -> {redistributed, [Attr | erlang:element(2, Els)], erlang:element(3, Els), erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)}; {style_class, _, _} -> {redistributed, erlang:element(2, Els), [Attr | erlang:element(3, Els)], erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)}; no_attribute -> Els; {attr, _} -> {redistributed, erlang:element(2, Els), erlang:element(3, Els), erlang:element(4, Els), [Attr | erlang:element(5, Els)], erlang:element(6, Els)}; {describe, _} -> {redistributed, erlang:element(2, Els), erlang:element(3, Els), erlang:element(4, Els), [Attr | erlang:element(5, Els)], erlang:element(6, Els)}; {class, _, _} -> {redistributed, erlang:element(2, Els), [Attr | erlang:element(3, Els)], erlang:element(4, Els), erlang:element(5, Els), erlang:element(6, Els)}; {transform_component, _, _} -> {redistributed, erlang:element(2, Els), erlang:element(3, Els), erlang:element(4, Els), [Attr | erlang:element(5, Els)], erlang:element(6, Els)} end end. -file("src/legos/input.gleam", 1093). -spec redistribute( boolean(), boolean(), list(legos@internal@model:attribute(legos@internal@model:aligned(), VMG)) ) -> redistributed(VMG). redistribute(Is_multiline, Stacked, Attrs) -> _pipe = Attrs, _pipe@1 = gleam@list:fold( _pipe, {redistributed, [], [], [], [], []}, fun(Attr, Redist) -> (redistribute_over(Is_multiline, Stacked))(Attr, Redist) end ), (fun(Redist@1) -> {redistributed, lists:reverse(erlang:element(2, Redist@1)), lists:reverse(erlang:element(3, Redist@1)), lists:reverse(erlang:element(4, Redist@1)), lists:reverse(erlang:element(5, Redist@1)), lists:reverse(erlang:element(6, Redist@1))} end)(_pipe@1). -file("src/legos/input.gleam", 1402). -spec apply_label( list(legos@internal@model:attribute(legos@internal@model:aligned(), VMO)), label(VMO), legos@internal@model:element(VMO) ) -> legos@internal@model:element(VMO). apply_label(Attrs, Label, Input) -> case Label of {hidden_label, _} -> legos@internal@model:element( as_column, {node_name, <<"label"/utf8>>}, Attrs, {unkeyed, [Input]} ); {label, Position, Label_attrs, Label_child} -> Label_element = legos@internal@model:element( as_el, generic, Label_attrs, {unkeyed, [Label_child]} ), case Position of above -> legos@internal@model:element( as_column, {node_name, <<"label"/utf8>>}, [legos@internal@model:html_class(<<"lbl"/utf8>>) | Attrs], {unkeyed, [Label_element, Input]} ); below -> legos@internal@model:element( as_column, {node_name, <<"label"/utf8>>}, [legos@internal@model:html_class(<<"lbl"/utf8>>) | Attrs], {unkeyed, [Input, Label_element]} ); on_right -> legos@internal@model:element( as_row, {node_name, <<"label"/utf8>>}, [legos@internal@model:html_class(<<"lbl"/utf8>>) | Attrs], {unkeyed, [Input, Label_element]} ); on_left -> legos@internal@model:element( as_row, {node_name, <<"label"/utf8>>}, [legos@internal@model:html_class(<<"lbl"/utf8>>) | Attrs], {unkeyed, [Label_element, Input]} ) end end. -file("src/legos/input.gleam", 1458). -spec is_hidden_label(label(any())) -> boolean(). is_hidden_label(Label) -> case Label of {hidden_label, _} -> true; _ -> false end. -file("src/legos/input.gleam", 1531). -spec default_radio_option(legos@internal@model:element(VNG)) -> fun((option_state()) -> legos@internal@model:element(VNG)). default_radio_option(Option_label) -> fun(Status) -> legos@element:row( [legos@element:spacing(10), legos@element:align_left(), legos@element:width(legos@element:shrink())], [legos@element:el( [legos@element:width(legos@element:px(14)), legos@element:height(legos@element:px(14)), legos@background:color(legos@color:white()), legos@border:rounded(7), case Status of selected -> legos@internal@model:html_class( <<"focusable"/utf8>> ); _ -> no_attribute end, legos@border:width(case Status of selected -> 5; _ -> 1 end), legos@border:color(case Status of selected -> legos@color:rgb( 59.0 / 255.0, 153.0 / 255.0, 252.0 / 255.0 ); _ -> legos@color:rgb( 208.0 / 255.0, 208.0 / 255.0, 208.0 / 255.0 ) end)], empty ), legos@element:el( [legos@element:width(legos@element:fill()), legos@internal@model:html_class(<<"unfocusable"/utf8>>)], Option_label )] ) end. -file("src/legos/input.gleam", 503). ?DOC(" Create a radio option with default styling\n"). -spec option(VJY, legos@internal@model:element(VJZ)) -> radio_option(VJY, VJZ). option(Value, Content) -> {radio_option, Value, default_radio_option(Content)}. -file("src/legos/input.gleam", 785). -spec view_horizontal_thumb( float(), list(legos@internal@model:attribute(legos@internal@model:aligned(), VLP)), gleam@option:option(legos@internal@model:length()) ) -> legos@internal@model:element(VLP). view_horizontal_thumb(Factor, Thumb_attributes, Track_height) -> legos@element:row( [legos@element:height( gleam@option:unwrap(Track_height, legos@element:fill()) ), legos@element:center_y(), legos@element:width(legos@element:fill())], [legos@element:el( [legos@element:height(content), legos@element:width( legos@element:fill_portion( erlang:round(Factor * 10000.0) ) )], empty ), legos@element:el( [legos@element:center_y() | Thumb_attributes], empty ), legos@element:el( [legos@element:height( gleam@option:unwrap(Track_height, legos@element:fill()) ), legos@element:width( legos@element:fill_portion( erlang:round( gleam@float:absolute_value(1.0 - Factor) * 10000.0 ) ) )], empty )] ). -file("src/legos/input.gleam", 824). -spec view_vertical_thumb( float(), list(legos@internal@model:attribute(legos@internal@model:aligned(), VLU)), gleam@option:option(legos@internal@model:length()) ) -> legos@internal@model:element(VLU). view_vertical_thumb(Factor, Thumb_attributes, Track_width) -> legos@element:column( [legos@element:height(legos@element:fill()), legos@element:width( gleam@option:unwrap(Track_width, legos@element:fill()) ), legos@element:center_x()], [legos@element:el( [legos@element:height( legos@element:fill_portion( erlang:round( gleam@float:absolute_value(1.0 - Factor) * 10000.0 ) ) )], empty ), legos@element:el( [legos@element:center_x() | Thumb_attributes], empty ), legos@element:el( [legos@element:height( legos@element:fill_portion( erlang:round(Factor * 10000.0) ) )], empty )] ). -file("src/legos/input.gleam", 603). ?DOC( " A slider input, good for capturing float values.\n" "\n" " Input.slider\n" " [ Element.height (Element.px 30)\n" "\n" " -- Here is where we're creating/styling the \"track\"\n" " , Element.behindContent\n" " (Element.el\n" " [ Element.width Element.fill\n" " , Element.height (Element.px 2)\n" " , Element.centerY\n" " , Background.color grey\n" " , Border.rounded 2\n" " ]\n" " Element.none\n" " )\n" " ]\n" " { on_change = AdjustValue\n" " , label =\n" " Input.labelAbove []\n" " (text \"My Slider Value\")\n" " , min = 0\n" " , max = 75\n" " , step = Nothing\n" " , value = model.sliderValue\n" " , thumb =\n" " Input.defaultThumb\n" " }\n" "\n" " `Element.behindContent` is used to render the track of the slider. Without it, no track would be rendered. The `thumb` is the icon that you can move around.\n" "\n" " The slider can be vertical or horizontal depending on the width/height of the slider.\n" "\n" " - `height fill` and `width (px someWidth)` will cause the slider to be vertical.\n" " - `height (px someHeight)` and `width (px someWidth)` where `someHeight` > `someWidth` will also do it.\n" " - otherwise, the slider will be horizontal.\n" "\n" " **Note** If you want a slider for an `Int` value:\n" "\n" " - set `step` to be `Just 1`, or some other whole value\n" " - `value = toFloat model.myInt`\n" " - And finally, round the value before making a message `on_change = round >> AdjustValue`\n" ). -spec slider( list(legos@internal@model:attribute(legos@internal@model:aligned(), VLI)), fun((float()) -> VLI), label(VLI), float(), float(), float(), thumb(VLI), gleam@option:option(float()) ) -> legos@internal@model:element(VLI). slider(Attributes, On_change, Label_val, Min, Max, Value, Thumb, Step) -> {thumb, Thumb_attributes} = Thumb, Width = legos@internal@model:get_width(Thumb_attributes), Height = legos@internal@model:get_height(Thumb_attributes), Track_height = legos@internal@model:get_height(Attributes), Track_width = legos@internal@model:get_width(Attributes), Vertical = case {Track_width, Track_height} of {none, none} -> false; {{some, {px, W}}, {some, {px, H}}} -> H > W; {{some, {px, _}}, {some, {fill, _}}} -> true; {_, _} -> false end, Spacing = legos@internal@model:get_spacing(Attributes, {5, 5}), Spacing_x = erlang:element(1, Spacing), Spacing_y = erlang:element(2, Spacing), Factor = case (Max - Min) of +0.0 -> +0.0; -0.0 -> -0.0; Gleam@denominator -> (Value - Min) / Gleam@denominator end, Thumb_width_string = case Width of none -> <<"20px"/utf8>>; {some, {px, Px}} -> <<(erlang:integer_to_binary(Px))/binary, "px"/utf8>>; _ -> <<"100%"/utf8>> end, Thumb_height_string = case Height of none -> <<"20px"/utf8>>; {some, {px, Px@1}} -> <<(erlang:integer_to_binary(Px@1))/binary, "px"/utf8>>; _ -> <<"100%"/utf8>> end, Class_name = <<<<<<"thmb-"/utf8, Thumb_width_string/binary>>/binary, "-"/utf8>>/binary, Thumb_height_string/binary>>, Thumb_shadow_style = [{property, <<"width"/utf8>>, Thumb_width_string}, {property, <<"height"/utf8>>, Thumb_height_string}], Thumb@1 = case Vertical of true -> view_vertical_thumb( Factor, lists:append( [legos@internal@model:html_class(<<"focusable-thumb"/utf8>>)], Thumb_attributes ), Track_width ); false -> view_horizontal_thumb( Factor, [legos@internal@model:html_class(<<"focusable-thumb"/utf8>>) | Thumb_attributes], Track_height ) end, apply_label(lists:append([case is_hidden_label(Label_val) of true -> [no_attribute]; false -> [legos@element:spacing_xy(Spacing_x, Spacing_y)] end, [legos@region:announce()], [legos@element:width( case Track_width of none -> legos@element:fill(); {some, {px, _}} -> legos@element:shrink(); {some, X} -> X end )], [legos@element:height(case Track_height of none -> legos@element:shrink(); {some, {px, _}} -> legos@element:shrink(); {some, X@1} -> X@1 end)]]), Label_val, legos@element:row( [legos@element:width( gleam@option:unwrap(Track_width, legos@element:fill()) ), legos@element:height( gleam@option:unwrap(Track_height, legos@element:px(20)) ), legos@element:behind_content( legos@element:el([legos@element:alpha(+0.0)], Thumb@1) )], [legos@internal@model:element( as_el, {node_name, <<"input"/utf8>>}, lists:append( [[hidden_label_attribute(Label_val)], [{style_class, legos@internal@flag:active(), {style, <<<<"input[type=\"range\"]."/utf8, Class_name/binary>>/binary, "::-moz-range-thumb"/utf8>>, Thumb_shadow_style}}, {style_class, legos@internal@flag:hover(), {style, <<<<"input[type=\"range\"]."/utf8, Class_name/binary>>/binary, "::-webkit-slider-thumb"/utf8>>, Thumb_shadow_style}}, {style_class, legos@internal@flag:focus(), {style, <<<<"input[type=\"range\"]."/utf8, Class_name/binary>>/binary, "::-ms-thumb"/utf8>>, Thumb_shadow_style}}, {attr, lustre@attribute:class( <> )}, legos@events:on_input( fun(Str) -> case gleam_stdlib:parse_float(Str) of {error, _} -> On_change(+0.0); {ok, Val} -> On_change(Val) end end ), {attr, lustre@attribute:type_(<<"range"/utf8>>)}, {attr, lustre@attribute:step(case Step of none -> <<"any"/utf8>>; {some, Step@1} -> gleam_stdlib:float_to_string( Step@1 ) end)}, {attr, lustre@attribute:min( gleam_stdlib:float_to_string(Min) )}, {attr, lustre@attribute:max( gleam_stdlib:float_to_string(Max) )}, {attr, lustre@attribute:value( gleam_stdlib:float_to_string(Value) )}, case Vertical of true -> {attr, lustre@attribute:attribute( <<"orient"/utf8>>, <<"vertical"/utf8>> )}; false -> no_attribute end, legos@element:width(case Vertical of true -> gleam@option:unwrap( Track_height, legos@element:px(20) ); false -> gleam@option:unwrap( Track_width, legos@element:fill() ) end), legos@element:height(case Vertical of true -> gleam@option:unwrap( Track_width, legos@element:fill() ); false -> gleam@option:unwrap( Track_height, legos@element:px(20) ) end)]] ), {unkeyed, []} ), legos@element:el( lists:append( [[legos@element:width( gleam@option:unwrap( Track_width, legos@element:fill() ) ), legos@element:height( gleam@option:unwrap( Track_height, legos@element:px(20) ) )], Attributes, [legos@element:behind_content(Thumb@1)]] ), empty )] )). -file("src/legos/input.gleam", 1571). -spec tab_index(integer()) -> legos@internal@model:attribute(legos@internal@model:aligned(), any()). tab_index(Index) -> {attr, lustre@attribute:tabindex(Index)}. -file("src/legos/input.gleam", 1470). -spec radio_helper( orientation(), list(legos@internal@model:attribute(legos@internal@model:aligned(), VMW)), fun((VMZ) -> VMW), list(radio_option(VMZ, VMW)), gleam@option:option(VMZ), label(VMW) ) -> legos@internal@model:element(VMW). radio_helper(Orientation, Attrs, On_change, Options, Selected, Label) -> Render_option = fun(Radio_option) -> {radio_option, Val, View} = Radio_option, Status = case Selected of {some, Sel} when Sel =:= Val -> selected; _ -> idle end, legos@element:el([legos@element:pointer(), case Orientation of row -> legos@element:width(legos@element:shrink()); column -> legos@element:width(legos@element:fill()) end, legos@events:on_click(On_change(Val)), {attr, lustre@attribute:aria_checked(case Status of selected -> <<"true"/utf8>>; _ -> <<"false"/utf8>> end)}, {attr, lustre@attribute:role(<<"radio"/utf8>>)}], View( Status )) end, Option_area = case Orientation of row -> legos@element:row( [hidden_label_attribute(Label) | Attrs], gleam@list:map(Options, Render_option) ); column -> legos@element:column( [hidden_label_attribute(Label) | Attrs], gleam@list:map(Options, Render_option) ) end, apply_label( [legos@element:align_left(), tab_index(0), legos@internal@model:html_class(<<"focus"/utf8>>), legos@region:announce(), {attr, lustre@attribute:role(<<"radiogroup"/utf8>>)}], Label, Option_area ). -file("src/legos/input.gleam", 516). ?DOC(" Create a radio button group (column layout)\n"). -spec radio( list(legos@internal@model:attribute(legos@internal@model:aligned(), VKI)), fun((VKL) -> VKI), list(radio_option(VKL, VKI)), gleam@option:option(VKL), label(VKI) ) -> legos@internal@model:element(VKI). radio(Attrs, On_change, Options, Selected, Label) -> radio_helper(column, Attrs, On_change, Options, Selected, Label). -file("src/legos/input.gleam", 527). ?DOC(" Create a radio button group (row layout)\n"). -spec radio_row( list(legos@internal@model:attribute(legos@internal@model:aligned(), VKS)), fun((VKV) -> VKS), list(radio_option(VKV, VKS)), gleam@option:option(VKV), label(VKS) ) -> legos@internal@model:element(VKS). radio_row(Attrs, On_change, Options, Selected, Label) -> radio_helper(row, Attrs, On_change, Options, Selected, Label). -file("src/legos/input.gleam", 1575). -spec on_key_lookup(VNM, fun((binary()) -> gleam@option:option(VNM))) -> legos@internal@model:attribute(legos@internal@model:aligned(), VNM). on_key_lookup(Msg, Decoder) -> legos@events:on( <<"keyup"/utf8>>, begin gleam@dynamic@decode:then( legos@events:key(), fun(Key) -> case Decoder(Key) of {some, Msg@1} -> gleam@dynamic@decode:success(Msg@1); none -> gleam@dynamic@decode:failure( Msg, <<"Key not handled"/utf8>> ) end end ) end ). -file("src/legos/input.gleam", 1586). ?DOC(" Set an element to be focused when the page loads\n"). -spec focused_on_load() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()). focused_on_load() -> {attr, lustre@attribute:autofocus(true)}. -file("src/legos/input.gleam", 1604). -spec default_text_padding() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()). default_text_padding() -> legos@element:padding_xy(12, 12). -file("src/legos/input.gleam", 1590). -spec default_text_box_style() -> list(legos@internal@model:attribute(legos@internal@model:aligned(), any())). default_text_box_style() -> [default_text_padding(), legos@border:rounded(3), legos@border:color( {rgba, 64.0 / 255.0, 64.0 / 255.0, 64.0 / 255.0, 1.0} ), legos@background:color(legos@color:white()), legos@border:width(1), legos@element:spacing(5), legos@element:width(legos@element:fill()), legos@element:height(legos@element:shrink())]. -file("src/legos/input.gleam", 1608). -spec get_height( legos@internal@model:attribute(legos@internal@model:aligned(), any()) ) -> {ok, legos@internal@model:length()} | {error, nil}. get_height(Attr) -> case Attr of {height, H} -> {ok, H}; _ -> {error, nil} end. -file("src/legos/input.gleam", 1615). -spec is_constrained(legos@internal@model:length()) -> boolean(). is_constrained(Len) -> case Len of content -> false; {px, _} -> true; {pct, _} -> true; {screen_pct, _} -> true; {fill, _} -> true; {min, _, L} -> is_constrained(L); {max, _, _} -> true end. -file("src/legos/input.gleam", 1627). -spec render_placeholder( placeholder(VNW), list(legos@internal@model:attribute(legos@internal@model:aligned(), VNW)), boolean() ) -> legos@internal@model:element(VNW). render_placeholder(P, For_placeholder, On) -> {placeholder, Placeholder_attrs, Placeholder_el} = P, legos@element:el( lists:append( [For_placeholder, [legos@font:color(legos@color:rgb(0.21, 0.21, 0.21)), legos@internal@model:html_class( <<<<(<<"notxt"/utf8>>)/binary, " "/utf8>>/binary, (<<"ppe"/utf8>>)/binary>> ), legos@element:clip(), legos@border:width(0), legos@border:color(legos@color:rgba(+0.0, +0.0, +0.0, +0.0)), legos@background:color( legos@color:rgba(+0.0, +0.0, +0.0, +0.0) ), legos@element:height(legos@element:fill()), legos@element:width(legos@element:fill()), legos@element:alpha(case On of true -> 1.0; false -> +0.0 end)], Placeholder_attrs] ), Placeholder_el ). -file("src/legos/input.gleam", 1664). -spec calc_move_to_compensate_for_padding( list(legos@internal@model:attribute(legos@internal@model:aligned(), VOB)) ) -> legos@internal@model:attribute(legos@internal@model:aligned(), VOB). calc_move_to_compensate_for_padding(Attrs) -> Gather_spacing = fun(Found, Attr) -> case Attr of {style_class, _, {spacing_style, _, _, Y}} -> case Found of none -> {some, Y}; {some, _} -> Found end; _ -> Found end end, case gleam@list:fold_right(Attrs, none, Gather_spacing) of none -> no_attribute; {some, V_space} -> legos@element:move_up(math:floor(erlang:float(V_space) / 2.0)) end. -file("src/legos/input.gleam", 1684). -spec negate_box(box()) -> box(). negate_box(Box) -> {box, - erlang:element(2, Box), - erlang:element(3, Box), - erlang:element(4, Box), - erlang:element(5, Box)}. -file("src/legos/input.gleam", 1688). -spec render_box(box()) -> binary(). render_box(Box) -> <<<<<<<<<<<<<<(erlang:integer_to_binary(erlang:element(5, Box)))/binary, "px "/utf8>>/binary, (erlang:integer_to_binary(erlang:element(4, Box)))/binary>>/binary, "px "/utf8>>/binary, (erlang:integer_to_binary(erlang:element(2, Box)))/binary>>/binary, "px "/utf8>>/binary, (erlang:integer_to_binary(erlang:element(3, Box)))/binary>>/binary, "px"/utf8>>. -file("src/legos/input.gleam", 860). -spec text_helper( text_input(), list(legos@internal@model:attribute(legos@internal@model:aligned(), VLZ)), fun((binary()) -> VLZ), binary(), gleam@option:option(placeholder(VLZ)), label(VLZ) ) -> legos@internal@model:element(VLZ). text_helper(Text_input, Attrs, On_change, Text_val, Placeholder, Label_val) -> With_defaults = lists:append(default_text_box_style(), Attrs), Redistributed = redistribute( erlang:element(2, Text_input) =:= text_area, is_stacked(Label_val), With_defaults ), Get_padding = fun(Attr) -> case Attr of {style_class, _, {padding_style, _, T, R, B, L}} -> {ok, {box, gleam@int:max(0, erlang:round(math:floor(B - 3.0))), gleam@int:max(0, erlang:round(math:floor(L - 3.0))), gleam@int:max(0, erlang:round(math:floor(R - 3.0))), gleam@int:max(0, erlang:round(math:floor(T - 3.0)))}}; _ -> {error, nil} end end, Height_constrained = case erlang:element(2, Text_input) of {text_input_node, _} -> false; text_area -> _pipe = With_defaults, _pipe@1 = gleam@list:filter_map(_pipe, fun get_height/1), _pipe@2 = lists:reverse(_pipe@1), _pipe@3 = gleam@list:first(_pipe@2), _pipe@4 = gleam@result:map(_pipe@3, fun is_constrained/1), gleam@result:unwrap(_pipe@4, false) end, Parent_padding = begin _pipe@5 = With_defaults, _pipe@6 = gleam@list:filter_map(_pipe@5, Get_padding), _pipe@7 = lists:reverse(_pipe@6), _pipe@8 = gleam@list:first(_pipe@7), gleam@result:unwrap(_pipe@8, {box, 0, 0, 0, 0}) end, Input_element = legos@internal@model:element( as_el, case erlang:element(2, Text_input) of {text_input_node, _} -> {node_name, <<"input"/utf8>>}; text_area -> {node_name, <<"textarea"/utf8>>} end, lists:append([case erlang:element(2, Text_input) of {text_input_node, Input_type} -> [{attr, lustre@attribute:type_(Input_type)}, legos@internal@model:html_class(<<"it"/utf8>>)]; text_area -> [legos@element:clip(), legos@element:height(legos@element:fill()), legos@internal@model:html_class(<<"iml"/utf8>>), calc_move_to_compensate_for_padding(With_defaults), legos@element:padding_each( erlang:element(5, Parent_padding), erlang:element(4, Parent_padding), erlang:element(2, Parent_padding), erlang:element(3, Parent_padding) ), {attr, lustre@attribute:style( <<"margin"/utf8>>, render_box(negate_box(Parent_padding)) )}, {attr, lustre@attribute:style( <<"box-sizing"/utf8>>, <<"content-box"/utf8>> )}] end, [{attr, lustre@attribute:value(Text_val)}, {attr, lustre@event:on_input(On_change)}, hidden_label_attribute(Label_val), {attr, lustre@attribute:spellcheck( erlang:element(3, Text_input) )}, case erlang:element(4, Text_input) of {some, Value} -> {attr, lustre@attribute:autocomplete(Value)}; none -> no_attribute end], erlang:element(5, Redistributed)]), {unkeyed, []} ), Wrapped_input = case erlang:element(2, Text_input) of text_area -> legos@internal@model:element( as_el, generic, begin _pipe@9 = [legos@element:width(legos@element:fill()), case gleam@list:any( With_defaults, fun has_focus_style/1 ) of true -> no_attribute; false -> legos@internal@model:html_class( <<"focus-within"/utf8>> ) end, legos@internal@model:html_class(<<"implw"/utf8>>) | erlang:element(3, Redistributed)], (fun(A) -> case Height_constrained of true -> [legos@element:scrollbar_y() | A]; false -> A end end)(_pipe@9) end, {unkeyed, [legos@internal@model:element( as_paragraph, generic, [legos@element:width(legos@element:fill()), legos@element:height(legos@element:fill()), legos@element:in_front(Input_element), legos@internal@model:html_class(<<"imlp"/utf8>>) | erlang:element(4, Redistributed)], {unkeyed, case Text_val =:= <<""/utf8>> of true -> case Placeholder of none -> [legos@element:text( <<"\x{00A0}"/utf8>> )]; {some, Place} -> [render_placeholder( Place, [], true )] end; false -> [legos@internal@model:unstyled( lustre@element@html:span( [lustre@attribute:class( <<"imlf"/utf8>> )], [lustre@element@html:text( <> )] ) )] end} )]} ); {text_input_node, _} -> legos@internal@model:element( as_el, generic, [legos@element:width(legos@element:fill()), case gleam@list:any(With_defaults, fun has_focus_style/1) of true -> no_attribute; false -> legos@internal@model:html_class( <<"focus-within"/utf8>> ) end | lists:append( [erlang:element(3, Redistributed), case Placeholder of none -> []; {some, Place@1} -> [legos@element:behind_content( render_placeholder( Place@1, erlang:element(6, Redistributed), Text_val =:= <<""/utf8>> ) )] end] )], {unkeyed, [Input_element]} ) end, apply_label( [{class, legos@internal@flag:cursor(), <<"ctxt"/utf8>>}, case is_hidden_label(Label_val) of true -> no_attribute; false -> legos@element:spacing(5) end, legos@region:announce() | erlang:element(2, Redistributed)], Label_val, Wrapped_input ). -file("src/legos/input.gleam", 318). ?DOC(" Create a basic text input\n"). -spec text_input( list(legos@internal@model:attribute(legos@internal@model:aligned(), VHU)), fun((binary()) -> VHU), binary(), gleam@option:option(placeholder(VHU)), label(VHU) ) -> legos@internal@model:element(VHU). text_input(Attrs, On_change, Text, Placeholder, Label) -> text_helper( {text_input, {text_input_node, <<"text"/utf8>>}, false, none}, Attrs, On_change, Text, Placeholder, Label ). -file("src/legos/input.gleam", 336). ?DOC(" Create a spell-checked text input\n"). -spec spell_checked( list(legos@internal@model:attribute(legos@internal@model:aligned(), VIB)), fun((binary()) -> VIB), binary(), gleam@option:option(placeholder(VIB)), label(VIB) ) -> legos@internal@model:element(VIB). spell_checked(Attrs, On_change, Text, Placeholder, Label) -> text_helper( {text_input, {text_input_node, <<"text"/utf8>>}, true, none}, Attrs, On_change, Text, Placeholder, Label ). -file("src/legos/input.gleam", 354). ?DOC(" Create a search input\n"). -spec search( list(legos@internal@model:attribute(legos@internal@model:aligned(), VII)), fun((binary()) -> VII), binary(), gleam@option:option(placeholder(VII)), label(VII) ) -> legos@internal@model:element(VII). search(Attrs, On_change, Text, Placeholder, Label) -> text_helper( {text_input, {text_input_node, <<"search"/utf8>>}, false, none}, Attrs, On_change, Text, Placeholder, Label ). -file("src/legos/input.gleam", 376). ?DOC(" Create a username input\n"). -spec username( list(legos@internal@model:attribute(legos@internal@model:aligned(), VIP)), fun((binary()) -> VIP), binary(), gleam@option:option(placeholder(VIP)), label(VIP) ) -> legos@internal@model:element(VIP). username(Attrs, On_change, Text, Placeholder, Label) -> text_helper( {text_input, {text_input_node, <<"text"/utf8>>}, false, {some, <<"username"/utf8>>}}, Attrs, On_change, Text, Placeholder, Label ). -file("src/legos/input.gleam", 398). ?DOC(" Create an email input\n"). -spec email( list(legos@internal@model:attribute(legos@internal@model:aligned(), VIW)), fun((binary()) -> VIW), binary(), gleam@option:option(placeholder(VIW)), label(VIW) ) -> legos@internal@model:element(VIW). email(Attrs, On_change, Text, Placeholder, Label) -> text_helper( {text_input, {text_input_node, <<"email"/utf8>>}, false, {some, <<"email"/utf8>>}}, Attrs, On_change, Text, Placeholder, Label ). -file("src/legos/input.gleam", 420). ?DOC(" Create a new password input\n"). -spec new_password( list(legos@internal@model:attribute(legos@internal@model:aligned(), VJD)), fun((binary()) -> VJD), binary(), gleam@option:option(placeholder(VJD)), label(VJD), boolean() ) -> legos@internal@model:element(VJD). new_password(Attrs, On_change, Text_val, Placeholder_val, Label_val, Show) -> text_helper({text_input, {text_input_node, case Show of true -> <<"text"/utf8>>; false -> <<"password"/utf8>> end}, false, {some, <<"new-password"/utf8>>}}, Attrs, On_change, Text_val, Placeholder_val, Label_val). -file("src/legos/input.gleam", 446). ?DOC(" Create a current password input\n"). -spec current_password( list(legos@internal@model:attribute(legos@internal@model:aligned(), VJK)), fun((binary()) -> VJK), binary(), gleam@option:option(placeholder(VJK)), label(VJK), boolean() ) -> legos@internal@model:element(VJK). current_password(Attrs, On_change, Text_val, Placeholder_val, Label_val, Show) -> text_helper({text_input, {text_input_node, case Show of true -> <<"text"/utf8>>; false -> <<"password"/utf8>> end}, false, {some, <<"current-password"/utf8>>}}, Attrs, On_change, Text_val, Placeholder_val, Label_val). -file("src/legos/input.gleam", 472). ?DOC(" Create a multiline text input (textarea)\n"). -spec multiline( list(legos@internal@model:attribute(legos@internal@model:aligned(), VJR)), fun((binary()) -> VJR), binary(), gleam@option:option(placeholder(VJR)), label(VJR), boolean() ) -> legos@internal@model:element(VJR). multiline( Attrs, On_change, Text_val, Placeholder_val, Label_val, Spellcheck_val ) -> text_helper( {text_input, text_area, Spellcheck_val, none}, Attrs, On_change, Text_val, Placeholder_val, Label_val ). -file("src/legos/input.gleam", 112). ?DOC(" Create a button element\n"). -spec button( list(legos@internal@model:attribute(legos@internal@model:aligned(), VHA)), gleam@option:option(VHA), legos@internal@model:element(VHA) ) -> legos@internal@model:element(VHA). button(Attrs, On_press, Label) -> legos@internal@model:element( as_el, generic, [legos@element:width(legos@element:shrink()), legos@element:height(legos@element:shrink()), legos@internal@model:html_class( <<<<<<<<<<<<(<<"ccx"/utf8>>)/binary, " "/utf8>>/binary, (<<"ccy"/utf8>>)/binary>>/binary, " "/utf8>>/binary, (<<"sbt"/utf8>>)/binary>>/binary, " "/utf8>>/binary, (<<"notxt"/utf8>>)/binary>> ), legos@element:pointer(), focus_default(Attrs), {describe, button}, {attr, lustre@attribute:tabindex(0)} | case On_press of none -> [{attr, lustre@attribute:disabled(true)} | Attrs]; {some, Msg} -> [legos@events:on_click(Msg), on_key_lookup(Msg, fun(Code) -> case Code of C when C =:= <<"Enter"/utf8>> -> {some, Msg}; C@1 when C@1 =:= <<" "/utf8>> -> {some, Msg}; _ -> none end end) | Attrs] end], {unkeyed, [Label]} ). -file("src/legos/input.gleam", 172). ?DOC(" Create a checkbox input\n"). -spec checkbox( list(legos@internal@model:attribute(legos@internal@model:aligned(), VHM)), fun((boolean()) -> VHM), fun((boolean()) -> legos@internal@model:element(VHM)), boolean(), label(VHM) ) -> legos@internal@model:element(VHM). checkbox(Attrs, On_change, Icon, Checked, Label) -> Attributes = [case is_hidden_label(Label) of true -> no_attribute; false -> legos@element:spacing(6) end, legos@events:on_click(On_change(not Checked)), legos@region:announce( ), on_key_lookup(On_change(true), fun(Code) -> case Code of C when C =:= <<"Enter"/utf8>> -> {some, On_change(not Checked)}; C@1 when C@1 =:= <<" "/utf8>> -> {some, On_change(not Checked)}; _ -> none end end), tab_index(0), legos@element:pointer(), legos@element:align_left( ), legos@element:width(legos@element:fill()) | Attrs], apply_label( [{attr, lustre@attribute:role(<<"checkbox"/utf8>>)}, {attr, lustre@attribute:aria_checked(case Checked of true -> <<"true"/utf8>>; false -> <<"false"/utf8>> end)}, hidden_label_attribute(Label) | Attributes], Label, legos@internal@model:element( as_el, generic, [legos@element:center_y(), legos@element:height(legos@element:fill()), legos@element:width(legos@element:shrink())], {unkeyed, [Icon(Checked)]} ) ).