diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,8 @@
+## 2.0
+
+* Use variadic HTML terms.
+* Add lazy Text instance for ToHtml.
+
+## 1.0
+
+* Initial version.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -26,7 +26,7 @@
 Elements nest by function application:
 
 ``` haskell
-λ> table_ (tr_ (td_ (p_ "Hello, World!")))
+λ> table_ (tr_ (td_ (p_ "Hello, World!"))) :: Html ()
 ```
 
 ``` html
@@ -36,7 +36,7 @@
 Elements are juxtaposed via monoidal append:
 
 ``` haskell
-λ> p_ "hello" <> p_ "sup"
+λ> p_ "hello" <> p_ "sup" :: Html ()
 ```
 
 ``` html
@@ -46,7 +46,7 @@
 Or monadic sequencing:
 
 ``` haskell
-λ> div_ (do p_ "hello"; p_ "sup")
+λ> div_ (do p_ "hello"; p_ "sup") :: Html ()
 ```
 
 ``` html
@@ -56,7 +56,7 @@
 Attributes are set using the 'with' combinator:
 
 ``` haskell
-λ> with p_ [class_ "brand"] "Lucid Inc"
+λ> with p_ [class_ "brand"] "Lucid Inc" :: Html ()
 ```
 
 ``` html
@@ -121,7 +121,10 @@
 You can use `lift` to call parent monads.
 
 ``` haskell
-λ> runReader (renderTextT (html_ (body_ (do name <- lift ask; p_ (toHtml name)))))
+λ> runReader (renderTextT (html_ (body_ (do name <- lift ask
+                                            p_ [class_ "name"] (toHtml name)))))
              ("Chris" :: String)
-"<html><body><p>Chris</p></body></html>"
+```
+``` html
+"<html><body><p class=\"name\">Chris</p></body></html>"
 ```
diff --git a/lucid.cabal b/lucid.cabal
--- a/lucid.cabal
+++ b/lucid.cabal
@@ -1,5 +1,5 @@
 name:                lucid
-version:             1.0
+version:             2.0
 synopsis:            Clear to write, read and edit DSL for HTML
 description:         Clear to write, read and edit DSL for HTML. See the 'Lucid' module
                      for description and documentation.
@@ -12,7 +12,7 @@
 category:            Web
 build-type:          Simple
 cabal-version:       >=1.8
-extra-source-files:  README.md
+extra-source-files:  README.md, CHANGELOG.md
 
 library
   hs-source-dirs:    src/
@@ -24,6 +24,7 @@
   build-depends:     base >= 4 && <5
                    , blaze-builder
                    , bytestring
+                   , containers
                    , mtl
                    , text
                    , transformers
@@ -33,6 +34,7 @@
     type: exitcode-stdio-1.0
     main-is: Main.hs
     hs-source-dirs: test
+    other-modules: Example1
     build-depends: base,
                    lucid,
                    HUnit,
diff --git a/src/Lucid.hs b/src/Lucid.hs
--- a/src/Lucid.hs
+++ b/src/Lucid.hs
@@ -1,4 +1,10 @@
 -- | Clear to write, read and edit DSL for writing HTML
+--
+-- See "Lucid.Html5" for a complete list of Html5 combinators. That
+-- module is re-exported from this module for your convenience.
+--
+-- See "Lucid.Base" for lower level functions like
+-- `makeElement`, `makeAttribute`, 'termRaw', etc.
 
 module Lucid
   (-- * Intro
@@ -14,10 +20,12 @@
   ,runHtmlT
    -- * Types
   ,Html
+  ,Attribute
    -- * Classes
+   -- $overloaded
+  ,Term(..)
   ,ToHtml(..)
-  ,Mixed(..)
-  ,With
+  ,With(..)
   -- * Re-exports
   ,module Lucid.Html5)
  where
@@ -32,7 +40,9 @@
 --
 -- 'p_', 'class_', 'table_', 'style_'
 --
--- See "Lucid.Html5" for a complete list of Html5 combinators.
+-- Note: If you're testing in the REPL you need to add a type annotation to
+-- indicate that you want HTML. In normal code your top-level
+-- declaration signatures handle that.
 --
 -- Plain text is written using the @OverloadedStrings@ and
 -- @ExtendedDefaultRules@ extensions, and is automatically escaped:
@@ -40,45 +50,92 @@
 -- >>> "123 < 456" :: Html ()
 -- 123 &lt; 456
 --
+-- Except some elements, like 'script_':
+--
+-- >>> script_ "alert('Hello!' > 12)" :: Html ()
+-- <script>alert('Hello!' > 12)</script>
+--
 -- Elements nest by function application:
 --
--- >>> table_ (tr_ (td_ (p_ "Hello, World!")))
+-- >>> table_ (tr_ (td_ (p_ "Hello, World!"))) :: Html ()
 -- <table><tr><td><p>Hello, World!</p></td></tr></table>
 --
 -- Elements are juxtaposed via monoidal append:
 --
--- >>> p_ "hello" <> p_ "sup"
+-- >>> p_ "hello" <> p_ "sup" :: Html ()
 -- <p>hello</p><p>sup</p>
 --
 -- Or monadic sequencing:
 --
--- >>> div_ (do p_ "hello"; p_ "sup")
+-- >>> div_ (do p_ "hello"; p_ "sup") :: Html ()
 -- <div><p>hello</p><p>sup</p></div>
 --
--- Attributes are set using the 'with' combinator:
+-- Attributes are set by providing an argument list:
 --
--- >>> with p_ [class_ "brand"] "Lucid Inc"
+-- >>> p_ [class_ "brand"] "Lucid Inc" :: Html ()
 -- <p class="brand">Lucid Inc</p>
 --
+-- >>> p_ [data_ "zot" "foo",checked_] "Go!" :: Html ()
+-- <p data-zot="foo" checked>go</p>
+--
+-- Attribute and element terms are not conflicting:
+--
+-- >>> style_ [style_ "inception"] "Go deeper." :: Html ()
+-- <style style="inception">Go deeper.</style>
+--
 -- Here is a fuller example of Lucid:
 --
 -- @
--- with table_ [rows_ "2"]
---      (tr_ (do with td_ [class_ "top",colspan_ "2"]
---                    (p_ "Hello, attributes!")
---               td_ "yay!"))
+-- table_ [rows_ "2"]
+--        (tr_ (do td_ [class_ "top",colspan_ "2",style_ "color:red"]
+--                     (p_ "Hello, attributes!")
+--                 td_ "yay!"))
 -- @
 --
+-- Elements (and some attributes) are variadic and overloaded, see the
+-- 'Term' class for more explanation about that.
+--
 -- For proper rendering you can easily run some HTML immediately with:
 --
 -- >>> renderText (p_ "Hello!")
 -- > "<p>Hello!</p>"
 --
--- >>> renderBS (with p_ [style_ "color:red"] "Hello!")
+-- >>> renderBS (p_ [style_ "color:red"] "Hello!")
 -- "<p style=\"color:red\">Hello!</p>"
 --
 -- For ease of use in GHCi, there is a 'Show' instance, as
 -- demonstrated above.
+
+-- $overloaded
+--
+-- To support convenient use of HTML terms, HTML terms are
+-- overloaded. Here are the following types possible for an element
+-- term accepting attributes and/or children:
+--
+-- @
+-- p_ :: Term arg result => arg -> result
+-- p_ :: Monad m => [Attribute] -> HtmlT m () -> HtmlT m ()
+-- p_ :: Monad m => HtmlT m () -> HtmlT m ()
+-- @
+--
+-- The first is the generic form. The latter two are the possible
+-- types for an element.
+--
+-- Elements that accept no content are always concrete:
+--
+-- @
+-- input_ :: Monad m => [Attribute] -> HtmlT m ()
+-- @
+--
+-- And some attributes share the same name as attributes, so you can
+-- also overload them as attributes:
+--
+-- @
+-- style_ :: TermRaw arg result => arg -> result
+-- style_ :: Monad m => [Attribute] -> Text -> HtmlT m ()
+-- style_ :: Monad m => Text -> HtmlT m ()
+-- style_ :: Text -> Attribute
+-- @
 
 -- $running
 --
diff --git a/src/Lucid/Base.hs b/src/Lucid/Base.hs
--- a/src/Lucid/Base.hs
+++ b/src/Lucid/Base.hs
@@ -1,3 +1,6 @@
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE ExtendedDefaultRules #-}
+{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE KindSignatures #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE GADTs #-}
@@ -18,17 +21,18 @@
   ,evalHtmlT
   ,runHtmlT
   -- * Combinators
-  ,with
   ,makeElement
   ,makeElementNoEnd
+  ,makeAttribute
    -- * Types
   ,Html
   ,HtmlT
+  ,Attribute
    -- * Classes
+  ,Term(..)
+  ,TermRaw(..)
   ,ToHtml(..)
-  ,Mixed(..)
-  ,MixedRaw(..)
-  ,With)
+  ,With(..))
   where
 
 import           Blaze.ByteString.Builder (Builder)
@@ -52,6 +56,10 @@
 --------------------------------------------------------------------------------
 -- Types
 
+-- | A simple attribute.
+newtype Attribute = Attribute (Text,Text)
+  deriving (Show,Eq)
+
 -- | Simple HTML builder type. Defined in terms of 'HtmlT'. Check out
 -- that type for instance information.
 --
@@ -134,55 +142,113 @@
   toHtml m = HtmlT (return ((\_ _ -> encode m),()))
   toHtmlRaw m = HtmlT (return ((\_ _ -> Blaze.fromText m),()))
 
--- | Used for names that are mixed, e.g. 'style_'.
-class Mixed a r where
-  mixed :: Text -> a -> r
+instance ToHtml LT.Text where
+  toHtml m = HtmlT (return ((\_ _ -> encodeLazy m),()))
+  toHtmlRaw m = HtmlT (return ((\_ _ -> Blaze.fromLazyText m),()))
 
--- | Attributes can be a mixed thing e.g. 'style_'.
-instance (a ~ Text) => Mixed a (Text,Text) where
-  mixed key value = (key,value)
+-- | Used to construct HTML terms.
+--
+-- Simplest use: p_ = term "p" yields 'Lucid.Html5.p_'.
+--
+-- Very overloaded for three cases:
+--
+-- * The first case is the basic @arg@ of @[(Text,Text)]@ which will
+--   return a function that wants children.
+-- * The second is an @arg@ which is @HtmlT m ()@, in which case the
+--   term accepts no attributes and just the children are used for the
+--   element.
+-- * Finally, this is also used for overloaded attributes, like
+--   `Lucid.Html5.style_` or `Lucid.Html5.title_`. If a return type of @(Text,Text)@ is inferred
+--   then an attribute will be made.
+--
+-- The instances look intimidating but actually the constraints make
+-- it very general so that type inference works well even in the
+-- presence of things like @OverloadedLists@ and such.
+class Term arg result | result -> arg where
+  -- | Used for constructing elements e.g. @term "p"@ yields 'Lucid.Html5.p_'.
+  term :: Text   -- ^ Name of the element or attribute.
+       -> arg    -- ^ Either an attribute list or children.
+       -> result -- ^ Result: either an element or an attribute.
+  term = flip termWith []
+  -- | Use this if you want to make an element which inserts some
+  -- pre-prepared attributes into the element.
+  termWith :: Text          -- ^ Name.
+           -> [Attribute]   -- ^ Attribute transformer.
+           -> arg           -- ^ Some argument.
+           -> result        -- ^ Result: either an element or an attribute.
 
--- | HTML elements can be a mixed thing e.g. 'style_'.
-instance (Monad m,a ~ HtmlT m r,r ~ ()) => Mixed a (HtmlT m r) where
-  mixed = makeElement . Blaze.fromText
+-- | Given attributes, expect more child input.
+instance (Monad m,f ~ HtmlT m a, a ~ ()) => Term [Attribute] (f -> HtmlT m a) where
+  termWith name f = with (makeElement name) . (<> f)
 
--- | Used for names that are mixed, e.g. 'style_'. Doesn't encode the
--- inner content of its element.
-class MixedRaw a r where
-  mixedRaw :: Text -> a -> r
+-- | Given children immediately, just use that and expect no
+-- attributes.
+instance (Monad m,a ~ ()) => Term (HtmlT m a) (HtmlT m a) where
+  termWith name f = with (makeElement name) f
 
--- | Attributes can be a mixed thing e.g. 'style_'.
-instance (a ~ Text) => MixedRaw a (Text,Text) where
-  mixedRaw key value = (key,value)
+-- | Some terms (like 'Lucid.Html5.style_', 'Lucid.Html5.title_') can be used for
+-- attributes as well as elements.
+instance Term Text Attribute where
+  termWith key _ value = makeAttribute key value
 
--- | HTML elements can be a mixed thing e.g. 'style_'. Doesn't encode
--- the text content.
-instance (Monad m,ToHtml a,r ~ ()) => MixedRaw a (HtmlT m r) where
-  mixedRaw n = makeElement (Blaze.fromText n) . toHtmlRaw
+-- | Same as the 'Term' class, but will not HTML escape its
+-- children. Useful for elements like 'Lucid.Html5.style_' or
+-- 'Lucid.Html5.script_'.
+class TermRaw arg result | result -> arg where
+  -- | Used for constructing elements e.g. @termRaw "p"@ yields 'Lucid.Html5.p_'.
+  termRaw :: Text   -- ^ Name of the element or attribute.
+       -> arg    -- ^ Either an attribute list or children.
+       -> result -- ^ Result: either an element or an attribute.
+  termRaw = flip termRawWith []
+  -- | Use this if you want to make an element which inserts some
+  -- pre-prepared attributes into the element.
+  termRawWith :: Text          -- ^ Name.
+           -> [Attribute]   -- ^ Attribute transformer.
+           -> arg           -- ^ Some argument.
+           -> result        -- ^ Result: either an element or an attribute.
 
--- | With an element use these attributes.
-class With a where
+-- | Given attributes, expect more child input.
+instance (Monad m,ToHtml f, a ~ ()) => TermRaw [Attribute] (f -> HtmlT m a) where
+  termRawWith name f attrs = with (makeElement name) (attrs <> f) . toHtmlRaw
+
+-- | Given children immediately, just use that and expect no
+-- attributes.
+instance (Monad m,a ~ ()) => TermRaw Text (HtmlT m a) where
+  termRawWith name f = with (makeElement name) f . toHtmlRaw
+
+-- | Some termRaws (like 'Lucid.Html5.style_', 'Lucid.Html5.title_') can be used for
+-- attributes as well as elements.
+instance TermRaw Text Attribute where
+  termRawWith key _ value = makeAttribute key value
+
+-- | With an element use these attributes. An overloaded way of adding
+-- attributes either to an element accepting attributes-and-children
+-- or one that just accepts attributes. See the two instances.
+class With a  where
   -- | With the given element(s), use the given attributes.
   with :: a -- ^ Some element, either @Html ()@ or @Html () -> Html ()@.
-       -> [(Text,Text)] -> a
+       -> [Attribute]
+       -> a
 
--- | For the contentless elements: 'br_'
+-- | For the contentless elements: 'Lucid.Html5.br_'
 instance (Monad m,a ~ ()) => With (HtmlT m a) where
   with f =
     \attr ->
       HtmlT (do ~(f',_) <- runHtmlT f
                 return (\attr' m' ->
-                          f' (unionArgs (M.fromList attr) attr') m'
+                          f' (unionArgs (M.fromListWith (<>) (map toPair attr)) attr') m'
                        ,()))
+    where toPair (Attribute x) = x
 
--- | For the contentful elements: 'div_'
+-- | For the contentful elements: 'Lucid.Html5.div_'
 instance (Monad m,a ~ ()) => With (HtmlT m a -> HtmlT m a) where
   with f =
     \attr inner ->
       HtmlT (do ~(f',_) <- runHtmlT (f inner)
                 return ((\attr' m' ->
-                           f' (unionArgs (M.fromList attr) attr') m')
+                           f' (unionArgs (M.fromListWith (<>) (map toPair attr)) attr') m')
                        ,()))
+    where toPair (Attribute x) = x
 
 -- | Union two sets of arguments and append duplicate keys.
 unionArgs :: HashMap Text Text -> HashMap Text Text -> HashMap Text Text
@@ -272,25 +338,33 @@
 --------------------------------------------------------------------------------
 -- Combinators
 
+-- | Make an attribute builder.
+makeAttribute :: Text -- ^ Attribute name.
+              -> Text -- ^ Attribute value.
+              -> Attribute
+makeAttribute x y = Attribute (x,y)
+
 -- | Make an HTML builder.
 makeElement :: Monad m
-            => Builder -- ^ Name.
+            => Text       -- ^ Name.
             -> HtmlT m a  -- ^ Children HTML.
             -> HtmlT m () -- ^ A parent element.
 makeElement name =
   \m' ->
     HtmlT (do ~(f,_) <- runHtmlT m'
-              return (\attr m -> s "<" <> name <> foldlMapWithKey buildAttr attr <> s ">"
+              return (\attr m -> s "<" <> Blaze.fromText name
+                              <> foldlMapWithKey buildAttr attr <> s ">"
                               <> m <> f mempty mempty
-                              <> s "</" <> name <> s ">",
+                              <> s "</" <> Blaze.fromText name <> s ">",
                       ()))
 
--- | Make an HTML builder for
+-- | Make an HTML builder for elements which have no ending tag.
 makeElementNoEnd :: Monad m
-                 => Builder -- ^ Name.
+                 => Text       -- ^ Name.
                  -> HtmlT m () -- ^ A parent element.
 makeElementNoEnd name =
-  HtmlT (return (\attr _ -> s "<" <> name <> foldlMapWithKey buildAttr attr <> s ">",
+  HtmlT (return (\attr _ -> s "<" <> Blaze.fromText name
+                            <> foldlMapWithKey buildAttr attr <> s ">",
                  ()))
 
 -- | Build and encode an attribute.
@@ -302,9 +376,11 @@
      then mempty
      else s "=\"" <> encode val <> s "\""
 
+-- | Folding and monoidally appending attributes.
 foldlMapWithKey :: Monoid m => (k -> v -> m) -> HashMap k v -> m
 foldlMapWithKey f = M.foldlWithKey' (\m k v -> m <> f k v) mempty
 
+-- | Convenience function for constructing builders.
 s :: String -> Builder
 s = Blaze.fromString
 {-# INLINE s #-}
@@ -315,3 +391,7 @@
 -- | Encode the given strict plain text to an encoded HTML builder.
 encode :: Text -> Builder
 encode = Blaze.fromHtmlEscapedText
+
+-- | Encode the given strict plain text to an encoded HTML builder.
+encodeLazy :: LT.Text -> Builder
+encodeLazy = Blaze.fromHtmlEscapedLazyText
diff --git a/src/Lucid/Bootstrap.hs b/src/Lucid/Bootstrap.hs
--- a/src/Lucid/Bootstrap.hs
+++ b/src/Lucid/Bootstrap.hs
@@ -32,100 +32,68 @@
 import Lucid.Base
 import Lucid.Html5
 
-import qualified Blaze.ByteString.Builder.Char.Utf8 as Blaze
-
 -- | A grid container.
-container_ :: Monad m => HtmlT m () -> HtmlT m ()
+container_ :: Term arg result => arg -> result
 container_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "container "]
+  termWith "div" [class_ " container "]
 
 -- | A fluid grid container.
-containerFluid_ :: Monad m => HtmlT m () -> HtmlT m ()
+containerFluid_ :: Term arg result => arg -> result
 containerFluid_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "container-fluid "]
+  termWith "div" [class_ " containerFluid "]
 
 -- | A grid row.
-row_ :: Monad m => HtmlT m () -> HtmlT m ()
-row_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "row "]
+row_ :: Term arg result => arg -> result
+row_ = termWith "div" [class_ " row "]
 
 -- | A fluid grid row.
-rowFluid_ :: Monad m => HtmlT m () -> HtmlT m ()
-rowFluid_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "row-fluid "]
+rowFluid_ :: Term arg result => arg -> result
+rowFluid_ = termWith "div" [class_ " rowFluid "]
 
 -- | A span of 1 column.
-span1_ :: Monad m => HtmlT m () -> HtmlT m ()
-span1_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span1 "]
+span1_ :: Term arg result => arg -> result
+span1_ = termWith "div" [class_ " span1 "]
 
 -- | A span of 2 columns.
-span2_ :: Monad m => HtmlT m () -> HtmlT m ()
-span2_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span2 "]
+span2_ :: Term arg result => arg -> result
+span2_ = termWith "div" [class_ " span2 "]
 
 -- | A span of 3 columns.
-span3_ :: Monad m => HtmlT m () -> HtmlT m ()
-span3_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span3 "]
+span3_ :: Term arg result => arg -> result
+span3_ = termWith "div" [class_ " span3 "]
 
 -- | A span of 4 columns.
-span4_ :: Monad m => HtmlT m () -> HtmlT m ()
-span4_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span4 "]
+span4_ :: Term arg result => arg -> result
+span4_ = termWith "div" [class_ " span4 "]
 
 -- | A span of 5 columns.
-span5_ :: Monad m => HtmlT m () -> HtmlT m ()
-span5_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span5 "]
+span5_ :: Term arg result => arg -> result
+span5_ = termWith "div" [class_ " span5 "]
 
 -- | A span of 6 columns.
-span6_ :: Monad m => HtmlT m () -> HtmlT m ()
-span6_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span6 "]
+span6_ :: Term arg result => arg -> result
+span6_ = termWith "div" [class_ " span6 "]
 
 -- | A span of 7 columns.
-span7_ :: Monad m => HtmlT m () -> HtmlT m ()
-span7_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span7 "]
+span7_ :: Term arg result => arg -> result
+span7_ = termWith "div" [class_ " span7 "]
 
 -- | A span of 8 columns.
-span8_ :: Monad m => HtmlT m () -> HtmlT m ()
-span8_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span8 "]
+span8_ :: Term arg result => arg -> result
+span8_ = termWith "div" [class_ " span8 "]
 
 -- | A span of 9 columns.
-span9_ :: Monad m => HtmlT m () -> HtmlT m ()
-span9_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span9 "]
+span9_ :: Term arg result => arg -> result
+span9_ = termWith "div" [class_ " span9 "]
 
 -- | A span of 10 columns.
-span10_ :: Monad m => HtmlT m () -> HtmlT m ()
-span10_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span10 "]
+span10_ :: Term arg result => arg -> result
+span10_ = termWith "div" [class_ " span10 "]
 
 -- | A span of 11 columns.
-span11_ :: Monad m => HtmlT m () -> HtmlT m ()
-span11_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span11 "]
+span11_ :: Term arg result => arg -> result
+span11_ = termWith "div" [class_ " span11 "]
 
 -- | A span of 12 columns.
-span12_ :: Monad m => HtmlT m () -> HtmlT m ()
-span12_ =
-  with (makeElement (Blaze.fromString "div"))
-       [class_ "span12 "]
+span12_ :: Term arg result => arg -> result
+span12_ = termWith "div" [class_ " span12 "]
diff --git a/src/Lucid/Html5.hs b/src/Lucid/Html5.hs
--- a/src/Lucid/Html5.hs
+++ b/src/Lucid/Html5.hs
@@ -1,1082 +1,1082 @@
 {-# LANGUAGE OverloadedStrings #-}
-{-# OPTIONS -fno-warn-type-defaults #-}
-
--- | Html5 terms.
-
-module Lucid.Html5 where
-
-import           Data.Text (Text)
-import           Lucid.Base
-
-import qualified Blaze.ByteString.Builder.Char.Utf8 as Blaze
-import           Data.Monoid
-
--- | @DOCTYPE@ element
-doctype_  :: Monad m => HtmlT m ()
-doctype_ = makeElementNoEnd (Blaze.fromString "!DOCTYPE HTML")
-
--- | @DOCTYPE@ element + @html@ element
-doctypehtml_  :: Monad m => HtmlT m () -> HtmlT m ()
-doctypehtml_ m =
-  do doctype_
-     html_ m
-
--- | @a@ element
-a_  :: Monad m => HtmlT m () -> HtmlT m ()
-a_ = makeElement (Blaze.fromString "a")
-
--- | @abbr@ element
-abbr_  :: Monad m => HtmlT m () -> HtmlT m ()
-abbr_ = makeElement (Blaze.fromString "abbr")
-
--- | @address@ element
-address_  :: Monad m => HtmlT m () -> HtmlT m ()
-address_ = makeElement (Blaze.fromString "address")
-
--- | @area@ element
-area_  :: Monad m => HtmlT m ()
-area_ = makeElementNoEnd (Blaze.fromString "area")
-
--- | @article@ element
-article_  :: Monad m => HtmlT m () -> HtmlT m ()
-article_ = makeElement (Blaze.fromString "article")
-
--- | @aside@ element
-aside_  :: Monad m => HtmlT m () -> HtmlT m ()
-aside_ = makeElement (Blaze.fromString "aside")
-
--- | @audio@ element
-audio_  :: Monad m => HtmlT m () -> HtmlT m ()
-audio_ = makeElement (Blaze.fromString "audio")
-
--- | @b@ element
-b_  :: Monad m => HtmlT m () -> HtmlT m ()
-b_ = makeElement (Blaze.fromString "b")
-
--- | @base@ element
-base_  :: Monad m => HtmlT m ()
-base_ = makeElementNoEnd (Blaze.fromString "base")
-
--- | @bdo@ element
-bdo_  :: Monad m => HtmlT m () -> HtmlT m ()
-bdo_ = makeElement (Blaze.fromString "bdo")
-
--- | @blockquote@ element
-blockquote_  :: Monad m => HtmlT m () -> HtmlT m ()
-blockquote_ = makeElement (Blaze.fromString "blockquote")
-
--- | @body@ element
-body_  :: Monad m => HtmlT m () -> HtmlT m ()
-body_ = makeElement (Blaze.fromString "body")
-
--- | @br@ element
-br_  :: Monad m => HtmlT m ()
-br_ = makeElementNoEnd (Blaze.fromString "br")
-
--- | @button@ element
-button_  :: Monad m => HtmlT m () -> HtmlT m ()
-button_ = makeElement (Blaze.fromString "button")
-
--- | @canvas@ element
-canvas_  :: Monad m => HtmlT m () -> HtmlT m ()
-canvas_ = makeElement (Blaze.fromString "canvas")
-
--- | @caption@ element
-caption_  :: Monad m => HtmlT m () -> HtmlT m ()
-caption_ = makeElement (Blaze.fromString "caption")
-
--- | @cite@ element or @cite@ attribute.
-cite_ :: Mixed a r => a -> r
-cite_ = mixed ("cite")
-
--- | @code@ element
-code_  :: Monad m => HtmlT m () -> HtmlT m ()
-code_ = makeElement (Blaze.fromString "code")
-
--- | @col@ element
-col_  :: Monad m => HtmlT m ()
-col_ = makeElementNoEnd (Blaze.fromString "col")
-
--- | @colgroup@ element
-colgroup_  :: Monad m => HtmlT m () -> HtmlT m ()
-colgroup_ = makeElement (Blaze.fromString "colgroup")
-
--- | @command@ element
-command_  :: Monad m => HtmlT m () -> HtmlT m ()
-command_ = makeElement (Blaze.fromString "command")
-
--- | @datalist@ element
-datalist_  :: Monad m => HtmlT m () -> HtmlT m ()
-datalist_ = makeElement (Blaze.fromString "datalist")
-
--- | @dd@ element
-dd_  :: Monad m => HtmlT m () -> HtmlT m ()
-dd_ = makeElement (Blaze.fromString "dd")
-
--- | @del@ element
-del_  :: Monad m => HtmlT m () -> HtmlT m ()
-del_ = makeElement (Blaze.fromString "del")
-
--- | @details@ element
-details_  :: Monad m => HtmlT m () -> HtmlT m ()
-details_ = makeElement (Blaze.fromString "details")
-
--- | @dfn@ element
-dfn_  :: Monad m => HtmlT m () -> HtmlT m ()
-dfn_ = makeElement (Blaze.fromString "dfn")
-
--- | @div@ element
-div_  :: Monad m => HtmlT m () -> HtmlT m ()
-div_ = makeElement (Blaze.fromString "div")
-
--- | @dl@ element
-dl_  :: Monad m => HtmlT m () -> HtmlT m ()
-dl_ = makeElement (Blaze.fromString "dl")
-
--- | @dt@ element
-dt_  :: Monad m => HtmlT m () -> HtmlT m ()
-dt_ = makeElement (Blaze.fromString "dt")
-
--- | @em@ element
-em_  :: Monad m => HtmlT m () -> HtmlT m ()
-em_ = makeElement (Blaze.fromString "em")
-
--- | @embed@ element
-embed_  :: Monad m => HtmlT m ()
-embed_ = makeElementNoEnd (Blaze.fromString "embed")
-
--- | @fieldset@ element
-fieldset_  :: Monad m => HtmlT m () -> HtmlT m ()
-fieldset_ = makeElement (Blaze.fromString "fieldset")
-
--- | @figcaption@ element
-figcaption_  :: Monad m => HtmlT m () -> HtmlT m ()
-figcaption_ = makeElement (Blaze.fromString "figcaption")
-
--- | @figure@ element
-figure_  :: Monad m => HtmlT m () -> HtmlT m ()
-figure_ = makeElement (Blaze.fromString "figure")
-
--- | @footer@ element
-footer_  :: Monad m => HtmlT m () -> HtmlT m ()
-footer_ = makeElement (Blaze.fromString "footer")
-
--- | @form@ element or @form@ attribute
-form_ :: Mixed a r => a -> r
-form_ = mixed ("form")
-
--- | @h1@ element
-h1_  :: Monad m => HtmlT m () -> HtmlT m ()
-h1_ = makeElement (Blaze.fromString "h1")
-
--- | @h2@ element
-h2_  :: Monad m => HtmlT m () -> HtmlT m ()
-h2_ = makeElement (Blaze.fromString "h2")
-
--- | @h3@ element
-h3_  :: Monad m => HtmlT m () -> HtmlT m ()
-h3_ = makeElement (Blaze.fromString "h3")
-
--- | @h4@ element
-h4_  :: Monad m => HtmlT m () -> HtmlT m ()
-h4_ = makeElement (Blaze.fromString "h4")
-
--- | @h5@ element
-h5_  :: Monad m => HtmlT m () -> HtmlT m ()
-h5_ = makeElement (Blaze.fromString "h5")
-
--- | @h6@ element
-h6_  :: Monad m => HtmlT m () -> HtmlT m ()
-h6_ = makeElement (Blaze.fromString "h6")
-
--- | @head@ element
-head_  :: Monad m => HtmlT m () -> HtmlT m ()
-head_ = makeElement (Blaze.fromString "head")
-
--- | @header@ element
-header_  :: Monad m => HtmlT m () -> HtmlT m ()
-header_ = makeElement (Blaze.fromString "header")
-
--- | @hgroup@ element
-hgroup_  :: Monad m => HtmlT m () -> HtmlT m ()
-hgroup_ = makeElement (Blaze.fromString "hgroup")
-
--- | @hr@ element
-hr_  :: Monad m => HtmlT m ()
-hr_ = makeElementNoEnd (Blaze.fromString "hr")
-
--- | @html@ element
-html_  :: Monad m => HtmlT m () -> HtmlT m ()
-html_ = makeElement (Blaze.fromString "html")
-
--- | @i@ element
-i_  :: Monad m => HtmlT m () -> HtmlT m ()
-i_ = makeElement (Blaze.fromString "i")
-
--- | @iframe@ element
-iframe_  :: Monad m => HtmlT m () -> HtmlT m ()
-iframe_ = makeElement (Blaze.fromString "iframe")
-
--- | @img@ element
-img_  :: Monad m => HtmlT m ()
-img_ = makeElementNoEnd (Blaze.fromString "img")
-
--- | @input@ element
-input_  :: Monad m => HtmlT m ()
-input_ = makeElementNoEnd (Blaze.fromString "input")
-
--- | @ins@ element
-ins_  :: Monad m => HtmlT m () -> HtmlT m ()
-ins_ = makeElement (Blaze.fromString "ins")
-
--- | @kbd@ element
-kbd_  :: Monad m => HtmlT m () -> HtmlT m ()
-kbd_ = makeElement (Blaze.fromString "kbd")
-
--- | @keygen@ element
-keygen_  :: Monad m => HtmlT m ()
-keygen_ = makeElementNoEnd (Blaze.fromString "keygen")
-
--- | @label@ element or @label@ attribute
-label_ :: Mixed a r => a -> r
-label_ = mixed ("label")
-
--- | @legend@ element
-legend_  :: Monad m => HtmlT m () -> HtmlT m ()
-legend_ = makeElement (Blaze.fromString "legend")
-
--- | @li@ element
-li_  :: Monad m => HtmlT m () -> HtmlT m ()
-li_ = makeElement (Blaze.fromString "li")
-
--- | @link@ element
-link_  :: Monad m => HtmlT m ()
-link_ = makeElementNoEnd (Blaze.fromString "link")
-
--- | @map@ element
-map_  :: Monad m => HtmlT m () -> HtmlT m ()
-map_ = makeElement (Blaze.fromString "map")
-
--- | @mark@ element
-mark_  :: Monad m => HtmlT m () -> HtmlT m ()
-mark_ = makeElement (Blaze.fromString "mark")
-
--- | @menu@ element
-menu_  :: Monad m => HtmlT m () -> HtmlT m ()
-menu_ = makeElement (Blaze.fromString "menu")
-
--- | @menuitem@ element
-menuitem_  :: Monad m => HtmlT m ()
-menuitem_ = makeElementNoEnd (Blaze.fromString "menuitem")
-
--- | @meta@ element
-meta_  :: Monad m => HtmlT m ()
-meta_ = makeElementNoEnd (Blaze.fromString "meta")
-
--- | @meter@ element
-meter_  :: Monad m => HtmlT m () -> HtmlT m ()
-meter_ = makeElement (Blaze.fromString "meter")
-
--- | @nav@ element
-nav_  :: Monad m => HtmlT m () -> HtmlT m ()
-nav_ = makeElement (Blaze.fromString "nav")
-
--- | @noscript@ element
-noscript_  :: Monad m => HtmlT m () -> HtmlT m ()
-noscript_ = makeElement (Blaze.fromString "noscript")
-
--- | @object@ element
-object_  :: Monad m => HtmlT m () -> HtmlT m ()
-object_ = makeElement (Blaze.fromString "object")
-
--- | @ol@ element
-ol_  :: Monad m => HtmlT m () -> HtmlT m ()
-ol_ = makeElement (Blaze.fromString "ol")
-
--- | @optgroup@ element
-optgroup_  :: Monad m => HtmlT m () -> HtmlT m ()
-optgroup_ = makeElement (Blaze.fromString "optgroup")
-
--- | @option@ element
-option_  :: Monad m => HtmlT m () -> HtmlT m ()
-option_ = makeElement (Blaze.fromString "option")
-
--- | @output@ element
-output_  :: Monad m => HtmlT m () -> HtmlT m ()
-output_ = makeElement (Blaze.fromString "output")
-
--- | @p@ element
-p_  :: Monad m => HtmlT m () -> HtmlT m ()
-p_ = makeElement (Blaze.fromString "p")
-
--- | @param@ element
-param_  :: Monad m => HtmlT m ()
-param_ = makeElementNoEnd (Blaze.fromString "param")
-
--- | @pre@ element
-pre_  :: Monad m => HtmlT m () -> HtmlT m ()
-pre_ = makeElement (Blaze.fromString "pre")
-
--- | @progress@ element
-progress_  :: Monad m => HtmlT m () -> HtmlT m ()
-progress_ = makeElement (Blaze.fromString "progress")
-
--- | @q@ element
-q_  :: Monad m => HtmlT m () -> HtmlT m ()
-q_ = makeElement (Blaze.fromString "q")
-
--- | @rp@ element
-rp_  :: Monad m => HtmlT m () -> HtmlT m ()
-rp_ = makeElement (Blaze.fromString "rp")
-
--- | @rt@ element
-rt_  :: Monad m => HtmlT m () -> HtmlT m ()
-rt_ = makeElement (Blaze.fromString "rt")
-
--- | @ruby@ element
-ruby_  :: Monad m => HtmlT m () -> HtmlT m ()
-ruby_ = makeElement (Blaze.fromString "ruby")
-
--- | @samp@ element
-samp_  :: Monad m => HtmlT m () -> HtmlT m ()
-samp_ = makeElement (Blaze.fromString "samp")
-
--- | @script@ element
-script_  :: (ToHtml t,Monad m) => t -> HtmlT m ()
-script_ = makeElement (Blaze.fromString "script") . toHtmlRaw
-
--- | @section@ element
-section_  :: Monad m => HtmlT m () -> HtmlT m ()
-section_ = makeElement (Blaze.fromString "section")
-
--- | @select@ element
-select_  :: Monad m => HtmlT m () -> HtmlT m ()
-select_ = makeElement (Blaze.fromString "select")
-
--- | @small@ element
-small_  :: Monad m => HtmlT m () -> HtmlT m ()
-small_ = makeElement (Blaze.fromString "small")
-
--- | @source@ element
-source_  :: Monad m => HtmlT m ()
-source_ = makeElementNoEnd (Blaze.fromString "source")
-
--- | @span@ element or @span@ attribute
-span_  :: Mixed a r => a -> r
-span_ = mixed ("span")
-
--- | @strong@ element
-strong_  :: Monad m => HtmlT m () -> HtmlT m ()
-strong_ = makeElement (Blaze.fromString "strong")
-
--- | @style@ element or @style@ attribute
-style_  :: MixedRaw a r => a -> r
-style_ = mixedRaw "style"
-
--- | @sub@ element
-sub_  :: Monad m => HtmlT m () -> HtmlT m ()
-sub_ = makeElement (Blaze.fromString "sub")
-
--- | @summary@ element or @summary@ attribute
-summary_  :: Mixed a r => a -> r
-summary_ = mixed ("summary")
-
--- | @sup@ element
-sup_  :: Monad m => HtmlT m () -> HtmlT m ()
-sup_ = makeElement (Blaze.fromString "sup")
-
--- | @table@ element
-table_  :: Monad m => HtmlT m () -> HtmlT m ()
-table_ = makeElement (Blaze.fromString "table")
-
--- | @tbody@ element
-tbody_  :: Monad m => HtmlT m () -> HtmlT m ()
-tbody_ = makeElement (Blaze.fromString "tbody")
-
--- | @td@ element
-td_  :: Monad m => HtmlT m () -> HtmlT m ()
-td_ = makeElement (Blaze.fromString "td")
-
--- | @textarea@ element
-textarea_  :: Monad m => HtmlT m () -> HtmlT m ()
-textarea_ = makeElement (Blaze.fromString "textarea")
-
--- | @tfoot@ element
-tfoot_  :: Monad m => HtmlT m () -> HtmlT m ()
-tfoot_ = makeElement (Blaze.fromString "tfoot")
-
--- | @th@ element
-th_  :: Monad m => HtmlT m () -> HtmlT m ()
-th_ = makeElement (Blaze.fromString "th")
-
--- | @thead@ element
-thead_  :: Monad m => HtmlT m () -> HtmlT m ()
-thead_ = makeElement (Blaze.fromString "thead")
-
--- | @time@ element
-time_  :: Monad m => HtmlT m () -> HtmlT m ()
-time_ = makeElement (Blaze.fromString "time")
-
--- | @title@ element or @title@ attribute
-title_  :: Mixed a r => a -> r
-title_ = mixed ("title")
-
--- | @tr@ element
-tr_  :: Monad m => HtmlT m () -> HtmlT m ()
-tr_ = makeElement (Blaze.fromString "tr")
-
--- | @track@ element
-track_  :: Monad m => HtmlT m ()
-track_ = makeElementNoEnd (Blaze.fromString "track")
-
--- | @ul@ element
-ul_  :: Monad m => HtmlT m () -> HtmlT m ()
-ul_ = makeElement (Blaze.fromString "ul")
-
--- | @var@ element
-var_  :: Monad m => HtmlT m () -> HtmlT m ()
-var_ = makeElement (Blaze.fromString "var")
-
--- | @video@ element
-video_  :: Monad m => HtmlT m () -> HtmlT m ()
-video_ = makeElement (Blaze.fromString "video")
-
--- | @wbr@ element
-wbr_  :: Monad m => HtmlT m ()
-wbr_ = makeElementNoEnd (Blaze.fromString "wbr")
-
--- | The @accept@ attribute.
-accept_ :: Text -> (Text,Text)
-accept_ = (,) ("accept")
-
--- | The @acceptCharset@ attribute.
-acceptCharset_ :: Text -> (Text,Text)
-acceptCharset_ = (,) ("acceptCharset")
-
--- | The @accesskey@ attribute.
-accesskey_ :: Text -> (Text,Text)
-accesskey_ = (,) ("accesskey")
-
--- | The @action@ attribute.
-action_ :: Text -> (Text,Text)
-action_ = (,) ("action")
-
--- | The @alt@ attribute.
-alt_ :: Text -> (Text,Text)
-alt_ = (,) ("alt")
-
--- | The @async@ attribute.
-async_ :: Text -> (Text,Text)
-async_ = (,) ("async")
-
--- | The @autocomplete@ attribute.
-autocomplete_ :: Text -> (Text,Text)
-autocomplete_ = (,) ("autocomplete")
-
--- | The @autofocus@ attribute.
-autofocus_ :: (Text,Text)
-autofocus_ = (,) ("autofocus") mempty
-
--- | The @autoplay@ attribute.
-autoplay_ :: Text -> (Text,Text)
-autoplay_ = (,) ("autoplay")
-
--- | The @challenge@ attribute.
-challenge_ :: Text -> (Text,Text)
-challenge_ = (,) ("challenge")
-
--- | The @charset@ attribute.
-charset_ :: Text -> (Text,Text)
-charset_ = (,) ("charset")
-
--- | The @checked@ attribute.
-checked_ :: (Text,Text)
-checked_ = (,) ("checked") mempty
-
--- | The @class@ attribute.
-class_ :: Text -> (Text,Text)
-class_ = (,) ("class")
-
--- | The @cols@ attribute.
-cols_ :: Text -> (Text,Text)
-cols_ = (,) ("cols")
-
--- | The @colspan@ attribute.
-colspan_ :: Text -> (Text,Text)
-colspan_ = (,) ("colspan")
-
--- | The @content@ attribute.
-content_ :: Text -> (Text,Text)
-content_ = (,) ("content")
-
--- | The @contenteditable@ attribute.
-contenteditable_ :: Text -> (Text,Text)
-contenteditable_ = (,) ("contenteditable")
-
--- | The @contextmenu@ attribute.
-contextmenu_ :: Text -> (Text,Text)
-contextmenu_ = (,) ("contextmenu")
-
--- | The @controls@ attribute.
-controls_ :: Text -> (Text,Text)
-controls_ = (,) ("controls")
-
--- | The @coords@ attribute.
-coords_ :: Text -> (Text,Text)
-coords_ = (,) ("coords")
-
--- | The @data@ attribute.
-data_ :: Text -> (Text,Text)
-data_ = (,) ("data")
-
--- | The @datetime@ attribute.
-datetime_ :: Text -> (Text,Text)
-datetime_ = (,) ("datetime")
-
--- | The @defer@ attribute.
-defer_ :: Text -> (Text,Text)
-defer_ = (,) ("defer")
-
--- | The @dir@ attribute.
-dir_ :: Text -> (Text,Text)
-dir_ = (,) ("dir")
-
--- | The @disabled@ attribute.
-disabled_ :: Text -> (Text,Text)
-disabled_ = (,) ("disabled")
-
--- | The @draggable@ attribute.
-draggable_ :: Text -> (Text,Text)
-draggable_ = (,) ("draggable")
-
--- | The @enctype@ attribute.
-enctype_ :: Text -> (Text,Text)
-enctype_ = (,) ("enctype")
-
--- | The @for@ attribute.
-for_ :: Text -> (Text,Text)
-for_ = (,) ("for")
-
--- | The @formaction@ attribute.
-formaction_ :: Text -> (Text,Text)
-formaction_ = (,) ("formaction")
-
--- | The @formenctype@ attribute.
-formenctype_ :: Text -> (Text,Text)
-formenctype_ = (,) ("formenctype")
-
--- | The @formmethod@ attribute.
-formmethod_ :: Text -> (Text,Text)
-formmethod_ = (,) ("formmethod")
-
--- | The @formnovalidate@ attribute.
-formnovalidate_ :: Text -> (Text,Text)
-formnovalidate_ = (,) ("formnovalidate")
-
--- | The @formtarget@ attribute.
-formtarget_ :: Text -> (Text,Text)
-formtarget_ = (,) ("formtarget")
-
--- | The @headers@ attribute.
-headers_ :: Text -> (Text,Text)
-headers_ = (,) ("headers")
-
--- | The @height@ attribute.
-height_ :: Text -> (Text,Text)
-height_ = (,) ("height")
-
--- | The @hidden@ attribute.
-hidden_ :: Text -> (Text,Text)
-hidden_ = (,) ("hidden")
-
--- | The @high@ attribute.
-high_ :: Text -> (Text,Text)
-high_ = (,) ("high")
-
--- | The @href@ attribute.
-href_ :: Text -> (Text,Text)
-href_ = (,) ("href")
-
--- | The @hreflang@ attribute.
-hreflang_ :: Text -> (Text,Text)
-hreflang_ = (,) ("hreflang")
-
--- | The @httpEquiv@ attribute.
-httpEquiv_ :: Text -> (Text,Text)
-httpEquiv_ = (,) ("httpEquiv")
-
--- | The @icon@ attribute.
-icon_ :: Text -> (Text,Text)
-icon_ = (,) ("icon")
-
--- | The @id@ attribute.
-id_ :: Text -> (Text,Text)
-id_ = (,) ("id")
-
--- | The @ismap@ attribute.
-ismap_ :: Text -> (Text,Text)
-ismap_ = (,) ("ismap")
-
--- | The @item@ attribute.
-item_ :: Text -> (Text,Text)
-item_ = (,) ("item")
-
--- | The @itemprop@ attribute.
-itemprop_ :: Text -> (Text,Text)
-itemprop_ = (,) ("itemprop")
-
--- | The @keytype@ attribute.
-keytype_ :: Text -> (Text,Text)
-keytype_ = (,) ("keytype")
-
--- | The @lang@ attribute.
-lang_ :: Text -> (Text,Text)
-lang_ = (,) ("lang")
-
--- | The @list@ attribute.
-list_ :: Text -> (Text,Text)
-list_ = (,) ("list")
-
--- | The @loop@ attribute.
-loop_ :: Text -> (Text,Text)
-loop_ = (,) ("loop")
-
--- | The @low@ attribute.
-low_ :: Text -> (Text,Text)
-low_ = (,) ("low")
-
--- | The @manifest@ attribute.
-manifest_ :: Text -> (Text,Text)
-manifest_ = (,) ("manifest")
-
--- | The @max@ attribute.
-max_ :: Text -> (Text,Text)
-max_ = (,) ("max")
-
--- | The @maxlength@ attribute.
-maxlength_ :: Text -> (Text,Text)
-maxlength_ = (,) ("maxlength")
-
--- | The @media@ attribute.
-media_ :: Text -> (Text,Text)
-media_ = (,) ("media")
-
--- | The @method@ attribute.
-method_ :: Text -> (Text,Text)
-method_ = (,) ("method")
-
--- | The @min@ attribute.
-min_ :: Text -> (Text,Text)
-min_ = (,) ("min")
-
--- | The @multiple@ attribute.
-multiple_ :: Text -> (Text,Text)
-multiple_ = (,) ("multiple")
-
--- | The @name@ attribute.
-name_ :: Text -> (Text,Text)
-name_ = (,) ("name")
-
--- | The @novalidate@ attribute.
-novalidate_ :: Text -> (Text,Text)
-novalidate_ = (,) ("novalidate")
-
--- | The @onbeforeonload@ attribute.
-onbeforeonload_ :: Text -> (Text,Text)
-onbeforeonload_ = (,) ("onbeforeonload")
-
--- | The @onbeforeprint@ attribute.
-onbeforeprint_ :: Text -> (Text,Text)
-onbeforeprint_ = (,) ("onbeforeprint")
-
--- | The @onblur@ attribute.
-onblur_ :: Text -> (Text,Text)
-onblur_ = (,) ("onblur")
-
--- | The @oncanplay@ attribute.
-oncanplay_ :: Text -> (Text,Text)
-oncanplay_ = (,) ("oncanplay")
-
--- | The @oncanplaythrough@ attribute.
-oncanplaythrough_ :: Text -> (Text,Text)
-oncanplaythrough_ = (,) ("oncanplaythrough")
-
--- | The @onchange@ attribute.
-onchange_ :: Text -> (Text,Text)
-onchange_ = (,) ("onchange")
-
--- | The @onclick@ attribute.
-onclick_ :: Text -> (Text,Text)
-onclick_ = (,) ("onclick")
-
--- | The @oncontextmenu@ attribute.
-oncontextmenu_ :: Text -> (Text,Text)
-oncontextmenu_ = (,) ("oncontextmenu")
-
--- | The @ondblclick@ attribute.
-ondblclick_ :: Text -> (Text,Text)
-ondblclick_ = (,) ("ondblclick")
-
--- | The @ondrag@ attribute.
-ondrag_ :: Text -> (Text,Text)
-ondrag_ = (,) ("ondrag")
-
--- | The @ondragend@ attribute.
-ondragend_ :: Text -> (Text,Text)
-ondragend_ = (,) ("ondragend")
-
--- | The @ondragenter@ attribute.
-ondragenter_ :: Text -> (Text,Text)
-ondragenter_ = (,) ("ondragenter")
-
--- | The @ondragleave@ attribute.
-ondragleave_ :: Text -> (Text,Text)
-ondragleave_ = (,) ("ondragleave")
-
--- | The @ondragover@ attribute.
-ondragover_ :: Text -> (Text,Text)
-ondragover_ = (,) ("ondragover")
-
--- | The @ondragstart@ attribute.
-ondragstart_ :: Text -> (Text,Text)
-ondragstart_ = (,) ("ondragstart")
-
--- | The @ondrop@ attribute.
-ondrop_ :: Text -> (Text,Text)
-ondrop_ = (,) ("ondrop")
-
--- | The @ondurationchange@ attribute.
-ondurationchange_ :: Text -> (Text,Text)
-ondurationchange_ = (,) ("ondurationchange")
-
--- | The @onemptied@ attribute.
-onemptied_ :: Text -> (Text,Text)
-onemptied_ = (,) ("onemptied")
-
--- | The @onended@ attribute.
-onended_ :: Text -> (Text,Text)
-onended_ = (,) ("onended")
-
--- | The @onerror@ attribute.
-onerror_ :: Text -> (Text,Text)
-onerror_ = (,) ("onerror")
-
--- | The @onfocus@ attribute.
-onfocus_ :: Text -> (Text,Text)
-onfocus_ = (,) ("onfocus")
-
--- | The @onformchange@ attribute.
-onformchange_ :: Text -> (Text,Text)
-onformchange_ = (,) ("onformchange")
-
--- | The @onforminput@ attribute.
-onforminput_ :: Text -> (Text,Text)
-onforminput_ = (,) ("onforminput")
-
--- | The @onhaschange@ attribute.
-onhaschange_ :: Text -> (Text,Text)
-onhaschange_ = (,) ("onhaschange")
-
--- | The @oninput@ attribute.
-oninput_ :: Text -> (Text,Text)
-oninput_ = (,) ("oninput")
-
--- | The @oninvalid@ attribute.
-oninvalid_ :: Text -> (Text,Text)
-oninvalid_ = (,) ("oninvalid")
-
--- | The @onkeydown@ attribute.
-onkeydown_ :: Text -> (Text,Text)
-onkeydown_ = (,) ("onkeydown")
-
--- | The @onkeyup@ attribute.
-onkeyup_ :: Text -> (Text,Text)
-onkeyup_ = (,) ("onkeyup")
-
--- | The @onload@ attribute.
-onload_ :: Text -> (Text,Text)
-onload_ = (,) ("onload")
-
--- | The @onloadeddata@ attribute.
-onloadeddata_ :: Text -> (Text,Text)
-onloadeddata_ = (,) ("onloadeddata")
-
--- | The @onloadedmetadata@ attribute.
-onloadedmetadata_ :: Text -> (Text,Text)
-onloadedmetadata_ = (,) ("onloadedmetadata")
-
--- | The @onloadstart@ attribute.
-onloadstart_ :: Text -> (Text,Text)
-onloadstart_ = (,) ("onloadstart")
-
--- | The @onmessage@ attribute.
-onmessage_ :: Text -> (Text,Text)
-onmessage_ = (,) ("onmessage")
-
--- | The @onmousedown@ attribute.
-onmousedown_ :: Text -> (Text,Text)
-onmousedown_ = (,) ("onmousedown")
-
--- | The @onmousemove@ attribute.
-onmousemove_ :: Text -> (Text,Text)
-onmousemove_ = (,) ("onmousemove")
-
--- | The @onmouseout@ attribute.
-onmouseout_ :: Text -> (Text,Text)
-onmouseout_ = (,) ("onmouseout")
-
--- | The @onmouseover@ attribute.
-onmouseover_ :: Text -> (Text,Text)
-onmouseover_ = (,) ("onmouseover")
-
--- | The @onmouseup@ attribute.
-onmouseup_ :: Text -> (Text,Text)
-onmouseup_ = (,) ("onmouseup")
-
--- | The @onmousewheel@ attribute.
-onmousewheel_ :: Text -> (Text,Text)
-onmousewheel_ = (,) ("onmousewheel")
-
--- | The @ononline@ attribute.
-ononline_ :: Text -> (Text,Text)
-ononline_ = (,) ("ononline")
-
--- | The @onpagehide@ attribute.
-onpagehide_ :: Text -> (Text,Text)
-onpagehide_ = (,) ("onpagehide")
-
--- | The @onpageshow@ attribute.
-onpageshow_ :: Text -> (Text,Text)
-onpageshow_ = (,) ("onpageshow")
-
--- | The @onpause@ attribute.
-onpause_ :: Text -> (Text,Text)
-onpause_ = (,) ("onpause")
-
--- | The @onplay@ attribute.
-onplay_ :: Text -> (Text,Text)
-onplay_ = (,) ("onplay")
-
--- | The @onplaying@ attribute.
-onplaying_ :: Text -> (Text,Text)
-onplaying_ = (,) ("onplaying")
-
--- | The @onprogress@ attribute.
-onprogress_ :: Text -> (Text,Text)
-onprogress_ = (,) ("onprogress")
-
--- | The @onpropstate@ attribute.
-onpropstate_ :: Text -> (Text,Text)
-onpropstate_ = (,) ("onpropstate")
-
--- | The @onratechange@ attribute.
-onratechange_ :: Text -> (Text,Text)
-onratechange_ = (,) ("onratechange")
-
--- | The @onreadystatechange@ attribute.
-onreadystatechange_ :: Text -> (Text,Text)
-onreadystatechange_ = (,) ("onreadystatechange")
-
--- | The @onredo@ attribute.
-onredo_ :: Text -> (Text,Text)
-onredo_ = (,) ("onredo")
-
--- | The @onresize@ attribute.
-onresize_ :: Text -> (Text,Text)
-onresize_ = (,) ("onresize")
-
--- | The @onscroll@ attribute.
-onscroll_ :: Text -> (Text,Text)
-onscroll_ = (,) ("onscroll")
-
--- | The @onseeked@ attribute.
-onseeked_ :: Text -> (Text,Text)
-onseeked_ = (,) ("onseeked")
-
--- | The @onseeking@ attribute.
-onseeking_ :: Text -> (Text,Text)
-onseeking_ = (,) ("onseeking")
-
--- | The @onselect@ attribute.
-onselect_ :: Text -> (Text,Text)
-onselect_ = (,) ("onselect")
-
--- | The @onstalled@ attribute.
-onstalled_ :: Text -> (Text,Text)
-onstalled_ = (,) ("onstalled")
-
--- | The @onstorage@ attribute.
-onstorage_ :: Text -> (Text,Text)
-onstorage_ = (,) ("onstorage")
-
--- | The @onsubmit@ attribute.
-onsubmit_ :: Text -> (Text,Text)
-onsubmit_ = (,) ("onsubmit")
-
--- | The @onsuspend@ attribute.
-onsuspend_ :: Text -> (Text,Text)
-onsuspend_ = (,) ("onsuspend")
-
--- | The @ontimeupdate@ attribute.
-ontimeupdate_ :: Text -> (Text,Text)
-ontimeupdate_ = (,) ("ontimeupdate")
-
--- | The @onundo@ attribute.
-onundo_ :: Text -> (Text,Text)
-onundo_ = (,) ("onundo")
-
--- | The @onunload@ attribute.
-onunload_ :: Text -> (Text,Text)
-onunload_ = (,) ("onunload")
-
--- | The @onvolumechange@ attribute.
-onvolumechange_ :: Text -> (Text,Text)
-onvolumechange_ = (,) ("onvolumechange")
-
--- | The @onwaiting@ attribute.
-onwaiting_ :: Text -> (Text,Text)
-onwaiting_ = (,) ("onwaiting")
-
--- | The @open@ attribute.
-open_ :: Text -> (Text,Text)
-open_ = (,) ("open")
-
--- | The @optimum@ attribute.
-optimum_ :: Text -> (Text,Text)
-optimum_ = (,) ("optimum")
-
--- | The @pattern@ attribute.
-pattern_ :: Text -> (Text,Text)
-pattern_ = (,) ("pattern")
-
--- | The @ping@ attribute.
-ping_ :: Text -> (Text,Text)
-ping_ = (,) ("ping")
-
--- | The @placeholder@ attribute.
-placeholder_ :: Text -> (Text,Text)
-placeholder_ = (,) ("placeholder")
-
--- | The @preload@ attribute.
-preload_ :: Text -> (Text,Text)
-preload_ = (,) ("preload")
-
--- | The @pubdate@ attribute.
-pubdate_ :: Text -> (Text,Text)
-pubdate_ = (,) ("pubdate")
-
--- | The @radiogroup@ attribute.
-radiogroup_ :: Text -> (Text,Text)
-radiogroup_ = (,) ("radiogroup")
-
--- | The @readonly@ attribute.
-readonly_ :: Text -> (Text,Text)
-readonly_ = (,) ("readonly")
-
--- | The @rel@ attribute.
-rel_ :: Text -> (Text,Text)
-rel_ = (,) ("rel")
-
--- | The @required@ attribute.
-required_ :: Text -> (Text,Text)
-required_ = (,) ("required")
-
--- | The @reversed@ attribute.
-reversed_ :: Text -> (Text,Text)
-reversed_ = (,) ("reversed")
-
--- | The @rows@ attribute.
-rows_ :: Text -> (Text,Text)
-rows_ = (,) ("rows")
-
--- | The @rowspan@ attribute.
-rowspan_ :: Text -> (Text,Text)
-rowspan_ = (,) ("rowspan")
-
--- | The @sandbox@ attribute.
-sandbox_ :: Text -> (Text,Text)
-sandbox_ = (,) ("sandbox")
-
--- | The @scope@ attribute.
-scope_ :: Text -> (Text,Text)
-scope_ = (,) ("scope")
-
--- | The @scoped@ attribute.
-scoped_ :: Text -> (Text,Text)
-scoped_ = (,) ("scoped")
-
--- | The @seamless@ attribute.
-seamless_ :: Text -> (Text,Text)
-seamless_ = (,) ("seamless")
-
--- | The @selected@ attribute.
-selected_ :: Text -> (Text,Text)
-selected_ = (,) ("selected")
-
--- | The @shape@ attribute.
-shape_ :: Text -> (Text,Text)
-shape_ = (,) ("shape")
-
--- | The @size@ attribute.
-size_ :: Text -> (Text,Text)
-size_ = (,) ("size")
-
--- | The @sizes@ attribute.
-sizes_ :: Text -> (Text,Text)
-sizes_ = (,) ("sizes")
-
--- | The @spellcheck@ attribute.
-spellcheck_ :: Text -> (Text,Text)
-spellcheck_ = (,) ("spellcheck")
-
--- | The @src@ attribute.
-src_ :: Text -> (Text,Text)
-src_ = (,) ("src")
-
--- | The @srcdoc@ attribute.
-srcdoc_ :: Text -> (Text,Text)
-srcdoc_ = (,) ("srcdoc")
-
--- | The @start@ attribute.
-start_ :: Text -> (Text,Text)
-start_ = (,) ("start")
-
--- | The @step@ attribute.
-step_ :: Text -> (Text,Text)
-step_ = (,) ("step")
-
--- | The @subject@ attribute.
-subject_ :: Text -> (Text,Text)
-subject_ = (,) ("subject")
-
--- | The @tabindex@ attribute.
-tabindex_ :: Text -> (Text,Text)
-tabindex_ = (,) ("tabindex")
-
--- | The @target@ attribute.
-target_ :: Text -> (Text,Text)
-target_ = (,) ("target")
-
--- | The @type@ attribute.
-type_ :: Text -> (Text,Text)
-type_ = (,) ("type")
-
--- | The @usemap@ attribute.
-usemap_ :: Text -> (Text,Text)
-usemap_ = (,) ("usemap")
-
--- | The @value@ attribute.
-value_ :: Text -> (Text,Text)
-value_ = (,) ("value")
-
--- | The @width@ attribute.
-width_ :: Text -> (Text,Text)
-width_ = (,) ("width")
-
--- | The @wrap@ attribute.
-wrap_ :: Text -> (Text,Text)
-wrap_ = (,) ("wrap")
-
--- | The @xmlns@ attribute.
-xmlns_ :: Text -> (Text,Text)
-xmlns_ = (,) ("xmlns")
+{-# LANGUAGE NoMonomorphismRestriction #-}
+{-# OPTIONS -fno-warn-type-defaults #-}
+
+-- | Html5 terms.
+
+module Lucid.Html5 where
+
+import           Lucid.Base
+
+import           Data.Monoid
+import           Data.Text (Text)
+
+-- | @DOCTYPE@ element
+doctype_ :: Monad m => HtmlT m ()
+doctype_ = makeElementNoEnd "!DOCTYPE HTML"
+
+-- | @DOCTYPE@ element + @html@ element
+doctypehtml_ :: Monad m => HtmlT m () -> HtmlT m ()
+doctypehtml_ m =
+  do doctype_
+     html_ m
+
+-- | @a@ element
+a_ :: Term arg result => arg -> result
+a_ = term "a"
+
+-- | @abbr@ element
+abbr_ :: Term arg result => arg -> result
+abbr_ = term "abbr"
+
+-- | @address@ element
+address_ :: Term arg result => arg -> result
+address_ = term "address"
+
+-- | @area@ element
+area_ :: Monad m => [Attribute] -> HtmlT m ()
+area_ = with (makeElementNoEnd "area")
+
+-- | @article@ element
+article_ :: Term arg result => arg -> result
+article_ = term "article"
+
+-- | @aside@ element
+aside_ :: Term arg result => arg -> result
+aside_ = term "aside"
+
+-- | @audio@ element
+audio_ :: Term arg result => arg -> result
+audio_ = term "audio"
+
+-- | @b@ element
+b_ :: Term arg result => arg -> result
+b_ = term "b"
+
+-- | @base@ element
+base_ :: Monad m => [Attribute] -> HtmlT m ()
+base_ = with (makeElementNoEnd "base")
+
+-- | @bdo@ element
+bdo_ :: Term arg result => arg -> result
+bdo_ = term "bdo"
+
+-- | @blockquote@ element
+blockquote_ :: Term arg result => arg -> result
+blockquote_ = term "blockquote"
+
+-- | @body@ element
+body_ :: Term arg result => arg -> result
+body_ = term "body"
+
+-- | @br@ element
+br_ :: Monad m => [Attribute] -> HtmlT m ()
+br_ = with (makeElementNoEnd "br")
+
+-- | @button@ element
+button_ :: Term arg result => arg -> result
+button_ = term "button"
+
+-- | @canvas@ element
+canvas_ :: Term arg result => arg -> result
+canvas_ = term "canvas"
+
+-- | @caption@ element
+caption_ :: Term arg result => arg -> result
+caption_ = term "caption"
+
+-- | @cite@ element or @cite@ attribute.
+cite_ :: Term arg result => arg -> result
+cite_ = term "cite"
+
+-- | @code@ element
+code_ :: Term arg result => arg -> result
+code_ = term "code"
+
+-- | @col@ element
+col_ :: Monad m => [Attribute] -> HtmlT m ()
+col_ = with (makeElementNoEnd "col")
+
+-- | @colgroup@ element
+colgroup_ :: Term arg result => arg -> result
+colgroup_ = term "colgroup"
+
+-- | @command@ element
+command_ :: Term arg result => arg -> result
+command_ = term "command"
+
+-- | @datalist@ element
+datalist_ :: Term arg result => arg -> result
+datalist_ = term "datalist"
+
+-- | @dd@ element
+dd_ :: Term arg result => arg -> result
+dd_ = term "dd"
+
+-- | @del@ element
+del_ :: Term arg result => arg -> result
+del_ = term "del"
+
+-- | @details@ element
+details_ :: Term arg result => arg -> result
+details_ = term "details"
+
+-- | @dfn@ element
+dfn_ :: Term arg result => arg -> result
+dfn_ = term "dfn"
+
+-- | @div@ element
+div_ :: Term arg result => arg -> result
+div_ = term "div"
+
+-- | @dl@ element
+dl_ :: Term arg result => arg -> result
+dl_ = term "dl"
+
+-- | @dt@ element
+dt_ :: Term arg result => arg -> result
+dt_ = term "dt"
+
+-- | @em@ element
+em_ :: Term arg result => arg -> result
+em_ = term "em"
+
+-- | @embed@ element
+embed_ :: Monad m => [Attribute] -> HtmlT m ()
+embed_ = with (makeElementNoEnd "embed")
+
+-- | @fieldset@ element
+fieldset_ :: Term arg result => arg -> result
+fieldset_ = term "fieldset"
+
+-- | @figcaption@ element
+figcaption_ :: Term arg result => arg -> result
+figcaption_ = term "figcaption"
+
+-- | @figure@ element
+figure_ :: Term arg result => arg -> result
+figure_ = term "figure"
+
+-- | @footer@ element
+footer_ :: Term arg result => arg -> result
+footer_ = term "footer"
+
+-- | @form@ element or @form@ attribute
+form_ :: Term arg result => arg -> result
+form_ = term "form"
+
+-- | @h1@ element
+h1_ :: Term arg result => arg -> result
+h1_ = term "h1"
+
+-- | @h2@ element
+h2_ :: Term arg result => arg -> result
+h2_ = term "h2"
+
+-- | @h3@ element
+h3_ :: Term arg result => arg -> result
+h3_ = term "h3"
+
+-- | @h4@ element
+h4_ :: Term arg result => arg -> result
+h4_ = term "h4"
+
+-- | @h5@ element
+h5_ :: Term arg result => arg -> result
+h5_ = term "h5"
+
+-- | @h6@ element
+h6_ :: Term arg result => arg -> result
+h6_ = term "h6"
+
+-- | @head@ element
+head_ :: Term arg result => arg -> result
+head_ = term "head"
+
+-- | @header@ element
+header_ :: Term arg result => arg -> result
+header_ = term "header"
+
+-- | @hgroup@ element
+hgroup_ :: Term arg result => arg -> result
+hgroup_ = term "hgroup"
+
+-- | @hr@ element
+hr_ :: Monad m => [Attribute] -> HtmlT m ()
+hr_ = with (makeElementNoEnd "hr")
+
+-- | @html@ element
+html_ :: Term arg result => arg -> result
+html_ = term "html"
+
+-- | @i@ element
+i_ :: Term arg result => arg -> result
+i_ = term "i"
+
+-- | @iframe@ element
+iframe_ :: Term arg result => arg -> result
+iframe_ = term "iframe"
+
+-- | @img@ element
+img_ :: Monad m => [Attribute] -> HtmlT m ()
+img_ = with (makeElementNoEnd "img")
+
+-- | @input@ element
+input_ :: Monad m => [Attribute] -> HtmlT m ()
+input_ = with (makeElementNoEnd "input")
+
+-- | @ins@ element
+ins_ :: Term arg result => arg -> result
+ins_ = term "ins"
+
+-- | @kbd@ element
+kbd_ :: Term arg result => arg -> result
+kbd_ = term "kbd"
+
+-- | @keygen@ element
+keygen_ :: Monad m => [Attribute] -> HtmlT m ()
+keygen_ = with (makeElementNoEnd "keygen")
+
+-- | @label@ element or @label@ attribute
+label_ :: Term arg result => arg -> result
+label_ = term "label"
+
+-- | @legend@ element
+legend_ :: Term arg result => arg -> result
+legend_ = term "legend"
+
+-- | @li@ element
+li_ :: Term arg result => arg -> result
+li_ = term "li"
+
+-- | @link@ element
+link_ :: Monad m => [Attribute] -> HtmlT m ()
+link_ = with (makeElementNoEnd "link")
+
+-- | @map@ element
+map_ :: Term arg result => arg -> result
+map_ = term "map"
+
+-- | @mark@ element
+mark_ :: Term arg result => arg -> result
+mark_ = term "mark"
+
+-- | @menu@ element
+menu_ :: Term arg result => arg -> result
+menu_ = term "menu"
+
+-- | @menuitem@ element
+menuitem_ :: Monad m => [Attribute] -> HtmlT m ()
+menuitem_ = with (makeElementNoEnd "menuitem")
+
+-- | @meta@ element
+meta_ :: Monad m => [Attribute] -> HtmlT m ()
+meta_ = with (makeElementNoEnd "meta")
+
+-- | @meter@ element
+meter_ :: Term arg result => arg -> result
+meter_ = term "meter"
+
+-- | @nav@ element
+nav_ :: Term arg result => arg -> result
+nav_ = term "nav"
+
+-- | @noscript@ element
+noscript_ :: Term arg result => arg -> result
+noscript_ = term "noscript"
+
+-- | @object@ element
+object_ :: Term arg result => arg -> result
+object_ = term "object"
+
+-- | @ol@ element
+ol_ :: Term arg result => arg -> result
+ol_ = term "ol"
+
+-- | @optgroup@ element
+optgroup_ :: Term arg result => arg -> result
+optgroup_ = term "optgroup"
+
+-- | @option@ element
+option_ :: Term arg result => arg -> result
+option_ = term "option"
+
+-- | @output@ element
+output_ :: Term arg result => arg -> result
+output_ = term "output"
+
+-- | @p@ element
+p_ :: Term arg result => arg -> result
+p_ = term "p"
+
+-- | @param@ element
+param_ :: Monad m => [Attribute] -> HtmlT m ()
+param_ = with (makeElementNoEnd "param")
+
+-- | @pre@ element
+pre_ :: Term arg result => arg -> result
+pre_ = term "pre"
+
+-- | @progress@ element
+progress_ :: Term arg result => arg -> result
+progress_ = term "progress"
+
+-- | @q@ element
+q_ :: Term arg result => arg -> result
+q_ = term "q"
+
+-- | @rp@ element
+rp_ :: Term arg result => arg -> result
+rp_ = term "rp"
+
+-- | @rt@ element
+rt_ :: Term arg result => arg -> result
+rt_ = term "rt"
+
+-- | @ruby@ element
+ruby_ :: Term arg result => arg -> result
+ruby_ = term "ruby"
+
+-- | @samp@ element
+samp_ :: Term arg result => arg -> result
+samp_ = term "samp"
+
+-- | @script@ element
+script_ :: TermRaw arg result => arg -> result
+script_ = termRaw "script"
+
+-- | @section@ element
+section_ :: Term arg result => arg -> result
+section_ = term "section"
+
+-- | @select@ element
+select_ :: Term arg result => arg -> result
+select_ = term "select"
+
+-- | @small@ element
+small_ :: Term arg result => arg -> result
+small_ = term "small"
+
+-- | @source@ element
+source_ :: Monad m => [Attribute] -> HtmlT m ()
+source_ = with (makeElementNoEnd "source")
+
+-- | @span@ element or @span@ attribute
+span_ :: Term arg result => arg -> result
+span_ = term "span"
+
+-- | @strong@ element
+strong_ :: Term arg result => arg -> result
+strong_ = term "strong"
+
+-- | @style@ element or @style@ attribute
+style_ :: TermRaw arg result => arg -> result
+style_ = termRaw "style"
+
+-- | @sub@ element
+sub_ :: Term arg result => arg -> result
+sub_ = term "sub"
+
+-- | @summary@ element or @summary@ attribute
+summary_ :: Term arg result => arg -> result
+summary_ = term "summary"
+
+-- | @sup@ element
+sup_ :: Term arg result => arg -> result
+sup_ = term "sup"
+
+-- | @table@ element
+table_ :: Term arg result => arg -> result
+table_ = term "table"
+
+-- | @tbody@ element
+tbody_ :: Term arg result => arg -> result
+tbody_ = term "tbody"
+
+-- | @td@ element
+td_ :: Term arg result => arg -> result
+td_ = term "td"
+
+-- | @textarea@ element
+textarea_ :: Term arg result => arg -> result
+textarea_ = term "textarea"
+
+-- | @tfoot@ element
+tfoot_ :: Term arg result => arg -> result
+tfoot_ = term "tfoot"
+
+-- | @th@ element
+th_ :: Term arg result => arg -> result
+th_ = term "th"
+
+-- | @thead@ element
+thead_ :: Term arg result => arg -> result
+thead_ = term "thead"
+
+-- | @time@ element
+time_ :: Term arg result => arg -> result
+time_ = term "time"
+
+-- | @title@ element or @title@ attribute
+title_ :: Term arg result => arg -> result
+title_ = term "title"
+
+-- | @tr@ element
+tr_ :: Term arg result => arg -> result
+tr_ = term "tr"
+
+-- | @track@ element
+track_ :: Monad m => [Attribute] -> HtmlT m ()
+track_ = with (makeElementNoEnd "track")
+
+-- | @ul@ element
+ul_ :: Term arg result => arg -> result
+ul_ = term "ul"
+
+-- | @var@ element
+var_ :: Term arg result => arg -> result
+var_ = term "var"
+
+-- | @video@ element
+video_ :: Term arg result => arg -> result
+video_ = term "video"
+
+-- | @wbr@ element
+wbr_ :: Monad m => [Attribute] -> HtmlT m ()
+wbr_ = with (makeElementNoEnd "wbr")
+
+-- | The @accept@ attribute.
+accept_ :: Text -> Attribute
+accept_ = makeAttribute "accept"
+
+-- | The @acceptCharset@ attribute.
+acceptCharset_ :: Text -> Attribute
+acceptCharset_ = makeAttribute "acceptCharset"
+
+-- | The @accesskey@ attribute.
+accesskey_ :: Text -> Attribute
+accesskey_ = makeAttribute "accesskey"
+
+-- | The @action@ attribute.
+action_ :: Text -> Attribute
+action_ = makeAttribute "action"
+
+-- | The @alt@ attribute.
+alt_ :: Text -> Attribute
+alt_ = makeAttribute "alt"
+
+-- | The @async@ attribute.
+async_ :: Text -> Attribute
+async_ = makeAttribute "async"
+
+-- | The @autocomplete@ attribute.
+autocomplete_ :: Text -> Attribute
+autocomplete_ = makeAttribute "autocomplete"
+
+-- | The @autofocus@ attribute.
+autofocus_ :: Attribute
+autofocus_ = makeAttribute "autofocus" mempty
+
+-- | The @autoplay@ attribute.
+autoplay_ :: Text -> Attribute
+autoplay_ = makeAttribute "autoplay"
+
+-- | The @challenge@ attribute.
+challenge_ :: Text -> Attribute
+challenge_ = makeAttribute "challenge"
+
+-- | The @charset@ attribute.
+charset_ :: Text -> Attribute
+charset_ = makeAttribute "charset"
+
+-- | The @checked@ attribute.
+checked_ :: Attribute
+checked_ = makeAttribute "checked" mempty
+
+-- | The @class@ attribute.
+class_ :: Text -> Attribute
+class_ = makeAttribute "class"
+
+-- | The @cols@ attribute.
+cols_ :: Text -> Attribute
+cols_ = makeAttribute "cols"
+
+-- | The @colspan@ attribute.
+colspan_ :: Text -> Attribute
+colspan_ = makeAttribute "colspan"
+
+-- | The @content@ attribute.
+content_ :: Text -> Attribute
+content_ = makeAttribute "content"
+
+-- | The @contenteditable@ attribute.
+contenteditable_ :: Text -> Attribute
+contenteditable_ = makeAttribute "contenteditable"
+
+-- | The @contextmenu@ attribute.
+contextmenu_ :: Text -> Attribute
+contextmenu_ = makeAttribute "contextmenu"
+
+-- | The @controls@ attribute.
+controls_ :: Text -> Attribute
+controls_ = makeAttribute "controls"
+
+-- | The @coords@ attribute.
+coords_ :: Text -> Attribute
+coords_ = makeAttribute "coords"
+
+-- | The @data@ attribute.
+data_ :: Text -> Text -> Attribute
+data_ name = makeAttribute ("data-" <> name)
+
+-- | The @datetime@ attribute.
+datetime_ :: Text -> Attribute
+datetime_ = makeAttribute "datetime"
+
+-- | The @defer@ attribute.
+defer_ :: Text -> Attribute
+defer_ = makeAttribute "defer"
+
+-- | The @dir@ attribute.
+dir_ :: Text -> Attribute
+dir_ = makeAttribute "dir"
+
+-- | The @disabled@ attribute.
+disabled_ :: Text -> Attribute
+disabled_ = makeAttribute "disabled"
+
+-- | The @draggable@ attribute.
+draggable_ :: Text -> Attribute
+draggable_ = makeAttribute "draggable"
+
+-- | The @enctype@ attribute.
+enctype_ :: Text -> Attribute
+enctype_ = makeAttribute "enctype"
+
+-- | The @for@ attribute.
+for_ :: Text -> Attribute
+for_ = makeAttribute "for"
+
+-- | The @formaction@ attribute.
+formaction_ :: Text -> Attribute
+formaction_ = makeAttribute "formaction"
+
+-- | The @formenctype@ attribute.
+formenctype_ :: Text -> Attribute
+formenctype_ = makeAttribute "formenctype"
+
+-- | The @formmethod@ attribute.
+formmethod_ :: Text -> Attribute
+formmethod_ = makeAttribute "formmethod"
+
+-- | The @formnovalidate@ attribute.
+formnovalidate_ :: Text -> Attribute
+formnovalidate_ = makeAttribute "formnovalidate"
+
+-- | The @formtarget@ attribute.
+formtarget_ :: Text -> Attribute
+formtarget_ = makeAttribute "formtarget"
+
+-- | The @headers@ attribute.
+headers_ :: Text -> Attribute
+headers_ = makeAttribute "headers"
+
+-- | The @height@ attribute.
+height_ :: Text -> Attribute
+height_ = makeAttribute "height"
+
+-- | The @hidden@ attribute.
+hidden_ :: Text -> Attribute
+hidden_ = makeAttribute "hidden"
+
+-- | The @high@ attribute.
+high_ :: Text -> Attribute
+high_ = makeAttribute "high"
+
+-- | The @href@ attribute.
+href_ :: Text -> Attribute
+href_ = makeAttribute "href"
+
+-- | The @hreflang@ attribute.
+hreflang_ :: Text -> Attribute
+hreflang_ = makeAttribute "hreflang"
+
+-- | The @httpEquiv@ attribute.
+httpEquiv_ :: Text -> Attribute
+httpEquiv_ = makeAttribute "httpEquiv"
+
+-- | The @icon@ attribute.
+icon_ :: Text -> Attribute
+icon_ = makeAttribute "icon"
+
+-- | The @id@ attribute.
+id_ :: Text -> Attribute
+id_ = makeAttribute "id"
+
+-- | The @ismap@ attribute.
+ismap_ :: Text -> Attribute
+ismap_ = makeAttribute "ismap"
+
+-- | The @item@ attribute.
+item_ :: Text -> Attribute
+item_ = makeAttribute "item"
+
+-- | The @itemprop@ attribute.
+itemprop_ :: Text -> Attribute
+itemprop_ = makeAttribute "itemprop"
+
+-- | The @keytype@ attribute.
+keytype_ :: Text -> Attribute
+keytype_ = makeAttribute "keytype"
+
+-- | The @lang@ attribute.
+lang_ :: Text -> Attribute
+lang_ = makeAttribute "lang"
+
+-- | The @list@ attribute.
+list_ :: Text -> Attribute
+list_ = makeAttribute "list"
+
+-- | The @loop@ attribute.
+loop_ :: Text -> Attribute
+loop_ = makeAttribute "loop"
+
+-- | The @low@ attribute.
+low_ :: Text -> Attribute
+low_ = makeAttribute "low"
+
+-- | The @manifest@ attribute.
+manifest_ :: Text -> Attribute
+manifest_ = makeAttribute "manifest"
+
+-- | The @max@ attribute.
+max_ :: Text -> Attribute
+max_ = makeAttribute "max"
+
+-- | The @maxlength@ attribute.
+maxlength_ :: Text -> Attribute
+maxlength_ = makeAttribute "maxlength"
+
+-- | The @media@ attribute.
+media_ :: Text -> Attribute
+media_ = makeAttribute "media"
+
+-- | The @method@ attribute.
+method_ :: Text -> Attribute
+method_ = makeAttribute "method"
+
+-- | The @min@ attribute.
+min_ :: Text -> Attribute
+min_ = makeAttribute "min"
+
+-- | The @multiple@ attribute.
+multiple_ :: Text -> Attribute
+multiple_ = makeAttribute "multiple"
+
+-- | The @name@ attribute.
+name_ :: Text -> Attribute
+name_ = makeAttribute "name"
+
+-- | The @novalidate@ attribute.
+novalidate_ :: Text -> Attribute
+novalidate_ = makeAttribute "novalidate"
+
+-- | The @onbeforeonload@ attribute.
+onbeforeonload_ :: Text -> Attribute
+onbeforeonload_ = makeAttribute "onbeforeonload"
+
+-- | The @onbeforeprint@ attribute.
+onbeforeprint_ :: Text -> Attribute
+onbeforeprint_ = makeAttribute "onbeforeprint"
+
+-- | The @onblur@ attribute.
+onblur_ :: Text -> Attribute
+onblur_ = makeAttribute "onblur"
+
+-- | The @oncanplay@ attribute.
+oncanplay_ :: Text -> Attribute
+oncanplay_ = makeAttribute "oncanplay"
+
+-- | The @oncanplaythrough@ attribute.
+oncanplaythrough_ :: Text -> Attribute
+oncanplaythrough_ = makeAttribute "oncanplaythrough"
+
+-- | The @onchange@ attribute.
+onchange_ :: Text -> Attribute
+onchange_ = makeAttribute "onchange"
+
+-- | The @onclick@ attribute.
+onclick_ :: Text -> Attribute
+onclick_ = makeAttribute "onclick"
+
+-- | The @oncontextmenu@ attribute.
+oncontextmenu_ :: Text -> Attribute
+oncontextmenu_ = makeAttribute "oncontextmenu"
+
+-- | The @ondblclick@ attribute.
+ondblclick_ :: Text -> Attribute
+ondblclick_ = makeAttribute "ondblclick"
+
+-- | The @ondrag@ attribute.
+ondrag_ :: Text -> Attribute
+ondrag_ = makeAttribute "ondrag"
+
+-- | The @ondragend@ attribute.
+ondragend_ :: Text -> Attribute
+ondragend_ = makeAttribute "ondragend"
+
+-- | The @ondragenter@ attribute.
+ondragenter_ :: Text -> Attribute
+ondragenter_ = makeAttribute "ondragenter"
+
+-- | The @ondragleave@ attribute.
+ondragleave_ :: Text -> Attribute
+ondragleave_ = makeAttribute "ondragleave"
+
+-- | The @ondragover@ attribute.
+ondragover_ :: Text -> Attribute
+ondragover_ = makeAttribute "ondragover"
+
+-- | The @ondragstart@ attribute.
+ondragstart_ :: Text -> Attribute
+ondragstart_ = makeAttribute "ondragstart"
+
+-- | The @ondrop@ attribute.
+ondrop_ :: Text -> Attribute
+ondrop_ = makeAttribute "ondrop"
+
+-- | The @ondurationchange@ attribute.
+ondurationchange_ :: Text -> Attribute
+ondurationchange_ = makeAttribute "ondurationchange"
+
+-- | The @onemptied@ attribute.
+onemptied_ :: Text -> Attribute
+onemptied_ = makeAttribute "onemptied"
+
+-- | The @onended@ attribute.
+onended_ :: Text -> Attribute
+onended_ = makeAttribute "onended"
+
+-- | The @onerror@ attribute.
+onerror_ :: Text -> Attribute
+onerror_ = makeAttribute "onerror"
+
+-- | The @onfocus@ attribute.
+onfocus_ :: Text -> Attribute
+onfocus_ = makeAttribute "onfocus"
+
+-- | The @onformchange@ attribute.
+onformchange_ :: Text -> Attribute
+onformchange_ = makeAttribute "onformchange"
+
+-- | The @onforminput@ attribute.
+onforminput_ :: Text -> Attribute
+onforminput_ = makeAttribute "onforminput"
+
+-- | The @onhaschange@ attribute.
+onhaschange_ :: Text -> Attribute
+onhaschange_ = makeAttribute "onhaschange"
+
+-- | The @oninput@ attribute.
+oninput_ :: Text -> Attribute
+oninput_ = makeAttribute "oninput"
+
+-- | The @oninvalid@ attribute.
+oninvalid_ :: Text -> Attribute
+oninvalid_ = makeAttribute "oninvalid"
+
+-- | The @onkeydown@ attribute.
+onkeydown_ :: Text -> Attribute
+onkeydown_ = makeAttribute "onkeydown"
+
+-- | The @onkeyup@ attribute.
+onkeyup_ :: Text -> Attribute
+onkeyup_ = makeAttribute "onkeyup"
+
+-- | The @onload@ attribute.
+onload_ :: Text -> Attribute
+onload_ = makeAttribute "onload"
+
+-- | The @onloadeddata@ attribute.
+onloadeddata_ :: Text -> Attribute
+onloadeddata_ = makeAttribute "onloadeddata"
+
+-- | The @onloadedmetadata@ attribute.
+onloadedmetadata_ :: Text -> Attribute
+onloadedmetadata_ = makeAttribute "onloadedmetadata"
+
+-- | The @onloadstart@ attribute.
+onloadstart_ :: Text -> Attribute
+onloadstart_ = makeAttribute "onloadstart"
+
+-- | The @onmessage@ attribute.
+onmessage_ :: Text -> Attribute
+onmessage_ = makeAttribute "onmessage"
+
+-- | The @onmousedown@ attribute.
+onmousedown_ :: Text -> Attribute
+onmousedown_ = makeAttribute "onmousedown"
+
+-- | The @onmousemove@ attribute.
+onmousemove_ :: Text -> Attribute
+onmousemove_ = makeAttribute "onmousemove"
+
+-- | The @onmouseout@ attribute.
+onmouseout_ :: Text -> Attribute
+onmouseout_ = makeAttribute "onmouseout"
+
+-- | The @onmouseover@ attribute.
+onmouseover_ :: Text -> Attribute
+onmouseover_ = makeAttribute "onmouseover"
+
+-- | The @onmouseup@ attribute.
+onmouseup_ :: Text -> Attribute
+onmouseup_ = makeAttribute "onmouseup"
+
+-- | The @onmousewheel@ attribute.
+onmousewheel_ :: Text -> Attribute
+onmousewheel_ = makeAttribute "onmousewheel"
+
+-- | The @ononline@ attribute.
+ononline_ :: Text -> Attribute
+ononline_ = makeAttribute "ononline"
+
+-- | The @onpagehide@ attribute.
+onpagehide_ :: Text -> Attribute
+onpagehide_ = makeAttribute "onpagehide"
+
+-- | The @onpageshow@ attribute.
+onpageshow_ :: Text -> Attribute
+onpageshow_ = makeAttribute "onpageshow"
+
+-- | The @onpause@ attribute.
+onpause_ :: Text -> Attribute
+onpause_ = makeAttribute "onpause"
+
+-- | The @onplay@ attribute.
+onplay_ :: Text -> Attribute
+onplay_ = makeAttribute "onplay"
+
+-- | The @onplaying@ attribute.
+onplaying_ :: Text -> Attribute
+onplaying_ = makeAttribute "onplaying"
+
+-- | The @onprogress@ attribute.
+onprogress_ :: Text -> Attribute
+onprogress_ = makeAttribute "onprogress"
+
+-- | The @onpropstate@ attribute.
+onpropstate_ :: Text -> Attribute
+onpropstate_ = makeAttribute "onpropstate"
+
+-- | The @onratechange@ attribute.
+onratechange_ :: Text -> Attribute
+onratechange_ = makeAttribute "onratechange"
+
+-- | The @onreadystatechange@ attribute.
+onreadystatechange_ :: Text -> Attribute
+onreadystatechange_ = makeAttribute "onreadystatechange"
+
+-- | The @onredo@ attribute.
+onredo_ :: Text -> Attribute
+onredo_ = makeAttribute "onredo"
+
+-- | The @onresize@ attribute.
+onresize_ :: Text -> Attribute
+onresize_ = makeAttribute "onresize"
+
+-- | The @onscroll@ attribute.
+onscroll_ :: Text -> Attribute
+onscroll_ = makeAttribute "onscroll"
+
+-- | The @onseeked@ attribute.
+onseeked_ :: Text -> Attribute
+onseeked_ = makeAttribute "onseeked"
+
+-- | The @onseeking@ attribute.
+onseeking_ :: Text -> Attribute
+onseeking_ = makeAttribute "onseeking"
+
+-- | The @onselect@ attribute.
+onselect_ :: Text -> Attribute
+onselect_ = makeAttribute "onselect"
+
+-- | The @onstalled@ attribute.
+onstalled_ :: Text -> Attribute
+onstalled_ = makeAttribute "onstalled"
+
+-- | The @onstorage@ attribute.
+onstorage_ :: Text -> Attribute
+onstorage_ = makeAttribute "onstorage"
+
+-- | The @onsubmit@ attribute.
+onsubmit_ :: Text -> Attribute
+onsubmit_ = makeAttribute "onsubmit"
+
+-- | The @onsuspend@ attribute.
+onsuspend_ :: Text -> Attribute
+onsuspend_ = makeAttribute "onsuspend"
+
+-- | The @ontimeupdate@ attribute.
+ontimeupdate_ :: Text -> Attribute
+ontimeupdate_ = makeAttribute "ontimeupdate"
+
+-- | The @onundo@ attribute.
+onundo_ :: Text -> Attribute
+onundo_ = makeAttribute "onundo"
+
+-- | The @onunload@ attribute.
+onunload_ :: Text -> Attribute
+onunload_ = makeAttribute "onunload"
+
+-- | The @onvolumechange@ attribute.
+onvolumechange_ :: Text -> Attribute
+onvolumechange_ = makeAttribute "onvolumechange"
+
+-- | The @onwaiting@ attribute.
+onwaiting_ :: Text -> Attribute
+onwaiting_ = makeAttribute "onwaiting"
+
+-- | The @open@ attribute.
+open_ :: Text -> Attribute
+open_ = makeAttribute "open"
+
+-- | The @optimum@ attribute.
+optimum_ :: Text -> Attribute
+optimum_ = makeAttribute "optimum"
+
+-- | The @pattern@ attribute.
+pattern_ :: Text -> Attribute
+pattern_ = makeAttribute "pattern"
+
+-- | The @ping@ attribute.
+ping_ :: Text -> Attribute
+ping_ = makeAttribute "ping"
+
+-- | The @placeholder@ attribute.
+placeholder_ :: Text -> Attribute
+placeholder_ = makeAttribute "placeholder"
+
+-- | The @preload@ attribute.
+preload_ :: Text -> Attribute
+preload_ = makeAttribute "preload"
+
+-- | The @pubdate@ attribute.
+pubdate_ :: Text -> Attribute
+pubdate_ = makeAttribute "pubdate"
+
+-- | The @radiogroup@ attribute.
+radiogroup_ :: Text -> Attribute
+radiogroup_ = makeAttribute "radiogroup"
+
+-- | The @readonly@ attribute.
+readonly_ :: Text -> Attribute
+readonly_ = makeAttribute "readonly"
+
+-- | The @rel@ attribute.
+rel_ :: Text -> Attribute
+rel_ = makeAttribute "rel"
+
+-- | The @required@ attribute.
+required_ :: Text -> Attribute
+required_ = makeAttribute "required"
+
+-- | The @reversed@ attribute.
+reversed_ :: Text -> Attribute
+reversed_ = makeAttribute "reversed"
+
+-- | The @rows@ attribute.
+rows_ :: Text -> Attribute
+rows_ = makeAttribute "rows"
+
+-- | The @rowspan@ attribute.
+rowspan_ :: Text -> Attribute
+rowspan_ = makeAttribute "rowspan"
+
+-- | The @sandbox@ attribute.
+sandbox_ :: Text -> Attribute
+sandbox_ = makeAttribute "sandbox"
+
+-- | The @scope@ attribute.
+scope_ :: Text -> Attribute
+scope_ = makeAttribute "scope"
+
+-- | The @scoped@ attribute.
+scoped_ :: Text -> Attribute
+scoped_ = makeAttribute "scoped"
+
+-- | The @seamless@ attribute.
+seamless_ :: Text -> Attribute
+seamless_ = makeAttribute "seamless"
+
+-- | The @selected@ attribute.
+selected_ :: Text -> Attribute
+selected_ = makeAttribute "selected"
+
+-- | The @shape@ attribute.
+shape_ :: Text -> Attribute
+shape_ = makeAttribute "shape"
+
+-- | The @size@ attribute.
+size_ :: Text -> Attribute
+size_ = makeAttribute "size"
+
+-- | The @sizes@ attribute.
+sizes_ :: Text -> Attribute
+sizes_ = makeAttribute "sizes"
+
+-- | The @spellcheck@ attribute.
+spellcheck_ :: Text -> Attribute
+spellcheck_ = makeAttribute "spellcheck"
+
+-- | The @src@ attribute.
+src_ :: Text -> Attribute
+src_ = makeAttribute "src"
+
+-- | The @srcdoc@ attribute.
+srcdoc_ :: Text -> Attribute
+srcdoc_ = makeAttribute "srcdoc"
+
+-- | The @start@ attribute.
+start_ :: Text -> Attribute
+start_ = makeAttribute "start"
+
+-- | The @step@ attribute.
+step_ :: Text -> Attribute
+step_ = makeAttribute "step"
+
+-- | The @subject@ attribute.
+subject_ :: Text -> Attribute
+subject_ = makeAttribute "subject"
+
+-- | The @tabindex@ attribute.
+tabindex_ :: Text -> Attribute
+tabindex_ = makeAttribute "tabindex"
+
+-- | The @target@ attribute.
+target_ :: Text -> Attribute
+target_ = makeAttribute "target"
+
+-- | The @type@ attribute.
+type_ :: Text -> Attribute
+type_ = makeAttribute "type"
+
+-- | The @usemap@ attribute.
+usemap_ :: Text -> Attribute
+usemap_ = makeAttribute "usemap"
+
+-- | The @value@ attribute.
+value_ :: Text -> Attribute
+value_ = makeAttribute "value"
+
+-- | The @width@ attribute.
+width_ :: Text -> Attribute
+width_ = makeAttribute "width"
+
+-- | The @wrap@ attribute.
+wrap_ :: Text -> Attribute
+wrap_ = makeAttribute "wrap"
+
+-- | The @xmlns@ attribute.
+xmlns_ :: Text -> Attribute
+xmlns_ = makeAttribute "xmlns"
diff --git a/test/Example1.hs b/test/Example1.hs
new file mode 100644
--- /dev/null
+++ b/test/Example1.hs
@@ -0,0 +1,72 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-type-defaults #-}
+
+-- | An example which should always compile and demonstrates \"real\"
+-- code.
+
+module Example1 where
+
+import Control.Monad
+import Lucid
+
+demo :: Html ()
+demo =
+  doctypehtml_
+    (do head_ (do meta_ [charset_ "utf-8"]
+                  meta_ [name_ "viewport"
+                        ,content_ "width=device-width, initial-scale=1"]
+                  link_ [href_ "//fonts.googleapis.com/css?family=Open+Sans"
+                        ,rel_ "stylesheet"
+                        ,type_ "text/css"]
+                  link_ [href_ "//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.1.0/css/bootstrap.min.css"
+                        ,rel_ "stylesheet"
+                        ,type_ "text/css"]
+                  title_ "YSU Closing Status")
+        body_ (div_ [class_ "container"]
+                    (do h1_ "YSU Closing Status"
+                        t_ [class_ "deal"] "So, here's the deal:"
+                        t_ (do "The weather is currently "
+                               strong_ "(unknown)"
+                               " and "
+                               strong_ "(unknown)"
+                               ".")
+                        t_ (do "There are currently "
+                               strong_ "Closings!"
+                               " delays/closings according to a local (Youngstown) news source.")
+                        t_ (do "Youngstown State University "
+                               strong_ (if False
+                                           then span_ [style_ "color: green;"] "WAS mentioned"
+                                           else span_ [style_ "color: red;"] "was NOT mentioned")
+                               " among them.")
+                        t_ (do "There are currently "
+                               strong_ (toHtml (maybe "unknown" show (Just 123 :: Maybe Int)))
+                               " weather alert(s) covering Youngstown as of "
+                               strong_ "2014-23-23"
+                               ".")
+                        when (0 /= 1)
+                             (ul_ (mapM_ (\w ->
+                                            li_ (do strong_ "Foo"
+                                                    " expiring "
+                                                    toHtml (show w)))
+                                         [1 .. 5]))
+                        hr_ []
+                        p_ [style_ "text-align: center;"]
+                           (small_ (do "This website is not affiliated Youngstown "
+                                       "State University in any way. It was "
+                                       (a_ [href_ "https://github.com/relrod/isysuclosed.com/"]
+                                           "written")
+                                       " to make a point."))
+                        p_ [style_ "text-align: center;"]
+                           (small_ (do "While hopefully accurate, this is NOT an official "
+                                       "resource. Always confirm "
+                                       a_ [href_ "https://swww.ysu.edu/downloads/closing_procedure.pdf"]
+                                          "official"
+                                       " resources."))
+                        p_ [style_ "text-align: center; color: #888888"]
+                           (small_ "Valid HTML5. Weather information via Weather Underground.")
+                        img_ [style_ "display: block; margin: 0 auto; width: 180px;"
+                             ,src_ "http://icons.wxug.com/logos/images/wundergroundLogo_4c_horz.jpg"
+                             ,alt_ "Weather Underground Logo"])))
+  where t_ :: Term a r
+           => a -> r
+        t_ = termWith "p" [class_ " t "]
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -1,14 +1,16 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE NoMonomorphismRestriction #-}
 {-# LANGUAGE ExtendedDefaultRules #-}
 
--- | Test suite for ACE.
+-- | Test suite for Lucid.
 
 module Main where
 
 import Lucid
+import Lucid.Bootstrap
 
+import Example1
+
 import Test.HUnit
 import Test.Hspec
 
@@ -22,7 +24,11 @@
   describe "text" testText
   describe "elements" testElements
   describe "attributes" testAttributes
+  describe "attributes-with" testAttributesWith
+  describe "extension" testExtension
+  describe "special-elements" testSpecials
 
+-- | Test text/unicode.
 testText :: Spec
 testText =
   do it "simple"
@@ -35,6 +41,7 @@
         (renderText "fo\243o\333o(\4326\728\8995\728\4326) \9835\65381*:.\65377. .\65377.:*\65381" ==
          "fo\243o\333o(\4326\728\8995\728\4326) \9835\65381*:.\65377. .\65377.:*\65381")
 
+-- | Test basic elements and nesting.
 testElements :: Spec
 testElements =
   do it "simple"
@@ -56,12 +63,58 @@
         (renderText (p_ (style_ "")) ==
          "<p><style></style></p>")
      it "no closing"
-        (renderText (p_ input_) ==
+        (renderText (p_ (input_ [])) ==
          "<p><input></p>")
 
+-- | Test that attribute assigning works properly.
 testAttributes :: Spec
 testAttributes =
   do it "simple"
+        (renderText (p_ [class_ "foo"] "foo") ==
+         "<p class=\"foo\">foo</p>")
+     it "escaping"
+        (renderText (p_ [class_ "foo"] "'<>") ==
+         "<p class=\"foo\">&#39;&lt;&gt;</p>")
+     it "unicode"
+        (renderText
+           (p_ [class_ "foo"]
+               "fo\243o\333o(\4326\728\8995\728\4326) \9835\65381*:.\65377. .\65377.:*\65381") ==
+         ("<p class=\"foo\">fo\243o\333o(\4326\728\8995\728\4326) \9835\65381*:.\65377. .\65377.:*\65381</p>"))
+     it "nesting"
+        (renderText
+           (p_ [class_ "foo"]
+               (p_ "Hello!")) ==
+         "<p class=\"foo\"><p>Hello!</p></p>")
+     it "empty"
+        (renderText
+           (p_ [class_ "foo"]
+               (p_ "")) ==
+         "<p class=\"foo\"><p></p></p>")
+     it "mixed"
+        (renderText
+           (p_ [class_ "foo",style_ "attrib"]
+               (style_ "")) ==
+         "<p style=\"attrib\" class=\"foo\"><style></style></p>")
+     it "no closing"
+        (renderText (p_ [class_ "foo"] (input_ [])) ==
+         "<p class=\"foo\"><input></p>")
+     it "multiple"
+        (renderText (p_ [class_ "foo",id_ "zot"] "foo") ==
+         "<p id=\"zot\" class=\"foo\">foo</p>")
+     it "encoded"
+        (renderText (p_ [class_ "foo<>"] "foo") ==
+         "<p class=\"foo&lt;&gt;\">foo</p>")
+     it "nesting attributes"
+        (renderText
+           (with (p_ [class_ "foo"])
+                 [class_ "bar"]
+                 "foo") ==
+         "<p class=\"foobar\">foo</p>")
+
+-- | Test that the `with' combinator still works as expected.
+testAttributesWith :: Spec
+testAttributesWith =
+  do it "simple"
         (renderText (with p_ [class_ "foo"] "foo") ==
          "<p class=\"foo\">foo</p>")
      it "escaping"
@@ -88,12 +141,12 @@
      it "mixed"
         (renderText
            (with p_
-                 [class_ "foo"]
+                 [class_ "foo",style_ "attrib"]
                  (style_ "")) ==
-         "<p class=\"foo\"><style></style></p>")
+         "<p style=\"attrib\" class=\"foo\"><style></style></p>")
      it "no closing"
-        (renderText (with p_ [class_ "foo"] input_) ==
-         "<p class=\"foo\"><input></p>")
+        (renderText (with p_ [class_ "foo"] (with (input_ [type_ "text"]) [class_ "zot"])) ==
+         "<p class=\"foo\"><input type=\"text\" class=\"zot\"></p>")
      it "multiple"
         (renderText (with p_ [class_ "foo",id_ "zot"] "foo") ==
          "<p id=\"zot\" class=\"foo\">foo</p>")
@@ -103,3 +156,24 @@
      it "nesting attributes"
         (renderText (with (with p_ [class_ "foo"]) [class_ "bar"] "foo") ==
          "<p class=\"foobar\">foo</p>")
+
+-- | Test that one can use elements with extensible attributes.
+testExtension :: Spec
+testExtension =
+  do it "bootstrap"
+        (renderText (container_ "Foo!") ==
+         "<div class=\" container \">Foo!</div>")
+     it "bootstrap-attributes-extended"
+        (renderText (container_ [class_ "bar",id_ "zot"] "Foo!") ==
+         "<div id=\"zot\" class=\" container bar\">Foo!</div>")
+
+-- | Test special elements that do something different to normal
+-- elements.
+testSpecials :: Spec
+testSpecials =
+  do it "script"
+        (renderText (script_ "alert('Hello, World!')") ==
+         "<script>alert('Hello, World!')</script>")
+     it "style"
+        (renderText (style_ "body{background:url('Hello, World!')}") ==
+         "<style>body{background:url('Hello, World!')}</style>")
