     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[head title body div span p a]
    |> Enum.each fn name ->
      sym = :"#{name}"
      @spec unquote(sym)(attrs, content) :: out_tag
      @spec unquote(sym)() :: out_tag
      def unquote(sym)(attrs\\[], inner), do: tag(unquote(sym), attrs, inner)
      def unquote(sym)(), do: tag(unquote(sym))
    end

    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
