Class: Www::FullWidthLandingPageHeaderComponent

Inherits:
ApplicationComponent show all
Includes:
ImagesHelper
Defined in:
app/components/www/full_width_landing_page_header_component.rb

Instance Method Summary collapse

Methods included from ImagesHelper

#image_asset_tag, #image_asset_url

Methods inherited from ApplicationComponent

#cms_link, #fetch_or_fallback, #image_asset_tag, #image_tag, #number_to_currency, #number_with_delimiter, #post_path, #post_url, #strip_tags

Constructor Details

#initialize(title:, introduction:, image_asset_id: nil, fallback_image_asset_id: nil, video_source: nil, video_thumb_asset_id: nil, mobile_poster_id: nil, links: [], sub_title: nil, show_compare: false, hide_cta: false, image_asset_options: nil, button_columns: 4, review_avg_stars: nil, review_count: nil, color_mode: :full, lazy: false, content_align: :left, content_width: :standard, native_playback: true, banner_badges: nil) ⇒ FullWidthLandingPageHeaderComponent

Returns a new instance of FullWidthLandingPageHeaderComponent.

Parameters:

  • lazy (Boolean) (defaults to: false)

    Whether to lazy load the background image. Default false (hero images should load immediately)

  • native_playback (Boolean) (defaults to: true)

    Use native MP4 playback instead of Shaka HLS.
    Default true — hero videos are short ambient loops where native MP4 renders
    the first frame in ~500ms vs 5-8s with HLS/Shaka. Pass false only if adaptive
    bitrate streaming is genuinely needed (rare for hero backgrounds).

  • mobile_poster_id (Integer, nil) (defaults to: nil)

    Image asset to show on mobile instead of video.
    Defaults to video_thumb_asset_id. Rendered with ImageKit focus:auto for smart crop.

  • content_width (Symbol) (defaults to: :standard)

    Width of the text content column over the hero image.
    :standard (default) → col-lg-8 — fits most titles
    :wide → col-lg-9 col-xl-9 — use when the H1 is long enough to wrap unnecessarily at lg+



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'app/components/www/full_width_landing_page_header_component.rb', line 16

def initialize(title:, introduction:, image_asset_id: nil, fallback_image_asset_id: nil, video_source: nil, video_thumb_asset_id: nil, mobile_poster_id: nil, links: [], sub_title: nil, show_compare: false, hide_cta: false, image_asset_options: nil, button_columns: 4, review_avg_stars: nil, review_count: nil,
               color_mode: :full, lazy: false, content_align: :left, content_width: :standard, native_playback: true, banner_badges: nil)
  super()
  @title = title
  @sub_title = sub_title
  @introduction = introduction
  @provided_image_asset_id = image_asset_id || fallback_image_asset_id
  @video_source = video_source
  @video_thumb_asset_id = video_thumb_asset_id
  @mobile_poster_id = mobile_poster_id
  @links = links
  @show_compare = show_compare
  @hide_cta = hide_cta
  @image_asset_options = image_asset_options
  @button_columns = button_columns
  @review_avg_stars = review_avg_stars
  @review_count = review_count
  @color_mode = (color_mode || :full).to_sym
  @lazy = lazy
  @content_align = (content_align || :left).to_sym
  @content_width = (content_width || :standard).to_sym
  @native_playback = native_playback
  @banner_badges = Array(banner_badges).compact.presence
end

Instance Method Details

#before_renderObject

Resolve the effective banner image and set og:image.
Banner resolution order:

  1. Explicit image_asset_id passed to the component
  2. Tagged banner image (banner-for-xxx-page)
    og:image resolution order:
  3. Dedicated og-image-for-xxx-page tagged Image
  4. The resolved banner image
  5. Template-level page_og_image call (handled by MetaHelper guard)


49
50
51
52
53
54
# File 'app/components/www/full_width_landing_page_header_component.rb', line 49

def before_render
  super
  @image_asset_id = @provided_image_asset_id || resolve_banner_image
  og_image = resolve_og_image || @image_asset_id
  helpers.page_og_image(og_image) if og_image.present?
end

#compare_componentObject



91
92
93
# File 'app/components/www/full_width_landing_page_header_component.rb', line 91

def compare_component
  Www::LandingPageCompareComponent.new
end


75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'app/components/www/full_width_landing_page_header_component.rb', line 75

def cta_link_for(options)
  # Extract and normalize options for the CTA component
  cta_options = {
    url: options[:url],
    title: options[:title] || 'Learn More',
    fa_icon: options[:fa_icon],
    svg_icon: options[:svg_icon],
    icon_url: options[:icon_url],
    style: options[:style] || :solid,
    data: options[:data],
    panel: options[:panel]
  }.compact

  Www::LandingPageCtaLinkComponent.new(**cta_options)
end


56
57
58
59
60
61
62
63
64
65
66
# File 'app/components/www/full_width_landing_page_header_component.rb', line 56

def header_links
  return [] if @hide_cta
  return Array(@links).map { |entry| normalize_link_entry(entry) }.compact if @links.present?

  links = []

  return links if links.present?

  # Default: only Contact Modal
  [preset_link(:contact_modal)]
end

#show_compare?Boolean

Returns:

  • (Boolean)


68
69
70
71
72
73
# File 'app/components/www/full_width_landing_page_header_component.rb', line 68

def show_compare?
  return false unless @show_compare

  request_path = helpers.request&.path.to_s
  request_path.include?('/floor-heating')
end