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,46 @@
|
|
|
1
|
+
<%# NavigationMenu component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/navigation_menu', ... %>
|
|
3
|
+
|
|
4
|
+
<nav class="relative" data-controller="hw-nav-menu" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<ul class="flex items-center gap-1">
|
|
6
|
+
<% items.each_with_index do |item, idx| %>
|
|
7
|
+
<li class="relative"
|
|
8
|
+
data-action="mouseenter->hw-nav-menu#open mouseleave->hw-nav-menu#close"
|
|
9
|
+
data-hw-nav-menu-index="<%= idx %>">
|
|
10
|
+
<a href="<%= item[:href] %>"
|
|
11
|
+
class="<%= merge_classes(
|
|
12
|
+
'inline-flex items-center gap-1 rounded-md px-3 py-2 text-sm font-medium transition-colors',
|
|
13
|
+
'text-hw-muted-foreground hover:bg-hw-accent hover:text-hw-accent-foreground'
|
|
14
|
+
) %>">
|
|
15
|
+
<%= item[:label] %>
|
|
16
|
+
<% if item[:children]&.any? %>
|
|
17
|
+
<svg class="h-4 w-4 transition-transform" 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>
|
|
18
|
+
<% end %>
|
|
19
|
+
</a>
|
|
20
|
+
<% if item[:children]&.any? %>
|
|
21
|
+
<div data-hw-nav-menu-target="panel"
|
|
22
|
+
class="absolute left-0 top-full hidden pt-2">
|
|
23
|
+
<div class="w-[400px] rounded-lg border border-hw-border bg-hw-popover p-4 shadow-lg">
|
|
24
|
+
<div class="grid gap-1">
|
|
25
|
+
<% item[:children].each do |child| %>
|
|
26
|
+
<a href="<%= child[:href] %>"
|
|
27
|
+
class="group flex items-start gap-3 rounded-md p-3 transition-colors hover:bg-hw-accent">
|
|
28
|
+
<% if child[:icon] %>
|
|
29
|
+
<span class="mt-0.5 h-5 w-5 shrink-0 text-hw-muted-foreground group-hover:text-hw-accent-foreground"><%= safe_svg(child[:icon]) %></span>
|
|
30
|
+
<% end %>
|
|
31
|
+
<div>
|
|
32
|
+
<div class="text-sm font-medium text-hw-foreground"><%= child[:label] %></div>
|
|
33
|
+
<% if child[:description] %>
|
|
34
|
+
<div class="mt-0.5 text-sm text-hw-muted-foreground"><%= child[:description] %></div>
|
|
35
|
+
<% end %>
|
|
36
|
+
</div>
|
|
37
|
+
</a>
|
|
38
|
+
<% end %>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<% end %>
|
|
43
|
+
</li>
|
|
44
|
+
<% end %>
|
|
45
|
+
</ul>
|
|
46
|
+
</nav>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<%# NewsletterSection component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/newsletter_section', ... %>
|
|
3
|
+
|
|
4
|
+
<section class="rounded-2xl bg-hw-muted px-6 py-12 text-center lg:px-8" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<h2 class="text-2xl font-bold tracking-tight text-hw-foreground"><%= title %></h2>
|
|
6
|
+
<% if description %>
|
|
7
|
+
<p class="mx-auto mt-3 max-w-md text-sm text-hw-muted-foreground"><%= description %></p>
|
|
8
|
+
<% end %>
|
|
9
|
+
<form class="mx-auto mt-6 flex max-w-md gap-2" data-controller="hw-newsletter">
|
|
10
|
+
<input type="email" required
|
|
11
|
+
placeholder="<%= placeholder %>"
|
|
12
|
+
class="min-w-0 flex-1 rounded-lg border border-hw-border bg-white px-4 py-2.5 text-sm text-hw-foreground placeholder:text-hw-muted-foreground focus:border-hw-primary focus:outline-none focus:ring-2 focus:ring-hw-primary/20">
|
|
13
|
+
<button type="submit"
|
|
14
|
+
class="shrink-0 rounded-lg bg-hw-primary px-5 py-2.5 text-sm font-semibold text-hw-primary-foreground transition-colors hover:bg-hw-primary/90 focus:outline-none focus:ring-2 focus:ring-hw-ring">
|
|
15
|
+
<%= button_label %>
|
|
16
|
+
</button>
|
|
17
|
+
</form>
|
|
18
|
+
<% if privacy_note %>
|
|
19
|
+
<p class="mx-auto mt-3 max-w-md text-xs text-hw-muted-foreground"><%= privacy_note %></p>
|
|
20
|
+
<% end %>
|
|
21
|
+
</section>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<%# Notification component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/notification', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="<%= notification_classes %>" data-controller="hw-notification" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<% if icon %>
|
|
6
|
+
<div class="shrink-0 text-hw-muted-foreground">
|
|
7
|
+
<%= safe_svg(icon) %>
|
|
8
|
+
</div>
|
|
9
|
+
<% end %>
|
|
10
|
+
<div class="flex-1 space-y-1">
|
|
11
|
+
<% if title %>
|
|
12
|
+
<div class="text-sm font-medium leading-none"><%= title %></div>
|
|
13
|
+
<% end %>
|
|
14
|
+
<% if message %>
|
|
15
|
+
<p class="text-sm text-hw-muted-foreground"><%= message %></p>
|
|
16
|
+
<% end %>
|
|
17
|
+
<% if time %>
|
|
18
|
+
<time class="text-xs text-hw-muted-foreground"><%= time %></time>
|
|
19
|
+
<% end %>
|
|
20
|
+
</div>
|
|
21
|
+
<% if closable %>
|
|
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-notification#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>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<%# NotificationBell component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/notification_bell', ... %>
|
|
3
|
+
|
|
4
|
+
<% if href %>
|
|
5
|
+
<a href="<%= href %>" class="relative inline-flex items-center justify-center rounded-full p-2 text-hw-muted-foreground hover:bg-hw-accent hover:text-hw-accent-foreground transition-colors" <%= tag.attributes(local_assigns) %>>
|
|
6
|
+
<% else %>
|
|
7
|
+
<div class="relative inline-flex items-center justify-center rounded-full p-2 text-hw-muted-foreground" <%= tag.attributes(local_assigns) %>>
|
|
8
|
+
<% end %>
|
|
9
|
+
<svg class="<%= icon_size %>" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
10
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9"/>
|
|
11
|
+
</svg>
|
|
12
|
+
<% if count > 0 %>
|
|
13
|
+
<span class="absolute -top-0.5 -right-0.5 flex h-5 w-5 items-center justify-center rounded-full bg-hw-destructive text-[10px] font-bold text-hw-destructive-foreground">
|
|
14
|
+
<%= count > 99 ? '99+' : count %>
|
|
15
|
+
</span>
|
|
16
|
+
<% end %>
|
|
17
|
+
<% if href %>
|
|
18
|
+
</a>
|
|
19
|
+
<% else %>
|
|
20
|
+
</div>
|
|
21
|
+
<% end %>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<%# NumberInput component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/number_input', ... %>
|
|
3
|
+
|
|
4
|
+
<input type="number" name="<%= name %>" value="<%= value %>" placeholder="<%= placeholder %>" min="<%= min %>" max="<%= max %>" step="<%= step %>" <%= 'disabled' if disabled %> class="<%= input_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<%# OrderSummary component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/order_summary', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="rounded-xl border border-hw-border bg-white" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<div class="border-b border-hw-border px-6 py-4">
|
|
6
|
+
<h3 class="text-base font-semibold text-hw-foreground">Order Summary</h3>
|
|
7
|
+
</div>
|
|
8
|
+
<ul class="divide-y divide-hw-border">
|
|
9
|
+
<% items.each do |item| %>
|
|
10
|
+
<li class="flex items-center gap-4 px-6 py-3">
|
|
11
|
+
<% if item[:image] %>
|
|
12
|
+
<img src="<%= item[:image] %>" alt="<%= item[:name] %>" class="h-12 w-12 shrink-0 rounded-lg object-cover">
|
|
13
|
+
<% end %>
|
|
14
|
+
<div class="min-w-0 flex-1">
|
|
15
|
+
<p class="truncate text-sm font-medium text-hw-foreground"><%= item[:name] %></p>
|
|
16
|
+
<p class="text-xs text-hw-muted-foreground">Qty: <%= item[:quantity] %></p>
|
|
17
|
+
</div>
|
|
18
|
+
<span class="shrink-0 text-sm font-medium text-hw-foreground"><%= item[:price] %></span>
|
|
19
|
+
</li>
|
|
20
|
+
<% end %>
|
|
21
|
+
</ul>
|
|
22
|
+
<div class="space-y-2 border-t border-hw-border px-6 py-4 text-sm">
|
|
23
|
+
<div class="flex justify-between text-hw-muted-foreground">
|
|
24
|
+
<span>Subtotal</span>
|
|
25
|
+
<span><%= subtotal %></span>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="flex justify-between text-hw-muted-foreground">
|
|
28
|
+
<span>Shipping</span>
|
|
29
|
+
<span><%= shipping || "Free" %></span>
|
|
30
|
+
</div>
|
|
31
|
+
<div class="flex justify-between text-hw-muted-foreground">
|
|
32
|
+
<span>Tax</span>
|
|
33
|
+
<span><%= tax %></span>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="flex justify-between border-t border-hw-border pt-2 text-base font-semibold text-hw-foreground">
|
|
36
|
+
<span>Total</span>
|
|
37
|
+
<span><%= total.is_a?(Numeric) ? "$#{'%.2f' % total}" : total %></span>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<%# OrgChart component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/org_chart', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<% render_node = nil %>
|
|
6
|
+
<% render_node = ->(node, depth = 0) { %>
|
|
7
|
+
<div class="flex flex-col items-center">
|
|
8
|
+
<div class="flex flex-col items-center rounded-lg border border-hw-border bg-white p-4 shadow-sm">
|
|
9
|
+
<% if node[:avatar] %>
|
|
10
|
+
<img src="<%= node[:avatar] %>" alt="<%= node[:name] %>" class="mb-2 h-12 w-12 rounded-full object-cover">
|
|
11
|
+
<% else %>
|
|
12
|
+
<div class="mb-2 flex h-12 w-12 items-center justify-center rounded-full bg-hw-primary text-sm font-bold text-hw-primary-foreground">
|
|
13
|
+
<%= node[:name].to_s.split.map(&:first).join[0..1].upcase %>
|
|
14
|
+
</div>
|
|
15
|
+
<% end %>
|
|
16
|
+
<p class="text-sm font-semibold text-hw-foreground"><%= node[:name] %></p>
|
|
17
|
+
<p class="text-xs text-hw-muted-foreground"><%= node[:title] %></p>
|
|
18
|
+
</div>
|
|
19
|
+
<% if node[:children]&.any? %>
|
|
20
|
+
<div class="mt-2 h-6 w-px bg-hw-border"></div>
|
|
21
|
+
<div class="flex gap-6 pt-2">
|
|
22
|
+
<% node[:children].each do |child| %>
|
|
23
|
+
<div class="relative flex flex-col items-center">
|
|
24
|
+
<div class="absolute -top-2 h-2 w-px bg-hw-border"></div>
|
|
25
|
+
<% render_node.call(child, depth + 1) %>
|
|
26
|
+
</div>
|
|
27
|
+
<% end %>
|
|
28
|
+
</div>
|
|
29
|
+
<% end %>
|
|
30
|
+
</div>
|
|
31
|
+
<% } %>
|
|
32
|
+
<div class="flex justify-center">
|
|
33
|
+
<% nodes.each do |node| %>
|
|
34
|
+
<% render_node.call(node) %>
|
|
35
|
+
<% end %>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<%# PageHeading component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/page_heading', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<div class="flex items-start justify-between gap-4">
|
|
6
|
+
<div>
|
|
7
|
+
<h1 class="text-2xl font-bold text-hw-foreground"><%= title %></h1>
|
|
8
|
+
<% if description %>
|
|
9
|
+
<p class="mt-1 text-sm text-hw-muted-foreground"><%= description %></p>
|
|
10
|
+
<% end %>
|
|
11
|
+
</div>
|
|
12
|
+
<% if actions? %>
|
|
13
|
+
<div class="flex items-center gap-2 shrink-0">
|
|
14
|
+
<%= actions %>
|
|
15
|
+
</div>
|
|
16
|
+
<% end %>
|
|
17
|
+
</div>
|
|
18
|
+
<% if tabs.any? %>
|
|
19
|
+
<nav class="mt-4 -mb-px flex gap-6 border-b border-hw-border">
|
|
20
|
+
<% tabs.each do |tab| %>
|
|
21
|
+
<a href="<%= tab[:href] %>"
|
|
22
|
+
class="<%= merge_classes(
|
|
23
|
+
'inline-flex items-center border-b-2 px-1 py-3 text-sm font-medium transition-colors',
|
|
24
|
+
tab[:active] ? 'border-hw-primary text-hw-foreground' : 'border-transparent text-hw-muted-foreground hover:text-hw-foreground hover:border-hw-border'
|
|
25
|
+
) %>">
|
|
26
|
+
<%= tab[:label] %>
|
|
27
|
+
</a>
|
|
28
|
+
<% end %>
|
|
29
|
+
</nav>
|
|
30
|
+
<% end %>
|
|
31
|
+
</div>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<%# Pagination component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/pagination', current_page: 2, total_pages: 10, page_url: ->(p) { "/page/#{p}" } %>
|
|
3
|
+
|
|
4
|
+
<%
|
|
5
|
+
current_page = local_assigns.fetch(:current_page, 1)
|
|
6
|
+
total_pages = local_assigns.fetch(:total_pages, 1)
|
|
7
|
+
page_url = local_assigns.fetch(:page_url, ->(p) { "#page-#{p}" })
|
|
8
|
+
sibling_count = local_assigns.fetch(:sibling_count, 1)
|
|
9
|
+
|
|
10
|
+
# Build page range with gaps
|
|
11
|
+
range_start = [current_page - sibling_count, 1].max
|
|
12
|
+
range_end = [current_page + sibling_count, total_pages].min
|
|
13
|
+
pages = []
|
|
14
|
+
pages << 1 if range_start > 1
|
|
15
|
+
pages << :gap if range_start > 2
|
|
16
|
+
(range_start..range_end).each { |p| pages << p unless pages.include?(p) }
|
|
17
|
+
pages << :gap if range_end < total_pages - 1
|
|
18
|
+
pages << total_pages if range_end < total_pages && !pages.include?(total_pages)
|
|
19
|
+
%>
|
|
20
|
+
|
|
21
|
+
<nav aria-label="Pagination" class="flex items-center justify-center gap-1">
|
|
22
|
+
<% if current_page > 1 %>
|
|
23
|
+
<a href="<%= page_url.call(current_page - 1) %>"
|
|
24
|
+
class="inline-flex items-center gap-1 rounded-md px-3 py-2 text-sm text-hw-muted-foreground hover:bg-hw-accent hover:text-hw-accent-foreground transition-colors">
|
|
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"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/></svg>
|
|
26
|
+
Prev
|
|
27
|
+
</a>
|
|
28
|
+
<% end %>
|
|
29
|
+
<% pages.each do |page| %>
|
|
30
|
+
<% if page == :gap %>
|
|
31
|
+
<span class="px-2 text-hw-muted-foreground">…</span>
|
|
32
|
+
<% else %>
|
|
33
|
+
<a href="<%= page_url.call(page) %>"
|
|
34
|
+
class="inline-flex h-9 w-9 items-center justify-center rounded-md text-sm transition-colors <%= page == current_page ? 'bg-hw-primary text-hw-primary-foreground' : 'hover:bg-hw-accent hover:text-hw-accent-foreground text-hw-muted-foreground' %>">
|
|
35
|
+
<%= page %>
|
|
36
|
+
</a>
|
|
37
|
+
<% end %>
|
|
38
|
+
<% end %>
|
|
39
|
+
<% if current_page < total_pages %>
|
|
40
|
+
<a href="<%= page_url.call(current_page + 1) %>"
|
|
41
|
+
class="inline-flex items-center gap-1 rounded-md px-3 py-2 text-sm text-hw-muted-foreground hover:bg-hw-accent hover:text-hw-accent-foreground transition-colors">
|
|
42
|
+
Next
|
|
43
|
+
<svg class="h-4 w-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/></svg>
|
|
44
|
+
</a>
|
|
45
|
+
<% end %>
|
|
46
|
+
</nav>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<%# Paginator component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/paginator', ... %>
|
|
3
|
+
|
|
4
|
+
<nav class="flex flex-col sm:flex-row items-center justify-between gap-4" data-controller="hw-paginator" aria-label="Pagination" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<div class="flex items-center gap-2 text-sm text-hw-muted-foreground">
|
|
6
|
+
<span>Rows per page:</span>
|
|
7
|
+
<select class="h-8 rounded-md border border-hw-input bg-hw-background px-2 text-sm text-hw-foreground focus:outline-none focus:ring-2 focus:ring-hw-ring" data-action="change->hw-paginator#changePerPage">
|
|
8
|
+
<% rows_options.each do |opt| %>
|
|
9
|
+
<option value="<%= opt %>" <%= 'selected' if opt == per_page %>><%= opt %></option>
|
|
10
|
+
<% end %>
|
|
11
|
+
</select>
|
|
12
|
+
</div>
|
|
13
|
+
<div class="flex items-center gap-2 text-sm text-hw-muted-foreground">
|
|
14
|
+
<span><%= range_text %></span>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="flex items-center gap-1">
|
|
17
|
+
<% if current_page > 1 %>
|
|
18
|
+
<a href="<%= page_url(current_page - 1) %>" class="inline-flex items-center gap-1 rounded-md px-3 py-2 text-sm text-hw-muted-foreground hover:bg-hw-accent hover:text-hw-accent-foreground transition-colors">
|
|
19
|
+
<svg class="h-4 w-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/></svg>
|
|
20
|
+
Prev
|
|
21
|
+
</a>
|
|
22
|
+
<% end %>
|
|
23
|
+
<% pages.each do |page| %>
|
|
24
|
+
<% if page == :gap %>
|
|
25
|
+
<span class="px-2 text-hw-muted-foreground">…</span>
|
|
26
|
+
<% else %>
|
|
27
|
+
<a href="<%= page_url(page) %>" class="<%= merge_classes('inline-flex h-9 w-9 items-center justify-center rounded-md text-sm transition-colors', page == current_page ? 'bg-hw-primary text-hw-primary-foreground' : 'hover:bg-hw-accent hover:text-hw-accent-foreground text-hw-muted-foreground') %>">
|
|
28
|
+
<%= page %>
|
|
29
|
+
</a>
|
|
30
|
+
<% end %>
|
|
31
|
+
<% end %>
|
|
32
|
+
<% if current_page < total_pages %>
|
|
33
|
+
<a href="<%= page_url(current_page + 1) %>" class="inline-flex items-center gap-1 rounded-md px-3 py-2 text-sm text-hw-muted-foreground hover:bg-hw-accent hover:text-hw-accent-foreground transition-colors">
|
|
34
|
+
Next
|
|
35
|
+
<svg class="h-4 w-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/></svg>
|
|
36
|
+
</a>
|
|
37
|
+
<% end %>
|
|
38
|
+
</div>
|
|
39
|
+
</nav>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<%# Panel component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/panel', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="rounded-lg border border-hw-border bg-hw-card" data-controller="hw-panel" data-hw-panel-collapsed-value="<%= collapsed %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<div class="flex items-center justify-between px-4 py-3">
|
|
6
|
+
<button type="button" class="flex items-center gap-2 text-sm font-medium text-hw-foreground hover:text-hw-foreground/80" data-action="click->hw-panel#toggle">
|
|
7
|
+
<svg class="<%= merge_classes('h-4 w-4 shrink-0 transition-transform duration-200', collapsed ? '' : 'rotate-90') %>" data-hw-panel-target="chevron" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/></svg>
|
|
8
|
+
<span><%= title %></span>
|
|
9
|
+
</button>
|
|
10
|
+
<% if actions? %>
|
|
11
|
+
<div class="flex items-center gap-1"><%= actions %></div>
|
|
12
|
+
<% end %>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="<%= merge_classes('px-4 pb-4', collapsed ? 'hidden' : '') %>" data-hw-panel-target="content">
|
|
15
|
+
<%= content %>
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<%# PasswordInput component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/password_input', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="relative" data-controller="hw-password">
|
|
5
|
+
<input type="password" name="<%= name %>" value="<%= value %>" placeholder="<%= placeholder %>" <%= 'disabled' if disabled %> <%= 'required' if required %> class="<%= input_classes %>" data-hw-password-target="input" <%= tag.attributes(local_assigns) %>>
|
|
6
|
+
<% if show_toggle %>
|
|
7
|
+
<button type="button" class="absolute right-0 top-0 flex h-full items-center px-3 text-hw-muted-foreground hover:text-hw-foreground" data-action="click->hw-password#toggle">
|
|
8
|
+
<svg class="h-4 w-4" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/><path stroke-linecap="round" stroke-linejoin="round" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"/></svg>
|
|
9
|
+
</button>
|
|
10
|
+
<% end %>
|
|
11
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<%# PasswordStrength component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/password_strength', ... %>
|
|
3
|
+
|
|
4
|
+
<% level = lambda {
|
|
5
|
+
score = 0
|
|
6
|
+
score += 1 if password.length >= 8
|
|
7
|
+
score += 1 if password =~ /[a-z]/ && password =~ /[A-Z]/
|
|
8
|
+
score += 1 if password =~ /\d/
|
|
9
|
+
score += 1 if password =~ /[^a-zA-Z0-9]/
|
|
10
|
+
[score - 1, 0].max
|
|
11
|
+
}.call %>
|
|
12
|
+
<% colors = ['bg-hw-destructive', 'bg-hw-warning', 'bg-hw-warning', 'bg-hw-success'] %>
|
|
13
|
+
<% labels = ['Too short', 'Weak', 'Fair', 'Good', 'Strong'] %>
|
|
14
|
+
<div class="space-y-1.5" data-controller="hw-password-strength" <%= tag.attributes(local_assigns) %>>
|
|
15
|
+
<div class="flex gap-1">
|
|
16
|
+
<% 4.times do |i| %>
|
|
17
|
+
<div class="h-1.5 flex-1 rounded-full transition-colors <%= i <= level && level >= 0 ? colors[level] : 'bg-hw-muted' %>"></div>
|
|
18
|
+
<% end %>
|
|
19
|
+
</div>
|
|
20
|
+
<p class="text-xs <%= level >= 2 ? 'text-hw-success' : level >= 1 ? 'text-hw-warning' : 'text-hw-destructive' %>"><%= labels[level + 1] || labels[0] %></p>
|
|
21
|
+
</div>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<%# PasswordToggle component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/password_toggle', ... %>
|
|
3
|
+
|
|
4
|
+
<button type="button"
|
|
5
|
+
class="inline-flex items-center justify-center h-9 w-9 rounded-md text-hw-muted-foreground hover:bg-hw-accent hover:text-hw-accent-foreground transition-colors cursor-pointer"
|
|
6
|
+
data-controller="hw-password-toggle"
|
|
7
|
+
data-hw-password-toggle-target-input-value="<%= target_input %>"
|
|
8
|
+
data-action="click->hw-password-toggle#toggle"
|
|
9
|
+
aria-label="Toggle password visibility"
|
|
10
|
+
<%= tag.attributes(local_assigns) %>>
|
|
11
|
+
<svg class="h-4 w-4" data-hw-password-toggle-target="eyeOn" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
12
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>
|
|
13
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"/>
|
|
14
|
+
</svg>
|
|
15
|
+
<svg class="h-4 w-4 hidden" data-hw-password-toggle-target="eyeOff" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
16
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"/>
|
|
17
|
+
</svg>
|
|
18
|
+
</button>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<%# PermissionBadge component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/permission_badge', ... %>
|
|
3
|
+
|
|
4
|
+
<span class="<%= badge_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<svg class="h-3 w-3" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
6
|
+
<% case role %>
|
|
7
|
+
<% when :admin %>
|
|
8
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
|
|
9
|
+
<% when :owner %>
|
|
10
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/>
|
|
11
|
+
<% when :editor %>
|
|
12
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/>
|
|
13
|
+
<% else %>
|
|
14
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/><path stroke-linecap="round" stroke-linejoin="round" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"/>
|
|
15
|
+
<% end %>
|
|
16
|
+
</svg>
|
|
17
|
+
<%= display_label %>
|
|
18
|
+
</span>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<%# PhoneInput component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/phone_input', ... %>
|
|
3
|
+
|
|
4
|
+
<input type="tel" name="<%= name %>" value="<%= value %>" placeholder="<%= placeholder %>" <%= 'disabled' if disabled %> class="<%= input_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<%# PhoneMockup component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/phone_mockup', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="inline-block <%= frame_classes %> <%= border_color %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<div class="relative bg-black h-full">
|
|
6
|
+
<% if device == :iphone %>
|
|
7
|
+
<div class="absolute top-0 left-1/2 -translate-x-1/2 w-28 h-6 bg-black rounded-b-2xl z-10"></div>
|
|
8
|
+
<% else %>
|
|
9
|
+
<div class="absolute top-2 left-1/2 -translate-x-1/2 w-2 h-2 bg-hw-foreground/80 rounded-full z-10"></div>
|
|
10
|
+
<% end %>
|
|
11
|
+
<div class="<%= device == :iphone ? 'pt-6' : 'pt-4' %>">
|
|
12
|
+
<%= content %>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<%# Popover component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/popover', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="relative inline-block"
|
|
5
|
+
data-controller="hw-popover"
|
|
6
|
+
data-hw-popover-open-value="<%= open %>">
|
|
7
|
+
<div data-action="click->hw-popover#toggle" data-hw-popover-target="trigger" class="inline-block">
|
|
8
|
+
<% if trigger? %>
|
|
9
|
+
<%= trigger %>
|
|
10
|
+
<% else %>
|
|
11
|
+
<button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-hw-background transition-colors hover:bg-hw-accent hover:text-hw-accent-foreground h-9 px-3">
|
|
12
|
+
Open
|
|
13
|
+
</button>
|
|
14
|
+
<% end %>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="<%= popover_classes %> <%= align_classes %>"
|
|
17
|
+
data-hw-popover-target="content"
|
|
18
|
+
data-state="<%= open ? 'open' : 'closed' %>"
|
|
19
|
+
data-side="<%= side %>"
|
|
20
|
+
<%= tag.attributes(local_assigns) %>>
|
|
21
|
+
<%= content %>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<%# Pricing partial - local variables: title, subtitle, plans, class %>
|
|
2
|
+
<%
|
|
3
|
+
title ||= local_assigns[:title]
|
|
4
|
+
subtitle ||= local_assigns[:subtitle]
|
|
5
|
+
plans ||= local_assigns[:plans] || []
|
|
6
|
+
extra_class ||= local_assigns[:class]
|
|
7
|
+
|
|
8
|
+
plan_count = [[plans.size, 4].min, 1].max
|
|
9
|
+
%>
|
|
10
|
+
<section class="py-12 md:py-24 lg:py-32 <%= extra_class %>">
|
|
11
|
+
<div class="mx-auto max-w-5xl px-4">
|
|
12
|
+
<% if title || subtitle %>
|
|
13
|
+
<div class="text-center mb-12">
|
|
14
|
+
<% if title %>
|
|
15
|
+
<h2 class="text-3xl md:text-4xl font-bold text-hw-foreground"><%= title %></h2>
|
|
16
|
+
<% end %>
|
|
17
|
+
<% if subtitle %>
|
|
18
|
+
<p class="mt-3 text-lg text-hw-muted-foreground"><%= subtitle %></p>
|
|
19
|
+
<% end %>
|
|
20
|
+
</div>
|
|
21
|
+
<% end %>
|
|
22
|
+
<div class="grid gap-6 grid-cols-1 sm:grid-cols-2 lg:grid-cols-<%= plan_count %>">
|
|
23
|
+
<% plans.each do |plan| %>
|
|
24
|
+
<div class="flex flex-col rounded-xl border <%= plan[:highlighted] ? 'border-hw-primary shadow-lg ring-1 ring-hw-primary' : 'border-hw-border' %> bg-hw-card p-6">
|
|
25
|
+
<% if plan[:highlighted] %>
|
|
26
|
+
<span class="self-start rounded-full bg-hw-primary text-hw-primary-foreground px-3 py-1 text-xs font-medium mb-2">Popular</span>
|
|
27
|
+
<% end %>
|
|
28
|
+
<h3 class="text-lg font-semibold text-hw-foreground"><%= plan[:name] %></h3>
|
|
29
|
+
<div class="mt-3 flex items-baseline gap-1">
|
|
30
|
+
<span class="text-4xl font-bold text-hw-foreground"><%= plan[:price] %></span>
|
|
31
|
+
<% if plan[:period] %>
|
|
32
|
+
<span class="text-sm text-hw-muted-foreground">/<%= plan[:period] %></span>
|
|
33
|
+
<% end %>
|
|
34
|
+
</div>
|
|
35
|
+
<% if plan[:features] %>
|
|
36
|
+
<ul class="mt-6 space-y-3 flex-1">
|
|
37
|
+
<% plan[:features].each do |feature| %>
|
|
38
|
+
<li class="flex items-start gap-2 text-sm text-hw-foreground">
|
|
39
|
+
<svg class="h-4 w-4 text-hw-success shrink-0 mt-0.5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
40
|
+
<polyline points="20 6 9 17 4 12"/>
|
|
41
|
+
</svg>
|
|
42
|
+
<%= feature %>
|
|
43
|
+
</li>
|
|
44
|
+
<% end %>
|
|
45
|
+
</ul>
|
|
46
|
+
<% end %>
|
|
47
|
+
<a href="<%= plan[:cta_href] || '#' %>"
|
|
48
|
+
class="mt-6 inline-flex items-center justify-center rounded-lg h-10 px-4 text-sm font-medium transition-colors <%= plan[:highlighted] ? 'bg-hw-primary text-hw-primary-foreground hover:bg-hw-primary/90' : 'border border-hw-border text-hw-foreground hover:bg-hw-muted' %>">
|
|
49
|
+
<%= plan[:cta_label] || 'Get Started' %>
|
|
50
|
+
</a>
|
|
51
|
+
</div>
|
|
52
|
+
<% end %>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</section>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<%# PricingSection component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/pricing_section', ... %>
|
|
3
|
+
|
|
4
|
+
<section class="<%= container_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<div class="mx-auto max-w-5xl">
|
|
6
|
+
<% if title || subtitle %>
|
|
7
|
+
<div class="text-center mb-12">
|
|
8
|
+
<% if title %>
|
|
9
|
+
<h2 class="text-3xl md:text-4xl font-bold text-hw-foreground"><%= title %></h2>
|
|
10
|
+
<% end %>
|
|
11
|
+
<% if subtitle %>
|
|
12
|
+
<p class="mt-3 text-lg text-hw-muted-foreground"><%= subtitle %></p>
|
|
13
|
+
<% end %>
|
|
14
|
+
</div>
|
|
15
|
+
<% end %>
|
|
16
|
+
<div class="grid gap-6 grid-cols-1 sm:grid-cols-2 lg:grid-cols-<%= [plans.size, 4].min %>">
|
|
17
|
+
<% plans.each do |plan| %>
|
|
18
|
+
<div class="flex flex-col rounded-xl border <%= plan[:highlighted] ? 'border-hw-primary shadow-lg ring-1 ring-hw-primary' : 'border-hw-border' %> bg-hw-card p-6">
|
|
19
|
+
<% if plan[:highlighted] %>
|
|
20
|
+
<span class="self-start rounded-full bg-hw-primary text-hw-primary-foreground px-3 py-1 text-xs font-medium mb-2">Popular</span>
|
|
21
|
+
<% end %>
|
|
22
|
+
<h3 class="text-lg font-semibold text-hw-foreground"><%= plan[:name] %></h3>
|
|
23
|
+
<div class="mt-3 flex items-baseline gap-1">
|
|
24
|
+
<span class="text-4xl font-bold text-hw-foreground"><%= plan[:price] %></span>
|
|
25
|
+
<% if plan[:period] %>
|
|
26
|
+
<span class="text-sm text-hw-muted-foreground">/<%= plan[:period] %></span>
|
|
27
|
+
<% end %>
|
|
28
|
+
</div>
|
|
29
|
+
<% if plan[:features] %>
|
|
30
|
+
<ul class="mt-6 space-y-3 flex-1">
|
|
31
|
+
<% plan[:features].each do |feature| %>
|
|
32
|
+
<li class="flex items-start gap-2 text-sm text-hw-foreground">
|
|
33
|
+
<svg class="h-4 w-4 text-hw-success shrink-0 mt-0.5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
34
|
+
<polyline points="20 6 9 17 4 12"/>
|
|
35
|
+
</svg>
|
|
36
|
+
<%= feature %>
|
|
37
|
+
</li>
|
|
38
|
+
<% end %>
|
|
39
|
+
</ul>
|
|
40
|
+
<% end %>
|
|
41
|
+
<a href="<%= plan[:cta_href] || '#' %>"
|
|
42
|
+
class="mt-6 inline-flex items-center justify-center rounded-lg h-10 px-4 text-sm font-medium transition-colors <%= plan[:highlighted] ? 'bg-hw-primary text-hw-primary-foreground hover:bg-hw-primary/90' : 'border border-hw-border text-hw-foreground hover:bg-hw-muted' %>">
|
|
43
|
+
<%= plan[:cta_label] || 'Get Started' %>
|
|
44
|
+
</a>
|
|
45
|
+
</div>
|
|
46
|
+
<% end %>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
</section>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<%# ProductList component — ERB partial %>
|
|
2
|
+
<%# Usage: render 'hotwirebits/product_list', ... %>
|
|
3
|
+
|
|
4
|
+
<div class="<%= grid_classes %>" <%= tag.attributes(local_assigns) %>>
|
|
5
|
+
<% products.each do |product| %>
|
|
6
|
+
<a href="<%= product[:href] || '#' %>" class="group rounded-xl border border-hw-border bg-white overflow-hidden transition-shadow hover:shadow-lg">
|
|
7
|
+
<div class="aspect-square overflow-hidden bg-hw-muted">
|
|
8
|
+
<% if product[:image] %>
|
|
9
|
+
<img src="<%= product[:image] %>" alt="<%= product[:name] %>" class="h-full w-full object-cover transition-transform duration-300 group-hover:scale-105">
|
|
10
|
+
<% end %>
|
|
11
|
+
</div>
|
|
12
|
+
<div class="p-4">
|
|
13
|
+
<h3 class="truncate text-sm font-medium text-hw-foreground"><%= product[:name] %></h3>
|
|
14
|
+
<p class="mt-1 text-sm font-semibold text-hw-primary"><%= product[:price] %></p>
|
|
15
|
+
<% if product[:rating] %>
|
|
16
|
+
<div class="mt-1.5 flex items-center gap-0.5">
|
|
17
|
+
<% 5.times do |i| %>
|
|
18
|
+
<svg class="h-3.5 w-3.5 <%= i < product[:rating].to_i ? 'text-hw-warning' : 'text-hw-muted-foreground/40' %>" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">
|
|
19
|
+
<path fill-rule="evenodd" d="M10.868 2.884c-.321-.772-1.415-.772-1.736 0l-1.83 4.401-4.753.381c-.833.067-1.171 1.107-.536 1.651l3.62 3.102-1.106 4.637c-.194.813.691 1.456 1.405 1.02L10 15.591l4.069 2.485c.713.436 1.598-.207 1.404-1.02l-1.106-4.637 3.62-3.102c.635-.544.297-1.584-.536-1.65l-4.752-.382-1.831-4.401z" clip-rule="evenodd"/>
|
|
20
|
+
</svg>
|
|
21
|
+
<% end %>
|
|
22
|
+
</div>
|
|
23
|
+
<% end %>
|
|
24
|
+
</div>
|
|
25
|
+
</a>
|
|
26
|
+
<% end %>
|
|
27
|
+
</div>
|