Skip to content
Snippets Groups Projects
button.tsx 2.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • Markus Kaarto's avatar
    Markus Kaarto committed
    import {Component, h, Prop, Host} from '@stencil/core';
    import {ButtonVariants} from '../../utils/utils';
    import colors from '../../global/colors';
    
    
    const fillcolors = {
    
      primary: colors.brandMain,
    
      secondary: 'white',
    
    Markus Kaarto's avatar
    Markus Kaarto committed
      tag: 'hy-button',
      styleUrl: 'button.scss',
    
      shadow: false,
    
    })
    export class Button {
    
      /**
       * Button type. Defaults to submit.
       */
      @Prop() buttonType: string = 'submit';
    
      /**
       * Custom classes added to button element.
       */
      @Prop() buttonClasses: string = '';
    
    
    Markus Kaarto's avatar
    Markus Kaarto committed
      /**
       * The element variant. Defaults to primary
       */
    
    Markus Kaarto's avatar
    Markus Kaarto committed
      @Prop() variant: ButtonVariants = 'primary';
    
    Markus Kaarto's avatar
    Markus Kaarto committed
      /**
       *  deprecated, use disabled boolean value
       *  */
    
    Markus Kaarto's avatar
    Markus Kaarto committed
      @Prop() state: 'enabled' | 'disabled' = 'enabled';
    
    Markus Kaarto's avatar
    Markus Kaarto committed
      /**
       * Size (height) of the button. Normal: 44px, large: 48px
       */
    
    Markus Kaarto's avatar
    Markus Kaarto committed
      @Prop() size: 'normal' | 'large' = 'normal';
    
    Markus Kaarto's avatar
    Markus Kaarto committed
      /**
       * Use this to programmatically disable the button, matches the native button functionality
       */
      @Prop() disabled: boolean = false;
      /**
       *  Set this on if an anchor tag is required instead of a button.
       */
    
    Markus Kaarto's avatar
    Markus Kaarto committed
      @Prop() url?: string = '';
    
    Markus Kaarto's avatar
    Markus Kaarto committed
      /**
       * Aria label for the element
       */
      @Prop() ariaLabel?: string;
      /**
       * Use only with url property. Sets the
       */
      @Prop() isExternal?: boolean = false;
      /**
       * Icon to use on the left side
       */
    
      @Prop() icon?: string;
    
    Markus Kaarto's avatar
    Markus Kaarto committed
      /**
       * Icon to use on the right side
       */
    
      @Prop() iconRight?: string;
    
        const classAttributes = ['hy-button', this.variant, this.state, 'size-' + this.size, this.buttonClasses];
    
    Markus Kaarto's avatar
    Markus Kaarto committed
        const iconFillColor = fillcolors[this.variant];
    
    Markus Kaarto's avatar
    Markus Kaarto committed
        const target = this.isExternal ? '_blank' : '_self';
    
    Markus Kaarto's avatar
    Markus Kaarto committed
    
        return this.url ? (
          <Host icon-right="hy-icon-arrow-right" aria-label={this.ariaLabel}>
    
    Markus Kaarto's avatar
    Markus Kaarto committed
            <div style={{display: 'flex'}}>
              <a class={classAttributes.join(' ')} href={this.url} target={target}>
    
    Markus Kaarto's avatar
    Markus Kaarto committed
                <span class="hy-button__text">
                  <slot />
                </span>
                <span class="hy-button__icon">
    
    Markus Kaarto's avatar
    Markus Kaarto committed
                  <hy-icon icon="hy-icon-arrow-right" fill={iconFillColor} size={13} />
    
    Markus Kaarto's avatar
    Markus Kaarto committed
                </span>
              </a>
            </div>
          </Host>
        ) : (
          <Host aria-label={this.ariaLabel}>
    
            <button type={this.buttonType} class={classAttributes.join(' ')} disabled={this.disabled}>
    
    Markus Kaarto's avatar
    Markus Kaarto committed
                <span class="hy-button__icon hy-button__icon--left">
    
                  <hy-icon icon={this.icon} fill={iconFillColor} size={13} />
                </span>
              )}
    
    Markus Kaarto's avatar
    Markus Kaarto committed
              <span class="hy-button__text">
    
                <slot />
              </span>
              {!!this.iconRight && (
    
    Markus Kaarto's avatar
    Markus Kaarto committed
                <span class="hy-button__icon hy-button__icon--right">
    
                  <hy-icon icon={this.iconRight} fill={iconFillColor} size={13} />
                </span>
              )}
            </button>
          </Host>
        );
      }
    }