Skip to content
Snippets Groups Projects
button.component.ts 2.07 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { CommonModule } from '@angular/common';
    
    import { Component, EventEmitter, Input, Output } from '@angular/core';
    import { VariantProps, cva } from 'class-variance-authority';
    
    
    import { IconVariants } from '../icons/iconVariants';
    
    import { SpinnerIconComponent } from '../icons/spinner-icon/spinner-icon.component';
    
    
    export const buttonVariants = cva(
    
      [
        'flex items-center gap-4 rounded-md disabled:cursor-wait text-sm font-medium box-border',
        'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus',
      ],
    
          variant: {
    
            primary: 'hover:enabled:bg-primary-hover bg-primary text-white shadow-sm',
    
              'border border-primary bg-background-50 text-primary hover:enabled:bg-background-100',
    
            icon: 'border border-transparent hover:border-primary',
    
            medium: 'h-9 py-2 px-4 min-w-32',
    
            fit: 'h-fit p-2',
    
          },
        },
        defaultVariants: {
    
          variant: 'primary',
    
          size: 'medium',
    
        },
      },
    );
    type ButtonVariants = VariantProps<typeof buttonVariants>;
    
    
    @Component({
      selector: 'ods-button',
      standalone: true,
    
      imports: [CommonModule, SpinnerIconComponent],
      template: `<button
        type="button"
    
        [ngClass]="buttonVariants({ size, variant })"
    
        [attr.aria-disabled]="isLoading"
        [attr.aria-label]="text"
    
    OZGCloud's avatar
    OZGCloud committed
        [attr.data-test-id]="dataTestId"
    
        (click)="clickEmitter.emit()"
      >
        <ng-content *ngIf="!isLoading" select="[icon]"></ng-content>
    
        <ods-spinner-icon *ngIf="isLoading" [size]="spinnerSize"></ods-spinner-icon>
    
        <div *ngIf="text" class="flex-grow">{{ text }}</div>
    
    })
    export class ButtonComponent {
      @Input() text: string = '';
    
      @Input() dataTestId: string = '';
    
      @Input() isLoading: boolean = false;
    
      @Input() variant: ButtonVariants['variant'];
      @Input() size: ButtonVariants['size'];
    
      @Input() spinnerSize: IconVariants['size'] = 'medium';
    
    
      @Output() public clickEmitter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
    
      buttonVariants = buttonVariants;