hotwirebits 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 (843) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +46 -0
  3. data/LICENSE +21 -0
  4. data/README.md +156 -0
  5. data/app/assets/stylesheets/hotwirebits/theme.css +131 -0
  6. data/app/assets/stylesheets/hotwirebits/themes/corporate.css +29 -0
  7. data/app/assets/stylesheets/hotwirebits/themes/midnight.css +29 -0
  8. data/app/components/hotwirebits/accordion_component.html.erb +23 -0
  9. data/app/components/hotwirebits/accordion_component.rb +34 -0
  10. data/app/components/hotwirebits/activity_feed_component.html.erb +40 -0
  11. data/app/components/hotwirebits/activity_feed_component.rb +11 -0
  12. data/app/components/hotwirebits/affix_component.html.erb +3 -0
  13. data/app/components/hotwirebits/affix_component.rb +25 -0
  14. data/app/components/hotwirebits/ai_chat_component.html.erb +32 -0
  15. data/app/components/hotwirebits/ai_chat_component.rb +12 -0
  16. data/app/components/hotwirebits/alert_component.html.erb +32 -0
  17. data/app/components/hotwirebits/alert_component.rb +39 -0
  18. data/app/components/hotwirebits/alert_dialog_component.html.erb +30 -0
  19. data/app/components/hotwirebits/alert_dialog_component.rb +40 -0
  20. data/app/components/hotwirebits/anchor_component.html.erb +9 -0
  21. data/app/components/hotwirebits/anchor_component.rb +12 -0
  22. data/app/components/hotwirebits/angle_slider_component.html.erb +9 -0
  23. data/app/components/hotwirebits/angle_slider_component.rb +19 -0
  24. data/app/components/hotwirebits/animated_number_component.html.erb +8 -0
  25. data/app/components/hotwirebits/animated_number_component.rb +28 -0
  26. data/app/components/hotwirebits/app_shell_component.html.erb +22 -0
  27. data/app/components/hotwirebits/app_shell_component.rb +15 -0
  28. data/app/components/hotwirebits/aspect_ratio_component.html.erb +3 -0
  29. data/app/components/hotwirebits/aspect_ratio_component.rb +27 -0
  30. data/app/components/hotwirebits/auth_block_component.html.erb +63 -0
  31. data/app/components/hotwirebits/auth_block_component.rb +35 -0
  32. data/app/components/hotwirebits/autocomplete_component.html.erb +5 -0
  33. data/app/components/hotwirebits/autocomplete_component.rb +45 -0
  34. data/app/components/hotwirebits/avatar_component.html.erb +18 -0
  35. data/app/components/hotwirebits/avatar_component.rb +67 -0
  36. data/app/components/hotwirebits/background_image_component.html.erb +9 -0
  37. data/app/components/hotwirebits/background_image_component.rb +17 -0
  38. data/app/components/hotwirebits/badge_component.html.erb +13 -0
  39. data/app/components/hotwirebits/badge_component.rb +55 -0
  40. data/app/components/hotwirebits/banner_component.html.erb +31 -0
  41. data/app/components/hotwirebits/banner_component.rb +36 -0
  42. data/app/components/hotwirebits/base.rb +13 -0
  43. data/app/components/hotwirebits/bento_grid_component.html.erb +7 -0
  44. data/app/components/hotwirebits/bento_grid_component.rb +36 -0
  45. data/app/components/hotwirebits/blog_section_component.html.erb +35 -0
  46. data/app/components/hotwirebits/blog_section_component.rb +20 -0
  47. data/app/components/hotwirebits/bottom_navigation_component.html.erb +21 -0
  48. data/app/components/hotwirebits/bottom_navigation_component.rb +22 -0
  49. data/app/components/hotwirebits/box_component.html.erb +3 -0
  50. data/app/components/hotwirebits/box_component.rb +16 -0
  51. data/app/components/hotwirebits/breadcrumb_advanced_component.html.erb +53 -0
  52. data/app/components/hotwirebits/breadcrumb_advanced_component.rb +32 -0
  53. data/app/components/hotwirebits/breadcrumb_component.html.erb +18 -0
  54. data/app/components/hotwirebits/breadcrumb_component.rb +11 -0
  55. data/app/components/hotwirebits/browser_mockup_component.html.erb +22 -0
  56. data/app/components/hotwirebits/browser_mockup_component.rb +11 -0
  57. data/app/components/hotwirebits/burger_component.html.erb +20 -0
  58. data/app/components/hotwirebits/burger_component.rb +29 -0
  59. data/app/components/hotwirebits/button_component.html.erb +21 -0
  60. data/app/components/hotwirebits/button_component.rb +84 -0
  61. data/app/components/hotwirebits/calendar_component.html.erb +70 -0
  62. data/app/components/hotwirebits/calendar_component.rb +49 -0
  63. data/app/components/hotwirebits/card_component.html.erb +24 -0
  64. data/app/components/hotwirebits/card_component.rb +21 -0
  65. data/app/components/hotwirebits/card_heading_component.html.erb +13 -0
  66. data/app/components/hotwirebits/card_heading_component.rb +13 -0
  67. data/app/components/hotwirebits/carousel_component.html.erb +50 -0
  68. data/app/components/hotwirebits/carousel_component.rb +27 -0
  69. data/app/components/hotwirebits/center_component.html.erb +3 -0
  70. data/app/components/hotwirebits/center_component.rb +22 -0
  71. data/app/components/hotwirebits/chart_component.html.erb +68 -0
  72. data/app/components/hotwirebits/chart_component.rb +67 -0
  73. data/app/components/hotwirebits/chat_bubble_component.html.erb +27 -0
  74. data/app/components/hotwirebits/chat_bubble_component.rb +35 -0
  75. data/app/components/hotwirebits/checkbox_component.html.erb +9 -0
  76. data/app/components/hotwirebits/checkbox_component.rb +70 -0
  77. data/app/components/hotwirebits/checkout_form_component.html.erb +40 -0
  78. data/app/components/hotwirebits/checkout_form_component.rb +21 -0
  79. data/app/components/hotwirebits/chip_component.html.erb +13 -0
  80. data/app/components/hotwirebits/chip_component.rb +51 -0
  81. data/app/components/hotwirebits/clipboard_component.html.erb +26 -0
  82. data/app/components/hotwirebits/clipboard_component.rb +19 -0
  83. data/app/components/hotwirebits/close_button_component.html.erb +3 -0
  84. data/app/components/hotwirebits/close_button_component.rb +40 -0
  85. data/app/components/hotwirebits/code_block_component.html.erb +17 -0
  86. data/app/components/hotwirebits/code_block_component.rb +19 -0
  87. data/app/components/hotwirebits/code_highlight_component.html.erb +6 -0
  88. data/app/components/hotwirebits/code_highlight_component.rb +32 -0
  89. data/app/components/hotwirebits/code_mockup_component.html.erb +13 -0
  90. data/app/components/hotwirebits/code_mockup_component.rb +19 -0
  91. data/app/components/hotwirebits/collapsible_component.html.erb +17 -0
  92. data/app/components/hotwirebits/collapsible_component.rb +11 -0
  93. data/app/components/hotwirebits/color_input_component.html.erb +19 -0
  94. data/app/components/hotwirebits/color_input_component.rb +14 -0
  95. data/app/components/hotwirebits/color_picker_component.html.erb +6 -0
  96. data/app/components/hotwirebits/color_picker_component.rb +37 -0
  97. data/app/components/hotwirebits/color_swatch_component.html.erb +1 -0
  98. data/app/components/hotwirebits/color_swatch_component.rb +18 -0
  99. data/app/components/hotwirebits/combobox_component.html.erb +15 -0
  100. data/app/components/hotwirebits/combobox_component.rb +56 -0
  101. data/app/components/hotwirebits/command_bar_component.html.erb +33 -0
  102. data/app/components/hotwirebits/command_bar_component.rb +11 -0
  103. data/app/components/hotwirebits/compare_component.html.erb +21 -0
  104. data/app/components/hotwirebits/compare_component.rb +17 -0
  105. data/app/components/hotwirebits/confirm_dialog_component.html.erb +17 -0
  106. data/app/components/hotwirebits/confirm_dialog_component.rb +23 -0
  107. data/app/components/hotwirebits/confirm_popup_component.html.erb +16 -0
  108. data/app/components/hotwirebits/confirm_popup_component.rb +31 -0
  109. data/app/components/hotwirebits/contact_section_component.html.erb +53 -0
  110. data/app/components/hotwirebits/contact_section_component.rb +17 -0
  111. data/app/components/hotwirebits/container_component.html.erb +3 -0
  112. data/app/components/hotwirebits/container_component.rb +29 -0
  113. data/app/components/hotwirebits/context_menu_component.html.erb +27 -0
  114. data/app/components/hotwirebits/context_menu_component.rb +14 -0
  115. data/app/components/hotwirebits/cookie_consent_component.html.erb +23 -0
  116. data/app/components/hotwirebits/cookie_consent_component.rb +28 -0
  117. data/app/components/hotwirebits/cookie_settings_component.html.erb +48 -0
  118. data/app/components/hotwirebits/cookie_settings_component.rb +10 -0
  119. data/app/components/hotwirebits/countdown_component.html.erb +8 -0
  120. data/app/components/hotwirebits/countdown_component.rb +14 -0
  121. data/app/components/hotwirebits/cta_section_component.html.erb +33 -0
  122. data/app/components/hotwirebits/cta_section_component.rb +23 -0
  123. data/app/components/hotwirebits/dashboard_card_component.html.erb +32 -0
  124. data/app/components/hotwirebits/dashboard_card_component.rb +25 -0
  125. data/app/components/hotwirebits/data_table_component.html.erb +53 -0
  126. data/app/components/hotwirebits/data_table_component.rb +40 -0
  127. data/app/components/hotwirebits/data_view_component.html.erb +21 -0
  128. data/app/components/hotwirebits/data_view_component.rb +76 -0
  129. data/app/components/hotwirebits/date_picker_component.html.erb +8 -0
  130. data/app/components/hotwirebits/date_picker_component.rb +61 -0
  131. data/app/components/hotwirebits/date_range_picker_component.html.erb +28 -0
  132. data/app/components/hotwirebits/date_range_picker_component.rb +14 -0
  133. data/app/components/hotwirebits/device_frame_component.html.erb +40 -0
  134. data/app/components/hotwirebits/device_frame_component.rb +36 -0
  135. data/app/components/hotwirebits/device_mockup_component.html.erb +51 -0
  136. data/app/components/hotwirebits/device_mockup_component.rb +37 -0
  137. data/app/components/hotwirebits/dialog_component.html.erb +41 -0
  138. data/app/components/hotwirebits/dialog_component.rb +49 -0
  139. data/app/components/hotwirebits/diff_component.html.erb +22 -0
  140. data/app/components/hotwirebits/diff_component.rb +21 -0
  141. data/app/components/hotwirebits/diff_view_component.html.erb +22 -0
  142. data/app/components/hotwirebits/diff_view_component.rb +39 -0
  143. data/app/components/hotwirebits/digital_signature_component.html.erb +21 -0
  144. data/app/components/hotwirebits/digital_signature_component.rb +14 -0
  145. data/app/components/hotwirebits/divider_component.html.erb +11 -0
  146. data/app/components/hotwirebits/divider_component.rb +29 -0
  147. data/app/components/hotwirebits/dock_menu_component.html.erb +21 -0
  148. data/app/components/hotwirebits/dock_menu_component.rb +10 -0
  149. data/app/components/hotwirebits/drag_drop_list_component.html.erb +16 -0
  150. data/app/components/hotwirebits/drag_drop_list_component.rb +20 -0
  151. data/app/components/hotwirebits/drawer_component.html.erb +38 -0
  152. data/app/components/hotwirebits/drawer_component.rb +21 -0
  153. data/app/components/hotwirebits/dropdown_component.html.erb +27 -0
  154. data/app/components/hotwirebits/dropdown_component.rb +21 -0
  155. data/app/components/hotwirebits/dropzone_component.html.erb +16 -0
  156. data/app/components/hotwirebits/dropzone_component.rb +15 -0
  157. data/app/components/hotwirebits/empty_cart_component.html.erb +19 -0
  158. data/app/components/hotwirebits/empty_cart_component.rb +14 -0
  159. data/app/components/hotwirebits/empty_state_component.html.erb +20 -0
  160. data/app/components/hotwirebits/empty_state_component.rb +14 -0
  161. data/app/components/hotwirebits/error_page_component.html.erb +14 -0
  162. data/app/components/hotwirebits/error_page_component.rb +30 -0
  163. data/app/components/hotwirebits/faq_section_component.html.erb +26 -0
  164. data/app/components/hotwirebits/faq_section_component.rb +18 -0
  165. data/app/components/hotwirebits/feature_section_component.html.erb +27 -0
  166. data/app/components/hotwirebits/feature_section_component.rb +24 -0
  167. data/app/components/hotwirebits/feedback_component.html.erb +51 -0
  168. data/app/components/hotwirebits/feedback_component.rb +23 -0
  169. data/app/components/hotwirebits/fieldset_component.html.erb +11 -0
  170. data/app/components/hotwirebits/fieldset_component.rb +21 -0
  171. data/app/components/hotwirebits/file_browser_component.html.erb +35 -0
  172. data/app/components/hotwirebits/file_browser_component.rb +11 -0
  173. data/app/components/hotwirebits/file_input_component.html.erb +7 -0
  174. data/app/components/hotwirebits/file_input_component.rb +25 -0
  175. data/app/components/hotwirebits/file_upload_progress_component.html.erb +26 -0
  176. data/app/components/hotwirebits/file_upload_progress_component.rb +33 -0
  177. data/app/components/hotwirebits/flex_component.html.erb +3 -0
  178. data/app/components/hotwirebits/flex_component.rb +37 -0
  179. data/app/components/hotwirebits/float_label_component.html.erb +4 -0
  180. data/app/components/hotwirebits/float_label_component.rb +11 -0
  181. data/app/components/hotwirebits/fluid_component.html.erb +3 -0
  182. data/app/components/hotwirebits/fluid_component.rb +13 -0
  183. data/app/components/hotwirebits/flyout_menu_component.html.erb +35 -0
  184. data/app/components/hotwirebits/flyout_menu_component.rb +25 -0
  185. data/app/components/hotwirebits/footer_component.html.erb +43 -0
  186. data/app/components/hotwirebits/footer_component.rb +13 -0
  187. data/app/components/hotwirebits/form_fieldset_component.html.erb +9 -0
  188. data/app/components/hotwirebits/form_fieldset_component.rb +11 -0
  189. data/app/components/hotwirebits/form_group_component.html.erb +31 -0
  190. data/app/components/hotwirebits/form_group_component.rb +15 -0
  191. data/app/components/hotwirebits/gallery_component.html.erb +25 -0
  192. data/app/components/hotwirebits/gallery_component.rb +29 -0
  193. data/app/components/hotwirebits/grid_component.html.erb +3 -0
  194. data/app/components/hotwirebits/grid_component.rb +31 -0
  195. data/app/components/hotwirebits/group_component.html.erb +3 -0
  196. data/app/components/hotwirebits/group_component.rb +27 -0
  197. data/app/components/hotwirebits/header_component.html.erb +25 -0
  198. data/app/components/hotwirebits/header_component.rb +23 -0
  199. data/app/components/hotwirebits/header_section_component.html.erb +33 -0
  200. data/app/components/hotwirebits/header_section_component.rb +18 -0
  201. data/app/components/hotwirebits/hero_component.html.erb +35 -0
  202. data/app/components/hotwirebits/hero_component.rb +36 -0
  203. data/app/components/hotwirebits/highlight_component.html.erb +1 -0
  204. data/app/components/hotwirebits/highlight_component.rb +21 -0
  205. data/app/components/hotwirebits/hover3d_card_component.html.erb +10 -0
  206. data/app/components/hotwirebits/hover3d_card_component.rb +16 -0
  207. data/app/components/hotwirebits/hover_card_component.html.erb +19 -0
  208. data/app/components/hotwirebits/hover_card_component.rb +35 -0
  209. data/app/components/hotwirebits/hover_gallery_component.html.erb +23 -0
  210. data/app/components/hotwirebits/hover_gallery_component.rb +15 -0
  211. data/app/components/hotwirebits/icon_field_component.html.erb +9 -0
  212. data/app/components/hotwirebits/icon_field_component.rb +35 -0
  213. data/app/components/hotwirebits/ifta_label_component.html.erb +4 -0
  214. data/app/components/hotwirebits/ifta_label_component.rb +11 -0
  215. data/app/components/hotwirebits/image_compare_component.html.erb +21 -0
  216. data/app/components/hotwirebits/image_compare_component.rb +19 -0
  217. data/app/components/hotwirebits/image_component.html.erb +22 -0
  218. data/app/components/hotwirebits/image_component.rb +23 -0
  219. data/app/components/hotwirebits/image_zoom_component.html.erb +8 -0
  220. data/app/components/hotwirebits/image_zoom_component.rb +17 -0
  221. data/app/components/hotwirebits/incentive_component.html.erb +11 -0
  222. data/app/components/hotwirebits/incentive_component.rb +16 -0
  223. data/app/components/hotwirebits/indicator_badge_component.html.erb +8 -0
  224. data/app/components/hotwirebits/indicator_badge_component.rb +33 -0
  225. data/app/components/hotwirebits/indicator_component.html.erb +6 -0
  226. data/app/components/hotwirebits/indicator_component.rb +30 -0
  227. data/app/components/hotwirebits/inline_edit_component.html.erb +50 -0
  228. data/app/components/hotwirebits/inline_edit_component.rb +16 -0
  229. data/app/components/hotwirebits/inplace_component.html.erb +6 -0
  230. data/app/components/hotwirebits/inplace_component.rb +39 -0
  231. data/app/components/hotwirebits/input_component.html.erb +13 -0
  232. data/app/components/hotwirebits/input_component.rb +97 -0
  233. data/app/components/hotwirebits/input_group_component.html.erb +9 -0
  234. data/app/components/hotwirebits/input_group_component.rb +38 -0
  235. data/app/components/hotwirebits/input_number_component.html.erb +14 -0
  236. data/app/components/hotwirebits/input_number_component.rb +78 -0
  237. data/app/components/hotwirebits/input_otp_component.html.erb +6 -0
  238. data/app/components/hotwirebits/input_otp_component.rb +29 -0
  239. data/app/components/hotwirebits/input_tags_component.html.erb +12 -0
  240. data/app/components/hotwirebits/input_tags_component.rb +31 -0
  241. data/app/components/hotwirebits/join_component.html.erb +3 -0
  242. data/app/components/hotwirebits/join_component.rb +18 -0
  243. data/app/components/hotwirebits/json_input_component.html.erb +14 -0
  244. data/app/components/hotwirebits/json_input_component.rb +20 -0
  245. data/app/components/hotwirebits/kanban_board_component.html.erb +39 -0
  246. data/app/components/hotwirebits/kanban_board_component.rb +17 -0
  247. data/app/components/hotwirebits/kbd_component.html.erb +1 -0
  248. data/app/components/hotwirebits/kbd_component.rb +27 -0
  249. data/app/components/hotwirebits/knob_component.html.erb +16 -0
  250. data/app/components/hotwirebits/knob_component.rb +23 -0
  251. data/app/components/hotwirebits/label_component.html.erb +5 -0
  252. data/app/components/hotwirebits/label_component.rb +18 -0
  253. data/app/components/hotwirebits/lightbox_component.html.erb +30 -0
  254. data/app/components/hotwirebits/lightbox_component.rb +11 -0
  255. data/app/components/hotwirebits/like_button_component.html.erb +15 -0
  256. data/app/components/hotwirebits/like_button_component.rb +23 -0
  257. data/app/components/hotwirebits/list_component.html.erb +3 -0
  258. data/app/components/hotwirebits/list_component.rb +19 -0
  259. data/app/components/hotwirebits/listbox_component.html.erb +16 -0
  260. data/app/components/hotwirebits/listbox_component.rb +52 -0
  261. data/app/components/hotwirebits/loading_overlay_component.html.erb +12 -0
  262. data/app/components/hotwirebits/loading_overlay_component.rb +23 -0
  263. data/app/components/hotwirebits/logo_cloud_component.html.erb +20 -0
  264. data/app/components/hotwirebits/logo_cloud_component.rb +23 -0
  265. data/app/components/hotwirebits/logo_item_component.html.erb +7 -0
  266. data/app/components/hotwirebits/logo_item_component.rb +20 -0
  267. data/app/components/hotwirebits/mark_component.html.erb +1 -0
  268. data/app/components/hotwirebits/mark_component.rb +17 -0
  269. data/app/components/hotwirebits/marquee_component.html.erb +29 -0
  270. data/app/components/hotwirebits/marquee_component.rb +38 -0
  271. data/app/components/hotwirebits/mask_component.html.erb +3 -0
  272. data/app/components/hotwirebits/mask_component.rb +25 -0
  273. data/app/components/hotwirebits/mega_menu_component.html.erb +43 -0
  274. data/app/components/hotwirebits/mega_menu_component.rb +11 -0
  275. data/app/components/hotwirebits/menu_component.html.erb +32 -0
  276. data/app/components/hotwirebits/menu_component.rb +20 -0
  277. data/app/components/hotwirebits/menubar_component.html.erb +30 -0
  278. data/app/components/hotwirebits/menubar_component.rb +10 -0
  279. data/app/components/hotwirebits/meter_group_component.html.erb +16 -0
  280. data/app/components/hotwirebits/meter_group_component.rb +36 -0
  281. data/app/components/hotwirebits/month_picker_component.html.erb +25 -0
  282. data/app/components/hotwirebits/month_picker_component.rb +51 -0
  283. data/app/components/hotwirebits/month_picker_input_component.html.erb +20 -0
  284. data/app/components/hotwirebits/month_picker_input_component.rb +21 -0
  285. data/app/components/hotwirebits/multiselect_component.html.erb +18 -0
  286. data/app/components/hotwirebits/multiselect_component.rb +56 -0
  287. data/app/components/hotwirebits/native_select_component.html.erb +10 -0
  288. data/app/components/hotwirebits/native_select_component.rb +20 -0
  289. data/app/components/hotwirebits/nav_link_component.html.erb +9 -0
  290. data/app/components/hotwirebits/nav_link_component.rb +23 -0
  291. data/app/components/hotwirebits/navbar_component.html.erb +25 -0
  292. data/app/components/hotwirebits/navbar_component.rb +26 -0
  293. data/app/components/hotwirebits/navigation_menu_component.html.erb +43 -0
  294. data/app/components/hotwirebits/navigation_menu_component.rb +10 -0
  295. data/app/components/hotwirebits/newsletter_section_component.html.erb +18 -0
  296. data/app/components/hotwirebits/newsletter_section_component.rb +15 -0
  297. data/app/components/hotwirebits/notification_bell_component.html.erb +18 -0
  298. data/app/components/hotwirebits/notification_bell_component.rb +22 -0
  299. data/app/components/hotwirebits/notification_component.html.erb +28 -0
  300. data/app/components/hotwirebits/notification_component.rb +23 -0
  301. data/app/components/hotwirebits/number_formatter_component.html.erb +1 -0
  302. data/app/components/hotwirebits/number_formatter_component.rb +27 -0
  303. data/app/components/hotwirebits/number_input_component.html.erb +1 -0
  304. data/app/components/hotwirebits/number_input_component.rb +32 -0
  305. data/app/components/hotwirebits/order_summary_component.html.erb +37 -0
  306. data/app/components/hotwirebits/order_summary_component.rb +23 -0
  307. data/app/components/hotwirebits/org_chart_component.html.erb +34 -0
  308. data/app/components/hotwirebits/org_chart_component.rb +14 -0
  309. data/app/components/hotwirebits/page_heading_component.html.erb +28 -0
  310. data/app/components/hotwirebits/page_heading_component.rb +18 -0
  311. data/app/components/hotwirebits/pagination_component.html.erb +29 -0
  312. data/app/components/hotwirebits/pagination_component.rb +32 -0
  313. data/app/components/hotwirebits/paginator_component.html.erb +36 -0
  314. data/app/components/hotwirebits/paginator_component.rb +44 -0
  315. data/app/components/hotwirebits/panel_component.html.erb +14 -0
  316. data/app/components/hotwirebits/panel_component.rb +48 -0
  317. data/app/components/hotwirebits/password_input_component.html.erb +8 -0
  318. data/app/components/hotwirebits/password_input_component.rb +72 -0
  319. data/app/components/hotwirebits/password_strength_component.html.erb +18 -0
  320. data/app/components/hotwirebits/password_strength_component.rb +24 -0
  321. data/app/components/hotwirebits/password_toggle_component.html.erb +15 -0
  322. data/app/components/hotwirebits/password_toggle_component.rb +10 -0
  323. data/app/components/hotwirebits/permission_badge_component.html.erb +15 -0
  324. data/app/components/hotwirebits/permission_badge_component.rb +33 -0
  325. data/app/components/hotwirebits/phone_input_component.html.erb +1 -0
  326. data/app/components/hotwirebits/phone_input_component.rb +29 -0
  327. data/app/components/hotwirebits/phone_mockup_component.html.erb +12 -0
  328. data/app/components/hotwirebits/phone_mockup_component.rb +30 -0
  329. data/app/components/hotwirebits/popover_component.html.erb +20 -0
  330. data/app/components/hotwirebits/popover_component.rb +45 -0
  331. data/app/components/hotwirebits/portal_component.html.erb +3 -0
  332. data/app/components/hotwirebits/portal_component.rb +10 -0
  333. data/app/components/hotwirebits/pricing_section_component.html.erb +46 -0
  334. data/app/components/hotwirebits/pricing_section_component.rb +19 -0
  335. data/app/components/hotwirebits/product_list_component.html.erb +24 -0
  336. data/app/components/hotwirebits/product_list_component.rb +21 -0
  337. data/app/components/hotwirebits/product_overview_component.html.erb +59 -0
  338. data/app/components/hotwirebits/product_overview_component.rb +19 -0
  339. data/app/components/hotwirebits/product_quickview_component.html.erb +45 -0
  340. data/app/components/hotwirebits/product_quickview_component.rb +15 -0
  341. data/app/components/hotwirebits/progress_component.html.erb +10 -0
  342. data/app/components/hotwirebits/progress_component.rb +49 -0
  343. data/app/components/hotwirebits/progress_ring_component.html.erb +26 -0
  344. data/app/components/hotwirebits/progress_ring_component.rb +47 -0
  345. data/app/components/hotwirebits/promo_section_component.html.erb +31 -0
  346. data/app/components/hotwirebits/promo_section_component.rb +30 -0
  347. data/app/components/hotwirebits/qr_code_component.html.erb +19 -0
  348. data/app/components/hotwirebits/qr_code_component.rb +177 -0
  349. data/app/components/hotwirebits/radio_component.html.erb +6 -0
  350. data/app/components/hotwirebits/radio_component.rb +40 -0
  351. data/app/components/hotwirebits/range_slider_component.html.erb +9 -0
  352. data/app/components/hotwirebits/range_slider_component.rb +57 -0
  353. data/app/components/hotwirebits/rating_component.html.erb +11 -0
  354. data/app/components/hotwirebits/rating_component.rb +53 -0
  355. data/app/components/hotwirebits/resizable_component.html.erb +19 -0
  356. data/app/components/hotwirebits/resizable_component.rb +35 -0
  357. data/app/components/hotwirebits/review_component.html.erb +36 -0
  358. data/app/components/hotwirebits/review_component.rb +19 -0
  359. data/app/components/hotwirebits/rich_text_editor_component.html.erb +55 -0
  360. data/app/components/hotwirebits/rich_text_editor_component.rb +15 -0
  361. data/app/components/hotwirebits/scroll_area_component.html.erb +3 -0
  362. data/app/components/hotwirebits/scroll_area_component.rb +28 -0
  363. data/app/components/hotwirebits/search_component.html.erb +56 -0
  364. data/app/components/hotwirebits/search_component.rb +21 -0
  365. data/app/components/hotwirebits/search_input_component.html.erb +6 -0
  366. data/app/components/hotwirebits/search_input_component.rb +50 -0
  367. data/app/components/hotwirebits/section_heading_component.html.erb +6 -0
  368. data/app/components/hotwirebits/section_heading_component.rb +26 -0
  369. data/app/components/hotwirebits/select_component.html.erb +16 -0
  370. data/app/components/hotwirebits/select_component.rb +38 -0
  371. data/app/components/hotwirebits/semi_circle_progress_component.html.erb +9 -0
  372. data/app/components/hotwirebits/semi_circle_progress_component.rb +52 -0
  373. data/app/components/hotwirebits/separator_component.html.erb +9 -0
  374. data/app/components/hotwirebits/separator_component.rb +26 -0
  375. data/app/components/hotwirebits/sheet_component.html.erb +42 -0
  376. data/app/components/hotwirebits/sheet_component.rb +44 -0
  377. data/app/components/hotwirebits/shopping_cart_component.html.erb +46 -0
  378. data/app/components/hotwirebits/shopping_cart_component.rb +17 -0
  379. data/app/components/hotwirebits/sidebar_component.html.erb +40 -0
  380. data/app/components/hotwirebits/sidebar_component.rb +29 -0
  381. data/app/components/hotwirebits/simple_grid_component.html.erb +3 -0
  382. data/app/components/hotwirebits/simple_grid_component.rb +23 -0
  383. data/app/components/hotwirebits/skeleton_card_component.html.erb +15 -0
  384. data/app/components/hotwirebits/skeleton_card_component.rb +17 -0
  385. data/app/components/hotwirebits/skeleton_component.html.erb +5 -0
  386. data/app/components/hotwirebits/skeleton_component.rb +39 -0
  387. data/app/components/hotwirebits/slider_component.html.erb +3 -0
  388. data/app/components/hotwirebits/slider_component.rb +34 -0
  389. data/app/components/hotwirebits/social_share_component.html.erb +20 -0
  390. data/app/components/hotwirebits/social_share_component.rb +25 -0
  391. data/app/components/hotwirebits/space_component.html.erb +1 -0
  392. data/app/components/hotwirebits/space_component.rb +22 -0
  393. data/app/components/hotwirebits/speed_dial_component.html.erb +24 -0
  394. data/app/components/hotwirebits/speed_dial_component.rb +41 -0
  395. data/app/components/hotwirebits/speed_dial_fab_component.html.erb +30 -0
  396. data/app/components/hotwirebits/speed_dial_fab_component.rb +27 -0
  397. data/app/components/hotwirebits/spinner_component.html.erb +10 -0
  398. data/app/components/hotwirebits/spinner_component.rb +20 -0
  399. data/app/components/hotwirebits/split_button_component.html.erb +20 -0
  400. data/app/components/hotwirebits/split_button_component.rb +33 -0
  401. data/app/components/hotwirebits/splitter_component.html.erb +9 -0
  402. data/app/components/hotwirebits/splitter_component.rb +38 -0
  403. data/app/components/hotwirebits/spoiler_component.html.erb +17 -0
  404. data/app/components/hotwirebits/spoiler_component.rb +12 -0
  405. data/app/components/hotwirebits/stack_component.html.erb +3 -0
  406. data/app/components/hotwirebits/stack_component.rb +28 -0
  407. data/app/components/hotwirebits/stacked_list_component.html.erb +20 -0
  408. data/app/components/hotwirebits/stacked_list_component.rb +18 -0
  409. data/app/components/hotwirebits/stat_component.html.erb +21 -0
  410. data/app/components/hotwirebits/stat_component.rb +26 -0
  411. data/app/components/hotwirebits/stats_component.html.erb +15 -0
  412. data/app/components/hotwirebits/stats_component.rb +25 -0
  413. data/app/components/hotwirebits/status_bar_component.html.erb +13 -0
  414. data/app/components/hotwirebits/status_bar_component.rb +20 -0
  415. data/app/components/hotwirebits/status_component.html.erb +6 -0
  416. data/app/components/hotwirebits/status_component.rb +30 -0
  417. data/app/components/hotwirebits/status_dot_component.html.erb +11 -0
  418. data/app/components/hotwirebits/status_dot_component.rb +37 -0
  419. data/app/components/hotwirebits/stepper_form_component.html.erb +55 -0
  420. data/app/components/hotwirebits/stepper_form_component.rb +23 -0
  421. data/app/components/hotwirebits/steps_component.html.erb +45 -0
  422. data/app/components/hotwirebits/steps_component.rb +44 -0
  423. data/app/components/hotwirebits/swap_component.html.erb +18 -0
  424. data/app/components/hotwirebits/swap_component.rb +29 -0
  425. data/app/components/hotwirebits/switch_component.html.erb +9 -0
  426. data/app/components/hotwirebits/switch_component.rb +51 -0
  427. data/app/components/hotwirebits/table_component.html.erb +5 -0
  428. data/app/components/hotwirebits/table_component.rb +27 -0
  429. data/app/components/hotwirebits/table_of_contents_component.html.erb +12 -0
  430. data/app/components/hotwirebits/table_of_contents_component.rb +23 -0
  431. data/app/components/hotwirebits/tabs_component.html.erb +43 -0
  432. data/app/components/hotwirebits/tabs_component.rb +58 -0
  433. data/app/components/hotwirebits/tag_component.html.erb +3 -0
  434. data/app/components/hotwirebits/tag_component.rb +35 -0
  435. data/app/components/hotwirebits/tag_input_component.html.erb +14 -0
  436. data/app/components/hotwirebits/tag_input_component.rb +56 -0
  437. data/app/components/hotwirebits/team_section_component.html.erb +39 -0
  438. data/app/components/hotwirebits/team_section_component.rb +20 -0
  439. data/app/components/hotwirebits/terminal_component.html.erb +21 -0
  440. data/app/components/hotwirebits/terminal_component.rb +11 -0
  441. data/app/components/hotwirebits/testimonial_component.html.erb +29 -0
  442. data/app/components/hotwirebits/testimonial_component.rb +22 -0
  443. data/app/components/hotwirebits/testimonials_section_component.html.erb +34 -0
  444. data/app/components/hotwirebits/testimonials_section_component.rb +23 -0
  445. data/app/components/hotwirebits/text_gradient_component.html.erb +3 -0
  446. data/app/components/hotwirebits/text_gradient_component.rb +18 -0
  447. data/app/components/hotwirebits/text_rotate_component.html.erb +7 -0
  448. data/app/components/hotwirebits/text_rotate_component.rb +24 -0
  449. data/app/components/hotwirebits/textarea_component.html.erb +1 -0
  450. data/app/components/hotwirebits/textarea_component.rb +35 -0
  451. data/app/components/hotwirebits/theme_controller_component.html.erb +13 -0
  452. data/app/components/hotwirebits/theme_controller_component.rb +11 -0
  453. data/app/components/hotwirebits/theme_icon_component.html.erb +3 -0
  454. data/app/components/hotwirebits/theme_icon_component.rb +18 -0
  455. data/app/components/hotwirebits/theme_selector_component.html.erb +27 -0
  456. data/app/components/hotwirebits/theme_selector_component.rb +11 -0
  457. data/app/components/hotwirebits/time_picker_component.html.erb +29 -0
  458. data/app/components/hotwirebits/time_picker_component.rb +28 -0
  459. data/app/components/hotwirebits/timeline_component.html.erb +24 -0
  460. data/app/components/hotwirebits/timeline_component.rb +17 -0
  461. data/app/components/hotwirebits/toast_component.html.erb +34 -0
  462. data/app/components/hotwirebits/toast_component.rb +47 -0
  463. data/app/components/hotwirebits/toggle_button_component.html.erb +4 -0
  464. data/app/components/hotwirebits/toggle_button_component.rb +31 -0
  465. data/app/components/hotwirebits/toggle_button_group_component.html.erb +8 -0
  466. data/app/components/hotwirebits/toggle_button_group_component.rb +54 -0
  467. data/app/components/hotwirebits/toggle_component.html.erb +3 -0
  468. data/app/components/hotwirebits/toggle_component.rb +38 -0
  469. data/app/components/hotwirebits/toolbar_component.html.erb +18 -0
  470. data/app/components/hotwirebits/toolbar_component.rb +50 -0
  471. data/app/components/hotwirebits/tooltip_component.html.erb +16 -0
  472. data/app/components/hotwirebits/tooltip_component.rb +32 -0
  473. data/app/components/hotwirebits/tree_view_component.html.erb +7 -0
  474. data/app/components/hotwirebits/tree_view_component.rb +47 -0
  475. data/app/components/hotwirebits/two_factor_component.html.erb +26 -0
  476. data/app/components/hotwirebits/two_factor_component.rb +14 -0
  477. data/app/components/hotwirebits/typing_indicator_component.html.erb +5 -0
  478. data/app/components/hotwirebits/typing_indicator_component.rb +33 -0
  479. data/app/components/hotwirebits/typography_component.html.erb +3 -0
  480. data/app/components/hotwirebits/typography_component.rb +35 -0
  481. data/app/components/hotwirebits/validator_component.html.erb +20 -0
  482. data/app/components/hotwirebits/validator_component.rb +12 -0
  483. data/app/components/hotwirebits/version_diff_component.html.erb +17 -0
  484. data/app/components/hotwirebits/version_diff_component.rb +38 -0
  485. data/app/components/hotwirebits/video_player_component.html.erb +11 -0
  486. data/app/components/hotwirebits/video_player_component.rb +29 -0
  487. data/app/components/hotwirebits/voice_recorder_component.html.erb +29 -0
  488. data/app/components/hotwirebits/voice_recorder_component.rb +14 -0
  489. data/app/components/hotwirebits/window_mockup_component.html.erb +20 -0
  490. data/app/components/hotwirebits/window_mockup_component.rb +11 -0
  491. data/app/helpers/hotwirebits_helper.rb +738 -0
  492. data/app/javascript/controllers/hotwirebits/index.js +216 -0
  493. data/app/javascript/controllers/hotwirebits/rb_accordion_controller.js +16 -0
  494. data/app/javascript/controllers/hotwirebits/rb_activity_feed_controller.js +11 -0
  495. data/app/javascript/controllers/hotwirebits/rb_ai_chat_controller.js +21 -0
  496. data/app/javascript/controllers/hotwirebits/rb_alert_controller.js +24 -0
  497. data/app/javascript/controllers/hotwirebits/rb_angle_slider_controller.js +11 -0
  498. data/app/javascript/controllers/hotwirebits/rb_animated_number_controller.js +7 -0
  499. data/app/javascript/controllers/hotwirebits/rb_autocomplete_controller.js +34 -0
  500. data/app/javascript/controllers/hotwirebits/rb_badge_controller.js +8 -0
  501. data/app/javascript/controllers/hotwirebits/rb_banner_controller.js +27 -0
  502. data/app/javascript/controllers/hotwirebits/rb_burger_controller.js +25 -0
  503. data/app/javascript/controllers/hotwirebits/rb_calendar_controller.js +85 -0
  504. data/app/javascript/controllers/hotwirebits/rb_carousel_controller.js +74 -0
  505. data/app/javascript/controllers/hotwirebits/rb_clipboard_controller.js +42 -0
  506. data/app/javascript/controllers/hotwirebits/rb_code_highlight_controller.js +7 -0
  507. data/app/javascript/controllers/hotwirebits/rb_collapsible_controller.js +51 -0
  508. data/app/javascript/controllers/hotwirebits/rb_color_input_controller.js +7 -0
  509. data/app/javascript/controllers/hotwirebits/rb_color_picker_controller.js +7 -0
  510. data/app/javascript/controllers/hotwirebits/rb_combobox_controller.js +91 -0
  511. data/app/javascript/controllers/hotwirebits/rb_command_bar_controller.js +32 -0
  512. data/app/javascript/controllers/hotwirebits/rb_compare_controller.js +18 -0
  513. data/app/javascript/controllers/hotwirebits/rb_confirm_dialog_controller.js +11 -0
  514. data/app/javascript/controllers/hotwirebits/rb_confirm_popup_controller.js +10 -0
  515. data/app/javascript/controllers/hotwirebits/rb_context_menu_controller.js +27 -0
  516. data/app/javascript/controllers/hotwirebits/rb_cookie_consent_controller.js +60 -0
  517. data/app/javascript/controllers/hotwirebits/rb_cookie_settings_controller.js +9 -0
  518. data/app/javascript/controllers/hotwirebits/rb_countdown_controller.js +60 -0
  519. data/app/javascript/controllers/hotwirebits/rb_data_view_controller.js +10 -0
  520. data/app/javascript/controllers/hotwirebits/rb_date_range_controller.js +9 -0
  521. data/app/javascript/controllers/hotwirebits/rb_datepicker_controller.js +107 -0
  522. data/app/javascript/controllers/hotwirebits/rb_dialog_controller.js +68 -0
  523. data/app/javascript/controllers/hotwirebits/rb_drag_drop_controller.js +21 -0
  524. data/app/javascript/controllers/hotwirebits/rb_drawer_controller.js +69 -0
  525. data/app/javascript/controllers/hotwirebits/rb_dropdown_controller.js +73 -0
  526. data/app/javascript/controllers/hotwirebits/rb_feedback_controller.js +50 -0
  527. data/app/javascript/controllers/hotwirebits/rb_file_browser_controller.js +9 -0
  528. data/app/javascript/controllers/hotwirebits/rb_highlight_controller.js +47 -0
  529. data/app/javascript/controllers/hotwirebits/rb_hover_3d_controller.js +7 -0
  530. data/app/javascript/controllers/hotwirebits/rb_hover_card_controller.js +19 -0
  531. data/app/javascript/controllers/hotwirebits/rb_hover_gallery_controller.js +7 -0
  532. data/app/javascript/controllers/hotwirebits/rb_image_compare_controller.js +7 -0
  533. data/app/javascript/controllers/hotwirebits/rb_image_controller.js +7 -0
  534. data/app/javascript/controllers/hotwirebits/rb_image_zoom_controller.js +7 -0
  535. data/app/javascript/controllers/hotwirebits/rb_inline_edit_controller.js +7 -0
  536. data/app/javascript/controllers/hotwirebits/rb_inplace_controller.js +7 -0
  537. data/app/javascript/controllers/hotwirebits/rb_input_number_controller.js +9 -0
  538. data/app/javascript/controllers/hotwirebits/rb_json_input_controller.js +7 -0
  539. data/app/javascript/controllers/hotwirebits/rb_kanban_controller.js +78 -0
  540. data/app/javascript/controllers/hotwirebits/rb_knob_controller.js +7 -0
  541. data/app/javascript/controllers/hotwirebits/rb_lightbox_controller.js +36 -0
  542. data/app/javascript/controllers/hotwirebits/rb_like_controller.js +7 -0
  543. data/app/javascript/controllers/hotwirebits/rb_listbox_controller.js +7 -0
  544. data/app/javascript/controllers/hotwirebits/rb_marquee_controller.js +68 -0
  545. data/app/javascript/controllers/hotwirebits/rb_menubar_controller.js +78 -0
  546. data/app/javascript/controllers/hotwirebits/rb_month_picker_controller.js +7 -0
  547. data/app/javascript/controllers/hotwirebits/rb_month_picker_input_controller.js +7 -0
  548. data/app/javascript/controllers/hotwirebits/rb_multiselect_controller.js +83 -0
  549. data/app/javascript/controllers/hotwirebits/rb_nav_menu_controller.js +7 -0
  550. data/app/javascript/controllers/hotwirebits/rb_newsletter_controller.js +7 -0
  551. data/app/javascript/controllers/hotwirebits/rb_notification_controller.js +7 -0
  552. data/app/javascript/controllers/hotwirebits/rb_otp_controller.js +54 -0
  553. data/app/javascript/controllers/hotwirebits/rb_paginator_controller.js +7 -0
  554. data/app/javascript/controllers/hotwirebits/rb_panel_controller.js +12 -0
  555. data/app/javascript/controllers/hotwirebits/rb_password_controller.js +36 -0
  556. data/app/javascript/controllers/hotwirebits/rb_password_strength_controller.js +7 -0
  557. data/app/javascript/controllers/hotwirebits/rb_password_toggle_controller.js +7 -0
  558. data/app/javascript/controllers/hotwirebits/rb_popover_controller.js +61 -0
  559. data/app/javascript/controllers/hotwirebits/rb_portal_controller.js +7 -0
  560. data/app/javascript/controllers/hotwirebits/rb_quickview_controller.js +7 -0
  561. data/app/javascript/controllers/hotwirebits/rb_range_slider_controller.js +7 -0
  562. data/app/javascript/controllers/hotwirebits/rb_rating_controller.js +55 -0
  563. data/app/javascript/controllers/hotwirebits/rb_resizable_controller.js +82 -0
  564. data/app/javascript/controllers/hotwirebits/rb_rich_text_editor_controller.js +7 -0
  565. data/app/javascript/controllers/hotwirebits/rb_search_controller.js +70 -0
  566. data/app/javascript/controllers/hotwirebits/rb_sheet_controller.js +43 -0
  567. data/app/javascript/controllers/hotwirebits/rb_sidebar_controller.js +66 -0
  568. data/app/javascript/controllers/hotwirebits/rb_signature_controller.js +7 -0
  569. data/app/javascript/controllers/hotwirebits/rb_speed_dial_controller.js +64 -0
  570. data/app/javascript/controllers/hotwirebits/rb_splitter_controller.js +27 -0
  571. data/app/javascript/controllers/hotwirebits/rb_spoiler_controller.js +26 -0
  572. data/app/javascript/controllers/hotwirebits/rb_stepper_form_controller.js +11 -0
  573. data/app/javascript/controllers/hotwirebits/rb_steps_controller.js +46 -0
  574. data/app/javascript/controllers/hotwirebits/rb_swap_controller.js +22 -0
  575. data/app/javascript/controllers/hotwirebits/rb_switch_controller.js +33 -0
  576. data/app/javascript/controllers/hotwirebits/rb_tabs_controller.js +46 -0
  577. data/app/javascript/controllers/hotwirebits/rb_tag_input_controller.js +19 -0
  578. data/app/javascript/controllers/hotwirebits/rb_tags_controller.js +50 -0
  579. data/app/javascript/controllers/hotwirebits/rb_text_rotate_controller.js +7 -0
  580. data/app/javascript/controllers/hotwirebits/rb_theme_controller.js +48 -0
  581. data/app/javascript/controllers/hotwirebits/rb_theme_selector_controller.js +7 -0
  582. data/app/javascript/controllers/hotwirebits/rb_time_picker_controller.js +7 -0
  583. data/app/javascript/controllers/hotwirebits/rb_toast_controller.js +43 -0
  584. data/app/javascript/controllers/hotwirebits/rb_toggle_button_controller.js +9 -0
  585. data/app/javascript/controllers/hotwirebits/rb_toggle_button_group_controller.js +12 -0
  586. data/app/javascript/controllers/hotwirebits/rb_toggle_controller.js +28 -0
  587. data/app/javascript/controllers/hotwirebits/rb_tooltip_controller.js +7 -0
  588. data/app/javascript/controllers/hotwirebits/rb_tree_controller.js +58 -0
  589. data/app/javascript/controllers/hotwirebits/rb_two_factor_controller.js +7 -0
  590. data/app/javascript/controllers/hotwirebits/rb_validator_controller.js +7 -0
  591. data/app/javascript/controllers/hotwirebits/rb_voice_recorder_controller.js +7 -0
  592. data/app/views/hotwirebits/_accordion.html.erb +26 -0
  593. data/app/views/hotwirebits/_activity_feed.html.erb +43 -0
  594. data/app/views/hotwirebits/_affix.html.erb +6 -0
  595. data/app/views/hotwirebits/_ai_chat.html.erb +35 -0
  596. data/app/views/hotwirebits/_alert.html.erb +53 -0
  597. data/app/views/hotwirebits/_alert_dialog.html.erb +33 -0
  598. data/app/views/hotwirebits/_anchor.html.erb +12 -0
  599. data/app/views/hotwirebits/_angle_slider.html.erb +12 -0
  600. data/app/views/hotwirebits/_animated_number.html.erb +11 -0
  601. data/app/views/hotwirebits/_app_shell.html.erb +25 -0
  602. data/app/views/hotwirebits/_aspect_ratio.html.erb +6 -0
  603. data/app/views/hotwirebits/_auth_block.html.erb +66 -0
  604. data/app/views/hotwirebits/_autocomplete.html.erb +8 -0
  605. data/app/views/hotwirebits/_avatar.html.erb +32 -0
  606. data/app/views/hotwirebits/_background_image.html.erb +12 -0
  607. data/app/views/hotwirebits/_badge.html.erb +32 -0
  608. data/app/views/hotwirebits/_banner.html.erb +52 -0
  609. data/app/views/hotwirebits/_bento_grid.html.erb +10 -0
  610. data/app/views/hotwirebits/_blog_section.html.erb +38 -0
  611. data/app/views/hotwirebits/_bottom_navigation.html.erb +24 -0
  612. data/app/views/hotwirebits/_box.html.erb +6 -0
  613. data/app/views/hotwirebits/_breadcrumb.html.erb +28 -0
  614. data/app/views/hotwirebits/_breadcrumb_advanced.html.erb +56 -0
  615. data/app/views/hotwirebits/_browser_mockup.html.erb +25 -0
  616. data/app/views/hotwirebits/_burger.html.erb +23 -0
  617. data/app/views/hotwirebits/_button.html.erb +59 -0
  618. data/app/views/hotwirebits/_calendar.html.erb +73 -0
  619. data/app/views/hotwirebits/_card.html.erb +23 -0
  620. data/app/views/hotwirebits/_card_heading.html.erb +16 -0
  621. data/app/views/hotwirebits/_carousel.html.erb +53 -0
  622. data/app/views/hotwirebits/_center.html.erb +6 -0
  623. data/app/views/hotwirebits/_chart.html.erb +71 -0
  624. data/app/views/hotwirebits/_chat_bubble.html.erb +30 -0
  625. data/app/views/hotwirebits/_checkbox.html.erb +25 -0
  626. data/app/views/hotwirebits/_checkout_form.html.erb +43 -0
  627. data/app/views/hotwirebits/_chip.html.erb +30 -0
  628. data/app/views/hotwirebits/_clipboard.html.erb +29 -0
  629. data/app/views/hotwirebits/_close_button.html.erb +6 -0
  630. data/app/views/hotwirebits/_code_block.html.erb +20 -0
  631. data/app/views/hotwirebits/_code_highlight.html.erb +9 -0
  632. data/app/views/hotwirebits/_code_mockup.html.erb +16 -0
  633. data/app/views/hotwirebits/_collapsible.html.erb +20 -0
  634. data/app/views/hotwirebits/_color_input.html.erb +22 -0
  635. data/app/views/hotwirebits/_color_picker.html.erb +9 -0
  636. data/app/views/hotwirebits/_color_swatch.html.erb +4 -0
  637. data/app/views/hotwirebits/_combobox.html.erb +18 -0
  638. data/app/views/hotwirebits/_command_bar.html.erb +36 -0
  639. data/app/views/hotwirebits/_compare.html.erb +24 -0
  640. data/app/views/hotwirebits/_confirm_dialog.html.erb +20 -0
  641. data/app/views/hotwirebits/_confirm_popup.html.erb +19 -0
  642. data/app/views/hotwirebits/_contact_section.html.erb +56 -0
  643. data/app/views/hotwirebits/_container.html.erb +21 -0
  644. data/app/views/hotwirebits/_context_menu.html.erb +30 -0
  645. data/app/views/hotwirebits/_cookie_consent.html.erb +26 -0
  646. data/app/views/hotwirebits/_cookie_settings.html.erb +51 -0
  647. data/app/views/hotwirebits/_countdown.html.erb +11 -0
  648. data/app/views/hotwirebits/_cta_section.html.erb +36 -0
  649. data/app/views/hotwirebits/_dashboard_card.html.erb +35 -0
  650. data/app/views/hotwirebits/_data_table.html.erb +56 -0
  651. data/app/views/hotwirebits/_data_view.html.erb +24 -0
  652. data/app/views/hotwirebits/_date_picker.html.erb +11 -0
  653. data/app/views/hotwirebits/_date_range_picker.html.erb +31 -0
  654. data/app/views/hotwirebits/_device_frame.html.erb +43 -0
  655. data/app/views/hotwirebits/_device_mockup.html.erb +54 -0
  656. data/app/views/hotwirebits/_dialog.html.erb +58 -0
  657. data/app/views/hotwirebits/_diff.html.erb +25 -0
  658. data/app/views/hotwirebits/_diff_view.html.erb +25 -0
  659. data/app/views/hotwirebits/_digital_signature.html.erb +24 -0
  660. data/app/views/hotwirebits/_divider.html.erb +22 -0
  661. data/app/views/hotwirebits/_dock_menu.html.erb +24 -0
  662. data/app/views/hotwirebits/_drag_drop_list.html.erb +19 -0
  663. data/app/views/hotwirebits/_drawer.html.erb +41 -0
  664. data/app/views/hotwirebits/_dropdown.html.erb +33 -0
  665. data/app/views/hotwirebits/_dropzone.html.erb +19 -0
  666. data/app/views/hotwirebits/_empty_cart.html.erb +22 -0
  667. data/app/views/hotwirebits/_empty_state.html.erb +29 -0
  668. data/app/views/hotwirebits/_error_page.html.erb +17 -0
  669. data/app/views/hotwirebits/_faq_section.html.erb +29 -0
  670. data/app/views/hotwirebits/_feature_section.html.erb +30 -0
  671. data/app/views/hotwirebits/_feedback.html.erb +54 -0
  672. data/app/views/hotwirebits/_fieldset.html.erb +14 -0
  673. data/app/views/hotwirebits/_file_browser.html.erb +38 -0
  674. data/app/views/hotwirebits/_file_input.html.erb +10 -0
  675. data/app/views/hotwirebits/_file_upload_progress.html.erb +29 -0
  676. data/app/views/hotwirebits/_flex.html.erb +6 -0
  677. data/app/views/hotwirebits/_float_label.html.erb +7 -0
  678. data/app/views/hotwirebits/_fluid.html.erb +6 -0
  679. data/app/views/hotwirebits/_flyout_menu.html.erb +38 -0
  680. data/app/views/hotwirebits/_footer.html.erb +46 -0
  681. data/app/views/hotwirebits/_form_group.html.erb +43 -0
  682. data/app/views/hotwirebits/_gallery.html.erb +28 -0
  683. data/app/views/hotwirebits/_grid.html.erb +14 -0
  684. data/app/views/hotwirebits/_group.html.erb +6 -0
  685. data/app/views/hotwirebits/_header.html.erb +28 -0
  686. data/app/views/hotwirebits/_header_section.html.erb +36 -0
  687. data/app/views/hotwirebits/_hero.html.erb +38 -0
  688. data/app/views/hotwirebits/_highlight.html.erb +4 -0
  689. data/app/views/hotwirebits/_hover_3d_card.html.erb +13 -0
  690. data/app/views/hotwirebits/_hover_card.html.erb +22 -0
  691. data/app/views/hotwirebits/_hover_gallery.html.erb +26 -0
  692. data/app/views/hotwirebits/_icon_field.html.erb +12 -0
  693. data/app/views/hotwirebits/_ifta_label.html.erb +7 -0
  694. data/app/views/hotwirebits/_image.html.erb +22 -0
  695. data/app/views/hotwirebits/_image_compare.html.erb +24 -0
  696. data/app/views/hotwirebits/_image_zoom.html.erb +11 -0
  697. data/app/views/hotwirebits/_incentive.html.erb +14 -0
  698. data/app/views/hotwirebits/_indicator.html.erb +9 -0
  699. data/app/views/hotwirebits/_indicator_badge.html.erb +11 -0
  700. data/app/views/hotwirebits/_inline_edit.html.erb +53 -0
  701. data/app/views/hotwirebits/_inplace.html.erb +9 -0
  702. data/app/views/hotwirebits/_input.html.erb +33 -0
  703. data/app/views/hotwirebits/_input_group.html.erb +12 -0
  704. data/app/views/hotwirebits/_input_number.html.erb +17 -0
  705. data/app/views/hotwirebits/_input_otp.html.erb +9 -0
  706. data/app/views/hotwirebits/_input_tags.html.erb +15 -0
  707. data/app/views/hotwirebits/_join.html.erb +6 -0
  708. data/app/views/hotwirebits/_json_input.html.erb +17 -0
  709. data/app/views/hotwirebits/_kanban_board.html.erb +42 -0
  710. data/app/views/hotwirebits/_kbd.html.erb +17 -0
  711. data/app/views/hotwirebits/_knob.html.erb +19 -0
  712. data/app/views/hotwirebits/_label.html.erb +8 -0
  713. data/app/views/hotwirebits/_lightbox.html.erb +33 -0
  714. data/app/views/hotwirebits/_like_button.html.erb +18 -0
  715. data/app/views/hotwirebits/_list.html.erb +6 -0
  716. data/app/views/hotwirebits/_listbox.html.erb +19 -0
  717. data/app/views/hotwirebits/_loading_overlay.html.erb +15 -0
  718. data/app/views/hotwirebits/_logo_cloud.html.erb +23 -0
  719. data/app/views/hotwirebits/_logo_item.html.erb +10 -0
  720. data/app/views/hotwirebits/_mark.html.erb +4 -0
  721. data/app/views/hotwirebits/_marquee.html.erb +32 -0
  722. data/app/views/hotwirebits/_mask.html.erb +6 -0
  723. data/app/views/hotwirebits/_mega_menu.html.erb +46 -0
  724. data/app/views/hotwirebits/_menu.html.erb +35 -0
  725. data/app/views/hotwirebits/_menubar.html.erb +33 -0
  726. data/app/views/hotwirebits/_meter_group.html.erb +19 -0
  727. data/app/views/hotwirebits/_month_picker.html.erb +28 -0
  728. data/app/views/hotwirebits/_month_picker_input.html.erb +23 -0
  729. data/app/views/hotwirebits/_multiselect.html.erb +21 -0
  730. data/app/views/hotwirebits/_native_select.html.erb +13 -0
  731. data/app/views/hotwirebits/_nav_link.html.erb +12 -0
  732. data/app/views/hotwirebits/_navbar.html.erb +30 -0
  733. data/app/views/hotwirebits/_navigation_menu.html.erb +46 -0
  734. data/app/views/hotwirebits/_newsletter_section.html.erb +21 -0
  735. data/app/views/hotwirebits/_notification.html.erb +31 -0
  736. data/app/views/hotwirebits/_notification_bell.html.erb +21 -0
  737. data/app/views/hotwirebits/_number_formatter.html.erb +4 -0
  738. data/app/views/hotwirebits/_number_input.html.erb +4 -0
  739. data/app/views/hotwirebits/_order_summary.html.erb +40 -0
  740. data/app/views/hotwirebits/_org_chart.html.erb +37 -0
  741. data/app/views/hotwirebits/_page_heading.html.erb +31 -0
  742. data/app/views/hotwirebits/_pagination.html.erb +46 -0
  743. data/app/views/hotwirebits/_paginator.html.erb +39 -0
  744. data/app/views/hotwirebits/_panel.html.erb +17 -0
  745. data/app/views/hotwirebits/_password_input.html.erb +11 -0
  746. data/app/views/hotwirebits/_password_strength.html.erb +21 -0
  747. data/app/views/hotwirebits/_password_toggle.html.erb +18 -0
  748. data/app/views/hotwirebits/_permission_badge.html.erb +18 -0
  749. data/app/views/hotwirebits/_phone_input.html.erb +4 -0
  750. data/app/views/hotwirebits/_phone_mockup.html.erb +15 -0
  751. data/app/views/hotwirebits/_popover.html.erb +23 -0
  752. data/app/views/hotwirebits/_portal.html.erb +6 -0
  753. data/app/views/hotwirebits/_pricing.html.erb +55 -0
  754. data/app/views/hotwirebits/_pricing_section.html.erb +49 -0
  755. data/app/views/hotwirebits/_product_list.html.erb +27 -0
  756. data/app/views/hotwirebits/_product_overview.html.erb +62 -0
  757. data/app/views/hotwirebits/_product_quickview.html.erb +48 -0
  758. data/app/views/hotwirebits/_progress.html.erb +13 -0
  759. data/app/views/hotwirebits/_progress_ring.html.erb +29 -0
  760. data/app/views/hotwirebits/_promo_section.html.erb +34 -0
  761. data/app/views/hotwirebits/_qr_code.html.erb +22 -0
  762. data/app/views/hotwirebits/_radio.html.erb +9 -0
  763. data/app/views/hotwirebits/_range_slider.html.erb +12 -0
  764. data/app/views/hotwirebits/_rating.html.erb +14 -0
  765. data/app/views/hotwirebits/_resizable.html.erb +22 -0
  766. data/app/views/hotwirebits/_review.html.erb +39 -0
  767. data/app/views/hotwirebits/_rich_text_editor.html.erb +58 -0
  768. data/app/views/hotwirebits/_scroll_area.html.erb +6 -0
  769. data/app/views/hotwirebits/_search.html.erb +59 -0
  770. data/app/views/hotwirebits/_search_input.html.erb +9 -0
  771. data/app/views/hotwirebits/_section_heading.html.erb +9 -0
  772. data/app/views/hotwirebits/_select.html.erb +30 -0
  773. data/app/views/hotwirebits/_semi_circle_progress.html.erb +12 -0
  774. data/app/views/hotwirebits/_separator.html.erb +18 -0
  775. data/app/views/hotwirebits/_sheet.html.erb +45 -0
  776. data/app/views/hotwirebits/_shopping_cart.html.erb +49 -0
  777. data/app/views/hotwirebits/_sidebar.html.erb +39 -0
  778. data/app/views/hotwirebits/_simple_grid.html.erb +6 -0
  779. data/app/views/hotwirebits/_skeleton.html.erb +20 -0
  780. data/app/views/hotwirebits/_skeleton_card.html.erb +18 -0
  781. data/app/views/hotwirebits/_slider.html.erb +17 -0
  782. data/app/views/hotwirebits/_social_share.html.erb +23 -0
  783. data/app/views/hotwirebits/_space.html.erb +4 -0
  784. data/app/views/hotwirebits/_speed_dial.html.erb +27 -0
  785. data/app/views/hotwirebits/_speed_dial_fab.html.erb +33 -0
  786. data/app/views/hotwirebits/_spinner.html.erb +22 -0
  787. data/app/views/hotwirebits/_split_button.html.erb +23 -0
  788. data/app/views/hotwirebits/_splitter.html.erb +12 -0
  789. data/app/views/hotwirebits/_spoiler.html.erb +20 -0
  790. data/app/views/hotwirebits/_stack.html.erb +20 -0
  791. data/app/views/hotwirebits/_stacked_list.html.erb +23 -0
  792. data/app/views/hotwirebits/_stat.html.erb +24 -0
  793. data/app/views/hotwirebits/_stats.html.erb +6 -0
  794. data/app/views/hotwirebits/_status.html.erb +9 -0
  795. data/app/views/hotwirebits/_status_bar.html.erb +16 -0
  796. data/app/views/hotwirebits/_status_dot.html.erb +9 -0
  797. data/app/views/hotwirebits/_stepper_form.html.erb +58 -0
  798. data/app/views/hotwirebits/_steps.html.erb +48 -0
  799. data/app/views/hotwirebits/_swap.html.erb +20 -0
  800. data/app/views/hotwirebits/_switch.html.erb +19 -0
  801. data/app/views/hotwirebits/_table.html.erb +8 -0
  802. data/app/views/hotwirebits/_table_of_contents.html.erb +15 -0
  803. data/app/views/hotwirebits/_tabs.html.erb +44 -0
  804. data/app/views/hotwirebits/_tag.html.erb +20 -0
  805. data/app/views/hotwirebits/_tag_input.html.erb +17 -0
  806. data/app/views/hotwirebits/_team_section.html.erb +42 -0
  807. data/app/views/hotwirebits/_terminal.html.erb +24 -0
  808. data/app/views/hotwirebits/_testimonial.html.erb +32 -0
  809. data/app/views/hotwirebits/_testimonials_section.html.erb +37 -0
  810. data/app/views/hotwirebits/_text_gradient.html.erb +6 -0
  811. data/app/views/hotwirebits/_text_rotate.html.erb +10 -0
  812. data/app/views/hotwirebits/_textarea.html.erb +17 -0
  813. data/app/views/hotwirebits/_theme_controller.html.erb +16 -0
  814. data/app/views/hotwirebits/_theme_icon.html.erb +6 -0
  815. data/app/views/hotwirebits/_theme_selector.html.erb +30 -0
  816. data/app/views/hotwirebits/_time_picker.html.erb +32 -0
  817. data/app/views/hotwirebits/_timeline.html.erb +27 -0
  818. data/app/views/hotwirebits/_toast.html.erb +52 -0
  819. data/app/views/hotwirebits/_toggle.html.erb +12 -0
  820. data/app/views/hotwirebits/_toggle_button.html.erb +7 -0
  821. data/app/views/hotwirebits/_toggle_button_group.html.erb +11 -0
  822. data/app/views/hotwirebits/_toolbar.html.erb +21 -0
  823. data/app/views/hotwirebits/_tooltip.html.erb +26 -0
  824. data/app/views/hotwirebits/_tree_view.html.erb +18 -0
  825. data/app/views/hotwirebits/_two_factor.html.erb +29 -0
  826. data/app/views/hotwirebits/_typing_indicator.html.erb +8 -0
  827. data/app/views/hotwirebits/_typography.html.erb +7 -0
  828. data/app/views/hotwirebits/_validator.html.erb +23 -0
  829. data/app/views/hotwirebits/_version_diff.html.erb +20 -0
  830. data/app/views/hotwirebits/_video_player.html.erb +14 -0
  831. data/app/views/hotwirebits/_voice_recorder.html.erb +32 -0
  832. data/app/views/hotwirebits/_window_mockup.html.erb +23 -0
  833. data/config/routes.rb +4 -0
  834. data/lib/generators/hotwirebits/component_generator.rb +48 -0
  835. data/lib/generators/hotwirebits/install_generator.rb +47 -0
  836. data/lib/generators/hotwirebits/templates/component.html.erb.tt +4 -0
  837. data/lib/generators/hotwirebits/templates/component.rb.tt +9 -0
  838. data/lib/generators/hotwirebits/templates/controller.js.tt +6 -0
  839. data/lib/generators/hotwirebits/templates/theme.css +2 -0
  840. data/lib/hotwirebits/engine.rb +25 -0
  841. data/lib/hotwirebits/version.rb +5 -0
  842. data/lib/hotwirebits.rb +19 -0
  843. metadata +965 -0
@@ -0,0 +1,58 @@
1
+ <%# Dialog component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/dialog', title: "Confirm", description: "Are you sure?" %>
3
+
4
+ <%
5
+ title = local_assigns[:title]
6
+ description = local_assigns[:description]
7
+ size = local_assigns.fetch(:size, :md)
8
+ closable = local_assigns.fetch(:closable, true)
9
+ open = local_assigns.fetch(:open, false)
10
+
11
+ size_cls = case size
12
+ when :sm then "max-w-sm"
13
+ when :lg then "max-w-2xl"
14
+ when :xl then "max-w-4xl"
15
+ when :full then "max-w-[calc(100vw-2rem)]"
16
+ else "max-w-lg"
17
+ end
18
+ overlay_cls = "fixed inset-0 z-50 bg-black/80"
19
+ dialog_cls = "fixed left-[50%] top-[50%] z-50 grid w-full #{size_cls} translate-x-[-50%] translate-y-[-50%] gap-4 border border-hw-border bg-hw-background p-6 shadow-lg sm:rounded-lg"
20
+ %>
21
+
22
+ <div data-controller="hw-dialog" data-hw-dialog-open-value="<%= open %>">
23
+ <div class="<%= overlay_cls %>"
24
+ data-state="<%= open ? 'open' : 'closed' %>"
25
+ data-hw-dialog-target="overlay"
26
+ data-action="click->hw-dialog#close"
27
+ aria-hidden="true"></div>
28
+ <div class="<%= dialog_cls %>"
29
+ data-state="<%= open ? 'open' : 'closed' %>"
30
+ data-hw-dialog-target="panel"
31
+ role="dialog"
32
+ aria-modal="true"
33
+ aria-labelledby="<%= title ? 'dialog-title' : nil %>">
34
+ <div class="flex flex-col space-y-1.5 text-center sm:text-left">
35
+ <% if title %>
36
+ <h2 id="dialog-title" class="text-lg font-semibold leading-none tracking-tight"><%= title %></h2>
37
+ <% end %>
38
+ <% if description %>
39
+ <p class="text-sm text-hw-muted-foreground"><%= description %></p>
40
+ <% end %>
41
+ </div>
42
+ <% if block_given? %>
43
+ <div class="text-sm text-hw-muted-foreground">
44
+ <%= yield %>
45
+ </div>
46
+ <% end %>
47
+ <% if closable %>
48
+ <button type="button"
49
+ class="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-hw-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-hw-ring focus:ring-offset-2 disabled:pointer-events-none"
50
+ data-action="click->hw-dialog#close">
51
+ <svg class="h-4 w-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
52
+ <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
53
+ </svg>
54
+ <span class="sr-only">Close</span>
55
+ </button>
56
+ <% end %>
57
+ </div>
58
+ </div>
@@ -0,0 +1,25 @@
1
+ <%# Diff component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/diff', ... %>
3
+
4
+ <div class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
5
+ <div class="rounded-lg border border-hw-border overflow-hidden">
6
+ <div class="px-4 py-2 bg-hw-muted border-b border-hw-border">
7
+ <span class="text-xs font-medium text-hw-destructive"><%= before_label %></span>
8
+ </div>
9
+ <div class="p-4 text-sm font-mono">
10
+ <% if before_slot? %>
11
+ <%= before_slot %>
12
+ <% end %>
13
+ </div>
14
+ </div>
15
+ <div class="rounded-lg border border-hw-border overflow-hidden">
16
+ <div class="px-4 py-2 bg-hw-muted border-b border-hw-border">
17
+ <span class="text-xs font-medium text-hw-success"><%= after_label %></span>
18
+ </div>
19
+ <div class="p-4 text-sm font-mono">
20
+ <% if after_slot? %>
21
+ <%= after_slot %>
22
+ <% end %>
23
+ </div>
24
+ </div>
25
+ </div>
@@ -0,0 +1,25 @@
1
+ <%# DiffView component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/diff_view', ... %>
3
+
4
+ <div class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
5
+ <% if view == :side_by_side %>
6
+ <div class="grid grid-cols-2 divide-x divide-hw-border">
7
+ <div>
8
+ <div class="bg-hw-destructive/5 px-3 py-1.5 text-xs font-medium text-hw-destructive border-b border-hw-border">Old</div>
9
+ <pre class="p-3 overflow-x-auto text-xs leading-5"><% old_code.to_s.lines.each_with_index do |line, i| %><span class="flex"><span class="w-8 shrink-0 text-hw-muted-foreground select-none"><%= i + 1 %></span><span class="text-hw-destructive bg-hw-destructive/5/50 flex-1"><%= ERB::Util.html_escape(line.chomp) %></span></span><% end %></pre>
10
+ </div>
11
+ <div>
12
+ <div class="bg-hw-success/5 px-3 py-1.5 text-xs font-medium text-hw-success border-b border-hw-border">New</div>
13
+ <pre class="p-3 overflow-x-auto text-xs leading-5"><% new_code.to_s.lines.each_with_index do |line, i| %><span class="flex"><span class="w-8 shrink-0 text-hw-muted-foreground select-none"><%= i + 1 %></span><span class="text-hw-success bg-hw-success/5/50 flex-1"><%= ERB::Util.html_escape(line.chomp) %></span></span><% end %></pre>
14
+ </div>
15
+ </div>
16
+ <% else %>
17
+ <div class="bg-hw-muted/30 px-3 py-1.5 text-xs font-medium text-hw-muted-foreground border-b border-hw-border">
18
+ Unified Diff — <%= language %>
19
+ </div>
20
+ <pre class="p-3 overflow-x-auto text-xs leading-5"><% diff_lines(old_code, new_code).each do |entry|
21
+ case entry[:type]
22
+ when :context %><span class="flex"><span class="w-8 shrink-0 text-hw-muted-foreground select-none"><%= entry[:old_line] %></span><span class="flex-1"><%= ERB::Util.html_escape(entry[:content]) %></span></span><% when :removed %><span class="flex bg-hw-destructive/5"><span class="w-8 shrink-0 text-hw-destructive select-none">-</span><span class="flex-1 text-hw-destructive"><%= ERB::Util.html_escape(entry[:content]) %></span></span><% when :added %><span class="flex bg-hw-success/5"><span class="w-8 shrink-0 text-hw-success select-none">+</span><span class="flex-1 text-hw-success"><%= ERB::Util.html_escape(entry[:content]) %></span></span><% end
23
+ end %></pre>
24
+ <% end %>
25
+ </div>
@@ -0,0 +1,24 @@
1
+ <%# DigitalSignature component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/digital_signature', ... %>
3
+
4
+ <div data-controller="hw-signature"
5
+ data-hw-signature-pen-color-value="<%= pen_color %>"
6
+ data-hw-signature-pen-width-value="<%= pen_width %>"
7
+ <%= tag.attributes(local_assigns) %>>
8
+ <div class="rounded-lg border border-hw-border bg-hw-background overflow-hidden">
9
+ <canvas data-hw-signature-target="canvas"
10
+ width="<%= width %>"
11
+ height="<%= height %>"
12
+ class="w-full cursor-crosshair touch-none"
13
+ data-action="mousedown->hw-signature#startDraw mousemove->hw-signature#draw mouseup->hw-signature#endDraw mouseleave->hw-signature#endDraw touchstart->hw-signature#startDraw touchmove->hw-signature#draw touchend->hw-signature#endDraw"></canvas>
14
+ </div>
15
+ <input type="hidden" name="<%= name %>" data-hw-signature-target="input">
16
+ <div class="flex items-center gap-2 mt-2">
17
+ <button type="button"
18
+ class="inline-flex h-8 items-center justify-center rounded-md border border-hw-input bg-hw-background px-3 text-xs font-medium text-hw-foreground hover:bg-hw-accent transition-colors cursor-pointer"
19
+ data-action="click->hw-signature#clear">
20
+ Clear
21
+ </button>
22
+ <span class="text-xs text-hw-muted-foreground" data-hw-signature-target="status">Draw your signature above</span>
23
+ </div>
24
+ </div>
@@ -0,0 +1,22 @@
1
+ <%# Divider component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/divider', orientation: :horizontal %>
3
+
4
+ <%
5
+ orientation = local_assigns.fetch(:orientation, :horizontal)
6
+ label = local_assigns[:label]
7
+ with_label = local_assigns.fetch(:with_label, label.present?)
8
+ dashed = local_assigns.fetch(:dashed, false)
9
+ extra_class = local_assigns[:class]
10
+ %>
11
+
12
+ <% if with_label && label %>
13
+ <div class="relative flex items-center <%= orientation == :vertical ? 'flex-col h-full' : '' %><%= " #{extra_class}" if extra_class %>" role="separator">
14
+ <div class="<%= orientation == :horizontal ? 'flex-1 border-t' : 'flex-1 border-l' %> <%= dashed ? 'border-dashed' : 'border-solid' %> border-hw-border"></div>
15
+ <span class="<%= orientation == :horizontal ? 'px-3' : 'py-3' %> text-xs text-hw-muted-foreground font-medium">
16
+ <%= label %>
17
+ </span>
18
+ <div class="<%= orientation == :horizontal ? 'flex-1 border-t' : 'flex-1 border-l' %> <%= dashed ? 'border-dashed' : 'border-solid' %> border-hw-border"></div>
19
+ </div>
20
+ <% else %>
21
+ <div class="<%= orientation == :vertical ? 'shrink-0 bg-hw-border h-full w-[1px]' : 'shrink-0 bg-hw-border h-[1px] w-full' %><%= " #{extra_class}" if extra_class %>" role="separator"></div>
22
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <%# DockMenu component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/dock_menu', ... %>
3
+
4
+ <nav class="fixed inset-x-0 bottom-0 z-50 border-t border-hw-border bg-hw-background/95 backdrop-blur supports-[backdrop-filter]:bg-hw-background/60" <%= tag.attributes(local_assigns) %>>
5
+ <div class="mx-auto flex h-16 max-w-md items-center justify-around px-6">
6
+ <% items.each do |item| %>
7
+ <a href="<%= item[:href] %>"
8
+ class="<%= merge_classes(
9
+ 'group relative flex flex-col items-center gap-1 text-xs transition-colors',
10
+ item[:active] ? 'text-hw-primary' : 'text-hw-muted-foreground hover:text-hw-foreground'
11
+ ) %>">
12
+ <span class="relative">
13
+ <% if item[:icon] %>
14
+ <span class="h-6 w-6"><%= safe_svg(item[:icon]) %></span>
15
+ <% end %>
16
+ <% if item[:badge] %>
17
+ <span class="absolute -right-2 -top-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-hw-primary px-1 text-[10px] font-medium text-hw-primary-foreground"><%= item[:badge] %></span>
18
+ <% end %>
19
+ </span>
20
+ <span class="<%= item[:active] ? 'font-medium' : '' %>"><%= item[:label] %></span>
21
+ </a>
22
+ <% end %>
23
+ </div>
24
+ </nav>
@@ -0,0 +1,19 @@
1
+ <%# DragDropList component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/drag_drop_list', ... %>
3
+
4
+ <ul class="<%= list_classes %>"
5
+ data-controller="hw-drag-drop"
6
+ <%= tag.attributes(local_assigns) %>>
7
+ <% items.each do |item| %>
8
+ <li class="flex items-center gap-3 rounded-lg border border-hw-border bg-hw-card p-3 cursor-grab active:cursor-grabbing transition-shadow hover:shadow-md"
9
+ draggable="true"
10
+ data-hw-drag-drop-target="item"
11
+ data-item-id="<%= item[:id] %>"
12
+ data-action="dragstart->hw-drag-drop#dragStart dragend->hw-drag-drop#dragEnd dragover->hw-drag-drop#dragOver drop->hw-drag-drop#drop">
13
+ <svg class="h-4 w-4 text-hw-muted-foreground shrink-0" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
14
+ <path stroke-linecap="round" stroke-linejoin="round" d="M4 8h16M4 16h16"/>
15
+ </svg>
16
+ <span class="text-sm text-hw-foreground"><%= item[:label] %></span>
17
+ </li>
18
+ <% end %>
19
+ </ul>
@@ -0,0 +1,41 @@
1
+ <%# Drawer component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/drawer', ... %>
3
+
4
+ <div data-controller="hw-drawer"
5
+ data-hw-drawer-open-value="<%= open %>"
6
+ data-hw-drawer-snap-points-value="<%= snap_points_data %>"
7
+ <%= tag.attributes(local_assigns) %>>
8
+ <div class="fixed inset-0 z-50 bg-black/80"
9
+ data-hw-drawer-target="overlay"
10
+ data-action="click->hw-drawer#close"
11
+ data-state="<%= open ? 'open' : 'closed' %>"
12
+ aria-hidden="true"></div>
13
+ <div class="fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border border-hw-border bg-hw-background"
14
+ data-hw-drawer-target="panel"
15
+ data-state="<%= open ? 'open' : 'closed' %>"
16
+ role="dialog"
17
+ aria-modal="true">
18
+ <div class="mx-auto mt-4 h-2 w-[100px] rounded-full bg-hw-muted cursor-grab"
19
+ data-hw-drawer-target="handle"
20
+ data-action="pointerdown->hw-drawer#startDrag"></div>
21
+ <div class="mx-auto w-full max-w-md">
22
+ <% if header? %>
23
+ <div class="p-4 pb-0">
24
+ <%= header %>
25
+ </div>
26
+ <% elsif title %>
27
+ <div class="p-4 pb-0 text-center">
28
+ <h2 class="text-lg font-semibold tracking-tight"><%= title %></h2>
29
+ </div>
30
+ <% end %>
31
+ <div class="p-4 overflow-y-auto">
32
+ <%= content %>
33
+ </div>
34
+ <% if footer? %>
35
+ <div class="p-4 pt-0">
36
+ <%= footer %>
37
+ </div>
38
+ <% end %>
39
+ </div>
40
+ </div>
41
+ </div>
@@ -0,0 +1,33 @@
1
+ <%# Dropdown component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/dropdown', trigger_label: "Menu", items: [{label: "Item", href: "/"}] %>
3
+
4
+ <%
5
+ trigger_label = local_assigns.fetch(:trigger_label, "Menu")
6
+ items = local_assigns.fetch(:items, [])
7
+ align = local_assigns.fetch(:align, :start)
8
+ extra_class = local_assigns[:class]
9
+
10
+ panel_cls = "absolute z-50 min-w-[8rem] overflow-hidden rounded-md border border-hw-border bg-hw-popover p-1 text-hw-popover-foreground shadow-md #{align == :end ? 'right-0' : 'left-0'}"
11
+ %>
12
+
13
+ <div class="relative inline-block<%= " #{extra_class}" if extra_class %>" data-controller="hw-dropdown">
14
+ <button type="button"
15
+ data-action="click->hw-dropdown#toggle click@window->hw-dropdown#closeOnClickOutside"
16
+ class="inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium text-hw-foreground hover:bg-hw-accent transition-colors cursor-pointer">
17
+ <%= trigger_label %>
18
+ <svg class="ml-2 h-4 w-4 text-hw-muted-foreground" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/></svg>
19
+ </button>
20
+ <div data-hw-dropdown-target="menu" class="<%= panel_cls %> hidden">
21
+ <% items.each do |item| %>
22
+ <% if item[:separator] %>
23
+ <div class="-mx-1 my-1 h-px bg-hw-border"></div>
24
+ <% else %>
25
+ <a href="<%= item[:href] %>"
26
+ class="relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-hw-accent hover:text-hw-accent-foreground"
27
+ data-action="click->hw-dropdown#close">
28
+ <span><%= item[:label] %></span>
29
+ </a>
30
+ <% end %>
31
+ <% end %>
32
+ </div>
33
+ </div>
@@ -0,0 +1,19 @@
1
+ <%# Dropzone component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/dropzone', ... %>
3
+
4
+ <label class="flex flex-col items-center justify-center w-full h-32 rounded-lg border-2 border-dashed border-hw-border bg-hw-muted/30 cursor-pointer hover:bg-hw-muted/50 transition-colors" <%= tag.attributes(local_assigns) %>>
5
+ <svg class="w-8 h-8 mb-2 text-hw-muted-foreground" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
6
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"/>
7
+ </svg>
8
+ <p class="text-sm text-hw-foreground font-medium"><%= label %></p>
9
+ <% if description %>
10
+ <p class="text-xs text-hw-muted-foreground mt-1"><%= description %></p>
11
+ <% end %>
12
+ <input
13
+ type="file"
14
+ name="<%= name %>"
15
+ class="hidden"
16
+ <%= 'accept="' + accept + '"' if accept %>
17
+ <%= 'multiple' if multiple %>
18
+ >
19
+ </label>
@@ -0,0 +1,22 @@
1
+ <%# EmptyCart component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/empty_cart', ... %>
3
+
4
+ <div class="flex flex-col items-center justify-center rounded-lg border border-dashed border-hw-border p-12 text-center" <%= tag.attributes(local_assigns) %>>
5
+ <div class="mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-hw-muted text-hw-muted-foreground">
6
+ <% if icon %>
7
+ <%= safe_svg(icon) %>
8
+ <% else %>
9
+ <svg class="h-8 w-8" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5">
10
+ <path stroke-linecap="round" stroke-linejoin="round" d="M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 00-5.98.572m5.98-.572h9m-9 0a3 3 0 01-5.98.572M17.25 14.25a3 3 0 005.98.572m-5.98-.572h-9m9 0a3 3 0 015.98.572M3.75 6.75h16.5l-1.5 9H5.25l-1.5-9z"/>
11
+ </svg>
12
+ <% end %>
13
+ </div>
14
+ <h3 class="text-lg font-semibold text-hw-foreground"><%= message %></h3>
15
+ <p class="mt-1.5 text-sm text-hw-muted-foreground max-w-sm">Looks like you haven't added any items to your cart yet.</p>
16
+ <% if action_href %>
17
+ <a href="<%= action_href %>"
18
+ class="mt-6 inline-flex h-9 items-center justify-center rounded-md bg-hw-primary px-6 text-sm font-medium text-hw-primary-foreground hover:bg-hw-primary/90 transition-colors">
19
+ <%= action_label %>
20
+ </a>
21
+ <% end %>
22
+ </div>
@@ -0,0 +1,29 @@
1
+ <%# EmptyState component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/empty_state', title: "Nothing here", description: "Create something" %>
3
+
4
+ <%
5
+ title = local_assigns[:title]
6
+ description = local_assigns[:description]
7
+ icon = local_assigns[:icon]
8
+ action_label = local_assigns[:action_label]
9
+ action_href = local_assigns[:action_href]
10
+ extra_class = local_assigns[:class]
11
+ %>
12
+
13
+ <div class="flex flex-col items-center justify-center rounded-lg border border-dashed border-hw-border p-8 text-center<%= " #{extra_class}" if extra_class %>">
14
+ <% if icon %>
15
+ <div class="mb-3 text-hw-muted-foreground"><%= icon %></div>
16
+ <% end %>
17
+ <% if title %>
18
+ <h3 class="text-lg font-semibold tracking-tight"><%= title %></h3>
19
+ <% end %>
20
+ <% if description %>
21
+ <p class="mt-1.5 text-sm text-hw-muted-foreground max-w-sm"><%= description %></p>
22
+ <% end %>
23
+ <% if action_label && action_href %>
24
+ <a href="<%= action_href %>"
25
+ class="mt-4 inline-flex h-9 items-center justify-center rounded-md bg-hw-primary px-4 py-2 text-sm font-medium text-hw-primary-foreground ring-offset-hw-background transition-colors hover:bg-hw-primary/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-hw-ring focus-visible:ring-offset-2">
26
+ <%= action_label %>
27
+ </a>
28
+ <% end %>
29
+ </div>
@@ -0,0 +1,17 @@
1
+ <%# ErrorPage component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/error_page', ... %>
3
+
4
+ <div class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
5
+ <p class="text-8xl font-bold text-hw-muted-foreground/30"><%= code %></p>
6
+ <h1 class="mt-4 text-2xl font-bold text-hw-foreground"><%= title %></h1>
7
+ <p class="mt-2 text-hw-muted-foreground max-w-md"><%= description %></p>
8
+ <% if action_label %>
9
+ <a href="<%= action_href %>"
10
+ class="mt-6 inline-flex items-center justify-center rounded-lg bg-hw-primary text-hw-primary-foreground h-10 px-5 text-sm font-medium shadow-sm hover:bg-hw-primary/90 transition-colors">
11
+ <svg class="mr-2 h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
12
+ <path stroke-linecap="round" stroke-linejoin="round" d="M10 19l-7-7m0 0l7-7m-7 7h18"/>
13
+ </svg>
14
+ <%= action_label %>
15
+ </a>
16
+ <% end %>
17
+ </div>
@@ -0,0 +1,29 @@
1
+ <%# FaqSection component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/faq_section', ... %>
3
+
4
+ <section class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
5
+ <div class="mx-auto max-w-3xl">
6
+ <% if title %>
7
+ <h2 class="text-3xl md:text-4xl font-bold text-hw-foreground text-center mb-10"><%= title %></h2>
8
+ <% end %>
9
+ <div class="divide-y divide-hw-border rounded-lg border border-hw-border" data-controller="hw-accordion">
10
+ <% items.each_with_index do |item, index| %>
11
+ <div>
12
+ <button type="button"
13
+ class="flex w-full items-center justify-between px-6 py-4 text-left hover:bg-hw-muted/50 transition-colors"
14
+ data-action="click->hw-accordion#toggle"
15
+ data-hw-accordion-target="trigger">
16
+ <span class="text-base font-medium text-hw-foreground pr-4"><%= item[:question] %></span>
17
+ <svg class="h-5 w-5 shrink-0 text-hw-muted-foreground transition-transform duration-200" xmlns="http://www.w3.org/2000/svg"
18
+ viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
19
+ <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/>
20
+ </svg>
21
+ </button>
22
+ <div class="hidden px-6 pb-4 text-sm text-hw-muted-foreground leading-relaxed" data-hw-accordion-target="content">
23
+ <%= item[:answer] %>
24
+ </div>
25
+ </div>
26
+ <% end %>
27
+ </div>
28
+ </div>
29
+ </section>
@@ -0,0 +1,30 @@
1
+ <%# FeatureSection component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/feature_section', ... %>
3
+
4
+ <section class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
5
+ <div class="mx-auto max-w-5xl">
6
+ <% if title || subtitle %>
7
+ <div class="text-center mb-12">
8
+ <% if title %>
9
+ <h2 class="text-3xl md:text-4xl font-bold text-hw-foreground"><%= title %></h2>
10
+ <% end %>
11
+ <% if subtitle %>
12
+ <p class="mt-3 text-lg text-hw-muted-foreground max-w-2xl mx-auto"><%= subtitle %></p>
13
+ <% end %>
14
+ </div>
15
+ <% end %>
16
+ <div class="<%= grid_classes %>">
17
+ <% features.each do |feature| %>
18
+ <div class="flex flex-col gap-3 rounded-lg border border-hw-border bg-hw-card p-6">
19
+ <% if feature[:icon] %>
20
+ <div class="flex h-10 w-10 items-center justify-center rounded-lg bg-hw-accent text-hw-accent-foreground shrink-0">
21
+ <span class="h-5 w-5"><%= safe_svg(feature[:icon]) %></span>
22
+ </div>
23
+ <% end %>
24
+ <h3 class="text-base font-semibold text-hw-foreground"><%= feature[:title] %></h3>
25
+ <p class="text-sm text-hw-muted-foreground leading-relaxed"><%= feature[:description] %></p>
26
+ </div>
27
+ <% end %>
28
+ </div>
29
+ </div>
30
+ </section>
@@ -0,0 +1,54 @@
1
+ <%# Feedback component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/feedback', ... %>
3
+
4
+ <div class="rounded-lg border border-hw-border bg-hw-card p-4" data-controller="hw-feedback" <%= tag.attributes(local_assigns) %>>
5
+ <% if question %>
6
+ <p class="mb-3 text-sm font-medium"><%= question %></p>
7
+ <% end %>
8
+ <% case type %>
9
+ <% when :thumbs %>
10
+ <div class="flex items-center gap-2">
11
+ <button type="button" data-action="click->hw-feedback#select" data-hw-feedback-target="option" data-value="up"
12
+ class="inline-flex h-9 w-9 items-center justify-center rounded-md border border-hw-input bg-hw-background text-sm transition-colors hover:bg-hw-accent hover:text-hw-accent-foreground">
13
+ <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
14
+ <path stroke-linecap="round" stroke-linejoin="round" d="M6.633 10.5c.806 0 1.533-.446 2.031-1.08a9.041 9.041 0 012.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 00.322-1.672V3a.75.75 0 01.75-.75A2.25 2.25 0 0116.5 4.5c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 01-2.649 7.521c-.388.482-.987.729-1.605.729H13.48c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 00-1.423-.23H5.904M14.25 9h2.25M5.904 18.75c.083.205.173.405.27.602.197.4-.078.898-.523.898h-.908c-.889 0-1.713-.518-1.972-1.368a12 12 0 01-.521-3.507c0-1.553.295-3.036.831-4.398C3.387 10.203 4.167 9.75 5 9.75h1.053c.472 0 .745.556.5.96a8.958 8.958 0 00-1.302 4.665c0 1.194.232 2.333.654 3.375z"/>
15
+ </svg>
16
+ </button>
17
+ <button type="button" data-action="click->hw-feedback#select" data-hw-feedback-target="option" data-value="down"
18
+ class="inline-flex h-9 w-9 items-center justify-center rounded-md border border-hw-input bg-hw-background text-sm transition-colors hover:bg-hw-accent hover:text-hw-accent-foreground">
19
+ <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
20
+ <path stroke-linecap="round" stroke-linejoin="round" d="M7.5 15h2.25m8.024-9.75c.011.05.028.1.052.148.591 1.2.924 2.55.924 3.977a8.96 8.96 0 01-.999 4.125m.023-8.25c-.076-.365.183-.75.575-.75h.908c.889 0 1.713.518 1.972 1.368.339 1.11.521 2.287.521 3.507 0 1.553-.295 3.036-.831 4.398C20.613 14.547 19.833 15 19 15h-1.053c-.472 0-.745-.556-.5-.96a8.95 8.95 0 00.303-.54m.023-8.25H16.48a4.5 4.5 0 01-1.423-.23l-3.114-1.04a4.5 4.5 0 00-1.423-.23H5.904c-.889 0-1.713.518-1.972 1.368a11.976 11.976 0 00-.521 3.507c0 1.553.295 3.036.831 4.398.393.837.999 1.287 1.605 1.287h3.126c1.026 0 1.945-.694 2.054-1.715.045-.422.068-.85.068-1.285a11.95 11.95 0 00-2.649-7.521c-.388-.482-.107-1.282.725-1.282h3.126z"/>
21
+ </svg>
22
+ </button>
23
+ </div>
24
+ <% when :stars %>
25
+ <div class="flex items-center gap-1" data-hw-feedback-target="starContainer">
26
+ <% 5.times do |i| %>
27
+ <button type="button" data-action="click->hw-feedback#selectStar" data-value="<%= i + 1 %>"
28
+ class="text-hw-muted-foreground transition-colors hover:text-hw-warning">
29
+ <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
30
+ <path stroke-linecap="round" stroke-linejoin="round" d="M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z"/>
31
+ </svg>
32
+ </button>
33
+ <% end %>
34
+ </div>
35
+ <% when :emoji %>
36
+ <div class="flex items-center gap-1">
37
+ <% emoji_options.each_with_index do |emoji, i| %>
38
+ <button type="button" data-action="click->hw-feedback#select" data-hw-feedback-target="option" data-value="<%= i + 1 %>"
39
+ class="inline-flex h-9 w-9 items-center justify-center rounded-md border border-hw-input bg-hw-background text-lg transition-colors hover:bg-hw-accent">
40
+ <%= emoji %>
41
+ </button>
42
+ <% end %>
43
+ </div>
44
+ <% when :nps %>
45
+ <div class="flex items-center gap-1">
46
+ <% nps_range.each do |n| %>
47
+ <button type="button" data-action="click->hw-feedback#select" data-hw-feedback-target="option" data-value="<%= n %>"
48
+ class="inline-flex h-8 w-8 items-center justify-center rounded-md border border-hw-input bg-hw-background text-xs font-medium transition-colors hover:bg-hw-primary hover:text-hw-primary-foreground">
49
+ <%= n %>
50
+ </button>
51
+ <% end %>
52
+ </div>
53
+ <% end %>
54
+ </div>
@@ -0,0 +1,14 @@
1
+ <%# Fieldset component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/fieldset', ... %>
3
+
4
+ <fieldset class="<%= fieldset_classes %>" <%= 'disabled' if disabled %> <%= tag.attributes(local_assigns) %>>
5
+ <% if legend %>
6
+ <legend class="text-sm font-medium text-hw-foreground"><%= legend %></legend>
7
+ <% end %>
8
+ <% if description %>
9
+ <p class="text-xs text-hw-muted-foreground mt-1 mb-3"><%= description %></p>
10
+ <% end %>
11
+ <div class="space-y-3">
12
+ <%= content %>
13
+ </div>
14
+ </fieldset>
@@ -0,0 +1,38 @@
1
+ <%# FileBrowser component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/file_browser', ... %>
3
+
4
+ <div class="rounded-lg border border-hw-border bg-hw-card overflow-hidden font-mono text-sm"
5
+ data-controller="hw-file-browser"
6
+ <%= tag.attributes(local_assigns) %>>
7
+ <div class="p-3 border-b border-hw-border bg-hw-muted/50">
8
+ <p class="text-xs font-medium text-hw-muted-foreground uppercase tracking-wide">Files</p>
9
+ </div>
10
+ <div class="p-2">
11
+ <%= render_file_tree(files, 0) %>
12
+ </div>
13
+ </div>
14
+ <% def render_file_tree(files, depth) %>
15
+ <% files.each do |file| %>
16
+ <div class="flex items-center gap-2 rounded-sm px-2 py-1.5 cursor-pointer hover:bg-hw-accent transition-colors <%= selected == file[:name] ? 'bg-hw-accent text-hw-accent-foreground' : 'text-hw-foreground' %>"
17
+ style="padding-left: <%= depth * 16 + 8 %>px;"
18
+ data-action="click->hw-file-browser#select"
19
+ data-file-name="<%= file[:name] %>">
20
+ <% if file[:type] == 'folder' %>
21
+ <svg class="h-4 w-4 text-yellow-500 shrink-0" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24">
22
+ <path d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/>
23
+ </svg>
24
+ <% else %>
25
+ <svg class="h-4 w-4 text-hw-muted-foreground shrink-0" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
26
+ <path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
27
+ </svg>
28
+ <% end %>
29
+ <span class="truncate"><%= file[:name] %></span>
30
+ <% if file[:size] %>
31
+ <span class="ml-auto text-[10px] text-hw-muted-foreground shrink-0"><%= file[:size] %></span>
32
+ <% end %>
33
+ </div>
34
+ <% if file[:type] == 'folder' && file[:children]&.any? %>
35
+ <%= render_file_tree(file[:children], depth + 1) %>
36
+ <% end %>
37
+ <% end %>
38
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <%# FileInput component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/file_input', ... %>
3
+
4
+ <label class="<%= label_classes %>">
5
+ <input type="file" name="<%= name %>" accept="<%= accept %>" <%= 'multiple' if multiple %> <%= 'disabled' if disabled %> class="sr-only" <%= tag.attributes(local_assigns) %>>
6
+ <span class="flex items-center gap-2">
7
+ <svg class="h-4 w-4 text-hw-muted-foreground" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"/></svg>
8
+ <span class="text-sm"><%= label %></span>
9
+ </span>
10
+ </label>
@@ -0,0 +1,29 @@
1
+ <%# FileUploadProgress component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/file_upload_progress', ... %>
3
+
4
+ <div class="rounded-lg border border-hw-border bg-hw-card p-4" <%= tag.attributes(local_assigns) %>>
5
+ <div class="flex items-center gap-3 mb-3">
6
+ <%= safe_svg(status_icon) %>
7
+ <div class="flex-1 min-w-0">
8
+ <p class="text-sm font-medium text-hw-foreground truncate"><%= file_name %></p>
9
+ <p class="text-xs text-hw-muted-foreground">
10
+ <% case status %>
11
+ <% when :complete %>
12
+ Upload complete
13
+ <% when :error %>
14
+ Upload failed
15
+ <% else %>
16
+ Uploading... <%= progress %>%
17
+ <% end %>
18
+ </p>
19
+ </div>
20
+ <% unless status == :uploading %>
21
+ <button type="button" class="h-7 w-7 inline-flex items-center justify-center rounded hover:bg-hw-accent text-hw-muted-foreground cursor-pointer" aria-label="Dismiss">
22
+ <svg class="h-4 w-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/></svg>
23
+ </button>
24
+ <% end %>
25
+ </div>
26
+ <div class="w-full overflow-hidden rounded-full bg-hw-muted h-2">
27
+ <div class="h-full rounded-full transition-all duration-300 <%= bar_color %>" style="width: <%= progress %>%;"></div>
28
+ </div>
29
+ </div>
@@ -0,0 +1,6 @@
1
+ <%# Flex component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/flex', ... %>
3
+
4
+ <div class="<%= flex_classes %>" <%= tag.attributes(local_assigns) %>>
5
+ <%= content %>
6
+ </div>
@@ -0,0 +1,7 @@
1
+ <%# FloatLabel component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/float_label', ... %>
3
+
4
+ <div class="relative" <%= tag.attributes(local_assigns) %>>
5
+ <%= content %>
6
+ <label for="<%= name %>" class="absolute left-3 top-1/2 -translate-y-1/2 text-sm text-hw-muted-foreground transition-all pointer-events-none peer-placeholder-shown:top-1/2 peer-placeholder-shown:text-sm peer-focus:top-2 peer-focus:text-xs peer-focus:text-hw-primary peer-[:not(:placeholder-shown)]:top-2 peer-[:not(:placeholder-shown)]:text-xs"><%= label %></label>
7
+ </div>
@@ -0,0 +1,6 @@
1
+ <%# Fluid component — ERB partial %>
2
+ <%# Usage: render 'hotwirebits/fluid', ... %>
3
+
4
+ <div class="<%= fluid_classes %>" <%= tag.attributes(local_assigns) %>>
5
+ <%= content %>
6
+ </div>