packages feed

front (empty) → 0.0.0.1

raw patch · 14 files changed

+5501/−0 lines, 14 filesdep +basedep +blaze-htmldep +blaze-markupsetup-changed

Dependencies added: base, blaze-html, blaze-markup, bytestring, fay, text

Files

+ ChangeLog.md view
@@ -0,0 +1,5 @@+# Revision history for front++## 0.0.0.1 -- YYYY-mm-dd++* First version. Released on an unsuspecting world.
+ LICENSE view
@@ -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.
+ README.md view
@@ -0,0 +1,1 @@+# front
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ front.cabal view
@@ -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
+ shared/Bridge.hs view
@@ -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
+ src/Text/Blaze/Front.hs view
@@ -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 #-}
+ src/Text/Blaze/Front/Event.hs view
@@ -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 #-}
+ src/Text/Blaze/Front/Html5.hs view
@@ -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 #-}
+ src/Text/Blaze/Front/Html5/Attributes.hs view
@@ -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 #-}
+ src/Text/Blaze/Front/Internal.hs view
@@ -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
+ src/Text/Blaze/Front/Renderer.hs view
@@ -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+
+ src/Text/Blaze/Front/Svg.hs view
@@ -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>"
+ src/Text/Blaze/Front/Svg/Attributes.hs view
@@ -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=\""