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,34 @@
1
+ <%
2
+ # RadioButton - shadcn/ui inspired component for Rails
3
+ #
4
+ # @param name [String] The name attribute for the radio button
5
+ # @param id [String] The id attribute (auto-generated if not provided)
6
+ # @param value [String] The value attribute
7
+ # @param checked [Boolean] Whether the radio button is checked
8
+ # @param disabled [Boolean] Whether the radio button is disabled
9
+ # @param required [Boolean] Whether the radio button is required
10
+ # @param classes [String] Additional CSS classes to merge
11
+ # @param attributes [Hash] Additional HTML attributes
12
+
13
+ @classes = local_assigns.fetch(:classes, "")
14
+ @attributes = local_assigns.fetch(:attributes, {})
15
+ @disabled = local_assigns.fetch(:disabled, false)
16
+ @value = local_assigns.fetch(:value, nil)
17
+ @checked = local_assigns.fetch(:checked, false)
18
+ @name = local_assigns.fetch(:name, nil)
19
+ @id = local_assigns.fetch(:id, nil)
20
+ @required = local_assigns.fetch(:required, false)
21
+
22
+ # Extend behavior for shared logic
23
+ extend UI::RadioButtonBehavior
24
+
25
+ # Get HTML attributes from behavior (without @attributes merge for input)
26
+ input_attributes = radio_button_html_attributes
27
+ -%>
28
+ <div class="relative inline-flex items-center justify-center">
29
+ <%= tag :input, input_attributes %>
30
+ <%# Indicator dot - shown when checked %>
31
+ <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="fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 pointer-events-none opacity-0 peer-checked:opacity-100 transition-opacity" data-slot="radio-group-indicator">
32
+ <circle cx="12" cy="12" r="10"/>
33
+ </svg>
34
+ </div>
@@ -0,0 +1,44 @@
1
+ <%# ResponsiveDialog Component - Combines Dialog (desktop) and Drawer (mobile) %>
2
+ <%#
3
+ Hybrid CSS + Stimulus approach:
4
+ - Renders both Dialog and Drawer
5
+ - CSS hides one based on breakpoint (md:hidden / md:block)
6
+ - Stimulus controller syncs state between them
7
+
8
+ Usage:
9
+ <%= render "ui/responsive_dialog/responsive_dialog",
10
+ open: false,
11
+ breakpoint: 768,
12
+ direction: "bottom" do %>
13
+ <%# Content goes here - will be rendered in both Dialog and Drawer %>
14
+ <% end %>
15
+ %>
16
+ <%
17
+ content ||= local_assigns.fetch(:content, nil)
18
+ @open = local_assigns.fetch(:open, false)
19
+ @breakpoint = local_assigns.fetch(:breakpoint, 768)
20
+ @direction = local_assigns.fetch(:direction, "bottom")
21
+ @classes = local_assigns.fetch(:classes, "")
22
+ @attributes = local_assigns.fetch(:attributes, {})
23
+
24
+ # Extend behavior for shared logic
25
+ extend UI::ResponsiveDialogBehavior
26
+
27
+ # Get HTML attributes from behavior
28
+ all_attributes = responsive_dialog_html_attributes.deep_merge(@attributes)
29
+ -%>
30
+ <%= content_tag :div, all_attributes do %>
31
+ <%# Mobile: Drawer (hidden on md and up) %>
32
+ <div class="md:hidden" data-ui--responsive-dialog-target="drawer">
33
+ <%= render "ui/drawer/drawer", open: @open, direction: @direction do %>
34
+ <%= content || yield %>
35
+ <% end %>
36
+ </div>
37
+
38
+ <%# Desktop: Dialog (hidden below md) %>
39
+ <div class="hidden md:block" data-ui--responsive-dialog-target="dialog">
40
+ <%= render "ui/dialog/dialog", open: @open do %>
41
+ <%= content || yield %>
42
+ <% end %>
43
+ </div>
44
+ <% end %>
@@ -0,0 +1,60 @@
1
+ <%# ScrollArea - Root container for scroll area %>
2
+ <%
3
+ @as_child = local_assigns.fetch(:as_child, false)
4
+ @classes = local_assigns.fetch(:classes, "")
5
+ @attributes = local_assigns.fetch(:attributes, {})
6
+ @type = local_assigns.fetch(:type, "hover")
7
+ @scroll_hide_delay = local_assigns.fetch(:scroll_hide_delay, 600)
8
+
9
+ # Extend behavior for shared logic
10
+ extend ::UI::ScrollAreaBehavior
11
+
12
+ # Get HTML attributes from behavior
13
+ root_attrs = scroll_area_html_attributes.deep_merge(@attributes)
14
+
15
+ # Add Stimulus controller and values
16
+ root_attrs[:data] ||= {}
17
+ root_attrs[:data][:controller] = "ui--scroll-area"
18
+ root_attrs[:data][:ui__scroll_area_type_value] = @type
19
+ root_attrs[:data][:ui__scroll_area_scroll_hide_delay_value] = @scroll_hide_delay
20
+ -%>
21
+ <% if @as_child %>
22
+ <%# asChild mode: capture block and inject attributes into first element %>
23
+ <% captured_content = capture do %>
24
+ <%= yield %>
25
+ <%= render "ui/scroll_area/scrollbar", orientation: "vertical" %>
26
+ <%= render "ui/scroll_area/corner" %>
27
+ <% end %>
28
+ <%= raw captured_content.sub(/(<[a-z][a-z0-9]*)([\s>])/i) { |match|
29
+ tag_start = $1
30
+ tag_end = $2
31
+
32
+ # Build attributes string manually
33
+ attrs_array = root_attrs.map do |key, value|
34
+ key_name = key.to_s.gsub('_', '-')
35
+ if key == :data && value.is_a?(Hash)
36
+ # Handle data attributes
37
+ value.map { |k, v| "data-#{k.to_s.gsub('_', '-')}=\"#{ERB::Util.html_escape(v)}\"" }.join(" ")
38
+ elsif key == :style
39
+ "style=\"#{ERB::Util.html_escape(value)}\""
40
+ elsif value.is_a?(TrueClass)
41
+ key_name
42
+ elsif value.is_a?(FalseClass) || value.nil?
43
+ nil
44
+ else
45
+ "#{key_name}=\"#{ERB::Util.html_escape(value)}\""
46
+ end
47
+ end.compact.join(" ")
48
+
49
+ "#{tag_start} #{attrs_array}#{tag_end}"
50
+ } %>
51
+ <% else %>
52
+ <%# Default mode: render as div %>
53
+ <%= content_tag :div, root_attrs do %>
54
+ <%= render "ui/scroll_area/viewport" do %>
55
+ <%= yield %>
56
+ <% end %>
57
+ <%= render "ui/scroll_area/scrollbar", orientation: "vertical" %>
58
+ <%= render "ui/scroll_area/corner" %>
59
+ <% end %>
60
+ <% end %>
@@ -0,0 +1,17 @@
1
+ <%# Select Component - Radix-style custom select with trigger and dropdown %>
2
+ <%
3
+ @classes = local_assigns.fetch(:classes, "")
4
+ @attributes = local_assigns.fetch(:attributes, {})
5
+ @value = local_assigns.fetch(:value, nil)
6
+ @id = local_assigns.fetch(:id, nil)
7
+
8
+ # Extend behavior for shared logic
9
+ extend ::UI::SelectBehavior
10
+
11
+ # Get HTML attributes from behavior
12
+ all_attributes = select_html_attributes.deep_merge(@attributes)
13
+ all_attributes[:id] = @id if @id.present?
14
+ -%>
15
+ <%= content_tag :div, all_attributes do %>
16
+ <%= yield %>
17
+ <% end %>
@@ -0,0 +1,20 @@
1
+ <%
2
+ orientation ||= :horizontal
3
+ decorative = true if !defined?(decorative)
4
+ classes ||= ""
5
+
6
+ # Instance variables for behavior module
7
+ @orientation = orientation
8
+ @decorative = decorative
9
+ @classes = classes
10
+
11
+ # Include behavior module
12
+ extend UI::SeparatorBehavior
13
+
14
+ # Get HTML attributes from behavior
15
+ attrs = separator_html_attributes
16
+ all_classes = attrs[:class]
17
+ data_attrs = attrs[:data]
18
+ role_attr = attrs[:role]
19
+ aria_orientation_attr = attrs[:"aria-orientation"]
20
+ %><div class="<%= all_classes %>" data-slot="<%= data_attrs[:slot] %>" data-orientation="<%= data_attrs[:orientation] %>"<% if role_attr %> role="<%= role_attr %>"<% end %><% if aria_orientation_attr %> aria-orientation="<%= aria_orientation_attr %>"<% end %>></div>
@@ -0,0 +1,18 @@
1
+ <%# Sheet Component - Root container for sheet %>
2
+ <%
3
+ content ||= local_assigns.fetch(:content, nil)
4
+ @open = local_assigns.fetch(:open, false)
5
+ @close_on_escape = local_assigns.fetch(:close_on_escape, true)
6
+ @close_on_overlay_click = local_assigns.fetch(:close_on_overlay_click, true)
7
+ @classes = local_assigns.fetch(:classes, "")
8
+ @attributes = local_assigns.fetch(:attributes, {})
9
+
10
+ # Extend behavior for shared logic
11
+ extend UI::SheetBehavior
12
+
13
+ # Get HTML attributes from behavior
14
+ all_attributes = sheet_html_attributes.deep_merge(@attributes)
15
+ -%>
16
+ <%= content_tag :div, all_attributes do %>
17
+ <%= content || yield %>
18
+ <% end %>
@@ -0,0 +1,19 @@
1
+ <%
2
+ # frozen_string_literal: true
3
+
4
+ # UI::Skeleton - Loading placeholder component
5
+ #
6
+ # A simple skeleton component that shows a pulsing placeholder while content is loading.
7
+ # This component is CSS-only with no JavaScript behavior.
8
+ #
9
+ # @param class [String] Additional CSS classes to apply
10
+ # @param attributes [Hash] Additional HTML attributes
11
+ #
12
+ html_class = local_assigns.fetch(:class, "")
13
+ attributes = local_assigns.except(:class)
14
+
15
+ default_classes = "bg-accent animate-pulse rounded-md"
16
+ merged_classes = [default_classes, html_class].compact_blank.join(" ")
17
+ %>
18
+
19
+ <div data-slot="skeleton" class="<%= merged_classes %>" <%= attributes.map { |k, v| "#{k}=\"#{v}\"" }.join(" ").html_safe %>></div>
@@ -0,0 +1,27 @@
1
+ <%# Slider Component - Root container for range slider %>
2
+ <%
3
+ content ||= local_assigns.fetch(:content, nil)
4
+ @min = local_assigns.fetch(:min, 0)
5
+ @max = local_assigns.fetch(:max, 100)
6
+ @step = local_assigns.fetch(:step, 1)
7
+ @value = local_assigns.fetch(:value, nil)
8
+ @center_point = local_assigns.fetch(:center_point, nil)
9
+ # If center_point is defined and no default_value provided, start at center
10
+ @default_value = local_assigns.fetch(:default_value, @center_point ? [@center_point] : [@min])
11
+ @disabled = local_assigns.fetch(:disabled, false)
12
+ @orientation = local_assigns.fetch(:orientation, "horizontal")
13
+ @inverted = local_assigns.fetch(:inverted, false)
14
+ @name = local_assigns.fetch(:name, "")
15
+ @classes = local_assigns.fetch(:classes, "")
16
+ @attributes = local_assigns.fetch(:attributes, {})
17
+
18
+ # Extend behavior for shared logic
19
+ extend UI::SliderBehavior
20
+
21
+ # Get HTML attributes from behavior
22
+ all_attributes = slider_html_attributes.deep_merge(@attributes.except(:data))
23
+ all_attributes[:data] = slider_html_attributes[:data].merge(@attributes.fetch(:data, {}))
24
+ -%>
25
+ <%= content_tag :div, all_attributes do %>
26
+ <%= content || yield %>
27
+ <% end %>
@@ -0,0 +1,19 @@
1
+ <%
2
+ # Small - ERB Partial
3
+ #
4
+ # A small text component with shadcn/ui styling.
5
+ #
6
+ # @param classes [String] Additional CSS classes to merge
7
+ # @param content [String] Text content (alternative to using block)
8
+ # @param attributes [Hash] Additional HTML attributes
9
+
10
+ @classes = local_assigns.fetch(:classes, "")
11
+ @attributes = local_assigns.fetch(:attributes, {})
12
+ content_param = local_assigns.fetch(:content, nil)
13
+
14
+ extend UI::SmallBehavior
15
+ all_attributes = small_html_attributes.merge(@attributes)
16
+ %>
17
+ <%= content_tag :small, all_attributes do %>
18
+ <%= content_param || yield %>
19
+ <% end %>
@@ -0,0 +1,28 @@
1
+ <%# Spinner Component - Loading indicator %>
2
+ <%
3
+ @classes = local_assigns.fetch(:classes, "")
4
+ @attributes = local_assigns.fetch(:attributes, {})
5
+ @size = local_assigns.fetch(:size, "default")
6
+
7
+ # Extend behavior for shared logic
8
+ extend UI::SpinnerBehavior
9
+
10
+ # Get HTML attributes from behavior
11
+ all_attributes = spinner_html_attributes.deep_merge(@attributes)
12
+
13
+ # SVG attributes
14
+ svg_attributes = all_attributes.merge(
15
+ xmlns: "http://www.w3.org/2000/svg",
16
+ width: "24",
17
+ height: "24",
18
+ viewBox: "0 0 24 24",
19
+ fill: "none",
20
+ stroke: "currentColor",
21
+ "stroke-width": "2",
22
+ "stroke-linecap": "round",
23
+ "stroke-linejoin": "round"
24
+ )
25
+ -%>
26
+ <%= content_tag :svg, svg_attributes do %>
27
+ <path d="M21 12a9 9 0 1 1-6.219-8.56"/>
28
+ <% end %>
@@ -0,0 +1,45 @@
1
+ <%
2
+ # Switch - ERB Partial
3
+ #
4
+ # A toggle control that allows the user to switch between checked and unchecked states.
5
+ # Based on Radix UI Switch primitive.
6
+ #
7
+ # @param checked [Boolean] Whether the switch is checked (default: false)
8
+ # @param disabled [Boolean] Whether the switch is disabled (default: false)
9
+ # @param name [String] Name for form submission (creates hidden input)
10
+ # @param id [String] ID attribute
11
+ # @param value [String] Value when checked (default: "1")
12
+ # @param classes [String] Additional CSS classes to merge
13
+ # @param attributes [Hash] Additional HTML attributes
14
+
15
+ @checked = local_assigns.fetch(:checked, false)
16
+ @disabled = local_assigns.fetch(:disabled, false)
17
+ @name = local_assigns[:name]
18
+ @id = local_assigns[:id]
19
+ @value = local_assigns.fetch(:value, "1")
20
+ @classes = local_assigns.fetch(:classes, "")
21
+ @attributes = local_assigns.fetch(:attributes, {})
22
+
23
+ extend UI::SwitchBehavior
24
+ all_attributes = switch_html_attributes.deep_merge(@attributes)
25
+ all_attributes[:id] = @id if @id.present?
26
+ %>
27
+ <%= content_tag :button, all_attributes do %>
28
+ <%= content_tag :span,
29
+ "",
30
+ data: {
31
+ ui__switch_target: "thumb",
32
+ slot: "switch-thumb",
33
+ state: switch_state
34
+ },
35
+ class: switch_thumb_classes
36
+ %>
37
+ <% if @name.present? %>
38
+ <%= tag :input,
39
+ type: "hidden",
40
+ name: @name,
41
+ value: @checked ? @value : "0",
42
+ id: @id
43
+ %>
44
+ <% end %>
45
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <%
2
+ # Table - ERB Partial
3
+ #
4
+ # A table container with consistent styling.
5
+ # Uses TableBehavior module for shared styling logic.
6
+ #
7
+ # @param classes [String] Additional CSS classes to merge
8
+ # @param attributes [Hash] Additional HTML attributes
9
+
10
+ @classes = local_assigns.fetch(:classes, "")
11
+ @attributes = local_assigns.fetch(:attributes, {})
12
+
13
+ extend UI::TableBehavior
14
+ all_attributes = table_html_attributes.deep_merge(@attributes)
15
+ %>
16
+ <%= content_tag :table, all_attributes do %>
17
+ <%= yield %>
18
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <%# Tabs Component - Root container for tabbed interface %>
2
+ <%
3
+ content ||= local_assigns.fetch(:content, nil)
4
+ @default_value = local_assigns.fetch(:default_value, "")
5
+ @orientation = local_assigns.fetch(:orientation, "horizontal")
6
+ @activation_mode = local_assigns.fetch(:activation_mode, "automatic")
7
+ @classes = local_assigns.fetch(:classes, "")
8
+ @attributes = local_assigns.fetch(:attributes, {})
9
+
10
+ # Store context for child components
11
+ @_tabs_default_value = @default_value
12
+ @_tabs_orientation = @orientation
13
+
14
+ # Extend behavior for shared logic
15
+ extend UI::TabsBehavior
16
+
17
+ # Get HTML attributes from behavior
18
+ all_attributes = tabs_html_attributes.deep_merge(@attributes.except(:data))
19
+ all_attributes[:data] = tabs_html_attributes[:data].merge(@attributes.fetch(:data, {}))
20
+ -%>
21
+ <%= content_tag :div, all_attributes do %>
22
+ <%= content || yield %>
23
+ <% end %>
@@ -0,0 +1,16 @@
1
+ <%# Textarea - shadcn/ui inspired component for Rails %>
2
+ <%
3
+ @name = local_assigns.fetch(:name, nil)
4
+ @placeholder = local_assigns.fetch(:placeholder, "")
5
+ @value = local_assigns.fetch(:value, "")
6
+ @rows = local_assigns.fetch(:rows, nil)
7
+ @classes = local_assigns.fetch(:classes, "")
8
+ @attributes = local_assigns.fetch(:attributes, {})
9
+
10
+ # Extend behavior for shared logic
11
+ extend UI::TextareaBehavior
12
+
13
+ # Get HTML attributes from behavior
14
+ all_attributes = textarea_html_attributes.deep_merge(@attributes)
15
+ -%>
16
+ <%= content_tag :textarea, @value, all_attributes %>
@@ -0,0 +1,27 @@
1
+ <%
2
+ # Toggle - ERB Partial
3
+ #
4
+ # A two-state button that can be either on or off.
5
+ #
6
+ # @param variant [String] Visual style variant (default, outline)
7
+ # @param size [String] Size variant (default, sm, lg)
8
+ # @param type [String] Button type attribute (button, submit, reset)
9
+ # @param pressed [Boolean] Whether the toggle is pressed/active
10
+ # @param disabled [Boolean] Whether the toggle is disabled
11
+ # @param classes [String] Additional CSS classes to merge
12
+ # @param attributes [Hash] Additional HTML attributes
13
+
14
+ @variant = local_assigns.fetch(:variant, "default")
15
+ @size = local_assigns.fetch(:size, "default")
16
+ @type = local_assigns.fetch(:type, "button")
17
+ @pressed = local_assigns.fetch(:pressed, false)
18
+ @disabled = local_assigns.fetch(:disabled, false)
19
+ @classes = local_assigns.fetch(:classes, "")
20
+ @attributes = local_assigns.fetch(:attributes, {})
21
+
22
+ extend UI::ToggleBehavior
23
+ all_attributes = toggle_html_attributes.deep_merge(@attributes)
24
+ %>
25
+ <%= content_tag :button, all_attributes do %>
26
+ <%= yield %>
27
+ <% end %>
@@ -0,0 +1,38 @@
1
+ <%
2
+ # ToggleGroup - ERB Partial
3
+ #
4
+ # A container for a set of toggle items that can be toggled on or off.
5
+ #
6
+ # @param type [String] Selection mode: "single" or "multiple"
7
+ # @param variant [String] Visual style variant (default, outline)
8
+ # @param size [String] Size variant (default, sm, lg)
9
+ # @param value [String, Array] Current selected value(s)
10
+ # @param spacing [Integer] Gap between items (0 means items touch)
11
+ # @param orientation [String] Layout direction (horizontal, vertical)
12
+ # @param classes [String] Additional CSS classes to merge
13
+ # @param attributes [Hash] Additional HTML attributes
14
+
15
+ @type = local_assigns.fetch(:type, "single")
16
+ @variant = local_assigns.fetch(:variant, "default")
17
+ @size = local_assigns.fetch(:size, "default")
18
+ @value = local_assigns.fetch(:value, nil)
19
+ @spacing = local_assigns.fetch(:spacing, 0)
20
+ @orientation = local_assigns.fetch(:orientation, nil)
21
+ @classes = local_assigns.fetch(:classes, "")
22
+ @attributes = local_assigns.fetch(:attributes, {})
23
+
24
+ # Store context for child items
25
+ @toggle_group_context = {
26
+ variant: @variant,
27
+ size: @size,
28
+ type: @type,
29
+ spacing: @spacing,
30
+ value: @value
31
+ }
32
+
33
+ extend UI::ToggleGroupBehavior
34
+ all_attributes = toggle_group_html_attributes.deep_merge(@attributes)
35
+ %>
36
+ <%= content_tag :div, all_attributes do %>
37
+ <%= yield %>
38
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <%# Tooltip Component - Root container for tooltip %>
2
+ <%
3
+ @attributes = local_assigns.fetch(:attributes, {})
4
+
5
+ # Extend behavior for shared logic
6
+ extend UI::TooltipBehavior
7
+
8
+ # Get HTML attributes from behavior
9
+ all_attributes = tooltip_html_attributes.deep_merge(@attributes)
10
+ -%>
11
+ <%= content_tag :div, all_attributes do %>
12
+ <%= yield %>
13
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <%# Accordion Content Component - Collapsible content area %>
2
+ <%
3
+ content ||= local_assigns.fetch(:content, nil)
4
+ @classes = local_assigns.fetch(:classes, "")
5
+ @attributes = local_assigns.fetch(:attributes, {})
6
+
7
+ # Get context from parent item
8
+ @item_value = @_accordion_item_value || SecureRandom.hex(4)
9
+ @initial_open = @_accordion_item_initial_open || false
10
+
11
+ # Extend behavior for shared logic
12
+ extend UI::AccordionContentBehavior
13
+
14
+ # Get HTML attributes from behavior
15
+ all_attributes = content_html_attributes.deep_merge(@attributes)
16
+ -%>
17
+ <%= content_tag :div, all_attributes do %>
18
+ <div class="pt-0 pb-4">
19
+ <%= content || yield %>
20
+ </div>
21
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <%# Accordion Item Component - Individual collapsible item %>
2
+ <%
3
+ content ||= local_assigns.fetch(:content, nil)
4
+ @value = local_assigns.fetch(:value, "")
5
+ @initial_open = local_assigns.fetch(:initial_open, false)
6
+ @classes = local_assigns.fetch(:classes, "")
7
+ @attributes = local_assigns.fetch(:attributes, {})
8
+
9
+ # Store context for child components
10
+ @_accordion_item_value = @value
11
+ @_accordion_item_initial_open = @initial_open
12
+
13
+ # Extend behavior for shared logic
14
+ extend UI::AccordionItemBehavior
15
+
16
+ # Get HTML attributes from behavior
17
+ all_attributes = item_html_attributes.deep_merge(@attributes)
18
+ -%>
19
+ <%= content_tag :div, all_attributes do %>
20
+ <%= content || yield %>
21
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <%# Accordion Trigger Component - Button to toggle accordion item %>
2
+ <%
3
+ content ||= local_assigns.fetch(:content, nil)
4
+ @classes = local_assigns.fetch(:classes, "")
5
+ @attributes = local_assigns.fetch(:attributes, {})
6
+
7
+ # Get context from parent item
8
+ @item_value = @_accordion_item_value || SecureRandom.hex(4)
9
+ @initial_open = @_accordion_item_initial_open || false
10
+
11
+ # Extend behavior for shared logic
12
+ extend UI::AccordionTriggerBehavior
13
+
14
+ # Get HTML attributes from behavior
15
+ all_attributes = trigger_html_attributes.deep_merge(@attributes)
16
+ @orientation ||= "vertical"
17
+ -%>
18
+ <%= content_tag :h3, class: "flex", "data-orientation": @orientation, "data-state": trigger_state do %>
19
+ <%= content_tag :button, all_attributes do %>
20
+ <%= content || yield %>
21
+ <%= caret_svg %>
22
+ <% end %>
23
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <%
2
+ classes ||= ""
3
+
4
+ # Base CSS classes
5
+ base_classes = "text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed"
6
+
7
+ # Merge all classes
8
+ require "tailwind_merge"
9
+ all_classes = TailwindMerge::Merger.new.merge([base_classes, classes].compact.join(" "))
10
+ %>
11
+ <div class="<%= all_classes %>" data-slot="alert-description">
12
+ <%= yield %>
13
+ </div>
@@ -0,0 +1,13 @@
1
+ <%
2
+ classes ||= ""
3
+
4
+ # Base CSS classes
5
+ base_classes = "col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight"
6
+
7
+ # Merge all classes
8
+ require "tailwind_merge"
9
+ all_classes = TailwindMerge::Merger.new.merge([base_classes, classes].compact.join(" "))
10
+ %>
11
+ <div class="<%= all_classes %>" data-slot="alert-title">
12
+ <%= yield %>
13
+ </div>
@@ -0,0 +1,13 @@
1
+ <%
2
+ classes ||= ""
3
+
4
+ # Include behavior module
5
+ extend UI::AvatarFallbackBehavior
6
+
7
+ # Get HTML attributes from behavior
8
+ attrs = avatar_fallback_html_attributes
9
+ all_classes = attrs[:class]
10
+ data_attrs = attrs[:data]
11
+ %><span class="<%= all_classes %>" data-ui--avatar-target="fallback" data-slot="<%= data_attrs[:slot] %>">
12
+ <%= yield %>
13
+ </span>
@@ -0,0 +1,18 @@
1
+ <%
2
+ src ||= ""
3
+ alt ||= ""
4
+ classes ||= ""
5
+
6
+ # Instance variables for behavior module
7
+ @src = src
8
+ @alt = alt
9
+ @classes = classes
10
+
11
+ # Include behavior module
12
+ extend UI::AvatarImageBehavior
13
+
14
+ # Get HTML attributes from behavior
15
+ attrs = avatar_image_html_attributes
16
+ all_classes = attrs[:class]
17
+ data_attrs = attrs[:data]
18
+ %><img src="<%= attrs[:src] %>" alt="<%= attrs[:alt] %>" class="<%= all_classes %>" data-ui--avatar-target="image" data-slot="<%= data_attrs[:slot] %>">
@@ -0,0 +1,26 @@
1
+ <%# Breadcrumb Ellipsis Component - Indicator for collapsed items %>
2
+ <%
3
+ @classes = local_assigns.fetch(:classes, "")
4
+ @attributes = local_assigns.fetch(:attributes, {})
5
+
6
+ # Extend behavior for shared logic
7
+ extend UI::BreadcrumbEllipsisBehavior
8
+
9
+ # Get HTML attributes from behavior
10
+ all_attributes = breadcrumb_ellipsis_html_attributes.deep_merge(@attributes)
11
+
12
+ # Capture block content if provided
13
+ block_content = capture { yield } if block_given?
14
+ -%>
15
+ <%= content_tag :span, all_attributes do %>
16
+ <% if block_content.present? %>
17
+ <%= block_content %>
18
+ <% else %>
19
+ <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="lucide lucide-ellipsis h-4 w-4">
20
+ <circle cx="12" cy="12" r="1"/>
21
+ <circle cx="19" cy="12" r="1"/>
22
+ <circle cx="5" cy="12" r="1"/>
23
+ </svg>
24
+ <span class="sr-only">More</span>
25
+ <% end %>
26
+ <% end %>
@@ -0,0 +1,14 @@
1
+ <%# Breadcrumb Item Component - Individual breadcrumb entry %>
2
+ <%
3
+ @classes = local_assigns.fetch(:classes, "")
4
+ @attributes = local_assigns.fetch(:attributes, {})
5
+
6
+ # Extend behavior for shared logic
7
+ extend UI::BreadcrumbItemBehavior
8
+
9
+ # Get HTML attributes from behavior
10
+ all_attributes = breadcrumb_item_html_attributes.deep_merge(@attributes)
11
+ -%>
12
+ <%= content_tag :li, all_attributes do %>
13
+ <%= yield %>
14
+ <% end %>