├── .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 |
--------------------------------------------------------------------------------