Current section
Files
Jump to
Current section
Files
src/legos@font.erl
-module(legos@font).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/legos/font.gleam").
-export([color/1, family/1, serif/0, sans_serif/0, monospace/0, typeface/1, with/1, size_by_capital/0, full/0, external/1, size/1, letter_spacing/1, word_spacing/1, align_left/0, align_right/0, center/0, justify/0, underline/0, strike/0, italic/0, bold/0, light/0, hairline/0, extra_light/0, regular/0, semi_bold/0, medium/0, extra_bold/0, heavy/0, unitalicized/0, shadow/1, glow/2, variant/1, variant_list/1, small_caps/0, slashed_zero/0, ligatures/0, ordinal/0, tabular_numbers/0, stacked_fractions/0, diagonal_fractions/0, swash/1, feature/2, indexed/2]).
-export_type([adjustment/0, font_config/0, external_font_config/0, text_shadow_config/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type adjustment() :: {adjustment, float(), float(), float(), float()}.
-type font_config() :: {font_config,
binary(),
gleam@option:option(legos@internal@model:adjustment()),
list(legos@internal@model:variant())}.
-type external_font_config() :: {external_font_config, binary(), binary()}.
-type text_shadow_config() :: {text_shadow_config,
{float(), float()},
float(),
legos@internal@model:color()}.
-file("src/legos/font.gleam", 27).
?DOC(" Set the font color\n").
-spec color(legos@internal@model:color()) -> legos@internal@model:attribute(any(), any()).
color(Font_color) ->
{style_class,
legos@internal@flag:font_color(),
{colored,
<<"fc-"/utf8,
(legos@internal@model:format_color_class(Font_color))/binary>>,
<<"color"/utf8>>,
Font_color}}.
-file("src/legos/font.gleam", 39).
?DOC(" Set the font family from a list of fonts\n").
-spec family(list(legos@internal@model:font())) -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
family(Families) ->
{style_class,
legos@internal@flag:font_family(),
{font_family,
gleam@list:fold(
Families,
<<"ff-"/utf8>>,
fun legos@internal@model:render_font_class_name/2
),
Families}}.
-file("src/legos/font.gleam", 50).
?DOC(" A serif font\n").
-spec serif() -> legos@internal@model:font().
serif() ->
serif.
-file("src/legos/font.gleam", 55).
?DOC(" A sans-serif font\n").
-spec sans_serif() -> legos@internal@model:font().
sans_serif() ->
sans_serif.
-file("src/legos/font.gleam", 60).
?DOC(" A monospace font\n").
-spec monospace() -> legos@internal@model:font().
monospace() ->
monospace.
-file("src/legos/font.gleam", 65).
?DOC(" A specific typeface by name\n").
-spec typeface(binary()) -> legos@internal@model:font().
typeface(Name) ->
{typeface, Name}.
-file("src/legos/font.gleam", 78).
?DOC(" Create a font with custom properties\n").
-spec with(font_config()) -> legos@internal@model:font().
with(Config) ->
{font_with,
erlang:element(2, Config),
erlang:element(3, Config),
erlang:element(4, Config)}.
-file("src/legos/font.gleam", 83).
?DOC(" Size by capital height\n").
-spec size_by_capital() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
size_by_capital() ->
legos@internal@model:html_class(<<"cap"/utf8>>).
-file("src/legos/font.gleam", 88).
?DOC(" Full size\n").
-spec full() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
full() ->
legos@internal@model:html_class(<<"fs"/utf8>>).
-file("src/legos/font.gleam", 97).
?DOC(" Import an external font\n").
-spec external(external_font_config()) -> legos@internal@model:font().
external(Config) ->
{import_font, erlang:element(3, Config), erlang:element(2, Config)}.
-file("src/legos/font.gleam", 102).
?DOC(" Set font size in pixels\n").
-spec size(integer()) -> legos@internal@model:attribute(any(), any()).
size(I) ->
{style_class, legos@internal@flag:font_size(), {font_size, I}}.
-file("src/legos/font.gleam", 107).
?DOC(" Set letter spacing in pixels\n").
-spec letter_spacing(float()) -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
letter_spacing(Offset) ->
{style_class,
legos@internal@flag:letter_spacing(),
{single,
<<"ls-"/utf8, (legos@internal@model:float_class(Offset))/binary>>,
<<"letter-spacing"/utf8>>,
<<(gleam_stdlib:float_to_string(Offset))/binary, "px"/utf8>>}}.
-file("src/legos/font.gleam", 119).
?DOC(" Set word spacing in pixels\n").
-spec word_spacing(float()) -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
word_spacing(Offset) ->
{style_class,
legos@internal@flag:word_spacing(),
{single,
<<"ws-"/utf8, (legos@internal@model:float_class(Offset))/binary>>,
<<"word-spacing"/utf8>>,
<<(gleam_stdlib:float_to_string(Offset))/binary, "px"/utf8>>}}.
-file("src/legos/font.gleam", 131).
?DOC(" Align text to the left\n").
-spec align_left() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
align_left() ->
{class, legos@internal@flag:font_alignment(), <<"tl"/utf8>>}.
-file("src/legos/font.gleam", 136).
?DOC(" Align text to the right\n").
-spec align_right() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
align_right() ->
{class, legos@internal@flag:font_alignment(), <<"tr"/utf8>>}.
-file("src/legos/font.gleam", 141).
?DOC(" Center align text\n").
-spec center() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
center() ->
{class, legos@internal@flag:font_alignment(), <<"tc"/utf8>>}.
-file("src/legos/font.gleam", 146).
?DOC(" Justify text alignment\n").
-spec justify() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
justify() ->
{class, legos@internal@flag:font_alignment(), <<"tj"/utf8>>}.
-file("src/legos/font.gleam", 151).
?DOC(" Underline text\n").
-spec underline() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
underline() ->
legos@internal@model:html_class(<<"u"/utf8>>).
-file("src/legos/font.gleam", 156).
?DOC(" Strike through text\n").
-spec strike() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
strike() ->
legos@internal@model:html_class(<<"sk"/utf8>>).
-file("src/legos/font.gleam", 161).
?DOC(" Italic text\n").
-spec italic() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
italic() ->
legos@internal@model:html_class(<<"i"/utf8>>).
-file("src/legos/font.gleam", 166).
?DOC(" Bold text\n").
-spec bold() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
bold() ->
{class, legos@internal@flag:font_weight(), <<"w7"/utf8>>}.
-file("src/legos/font.gleam", 171).
?DOC(" Light font weight\n").
-spec light() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
light() ->
{class, legos@internal@flag:font_weight(), <<"w3"/utf8>>}.
-file("src/legos/font.gleam", 176).
?DOC(" Hairline font weight\n").
-spec hairline() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
hairline() ->
{class, legos@internal@flag:font_weight(), <<"w1"/utf8>>}.
-file("src/legos/font.gleam", 181).
?DOC(" Extra light font weight\n").
-spec extra_light() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
extra_light() ->
{class, legos@internal@flag:font_weight(), <<"w2"/utf8>>}.
-file("src/legos/font.gleam", 186).
?DOC(" Regular font weight\n").
-spec regular() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
regular() ->
{class, legos@internal@flag:font_weight(), <<"w4"/utf8>>}.
-file("src/legos/font.gleam", 191).
?DOC(" Semi-bold font weight\n").
-spec semi_bold() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
semi_bold() ->
{class, legos@internal@flag:font_weight(), <<"w6"/utf8>>}.
-file("src/legos/font.gleam", 196).
?DOC(" Medium font weight\n").
-spec medium() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
medium() ->
{class, legos@internal@flag:font_weight(), <<"w5"/utf8>>}.
-file("src/legos/font.gleam", 201).
?DOC(" Extra bold font weight\n").
-spec extra_bold() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
extra_bold() ->
{class, legos@internal@flag:font_weight(), <<"w8"/utf8>>}.
-file("src/legos/font.gleam", 206).
?DOC(" Heavy font weight\n").
-spec heavy() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
heavy() ->
{class, legos@internal@flag:font_weight(), <<"w9"/utf8>>}.
-file("src/legos/font.gleam", 211).
?DOC(" Remove italic styling\n").
-spec unitalicized() -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
unitalicized() ->
legos@internal@model:html_class(<<"tun"/utf8>>).
-file("src/legos/font.gleam", 220).
-spec shadow(text_shadow_config()) -> legos@internal@model:attribute(any(), any()).
shadow(Config) ->
Config@1 = {shadow_float,
erlang:element(4, Config),
erlang:element(2, Config),
erlang:element(3, Config),
+0.0},
{style_class,
legos@internal@flag:txt_shadows(),
{single,
legos@internal@model:text_shadow_class(Config@1),
<<"text-shadow"/utf8>>,
legos@internal@model:format_text_shadow(Config@1)}}.
-file("src/legos/font.gleam", 239).
?DOC(" Add a glow effect (simplified shadow)\n").
-spec glow(legos@internal@model:color(), float()) -> legos@internal@model:attribute(any(), any()).
glow(Clr, Intensity) ->
Shade = {shadow_float, Clr, {+0.0, +0.0}, Intensity * 2.0, +0.0},
{style_class,
legos@internal@flag:txt_shadows(),
{single,
legos@internal@model:text_shadow_class(Shade),
<<"text-shadow"/utf8>>,
legos@internal@model:format_text_shadow(Shade)}}.
-file("src/legos/font.gleam", 259).
?DOC(" Set a single font variant\n").
-spec variant(legos@internal@model:variant()) -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
variant(Var) ->
case Var of
{variant_active, Name} ->
{class,
legos@internal@flag:font_variant(),
<<"v-"/utf8, Name/binary>>};
{variant_off, Name@1} ->
{class,
legos@internal@flag:font_variant(),
<<<<"v-"/utf8, Name@1/binary>>/binary, "-off"/utf8>>};
{variant_indexed, Name@2, Index} ->
{style_class,
legos@internal@flag:font_variant(),
{single,
<<<<<<"v-"/utf8, Name@2/binary>>/binary, "-"/utf8>>/binary,
(erlang:integer_to_binary(Index))/binary>>,
<<"font-feature-settings"/utf8>>,
<<<<<<"\""/utf8, Name@2/binary>>/binary, "\" "/utf8>>/binary,
(erlang:integer_to_binary(Index))/binary>>}}
end.
-file("src/legos/font.gleam", 277).
-spec is_small_caps(legos@internal@model:variant()) -> boolean().
is_small_caps(Variant) ->
case Variant of
{variant_active, Feat} ->
Feat =:= <<"smcp"/utf8>>;
_ ->
false
end.
-file("src/legos/font.gleam", 285).
?DOC(" Set multiple font variants\n").
-spec variant_list(list(legos@internal@model:variant())) -> legos@internal@model:attribute(legos@internal@model:aligned(), any()).
variant_list(Vars) ->
Features = gleam@list:map(Vars, fun legos@internal@model:render_variant/1),
Has_small_caps = gleam@list:any(Vars, fun is_small_caps/1),
Name = case Has_small_caps of
true ->
_pipe = Vars,
_pipe@1 = gleam@list:map(
_pipe,
fun legos@internal@model:variant_name/1
),
_pipe@2 = gleam@string:join(_pipe@1, <<"-"/utf8>>),
(fun(X) -> <<X/binary, "-sc"/utf8>> end)(_pipe@2);
false ->
_pipe@3 = Vars,
_pipe@4 = gleam@list:map(
_pipe@3,
fun legos@internal@model:variant_name/1
),
gleam@string:join(_pipe@4, <<"-"/utf8>>)
end,
Feature_string = gleam@string:join(Features, <<", "/utf8>>),
{style_class,
legos@internal@flag:font_variant(),
{style,
<<"v-"/utf8, Name/binary>>,
[{property, <<"font-feature-settings"/utf8>>, Feature_string},
{property, <<"font-variant"/utf8>>, case Has_small_caps of
true ->
<<"small-caps"/utf8>>;
false ->
<<"normal"/utf8>>
end}]}}.
-file("src/legos/font.gleam", 316).
?DOC(" Small caps variant\n").
-spec small_caps() -> legos@internal@model:variant().
small_caps() ->
{variant_active, <<"smcp"/utf8>>}.
-file("src/legos/font.gleam", 321).
?DOC(" Slashed zero variant\n").
-spec slashed_zero() -> legos@internal@model:variant().
slashed_zero() ->
{variant_active, <<"zero"/utf8>>}.
-file("src/legos/font.gleam", 326).
?DOC(" Ligatures variant\n").
-spec ligatures() -> legos@internal@model:variant().
ligatures() ->
{variant_active, <<"liga"/utf8>>}.
-file("src/legos/font.gleam", 331).
?DOC(" Ordinal markers variant\n").
-spec ordinal() -> legos@internal@model:variant().
ordinal() ->
{variant_active, <<"ordn"/utf8>>}.
-file("src/legos/font.gleam", 336).
?DOC(" Tabular numbers variant\n").
-spec tabular_numbers() -> legos@internal@model:variant().
tabular_numbers() ->
{variant_active, <<"tnum"/utf8>>}.
-file("src/legos/font.gleam", 341).
?DOC(" Stacked fractions variant\n").
-spec stacked_fractions() -> legos@internal@model:variant().
stacked_fractions() ->
{variant_active, <<"afrc"/utf8>>}.
-file("src/legos/font.gleam", 346).
?DOC(" Diagonal fractions variant\n").
-spec diagonal_fractions() -> legos@internal@model:variant().
diagonal_fractions() ->
{variant_active, <<"frac"/utf8>>}.
-file("src/legos/font.gleam", 351).
?DOC(" Swash variant with index\n").
-spec swash(integer()) -> legos@internal@model:variant().
swash(Index) ->
{variant_indexed, <<"swsh"/utf8>>, Index}.
-file("src/legos/font.gleam", 356).
?DOC(" Set a feature by name and enabled state\n").
-spec feature(binary(), boolean()) -> legos@internal@model:variant().
feature(Name, On) ->
case On of
true ->
{variant_indexed, Name, 1};
false ->
{variant_indexed, Name, 0}
end.
-file("src/legos/font.gleam", 364).
?DOC(" Set an indexed font variant\n").
-spec indexed(binary(), integer()) -> legos@internal@model:variant().
indexed(Name, Index) ->
{variant_indexed, Name, Index}.