diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,5 @@
+# Revision history for front
+
+## 0.0.0.1 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2019, Andrey Prokopenko
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Andrey Prokopenko nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,1 @@
+# front
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/front.cabal b/front.cabal
new file mode 100644
--- /dev/null
+++ b/front.cabal
@@ -0,0 +1,43 @@
+-- Initial front.cabal generated by cabal init.  For further documentation,
+--  see http://haskell.org/cabal/users-guide/
+
+name:                front
+version:             0.0.0.1
+synopsis:            A reactive frontend web framework
+description:         A reactive frontend web framework. See haskell-front.org for more details.
+homepage:            haskell-front.org
+license:             BSD3
+license-file:        LICENSE
+author:              Andrey Prokopenko
+maintainer:          persiantiger@yandex.ru
+-- copyright:
+category:            Web
+build-type:          Simple
+extra-source-files:  ChangeLog.md, README.md
+cabal-version:       >=1.10
+
+source-repository head
+  type: git
+  location: https://github.com/swamp-agr/front.git  
+                     
+library
+  exposed-modules:     Text.Blaze.Front
+                     , Text.Blaze.Front.Svg
+                     , Text.Blaze.Front.Internal
+                     , Text.Blaze.Front.Html5
+                     , Text.Blaze.Front.Svg.Attributes
+                     , Text.Blaze.Front.Html5.Attributes
+                     , Text.Blaze.Front.Event
+                     , Text.Blaze.Front.Renderer
+                     -- shared
+                     , Bridge
+  -- other-modules:
+  other-extensions:    FlexibleInstances, TypeSynonymInstances, OverloadedStrings, GeneralizedNewtypeDeriving, Rank2Types, ExistentialQuantification, DeriveDataTypeable, MultiParamTypeClasses, DeriveFunctor, FunctionalDependencies, ScopedTypeVariables
+  build-depends:       base >=4.11 && <4.12
+                     , text >=1.2 && <1.3
+                     , bytestring >=0.10 && <0.11
+                     , blaze-markup >=0.8 && <0.10
+                     , blaze-html >=0.9 && <0.10
+                     , fay >= 0.24.0.2
+  hs-source-dirs:      src, shared
+  default-language:    Haskell2010
diff --git a/shared/Bridge.hs b/shared/Bridge.hs
new file mode 100644
--- /dev/null
+++ b/shared/Bridge.hs
@@ -0,0 +1,64 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE CPP #-}
+module Bridge where
+
+import Prelude
+
+import Data.Data
+
+-- | One specific and incomplete specifications of event-handlers geared
+-- towards their use with JS.
+data EventHandler a
+    = OnKeyDown   !a
+    | OnKeyUp     !a
+    | OnKeyPress  !a
+    | OnFocus !a
+    | OnBlur  !a
+    | OnValueChange    !a
+    | OnCheckedChange  !a
+    | OnSelectedChange !a
+    | OnSubmit         !a
+    | OnClick       !a
+    | OnDoubleClick !a
+    | OnMouseDown   !a
+    | OnMouseUp     !a
+    | OnMouseMove   !a
+    | OnMouseEnter  !a
+    | OnMouseLeave  !a
+    | OnMouseOver   !a
+    | OnMouseOut    !a
+    | OnScroll !a
+    | OnWheel  !a
+
+    -- TODO: Implement these
+    -- OnCopy  ([File] -> IO a)
+    -- OnCut   ([File] -> IO a)
+    -- OnPaste ([File] -> IO a)
+
+    -- TODO: Implement these.
+    -- OnDrag      ([File] -> IO a)
+    -- OnDragEnd   ([File] -> IO a)
+    -- OnDragEnter ([File] -> IO a)
+    -- OnDragExit  ([File] -> IO a)
+    -- OnDragLeave ([File] -> IO a)
+    -- OnDragOver  ([File] -> IO a)
+    -- OnDragStart ([File] -> IO a)
+    -- OnDrop      ([File] -> IO a)
+
+    -- TODO: add more events.
+
+#ifdef FAY
+             deriving (Typeable, Data)
+#else
+             deriving (Functor, Typeable, Data)
+#endif
+
+data CallbackAction a = CallbackAction (EventHandler a)
+#ifdef FAY
+  deriving (Typeable, Data)
+#else
+  deriving (Typeable, Data)
+#endif
diff --git a/src/Text/Blaze/Front.hs b/src/Text/Blaze/Front.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Blaze/Front.hs
@@ -0,0 +1,238 @@
+{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-}
+-- | BlazeMarkup is a markup combinator library. It provides a way to embed
+-- markup languages like HTML and SVG in Haskell in an efficient and convenient
+-- way, with a light-weight syntax.
+--
+-- To use the library, one needs to import a set of combinators. For example,
+-- you can use HTML 4 Strict from BlazeHtml package.
+--
+-- > {-# LANGUAGE OverloadedStrings #-}
+-- > import Prelude hiding (head, id, div)
+-- > import Text.Blaze.Html4.Strict hiding (map)
+-- > import Text.Blaze.Html4.Strict.Attributes hiding (title)
+--
+-- To render the page later on, you need a so called Renderer. The recommended
+-- renderer is an UTF-8 renderer which produces a lazy bytestring.
+--
+-- > import Text.Blaze.Renderer.Utf8 (renderMarkup)
+--
+-- Now, you can describe pages using the imported combinators.
+--
+-- > page1 :: Markup
+-- > page1 = html $ do
+-- >     head $ do
+-- >         title "Introduction page."
+-- >         link ! rel "stylesheet" ! type_ "text/css" ! href "screen.css"
+-- >     body $ do
+-- >         div ! id "header" $ "Syntax"
+-- >         p "This is an example of BlazeMarkup syntax."
+-- >         ul $ mapM_ (li . toMarkup . show) [1, 2, 3]
+--
+-- The resulting HTML can now be extracted using:
+--
+-- > renderMarkup page1
+--
+module Text.Blaze.Front
+    (
+      -- * Important types.
+      Markup
+    , Tag
+    , Attribute
+    , AttributeValue
+
+      -- * Creating attributes.
+    , dataAttribute
+    , customAttribute
+
+      -- * Converting values to Markup.
+    , ToMarkup (..)
+    , unsafeByteString
+    , unsafeLazyByteString
+
+      -- * Creating tags.
+    , textTag
+    , stringTag
+
+      -- * Converting values to attribute values.
+    , ToValue (..)
+    , unsafeByteStringValue
+    , unsafeLazyByteStringValue
+
+      -- * Setting attributes
+    , (!)
+    , (!?)
+
+      -- * Modifiying Markup trees
+    , contents
+    ) where
+
+import Data.Int (Int32, Int64)
+import Data.Word (Word, Word32, Word64)
+
+import Data.Text (Text)
+import qualified Data.Text.Lazy as LT
+
+import Prelude
+import Text.Blaze.Front.Internal
+
+-- | Class allowing us to use a single function for Markup values
+--
+class ToMarkup a where
+    -- | Convert a value to Markup.
+    --
+    toMarkup :: a -> Markup ev
+
+    -- | Convert a value to Markup without escaping
+    --
+    preEscapedToMarkup :: a -> Markup ev
+    preEscapedToMarkup = toMarkup
+    {-# INLINE preEscapedToMarkup #-}
+
+-- instance ToMarkup (Markup ev) where
+--     toMarkup = id
+--     {-# INLINE toMarkup #-}
+--
+-- instance ToMarkup [Markup ev] where
+--     toMarkup = mconcat
+--     {-# INLINE toMarkup #-}
+
+instance ToMarkup Text where
+    toMarkup = text
+    {-# INLINE toMarkup #-}
+    preEscapedToMarkup = preEscapedText
+    {-# INLINE preEscapedToMarkup #-}
+
+instance ToMarkup LT.Text where
+    toMarkup = lazyText
+    {-# INLINE toMarkup #-}
+    preEscapedToMarkup = preEscapedLazyText
+    {-# INLINE preEscapedToMarkup #-}
+
+instance ToMarkup String where
+    toMarkup = string
+    {-# INLINE toMarkup #-}
+    preEscapedToMarkup = preEscapedString
+    {-# INLINE preEscapedToMarkup #-}
+
+instance ToMarkup Int where
+    toMarkup = string . show
+    {-# INLINE toMarkup #-}
+
+instance ToMarkup Int32 where
+    toMarkup = string . show
+    {-# INLINE toMarkup #-}
+
+instance ToMarkup Int64 where
+    toMarkup = string . show
+    {-# INLINE toMarkup #-}
+
+instance ToMarkup Char where
+    toMarkup = string . return
+    {-# INLINE toMarkup #-}
+
+instance ToMarkup Bool where
+    toMarkup = string . show
+    {-# INLINE toMarkup #-}
+
+instance ToMarkup Integer where
+    toMarkup = string . show
+    {-# INLINE toMarkup #-}
+
+instance ToMarkup Float where
+    toMarkup = string . show
+    {-# INLINE toMarkup #-}
+
+instance ToMarkup Double where
+    toMarkup = string . show
+    {-# INLINE toMarkup #-}
+
+instance ToMarkup Word where
+    toMarkup = string . show
+    {-# INLINE toMarkup #-}
+
+instance ToMarkup Word32 where
+    toMarkup = string . show
+    {-# INLINE toMarkup #-}
+
+instance ToMarkup Word64 where
+    toMarkup = string . show
+    {-# INLINE toMarkup #-}
+
+-- | Class allowing us to use a single function for attribute values
+--
+class ToValue a where
+    -- | Convert a value to an attribute value
+    --
+    toValue :: a -> AttributeValue
+
+    -- | Convert a value to an attribute value without escaping
+    --
+    preEscapedToValue :: a -> AttributeValue
+    preEscapedToValue = toValue
+    {-# INLINE preEscapedToValue #-}
+
+instance ToValue AttributeValue where
+    toValue = id
+    {-# INLINE toValue #-}
+
+instance ToValue Text where
+    toValue = textValue
+    {-# INLINE toValue #-}
+    preEscapedToValue = preEscapedTextValue
+    {-# INLINE preEscapedToValue #-}
+
+instance ToValue LT.Text where
+    toValue = lazyTextValue
+    {-# INLINE toValue #-}
+    preEscapedToValue = preEscapedLazyTextValue
+    {-# INLINE preEscapedToValue #-}
+
+instance ToValue String where
+    toValue = stringValue
+    {-# INLINE toValue #-}
+    preEscapedToValue = preEscapedStringValue
+    {-# INLINE preEscapedToValue #-}
+
+instance ToValue Int where
+    toValue = stringValue . show
+    {-# INLINE toValue #-}
+
+instance ToValue Int32 where
+    toValue = stringValue . show
+    {-# INLINE toValue #-}
+
+instance ToValue Int64 where
+    toValue = stringValue . show
+    {-# INLINE toValue #-}
+
+instance ToValue Char where
+    toValue = stringValue . return
+    {-# INLINE toValue #-}
+
+instance ToValue Bool where
+    toValue = stringValue . show
+    {-# INLINE toValue #-}
+
+instance ToValue Integer where
+    toValue = stringValue . show
+    {-# INLINE toValue #-}
+
+instance ToValue Float where
+    toValue = stringValue . show
+    {-# INLINE toValue #-}
+
+instance ToValue Double where
+    toValue = stringValue . show
+    {-# INLINE toValue #-}
+
+instance ToValue Word where
+    toValue = stringValue . show
+    {-# INLINE toValue #-}
+
+instance ToValue Word32 where
+    toValue = stringValue . show
+    {-# INLINE toValue #-}
+
+instance ToValue Word64 where
+    toValue = stringValue . show
+    {-# INLINE toValue #-}
diff --git a/src/Text/Blaze/Front/Event.hs b/src/Text/Blaze/Front/Event.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Blaze/Front/Event.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DeriveFunctor #-}
+
+module Text.Blaze.Front.Event
+    ( -- * Event handling
+      mapActions
+
+      -- ** Keyboard events
+    , onKeyDown
+    , onKeyUp  
+    , onKeyPress
+
+      -- ** Focus events
+    , onFocus   
+    , onBlur    
+
+      -- ** Form events
+    , onValueChange
+    , onCheckedChange
+    , onSelectedChange
+    , onSubmit        
+
+      -- ** Mouse events
+    , onClick         
+    , onDoubleClick   
+    , onMouseDown     
+    , onMouseUp       
+    , onMouseMove     
+    , onMouseEnter    
+    , onMouseLeave    
+    , onMouseOver     
+    , onMouseOut      
+
+      -- ** UI Events
+    , onScroll        
+
+      -- ** Wheel Events
+    , onWheel         
+
+    ) where
+
+import Text.Blaze.Front.Internal       (MarkupM(..), Attribute(..), Markup)
+import Prelude
+
+import Bridge
+
+-- | Modify all event handlers attached to a 'Markup' tree so that the given
+-- function is applied to the return values of their callbacks.
+mapActions :: (act -> act') -> Markup act -> Markup act'
+mapActions = MapActions
+
+-- Keyboard events
+-------------------------------------------------------------------------------
+
+-- | The user has pressed a physical key while the target element was focused.
+onKeyDown :: act -> Attribute act
+onKeyDown = onEvent . OnKeyDown 
+
+-- | The user has released a phyiscal key while the target element was focused.
+onKeyUp :: act -> Attribute act
+onKeyUp = onEvent . OnKeyUp
+
+-- | The user has input some ASCII character while the target element was
+onKeyPress :: act -> Attribute act
+onKeyPress = onEvent . OnKeyPress
+
+-- Focus events
+-------------------------------------------------------------------------------
+
+-- | The focus has moved to the target element.
+onFocus :: act -> Attribute act
+onFocus = onEvent . OnFocus
+
+-- | The focus has left the target element.
+onBlur :: act -> Attribute act
+onBlur = onEvent . OnBlur
+
+-- Form events
+-------------------------------------------------------------------------------
+
+-- | The 'value' property of the target element has changed. The new value is
+-- passed as a parameter to the callback. This handler is supported for
+-- <input>, <textarea>, and <select> elements.
+onValueChange :: act -> Attribute act
+onValueChange = onEvent . OnValueChange
+
+-- | The 'checked' property of the target element has changed. This handler is
+-- supported for <input> elements of type 'checkbox' or 'radio'.
+onCheckedChange :: act -> Attribute act
+onCheckedChange = onEvent . OnCheckedChange
+
+-- | The 'selected' property of the the target element has changed. This
+-- handler is supported for <option> elements.
+onSelectedChange :: act -> Attribute act
+onSelectedChange = onEvent . OnSelectedChange
+
+-- | The user has submitted the target form. This handler is supported for
+-- <form> elements.
+onSubmit :: act -> Attribute act
+onSubmit = onEvent . OnSubmit
+
+-- Mouse events
+-------------------------------------------------------------------------------
+
+-- | A simplified version of 'onClick' which watches for the 'LeftButton' only
+-- and ignores the cursor position.
+onClick :: act -> Attribute act
+onClick = onEvent . OnClick
+
+-- | A simplified version of 'onDoubleClick' which watches for the 'LeftButton'
+-- only and ignores the cursor position.
+onDoubleClick :: act -> Attribute act
+onDoubleClick = onEvent . OnDoubleClick
+
+-- | A simplified version of 'onMouseDown' which watches for the 'LeftButton'
+-- only and ignores the cursor position.
+onMouseDown :: act -> Attribute act
+onMouseDown = onEvent . OnMouseDown
+
+-- | A simplified version of 'onMouseUp' which watches for the 'LeftButton'
+-- only and ignores the cursor position.
+onMouseUp :: act -> Attribute act
+onMouseUp = onEvent . OnMouseUp
+
+-- | The mouse cursor has moved while positioned over the target element. The
+-- mouse position at the time the event was fired is passed as a parameter to
+-- the callback.
+onMouseMove :: act -> Attribute act
+onMouseMove = onEvent . OnMouseMove
+
+-- | The mouse cursor has entered the region occupied by the target element.
+-- The mouse position at the time the event was fired is passed as a parameter
+-- to the callback.
+onMouseEnter :: act -> Attribute act
+onMouseEnter = onEvent . OnMouseEnter
+
+-- | The mouse cursor has left the region occupied by the target element. The
+-- mouse position at the time the event was fired is passed as a parameter to
+-- the callback.
+onMouseLeave :: act -> Attribute act
+onMouseLeave = onEvent . OnMouseLeave
+
+-- | Like MouseEnter, but handles bubbling differently.
+onMouseOver :: act -> Attribute act
+onMouseOver = onEvent . OnMouseOver
+
+-- | Like MouseLeave, but handles bubbling differently.
+onMouseOut :: act -> Attribute act
+onMouseOut = onEvent . OnMouseOut
+
+-- UI events
+-------------------------------------------------------------------------------
+
+-- | The the scroll-position of the page has changed. The amount by which it
+-- has changed (in lines) is passed as a parameter to the callback.
+onScroll :: act -> Attribute act
+onScroll = onEvent . OnScroll
+
+-- Wheel events
+-------------------------------------------------------------------------------
+
+-- | The user has moved the scroll-wheel. The amount by which the scroll
+-- position of an infinitely large page is affected is passed as a parameter to
+-- the callback.
+onWheel :: act -> Attribute act
+onWheel = onEvent . OnWheel
+
+
+-------------------------------------------------------------------------------
+-- Internal
+-------------------------------------------------------------------------------
+
+-- | Register an event handler.
+onEvent :: EventHandler act -> Attribute act
+onEvent eh = Attribute (OnEvent eh)
+{-# INLINE onEvent #-}
diff --git a/src/Text/Blaze/Front/Html5.hs b/src/Text/Blaze/Front/Html5.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Blaze/Front/Html5.hs
@@ -0,0 +1,2084 @@
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:69
+--
+{-# LANGUAGE OverloadedStrings #-}
+-- | This module exports HTML combinators used to create documents.
+--
+module Text.Blaze.Front.Html5
+    ( module Text.Blaze.Front
+    , Html
+    , toHtml
+    , preEscapedToHtml
+
+    , docType
+    , docTypeHtml
+    , a
+    , abbr
+    , address
+    , area
+    , article
+    , aside
+    , audio
+    , b
+    , base
+    , bdo
+    , blockquote
+    , body
+    , br
+    , button
+    , canvas
+    , caption
+    , cite
+    , code
+    , col
+    , colgroup
+    , command
+    , datalist
+    , dd
+    , del
+    , details
+    , dfn
+    , div
+    , dl
+    , dt
+    , em
+    , embed
+    , fieldset
+    , figcaption
+    , figure
+    , footer
+    , form
+    , h1
+    , h2
+    , h3
+    , h4
+    , h5
+    , h6
+    , head
+    , header
+    , hgroup
+    , hr
+    , html
+    , i
+    , iframe
+    , img
+    , input
+    , ins
+    , kbd
+    , keygen
+    , label
+    , legend
+    , li
+    , link
+    , map
+    , mark
+    , menu
+    , menuitem
+    , meta
+    , meter
+    , nav
+    , noscript
+    , object
+    , ol
+    , optgroup
+    , option
+    , output
+    , p
+    , param
+    , pre
+    , progress
+    , q
+    , rp
+    , rt
+    , ruby
+    , samp
+    , script
+    , section
+    , select
+    , small
+    , source
+    , span
+    , strong
+    , style
+    , sub
+    , summary
+    , sup
+    , svg
+    , table
+    , tbody
+    , td
+    , textarea
+    , tfoot
+    , th
+    , thead
+    , time
+    , title
+    , tr
+    , track
+    , ul
+    , var
+    , video
+    , wbr
+    ) where
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:77
+--
+import Prelude ((>>), (.))
+
+import Text.Blaze.Front
+import Text.Blaze.Front.Internal
+import Text.Blaze.Front.Svg (Svg)
+
+type Html ev = Markup ev
+
+toHtml :: ToMarkup a => a -> Html ev
+toHtml = toMarkup
+
+preEscapedToHtml :: ToMarkup a => a -> Html ev
+preEscapedToHtml = preEscapedToMarkup
+
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:156
+--
+-- | Combinator for the document type. This should be placed at the top
+-- of every HTML page.
+--
+-- Example:
+--
+-- > docType
+--
+-- Result:
+--
+-- > <!DOCTYPE HTML>
+--
+docType :: Html ev  -- ^ The document type HTML.
+docType = preEscapedText "<!DOCTYPE HTML>\n"
+{-# INLINE docType #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:177
+--
+-- | Combinator for the @\<html>@ element. This combinator will also
+-- insert the correct doctype.
+--
+-- Example:
+--
+-- > docTypeHtml $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <!DOCTYPE HTML>
+-- > <html><span>foo</span></html>
+--
+docTypeHtml :: Html ev  -- ^ Inner HTML.
+            -> Html ev  -- ^ Resulting HTML.
+docTypeHtml inner = docType >> html inner
+{-# INLINE docTypeHtml #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<a>@ element.
+--
+-- Example:
+--
+-- > a $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <a><span>foo</span></a>
+--
+a :: Html ev  -- ^ Inner HTML.
+  -> Html ev  -- ^ Resulting HTML.
+a = Parent "a" "<a" "</a>"
+{-# INLINE a #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<abbr>@ element.
+--
+-- Example:
+--
+-- > abbr $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <abbr><span>foo</span></abbr>
+--
+abbr :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+abbr = Parent "abbr" "<abbr" "</abbr>"
+{-# INLINE abbr #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<address>@ element.
+--
+-- Example:
+--
+-- > address $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <address><span>foo</span></address>
+--
+address :: Html ev  -- ^ Inner HTML.
+        -> Html ev  -- ^ Resulting HTML.
+address = Parent "address" "<address" "</address>"
+{-# INLINE address #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<area />@ element.
+--
+-- Example:
+--
+-- > area
+--
+-- Result:
+--
+-- > <area />
+--
+area :: Html ev  -- ^ Resulting HTML.
+area = Leaf "area" "<area" ">"
+{-# INLINE area #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<article>@ element.
+--
+-- Example:
+--
+-- > article $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <article><span>foo</span></article>
+--
+article :: Html ev  -- ^ Inner HTML.
+        -> Html ev  -- ^ Resulting HTML.
+article = Parent "article" "<article" "</article>"
+{-# INLINE article #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<aside>@ element.
+--
+-- Example:
+--
+-- > aside $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <aside><span>foo</span></aside>
+--
+aside :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+aside = Parent "aside" "<aside" "</aside>"
+{-# INLINE aside #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<audio>@ element.
+--
+-- Example:
+--
+-- > audio $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <audio><span>foo</span></audio>
+--
+audio :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+audio = Parent "audio" "<audio" "</audio>"
+{-# INLINE audio #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<b>@ element.
+--
+-- Example:
+--
+-- > b $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <b><span>foo</span></b>
+--
+b :: Html ev  -- ^ Inner HTML.
+  -> Html ev  -- ^ Resulting HTML.
+b = Parent "b" "<b" "</b>"
+{-# INLINE b #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<base />@ element.
+--
+-- Example:
+--
+-- > base
+--
+-- Result:
+--
+-- > <base />
+--
+base :: Html ev  -- ^ Resulting HTML.
+base = Leaf "base" "<base" ">"
+{-# INLINE base #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<bdo>@ element.
+--
+-- Example:
+--
+-- > bdo $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <bdo><span>foo</span></bdo>
+--
+bdo :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+bdo = Parent "bdo" "<bdo" "</bdo>"
+{-# INLINE bdo #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<blockquote>@ element.
+--
+-- Example:
+--
+-- > blockquote $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <blockquote><span>foo</span></blockquote>
+--
+blockquote :: Html ev  -- ^ Inner HTML.
+           -> Html ev  -- ^ Resulting HTML.
+blockquote = Parent "blockquote" "<blockquote" "</blockquote>"
+{-# INLINE blockquote #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<body>@ element.
+--
+-- Example:
+--
+-- > body $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <body><span>foo</span></body>
+--
+body :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+body = Parent "body" "<body" "</body>"
+{-# INLINE body #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<br />@ element.
+--
+-- Example:
+--
+-- > br
+--
+-- Result:
+--
+-- > <br />
+--
+br :: Html ev  -- ^ Resulting HTML.
+br = Leaf "br" "<br" ">"
+{-# INLINE br #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<button>@ element.
+--
+-- Example:
+--
+-- > button $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <button><span>foo</span></button>
+--
+button :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+button = Parent "button" "<button" "</button>"
+{-# INLINE button #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<canvas>@ element.
+--
+-- Example:
+--
+-- > canvas $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <canvas><span>foo</span></canvas>
+--
+canvas :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+canvas = Parent "canvas" "<canvas" "</canvas>"
+{-# INLINE canvas #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<caption>@ element.
+--
+-- Example:
+--
+-- > caption $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <caption><span>foo</span></caption>
+--
+caption :: Html ev  -- ^ Inner HTML.
+        -> Html ev  -- ^ Resulting HTML.
+caption = Parent "caption" "<caption" "</caption>"
+{-# INLINE caption #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<cite>@ element.
+--
+-- Example:
+--
+-- > cite $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <cite><span>foo</span></cite>
+--
+cite :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+cite = Parent "cite" "<cite" "</cite>"
+{-# INLINE cite #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<code>@ element.
+--
+-- Example:
+--
+-- > code $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <code><span>foo</span></code>
+--
+code :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+code = Parent "code" "<code" "</code>"
+{-# INLINE code #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<col />@ element.
+--
+-- Example:
+--
+-- > col
+--
+-- Result:
+--
+-- > <col />
+--
+col :: Html ev  -- ^ Resulting HTML.
+col = Leaf "col" "<col" ">"
+{-# INLINE col #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<colgroup>@ element.
+--
+-- Example:
+--
+-- > colgroup $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <colgroup><span>foo</span></colgroup>
+--
+colgroup :: Html ev  -- ^ Inner HTML.
+         -> Html ev  -- ^ Resulting HTML.
+colgroup = Parent "colgroup" "<colgroup" "</colgroup>"
+{-# INLINE colgroup #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<command>@ element.
+--
+-- Example:
+--
+-- > command $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <command><span>foo</span></command>
+--
+command :: Html ev  -- ^ Inner HTML.
+        -> Html ev  -- ^ Resulting HTML.
+command = Parent "command" "<command" "</command>"
+{-# INLINE command #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<datalist>@ element.
+--
+-- Example:
+--
+-- > datalist $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <datalist><span>foo</span></datalist>
+--
+datalist :: Html ev  -- ^ Inner HTML.
+         -> Html ev  -- ^ Resulting HTML.
+datalist = Parent "datalist" "<datalist" "</datalist>"
+{-# INLINE datalist #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<dd>@ element.
+--
+-- Example:
+--
+-- > dd $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <dd><span>foo</span></dd>
+--
+dd :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+dd = Parent "dd" "<dd" "</dd>"
+{-# INLINE dd #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<del>@ element.
+--
+-- Example:
+--
+-- > del $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <del><span>foo</span></del>
+--
+del :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+del = Parent "del" "<del" "</del>"
+{-# INLINE del #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<details>@ element.
+--
+-- Example:
+--
+-- > details $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <details><span>foo</span></details>
+--
+details :: Html ev  -- ^ Inner HTML.
+        -> Html ev  -- ^ Resulting HTML.
+details = Parent "details" "<details" "</details>"
+{-# INLINE details #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<dfn>@ element.
+--
+-- Example:
+--
+-- > dfn $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <dfn><span>foo</span></dfn>
+--
+dfn :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+dfn = Parent "dfn" "<dfn" "</dfn>"
+{-# INLINE dfn #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<div>@ element.
+--
+-- Example:
+--
+-- > div $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <div><span>foo</span></div>
+--
+div :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+div = Parent "div" "<div" "</div>"
+{-# INLINE div #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<dl>@ element.
+--
+-- Example:
+--
+-- > dl $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <dl><span>foo</span></dl>
+--
+dl :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+dl = Parent "dl" "<dl" "</dl>"
+{-# INLINE dl #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<dt>@ element.
+--
+-- Example:
+--
+-- > dt $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <dt><span>foo</span></dt>
+--
+dt :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+dt = Parent "dt" "<dt" "</dt>"
+{-# INLINE dt #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<em>@ element.
+--
+-- Example:
+--
+-- > em $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <em><span>foo</span></em>
+--
+em :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+em = Parent "em" "<em" "</em>"
+{-# INLINE em #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<embed />@ element.
+--
+-- Example:
+--
+-- > embed
+--
+-- Result:
+--
+-- > <embed />
+--
+embed :: Html ev  -- ^ Resulting HTML.
+embed = Leaf "embed" "<embed" ">"
+{-# INLINE embed #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<fieldset>@ element.
+--
+-- Example:
+--
+-- > fieldset $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <fieldset><span>foo</span></fieldset>
+--
+fieldset :: Html ev  -- ^ Inner HTML.
+         -> Html ev  -- ^ Resulting HTML.
+fieldset = Parent "fieldset" "<fieldset" "</fieldset>"
+{-# INLINE fieldset #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<figcaption>@ element.
+--
+-- Example:
+--
+-- > figcaption $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <figcaption><span>foo</span></figcaption>
+--
+figcaption :: Html ev  -- ^ Inner HTML.
+           -> Html ev  -- ^ Resulting HTML.
+figcaption = Parent "figcaption" "<figcaption" "</figcaption>"
+{-# INLINE figcaption #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<figure>@ element.
+--
+-- Example:
+--
+-- > figure $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <figure><span>foo</span></figure>
+--
+figure :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+figure = Parent "figure" "<figure" "</figure>"
+{-# INLINE figure #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<footer>@ element.
+--
+-- Example:
+--
+-- > footer $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <footer><span>foo</span></footer>
+--
+footer :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+footer = Parent "footer" "<footer" "</footer>"
+{-# INLINE footer #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<form>@ element.
+--
+-- Example:
+--
+-- > form $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <form><span>foo</span></form>
+--
+form :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+form = Parent "form" "<form" "</form>"
+{-# INLINE form #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<h1>@ element.
+--
+-- Example:
+--
+-- > h1 $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <h1><span>foo</span></h1>
+--
+h1 :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+h1 = Parent "h1" "<h1" "</h1>"
+{-# INLINE h1 #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<h2>@ element.
+--
+-- Example:
+--
+-- > h2 $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <h2><span>foo</span></h2>
+--
+h2 :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+h2 = Parent "h2" "<h2" "</h2>"
+{-# INLINE h2 #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<h3>@ element.
+--
+-- Example:
+--
+-- > h3 $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <h3><span>foo</span></h3>
+--
+h3 :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+h3 = Parent "h3" "<h3" "</h3>"
+{-# INLINE h3 #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<h4>@ element.
+--
+-- Example:
+--
+-- > h4 $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <h4><span>foo</span></h4>
+--
+h4 :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+h4 = Parent "h4" "<h4" "</h4>"
+{-# INLINE h4 #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<h5>@ element.
+--
+-- Example:
+--
+-- > h5 $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <h5><span>foo</span></h5>
+--
+h5 :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+h5 = Parent "h5" "<h5" "</h5>"
+{-# INLINE h5 #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<h6>@ element.
+--
+-- Example:
+--
+-- > h6 $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <h6><span>foo</span></h6>
+--
+h6 :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+h6 = Parent "h6" "<h6" "</h6>"
+{-# INLINE h6 #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<head>@ element.
+--
+-- Example:
+--
+-- > head $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <head><span>foo</span></head>
+--
+head :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+head = Parent "head" "<head" "</head>"
+{-# INLINE head #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<header>@ element.
+--
+-- Example:
+--
+-- > header $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <header><span>foo</span></header>
+--
+header :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+header = Parent "header" "<header" "</header>"
+{-# INLINE header #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<hgroup>@ element.
+--
+-- Example:
+--
+-- > hgroup $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <hgroup><span>foo</span></hgroup>
+--
+hgroup :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+hgroup = Parent "hgroup" "<hgroup" "</hgroup>"
+{-# INLINE hgroup #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<hr />@ element.
+--
+-- Example:
+--
+-- > hr
+--
+-- Result:
+--
+-- > <hr />
+--
+hr :: Html ev  -- ^ Resulting HTML.
+hr = Leaf "hr" "<hr" ">"
+{-# INLINE hr #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<html>@ element.
+--
+-- Example:
+--
+-- > html $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <html><span>foo</span></html>
+--
+html :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+html = Parent "html" "<html" "</html>"
+{-# INLINE html #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<i>@ element.
+--
+-- Example:
+--
+-- > i $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <i><span>foo</span></i>
+--
+i :: Html ev  -- ^ Inner HTML.
+  -> Html ev  -- ^ Resulting HTML.
+i = Parent "i" "<i" "</i>"
+{-# INLINE i #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<iframe>@ element.
+--
+-- Example:
+--
+-- > iframe $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <iframe><span>foo</span></iframe>
+--
+iframe :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+iframe = Parent "iframe" "<iframe" "</iframe>"
+{-# INLINE iframe #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<img />@ element.
+--
+-- Example:
+--
+-- > img
+--
+-- Result:
+--
+-- > <img />
+--
+img :: Html ev  -- ^ Resulting HTML.
+img = Leaf "img" "<img" ">"
+{-# INLINE img #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<input />@ element.
+--
+-- Example:
+--
+-- > input
+--
+-- Result:
+--
+-- > <input />
+--
+input :: Html ev  -- ^ Resulting HTML.
+input = Leaf "input" "<input" ">"
+{-# INLINE input #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<ins>@ element.
+--
+-- Example:
+--
+-- > ins $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <ins><span>foo</span></ins>
+--
+ins :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+ins = Parent "ins" "<ins" "</ins>"
+{-# INLINE ins #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<kbd>@ element.
+--
+-- Example:
+--
+-- > kbd $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <kbd><span>foo</span></kbd>
+--
+kbd :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+kbd = Parent "kbd" "<kbd" "</kbd>"
+{-# INLINE kbd #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<keygen />@ element.
+--
+-- Example:
+--
+-- > keygen
+--
+-- Result:
+--
+-- > <keygen />
+--
+keygen :: Html ev  -- ^ Resulting HTML.
+keygen = Leaf "keygen" "<keygen" ">"
+{-# INLINE keygen #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<label>@ element.
+--
+-- Example:
+--
+-- > label $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <label><span>foo</span></label>
+--
+label :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+label = Parent "label" "<label" "</label>"
+{-# INLINE label #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<legend>@ element.
+--
+-- Example:
+--
+-- > legend $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <legend><span>foo</span></legend>
+--
+legend :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+legend = Parent "legend" "<legend" "</legend>"
+{-# INLINE legend #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<li>@ element.
+--
+-- Example:
+--
+-- > li $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <li><span>foo</span></li>
+--
+li :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+li = Parent "li" "<li" "</li>"
+{-# INLINE li #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<link />@ element.
+--
+-- Example:
+--
+-- > link
+--
+-- Result:
+--
+-- > <link />
+--
+link :: Html ev  -- ^ Resulting HTML.
+link = Leaf "link" "<link" ">"
+{-# INLINE link #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<map>@ element.
+--
+-- Example:
+--
+-- > map $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <map><span>foo</span></map>
+--
+map :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+map = Parent "map" "<map" "</map>"
+{-# INLINE map #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<mark>@ element.
+--
+-- Example:
+--
+-- > mark $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <mark><span>foo</span></mark>
+--
+mark :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+mark = Parent "mark" "<mark" "</mark>"
+{-# INLINE mark #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<menu>@ element.
+--
+-- Example:
+--
+-- > menu $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <menu><span>foo</span></menu>
+--
+menu :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+menu = Parent "menu" "<menu" "</menu>"
+{-# INLINE menu #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<menuitem />@ element.
+--
+-- Example:
+--
+-- > menuitem
+--
+-- Result:
+--
+-- > <menuitem />
+--
+menuitem :: Html ev  -- ^ Resulting HTML.
+menuitem = Leaf "menuitem" "<menuitem" ">"
+{-# INLINE menuitem #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<meta />@ element.
+--
+-- Example:
+--
+-- > meta
+--
+-- Result:
+--
+-- > <meta />
+--
+meta :: Html ev  -- ^ Resulting HTML.
+meta = Leaf "meta" "<meta" ">"
+{-# INLINE meta #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<meter>@ element.
+--
+-- Example:
+--
+-- > meter $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <meter><span>foo</span></meter>
+--
+meter :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+meter = Parent "meter" "<meter" "</meter>"
+{-# INLINE meter #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<nav>@ element.
+--
+-- Example:
+--
+-- > nav $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <nav><span>foo</span></nav>
+--
+nav :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+nav = Parent "nav" "<nav" "</nav>"
+{-# INLINE nav #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<noscript>@ element.
+--
+-- Example:
+--
+-- > noscript $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <noscript><span>foo</span></noscript>
+--
+noscript :: Html ev  -- ^ Inner HTML.
+         -> Html ev  -- ^ Resulting HTML.
+noscript = Parent "noscript" "<noscript" "</noscript>"
+{-# INLINE noscript #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<object>@ element.
+--
+-- Example:
+--
+-- > object $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <object><span>foo</span></object>
+--
+object :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+object = Parent "object" "<object" "</object>"
+{-# INLINE object #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<ol>@ element.
+--
+-- Example:
+--
+-- > ol $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <ol><span>foo</span></ol>
+--
+ol :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+ol = Parent "ol" "<ol" "</ol>"
+{-# INLINE ol #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<optgroup>@ element.
+--
+-- Example:
+--
+-- > optgroup $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <optgroup><span>foo</span></optgroup>
+--
+optgroup :: Html ev  -- ^ Inner HTML.
+         -> Html ev  -- ^ Resulting HTML.
+optgroup = Parent "optgroup" "<optgroup" "</optgroup>"
+{-# INLINE optgroup #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<option>@ element.
+--
+-- Example:
+--
+-- > option $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <option><span>foo</span></option>
+--
+option :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+option = Parent "option" "<option" "</option>"
+{-# INLINE option #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<output>@ element.
+--
+-- Example:
+--
+-- > output $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <output><span>foo</span></output>
+--
+output :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+output = Parent "output" "<output" "</output>"
+{-# INLINE output #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<p>@ element.
+--
+-- Example:
+--
+-- > p $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <p><span>foo</span></p>
+--
+p :: Html ev  -- ^ Inner HTML.
+  -> Html ev  -- ^ Resulting HTML.
+p = Parent "p" "<p" "</p>"
+{-# INLINE p #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<param />@ element.
+--
+-- Example:
+--
+-- > param
+--
+-- Result:
+--
+-- > <param />
+--
+param :: Html ev  -- ^ Resulting HTML.
+param = Leaf "param" "<param" ">"
+{-# INLINE param #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<pre>@ element.
+--
+-- Example:
+--
+-- > pre $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <pre><span>foo</span></pre>
+--
+pre :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+pre = Parent "pre" "<pre" "</pre>"
+{-# INLINE pre #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<progress>@ element.
+--
+-- Example:
+--
+-- > progress $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <progress><span>foo</span></progress>
+--
+progress :: Html ev  -- ^ Inner HTML.
+         -> Html ev  -- ^ Resulting HTML.
+progress = Parent "progress" "<progress" "</progress>"
+{-# INLINE progress #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<q>@ element.
+--
+-- Example:
+--
+-- > q $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <q><span>foo</span></q>
+--
+q :: Html ev  -- ^ Inner HTML.
+  -> Html ev  -- ^ Resulting HTML.
+q = Parent "q" "<q" "</q>"
+{-# INLINE q #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<rp>@ element.
+--
+-- Example:
+--
+-- > rp $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <rp><span>foo</span></rp>
+--
+rp :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+rp = Parent "rp" "<rp" "</rp>"
+{-# INLINE rp #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<rt>@ element.
+--
+-- Example:
+--
+-- > rt $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <rt><span>foo</span></rt>
+--
+rt :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+rt = Parent "rt" "<rt" "</rt>"
+{-# INLINE rt #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<ruby>@ element.
+--
+-- Example:
+--
+-- > ruby $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <ruby><span>foo</span></ruby>
+--
+ruby :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+ruby = Parent "ruby" "<ruby" "</ruby>"
+{-# INLINE ruby #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<samp>@ element.
+--
+-- Example:
+--
+-- > samp $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <samp><span>foo</span></samp>
+--
+samp :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+samp = Parent "samp" "<samp" "</samp>"
+{-# INLINE samp #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<script>@ element.
+--
+-- Example:
+--
+-- > script $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <script><span>foo</span></script>
+--
+script :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+script = Parent "script" "<script" "</script>" . external
+{-# INLINE script #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<section>@ element.
+--
+-- Example:
+--
+-- > section $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <section><span>foo</span></section>
+--
+section :: Html ev  -- ^ Inner HTML.
+        -> Html ev  -- ^ Resulting HTML.
+section = Parent "section" "<section" "</section>"
+{-# INLINE section #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<select>@ element.
+--
+-- Example:
+--
+-- > select $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <select><span>foo</span></select>
+--
+select :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+select = Parent "select" "<select" "</select>"
+{-# INLINE select #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<small>@ element.
+--
+-- Example:
+--
+-- > small $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <small><span>foo</span></small>
+--
+small :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+small = Parent "small" "<small" "</small>"
+{-# INLINE small #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<source />@ element.
+--
+-- Example:
+--
+-- > source
+--
+-- Result:
+--
+-- > <source />
+--
+source :: Html ev  -- ^ Resulting HTML.
+source = Leaf "source" "<source" ">"
+{-# INLINE source #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<span>@ element.
+--
+-- Example:
+--
+-- > span $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <span><span>foo</span></span>
+--
+span :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+span = Parent "span" "<span" "</span>"
+{-# INLINE span #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<strong>@ element.
+--
+-- Example:
+--
+-- > strong $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <strong><span>foo</span></strong>
+--
+strong :: Html ev  -- ^ Inner HTML.
+       -> Html ev  -- ^ Resulting HTML.
+strong = Parent "strong" "<strong" "</strong>"
+{-# INLINE strong #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<style>@ element.
+--
+-- Example:
+--
+-- > style $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <style><span>foo</span></style>
+--
+style :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+style = Parent "style" "<style" "</style>" . external
+{-# INLINE style #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<sub>@ element.
+--
+-- Example:
+--
+-- > sub $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <sub><span>foo</span></sub>
+--
+sub :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+sub = Parent "sub" "<sub" "</sub>"
+{-# INLINE sub #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<summary>@ element.
+--
+-- Example:
+--
+-- > summary $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <summary><span>foo</span></summary>
+--
+summary :: Html ev  -- ^ Inner HTML.
+        -> Html ev  -- ^ Resulting HTML.
+summary = Parent "summary" "<summary" "</summary>"
+{-# INLINE summary #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<sup>@ element.
+--
+-- Example:
+--
+-- > sup $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <sup><span>foo</span></sup>
+--
+sup :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+sup = Parent "sup" "<sup" "</sup>"
+{-# INLINE sup #-}
+
+-- | Combinator for the @\<svg>@ element.
+--
+-- Example:
+--
+-- > svg ! width "100" ! height "100" $
+-- >   circle ! cx "50" ! cy "50" ! r "40"
+--
+-- Result:
+--
+-- > <svg width="100" height="100"><circle cx="50" cy="50" r="40"/></svg>
+--
+svg :: Svg ev -> Html ev
+svg = Parent "svg" "<svg" "</svg>"
+{-# INLINE svg #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<table>@ element.
+--
+-- Example:
+--
+-- > table $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <table><span>foo</span></table>
+--
+table :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+table = Parent "table" "<table" "</table>"
+{-# INLINE table #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<tbody>@ element.
+--
+-- Example:
+--
+-- > tbody $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <tbody><span>foo</span></tbody>
+--
+tbody :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+tbody = Parent "tbody" "<tbody" "</tbody>"
+{-# INLINE tbody #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<td>@ element.
+--
+-- Example:
+--
+-- > td $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <td><span>foo</span></td>
+--
+td :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+td = Parent "td" "<td" "</td>"
+{-# INLINE td #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<textarea>@ element.
+--
+-- Example:
+--
+-- > textarea $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <textarea><span>foo</span></textarea>
+--
+textarea :: Html ev -> Html ev -- ^ Resulting HTML.
+textarea = Parent "textarea" "<textarea" "</textarea>"
+{-# INLINE textarea #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<tfoot>@ element.
+--
+-- Example:
+--
+-- > tfoot $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <tfoot><span>foo</span></tfoot>
+--
+tfoot :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+tfoot = Parent "tfoot" "<tfoot" "</tfoot>"
+{-# INLINE tfoot #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<th>@ element.
+--
+-- Example:
+--
+-- > th $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <th><span>foo</span></th>
+--
+th :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+th = Parent "th" "<th" "</th>"
+{-# INLINE th #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<thead>@ element.
+--
+-- Example:
+--
+-- > thead $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <thead><span>foo</span></thead>
+--
+thead :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+thead = Parent "thead" "<thead" "</thead>"
+{-# INLINE thead #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<time>@ element.
+--
+-- Example:
+--
+-- > time $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <time><span>foo</span></time>
+--
+time :: Html ev  -- ^ Inner HTML.
+     -> Html ev  -- ^ Resulting HTML.
+time = Parent "time" "<time" "</time>"
+{-# INLINE time #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<title>@ element.
+--
+-- Example:
+--
+-- > title $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <title><span>foo</span></title>
+--
+title :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+title = Parent "title" "<title" "</title>"
+{-# INLINE title #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<tr>@ element.
+--
+-- Example:
+--
+-- > tr $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <tr><span>foo</span></tr>
+--
+tr :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+tr = Parent "tr" "<tr" "</tr>"
+{-# INLINE tr #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<track />@ element.
+--
+-- Example:
+--
+-- > track
+--
+-- Result:
+--
+-- > <track />
+--
+track :: Html ev  -- ^ Resulting HTML.
+track = Leaf "track" "<track" ">"
+{-# INLINE track #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<ul>@ element.
+--
+-- Example:
+--
+-- > ul $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <ul><span>foo</span></ul>
+--
+ul :: Html ev  -- ^ Inner HTML.
+   -> Html ev  -- ^ Resulting HTML.
+ul = Parent "ul" "<ul" "</ul>"
+{-# INLINE ul #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<var>@ element.
+--
+-- Example:
+--
+-- > var $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <var><span>foo</span></var>
+--
+var :: Html ev  -- ^ Inner HTML.
+    -> Html ev  -- ^ Resulting HTML.
+var = Parent "var" "<var" "</var>"
+{-# INLINE var #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:199
+--
+-- | Combinator for the @\<video>@ element.
+--
+-- Example:
+--
+-- > video $ span $ toHtml "foo"
+--
+-- Result:
+--
+-- > <video><span>foo</span></video>
+--
+video :: Html ev  -- ^ Inner HTML.
+      -> Html ev  -- ^ Resulting HTML.
+video = Parent "video" "<video" "</video>"
+{-# INLINE video #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:226
+--
+-- | Combinator for the @\<wbr />@ element.
+--
+-- Example:
+--
+-- > wbr
+--
+-- Result:
+--
+-- > <wbr />
+--
+wbr :: Html ev  -- ^ Resulting HTML.
+wbr = Leaf "wbr" "<wbr" ">"
+{-# INLINE wbr #-}
diff --git a/src/Text/Blaze/Front/Html5/Attributes.hs b/src/Text/Blaze/Front/Html5/Attributes.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Blaze/Front/Html5/Attributes.hs
@@ -0,0 +1,1870 @@
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:93
+--
+-- | This module exports combinators that provide you with the
+-- ability to set attributes on HTML elements.
+--
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+module Text.Blaze.Front.Html5.Attributes
+    ( accept
+    , accesskey
+    , action
+    , allowfullscreen
+    , allowtransparency
+    , alt
+    , async
+    , autocapitalize
+    , autocomplete
+    , autocorrect
+    , autofocus
+    , autoplay
+    , cellpadding
+    , cellspacing
+    , charset
+    , checked
+    , class_
+    , colspan
+    , cols
+    , content
+    , contenteditable
+    , contextmenu
+    , controls
+    , coords
+    , crossorigin
+    , data_
+    , datetime
+    , defer
+    , dir
+    , disabled
+    , download
+    , draggable
+    , enctype
+    , form
+    , formnovalidate
+    , frameborder
+    , height
+    , hidden
+    , href
+    , hreflang
+    , for
+    , httpequiv
+    , icon
+    , id
+    , itemprop
+    , itemscope
+    , itemtype
+    , key
+    , label
+    , lang
+    , list
+    , loop
+    , max
+    , maxlength
+    , mediagroup
+    , method
+    , min
+    , multiple
+    , muted
+    , name
+    , novalidate
+    , pattern
+    , placeholder
+    , poster
+    , preload
+    , property
+    , radiogroup
+    , readonly
+    , rel
+    , required
+    , role
+    , rowspan
+    , rows
+    , sandbox
+    , scope
+    , scrollleft
+    , scrolltop
+    , scrolling
+    , seamless
+    , selected
+    , shape
+    , size
+    , span
+    , spellcheck
+    , src
+    , srcdoc
+    , srcset
+    , start
+    , step
+    , style
+    , tabindex
+    , target
+    , title
+    , type_
+    , usemap
+    , value
+    , width
+    , wmode
+    ) where
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:99
+--
+
+import Text.Blaze.Front.Internal
+  ( Attribute, AttributeValue, attribute )
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @accept@ attribute.
+--
+-- Example:
+--
+-- > div ! accept "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div accept="bar">Hello.</div>
+--
+accept :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+accept = attribute "accept" " accept=\""
+{-# INLINE accept #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @accessKey@ attribute.
+--
+-- Example:
+--
+-- > div ! accesskey "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div accessKey="bar">Hello.</div>
+--
+accesskey :: AttributeValue  -- ^ Attribute value.
+          -> Attribute ev    -- ^ Resulting attribute.
+accesskey = attribute "accessKey" " accessKey=\""
+{-# INLINE accesskey #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @action@ attribute.
+--
+-- Example:
+--
+-- > div ! action "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div action="bar">Hello.</div>
+--
+action :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+action = attribute "action" " action=\""
+{-# INLINE action #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @allowFullScreen@ attribute.
+--
+-- Example:
+--
+-- > div ! allowfullscreen "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div allowFullScreen="bar">Hello.</div>
+--
+allowfullscreen :: AttributeValue  -- ^ Attribute value.
+                -> Attribute ev    -- ^ Resulting attribute.
+allowfullscreen = attribute "allowFullScreen" " allowFullScreen=\""
+{-# INLINE allowfullscreen #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @allowTransparency@ attribute.
+--
+-- Example:
+--
+-- > div ! allowtransparency "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div allowTransparency="bar">Hello.</div>
+--
+allowtransparency :: AttributeValue  -- ^ Attribute value.
+                  -> Attribute ev    -- ^ Resulting attribute.
+allowtransparency = attribute "allowTransparency" " allowTransparency=\""
+{-# INLINE allowtransparency #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @alt@ attribute.
+--
+-- Example:
+--
+-- > div ! alt "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div alt="bar">Hello.</div>
+--
+alt :: AttributeValue  -- ^ Attribute value.
+    -> Attribute ev    -- ^ Resulting attribute.
+alt = attribute "alt" " alt=\""
+{-# INLINE alt #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @async@ attribute.
+--
+-- Example:
+--
+-- > div ! async "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div async="bar">Hello.</div>
+--
+async :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+async = attribute "async" " async=\""
+{-# INLINE async #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @autoCapitalize@ attribute.
+--
+-- Example:
+--
+-- > div ! autocapitalize "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div autoCapitalize="bar">Hello.</div>
+--
+autocapitalize :: AttributeValue  -- ^ Attribute value.
+               -> Attribute ev    -- ^ Resulting attribute.
+autocapitalize = attribute "autoCapitalize" " autoCapitalize=\""
+{-# INLINE autocapitalize #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @autoComplete@ attribute.
+--
+-- Example:
+--
+-- > div ! autocomplete "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div autoComplete="bar">Hello.</div>
+--
+autocomplete :: AttributeValue  -- ^ Attribute value.
+             -> Attribute ev    -- ^ Resulting attribute.
+autocomplete = attribute "autoComplete" " autoComplete=\""
+{-# INLINE autocomplete #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @autoCorrect@ attribute.
+--
+-- Example:
+--
+-- > div ! autocorrect "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div autoCorrect="bar">Hello.</div>
+--
+autocorrect :: AttributeValue  -- ^ Attribute value.
+            -> Attribute ev    -- ^ Resulting attribute.
+autocorrect = attribute "autoCorrect" " autoCorrect=\""
+{-# INLINE autocorrect #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @autoFocus@ attribute.
+--
+-- Example:
+--
+-- > div ! autofocus "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div autoFocus="bar">Hello.</div>
+--
+autofocus :: AttributeValue  -- ^ Attribute value.
+          -> Attribute ev    -- ^ Resulting attribute.
+autofocus = attribute "autoFocus" " autoFocus=\""
+{-# INLINE autofocus #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @autoPlay@ attribute.
+--
+-- Example:
+--
+-- > div ! autoplay "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div autoPlay="bar">Hello.</div>
+--
+autoplay :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+autoplay = attribute "autoPlay" " autoPlay=\""
+{-# INLINE autoplay #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @cellPadding@ attribute.
+--
+-- Example:
+--
+-- > div ! cellpadding "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div cellPadding="bar">Hello.</div>
+--
+cellpadding :: AttributeValue  -- ^ Attribute value.
+            -> Attribute ev    -- ^ Resulting attribute.
+cellpadding = attribute "cellPadding" " cellPadding=\""
+{-# INLINE cellpadding #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @cellSpacing@ attribute.
+--
+-- Example:
+--
+-- > div ! cellspacing "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div cellSpacing="bar">Hello.</div>
+--
+cellspacing :: AttributeValue  -- ^ Attribute value.
+            -> Attribute ev    -- ^ Resulting attribute.
+cellspacing = attribute "cellSpacing" " cellSpacing=\""
+{-# INLINE cellspacing #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @charSet@ attribute.
+--
+-- Example:
+--
+-- > div ! charset "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div charSet="bar">Hello.</div>
+--
+charset :: AttributeValue  -- ^ Attribute value.
+        -> Attribute ev    -- ^ Resulting attribute.
+charset = attribute "charSet" " charSet=\""
+{-# INLINE charset #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @checked@ attribute.
+--
+-- Example:
+--
+-- > div ! checked "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div checked="bar">Hello.</div>
+--
+checked :: AttributeValue  -- ^ Attribute value.
+        -> Attribute ev    -- ^ Resulting attribute.
+checked = attribute "checked" " checked=\""
+{-# INLINE checked #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @className@ attribute.
+--
+-- Example:
+--
+-- > div ! class_ "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div className="bar">Hello.</div>
+--
+class_ :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+class_ = attribute "class" " class=\""
+{-# INLINE class_ #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @colSpan@ attribute.
+--
+-- Example:
+--
+-- > div ! colspan "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div colSpan="bar">Hello.</div>
+--
+colspan :: AttributeValue  -- ^ Attribute value.
+        -> Attribute ev    -- ^ Resulting attribute.
+colspan = attribute "colSpan" " colSpan=\""
+{-# INLINE colspan #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @cols@ attribute.
+--
+-- Example:
+--
+-- > div ! cols "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div cols="bar">Hello.</div>
+--
+cols :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+cols = attribute "cols" " cols=\""
+{-# INLINE cols #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @content@ attribute.
+--
+-- Example:
+--
+-- > div ! content "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div content="bar">Hello.</div>
+--
+content :: AttributeValue  -- ^ Attribute value.
+        -> Attribute ev    -- ^ Resulting attribute.
+content = attribute "content" " content=\""
+{-# INLINE content #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @contentEditable@ attribute.
+--
+-- Example:
+--
+-- > div ! contenteditable "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div contentEditable="bar">Hello.</div>
+--
+contenteditable :: AttributeValue  -- ^ Attribute value.
+                -> Attribute ev    -- ^ Resulting attribute.
+contenteditable = attribute "contentEditable" " contentEditable=\""
+{-# INLINE contenteditable #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @contextMenu@ attribute.
+--
+-- Example:
+--
+-- > div ! contextmenu "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div contextMenu="bar">Hello.</div>
+--
+contextmenu :: AttributeValue  -- ^ Attribute value.
+            -> Attribute ev    -- ^ Resulting attribute.
+contextmenu = attribute "contextMenu" " contextMenu=\""
+{-# INLINE contextmenu #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @controls@ attribute.
+--
+-- Example:
+--
+-- > div ! controls "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div controls="bar">Hello.</div>
+--
+controls :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+controls = attribute "controls" " controls=\""
+{-# INLINE controls #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @coords@ attribute.
+--
+-- Example:
+--
+-- > div ! coords "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div coords="bar">Hello.</div>
+--
+coords :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+coords = attribute "coords" " coords=\""
+{-# INLINE coords #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @crossOrigin@ attribute.
+--
+-- Example:
+--
+-- > div ! crossorigin "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div crossOrigin="bar">Hello.</div>
+--
+crossorigin :: AttributeValue  -- ^ Attribute value.
+            -> Attribute ev    -- ^ Resulting attribute.
+crossorigin = attribute "crossOrigin" " crossOrigin=\""
+{-# INLINE crossorigin #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @data@ attribute.
+--
+-- Example:
+--
+-- > div ! data_ "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div data="bar">Hello.</div>
+--
+data_ :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+data_ = attribute "data" " data=\""
+{-# INLINE data_ #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @dateTime@ attribute.
+--
+-- Example:
+--
+-- > div ! datetime "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div dateTime="bar">Hello.</div>
+--
+datetime :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+datetime = attribute "dateTime" " dateTime=\""
+{-# INLINE datetime #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @defer@ attribute.
+--
+-- Example:
+--
+-- > div ! defer "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div defer="bar">Hello.</div>
+--
+defer :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+defer = attribute "defer" " defer=\""
+{-# INLINE defer #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @dir@ attribute.
+--
+-- Example:
+--
+-- > div ! dir "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div dir="bar">Hello.</div>
+--
+dir :: AttributeValue  -- ^ Attribute value.
+    -> Attribute ev    -- ^ Resulting attribute.
+dir = attribute "dir" " dir=\""
+{-# INLINE dir #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @disabled@ attribute.
+--
+-- Example:
+--
+-- > div ! disabled "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div disabled="bar">Hello.</div>
+--
+disabled :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+disabled = attribute "disabled" " disabled=\""
+{-# INLINE disabled #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @download@ attribute.
+--
+-- Example:
+--
+-- > div ! download "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div download="bar">Hello.</div>
+--
+download :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+download = attribute "download" " download=\""
+{-# INLINE download #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @draggable@ attribute.
+--
+-- Example:
+--
+-- > div ! draggable "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div draggable="bar">Hello.</div>
+--
+draggable :: AttributeValue  -- ^ Attribute value.
+          -> Attribute ev    -- ^ Resulting attribute.
+draggable = attribute "draggable" " draggable=\""
+{-# INLINE draggable #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @encType@ attribute.
+--
+-- Example:
+--
+-- > div ! enctype "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div encType="bar">Hello.</div>
+--
+enctype :: AttributeValue  -- ^ Attribute value.
+        -> Attribute ev    -- ^ Resulting attribute.
+enctype = attribute "encType" " encType=\""
+{-# INLINE enctype #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @form@ attribute.
+--
+-- Example:
+--
+-- > div ! form "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div form="bar">Hello.</div>
+--
+form :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+form = attribute "form" " form=\""
+{-# INLINE form #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @formNoValidate@ attribute.
+--
+-- Example:
+--
+-- > div ! formnovalidate "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div formNoValidate="bar">Hello.</div>
+--
+formnovalidate :: AttributeValue  -- ^ Attribute value.
+               -> Attribute ev    -- ^ Resulting attribute.
+formnovalidate = attribute "formNoValidate" " formNoValidate=\""
+{-# INLINE formnovalidate #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @frameBorder@ attribute.
+--
+-- Example:
+--
+-- > div ! frameborder "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div frameBorder="bar">Hello.</div>
+--
+frameborder :: AttributeValue  -- ^ Attribute value.
+            -> Attribute ev    -- ^ Resulting attribute.
+frameborder = attribute "frameBorder" " frameBorder=\""
+{-# INLINE frameborder #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @height@ attribute.
+--
+-- Example:
+--
+-- > div ! height "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div height="bar">Hello.</div>
+--
+height :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+height = attribute "height" " height=\""
+{-# INLINE height #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @hidden@ attribute.
+--
+-- Example:
+--
+-- > div ! hidden "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div hidden="bar">Hello.</div>
+--
+hidden :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+hidden = attribute "hidden" " hidden=\""
+{-# INLINE hidden #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @href@ attribute.
+--
+-- Example:
+--
+-- > div ! href "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div href="bar">Hello.</div>
+--
+href :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+href = attribute "href" " href=\""
+{-# INLINE href #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @hrefLang@ attribute.
+--
+-- Example:
+--
+-- > div ! hreflang "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div hrefLang="bar">Hello.</div>
+--
+hreflang :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+hreflang = attribute "hrefLang" " hrefLang=\""
+{-# INLINE hreflang #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @htmlFor@ attribute.
+--
+-- Example:
+--
+-- > div ! for "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div htmlFor="bar">Hello.</div>
+--
+for :: AttributeValue  -- ^ Attribute value.
+    -> Attribute ev    -- ^ Resulting attribute.
+for = attribute "htmlFor" " htmlFor=\""
+{-# INLINE for #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @httpEquiv@ attribute.
+--
+-- Example:
+--
+-- > div ! httpequiv "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div httpEquiv="bar">Hello.</div>
+--
+httpequiv :: AttributeValue  -- ^ Attribute value.
+          -> Attribute ev    -- ^ Resulting attribute.
+httpequiv = attribute "httpEquiv" " httpEquiv=\""
+{-# INLINE httpequiv #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @icon@ attribute.
+--
+-- Example:
+--
+-- > div ! icon "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div icon="bar">Hello.</div>
+--
+icon :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+icon = attribute "icon" " icon=\""
+{-# INLINE icon #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @id@ attribute.
+--
+-- Example:
+--
+-- > div ! id "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div id="bar">Hello.</div>
+--
+id :: AttributeValue  -- ^ Attribute value.
+   -> Attribute ev    -- ^ Resulting attribute.
+id = attribute "id" " id=\""
+{-# INLINE id #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @itemProp@ attribute.
+--
+-- Example:
+--
+-- > div ! itemprop "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div itemProp="bar">Hello.</div>
+--
+itemprop :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+itemprop = attribute "itemProp" " itemProp=\""
+{-# INLINE itemprop #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @itemScope@ attribute.
+--
+-- Example:
+--
+-- > div ! itemscope "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div itemScope="bar">Hello.</div>
+--
+itemscope :: AttributeValue  -- ^ Attribute value.
+          -> Attribute ev    -- ^ Resulting attribute.
+itemscope = attribute "itemScope" " itemScope=\""
+{-# INLINE itemscope #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @itemType@ attribute.
+--
+-- Example:
+--
+-- > div ! itemtype "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div itemType="bar">Hello.</div>
+--
+itemtype :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+itemtype = attribute "itemType" " itemType=\""
+{-# INLINE itemtype #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @key@ attribute.
+--
+-- Example:
+--
+-- > div ! key "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div key="bar">Hello.</div>
+--
+key :: AttributeValue  -- ^ Attribute value.
+    -> Attribute ev    -- ^ Resulting attribute.
+key = attribute "key" " key=\""
+{-# INLINE key #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @label@ attribute.
+--
+-- Example:
+--
+-- > div ! label "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div label="bar">Hello.</div>
+--
+label :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+label = attribute "label" " label=\""
+{-# INLINE label #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @lang@ attribute.
+--
+-- Example:
+--
+-- > div ! lang "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div lang="bar">Hello.</div>
+--
+lang :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+lang = attribute "lang" " lang=\""
+{-# INLINE lang #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @list@ attribute.
+--
+-- Example:
+--
+-- > div ! list "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div list="bar">Hello.</div>
+--
+list :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+list = attribute "list" " list=\""
+{-# INLINE list #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @loop@ attribute.
+--
+-- Example:
+--
+-- > div ! loop "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div loop="bar">Hello.</div>
+--
+loop :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+loop = attribute "loop" " loop=\""
+{-# INLINE loop #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @max@ attribute.
+--
+-- Example:
+--
+-- > div ! max "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div max="bar">Hello.</div>
+--
+max :: AttributeValue  -- ^ Attribute value.
+    -> Attribute ev    -- ^ Resulting attribute.
+max = attribute "max" " max=\""
+{-# INLINE max #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @maxLength@ attribute.
+--
+-- Example:
+--
+-- > div ! maxlength "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div maxLength="bar">Hello.</div>
+--
+maxlength :: AttributeValue  -- ^ Attribute value.
+          -> Attribute ev    -- ^ Resulting attribute.
+maxlength = attribute "maxLength" " maxLength=\""
+{-# INLINE maxlength #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @mediaGroup@ attribute.
+--
+-- Example:
+--
+-- > div ! mediagroup "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div mediaGroup="bar">Hello.</div>
+--
+mediagroup :: AttributeValue  -- ^ Attribute value.
+           -> Attribute ev    -- ^ Resulting attribute.
+mediagroup = attribute "mediaGroup" " mediaGroup=\""
+{-# INLINE mediagroup #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @method@ attribute.
+--
+-- Example:
+--
+-- > div ! method "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div method="bar">Hello.</div>
+--
+method :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+method = attribute "method" " method=\""
+{-# INLINE method #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @min@ attribute.
+--
+-- Example:
+--
+-- > div ! min "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div min="bar">Hello.</div>
+--
+min :: AttributeValue  -- ^ Attribute value.
+    -> Attribute ev    -- ^ Resulting attribute.
+min = attribute "min" " min=\""
+{-# INLINE min #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @multiple@ attribute.
+--
+-- Example:
+--
+-- > div ! multiple "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div multiple="bar">Hello.</div>
+--
+multiple :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+multiple = attribute "multiple" " multiple=\""
+{-# INLINE multiple #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @muted@ attribute.
+--
+-- Example:
+--
+-- > div ! muted "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div muted="bar">Hello.</div>
+--
+muted :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+muted = attribute "muted" " muted=\""
+{-# INLINE muted #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @name@ attribute.
+--
+-- Example:
+--
+-- > div ! name "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div name="bar">Hello.</div>
+--
+name :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+name = attribute "name" " name=\""
+{-# INLINE name #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @noValidate@ attribute.
+--
+-- Example:
+--
+-- > div ! novalidate "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div noValidate="bar">Hello.</div>
+--
+novalidate :: AttributeValue  -- ^ Attribute value.
+           -> Attribute ev    -- ^ Resulting attribute.
+novalidate = attribute "noValidate" " noValidate=\""
+{-# INLINE novalidate #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @pattern@ attribute.
+--
+-- Example:
+--
+-- > div ! pattern "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div pattern="bar">Hello.</div>
+--
+pattern :: AttributeValue  -- ^ Attribute value.
+        -> Attribute ev    -- ^ Resulting attribute.
+pattern = attribute "pattern" " pattern=\""
+{-# INLINE pattern #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @placeholder@ attribute.
+--
+-- Example:
+--
+-- > div ! placeholder "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div placeholder="bar">Hello.</div>
+--
+placeholder :: AttributeValue  -- ^ Attribute value.
+            -> Attribute ev    -- ^ Resulting attribute.
+placeholder = attribute "placeholder" " placeholder=\""
+{-# INLINE placeholder #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @poster@ attribute.
+--
+-- Example:
+--
+-- > div ! poster "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div poster="bar">Hello.</div>
+--
+poster :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+poster = attribute "poster" " poster=\""
+{-# INLINE poster #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @preload@ attribute.
+--
+-- Example:
+--
+-- > div ! preload "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div preload="bar">Hello.</div>
+--
+preload :: AttributeValue  -- ^ Attribute value.
+        -> Attribute ev    -- ^ Resulting attribute.
+preload = attribute "preload" " preload=\""
+{-# INLINE preload #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @property@ attribute.
+--
+-- Example:
+--
+-- > div ! property "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div property="bar">Hello.</div>
+--
+property :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+property = attribute "property" " property=\""
+{-# INLINE property #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @radioGroup@ attribute.
+--
+-- Example:
+--
+-- > div ! radiogroup "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div radioGroup="bar">Hello.</div>
+--
+radiogroup :: AttributeValue  -- ^ Attribute value.
+           -> Attribute ev    -- ^ Resulting attribute.
+radiogroup = attribute "radioGroup" " radioGroup=\""
+{-# INLINE radiogroup #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @readOnly@ attribute.
+--
+-- Example:
+--
+-- > div ! readonly "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div readOnly="bar">Hello.</div>
+--
+readonly :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+readonly = attribute "readOnly" " readOnly=\""
+{-# INLINE readonly #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @rel@ attribute.
+--
+-- Example:
+--
+-- > div ! rel "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div rel="bar">Hello.</div>
+--
+rel :: AttributeValue  -- ^ Attribute value.
+    -> Attribute ev    -- ^ Resulting attribute.
+rel = attribute "rel" " rel=\""
+{-# INLINE rel #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @required@ attribute.
+--
+-- Example:
+--
+-- > div ! required "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div required="bar">Hello.</div>
+--
+required :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+required = attribute "required" " required=\""
+{-# INLINE required #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @role@ attribute.
+--
+-- Example:
+--
+-- > div ! role "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div role="bar">Hello.</div>
+--
+role :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+role = attribute "role" " role=\""
+{-# INLINE role #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @rowSpan@ attribute.
+--
+-- Example:
+--
+-- > div ! rowspan "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div rowSpan="bar">Hello.</div>
+--
+rowspan :: AttributeValue  -- ^ Attribute value.
+        -> Attribute ev    -- ^ Resulting attribute.
+rowspan = attribute "rowSpan" " rowSpan=\""
+{-# INLINE rowspan #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @rows@ attribute.
+--
+-- Example:
+--
+-- > div ! rows "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div rows="bar">Hello.</div>
+--
+rows :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+rows = attribute "rows" " rows=\""
+{-# INLINE rows #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @sandbox@ attribute.
+--
+-- Example:
+--
+-- > div ! sandbox "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div sandbox="bar">Hello.</div>
+--
+sandbox :: AttributeValue  -- ^ Attribute value.
+        -> Attribute ev    -- ^ Resulting attribute.
+sandbox = attribute "sandbox" " sandbox=\""
+{-# INLINE sandbox #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @scope@ attribute.
+--
+-- Example:
+--
+-- > div ! scope "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div scope="bar">Hello.</div>
+--
+scope :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+scope = attribute "scope" " scope=\""
+{-# INLINE scope #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @scrollLeft@ attribute.
+--
+-- Example:
+--
+-- > div ! scrollleft "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div scrollLeft="bar">Hello.</div>
+--
+scrollleft :: AttributeValue  -- ^ Attribute value.
+           -> Attribute ev    -- ^ Resulting attribute.
+scrollleft = attribute "scrollLeft" " scrollLeft=\""
+{-# INLINE scrollleft #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @scrollTop@ attribute.
+--
+-- Example:
+--
+-- > div ! scrolltop "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div scrollTop="bar">Hello.</div>
+--
+scrolltop :: AttributeValue  -- ^ Attribute value.
+          -> Attribute ev    -- ^ Resulting attribute.
+scrolltop = attribute "scrollTop" " scrollTop=\""
+{-# INLINE scrolltop #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @scrolling@ attribute.
+--
+-- Example:
+--
+-- > div ! scrolling "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div scrolling="bar">Hello.</div>
+--
+scrolling :: AttributeValue  -- ^ Attribute value.
+          -> Attribute ev    -- ^ Resulting attribute.
+scrolling = attribute "scrolling" " scrolling=\""
+{-# INLINE scrolling #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @seamless@ attribute.
+--
+-- Example:
+--
+-- > div ! seamless "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div seamless="bar">Hello.</div>
+--
+seamless :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+seamless = attribute "seamless" " seamless=\""
+{-# INLINE seamless #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @selected@ attribute.
+--
+-- Example:
+--
+-- > div ! selected "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div selected="bar">Hello.</div>
+--
+selected :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+selected = attribute "selected" " selected=\""
+{-# INLINE selected #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @shape@ attribute.
+--
+-- Example:
+--
+-- > div ! shape "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div shape="bar">Hello.</div>
+--
+shape :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+shape = attribute "shape" " shape=\""
+{-# INLINE shape #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @size@ attribute.
+--
+-- Example:
+--
+-- > div ! size "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div size="bar">Hello.</div>
+--
+size :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+size = attribute "size" " size=\""
+{-# INLINE size #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @span@ attribute.
+--
+-- Example:
+--
+-- > div ! span "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div span="bar">Hello.</div>
+--
+span :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+span = attribute "span" " span=\""
+{-# INLINE span #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @spellCheck@ attribute.
+--
+-- Example:
+--
+-- > div ! spellcheck "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div spellCheck="bar">Hello.</div>
+--
+spellcheck :: AttributeValue  -- ^ Attribute value.
+           -> Attribute ev    -- ^ Resulting attribute.
+spellcheck = attribute "spellCheck" " spellCheck=\""
+{-# INLINE spellcheck #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @src@ attribute.
+--
+-- Example:
+--
+-- > div ! src "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div src="bar">Hello.</div>
+--
+src :: AttributeValue  -- ^ Attribute value.
+    -> Attribute ev    -- ^ Resulting attribute.
+src = attribute "src" " src=\""
+{-# INLINE src #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @srcDoc@ attribute.
+--
+-- Example:
+--
+-- > div ! srcdoc "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div srcDoc="bar">Hello.</div>
+--
+srcdoc :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+srcdoc = attribute "srcDoc" " srcDoc=\""
+{-# INLINE srcdoc #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @srcSet@ attribute.
+--
+-- Example:
+--
+-- > div ! srcset "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div srcSet="bar">Hello.</div>
+--
+srcset :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+srcset = attribute "srcSet" " srcSet=\""
+{-# INLINE srcset #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @start@ attribute.
+--
+-- Example:
+--
+-- > div ! start "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div start="bar">Hello.</div>
+--
+start :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+start = attribute "start" " start=\""
+{-# INLINE start #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @step@ attribute.
+--
+-- Example:
+--
+-- > div ! step "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div step="bar">Hello.</div>
+--
+step :: AttributeValue  -- ^ Attribute value.
+     -> Attribute ev    -- ^ Resulting attribute.
+step = attribute "step" " step=\""
+{-# INLINE step #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @style@ attribute.
+style :: AttributeValue     -- ^ Attribute value.
+      -> Attribute ev       -- ^ Resulting attribute.
+style = attribute "style" " style=\""
+{-# INLINE style #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @tabIndex@ attribute.
+--
+-- Example:
+--
+-- > div ! tabindex "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div tabIndex="bar">Hello.</div>
+--
+tabindex :: AttributeValue  -- ^ Attribute value.
+         -> Attribute ev    -- ^ Resulting attribute.
+tabindex = attribute "tabIndex" " tabIndex=\""
+{-# INLINE tabindex #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @target@ attribute.
+--
+-- Example:
+--
+-- > div ! target "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div target="bar">Hello.</div>
+--
+target :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+target = attribute "target" " target=\""
+{-# INLINE target #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @title@ attribute.
+--
+-- Example:
+--
+-- > div ! title "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div title="bar">Hello.</div>
+--
+title :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+title = attribute "title" " title=\""
+{-# INLINE title #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @type@ attribute.
+--
+-- Example:
+--
+-- > div ! type_ "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div type="bar">Hello.</div>
+--
+type_ :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+type_ = attribute "type" " type=\""
+{-# INLINE type_ #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @useMap@ attribute.
+--
+-- Example:
+--
+-- > div ! usemap "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div useMap="bar">Hello.</div>
+--
+usemap :: AttributeValue  -- ^ Attribute value.
+       -> Attribute ev    -- ^ Resulting attribute.
+usemap = attribute "useMap" " useMap=\""
+{-# INLINE usemap #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @value@ attribute.
+--
+-- Example:
+--
+-- > div ! value "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div value="bar">Hello.</div>
+--
+value :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+value = attribute "value" " value=\""
+{-# INLINE value #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @width@ attribute.
+--
+-- Example:
+--
+-- > div ! width "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div width="bar">Hello.</div>
+--
+width :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+width = attribute "width" " width=\""
+{-# INLINE width #-}
+
+-- WARNING: The next block of code was automatically generated by
+-- src/Util/GenerateHtmlCombinators.hs:249
+--
+-- | Combinator for the @wmode@ attribute.
+--
+-- Example:
+--
+-- > div ! wmode "bar" $ "Hello."
+--
+-- Result:
+--
+-- > <div wmode="bar">Hello.</div>
+--
+wmode :: AttributeValue  -- ^ Attribute value.
+      -> Attribute ev    -- ^ Resulting attribute.
+wmode = attribute "wmode" " wmode=\""
+{-# INLINE wmode #-}
diff --git a/src/Text/Blaze/Front/Internal.hs b/src/Text/Blaze/Front/Internal.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Blaze/Front/Internal.hs
@@ -0,0 +1,487 @@
+
+{-# LANGUAGE OverloadedStrings, GeneralizedNewtypeDeriving, Rank2Types,
+             FlexibleInstances, ExistentialQuantification,
+             DeriveDataTypeable, MultiParamTypeClasses, DeriveFunctor,
+             FunctionalDependencies #-}
+-- | The BlazeMarkup core, consisting of functions that offer the power to
+-- generate custom markup elements. It also offers user-centric functions,
+-- which are exposed through 'Text.Blaze'.
+--
+-- While this module is exported, usage of it is not recommended, unless you
+-- know what you are doing. This module might undergo changes at any time.
+--
+module Text.Blaze.Front.Internal
+    (
+      -- * Important types.
+      ChoiceString (..)
+    , StaticString (..)
+    , MarkupM (..)
+    , Markup
+    , Tag
+    , Attribute (..)
+    , AttributeValue(..)
+
+
+      -- * Creating custom tags and attributes.
+    , customParent
+    , customLeaf
+    , attribute
+    , dataAttribute
+    , customAttribute
+
+      -- * Converting values to Markup.
+    , text
+    , preEscapedText
+    , lazyText
+    , preEscapedLazyText
+    , string
+    , preEscapedString
+    , unsafeByteString
+    , unsafeLazyByteString
+
+      -- * Converting values to tags.
+    , textTag
+    , stringTag
+
+      -- * Converting values to attribute values.
+    , textValue
+    , preEscapedTextValue
+    , lazyTextValue
+    , preEscapedLazyTextValue
+    , stringValue
+    , preEscapedStringValue
+    , unsafeByteStringValue
+    , unsafeLazyByteStringValue
+
+      -- * Setting attributes
+    , Attributable
+    , (!)
+    , (!?)
+
+      -- * Modifying Markup elements
+    , contents
+    , external
+
+      -- * Querying Markup elements
+    , null
+    ) where
+
+import           Control.Applicative
+
+import           Data.ByteString.Char8        (ByteString)
+import qualified Data.ByteString              as B
+import qualified Data.ByteString.Lazy         as BL
+import qualified Data.List                    as List
+import           Data.Monoid                  (Monoid, mempty)
+import           Data.Semigroup               (Semigroup, sconcat)
+import           Data.Text                    (Text)
+import qualified Data.Text                    as T
+import qualified Data.Text.Encoding           as T
+import qualified Data.Text.Lazy               as LT
+import           Data.Typeable                (Typeable)
+
+import           GHC.Exts                     (IsString (..))
+
+import           Prelude                      hiding (null)
+
+import           Bridge
+import           Text.Blaze.Internal (StaticString(..), ChoiceString(..))
+
+import           Unsafe.Coerce (unsafeCoerce)
+
+
+-- | The core Markup datatype. The 'ev' type-parameter tracks the type of
+-- events that can be raised when this Markup is rendered.
+--
+data MarkupM act a
+      -- | Map all actions created by the inner Html.
+    = forall act'. MapActions (act' -> act) (MarkupM act' a)
+      -- | Install event handlers for the given event on all immediate
+      -- children.
+    | OnEvent (EventHandler act) (MarkupM act a)
+      -- | Tag, open tag, end tag, content
+    | Parent StaticString StaticString StaticString (MarkupM act a)
+      -- | Custom parent
+    | CustomParent ChoiceString (MarkupM act a)
+      -- | Tag, open tag, end tag
+    | Leaf StaticString StaticString StaticString
+      -- | Custom leaf
+    | CustomLeaf ChoiceString Bool
+      -- | HTML content
+    | Content ChoiceString
+      -- | Concatenation of two HTML pieces
+    | forall b c. Append (MarkupM act b) (MarkupM act c)
+      -- | Add an attribute to the inner HTML. Raw key, key, value, HTML to
+      -- receive the attribute.
+    | AddAttribute StaticString StaticString ChoiceString (MarkupM act a)
+      -- | Add a custom attribute to the inner HTML.
+    | AddCustomAttribute ChoiceString ChoiceString (MarkupM act a)
+      -- | Empty HTML.
+    | Empty
+    deriving (Typeable)
+
+-- | Simplification of the 'MarkupM' datatype.
+--
+type Markup e = MarkupM e ()
+
+instance Monoid a => Monoid (MarkupM ev a) where
+    mempty = Empty
+    {-# INLINE mempty #-}
+
+instance Semigroup a => Semigroup (MarkupM ev a) where
+    x <> y = Append x y
+    {-# INLINE (<>) #-}
+    sconcat = foldr Append Empty
+    {-# INLINE sconcat #-}
+
+instance Functor (MarkupM ev) where
+    -- Safe because it does not contain a value anyway
+    fmap _ = unsafeCoerce
+
+instance Applicative (MarkupM ev) where
+    pure _    = Empty
+    ff <*> fx = Append ff fx
+
+instance Monad (MarkupM ev) where
+    return _ = Empty
+    {-# INLINE return #-}
+    (>>) = Append
+    {-# INLINE (>>) #-}
+    h1 >>= f = h1 >> f
+        (error "Text.Blaze.Internal.MarkupM: invalid use of monadic bind")
+    {-# INLINE (>>=) #-}
+
+instance IsString (MarkupM ev a) where
+    fromString = Content . fromString
+    {-# INLINE fromString #-}
+
+-- | Type for an HTML tag. This can be seen as an internal string type used by
+-- BlazeMarkup.
+--
+newtype Tag = Tag { unTag :: StaticString }
+    deriving (IsString)
+
+-- | Type for an attribute.
+--
+newtype Attribute ev = Attribute (forall a. MarkupM ev a -> MarkupM ev a)
+
+instance Monoid (Attribute ev) where
+    mempty                            = Attribute id
+
+instance Semigroup (Attribute ev) where
+    Attribute f <> Attribute g = Attribute (g . f)
+
+-- | The type for the value part of an attribute.
+--
+newtype AttributeValue = AttributeValue { unAttributeValue :: ChoiceString }
+    deriving (IsString, Monoid, Semigroup)
+
+
+-- custom tags
+--------------
+
+-- | Create a custom parent element
+customParent :: Tag       -- ^ Element tag
+             -> Markup ev -- ^ Content
+             -> Markup ev -- ^ Resulting markup
+customParent tag = CustomParent (Static $ unTag tag)
+
+-- | Create a custom leaf element
+customLeaf :: Tag       -- ^ Element tag
+           -> Bool      -- ^ Close the leaf?
+           -> Markup ev -- ^ Resulting markup
+customLeaf tag = CustomLeaf (Static $ unTag tag)
+
+-- | Create an HTML attribute that can be applied to an HTML element later using
+-- the '!' operator.
+--
+attribute :: Tag             -- ^ Raw key
+          -> Tag             -- ^ Shared key string for the HTML attribute.
+          -> AttributeValue  -- ^ Value for the HTML attribute.
+          -> Attribute ev    -- ^ Resulting HTML attribute.
+attribute rawKey key value = Attribute $
+    AddAttribute (unTag rawKey) (unTag key) (unAttributeValue value)
+{-# INLINE attribute #-}
+
+-- | From HTML 5 onwards, the user is able to specify custom data attributes.
+--
+-- An example:
+--
+-- > <p data-foo="bar">Hello.</p>
+--
+-- We support this in BlazeMarkup using this funcion. The above fragment could
+-- be described using BlazeMarkup with:
+--
+-- > p ! dataAttribute "foo" "bar" $ "Hello."
+--
+dataAttribute :: Tag             -- ^ Name of the attribute.
+              -> AttributeValue  -- ^ Value for the attribute.
+              -> Attribute ev    -- ^ Resulting HTML attribute.
+dataAttribute tag value = Attribute $ AddCustomAttribute
+    (Static "data-" `mappend` Static (unTag tag))
+    (unAttributeValue value)
+{-# INLINE dataAttribute #-}
+
+-- | Create a custom attribute. This is not specified in the HTML spec, but some
+-- JavaScript libraries rely on it.
+--
+-- An example:
+--
+-- > <select dojoType="select">foo</select>
+--
+-- Can be produced using:
+--
+-- > select ! customAttribute "dojoType" "select" $ "foo"
+--
+customAttribute :: Tag             -- ^ Name of the attribute
+                -> AttributeValue  -- ^ Value for the attribute
+                -> Attribute ev    -- ^ Resulting HTML attribtue
+customAttribute tag value = Attribute $ AddCustomAttribute
+    (Static $ unTag tag)
+    (unAttributeValue value)
+{-# INLINE customAttribute #-}
+
+-- | Render text. Functions like these can be used to supply content in HTML.
+--
+text :: Text       -- ^ Text to render.
+     -> Markup ev  -- ^ Resulting HTML fragment.
+text = Content . Text
+{-# INLINE text #-}
+
+-- | Render text without escaping.
+--
+preEscapedText :: Text      -- ^ Text to insert
+               -> Markup ev -- ^ Resulting HTML fragment
+preEscapedText = Content . PreEscaped . Text
+{-# INLINE preEscapedText #-}
+
+-- | A variant of 'text' for lazy 'LT.Text'.
+--
+lazyText :: LT.Text    -- ^ Text to insert
+         -> Markup ev  -- ^ Resulting HTML fragment
+lazyText = mconcat . map text . LT.toChunks
+{-# INLINE lazyText #-}
+
+-- | A variant of 'preEscapedText' for lazy 'LT.Text'
+--
+preEscapedLazyText :: LT.Text    -- ^ Text to insert
+                   -> Markup ev  -- ^ Resulting HTML fragment
+preEscapedLazyText = mconcat . map preEscapedText . LT.toChunks
+
+-- | Create an HTML snippet from a 'String'.
+--
+string :: String    -- ^ String to insert.
+       -> Markup ev -- ^ Resulting HTML fragment.
+string = Content . String
+{-# INLINE string #-}
+
+-- | Create an HTML snippet from a 'String' without escaping
+--
+preEscapedString :: String    -- ^ String to insert.
+                 -> Markup ev -- ^ Resulting HTML fragment.
+preEscapedString = Content . PreEscaped . String
+{-# INLINE preEscapedString #-}
+
+-- | Insert a 'ByteString'. This is an unsafe operation:
+--
+-- * The 'ByteString' could have the wrong encoding.
+--
+-- * The 'ByteString' might contain illegal HTML characters (no escaping is
+--   done).
+--
+unsafeByteString :: ByteString    -- ^ Value to insert.
+                 -> Markup ev     -- ^ Resulting HTML fragment.
+unsafeByteString = Content . ByteString
+{-# INLINE unsafeByteString #-}
+
+-- | Insert a lazy 'BL.ByteString'. See 'unsafeByteString' for reasons why this
+-- is an unsafe operation.
+--
+unsafeLazyByteString :: BL.ByteString  -- ^ Value to insert
+                     -> Markup ev      -- ^ Resulting HTML fragment
+unsafeLazyByteString = mconcat . map unsafeByteString . BL.toChunks
+{-# INLINE unsafeLazyByteString #-}
+
+-- | Create a 'Tag' from some 'Text'.
+--
+textTag :: Text  -- ^ Text to create a tag from
+        -> Tag   -- ^ Resulting tag
+textTag t = Tag $ StaticString (T.unpack t ++) (T.encodeUtf8 t) t
+
+-- | Create a 'Tag' from a 'String'.
+--
+stringTag :: String  -- ^ String to create a tag from
+          -> Tag     -- ^ Resulting tag
+stringTag = Tag . fromString
+
+-- | Render an attribute value from 'Text'.
+--
+textValue :: Text            -- ^ The actual value.
+          -> AttributeValue  -- ^ Resulting attribute value.
+textValue = AttributeValue . Text
+{-# INLINE textValue #-}
+
+-- | Render an attribute value from 'Text' without escaping.
+--
+preEscapedTextValue :: Text            -- ^ The actual value
+                    -> AttributeValue  -- ^ Resulting attribute value
+preEscapedTextValue = AttributeValue . PreEscaped . Text
+{-# INLINE preEscapedTextValue #-}
+
+-- | A variant of 'textValue' for lazy 'LT.Text'
+--
+lazyTextValue :: LT.Text         -- ^ The actual value
+              -> AttributeValue  -- ^ Resulting attribute value
+lazyTextValue = mconcat . map textValue . LT.toChunks
+{-# INLINE lazyTextValue #-}
+
+-- | A variant of 'preEscapedTextValue' for lazy 'LT.Text'
+--
+preEscapedLazyTextValue :: LT.Text         -- ^ The actual value
+                        -> AttributeValue  -- ^ Resulting attribute value
+preEscapedLazyTextValue = mconcat . map preEscapedTextValue . LT.toChunks
+{-# INLINE preEscapedLazyTextValue #-}
+
+-- | Create an attribute value from a 'String'.
+--
+stringValue :: String -> AttributeValue
+stringValue = AttributeValue . String
+{-# INLINE stringValue #-}
+
+-- | Create an attribute value from a 'String' without escaping.
+--
+preEscapedStringValue :: String -> AttributeValue
+preEscapedStringValue = AttributeValue . PreEscaped . String
+{-# INLINE preEscapedStringValue #-}
+
+-- | Create an attribute value from a 'ByteString'. See 'unsafeByteString'
+-- for reasons why this might not be a good idea.
+--
+unsafeByteStringValue :: ByteString      -- ^ ByteString value
+                      -> AttributeValue  -- ^ Resulting attribute value
+unsafeByteStringValue = AttributeValue . ByteString
+{-# INLINE unsafeByteStringValue #-}
+
+-- | Create an attribute value from a lazy 'BL.ByteString'. See
+-- 'unsafeByteString' for reasons why this might not be a good idea.
+--
+unsafeLazyByteStringValue :: BL.ByteString   -- ^ ByteString value
+                          -> AttributeValue  -- ^ Resulting attribute value
+unsafeLazyByteStringValue = mconcat . map unsafeByteStringValue . BL.toChunks
+{-# INLINE unsafeLazyByteStringValue #-}
+
+-- | Used for applying attributes. You should not define your own instances of
+-- this class.
+class Attributable h ev | h -> ev where
+    -- | Apply an attribute to an element.
+    --
+    -- Example:
+    --
+    -- > img ! src "foo.png"
+    --
+    -- Result:
+    --
+    -- > <img src="foo.png" />
+    --
+    -- This can be used on nested elements as well.
+    --
+    -- Example:
+    --
+    -- > p ! style "float: right" $ "Hello!"
+    --
+    -- Result:
+    --
+    -- > <p style="float: right">Hello!</p>
+    --
+    (!) :: h -> Attribute ev -> h
+
+instance Attributable (MarkupM ev a) ev where
+    h ! (Attribute f) = f h
+    {-# INLINE (!) #-}
+
+instance Attributable (MarkupM ev a -> MarkupM ev b) ev where
+    h ! f = (! f) . h
+    {-# INLINE (!) #-}
+
+-- | Shorthand for setting an attribute depending on a conditional.
+--
+-- Example:
+--
+-- > p !? (isBig, A.class "big") $ "Hello"
+--
+-- Gives the same result as:
+--
+-- > (if isBig then p ! A.class "big" else p) "Hello"
+--
+(!?) :: Attributable h ev => h -> (Bool, Attribute ev) -> h
+(!?) h (c, a) = if c then h ! a else h
+
+-- | Mark HTML as external data. External data can be:
+--
+-- * CSS data in a @<style>@ tag;
+--
+-- * Script data in a @<script>@ tag.
+--
+-- This function is applied automatically when using the @style@ or @script@
+-- combinators.
+--
+external :: MarkupM ev a -> MarkupM ev a
+external (MapActions f x) = MapActions f (external x)
+external (OnEvent ev x) = OnEvent ev (external x)
+external (Content x) = Content $ External x
+external (Append x y) = Append (external x) (external y)
+external (Parent x y z i) = Parent x y z $ external i
+external (CustomParent x i) = CustomParent x $ external i
+external (AddAttribute x y z i) = AddAttribute x y z $ external i
+external (AddCustomAttribute x y i) = AddCustomAttribute x y $ external i
+external x = x
+{-# INLINABLE external #-}
+
+-- | Take only the text content of an HTML tree.
+--
+-- > contents $ do
+-- >     p ! $ "Hello "
+-- >     p ! $ "Word!"
+--
+-- Result:
+--
+-- > Hello World!
+--
+contents :: MarkupM ev a -> MarkupM ev' b
+contents (MapActions _ c)           = contents c
+contents (OnEvent _ c)              = contents c
+contents (Parent _ _ _ c)           = contents c
+contents (CustomParent _ c)         = contents c
+contents (Content c)                = Content c
+contents (Append c1 c2)             = Append (contents c1) (contents c2)
+contents (AddAttribute _ _ _ c)     = contents c
+contents (AddCustomAttribute _ _ c) = contents c
+contents _                          = Empty
+
+-- | Check if a 'Markup' value is completely empty (renders to the empty
+-- string).
+null :: MarkupM ev a -> Bool
+null markup = case markup of
+    MapActions _ c           -> null c
+    OnEvent _ c              -> null c
+    Parent _ _ _ _           -> False
+    CustomParent _ _         -> False
+    Leaf _ _ _               -> False
+    CustomLeaf _ _           -> False
+    Content c                -> emptyChoiceString c
+    Append c1 c2             -> null c1 && null c2
+    AddAttribute _ _ _ c     -> null c
+    AddCustomAttribute _ _ c -> null c
+    Empty                    -> True
+  where
+    emptyChoiceString cs = case cs of
+        Static ss                -> emptyStaticString ss
+        String s                 -> List.null s
+        Text t                   -> T.null t
+        ByteString bs            -> B.null bs
+        PreEscaped c             -> emptyChoiceString c
+        External c               -> emptyChoiceString c
+        AppendChoiceString c1 c2 -> emptyChoiceString c1 && emptyChoiceString c2
+        EmptyChoiceString        -> True
+
+    emptyStaticString = B.null . getUtf8ByteString
diff --git a/src/Text/Blaze/Front/Renderer.hs b/src/Text/Blaze/Front/Renderer.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Blaze/Front/Renderer.hs
@@ -0,0 +1,237 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+
+-- | A preliminary renderer that produces `JS` components when run using
+-- Fay.
+--
+module Text.Blaze.Front.Renderer where
+
+import qualified Data.ByteString.Char8 as SBC
+import           Data.List             (isInfixOf)
+import           Data.Text             (Text)
+import qualified Data.Text             as T
+import qualified Data.ByteString       as S
+import           Data.Text.Lazy.Builder (Builder)
+import qualified Data.Text.Lazy.Builder as TLB
+import qualified Data.Text.Lazy         as TL
+
+import           Prelude               hiding (span)
+
+import           Text.Blaze.Front
+import           Text.Blaze.Front.Internal
+
+-- import qualified Text.Blaze as B
+import qualified Text.Blaze.Html as B
+
+import           Bridge
+
+------------------------------------------------------------------------------
+-- Rendering
+------------------------------------------------------------------------------
+
+
+-- | Escape predefined XML entities in a text value
+--
+escapeMarkupEntities :: Text     -- ^ Text to escape
+                   -> Builder  -- ^ Resulting text builder
+escapeMarkupEntities = T.foldr escape mempty
+  where
+    escape :: Char -> Builder -> Builder
+    escape '<'  b = TLB.fromText "&lt;"   `mappend` b
+    escape '>'  b = TLB.fromText "&gt;"   `mappend` b
+    escape '&'  b = TLB.fromText "&amp;"  `mappend` b
+    escape '"'  b = TLB.fromText "&quot;" `mappend` b
+    escape '\'' b = TLB.fromText "&#39;"  `mappend` b
+    escape x    b = TLB.singleton x       `mappend` b
+
+-- | Render a 'ChoiceString'.
+--
+fromChoiceString :: ChoiceString  -- ^ String to render
+                 -> Builder        -- ^ String to append
+                 -> Builder        -- ^ Resulting string
+fromChoiceString (Static s)     = (((TLB.fromText . getText) s) `mappend`)
+fromChoiceString (String s)     = (((escapeMarkupEntities . T.pack) s) `mappend`)
+fromChoiceString (Text s)       = ((escapeMarkupEntities s) `mappend`)
+fromChoiceString (ByteString s) = (((TLB.fromText . T.pack . SBC.unpack) s) `mappend`)
+fromChoiceString (PreEscaped x) =
+    case x of
+      String s -> (((TLB.fromText . T.pack) s) `mappend`)
+      Text   s -> ((TLB.fromText s) `mappend`)
+      s        -> fromChoiceString s
+fromChoiceString (External x) = case x of
+    -- Check that the sequence "</" is *not* in the external data.
+    String s     -> if "</" `isInfixOf` s then id else (((TLB.fromText . T.pack) s) `mappend`)
+    Text   s     -> if "</" `T.isInfixOf` s then id else ((TLB.fromText s) `mappend`)
+    ByteString s -> if "</" `S.isInfixOf` s then id else (((TLB.fromText . T.pack . SBC.unpack) s) `mappend`)
+    s            -> fromChoiceString s
+fromChoiceString (AppendChoiceString x y) =
+    fromChoiceString x . fromChoiceString y
+fromChoiceString EmptyChoiceString = id
+
+
+-- | Render some 'Markup' to a virtual dom.
+--
+-- This function is morally pure.
+--
+render
+    :: Show act
+    => Markup act
+    -> Builder
+    -> Builder
+render = go 0 id
+  where
+    go :: forall act' b. Int
+      -> (Builder -> Builder)
+      -> MarkupM act' b
+      -> Builder -> Builder
+    go i attrs (Parent _ open close content) =
+        ind i
+        . (((TLB.fromText . getText) open) `mappend`)
+        . attrs . ((TLB.fromText ">\n") `mappend`)
+        . go (inc i) id content . ind i
+        . (((TLB.fromText . getText) close) `mappend`)
+        .  ((TLB.singleton '\n') `mappend`)
+    go i attrs (CustomParent tag content) =
+        ind i
+        . ((TLB.singleton '<') `mappend`)
+        . fromChoiceString tag . (attrs)
+        . ((TLB.fromText ">\n") `mappend`)
+        . go (inc i) id content . ind i
+        . ((TLB.fromText "</") `mappend`)
+        . fromChoiceString tag
+        . ((TLB.fromText ">\n") `mappend`)
+    go i attrs (Leaf _ begin end) =
+        ind i
+        . (((TLB.fromText . getText) begin) `mappend`)
+        . (attrs)
+        . (((TLB.fromText . getText) end) `mappend`)
+        . ((TLB.singleton '\n') `mappend`)
+    go i attrs (CustomLeaf tag close) =
+        ind i
+        . ((TLB.singleton '<') `mappend`)
+        . fromChoiceString tag . attrs
+        . ((TLB.fromText (if close then " />\n" else ">\n")) `mappend`)
+    go i attrs (AddAttribute _ key value h) = flip (go i) h $
+        (((TLB.fromText . getText) key) `mappend`)
+        . fromChoiceString value
+        . ((TLB.singleton '"') `mappend`) . attrs
+    go i attrs (AddCustomAttribute key value h) = flip (go i) h $
+        ((TLB.singleton ' ') `mappend`)
+        . fromChoiceString key
+        . ((TLB.fromText "=\"") `mappend`)
+        . fromChoiceString value
+        . ((TLB.singleton '"') `mappend`) .  attrs
+    go i _ (Content content) = ind i . fromChoiceString content
+        . ((TLB.singleton '\n') `mappend`)
+    go i attrs (Append h1 h2) = go i attrs h1 . go i attrs h2
+    go _ _ (Empty) = id
+    go _ _ (MapActions _ _) = id
+    go i attrs (OnEvent _ h) = go i attrs h  -- will be registered later through registerEvent
+    {-# NOINLINE go #-}
+
+    -- Increase the indentation
+    inc = (+) 4
+
+    -- Produce appending indentation
+    ind i = ((TLB.fromString (replicate i ' ')) `mappend`)
+{-# INLINE render #-}
+
+renderHtml
+    :: Show act
+    => Markup act
+    -> String
+renderHtml html = TL.unpack . TLB.toLazyText $ render html TLB.flush
+{-# INLINE renderHtml #-}
+
+------------------------------------------------------------------------------
+-- Event handler callback construction
+------------------------------------------------------------------------------
+
+-- | JS defines the following event types:
+data EventType
+      -- Clipboard Events
+    = OnCopyE | OnCutE | OnPasteE
+      -- Keyboard Events
+    | OnKeyDownE | OnKeyPressE | OnKeyUpE
+      -- Focus Events
+    | OnFocusE | OnBlurE
+      -- Form Events
+    | OnChangeE | OnInputE | OnSubmitE
+      -- Mouse Events
+    | OnClickE | OnDoubleClickE | OnDragE | OnDragEndE | OnDragEnterE
+    | OnDragExitE | OnDragLeaveE | OnDragOverE | OnDragStartE | OnDropE
+    | OnMouseDownE | OnMouseEnterE | OnMouseLeaveE | OnMouseMoveE
+    | OnMouseOutE | OnMouseOverE | OnMouseUpE
+      -- Touch Events
+    | OnTouchCancelE | OnTouchEndE | OnTouchMoveE | OnTouchStartE
+      -- UI Events
+    | OnScrollE
+      -- Wheel Events
+    | OnWheelE
+
+eventName :: EventType -> String
+eventName _ = ""
+{-eventName ev = case ev of
+    OnCopyE        -> "onCopy"
+    OnCutE         -> "onCut"
+    OnPasteE       -> "onPaste"
+    OnKeyDownE     -> "onKeyDown"
+    OnKeyPressE    -> "onKeyPress"
+    OnKeyUpE       -> "onKeyUp"
+    OnFocusE       -> "onFocus"
+    OnBlurE        -> "onBlur"
+    OnChangeE      -> "onChange"
+    OnInputE       -> "onInput"
+    OnSubmitE      -> "onSubmit"
+    OnClickE       -> "onClick"
+    OnDoubleClickE -> "onDoubleClick"
+    OnDragE        -> "onDrag"
+    OnDragEndE     -> "onDragEnd"
+    OnDragEnterE   -> "onDragEnter"
+    OnDragExitE    -> "onDragExit"
+    OnDragLeaveE   -> "onDragLeave"
+    OnDragOverE    -> "onDragOver"
+    OnDragStartE   -> "onDragStart"
+    OnDropE        -> "onDrop"
+    OnMouseDownE   -> "onMouseDown"
+    OnMouseEnterE  -> "onMouseEnter"
+    OnMouseLeaveE  -> "onMouseLeave"
+    OnMouseMoveE   -> "onMouseMove"
+    OnMouseOutE    -> "onMouseOut"
+    OnMouseOverE   -> "onMouseOver"
+    OnMouseUpE     -> "onMouseUp"
+    OnTouchCancelE -> "onTouchCancel"
+    OnTouchEndE    -> "onTouchEnd"
+    OnTouchMoveE   -> "onTouchMove"
+    OnTouchStartE  -> "onTouchStart"
+    OnScrollE      -> "onScroll"
+    OnWheelE       -> "onWheel"-}
+
+data Handler
+    = IgnoreEvent
+    | HandleEvent (IO (Bool -> IO ()))
+      -- ^ Contains an IO action which generates the callback to attach to the event
+
+registerEvents
+    :: Markup a -> [CallbackAction a] -> [CallbackAction a]
+registerEvents x = go x
+  where
+    go :: MarkupM a b -> [CallbackAction a] -> [CallbackAction a]
+    go (MapActions _ _) = id
+    go (Parent _ _ _ content) = go content
+    go (CustomParent _ content) = go content
+    go (Leaf _ _ _) = id
+    go (CustomLeaf _ _) = id
+    go (Content _) = id
+    go (Append a b) = (go a) . (go b)
+    go (AddAttribute _ _ _ a) = go a
+    go (AddCustomAttribute _ _ a) = go a
+    go Empty = id
+    go (OnEvent eh a) = ((reg eh) :) . (go a)
+
+    reg x' = CallbackAction x'
+
+renderNewMarkup :: Show act => Markup act -> B.Html
+renderNewMarkup = B.preEscapedToHtml . T.pack . renderHtml
+
diff --git a/src/Text/Blaze/Front/Svg.hs b/src/Text/Blaze/Front/Svg.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Blaze/Front/Svg.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | This module exports SVG combinators.
+module Text.Blaze.Front.Svg
+    ( module Text.Blaze.Front
+    , Svg
+    , toSvg
+    , preEscapedToSvg
+
+    , circle
+    , defs
+    , ellipse
+    , g
+    , line
+    , linearGradient
+    , mask
+    , path
+    , pattern
+    , polygon
+    , polyline
+    , radialGradient
+    , rect
+    , stop
+    , text
+    , tspan
+    ) where
+
+import Text.Blaze.Front
+import Text.Blaze.Front.Internal hiding (text)
+
+type Svg ev = Markup ev
+
+toSvg :: ToMarkup a => a -> Svg ev
+toSvg = toMarkup
+
+preEscapedToSvg :: ToMarkup a => a -> Svg ev
+preEscapedToSvg = preEscapedToMarkup
+
+circle :: Svg ev
+circle = Leaf "circle" "<circle" ">"
+
+defs :: Svg ev -> Svg ev
+defs = Parent "defs" "<defs" "</defs>"
+
+ellipse :: Svg ev
+ellipse = Leaf "ellipse" "<ellipse" ">"
+
+g :: Svg ev -> Svg ev
+g = Parent "g" "<g" "</g>"
+
+line :: Svg ev
+line = Leaf "line" "<line" ">"
+
+linearGradient :: Svg ev -> Svg ev
+linearGradient = Parent "linearGradient" "<linearGradient" "</linearGradient>"
+
+mask :: Svg ev -> Svg ev
+mask = Parent "mask" "<mask" "</mask>"
+
+path :: Svg ev
+path = Leaf "path" "<path" ">"
+
+pattern :: Svg ev -> Svg ev
+pattern = Parent "pattern" "<pattern" "</pattern>"
+
+polygon :: Svg ev
+polygon = Leaf "polygon" "<polygon" ">"
+
+polyline :: Svg ev
+polyline = Leaf "polyline" "<polyline" ">"
+
+radialGradient :: Svg ev -> Svg ev
+radialGradient = Parent "radialGradient" "<radialGradient" "</radialGradient>"
+
+rect :: Svg ev
+rect = Leaf "rect" "<rect" ">"
+
+stop :: Svg ev
+stop = Leaf "stop" "<stop" ">"
+
+text :: Svg ev -> Svg ev
+text = Parent "text" "<text" "</text>"
+
+tspan :: Svg ev -> Svg ev
+tspan = Parent "tspan" "<tspan" "</tspan>"
diff --git a/src/Text/Blaze/Front/Svg/Attributes.hs b/src/Text/Blaze/Front/Svg/Attributes.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Blaze/Front/Svg/Attributes.hs
@@ -0,0 +1,180 @@
+-- | This module exports combinators that provide you with the
+-- ability to set attributes on SVG elements.
+--
+{-# LANGUAGE OverloadedStrings #-}
+module Text.Blaze.Front.Svg.Attributes
+    ( cx
+    , cy
+    , d
+    , dx
+    , dy
+    , fill
+    , fillOpacity
+    , fontFamily
+    , fontSize
+    , fx
+    , fy
+    , gradientTransform
+    , gradientUnits
+    , markerEnd
+    , markerMid
+    , markerStart
+    , offset
+    , opacity
+    , patternContentUnits
+    , patternUnits
+    , points
+    , preserveAspectRatio
+    , r
+    , rx
+    , ry
+    , spreadMethod
+    , stopColor
+    , stopOpacity
+    , stroke
+    , strokeDasharray
+    , strokeLinecap
+    , strokeOpacity
+    , strokeWidth
+    , textAnchor
+    , transform
+    , version
+    , viewBox
+    , x1
+    , x2
+    , x
+    , y1
+    , y2
+    , y
+    ) where
+
+import Text.Blaze.Front.Internal (Attribute, AttributeValue, attribute)
+
+cx :: AttributeValue -> Attribute ev
+cx = attribute "cx" " cx=\""
+
+cy :: AttributeValue -> Attribute ev
+cy = attribute "cy" " cy=\""
+
+d :: AttributeValue -> Attribute ev
+d = attribute "d" " d=\""
+
+dx :: AttributeValue -> Attribute ev
+dx = attribute "dx" " dx=\""
+
+dy :: AttributeValue -> Attribute ev
+dy = attribute "dy" " dy=\""
+
+fill :: AttributeValue -> Attribute ev
+fill = attribute "fill" " fill=\""
+
+fillOpacity :: AttributeValue -> Attribute ev
+fillOpacity = attribute "fillOpacity" " fillOpacity=\""
+
+fontFamily :: AttributeValue -> Attribute ev
+fontFamily = attribute "fontFamily" " fontFamily=\""
+
+fontSize :: AttributeValue -> Attribute ev
+fontSize = attribute "fontSize" " fontSize=\""
+
+fx :: AttributeValue -> Attribute ev
+fx = attribute "fx" " fx=\""
+
+fy :: AttributeValue -> Attribute ev
+fy = attribute "fy" " fy=\""
+
+gradientTransform :: AttributeValue -> Attribute ev
+gradientTransform = attribute "gradientTransform" " gradientTransform=\""
+
+gradientUnits :: AttributeValue -> Attribute ev
+gradientUnits = attribute "gradientUnits" " gradientUnits=\""
+
+markerEnd :: AttributeValue -> Attribute ev
+markerEnd = attribute "markerEnd" " markerEnd=\""
+
+markerMid :: AttributeValue -> Attribute ev
+markerMid = attribute "markerMid" " markerMid=\""
+
+markerStart :: AttributeValue -> Attribute ev
+markerStart = attribute "markerStart" " markerStart=\""
+
+offset :: AttributeValue -> Attribute ev
+offset = attribute "offset" " offset=\""
+
+opacity :: AttributeValue -> Attribute ev
+opacity = attribute "opacity" " opacity=\""
+
+patternContentUnits :: AttributeValue -> Attribute ev
+patternContentUnits = attribute "patternContentUnits" " patternContentUnits=\""
+
+patternUnits :: AttributeValue -> Attribute ev
+patternUnits = attribute "patternUnits" " patternUnits=\""
+
+points :: AttributeValue -> Attribute ev
+points = attribute "points" " points=\""
+
+preserveAspectRatio :: AttributeValue -> Attribute ev
+preserveAspectRatio = attribute "preserveAspectRatio" " preserveAspectRatio=\""
+
+r :: AttributeValue -> Attribute ev
+r = attribute "r" " r=\""
+
+rx :: AttributeValue -> Attribute ev
+rx = attribute "rx" " rx=\""
+
+ry :: AttributeValue -> Attribute ev
+ry = attribute "ry" " ry=\""
+
+spreadMethod :: AttributeValue -> Attribute ev
+spreadMethod = attribute "spreadMethod" " spreadMethod=\""
+
+stopColor :: AttributeValue -> Attribute ev
+stopColor = attribute "stopColor" " stopColor=\""
+
+stopOpacity :: AttributeValue -> Attribute ev
+stopOpacity = attribute "stopOpacity" " stopOpacity=\""
+
+stroke :: AttributeValue -> Attribute ev
+stroke = attribute "stroke" " stroke=\""
+
+strokeDasharray :: AttributeValue -> Attribute ev
+strokeDasharray = attribute "strokeDasharray" " strokeDasharray=\""
+
+strokeLinecap :: AttributeValue -> Attribute ev
+strokeLinecap = attribute "strokeLinecap" " strokeLinecap=\""
+
+strokeOpacity :: AttributeValue -> Attribute ev
+strokeOpacity = attribute "strokeOpacity" " strokeOpacity=\""
+
+strokeWidth :: AttributeValue -> Attribute ev
+strokeWidth = attribute "strokeWidth" " strokeWidth=\""
+
+textAnchor :: AttributeValue -> Attribute ev
+textAnchor = attribute "textAnchor" " textAnchor=\""
+
+transform :: AttributeValue -> Attribute ev
+transform = attribute "transform" " transform=\""
+
+version :: AttributeValue -> Attribute ev
+version = attribute "version" " version=\""
+
+viewBox :: AttributeValue -> Attribute ev
+viewBox = attribute "viewBox" " viewBox=\""
+
+x1 :: AttributeValue -> Attribute ev
+x1 = attribute "x1" " x1=\""
+
+x2 :: AttributeValue -> Attribute ev
+x2 = attribute "x2" " x2=\""
+
+x :: AttributeValue -> Attribute ev
+x = attribute "x" " x=\""
+
+y1 :: AttributeValue -> Attribute ev
+y1 = attribute "y1" " y1=\""
+
+y2 :: AttributeValue -> Attribute ev
+y2 = attribute "y2" " y2=\""
+
+y :: AttributeValue -> Attribute ev
+y = attribute "y" " y=\""
