Run the CLI
Use the CLI to add the component to your project.
npx @ngzard/ui add popoverDisplays rich content in a portal, triggered by a button.
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { ZardButtonComponent } from '../../button/button.component';
import { ZardPopoverComponent, ZardPopoverDirective } from '../popover.component';
@Component({
selector: 'z-popover-default-demo',
standalone: true,
imports: [ZardButtonComponent, ZardPopoverComponent, ZardPopoverDirective],
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<button z-button zPopover [zContent]="popoverContent" zType="outline">Open popover</button>
<ng-template #popoverContent>
<z-popover>
<div class="space-y-2">
<h4 class="font-medium leading-none">Dimensions</h4>
<p class="text-sm text-muted-foreground">Set the dimensions for the layer.</p>
</div>
</z-popover>
</ng-template>
`,
})
export class ZardDemoPopoverDefaultComponent {}
Use the CLI to add the component to your project.
npx @ngzard/ui add popoverpnpm dlx @ngzard/ui add popoveryarn dlx @ngzard/ui add popoverbunx @ngzard/ui add popoverCreate the component directory structure and add the following files to your project.
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { ZardButtonComponent } from '../../button/button.component';
import { ZardPopoverComponent, ZardPopoverDirective } from '../popover.component';
@Component({
selector: 'z-popover-default-demo',
standalone: true,
imports: [ZardButtonComponent, ZardPopoverComponent, ZardPopoverDirective],
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<button z-button zPopover [zContent]="popoverContent" zType="outline">Open popover</button>
<ng-template #popoverContent>
<z-popover>
<div class="space-y-2">
<h4 class="font-medium leading-none">Dimensions</h4>
<p class="text-sm text-muted-foreground">Set the dimensions for the layer.</p>
</div>
</z-popover>
</ng-template>
`,
})
export class ZardDemoPopoverDefaultComponent {}
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { ZardButtonComponent } from '../../button/button.component';
import { ZardPopoverComponent, ZardPopoverDirective } from '../popover.component';
@Component({
selector: 'z-popover-hover-demo',
standalone: true,
imports: [ZardButtonComponent, ZardPopoverComponent, ZardPopoverDirective],
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<button z-button zPopover [zContent]="popoverContent" zTrigger="hover" zType="outline">Hover me</button>
<ng-template #popoverContent>
<z-popover>
<div class="space-y-2">
<h4 class="font-medium leading-none">Hover content</h4>
<p class="text-sm text-muted-foreground">This popover appears when you hover over the button.</p>
</div>
</z-popover>
</ng-template>
`,
})
export class ZardDemoPopoverHoverComponent {}
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { ZardButtonComponent } from '../../button/button.component';
import { ZardPopoverComponent, ZardPopoverDirective } from '../popover.component';
@Component({
selector: 'z-popover-placement-demo',
standalone: true,
imports: [ZardButtonComponent, ZardPopoverComponent, ZardPopoverDirective],
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div class="flex flex-col space-y-2">
<button z-button zPopover [zContent]="popoverContent" zPlacement="top" zType="outline">Top</button>
<div class="flex space-x-2">
<button z-button zPopover [zContent]="popoverContent" zPlacement="left" zType="outline">Left</button>
<button z-button zPopover [zContent]="popoverContent" zPlacement="right" zType="outline">Right</button>
</div>
<button z-button zPopover [zContent]="popoverContent" zPlacement="bottom" zType="outline">Bottom</button>
</div>
<ng-template #popoverContent>
<z-popover>
<div class="space-y-2">
<h4 class="font-medium leading-none">Popover content</h4>
<p class="text-sm text-muted-foreground">This is the popover content.</p>
</div>
</z-popover>
</ng-template>
`,
})
export class ZardDemoPopoverPlacementComponent {}
import { ChangeDetectionStrategy, Component, signal, viewChild } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { ZardButtonComponent } from '../../button/button.component';
import { ZardInputDirective } from '../../input/input.directive';
import { ZardPopoverComponent, ZardPopoverDirective } from '../popover.component';
@Component({
selector: 'z-popover-interactive-demo',
standalone: true,
imports: [FormsModule, ZardButtonComponent, ZardPopoverComponent, ZardPopoverDirective, ZardInputDirective],
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<button z-button zPopover [zContent]="interactiveContent" zType="outline" #popoverTrigger>Settings</button>
<ng-template #interactiveContent>
<z-popover>
<div class="space-y-4">
<div class="space-y-2">
<h4 class="font-medium leading-none">Settings</h4>
<p class="text-sm text-muted-foreground">Manage your account settings.</p>
</div>
<div class="space-y-2">
<label for="width" class="text-sm font-medium">Width</label>
<input id="width" z-input type="text" placeholder="100%" class="w-full" [(ngModel)]="width" />
</div>
<div class="space-y-2">
<label for="height" class="text-sm font-medium">Height</label>
<input id="height" z-input type="text" placeholder="25px" class="w-full" [(ngModel)]="height" />
</div>
<button z-button class="w-full" zSize="sm" (click)="saveChanges()">Save changes</button>
</div>
</z-popover>
</ng-template>
`,
})
export class ZardDemoPopoverInteractiveComponent {
readonly popoverDirective = viewChild.required('popoverTrigger', { read: ZardPopoverDirective });
readonly width = signal('100%');
readonly height = signal('25px');
saveChanges() {
console.log('Settings saved:', { width: this.width(), height: this.height() });
this.popoverDirective().hide();
}
}