Module: TailwindMerge::Config

Includes:
Validators
Included in:
Merger
Defined in:
lib/tailwind_merge/config.rb

Constant Summary collapse

THEME_KEYS =
[
  "color",
  "font",
  "text",
  "font-weight",
  "tracking",
  "leading",
  "breakpoint",
  "container",
  "spacing",
  "radius",
  "shadow",
  "inset-shadow",
  "text-shadow",
  "drop-shadow",
  "blur",
  "perspective",
  "aspect",
  "ease",
  "animate",
].freeze
VALID_THEME_IDS =
Set.new(THEME_KEYS.map { |theme_key| const_get("THEME_#{theme_key.upcase.tr("-", "_")}").object_id }).freeze
SCALE_BREAK =
-> { ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"] }
SCALE_POSITION =
-> {
  [
    "center",
    "top",
    "bottom",
    "left",
    "right",
    "top-left",
    # Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
    "left-top",
    "top-right",
    # Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
    "right-top",
    "bottom-right",
    # Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
    "right-bottom",
    "bottom-left",
    # Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
    "left-bottom",
  ]
}
SCALE_POSITION_WITH_ARBITRARY =
-> { [*SCALE_POSITION.call, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
SCALE_OVERFLOW =
-> { ["auto", "hidden", "clip", "visible", "scroll"] }
SCALE_OVERSCROLL =
-> { ["auto", "contain", "none"] }
SCALE_UNAMBIGUOUS_SPACING =
-> { [IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE, THEME_SPACING] }
SCALE_INSET =
->(_config) {
  [
    IS_FRACTION,
    "full",
    "auto",
    *SCALE_UNAMBIGUOUS_SPACING.call,
  ]
}
SCALE_GRID_TEMPLATE_COLS_ROWS =
-> { [IS_INTEGER, "none", "subgrid", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
SCALE_GRID_COL_ROW_START_AND_END =
-> {
  [
    "auto",
    { "span" => ["full", IS_INTEGER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] },
    IS_INTEGER,
    IS_ARBITRARY_VARIABLE,
    IS_ARBITRARY_VALUE,
  ]
}
SCALE_GRID_COL_ROW_START_OR_END =
-> { [IS_INTEGER, "auto", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
SCALE_GRID_AUTO_COLS_ROWS =
-> { ["auto", "min", "max", "fr", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
SCALE_ALIGN_PRIMARY_AXIS =
-> { ["start", "end", "center", "between", "around", "evenly", "stretch", "baseline", "center-safe", "end-safe"] }
SCALE_ALIGN_SECONDARY_AXIS =
-> { ["start", "end", "center", "stretch", "center-safe", "end-safe"] }
SCALE_MARGIN =
-> { ["auto", *SCALE_UNAMBIGUOUS_SPACING.call] }
SCALE_SIZING =
-> {
  [
    IS_FRACTION,
    "auto",
    "full",
    "dvw",
    "dvh",
    "lvw",
    "lvh",
    "svw",
    "svh",
    "min",
    "max",
    "fit",
    *SCALE_UNAMBIGUOUS_SPACING.call,
  ]
}
SCALE_COLOR =
-> { [THEME_COLOR, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
SCALE_BG_POSITION =
-> { [*SCALE_POSITION.call, IS_ARBITRARY_VARIABLE_POSITION, IS_ARBITRARY_POSITION, "position" => [IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE]] }
SCALE_BG_REPEAT =
-> { ["no-repeat", "repeat" => ["", "x", "y", "space", "round"]] }
SCALE_BG_SIZE =
-> { ["auto", "cover", "contain", IS_ARBITRARY_VARIABLE_SIZE, IS_ARBITRARY_SIZE, "size" => [IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE]] }
SCALE_GRADIENT_STOP_POSITION =
-> { [IS_PERCENT, IS_ARBITRARY_VARIABLE_LENGTH, IS_ARBITRARY_LENGTH] }
SCALE_RADIUS =
-> {
  [
    # Deprecated since Tailwind CSS v4.0.0
    "",
    "none",
    "full",
    THEME_RADIUS,
    IS_ARBITRARY_VARIABLE,
    IS_ARBITRARY_VALUE,
  ]
}
SCALE_BORDER_WIDTH =
-> { ["", IS_NUMBER, IS_ARBITRARY_VARIABLE_LENGTH, IS_ARBITRARY_LENGTH] }
SCALE_LINE_STYLE =
-> { ["solid", "dashed", "dotted", "double"] }
SCALE_BLEND_MODE =
-> {
  [
    "normal",
    "multiply",
    "screen",
    "overlay",
    "darken",
    "lighten",
    "color-dodge",
    "color-burn",
    "hard-light",
    "soft-light",
    "difference",
    "exclusion",
    "hue",
    "saturation",
    "color",
    "luminosity",
  ]
}
SCALE_MASK_IMAGE_POSITION =
-> { [IS_NUMBER, IS_PERCENT, IS_ARBITRARY_VARIABLE_POSITION, IS_ARBITRARY_POSITION] }
SCALE_BLUR =
-> {
  [
    "",
    "none",
    THEME_BLUR,
    IS_ARBITRARY_VARIABLE,
    IS_ARBITRARY_VALUE,
  ]
}
SCALE_ROTATE =
-> { ["none", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
SCALE_SCALE =
-> { ["none", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
SCALE_SKEW =
-> { [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
SCALE_TRANSLATE =
-> { [IS_FRACTION, "full", *SCALE_UNAMBIGUOUS_SPACING.call] }
DEFAULTS =
{
  cache_size: 500,
  prefix: nil,
  ignore_empty_cache: true,
  theme: {
    "animate" => ["spin", "ping", "pulse", "bounce"],
    "aspect" => ["video"],
    "blur" => [IS_TSHIRT_SIZE],
    "breakpoint" => [IS_TSHIRT_SIZE],
    "color" => [IS_ANY],
    "container" => [IS_TSHIRT_SIZE],
    "drop-shadow" => [IS_TSHIRT_SIZE],
    "ease" => ["in", "out", "in-out"],
    "font" => [IS_ANY_NON_ARBITRARY],
    "font-weight" => [
      "thin",
      "extralight",
      "light",
      "normal",
      "medium",
      "semibold",
      "bold",
      "extrabold",
      "black",
    ],
    "inset-shadow" => [IS_TSHIRT_SIZE],
    "leading" => ["none", "tight", "snug", "normal", "relaxed", "loose"],
    "perspective" => ["dramatic", "near", "normal", "midrange", "distant", "none"],
    "radius" => [IS_TSHIRT_SIZE],
    "shadow" => [IS_TSHIRT_SIZE],
    "spacing" => ["px", IS_NUMBER],
    "text" => [IS_TSHIRT_SIZE],
    "text-shadow" => [IS_TSHIRT_SIZE],
    "tracking" => ["tighter", "tight", "normal", "wide", "wider", "widest"],
  },
  class_groups: {
    ##########
    # Layout
    ##########

    ##
    # Aspect Ratio
    # @see https://tailwindcss.com/docs/aspect-ratio
    ##
    "aspect" => [
      {
        "aspect" => [
          "auto",
          "square",
          IS_FRACTION,
          IS_ARBITRARY_VALUE,
          IS_ARBITRARY_VARIABLE,
          THEME_ASPECT,
        ],
      },
    ],
    ##
    # Container
    # @see https://tailwindcss.com/docs/container
    # @deprecated since Tailwind CSS v4.0.0
    ##
    "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" => SCALE_BREAK.call }],
    ##
    # Break Before
    # @see https://tailwindcss.com/docs/break-before
    ##
    "break-before" => [{ "break-before" => SCALE_BREAK.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",
    ],
    ##
    # Screen Reader Only
    # @see https://tailwindcss.com/docs/display#screen-reader-only
    ##
    "sr" => ["sr-only", "not-sr-only"],
    ##
    # Floats
    # @see https://tailwindcss.com/docs/float
    ##
    "float" => [{ "float" => ["right", "left", "none", "start", "end"] }],
    ##
    # Clear
    # @see https://tailwindcss.com/docs/clear
    ##
    "clear" => [{ "clear" => ["left", "right", "both", "none", "start", "end"] }],
    ##
    # 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" => SCALE_POSITION_WITH_ARBITRARY.call }],
    ##
    # Overflow
    # @see https://tailwindcss.com/docs/overflow
    ##
    "overflow" => [{ "overflow" => SCALE_OVERFLOW.call }],
    ##
    # Overflow X
    # @see https://tailwindcss.com/docs/overflow
    ##
    "overflow-x" => [{ "overflow-x" => SCALE_OVERFLOW.call }],
    ##
    # Overflow Y
    # @see https://tailwindcss.com/docs/overflow
    ##
    "overflow-y" => [{ "overflow-y" => SCALE_OVERSCROLL.call }],
    ##
    # Overscroll Behavior
    # @see https://tailwindcss.com/docs/overscroll-behavior
    ##
    "overscroll" => [{ "overscroll" => SCALE_OVERSCROLL.call }],
    ##
    # Overscroll Behavior X
    # @see https://tailwindcss.com/docs/overscroll-behavior
    ##
    "overscroll-x" => [{ "overscroll-x" => SCALE_OVERSCROLL.call }],
    ##
    # Overscroll Behavior Y
    # @see https://tailwindcss.com/docs/overscroll-behavior
    ##
    "overscroll-y" => [{ "overscroll-y" => SCALE_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" => [SCALE_INSET] }],
    ##
    # Right / Left
    # @see https://tailwindcss.com/docs/top-right-bottom-left
    ##
    "inset-x" => [{ "inset-x" => [SCALE_INSET] }],
    ##
    # Top / Bottom
    # @see https://tailwindcss.com/docs/top-right-bottom-left
    ##
    "inset-y" => [{ "inset-y" => [SCALE_INSET] }],
    #
    # Start
    # @see https://tailwindcss.com/docs/top-right-bottom-left
    #
    "start" => [{ "start" => [SCALE_INSET] }],
    #
    # End
    # @see https://tailwindcss.com/docs/top-right-bottom-left
    #
    "end" => [{ "end" => [SCALE_INSET] }],
    ##
    # Top
    # @see https://tailwindcss.com/docs/top-right-bottom-left
    ##
    "top" => [{ "top" => [SCALE_INSET] }],
    ##
    # Right
    # @see https://tailwindcss.com/docs/top-right-bottom-left
    ##
    "right" => [{ "right" => [SCALE_INSET] }],
    ##
    # Bottom
    # @see https://tailwindcss.com/docs/top-right-bottom-left
    ##
    "bottom" => [{ "bottom" => [SCALE_INSET] }],
    ##
    # Left
    # @see https://tailwindcss.com/docs/top-right-bottom-left
    ##
    "left" => [{ "left" => [SCALE_INSET] }],
    ##
    # Visibility
    # @see https://tailwindcss.com/docs/visibility
    ##
    "visibility" => ["visible", "invisible", "collapse"],
    ##
    # Z-Index
    # @see https://tailwindcss.com/docs/z-index
    ##
    "z" => [{ "z" => [IS_INTEGER, "auto", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],

    ##########
    # Flexbox and Grid
    ##########

    # Flex Basis
    # @see https://tailwindcss.com/docs/flex-basis
    ##
    "basis" => [{
      "basis" => [
        IS_FRACTION,
        "full",
        "auto",
        THEME_CONTAINER,
        *SCALE_UNAMBIGUOUS_SPACING.call,
      ],
    }],
    ##
    # 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" => ["nowrap", "wrap", "wrap-reverse"] }],
    ##
    # Flex
    # @see https://tailwindcss.com/docs/flex
    ##
    "flex" => [{ "flex" => [IS_NUMBER, IS_FRACTION, "auto", "initial", "none", Validators::IS_ARBITRARY_VALUE] }],
    ##
    # Flex Grow
    # @see https://tailwindcss.com/docs/flex-grow
    ##
    "grow" => [{ "grow" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Flex Shrink
    # @see https://tailwindcss.com/docs/flex-shrink
    ##
    "shrink" => [{ "shrink" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Order
    # @see https://tailwindcss.com/docs/order
    ##
    "order" => [{
      "order" => [
        IS_INTEGER,
        "first",
        "last",
        "none",
        IS_ARBITRARY_VARIABLE,
        IS_ARBITRARY_VALUE,
      ],
    }],
    ##
    # Grid Template Columns
    # @see https://tailwindcss.com/docs/grid-template-columns
    ##
    "grid-cols" => [{ "grid-cols" => SCALE_GRID_TEMPLATE_COLS_ROWS.call }],
    ##
    # Grid Column Start / End
    # @see https://tailwindcss.com/docs/grid-column
    ##
    "col-start-end" => [{ "col" => SCALE_GRID_COL_ROW_START_AND_END.call }],

    ##
    # Grid Column Start
    # @see https://tailwindcss.com/docs/grid-column
    ##
    "col-start" => [{ "col-start" => SCALE_GRID_COL_ROW_START_OR_END.call }],
    ##
    # Grid Column End
    # @see https://tailwindcss.com/docs/grid-column
    ##
    "col-end" => [{ "col-end" => SCALE_GRID_COL_ROW_START_OR_END.call }],
    ##
    # Grid Template Rows
    # @see https://tailwindcss.com/docs/grid-template-rows
    ##
    "grid-rows" => [{ "grid-rows" => SCALE_GRID_TEMPLATE_COLS_ROWS.call }],
    ##
    # Grid Row Start / End
    # @see https://tailwindcss.com/docs/grid-row
    ##
    "row-start-end" => [{ "row" => SCALE_GRID_COL_ROW_START_AND_END.call }],
    ##
    # Grid Row Start
    # @see https://tailwindcss.com/docs/grid-row
    ##
    "row-start" => [{ "row-start" => SCALE_GRID_COL_ROW_START_OR_END.call }],
    ##
    # Grid Row End
    # @see https://tailwindcss.com/docs/grid-row
    ##
    "row-end" => [{ "row-end" => SCALE_GRID_COL_ROW_START_OR_END.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" => SCALE_GRID_AUTO_COLS_ROWS.call }],
    ##
    # Grid Auto Rows
    # @see https://tailwindcss.com/docs/grid-auto-rows
    ##
    "auto-rows" => [{ "auto-rows" => SCALE_GRID_AUTO_COLS_ROWS.call }],
    ##
    # Gap
    # @see https://tailwindcss.com/docs/gap
    ##
    "gap" => [{ "gap" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Gap X
    # @see https://tailwindcss.com/docs/gap
    ##
    "gap-x" => [{ "gap-x" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Gap Y
    # @see https://tailwindcss.com/docs/gap
    ##
    "gap-y" => [{ "gap-y" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Justify Content
    # @see https://tailwindcss.com/docs/justify-content
    ##
    "justify-content" => [{ "justify" => [*SCALE_ALIGN_PRIMARY_AXIS.call, "normal"] }],
    ##
    # Justify Items
    # @see https://tailwindcss.com/docs/justify-items
    ##
    "justify-items" => [{ "justify-items" => [*SCALE_ALIGN_SECONDARY_AXIS.call, "normal"] }],
    ##
    # Justify Self
    # @see https://tailwindcss.com/docs/justify-self
    ##
    "justify-self" => [{ "justify-self" => ["auto", *SCALE_ALIGN_SECONDARY_AXIS.call] }],
    ##
    # Align Content
    # @see https://tailwindcss.com/docs/align-content
    ##
    "align-content" => [{ "content" => ["normal", *SCALE_ALIGN_PRIMARY_AXIS.call] }],
    ##
    # Align Items
    # @see https://tailwindcss.com/docs/align-items
    ##
    "align-items" => [{ "items" => [*SCALE_ALIGN_SECONDARY_AXIS.call, "baseline" => ["", "last"]] }],
    ##
    # Align Self
    # @see https://tailwindcss.com/docs/align-self
    ##
    "align-self" => [{ "self" => ["auto", *SCALE_ALIGN_SECONDARY_AXIS.call, { "baseline" => ["", "last"] }] }],
    ##
    # Place Content
    # @see https://tailwindcss.com/docs/place-content
    ##
    "place-content" => [{ "place-content" => SCALE_ALIGN_PRIMARY_AXIS.call }],
    ##
    # Place Items
    # @see https://tailwindcss.com/docs/place-items
    ##
    "place-items" => [{ "place-items" => [*SCALE_ALIGN_SECONDARY_AXIS.call, "baseline"] }],
    ##
    # Place Self
    # @see https://tailwindcss.com/docs/place-self
    ##
    "place-self" => [{ "place-self" => ["auto", *SCALE_ALIGN_SECONDARY_AXIS.call] }],
    # Spacing
    ##
    # Padding
    # @see https://tailwindcss.com/docs/padding
    ##
    "p" => [{ "p" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Padding X
    # @see https://tailwindcss.com/docs/padding
    ##
    "px" => [{ "px" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Padding Y
    # @see https://tailwindcss.com/docs/padding
    ##
    "py" => [{ "py" => SCALE_UNAMBIGUOUS_SPACING.call }],
    #
    # Padding Start
    # @see https://tailwindcss.com/docs/padding
    #
    "ps" => [{ "ps" => SCALE_UNAMBIGUOUS_SPACING.call }],
    #
    # Padding End
    # @see https://tailwindcss.com/docs/padding
    #
    "pe" => [{ "pe" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Padding Top
    # @see https://tailwindcss.com/docs/padding
    ##
    "pt" => [{ "pt" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Padding Right
    # @see https://tailwindcss.com/docs/padding
    ##
    "pr" => [{ "pr" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Padding Bottom
    # @see https://tailwindcss.com/docs/padding
    ##
    "pb" => [{ "pb" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Padding Left
    # @see https://tailwindcss.com/docs/padding
    ##
    "pl" => [{ "pl" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Margin
    # @see https://tailwindcss.com/docs/margin
    ##
    "m" => [{ "m" => SCALE_MARGIN.call }],
    ##
    # Margin X
    # @see https://tailwindcss.com/docs/margin
    ##
    "mx" => [{ "mx" => SCALE_MARGIN.call  }],
    ##
    # Margin Y
    # @see https://tailwindcss.com/docs/margin
    ##
    "my" => [{ "my" => SCALE_MARGIN.call  }],
    #
    # Margin Start
    # @see https://tailwindcss.com/docs/margin
    #
    "ms" => [{ "ms" => SCALE_MARGIN.call  }],
    #
    # Margin End
    # @see https://tailwindcss.com/docs/margin
    #
    "me" => [{ "me" => SCALE_MARGIN.call  }],
    ##
    # Margin Top
    # @see https://tailwindcss.com/docs/margin
    ##
    "mt" => [{ "mt" => SCALE_MARGIN.call }],
    ##
    # Margin Right
    # @see https://tailwindcss.com/docs/margin
    ##
    "mr" => [{ "mr" => SCALE_MARGIN.call  }],
    ##
    # Margin Bottom
    # @see https://tailwindcss.com/docs/margin
    ##
    "mb" => [{ "mb" => SCALE_MARGIN.call  }],
    ##
    # Margin Left
    # @see https://tailwindcss.com/docs/margin
    ##
    "ml" => [{ "ml" => SCALE_MARGIN.call  }],
    ##
    # Space Between X
    # @see https://tailwindcss.com/docs/margin#adding-space-between-children
    ##
    "space-x" => [{ "space-x" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Space Between X Reverse
    # @see https://tailwindcss.com/docs/margin#adding-space-between-children
    ##
    "space-x-reverse" => ["space-x-reverse"],
    ##
    # Space Between Y
    # @see https://tailwindcss.com/docs/margin#adding-space-between-children
    ##
    "space-y" => [{ "space-y" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Space Between Y Reverse
    # @see https://tailwindcss.com/docs/margin#adding-space-between-children
    ##
    "space-y-reverse" => ["space-y-reverse"],

    ##########
    # Sizing
    ##########

    ##
    # Size
    # @see https://tailwindcss.com/docs/width#setting-both-width-and-height
    ##
    "size" => [{ "size" => SCALE_SIZING.call }],
    # Width
    # @see https://tailwindcss.com/docs/width
    ##
    "w" => [{
      "w" => [
        THEME_CONTAINER, "screen", *SCALE_SIZING.call,
      ],
    }],
    ##
    # Min-Width
    # @see https://tailwindcss.com/docs/min-width
    ##
    "min-w" => [{
      "min-w" => [
        THEME_CONTAINER,
        "screen",
        # Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 ##
        "none",
        *SCALE_SIZING.call,
      ],
    }],
    ##
    # Max-Width
    # @see https://tailwindcss.com/docs/max-width
    ##
    "max-w" => [
      {
        "max-w" => [
          THEME_CONTAINER,
          "screen",
          "none",
          # Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 ##
          "prose",
          # Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 ##
          { "screen" => [THEME_BREAKPOINT] },
          *SCALE_SIZING.call,
        ],
      },
    ],
    ##
    # Height
    # @see https://tailwindcss.com/docs/height
    ##
    "h" => [{ "h" => ["screen", "lh", *SCALE_SIZING.call] }],
    ##
    # Min-Height
    # @see https://tailwindcss.com/docs/min-height
    ##
    "min-h" => [{ "min-h" => ["screen", "none", "lh", *SCALE_SIZING.call] }],
    ##
    # Max-Height
    # @see https://tailwindcss.com/docs/max-height
    ##
    "max-h" => [{ "max-h" => ["screen", "lh", *SCALE_SIZING.call] }],

    ############
    # Typography
    ############

    # Font Size
    # @see https://tailwindcss.com/docs/font-size
    ##
    "font-size" => [{ "text" => ["base", THEME_TEXT, IS_ARBITRARY_VARIABLE_LENGTH, 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" => [
          THEME_FONT_WEIGHT,
          IS_ARBITRARY_VARIABLE,
          IS_ARBITRARY_NUMBER,
        ],
      },
    ],
    ##
    # Font Stretch
    # @see https://tailwindcss.com/docs/font-stretch
    ##
    "font-stretch" => [
      {
        "font-stretch" => [
          "ultra-condensed",
          "extra-condensed",
          "condensed",
          "semi-condensed",
          "normal",
          "semi-expanded",
          "expanded",
          "extra-expanded",
          "ultra-expanded",
          IS_PERCENT,
          IS_ARBITRARY_VALUE,
        ],
      },
    ],
    ##
    # Font Family
    # @see https://tailwindcss.com/docs/font-family
    ##
    "font-family" => [{ "font" => [IS_ARBITRARY_VARIABLE_FAMILY_NAME, IS_ARBITRARY_VALUE, THEME_FONT] }],
    ##
    # 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-fractions"],
    ##
    # Letter Spacing
    # @see https://tailwindcss.com/docs/letter-spacing
    ##
    "tracking" => [
      {
        "tracking" => [THEME_TRACKING, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE],
      },
    ],
    #
    # Line Clamp
    # @see https://tailwindcss.com/docs/line-clamp
    #
    "line-clamp" => [{ "line-clamp" => [IS_NUMBER, "none", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_NUMBER] }],
    ##
    # Line Height
    # @see https://tailwindcss.com/docs/line-height
    ##
    "leading" => [
      {
        "leading" => [
          # Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 ##
          THEME_LEADING,
          *SCALE_UNAMBIGUOUS_SPACING.call,
        ],
      },
    ],
    #
    # List Style Image
    # @see https://tailwindcss.com/docs/list-style-image
    #
    "list-image" => [{ "list-image" => ["none", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    # List Style Position
    # @see https://tailwindcss.com/docs/list-style-position
    ##
    "list-style-position" => [{ "list" => ["inside", "outside"] }],
    ##
    # List Style Type
    # @see https://tailwindcss.com/docs/list-style-type
    ##
    "list-style-type" => [{ "list" => ["disc", "decimal", "none", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Text Alignment
    # @see https://tailwindcss.com/docs/text-align
    ##
    "text-alignment" => [{ "text" => ["left", "center", "right", "justify", "start", "end"] }],
    ##
    # Placeholder Color
    # @deprecated since Tailwind CSS v3.0.0
    # @see https://tailwindcss.com/docs/placeholder-color
    ##
    "placeholder-color" => [{ "placeholder" => SCALE_COLOR.call }],
    ##
    # Text Color
    # @see https://tailwindcss.com/docs/text-color
    ##
    "text-color" => [{ "text" => SCALE_COLOR.call }],
    ##
    # 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" => [*SCALE_LINE_STYLE.call, "wavy"] }],
    ##
    # Text Decoration Thickness
    # @see https://tailwindcss.com/docs/text-decoration-thickness
    ##
    "text-decoration-thickness" => [{ "decoration" => [IS_NUMBER, "from-font", "auto", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_LENGTH] }],
    ##
    # Text Decoration Color
    # @see https://tailwindcss.com/docs/text-decoration-color
    ##
    "text-decoration-color" => [{ "decoration" => SCALE_COLOR.call }],
    ##
    # Text Underline Offset
    # @see https://tailwindcss.com/docs/text-underline-offset
    ##
    "underline-offset" => [{ "underline-offset" => [IS_NUMBER, "auto", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # 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 Wrap
    # @see https://tailwindcss.com/docs/text-wrap
    ##
    "text-wrap" => [{ "text" => ["wrap", "nowrap", "balance", "pretty"] }],
    ##
    # Text Indent
    # @see https://tailwindcss.com/docs/text-indent
    ##
    "indent" => [{ "indent" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Vertical Alignment
    # @see https://tailwindcss.com/docs/vertical-align
    ##
    "vertical-align" => [
      {
        "align" => [
          "baseline",
          "top",
          "middle",
          "bottom",
          "text-top",
          "text-bottom",
          "sub",
          "super",
          IS_ARBITRARY_VARIABLE,
          IS_ARBITRARY_VALUE,
        ],
      },
    ],
    ##
    # Whitespace
    # @see https://tailwindcss.com/docs/whitespace
    ##
    "whitespace" => [{ "whitespace" => ["normal", "nowrap", "pre", "pre-line", "pre-wrap", "break-spaces"] }],
    ##
    # Word Break
    # @see https://tailwindcss.com/docs/word-break
    ##
    "break" => [{ "break" => ["normal", "words", "all", "keep"] }],
    ##
    # Overflow Wrap
    # @see https://tailwindcss.com/docs/overflow-wrap
    ##
    "wrap" => [{ "wrap" => ["break-word", "anywhere", "normal"] }],
    #
    # Hyphens
    # @see https://tailwindcss.com/docs/hyphens
    #
    "hyphens" => [{ "hyphens" => ["none", "manual", "auto"] }],
    ##
    # Content
    # @see https://tailwindcss.com/docs/content
    ##
    "content" => [{ "content" => ["none", IS_ARBITRARY_VARIABLE, 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 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" => SCALE_BG_POSITION.call }],
    ##
    # Background Repeat
    # @see https://tailwindcss.com/docs/background-repeat
    ##
    "bg-repeat" => [{ "bg" => SCALE_BG_REPEAT.call }],
    ##
    # Background Size
    # @see https://tailwindcss.com/docs/background-size
    ##
    "bg-size" => [{ "bg" => SCALE_BG_SIZE.call }],
    ##
    # Background Image
    # @see https://tailwindcss.com/docs/background-image
    ##
    "bg-image" => [
      {
        "bg" => [
          "none",
          {
            "linear" => [
              { "to" => ["t", "tr", "r", "br", "b", "bl", "l", "tl"] },
              IS_INTEGER,
              IS_ARBITRARY_VARIABLE,
              IS_ARBITRARY_VALUE,
            ],
            "radial" => ["", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE],
            "conic" => [IS_INTEGER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE],
          },
          IS_ARBITRARY_VARIABLE_IMAGE,
          IS_ARBITRARY_IMAGE,
        ],
      },
    ],
    ##
    # Background Color
    # @see https://tailwindcss.com/docs/background-color
    ##
    "bg-color" => [{ "bg" => SCALE_COLOR.call }],
    #
    # Gradient Color Stops From Position
    # @see https://tailwindcss.com/docs/gradient-color-stops
    #
    "gradient-from-pos" => [{ "from" => SCALE_GRADIENT_STOP_POSITION.call }],
    #
    # Gradient Color Stops Via Position
    # @see https://tailwindcss.com/docs/gradient-color-stops
    #
    "gradient-via-pos" => [{ "via" => SCALE_GRADIENT_STOP_POSITION.call }],
    #
    # Gradient Color Stops To Position
    # @see https://tailwindcss.com/docs/gradient-color-stops
    #
    "gradient-to-pos" => [{ "to" => SCALE_GRADIENT_STOP_POSITION.call }],
    ##
    # Gradient Color Stops From
    # @see https://tailwindcss.com/docs/gradient-color-stops
    ##
    "gradient-from" => [{ "from" => SCALE_COLOR.call }],
    ##
    # Gradient Color Stops Via
    # @see https://tailwindcss.com/docs/gradient-color-stops
    ##
    "gradient-via" => [{ "via" => SCALE_COLOR.call }],
    ##
    # Gradient Color Stops To
    # @see https://tailwindcss.com/docs/gradient-color-stops
    ##
    "gradient-to" => [{ "to" => SCALE_COLOR.call }],

    ###########
    # Borders
    ###########

    # Border Radius
    # @see https://tailwindcss.com/docs/border-radius
    ##
    "rounded" => [{ "rounded" => SCALE_RADIUS.call }],
    #
    # Border Radius Start
    # @see https://tailwindcss.com/docs/border-radius
    #
    "rounded-s" => [{ "rounded-s" => SCALE_RADIUS.call }],
    #
    # Border Radius End
    # @see https://tailwindcss.com/docs/border-radius
    #
    "rounded-e" => [{ "rounded-e" => SCALE_RADIUS.call }],
    ##
    # Border Radius Top
    # @see https://tailwindcss.com/docs/border-radius
    ##
    "rounded-t" => [{ "rounded-t" => SCALE_RADIUS.call }],
    ##
    # Border Radius Right
    # @see https://tailwindcss.com/docs/border-radius
    ##
    "rounded-r" => [{ "rounded-r" => SCALE_RADIUS.call }],
    ##
    # Border Radius Bottom
    # @see https://tailwindcss.com/docs/border-radius
    ##
    "rounded-b" => [{ "rounded-b" => SCALE_RADIUS.call }],
    ##
    # Border Radius Left
    # @see https://tailwindcss.com/docs/border-radius
    ##
    "rounded-l" => [{ "rounded-l" => SCALE_RADIUS.call }],
    #
    # Border Radius Start Start
    # @see https://tailwindcss.com/docs/border-radius
    #
    "rounded-ss" => [{ "rounded-ss" => SCALE_RADIUS.call }],
    #
    # Border Radius Start End
    # @see https://tailwindcss.com/docs/border-radius
    #
    "rounded-se" => [{ "rounded-se" => SCALE_RADIUS.call }],
    #
    # Border Radius End End
    # @see https://tailwindcss.com/docs/border-radius
    #
    "rounded-ee" => [{ "rounded-ee" => SCALE_RADIUS.call }],
    #
    # Border Radius End Start
    # @see https://tailwindcss.com/docs/border-radius
    #
    "rounded-es" => [{ "rounded-es" => SCALE_RADIUS.call }],
    ##
    # Border Radius Top Left
    # @see https://tailwindcss.com/docs/border-radius
    ##
    "rounded-tl" => [{ "rounded-tl" => SCALE_RADIUS.call }],
    ##
    # Border Radius Top Right
    # @see https://tailwindcss.com/docs/border-radius
    ##
    "rounded-tr" => [{ "rounded-tr" => SCALE_RADIUS.call }],
    ##
    # Border Radius Bottom Right
    # @see https://tailwindcss.com/docs/border-radius
    ##
    "rounded-br" => [{ "rounded-br" => SCALE_RADIUS.call }],
    ##
    # Border Radius Bottom Left
    # @see https://tailwindcss.com/docs/border-radius
    ##
    "rounded-bl" => [{ "rounded-bl" => SCALE_RADIUS.call }],
    ##
    # Border Width
    # @see https://tailwindcss.com/docs/border-width
    ##
    "border-w" => [{ "border" => SCALE_BORDER_WIDTH.call }],
    ##
    # Border Width X
    # @see https://tailwindcss.com/docs/border-width
    ##
    "border-w-x" => [{ "border-x" => SCALE_BORDER_WIDTH.call }],
    ##
    # Border Width Y
    # @see https://tailwindcss.com/docs/border-width
    ##
    "border-w-y" => [{ "border-y" => SCALE_BORDER_WIDTH.call }],
    #
    # Border Width Start
    # @see https://tailwindcss.com/docs/border-width
    #
    "border-w-s" => [{ "border-s" => SCALE_BORDER_WIDTH.call }],
    #
    # Border Width End
    # @see https://tailwindcss.com/docs/border-width
    #
    "border-w-e" => [{ "border-e" => SCALE_BORDER_WIDTH.call }],
    ##
    # Border Width Top
    # @see https://tailwindcss.com/docs/border-width
    ##
    "border-w-t" => [{ "border-t" => SCALE_BORDER_WIDTH.call }],
    ##
    # Border Width Right
    # @see https://tailwindcss.com/docs/border-width
    ##
    "border-w-r" => [{ "border-r" => SCALE_BORDER_WIDTH.call }],
    ##
    # Border Width Bottom
    # @see https://tailwindcss.com/docs/border-width
    ##
    "border-w-b" => [{ "border-b" => SCALE_BORDER_WIDTH.call }],
    ##
    # Border Width Left
    # @see https://tailwindcss.com/docs/border-width
    ##
    "border-w-l" => [{ "border-l" => SCALE_BORDER_WIDTH.call }],

    ##
    # Divide Width X
    # @see https://tailwindcss.com/docs/border-width#between-children
    ##
    "divide-x" => [{ "divide-x" => SCALE_BORDER_WIDTH.call }],
    ##
    # 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" => SCALE_BORDER_WIDTH.call }],
    ##
    # Divide Width Y Reverse
    # @see https://tailwindcss.com/docs/divide-width
    ##
    "divide-y-reverse" => ["divide-y-reverse"],
    ##
    # Border Style
    # @see https://tailwindcss.com/docs/border-style
    ##
    "border-style" => [{ "border" => [*SCALE_LINE_STYLE.call, "hidden", "none"] }],
    ##
    # Divide Style
    # @see https://tailwindcss.com/docs/divide-style
    ##
    "divide-style" => [{ "divide" => [*SCALE_LINE_STYLE.call, "hidden", "none"] }],
    ##
    # Border Color
    # @see https://tailwindcss.com/docs/border-color
    ##
    "border-color" => [{ "border" => SCALE_COLOR.call }],
    ##
    # Border Color X
    # @see https://tailwindcss.com/docs/border-color
    ##
    "border-color-x" => [{ "border-x" => SCALE_COLOR.call }],
    ##
    # Border Color Y
    # @see https://tailwindcss.com/docs/border-color
    ##
    "border-color-y" => [{ "border-y" => SCALE_COLOR.call }],
    ##
    # Border Color S
    # @see https://tailwindcss.com/docs/border-color
    ##
    "border-color-s" => [{ "border-s" => SCALE_COLOR.call }],
    ##
    # Border Color E
    # @see https://tailwindcss.com/docs/border-color
    ##
    "border-color-e" => [{ "border-e" => SCALE_COLOR.call }],
    ##
    # Border Color Top
    # @see https://tailwindcss.com/docs/border-color
    ##
    "border-color-t" => [{ "border-t" => SCALE_COLOR.call }],
    ##
    # Border Color Right
    # @see https://tailwindcss.com/docs/border-color
    ##
    "border-color-r" => [{ "border-r" => SCALE_COLOR.call }],
    ##
    # Border Color Bottom
    # @see https://tailwindcss.com/docs/border-color
    ##
    "border-color-b" => [{ "border-b" => SCALE_COLOR.call }],
    ##
    # Border Color Left
    # @see https://tailwindcss.com/docs/border-color
    ##
    "border-color-l" => [{ "border-l" => SCALE_COLOR.call }],
    ##
    # Divide Color
    # @see https://tailwindcss.com/docs/divide-color
    ##
    "divide-color" => [{ "divide" => SCALE_COLOR.call }],
    ##
    # Outline Style
    # @see https://tailwindcss.com/docs/outline-style
    ##
    "outline-style" => [{ "outline" => [*SCALE_LINE_STYLE.call, "none", "hidden"] }],
    ##
    # Outline Offset
    # @see https://tailwindcss.com/docs/outline-offset
    ##
    "outline-offset" => [{ "outline-offset" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Outline Width
    # @see https://tailwindcss.com/docs/outline-width
    ##
    "outline-w" => [{ "outline" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE_LENGTH, IS_ARBITRARY_LENGTH] }],
    ##
    # Outline Color
    # @see https://tailwindcss.com/docs/outline-color
    ##
    "outline-color" => [{ "outline" => SCALE_COLOR.call }],

    #########
    # Effects
    #########

    ##
    # Box Shadow
    # @see https://tailwindcss.com/docs/box-shadow
    ##
    "shadow" => [
      {
        "shadow" => [
          # Deprecated since Tailwind CSS v4.0.0
          "",
          "none",
          THEME_SHADOW,
          IS_ARBITRARY_VARIABLE_SHADOW,
          IS_ARBITRARY_SHADOW,
        ],
      },
    ],
    ##
    # Box Shadow Color
    # @see https://tailwindcss.com/docs/box-shadow-color
    ##
    "shadow-color" => [{ "shadow" => SCALE_COLOR.call }],
    ##
    # Inset Box Shadow
    # @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow
    ##
    "inset-shadow" => [
      {
        "inset-shadow" => [
          "none",
          THEME_INSET_SHADOW,
          IS_ARBITRARY_VARIABLE_SHADOW,
          IS_ARBITRARY_SHADOW,
        ],
      },
    ],
    ##
    # Inset Box Shadow Color
    # @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color
    ##
    "inset-shadow-color" => [{ "inset-shadow" => SCALE_COLOR.call }],
    ##
    # Ring Width
    # @see https://tailwindcss.com/docs/ring-width
    ##
    "ring-w" => [{ "ring" => SCALE_BORDER_WIDTH.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" => SCALE_COLOR.call }],
    ##
    # Ring Offset Width
    # @see https://v3.tailwindcss.com/docs/ring-offset-width
    # @deprecated since Tailwind CSS v4.0.0
    # @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
    ##
    "ring-offset-w" => [{ "ring-offset" => [IS_NUMBER, IS_ARBITRARY_LENGTH] }],
    ##
    # Ring Offset Color
    # @see https://v3.tailwindcss.com/docs/ring-offset-color
    # @deprecated since Tailwind CSS v4.0.0
    # @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
    ##
    "ring-offset-color" => [{ "ring-offset" => SCALE_COLOR.call }],
    ##
    # Inset Ring Width
    # @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring
    ##
    "inset-ring-w" => [{ "inset-ring" => SCALE_BORDER_WIDTH.call }],
    ##
    # Inset Ring Color
    # @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color
    ##
    "inset-ring-color" => [{ "inset-ring" => SCALE_COLOR.call }],
    ##
    # Text Shadow
    # @see https://tailwindcss.com/docs/text-shadow
    ##
    "text-shadow" => [
      {
        "text-shadow" => [
          "none",
          THEME_TEXT_SHADOW,
          IS_ARBITRARY_VARIABLE_SHADOW,
          IS_ARBITRARY_SHADOW,
        ],
      },
    ],
    ##
    # Text Shadow Color
    # @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color
    ##
    "text-shadow-color" => [{ "text-shadow": SCALE_COLOR.call }],
    ##
    # Opacity
    # @see https://tailwindcss.com/docs/opacity
    ##
    "opacity" => [{ "opacity" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Mix Blend Mode
    # @see https://tailwindcss.com/docs/mix-blend-mode
    ##
    "mix-blend" => [{ "mix-blend" => [*SCALE_BLEND_MODE.call, "plus-darker", "plus-lighter"] }],
    ##
    # Background Blend Mode
    # @see https://tailwindcss.com/docs/background-blend-mode
    ##
    "bg-blend" => [{ "bg-blend" => SCALE_BLEND_MODE.call }],
    ##
    # Mask Clip
    # @see https://tailwindcss.com/docs/mask-clip
    ##
    "mask-clip" => [
      { "mask-clip" => ["border", "padding", "content", "fill", "stroke", "view"] },
      "mask-no-clip",
    ],
    ##
    # Mask Composite
    # @see https://tailwindcss.com/docs/mask-composite
    ##
    "mask-composite" => [{ "mask" => ["add", "subtract", "intersect", "exclude"] }],
    ##
    # Mask Image
    # @see https://tailwindcss.com/docs/mask-image
    ##
    "mask-image-linear-pos" => [{ "mask-linear" => [Validators::IS_NUMBER] }],
    "mask-image-linear-from-pos" => [{ "mask-linear-from": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-linear-to-pos" => [{ "mask-linear-to": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-linear-from-color" => [{ "mask-linear-from": SCALE_COLOR.call }],
    "mask-image-linear-to-color" => [{ "mask-linear-to": SCALE_COLOR.call }],
    "mask-image-t-from-pos" => [{ "mask-t-from": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-t-to-pos" => [{ "mask-t-to": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-t-from-color" => [{ "mask-t-from": SCALE_COLOR.call }],
    "mask-image-t-to-color" => [{ "mask-t-to": SCALE_COLOR.call }],
    "mask-image-r-from-pos" => [{ "mask-r-from": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-r-to-pos" => [{ "mask-r-to": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-r-from-color" => [{ "mask-r-from": SCALE_COLOR.call }],
    "mask-image-r-to-color" => [{ "mask-r-to": SCALE_COLOR.call }],
    "mask-image-b-from-pos" => [{ "mask-b-from": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-b-to-pos" => [{ "mask-b-to": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-b-from-color" => [{ "mask-b-from": SCALE_COLOR.call }],
    "mask-image-b-to-color" => [{ "mask-b-to": SCALE_COLOR.call }],
    "mask-image-l-from-pos" => [{ "mask-l-from": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-l-to-pos" => [{ "mask-l-to": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-l-from-color" => [{ "mask-l-from": SCALE_COLOR.call }],
    "mask-image-l-to-color" => [{ "mask-l-to": SCALE_COLOR.call }],
    "mask-image-x-from-pos" => [{ "mask-x-from": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-x-to-pos" => [{ "mask-x-to": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-x-from-color" => [{ "mask-x-from": SCALE_COLOR.call }],
    "mask-image-x-to-color" => [{ "mask-x-to": SCALE_COLOR.call }],
    "mask-image-y-from-pos" => [{ "mask-y-from": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-y-to-pos" => [{ "mask-y-to": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-y-from-color" => [{ "mask-y-from": SCALE_COLOR.call }],
    "mask-image-y-to-color" => [{ "mask-y-to": SCALE_COLOR.call }],
    "mask-image-radial" => [{ "mask-radial" => [IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    "mask-image-radial-from-pos" => [{ "mask-radial-from": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-radial-to-pos" => [{ "mask-radial-to": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-radial-from-color" => [{ "mask-radial-from": SCALE_COLOR.call }],
    "mask-image-radial-to-color" => [{ "mask-radial-to": SCALE_COLOR.call }],
    "mask-image-radial-shape" => [{ "mask-radial" => ["circle", "ellipse"] }],
    "mask-image-radial-size" => [
      { "mask-radial" => [{ "closest" => ["side", "corner"], "farthest" => ["side", "corner"] }] },
    ],
    "mask-image-radial-pos" => [{ "mask-radial-at": SCALE_POSITION.call }],
    "mask-image-conic-pos" => [{ "mask-conic" => [IS_NUMBER] }],
    "mask-image-conic-from-pos" => [{ "mask-conic-from": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-conic-to-pos" => [{ "mask-conic-to": SCALE_MASK_IMAGE_POSITION.call }],
    "mask-image-conic-from-color" => [{ "mask-conic-from": SCALE_COLOR.call }],
    "mask-image-conic-to-color" => [{ "mask-conic-to": SCALE_COLOR.call }],
    ##
    # Mask Mode
    # @see https://tailwindcss.com/docs/mask-mode
    ##
    "mask-mode" => [{ "mask" => ["alpha", "luminance", "match"] }],
    ##
    # Mask Origin
    # @see https://tailwindcss.com/docs/mask-origin
    ##
    "mask-origin" => [
      { "mask-origin" => ["border", "padding", "content", "fill", "stroke", "view"] },
    ],
    ##
    # Mask Position
    # @see https://tailwindcss.com/docs/mask-position
    ##
    "mask-position" => [{ "mask" => SCALE_BG_POSITION.call }],
    ##
    # Mask Repeat
    # @see https://tailwindcss.com/docs/mask-repeat
    ##
    "mask-repeat" => [{ "mask" => SCALE_BG_REPEAT.call }],
    ##
    # Mask Size
    # @see https://tailwindcss.com/docs/mask-size
    ##
    "mask-size" => [{ "mask" => SCALE_BG_SIZE.call }],
    ##
    # Mask Type
    # @see https://tailwindcss.com/docs/mask-type
    ##
    "mask-type" => [{ "mask-type" => ["alpha", "luminance"] }],
    ##
    # Mask Image
    # @see https://tailwindcss.com/docs/mask-image
    ##
    "mask-image" => [{ "mask" => ["none", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],

    #########
    # Filters
    #########

    ##
    # Filter
    # @deprecated since Tailwind CSS v3.0.0
    # @see https://tailwindcss.com/docs/filter
    ##
    "filter" => [
      {
        "filter" =>
        [
          # Deprecated since Tailwind CSS v3.0.0
          "",
          "none",
          IS_ARBITRARY_VARIABLE,
          IS_ARBITRARY_VALUE,
        ],
      },
    ],
    ##
    # Blur
    # @see https://tailwindcss.com/docs/blur
    ##
    "blur" => [{ "blur" => SCALE_BLUR.call }],
    ##
    # Brightness
    # @see https://tailwindcss.com/docs/brightness
    ##
    "brightness" => [{ "brightness" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Contrast
    # @see https://tailwindcss.com/docs/contrast
    ##
    "contrast" => [{ "contrast" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Drop Shadow
    # @see https://tailwindcss.com/docs/drop-shadow
    ##
    "drop-shadow" => [{
      "drop-shadow" => [
        # Deprecated since Tailwind CSS v4.0.0
        "",
        "none",
        THEME_DROP_SHADOW,
        IS_ARBITRARY_VARIABLE_SHADOW,
        IS_ARBITRARY_SHADOW,
      ],
    }],
    ##
    # Drop Shadow Color
    # @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color
    ##
    "drop-shadow-color" => [{ "drop-shadow": SCALE_COLOR.call }],
    ##
    # Grayscale
    # @see https://tailwindcss.com/docs/grayscale
    ##
    "grayscale" => [{ "grayscale" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Hue Rotate
    # @see https://tailwindcss.com/docs/hue-rotate
    ##
    "hue-rotate" => [{ "hue-rotate" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Invert
    # @see https://tailwindcss.com/docs/invert
    ##
    "invert" => [{ "invert" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Saturate
    # @see https://tailwindcss.com/docs/saturate
    ##
    "saturate" => [{ "saturate" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Sepia
    # @see https://tailwindcss.com/docs/sepia
    ##
    "sepia" => [{ "sepia" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Backdrop Filter
    # @see https://tailwindcss.com/docs/backdrop-filter
    ##
    "backdrop-filter" => [{
      "backdrop-filter" => [
        # Deprecated since Tailwind CSS v3.0.0
        "",
        "none",
        IS_ARBITRARY_VARIABLE,
        IS_ARBITRARY_VALUE,
      ],
    }],
    ##
    # Backdrop Blur
    # @see https://tailwindcss.com/docs/backdrop-blur
    ##
    "backdrop-blur" => [{ "backdrop-blur" => SCALE_BLUR.call }],
    ##
    # Backdrop Brightness
    # @see https://tailwindcss.com/docs/backdrop-brightness
    ##
    "backdrop-brightness" => [{
      "backdrop-brightness" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE],
    }],
    ##
    # Backdrop Contrast
    # @see https://tailwindcss.com/docs/backdrop-contrast
    ##
    "backdrop-contrast" => [{ "backdrop-contrast" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Backdrop Grayscale
    # @see https://tailwindcss.com/docs/backdrop-grayscale
    ##
    "backdrop-grayscale" => [{ "backdrop-grayscale" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Backdrop Hue Rotate
    # @see https://tailwindcss.com/docs/backdrop-hue-rotate
    ##
    "backdrop-hue-rotate" => [{ "backdrop-hue-rotate" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Backdrop Invert
    # @see https://tailwindcss.com/docs/backdrop-invert
    ##
    "backdrop-invert" => [{ "backdrop-invert" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Backdrop Opacity
    # @see https://tailwindcss.com/docs/backdrop-opacity
    ##
    "backdrop-opacity" => [{ "backdrop-opacity" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Backdrop Saturate
    # @see https://tailwindcss.com/docs/backdrop-saturate
    ##
    "backdrop-saturate" => [{ "backdrop-saturate" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Backdrop Sepia
    # @see https://tailwindcss.com/docs/backdrop-sepia
    ##
    "backdrop-sepia" => [{ "backdrop-sepia" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],

    ########
    # 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" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Border Spacing X
    # @see https://tailwindcss.com/docs/border-spacing
    ##
    "border-spacing-x" => [{ "border-spacing-x" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Border Spacing Y
    # @see https://tailwindcss.com/docs/border-spacing
    ##
    "border-spacing-y" => [{ "border-spacing-y" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Table Layout
    # @see https://tailwindcss.com/docs/table-layout
    ##
    "table-layout" => [{ "table" => ["auto", "fixed"] }],
    #
    # Caption Side
    # @see https://tailwindcss.com/docs/caption-side
    #
    "caption" => [{ "caption" => ["top", "bottom"] }],

    #############################
    # Transitions and Animation
    #############################

    # Tranisition Property
    # @see https://tailwindcss.com/docs/transition-property
    ##
    "transition" => [
      {
        "transition" => [
          "",
          "all",
          "colors",
          "opacity",
          "shadow",
          "transform",
          "none",
          IS_ARBITRARY_VARIABLE,
          IS_ARBITRARY_VALUE,
        ],
      },
    ],
    ##
    # Transition Behavior
    # @see https://tailwindcss.com/docs/transition-behavior
    ##
    "transition-behavior" => [{ "transition" => ["normal", "discrete"] }],
    ##
    # Transition Duration
    # @see https://tailwindcss.com/docs/transition-duration
    ##
    "duration" => [{ "duration" => [IS_NUMBER, "initial", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Transition Timing Function
    # @see https://tailwindcss.com/docs/transition-timing-function
    ##
    "ease" => [{ "ease" => ["linear", "initial", THEME_EASE, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Transition Delay
    # @see https://tailwindcss.com/docs/transition-delay
    ##
    "delay" => [{ "delay" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
    ##
    # Animation
    # @see https://tailwindcss.com/docs/animation
    ##
    "animate" => [{ "animate" => ["none", THEME_ANIMATE, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],

    #############
    # Transforms
    #############

    ##
    # Backface Visibility
    # @see https://tailwindcss.com/docs/backface-visibility
    ##
    "backface" => [{ "backface" => ["hidden", "visible"] }],
    ##
    # Perspective
    # @see https://tailwindcss.com/docs/perspective
    ##
    "perspective" => [
      { "perspective" => [THEME_PERSPECTIVE, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] },
    ],
    ##
    # Perspective Origin
    # @see https://tailwindcss.com/docs/perspective-origin
    ##
    "perspective-origin" => [{ "perspective-origin" => SCALE_POSITION_WITH_ARBITRARY.call }],
    ##
    # Rotate
    # @see https://tailwindcss.com/docs/rotate
    ##
    "rotate" => [{ "rotate" => SCALE_ROTATE.call }],
    ##
    # Rotate X
    # @see https://tailwindcss.com/docs/rotate
    ##
    "rotate-x" => [{ "rotate-x": SCALE_ROTATE.call }],
    ##
    # Rotate Y
    # @see https://tailwindcss.com/docs/rotate
    ##
    "rotate-y" => [{ "rotate-y": SCALE_ROTATE.call }],
    ##
    # Rotate Z
    # @see https://tailwindcss.com/docs/rotate
    ##
    "rotate-z" => [{ "rotate-z": SCALE_ROTATE.call }],
    ##
    # Scale
    # @see https://tailwindcss.com/docs/scale
    ##
    "scale" => [{ "scale" => SCALE_SCALE.call }],
    ##
    # Scale X
    # @see https://tailwindcss.com/docs/scale
    ##
    "scale-x" => [{ "scale-x" => SCALE_SCALE.call }],
    ##
    # Scale Y
    # @see https://tailwindcss.com/docs/scale
    ##
    "scale-y" => [{ "scale-y" => SCALE_SCALE.call }],
    ##
    # Scale Z
    # @see https://tailwindcss.com/docs/scale
    ##
    "scale-z" => [{ "scale-z" => SCALE_SCALE.call }],
    ##
    # Scale 3D
    # @see https://tailwindcss.com/docs/scale
    ##
    "scale-3d" => ["scale-3d"],
    ##
    # Skew
    # @see https://tailwindcss.com/docs/skew
    ##
    "skew" => [{ "skew" => SCALE_SKEW.call }],
    ##
    # Skew X
    # @see https://tailwindcss.com/docs/skew
    ##
    "skew-x" => [{ "skew-x": SCALE_SKEW.call }],
    ##
    # Skew Y
    # @see https://tailwindcss.com/docs/skew
    ##
    "skew-y" => [{ "skew-y": SCALE_SKEW.call }],
    # Transform
    # @see https://tailwindcss.com/docs/transform
    ##
    "transform" => [{ "transform" => [IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE, "", "none", "gpu", "cpu"] }],
    ##
    # Transform Origin
    # @see https://tailwindcss.com/docs/transform-origin
    ##
    "transform-origin" => [
      {
        "origin" => SCALE_POSITION_WITH_ARBITRARY.call,
      },
    ],
    ##
    # Transform Style
    # @see https://tailwindcss.com/docs/transform-style
    ##
    "transform-style" => [{ "transform" => ["3d", "flat"] }],
    ##
    # Translate
    # @see https://tailwindcss.com/docs/translate
    ##
    "translate" => [{ "translate" => SCALE_TRANSLATE.call }],
    ##
    # Translate X
    # @see https://tailwindcss.com/docs/translate
    ##
    "translate-x" => [{ "translate-x" => SCALE_TRANSLATE.call }],
    ##
    # Translate Y
    # @see https://tailwindcss.com/docs/translate
    ##
    "translate-y" => [{ "translate-y" => SCALE_TRANSLATE.call }],
    ##
    # Translate Z
    # @see https://tailwindcss.com/docs/translate
    ##
    "translate-z" => [{ "translate-z" => SCALE_TRANSLATE.call }],
    ##
    # Translate None
    # @see https://tailwindcss.com/docs/translate
    ##
    "translate-none" => ["translate-none"],

    ###############
    # Interactivity
    ###############

    ##
    # Accent Color
    # @see https://tailwindcss.com/docs/accent-color
    ##
    "accent" => [{ "accent" => SCALE_COLOR.call }],
    ##
    # Appearance
    # @see https://tailwindcss.com/docs/appearance
    ##
    "appearance" => [{ "appearance" => ["none", "auto"] }],
    ##
    # Caret Color
    # @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
    ##
    "caret-color" => [{ "caret" => SCALE_COLOR.call }],
    ##
    # Color Scheme
    # @see https://tailwindcss.com/docs/color-scheme
    ##
    "color-scheme" => [
      { "scheme" => ["normal", "dark", "light", "light-dark", "only-dark", "only-light"] },
    ],
    ##
    # 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_VARIABLE,
          IS_ARBITRARY_VALUE,
        ],
      },
    ],
    ##
    # Field Sizing
    # @see https://tailwindcss.com/docs/field-sizing
    ##
    "field-sizing" => [{ "field-sizing" => ["fixed", "content"] }],
    ##
    # 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" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Margin X
    # @see https://tailwindcss.com/docs/scroll-margin
    ##
    "scroll-mx" => [{ "scroll-mx" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Margin Y
    # @see https://tailwindcss.com/docs/scroll-margin
    ##
    "scroll-my" => [{ "scroll-my" => SCALE_UNAMBIGUOUS_SPACING.call }],
    #
    # Scroll Margin Start
    # @see https://tailwindcss.com/docs/scroll-margin
    #
    "scroll-ms" => [{ "scroll-ms" => SCALE_UNAMBIGUOUS_SPACING.call }],
    #
    # Scroll Margin End
    # @see https://tailwindcss.com/docs/scroll-margin
    #
    "scroll-me" => [{ "scroll-me" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Margin Top
    # @see https://tailwindcss.com/docs/scroll-margin
    ##
    "scroll-mt" => [{ "scroll-mt" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Margin Right
    # @see https://tailwindcss.com/docs/scroll-margin
    ##
    "scroll-mr" => [{ "scroll-mr" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Margin Bottom
    # @see https://tailwindcss.com/docs/scroll-margin
    ##
    "scroll-mb" => [{ "scroll-mb" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Margin Left
    # @see https://tailwindcss.com/docs/scroll-margin
    ##
    "scroll-ml" => [{ "scroll-ml" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Padding
    # @see https://tailwindcss.com/docs/scroll-padding
    ##
    "scroll-p" => [{ "scroll-p" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Padding X
    # @see https://tailwindcss.com/docs/scroll-padding
    ##
    "scroll-px" => [{ "scroll-px" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Padding Y
    # @see https://tailwindcss.com/docs/scroll-padding
    ##
    "scroll-py" => [{ "scroll-py" => SCALE_UNAMBIGUOUS_SPACING.call }],
    #
    # Scroll Padding Start
    # @see https://tailwindcss.com/docs/scroll-padding
    #
    "scroll-ps" => [{ "scroll-ps" => SCALE_UNAMBIGUOUS_SPACING.call }],
    #
    # Scroll Padding End
    # @see https://tailwindcss.com/docs/scroll-padding
    #
    "scroll-pe" => [{ "scroll-pe" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Padding Top
    # @see https://tailwindcss.com/docs/scroll-padding
    ##
    "scroll-pt" => [{ "scroll-pt" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Padding Right
    # @see https://tailwindcss.com/docs/scroll-padding
    ##
    "scroll-pr" => [{ "scroll-pr" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Padding Bottom
    # @see https://tailwindcss.com/docs/scroll-padding
    ##
    "scroll-pb" => [{ "scroll-pb" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # Scroll Padding Left
    # @see https://tailwindcss.com/docs/scroll-padding
    ##
    "scroll-pl" => [{ "scroll-pl" => SCALE_UNAMBIGUOUS_SPACING.call }],
    ##
    # 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", "manipulation"],
      },
    ],
    ##
    # Touch Action X
    # @see https://tailwindcss.com/docs/touch-action
    ##
    "touch-x" => [
      {
        "touch-pan" => ["x", "left", "right"],
      },
    ],
    ##
    # Touch Action Y
    # @see https://tailwindcss.com/docs/touch-action
    ##
    "touch-y" => [
      {
        "touch-pan" => ["y", "up", "down"],
      },
    ],
    ##
    # Touch Action Pinch Zoom
    # @see https://tailwindcss.com/docs/touch-action
    ##
    "touch-pz" => ["touch-pinch-zoom"],
    ##
    # 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_VARIABLE, IS_ARBITRARY_VALUE] },
    ],

    ######
    # SVG
    ######

    ##
    # Fill
    # @see https://tailwindcss.com/docs/fill
    ##
    "fill" => [{ "fill" => ["none", *SCALE_COLOR.call] }],
    ##
    # Stroke Width
    # @see https://tailwindcss.com/docs/stroke-width
    ##
    "stroke-w" => [{ "stroke" => [IS_NUMBER, IS_ARBITRARY_VARIABLE_LENGTH, IS_ARBITRARY_LENGTH, IS_ARBITRARY_NUMBER] }],
    ##
    # Stroke
    # @see https://tailwindcss.com/docs/stroke
    ##
    "stroke" => [{ "stroke" => ["none", *SCALE_COLOR.call] }],

    ################
    # Accessibility
    ################

    ##
    # Forced Color Adjust
    # @see https://tailwindcss.com/docs/forced-color-adjust
    ##
    "forced-color-adjust" => [{ "forced-color-adjust" => ["auto", "none"] }],
  },
  conflicting_class_groups: {
    "overflow" => ["overflow-x", "overflow-y"],
    "overscroll" => ["overscroll-x", "overscroll-y"],
    "inset" => ["inset-x", "inset-y", "start", "end", "top", "right", "bottom", "left"],
    "inset-x" => ["right", "left"],
    "inset-y" => ["top", "bottom"],
    "flex" => ["basis", "grow", "shrink"],
    "gap" => ["gap-x", "gap-y"],
    "p" => ["px", "py", "ps", "pe", "pt", "pr", "pb", "pl"],
    "px" => ["pr", "pl"],
    "py" => ["pt", "pb"],
    "m" => ["mx", "my", "ms", "me", "mt", "mr", "mb", "ml"],
    "mx" => ["mr", "ml"],
    "my" => ["mt", "mb"],
    "size" => ["w", "h"],
    "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"],
    "line-clamp" => ["display", "overflow"],
    "rounded" => [
      "rounded-s",
      "rounded-e",
      "rounded-t",
      "rounded-r",
      "rounded-b",
      "rounded-l",
      "rounded-ss",
      "rounded-se",
      "rounded-ee",
      "rounded-es",
      "rounded-tl",
      "rounded-tr",
      "rounded-br",
      "rounded-bl",
    ],
    "rounded-s" => ["rounded-ss", "rounded-es"],
    "rounded-e" => ["rounded-se", "rounded-ee"],
    "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-x",
      "border-w-y",
      "border-w-s",
      "border-w-e",
      "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-x",
      "border-color-y",
      "border-color-s",
      "border-color-e",
      "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"],
    "translate" => ["translate-x", "translate-y", "translate-none"],
    "translate-none" => ["translate", "translate-x", "translate-y", "translate-z"],
    "scroll-m" => [
      "scroll-mx",
      "scroll-my",
      "scroll-ms",
      "scroll-me",
      "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-ps",
      "scroll-pe",
      "scroll-pt",
      "scroll-pr",
      "scroll-pb",
      "scroll-pl",
    ],
    "scroll-px" => ["scroll-pr", "scroll-pl"],
    "scroll-py" => ["scroll-pt", "scroll-pb"],
    "touch" => ["touch-x", "touch-y", "touch-pz"],
    "touch-x" => ["touch"],
    "touch-y" => ["touch"],
    "touch-pz" => ["touch"],
  },
  conflicting_class_group_modifiers: {
    "font-size" => ["leading"],
  },
  order_sensitive_modifiers: [
    "*",
    "**",
    "after",
    "backdrop",
    "before",
    "details-content",
    "file",
    "first-letter",
    "first-line",
    "marker",
    "placeholder",
    "selection",
  ],
}.freeze

Constants included from Validators

Validators::ARBITRARY_VALUE_REGEX, Validators::ARBITRARY_VARIABLE_REGEX, Validators::COLOR_FUNCTION_REGEX, Validators::FRACTION_REGEX, Validators::IMAGE_REGEX, Validators::IS_ANY, Validators::IS_ANY_NON_ARBITRARY, Validators::IS_ARBITRARY_IMAGE, Validators::IS_ARBITRARY_LENGTH, Validators::IS_ARBITRARY_NUMBER, Validators::IS_ARBITRARY_POSITION, Validators::IS_ARBITRARY_SHADOW, Validators::IS_ARBITRARY_SIZE, Validators::IS_ARBITRARY_VALUE, Validators::IS_ARBITRARY_VARIABLE, Validators::IS_ARBITRARY_VARIABLE_FAMILY_NAME, Validators::IS_ARBITRARY_VARIABLE_IMAGE, Validators::IS_ARBITRARY_VARIABLE_LENGTH, Validators::IS_ARBITRARY_VARIABLE_POSITION, Validators::IS_ARBITRARY_VARIABLE_SHADOW, Validators::IS_ARBITRARY_VARIABLE_SIZE, Validators::IS_FRACTION, Validators::IS_IMAGE, Validators::IS_INTEGER, Validators::IS_LABEL_FAMILY_NAME, Validators::IS_LABEL_IMAGE, Validators::IS_LABEL_LENGTH, Validators::IS_LABEL_NUMBER, Validators::IS_LABEL_POSITION, Validators::IS_LABEL_SHADOW, Validators::IS_LABEL_SIZE, Validators::IS_LENGTH_ONLY, Validators::IS_NEVER, Validators::IS_NUMBER, Validators::IS_PERCENT, Validators::IS_SHADOW, Validators::IS_TSHIRT_SIZE, Validators::LENGTH_UNIT_REGEX, Validators::SHADOW_REGEX, Validators::TSHIRT_UNIT_REGEX

Instance Method Summary collapse

Methods included from Validators

arbitrary_value?, arbitrary_variable?, integer?, numeric?

Instance Method Details

#merge_config(incoming_config) ⇒ Object



2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
# File 'lib/tailwind_merge/config.rb', line 2267

def merge_config(incoming_config)
  extended_config = TailwindMerge::Config::DEFAULTS.dup

  incoming_theme = incoming_config.delete(:theme) || {}
  # if the incoming config has a theme, we...
  incoming_theme.each_pair do |key, scales|
    # ...add new scales to the existing ones
    extended_config[:theme][key] << ->(klass) {
      scales.include?(klass)
    }
  end

  extended_config.merge(incoming_config)
end