shadcn_phlexcomponents 0.1.9 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/app/javascript/controllers/accordion_controller.ts +136 -0
  3. data/app/javascript/controllers/alert_dialog_controller.ts +12 -0
  4. data/app/javascript/controllers/avatar_controller.ts +24 -0
  5. data/app/javascript/controllers/checkbox_controller.ts +41 -0
  6. data/app/javascript/controllers/collapsible_controller.ts +52 -0
  7. data/app/javascript/controllers/combobox_controller.ts +376 -0
  8. data/app/javascript/controllers/command_controller.ts +301 -0
  9. data/app/javascript/controllers/date_picker_controller.ts +334 -0
  10. data/app/javascript/controllers/date_range_picker_controller.ts +253 -0
  11. data/app/javascript/controllers/dialog_controller.ts +115 -0
  12. data/app/javascript/controllers/dropdown_menu_controller.ts +309 -0
  13. data/app/javascript/controllers/dropdown_menu_sub_controller.ts +152 -0
  14. data/app/javascript/controllers/form_field_controller.ts +27 -0
  15. data/app/javascript/controllers/hover_card_controller.ts +103 -0
  16. data/app/javascript/controllers/{loading_button_controller.js → loading_button_controller.ts} +7 -2
  17. data/app/javascript/controllers/popover_controller.ts +118 -0
  18. data/app/javascript/controllers/progress_controller.ts +23 -0
  19. data/app/javascript/controllers/radio_group_controller.ts +113 -0
  20. data/app/javascript/controllers/select_controller.ts +341 -0
  21. data/app/javascript/controllers/{sidebar_controller.js → sidebar_controller.ts} +6 -2
  22. data/app/javascript/controllers/sidebar_trigger_controller.ts +21 -0
  23. data/app/javascript/controllers/slider_controller.ts +114 -0
  24. data/app/javascript/controllers/switch_controller.ts +37 -0
  25. data/app/javascript/controllers/tabs_controller.ts +87 -0
  26. data/app/javascript/controllers/theme_switcher_controller.ts +40 -0
  27. data/app/javascript/controllers/toast_container_controller.ts +67 -0
  28. data/app/javascript/controllers/toast_controller.ts +34 -0
  29. data/app/javascript/controllers/toggle_controller.ts +28 -0
  30. data/app/javascript/controllers/toggle_group_controller.ts +28 -0
  31. data/app/javascript/controllers/tooltip_controller.ts +110 -0
  32. data/app/javascript/shadcn_phlexcomponents.ts +61 -0
  33. data/app/javascript/utils/command.ts +544 -0
  34. data/app/javascript/utils/floating_ui.ts +196 -0
  35. data/app/javascript/utils/index.ts +417 -0
  36. data/app/stylesheets/date_picker.css +81 -101
  37. data/app/stylesheets/nouislider.css +173 -0
  38. data/app/stylesheets/tw-animate.css +486 -0
  39. data/lib/install/install_shadcn_phlexcomponents.rb +16 -3
  40. data/lib/shadcn_phlexcomponents/alias.rb +6 -1
  41. data/lib/shadcn_phlexcomponents/components/accordion.rb +130 -0
  42. data/lib/shadcn_phlexcomponents/components/alert.rb +59 -0
  43. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +279 -0
  44. data/lib/shadcn_phlexcomponents/components/{aspect_ratio/aspect_ratio.rb → aspect_ratio.rb} +2 -2
  45. data/lib/shadcn_phlexcomponents/components/avatar.rb +63 -0
  46. data/lib/shadcn_phlexcomponents/components/badge.rb +35 -0
  47. data/lib/shadcn_phlexcomponents/components/base.rb +48 -7
  48. data/lib/shadcn_phlexcomponents/components/breadcrumb.rb +150 -0
  49. data/lib/shadcn_phlexcomponents/components/button.rb +49 -0
  50. data/lib/shadcn_phlexcomponents/components/card.rb +88 -0
  51. data/lib/shadcn_phlexcomponents/components/{checkbox/checkbox.rb → checkbox.rb} +18 -14
  52. data/lib/shadcn_phlexcomponents/components/{checkbox_group/checkbox_group.rb → checkbox_group.rb} +7 -8
  53. data/lib/shadcn_phlexcomponents/components/collapsible.rb +90 -0
  54. data/lib/shadcn_phlexcomponents/components/combobox.rb +428 -0
  55. data/lib/shadcn_phlexcomponents/components/command.rb +381 -0
  56. data/lib/shadcn_phlexcomponents/components/date_picker.rb +208 -0
  57. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +143 -0
  58. data/lib/shadcn_phlexcomponents/components/dialog.rb +236 -0
  59. data/lib/shadcn_phlexcomponents/components/dropdown_menu.rb +283 -0
  60. data/lib/shadcn_phlexcomponents/components/dropdown_menu_sub.rb +136 -0
  61. data/lib/shadcn_phlexcomponents/components/form/form_checkbox.rb +6 -7
  62. data/lib/shadcn_phlexcomponents/components/form/form_checkbox_group.rb +2 -2
  63. data/lib/shadcn_phlexcomponents/components/form/form_combobox.rb +64 -0
  64. data/lib/shadcn_phlexcomponents/components/form/form_date_picker.rb +3 -4
  65. data/lib/shadcn_phlexcomponents/components/form/form_date_range_picker.rb +27 -41
  66. data/lib/shadcn_phlexcomponents/components/form/form_error.rb +1 -1
  67. data/lib/shadcn_phlexcomponents/components/form/form_helpers.rb +43 -8
  68. data/lib/shadcn_phlexcomponents/components/form/form_hint.rb +1 -1
  69. data/lib/shadcn_phlexcomponents/components/form/form_input.rb +3 -4
  70. data/lib/shadcn_phlexcomponents/components/form/form_radio_group.rb +4 -5
  71. data/lib/shadcn_phlexcomponents/components/form/form_select.rb +3 -4
  72. data/lib/shadcn_phlexcomponents/components/form/form_slider.rb +91 -0
  73. data/lib/shadcn_phlexcomponents/components/form/form_switch.rb +7 -6
  74. data/lib/shadcn_phlexcomponents/components/form/form_textarea.rb +3 -4
  75. data/lib/shadcn_phlexcomponents/components/{form/form.rb → form.rb} +36 -4
  76. data/lib/shadcn_phlexcomponents/components/hover_card.rb +111 -0
  77. data/lib/shadcn_phlexcomponents/components/input.rb +31 -0
  78. data/lib/shadcn_phlexcomponents/components/label.rb +16 -0
  79. data/lib/shadcn_phlexcomponents/components/{link/link.rb → link.rb} +10 -3
  80. data/lib/shadcn_phlexcomponents/components/{loading_button/loading_button.rb → loading_button.rb} +9 -2
  81. data/lib/shadcn_phlexcomponents/components/pagination.rb +166 -0
  82. data/lib/shadcn_phlexcomponents/components/popover.rb +116 -0
  83. data/lib/shadcn_phlexcomponents/components/{progress/progress.rb → progress.rb} +4 -4
  84. data/lib/shadcn_phlexcomponents/components/radio_group.rb +155 -0
  85. data/lib/shadcn_phlexcomponents/components/select.rb +406 -0
  86. data/lib/shadcn_phlexcomponents/components/{separator/separator.rb → separator.rb} +9 -8
  87. data/lib/shadcn_phlexcomponents/components/sheet.rb +243 -0
  88. data/lib/shadcn_phlexcomponents/components/{skeleton/skeleton.rb → skeleton.rb} +1 -1
  89. data/lib/shadcn_phlexcomponents/components/slider.rb +72 -0
  90. data/lib/shadcn_phlexcomponents/components/switch.rb +75 -0
  91. data/lib/shadcn_phlexcomponents/components/table.rb +140 -0
  92. data/lib/shadcn_phlexcomponents/components/tabs.rb +135 -0
  93. data/lib/shadcn_phlexcomponents/components/textarea.rb +24 -0
  94. data/lib/shadcn_phlexcomponents/components/toast.rb +153 -0
  95. data/lib/shadcn_phlexcomponents/components/{toast/toast_container.rb → toast_container.rb} +23 -4
  96. data/lib/shadcn_phlexcomponents/components/toggle.rb +54 -0
  97. data/lib/shadcn_phlexcomponents/components/tooltip.rb +132 -0
  98. data/lib/shadcn_phlexcomponents/engine.rb +1 -5
  99. data/lib/shadcn_phlexcomponents/initializers/shadcn_phlexcomponents.rb +25 -0
  100. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  101. data/lib/tasks/install.rake +1 -1
  102. metadata +83 -167
  103. data/app/javascript/controllers/accordion_controller.js +0 -124
  104. data/app/javascript/controllers/alert_dialog_controller.js +0 -21
  105. data/app/javascript/controllers/avatar_controller.js +0 -15
  106. data/app/javascript/controllers/checkbox_controller.js +0 -28
  107. data/app/javascript/controllers/collapsible_controller.js +0 -35
  108. data/app/javascript/controllers/combobox_controller.js +0 -54
  109. data/app/javascript/controllers/date_picker_controller.js +0 -253
  110. data/app/javascript/controllers/date_range_picker_controller.js +0 -344
  111. data/app/javascript/controllers/dialog_controller.js +0 -114
  112. data/app/javascript/controllers/dropdown_menu_controller.js +0 -171
  113. data/app/javascript/controllers/form_field_controller.js +0 -24
  114. data/app/javascript/controllers/hover_card_controller.js +0 -21
  115. data/app/javascript/controllers/popover_controller.js +0 -113
  116. data/app/javascript/controllers/progress_controller.js +0 -14
  117. data/app/javascript/controllers/radio_group_controller.js +0 -90
  118. data/app/javascript/controllers/select_controller.js +0 -274
  119. data/app/javascript/controllers/sidebar_trigger_controller.js +0 -15
  120. data/app/javascript/controllers/switch_controller.js +0 -24
  121. data/app/javascript/controllers/tabs_controller.js +0 -73
  122. data/app/javascript/controllers/theme_switcher_controller.js +0 -32
  123. data/app/javascript/controllers/toast_container_controller.js +0 -22
  124. data/app/javascript/controllers/toast_controller.js +0 -45
  125. data/app/javascript/controllers/tooltip_controller.js +0 -40
  126. data/app/javascript/shadcn_phlexcomponents.js +0 -53
  127. data/app/javascript/utils.js +0 -184
  128. data/app/stylesheets/choices.css +0 -324
  129. data/app/stylesheets/tailwindcss-animate.css +0 -318
  130. data/lib/shadcn_phlexcomponents/components/accordion/accordion.rb +0 -38
  131. data/lib/shadcn_phlexcomponents/components/accordion/accordion_content.rb +0 -30
  132. data/lib/shadcn_phlexcomponents/components/accordion/accordion_item.rb +0 -26
  133. data/lib/shadcn_phlexcomponents/components/accordion/accordion_trigger.rb +0 -46
  134. data/lib/shadcn_phlexcomponents/components/alert/alert.rb +0 -40
  135. data/lib/shadcn_phlexcomponents/components/alert/alert_description.rb +0 -11
  136. data/lib/shadcn_phlexcomponents/components/alert/alert_title.rb +0 -11
  137. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog.rb +0 -60
  138. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_action.rb +0 -22
  139. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_action_to.rb +0 -40
  140. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_cancel.rb +0 -22
  141. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_content.rb +0 -40
  142. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_description.rb +0 -22
  143. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_footer.rb +0 -11
  144. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_header.rb +0 -11
  145. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_title.rb +0 -22
  146. data/lib/shadcn_phlexcomponents/components/alert_dialog/alert_dialog_trigger.rb +0 -50
  147. data/lib/shadcn_phlexcomponents/components/avatar/avatar.rb +0 -31
  148. data/lib/shadcn_phlexcomponents/components/avatar/avatar_fallback.rb +0 -21
  149. data/lib/shadcn_phlexcomponents/components/avatar/avatar_image.rb +0 -19
  150. data/lib/shadcn_phlexcomponents/components/badge/badge.rb +0 -30
  151. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb.rb +0 -53
  152. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_ellipsis.rb +0 -23
  153. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_item.rb +0 -11
  154. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_link.rb +0 -7
  155. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_page.rb +0 -21
  156. data/lib/shadcn_phlexcomponents/components/breadcrumb/breadcrumb_separator.rb +0 -26
  157. data/lib/shadcn_phlexcomponents/components/button/button.rb +0 -53
  158. data/lib/shadcn_phlexcomponents/components/card/card.rb +0 -31
  159. data/lib/shadcn_phlexcomponents/components/card/card_content.rb +0 -11
  160. data/lib/shadcn_phlexcomponents/components/card/card_description.rb +0 -11
  161. data/lib/shadcn_phlexcomponents/components/card/card_footer.rb +0 -11
  162. data/lib/shadcn_phlexcomponents/components/card/card_header.rb +0 -11
  163. data/lib/shadcn_phlexcomponents/components/card/card_title.rb +0 -11
  164. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible.rb +0 -31
  165. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible_content.rb +0 -24
  166. data/lib/shadcn_phlexcomponents/components/collapsible/collapsible_trigger.rb +0 -50
  167. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker.rb +0 -87
  168. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker_content.rb +0 -45
  169. data/lib/shadcn_phlexcomponents/components/date_picker/date_picker_trigger.rb +0 -64
  170. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker.rb +0 -105
  171. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker_content.rb +0 -9
  172. data/lib/shadcn_phlexcomponents/components/date_range_picker/date_range_picker_trigger.rb +0 -9
  173. data/lib/shadcn_phlexcomponents/components/dialog/dialog.rb +0 -52
  174. data/lib/shadcn_phlexcomponents/components/dialog/dialog_close.rb +0 -42
  175. data/lib/shadcn_phlexcomponents/components/dialog/dialog_content.rb +0 -54
  176. data/lib/shadcn_phlexcomponents/components/dialog/dialog_description.rb +0 -22
  177. data/lib/shadcn_phlexcomponents/components/dialog/dialog_footer.rb +0 -11
  178. data/lib/shadcn_phlexcomponents/components/dialog/dialog_header.rb +0 -11
  179. data/lib/shadcn_phlexcomponents/components/dialog/dialog_title.rb +0 -22
  180. data/lib/shadcn_phlexcomponents/components/dialog/dialog_trigger.rb +0 -50
  181. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu.rb +0 -50
  182. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_content.rb +0 -52
  183. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_item.rb +0 -56
  184. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_item_to.rb +0 -28
  185. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_label.rb +0 -11
  186. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_separator.rb +0 -20
  187. data/lib/shadcn_phlexcomponents/components/dropdown_menu/dropdown_menu_trigger.rb +0 -57
  188. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card.rb +0 -33
  189. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card_content.rb +0 -32
  190. data/lib/shadcn_phlexcomponents/components/hover_card/hover_card_trigger.rb +0 -44
  191. data/lib/shadcn_phlexcomponents/components/input/input.rb +0 -32
  192. data/lib/shadcn_phlexcomponents/components/label/label.rb +0 -14
  193. data/lib/shadcn_phlexcomponents/components/pagination/pagination.rb +0 -38
  194. data/lib/shadcn_phlexcomponents/components/pagination/pagination_ellipsis.rb +0 -24
  195. data/lib/shadcn_phlexcomponents/components/pagination/pagination_link.rb +0 -34
  196. data/lib/shadcn_phlexcomponents/components/pagination/pagination_next.rb +0 -32
  197. data/lib/shadcn_phlexcomponents/components/pagination/pagination_previous.rb +0 -32
  198. data/lib/shadcn_phlexcomponents/components/popover/popover.rb +0 -34
  199. data/lib/shadcn_phlexcomponents/components/popover/popover_content.rb +0 -40
  200. data/lib/shadcn_phlexcomponents/components/popover/popover_trigger.rb +0 -50
  201. data/lib/shadcn_phlexcomponents/components/radio_group/radio_group.rb +0 -88
  202. data/lib/shadcn_phlexcomponents/components/radio_group/radio_group_item.rb +0 -66
  203. data/lib/shadcn_phlexcomponents/components/select/select.rb +0 -194
  204. data/lib/shadcn_phlexcomponents/components/select/select_content.rb +0 -64
  205. data/lib/shadcn_phlexcomponents/components/select/select_group.rb +0 -23
  206. data/lib/shadcn_phlexcomponents/components/select/select_item.rb +0 -59
  207. data/lib/shadcn_phlexcomponents/components/select/select_label.rb +0 -24
  208. data/lib/shadcn_phlexcomponents/components/select/select_trigger.rb +0 -56
  209. data/lib/shadcn_phlexcomponents/components/sheet/sheet.rb +0 -53
  210. data/lib/shadcn_phlexcomponents/components/sheet/sheet_close.rb +0 -42
  211. data/lib/shadcn_phlexcomponents/components/sheet/sheet_content.rb +0 -65
  212. data/lib/shadcn_phlexcomponents/components/sheet/sheet_description.rb +0 -22
  213. data/lib/shadcn_phlexcomponents/components/sheet/sheet_footer.rb +0 -11
  214. data/lib/shadcn_phlexcomponents/components/sheet/sheet_header.rb +0 -11
  215. data/lib/shadcn_phlexcomponents/components/sheet/sheet_title.rb +0 -22
  216. data/lib/shadcn_phlexcomponents/components/sheet/sheet_trigger.rb +0 -50
  217. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar.rb +0 -108
  218. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_container.rb +0 -11
  219. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_content.rb +0 -11
  220. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_footer.rb +0 -11
  221. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group.rb +0 -11
  222. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group_content.rb +0 -11
  223. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_group_label.rb +0 -16
  224. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_header.rb +0 -11
  225. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_inset.rb +0 -15
  226. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu.rb +0 -11
  227. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_button.rb +0 -61
  228. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_item.rb +0 -9
  229. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub.rb +0 -14
  230. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub_button.rb +0 -48
  231. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_menu_sub_item.rb +0 -9
  232. data/lib/shadcn_phlexcomponents/components/sidebar/sidebar_trigger.rb +0 -40
  233. data/lib/shadcn_phlexcomponents/components/switch/switch.rb +0 -66
  234. data/lib/shadcn_phlexcomponents/components/table/table.rb +0 -75
  235. data/lib/shadcn_phlexcomponents/components/table/table_body.rb +0 -11
  236. data/lib/shadcn_phlexcomponents/components/table/table_caption.rb +0 -11
  237. data/lib/shadcn_phlexcomponents/components/table/table_cell.rb +0 -11
  238. data/lib/shadcn_phlexcomponents/components/table/table_footer.rb +0 -11
  239. data/lib/shadcn_phlexcomponents/components/table/table_head.rb +0 -14
  240. data/lib/shadcn_phlexcomponents/components/table/table_header.rb +0 -11
  241. data/lib/shadcn_phlexcomponents/components/table/table_row.rb +0 -11
  242. data/lib/shadcn_phlexcomponents/components/tabs/tabs.rb +0 -38
  243. data/lib/shadcn_phlexcomponents/components/tabs/tabs_content.rb +0 -35
  244. data/lib/shadcn_phlexcomponents/components/tabs/tabs_list.rb +0 -23
  245. data/lib/shadcn_phlexcomponents/components/tabs/tabs_trigger.rb +0 -45
  246. data/lib/shadcn_phlexcomponents/components/textarea/textarea.rb +0 -29
  247. data/lib/shadcn_phlexcomponents/components/toast/toast.rb +0 -101
  248. data/lib/shadcn_phlexcomponents/components/toast/toast_action.rb +0 -39
  249. data/lib/shadcn_phlexcomponents/components/toast/toast_action_to.rb +0 -28
  250. data/lib/shadcn_phlexcomponents/components/toast/toast_content.rb +0 -11
  251. data/lib/shadcn_phlexcomponents/components/toast/toast_description.rb +0 -11
  252. data/lib/shadcn_phlexcomponents/components/toast/toast_title.rb +0 -11
  253. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip.rb +0 -34
  254. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip_content.rb +0 -39
  255. data/lib/shadcn_phlexcomponents/components/tooltip/tooltip_trigger.rb +0 -48
  256. /data/lib/shadcn_phlexcomponents/components/{theme_switcher/theme_switcher.rb → theme_switcher.rb} +0 -0
@@ -0,0 +1,243 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Sheet < Base
5
+ class_variants(base: "inline-flex max-w-fit")
6
+
7
+ def initialize(open: false, **attributes)
8
+ @open = open
9
+ @aria_id = "sheet-#{SecureRandom.hex(5)}"
10
+ super(**attributes)
11
+ end
12
+
13
+ def trigger(**attributes, &)
14
+ SheetTrigger(aria_id: @aria_id, **attributes, &)
15
+ end
16
+
17
+ def content(**attributes, &)
18
+ SheetContent(aria_id: @aria_id, **attributes, &)
19
+ end
20
+
21
+ def header(**attributes, &)
22
+ SheetHeader(**attributes, &)
23
+ end
24
+
25
+ def title(**attributes, &)
26
+ SheetTitle(aria_id: @aria_id, **attributes, &)
27
+ end
28
+
29
+ def description(**attributes, &)
30
+ SheetDescription(aria_id: @aria_id, **attributes, &)
31
+ end
32
+
33
+ def footer(**attributes, &)
34
+ SheetFooter(**attributes, &)
35
+ end
36
+
37
+ def close(**attributes, &)
38
+ SheetClose(**attributes, &)
39
+ end
40
+
41
+ def default_attributes
42
+ {
43
+ data: {
44
+ controller: "dialog",
45
+ dialog_is_open_value: @open.to_s
46
+ }
47
+ }
48
+ end
49
+
50
+ def view_template(&)
51
+ div(**@attributes) do
52
+ overlay("dialog")
53
+
54
+ yield
55
+ end
56
+ end
57
+ end
58
+
59
+ class SheetTrigger < Base
60
+ def initialize(as_child: false, aria_id: nil, **attributes)
61
+ @as_child = as_child
62
+ @aria_id = aria_id
63
+ super(**attributes)
64
+ end
65
+
66
+ def default_attributes
67
+ {
68
+ role: "button",
69
+ aria: {
70
+ haspopup: "dialog",
71
+ expanded: false,
72
+ controls: "#{@aria_id}-content",
73
+ },
74
+ data: {
75
+ as_child: @as_child.to_s,
76
+ dialog_target: "trigger",
77
+ action: "click->dialog#open"
78
+ },
79
+ }
80
+ end
81
+
82
+ def view_template(&)
83
+ if @as_child
84
+ content = capture(&)
85
+ element = find_as_child(content.to_s)
86
+ vanish(&)
87
+ merged_attributes = merged_as_child_attributes(element, @attributes)
88
+
89
+ send(element.name, **merged_attributes) do
90
+ sanitize_as_child(element.children.to_s)
91
+ end
92
+ else
93
+ div(**@attributes, &)
94
+ end
95
+ end
96
+ end
97
+
98
+ class SheetContent < Base
99
+ class_variants(
100
+ base: <<~HEREDOC,
101
+ bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4
102
+ shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500
103
+ pointer-events-auto outline-none
104
+ HEREDOC
105
+ variants: {
106
+ side: {
107
+ top: "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",
108
+ left: "h-screen data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 w-3/4 border-r sm:max-w-sm",
109
+ right: "h-screen data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 w-3/4 border-l sm:max-w-sm",
110
+ bottom: "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",
111
+ },
112
+ },
113
+ defaults: {
114
+ side: :right,
115
+ },
116
+ )
117
+
118
+ def initialize(side: :right, aria_id: nil, **attributes)
119
+ @class_variants = { side: side }
120
+ @aria_id = aria_id
121
+ super(**attributes)
122
+ end
123
+
124
+ def view_template(&)
125
+ div(style: { display: "none" }, **@attributes) do
126
+ yield
127
+
128
+ button(
129
+ class: <<~HEREDOC,
130
+ ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs
131
+ opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden
132
+ disabled:pointer-events-none
133
+ HEREDOC
134
+ data: { action: "click->dialog#close" },
135
+ ) do
136
+ icon("x", class: "size-4")
137
+ span(class: "sr-only") { "close" }
138
+ end
139
+ end
140
+ end
141
+
142
+ def default_attributes
143
+ {
144
+ id: "#{@aria_id}-content",
145
+ tabindex: -1,
146
+ role: "dialog",
147
+ aria: {
148
+ describedby: "#{@aria_id}-description",
149
+ labelledby: "#{@aria_id}-title",
150
+ },
151
+ data: {
152
+ state: "closed",
153
+ dialog_target: "content"
154
+ },
155
+ }
156
+ end
157
+ end
158
+
159
+ class SheetHeader < Base
160
+ class_variants(base: "flex flex-col gap-1.5 p-4")
161
+
162
+ def view_template(&)
163
+ div(**@attributes, &)
164
+ end
165
+ end
166
+
167
+ class SheetTitle < Base
168
+ class_variants(base: "text-foreground font-semibold")
169
+
170
+ def initialize(aria_id: nil, **attributes)
171
+ @aria_id = aria_id
172
+ super(**attributes)
173
+ end
174
+
175
+ def default_attributes
176
+ {
177
+ id: "#{@aria_id}-title",
178
+ }
179
+ end
180
+
181
+ def view_template(&)
182
+ h2(**@attributes, &)
183
+ end
184
+ end
185
+
186
+ class SheetDescription < Base
187
+ class_variants(base: "text-muted-foreground text-sm")
188
+
189
+ def initialize(aria_id: nil, **attributes)
190
+ @aria_id = aria_id
191
+ super(**attributes)
192
+ end
193
+
194
+ def default_attributes
195
+ {
196
+ id: "#{@aria_id}-description",
197
+ }
198
+ end
199
+
200
+ def view_template(&)
201
+ p(**@attributes, &)
202
+ end
203
+ end
204
+
205
+ class SheetFooter < Base
206
+ class_variants(base: "mt-auto flex flex-col gap-2 p-4")
207
+
208
+ def view_template(&)
209
+ div(**@attributes, &)
210
+ end
211
+ end
212
+
213
+ class SheetClose < Base
214
+ def initialize(as_child: false, **attributes)
215
+ @as_child = as_child
216
+ super(**attributes)
217
+ end
218
+
219
+ def view_template(&)
220
+ if @as_child
221
+ content = capture(&)
222
+ element = find_as_child(content.to_s)
223
+ vanish(&)
224
+ merged_attributes = merged_as_child_attributes(element, @attributes)
225
+
226
+ send(element.name, **merged_attributes) do
227
+ sanitize_as_child(element.children.to_s)
228
+ end
229
+ else
230
+ div(**@attributes, &)
231
+ end
232
+ end
233
+
234
+ def default_attributes
235
+ {
236
+ role: "button",
237
+ data: {
238
+ action: "click->dialog#close",
239
+ },
240
+ }
241
+ end
242
+ end
243
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class Skeleton < Base
5
- STYLES = "animate-pulse rounded-md bg-primary/10"
5
+ class_variants(base: "bg-accent animate-pulse rounded-md")
6
6
 
7
7
  def view_template(&)
8
8
  div(**@attributes, &)
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Slider < Base
5
+ def initialize(name: nil, value: nil, id: nil, range: false, orientation: :horizontal, step: 1, min: 0, max: 100, disabled: false, options: false, **attributes)
6
+ if range
7
+ if name && !name.is_a?(Array)
8
+ raise ArgumentError, "Expected an array for \"name\", got #{name.class}"
9
+ end
10
+
11
+ if value && !value.is_a?(Array)
12
+ raise ArgumentError, "Expected an array for \"value\", got #{value.class}"
13
+ end
14
+ end
15
+ @range = range
16
+ @name = range && name ? name[0] : name
17
+ @end_name = range && name ? name[1] : nil
18
+ @value = range && value ? value[0] : value
19
+ @end_value = range && value ? value[1] : nil
20
+ @id = id
21
+ @orientation = orientation
22
+ @step = step
23
+ @min = min
24
+ @max = max
25
+ @disabled = disabled
26
+ @options = options
27
+ super(**attributes)
28
+ end
29
+
30
+ def default_attributes
31
+ {
32
+ data: {
33
+ controller: "slider",
34
+ range: @range.to_s,
35
+ options: @options.to_json,
36
+ value: @value,
37
+ end_value: @end_value,
38
+ orientation: @orientation,
39
+ step: @step,
40
+ min: @min,
41
+ max: @max,
42
+ disabled: @disabled.to_s,
43
+ id: @id,
44
+ },
45
+ }
46
+ end
47
+
48
+ def view_template
49
+ div(class: "py-[6px]") do
50
+ div(**@attributes) do
51
+ input(
52
+ type: :hidden,
53
+ name: @name,
54
+ value: @value,
55
+ data: { slider_target: "hiddenInput" },
56
+ )
57
+
58
+ if @range
59
+ input(
60
+ type: :hidden,
61
+ name: @end_name,
62
+ value: @end_value,
63
+ data: { slider_target: "endHiddenInput" },
64
+ )
65
+ end
66
+
67
+ div(data: { slider_target: "slider" })
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Switch < Base
5
+ class_variants(
6
+ base: <<~HEREDOC,
7
+ peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring
8
+ focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem]
9
+ w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all
10
+ outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 relative
11
+ HEREDOC
12
+ )
13
+
14
+ def initialize(name: nil, value: "1", unchecked_value: "0", checked: false, include_hidden: true, disabled: false, **attributes)
15
+ @name = name
16
+ @value = value
17
+ @unchecked_value = unchecked_value
18
+ @checked = checked
19
+ @include_hidden = include_hidden
20
+ @disabled = disabled
21
+ super(**attributes)
22
+ end
23
+
24
+ def view_template(&)
25
+ button(**@attributes) do
26
+ span(
27
+ class: <<~HEREDOC,
28
+ bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground
29
+ pointer-events-none block size-4 rounded-full ring-0 transition-transform
30
+ data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0
31
+ HEREDOC
32
+ data: {
33
+ switch_target: "thumb",
34
+ state: @checked ? "checked" : "unchecked",
35
+ },
36
+ )
37
+
38
+ if @include_hidden
39
+ input(name: @name, type: "hidden", value: @unchecked_value, autocomplete: "off")
40
+ end
41
+
42
+ input(
43
+ type: "checkbox",
44
+ value: @value,
45
+ class: "-translate-x-full pointer-events-none absolute m-0 top-0 left-0 size-4 opacity-0",
46
+ name: @name,
47
+ disabled: @disabled,
48
+ tabindex: -1,
49
+ checked: @checked,
50
+ aria: { hidden: "true" },
51
+ data: {
52
+ switch_target: "input",
53
+ },
54
+ )
55
+ end
56
+ end
57
+
58
+ def default_attributes
59
+ {
60
+ type: "button",
61
+ role: "switch",
62
+ disabled: @disabled,
63
+ aria: {
64
+ checked: @checked.to_s,
65
+ },
66
+ data: {
67
+ state: @checked ? "checked" : "unchecked",
68
+ controller: "switch",
69
+ action: "click->switch#toggle",
70
+ switch_is_checked_value: @checked.to_s,
71
+ },
72
+ }
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Table < Base
5
+ class_variants(base: "w-full caption-bottom text-sm")
6
+
7
+ def initialize(**attributes)
8
+ @columns = []
9
+ super(**attributes)
10
+ end
11
+
12
+ def view_template(&)
13
+ div(class: "relative w-full overflow-x-auto") do
14
+ table(**@attributes, &)
15
+ end
16
+ end
17
+
18
+ def caption(**attributes, &)
19
+ TableCaption(**attributes, &)
20
+ end
21
+
22
+ def header(**attributes, &)
23
+ TableHeader(**attributes, &)
24
+ end
25
+
26
+ def row(**attributes, &)
27
+ TableRow(**attributes, &)
28
+ end
29
+
30
+ def head(**attributes, &)
31
+ TableHead(**attributes, &)
32
+ end
33
+
34
+ def body(**attributes, &)
35
+ TableBody(**attributes, &)
36
+ end
37
+
38
+ def cell(**attributes, &)
39
+ TableCell(**attributes, &)
40
+ end
41
+
42
+ def footer(**attributes, &)
43
+ TableFooter(**attributes, &)
44
+ end
45
+
46
+ def rows(rows, &)
47
+ @rows = rows
48
+
49
+ vanish(&)
50
+
51
+ thead(class: TableHeader.new.class_variants) do
52
+ tr(class: TableRow.new.class_variants) do
53
+ @columns.each do |column|
54
+ th(class: TAILWIND_MERGER.merge("#{TableHead.new.class_variants} #{column[:head_class]}")) { column[:header] }
55
+ end
56
+ end
57
+ end
58
+
59
+ tbody(class: TableBody.new.class_variants) do
60
+ @rows.each do |row|
61
+ tr(class: TableRow.new.class_variants) do
62
+ @columns.each do |column|
63
+ td(class: TAILWIND_MERGER.merge("#{TableCell.new.class_variants} #{column[:cell_class]}")) do
64
+ column[:content].call(row)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ def column(header, head_class: nil, cell_class: nil, &content)
73
+ @columns << { header:, head_class:, cell_class:, content: }
74
+ nil
75
+ end
76
+ end
77
+
78
+ class TableCaption < Base
79
+ class_variants(base: "text-muted-foreground mt-4 text-sm")
80
+
81
+ def view_template(&)
82
+ caption(**@attributes, &)
83
+ end
84
+ end
85
+
86
+ class TableHeader < Base
87
+ class_variants(base: "[&_tr]:border-b")
88
+
89
+ def view_template(&)
90
+ thead(**@attributes, &)
91
+ end
92
+ end
93
+
94
+ class TableRow < Base
95
+ class_variants(base: "hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors")
96
+
97
+ def view_template(&)
98
+ tr(**@attributes, &)
99
+ end
100
+ end
101
+
102
+ class TableHead < Base
103
+ class_variants(
104
+ base: <<~HEREDOC,
105
+ text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0
106
+ [&>[role=checkbox]]:translate-y-[2px]"
107
+ HEREDOC
108
+ )
109
+
110
+ def view_template(&)
111
+ th(**@attributes, &)
112
+ end
113
+ end
114
+
115
+ class TableBody < Base
116
+ class_variants(base: "[&_tr:last-child]:border-0")
117
+
118
+ def view_template(&)
119
+ tbody(**@attributes, &)
120
+ end
121
+ end
122
+
123
+ class TableCell < Base
124
+ class_variants(
125
+ base: "p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
126
+ )
127
+
128
+ def view_template(&)
129
+ td(**@attributes, &)
130
+ end
131
+ end
132
+
133
+ class TableFooter < Base
134
+ class_variants(base: "bg-muted/50 border-t font-medium [&>tr]:last:border-b-0")
135
+
136
+ def view_template(&)
137
+ tfoot(**@attributes, &)
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Tabs < Base
5
+ class_variants(base: "flex flex-col gap-2")
6
+
7
+ def initialize(value: nil, dir: "ltr", **attributes)
8
+ @dir = dir
9
+ @value = value
10
+ @aria_id = "tabs-#{SecureRandom.hex(5)}"
11
+ super(**attributes)
12
+ end
13
+
14
+ def list(**attributes, &)
15
+ TabsList(**attributes, &)
16
+ end
17
+
18
+ def trigger(**attributes, &)
19
+ TabsTrigger(aria_id: @aria_id, **attributes, &)
20
+ end
21
+
22
+ def content(**attributes, &)
23
+ TabsContent(aria_id: @aria_id, **attributes, &)
24
+ end
25
+
26
+ def default_attributes
27
+ {
28
+ dir: @dir,
29
+ data: {
30
+ controller: "tabs",
31
+ tabs_active_value: @value,
32
+ },
33
+ }
34
+ end
35
+
36
+ def view_template(&)
37
+ div(**@attributes, &)
38
+ end
39
+ end
40
+
41
+ class TabsList < Base
42
+ class_variants(
43
+ base: "bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]",
44
+ )
45
+
46
+ def view_template(&)
47
+ div(**@attributes, &)
48
+ end
49
+
50
+ def default_attributes
51
+ {
52
+ role: "tablist",
53
+ tabindex: "-1",
54
+ aria: {
55
+ orientation: "horizontal",
56
+ },
57
+ }
58
+ end
59
+ end
60
+
61
+ class TabsTrigger < Base
62
+ class_variants(
63
+ base: <<~HEREDOC,
64
+ data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring
65
+ focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input
66
+ dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)]
67
+ flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm
68
+ font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1
69
+ disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none
70
+ [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4
71
+ HEREDOC
72
+ )
73
+
74
+ def initialize(value: nil, aria_id: nil, **attributes)
75
+ @value = value
76
+ @aria_id = aria_id
77
+ super(**attributes)
78
+ end
79
+
80
+ def view_template(&)
81
+ button(**@attributes, &)
82
+ end
83
+
84
+ def default_attributes
85
+ {
86
+ id: "#{@aria_id}-trigger-#{@value}",
87
+ role: "tab",
88
+ tabindex: "-1",
89
+ aria: {
90
+ controls: "#{@aria_id}-content-#{@value}",
91
+ selected: false,
92
+ },
93
+ data: {
94
+ tabs_target: "trigger",
95
+ value: @value,
96
+ state: "inactive",
97
+ action: <<~HEREDOC,
98
+ click->tabs#setActiveTab
99
+ keydown.left->tabs#setActiveTab:prevent
100
+ keydown.right->tabs#setActiveTab:prevent
101
+ HEREDOC
102
+ },
103
+ }
104
+ end
105
+ end
106
+
107
+ class TabsContent < Base
108
+ class_variants(base: "flex-1 outline-none")
109
+
110
+ def initialize(value: nil, aria_id: nil, **attributes)
111
+ @value = value
112
+ @aria_id = aria_id
113
+ super(**attributes)
114
+ end
115
+
116
+ def view_template(&)
117
+ div(**@attributes, &)
118
+ end
119
+
120
+ def default_attributes
121
+ {
122
+ id: "#{@aria_id}-content-#{@value}",
123
+ role: "tabpanel",
124
+ tabindex: "0",
125
+ aria: {
126
+ labelledby: "#{@aria_id}-trigger-#{@value}",
127
+ },
128
+ data: {
129
+ value: @value,
130
+ tabs_target: "content",
131
+ },
132
+ }
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Textarea < Base
5
+ class_variants(
6
+ base: <<~HEREDOC,
7
+ border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50
8
+ aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive
9
+ dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2
10
+ text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px]
11
+ disabled:cursor-not-allowed disabled:opacity-50 md:text-sm
12
+ HEREDOC
13
+ )
14
+
15
+ def initialize(value: nil, **attributes)
16
+ @value = value
17
+ super(**attributes)
18
+ end
19
+
20
+ def view_template(&)
21
+ textarea(**@attributes) { @value }
22
+ end
23
+ end
24
+ end