{- | Module : Hypermedia.Datastar Description : Haskell SDK for building real-time hypermedia apps with Datastar <https://data-star.dev/ Datastar> is a hypermedia framework: instead of building a JSON API and a JavaScript SPA, you write HTML on the server and let Datastar handle the interactivity. The browser sends requests, the server holds the connection open as a server-sent event (SSE) stream, and pushes HTML fragments, signal updates, or scripts back to the browser as things change. This SDK provides the server-side Haskell API. It builds on <https://hackage.haskell.org/package/wai WAI> so it works with Warp, Scotty, Servant, Yesod, or any other WAI-compatible framework. === Minimal example @ import Hypermedia.Datastar import Network.Wai (Application, responseLBS, requestMethod, pathInfo) import Network.Wai.Handler.Warp qualified as Warp import Network.HTTP.Types (status404) app :: Application app req respond = case (requestMethod req, pathInfo req) of (\"GET\", [\"hello\"]) -> respond $ sseResponse $ \\gen -> sendPatchElements gen (patchElements \"\<div id=\\\"msg\\\"\>Hello!\<\/div\>\") _ -> respond $ responseLBS status404 [] \"Not found\" main :: IO () main = Warp.run 3000 app @ === Module guide * "Hypermedia.Datastar.PatchElements" — send HTML to morph into the DOM * "Hypermedia.Datastar.PatchSignals" — update the browser's reactive signals * "Hypermedia.Datastar.ExecuteScript" — run JavaScript in the browser * "Hypermedia.Datastar.WAI" — SSE streaming, signal decoding, request helpers * "Hypermedia.Datastar.Types" — protocol types and defaults === Further reading * <https://data-star.dev/ Datastar homepage> — guides, reference, and examples * <https://cljdoc.org/d/dev.data-star.clojure/http-kit/1.0.0-RC7/doc/sdk-docs/using-datastar Clojure SDK docs> — excellent Datastar walkthrough that applies across SDKs -} module Hypermedia.Datastar ( -- * Types EventType (..) , ElementPatchMode (..) , ElementNamespace (..) -- * Patch Elements , PatchElements (..) , patchElements , removeElements -- * Patch Signals , PatchSignals (..) , patchSignals -- * Execute Script , ExecuteScript (..) , executeScript -- * WAI , ServerSentEventGenerator , sseResponse , sendPatchElements , sendPatchSignals , sendExecuteScript , readSignals , isDatastarRequest -- * Logger , DatastarLogger(..) , nullLogger , stderrLogger ) where import Hypermedia.Datastar.ExecuteScript (ExecuteScript (..), executeScript) import Hypermedia.Datastar.PatchElements (PatchElements (..), patchElements, removeElements) import Hypermedia.Datastar.PatchSignals (PatchSignals (..), patchSignals) import Hypermedia.Datastar.Types (ElementNamespace (..), ElementPatchMode (..), EventType (..)) import Hypermedia.Datastar.WAI ( ServerSentEventGenerator , isDatastarRequest , readSignals , sendExecuteScript , sendPatchElements , sendPatchSignals , sseResponse ) import Hypermedia.Datastar.Logger (DatastarLogger, nullLogger, stderrLogger)