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 type="button" z-button zType="outline">Button</button>
      <button type="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 input to change the size of the button — xs, sm, default and lg, plus the square icon-xs, icon-sm, icon and icon-lg sizes for icon-only buttons.
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 type="button" z-button zSize="xs" zType="outline">Extra Small</button>
        <button type="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 type="button" z-button zSize="sm" zType="outline">Small</button>
        <button type="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 type="button" z-button zType="outline">Default</button>
        <button type="button" z-button zSize="icon" zType="outline" aria-label="Submit">
          <ng-icon name="lucideArrowUpRight" />
        </button>
      </div>
      <div class="flex items-start gap-2">
        <button type="button" z-button zType="outline" zSize="lg">Large</button>
        <button type="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

The default button style, using zType="default".
import { ChangeDetectionStrategy, Component } from '@angular/core';

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

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

outline

Use zType="outline" for a bordered button with a transparent background.
import { ChangeDetectionStrategy, Component } from '@angular/core';

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

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

secondary

Use zType="secondary" for a lower-emphasis alternative to the default button.
import { ChangeDetectionStrategy, Component } from '@angular/core';

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

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

ghost

Use zType="ghost" for a button with no background or border until it is hovered or focused.
import { ChangeDetectionStrategy, Component } from '@angular/core';

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

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

destructive

Use zType="destructive" to signal a dangerous or irreversible action.
import { ChangeDetectionStrategy, Component } from '@angular/core';

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

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

link

Use zType="link" to render a button that looks like a text link.
import { ChangeDetectionStrategy, Component } from '@angular/core';

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

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

icon

Use zSize="icon" for a square, icon-only button. Always add an aria-label since there is no visible text for screen readers.
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 type="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 type="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 zShape="circle" to render a fully rounded, icon-only button.
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 gap-2">
      <button z-button zShape="circle">Get Started</button>
      <button z-button zType="outline" zSize="icon" zShape="circle">
        <ng-icon name="lucideArrowUp" />
      </button>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideArrowUp })],
})
export class ZardDemoButtonRoundedComponent {}

spinner

Use the [zLoading] input to show a loading spinner before the label, or project a <z-spinner> manually to control its position within the button.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardSpinnerComponent } from '@/shared/components/spinner/spinner.component';

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

@Component({
  selector: 'z-demo-button-spinner',
  imports: [ZardButtonComponent, ZardSpinnerComponent],
  template: `
    <div class="flex gap-2">
      <button type="button" z-button zType="outline" [zLoading]="true" [zDisabled]="true">Generating</button>
      <button type="button" z-button zType="secondary" [zDisabled]="true">
        Downloading
        <z-spinner data-icon="inline-start" />
      </button>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
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 { ZardNavigationMenuImports } from '@/shared/components/navigation-menu/navigation-menu.imports';
import { ZardSeparatorComponent } from '@/shared/components/separator';

@Component({
  selector: 'z-demo-button-button-group',
  imports: [ZardButtonGroupComponent, ZardButtonComponent, NgIcon, ZardNavigationMenuImports, 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-navigation-menu-trigger
          [zNavigationMenuTriggerFor]="menu"
        >
          <ng-icon name="lucideEllipsis" />

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

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

              <button type="button" z-navigation-menu-link>
                <ng-icon name="lucideClock" />
                Snooze
              </button>
              <button type="button" z-navigation-menu-link>
                <ng-icon name="lucideCalendarPlus" />
                Add to Calendar
              </button>
              <button type="button" z-navigation-menu-link>
                <ng-icon name="lucideListFilter" />
                Add to List
              </button>
              <button
                type="button"
                z-navigation-menu-link
                z-navigation-menu-trigger
                [zNavigationMenuTriggerFor]="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-navigation-menu-content class="w-40">
                    <button type="button" z-navigation-menu-link>Personal</button>
                    <button type="button" z-navigation-menu-link>Work</button>
                    <button type="button" z-navigation-menu-link>Other</button>
                  </div>
                </ng-template>
              </button>

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

              <button type="button" z-navigation-menu-link 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 link

Apply the z-button attribute selector to an <a> element to give it the button appearance. Here's a link that looks like a button.
import { ChangeDetectionStrategy, Component } from '@angular/core';

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

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

rtl

To enable RTL support in zard/ui, see the RTL configuration guide.
// You will notice this example is rendered inside a wrapper that sets the dir and data-lang attributes, and
// reads its text from a translations helper. This is because this site is not RTL by default.
// In your application you won't need either: set dir="rtl" on <html> (or use the CDK Dir directive on a subtree)
// and write the text of your own language. See the RTL guide: https://zardui.com/docs/rtl

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

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

import { ZardButtonComponent } from '@/shared/components/button/button.component';
import { injectRtlTranslation, type ZardRtlTranslations } from '@/shared/demo-utils/rtl-translation';

const translations: ZardRtlTranslations<{ submit: string; learnMore: string; newBranch: string; add: string }> = {
  en: {
    dir: 'ltr',
    values: {
      submit: 'Submit',
      learnMore: 'Learn more',
      newBranch: 'New branch',
      add: 'Add',
    },
  },
  ar: {
    dir: 'rtl',
    values: {
      submit: 'إرسال',
      learnMore: 'اعرف المزيد',
      newBranch: 'فرع جديد',
      add: 'إضافة',
    },
  },
  he: {
    dir: 'rtl',
    values: {
      submit: 'שליחה',
      learnMore: 'למידע נוסף',
      newBranch: 'ענף חדש',
      add: 'הוספה',
    },
  },
};

@Component({
  selector: 'z-demo-button-rtl',
  imports: [ZardButtonComponent, NgIcon],
  template: `
    <div class="flex flex-wrap items-center gap-2">
      <button type="button" z-button>{{ i18n.t().submit }}</button>
      <button type="button" z-button zType="outline">
        {{ i18n.t().learnMore }}
        <ng-icon name="lucideArrowRight" data-icon="inline-end" class="rtl:rotate-180" />
      </button>
      <button type="button" z-button zType="secondary">
        <ng-icon name="lucideGitBranch" data-icon="inline-start" />
        {{ i18n.t().newBranch }}
      </button>
      <button type="button" z-button zType="outline" zSize="icon" [attr.aria-label]="i18n.t().add">
        <ng-icon name="lucidePlus" />
      </button>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideArrowRight, lucideGitBranch, lucidePlus })],
})
export class ZardDemoButtonRtlComponent {
  protected readonly i18n = injectRtlTranslation(translations);
}

API Reference

z-buttonComponent

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

PropertyDescriptionTypeDefault
[class] Custom CSS classes ClassValue ''
[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 .