daisyui 1.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 (79) hide show
  1. checksums.yaml +7 -0
  2. data/lib/daisy_ui/accordion.rb +49 -0
  3. data/lib/daisy_ui/alert.rb +76 -0
  4. data/lib/daisy_ui/avatar.rb +41 -0
  5. data/lib/daisy_ui/avatar_group.rb +19 -0
  6. data/lib/daisy_ui/badge.rb +118 -0
  7. data/lib/daisy_ui/base.rb +239 -0
  8. data/lib/daisy_ui/breadcrumbs.rb +25 -0
  9. data/lib/daisy_ui/button.rb +197 -0
  10. data/lib/daisy_ui/calendar.rb +48 -0
  11. data/lib/daisy_ui/card.rb +73 -0
  12. data/lib/daisy_ui/carousel.rb +51 -0
  13. data/lib/daisy_ui/chat.rb +49 -0
  14. data/lib/daisy_ui/checkbox.rb +112 -0
  15. data/lib/daisy_ui/collapse.rb +53 -0
  16. data/lib/daisy_ui/collapsible_sub_menu.rb +55 -0
  17. data/lib/daisy_ui/configurable.rb +45 -0
  18. data/lib/daisy_ui/countdown.rb +16 -0
  19. data/lib/daisy_ui/diff.rb +28 -0
  20. data/lib/daisy_ui/divider.rb +103 -0
  21. data/lib/daisy_ui/dock.rb +65 -0
  22. data/lib/daisy_ui/drawer.rb +61 -0
  23. data/lib/daisy_ui/dropdown.rb +101 -0
  24. data/lib/daisy_ui/fab.rb +34 -0
  25. data/lib/daisy_ui/fieldset.rb +20 -0
  26. data/lib/daisy_ui/file_input.rb +117 -0
  27. data/lib/daisy_ui/filter.rb +21 -0
  28. data/lib/daisy_ui/footer.rb +44 -0
  29. data/lib/daisy_ui/form_control.rb +15 -0
  30. data/lib/daisy_ui/hero.rb +24 -0
  31. data/lib/daisy_ui/hover_gallery.rb +16 -0
  32. data/lib/daisy_ui/indicator.rb +65 -0
  33. data/lib/daisy_ui/input.rb +117 -0
  34. data/lib/daisy_ui/join.rb +35 -0
  35. data/lib/daisy_ui/kbd.rb +54 -0
  36. data/lib/daisy_ui/label.rb +15 -0
  37. data/lib/daisy_ui/link.rb +137 -0
  38. data/lib/daisy_ui/list.rb +37 -0
  39. data/lib/daisy_ui/loading.rb +146 -0
  40. data/lib/daisy_ui/mask.rb +167 -0
  41. data/lib/daisy_ui/menu.rb +79 -0
  42. data/lib/daisy_ui/menu_item.rb +50 -0
  43. data/lib/daisy_ui/mockup_browser.rb +20 -0
  44. data/lib/daisy_ui/mockup_code.rb +16 -0
  45. data/lib/daisy_ui/mockup_phone.rb +24 -0
  46. data/lib/daisy_ui/mockup_window.rb +16 -0
  47. data/lib/daisy_ui/modal.rb +77 -0
  48. data/lib/daisy_ui/navbar.rb +31 -0
  49. data/lib/daisy_ui/pagination.rb +37 -0
  50. data/lib/daisy_ui/progress.rb +75 -0
  51. data/lib/daisy_ui/radial_progress.rb +181 -0
  52. data/lib/daisy_ui/radio.rb +110 -0
  53. data/lib/daisy_ui/range.rb +110 -0
  54. data/lib/daisy_ui/rating.rb +68 -0
  55. data/lib/daisy_ui/select.rb +117 -0
  56. data/lib/daisy_ui/skeleton.rb +19 -0
  57. data/lib/daisy_ui/stack.rb +47 -0
  58. data/lib/daisy_ui/stat.rb +57 -0
  59. data/lib/daisy_ui/status.rb +110 -0
  60. data/lib/daisy_ui/steps.rb +41 -0
  61. data/lib/daisy_ui/sub_menu.rb +37 -0
  62. data/lib/daisy_ui/swap.rb +52 -0
  63. data/lib/daisy_ui/tab.rb +40 -0
  64. data/lib/daisy_ui/tab_with_content.rb +72 -0
  65. data/lib/daisy_ui/tab_without_content.rb +40 -0
  66. data/lib/daisy_ui/table.rb +81 -0
  67. data/lib/daisy_ui/table_row.rb +33 -0
  68. data/lib/daisy_ui/tabs.rb +80 -0
  69. data/lib/daisy_ui/textarea.rb +117 -0
  70. data/lib/daisy_ui/theme_controller.rb +64 -0
  71. data/lib/daisy_ui/timeline.rb +66 -0
  72. data/lib/daisy_ui/toast.rb +61 -0
  73. data/lib/daisy_ui/toggle.rb +110 -0
  74. data/lib/daisy_ui/tooltip.rb +107 -0
  75. data/lib/daisy_ui/updated_at.rb +7 -0
  76. data/lib/daisy_ui/validator.rb +25 -0
  77. data/lib/daisy_ui/version.rb +5 -0
  78. data/lib/daisy_ui.rb +17 -0
  79. metadata +156 -0
@@ -0,0 +1,197 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "phlex/version"
4
+
5
+ module DaisyUI
6
+ class Button < Base
7
+ self.component_class = :btn
8
+
9
+ def initialize(*, as: :button, modal: nil, **)
10
+ super(*, as:, **)
11
+ @modal = modal
12
+ end
13
+
14
+ def view_template(&)
15
+ if modal
16
+ public_send(
17
+ as,
18
+ class: classes,
19
+ onclick: safe("#{Phlex::Escape.html_escape(modal)}.showModal()"),
20
+ **attributes,
21
+ &
22
+ )
23
+ else
24
+ public_send(as, class: classes, **attributes, &)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :modal
31
+
32
+ register_modifiers(
33
+ # "sm:no-animation"
34
+ # "@sm:no-animation"
35
+ # "md:no-animation"
36
+ # "@md:no-animation"
37
+ # "lg:no-animation"
38
+ # "@lg:no-animation"
39
+ no_animation: "no-animation",
40
+ # "sm:glass"
41
+ # "@sm:glass"
42
+ # "md:glass"
43
+ # "@md:glass"
44
+ # "lg:glass"
45
+ # "@lg:glass"
46
+ glass: "glass",
47
+ # "sm:btn-ghost"
48
+ # "@sm:btn-ghost"
49
+ # "md:btn-ghost"
50
+ # "@md:btn-ghost"
51
+ # "lg:btn-ghost"
52
+ # "@lg:btn-ghost"
53
+ ghost: "btn-ghost",
54
+ # "sm:btn-link"
55
+ # "@sm:btn-link"
56
+ # "md:btn-link"
57
+ # "@md:btn-link"
58
+ # "lg:btn-link"
59
+ # "@lg:btn-link"
60
+ link: "btn-link",
61
+ # "sm:btn-outline"
62
+ # "@sm:btn-outline"
63
+ # "md:btn-outline"
64
+ # "@md:btn-outline"
65
+ # "lg:btn-outline"
66
+ # "@lg:btn-outline"
67
+ outline: "btn-outline",
68
+ # "sm:btn-active"
69
+ # "@sm:btn-active"
70
+ # "md:btn-active"
71
+ # "@md:btn-active"
72
+ # "lg:btn-active"
73
+ # "@lg:btn-active"
74
+ active: "btn-active",
75
+ # "sm:btn-disabled"
76
+ # "@sm:btn-disabled"
77
+ # "md:btn-disabled"
78
+ # "@md:btn-disabled"
79
+ # "lg:btn-disabled"
80
+ # "@lg:btn-disabled"
81
+ disabled: "btn-disabled",
82
+ # "sm:btn-lg"
83
+ # "@sm:btn-lg"
84
+ # "md:btn-lg"
85
+ # "@md:btn-lg"
86
+ # "lg:btn-lg"
87
+ # "@lg:btn-lg"
88
+ lg: "btn-lg",
89
+ # "sm:btn-md"
90
+ # "@sm:btn-md"
91
+ # "md:btn-md"
92
+ # "@md:btn-md"
93
+ # "lg:btn-md"
94
+ # "@lg:btn-md"
95
+ md: "btn-md",
96
+ # "sm:btn-sm"
97
+ # "@sm:btn-sm"
98
+ # "md:btn-sm"
99
+ # "@md:btn-sm"
100
+ # "lg:btn-sm"
101
+ # "@lg:btn-sm"
102
+ sm: "btn-sm",
103
+ # "sm:btn-xs"
104
+ # "@sm:btn-xs"
105
+ # "md:btn-xs"
106
+ # "@md:btn-xs"
107
+ # "lg:btn-xs"
108
+ # "@lg:btn-xs"
109
+ xs: "btn-xs",
110
+ # "sm:btn-wide"
111
+ # "@sm:btn-wide"
112
+ # "md:btn-wide"
113
+ # "@md:btn-wide"
114
+ # "lg:btn-wide"
115
+ # "@lg:btn-wide"
116
+ wide: "btn-wide",
117
+ # "sm:btn-block"
118
+ # "@sm:btn-block"
119
+ # "md:btn-block"
120
+ # "@md:btn-block"
121
+ # "lg:btn-block"
122
+ # "@lg:btn-block"
123
+ block: "btn-block",
124
+ # "sm:btn-circle"
125
+ # "@sm:btn-circle"
126
+ # "md:btn-circle"
127
+ # "@md:btn-circle"
128
+ # "lg:btn-circle"
129
+ # "@lg:btn-circle"
130
+ circle: "btn-circle",
131
+ # "sm:btn-square"
132
+ # "@sm:btn-square"
133
+ # "md:btn-square"
134
+ # "@md:btn-square"
135
+ # "lg:btn-square"
136
+ # "@lg:btn-square"
137
+ square: "btn-square",
138
+ # Colors
139
+ # "sm:btn-neutral"
140
+ # "@sm:btn-neutral"
141
+ # "md:btn-neutral"
142
+ # "@md:btn-neutral"
143
+ # "lg:btn-neutral"
144
+ # "@lg:btn-neutral"
145
+ neutral: "btn-neutral",
146
+ # "sm:btn-primary"
147
+ # "@sm:btn-primary"
148
+ # "md:btn-primary"
149
+ # "@md:btn-primary"
150
+ # "lg:btn-primary"
151
+ # "@lg:btn-primary"
152
+ primary: "btn-primary",
153
+ # "sm:btn-secondary"
154
+ # "@sm:btn-secondary"
155
+ # "md:btn-secondary"
156
+ # "@md:btn-secondary"
157
+ # "lg:btn-secondary"
158
+ # "@lg:btn-secondary"
159
+ secondary: "btn-secondary",
160
+ # "sm:btn-accent"
161
+ # "@sm:btn-accent"
162
+ # "md:btn-accent"
163
+ # "@md:btn-accent"
164
+ # "lg:btn-accent"
165
+ # "@lg:btn-accent"
166
+ accent: "btn-accent",
167
+ # "sm:btn-info"
168
+ # "@sm:btn-info"
169
+ # "md:btn-info"
170
+ # "@md:btn-info"
171
+ # "lg:btn-info"
172
+ # "@lg:btn-info"
173
+ info: "btn-info",
174
+ # "sm:btn-success"
175
+ # "@sm:btn-success"
176
+ # "md:btn-success"
177
+ # "@md:btn-success"
178
+ # "lg:btn-success"
179
+ # "@lg:btn-success"
180
+ success: "btn-success",
181
+ # "sm:btn-warning"
182
+ # "@sm:btn-warning"
183
+ # "md:btn-warning"
184
+ # "@md:btn-warning"
185
+ # "lg:btn-warning"
186
+ # "@lg:btn-warning"
187
+ warning: "btn-warning",
188
+ # "sm:btn-error"
189
+ # "@sm:btn-error"
190
+ # "md:btn-error"
191
+ # "@md:btn-error"
192
+ # "lg:btn-error"
193
+ # "@lg:btn-error"
194
+ error: "btn-error"
195
+ ).freeze
196
+ end
197
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaisyUI
4
+ # @component html class="cally" or class="pika-single"
5
+ # Supports Cally web component and Pikaday date picker
6
+ class Calendar < Base
7
+ self.component_class = :calendar
8
+
9
+ # Register custom web component elements
10
+ register_element :calendar_date
11
+ register_element :calendar_month
12
+
13
+ def initialize(*, type: :cally, **)
14
+ super(*, **)
15
+ @type = type
16
+ end
17
+
18
+ def view_template(&)
19
+ case type
20
+ when :cally
21
+ render_cally(&)
22
+ when :pikaday
23
+ render_pikaday
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :type
30
+
31
+ def render_cally(&block)
32
+ calendar_date(class: classes, **attributes, &block)
33
+ end
34
+
35
+ def render_pikaday
36
+ input(type: :text, class: classes, **attributes)
37
+ end
38
+
39
+ def base_class
40
+ case type
41
+ when :cally
42
+ "cally"
43
+ when :pikaday
44
+ "input pika-single"
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaisyUI
4
+ class Card < Base
5
+ self.component_class = :card
6
+
7
+ def initialize(*, as: :section, **)
8
+ super
9
+ end
10
+
11
+ def view_template(&)
12
+ public_send(as, class: classes, **attributes, &)
13
+ end
14
+
15
+ def body(**opts, &)
16
+ div(class: component_classes("card-body", options: opts), **opts, &)
17
+ end
18
+
19
+ def title(**opts, &)
20
+ header(class: component_classes("card-title", options: opts), **opts, &)
21
+ end
22
+
23
+ def actions(**opts, &)
24
+ footer(class: component_classes("card-actions", options: opts), **opts, &)
25
+ end
26
+
27
+ register_modifiers(
28
+ # "sm:image-full"
29
+ # "@sm:image-full"
30
+ # "md:image-full"
31
+ # "@md:image-full"
32
+ # "lg:image-full"
33
+ # "@lg:image-full"
34
+ image_full: "image-full",
35
+ # "sm:card-bordered"
36
+ # "@sm:card-bordered"
37
+ # "md:card-bordered"
38
+ # "@md:card-bordered"
39
+ # "lg:card-bordered"
40
+ # "@lg:card-bordered"
41
+ bordered: "card-bordered",
42
+ # "sm:card-normal"
43
+ # "@sm:card-normal"
44
+ # "md:card-normal"
45
+ # "@md:card-normal"
46
+ # "lg:card-normal"
47
+ # "@lg:card-normal"
48
+ normal: "card-normal",
49
+ # "sm:card-compact"
50
+ # "@sm:card-compact"
51
+ # "md:card-compact"
52
+ # "@md:card-compact"
53
+ # "lg:card-compact"
54
+ # "@lg:card-compact"
55
+ compact: "card-compact",
56
+ # "sm:card-side"
57
+ # "@sm:card-side"
58
+ # "md:card-side"
59
+ # "@md:card-side"
60
+ # "lg:card-side"
61
+ # "@lg:card-side"
62
+ side: "card-side",
63
+ # "sm:glass"
64
+ # "@sm:glass"
65
+ # "md:glass"
66
+ # "@md:glass"
67
+ # "lg:glass"
68
+ # "@lg:glass"
69
+ glass: "glass",
70
+ **COLOR_MODIFIERS
71
+ )
72
+ end
73
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaisyUI
4
+ # @component html class="carousel"
5
+ class Carousel < Base
6
+ self.component_class = :carousel
7
+
8
+ def initialize(*, as: :div, **)
9
+ super
10
+ end
11
+
12
+ def view_template(&)
13
+ public_send(as, class: classes, **attributes, &)
14
+ end
15
+
16
+ def item(**opts, &)
17
+ div(class: component_classes("carousel-item", options: opts), **opts, &)
18
+ end
19
+
20
+ register_modifiers(
21
+ # "sm:carousel-start"
22
+ # "@sm:carousel-start"
23
+ # "md:carousel-start"
24
+ # "@md:carousel-start"
25
+ # "lg:carousel-start"
26
+ # "@lg:carousel-start"
27
+ start: "carousel-start",
28
+ # "sm:carousel-center"
29
+ # "@sm:carousel-center"
30
+ # "md:carousel-center"
31
+ # "@md:carousel-center"
32
+ # "lg:carousel-center"
33
+ # "@lg:carousel-center"
34
+ center: "carousel-center",
35
+ # "sm:carousel-end"
36
+ # "@sm:carousel-end"
37
+ # "md:carousel-end"
38
+ # "@md:carousel-end"
39
+ # "lg:carousel-end"
40
+ # "@lg:carousel-end"
41
+ end: "carousel-end",
42
+ # "sm:carousel-vertical"
43
+ # "@sm:carousel-vertical"
44
+ # "md:carousel-vertical"
45
+ # "@md:carousel-vertical"
46
+ # "lg:carousel-vertical"
47
+ # "@lg:carousel-vertical"
48
+ vertical: "carousel-vertical"
49
+ )
50
+ end
51
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaisyUI
4
+ # @component html class="chat"
5
+ class Chat < Base
6
+ self.component_class = :chat
7
+
8
+ def initialize(*, as: :div, **)
9
+ super
10
+ end
11
+
12
+ def view_template(&)
13
+ public_send(as, class: classes, **attributes, &)
14
+ end
15
+
16
+ def image(**opts, &)
17
+ div(class: component_classes("chat-image", options: opts), **opts, &)
18
+ end
19
+
20
+ def header(**opts, &)
21
+ div(class: component_classes("chat-header", options: opts), **opts, &)
22
+ end
23
+
24
+ def bubble(**opts, &)
25
+ div(class: component_classes("chat-bubble", options: opts), **opts, &)
26
+ end
27
+
28
+ def footer(**opts, &)
29
+ div(class: component_classes("chat-footer", options: opts), **opts, &)
30
+ end
31
+
32
+ register_modifiers(
33
+ # "sm:chat-start"
34
+ # "@sm:chat-start"
35
+ # "md:chat-start"
36
+ # "@md:chat-start"
37
+ # "lg:chat-start"
38
+ # "@lg:chat-start"
39
+ start: "chat-start",
40
+ # "sm:chat-end"
41
+ # "@sm:chat-end"
42
+ # "md:chat-end"
43
+ # "@md:chat-end"
44
+ # "lg:chat-end"
45
+ # "@lg:chat-end"
46
+ end: "chat-end"
47
+ )
48
+ end
49
+ end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaisyUI
4
+ class Checkbox < Base
5
+ self.component_class = :checkbox
6
+
7
+ def view_template(&)
8
+ input(
9
+ type: :checkbox,
10
+ class: classes,
11
+ **attributes,
12
+ &
13
+ )
14
+ end
15
+
16
+ private
17
+
18
+ def attributes
19
+ attrs = super
20
+
21
+ # Remove checkbox-specific boolean attributes from base attrs
22
+ checked = modifiers.include?(:checked) || attrs.delete(:checked) == true
23
+ disabled = modifiers.include?(:disabled) || attrs.delete(:disabled) == true
24
+
25
+ # Add them back in the correct order: checked first, then disabled
26
+ attrs[:checked] = true if checked
27
+ attrs[:disabled] = true if disabled
28
+
29
+ attrs
30
+ end
31
+
32
+ register_modifiers(
33
+ # "sm:checkbox-primary"
34
+ # "@sm:checkbox-primary"
35
+ # "md:checkbox-primary"
36
+ # "@md:checkbox-primary"
37
+ # "lg:checkbox-primary"
38
+ # "@lg:checkbox-primary"
39
+ primary: "checkbox-primary",
40
+ # "sm:checkbox-secondary"
41
+ # "@sm:checkbox-secondary"
42
+ # "md:checkbox-secondary"
43
+ # "@md:checkbox-secondary"
44
+ # "lg:checkbox-secondary"
45
+ # "@lg:checkbox-secondary"
46
+ secondary: "checkbox-secondary",
47
+ # "sm:checkbox-accent"
48
+ # "@sm:checkbox-accent"
49
+ # "md:checkbox-accent"
50
+ # "@md:checkbox-accent"
51
+ # "lg:checkbox-accent"
52
+ # "@lg:checkbox-accent"
53
+ accent: "checkbox-accent",
54
+ # "sm:checkbox-success"
55
+ # "@sm:checkbox-success"
56
+ # "md:checkbox-success"
57
+ # "@md:checkbox-success"
58
+ # "lg:checkbox-success"
59
+ # "@lg:checkbox-success"
60
+ success: "checkbox-success",
61
+ # "sm:checkbox-warning"
62
+ # "@sm:checkbox-warning"
63
+ # "md:checkbox-warning"
64
+ # "@md:checkbox-warning"
65
+ # "lg:checkbox-warning"
66
+ # "@lg:checkbox-warning"
67
+ warning: "checkbox-warning",
68
+ # "sm:checkbox-info"
69
+ # "@sm:checkbox-info"
70
+ # "md:checkbox-info"
71
+ # "@md:checkbox-info"
72
+ # "lg:checkbox-info"
73
+ # "@lg:checkbox-info"
74
+ info: "checkbox-info",
75
+ # "sm:checkbox-error"
76
+ # "@sm:checkbox-error"
77
+ # "md:checkbox-error"
78
+ # "@md:checkbox-error"
79
+ # "lg:checkbox-error"
80
+ # "@lg:checkbox-error"
81
+ error: "checkbox-error",
82
+ # "sm:checkbox-lg"
83
+ # "@sm:checkbox-lg"
84
+ # "md:checkbox-lg"
85
+ # "@md:checkbox-lg"
86
+ # "lg:checkbox-lg"
87
+ # "@lg:checkbox-lg"
88
+ lg: "checkbox-lg",
89
+ # "sm:checkbox-md"
90
+ # "@sm:checkbox-md"
91
+ # "md:checkbox-md"
92
+ # "@md:checkbox-md"
93
+ # "lg:checkbox-md"
94
+ # "@lg:checkbox-md"
95
+ md: "checkbox-md",
96
+ # "sm:checkbox-sm"
97
+ # "@sm:checkbox-sm"
98
+ # "md:checkbox-sm"
99
+ # "@md:checkbox-sm"
100
+ # "lg:checkbox-sm"
101
+ # "@lg:checkbox-sm"
102
+ sm: "checkbox-sm",
103
+ # "sm:checkbox-xs"
104
+ # "@sm:checkbox-xs"
105
+ # "md:checkbox-xs"
106
+ # "@md:checkbox-xs"
107
+ # "lg:checkbox-xs"
108
+ # "@lg:checkbox-xs"
109
+ xs: "checkbox-xs"
110
+ )
111
+ end
112
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaisyUI
4
+ # @component html class="collapse"
5
+ class Collapse < Base
6
+ def initialize(*, as: :div, **)
7
+ super
8
+ end
9
+
10
+ def view_template(&)
11
+ public_send(as, class: classes, **attributes, &)
12
+ end
13
+
14
+ def title(**opts, &)
15
+ div(class: component_classes("collapse-title", options: opts), **opts, &)
16
+ end
17
+
18
+ def content(**opts, &)
19
+ div(class: component_classes("collapse-content", options: opts), **opts, &)
20
+ end
21
+
22
+ register_modifiers(
23
+ # "sm:collapse-arrow"
24
+ # "@sm:collapse-arrow"
25
+ # "md:collapse-arrow"
26
+ # "@md:collapse-arrow"
27
+ # "lg:collapse-arrow"
28
+ # "@lg:collapse-arrow"
29
+ arrow: "collapse-arrow",
30
+ # "sm:collapse-plus"
31
+ # "@sm:collapse-plus"
32
+ # "md:collapse-plus"
33
+ # "@md:collapse-plus"
34
+ # "lg:collapse-plus"
35
+ # "@lg:collapse-plus"
36
+ plus: "collapse-plus",
37
+ # "sm:collapse-open"
38
+ # "@sm:collapse-open"
39
+ # "md:collapse-open"
40
+ # "@md:collapse-open"
41
+ # "lg:collapse-open"
42
+ # "@lg:collapse-open"
43
+ open: "collapse-open",
44
+ # "sm:collapse-close"
45
+ # "@sm:collapse-close"
46
+ # "md:collapse-close"
47
+ # "@md:collapse-close"
48
+ # "lg:collapse-close"
49
+ # "@lg:collapse-close"
50
+ close: "collapse-close"
51
+ )
52
+ end
53
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaisyUI
4
+ # @private
5
+ class CollapsibleSubMenu < Base
6
+ self.component_class = nil
7
+
8
+ def initialize(*, **)
9
+ super
10
+ @items ||= []
11
+ end
12
+
13
+ def view_template(&block)
14
+ block&.call(self)
15
+
16
+ # Extract 'open' attribute for the details element
17
+ details_attrs = {}
18
+ details_attrs[:open] = true if modifiers.include?(:open) || options.delete(:open) == true
19
+
20
+ details(**details_attrs) do
21
+ if @title
22
+ summary do
23
+ render @title
24
+ end
25
+ else
26
+ raise ArgumentError, "A collapsible submenu requires a title"
27
+ end
28
+
29
+ if @items.any?
30
+ ul class: classes, **attributes do
31
+ @items.each do |item|
32
+ render item
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ def title(&block)
40
+ if @title
41
+ raise ArgumentError, "A collapsible submenu can only have one title"
42
+ else
43
+ @title = block
44
+ end
45
+ end
46
+
47
+ def item(*, **, &)
48
+ @items << MenuItem.new(*, **, &)
49
+ end
50
+
51
+ private
52
+
53
+ register_modifiers(COLOR_MODIFIERS)
54
+ end
55
+ end
@@ -0,0 +1,45 @@
1
+ module DaisyUI
2
+ module Configurable
3
+ def configure
4
+ self.configuration ||= Configuration.new
5
+ yield(configuration) if block_given?
6
+ configuration
7
+ end
8
+
9
+ def configuration
10
+ @configuration ||= Configuration.new
11
+ end
12
+
13
+ class Modifiers
14
+ def initialize
15
+ @modifiers = {}
16
+ end
17
+
18
+ def add(modifier, classes:, component: nil)
19
+ @modifiers[component] ||= {}
20
+ @modifiers[component][modifier] = classes
21
+ end
22
+
23
+ def remove(modifier, component: nil)
24
+ @modifiers[component] ||= {}
25
+ @modifiers[component]&.delete(modifier)
26
+ end
27
+
28
+ def for(component: nil)
29
+ @modifiers[component] || {}
30
+ end
31
+ end
32
+
33
+ class Configuration
34
+ attr_accessor :prefix
35
+
36
+ def initialize
37
+ @prefix = nil
38
+ end
39
+
40
+ def modifiers
41
+ @modifiers ||= Modifiers.new
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaisyUI
4
+ # @component html class="countdown"
5
+ class Countdown < Base
6
+ self.component_class = :countdown
7
+
8
+ def initialize(*, as: :span, **)
9
+ super
10
+ end
11
+
12
+ def view_template(&)
13
+ public_send(as, class: classes, **attributes, &)
14
+ end
15
+ end
16
+ end