├── .gitignore ├── examples ├── async │ ├── .gitignore │ ├── Makefile │ ├── html │ │ └── index.html │ └── src │ │ └── Main.purs ├── canvas │ ├── .gitignore │ ├── Makefile │ ├── html │ │ └── index.html │ └── src │ │ └── Main.purs ├── select │ ├── .gitignore │ ├── Makefile │ ├── html │ │ └── index.html │ └── src │ │ └── Main.purs ├── todo │ ├── .gitignore │ ├── Makefile │ ├── html │ │ └── index.html │ └── src │ │ └── Main.purs ├── tree │ ├── .gitignore │ ├── Makefile │ ├── html │ │ └── index.html │ └── src │ │ └── Main.purs └── counter │ ├── .gitignore │ ├── Makefile │ ├── html │ └── index.html │ └── src │ └── Main.purs ├── .travis.yml ├── package.json ├── generated-docs ├── SDOM │ ├── Events.md │ ├── Attributes.md │ ├── Components.md │ └── Elements.md └── SDOM.md ├── src ├── SDOM │ ├── Events.purs │ ├── Components.purs │ ├── Attributes.purs │ └── Elements.purs └── SDOM.purs ├── bower.json ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | examples/*/html/index.js 2 | /bower_components/ 3 | /node_modules/ 4 | /.pulp-cache/ 5 | /output/ 6 | /.psc-package/ 7 | /.psc* 8 | /.purs* 9 | /.psa* 10 | -------------------------------------------------------------------------------- /examples/async/.gitignore: -------------------------------------------------------------------------------- 1 | /bower_components/ 2 | /node_modules/ 3 | /.pulp-cache/ 4 | /output/ 5 | /generated-docs/ 6 | /.psc-package/ 7 | /.psc* 8 | /.purs* 9 | /.psa* 10 | -------------------------------------------------------------------------------- /examples/canvas/.gitignore: -------------------------------------------------------------------------------- 1 | /bower_components/ 2 | /node_modules/ 3 | /.pulp-cache/ 4 | /output/ 5 | /generated-docs/ 6 | /.psc-package/ 7 | /.psc* 8 | /.purs* 9 | /.psa* 10 | -------------------------------------------------------------------------------- /examples/select/.gitignore: -------------------------------------------------------------------------------- 1 | /bower_components/ 2 | /node_modules/ 3 | /.pulp-cache/ 4 | /output/ 5 | /generated-docs/ 6 | /.psc-package/ 7 | /.psc* 8 | /.purs* 9 | /.psa* 10 | -------------------------------------------------------------------------------- /examples/todo/.gitignore: -------------------------------------------------------------------------------- 1 | /bower_components/ 2 | /node_modules/ 3 | /.pulp-cache/ 4 | /output/ 5 | /generated-docs/ 6 | /.psc-package/ 7 | /.psc* 8 | /.purs* 9 | /.psa* 10 | -------------------------------------------------------------------------------- /examples/tree/.gitignore: -------------------------------------------------------------------------------- 1 | /bower_components/ 2 | /node_modules/ 3 | /.pulp-cache/ 4 | /output/ 5 | /generated-docs/ 6 | /.psc-package/ 7 | /.psc* 8 | /.purs* 9 | /.psa* 10 | -------------------------------------------------------------------------------- /examples/counter/.gitignore: -------------------------------------------------------------------------------- 1 | /bower_components/ 2 | /node_modules/ 3 | /.pulp-cache/ 4 | /output/ 5 | /generated-docs/ 6 | /.psc-package/ 7 | /.psc* 8 | /.purs* 9 | /.psa* 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | dist: trusty 3 | sudo: required 4 | node_js: stable 5 | install: 6 | - npm install -g bower 7 | - npm install 8 | - bower install 9 | script: 10 | - npm run -s build -------------------------------------------------------------------------------- /examples/async/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | purs compile '../../src/**/*.purs' '../../bower_components/purescript-*/src/**/*.purs' src/Main.purs 3 | purs bundle --main Main --module Main --output html/index.js output/*/*.js 4 | 5 | -------------------------------------------------------------------------------- /examples/todo/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | purs compile '../../src/**/*.purs' '../../bower_components/purescript-*/src/**/*.purs' src/Main.purs 3 | purs bundle --main Main --module Main --output html/index.js output/*/*.js 4 | 5 | -------------------------------------------------------------------------------- /examples/tree/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | purs compile '../../src/**/*.purs' '../../bower_components/purescript-*/src/**/*.purs' src/Main.purs 3 | purs bundle --main Main --module Main --output html/index.js output/*/*.js 4 | 5 | -------------------------------------------------------------------------------- /examples/canvas/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | purs compile '../../src/**/*.purs' '../../bower_components/purescript-*/src/**/*.purs' src/Main.purs 3 | purs bundle --main Main --module Main --output html/index.js output/*/*.js 4 | 5 | -------------------------------------------------------------------------------- /examples/counter/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | purs compile '../../src/**/*.purs' '../../bower_components/purescript-*/src/**/*.purs' src/Main.purs 3 | purs bundle --main Main --module Main --output html/index.js output/*/*.js 4 | 5 | -------------------------------------------------------------------------------- /examples/select/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | purs compile '../../src/**/*.purs' '../../bower_components/purescript-*/src/**/*.purs' src/Main.purs 3 | purs bundle --main Main --module Main --output html/index.js output/*/*.js 4 | 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "clean": "rimraf output && rimraf .pulp-cache", 5 | "build": "pulp build" 6 | }, 7 | "devDependencies": { 8 | "pulp": "^12.3.0", 9 | "purescript-psa": "^0.5.0", 10 | "purescript": "^0.12.0", 11 | "rimraf": "^2.5.4" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /generated-docs/SDOM/Events.md: -------------------------------------------------------------------------------- 1 | ## Module SDOM.Events 2 | 3 | #### `change` 4 | 5 | ``` purescript 6 | change :: forall context e. (context -> Event -> e) -> Handler context e 7 | ``` 8 | 9 | #### `click` 10 | 11 | ``` purescript 12 | click :: forall context e. (context -> Event -> e) -> Handler context e 13 | ``` 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/SDOM/Events.purs: -------------------------------------------------------------------------------- 1 | module SDOM.Events where 2 | 3 | import SDOM 4 | import Web.Event.Event as Event 5 | 6 | change 7 | :: forall context e 8 | . (context -> Event.Event -> e) 9 | -> Handler context e 10 | change = handler "change" 11 | 12 | click 13 | :: forall context e 14 | . (context -> Event.Event -> e) 15 | -> Handler context e 16 | click = handler "click" 17 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "purescript-sdom", 3 | "ignore": [ 4 | "**/.*", 5 | "node_modules", 6 | "bower_components", 7 | "output" 8 | ], 9 | "license": "MIT", 10 | "repository": { 11 | "type": "git", 12 | "url": "git://github.com/paf31/purescript-sdom.git" 13 | }, 14 | "dependencies": { 15 | "purescript-event": "^1.2.3", 16 | "purescript-profunctor": "^4.0.0", 17 | "purescript-refs": "^4.0.0", 18 | "purescript-web-dom": "^1.0.0", 19 | "purescript-web-html": "^1.0.0" 20 | }, 21 | "devDependencies": { 22 | "purescript-psci-support": "^4.0.0", 23 | "purescript-profunctor-lenses": "^4.0.0", 24 | "purescript-drawing": "^4.0.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/canvas/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SDOM Example 5 | 6 | 29 | 30 | 31 |
32 |
33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /examples/counter/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SDOM Example 5 | 6 | 32 | 33 | 34 |
35 |
36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /examples/async/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SDOM Example 5 | 6 | 32 | 33 | 34 |
35 |
36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /examples/select/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SDOM Example 5 | 6 | 34 | 35 | 36 |
37 |
38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /examples/counter/src/Main.purs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import Prelude 4 | 5 | import Data.Maybe (Maybe(..)) 6 | import Effect (Effect) 7 | import Effect.Exception (throw) 8 | import SDOM (SDOM, attach, text, text_) 9 | import SDOM.Elements as E 10 | import SDOM.Events as Events 11 | import Web.DOM.NonElementParentNode (getElementById) 12 | import Web.HTML (window) 13 | import Web.HTML.HTMLDocument (toNonElementParentNode) 14 | import Web.HTML.Window (document) 15 | 16 | counter 17 | :: forall channel context 18 | . SDOM channel context Int Int 19 | counter = 20 | E.div_ 21 | [ E.h1_ [ text_ "Counter" ] 22 | , E.button 23 | [] 24 | [ Events.click \_ _ -> pure \value -> value + 1 ] 25 | [ text \_ value -> "(" <> show value <> ") Increment" ] 26 | ] 27 | 28 | main :: Effect Unit 29 | main = do 30 | document <- map toNonElementParentNode (window >>= document) 31 | container <- getElementById "container" document 32 | case container of 33 | Just el -> void do 34 | attach el 0 counter 35 | Nothing -> throw "No 'container' node!" 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Phil Freeman 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /generated-docs/SDOM/Attributes.md: -------------------------------------------------------------------------------- 1 | ## Module SDOM.Attributes 2 | 3 | #### `for` 4 | 5 | ``` purescript 6 | for :: forall context model. (context -> model -> String) -> Attr context model 7 | ``` 8 | 9 | #### `id` 10 | 11 | ``` purescript 12 | id :: forall context model. (context -> model -> String) -> Attr context model 13 | ``` 14 | 15 | #### `name` 16 | 17 | ``` purescript 18 | name :: forall context model. (context -> model -> String) -> Attr context model 19 | ``` 20 | 21 | #### `className` 22 | 23 | ``` purescript 24 | className :: forall context model. (context -> model -> String) -> Attr context model 25 | ``` 26 | 27 | #### `type_` 28 | 29 | ``` purescript 30 | type_ :: forall context model. (context -> model -> String) -> Attr context model 31 | ``` 32 | 33 | #### `value` 34 | 35 | ``` purescript 36 | value :: forall context model. (context -> model -> String) -> Attr context model 37 | ``` 38 | 39 | #### `checked` 40 | 41 | ``` purescript 42 | checked :: forall context model. (context -> model -> Boolean) -> Attr context model 43 | ``` 44 | 45 | #### `disabled` 46 | 47 | ``` purescript 48 | disabled :: forall context model. (context -> model -> Boolean) -> Attr context model 49 | ``` 50 | 51 | 52 | -------------------------------------------------------------------------------- /examples/tree/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SDOM Example 5 | 6 | 53 | 54 | 55 |
56 |
57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /generated-docs/SDOM/Components.md: -------------------------------------------------------------------------------- 1 | ## Module SDOM.Components 2 | 3 | #### `textbox` 4 | 5 | ``` purescript 6 | textbox :: forall channel context. SDOM channel context String String 7 | ``` 8 | 9 | Render a textbox component whose model is a `String`. 10 | 11 | _Note_: the model type can easily be changed using a lens. 12 | 13 | #### `checkbox` 14 | 15 | ``` purescript 16 | checkbox :: forall model channel context. (context -> model -> String) -> (model -> Boolean) -> (model -> Boolean -> model) -> SDOM channel context model model 17 | ``` 18 | 19 | Render a checkbox and an accompanying `label` inside a `span`. 20 | 21 | The first argument chooses a unique name for the input component so that it 22 | can be connected to the label. 23 | 24 | The second and third arguments encapsulate the `checked` status of the 25 | checkbox as a getter/setter pair. 26 | 27 | #### `select` 28 | 29 | ``` purescript 30 | select :: forall option channel context. (option -> { key :: String, label :: String }) -> (String -> option) -> Array option -> SDOM channel context option option 31 | ``` 32 | 33 | Render a select component. 34 | 35 | The first and second arguments encapsulate the selected option 36 | as a getter/setter pair on the model type. 37 | 38 | The third argument converts an option to a unique key and a rendered label. 39 | 40 | The fourth argument converts a key back into an option. 41 | 42 | The fifth argument is an array of all available options. 43 | 44 | 45 | -------------------------------------------------------------------------------- /examples/select/src/Main.purs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import Prelude 4 | 5 | import Data.Maybe (Maybe(..)) 6 | import Effect (Effect) 7 | import Effect.Exception (throw) 8 | import SDOM (SDOM, attach, text, text_) 9 | import SDOM.Components as Components 10 | import SDOM.Elements as E 11 | import Web.DOM.NonElementParentNode (getElementById) 12 | import Web.HTML (window) 13 | import Web.HTML.HTMLDocument (toNonElementParentNode) 14 | import Web.HTML.Window (document) 15 | 16 | data WidgetType 17 | = BasicWidget 18 | | SuperWidget 19 | | UltraWidget 20 | 21 | fromString :: String -> WidgetType 22 | fromString "basic" = BasicWidget 23 | fromString "super" = SuperWidget 24 | fromString _ = UltraWidget 25 | 26 | toString :: WidgetType -> String 27 | toString BasicWidget = "basic" 28 | toString SuperWidget = "super" 29 | toString UltraWidget = "ultra" 30 | 31 | labelFor :: WidgetType -> String 32 | labelFor BasicWidget = "Basic widget" 33 | labelFor SuperWidget = "Super widget" 34 | labelFor UltraWidget = "Ultra widget" 35 | 36 | priceOf :: WidgetType -> String 37 | priceOf BasicWidget = "$9.99" 38 | priceOf SuperWidget = "$99.99" 39 | priceOf UltraWidget = "$999.99" 40 | 41 | select 42 | :: forall channel context 43 | . SDOM channel context WidgetType WidgetType 44 | select = 45 | E.div_ 46 | [ E.h1_ [ text_ "Select" ] 47 | , E.p_ 48 | [ text_ "Choose a product: " 49 | , Components.select 50 | (\option -> { key: toString option, label: labelFor option }) 51 | fromString 52 | [ BasicWidget 53 | , SuperWidget 54 | , UltraWidget 55 | ] 56 | ] 57 | , E.p_ [ text \_ selectedProduct -> "The price is " <> priceOf selectedProduct ] 58 | ] 59 | 60 | main :: Effect Unit 61 | main = do 62 | document <- map toNonElementParentNode (window >>= document) 63 | container <- getElementById "container" document 64 | case container of 65 | Just el -> void do 66 | attach el BasicWidget select 67 | Nothing -> throw "No 'container' node!" 68 | -------------------------------------------------------------------------------- /examples/todo/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SDOM Example 6 | 7 | 85 | 86 | 87 |
88 |
89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /examples/canvas/src/Main.purs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import Prelude 4 | 5 | import Color (rgba, white) 6 | import Control.Plus (empty) 7 | import Data.Int (round, toNumber) 8 | import Data.Maybe (Maybe(..)) 9 | import Data.Profunctor (dimap, lcmap) 10 | import Effect (Effect) 11 | import Effect.Exception (throw) 12 | import FRP.Event (subscribe) 13 | import Global (readInt) 14 | import Graphics.Canvas (getContext2D, setCanvasHeight, setCanvasWidth) 15 | import Graphics.Drawing (Drawing, circle, fillColor, filled, rectangle, render) 16 | import SDOM (SDOM, attach, text_, unsafeSDOM) 17 | import SDOM.Components (textbox) 18 | import SDOM.Elements as E 19 | import Unsafe.Coerce (unsafeCoerce) 20 | import Web.DOM.Document (createElement) 21 | import Web.DOM.Element (toNode) 22 | import Web.DOM.Node (appendChild) 23 | import Web.DOM.NonElementParentNode (getElementById) 24 | import Web.HTML (window) 25 | import Web.HTML.HTMLDocument (toDocument, toNonElementParentNode) 26 | import Web.HTML.Window (document) 27 | 28 | drawing :: forall channel context model. SDOM channel context Drawing model 29 | drawing = unsafeSDOM \node _ d updates -> do 30 | doc <- window >>= document 31 | canvasEl <- createElement "canvas" (toDocument doc) 32 | let canvas = unsafeCoerce canvasEl 33 | _ <- setCanvasWidth canvas 200.0 34 | _ <- setCanvasHeight canvas 200.0 35 | context <- getContext2D canvas 36 | _ <- appendChild (toNode canvasEl) node 37 | render context d 38 | unsubscribe <- updates `subscribe` \{ new } -> render context new 39 | pure 40 | { events: empty 41 | , unsubscribe 42 | } 43 | 44 | renderCircle :: Int -> Drawing 45 | renderCircle radius = 46 | filled (fillColor (rgba 71 65 108 1.0)) (rectangle 0.0 0.0 200.0 200.0) 47 | <> filled (fillColor white) (circle 100.0 100.0 (toNumber radius)) 48 | 49 | app 50 | :: forall channel context 51 | . SDOM channel context Int Int 52 | app = 53 | E.div_ 54 | [ E.h1_ [ text_ "Canvas" ] 55 | , lcmap renderCircle drawing 56 | , E.p_ [ text_ "Radius: " 57 | , dimap show (round <<< readInt 10) textbox 58 | ] 59 | ] 60 | 61 | main :: Effect Unit 62 | main = do 63 | document <- map toNonElementParentNode (window >>= document) 64 | container <- getElementById "container" document 65 | case container of 66 | Just el -> void do 67 | attach el 100 app 68 | Nothing -> throw "No 'container' node!" 69 | -------------------------------------------------------------------------------- /examples/todo/src/Main.purs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import Prelude 4 | 5 | import Data.Array (deleteAt, filter, length) 6 | import Data.Either (Either(..)) 7 | import Data.Lens.Record (prop) 8 | import Data.Maybe (Maybe(..), fromMaybe) 9 | import Data.Profunctor (dimap) 10 | import Data.Symbol (SProxy(..)) 11 | import Effect (Effect) 12 | import Effect.Exception (throw) 13 | import SDOM (ArrayChannel(..), ArrayContext, SDOM, attach, array, text, text_) 14 | import SDOM.Components (textbox, checkbox) 15 | import SDOM.Elements as E 16 | import SDOM.Events as Events 17 | import Web.DOM.NonElementParentNode (getElementById) 18 | import Web.HTML (window) 19 | import Web.HTML.HTMLDocument (toNonElementParentNode) 20 | import Web.HTML.Window (document) 21 | 22 | type Task = 23 | { description :: String 24 | , completed :: Boolean 25 | } 26 | 27 | emptyTask :: Task 28 | emptyTask = 29 | { description: "" 30 | , completed: false 31 | } 32 | 33 | task 34 | :: forall channel context 35 | . SDOM 36 | (ArrayChannel Task channel) 37 | (ArrayContext context) 38 | Task 39 | Task 40 | task = E.span_ 41 | [ checkbox 42 | (\{ index } _ -> "task-" <> show index) 43 | _.completed 44 | (_ { completed = _ }) 45 | , prop (SProxy :: SProxy "description") textbox 46 | , E.button 47 | [] 48 | [ Events.click \{ index } _ -> Left (Here (fromMaybe <*> deleteAt index)) ] 49 | [ text_ "✕" ] 50 | ] 51 | 52 | type TaskList = 53 | { tasks :: Array Task 54 | } 55 | 56 | taskList 57 | :: forall channel context 58 | . SDOM channel context TaskList TaskList 59 | taskList = dimap _.tasks { tasks: _ } $ 60 | E.div_ 61 | [ E.h1_ [ text_ "Task List" ] 62 | , E.button 63 | [] 64 | [ Events.click \_ _ -> pure \xs -> xs <> [emptyTask] ] 65 | [ text_ "+ New Task" ] 66 | , array "ol" (E.li_ [ task ]) 67 | , E.p_ [ text \_ -> summaryLabel ] 68 | ] 69 | where 70 | summaryLabel = 71 | filter _.completed 72 | >>> length 73 | >>> show 74 | >>> (_ <> " tasks completed.") 75 | 76 | main :: Effect Unit 77 | main = do 78 | document <- map toNonElementParentNode (window >>= document) 79 | container <- getElementById "container" document 80 | case container of 81 | Just el -> void do 82 | attach el { tasks: [] } taskList 83 | Nothing -> throw "No 'container' node!" 84 | -------------------------------------------------------------------------------- /examples/async/src/Main.purs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import Prelude 4 | 5 | import Data.Either (Either(..)) 6 | import Data.Maybe (Maybe(..)) 7 | import Effect (Effect) 8 | import Effect.Exception (throw) 9 | import FRP.Event (Event) 10 | import FRP.Event.Time (interval) 11 | import SDOM (SDOM, attach, mapChannel, withAsync, text, text_) 12 | import SDOM.Attributes as A 13 | import SDOM.Elements as E 14 | import SDOM.Events as Events 15 | import Web.DOM.NonElementParentNode (getElementById) 16 | import Web.HTML (window) 17 | import Web.HTML.HTMLDocument (toNonElementParentNode) 18 | import Web.HTML.Window (document) 19 | 20 | data Mode = Increasing | Decreasing | Neither 21 | 22 | derive instance eqMode :: Eq Mode 23 | 24 | type State = 25 | { mode :: Mode 26 | , value :: Int 27 | } 28 | 29 | counter 30 | :: forall context 31 | . SDOM Mode context State State 32 | counter = 33 | E.div_ 34 | [ E.h1_ [ text_ "Async" ] 35 | , E.p_ [ text \_ { value } -> show value ] 36 | , E.p_ 37 | [ E.button 38 | [ A.disabled \_ { mode } -> mode == Decreasing ] 39 | [ Events.click \_ _ -> Left Decreasing ] 40 | [ text_ "Decrement" ] 41 | , text_ " " 42 | , E.button 43 | [ A.disabled \_ { mode } -> mode == Neither ] 44 | [ Events.click \_ _ -> Left Neither ] 45 | [ text_ "Stop" ] 46 | , text_ " " 47 | , E.button 48 | [ A.disabled \_ { mode } -> mode == Increasing ] 49 | [ Events.click \_ _ -> Left Increasing ] 50 | [ text_ "Increment" ] 51 | ] 52 | ] 53 | 54 | -- We must interpret the event channel (of type `Mode`) using the 55 | -- `mapChannel` function. We can return an `Event`, which gives us the 56 | -- ability to deliver results asynchronously using `withAsync`. 57 | counter_ :: forall channel context. SDOM channel context State State 58 | counter_ = 59 | withAsync (mapChannel (map Right <<< interpreter) counter) 60 | where 61 | interpreter :: Mode -> Event (State -> State) 62 | interpreter Increasing = interval 100 $> \{ value } -> { mode: Increasing, value: value + 1 } 63 | interpreter Decreasing = interval 100 $> \{ value } -> { mode: Decreasing, value: value - 1 } 64 | interpreter Neither = pure \{ value } -> { mode: Neither, value } 65 | 66 | main :: Effect Unit 67 | main = do 68 | document <- map toNonElementParentNode (window >>= document) 69 | container <- getElementById "container" document 70 | case container of 71 | Just el -> void do 72 | attach el { value: 0, mode: Neither } counter_ 73 | Nothing -> throw "No 'container' node!" 74 | -------------------------------------------------------------------------------- /src/SDOM/Components.purs: -------------------------------------------------------------------------------- 1 | module SDOM.Components where 2 | 3 | import Prelude 4 | 5 | import SDOM (SDOM, text_) 6 | import SDOM.Attributes as A 7 | import SDOM.Elements as E 8 | import SDOM.Events as Events 9 | import Unsafe.Coerce (unsafeCoerce) 10 | 11 | -- | Render a textbox component whose model is a `String`. 12 | -- | 13 | -- | _Note_: the model type can easily be changed using a lens. 14 | textbox :: forall channel context. SDOM channel context String String 15 | textbox = 16 | E.input 17 | [ A.value \_ val -> val ] 18 | [ Events.change \_ e -> pure \_ -> (unsafeCoerce e).target.value ] 19 | [] 20 | 21 | -- | Render a checkbox and an accompanying `label` inside a `span`. 22 | -- | 23 | -- | The first argument chooses a unique name for the input component so that it 24 | -- | can be connected to the label. 25 | -- | 26 | -- | The second and third arguments encapsulate the `checked` status of the 27 | -- | checkbox as a getter/setter pair. 28 | checkbox 29 | :: forall model channel context 30 | . (context -> model -> String) 31 | -> (model -> Boolean) 32 | -> (model -> Boolean -> model) 33 | -> SDOM channel context model model 34 | checkbox name getChecked setChecked = 35 | E.span_ 36 | [ E.input 37 | [ A.type_ \_ _ -> "checkbox" 38 | , A.checked \_ model -> getChecked model 39 | , A.id \context model -> name context model 40 | ] 41 | [ Events.change \_ e -> pure \model -> 42 | setChecked model (unsafeCoerce e).target.checked 43 | ] 44 | [] 45 | , E.label 46 | [ A.for \context model -> name context model ] 47 | [] 48 | [] 49 | ] 50 | 51 | -- | Render a select component. 52 | -- | 53 | -- | The first and second arguments encapsulate the selected option 54 | -- | as a getter/setter pair on the model type. 55 | -- | 56 | -- | The third argument converts an option to a unique key and a rendered label. 57 | -- | 58 | -- | The fourth argument converts a key back into an option. 59 | -- | 60 | -- | The fifth argument is an array of all available options. 61 | select 62 | :: forall option channel context 63 | . (option -> { key :: String, label :: String }) 64 | -> (String -> option) 65 | -> Array option 66 | -> SDOM channel context option option 67 | select fromOption toOption options = 68 | E.select 69 | [ A.value \_ value -> (fromOption value).key ] 70 | [ Events.change \_ e -> pure \_ -> 71 | toOption (unsafeCoerce e).target.value 72 | ] 73 | (options <#> \option -> 74 | let { key, label } = fromOption option 75 | in E.option [ A.value \_ _ -> key ] [] [ text_ label ] 76 | ) 77 | -------------------------------------------------------------------------------- /src/SDOM/Attributes.purs: -------------------------------------------------------------------------------- 1 | module SDOM.Attributes 2 | ( for 3 | , id 4 | , name 5 | , className 6 | , type_ 7 | , value 8 | , checked 9 | , disabled 10 | ) where 11 | 12 | import Prelude 13 | 14 | import SDOM (Attr, unsafeAttr) 15 | import Unsafe.Coerce (unsafeCoerce) 16 | import Web.DOM.Element (removeAttribute, setAttribute) 17 | import Web.HTML.HTMLInputElement (setChecked, setDisabled, setValue) 18 | 19 | attr :: forall context model. String -> (context -> model -> String) -> Attr context model 20 | attr attrName f = 21 | unsafeAttr \context e -> 22 | { init: \model -> setAttribute attrName (f context model) e 23 | , update: \{ old, new } -> do 24 | let oldValue = f context old 25 | newValue = f context new 26 | when (oldValue /= newValue) (setAttribute attrName newValue e) 27 | } 28 | 29 | for :: forall context model. (context -> model -> String) -> Attr context model 30 | for = attr "for" 31 | 32 | id :: forall context model. (context -> model -> String) -> Attr context model 33 | id = attr "id" 34 | 35 | className :: forall context model. (context -> model -> String) -> Attr context model 36 | className = attr "class" 37 | 38 | name :: forall context model. (context -> model -> String) -> Attr context model 39 | name = attr "name" 40 | 41 | type_ :: forall context model. (context -> model -> String) -> Attr context model 42 | type_ = attr "type" 43 | 44 | value :: forall context model. (context -> model -> String) -> Attr context model 45 | value f = 46 | unsafeAttr \context e -> 47 | let update s = do 48 | setValue s (unsafeCoerce e) 49 | setAttribute "value" s e 50 | in { init: \model -> update (f context model) 51 | , update: \{ old, new } -> do 52 | let oldValue = f context old 53 | newValue = f context new 54 | when (oldValue /= newValue) (update newValue) 55 | } 56 | 57 | checked :: forall context model. (context -> model -> Boolean) -> Attr context model 58 | checked f = 59 | unsafeAttr \context e -> 60 | let update b = do 61 | setChecked b (unsafeCoerce e) 62 | if b then setAttribute "checked" "checked" e 63 | else removeAttribute "checked" e 64 | in { init: \model -> update (f context model) 65 | , update: \{ old, new } -> do 66 | let oldValue = f context old 67 | newValue = f context new 68 | when (oldValue /= newValue) (update newValue) 69 | } 70 | 71 | disabled :: forall context model. (context -> model -> Boolean) -> Attr context model 72 | disabled f = 73 | unsafeAttr \context e -> 74 | let update b = do 75 | setDisabled b (unsafeCoerce e) 76 | if b then setAttribute "disabled" "disabled" e 77 | else removeAttribute "disabled" e 78 | in { init: \model -> update (f context model) 79 | , update: \{ old, new } -> do 80 | let oldValue = f context old 81 | newValue = f context new 82 | when (oldValue /= newValue) (update newValue) 83 | } 84 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # purescript-sdom 2 | 3 | An experiment in replacing the virtual DOM and avoiding diffing. 4 | 5 | - [Module Documentation](generated-docs/) 6 | - Examples 7 | - [Counter](examples/counter) 8 | - [Select](examples/select) 9 | - [Task List](examples/todo) 10 | - [Async](examples/async) 11 | - [Tree](examples/tree) (higher-order component) 12 | - [Canvas](examples/canvas) (third-party component) 13 | 14 | ## Motivation 15 | 16 | The virtual DOM (VDOM) has become a very popular approach to developing applications 17 | in the browser, popularized by libraries like React. A simplified VDOM approach can be 18 | summarized briefly as follows: 19 | 20 | - Choose a type `state` of _application states_. 21 | - Write a function `state -> VDOM` from application states to a virtual DOM 22 | representation of the UI. 23 | - Each time we reach a new state, use a function `diff :: VDOM -> VDOM -> Patch` to 24 | compute the changes to the rendered virtual DOM. 25 | - Use a function `Patch -> Eff (dom :: DOM) Unit` to _apply_ those changes to 26 | the real DOM. 27 | 28 | The VDOM approach has many benefits. However, many web apps which use a 29 | VDOM don't actually require one. 30 | 31 | Consider something like a web form which might contain text inputs and validation 32 | messages. If you didn't have a virtual DOM, you would just lay out the form statically, 33 | set the initial attributes and text values, and add event handlers to update them. 34 | The elements themselves would never change. 35 | 36 | A VDOM approach in this case might be considered overkill - why should I have to 37 | diff two trees of components in order to update a simple label, when I can always 38 | easily figure out which label to update. 39 | 40 | A key benefit of the VDOM is that it hides the complexity of the DOM API behind 41 | a simpler API with a clean denotation: an application is a function from states 42 | to a conceptual representation of the UI. However, operationally it is very heavy. 43 | The potential problem is that the `diff` function above might be quite expensive 44 | to compute. With well-chosen keys on every node, it might be possible to tune this 45 | computation, but there are other options available. 46 | 47 | This library introduces the SDOM, or "static DOM". The idea is that by restricting 48 | components so that the "shape" of the UI becomes static, we can keep the clean 49 | denotation of the VDOM approach, but simplify the operational side dramatically. 50 | The SDOM consists of a static tree of components, with only the leaves (text nodes and 51 | attributes) changing over time. The SDOM approach also allows for limited forms of dynamic 52 | behavior, such as a component which renders a (uniform) array of subcomponents. 53 | 54 | In practice, this is not so much of a restriction, and the limited form of dynamic behavior 55 | is enough to emulate most common UI patterns. Indeed, working with the SDOM is quite 56 | reminiscent of template-based approaches to UI development, but keeping the "one 57 | way binding" approach which is commonly associated with the VDOM. 58 | 59 | ### More 60 | For a more extensive motivation of the SDOM approach, an explanation of the 61 | underlying approach and how it was developed, you may want to check out this 62 | [blog post](http://blog.functorial.com/posts/2018-03-12-You-Might-Not-Need-The-Virtual-DOM.html). 63 | -------------------------------------------------------------------------------- /examples/tree/src/Main.purs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import Prelude 4 | 5 | import Control.Lazy (defer) 6 | import Data.Bifunctor (lmap) 7 | import Data.Either (Either(..)) 8 | import Data.Lens (lens') 9 | import Data.Maybe (Maybe(..)) 10 | import Data.Tuple (Tuple(..)) 11 | import Effect (Effect) 12 | import Effect.Exception (throw) 13 | import SDOM (ArrayChannel(..), SDOM, array, attach, mapContext, interpretChannel, text, text_) 14 | import SDOM.Attributes as A 15 | import SDOM.Elements as E 16 | import SDOM.Events as Events 17 | import Web.DOM.NonElementParentNode (getElementById) 18 | import Web.HTML (window) 19 | import Web.HTML.HTMLDocument (toNonElementParentNode) 20 | import Web.HTML.Window (document) 21 | 22 | data Tree a = Tree a (Array (Tree a)) 23 | 24 | derive instance functorTree :: Functor Tree 25 | 26 | data TreeChannel i channel 27 | = ParentChannel channel 28 | | ModifyRoot (Tree i -> Tree i) 29 | 30 | data TreeContext context 31 | = Root context 32 | | TreeContext Int (TreeContext context) 33 | 34 | renderContext :: forall context. TreeContext context -> String 35 | renderContext (Root _) = "Root" 36 | renderContext (TreeContext i ctx) = renderContext ctx <> " / " <> show i 37 | 38 | buildTree :: Int -> Tree Boolean 39 | buildTree 0 = Tree false [] 40 | buildTree n = Tree false [ t, t ] 41 | where t = buildTree (n - 1) 42 | 43 | tree 44 | :: forall channel context model 45 | . (model -> Boolean) 46 | -> SDOM (TreeChannel model channel) (TreeContext context) model model 47 | -> SDOM channel context (Tree model) (Tree model) 48 | tree getExpanded leaf = interpretChannel (map treeChannel) (go leaf) 49 | where 50 | go :: forall channel' context' 51 | . SDOM channel' (TreeContext context') model model 52 | -> SDOM channel' context' (Tree model) (Tree model) 53 | go l = defer \_ -> 54 | E.li_ 55 | [ mapContext Root 56 | $ lens' (\(Tree lf bs) -> Tuple lf (_ `Tree` bs)) 57 | $ l 58 | , E.span [ A.className \_ (Tree model _) -> if getExpanded model then "" else "collapsed" ] [] 59 | [ lens' (\(Tree lf bs) -> Tuple bs (Tree lf)) 60 | $ array "ul" 61 | $ go 62 | $ interpretChannel (map (lmap Parent <<< Left)) 63 | $ mapContext stepCtx 64 | $ l 65 | ] 66 | ] 67 | 68 | treeChannel 69 | :: TreeChannel model channel 70 | -> Either channel (Tree model -> Tree model) 71 | treeChannel (ParentChannel c) = Left c 72 | treeChannel (ModifyRoot f) = Right f 73 | 74 | stepCtx :: forall context' 75 | . TreeContext { index :: Int , parent :: context' } 76 | -> TreeContext context' 77 | stepCtx (Root { index, parent }) = TreeContext index (Root parent) 78 | stepCtx (TreeContext index context) = TreeContext index (stepCtx context) 79 | 80 | node 81 | :: forall channel context 82 | . SDOM 83 | (TreeChannel Boolean channel) 84 | (TreeContext context) 85 | Boolean 86 | Boolean 87 | node = E.span_ [ E.button 88 | [] 89 | [ Events.click \_ b -> Right not ] 90 | [ text \_ expanded -> if expanded then "-" else "+" ] 91 | , text \ctx _ -> renderContext ctx 92 | ] 93 | 94 | app 95 | :: forall channel context 96 | . SDOM channel context (Tree Boolean) (Tree Boolean) 97 | app = 98 | E.div_ 99 | [ E.h1_ [ text_ "Tree" ] 100 | , E.div [ A.id \_ _ -> "tree" ] [] [ tree identity node ] 101 | ] 102 | 103 | main :: Effect Unit 104 | main = do 105 | document <- map toNonElementParentNode (window >>= document) 106 | container <- getElementById "container" document 107 | case container of 108 | Just el -> void do 109 | attach el (buildTree 4) app 110 | Nothing -> throw "No 'container' node!" 111 | -------------------------------------------------------------------------------- /generated-docs/SDOM.md: -------------------------------------------------------------------------------- 1 | ## Module SDOM 2 | 3 | #### `SDOM` 4 | 5 | ``` purescript 6 | newtype SDOM channel context i o 7 | ``` 8 | 9 | A value of type `SDOM channel context i o` represents a component in the 10 | "static DOM". 11 | 12 | Simple components can be created using the `text` and `element` functions. 13 | The `array` function can be used to create a component which renders a 14 | uniform array of subcomponents. The `SDOM.Components` module also contains 15 | some ready-to-use components. 16 | 17 | Here is an explanation of each type variable: 18 | 19 | - `i` is the type of the model (when used as an input). 20 | Inputs of type `i` will be provided in order to initialize or rerender 21 | the component. 22 | - `o` is the type of the model (when used as an output). 23 | Events raised by the component may change the model by providing a function 24 | of type `i -> o`. The model is split into input and output type arguments 25 | to allow the profunctor instances for `SDOM` to exist, and to enable the 26 | use of profunctor lenses for component composition. 27 | - `context` is the type of the "context" of the component. If the component 28 | is rendered as a child of a dynamically-sized list, the context will include 29 | its index in that list, for example. This type argument may not be needed 30 | in simple components. 31 | - `channel` is the type of the "event channel" of the component. If the 32 | component is rendered as a child of a dynamically-sized list, the channel 33 | type will provide a way to pass an event to the owner of that list, so that 34 | the component can modify the list itself, not just the element of the list 35 | which generated it. For example, we might use the channel to allow a 36 | component to remove itself from a list. 37 | 38 | Since `SDOM` is a _strong profunctor_, we can apply profunctor lenses to values 39 | of type `SDOM channel context i o` directly, to focus a component on a 40 | particular piece of the model: 41 | 42 | ``` 43 | > :type text (const identity) 44 | forall channel context a. SDOM channel context String a 45 | 46 | > import Data.Lens 47 | > :type _1 (text (const identity)) 48 | forall channel context a b. 49 | SDOM channel context 50 | (Tuple String b) 51 | (Tuple a b) 52 | ``` 53 | 54 | ##### Instances 55 | ``` purescript 56 | Functor (SDOM channel context i) 57 | Profunctor (SDOM channel context) 58 | Strong (SDOM channel context) 59 | Lazy (SDOM channel context i o) 60 | ``` 61 | 62 | #### `text` 63 | 64 | ``` purescript 65 | text :: forall channel context i o. (context -> i -> String) -> SDOM channel context i o 66 | ``` 67 | 68 | Create a component which renders a text node based on some part of the 69 | input model. 70 | 71 | The first argument is a function which chooses a `String` to render from 72 | the model. The function also has access to the context of the component. 73 | 74 | For example: 75 | 76 | ``` 77 | > :type text \_ctx model -> model.title 78 | forall channel context a r. 79 | SDOM channel context 80 | { title :: String 81 | | r 82 | } 83 | a 84 | ``` 85 | 86 | #### `text_` 87 | 88 | ``` purescript 89 | text_ :: forall channel context i o. String -> SDOM channel context i o 90 | ``` 91 | 92 | Create a component which renders a (static) text node. 93 | 94 | #### `Attr` 95 | 96 | ``` purescript 97 | newtype Attr context model 98 | ``` 99 | 100 | An attribute which can be associated with an `element`. 101 | 102 | The type arguments correspond to the context and model types of the resulting 103 | component. 104 | 105 | Attributes can be constructed using the functions in the `SDOM.Attributes` 106 | module, or unsafely using the `unsafeAttr` function. 107 | 108 | For example: 109 | 110 | ``` 111 | > import SDOM.Attributes as A 112 | > :type A.type_ \_ model -> model.type 113 | forall context r. 114 | Attr context 115 | { "type" :: String 116 | | r 117 | } 118 | ``` 119 | 120 | #### `unsafeAttr` 121 | 122 | ``` purescript 123 | unsafeAttr :: forall context model. (context -> Element -> { init :: model -> Effect Unit, update :: { old :: model, new :: model } -> Effect Unit }) -> Attr context model 124 | ``` 125 | 126 | Create an attribute unsafely, by providing functions which initialize 127 | and update the attribute. 128 | 129 | _Note_: most applications should not require this function. Consider using 130 | the functions in the `SDOM.Attributes` module instead. 131 | 132 | #### `Handler` 133 | 134 | ``` purescript 135 | newtype Handler context e 136 | ``` 137 | 138 | An event handler which can be associated with an `element`. 139 | 140 | The `context` type argument corresponds to the context type of the resulting 141 | component. The `e` type argument represents the type of event which will be 142 | handled. This might take into account the _event channel_ of the component. 143 | 144 | Event handlers can be constructed using the functions in the `SDOM.Events` 145 | module, or by using the `handler` function. 146 | 147 | For example: 148 | 149 | ``` 150 | > import SDOM.Events as Events 151 | > :type Events.click \_ _ -> unit 152 | forall context. Handler context Unit 153 | ``` 154 | 155 | #### `handler` 156 | 157 | ``` purescript 158 | handler :: forall context e. String -> (context -> Event -> e) -> Handler context e 159 | ``` 160 | 161 | Create a `Handler` for specific events. 162 | 163 | The first argument is the name of the type of events to handle. 164 | 165 | The second argument is a function which produces a result from the raw DOM 166 | event object. The function also has access to the context of the component. 167 | 168 | #### `element` 169 | 170 | ``` purescript 171 | element :: forall channel context i o. String -> Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 172 | ``` 173 | 174 | Create a component which renders an element, including attributes, event 175 | handlers and a (static) list of child components. 176 | 177 | Instead of using this function directly, you probably will want to use the 178 | helper functions in the `SDOM.Elements` module. 179 | 180 | The first argument is the name of the element. 181 | 182 | The second argument is an array of attributes to attach to the rendered element. 183 | 184 | The third argument is an array of event handlers. Note that the result types 185 | of each handler is `Either channel (i -> o)`. That is, an event can _either_ 186 | update the state of the current component (by providing a function of type 187 | `i -> o`), or it can use the _event channel_ to pass a message to a parent 188 | component. 189 | 190 | The fourth argument is a (static) array of child components. 191 | 192 | For example: 193 | 194 | ``` 195 | > import SDOM.Elements as E 196 | > :type E.div [] [] [ text \_ _ -> "Hello, World!"] 197 | forall context channel i o. 198 | SDOM context channel i o 199 | 200 | > import SDOM.Attributes as A 201 | > :type E.input [ A.value \_ model -> model.value ] [] [] 202 | forall context channel o r. 203 | SDOM context channel 204 | { value :: String 205 | | r 206 | } 207 | o 208 | 209 | > import SDOM.Events as Events 210 | > import Unsafe.Coerce (unsafeCoerce) 211 | > :paste 212 | > :type E.input 213 | [ value \_ model -> model.value ] 214 | [ change \_ e -> pure \model -> 215 | model { value = (unsafeCoerce e).target.value } 216 | ] 217 | [] 218 | ^D 219 | forall context channel o r. 220 | SDOM context channel 221 | { value :: String 222 | | r 223 | } 224 | { value :: String 225 | | r 226 | } 227 | ``` 228 | 229 | #### `element_` 230 | 231 | ``` purescript 232 | element_ :: forall channel context i o. String -> Array (SDOM channel context i o) -> SDOM channel context i o 233 | ``` 234 | 235 | Create a component which renders an element with a (static) array of child 236 | components, but no attributes or event handlers. 237 | 238 | Instead of using this function directly, you probably will want to use the 239 | helper functions in the `SDOM.Elements` module. 240 | 241 | For example: 242 | 243 | ``` 244 | > import SDOM.Elements as E 245 | > :type E.div_ [ text \_ _ -> "Hello, World!"] 246 | forall context channel i o. 247 | SDOM context channel i o 248 | ``` 249 | 250 | #### `ArrayChannel` 251 | 252 | ``` purescript 253 | data ArrayChannel i channel 254 | = Parent channel 255 | | Here (Array i -> Array i) 256 | ``` 257 | 258 | The event channel for an `array` component. 259 | 260 | An event is either passed to the next `Parent` in the chain, or handled 261 | `Here`, by acting on the array itself. 262 | 263 | #### `ArrayContext` 264 | 265 | ``` purescript 266 | type ArrayContext context = { index :: Int, parent :: context } 267 | ``` 268 | 269 | The context of subcomponent in an `array` component includes the current 270 | context inherited from the parent, as well as the index of the current 271 | subcomponent. 272 | 273 | #### `array` 274 | 275 | ``` purescript 276 | array :: forall channel context i. String -> SDOM (ArrayChannel i channel) (ArrayContext context) i i -> SDOM channel context (Array i) (Array i) 277 | ``` 278 | 279 | Create a component which renders an array of subcomponents. 280 | 281 | The first argument is the name of the HTML element used as the container. 282 | 283 | The second argument is a template component for rendered subcomponents. 284 | 285 | _Note:_ 286 | 287 | - The context of the template component provides access to the index of 288 | the current subcomponent. 289 | - The event channel for the template component provides the ability to 290 | modify the input array itself. 291 | - This component is optimized for edits at the end of the array. Small 292 | arrays should not present any issues, but large arrays might if edits 293 | typically take place away from the end of the array. 294 | 295 | #### `attach` 296 | 297 | ``` purescript 298 | attach :: forall model. Element -> model -> SDOM Void Unit model model -> Effect { push :: (model -> model) -> Effect Unit, detach :: Effect Unit } 299 | ``` 300 | 301 | Attach a component to the DOM. 302 | 303 | The first argument is the DOM `Element` which will contain the rendered 304 | component. 305 | 306 | The second argument is the initial model. 307 | 308 | The third argument is the component itself. 309 | 310 | The result contains two functions: 311 | 312 | - The `push` function allows the caller to provide additional model updates 313 | which do not arise from user-generated events. 314 | - `The `detach` function detaches the component from the DOM and unregisters 315 | any event handlers. 316 | 317 | #### `unsafeSDOM` 318 | 319 | ``` purescript 320 | unsafeSDOM :: forall channel context i o. (Node -> context -> i -> Event { old :: i, new :: i } -> Effect { events :: Event (Either channel (i -> o)), unsubscribe :: Effect Unit }) -> SDOM channel context i o 321 | ``` 322 | 323 | This function is provided in order to wrap existing Javascript components. 324 | 325 | Most applications should not need to use this function directly. Instead, 326 | you can build components using the other, safe functions exposed by this 327 | module, or reuse components from the `SDOM.Components` module. 328 | 329 | This function accepts a function as its only argument. This function should: 330 | 331 | - Set up any DOM components and render the initial model, 332 | - Subscribe to model updates in order to update those components, 333 | - Return an `events` stream for user events generated by the component, 334 | - Return an `unsubscribe` function to clean up any event handlers when the 335 | component is removed. 336 | 337 | #### `mapContext` 338 | 339 | ``` purescript 340 | mapContext :: forall channel context context' i o. (context' -> context) -> SDOM channel context i o -> SDOM channel context' i o 341 | ``` 342 | 343 | Change the context type of a component. 344 | 345 | #### `mapChannel` 346 | 347 | ``` purescript 348 | mapChannel :: forall channel channel' context i o. (channel -> channel') -> SDOM channel context i o -> SDOM channel' context i o 349 | ``` 350 | 351 | Change the event channel type of a component. 352 | 353 | #### `interpretChannel` 354 | 355 | ``` purescript 356 | interpretChannel :: forall channel channel' context i o. (Event channel -> Event (Either channel' (i -> o))) -> SDOM channel context i o -> SDOM channel' context i o 357 | ``` 358 | 359 | Interpret the event channel of a component. 360 | 361 | #### `withAsync` 362 | 363 | ``` purescript 364 | withAsync :: forall channel context i o. SDOM (Event (Either channel (i -> o))) context i o -> SDOM channel context i o 365 | ``` 366 | 367 | A convenience function which provides the ability to use `Event`s 368 | directly in a component's event channel. 369 | 370 | `Event`s will be disposed of when the component unmounts, or when a new 371 | event takes its place. 372 | 373 | For example, clicking this button starts a timer which raises a `Unit` 374 | event every second. 375 | 376 | ``` 377 | > :type text (const identity) 378 | forall channel context a. SDOM channel context String a 379 | 380 | > import SDOM.Elements as E 381 | > import SDOM.Events as Events 382 | 383 | > handler _ _ = Left (interval 1000 $> Left unit) 384 | 385 | > :type withAsync (E.button [] [Events.click handler] [ text \_ _ -> "Start" ]) 386 | forall channel context model. SDOM Unit channel context model 387 | ``` 388 | 389 | 390 | -------------------------------------------------------------------------------- /src/SDOM.purs: -------------------------------------------------------------------------------- 1 | module SDOM 2 | ( SDOM 3 | , text 4 | , text_ 5 | , Attr 6 | , unsafeAttr 7 | , Handler 8 | , handler 9 | , element 10 | , element_ 11 | , ArrayChannel(..) 12 | , ArrayContext 13 | , array 14 | , attach 15 | , unsafeSDOM 16 | , mapContext 17 | , mapChannel 18 | , interpretChannel 19 | , withAsync 20 | ) where 21 | 22 | import Prelude 23 | 24 | import Control.Alternative (empty, (<|>)) 25 | import Control.Lazy (class Lazy) 26 | import Control.Monad.Rec.Class (Step(..), tailRecM) 27 | import Data.Array (length, modifyAt, unsafeIndex, (!!), (..)) 28 | import Data.Bifunctor (lmap) 29 | import Data.Either (Either(..), either) 30 | import Data.Filterable (filterMap, partitionMap) 31 | import Data.Foldable (for_, oneOfMap, sequence_, traverse_) 32 | import Data.List (List(..), drop, take, (:)) 33 | import Data.Maybe (Maybe(..), fromMaybe) 34 | import Data.Newtype (wrap) 35 | import Data.Profunctor (class Profunctor, dimap) 36 | import Data.Profunctor.Strong (class Strong, first, second) 37 | import Data.Traversable (traverse) 38 | import Data.Tuple (Tuple(..), fst, snd) 39 | import Effect (Effect) 40 | import Effect.Ref as Ref 41 | import FRP.Event (Event, create, keepLatest, subscribe) 42 | import Partial.Unsafe (unsafePartial) 43 | import Web.DOM (Node, Element) 44 | import Web.DOM.Document (createDocumentFragment, createElement, createTextNode) 45 | import Web.DOM.Node (appendChild, lastChild, removeChild, setTextContent) 46 | import Web.DOM.Element as Element 47 | import Web.DOM.DocumentFragment as DocumentFragment 48 | import Web.DOM.Text as Text 49 | import Web.Event.Event as Event 50 | import Web.Event.EventTarget (addEventListener, eventListener, removeEventListener) 51 | import Web.HTML (window) 52 | import Web.HTML.HTMLDocument as HTMLDocument 53 | import Web.HTML.Window (document) 54 | 55 | -- | A value of type `SDOM channel context i o` represents a component in the 56 | -- | "static DOM". 57 | -- | 58 | -- | Simple components can be created using the `text` and `element` functions. 59 | -- | The `array` function can be used to create a component which renders a 60 | -- | uniform array of subcomponents. The `SDOM.Components` module also contains 61 | -- | some ready-to-use components. 62 | -- | 63 | -- | Here is an explanation of each type variable: 64 | -- | 65 | -- | - `i` is the type of the model (when used as an input). 66 | -- | Inputs of type `i` will be provided in order to initialize or rerender 67 | -- | the component. 68 | -- | - `o` is the type of the model (when used as an output). 69 | -- | Events raised by the component may change the model by providing a function 70 | -- | of type `i -> o`. The model is split into input and output type arguments 71 | -- | to allow the profunctor instances for `SDOM` to exist, and to enable the 72 | -- | use of profunctor lenses for component composition. 73 | -- | - `context` is the type of the "context" of the component. If the component 74 | -- | is rendered as a child of a dynamically-sized list, the context will include 75 | -- | its index in that list, for example. This type argument may not be needed 76 | -- | in simple components. 77 | -- | - `channel` is the type of the "event channel" of the component. If the 78 | -- | component is rendered as a child of a dynamically-sized list, the channel 79 | -- | type will provide a way to pass an event to the owner of that list, so that 80 | -- | the component can modify the list itself, not just the element of the list 81 | -- | which generated it. For example, we might use the channel to allow a 82 | -- | component to remove itself from a list. 83 | -- | 84 | -- | Since `SDOM` is a _strong profunctor_, we can apply profunctor lenses to values 85 | -- | of type `SDOM channel context i o` directly, to focus a component on a 86 | -- | particular piece of the model: 87 | -- | 88 | -- | ``` 89 | -- | > :type text (const identity) 90 | -- | forall channel context a. SDOM channel context String a 91 | -- | 92 | -- | > import Data.Lens 93 | -- | > :type _1 (text (const identity)) 94 | -- | forall channel context a b. 95 | -- | SDOM channel context 96 | -- | (Tuple String b) 97 | -- | (Tuple a b) 98 | -- | ``` 99 | newtype SDOM channel context i o = SDOM 100 | (Node 101 | -> context 102 | -> i 103 | -> Event { old :: i, new :: i } 104 | -> Effect 105 | { events :: Event (Either channel (i -> o)) 106 | , unsubscribe :: Effect Unit 107 | }) 108 | 109 | -- | This function is provided in order to wrap existing Javascript components. 110 | -- | 111 | -- | Most applications should not need to use this function directly. Instead, 112 | -- | you can build components using the other, safe functions exposed by this 113 | -- | module, or reuse components from the `SDOM.Components` module. 114 | -- | 115 | -- | This function accepts a function as its only argument. This function should: 116 | -- | 117 | -- | - Set up any DOM components and render the initial model, 118 | -- | - Subscribe to model updates in order to update those components, 119 | -- | - Return an `events` stream for user events generated by the component, 120 | -- | - Return an `unsubscribe` function to clean up any event handlers when the 121 | -- | component is removed. 122 | unsafeSDOM 123 | :: forall channel context i o 124 | . (Node 125 | -> context 126 | -> i 127 | -> Event { old :: i, new :: i } 128 | -> Effect 129 | { events :: Event (Either channel (i -> o)) 130 | , unsubscribe :: Effect Unit 131 | } 132 | ) 133 | -> SDOM channel context i o 134 | unsafeSDOM = SDOM 135 | 136 | -- | Change the context type of a component. 137 | mapContext 138 | :: forall channel context context' i o 139 | . (context' -> context) 140 | -> SDOM channel context i o 141 | -> SDOM channel context' i o 142 | mapContext f (SDOM sd) = SDOM \n ctx -> sd n (f ctx) 143 | 144 | -- | Interpret the event channel of a component. 145 | interpretChannel 146 | :: forall channel channel' context i o 147 | . (Event channel -> Event (Either channel' (i -> o))) 148 | -> SDOM channel context i o 149 | -> SDOM channel' context i o 150 | interpretChannel f (SDOM sd) = 151 | SDOM \n context a e -> 152 | overEvents f' <$> sd n context a e 153 | where 154 | f' = partitionMap identity >>> \{ left, right } -> f left <|> Right <$> right 155 | 156 | -- | Change the event channel type of a component. 157 | mapChannel 158 | :: forall channel channel' context i o 159 | . (channel -> channel') 160 | -> SDOM channel context i o 161 | -> SDOM channel' context i o 162 | mapChannel f (SDOM sd) = 163 | SDOM \n context a e -> 164 | overEvents (map (lmap f)) <$> sd n context a e 165 | 166 | -- | A convenience function which provides the ability to use `Event`s 167 | -- | directly in a component's event channel. 168 | -- | 169 | -- | `Event`s will be disposed of when the component unmounts, or when a new 170 | -- | event takes its place. 171 | -- | 172 | -- | For example, clicking this button starts a timer which raises a `Unit` 173 | -- | event every second. 174 | -- | 175 | -- | ``` 176 | -- | > :type text (const identity) 177 | -- | forall channel context a. SDOM channel context String a 178 | -- | 179 | -- | > import SDOM.Elements as E 180 | -- | > import SDOM.Events as Events 181 | -- | 182 | -- | > handler _ _ = Left (interval 1000 $> Left unit) 183 | -- | 184 | -- | > :type withAsync (E.button [] [Events.click handler] [ text \_ _ -> "Start" ]) 185 | -- | forall channel context model. SDOM Unit channel context model 186 | -- | ``` 187 | withAsync 188 | :: forall channel context i o 189 | . SDOM (Event (Either channel (i -> o))) context i o 190 | -> SDOM channel context i o 191 | withAsync = interpretChannel keepLatest 192 | 193 | instance functorSDOM :: Functor (SDOM channel context i) where 194 | map f (SDOM sd) = SDOM \n context a e -> 195 | overEvents (map (map (map f))) <$> sd n context a e 196 | 197 | instance profunctorSDOM :: Profunctor (SDOM channel context) where 198 | dimap f g (SDOM sd) = SDOM \n context a e -> 199 | overEvents (map (map (dimap f g))) <$> sd n context (f a) (map (\{ old, new } -> { old: f old, new: f new }) e) 200 | 201 | instance strongSDOM :: Strong (SDOM channel context) where 202 | first (SDOM sd) = SDOM \n context (Tuple a _) e -> 203 | overEvents (map (map first)) <$> sd n context a (map (\{ old, new } -> { old: fst old, new: fst new }) e) 204 | second (SDOM sd) = SDOM \n context (Tuple _ b) e -> 205 | overEvents (map (map second)) <$> sd n context b (map (\{ old, new } -> { old: snd old, new: snd new }) e) 206 | 207 | instance lazySDOM :: Lazy (SDOM channel context i o) where 208 | defer f = SDOM \n -> unSDOM (f unit) n 209 | 210 | overEvents 211 | :: forall a b r 212 | . (a -> b) 213 | -> { events :: a | r } 214 | -> { events :: b | r } 215 | overEvents f o = o { events = f o.events } 216 | 217 | unSDOM 218 | :: forall channel context i o 219 | . SDOM channel context i o 220 | -> Node 221 | -> context 222 | -> i 223 | -> Event { old :: i, new :: i } 224 | -> Effect 225 | { events :: Event (Either channel (i -> o)) 226 | , unsubscribe :: Effect Unit 227 | } 228 | unSDOM (SDOM f) = f 229 | 230 | -- | Create a component which renders a text node based on some part of the 231 | -- | input model. 232 | -- | 233 | -- | The first argument is a function which chooses a `String` to render from 234 | -- | the model. The function also has access to the context of the component. 235 | -- | 236 | -- | For example: 237 | -- | 238 | -- | ``` 239 | -- | > :type text \_ctx model -> model.title 240 | -- | forall channel context a r. 241 | -- | SDOM channel context 242 | -- | { title :: String 243 | -- | | r 244 | -- | } 245 | -- | a 246 | -- | ``` 247 | text :: forall channel context i o. (context -> i -> String) -> SDOM channel context i o 248 | text f = SDOM \n context model e -> do 249 | doc <- window >>= document 250 | tn <- createTextNode (f context model) (HTMLDocument.toDocument doc) 251 | _ <- appendChild (Text.toNode tn) n 252 | unsubscribe <- e `subscribe` \{ old, new } -> do 253 | let oldValue = f context old 254 | newValue = f context new 255 | when (oldValue /= newValue) $ 256 | setTextContent newValue (Text.toNode tn) 257 | pure { unsubscribe, events: empty } 258 | 259 | -- | Create a component which renders a (static) text node. 260 | text_ :: forall channel context i o. String -> SDOM channel context i o 261 | text_ str = SDOM \n context model e -> do 262 | doc <- window >>= document 263 | tn <- createTextNode str (HTMLDocument.toDocument doc) 264 | _ <- appendChild (Text.toNode tn) n 265 | pure { unsubscribe: pure unit, events: empty } 266 | 267 | -- | An attribute which can be associated with an `element`. 268 | -- | 269 | -- | The type arguments correspond to the context and model types of the resulting 270 | -- | component. 271 | -- | 272 | -- | Attributes can be constructed using the functions in the `SDOM.Attributes` 273 | -- | module, or unsafely using the `unsafeAttr` function. 274 | -- | 275 | -- | For example: 276 | -- | 277 | -- | ``` 278 | -- | > import SDOM.Attributes as A 279 | -- | > :type A.type_ \_ model -> model.type 280 | -- | forall context r. 281 | -- | Attr context 282 | -- | { "type" :: String 283 | -- | | r 284 | -- | } 285 | -- | ``` 286 | newtype Attr context model = Attr 287 | ( context 288 | -> Element 289 | -> { init :: model -> Effect Unit 290 | , update :: { old :: model, new :: model } -> Effect Unit 291 | } 292 | ) 293 | 294 | -- | Create an attribute unsafely, by providing functions which initialize 295 | -- | and update the attribute. 296 | -- | 297 | -- | _Note_: most applications should not require this function. Consider using 298 | -- | the functions in the `SDOM.Attributes` module instead. 299 | unsafeAttr 300 | :: forall context model 301 | . ( context 302 | -> Element 303 | -> { init :: model -> Effect Unit 304 | , update :: { old :: model 305 | , new :: model 306 | } 307 | -> Effect Unit 308 | } 309 | ) 310 | -> Attr context model 311 | unsafeAttr = Attr 312 | 313 | -- | An event handler which can be associated with an `element`. 314 | -- | 315 | -- | The `context` type argument corresponds to the context type of the resulting 316 | -- | component. The `e` type argument represents the type of event which will be 317 | -- | handled. This might take into account the _event channel_ of the component. 318 | -- | 319 | -- | Event handlers can be constructed using the functions in the `SDOM.Events` 320 | -- | module, or by using the `handler` function. 321 | -- | 322 | -- | For example: 323 | -- | 324 | -- | ``` 325 | -- | > import SDOM.Events as Events 326 | -- | > :type Events.click \_ _ -> unit 327 | -- | forall context. Handler context Unit 328 | -- | ``` 329 | newtype Handler context e = Handler 330 | (context 331 | -> Element 332 | -> Effect 333 | { events :: Event e 334 | , unsubscribe :: Effect Unit 335 | } 336 | ) 337 | 338 | -- | Create a `Handler` for specific events. 339 | -- | 340 | -- | The first argument is the name of the type of events to handle. 341 | -- | 342 | -- | The second argument is a function which produces a result from the raw DOM 343 | -- | event object. The function also has access to the context of the component. 344 | handler 345 | :: forall context e 346 | . String 347 | -> (context -> Event.Event -> e) 348 | -> Handler context e 349 | handler evtName f = Handler \context e -> do 350 | { event, push } <- create 351 | listener <- eventListener (push <<< f context) 352 | let target = Element.toEventTarget e 353 | unsubscribe = removeEventListener (wrap evtName) listener false target 354 | addEventListener (wrap evtName) listener false target 355 | pure 356 | { events: event 357 | , unsubscribe 358 | } 359 | 360 | -- | Create a component which renders an element, including attributes, event 361 | -- | handlers and a (static) list of child components. 362 | -- | 363 | -- | Instead of using this function directly, you probably will want to use the 364 | -- | helper functions in the `SDOM.Elements` module. 365 | -- | 366 | -- | The first argument is the name of the element. 367 | -- | 368 | -- | The second argument is an array of attributes to attach to the rendered element. 369 | -- | 370 | -- | The third argument is an array of event handlers. Note that the result types 371 | -- | of each handler is `Either channel (i -> o)`. That is, an event can _either_ 372 | -- | update the state of the current component (by providing a function of type 373 | -- | `i -> o`), or it can use the _event channel_ to pass a message to a parent 374 | -- | component. 375 | -- | 376 | -- | The fourth argument is a (static) array of child components. 377 | -- | 378 | -- | For example: 379 | -- | 380 | -- | ``` 381 | -- | > import SDOM.Elements as E 382 | -- | > :type E.div [] [] [ text \_ _ -> "Hello, World!"] 383 | -- | forall context channel i o. 384 | -- | SDOM context channel i o 385 | -- | 386 | -- | > import SDOM.Attributes as A 387 | -- | > :type E.input [ A.value \_ model -> model.value ] [] [] 388 | -- | forall context channel o r. 389 | -- | SDOM context channel 390 | -- | { value :: String 391 | -- | | r 392 | -- | } 393 | -- | o 394 | -- | 395 | -- | > import SDOM.Events as Events 396 | -- | > import Unsafe.Coerce (unsafeCoerce) 397 | -- | > :paste 398 | -- | > :type E.input 399 | -- | [ value \_ model -> model.value ] 400 | -- | [ change \_ e -> pure \model -> 401 | -- | model { value = (unsafeCoerce e).target.value } 402 | -- | ] 403 | -- | [] 404 | -- | ^D 405 | -- | forall context channel o r. 406 | -- | SDOM context channel 407 | -- | { value :: String 408 | -- | | r 409 | -- | } 410 | -- | { value :: String 411 | -- | | r 412 | -- | } 413 | -- | ``` 414 | element 415 | :: forall channel context i o 416 | . String 417 | -> Array (Attr context i) 418 | -> Array (Handler context (Either channel (i -> o))) 419 | -> Array (SDOM channel context i o) 420 | -> SDOM channel context i o 421 | element el attrs handlers children = SDOM \n context model updates -> do 422 | doc <- window >>= document 423 | e <- createElement el (HTMLDocument.toDocument doc) 424 | _ <- appendChild (Element.toNode e) n 425 | let setAttr :: Attr context i -> Effect (Effect Unit) 426 | setAttr (Attr attr) = do 427 | let { init, update } = attr context e 428 | init model 429 | updates `subscribe` update 430 | 431 | setHandler 432 | :: Handler context (Either channel (i -> o)) 433 | -> Effect 434 | { events :: Event (Either channel (i -> o)) 435 | , unsubscribe :: Effect Unit 436 | } 437 | setHandler (Handler h) = h context e 438 | unsubscribers <- traverse setAttr attrs 439 | evts <- traverse setHandler handlers 440 | childrenEvts <- traverse (\child -> unSDOM child (Element.toNode e) context model updates) children 441 | pure 442 | { events: 443 | oneOfMap _.events evts 444 | <|> oneOfMap _.events childrenEvts 445 | , unsubscribe: 446 | sequence_ unsubscribers 447 | *> traverse_ _.unsubscribe evts 448 | *> traverse_ _.unsubscribe childrenEvts 449 | } 450 | 451 | -- | Create a component which renders an element with a (static) array of child 452 | -- | components, but no attributes or event handlers. 453 | -- | 454 | -- | Instead of using this function directly, you probably will want to use the 455 | -- | helper functions in the `SDOM.Elements` module. 456 | -- | 457 | -- | For example: 458 | -- | 459 | -- | ``` 460 | -- | > import SDOM.Elements as E 461 | -- | > :type E.div_ [ text \_ _ -> "Hello, World!"] 462 | -- | forall context channel i o. 463 | -- | SDOM context channel i o 464 | -- | ``` 465 | element_ 466 | :: forall channel context i o 467 | . String 468 | -> Array (SDOM channel context i o) 469 | -> SDOM channel context i o 470 | element_ el = element el [] [] 471 | 472 | removeLastNChildren :: Int -> Node -> Effect Unit 473 | removeLastNChildren m n = tailRecM loop m where 474 | loop toRemove 475 | | toRemove <= 0 = pure (Done unit) 476 | | otherwise = do 477 | child <- lastChild n 478 | case child of 479 | Nothing -> pure (Done unit) 480 | Just child_ -> do _ <- removeChild child_ n 481 | pure (Loop (toRemove - 1)) 482 | 483 | -- | The event channel for an `array` component. 484 | -- | 485 | -- | An event is either passed to the next `Parent` in the chain, or handled 486 | -- | `Here`, by acting on the array itself. 487 | data ArrayChannel i channel 488 | = Parent channel 489 | | Here (Array i -> Array i) 490 | 491 | -- | The context of subcomponent in an `array` component includes the current 492 | -- | context inherited from the parent, as well as the index of the current 493 | -- | subcomponent. 494 | type ArrayContext context = 495 | { index :: Int 496 | , parent :: context 497 | } 498 | 499 | -- | Create a component which renders an array of subcomponents. 500 | -- | 501 | -- | The first argument is the name of the HTML element used as the container. 502 | -- | 503 | -- | The second argument is a template component for rendered subcomponents. 504 | -- | 505 | -- | _Note:_ 506 | -- | 507 | -- | - The context of the template component provides access to the index of 508 | -- | the current subcomponent. 509 | -- | - The event channel for the template component provides the ability to 510 | -- | modify the input array itself. 511 | -- | - This component is optimized for edits at the end of the array. Small 512 | -- | arrays should not present any issues, but large arrays might if edits 513 | -- | typically take place away from the end of the array. 514 | array 515 | :: forall channel context i 516 | . String 517 | -> SDOM (ArrayChannel i channel) (ArrayContext context) i i 518 | -> SDOM channel context (Array i) (Array i) 519 | array el sd = SDOM arrayImpl where 520 | arrayImpl 521 | :: Node 522 | -> context 523 | -> Array i 524 | -> Event { old :: Array i, new :: Array i } 525 | -> Effect 526 | { events :: Event (Either channel (Array i -> Array i)) 527 | , unsubscribe :: Effect Unit 528 | } 529 | arrayImpl n context models updates = do 530 | doc <- window >>= document 531 | e <- createElement el (HTMLDocument.toDocument doc) 532 | _ <- appendChild (Element.toNode e) n 533 | unsubscribers <- Ref.new Nil 534 | let runUnsubscribers = Ref.read unsubscribers >>= sequence_ 535 | { event, push } <- create 536 | let setup :: Array i -> Array i -> Effect Unit 537 | setup old_ new_ 538 | | length new_ > length old_ = do 539 | for_ (length old_ .. (length new_ - 1)) \idx -> do 540 | fragment <- createDocumentFragment (HTMLDocument.toDocument doc) 541 | let frag = DocumentFragment.toNode fragment 542 | here xs = unsafePartial (xs `unsafeIndex` idx) 543 | childCtx = { index: idx, parent: context } 544 | { events, unsubscribe } <- unSDOM sd frag childCtx (here new_) (filterMap (\{ old, new } -> { old: _, new: _ } <$> (old !! idx) <*> (new !! idx)) updates) 545 | unsubscribe1 <- events `subscribe` \ev -> 546 | case ev of 547 | Left (Parent other) -> push (Left other) 548 | Left (Here fi) -> push (Right fi) 549 | Right f -> push (Right (\xs -> fromMaybe xs (modifyAt idx f xs))) 550 | _ <- appendChild frag (Element.toNode e) 551 | _ <- Ref.modify ((unsubscribe *> unsubscribe1) : _) unsubscribers 552 | pure unit 553 | | length new_ < length old_ = do 554 | let d = length old_ - length new_ 555 | dropped <- Ref.modify' (\xs -> { state: drop d xs, value: take d xs }) unsubscribers 556 | sequence_ dropped 557 | removeLastNChildren d (Element.toNode e) 558 | | otherwise = pure unit 559 | setup [] models 560 | unsubscribe <- updates `subscribe` \{ old, new } -> setup old new 561 | pure 562 | { events: event 563 | , unsubscribe: unsubscribe *> runUnsubscribers 564 | } 565 | 566 | -- | Attach a component to the DOM. 567 | -- | 568 | -- | The first argument is the DOM `Element` which will contain the rendered 569 | -- | component. 570 | -- | 571 | -- | The second argument is the initial model. 572 | -- | 573 | -- | The third argument is the component itself. 574 | -- | 575 | -- | The result contains two functions: 576 | -- | 577 | -- | - The `push` function allows the caller to provide additional model updates 578 | -- | which do not arise from user-generated events. 579 | -- | - `The `detach` function detaches the component from the DOM and unregisters 580 | -- | any event handlers. 581 | attach 582 | :: forall model 583 | . Element 584 | -> model 585 | -> SDOM Void Unit model model 586 | -> Effect 587 | { push :: (model -> model) -> Effect Unit 588 | , detach :: Effect Unit 589 | } 590 | attach root model v = do 591 | modelRef <- Ref.new model 592 | document <- window >>= document 593 | { event, push } <- create 594 | fragment <- createDocumentFragment (HTMLDocument.toDocument document) 595 | let n = DocumentFragment.toNode fragment 596 | { events, unsubscribe } <- unSDOM v n unit model event 597 | let pushNewModel :: Either Void (model -> model) -> Effect Unit 598 | pushNewModel e = do 599 | oldModel <- Ref.read modelRef 600 | let f = either absurd identity e 601 | newModel = f oldModel 602 | _ <- Ref.write newModel modelRef 603 | push { old: oldModel, new: newModel } 604 | unsubscribe1 <- events `subscribe` pushNewModel 605 | _ <- appendChild n (Element.toNode root) 606 | pure 607 | { push: pushNewModel <<< Right 608 | , detach: unsubscribe *> unsubscribe1 609 | } 610 | -------------------------------------------------------------------------------- /generated-docs/SDOM/Elements.md: -------------------------------------------------------------------------------- 1 | ## Module SDOM.Elements 2 | 3 | #### `a` 4 | 5 | ``` purescript 6 | a :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 7 | ``` 8 | 9 | #### `a_` 10 | 11 | ``` purescript 12 | a_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 13 | ``` 14 | 15 | #### `abbr` 16 | 17 | ``` purescript 18 | abbr :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 19 | ``` 20 | 21 | #### `abbr_` 22 | 23 | ``` purescript 24 | abbr_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 25 | ``` 26 | 27 | #### `acronym` 28 | 29 | ``` purescript 30 | acronym :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 31 | ``` 32 | 33 | #### `acronym_` 34 | 35 | ``` purescript 36 | acronym_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 37 | ``` 38 | 39 | #### `address` 40 | 41 | ``` purescript 42 | address :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 43 | ``` 44 | 45 | #### `address_` 46 | 47 | ``` purescript 48 | address_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 49 | ``` 50 | 51 | #### `applet` 52 | 53 | ``` purescript 54 | applet :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 55 | ``` 56 | 57 | #### `applet_` 58 | 59 | ``` purescript 60 | applet_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 61 | ``` 62 | 63 | #### `area` 64 | 65 | ``` purescript 66 | area :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 67 | ``` 68 | 69 | #### `area_` 70 | 71 | ``` purescript 72 | area_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 73 | ``` 74 | 75 | #### `article` 76 | 77 | ``` purescript 78 | article :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 79 | ``` 80 | 81 | #### `article_` 82 | 83 | ``` purescript 84 | article_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 85 | ``` 86 | 87 | #### `aside` 88 | 89 | ``` purescript 90 | aside :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 91 | ``` 92 | 93 | #### `aside_` 94 | 95 | ``` purescript 96 | aside_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 97 | ``` 98 | 99 | #### `audio` 100 | 101 | ``` purescript 102 | audio :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 103 | ``` 104 | 105 | #### `audio_` 106 | 107 | ``` purescript 108 | audio_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 109 | ``` 110 | 111 | #### `b` 112 | 113 | ``` purescript 114 | b :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 115 | ``` 116 | 117 | #### `b_` 118 | 119 | ``` purescript 120 | b_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 121 | ``` 122 | 123 | #### `base` 124 | 125 | ``` purescript 126 | base :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 127 | ``` 128 | 129 | #### `base_` 130 | 131 | ``` purescript 132 | base_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 133 | ``` 134 | 135 | #### `basefont` 136 | 137 | ``` purescript 138 | basefont :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 139 | ``` 140 | 141 | #### `basefont_` 142 | 143 | ``` purescript 144 | basefont_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 145 | ``` 146 | 147 | #### `bdi` 148 | 149 | ``` purescript 150 | bdi :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 151 | ``` 152 | 153 | #### `bdi_` 154 | 155 | ``` purescript 156 | bdi_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 157 | ``` 158 | 159 | #### `bdo` 160 | 161 | ``` purescript 162 | bdo :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 163 | ``` 164 | 165 | #### `bdo_` 166 | 167 | ``` purescript 168 | bdo_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 169 | ``` 170 | 171 | #### `big` 172 | 173 | ``` purescript 174 | big :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 175 | ``` 176 | 177 | #### `big_` 178 | 179 | ``` purescript 180 | big_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 181 | ``` 182 | 183 | #### `blockquote` 184 | 185 | ``` purescript 186 | blockquote :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 187 | ``` 188 | 189 | #### `blockquote_` 190 | 191 | ``` purescript 192 | blockquote_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 193 | ``` 194 | 195 | #### `body` 196 | 197 | ``` purescript 198 | body :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 199 | ``` 200 | 201 | #### `body_` 202 | 203 | ``` purescript 204 | body_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 205 | ``` 206 | 207 | #### `br` 208 | 209 | ``` purescript 210 | br :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 211 | ``` 212 | 213 | #### `br_` 214 | 215 | ``` purescript 216 | br_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 217 | ``` 218 | 219 | #### `button` 220 | 221 | ``` purescript 222 | button :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 223 | ``` 224 | 225 | #### `button_` 226 | 227 | ``` purescript 228 | button_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 229 | ``` 230 | 231 | #### `canvas` 232 | 233 | ``` purescript 234 | canvas :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 235 | ``` 236 | 237 | #### `canvas_` 238 | 239 | ``` purescript 240 | canvas_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 241 | ``` 242 | 243 | #### `caption` 244 | 245 | ``` purescript 246 | caption :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 247 | ``` 248 | 249 | #### `caption_` 250 | 251 | ``` purescript 252 | caption_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 253 | ``` 254 | 255 | #### `center` 256 | 257 | ``` purescript 258 | center :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 259 | ``` 260 | 261 | #### `center_` 262 | 263 | ``` purescript 264 | center_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 265 | ``` 266 | 267 | #### `cite` 268 | 269 | ``` purescript 270 | cite :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 271 | ``` 272 | 273 | #### `cite_` 274 | 275 | ``` purescript 276 | cite_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 277 | ``` 278 | 279 | #### `code` 280 | 281 | ``` purescript 282 | code :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 283 | ``` 284 | 285 | #### `code_` 286 | 287 | ``` purescript 288 | code_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 289 | ``` 290 | 291 | #### `col` 292 | 293 | ``` purescript 294 | col :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 295 | ``` 296 | 297 | #### `col_` 298 | 299 | ``` purescript 300 | col_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 301 | ``` 302 | 303 | #### `colgroup` 304 | 305 | ``` purescript 306 | colgroup :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 307 | ``` 308 | 309 | #### `colgroup_` 310 | 311 | ``` purescript 312 | colgroup_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 313 | ``` 314 | 315 | #### `datalist` 316 | 317 | ``` purescript 318 | datalist :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 319 | ``` 320 | 321 | #### `datalist_` 322 | 323 | ``` purescript 324 | datalist_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 325 | ``` 326 | 327 | #### `dd` 328 | 329 | ``` purescript 330 | dd :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 331 | ``` 332 | 333 | #### `dd_` 334 | 335 | ``` purescript 336 | dd_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 337 | ``` 338 | 339 | #### `del` 340 | 341 | ``` purescript 342 | del :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 343 | ``` 344 | 345 | #### `del_` 346 | 347 | ``` purescript 348 | del_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 349 | ``` 350 | 351 | #### `details` 352 | 353 | ``` purescript 354 | details :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 355 | ``` 356 | 357 | #### `details_` 358 | 359 | ``` purescript 360 | details_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 361 | ``` 362 | 363 | #### `dfn` 364 | 365 | ``` purescript 366 | dfn :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 367 | ``` 368 | 369 | #### `dfn_` 370 | 371 | ``` purescript 372 | dfn_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 373 | ``` 374 | 375 | #### `dialog` 376 | 377 | ``` purescript 378 | dialog :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 379 | ``` 380 | 381 | #### `dialog_` 382 | 383 | ``` purescript 384 | dialog_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 385 | ``` 386 | 387 | #### `dir` 388 | 389 | ``` purescript 390 | dir :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 391 | ``` 392 | 393 | #### `dir_` 394 | 395 | ``` purescript 396 | dir_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 397 | ``` 398 | 399 | #### `div` 400 | 401 | ``` purescript 402 | div :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 403 | ``` 404 | 405 | #### `div_` 406 | 407 | ``` purescript 408 | div_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 409 | ``` 410 | 411 | #### `dl` 412 | 413 | ``` purescript 414 | dl :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 415 | ``` 416 | 417 | #### `dl_` 418 | 419 | ``` purescript 420 | dl_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 421 | ``` 422 | 423 | #### `dt` 424 | 425 | ``` purescript 426 | dt :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 427 | ``` 428 | 429 | #### `dt_` 430 | 431 | ``` purescript 432 | dt_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 433 | ``` 434 | 435 | #### `em` 436 | 437 | ``` purescript 438 | em :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 439 | ``` 440 | 441 | #### `em_` 442 | 443 | ``` purescript 444 | em_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 445 | ``` 446 | 447 | #### `embed` 448 | 449 | ``` purescript 450 | embed :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 451 | ``` 452 | 453 | #### `embed_` 454 | 455 | ``` purescript 456 | embed_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 457 | ``` 458 | 459 | #### `fieldset` 460 | 461 | ``` purescript 462 | fieldset :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 463 | ``` 464 | 465 | #### `fieldset_` 466 | 467 | ``` purescript 468 | fieldset_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 469 | ``` 470 | 471 | #### `figcaption` 472 | 473 | ``` purescript 474 | figcaption :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 475 | ``` 476 | 477 | #### `figcaption_` 478 | 479 | ``` purescript 480 | figcaption_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 481 | ``` 482 | 483 | #### `figure` 484 | 485 | ``` purescript 486 | figure :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 487 | ``` 488 | 489 | #### `figure_` 490 | 491 | ``` purescript 492 | figure_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 493 | ``` 494 | 495 | #### `font` 496 | 497 | ``` purescript 498 | font :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 499 | ``` 500 | 501 | #### `font_` 502 | 503 | ``` purescript 504 | font_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 505 | ``` 506 | 507 | #### `footer` 508 | 509 | ``` purescript 510 | footer :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 511 | ``` 512 | 513 | #### `footer_` 514 | 515 | ``` purescript 516 | footer_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 517 | ``` 518 | 519 | #### `form` 520 | 521 | ``` purescript 522 | form :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 523 | ``` 524 | 525 | #### `form_` 526 | 527 | ``` purescript 528 | form_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 529 | ``` 530 | 531 | #### `frame` 532 | 533 | ``` purescript 534 | frame :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 535 | ``` 536 | 537 | #### `frame_` 538 | 539 | ``` purescript 540 | frame_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 541 | ``` 542 | 543 | #### `frameset` 544 | 545 | ``` purescript 546 | frameset :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 547 | ``` 548 | 549 | #### `frameset_` 550 | 551 | ``` purescript 552 | frameset_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 553 | ``` 554 | 555 | #### `h1` 556 | 557 | ``` purescript 558 | h1 :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 559 | ``` 560 | 561 | #### `h1_` 562 | 563 | ``` purescript 564 | h1_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 565 | ``` 566 | 567 | #### `head` 568 | 569 | ``` purescript 570 | head :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 571 | ``` 572 | 573 | #### `head_` 574 | 575 | ``` purescript 576 | head_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 577 | ``` 578 | 579 | #### `header` 580 | 581 | ``` purescript 582 | header :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 583 | ``` 584 | 585 | #### `header_` 586 | 587 | ``` purescript 588 | header_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 589 | ``` 590 | 591 | #### `hr` 592 | 593 | ``` purescript 594 | hr :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 595 | ``` 596 | 597 | #### `hr_` 598 | 599 | ``` purescript 600 | hr_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 601 | ``` 602 | 603 | #### `html` 604 | 605 | ``` purescript 606 | html :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 607 | ``` 608 | 609 | #### `html_` 610 | 611 | ``` purescript 612 | html_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 613 | ``` 614 | 615 | #### `i` 616 | 617 | ``` purescript 618 | i :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 619 | ``` 620 | 621 | #### `i_` 622 | 623 | ``` purescript 624 | i_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 625 | ``` 626 | 627 | #### `iframe` 628 | 629 | ``` purescript 630 | iframe :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 631 | ``` 632 | 633 | #### `iframe_` 634 | 635 | ``` purescript 636 | iframe_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 637 | ``` 638 | 639 | #### `img` 640 | 641 | ``` purescript 642 | img :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 643 | ``` 644 | 645 | #### `img_` 646 | 647 | ``` purescript 648 | img_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 649 | ``` 650 | 651 | #### `input` 652 | 653 | ``` purescript 654 | input :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 655 | ``` 656 | 657 | #### `input_` 658 | 659 | ``` purescript 660 | input_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 661 | ``` 662 | 663 | #### `ins` 664 | 665 | ``` purescript 666 | ins :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 667 | ``` 668 | 669 | #### `ins_` 670 | 671 | ``` purescript 672 | ins_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 673 | ``` 674 | 675 | #### `kbd` 676 | 677 | ``` purescript 678 | kbd :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 679 | ``` 680 | 681 | #### `kbd_` 682 | 683 | ``` purescript 684 | kbd_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 685 | ``` 686 | 687 | #### `label` 688 | 689 | ``` purescript 690 | label :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 691 | ``` 692 | 693 | #### `label_` 694 | 695 | ``` purescript 696 | label_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 697 | ``` 698 | 699 | #### `legend` 700 | 701 | ``` purescript 702 | legend :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 703 | ``` 704 | 705 | #### `legend_` 706 | 707 | ``` purescript 708 | legend_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 709 | ``` 710 | 711 | #### `li` 712 | 713 | ``` purescript 714 | li :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 715 | ``` 716 | 717 | #### `li_` 718 | 719 | ``` purescript 720 | li_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 721 | ``` 722 | 723 | #### `link` 724 | 725 | ``` purescript 726 | link :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 727 | ``` 728 | 729 | #### `link_` 730 | 731 | ``` purescript 732 | link_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 733 | ``` 734 | 735 | #### `main` 736 | 737 | ``` purescript 738 | main :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 739 | ``` 740 | 741 | #### `main_` 742 | 743 | ``` purescript 744 | main_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 745 | ``` 746 | 747 | #### `map` 748 | 749 | ``` purescript 750 | map :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 751 | ``` 752 | 753 | #### `map_` 754 | 755 | ``` purescript 756 | map_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 757 | ``` 758 | 759 | #### `mark` 760 | 761 | ``` purescript 762 | mark :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 763 | ``` 764 | 765 | #### `mark_` 766 | 767 | ``` purescript 768 | mark_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 769 | ``` 770 | 771 | #### `menu` 772 | 773 | ``` purescript 774 | menu :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 775 | ``` 776 | 777 | #### `menu_` 778 | 779 | ``` purescript 780 | menu_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 781 | ``` 782 | 783 | #### `menuitem` 784 | 785 | ``` purescript 786 | menuitem :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 787 | ``` 788 | 789 | #### `menuitem_` 790 | 791 | ``` purescript 792 | menuitem_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 793 | ``` 794 | 795 | #### `meta` 796 | 797 | ``` purescript 798 | meta :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 799 | ``` 800 | 801 | #### `meta_` 802 | 803 | ``` purescript 804 | meta_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 805 | ``` 806 | 807 | #### `meter` 808 | 809 | ``` purescript 810 | meter :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 811 | ``` 812 | 813 | #### `meter_` 814 | 815 | ``` purescript 816 | meter_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 817 | ``` 818 | 819 | #### `nav` 820 | 821 | ``` purescript 822 | nav :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 823 | ``` 824 | 825 | #### `nav_` 826 | 827 | ``` purescript 828 | nav_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 829 | ``` 830 | 831 | #### `noframes` 832 | 833 | ``` purescript 834 | noframes :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 835 | ``` 836 | 837 | #### `noframes_` 838 | 839 | ``` purescript 840 | noframes_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 841 | ``` 842 | 843 | #### `noscript` 844 | 845 | ``` purescript 846 | noscript :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 847 | ``` 848 | 849 | #### `noscript_` 850 | 851 | ``` purescript 852 | noscript_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 853 | ``` 854 | 855 | #### `object` 856 | 857 | ``` purescript 858 | object :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 859 | ``` 860 | 861 | #### `object_` 862 | 863 | ``` purescript 864 | object_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 865 | ``` 866 | 867 | #### `ol` 868 | 869 | ``` purescript 870 | ol :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 871 | ``` 872 | 873 | #### `ol_` 874 | 875 | ``` purescript 876 | ol_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 877 | ``` 878 | 879 | #### `optgroup` 880 | 881 | ``` purescript 882 | optgroup :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 883 | ``` 884 | 885 | #### `optgroup_` 886 | 887 | ``` purescript 888 | optgroup_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 889 | ``` 890 | 891 | #### `option` 892 | 893 | ``` purescript 894 | option :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 895 | ``` 896 | 897 | #### `option_` 898 | 899 | ``` purescript 900 | option_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 901 | ``` 902 | 903 | #### `output` 904 | 905 | ``` purescript 906 | output :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 907 | ``` 908 | 909 | #### `output_` 910 | 911 | ``` purescript 912 | output_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 913 | ``` 914 | 915 | #### `p` 916 | 917 | ``` purescript 918 | p :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 919 | ``` 920 | 921 | #### `p_` 922 | 923 | ``` purescript 924 | p_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 925 | ``` 926 | 927 | #### `param` 928 | 929 | ``` purescript 930 | param :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 931 | ``` 932 | 933 | #### `param_` 934 | 935 | ``` purescript 936 | param_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 937 | ``` 938 | 939 | #### `picture` 940 | 941 | ``` purescript 942 | picture :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 943 | ``` 944 | 945 | #### `picture_` 946 | 947 | ``` purescript 948 | picture_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 949 | ``` 950 | 951 | #### `pre` 952 | 953 | ``` purescript 954 | pre :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 955 | ``` 956 | 957 | #### `pre_` 958 | 959 | ``` purescript 960 | pre_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 961 | ``` 962 | 963 | #### `progress` 964 | 965 | ``` purescript 966 | progress :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 967 | ``` 968 | 969 | #### `progress_` 970 | 971 | ``` purescript 972 | progress_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 973 | ``` 974 | 975 | #### `q` 976 | 977 | ``` purescript 978 | q :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 979 | ``` 980 | 981 | #### `q_` 982 | 983 | ``` purescript 984 | q_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 985 | ``` 986 | 987 | #### `rp` 988 | 989 | ``` purescript 990 | rp :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 991 | ``` 992 | 993 | #### `rp_` 994 | 995 | ``` purescript 996 | rp_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 997 | ``` 998 | 999 | #### `rt` 1000 | 1001 | ``` purescript 1002 | rt :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1003 | ``` 1004 | 1005 | #### `rt_` 1006 | 1007 | ``` purescript 1008 | rt_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1009 | ``` 1010 | 1011 | #### `ruby` 1012 | 1013 | ``` purescript 1014 | ruby :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1015 | ``` 1016 | 1017 | #### `ruby_` 1018 | 1019 | ``` purescript 1020 | ruby_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1021 | ``` 1022 | 1023 | #### `s` 1024 | 1025 | ``` purescript 1026 | s :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1027 | ``` 1028 | 1029 | #### `s_` 1030 | 1031 | ``` purescript 1032 | s_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1033 | ``` 1034 | 1035 | #### `samp` 1036 | 1037 | ``` purescript 1038 | samp :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1039 | ``` 1040 | 1041 | #### `samp_` 1042 | 1043 | ``` purescript 1044 | samp_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1045 | ``` 1046 | 1047 | #### `script` 1048 | 1049 | ``` purescript 1050 | script :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1051 | ``` 1052 | 1053 | #### `script_` 1054 | 1055 | ``` purescript 1056 | script_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1057 | ``` 1058 | 1059 | #### `section` 1060 | 1061 | ``` purescript 1062 | section :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1063 | ``` 1064 | 1065 | #### `section_` 1066 | 1067 | ``` purescript 1068 | section_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1069 | ``` 1070 | 1071 | #### `select` 1072 | 1073 | ``` purescript 1074 | select :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1075 | ``` 1076 | 1077 | #### `select_` 1078 | 1079 | ``` purescript 1080 | select_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1081 | ``` 1082 | 1083 | #### `small` 1084 | 1085 | ``` purescript 1086 | small :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1087 | ``` 1088 | 1089 | #### `small_` 1090 | 1091 | ``` purescript 1092 | small_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1093 | ``` 1094 | 1095 | #### `source` 1096 | 1097 | ``` purescript 1098 | source :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1099 | ``` 1100 | 1101 | #### `source_` 1102 | 1103 | ``` purescript 1104 | source_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1105 | ``` 1106 | 1107 | #### `span` 1108 | 1109 | ``` purescript 1110 | span :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1111 | ``` 1112 | 1113 | #### `span_` 1114 | 1115 | ``` purescript 1116 | span_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1117 | ``` 1118 | 1119 | #### `strike` 1120 | 1121 | ``` purescript 1122 | strike :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1123 | ``` 1124 | 1125 | #### `strike_` 1126 | 1127 | ``` purescript 1128 | strike_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1129 | ``` 1130 | 1131 | #### `strong` 1132 | 1133 | ``` purescript 1134 | strong :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1135 | ``` 1136 | 1137 | #### `strong_` 1138 | 1139 | ``` purescript 1140 | strong_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1141 | ``` 1142 | 1143 | #### `style` 1144 | 1145 | ``` purescript 1146 | style :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1147 | ``` 1148 | 1149 | #### `style_` 1150 | 1151 | ``` purescript 1152 | style_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1153 | ``` 1154 | 1155 | #### `sub` 1156 | 1157 | ``` purescript 1158 | sub :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1159 | ``` 1160 | 1161 | #### `sub_` 1162 | 1163 | ``` purescript 1164 | sub_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1165 | ``` 1166 | 1167 | #### `summary` 1168 | 1169 | ``` purescript 1170 | summary :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1171 | ``` 1172 | 1173 | #### `summary_` 1174 | 1175 | ``` purescript 1176 | summary_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1177 | ``` 1178 | 1179 | #### `sup` 1180 | 1181 | ``` purescript 1182 | sup :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1183 | ``` 1184 | 1185 | #### `sup_` 1186 | 1187 | ``` purescript 1188 | sup_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1189 | ``` 1190 | 1191 | #### `table` 1192 | 1193 | ``` purescript 1194 | table :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1195 | ``` 1196 | 1197 | #### `table_` 1198 | 1199 | ``` purescript 1200 | table_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1201 | ``` 1202 | 1203 | #### `tbody` 1204 | 1205 | ``` purescript 1206 | tbody :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1207 | ``` 1208 | 1209 | #### `tbody_` 1210 | 1211 | ``` purescript 1212 | tbody_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1213 | ``` 1214 | 1215 | #### `td` 1216 | 1217 | ``` purescript 1218 | td :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1219 | ``` 1220 | 1221 | #### `td_` 1222 | 1223 | ``` purescript 1224 | td_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1225 | ``` 1226 | 1227 | #### `template` 1228 | 1229 | ``` purescript 1230 | template :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1231 | ``` 1232 | 1233 | #### `template_` 1234 | 1235 | ``` purescript 1236 | template_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1237 | ``` 1238 | 1239 | #### `textarea` 1240 | 1241 | ``` purescript 1242 | textarea :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1243 | ``` 1244 | 1245 | #### `textarea_` 1246 | 1247 | ``` purescript 1248 | textarea_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1249 | ``` 1250 | 1251 | #### `tfoot` 1252 | 1253 | ``` purescript 1254 | tfoot :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1255 | ``` 1256 | 1257 | #### `tfoot_` 1258 | 1259 | ``` purescript 1260 | tfoot_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1261 | ``` 1262 | 1263 | #### `th` 1264 | 1265 | ``` purescript 1266 | th :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1267 | ``` 1268 | 1269 | #### `th_` 1270 | 1271 | ``` purescript 1272 | th_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1273 | ``` 1274 | 1275 | #### `thead` 1276 | 1277 | ``` purescript 1278 | thead :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1279 | ``` 1280 | 1281 | #### `thead_` 1282 | 1283 | ``` purescript 1284 | thead_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1285 | ``` 1286 | 1287 | #### `time` 1288 | 1289 | ``` purescript 1290 | time :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1291 | ``` 1292 | 1293 | #### `time_` 1294 | 1295 | ``` purescript 1296 | time_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1297 | ``` 1298 | 1299 | #### `title` 1300 | 1301 | ``` purescript 1302 | title :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1303 | ``` 1304 | 1305 | #### `title_` 1306 | 1307 | ``` purescript 1308 | title_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1309 | ``` 1310 | 1311 | #### `tr` 1312 | 1313 | ``` purescript 1314 | tr :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1315 | ``` 1316 | 1317 | #### `tr_` 1318 | 1319 | ``` purescript 1320 | tr_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1321 | ``` 1322 | 1323 | #### `track` 1324 | 1325 | ``` purescript 1326 | track :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1327 | ``` 1328 | 1329 | #### `track_` 1330 | 1331 | ``` purescript 1332 | track_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1333 | ``` 1334 | 1335 | #### `tt` 1336 | 1337 | ``` purescript 1338 | tt :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1339 | ``` 1340 | 1341 | #### `tt_` 1342 | 1343 | ``` purescript 1344 | tt_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1345 | ``` 1346 | 1347 | #### `u` 1348 | 1349 | ``` purescript 1350 | u :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1351 | ``` 1352 | 1353 | #### `u_` 1354 | 1355 | ``` purescript 1356 | u_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1357 | ``` 1358 | 1359 | #### `ul` 1360 | 1361 | ``` purescript 1362 | ul :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1363 | ``` 1364 | 1365 | #### `ul_` 1366 | 1367 | ``` purescript 1368 | ul_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1369 | ``` 1370 | 1371 | #### `var` 1372 | 1373 | ``` purescript 1374 | var :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1375 | ``` 1376 | 1377 | #### `var_` 1378 | 1379 | ``` purescript 1380 | var_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1381 | ``` 1382 | 1383 | #### `video` 1384 | 1385 | ``` purescript 1386 | video :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1387 | ``` 1388 | 1389 | #### `video_` 1390 | 1391 | ``` purescript 1392 | video_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1393 | ``` 1394 | 1395 | #### `wbr` 1396 | 1397 | ``` purescript 1398 | wbr :: forall channel context i o. Array (Attr context i) -> Array (Handler context (Either channel (i -> o))) -> Array (SDOM channel context i o) -> SDOM channel context i o 1399 | ``` 1400 | 1401 | #### `wbr_` 1402 | 1403 | ``` purescript 1404 | wbr_ :: forall channel context i o. Array (SDOM channel context i o) -> SDOM channel context i o 1405 | ``` 1406 | 1407 | 1408 | -------------------------------------------------------------------------------- /src/SDOM/Elements.purs: -------------------------------------------------------------------------------- 1 | module SDOM.Elements where 2 | 3 | import SDOM 4 | import Data.Either (Either) 5 | 6 | a 7 | :: forall channel context i o 8 | . Array (Attr context i) 9 | -> Array (Handler context (Either channel (i -> o))) 10 | -> Array (SDOM channel context i o) 11 | -> SDOM channel context i o 12 | a = element "a" 13 | 14 | a_ 15 | :: forall channel context i o 16 | . Array (SDOM channel context i o) 17 | -> SDOM channel context i o 18 | a_ = element_ "a" 19 | 20 | abbr 21 | :: forall channel context i o 22 | . Array (Attr context i) 23 | -> Array (Handler context (Either channel (i -> o))) 24 | -> Array (SDOM channel context i o) 25 | -> SDOM channel context i o 26 | abbr = element "abbr" 27 | 28 | abbr_ 29 | :: forall channel context i o 30 | . Array (SDOM channel context i o) 31 | -> SDOM channel context i o 32 | abbr_ = element_ "abbr" 33 | 34 | acronym 35 | :: forall channel context i o 36 | . Array (Attr context i) 37 | -> Array (Handler context (Either channel (i -> o))) 38 | -> Array (SDOM channel context i o) 39 | -> SDOM channel context i o 40 | acronym = element "acronym" 41 | 42 | acronym_ 43 | :: forall channel context i o 44 | . Array (SDOM channel context i o) 45 | -> SDOM channel context i o 46 | acronym_ = element_ "acronym" 47 | 48 | address 49 | :: forall channel context i o 50 | . Array (Attr context i) 51 | -> Array (Handler context (Either channel (i -> o))) 52 | -> Array (SDOM channel context i o) 53 | -> SDOM channel context i o 54 | address = element "address" 55 | 56 | address_ 57 | :: forall channel context i o 58 | . Array (SDOM channel context i o) 59 | -> SDOM channel context i o 60 | address_ = element_ "address" 61 | 62 | applet 63 | :: forall channel context i o 64 | . Array (Attr context i) 65 | -> Array (Handler context (Either channel (i -> o))) 66 | -> Array (SDOM channel context i o) 67 | -> SDOM channel context i o 68 | applet = element "applet" 69 | 70 | applet_ 71 | :: forall channel context i o 72 | . Array (SDOM channel context i o) 73 | -> SDOM channel context i o 74 | applet_ = element_ "applet" 75 | 76 | area 77 | :: forall channel context i o 78 | . Array (Attr context i) 79 | -> Array (Handler context (Either channel (i -> o))) 80 | -> Array (SDOM channel context i o) 81 | -> SDOM channel context i o 82 | area = element "area" 83 | 84 | area_ 85 | :: forall channel context i o 86 | . Array (SDOM channel context i o) 87 | -> SDOM channel context i o 88 | area_ = element_ "area" 89 | 90 | article 91 | :: forall channel context i o 92 | . Array (Attr context i) 93 | -> Array (Handler context (Either channel (i -> o))) 94 | -> Array (SDOM channel context i o) 95 | -> SDOM channel context i o 96 | article = element "article" 97 | 98 | article_ 99 | :: forall channel context i o 100 | . Array (SDOM channel context i o) 101 | -> SDOM channel context i o 102 | article_ = element_ "article" 103 | 104 | aside 105 | :: forall channel context i o 106 | . Array (Attr context i) 107 | -> Array (Handler context (Either channel (i -> o))) 108 | -> Array (SDOM channel context i o) 109 | -> SDOM channel context i o 110 | aside = element "aside" 111 | 112 | aside_ 113 | :: forall channel context i o 114 | . Array (SDOM channel context i o) 115 | -> SDOM channel context i o 116 | aside_ = element_ "aside" 117 | 118 | audio 119 | :: forall channel context i o 120 | . Array (Attr context i) 121 | -> Array (Handler context (Either channel (i -> o))) 122 | -> Array (SDOM channel context i o) 123 | -> SDOM channel context i o 124 | audio = element "audio" 125 | 126 | audio_ 127 | :: forall channel context i o 128 | . Array (SDOM channel context i o) 129 | -> SDOM channel context i o 130 | audio_ = element_ "audio" 131 | 132 | b 133 | :: forall channel context i o 134 | . Array (Attr context i) 135 | -> Array (Handler context (Either channel (i -> o))) 136 | -> Array (SDOM channel context i o) 137 | -> SDOM channel context i o 138 | b = element "b" 139 | 140 | b_ 141 | :: forall channel context i o 142 | . Array (SDOM channel context i o) 143 | -> SDOM channel context i o 144 | b_ = element_ "b" 145 | 146 | base 147 | :: forall channel context i o 148 | . Array (Attr context i) 149 | -> Array (Handler context (Either channel (i -> o))) 150 | -> Array (SDOM channel context i o) 151 | -> SDOM channel context i o 152 | base = element "base" 153 | 154 | base_ 155 | :: forall channel context i o 156 | . Array (SDOM channel context i o) 157 | -> SDOM channel context i o 158 | base_ = element_ "base" 159 | 160 | basefont 161 | :: forall channel context i o 162 | . Array (Attr context i) 163 | -> Array (Handler context (Either channel (i -> o))) 164 | -> Array (SDOM channel context i o) 165 | -> SDOM channel context i o 166 | basefont = element "basefont" 167 | 168 | basefont_ 169 | :: forall channel context i o 170 | . Array (SDOM channel context i o) 171 | -> SDOM channel context i o 172 | basefont_ = element_ "basefont" 173 | 174 | bdi 175 | :: forall channel context i o 176 | . Array (Attr context i) 177 | -> Array (Handler context (Either channel (i -> o))) 178 | -> Array (SDOM channel context i o) 179 | -> SDOM channel context i o 180 | bdi = element "bdi" 181 | 182 | bdi_ 183 | :: forall channel context i o 184 | . Array (SDOM channel context i o) 185 | -> SDOM channel context i o 186 | bdi_ = element_ "bdi" 187 | 188 | bdo 189 | :: forall channel context i o 190 | . Array (Attr context i) 191 | -> Array (Handler context (Either channel (i -> o))) 192 | -> Array (SDOM channel context i o) 193 | -> SDOM channel context i o 194 | bdo = element "bdo" 195 | 196 | bdo_ 197 | :: forall channel context i o 198 | . Array (SDOM channel context i o) 199 | -> SDOM channel context i o 200 | bdo_ = element_ "bdo" 201 | 202 | big 203 | :: forall channel context i o 204 | . Array (Attr context i) 205 | -> Array (Handler context (Either channel (i -> o))) 206 | -> Array (SDOM channel context i o) 207 | -> SDOM channel context i o 208 | big = element "big" 209 | 210 | big_ 211 | :: forall channel context i o 212 | . Array (SDOM channel context i o) 213 | -> SDOM channel context i o 214 | big_ = element_ "big" 215 | 216 | blockquote 217 | :: forall channel context i o 218 | . Array (Attr context i) 219 | -> Array (Handler context (Either channel (i -> o))) 220 | -> Array (SDOM channel context i o) 221 | -> SDOM channel context i o 222 | blockquote = element "blockquote" 223 | 224 | blockquote_ 225 | :: forall channel context i o 226 | . Array (SDOM channel context i o) 227 | -> SDOM channel context i o 228 | blockquote_ = element_ "blockquote" 229 | 230 | body 231 | :: forall channel context i o 232 | . Array (Attr context i) 233 | -> Array (Handler context (Either channel (i -> o))) 234 | -> Array (SDOM channel context i o) 235 | -> SDOM channel context i o 236 | body = element "body" 237 | 238 | body_ 239 | :: forall channel context i o 240 | . Array (SDOM channel context i o) 241 | -> SDOM channel context i o 242 | body_ = element_ "body" 243 | 244 | br 245 | :: forall channel context i o 246 | . Array (Attr context i) 247 | -> Array (Handler context (Either channel (i -> o))) 248 | -> Array (SDOM channel context i o) 249 | -> SDOM channel context i o 250 | br = element "br" 251 | 252 | br_ 253 | :: forall channel context i o 254 | . Array (SDOM channel context i o) 255 | -> SDOM channel context i o 256 | br_ = element_ "br" 257 | 258 | button 259 | :: forall channel context i o 260 | . Array (Attr context i) 261 | -> Array (Handler context (Either channel (i -> o))) 262 | -> Array (SDOM channel context i o) 263 | -> SDOM channel context i o 264 | button = element "button" 265 | 266 | button_ 267 | :: forall channel context i o 268 | . Array (SDOM channel context i o) 269 | -> SDOM channel context i o 270 | button_ = element_ "button" 271 | 272 | canvas 273 | :: forall channel context i o 274 | . Array (Attr context i) 275 | -> Array (Handler context (Either channel (i -> o))) 276 | -> Array (SDOM channel context i o) 277 | -> SDOM channel context i o 278 | canvas = element "canvas" 279 | 280 | canvas_ 281 | :: forall channel context i o 282 | . Array (SDOM channel context i o) 283 | -> SDOM channel context i o 284 | canvas_ = element_ "canvas" 285 | 286 | caption 287 | :: forall channel context i o 288 | . Array (Attr context i) 289 | -> Array (Handler context (Either channel (i -> o))) 290 | -> Array (SDOM channel context i o) 291 | -> SDOM channel context i o 292 | caption = element "caption" 293 | 294 | caption_ 295 | :: forall channel context i o 296 | . Array (SDOM channel context i o) 297 | -> SDOM channel context i o 298 | caption_ = element_ "caption" 299 | 300 | center 301 | :: forall channel context i o 302 | . Array (Attr context i) 303 | -> Array (Handler context (Either channel (i -> o))) 304 | -> Array (SDOM channel context i o) 305 | -> SDOM channel context i o 306 | center = element "center" 307 | 308 | center_ 309 | :: forall channel context i o 310 | . Array (SDOM channel context i o) 311 | -> SDOM channel context i o 312 | center_ = element_ "center" 313 | 314 | cite 315 | :: forall channel context i o 316 | . Array (Attr context i) 317 | -> Array (Handler context (Either channel (i -> o))) 318 | -> Array (SDOM channel context i o) 319 | -> SDOM channel context i o 320 | cite = element "cite" 321 | 322 | cite_ 323 | :: forall channel context i o 324 | . Array (SDOM channel context i o) 325 | -> SDOM channel context i o 326 | cite_ = element_ "cite" 327 | 328 | code 329 | :: forall channel context i o 330 | . Array (Attr context i) 331 | -> Array (Handler context (Either channel (i -> o))) 332 | -> Array (SDOM channel context i o) 333 | -> SDOM channel context i o 334 | code = element "code" 335 | 336 | code_ 337 | :: forall channel context i o 338 | . Array (SDOM channel context i o) 339 | -> SDOM channel context i o 340 | code_ = element_ "code" 341 | 342 | col 343 | :: forall channel context i o 344 | . Array (Attr context i) 345 | -> Array (Handler context (Either channel (i -> o))) 346 | -> Array (SDOM channel context i o) 347 | -> SDOM channel context i o 348 | col = element "col" 349 | 350 | col_ 351 | :: forall channel context i o 352 | . Array (SDOM channel context i o) 353 | -> SDOM channel context i o 354 | col_ = element_ "col" 355 | 356 | colgroup 357 | :: forall channel context i o 358 | . Array (Attr context i) 359 | -> Array (Handler context (Either channel (i -> o))) 360 | -> Array (SDOM channel context i o) 361 | -> SDOM channel context i o 362 | colgroup = element "colgroup" 363 | 364 | colgroup_ 365 | :: forall channel context i o 366 | . Array (SDOM channel context i o) 367 | -> SDOM channel context i o 368 | colgroup_ = element_ "colgroup" 369 | 370 | datalist 371 | :: forall channel context i o 372 | . Array (Attr context i) 373 | -> Array (Handler context (Either channel (i -> o))) 374 | -> Array (SDOM channel context i o) 375 | -> SDOM channel context i o 376 | datalist = element "datalist" 377 | 378 | datalist_ 379 | :: forall channel context i o 380 | . Array (SDOM channel context i o) 381 | -> SDOM channel context i o 382 | datalist_ = element_ "datalist" 383 | 384 | dd 385 | :: forall channel context i o 386 | . Array (Attr context i) 387 | -> Array (Handler context (Either channel (i -> o))) 388 | -> Array (SDOM channel context i o) 389 | -> SDOM channel context i o 390 | dd = element "dd" 391 | 392 | dd_ 393 | :: forall channel context i o 394 | . Array (SDOM channel context i o) 395 | -> SDOM channel context i o 396 | dd_ = element_ "dd" 397 | 398 | del 399 | :: forall channel context i o 400 | . Array (Attr context i) 401 | -> Array (Handler context (Either channel (i -> o))) 402 | -> Array (SDOM channel context i o) 403 | -> SDOM channel context i o 404 | del = element "del" 405 | 406 | del_ 407 | :: forall channel context i o 408 | . Array (SDOM channel context i o) 409 | -> SDOM channel context i o 410 | del_ = element_ "del" 411 | 412 | details 413 | :: forall channel context i o 414 | . Array (Attr context i) 415 | -> Array (Handler context (Either channel (i -> o))) 416 | -> Array (SDOM channel context i o) 417 | -> SDOM channel context i o 418 | details = element "details" 419 | 420 | details_ 421 | :: forall channel context i o 422 | . Array (SDOM channel context i o) 423 | -> SDOM channel context i o 424 | details_ = element_ "details" 425 | 426 | dfn 427 | :: forall channel context i o 428 | . Array (Attr context i) 429 | -> Array (Handler context (Either channel (i -> o))) 430 | -> Array (SDOM channel context i o) 431 | -> SDOM channel context i o 432 | dfn = element "dfn" 433 | 434 | dfn_ 435 | :: forall channel context i o 436 | . Array (SDOM channel context i o) 437 | -> SDOM channel context i o 438 | dfn_ = element_ "dfn" 439 | 440 | dialog 441 | :: forall channel context i o 442 | . Array (Attr context i) 443 | -> Array (Handler context (Either channel (i -> o))) 444 | -> Array (SDOM channel context i o) 445 | -> SDOM channel context i o 446 | dialog = element "dialog" 447 | 448 | dialog_ 449 | :: forall channel context i o 450 | . Array (SDOM channel context i o) 451 | -> SDOM channel context i o 452 | dialog_ = element_ "dialog" 453 | 454 | dir 455 | :: forall channel context i o 456 | . Array (Attr context i) 457 | -> Array (Handler context (Either channel (i -> o))) 458 | -> Array (SDOM channel context i o) 459 | -> SDOM channel context i o 460 | dir = element "dir" 461 | 462 | dir_ 463 | :: forall channel context i o 464 | . Array (SDOM channel context i o) 465 | -> SDOM channel context i o 466 | dir_ = element_ "dir" 467 | 468 | div 469 | :: forall channel context i o 470 | . Array (Attr context i) 471 | -> Array (Handler context (Either channel (i -> o))) 472 | -> Array (SDOM channel context i o) 473 | -> SDOM channel context i o 474 | div = element "div" 475 | 476 | div_ 477 | :: forall channel context i o 478 | . Array (SDOM channel context i o) 479 | -> SDOM channel context i o 480 | div_ = element_ "div" 481 | 482 | dl 483 | :: forall channel context i o 484 | . Array (Attr context i) 485 | -> Array (Handler context (Either channel (i -> o))) 486 | -> Array (SDOM channel context i o) 487 | -> SDOM channel context i o 488 | dl = element "dl" 489 | 490 | dl_ 491 | :: forall channel context i o 492 | . Array (SDOM channel context i o) 493 | -> SDOM channel context i o 494 | dl_ = element_ "dl" 495 | 496 | dt 497 | :: forall channel context i o 498 | . Array (Attr context i) 499 | -> Array (Handler context (Either channel (i -> o))) 500 | -> Array (SDOM channel context i o) 501 | -> SDOM channel context i o 502 | dt = element "dt" 503 | 504 | dt_ 505 | :: forall channel context i o 506 | . Array (SDOM channel context i o) 507 | -> SDOM channel context i o 508 | dt_ = element_ "dt" 509 | 510 | em 511 | :: forall channel context i o 512 | . Array (Attr context i) 513 | -> Array (Handler context (Either channel (i -> o))) 514 | -> Array (SDOM channel context i o) 515 | -> SDOM channel context i o 516 | em = element "em" 517 | 518 | em_ 519 | :: forall channel context i o 520 | . Array (SDOM channel context i o) 521 | -> SDOM channel context i o 522 | em_ = element_ "em" 523 | 524 | embed 525 | :: forall channel context i o 526 | . Array (Attr context i) 527 | -> Array (Handler context (Either channel (i -> o))) 528 | -> Array (SDOM channel context i o) 529 | -> SDOM channel context i o 530 | embed = element "embed" 531 | 532 | embed_ 533 | :: forall channel context i o 534 | . Array (SDOM channel context i o) 535 | -> SDOM channel context i o 536 | embed_ = element_ "embed" 537 | 538 | fieldset 539 | :: forall channel context i o 540 | . Array (Attr context i) 541 | -> Array (Handler context (Either channel (i -> o))) 542 | -> Array (SDOM channel context i o) 543 | -> SDOM channel context i o 544 | fieldset = element "fieldset" 545 | 546 | fieldset_ 547 | :: forall channel context i o 548 | . Array (SDOM channel context i o) 549 | -> SDOM channel context i o 550 | fieldset_ = element_ "fieldset" 551 | 552 | figcaption 553 | :: forall channel context i o 554 | . Array (Attr context i) 555 | -> Array (Handler context (Either channel (i -> o))) 556 | -> Array (SDOM channel context i o) 557 | -> SDOM channel context i o 558 | figcaption = element "figcaption" 559 | 560 | figcaption_ 561 | :: forall channel context i o 562 | . Array (SDOM channel context i o) 563 | -> SDOM channel context i o 564 | figcaption_ = element_ "figcaption" 565 | 566 | figure 567 | :: forall channel context i o 568 | . Array (Attr context i) 569 | -> Array (Handler context (Either channel (i -> o))) 570 | -> Array (SDOM channel context i o) 571 | -> SDOM channel context i o 572 | figure = element "figure" 573 | 574 | figure_ 575 | :: forall channel context i o 576 | . Array (SDOM channel context i o) 577 | -> SDOM channel context i o 578 | figure_ = element_ "figure" 579 | 580 | font 581 | :: forall channel context i o 582 | . Array (Attr context i) 583 | -> Array (Handler context (Either channel (i -> o))) 584 | -> Array (SDOM channel context i o) 585 | -> SDOM channel context i o 586 | font = element "font" 587 | 588 | font_ 589 | :: forall channel context i o 590 | . Array (SDOM channel context i o) 591 | -> SDOM channel context i o 592 | font_ = element_ "font" 593 | 594 | footer 595 | :: forall channel context i o 596 | . Array (Attr context i) 597 | -> Array (Handler context (Either channel (i -> o))) 598 | -> Array (SDOM channel context i o) 599 | -> SDOM channel context i o 600 | footer = element "footer" 601 | 602 | footer_ 603 | :: forall channel context i o 604 | . Array (SDOM channel context i o) 605 | -> SDOM channel context i o 606 | footer_ = element_ "footer" 607 | 608 | form 609 | :: forall channel context i o 610 | . Array (Attr context i) 611 | -> Array (Handler context (Either channel (i -> o))) 612 | -> Array (SDOM channel context i o) 613 | -> SDOM channel context i o 614 | form = element "form" 615 | 616 | form_ 617 | :: forall channel context i o 618 | . Array (SDOM channel context i o) 619 | -> SDOM channel context i o 620 | form_ = element_ "form" 621 | 622 | frame 623 | :: forall channel context i o 624 | . Array (Attr context i) 625 | -> Array (Handler context (Either channel (i -> o))) 626 | -> Array (SDOM channel context i o) 627 | -> SDOM channel context i o 628 | frame = element "frame" 629 | 630 | frame_ 631 | :: forall channel context i o 632 | . Array (SDOM channel context i o) 633 | -> SDOM channel context i o 634 | frame_ = element_ "frame" 635 | 636 | frameset 637 | :: forall channel context i o 638 | . Array (Attr context i) 639 | -> Array (Handler context (Either channel (i -> o))) 640 | -> Array (SDOM channel context i o) 641 | -> SDOM channel context i o 642 | frameset = element "frameset" 643 | 644 | frameset_ 645 | :: forall channel context i o 646 | . Array (SDOM channel context i o) 647 | -> SDOM channel context i o 648 | frameset_ = element_ "frameset" 649 | 650 | h1 651 | :: forall channel context i o 652 | . Array (Attr context i) 653 | -> Array (Handler context (Either channel (i -> o))) 654 | -> Array (SDOM channel context i o) 655 | -> SDOM channel context i o 656 | h1 = element "h1" 657 | 658 | h1_ 659 | :: forall channel context i o 660 | . Array (SDOM channel context i o) 661 | -> SDOM channel context i o 662 | h1_ = element_ "h1" 663 | 664 | head 665 | :: forall channel context i o 666 | . Array (Attr context i) 667 | -> Array (Handler context (Either channel (i -> o))) 668 | -> Array (SDOM channel context i o) 669 | -> SDOM channel context i o 670 | head = element "head" 671 | 672 | head_ 673 | :: forall channel context i o 674 | . Array (SDOM channel context i o) 675 | -> SDOM channel context i o 676 | head_ = element_ "head" 677 | 678 | header 679 | :: forall channel context i o 680 | . Array (Attr context i) 681 | -> Array (Handler context (Either channel (i -> o))) 682 | -> Array (SDOM channel context i o) 683 | -> SDOM channel context i o 684 | header = element "header" 685 | 686 | header_ 687 | :: forall channel context i o 688 | . Array (SDOM channel context i o) 689 | -> SDOM channel context i o 690 | header_ = element_ "header" 691 | 692 | hr 693 | :: forall channel context i o 694 | . Array (Attr context i) 695 | -> Array (Handler context (Either channel (i -> o))) 696 | -> Array (SDOM channel context i o) 697 | -> SDOM channel context i o 698 | hr = element "hr" 699 | 700 | hr_ 701 | :: forall channel context i o 702 | . Array (SDOM channel context i o) 703 | -> SDOM channel context i o 704 | hr_ = element_ "hr" 705 | 706 | html 707 | :: forall channel context i o 708 | . Array (Attr context i) 709 | -> Array (Handler context (Either channel (i -> o))) 710 | -> Array (SDOM channel context i o) 711 | -> SDOM channel context i o 712 | html = element "html" 713 | 714 | html_ 715 | :: forall channel context i o 716 | . Array (SDOM channel context i o) 717 | -> SDOM channel context i o 718 | html_ = element_ "htmch" 719 | 720 | i 721 | :: forall channel context i o 722 | . Array (Attr context i) 723 | -> Array (Handler context (Either channel (i -> o))) 724 | -> Array (SDOM channel context i o) 725 | -> SDOM channel context i o 726 | i = element "i" 727 | 728 | i_ 729 | :: forall channel context i o 730 | . Array (SDOM channel context i o) 731 | -> SDOM channel context i o 732 | i_ = element_ "i" 733 | 734 | iframe 735 | :: forall channel context i o 736 | . Array (Attr context i) 737 | -> Array (Handler context (Either channel (i -> o))) 738 | -> Array (SDOM channel context i o) 739 | -> SDOM channel context i o 740 | iframe = element "iframe" 741 | 742 | iframe_ 743 | :: forall channel context i o 744 | . Array (SDOM channel context i o) 745 | -> SDOM channel context i o 746 | iframe_ = element_ "iframe" 747 | 748 | img 749 | :: forall channel context i o 750 | . Array (Attr context i) 751 | -> Array (Handler context (Either channel (i -> o))) 752 | -> Array (SDOM channel context i o) 753 | -> SDOM channel context i o 754 | img = element "img" 755 | 756 | img_ 757 | :: forall channel context i o 758 | . Array (SDOM channel context i o) 759 | -> SDOM channel context i o 760 | img_ = element_ "img" 761 | 762 | input 763 | :: forall channel context i o 764 | . Array (Attr context i) 765 | -> Array (Handler context (Either channel (i -> o))) 766 | -> Array (SDOM channel context i o) 767 | -> SDOM channel context i o 768 | input = element "input" 769 | 770 | input_ 771 | :: forall channel context i o 772 | . Array (SDOM channel context i o) 773 | -> SDOM channel context i o 774 | input_ = element_ "input" 775 | 776 | ins 777 | :: forall channel context i o 778 | . Array (Attr context i) 779 | -> Array (Handler context (Either channel (i -> o))) 780 | -> Array (SDOM channel context i o) 781 | -> SDOM channel context i o 782 | ins = element "ins" 783 | 784 | ins_ 785 | :: forall channel context i o 786 | . Array (SDOM channel context i o) 787 | -> SDOM channel context i o 788 | ins_ = element_ "ins" 789 | 790 | kbd 791 | :: forall channel context i o 792 | . Array (Attr context i) 793 | -> Array (Handler context (Either channel (i -> o))) 794 | -> Array (SDOM channel context i o) 795 | -> SDOM channel context i o 796 | kbd = element "kbd" 797 | 798 | kbd_ 799 | :: forall channel context i o 800 | . Array (SDOM channel context i o) 801 | -> SDOM channel context i o 802 | kbd_ = element_ "kbd" 803 | 804 | label 805 | :: forall channel context i o 806 | . Array (Attr context i) 807 | -> Array (Handler context (Either channel (i -> o))) 808 | -> Array (SDOM channel context i o) 809 | -> SDOM channel context i o 810 | label = element "label" 811 | 812 | label_ 813 | :: forall channel context i o 814 | . Array (SDOM channel context i o) 815 | -> SDOM channel context i o 816 | label_ = element_ "label" 817 | 818 | legend 819 | :: forall channel context i o 820 | . Array (Attr context i) 821 | -> Array (Handler context (Either channel (i -> o))) 822 | -> Array (SDOM channel context i o) 823 | -> SDOM channel context i o 824 | legend = element "legend" 825 | 826 | legend_ 827 | :: forall channel context i o 828 | . Array (SDOM channel context i o) 829 | -> SDOM channel context i o 830 | legend_ = element_ "legend" 831 | 832 | li 833 | :: forall channel context i o 834 | . Array (Attr context i) 835 | -> Array (Handler context (Either channel (i -> o))) 836 | -> Array (SDOM channel context i o) 837 | -> SDOM channel context i o 838 | li = element "li" 839 | 840 | li_ 841 | :: forall channel context i o 842 | . Array (SDOM channel context i o) 843 | -> SDOM channel context i o 844 | li_ = element_ "li" 845 | 846 | link 847 | :: forall channel context i o 848 | . Array (Attr context i) 849 | -> Array (Handler context (Either channel (i -> o))) 850 | -> Array (SDOM channel context i o) 851 | -> SDOM channel context i o 852 | link = element "link" 853 | 854 | link_ 855 | :: forall channel context i o 856 | . Array (SDOM channel context i o) 857 | -> SDOM channel context i o 858 | link_ = element_ "link" 859 | 860 | main 861 | :: forall channel context i o 862 | . Array (Attr context i) 863 | -> Array (Handler context (Either channel (i -> o))) 864 | -> Array (SDOM channel context i o) 865 | -> SDOM channel context i o 866 | main = element "main" 867 | 868 | main_ 869 | :: forall channel context i o 870 | . Array (SDOM channel context i o) 871 | -> SDOM channel context i o 872 | main_ = element_ "main" 873 | 874 | map 875 | :: forall channel context i o 876 | . Array (Attr context i) 877 | -> Array (Handler context (Either channel (i -> o))) 878 | -> Array (SDOM channel context i o) 879 | -> SDOM channel context i o 880 | map = element "map" 881 | 882 | map_ 883 | :: forall channel context i o 884 | . Array (SDOM channel context i o) 885 | -> SDOM channel context i o 886 | map_ = element_ "map" 887 | 888 | mark 889 | :: forall channel context i o 890 | . Array (Attr context i) 891 | -> Array (Handler context (Either channel (i -> o))) 892 | -> Array (SDOM channel context i o) 893 | -> SDOM channel context i o 894 | mark = element "mark" 895 | 896 | mark_ 897 | :: forall channel context i o 898 | . Array (SDOM channel context i o) 899 | -> SDOM channel context i o 900 | mark_ = element_ "mark" 901 | 902 | menu 903 | :: forall channel context i o 904 | . Array (Attr context i) 905 | -> Array (Handler context (Either channel (i -> o))) 906 | -> Array (SDOM channel context i o) 907 | -> SDOM channel context i o 908 | menu = element "menu" 909 | 910 | menu_ 911 | :: forall channel context i o 912 | . Array (SDOM channel context i o) 913 | -> SDOM channel context i o 914 | menu_ = element_ "menu" 915 | 916 | menuitem 917 | :: forall channel context i o 918 | . Array (Attr context i) 919 | -> Array (Handler context (Either channel (i -> o))) 920 | -> Array (SDOM channel context i o) 921 | -> SDOM channel context i o 922 | menuitem = element "menuitem" 923 | 924 | menuitem_ 925 | :: forall channel context i o 926 | . Array (SDOM channel context i o) 927 | -> SDOM channel context i o 928 | menuitem_ = element_ "menuitem" 929 | 930 | meta 931 | :: forall channel context i o 932 | . Array (Attr context i) 933 | -> Array (Handler context (Either channel (i -> o))) 934 | -> Array (SDOM channel context i o) 935 | -> SDOM channel context i o 936 | meta = element "meta" 937 | 938 | meta_ 939 | :: forall channel context i o 940 | . Array (SDOM channel context i o) 941 | -> SDOM channel context i o 942 | meta_ = element_ "meta" 943 | 944 | meter 945 | :: forall channel context i o 946 | . Array (Attr context i) 947 | -> Array (Handler context (Either channel (i -> o))) 948 | -> Array (SDOM channel context i o) 949 | -> SDOM channel context i o 950 | meter = element "meter" 951 | 952 | meter_ 953 | :: forall channel context i o 954 | . Array (SDOM channel context i o) 955 | -> SDOM channel context i o 956 | meter_ = element_ "meter" 957 | 958 | nav 959 | :: forall channel context i o 960 | . Array (Attr context i) 961 | -> Array (Handler context (Either channel (i -> o))) 962 | -> Array (SDOM channel context i o) 963 | -> SDOM channel context i o 964 | nav = element "nav" 965 | 966 | nav_ 967 | :: forall channel context i o 968 | . Array (SDOM channel context i o) 969 | -> SDOM channel context i o 970 | nav_ = element_ "nav" 971 | 972 | noframes 973 | :: forall channel context i o 974 | . Array (Attr context i) 975 | -> Array (Handler context (Either channel (i -> o))) 976 | -> Array (SDOM channel context i o) 977 | -> SDOM channel context i o 978 | noframes = element "noframes" 979 | 980 | noframes_ 981 | :: forall channel context i o 982 | . Array (SDOM channel context i o) 983 | -> SDOM channel context i o 984 | noframes_ = element_ "noframes" 985 | 986 | noscript 987 | :: forall channel context i o 988 | . Array (Attr context i) 989 | -> Array (Handler context (Either channel (i -> o))) 990 | -> Array (SDOM channel context i o) 991 | -> SDOM channel context i o 992 | noscript = element "noscript" 993 | 994 | noscript_ 995 | :: forall channel context i o 996 | . Array (SDOM channel context i o) 997 | -> SDOM channel context i o 998 | noscript_ = element_ "noscript" 999 | 1000 | object 1001 | :: forall channel context i o 1002 | . Array (Attr context i) 1003 | -> Array (Handler context (Either channel (i -> o))) 1004 | -> Array (SDOM channel context i o) 1005 | -> SDOM channel context i o 1006 | object = element "object" 1007 | 1008 | object_ 1009 | :: forall channel context i o 1010 | . Array (SDOM channel context i o) 1011 | -> SDOM channel context i o 1012 | object_ = element_ "object" 1013 | 1014 | ol 1015 | :: forall channel context i o 1016 | . Array (Attr context i) 1017 | -> Array (Handler context (Either channel (i -> o))) 1018 | -> Array (SDOM channel context i o) 1019 | -> SDOM channel context i o 1020 | ol = element "ol" 1021 | 1022 | ol_ 1023 | :: forall channel context i o 1024 | . Array (SDOM channel context i o) 1025 | -> SDOM channel context i o 1026 | ol_ = element_ "ol" 1027 | 1028 | optgroup 1029 | :: forall channel context i o 1030 | . Array (Attr context i) 1031 | -> Array (Handler context (Either channel (i -> o))) 1032 | -> Array (SDOM channel context i o) 1033 | -> SDOM channel context i o 1034 | optgroup = element "optgroup" 1035 | 1036 | optgroup_ 1037 | :: forall channel context i o 1038 | . Array (SDOM channel context i o) 1039 | -> SDOM channel context i o 1040 | optgroup_ = element_ "optgroup" 1041 | 1042 | option 1043 | :: forall channel context i o 1044 | . Array (Attr context i) 1045 | -> Array (Handler context (Either channel (i -> o))) 1046 | -> Array (SDOM channel context i o) 1047 | -> SDOM channel context i o 1048 | option = element "option" 1049 | 1050 | option_ 1051 | :: forall channel context i o 1052 | . Array (SDOM channel context i o) 1053 | -> SDOM channel context i o 1054 | option_ = element_ "option" 1055 | 1056 | output 1057 | :: forall channel context i o 1058 | . Array (Attr context i) 1059 | -> Array (Handler context (Either channel (i -> o))) 1060 | -> Array (SDOM channel context i o) 1061 | -> SDOM channel context i o 1062 | output = element "output" 1063 | 1064 | output_ 1065 | :: forall channel context i o 1066 | . Array (SDOM channel context i o) 1067 | -> SDOM channel context i o 1068 | output_ = element_ "outpuch" 1069 | 1070 | p 1071 | :: forall channel context i o 1072 | . Array (Attr context i) 1073 | -> Array (Handler context (Either channel (i -> o))) 1074 | -> Array (SDOM channel context i o) 1075 | -> SDOM channel context i o 1076 | p = element "p" 1077 | 1078 | p_ 1079 | :: forall channel context i o 1080 | . Array (SDOM channel context i o) 1081 | -> SDOM channel context i o 1082 | p_ = element_ "p" 1083 | 1084 | param 1085 | :: forall channel context i o 1086 | . Array (Attr context i) 1087 | -> Array (Handler context (Either channel (i -> o))) 1088 | -> Array (SDOM channel context i o) 1089 | -> SDOM channel context i o 1090 | param = element "param" 1091 | 1092 | param_ 1093 | :: forall channel context i o 1094 | . Array (SDOM channel context i o) 1095 | -> SDOM channel context i o 1096 | param_ = element_ "param" 1097 | 1098 | picture 1099 | :: forall channel context i o 1100 | . Array (Attr context i) 1101 | -> Array (Handler context (Either channel (i -> o))) 1102 | -> Array (SDOM channel context i o) 1103 | -> SDOM channel context i o 1104 | picture = element "picture" 1105 | 1106 | picture_ 1107 | :: forall channel context i o 1108 | . Array (SDOM channel context i o) 1109 | -> SDOM channel context i o 1110 | picture_ = element_ "picture" 1111 | 1112 | pre 1113 | :: forall channel context i o 1114 | . Array (Attr context i) 1115 | -> Array (Handler context (Either channel (i -> o))) 1116 | -> Array (SDOM channel context i o) 1117 | -> SDOM channel context i o 1118 | pre = element "pre" 1119 | 1120 | pre_ 1121 | :: forall channel context i o 1122 | . Array (SDOM channel context i o) 1123 | -> SDOM channel context i o 1124 | pre_ = element_ "pre" 1125 | 1126 | progress 1127 | :: forall channel context i o 1128 | . Array (Attr context i) 1129 | -> Array (Handler context (Either channel (i -> o))) 1130 | -> Array (SDOM channel context i o) 1131 | -> SDOM channel context i o 1132 | progress = element "progress" 1133 | 1134 | progress_ 1135 | :: forall channel context i o 1136 | . Array (SDOM channel context i o) 1137 | -> SDOM channel context i o 1138 | progress_ = element_ "progresch" 1139 | 1140 | q 1141 | :: forall channel context i o 1142 | . Array (Attr context i) 1143 | -> Array (Handler context (Either channel (i -> o))) 1144 | -> Array (SDOM channel context i o) 1145 | -> SDOM channel context i o 1146 | q = element "q" 1147 | 1148 | q_ 1149 | :: forall channel context i o 1150 | . Array (SDOM channel context i o) 1151 | -> SDOM channel context i o 1152 | q_ = element_ "q" 1153 | 1154 | rp 1155 | :: forall channel context i o 1156 | . Array (Attr context i) 1157 | -> Array (Handler context (Either channel (i -> o))) 1158 | -> Array (SDOM channel context i o) 1159 | -> SDOM channel context i o 1160 | rp = element "rp" 1161 | 1162 | rp_ 1163 | :: forall channel context i o 1164 | . Array (SDOM channel context i o) 1165 | -> SDOM channel context i o 1166 | rp_ = element_ "rp" 1167 | 1168 | rt 1169 | :: forall channel context i o 1170 | . Array (Attr context i) 1171 | -> Array (Handler context (Either channel (i -> o))) 1172 | -> Array (SDOM channel context i o) 1173 | -> SDOM channel context i o 1174 | rt = element "rt" 1175 | 1176 | rt_ 1177 | :: forall channel context i o 1178 | . Array (SDOM channel context i o) 1179 | -> SDOM channel context i o 1180 | rt_ = element_ "rt" 1181 | 1182 | ruby 1183 | :: forall channel context i o 1184 | . Array (Attr context i) 1185 | -> Array (Handler context (Either channel (i -> o))) 1186 | -> Array (SDOM channel context i o) 1187 | -> SDOM channel context i o 1188 | ruby = element "ruby" 1189 | 1190 | ruby_ 1191 | :: forall channel context i o 1192 | . Array (SDOM channel context i o) 1193 | -> SDOM channel context i o 1194 | ruby_ = element_ "rubch" 1195 | 1196 | s 1197 | :: forall channel context i o 1198 | . Array (Attr context i) 1199 | -> Array (Handler context (Either channel (i -> o))) 1200 | -> Array (SDOM channel context i o) 1201 | -> SDOM channel context i o 1202 | s = element "s" 1203 | 1204 | s_ 1205 | :: forall channel context i o 1206 | . Array (SDOM channel context i o) 1207 | -> SDOM channel context i o 1208 | s_ = element_ "s" 1209 | 1210 | samp 1211 | :: forall channel context i o 1212 | . Array (Attr context i) 1213 | -> Array (Handler context (Either channel (i -> o))) 1214 | -> Array (SDOM channel context i o) 1215 | -> SDOM channel context i o 1216 | samp = element "samp" 1217 | 1218 | samp_ 1219 | :: forall channel context i o 1220 | . Array (SDOM channel context i o) 1221 | -> SDOM channel context i o 1222 | samp_ = element_ "samp" 1223 | 1224 | script 1225 | :: forall channel context i o 1226 | . Array (Attr context i) 1227 | -> Array (Handler context (Either channel (i -> o))) 1228 | -> Array (SDOM channel context i o) 1229 | -> SDOM channel context i o 1230 | script = element "script" 1231 | 1232 | script_ 1233 | :: forall channel context i o 1234 | . Array (SDOM channel context i o) 1235 | -> SDOM channel context i o 1236 | script_ = element_ "script" 1237 | 1238 | section 1239 | :: forall channel context i o 1240 | . Array (Attr context i) 1241 | -> Array (Handler context (Either channel (i -> o))) 1242 | -> Array (SDOM channel context i o) 1243 | -> SDOM channel context i o 1244 | section = element "section" 1245 | 1246 | section_ 1247 | :: forall channel context i o 1248 | . Array (SDOM channel context i o) 1249 | -> SDOM channel context i o 1250 | section_ = element_ "section" 1251 | 1252 | select 1253 | :: forall channel context i o 1254 | . Array (Attr context i) 1255 | -> Array (Handler context (Either channel (i -> o))) 1256 | -> Array (SDOM channel context i o) 1257 | -> SDOM channel context i o 1258 | select = element "select" 1259 | 1260 | select_ 1261 | :: forall channel context i o 1262 | . Array (SDOM channel context i o) 1263 | -> SDOM channel context i o 1264 | select_ = element_ "select" 1265 | 1266 | small 1267 | :: forall channel context i o 1268 | . Array (Attr context i) 1269 | -> Array (Handler context (Either channel (i -> o))) 1270 | -> Array (SDOM channel context i o) 1271 | -> SDOM channel context i o 1272 | small = element "small" 1273 | 1274 | small_ 1275 | :: forall channel context i o 1276 | . Array (SDOM channel context i o) 1277 | -> SDOM channel context i o 1278 | small_ = element_ "small" 1279 | 1280 | source 1281 | :: forall channel context i o 1282 | . Array (Attr context i) 1283 | -> Array (Handler context (Either channel (i -> o))) 1284 | -> Array (SDOM channel context i o) 1285 | -> SDOM channel context i o 1286 | source = element "source" 1287 | 1288 | source_ 1289 | :: forall channel context i o 1290 | . Array (SDOM channel context i o) 1291 | -> SDOM channel context i o 1292 | source_ = element_ "source" 1293 | 1294 | span 1295 | :: forall channel context i o 1296 | . Array (Attr context i) 1297 | -> Array (Handler context (Either channel (i -> o))) 1298 | -> Array (SDOM channel context i o) 1299 | -> SDOM channel context i o 1300 | span = element "span" 1301 | 1302 | span_ 1303 | :: forall channel context i o 1304 | . Array (SDOM channel context i o) 1305 | -> SDOM channel context i o 1306 | span_ = element_ "span" 1307 | 1308 | strike 1309 | :: forall channel context i o 1310 | . Array (Attr context i) 1311 | -> Array (Handler context (Either channel (i -> o))) 1312 | -> Array (SDOM channel context i o) 1313 | -> SDOM channel context i o 1314 | strike = element "strike" 1315 | 1316 | strike_ 1317 | :: forall channel context i o 1318 | . Array (SDOM channel context i o) 1319 | -> SDOM channel context i o 1320 | strike_ = element_ "strike" 1321 | 1322 | strong 1323 | :: forall channel context i o 1324 | . Array (Attr context i) 1325 | -> Array (Handler context (Either channel (i -> o))) 1326 | -> Array (SDOM channel context i o) 1327 | -> SDOM channel context i o 1328 | strong = element "strong" 1329 | 1330 | strong_ 1331 | :: forall channel context i o 1332 | . Array (SDOM channel context i o) 1333 | -> SDOM channel context i o 1334 | strong_ = element_ "strong" 1335 | 1336 | style 1337 | :: forall channel context i o 1338 | . Array (Attr context i) 1339 | -> Array (Handler context (Either channel (i -> o))) 1340 | -> Array (SDOM channel context i o) 1341 | -> SDOM channel context i o 1342 | style = element "style" 1343 | 1344 | style_ 1345 | :: forall channel context i o 1346 | . Array (SDOM channel context i o) 1347 | -> SDOM channel context i o 1348 | style_ = element_ "style" 1349 | 1350 | sub 1351 | :: forall channel context i o 1352 | . Array (Attr context i) 1353 | -> Array (Handler context (Either channel (i -> o))) 1354 | -> Array (SDOM channel context i o) 1355 | -> SDOM channel context i o 1356 | sub = element "sub" 1357 | 1358 | sub_ 1359 | :: forall channel context i o 1360 | . Array (SDOM channel context i o) 1361 | -> SDOM channel context i o 1362 | sub_ = element_ "sub" 1363 | 1364 | summary 1365 | :: forall channel context i o 1366 | . Array (Attr context i) 1367 | -> Array (Handler context (Either channel (i -> o))) 1368 | -> Array (SDOM channel context i o) 1369 | -> SDOM channel context i o 1370 | summary = element "summary" 1371 | 1372 | summary_ 1373 | :: forall channel context i o 1374 | . Array (SDOM channel context i o) 1375 | -> SDOM channel context i o 1376 | summary_ = element_ "summary" 1377 | 1378 | sup 1379 | :: forall channel context i o 1380 | . Array (Attr context i) 1381 | -> Array (Handler context (Either channel (i -> o))) 1382 | -> Array (SDOM channel context i o) 1383 | -> SDOM channel context i o 1384 | sup = element "sup" 1385 | 1386 | sup_ 1387 | :: forall channel context i o 1388 | . Array (SDOM channel context i o) 1389 | -> SDOM channel context i o 1390 | sup_ = element_ "sup" 1391 | 1392 | table 1393 | :: forall channel context i o 1394 | . Array (Attr context i) 1395 | -> Array (Handler context (Either channel (i -> o))) 1396 | -> Array (SDOM channel context i o) 1397 | -> SDOM channel context i o 1398 | table = element "table" 1399 | 1400 | table_ 1401 | :: forall channel context i o 1402 | . Array (SDOM channel context i o) 1403 | -> SDOM channel context i o 1404 | table_ = element_ "table" 1405 | 1406 | tbody 1407 | :: forall channel context i o 1408 | . Array (Attr context i) 1409 | -> Array (Handler context (Either channel (i -> o))) 1410 | -> Array (SDOM channel context i o) 1411 | -> SDOM channel context i o 1412 | tbody = element "tbody" 1413 | 1414 | tbody_ 1415 | :: forall channel context i o 1416 | . Array (SDOM channel context i o) 1417 | -> SDOM channel context i o 1418 | tbody_ = element_ "tbody" 1419 | 1420 | td 1421 | :: forall channel context i o 1422 | . Array (Attr context i) 1423 | -> Array (Handler context (Either channel (i -> o))) 1424 | -> Array (SDOM channel context i o) 1425 | -> SDOM channel context i o 1426 | td = element "td" 1427 | 1428 | td_ 1429 | :: forall channel context i o 1430 | . Array (SDOM channel context i o) 1431 | -> SDOM channel context i o 1432 | td_ = element_ "td" 1433 | 1434 | template 1435 | :: forall channel context i o 1436 | . Array (Attr context i) 1437 | -> Array (Handler context (Either channel (i -> o))) 1438 | -> Array (SDOM channel context i o) 1439 | -> SDOM channel context i o 1440 | template = element "template" 1441 | 1442 | template_ 1443 | :: forall channel context i o 1444 | . Array (SDOM channel context i o) 1445 | -> SDOM channel context i o 1446 | template_ = element_ "template" 1447 | 1448 | textarea 1449 | :: forall channel context i o 1450 | . Array (Attr context i) 1451 | -> Array (Handler context (Either channel (i -> o))) 1452 | -> Array (SDOM channel context i o) 1453 | -> SDOM channel context i o 1454 | textarea = element "textarea" 1455 | 1456 | textarea_ 1457 | :: forall channel context i o 1458 | . Array (SDOM channel context i o) 1459 | -> SDOM channel context i o 1460 | textarea_ = element_ "textarea" 1461 | 1462 | tfoot 1463 | :: forall channel context i o 1464 | . Array (Attr context i) 1465 | -> Array (Handler context (Either channel (i -> o))) 1466 | -> Array (SDOM channel context i o) 1467 | -> SDOM channel context i o 1468 | tfoot = element "tfoot" 1469 | 1470 | tfoot_ 1471 | :: forall channel context i o 1472 | . Array (SDOM channel context i o) 1473 | -> SDOM channel context i o 1474 | tfoot_ = element_ "tfoot" 1475 | 1476 | th 1477 | :: forall channel context i o 1478 | . Array (Attr context i) 1479 | -> Array (Handler context (Either channel (i -> o))) 1480 | -> Array (SDOM channel context i o) 1481 | -> SDOM channel context i o 1482 | th = element "th" 1483 | 1484 | th_ 1485 | :: forall channel context i o 1486 | . Array (SDOM channel context i o) 1487 | -> SDOM channel context i o 1488 | th_ = element_ "th" 1489 | 1490 | thead 1491 | :: forall channel context i o 1492 | . Array (Attr context i) 1493 | -> Array (Handler context (Either channel (i -> o))) 1494 | -> Array (SDOM channel context i o) 1495 | -> SDOM channel context i o 1496 | thead = element "thead" 1497 | 1498 | thead_ 1499 | :: forall channel context i o 1500 | . Array (SDOM channel context i o) 1501 | -> SDOM channel context i o 1502 | thead_ = element_ "thead" 1503 | 1504 | time 1505 | :: forall channel context i o 1506 | . Array (Attr context i) 1507 | -> Array (Handler context (Either channel (i -> o))) 1508 | -> Array (SDOM channel context i o) 1509 | -> SDOM channel context i o 1510 | time = element "time" 1511 | 1512 | time_ 1513 | :: forall channel context i o 1514 | . Array (SDOM channel context i o) 1515 | -> SDOM channel context i o 1516 | time_ = element_ "time" 1517 | 1518 | title 1519 | :: forall channel context i o 1520 | . Array (Attr context i) 1521 | -> Array (Handler context (Either channel (i -> o))) 1522 | -> Array (SDOM channel context i o) 1523 | -> SDOM channel context i o 1524 | title = element "title" 1525 | 1526 | title_ 1527 | :: forall channel context i o 1528 | . Array (SDOM channel context i o) 1529 | -> SDOM channel context i o 1530 | title_ = element_ "title" 1531 | 1532 | tr 1533 | :: forall channel context i o 1534 | . Array (Attr context i) 1535 | -> Array (Handler context (Either channel (i -> o))) 1536 | -> Array (SDOM channel context i o) 1537 | -> SDOM channel context i o 1538 | tr = element "tr" 1539 | 1540 | tr_ 1541 | :: forall channel context i o 1542 | . Array (SDOM channel context i o) 1543 | -> SDOM channel context i o 1544 | tr_ = element_ "tr" 1545 | 1546 | track 1547 | :: forall channel context i o 1548 | . Array (Attr context i) 1549 | -> Array (Handler context (Either channel (i -> o))) 1550 | -> Array (SDOM channel context i o) 1551 | -> SDOM channel context i o 1552 | track = element "track" 1553 | 1554 | track_ 1555 | :: forall channel context i o 1556 | . Array (SDOM channel context i o) 1557 | -> SDOM channel context i o 1558 | track_ = element_ "track" 1559 | 1560 | tt 1561 | :: forall channel context i o 1562 | . Array (Attr context i) 1563 | -> Array (Handler context (Either channel (i -> o))) 1564 | -> Array (SDOM channel context i o) 1565 | -> SDOM channel context i o 1566 | tt = element "tt" 1567 | 1568 | tt_ 1569 | :: forall channel context i o 1570 | . Array (SDOM channel context i o) 1571 | -> SDOM channel context i o 1572 | tt_ = element_ "tch" 1573 | 1574 | u 1575 | :: forall channel context i o 1576 | . Array (Attr context i) 1577 | -> Array (Handler context (Either channel (i -> o))) 1578 | -> Array (SDOM channel context i o) 1579 | -> SDOM channel context i o 1580 | u = element "u" 1581 | 1582 | u_ 1583 | :: forall channel context i o 1584 | . Array (SDOM channel context i o) 1585 | -> SDOM channel context i o 1586 | u_ = element_ "u" 1587 | 1588 | ul 1589 | :: forall channel context i o 1590 | . Array (Attr context i) 1591 | -> Array (Handler context (Either channel (i -> o))) 1592 | -> Array (SDOM channel context i o) 1593 | -> SDOM channel context i o 1594 | ul = element "ul" 1595 | 1596 | ul_ 1597 | :: forall channel context i o 1598 | . Array (SDOM channel context i o) 1599 | -> SDOM channel context i o 1600 | ul_ = element_ "ul" 1601 | 1602 | var 1603 | :: forall channel context i o 1604 | . Array (Attr context i) 1605 | -> Array (Handler context (Either channel (i -> o))) 1606 | -> Array (SDOM channel context i o) 1607 | -> SDOM channel context i o 1608 | var = element "var" 1609 | 1610 | var_ 1611 | :: forall channel context i o 1612 | . Array (SDOM channel context i o) 1613 | -> SDOM channel context i o 1614 | var_ = element_ "var" 1615 | 1616 | video 1617 | :: forall channel context i o 1618 | . Array (Attr context i) 1619 | -> Array (Handler context (Either channel (i -> o))) 1620 | -> Array (SDOM channel context i o) 1621 | -> SDOM channel context i o 1622 | video = element "video" 1623 | 1624 | video_ 1625 | :: forall channel context i o 1626 | . Array (SDOM channel context i o) 1627 | -> SDOM channel context i o 1628 | video_ = element_ "video" 1629 | 1630 | wbr 1631 | :: forall channel context i o 1632 | . Array (Attr context i) 1633 | -> Array (Handler context (Either channel (i -> o))) 1634 | -> Array (SDOM channel context i o) 1635 | -> SDOM channel context i o 1636 | wbr = element "wbr" 1637 | 1638 | wbr_ 1639 | :: forall channel context i o 1640 | . Array (SDOM channel context i o) 1641 | -> SDOM channel context i o 1642 | wbr_ = element_ "wbr" 1643 | --------------------------------------------------------------------------------