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
@@ -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
  )
@@ -1,5 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "form/form_helpers"
4
+ require_relative "form/form_input"
5
+ require_relative "form/form_hint"
6
+ require_relative "form/form_error"
7
+ require_relative "form/form_textarea"
8
+ require_relative "form/form_checkbox"
9
+ require_relative "form/form_switch"
10
+ require_relative "form/form_checkbox_group"
11
+ require_relative "form/form_date_picker"
12
+ require_relative "form/form_date_range_picker"
13
+ require_relative "form/form_select"
14
+ require_relative "form/form_combobox"
15
+ require_relative "form/form_radio_group"
16
+ require_relative "form/form_slider"
17
+
3
18
  module ShadcnPhlexcomponents
4
19
  class Form < Base
5
20
  include Phlex::Rails::Helpers::FormWith
@@ -69,15 +84,32 @@ module ShadcnPhlexcomponents
69
84
  )
70
85
  end
71
86
 
87
+ def combobox(method = nil, collection = [], value_method:, text_method:, **attributes, &)
88
+ FormCombobox(
89
+ method,
90
+ model: @model,
91
+ object_name: @object_name,
92
+ collection: collection,
93
+ value_method: value_method,
94
+ text_method: text_method,
95
+ **attributes,
96
+ &
97
+ )
98
+ end
99
+
72
100
  def date_picker(method = nil, **attributes, &)
73
101
  FormDatePicker(method, model: @model, object_name: @object_name, **attributes, &)
74
102
  end
75
103
 
76
- def date_range_picker(start_date_method = nil, end_date_method = nil, **attributes, &)
77
- FormDateRangePicker(start_date_method, end_date_method, model: @model, object_name: @object_name, **attributes, &)
104
+ def date_range_picker(method = nil, end_method = nil, **attributes, &)
105
+ FormDateRangePicker(method, end_method, model: @model, object_name: @object_name, **attributes, &)
106
+ end
107
+
108
+ def slider(method = nil, end_method = nil, **attributes, &)
109
+ FormSlider(method, end_method, model: @model, object_name: @object_name, **attributes, &)
78
110
  end
79
111
 
80
- def submit(value = nil, variant: :primary, **attributes, &)
112
+ def submit(value = nil, variant: :default, **attributes, &)
81
113
  if @loading
82
114
  LoadingButton(variant: variant, type: :submit, **attributes) do
83
115
  if block_given?
@@ -110,7 +142,7 @@ module ShadcnPhlexcomponents
110
142
  # Follows rails f.submit
111
143
  # https://github.com/rails/rails/blob/3235827585d87661942c91bc81f64f56d710f0b2/actionview/lib/action_view/helpers/form_helper.rb#L2681-L2706
112
144
  def submit_default_value
113
- object = @model&.to_model
145
+ object = @model.respond_to?(:to_model) ? @model.to_model : nil
114
146
  key = if object
115
147
  object.persisted? ? :update : :create
116
148
  else
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class HoverCard < Base
5
+ class_variants(base: "inline-flex max-w-fit")
6
+
7
+ def initialize(open: false, **attributes)
8
+ @open = open
9
+ super(**attributes)
10
+ end
11
+
12
+ def content(**attributes, &)
13
+ HoverCardContent(**attributes, &)
14
+ end
15
+
16
+ def trigger(**attributes, &)
17
+ HoverCardTrigger(**attributes, &)
18
+ end
19
+
20
+ def default_attributes
21
+ {
22
+ data: {
23
+ controller: "hover-card",
24
+ hover_card_is_open_value: @open.to_s,
25
+ },
26
+ }
27
+ end
28
+
29
+ def view_template(&)
30
+ div(**@attributes, &)
31
+ end
32
+ end
33
+
34
+ class HoverCardTrigger < Base
35
+ def initialize(as_child: false, **attributes)
36
+ @as_child = as_child
37
+ super(**attributes)
38
+ end
39
+
40
+ def view_template(&)
41
+ if @as_child
42
+ content = capture(&)
43
+ element = find_as_child(content.to_s)
44
+ vanish(&)
45
+ merged_attributes = merged_as_child_attributes(element, @attributes)
46
+
47
+ send(element.name, **merged_attributes) do
48
+ sanitize_as_child(element.children.to_s)
49
+ end
50
+ else
51
+ div(**@attributes, &)
52
+ end
53
+ end
54
+
55
+ def default_attributes
56
+ {
57
+ id: @id,
58
+ role: "button",
59
+ data: {
60
+ as_child: @as_child.to_s,
61
+ hover_card_target: "trigger",
62
+ action: <<~HEREDOC,
63
+ focus->hover-card#open
64
+ blur->hover-card#close
65
+ click->hover-card#open
66
+ HEREDOC
67
+ },
68
+ }
69
+ end
70
+ end
71
+
72
+ class HoverCardContent < Base
73
+ class_variants(
74
+ base: <<~HEREDOC,
75
+ bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out
76
+ data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95
77
+ data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2
78
+ data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-64
79
+ origin-(--radix-popper-transform-origin) rounded-md border p-4 shadow-md outline-hidden
80
+ HEREDOC
81
+ )
82
+
83
+ def initialize(side: :bottom, align: :center, **attributes)
84
+ @side = side
85
+ @align = align
86
+ super(**attributes)
87
+ end
88
+
89
+ def view_template(&)
90
+ div(
91
+ style: { display: "none" },
92
+ class: "fixed top-0 left-0 w-max z-50",
93
+ data: { hover_card_target: "contentContainer" },
94
+ ) do
95
+ div(**@attributes, &)
96
+ end
97
+ end
98
+
99
+ def default_attributes
100
+ {
101
+ tabindex: -1,
102
+ data: {
103
+ side: @side,
104
+ align: @align,
105
+ hover_card_target: "content",
106
+ action: "mouseover->hover-card#open mouseout->hover-card#close",
107
+ },
108
+ }
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Input < Base
5
+ class_variants(
6
+ base: <<~HEREDOC,
7
+ file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground
8
+ dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base
9
+ shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent
10
+ file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm
11
+ focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]
12
+ aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive
13
+ HEREDOC
14
+ )
15
+
16
+ def initialize(type: :text, **attributes)
17
+ @type = type
18
+ super(**attributes)
19
+ end
20
+
21
+ def default_attributes
22
+ {
23
+ type: @type,
24
+ }
25
+ end
26
+
27
+ def view_template(&)
28
+ input(**@attributes, &)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Label < Base
5
+ class_variants(
6
+ base: <<~HEREDOC,
7
+ flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none
8
+ group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50
9
+ HEREDOC
10
+ )
11
+
12
+ def view_template(&)
13
+ label(**@attributes, &)
14
+ end
15
+ end
16
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class Link < Base
5
- STYLES = "font-medium underline underline-offset-4"
5
+ class_variants(base: "font-medium underline underline-offset-4")
6
6
 
7
7
  def initialize(name = nil, options = nil, html_options = nil)
8
8
  @name = name
@@ -15,9 +15,16 @@ module ShadcnPhlexcomponents
15
15
  @html_options = @options
16
16
  @options = @name
17
17
  end
18
+
18
19
  @html_options ||= {}
19
- @html_options = mix(default_attributes, @html_options)
20
- @html_options[:class] = TAILWIND_MERGER.merge("#{default_styles} #{@html_options[:class]}")
20
+ variant = @html_options.delete(:variant)
21
+ size = @html_options.delete(:size) || :default
22
+
23
+ @html_options[:class] = if variant
24
+ Button.new.class_variants(variant: variant, size: size, class: @html_options[:class])
25
+ else
26
+ class_variants(class: @html_options[:class])
27
+ end
21
28
 
22
29
  if block_given?
23
30
  link_to(@options, @html_options, &)
@@ -1,7 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ShadcnPhlexcomponents
4
- class LoadingButton < Button
4
+ class LoadingButton < Base
5
+ def initialize(variant: :default, size: :default, type: :submit, **attributes)
6
+ @variant = variant
7
+ @size = size
8
+ @type = type
9
+ super(**attributes)
10
+ end
11
+
5
12
  def default_attributes
6
13
  {
7
14
  type: @type,
@@ -12,7 +19,7 @@ module ShadcnPhlexcomponents
12
19
  end
13
20
 
14
21
  def view_template(&)
15
- button(**@attributes) do
22
+ Button(variant: @variant, size: @size, **@attributes) do
16
23
  icon("loader-circle", class: "animate-spin hidden group-aria-busy:inline")
17
24
  yield
18
25
  end
@@ -0,0 +1,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Pagination < Base
5
+ class_variants(base: "mx-auto flex w-full justify-center")
6
+
7
+ def item(**attributes, &)
8
+ PaginationItem(**attributes, &)
9
+ end
10
+
11
+ def link(name = nil, options = nil, html_options = nil, &)
12
+ PaginationLink(name, options, html_options, &)
13
+ end
14
+
15
+ def previous(options = nil, html_options = nil)
16
+ PaginationPrevious(options, html_options)
17
+ end
18
+
19
+ def next(options = nil, html_options = nil)
20
+ PaginationNext(options, html_options)
21
+ end
22
+
23
+ def ellipsis(**attributes, &)
24
+ PaginationEllipsis(**attributes, &)
25
+ end
26
+
27
+ def default_attributes
28
+ {
29
+ role: "navigation",
30
+ aria: {
31
+ label: "navigation",
32
+ },
33
+ }
34
+ end
35
+
36
+ def view_template(&)
37
+ div(**@attributes) do
38
+ ul(class: "flex flex-row items-center gap-1", &)
39
+ end
40
+ end
41
+ end
42
+
43
+ class PaginationItem < Base
44
+ def view_template(&)
45
+ li(**@attributes, &)
46
+ end
47
+ end
48
+
49
+ class PaginationPrevious < Base
50
+ class_variants(base: "gap-1 px-2.5 sm:pl-2.5")
51
+
52
+ def initialize(options = nil, html_options = nil)
53
+ @options = options
54
+ @html_options = html_options
55
+ end
56
+
57
+ def default_attributes
58
+ {
59
+ aria: {
60
+ label: "Go to previous page",
61
+ },
62
+ }
63
+ end
64
+
65
+ def view_template
66
+ @html_options ||= {}
67
+ @html_options = mix(default_attributes, @html_options)
68
+ @html_options[:class] = class_variants(clase: @html_options[:class])
69
+ @html_options[:size] = :default
70
+
71
+ PaginationLink(@options, @html_options) do
72
+ icon("chevron-left")
73
+ span(class: "hidden sm:block") { "Previous" }
74
+ end
75
+ end
76
+ end
77
+
78
+ class PaginationNext < Base
79
+ class_variants(base: "gap-1 px-2.5 sm:pr-2.5")
80
+
81
+ def initialize(options = nil, html_options = nil)
82
+ @options = options
83
+ @html_options = html_options
84
+ end
85
+
86
+ def default_attributes
87
+ {
88
+ aria: {
89
+ label: "Go to next page",
90
+ },
91
+ }
92
+ end
93
+
94
+ def view_template
95
+ @html_options ||= {}
96
+ @html_options = mix(default_attributes, @html_options)
97
+ @html_options[:class] = class_variants(clase: @html_options[:class])
98
+ @html_options[:size] = :default
99
+
100
+ PaginationLink(@options, @html_options) do
101
+ span(class: "hidden sm:block") { "Next" }
102
+ icon("chevron-right")
103
+ end
104
+ end
105
+ end
106
+
107
+ class PaginationLink < Base
108
+ def initialize(name = nil, options = nil, html_options = nil)
109
+ @name = name
110
+ @options = options
111
+ @html_options = html_options
112
+ end
113
+
114
+ def view_template(&)
115
+ if block_given?
116
+ @html_options = @options
117
+ @options = @name
118
+ end
119
+
120
+ @html_options ||= {}
121
+ @html_options = mix(default_attributes, @html_options)
122
+
123
+ active = @html_options.delete(:active)
124
+ size = @html_options.delete(:size)
125
+
126
+ if active
127
+ @html_options = mix({ aria: { current: "page" } }, @html_options)
128
+ end
129
+
130
+ @html_options[:class] = Button.new.class_variants(
131
+ variant: active ? :outline : :ghost,
132
+ size: size || :icon,
133
+ class: @html_options[:class],
134
+ )
135
+
136
+ if block_given?
137
+ li do
138
+ link_to(@options, @html_options, &)
139
+ end
140
+ else
141
+ li do
142
+ link_to(@name, @options, @html_options)
143
+ end
144
+ end
145
+ end
146
+ end
147
+
148
+ class PaginationEllipsis < Base
149
+ class_variants(base: "flex size-9 items-center justify-center")
150
+
151
+ def default_attributes
152
+ {
153
+ aria: {
154
+ hidden: "true",
155
+ },
156
+ }
157
+ end
158
+
159
+ def view_template
160
+ span(**@attributes) do
161
+ icon("ellipsis", class: "size-4")
162
+ span(class: "sr-only") { "More pages" }
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Popover < Base
5
+ class_variants(base: "inline-flex max-w-fit")
6
+
7
+ def initialize(open: false, **attributes)
8
+ @open = open
9
+ @aria_id = "popover-#{SecureRandom.hex(5)}"
10
+ super(**attributes)
11
+ end
12
+
13
+ def trigger(**attributes, &)
14
+ PopoverTrigger(aria_id: @aria_id, **attributes, &)
15
+ end
16
+
17
+ def content(**attributes, &)
18
+ PopoverContent(aria_id: @aria_id, **attributes, &)
19
+ end
20
+
21
+ def default_attributes
22
+ {
23
+ data: {
24
+ controller: "popover",
25
+ popover_is_open_value: @open.to_s,
26
+ },
27
+ }
28
+ end
29
+
30
+ def view_template(&)
31
+ div(**@attributes, &)
32
+ end
33
+ end
34
+
35
+ class PopoverTrigger < Base
36
+ def initialize(as_child: false, aria_id: nil, **attributes)
37
+ @as_child = as_child
38
+ @aria_id = aria_id
39
+ super(**attributes)
40
+ end
41
+
42
+ def view_template(&)
43
+ if @as_child
44
+ content = capture(&)
45
+ element = find_as_child(content.to_s)
46
+ vanish(&)
47
+ merged_attributes = merged_as_child_attributes(element, @attributes)
48
+
49
+ send(element.name, **merged_attributes) do
50
+ sanitize_as_child(element.children.to_s)
51
+ end
52
+ else
53
+ div(**@attributes, &)
54
+ end
55
+ end
56
+
57
+ def default_attributes
58
+ {
59
+ role: "button",
60
+ aria: {
61
+ haspopup: "dialog",
62
+ expanded: false,
63
+ controls: "#{@aria_id}-content",
64
+ },
65
+ data: {
66
+ as_child: @as_child.to_s,
67
+ action: "click->popover#toggle",
68
+ popover_target: "trigger",
69
+ },
70
+ }
71
+ end
72
+ end
73
+
74
+ class PopoverContent < Base
75
+ class_variants(
76
+ base: <<~HEREDOC,
77
+ bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out
78
+ data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95
79
+ data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2
80
+ data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popper-transform-origin) rounded-md
81
+ border p-4 shadow-md outline-hidden
82
+ HEREDOC
83
+ )
84
+
85
+ def initialize(side: :bottom, align: :center, aria_id: nil, **attributes)
86
+ @side = side
87
+ @align = align
88
+ @aria_id = aria_id
89
+ super(**attributes)
90
+ end
91
+
92
+ def view_template(&)
93
+ div(
94
+ style: { display: "none" },
95
+ class: "fixed top-0 left-0 w-max z-50",
96
+ data: { popover_target: "contentContainer" },
97
+ ) do
98
+ div(**@attributes, &)
99
+ end
100
+ end
101
+
102
+ def default_attributes
103
+ {
104
+ id: "#{@aria_id}-content",
105
+ tabindex: -1,
106
+ role: "dialog",
107
+ data: {
108
+ side: @side,
109
+ align: @align,
110
+ popover_target: "content",
111
+ action: "popover:click:outside->popover#clickOutside",
112
+ },
113
+ }
114
+ end
115
+ end
116
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class Progress < Base
5
- STYLES = "relative h-2 w-full overflow-hidden rounded-full bg-primary/20"
5
+ class_variants(base: "bg-primary/20 relative h-2 w-full overflow-hidden rounded-full")
6
6
 
7
7
  def initialize(value: 0, **attributes)
8
8
  @value = value
@@ -19,7 +19,7 @@ module ShadcnPhlexcomponents
19
19
  },
20
20
  data: {
21
21
  controller: "progress",
22
- "progress-progress-value": @value,
22
+ progress_percent_value: @value,
23
23
  },
24
24
  }
25
25
  end
@@ -27,9 +27,9 @@ module ShadcnPhlexcomponents
27
27
  def view_template
28
28
  div(**@attributes) do
29
29
  div(
30
- class: "h-full w-full flex-1 bg-primary transition-all",
30
+ class: "bg-primary h-full w-full flex-1 transition-all",
31
31
  style: "transform: translateX(-#{100 - @value}%)",
32
- data: { "progress-target": "bar" },
32
+ data: { progress_target: "indicator" },
33
33
  )
34
34
  end
35
35
  end