Packages
mob
0.7.3
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.26
0.6.25
0.6.24
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.2
0.6.1
0.6.0
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.11
0.5.10
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.0
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
BEAM-on-device mobile framework for Elixir
Current section
Files
Jump to
Current section
Files
lib/mob/style.ex
defmodule Mob.Style do
@moduledoc """
Thin wrapper around a props map for named, reusable styles.
The struct type lets the `~MOB` sigil (and future tooling) distinguish a
style value from a plain data map. At serialisation time `Mob.Renderer`
merges a style's props into the node's own props — there is no runtime
overhead.
## Defining styles
# As a module attribute — compiled to a constant
@header %Mob.Style{props: %{text_size: :xl, text_color: :white, background: :primary, padding: 16}}
@btn %Mob.Style{props: %{text_size: :lg, text_color: :white, padding: 12}}
@btn_primary Mob.Style.put(@btn, :background, :blue_700)
@btn_danger Mob.Style.put(@btn, :background, :red_500)
## Using styles in a node
%{
type: :text,
props: %{style: @header, text: "Title"},
children: []
}
Inline props override style values, so:
%{
type: :text,
props: %{style: @header, text_size: :base}, # overrides :xl from @header
children: []
}
Token values (`:primary`, `:xl`, `:white`, etc.) are resolved by
`Mob.Renderer` before JSON serialisation — the native side always
receives plain integers and floats.
"""
@enforce_keys []
defstruct props: %{}
@type t :: %__MODULE__{props: map()}
@doc "Merge two styles; keys in `b` win over keys in `a`."
@spec merge(t(), t()) :: t()
def merge(%__MODULE__{props: a}, %__MODULE__{props: b}) do
%__MODULE__{props: Map.merge(a, b)}
end
@doc "Return a copy of `style` with `key` set to `value`."
@spec put(t(), atom(), term()) :: t()
def put(%__MODULE__{props: p} = s, key, value) do
%{s | props: Map.put(p, key, value)}
end
end