igniteui-angular 21.1.0-rc.4 → 21.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +29 -0
  2. package/fesm2022/igniteui-angular-grids-core.mjs +5 -3
  3. package/fesm2022/igniteui-angular-grids-core.mjs.map +1 -1
  4. package/fesm2022/igniteui-angular-grids-grid.mjs +6 -1
  5. package/fesm2022/igniteui-angular-grids-grid.mjs.map +1 -1
  6. package/fesm2022/igniteui-angular-grids-hierarchical-grid.mjs +1 -0
  7. package/fesm2022/igniteui-angular-grids-hierarchical-grid.mjs.map +1 -1
  8. package/fesm2022/igniteui-angular-grids-lite.mjs +2 -0
  9. package/fesm2022/igniteui-angular-grids-lite.mjs.map +1 -1
  10. package/fesm2022/igniteui-angular-simple-combo.mjs +1 -1
  11. package/fesm2022/igniteui-angular-simple-combo.mjs.map +1 -1
  12. package/lib/core/styles/components/grid/_grid-theme.scss +4 -1
  13. package/migrations/migration-collection.json +7 -0
  14. package/migrations/update-21_1_0_add-agent-skills/index.d.ts +3 -0
  15. package/migrations/update-21_1_0_add-agent-skills/index.js +46 -0
  16. package/package.json +4 -4
  17. package/skills/igniteui-angular-components/SKILL.md +71 -0
  18. package/skills/igniteui-angular-components/references/charts.md +447 -0
  19. package/skills/igniteui-angular-components/references/data-display.md +347 -0
  20. package/skills/igniteui-angular-components/references/directives.md +149 -0
  21. package/skills/igniteui-angular-components/references/feedback.md +141 -0
  22. package/skills/igniteui-angular-components/references/form-controls.md +298 -0
  23. package/skills/igniteui-angular-components/references/layout-manager.md +415 -0
  24. package/skills/igniteui-angular-components/references/layout.md +216 -0
  25. package/skills/igniteui-angular-components/references/setup.md +157 -0
  26. package/skills/igniteui-angular-grids/SKILL.md +110 -0
  27. package/skills/igniteui-angular-grids/references/data-operations.md +436 -0
  28. package/skills/igniteui-angular-grids/references/editing.md +480 -0
  29. package/skills/igniteui-angular-grids/references/features.md +218 -0
  30. package/skills/igniteui-angular-grids/references/paging-remote.md +388 -0
  31. package/skills/igniteui-angular-grids/references/state.md +448 -0
  32. package/skills/igniteui-angular-grids/references/structure.md +290 -0
  33. package/skills/igniteui-angular-grids/references/types.md +428 -0
  34. package/skills/igniteui-angular-theming/SKILL.md +530 -0
  35. package/styles/igniteui-angular-dark.css +1 -1
  36. package/styles/igniteui-angular.css +1 -1
  37. package/styles/igniteui-bootstrap-dark.css +1 -1
  38. package/styles/igniteui-bootstrap-light.css +1 -1
  39. package/styles/igniteui-dark-green.css +1 -1
  40. package/styles/igniteui-fluent-dark-excel.css +1 -1
  41. package/styles/igniteui-fluent-dark-word.css +1 -1
  42. package/styles/igniteui-fluent-dark.css +1 -1
  43. package/styles/igniteui-fluent-light-excel.css +1 -1
  44. package/styles/igniteui-fluent-light-word.css +1 -1
  45. package/styles/igniteui-fluent-light.css +1 -1
  46. package/styles/igniteui-indigo-dark.css +1 -1
  47. package/styles/igniteui-indigo-light.css +1 -1
  48. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  49. package/styles/maps/igniteui-angular.css.map +1 -1
  50. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  51. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  52. package/styles/maps/igniteui-dark-green.css.map +1 -1
  53. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  54. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  55. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  56. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  57. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  58. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  59. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  60. package/styles/maps/igniteui-indigo-light.css.map +1 -1
  61. package/types/igniteui-angular-grids-lite.d.ts +2 -0
@@ -0,0 +1,347 @@
1
+ # Data Display & Other UI Components
2
+
3
+ > **Part of the [`igniteui-angular-components`](../SKILL.md) skill hub.**
4
+ > For app setup, providers, and import patterns — see [`setup.md`](./setup.md).
5
+
6
+ ## List
7
+
8
+ > **Docs:** [List Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/list)
9
+
10
+ ```typescript
11
+ import { IGX_LIST_DIRECTIVES } from 'igniteui-angular/list';
12
+ import { IgxAvatarComponent } from 'igniteui-angular/avatar';
13
+ import { IgxIconComponent } from 'igniteui-angular/icon';
14
+ ```
15
+
16
+ ```html
17
+ <igx-list>
18
+ <igx-list-item [isHeader]="true">Contacts</igx-list-item>
19
+ @for (contact of contacts; track contact.id) {
20
+ <igx-list-item>
21
+ <igx-avatar igxListThumbnail [src]="contact.avatar" shape="circle"></igx-avatar>
22
+ <span igxListLine>{{ contact.name }}</span>
23
+ <span igxListLineSubTitle>{{ contact.phone }}</span>
24
+ <span igxListLineTitle>{{ contact.email }}</span>
25
+ <igx-icon igxListAction (click)="call(contact)">phone</igx-icon>
26
+ </igx-list-item>
27
+ }
28
+ </igx-list>
29
+ ```
30
+
31
+ Auxiliary directives for list items: `igxListThumbnail`, `igxListAction`, `igxListLine`, `igxListLineTitle`, `igxListLineSubTitle`.
32
+
33
+ ## Tree
34
+
35
+ > **Docs:** [Tree Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/tree)
36
+
37
+ ```typescript
38
+ import { IGX_TREE_DIRECTIVES } from 'igniteui-angular/tree';
39
+ ```
40
+
41
+ ```html
42
+ <igx-tree [selection]="'BiCascade'" (nodeSelection)="onNodeSelect($event)">
43
+ @for (node of treeData; track node.id) {
44
+ <igx-tree-node [data]="node" [expanded]="node.expanded">
45
+ <igx-icon>folder</igx-icon>
46
+ {{ node.label }}
47
+ @for (child of node.children; track child.id) {
48
+ <igx-tree-node [data]="child">
49
+ <igx-icon>description</igx-icon>
50
+ {{ child.label }}
51
+ </igx-tree-node>
52
+ }
53
+ </igx-tree-node>
54
+ }
55
+ </igx-tree>
56
+ ```
57
+
58
+ Selection modes: `'None'`, `'BiCascade'`, `'Cascade'`.
59
+
60
+ ## Card
61
+
62
+ > **Docs:** [Card Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/card)
63
+
64
+ ```typescript
65
+ import { IgxCardComponent, IgxCardHeaderComponent, IgxCardContentDirective, IgxCardActionsComponent, IgxCardMediaDirective, IgxCardHeaderTitleDirective, IgxCardHeaderSubtitleDirective, IgxCardHeaderThumbnailDirective } from 'igniteui-angular/card';
66
+ import { IgxAvatarComponent } from 'igniteui-angular/avatar';
67
+ import { IgxButtonDirective, IgxIconButtonDirective } from 'igniteui-angular/directives';
68
+ import { IgxRippleDirective } from 'igniteui-angular/directives';
69
+ import { IgxIconComponent } from 'igniteui-angular/icon';
70
+ ```
71
+
72
+ ```html
73
+ <igx-card>
74
+ <igx-card-media height="200px">
75
+ <img [src]="article.coverImage" />
76
+ </igx-card-media>
77
+ <igx-card-header>
78
+ <igx-avatar igxCardHeaderThumbnail [src]="author.photo" shape="circle"></igx-avatar>
79
+ <h3 igxCardHeaderTitle>{{ article.title }}</h3>
80
+ <h5 igxCardHeaderSubtitle>{{ author.name }}</h5>
81
+ </igx-card-header>
82
+ <igx-card-content>
83
+ <p>{{ article.excerpt }}</p>
84
+ </igx-card-content>
85
+ <igx-card-actions>
86
+ <button igxButton="flat" igxRipple>Read More</button>
87
+ <button igxIconButton="flat" igxRipple>
88
+ <igx-icon>favorite</igx-icon>
89
+ </button>
90
+ </igx-card-actions>
91
+ </igx-card>
92
+ ```
93
+
94
+ ## Chips
95
+
96
+ > **Docs:** [Chip Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/chip)
97
+
98
+ ```typescript
99
+ import { IgxChipComponent, IgxChipsAreaComponent } from 'igniteui-angular/chips';
100
+ ```
101
+
102
+ ```html
103
+ <igx-chips-area (reorder)="onChipsReorder($event)">
104
+ @for (tag of tags; track tag) {
105
+ <igx-chip [removable]="true" [selectable]="true" (remove)="removeTag(tag)">
106
+ {{ tag }}
107
+ </igx-chip>
108
+ }
109
+ </igx-chips-area>
110
+ ```
111
+
112
+ ## Avatar & Badge
113
+
114
+ > **Docs:** [Avatar](https://www.infragistics.com/products/ignite-ui-angular/angular/components/avatar) · [Badge](https://www.infragistics.com/products/ignite-ui-angular/angular/components/badge)
115
+
116
+ ```typescript
117
+ import { IgxAvatarComponent } from 'igniteui-angular/avatar';
118
+ import { IgxBadgeComponent } from 'igniteui-angular/badge';
119
+ ```
120
+
121
+ ```html
122
+ <!-- Image avatar with badge overlay -->
123
+ <igx-avatar [src]="user.photo" shape="circle" size="large">
124
+ <igx-badge igxAvatarBadge [type]="'success'" [icon]="'check'"></igx-badge>
125
+ </igx-avatar>
126
+
127
+ <!-- Initials avatar -->
128
+ <igx-avatar initials="JD" shape="circle"></igx-avatar>
129
+
130
+ <!-- Icon avatar -->
131
+ <igx-avatar icon="person"></igx-avatar>
132
+
133
+ <!-- Standalone badge -->
134
+ <igx-badge [type]="'error'" [value]="unreadCount"></igx-badge>
135
+ ```
136
+
137
+ Avatar shapes: `'circle'`, `'rounded'`, `'square'`. Sizes: `'small'`, `'medium'`, `'large'`, or custom CSS.
138
+ Badge types: `'default'`, `'info'`, `'success'`, `'warning'`, `'error'`.
139
+
140
+ ## Icon
141
+
142
+ > **Docs:** [Icon Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/icon)
143
+
144
+ ```typescript
145
+ import { IgxIconComponent, IgxIconService } from 'igniteui-angular/icon';
146
+ ```
147
+
148
+ ```html
149
+ <!-- Material icon (default ligature-based) -->
150
+ <igx-icon>settings</igx-icon>
151
+ <igx-icon color="#e41c77">favorite</igx-icon>
152
+
153
+ <!-- SVG icon from a registered custom family -->
154
+ <igx-icon [family]="'my-icons'" [name]="'logo'"></igx-icon>
155
+ ```
156
+
157
+ Register custom SVG icons in a service or component constructor:
158
+
159
+ ```typescript
160
+ export class AppComponent {
161
+ constructor() {
162
+ const iconService = inject(IgxIconService);
163
+ // From inline SVG string
164
+ iconService.addSvgIconFromText('logo', '<svg xmlns="..." viewBox="...">...</svg>', 'my-icons');
165
+ // From URL
166
+ iconService.addSvgIcon('arrow', '/assets/icons/arrow.svg', 'my-icons');
167
+ }
168
+ }
169
+ ```
170
+
171
+ ## Carousel
172
+
173
+ > **Docs:** [Carousel Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/carousel)
174
+
175
+ ```typescript
176
+ import { IgxCarouselComponent, IgxSlideComponent } from 'igniteui-angular/carousel';
177
+ ```
178
+
179
+ ```html
180
+ <igx-carousel [interval]="3000" [pause]="true" [loop]="true" [navigation]="true">
181
+ @for (slide of slides; track slide.id) {
182
+ <igx-slide>
183
+ <img [src]="slide.image" [alt]="slide.alt" />
184
+ <div class="slide-caption">{{ slide.caption }}</div>
185
+ </igx-slide>
186
+ }
187
+ </igx-carousel>
188
+ ```
189
+
190
+ > **AGENT INSTRUCTION:** Carousel uses Angular animations — ensure `provideAnimations()` is present in `app.config.ts`.
191
+
192
+ ## Paginator
193
+
194
+ > **Docs:** [Paginator Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/paginator)
195
+
196
+ ```typescript
197
+ import { IgxPaginatorComponent } from 'igniteui-angular/paginator';
198
+ ```
199
+
200
+ ```html
201
+ <igx-paginator
202
+ [totalRecords]="totalItems()"
203
+ [perPage]="pageSize()"
204
+ [selectOptions]="[5, 10, 25, 50]"
205
+ (perPageChange)="onPageSizeChange($event)"
206
+ (pageChange)="onPageChange($event)">
207
+ </igx-paginator>
208
+ ```
209
+
210
+ > **NOTE:** For grid paging, attach `<igx-paginator>` inside the grid element. See [`../../igniteui-angular-grids/references/paging-remote.md`](../../igniteui-angular-grids/references/paging-remote.md) for grid-specific paging patterns.
211
+
212
+ ## Progress Indicators
213
+
214
+ > **Docs:** [Linear Progress](https://www.infragistics.com/products/ignite-ui-angular/angular/components/linear-progress) · [Circular Progress](https://www.infragistics.com/products/ignite-ui-angular/angular/components/circular-progress)
215
+
216
+ ```typescript
217
+ import { IgxLinearProgressBarComponent } from 'igniteui-angular/progressbar';
218
+ import { IgxCircularProgressBarComponent } from 'igniteui-angular/progressbar';
219
+ ```
220
+
221
+ ```html
222
+ <!-- Linear progress bar -->
223
+ <igx-linear-bar
224
+ [value]="uploadProgress()"
225
+ [max]="100"
226
+ [type]="'info'"
227
+ [striped]="true"
228
+ [animate]="true"
229
+ [textVisibility]="true">
230
+ </igx-linear-bar>
231
+
232
+ <!-- Circular progress (determinate) -->
233
+ <igx-circular-bar [value]="65" [max]="100" [animate]="true"></igx-circular-bar>
234
+
235
+ <!-- Circular progress (indeterminate) -->
236
+ <igx-circular-bar [indeterminate]="true"></igx-circular-bar>
237
+ ```
238
+
239
+ Types for linear bar: `'default'`, `'info'`, `'success'`, `'warning'`, `'danger'`.
240
+
241
+ ## Chat (AI Chat Component)
242
+
243
+ > **Docs:** [Chat Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/chat)
244
+
245
+ ```typescript
246
+ import { IgxChatComponent } from 'igniteui-angular/chat';
247
+ ```
248
+
249
+ ```html
250
+ <igx-chat
251
+ [options]="options()"
252
+ [messages]="messages()"
253
+ [draftMessage]="draftMessage"
254
+ [templates]="templates()"
255
+ (messageCreated)="onMessageCreated($event)">
256
+ </igx-chat>
257
+
258
+ <ng-template #messageHeader let-message>
259
+ @if (message.sender !== 'user') {
260
+ <div>
261
+ <span style="font-weight: bold; color: #c00000;"
262
+ >Developer Support</span
263
+ >
264
+ </div>
265
+ }
266
+ </ng-template>
267
+
268
+ <ng-template #suggestionPrefix>
269
+ <span style="font-weight: bold">💡</span>
270
+ </ng-template>
271
+
272
+ <ng-template #messageContent let-message igxChatMessageContext>
273
+ <div [innerHTML]="message.text | fromMarkdown | async"></div>
274
+ </ng-template>
275
+ ```
276
+
277
+ ```typescript
278
+ import { IgxChatComponent, IgxChatMessageContextDirective, type IgxChatOptions } from 'igniteui-angular/chat';
279
+ import { MarkdownPipe } from 'igniteui-angular/chat-extras';
280
+
281
+ @Component({
282
+ selector: 'app-chat-features-sample',
283
+ styleUrls: ['./features-sample.component.scss'],
284
+ templateUrl: './features-sample.component.html',
285
+ imports: [IgxChatComponent, IgxChatMessageContextDirective, AsyncPipe, MarkdownPipe]
286
+ })
287
+ export class ChatFeaturesSampleComponent {
288
+ private _messageHeader = viewChild.required('messageHeader');
289
+ private _suggestionPrefix = viewChild.required('suggestionPrefix');
290
+ private _messageContent = viewChild.required('messageContent');
291
+
292
+ ...
293
+
294
+
295
+ public options = signal<IgxChatOptions>({
296
+ disableAutoScroll: false,
297
+ disableInputAttachments: false,
298
+ inputPlaceholder: 'Type your message here...',
299
+ headerText: 'Developer Support',
300
+ suggestionsPosition: "below-input",
301
+ suggestions: [ 'Send me an e-mail when support is available.' ]
302
+ });
303
+
304
+ public templates = signal({});
305
+
306
+ constructor() {
307
+ effect(() => {
308
+ const messageHeader = this._messageHeader();
309
+ const suggestionPrefix = this._suggestionPrefix();
310
+ const messageContent = this._messageContent();
311
+
312
+ if (messageHeader && suggestionPrefix && messageContent) {
313
+ this.templates.set({
314
+ messageHeader: messageHeader,
315
+ suggestionPrefix: suggestionPrefix,
316
+ messageContent: messageContent
317
+ });
318
+ }
319
+ });
320
+ }
321
+
322
+ public onMessageCreated(e: any): void {
323
+ const newMessage = e;
324
+ this.messages.update(messages => [...messages, newMessage]);
325
+ this.options.update(options => ({ ...options, isTyping: true, suggestions: [] }));
326
+
327
+ const responseMessage = {
328
+ id: Date.now().toString(),
329
+ text: 'Our support team is currently unavailable. We\'ll get back to you as soon as possible.',
330
+ sender: 'support',
331
+ timestamp: Date.now().toString()
332
+ };
333
+
334
+ this.draftMessage = { text: '', attachments: [] };
335
+ this.messages.update(messages => [...messages, responseMessage]);
336
+ this.options.update(options => ({ ...options, isTyping: false }));
337
+ }
338
+ ```
339
+
340
+ ## See Also
341
+
342
+ - [`setup.md`](./setup.md) — App providers, architecture, all entry points
343
+ - [`form-controls.md`](./form-controls.md) — Input Group, Combo, Select, Date/Time Pickers, Calendar, Checkbox, Radio, Switch, Slider
344
+ - [`layout.md`](./layout.md) — Tabs, Stepper, Accordion, Splitter, Navigation Drawer
345
+ - [`feedback.md`](./feedback.md) — Dialog, Snackbar, Toast, Banner
346
+ - [`directives.md`](./directives.md) — Button, Ripple, Tooltip, Drag and Drop
347
+ - [`../../igniteui-angular-grids/references/paging-remote.md`](../../igniteui-angular-grids/references/paging-remote.md) — Grid-specific paginator usage
@@ -0,0 +1,149 @@
1
+ # Directives
2
+
3
+ > **Part of the [`igniteui-angular-components`](../SKILL.md) skill hub.**
4
+ > For app setup, providers, and import patterns — see [`setup.md`](./setup.md).
5
+
6
+ ## Button & Icon Button
7
+
8
+ > **Docs:** [Button Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/button)
9
+
10
+ ```typescript
11
+ import { IgxButtonDirective, IgxIconButtonDirective } from 'igniteui-angular/directives';
12
+ import { IgxIconComponent } from 'igniteui-angular/icon';
13
+ ```
14
+
15
+ ```html
16
+ <!-- Text buttons -->
17
+ <button igxButton="flat">Flat</button>
18
+ <button igxButton="raised">Raised</button>
19
+ <button igxButton="outlined">Outlined</button>
20
+ <button igxButton="fab">
21
+ <igx-icon>add</igx-icon>
22
+ </button>
23
+
24
+ <!-- Icon-only buttons -->
25
+ <button igxIconButton="flat"><igx-icon>edit</igx-icon></button>
26
+ <button igxIconButton="outlined"><igx-icon>delete</igx-icon></button>
27
+ <button igxIconButton="contained"><igx-icon>save</igx-icon></button>
28
+
29
+ <!-- Disabled state -->
30
+ <button igxButton="raised" [disabled]="isLoading()">Submit</button>
31
+ ```
32
+
33
+ Button variants for `igxButton`: `'flat'`, `'raised'`, `'outlined'`, `'fab'`.
34
+ Button variants for `igxIconButton`: `'flat'`, `'outlined'`, `'contained'`.
35
+
36
+ ## Ripple Effect
37
+
38
+ > **Docs:** [Ripple Directive](https://www.infragistics.com/products/ignite-ui-angular/angular/components/ripple)
39
+
40
+ ```typescript
41
+ import { IgxRippleDirective } from 'igniteui-angular/directives';
42
+ ```
43
+
44
+ ```html
45
+ <!-- Add to any clickable element for Material-style ink ripple -->
46
+ <button igxButton="raised" igxRipple>Click me</button>
47
+ <div igxRipple igxRippleTarget=".my-class" class="custom-surface">Interactive div</div>
48
+ ```
49
+
50
+ Inputs: `[igxRipple]` (ripple color), `[igxRippleCentered]` (always start from center), `[igxRippleDisabled]`.
51
+
52
+ ```html
53
+ <button igxButton="raised" igxRipple="#ff4081" [igxRippleCentered]="true">Pink ripple</button>
54
+ ```
55
+
56
+ ## Tooltip
57
+
58
+ > **Docs:** [Tooltip Directive](https://www.infragistics.com/products/ignite-ui-angular/angular/components/tooltip)
59
+
60
+ ```typescript
61
+ import { IgxTooltipDirective, IgxTooltipTargetDirective } from 'igniteui-angular/directives';
62
+ ```
63
+
64
+ ```html
65
+ <button igxButton [igxTooltipTarget]="myTooltip" [igxTooltipTargetShowDelay]="500">
66
+ Hover or focus me
67
+ </button>
68
+ <div igxTooltip #myTooltip="tooltip">Helpful tooltip text</div>
69
+ ```
70
+
71
+ Inputs on `[igxTooltipTarget]`: `[igxTooltipTargetShowDelay]` (ms), `[igxTooltipTargetHideDelay]` (ms), `[tooltipDisabled]`.
72
+
73
+ Programmatic control:
74
+
75
+ ```typescript
76
+ tooltip = viewChild.required<IgxTooltipDirective>('myTooltip');
77
+
78
+ showTooltip() { this.tooltip().open(); }
79
+ hideTooltip() { this.tooltip().close(); }
80
+ ```
81
+
82
+ ## Drag and Drop
83
+
84
+ > **Docs:** [Drag and Drop](https://www.infragistics.com/products/ignite-ui-angular/angular/components/drag-drop)
85
+
86
+ ```typescript
87
+ import { IgxDragDirective, IgxDropDirective, IDragMoveEventArgs, IDropDroppedEventArgs } from 'igniteui-angular/directives';
88
+ ```
89
+
90
+ ### Basic drag and drop
91
+
92
+ ```html
93
+ <!-- Draggable source -->
94
+ <div igxDrag [dragData]="item" (dragMove)="onDragMove($event)" (dragEnd)="onDragEnd($event)">
95
+ <igx-icon>drag_indicator</igx-icon>
96
+ {{ item.name }}
97
+ </div>
98
+
99
+ <!-- Drop target -->
100
+ <div igxDrop (dropped)="onDrop($event)" (dragEnter)="onDragEnter($event)" (dragLeave)="onDragLeave($event)">
101
+ Drop here
102
+ </div>
103
+ ```
104
+
105
+ ```typescript
106
+ onDrop(event: IDropDroppedEventArgs) {
107
+ const draggedItem = event.drag.data;
108
+ // Move draggedItem to this drop zone
109
+ event.cancel = false; // allow the drop
110
+ }
111
+ ```
112
+
113
+ ### Ghost element (custom drag preview)
114
+
115
+ ```html
116
+ <div igxDrag [ghostTemplate]="ghostTmpl">Drag me</div>
117
+
118
+ <ng-template #ghostTmpl>
119
+ <div class="custom-ghost">
120
+ <igx-icon>content_copy</igx-icon> Moving...
121
+ </div>
122
+ </ng-template>
123
+ ```
124
+
125
+ ### Reorderable list
126
+
127
+ ```html
128
+ <igx-list>
129
+ @for (item of items; track item.id) {
130
+ <igx-list-item igxDrag [dragData]="item" igxDrop (dropped)="reorder($event, item)">
131
+ <igx-icon igxListAction>drag_handle</igx-icon>
132
+ <span igxListLine>{{ item.name }}</span>
133
+ </igx-list-item>
134
+ }
135
+ </igx-list>
136
+ ```
137
+
138
+ Key drag events: `(dragStart)`, `(dragMove)`, `(dragEnd)`, `(dragClick)`, `(transitioned)`.
139
+ Key drop events: `(dragEnter)`, `(dragLeave)`, `(dragOver)`, `(dropped)`.
140
+
141
+ > **NOTE:** For touch-based drag, add `importProvidersFrom(HammerModule)` to `app.config.ts` providers.
142
+
143
+ ## See Also
144
+
145
+ - [`setup.md`](./setup.md) — App providers, architecture, all entry points
146
+ - [`form-controls.md`](./form-controls.md) — Input Group, Combo, Select, Date/Time Pickers, Calendar, Checkbox, Radio, Switch, Slider
147
+ - [`layout.md`](./layout.md) — Tabs, Stepper, Accordion, Splitter, Navigation Drawer
148
+ - [`data-display.md`](./data-display.md) — List, Tree, Card and other display components
149
+ - [`feedback.md`](./feedback.md) — Dialog, Snackbar, Toast, Banner
@@ -0,0 +1,141 @@
1
+ # Feedback & Overlay Components
2
+
3
+ > **Part of the [`igniteui-angular-components`](../SKILL.md) skill hub.**
4
+ > For app setup, providers, and import patterns — see [`setup.md`](./setup.md).
5
+
6
+ > **AGENT INSTRUCTION:** All components in this file rely on Angular animations and the Ignite UI overlay system. Before using any of them, ensure `provideAnimations()` (or `provideAnimationsAsync()`) is present in `app.config.ts`. If it is missing, add it — these components will throw runtime errors or silently fail to animate without it.
7
+
8
+ ## Dialog
9
+
10
+ > **Docs:** [Dialog Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/dialog)
11
+
12
+ ```typescript
13
+ import { IgxDialogComponent, IgxDialogTitleDirective, IgxDialogActionsDirective } from 'igniteui-angular/dialog';
14
+ import { IgxButtonDirective } from 'igniteui-angular/directives';
15
+ ```
16
+
17
+ ```html
18
+ <igx-dialog
19
+ #confirmDialog
20
+ [isModal]="true"
21
+ [closeOnEscape]="true"
22
+ [closeOnOutsideSelect]="false"
23
+ title="Confirm Delete"
24
+ (closed)="onDialogClosed()">
25
+ <igx-dialog-title>Confirm Delete</igx-dialog-title>
26
+ <p>Are you sure you want to delete this item? This action cannot be undone.</p>
27
+ <div igxDialogActions>
28
+ <button igxButton="flat" (click)="confirmDialog.close()">Cancel</button>
29
+ <button igxButton="raised" (click)="deleteItem(); confirmDialog.close()">Delete</button>
30
+ </div>
31
+ </igx-dialog>
32
+
33
+ <button igxButton="raised" (click)="confirmDialog.open()">Delete Item</button>
34
+ ```
35
+
36
+ Programmatic control:
37
+
38
+ ```typescript
39
+ dialog = viewChild.required<IgxDialogComponent>('confirmDialog');
40
+
41
+ open() { this.dialog().open(); }
42
+ close() { this.dialog().close(); }
43
+ ```
44
+
45
+ Events: `(opening)`, `(opened)`, `(closing)`, `(closed)`, `(leftButtonSelect)`, `(rightButtonSelect)`.
46
+
47
+ ## Snackbar
48
+
49
+ > **Docs:** [Snackbar Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/snackbar)
50
+
51
+ ```typescript
52
+ import { IgxSnackbarComponent, IgxSnackbarActionDirective } from 'igniteui-angular/snackbar';
53
+ import { IgxButtonDirective } from 'igniteui-angular/directives';
54
+ ```
55
+
56
+ ```html
57
+ <igx-snackbar
58
+ #snackbar
59
+ [displayTime]="3000"
60
+ [autoHide]="true"
61
+ (animationDone)="onSnackbarDone()">
62
+ Item saved successfully
63
+ <button igxButton="flat" igxSnackbarAction (click)="undo()">UNDO</button>
64
+ </igx-snackbar>
65
+ ```
66
+
67
+ Trigger in TypeScript:
68
+
69
+ ```typescript
70
+ snackbar = viewChild.required<IgxSnackbarComponent>('snackbar');
71
+
72
+ save() {
73
+ this.dataService.save(this.item);
74
+ this.snackbar().open('Item saved'); // optional: pass message text
75
+ }
76
+ ```
77
+
78
+ ## Toast
79
+
80
+ > **Docs:** [Toast Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/toast)
81
+
82
+ ```typescript
83
+ import { IgxToastComponent } from 'igniteui-angular/toast';
84
+ ```
85
+
86
+ ```html
87
+ <igx-toast #toast [displayTime]="2000">Operation complete</igx-toast>
88
+
89
+ <button igxButton (click)="toast.open()">Trigger Toast</button>
90
+ ```
91
+
92
+ Toast vs Snackbar: Toast is non-interactive (no action button), always auto-hides. Snackbar supports an action button and can be persistent.
93
+
94
+ ## Banner
95
+
96
+ > **Docs:** [Banner Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/banner)
97
+
98
+ ```typescript
99
+ import { IgxBannerComponent, IgxBannerActionsDirective } from 'igniteui-angular/banner';
100
+ import { IgxIconComponent } from 'igniteui-angular/icon';
101
+ import { IgxButtonDirective } from 'igniteui-angular/directives';
102
+ ```
103
+
104
+ ```html
105
+ <igx-banner #banner (closed)="onBannerClosed()">
106
+ <igx-icon igxBannerIcon>wifi_off</igx-icon>
107
+ You are offline. Some features may not be available.
108
+ <div igxBannerActions>
109
+ <button igxButton="flat" (click)="banner.dismiss()">Dismiss</button>
110
+ <button igxButton="flat" (click)="retry()">Retry</button>
111
+ </div>
112
+ </igx-banner>
113
+ ```
114
+
115
+ Trigger in TypeScript:
116
+
117
+ ```typescript
118
+ banner = viewChild.required<IgxBannerComponent>('banner');
119
+
120
+ showOfflineWarning() { this.banner().open(); }
121
+ hideWarning() { this.banner().close(); }
122
+ ```
123
+
124
+ Events: `(opening)`, `(opened)`, `(closing)`, `(closed)`.
125
+
126
+ Banner always renders inline (not overlaid) — it pushes page content down when open.
127
+
128
+ ## Key Rules
129
+
130
+ - **`provideAnimations()` is required** — add it to `app.config.ts` before using Dialog, Snackbar, Toast, or Banner
131
+ - **Dialog** uses the Ignite UI overlay system — set `[isModal]="true"` for blocking modals
132
+ - **Snackbar** vs **Toast**: Snackbar supports action buttons and can be persistent; Toast is always auto-hiding and non-interactive
133
+ - **Banner** renders **inline** (pushes content), not as an overlay — use Dialog for blocking prompts
134
+
135
+ ## See Also
136
+
137
+ - [`setup.md`](./setup.md) — App providers, architecture, all entry points
138
+ - [`form-controls.md`](./form-controls.md) — Input Group, Combo, Select, Date/Time Pickers, Calendar, Checkbox, Radio, Switch, Slider
139
+ - [`layout.md`](./layout.md) — Tabs, Stepper, Accordion, Splitter, Navigation Drawer
140
+ - [`data-display.md`](./data-display.md) — List, Tree, Card and other display components
141
+ - [`directives.md`](./directives.md) — Button, Ripple, Tooltip, Drag and Drop