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,282 @@
1
+ /**
2
+ * Floating UI Positioner Utility
3
+ *
4
+ * Encapsulates Floating UI positioning logic.
5
+ * Used by popover, dropdown, tooltip, select, hover_card, etc.
6
+ */
7
+
8
+ import { computePosition, flip, offset, shift, arrow, autoUpdate } from "@floating-ui/dom"
9
+
10
+ /**
11
+ * Default configuration for positioning
12
+ */
13
+ const DEFAULT_CONFIG = {
14
+ placement: 'bottom',
15
+ offsetValue: 4,
16
+ flipEnabled: true,
17
+ shiftEnabled: true,
18
+ shiftPadding: 8,
19
+ arrowElement: null,
20
+ arrowPadding: 8,
21
+ strategy: 'absolute',
22
+ // autoUpdate options
23
+ ancestorScroll: true,
24
+ ancestorResize: true,
25
+ elementResize: true,
26
+ layoutShift: true,
27
+ animationFrame: false
28
+ }
29
+
30
+ /**
31
+ * Build middleware array based on options
32
+ * @param {Object} options - Configuration options
33
+ * @returns {Array} Middleware array
34
+ */
35
+ function buildMiddleware(options) {
36
+ const middleware = []
37
+
38
+ // Offset middleware
39
+ if (options.offsetValue > 0) {
40
+ middleware.push(offset(options.offsetValue))
41
+ }
42
+
43
+ // Flip middleware
44
+ if (options.flipEnabled) {
45
+ middleware.push(flip())
46
+ }
47
+
48
+ // Shift middleware
49
+ if (options.shiftEnabled) {
50
+ middleware.push(shift({ padding: options.shiftPadding }))
51
+ }
52
+
53
+ // Arrow middleware
54
+ if (options.arrowElement) {
55
+ middleware.push(arrow({
56
+ element: options.arrowElement,
57
+ padding: options.arrowPadding
58
+ }))
59
+ }
60
+
61
+ return middleware
62
+ }
63
+
64
+ /**
65
+ * Apply position to content element
66
+ * @param {HTMLElement} content - Content element
67
+ * @param {Object} position - Position data from computePosition
68
+ * @param {Object} options - Options
69
+ */
70
+ function applyPosition(content, position, options = {}) {
71
+ const { x, y, placement, middlewareData } = position
72
+
73
+ // Apply position styles
74
+ Object.assign(content.style, {
75
+ left: `${x}px`,
76
+ top: `${y}px`,
77
+ position: options.strategy || 'absolute'
78
+ })
79
+
80
+ // Update data attributes
81
+ const [side, align] = placement.split('-')
82
+ content.setAttribute('data-side', side)
83
+ if (align) {
84
+ content.setAttribute('data-align', align)
85
+ }
86
+
87
+ // Position arrow if present
88
+ if (options.arrowElement && middlewareData.arrow) {
89
+ const { x: arrowX, y: arrowY } = middlewareData.arrow
90
+
91
+ const staticSide = {
92
+ top: 'bottom',
93
+ right: 'left',
94
+ bottom: 'top',
95
+ left: 'right'
96
+ }[side]
97
+
98
+ Object.assign(options.arrowElement.style, {
99
+ left: arrowX != null ? `${arrowX}px` : '',
100
+ top: arrowY != null ? `${arrowY}px` : '',
101
+ right: '',
102
+ bottom: '',
103
+ [staticSide]: '-4px'
104
+ })
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Create a floating UI positioner
110
+ * @param {HTMLElement} reference - Reference/trigger element
111
+ * @param {HTMLElement} floating - Floating/content element
112
+ * @param {Object} options - Configuration options
113
+ * @returns {Object} Positioner controller
114
+ */
115
+ export function createPositioner(reference, floating, options = {}) {
116
+ const config = { ...DEFAULT_CONFIG, ...options }
117
+ let cleanup = null
118
+ let isActive = false
119
+
120
+ const middleware = buildMiddleware(config)
121
+
122
+ const updatePosition = async () => {
123
+ const position = await computePosition(reference, floating, {
124
+ placement: config.placement,
125
+ middleware,
126
+ strategy: config.strategy
127
+ })
128
+
129
+ applyPosition(floating, position, {
130
+ strategy: config.strategy,
131
+ arrowElement: config.arrowElement
132
+ })
133
+
134
+ return position
135
+ }
136
+
137
+ return {
138
+ /**
139
+ * Start positioning with auto-update
140
+ */
141
+ start() {
142
+ if (isActive) return
143
+
144
+ // Initial position update
145
+ updatePosition()
146
+
147
+ // Setup auto-update
148
+ cleanup = autoUpdate(reference, floating, updatePosition, {
149
+ ancestorScroll: config.ancestorScroll,
150
+ ancestorResize: config.ancestorResize,
151
+ elementResize: config.elementResize,
152
+ layoutShift: config.layoutShift,
153
+ animationFrame: config.animationFrame
154
+ })
155
+
156
+ isActive = true
157
+ },
158
+
159
+ /**
160
+ * Stop positioning and cleanup
161
+ */
162
+ stop() {
163
+ if (!isActive) return
164
+
165
+ if (cleanup) {
166
+ cleanup()
167
+ cleanup = null
168
+ }
169
+
170
+ isActive = false
171
+ },
172
+
173
+ /**
174
+ * Manually update position once
175
+ * @returns {Promise<Object>} Position data
176
+ */
177
+ async update() {
178
+ return updatePosition()
179
+ },
180
+
181
+ /**
182
+ * Update placement
183
+ * @param {string} placement - New placement
184
+ */
185
+ setPlacement(placement) {
186
+ config.placement = placement
187
+ if (isActive) {
188
+ updatePosition()
189
+ }
190
+ },
191
+
192
+ /**
193
+ * Update offset
194
+ * @param {number} offsetValue - New offset value
195
+ */
196
+ setOffset(offsetValue) {
197
+ config.offsetValue = offsetValue
198
+ // Rebuild middleware with new offset
199
+ middleware.length = 0
200
+ middleware.push(...buildMiddleware(config))
201
+ if (isActive) {
202
+ updatePosition()
203
+ }
204
+ },
205
+
206
+ /**
207
+ * Check if positioner is active
208
+ * @returns {boolean}
209
+ */
210
+ isActive() {
211
+ return isActive
212
+ },
213
+
214
+ /**
215
+ * Get current configuration
216
+ * @returns {Object}
217
+ */
218
+ getConfig() {
219
+ return { ...config }
220
+ }
221
+ }
222
+ }
223
+
224
+ /**
225
+ * Simple one-liner to position and auto-update
226
+ * Returns cleanup function
227
+ * @param {HTMLElement} reference - Reference element
228
+ * @param {HTMLElement} floating - Floating element
229
+ * @param {Object} options - Configuration options
230
+ * @returns {Function} Cleanup function
231
+ */
232
+ export function position(reference, floating, options = {}) {
233
+ const positioner = createPositioner(reference, floating, options)
234
+ positioner.start()
235
+ return () => positioner.stop()
236
+ }
237
+
238
+ /**
239
+ * Position once without auto-update
240
+ * @param {HTMLElement} reference - Reference element
241
+ * @param {HTMLElement} floating - Floating element
242
+ * @param {Object} options - Configuration options
243
+ * @returns {Promise<Object>} Position data
244
+ */
245
+ export async function positionOnce(reference, floating, options = {}) {
246
+ const config = { ...DEFAULT_CONFIG, ...options }
247
+ const middleware = buildMiddleware(config)
248
+
249
+ const position = await computePosition(reference, floating, {
250
+ placement: config.placement,
251
+ middleware,
252
+ strategy: config.strategy
253
+ })
254
+
255
+ applyPosition(floating, position, {
256
+ strategy: config.strategy,
257
+ arrowElement: config.arrowElement
258
+ })
259
+
260
+ return position
261
+ }
262
+
263
+ /**
264
+ * Get placement from data attributes
265
+ * @param {HTMLElement} element - Element with data-side and data-align attributes
266
+ * @returns {string} Floating UI placement string
267
+ */
268
+ export function getPlacementFromAttributes(element) {
269
+ const side = element.getAttribute('data-side') || 'bottom'
270
+ const align = element.getAttribute('data-align')
271
+ return align ? `${side}-${align}` : side
272
+ }
273
+
274
+ /**
275
+ * Parse side and align from placement
276
+ * @param {string} placement - Floating UI placement string
277
+ * @returns {Object} Object with side and align properties
278
+ */
279
+ export function parsePlacement(placement) {
280
+ const [side, align = 'center'] = placement.split('-')
281
+ return { side, align }
282
+ }
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Focus Trap Manager Utility
3
+ *
4
+ * Handles focus trapping within modal components.
5
+ * Used by dialog, alert_dialog, drawer, responsive_dialog, etc.
6
+ */
7
+
8
+ // Focusable elements selector
9
+ const FOCUSABLE_SELECTOR = [
10
+ 'button:not([disabled])',
11
+ '[href]',
12
+ 'input:not([disabled])',
13
+ 'select:not([disabled])',
14
+ 'textarea:not([disabled])',
15
+ '[tabindex]:not([tabindex="-1"])'
16
+ ].join(', ')
17
+
18
+ // Input elements that trigger mobile keyboard
19
+ const INPUT_SELECTOR = 'input:not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="checkbox"]):not([type="radio"]), textarea'
20
+
21
+ /**
22
+ * Get all focusable elements within a container
23
+ * @param {HTMLElement} container - Container to search within
24
+ * @returns {HTMLElement[]} Array of focusable elements
25
+ */
26
+ export function getFocusableElements(container) {
27
+ if (!container) return []
28
+ return Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR))
29
+ }
30
+
31
+ /**
32
+ * Get the first focusable element in a container
33
+ * @param {HTMLElement} container - Container to search within
34
+ * @param {Object} options - Options
35
+ * @param {boolean} options.skipInputs - Skip text inputs (useful for mobile to avoid keyboard popup)
36
+ * @returns {HTMLElement|null}
37
+ */
38
+ export function getFirstFocusable(container, options = {}) {
39
+ const elements = getFocusableElements(container)
40
+
41
+ if (options.skipInputs) {
42
+ const nonInput = elements.find(el => !el.matches(INPUT_SELECTOR))
43
+ return nonInput || elements[0] || null
44
+ }
45
+
46
+ return elements[0] || null
47
+ }
48
+
49
+ /**
50
+ * Get the last focusable element in a container
51
+ * @param {HTMLElement} container - Container to search within
52
+ * @returns {HTMLElement|null}
53
+ */
54
+ export function getLastFocusable(container) {
55
+ const elements = getFocusableElements(container)
56
+ return elements[elements.length - 1] || null
57
+ }
58
+
59
+ /**
60
+ * Check if the current device is mobile
61
+ * @returns {boolean}
62
+ */
63
+ export function isMobileDevice() {
64
+ return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent)
65
+ }
66
+
67
+ /**
68
+ * Focus the first appropriate element in a container
69
+ * @param {HTMLElement} container - Container to focus within
70
+ * @param {Object} options - Options
71
+ * @param {boolean} options.mobileAware - Skip inputs on mobile to avoid keyboard popup
72
+ * @param {boolean} options.excludeInputsOnMobile - Alias for mobileAware (for compatibility)
73
+ * @param {boolean} options.preventScroll - Pass preventScroll option to focus()
74
+ * @param {HTMLElement} options.preferredElement - Specific element to focus if available
75
+ */
76
+ export function focusFirstElement(container, options = {}) {
77
+ const {
78
+ mobileAware = true,
79
+ excludeInputsOnMobile = mobileAware,
80
+ preventScroll = false,
81
+ preferredElement = null
82
+ } = options
83
+
84
+ const focusOptions = preventScroll ? { preventScroll: true } : undefined
85
+
86
+ // Try preferred element first
87
+ if (preferredElement && container.contains(preferredElement)) {
88
+ preferredElement.focus(focusOptions)
89
+ return preferredElement
90
+ }
91
+
92
+ // On mobile, skip text inputs to avoid keyboard popup
93
+ const skipInputs = excludeInputsOnMobile && isMobileDevice()
94
+ const element = getFirstFocusable(container, { skipInputs })
95
+
96
+ if (element) {
97
+ element.focus(focusOptions)
98
+ return element
99
+ }
100
+
101
+ return null
102
+ }
103
+
104
+ /**
105
+ * Create a focus trap for a container
106
+ * @param {HTMLElement} container - Container to trap focus within
107
+ * @param {Object} options - Options
108
+ * @param {boolean} options.mobileAware - Handle mobile devices specially
109
+ * @param {HTMLElement} options.returnFocus - Element to return focus to on deactivate
110
+ * @param {boolean} options.autoFocus - Whether to auto-focus first element on activate
111
+ * @returns {Object} Focus trap controller
112
+ */
113
+ export function createFocusTrap(container, options = {}) {
114
+ const {
115
+ mobileAware = true,
116
+ returnFocus = null,
117
+ autoFocus = true
118
+ } = options
119
+
120
+ let isActive = false
121
+ let previouslyFocused = null
122
+ let tabHandler = null
123
+
124
+ const handleTab = (event) => {
125
+ if (event.key !== 'Tab') return
126
+
127
+ const focusableElements = getFocusableElements(container)
128
+ if (focusableElements.length === 0) return
129
+
130
+ const firstFocusable = focusableElements[0]
131
+ const lastFocusable = focusableElements[focusableElements.length - 1]
132
+
133
+ if (event.shiftKey) {
134
+ // Shift+Tab: if on first element, go to last
135
+ if (document.activeElement === firstFocusable) {
136
+ event.preventDefault()
137
+ lastFocusable.focus()
138
+ }
139
+ } else {
140
+ // Tab: if on last element, go to first
141
+ if (document.activeElement === lastFocusable) {
142
+ event.preventDefault()
143
+ firstFocusable.focus()
144
+ }
145
+ }
146
+ }
147
+
148
+ return {
149
+ /**
150
+ * Activate the focus trap
151
+ */
152
+ activate() {
153
+ if (isActive) return
154
+
155
+ // Store currently focused element
156
+ previouslyFocused = returnFocus || document.activeElement
157
+
158
+ // Add tab key handler
159
+ tabHandler = handleTab
160
+ document.addEventListener('keydown', tabHandler)
161
+
162
+ // Focus first element
163
+ if (autoFocus) {
164
+ // Delay to allow DOM to settle
165
+ requestAnimationFrame(() => {
166
+ focusFirstElement(container, { mobileAware })
167
+ })
168
+ }
169
+
170
+ isActive = true
171
+ },
172
+
173
+ /**
174
+ * Deactivate the focus trap and optionally return focus
175
+ */
176
+ deactivate() {
177
+ if (!isActive) return
178
+
179
+ // Remove tab handler
180
+ if (tabHandler) {
181
+ document.removeEventListener('keydown', tabHandler)
182
+ tabHandler = null
183
+ }
184
+
185
+ // Return focus to previously focused element
186
+ if (previouslyFocused && typeof previouslyFocused.focus === 'function') {
187
+ previouslyFocused.focus()
188
+ }
189
+
190
+ previouslyFocused = null
191
+ isActive = false
192
+ },
193
+
194
+ /**
195
+ * Check if trap is active
196
+ * @returns {boolean}
197
+ */
198
+ isActive() {
199
+ return isActive
200
+ },
201
+
202
+ /**
203
+ * Update the return focus element
204
+ * @param {HTMLElement} element
205
+ */
206
+ setReturnFocus(element) {
207
+ previouslyFocused = element
208
+ },
209
+
210
+ /**
211
+ * Manually focus first element
212
+ */
213
+ focusFirst() {
214
+ focusFirstElement(container, { mobileAware })
215
+ },
216
+
217
+ /**
218
+ * Manually focus last element
219
+ */
220
+ focusLast() {
221
+ const element = getLastFocusable(container)
222
+ if (element) element.focus()
223
+ }
224
+ }
225
+ }
226
+
227
+ /**
228
+ * Simple one-liner to setup focus trap
229
+ * Returns cleanup function
230
+ * @param {HTMLElement} container - Container to trap focus within
231
+ * @param {Object} options - Options for createFocusTrap
232
+ * @returns {Function} Cleanup function to deactivate trap
233
+ */
234
+ export function trapFocus(container, options = {}) {
235
+ const trap = createFocusTrap(container, options)
236
+ trap.activate()
237
+ return () => trap.deactivate()
238
+ }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * UI Utilities Index
3
+ *
4
+ * Export all shared utilities for controllers
5
+ */
6
+
7
+ // State Management
8
+ export {
9
+ setState,
10
+ getState,
11
+ isOpen,
12
+ toggleState,
13
+ setStateOnMultiple,
14
+ syncCheckedState,
15
+ syncPressedState,
16
+ syncExpandedState,
17
+ syncModalState,
18
+ createStateSynchronizer
19
+ } from './state-manager.js'
20
+
21
+ // Floating UI Positioning
22
+ export {
23
+ createPositioner,
24
+ position,
25
+ positionOnce,
26
+ getPlacementFromAttributes,
27
+ parsePlacement
28
+ } from './floating-ui-positioner.js'
29
+
30
+ // Escape Key Handling
31
+ export {
32
+ createEscapeKeyHandler,
33
+ onEscapeKey,
34
+ onEscapeKeyWhen
35
+ } from './escape-key-manager.js'
36
+
37
+ // Focus Trap
38
+ export {
39
+ getFocusableElements,
40
+ getFirstFocusable,
41
+ getLastFocusable,
42
+ isMobileDevice,
43
+ focusFirstElement,
44
+ createFocusTrap,
45
+ trapFocus
46
+ } from './focus-trap-manager.js'
47
+
48
+ // Click Outside Detection
49
+ export {
50
+ createClickOutsideHandler,
51
+ onClickOutside,
52
+ onClickOutsideWhen
53
+ } from './click-outside-manager.js'
54
+
55
+ // Scroll Lock
56
+ export {
57
+ lockScroll,
58
+ unlockScroll,
59
+ forceUnlockScroll,
60
+ isScrollLocked,
61
+ getScrollLockCount,
62
+ resetScrollLockState,
63
+ createScrollLock,
64
+ preventTouchScroll
65
+ } from './scroll-lock-manager.js'
66
+
67
+ // Menu Utilities (existing)
68
+ export {
69
+ toggleCheckbox,
70
+ selectRadio,
71
+ getFocusableItems,
72
+ findCurrentItemIndex,
73
+ focusItem,
74
+ focusNextItem,
75
+ focusPreviousItem,
76
+ hasSubmenu,
77
+ openSubmenu,
78
+ closeSubmenu,
79
+ closeAllSubmenus,
80
+ closeSiblingSubmenus,
81
+ positionDropdown,
82
+ positionSubmenu,
83
+ updateRovingTabindex,
84
+ clearAllTabindexes,
85
+ getKeyboardFocusedItem
86
+ } from './menu_utils.js'