shadcn_phlexcomponents 0.1.5 → 0.1.11

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 (249) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -0
  3. data/app/javascript/controllers/accordion_controller.ts +133 -0
  4. data/app/javascript/controllers/{avatar_controller.js → avatar_controller.ts} +4 -0
  5. data/app/javascript/controllers/checkbox_controller.ts +34 -0
  6. data/app/javascript/controllers/collapsible_controller.ts +45 -0
  7. data/app/javascript/controllers/combobox_controller.ts +145 -0
  8. data/app/javascript/controllers/command_controller.ts +129 -0
  9. data/app/javascript/controllers/command_root_controller.ts +355 -0
  10. data/app/javascript/controllers/date_picker_controller.ts +274 -0
  11. data/app/javascript/controllers/date_range_picker_controller.ts +243 -0
  12. data/app/javascript/controllers/dialog_controller.ts +113 -0
  13. data/app/javascript/controllers/dropdown_menu_controller.ts +133 -0
  14. data/app/javascript/controllers/dropdown_menu_root_controller.ts +234 -0
  15. data/app/javascript/controllers/dropdown_menu_sub_controller.ts +150 -0
  16. data/app/javascript/controllers/form_field_controller.ts +22 -0
  17. data/app/javascript/controllers/hover_card_controller.ts +93 -0
  18. data/app/javascript/controllers/{loading_button_controller.js → loading_button_controller.ts} +2 -2
  19. data/app/javascript/controllers/popover_controller.ts +141 -0
  20. data/app/javascript/controllers/progress_controller.ts +17 -0
  21. data/app/javascript/controllers/radio_group_controller.ts +106 -0
  22. data/app/javascript/controllers/select_controller.ts +200 -0
  23. data/app/javascript/controllers/{sidebar_controller.js → sidebar_controller.ts} +6 -2
  24. data/app/javascript/controllers/sidebar_trigger_controller.ts +21 -0
  25. data/app/javascript/controllers/slider_controller.ts +107 -0
  26. data/app/javascript/controllers/switch_controller.ts +30 -0
  27. data/app/javascript/controllers/tabs_controller.ts +79 -0
  28. data/app/javascript/controllers/{theme_switcher_controller.js → theme_switcher_controller.ts} +12 -9
  29. data/app/javascript/controllers/toast_container_controller.ts +62 -0
  30. data/app/javascript/controllers/toast_controller.ts +28 -0
  31. data/app/javascript/controllers/tooltip_controller.ts +98 -0
  32. data/app/javascript/shadcn_phlexcomponents.ts +57 -0
  33. data/app/javascript/utils.ts +437 -0
  34. data/app/stylesheets/date_picker.css +74 -0
  35. data/app/stylesheets/nouislider.css +173 -0
  36. data/app/stylesheets/tw-animate.css +486 -0
  37. data/lib/install/install_shadcn_phlexcomponents.rb +22 -9
  38. data/lib/shadcn_phlexcomponents/alias.rb +3 -1
  39. data/lib/shadcn_phlexcomponents/components/accordion.rb +129 -0
  40. data/lib/shadcn_phlexcomponents/components/alert.rb +59 -0
  41. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +276 -0
  42. data/lib/{components → shadcn_phlexcomponents/components}/aspect_ratio.rb +2 -2
  43. data/lib/shadcn_phlexcomponents/components/avatar.rb +63 -0
  44. data/lib/shadcn_phlexcomponents/components/badge.rb +35 -0
  45. data/lib/{components → shadcn_phlexcomponents/components}/base.rb +44 -7
  46. data/lib/shadcn_phlexcomponents/components/breadcrumb.rb +150 -0
  47. data/lib/shadcn_phlexcomponents/components/button.rb +49 -0
  48. data/lib/shadcn_phlexcomponents/components/card.rb +88 -0
  49. data/lib/{components → shadcn_phlexcomponents/components}/checkbox.rb +21 -17
  50. data/lib/{components → shadcn_phlexcomponents/components}/checkbox_group.rb +27 -16
  51. data/lib/shadcn_phlexcomponents/components/collapsible.rb +91 -0
  52. data/lib/shadcn_phlexcomponents/components/combobox.rb +398 -0
  53. data/lib/shadcn_phlexcomponents/components/command.rb +351 -0
  54. data/lib/shadcn_phlexcomponents/components/date_picker.rb +264 -0
  55. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +126 -0
  56. data/lib/shadcn_phlexcomponents/components/dialog.rb +234 -0
  57. data/lib/shadcn_phlexcomponents/components/dropdown_menu.rb +282 -0
  58. data/lib/shadcn_phlexcomponents/components/dropdown_menu_sub.rb +135 -0
  59. data/lib/shadcn_phlexcomponents/components/form/form_checkbox.rb +82 -0
  60. data/lib/shadcn_phlexcomponents/components/form/form_checkbox_group.rb +116 -0
  61. data/lib/shadcn_phlexcomponents/components/form/form_date_picker.rb +46 -0
  62. data/lib/shadcn_phlexcomponents/components/form/form_date_range_picker.rb +82 -0
  63. data/lib/{components → shadcn_phlexcomponents/components/form}/form_error.rb +7 -3
  64. data/lib/shadcn_phlexcomponents/components/form/form_helpers.rb +143 -0
  65. data/lib/shadcn_phlexcomponents/components/form/form_hint.rb +21 -0
  66. data/lib/{components → shadcn_phlexcomponents/components/form}/form_input.rb +3 -4
  67. data/lib/shadcn_phlexcomponents/components/form/form_radio_group.rb +106 -0
  68. data/lib/shadcn_phlexcomponents/components/form/form_select.rb +64 -0
  69. data/lib/shadcn_phlexcomponents/components/form/form_slider.rb +91 -0
  70. data/lib/shadcn_phlexcomponents/components/form/form_switch.rb +67 -0
  71. data/lib/shadcn_phlexcomponents/components/form/form_textarea.rb +59 -0
  72. data/lib/shadcn_phlexcomponents/components/form.rb +157 -0
  73. data/lib/shadcn_phlexcomponents/components/hover_card.rb +110 -0
  74. data/lib/shadcn_phlexcomponents/components/input.rb +31 -0
  75. data/lib/shadcn_phlexcomponents/components/label.rb +16 -0
  76. data/lib/{components → shadcn_phlexcomponents/components}/link.rb +10 -3
  77. data/lib/shadcn_phlexcomponents/components/loading_button.rb +28 -0
  78. data/lib/shadcn_phlexcomponents/components/pagination.rb +166 -0
  79. data/lib/shadcn_phlexcomponents/components/popover.rb +116 -0
  80. data/lib/{components → shadcn_phlexcomponents/components}/progress.rb +5 -5
  81. data/lib/shadcn_phlexcomponents/components/radio_group.rb +155 -0
  82. data/lib/shadcn_phlexcomponents/components/select.rb +421 -0
  83. data/lib/{components → shadcn_phlexcomponents/components}/separator.rb +9 -8
  84. data/lib/shadcn_phlexcomponents/components/sheet.rb +239 -0
  85. data/lib/{components → shadcn_phlexcomponents/components}/skeleton.rb +1 -1
  86. data/lib/shadcn_phlexcomponents/components/slider.rb +72 -0
  87. data/lib/shadcn_phlexcomponents/components/switch.rb +75 -0
  88. data/lib/shadcn_phlexcomponents/components/table.rb +140 -0
  89. data/lib/shadcn_phlexcomponents/components/tabs.rb +135 -0
  90. data/lib/shadcn_phlexcomponents/components/textarea.rb +24 -0
  91. data/lib/{components → shadcn_phlexcomponents/components}/theme_switcher.rb +2 -2
  92. data/lib/shadcn_phlexcomponents/components/toast.rb +153 -0
  93. data/lib/{components → shadcn_phlexcomponents/components}/toast_container.rb +24 -5
  94. data/lib/shadcn_phlexcomponents/components/tooltip.rb +131 -0
  95. data/lib/shadcn_phlexcomponents/initializers/shadcn_phlexcomponents.rb +25 -0
  96. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  97. data/lib/tasks/install.rake +1 -1
  98. metadata +92 -168
  99. data/app/assets/tailwind/choices.css +0 -324
  100. data/app/assets/tailwind/tailwindcss-animate.css +0 -318
  101. data/app/assets/tailwind/vanilla-calendar-pro.css +0 -466
  102. data/app/javascript/controllers/accordion_controller.js +0 -133
  103. data/app/javascript/controllers/alert_dialog_controller.js +0 -157
  104. data/app/javascript/controllers/checkbox_controller.js +0 -28
  105. data/app/javascript/controllers/collapsible_controller.js +0 -35
  106. data/app/javascript/controllers/combobox_controller.js +0 -34
  107. data/app/javascript/controllers/date_picker_controller.js +0 -118
  108. data/app/javascript/controllers/date_range_picker_controller.js +0 -231
  109. data/app/javascript/controllers/dialog_controller.js +0 -159
  110. data/app/javascript/controllers/dropdown_menu_controller.js +0 -193
  111. data/app/javascript/controllers/hover_card_controller.js +0 -42
  112. data/app/javascript/controllers/popover_controller.js +0 -124
  113. data/app/javascript/controllers/progress_controller.js +0 -14
  114. data/app/javascript/controllers/radio_group_controller.js +0 -90
  115. data/app/javascript/controllers/select_controller.js +0 -294
  116. data/app/javascript/controllers/sheet_controller.js +0 -159
  117. data/app/javascript/controllers/sidebar_trigger_controller.js +0 -15
  118. data/app/javascript/controllers/switch_controller.js +0 -24
  119. data/app/javascript/controllers/tabs_controller.js +0 -73
  120. data/app/javascript/controllers/toast_container_controller.js +0 -22
  121. data/app/javascript/controllers/toast_controller.js +0 -45
  122. data/app/javascript/controllers/tooltip_controller.js +0 -41
  123. data/lib/components/accordion.rb +0 -38
  124. data/lib/components/accordion_content.rb +0 -30
  125. data/lib/components/accordion_item.rb +0 -26
  126. data/lib/components/accordion_trigger.rb +0 -45
  127. data/lib/components/alert.rb +0 -40
  128. data/lib/components/alert_description.rb +0 -11
  129. data/lib/components/alert_dialog.rb +0 -60
  130. data/lib/components/alert_dialog_action.rb +0 -22
  131. data/lib/components/alert_dialog_action_to.rb +0 -40
  132. data/lib/components/alert_dialog_cancel.rb +0 -22
  133. data/lib/components/alert_dialog_content.rb +0 -40
  134. data/lib/components/alert_dialog_description.rb +0 -22
  135. data/lib/components/alert_dialog_footer.rb +0 -11
  136. data/lib/components/alert_dialog_header.rb +0 -11
  137. data/lib/components/alert_dialog_title.rb +0 -22
  138. data/lib/components/alert_dialog_trigger.rb +0 -50
  139. data/lib/components/alert_title.rb +0 -11
  140. data/lib/components/avatar.rb +0 -31
  141. data/lib/components/avatar_fallback.rb +0 -21
  142. data/lib/components/avatar_image.rb +0 -19
  143. data/lib/components/badge.rb +0 -30
  144. data/lib/components/breadcrumb.rb +0 -51
  145. data/lib/components/breadcrumb_ellipsis.rb +0 -23
  146. data/lib/components/breadcrumb_item.rb +0 -11
  147. data/lib/components/breadcrumb_link.rb +0 -7
  148. data/lib/components/breadcrumb_page.rb +0 -21
  149. data/lib/components/breadcrumb_separator.rb +0 -26
  150. data/lib/components/button.rb +0 -53
  151. data/lib/components/card.rb +0 -31
  152. data/lib/components/card_content.rb +0 -11
  153. data/lib/components/card_description.rb +0 -11
  154. data/lib/components/card_footer.rb +0 -11
  155. data/lib/components/card_header.rb +0 -11
  156. data/lib/components/card_title.rb +0 -11
  157. data/lib/components/collapsible.rb +0 -31
  158. data/lib/components/collapsible_content.rb +0 -24
  159. data/lib/components/collapsible_trigger.rb +0 -50
  160. data/lib/components/combobox.rb +0 -57
  161. data/lib/components/combobox_item.rb +0 -9
  162. data/lib/components/date_picker.rb +0 -94
  163. data/lib/components/date_range_picker.rb +0 -113
  164. data/lib/components/dialog.rb +0 -52
  165. data/lib/components/dialog_close.rb +0 -42
  166. data/lib/components/dialog_content.rb +0 -54
  167. data/lib/components/dialog_description.rb +0 -22
  168. data/lib/components/dialog_footer.rb +0 -11
  169. data/lib/components/dialog_header.rb +0 -11
  170. data/lib/components/dialog_title.rb +0 -22
  171. data/lib/components/dialog_trigger.rb +0 -50
  172. data/lib/components/dropdown_menu.rb +0 -50
  173. data/lib/components/dropdown_menu_content.rb +0 -52
  174. data/lib/components/dropdown_menu_item.rb +0 -56
  175. data/lib/components/dropdown_menu_item_to.rb +0 -28
  176. data/lib/components/dropdown_menu_label.rb +0 -11
  177. data/lib/components/dropdown_menu_separator.rb +0 -20
  178. data/lib/components/dropdown_menu_trigger.rb +0 -57
  179. data/lib/components/form.rb +0 -59
  180. data/lib/components/form_hint.rb +0 -17
  181. data/lib/components/hover_card.rb +0 -33
  182. data/lib/components/hover_card_content.rb +0 -32
  183. data/lib/components/hover_card_trigger.rb +0 -44
  184. data/lib/components/input.rb +0 -32
  185. data/lib/components/label.rb +0 -14
  186. data/lib/components/loading_button.rb +0 -21
  187. data/lib/components/pagination.rb +0 -38
  188. data/lib/components/pagination_ellipsis.rb +0 -24
  189. data/lib/components/pagination_link.rb +0 -34
  190. data/lib/components/pagination_next.rb +0 -32
  191. data/lib/components/pagination_previous.rb +0 -32
  192. data/lib/components/popover.rb +0 -34
  193. data/lib/components/popover_content.rb +0 -40
  194. data/lib/components/popover_trigger.rb +0 -51
  195. data/lib/components/radio_group.rb +0 -62
  196. data/lib/components/radio_group_item.rb +0 -66
  197. data/lib/components/select.rb +0 -184
  198. data/lib/components/select_content.rb +0 -64
  199. data/lib/components/select_group.rb +0 -23
  200. data/lib/components/select_item.rb +0 -59
  201. data/lib/components/select_label.rb +0 -24
  202. data/lib/components/select_trigger.rb +0 -56
  203. data/lib/components/sheet.rb +0 -53
  204. data/lib/components/sheet_close.rb +0 -42
  205. data/lib/components/sheet_content.rb +0 -65
  206. data/lib/components/sheet_description.rb +0 -22
  207. data/lib/components/sheet_footer.rb +0 -11
  208. data/lib/components/sheet_header.rb +0 -11
  209. data/lib/components/sheet_title.rb +0 -22
  210. data/lib/components/sheet_trigger.rb +0 -50
  211. data/lib/components/sidebar.rb +0 -108
  212. data/lib/components/sidebar_container.rb +0 -11
  213. data/lib/components/sidebar_content.rb +0 -11
  214. data/lib/components/sidebar_footer.rb +0 -11
  215. data/lib/components/sidebar_group.rb +0 -11
  216. data/lib/components/sidebar_group_content.rb +0 -11
  217. data/lib/components/sidebar_group_label.rb +0 -16
  218. data/lib/components/sidebar_header.rb +0 -11
  219. data/lib/components/sidebar_inset.rb +0 -15
  220. data/lib/components/sidebar_menu.rb +0 -11
  221. data/lib/components/sidebar_menu_button.rb +0 -61
  222. data/lib/components/sidebar_menu_item.rb +0 -9
  223. data/lib/components/sidebar_menu_sub.rb +0 -14
  224. data/lib/components/sidebar_menu_sub_button.rb +0 -48
  225. data/lib/components/sidebar_menu_sub_item.rb +0 -9
  226. data/lib/components/sidebar_trigger.rb +0 -40
  227. data/lib/components/switch.rb +0 -66
  228. data/lib/components/table.rb +0 -75
  229. data/lib/components/table_body.rb +0 -11
  230. data/lib/components/table_caption.rb +0 -11
  231. data/lib/components/table_cell.rb +0 -11
  232. data/lib/components/table_footer.rb +0 -11
  233. data/lib/components/table_head.rb +0 -14
  234. data/lib/components/table_header.rb +0 -11
  235. data/lib/components/table_row.rb +0 -11
  236. data/lib/components/tabs.rb +0 -38
  237. data/lib/components/tabs_content.rb +0 -35
  238. data/lib/components/tabs_list.rb +0 -23
  239. data/lib/components/tabs_trigger.rb +0 -45
  240. data/lib/components/textarea.rb +0 -28
  241. data/lib/components/toast.rb +0 -101
  242. data/lib/components/toast_action.rb +0 -39
  243. data/lib/components/toast_action_to.rb +0 -28
  244. data/lib/components/toast_content.rb +0 -11
  245. data/lib/components/toast_description.rb +0 -11
  246. data/lib/components/toast_title.rb +0 -11
  247. data/lib/components/tooltip.rb +0 -34
  248. data/lib/components/tooltip_content.rb +0 -39
  249. data/lib/components/tooltip_trigger.rb +0 -48
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class Link < Base
5
- STYLES = "font-medium underline underline-offset-4"
5
+ class_variants(base: "font-medium underline underline-offset-4")
6
6
 
7
7
  def initialize(name = nil, options = nil, html_options = nil)
8
8
  @name = name
@@ -15,9 +15,16 @@ module ShadcnPhlexcomponents
15
15
  @html_options = @options
16
16
  @options = @name
17
17
  end
18
+
18
19
  @html_options ||= {}
19
- @html_options = mix(default_attributes, @html_options)
20
- @html_options[:class] = TAILWIND_MERGER.merge("#{default_styles} #{@html_options[:class]}")
20
+ variant = @html_options.delete(:variant)
21
+ size = @html_options.delete(:size) || :default
22
+
23
+ @html_options[:class] = if variant
24
+ Button.new.class_variants(variant: variant, size: size, class: @html_options[:class])
25
+ else
26
+ class_variants(class: @html_options[:class])
27
+ end
21
28
 
22
29
  if block_given?
23
30
  link_to(@options, @html_options, &)
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class LoadingButton < Base
5
+ def initialize(variant: :default, size: :default, type: :submit, **attributes)
6
+ @variant = variant
7
+ @size = size
8
+ @type = type
9
+ super(**attributes)
10
+ end
11
+
12
+ def default_attributes
13
+ {
14
+ type: @type,
15
+ data: {
16
+ controller: "loading-button",
17
+ },
18
+ }
19
+ end
20
+
21
+ def view_template(&)
22
+ Button(variant: @variant, size: @size, **@attributes) do
23
+ icon("loader-circle", class: "animate-spin hidden group-aria-busy:inline")
24
+ yield
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Pagination < Base
5
+ class_variants(base: "mx-auto flex w-full justify-center")
6
+
7
+ def item(**attributes, &)
8
+ PaginationItem(**attributes, &)
9
+ end
10
+
11
+ def link(name = nil, options = nil, html_options = nil, &)
12
+ PaginationLink(name, options, html_options, &)
13
+ end
14
+
15
+ def previous(options = nil, html_options = nil)
16
+ PaginationPrevious(options, html_options)
17
+ end
18
+
19
+ def next(options = nil, html_options = nil)
20
+ PaginationNext(options, html_options)
21
+ end
22
+
23
+ def ellipsis(**attributes, &)
24
+ PaginationEllipsis(**attributes, &)
25
+ end
26
+
27
+ def default_attributes
28
+ {
29
+ role: "navigation",
30
+ aria: {
31
+ label: "navigation",
32
+ },
33
+ }
34
+ end
35
+
36
+ def view_template(&)
37
+ div(**@attributes) do
38
+ ul(class: "flex flex-row items-center gap-1", &)
39
+ end
40
+ end
41
+ end
42
+
43
+ class PaginationItem < Base
44
+ def view_template(&)
45
+ li(**@attributes, &)
46
+ end
47
+ end
48
+
49
+ class PaginationPrevious < Base
50
+ class_variants(base: "gap-1 px-2.5 sm:pl-2.5")
51
+
52
+ def initialize(options = nil, html_options = nil)
53
+ @options = options
54
+ @html_options = html_options
55
+ end
56
+
57
+ def default_attributes
58
+ {
59
+ aria: {
60
+ label: "Go to previous page",
61
+ },
62
+ }
63
+ end
64
+
65
+ def view_template
66
+ @html_options ||= {}
67
+ @html_options = mix(default_attributes, @html_options)
68
+ @html_options[:class] = class_variants(clase: @html_options[:class])
69
+ @html_options[:size] = :default
70
+
71
+ PaginationLink(@options, @html_options) do
72
+ icon("chevron-left")
73
+ span(class: "hidden sm:block") { "Previous" }
74
+ end
75
+ end
76
+ end
77
+
78
+ class PaginationNext < Base
79
+ class_variants(base: "gap-1 px-2.5 sm:pr-2.5")
80
+
81
+ def initialize(options = nil, html_options = nil)
82
+ @options = options
83
+ @html_options = html_options
84
+ end
85
+
86
+ def default_attributes
87
+ {
88
+ aria: {
89
+ label: "Go to next page",
90
+ },
91
+ }
92
+ end
93
+
94
+ def view_template
95
+ @html_options ||= {}
96
+ @html_options = mix(default_attributes, @html_options)
97
+ @html_options[:class] = class_variants(clase: @html_options[:class])
98
+ @html_options[:size] = :default
99
+
100
+ PaginationLink(@options, @html_options) do
101
+ span(class: "hidden sm:block") { "Next" }
102
+ icon("chevron-right")
103
+ end
104
+ end
105
+ end
106
+
107
+ class PaginationLink < Base
108
+ def initialize(name = nil, options = nil, html_options = nil)
109
+ @name = name
110
+ @options = options
111
+ @html_options = html_options
112
+ end
113
+
114
+ def view_template(&)
115
+ if block_given?
116
+ @html_options = @options
117
+ @options = @name
118
+ end
119
+
120
+ @html_options ||= {}
121
+ @html_options = mix(default_attributes, @html_options)
122
+
123
+ active = @html_options.delete(:active)
124
+ size = @html_options.delete(:size)
125
+
126
+ if active
127
+ @html_options = mix({ aria: { current: "page" } }, @html_options)
128
+ end
129
+
130
+ @html_options[:class] = Button.new.class_variants(
131
+ variant: active ? :outline : :ghost,
132
+ size: size || :icon,
133
+ class: @html_options[:class],
134
+ )
135
+
136
+ if block_given?
137
+ li do
138
+ link_to(@options, @html_options, &)
139
+ end
140
+ else
141
+ li do
142
+ link_to(@name, @options, @html_options)
143
+ end
144
+ end
145
+ end
146
+ end
147
+
148
+ class PaginationEllipsis < Base
149
+ class_variants(base: "flex size-9 items-center justify-center")
150
+
151
+ def default_attributes
152
+ {
153
+ aria: {
154
+ hidden: "true",
155
+ },
156
+ }
157
+ end
158
+
159
+ def view_template
160
+ span(**@attributes) do
161
+ icon("ellipsis", class: "size-4")
162
+ span(class: "sr-only") { "More pages" }
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Popover < Base
5
+ class_variants(base: "inline-block max-w-fit")
6
+
7
+ def initialize(open: false, **attributes)
8
+ @open = open
9
+ @aria_id = "popover-#{SecureRandom.hex(5)}"
10
+ super(**attributes)
11
+ end
12
+
13
+ def trigger(**attributes, &)
14
+ PopoverTrigger(aria_id: @aria_id, **attributes, &)
15
+ end
16
+
17
+ def content(**attributes, &)
18
+ PopoverContent(aria_id: @aria_id, **attributes, &)
19
+ end
20
+
21
+ def default_attributes
22
+ {
23
+ data: {
24
+ controller: "popover",
25
+ popover_is_open_value: @open.to_s,
26
+ side: @side,
27
+ },
28
+ }
29
+ end
30
+
31
+ def view_template(&)
32
+ div(**@attributes, &)
33
+ end
34
+ end
35
+
36
+ class PopoverTrigger < Base
37
+ def initialize(as_child: false, aria_id: nil, **attributes)
38
+ @as_child = as_child
39
+ @aria_id = aria_id
40
+ super(**attributes)
41
+ end
42
+
43
+ def view_template(&)
44
+ if @as_child
45
+ content = capture(&)
46
+ element = find_as_child(content.to_s)
47
+ vanish(&)
48
+ merged_attributes = merged_as_child_attributes(element, @attributes)
49
+
50
+ send(element.name, **merged_attributes) do
51
+ sanitize_as_child(element.children.to_s)
52
+ end
53
+ else
54
+ div(**@attributes, &)
55
+ end
56
+ end
57
+
58
+ def default_attributes
59
+ {
60
+ role: "button",
61
+ aria: {
62
+ haspopup: "dialog",
63
+ expanded: false,
64
+ controls: "#{@aria_id}-content",
65
+ },
66
+ data: {
67
+ as_child: @as_child.to_s,
68
+ action: "click->popover#toggle",
69
+ popover_target: "trigger",
70
+ },
71
+ }
72
+ end
73
+ end
74
+
75
+ class PopoverContent < Base
76
+ class_variants(
77
+ base: <<~HEREDOC,
78
+ bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out
79
+ data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95
80
+ data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2
81
+ data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popper-transform-origin) rounded-md
82
+ border p-4 shadow-md outline-hidden
83
+ HEREDOC
84
+ )
85
+
86
+ def initialize(side: :bottom, align: :center, aria_id: nil, **attributes)
87
+ @side = side
88
+ @align = align
89
+ @aria_id = aria_id
90
+ super(**attributes)
91
+ end
92
+
93
+ def view_template(&)
94
+ div(
95
+ class: "hidden fixed top-0 left-0 w-max z-50",
96
+ data: { popover_target: "contentContainer" },
97
+ ) do
98
+ div(**@attributes, &)
99
+ end
100
+ end
101
+
102
+ def default_attributes
103
+ {
104
+ id: "#{@aria_id}-content",
105
+ tabindex: -1,
106
+ role: "dialog",
107
+ data: {
108
+ side: @side,
109
+ align: @align,
110
+ popover_target: "content",
111
+ action: "popover:click:outside->popover#clickOutside",
112
+ },
113
+ }
114
+ end
115
+ end
116
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class Progress < Base
5
- STYLES = "relative h-2 w-full overflow-hidden rounded-full bg-primary/20"
5
+ class_variants(base: "bg-primary/20 relative h-2 w-full overflow-hidden rounded-full")
6
6
 
7
7
  def initialize(value: 0, **attributes)
8
8
  @value = value
@@ -18,8 +18,8 @@ module ShadcnPhlexcomponents
18
18
  valuenow: @value,
19
19
  },
20
20
  data: {
21
- controller: "shadcn-phlexcomponents--progress",
22
- "shadcn-phlexcomponents--progress-progress-value": @value,
21
+ controller: "progress",
22
+ progress_percent_value: @value,
23
23
  },
24
24
  }
25
25
  end
@@ -27,9 +27,9 @@ module ShadcnPhlexcomponents
27
27
  def view_template
28
28
  div(**@attributes) do
29
29
  div(
30
- class: "h-full w-full flex-1 bg-primary transition-all",
30
+ class: "bg-primary h-full w-full flex-1 transition-all",
31
31
  style: "transform: translateX(-#{100 - @value}%)",
32
- data: { "shadcn-phlexcomponents--progress-target": "bar" },
32
+ data: { progress_target: "indicator" },
33
33
  )
34
34
  end
35
35
  end
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class RadioGroup < Base
5
+ class_variants(base: "grid gap-3 outline-none")
6
+
7
+ def initialize(name: nil, value: nil, dir: "ltr", include_hidden: true, **attributes)
8
+ @name = name
9
+ @value = value
10
+ @dir = dir
11
+ @include_hidden = include_hidden
12
+ super(**attributes)
13
+ end
14
+
15
+ def label(**attributes)
16
+ @label_attributes = attributes
17
+ nil
18
+ end
19
+
20
+ def radio(**attributes)
21
+ @radio_attributes = attributes
22
+ nil
23
+ end
24
+
25
+ def item(name: nil, value: nil, checked: false, **attributes)
26
+ RadioGroupItem(name: name || @name, value: value, checked: checked || @value == value, **attributes)
27
+ end
28
+
29
+ def items(collection, value_method:, text_method:, container_class: nil, disabled_items: nil, id_prefix: nil, &)
30
+ vanish(&)
31
+
32
+ container_class = TAILWIND_MERGER.merge("flex items-center gap-3 #{container_class}")
33
+
34
+ if collection.first&.is_a?(Hash)
35
+ collection = convert_collection_hash_to_struct(collection, value_method: value_method, text_method: text_method)
36
+ end
37
+
38
+ collection.each do |item|
39
+ value = item.public_send(value_method)
40
+ text = item.public_send(text_method)
41
+ id = if id_prefix
42
+ "#{id_prefix.parameterize.underscore}_#{value}"
43
+ else
44
+ "#{@name.parameterize.underscore}_#{value}"
45
+ end
46
+
47
+ div(class: container_class) do
48
+ RadioGroupItem(
49
+ name: @name,
50
+ value: value,
51
+ checked: @value == value,
52
+ id: id,
53
+ disabled: item_disabled?(disabled_items, value),
54
+ **@radio_attributes,
55
+ )
56
+ Label(for: id, **@label_attributes) { text }
57
+ end
58
+ end
59
+
60
+ nil
61
+ end
62
+
63
+ def default_attributes
64
+ {
65
+ role: "radiogroup",
66
+ dir: @dir,
67
+ aria: {
68
+ required: false,
69
+ },
70
+ data: {
71
+ controller: "radio-group",
72
+ radio_group_selected_value: @value,
73
+ },
74
+ }
75
+ end
76
+
77
+ def view_template(&)
78
+ div(**@attributes) do
79
+ if @include_hidden
80
+ input(type: "hidden", name: @name, autocomplete: "off")
81
+ end
82
+
83
+ yield
84
+ end
85
+ end
86
+ end
87
+
88
+ class RadioGroupItem < Base
89
+ class_variants(
90
+ base: <<~HEREDOC,
91
+ border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20
92
+ dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4
93
+ shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px]
94
+ disabled:cursor-not-allowed disabled:opacity-50 relative
95
+ HEREDOC
96
+ )
97
+
98
+ def initialize(name: nil, value: nil, checked: false, **attributes)
99
+ @value = value
100
+ @name = name
101
+ @checked = checked
102
+ super(**attributes)
103
+ end
104
+
105
+ def view_template(&)
106
+ button(**@attributes) do
107
+ span(
108
+ class: "relative flex items-center justify-center",
109
+ data: {
110
+ radio_group_target: "indicator",
111
+ },
112
+ ) do
113
+ icon("circle", class: "fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2")
114
+ end
115
+
116
+ input(
117
+ type: "radio",
118
+ value: @value,
119
+ class: "-translate-x-full pointer-events-none absolute top-0 left-0 size-4 opacity-0",
120
+ name: @name,
121
+ tabindex: -1,
122
+ checked: @checked,
123
+ aria: { hidden: "true" },
124
+ data: {
125
+ radio_group_target: "input",
126
+ },
127
+ )
128
+ end
129
+ end
130
+
131
+ def default_attributes
132
+ {
133
+ type: "button",
134
+ tabindex: -1,
135
+ role: "radio",
136
+ aria: {
137
+ checked: @checked.to_s,
138
+ },
139
+ data: {
140
+ checked: @checked.to_s,
141
+ value: @value,
142
+ radio_group_target: "item",
143
+ action: <<~HEREDOC,
144
+ click->radio-group#select
145
+ keydown.right->radio-group#selectItem:prevent
146
+ keydown.down->radio-group#selectItem:prevent
147
+ keydown.up->radio-group#selectItem:prevent
148
+ keydown.left->radio-group#selectItem:prevent
149
+ keydown.enter->radio-group#preventDefault
150
+ HEREDOC
151
+ },
152
+ }
153
+ end
154
+ end
155
+ end