daisyui 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/LICENSE-tailwind_merge.txt +21 -0
  4. data/README.md +58 -0
  5. data/lib/daisy_ui/accordion.rb +32 -28
  6. data/lib/daisy_ui/alert.rb +97 -94
  7. data/lib/daisy_ui/aura.rb +37 -37
  8. data/lib/daisy_ui/avatar.rb +16 -14
  9. data/lib/daisy_ui/badge.rb +159 -156
  10. data/lib/daisy_ui/base.rb +38 -4
  11. data/lib/daisy_ui/button.rb +148 -142
  12. data/lib/daisy_ui/card.rb +57 -54
  13. data/lib/daisy_ui/carousel.rb +36 -32
  14. data/lib/daisy_ui/chat.rb +16 -15
  15. data/lib/daisy_ui/checkbox.rb +95 -93
  16. data/lib/daisy_ui/class_merge/cache.rb +40 -0
  17. data/lib/daisy_ui/class_merge/class_group_utils.rb +139 -0
  18. data/lib/daisy_ui/class_merge/configuration.rb +77 -0
  19. data/lib/daisy_ui/class_merge/daisy_groups.rb +83 -0
  20. data/lib/daisy_ui/class_merge/merger.rb +126 -0
  21. data/lib/daisy_ui/class_merge/parse_class_name.rb +110 -0
  22. data/lib/daisy_ui/class_merge/sort_modifiers.rb +36 -0
  23. data/lib/daisy_ui/class_merge/tailwind_config.rb +2505 -0
  24. data/lib/daisy_ui/class_merge/validators.rb +202 -0
  25. data/lib/daisy_ui/class_merge.rb +47 -0
  26. data/lib/daisy_ui/collapse.rb +32 -28
  27. data/lib/daisy_ui/configurable.rb +31 -3
  28. data/lib/daisy_ui/divider.rb +84 -78
  29. data/lib/daisy_ui/dock.rb +37 -35
  30. data/lib/daisy_ui/dropdown.rb +67 -65
  31. data/lib/daisy_ui/file_input.rb +95 -91
  32. data/lib/daisy_ui/footer.rb +16 -14
  33. data/lib/daisy_ui/indicator.rb +40 -36
  34. data/lib/daisy_ui/input.rb +95 -91
  35. data/lib/daisy_ui/join.rb +16 -14
  36. data/lib/daisy_ui/kbd.rb +37 -35
  37. data/lib/daisy_ui/link.rb +58 -58
  38. data/lib/daisy_ui/loading.rb +85 -81
  39. data/lib/daisy_ui/mask.rb +123 -119
  40. data/lib/daisy_ui/megamenu.rb +53 -50
  41. data/lib/daisy_ui/menu.rb +57 -53
  42. data/lib/daisy_ui/modal.rb +49 -47
  43. data/lib/daisy_ui/otp.rb +95 -93
  44. data/lib/daisy_ui/pagination.rb +16 -14
  45. data/lib/daisy_ui/progress.rb +58 -56
  46. data/lib/daisy_ui/radio.rb +95 -91
  47. data/lib/daisy_ui/range.rb +95 -91
  48. data/lib/daisy_ui/rating.rb +37 -35
  49. data/lib/daisy_ui/select.rb +95 -91
  50. data/lib/daisy_ui/stack.rb +24 -22
  51. data/lib/daisy_ui/stat.rb +16 -14
  52. data/lib/daisy_ui/status.rb +95 -91
  53. data/lib/daisy_ui/steps.rb +16 -14
  54. data/lib/daisy_ui/swap.rb +16 -14
  55. data/lib/daisy_ui/table.rb +41 -39
  56. data/lib/daisy_ui/tabs.rb +80 -77
  57. data/lib/daisy_ui/textarea.rb +95 -91
  58. data/lib/daisy_ui/timeline.rb +16 -14
  59. data/lib/daisy_ui/toast.rb +46 -42
  60. data/lib/daisy_ui/toggle.rb +95 -91
  61. data/lib/daisy_ui/tooltip.rb +113 -106
  62. data/lib/daisy_ui/updated_at.rb +1 -1
  63. data/lib/daisy_ui/version.rb +1 -1
  64. metadata +18 -1
@@ -0,0 +1,2505 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Ported from tailwind_merge 1.5.6 (https://github.com/gjtorikian/tailwind_merge)
4
+ # Copyright (c) 2022 Garen J. Torikian. MIT License, see LICENSE-tailwind_merge.txt.
5
+
6
+ module DaisyUI
7
+ module ClassMerge
8
+ module TailwindConfig
9
+ include Validators
10
+
11
+ class << self
12
+ private
13
+
14
+ # Recursively freezes nested Hash/Array structures so shared config
15
+ # constants can't be mutated in place. Keys are strings/symbols and are
16
+ # already immutable, so only values need walking.
17
+ def deep_freeze(object)
18
+ case object
19
+ when Hash then object.each_value { |value| deep_freeze(value) }
20
+ when Array then object.each { |value| deep_freeze(value) }
21
+ end
22
+ object.freeze
23
+ end
24
+ end
25
+
26
+ THEME_KEYS = %w[
27
+ color
28
+ font
29
+ text
30
+ font-weight
31
+ tracking
32
+ leading
33
+ breakpoint
34
+ container
35
+ spacing
36
+ radius
37
+ shadow
38
+ inset-shadow
39
+ text-shadow
40
+ drop-shadow
41
+ blur
42
+ perspective
43
+ aspect
44
+ ease
45
+ animate
46
+ ].freeze
47
+ THEME_KEYS.each do |key|
48
+ const_set("THEME_#{key.upcase.tr('-', '_')}", lambda { |config|
49
+ config[:theme].fetch(key, nil)
50
+ }
51
+ )
52
+ end
53
+
54
+ MERGED_KEYS = %i[class_groups conflicting_class_groups conflicting_class_group_modifiers].freeze
55
+
56
+ VALID_THEME_IDS = Set.new(THEME_KEYS.map { |theme_key| const_get("THEME_#{theme_key.upcase.tr('-', '_')}").object_id }).freeze
57
+
58
+ SCALE_BREAK = -> { %w[auto avoid all avoid-page page left right column] }
59
+ SCALE_POSITION = lambda {
60
+ [
61
+ "center",
62
+ "top",
63
+ "bottom",
64
+ "left",
65
+ "right",
66
+ "top-left",
67
+ # Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
68
+ "left-top",
69
+ "top-right",
70
+ # Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
71
+ "right-top",
72
+ "bottom-right",
73
+ # Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
74
+ "right-bottom",
75
+ "bottom-left",
76
+ # Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
77
+ "left-bottom"
78
+ ]
79
+ }
80
+ SCALE_POSITION_WITH_ARBITRARY = -> { [*SCALE_POSITION.call, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
81
+ SCALE_OVERFLOW = -> { %w[auto hidden clip visible scroll] }
82
+ SCALE_OVERSCROLL = -> { %w[auto contain none] }
83
+ SCALE_UNAMBIGUOUS_SPACING = -> { [IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE, THEME_SPACING] }
84
+ SCALE_INSET = lambda { |_config|
85
+ [
86
+ IS_FRACTION,
87
+ "full",
88
+ "auto",
89
+ *SCALE_UNAMBIGUOUS_SPACING.call
90
+ ]
91
+ }
92
+
93
+ SCALE_GRID_TEMPLATE_COLS_ROWS = -> { [IS_INTEGER, "none", "subgrid", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
94
+ SCALE_GRID_COL_ROW_START_AND_END = lambda {
95
+ [
96
+ "auto",
97
+ { "span" => ["full", IS_INTEGER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] },
98
+ IS_INTEGER,
99
+ IS_ARBITRARY_VARIABLE,
100
+ IS_ARBITRARY_VALUE
101
+ ]
102
+ }
103
+ SCALE_GRID_COL_ROW_START_OR_END = -> { [IS_INTEGER, "auto", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
104
+ SCALE_GRID_AUTO_COLS_ROWS = -> { ["auto", "min", "max", "fr", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
105
+ SCALE_ALIGN_PRIMARY_AXIS = -> { %w[start end center between around evenly stretch baseline center-safe end-safe] }
106
+ SCALE_ALIGN_SECONDARY_AXIS = -> { %w[start end center stretch center-safe end-safe] }
107
+ SCALE_MARGIN = -> { ["auto", *SCALE_UNAMBIGUOUS_SPACING.call] }
108
+ SCALE_SIZING = lambda {
109
+ [
110
+ IS_FRACTION,
111
+ "auto",
112
+ "full",
113
+ "dvw",
114
+ "dvh",
115
+ "lvw",
116
+ "lvh",
117
+ "svw",
118
+ "svh",
119
+ "min",
120
+ "max",
121
+ "fit",
122
+ *SCALE_UNAMBIGUOUS_SPACING.call
123
+ ]
124
+ }
125
+ SCALE_SIZING_INLINE = lambda {
126
+ [
127
+ THEME_CONTAINER,
128
+ IS_FRACTION,
129
+ "screen",
130
+ "full",
131
+ "dvw",
132
+ "lvw",
133
+ "svw",
134
+ "min",
135
+ "max",
136
+ "fit",
137
+ *SCALE_UNAMBIGUOUS_SPACING.call
138
+ ]
139
+ }
140
+ SCALE_SIZING_BLOCK = lambda {
141
+ [
142
+ IS_FRACTION,
143
+ "screen",
144
+ "full",
145
+ "lh",
146
+ "dvh",
147
+ "lvh",
148
+ "svh",
149
+ "min",
150
+ "max",
151
+ "fit",
152
+ *SCALE_UNAMBIGUOUS_SPACING.call
153
+ ]
154
+ }
155
+ SCALE_COLOR = -> { [THEME_COLOR, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
156
+ SCALE_BG_POSITION = -> { [*SCALE_POSITION.call, IS_ARBITRARY_VARIABLE_POSITION, IS_ARBITRARY_POSITION, { "position" => [IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }] }
157
+ SCALE_BG_REPEAT = -> { ["no-repeat", { "repeat" => ["", "x", "y", "space", "round"] }] }
158
+ SCALE_BG_SIZE = -> { ["auto", "cover", "contain", IS_ARBITRARY_VARIABLE_SIZE, IS_ARBITRARY_SIZE, { "size" => [IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }] }
159
+ SCALE_GRADIENT_STOP_POSITION = -> { [IS_PERCENT, IS_ARBITRARY_VARIABLE_LENGTH, IS_ARBITRARY_LENGTH] }
160
+ SCALE_RADIUS = lambda {
161
+ [
162
+ # Deprecated since Tailwind CSS v4.0.0
163
+ "",
164
+ "none",
165
+ "full",
166
+ THEME_RADIUS,
167
+ IS_ARBITRARY_VARIABLE,
168
+ IS_ARBITRARY_VALUE
169
+ ]
170
+ }
171
+ SCALE_BORDER_WIDTH = -> { ["", IS_NUMBER, IS_ARBITRARY_VARIABLE_LENGTH, IS_ARBITRARY_LENGTH] }
172
+ SCALE_LINE_STYLE = -> { %w[solid dashed dotted double] }
173
+ SCALE_BLEND_MODE = lambda {
174
+ %w[
175
+ normal
176
+ multiply
177
+ screen
178
+ overlay
179
+ darken
180
+ lighten
181
+ color-dodge
182
+ color-burn
183
+ hard-light
184
+ soft-light
185
+ difference
186
+ exclusion
187
+ hue
188
+ saturation
189
+ color
190
+ luminosity
191
+ ]
192
+ }
193
+ SCALE_MASK_IMAGE_POSITION = -> { [IS_NUMBER, IS_PERCENT, IS_ARBITRARY_VARIABLE_POSITION, IS_ARBITRARY_POSITION] }
194
+ SCALE_BLUR = lambda {
195
+ [
196
+ "",
197
+ "none",
198
+ THEME_BLUR,
199
+ IS_ARBITRARY_VARIABLE,
200
+ IS_ARBITRARY_VALUE
201
+ ]
202
+ }
203
+
204
+ SCALE_ROTATE = -> { ["none", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
205
+ SCALE_SCALE = -> { ["none", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
206
+ SCALE_SKEW = -> { [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
207
+ SCALE_TRANSLATE = -> { [IS_FRACTION, "full", *SCALE_UNAMBIGUOUS_SPACING.call] }
208
+
209
+ DEFAULTS = {
210
+ cache_size: 500,
211
+ prefix: nil,
212
+ theme: {
213
+ "animate" => %w[spin ping pulse bounce],
214
+ "aspect" => ["video"],
215
+ "blur" => [IS_TSHIRT_SIZE],
216
+ "breakpoint" => [IS_TSHIRT_SIZE],
217
+ "color" => [IS_ANY],
218
+ "container" => [IS_TSHIRT_SIZE],
219
+ "drop-shadow" => [IS_TSHIRT_SIZE],
220
+ "ease" => %w[in out in-out],
221
+ "font" => [IS_ANY_NON_ARBITRARY],
222
+ "font-weight" => %w[
223
+ thin
224
+ extralight
225
+ light
226
+ normal
227
+ medium
228
+ semibold
229
+ bold
230
+ extrabold
231
+ black
232
+ ],
233
+ "inset-shadow" => [IS_TSHIRT_SIZE],
234
+ "leading" => %w[none tight snug normal relaxed loose],
235
+ "perspective" => %w[dramatic near normal midrange distant none],
236
+ "radius" => [IS_TSHIRT_SIZE],
237
+ "shadow" => [IS_TSHIRT_SIZE],
238
+ "spacing" => ["px", IS_NUMBER],
239
+ "text" => [IS_TSHIRT_SIZE],
240
+ "text-shadow" => [IS_TSHIRT_SIZE],
241
+ "tracking" => %w[tighter tight normal wide wider widest]
242
+ },
243
+ class_groups: {
244
+ ##########
245
+ # Layout
246
+ ##########
247
+
248
+ ##
249
+ # Aspect Ratio
250
+ # @see https://tailwindcss.com/docs/aspect-ratio
251
+ ##
252
+ "aspect" => [
253
+ {
254
+ "aspect" => [
255
+ "auto",
256
+ "square",
257
+ IS_FRACTION,
258
+ IS_ARBITRARY_VALUE,
259
+ IS_ARBITRARY_VARIABLE,
260
+ THEME_ASPECT
261
+ ]
262
+ }
263
+ ],
264
+ ##
265
+ # Container
266
+ # @see https://tailwindcss.com/docs/container
267
+ # @deprecated since Tailwind CSS v4.0.0
268
+ ##
269
+ "container" => ["container"],
270
+ ##
271
+ # Container Type
272
+ # @see https://tailwindcss.com/docs/responsive-design#container-queries
273
+ ##
274
+ "container-type" => [
275
+ { "@container" => ["", "normal", "size", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
276
+ ],
277
+ ##
278
+ # Container Name
279
+ # @see https://tailwindcss.com/docs/responsive-design#named-containers
280
+ ##
281
+ "container-named" => [IS_NAMED_CONTAINER_QUERY],
282
+ ##
283
+ # Columns
284
+ # @see https://tailwindcss.com/docs/columns
285
+ ##
286
+ "columns" => [{ "columns" => [IS_NUMBER, "auto", IS_ARBITRARY_VALUE, IS_ARBITRARY_VARIABLE, THEME_CONTAINER] }],
287
+ ##
288
+ # Break After
289
+ # @see https://tailwindcss.com/docs/break-after
290
+ ##
291
+ "break-after" => [{ "break-after" => SCALE_BREAK.call }],
292
+ ##
293
+ # Break Before
294
+ # @see https://tailwindcss.com/docs/break-before
295
+ ##
296
+ "break-before" => [{ "break-before" => SCALE_BREAK.call }],
297
+ ##
298
+ # Break Inside
299
+ # @see https://tailwindcss.com/docs/break-inside
300
+ ##
301
+ "break-inside" => [{ "break-inside" => %w[auto avoid avoid-page avoid-column] }],
302
+ ##
303
+ # Box Decoration Break
304
+ # @see https://tailwindcss.com/docs/box-decoration-break
305
+ ##
306
+ "box-decoration" => [{ "box-decoration" => %w[slice clone] }],
307
+ ##
308
+ # Box Sizing
309
+ # @see https://tailwindcss.com/docs/box-sizing
310
+ ##
311
+ "box" => [{ "box" => %w[border content] }],
312
+ ##
313
+ # Display
314
+ # @see https://tailwindcss.com/docs/display
315
+ ##
316
+ "display" => %w[
317
+ block
318
+ inline-block
319
+ inline
320
+ flex
321
+ inline-flex
322
+ table
323
+ inline-table
324
+ table-caption
325
+ table-cell
326
+ table-column
327
+ table-column-group
328
+ table-footer-group
329
+ table-header-group
330
+ table-row-group
331
+ table-row
332
+ flow-root
333
+ grid
334
+ inline-grid
335
+ contents
336
+ list-item
337
+ hidden
338
+ ],
339
+ ##
340
+ # Screen Reader Only
341
+ # @see https://tailwindcss.com/docs/display#screen-reader-only
342
+ ##
343
+ "sr" => %w[sr-only not-sr-only],
344
+ ##
345
+ # Floats
346
+ # @see https://tailwindcss.com/docs/float
347
+ ##
348
+ "float" => [{ "float" => %w[right left none start end] }],
349
+ ##
350
+ # Clear
351
+ # @see https://tailwindcss.com/docs/clear
352
+ ##
353
+ "clear" => [{ "clear" => %w[left right both none start end] }],
354
+ ##
355
+ # Isolation
356
+ # @see https://tailwindcss.com/docs/isolation
357
+ ##
358
+ "isolation" => %w[isolate isolation-auto],
359
+ ##
360
+ # Object Fit
361
+ # @see https://tailwindcss.com/docs/object-fit
362
+ ##
363
+ "object-fit" => [{ "object" => %w[contain cover fill none scale-down] }],
364
+ ##
365
+ # Object Position
366
+ # @see https://tailwindcss.com/docs/object-position
367
+ ##
368
+ "object-position" => [{ "object" => SCALE_POSITION_WITH_ARBITRARY.call }],
369
+ ##
370
+ # Overflow
371
+ # @see https://tailwindcss.com/docs/overflow
372
+ ##
373
+ "overflow" => [{ "overflow" => SCALE_OVERFLOW.call }],
374
+ ##
375
+ # Overflow X
376
+ # @see https://tailwindcss.com/docs/overflow
377
+ ##
378
+ "overflow-x" => [{ "overflow-x" => SCALE_OVERFLOW.call }],
379
+ ##
380
+ # Overflow Y
381
+ # @see https://tailwindcss.com/docs/overflow
382
+ ##
383
+ "overflow-y" => [{ "overflow-y" => SCALE_OVERSCROLL.call }],
384
+ ##
385
+ # Overscroll Behavior
386
+ # @see https://tailwindcss.com/docs/overscroll-behavior
387
+ ##
388
+ "overscroll" => [{ "overscroll" => SCALE_OVERSCROLL.call }],
389
+ ##
390
+ # Overscroll Behavior X
391
+ # @see https://tailwindcss.com/docs/overscroll-behavior
392
+ ##
393
+ "overscroll-x" => [{ "overscroll-x" => SCALE_OVERSCROLL.call }],
394
+ ##
395
+ # Overscroll Behavior Y
396
+ # @see https://tailwindcss.com/docs/overscroll-behavior
397
+ ##
398
+ "overscroll-y" => [{ "overscroll-y" => SCALE_OVERSCROLL.call }],
399
+ ##
400
+ # Position
401
+ # @see https://tailwindcss.com/docs/position
402
+ ##
403
+ "position" => %w[static fixed absolute relative sticky],
404
+ ##
405
+ # Top / Right / Bottom / Left
406
+ # @see https://tailwindcss.com/docs/top-right-bottom-left
407
+ ##
408
+ "inset" => [{ "inset" => [SCALE_INSET] }],
409
+ ##
410
+ # Right / Left
411
+ # @see https://tailwindcss.com/docs/top-right-bottom-left
412
+ ##
413
+ "inset-x" => [{ "inset-x" => [SCALE_INSET] }],
414
+ ##
415
+ # Top / Bottom
416
+ # @see https://tailwindcss.com/docs/top-right-bottom-left
417
+ ##
418
+ "inset-y" => [{ "inset-y" => [SCALE_INSET] }],
419
+ #
420
+ # Start
421
+ # @see https://tailwindcss.com/docs/top-right-bottom-left
422
+ #
423
+ "start" => [{ "inset-s" => [SCALE_INSET], "start" => [SCALE_INSET] }],
424
+ #
425
+ # End
426
+ # @see https://tailwindcss.com/docs/top-right-bottom-left
427
+ #
428
+ "end" => [{ "inset-e" => [SCALE_INSET], "end" => [SCALE_INSET] }],
429
+ #
430
+ # Inset Block Start
431
+ # @see https://tailwindcss.com/docs/top-right-bottom-left
432
+ #
433
+ "inset-bs" => [{ "inset-bs" => [SCALE_INSET] }],
434
+ #
435
+ # Inset Block End
436
+ # @see https://tailwindcss.com/docs/top-right-bottom-left
437
+ #
438
+ "inset-be" => [{ "inset-be" => [SCALE_INSET] }],
439
+ ##
440
+ # Top
441
+ # @see https://tailwindcss.com/docs/top-right-bottom-left
442
+ ##
443
+ "top" => [{ "top" => [SCALE_INSET] }],
444
+ ##
445
+ # Right
446
+ # @see https://tailwindcss.com/docs/top-right-bottom-left
447
+ ##
448
+ "right" => [{ "right" => [SCALE_INSET] }],
449
+ ##
450
+ # Bottom
451
+ # @see https://tailwindcss.com/docs/top-right-bottom-left
452
+ ##
453
+ "bottom" => [{ "bottom" => [SCALE_INSET] }],
454
+ ##
455
+ # Left
456
+ # @see https://tailwindcss.com/docs/top-right-bottom-left
457
+ ##
458
+ "left" => [{ "left" => [SCALE_INSET] }],
459
+ ##
460
+ # Visibility
461
+ # @see https://tailwindcss.com/docs/visibility
462
+ ##
463
+ "visibility" => %w[visible invisible collapse],
464
+ ##
465
+ # Z-Index
466
+ # @see https://tailwindcss.com/docs/z-index
467
+ ##
468
+ "z" => [{ "z" => [IS_INTEGER, "auto", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
469
+
470
+ ##########
471
+ # Flexbox and Grid
472
+ ##########
473
+
474
+ # Flex Basis
475
+ # @see https://tailwindcss.com/docs/flex-basis
476
+ ##
477
+ "basis" => [{
478
+ "basis" => [
479
+ IS_FRACTION,
480
+ "full",
481
+ "auto",
482
+ THEME_CONTAINER,
483
+ *SCALE_UNAMBIGUOUS_SPACING.call
484
+ ]
485
+ }],
486
+ ##
487
+ # Flex Direction
488
+ # @see https://tailwindcss.com/docs/flex-direction
489
+ ##
490
+ "flex-direction" => [{ "flex" => %w[row row-reverse col col-reverse] }],
491
+ ##
492
+ # Flex Wrap
493
+ # @see https://tailwindcss.com/docs/flex-wrap
494
+ ##
495
+ "flex-wrap" => [{ "flex" => %w[nowrap wrap wrap-reverse] }],
496
+ ##
497
+ # Flex
498
+ # @see https://tailwindcss.com/docs/flex
499
+ ##
500
+ "flex" => [{ "flex" => [IS_NUMBER, IS_FRACTION, "auto", "initial", "none", Validators::IS_ARBITRARY_VALUE] }],
501
+ ##
502
+ # Flex Grow
503
+ # @see https://tailwindcss.com/docs/flex-grow
504
+ ##
505
+ "grow" => [{ "grow" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
506
+ ##
507
+ # Flex Shrink
508
+ # @see https://tailwindcss.com/docs/flex-shrink
509
+ ##
510
+ "shrink" => [{ "shrink" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
511
+ ##
512
+ # Order
513
+ # @see https://tailwindcss.com/docs/order
514
+ ##
515
+ "order" => [{
516
+ "order" => [
517
+ IS_INTEGER,
518
+ "first",
519
+ "last",
520
+ "none",
521
+ IS_ARBITRARY_VARIABLE,
522
+ IS_ARBITRARY_VALUE
523
+ ]
524
+ }],
525
+ ##
526
+ # Grid Template Columns
527
+ # @see https://tailwindcss.com/docs/grid-template-columns
528
+ ##
529
+ "grid-cols" => [{ "grid-cols" => SCALE_GRID_TEMPLATE_COLS_ROWS.call }],
530
+ ##
531
+ # Grid Column Start / End
532
+ # @see https://tailwindcss.com/docs/grid-column
533
+ ##
534
+ "col-start-end" => [{ "col" => SCALE_GRID_COL_ROW_START_AND_END.call }],
535
+
536
+ ##
537
+ # Grid Column Start
538
+ # @see https://tailwindcss.com/docs/grid-column
539
+ ##
540
+ "col-start" => [{ "col-start" => SCALE_GRID_COL_ROW_START_OR_END.call }],
541
+ ##
542
+ # Grid Column End
543
+ # @see https://tailwindcss.com/docs/grid-column
544
+ ##
545
+ "col-end" => [{ "col-end" => SCALE_GRID_COL_ROW_START_OR_END.call }],
546
+ ##
547
+ # Grid Template Rows
548
+ # @see https://tailwindcss.com/docs/grid-template-rows
549
+ ##
550
+ "grid-rows" => [{ "grid-rows" => SCALE_GRID_TEMPLATE_COLS_ROWS.call }],
551
+ ##
552
+ # Grid Row Start / End
553
+ # @see https://tailwindcss.com/docs/grid-row
554
+ ##
555
+ "row-start-end" => [{ "row" => SCALE_GRID_COL_ROW_START_AND_END.call }],
556
+ ##
557
+ # Grid Row Start
558
+ # @see https://tailwindcss.com/docs/grid-row
559
+ ##
560
+ "row-start" => [{ "row-start" => SCALE_GRID_COL_ROW_START_OR_END.call }],
561
+ ##
562
+ # Grid Row End
563
+ # @see https://tailwindcss.com/docs/grid-row
564
+ ##
565
+ "row-end" => [{ "row-end" => SCALE_GRID_COL_ROW_START_OR_END.call }],
566
+ ##
567
+ # Grid Auto Flow
568
+ # @see https://tailwindcss.com/docs/grid-auto-flow
569
+ ##
570
+ "grid-flow" => [{ "grid-flow" => %w[row col dense row-dense col-dense] }],
571
+ ##
572
+ # Grid Auto Columns
573
+ # @see https://tailwindcss.com/docs/grid-auto-columns
574
+ ##
575
+ "auto-cols" => [{ "auto-cols" => SCALE_GRID_AUTO_COLS_ROWS.call }],
576
+ ##
577
+ # Grid Auto Rows
578
+ # @see https://tailwindcss.com/docs/grid-auto-rows
579
+ ##
580
+ "auto-rows" => [{ "auto-rows" => SCALE_GRID_AUTO_COLS_ROWS.call }],
581
+ ##
582
+ # Gap
583
+ # @see https://tailwindcss.com/docs/gap
584
+ ##
585
+ "gap" => [{ "gap" => SCALE_UNAMBIGUOUS_SPACING.call }],
586
+ ##
587
+ # Gap X
588
+ # @see https://tailwindcss.com/docs/gap
589
+ ##
590
+ "gap-x" => [{ "gap-x" => SCALE_UNAMBIGUOUS_SPACING.call }],
591
+ ##
592
+ # Gap Y
593
+ # @see https://tailwindcss.com/docs/gap
594
+ ##
595
+ "gap-y" => [{ "gap-y" => SCALE_UNAMBIGUOUS_SPACING.call }],
596
+ ##
597
+ # Justify Content
598
+ # @see https://tailwindcss.com/docs/justify-content
599
+ ##
600
+ "justify-content" => [{ "justify" => [*SCALE_ALIGN_PRIMARY_AXIS.call, "normal"] }],
601
+ ##
602
+ # Justify Items
603
+ # @see https://tailwindcss.com/docs/justify-items
604
+ ##
605
+ "justify-items" => [{ "justify-items" => [*SCALE_ALIGN_SECONDARY_AXIS.call, "normal"] }],
606
+ ##
607
+ # Justify Self
608
+ # @see https://tailwindcss.com/docs/justify-self
609
+ ##
610
+ "justify-self" => [{ "justify-self" => ["auto", *SCALE_ALIGN_SECONDARY_AXIS.call] }],
611
+ ##
612
+ # Align Content
613
+ # @see https://tailwindcss.com/docs/align-content
614
+ ##
615
+ "align-content" => [{ "content" => ["normal", *SCALE_ALIGN_PRIMARY_AXIS.call] }],
616
+ ##
617
+ # Align Items
618
+ # @see https://tailwindcss.com/docs/align-items
619
+ ##
620
+ "align-items" => [{ "items" => [*SCALE_ALIGN_SECONDARY_AXIS.call, { "baseline" => ["", "last"] }] }],
621
+ ##
622
+ # Align Self
623
+ # @see https://tailwindcss.com/docs/align-self
624
+ ##
625
+ "align-self" => [{ "self" => ["auto", *SCALE_ALIGN_SECONDARY_AXIS.call, { "baseline" => ["", "last"] }] }],
626
+ ##
627
+ # Place Content
628
+ # @see https://tailwindcss.com/docs/place-content
629
+ ##
630
+ "place-content" => [{ "place-content" => SCALE_ALIGN_PRIMARY_AXIS.call }],
631
+ ##
632
+ # Place Items
633
+ # @see https://tailwindcss.com/docs/place-items
634
+ ##
635
+ "place-items" => [{ "place-items" => [*SCALE_ALIGN_SECONDARY_AXIS.call, "baseline"] }],
636
+ ##
637
+ # Place Self
638
+ # @see https://tailwindcss.com/docs/place-self
639
+ ##
640
+ "place-self" => [{ "place-self" => ["auto", *SCALE_ALIGN_SECONDARY_AXIS.call] }],
641
+ # Spacing
642
+ ##
643
+ # Padding
644
+ # @see https://tailwindcss.com/docs/padding
645
+ ##
646
+ "p" => [{ "p" => SCALE_UNAMBIGUOUS_SPACING.call }],
647
+ ##
648
+ # Padding X
649
+ # @see https://tailwindcss.com/docs/padding
650
+ ##
651
+ "px" => [{ "px" => SCALE_UNAMBIGUOUS_SPACING.call }],
652
+ ##
653
+ # Padding Y
654
+ # @see https://tailwindcss.com/docs/padding
655
+ ##
656
+ "py" => [{ "py" => SCALE_UNAMBIGUOUS_SPACING.call }],
657
+ #
658
+ # Padding Start
659
+ # @see https://tailwindcss.com/docs/padding
660
+ #
661
+ "ps" => [{ "ps" => SCALE_UNAMBIGUOUS_SPACING.call }],
662
+ #
663
+ # Padding End
664
+ # @see https://tailwindcss.com/docs/padding
665
+ #
666
+ "pe" => [{ "pe" => SCALE_UNAMBIGUOUS_SPACING.call }],
667
+ #
668
+ # Padding Block Start
669
+ # @see https://tailwindcss.com/docs/padding
670
+ #
671
+ "pbs" => [{ "pbs" => SCALE_UNAMBIGUOUS_SPACING.call }],
672
+ #
673
+ # Padding Block End
674
+ # @see https://tailwindcss.com/docs/padding
675
+ #
676
+ "pbe" => [{ "pbe" => SCALE_UNAMBIGUOUS_SPACING.call }],
677
+ ##
678
+ # Padding Top
679
+ # @see https://tailwindcss.com/docs/padding
680
+ ##
681
+ "pt" => [{ "pt" => SCALE_UNAMBIGUOUS_SPACING.call }],
682
+ ##
683
+ # Padding Right
684
+ # @see https://tailwindcss.com/docs/padding
685
+ ##
686
+ "pr" => [{ "pr" => SCALE_UNAMBIGUOUS_SPACING.call }],
687
+ ##
688
+ # Padding Bottom
689
+ # @see https://tailwindcss.com/docs/padding
690
+ ##
691
+ "pb" => [{ "pb" => SCALE_UNAMBIGUOUS_SPACING.call }],
692
+ ##
693
+ # Padding Left
694
+ # @see https://tailwindcss.com/docs/padding
695
+ ##
696
+ "pl" => [{ "pl" => SCALE_UNAMBIGUOUS_SPACING.call }],
697
+ ##
698
+ # Margin
699
+ # @see https://tailwindcss.com/docs/margin
700
+ ##
701
+ "m" => [{ "m" => SCALE_MARGIN.call }],
702
+ ##
703
+ # Margin X
704
+ # @see https://tailwindcss.com/docs/margin
705
+ ##
706
+ "mx" => [{ "mx" => SCALE_MARGIN.call }],
707
+ ##
708
+ # Margin Y
709
+ # @see https://tailwindcss.com/docs/margin
710
+ ##
711
+ "my" => [{ "my" => SCALE_MARGIN.call }],
712
+ #
713
+ # Margin Start
714
+ # @see https://tailwindcss.com/docs/margin
715
+ #
716
+ "ms" => [{ "ms" => SCALE_MARGIN.call }],
717
+ #
718
+ # Margin End
719
+ # @see https://tailwindcss.com/docs/margin
720
+ #
721
+ "me" => [{ "me" => SCALE_MARGIN.call }],
722
+ #
723
+ # Margin Block Start
724
+ # @see https://tailwindcss.com/docs/margin
725
+ #
726
+ "mbs" => [{ "mbs" => SCALE_MARGIN.call }],
727
+ #
728
+ # Margin Block End
729
+ # @see https://tailwindcss.com/docs/margin
730
+ #
731
+ "mbe" => [{ "mbe" => SCALE_MARGIN.call }],
732
+ ##
733
+ # Margin Top
734
+ # @see https://tailwindcss.com/docs/margin
735
+ ##
736
+ "mt" => [{ "mt" => SCALE_MARGIN.call }],
737
+ ##
738
+ # Margin Right
739
+ # @see https://tailwindcss.com/docs/margin
740
+ ##
741
+ "mr" => [{ "mr" => SCALE_MARGIN.call }],
742
+ ##
743
+ # Margin Bottom
744
+ # @see https://tailwindcss.com/docs/margin
745
+ ##
746
+ "mb" => [{ "mb" => SCALE_MARGIN.call }],
747
+ ##
748
+ # Margin Left
749
+ # @see https://tailwindcss.com/docs/margin
750
+ ##
751
+ "ml" => [{ "ml" => SCALE_MARGIN.call }],
752
+ ##
753
+ # Space Between X
754
+ # @see https://tailwindcss.com/docs/margin#adding-space-between-children
755
+ ##
756
+ "space-x" => [{ "space-x" => SCALE_UNAMBIGUOUS_SPACING.call }],
757
+ ##
758
+ # Space Between X Reverse
759
+ # @see https://tailwindcss.com/docs/margin#adding-space-between-children
760
+ ##
761
+ "space-x-reverse" => ["space-x-reverse"],
762
+ ##
763
+ # Space Between Y
764
+ # @see https://tailwindcss.com/docs/margin#adding-space-between-children
765
+ ##
766
+ "space-y" => [{ "space-y" => SCALE_UNAMBIGUOUS_SPACING.call }],
767
+ ##
768
+ # Space Between Y Reverse
769
+ # @see https://tailwindcss.com/docs/margin#adding-space-between-children
770
+ ##
771
+ "space-y-reverse" => ["space-y-reverse"],
772
+
773
+ ##########
774
+ # Sizing
775
+ ##########
776
+
777
+ ##
778
+ # Size
779
+ # @see https://tailwindcss.com/docs/width#setting-both-width-and-height
780
+ ##
781
+ "size" => [{ "size" => SCALE_SIZING.call }],
782
+ ##
783
+ # Inline Size
784
+ ##
785
+ "inline-size" => [{ "inline" => ["auto", *SCALE_SIZING_INLINE.call] }],
786
+ ##
787
+ # Min Inline Size
788
+ ##
789
+ "min-inline-size" => [{ "min-inline" => ["auto", *SCALE_SIZING_INLINE.call] }],
790
+ ##
791
+ # Max Inline Size
792
+ ##
793
+ "max-inline-size" => [{ "max-inline" => ["none", *SCALE_SIZING_INLINE.call] }],
794
+ ##
795
+ # Block Size
796
+ ##
797
+ "block-size" => [{ "block" => ["auto", *SCALE_SIZING_BLOCK.call] }],
798
+ ##
799
+ # Min Block Size
800
+ ##
801
+ "min-block-size" => [{ "min-block" => ["auto", *SCALE_SIZING_BLOCK.call] }],
802
+ ##
803
+ # Max Block Size
804
+ ##
805
+ "max-block-size" => [{ "max-block" => ["none", *SCALE_SIZING_BLOCK.call] }],
806
+ # Width
807
+ # @see https://tailwindcss.com/docs/width
808
+ ##
809
+ "w" => [{
810
+ "w" => [
811
+ THEME_CONTAINER, "screen", *SCALE_SIZING.call
812
+ ]
813
+ }],
814
+ ##
815
+ # Min-Width
816
+ # @see https://tailwindcss.com/docs/min-width
817
+ ##
818
+ "min-w" => [{
819
+ "min-w" => [
820
+ THEME_CONTAINER,
821
+ "screen",
822
+ # Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 ##
823
+ "none",
824
+ *SCALE_SIZING.call
825
+ ]
826
+ }],
827
+ ##
828
+ # Max-Width
829
+ # @see https://tailwindcss.com/docs/max-width
830
+ ##
831
+ "max-w" => [
832
+ {
833
+ "max-w" => [
834
+ THEME_CONTAINER,
835
+ "screen",
836
+ "none",
837
+ # Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 ##
838
+ "prose",
839
+ # Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 ##
840
+ { "screen" => [THEME_BREAKPOINT] },
841
+ *SCALE_SIZING.call
842
+ ]
843
+ }
844
+ ],
845
+ ##
846
+ # Height
847
+ # @see https://tailwindcss.com/docs/height
848
+ ##
849
+ "h" => [{ "h" => ["screen", "lh", *SCALE_SIZING.call] }],
850
+ ##
851
+ # Min-Height
852
+ # @see https://tailwindcss.com/docs/min-height
853
+ ##
854
+ "min-h" => [{ "min-h" => ["screen", "none", "lh", *SCALE_SIZING.call] }],
855
+ ##
856
+ # Max-Height
857
+ # @see https://tailwindcss.com/docs/max-height
858
+ ##
859
+ "max-h" => [{ "max-h" => ["screen", "lh", "none", *SCALE_SIZING.call] }],
860
+
861
+ ############
862
+ # Typography
863
+ ############
864
+
865
+ # Font Size
866
+ # @see https://tailwindcss.com/docs/font-size
867
+ ##
868
+ "font-size" => [{ "text" => ["base", THEME_TEXT, IS_ARBITRARY_VARIABLE_LENGTH, IS_ARBITRARY_LENGTH] }],
869
+ ##
870
+ # Font Smoothing
871
+ # @see https://tailwindcss.com/docs/font-smoothing
872
+ ##
873
+ "font-smoothing" => %w[antialiased subpixel-antialiased],
874
+ ##
875
+ # Font Style
876
+ # @see https://tailwindcss.com/docs/font-style
877
+ ##
878
+ "font-style" => %w[italic not-italic],
879
+ ##
880
+ # Font Weight
881
+ # @see https://tailwindcss.com/docs/font-weight
882
+ ##
883
+ "font-weight" => [
884
+ {
885
+ "font" => [
886
+ THEME_FONT_WEIGHT,
887
+ IS_ARBITRARY_VARIABLE_WEIGHT,
888
+ IS_ARBITRARY_WEIGHT
889
+ ]
890
+ }
891
+ ],
892
+ ##
893
+ # Font Stretch
894
+ # @see https://tailwindcss.com/docs/font-stretch
895
+ ##
896
+ "font-stretch" => [
897
+ {
898
+ "font-stretch" => [
899
+ "ultra-condensed",
900
+ "extra-condensed",
901
+ "condensed",
902
+ "semi-condensed",
903
+ "normal",
904
+ "semi-expanded",
905
+ "expanded",
906
+ "extra-expanded",
907
+ "ultra-expanded",
908
+ IS_PERCENT,
909
+ IS_ARBITRARY_VALUE
910
+ ]
911
+ }
912
+ ],
913
+ ##
914
+ # Font Family
915
+ # @see https://tailwindcss.com/docs/font-family
916
+ ##
917
+ "font-family" => [{ "font" => [IS_ARBITRARY_VARIABLE_FAMILY_NAME, IS_ARBITRARY_FAMILY_NAME, THEME_FONT] }],
918
+ ##
919
+ # Font Feature Settings
920
+ ##
921
+ "font-features" => [{ "font-features" => [IS_ARBITRARY_VALUE] }],
922
+ ##
923
+ # Font Variant Numeric
924
+ # @see https://tailwindcss.com/docs/font-variant-numeric
925
+ ##
926
+ "fvn-normal" => ["normal-nums"],
927
+ ##
928
+ # Font Variant Numeric
929
+ # @see https://tailwindcss.com/docs/font-variant-numeric
930
+ ##
931
+ "fvn-ordinal" => ["ordinal"],
932
+ ##
933
+ # Font Variant Numeric
934
+ # @see https://tailwindcss.com/docs/font-variant-numeric
935
+ ##
936
+ "fvn-slashed-zero" => ["slashed-zero"],
937
+ ##
938
+ # Font Variant Numeric
939
+ # @see https://tailwindcss.com/docs/font-variant-numeric
940
+ ##
941
+ "fvn-figure" => %w[lining-nums oldstyle-nums],
942
+ ##
943
+ # Font Variant Numeric
944
+ # @see https://tailwindcss.com/docs/font-variant-numeric
945
+ ##
946
+ "fvn-spacing" => %w[proportional-nums tabular-nums],
947
+ ##
948
+ # Font Variant Numeric
949
+ # @see https://tailwindcss.com/docs/font-variant-numeric
950
+ ##
951
+ "fvn-fraction" => %w[diagonal-fractions stacked-fractions],
952
+ ##
953
+ # Letter Spacing
954
+ # @see https://tailwindcss.com/docs/letter-spacing
955
+ ##
956
+ "tracking" => [
957
+ {
958
+ "tracking" => [THEME_TRACKING, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE]
959
+ }
960
+ ],
961
+ #
962
+ # Line Clamp
963
+ # @see https://tailwindcss.com/docs/line-clamp
964
+ #
965
+ "line-clamp" => [{ "line-clamp" => [IS_NUMBER, "none", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_NUMBER] }],
966
+ ##
967
+ # Line Height
968
+ # @see https://tailwindcss.com/docs/line-height
969
+ ##
970
+ "leading" => [
971
+ {
972
+ "leading" => [
973
+ "none",
974
+ # Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 ##
975
+ THEME_LEADING,
976
+ *SCALE_UNAMBIGUOUS_SPACING.call
977
+ ]
978
+ }
979
+ ],
980
+ #
981
+ # List Style Image
982
+ # @see https://tailwindcss.com/docs/list-style-image
983
+ #
984
+ "list-image" => [{ "list-image" => ["none", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
985
+ # List Style Position
986
+ # @see https://tailwindcss.com/docs/list-style-position
987
+ ##
988
+ "list-style-position" => [{ "list" => %w[inside outside] }],
989
+ ##
990
+ # List Style Type
991
+ # @see https://tailwindcss.com/docs/list-style-type
992
+ ##
993
+ "list-style-type" => [{ "list" => ["disc", "decimal", "none", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
994
+ ##
995
+ # Text Alignment
996
+ # @see https://tailwindcss.com/docs/text-align
997
+ ##
998
+ "text-alignment" => [{ "text" => %w[left center right justify start end] }],
999
+ ##
1000
+ # Placeholder Color
1001
+ # @deprecated since Tailwind CSS v3.0.0
1002
+ # @see https://tailwindcss.com/docs/placeholder-color
1003
+ ##
1004
+ "placeholder-color" => [{ "placeholder" => SCALE_COLOR.call }],
1005
+ ##
1006
+ # Text Color
1007
+ # @see https://tailwindcss.com/docs/text-color
1008
+ ##
1009
+ "text-color" => [{ "text" => SCALE_COLOR.call }],
1010
+ ##
1011
+ # Text Decoration
1012
+ # @see https://tailwindcss.com/docs/text-decoration
1013
+ ##
1014
+ "text-decoration" => %w[underline overline line-through no-underline],
1015
+ ##
1016
+ # Text Decoration Style
1017
+ # @see https://tailwindcss.com/docs/text-decoration-style
1018
+ ##
1019
+ "text-decoration-style" => [{ "decoration" => [*SCALE_LINE_STYLE.call, "wavy"] }],
1020
+ ##
1021
+ # Text Decoration Thickness
1022
+ # @see https://tailwindcss.com/docs/text-decoration-thickness
1023
+ ##
1024
+ "text-decoration-thickness" => [{ "decoration" => [IS_NUMBER, "from-font", "auto", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_LENGTH] }],
1025
+ ##
1026
+ # Text Decoration Color
1027
+ # @see https://tailwindcss.com/docs/text-decoration-color
1028
+ ##
1029
+ "text-decoration-color" => [{ "decoration" => SCALE_COLOR.call }],
1030
+ ##
1031
+ # Text Underline Offset
1032
+ # @see https://tailwindcss.com/docs/text-underline-offset
1033
+ ##
1034
+ "underline-offset" => [{ "underline-offset" => [IS_NUMBER, "auto", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1035
+ ##
1036
+ # Text Transform
1037
+ # @see https://tailwindcss.com/docs/text-transform
1038
+ ##
1039
+ "text-transform" => %w[uppercase lowercase capitalize normal-case],
1040
+ ##
1041
+ # Text Overflow
1042
+ # @see https://tailwindcss.com/docs/text-overflow
1043
+ ##
1044
+ "text-overflow" => %w[truncate text-ellipsis text-clip],
1045
+ ##
1046
+ # Text Wrap
1047
+ # @see https://tailwindcss.com/docs/text-wrap
1048
+ ##
1049
+ "text-wrap" => [{ "text" => %w[wrap nowrap balance pretty] }],
1050
+ ##
1051
+ # Text Indent
1052
+ # @see https://tailwindcss.com/docs/text-indent
1053
+ ##
1054
+ "indent" => [{ "indent" => SCALE_UNAMBIGUOUS_SPACING.call }],
1055
+ ##
1056
+ # Tab Size
1057
+ # @see https://tailwindcss.com/docs/tab-size
1058
+ ##
1059
+ "tab-size" => [{ "tab" => [IS_INTEGER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1060
+ ##
1061
+ # Vertical Alignment
1062
+ # @see https://tailwindcss.com/docs/vertical-align
1063
+ ##
1064
+ "vertical-align" => [
1065
+ {
1066
+ "align" => [
1067
+ "baseline",
1068
+ "top",
1069
+ "middle",
1070
+ "bottom",
1071
+ "text-top",
1072
+ "text-bottom",
1073
+ "sub",
1074
+ "super",
1075
+ IS_ARBITRARY_VARIABLE,
1076
+ IS_ARBITRARY_VALUE
1077
+ ]
1078
+ }
1079
+ ],
1080
+ ##
1081
+ # Whitespace
1082
+ # @see https://tailwindcss.com/docs/whitespace
1083
+ ##
1084
+ "whitespace" => [{ "whitespace" => %w[normal nowrap pre pre-line pre-wrap break-spaces] }],
1085
+ ##
1086
+ # Word Break
1087
+ # @see https://tailwindcss.com/docs/word-break
1088
+ ##
1089
+ "break" => [{ "break" => %w[normal words all keep] }],
1090
+ ##
1091
+ # Overflow Wrap
1092
+ # @see https://tailwindcss.com/docs/overflow-wrap
1093
+ ##
1094
+ "wrap" => [{ "wrap" => %w[break-word anywhere normal] }],
1095
+ #
1096
+ # Hyphens
1097
+ # @see https://tailwindcss.com/docs/hyphens
1098
+ #
1099
+ "hyphens" => [{ "hyphens" => %w[none manual auto] }],
1100
+ ##
1101
+ # Content
1102
+ # @see https://tailwindcss.com/docs/content
1103
+ ##
1104
+ "content" => [{ "content" => ["none", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1105
+
1106
+ #############
1107
+ # Backgrounds
1108
+ #############
1109
+
1110
+ # Background Attachment
1111
+ # @see https://tailwindcss.com/docs/background-attachment
1112
+ ##
1113
+ "bg-attachment" => [{ "bg" => %w[fixed local scroll] }],
1114
+ ##
1115
+ # Background Clip
1116
+ # @see https://tailwindcss.com/docs/background-clip
1117
+ ##
1118
+ "bg-clip" => [{ "bg-clip" => %w[border padding content text] }],
1119
+ ##
1120
+ # Background Origin
1121
+ # @see https://tailwindcss.com/docs/background-origin
1122
+ ##
1123
+ "bg-origin" => [{ "bg-origin" => %w[border padding content] }],
1124
+ ##
1125
+ # Background Position
1126
+ # @see https://tailwindcss.com/docs/background-position
1127
+ ##
1128
+ "bg-position" => [{ "bg" => SCALE_BG_POSITION.call }],
1129
+ ##
1130
+ # Background Repeat
1131
+ # @see https://tailwindcss.com/docs/background-repeat
1132
+ ##
1133
+ "bg-repeat" => [{ "bg" => SCALE_BG_REPEAT.call }],
1134
+ ##
1135
+ # Background Size
1136
+ # @see https://tailwindcss.com/docs/background-size
1137
+ ##
1138
+ "bg-size" => [{ "bg" => SCALE_BG_SIZE.call }],
1139
+ ##
1140
+ # Background Image
1141
+ # @see https://tailwindcss.com/docs/background-image
1142
+ ##
1143
+ "bg-image" => [
1144
+ {
1145
+ "bg" => [
1146
+ "none",
1147
+ {
1148
+ "linear" => [
1149
+ { "to" => %w[t tr r br b bl l tl] },
1150
+ IS_INTEGER,
1151
+ IS_ARBITRARY_VARIABLE,
1152
+ IS_ARBITRARY_VALUE
1153
+ ],
1154
+ "radial" => ["", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE],
1155
+ "conic" => ["", IS_INTEGER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE]
1156
+ },
1157
+ IS_ARBITRARY_VARIABLE_IMAGE,
1158
+ IS_ARBITRARY_IMAGE
1159
+ ]
1160
+ }
1161
+ ],
1162
+ ##
1163
+ # Background Color
1164
+ # @see https://tailwindcss.com/docs/background-color
1165
+ ##
1166
+ "bg-color" => [{ "bg" => SCALE_COLOR.call }],
1167
+ #
1168
+ # Gradient Color Stops From Position
1169
+ # @see https://tailwindcss.com/docs/gradient-color-stops
1170
+ #
1171
+ "gradient-from-pos" => [{ "from" => SCALE_GRADIENT_STOP_POSITION.call }],
1172
+ #
1173
+ # Gradient Color Stops Via Position
1174
+ # @see https://tailwindcss.com/docs/gradient-color-stops
1175
+ #
1176
+ "gradient-via-pos" => [{ "via" => SCALE_GRADIENT_STOP_POSITION.call }],
1177
+ #
1178
+ # Gradient Color Stops To Position
1179
+ # @see https://tailwindcss.com/docs/gradient-color-stops
1180
+ #
1181
+ "gradient-to-pos" => [{ "to" => SCALE_GRADIENT_STOP_POSITION.call }],
1182
+ ##
1183
+ # Gradient Color Stops From
1184
+ # @see https://tailwindcss.com/docs/gradient-color-stops
1185
+ ##
1186
+ "gradient-from" => [{ "from" => SCALE_COLOR.call }],
1187
+ ##
1188
+ # Gradient Color Stops Via
1189
+ # @see https://tailwindcss.com/docs/gradient-color-stops
1190
+ ##
1191
+ "gradient-via" => [{ "via" => SCALE_COLOR.call }],
1192
+ ##
1193
+ # Gradient Color Stops To
1194
+ # @see https://tailwindcss.com/docs/gradient-color-stops
1195
+ ##
1196
+ "gradient-to" => [{ "to" => SCALE_COLOR.call }],
1197
+
1198
+ ###########
1199
+ # Borders
1200
+ ###########
1201
+
1202
+ # Border Radius
1203
+ # @see https://tailwindcss.com/docs/border-radius
1204
+ ##
1205
+ "rounded" => [{ "rounded" => SCALE_RADIUS.call }],
1206
+ #
1207
+ # Border Radius Start
1208
+ # @see https://tailwindcss.com/docs/border-radius
1209
+ #
1210
+ "rounded-s" => [{ "rounded-s" => SCALE_RADIUS.call }],
1211
+ #
1212
+ # Border Radius End
1213
+ # @see https://tailwindcss.com/docs/border-radius
1214
+ #
1215
+ "rounded-e" => [{ "rounded-e" => SCALE_RADIUS.call }],
1216
+ ##
1217
+ # Border Radius Top
1218
+ # @see https://tailwindcss.com/docs/border-radius
1219
+ ##
1220
+ "rounded-t" => [{ "rounded-t" => SCALE_RADIUS.call }],
1221
+ ##
1222
+ # Border Radius Right
1223
+ # @see https://tailwindcss.com/docs/border-radius
1224
+ ##
1225
+ "rounded-r" => [{ "rounded-r" => SCALE_RADIUS.call }],
1226
+ ##
1227
+ # Border Radius Bottom
1228
+ # @see https://tailwindcss.com/docs/border-radius
1229
+ ##
1230
+ "rounded-b" => [{ "rounded-b" => SCALE_RADIUS.call }],
1231
+ ##
1232
+ # Border Radius Left
1233
+ # @see https://tailwindcss.com/docs/border-radius
1234
+ ##
1235
+ "rounded-l" => [{ "rounded-l" => SCALE_RADIUS.call }],
1236
+ #
1237
+ # Border Radius Start Start
1238
+ # @see https://tailwindcss.com/docs/border-radius
1239
+ #
1240
+ "rounded-ss" => [{ "rounded-ss" => SCALE_RADIUS.call }],
1241
+ #
1242
+ # Border Radius Start End
1243
+ # @see https://tailwindcss.com/docs/border-radius
1244
+ #
1245
+ "rounded-se" => [{ "rounded-se" => SCALE_RADIUS.call }],
1246
+ #
1247
+ # Border Radius End End
1248
+ # @see https://tailwindcss.com/docs/border-radius
1249
+ #
1250
+ "rounded-ee" => [{ "rounded-ee" => SCALE_RADIUS.call }],
1251
+ #
1252
+ # Border Radius End Start
1253
+ # @see https://tailwindcss.com/docs/border-radius
1254
+ #
1255
+ "rounded-es" => [{ "rounded-es" => SCALE_RADIUS.call }],
1256
+ ##
1257
+ # Border Radius Top Left
1258
+ # @see https://tailwindcss.com/docs/border-radius
1259
+ ##
1260
+ "rounded-tl" => [{ "rounded-tl" => SCALE_RADIUS.call }],
1261
+ ##
1262
+ # Border Radius Top Right
1263
+ # @see https://tailwindcss.com/docs/border-radius
1264
+ ##
1265
+ "rounded-tr" => [{ "rounded-tr" => SCALE_RADIUS.call }],
1266
+ ##
1267
+ # Border Radius Bottom Right
1268
+ # @see https://tailwindcss.com/docs/border-radius
1269
+ ##
1270
+ "rounded-br" => [{ "rounded-br" => SCALE_RADIUS.call }],
1271
+ ##
1272
+ # Border Radius Bottom Left
1273
+ # @see https://tailwindcss.com/docs/border-radius
1274
+ ##
1275
+ "rounded-bl" => [{ "rounded-bl" => SCALE_RADIUS.call }],
1276
+ ##
1277
+ # Border Width
1278
+ # @see https://tailwindcss.com/docs/border-width
1279
+ ##
1280
+ "border-w" => [{ "border" => SCALE_BORDER_WIDTH.call }],
1281
+ ##
1282
+ # Border Width X
1283
+ # @see https://tailwindcss.com/docs/border-width
1284
+ ##
1285
+ "border-w-x" => [{ "border-x" => SCALE_BORDER_WIDTH.call }],
1286
+ ##
1287
+ # Border Width Y
1288
+ # @see https://tailwindcss.com/docs/border-width
1289
+ ##
1290
+ "border-w-y" => [{ "border-y" => SCALE_BORDER_WIDTH.call }],
1291
+ #
1292
+ # Border Width Start
1293
+ # @see https://tailwindcss.com/docs/border-width
1294
+ #
1295
+ "border-w-s" => [{ "border-s" => SCALE_BORDER_WIDTH.call }],
1296
+ #
1297
+ # Border Width End
1298
+ # @see https://tailwindcss.com/docs/border-width
1299
+ #
1300
+ "border-w-e" => [{ "border-e" => SCALE_BORDER_WIDTH.call }],
1301
+ #
1302
+ # Border Width Block Start
1303
+ # @see https://tailwindcss.com/docs/border-width
1304
+ #
1305
+ "border-w-bs" => [{ "border-bs" => SCALE_BORDER_WIDTH.call }],
1306
+ #
1307
+ # Border Width Block End
1308
+ # @see https://tailwindcss.com/docs/border-width
1309
+ #
1310
+ "border-w-be" => [{ "border-be" => SCALE_BORDER_WIDTH.call }],
1311
+ ##
1312
+ # Border Width Top
1313
+ # @see https://tailwindcss.com/docs/border-width
1314
+ ##
1315
+ "border-w-t" => [{ "border-t" => SCALE_BORDER_WIDTH.call }],
1316
+ ##
1317
+ # Border Width Right
1318
+ # @see https://tailwindcss.com/docs/border-width
1319
+ ##
1320
+ "border-w-r" => [{ "border-r" => SCALE_BORDER_WIDTH.call }],
1321
+ ##
1322
+ # Border Width Bottom
1323
+ # @see https://tailwindcss.com/docs/border-width
1324
+ ##
1325
+ "border-w-b" => [{ "border-b" => SCALE_BORDER_WIDTH.call }],
1326
+ ##
1327
+ # Border Width Left
1328
+ # @see https://tailwindcss.com/docs/border-width
1329
+ ##
1330
+ "border-w-l" => [{ "border-l" => SCALE_BORDER_WIDTH.call }],
1331
+
1332
+ ##
1333
+ # Divide Width X
1334
+ # @see https://tailwindcss.com/docs/border-width#between-children
1335
+ ##
1336
+ "divide-x" => [{ "divide-x" => SCALE_BORDER_WIDTH.call }],
1337
+ ##
1338
+ # Divide Width X Reverse
1339
+ # @see https://tailwindcss.com/docs/divide-width
1340
+ ##
1341
+ "divide-x-reverse" => ["divide-x-reverse"],
1342
+ ##
1343
+ # Divide Width Y
1344
+ # @see https://tailwindcss.com/docs/divide-width
1345
+ ##
1346
+ "divide-y" => [{ "divide-y" => SCALE_BORDER_WIDTH.call }],
1347
+ ##
1348
+ # Divide Width Y Reverse
1349
+ # @see https://tailwindcss.com/docs/divide-width
1350
+ ##
1351
+ "divide-y-reverse" => ["divide-y-reverse"],
1352
+ ##
1353
+ # Border Style
1354
+ # @see https://tailwindcss.com/docs/border-style
1355
+ ##
1356
+ "border-style" => [{ "border" => [*SCALE_LINE_STYLE.call, "hidden", "none"] }],
1357
+ ##
1358
+ # Divide Style
1359
+ # @see https://tailwindcss.com/docs/divide-style
1360
+ ##
1361
+ "divide-style" => [{ "divide" => [*SCALE_LINE_STYLE.call, "hidden", "none"] }],
1362
+ ##
1363
+ # Border Color
1364
+ # @see https://tailwindcss.com/docs/border-color
1365
+ ##
1366
+ "border-color" => [{ "border" => SCALE_COLOR.call }],
1367
+ ##
1368
+ # Border Color X
1369
+ # @see https://tailwindcss.com/docs/border-color
1370
+ ##
1371
+ "border-color-x" => [{ "border-x" => SCALE_COLOR.call }],
1372
+ ##
1373
+ # Border Color Y
1374
+ # @see https://tailwindcss.com/docs/border-color
1375
+ ##
1376
+ "border-color-y" => [{ "border-y" => SCALE_COLOR.call }],
1377
+ ##
1378
+ # Border Color S
1379
+ # @see https://tailwindcss.com/docs/border-color
1380
+ ##
1381
+ "border-color-s" => [{ "border-s" => SCALE_COLOR.call }],
1382
+ ##
1383
+ # Border Color E
1384
+ # @see https://tailwindcss.com/docs/border-color
1385
+ ##
1386
+ "border-color-e" => [{ "border-e" => SCALE_COLOR.call }],
1387
+ #
1388
+ # Border Color Block Start
1389
+ # @see https://tailwindcss.com/docs/border-color
1390
+ #
1391
+ "border-color-bs" => [{ "border-bs" => SCALE_COLOR.call }],
1392
+ #
1393
+ # Border Color Block End
1394
+ # @see https://tailwindcss.com/docs/border-color
1395
+ #
1396
+ "border-color-be" => [{ "border-be" => SCALE_COLOR.call }],
1397
+ ##
1398
+ # Border Color Top
1399
+ # @see https://tailwindcss.com/docs/border-color
1400
+ ##
1401
+ "border-color-t" => [{ "border-t" => SCALE_COLOR.call }],
1402
+ ##
1403
+ # Border Color Right
1404
+ # @see https://tailwindcss.com/docs/border-color
1405
+ ##
1406
+ "border-color-r" => [{ "border-r" => SCALE_COLOR.call }],
1407
+ ##
1408
+ # Border Color Bottom
1409
+ # @see https://tailwindcss.com/docs/border-color
1410
+ ##
1411
+ "border-color-b" => [{ "border-b" => SCALE_COLOR.call }],
1412
+ ##
1413
+ # Border Color Left
1414
+ # @see https://tailwindcss.com/docs/border-color
1415
+ ##
1416
+ "border-color-l" => [{ "border-l" => SCALE_COLOR.call }],
1417
+ ##
1418
+ # Divide Color
1419
+ # @see https://tailwindcss.com/docs/divide-color
1420
+ ##
1421
+ "divide-color" => [{ "divide" => SCALE_COLOR.call }],
1422
+ ##
1423
+ # Outline Style
1424
+ # @see https://tailwindcss.com/docs/outline-style
1425
+ ##
1426
+ "outline-style" => [{ "outline" => [*SCALE_LINE_STYLE.call, "none", "hidden"] }],
1427
+ ##
1428
+ # Outline Offset
1429
+ # @see https://tailwindcss.com/docs/outline-offset
1430
+ ##
1431
+ "outline-offset" => [{ "outline-offset" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1432
+ ##
1433
+ # Outline Width
1434
+ # @see https://tailwindcss.com/docs/outline-width
1435
+ ##
1436
+ "outline-w" => [{ "outline" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE_LENGTH, IS_ARBITRARY_LENGTH] }],
1437
+ ##
1438
+ # Outline Color
1439
+ # @see https://tailwindcss.com/docs/outline-color
1440
+ ##
1441
+ "outline-color" => [{ "outline" => SCALE_COLOR.call }],
1442
+
1443
+ #########
1444
+ # Effects
1445
+ #########
1446
+
1447
+ ##
1448
+ # Box Shadow
1449
+ # @see https://tailwindcss.com/docs/box-shadow
1450
+ ##
1451
+ "shadow" => [
1452
+ {
1453
+ "shadow" => [
1454
+ # Deprecated since Tailwind CSS v4.0.0
1455
+ "",
1456
+ # Deprecated since Tailwind CSS v4.0.0
1457
+ "inner",
1458
+ "none",
1459
+ THEME_SHADOW,
1460
+ IS_ARBITRARY_VARIABLE_SHADOW,
1461
+ IS_ARBITRARY_SHADOW
1462
+ ]
1463
+ }
1464
+ ],
1465
+ ##
1466
+ # Box Shadow Color
1467
+ # @see https://tailwindcss.com/docs/box-shadow-color
1468
+ ##
1469
+ "shadow-color" => [{ "shadow" => SCALE_COLOR.call }],
1470
+ ##
1471
+ # Inset Box Shadow
1472
+ # @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow
1473
+ ##
1474
+ "inset-shadow" => [
1475
+ {
1476
+ "inset-shadow" => [
1477
+ "none",
1478
+ THEME_INSET_SHADOW,
1479
+ IS_ARBITRARY_VARIABLE_SHADOW,
1480
+ IS_ARBITRARY_SHADOW
1481
+ ]
1482
+ }
1483
+ ],
1484
+ ##
1485
+ # Inset Box Shadow Color
1486
+ # @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color
1487
+ ##
1488
+ "inset-shadow-color" => [{ "inset-shadow" => SCALE_COLOR.call }],
1489
+ ##
1490
+ # Ring Width
1491
+ # @see https://tailwindcss.com/docs/ring-width
1492
+ ##
1493
+ "ring-w" => [{ "ring" => SCALE_BORDER_WIDTH.call }],
1494
+ ##
1495
+ # Ring Width Inset
1496
+ # @see https://tailwindcss.com/docs/ring-width
1497
+ ##
1498
+ "ring-w-inset" => ["ring-inset"],
1499
+ ##
1500
+ # Ring Color
1501
+ # @see https://tailwindcss.com/docs/ring-color
1502
+ ##
1503
+ "ring-color" => [{ "ring" => SCALE_COLOR.call }],
1504
+ ##
1505
+ # Ring Offset Width
1506
+ # @see https://v3.tailwindcss.com/docs/ring-offset-width
1507
+ # @deprecated since Tailwind CSS v4.0.0
1508
+ # @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
1509
+ ##
1510
+ "ring-offset-w" => [{ "ring-offset" => [IS_NUMBER, IS_ARBITRARY_LENGTH] }],
1511
+ ##
1512
+ # Ring Offset Color
1513
+ # @see https://v3.tailwindcss.com/docs/ring-offset-color
1514
+ # @deprecated since Tailwind CSS v4.0.0
1515
+ # @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
1516
+ ##
1517
+ "ring-offset-color" => [{ "ring-offset" => SCALE_COLOR.call }],
1518
+ ##
1519
+ # Inset Ring Width
1520
+ # @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring
1521
+ ##
1522
+ "inset-ring-w" => [{ "inset-ring" => SCALE_BORDER_WIDTH.call }],
1523
+ ##
1524
+ # Inset Ring Color
1525
+ # @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color
1526
+ ##
1527
+ "inset-ring-color" => [{ "inset-ring" => SCALE_COLOR.call }],
1528
+ ##
1529
+ # Text Shadow
1530
+ # @see https://tailwindcss.com/docs/text-shadow
1531
+ ##
1532
+ "text-shadow" => [
1533
+ {
1534
+ "text-shadow" => [
1535
+ "none",
1536
+ THEME_TEXT_SHADOW,
1537
+ IS_ARBITRARY_VARIABLE_SHADOW,
1538
+ IS_ARBITRARY_SHADOW
1539
+ ]
1540
+ }
1541
+ ],
1542
+ ##
1543
+ # Text Shadow Color
1544
+ # @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color
1545
+ ##
1546
+ "text-shadow-color" => [{ "text-shadow": SCALE_COLOR.call }],
1547
+ ##
1548
+ # Opacity
1549
+ # @see https://tailwindcss.com/docs/opacity
1550
+ ##
1551
+ "opacity" => [{ "opacity" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1552
+ ##
1553
+ # Mix Blend Mode
1554
+ # @see https://tailwindcss.com/docs/mix-blend-mode
1555
+ ##
1556
+ "mix-blend" => [{ "mix-blend" => [*SCALE_BLEND_MODE.call, "plus-darker", "plus-lighter"] }],
1557
+ ##
1558
+ # Background Blend Mode
1559
+ # @see https://tailwindcss.com/docs/background-blend-mode
1560
+ ##
1561
+ "bg-blend" => [{ "bg-blend" => SCALE_BLEND_MODE.call }],
1562
+ ##
1563
+ # Mask Clip
1564
+ # @see https://tailwindcss.com/docs/mask-clip
1565
+ ##
1566
+ "mask-clip" => [
1567
+ { "mask-clip" => %w[border padding content fill stroke view] },
1568
+ "mask-no-clip"
1569
+ ],
1570
+ ##
1571
+ # Mask Composite
1572
+ # @see https://tailwindcss.com/docs/mask-composite
1573
+ ##
1574
+ "mask-composite" => [{ "mask" => %w[add subtract intersect exclude] }],
1575
+ ##
1576
+ # Mask Image
1577
+ # @see https://tailwindcss.com/docs/mask-image
1578
+ ##
1579
+ "mask-image-linear-pos" => [{ "mask-linear" => [Validators::IS_NUMBER] }],
1580
+ "mask-image-linear-from-pos" => [{ "mask-linear-from": SCALE_MASK_IMAGE_POSITION.call }],
1581
+ "mask-image-linear-to-pos" => [{ "mask-linear-to": SCALE_MASK_IMAGE_POSITION.call }],
1582
+ "mask-image-linear-from-color" => [{ "mask-linear-from": SCALE_COLOR.call }],
1583
+ "mask-image-linear-to-color" => [{ "mask-linear-to": SCALE_COLOR.call }],
1584
+ "mask-image-t-from-pos" => [{ "mask-t-from": SCALE_MASK_IMAGE_POSITION.call }],
1585
+ "mask-image-t-to-pos" => [{ "mask-t-to": SCALE_MASK_IMAGE_POSITION.call }],
1586
+ "mask-image-t-from-color" => [{ "mask-t-from": SCALE_COLOR.call }],
1587
+ "mask-image-t-to-color" => [{ "mask-t-to": SCALE_COLOR.call }],
1588
+ "mask-image-r-from-pos" => [{ "mask-r-from": SCALE_MASK_IMAGE_POSITION.call }],
1589
+ "mask-image-r-to-pos" => [{ "mask-r-to": SCALE_MASK_IMAGE_POSITION.call }],
1590
+ "mask-image-r-from-color" => [{ "mask-r-from": SCALE_COLOR.call }],
1591
+ "mask-image-r-to-color" => [{ "mask-r-to": SCALE_COLOR.call }],
1592
+ "mask-image-b-from-pos" => [{ "mask-b-from": SCALE_MASK_IMAGE_POSITION.call }],
1593
+ "mask-image-b-to-pos" => [{ "mask-b-to": SCALE_MASK_IMAGE_POSITION.call }],
1594
+ "mask-image-b-from-color" => [{ "mask-b-from": SCALE_COLOR.call }],
1595
+ "mask-image-b-to-color" => [{ "mask-b-to": SCALE_COLOR.call }],
1596
+ "mask-image-l-from-pos" => [{ "mask-l-from": SCALE_MASK_IMAGE_POSITION.call }],
1597
+ "mask-image-l-to-pos" => [{ "mask-l-to": SCALE_MASK_IMAGE_POSITION.call }],
1598
+ "mask-image-l-from-color" => [{ "mask-l-from": SCALE_COLOR.call }],
1599
+ "mask-image-l-to-color" => [{ "mask-l-to": SCALE_COLOR.call }],
1600
+ "mask-image-x-from-pos" => [{ "mask-x-from": SCALE_MASK_IMAGE_POSITION.call }],
1601
+ "mask-image-x-to-pos" => [{ "mask-x-to": SCALE_MASK_IMAGE_POSITION.call }],
1602
+ "mask-image-x-from-color" => [{ "mask-x-from": SCALE_COLOR.call }],
1603
+ "mask-image-x-to-color" => [{ "mask-x-to": SCALE_COLOR.call }],
1604
+ "mask-image-y-from-pos" => [{ "mask-y-from": SCALE_MASK_IMAGE_POSITION.call }],
1605
+ "mask-image-y-to-pos" => [{ "mask-y-to": SCALE_MASK_IMAGE_POSITION.call }],
1606
+ "mask-image-y-from-color" => [{ "mask-y-from": SCALE_COLOR.call }],
1607
+ "mask-image-y-to-color" => [{ "mask-y-to": SCALE_COLOR.call }],
1608
+ "mask-image-radial" => [{ "mask-radial" => [IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1609
+ "mask-image-radial-from-pos" => [{ "mask-radial-from": SCALE_MASK_IMAGE_POSITION.call }],
1610
+ "mask-image-radial-to-pos" => [{ "mask-radial-to": SCALE_MASK_IMAGE_POSITION.call }],
1611
+ "mask-image-radial-from-color" => [{ "mask-radial-from": SCALE_COLOR.call }],
1612
+ "mask-image-radial-to-color" => [{ "mask-radial-to": SCALE_COLOR.call }],
1613
+ "mask-image-radial-shape" => [{ "mask-radial" => %w[circle ellipse] }],
1614
+ "mask-image-radial-size" => [
1615
+ { "mask-radial" => [{ "closest" => %w[side corner], "farthest" => %w[side corner] }] }
1616
+ ],
1617
+ "mask-image-radial-pos" => [{ "mask-radial-at": SCALE_POSITION.call }],
1618
+ "mask-image-conic-pos" => [{ "mask-conic" => [IS_NUMBER] }],
1619
+ "mask-image-conic-from-pos" => [{ "mask-conic-from": SCALE_MASK_IMAGE_POSITION.call }],
1620
+ "mask-image-conic-to-pos" => [{ "mask-conic-to": SCALE_MASK_IMAGE_POSITION.call }],
1621
+ "mask-image-conic-from-color" => [{ "mask-conic-from": SCALE_COLOR.call }],
1622
+ "mask-image-conic-to-color" => [{ "mask-conic-to": SCALE_COLOR.call }],
1623
+ ##
1624
+ # Mask Mode
1625
+ # @see https://tailwindcss.com/docs/mask-mode
1626
+ ##
1627
+ "mask-mode" => [{ "mask" => %w[alpha luminance match] }],
1628
+ ##
1629
+ # Mask Origin
1630
+ # @see https://tailwindcss.com/docs/mask-origin
1631
+ ##
1632
+ "mask-origin" => [
1633
+ { "mask-origin" => %w[border padding content fill stroke view] }
1634
+ ],
1635
+ ##
1636
+ # Mask Position
1637
+ # @see https://tailwindcss.com/docs/mask-position
1638
+ ##
1639
+ "mask-position" => [{ "mask" => SCALE_BG_POSITION.call }],
1640
+ ##
1641
+ # Mask Repeat
1642
+ # @see https://tailwindcss.com/docs/mask-repeat
1643
+ ##
1644
+ "mask-repeat" => [{ "mask" => SCALE_BG_REPEAT.call }],
1645
+ ##
1646
+ # Mask Size
1647
+ # @see https://tailwindcss.com/docs/mask-size
1648
+ ##
1649
+ "mask-size" => [{ "mask" => SCALE_BG_SIZE.call }],
1650
+ ##
1651
+ # Mask Type
1652
+ # @see https://tailwindcss.com/docs/mask-type
1653
+ ##
1654
+ "mask-type" => [{ "mask-type" => %w[alpha luminance] }],
1655
+ ##
1656
+ # Mask Image
1657
+ # @see https://tailwindcss.com/docs/mask-image
1658
+ ##
1659
+ "mask-image" => [{ "mask" => ["none", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1660
+
1661
+ #########
1662
+ # Filters
1663
+ #########
1664
+
1665
+ ##
1666
+ # Filter
1667
+ # @deprecated since Tailwind CSS v3.0.0
1668
+ # @see https://tailwindcss.com/docs/filter
1669
+ ##
1670
+ "filter" => [
1671
+ {
1672
+ "filter" =>
1673
+ [
1674
+ # Deprecated since Tailwind CSS v3.0.0
1675
+ "",
1676
+ "none",
1677
+ IS_ARBITRARY_VARIABLE,
1678
+ IS_ARBITRARY_VALUE
1679
+ ]
1680
+ }
1681
+ ],
1682
+ ##
1683
+ # Blur
1684
+ # @see https://tailwindcss.com/docs/blur
1685
+ ##
1686
+ "blur" => [{ "blur" => SCALE_BLUR.call }],
1687
+ ##
1688
+ # Brightness
1689
+ # @see https://tailwindcss.com/docs/brightness
1690
+ ##
1691
+ "brightness" => [{ "brightness" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1692
+ ##
1693
+ # Contrast
1694
+ # @see https://tailwindcss.com/docs/contrast
1695
+ ##
1696
+ "contrast" => [{ "contrast" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1697
+ ##
1698
+ # Drop Shadow
1699
+ # @see https://tailwindcss.com/docs/drop-shadow
1700
+ ##
1701
+ "drop-shadow" => [{
1702
+ "drop-shadow" => [
1703
+ # Deprecated since Tailwind CSS v4.0.0
1704
+ "",
1705
+ "none",
1706
+ THEME_DROP_SHADOW,
1707
+ IS_ARBITRARY_VARIABLE_SHADOW,
1708
+ IS_ARBITRARY_SHADOW
1709
+ ]
1710
+ }],
1711
+ ##
1712
+ # Drop Shadow Color
1713
+ # @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color
1714
+ ##
1715
+ "drop-shadow-color" => [{ "drop-shadow": SCALE_COLOR.call }],
1716
+ ##
1717
+ # Grayscale
1718
+ # @see https://tailwindcss.com/docs/grayscale
1719
+ ##
1720
+ "grayscale" => [{ "grayscale" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1721
+ ##
1722
+ # Hue Rotate
1723
+ # @see https://tailwindcss.com/docs/hue-rotate
1724
+ ##
1725
+ "hue-rotate" => [{ "hue-rotate" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1726
+ ##
1727
+ # Invert
1728
+ # @see https://tailwindcss.com/docs/invert
1729
+ ##
1730
+ "invert" => [{ "invert" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1731
+ ##
1732
+ # Saturate
1733
+ # @see https://tailwindcss.com/docs/saturate
1734
+ ##
1735
+ "saturate" => [{ "saturate" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1736
+ ##
1737
+ # Sepia
1738
+ # @see https://tailwindcss.com/docs/sepia
1739
+ ##
1740
+ "sepia" => [{ "sepia" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1741
+ ##
1742
+ # Backdrop Filter
1743
+ # @see https://tailwindcss.com/docs/backdrop-filter
1744
+ ##
1745
+ "backdrop-filter" => [{
1746
+ "backdrop-filter" => [
1747
+ # Deprecated since Tailwind CSS v3.0.0
1748
+ "",
1749
+ "none",
1750
+ IS_ARBITRARY_VARIABLE,
1751
+ IS_ARBITRARY_VALUE
1752
+ ]
1753
+ }],
1754
+ ##
1755
+ # Backdrop Blur
1756
+ # @see https://tailwindcss.com/docs/backdrop-blur
1757
+ ##
1758
+ "backdrop-blur" => [{ "backdrop-blur" => SCALE_BLUR.call }],
1759
+ ##
1760
+ # Backdrop Brightness
1761
+ # @see https://tailwindcss.com/docs/backdrop-brightness
1762
+ ##
1763
+ "backdrop-brightness" => [{
1764
+ "backdrop-brightness" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE]
1765
+ }],
1766
+ ##
1767
+ # Backdrop Contrast
1768
+ # @see https://tailwindcss.com/docs/backdrop-contrast
1769
+ ##
1770
+ "backdrop-contrast" => [{ "backdrop-contrast" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1771
+ ##
1772
+ # Backdrop Grayscale
1773
+ # @see https://tailwindcss.com/docs/backdrop-grayscale
1774
+ ##
1775
+ "backdrop-grayscale" => [{ "backdrop-grayscale" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1776
+ ##
1777
+ # Backdrop Hue Rotate
1778
+ # @see https://tailwindcss.com/docs/backdrop-hue-rotate
1779
+ ##
1780
+ "backdrop-hue-rotate" => [{ "backdrop-hue-rotate" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1781
+ ##
1782
+ # Backdrop Invert
1783
+ # @see https://tailwindcss.com/docs/backdrop-invert
1784
+ ##
1785
+ "backdrop-invert" => [{ "backdrop-invert" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1786
+ ##
1787
+ # Backdrop Opacity
1788
+ # @see https://tailwindcss.com/docs/backdrop-opacity
1789
+ ##
1790
+ "backdrop-opacity" => [{ "backdrop-opacity" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1791
+ ##
1792
+ # Backdrop Saturate
1793
+ # @see https://tailwindcss.com/docs/backdrop-saturate
1794
+ ##
1795
+ "backdrop-saturate" => [{ "backdrop-saturate" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1796
+ ##
1797
+ # Backdrop Sepia
1798
+ # @see https://tailwindcss.com/docs/backdrop-sepia
1799
+ ##
1800
+ "backdrop-sepia" => [{ "backdrop-sepia" => ["", IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1801
+
1802
+ ########
1803
+ # Tables
1804
+ ########
1805
+
1806
+ # Border Collapse
1807
+ # @see https://tailwindcss.com/docs/border-collapse
1808
+ ##
1809
+ "border-collapse" => [{ "border" => %w[collapse separate] }],
1810
+ ##
1811
+ # Border Spacing
1812
+ # @see https://tailwindcss.com/docs/border-spacing
1813
+ ##
1814
+ "border-spacing" => [{ "border-spacing" => SCALE_UNAMBIGUOUS_SPACING.call }],
1815
+ ##
1816
+ # Border Spacing X
1817
+ # @see https://tailwindcss.com/docs/border-spacing
1818
+ ##
1819
+ "border-spacing-x" => [{ "border-spacing-x" => SCALE_UNAMBIGUOUS_SPACING.call }],
1820
+ ##
1821
+ # Border Spacing Y
1822
+ # @see https://tailwindcss.com/docs/border-spacing
1823
+ ##
1824
+ "border-spacing-y" => [{ "border-spacing-y" => SCALE_UNAMBIGUOUS_SPACING.call }],
1825
+ ##
1826
+ # Table Layout
1827
+ # @see https://tailwindcss.com/docs/table-layout
1828
+ ##
1829
+ "table-layout" => [{ "table" => %w[auto fixed] }],
1830
+ #
1831
+ # Caption Side
1832
+ # @see https://tailwindcss.com/docs/caption-side
1833
+ #
1834
+ "caption" => [{ "caption" => %w[top bottom] }],
1835
+
1836
+ #############################
1837
+ # Transitions and Animation
1838
+ #############################
1839
+
1840
+ # Tranisition Property
1841
+ # @see https://tailwindcss.com/docs/transition-property
1842
+ ##
1843
+ "transition" => [
1844
+ {
1845
+ "transition" => [
1846
+ "",
1847
+ "all",
1848
+ "colors",
1849
+ "opacity",
1850
+ "shadow",
1851
+ "transform",
1852
+ "none",
1853
+ IS_ARBITRARY_VARIABLE,
1854
+ IS_ARBITRARY_VALUE
1855
+ ]
1856
+ }
1857
+ ],
1858
+ ##
1859
+ # Transition Behavior
1860
+ # @see https://tailwindcss.com/docs/transition-behavior
1861
+ ##
1862
+ "transition-behavior" => [{ "transition" => %w[normal discrete] }],
1863
+ ##
1864
+ # Transition Duration
1865
+ # @see https://tailwindcss.com/docs/transition-duration
1866
+ ##
1867
+ "duration" => [{ "duration" => [IS_NUMBER, "initial", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1868
+ ##
1869
+ # Transition Timing Function
1870
+ # @see https://tailwindcss.com/docs/transition-timing-function
1871
+ ##
1872
+ "ease" => [{ "ease" => ["linear", "initial", THEME_EASE, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1873
+ ##
1874
+ # Transition Delay
1875
+ # @see https://tailwindcss.com/docs/transition-delay
1876
+ ##
1877
+ "delay" => [{ "delay" => [IS_NUMBER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1878
+ ##
1879
+ # Animation
1880
+ # @see https://tailwindcss.com/docs/animation
1881
+ ##
1882
+ "animate" => [{ "animate" => ["none", THEME_ANIMATE, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
1883
+
1884
+ #############
1885
+ # Transforms
1886
+ #############
1887
+
1888
+ ##
1889
+ # Backface Visibility
1890
+ # @see https://tailwindcss.com/docs/backface-visibility
1891
+ ##
1892
+ "backface" => [{ "backface" => %w[hidden visible] }],
1893
+ ##
1894
+ # Perspective
1895
+ # @see https://tailwindcss.com/docs/perspective
1896
+ ##
1897
+ "perspective" => [
1898
+ { "perspective" => [THEME_PERSPECTIVE, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
1899
+ ],
1900
+ ##
1901
+ # Perspective Origin
1902
+ # @see https://tailwindcss.com/docs/perspective-origin
1903
+ ##
1904
+ "perspective-origin" => [{ "perspective-origin" => SCALE_POSITION_WITH_ARBITRARY.call }],
1905
+ ##
1906
+ # Rotate
1907
+ # @see https://tailwindcss.com/docs/rotate
1908
+ ##
1909
+ "rotate" => [{ "rotate" => SCALE_ROTATE.call }],
1910
+ ##
1911
+ # Rotate X
1912
+ # @see https://tailwindcss.com/docs/rotate
1913
+ ##
1914
+ "rotate-x" => [{ "rotate-x": SCALE_ROTATE.call }],
1915
+ ##
1916
+ # Rotate Y
1917
+ # @see https://tailwindcss.com/docs/rotate
1918
+ ##
1919
+ "rotate-y" => [{ "rotate-y": SCALE_ROTATE.call }],
1920
+ ##
1921
+ # Rotate Z
1922
+ # @see https://tailwindcss.com/docs/rotate
1923
+ ##
1924
+ "rotate-z" => [{ "rotate-z": SCALE_ROTATE.call }],
1925
+ ##
1926
+ # Scale
1927
+ # @see https://tailwindcss.com/docs/scale
1928
+ ##
1929
+ "scale" => [{ "scale" => SCALE_SCALE.call }],
1930
+ ##
1931
+ # Scale X
1932
+ # @see https://tailwindcss.com/docs/scale
1933
+ ##
1934
+ "scale-x" => [{ "scale-x" => SCALE_SCALE.call }],
1935
+ ##
1936
+ # Scale Y
1937
+ # @see https://tailwindcss.com/docs/scale
1938
+ ##
1939
+ "scale-y" => [{ "scale-y" => SCALE_SCALE.call }],
1940
+ ##
1941
+ # Scale Z
1942
+ # @see https://tailwindcss.com/docs/scale
1943
+ ##
1944
+ "scale-z" => [{ "scale-z" => SCALE_SCALE.call }],
1945
+ ##
1946
+ # Scale 3D
1947
+ # @see https://tailwindcss.com/docs/scale
1948
+ ##
1949
+ "scale-3d" => ["scale-3d"],
1950
+ ##
1951
+ # Skew
1952
+ # @see https://tailwindcss.com/docs/skew
1953
+ ##
1954
+ "skew" => [{ "skew" => SCALE_SKEW.call }],
1955
+ ##
1956
+ # Skew X
1957
+ # @see https://tailwindcss.com/docs/skew
1958
+ ##
1959
+ "skew-x" => [{ "skew-x": SCALE_SKEW.call }],
1960
+ ##
1961
+ # Skew Y
1962
+ # @see https://tailwindcss.com/docs/skew
1963
+ ##
1964
+ "skew-y" => [{ "skew-y": SCALE_SKEW.call }],
1965
+ # Transform
1966
+ # @see https://tailwindcss.com/docs/transform
1967
+ ##
1968
+ "transform" => [{ "transform" => [IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE, "", "none", "gpu", "cpu"] }],
1969
+ ##
1970
+ # Transform Origin
1971
+ # @see https://tailwindcss.com/docs/transform-origin
1972
+ ##
1973
+ "transform-origin" => [
1974
+ {
1975
+ "origin" => SCALE_POSITION_WITH_ARBITRARY.call
1976
+ }
1977
+ ],
1978
+ ##
1979
+ # Transform Style
1980
+ # @see https://tailwindcss.com/docs/transform-style
1981
+ ##
1982
+ "transform-style" => [{ "transform" => %w[3d flat] }],
1983
+ ##
1984
+ # Translate
1985
+ # @see https://tailwindcss.com/docs/translate
1986
+ ##
1987
+ "translate" => [{ "translate" => SCALE_TRANSLATE.call }],
1988
+ ##
1989
+ # Translate X
1990
+ # @see https://tailwindcss.com/docs/translate
1991
+ ##
1992
+ "translate-x" => [{ "translate-x" => SCALE_TRANSLATE.call }],
1993
+ ##
1994
+ # Translate Y
1995
+ # @see https://tailwindcss.com/docs/translate
1996
+ ##
1997
+ "translate-y" => [{ "translate-y" => SCALE_TRANSLATE.call }],
1998
+ ##
1999
+ # Translate Z
2000
+ # @see https://tailwindcss.com/docs/translate
2001
+ ##
2002
+ "translate-z" => [{ "translate-z" => SCALE_TRANSLATE.call }],
2003
+ ##
2004
+ # Translate None
2005
+ # @see https://tailwindcss.com/docs/translate
2006
+ ##
2007
+ "translate-none" => ["translate-none"],
2008
+ ##
2009
+ # Zoom
2010
+ # @see https://tailwindcss.com/docs/zoom
2011
+ ##
2012
+ "zoom" => [{ "zoom" => [IS_INTEGER, IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }],
2013
+
2014
+ ###############
2015
+ # Interactivity
2016
+ ###############
2017
+
2018
+ ##
2019
+ # Accent Color
2020
+ # @see https://tailwindcss.com/docs/accent-color
2021
+ ##
2022
+ "accent" => [{ "accent" => SCALE_COLOR.call }],
2023
+ ##
2024
+ # Appearance
2025
+ # @see https://tailwindcss.com/docs/appearance
2026
+ ##
2027
+ "appearance" => [{ "appearance" => %w[none auto] }],
2028
+ ##
2029
+ # Caret Color
2030
+ # @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
2031
+ ##
2032
+ "caret-color" => [{ "caret" => SCALE_COLOR.call }],
2033
+ ##
2034
+ # Color Scheme
2035
+ # @see https://tailwindcss.com/docs/color-scheme
2036
+ ##
2037
+ "color-scheme" => [
2038
+ { "scheme" => %w[normal dark light light-dark only-dark only-light] }
2039
+ ],
2040
+ ##
2041
+ # Cursor
2042
+ # @see https://tailwindcss.com/docs/cursor
2043
+ ##
2044
+ "cursor" => [
2045
+ {
2046
+ "cursor" => [
2047
+ "auto",
2048
+ "default",
2049
+ "pointer",
2050
+ "wait",
2051
+ "text",
2052
+ "move",
2053
+ "help",
2054
+ "not-allowed",
2055
+ "none",
2056
+ "context-menu",
2057
+ "progress",
2058
+ "cell",
2059
+ "crosshair",
2060
+ "vertical-text",
2061
+ "alias",
2062
+ "copy",
2063
+ "no-drop",
2064
+ "grab",
2065
+ "grabbing",
2066
+ "all-scroll",
2067
+ "col-resize",
2068
+ "row-resize",
2069
+ "n-resize",
2070
+ "e-resize",
2071
+ "s-resize",
2072
+ "w-resize",
2073
+ "ne-resize",
2074
+ "nw-resize",
2075
+ "se-resize",
2076
+ "sw-resize",
2077
+ "ew-resize",
2078
+ "ns-resize",
2079
+ "nesw-resize",
2080
+ "nwse-resize",
2081
+ "zoom-in",
2082
+ "zoom-out",
2083
+ IS_ARBITRARY_VARIABLE,
2084
+ IS_ARBITRARY_VALUE
2085
+ ]
2086
+ }
2087
+ ],
2088
+ ##
2089
+ # Field Sizing
2090
+ # @see https://tailwindcss.com/docs/field-sizing
2091
+ ##
2092
+ "field-sizing" => [{ "field-sizing" => %w[fixed content] }],
2093
+ ##
2094
+ # Pointer Events
2095
+ # @see https://tailwindcss.com/docs/pointer-events
2096
+ ##
2097
+ "pointer-events" => [{ "pointer-events" => %w[none auto] }],
2098
+ ##
2099
+ # Resize
2100
+ # @see https://tailwindcss.com/docs/resize
2101
+ ##
2102
+ "resize" => [{ "resize" => ["none", "", "y", "x"] }],
2103
+ ##
2104
+ # Scroll Behavior
2105
+ # @see https://tailwindcss.com/docs/scroll-behavior
2106
+ ##
2107
+ "scroll-behavior" => [{ "scroll" => %w[auto smooth] }],
2108
+ ##
2109
+ # Scrollbar Thumb Color
2110
+ # @see https://tailwindcss.com/docs/scrollbar-color
2111
+ ##
2112
+ "scrollbar-thumb-color" => [{ "scrollbar-thumb" => SCALE_COLOR.call }],
2113
+ ##
2114
+ # Scrollbar Track Color
2115
+ # @see https://tailwindcss.com/docs/scrollbar-color
2116
+ ##
2117
+ "scrollbar-track-color" => [{ "scrollbar-track" => SCALE_COLOR.call }],
2118
+ ##
2119
+ # Scrollbar Gutter
2120
+ # @see https://tailwindcss.com/docs/scrollbar-gutter
2121
+ ##
2122
+ "scrollbar-gutter" => [{ "scrollbar-gutter" => %w[auto stable both] }],
2123
+ ##
2124
+ # Scrollbar Width
2125
+ # @see https://tailwindcss.com/docs/scrollbar-width
2126
+ ##
2127
+ "scrollbar-w" => [{ "scrollbar" => %w[auto thin none] }],
2128
+ ##
2129
+ # Scroll Margin
2130
+ # @see https://tailwindcss.com/docs/scroll-margin
2131
+ ##
2132
+ "scroll-m" => [{ "scroll-m" => SCALE_UNAMBIGUOUS_SPACING.call }],
2133
+ ##
2134
+ # Scroll Margin X
2135
+ # @see https://tailwindcss.com/docs/scroll-margin
2136
+ ##
2137
+ "scroll-mx" => [{ "scroll-mx" => SCALE_UNAMBIGUOUS_SPACING.call }],
2138
+ ##
2139
+ # Scroll Margin Y
2140
+ # @see https://tailwindcss.com/docs/scroll-margin
2141
+ ##
2142
+ "scroll-my" => [{ "scroll-my" => SCALE_UNAMBIGUOUS_SPACING.call }],
2143
+ #
2144
+ # Scroll Margin Start
2145
+ # @see https://tailwindcss.com/docs/scroll-margin
2146
+ #
2147
+ "scroll-ms" => [{ "scroll-ms" => SCALE_UNAMBIGUOUS_SPACING.call }],
2148
+ #
2149
+ # Scroll Margin End
2150
+ # @see https://tailwindcss.com/docs/scroll-margin
2151
+ #
2152
+ "scroll-me" => [{ "scroll-me" => SCALE_UNAMBIGUOUS_SPACING.call }],
2153
+ #
2154
+ # Scroll Margin Block Start
2155
+ # @see https://tailwindcss.com/docs/scroll-margin
2156
+ #
2157
+ "scroll-mbs" => [{ "scroll-mbs" => SCALE_UNAMBIGUOUS_SPACING.call }],
2158
+ #
2159
+ # Scroll Margin Block End
2160
+ # @see https://tailwindcss.com/docs/scroll-margin
2161
+ #
2162
+ "scroll-mbe" => [{ "scroll-mbe" => SCALE_UNAMBIGUOUS_SPACING.call }],
2163
+ ##
2164
+ # Scroll Margin Top
2165
+ # @see https://tailwindcss.com/docs/scroll-margin
2166
+ ##
2167
+ "scroll-mt" => [{ "scroll-mt" => SCALE_UNAMBIGUOUS_SPACING.call }],
2168
+ ##
2169
+ # Scroll Margin Right
2170
+ # @see https://tailwindcss.com/docs/scroll-margin
2171
+ ##
2172
+ "scroll-mr" => [{ "scroll-mr" => SCALE_UNAMBIGUOUS_SPACING.call }],
2173
+ ##
2174
+ # Scroll Margin Bottom
2175
+ # @see https://tailwindcss.com/docs/scroll-margin
2176
+ ##
2177
+ "scroll-mb" => [{ "scroll-mb" => SCALE_UNAMBIGUOUS_SPACING.call }],
2178
+ ##
2179
+ # Scroll Margin Left
2180
+ # @see https://tailwindcss.com/docs/scroll-margin
2181
+ ##
2182
+ "scroll-ml" => [{ "scroll-ml" => SCALE_UNAMBIGUOUS_SPACING.call }],
2183
+ ##
2184
+ # Scroll Padding
2185
+ # @see https://tailwindcss.com/docs/scroll-padding
2186
+ ##
2187
+ "scroll-p" => [{ "scroll-p" => SCALE_UNAMBIGUOUS_SPACING.call }],
2188
+ ##
2189
+ # Scroll Padding X
2190
+ # @see https://tailwindcss.com/docs/scroll-padding
2191
+ ##
2192
+ "scroll-px" => [{ "scroll-px" => SCALE_UNAMBIGUOUS_SPACING.call }],
2193
+ ##
2194
+ # Scroll Padding Y
2195
+ # @see https://tailwindcss.com/docs/scroll-padding
2196
+ ##
2197
+ "scroll-py" => [{ "scroll-py" => SCALE_UNAMBIGUOUS_SPACING.call }],
2198
+ #
2199
+ # Scroll Padding Start
2200
+ # @see https://tailwindcss.com/docs/scroll-padding
2201
+ #
2202
+ "scroll-ps" => [{ "scroll-ps" => SCALE_UNAMBIGUOUS_SPACING.call }],
2203
+ #
2204
+ # Scroll Padding End
2205
+ # @see https://tailwindcss.com/docs/scroll-padding
2206
+ #
2207
+ "scroll-pe" => [{ "scroll-pe" => SCALE_UNAMBIGUOUS_SPACING.call }],
2208
+ #
2209
+ # Scroll Padding Block Start
2210
+ # @see https://tailwindcss.com/docs/scroll-padding
2211
+ #
2212
+ "scroll-pbs" => [{ "scroll-pbs" => SCALE_UNAMBIGUOUS_SPACING.call }],
2213
+ #
2214
+ # Scroll Padding Block End
2215
+ # @see https://tailwindcss.com/docs/scroll-padding
2216
+ #
2217
+ "scroll-pbe" => [{ "scroll-pbe" => SCALE_UNAMBIGUOUS_SPACING.call }],
2218
+ ##
2219
+ # Scroll Padding Top
2220
+ # @see https://tailwindcss.com/docs/scroll-padding
2221
+ ##
2222
+ "scroll-pt" => [{ "scroll-pt" => SCALE_UNAMBIGUOUS_SPACING.call }],
2223
+ ##
2224
+ # Scroll Padding Right
2225
+ # @see https://tailwindcss.com/docs/scroll-padding
2226
+ ##
2227
+ "scroll-pr" => [{ "scroll-pr" => SCALE_UNAMBIGUOUS_SPACING.call }],
2228
+ ##
2229
+ # Scroll Padding Bottom
2230
+ # @see https://tailwindcss.com/docs/scroll-padding
2231
+ ##
2232
+ "scroll-pb" => [{ "scroll-pb" => SCALE_UNAMBIGUOUS_SPACING.call }],
2233
+ ##
2234
+ # Scroll Padding Left
2235
+ # @see https://tailwindcss.com/docs/scroll-padding
2236
+ ##
2237
+ "scroll-pl" => [{ "scroll-pl" => SCALE_UNAMBIGUOUS_SPACING.call }],
2238
+ ##
2239
+ # Scroll Snap Align
2240
+ # @see https://tailwindcss.com/docs/scroll-snap-align
2241
+ ##
2242
+ "snap-align" => [{ "snap" => %w[start end center align-none] }],
2243
+ ##
2244
+ # Scroll Snap Stop
2245
+ # @see https://tailwindcss.com/docs/scroll-snap-stop
2246
+ ##
2247
+ "snap-stop" => [{ "snap" => %w[normal always] }],
2248
+ ##
2249
+ # Scroll Snap Type
2250
+ # @see https://tailwindcss.com/docs/scroll-snap-type
2251
+ ##
2252
+ "snap-type" => [{ "snap" => %w[none x y both] }],
2253
+ ##
2254
+ # Scroll Snap Type Strictness
2255
+ # @see https://tailwindcss.com/docs/scroll-snap-type
2256
+ ##
2257
+ "snap-strictness" => [{ "snap" => %w[mandatory proximity] }],
2258
+ ##
2259
+ # Touch Action
2260
+ # @see https://tailwindcss.com/docs/touch-action
2261
+ ##
2262
+ "touch" => [
2263
+ {
2264
+ "touch" => %w[auto none manipulation]
2265
+ }
2266
+ ],
2267
+ ##
2268
+ # Touch Action X
2269
+ # @see https://tailwindcss.com/docs/touch-action
2270
+ ##
2271
+ "touch-x" => [
2272
+ {
2273
+ "touch-pan" => %w[x left right]
2274
+ }
2275
+ ],
2276
+ ##
2277
+ # Touch Action Y
2278
+ # @see https://tailwindcss.com/docs/touch-action
2279
+ ##
2280
+ "touch-y" => [
2281
+ {
2282
+ "touch-pan" => %w[y up down]
2283
+ }
2284
+ ],
2285
+ ##
2286
+ # Touch Action Pinch Zoom
2287
+ # @see https://tailwindcss.com/docs/touch-action
2288
+ ##
2289
+ "touch-pz" => ["touch-pinch-zoom"],
2290
+ ##
2291
+ # User Select
2292
+ # @see https://tailwindcss.com/docs/user-select
2293
+ ##
2294
+ "select" => [{ "select" => %w[none text all auto] }],
2295
+ ##
2296
+ # Will Change
2297
+ # @see https://tailwindcss.com/docs/will-change
2298
+ ##
2299
+ "will-change" => [
2300
+ { "will-change" => ["auto", "scroll", "contents", "transform", IS_ARBITRARY_VARIABLE, IS_ARBITRARY_VALUE] }
2301
+ ],
2302
+
2303
+ ######
2304
+ # SVG
2305
+ ######
2306
+
2307
+ ##
2308
+ # Fill
2309
+ # @see https://tailwindcss.com/docs/fill
2310
+ ##
2311
+ "fill" => [{ "fill" => ["none", *SCALE_COLOR.call] }],
2312
+ ##
2313
+ # Stroke Width
2314
+ # @see https://tailwindcss.com/docs/stroke-width
2315
+ ##
2316
+ "stroke-w" => [{ "stroke" => [IS_NUMBER, IS_ARBITRARY_VARIABLE_LENGTH, IS_ARBITRARY_LENGTH, IS_ARBITRARY_NUMBER] }],
2317
+ ##
2318
+ # Stroke
2319
+ # @see https://tailwindcss.com/docs/stroke
2320
+ ##
2321
+ "stroke" => [{ "stroke" => ["none", *SCALE_COLOR.call] }],
2322
+
2323
+ ################
2324
+ # Accessibility
2325
+ ################
2326
+
2327
+ ##
2328
+ # Forced Color Adjust
2329
+ # @see https://tailwindcss.com/docs/forced-color-adjust
2330
+ ##
2331
+ "forced-color-adjust" => [{ "forced-color-adjust" => %w[auto none] }]
2332
+ },
2333
+ conflicting_class_groups: {
2334
+ "container-named" => ["container-type"],
2335
+ "overflow" => %w[overflow-x overflow-y],
2336
+ "overscroll" => %w[overscroll-x overscroll-y],
2337
+ "inset" => %w[inset-x inset-y start end inset-bs inset-be top right bottom left],
2338
+ "inset-x" => %w[start end right left],
2339
+ "inset-y" => %w[inset-bs inset-be top bottom],
2340
+ "flex" => %w[basis grow shrink],
2341
+ "gap" => %w[gap-x gap-y],
2342
+ "p" => %w[px py ps pe pbs pbe pt pr pb pl],
2343
+ "px" => %w[ps pe pr pl],
2344
+ "py" => %w[pbs pbe pt pb],
2345
+ "m" => %w[mx my ms me mbs mbe mt mr mb ml],
2346
+ "mx" => %w[ms me mr ml],
2347
+ "my" => %w[mbs mbe mt mb],
2348
+ "size" => %w[w h],
2349
+ "font-size" => ["leading"],
2350
+ "fvn-normal" => %w[
2351
+ fvn-ordinal
2352
+ fvn-slashed-zero
2353
+ fvn-figure
2354
+ fvn-spacing
2355
+ fvn-fraction
2356
+ ],
2357
+ "fvn-ordinal" => ["fvn-normal"],
2358
+ "fvn-slashed-zero" => ["fvn-normal"],
2359
+ "fvn-figure" => ["fvn-normal"],
2360
+ "fvn-spacing" => ["fvn-normal"],
2361
+ "fvn-fraction" => ["fvn-normal"],
2362
+ "line-clamp" => %w[display overflow],
2363
+ "rounded" => %w[
2364
+ rounded-s
2365
+ rounded-e
2366
+ rounded-t
2367
+ rounded-r
2368
+ rounded-b
2369
+ rounded-l
2370
+ rounded-ss
2371
+ rounded-se
2372
+ rounded-ee
2373
+ rounded-es
2374
+ rounded-tl
2375
+ rounded-tr
2376
+ rounded-br
2377
+ rounded-bl
2378
+ ],
2379
+ "rounded-s" => %w[rounded-ss rounded-es],
2380
+ "rounded-e" => %w[rounded-se rounded-ee],
2381
+ "rounded-t" => %w[rounded-tl rounded-tr],
2382
+ "rounded-r" => %w[rounded-tr rounded-br],
2383
+ "rounded-b" => %w[rounded-br rounded-bl],
2384
+ "rounded-l" => %w[rounded-tl rounded-bl],
2385
+ "border-spacing" => %w[border-spacing-x border-spacing-y],
2386
+ "border-w" => [
2387
+ "border-w-x",
2388
+ "border-w-y",
2389
+ "border-w-s",
2390
+ "border-w-e",
2391
+ "border-w-bs",
2392
+ "border-w-be",
2393
+ "border-w-t",
2394
+ "border-w-r",
2395
+ "border-w-b",
2396
+ "border-w-l"
2397
+ ],
2398
+ "border-w-x" => ["border-w-s", "border-w-e", "border-w-r", "border-w-l"],
2399
+ "border-w-y" => ["border-w-bs", "border-w-be", "border-w-t", "border-w-b"],
2400
+ "border-color" => %w[
2401
+ border-color-x
2402
+ border-color-y
2403
+ border-color-s
2404
+ border-color-e
2405
+ border-color-bs
2406
+ border-color-be
2407
+ border-color-t
2408
+ border-color-r
2409
+ border-color-b
2410
+ border-color-l
2411
+ ],
2412
+ "border-color-x" => %w[border-color-s border-color-e border-color-r border-color-l],
2413
+ "border-color-y" => %w[border-color-bs border-color-be border-color-t border-color-b],
2414
+ "translate" => %w[translate-x translate-y translate-none],
2415
+ "translate-none" => %w[translate translate-x translate-y translate-z],
2416
+ "scroll-m" => %w[
2417
+ scroll-mx
2418
+ scroll-my
2419
+ scroll-ms
2420
+ scroll-me
2421
+ scroll-mbs
2422
+ scroll-mbe
2423
+ scroll-mt
2424
+ scroll-mr
2425
+ scroll-mb
2426
+ scroll-ml
2427
+ ],
2428
+ "scroll-mx" => %w[scroll-ms scroll-me scroll-mr scroll-ml],
2429
+ "scroll-my" => %w[scroll-mbs scroll-mbe scroll-mt scroll-mb],
2430
+ "scroll-p" => %w[
2431
+ scroll-px
2432
+ scroll-py
2433
+ scroll-ps
2434
+ scroll-pe
2435
+ scroll-pbs
2436
+ scroll-pbe
2437
+ scroll-pt
2438
+ scroll-pr
2439
+ scroll-pb
2440
+ scroll-pl
2441
+ ],
2442
+ "scroll-px" => %w[scroll-ps scroll-pe scroll-pr scroll-pl],
2443
+ "scroll-py" => %w[scroll-pbs scroll-pbe scroll-pt scroll-pb],
2444
+ "touch" => %w[touch-x touch-y touch-pz],
2445
+ "touch-x" => ["touch"],
2446
+ "touch-y" => ["touch"],
2447
+ "touch-pz" => ["touch"]
2448
+ },
2449
+ conflicting_class_group_modifiers: {
2450
+ "font-size" => ["leading"]
2451
+ },
2452
+ postfix_lookup_class_groups: ["container-type"],
2453
+ order_sensitive_modifiers: [
2454
+ "*",
2455
+ "**",
2456
+ "after",
2457
+ "backdrop",
2458
+ "before",
2459
+ "details-content",
2460
+ "file",
2461
+ "first-letter",
2462
+ "first-line",
2463
+ "marker",
2464
+ "placeholder",
2465
+ "selection"
2466
+ ]
2467
+ }.freeze
2468
+ deep_freeze(DEFAULTS)
2469
+
2470
+ # Extends DEFAULTS with incoming_config without mutating either.
2471
+ # Theme scales are appended. Unlike upstream, `class_groups` and
2472
+ # `conflicting_class_groups` are merged into the defaults (entries for an
2473
+ # existing group are appended) instead of replacing them wholesale. Every
2474
+ # other key replaces the default.
2475
+ def merge_config(incoming_config)
2476
+ extended_config = TailwindConfig::DEFAULTS.dup
2477
+ extended_config[:theme] = TailwindConfig::DEFAULTS[:theme].dup
2478
+
2479
+ incoming_theme = incoming_config.fetch(:theme, nil) || {}
2480
+ # if the incoming config has a theme, we...
2481
+ incoming_theme.each_pair do |key, scales|
2482
+ # ...add new scales to the existing ones
2483
+ extended_config[:theme][key] = (extended_config[:theme][key] || []).dup
2484
+ extended_config[:theme][key] << lambda { |klass|
2485
+ scales.include?(klass)
2486
+ }
2487
+ end
2488
+
2489
+ MERGED_KEYS.each do |key|
2490
+ next unless incoming_config.key?(key)
2491
+
2492
+ extended_config[key] = merge_groups(extended_config[key], incoming_config[key])
2493
+ end
2494
+
2495
+ extended_config.merge(incoming_config.reject { |key, _| key == :theme || MERGED_KEYS.include?(key) })
2496
+ end
2497
+
2498
+ private
2499
+
2500
+ def merge_groups(defaults, incoming)
2501
+ defaults.merge(incoming) { |_group, existing, added| existing + added }
2502
+ end
2503
+ end
2504
+ end
2505
+ end