Current section
Files
Jump to
Current section
Files
lib/surface_bulma.ex
defmodule SurfaceBulma do
@moduledoc """
This component library is a work in progress that aims to implement the Bulma framework is Surface.
"""
defmodule SizeProp do
defmacro __using__(component_doc_name) do
component_doc_name =
if component_doc_name != [] do
component_doc_name
else
Module.split(__CALLER__.module) |> List.last() |> String.downcase()
end
quote do
@doc "The color of the #{unquote(component_doc_name)}."
prop size, :string, values: ~w(small normal medium large)
end
end
end
defmodule ColorProp do
@moduledoc false
defmacro __using__(component_doc_name) do
component_doc_name =
if component_doc_name != [] do
component_doc_name
else
Module.split(__CALLER__.module) |> List.last() |> String.downcase()
end
quote do
@doc "The color of the #{unquote(component_doc_name)}."
prop color, :string,
values: ~w(white black light dark primary link info success warning danger)
end
end
end
defmodule ClassProp do
@moduledoc false
defmacro __using__(opts \\ []) do
default = opts[:default]
doc =
opts[:doc] ||
"Additional CSS classes#{(default && ", default is: #{inspect(default)}") || ""}"
quote bind_quoted: [default: default, doc: doc] do
import SurfaceBulma, only: [classes: 1, classes: 2]
@doc doc
prop class, :css_class, default: default
end
end
end
defmodule ContextClass do
@moduledoc false
defmacro __using__(_) do
quote do
import SurfaceBulma, only: [classes: 1, classes: 2]
@doc false
data context_class, :css_class, from_context: {unquote(__CALLER__.module), :context_class}
end
end
end
def classes(assigns, classes \\ []) do
context_class = normalize_class(assigns[:context_class])
class = normalize_class(assigns[:class])
classes = normalize_class(classes)
class ++ context_class ++ classes
end
defp normalize_class(class) do
cond do
is_binary(class) ->
[{class, true}]
is_list(class) ->
class
true ->
[]
end
end
end