     end
   end
 
-  @type attrs    :: TagBase.attrs
-  @type content  :: TagBase.content
-  @type out_tag  :: TagBase.out_tag
-  @type out_tag1 :: TagBase.out_tag1
-  # is it a bug in Elixir that above is needed?
 
-
-  @spec html(attrs, list) :: out_tag
+  @spec html(T.attrs, list) :: T.out_tag
 
   def html(attrs\\[], inner) do
     [ "<!DOCTYPE html>" | tag(:html, attrs, inner) ]

  ~w[meta link br img]
    |> Enum.each fn name ->
      sym = :"#{name}"
      @spec unquote(sym)(attrs) :: out_tag1
      def unquote(sym)(attrs\\[]), do: tag1(unquote(sym), attrs)
    end


  @spec css(String.t) :: out_tag1

  def css(path), do: link([rel: "stylesheet", type: "text/css", href: path])


  @spec script(attrs | String.t) :: out_tag

  def script(src: link) do
    tag(:script, [type: "text/javascript", src: link], [])

    tag(:script, [type: "text/javascript"], text)
  end

  @spec grid(list, T.content) :: T.out_tag

  def grid(args, body) when is_list(args) do
    args = args |> Enum.map(fn
