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,239 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Sheet < Base
5
+ class_variants(base: "inline-block 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
+ },
46
+ }
47
+ end
48
+
49
+ def view_template(&)
50
+ div(**@attributes, &)
51
+ end
52
+ end
53
+
54
+ class SheetTrigger < Base
55
+ def initialize(as_child: false, aria_id: nil, **attributes)
56
+ @as_child = as_child
57
+ @aria_id = aria_id
58
+ super(**attributes)
59
+ end
60
+
61
+ def default_attributes
62
+ {
63
+ role: "button",
64
+ aria: {
65
+ haspopup: "dialog",
66
+ expanded: false,
67
+ controls: "#{@aria_id}-content",
68
+ },
69
+ data: {
70
+ as_child: @as_child.to_s,
71
+ action: "click->dialog#open",
72
+ dialog_target: "trigger",
73
+ },
74
+ }
75
+ end
76
+
77
+ def view_template(&)
78
+ if @as_child
79
+ content = capture(&)
80
+ element = find_as_child(content.to_s)
81
+ vanish(&)
82
+ merged_attributes = merged_as_child_attributes(element, @attributes)
83
+
84
+ send(element.name, **merged_attributes) do
85
+ sanitize_as_child(element.children.to_s)
86
+ end
87
+ else
88
+ div(**@attributes, &)
89
+ end
90
+ end
91
+ end
92
+
93
+ class SheetContent < Base
94
+ class_variants(
95
+ base: <<~HEREDOC,
96
+ bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4
97
+ shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500
98
+ pointer-events-auto
99
+ HEREDOC
100
+ variants: {
101
+ side: {
102
+ top: "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",
103
+ 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",
104
+ 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",
105
+ bottom: "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",
106
+ },
107
+ },
108
+ defaults: {
109
+ side: :right,
110
+ },
111
+ )
112
+
113
+ def initialize(side: :right, aria_id: nil, **attributes)
114
+ @class_variants = { side: side }
115
+ @aria_id = aria_id
116
+ super(**attributes)
117
+ end
118
+
119
+ def view_template(&)
120
+ @class = @attributes.delete(:class)
121
+ div(class: "#{@class} hidden", **@attributes) do
122
+ yield
123
+
124
+ button(
125
+ class: <<~HEREDOC,
126
+ ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs
127
+ opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden
128
+ disabled:pointer-events-none
129
+ HEREDOC
130
+ data: { action: "click->dialog#close" },
131
+ ) do
132
+ icon("x", class: "size-4")
133
+ span(class: "sr-only") { "close" }
134
+ end
135
+ end
136
+ end
137
+
138
+ def default_attributes
139
+ {
140
+ id: "#{@aria_id}-content",
141
+ tabindex: -1,
142
+ role: "dialog",
143
+ aria: {
144
+ describedby: "#{@aria_id}-description",
145
+ labelledby: "#{@aria_id}-title",
146
+ },
147
+ data: {
148
+ dialog_target: "content",
149
+ action: "dialog:click:outside->dialog#close",
150
+ },
151
+ }
152
+ end
153
+ end
154
+
155
+ class SheetHeader < Base
156
+ class_variants(base: "flex flex-col gap-1.5 p-4")
157
+
158
+ def view_template(&)
159
+ div(**@attributes, &)
160
+ end
161
+ end
162
+
163
+ class SheetTitle < Base
164
+ class_variants(base: "text-foreground font-semibold")
165
+
166
+ def initialize(aria_id: nil, **attributes)
167
+ @aria_id = aria_id
168
+ super(**attributes)
169
+ end
170
+
171
+ def default_attributes
172
+ {
173
+ id: "#{@aria_id}-title",
174
+ }
175
+ end
176
+
177
+ def view_template(&)
178
+ h2(**@attributes, &)
179
+ end
180
+ end
181
+
182
+ class SheetDescription < Base
183
+ class_variants(base: "text-muted-foreground text-sm")
184
+
185
+ def initialize(aria_id: nil, **attributes)
186
+ @aria_id = aria_id
187
+ super(**attributes)
188
+ end
189
+
190
+ def default_attributes
191
+ {
192
+ id: "#{@aria_id}-description",
193
+ }
194
+ end
195
+
196
+ def view_template(&)
197
+ p(**@attributes, &)
198
+ end
199
+ end
200
+
201
+ class SheetFooter < Base
202
+ class_variants(base: "mt-auto flex flex-col gap-2 p-4")
203
+
204
+ def view_template(&)
205
+ div(**@attributes, &)
206
+ end
207
+ end
208
+
209
+ class SheetClose < Base
210
+ def initialize(as_child: false, **attributes)
211
+ @as_child = as_child
212
+ super(**attributes)
213
+ end
214
+
215
+ def view_template(&)
216
+ if @as_child
217
+ content = capture(&)
218
+ element = find_as_child(content.to_s)
219
+ vanish(&)
220
+ merged_attributes = merged_as_child_attributes(element, @attributes)
221
+
222
+ send(element.name, **merged_attributes) do
223
+ sanitize_as_child(element.children.to_s)
224
+ end
225
+ else
226
+ div(**@attributes, &)
227
+ end
228
+ end
229
+
230
+ def default_attributes
231
+ {
232
+ role: "button",
233
+ data: {
234
+ action: "click->dialog#close",
235
+ },
236
+ }
237
+ end
238
+ end
239
+ 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", data: { shadcn_phlexcomponents: "table-container" }) 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#setActiveToNext: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