Skip to content
Snippets Groups Projects
hy-hero.tsx 4.52 KiB
import {Component, Host, h, Listen, Prop, Element} from '@stencil/core';
import {HeroColorVariant} from '../../utils/utils';
import {HeadingVarians, HeadingSectionVariants} from '../../utils/utils';
import {CtaLinkButtonVariants} from '../../utils/utils';

@Component({
  tag: 'hy-hero',
  styleUrl: 'hy-hero.scss',
  shadow: false,
})
export class HyHero {
  @Element() el: HTMLElement;
  @Prop() colorVariant: HeroColorVariant = HeroColorVariant.blue;
  @Prop() image: string;
  @Prop() heading: string;
  @Prop() description: string;
  @Prop() url: string;
  @Prop() urlTitle: string;
  @Prop() scLabel?: string;
  @Prop() isExternal: boolean = false;
  @Prop() headerstyle: string = 'common';

  componentDidLoad() {
    let hyMainDiv = this.el.closest('.hy-main');
    if (hyMainDiv) {
      if (!hyMainDiv.classList.contains('with-sidebar')) {
        this.headerstyle = 'large';
      }
    }

    this.setContentDivPosition();
  }

  setContentDivPosition() {
    const contentDiv = document.querySelectorAll('.hy-hero__content--container')[0] as HTMLElement;
    if (!contentDiv) return;

    if (document.body.scrollWidth <= 1200) {
      contentDiv.style.left = '0';
    }
    if (document.body.scrollWidth >= 1201) {
      const contentWrapper = document.querySelectorAll('div.hy-main-content-wrapper')[0] as HTMLElement;
      if (!contentWrapper) return;

      if (document.body.scrollWidth >= 1441) {
        const marginLeft = parseInt(window.getComputedStyle(contentWrapper).getPropertyValue('margin-left'));
        if (marginLeft > 32) {
          contentDiv.style.left = `${marginLeft}px`;
        } else if (marginLeft > 0) {
          contentDiv.style.left = '32px';
        } else if (marginLeft == 0) {
          contentDiv.style.left = '0px';
        }
      } else {
        contentDiv.style.left = window.getComputedStyle(contentWrapper).getPropertyValue('padding-left');
      }
    }
  }

  @Listen('resize', {target: 'window'})
  resizeEventListener(event) {
    if (!event) return;

    this.setContentDivPosition();
  }

  render() {
    const classAttributes = ['hy-hero', `hy-hero--${this.headerstyle}`, `hy-hero--${this.colorVariant}`].join(' ');

    const aspectRatioWidth = 8;
    const aspectRatioHeight = 5;
    const aspect = (aspectRatioHeight / aspectRatioWidth) * 100;
    const aspectRatio = {
      '--aspectRatio': `${aspect}%` as 'aspectRatio',
    };

    var variant = CtaLinkButtonVariants.onBlueBkgd;

    if (this.colorVariant == HeroColorVariant.black) {
      variant = CtaLinkButtonVariants.onBlackBkgd;
    } else if (this.colorVariant == HeroColorVariant.white) {
      variant = CtaLinkButtonVariants.onTransparentBkgd;
    }

    return (
      <Host>
        <div class={classAttributes}>
          <div>
            <div class="hy-hero__desktop-container">
              <div class="hy-hero__image-container" style={aspectRatio}>
                <img alt={this.scLabel} class="hy-image__image" src={this.image} />
              </div>
              <div class="hy-hero__content"></div>
              <div class="hy-hero__content-wrap-helper">
                <div class="hy-hero__content--container">
                  <div class="hy-hero__title__container">
                    <hy-heading
                      class="hy-hero__title"
                      heading={HeadingVarians.default}
                      section={HeadingSectionVariants.introduction}
                    >
                      {this.heading}
                    </hy-heading>
                    <div class="hy-hero__title__overlay--container">
                      <h1 class="hy-hero__title__overlay">{this.heading}</h1>
                    </div>
                  </div>
                  <div class="hy-hero__content--bottom">
                    {this.description && (
                      <div class="hy-hero__description__container">
                        <div class="hy-hero__description">{this.description}</div>
                      </div>
                    )}
                    {this.url && (
                      <div class="hy-hero__cta-link__container">
                        <hy-cta-button
                          link-content={this.urlTitle}
                          sc-label={this.scLabel}
                          url={this.url}
                          is-external={this.isExternal}
                          variant={variant}
                        />
                      </div>
                    )}
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </Host>
    );
  }
}