shadcn_phlexcomponents 0.1.9 → 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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/app/javascript/controllers/accordion_controller.ts +133 -0
  3. data/app/javascript/controllers/{avatar_controller.js → avatar_controller.ts} +4 -0
  4. data/app/javascript/controllers/checkbox_controller.ts +34 -0
  5. data/app/javascript/controllers/collapsible_controller.ts +45 -0
  6. data/app/javascript/controllers/combobox_controller.ts +145 -0
  7. data/app/javascript/controllers/command_controller.ts +129 -0
  8. data/app/javascript/controllers/command_root_controller.ts +355 -0
  9. data/app/javascript/controllers/date_picker_controller.ts +274 -0
  10. data/app/javascript/controllers/date_range_picker_controller.ts +243 -0
  11. data/app/javascript/controllers/dialog_controller.ts +113 -0
  12. data/app/javascript/controllers/dropdown_menu_controller.ts +133 -0
  13. data/app/javascript/controllers/dropdown_menu_root_controller.ts +234 -0
  14. data/app/javascript/controllers/dropdown_menu_sub_controller.ts +150 -0
  15. data/app/javascript/controllers/{form_field_controller.js → form_field_controller.ts} +4 -6
  16. data/app/javascript/controllers/hover_card_controller.ts +93 -0
  17. data/app/javascript/controllers/{loading_button_controller.js → loading_button_controller.ts} +2 -2
  18. data/app/javascript/controllers/popover_controller.ts +141 -0
  19. data/app/javascript/controllers/progress_controller.ts +17 -0
  20. data/app/javascript/controllers/radio_group_controller.ts +106 -0
  21. data/app/javascript/controllers/select_controller.ts +200 -0
  22. data/app/javascript/controllers/{sidebar_controller.js → sidebar_controller.ts} +6 -2
  23. data/app/javascript/controllers/sidebar_trigger_controller.ts +21 -0
  24. data/app/javascript/controllers/slider_controller.ts +107 -0
  25. data/app/javascript/controllers/switch_controller.ts +30 -0
  26. data/app/javascript/controllers/tabs_controller.ts +79 -0
  27. data/app/javascript/controllers/{theme_switcher_controller.js → theme_switcher_controller.ts} +12 -9
  28. data/app/javascript/controllers/toast_container_controller.ts +62 -0
  29. data/app/javascript/controllers/toast_controller.ts +28 -0
  30. data/app/javascript/controllers/tooltip_controller.ts +98 -0
  31. data/app/javascript/{shadcn_phlexcomponents.js → shadcn_phlexcomponents.ts} +6 -2
  32. data/app/javascript/utils.ts +437 -0
  33. data/app/stylesheets/date_picker.css +16 -154
  34. data/app/stylesheets/nouislider.css +173 -0
  35. data/app/stylesheets/tw-animate.css +486 -0
  36. data/lib/install/install_shadcn_phlexcomponents.rb +16 -3
  37. data/lib/shadcn_phlexcomponents/alias.rb +3 -1
  38. data/lib/shadcn_phlexcomponents/components/accordion.rb +129 -0
  39. data/lib/shadcn_phlexcomponents/components/alert.rb +59 -0
  40. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +276 -0
  41. data/lib/shadcn_phlexcomponents/components/{aspect_ratio/aspect_ratio.rb → aspect_ratio.rb} +2 -2
  42. data/lib/shadcn_phlexcomponents/components/avatar.rb +63 -0
  43. data/lib/shadcn_phlexcomponents/components/badge.rb +35 -0
  44. data/lib/shadcn_phlexcomponents/components/base.rb +34 -7
  45. data/lib/shadcn_phlexcomponents/components/breadcrumb.rb +150 -0
  46. data/lib/shadcn_phlexcomponents/components/button.rb +49 -0
  47. data/lib/shadcn_phlexcomponents/components/card.rb +88 -0
  48. data/lib/shadcn_phlexcomponents/components/{checkbox/checkbox.rb → checkbox.rb} +18 -14
  49. data/lib/shadcn_phlexcomponents/components/{checkbox_group/checkbox_group.rb → checkbox_group.rb} +7 -8
  50. data/lib/shadcn_phlexcomponents/components/collapsible.rb +91 -0
  51. data/lib/shadcn_phlexcomponents/components/combobox.rb +398 -0
  52. data/lib/shadcn_phlexcomponents/components/command.rb +351 -0
  53. data/lib/shadcn_phlexcomponents/components/date_picker.rb +264 -0
  54. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +126 -0
  55. data/lib/shadcn_phlexcomponents/components/dialog.rb +234 -0
  56. data/lib/shadcn_phlexcomponents/components/dropdown_menu.rb +282 -0
  57. data/lib/shadcn_phlexcomponents/components/dropdown_menu_sub.rb +135 -0
  58. data/lib/shadcn_phlexcomponents/components/form/form_checkbox.rb +6 -7
  59. data/lib/shadcn_phlexcomponents/components/form/form_checkbox_group.rb +2 -2
  60. data/lib/shadcn_phlexcomponents/components/form/form_date_picker.rb +3 -4
  61. data/lib/shadcn_phlexcomponents/components/form/form_date_range_picker.rb +27 -41
  62. data/lib/shadcn_phlexcomponents/components/form/form_error.rb +1 -1
  63. data/lib/shadcn_phlexcomponents/components/form/form_helpers.rb +43 -8
  64. data/lib/shadcn_phlexcomponents/components/form/form_hint.rb +1 -1
  65. data/lib/shadcn_phlexcomponents/components/form/form_input.rb +3 -4
  66. data/lib/shadcn_phlexcomponents/components/form/form_radio_group.rb +4 -5
  67. data/lib/shadcn_phlexcomponents/components/form/form_select.rb +3 -4
  68. data/lib/shadcn_phlexcomponents/components/form/form_slider.rb +91 -0
  69. data/lib/shadcn_phlexcomponents/components/form/form_switch.rb +7 -6
  70. data/lib/shadcn_phlexcomponents/components/form/form_textarea.rb +3 -4
  71. data/lib/shadcn_phlexcomponents/components/{form/form.rb → form.rb} +22 -4
  72. data/lib/shadcn_phlexcomponents/components/hover_card.rb +110 -0
  73. data/lib/shadcn_phlexcomponents/components/input.rb +31 -0
  74. data/lib/shadcn_phlexcomponents/components/label.rb +16 -0
  75. data/lib/shadcn_phlexcomponents/components/{link/link.rb → link.rb} +10 -3
  76. data/lib/shadcn_phlexcomponents/components/{loading_button/loading_button.rb → loading_button.rb} +9 -2
  77. data/lib/shadcn_phlexcomponents/components/pagination.rb +166 -0
  78. data/lib/shadcn_phlexcomponents/components/popover.rb +116 -0
  79. data/lib/shadcn_phlexcomponents/components/{progress/progress.rb → progress.rb} +4 -4
  80. data/lib/shadcn_phlexcomponents/components/radio_group.rb +155 -0
  81. data/lib/shadcn_phlexcomponents/components/select.rb +421 -0
  82. data/lib/shadcn_phlexcomponents/components/{separator/separator.rb → separator.rb} +9 -8
  83. data/lib/shadcn_phlexcomponents/components/sheet.rb +239 -0
  84. data/lib/shadcn_phlexcomponents/components/{skeleton/skeleton.rb → skeleton.rb} +1 -1
  85. data/lib/shadcn_phlexcomponents/components/slider.rb +72 -0
  86. data/lib/shadcn_phlexcomponents/components/switch.rb +75 -0
  87. data/lib/shadcn_phlexcomponents/components/table.rb +140 -0
  88. data/lib/shadcn_phlexcomponents/components/tabs.rb +135 -0
  89. data/lib/shadcn_phlexcomponents/components/textarea.rb +24 -0
  90. data/lib/shadcn_phlexcomponents/components/toast.rb +153 -0
  91. data/lib/shadcn_phlexcomponents/components/{toast/toast_container.rb → toast_container.rb} +23 -4
  92. data/lib/shadcn_phlexcomponents/components/tooltip.rb +131 -0
  93. data/lib/shadcn_phlexcomponents/initializers/shadcn_phlexcomponents.rb +25 -0
  94. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  95. data/lib/tasks/install.rake +1 -1
  96. metadata +78 -167
  97. data/app/javascript/controllers/accordion_controller.js +0 -124
  98. data/app/javascript/controllers/alert_dialog_controller.js +0 -21
  99. data/app/javascript/controllers/checkbox_controller.js +0 -28
  100. data/app/javascript/controllers/collapsible_controller.js +0 -35
  101. data/app/javascript/controllers/combobox_controller.js +0 -54
  102. data/app/javascript/controllers/date_picker_controller.js +0 -253
  103. data/app/javascript/controllers/date_range_picker_controller.js +0 -344
  104. data/app/javascript/controllers/dialog_controller.js +0 -114
  105. data/app/javascript/controllers/dropdown_menu_controller.js +0 -171
  106. data/app/javascript/controllers/hover_card_controller.js +0 -21
  107. data/app/javascript/controllers/popover_controller.js +0 -113
  108. data/app/javascript/controllers/progress_controller.js +0 -14
  109. data/app/javascript/controllers/radio_group_controller.js +0 -90
  110. data/app/javascript/controllers/select_controller.js +0 -274
  111. data/app/javascript/controllers/sidebar_trigger_controller.js +0 -15
  112. data/app/javascript/controllers/switch_controller.js +0 -24
  113. data/app/javascript/controllers/tabs_controller.js +0 -73
  114. data/app/javascript/controllers/toast_container_controller.js +0 -22
  115. data/app/javascript/controllers/toast_controller.js +0 -45
  116. data/app/javascript/controllers/tooltip_controller.js +0 -40
  117. data/app/javascript/utils.js +0 -184
  118. data/app/stylesheets/choices.css +0 -324
  119. data/app/stylesheets/tailwindcss-animate.css +0 -318
  120. data/lib/shadcn_phlexcomponents/components/accordion/accordion.rb +0 -38
  121. data/lib/shadcn_phlexcomponents/components/accordion/accordion_content.rb +0 -30
  122. data/lib/shadcn_phlexcomponents/components/accordion/accordion_item.rb +0 -26
  123. data/lib/shadcn_phlexcomponents/components/accordion/accordion_trigger.rb +0 -46
  124. data/lib/shadcn_phlexcomponents/components/alert/alert.rb +0 -40
  125. data/lib/shadcn_phlexcomponents/components/alert/alert_description.rb +0 -11
  126. data/lib/shadcn_phlexcomponents/components/alert/alert_title.rb +0 -11
  127. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog.rb +0 -60
  128. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_action.rb +0 -22
  129. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_action_to.rb +0 -40
  130. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_cancel.rb +0 -22
  131. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_content.rb +0 -40
  132. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_description.rb +0 -22
  133. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_footer.rb +0 -11
  134. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_header.rb +0 -11
  135. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_title.rb +0 -22
  136. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_trigger.rb +0 -50
  137. data/lib/shadcn_phlexcomponents/components/avatar/avatar.rb +0 -31
  138. data/lib/shadcn_phlexcomponents/components/avatar/avatar_fallback.rb +0 -21
  139. data/lib/shadcn_phlexcomponents/components/avatar/avatar_image.rb +0 -19
  140. data/lib/shadcn_phlexcomponents/components/badge/badge.rb +0 -30
  141. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb.rb +0 -53
  142. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_ellipsis.rb +0 -23
  143. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_item.rb +0 -11
  144. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_link.rb +0 -7
  145. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_page.rb +0 -21
  146. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_separator.rb +0 -26
  147. data/lib/shadcn_phlexcomponents/components/button/button.rb +0 -53
  148. data/lib/shadcn_phlexcomponents/components/card/card.rb +0 -31
  149. data/lib/shadcn_phlexcomponents/components/card/card_content.rb +0 -11
  150. data/lib/shadcn_phlexcomponents/components/card/card_description.rb +0 -11
  151. data/lib/shadcn_phlexcomponents/components/card/card_footer.rb +0 -11
  152. data/lib/shadcn_phlexcomponents/components/card/card_header.rb +0 -11
  153. data/lib/shadcn_phlexcomponents/components/card/card_title.rb +0 -11
  154. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible.rb +0 -31
  155. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible_content.rb +0 -24
  156. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible_trigger.rb +0 -50
  157. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker.rb +0 -87
  158. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker_content.rb +0 -45
  159. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker_trigger.rb +0 -64
  160. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker.rb +0 -105
  161. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker_content.rb +0 -9
  162. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker_trigger.rb +0 -9
  163. data/lib/shadcn_phlexcomponents/components/dialog/dialog.rb +0 -52
  164. data/lib/shadcn_phlexcomponents/components/dialog/dialog_close.rb +0 -42
  165. data/lib/shadcn_phlexcomponents/components/dialog/dialog_content.rb +0 -54
  166. data/lib/shadcn_phlexcomponents/components/dialog/dialog_description.rb +0 -22
  167. data/lib/shadcn_phlexcomponents/components/dialog/dialog_footer.rb +0 -11
  168. data/lib/shadcn_phlexcomponents/components/dialog/dialog_header.rb +0 -11
  169. data/lib/shadcn_phlexcomponents/components/dialog/dialog_title.rb +0 -22
  170. data/lib/shadcn_phlexcomponents/components/dialog/dialog_trigger.rb +0 -50
  171. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu.rb +0 -50
  172. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_content.rb +0 -52
  173. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_item.rb +0 -56
  174. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_item_to.rb +0 -28
  175. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_label.rb +0 -11
  176. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_separator.rb +0 -20
  177. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_trigger.rb +0 -57
  178. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card.rb +0 -33
  179. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card_content.rb +0 -32
  180. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card_trigger.rb +0 -44
  181. data/lib/shadcn_phlexcomponents/components/input/input.rb +0 -32
  182. data/lib/shadcn_phlexcomponents/components/label/label.rb +0 -14
  183. data/lib/shadcn_phlexcomponents/components/pagination/pagination.rb +0 -38
  184. data/lib/shadcn_phlexcomponents/components/pagination/pagination_ellipsis.rb +0 -24
  185. data/lib/shadcn_phlexcomponents/components/pagination/pagination_link.rb +0 -34
  186. data/lib/shadcn_phlexcomponents/components/pagination/pagination_next.rb +0 -32
  187. data/lib/shadcn_phlexcomponents/components/pagination/pagination_previous.rb +0 -32
  188. data/lib/shadcn_phlexcomponents/components/popover/popover.rb +0 -34
  189. data/lib/shadcn_phlexcomponents/components/popover/popover_content.rb +0 -40
  190. data/lib/shadcn_phlexcomponents/components/popover/popover_trigger.rb +0 -50
  191. data/lib/shadcn_phlexcomponents/components/radio_group/radio_group.rb +0 -88
  192. data/lib/shadcn_phlexcomponents/components/radio_group/radio_group_item.rb +0 -66
  193. data/lib/shadcn_phlexcomponents/components/select/select.rb +0 -194
  194. data/lib/shadcn_phlexcomponents/components/select/select_content.rb +0 -64
  195. data/lib/shadcn_phlexcomponents/components/select/select_group.rb +0 -23
  196. data/lib/shadcn_phlexcomponents/components/select/select_item.rb +0 -59
  197. data/lib/shadcn_phlexcomponents/components/select/select_label.rb +0 -24
  198. data/lib/shadcn_phlexcomponents/components/select/select_trigger.rb +0 -56
  199. data/lib/shadcn_phlexcomponents/components/sheet/sheet.rb +0 -53
  200. data/lib/shadcn_phlexcomponents/components/sheet/sheet_close.rb +0 -42
  201. data/lib/shadcn_phlexcomponents/components/sheet/sheet_content.rb +0 -65
  202. data/lib/shadcn_phlexcomponents/components/sheet/sheet_description.rb +0 -22
  203. data/lib/shadcn_phlexcomponents/components/sheet/sheet_footer.rb +0 -11
  204. data/lib/shadcn_phlexcomponents/components/sheet/sheet_header.rb +0 -11
  205. data/lib/shadcn_phlexcomponents/components/sheet/sheet_title.rb +0 -22
  206. data/lib/shadcn_phlexcomponents/components/sheet/sheet_trigger.rb +0 -50
  207. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar.rb +0 -108
  208. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_container.rb +0 -11
  209. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_content.rb +0 -11
  210. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_footer.rb +0 -11
  211. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group.rb +0 -11
  212. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group_content.rb +0 -11
  213. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group_label.rb +0 -16
  214. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_header.rb +0 -11
  215. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_inset.rb +0 -15
  216. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu.rb +0 -11
  217. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_button.rb +0 -61
  218. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_item.rb +0 -9
  219. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub.rb +0 -14
  220. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub_button.rb +0 -48
  221. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub_item.rb +0 -9
  222. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_trigger.rb +0 -40
  223. data/lib/shadcn_phlexcomponents/components/switch/switch.rb +0 -66
  224. data/lib/shadcn_phlexcomponents/components/table/table.rb +0 -75
  225. data/lib/shadcn_phlexcomponents/components/table/table_body.rb +0 -11
  226. data/lib/shadcn_phlexcomponents/components/table/table_caption.rb +0 -11
  227. data/lib/shadcn_phlexcomponents/components/table/table_cell.rb +0 -11
  228. data/lib/shadcn_phlexcomponents/components/table/table_footer.rb +0 -11
  229. data/lib/shadcn_phlexcomponents/components/table/table_head.rb +0 -14
  230. data/lib/shadcn_phlexcomponents/components/table/table_header.rb +0 -11
  231. data/lib/shadcn_phlexcomponents/components/table/table_row.rb +0 -11
  232. data/lib/shadcn_phlexcomponents/components/tabs/tabs.rb +0 -38
  233. data/lib/shadcn_phlexcomponents/components/tabs/tabs_content.rb +0 -35
  234. data/lib/shadcn_phlexcomponents/components/tabs/tabs_list.rb +0 -23
  235. data/lib/shadcn_phlexcomponents/components/tabs/tabs_trigger.rb +0 -45
  236. data/lib/shadcn_phlexcomponents/components/textarea/textarea.rb +0 -29
  237. data/lib/shadcn_phlexcomponents/components/toast/toast.rb +0 -101
  238. data/lib/shadcn_phlexcomponents/components/toast/toast_action.rb +0 -39
  239. data/lib/shadcn_phlexcomponents/components/toast/toast_action_to.rb +0 -28
  240. data/lib/shadcn_phlexcomponents/components/toast/toast_content.rb +0 -11
  241. data/lib/shadcn_phlexcomponents/components/toast/toast_description.rb +0 -11
  242. data/lib/shadcn_phlexcomponents/components/toast/toast_title.rb +0 -11
  243. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip.rb +0 -34
  244. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip_content.rb +0 -39
  245. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip_trigger.rb +0 -48
  246. /data/lib/shadcn_phlexcomponents/components/{theme_switcher/theme_switcher.rb → theme_switcher.rb} +0 -0
@@ -1,88 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class RadioGroup < Base
5
- STYLES = "grid gap-2 outline-none"
6
-
7
- def initialize(name: nil, value: nil, dir: "ltr", include_hidden: true, item_id_prefix: nil, **attributes)
8
- @name = name
9
- @value = value
10
- @dir = dir
11
- @include_hidden = include_hidden
12
- @item_id_prefix = item_id_prefix
13
- super(**attributes)
14
- end
15
-
16
- def label(**attributes)
17
- @label_attributes = attributes
18
- nil
19
- end
20
-
21
- def radio(**attributes)
22
- @radio_attributes = attributes
23
- nil
24
- end
25
-
26
- def item(name: nil, value: nil, **attributes)
27
- RadioGroupItem(name: name || @name, value: value, checked: @value == value, **attributes)
28
- end
29
-
30
- def items(collection, value_method:, text_method:, wrapper_class: nil, disabled_items: nil, &)
31
- vanish(&)
32
-
33
- wrapper_class = TAILWIND_MERGER.merge("flex items-center space-x-2 #{wrapper_class}")
34
-
35
- if collection.first&.is_a?(Hash)
36
- collection = convert_collection_hash_to_struct(collection, value_method: value_method, text_method: text_method)
37
- end
38
-
39
- collection.each do |item|
40
- value = item.public_send(value_method)
41
- text = item.public_send(text_method)
42
- id = if @item_id_prefix
43
- "#{@item_id_prefix.parameterize.underscore}_#{value}"
44
- else
45
- "#{@name.parameterize.underscore}_#{value}"
46
- end
47
-
48
- div(class: wrapper_class) do
49
- RadioGroupItem(
50
- name: @name,
51
- value: value,
52
- checked: @value == value,
53
- id: id,
54
- disabled: item_disabled?(disabled_items, value),
55
- **@radio_attributes,
56
- )
57
- Label(for: id, **@label_attributes) { text }
58
- end
59
- end
60
-
61
- nil
62
- end
63
-
64
- def view_template(&)
65
- div(**@attributes) do
66
- if @include_hidden
67
- input(type: "hidden", name: @name, autocomplete: "off")
68
- end
69
-
70
- yield
71
- end
72
- end
73
-
74
- def default_attributes
75
- {
76
- role: "radiogroup",
77
- dir: @dir,
78
- aria: {
79
- required: false,
80
- },
81
- data: {
82
- controller: "radio-group",
83
- "radio-group-selected-value": @value,
84
- },
85
- }
86
- end
87
- end
88
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class RadioGroupItem < Base
5
- STYLES = <<~HEREDOC
6
- aspect-square h-4 w-4 rounded-full border border-primary text-primary shadow
7
- focus:outline-none focus-visible:ring-1 focus-visible:ring-ring
8
- disabled:cursor-not-allowed disabled:opacity-50 relative cursor-pointer
9
- group/radio
10
- HEREDOC
11
-
12
- def initialize(name: nil, value: nil, checked: false, id: nil, **attributes)
13
- @value = value
14
- @name = name
15
- @checked = checked
16
- @id = id || name
17
- super(**attributes)
18
- end
19
-
20
- def view_template(&)
21
- button(**@attributes) do
22
- span(
23
- class: "items-center justify-center hidden group-data-[checked=true]/radio:flex",
24
- ) do
25
- icon("circle", class: "size-2.5 fill-primary")
26
- end
27
-
28
- input(
29
- type: "radio",
30
- value: @value,
31
- class: "-translate-x-full pointer-events-none absolute top-0 left-0 size-4 opacity-0",
32
- name: @name,
33
- tabindex: -1,
34
- checked: @checked,
35
- aria: { hidden: true },
36
- data: { input: "" },
37
- )
38
- end
39
- end
40
-
41
- def default_attributes
42
- {
43
- id: @id,
44
- type: "button",
45
- tabindex: -1,
46
- role: "radio",
47
- aria: {
48
- checked: @checked.to_s,
49
- },
50
- data: {
51
- checked: @checked.to_s,
52
- value: @value,
53
- "radio-group-target": "item",
54
- action: <<~HEREDOC,
55
- click->radio-group#setChecked
56
- keydown.right->radio-group#setCheckedToNext:prevent
57
- keydown.down->radio-group#setCheckedToNext:prevent
58
- keydown.up->radio-group#setCheckedToPrev:prevent
59
- keydown.left->radio-group#setCheckedToPrev:prevent
60
- keydown.enter->radio-group#preventDefault
61
- HEREDOC
62
- },
63
- }
64
- end
65
- end
66
- end
@@ -1,194 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class Select < Base
5
- STYLES = "w-full"
6
-
7
- NATIVE_STYLES = <<~HEREDOC
8
- flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-2 pr-8
9
- text-base shadow-sm transition-colors placeholder:text-muted-foreground
10
- focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring
11
- disabled:cursor-not-allowed disabled:opacity-50 md:text-sm appearance-none
12
- relative
13
- HEREDOC
14
-
15
- NATIVE_OPTION_STYLES = "bg-popover text-popover-foreground"
16
-
17
- def initialize(id: nil,
18
- name: nil,
19
- value: nil,
20
- placeholder: nil,
21
- side: :bottom,
22
- native: false,
23
- dir: "ltr",
24
- include_blank: false,
25
- disabled: false,
26
- aria_id: "select-#{SecureRandom.hex(5)}",
27
- **attributes)
28
- @id = id || name
29
- @name = name
30
- @value = value
31
- @placeholder = placeholder
32
- @side = side
33
- @native = native
34
- @dir = dir
35
- @include_blank = include_blank
36
- @disabled = disabled
37
- @aria_id = aria_id
38
- super(**attributes)
39
- end
40
-
41
- def trigger(**attributes)
42
- SelectTrigger(
43
- id: @id,
44
- aria_id: @aria_id,
45
- dir: @dir,
46
- value: @value,
47
- placeholder: @placeholder,
48
- disabled: @disabled,
49
- **attributes,
50
- )
51
- end
52
-
53
- def content(**attributes, &)
54
- SelectContent(
55
- side: @side, aria_id: @aria_id, dir: @dir, include_blank: @include_blank, native: @native, **attributes, &
56
- )
57
- end
58
-
59
- def item(**attributes, &)
60
- SelectItem(aria_id: @aria_id, **attributes, &)
61
- end
62
-
63
- def label(**attributes, &)
64
- SelectLabel(aria_id: @aria_id, **attributes, &)
65
- end
66
-
67
- def group(**attributes, &)
68
- SelectGroup(aria_id: @aria_id, **attributes, &)
69
- end
70
-
71
- def items(collection, value_method:, text_method:, disabled_items: nil, &)
72
- vanish(&)
73
-
74
- if collection.first&.is_a?(Hash)
75
- collection = convert_collection_hash_to_struct(collection, value_method: value_method, text_method: text_method)
76
- end
77
-
78
- SelectTrigger(
79
- id: @id,
80
- aria_id: @aria_id,
81
- dir: @dir,
82
- value: @value,
83
- placeholder: @placeholder,
84
- disabled: @disabled,
85
- )
86
-
87
- SelectContent(aria_id: @aria_id, dir: @dir, include_blank: @include_blank, native: @native) do
88
- collection.each do |item|
89
- value = item.public_send(value_method)
90
- text = item.public_send(text_method)
91
-
92
- SelectItem(value: value, aria_id: @aria_id, disabled: item_disabled?(disabled_items, value)) { text }
93
- end
94
- end
95
- end
96
-
97
- def view_template(&)
98
- content = capture(&)
99
- element = Nokogiri::HTML.fragment(content.to_s)
100
- content_element = element.css('[data-select-target="content"]')
101
-
102
- if @native
103
- div(class: "relative") do
104
- select(**@attributes) do
105
- if @placeholder || @include_blank
106
- option(value: "", class: NATIVE_OPTION_STYLES) { @placeholder }
107
- end
108
-
109
- build_native_options(content_element)
110
- end
111
-
112
- icon("chevron-down", class: "size-4 absolute opacity-50 top-1/2 -translate-y-1/2 right-3 pointer-events-none")
113
- end
114
- else
115
- div(**@attributes) do
116
- yield
117
-
118
- select(
119
- name: @name,
120
- disabled: @disabled,
121
- class: "sr-only",
122
- tabindex: -1,
123
- data: {
124
- "select-target": "select",
125
- },
126
- ) do
127
- option(value: "")
128
- build_native_options(content_element)
129
- end
130
- end
131
- end
132
- end
133
-
134
- def default_styles
135
- if @native
136
- NATIVE_STYLES
137
- else
138
- STYLES
139
- end
140
- end
141
-
142
- def default_attributes
143
- if @native
144
- {
145
- id: @id,
146
- name: @name,
147
- disabled: @disabled,
148
- }
149
- else
150
- {
151
- data: {
152
- side: @side,
153
- aria_id: @aria_id,
154
- controller: "select",
155
- "select-selected-value": @value,
156
- },
157
- }
158
- end
159
- end
160
-
161
- def build_native_options(content_element)
162
- content_element.children.each do |content_child|
163
- next if content_child.is_a?(Nokogiri::XML::Text) || content_child.is_a?(Nokogiri::XML::Comment)
164
-
165
- if content_child.attributes["data-select-target"]&.value == "group"
166
- group_label = content_child.at_css('[data-select-target="label"]')&.text
167
-
168
- optgroup(label: group_label, class: NATIVE_OPTION_STYLES) do
169
- content_child.css('[data-select-target="item"]').each do |i|
170
- option(
171
- value: i.attributes["data-value"].value,
172
- class: NATIVE_OPTION_STYLES,
173
- selected: i.attributes["data-value"].value == @value,
174
- disabled: i.attributes["data-disabled"]&.value == "",
175
- ) do
176
- i.text
177
- end
178
- end
179
- end
180
- elsif content_child.attributes["data-select-target"]&.value == "item"
181
-
182
- option(
183
- value: content_child.attributes["data-value"].value,
184
- class: NATIVE_OPTION_STYLES,
185
- selected: content_child.attributes["data-value"].value == @value,
186
- disabled: content_child.attributes["data-disabled"]&.value == "",
187
- ) do
188
- content_child.text
189
- end
190
- end
191
- end
192
- end
193
- end
194
- end
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class SelectContent < Base
5
- STYLES = <<~HEREDOC
6
- relative z-50 min-w-[8rem] max-h-108 overflow-y-auto overflow-x-hidden rounded-md border
7
- bg-popover text-popover-foreground p-1 shadow-md outline-none pointer-events-auto
8
- data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0
9
- data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95
10
- data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2
11
- data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2
12
- data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1
13
- data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1
14
- HEREDOC
15
-
16
- def initialize(side: :bottom, include_blank: false, native: false, dir: "ltr", aria_id: nil, **attributes)
17
- @side = side
18
- @include_blank = include_blank
19
- @native = native
20
- @dir = dir
21
- @aria_id = aria_id
22
- super(**attributes)
23
- end
24
-
25
- def view_template(&)
26
- div(
27
- class: "hidden fixed top-0 left-0 w-max z-50",
28
- data: { "select-target": "contentWrapper" },
29
- ) do
30
- div(**@attributes) do
31
- if @include_blank && !@native
32
- SelectItem(aria_id: @aria_id, value: "", class: "h-8", hide_icon: true) do
33
- @include_blank.is_a?(String) ? @include_blank : ""
34
- end
35
- end
36
-
37
- yield
38
- end
39
- end
40
- end
41
-
42
- def default_attributes
43
- {
44
- id: "#{@aria_id}-content",
45
- dir: @dir,
46
- tabindex: -1,
47
- role: "listbox",
48
- aria: {
49
- labelledby: "#{@aria_id}-trigger",
50
- orientation: "vertical",
51
- },
52
- data: {
53
- state: "closed",
54
- side: @side,
55
- "select-target": "content",
56
- action: <<~HEREDOC,
57
- keydown.up->select#focusLastItem:prevent
58
- keydown.down->select#focusFirstItem:prevent
59
- HEREDOC
60
- },
61
- }
62
- end
63
- end
64
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class SelectGroup < Base
5
- def initialize(aria_id:, **attributes)
6
- @aria_id = aria_id
7
- super(**attributes)
8
- end
9
-
10
- def view_template(&)
11
- div(**@attributes, &)
12
- end
13
-
14
- def default_attributes
15
- {
16
- role: "group",
17
- data: {
18
- "select-target": "group",
19
- },
20
- }
21
- end
22
- end
23
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class SelectItem < Base
5
- STYLES = <<~HEREDOC
6
- group/item relative flex w-full cursor-default select-none items-center
7
- rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent
8
- focus:text-accent-foreground data-[disabled]:pointer-events-none#{" "}
9
- data-[disabled]:opacity-50
10
- HEREDOC
11
-
12
- def initialize(value: nil, disabled: false, hide_icon: false, aria_id: nil, **attributes)
13
- @value = value
14
- @disabled = disabled
15
- @aria_id = aria_id
16
- @hide_icon = hide_icon
17
- @aria_labelledby = "#{@aria_id}-#{@value.dasherize.parameterize}"
18
- super(**attributes)
19
- end
20
-
21
- def view_template(&)
22
- div(**@attributes) do
23
- span(id: @aria_labelledby, &)
24
-
25
- unless @hide_icon
26
- span(class: "absolute right-2 h-3.5 w-3.5 items-center hidden justify-center
27
- group-aria-[selected=true]/item:flex") do
28
- icon("check", class: "size-4")
29
- end
30
- end
31
- end
32
- end
33
-
34
- def default_attributes
35
- {
36
- role: "option",
37
- tabindex: -1,
38
- aria: {
39
- selected: false,
40
- labelledby: @aria_labelledby,
41
- },
42
- data: {
43
- disabled: @disabled,
44
- value: @value,
45
- action: <<~HEREDOC,
46
- click->select#selectItem
47
- keydown.up->select#focusPrevItem:prevent:stop
48
- keydown.down->select#focusNextItem:prevent:stop
49
- keydown.enter->select#selectItem:prevent
50
- keydown.space->select#selectItem:prevent
51
- mouseover->select#focusItem
52
- mouseout->select#focusContent
53
- HEREDOC
54
- "select-target": "item",
55
- },
56
- }
57
- end
58
- end
59
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class SelectLabel < Base
5
- STYLES = "px-2 py-1.5 text-sm font-semibold"
6
-
7
- def initialize(aria_id: nil, **attributes)
8
- @aria_id = aria_id
9
- super(**attributes)
10
- end
11
-
12
- def view_template(&)
13
- div(**@attributes, &)
14
- end
15
-
16
- def default_attributes
17
- {
18
- data: {
19
- "select-target": "label",
20
- },
21
- }
22
- end
23
- end
24
- end
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class SelectTrigger < Base
5
- STYLES = <<~HEREDOC
6
- flex h-9 items-center justify-between whitespace-nowrap rounded-md border
7
- border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background
8
- data-[placeholder]:data-[has-value=false]:text-muted-foreground focus:outline-none focus:ring-1
9
- focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1
10
- w-full cursor-pointer
11
- HEREDOC
12
-
13
- def initialize(id: nil, value: nil, placeholder: nil, dir: "ltr", aria_id: nil, **attributes)
14
- @id = id
15
- @value = value
16
- @placeholder = placeholder
17
- @dir = dir
18
- @aria_id = aria_id
19
- super(**attributes)
20
- end
21
-
22
- def view_template
23
- button(**@attributes) do
24
- span(class: "pointer-events-none", data: { "select-target": "triggerText" }) do
25
- @value || @placeholder
26
- end
27
-
28
- icon("chevron-down", class: "size-4 opacity-50 text-foreground")
29
- end
30
- end
31
-
32
- def default_attributes
33
- {
34
- type: "button",
35
- id: @id,
36
- dir: @dir,
37
- role: "combobox",
38
- aria: {
39
- autocomplete: "none",
40
- expanded: false,
41
- controls: "#{@aria_id}-content",
42
- },
43
- data: {
44
- placeholder: @placeholder,
45
- has_value: @value.present?.to_s,
46
- action: <<~HEREDOC,
47
- click->select#toggle
48
- keydown.down->select#toggle:prevent
49
- keydown.up->select#toggle:prevent
50
- HEREDOC
51
- "select-target": "trigger",
52
- },
53
- }
54
- end
55
- end
56
- end
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class Sheet < Base
5
- STYLES = "inline-block"
6
-
7
- def initialize(side: :right, aria_id: "sheet-#{SecureRandom.hex(5)}", **attributes)
8
- @side = side
9
- @aria_id = aria_id
10
- super(**attributes)
11
- end
12
-
13
- def trigger(**attributes, &)
14
- SheetTrigger(aria_id: @aria_id, **attributes, &)
15
- end
16
-
17
- def content(**attributes, &)
18
- SheetContent(side: @side, aria_id: @aria_id, **attributes, &)
19
- end
20
-
21
- def header(**attributes, &)
22
- SheetHeader(**attributes, &)
23
- end
24
-
25
- def title(**attributes, &)
26
- SheetTitle(aria_id: @aria_id, **attributes, &)
27
- end
28
-
29
- def description(**attributes, &)
30
- SheetDescription(aria_id: @aria_id, **attributes, &)
31
- end
32
-
33
- def footer(**attributes, &)
34
- SheetFooter(**attributes, &)
35
- end
36
-
37
- def close(**attributes, &)
38
- SheetClose(**attributes, &)
39
- end
40
-
41
- def view_template(&)
42
- div(**@attributes, &)
43
- end
44
-
45
- def default_attributes
46
- {
47
- data: {
48
- controller: "dialog",
49
- },
50
- }
51
- end
52
- end
53
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ShadcnPhlexcomponents
4
- class SheetClose < Base
5
- def initialize(as_child: false, **attributes)
6
- @as_child = as_child
7
- super(**attributes)
8
- end
9
-
10
- def view_template(&)
11
- if @as_child
12
- content = capture(&)
13
- element = find_as_child(content.to_s)
14
-
15
- vanish(&)
16
- element_attributes = nokogiri_attributes_to_hash(element)
17
- styles = TAILWIND_MERGER.merge("#{@attributes[:class]} #{element_attributes[:class]}")
18
- merged_attributes = mix(@attributes, element_attributes)
19
- merged_attributes[:class] = styles
20
-
21
- if element.name == "button"
22
- merged_attributes.delete(:role)
23
- end
24
-
25
- send(element.name, **merged_attributes) do
26
- sanitize_as_child(element.children.to_s)
27
- end
28
- else
29
- div(**@attributes, &)
30
- end
31
- end
32
-
33
- def default_attributes
34
- {
35
- role: "button",
36
- data: {
37
- action: "click->dialog#close",
38
- },
39
- }
40
- end
41
- end
42
- end