Loading...
Loading...
Build Angular apps with Ignite UI standalone components, form controls, layout, and data display
npx skill4agent add igniteui/igniteui-angular igniteui-angular-componentsigniteui-angularnpm install igniteui-angular@infragistics/igniteui-angularAGENT INSTRUCTION: Before adding any Ignite UI component, verify that(orapp.config.ts) contains the required providers listed below. Missingapp.module.tsis the most common cause of runtime errors with overlay and animated components (Dialog, Combo, Select, Date Picker, Snackbar, Toast, Banner, Navigation Drawer, Dropdown). Always check and updateprovideAnimations()when scaffolding a new feature.app.config.ts
app.config.tsimport { ApplicationConfig, importProvidersFrom } from '@angular/core';
import { provideAnimations } from '@angular/platform-browser/animations';
import { HammerModule } from '@angular/platform-browser';
import { provideRouter } from '@angular/router';
import { provideIgniteIntl } from 'igniteui-angular/core'; // '@infragistics/igniteui-angular/core' for licensed
export const appConfig: ApplicationConfig = {
providers: [
provideAnimations(), // REQUIRED — all overlay and animated components
importProvidersFrom(HammerModule), // REQUIRED — touch gesture support (Slider, Drag & Drop)
provideRouter(appRoutes),
provideIgniteIntl(), // recommended — localization for grids, date/time pickers, etc.
]
};| Provider | Package | Required for |
|---|---|---|
| | All overlay and animated components — Dialog, Combo, Select, Dropdown, Date/Time Picker, Snackbar, Toast, Banner, Navigation Drawer, Carousel, Overlay service |
| | Touch gestures — Slider, Drag & Drop, swipe interactions |
| | Localization for grids, date/time pickers, and other components that display formatted values |
is an alternative toprovideAnimationsAsync()that lazy-loads the animations module — prefer it for SSR or when optimizing initial bundle size:provideAnimations()typescriptimport { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
importsimport { Component } from '@angular/core';
// Open-source package
import { IgxButtonDirective } from 'igniteui-angular/button';
import { IgxDialogComponent } from 'igniteui-angular/dialog';
// Licensed package — identical structure, different prefix
// import { IgxButtonDirective } from '@infragistics/igniteui-angular/button';
// import { IgxDialogComponent } from '@infragistics/igniteui-angular/dialog';
@Component({
selector: 'app-example',
imports: [IgxButtonDirective, IgxDialogComponent],
templateUrl: './example.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ExampleComponent {}// CORRECT — open-source package, tree-shakeable
import { IgxComboComponent } from 'igniteui-angular/combo';
import { IgxDatePickerComponent } from 'igniteui-angular/date-picker';
// CORRECT — licensed package, same entry-point structure
import { IgxComboComponent } from '@infragistics/igniteui-angular/combo';
import { IgxDatePickerComponent } from '@infragistics/igniteui-angular/date-picker';
// AVOID — pulls in entire library (wrong for BOTH package variants)
import { IgxComboComponent, IgxDatePickerComponent } from 'igniteui-angular';
import { IgxComboComponent, IgxDatePickerComponent } from '@infragistics/igniteui-angular';AGENT INSTRUCTION: Before generating import statements, checkto determine which package variant is installed (package.jsonorigniteui-angular). Use that package name as the prefix for all entry-point imports. For example, if the project uses@infragistics/igniteui-angular, every import path must use@infragistics/igniteui-angular— never the root barrel.@infragistics/igniteui-angular/<entry-point>
igniteui-angular@infragistics/igniteui-angular| Token | Entry Point | Includes |
|---|---|---|
| | Grid, columns, toolbar, filtering, selection, paginator, validators |
| | Tree Grid + all grid sub-directives |
| | Hierarchical Grid + row island |
| | Pivot Grid |
| | Input group + label, hint, prefix, suffix |
| | Tabs + tab item, header, content |
| | Stepper + step |
| | Panel + header, body |
| | List + list item |
| | Tree + tree node |
<igx-input-group type="border">
<igx-prefix><igx-icon>person</igx-icon></igx-prefix>
<label igxLabel>Username</label>
<input igxInput name="username" type="text" [(ngModel)]="username" />
<igx-suffix><igx-icon>clear</igx-icon></igx-suffix>
<igx-hint>Enter your username</igx-hint>
</igx-input-group>lineborderboxsearchDocs: Combo Component
<igx-combo
[data]="cities"
[valueKey]="'id'"
[displayKey]="'name'"
[groupKey]="'region'"
placeholder="Select cities"
[allowCustomValues]="false"
[(ngModel)]="selectedCityIds">
</igx-combo>[data][valueKey][displayKey][groupKey][placeholder][allowCustomValues][filterFunction][itemsMaxHeight][type](opening)(opened)(closing)(closed)(selectionChanging)(addition)(searchInputUpdate)Docs: Combo — Single Selection
<igx-simple-combo
[data]="countries"
[valueKey]="'code'"
[displayKey]="'name'"
placeholder="Select country"
[(ngModel)]="selectedCountry">
</igx-simple-combo>igx-comboDocs: Select Component
<igx-select [(ngModel)]="selectedRole" placeholder="Choose role">
@for (role of roles; track role.id) {
<igx-select-item [value]="role.id">{{ role.name }}</igx-select-item>
}
</igx-select>Docs: Date Picker
<igx-date-picker
[(ngModel)]="selectedDate"
[minValue]="minDate"
[maxValue]="maxDate"
[hideOutsideDays]="true"
[displayMonthsCount]="2">
</igx-date-picker>ControlValueAccessorValidatorDocs: Date Range Picker
<igx-date-range-picker [(ngModel)]="dateRange">
<igx-date-range-start>
<input igxInput igxDateTimeEditor type="text" />
</igx-date-range-start>
<igx-date-range-end>
<input igxInput igxDateTimeEditor type="text" />
</igx-date-range-end>
</igx-date-range-picker>Docs: Date Time Editor
<igx-time-picker [(ngModel)]="selectedTime" [inputFormat]="'HH:mm'" [is24HourFormat]="true">
</igx-time-picker>Docs: Calendar Component
<igx-calendar
[(ngModel)]="selectedDate"
[selection]="'single'"
[hideOutsideDays]="true"
[weekStart]="1">
</igx-calendar>'single''multi''range'<igx-checkbox [(ngModel)]="rememberMe">Remember me</igx-checkbox>
<igx-radio name="plan" value="basic" [(ngModel)]="plan">Basic</igx-radio>
<igx-radio name="plan" value="pro" [(ngModel)]="plan">Pro</igx-radio>
<igx-switch [(ngModel)]="darkMode">Dark mode</igx-switch>Docs: Slider Component
<igx-slider [type]="SliderType.RANGE" [minValue]="0" [maxValue]="100"
[lowerBound]="20" [upperBound]="80">
</igx-slider>Docs: Tabs Component
<igx-tabs [(selectedIndex)]="activeTab">
<igx-tab-item>
<igx-tab-header>
<igx-icon igxTabHeaderIcon>info</igx-icon>
<span igxTabHeaderLabel>Info</span>
</igx-tab-header>
<igx-tab-content>Content for Info tab</igx-tab-content>
</igx-tab-item>
<igx-tab-item>
<igx-tab-header>
<span igxTabHeaderLabel>Settings</span>
</igx-tab-header>
<igx-tab-content>Settings content</igx-tab-content>
</igx-tab-item>
</igx-tabs>Docs: Bottom Navigation
<igx-bottom-nav [(selectedIndex)]="activeNavItem">
<igx-bottom-nav-item>
<igx-bottom-nav-header><igx-icon>home</igx-icon><span>Home</span></igx-bottom-nav-header>
<igx-bottom-nav-content>Home content</igx-bottom-nav-content>
</igx-bottom-nav-item>
</igx-bottom-nav>Docs: Stepper Component
<igx-stepper [linear]="true" [orientation]="'horizontal'">
<igx-step [completed]="step1Done">
<div igxStepTitle>Account</div>
<div igxStepSubtitle>Create your account</div>
<div igxStepContent>
<!-- form fields -->
</div>
</igx-step>
<igx-step>
<div igxStepTitle>Profile</div>
<div igxStepContent>...</div>
</igx-step>
</igx-stepper>Docs: Accordion Component
<igx-accordion [singleBranchExpand]="true">
<igx-expansion-panel>
<igx-expansion-panel-header>
<igx-expansion-panel-title>Panel 1</igx-expansion-panel-title>
</igx-expansion-panel-header>
<igx-expansion-panel-body>Content 1</igx-expansion-panel-body>
</igx-expansion-panel>
</igx-accordion>Docs: Splitter Component
<igx-splitter [type]="SplitterType.Horizontal">
<igx-splitter-pane [size]="'30%'">Left panel</igx-splitter-pane>
<igx-splitter-pane>Right panel</igx-splitter-pane>
</igx-splitter>Docs: Navigation Drawer
<igx-nav-drawer [isOpen]="drawerOpen" [pinThreshold]="1024">
<ng-template igxDrawer>
<nav>
<span igxDrawerItem [isHeader]="true">Menu</span>
<span igxDrawerItem igxRipple [active]="true" (click)="navigate('home')">
<igx-icon>home</igx-icon><span>Home</span>
</span>
</nav>
</ng-template>
<ng-template igxDrawerMini>
<span igxDrawerItem igxRipple><igx-icon>home</igx-icon></span>
</ng-template>
</igx-nav-drawer>Docs: List Component
<igx-list>
<igx-list-item [isHeader]="true">Contacts</igx-list-item>
@for (contact of contacts; track contact.id) {
<igx-list-item>
<igx-avatar igxListThumbnail [src]="contact.avatar" shape="circle"></igx-avatar>
<span igxListLine>{{ contact.name }}</span>
<span igxListLineSubTitle>{{ contact.email }}</span>
<igx-icon igxListAction (click)="call(contact)">phone</igx-icon>
</igx-list-item>
}
</igx-list>Docs: Tree Component
<igx-tree [selection]="'BiCascade'">
@for (node of data; track node.id) {
<igx-tree-node [data]="node" [expanded]="node.expanded">
{{ node.label }}
@for (child of node.children; track child.id) {
<igx-tree-node [data]="child">{{ child.label }}</igx-tree-node>
}
</igx-tree-node>
}
</igx-tree>Docs: Card Component
<igx-card>
<igx-card-header>
<igx-avatar igxCardHeaderThumbnail [src]="author.photo" shape="circle"></igx-avatar>
<h3 igxCardHeaderTitle>{{ article.title }}</h3>
<h5 igxCardHeaderSubtitle>{{ author.name }}</h5>
</igx-card-header>
<igx-card-content>
<p>{{ article.excerpt }}</p>
</igx-card-content>
<igx-card-actions>
<button igxButton="flat" igxRipple>Read More</button>
<button igxIconButton="flat" igxRipple>
<igx-icon>favorite</igx-icon>
</button>
</igx-card-actions>
</igx-card>AGENT INSTRUCTION: All components in this section rely on Angular animations and the Ignite UI overlay system. Before using them, ensure(orprovideAnimations()) is present inprovideAnimationsAsync(). If it is missing, add it — otherwise these components will throw runtime errors or silently fail to animate.app.config.ts
Docs: Dialog Component
<igx-dialog #confirmDialog [isModal]="true" [closeOnEscape]="true">
<igx-dialog-title>Confirm Delete</igx-dialog-title>
<p>Are you sure you want to delete this item?</p>
<div igxDialogActions>
<button igxButton="flat" (click)="confirmDialog.close()">Cancel</button>
<button igxButton="raised" (click)="deleteItem(); confirmDialog.close()">Delete</button>
</div>
</igx-dialog>
<button igxButton="raised" (click)="confirmDialog.open()">Delete</button>Docs: Snackbar Component
<igx-snackbar #snackbar [displayTime]="3000" [autoHide]="true">
Item saved successfully
<button igxButton="flat" igxSnackbarAction (click)="undo()">UNDO</button>
</igx-snackbar>this.snackbar.open()Docs: Toast Component
<igx-toast #toast [displayTime]="2000">Operation complete</igx-toast>Docs: Banner Component
<igx-banner #banner>
<igx-icon igxBannerIcon>warning</igx-icon>
You are offline. Some features may not be available.
<div igxBannerActions>
<button igxButton="flat" (click)="banner.dismiss()">Dismiss</button>
<button igxButton="flat" (click)="retry()">Retry</button>
</div>
</igx-banner>Docs: Chip Component
<igx-chips-area>
@for (tag of tags; track tag) {
<igx-chip [removable]="true" (remove)="removeTag(tag)">{{ tag }}</igx-chip>
}
</igx-chips-area><igx-avatar [src]="user.photo" shape="circle" size="large">
<igx-badge igxAvatarBadge [type]="'success'" [icon]="'check'"></igx-badge>
</igx-avatar>Docs: Icon Component
<!-- Material icon (default) -->
<igx-icon>settings</igx-icon>
<!-- SVG icon from custom collection -->
<igx-icon [family]="'custom'" [name]="'my-icon'"></igx-icon>constructor() {
const iconService = inject(IgxIconService);
iconService.addSvgIconFromText('my-icon', '<svg>...</svg>', 'custom');
}Docs: Carousel Component
<igx-carousel [interval]="3000" [pause]="true" [loop]="true">
@for (slide of slides; track slide.id) {
<igx-slide>
<img [src]="slide.image" />
</igx-slide>
}
</igx-carousel>Docs: Paginator Component
<igx-paginator
[totalRecords]="data.length"
[perPage]="10"
[selectOptions]="[5, 10, 25, 50]"
(perPageChange)="onPageSizeChange($event)"
(pageChange)="onPageChange($event)">
</igx-paginator>Docs: Linear Progress · Circular Progress
<igx-linear-bar [value]="75" [max]="100" [type]="'info'" [striped]="true"></igx-linear-bar>
<igx-circular-bar [value]="65" [max]="100" [animate]="true"></igx-circular-bar>Docs: Chat Component
<igx-chat [messages]="messages" [isSendDisabled]="isLoading" (sendMessage)="onSend($event)">
</igx-chat>Docs: Button Component
<button igxButton="flat">Flat</button>
<button igxButton="raised">Raised</button>
<button igxButton="outlined">Outlined</button>
<button igxButton="fab"><igx-icon>add</igx-icon></button>
<button igxIconButton="flat"><igx-icon>edit</igx-icon></button>Docs: Ripple Directive
<button igxButton="raised" igxRipple>Click me</button>Docs: Tooltip Directive
<button [igxTooltipTarget]="tooltipRef">Hover me</button>
<div igxTooltip #tooltipRef="tooltip">Tooltip content</div>Docs: Drag and Drop
<div igxDrag>Drag me</div>
<div igxDrop (dropped)="onDrop($event)">Drop here</div>ControlValueAccessorimport { FormGroup, FormControl, Validators, ReactiveFormsModule } from '@angular/forms';
import { IgxComboComponent } from 'igniteui-angular/combo';
import { IGX_INPUT_GROUP_DIRECTIVES } from 'igniteui-angular/input-group';
import { IgxDatePickerComponent } from 'igniteui-angular/date-picker';
@Component({
imports: [ReactiveFormsModule, IgxComboComponent, IGX_INPUT_GROUP_DIRECTIVES, IgxDatePickerComponent],
template: `
<form [formGroup]="form">
<igx-input-group>
<label igxLabel>Name</label>
<input igxInput formControlName="name" />
</igx-input-group>
<igx-combo [data]="skills" formControlName="skills"
[valueKey]="'id'" [displayKey]="'name'"
placeholder="Select skills">
</igx-combo>
<igx-date-picker formControlName="startDate"></igx-date-picker>
</form>
`
})
export class MyFormComponent {
form = new FormGroup({
name: new FormControl('', Validators.required),
skills: new FormControl([]),
startDate: new FormControl<Date | null>(null)
});
}app.config.tsprovideAnimations()@angular/platform-browser/animationsigniteui-angularigxRipple