Run the CLI
Use the CLI to add the component to your project.
npx @ngzard/ui@latest add kbdDisplay keyboard keys and shortcuts in a visually consistent way. Useful for documentation, tooltips, command palettes, and UI hints showing keyboard shortcuts.
import { Component } from '@angular/core';
import { ZardButtonComponent } from '../../button/button.component';
import { ZardKbdComponent } from '../kbd.component';
@Component({
selector: 'z-demo-kbd-default',
imports: [ZardKbdComponent, ZardButtonComponent],
standalone: true,
template: `
<div class="flex flex-col items-center justify-center gap-4">
<div class="flex items-center gap-2">
<z-kbd>Esc</z-kbd>
<z-kbd>⌘</z-kbd>
<z-kbd>Ctrl</z-kbd>
</div>
<button type="submit" z-button zType="outline">
Submit
<z-kbd class="ml-2">Enter</z-kbd>
</button>
</div>
`,
})
export class ZardDemoKbdDefaultComponent {}
Use the CLI to add the component to your project.
npx @ngzard/ui@latest add kbdpnpm dlx @ngzard/ui@latest add kbdyarn dlx @ngzard/ui@latest add kbdbunx @ngzard/ui@latest add kbdCreate the component directory structure and add the following files to your project.
import { ChangeDetectionStrategy, Component, computed, input, ViewEncapsulation } from '@angular/core';
import type { ClassValue } from 'clsx';
import { kbdVariants } from './kbd.variants';
import { mergeClasses } from '@/shared/utils/merge-classes';
@Component({
selector: 'z-kbd, [z-kbd]',
standalone: true,
template: `
<kbd><ng-content /></kbd>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
host: {
'[class]': 'classes()',
},
exportAs: 'zKbd',
})
export class ZardKbdComponent {
readonly class = input<ClassValue>('');
protected readonly classes = computed(() => mergeClasses(kbdVariants(), this.class()));
}
import { cva } from 'class-variance-authority';
export const kbdVariants = cva(
`min-w-5 w-fit h-5 inline-flex items-center justify-center gap-1 text-xs font-medium font-mono bg-muted text-muted-foreground pointer-events-none rounded-sm px-1 select-none [&_svg:not([class*='size-'])]:size-3 [[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10`,
);
export const kbdGroupVariants = cva(`inline-flex items-center gap-1`);
export * from './kbd.component';
export * from './kbd-group.component';
export * from './kbd.variants';
import { ChangeDetectionStrategy, Component, computed, input, ViewEncapsulation } from '@angular/core';
import { type ClassValue } from 'clsx';
import { kbdGroupVariants } from './kbd.variants';
import { mergeClasses } from '@/shared/utils/merge-classes';
@Component({
selector: 'z-kbd-group, [z-kbd-group]',
standalone: true,
template: `
<ng-content />
`,
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
host: {
'[class]': 'classes()',
},
exportAs: 'zKbdGroup',
})
export class ZardKbdGroupComponent {
readonly class = input<ClassValue>('');
protected readonly classes = computed(() => mergeClasses(kbdGroupVariants(), this.class()));
}
import { Component } from '@angular/core';
import { ZardButtonComponent } from '../../button/button.component';
import { ZardKbdComponent } from '../kbd.component';
@Component({
selector: 'z-demo-kbd-default',
imports: [ZardKbdComponent, ZardButtonComponent],
standalone: true,
template: `
<div class="flex flex-col items-center justify-center gap-4">
<div class="flex items-center gap-2">
<z-kbd>Esc</z-kbd>
<z-kbd>⌘</z-kbd>
<z-kbd>Ctrl</z-kbd>
</div>
<button type="submit" z-button zType="outline">
Submit
<z-kbd class="ml-2">Enter</z-kbd>
</button>
</div>
`,
})
export class ZardDemoKbdDefaultComponent {}
import { Component } from '@angular/core';
import { ZardKbdGroupComponent } from '../kbd-group.component';
import { ZardKbdComponent } from '../kbd.component';
@Component({
selector: 'z-demo-kbd-group',
imports: [ZardKbdGroupComponent, ZardKbdComponent],
standalone: true,
template: `
<z-kbd-group>
Use
<z-kbd>Ctrl + K</z-kbd>
or
<z-kbd>Ctrl + O</z-kbd>
to open menu
</z-kbd-group>
`,
})
export class ZardDemoKbdGroupComponent {}
import { Component } from '@angular/core';
import { ZardButtonComponent } from '../../button/button.component';
import { ZardTooltipDirective } from '../../tooltip/tooltip';
import { ZardKbdGroupComponent } from '../kbd-group.component';
import { ZardKbdComponent } from '../kbd.component';
@Component({
selector: 'z-demo-kbd-tooltip',
imports: [ZardButtonComponent, ZardTooltipDirective, ZardKbdGroupComponent, ZardKbdComponent],
standalone: true,
template: `
<button type="button" z-button [zTooltip]="shortcutTip">Save</button>
<ng-template #shortcutTip>
Press
<z-kbd-group>
<z-kbd class="bg-blue-400 text-white">Ctrl</z-kbd>
<span>+</span>
<z-kbd class="bg-blue-400 text-white">S</z-kbd>
</z-kbd-group>
to save
</ng-template>
`,
})
export class ZardDemoKbdTooltipComponent {}