shadcn_phlexcomponents 0.1.9 → 0.1.14

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 (256) hide show
  1. checksums.yaml +4 -4
  2. data/app/javascript/controllers/accordion_controller.ts +136 -0
  3. data/app/javascript/controllers/alert_dialog_controller.ts +12 -0
  4. data/app/javascript/controllers/avatar_controller.ts +24 -0
  5. data/app/javascript/controllers/checkbox_controller.ts +41 -0
  6. data/app/javascript/controllers/collapsible_controller.ts +52 -0
  7. data/app/javascript/controllers/combobox_controller.ts +376 -0
  8. data/app/javascript/controllers/command_controller.ts +301 -0
  9. data/app/javascript/controllers/date_picker_controller.ts +334 -0
  10. data/app/javascript/controllers/date_range_picker_controller.ts +253 -0
  11. data/app/javascript/controllers/dialog_controller.ts +115 -0
  12. data/app/javascript/controllers/dropdown_menu_controller.ts +309 -0
  13. data/app/javascript/controllers/dropdown_menu_sub_controller.ts +152 -0
  14. data/app/javascript/controllers/form_field_controller.ts +27 -0
  15. data/app/javascript/controllers/hover_card_controller.ts +103 -0
  16. data/app/javascript/controllers/{loading_button_controller.js → loading_button_controller.ts} +7 -2
  17. data/app/javascript/controllers/popover_controller.ts +118 -0
  18. data/app/javascript/controllers/progress_controller.ts +23 -0
  19. data/app/javascript/controllers/radio_group_controller.ts +113 -0
  20. data/app/javascript/controllers/select_controller.ts +341 -0
  21. data/app/javascript/controllers/{sidebar_controller.js → sidebar_controller.ts} +6 -2
  22. data/app/javascript/controllers/sidebar_trigger_controller.ts +21 -0
  23. data/app/javascript/controllers/slider_controller.ts +114 -0
  24. data/app/javascript/controllers/switch_controller.ts +37 -0
  25. data/app/javascript/controllers/tabs_controller.ts +87 -0
  26. data/app/javascript/controllers/theme_switcher_controller.ts +40 -0
  27. data/app/javascript/controllers/toast_container_controller.ts +67 -0
  28. data/app/javascript/controllers/toast_controller.ts +34 -0
  29. data/app/javascript/controllers/toggle_controller.ts +28 -0
  30. data/app/javascript/controllers/toggle_group_controller.ts +28 -0
  31. data/app/javascript/controllers/tooltip_controller.ts +110 -0
  32. data/app/javascript/shadcn_phlexcomponents.ts +61 -0
  33. data/app/javascript/utils/command.ts +544 -0
  34. data/app/javascript/utils/floating_ui.ts +196 -0
  35. data/app/javascript/utils/index.ts +417 -0
  36. data/app/stylesheets/date_picker.css +81 -101
  37. data/app/stylesheets/nouislider.css +173 -0
  38. data/app/stylesheets/tw-animate.css +486 -0
  39. data/lib/install/install_shadcn_phlexcomponents.rb +16 -3
  40. data/lib/shadcn_phlexcomponents/alias.rb +6 -1
  41. data/lib/shadcn_phlexcomponents/components/accordion.rb +130 -0
  42. data/lib/shadcn_phlexcomponents/components/alert.rb +59 -0
  43. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +279 -0
  44. data/lib/shadcn_phlexcomponents/components/{aspect_ratio/aspect_ratio.rb → aspect_ratio.rb} +2 -2
  45. data/lib/shadcn_phlexcomponents/components/avatar.rb +63 -0
  46. data/lib/shadcn_phlexcomponents/components/badge.rb +35 -0
  47. data/lib/shadcn_phlexcomponents/components/base.rb +48 -7
  48. data/lib/shadcn_phlexcomponents/components/breadcrumb.rb +150 -0
  49. data/lib/shadcn_phlexcomponents/components/button.rb +49 -0
  50. data/lib/shadcn_phlexcomponents/components/card.rb +88 -0
  51. data/lib/shadcn_phlexcomponents/components/{checkbox/checkbox.rb → checkbox.rb} +18 -14
  52. data/lib/shadcn_phlexcomponents/components/{checkbox_group/checkbox_group.rb → checkbox_group.rb} +7 -8
  53. data/lib/shadcn_phlexcomponents/components/collapsible.rb +90 -0
  54. data/lib/shadcn_phlexcomponents/components/combobox.rb +428 -0
  55. data/lib/shadcn_phlexcomponents/components/command.rb +381 -0
  56. data/lib/shadcn_phlexcomponents/components/date_picker.rb +208 -0
  57. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +143 -0
  58. data/lib/shadcn_phlexcomponents/components/dialog.rb +236 -0
  59. data/lib/shadcn_phlexcomponents/components/dropdown_menu.rb +283 -0
  60. data/lib/shadcn_phlexcomponents/components/dropdown_menu_sub.rb +136 -0
  61. data/lib/shadcn_phlexcomponents/components/form/form_checkbox.rb +6 -7
  62. data/lib/shadcn_phlexcomponents/components/form/form_checkbox_group.rb +2 -2
  63. data/lib/shadcn_phlexcomponents/components/form/form_combobox.rb +64 -0
  64. data/lib/shadcn_phlexcomponents/components/form/form_date_picker.rb +3 -4
  65. data/lib/shadcn_phlexcomponents/components/form/form_date_range_picker.rb +27 -41
  66. data/lib/shadcn_phlexcomponents/components/form/form_error.rb +1 -1
  67. data/lib/shadcn_phlexcomponents/components/form/form_helpers.rb +43 -8
  68. data/lib/shadcn_phlexcomponents/components/form/form_hint.rb +1 -1
  69. data/lib/shadcn_phlexcomponents/components/form/form_input.rb +3 -4
  70. data/lib/shadcn_phlexcomponents/components/form/form_radio_group.rb +4 -5
  71. data/lib/shadcn_phlexcomponents/components/form/form_select.rb +3 -4
  72. data/lib/shadcn_phlexcomponents/components/form/form_slider.rb +91 -0
  73. data/lib/shadcn_phlexcomponents/components/form/form_switch.rb +7 -6
  74. data/lib/shadcn_phlexcomponents/components/form/form_textarea.rb +3 -4
  75. data/lib/shadcn_phlexcomponents/components/{form/form.rb → form.rb} +36 -4
  76. data/lib/shadcn_phlexcomponents/components/hover_card.rb +111 -0
  77. data/lib/shadcn_phlexcomponents/components/input.rb +31 -0
  78. data/lib/shadcn_phlexcomponents/components/label.rb +16 -0
  79. data/lib/shadcn_phlexcomponents/components/{link/link.rb → link.rb} +10 -3
  80. data/lib/shadcn_phlexcomponents/components/{loading_button/loading_button.rb → loading_button.rb} +9 -2
  81. data/lib/shadcn_phlexcomponents/components/pagination.rb +166 -0
  82. data/lib/shadcn_phlexcomponents/components/popover.rb +116 -0
  83. data/lib/shadcn_phlexcomponents/components/{progress/progress.rb → progress.rb} +4 -4
  84. data/lib/shadcn_phlexcomponents/components/radio_group.rb +155 -0
  85. data/lib/shadcn_phlexcomponents/components/select.rb +406 -0
  86. data/lib/shadcn_phlexcomponents/components/{separator/separator.rb → separator.rb} +9 -8
  87. data/lib/shadcn_phlexcomponents/components/sheet.rb +243 -0
  88. data/lib/shadcn_phlexcomponents/components/{skeleton/skeleton.rb → skeleton.rb} +1 -1
  89. data/lib/shadcn_phlexcomponents/components/slider.rb +72 -0
  90. data/lib/shadcn_phlexcomponents/components/switch.rb +75 -0
  91. data/lib/shadcn_phlexcomponents/components/table.rb +140 -0
  92. data/lib/shadcn_phlexcomponents/components/tabs.rb +135 -0
  93. data/lib/shadcn_phlexcomponents/components/textarea.rb +24 -0
  94. data/lib/shadcn_phlexcomponents/components/toast.rb +153 -0
  95. data/lib/shadcn_phlexcomponents/components/{toast/toast_container.rb → toast_container.rb} +23 -4
  96. data/lib/shadcn_phlexcomponents/components/toggle.rb +54 -0
  97. data/lib/shadcn_phlexcomponents/components/tooltip.rb +132 -0
  98. data/lib/shadcn_phlexcomponents/engine.rb +1 -5
  99. data/lib/shadcn_phlexcomponents/initializers/shadcn_phlexcomponents.rb +25 -0
  100. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  101. data/lib/tasks/install.rake +1 -1
  102. metadata +83 -167
  103. data/app/javascript/controllers/accordion_controller.js +0 -124
  104. data/app/javascript/controllers/alert_dialog_controller.js +0 -21
  105. data/app/javascript/controllers/avatar_controller.js +0 -15
  106. data/app/javascript/controllers/checkbox_controller.js +0 -28
  107. data/app/javascript/controllers/collapsible_controller.js +0 -35
  108. data/app/javascript/controllers/combobox_controller.js +0 -54
  109. data/app/javascript/controllers/date_picker_controller.js +0 -253
  110. data/app/javascript/controllers/date_range_picker_controller.js +0 -344
  111. data/app/javascript/controllers/dialog_controller.js +0 -114
  112. data/app/javascript/controllers/dropdown_menu_controller.js +0 -171
  113. data/app/javascript/controllers/form_field_controller.js +0 -24
  114. data/app/javascript/controllers/hover_card_controller.js +0 -21
  115. data/app/javascript/controllers/popover_controller.js +0 -113
  116. data/app/javascript/controllers/progress_controller.js +0 -14
  117. data/app/javascript/controllers/radio_group_controller.js +0 -90
  118. data/app/javascript/controllers/select_controller.js +0 -274
  119. data/app/javascript/controllers/sidebar_trigger_controller.js +0 -15
  120. data/app/javascript/controllers/switch_controller.js +0 -24
  121. data/app/javascript/controllers/tabs_controller.js +0 -73
  122. data/app/javascript/controllers/theme_switcher_controller.js +0 -32
  123. data/app/javascript/controllers/toast_container_controller.js +0 -22
  124. data/app/javascript/controllers/toast_controller.js +0 -45
  125. data/app/javascript/controllers/tooltip_controller.js +0 -40
  126. data/app/javascript/shadcn_phlexcomponents.js +0 -53
  127. data/app/javascript/utils.js +0 -184
  128. data/app/stylesheets/choices.css +0 -324
  129. data/app/stylesheets/tailwindcss-animate.css +0 -318
  130. data/lib/shadcn_phlexcomponents/components/accordion/accordion.rb +0 -38
  131. data/lib/shadcn_phlexcomponents/components/accordion/accordion_content.rb +0 -30
  132. data/lib/shadcn_phlexcomponents/components/accordion/accordion_item.rb +0 -26
  133. data/lib/shadcn_phlexcomponents/components/accordion/accordion_trigger.rb +0 -46
  134. data/lib/shadcn_phlexcomponents/components/alert/alert.rb +0 -40
  135. data/lib/shadcn_phlexcomponents/components/alert/alert_description.rb +0 -11
  136. data/lib/shadcn_phlexcomponents/components/alert/alert_title.rb +0 -11
  137. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog.rb +0 -60
  138. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_action.rb +0 -22
  139. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_action_to.rb +0 -40
  140. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_cancel.rb +0 -22
  141. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_content.rb +0 -40
  142. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_description.rb +0 -22
  143. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_footer.rb +0 -11
  144. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_header.rb +0 -11
  145. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_title.rb +0 -22
  146. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_trigger.rb +0 -50
  147. data/lib/shadcn_phlexcomponents/components/avatar/avatar.rb +0 -31
  148. data/lib/shadcn_phlexcomponents/components/avatar/avatar_fallback.rb +0 -21
  149. data/lib/shadcn_phlexcomponents/components/avatar/avatar_image.rb +0 -19
  150. data/lib/shadcn_phlexcomponents/components/badge/badge.rb +0 -30
  151. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb.rb +0 -53
  152. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_ellipsis.rb +0 -23
  153. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_item.rb +0 -11
  154. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_link.rb +0 -7
  155. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_page.rb +0 -21
  156. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_separator.rb +0 -26
  157. data/lib/shadcn_phlexcomponents/components/button/button.rb +0 -53
  158. data/lib/shadcn_phlexcomponents/components/card/card.rb +0 -31
  159. data/lib/shadcn_phlexcomponents/components/card/card_content.rb +0 -11
  160. data/lib/shadcn_phlexcomponents/components/card/card_description.rb +0 -11
  161. data/lib/shadcn_phlexcomponents/components/card/card_footer.rb +0 -11
  162. data/lib/shadcn_phlexcomponents/components/card/card_header.rb +0 -11
  163. data/lib/shadcn_phlexcomponents/components/card/card_title.rb +0 -11
  164. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible.rb +0 -31
  165. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible_content.rb +0 -24
  166. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible_trigger.rb +0 -50
  167. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker.rb +0 -87
  168. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker_content.rb +0 -45
  169. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker_trigger.rb +0 -64
  170. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker.rb +0 -105
  171. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker_content.rb +0 -9
  172. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker_trigger.rb +0 -9
  173. data/lib/shadcn_phlexcomponents/components/dialog/dialog.rb +0 -52
  174. data/lib/shadcn_phlexcomponents/components/dialog/dialog_close.rb +0 -42
  175. data/lib/shadcn_phlexcomponents/components/dialog/dialog_content.rb +0 -54
  176. data/lib/shadcn_phlexcomponents/components/dialog/dialog_description.rb +0 -22
  177. data/lib/shadcn_phlexcomponents/components/dialog/dialog_footer.rb +0 -11
  178. data/lib/shadcn_phlexcomponents/components/dialog/dialog_header.rb +0 -11
  179. data/lib/shadcn_phlexcomponents/components/dialog/dialog_title.rb +0 -22
  180. data/lib/shadcn_phlexcomponents/components/dialog/dialog_trigger.rb +0 -50
  181. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu.rb +0 -50
  182. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_content.rb +0 -52
  183. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_item.rb +0 -56
  184. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_item_to.rb +0 -28
  185. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_label.rb +0 -11
  186. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_separator.rb +0 -20
  187. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_trigger.rb +0 -57
  188. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card.rb +0 -33
  189. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card_content.rb +0 -32
  190. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card_trigger.rb +0 -44
  191. data/lib/shadcn_phlexcomponents/components/input/input.rb +0 -32
  192. data/lib/shadcn_phlexcomponents/components/label/label.rb +0 -14
  193. data/lib/shadcn_phlexcomponents/components/pagination/pagination.rb +0 -38
  194. data/lib/shadcn_phlexcomponents/components/pagination/pagination_ellipsis.rb +0 -24
  195. data/lib/shadcn_phlexcomponents/components/pagination/pagination_link.rb +0 -34
  196. data/lib/shadcn_phlexcomponents/components/pagination/pagination_next.rb +0 -32
  197. data/lib/shadcn_phlexcomponents/components/pagination/pagination_previous.rb +0 -32
  198. data/lib/shadcn_phlexcomponents/components/popover/popover.rb +0 -34
  199. data/lib/shadcn_phlexcomponents/components/popover/popover_content.rb +0 -40
  200. data/lib/shadcn_phlexcomponents/components/popover/popover_trigger.rb +0 -50
  201. data/lib/shadcn_phlexcomponents/components/radio_group/radio_group.rb +0 -88
  202. data/lib/shadcn_phlexcomponents/components/radio_group/radio_group_item.rb +0 -66
  203. data/lib/shadcn_phlexcomponents/components/select/select.rb +0 -194
  204. data/lib/shadcn_phlexcomponents/components/select/select_content.rb +0 -64
  205. data/lib/shadcn_phlexcomponents/components/select/select_group.rb +0 -23
  206. data/lib/shadcn_phlexcomponents/components/select/select_item.rb +0 -59
  207. data/lib/shadcn_phlexcomponents/components/select/select_label.rb +0 -24
  208. data/lib/shadcn_phlexcomponents/components/select/select_trigger.rb +0 -56
  209. data/lib/shadcn_phlexcomponents/components/sheet/sheet.rb +0 -53
  210. data/lib/shadcn_phlexcomponents/components/sheet/sheet_close.rb +0 -42
  211. data/lib/shadcn_phlexcomponents/components/sheet/sheet_content.rb +0 -65
  212. data/lib/shadcn_phlexcomponents/components/sheet/sheet_description.rb +0 -22
  213. data/lib/shadcn_phlexcomponents/components/sheet/sheet_footer.rb +0 -11
  214. data/lib/shadcn_phlexcomponents/components/sheet/sheet_header.rb +0 -11
  215. data/lib/shadcn_phlexcomponents/components/sheet/sheet_title.rb +0 -22
  216. data/lib/shadcn_phlexcomponents/components/sheet/sheet_trigger.rb +0 -50
  217. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar.rb +0 -108
  218. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_container.rb +0 -11
  219. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_content.rb +0 -11
  220. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_footer.rb +0 -11
  221. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group.rb +0 -11
  222. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group_content.rb +0 -11
  223. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group_label.rb +0 -16
  224. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_header.rb +0 -11
  225. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_inset.rb +0 -15
  226. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu.rb +0 -11
  227. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_button.rb +0 -61
  228. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_item.rb +0 -9
  229. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub.rb +0 -14
  230. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub_button.rb +0 -48
  231. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub_item.rb +0 -9
  232. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_trigger.rb +0 -40
  233. data/lib/shadcn_phlexcomponents/components/switch/switch.rb +0 -66
  234. data/lib/shadcn_phlexcomponents/components/table/table.rb +0 -75
  235. data/lib/shadcn_phlexcomponents/components/table/table_body.rb +0 -11
  236. data/lib/shadcn_phlexcomponents/components/table/table_caption.rb +0 -11
  237. data/lib/shadcn_phlexcomponents/components/table/table_cell.rb +0 -11
  238. data/lib/shadcn_phlexcomponents/components/table/table_footer.rb +0 -11
  239. data/lib/shadcn_phlexcomponents/components/table/table_head.rb +0 -14
  240. data/lib/shadcn_phlexcomponents/components/table/table_header.rb +0 -11
  241. data/lib/shadcn_phlexcomponents/components/table/table_row.rb +0 -11
  242. data/lib/shadcn_phlexcomponents/components/tabs/tabs.rb +0 -38
  243. data/lib/shadcn_phlexcomponents/components/tabs/tabs_content.rb +0 -35
  244. data/lib/shadcn_phlexcomponents/components/tabs/tabs_list.rb +0 -23
  245. data/lib/shadcn_phlexcomponents/components/tabs/tabs_trigger.rb +0 -45
  246. data/lib/shadcn_phlexcomponents/components/textarea/textarea.rb +0 -29
  247. data/lib/shadcn_phlexcomponents/components/toast/toast.rb +0 -101
  248. data/lib/shadcn_phlexcomponents/components/toast/toast_action.rb +0 -39
  249. data/lib/shadcn_phlexcomponents/components/toast/toast_action_to.rb +0 -28
  250. data/lib/shadcn_phlexcomponents/components/toast/toast_content.rb +0 -11
  251. data/lib/shadcn_phlexcomponents/components/toast/toast_description.rb +0 -11
  252. data/lib/shadcn_phlexcomponents/components/toast/toast_title.rb +0 -11
  253. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip.rb +0 -34
  254. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip_content.rb +0 -39
  255. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip_trigger.rb +0 -48
  256. /data/lib/shadcn_phlexcomponents/components/{theme_switcher/theme_switcher.rb → theme_switcher.rb} +0 -0
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class DateRangePicker < Base
5
+ class_variants(base: "w-full")
6
+
7
+ def initialize(
8
+ name: nil,
9
+ value: nil,
10
+ id: nil,
11
+ format: "DD/MM/YYYY",
12
+ select_only: false,
13
+ placeholder: nil,
14
+ disabled: false,
15
+ options: {},
16
+ mask: true,
17
+ **attributes
18
+ )
19
+ if name && !name.is_a?(Array)
20
+ raise ArgumentError, "Expected an array for \"name\", got #{name.class}"
21
+ end
22
+
23
+ if value && !value.is_a?(Array)
24
+ raise ArgumentError, "Expected an array for \"value\", got #{value.class}"
25
+ end
26
+
27
+ if value
28
+ value = value.map do |v|
29
+ if v.is_a?(String)
30
+ DateTime.parse(v) rescue nil
31
+ else
32
+ v
33
+ end
34
+ end
35
+ end
36
+
37
+ @name = name ? name[0] : nil
38
+ @end_name = name ? name[1] : nil
39
+ @value = (value ? value[0] : nil)&.utc&.iso8601
40
+ @end_value = (value ? value[1] : nil)&.utc&.iso8601
41
+ @id = id
42
+ @format = format
43
+ @select_only = select_only
44
+ @placeholder = placeholder
45
+ @disabled = disabled
46
+ @mask = mask
47
+ @aria_id = "date-range-picker-#{SecureRandom.hex(5)}"
48
+ @options = options
49
+ super(**attributes)
50
+ end
51
+
52
+ def default_attributes
53
+ {
54
+ data: {
55
+ controller: "date-range-picker",
56
+ value: @value,
57
+ end_value: @end_value,
58
+ format: @format,
59
+ options: @options.to_json,
60
+ mask: @mask.to_s,
61
+ },
62
+ }
63
+ end
64
+
65
+ def view_template(&)
66
+ div(**@attributes) do
67
+ overlay('date-range-picker')
68
+
69
+ input(
70
+ type: :hidden,
71
+ name: @name,
72
+ value: @value,
73
+ data: { date_range_picker_target: "hiddenInput" },
74
+ )
75
+
76
+ input(
77
+ type: :hidden,
78
+ name: @end_name,
79
+ value: @end_value,
80
+ data: { date_range_picker_target: "endHiddenInput" },
81
+ )
82
+
83
+ if @select_only
84
+ # For select_only date picker, id is passed to button so that clicking on its
85
+ # label will trigger the popover to appear
86
+ DateRangePickerTrigger(
87
+ disabled: @disabled,
88
+ aria_id: @aria_id,
89
+ select_only: @select_only,
90
+ id: @id,
91
+ placeholder: @placeholder,
92
+ )
93
+ else
94
+ div(
95
+ class: <<~HEREDOC,
96
+ focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]
97
+ data-[focus=true]:border-ring data-[focus=true]:ring-ring/50 data-[focus=true]:ring-[3px]
98
+ data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 flex shadow-xs transition-[color,box-shadow]
99
+ rounded-md border bg-transparent dark:bg-input/30 border-input outline-none h-9 flex items-center
100
+ aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive
101
+ HEREDOC
102
+ data: { date_range_picker_target: "inputContainer", disabled: @disabled },
103
+ ) do
104
+ input(
105
+ id: @id,
106
+ placeholder: @placeholder || "#{@format} - #{@format}",
107
+ type: :text,
108
+ class: "md:text-sm placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex h-9 w-full min-w-0 text-base outline-none px-3 py-1",
109
+ disabled: @disabled,
110
+ data: {
111
+ date_range_picker_target: "input",
112
+ action: "input->date-range-picker#inputDate
113
+ blur->date-range-picker#inputBlur
114
+ focus->date-range-picker#setContainerFocus",
115
+ },
116
+ )
117
+
118
+ DateRangePickerTrigger(
119
+ disabled: @disabled,
120
+ aria_id: @aria_id,
121
+ select_only: @select_only,
122
+ placeholder: @placeholder,
123
+ )
124
+ end
125
+ end
126
+
127
+ DateRangePickerContent(aria_id: @aria_id)
128
+ end
129
+ end
130
+ end
131
+
132
+ class DateRangePickerTrigger < DatePickerTrigger
133
+ def stimulus_controller_name
134
+ "date-range-picker"
135
+ end
136
+ end
137
+
138
+ class DateRangePickerContent < DatePickerContent
139
+ def stimulus_controller_name
140
+ "date-range-picker"
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,236 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Dialog < Base
5
+ class_variants(base: "inline-flex max-w-fit")
6
+
7
+ def initialize(open: false, **attributes)
8
+ @open = open
9
+ @aria_id = "dialog-#{SecureRandom.hex(5)}"
10
+ super(**attributes)
11
+ end
12
+
13
+ def trigger(**attributes, &)
14
+ DialogTrigger(aria_id: @aria_id, **attributes, &)
15
+ end
16
+
17
+ def content(**attributes, &)
18
+ DialogContent(aria_id: @aria_id, **attributes, &)
19
+ end
20
+
21
+ def header(**attributes, &)
22
+ DialogHeader(**attributes, &)
23
+ end
24
+
25
+ def title(**attributes, &)
26
+ DialogTitle(aria_id: @aria_id, **attributes, &)
27
+ end
28
+
29
+ def description(**attributes, &)
30
+ DialogDescription(aria_id: @aria_id, **attributes, &)
31
+ end
32
+
33
+ def footer(**attributes, &)
34
+ DialogFooter(**attributes, &)
35
+ end
36
+
37
+ def close(**attributes, &)
38
+ DialogClose(**attributes, &)
39
+ end
40
+
41
+ def default_attributes
42
+ {
43
+ data: {
44
+ controller: "dialog",
45
+ dialog_is_open_value: @open.to_s
46
+ }
47
+ }
48
+ end
49
+
50
+ def view_template(&)
51
+ div(**@attributes) do
52
+ overlay("dialog")
53
+
54
+ yield
55
+ end
56
+ end
57
+ end
58
+
59
+ class DialogTrigger < Base
60
+ def initialize(as_child: false, aria_id: nil, **attributes)
61
+ @as_child = as_child
62
+ @aria_id = aria_id
63
+ super(**attributes)
64
+ end
65
+
66
+ def default_attributes
67
+ {
68
+ role: "button",
69
+ aria: {
70
+ haspopup: "dialog",
71
+ expanded: "false",
72
+ controls: "#{@aria_id}-content",
73
+ },
74
+ data: {
75
+ as_child: @as_child.to_s,
76
+ dialog_target: "trigger",
77
+ action: "click->dialog#open"
78
+ },
79
+ }
80
+ end
81
+
82
+ def view_template(&)
83
+ if @as_child
84
+ content = capture(&)
85
+ element = find_as_child(content.to_s)
86
+ vanish(&)
87
+ merged_attributes = merged_as_child_attributes(element, @attributes)
88
+
89
+ send(element.name, **merged_attributes) do
90
+ sanitize_as_child(element.children.to_s)
91
+ end
92
+ else
93
+ div(**@attributes, &)
94
+ end
95
+ end
96
+ end
97
+
98
+ class DialogContent < Base
99
+ class_variants(
100
+ base: <<~HEREDOC,
101
+ bg-background data-[state=open]:animate-in data-[state=closed]:animate-out
102
+ data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95
103
+ data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)]
104
+ translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg
105
+ pointer-events-auto outline-none
106
+ HEREDOC
107
+ )
108
+
109
+ def initialize(aria_id: nil, **attributes)
110
+ @aria_id = aria_id
111
+ super(**attributes)
112
+ end
113
+
114
+ def default_attributes
115
+ {
116
+ id: "#{@aria_id}-content",
117
+ tabindex: -1,
118
+ role: "dialog",
119
+ aria: {
120
+ describedby: "#{@aria_id}-description",
121
+ labelledby: "#{@aria_id}-title",
122
+ },
123
+ data: {
124
+ state: "closed",
125
+ dialog_target: "content"
126
+ },
127
+ }
128
+ end
129
+
130
+ def view_template(&)
131
+ div(style: { display: "none" }, **@attributes) do
132
+ yield
133
+
134
+ button(
135
+ class: <<~HEREDOC,
136
+ ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground
137
+ absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2
138
+ focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none
139
+ [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4
140
+ HEREDOC
141
+ data: {
142
+ action: "click->dialog#close",
143
+ },
144
+ ) do
145
+ icon("x", class: "size-4")
146
+ span(class: "sr-only") { "close" }
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ class DialogHeader < Base
153
+ class_variants(base: "flex flex-col gap-2 text-center sm:text-left")
154
+
155
+ def view_template(&)
156
+ div(**@attributes, &)
157
+ end
158
+ end
159
+
160
+ class DialogTitle < Base
161
+ class_variants(base: "text-lg leading-none font-semibold")
162
+
163
+ def initialize(aria_id: nil, **attributes)
164
+ @aria_id = aria_id
165
+ super(**attributes)
166
+ end
167
+
168
+ def default_attributes
169
+ {
170
+ id: "#{@aria_id}-title",
171
+ }
172
+ end
173
+
174
+ def view_template(&)
175
+ h2(**@attributes, &)
176
+ end
177
+ end
178
+
179
+ class DialogDescription < Base
180
+ class_variants(base: "text-muted-foreground text-sm")
181
+
182
+ def initialize(aria_id: nil, **attributes)
183
+ @aria_id = aria_id
184
+ super(**attributes)
185
+ end
186
+
187
+ def default_attributes
188
+ {
189
+ id: "#{@aria_id}-description",
190
+ }
191
+ end
192
+
193
+ def view_template(&)
194
+ p(**@attributes, &)
195
+ end
196
+ end
197
+
198
+ class DialogFooter < Base
199
+ class_variants(base: "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end")
200
+
201
+ def view_template(&)
202
+ div(**@attributes, &)
203
+ end
204
+ end
205
+
206
+ class DialogClose < Base
207
+ def initialize(as_child: false, **attributes)
208
+ @as_child = as_child
209
+ super(**attributes)
210
+ end
211
+
212
+ def default_attributes
213
+ {
214
+ role: "button",
215
+ data: {
216
+ action: "click->dialog#close",
217
+ },
218
+ }
219
+ end
220
+
221
+ def view_template(&)
222
+ if @as_child
223
+ content = capture(&)
224
+ element = find_as_child(content.to_s)
225
+ vanish(&)
226
+ merged_attributes = merged_as_child_attributes(element, @attributes)
227
+
228
+ send(element.name, **merged_attributes) do
229
+ sanitize_as_child(element.children.to_s)
230
+ end
231
+ else
232
+ div(**@attributes, &)
233
+ end
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,283 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class DropdownMenu < Base
5
+ class_variants(base: "inline-flex max-w-fit")
6
+
7
+ def initialize(open: false, **attributes)
8
+ @aria_id = "dropdown-menu-#{SecureRandom.hex(5)}"
9
+ @open = open
10
+ super(**attributes)
11
+ end
12
+
13
+ def trigger(**attributes, &)
14
+ DropdownMenuTrigger(aria_id: @aria_id, **attributes, &)
15
+ end
16
+
17
+ def content(**attributes, &)
18
+ DropdownMenuContent(aria_id: @aria_id, side: @side, **attributes, &)
19
+ end
20
+
21
+ def label(**attributes, &)
22
+ DropdownMenuLabel(**attributes, &)
23
+ end
24
+
25
+ def item(**attributes, &)
26
+ DropdownMenuItem(**attributes, &)
27
+ end
28
+
29
+ def item_to(name = nil, options = nil, html_options = nil, &)
30
+ DropdownMenuItemTo(name, options, html_options, &)
31
+ end
32
+
33
+ def separator(**attributes, &)
34
+ DropdownMenuSeparator(**attributes, &)
35
+ end
36
+
37
+ def sub(**attributes, &)
38
+ DropdownMenuSub(aria_id: "#{@aria_id}-sub-#{SecureRandom.hex(5)}", **attributes, &)
39
+ end
40
+
41
+ def group(**attributes, &)
42
+ DropdownMenuGroup(**attributes, &)
43
+ end
44
+
45
+ def default_attributes
46
+ {
47
+ data: {
48
+ controller: "dropdown-menu",
49
+ dropdown_menu_is_open_value: @open.to_s,
50
+ },
51
+ }
52
+ end
53
+
54
+ def view_template(&)
55
+ div(**@attributes, &)
56
+ end
57
+ end
58
+
59
+ class DropdownMenuTrigger < Base
60
+ def initialize(as_child: false, aria_id: nil, **attributes)
61
+ @as_child = as_child
62
+ @aria_id = aria_id
63
+ super(**attributes)
64
+ end
65
+
66
+ def view_template(&)
67
+ if @as_child
68
+ content = capture(&)
69
+ element = find_as_child(content.to_s)
70
+ vanish(&)
71
+ merged_attributes = merged_as_child_attributes(element, @attributes)
72
+
73
+ send(element.name, **merged_attributes) do
74
+ sanitize_as_child(element.children.to_s)
75
+ end
76
+ else
77
+ div(**@attributes, &)
78
+ end
79
+ end
80
+
81
+ def default_attributes
82
+ {
83
+ id: "#{@aria_id}-trigger",
84
+ role: "button",
85
+ aria: {
86
+ haspopup: "menu",
87
+ expanded: false,
88
+ controls: "#{@aria_id}-content",
89
+ },
90
+ data: {
91
+ state: "closed",
92
+ as_child: @as_child.to_s,
93
+ dropdown_menu_target: "trigger",
94
+ action: <<~HEREDOC,
95
+ click->dropdown-menu#toggle
96
+ keydown.down->dropdown-menu#open:prevent
97
+ keydown.space->dropdown-menu#open:prevent
98
+ keydown.enter->dropdown-menu#open:prevent
99
+ HEREDOC
100
+ },
101
+ }
102
+ end
103
+ end
104
+
105
+ class DropdownMenuContent < Base
106
+ class_variants(
107
+ base: <<~HEREDOC,
108
+ bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out
109
+ data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95
110
+ data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2
111
+ data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50
112
+ max-h-(--radix-popper-available-height) min-w-[8rem] origin-(--radix-popper-transform-origin)
113
+ overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md pointer-events-auto outline-none
114
+ HEREDOC
115
+ )
116
+
117
+ def initialize(side: :bottom, align: :center, aria_id: nil, **attributes)
118
+ @side = side
119
+ @align = align
120
+ @aria_id = aria_id
121
+ super(**attributes)
122
+ end
123
+
124
+ def view_template(&)
125
+ div(
126
+ style: { display: "none" },
127
+ class: "fixed top-0 left-0 w-max z-50",
128
+ data: { dropdown_menu_target: "contentContainer" },
129
+ ) do
130
+ div(**@attributes, &)
131
+ end
132
+ end
133
+
134
+ def default_attributes
135
+ {
136
+ id: "#{@aria_id}-content",
137
+ tabindex: -1,
138
+ role: "menu",
139
+ aria: {
140
+ labelledby: "#{@aria_id}-trigger",
141
+ orientation: "vertical",
142
+ },
143
+ data: {
144
+ state: "closed",
145
+ side: @side,
146
+ align: @align,
147
+ dropdown_menu_target: "content",
148
+ action: <<~HEREDOC,
149
+ dropdown-menu:click:outside->dropdown-menu#clickOutside
150
+ keydown.up->dropdown-menu#focusItemByIndex:prevent:self
151
+ keydown.down->dropdown-menu#focusItemByIndex:prevent:self
152
+ HEREDOC
153
+ },
154
+ }
155
+ end
156
+ end
157
+
158
+ class DropdownMenuLabel < Base
159
+ class_variants(base: "px-2 py-1.5 text-sm font-medium data-[inset]:pl-8")
160
+
161
+ def view_template(&)
162
+ div(**@attributes, &)
163
+ end
164
+ end
165
+
166
+ class DropdownMenuItem < Base
167
+ class_variants(
168
+ base: <<~HEREDOC,
169
+ focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive
170
+ data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20
171
+ data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive
172
+ [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2
173
+ rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none
174
+ data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0
175
+ [&_svg:not([class*='size-'])]:size-4
176
+ HEREDOC
177
+ )
178
+
179
+ def initialize(as_child: false, variant: :default, disabled: false, **attributes)
180
+ @variant = variant
181
+ @as_child = as_child
182
+ @disabled = disabled
183
+ super(**attributes)
184
+ end
185
+
186
+ def view_template(&)
187
+ if @as_child
188
+ content = capture(&)
189
+ element = find_as_child(content.to_s)
190
+ vanish(&)
191
+ merged_attributes = merged_as_child_attributes(element, @attributes)
192
+
193
+ send(element.name, **merged_attributes) do
194
+ sanitize_as_child(element.children.to_s)
195
+ end
196
+ else
197
+ div(**@attributes, &)
198
+ end
199
+ end
200
+
201
+ def default_attributes
202
+ {
203
+ role: "menuitem",
204
+ tabindex: -1,
205
+ data: {
206
+ variant: @variant,
207
+ disabled: @disabled,
208
+ dropdown_menu_target: "item",
209
+ action: <<~HEREDOC,
210
+ click->dropdown-menu#select
211
+ mouseover->dropdown-menu#focusItem
212
+ keydown.up->dropdown-menu#focusItem:prevent
213
+ keydown.down->dropdown-menu#focusItem:prevent
214
+ focus->dropdown-menu#onItemFocus
215
+ blur->dropdown-menu#onItemBlur
216
+ keydown.enter->dropdown-menu#select:prevent
217
+ keydown.space->dropdown-menu#select:prevent
218
+ mouseout->dropdown-menu#focusContent
219
+ HEREDOC
220
+
221
+ },
222
+ }
223
+ end
224
+ end
225
+
226
+ class DropdownMenuItemTo < DropdownMenuItem
227
+ def initialize(name = nil, options = nil, html_options = nil)
228
+ @name = name
229
+ @options = options
230
+ @html_options = html_options
231
+ end
232
+
233
+ def class_variants(**args)
234
+ DropdownMenuItem.new.class_variants(class: "w-full #{args[:class]}")
235
+ end
236
+
237
+ def view_template(&)
238
+ if block_given?
239
+ @html_options = @options
240
+ @options = @name
241
+ end
242
+
243
+ @html_options ||= {}
244
+ @variant = @html_options.delete(:variant) || :default
245
+ @disabled = @html_options[:disabled]
246
+ merge_default_attributes({})
247
+ @html_options = mix(@attributes, @html_options)
248
+
249
+ if block_given?
250
+ button_to(@options, @html_options, &)
251
+ else
252
+ button_to(@name, @options, @html_options)
253
+ end
254
+ end
255
+ end
256
+
257
+ class DropdownMenuSeparator < Base
258
+ class_variants(base: "bg-border -mx-1 my-1 h-px")
259
+
260
+ def view_template(&)
261
+ div(**@attributes, &)
262
+ end
263
+
264
+ def default_attributes
265
+ {
266
+ role: "separator",
267
+ aria: {
268
+ orientation: "horizontal",
269
+ },
270
+ }
271
+ end
272
+ end
273
+
274
+ class DropdownMenuGroup < Base
275
+ def default_attributes
276
+ { role: "group" }
277
+ end
278
+
279
+ def view_template(&)
280
+ div(**@attributes, &)
281
+ end
282
+ end
283
+ end