-----------------------------------------------------------------------------
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE MultilineStrings  #-}
{-# LANGUAGE RecordWildCards   #-}
-----------------------------------------------------------------------------
module Miso.UI.Sidebar
  ( -- ** Props
    SidebarProps (..)
  , defaultSidebarProps
    -- ** Views
  , sidebar_
  , sidebarGroup_
  , sidebarNav_
  , sidebarItem_
    -- ** Samples
  , sidebarCodeSample
  , sidebarPropsApi
  ) where
-----------------------------------------------------------------------------
import           Miso
import qualified Miso.Html.Element as H
import qualified Miso.Html.Property as P
-----------------------------------------------------------------------------
-- | Props for 'sidebar_'
data SidebarProps action
  = SidebarProps
  { forall action. SidebarProps action -> MisoString
sidebarId :: MisoString
  , forall action. SidebarProps action -> Bool
sidebarOpen :: Bool
    -- ^ Visible (@aria-hidden@ when closed)
  , forall action. SidebarProps action -> [MisoString]
sidebarClasses :: [MisoString]
    -- ^ Extra classes appended to @aside.sidebar@
  , forall action. SidebarProps action -> [Attribute action]
sidebarAttrs :: [Attribute action]
  }
-----------------------------------------------------------------------------
-- | Smart constructor: open sidebar
defaultSidebarProps :: SidebarProps action
defaultSidebarProps :: forall action. SidebarProps action
defaultSidebarProps
  = SidebarProps
  { sidebarId :: MisoString
sidebarId = MisoString
"sidebar"
  , sidebarOpen :: Bool
sidebarOpen = Bool
True
  , sidebarClasses :: [MisoString]
sidebarClasses = []
  , sidebarAttrs :: [Attribute action]
sidebarAttrs = []
  }
-----------------------------------------------------------------------------
-- | <https://basecoatui.com/components/sidebar/ Sidebar>, driven by 'SidebarProps'.
-- Children are 'sidebarGroup_' views wrapped in a @nav@.
sidebar_
  :: SidebarProps action
  -> [View model action]
  -> View model action
sidebar_ :: forall action model.
SidebarProps action -> [View model action] -> View model action
sidebar_ SidebarProps {Bool
[MisoString]
[Attribute action]
MisoString
sidebarId :: forall action. SidebarProps action -> MisoString
sidebarOpen :: forall action. SidebarProps action -> Bool
sidebarClasses :: forall action. SidebarProps action -> [MisoString]
sidebarAttrs :: forall action. SidebarProps action -> [Attribute action]
sidebarId :: MisoString
sidebarOpen :: Bool
sidebarClasses :: [MisoString]
sidebarAttrs :: [Attribute action]
..} [View model action]
kids =
  [Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.aside_
    ( [[Attribute action]] -> [Attribute action]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
      [ [ [MisoString] -> Attribute action
forall action. [MisoString] -> Attribute action
P.classes_ (MisoString
"sidebar" MisoString -> [MisoString] -> [MisoString]
forall a. a -> [a] -> [a]
: [MisoString]
sidebarClasses)
        , MisoString -> Attribute action
forall action. MisoString -> Attribute action
P.id_ MisoString
sidebarId
        , MisoString -> MisoString -> Attribute action
forall action. MisoString -> MisoString -> Attribute action
P.aria_ MisoString
"hidden" (if Bool
sidebarOpen then MisoString
"false" else MisoString
"true")
        ]
      , [Attribute action]
sidebarAttrs
      ]
    )
    [ [Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.nav_ [] [View model action]
kids ]
-----------------------------------------------------------------------------
-- | Labelled group of sidebar items
sidebarGroup_
  :: MisoString
  -- ^ group heading
  -> [View model action]
  -> View model action
sidebarGroup_ :: forall model action.
MisoString -> [View model action] -> View model action
sidebarGroup_ MisoString
heading [View model action]
kids =
  [Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.section_
  [ MisoString -> Attribute action
forall action. MisoString -> Attribute action
P.class_ MisoString
"scrollbar" ]
  [ [Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.h3_ [] [ MisoString -> View model action
forall model action. MisoString -> View model action
text MisoString
heading ]
  , [Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
sidebarNav_ [] [View model action]
kids
  ]
-----------------------------------------------------------------------------
sidebarNav_
  :: [Attribute action]
  -> [View model action]
  -> View model action
sidebarNav_ :: forall action model.
[Attribute action] -> [View model action] -> View model action
sidebarNav_ [Attribute action]
attrs [View model action]
kids =
  [Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.ul_ [Attribute action]
attrs [ [Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.li_ [] [ View model action
k ] | View model action
k <- [View model action]
kids ]
-----------------------------------------------------------------------------
-- | Sidebar link; the 'Bool' marks the current page
sidebarItem_
  :: Bool
  -> MisoString
  -- ^ href
  -> [View model action]
  -> View model action
sidebarItem_ :: forall model action.
Bool -> MisoString -> [View model action] -> View model action
sidebarItem_ Bool
current MisoString
url [View model action]
kids =
  ([Attribute action] -> [View model action] -> View model action)
-> [Attribute action]
-> Bool
-> [Attribute action]
-> [View model action]
-> View model action
forall action model.
([Attribute action] -> [View model action] -> View model action)
-> [Attribute action]
-> Bool
-> [Attribute action]
-> [View model action]
-> View model action
optionalAttrs
    [Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.a_
    [ MisoString -> Attribute action
forall action. MisoString -> Attribute action
P.href_ MisoString
url ]
    Bool
current
    [ MisoString -> MisoString -> Attribute action
forall action. MisoString -> MisoString -> Attribute action
P.aria_ MisoString
"current" MisoString
"page" ]
    [View model action]
kids
-----------------------------------------------------------------------------
sidebarCodeSample :: View model action
sidebarCodeSample :: forall model action. View model action
sidebarCodeSample =
  View model action
"""
  -----------------------------------------------------------------------------
  module MySidebar (mySidebar) where
  -----------------------------------------------------------------------------
  import           Miso
  -----------------------------------------------------------------------------
  import           Miso.UI.Sidebar
  -----------------------------------------------------------------------------
  mySidebar :: View model action
  mySidebar =
    sidebar_ defaultSidebarProps
    [ sidebarGroup_ "Getting Started"
      [ sidebarItem_ True "#introduction" [ "Introduction" ]
      , sidebarItem_ False "#installation" [ "Installation" ]
      ]
    , sidebarGroup_ "Components"
      [ sidebarItem_ False "#accordion" [ "Accordion" ]
      , sidebarItem_ False "#button" [ "Button" ]
      ]
    ]
  """
-----------------------------------------------------------------------------
sidebarPropsApi :: View model action
sidebarPropsApi :: forall model action. View model action
sidebarPropsApi =
  View model action
"""
  -- | Props for 'sidebar_'
  data SidebarProps action
    = SidebarProps
    { sidebarId :: MisoString
    , sidebarOpen :: Bool
      -- ^ Visible (@aria-hidden@ when closed)
    , sidebarClasses :: [MisoString]
      -- ^ Extra classes appended to @aside.sidebar@
    , sidebarAttrs :: [Attribute action]
    }
  -----------------------------------------------------------------------------
  -- | Smart constructor: open sidebar
  defaultSidebarProps :: SidebarProps action
  defaultSidebarProps
    = SidebarProps
    { sidebarId = "sidebar"
    , sidebarOpen = True
    , sidebarClasses = []
    , sidebarAttrs = []
    }
  """
-----------------------------------------------------------------------------