Packages
lustre
3.0.6
5.7.1
5.7.0
5.6.0
5.5.2
5.5.1
5.5.0
5.4.0
5.3.5
5.3.4
5.3.3
5.3.2
5.3.1
5.3.0
5.2.1
5.2.0
5.1.1
5.1.0
5.0.3
5.0.2
5.0.1
5.0.0
4.6.4
4.6.3
4.6.2
4.6.1
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.6
4.3.5
4.3.4
4.3.3
4.3.2
4.3.1
4.3.0
4.2.6
4.2.5
4.2.4
4.2.3
4.2.2
4.2.1
4.2.0
4.1.8
4.1.7
4.1.6
4.1.5
4.1.4
4.1.3
4.1.2
4.1.1
4.1.0
4.0.0
4.0.0-rc1
4.0.0-rc.2
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.12
3.0.11
3.0.10
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.8
3.0.0-rc.7
3.0.0-rc.6
3.0.0-rc.5
3.0.0-rc.4
3.0.0-rc.3
3.0.0-rc.2
3.0.0-rc.1
2.0.1
2.0.0
1.3.0
1.2.0
1.1.0
1.0.0
Create HTML templates, single page applications, Web Components, and real-time server components in Gleam!
Current section
Files
Jump to
Current section
Files
src/lustre@attribute.erl
-module(lustre@attribute).
-compile([no_auto_import, nowarn_unused_vars]).
-export([attribute/2, property/2, on/2, map/2, to_string/1, to_string_builder/1, style/1, class/1, classes/1, id/1, type_/1, value/1, checked/1, placeholder/1, selected/1, accept/1, accept_charset/1, msg/1, autocomplete/1, autofocus/1, disabled/1, name/1, pattern/1, readonly/1, required/1, for/1, max/1, min/1, step/1, cols/1, rows/1, wrap/1, href/1, target/1, download/1, rel/1, src/1, height/1, width/1, alt/1, autoplay/1, controls/1, loop/1]).
-export_type([attribute/1]).
-opaque attribute(EYO) :: {attribute,
binary(),
gleam@dynamic:dynamic_(),
boolean()} |
{event,
binary(),
fun((gleam@dynamic:dynamic_()) -> {ok, EYO} | {error, nil})}.
-spec attribute(binary(), binary()) -> attribute(any()).
attribute(Name, Value) ->
{attribute, Name, gleam@dynamic:from(Value), false}.
-spec property(binary(), any()) -> attribute(any()).
property(Name, Value) ->
{attribute, Name, gleam@dynamic:from(Value), true}.
-spec on(
binary(),
fun((gleam@dynamic:dynamic_()) -> {ok, EYU} | {error, any()})
) -> attribute(EYU).
on(Name, Handler) ->
{event,
<<"on"/utf8, Name/binary>>,
gleam@function:compose(
Handler,
fun(_capture) -> gleam@result:replace_error(_capture, nil) end
)}.
-spec map(attribute(EYZ), fun((EYZ) -> EZB)) -> attribute(EZB).
map(Attr, F) ->
case Attr of
{attribute, Name, Value, As_property} ->
{attribute, Name, Value, As_property};
{event, On, Handler} ->
{event, On, fun(E) -> gleam@result:map(Handler(E), F) end}
end.
-spec to_string(attribute(any())) -> binary().
to_string(Attr) ->
case Attr of
{attribute, Name, Value, false} ->
case gleam@dynamic:classify(Value) of
<<"String"/utf8>> ->
<<<<<<Name/binary, "=\""/utf8>>/binary,
(gleam@dynamic:unsafe_coerce(Value))/binary>>/binary,
"\""/utf8>>;
<<"Boolean"/utf8>> ->
case gleam@dynamic:unsafe_coerce(Value) of
true ->
Name;
false ->
<<""/utf8>>
end;
_ ->
<<<<<<Name/binary, "=\""/utf8>>/binary,
(gleam@string:inspect(Value))/binary>>/binary,
"\""/utf8>>
end;
{attribute, _, _, true} ->
<<""/utf8>>;
{event, On, _} ->
<<"data-lustre-on:"/utf8, On/binary>>
end.
-spec to_string_builder(attribute(any())) -> gleam@string_builder:string_builder().
to_string_builder(Attr) ->
case Attr of
{attribute, Name, Value, false} ->
case gleam@dynamic:classify(Value) of
<<"String"/utf8>> ->
_pipe = [Name,
<<"=\""/utf8>>,
gleam@dynamic:unsafe_coerce(Value),
<<"\""/utf8>>],
gleam@string_builder:from_strings(_pipe);
<<"Boolean"/utf8>> ->
case gleam@dynamic:unsafe_coerce(Value) of
true ->
gleam@string_builder:from_string(Name);
false ->
gleam@string_builder:new()
end;
_ ->
_pipe@1 = [Name,
<<"=\""/utf8>>,
gleam@string:inspect(Value),
<<"\""/utf8>>],
gleam@string_builder:from_strings(_pipe@1)
end;
{attribute, _, _, true} ->
gleam@string_builder:new();
{event, On, _} ->
_pipe@2 = [<<"data-lustre-on:"/utf8>>, On],
gleam@string_builder:from_strings(_pipe@2)
end.
-spec style(list({binary(), binary()})) -> attribute(any()).
style(Properties) ->
attribute(
<<"style"/utf8>>,
(gleam@list:fold(
Properties,
<<""/utf8>>,
fun(Styles, _use1) ->
{Name, Value} = _use1,
<<<<<<<<Styles/binary, Name/binary>>/binary, ":"/utf8>>/binary,
Value/binary>>/binary,
";"/utf8>>
end
))
).
-spec class(binary()) -> attribute(any()).
class(Name) ->
attribute(<<"class"/utf8>>, Name).
-spec classes(list({binary(), boolean()})) -> attribute(any()).
classes(Names) ->
attribute(
<<"class"/utf8>>,
begin
_pipe = Names,
_pipe@1 = gleam@list:filter_map(
_pipe,
fun(Class) -> case erlang:element(2, Class) of
true ->
{ok, erlang:element(1, Class)};
false ->
{error, nil}
end end
),
gleam@string:join(_pipe@1, <<" "/utf8>>)
end
).
-spec id(binary()) -> attribute(any()).
id(Name) ->
attribute(<<"id"/utf8>>, Name).
-spec type_(binary()) -> attribute(any()).
type_(Name) ->
attribute(<<"type"/utf8>>, Name).
-spec value(gleam@dynamic:dynamic_()) -> attribute(any()).
value(Val) ->
property(<<"value"/utf8>>, Val).
-spec checked(boolean()) -> attribute(any()).
checked(Is_checked) ->
property(<<"checked"/utf8>>, Is_checked).
-spec placeholder(binary()) -> attribute(any()).
placeholder(Text) ->
attribute(<<"placeholder"/utf8>>, Text).
-spec selected(boolean()) -> attribute(any()).
selected(Is_selected) ->
property(<<"selected"/utf8>>, Is_selected).
-spec accept(list(binary())) -> attribute(any()).
accept(Types) ->
attribute(<<"accept"/utf8>>, gleam@string:join(Types, <<" "/utf8>>)).
-spec accept_charset(list(binary())) -> attribute(any()).
accept_charset(Types) ->
attribute(<<"acceptCharset"/utf8>>, gleam@string:join(Types, <<" "/utf8>>)).
-spec msg(binary()) -> attribute(any()).
msg(Uri) ->
attribute(<<"msg"/utf8>>, Uri).
-spec autocomplete(binary()) -> attribute(any()).
autocomplete(Name) ->
attribute(<<"autocomplete"/utf8>>, Name).
-spec autofocus(boolean()) -> attribute(any()).
autofocus(Should_autofocus) ->
property(<<"autoFocus"/utf8>>, Should_autofocus).
-spec disabled(boolean()) -> attribute(any()).
disabled(Is_disabled) ->
property(<<"disabled"/utf8>>, Is_disabled).
-spec name(binary()) -> attribute(any()).
name(Name) ->
attribute(<<"name"/utf8>>, Name).
-spec pattern(binary()) -> attribute(any()).
pattern(Regex) ->
attribute(<<"pattern"/utf8>>, Regex).
-spec readonly(boolean()) -> attribute(any()).
readonly(Is_readonly) ->
property(<<"readonly"/utf8>>, Is_readonly).
-spec required(boolean()) -> attribute(any()).
required(Is_required) ->
property(<<"required"/utf8>>, Is_required).
-spec for(binary()) -> attribute(any()).
for(Id) ->
attribute(<<"for"/utf8>>, Id).
-spec max(binary()) -> attribute(any()).
max(Val) ->
attribute(<<"max"/utf8>>, Val).
-spec min(binary()) -> attribute(any()).
min(Val) ->
attribute(<<"min"/utf8>>, Val).
-spec step(binary()) -> attribute(any()).
step(Val) ->
attribute(<<"step"/utf8>>, Val).
-spec cols(integer()) -> attribute(any()).
cols(Val) ->
attribute(<<"cols"/utf8>>, gleam@int:to_string(Val)).
-spec rows(integer()) -> attribute(any()).
rows(Val) ->
attribute(<<"rows"/utf8>>, gleam@int:to_string(Val)).
-spec wrap(binary()) -> attribute(any()).
wrap(Mode) ->
attribute(<<"wrap"/utf8>>, Mode).
-spec href(binary()) -> attribute(any()).
href(Uri) ->
attribute(<<"href"/utf8>>, Uri).
-spec target(binary()) -> attribute(any()).
target(Target) ->
attribute(<<"target"/utf8>>, Target).
-spec download(binary()) -> attribute(any()).
download(Filename) ->
attribute(<<"download"/utf8>>, Filename).
-spec rel(binary()) -> attribute(any()).
rel(Relationship) ->
attribute(<<"rel"/utf8>>, Relationship).
-spec src(binary()) -> attribute(any()).
src(Uri) ->
attribute(<<"src"/utf8>>, Uri).
-spec height(integer()) -> attribute(any()).
height(Val) ->
property(<<"height"/utf8>>, gleam@int:to_string(Val)).
-spec width(integer()) -> attribute(any()).
width(Val) ->
property(<<"width"/utf8>>, gleam@int:to_string(Val)).
-spec alt(binary()) -> attribute(any()).
alt(Text) ->
attribute(<<"alt"/utf8>>, Text).
-spec autoplay(boolean()) -> attribute(any()).
autoplay(Should_autoplay) ->
property(<<"autoplay"/utf8>>, Should_autoplay).
-spec controls(boolean()) -> attribute(any()).
controls(Visible) ->
property(<<"controls"/utf8>>, Visible).
-spec loop(boolean()) -> attribute(any()).
loop(Should_loop) ->
property(<<"loop"/utf8>>, Should_loop).