-module(docs@components@responsive_drawer). -compile([no_auto_import, nowarn_unused_vars]). -export([responsive_drawer/2]). -export_type([model/0, msg/0, responsive_drawer_props/0]). -type model() :: {model, boolean()}. -type msg() :: no_op | show | hide | toggle. -type responsive_drawer_props() :: {responsive_drawer_props, sprocket@context:element(), sprocket@context:element()}. -spec update(model(), msg()) -> model(). update(Model, Msg) -> case Msg of no_op -> Model; show -> {model, true}; hide -> {model, false}; toggle -> {model, not erlang:element(2, Model)} end. -spec initial() -> model(). initial() -> {model, false}. -spec responsive_drawer(sprocket@context:context(), responsive_drawer_props()) -> {sprocket@context:context(), list(sprocket@context:element())}. responsive_drawer(Ctx, Props) -> {responsive_drawer_props, Drawer, Content} = Props, sprocket@hooks@reducer:reducer( Ctx, initial(), fun update/2, fun(Ctx@1, _use1, Dispatch) -> {model, Show} = _use1, sprocket@hooks@callback:callback( Ctx@1, {callback_fn, fun() -> Dispatch(toggle) end}, on_mount, fun(Ctx@2, Toggle_drawer) -> sprocket@hooks@callback:callback( Ctx@2, {callback_fn, fun() -> Dispatch(hide) end}, on_mount, fun(Ctx@3, Hide_drawer) -> Backdrop = sprocket@html:'div'( [sprocket@html@attributes:class( <<"absolute bg-gray-900 bg-opacity-50 dark:bg-opacity-80 inset-0 z-30"/utf8>> ), sprocket@html@attributes:on_click( Hide_drawer )], [] ), sprocket@component:render( Ctx@3, [sprocket@html:'div'( [sprocket@html@attributes:classes( [{some, <<"relative flex-1 flex flex-row"/utf8>>}] )], [sprocket@html:aside( [sprocket@html@attributes:classes( [case Show of true -> {some, <<"block fixed top-0 left-0 bottom-0"/utf8>>}; false -> {some, <<"hidden"/utf8>>} end, {some, <<"md:block w-64 z-40 transition-transform -translate-x-full translate-x-0 transition-transform"/utf8>>}] )], [sprocket@html:'div'( [sprocket@html@attributes:class( <<"h-full px-3 py-4 overflow-y-auto bg-gray-50 dark:bg-gray-800"/utf8>> )], [Drawer] )] ), sprocket@html:'div'( [sprocket@html@attributes:class( <<"relative flex-1 overflow-hidden"/utf8>> )], [sprocket@html:button( [sprocket@html@attributes:on_click( Toggle_drawer ), sprocket@html@attributes:class( <<" sticky top-2 inline-flex sm:hidden items-center p-2 m-2 text-sm text-gray-500 rounded-lg hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-600 "/utf8>> )], [sprocket@html:i( [sprocket@html@attributes:class( <<"fa-solid fa-bars"/utf8>> )], [] )] ), Content] ) | case Show of true -> [Backdrop]; false -> [] end] )] ) end ) end ) end ).