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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +45 -0
- data/LICENSE-tailwind_merge.txt +21 -0
- data/README.md +58 -0
- data/lib/daisy_ui/accordion.rb +32 -28
- data/lib/daisy_ui/alert.rb +97 -94
- data/lib/daisy_ui/aura.rb +37 -37
- data/lib/daisy_ui/avatar.rb +16 -14
- data/lib/daisy_ui/badge.rb +159 -156
- data/lib/daisy_ui/base.rb +38 -4
- data/lib/daisy_ui/button.rb +148 -142
- data/lib/daisy_ui/card.rb +57 -54
- data/lib/daisy_ui/carousel.rb +36 -32
- data/lib/daisy_ui/chat.rb +16 -15
- data/lib/daisy_ui/checkbox.rb +95 -93
- data/lib/daisy_ui/class_merge/cache.rb +40 -0
- data/lib/daisy_ui/class_merge/class_group_utils.rb +139 -0
- data/lib/daisy_ui/class_merge/configuration.rb +77 -0
- data/lib/daisy_ui/class_merge/daisy_groups.rb +83 -0
- data/lib/daisy_ui/class_merge/merger.rb +126 -0
- data/lib/daisy_ui/class_merge/parse_class_name.rb +110 -0
- data/lib/daisy_ui/class_merge/sort_modifiers.rb +36 -0
- data/lib/daisy_ui/class_merge/tailwind_config.rb +2505 -0
- data/lib/daisy_ui/class_merge/validators.rb +202 -0
- data/lib/daisy_ui/class_merge.rb +47 -0
- data/lib/daisy_ui/collapse.rb +32 -28
- data/lib/daisy_ui/configurable.rb +31 -3
- data/lib/daisy_ui/divider.rb +84 -78
- data/lib/daisy_ui/dock.rb +37 -35
- data/lib/daisy_ui/dropdown.rb +67 -65
- data/lib/daisy_ui/file_input.rb +95 -91
- data/lib/daisy_ui/footer.rb +16 -14
- data/lib/daisy_ui/indicator.rb +40 -36
- data/lib/daisy_ui/input.rb +95 -91
- data/lib/daisy_ui/join.rb +16 -14
- data/lib/daisy_ui/kbd.rb +37 -35
- data/lib/daisy_ui/link.rb +58 -58
- data/lib/daisy_ui/loading.rb +85 -81
- data/lib/daisy_ui/mask.rb +123 -119
- data/lib/daisy_ui/megamenu.rb +53 -50
- data/lib/daisy_ui/menu.rb +57 -53
- data/lib/daisy_ui/modal.rb +49 -47
- data/lib/daisy_ui/otp.rb +95 -93
- data/lib/daisy_ui/pagination.rb +16 -14
- data/lib/daisy_ui/progress.rb +58 -56
- data/lib/daisy_ui/radio.rb +95 -91
- data/lib/daisy_ui/range.rb +95 -91
- data/lib/daisy_ui/rating.rb +37 -35
- data/lib/daisy_ui/select.rb +95 -91
- data/lib/daisy_ui/stack.rb +24 -22
- data/lib/daisy_ui/stat.rb +16 -14
- data/lib/daisy_ui/status.rb +95 -91
- data/lib/daisy_ui/steps.rb +16 -14
- data/lib/daisy_ui/swap.rb +16 -14
- data/lib/daisy_ui/table.rb +41 -39
- data/lib/daisy_ui/tabs.rb +80 -77
- data/lib/daisy_ui/textarea.rb +95 -91
- data/lib/daisy_ui/timeline.rb +16 -14
- data/lib/daisy_ui/toast.rb +46 -42
- data/lib/daisy_ui/toggle.rb +95 -91
- data/lib/daisy_ui/tooltip.rb +113 -106
- data/lib/daisy_ui/updated_at.rb +1 -1
- data/lib/daisy_ui/version.rb +1 -1
- metadata +18 -1
|
@@ -0,0 +1,110 @@
|
|
|
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 ParseClassName
|
|
9
|
+
TailwindClass = Struct.new(:is_external, :modifiers, :has_important_modifier, :base_class_name, :maybe_postfix_modifier_position)
|
|
10
|
+
|
|
11
|
+
IMPORTANT_MODIFIER = "!"
|
|
12
|
+
EMPTY_MODIFIERS = [].freeze
|
|
13
|
+
MODIFIER_SEPARATOR = ":"
|
|
14
|
+
MODIFIER_SEPARATOR_LENGTH = MODIFIER_SEPARATOR.length
|
|
15
|
+
|
|
16
|
+
MODIFIER_SEPARATOR_BYTE = MODIFIER_SEPARATOR.ord
|
|
17
|
+
POSTFIX_SEPARATOR_BYTE = "/".ord
|
|
18
|
+
OPEN_BRACKET_BYTE = "[".ord
|
|
19
|
+
CLOSE_BRACKET_BYTE = "]".ord
|
|
20
|
+
OPEN_PAREN_BYTE = "(".ord
|
|
21
|
+
CLOSE_PAREN_BYTE = ")".ord
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# Parse class name into parts.
|
|
25
|
+
#
|
|
26
|
+
# Inspired by `splitAtTopLevelOnly` used in Tailwind CSS
|
|
27
|
+
# @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js
|
|
28
|
+
def parse_class_name(class_name, prefix: nil)
|
|
29
|
+
unless prefix.nil?
|
|
30
|
+
full_prefix = "#{prefix}#{MODIFIER_SEPARATOR}"
|
|
31
|
+
return parse_class_name(class_name[full_prefix.length..]) if class_name.start_with?(full_prefix)
|
|
32
|
+
|
|
33
|
+
return TailwindClass.new(
|
|
34
|
+
is_external: true,
|
|
35
|
+
modifiers: EMPTY_MODIFIERS,
|
|
36
|
+
has_important_modifier: false,
|
|
37
|
+
base_class_name: class_name,
|
|
38
|
+
maybe_postfix_modifier_position: nil
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Stays nil until the first modifier separator, so the common no-modifier
|
|
44
|
+
# class (`px-2`, `block`) never allocates an array.
|
|
45
|
+
modifiers = nil
|
|
46
|
+
|
|
47
|
+
bracket_depth = 0
|
|
48
|
+
paren_depth = 0
|
|
49
|
+
modifier_start = 0
|
|
50
|
+
postfix_modifier_position = nil
|
|
51
|
+
|
|
52
|
+
# Byte-wise scan: all separators are ASCII, so byte positions are safe
|
|
53
|
+
# for multibyte class names (UTF-8 continuation bytes never match ASCII).
|
|
54
|
+
# Positions produced here (including maybe_postfix_modifier_position)
|
|
55
|
+
# are byte offsets and must be consumed with String#byteslice.
|
|
56
|
+
index = 0
|
|
57
|
+
size = class_name.bytesize
|
|
58
|
+
while index < size
|
|
59
|
+
byte = class_name.getbyte(index)
|
|
60
|
+
|
|
61
|
+
if bracket_depth.zero? && paren_depth.zero?
|
|
62
|
+
if byte == MODIFIER_SEPARATOR_BYTE
|
|
63
|
+
(modifiers ||= []) << class_name.byteslice(modifier_start, index - modifier_start)
|
|
64
|
+
modifier_start = index + MODIFIER_SEPARATOR_LENGTH
|
|
65
|
+
index += 1
|
|
66
|
+
next
|
|
67
|
+
elsif byte == POSTFIX_SEPARATOR_BYTE
|
|
68
|
+
postfix_modifier_position = index
|
|
69
|
+
index += 1
|
|
70
|
+
next
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
case byte
|
|
75
|
+
when OPEN_BRACKET_BYTE then bracket_depth += 1
|
|
76
|
+
when CLOSE_BRACKET_BYTE then bracket_depth -= 1
|
|
77
|
+
when OPEN_PAREN_BYTE then paren_depth += 1
|
|
78
|
+
when CLOSE_PAREN_BYTE then paren_depth -= 1
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
index += 1
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
base_class_name_with_important_modifier = modifiers ? class_name.byteslice(modifier_start, size - modifier_start) : class_name
|
|
85
|
+
|
|
86
|
+
base_class_name, has_important_modifier = strip_important_modifier(base_class_name_with_important_modifier)
|
|
87
|
+
|
|
88
|
+
maybe_postfix_modifier_position = (postfix_modifier_position - modifier_start if postfix_modifier_position && postfix_modifier_position > modifier_start)
|
|
89
|
+
|
|
90
|
+
TailwindClass.new(
|
|
91
|
+
is_external: false,
|
|
92
|
+
modifiers: modifiers || EMPTY_MODIFIERS,
|
|
93
|
+
has_important_modifier:,
|
|
94
|
+
base_class_name: base_class_name,
|
|
95
|
+
maybe_postfix_modifier_position:
|
|
96
|
+
)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def strip_important_modifier(base_class_name)
|
|
100
|
+
return [base_class_name[0...-IMPORTANT_MODIFIER.length], true] if base_class_name.end_with?(IMPORTANT_MODIFIER)
|
|
101
|
+
|
|
102
|
+
# In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.
|
|
103
|
+
# @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864
|
|
104
|
+
return [base_class_name[1..], true] if base_class_name.start_with?(IMPORTANT_MODIFIER)
|
|
105
|
+
|
|
106
|
+
[base_class_name, false]
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
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 SortModifiers
|
|
9
|
+
# Sorts modifiers according to following schema:
|
|
10
|
+
# - Predefined modifiers are sorted alphabetically
|
|
11
|
+
# - When an arbitrary variant appears, it must be preserved which modifiers are before and after it
|
|
12
|
+
def sort_modifiers(modifiers, order_sensitive_modifiers)
|
|
13
|
+
return modifiers if modifiers.size <= 1
|
|
14
|
+
|
|
15
|
+
sorted_modifiers = []
|
|
16
|
+
unsorted_modifiers = []
|
|
17
|
+
|
|
18
|
+
modifiers.each do |modifier|
|
|
19
|
+
is_position_sensitive = modifier.start_with?("[") || order_sensitive_modifiers.include?(modifier)
|
|
20
|
+
|
|
21
|
+
if is_position_sensitive
|
|
22
|
+
sorted_modifiers.concat(unsorted_modifiers.sort)
|
|
23
|
+
sorted_modifiers << modifier
|
|
24
|
+
unsorted_modifiers.clear
|
|
25
|
+
else
|
|
26
|
+
unsorted_modifiers << modifier
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
sorted_modifiers.concat(unsorted_modifiers.sort)
|
|
31
|
+
|
|
32
|
+
sorted_modifiers
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|