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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +46 -0
- data/LICENSE +21 -0
- data/README.md +156 -0
- data/app/assets/stylesheets/hotwirebits/theme.css +131 -0
- data/app/assets/stylesheets/hotwirebits/themes/corporate.css +29 -0
- data/app/assets/stylesheets/hotwirebits/themes/midnight.css +29 -0
- data/app/components/hotwirebits/accordion_component.html.erb +23 -0
- data/app/components/hotwirebits/accordion_component.rb +34 -0
- data/app/components/hotwirebits/activity_feed_component.html.erb +40 -0
- data/app/components/hotwirebits/activity_feed_component.rb +11 -0
- data/app/components/hotwirebits/affix_component.html.erb +3 -0
- data/app/components/hotwirebits/affix_component.rb +25 -0
- data/app/components/hotwirebits/ai_chat_component.html.erb +32 -0
- data/app/components/hotwirebits/ai_chat_component.rb +12 -0
- data/app/components/hotwirebits/alert_component.html.erb +32 -0
- data/app/components/hotwirebits/alert_component.rb +39 -0
- data/app/components/hotwirebits/alert_dialog_component.html.erb +30 -0
- data/app/components/hotwirebits/alert_dialog_component.rb +40 -0
- data/app/components/hotwirebits/anchor_component.html.erb +9 -0
- data/app/components/hotwirebits/anchor_component.rb +12 -0
- data/app/components/hotwirebits/angle_slider_component.html.erb +9 -0
- data/app/components/hotwirebits/angle_slider_component.rb +19 -0
- data/app/components/hotwirebits/animated_number_component.html.erb +8 -0
- data/app/components/hotwirebits/animated_number_component.rb +28 -0
- data/app/components/hotwirebits/app_shell_component.html.erb +22 -0
- data/app/components/hotwirebits/app_shell_component.rb +15 -0
- data/app/components/hotwirebits/aspect_ratio_component.html.erb +3 -0
- data/app/components/hotwirebits/aspect_ratio_component.rb +27 -0
- data/app/components/hotwirebits/auth_block_component.html.erb +63 -0
- data/app/components/hotwirebits/auth_block_component.rb +35 -0
- data/app/components/hotwirebits/autocomplete_component.html.erb +5 -0
- data/app/components/hotwirebits/autocomplete_component.rb +45 -0
- data/app/components/hotwirebits/avatar_component.html.erb +18 -0
- data/app/components/hotwirebits/avatar_component.rb +67 -0
- data/app/components/hotwirebits/background_image_component.html.erb +9 -0
- data/app/components/hotwirebits/background_image_component.rb +17 -0
- data/app/components/hotwirebits/badge_component.html.erb +13 -0
- data/app/components/hotwirebits/badge_component.rb +55 -0
- data/app/components/hotwirebits/banner_component.html.erb +31 -0
- data/app/components/hotwirebits/banner_component.rb +36 -0
- data/app/components/hotwirebits/base.rb +13 -0
- data/app/components/hotwirebits/bento_grid_component.html.erb +7 -0
- data/app/components/hotwirebits/bento_grid_component.rb +36 -0
- data/app/components/hotwirebits/blog_section_component.html.erb +35 -0
- data/app/components/hotwirebits/blog_section_component.rb +20 -0
- data/app/components/hotwirebits/bottom_navigation_component.html.erb +21 -0
- data/app/components/hotwirebits/bottom_navigation_component.rb +22 -0
- data/app/components/hotwirebits/box_component.html.erb +3 -0
- data/app/components/hotwirebits/box_component.rb +16 -0
- data/app/components/hotwirebits/breadcrumb_advanced_component.html.erb +53 -0
- data/app/components/hotwirebits/breadcrumb_advanced_component.rb +32 -0
- data/app/components/hotwirebits/breadcrumb_component.html.erb +18 -0
- data/app/components/hotwirebits/breadcrumb_component.rb +11 -0
- data/app/components/hotwirebits/browser_mockup_component.html.erb +22 -0
- data/app/components/hotwirebits/browser_mockup_component.rb +11 -0
- data/app/components/hotwirebits/burger_component.html.erb +20 -0
- data/app/components/hotwirebits/burger_component.rb +29 -0
- data/app/components/hotwirebits/button_component.html.erb +21 -0
- data/app/components/hotwirebits/button_component.rb +84 -0
- data/app/components/hotwirebits/calendar_component.html.erb +70 -0
- data/app/components/hotwirebits/calendar_component.rb +49 -0
- data/app/components/hotwirebits/card_component.html.erb +24 -0
- data/app/components/hotwirebits/card_component.rb +21 -0
- data/app/components/hotwirebits/card_heading_component.html.erb +13 -0
- data/app/components/hotwirebits/card_heading_component.rb +13 -0
- data/app/components/hotwirebits/carousel_component.html.erb +50 -0
- data/app/components/hotwirebits/carousel_component.rb +27 -0
- data/app/components/hotwirebits/center_component.html.erb +3 -0
- data/app/components/hotwirebits/center_component.rb +22 -0
- data/app/components/hotwirebits/chart_component.html.erb +68 -0
- data/app/components/hotwirebits/chart_component.rb +67 -0
- data/app/components/hotwirebits/chat_bubble_component.html.erb +27 -0
- data/app/components/hotwirebits/chat_bubble_component.rb +35 -0
- data/app/components/hotwirebits/checkbox_component.html.erb +9 -0
- data/app/components/hotwirebits/checkbox_component.rb +70 -0
- data/app/components/hotwirebits/checkout_form_component.html.erb +40 -0
- data/app/components/hotwirebits/checkout_form_component.rb +21 -0
- data/app/components/hotwirebits/chip_component.html.erb +13 -0
- data/app/components/hotwirebits/chip_component.rb +51 -0
- data/app/components/hotwirebits/clipboard_component.html.erb +26 -0
- data/app/components/hotwirebits/clipboard_component.rb +19 -0
- data/app/components/hotwirebits/close_button_component.html.erb +3 -0
- data/app/components/hotwirebits/close_button_component.rb +40 -0
- data/app/components/hotwirebits/code_block_component.html.erb +17 -0
- data/app/components/hotwirebits/code_block_component.rb +19 -0
- data/app/components/hotwirebits/code_highlight_component.html.erb +6 -0
- data/app/components/hotwirebits/code_highlight_component.rb +32 -0
- data/app/components/hotwirebits/code_mockup_component.html.erb +13 -0
- data/app/components/hotwirebits/code_mockup_component.rb +19 -0
- data/app/components/hotwirebits/collapsible_component.html.erb +17 -0
- data/app/components/hotwirebits/collapsible_component.rb +11 -0
- data/app/components/hotwirebits/color_input_component.html.erb +19 -0
- data/app/components/hotwirebits/color_input_component.rb +14 -0
- data/app/components/hotwirebits/color_picker_component.html.erb +6 -0
- data/app/components/hotwirebits/color_picker_component.rb +37 -0
- data/app/components/hotwirebits/color_swatch_component.html.erb +1 -0
- data/app/components/hotwirebits/color_swatch_component.rb +18 -0
- data/app/components/hotwirebits/combobox_component.html.erb +15 -0
- data/app/components/hotwirebits/combobox_component.rb +56 -0
- data/app/components/hotwirebits/command_bar_component.html.erb +33 -0
- data/app/components/hotwirebits/command_bar_component.rb +11 -0
- data/app/components/hotwirebits/compare_component.html.erb +21 -0
- data/app/components/hotwirebits/compare_component.rb +17 -0
- data/app/components/hotwirebits/confirm_dialog_component.html.erb +17 -0
- data/app/components/hotwirebits/confirm_dialog_component.rb +23 -0
- data/app/components/hotwirebits/confirm_popup_component.html.erb +16 -0
- data/app/components/hotwirebits/confirm_popup_component.rb +31 -0
- data/app/components/hotwirebits/contact_section_component.html.erb +53 -0
- data/app/components/hotwirebits/contact_section_component.rb +17 -0
- data/app/components/hotwirebits/container_component.html.erb +3 -0
- data/app/components/hotwirebits/container_component.rb +29 -0
- data/app/components/hotwirebits/context_menu_component.html.erb +27 -0
- data/app/components/hotwirebits/context_menu_component.rb +14 -0
- data/app/components/hotwirebits/cookie_consent_component.html.erb +23 -0
- data/app/components/hotwirebits/cookie_consent_component.rb +28 -0
- data/app/components/hotwirebits/cookie_settings_component.html.erb +48 -0
- data/app/components/hotwirebits/cookie_settings_component.rb +10 -0
- data/app/components/hotwirebits/countdown_component.html.erb +8 -0
- data/app/components/hotwirebits/countdown_component.rb +14 -0
- data/app/components/hotwirebits/cta_section_component.html.erb +33 -0
- data/app/components/hotwirebits/cta_section_component.rb +23 -0
- data/app/components/hotwirebits/dashboard_card_component.html.erb +32 -0
- data/app/components/hotwirebits/dashboard_card_component.rb +25 -0
- data/app/components/hotwirebits/data_table_component.html.erb +53 -0
- data/app/components/hotwirebits/data_table_component.rb +40 -0
- data/app/components/hotwirebits/data_view_component.html.erb +21 -0
- data/app/components/hotwirebits/data_view_component.rb +76 -0
- data/app/components/hotwirebits/date_picker_component.html.erb +8 -0
- data/app/components/hotwirebits/date_picker_component.rb +61 -0
- data/app/components/hotwirebits/date_range_picker_component.html.erb +28 -0
- data/app/components/hotwirebits/date_range_picker_component.rb +14 -0
- data/app/components/hotwirebits/device_frame_component.html.erb +40 -0
- data/app/components/hotwirebits/device_frame_component.rb +36 -0
- data/app/components/hotwirebits/device_mockup_component.html.erb +51 -0
- data/app/components/hotwirebits/device_mockup_component.rb +37 -0
- data/app/components/hotwirebits/dialog_component.html.erb +41 -0
- data/app/components/hotwirebits/dialog_component.rb +49 -0
- data/app/components/hotwirebits/diff_component.html.erb +22 -0
- data/app/components/hotwirebits/diff_component.rb +21 -0
- data/app/components/hotwirebits/diff_view_component.html.erb +22 -0
- data/app/components/hotwirebits/diff_view_component.rb +39 -0
- data/app/components/hotwirebits/digital_signature_component.html.erb +21 -0
- data/app/components/hotwirebits/digital_signature_component.rb +14 -0
- data/app/components/hotwirebits/divider_component.html.erb +11 -0
- data/app/components/hotwirebits/divider_component.rb +29 -0
- data/app/components/hotwirebits/dock_menu_component.html.erb +21 -0
- data/app/components/hotwirebits/dock_menu_component.rb +10 -0
- data/app/components/hotwirebits/drag_drop_list_component.html.erb +16 -0
- data/app/components/hotwirebits/drag_drop_list_component.rb +20 -0
- data/app/components/hotwirebits/drawer_component.html.erb +38 -0
- data/app/components/hotwirebits/drawer_component.rb +21 -0
- data/app/components/hotwirebits/dropdown_component.html.erb +27 -0
- data/app/components/hotwirebits/dropdown_component.rb +21 -0
- data/app/components/hotwirebits/dropzone_component.html.erb +16 -0
- data/app/components/hotwirebits/dropzone_component.rb +15 -0
- data/app/components/hotwirebits/empty_cart_component.html.erb +19 -0
- data/app/components/hotwirebits/empty_cart_component.rb +14 -0
- data/app/components/hotwirebits/empty_state_component.html.erb +20 -0
- data/app/components/hotwirebits/empty_state_component.rb +14 -0
- data/app/components/hotwirebits/error_page_component.html.erb +14 -0
- data/app/components/hotwirebits/error_page_component.rb +30 -0
- data/app/components/hotwirebits/faq_section_component.html.erb +26 -0
- data/app/components/hotwirebits/faq_section_component.rb +18 -0
- data/app/components/hotwirebits/feature_section_component.html.erb +27 -0
- data/app/components/hotwirebits/feature_section_component.rb +24 -0
- data/app/components/hotwirebits/feedback_component.html.erb +51 -0
- data/app/components/hotwirebits/feedback_component.rb +23 -0
- data/app/components/hotwirebits/fieldset_component.html.erb +11 -0
- data/app/components/hotwirebits/fieldset_component.rb +21 -0
- data/app/components/hotwirebits/file_browser_component.html.erb +35 -0
- data/app/components/hotwirebits/file_browser_component.rb +11 -0
- data/app/components/hotwirebits/file_input_component.html.erb +7 -0
- data/app/components/hotwirebits/file_input_component.rb +25 -0
- data/app/components/hotwirebits/file_upload_progress_component.html.erb +26 -0
- data/app/components/hotwirebits/file_upload_progress_component.rb +33 -0
- data/app/components/hotwirebits/flex_component.html.erb +3 -0
- data/app/components/hotwirebits/flex_component.rb +37 -0
- data/app/components/hotwirebits/float_label_component.html.erb +4 -0
- data/app/components/hotwirebits/float_label_component.rb +11 -0
- data/app/components/hotwirebits/fluid_component.html.erb +3 -0
- data/app/components/hotwirebits/fluid_component.rb +13 -0
- data/app/components/hotwirebits/flyout_menu_component.html.erb +35 -0
- data/app/components/hotwirebits/flyout_menu_component.rb +25 -0
- data/app/components/hotwirebits/footer_component.html.erb +43 -0
- data/app/components/hotwirebits/footer_component.rb +13 -0
- data/app/components/hotwirebits/form_fieldset_component.html.erb +9 -0
- data/app/components/hotwirebits/form_fieldset_component.rb +11 -0
- data/app/components/hotwirebits/form_group_component.html.erb +31 -0
- data/app/components/hotwirebits/form_group_component.rb +15 -0
- data/app/components/hotwirebits/gallery_component.html.erb +25 -0
- data/app/components/hotwirebits/gallery_component.rb +29 -0
- data/app/components/hotwirebits/grid_component.html.erb +3 -0
- data/app/components/hotwirebits/grid_component.rb +31 -0
- data/app/components/hotwirebits/group_component.html.erb +3 -0
- data/app/components/hotwirebits/group_component.rb +27 -0
- data/app/components/hotwirebits/header_component.html.erb +25 -0
- data/app/components/hotwirebits/header_component.rb +23 -0
- data/app/components/hotwirebits/header_section_component.html.erb +33 -0
- data/app/components/hotwirebits/header_section_component.rb +18 -0
- data/app/components/hotwirebits/hero_component.html.erb +35 -0
- data/app/components/hotwirebits/hero_component.rb +36 -0
- data/app/components/hotwirebits/highlight_component.html.erb +1 -0
- data/app/components/hotwirebits/highlight_component.rb +21 -0
- data/app/components/hotwirebits/hover3d_card_component.html.erb +10 -0
- data/app/components/hotwirebits/hover3d_card_component.rb +16 -0
- data/app/components/hotwirebits/hover_card_component.html.erb +19 -0
- data/app/components/hotwirebits/hover_card_component.rb +35 -0
- data/app/components/hotwirebits/hover_gallery_component.html.erb +23 -0
- data/app/components/hotwirebits/hover_gallery_component.rb +15 -0
- data/app/components/hotwirebits/icon_field_component.html.erb +9 -0
- data/app/components/hotwirebits/icon_field_component.rb +35 -0
- data/app/components/hotwirebits/ifta_label_component.html.erb +4 -0
- data/app/components/hotwirebits/ifta_label_component.rb +11 -0
- data/app/components/hotwirebits/image_compare_component.html.erb +21 -0
- data/app/components/hotwirebits/image_compare_component.rb +19 -0
- data/app/components/hotwirebits/image_component.html.erb +22 -0
- data/app/components/hotwirebits/image_component.rb +23 -0
- data/app/components/hotwirebits/image_zoom_component.html.erb +8 -0
- data/app/components/hotwirebits/image_zoom_component.rb +17 -0
- data/app/components/hotwirebits/incentive_component.html.erb +11 -0
- data/app/components/hotwirebits/incentive_component.rb +16 -0
- data/app/components/hotwirebits/indicator_badge_component.html.erb +8 -0
- data/app/components/hotwirebits/indicator_badge_component.rb +33 -0
- data/app/components/hotwirebits/indicator_component.html.erb +6 -0
- data/app/components/hotwirebits/indicator_component.rb +30 -0
- data/app/components/hotwirebits/inline_edit_component.html.erb +50 -0
- data/app/components/hotwirebits/inline_edit_component.rb +16 -0
- data/app/components/hotwirebits/inplace_component.html.erb +6 -0
- data/app/components/hotwirebits/inplace_component.rb +39 -0
- data/app/components/hotwirebits/input_component.html.erb +13 -0
- data/app/components/hotwirebits/input_component.rb +97 -0
- data/app/components/hotwirebits/input_group_component.html.erb +9 -0
- data/app/components/hotwirebits/input_group_component.rb +38 -0
- data/app/components/hotwirebits/input_number_component.html.erb +14 -0
- data/app/components/hotwirebits/input_number_component.rb +78 -0
- data/app/components/hotwirebits/input_otp_component.html.erb +6 -0
- data/app/components/hotwirebits/input_otp_component.rb +29 -0
- data/app/components/hotwirebits/input_tags_component.html.erb +12 -0
- data/app/components/hotwirebits/input_tags_component.rb +31 -0
- data/app/components/hotwirebits/join_component.html.erb +3 -0
- data/app/components/hotwirebits/join_component.rb +18 -0
- data/app/components/hotwirebits/json_input_component.html.erb +14 -0
- data/app/components/hotwirebits/json_input_component.rb +20 -0
- data/app/components/hotwirebits/kanban_board_component.html.erb +39 -0
- data/app/components/hotwirebits/kanban_board_component.rb +17 -0
- data/app/components/hotwirebits/kbd_component.html.erb +1 -0
- data/app/components/hotwirebits/kbd_component.rb +27 -0
- data/app/components/hotwirebits/knob_component.html.erb +16 -0
- data/app/components/hotwirebits/knob_component.rb +23 -0
- data/app/components/hotwirebits/label_component.html.erb +5 -0
- data/app/components/hotwirebits/label_component.rb +18 -0
- data/app/components/hotwirebits/lightbox_component.html.erb +30 -0
- data/app/components/hotwirebits/lightbox_component.rb +11 -0
- data/app/components/hotwirebits/like_button_component.html.erb +15 -0
- data/app/components/hotwirebits/like_button_component.rb +23 -0
- data/app/components/hotwirebits/list_component.html.erb +3 -0
- data/app/components/hotwirebits/list_component.rb +19 -0
- data/app/components/hotwirebits/listbox_component.html.erb +16 -0
- data/app/components/hotwirebits/listbox_component.rb +52 -0
- data/app/components/hotwirebits/loading_overlay_component.html.erb +12 -0
- data/app/components/hotwirebits/loading_overlay_component.rb +23 -0
- data/app/components/hotwirebits/logo_cloud_component.html.erb +20 -0
- data/app/components/hotwirebits/logo_cloud_component.rb +23 -0
- data/app/components/hotwirebits/logo_item_component.html.erb +7 -0
- data/app/components/hotwirebits/logo_item_component.rb +20 -0
- data/app/components/hotwirebits/mark_component.html.erb +1 -0
- data/app/components/hotwirebits/mark_component.rb +17 -0
- data/app/components/hotwirebits/marquee_component.html.erb +29 -0
- data/app/components/hotwirebits/marquee_component.rb +38 -0
- data/app/components/hotwirebits/mask_component.html.erb +3 -0
- data/app/components/hotwirebits/mask_component.rb +25 -0
- data/app/components/hotwirebits/mega_menu_component.html.erb +43 -0
- data/app/components/hotwirebits/mega_menu_component.rb +11 -0
- data/app/components/hotwirebits/menu_component.html.erb +32 -0
- data/app/components/hotwirebits/menu_component.rb +20 -0
- data/app/components/hotwirebits/menubar_component.html.erb +30 -0
- data/app/components/hotwirebits/menubar_component.rb +10 -0
- data/app/components/hotwirebits/meter_group_component.html.erb +16 -0
- data/app/components/hotwirebits/meter_group_component.rb +36 -0
- data/app/components/hotwirebits/month_picker_component.html.erb +25 -0
- data/app/components/hotwirebits/month_picker_component.rb +51 -0
- data/app/components/hotwirebits/month_picker_input_component.html.erb +20 -0
- data/app/components/hotwirebits/month_picker_input_component.rb +21 -0
- data/app/components/hotwirebits/multiselect_component.html.erb +18 -0
- data/app/components/hotwirebits/multiselect_component.rb +56 -0
- data/app/components/hotwirebits/native_select_component.html.erb +10 -0
- data/app/components/hotwirebits/native_select_component.rb +20 -0
- data/app/components/hotwirebits/nav_link_component.html.erb +9 -0
- data/app/components/hotwirebits/nav_link_component.rb +23 -0
- data/app/components/hotwirebits/navbar_component.html.erb +25 -0
- data/app/components/hotwirebits/navbar_component.rb +26 -0
- data/app/components/hotwirebits/navigation_menu_component.html.erb +43 -0
- data/app/components/hotwirebits/navigation_menu_component.rb +10 -0
- data/app/components/hotwirebits/newsletter_section_component.html.erb +18 -0
- data/app/components/hotwirebits/newsletter_section_component.rb +15 -0
- data/app/components/hotwirebits/notification_bell_component.html.erb +18 -0
- data/app/components/hotwirebits/notification_bell_component.rb +22 -0
- data/app/components/hotwirebits/notification_component.html.erb +28 -0
- data/app/components/hotwirebits/notification_component.rb +23 -0
- data/app/components/hotwirebits/number_formatter_component.html.erb +1 -0
- data/app/components/hotwirebits/number_formatter_component.rb +27 -0
- data/app/components/hotwirebits/number_input_component.html.erb +1 -0
- data/app/components/hotwirebits/number_input_component.rb +32 -0
- data/app/components/hotwirebits/order_summary_component.html.erb +37 -0
- data/app/components/hotwirebits/order_summary_component.rb +23 -0
- data/app/components/hotwirebits/org_chart_component.html.erb +34 -0
- data/app/components/hotwirebits/org_chart_component.rb +14 -0
- data/app/components/hotwirebits/page_heading_component.html.erb +28 -0
- data/app/components/hotwirebits/page_heading_component.rb +18 -0
- data/app/components/hotwirebits/pagination_component.html.erb +29 -0
- data/app/components/hotwirebits/pagination_component.rb +32 -0
- data/app/components/hotwirebits/paginator_component.html.erb +36 -0
- data/app/components/hotwirebits/paginator_component.rb +44 -0
- data/app/components/hotwirebits/panel_component.html.erb +14 -0
- data/app/components/hotwirebits/panel_component.rb +48 -0
- data/app/components/hotwirebits/password_input_component.html.erb +8 -0
- data/app/components/hotwirebits/password_input_component.rb +72 -0
- data/app/components/hotwirebits/password_strength_component.html.erb +18 -0
- data/app/components/hotwirebits/password_strength_component.rb +24 -0
- data/app/components/hotwirebits/password_toggle_component.html.erb +15 -0
- data/app/components/hotwirebits/password_toggle_component.rb +10 -0
- data/app/components/hotwirebits/permission_badge_component.html.erb +15 -0
- data/app/components/hotwirebits/permission_badge_component.rb +33 -0
- data/app/components/hotwirebits/phone_input_component.html.erb +1 -0
- data/app/components/hotwirebits/phone_input_component.rb +29 -0
- data/app/components/hotwirebits/phone_mockup_component.html.erb +12 -0
- data/app/components/hotwirebits/phone_mockup_component.rb +30 -0
- data/app/components/hotwirebits/popover_component.html.erb +20 -0
- data/app/components/hotwirebits/popover_component.rb +45 -0
- data/app/components/hotwirebits/portal_component.html.erb +3 -0
- data/app/components/hotwirebits/portal_component.rb +10 -0
- data/app/components/hotwirebits/pricing_section_component.html.erb +46 -0
- data/app/components/hotwirebits/pricing_section_component.rb +19 -0
- data/app/components/hotwirebits/product_list_component.html.erb +24 -0
- data/app/components/hotwirebits/product_list_component.rb +21 -0
- data/app/components/hotwirebits/product_overview_component.html.erb +59 -0
- data/app/components/hotwirebits/product_overview_component.rb +19 -0
- data/app/components/hotwirebits/product_quickview_component.html.erb +45 -0
- data/app/components/hotwirebits/product_quickview_component.rb +15 -0
- data/app/components/hotwirebits/progress_component.html.erb +10 -0
- data/app/components/hotwirebits/progress_component.rb +49 -0
- data/app/components/hotwirebits/progress_ring_component.html.erb +26 -0
- data/app/components/hotwirebits/progress_ring_component.rb +47 -0
- data/app/components/hotwirebits/promo_section_component.html.erb +31 -0
- data/app/components/hotwirebits/promo_section_component.rb +30 -0
- data/app/components/hotwirebits/qr_code_component.html.erb +19 -0
- data/app/components/hotwirebits/qr_code_component.rb +177 -0
- data/app/components/hotwirebits/radio_component.html.erb +6 -0
- data/app/components/hotwirebits/radio_component.rb +40 -0
- data/app/components/hotwirebits/range_slider_component.html.erb +9 -0
- data/app/components/hotwirebits/range_slider_component.rb +57 -0
- data/app/components/hotwirebits/rating_component.html.erb +11 -0
- data/app/components/hotwirebits/rating_component.rb +53 -0
- data/app/components/hotwirebits/resizable_component.html.erb +19 -0
- data/app/components/hotwirebits/resizable_component.rb +35 -0
- data/app/components/hotwirebits/review_component.html.erb +36 -0
- data/app/components/hotwirebits/review_component.rb +19 -0
- data/app/components/hotwirebits/rich_text_editor_component.html.erb +55 -0
- data/app/components/hotwirebits/rich_text_editor_component.rb +15 -0
- data/app/components/hotwirebits/scroll_area_component.html.erb +3 -0
- data/app/components/hotwirebits/scroll_area_component.rb +28 -0
- data/app/components/hotwirebits/search_component.html.erb +56 -0
- data/app/components/hotwirebits/search_component.rb +21 -0
- data/app/components/hotwirebits/search_input_component.html.erb +6 -0
- data/app/components/hotwirebits/search_input_component.rb +50 -0
- data/app/components/hotwirebits/section_heading_component.html.erb +6 -0
- data/app/components/hotwirebits/section_heading_component.rb +26 -0
- data/app/components/hotwirebits/select_component.html.erb +16 -0
- data/app/components/hotwirebits/select_component.rb +38 -0
- data/app/components/hotwirebits/semi_circle_progress_component.html.erb +9 -0
- data/app/components/hotwirebits/semi_circle_progress_component.rb +52 -0
- data/app/components/hotwirebits/separator_component.html.erb +9 -0
- data/app/components/hotwirebits/separator_component.rb +26 -0
- data/app/components/hotwirebits/sheet_component.html.erb +42 -0
- data/app/components/hotwirebits/sheet_component.rb +44 -0
- data/app/components/hotwirebits/shopping_cart_component.html.erb +46 -0
- data/app/components/hotwirebits/shopping_cart_component.rb +17 -0
- data/app/components/hotwirebits/sidebar_component.html.erb +40 -0
- data/app/components/hotwirebits/sidebar_component.rb +29 -0
- data/app/components/hotwirebits/simple_grid_component.html.erb +3 -0
- data/app/components/hotwirebits/simple_grid_component.rb +23 -0
- data/app/components/hotwirebits/skeleton_card_component.html.erb +15 -0
- data/app/components/hotwirebits/skeleton_card_component.rb +17 -0
- data/app/components/hotwirebits/skeleton_component.html.erb +5 -0
- data/app/components/hotwirebits/skeleton_component.rb +39 -0
- data/app/components/hotwirebits/slider_component.html.erb +3 -0
- data/app/components/hotwirebits/slider_component.rb +34 -0
- data/app/components/hotwirebits/social_share_component.html.erb +20 -0
- data/app/components/hotwirebits/social_share_component.rb +25 -0
- data/app/components/hotwirebits/space_component.html.erb +1 -0
- data/app/components/hotwirebits/space_component.rb +22 -0
- data/app/components/hotwirebits/speed_dial_component.html.erb +24 -0
- data/app/components/hotwirebits/speed_dial_component.rb +41 -0
- data/app/components/hotwirebits/speed_dial_fab_component.html.erb +30 -0
- data/app/components/hotwirebits/speed_dial_fab_component.rb +27 -0
- data/app/components/hotwirebits/spinner_component.html.erb +10 -0
- data/app/components/hotwirebits/spinner_component.rb +20 -0
- data/app/components/hotwirebits/split_button_component.html.erb +20 -0
- data/app/components/hotwirebits/split_button_component.rb +33 -0
- data/app/components/hotwirebits/splitter_component.html.erb +9 -0
- data/app/components/hotwirebits/splitter_component.rb +38 -0
- data/app/components/hotwirebits/spoiler_component.html.erb +17 -0
- data/app/components/hotwirebits/spoiler_component.rb +12 -0
- data/app/components/hotwirebits/stack_component.html.erb +3 -0
- data/app/components/hotwirebits/stack_component.rb +28 -0
- data/app/components/hotwirebits/stacked_list_component.html.erb +20 -0
- data/app/components/hotwirebits/stacked_list_component.rb +18 -0
- data/app/components/hotwirebits/stat_component.html.erb +21 -0
- data/app/components/hotwirebits/stat_component.rb +26 -0
- data/app/components/hotwirebits/stats_component.html.erb +15 -0
- data/app/components/hotwirebits/stats_component.rb +25 -0
- data/app/components/hotwirebits/status_bar_component.html.erb +13 -0
- data/app/components/hotwirebits/status_bar_component.rb +20 -0
- data/app/components/hotwirebits/status_component.html.erb +6 -0
- data/app/components/hotwirebits/status_component.rb +30 -0
- data/app/components/hotwirebits/status_dot_component.html.erb +11 -0
- data/app/components/hotwirebits/status_dot_component.rb +37 -0
- data/app/components/hotwirebits/stepper_form_component.html.erb +55 -0
- data/app/components/hotwirebits/stepper_form_component.rb +23 -0
- data/app/components/hotwirebits/steps_component.html.erb +45 -0
- data/app/components/hotwirebits/steps_component.rb +44 -0
- data/app/components/hotwirebits/swap_component.html.erb +18 -0
- data/app/components/hotwirebits/swap_component.rb +29 -0
- data/app/components/hotwirebits/switch_component.html.erb +9 -0
- data/app/components/hotwirebits/switch_component.rb +51 -0
- data/app/components/hotwirebits/table_component.html.erb +5 -0
- data/app/components/hotwirebits/table_component.rb +27 -0
- data/app/components/hotwirebits/table_of_contents_component.html.erb +12 -0
- data/app/components/hotwirebits/table_of_contents_component.rb +23 -0
- data/app/components/hotwirebits/tabs_component.html.erb +43 -0
- data/app/components/hotwirebits/tabs_component.rb +58 -0
- data/app/components/hotwirebits/tag_component.html.erb +3 -0
- data/app/components/hotwirebits/tag_component.rb +35 -0
- data/app/components/hotwirebits/tag_input_component.html.erb +14 -0
- data/app/components/hotwirebits/tag_input_component.rb +56 -0
- data/app/components/hotwirebits/team_section_component.html.erb +39 -0
- data/app/components/hotwirebits/team_section_component.rb +20 -0
- data/app/components/hotwirebits/terminal_component.html.erb +21 -0
- data/app/components/hotwirebits/terminal_component.rb +11 -0
- data/app/components/hotwirebits/testimonial_component.html.erb +29 -0
- data/app/components/hotwirebits/testimonial_component.rb +22 -0
- data/app/components/hotwirebits/testimonials_section_component.html.erb +34 -0
- data/app/components/hotwirebits/testimonials_section_component.rb +23 -0
- data/app/components/hotwirebits/text_gradient_component.html.erb +3 -0
- data/app/components/hotwirebits/text_gradient_component.rb +18 -0
- data/app/components/hotwirebits/text_rotate_component.html.erb +7 -0
- data/app/components/hotwirebits/text_rotate_component.rb +24 -0
- data/app/components/hotwirebits/textarea_component.html.erb +1 -0
- data/app/components/hotwirebits/textarea_component.rb +35 -0
- data/app/components/hotwirebits/theme_controller_component.html.erb +13 -0
- data/app/components/hotwirebits/theme_controller_component.rb +11 -0
- data/app/components/hotwirebits/theme_icon_component.html.erb +3 -0
- data/app/components/hotwirebits/theme_icon_component.rb +18 -0
- data/app/components/hotwirebits/theme_selector_component.html.erb +27 -0
- data/app/components/hotwirebits/theme_selector_component.rb +11 -0
- data/app/components/hotwirebits/time_picker_component.html.erb +29 -0
- data/app/components/hotwirebits/time_picker_component.rb +28 -0
- data/app/components/hotwirebits/timeline_component.html.erb +24 -0
- data/app/components/hotwirebits/timeline_component.rb +17 -0
- data/app/components/hotwirebits/toast_component.html.erb +34 -0
- data/app/components/hotwirebits/toast_component.rb +47 -0
- data/app/components/hotwirebits/toggle_button_component.html.erb +4 -0
- data/app/components/hotwirebits/toggle_button_component.rb +31 -0
- data/app/components/hotwirebits/toggle_button_group_component.html.erb +8 -0
- data/app/components/hotwirebits/toggle_button_group_component.rb +54 -0
- data/app/components/hotwirebits/toggle_component.html.erb +3 -0
- data/app/components/hotwirebits/toggle_component.rb +38 -0
- data/app/components/hotwirebits/toolbar_component.html.erb +18 -0
- data/app/components/hotwirebits/toolbar_component.rb +50 -0
- data/app/components/hotwirebits/tooltip_component.html.erb +16 -0
- data/app/components/hotwirebits/tooltip_component.rb +32 -0
- data/app/components/hotwirebits/tree_view_component.html.erb +7 -0
- data/app/components/hotwirebits/tree_view_component.rb +47 -0
- data/app/components/hotwirebits/two_factor_component.html.erb +26 -0
- data/app/components/hotwirebits/two_factor_component.rb +14 -0
- data/app/components/hotwirebits/typing_indicator_component.html.erb +5 -0
- data/app/components/hotwirebits/typing_indicator_component.rb +33 -0
- data/app/components/hotwirebits/typography_component.html.erb +3 -0
- data/app/components/hotwirebits/typography_component.rb +35 -0
- data/app/components/hotwirebits/validator_component.html.erb +20 -0
- data/app/components/hotwirebits/validator_component.rb +12 -0
- data/app/components/hotwirebits/version_diff_component.html.erb +17 -0
- data/app/components/hotwirebits/version_diff_component.rb +38 -0
- data/app/components/hotwirebits/video_player_component.html.erb +11 -0
- data/app/components/hotwirebits/video_player_component.rb +29 -0
- data/app/components/hotwirebits/voice_recorder_component.html.erb +29 -0
- data/app/components/hotwirebits/voice_recorder_component.rb +14 -0
- data/app/components/hotwirebits/window_mockup_component.html.erb +20 -0
- data/app/components/hotwirebits/window_mockup_component.rb +11 -0
- data/app/helpers/hotwirebits_helper.rb +738 -0
- data/app/javascript/controllers/hotwirebits/index.js +216 -0
- data/app/javascript/controllers/hotwirebits/rb_accordion_controller.js +16 -0
- data/app/javascript/controllers/hotwirebits/rb_activity_feed_controller.js +11 -0
- data/app/javascript/controllers/hotwirebits/rb_ai_chat_controller.js +21 -0
- data/app/javascript/controllers/hotwirebits/rb_alert_controller.js +24 -0
- data/app/javascript/controllers/hotwirebits/rb_angle_slider_controller.js +11 -0
- data/app/javascript/controllers/hotwirebits/rb_animated_number_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_autocomplete_controller.js +34 -0
- data/app/javascript/controllers/hotwirebits/rb_badge_controller.js +8 -0
- data/app/javascript/controllers/hotwirebits/rb_banner_controller.js +27 -0
- data/app/javascript/controllers/hotwirebits/rb_burger_controller.js +25 -0
- data/app/javascript/controllers/hotwirebits/rb_calendar_controller.js +85 -0
- data/app/javascript/controllers/hotwirebits/rb_carousel_controller.js +74 -0
- data/app/javascript/controllers/hotwirebits/rb_clipboard_controller.js +42 -0
- data/app/javascript/controllers/hotwirebits/rb_code_highlight_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_collapsible_controller.js +51 -0
- data/app/javascript/controllers/hotwirebits/rb_color_input_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_color_picker_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_combobox_controller.js +91 -0
- data/app/javascript/controllers/hotwirebits/rb_command_bar_controller.js +32 -0
- data/app/javascript/controllers/hotwirebits/rb_compare_controller.js +18 -0
- data/app/javascript/controllers/hotwirebits/rb_confirm_dialog_controller.js +11 -0
- data/app/javascript/controllers/hotwirebits/rb_confirm_popup_controller.js +10 -0
- data/app/javascript/controllers/hotwirebits/rb_context_menu_controller.js +27 -0
- data/app/javascript/controllers/hotwirebits/rb_cookie_consent_controller.js +60 -0
- data/app/javascript/controllers/hotwirebits/rb_cookie_settings_controller.js +9 -0
- data/app/javascript/controllers/hotwirebits/rb_countdown_controller.js +60 -0
- data/app/javascript/controllers/hotwirebits/rb_data_view_controller.js +10 -0
- data/app/javascript/controllers/hotwirebits/rb_date_range_controller.js +9 -0
- data/app/javascript/controllers/hotwirebits/rb_datepicker_controller.js +107 -0
- data/app/javascript/controllers/hotwirebits/rb_dialog_controller.js +68 -0
- data/app/javascript/controllers/hotwirebits/rb_drag_drop_controller.js +21 -0
- data/app/javascript/controllers/hotwirebits/rb_drawer_controller.js +69 -0
- data/app/javascript/controllers/hotwirebits/rb_dropdown_controller.js +73 -0
- data/app/javascript/controllers/hotwirebits/rb_feedback_controller.js +50 -0
- data/app/javascript/controllers/hotwirebits/rb_file_browser_controller.js +9 -0
- data/app/javascript/controllers/hotwirebits/rb_highlight_controller.js +47 -0
- data/app/javascript/controllers/hotwirebits/rb_hover_3d_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_hover_card_controller.js +19 -0
- data/app/javascript/controllers/hotwirebits/rb_hover_gallery_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_image_compare_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_image_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_image_zoom_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_inline_edit_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_inplace_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_input_number_controller.js +9 -0
- data/app/javascript/controllers/hotwirebits/rb_json_input_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_kanban_controller.js +78 -0
- data/app/javascript/controllers/hotwirebits/rb_knob_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_lightbox_controller.js +36 -0
- data/app/javascript/controllers/hotwirebits/rb_like_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_listbox_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_marquee_controller.js +68 -0
- data/app/javascript/controllers/hotwirebits/rb_menubar_controller.js +78 -0
- data/app/javascript/controllers/hotwirebits/rb_month_picker_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_month_picker_input_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_multiselect_controller.js +83 -0
- data/app/javascript/controllers/hotwirebits/rb_nav_menu_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_newsletter_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_notification_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_otp_controller.js +54 -0
- data/app/javascript/controllers/hotwirebits/rb_paginator_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_panel_controller.js +12 -0
- data/app/javascript/controllers/hotwirebits/rb_password_controller.js +36 -0
- data/app/javascript/controllers/hotwirebits/rb_password_strength_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_password_toggle_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_popover_controller.js +61 -0
- data/app/javascript/controllers/hotwirebits/rb_portal_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_quickview_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_range_slider_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_rating_controller.js +55 -0
- data/app/javascript/controllers/hotwirebits/rb_resizable_controller.js +82 -0
- data/app/javascript/controllers/hotwirebits/rb_rich_text_editor_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_search_controller.js +70 -0
- data/app/javascript/controllers/hotwirebits/rb_sheet_controller.js +43 -0
- data/app/javascript/controllers/hotwirebits/rb_sidebar_controller.js +66 -0
- data/app/javascript/controllers/hotwirebits/rb_signature_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_speed_dial_controller.js +64 -0
- data/app/javascript/controllers/hotwirebits/rb_splitter_controller.js +27 -0
- data/app/javascript/controllers/hotwirebits/rb_spoiler_controller.js +26 -0
- data/app/javascript/controllers/hotwirebits/rb_stepper_form_controller.js +11 -0
- data/app/javascript/controllers/hotwirebits/rb_steps_controller.js +46 -0
- data/app/javascript/controllers/hotwirebits/rb_swap_controller.js +22 -0
- data/app/javascript/controllers/hotwirebits/rb_switch_controller.js +33 -0
- data/app/javascript/controllers/hotwirebits/rb_tabs_controller.js +46 -0
- data/app/javascript/controllers/hotwirebits/rb_tag_input_controller.js +19 -0
- data/app/javascript/controllers/hotwirebits/rb_tags_controller.js +50 -0
- data/app/javascript/controllers/hotwirebits/rb_text_rotate_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_theme_controller.js +48 -0
- data/app/javascript/controllers/hotwirebits/rb_theme_selector_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_time_picker_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_toast_controller.js +43 -0
- data/app/javascript/controllers/hotwirebits/rb_toggle_button_controller.js +9 -0
- data/app/javascript/controllers/hotwirebits/rb_toggle_button_group_controller.js +12 -0
- data/app/javascript/controllers/hotwirebits/rb_toggle_controller.js +28 -0
- data/app/javascript/controllers/hotwirebits/rb_tooltip_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_tree_controller.js +58 -0
- data/app/javascript/controllers/hotwirebits/rb_two_factor_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_validator_controller.js +7 -0
- data/app/javascript/controllers/hotwirebits/rb_voice_recorder_controller.js +7 -0
- data/app/views/hotwirebits/_accordion.html.erb +26 -0
- data/app/views/hotwirebits/_activity_feed.html.erb +43 -0
- data/app/views/hotwirebits/_affix.html.erb +6 -0
- data/app/views/hotwirebits/_ai_chat.html.erb +35 -0
- data/app/views/hotwirebits/_alert.html.erb +53 -0
- data/app/views/hotwirebits/_alert_dialog.html.erb +33 -0
- data/app/views/hotwirebits/_anchor.html.erb +12 -0
- data/app/views/hotwirebits/_angle_slider.html.erb +12 -0
- data/app/views/hotwirebits/_animated_number.html.erb +11 -0
- data/app/views/hotwirebits/_app_shell.html.erb +25 -0
- data/app/views/hotwirebits/_aspect_ratio.html.erb +6 -0
- data/app/views/hotwirebits/_auth_block.html.erb +66 -0
- data/app/views/hotwirebits/_autocomplete.html.erb +8 -0
- data/app/views/hotwirebits/_avatar.html.erb +32 -0
- data/app/views/hotwirebits/_background_image.html.erb +12 -0
- data/app/views/hotwirebits/_badge.html.erb +32 -0
- data/app/views/hotwirebits/_banner.html.erb +52 -0
- data/app/views/hotwirebits/_bento_grid.html.erb +10 -0
- data/app/views/hotwirebits/_blog_section.html.erb +38 -0
- data/app/views/hotwirebits/_bottom_navigation.html.erb +24 -0
- data/app/views/hotwirebits/_box.html.erb +6 -0
- data/app/views/hotwirebits/_breadcrumb.html.erb +28 -0
- data/app/views/hotwirebits/_breadcrumb_advanced.html.erb +56 -0
- data/app/views/hotwirebits/_browser_mockup.html.erb +25 -0
- data/app/views/hotwirebits/_burger.html.erb +23 -0
- data/app/views/hotwirebits/_button.html.erb +59 -0
- data/app/views/hotwirebits/_calendar.html.erb +73 -0
- data/app/views/hotwirebits/_card.html.erb +23 -0
- data/app/views/hotwirebits/_card_heading.html.erb +16 -0
- data/app/views/hotwirebits/_carousel.html.erb +53 -0
- data/app/views/hotwirebits/_center.html.erb +6 -0
- data/app/views/hotwirebits/_chart.html.erb +71 -0
- data/app/views/hotwirebits/_chat_bubble.html.erb +30 -0
- data/app/views/hotwirebits/_checkbox.html.erb +25 -0
- data/app/views/hotwirebits/_checkout_form.html.erb +43 -0
- data/app/views/hotwirebits/_chip.html.erb +30 -0
- data/app/views/hotwirebits/_clipboard.html.erb +29 -0
- data/app/views/hotwirebits/_close_button.html.erb +6 -0
- data/app/views/hotwirebits/_code_block.html.erb +20 -0
- data/app/views/hotwirebits/_code_highlight.html.erb +9 -0
- data/app/views/hotwirebits/_code_mockup.html.erb +16 -0
- data/app/views/hotwirebits/_collapsible.html.erb +20 -0
- data/app/views/hotwirebits/_color_input.html.erb +22 -0
- data/app/views/hotwirebits/_color_picker.html.erb +9 -0
- data/app/views/hotwirebits/_color_swatch.html.erb +4 -0
- data/app/views/hotwirebits/_combobox.html.erb +18 -0
- data/app/views/hotwirebits/_command_bar.html.erb +36 -0
- data/app/views/hotwirebits/_compare.html.erb +24 -0
- data/app/views/hotwirebits/_confirm_dialog.html.erb +20 -0
- data/app/views/hotwirebits/_confirm_popup.html.erb +19 -0
- data/app/views/hotwirebits/_contact_section.html.erb +56 -0
- data/app/views/hotwirebits/_container.html.erb +21 -0
- data/app/views/hotwirebits/_context_menu.html.erb +30 -0
- data/app/views/hotwirebits/_cookie_consent.html.erb +26 -0
- data/app/views/hotwirebits/_cookie_settings.html.erb +51 -0
- data/app/views/hotwirebits/_countdown.html.erb +11 -0
- data/app/views/hotwirebits/_cta_section.html.erb +36 -0
- data/app/views/hotwirebits/_dashboard_card.html.erb +35 -0
- data/app/views/hotwirebits/_data_table.html.erb +56 -0
- data/app/views/hotwirebits/_data_view.html.erb +24 -0
- data/app/views/hotwirebits/_date_picker.html.erb +11 -0
- data/app/views/hotwirebits/_date_range_picker.html.erb +31 -0
- data/app/views/hotwirebits/_device_frame.html.erb +43 -0
- data/app/views/hotwirebits/_device_mockup.html.erb +54 -0
- data/app/views/hotwirebits/_dialog.html.erb +58 -0
- data/app/views/hotwirebits/_diff.html.erb +25 -0
- data/app/views/hotwirebits/_diff_view.html.erb +25 -0
- data/app/views/hotwirebits/_digital_signature.html.erb +24 -0
- data/app/views/hotwirebits/_divider.html.erb +22 -0
- data/app/views/hotwirebits/_dock_menu.html.erb +24 -0
- data/app/views/hotwirebits/_drag_drop_list.html.erb +19 -0
- data/app/views/hotwirebits/_drawer.html.erb +41 -0
- data/app/views/hotwirebits/_dropdown.html.erb +33 -0
- data/app/views/hotwirebits/_dropzone.html.erb +19 -0
- data/app/views/hotwirebits/_empty_cart.html.erb +22 -0
- data/app/views/hotwirebits/_empty_state.html.erb +29 -0
- data/app/views/hotwirebits/_error_page.html.erb +17 -0
- data/app/views/hotwirebits/_faq_section.html.erb +29 -0
- data/app/views/hotwirebits/_feature_section.html.erb +30 -0
- data/app/views/hotwirebits/_feedback.html.erb +54 -0
- data/app/views/hotwirebits/_fieldset.html.erb +14 -0
- data/app/views/hotwirebits/_file_browser.html.erb +38 -0
- data/app/views/hotwirebits/_file_input.html.erb +10 -0
- data/app/views/hotwirebits/_file_upload_progress.html.erb +29 -0
- data/app/views/hotwirebits/_flex.html.erb +6 -0
- data/app/views/hotwirebits/_float_label.html.erb +7 -0
- data/app/views/hotwirebits/_fluid.html.erb +6 -0
- data/app/views/hotwirebits/_flyout_menu.html.erb +38 -0
- data/app/views/hotwirebits/_footer.html.erb +46 -0
- data/app/views/hotwirebits/_form_group.html.erb +43 -0
- data/app/views/hotwirebits/_gallery.html.erb +28 -0
- data/app/views/hotwirebits/_grid.html.erb +14 -0
- data/app/views/hotwirebits/_group.html.erb +6 -0
- data/app/views/hotwirebits/_header.html.erb +28 -0
- data/app/views/hotwirebits/_header_section.html.erb +36 -0
- data/app/views/hotwirebits/_hero.html.erb +38 -0
- data/app/views/hotwirebits/_highlight.html.erb +4 -0
- data/app/views/hotwirebits/_hover_3d_card.html.erb +13 -0
- data/app/views/hotwirebits/_hover_card.html.erb +22 -0
- data/app/views/hotwirebits/_hover_gallery.html.erb +26 -0
- data/app/views/hotwirebits/_icon_field.html.erb +12 -0
- data/app/views/hotwirebits/_ifta_label.html.erb +7 -0
- data/app/views/hotwirebits/_image.html.erb +22 -0
- data/app/views/hotwirebits/_image_compare.html.erb +24 -0
- data/app/views/hotwirebits/_image_zoom.html.erb +11 -0
- data/app/views/hotwirebits/_incentive.html.erb +14 -0
- data/app/views/hotwirebits/_indicator.html.erb +9 -0
- data/app/views/hotwirebits/_indicator_badge.html.erb +11 -0
- data/app/views/hotwirebits/_inline_edit.html.erb +53 -0
- data/app/views/hotwirebits/_inplace.html.erb +9 -0
- data/app/views/hotwirebits/_input.html.erb +33 -0
- data/app/views/hotwirebits/_input_group.html.erb +12 -0
- data/app/views/hotwirebits/_input_number.html.erb +17 -0
- data/app/views/hotwirebits/_input_otp.html.erb +9 -0
- data/app/views/hotwirebits/_input_tags.html.erb +15 -0
- data/app/views/hotwirebits/_join.html.erb +6 -0
- data/app/views/hotwirebits/_json_input.html.erb +17 -0
- data/app/views/hotwirebits/_kanban_board.html.erb +42 -0
- data/app/views/hotwirebits/_kbd.html.erb +17 -0
- data/app/views/hotwirebits/_knob.html.erb +19 -0
- data/app/views/hotwirebits/_label.html.erb +8 -0
- data/app/views/hotwirebits/_lightbox.html.erb +33 -0
- data/app/views/hotwirebits/_like_button.html.erb +18 -0
- data/app/views/hotwirebits/_list.html.erb +6 -0
- data/app/views/hotwirebits/_listbox.html.erb +19 -0
- data/app/views/hotwirebits/_loading_overlay.html.erb +15 -0
- data/app/views/hotwirebits/_logo_cloud.html.erb +23 -0
- data/app/views/hotwirebits/_logo_item.html.erb +10 -0
- data/app/views/hotwirebits/_mark.html.erb +4 -0
- data/app/views/hotwirebits/_marquee.html.erb +32 -0
- data/app/views/hotwirebits/_mask.html.erb +6 -0
- data/app/views/hotwirebits/_mega_menu.html.erb +46 -0
- data/app/views/hotwirebits/_menu.html.erb +35 -0
- data/app/views/hotwirebits/_menubar.html.erb +33 -0
- data/app/views/hotwirebits/_meter_group.html.erb +19 -0
- data/app/views/hotwirebits/_month_picker.html.erb +28 -0
- data/app/views/hotwirebits/_month_picker_input.html.erb +23 -0
- data/app/views/hotwirebits/_multiselect.html.erb +21 -0
- data/app/views/hotwirebits/_native_select.html.erb +13 -0
- data/app/views/hotwirebits/_nav_link.html.erb +12 -0
- data/app/views/hotwirebits/_navbar.html.erb +30 -0
- data/app/views/hotwirebits/_navigation_menu.html.erb +46 -0
- data/app/views/hotwirebits/_newsletter_section.html.erb +21 -0
- data/app/views/hotwirebits/_notification.html.erb +31 -0
- data/app/views/hotwirebits/_notification_bell.html.erb +21 -0
- data/app/views/hotwirebits/_number_formatter.html.erb +4 -0
- data/app/views/hotwirebits/_number_input.html.erb +4 -0
- data/app/views/hotwirebits/_order_summary.html.erb +40 -0
- data/app/views/hotwirebits/_org_chart.html.erb +37 -0
- data/app/views/hotwirebits/_page_heading.html.erb +31 -0
- data/app/views/hotwirebits/_pagination.html.erb +46 -0
- data/app/views/hotwirebits/_paginator.html.erb +39 -0
- data/app/views/hotwirebits/_panel.html.erb +17 -0
- data/app/views/hotwirebits/_password_input.html.erb +11 -0
- data/app/views/hotwirebits/_password_strength.html.erb +21 -0
- data/app/views/hotwirebits/_password_toggle.html.erb +18 -0
- data/app/views/hotwirebits/_permission_badge.html.erb +18 -0
- data/app/views/hotwirebits/_phone_input.html.erb +4 -0
- data/app/views/hotwirebits/_phone_mockup.html.erb +15 -0
- data/app/views/hotwirebits/_popover.html.erb +23 -0
- data/app/views/hotwirebits/_portal.html.erb +6 -0
- data/app/views/hotwirebits/_pricing.html.erb +55 -0
- data/app/views/hotwirebits/_pricing_section.html.erb +49 -0
- data/app/views/hotwirebits/_product_list.html.erb +27 -0
- data/app/views/hotwirebits/_product_overview.html.erb +62 -0
- data/app/views/hotwirebits/_product_quickview.html.erb +48 -0
- data/app/views/hotwirebits/_progress.html.erb +13 -0
- data/app/views/hotwirebits/_progress_ring.html.erb +29 -0
- data/app/views/hotwirebits/_promo_section.html.erb +34 -0
- data/app/views/hotwirebits/_qr_code.html.erb +22 -0
- data/app/views/hotwirebits/_radio.html.erb +9 -0
- data/app/views/hotwirebits/_range_slider.html.erb +12 -0
- data/app/views/hotwirebits/_rating.html.erb +14 -0
- data/app/views/hotwirebits/_resizable.html.erb +22 -0
- data/app/views/hotwirebits/_review.html.erb +39 -0
- data/app/views/hotwirebits/_rich_text_editor.html.erb +58 -0
- data/app/views/hotwirebits/_scroll_area.html.erb +6 -0
- data/app/views/hotwirebits/_search.html.erb +59 -0
- data/app/views/hotwirebits/_search_input.html.erb +9 -0
- data/app/views/hotwirebits/_section_heading.html.erb +9 -0
- data/app/views/hotwirebits/_select.html.erb +30 -0
- data/app/views/hotwirebits/_semi_circle_progress.html.erb +12 -0
- data/app/views/hotwirebits/_separator.html.erb +18 -0
- data/app/views/hotwirebits/_sheet.html.erb +45 -0
- data/app/views/hotwirebits/_shopping_cart.html.erb +49 -0
- data/app/views/hotwirebits/_sidebar.html.erb +39 -0
- data/app/views/hotwirebits/_simple_grid.html.erb +6 -0
- data/app/views/hotwirebits/_skeleton.html.erb +20 -0
- data/app/views/hotwirebits/_skeleton_card.html.erb +18 -0
- data/app/views/hotwirebits/_slider.html.erb +17 -0
- data/app/views/hotwirebits/_social_share.html.erb +23 -0
- data/app/views/hotwirebits/_space.html.erb +4 -0
- data/app/views/hotwirebits/_speed_dial.html.erb +27 -0
- data/app/views/hotwirebits/_speed_dial_fab.html.erb +33 -0
- data/app/views/hotwirebits/_spinner.html.erb +22 -0
- data/app/views/hotwirebits/_split_button.html.erb +23 -0
- data/app/views/hotwirebits/_splitter.html.erb +12 -0
- data/app/views/hotwirebits/_spoiler.html.erb +20 -0
- data/app/views/hotwirebits/_stack.html.erb +20 -0
- data/app/views/hotwirebits/_stacked_list.html.erb +23 -0
- data/app/views/hotwirebits/_stat.html.erb +24 -0
- data/app/views/hotwirebits/_stats.html.erb +6 -0
- data/app/views/hotwirebits/_status.html.erb +9 -0
- data/app/views/hotwirebits/_status_bar.html.erb +16 -0
- data/app/views/hotwirebits/_status_dot.html.erb +9 -0
- data/app/views/hotwirebits/_stepper_form.html.erb +58 -0
- data/app/views/hotwirebits/_steps.html.erb +48 -0
- data/app/views/hotwirebits/_swap.html.erb +20 -0
- data/app/views/hotwirebits/_switch.html.erb +19 -0
- data/app/views/hotwirebits/_table.html.erb +8 -0
- data/app/views/hotwirebits/_table_of_contents.html.erb +15 -0
- data/app/views/hotwirebits/_tabs.html.erb +44 -0
- data/app/views/hotwirebits/_tag.html.erb +20 -0
- data/app/views/hotwirebits/_tag_input.html.erb +17 -0
- data/app/views/hotwirebits/_team_section.html.erb +42 -0
- data/app/views/hotwirebits/_terminal.html.erb +24 -0
- data/app/views/hotwirebits/_testimonial.html.erb +32 -0
- data/app/views/hotwirebits/_testimonials_section.html.erb +37 -0
- data/app/views/hotwirebits/_text_gradient.html.erb +6 -0
- data/app/views/hotwirebits/_text_rotate.html.erb +10 -0
- data/app/views/hotwirebits/_textarea.html.erb +17 -0
- data/app/views/hotwirebits/_theme_controller.html.erb +16 -0
- data/app/views/hotwirebits/_theme_icon.html.erb +6 -0
- data/app/views/hotwirebits/_theme_selector.html.erb +30 -0
- data/app/views/hotwirebits/_time_picker.html.erb +32 -0
- data/app/views/hotwirebits/_timeline.html.erb +27 -0
- data/app/views/hotwirebits/_toast.html.erb +52 -0
- data/app/views/hotwirebits/_toggle.html.erb +12 -0
- data/app/views/hotwirebits/_toggle_button.html.erb +7 -0
- data/app/views/hotwirebits/_toggle_button_group.html.erb +11 -0
- data/app/views/hotwirebits/_toolbar.html.erb +21 -0
- data/app/views/hotwirebits/_tooltip.html.erb +26 -0
- data/app/views/hotwirebits/_tree_view.html.erb +18 -0
- data/app/views/hotwirebits/_two_factor.html.erb +29 -0
- data/app/views/hotwirebits/_typing_indicator.html.erb +8 -0
- data/app/views/hotwirebits/_typography.html.erb +7 -0
- data/app/views/hotwirebits/_validator.html.erb +23 -0
- data/app/views/hotwirebits/_version_diff.html.erb +20 -0
- data/app/views/hotwirebits/_video_player.html.erb +14 -0
- data/app/views/hotwirebits/_voice_recorder.html.erb +32 -0
- data/app/views/hotwirebits/_window_mockup.html.erb +23 -0
- data/config/routes.rb +4 -0
- data/lib/generators/hotwirebits/component_generator.rb +48 -0
- data/lib/generators/hotwirebits/install_generator.rb +47 -0
- data/lib/generators/hotwirebits/templates/component.html.erb.tt +4 -0
- data/lib/generators/hotwirebits/templates/component.rb.tt +9 -0
- data/lib/generators/hotwirebits/templates/controller.js.tt +6 -0
- data/lib/generators/hotwirebits/templates/theme.css +2 -0
- data/lib/hotwirebits/engine.rb +25 -0
- data/lib/hotwirebits/version.rb +5 -0
- data/lib/hotwirebits.rb +19 -0
- metadata +965 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: a40b7de08a273db156eb6165af49330d2853523948e112dcd958a7f8d006addc
|
|
4
|
+
data.tar.gz: eec2645a3beb91d8df74372a352c409530313c18259a94e5dc2c57de7b3ba830
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 3d3fa385463ac0f41f3b0d92b1350a61243e178a500de5f6d698211d0556fbe17290ab26ddc2dc86b793d46f71134b5bd6f6fd1cd9fa71674c39120c6f066040
|
|
7
|
+
data.tar.gz: 121235e372e531521e480b166fd589344bfd33f74b2af360a59b4c0ac1226b728cef1cc1c2b3141ded88bbfe3a32dd1a2b39fdae0aeec55332b119fffb58a74e
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to HotwireBits will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- JavaScript test suite: 254 Vitest tests covering all 99 Stimulus controllers (15 original + 98 new)
|
|
9
|
+
- Full controller coverage: 34 stub controllers + 65 non-stub controllers all tested
|
|
10
|
+
- Generator tests: 11 Minitest tests for install and component generators
|
|
11
|
+
- CONTRIBUTING.md guide for new contributors
|
|
12
|
+
- CI job for JavaScript tests (`npm test`)
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
- CalendarComponentTest: fixed date-dependent test using proper month/year params
|
|
16
|
+
- bin/setup: fixed path resolution bug
|
|
17
|
+
- bin/hotwirebits: fixed RailsBits→HotwireBits naming, updated component list to 241
|
|
18
|
+
- Gemfile: removed 4 duplicate runtime dependencies
|
|
19
|
+
- gemspec: constrained tailwindcss-rails to ~> 3.0
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- All 33 ERB partials rewritten for consistency with ViewComponent counterparts
|
|
23
|
+
- StandardRB lint: 0 violations across entire codebase
|
|
24
|
+
- Removed dead `:spec` Rake task and empty `spec/` directory
|
|
25
|
+
- Removed audit_button.json from git tracking
|
|
26
|
+
|
|
27
|
+
## [0.1.0] - 2026-03-23
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
- Initial release with 240+ components
|
|
31
|
+
- Theme system with CSS custom properties (light/dark mode)
|
|
32
|
+
- 99 Stimulus controllers for interactive components
|
|
33
|
+
- CLI tool (`hotwirebits`) for copy-paste installation
|
|
34
|
+
- ERB partial + ViewComponent dual format for all components
|
|
35
|
+
- Tailwind CSS v4 support
|
|
36
|
+
|
|
37
|
+
### Components
|
|
38
|
+
- **Primitives**: Button, Badge, Chip, Tag, Avatar, Status, Indicator, Label, Separator, Skeleton, Spinner, Typography, Kbd, Icon, ThemeIcon
|
|
39
|
+
- **Forms**: Input, Password, Number, Search, Phone, Textarea, Checkbox, Radio, Switch, Toggle, Select, NativeSelect, Combobox, MultiSelect, Slider, Rating, DatePicker, InputOTP, InputTags, FileInput, ColorPicker, ColorSwatch, FormGroup
|
|
40
|
+
- **Data Display**: Card, Table, DataTable, Stats, Stat, Timeline, TreeView, List, Image, CodeBlock, NumberFormatter, Diff, Progress, ProgressRing, MeterGroup, Highlight, Mark, Accordion, Collapsible, Spoiler
|
|
41
|
+
- **Navigation**: Navbar, Sidebar, Breadcrumb, Pagination, Tabs, Menu, Dropdown, NavigationMenu, Menubar, DockMenu, Steps, NavLink, Footer, Burger, SpeedDial
|
|
42
|
+
- **Overlays**: Dialog, AlertDialog, Sheet, Drawer, Popover, Tooltip, HoverCard, Toast, Notification, LoadingOverlay
|
|
43
|
+
- **Feedback**: Alert, EmptyState, Banner, SkeletonCard, Feedback, Swap, Countdown, AnimatedNumber, StatusDot, ThemeController
|
|
44
|
+
- **Layout**: Container, Grid, Flex, Stack, Group, AspectRatio, ScrollArea, Resizable, Box, Center, SimpleGrid, Space, Divider, Join, Mask, BentoGrid, DeviceMockup, AppShell, Splitter, Fluid
|
|
45
|
+
- **Advanced**: Carousel, Calendar, Chart, ChatBubble, Testimonial, KanbanBoard, Search, Clipboard, QRCode, Marquee
|
|
46
|
+
- **Marketing**: Hero, FeatureSection, CTASection, PricingSection, FAQSection, TestimonialsSection, LogoCloud, AuthBlock, ErrorPage, CookieConsent
|
data/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 HotwireBits Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# 🧱 HotwireBits
|
|
2
|
+
|
|
3
|
+
**The most comprehensive free UI component library for Ruby on Rails.**
|
|
4
|
+
|
|
5
|
+
[](https://github.com/DonsWayo/hotwirebits/actions)
|
|
6
|
+
[](https://rubygems.org/gems/hotwirebits)
|
|
7
|
+
[](https://www.npmjs.com/package/@hotwirebits/stimulus)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## What is HotwireBits?
|
|
13
|
+
|
|
14
|
+
HotwireBits is a **free, open-source** UI component library for Ruby on Rails with **240+ components** and **99 Stimulus controllers**. Each component ships in two formats:
|
|
15
|
+
|
|
16
|
+
- **ERB partials** — Copy-paste friendly, no magic
|
|
17
|
+
- **ViewComponent classes** — Ruby-first, testable, composable
|
|
18
|
+
|
|
19
|
+
All styled with **Tailwind CSS v4**, interactive via **Stimulus.js**, and fully **Turbo-compatible** including Turbo Native.
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
### As a Gem
|
|
24
|
+
|
|
25
|
+
```ruby
|
|
26
|
+
# Gemfile
|
|
27
|
+
gem "hotwirebits"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
bundle install
|
|
32
|
+
rails generate hotwirebits:install
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Copy-Paste (shadcn-style)
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
gem install hotwirebits_cli
|
|
39
|
+
hotwirebits init
|
|
40
|
+
hotwirebits add button card alert
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Components
|
|
44
|
+
|
|
45
|
+
### Primitives (20)
|
|
46
|
+
Button, Badge, Chip, Tag, Avatar, Status, Indicator, Label, Separator, Skeleton, Spinner, Typography, Kbd, Icon, CloseButton, Toggle, ThemeIcon, Progress, ProgressRing
|
|
47
|
+
|
|
48
|
+
### Form Controls (22)
|
|
49
|
+
Input, Password, Number, Search, Phone, Textarea, JsonInput, Checkbox, Radio, Switch, Toggle, Select, NativeSelect, Combobox, MultiSelect, Slider, Rating, DatePicker, InputOTP, InputTags, FileInput, ColorPicker
|
|
50
|
+
|
|
51
|
+
### Data Display (20)
|
|
52
|
+
Card, Table, DataTable, Stats, Stat, Timeline, TreeView, List, Image, CodeBlock, NumberFormatter, Diff, Highlight, Mark, Accordion, Collapsible, Spoiler, MeterGroup, ColorSwatch, FormGroup
|
|
53
|
+
|
|
54
|
+
### Navigation (15)
|
|
55
|
+
Navbar, Sidebar, Breadcrumb, Pagination, Tabs, Menu, Dropdown, NavigationMenu, Menubar, DockMenu, Steps, NavLink, Footer, Burger, SpeedDial
|
|
56
|
+
|
|
57
|
+
### Overlays (10)
|
|
58
|
+
Dialog, AlertDialog, Sheet, Drawer, Popover, Tooltip, HoverCard, Toast, Notification, LoadingOverlay
|
|
59
|
+
|
|
60
|
+
### Feedback (10)
|
|
61
|
+
Alert, EmptyState, Banner, SkeletonCard, Feedback, Swap, Countdown, AnimatedNumber, StatusDot, ThemeController
|
|
62
|
+
|
|
63
|
+
### Layout (20)
|
|
64
|
+
Container, Grid, Flex, Stack, Group, AspectRatio, ScrollArea, Resizable, Box, Center, SimpleGrid, Space, Divider, Join, Mask, BentoGrid, DeviceMockup, AppShell, Splitter, Fluid
|
|
65
|
+
|
|
66
|
+
### Advanced (10)
|
|
67
|
+
Carousel, Calendar, Chart, ChatBubble, Testimonial, KanbanBoard, Search, Clipboard, QRCode, Marquee
|
|
68
|
+
|
|
69
|
+
### Marketing Blocks (10)
|
|
70
|
+
Hero, FeatureSection, CTASection, PricingSection, FAQSection, TestimonialsSection, LogoCloud, AuthBlock, ErrorPage, CookieConsent
|
|
71
|
+
|
|
72
|
+
## Usage
|
|
73
|
+
|
|
74
|
+
### ERB Partials
|
|
75
|
+
|
|
76
|
+
```erb
|
|
77
|
+
<%= render HotwireBits::ButtonComponent.new(label: "Click me", variant: :primary) %>
|
|
78
|
+
|
|
79
|
+
<%= render HotwireBits::CardComponent.new(title: "Welcome", description: "Get started") do %>
|
|
80
|
+
<p>Your content here</p>
|
|
81
|
+
<% end %>
|
|
82
|
+
|
|
83
|
+
<%= render HotwireBits::AlertComponent.new(type: :success, title: "Success!", message: "Changes saved.") %>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### With Stimulus
|
|
87
|
+
|
|
88
|
+
```erb
|
|
89
|
+
<%= render HotwireBits::DialogComponent.new(title: "Confirm", size: :md) do %>
|
|
90
|
+
<p>Are you sure?</p>
|
|
91
|
+
<div class="flex gap-2 justify-end">
|
|
92
|
+
<%= render HotwireBits::ButtonComponent.new(label: "Cancel", variant: :outline) %>
|
|
93
|
+
<%= render HotwireBits::ButtonComponent.new(label: "Confirm", variant: :primary) %>
|
|
94
|
+
</div>
|
|
95
|
+
<% end %>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Theme System
|
|
99
|
+
|
|
100
|
+
HotwireBits uses CSS custom properties (shadcn-style) for theming:
|
|
101
|
+
|
|
102
|
+
```css
|
|
103
|
+
/* Import the theme */
|
|
104
|
+
@import "hotwirebits/theme";
|
|
105
|
+
|
|
106
|
+
/* Or customize variables */
|
|
107
|
+
:root {
|
|
108
|
+
--color-hw-primary: hsl(263 70% 58%);
|
|
109
|
+
--color-hw-primary-foreground: hsl(0 0% 100%);
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Stimulus Controllers
|
|
114
|
+
|
|
115
|
+
99 Stimulus controllers for interactive components:
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
hw-accordion hw-alert hw-banner hw-burger
|
|
119
|
+
hw-calendar hw-carousel hw-clipboard hw-collapsible
|
|
120
|
+
hw-combobox hw-cookie hw-countdown hw-datepicker
|
|
121
|
+
hw-dialog hw-drawer hw-dropdown hw-feedback
|
|
122
|
+
hw-highlight hw-kanban hw-marquee hw-menubar
|
|
123
|
+
hw-multiselect hw-otp hw-password hw-popover
|
|
124
|
+
hw-rating hw-resizable hw-search hw-sheet
|
|
125
|
+
hw-sidebar hw-speed-dial hw-spoiler hw-steps
|
|
126
|
+
hw-swap hw-switch hw-tabs hw-tags
|
|
127
|
+
hw-theme hw-toast hw-toggle hw-tree
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## License
|
|
131
|
+
|
|
132
|
+
MIT License — free for personal and commercial use.
|
|
133
|
+
|
|
134
|
+
## Test Suite
|
|
135
|
+
|
|
136
|
+
| Suite | Tests | Tool |
|
|
137
|
+
|-------|-------|------|
|
|
138
|
+
| Components & Helpers | 670 tests, 1477 assertions | Minitest |
|
|
139
|
+
| Stimulus Controllers | 156 tests | Vitest + jsdom |
|
|
140
|
+
| Generators | 11 tests | Minitest |
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
bundle exec rake test # Ruby tests
|
|
144
|
+
npm test # JavaScript tests
|
|
145
|
+
bundle exec standardrb # Lint
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Contributing
|
|
149
|
+
|
|
150
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.
|
|
151
|
+
|
|
152
|
+
1. Fork it
|
|
153
|
+
2. Create your feature branch (`git checkout -b feature/amazing`)
|
|
154
|
+
3. Commit your changes (`git commit -am 'feat: add amazing component'`)
|
|
155
|
+
4. Push to the branch (`git push origin feature/amazing`)
|
|
156
|
+
5. Create a Pull Request
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/* HotwireBits Theme System — shadcn-style CSS variables for Tailwind CSS v4 */
|
|
2
|
+
|
|
3
|
+
@theme {
|
|
4
|
+
--color-hw-background: hsl(0 0% 100%);
|
|
5
|
+
--color-hw-foreground: hsl(222.2 84% 4.9%);
|
|
6
|
+
--color-hw-card: hsl(0 0% 100%);
|
|
7
|
+
--color-hw-card-foreground: hsl(222.2 84% 4.9%);
|
|
8
|
+
--color-hw-popover: hsl(0 0% 100%);
|
|
9
|
+
--color-hw-popover-foreground: hsl(222.2 84% 4.9%);
|
|
10
|
+
--color-hw-primary: hsl(222.2 47.4% 11.2%);
|
|
11
|
+
--color-hw-primary-foreground: hsl(210 40% 98%);
|
|
12
|
+
--color-hw-secondary: hsl(210 40% 96.1%);
|
|
13
|
+
--color-hw-secondary-foreground: hsl(222.2 47.4% 11.2%);
|
|
14
|
+
--color-hw-muted: hsl(210 40% 96.1%);
|
|
15
|
+
--color-hw-muted-foreground: hsl(215.4 16.3% 46.9%);
|
|
16
|
+
--color-hw-accent: hsl(210 40% 96.1%);
|
|
17
|
+
--color-hw-accent-foreground: hsl(222.2 47.4% 11.2%);
|
|
18
|
+
--color-hw-destructive: hsl(0 84.2% 60.2%);
|
|
19
|
+
--color-hw-destructive-foreground: hsl(210 40% 98%);
|
|
20
|
+
--color-hw-success: hsl(142.1 76.2% 36.3%);
|
|
21
|
+
--color-hw-success-foreground: hsl(355.7 100% 97.3%);
|
|
22
|
+
--color-hw-warning: hsl(38 92% 50%);
|
|
23
|
+
--color-hw-warning-foreground: hsl(48 96% 89%);
|
|
24
|
+
--color-hw-info: hsl(221.2 83.2% 53.3%);
|
|
25
|
+
--color-hw-info-foreground: hsl(210 40% 98%);
|
|
26
|
+
--color-hw-border: hsl(214.3 31.8% 91.4%);
|
|
27
|
+
--color-hw-input: hsl(214.3 31.8% 91.4%);
|
|
28
|
+
--color-hw-ring: hsl(222.2 84% 4.9%);
|
|
29
|
+
--color-hw-selection: hsl(210 40% 96.1%);
|
|
30
|
+
--color-hw-bg: var(--color-hw-background);
|
|
31
|
+
--color-hw-fg: var(--color-hw-foreground);
|
|
32
|
+
|
|
33
|
+
/* Border radius scale */
|
|
34
|
+
--radius-hw-sm: 0.25rem;
|
|
35
|
+
--radius-hw-md: 0.375rem;
|
|
36
|
+
--radius-hw-lg: 0.5rem;
|
|
37
|
+
--radius-hw-xl: 0.75rem;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@layer base {
|
|
41
|
+
*,
|
|
42
|
+
*::before,
|
|
43
|
+
*::after {
|
|
44
|
+
@apply border-hw-border;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
html {
|
|
48
|
+
@apply antialiased;
|
|
49
|
+
-webkit-font-smoothing: antialiased;
|
|
50
|
+
-moz-osx-font-smoothing: grayscale;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
body {
|
|
54
|
+
@apply bg-hw-background text-hw-foreground;
|
|
55
|
+
font-feature-settings: "rlig" 1, "calt" 1;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@utility hw-border {
|
|
60
|
+
border-color: var(--color-hw-border);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@utility hw-ring {
|
|
64
|
+
box-shadow: 0 0 0 2px var(--color-hw-ring);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@utility hw-ring-offset {
|
|
68
|
+
box-shadow: 0 0 0 2px var(--color-hw-background), 0 0 0 4px var(--color-hw-ring);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Dark mode overrides */
|
|
72
|
+
@media (prefers-color-scheme: dark) {
|
|
73
|
+
:root:not(.hw-light) {
|
|
74
|
+
--color-hw-background: hsl(222.2 84% 4.9%);
|
|
75
|
+
--color-hw-foreground: hsl(210 40% 98%);
|
|
76
|
+
--color-hw-card: hsl(222.2 84% 4.9%);
|
|
77
|
+
--color-hw-card-foreground: hsl(210 40% 98%);
|
|
78
|
+
--color-hw-popover: hsl(222.2 84% 4.9%);
|
|
79
|
+
--color-hw-popover-foreground: hsl(210 40% 98%);
|
|
80
|
+
--color-hw-primary: hsl(210 40% 98%);
|
|
81
|
+
--color-hw-primary-foreground: hsl(222.2 47.4% 11.2%);
|
|
82
|
+
--color-hw-secondary: hsl(217.2 32.6% 17.5%);
|
|
83
|
+
--color-hw-secondary-foreground: hsl(210 40% 98%);
|
|
84
|
+
--color-hw-muted: hsl(217.2 32.6% 17.5%);
|
|
85
|
+
--color-hw-muted-foreground: hsl(215 20.2% 65.1%);
|
|
86
|
+
--color-hw-accent: hsl(217.2 32.6% 17.5%);
|
|
87
|
+
--color-hw-accent-foreground: hsl(210 40% 98%);
|
|
88
|
+
--color-hw-destructive: hsl(0 62.8% 30.6%);
|
|
89
|
+
--color-hw-destructive-foreground: hsl(210 40% 98%);
|
|
90
|
+
--color-hw-success: hsl(142.1 70.6% 45.3%);
|
|
91
|
+
--color-hw-success-foreground: hsl(144.9 80.4% 10%);
|
|
92
|
+
--color-hw-warning: hsl(48 96% 53%);
|
|
93
|
+
--color-hw-warning-foreground: hsl(36 45.5% 10%);
|
|
94
|
+
--color-hw-info: hsl(217.2 91.2% 59.8%);
|
|
95
|
+
--color-hw-info-foreground: hsl(222.2 47.4% 11.2%);
|
|
96
|
+
--color-hw-border: hsl(217.2 32.6% 17.5%);
|
|
97
|
+
--color-hw-input: hsl(217.2 32.6% 17.5%);
|
|
98
|
+
--color-hw-ring: hsl(212.7 26.8% 83.9%);
|
|
99
|
+
--color-hw-selection: hsl(217.2 32.6% 17.5%);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Explicit dark mode class */
|
|
104
|
+
.dark {
|
|
105
|
+
--color-hw-background: hsl(222.2 84% 4.9%);
|
|
106
|
+
--color-hw-foreground: hsl(210 40% 98%);
|
|
107
|
+
--color-hw-card: hsl(222.2 84% 4.9%);
|
|
108
|
+
--color-hw-card-foreground: hsl(210 40% 98%);
|
|
109
|
+
--color-hw-popover: hsl(222.2 84% 4.9%);
|
|
110
|
+
--color-hw-popover-foreground: hsl(210 40% 98%);
|
|
111
|
+
--color-hw-primary: hsl(210 40% 98%);
|
|
112
|
+
--color-hw-primary-foreground: hsl(222.2 47.4% 11.2%);
|
|
113
|
+
--color-hw-secondary: hsl(217.2 32.6% 17.5%);
|
|
114
|
+
--color-hw-secondary-foreground: hsl(210 40% 98%);
|
|
115
|
+
--color-hw-muted: hsl(217.2 32.6% 17.5%);
|
|
116
|
+
--color-hw-muted-foreground: hsl(215 20.2% 65.1%);
|
|
117
|
+
--color-hw-accent: hsl(217.2 32.6% 17.5%);
|
|
118
|
+
--color-hw-accent-foreground: hsl(210 40% 98%);
|
|
119
|
+
--color-hw-destructive: hsl(0 62.8% 30.6%);
|
|
120
|
+
--color-hw-destructive-foreground: hsl(210 40% 98%);
|
|
121
|
+
--color-hw-success: hsl(142.1 70.6% 45.3%);
|
|
122
|
+
--color-hw-success-foreground: hsl(144.9 80.4% 10%);
|
|
123
|
+
--color-hw-warning: hsl(48 96% 53%);
|
|
124
|
+
--color-hw-warning-foreground: hsl(36 45.5% 10%);
|
|
125
|
+
--color-hw-info: hsl(217.2 91.2% 59.8%);
|
|
126
|
+
--color-hw-info-foreground: hsl(222.2 47.4% 11.2%);
|
|
127
|
+
--color-hw-border: hsl(217.2 32.6% 17.5%);
|
|
128
|
+
--color-hw-input: hsl(217.2 32.6% 17.5%);
|
|
129
|
+
--color-hw-ring: hsl(212.7 26.8% 83.9%);
|
|
130
|
+
--color-hw-selection: hsl(217.2 32.6% 17.5%);
|
|
131
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* HotwireBits — Corporate theme */
|
|
2
|
+
@theme {
|
|
3
|
+
--color-hw-primary: hsl(220 60% 50%);
|
|
4
|
+
--color-hw-primary-foreground: hsl(0 0% 100%);
|
|
5
|
+
--color-hw-secondary: hsl(220 20% 94%);
|
|
6
|
+
--color-hw-secondary-foreground: hsl(220 60% 15%);
|
|
7
|
+
--color-hw-accent: hsl(180 60% 45%);
|
|
8
|
+
--color-hw-accent-foreground: hsl(0 0% 100%);
|
|
9
|
+
--color-hw-background: hsl(0 0% 100%);
|
|
10
|
+
--color-hw-foreground: hsl(220 60% 10%);
|
|
11
|
+
--color-hw-card: hsl(0 0% 100%);
|
|
12
|
+
--color-hw-card-foreground: hsl(220 60% 10%);
|
|
13
|
+
--color-hw-popover: hsl(0 0% 100%);
|
|
14
|
+
--color-hw-popover-foreground: hsl(220 60% 10%);
|
|
15
|
+
--color-hw-muted: hsl(220 20% 94%);
|
|
16
|
+
--color-hw-muted-foreground: hsl(220 15% 45%);
|
|
17
|
+
--color-hw-destructive: hsl(0 84% 60%);
|
|
18
|
+
--color-hw-destructive-foreground: hsl(0 0% 100%);
|
|
19
|
+
--color-hw-success: hsl(142 76% 36%);
|
|
20
|
+
--color-hw-success-foreground: hsl(0 0% 100%);
|
|
21
|
+
--color-hw-warning: hsl(38 92% 50%);
|
|
22
|
+
--color-hw-warning-foreground: hsl(0 0% 100%);
|
|
23
|
+
--color-hw-info: hsl(220 83% 53%);
|
|
24
|
+
--color-hw-info-foreground: hsl(0 0% 100%);
|
|
25
|
+
--color-hw-border: hsl(220 20% 88%);
|
|
26
|
+
--color-hw-input: hsl(220 20% 88%);
|
|
27
|
+
--color-hw-ring: hsl(220 60% 50%);
|
|
28
|
+
--color-hw-selection: hsl(220 20% 94%);
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* HotwireBits — Midnight (dark) theme */
|
|
2
|
+
@theme {
|
|
3
|
+
--color-hw-primary: hsl(263 70% 58%);
|
|
4
|
+
--color-hw-primary-foreground: hsl(0 0% 100%);
|
|
5
|
+
--color-hw-secondary: hsl(240 3.7% 15.9%);
|
|
6
|
+
--color-hw-secondary-foreground: hsl(0 0% 98%);
|
|
7
|
+
--color-hw-accent: hsl(263 70% 58%);
|
|
8
|
+
--color-hw-accent-foreground: hsl(0 0% 100%);
|
|
9
|
+
--color-hw-background: hsl(240 10% 3.9%);
|
|
10
|
+
--color-hw-foreground: hsl(0 0% 98%);
|
|
11
|
+
--color-hw-card: hsl(240 10% 3.9%);
|
|
12
|
+
--color-hw-card-foreground: hsl(0 0% 98%);
|
|
13
|
+
--color-hw-popover: hsl(240 10% 3.9%);
|
|
14
|
+
--color-hw-popover-foreground: hsl(0 0% 98%);
|
|
15
|
+
--color-hw-muted: hsl(240 3.7% 15.9%);
|
|
16
|
+
--color-hw-muted-foreground: hsl(240 5% 64.9%);
|
|
17
|
+
--color-hw-destructive: hsl(0 63% 31%);
|
|
18
|
+
--color-hw-destructive-foreground: hsl(0 0% 98%);
|
|
19
|
+
--color-hw-success: hsl(142 71% 45%);
|
|
20
|
+
--color-hw-success-foreground: hsl(0 0% 98%);
|
|
21
|
+
--color-hw-warning: hsl(48 96% 53%);
|
|
22
|
+
--color-hw-warning-foreground: hsl(240 10% 3.9%);
|
|
23
|
+
--color-hw-info: hsl(217 91% 60%);
|
|
24
|
+
--color-hw-info-foreground: hsl(0 0% 98%);
|
|
25
|
+
--color-hw-border: hsl(240 3.7% 15.9%);
|
|
26
|
+
--color-hw-input: hsl(240 3.7% 15.9%);
|
|
27
|
+
--color-hw-ring: hsl(240 5% 64.9%);
|
|
28
|
+
--color-hw-selection: hsl(240 3.7% 15.9%);
|
|
29
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<div class="<%= container_classes %>" <%= tag.attributes(@extra_attrs) %>>
|
|
2
|
+
<div data-controller="hw-accordion" data-hw-accordion-multiple-value="<%= @multiple %>">
|
|
3
|
+
<% @items.each_with_index do |item, index| %>
|
|
4
|
+
<div class="<%= panel_classes(index) %>">
|
|
5
|
+
<button
|
|
6
|
+
type="button"
|
|
7
|
+
class="flex w-full items-center justify-between px-4 py-3 text-left text-sm font-medium hover:bg-hw-muted/50 transition-colors"
|
|
8
|
+
data-action="click->hw-accordion#toggle"
|
|
9
|
+
data-hw-accordion-target="trigger"
|
|
10
|
+
>
|
|
11
|
+
<span><%= item[:title] %></span>
|
|
12
|
+
<svg class="h-4 w-4 shrink-0 transition-transform duration-200" xmlns="http://www.w3.org/2000/svg"
|
|
13
|
+
viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
14
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M6 9l6 6 6-6"/>
|
|
15
|
+
</svg>
|
|
16
|
+
</button>
|
|
17
|
+
<div class="hidden px-4 pb-4 text-sm text-hw-muted-foreground" data-hw-accordion-target="content">
|
|
18
|
+
<%= item[:content] %>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
<% end %>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module HotwireBits
|
|
4
|
+
class AccordionComponent < Base
|
|
5
|
+
VARIANTS = {
|
|
6
|
+
default: "",
|
|
7
|
+
bordered: "border border-hw-border rounded-lg overflow-hidden",
|
|
8
|
+
card: "border border-hw-border rounded-lg overflow-hidden shadow-sm"
|
|
9
|
+
}.freeze
|
|
10
|
+
|
|
11
|
+
def initialize(items: [], multiple: false, variant: :default, **attrs)
|
|
12
|
+
@items = items
|
|
13
|
+
@multiple = multiple
|
|
14
|
+
@variant = variant
|
|
15
|
+
@extra_attrs = attrs
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def container_classes
|
|
19
|
+
merge_classes(
|
|
20
|
+
@multiple ? "" : "space-y-1",
|
|
21
|
+
VARIANTS[@variant] || VARIANTS[:default],
|
|
22
|
+
@extra_attrs.delete(:class)
|
|
23
|
+
)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def panel_classes(index)
|
|
27
|
+
if %i[bordered card].include?(@variant)
|
|
28
|
+
(index > 0) ? "border-t border-hw-border" : ""
|
|
29
|
+
else
|
|
30
|
+
"border border-hw-border rounded-lg"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<div class="space-y-0" <%= tag.attributes(@extra_attrs) %>>
|
|
2
|
+
<div class="relative">
|
|
3
|
+
<div class="absolute left-4 top-0 bottom-0 w-px bg-hw-border"></div>
|
|
4
|
+
<div class="space-y-6">
|
|
5
|
+
<% @items.each do |item| %>
|
|
6
|
+
<div class="relative flex gap-4 pl-10">
|
|
7
|
+
<div class="absolute left-0 top-0">
|
|
8
|
+
<% if item[:avatar] %>
|
|
9
|
+
<img src="<%= item[:avatar] %>" alt="<%= item[:actor] %>" class="h-8 w-8 rounded-full object-cover border-2 border-hw-background">
|
|
10
|
+
<% else %>
|
|
11
|
+
<div class="h-8 w-8 rounded-full bg-hw-muted flex items-center justify-center text-xs font-medium text-hw-muted-foreground border-2 border-hw-background">
|
|
12
|
+
<%= item[:actor]&.chars&.first&.upcase %>
|
|
13
|
+
</div>
|
|
14
|
+
<% end %>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="flex-1 min-w-0">
|
|
17
|
+
<p class="text-sm text-hw-foreground">
|
|
18
|
+
<span class="font-medium"><%= item[:actor] %></span>
|
|
19
|
+
<span class="text-hw-muted-foreground"> <%= item[:action] %> </span>
|
|
20
|
+
<span class="font-medium"><%= item[:target] %></span>
|
|
21
|
+
</p>
|
|
22
|
+
<% if item[:time] %>
|
|
23
|
+
<p class="mt-0.5 text-xs text-hw-muted-foreground"><%= item[:time] %></p>
|
|
24
|
+
<% end %>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
<% end %>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
<% if @load_more %>
|
|
31
|
+
<div class="pt-4 text-center">
|
|
32
|
+
<button type="button"
|
|
33
|
+
class="inline-flex h-8 items-center justify-center rounded-md border border-hw-input bg-hw-background px-4 text-xs font-medium text-hw-foreground hover:bg-hw-accent transition-colors cursor-pointer"
|
|
34
|
+
data-controller="hw-activity-feed"
|
|
35
|
+
data-action="click->hw-activity-feed#loadMore">
|
|
36
|
+
Load more
|
|
37
|
+
</button>
|
|
38
|
+
</div>
|
|
39
|
+
<% end %>
|
|
40
|
+
</div>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module HotwireBits
|
|
4
|
+
class AffixComponent < Base
|
|
5
|
+
def initialize(position: :top, offset: 0, z_index: 40, **attrs)
|
|
6
|
+
@position = position
|
|
7
|
+
@offset = offset
|
|
8
|
+
@z_index = z_index
|
|
9
|
+
@extra_attrs = attrs
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def container_classes
|
|
13
|
+
merge_classes(
|
|
14
|
+
"w-full",
|
|
15
|
+
(@position == :top) ? "fixed top-0" : "fixed bottom-0",
|
|
16
|
+
@extra_attrs.delete(:class)
|
|
17
|
+
)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def container_styles
|
|
21
|
+
offset_prop = (@position == :top) ? "top: #{@offset}px;" : "bottom: #{@offset}px;"
|
|
22
|
+
"#{offset_prop} z-index: #{@z_index};"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<div class="flex flex-col rounded-lg border border-hw-border bg-hw-card overflow-hidden"
|
|
2
|
+
data-controller="hw-ai-chat"
|
|
3
|
+
<%= tag.attributes(@extra_attrs) %>>
|
|
4
|
+
<div class="flex-1 overflow-y-auto p-4 space-y-4 min-h-[300px] max-h-[500px]" data-hw-ai-chat-target="messages">
|
|
5
|
+
<% @messages.each do |msg| %>
|
|
6
|
+
<div class="flex <%= msg[:role] == 'user' ? 'justify-end' : 'justify-start' %>">
|
|
7
|
+
<div class="<%= merge_classes('max-w-[80%] rounded-2xl px-4 py-2.5 text-sm',
|
|
8
|
+
msg[:role] == 'user' ? 'bg-hw-primary text-hw-primary-foreground rounded-br-md' : 'bg-hw-muted text-hw-foreground rounded-bl-md') %>">
|
|
9
|
+
<p><%= msg[:content] %></p>
|
|
10
|
+
<% if msg[:timestamp] %>
|
|
11
|
+
<span class="block mt-1 text-[10px] opacity-60"><%= msg[:timestamp] %></span>
|
|
12
|
+
<% end %>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
<% end %>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="border-t border-hw-border p-3">
|
|
18
|
+
<form data-action="submit->hw-ai-chat#send" class="flex items-center gap-2">
|
|
19
|
+
<input type="text"
|
|
20
|
+
placeholder="<%= @placeholder %>"
|
|
21
|
+
class="flex-1 h-9 rounded-md border border-hw-input bg-hw-background px-3 text-sm text-hw-foreground placeholder:text-hw-muted-foreground focus:outline-none focus:ring-2 focus:ring-hw-ring"
|
|
22
|
+
data-hw-ai-chat-target="input">
|
|
23
|
+
<button type="submit"
|
|
24
|
+
class="inline-flex h-9 items-center justify-center rounded-md bg-hw-primary px-4 text-sm font-medium text-hw-primary-foreground hover:bg-hw-primary/90 transition-colors cursor-pointer">
|
|
25
|
+
<%= @send_label %>
|
|
26
|
+
<svg class="ml-1.5 h-4 w-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
27
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8"/>
|
|
28
|
+
</svg>
|
|
29
|
+
</button>
|
|
30
|
+
</form>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module HotwireBits
|
|
4
|
+
class AiChatComponent < Base
|
|
5
|
+
def initialize(messages: [], placeholder: "Type a message...", send_label: "Send", **attrs)
|
|
6
|
+
@messages = messages
|
|
7
|
+
@placeholder = placeholder
|
|
8
|
+
@send_label = send_label
|
|
9
|
+
@extra_attrs = attrs
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<div class="<%= alert_classes %>"
|
|
2
|
+
data-controller="hw-alert"
|
|
3
|
+
role="alert"
|
|
4
|
+
<%= tag.attributes(@extra_attrs) %>>
|
|
5
|
+
<div class="flex items-start gap-3">
|
|
6
|
+
<% if @icon %>
|
|
7
|
+
<svg class="mt-0.5 h-5 w-5 shrink-0" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
8
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="<%= type_config[:icon] %>"/>
|
|
9
|
+
</svg>
|
|
10
|
+
<% end %>
|
|
11
|
+
|
|
12
|
+
<div class="flex-1">
|
|
13
|
+
<% if @title %>
|
|
14
|
+
<h5 class="mb-1 font-medium leading-none tracking-tight"><%= @title %></h5>
|
|
15
|
+
<% end %>
|
|
16
|
+
<% if @message %>
|
|
17
|
+
<div class="text-sm opacity-90"><%= @message %></div>
|
|
18
|
+
<% end %>
|
|
19
|
+
<%= content if content.present? %>
|
|
20
|
+
</div>
|
|
21
|
+
<% if @dismissible %>
|
|
22
|
+
<button type="button"
|
|
23
|
+
class="shrink-0 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"
|
|
24
|
+
data-action="click->hw-alert#dismiss">
|
|
25
|
+
<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">
|
|
26
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
|
|
27
|
+
</svg>
|
|
28
|
+
<span class="sr-only">Dismiss</span>
|
|
29
|
+
</button>
|
|
30
|
+
<% end %>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|