{-# LANGUAGE OverloadedStrings #-}
module Lucid.Htmx
( hxBoost_,
hxConfirm_,
hxEncoding_,
hxExt_,
hxDelete_,
hxDisable_,
hxGet_,
hxHeaders_,
hxHistoryElt_,
hxInclude_,
hxIndicator_,
hxParams_,
hxPatch_,
hxPost_,
hxPreserve_,
hxPrompt_,
hxPushUrl_,
hxPut_,
hxRequest_,
hxSelect_,
hxSse_,
hxSwapOob_,
hxSwap_,
hxTarget_,
hxTrigger_,
hxVals_,
hxWs_,
useHtmx,
useHtmxExtension,
useHtmxVersion,
useHtmxVersionExtension,
)
where
import Data.Text (Text, pack)
import Lucid (Html, HtmlT, script_, src_)
import Lucid.Base (Attribute, makeAttribute)
-- |
hxBoost_ :: Text -> Attribute
hxBoost_ = makeAttribute "data-hx-boost"
-- |
hxConfirm_ :: Text -> Attribute
hxConfirm_ = makeAttribute "data-hx-confirm"
-- |
hxDelete_ :: Text -> Attribute
hxDelete_ = makeAttribute "data-hx-delete"
-- |
hxDisable_ :: Attribute
hxDisable_ = makeAttribute "data-hx-disable" mempty
-- |
hxEncoding_ :: Text -> Attribute
hxEncoding_ = makeAttribute "data-hx-encoding"
-- |
hxExt_ :: Text -> Attribute
hxExt_ = makeAttribute "data-hx-ext"
-- |
hxGet_ :: Text -> Attribute
hxGet_ = makeAttribute "data-hx-get"
-- |
hxHeaders_ :: Text -> Attribute
hxHeaders_ = makeAttribute "data-hx-headers"
-- |
hxHistoryElt_ :: Attribute
hxHistoryElt_ = makeAttribute "data-hx-history-elt" mempty
-- |
hxInclude_ :: Text -> Attribute
hxInclude_ = makeAttribute "data-hx-include"
-- |
hxIndicator_ :: Text -> Attribute
hxIndicator_ = makeAttribute "data-hx-indicator"
-- |
hxParams_ :: Text -> Attribute
hxParams_ = makeAttribute "data-hx-params"
-- |
hxPatch_ :: Text -> Attribute
hxPatch_ = makeAttribute "data-hx-patch"
-- |
hxPost_ :: Text -> Attribute
hxPost_ = makeAttribute "data-hx-post"
-- |
hxPreserve_ :: Text -> Attribute
hxPreserve_ = makeAttribute "data-hx-preserve"
-- |
hxPrompt_ :: Text -> Attribute
hxPrompt_ = makeAttribute "data-hx-prompt"
-- |
hxPushUrl_ :: Text -> Attribute
hxPushUrl_ = makeAttribute "data-hx-push-url"
-- |
hxPut_ :: Text -> Attribute
hxPut_ = makeAttribute "data-hx-put"
-- |
hxRequest_ :: Text -> Attribute
hxRequest_ = makeAttribute "data-hx-request"
-- |
hxSelect_ :: Text -> Attribute
hxSelect_ = makeAttribute "data-hx-select"
-- |
hxSse_ :: Text -> Attribute
hxSse_ = makeAttribute "data-hx-sse"
-- |
hxSwapOob_ :: Text -> Attribute
hxSwapOob_ = makeAttribute "data-hx-swap-oob"
-- |
hxSwap_ :: Text -> Attribute
hxSwap_ = makeAttribute "data-hx-swap"
-- |
hxTarget_ :: Text -> Attribute
hxTarget_ = makeAttribute "data-hx-target"
-- |
hxTrigger_ :: Text -> Attribute
hxTrigger_ = makeAttribute "data-hx-trigger"
-- |
hxVals_ :: Text -> Attribute
hxVals_ = makeAttribute "data-hx-vals"
-- |
hxWs_ :: Text -> Attribute
hxWs_ = makeAttribute "data-hx-ws"
-- | Place in your @head_@ tag to use htmx attributes in your lucid template
useHtmx :: Monad m => HtmlT m ()
useHtmx = script_ [src_ htmxSrc] ("" :: Html ())
-- | Place in your template after @useHtmx@, but before where the extension is used via @hxExt_@
useHtmxExtension :: Monad m => Text -> HtmlT m ()
useHtmxExtension ext = script_ [src_ $ htmxSrc <> extensionPath ext] ("" :: Html ())
-- | Choose the version of htmx to use using a 3-tuple representing semantic versioning
useHtmxVersion :: Monad m => (Int, Int, Int) -> HtmlT m ()
useHtmxVersion semVer = script_ [src_ $ htmxSrcWithSemVer semVer] ("" :: Html ())
-- | Choose the version of a htmx extension you want to use.
-- Should only be used when using @useHtmxVersion@ and the semantic version should be the same
useHtmxVersionExtension :: Monad m => (Int, Int, Int) -> Text -> HtmlT m ()
useHtmxVersionExtension semVer ext = script_ [src_ $ htmxSrcWithSemVer semVer <> extensionPath ext] ("" :: Html ())
htmxSrc :: Text
htmxSrc = "https://unpkg.com/htmx.org"
showT :: Show a => a -> Text
showT = pack . show
htmxSrcWithSemVer :: (Int, Int, Int) -> Text
htmxSrcWithSemVer (major, minor, patch) =
htmxSrc
<> "@"
<> showT major
<> "."
<> showT minor
<> "."
<> showT patch
extensionPath :: Text -> Text
extensionPath ext = "/dist/ext/" <> ext <> ".js"