lib/tailwind_merge/config.rb



# frozen_string_literal: true

module TailwindMerge
  module Config
    include Validators

    FROM_THEME = ->(config, theme) {
      config.fetch(:theme, {}).fetch(theme, nil)
    }

    COLORS = ->(config) { FROM_THEME.call(config, "colors") }
    SPACING = ->(config) { FROM_THEME.call(config, "spacing") }
    BLUR = ->(config) { FROM_THEME.call(config, "blur") }
    BRIGHTNESS = ->(config) { FROM_THEME.call(config, "brightness") }
    BORDER_COLOR = ->(config) { FROM_THEME.call(config, "border-color") }
    BORDER_RADIUS = ->(config) { FROM_THEME.call(config, "border-radius") }
    BORDER_SPACING = ->(config) { FROM_THEME.call(config, "border-spacing") }
    BORDER_WIDTH = ->(config) { FROM_THEME.call(config, "border-width") }
    CONTRAST = ->(config) { FROM_THEME.call(config, "contrast") }
    GRAYSCALE = ->(config) { FROM_THEME.call(config, "grayscale") }
    HUE_ROTATE = ->(config) { FROM_THEME.call(config, "hue-rotate") }
    INVERT = ->(config) { FROM_THEME.call(config, "invert") }
    GAP = ->(config) { FROM_THEME.call(config, "gap") }
    GRADIENT_COLOR_STOPS = ->(config) { FROM_THEME.call(config, "gradient-color-stops") }
    INSET = ->(config) { FROM_THEME.call(config, "inset") }
    MARGIN = ->(config) { FROM_THEME.call(config, "margin") }
    OPACITY = ->(config) { FROM_THEME.call(config, "opacity") }
    PADDING = ->(config) { FROM_THEME.call(config, "padding") }
    SATURATE = ->(config) { FROM_THEME.call(config, "saturate") }
    SCALE = ->(config) { FROM_THEME.call(config, "scale") }
    SEPIA = ->(config) { FROM_THEME.call(config, "sepia") }
    SKEW = ->(config) { FROM_THEME.call(config, "skew") }
    SPACE = ->(config) { FROM_THEME.call(config, "space") }
    TRANSLATE = ->(config) { FROM_THEME.call(config, "translate") }

    VALID_THEME_IDS = Set.new([
      COLORS.object_id,
      SPACING.object_id,
      BLUR.object_id,
      BRIGHTNESS.object_id,
      BORDER_COLOR.object_id,
      BORDER_RADIUS.object_id,
      BORDER_SPACING.object_id,
      BORDER_WIDTH.object_id,
      CONTRAST.object_id,
      GRAYSCALE.object_id,
      HUE_ROTATE.object_id,
      INVERT.object_id,
      GAP.object_id,
      GRADIENT_COLOR_STOPS.object_id,
      INSET.object_id,
      MARGIN.object_id,
      OPACITY.object_id,
      PADDING.object_id,
      SATURATE.object_id,
      SCALE.object_id,
      SEPIA.object_id,
      SKEW.object_id,
      SPACE.object_id,
      TRANSLATE.object_id,
    ]).freeze

    OVERSCROLL = -> { ["auto", "contain", "none"] }
    OVERFLOW = -> { ["auto", "hidden", "clip", "visible", "scroll"] }
    SPACING_WITH_AUTO = -> { ["auto", SPACING] }
    LENGTH_WITH_EMPTY = -> { ["", IS_LENGTH] }
    INTEGER_WITH_AUTO = -> { ["auto", IS_INTEGER] }
    POSITIONS = -> {
      [
        "bottom",
        "center",
        "left",
        "left-bottom",
        "left-top",
        "right",
        "right-bottom",
        "right-top",
        "top",
      ]
    }
    LINE_STYLES = -> { ["solid", "dashed", "dotted", "double", "none"] }
    BLEND_MODES = -> {
      [
        "normal",
        "multiply",
        "screen",
        "overlay",
        "darken",
        "lighten",
        "color-dodge",
        "color-burn",
        "hard-light",
        "soft-light",
        "difference",
        "exclusion",
        "hue",
        "saturation",
        "color",
        "luminosity",
        "plus-lighter",
      ]
    }
    ALIGN = -> { ["start", "end", "center", "between", "around", "evenly"] }
    ZERO_AND_EMPTY = -> { ["", "0", IS_ARBITRARY_VALUE] }
    BREAKS = -> { ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"] }

    DEFAULTS = {
      cache_size: 500,
      theme: {
        "colors" => [IS_ANY],
        "spacing" => [IS_LENGTH],
        "blur" => ["none", "", IS_TSHIRT_SIZE, IS_ARBITRARY_LENGTH],
        "brightness" => [IS_INTEGER],
        "border-color" => [COLORS],
        "border-radius" => ["none", "", "full", IS_TSHIRT_SIZE, IS_ARBITRARY_LENGTH],
        "border-spacing" => [SPACING],
        "border-width" => LENGTH_WITH_EMPTY.call,
        "contrast" => [IS_INTEGER],
        "grayscale" => ZERO_AND_EMPTY.call,
        "hue-rotate" => [IS_INTEGER],
        "invert" => ZERO_AND_EMPTY.call,
        "gap" => [SPACING],
        "gradient-color-stops" => [COLORS],
        "inset" => SPACING_WITH_AUTO.call,
        "margin" => SPACING_WITH_AUTO.call,
        "opacity" => [IS_INTEGER],
        "padding" => [SPACING],
        "saturate" => [IS_INTEGER],
        "scale" => [IS_INTEGER],
        "sepia" => ZERO_AND_EMPTY.call,
        "skew" => [IS_INTEGER, IS_ARBITRARY_VALUE],
        "space" => [SPACING],
        "translate" => [SPACING],
      },
      class_groups: {
        # Layout
        ##
        # Aspect Ratio
        # @see https://tailwindcss.com/docs/aspect-ratio
        ##
        "aspect" => [{ "aspect" => ["auto", "square", "video", IS_ARBITRARY_VALUE] }],
        ##
        # Container
        # @see https://tailwindcss.com/docs/container
        ##
        "container" => ["container"],
        ##
        # Columns
        # @see https://tailwindcss.com/docs/columns
        ##
        "columns" => [{ "columns" => [IS_TSHIRT_SIZE] }],
        ##
        # Break After
        # @see https://tailwindcss.com/docs/break-after
        ##
        "break-after" => [{ "break-after" => BREAKS.call }],
        ##
        # Break Before
        # @see https://tailwindcss.com/docs/break-before
        ##
        "break-before" => [{ "break-before" => BREAKS.call }],
        ##
        # Break Inside
        # @see https://tailwindcss.com/docs/break-inside
        ##
        "break-inside" => [{ "break-inside" => ["auto", "avoid", "avoid-page", "avoid-column"] }],
        ##
        # Box Decoration Break
        # @see https://tailwindcss.com/docs/box-decoration-break
        ##
        "box-decoration" => [{ "box-decoration" => ["slice", "clone"] }],
        ##
        # Box Sizing
        # @see https://tailwindcss.com/docs/box-sizing
        ##
        "box" => [{ "box" => ["border", "content"] }],
        ##
        # Display
        # @see https://tailwindcss.com/docs/display
        ##
        "display" => [
          "block",
          "inline-block",
          "inline",
          "flex",
          "inline-flex",
          "table",
          "inline-table",
          "table-caption",
          "table-cell",
          "table-column",
          "table-column-group",
          "table-footer-group",
          "table-header-group",
          "table-row-group",
          "table-row",
          "flow-root",
          "grid",
          "inline-grid",
          "contents",
          "list-item",
          "hidden",
        ],
        ##
        # Floats
        # @see https://tailwindcss.com/docs/float
        ##
        "float" => [{ "float" => ["right", "left", "none"] }],
        ##
        # Clear
        # @see https://tailwindcss.com/docs/clear
        ##
        "clear" => [{ "clear" => ["left", "right", "both", "none"] }],
        ##
        # Isolation
        # @see https://tailwindcss.com/docs/isolation
        ##
        "isolation" => ["isolate", "isolation-auto"],
        ##
        # Object Fit
        # @see https://tailwindcss.com/docs/object-fit
        ##
        "object-fit" => [{ "object" => ["contain", "cover", "fill", "none", "scale-down"] }],
        ##
        # Object Position
        # @see https://tailwindcss.com/docs/object-position
        ##
        "object-position" => [{ "object" => [*POSITIONS.call, IS_ARBITRARY_VALUE] }],
        ##
        # Overflow
        # @see https://tailwindcss.com/docs/overflow
        ##
        "overflow" => [{ "overflow" => OVERFLOW.call }],
        ##
        # Overflow X
        # @see https://tailwindcss.com/docs/overflow
        ##
        "overflow-x" => [{ "overflow-x" => OVERFLOW.call }],
        ##
        # Overflow Y
        # @see https://tailwindcss.com/docs/overflow
        ##
        "overflow-y" => [{ "overflow-y" => OVERFLOW.call }],
        ##
        # Overscroll Behavior
        # @see https://tailwindcss.com/docs/overscroll-behavior
        ##
        "overscroll" => [{ "overscroll" => OVERSCROLL.call }],
        ##
        # Overscroll Behavior X
        # @see https://tailwindcss.com/docs/overscroll-behavior
        ##
        "overscroll-x" => [{ "overscroll-x" => OVERSCROLL.call }],
        ##
        # Overscroll Behavior Y
        # @see https://tailwindcss.com/docs/overscroll-behavior
        ##
        "overscroll-y" => [{ "overscroll-y" => OVERSCROLL.call }],
        ##
        # Position
        # @see https://tailwindcss.com/docs/position
        ##
        "position" => ["static", "fixed", "absolute", "relative", "sticky"],
        ##
        # Top / Right / Bottom / Left
        # @see https://tailwindcss.com/docs/top-right-bottom-left
        ##
        "inset" => [{ "inset" => [INSET] }],
        ##
        # Right / Left
        # @see https://tailwindcss.com/docs/top-right-bottom-left
        ##
        "inset-x" => [{ "inset-x" => [INSET] }],
        ##
        # Top / Bottom
        # @see https://tailwindcss.com/docs/top-right-bottom-left
        ##
        "inset-y" => [{ "inset-y" => [INSET] }],
        ##
        # Top
        # @see https://tailwindcss.com/docs/top-right-bottom-left
        ##
        "top" => [{ "top" => [INSET] }],
        ##
        # Right
        # @see https://tailwindcss.com/docs/top-right-bottom-left
        ##
        "right" => [{ "right" => [INSET] }],
        ##
        # Bottom
        # @see https://tailwindcss.com/docs/top-right-bottom-left
        ##
        "bottom" => [{ "bottom" => [INSET] }],
        ##
        # Left
        # @see https://tailwindcss.com/docs/top-right-bottom-left
        ##
        "left" => [{ "left" => [INSET] }],
        ##
        # Visibility
        # @see https://tailwindcss.com/docs/visibility
        ##
        "visibility" => ["visible", "invisible"],
        ##
        # Z-Index
        # @see https://tailwindcss.com/docs/z-index
        ##
        "z" => [{ "z" => [IS_INTEGER] }],
        # Flexbox and Grid
        ##
        # Flex Basis
        # @see https://tailwindcss.com/docs/flex-basis
        ##
        "basis" => [{ "basis" => [SPACING] }],
        ##
        # Flex Direction
        # @see https://tailwindcss.com/docs/flex-direction
        ##
        "flex-direction" => [{ "flex" => ["row", "row-reverse", "col", "col-reverse"] }],
        ##
        # Flex Wrap
        # @see https://tailwindcss.com/docs/flex-wrap
        ##
        "flex-wrap" => [{ "flex" => ["wrap", "wrap-reverse", "nowrap"] }],
        ##
        # Flex
        # @see https://tailwindcss.com/docs/flex
        ##
        "flex" => [{ "flex" => ["1", "auto", "initial", "none", IS_ARBITRARY_VALUE] }],
        ##
        # Flex Grow
        # @see https://tailwindcss.com/docs/flex-grow
        ##
        "grow" => [{ "grow" => ZERO_AND_EMPTY.call }],
        ##
        # Flex Shrink
        # @see https://tailwindcss.com/docs/flex-shrink
        ##
        "shrink" => [{ "shrink" => ZERO_AND_EMPTY.call }],
        ##
        # Order
        # @see https://tailwindcss.com/docs/order
        ##
        "order" => [{ "order" => ["first", "last", "none", IS_INTEGER] }],
        ##
        # Grid Template Columns
        # @see https://tailwindcss.com/docs/grid-template-columns
        ##
        "grid-cols" => [{ "grid-cols" => [IS_ANY] }],
        ##
        # Grid Column Start / End
        # @see https://tailwindcss.com/docs/grid-column
        ##
        "col-start-end" => [{ "col" => ["auto", { "span" => [IS_INTEGER] }] }],
        ##
        # Grid Column Start
        # @see https://tailwindcss.com/docs/grid-column
        ##
        "col-start" => [{ "col-start" => INTEGER_WITH_AUTO.call }],
        ##
        # Grid Column End
        # @see https://tailwindcss.com/docs/grid-column
        ##
        "col-end" => [{ "col-end" => INTEGER_WITH_AUTO.call }],
        ##
        # Grid Template Rows
        # @see https://tailwindcss.com/docs/grid-template-rows
        ##
        "grid-rows" => [{ "grid-rows" => [IS_ANY] }],
        ##
        # Grid Row Start / End
        # @see https://tailwindcss.com/docs/grid-row
        ##
        "row-start-end" => [{ "row" => ["auto", { "span" => [IS_INTEGER] }] }],
        ##
        # Grid Row Start
        # @see https://tailwindcss.com/docs/grid-row
        ##
        "row-start" => [{ "row-start" => INTEGER_WITH_AUTO.call }],
        ##
        # Grid Row End
        # @see https://tailwindcss.com/docs/grid-row
        ##
        "row-end" => [{ "row-end" => INTEGER_WITH_AUTO.call }],
        ##
        # Grid Auto Flow
        # @see https://tailwindcss.com/docs/grid-auto-flow
        ##
        "grid-flow" => [{ "grid-flow" => ["row", "col", "dense", "row-dense", "col-dense"] }],
        ##
        # Grid Auto Columns
        # @see https://tailwindcss.com/docs/grid-auto-columns
        ##
        "auto-cols" => [{ "auto-cols" => ["auto", "min", "max", "fr", IS_ARBITRARY_VALUE] }],
        ##
        # Grid Auto Rows
        # @see https://tailwindcss.com/docs/grid-auto-rows
        ##
        "auto-rows" => [{ "auto-rows" => ["auto", "min", "max", "fr", IS_ARBITRARY_VALUE] }],
        ##
        # Gap
        # @see https://tailwindcss.com/docs/gap
        ##
        "gap" => [{ "gap" => [GAP] }],
        ##
        # Gap X
        # @see https://tailwindcss.com/docs/gap
        ##
        "gap-x" => [{ "gap-x" => [GAP] }],
        ##
        # Gap Y
        # @see https://tailwindcss.com/docs/gap
        ##
        "gap-y" => [{ "gap-y" => [GAP] }],
        ##
        # Justify Content
        # @see https://tailwindcss.com/docs/justify-content
        ##
        "justify-content" => [{ "justify" => ALIGN.call }],
        ##
        # Justify Items
        # @see https://tailwindcss.com/docs/justify-items
        ##
        "justify-items" => [{ "justify-items" => ["start", "end", "center", "stretch"] }],
        ##
        # Justify Self
        # @see https://tailwindcss.com/docs/justify-self
        ##
        "justify-self" => [{ "justify-self" => ["auto", "start", "end", "center", "stretch"] }],
        ##
        # Align Content
        # @see https://tailwindcss.com/docs/align-content
        ##
        "align-content" => [{ "content" => ALIGN.call }],
        ##
        # Align Items
        # @see https://tailwindcss.com/docs/align-items
        ##
        "align-items" => [{ "items" => ["start", "end", "center", "baseline", "stretch"] }],
        ##
        # Align Self
        # @see https://tailwindcss.com/docs/align-self
        ##
        "align-self" => [{ "self" => ["auto", "start", "end", "center", "stretch", "baseline"] }],
        ##
        # Place Content
        # @see https://tailwindcss.com/docs/place-content
        ##
        "place-content" => [{ "place-content" => [*ALIGN.call, "stretch"] }],
        ##
        # Place Items
        # @see https://tailwindcss.com/docs/place-items
        ##
        "place-items" => [{ "place-items" => ["start", "end", "center", "stretch"] }],
        ##
        # Place Self
        # @see https://tailwindcss.com/docs/place-self
        ##
        "place-self" => [{ "place-self" => ["auto", "start", "end", "center", "stretch"] }],
        # Spacing
        ##
        # Padding
        # @see https://tailwindcss.com/docs/padding
        ##
        "p" => [{ "p" => [PADDING] }],
        ##
        # Padding X
        # @see https://tailwindcss.com/docs/padding
        ##
        "px" => [{ "px" => [PADDING] }],
        ##
        # Padding Y
        # @see https://tailwindcss.com/docs/padding
        ##
        "py" => [{ "py" => [PADDING] }],
        ##
        # Padding Top
        # @see https://tailwindcss.com/docs/padding
        ##
        "pt" => [{ "pt" => [PADDING] }],
        ##
        # Padding Right
        # @see https://tailwindcss.com/docs/padding
        ##
        "pr" => [{ "pr" => [PADDING] }],
        ##
        # Padding Bottom
        # @see https://tailwindcss.com/docs/padding
        ##
        "pb" => [{ "pb" => [PADDING] }],
        ##
        # Padding Left
        # @see https://tailwindcss.com/docs/padding
        ##
        "pl" => [{ "pl" => [PADDING] }],
        ##
        # Margin
        # @see https://tailwindcss.com/docs/margin
        ##
        "m" => [{ "m" => [MARGIN] }],
        ##
        # Margin X
        # @see https://tailwindcss.com/docs/margin
        ##
        "mx" => [{ "mx" => [MARGIN] }],
        ##
        # Margin Y
        # @see https://tailwindcss.com/docs/margin
        ##
        "my" => [{ "my" => [MARGIN] }],
        ##
        # Margin Top
        # @see https://tailwindcss.com/docs/margin
        ##
        "mt" => [{ "mt" => [MARGIN] }],
        ##
        # Margin Right
        # @see https://tailwindcss.com/docs/margin
        ##
        "mr" => [{ "mr" => [MARGIN] }],
        ##
        # Margin Bottom
        # @see https://tailwindcss.com/docs/margin
        ##
        "mb" => [{ "mb" => [MARGIN] }],
        ##
        # Margin Left
        # @see https://tailwindcss.com/docs/margin
        ##
        "ml" => [{ "ml" => [MARGIN] }],
        ##
        # Space Between X
        # @see https://tailwindcss.com/docs/space
        ##
        "space-x" => [{ "space-x" => [SPACE] }],
        ##
        # Space Between X Reverse
        # @see https://tailwindcss.com/docs/space
        ##
        "space-x-reverse" => ["space-x-reverse"],
        ##
        # Space Between Y
        # @see https://tailwindcss.com/docs/space
        ##
        "space-y" => [{ "space-y" => [SPACE] }],
        ##
        # Space Between Y Reverse
        # @see https://tailwindcss.com/docs/space
        ##
        "space-y-reverse" => ["space-y-reverse"],
        # Sizing
        ##
        # Width
        # @see https://tailwindcss.com/docs/width
        ##
        "w" => [{ "w" => ["auto", "min", "max", "fit", SPACING] }],
        ##
        # Min-Width
        # @see https://tailwindcss.com/docs/min-width
        ##
        "min-w" => [{ "min-w" => ["min", "max", "fit", IS_LENGTH] }],
        ##
        # Max-Width
        # @see https://tailwindcss.com/docs/max-width
        ##
        "max-w" => [
          {
            "max-w" => [
              "0",
              "none",
              "full",
              "min",
              "max",
              "fit",
              "prose",
              { "screen" => [IS_TSHIRT_SIZE] },
              IS_TSHIRT_SIZE,
              IS_ARBITRARY_LENGTH,
            ],
          },
        ],
        ##
        # Height
        # @see https://tailwindcss.com/docs/height
        ##
        "h" => [{ "h" => ["auto", "min", "max", "fit", SPACING] }],
        ##
        # Min-Height
        # @see https://tailwindcss.com/docs/min-height
        ##
        "min-h" => [{ "min-h" => ["min", "max", "fit", IS_LENGTH] }],
        ##
        # Max-Height
        # @see https://tailwindcss.com/docs/max-height
        ##
        "max-h" => [{ "max-h" => [SPACING, "min", "max", "fit"] }],
        # Typography
        ##
        # Font Size
        # @see https://tailwindcss.com/docs/font-size
        ##
        "font-size" => [{ "text" => ["base", IS_TSHIRT_SIZE, IS_ARBITRARY_LENGTH] }],
        ##
        # Font Smoothing
        # @see https://tailwindcss.com/docs/font-smoothing
        ##
        "font-smoothing" => ["antialiased", "subpixel-antialiased"],
        ##
        # Font Style
        # @see https://tailwindcss.com/docs/font-style
        ##
        "font-style" => ["italic", "not-italic"],
        ##
        # Font Weight
        # @see https://tailwindcss.com/docs/font-weight
        ##
        "font-weight" => [
          {
            "font" => [
              "thin",
              "extralight",
              "light",
              "normal",
              "medium",
              "semibold",
              "bold",
              "extrabold",
              "black",
              IS_ARBITRARY_NUMBER,
            ],
          },
        ],
        ##
        # Font Family
        # @see https://tailwindcss.com/docs/font-family
        ##
        "font-family" => [{ "font" => [IS_ANY] }],
        ##
        # Font Variant Numeric
        # @see https://tailwindcss.com/docs/font-variant-numeric
        ##
        "fvn-normal" => ["normal-nums"],
        ##
        # Font Variant Numeric
        # @see https://tailwindcss.com/docs/font-variant-numeric
        ##
        "fvn-ordinal" => ["ordinal"],
        ##
        # Font Variant Numeric
        # @see https://tailwindcss.com/docs/font-variant-numeric
        ##
        "fvn-slashed-zero" => ["slashed-zero"],
        ##
        # Font Variant Numeric
        # @see https://tailwindcss.com/docs/font-variant-numeric
        ##
        "fvn-figure" => ["lining-nums", "oldstyle-nums"],
        ##
        # Font Variant Numeric
        # @see https://tailwindcss.com/docs/font-variant-numeric
        ##
        "fvn-spacing" => ["proportional-nums", "tabular-nums"],
        ##
        # Font Variant Numeric
        # @see https://tailwindcss.com/docs/font-variant-numeric
        ##
        "fvn-fraction" => ["diagonal-fractions", "stacked-fractons"],
        ##
        # Letter Spacing
        # @see https://tailwindcss.com/docs/letter-spacing
        ##
        "tracking" => [
          {
            "tracking" => [
              "tighter",
              "tight",
              "normal",
              "wide",
              "wider",
              "widest",
              IS_ARBITRARY_LENGTH,
            ],
          },
        ],
        ##
        # Line Height
        # @see https://tailwindcss.com/docs/line-height
        ##
        "leading" => [
          { "leading" => ["none", "tight", "snug", "normal", "relaxed", "loose", IS_LENGTH] },
        ],
        ##
        # List Style Type
        # @see https://tailwindcss.com/docs/list-style-type
        ##
        "list-style-type" => [{ "list" => ["none", "disc", "decimal", IS_ARBITRARY_VALUE] }],
        ##
        # List Style Position
        # @see https://tailwindcss.com/docs/list-style-position
        ##
        "list-style-position" => [{ "list" => ["inside", "outside"] }],
        ##
        # Placeholder Color
        # @deprecated since Tailwind CSS v3.0.0
        # @see https://tailwindcss.com/docs/placeholder-color
        ##
        "placeholder-color" => [{ "placeholder" => [COLORS] }],
        ##
        # Placeholder Opacity
        # @see https://tailwindcss.com/docs/placeholder-opacity
        ##
        "placeholder-opacity" => [{ "placeholder-opacity" => [OPACITY] }],
        ##
        # Text Alignment
        # @see https://tailwindcss.com/docs/text-align
        ##
        "text-alignment" => [{ "text" => ["left", "center", "right", "justify", "start", "end"] }],
        ##
        # Text Color
        # @see https://tailwindcss.com/docs/text-color
        ##
        "text-color" => [{ "text" => [COLORS] }],
        ##
        # Text Opacity
        # @see https://tailwindcss.com/docs/text-opacity
        ##
        "text-opacity" => [{ "text-opacity" => [OPACITY] }],
        ##
        # Text Decoration
        # @see https://tailwindcss.com/docs/text-decoration
        ##
        "text-decoration" => ["underline", "overline", "line-through", "no-underline"],
        ##
        # Text Decoration Style
        # @see https://tailwindcss.com/docs/text-decoration-style
        ##
        "text-decoration-style" => [{ "decoration" => [*LINE_STYLES.call, "wavy"] }],
        ##
        # Text Decoration Thickness
        # @see https://tailwindcss.com/docs/text-decoration-thickness
        ##
        "text-decoration-thickness" => [{ "decoration" => ["auto", "from-font", IS_LENGTH] }],
        ##
        # Text Underline Offset
        # @see https://tailwindcss.com/docs/text-underline-offset
        ##
        "underline-offset" => [{ "underline-offset" => ["auto", IS_LENGTH] }],
        ##
        # Text Decoration Color
        # @see https://tailwindcss.com/docs/text-decoration-color
        ##
        "text-decoration-color" => [{ "decoration" => [COLORS] }],
        ##
        # Text Transform
        # @see https://tailwindcss.com/docs/text-transform
        ##
        "text-transform" => ["uppercase", "lowercase", "capitalize", "normal-case"],
        ##
        # Text Overflow
        # @see https://tailwindcss.com/docs/text-overflow
        ##
        "text-overflow" => ["truncate", "text-ellipsis", "text-clip"],
        ##
        # Text Indent
        # @see https://tailwindcss.com/docs/text-indent
        ##
        "indent" => [{ "indent" => [SPACING] }],
        ##
        # Vertical Alignment
        # @see https://tailwindcss.com/docs/vertical-align
        ##
        "vertical-align" => [
          {
            "align" => [
              "baseline",
              "top",
              "middle",
              "bottom",
              "text-top",
              "text-bottom",
              "sub",
              "super",
              IS_ARBITRARY_LENGTH,
            ],
          },
        ],
        ##
        # Whitespace
        # @see https://tailwindcss.com/docs/whitespace
        ##
        "whitespace" => [{ "whitespace" => ["normal", "nowrap", "pre", "pre-line", "pre-wrap"] }],
        ##
        # Word Break
        # @see https://tailwindcss.com/docs/word-break
        ##
        "break" => [{ "break" => ["normal", "words", "all"] }],
        ##
        # Content
        # @see https://tailwindcss.com/docs/content
        ##
        "content" => [{ "content" => ["none", IS_ARBITRARY_VALUE] }],
        # Backgrounds
        ##
        # Background Attachment
        # @see https://tailwindcss.com/docs/background-attachment
        ##
        "bg-attachment" => [{ "bg" => ["fixed", "local", "scroll"] }],
        ##
        # Background Clip
        # @see https://tailwindcss.com/docs/background-clip
        ##
        "bg-clip" => [{ "bg-clip" => ["border", "padding", "content", "text"] }],
        ##
        # Background Opacity
        # @deprecated since Tailwind CSS v3.0.0
        # @see https://tailwindcss.com/docs/background-opacity
        ##
        "bg-opacity" => [{ "bg-opacity" => [OPACITY] }],
        ##
        # Background Origin
        # @see https://tailwindcss.com/docs/background-origin
        ##
        "bg-origin" => [{ "bg-origin" => ["border", "padding", "content"] }],
        ##
        # Background Position
        # @see https://tailwindcss.com/docs/background-position
        ##
        "bg-position" => [{ "bg" => [*POSITIONS.call, IS_ARBITRARY_POSITION] }],
        ##
        # Background Repeat
        # @see https://tailwindcss.com/docs/background-repeat
        ##
        "bg-repeat" => [{ "bg" => ["no-repeat", { "repeat" => ["", "x", "y", "round", "space"] }] }],
        ##
        # Background Size
        # @see https://tailwindcss.com/docs/background-size
        ##
        "bg-size" => [{ "bg" => ["auto", "cover", "contain", IS_ARBITRARY_SIZE] }],
        ##
        # Background Image
        # @see https://tailwindcss.com/docs/background-image
        ##
        "bg-image" => [
          {
            "bg" => [
              "none",
              { "gradient-to" => ["t", "tr", "r", "br", "b", "bl", "l", "tl"] },
              IS_ARBITRARY_URL,
            ],
          },
        ],
        ##
        # Background Color
        # @see https://tailwindcss.com/docs/background-color
        ##
        "bg-color" => [{ "bg" => [COLORS] }],
        ##
        # Gradient Color Stops From
        # @see https://tailwindcss.com/docs/gradient-color-stops
        ##
        "gradient-from" => [{ "from" => [GRADIENT_COLOR_STOPS] }],
        ##
        # Gradient Color Stops Via
        # @see https://tailwindcss.com/docs/gradient-color-stops
        ##
        "gradient-via" => [{ "via" => [GRADIENT_COLOR_STOPS] }],
        ##
        # Gradient Color Stops To
        # @see https://tailwindcss.com/docs/gradient-color-stops
        ##
        "gradient-to" => [{ "to" => [GRADIENT_COLOR_STOPS] }],
        # Borders
        ##
        # Border Radius
        # @see https://tailwindcss.com/docs/border-radius
        ##
        "rounded" => [{ "rounded" => [BORDER_RADIUS] }],
        ##
        # Border Radius Top
        # @see https://tailwindcss.com/docs/border-radius
        ##
        "rounded-t" => [{ "rounded-t" => [BORDER_RADIUS] }],
        ##
        # Border Radius Right
        # @see https://tailwindcss.com/docs/border-radius
        ##
        "rounded-r" => [{ "rounded-r" => [BORDER_RADIUS] }],
        ##
        # Border Radius Bottom
        # @see https://tailwindcss.com/docs/border-radius
        ##
        "rounded-b" => [{ "rounded-b" => [BORDER_RADIUS] }],
        ##
        # Border Radius Left
        # @see https://tailwindcss.com/docs/border-radius
        ##
        "rounded-l" => [{ "rounded-l" => [BORDER_RADIUS] }],
        ##
        # Border Radius Top Left
        # @see https://tailwindcss.com/docs/border-radius
        ##
        "rounded-tl" => [{ "rounded-tl" => [BORDER_RADIUS] }],
        ##
        # Border Radius Top Right
        # @see https://tailwindcss.com/docs/border-radius
        ##
        "rounded-tr" => [{ "rounded-tr" => [BORDER_RADIUS] }],
        ##
        # Border Radius Bottom Right
        # @see https://tailwindcss.com/docs/border-radius
        ##
        "rounded-br" => [{ "rounded-br" => [BORDER_RADIUS] }],
        ##
        # Border Radius Bottom Left
        # @see https://tailwindcss.com/docs/border-radius
        ##
        "rounded-bl" => [{ "rounded-bl" => [BORDER_RADIUS] }],
        ##
        # Border Width
        # @see https://tailwindcss.com/docs/border-width
        ##
        "border-w" => [{ "border" => [BORDER_WIDTH] }],
        ##
        # Border Width X
        # @see https://tailwindcss.com/docs/border-width
        ##
        "border-w-x" => [{ "border-x" => [BORDER_WIDTH] }],
        ##
        # Border Width Y
        # @see https://tailwindcss.com/docs/border-width
        ##
        "border-w-y" => [{ "border-y" => [BORDER_WIDTH] }],
        ##
        # Border Width Top
        # @see https://tailwindcss.com/docs/border-width
        ##
        "border-w-t" => [{ "border-t" => [BORDER_WIDTH] }],
        ##
        # Border Width Right
        # @see https://tailwindcss.com/docs/border-width
        ##
        "border-w-r" => [{ "border-r" => [BORDER_WIDTH] }],
        ##
        # Border Width Bottom
        # @see https://tailwindcss.com/docs/border-width
        ##
        "border-w-b" => [{ "border-b" => [BORDER_WIDTH] }],
        ##
        # Border Width Left
        # @see https://tailwindcss.com/docs/border-width
        ##
        "border-w-l" => [{ "border-l" => [BORDER_WIDTH] }],
        ##
        # Border Opacity
        # @see https://tailwindcss.com/docs/border-opacity
        ##
        "border-opacity" => [{ "border-opacity" => [OPACITY] }],
        ##
        # Border Style
        # @see https://tailwindcss.com/docs/border-style
        ##
        "border-style" => [{ "border" => [*LINE_STYLES.call, "hidden"] }],
        ##
        # Divide Width X
        # @see https://tailwindcss.com/docs/divide-width
        ##
        "divide-x" => [{ "divide-x" => [BORDER_WIDTH] }],
        ##
        # Divide Width X Reverse
        # @see https://tailwindcss.com/docs/divide-width
        ##
        "divide-x-reverse" => ["divide-x-reverse"],
        ##
        # Divide Width Y
        # @see https://tailwindcss.com/docs/divide-width
        ##
        "divide-y" => [{ "divide-y" => [BORDER_WIDTH] }],
        ##
        # Divide Width Y Reverse
        # @see https://tailwindcss.com/docs/divide-width
        ##
        "divide-y-reverse" => ["divide-y-reverse"],
        ##
        # Divide Opacity
        # @see https://tailwindcss.com/docs/divide-opacity
        ##
        "divide-opacity" => [{ "divide-opacity" => [OPACITY] }],
        ##
        # Divide Style
        # @see https://tailwindcss.com/docs/divide-style
        ##
        "divide-style" => [{ "divide" => LINE_STYLES.call }],
        ##
        # Border Color
        # @see https://tailwindcss.com/docs/border-color
        ##
        "border-color" => [{ "border" => [BORDER_COLOR] }],
        ##
        # Border Color X
        # @see https://tailwindcss.com/docs/border-color
        ##
        "border-color-x" => [{ "border-x" => [BORDER_COLOR] }],
        ##
        # Border Color Y
        # @see https://tailwindcss.com/docs/border-color
        ##
        "border-color-y" => [{ "border-y" => [BORDER_COLOR] }],
        ##
        # Border Color Top
        # @see https://tailwindcss.com/docs/border-color
        ##
        "border-color-t" => [{ "border-t" => [BORDER_COLOR] }],
        ##
        # Border Color Right
        # @see https://tailwindcss.com/docs/border-color
        ##
        "border-color-r" => [{ "border-r" => [BORDER_COLOR] }],
        ##
        # Border Color Bottom
        # @see https://tailwindcss.com/docs/border-color
        ##
        "border-color-b" => [{ "border-b" => [BORDER_COLOR] }],
        ##
        # Border Color Left
        # @see https://tailwindcss.com/docs/border-color
        ##
        "border-color-l" => [{ "border-l" => [BORDER_COLOR] }],
        ##
        # Divide Color
        # @see https://tailwindcss.com/docs/divide-color
        ##
        "divide-color" => [{ "divide" => [BORDER_COLOR] }],
        ##
        # Outline Style
        # @see https://tailwindcss.com/docs/outline-style
        ##
        "outline-style" => [{ "outline" => ["", *LINE_STYLES.call, "hidden"] }],
        ##
        # Outline Offset
        # @see https://tailwindcss.com/docs/outline-offset
        ##
        "outline-offset" => [{ "outline-offset" => [IS_LENGTH] }],
        ##
        # Outline Width
        # @see https://tailwindcss.com/docs/outline-width
        ##
        "outline-w" => [{ "outline" => [IS_LENGTH] }],
        ##
        # Outline Color
        # @see https://tailwindcss.com/docs/outline-color
        ##
        "outline-color" => [{ "outline" => [COLORS] }],
        ##
        # Ring Width
        # @see https://tailwindcss.com/docs/ring-width
        ##
        "ring-w" => [{ "ring" => LENGTH_WITH_EMPTY.call }],
        ##
        # Ring Width Inset
        # @see https://tailwindcss.com/docs/ring-width
        ##
        "ring-w-inset" => ["ring-inset"],
        ##
        # Ring Color
        # @see https://tailwindcss.com/docs/ring-color
        ##
        "ring-color" => [{ "ring" => [COLORS] }],
        ##
        # Ring Opacity
        # @see https://tailwindcss.com/docs/ring-opacity
        ##
        "ring-opacity" => [{ "ring-opacity" => [OPACITY] }],
        ##
        # Ring Offset Width
        # @see https://tailwindcss.com/docs/ring-offset-width
        ##
        "ring-offset-w" => [{ "ring-offset" => [IS_LENGTH] }],
        ##
        # Ring Offset Color
        # @see https://tailwindcss.com/docs/ring-offset-color
        ##
        "ring-offset-color" => [{ "ring-offset" => [COLORS] }],
        # Effects
        ##
        # Box Shadow
        # @see https://tailwindcss.com/docs/box-shadow
        ##
        "shadow" => [{ "shadow" => ["", "inner", "none", IS_TSHIRT_SIZE, IS_ARBITRARY_SHADOW] }],
        ##
        # Box Shadow Color
        # @see https://tailwindcss.com/docs/box-shadow-color
        ##
        "shadow-color" => [{ "shadow" => [IS_ANY] }],
        ##
        # Opacity
        # @see https://tailwindcss.com/docs/opacity
        ##
        "opacity" => [{ "opacity" => [OPACITY] }],
        ##
        # Mix Blend Mode
        # @see https://tailwindcss.com/docs/mix-blend-mode
        ##
        "mix-blend" => [{ "mix-blend" => BLEND_MODES.call }],
        ##
        # Background Blend Mode
        # @see https://tailwindcss.com/docs/background-blend-mode
        ##
        "bg-blend" => [{ "bg-blend" => BLEND_MODES.call }],
        # Filters
        ##
        # Filter
        # @deprecated since Tailwind CSS v3.0.0
        # @see https://tailwindcss.com/docs/filter
        ##
        "filter" => [{ "filter" => ["", "none"] }],
        ##
        # Blur
        # @see https://tailwindcss.com/docs/blur
        ##
        "blur" => [{ "blur" => [BLUR] }],
        ##
        # Brightness
        # @see https://tailwindcss.com/docs/brightness
        ##
        "brightness" => [{ "brightness" => [BRIGHTNESS] }],
        ##
        # Contrast
        # @see https://tailwindcss.com/docs/contrast
        ##
        "contrast" => [{ "contrast" => [CONTRAST] }],
        ##
        # Drop Shadow
        # @see https://tailwindcss.com/docs/drop-shadow
        ##
        "drop-shadow" => [{ "drop-shadow" => ["", "none", IS_TSHIRT_SIZE, IS_ARBITRARY_VALUE] }],
        ##
        # Grayscale
        # @see https://tailwindcss.com/docs/grayscale
        ##
        "grayscale" => [{ "grayscale" => [GRAYSCALE] }],
        ##
        # Hue Rotate
        # @see https://tailwindcss.com/docs/hue-rotate
        ##
        "hue-rotate" => [{ "hue-rotate" => [HUE_ROTATE] }],
        ##
        # Invert
        # @see https://tailwindcss.com/docs/invert
        ##
        "invert" => [{ "invert" => [INVERT] }],
        ##
        # Saturate
        # @see https://tailwindcss.com/docs/saturate
        ##
        "saturate" => [{ "saturate" => [SATURATE] }],
        ##
        # Sepia
        # @see https://tailwindcss.com/docs/sepia
        ##
        "sepia" => [{ "sepia" => [SEPIA] }],
        ##
        # Backdrop Filter
        # @deprecated since Tailwind CSS v3.0.0
        # @see https://tailwindcss.com/docs/backdrop-filter
        ##
        "backdrop-filter" => [{ "backdrop-filter" => ["", "none"] }],
        ##
        # Backdrop Blur
        # @see https://tailwindcss.com/docs/backdrop-blur
        ##
        "backdrop-blur" => [{ "backdrop-blur" => [BLUR] }],
        ##
        # Backdrop Brightness
        # @see https://tailwindcss.com/docs/backdrop-brightness
        ##
        "backdrop-brightness" => [{ "backdrop-brightness" => [BRIGHTNESS] }],
        ##
        # Backdrop Contrast
        # @see https://tailwindcss.com/docs/backdrop-contrast
        ##
        "backdrop-contrast" => [{ "backdrop-contrast" => [CONTRAST] }],
        ##
        # Backdrop Grayscale
        # @see https://tailwindcss.com/docs/backdrop-grayscale
        ##
        "backdrop-grayscale" => [{ "backdrop-grayscale" => [GRAYSCALE] }],
        ##
        # Backdrop Hue Rotate
        # @see https://tailwindcss.com/docs/backdrop-hue-rotate
        ##
        "backdrop-hue-rotate" => [{ "backdrop-hue-rotate" => [HUE_ROTATE] }],
        ##
        # Backdrop Invert
        # @see https://tailwindcss.com/docs/backdrop-invert
        ##
        "backdrop-invert" => [{ "backdrop-invert" => [INVERT] }],
        ##
        # Backdrop Opacity
        # @see https://tailwindcss.com/docs/backdrop-opacity
        ##
        "backdrop-opacity" => [{ "backdrop-opacity" => [OPACITY] }],
        ##
        # Backdrop Saturate
        # @see https://tailwindcss.com/docs/backdrop-saturate
        ##
        "backdrop-saturate" => [{ "backdrop-saturate" => [SATURATE] }],
        ##
        # Backdrop Sepia
        # @see https://tailwindcss.com/docs/backdrop-sepia
        ##
        "backdrop-sepia" => [{ "backdrop-sepia" => [SEPIA] }],
        # Tables
        ##
        # Border Collapse
        # @see https://tailwindcss.com/docs/border-collapse
        ##
        "border-collapse" => [{ "border" => ["collapse", "separate"] }],
        ##
        # Border Spacing
        # @see https://tailwindcss.com/docs/border-spacing
        ##
        "border-spacing" => [{ "border-spacing" => [BORDER_SPACING] }],
        ##
        # Border Spacing X
        # @see https://tailwindcss.com/docs/border-spacing
        ##
        "border-spacing-x" => [{ "border-spacing-x" => [BORDER_SPACING] }],
        ##
        # Border Spacing Y
        # @see https://tailwindcss.com/docs/border-spacing
        ##
        "border-spacing-y" => [{ "border-spacing-y" => [BORDER_SPACING] }],
        ##
        # Table Layout
        # @see https://tailwindcss.com/docs/table-layout
        ##
        "table-layout" => [{ "table" => ["auto", "fixed"] }],
        # Transitions and Animation
        ##
        # Tranisition Property
        # @see https://tailwindcss.com/docs/transition-property
        ##
        "transition" => [
          {
            "transition" => [
              "none",
              "all",
              "",
              "colors",
              "opacity",
              "shadow",
              "transform",
              IS_ARBITRARY_VALUE,
            ],
          },
        ],
        ##
        # Transition Duration
        # @see https://tailwindcss.com/docs/transition-duration
        ##
        "duration" => [{ "duration" => [IS_INTEGER] }],
        ##
        # Transition Timing Function
        # @see https://tailwindcss.com/docs/transition-timing-function
        ##
        "ease" => [{ "ease" => ["linear", "in", "out", "in-out", IS_ARBITRARY_VALUE] }],
        ##
        # Transition Delay
        # @see https://tailwindcss.com/docs/transition-delay
        ##
        "delay" => [{ "delay" => [IS_INTEGER] }],
        ##
        # Animation
        # @see https://tailwindcss.com/docs/animation
        ##
        "animate" => [{ "animate" => ["none", "spin", "ping", "pulse", "bounce", IS_ARBITRARY_VALUE] }],
        # Transforms
        ##
        # Transform
        # @see https://tailwindcss.com/docs/transform
        ##
        "transform" => [{ "transform" => ["", "gpu", "none"] }],
        ##
        # Scale
        # @see https://tailwindcss.com/docs/scale
        ##
        "scale" => [{ "scale" => [SCALE] }],
        ##
        # Scale X
        # @see https://tailwindcss.com/docs/scale
        ##
        "scale-x" => [{ "scale-x" => [SCALE] }],
        ##
        # Scale Y
        # @see https://tailwindcss.com/docs/scale
        ##
        "scale-y" => [{ "scale-y" => [SCALE] }],
        ##
        # Rotate
        # @see https://tailwindcss.com/docs/rotate
        ##
        "rotate" => [{ "rotate" => [IS_INTEGER, IS_ARBITRARY_VALUE] }],
        ##
        # Translate X
        # @see https://tailwindcss.com/docs/translate
        ##
        "translate-x" => [{ "translate-x" => [TRANSLATE] }],
        ##
        # Translate Y
        # @see https://tailwindcss.com/docs/translate
        ##
        "translate-y" => [{ "translate-y" => [TRANSLATE] }],
        ##
        # Skew X
        # @see https://tailwindcss.com/docs/skew
        ##
        "skew-x" => [{ "skew-x" => [SKEW] }],
        ##
        # Skew Y
        # @see https://tailwindcss.com/docs/skew
        ##
        "skew-y" => [{ "skew-y" => [SKEW] }],
        ##
        # Transform Origin
        # @see https://tailwindcss.com/docs/transform-origin
        ##
        "transform-origin" => [
          {
            "origin" => [
              "center",
              "top",
              "top-right",
              "right",
              "bottom-right",
              "bottom",
              "bottom-left",
              "left",
              "top-left",
              IS_ARBITRARY_VALUE,
            ],
          },
        ],
        # Interactivity
        ##
        # Accent Color
        # @see https://tailwindcss.com/docs/accent-color
        ##
        "accent" => [{ "accent" => ["auto", COLORS] }],
        ##
        # Appearance
        # @see https://tailwindcss.com/docs/appearance
        ##
        "appearance" => ["appearance-none"],
        ##
        # Cursor
        # @see https://tailwindcss.com/docs/cursor
        ##
        "cursor" => [
          {
            "cursor" => [
              "auto",
              "default",
              "pointer",
              "wait",
              "text",
              "move",
              "help",
              "not-allowed",
              "none",
              "context-menu",
              "progress",
              "cell",
              "crosshair",
              "vertical-text",
              "alias",
              "copy",
              "no-drop",
              "grab",
              "grabbing",
              "all-scroll",
              "col-resize",
              "row-resize",
              "n-resize",
              "e-resize",
              "s-resize",
              "w-resize",
              "ne-resize",
              "nw-resize",
              "se-resize",
              "sw-resize",
              "ew-resize",
              "ns-resize",
              "nesw-resize",
              "nwse-resize",
              "zoom-in",
              "zoom-out",
              IS_ARBITRARY_VALUE,
            ],
          },
        ],
        ##
        # Caret Color
        # @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
        ##
        "caret-color" => [{ "caret" => [COLORS] }],
        ##
        # Pointer Events
        # @see https://tailwindcss.com/docs/pointer-events
        ##
        "pointer-events" => [{ "pointer-events" => ["none", "auto"] }],
        ##
        # Resize
        # @see https://tailwindcss.com/docs/resize
        ##
        "resize" => [{ "resize" => ["none", "y", "x", ""] }],
        ##
        # Scroll Behavior
        # @see https://tailwindcss.com/docs/scroll-behavior
        ##
        "scroll-behavior" => [{ "scroll" => ["auto", "smooth"] }],
        ##
        # Scroll Margin
        # @see https://tailwindcss.com/docs/scroll-margin
        ##
        "scroll-m" => [{ "scroll-m" => [SPACING] }],
        ##
        # Scroll Margin X
        # @see https://tailwindcss.com/docs/scroll-margin
        ##
        "scroll-mx" => [{ "scroll-mx" => [SPACING] }],
        ##
        # Scroll Margin Y
        # @see https://tailwindcss.com/docs/scroll-margin
        ##
        "scroll-my" => [{ "scroll-my" => [SPACING] }],
        ##
        # Scroll Margin Top
        # @see https://tailwindcss.com/docs/scroll-margin
        ##
        "scroll-mt" => [{ "scroll-mt" => [SPACING] }],
        ##
        # Scroll Margin Right
        # @see https://tailwindcss.com/docs/scroll-margin
        ##
        "scroll-mr" => [{ "scroll-mr" => [SPACING] }],
        ##
        # Scroll Margin Bottom
        # @see https://tailwindcss.com/docs/scroll-margin
        ##
        "scroll-mb" => [{ "scroll-mb" => [SPACING] }],
        ##
        # Scroll Margin Left
        # @see https://tailwindcss.com/docs/scroll-margin
        ##
        "scroll-ml" => [{ "scroll-ml" => [SPACING] }],
        ##
        # Scroll Padding
        # @see https://tailwindcss.com/docs/scroll-padding
        ##
        "scroll-p" => [{ "scroll-p" => [SPACING] }],
        ##
        # Scroll Padding X
        # @see https://tailwindcss.com/docs/scroll-padding
        ##
        "scroll-px" => [{ "scroll-px" => [SPACING] }],
        ##
        # Scroll Padding Y
        # @see https://tailwindcss.com/docs/scroll-padding
        ##
        "scroll-py" => [{ "scroll-py" => [SPACING] }],
        ##
        # Scroll Padding Top
        # @see https://tailwindcss.com/docs/scroll-padding
        ##
        "scroll-pt" => [{ "scroll-pt" => [SPACING] }],
        ##
        # Scroll Padding Right
        # @see https://tailwindcss.com/docs/scroll-padding
        ##
        "scroll-pr" => [{ "scroll-pr" => [SPACING] }],
        ##
        # Scroll Padding Bottom
        # @see https://tailwindcss.com/docs/scroll-padding
        ##
        "scroll-pb" => [{ "scroll-pb" => [SPACING] }],
        ##
        # Scroll Padding Left
        # @see https://tailwindcss.com/docs/scroll-padding
        ##
        "scroll-pl" => [{ "scroll-pl" => [SPACING] }],
        ##
        # Scroll Snap Align
        # @see https://tailwindcss.com/docs/scroll-snap-align
        ##
        "snap-align" => [{ "snap" => ["start", "end", "center", "align-none"] }],
        ##
        # Scroll Snap Stop
        # @see https://tailwindcss.com/docs/scroll-snap-stop
        ##
        "snap-stop" => [{ "snap" =>  ["normal", "always"] }],
        ##
        # Scroll Snap Type
        # @see https://tailwindcss.com/docs/scroll-snap-type
        ##
        "snap-type" => [{ "snap" =>  ["none", "x", "y", "both"] }],
        ##
        # Scroll Snap Type Strictness
        # @see https://tailwindcss.com/docs/scroll-snap-type
        ##
        "snap-strictness" => [{ "snap" => ["mandatory", "proximity"] }],
        ##
        # Touch Action
        # @see https://tailwindcss.com/docs/touch-action
        ##
        "touch" => [
          {
            "touch" => [
              "auto",
              "none",
              "pinch-zoom",
              "manipulation",
              { "pan" => ["x", "left", "right", "y", "up", "down"] },
            ],
          },
        ],
        ##
        # User Select
        # @see https://tailwindcss.com/docs/user-select
        ##
        "select" => [{ "select" => ["none", "text", "all", "auto"] }],
        ##
        # Will Change
        # @see https://tailwindcss.com/docs/will-change
        ##
        "will-change" => [
          { "will-change" => ["auto", "scroll", "contents", "transform", IS_ARBITRARY_VALUE] },
        ],
        # SVG
        ##
        # Fill
        # @see https://tailwindcss.com/docs/fill
        ##
        "fill" => [{ "fill" => [COLORS] }],
        ##
        # Stroke Width
        # @see https://tailwindcss.com/docs/stroke-width
        ##
        "stroke-w" => [{ "stroke" => [IS_LENGTH, IS_ARBITRARY_NUMBER] }],
        ##
        # Stroke
        # @see https://tailwindcss.com/docs/stroke
        ##
        "stroke" => [{ "stroke" => [COLORS] }],
        # Accessibility
        ##
        # Screen Readers
        # @see https://tailwindcss.com/docs/screen-readers
        ##
        "sr" => ["sr-only", "not-sr-only"],
      },
      conflicting_class_groups: {
        "overflow" => ["overflow-x", "overflow-y"],
        "overscroll" => ["overscroll-x", "overscroll-y"],
        "inset" => ["inset-x", "inset-y", "top", "right", "bottom", "left"],
        "inset-x" => ["right", "left"],
        "inset-y" => ["top", "bottom"],
        "flex" => ["basis", "grow", "shrink"],
        "col-start-end" => ["col-start", "col-end"],
        "row-start-end" => ["row-start", "row-end"],
        "gap" => ["gap-x", "gap-y"],
        "p" => ["px", "py", "pt", "pr", "pb", "pl"],
        "px" => ["pr", "pl"],
        "py" => ["pt", "pb"],
        "m" => ["mx", "my", "mt", "mr", "mb", "ml"],
        "mx" => ["mr", "ml"],
        "my" => ["mt", "mb"],
        "font-size" => ["leading"],
        "fvn-normal" => [
          "fvn-ordinal",
          "fvn-slashed-zero",
          "fvn-figure",
          "fvn-spacing",
          "fvn-fraction",
        ],
        "fvn-ordinal" => ["fvn-normal"],
        "fvn-slashed-zero" => ["fvn-normal"],
        "fvn-figure" => ["fvn-normal"],
        "fvn-spacing" => ["fvn-normal"],
        "fvn-fraction" => ["fvn-normal"],
        "rounded" => [
          "rounded-t",
          "rounded-r",
          "rounded-b",
          "rounded-l",
          "rounded-tl",
          "rounded-tr",
          "rounded-br",
          "rounded-bl",
        ],
        "rounded-t" => ["rounded-tl", "rounded-tr"],
        "rounded-r" => ["rounded-tr", "rounded-br"],
        "rounded-b" => ["rounded-br", "rounded-bl"],
        "rounded-l" => ["rounded-tl", "rounded-bl"],
        "border-spacing" => ["border-spacing-x", "border-spacing-y"],
        "border-w" => ["border-w-t", "border-w-r", "border-w-b", "border-w-l"],
        "border-w-x" => ["border-w-r", "border-w-l"],
        "border-w-y" => ["border-w-t", "border-w-b"],
        "border-color" => [
          "border-color-t",
          "border-color-r",
          "border-color-b",
          "border-color-l",
        ],
        "border-color-x" => ["border-color-r", "border-color-l"],
        "border-color-y" => ["border-color-t", "border-color-b"],
        "scroll-m" => [
          "scroll-mx",
          "scroll-my",
          "scroll-mt",
          "scroll-mr",
          "scroll-mb",
          "scroll-ml",
        ],
        "scroll-mx" => ["scroll-mr", "scroll-ml"],
        "scroll-my" => ["scroll-mt", "scroll-mb"],
        "scroll-p" => [
          "scroll-px",
          "scroll-py",
          "scroll-pt",
          "scroll-pr",
          "scroll-pb",
          "scroll-pl",
        ],
        "scroll-px" => ["scroll-pr", "scroll-pl"],
        "scroll-py" => ["scroll-pt", "scroll-pb"],
      },
    }.freeze

    def merge_configs(extension_config)
      config = TailwindMerge::Config::DEFAULTS
      [:theme].each do |type|
        extension_config.fetch(type, {}).each_pair do |key, value|
          config[type][value] = ->(config) { FROM_THEME.call(config, key) }
        end
      end
      config
    end
  end
end