fernandes-ui 0.1.0

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 (1093) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +392 -0
  4. data/Rakefile +6 -0
  5. data/app/assets/javascripts/ui.esm.js +14385 -0
  6. data/app/assets/javascripts/ui.js +13990 -0
  7. data/app/assets/stylesheets/ui/application.css +584 -0
  8. data/app/assets/stylesheets/ui/sonner.css +610 -0
  9. data/app/behaviors/ui/accordion_behavior.rb +30 -0
  10. data/app/behaviors/ui/accordion_content_behavior.rb +72 -0
  11. data/app/behaviors/ui/accordion_item_behavior.rb +47 -0
  12. data/app/behaviors/ui/accordion_trigger_behavior.rb +79 -0
  13. data/app/behaviors/ui/alert_behavior.rb +44 -0
  14. data/app/behaviors/ui/alert_description_behavior.rb +32 -0
  15. data/app/behaviors/ui/alert_dialog_action_behavior.rb +27 -0
  16. data/app/behaviors/ui/alert_dialog_behavior.rb +41 -0
  17. data/app/behaviors/ui/alert_dialog_cancel_behavior.rb +27 -0
  18. data/app/behaviors/ui/alert_dialog_content_behavior.rb +42 -0
  19. data/app/behaviors/ui/alert_dialog_description_behavior.rb +25 -0
  20. data/app/behaviors/ui/alert_dialog_footer_behavior.rb +26 -0
  21. data/app/behaviors/ui/alert_dialog_header_behavior.rb +25 -0
  22. data/app/behaviors/ui/alert_dialog_overlay_behavior.rb +68 -0
  23. data/app/behaviors/ui/alert_dialog_title_behavior.rb +25 -0
  24. data/app/behaviors/ui/alert_dialog_trigger_behavior.rb +39 -0
  25. data/app/behaviors/ui/alert_title_behavior.rb +32 -0
  26. data/app/behaviors/ui/aspect_ratio_behavior.rb +47 -0
  27. data/app/behaviors/ui/avatar_behavior.rb +43 -0
  28. data/app/behaviors/ui/avatar_fallback_behavior.rb +43 -0
  29. data/app/behaviors/ui/avatar_image_behavior.rb +46 -0
  30. data/app/behaviors/ui/badge_behavior.rb +50 -0
  31. data/app/behaviors/ui/blockquote_behavior.rb +23 -0
  32. data/app/behaviors/ui/breadcrumb_behavior.rb +22 -0
  33. data/app/behaviors/ui/breadcrumb_ellipsis_behavior.rb +34 -0
  34. data/app/behaviors/ui/breadcrumb_item_behavior.rb +32 -0
  35. data/app/behaviors/ui/breadcrumb_link_behavior.rb +33 -0
  36. data/app/behaviors/ui/breadcrumb_list_behavior.rb +32 -0
  37. data/app/behaviors/ui/breadcrumb_page_behavior.rb +35 -0
  38. data/app/behaviors/ui/breadcrumb_separator_behavior.rb +34 -0
  39. data/app/behaviors/ui/button_behavior.rb +99 -0
  40. data/app/behaviors/ui/button_group_behavior.rb +55 -0
  41. data/app/behaviors/ui/button_group_separator_behavior.rb +33 -0
  42. data/app/behaviors/ui/button_group_text_behavior.rb +34 -0
  43. data/app/behaviors/ui/calendar_behavior.rb +119 -0
  44. data/app/behaviors/ui/card_action_behavior.rb +32 -0
  45. data/app/behaviors/ui/card_behavior.rb +32 -0
  46. data/app/behaviors/ui/card_content_behavior.rb +32 -0
  47. data/app/behaviors/ui/card_description_behavior.rb +32 -0
  48. data/app/behaviors/ui/card_footer_behavior.rb +32 -0
  49. data/app/behaviors/ui/card_header_behavior.rb +32 -0
  50. data/app/behaviors/ui/card_title_behavior.rb +32 -0
  51. data/app/behaviors/ui/carousel_behavior.rb +53 -0
  52. data/app/behaviors/ui/carousel_content_behavior.rb +65 -0
  53. data/app/behaviors/ui/carousel_item_behavior.rb +26 -0
  54. data/app/behaviors/ui/carousel_next_behavior.rb +39 -0
  55. data/app/behaviors/ui/carousel_previous_behavior.rb +39 -0
  56. data/app/behaviors/ui/checkbox_behavior.rb +48 -0
  57. data/app/behaviors/ui/collapsible_behavior.rb +42 -0
  58. data/app/behaviors/ui/collapsible_content_behavior.rb +39 -0
  59. data/app/behaviors/ui/collapsible_trigger_behavior.rb +55 -0
  60. data/app/behaviors/ui/combobox_behavior.rb +0 -0
  61. data/app/behaviors/ui/command_behavior.rb +37 -0
  62. data/app/behaviors/ui/command_dialog_behavior.rb +30 -0
  63. data/app/behaviors/ui/command_empty_behavior.rb +36 -0
  64. data/app/behaviors/ui/command_group_behavior.rb +43 -0
  65. data/app/behaviors/ui/command_input_behavior.rb +49 -0
  66. data/app/behaviors/ui/command_item_behavior.rb +47 -0
  67. data/app/behaviors/ui/command_list_behavior.rb +38 -0
  68. data/app/behaviors/ui/command_separator_behavior.rb +30 -0
  69. data/app/behaviors/ui/command_shortcut_behavior.rb +29 -0
  70. data/app/behaviors/ui/context_menu_behavior.rb +32 -0
  71. data/app/behaviors/ui/context_menu_checkbox_item_behavior.rb +38 -0
  72. data/app/behaviors/ui/context_menu_content_behavior.rb +37 -0
  73. data/app/behaviors/ui/context_menu_item_behavior.rb +40 -0
  74. data/app/behaviors/ui/context_menu_label_behavior.rb +33 -0
  75. data/app/behaviors/ui/context_menu_radio_group_behavior.rb +20 -0
  76. data/app/behaviors/ui/context_menu_radio_item_behavior.rb +38 -0
  77. data/app/behaviors/ui/context_menu_separator_behavior.rb +22 -0
  78. data/app/behaviors/ui/context_menu_shortcut_behavior.rb +21 -0
  79. data/app/behaviors/ui/context_menu_trigger_behavior.rb +32 -0
  80. data/app/behaviors/ui/date_picker_behavior.rb +90 -0
  81. data/app/behaviors/ui/date_picker_input_behavior.rb +62 -0
  82. data/app/behaviors/ui/date_picker_trigger_behavior.rb +62 -0
  83. data/app/behaviors/ui/dialog_behavior.rb +46 -0
  84. data/app/behaviors/ui/dialog_content_behavior.rb +46 -0
  85. data/app/behaviors/ui/dialog_footer_behavior.rb +26 -0
  86. data/app/behaviors/ui/dialog_header_behavior.rb +26 -0
  87. data/app/behaviors/ui/dialog_overlay_behavior.rb +69 -0
  88. data/app/behaviors/ui/drawer_behavior.rb +57 -0
  89. data/app/behaviors/ui/drawer_close_behavior.rb +10 -0
  90. data/app/behaviors/ui/drawer_content_behavior.rb +107 -0
  91. data/app/behaviors/ui/drawer_description_behavior.rb +23 -0
  92. data/app/behaviors/ui/drawer_footer_behavior.rb +23 -0
  93. data/app/behaviors/ui/drawer_handle_behavior.rb +40 -0
  94. data/app/behaviors/ui/drawer_header_behavior.rb +29 -0
  95. data/app/behaviors/ui/drawer_overlay_behavior.rb +75 -0
  96. data/app/behaviors/ui/drawer_title_behavior.rb +26 -0
  97. data/app/behaviors/ui/drawer_trigger_behavior.rb +18 -0
  98. data/app/behaviors/ui/dropdown_menu_behavior.rb +43 -0
  99. data/app/behaviors/ui/dropdown_menu_checkbox_item_behavior.rb +46 -0
  100. data/app/behaviors/ui/dropdown_menu_content_behavior.rb +37 -0
  101. data/app/behaviors/ui/dropdown_menu_item_behavior.rb +40 -0
  102. data/app/behaviors/ui/dropdown_menu_label_behavior.rb +30 -0
  103. data/app/behaviors/ui/dropdown_menu_radio_group_behavior.rb +20 -0
  104. data/app/behaviors/ui/dropdown_menu_radio_item_behavior.rb +46 -0
  105. data/app/behaviors/ui/dropdown_menu_separator_behavior.rb +23 -0
  106. data/app/behaviors/ui/dropdown_menu_shortcut_behavior.rb +21 -0
  107. data/app/behaviors/ui/dropdown_menu_sub_behavior.rb +21 -0
  108. data/app/behaviors/ui/dropdown_menu_sub_content_behavior.rb +38 -0
  109. data/app/behaviors/ui/dropdown_menu_sub_trigger_behavior.rb +35 -0
  110. data/app/behaviors/ui/dropdown_menu_trigger_behavior.rb +46 -0
  111. data/app/behaviors/ui/empty_behavior.rb +124 -0
  112. data/app/behaviors/ui/field_behavior.rb +46 -0
  113. data/app/behaviors/ui/field_content_behavior.rb +26 -0
  114. data/app/behaviors/ui/field_description_behavior.rb +26 -0
  115. data/app/behaviors/ui/field_error_behavior.rb +47 -0
  116. data/app/behaviors/ui/field_group_behavior.rb +26 -0
  117. data/app/behaviors/ui/field_label_behavior.rb +27 -0
  118. data/app/behaviors/ui/field_legend_behavior.rb +28 -0
  119. data/app/behaviors/ui/field_separator_behavior.rb +33 -0
  120. data/app/behaviors/ui/field_set_behavior.rb +26 -0
  121. data/app/behaviors/ui/field_title_behavior.rb +26 -0
  122. data/app/behaviors/ui/h1_behavior.rb +23 -0
  123. data/app/behaviors/ui/h2_behavior.rb +23 -0
  124. data/app/behaviors/ui/h3_behavior.rb +23 -0
  125. data/app/behaviors/ui/h4_behavior.rb +23 -0
  126. data/app/behaviors/ui/hover_card_behavior.rb +29 -0
  127. data/app/behaviors/ui/hover_card_content_behavior.rb +41 -0
  128. data/app/behaviors/ui/hover_card_trigger_behavior.rb +44 -0
  129. data/app/behaviors/ui/inline_code_behavior.rb +23 -0
  130. data/app/behaviors/ui/input_behavior.rb +52 -0
  131. data/app/behaviors/ui/input_group_addon_behavior.rb +52 -0
  132. data/app/behaviors/ui/input_group_behavior.rb +63 -0
  133. data/app/behaviors/ui/input_group_button_behavior.rb +82 -0
  134. data/app/behaviors/ui/input_group_input_behavior.rb +50 -0
  135. data/app/behaviors/ui/input_group_text_behavior.rb +32 -0
  136. data/app/behaviors/ui/input_group_textarea_behavior.rb +50 -0
  137. data/app/behaviors/ui/input_otp_behavior.rb +44 -0
  138. data/app/behaviors/ui/input_otp_group_behavior.rb +32 -0
  139. data/app/behaviors/ui/input_otp_separator_behavior.rb +33 -0
  140. data/app/behaviors/ui/input_otp_slot_behavior.rb +49 -0
  141. data/app/behaviors/ui/item_actions_behavior.rb +31 -0
  142. data/app/behaviors/ui/item_behavior.rb +100 -0
  143. data/app/behaviors/ui/item_content_behavior.rb +31 -0
  144. data/app/behaviors/ui/item_description_behavior.rb +31 -0
  145. data/app/behaviors/ui/item_footer_behavior.rb +31 -0
  146. data/app/behaviors/ui/item_group_behavior.rb +31 -0
  147. data/app/behaviors/ui/item_header_behavior.rb +31 -0
  148. data/app/behaviors/ui/item_media_behavior.rb +47 -0
  149. data/app/behaviors/ui/item_separator_behavior.rb +31 -0
  150. data/app/behaviors/ui/item_title_behavior.rb +31 -0
  151. data/app/behaviors/ui/kbd_behavior.rb +28 -0
  152. data/app/behaviors/ui/kbd_group_behavior.rb +26 -0
  153. data/app/behaviors/ui/label_behavior.rb +35 -0
  154. data/app/behaviors/ui/large_behavior.rb +23 -0
  155. data/app/behaviors/ui/lead_behavior.rb +23 -0
  156. data/app/behaviors/ui/list_behavior.rb +23 -0
  157. data/app/behaviors/ui/menubar_behavior.rb +43 -0
  158. data/app/behaviors/ui/menubar_checkbox_item_behavior.rb +56 -0
  159. data/app/behaviors/ui/menubar_content_behavior.rb +53 -0
  160. data/app/behaviors/ui/menubar_item_behavior.rb +78 -0
  161. data/app/behaviors/ui/menubar_label_behavior.rb +41 -0
  162. data/app/behaviors/ui/menubar_menu_behavior.rb +39 -0
  163. data/app/behaviors/ui/menubar_radio_group_behavior.rb +34 -0
  164. data/app/behaviors/ui/menubar_radio_item_behavior.rb +61 -0
  165. data/app/behaviors/ui/menubar_separator_behavior.rb +30 -0
  166. data/app/behaviors/ui/menubar_shortcut_behavior.rb +29 -0
  167. data/app/behaviors/ui/menubar_sub_behavior.rb +30 -0
  168. data/app/behaviors/ui/menubar_sub_content_behavior.rb +49 -0
  169. data/app/behaviors/ui/menubar_sub_trigger_behavior.rb +57 -0
  170. data/app/behaviors/ui/menubar_trigger_behavior.rb +48 -0
  171. data/app/behaviors/ui/muted_behavior.rb +23 -0
  172. data/app/behaviors/ui/navigation_menu_behavior.rb +42 -0
  173. data/app/behaviors/ui/navigation_menu_content_behavior.rb +65 -0
  174. data/app/behaviors/ui/navigation_menu_item_behavior.rb +38 -0
  175. data/app/behaviors/ui/navigation_menu_link_behavior.rb +68 -0
  176. data/app/behaviors/ui/navigation_menu_list_behavior.rb +33 -0
  177. data/app/behaviors/ui/navigation_menu_trigger_behavior.rb +57 -0
  178. data/app/behaviors/ui/navigation_menu_viewport_behavior.rb +61 -0
  179. data/app/behaviors/ui/p_behavior.rb +23 -0
  180. data/app/behaviors/ui/pagination_behavior.rb +26 -0
  181. data/app/behaviors/ui/pagination_content_behavior.rb +24 -0
  182. data/app/behaviors/ui/pagination_ellipsis_behavior.rb +25 -0
  183. data/app/behaviors/ui/pagination_item_behavior.rb +13 -0
  184. data/app/behaviors/ui/pagination_link_behavior.rb +57 -0
  185. data/app/behaviors/ui/pagination_next_behavior.rb +20 -0
  186. data/app/behaviors/ui/pagination_previous_behavior.rb +20 -0
  187. data/app/behaviors/ui/popover_behavior.rb +54 -0
  188. data/app/behaviors/ui/popover_content_behavior.rb +52 -0
  189. data/app/behaviors/ui/popover_trigger_behavior.rb +33 -0
  190. data/app/behaviors/ui/progress_behavior.rb +48 -0
  191. data/app/behaviors/ui/radio_button_behavior.rb +46 -0
  192. data/app/behaviors/ui/resizable_handle_behavior.rb +81 -0
  193. data/app/behaviors/ui/resizable_panel_behavior.rb +53 -0
  194. data/app/behaviors/ui/resizable_panel_group_behavior.rb +41 -0
  195. data/app/behaviors/ui/responsive_dialog_behavior.rb +41 -0
  196. data/app/behaviors/ui/scroll_area_behavior.rb +36 -0
  197. data/app/behaviors/ui/scroll_area_corner_behavior.rb +34 -0
  198. data/app/behaviors/ui/scroll_area_scrollbar_behavior.rb +50 -0
  199. data/app/behaviors/ui/scroll_area_thumb_behavior.rb +34 -0
  200. data/app/behaviors/ui/scroll_area_viewport_behavior.rb +36 -0
  201. data/app/behaviors/ui/select_behavior.rb +84 -0
  202. data/app/behaviors/ui/select_content_behavior.rb +42 -0
  203. data/app/behaviors/ui/select_group_behavior.rb +35 -0
  204. data/app/behaviors/ui/select_item_behavior.rb +48 -0
  205. data/app/behaviors/ui/select_label_behavior.rb +34 -0
  206. data/app/behaviors/ui/select_scroll_down_button_behavior.rb +51 -0
  207. data/app/behaviors/ui/select_scroll_up_button_behavior.rb +51 -0
  208. data/app/behaviors/ui/select_trigger_behavior.rb +40 -0
  209. data/app/behaviors/ui/separator_behavior.rb +58 -0
  210. data/app/behaviors/ui/shared_as_child_behavior.rb +71 -0
  211. data/app/behaviors/ui/sheet_behavior.rb +46 -0
  212. data/app/behaviors/ui/sheet_content_behavior.rb +92 -0
  213. data/app/behaviors/ui/sheet_footer_behavior.rb +27 -0
  214. data/app/behaviors/ui/sheet_header_behavior.rb +27 -0
  215. data/app/behaviors/ui/sheet_overlay_behavior.rb +76 -0
  216. data/app/behaviors/ui/sidebar_behavior.rb +88 -0
  217. data/app/behaviors/ui/sidebar_content_behavior.rb +36 -0
  218. data/app/behaviors/ui/sidebar_footer_behavior.rb +35 -0
  219. data/app/behaviors/ui/sidebar_group_action_behavior.rb +40 -0
  220. data/app/behaviors/ui/sidebar_group_behavior.rb +35 -0
  221. data/app/behaviors/ui/sidebar_group_content_behavior.rb +35 -0
  222. data/app/behaviors/ui/sidebar_group_label_behavior.rb +39 -0
  223. data/app/behaviors/ui/sidebar_header_behavior.rb +35 -0
  224. data/app/behaviors/ui/sidebar_input_behavior.rb +36 -0
  225. data/app/behaviors/ui/sidebar_inset_behavior.rb +39 -0
  226. data/app/behaviors/ui/sidebar_menu_action_behavior.rb +49 -0
  227. data/app/behaviors/ui/sidebar_menu_badge_behavior.rb +39 -0
  228. data/app/behaviors/ui/sidebar_menu_behavior.rb +35 -0
  229. data/app/behaviors/ui/sidebar_menu_button_behavior.rb +70 -0
  230. data/app/behaviors/ui/sidebar_menu_item_behavior.rb +35 -0
  231. data/app/behaviors/ui/sidebar_menu_skeleton_behavior.rb +35 -0
  232. data/app/behaviors/ui/sidebar_menu_sub_behavior.rb +36 -0
  233. data/app/behaviors/ui/sidebar_menu_sub_button_behavior.rb +59 -0
  234. data/app/behaviors/ui/sidebar_menu_sub_item_behavior.rb +35 -0
  235. data/app/behaviors/ui/sidebar_provider_behavior.rb +56 -0
  236. data/app/behaviors/ui/sidebar_rail_behavior.rb +47 -0
  237. data/app/behaviors/ui/sidebar_separator_behavior.rb +36 -0
  238. data/app/behaviors/ui/sidebar_trigger_behavior.rb +40 -0
  239. data/app/behaviors/ui/slider_behavior.rb +46 -0
  240. data/app/behaviors/ui/slider_range_behavior.rb +18 -0
  241. data/app/behaviors/ui/slider_thumb_behavior.rb +25 -0
  242. data/app/behaviors/ui/slider_track_behavior.rb +23 -0
  243. data/app/behaviors/ui/small_behavior.rb +23 -0
  244. data/app/behaviors/ui/sonner_toaster_behavior.rb +34 -0
  245. data/app/behaviors/ui/spinner_behavior.rb +50 -0
  246. data/app/behaviors/ui/switch_behavior.rb +68 -0
  247. data/app/behaviors/ui/table_behavior.rb +28 -0
  248. data/app/behaviors/ui/table_body_behavior.rb +28 -0
  249. data/app/behaviors/ui/table_caption_behavior.rb +28 -0
  250. data/app/behaviors/ui/table_cell_behavior.rb +28 -0
  251. data/app/behaviors/ui/table_footer_behavior.rb +28 -0
  252. data/app/behaviors/ui/table_head_behavior.rb +28 -0
  253. data/app/behaviors/ui/table_header_behavior.rb +28 -0
  254. data/app/behaviors/ui/table_row_behavior.rb +28 -0
  255. data/app/behaviors/ui/tabs_behavior.rb +32 -0
  256. data/app/behaviors/ui/tabs_content_behavior.rb +38 -0
  257. data/app/behaviors/ui/tabs_list_behavior.rb +20 -0
  258. data/app/behaviors/ui/tabs_trigger_behavior.rb +47 -0
  259. data/app/behaviors/ui/textarea_behavior.rb +36 -0
  260. data/app/behaviors/ui/toggle_behavior.rb +85 -0
  261. data/app/behaviors/ui/toggle_group_behavior.rb +68 -0
  262. data/app/behaviors/ui/toggle_group_item_behavior.rb +88 -0
  263. data/app/behaviors/ui/tooltip_behavior.rb +29 -0
  264. data/app/behaviors/ui/tooltip_content_behavior.rb +57 -0
  265. data/app/behaviors/ui/tooltip_trigger_behavior.rb +60 -0
  266. data/app/components/ui/accordion.rb +36 -0
  267. data/app/components/ui/accordion_content.rb +30 -0
  268. data/app/components/ui/accordion_item.rb +48 -0
  269. data/app/components/ui/accordion_trigger.rb +52 -0
  270. data/app/components/ui/alert.rb +31 -0
  271. data/app/components/ui/alert_description.rb +26 -0
  272. data/app/components/ui/alert_dialog.rb +33 -0
  273. data/app/components/ui/alert_dialog_action.rb +34 -0
  274. data/app/components/ui/alert_dialog_cancel.rb +34 -0
  275. data/app/components/ui/alert_dialog_content.rb +25 -0
  276. data/app/components/ui/alert_dialog_description.rb +25 -0
  277. data/app/components/ui/alert_dialog_footer.rb +28 -0
  278. data/app/components/ui/alert_dialog_header.rb +27 -0
  279. data/app/components/ui/alert_dialog_overlay.rb +30 -0
  280. data/app/components/ui/alert_dialog_title.rb +25 -0
  281. data/app/components/ui/alert_dialog_trigger.rb +27 -0
  282. data/app/components/ui/alert_title.rb +24 -0
  283. data/app/components/ui/aspect_ratio.rb +32 -0
  284. data/app/components/ui/avatar.rb +31 -0
  285. data/app/components/ui/avatar_fallback.rb +33 -0
  286. data/app/components/ui/avatar_image.rb +33 -0
  287. data/app/components/ui/badge.rb +37 -0
  288. data/app/components/ui/blockquote.rb +15 -0
  289. data/app/components/ui/breadcrumb.rb +31 -0
  290. data/app/components/ui/breadcrumb_ellipsis.rb +55 -0
  291. data/app/components/ui/breadcrumb_item.rb +27 -0
  292. data/app/components/ui/breadcrumb_link.rb +27 -0
  293. data/app/components/ui/breadcrumb_list.rb +27 -0
  294. data/app/components/ui/breadcrumb_page.rb +25 -0
  295. data/app/components/ui/breadcrumb_separator.rb +51 -0
  296. data/app/components/ui/button.rb +52 -0
  297. data/app/components/ui/button_group.rb +48 -0
  298. data/app/components/ui/button_group_separator.rb +32 -0
  299. data/app/components/ui/button_group_text.rb +45 -0
  300. data/app/components/ui/calendar.rb +209 -0
  301. data/app/components/ui/card.rb +14 -0
  302. data/app/components/ui/card_action.rb +14 -0
  303. data/app/components/ui/card_content.rb +14 -0
  304. data/app/components/ui/card_description.rb +14 -0
  305. data/app/components/ui/card_footer.rb +14 -0
  306. data/app/components/ui/card_header.rb +14 -0
  307. data/app/components/ui/card_title.rb +14 -0
  308. data/app/components/ui/carousel.rb +16 -0
  309. data/app/components/ui/carousel_content.rb +15 -0
  310. data/app/components/ui/carousel_item.rb +13 -0
  311. data/app/components/ui/carousel_next.rb +29 -0
  312. data/app/components/ui/carousel_previous.rb +29 -0
  313. data/app/components/ui/checkbox.rb +49 -0
  314. data/app/components/ui/collapsible.rb +23 -0
  315. data/app/components/ui/collapsible_content.rb +15 -0
  316. data/app/components/ui/collapsible_trigger.rb +21 -0
  317. data/app/components/ui/combobox_wrapper.rb +57 -0
  318. data/app/components/ui/command.rb +15 -0
  319. data/app/components/ui/command_dialog.rb +25 -0
  320. data/app/components/ui/command_empty.rb +14 -0
  321. data/app/components/ui/command_group.rb +21 -0
  322. data/app/components/ui/command_input.rb +32 -0
  323. data/app/components/ui/command_item.rb +16 -0
  324. data/app/components/ui/command_list.rb +14 -0
  325. data/app/components/ui/command_separator.rb +14 -0
  326. data/app/components/ui/command_shortcut.rb +14 -0
  327. data/app/components/ui/context_menu.rb +30 -0
  328. data/app/components/ui/context_menu_checkbox_item.rb +51 -0
  329. data/app/components/ui/context_menu_content.rb +27 -0
  330. data/app/components/ui/context_menu_item.rb +40 -0
  331. data/app/components/ui/context_menu_label.rb +27 -0
  332. data/app/components/ui/context_menu_radio_group.rb +28 -0
  333. data/app/components/ui/context_menu_radio_item.rb +51 -0
  334. data/app/components/ui/context_menu_separator.rb +23 -0
  335. data/app/components/ui/context_menu_shortcut.rb +25 -0
  336. data/app/components/ui/context_menu_trigger.rb +27 -0
  337. data/app/components/ui/date_picker.rb +128 -0
  338. data/app/components/ui/date_picker_input.rb +75 -0
  339. data/app/components/ui/date_picker_trigger.rb +74 -0
  340. data/app/components/ui/dialog.rb +19 -0
  341. data/app/components/ui/dialog_close.rb +27 -0
  342. data/app/components/ui/dialog_content.rb +17 -0
  343. data/app/components/ui/dialog_description.rb +22 -0
  344. data/app/components/ui/dialog_footer.rb +15 -0
  345. data/app/components/ui/dialog_header.rb +15 -0
  346. data/app/components/ui/dialog_overlay.rb +18 -0
  347. data/app/components/ui/dialog_title.rb +22 -0
  348. data/app/components/ui/dialog_trigger.rb +38 -0
  349. data/app/components/ui/drawer.rb +39 -0
  350. data/app/components/ui/drawer_close.rb +23 -0
  351. data/app/components/ui/drawer_content.rb +19 -0
  352. data/app/components/ui/drawer_description.rb +16 -0
  353. data/app/components/ui/drawer_footer.rb +16 -0
  354. data/app/components/ui/drawer_handle.rb +14 -0
  355. data/app/components/ui/drawer_header.rb +16 -0
  356. data/app/components/ui/drawer_overlay.rb +17 -0
  357. data/app/components/ui/drawer_title.rb +16 -0
  358. data/app/components/ui/drawer_trigger.rb +34 -0
  359. data/app/components/ui/dropdown_menu.rb +56 -0
  360. data/app/components/ui/dropdown_menu_checkbox_item.rb +55 -0
  361. data/app/components/ui/dropdown_menu_content.rb +29 -0
  362. data/app/components/ui/dropdown_menu_item.rb +40 -0
  363. data/app/components/ui/dropdown_menu_label.rb +27 -0
  364. data/app/components/ui/dropdown_menu_radio_group.rb +28 -0
  365. data/app/components/ui/dropdown_menu_radio_item.rb +57 -0
  366. data/app/components/ui/dropdown_menu_separator.rb +23 -0
  367. data/app/components/ui/dropdown_menu_shortcut.rb +25 -0
  368. data/app/components/ui/dropdown_menu_sub.rb +28 -0
  369. data/app/components/ui/dropdown_menu_sub_content.rb +31 -0
  370. data/app/components/ui/dropdown_menu_sub_trigger.rb +47 -0
  371. data/app/components/ui/dropdown_menu_trigger.rb +43 -0
  372. data/app/components/ui/empty.rb +25 -0
  373. data/app/components/ui/empty_content.rb +22 -0
  374. data/app/components/ui/empty_description.rb +20 -0
  375. data/app/components/ui/empty_header.rb +24 -0
  376. data/app/components/ui/empty_media.rb +28 -0
  377. data/app/components/ui/empty_title.rb +20 -0
  378. data/app/components/ui/field.rb +35 -0
  379. data/app/components/ui/field_content.rb +25 -0
  380. data/app/components/ui/field_description.rb +25 -0
  381. data/app/components/ui/field_error.rb +61 -0
  382. data/app/components/ui/field_group.rb +28 -0
  383. data/app/components/ui/field_label.rb +27 -0
  384. data/app/components/ui/field_legend.rb +30 -0
  385. data/app/components/ui/field_separator.rb +50 -0
  386. data/app/components/ui/field_set.rb +27 -0
  387. data/app/components/ui/field_title.rb +25 -0
  388. data/app/components/ui/h1.rb +15 -0
  389. data/app/components/ui/h2.rb +15 -0
  390. data/app/components/ui/h3.rb +15 -0
  391. data/app/components/ui/h4.rb +15 -0
  392. data/app/components/ui/hover_card.rb +26 -0
  393. data/app/components/ui/hover_card_content.rb +32 -0
  394. data/app/components/ui/hover_card_trigger.rb +46 -0
  395. data/app/components/ui/inline_code.rb +15 -0
  396. data/app/components/ui/input.rb +19 -0
  397. data/app/components/ui/input_group.rb +33 -0
  398. data/app/components/ui/input_group_addon.rb +32 -0
  399. data/app/components/ui/input_group_button.rb +40 -0
  400. data/app/components/ui/input_group_input.rb +43 -0
  401. data/app/components/ui/input_group_text.rb +31 -0
  402. data/app/components/ui/input_group_textarea.rb +43 -0
  403. data/app/components/ui/input_otp.rb +56 -0
  404. data/app/components/ui/input_otp_group.rb +25 -0
  405. data/app/components/ui/input_otp_separator.rb +34 -0
  406. data/app/components/ui/input_otp_slot.rb +32 -0
  407. data/app/components/ui/item.rb +26 -0
  408. data/app/components/ui/item_actions.rb +14 -0
  409. data/app/components/ui/item_content.rb +14 -0
  410. data/app/components/ui/item_description.rb +14 -0
  411. data/app/components/ui/item_footer.rb +14 -0
  412. data/app/components/ui/item_group.rb +14 -0
  413. data/app/components/ui/item_header.rb +14 -0
  414. data/app/components/ui/item_media.rb +15 -0
  415. data/app/components/ui/item_separator.rb +14 -0
  416. data/app/components/ui/item_title.rb +14 -0
  417. data/app/components/ui/kbd.rb +29 -0
  418. data/app/components/ui/kbd_group.rb +30 -0
  419. data/app/components/ui/label.rb +30 -0
  420. data/app/components/ui/large.rb +15 -0
  421. data/app/components/ui/lead.rb +15 -0
  422. data/app/components/ui/list.rb +15 -0
  423. data/app/components/ui/menubar.rb +36 -0
  424. data/app/components/ui/menubar_checkbox_item.rb +54 -0
  425. data/app/components/ui/menubar_content.rb +32 -0
  426. data/app/components/ui/menubar_item.rb +39 -0
  427. data/app/components/ui/menubar_label.rb +29 -0
  428. data/app/components/ui/menubar_menu.rb +29 -0
  429. data/app/components/ui/menubar_radio_group.rb +29 -0
  430. data/app/components/ui/menubar_radio_item.rb +56 -0
  431. data/app/components/ui/menubar_separator.rb +22 -0
  432. data/app/components/ui/menubar_shortcut.rb +27 -0
  433. data/app/components/ui/menubar_sub.rb +30 -0
  434. data/app/components/ui/menubar_sub_content.rb +27 -0
  435. data/app/components/ui/menubar_sub_trigger.rb +48 -0
  436. data/app/components/ui/menubar_trigger.rb +26 -0
  437. data/app/components/ui/muted.rb +15 -0
  438. data/app/components/ui/navigation_menu.rb +50 -0
  439. data/app/components/ui/navigation_menu_content.rb +33 -0
  440. data/app/components/ui/navigation_menu_item.rb +36 -0
  441. data/app/components/ui/navigation_menu_link.rb +70 -0
  442. data/app/components/ui/navigation_menu_list.rb +28 -0
  443. data/app/components/ui/navigation_menu_trigger.rb +51 -0
  444. data/app/components/ui/navigation_menu_viewport.rb +25 -0
  445. data/app/components/ui/p.rb +15 -0
  446. data/app/components/ui/pagination.rb +19 -0
  447. data/app/components/ui/pagination_content.rb +19 -0
  448. data/app/components/ui/pagination_ellipsis.rb +26 -0
  449. data/app/components/ui/pagination_item.rb +17 -0
  450. data/app/components/ui/pagination_link.rb +25 -0
  451. data/app/components/ui/pagination_next.rb +31 -0
  452. data/app/components/ui/pagination_previous.rb +31 -0
  453. data/app/components/ui/popover.rb +48 -0
  454. data/app/components/ui/popover_content.rb +29 -0
  455. data/app/components/ui/popover_trigger.rb +36 -0
  456. data/app/components/ui/progress.rb +37 -0
  457. data/app/components/ui/radio_button.rb +50 -0
  458. data/app/components/ui/resizable_handle.rb +58 -0
  459. data/app/components/ui/resizable_panel.rb +35 -0
  460. data/app/components/ui/resizable_panel_group.rb +41 -0
  461. data/app/components/ui/responsive_dialog.rb +98 -0
  462. data/app/components/ui/scroll_area.rb +62 -0
  463. data/app/components/ui/scroll_area_corner.rb +33 -0
  464. data/app/components/ui/scroll_area_scrollbar.rb +45 -0
  465. data/app/components/ui/scroll_area_thumb.rb +38 -0
  466. data/app/components/ui/scroll_area_viewport.rb +41 -0
  467. data/app/components/ui/select.rb +42 -0
  468. data/app/components/ui/select_content.rb +43 -0
  469. data/app/components/ui/select_group.rb +38 -0
  470. data/app/components/ui/select_item.rb +67 -0
  471. data/app/components/ui/select_label.rb +34 -0
  472. data/app/components/ui/select_scroll_down_button.rb +47 -0
  473. data/app/components/ui/select_scroll_up_button.rb +47 -0
  474. data/app/components/ui/select_trigger.rb +45 -0
  475. data/app/components/ui/separator.rb +39 -0
  476. data/app/components/ui/sheet.rb +19 -0
  477. data/app/components/ui/sheet_close.rb +39 -0
  478. data/app/components/ui/sheet_content.rb +55 -0
  479. data/app/components/ui/sheet_description.rb +22 -0
  480. data/app/components/ui/sheet_footer.rb +15 -0
  481. data/app/components/ui/sheet_header.rb +15 -0
  482. data/app/components/ui/sheet_overlay.rb +18 -0
  483. data/app/components/ui/sheet_title.rb +22 -0
  484. data/app/components/ui/sheet_trigger.rb +27 -0
  485. data/app/components/ui/sidebar.rb +100 -0
  486. data/app/components/ui/sidebar_content.rb +34 -0
  487. data/app/components/ui/sidebar_footer.rb +36 -0
  488. data/app/components/ui/sidebar_group.rb +52 -0
  489. data/app/components/ui/sidebar_group_action.rb +47 -0
  490. data/app/components/ui/sidebar_group_content.rb +42 -0
  491. data/app/components/ui/sidebar_group_label.rb +46 -0
  492. data/app/components/ui/sidebar_header.rb +36 -0
  493. data/app/components/ui/sidebar_input.rb +42 -0
  494. data/app/components/ui/sidebar_inset.rb +42 -0
  495. data/app/components/ui/sidebar_menu.rb +39 -0
  496. data/app/components/ui/sidebar_menu_action.rb +60 -0
  497. data/app/components/ui/sidebar_menu_badge.rb +39 -0
  498. data/app/components/ui/sidebar_menu_button.rb +71 -0
  499. data/app/components/ui/sidebar_menu_item.rb +45 -0
  500. data/app/components/ui/sidebar_menu_skeleton.rb +63 -0
  501. data/app/components/ui/sidebar_menu_sub.rb +50 -0
  502. data/app/components/ui/sidebar_menu_sub_button.rb +48 -0
  503. data/app/components/ui/sidebar_menu_sub_item.rb +34 -0
  504. data/app/components/ui/sidebar_provider.rb +73 -0
  505. data/app/components/ui/sidebar_rail.rb +35 -0
  506. data/app/components/ui/sidebar_separator.rb +32 -0
  507. data/app/components/ui/sidebar_trigger.rb +57 -0
  508. data/app/components/ui/skeleton.rb +42 -0
  509. data/app/components/ui/small.rb +15 -0
  510. data/app/components/ui/sonner_toaster.rb +53 -0
  511. data/app/components/ui/spinner.rb +41 -0
  512. data/app/components/ui/switch.rb +70 -0
  513. data/app/components/ui/table.rb +45 -0
  514. data/app/components/ui/table_body.rb +29 -0
  515. data/app/components/ui/table_caption.rb +16 -0
  516. data/app/components/ui/table_cell.rb +16 -0
  517. data/app/components/ui/table_footer.rb +29 -0
  518. data/app/components/ui/table_head.rb +16 -0
  519. data/app/components/ui/table_header.rb +29 -0
  520. data/app/components/ui/table_row.rb +25 -0
  521. data/app/components/ui/tabs.rb +40 -0
  522. data/app/components/ui/tabs_content.rb +30 -0
  523. data/app/components/ui/tabs_list.rb +27 -0
  524. data/app/components/ui/tabs_trigger.rb +33 -0
  525. data/app/components/ui/textarea.rb +19 -0
  526. data/app/components/ui/toggle.rb +43 -0
  527. data/app/components/ui/toggle_group.rb +58 -0
  528. data/app/components/ui/toggle_group_item.rb +71 -0
  529. data/app/components/ui/tooltip.rb +31 -0
  530. data/app/components/ui/tooltip_content.rb +35 -0
  531. data/app/components/ui/tooltip_trigger.rb +42 -0
  532. data/app/controllers/ui/application_controller.rb +4 -0
  533. data/app/helpers/ui/application_helper.rb +20 -0
  534. data/app/helpers/ui/combobox_behavior.rb +59 -0
  535. data/app/helpers/ui/empty_behavior.rb +124 -0
  536. data/app/helpers/ui/input_group_addon_behavior.rb +52 -0
  537. data/app/helpers/ui/input_group_behavior.rb +63 -0
  538. data/app/helpers/ui/input_group_button_behavior.rb +82 -0
  539. data/app/helpers/ui/input_group_input_behavior.rb +50 -0
  540. data/app/helpers/ui/input_group_text_behavior.rb +32 -0
  541. data/app/helpers/ui/input_group_textarea_behavior.rb +50 -0
  542. data/app/helpers/ui/popover_behavior.rb +54 -0
  543. data/app/helpers/ui/popover_content_behavior.rb +52 -0
  544. data/app/helpers/ui/popover_trigger_behavior.rb +33 -0
  545. data/app/helpers/ui/scroll_area_behavior.rb +36 -0
  546. data/app/helpers/ui/scroll_area_corner_behavior.rb +34 -0
  547. data/app/helpers/ui/scroll_area_scrollbar_behavior.rb +50 -0
  548. data/app/helpers/ui/scroll_area_thumb_behavior.rb +34 -0
  549. data/app/helpers/ui/scroll_area_viewport_behavior.rb +36 -0
  550. data/app/helpers/ui/select_behavior.rb +84 -0
  551. data/app/helpers/ui/select_content_behavior.rb +42 -0
  552. data/app/helpers/ui/select_group_behavior.rb +35 -0
  553. data/app/helpers/ui/select_item_behavior.rb +48 -0
  554. data/app/helpers/ui/select_label_behavior.rb +34 -0
  555. data/app/helpers/ui/select_scroll_down_button_behavior.rb +51 -0
  556. data/app/helpers/ui/select_scroll_up_button_behavior.rb +51 -0
  557. data/app/helpers/ui/select_trigger_behavior.rb +40 -0
  558. data/app/helpers/ui/spinner_behavior.rb +50 -0
  559. data/app/helpers/ui/textarea_behavior.rb +36 -0
  560. data/app/javascript/ui/common.js +24 -0
  561. data/app/javascript/ui/controllers/accordion_controller.js +159 -0
  562. data/app/javascript/ui/controllers/alert_dialog_controller.js +98 -0
  563. data/app/javascript/ui/controllers/avatar_controller.js +84 -0
  564. data/app/javascript/ui/controllers/calendar_controller.js +867 -0
  565. data/app/javascript/ui/controllers/carousel_controller.js +191 -0
  566. data/app/javascript/ui/controllers/checkbox_controller.js +27 -0
  567. data/app/javascript/ui/controllers/collapsible_controller.js +65 -0
  568. data/app/javascript/ui/controllers/combobox_controller.js +149 -0
  569. data/app/javascript/ui/controllers/command_controller.js +199 -0
  570. data/app/javascript/ui/controllers/command_dialog_controller.js +100 -0
  571. data/app/javascript/ui/controllers/context_menu_controller.js +289 -0
  572. data/app/javascript/ui/controllers/datepicker_controller.js +385 -0
  573. data/app/javascript/ui/controllers/dialog_controller.js +136 -0
  574. data/app/javascript/ui/controllers/drawer_controller.js +945 -0
  575. data/app/javascript/ui/controllers/dropdown_controller.js +850 -0
  576. data/app/javascript/ui/controllers/hello_controller.js +30 -0
  577. data/app/javascript/ui/controllers/hover_card_controller.js +147 -0
  578. data/app/javascript/ui/controllers/input_otp_controller.js +139 -0
  579. data/app/javascript/ui/controllers/menubar_controller.js +799 -0
  580. data/app/javascript/ui/controllers/navigation_menu_controller.js +527 -0
  581. data/app/javascript/ui/controllers/popover_controller.js +257 -0
  582. data/app/javascript/ui/controllers/resizable_controller.js +449 -0
  583. data/app/javascript/ui/controllers/responsive_dialog_controller.js +156 -0
  584. data/app/javascript/ui/controllers/scroll_area_controller.js +623 -0
  585. data/app/javascript/ui/controllers/select_controller.js +456 -0
  586. data/app/javascript/ui/controllers/sidebar_controller.js +284 -0
  587. data/app/javascript/ui/controllers/slider_controller.js +342 -0
  588. data/app/javascript/ui/controllers/sonner_controller.js +393 -0
  589. data/app/javascript/ui/controllers/switch_controller.js +75 -0
  590. data/app/javascript/ui/controllers/tabs_controller.js +156 -0
  591. data/app/javascript/ui/controllers/toggle_controller.js +49 -0
  592. data/app/javascript/ui/controllers/toggle_group_controller.js +155 -0
  593. data/app/javascript/ui/controllers/tooltip_controller.js +122 -0
  594. data/app/javascript/ui/index.js +94 -0
  595. data/app/javascript/ui/utils/click-outside-manager.js +133 -0
  596. data/app/javascript/ui/utils/escape-key-manager.js +118 -0
  597. data/app/javascript/ui/utils/floating-ui-positioner.js +282 -0
  598. data/app/javascript/ui/utils/focus-trap-manager.js +238 -0
  599. data/app/javascript/ui/utils/index.js +86 -0
  600. data/app/javascript/ui/utils/menu_utils.js +423 -0
  601. data/app/javascript/ui/utils/scroll-lock-manager.js +149 -0
  602. data/app/javascript/ui/utils/state-manager.js +205 -0
  603. data/app/jobs/ui/application_job.rb +4 -0
  604. data/app/mailers/ui/application_mailer.rb +6 -0
  605. data/app/models/ui/application_record.rb +5 -0
  606. data/app/view_components/ui/accordion_component.rb +35 -0
  607. data/app/view_components/ui/accordion_content_component.rb +29 -0
  608. data/app/view_components/ui/accordion_item_component.rb +43 -0
  609. data/app/view_components/ui/accordion_trigger_component.rb +31 -0
  610. data/app/view_components/ui/alert_component.rb +23 -0
  611. data/app/view_components/ui/alert_description_component.rb +21 -0
  612. data/app/view_components/ui/alert_title_component.rb +21 -0
  613. data/app/view_components/ui/aspect_ratio_component.rb +26 -0
  614. data/app/view_components/ui/avatar_component.rb +21 -0
  615. data/app/view_components/ui/avatar_fallback_component.rb +21 -0
  616. data/app/view_components/ui/avatar_image_component.rb +23 -0
  617. data/app/view_components/ui/badge_component.rb +23 -0
  618. data/app/view_components/ui/blockquote_component.rb +18 -0
  619. data/app/view_components/ui/breadcrumb_component.rb +33 -0
  620. data/app/view_components/ui/breadcrumb_ellipsis_component.rb +50 -0
  621. data/app/view_components/ui/breadcrumb_item_component.rb +29 -0
  622. data/app/view_components/ui/breadcrumb_link_component.rb +29 -0
  623. data/app/view_components/ui/breadcrumb_list_component.rb +29 -0
  624. data/app/view_components/ui/breadcrumb_page_component.rb +27 -0
  625. data/app/view_components/ui/breadcrumb_separator_component.rb +47 -0
  626. data/app/view_components/ui/button_component.rb +43 -0
  627. data/app/view_components/ui/button_group_component.rb +38 -0
  628. data/app/view_components/ui/button_group_separator_component.rb +33 -0
  629. data/app/view_components/ui/button_group_text_component.rb +30 -0
  630. data/app/view_components/ui/calendar_component.rb +185 -0
  631. data/app/view_components/ui/card_action_component.rb +14 -0
  632. data/app/view_components/ui/card_component.rb +14 -0
  633. data/app/view_components/ui/card_content_component.rb +14 -0
  634. data/app/view_components/ui/card_description_component.rb +14 -0
  635. data/app/view_components/ui/card_footer_component.rb +14 -0
  636. data/app/view_components/ui/card_header_component.rb +14 -0
  637. data/app/view_components/ui/card_title_component.rb +14 -0
  638. data/app/view_components/ui/carousel_component.rb +16 -0
  639. data/app/view_components/ui/carousel_content_component.rb +15 -0
  640. data/app/view_components/ui/carousel_item_component.rb +13 -0
  641. data/app/view_components/ui/carousel_next_component.rb +31 -0
  642. data/app/view_components/ui/carousel_previous_component.rb +31 -0
  643. data/app/view_components/ui/checkbox_component.rb +55 -0
  644. data/app/view_components/ui/collapsible_component.rb +23 -0
  645. data/app/view_components/ui/collapsible_content_component.rb +15 -0
  646. data/app/view_components/ui/collapsible_trigger_component.rb +21 -0
  647. data/app/view_components/ui/combobox_wrapper_component.rb +56 -0
  648. data/app/view_components/ui/command_component.rb +15 -0
  649. data/app/view_components/ui/command_dialog_component.rb +25 -0
  650. data/app/view_components/ui/command_empty_component.rb +14 -0
  651. data/app/view_components/ui/command_group_component.rb +21 -0
  652. data/app/view_components/ui/command_input_component.rb +20 -0
  653. data/app/view_components/ui/command_item_component.rb +16 -0
  654. data/app/view_components/ui/command_list_component.rb +14 -0
  655. data/app/view_components/ui/command_separator_component.rb +14 -0
  656. data/app/view_components/ui/command_shortcut_component.rb +14 -0
  657. data/app/view_components/ui/context_menu_checkbox_item_component.rb +45 -0
  658. data/app/view_components/ui/context_menu_component.rb +20 -0
  659. data/app/view_components/ui/context_menu_content_component.rb +20 -0
  660. data/app/view_components/ui/context_menu_item_component.rb +29 -0
  661. data/app/view_components/ui/context_menu_label_component.rb +22 -0
  662. data/app/view_components/ui/context_menu_radio_group_component.rb +19 -0
  663. data/app/view_components/ui/context_menu_radio_item_component.rb +45 -0
  664. data/app/view_components/ui/context_menu_separator_component.rb +15 -0
  665. data/app/view_components/ui/context_menu_shortcut_component.rb +19 -0
  666. data/app/view_components/ui/context_menu_trigger_component.rb +20 -0
  667. data/app/view_components/ui/date_picker_component.rb +137 -0
  668. data/app/view_components/ui/date_picker_input_component.rb +76 -0
  669. data/app/view_components/ui/date_picker_trigger_component.rb +79 -0
  670. data/app/view_components/ui/dialog_close_component.rb +71 -0
  671. data/app/view_components/ui/dialog_component.rb +50 -0
  672. data/app/view_components/ui/dialog_content_component.rb +28 -0
  673. data/app/view_components/ui/dialog_description_component.rb +26 -0
  674. data/app/view_components/ui/dialog_footer_component.rb +21 -0
  675. data/app/view_components/ui/dialog_header_component.rb +22 -0
  676. data/app/view_components/ui/dialog_overlay_component.rb +36 -0
  677. data/app/view_components/ui/dialog_title_component.rb +26 -0
  678. data/app/view_components/ui/dialog_trigger_component.rb +71 -0
  679. data/app/view_components/ui/drawer_close_component.rb +35 -0
  680. data/app/view_components/ui/drawer_component.rb +81 -0
  681. data/app/view_components/ui/drawer_content_component.rb +32 -0
  682. data/app/view_components/ui/drawer_description_component.rb +21 -0
  683. data/app/view_components/ui/drawer_footer_component.rb +24 -0
  684. data/app/view_components/ui/drawer_handle_component.rb +24 -0
  685. data/app/view_components/ui/drawer_header_component.rb +24 -0
  686. data/app/view_components/ui/drawer_overlay_component.rb +28 -0
  687. data/app/view_components/ui/drawer_title_component.rb +21 -0
  688. data/app/view_components/ui/drawer_trigger_component.rb +71 -0
  689. data/app/view_components/ui/dropdown_menu_checkbox_item_component.rb +36 -0
  690. data/app/view_components/ui/dropdown_menu_component.rb +52 -0
  691. data/app/view_components/ui/dropdown_menu_content_component.rb +18 -0
  692. data/app/view_components/ui/dropdown_menu_item_component.rb +21 -0
  693. data/app/view_components/ui/dropdown_menu_label_component.rb +18 -0
  694. data/app/view_components/ui/dropdown_menu_radio_group_component.rb +17 -0
  695. data/app/view_components/ui/dropdown_menu_radio_item_component.rb +37 -0
  696. data/app/view_components/ui/dropdown_menu_separator_component.rb +15 -0
  697. data/app/view_components/ui/dropdown_menu_shortcut_component.rb +17 -0
  698. data/app/view_components/ui/dropdown_menu_sub_component.rb +17 -0
  699. data/app/view_components/ui/dropdown_menu_sub_content_component.rb +19 -0
  700. data/app/view_components/ui/dropdown_menu_sub_trigger_component.rb +29 -0
  701. data/app/view_components/ui/dropdown_menu_trigger_component.rb +52 -0
  702. data/app/view_components/ui/empty_component.rb +17 -0
  703. data/app/view_components/ui/empty_content_component.rb +17 -0
  704. data/app/view_components/ui/empty_description_component.rb +17 -0
  705. data/app/view_components/ui/empty_header_component.rb +17 -0
  706. data/app/view_components/ui/empty_media_component.rb +18 -0
  707. data/app/view_components/ui/empty_title_component.rb +17 -0
  708. data/app/view_components/ui/field_component.rb +41 -0
  709. data/app/view_components/ui/field_content_component.rb +27 -0
  710. data/app/view_components/ui/field_description_component.rb +27 -0
  711. data/app/view_components/ui/field_error_component.rb +63 -0
  712. data/app/view_components/ui/field_group_component.rb +32 -0
  713. data/app/view_components/ui/field_label_component.rb +29 -0
  714. data/app/view_components/ui/field_legend_component.rb +34 -0
  715. data/app/view_components/ui/field_separator_component.rb +53 -0
  716. data/app/view_components/ui/field_set_component.rb +30 -0
  717. data/app/view_components/ui/field_title_component.rb +27 -0
  718. data/app/view_components/ui/h1_component.rb +21 -0
  719. data/app/view_components/ui/h2_component.rb +21 -0
  720. data/app/view_components/ui/h3_component.rb +18 -0
  721. data/app/view_components/ui/h4_component.rb +18 -0
  722. data/app/view_components/ui/hover_card_component.rb +30 -0
  723. data/app/view_components/ui/hover_card_content_component.rb +36 -0
  724. data/app/view_components/ui/hover_card_trigger_component.rb +54 -0
  725. data/app/view_components/ui/inline_code_component.rb +18 -0
  726. data/app/view_components/ui/input_component.rb +23 -0
  727. data/app/view_components/ui/input_group_addon_component.rb +36 -0
  728. data/app/view_components/ui/input_group_button_component.rb +36 -0
  729. data/app/view_components/ui/input_group_component.rb +35 -0
  730. data/app/view_components/ui/input_group_input_component.rb +42 -0
  731. data/app/view_components/ui/input_group_text_component.rb +33 -0
  732. data/app/view_components/ui/input_group_textarea_component.rb +42 -0
  733. data/app/view_components/ui/input_otp_component.rb +61 -0
  734. data/app/view_components/ui/input_otp_group_component.rb +29 -0
  735. data/app/view_components/ui/input_otp_separator_component.rb +36 -0
  736. data/app/view_components/ui/input_otp_slot_component.rb +32 -0
  737. data/app/view_components/ui/item_actions_component.rb +18 -0
  738. data/app/view_components/ui/item_component.rb +30 -0
  739. data/app/view_components/ui/item_content_component.rb +18 -0
  740. data/app/view_components/ui/item_description_component.rb +18 -0
  741. data/app/view_components/ui/item_footer_component.rb +18 -0
  742. data/app/view_components/ui/item_group_component.rb +18 -0
  743. data/app/view_components/ui/item_header_component.rb +18 -0
  744. data/app/view_components/ui/item_media_component.rb +19 -0
  745. data/app/view_components/ui/item_separator_component.rb +18 -0
  746. data/app/view_components/ui/item_title_component.rb +18 -0
  747. data/app/view_components/ui/kbd_component.rb +31 -0
  748. data/app/view_components/ui/kbd_group_component.rb +32 -0
  749. data/app/view_components/ui/label_component.rb +23 -0
  750. data/app/view_components/ui/large_component.rb +18 -0
  751. data/app/view_components/ui/lead_component.rb +18 -0
  752. data/app/view_components/ui/list_component.rb +18 -0
  753. data/app/view_components/ui/menubar_checkbox_item_component.rb +47 -0
  754. data/app/view_components/ui/menubar_component.rb +24 -0
  755. data/app/view_components/ui/menubar_content_component.rb +26 -0
  756. data/app/view_components/ui/menubar_item_component.rb +31 -0
  757. data/app/view_components/ui/menubar_label_component.rb +23 -0
  758. data/app/view_components/ui/menubar_menu_component.rb +25 -0
  759. data/app/view_components/ui/menubar_radio_group_component.rb +26 -0
  760. data/app/view_components/ui/menubar_radio_item_component.rb +48 -0
  761. data/app/view_components/ui/menubar_separator_component.rb +20 -0
  762. data/app/view_components/ui/menubar_shortcut_component.rb +22 -0
  763. data/app/view_components/ui/menubar_sub_component.rb +25 -0
  764. data/app/view_components/ui/menubar_sub_content_component.rb +25 -0
  765. data/app/view_components/ui/menubar_sub_trigger_component.rb +43 -0
  766. data/app/view_components/ui/menubar_trigger_component.rb +23 -0
  767. data/app/view_components/ui/muted_component.rb +18 -0
  768. data/app/view_components/ui/navigation_menu_component.rb +42 -0
  769. data/app/view_components/ui/navigation_menu_content_component.rb +23 -0
  770. data/app/view_components/ui/navigation_menu_item_component.rb +23 -0
  771. data/app/view_components/ui/navigation_menu_link_component.rb +101 -0
  772. data/app/view_components/ui/navigation_menu_list_component.rb +21 -0
  773. data/app/view_components/ui/navigation_menu_trigger_component.rb +45 -0
  774. data/app/view_components/ui/navigation_menu_viewport_component.rb +21 -0
  775. data/app/view_components/ui/p_component.rb +18 -0
  776. data/app/view_components/ui/pagination_component.rb +18 -0
  777. data/app/view_components/ui/pagination_content_component.rb +18 -0
  778. data/app/view_components/ui/pagination_ellipsis_component.rb +25 -0
  779. data/app/view_components/ui/pagination_item_component.rb +16 -0
  780. data/app/view_components/ui/pagination_link_component.rb +26 -0
  781. data/app/view_components/ui/pagination_next_component.rb +30 -0
  782. data/app/view_components/ui/pagination_previous_component.rb +30 -0
  783. data/app/view_components/ui/popover_component.rb +55 -0
  784. data/app/view_components/ui/popover_content_component.rb +43 -0
  785. data/app/view_components/ui/popover_trigger_component.rb +72 -0
  786. data/app/view_components/ui/progress_component.rb +39 -0
  787. data/app/view_components/ui/radio_button_component.rb +56 -0
  788. data/app/view_components/ui/resizable_handle_component.rb +35 -0
  789. data/app/view_components/ui/resizable_panel_component.rb +39 -0
  790. data/app/view_components/ui/resizable_panel_group_component.rb +45 -0
  791. data/app/view_components/ui/responsive_dialog_component.rb +81 -0
  792. data/app/view_components/ui/scroll_area_component.rb +46 -0
  793. data/app/view_components/ui/scroll_area_corner_component.rb +22 -0
  794. data/app/view_components/ui/scroll_area_scrollbar_component.rb +35 -0
  795. data/app/view_components/ui/scroll_area_thumb_component.rb +29 -0
  796. data/app/view_components/ui/scroll_area_viewport_component.rb +32 -0
  797. data/app/view_components/ui/select_component.rb +31 -0
  798. data/app/view_components/ui/select_content_component.rb +41 -0
  799. data/app/view_components/ui/select_group_component.rb +26 -0
  800. data/app/view_components/ui/select_item_component.rb +45 -0
  801. data/app/view_components/ui/select_label_component.rb +22 -0
  802. data/app/view_components/ui/select_scroll_down_button_component.rb +35 -0
  803. data/app/view_components/ui/select_scroll_up_button_component.rb +35 -0
  804. data/app/view_components/ui/select_trigger_component.rb +27 -0
  805. data/app/view_components/ui/separator_component.rb +27 -0
  806. data/app/view_components/ui/sheet_close_component.rb +71 -0
  807. data/app/view_components/ui/sheet_component.rb +50 -0
  808. data/app/view_components/ui/sheet_content_component.rb +52 -0
  809. data/app/view_components/ui/sheet_description_component.rb +25 -0
  810. data/app/view_components/ui/sheet_footer_component.rb +21 -0
  811. data/app/view_components/ui/sheet_header_component.rb +21 -0
  812. data/app/view_components/ui/sheet_overlay_component.rb +36 -0
  813. data/app/view_components/ui/sheet_title_component.rb +25 -0
  814. data/app/view_components/ui/sheet_trigger_component.rb +60 -0
  815. data/app/view_components/ui/skeleton_component.rb +30 -0
  816. data/app/view_components/ui/slider_component.rb +61 -0
  817. data/app/view_components/ui/slider_range_component.rb +24 -0
  818. data/app/view_components/ui/slider_thumb_component.rb +30 -0
  819. data/app/view_components/ui/slider_track_component.rb +28 -0
  820. data/app/view_components/ui/small_component.rb +18 -0
  821. data/app/view_components/ui/sonner_toaster_component.rb +53 -0
  822. data/app/view_components/ui/spinner_component.rb +48 -0
  823. data/app/view_components/ui/switch_component.rb +55 -0
  824. data/app/view_components/ui/table_body_component.rb +21 -0
  825. data/app/view_components/ui/table_caption_component.rb +14 -0
  826. data/app/view_components/ui/table_cell_component.rb +14 -0
  827. data/app/view_components/ui/table_component.rb +27 -0
  828. data/app/view_components/ui/table_footer_component.rb +21 -0
  829. data/app/view_components/ui/table_head_component.rb +14 -0
  830. data/app/view_components/ui/table_header_component.rb +21 -0
  831. data/app/view_components/ui/table_row_component.rb +23 -0
  832. data/app/view_components/ui/tabs_component.rb +39 -0
  833. data/app/view_components/ui/tabs_content_component.rb +34 -0
  834. data/app/view_components/ui/tabs_list_component.rb +30 -0
  835. data/app/view_components/ui/tabs_trigger_component.rb +37 -0
  836. data/app/view_components/ui/textarea_component.rb +18 -0
  837. data/app/view_components/ui/toggle_component.rb +48 -0
  838. data/app/view_components/ui/toggle_group_component.rb +68 -0
  839. data/app/view_components/ui/toggle_group_item_component.rb +72 -0
  840. data/app/view_components/ui/tooltip_component.rb +19 -0
  841. data/app/view_components/ui/tooltip_content_component.rb +28 -0
  842. data/app/view_components/ui/tooltip_trigger_component.rb +25 -0
  843. data/app/views/layouts/ui/application.html.erb +21 -0
  844. data/app/views/ui/_accordion.html.erb +17 -0
  845. data/app/views/ui/_alert.html.erb +22 -0
  846. data/app/views/ui/_aspect_ratio.html.erb +18 -0
  847. data/app/views/ui/_avatar.html.erb +13 -0
  848. data/app/views/ui/_badge.html.erb +18 -0
  849. data/app/views/ui/_blockquote.html.erb +19 -0
  850. data/app/views/ui/_breadcrumb.html.erb +14 -0
  851. data/app/views/ui/_button.html.erb +38 -0
  852. data/app/views/ui/_button_group.html.erb +17 -0
  853. data/app/views/ui/_calendar.html.erb +172 -0
  854. data/app/views/ui/_card.html.erb +18 -0
  855. data/app/views/ui/_carousel.html.erb +17 -0
  856. data/app/views/ui/_checkbox.html.erb +32 -0
  857. data/app/views/ui/_collapsible.html.erb +23 -0
  858. data/app/views/ui/_command.html.erb +19 -0
  859. data/app/views/ui/_context_menu.html.erb +21 -0
  860. data/app/views/ui/_date_picker.html.erb +93 -0
  861. data/app/views/ui/_dialog.html.erb +18 -0
  862. data/app/views/ui/_drawer.html.erb +25 -0
  863. data/app/views/ui/_dropdown_menu.html.erb +40 -0
  864. data/app/views/ui/_empty.html.erb +13 -0
  865. data/app/views/ui/_field.html.erb +15 -0
  866. data/app/views/ui/_h1.html.erb +19 -0
  867. data/app/views/ui/_h2.html.erb +19 -0
  868. data/app/views/ui/_h3.html.erb +19 -0
  869. data/app/views/ui/_h4.html.erb +19 -0
  870. data/app/views/ui/_hover_card.html.erb +14 -0
  871. data/app/views/ui/_inline_code.html.erb +19 -0
  872. data/app/views/ui/_input.html.erb +18 -0
  873. data/app/views/ui/_input_group.html.erb +14 -0
  874. data/app/views/ui/_input_otp.html.erb +44 -0
  875. data/app/views/ui/_item.html.erb +9 -0
  876. data/app/views/ui/_kbd.html.erb +15 -0
  877. data/app/views/ui/_label.html.erb +16 -0
  878. data/app/views/ui/_large.html.erb +19 -0
  879. data/app/views/ui/_lead.html.erb +19 -0
  880. data/app/views/ui/_list.html.erb +19 -0
  881. data/app/views/ui/_menubar.html.erb +25 -0
  882. data/app/views/ui/_muted.html.erb +19 -0
  883. data/app/views/ui/_navigation_menu.html.erb +34 -0
  884. data/app/views/ui/_p.html.erb +19 -0
  885. data/app/views/ui/_pagination.html.erb +14 -0
  886. data/app/views/ui/_popover.html.erb +19 -0
  887. data/app/views/ui/_progress.html.erb +15 -0
  888. data/app/views/ui/_radio_button.html.erb +34 -0
  889. data/app/views/ui/_responsive_dialog.html.erb +44 -0
  890. data/app/views/ui/_scroll_area.html.erb +60 -0
  891. data/app/views/ui/_select.html.erb +17 -0
  892. data/app/views/ui/_separator.html.erb +20 -0
  893. data/app/views/ui/_sheet.html.erb +18 -0
  894. data/app/views/ui/_skeleton.html.erb +19 -0
  895. data/app/views/ui/_slider.html.erb +27 -0
  896. data/app/views/ui/_small.html.erb +19 -0
  897. data/app/views/ui/_spinner.html.erb +28 -0
  898. data/app/views/ui/_switch.html.erb +45 -0
  899. data/app/views/ui/_table.html.erb +18 -0
  900. data/app/views/ui/_tabs.html.erb +23 -0
  901. data/app/views/ui/_textarea.html.erb +16 -0
  902. data/app/views/ui/_toggle.html.erb +27 -0
  903. data/app/views/ui/_toggle_group.html.erb +38 -0
  904. data/app/views/ui/_tooltip.html.erb +13 -0
  905. data/app/views/ui/accordion/_content.html.erb +21 -0
  906. data/app/views/ui/accordion/_item.html.erb +21 -0
  907. data/app/views/ui/accordion/_trigger.html.erb +23 -0
  908. data/app/views/ui/alert/_description.html.erb +13 -0
  909. data/app/views/ui/alert/_title.html.erb +13 -0
  910. data/app/views/ui/avatar/_fallback.html.erb +13 -0
  911. data/app/views/ui/avatar/_image.html.erb +18 -0
  912. data/app/views/ui/breadcrumb/_ellipsis.html.erb +26 -0
  913. data/app/views/ui/breadcrumb/_item.html.erb +14 -0
  914. data/app/views/ui/breadcrumb/_link.html.erb +16 -0
  915. data/app/views/ui/breadcrumb/_list.html.erb +14 -0
  916. data/app/views/ui/breadcrumb/_page.html.erb +15 -0
  917. data/app/views/ui/breadcrumb/_separator.html.erb +23 -0
  918. data/app/views/ui/button_group/_separator.html.erb +19 -0
  919. data/app/views/ui/button_group/_text.html.erb +16 -0
  920. data/app/views/ui/card/_action.html.erb +18 -0
  921. data/app/views/ui/card/_content.html.erb +18 -0
  922. data/app/views/ui/card/_description.html.erb +20 -0
  923. data/app/views/ui/card/_footer.html.erb +18 -0
  924. data/app/views/ui/card/_header.html.erb +18 -0
  925. data/app/views/ui/card/_title.html.erb +20 -0
  926. data/app/views/ui/carousel/_content.html.erb +16 -0
  927. data/app/views/ui/carousel/_item.html.erb +14 -0
  928. data/app/views/ui/carousel/_next.html.erb +13 -0
  929. data/app/views/ui/carousel/_previous.html.erb +13 -0
  930. data/app/views/ui/collapsible/_content.html.erb +20 -0
  931. data/app/views/ui/collapsible/_trigger.html.erb +18 -0
  932. data/app/views/ui/combobox/_wrapper.html.erb +43 -0
  933. data/app/views/ui/command/_dialog.html.erb +17 -0
  934. data/app/views/ui/command/_empty.html.erb +19 -0
  935. data/app/views/ui/command/_group.html.erb +23 -0
  936. data/app/views/ui/command/_input.html.erb +20 -0
  937. data/app/views/ui/command/_item.html.erb +21 -0
  938. data/app/views/ui/command/_list.html.erb +17 -0
  939. data/app/views/ui/command/_separator.html.erb +15 -0
  940. data/app/views/ui/command/_shortcut.html.erb +19 -0
  941. data/app/views/ui/context_menu/_checkbox_item.html.erb +23 -0
  942. data/app/views/ui/context_menu/_content.html.erb +15 -0
  943. data/app/views/ui/context_menu/_item.html.erb +19 -0
  944. data/app/views/ui/context_menu/_label.html.erb +16 -0
  945. data/app/views/ui/context_menu/_radio_group.html.erb +14 -0
  946. data/app/views/ui/context_menu/_radio_item.html.erb +23 -0
  947. data/app/views/ui/context_menu/_separator.html.erb +12 -0
  948. data/app/views/ui/context_menu/_shortcut.html.erb +15 -0
  949. data/app/views/ui/context_menu/_trigger.html.erb +14 -0
  950. data/app/views/ui/date_picker/_input.html.erb +47 -0
  951. data/app/views/ui/date_picker/_trigger.html.erb +53 -0
  952. data/app/views/ui/dialog/_close.html.erb +24 -0
  953. data/app/views/ui/dialog/_content.html.erb +22 -0
  954. data/app/views/ui/dialog/_description.html.erb +14 -0
  955. data/app/views/ui/dialog/_footer.html.erb +14 -0
  956. data/app/views/ui/dialog/_header.html.erb +14 -0
  957. data/app/views/ui/dialog/_overlay.html.erb +19 -0
  958. data/app/views/ui/dialog/_title.html.erb +14 -0
  959. data/app/views/ui/dialog/_trigger.html.erb +24 -0
  960. data/app/views/ui/drawer/_close.html.erb +17 -0
  961. data/app/views/ui/drawer/_content.html.erb +31 -0
  962. data/app/views/ui/drawer/_description.html.erb +15 -0
  963. data/app/views/ui/drawer/_footer.html.erb +15 -0
  964. data/app/views/ui/drawer/_handle.html.erb +12 -0
  965. data/app/views/ui/drawer/_header.html.erb +15 -0
  966. data/app/views/ui/drawer/_overlay.html.erb +16 -0
  967. data/app/views/ui/drawer/_title.html.erb +15 -0
  968. data/app/views/ui/drawer/_trigger.html.erb +25 -0
  969. data/app/views/ui/dropdown_menu/_checkbox_item.html.erb +24 -0
  970. data/app/views/ui/dropdown_menu/_content.html.erb +15 -0
  971. data/app/views/ui/dropdown_menu/_item.html.erb +24 -0
  972. data/app/views/ui/dropdown_menu/_label.html.erb +16 -0
  973. data/app/views/ui/dropdown_menu/_radio_group.html.erb +15 -0
  974. data/app/views/ui/dropdown_menu/_radio_item.html.erb +27 -0
  975. data/app/views/ui/dropdown_menu/_separator.html.erb +12 -0
  976. data/app/views/ui/dropdown_menu/_shortcut.html.erb +15 -0
  977. data/app/views/ui/dropdown_menu/_sub.html.erb +14 -0
  978. data/app/views/ui/dropdown_menu/_sub_content.html.erb +17 -0
  979. data/app/views/ui/dropdown_menu/_sub_trigger.html.erb +17 -0
  980. data/app/views/ui/dropdown_menu/_trigger.html.erb +20 -0
  981. data/app/views/ui/empty/_content.html.erb +13 -0
  982. data/app/views/ui/empty/_description.html.erb +13 -0
  983. data/app/views/ui/empty/_header.html.erb +13 -0
  984. data/app/views/ui/empty/_media.html.erb +14 -0
  985. data/app/views/ui/empty/_title.html.erb +13 -0
  986. data/app/views/ui/field/_content.html.erb +14 -0
  987. data/app/views/ui/field/_description.html.erb +15 -0
  988. data/app/views/ui/field/_error.html.erb +15 -0
  989. data/app/views/ui/field/_group.html.erb +14 -0
  990. data/app/views/ui/field/_label.html.erb +15 -0
  991. data/app/views/ui/field/_legend.html.erb +16 -0
  992. data/app/views/ui/field/_separator.html.erb +15 -0
  993. data/app/views/ui/field/_set.html.erb +14 -0
  994. data/app/views/ui/field/_title.html.erb +15 -0
  995. data/app/views/ui/hover_card/_content.html.erb +16 -0
  996. data/app/views/ui/hover_card/_trigger.html.erb +27 -0
  997. data/app/views/ui/input_group/_addon.html.erb +15 -0
  998. data/app/views/ui/input_group/_button.html.erb +18 -0
  999. data/app/views/ui/input_group/_input.html.erb +17 -0
  1000. data/app/views/ui/input_group/_text.html.erb +15 -0
  1001. data/app/views/ui/input_group/_textarea.html.erb +17 -0
  1002. data/app/views/ui/input_otp/_group.html.erb +20 -0
  1003. data/app/views/ui/input_otp/_separator.html.erb +22 -0
  1004. data/app/views/ui/input_otp/_slot.html.erb +28 -0
  1005. data/app/views/ui/item/_actions.html.erb +7 -0
  1006. data/app/views/ui/item/_content.html.erb +7 -0
  1007. data/app/views/ui/item/_description.html.erb +7 -0
  1008. data/app/views/ui/item/_footer.html.erb +7 -0
  1009. data/app/views/ui/item/_group.html.erb +7 -0
  1010. data/app/views/ui/item/_header.html.erb +7 -0
  1011. data/app/views/ui/item/_media.html.erb +8 -0
  1012. data/app/views/ui/item/_separator.html.erb +5 -0
  1013. data/app/views/ui/item/_title.html.erb +7 -0
  1014. data/app/views/ui/kbd/_group.html.erb +14 -0
  1015. data/app/views/ui/menubar/_checkbox_item.html.erb +24 -0
  1016. data/app/views/ui/menubar/_content.html.erb +18 -0
  1017. data/app/views/ui/menubar/_item.html.erb +24 -0
  1018. data/app/views/ui/menubar/_label.html.erb +16 -0
  1019. data/app/views/ui/menubar/_menu.html.erb +14 -0
  1020. data/app/views/ui/menubar/_radio_group.html.erb +16 -0
  1021. data/app/views/ui/menubar/_radio_item.html.erb +25 -0
  1022. data/app/views/ui/menubar/_separator.html.erb +12 -0
  1023. data/app/views/ui/menubar/_shortcut.html.erb +15 -0
  1024. data/app/views/ui/menubar/_sub.html.erb +15 -0
  1025. data/app/views/ui/menubar/_sub_content.html.erb +15 -0
  1026. data/app/views/ui/menubar/_sub_trigger.html.erb +20 -0
  1027. data/app/views/ui/menubar/_trigger.html.erb +15 -0
  1028. data/app/views/ui/navigation_menu/_content.html.erb +13 -0
  1029. data/app/views/ui/navigation_menu/_item.html.erb +13 -0
  1030. data/app/views/ui/navigation_menu/_link.html.erb +33 -0
  1031. data/app/views/ui/navigation_menu/_list.html.erb +12 -0
  1032. data/app/views/ui/navigation_menu/_trigger.html.erb +30 -0
  1033. data/app/views/ui/navigation_menu/_viewport.html.erb +13 -0
  1034. data/app/views/ui/pagination/_content.html.erb +14 -0
  1035. data/app/views/ui/pagination/_ellipsis.html.erb +19 -0
  1036. data/app/views/ui/pagination/_item.html.erb +14 -0
  1037. data/app/views/ui/pagination/_link.html.erb +18 -0
  1038. data/app/views/ui/pagination/_next.html.erb +19 -0
  1039. data/app/views/ui/pagination/_previous.html.erb +19 -0
  1040. data/app/views/ui/popover/_content.html.erb +14 -0
  1041. data/app/views/ui/popover/_trigger.html.erb +15 -0
  1042. data/app/views/ui/resizable/_handle.html.erb +22 -0
  1043. data/app/views/ui/resizable/_panel.html.erb +21 -0
  1044. data/app/views/ui/resizable/_panel_group.html.erb +20 -0
  1045. data/app/views/ui/scroll_area/_corner.html.erb +40 -0
  1046. data/app/views/ui/scroll_area/_scrollbar.html.erb +50 -0
  1047. data/app/views/ui/scroll_area/_thumb.html.erb +44 -0
  1048. data/app/views/ui/scroll_area/_viewport.html.erb +47 -0
  1049. data/app/views/ui/select/_content.html.erb +25 -0
  1050. data/app/views/ui/select/_group.html.erb +42 -0
  1051. data/app/views/ui/select/_item.html.erb +48 -0
  1052. data/app/views/ui/select/_label.html.erb +42 -0
  1053. data/app/views/ui/select/_scroll_down_button.html.erb +44 -0
  1054. data/app/views/ui/select/_scroll_up_button.html.erb +44 -0
  1055. data/app/views/ui/select/_trigger.html.erb +43 -0
  1056. data/app/views/ui/sheet/_close.html.erb +24 -0
  1057. data/app/views/ui/sheet/_content.html.erb +30 -0
  1058. data/app/views/ui/sheet/_description.html.erb +14 -0
  1059. data/app/views/ui/sheet/_footer.html.erb +14 -0
  1060. data/app/views/ui/sheet/_header.html.erb +14 -0
  1061. data/app/views/ui/sheet/_overlay.html.erb +19 -0
  1062. data/app/views/ui/sheet/_title.html.erb +14 -0
  1063. data/app/views/ui/sheet/_trigger.html.erb +21 -0
  1064. data/app/views/ui/slider/_range.html.erb +13 -0
  1065. data/app/views/ui/slider/_thumb.html.erb +14 -0
  1066. data/app/views/ui/slider/_track.html.erb +16 -0
  1067. data/app/views/ui/sonner/_toaster.html.erb +38 -0
  1068. data/app/views/ui/table/_body.html.erb +18 -0
  1069. data/app/views/ui/table/_caption.html.erb +18 -0
  1070. data/app/views/ui/table/_cell.html.erb +18 -0
  1071. data/app/views/ui/table/_footer.html.erb +18 -0
  1072. data/app/views/ui/table/_head.html.erb +18 -0
  1073. data/app/views/ui/table/_header.html.erb +18 -0
  1074. data/app/views/ui/table/_row.html.erb +18 -0
  1075. data/app/views/ui/tabs/_content.html.erb +19 -0
  1076. data/app/views/ui/tabs/_list.html.erb +16 -0
  1077. data/app/views/ui/tabs/_trigger.html.erb +20 -0
  1078. data/app/views/ui/toggle_group/_item.html.erb +51 -0
  1079. data/app/views/ui/tooltip/_content.html.erb +17 -0
  1080. data/app/views/ui/tooltip/_trigger.html.erb +39 -0
  1081. data/config/importmap.rb +6 -0
  1082. data/config/routes.rb +3 -0
  1083. data/lib/fernandes-ui.rb +12 -0
  1084. data/lib/generators/ui/install/install_generator.rb +141 -0
  1085. data/lib/generators/ui/install/templates/Procfile.dev +2 -0
  1086. data/lib/generators/ui/install/templates/application.tailwind.css +32 -0
  1087. data/lib/generators/ui/install/templates/package.json +13 -0
  1088. data/lib/tasks/ui_tasks.rake +4 -0
  1089. data/lib/ui/configuration.rb +54 -0
  1090. data/lib/ui/engine.rb +158 -0
  1091. data/lib/ui/version.rb +3 -0
  1092. data/lib/ui.rb +8 -0
  1093. metadata +1214 -0
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ # PopoverContentBehavior
4
+ #
5
+ # Shared behavior for PopoverContent component across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent styling and HTML attribute generation.
7
+ module UI::PopoverContentBehavior
8
+ # Returns HTML attributes for the popover content element
9
+ def popover_content_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ class: popover_content_classes,
13
+ data: popover_content_data_attributes
14
+ }.merge(attributes_value)
15
+ end
16
+
17
+ # Returns combined CSS classes for the popover content
18
+ def popover_content_classes
19
+ classes_value = respond_to?(:classes, true) ? classes : @classes
20
+ TailwindMerge::Merger.new.merge([
21
+ popover_content_base_classes,
22
+ classes_value
23
+
24
+ ].compact.join(" "))
25
+ end
26
+
27
+ # Returns data attributes for the popover content
28
+ def popover_content_data_attributes
29
+ {
30
+ ui__popover_target: "content",
31
+ state: "closed",
32
+ }
33
+ end
34
+
35
+ private
36
+
37
+ # Base classes from shadcn/ui - exact match
38
+ # Note: Positioning classes like origin-(--ui-popover-content-transform-origin)
39
+ # will be handled by our Stimulus controller for positioning
40
+ def popover_content_base_classes
41
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:invisible data-[state=open]:visible data-[state=open]:pointer-events-auto data-[state=closed]:pointer-events-none absolute top-0 left-0 z-50 w-72 rounded-md border p-4 shadow-md outline-hidden"
42
+ end
43
+
44
+ # Calculate placement value from side and align
45
+ def placement_value
46
+ if @align == "center"
47
+ @side
48
+ else
49
+ "#{@side}-#{@align}"
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # PopoverTriggerBehavior
4
+ #
5
+ # Shared behavior for PopoverTrigger component across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent styling and HTML attribute generation.
7
+ module UI::PopoverTriggerBehavior
8
+ # Returns HTML attributes for the popover trigger element
9
+ def popover_trigger_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ class: popover_trigger_classes,
13
+ data: { ui__popover_target: "trigger" }
14
+ }.merge(attributes_value)
15
+ end
16
+
17
+ # Returns combined CSS classes for the popover trigger
18
+ def popover_trigger_classes
19
+ classes_value = respond_to?(:classes, true) ? classes : @classes
20
+ TailwindMerge::Merger.new.merge([
21
+ popover_trigger_base_classes,
22
+ classes_value
23
+
24
+ ].compact.join(" "))
25
+ end
26
+
27
+ private
28
+
29
+ # Base classes applied to all popover triggers - inline flex for proper alignment
30
+ def popover_trigger_base_classes
31
+ "inline-flex"
32
+ end
33
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::ScrollAreaBehavior
4
+ #
5
+ # Shared behavior for ScrollArea root across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::ScrollAreaBehavior
8
+ # Returns HTML attributes for the scroll area root element
9
+ def scroll_area_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ class: scroll_area_classes,
13
+ dir: "ltr",
14
+ style: "position: relative; --ui-scroll-area-corner-width: 0px; --ui-scroll-area-corner-height: 0px;",
15
+ data: {
16
+ slot: "scroll-area"
17
+ }
18
+ }.merge(attributes_value || {})
19
+ end
20
+
21
+ # Returns combined CSS classes
22
+ def scroll_area_classes
23
+ classes_value = respond_to?(:classes, true) ? classes : @classes
24
+ TailwindMerge::Merger.new.merge([
25
+ scroll_area_base_classes,
26
+ classes_value
27
+ ].compact.join(" "))
28
+ end
29
+
30
+ private
31
+
32
+ # Base classes for scroll area root
33
+ def scroll_area_base_classes
34
+ "relative"
35
+ end
36
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::ScrollAreaCornerBehavior
4
+ #
5
+ # Shared behavior for ScrollArea corner across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::ScrollAreaCornerBehavior
8
+ # Returns HTML attributes for the corner element
9
+ def scroll_area_corner_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ class: scroll_area_corner_classes,
13
+ data: {
14
+ slot: "scroll-area-corner"
15
+ }
16
+ }.merge(attributes_value || {})
17
+ end
18
+
19
+ # Returns combined CSS classes
20
+ def scroll_area_corner_classes
21
+ classes_value = respond_to?(:classes, true) ? classes : @classes
22
+ TailwindMerge::Merger.new.merge([
23
+ scroll_area_corner_base_classes,
24
+ classes_value
25
+ ].compact.join(" "))
26
+ end
27
+
28
+ private
29
+
30
+ # Base classes for corner
31
+ def scroll_area_corner_base_classes
32
+ "absolute right-0 bottom-0"
33
+ end
34
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::ScrollAreaScrollbarBehavior
4
+ #
5
+ # Shared behavior for ScrollArea scrollbar across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::ScrollAreaScrollbarBehavior
8
+ # Returns HTML attributes for the scrollbar element
9
+ def scroll_area_scrollbar_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ orientation_value = respond_to?(:orientation, true) ? orientation : @orientation
12
+
13
+ {
14
+ class: scroll_area_scrollbar_classes,
15
+ data: {
16
+ slot: "scroll-area-scrollbar",
17
+ orientation: orientation_value
18
+ }
19
+ }.merge(attributes_value || {})
20
+ end
21
+
22
+ # Returns combined CSS classes
23
+ def scroll_area_scrollbar_classes
24
+ classes_value = respond_to?(:classes, true) ? classes : @classes
25
+ orientation_value = respond_to?(:orientation, true) ? orientation : @orientation
26
+
27
+ TailwindMerge::Merger.new.merge([
28
+ scroll_area_scrollbar_base_classes,
29
+ scroll_area_scrollbar_orientation_classes(orientation_value),
30
+ classes_value
31
+ ].compact.join(" "))
32
+ end
33
+
34
+ private
35
+
36
+ # Base classes for scrollbar
37
+ def scroll_area_scrollbar_base_classes
38
+ "absolute flex touch-none p-px transition-colors select-none overflow-hidden rounded-sm"
39
+ end
40
+
41
+ # Orientation-specific classes
42
+ def scroll_area_scrollbar_orientation_classes(orientation)
43
+ case orientation
44
+ when "horizontal"
45
+ "bottom-0 left-0 right-0 h-2.5 flex-col border-t border-t-transparent"
46
+ else # vertical (default)
47
+ "right-0.5 top-0.5 bottom-0.5 w-2.5 border-l border-l-transparent"
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::ScrollAreaThumbBehavior
4
+ #
5
+ # Shared behavior for ScrollArea thumb across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::ScrollAreaThumbBehavior
8
+ # Returns HTML attributes for the thumb element
9
+ def scroll_area_thumb_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ class: scroll_area_thumb_classes,
13
+ data: {
14
+ slot: "scroll-area-thumb"
15
+ }
16
+ }.merge(attributes_value || {})
17
+ end
18
+
19
+ # Returns combined CSS classes
20
+ def scroll_area_thumb_classes
21
+ classes_value = respond_to?(:classes, true) ? classes : @classes
22
+ TailwindMerge::Merger.new.merge([
23
+ scroll_area_thumb_base_classes,
24
+ classes_value
25
+ ].compact.join(" "))
26
+ end
27
+
28
+ private
29
+
30
+ # Base classes for thumb
31
+ def scroll_area_thumb_base_classes
32
+ "bg-border relative flex-1 rounded-full"
33
+ end
34
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::ScrollAreaViewportBehavior
4
+ #
5
+ # Shared behavior for ScrollArea viewport across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::ScrollAreaViewportBehavior
8
+ # Returns HTML attributes for the viewport element
9
+ def scroll_area_viewport_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ class: scroll_area_viewport_classes,
13
+ tabindex: 0,
14
+ data: {
15
+ slot: "scroll-area-viewport",
16
+ ui_scroll_area_viewport: true
17
+ }
18
+ }.merge(attributes_value || {})
19
+ end
20
+
21
+ # Returns combined CSS classes
22
+ def scroll_area_viewport_classes
23
+ classes_value = respond_to?(:classes, true) ? classes : @classes
24
+ TailwindMerge::Merger.new.merge([
25
+ scroll_area_viewport_base_classes,
26
+ classes_value
27
+ ].compact.join(" "))
28
+ end
29
+
30
+ private
31
+
32
+ # Base classes for viewport
33
+ def scroll_area_viewport_base_classes
34
+ "size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1 focus-visible:ring-ring/50"
35
+ end
36
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::SelectBehavior
4
+ #
5
+ # Shared behavior for Select component across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent size styling and HTML attribute generation.
7
+ module UI::SelectBehavior
8
+ # Returns HTML attributes for the select element
9
+ def select_html_attributes
10
+ data_attrs = {
11
+ controller: "ui--select",
12
+ ui__select_open_value: "false"
13
+ }
14
+
15
+ # Add value if provided
16
+ if @value.present?
17
+ data_attrs[:ui__select_value_value] = @value.to_s
18
+ end
19
+
20
+ attrs = {
21
+ class: select_classes,
22
+ data: data_attrs
23
+ }
24
+
25
+ # Add data-placeholder attribute if there's a placeholder and no selected value
26
+ if @placeholder.present? && @selected.nil?
27
+ attrs[:"data-placeholder"] = "true"
28
+ end
29
+
30
+ attrs.compact
31
+ end
32
+
33
+ # Returns combined CSS classes for the select
34
+ def select_classes
35
+ classes_value = respond_to?(:classes, true) ? classes : @classes
36
+ TailwindMerge::Merger.new.merge([
37
+ select_base_classes,
38
+ select_size_classes,
39
+ classes_value
40
+ ].compact.join(" "))
41
+ end
42
+
43
+ private
44
+
45
+ # Base classes applied to all selects
46
+ # The select container is just a wrapper for Stimulus controller
47
+ # All visual styling is on the trigger button
48
+ # h-fit prevents wrapper from expanding to include absolutely positioned content
49
+ def select_base_classes
50
+ "relative h-fit"
51
+ end
52
+
53
+ # Size-specific classes based on @size
54
+ # No size classes needed on container, they go on trigger
55
+ def select_size_classes
56
+ ""
57
+ end
58
+
59
+ # Renders options for the select element
60
+ # Handles both array format [label, value] and hash format { label: x, value: y }
61
+ def render_options
62
+ return "" if @options.nil?
63
+
64
+ @options.map do |option|
65
+ label, value = extract_option_values(option)
66
+ selected = @selected.to_s == value.to_s ? "selected" : nil
67
+
68
+ { label: label, value: value, selected: selected }
69
+ end
70
+ end
71
+
72
+ # Extracts label and value from different option formats
73
+ def extract_option_values(option)
74
+ if option.is_a?(Array)
75
+ [option[0], option[1]]
76
+ elsif option.is_a?(Hash)
77
+ label = option[:label] || option["label"]
78
+ value = option[:value] || option["value"]
79
+ [label, value]
80
+ else
81
+ [option, option]
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::SelectContentBehavior
4
+ #
5
+ # Shared behavior for Select dropdown content across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::SelectContentBehavior
8
+ # Returns HTML attributes for the select content element
9
+ def select_content_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ class: select_content_classes,
13
+ data: {
14
+ ui__select_target: "content",
15
+ state: "closed",
16
+ slot: "select-content"
17
+ },
18
+ role: "listbox",
19
+ # CSS variables for positioning (set by JavaScript)
20
+ style: "box-sizing: border-box; display: flex; flex-direction: column; outline: none;"
21
+ }.merge(attributes_value || {})
22
+ end
23
+
24
+ # Returns combined CSS classes
25
+ def select_content_classes
26
+ classes_value = respond_to?(:classes, true) ? classes : @classes
27
+ TailwindMerge::Merger.new.merge([
28
+ select_content_base_classes,
29
+ classes_value
30
+ ].compact.join(" "))
31
+ end
32
+
33
+ private
34
+
35
+ # Base classes for select content dropdown
36
+ # FIXED: overflow-x-hidden overflow-y-auto instead of overflow-hidden
37
+ # FIXED: removed data-[state=closed]:hidden, use invisible pattern
38
+ # ADDED: max-h, origin, and translate classes for proper positioning
39
+ def select_content_base_classes
40
+ "absolute z-50 flex min-w-[8rem] flex-col overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1 data-[state=closed]:invisible data-[state=open]:visible"
41
+ end
42
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::SelectGroupBehavior
4
+ #
5
+ # Shared behavior for Select options group across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::SelectGroupBehavior
8
+ # Returns HTML attributes for the select group element
9
+ def select_group_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ class: select_group_classes,
13
+ role: "group",
14
+ data: {
15
+ slot: "select-group" # ADDED: data-slot attribute
16
+ }
17
+ }.merge(attributes_value || {})
18
+ end
19
+
20
+ # Returns combined CSS classes
21
+ def select_group_classes
22
+ classes_value = respond_to?(:classes, true) ? classes : @classes
23
+ TailwindMerge::Merger.new.merge([
24
+ select_group_base_classes,
25
+ classes_value
26
+ ].compact.join(" "))
27
+ end
28
+
29
+ private
30
+
31
+ # Base classes for select group
32
+ def select_group_base_classes
33
+ "w-full"
34
+ end
35
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::SelectItemBehavior
4
+ #
5
+ # Shared behavior for Individual select option across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::SelectItemBehavior
8
+ # Returns HTML attributes for the select item element
9
+ def select_item_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ attrs = {
12
+ class: select_item_classes,
13
+ role: "option",
14
+ "aria-selected": "false",
15
+ data: {
16
+ ui__select_target: "item",
17
+ action: "click->ui--select#selectItem mouseenter->ui--select#handleItemMouseEnter mouseleave->ui--select#handleItemMouseLeave",
18
+ value: @value,
19
+ slot: "select-item" # ADDED: data-slot attribute
20
+ }
21
+ }
22
+
23
+ # Add disabled state if specified
24
+ if @disabled
25
+ attrs[:data][:disabled] = "true"
26
+ attrs[:"aria-disabled"] = "true"
27
+ attrs[:data][:state] = "disabled"
28
+ end
29
+
30
+ attrs.merge(attributes_value || {})
31
+ end
32
+
33
+ # Returns combined CSS classes
34
+ def select_item_classes
35
+ classes_value = respond_to?(:classes, true) ? classes : @classes
36
+ TailwindMerge::Merger.new.merge([
37
+ select_item_base_classes,
38
+ classes_value
39
+ ].compact.join(" "))
40
+ end
41
+
42
+ private
43
+
44
+ # Base classes for select item
45
+ def select_item_base_classes
46
+ "relative flex w-full cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50"
47
+ end
48
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::SelectLabelBehavior
4
+ #
5
+ # Shared behavior for Select group label across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::SelectLabelBehavior
8
+ # Returns HTML attributes for the select label element
9
+ def select_label_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ class: select_label_classes,
13
+ data: {
14
+ slot: "select-label" # ADDED: data-slot attribute
15
+ }
16
+ }.merge(attributes_value || {})
17
+ end
18
+
19
+ # Returns combined CSS classes
20
+ def select_label_classes
21
+ classes_value = respond_to?(:classes, true) ? classes : @classes
22
+ TailwindMerge::Merger.new.merge([
23
+ select_label_base_classes,
24
+ classes_value
25
+ ].compact.join(" "))
26
+ end
27
+
28
+ private
29
+
30
+ # Base classes for select label
31
+ def select_label_base_classes
32
+ "px-2 py-1.5 text-xs text-muted-foreground"
33
+ end
34
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::SelectScrollDownButtonBehavior
4
+ #
5
+ # Shared behavior for Select scroll down button across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::SelectScrollDownButtonBehavior
8
+ # Returns HTML attributes for the select scroll down button element
9
+ def select_scroll_down_button_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ class: select_scroll_down_button_classes,
13
+ "aria-hidden": "true",
14
+ # FIXED: Removed display: flex - visibility controlled by JavaScript/aria-hidden
15
+ # ADDED: flex-shrink: 0 as per shadcn implementation
16
+ style: "flex-shrink: 0;",
17
+ data: select_scroll_down_button_data_attributes
18
+ }.merge(attributes_value || {})
19
+ end
20
+
21
+ # Returns data attributes for Stimulus
22
+ def select_scroll_down_button_data_attributes
23
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
24
+ base_data = {
25
+ ui__select_target: "scrollDownButton",
26
+ action: "mouseenter->ui--select#scrollDown mouseleave->ui--select#stopScroll",
27
+ slot: "select-scroll-down-button" # ADDED: data-slot attribute
28
+ }
29
+
30
+ (attributes_value&.fetch(:data, {}) || {}).merge(base_data)
31
+ end
32
+
33
+ # Returns combined CSS classes
34
+ def select_scroll_down_button_classes
35
+ classes_value = respond_to?(:classes, true) ? classes : @classes
36
+ TailwindMerge::Merger.new.merge([
37
+ select_scroll_down_button_base_classes,
38
+ classes_value
39
+ ].compact.join(" "))
40
+ end
41
+
42
+ private
43
+
44
+ # Base classes for select scroll down button
45
+ # FIXED: Removed absolute positioning (absolute bottom-0 left-0 right-0 z-10)
46
+ # FIXED: Removed hover:bg-accent bg-popover (not in shadcn)
47
+ # Now matches shadcn structure: simple flex layout
48
+ def select_scroll_down_button_base_classes
49
+ "flex cursor-default items-center justify-center py-1"
50
+ end
51
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::SelectScrollUpButtonBehavior
4
+ #
5
+ # Shared behavior for Select scroll up button across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::SelectScrollUpButtonBehavior
8
+ # Returns HTML attributes for the select scroll up button element
9
+ def select_scroll_up_button_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ class: select_scroll_up_button_classes,
13
+ "aria-hidden": "true",
14
+ # FIXED: Removed display: none - visibility controlled by JavaScript/aria-hidden
15
+ # ADDED: flex-shrink: 0 as per shadcn implementation
16
+ style: "flex-shrink: 0;",
17
+ data: select_scroll_up_button_data_attributes
18
+ }.merge(attributes_value || {})
19
+ end
20
+
21
+ # Returns data attributes for Stimulus
22
+ def select_scroll_up_button_data_attributes
23
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
24
+ base_data = {
25
+ ui__select_target: "scrollUpButton",
26
+ action: "mouseenter->ui--select#scrollUp mouseleave->ui--select#stopScroll",
27
+ slot: "select-scroll-up-button" # ADDED: data-slot attribute
28
+ }
29
+
30
+ (attributes_value&.fetch(:data, {}) || {}).merge(base_data)
31
+ end
32
+
33
+ # Returns combined CSS classes
34
+ def select_scroll_up_button_classes
35
+ classes_value = respond_to?(:classes, true) ? classes : @classes
36
+ TailwindMerge::Merger.new.merge([
37
+ select_scroll_up_button_base_classes,
38
+ classes_value
39
+ ].compact.join(" "))
40
+ end
41
+
42
+ private
43
+
44
+ # Base classes for select scroll up button
45
+ # FIXED: Removed absolute positioning (absolute top-0 left-0 right-0 z-10)
46
+ # FIXED: Removed hover:bg-accent bg-popover (not in shadcn)
47
+ # Now matches shadcn structure: simple flex layout
48
+ def select_scroll_up_button_base_classes
49
+ "flex cursor-default items-center justify-center py-1"
50
+ end
51
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ # UI::SelectTriggerBehavior
4
+ #
5
+ # Shared behavior for Select trigger button across ERB, ViewComponent, and Phlex implementations.
6
+ # This module provides consistent HTML attribute generation and styling.
7
+ module UI::SelectTriggerBehavior
8
+ # Returns HTML attributes for the select trigger element
9
+ def select_trigger_html_attributes
10
+ attributes_value = respond_to?(:attributes, true) ? attributes : @attributes
11
+ {
12
+ type: "button",
13
+ role: "combobox",
14
+ "aria-expanded": "false",
15
+ "aria-haspopup": "listbox",
16
+ class: select_trigger_classes,
17
+ data: {
18
+ ui__select_target: "trigger",
19
+ action: "click->ui--select#toggle",
20
+ slot: "select-trigger"
21
+ }
22
+ }.merge(attributes_value || {})
23
+ end
24
+
25
+ # Returns combined CSS classes
26
+ def select_trigger_classes
27
+ classes_value = respond_to?(:classes, true) ? classes : @classes
28
+ TailwindMerge::Merger.new.merge([
29
+ select_trigger_base_classes,
30
+ classes_value
31
+ ].compact.join(" "))
32
+ end
33
+
34
+ private
35
+
36
+ # Base classes for select trigger
37
+ def select_trigger_base_classes
38
+ "inline-flex h-9 w-full items-center justify-between gap-2 whitespace-nowrap rounded-lg border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background transition-[color,box-shadow] outline-none focus:ring-1 focus:ring-ring focus-visible:ring-[3px] focus-visible:border-ring focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1 appearance-none bg-[url('data:image/svg+xml;charset=UTF-8,%3csvg%20xmlns%3d%22http%3a%2f%2fwww.w3.org%2f2000%2fsvg%22%20width%3d%2224%22%20height%3d%2224%22%20viewBox%3d%220%200%2024%2024%22%20fill%3d%22none%22%20stroke%3d%22currentColor%22%20stroke-width%3d%222%22%20stroke-linecap%3d%22round%22%20stroke-linejoin%3d%22round%22%3e%3cpath%20d%3d%22m6%209%206%206%206-6%22%2f%3e%3c%2fsvg%3e')] bg-[length:1rem] bg-[right_0.75rem_center] bg-no-repeat pr-10 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 data-[placeholder]:text-muted-foreground aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:border-input dark:hover:bg-input/50"
39
+ end
40
+ end