content: -- |
  -- Module      :  React
  -- Copyright   :  (C) 2014-15 Joel Burget
  -- License     :  MIT
  -- Maintainer  :  Joel Burget <joelburget@gmail.com>
  -- Stability   :  experimental
  -- Portability :  non-portable
  --
  -- Usage:
  --
  -- This tutorial assumes only a basic understanding of React, the DOM, and
  -- browser events. I recomment at least skimming the [official React
  -- tutorial](https://facebook.github.io/react/docs/tutorial.html).
  --
  -- Let's start with a basic example:
  --
  -- @
  -- page_ :: ReactNode Void
  -- page_ =
  --     let cls = smartClass
  --             { name = "page"
  --
  --             -- initially the input is empty
  --             , initialState = ""
  --
  --             -- always transition to the input's new value
  --             , transition = \(_, value) -> (value, Nothing)
  --
  --             , renderFn = \_ str -> div_ [ class_ "container" ] $ do
  --                 input_ [ value_ str, onChange (Just . value . target) ]
  --             }
  --     in classLeaf cls ()
  --
  -- main :: IO ()
  -- main = do
  --     Just doc <- currentDocument
  --     Just elem <- documentGetElementById doc ("elem" :: JSString)
  --     render page_ elem
  -- @
  --
  -- In this example we defined a React class with 'Text' state, but taking only
  -- @()@ as a prop. It's possible to use anything for props and state --
  -- numbers, JSON, even React classes.
  --
  -- In the example the input always contains the state from the class, and the
  -- state is updated on every input change event -- effectively, every
  -- keystroke.
  module React
      (
      -- * Classes
        ReactClass()
      , ClassConfig(..)
      , ClassCtx
      , smartClass
      , dumbClass
  
      -- * Rendering
      , render
      , debugRender
  
      -- * React Nodes
      , ReactNode
  
      -- * Events
      , module React.Events
  
      -- * Local
      , module React.Local
  
      -- XXX(joel)
      , AttrOrHandler()
  
      -- TODO - create React.Internal module for these?
      -- * Attributes
      , module React.Attrs
  
      -- * Creating Elements
      , module React.Elements
  
      -- * JS Interop
      , ImportedClass
  
      -- * PropTypes
      , PropRequired(IsRequired, IsntRequired)
      , PropType(..)
      , PropTypable
      ) where
  
  -- TODO
  -- restricted monads
  -- store elem in monad
  -- escaping / dangerouslySetInnerHTML
  
  import React.Class
  import React.Imports
  import React.Local
  import React.Render
  import React.Types
  
  import React.Attrs
  import React.Elements
  import React.Events
  import React.Rebindable
  import React.PropTypes
  