-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.