packages feed

kitchen-sink-0.1.0.0: src/KitchenSink/Layout/Blog/Metadata.hs

module KitchenSink.Layout.Blog.Metadata (
    MetaData (..),
    HomeLinkSpec (..),
    defaultHomeLink,
    MenuItem (..),
    FooterColumn (..),
    FooterSpec (..),
    epochUTCTime,
) where

import Data.Time.Calendar.OrdinalDate (fromOrdinalDate)
import Data.Time.Clock (UTCTime (..), secondsToDiffTime)
import Lucid.Base qualified as Lucid

import KitchenSink.Layout.Blog.Extensions (Article, Assembler)
import KitchenSink.Prelude

data MetaData = MetaData
    { now :: UTCTime
    , baseTitle :: Text
    , publishBaseURL :: Text
    , twitterSiteLogin :: Maybe Text
    , extraHeaders :: Article [Text] -> Assembler (Lucid.Html ())
    , externalKitchenSinkURLs :: [Text]
    , pathPrefix :: Text
    , homeLinkSpec :: HomeLinkSpec
    , menuSpec :: [MenuItem]
    , footerSpec :: Maybe FooterSpec
    }

-- | How the top-left link back to the site root is rendered.
data HomeLinkSpec = HomeLinkSpec
    { homeLabel :: Text
    , homeIcon :: Maybe Text
    -- ^ image URL, relative to the site (the 'pathPrefix' is applied to a root-relative one)
    }

-- | An entry of the header menu (or a link of a footer column). URLs may be
-- root-relative, in which case the 'pathPrefix' is applied when rendering.
data MenuItem = MenuItem
    { menuLabel :: Text
    , menuUrl :: Text
    , menuChildren :: [MenuItem]
    }

data FooterColumn = FooterColumn
    { footerHeading :: Maybe Text
    , footerLinks :: [MenuItem]
    }

data FooterSpec = FooterSpec
    { footerColumns :: [FooterColumn]
    , footerLegal :: Maybe Text
    }

defaultHomeLink :: HomeLinkSpec
defaultHomeLink = HomeLinkSpec "Home" Nothing

epochUTCTime :: UTCTime
epochUTCTime = UTCTime (fromOrdinalDate 1970 1) (secondsToDiffTime 0)