Current section
Files
Jump to
Current section
Files
src/sketch@lustre.erl
-module(sketch@lustre).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([render/3, node/0, ssr/2]).
-export_type([container/0]).
-opaque container() :: {document, gleam@dynamic:dynamic_()} |
node |
{shadow, gleam@dynamic:dynamic_()}.
-file("/Users/doctor/Workspace/sketch/sketch_lustre/src/sketch/lustre.gleam", 43).
-spec render(
sketch:style_sheet(),
list(container()),
fun(() -> sketch@lustre@element:element(NOV))
) -> lustre@internals@vdom:element(NOV).
render(Stylesheet, Outputs, View) ->
Stylesheet@1 = sketch@lustre@internals@mutable:wrap(Stylesheet),
New_view = View(),
{St, New_view@1} = sketch@lustre@element:unstyled(
sketch@lustre@internals@mutable:get(Stylesheet@1),
New_view
),
Content = sketch:render(St),
sketch@lustre@internals@mutable:set(Stylesheet@1, St),
gleam@list:fold(
Outputs,
New_view@1,
fun(View@1, Stylesheet@2) -> case Stylesheet@2 of
node ->
Style = lustre@element@html:style([], Content),
case View@1 of
{element, _, _, <<"lustre-fragment"/utf8>>, _, _, _, _} ->
lustre@element:fragment(
[Style | erlang:element(6, View@1)]
);
View@2 ->
lustre@element:fragment([Style, View@2])
end;
{document, Css_stylesheet} ->
gleam@function:tap(
View@1,
fun(_) ->
sketch@lustre@internals@css_stylesheet:replace(
Content,
Css_stylesheet
)
end
);
{shadow, Css_stylesheet} ->
gleam@function:tap(
View@1,
fun(_) ->
sketch@lustre@internals@css_stylesheet:replace(
Content,
Css_stylesheet
)
end
)
end end
).
-file("/Users/doctor/Workspace/sketch/sketch_lustre/src/sketch/lustre.gleam", 144).
-spec node() -> container().
node() ->
node.
-file("/Users/doctor/Workspace/sketch/sketch_lustre/src/sketch/lustre.gleam", 148).
-spec contains_head(lustre@internals@vdom:element(any())) -> boolean().
contains_head(El) ->
case El of
{element, _, _, <<"head"/utf8>>, _, _, _, _} ->
true;
{element, _, _, _, _, Children, _, _} ->
gleam@list:fold(
Children,
false,
fun(Acc, Val) -> Acc orelse contains_head(Val) end
);
_ ->
false
end.
-file("/Users/doctor/Workspace/sketch/sketch_lustre/src/sketch/lustre.gleam", 157).
-spec put_in_head(lustre@internals@vdom:element(NPD), binary()) -> lustre@internals@vdom:element(NPD).
put_in_head(El, Content) ->
case El of
{element, K, N, <<"head"/utf8>>, A, Children, S, V} ->
_pipe = Children,
_pipe@1 = lists:append(
_pipe,
[lustre@element@html:style([], Content)]
),
{element, K, N, <<"head"/utf8>>, A, _pipe@1, S, V};
{element, K@1, N@1, <<"html"/utf8>>, A@1, Children@1, S@1, V@1} ->
_pipe@2 = Children@1,
_pipe@3 = gleam@list:map(
_pipe@2,
fun(Child) -> put_in_head(Child, Content) end
),
{element, K@1, N@1, <<"html"/utf8>>, A@1, _pipe@3, S@1, V@1};
Node ->
Node
end.
-file("/Users/doctor/Workspace/sketch/sketch_lustre/src/sketch/lustre.gleam", 109).
-spec ssr(sketch:style_sheet(), fun(() -> sketch@lustre@element:element(NOY))) -> lustre@internals@vdom:element(NOY).
ssr(Stylesheet, View) ->
New_view = View(),
{Stylesheet@1, New_view@1} = sketch@lustre@element:unstyled(
Stylesheet,
New_view
),
Content = sketch:render(Stylesheet@1),
case contains_head(New_view@1) of
true ->
put_in_head(New_view@1, Content);
false ->
lustre@element:fragment(
[lustre@element@html:style([], Content), New_view@1]
)
end.