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
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<%# Tabs component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/tabs', tabs: [{label: "Tab 1"}, {label: "Tab 2"}], active: 0 %>
|
|
3
|
+
|
|
4
|
+
<%
|
|
5
|
+
tabs = local_assigns.fetch(:tabs, [])
|
|
6
|
+
active = local_assigns.fetch(:active, 0)
|
|
7
|
+
extra_class = local_assigns[:class]
|
|
8
|
+
|
|
9
|
+
# Assign IDs to tabs if not present
|
|
10
|
+
tabs = tabs.each_with_index.map { |t, i| t.is_a?(Hash) ? t.merge(id: t.fetch(:id, i)) : { label: t.to_s, id: i } }
|
|
11
|
+
|
|
12
|
+
container_cls = extra_class || ""
|
|
13
|
+
list_cls = "inline-flex h-10 items-center justify-center rounded-md bg-hw-muted p-1 text-hw-muted-foreground"
|
|
14
|
+
%>
|
|
15
|
+
|
|
16
|
+
<div class="<%= container_cls %>" data-controller="hw-tabs" data-hw-tabs-active-value="<%= active %>">
|
|
17
|
+
<div role="tablist" class="<%= list_cls %>">
|
|
18
|
+
<% tabs.each do |tab| %>
|
|
19
|
+
<button type="button"
|
|
20
|
+
role="tab"
|
|
21
|
+
id="tab-<%= tab[:id] %>"
|
|
22
|
+
data-hw-tabs-target="tab"
|
|
23
|
+
data-action="click->hw-tabs#select"
|
|
24
|
+
data-tab-id="<%= tab[:id] %>"
|
|
25
|
+
aria-controls="panel-<%= tab[:id] %>"
|
|
26
|
+
aria-selected="<%= tab[:id] == active %>"
|
|
27
|
+
class="inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-hw-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-hw-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 <%= tab[:id] == active ? 'bg-hw-background text-hw-foreground shadow-sm' : '' %>">
|
|
28
|
+
<%= tab[:label] %>
|
|
29
|
+
</button>
|
|
30
|
+
<% end %>
|
|
31
|
+
</div>
|
|
32
|
+
<% tabs.each do |tab| %>
|
|
33
|
+
<div role="tabpanel"
|
|
34
|
+
id="panel-<%= tab[:id] %>"
|
|
35
|
+
data-hw-tabs-target="panel"
|
|
36
|
+
data-tab-id="<%= tab[:id] %>"
|
|
37
|
+
aria-labelledby="tab-<%= tab[:id] %>"
|
|
38
|
+
class="<%= tab[:id] == active ? '' : 'hidden' %> pt-4">
|
|
39
|
+
<% if tab[:content] %>
|
|
40
|
+
<%= tab[:content] %>
|
|
41
|
+
<% end %>
|
|
42
|
+
</div>
|
|
43
|
+
<% end %>
|
|
44
|
+
</div>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<%# Tag component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/tag', label: "Feature", color: :default %>
|
|
3
|
+
|
|
4
|
+
<%
|
|
5
|
+
label = local_assigns.fetch(:label, "")
|
|
6
|
+
color = local_assigns.fetch(:color, :default)
|
|
7
|
+
|
|
8
|
+
color_cls = case color
|
|
9
|
+
when :primary then "bg-hw-primary/10 text-hw-primary border-hw-primary/20"
|
|
10
|
+
when :success then "bg-green-50 text-green-700 border-green-200"
|
|
11
|
+
when :warning then "bg-yellow-50 text-yellow-700 border-yellow-200"
|
|
12
|
+
when :danger, :destructive then "bg-red-50 text-red-700 border-red-200"
|
|
13
|
+
else "bg-hw-muted text-hw-muted-foreground border-hw-border"
|
|
14
|
+
end
|
|
15
|
+
tag_cls = "inline-flex items-center rounded-md border px-2 py-0.5 text-xs font-medium #{color_cls}"
|
|
16
|
+
%>
|
|
17
|
+
|
|
18
|
+
<span class="<%= tag_cls %>">
|
|
19
|
+
<%= label %>
|
|
20
|
+
</span>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<%# TagInput component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/tag_input', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="flex flex-wrap gap-1.5 rounded-md border border-hw-input bg-hw-background p-1.5 ring-offset-hw-background focus-within:ring-2 focus-within:ring-hw-ring focus-within:ring-offset-2" data-controller="hw-tag-input" data-hw-tag-input-max-value="<%= max %>" data-hw-tag-input-pattern-value="<%= pattern %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<% value.each do |v| %>
|
|
6
|
+
<span class="inline-flex items-center gap-1 rounded-sm bg-hw-secondary px-1.5 py-0.5 text-xs text-hw-secondary-foreground">
|
|
7
|
+
<span><%= v %></span>
|
|
8
|
+
<button type="button" class="text-hw-muted-foreground hover:text-hw-foreground" data-action="click->hw-tag-input#remove" data-hw-tag-input-value-param="<%= v %>">
|
|
9
|
+
<svg class="h-3 w-3" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/></svg>
|
|
10
|
+
</button>
|
|
11
|
+
</span>
|
|
12
|
+
<% end %>
|
|
13
|
+
<input type="text" placeholder="<%= placeholder %>" <%= 'disabled' if disabled || (max && value.size >= max) %> <%= 'pattern' if pattern %> class="flex-1 bg-transparent text-sm text-hw-foreground placeholder:text-hw-muted-foreground outline-none min-w-[80px]" data-action="keydown->hw-tag-input#keydown blur->hw-tag-input#blur" data-hw-tag-input-target="input">
|
|
14
|
+
<% value.each do |v| %>
|
|
15
|
+
<input type="hidden" name="<%= name %>[]" value="<%= v %>">
|
|
16
|
+
<% end %>
|
|
17
|
+
</div>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<%# TeamSection component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/team_section', ... %>
|
|
3
|
+
|
|
4
|
+
<section class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<div class="mx-auto max-w-5xl">
|
|
6
|
+
<% if title %>
|
|
7
|
+
<h2 class="text-2xl md:text-3xl font-bold text-hw-foreground text-center mb-12"><%= title %></h2>
|
|
8
|
+
<% end %>
|
|
9
|
+
<div class="<%= grid_classes %>">
|
|
10
|
+
<% members.each do |member| %>
|
|
11
|
+
<div class="flex flex-col items-center text-center rounded-lg border border-hw-border bg-hw-card p-6">
|
|
12
|
+
<% if member[:avatar] %>
|
|
13
|
+
<img src="<%= member[:avatar] %>" alt="<%= member[:name] %>" class="h-20 w-20 rounded-full object-cover mb-4">
|
|
14
|
+
<% else %>
|
|
15
|
+
<div class="flex h-20 w-20 items-center justify-center rounded-full bg-hw-muted text-hw-muted-foreground text-xl font-semibold mb-4">
|
|
16
|
+
<%= member[:name].to_s.split.map(&:first).join %>
|
|
17
|
+
</div>
|
|
18
|
+
<% end %>
|
|
19
|
+
<h3 class="text-base font-semibold text-hw-foreground"><%= member[:name] %></h3>
|
|
20
|
+
<% if member[:role] %>
|
|
21
|
+
<p class="text-sm text-hw-primary mt-0.5"><%= member[:role] %></p>
|
|
22
|
+
<% end %>
|
|
23
|
+
<% if member[:bio] %>
|
|
24
|
+
<p class="text-sm text-hw-muted-foreground mt-2 leading-relaxed"><%= member[:bio] %></p>
|
|
25
|
+
<% end %>
|
|
26
|
+
<% if member[:social_links]&.any? %>
|
|
27
|
+
<div class="flex items-center gap-3 mt-4">
|
|
28
|
+
<% member[:social_links].each do |link| %>
|
|
29
|
+
<a href="<%= link[:href] %>" class="text-hw-muted-foreground hover:text-hw-foreground transition-colors" target="_blank" rel="noopener noreferrer">
|
|
30
|
+
<span class="sr-only"><%= link[:label] %></span>
|
|
31
|
+
<% if link[:icon] %>
|
|
32
|
+
<span class="h-5 w-5 inline-block"><%= safe_svg(link[:icon]) %></span>
|
|
33
|
+
<% end %>
|
|
34
|
+
</a>
|
|
35
|
+
<% end %>
|
|
36
|
+
</div>
|
|
37
|
+
<% end %>
|
|
38
|
+
</div>
|
|
39
|
+
<% end %>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</section>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<%# Terminal component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/terminal', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="rounded-lg border border-hw-border bg-hw-foreground overflow-hidden font-mono text-sm" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<div class="flex items-center gap-2 px-4 py-2.5 bg-hw-foreground/90 border-b border-zinc-800">
|
|
6
|
+
<div class="flex gap-1.5">
|
|
7
|
+
<div class="h-3 w-3 rounded-full bg-hw-destructive"></div>
|
|
8
|
+
<div class="h-3 w-3 rounded-full bg-hw-warning"></div>
|
|
9
|
+
<div class="h-3 w-3 rounded-full bg-hw-success"></div>
|
|
10
|
+
</div>
|
|
11
|
+
<span class="text-xs text-hw-muted-foreground ml-2"><%= title %></span>
|
|
12
|
+
</div>
|
|
13
|
+
<div class="p-4 space-y-1 min-h-[100px]">
|
|
14
|
+
<% lines.each do |line| %>
|
|
15
|
+
<div>
|
|
16
|
+
<span class="text-hw-success"><%= line[:prompt] || '$' %></span>
|
|
17
|
+
<span class="text-hw-background ml-1"><%= line[:command] %></span>
|
|
18
|
+
<% if line[:output] %>
|
|
19
|
+
<div class="text-hw-muted-foreground mt-0.5 pl-0"><%= line[:output] %></div>
|
|
20
|
+
<% end %>
|
|
21
|
+
</div>
|
|
22
|
+
<% end %>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<%# Testimonial component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/testimonial', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<% if rating %>
|
|
6
|
+
<div class="flex gap-0.5 mb-3">
|
|
7
|
+
<% 5.times do |i| %>
|
|
8
|
+
<svg class="h-4 w-4 <%= i < rating ? 'text-hw-warning' : 'text-hw-muted' %>" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
|
9
|
+
<path d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.007 5.404.433c1.164.093 1.636 1.545.749 2.305l-4.117 3.527 1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354 7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.433 2.082-5.006z"/>
|
|
10
|
+
</svg>
|
|
11
|
+
<% end %>
|
|
12
|
+
</div>
|
|
13
|
+
<% end %>
|
|
14
|
+
<blockquote class="text-hw-foreground">
|
|
15
|
+
<p class="text-base leading-relaxed">"<%= quote %>"</p>
|
|
16
|
+
</blockquote>
|
|
17
|
+
<% if author %>
|
|
18
|
+
<div class="mt-4 flex items-center gap-3">
|
|
19
|
+
<% if avatar %>
|
|
20
|
+
<img src="<%= avatar %>" alt="<%= author %>" class="h-10 w-10 rounded-full object-cover">
|
|
21
|
+
<% end %>
|
|
22
|
+
<div>
|
|
23
|
+
<p class="text-sm font-semibold text-hw-foreground"><%= author %></p>
|
|
24
|
+
<% if role || company %>
|
|
25
|
+
<p class="text-sm text-hw-muted-foreground">
|
|
26
|
+
<%= [role, company].compact.join(', ') %>
|
|
27
|
+
</p>
|
|
28
|
+
<% end %>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<% end %>
|
|
32
|
+
</div>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<%# TestimonialsSection component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/testimonials_section', ... %>
|
|
3
|
+
|
|
4
|
+
<section class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<div class="mx-auto max-w-5xl">
|
|
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="<%= grid_classes %>">
|
|
10
|
+
<% testimonials.each do |t| %>
|
|
11
|
+
<div class="rounded-lg border border-hw-border bg-hw-card p-6">
|
|
12
|
+
<% if t[:rating] %>
|
|
13
|
+
<div class="flex gap-0.5 mb-3">
|
|
14
|
+
<% 5.times do |i| %>
|
|
15
|
+
<svg class="h-4 w-4 <%= i < t[:rating] ? 'text-hw-warning' : 'text-hw-muted' %>" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
|
16
|
+
<path d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.007 5.404.433c1.164.093 1.636 1.545.749 2.305l-4.117 3.527 1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354 7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.433 2.082-5.006z"/>
|
|
17
|
+
</svg>
|
|
18
|
+
<% end %>
|
|
19
|
+
</div>
|
|
20
|
+
<% end %>
|
|
21
|
+
<blockquote class="text-sm text-hw-foreground leading-relaxed">"<%= t[:quote] %>"</blockquote>
|
|
22
|
+
<div class="mt-4 flex items-center gap-3">
|
|
23
|
+
<% if t[:avatar] %>
|
|
24
|
+
<img src="<%= t[:avatar] %>" alt="<%= t[:author] %>" class="h-9 w-9 rounded-full object-cover">
|
|
25
|
+
<% end %>
|
|
26
|
+
<div>
|
|
27
|
+
<p class="text-sm font-semibold text-hw-foreground"><%= t[:author] %></p>
|
|
28
|
+
<% if t[:role] %>
|
|
29
|
+
<p class="text-xs text-hw-muted-foreground"><%= t[:role] %></p>
|
|
30
|
+
<% end %>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
<% end %>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</section>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<%# TextRotate component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/text_rotate', ... %>
|
|
3
|
+
|
|
4
|
+
<span class="<%= wrapper_classes %>" data-controller="text-rotate" data-text-rotate-interval-value="<%= interval %>" data-text-rotate-effect-value="<%= effect %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<% texts.each_with_index do |text, idx| %>
|
|
6
|
+
<span class="block transition-all duration-500 <%= idx == 0 ? '' : effect_classes %>"
|
|
7
|
+
data-text-rotate-target="item"
|
|
8
|
+
data-index="<%= idx %>"><%= text %></span>
|
|
9
|
+
<% end %>
|
|
10
|
+
</span>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<%# Textarea component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/textarea', name: "bio", placeholder: "Bio" %>
|
|
3
|
+
|
|
4
|
+
<%
|
|
5
|
+
name = local_assigns.fetch(:name, "")
|
|
6
|
+
placeholder = local_assigns.fetch(:placeholder, "")
|
|
7
|
+
value = local_assigns.fetch(:value, "")
|
|
8
|
+
rows = local_assigns.fetch(:rows, 3)
|
|
9
|
+
disabled = local_assigns.fetch(:disabled, false)
|
|
10
|
+
readonly = local_assigns.fetch(:readonly, false)
|
|
11
|
+
required = local_assigns.fetch(:required, false)
|
|
12
|
+
max_length = local_assigns[:max_length]
|
|
13
|
+
|
|
14
|
+
textarea_cls = "flex min-h-[80px] w-full rounded-md border border-hw-input bg-hw-background px-3 py-2 text-sm ring-offset-hw-background placeholder:text-hw-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-hw-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
|
|
15
|
+
%>
|
|
16
|
+
|
|
17
|
+
<textarea name="<%= name %>" placeholder="<%= placeholder %>" rows="<%= rows %>" <%= 'disabled' if disabled %> <%= 'readonly' if readonly %> <%= 'required' if required %> <%= "maxlength=\"#{max_length}\"" if max_length %> class="<%= textarea_cls %>"><%= value %></textarea>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<%# ThemeController component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/theme_controller', ... %>
|
|
3
|
+
|
|
4
|
+
<div data-controller="hw-theme" class="inline-flex items-center gap-2" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<button type="button"
|
|
6
|
+
data-action="click->hw-theme#toggle"
|
|
7
|
+
class="inline-flex items-center gap-2 rounded-md border border-hw-input bg-hw-background px-3 py-2 text-sm font-medium ring-offset-hw-background transition-colors hover:bg-hw-accent hover:text-hw-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-hw-ring focus-visible:ring-offset-2">
|
|
8
|
+
<svg data-hw-theme-target="lightIcon" class="h-4 w-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
9
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z"/>
|
|
10
|
+
</svg>
|
|
11
|
+
<svg data-hw-theme-target="darkIcon" class="h-4 w-4 hidden" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
12
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z"/>
|
|
13
|
+
</svg>
|
|
14
|
+
<span data-hw-theme-target="label"><%= light_label %></span>
|
|
15
|
+
</button>
|
|
16
|
+
</div>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<%# ThemeSelector component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/theme_selector', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="relative" data-controller="hw-theme-selector" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<button type="button"
|
|
6
|
+
class="inline-flex h-9 items-center gap-2 rounded-md border border-hw-input bg-hw-background px-3 text-sm text-hw-foreground hover:bg-hw-accent transition-colors cursor-pointer"
|
|
7
|
+
data-action="click->hw-theme-selector#toggle click@window->hw-theme-selector#closeOnClickOutside">
|
|
8
|
+
<svg class="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">
|
|
9
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01"/>
|
|
10
|
+
</svg>
|
|
11
|
+
<span><%= current_theme&.capitalize || 'Theme' %></span>
|
|
12
|
+
<svg class="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>
|
|
13
|
+
</button>
|
|
14
|
+
<div data-hw-theme-selector-target="menu" class="hidden absolute right-0 top-full mt-1 z-50 min-w-[12rem] overflow-hidden rounded-md border border-hw-border bg-hw-popover p-1 text-hw-popover-foreground shadow-md">
|
|
15
|
+
<% themes.each do |theme| %>
|
|
16
|
+
<button type="button"
|
|
17
|
+
class="relative flex w-full cursor-pointer select-none items-center gap-3 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-hw-accent hover:text-hw-accent-foreground <%= current_theme == theme[:name] ? 'bg-hw-accent text-hw-accent-foreground' : '' %>"
|
|
18
|
+
data-theme="<%= theme[:name] %>"
|
|
19
|
+
data-action="click->hw-theme-selector#select">
|
|
20
|
+
<% if theme[:preview_color] %>
|
|
21
|
+
<span class="h-5 w-5 shrink-0 rounded-full border border-hw-border" style="background-color: <%= theme[:preview_color] %>;"></span>
|
|
22
|
+
<% end %>
|
|
23
|
+
<span><%= theme[:name].to_s.capitalize %></span>
|
|
24
|
+
<% if current_theme == theme[:name] %>
|
|
25
|
+
<svg class="ml-auto h-4 w-4 text-hw-primary" 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="M5 13l4 4L19 7"/></svg>
|
|
26
|
+
<% end %>
|
|
27
|
+
</button>
|
|
28
|
+
<% end %>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<%# TimePicker component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/time_picker', ... %>
|
|
3
|
+
|
|
4
|
+
<div data-controller="hw-time-picker" data-hw-time-picker-format-value="<%= time_format %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<% if twelve_hour? %>
|
|
6
|
+
<div class="flex items-center gap-2">
|
|
7
|
+
<input type="text"
|
|
8
|
+
name="<%= name %>"
|
|
9
|
+
value="<%= value %>"
|
|
10
|
+
placeholder="12:00"
|
|
11
|
+
pattern="(0?[1-9]|1[0-2]):[0-5][0-9]"
|
|
12
|
+
<%= 'disabled' if disabled %>
|
|
13
|
+
class="<%= input_classes %>"
|
|
14
|
+
data-hw-time-picker-target="input">
|
|
15
|
+
<select class="h-9 rounded-md border border-hw-input bg-hw-background px-2 text-sm text-hw-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-hw-ring focus-visible:ring-offset-2"
|
|
16
|
+
data-action="change->hw-time-picker#updateMeridiem"
|
|
17
|
+
data-hw-time-picker-target="meridiem"
|
|
18
|
+
<%= 'disabled' if disabled %>>
|
|
19
|
+
<option value="AM">AM</option>
|
|
20
|
+
<option value="PM">PM</option>
|
|
21
|
+
</select>
|
|
22
|
+
</div>
|
|
23
|
+
<% else %>
|
|
24
|
+
<input type="time"
|
|
25
|
+
name="<%= name %>"
|
|
26
|
+
value="<%= value %>"
|
|
27
|
+
step="<%= step * 60 %>"
|
|
28
|
+
<%= 'disabled' if disabled %>
|
|
29
|
+
class="<%= input_classes %>"
|
|
30
|
+
data-hw-time-picker-target="input">
|
|
31
|
+
<% end %>
|
|
32
|
+
</div>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<%# Timeline component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/timeline', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<div class="border-l-2 border-hw-border ml-3">
|
|
6
|
+
<% items.each do |item| %>
|
|
7
|
+
<div class="relative pl-8 pb-8 last:pb-0">
|
|
8
|
+
<div class="absolute -left-[9px] top-0.5 h-4 w-4 rounded-full border-2 border-hw-border bg-hw-background flex items-center justify-center">
|
|
9
|
+
<% if item[:icon] %>
|
|
10
|
+
<span class="text-[10px] text-hw-muted-foreground"><%= item[:icon] %></span>
|
|
11
|
+
<% end %>
|
|
12
|
+
</div>
|
|
13
|
+
<div class="pt-0.5">
|
|
14
|
+
<div class="flex items-center gap-2">
|
|
15
|
+
<p class="text-sm font-medium text-hw-foreground"><%= item[:title] %></p>
|
|
16
|
+
<% if item[:time] %>
|
|
17
|
+
<span class="text-xs text-hw-muted-foreground"><%= item[:time] %></span>
|
|
18
|
+
<% end %>
|
|
19
|
+
</div>
|
|
20
|
+
<% if item[:description] %>
|
|
21
|
+
<p class="mt-1 text-sm text-hw-muted-foreground"><%= item[:description] %></p>
|
|
22
|
+
<% end %>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
<% end %>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<%# Toast component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/toast', type: :success, title: "Saved", message: "OK" %>
|
|
3
|
+
|
|
4
|
+
<%
|
|
5
|
+
type = local_assigns.fetch(:type, :info)
|
|
6
|
+
title = local_assigns[:title]
|
|
7
|
+
message = local_assigns[:message]
|
|
8
|
+
description = local_assigns[:description] || message
|
|
9
|
+
dismissible = local_assigns.fetch(:dismissible, true)
|
|
10
|
+
duration = local_assigns.fetch(:duration, 5000)
|
|
11
|
+
action = local_assigns[:action]
|
|
12
|
+
|
|
13
|
+
variant_cls = case type
|
|
14
|
+
when :success then "border-green-200 bg-green-50 text-green-800"
|
|
15
|
+
when :warning then "border-yellow-200 bg-yellow-50 text-yellow-800"
|
|
16
|
+
when :error, :destructive then "border-red-200 bg-red-50 text-red-800"
|
|
17
|
+
else "border-hw-border bg-hw-background text-hw-foreground"
|
|
18
|
+
end
|
|
19
|
+
toast_cls = "relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-4 shadow-lg #{variant_cls}"
|
|
20
|
+
%>
|
|
21
|
+
|
|
22
|
+
<div data-controller="hw-toast" data-hw-toast-duration-value="<%= duration %>" class="group pointer-events-auto">
|
|
23
|
+
<div class="<%= toast_cls %>">
|
|
24
|
+
<div class="flex items-start gap-3">
|
|
25
|
+
<div class="grid gap-1">
|
|
26
|
+
<% if title %>
|
|
27
|
+
<div class="text-sm font-semibold"><%= title %></div>
|
|
28
|
+
<% end %>
|
|
29
|
+
<% if description %>
|
|
30
|
+
<div class="text-sm opacity-90"><%= description %></div>
|
|
31
|
+
<% end %>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="flex items-center gap-2">
|
|
35
|
+
<% if action.is_a?(Hash) && action[:url] %>
|
|
36
|
+
<a href="<%= action[:url] %>"
|
|
37
|
+
class="inline-flex h-8 shrink-0 items-center justify-center rounded-md border border-hw-border bg-transparent px-3 text-sm font-medium">
|
|
38
|
+
<%= action[:label] %>
|
|
39
|
+
</a>
|
|
40
|
+
<% end %>
|
|
41
|
+
<% if dismissible %>
|
|
42
|
+
<button type="button"
|
|
43
|
+
class="absolute right-1 top-1 rounded-md p-1 text-hw-foreground/50 opacity-0 transition-opacity hover:text-hw-foreground focus:opacity-100 focus:outline-none group-hover:opacity-100"
|
|
44
|
+
data-action="click->hw-toast#dismiss">
|
|
45
|
+
<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">
|
|
46
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
|
|
47
|
+
</svg>
|
|
48
|
+
</button>
|
|
49
|
+
<% end %>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<%# Toggle component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/toggle', label: "Bold", pressed: false %>
|
|
3
|
+
|
|
4
|
+
<%
|
|
5
|
+
label = local_assigns.fetch(:label, "")
|
|
6
|
+
pressed = local_assigns.fetch(:pressed, false)
|
|
7
|
+
disabled = local_assigns.fetch(:disabled, false)
|
|
8
|
+
%>
|
|
9
|
+
|
|
10
|
+
<button type="button" aria-pressed="<%= pressed %>" <%= 'disabled' if disabled %> class="inline-flex items-center justify-center rounded-md font-medium ring-offset-hw-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-hw-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-hw-accent hover:text-hw-accent-foreground <%= pressed ? 'bg-hw-accent text-hw-accent-foreground' : 'bg-transparent' %> cursor-pointer h-9 px-3 text-sm">
|
|
11
|
+
<%= label %>
|
|
12
|
+
</button>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<%# ToggleButton component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/toggle_button', ... %>
|
|
3
|
+
|
|
4
|
+
<button type="button" aria-pressed="<%= pressed %>" <%= 'disabled' if disabled %> class="<%= button_classes %>" data-controller="hw-toggle-button" data-action="click->hw-toggle-button#toggle" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<% if icon %><span class="h-4 w-4"><%= safe_svg(icon) %></span><% end %>
|
|
6
|
+
<% if label %><span><%= label %></span><% end %>
|
|
7
|
+
</button>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<%# ToggleButtonGroup component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/toggle_button_group', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="<%= group_classes %>" data-controller="hw-toggle-group" role="group" aria-label="Toggle options" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<% options.each_with_index do |opt, i| %>
|
|
6
|
+
<% pressed = selected.include?(opt[:value]) %>
|
|
7
|
+
<button type="button" aria-pressed="<%= pressed %>" <%= 'disabled' if disabled || opt[:disabled] %> class="<%= option_classes(pressed, i == options.size - 1, i == 0) %>" data-action="click->hw-toggle-group#select" data-value="<%= opt[:value] %>">
|
|
8
|
+
<span><%= opt[:label] %></span>
|
|
9
|
+
</button>
|
|
10
|
+
<% end %>
|
|
11
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<%# Toolbar component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/toolbar', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="inline-flex items-center rounded-md border border-hw-input bg-hw-background p-1 gap-0.5" role="toolbar" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<% items.each_with_index do |item, idx| %>
|
|
6
|
+
<% if with_separator && idx > 0 %>
|
|
7
|
+
<div class="mx-1 h-4 w-px bg-hw-border" role="separator"></div>
|
|
8
|
+
<% end %>
|
|
9
|
+
<% if item[:href] %>
|
|
10
|
+
<a href="<%= item[:href] %>" class="inline-flex items-center gap-1.5 rounded-sm px-2 py-1.5 text-sm text-hw-muted-foreground hover:bg-hw-accent hover:text-hw-accent-foreground transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-hw-ring" title="<%= item[:label] %>">
|
|
11
|
+
<% if item[:icon] %><span class="h-4 w-4 shrink-0"><%= safe_svg(item[:icon]) %></span><% end %>
|
|
12
|
+
<% if item[:label] %><span class="text-sm"><%= item[:label] %></span><% end %>
|
|
13
|
+
</a>
|
|
14
|
+
<% else %>
|
|
15
|
+
<button type="button" class="inline-flex items-center gap-1.5 rounded-sm px-2 py-1.5 text-sm text-hw-muted-foreground hover:bg-hw-accent hover:text-hw-accent-foreground transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-hw-ring" title="<%= item[:label] %>">
|
|
16
|
+
<% if item[:icon] %><span class="h-4 w-4 shrink-0"><%= safe_svg(item[:icon]) %></span><% end %>
|
|
17
|
+
<% if item[:label] %><span class="text-sm"><%= item[:label] %></span><% end %>
|
|
18
|
+
</button>
|
|
19
|
+
<% end %>
|
|
20
|
+
<% end %>
|
|
21
|
+
</div>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<%# Tooltip component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/tooltip', tip: "Help" do %><%# ? %><%# end %>
|
|
3
|
+
|
|
4
|
+
<%
|
|
5
|
+
tip = local_assigns.fetch(:tip, "")
|
|
6
|
+
delay = local_assigns.fetch(:delay, 200)
|
|
7
|
+
side = local_assigns.fetch(:side, :top)
|
|
8
|
+
|
|
9
|
+
tooltip_cls = "absolute z-50 overflow-hidden rounded-md border border-hw-border bg-hw-popover px-3 py-1.5 text-sm text-hw-popover-foreground shadow-md"
|
|
10
|
+
%>
|
|
11
|
+
|
|
12
|
+
<div class="relative inline-block"
|
|
13
|
+
data-controller="hw-tooltip"
|
|
14
|
+
data-hw-tooltip-delay-value="<%= delay %>"
|
|
15
|
+
data-action="mouseenter->hw-tooltip#show mouseleave->hw-tooltip#hide focus->hw-tooltip#show blur->hw-tooltip#hide">
|
|
16
|
+
<div data-hw-tooltip-target="trigger">
|
|
17
|
+
<% if block_given? %><%= yield %><% end %>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="<%= tooltip_cls %>"
|
|
20
|
+
data-hw-tooltip-target="content"
|
|
21
|
+
role="tooltip"
|
|
22
|
+
data-side="<%= side %>"
|
|
23
|
+
hidden>
|
|
24
|
+
<%= tip %>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<%# TreeView component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/tree_view', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<ul class="list-none p-0 m-0" data-controller="hw-tree">
|
|
6
|
+
<% items.each do |item| %>
|
|
7
|
+
<%= render HotwireBits::TreeViewNodeComponent.new(item: item) %>
|
|
8
|
+
<% end %>
|
|
9
|
+
</ul>
|
|
10
|
+
</div>
|
|
11
|
+
<template data-hw-tree-target="template">
|
|
12
|
+
<li class="list-none">
|
|
13
|
+
<div class="flex items-center gap-1.5 px-2 py-1 rounded-md hover:bg-hw-muted cursor-pointer text-sm"
|
|
14
|
+
data-action="click->hw-tree#toggle">
|
|
15
|
+
<%# Placeholder — rendered inline via node component %>
|
|
16
|
+
</div>
|
|
17
|
+
</li>
|
|
18
|
+
</template>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<%# TwoFactor component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/two_factor', ... %>
|
|
3
|
+
|
|
4
|
+
<div data-controller="hw-two-factor"
|
|
5
|
+
data-hw-two-factor-length-value="<%= length %>"
|
|
6
|
+
data-hw-two-factor-auto-submit-value="<%= auto_submit %>"
|
|
7
|
+
class="space-y-4"
|
|
8
|
+
<%= tag.attributes(local_assigns) %>>
|
|
9
|
+
<input type="hidden" name="<%= name %>" value="" data-hw-two-factor-target="hidden">
|
|
10
|
+
<div class="flex items-center justify-center gap-2">
|
|
11
|
+
<% length.times do |i| %>
|
|
12
|
+
<input type="text"
|
|
13
|
+
maxlength="1"
|
|
14
|
+
inputmode="numeric"
|
|
15
|
+
autocomplete="one-time-code"
|
|
16
|
+
class="h-12 w-12 text-center text-lg font-semibold rounded-md border border-hw-input bg-hw-background text-hw-foreground ring-offset-hw-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-hw-ring focus-visible:ring-offset-2"
|
|
17
|
+
data-action="input->hw-two-factor#input keydown->hw-two-factor#keydown paste->hw-two-factor#paste"
|
|
18
|
+
data-index="<%= i %>">
|
|
19
|
+
<% end %>
|
|
20
|
+
</div>
|
|
21
|
+
<% if with_timer %>
|
|
22
|
+
<div class="text-center text-sm text-hw-muted-foreground">
|
|
23
|
+
<span data-hw-two-factor-target="timer"></span>
|
|
24
|
+
<% if resend_url %>
|
|
25
|
+
<a href="<%= resend_url %>" class="text-hw-primary hover:underline hidden" data-hw-two-factor-target="resend">Resend code</a>
|
|
26
|
+
<% end %>
|
|
27
|
+
</div>
|
|
28
|
+
<% end %>
|
|
29
|
+
</div>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<%# TypingIndicator component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/typing_indicator', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="flex items-center <%= gap_class %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<span class="<%= dot_size %> <%= dot_color %> rounded-full animate-bounce" style="animation-delay: 0ms;"></span>
|
|
6
|
+
<span class="<%= dot_size %> <%= dot_color %> rounded-full animate-bounce" style="animation-delay: 150ms;"></span>
|
|
7
|
+
<span class="<%= dot_size %> <%= dot_color %> rounded-full animate-bounce" style="animation-delay: 300ms;"></span>
|
|
8
|
+
</div>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<%# Typography component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/typography', ... %>
|
|
3
|
+
|
|
4
|
+
<% tag_name = (as || :p).to_s %>
|
|
5
|
+
<% styles = { h1: "scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl", h2: "scroll-m-20 border-b border-hw-border pb-2 text-3xl font-semibold tracking-tight first:mt-0", h3: "scroll-m-20 text-2xl font-semibold tracking-tight", h4: "scroll-m-20 text-xl font-semibold tracking-tight", h5: "scroll-m-20 text-lg font-semibold tracking-tight", h6: "scroll-m-20 text-base font-semibold tracking-tight", p: "leading-7 [&:not(:first-child)]:mt-6", lead: "text-xl text-hw-muted-foreground", large: "text-lg font-semibold", small: "text-sm font-medium leading-none", muted: "text-sm text-hw-muted-foreground", blockquote: "mt-6 border-l-2 border-hw-border pl-6 italic", code: "relative rounded bg-hw-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold", list: "my-6 ml-6 list-disc [&>li]:mt-2", mark: "bg-yellow-200 dark:bg-yellow-800 px-0.5 rounded" } %>
|
|
6
|
+
<% style_key = (as || :p).to_sym %>
|
|
7
|
+
<%= tag.public_send(tag_name, content, class: styles[style_key] || styles[:p], **extra_attrs) %>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<%# Validator component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/validator', ... %>
|
|
3
|
+
|
|
4
|
+
<div data-controller="hw-validator"
|
|
5
|
+
data-hw-validator-field-value="<%= field %>"
|
|
6
|
+
data-hw-validator-rules-value="<%= rules.to_json %>"
|
|
7
|
+
data-hw-validator-message-value="<%= message %>"
|
|
8
|
+
class="space-y-1"
|
|
9
|
+
<%= tag.attributes(local_assigns) %>>
|
|
10
|
+
<div data-hw-validator-target="errors" class="text-xs text-hw-destructive hidden"></div>
|
|
11
|
+
<% if rules.any? %>
|
|
12
|
+
<ul class="space-y-0.5">
|
|
13
|
+
<% rules.each do |rule| %>
|
|
14
|
+
<li class="flex items-center gap-1.5 text-xs text-hw-muted-foreground" data-rule="<%= rule.is_a?(Hash) ? rule.keys.first : rule %>">
|
|
15
|
+
<svg class="h-3 w-3" data-hw-validator-target="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
16
|
+
<circle cx="12" cy="12" r="10"/>
|
|
17
|
+
</svg>
|
|
18
|
+
<span><%= rule.is_a?(Hash) ? rule.values.first : rule.to_s.humanize %></span>
|
|
19
|
+
</li>
|
|
20
|
+
<% end %>
|
|
21
|
+
</ul>
|
|
22
|
+
<% end %>
|
|
23
|
+
</div>
|