├── .gitignore ├── bower.json ├── README.md └── src └── Pux └── Renderer └── SmolderDOM.purs /.gitignore: -------------------------------------------------------------------------------- 1 | /bower_components/ 2 | /node_modules/ 3 | /.pulp-cache/ 4 | /output/ 5 | /generated-docs/ 6 | /.psc* 7 | /.purs* 8 | /.psa* 9 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "purescript-pux-smolder-dom", 3 | "ignore": [ 4 | "**/.*", 5 | "node_modules", 6 | "bower_components", 7 | "output" 8 | ], 9 | "license": "LGPL-3.0+", 10 | "repository": { 11 | "type": "git", 12 | "url": "git://github.com/bodil/purescript-pux-smolder-dom.git" 13 | }, 14 | "dependencies": { 15 | "purescript-prelude": "^3.1.0", 16 | "purescript-smolder": "^10.1.0", 17 | "purescript-smolder-dom": "^2.0.0", 18 | "purescript-exceptions": "^3.0.0", 19 | "purescript-pux": "^11.0.0" 20 | }, 21 | "devDependencies": { 22 | "purescript-psci-support": "^3.0.0" 23 | }, 24 | "resolutions": { 25 | "purescript-smolder": "^10.1.0" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # purescript-pux-smolder-dom 2 | 3 | A drop-in replacement for Pux's React based renderer which needs no foreign dependencies. 4 | 5 | - [Module Documentation](https://pursuit.purescript.org/packages/purescript-pux-smolder-dom/) 6 | 7 | ## Usage 8 | 9 | Simply replace `Pux.Renderer.React` with `Pux.Renderer.SmolderDOM` in your Pux application: 10 | 11 | ```purescript 12 | import Pux.Renderer.SmolderDOM (renderToDOM) 13 | 14 | ... 15 | 16 | renderToDOM "#app" app.markup app.input 17 | ``` 18 | 19 | ## Licence 20 | 21 | Copyright 2017 Bodil Stokke 22 | 23 | This program is free software: you can redistribute it and/or modify 24 | it under the terms of the GNU Lesser General Public License as 25 | published by the Free Software Foundation, either version 3 of the 26 | License, or (at your option) any later version. 27 | 28 | This program is distributed in the hope that it will be useful, but 29 | WITHOUT ANY WARRANTY; without even the implied warranty of 30 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 31 | Lesser General Public License for more details. 32 | 33 | You should have received a copy of the GNU Lesser General Public 34 | License along with this program. If not, see 35 | . 36 | -------------------------------------------------------------------------------- /src/Pux/Renderer/SmolderDOM.purs: -------------------------------------------------------------------------------- 1 | module Pux.Renderer.SmolderDOM where 2 | 3 | import Prelude 4 | 5 | import Control.Monad.Eff (Eff) 6 | import Control.Monad.Eff.Exception (EXCEPTION, error, throwException) 7 | import DOM (DOM) 8 | import DOM.Event.EventTarget (EventListener, eventListener) 9 | import DOM.HTML (window) 10 | import DOM.HTML.Types (htmlDocumentToParentNode) 11 | import DOM.HTML.Window (document) 12 | import DOM.Node.ParentNode (QuerySelector(..), querySelector) 13 | import DOM.Node.Types (Element) 14 | import Data.List (List) 15 | import Data.Maybe (Maybe(..)) 16 | import Pux.DOM.Events (DOMEvent) 17 | import Pux.DOM.HTML (HTML) 18 | import Signal (Signal, runSignal) 19 | import Signal.Channel (CHANNEL, Channel, send) 20 | import Text.Smolder.Markup (mapEvent) 21 | import Text.Smolder.Renderer.DOM (patch) 22 | 23 | select :: ∀ e. String → Eff (exception :: EXCEPTION, dom :: DOM | e) Element 24 | select selector = do 25 | doc ← window >>= document >>= htmlDocumentToParentNode >>> pure 26 | elem ← querySelector (QuerySelector selector) doc 27 | case elem of 28 | Just elem' → pure elem' 29 | Nothing → throwException (error ("Pux.Renderer.SmolderDOM.select: No element matching " <> show selector)) 30 | 31 | adaptEventHandler :: ∀ ev eff. (Channel (List ev)) → (DOMEvent → ev) → EventListener (channel :: CHANNEL, dom :: DOM | eff) 32 | adaptEventHandler input handler = eventListener \e → do 33 | send input $ pure $ handler e 34 | 35 | renderToDOM :: ∀ ev fx. String → Signal (HTML ev) → Channel (List ev) → Eff (channel :: CHANNEL, exception :: EXCEPTION, dom :: DOM | fx) Unit 36 | renderToDOM selector markup input = do 37 | target ← select selector 38 | runSignal $ markup <#> mapEvent (adaptEventHandler input) >>> patch target 39 | --------------------------------------------------------------------------------