button

Displays a button or a component that looks like a button.

PreviousNext
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { NgIcon, provideIcons } from '@ng-icons/core';
import { lucideArrowUp } from '@ng-icons/lucide';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-preview',
  imports: [ZardButtonComponent, NgIcon],
  template: `
    <div class="flex flex-wrap items-center gap-2 md:flex-row">
      <button z-button zType="outline">Button</button>
      <button z-button zType="outline" zSize="icon" aria-label="Submit">
        <ng-icon name="lucideArrowUp" />
      </button>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideArrowUp })],
})
export class ZardDemoButtonPreviewComponent {}

Installation

Copy
npx zard-cli@latest add button

Usage

import { ZardButtonComponent } from '@/shared/components/button/button.component';
Copy
<button type="button" z-button>Button</button>
Copy

Examples

size

Use the zSize prop to change the size of the button.

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { NgIcon, provideIcons } from '@ng-icons/core';
import { lucideArrowUpRight } from '@ng-icons/lucide';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-size',
  imports: [ZardButtonComponent, NgIcon],
  template: `
    <div class="flex flex-col items-start gap-8 sm:flex-row">
      <div class="flex items-start gap-2">
        <button z-button zSize="xs" zType="outline">Extra Small</button>
        <button z-button zSize="icon-xs" zType="outline" aria-label="Submit">
          <ng-icon name="lucideArrowUpRight" />
        </button>
      </div>
      <div class="flex items-start gap-2">
        <button z-button zSize="sm" zType="outline">Small</button>
        <button z-button zSize="icon-sm" zType="outline" aria-label="Submit">
          <ng-icon name="lucideArrowUpRight" />
        </button>
      </div>
      <div class="flex items-start gap-2">
        <button z-button zType="outline">Default</button>
        <button z-button zSize="icon" zType="outline" aria-label="Submit">
          <ng-icon name="lucideArrowUpRight" />
        </button>
      </div>
      <div class="flex items-start gap-2">
        <button z-button zType="outline" zSize="lg">Large</button>
        <button z-button zSize="icon-lg" zType="outline" aria-label="Submit">
          <ng-icon name="lucideArrowUpRight" />
        </button>
      </div>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideArrowUpRight })],
})
export class ZardDemoButtonSizeComponent {}

default

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-default',
  imports: [ZardButtonComponent],
  template: `
    <button z-button>Button</button>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoButtonDefaultComponent {}

outline

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-outline',
  imports: [ZardButtonComponent],
  template: `
    <button z-button zType="outline">Outline</button>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoButtonOutlineComponent {}

secondary

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-secondary',
  imports: [ZardButtonComponent],
  template: `
    <button z-button zType="secondary">Secondary</button>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoButtonSecondaryComponent {}

ghost

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-ghost',
  imports: [ZardButtonComponent],
  template: `
    <button z-button zType="ghost">Ghost</button>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoButtonGhostComponent {}

destructive

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-destructive',
  imports: [ZardButtonComponent],
  template: `
    <button z-button zType="destructive">Destructive</button>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoButtonDestructiveComponent {}

link

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-link',
  imports: [ZardButtonComponent],
  template: `
    <button z-button zType="link">Link</button>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoButtonLinkComponent {}

icon

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { NgIcon, provideIcons } from '@ng-icons/core';
import { lucideCircleFadingArrowUp } from '@ng-icons/lucide';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-icon',
  imports: [ZardButtonComponent, NgIcon],
  template: `
    <button z-button zType="outline" zSize="icon" aria-label="Submit">
      <ng-icon name="lucideCircleFadingArrowUp" />
    </button>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideCircleFadingArrowUp })],
})
export class ZardDemoButtonIconComponent {}

with icon

Project an <ng-icon> before or after the label to render an icon next to the button text.

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { NgIcon, provideIcons } from '@ng-icons/core';
import { lucideGitBranch } from '@ng-icons/lucide';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-with-icon',
  imports: [ZardButtonComponent, NgIcon],
  template: `
    <button z-button zType="outline" zSize="sm">
      <ng-icon name="lucideGitBranch" />
      New Branch
    </button>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideGitBranch })],
})
export class ZardDemoButtonWithIconComponent {}

rounded

Use the rounded-full class to make the button rounded.

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { NgIcon, provideIcons } from '@ng-icons/core';
import { lucideArrowUp } from '@ng-icons/lucide';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-rounded',
  imports: [ZardButtonComponent, NgIcon],
  template: `
    <div class="flex flex-col gap-8">
      <button z-button zType="outline" zSize="icon" class="rounded-full" aria-label="Submit">
        <ng-icon name="lucideArrowUp" />
      </button>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideArrowUp })],
})
export class ZardDemoButtonRoundedComponent {}

spinner

Use the [zLoading] prop to show a loading spinner before the label, or project an <ng-icon name="lucideLoaderCircle" class="animate-spin" /> manually to control its position.

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { NgIcon, provideIcons } from '@ng-icons/core';
import { lucideLoaderCircle } from '@ng-icons/lucide';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-spinner',
  imports: [ZardButtonComponent, NgIcon],
  template: `
    <div class="flex gap-2">
      <button z-button zType="outline" [zLoading]="true" [zDisabled]="true">Generating</button>
      <button z-button zType="secondary" [zDisabled]="true">
        Downloading
        <ng-icon name="lucideLoaderCircle" class="animate-spin" />
      </button>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideLoaderCircle })],
})
export class ZardDemoButtonSpinnerComponent {}

button group

To create a button group, use the <z-button-group> component. See the Button Group documentation for more details.

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { NgIcon, provideIcons } from '@ng-icons/core';
import {
  lucideArchive,
  lucideArrowLeft,
  lucideCalendarPlus,
  lucideChevronRight,
  lucideClock,
  lucideEllipsis,
  lucideListFilter,
  lucideMailCheck,
  lucideTag,
  lucideTrash2,
} from '@ng-icons/lucide';

import { ZardButtonComponent } from '@/shared/components/button/button.component';
import { ZardButtonGroupComponent } from '@/shared/components/button-group/button-group.component';
import { ZardMenuImports } from '@/shared/components/menu/menu.imports';
import { ZardSeparatorComponent } from '@/shared/components/separator';

@Component({
  selector: 'z-demo-button-button-group',
  imports: [ZardButtonGroupComponent, ZardButtonComponent, NgIcon, ZardMenuImports, ZardSeparatorComponent],
  template: `
    <z-button-group>
      <z-button-group class="hidden sm:flex">
        <button type="button" z-button zType="outline" zSize="icon" aria-label="Go Back">
          <ng-icon name="lucideArrowLeft" />
        </button>
      </z-button-group>

      <z-button-group>
        <button type="button" z-button zType="outline">Archive</button>
        <button type="button" z-button zType="outline">Report</button>
      </z-button-group>

      <z-button-group>
        <button type="button" z-button zType="outline">Snooze</button>
        <button
          type="button"
          z-button
          zType="outline"
          zSize="icon"
          aria-label="More Options"
          z-menu
          [zMenuTriggerFor]="menu"
        >
          <ng-icon name="lucideEllipsis" />

          <ng-template #menu>
            <div z-menu-content class="w-40">
              <button type="button" z-menu-item>
                <ng-icon name="lucideMailCheck" />
                Mark as Read
              </button>
              <button type="button" z-menu-item>
                <ng-icon name="lucideArchive" />
                Archive
              </button>

              <z-separator class="my-2" />

              <button type="button" z-menu-item>
                <ng-icon name="lucideClock" />
                Snooze
              </button>
              <button type="button" z-menu-item>
                <ng-icon name="lucideCalendarPlus" />
                Add to Calendar
              </button>
              <button type="button" z-menu-item>
                <ng-icon name="lucideListFilter" />
                Add to List
              </button>
              <button
                type="button"
                z-menu-item
                z-menu
                [zMenuTriggerFor]="labelMenu"
                zPlacement="rightTop"
                class="justify-between"
              >
                <div class="flex items-center gap-2">
                  <ng-icon name="lucideTag" />
                  Label As...
                </div>
                <ng-icon name="lucideChevronRight" />

                <ng-template #labelMenu>
                  <div z-menu-content class="w-40">
                    <button type="button" z-menu-item>Personal</button>
                    <button type="button" z-menu-item>Work</button>
                    <button type="button" z-menu-item>Other</button>
                  </div>
                </ng-template>
              </button>

              <z-separator class="my-2" />

              <button type="button" z-menu-item class="text-destructive">
                <ng-icon name="lucideTrash2" />
                Trash
              </button>
            </div>
          </ng-template>
        </button>
      </z-button-group>
    </z-button-group>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [
    provideIcons({
      lucideArrowLeft,
      lucideEllipsis,
      lucideMailCheck,
      lucideArchive,
      lucideClock,
      lucideCalendarPlus,
      lucideListFilter,
      lucideTag,
      lucideChevronRight,
      lucideTrash2,
    }),
  ],
})
export class ZardDemoButtonButtonGroupComponent {}

as child

Apply the z-button attribute selector to a different element (like <a>) to give it the button appearance. Here's an example of a link that looks like a button.

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '../button.component';

@Component({
  selector: 'z-demo-button-as-child',
  imports: [ZardButtonComponent],
  template: `
    <a z-button href="/login">Login</a>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoButtonAsChildComponent {}

API Reference

z-buttonComponent

Displays a button or a component that looks like a button.

PropertyDescriptionTypeDefault
zDisabled Button disabled state boolean false
zLoading Button loading state boolean false
zShape Button shape 'default' | 'circle' | 'square' 'default'
zSize Button size 'default' | 'xs' | 'sm' | 'lg' | 'icon' | 'icon-xs' | 'icon-sm' | 'icon-lg' 'default'
zType Button type 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link' 'default'
github iconwhatsapp icondiscord iconX icon

Made with in Brazil. Open source and available on GitHub .