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,381 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class Command < Base
5
+ class_variants(base: "inline-flex max-w-fit")
6
+
7
+ MODIFIER_KEYS = [
8
+ :ctrl,
9
+ :alt,
10
+ :shift,
11
+ ]
12
+
13
+ def initialize(
14
+ open: false,
15
+ modifier_key: nil,
16
+ shortcut_key: nil,
17
+ search_path: nil,
18
+ search_error_text: "Something went wrong, please try again.",
19
+ search_empty_text: "No results found",
20
+ search_placeholder_text: "Search...",
21
+ **attributes
22
+ )
23
+ if modifier_key && !MODIFIER_KEYS.include?(modifier_key)
24
+ raise ArgumentError, "Expected one of #{MODIFIER_KEYS} for \"modifier_key\", got #{modifier_key}"
25
+ end
26
+
27
+ @open = open
28
+ @modifier_key = modifier_key
29
+ @shortcut_key = shortcut_key
30
+ @search_path = search_path
31
+ @search_error_text = search_error_text
32
+ @search_empty_text = search_empty_text
33
+ @search_placeholder_text = search_placeholder_text
34
+ @aria_id = "command-#{SecureRandom.hex(5)}"
35
+ super(**attributes)
36
+ end
37
+
38
+ def trigger(**attributes, &)
39
+ CommandTrigger(modifier_key: @modifier_key, shortcut_key: @shortcut_key, aria_id: @aria_id, **attributes, &)
40
+ end
41
+
42
+ def content(**attributes, &)
43
+ CommandContent(
44
+ search_error_text: @search_error_text,
45
+ search_empty_text: @search_empty_text,
46
+ search_placeholder_text: @search_placeholder_text,
47
+ aria_id: @aria_id,
48
+ **attributes,
49
+ &
50
+ )
51
+ end
52
+
53
+ def item(**attributes, &)
54
+ CommandItem(aria_id: @aria_id, **attributes, &)
55
+ end
56
+
57
+ def label(**attributes, &)
58
+ CommandLabel(**attributes, &)
59
+ end
60
+
61
+ def group(**attributes, &)
62
+ CommandGroup(aria_id: @aria_id, **attributes, &)
63
+ end
64
+
65
+ def default_attributes
66
+ {
67
+ data: {
68
+ controller: "command",
69
+ command_is_open_value: @open.to_s,
70
+ modifier_key: @modifier_key,
71
+ shortcut_key: @shortcut_key,
72
+ search_path: @search_path
73
+ }
74
+ }
75
+ end
76
+
77
+ def view_template(&)
78
+ div(**@attributes) do
79
+ overlay("command")
80
+
81
+ yield
82
+ end
83
+ end
84
+ end
85
+
86
+ class CommandTrigger < Base
87
+ def initialize(modifier_key: nil, shortcut_key: nil, aria_id: nil, **attributes)
88
+ @modifier_key = modifier_key
89
+ @shortcut_key = shortcut_key
90
+ @aria_id = aria_id
91
+ super(**attributes)
92
+ end
93
+
94
+ def class_variants(**args)
95
+ Button.new.class_variants(
96
+ variant: :secondary,
97
+ class: <<~HEREDOC,
98
+ bg-surface text-surface-foreground/60 dark:bg-card relative h-8 w-full justify-start pl-2.5 font-normal
99
+ shadow-none sm:pr-12 md:w-40 lg:w-56 xl:w-64 #{args[:class]}
100
+ HEREDOC
101
+ )
102
+ end
103
+
104
+ def default_attributes
105
+ {
106
+ role: "button",
107
+ aria: {
108
+ haspopup: "dialog",
109
+ expanded: "false",
110
+ controls: "#{@aria_id}-content",
111
+ },
112
+ data: {
113
+ command_target: "trigger",
114
+ action: "click->command#open"
115
+ },
116
+ }
117
+ end
118
+
119
+ def view_template(&)
120
+ button(**@attributes) do
121
+ yield
122
+
123
+ if @modifier_key || @shortcut_key
124
+ span(class: "absolute top-1.5 right-1.5 hidden gap-1 sm:flex") do
125
+ if @modifier_key
126
+ CommandKbd(class: "capitalize", data: { command_target: "modifierKey" }) { @modifier_key }
127
+ end
128
+
129
+ if @shortcut_key
130
+ CommandKbd(class: "capitalize") { @shortcut_key }
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ class CommandContent < Base
139
+ class_variants(
140
+ base: <<~HEREDOC,
141
+ bg-background bg-clip-padding dark:bg-neutral-900 dark:ring-neutral-800 data-[state=closed]:animate-out#{" "}
142
+ data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0
143
+ data-[state=open]:zoom-in-95 duration-200 fixed gap-4 grid left-[50%] max-w-[calc(100%-2rem)] p-2 pb-11 ring-4 ring-neutral-200/80
144
+ rounded-xl shadow-2xl sm:max-w-lg top-[50%] translate-x-[-50%] translate-y-[-50%] w-full z-50 pointer-events-auto outline-none
145
+ HEREDOC
146
+ )
147
+
148
+ def initialize(
149
+ search_error_text: nil,
150
+ search_empty_text: nil,
151
+ search_placeholder_text: nil,
152
+ aria_id: nil,
153
+ **attributes
154
+ )
155
+ @search_error_text = search_error_text
156
+ @search_empty_text = search_empty_text
157
+ @search_placeholder_text = search_placeholder_text
158
+ @aria_id = aria_id
159
+ super(**attributes)
160
+ end
161
+
162
+ def default_attributes
163
+ {
164
+ style: { display: "none" },
165
+ id: "#{@aria_id}-content",
166
+ tabindex: -1,
167
+ role: "dialog",
168
+ aria: {
169
+ describedby: "#{@aria_id}-description",
170
+ labelledby: "#{@aria_id}-title",
171
+ },
172
+ data: {
173
+ state: "closed",
174
+ command_target: "content",
175
+ action: <<~HEREDOC,
176
+ command:click:outside->command#clickOutside
177
+ keydown.up->command#highlightItem:prevent
178
+ keydown.down->command#highlightItem:prevent
179
+ keydown.enter->command#select
180
+ HEREDOC
181
+ },
182
+ }
183
+ end
184
+
185
+ def view_template(&)
186
+ div(**@attributes) do
187
+ template do
188
+ CommandGroup do
189
+ CommandLabel { "" }
190
+ end
191
+ end
192
+
193
+ div(class: "text-popover-foreground flex h-full w-full flex-col overflow-hidden bg-transparent") do
194
+ div(class: "sr-only") do
195
+ h2(id: "#{@aria_id}-title") { @search_placeholder_text }
196
+ p(id: "#{@aria_id}-description") { "Search for a command to run..." }
197
+ end
198
+
199
+ label(
200
+ class: "sr-only",
201
+ id: "#{@aria_id}-search-label",
202
+ for: "#{@aria_id}-search",
203
+ ) { @search_placeholder_text }
204
+
205
+ div(class: "flex h-9 items-center gap-2 border px-3 bg-input/50 border-input rounded-md") do
206
+ icon("search", class: "size-4 shrink-0 opacity-50")
207
+
208
+ input(
209
+ class: "placeholder:text-muted-foreground flex w-full rounded-md bg-transparent py-3 text-sm
210
+ outline-hidden disabled:cursor-not-allowed disabled:opacity-50 h-9",
211
+ id: "#{@aria_id}-search",
212
+ placeholder: @search_placeholder_text,
213
+ type: :text,
214
+ autocomplete: "off",
215
+ autocorrect: "off",
216
+ role: "combobox",
217
+ spellcheck: "false",
218
+ aria: {
219
+ autocomplete: "list",
220
+ expanded: "false",
221
+ controls: "#{@aria_id}-list",
222
+ labelledby: "#{@aria_id}-search-label",
223
+ },
224
+ data: {
225
+ command_target: "searchInput",
226
+ action: "keydown->command#inputKeydown input->command#search",
227
+ },
228
+ )
229
+ end
230
+
231
+ div(class: "mt-3 p-1 max-h-80 min-h-80 overflow-y-auto", data: { command_target: "listContainer"}) do
232
+ CommandText(target: "empty") { @search_empty_text }
233
+ CommandText(target: "error") { @search_error_text }
234
+ CommandText(target: "loading") do
235
+ div(class: "flex justify-center", aria: { label: "Loading" }) do
236
+ icon("loader-circle", class: "animate-spin")
237
+ end
238
+ end
239
+
240
+ div(id: "#{@aria_id}-list", data: { command_target: "list" }, &)
241
+ end
242
+
243
+ CommandFooter()
244
+ end
245
+ end
246
+ end
247
+ end
248
+
249
+ class CommandItem < Base
250
+ class_variants(
251
+ base: <<~HEREDOC,
252
+ data-[highlighted=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex
253
+ cursor-default items-center gap-2 px-3 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none
254
+ data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4
255
+ data-[highlighted=true]:border-input data-[highlighted=true]:bg-input/50 h-9 rounded-md border border-transparent
256
+ font-medium
257
+ HEREDOC
258
+ )
259
+
260
+ def initialize(value: nil, aria_id: nil, **attributes)
261
+ @value = value
262
+ @aria_id = aria_id
263
+ super(**attributes)
264
+ end
265
+
266
+ def view_template(&)
267
+ div(**@attributes, &)
268
+ end
269
+
270
+ def default_attributes
271
+ {
272
+ role: "option",
273
+ tabindex: -1,
274
+ aria: {
275
+ labelledby: @aria_labelledby,
276
+ },
277
+ data: {
278
+ highlighted: "false",
279
+ disabled: @disabled,
280
+ value: @value,
281
+ action: <<~HEREDOC,
282
+ click->command#select
283
+ mouseover->command#highlightItem
284
+ HEREDOC
285
+ command_target: "item",
286
+ },
287
+ }
288
+ end
289
+ end
290
+
291
+ class CommandLabel < Base
292
+ class_variants(base: "text-muted-foreground text-xs px-3 pb-1 text-xs font-medium")
293
+
294
+ def initialize( **attributes)
295
+ super(**attributes)
296
+ end
297
+
298
+ def view_template(&)
299
+ div(**@attributes, &)
300
+ end
301
+ end
302
+
303
+ class CommandGroup < Base
304
+ class_variants(base: "scroll-mt-16 first:pt-0 pt-3")
305
+
306
+ def initialize(aria_id: nil, **attributes)
307
+ @aria_id = aria_id
308
+ super(**attributes)
309
+ end
310
+
311
+ def view_template(&)
312
+ div(**@attributes, &)
313
+ end
314
+
315
+ def default_attributes
316
+ {
317
+ role: "group",
318
+ aria: {
319
+ labelledby: "#{@aria_id}-group-#{SecureRandom.hex(5)}",
320
+ },
321
+ data: {
322
+ command_target: "group",
323
+ },
324
+ }
325
+ end
326
+ end
327
+
328
+ class CommandText < Base
329
+ class_variants(base: "py-6 text-center text-sm hidden")
330
+
331
+ def initialize(target:, **attributes)
332
+ @target = target
333
+ super(**attributes)
334
+ end
335
+
336
+ def default_attributes
337
+ {
338
+ role: "presentation",
339
+ data: { command_target: @target },
340
+ }
341
+ end
342
+
343
+ def view_template(&)
344
+ div(**@attributes, &)
345
+ end
346
+ end
347
+
348
+ class CommandKbd < Base
349
+ class_variants(
350
+ base: <<~HEREDOC,
351
+ bg-background text-muted-foreground pointer-events-none flex h-5 items-center justify-center gap-1 rounded
352
+ border px-1 font-sans text-[0.7rem] font-medium select-none [&_svg:not([class*='size-'])]:size-3
353
+ HEREDOC
354
+ )
355
+
356
+ def view_template(&)
357
+ kbd(**@attributes, &)
358
+ end
359
+ end
360
+
361
+ class CommandFooter < Base
362
+ class_variants(
363
+ base: <<~HEREDOC,
364
+ text-muted-foreground absolute inset-x-0 bottom-0 z-20 flex h-10 items-center gap-2 rounded-b-xl border-t#{" "}
365
+ border-t-neutral-100 bg-neutral-50 px-4 text-xs font-medium dark:border-t-neutral-700 dark:bg-neutral-800
366
+ HEREDOC
367
+ )
368
+
369
+ def view_template
370
+ div(**@attributes) do
371
+ div(class: "flex items-center gap-2") do
372
+ CommandKbd do
373
+ icon("corner-down-left")
374
+ end
375
+
376
+ plain("Go to Page")
377
+ end
378
+ end
379
+ end
380
+ end
381
+ end
@@ -0,0 +1,208 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShadcnPhlexcomponents
4
+ class DatePicker < Base
5
+ class_variants(base: "w-full")
6
+
7
+ def initialize(
8
+ name: nil,
9
+ id: nil,
10
+ value: nil,
11
+ format: "DD/MM/YYYY",
12
+ select_only: false,
13
+ placeholder: nil,
14
+ disabled: false,
15
+ options: {},
16
+ mask: true,
17
+ **attributes
18
+ )
19
+ @name = name
20
+ @id = id
21
+
22
+ if value
23
+ value = if value.is_a?(String)
24
+ DateTime.parse(value) rescue nil
25
+ else
26
+ value
27
+ end
28
+ end
29
+
30
+ @value = value&.utc&.iso8601
31
+ @format = format
32
+ @select_only = select_only
33
+ @placeholder = placeholder
34
+ @disabled = disabled
35
+ @mask = mask
36
+ @aria_id = "date-picker-#{SecureRandom.hex(5)}"
37
+ @options = options
38
+ super(**attributes)
39
+ end
40
+
41
+ def default_attributes
42
+ {
43
+ data: {
44
+ controller: "date-picker",
45
+ value: @value,
46
+ format: @format,
47
+ options: @options.to_json,
48
+ mask: @mask.to_s,
49
+ },
50
+ }
51
+ end
52
+
53
+ def view_template(&)
54
+ div(**@attributes) do
55
+ overlay("date-picker")
56
+
57
+ input(
58
+ type: :hidden,
59
+ name: @name,
60
+ value: @value,
61
+ data: { date_picker_target: "hiddenInput" },
62
+ )
63
+
64
+ if @select_only
65
+ # For select_only date picker, id is passed to button so that clicking on its
66
+ # label will trigger the popover to appear
67
+ DatePickerTrigger(
68
+ disabled: @disabled,
69
+ aria_id: @aria_id,
70
+ select_only: @select_only,
71
+ id: @id,
72
+ placeholder: @placeholder,
73
+ )
74
+ else
75
+ div(class: <<~HEREDOC,
76
+ focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]
77
+ data-[focus=true]:border-ring data-[focus=true]:ring-ring/50 data-[focus=true]:ring-[3px]
78
+ data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 flex shadow-xs transition-[color,box-shadow]
79
+ rounded-md border bg-transparent dark:bg-input/30 border-input outline-none h-9 flex items-center
80
+ aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive
81
+ HEREDOC
82
+ data: { date_picker_target: "inputContainer", disabled: @disabled }) do
83
+ input(
84
+ id: @id,
85
+ placeholder: @placeholder || @format,
86
+ type: :text,
87
+ class: "md:text-sm placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex h-9 w-full min-w-0 text-base outline-none px-3 py-1",
88
+ disabled: @disabled,
89
+ data: {
90
+ date_picker_target: "input",
91
+ action: "input->date-picker#inputDate
92
+ blur->date-picker#inputBlur
93
+ focus->date-picker#setContainerFocus",
94
+ },
95
+ )
96
+
97
+ DatePickerTrigger(
98
+ disabled: @disabled,
99
+ aria_id: @aria_id,
100
+ select_only: @select_only,
101
+ placeholder: @placeholder,
102
+ )
103
+ end
104
+ end
105
+
106
+ DatePickerContent(aria_id: @aria_id)
107
+ end
108
+ end
109
+ end
110
+
111
+ class DatePickerTrigger < Base
112
+ def initialize(
113
+ select_only: true,
114
+ placeholder: nil,
115
+ aria_id: nil,
116
+ **attributes
117
+ )
118
+ @select_only = select_only
119
+ @placeholder = placeholder
120
+ @aria_id = aria_id
121
+ super(**attributes)
122
+ end
123
+
124
+ def class_variants(**args)
125
+ if @select_only
126
+ Button.new.class_variants(variant: :outline, class: "justify-between w-full data-[placeholder]:data-[has-value=false]:text-muted-foreground #{args[:class]}")
127
+ else
128
+ Button.new.class_variants(variant: :ghost, size: :icon, class: "size-7 mr-1.5 disabled:!opacity-100 #{args[:class]}")
129
+ end
130
+ end
131
+
132
+ def view_template
133
+ if @select_only
134
+ button(type: :button, disabled: @disabled, **@attributes) do
135
+ span(class: "pointer-events-none", data: { "#{stimulus_controller_name}-target" => "triggerText" })
136
+
137
+ icon("calendar", class: "size-5")
138
+ end
139
+ else
140
+ button(type: :button, disabled: @disabled, **@attributes) do
141
+ icon("calendar", class: "size-5")
142
+ end
143
+ end
144
+ end
145
+
146
+ def default_attributes
147
+ {
148
+ aria: {
149
+ haspopup: "dialog",
150
+ expanded: false,
151
+ controls: "#{@aria_id}-content",
152
+ },
153
+ data: {
154
+ placeholder: @placeholder,
155
+ action: "click->#{stimulus_controller_name}#toggle",
156
+ "#{stimulus_controller_name}-target" => "trigger",
157
+ },
158
+ }
159
+ end
160
+
161
+ def stimulus_controller_name
162
+ "date-picker"
163
+ end
164
+ end
165
+
166
+ class DatePickerContent < Base
167
+ def initialize(side: :bottom, align: :start, aria_id: nil, **attributes)
168
+ @side = side
169
+ @align = align
170
+ @aria_id = aria_id
171
+ super(**attributes)
172
+ end
173
+
174
+ def class_variants(**args)
175
+ PopoverContent.new.class_variants(class: "w-fit #{args[:class]}")
176
+ end
177
+
178
+ def default_attributes
179
+ {
180
+ id: "#{@aria_id}-content",
181
+ tabindex: -1,
182
+ role: "dialog",
183
+ data: {
184
+ side: @side,
185
+ align: @align,
186
+ "#{stimulus_controller_name}-target" => "content",
187
+ action: "#{stimulus_controller_name}:click:outside->#{stimulus_controller_name}#clickOutside",
188
+ },
189
+ }
190
+ end
191
+
192
+ def stimulus_controller_name
193
+ "date-picker"
194
+ end
195
+
196
+ def view_template(&)
197
+ div(
198
+ style: { display: "none" },
199
+ class: "fixed z-50 top-1/4 left-1/2 -translate-x-1/2 pointer-events-auto md:top-auto md:left-auto md:translate-none md:pointer-events-[unset]",
200
+ data: { "#{stimulus_controller_name}-target" => "contentContainer" },
201
+ ) do
202
+ div(**@attributes) do
203
+ div(data: { "#{stimulus_controller_name}-target" => "calendar" })
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end