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,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Breadcrumb < Base
5
+ class_variants(
6
+ base: "text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5",
7
+ )
8
+
9
+ def item(**attributes, &)
10
+ BreadcrumbItem(**attributes, &)
11
+ end
12
+
13
+ def link(name = nil, options = nil, html_options = nil, &)
14
+ BreadcrumbLink(name, options, html_options, &)
15
+ end
16
+
17
+ def separator(**attributes, &)
18
+ BreadcrumbSeparator(**attributes, &)
19
+ end
20
+
21
+ def page(**attributes, &)
22
+ BreadcrumbPage(**attributes, &)
23
+ end
24
+
25
+ def ellipsis(**attributes)
26
+ BreadcrumbEllipsis(**attributes)
27
+ end
28
+
29
+ def links(collection)
30
+ collection.each_with_index do |link, index|
31
+ if index == collection.size - 1
32
+ item do
33
+ page { link[:name] }
34
+ end
35
+ else
36
+ item do
37
+ link(link[:name], link[:path])
38
+ end
39
+ end
40
+
41
+ if index < collection.size - 1
42
+ separator
43
+ end
44
+ end
45
+
46
+ nil
47
+ end
48
+
49
+ def view_template(&)
50
+ nav(aria: { label: "breadcrumb" }) do
51
+ ol(**@attributes, &)
52
+ end
53
+ end
54
+ end
55
+
56
+ class BreadcrumbItem < Base
57
+ class_variants(base: "inline-flex items-center gap-1.5")
58
+
59
+ def view_template(&)
60
+ li(**@attributes, &)
61
+ end
62
+ end
63
+
64
+ class BreadcrumbLink < Base
65
+ class_variants(base: "transition-colors hover:text-foreground")
66
+
67
+ def initialize(name = nil, options = nil, html_options = nil)
68
+ @name = name
69
+ @options = options
70
+ @html_options = html_options
71
+ end
72
+
73
+ def view_template(&)
74
+ if block_given?
75
+ @html_options = @options
76
+ @options = @name
77
+ end
78
+
79
+ @html_options ||= {}
80
+ @html_options[:class] = class_variants(class: @html_options[:class])
81
+
82
+ if block_given?
83
+ link_to(@options, @html_options, &)
84
+ else
85
+ link_to(@name, @options, @html_options)
86
+ end
87
+ end
88
+ end
89
+
90
+ class BreadcrumbSeparator < Base
91
+ class_variants(base: "[&>svg]:size-3.5")
92
+
93
+ def default_attributes
94
+ {
95
+ role: "presentation",
96
+ aria: {
97
+ hidden: "true",
98
+ },
99
+ }
100
+ end
101
+
102
+ def view_template(&)
103
+ li(**@attributes) do
104
+ if block_given?
105
+ yield
106
+ else
107
+ icon("chevron-right")
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ class BreadcrumbPage < Base
114
+ class_variants(base: "font-normal text-foreground")
115
+
116
+ def default_attributes
117
+ {
118
+ role: "link",
119
+ aria: {
120
+ disabled: "true",
121
+ current: "page",
122
+ },
123
+ }
124
+ end
125
+
126
+ def view_template(&)
127
+ span(**@attributes, &)
128
+ end
129
+ end
130
+
131
+ class BreadcrumbEllipsis < Base
132
+ class_variants(base: "flex size-9 items-center justify-center")
133
+
134
+ def default_attributes
135
+ {
136
+ role: "presentation",
137
+ aria: {
138
+ hidden: "true",
139
+ },
140
+ }
141
+ end
142
+
143
+ def view_template
144
+ span(**@attributes) do
145
+ icon("ellipsis", class: "size-4")
146
+ span(class: "sr-only") { "More" }
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Button < Base
5
+ class_variants(
6
+ base: <<~HEREDOC,
7
+ inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium
8
+ transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none
9
+ [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring
10
+ focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20
11
+ dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive
12
+ HEREDOC
13
+ variants: {
14
+ variant: {
15
+ default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
16
+ destructive: "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
17
+ outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
18
+ secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
19
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
20
+ link: "text-primary underline-offset-4 hover:underline",
21
+ },
22
+ size: {
23
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
24
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
25
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
26
+ icon: "size-9",
27
+ },
28
+ },
29
+ defaults: {
30
+ variant: :default,
31
+ size: :default,
32
+ },
33
+ )
34
+
35
+ def initialize(variant: :default, size: :default, type: :button, **attributes)
36
+ @class_variants = { variant: variant, size: size }
37
+ @type = type
38
+ super(**attributes)
39
+ end
40
+
41
+ def default_attributes
42
+ { type: @type }
43
+ end
44
+
45
+ def view_template(&)
46
+ button(**@attributes, &)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Card < Base
5
+ class_variants(base: "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm")
6
+
7
+ def header(**attributes, &)
8
+ CardHeader(**attributes, &)
9
+ end
10
+
11
+ def title(**attributes, &)
12
+ CardTitle(**attributes, &)
13
+ end
14
+
15
+ def description(**attributes, &)
16
+ CardDescription(**attributes, &)
17
+ end
18
+
19
+ def action(**attributes, &)
20
+ CardAction(**attributes, &)
21
+ end
22
+
23
+ def content(**attributes, &)
24
+ CardContent(**attributes, &)
25
+ end
26
+
27
+ def footer(**attributes, &)
28
+ CardFooter(**attributes, &)
29
+ end
30
+
31
+ def view_template(&)
32
+ div(**@attributes, &)
33
+ end
34
+ end
35
+
36
+ class CardHeader < Base
37
+ class_variants(
38
+ base: <<~HEREDOC,
39
+ @container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5
40
+ px-6 has-data-[shadcn-phlexcomponents=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6
41
+ HEREDOC
42
+ )
43
+
44
+ def view_template(&)
45
+ div(**@attributes, &)
46
+ end
47
+ end
48
+
49
+ class CardTitle < Base
50
+ class_variants(base: "leading-none font-semibold")
51
+
52
+ def view_template(&)
53
+ div(**@attributes, &)
54
+ end
55
+ end
56
+
57
+ class CardDescription < Base
58
+ class_variants(base: "text-muted-foreground text-sm")
59
+
60
+ def view_template(&)
61
+ div(**@attributes, &)
62
+ end
63
+ end
64
+
65
+ class CardAction < Base
66
+ class_variants(base: "col-start-2 row-span-2 row-start-1 self-start justify-self-end")
67
+
68
+ def view_template(&)
69
+ div(**@attributes, &)
70
+ end
71
+ end
72
+
73
+ class CardContent < Base
74
+ class_variants(base: "px-6")
75
+
76
+ def view_template(&)
77
+ div(**@attributes, &)
78
+ end
79
+ end
80
+
81
+ class CardFooter < Base
82
+ class_variants(base: "flex items-center px-6 [.border-t]:pt-6")
83
+
84
+ def view_template(&)
85
+ div(**@attributes, &)
86
+ end
87
+ end
88
+ end
@@ -2,29 +2,34 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class Checkbox < Base
5
- STYLES = <<~HEREDOC
6
- peer size-4 shrink-0 rounded-sm border border-primary shadow focus-visible:outline-none
7
- focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50
8
- data-[checked=true]:bg-primary data-[checked=true]:text-primary-foreground relative
9
- cursor-pointer group/checkbox
10
- HEREDOC
5
+ class_variants(
6
+ base: <<~HEREDOC,
7
+ peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground
8
+ dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring
9
+ focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40
10
+ aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow
11
+ outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50
12
+ relative
13
+ HEREDOC
14
+ )
11
15
 
12
- def initialize(name: nil, value: "1", unchecked_value: "0", checked: false, id: nil, include_hidden: true,
16
+ def initialize(name: nil, value: "1", unchecked_value: "0", checked: false, include_hidden: true,
13
17
  **attributes)
14
18
  @name = name
15
19
  @value = value
16
20
  @unchecked_value = unchecked_value
17
21
  @checked = checked
18
- @id = id || name
19
22
  @include_hidden = include_hidden
20
23
  super(**attributes)
21
24
  end
22
25
 
23
26
  def view_template(&)
24
27
  button(**@attributes) do
25
- span(class: "absolute inset-0 items-center justify-center text-current
26
- pointer-events-none hidden group-data-[checked=true]/checkbox:flex") do
27
- icon("check", class: "size-4")
28
+ span(
29
+ class: "flex items-center justify-center text-current transition-none",
30
+ data: { checkbox_target: "indicator" },
31
+ ) do
32
+ icon("check", class: "size-3.5")
28
33
  end
29
34
 
30
35
  if @include_hidden
@@ -40,7 +45,7 @@ module ShadcnPhlexcomponents
40
45
  checked: @checked,
41
46
  aria: { hidden: true },
42
47
  data: {
43
- "checkbox-target": "input",
48
+ checkbox_target: "input",
44
49
  },
45
50
  )
46
51
  end
@@ -48,7 +53,6 @@ module ShadcnPhlexcomponents
48
53
 
49
54
  def default_attributes
50
55
  {
51
- id: @id,
52
56
  type: "button",
53
57
  role: "checkbox",
54
58
  aria: {
@@ -61,7 +65,7 @@ module ShadcnPhlexcomponents
61
65
  click->checkbox#toggle
62
66
  keydown.enter->checkbox#preventDefault
63
67
  HEREDOC
64
- "checkbox-checked-value": @checked,
68
+ checkbox_is_checked_value: @checked,
65
69
  },
66
70
  }
67
71
  end
@@ -2,13 +2,12 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class CheckboxGroup < Base
5
- STYLES = "space-y-1.5"
5
+ class_variants(base: "space-y-1.5")
6
6
 
7
- def initialize(name:, value: [], include_hidden: true, item_id_prefix: nil, **attributes)
7
+ def initialize(name:, value: [], include_hidden: true, **attributes)
8
8
  @name = name
9
9
  @value = value
10
10
  @include_hidden = include_hidden
11
- @item_id_prefix = item_id_prefix
12
11
  super(**attributes)
13
12
  end
14
13
 
@@ -22,10 +21,10 @@ module ShadcnPhlexcomponents
22
21
  nil
23
22
  end
24
23
 
25
- def items(collection, value_method:, text_method:, wrapper_class: nil, disabled_items: nil, &)
24
+ def items(collection, value_method:, text_method:, container_class: nil, disabled_items: nil, id_prefix: nil, &)
26
25
  vanish(&)
27
26
 
28
- @wrapper_class = TAILWIND_MERGER.merge("flex items-center space-x-2 #{wrapper_class}")
27
+ container_class = TAILWIND_MERGER.merge("flex flex-row items-center gap-2 #{container_class}")
29
28
 
30
29
  if collection.first&.is_a?(Hash)
31
30
  collection = convert_collection_hash_to_struct(collection, value_method: value_method, text_method: text_method)
@@ -35,13 +34,13 @@ module ShadcnPhlexcomponents
35
34
  value = item.public_send(value_method)
36
35
  text = item.public_send(text_method)
37
36
 
38
- id = if @item_id_prefix
39
- "#{@item_id_prefix.parameterize.underscore}_#{value}"
37
+ id = if id_prefix
38
+ "#{id_prefix.parameterize.underscore}_#{value}"
40
39
  else
41
40
  "#{@name.parameterize.underscore}_#{value}"
42
41
  end
43
42
 
44
- div(class: @wrapper_class) do
43
+ div(class: container_class) do
45
44
  Checkbox(
46
45
  name: "#{@name}[]",
47
46
  id: id,
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Collapsible < Base
5
+ def initialize(open: false, **attributes)
6
+ @open = open
7
+ @aria_id = "collapsible-#{SecureRandom.hex(5)}"
8
+ super(**attributes)
9
+ end
10
+
11
+ def trigger(**attributes, &)
12
+ CollapsibleTrigger(aria_id: @aria_id, **attributes, &)
13
+ end
14
+
15
+ def content(**attributes, &)
16
+ CollapsibleContent(aria_id: @aria_id, **attributes, &)
17
+ end
18
+
19
+ def default_attributes
20
+ {
21
+ data: {
22
+ controller: "collapsible",
23
+ collapsible_is_open_value: @open.to_s,
24
+ },
25
+ }
26
+ end
27
+
28
+ def view_template(&)
29
+ div(**@attributes, &)
30
+ end
31
+ end
32
+
33
+ class CollapsibleTrigger < Base
34
+ def initialize(as_child: false, aria_id: nil, **attributes)
35
+ @as_child = as_child
36
+ @aria_id = aria_id
37
+ super(**attributes)
38
+ end
39
+
40
+ def default_attributes
41
+ {
42
+ role: "button",
43
+ aria: {
44
+ expanded: "false",
45
+ controls: "#{@aria_id}-content",
46
+ },
47
+ data: {
48
+ state: "closed",
49
+ action: "click->collapsible#toggle",
50
+ collapsible_target: "trigger",
51
+ },
52
+ }
53
+ end
54
+
55
+ def view_template(&)
56
+ if @as_child
57
+ content = capture(&)
58
+ element = find_as_child(content.to_s)
59
+ vanish(&)
60
+ merged_attributes = merged_as_child_attributes(element, @attributes)
61
+
62
+ send(element.name, **merged_attributes) do
63
+ sanitize_as_child(element.children.to_s)
64
+ end
65
+ else
66
+ div(**@attributes, &)
67
+ end
68
+ end
69
+ end
70
+
71
+ class CollapsibleContent < Base
72
+ def initialize(aria_id: :nil, **attributes)
73
+ @aria_id = aria_id
74
+ super(**attributes)
75
+ end
76
+
77
+ def default_attributes
78
+ {
79
+ id: "#{@aria_id}-content",
80
+ data: {
81
+ collapsible_target: "content",
82
+ },
83
+ }
84
+ end
85
+
86
+ def view_template(&)
87
+ @class = @attributes.delete(:class)
88
+ div(class: "#{@class} hidden", **@attributes, &)
89
+ end
90
+ end
91
+ end