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,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for Accordion Item component
6
+ # Handles classes, states, and data attributes
7
+ module UI::AccordionItemBehavior
8
+ # Base CSS classes for accordion item
9
+ def item_base_classes
10
+ "border-b border-border last:border-b-0"
11
+ end
12
+
13
+ # Merge base classes with custom classes using TailwindMerge
14
+ def item_classes
15
+ TailwindMerge::Merger.new.merge([item_base_classes, @classes].compact.join(" "))
16
+ end
17
+
18
+ # Data attributes for Stimulus target
19
+ def item_data_attributes
20
+ {
21
+ ui__accordion_target: "item",
22
+ value: @value || ""
23
+ }
24
+ end
25
+
26
+ # Merge user-provided data attributes
27
+ def merged_item_data_attributes
28
+ user_data = @attributes&.fetch(:data, {}) || {}
29
+ user_data.merge(item_data_attributes)
30
+ end
31
+
32
+ # Determine initial state
33
+ def item_state
34
+ @initial_open ? "open" : "closed"
35
+ end
36
+
37
+ # Build complete HTML attributes hash for accordion item
38
+ def item_html_attributes
39
+ base_attrs = @attributes&.except(:data) || {}
40
+ base_attrs.merge(
41
+ class: item_classes,
42
+ "data-state": item_state,
43
+ "data-orientation": @orientation || "vertical",
44
+ data: merged_item_data_attributes
45
+ )
46
+ end
47
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for Accordion Trigger (button) component
6
+ # Handles classes, ARIA attributes, and unique IDs
7
+ module UI::AccordionTriggerBehavior
8
+ # Base CSS classes for trigger button
9
+ def trigger_base_classes
10
+ "flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 hover:underline [&[data-state=open]>svg]:rotate-180"
11
+ end
12
+
13
+ # Merge base classes with custom classes using TailwindMerge
14
+ def trigger_classes
15
+ TailwindMerge::Merger.new.merge([trigger_base_classes, @classes].compact.join(" "))
16
+ end
17
+
18
+ # Generate unique IDs for ARIA relationships
19
+ def trigger_id
20
+ @trigger_id ||= "accordion-trigger-#{item_value}"
21
+ end
22
+
23
+ def content_id
24
+ @content_id ||= "accordion-content-#{item_value}"
25
+ end
26
+
27
+ # Get item value from context (set by parent AccordionItem)
28
+ def item_value
29
+ @item_value || SecureRandom.hex(4)
30
+ end
31
+
32
+ # Determine initial state from context
33
+ def trigger_state
34
+ @initial_open ? "open" : "closed"
35
+ end
36
+
37
+ # Determine aria-expanded value
38
+ def aria_expanded
39
+ @initial_open ? "true" : "false"
40
+ end
41
+
42
+ # Data attributes for Stimulus
43
+ def trigger_data_attributes
44
+ {
45
+ ui__accordion_target: "trigger",
46
+ action: "click->ui--accordion#toggle"
47
+ }
48
+ end
49
+
50
+ # Merge user-provided data attributes
51
+ def merged_trigger_data_attributes
52
+ user_data = @attributes&.fetch(:data, {}) || {}
53
+ user_data.merge(trigger_data_attributes)
54
+ end
55
+
56
+ # Build complete HTML attributes hash for trigger button
57
+ def trigger_html_attributes
58
+ base_attrs = @attributes&.except(:data) || {}
59
+ base_attrs.merge(
60
+ class: trigger_classes,
61
+ type: "button",
62
+ id: trigger_id,
63
+ "aria-expanded": aria_expanded,
64
+ "aria-controls": content_id,
65
+ "data-state": trigger_state,
66
+ "data-orientation": @orientation || "vertical",
67
+ data: merged_trigger_data_attributes
68
+ )
69
+ end
70
+
71
+ # SVG caret icon (rotation handled by Tailwind's [&[data-state=open]>svg] variant)
72
+ def caret_svg
73
+ <<~SVG.html_safe
74
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-[var(--duration-accordion)]">
75
+ <polyline points="6 9 12 15 18 9"></polyline>
76
+ </svg>
77
+ SVG
78
+ end
79
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for Alert component
6
+ # Handles alert container styling with variants
7
+ module UI::AlertBehavior
8
+ # Base CSS classes for alert container
9
+ # Uses grid layout that adapts when SVG icons are present
10
+ def alert_base_classes
11
+ "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current"
12
+ end
13
+
14
+ # Variant-specific classes
15
+ def alert_variant_classes
16
+ case @variant
17
+ when :destructive
18
+ "border-destructive text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90"
19
+ else # :default
20
+ "bg-card text-card-foreground"
21
+ end
22
+ end
23
+
24
+ # Merge base classes with variant and custom classes
25
+ def alert_classes
26
+ TailwindMerge::Merger.new.merge([alert_base_classes, alert_variant_classes, @classes].compact.join(" "))
27
+ end
28
+
29
+ # Build complete HTML attributes hash for alert container
30
+ def alert_html_attributes
31
+ base_attrs = @attributes || {}
32
+ base_attrs.merge(
33
+ class: alert_classes,
34
+ role: "alert",
35
+ "data-slot": "alert"
36
+ )
37
+ end
38
+
39
+ # Renders the alert HTML (for ERB partials)
40
+ def render_alert(&content_block)
41
+ all_attributes = alert_html_attributes.deep_merge(@attributes || {})
42
+ content_tag(:div, **all_attributes, &content_block)
43
+ end
44
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for Alert Description component
6
+ # Handles description text styling
7
+ module UI::AlertDescriptionBehavior
8
+ # Base CSS classes for alert description
9
+ def alert_description_base_classes
10
+ "text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed"
11
+ end
12
+
13
+ # Merge base classes with custom classes
14
+ def alert_description_classes
15
+ TailwindMerge::Merger.new.merge([alert_description_base_classes, @classes].compact.join(" "))
16
+ end
17
+
18
+ # Build complete HTML attributes hash for alert description
19
+ def alert_description_html_attributes
20
+ base_attrs = @attributes || {}
21
+ base_attrs.merge(
22
+ class: alert_description_classes,
23
+ "data-slot": "alert-description"
24
+ )
25
+ end
26
+
27
+ # Renders the alert description HTML (for ERB partials)
28
+ def render_alert_description(&content_block)
29
+ all_attributes = alert_description_html_attributes.deep_merge(@attributes || {})
30
+ content_tag(:div, **all_attributes, &content_block)
31
+ end
32
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for AlertDialog Action component
6
+ # This wraps the Button component with alert dialog close action
7
+ module UI::AlertDialogActionBehavior
8
+ # Data attributes for Stimulus action
9
+ def alert_dialog_action_data_attributes
10
+ {
11
+ action: "click->ui--alert-dialog#close"
12
+ }
13
+ end
14
+
15
+ # Merge user-provided data attributes
16
+ def merged_alert_dialog_action_data_attributes
17
+ user_data = @attributes&.fetch(:data, {}) || {}
18
+ user_data.merge(alert_dialog_action_data_attributes)
19
+ end
20
+
21
+ # Build data attributes hash to pass to Button component
22
+ def alert_dialog_action_button_data_attributes
23
+ {
24
+ data: merged_alert_dialog_action_data_attributes
25
+ }
26
+ end
27
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for AlertDialog component
6
+ # Handles classes and data attributes
7
+ module UI::AlertDialogBehavior
8
+ # Base CSS classes for alert dialog container
9
+ def alert_dialog_base_classes
10
+ ""
11
+ end
12
+
13
+ # Merge base classes with custom classes using TailwindMerge
14
+ def alert_dialog_classes
15
+ TailwindMerge::Merger.new.merge([alert_dialog_base_classes, @classes].compact.join(" "))
16
+ end
17
+
18
+ # Data attributes for Stimulus controller
19
+ def alert_dialog_data_attributes
20
+ {
21
+ controller: "ui--alert-dialog",
22
+ ui__alert_dialog_open_value: @open,
23
+ ui__alert_dialog_close_on_escape_value: @close_on_escape
24
+ }
25
+ end
26
+
27
+ # Merge user-provided data attributes
28
+ def merged_alert_dialog_data_attributes
29
+ user_data = @attributes&.fetch(:data, {}) || {}
30
+ user_data.merge(alert_dialog_data_attributes)
31
+ end
32
+
33
+ # Build complete HTML attributes hash for alert dialog container
34
+ def alert_dialog_html_attributes
35
+ base_attrs = @attributes&.except(:data) || {}
36
+ base_attrs.merge(
37
+ class: alert_dialog_classes,
38
+ data: merged_alert_dialog_data_attributes
39
+ )
40
+ end
41
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for AlertDialog Cancel component
6
+ # This wraps the Button component with alert dialog close action
7
+ module UI::AlertDialogCancelBehavior
8
+ # Data attributes for Stimulus action
9
+ def alert_dialog_cancel_data_attributes
10
+ {
11
+ action: "click->ui--alert-dialog#close"
12
+ }
13
+ end
14
+
15
+ # Merge user-provided data attributes
16
+ def merged_alert_dialog_cancel_data_attributes
17
+ user_data = @attributes&.fetch(:data, {}) || {}
18
+ user_data.merge(alert_dialog_cancel_data_attributes)
19
+ end
20
+
21
+ # Build data attributes hash to pass to Button component
22
+ def alert_dialog_cancel_button_data_attributes
23
+ {
24
+ data: merged_alert_dialog_cancel_data_attributes
25
+ }
26
+ end
27
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for AlertDialog Content component
6
+ # Handles content area styling, ARIA attributes, and animations
7
+ module UI::AlertDialogContentBehavior
8
+ # Base CSS classes for alert dialog content
9
+ # Use opacity-0/scale-95 and pointer-events-none when closed for smooth animations
10
+ def alert_dialog_content_base_classes
11
+ "bg-background 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-[state=closed]:opacity-0 data-[state=open]:opacity-100 data-[state=open]:pointer-events-auto data-[state=closed]:pointer-events-none fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg"
12
+ end
13
+
14
+ # Merge base classes with custom classes using TailwindMerge
15
+ def alert_dialog_content_classes
16
+ TailwindMerge::Merger.new.merge([alert_dialog_content_base_classes, @classes].compact.join(" "))
17
+ end
18
+
19
+ # Data attributes for Stimulus target
20
+ def alert_dialog_content_data_attributes
21
+ {
22
+ ui__alert_dialog_target: "content"
23
+ }
24
+ end
25
+
26
+ # Merge user-provided data attributes
27
+ def merged_alert_dialog_content_data_attributes
28
+ user_data = @attributes&.fetch(:data, {}) || {}
29
+ user_data.merge(alert_dialog_content_data_attributes)
30
+ end
31
+
32
+ # Build complete HTML attributes hash for alert dialog content
33
+ def alert_dialog_content_html_attributes
34
+ base_attrs = @attributes&.except(:data) || {}
35
+ base_attrs.merge(
36
+ class: alert_dialog_content_classes,
37
+ role: "alertdialog",
38
+ "aria-modal": "true",
39
+ data: merged_alert_dialog_content_data_attributes
40
+ )
41
+ end
42
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for AlertDialog Description component
6
+ # Handles description text styling
7
+ module UI::AlertDialogDescriptionBehavior
8
+ # Base CSS classes for alert dialog description
9
+ def alert_dialog_description_base_classes
10
+ "text-muted-foreground text-sm"
11
+ end
12
+
13
+ # Merge base classes with custom classes using TailwindMerge
14
+ def alert_dialog_description_classes
15
+ TailwindMerge::Merger.new.merge([alert_dialog_description_base_classes, @classes].compact.join(" "))
16
+ end
17
+
18
+ # Build complete HTML attributes hash for alert dialog description
19
+ def alert_dialog_description_html_attributes
20
+ base_attrs = @attributes || {}
21
+ base_attrs.merge(
22
+ class: alert_dialog_description_classes
23
+ )
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for AlertDialog Footer component
6
+ # Handles footer section styling with action buttons
7
+ module UI::AlertDialogFooterBehavior
8
+ # Base CSS classes for alert dialog footer
9
+ # Note: flex-col-reverse on mobile so cancel appears below action, then row on desktop with buttons at end
10
+ def alert_dialog_footer_base_classes
11
+ "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end"
12
+ end
13
+
14
+ # Merge base classes with custom classes using TailwindMerge
15
+ def alert_dialog_footer_classes
16
+ TailwindMerge::Merger.new.merge([alert_dialog_footer_base_classes, @classes].compact.join(" "))
17
+ end
18
+
19
+ # Build complete HTML attributes hash for alert dialog footer
20
+ def alert_dialog_footer_html_attributes
21
+ base_attrs = @attributes || {}
22
+ base_attrs.merge(
23
+ class: alert_dialog_footer_classes
24
+ )
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for AlertDialog Header component
6
+ # Handles header section styling
7
+ module UI::AlertDialogHeaderBehavior
8
+ # Base CSS classes for alert dialog header
9
+ def alert_dialog_header_base_classes
10
+ "flex flex-col gap-2 text-center sm:text-left"
11
+ end
12
+
13
+ # Merge base classes with custom classes using TailwindMerge
14
+ def alert_dialog_header_classes
15
+ TailwindMerge::Merger.new.merge([alert_dialog_header_base_classes, @classes].compact.join(" "))
16
+ end
17
+
18
+ # Build complete HTML attributes hash for alert dialog header
19
+ def alert_dialog_header_html_attributes
20
+ base_attrs = @attributes || {}
21
+ base_attrs.merge(
22
+ class: alert_dialog_header_classes
23
+ )
24
+ end
25
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for AlertDialog Overlay component
6
+ # Handles backdrop/overlay styling and attributes
7
+ module UI::AlertDialogOverlayBehavior
8
+ # Base CSS classes for overlay backdrop
9
+ # Use opacity-0 and pointer-events-none when closed for smooth animations
10
+ def alert_dialog_overlay_base_classes
11
+ "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]:opacity-0 data-[state=open]:opacity-100 data-[state=open]:pointer-events-auto data-[state=closed]:pointer-events-none fixed inset-0 z-50 bg-black/50"
12
+ end
13
+
14
+ # Merge base classes with custom classes using TailwindMerge
15
+ def alert_dialog_overlay_classes
16
+ TailwindMerge::Merger.new.merge([alert_dialog_overlay_base_classes].compact.join(" "))
17
+ end
18
+
19
+ # Container wrapper classes
20
+ # Use invisible (visibility: hidden) when closed, visible when open
21
+ def alert_dialog_overlay_container_base_classes
22
+ "data-[state=closed]:invisible data-[state=open]:visible fixed inset-0 z-50"
23
+ end
24
+
25
+ # Merge container base classes with custom classes
26
+ def alert_dialog_overlay_container_classes
27
+ TailwindMerge::Merger.new.merge([alert_dialog_overlay_container_base_classes, @classes].compact.join(" "))
28
+ end
29
+
30
+ # Data attributes for container
31
+ def alert_dialog_overlay_container_data_attributes
32
+ {
33
+ ui__alert_dialog_target: "container"
34
+ }
35
+ end
36
+
37
+ # Data attributes for overlay backdrop
38
+ def alert_dialog_overlay_data_attributes
39
+ {
40
+ ui__alert_dialog_target: "overlay",
41
+ action: "click->ui--alert-dialog#preventOverlayClose"
42
+ }
43
+ end
44
+
45
+ # Merge user-provided data attributes for container
46
+ def merged_alert_dialog_overlay_container_data_attributes
47
+ user_data = @attributes&.fetch(:data, {}) || {}
48
+ user_data.merge(alert_dialog_overlay_container_data_attributes)
49
+ end
50
+
51
+ # Build complete HTML attributes hash for container wrapper
52
+ def alert_dialog_overlay_container_html_attributes
53
+ base_attrs = @attributes&.except(:data) || {}
54
+ base_attrs.merge(
55
+ class: alert_dialog_overlay_container_classes,
56
+ "data-state": @open ? "open" : "closed",
57
+ data: merged_alert_dialog_overlay_container_data_attributes
58
+ )
59
+ end
60
+
61
+ # Build complete HTML attributes hash for overlay backdrop
62
+ def alert_dialog_overlay_html_attributes
63
+ {
64
+ class: alert_dialog_overlay_classes,
65
+ data: alert_dialog_overlay_data_attributes
66
+ }
67
+ end
68
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for AlertDialog Title component
6
+ # Handles title styling
7
+ module UI::AlertDialogTitleBehavior
8
+ # Base CSS classes for alert dialog title
9
+ def alert_dialog_title_base_classes
10
+ "text-lg font-semibold"
11
+ end
12
+
13
+ # Merge base classes with custom classes using TailwindMerge
14
+ def alert_dialog_title_classes
15
+ TailwindMerge::Merger.new.merge([alert_dialog_title_base_classes, @classes].compact.join(" "))
16
+ end
17
+
18
+ # Build complete HTML attributes hash for alert dialog title
19
+ def alert_dialog_title_html_attributes
20
+ base_attrs = @attributes || {}
21
+ base_attrs.merge(
22
+ class: alert_dialog_title_classes
23
+ )
24
+ end
25
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for AlertDialog Trigger component
6
+ # Handles classes and Stimulus actions
7
+ module UI::AlertDialogTriggerBehavior
8
+ # Base CSS classes for alert dialog trigger wrapper
9
+ def alert_dialog_trigger_base_classes
10
+ "inline-flex"
11
+ end
12
+
13
+ # Merge base classes with custom classes using TailwindMerge
14
+ def alert_dialog_trigger_classes
15
+ TailwindMerge::Merger.new.merge([alert_dialog_trigger_base_classes, @classes].compact.join(" "))
16
+ end
17
+
18
+ # Data attributes for Stimulus action
19
+ def alert_dialog_trigger_data_attributes
20
+ {
21
+ action: "click->ui--alert-dialog#open"
22
+ }
23
+ end
24
+
25
+ # Merge user-provided data attributes
26
+ def merged_alert_dialog_trigger_data_attributes
27
+ user_data = @attributes&.fetch(:data, {}) || {}
28
+ user_data.merge(alert_dialog_trigger_data_attributes)
29
+ end
30
+
31
+ # Build complete HTML attributes hash for alert dialog trigger
32
+ def alert_dialog_trigger_html_attributes
33
+ base_attrs = @attributes&.except(:data) || {}
34
+ base_attrs.merge(
35
+ class: alert_dialog_trigger_classes,
36
+ data: merged_alert_dialog_trigger_data_attributes
37
+ )
38
+ end
39
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for Alert Title component
6
+ # Handles title styling
7
+ module UI::AlertTitleBehavior
8
+ # Base CSS classes for alert title
9
+ def alert_title_base_classes
10
+ "col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight"
11
+ end
12
+
13
+ # Merge base classes with custom classes
14
+ def alert_title_classes
15
+ TailwindMerge::Merger.new.merge([alert_title_base_classes, @classes].compact.join(" "))
16
+ end
17
+
18
+ # Build complete HTML attributes hash for alert title
19
+ def alert_title_html_attributes
20
+ base_attrs = @attributes || {}
21
+ base_attrs.merge(
22
+ class: alert_title_classes,
23
+ "data-slot": "alert-title"
24
+ )
25
+ end
26
+
27
+ # Renders the alert title HTML (for ERB partials)
28
+ def render_alert_title(&content_block)
29
+ all_attributes = alert_title_html_attributes.deep_merge(@attributes || {})
30
+ content_tag(:div, **all_attributes, &content_block)
31
+ end
32
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tailwind_merge"
4
+
5
+ # Shared behavior for AspectRatio component
6
+ # Handles aspect ratio styling
7
+ module UI::AspectRatioBehavior
8
+ # Default aspect ratio is 1:1 (square)
9
+ DEFAULT_RATIO = 1.0
10
+
11
+ # Calculate padding-bottom percentage for aspect ratio
12
+ # Formula: (height / width) * 100
13
+ def aspect_ratio_padding
14
+ ratio_value = @ratio || DEFAULT_RATIO
15
+ percentage = (1.0 / ratio_value) * 100
16
+ "#{percentage}%"
17
+ end
18
+
19
+ # Merge base classes with custom classes
20
+ def aspect_ratio_classes
21
+ TailwindMerge::Merger.new.merge([@classes].compact.join(" "))
22
+ end
23
+
24
+ # Build complete HTML attributes hash for aspect ratio container
25
+ def aspect_ratio_html_attributes
26
+ base_attrs = @attributes || {}
27
+ base_attrs.merge(
28
+ class: aspect_ratio_classes,
29
+ "data-slot": "aspect-ratio",
30
+ style: "position: relative; width: 100%;"
31
+ )
32
+ end
33
+
34
+ # Build attributes for the padding element
35
+ def aspect_ratio_padding_attributes
36
+ {
37
+ style: "padding-bottom: #{aspect_ratio_padding};"
38
+ }
39
+ end
40
+
41
+ # Build attributes for the content wrapper
42
+ def aspect_ratio_content_attributes
43
+ {
44
+ style: "position: absolute; top: 0; right: 0; bottom: 0; left: 0;"
45
+ }
46
+ end
47
+ end