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