Packages
moon
2.78.2
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
lib/moon/helpers/merge_class.ex
defmodule Moon.Helpers.MergeClass do
@moduledoc """
Helper function for merging tailwind classes, can operate with Surface css_class datatype
"""
def merge(classes) do
classes
|> Tails.classes()
|> String.split(" ")
|> Enum.map_join(" ", &rename_class/1)
end
# tails crutches
defp rename_class(class = "after:moon-" <> _), do: replace_class_parts(class)
defp rename_class(class = "ltr:not-last" <> _), do: replace_class_parts(class)
defp rename_class(class = "ltr:not-first" <> _), do: replace_class_parts(class)
defp rename_class(class), do: class
defp replace_class_parts(class) do
[p1 | [p2 | other]] = String.split(class, ":")
Enum.join([p2 | [p1 | other]], ":")
end
# original functions
def merge_original(classes) do
flatten(classes)
|> Enum.reduce(%{}, fn class, groups ->
Map.put(groups, group_name(class), class)
end)
|> Map.values()
end
defp flatten(classes) when is_list(classes) do
classes
|> Enum.flat_map(fn
# :css_class datatype in Surface
{k, v} -> (!!v && flatten("#{k}")) || []
x -> flatten(x)
end)
end
defp flatten(classes) when is_binary(classes), do: classes |> String.split(" ")
defp flatten(nil), do: []
defp flatten(false), do: []
defp group_name(class) when class in ~w(absolute relative fixed static sticky),
do: "prop_position"
defp group_name(class) when class in ~w(block inline hidden flex grid),
do: "prop_display"
defp group_name("font-" <> family) when family in ~w(averta dm-sans grotesk),
do: "prop_font_family"
defp group_name("border-" <> loc) when loc in ~w(t b l r x y s e),
do: "prop_border_width"
# defp group_name("border-" <> loc <> "-" <> _) when loc in ~c(t b l r x y s e),
# do: "prop_border_width"
defp group_name("bg-" <> _rest), do: "prop_background"
defp group_name(class) do
class
# removing square brackets bc of "top-[-7px]"
|> String.replace(~r/\[.*\]$/, "")
# removing last value, e.g. "postion-top-1" => "position-top-"
|> String.replace(~r/-[^-]*$/, "-")
end
end