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
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class DropdownMenuSub < Base
5
+ def initialize(aria_id: nil, **attributes)
6
+ @aria_id = aria_id
7
+ super(**attributes)
8
+ end
9
+
10
+ def trigger(**attributes, &)
11
+ DropdownMenuSubTrigger(aria_id: @aria_id, **attributes, &)
12
+ end
13
+
14
+ def content(**attributes, &)
15
+ DropdownMenuSubContent(aria_id: @aria_id, **attributes, &)
16
+ end
17
+
18
+ def default_attributes
19
+ {
20
+ data: {
21
+ controller: "dropdown-menu-sub",
22
+ action: "keydown.left->dropdown-menu-sub#closeOnLeftKeydown:prevent",
23
+ },
24
+ }
25
+ end
26
+
27
+ def view_template(&)
28
+ div(**@attributes, &)
29
+ end
30
+ end
31
+
32
+ class DropdownMenuSubTrigger < Base
33
+ class_variants(
34
+ base: <<~HEREDOC,
35
+ focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground
36
+ flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8
37
+ HEREDOC
38
+ )
39
+
40
+ def initialize(aria_id: nil, **attributes)
41
+ @aria_id = aria_id
42
+ super(**attributes)
43
+ end
44
+
45
+ def view_template(&)
46
+ div(**@attributes) do
47
+ yield
48
+
49
+ icon("chevron-right", class: "ml-auto size-4")
50
+ end
51
+ end
52
+
53
+ def default_attributes
54
+ {
55
+ id: "#{@aria_id}-trigger",
56
+ role: "menuitem",
57
+ aria: {
58
+ haspopup: "menu",
59
+ expanded: false,
60
+ controls: "#{@aria_id}-content",
61
+ },
62
+ tabindex: -1,
63
+ data: {
64
+ state: "closed",
65
+ dropdown_menu_sub_target: "trigger",
66
+ dropdown_menu_target: "item",
67
+ action: <<~HEREDOC,
68
+ focus->dropdown-menu#onItemFocus
69
+ blur->dropdown-menu#onItemBlur
70
+ keydown.up->dropdown-menu#focusItem:prevent
71
+ keydown.down->dropdown-menu#focusItem:prevent
72
+ mouseover->dropdown-menu#focusItem
73
+ mouseover->dropdown-menu-sub#open
74
+ click->dropdown-menu-sub#open
75
+ keydown.right->dropdown-menu-sub#open:prevent
76
+ keydown.space->dropdown-menu-sub#open:prevent
77
+ keydown.enter->dropdown-menu-sub#open:prevent
78
+ keydown.left->dropdown-menu-sub#closeParentSubMenu
79
+ HEREDOC
80
+ },
81
+ }
82
+ end
83
+ end
84
+
85
+ class DropdownMenuSubContent < Base
86
+ class_variants(
87
+ base: <<~HEREDOC,
88
+ bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out
89
+ data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95
90
+ data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2
91
+ data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem]
92
+ origin-(--radix-popper-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg outline-none
93
+ HEREDOC
94
+ )
95
+
96
+ def initialize(aria_id: nil, side: :right, align: :start, **attributes)
97
+ @side = side
98
+ @align = align
99
+ @aria_id = aria_id
100
+ super(**attributes)
101
+ end
102
+
103
+ def default_attributes
104
+ {
105
+ id: "#{@aria_id}-content",
106
+ tabindex: -1,
107
+ role: "menu",
108
+ aria: {
109
+ labelledby: "#{@aria_id}-trigger",
110
+ orientation: "vertical",
111
+ },
112
+ data: {
113
+ state: "closed",
114
+ side: @side,
115
+ align: @align,
116
+ dropdown_menu_sub_target: "content",
117
+ action: <<~HEREDOC,
118
+ mouseover->dropdown-menu-sub#open#{" "}
119
+ keydown.up->dropdown-menu-sub#focusItemByIndex:prevent:self
120
+ keydown.down->dropdown-menu-sub#focusItemByIndex:prevent:self
121
+ HEREDOC
122
+ },
123
+ }
124
+ end
125
+
126
+ def view_template(&)
127
+ div(
128
+ class: "hidden fixed top-0 left-0 w-max z-50",
129
+ data: { dropdown_menu_sub_target: "contentContainer" },
130
+ ) do
131
+ div(**@attributes, &)
132
+ end
133
+ end
134
+ end
135
+ end
@@ -20,21 +20,20 @@ module ShadcnPhlexcomponents
20
20
  @method = method
21
21
  @model = model
22
22
  @object_name = object_name
23
- @value = value
24
- @model_value = model&.public_send(method)
23
+ @value = value || "1"
25
24
  @name = name
26
25
  @id = id
27
26
  @label = label
28
- @error = error || (model ? model.errors.full_messages_for(method).first : nil)
27
+ @error = default_error(error, method)
29
28
  @hint = hint
30
29
  @aria_id = "form-field-#{SecureRandom.hex(5)}"
31
- @checked = checked
30
+ @checked = default_checked(checked, method)
32
31
  super(**attributes)
33
32
  end
34
33
 
35
34
  def label_attributes(use_label_styles: false, **attributes)
36
35
  attributes[:class] = [
37
- use_label_styles ? Label::STYLES : nil,
36
+ use_label_styles ? Label.new.class_variants : nil,
38
37
  "ml-6",
39
38
  attributes[:class],
40
39
  ].compact.join(" ")
@@ -64,8 +63,8 @@ module ShadcnPhlexcomponents
64
63
  Checkbox(
65
64
  id: @id,
66
65
  name: @name,
67
- value: @value || "1",
68
- checked: @checked || !!@model_value,
66
+ value: @value,
67
+ checked: @checked,
69
68
  aria: aria_attributes,
70
69
  disabled: @disabled,
71
70
  **@attributes,
@@ -46,7 +46,7 @@ module ShadcnPhlexcomponents
46
46
  @name = name
47
47
  @id = id
48
48
  @label = label
49
- @error = error || (model ? model.errors.full_messages_for(method).first : nil)
49
+ @error = default_error(error, method)
50
50
  @hint = hint
51
51
  @disabled_items = disabled_items
52
52
  @aria_id = "form-field-#{SecureRandom.hex(5)}"
@@ -89,7 +89,6 @@ module ShadcnPhlexcomponents
89
89
  name: @name,
90
90
  value: @value || @model_value || [],
91
91
  aria: aria_attributes,
92
- item_id_prefix: @id,
93
92
  **@attributes,
94
93
  ) do |c|
95
94
  c.items(
@@ -97,6 +96,7 @@ module ShadcnPhlexcomponents
97
96
  value_method: @value_method,
98
97
  text_method: @text_method,
99
98
  disabled_items: @disabled_items,
99
+ id_prefix: @id,
100
100
  ) do
101
101
  if @checkbox_attributes
102
102
  c.checkbox(**@checkbox_attributes)
@@ -19,12 +19,11 @@ module ShadcnPhlexcomponents
19
19
  @method = method
20
20
  @model = model
21
21
  @object_name = object_name
22
- @value = value
23
- @model_value = model&.public_send(method)
22
+ @value = default_value(value, method)
24
23
  @name = name
25
24
  @id = id
26
25
  @label = label
27
- @error = error || (model ? model.errors.full_messages_for(method).first : nil)
26
+ @error = default_error(error, method)
28
27
  @hint = hint
29
28
  @aria_id = "form-field-#{SecureRandom.hex(5)}"
30
29
  super(**attributes)
@@ -38,7 +37,7 @@ module ShadcnPhlexcomponents
38
37
 
39
38
  div(class: "space-y-2", data: label_and_hint_container_attributes) do
40
39
  render_label(&)
41
- DatePicker(id: @id, name: @name, value: @value || @model_value, aria: aria_attributes, **@attributes)
40
+ DatePicker(id: @id, name: @name, value: @value, aria: aria_attributes, **@attributes)
42
41
  render_hint(&)
43
42
  render_error
44
43
  end
@@ -5,36 +5,35 @@ module ShadcnPhlexcomponents
5
5
  include FormHelpers
6
6
 
7
7
  def initialize(
8
- start_date_method,
9
- end_date_method,
8
+ method,
9
+ end_method,
10
10
  model: false,
11
11
  object_name: nil,
12
- start_date: nil,
13
- end_date: nil,
14
- start_date_name: nil,
15
- end_date_name: nil,
12
+ value: nil,
13
+ name: nil,
16
14
  id: nil,
17
15
  label: nil,
18
- start_date_error: nil,
19
- end_date_error: nil,
16
+ error: nil,
20
17
  hint: nil,
21
18
  **attributes
22
19
  )
23
- @start_date_method = start_date_method
24
- @end_date_method = end_date_method
20
+ @method = method
21
+ @end_method = end_method
25
22
  @model = model
26
23
  @object_name = object_name
27
- @start_date = start_date
28
- @end_date = start_date
29
- @start_date_model_value = model&.public_send(start_date_method)
30
- @end_date_model_value = model&.public_send(end_date_method)
31
- @start_date_name = start_date_name
32
- @end_date_name = end_date_name
24
+
25
+ @value = [
26
+ default_value(value ? value[0] : nil, method),
27
+ default_value(value ? value[1] : nil, end_method),
28
+ ]
29
+ @error = [
30
+ default_error(error ? error[0] : nil, method),
31
+ default_error(error ? error[1] : nil, end_method),
32
+ ].compact
33
+
34
+ @name = name
33
35
  @id = id
34
36
  @label = label
35
- @start_date_error = start_date_error || (model ? model.errors.full_messages_for(start_date_method).first : nil)
36
- @end_date_error = end_date_error || (model ? model.errors.full_messages_for(end_date_method).first : nil)
37
- @error = (@start_date_error || @end_date_error).present?
38
37
  @hint = hint
39
38
  @aria_id = "form-field-#{SecureRandom.hex(5)}"
40
39
  super(**attributes)
@@ -52,39 +51,26 @@ module ShadcnPhlexcomponents
52
51
  Label(**attrs) { @label }
53
52
  elsif @label != false
54
53
  attrs = label_attributes(use_label_styles: true)
55
- rails_label(@object_name, [@start_date_method, @end_date_method].to_sentence, nil, **attrs)
56
- end
57
- end
58
-
59
- def render_error
60
- if @start_date_error && @end_date_error
61
- FormError(nil, aria_id: @aria_id) do
62
- span { @start_date_error }
63
- br
64
- span { @end_date_error }
65
- end
66
- elsif @start_date_error
67
- FormError(@start_date_error, aria_id: @aria_id)
68
- elsif @end_date_error
69
- FormError(@end_date_error, aria_id: @aria_id)
54
+ rails_label(@object_name, [@method, @end_method].to_sentence, nil, **attrs)
70
55
  end
71
56
  end
72
57
 
73
58
  def view_template(&)
74
59
  vanish(&)
75
60
 
76
- @id ||= field_id(@object_name, @start_date_method)
77
- @start_date_name ||= field_name(@object_name, @start_date_method)
78
- @end_date_name ||= field_name(@object_name, @end_date_method)
61
+ @id ||= field_id(@object_name, @method)
62
+ @name ||=
63
+ [
64
+ field_name(@object_name, @method),
65
+ field_name(@object_name, @end_method),
66
+ ]
79
67
 
80
68
  div(class: "space-y-2", data: label_and_hint_container_attributes) do
81
69
  render_label(&)
82
70
  DateRangePicker(
83
71
  id: @id,
84
- start_date_name: @start_date_name,
85
- end_date_name: @end_date_name,
86
- start_date: @start_date || @start_date_model_value,
87
- end_date: @end_date || @end_date_model_value,
72
+ name: @name,
73
+ value: @value,
88
74
  aria: aria_attributes,
89
75
  **@attributes,
90
76
  )
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class FormError < Base
5
- STYLES = "text-[0.8rem] font-medium text-destructive"
5
+ class_variants(base: "text-destructive text-sm")
6
6
 
7
7
  def initialize(message, aria_id: nil, **attributes)
8
8
  @message = message
@@ -64,15 +64,23 @@ module ShadcnPhlexcomponents
64
64
  end
65
65
 
66
66
  def render_error
67
- if @error
68
- FormError(@error, aria_id: @aria_id)
67
+ if @error.present?
68
+ if @error.is_a?(Array)
69
+ FormError(nil, aria_id: @aria_id, class: "space-y-0.5") do
70
+ @error.each do |error|
71
+ span(class: "block") { error }
72
+ end
73
+ end
74
+ else
75
+ FormError(@error, aria_id: @aria_id)
76
+ end
69
77
  end
70
78
  end
71
79
 
72
80
  def label_attributes(use_label_styles: false, **attributes)
73
81
  attributes[:class] = [
74
- use_label_styles ? Label::STYLES : nil,
75
- @error ? "text-destructive" : nil,
82
+ use_label_styles ? Label.new.class_variants : nil,
83
+ @error.present? ? "text-destructive" : nil,
76
84
  attributes[:class],
77
85
  ].compact.join(" ")
78
86
  attributes[:for] ||= @id
@@ -92,17 +100,44 @@ module ShadcnPhlexcomponents
92
100
  def aria_attributes
93
101
  {
94
102
  describedby: describedby,
95
- invalid: @error.present?,
96
- }.compact
103
+ invalid: @error.present?.to_s,
104
+ }
97
105
  end
98
106
 
99
107
  def describedby
100
- return if !@hint && !@error
108
+ return if !@hint && !@error.present?
101
109
 
102
110
  [
103
111
  @hint ? "#{@aria_id}-description" : nil,
104
- @error ? "#{@aria_id}-message" : nil,
112
+ @error.present? ? "#{@aria_id}-message" : nil,
105
113
  ].compact.join(" ")
106
114
  end
115
+
116
+ def default_value(value, method)
117
+ return value unless value.nil?
118
+ return unless @model
119
+
120
+ if @model.respond_to?(method)
121
+ @model.public_send(method)
122
+ end
123
+ end
124
+
125
+ def default_checked(checked, method)
126
+ return checked if [true, false].include?(checked)
127
+ return unless @model
128
+
129
+ if @model.respond_to?(method)
130
+ !!@model.public_send(method)
131
+ end
132
+ end
133
+
134
+ def default_error(error, method)
135
+ return error unless error.nil?
136
+ return unless @model
137
+
138
+ if @model.respond_to?(:errors)
139
+ @model.errors.full_messages_for(method).first
140
+ end
141
+ end
107
142
  end
108
143
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class FormHint < Base
5
- STYLES = "text-[0.8rem] text-muted-foreground"
5
+ class_variants(base: "text-muted-foreground text-sm")
6
6
 
7
7
  def initialize(message = nil, aria_id: nil, **attributes)
8
8
  @message = message
@@ -21,12 +21,11 @@ module ShadcnPhlexcomponents
21
21
  @model = model
22
22
  @object_name = object_name
23
23
  @type = type.to_sym
24
- @value = value
25
- @model_value = model&.public_send(method)
24
+ @value = default_value(value, method)
26
25
  @name = name
27
26
  @id = id
28
27
  @label = label
29
- @error = error || (model ? model.errors.full_messages_for(method).first : nil)
28
+ @error = default_error(error, method)
30
29
  @hint = hint
31
30
  @aria_id = "form-field-#{SecureRandom.hex(5)}"
32
31
  super(**attributes)
@@ -40,7 +39,7 @@ module ShadcnPhlexcomponents
40
39
 
41
40
  div(class: "space-y-2", data: label_and_hint_container_attributes) do
42
41
  render_label(&)
43
- Input(type: @type, id: @id, name: @name, value: @value || @model_value, aria: aria_attributes, **@attributes)
42
+ Input(type: @type, id: @id, name: @name, value: @value, aria: aria_attributes, **@attributes)
44
43
  render_hint(&)
45
44
  render_error
46
45
  end
@@ -32,12 +32,11 @@ module ShadcnPhlexcomponents
32
32
 
33
33
  @value_method = value_method
34
34
  @text_method = text_method
35
- @value = value
36
- @model_value = model&.public_send(method)
35
+ @value = default_value(value, method)
37
36
  @name = name
38
37
  @id = id
39
38
  @label = label
40
- @error = error || (model ? model.errors.full_messages_for(method).first : nil)
39
+ @error = default_error(error, method)
41
40
  @hint = hint
42
41
  @disabled_items = disabled_items
43
42
  @aria_id = "form-field-#{SecureRandom.hex(5)}"
@@ -78,9 +77,8 @@ module ShadcnPhlexcomponents
78
77
  RadioGroup(
79
78
  name: @name,
80
79
  id: @id,
81
- value: @value || @model_value,
80
+ value: @value,
82
81
  aria: aria_attributes,
83
- item_id_prefix: @id,
84
82
  **@attributes,
85
83
  ) do |c|
86
84
  c.items(
@@ -88,6 +86,7 @@ module ShadcnPhlexcomponents
88
86
  value_method: @value_method,
89
87
  text_method: @text_method,
90
88
  disabled_items: @disabled_items,
89
+ id_prefix: @id,
91
90
  ) do
92
91
  if @radio_attributes
93
92
  c.radio(**@radio_attributes)
@@ -32,12 +32,11 @@ module ShadcnPhlexcomponents
32
32
 
33
33
  @value_method = value_method
34
34
  @text_method = text_method
35
- @value = value
36
- @model_value = model&.public_send(method)
35
+ @value = default_value(value, method)
37
36
  @name = name
38
37
  @id = id
39
38
  @label = label
40
- @error = error || (model ? model.errors.full_messages_for(method).first : nil)
39
+ @error = default_error(error, method)
41
40
  @hint = hint
42
41
  @disabled_items = disabled_items
43
42
  @aria_id = "form-field-#{SecureRandom.hex(5)}"
@@ -53,7 +52,7 @@ module ShadcnPhlexcomponents
53
52
  div(class: "space-y-2", data: label_and_hint_container_attributes) do
54
53
  render_label(&)
55
54
 
56
- Select(id: @id, name: @name, value: @value || @model_value, aria: aria_attributes, **@attributes) do |s|
55
+ Select(id: @id, name: @name, value: @value, aria: aria_attributes, **@attributes) do |s|
57
56
  s.items(@collection, value_method: @value_method, text_method: @text_method, disabled_items: @disabled_items)
58
57
  end
59
58
 
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class FormSlider < Base
5
+ include FormHelpers
6
+
7
+ def initialize(
8
+ method,
9
+ end_method = nil,
10
+ model: false,
11
+ object_name: nil,
12
+ range: false,
13
+ value: nil,
14
+ name: nil,
15
+ id: nil,
16
+ label: nil,
17
+ error: nil,
18
+ hint: nil,
19
+ **attributes
20
+ )
21
+ @method = method
22
+ @end_method = end_method
23
+ @model = model
24
+ @object_name = object_name
25
+ @range = range
26
+
27
+ if @range
28
+ @value = [
29
+ default_value(value ? value[0] : nil, method),
30
+ default_value(value ? value[1] : nil, end_method),
31
+ ]
32
+ @error = [
33
+ default_error(error ? error[0] : nil, method),
34
+ default_error(error ? error[1] : nil, end_method),
35
+ ].compact
36
+ else
37
+ @value = default_value(value, method)
38
+ @error = default_error(error, method)
39
+ end
40
+
41
+ @name = name
42
+ @id = id
43
+ @label = label
44
+ @hint = hint
45
+ @aria_id = "form-field-#{SecureRandom.hex(5)}"
46
+ super(**attributes)
47
+ end
48
+
49
+ def render_label(&)
50
+ # It's currently not possible to separate the content of the yield in Phlex.
51
+ # So we use Javascript to remove the duplicated hint or label.
52
+ if @yield_label && @yield_hint
53
+ div(data: { remove_hint: true }, &)
54
+ elsif @yield_label
55
+ yield
56
+ elsif @label
57
+ attrs = label_attributes(use_label_styles: false)
58
+ Label(**attrs) { @label }
59
+ elsif @label != false
60
+ attrs = label_attributes(use_label_styles: true)
61
+ label_text = @range ? [@method, @end_method].to_sentence : @method
62
+ rails_label(@object_name, label_text, nil, **attrs)
63
+ end
64
+ end
65
+
66
+ def view_template(&)
67
+ vanish(&)
68
+
69
+ @id ||= field_id(@object_name, @method)
70
+
71
+ if @name.blank?
72
+ @name =
73
+ if @range
74
+ [
75
+ field_name(@object_name, @method),
76
+ field_name(@object_name, @end_method),
77
+ ]
78
+ else
79
+ field_name(@object_name, @method)
80
+ end
81
+ end
82
+
83
+ div(class: "space-y-2", data: label_and_hint_container_attributes) do
84
+ render_label(&)
85
+ Slider(id: @id, name: @name, value: @value, aria: aria_attributes, range: @range, **@attributes)
86
+ render_hint(&)
87
+ render_error
88
+ end
89
+ end
90
+ end
91
+ end
@@ -14,25 +14,26 @@ module ShadcnPhlexcomponents
14
14
  label: nil,
15
15
  error: nil,
16
16
  hint: nil,
17
+ checked: nil,
17
18
  **attributes
18
19
  )
19
20
  @method = method
20
21
  @model = model
21
22
  @object_name = object_name
22
- @value = value
23
- @model_value = model&.public_send(method)
23
+ @value = value || "1"
24
24
  @name = name
25
25
  @id = id
26
26
  @label = label
27
- @error = error || (model ? model.errors.full_messages_for(method).first : nil)
27
+ @error = default_error(error, method)
28
28
  @hint = hint
29
29
  @aria_id = "form-field-#{SecureRandom.hex(5)}"
30
+ @checked = default_checked(checked, method)
30
31
  super(**attributes)
31
32
  end
32
33
 
33
34
  def label_attributes(use_label_styles: false, **attributes)
34
35
  attributes[:class] = [
35
- use_label_styles ? Label::STYLES : nil,
36
+ use_label_styles ? Label.new.class_variants : nil,
36
37
  attributes[:class],
37
38
  ].compact.join(" ")
38
39
  attributes[:for] ||= @id
@@ -50,8 +51,8 @@ module ShadcnPhlexcomponents
50
51
  Switch(
51
52
  id: @id,
52
53
  name: @name,
53
- value: @value || "1",
54
- checked: !!@model_value,
54
+ value: @value,
55
+ checked: @checked,
55
56
  aria: aria_attributes,
56
57
  disabled: @disabled,
57
58
  **@attributes,
@@ -19,12 +19,11 @@ module ShadcnPhlexcomponents
19
19
  @method = method
20
20
  @model = model
21
21
  @object_name = object_name
22
- @value = value
23
- @model_value = model&.public_send(method)
22
+ @value = default_value(value, method)
24
23
  @name = name
25
24
  @id = id
26
25
  @label = label
27
- @error = error || (model ? model.errors.full_messages_for(method).first : nil)
26
+ @error = default_error(error, method)
28
27
  @hint = hint
29
28
  @aria_id = "form-field-#{SecureRandom.hex(5)}"
30
29
  super(**attributes)
@@ -46,7 +45,7 @@ module ShadcnPhlexcomponents
46
45
  type: @type,
47
46
  id: @id,
48
47
  name: @name,
49
- value: @value || @model_value,
48
+ value: @value,
50
49
  aria: aria_attributes,
51
50
  **@attributes,
52
51
  )