@igniteui/angular-templates 21.1.14100-alpha.2 → 21.1.14100-alpha.4

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 (23) hide show
  1. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/SKILL.md +68 -0
  2. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/charts.md +457 -0
  3. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/data-display.md +360 -0
  4. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/directives.md +272 -0
  5. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/feedback.md +149 -0
  6. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/form-controls.md +313 -0
  7. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/layout-manager.md +420 -0
  8. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/layout.md +225 -0
  9. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/setup.md +166 -0
  10. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/SKILL.md +110 -0
  11. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/data-operations.md +445 -0
  12. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/editing.md +491 -0
  13. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/features.md +234 -0
  14. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/paging-remote.md +397 -0
  15. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/state.md +314 -0
  16. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/structure.md +299 -0
  17. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/types.md +507 -0
  18. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/SKILL.md +439 -0
  19. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/references/common-patterns.md +45 -0
  20. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/references/contributing.md +471 -0
  21. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/references/mcp-setup.md +77 -0
  22. package/igx-ts/projects/_base/files/__dot__vscode/mcp.json +2 -2
  23. package/package.json +2 -2
@@ -0,0 +1,360 @@
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
+ ## Contents
7
+
8
+ - [List](#list)
9
+ - [Tree](#tree)
10
+ - [Card](#card)
11
+ - [Chips](#chips)
12
+ - [Avatar & Badge](#avatar--badge)
13
+ - [Icon](#icon)
14
+ - [Carousel](#carousel)
15
+ - [Paginator](#paginator)
16
+ - [Progress Indicators](#progress-indicators)
17
+ - [Chat (AI Chat Component)](#chat-ai-chat-component)
18
+
19
+ ## List
20
+
21
+ > **Docs:** [List Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/list)
22
+
23
+ ```typescript
24
+ import { IGX_LIST_DIRECTIVES } from 'igniteui-angular/list';
25
+ import { IgxAvatarComponent } from 'igniteui-angular/avatar';
26
+ import { IgxIconComponent } from 'igniteui-angular/icon';
27
+ ```
28
+
29
+ ```html
30
+ <igx-list>
31
+ <igx-list-item [isHeader]="true">Contacts</igx-list-item>
32
+ @for (contact of contacts; track contact.id) {
33
+ <igx-list-item>
34
+ <igx-avatar igxListThumbnail [src]="contact.avatar" shape="circle"></igx-avatar>
35
+ <span igxListLine>{{ contact.name }}</span>
36
+ <span igxListLineSubTitle>{{ contact.phone }}</span>
37
+ <span igxListLineTitle>{{ contact.email }}</span>
38
+ <igx-icon igxListAction (click)="call(contact)">phone</igx-icon>
39
+ </igx-list-item>
40
+ }
41
+ </igx-list>
42
+ ```
43
+
44
+ Auxiliary directives for list items: `igxListThumbnail`, `igxListAction`, `igxListLine`, `igxListLineTitle`, `igxListLineSubTitle`.
45
+
46
+ ## Tree
47
+
48
+ > **Docs:** [Tree Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/tree)
49
+
50
+ ```typescript
51
+ import { IGX_TREE_DIRECTIVES } from 'igniteui-angular/tree';
52
+ ```
53
+
54
+ ```html
55
+ <igx-tree [selection]="'BiCascade'" (nodeSelection)="onNodeSelect($event)">
56
+ @for (node of treeData; track node.id) {
57
+ <igx-tree-node [data]="node" [expanded]="node.expanded">
58
+ <igx-icon>folder</igx-icon>
59
+ {{ node.label }}
60
+ @for (child of node.children; track child.id) {
61
+ <igx-tree-node [data]="child">
62
+ <igx-icon>description</igx-icon>
63
+ {{ child.label }}
64
+ </igx-tree-node>
65
+ }
66
+ </igx-tree-node>
67
+ }
68
+ </igx-tree>
69
+ ```
70
+
71
+ Selection modes: `'None'`, `'BiCascade'`, `'Cascade'`.
72
+
73
+ ## Card
74
+
75
+ > **Docs:** [Card Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/card)
76
+
77
+ ```typescript
78
+ import { IgxCardComponent, IgxCardHeaderComponent, IgxCardContentDirective, IgxCardActionsComponent, IgxCardMediaDirective, IgxCardHeaderTitleDirective, IgxCardHeaderSubtitleDirective, IgxCardHeaderThumbnailDirective } from 'igniteui-angular/card';
79
+ import { IgxAvatarComponent } from 'igniteui-angular/avatar';
80
+ import { IgxButtonDirective, IgxIconButtonDirective } from 'igniteui-angular/directives';
81
+ import { IgxRippleDirective } from 'igniteui-angular/directives';
82
+ import { IgxIconComponent } from 'igniteui-angular/icon';
83
+ ```
84
+
85
+ ```html
86
+ <igx-card>
87
+ <igx-card-media height="200px">
88
+ <img [src]="article.coverImage" />
89
+ </igx-card-media>
90
+ <igx-card-header>
91
+ <igx-avatar igxCardHeaderThumbnail [src]="author.photo" shape="circle"></igx-avatar>
92
+ <h3 igxCardHeaderTitle>{{ article.title }}</h3>
93
+ <h5 igxCardHeaderSubtitle>{{ author.name }}</h5>
94
+ </igx-card-header>
95
+ <igx-card-content>
96
+ <p>{{ article.excerpt }}</p>
97
+ </igx-card-content>
98
+ <igx-card-actions>
99
+ <button igxButton="flat" igxRipple>Read More</button>
100
+ <button igxIconButton="flat" igxRipple>
101
+ <igx-icon>favorite</igx-icon>
102
+ </button>
103
+ </igx-card-actions>
104
+ </igx-card>
105
+ ```
106
+
107
+ ## Chips
108
+
109
+ > **Docs:** [Chip Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/chip)
110
+
111
+ ```typescript
112
+ import { IgxChipComponent, IgxChipsAreaComponent } from 'igniteui-angular/chips';
113
+ ```
114
+
115
+ ```html
116
+ <igx-chips-area (reorder)="onChipsReorder($event)">
117
+ @for (tag of tags; track tag) {
118
+ <igx-chip [removable]="true" [selectable]="true" (remove)="removeTag(tag)">
119
+ {{ tag }}
120
+ </igx-chip>
121
+ }
122
+ </igx-chips-area>
123
+ ```
124
+
125
+ ## Avatar & Badge
126
+
127
+ > **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)
128
+
129
+ ```typescript
130
+ import { IgxAvatarComponent } from 'igniteui-angular/avatar';
131
+ import { IgxBadgeComponent } from 'igniteui-angular/badge';
132
+ ```
133
+
134
+ ```html
135
+ <!-- Image avatar with badge overlay -->
136
+ <igx-avatar [src]="user.photo" shape="circle" size="large">
137
+ <igx-badge igxAvatarBadge [type]="'success'" [icon]="'check'"></igx-badge>
138
+ </igx-avatar>
139
+
140
+ <!-- Initials avatar -->
141
+ <igx-avatar initials="JD" shape="circle"></igx-avatar>
142
+
143
+ <!-- Icon avatar -->
144
+ <igx-avatar icon="person"></igx-avatar>
145
+
146
+ <!-- Standalone badge -->
147
+ <igx-badge [type]="'error'" [value]="unreadCount"></igx-badge>
148
+ ```
149
+
150
+ Avatar shapes: `'circle'`, `'rounded'`, `'square'`. Sizes: `'small'`, `'medium'`, `'large'`, or custom CSS.
151
+ Badge types: `'default'`, `'info'`, `'success'`, `'warning'`, `'error'`.
152
+
153
+ ## Icon
154
+
155
+ > **Docs:** [Icon Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/icon)
156
+
157
+ ```typescript
158
+ import { IgxIconComponent, IgxIconService } from 'igniteui-angular/icon';
159
+ ```
160
+
161
+ ```html
162
+ <!-- Material icon (default ligature-based) -->
163
+ <igx-icon>settings</igx-icon>
164
+ <igx-icon color="#e41c77">favorite</igx-icon>
165
+
166
+ <!-- SVG icon from a registered custom family -->
167
+ <igx-icon [family]="'my-icons'" [name]="'logo'"></igx-icon>
168
+ ```
169
+
170
+ Register custom SVG icons in a service or component constructor:
171
+
172
+ ```typescript
173
+ export class AppComponent {
174
+ constructor() {
175
+ const iconService = inject(IgxIconService);
176
+ // From inline SVG string
177
+ iconService.addSvgIconFromText('logo', '<svg xmlns="..." viewBox="...">...</svg>', 'my-icons');
178
+ // From URL
179
+ iconService.addSvgIcon('arrow', '/assets/icons/arrow.svg', 'my-icons');
180
+ }
181
+ }
182
+ ```
183
+
184
+ ## Carousel
185
+
186
+ > **Docs:** [Carousel Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/carousel)
187
+
188
+ ```typescript
189
+ import { IgxCarouselComponent, IgxSlideComponent } from 'igniteui-angular/carousel';
190
+ ```
191
+
192
+ ```html
193
+ <igx-carousel [interval]="3000" [pause]="true" [loop]="true" [navigation]="true">
194
+ @for (slide of slides; track slide.id) {
195
+ <igx-slide>
196
+ <img [src]="slide.image" [alt]="slide.alt" />
197
+ <div class="slide-caption">{{ slide.caption }}</div>
198
+ </igx-slide>
199
+ }
200
+ </igx-carousel>
201
+ ```
202
+
203
+ > **AGENT INSTRUCTION:** Carousel uses Angular animations — ensure `provideAnimations()` is present in `app.config.ts`.
204
+
205
+ ## Paginator
206
+
207
+ > **Docs:** [Paginator Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/paginator)
208
+
209
+ ```typescript
210
+ import { IgxPaginatorComponent } from 'igniteui-angular/paginator';
211
+ ```
212
+
213
+ ```html
214
+ <igx-paginator
215
+ [totalRecords]="totalItems()"
216
+ [perPage]="pageSize()"
217
+ [selectOptions]="[5, 10, 25, 50]"
218
+ (perPageChange)="onPageSizeChange($event)"
219
+ (pageChange)="onPageChange($event)">
220
+ </igx-paginator>
221
+ ```
222
+
223
+ > **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.
224
+
225
+ ## Progress Indicators
226
+
227
+ > **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)
228
+
229
+ ```typescript
230
+ import { IgxLinearProgressBarComponent } from 'igniteui-angular/progressbar';
231
+ import { IgxCircularProgressBarComponent } from 'igniteui-angular/progressbar';
232
+ ```
233
+
234
+ ```html
235
+ <!-- Linear progress bar -->
236
+ <igx-linear-bar
237
+ [value]="uploadProgress()"
238
+ [max]="100"
239
+ [type]="'info'"
240
+ [striped]="true"
241
+ [animate]="true"
242
+ [textVisibility]="true">
243
+ </igx-linear-bar>
244
+
245
+ <!-- Circular progress (determinate) -->
246
+ <igx-circular-bar [value]="65" [max]="100" [animate]="true"></igx-circular-bar>
247
+
248
+ <!-- Circular progress (indeterminate) -->
249
+ <igx-circular-bar [indeterminate]="true"></igx-circular-bar>
250
+ ```
251
+
252
+ Types for linear bar: `'default'`, `'info'`, `'success'`, `'warning'`, `'danger'`.
253
+
254
+ ## Chat (AI Chat Component)
255
+
256
+ > **Docs:** [Chat Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/chat)
257
+
258
+ ```typescript
259
+ import { IgxChatComponent } from 'igniteui-angular/chat';
260
+ ```
261
+
262
+ ```html
263
+ <igx-chat
264
+ [options]="options()"
265
+ [messages]="messages()"
266
+ [draftMessage]="draftMessage"
267
+ [templates]="templates()"
268
+ (messageCreated)="onMessageCreated($event)">
269
+ </igx-chat>
270
+
271
+ <ng-template #messageHeader let-message>
272
+ @if (message.sender !== 'user') {
273
+ <div>
274
+ <span style="font-weight: bold; color: #c00000;"
275
+ >Developer Support</span
276
+ >
277
+ </div>
278
+ }
279
+ </ng-template>
280
+
281
+ <ng-template #suggestionPrefix>
282
+ <span style="font-weight: bold">💡</span>
283
+ </ng-template>
284
+
285
+ <ng-template #messageContent let-message igxChatMessageContext>
286
+ <div [innerHTML]="message.text | fromMarkdown | async"></div>
287
+ </ng-template>
288
+ ```
289
+
290
+ ```typescript
291
+ import { IgxChatComponent, IgxChatMessageContextDirective, type IgxChatOptions } from 'igniteui-angular/chat';
292
+ import { MarkdownPipe } from 'igniteui-angular/chat-extras';
293
+
294
+ @Component({
295
+ selector: 'app-chat-features-sample',
296
+ styleUrls: ['./features-sample.component.scss'],
297
+ templateUrl: './features-sample.component.html',
298
+ imports: [IgxChatComponent, IgxChatMessageContextDirective, AsyncPipe, MarkdownPipe]
299
+ })
300
+ export class ChatFeaturesSampleComponent {
301
+ private _messageHeader = viewChild.required('messageHeader');
302
+ private _suggestionPrefix = viewChild.required('suggestionPrefix');
303
+ private _messageContent = viewChild.required('messageContent');
304
+
305
+ ...
306
+
307
+
308
+ public options = signal<IgxChatOptions>({
309
+ disableAutoScroll: false,
310
+ disableInputAttachments: false,
311
+ inputPlaceholder: 'Type your message here...',
312
+ headerText: 'Developer Support',
313
+ suggestionsPosition: "below-input",
314
+ suggestions: [ 'Send me an e-mail when support is available.' ]
315
+ });
316
+
317
+ public templates = signal({});
318
+
319
+ constructor() {
320
+ effect(() => {
321
+ const messageHeader = this._messageHeader();
322
+ const suggestionPrefix = this._suggestionPrefix();
323
+ const messageContent = this._messageContent();
324
+
325
+ if (messageHeader && suggestionPrefix && messageContent) {
326
+ this.templates.set({
327
+ messageHeader: messageHeader,
328
+ suggestionPrefix: suggestionPrefix,
329
+ messageContent: messageContent
330
+ });
331
+ }
332
+ });
333
+ }
334
+
335
+ public onMessageCreated(e: any): void {
336
+ const newMessage = e;
337
+ this.messages.update(messages => [...messages, newMessage]);
338
+ this.options.update(options => ({ ...options, isTyping: true, suggestions: [] }));
339
+
340
+ const responseMessage = {
341
+ id: Date.now().toString(),
342
+ text: 'Our support team is currently unavailable. We\'ll get back to you as soon as possible.',
343
+ sender: 'support',
344
+ timestamp: Date.now().toString()
345
+ };
346
+
347
+ this.draftMessage = { text: '', attachments: [] };
348
+ this.messages.update(messages => [...messages, responseMessage]);
349
+ this.options.update(options => ({ ...options, isTyping: false }));
350
+ }
351
+ ```
352
+
353
+ ## See Also
354
+
355
+ - [`setup.md`](./setup.md) — App providers, architecture, all entry points
356
+ - [`form-controls.md`](./form-controls.md) — Input Group, Combo, Select, Date/Time Pickers, Calendar, Checkbox, Radio, Switch, Slider
357
+ - [`layout.md`](./layout.md) — Tabs, Stepper, Accordion, Splitter, Navigation Drawer
358
+ - [`feedback.md`](./feedback.md) — Dialog, Snackbar, Toast, Banner
359
+ - [`directives.md`](./directives.md) — Button, Ripple, Tooltip, Drag and Drop
360
+ - [`../../igniteui-angular-grids/references/paging-remote.md`](../../igniteui-angular-grids/references/paging-remote.md) — Grid-specific paginator usage
@@ -0,0 +1,272 @@
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
+ ## Contents
7
+
8
+ - [Button & Icon Button](#button--icon-button)
9
+ - [Button Group](#button-group)
10
+ - [Ripple Effect](#ripple-effect)
11
+ - [Tooltip](#tooltip)
12
+ - [Drag and Drop](#drag-and-drop)
13
+
14
+ ## Button & Icon Button
15
+
16
+ > **Docs:** [Button Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/button)
17
+
18
+ ```typescript
19
+ import { IgxButtonDirective, IgxIconButtonDirective } from 'igniteui-angular/directives';
20
+ import { IgxIconComponent } from 'igniteui-angular/icon';
21
+ ```
22
+
23
+ ```html
24
+ <!-- Text buttons -->
25
+ <button igxButton="flat">Flat</button>
26
+ <button igxButton="raised">Raised</button>
27
+ <button igxButton="outlined">Outlined</button>
28
+ <button igxButton="fab">
29
+ <igx-icon>add</igx-icon>
30
+ </button>
31
+
32
+ <!-- Icon-only buttons -->
33
+ <button igxIconButton="flat"><igx-icon>edit</igx-icon></button>
34
+ <button igxIconButton="outlined"><igx-icon>delete</igx-icon></button>
35
+ <button igxIconButton="contained"><igx-icon>save</igx-icon></button>
36
+
37
+ <!-- Disabled state -->
38
+ <button igxButton="raised" [disabled]="isLoading()">Submit</button>
39
+ ```
40
+
41
+ Button variants for `igxButton`: `'flat'`, `'raised'`, `'outlined'`, `'fab'`.
42
+ Button variants for `igxIconButton`: `'flat'`, `'outlined'`, `'contained'`.
43
+
44
+ ## Button Group
45
+
46
+ > **Docs:** [Button Group Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/buttongroup)
47
+
48
+ ```typescript
49
+ // Option A — convenience collection (includes IgxButtonGroupComponent + IgxButtonDirective)
50
+ import { IGX_BUTTON_GROUP_DIRECTIVES } from 'igniteui-angular/button-group';
51
+
52
+ // Option B — individual imports
53
+ import { IgxButtonGroupComponent } from 'igniteui-angular/button-group';
54
+ import { IgxButtonDirective } from 'igniteui-angular/directives';
55
+
56
+ import { IgxIconComponent } from 'igniteui-angular/icon';
57
+ ```
58
+
59
+ ```html
60
+ <!-- Text buttons — single selection (default) -->
61
+ <igx-buttongroup>
62
+ <button igxButton>Left</button>
63
+ <button igxButton [selected]="true">Center</button>
64
+ <button igxButton>Right</button>
65
+ </igx-buttongroup>
66
+
67
+ <!-- Multi-selection -->
68
+ <igx-buttongroup selectionMode="multi">
69
+ <button igxButton><igx-icon>format_bold</igx-icon></button>
70
+ <button igxButton><igx-icon>format_italic</igx-icon></button>
71
+ <button igxButton><igx-icon>format_underlined</igx-icon></button>
72
+ </igx-buttongroup>
73
+
74
+ <!-- singleRequired — always keeps one button selected, cannot deselect -->
75
+ <igx-buttongroup selectionMode="singleRequired">
76
+ <button igxButton [selected]="true">Day</button>
77
+ <button igxButton>Week</button>
78
+ <button igxButton>Month</button>
79
+ </igx-buttongroup>
80
+
81
+ <!-- Vertical alignment -->
82
+ <igx-buttongroup alignment="vertical">
83
+ <button igxButton>Top</button>
84
+ <button igxButton>Middle</button>
85
+ <button igxButton>Bottom</button>
86
+ </igx-buttongroup>
87
+
88
+ <!-- Disabled group -->
89
+ <igx-buttongroup [disabled]="true">
90
+ <button igxButton>A</button>
91
+ <button igxButton>B</button>
92
+ </igx-buttongroup>
93
+
94
+ <!-- React to selection / deselection events -->
95
+ <igx-buttongroup (selected)="onSelected($event)" (deselected)="onDeselected($event)">
96
+ <button igxButton>One</button>
97
+ <button igxButton>Two</button>
98
+ <button igxButton>Three</button>
99
+ </igx-buttongroup>
100
+ ```
101
+
102
+ ```typescript
103
+ import { IButtonGroupEventArgs } from 'igniteui-angular/button-group';
104
+
105
+ onSelected(event: IButtonGroupEventArgs) {
106
+ console.log('Selected index:', event.index, 'button:', event.button);
107
+ }
108
+
109
+ onDeselected(event: IButtonGroupEventArgs) {
110
+ console.log('Deselected index:', event.index);
111
+ }
112
+ ```
113
+
114
+ **Key inputs on `igx-buttongroup`:**
115
+
116
+ | Input | Type | Default | Description |
117
+ |---|---|---|---|
118
+ | `selectionMode` | `'single' \| 'singleRequired' \| 'multi'` | `'single'` | Selection behaviour. `singleRequired` prevents full deselection. |
119
+ | `alignment` | `'horizontal' \| 'vertical'` | `'horizontal'` | Layout direction of the buttons. |
120
+ | `disabled` | `boolean` | `false` | Disables every button in the group. |
121
+
122
+ **Key outputs on `igx-buttongroup`:**
123
+
124
+ | Output | Payload | Emits when |
125
+ |---|---|---|
126
+ | `(selected)` | `IButtonGroupEventArgs` | A button is selected. |
127
+ | `(deselected)` | `IButtonGroupEventArgs` | A button is deselected. |
128
+
129
+ `IButtonGroupEventArgs`: `{ owner: IgxButtonGroupComponent; button: IgxButtonDirective; index: number }`, where `IgxButtonDirective` is imported from `igniteui-angular/directives` (see **Button & Icon Button** section above).
130
+
131
+ **Key inputs on each `<button igxButton>` child:**
132
+
133
+ | Input | Type | Description |
134
+ |---|---|---|
135
+ | `[selected]` | `boolean` | Sets the initial selected state of the button. |
136
+ | `[disabled]` | `boolean` | Disables a specific button within the group. |
137
+
138
+ **Programmatic control:**
139
+
140
+ ```typescript
141
+ import { viewChild } from '@angular/core';
142
+ import { IgxButtonGroupComponent } from 'igniteui-angular/button-group';
143
+
144
+ buttonGroup = viewChild.required<IgxButtonGroupComponent>('myGroup');
145
+
146
+ selectSecond() { this.buttonGroup().selectButton(1); }
147
+ deselectSecond() { this.buttonGroup().deselectButton(1); }
148
+ getSelected() { return this.buttonGroup().selectedButtons; }
149
+ ```
150
+
151
+ ```html
152
+ <igx-buttongroup #myGroup selectionMode="multi">
153
+ <button igxButton>A</button>
154
+ <button igxButton>B</button>
155
+ <button igxButton>C</button>
156
+ </igx-buttongroup>
157
+ ```
158
+
159
+ ## Ripple Effect
160
+
161
+ > **Docs:** [Ripple Directive](https://www.infragistics.com/products/ignite-ui-angular/angular/components/ripple)
162
+
163
+ ```typescript
164
+ import { IgxRippleDirective } from 'igniteui-angular/directives';
165
+ ```
166
+
167
+ ```html
168
+ <!-- Add to any clickable element for Material-style ink ripple -->
169
+ <button igxButton="raised" igxRipple>Click me</button>
170
+ <div igxRipple igxRippleTarget=".my-class" class="custom-surface">Interactive div</div>
171
+ ```
172
+
173
+ Inputs: `[igxRipple]` (ripple color), `[igxRippleCentered]` (always start from center), `[igxRippleDisabled]`.
174
+
175
+ ```html
176
+ <button igxButton="raised" igxRipple="#ff4081" [igxRippleCentered]="true">Pink ripple</button>
177
+ ```
178
+
179
+ ## Tooltip
180
+
181
+ > **Docs:** [Tooltip Directive](https://www.infragistics.com/products/ignite-ui-angular/angular/components/tooltip)
182
+
183
+ ```typescript
184
+ import { IgxTooltipDirective, IgxTooltipTargetDirective } from 'igniteui-angular/directives';
185
+ ```
186
+
187
+ ```html
188
+ <button igxButton [igxTooltipTarget]="myTooltip" [igxTooltipTargetShowDelay]="500">
189
+ Hover or focus me
190
+ </button>
191
+ <div igxTooltip #myTooltip="tooltip">Helpful tooltip text</div>
192
+ ```
193
+
194
+ Inputs on `[igxTooltipTarget]`: `[igxTooltipTargetShowDelay]` (ms), `[igxTooltipTargetHideDelay]` (ms), `[tooltipDisabled]`.
195
+
196
+ Programmatic control:
197
+
198
+ ```typescript
199
+ tooltip = viewChild.required<IgxTooltipDirective>('myTooltip');
200
+
201
+ showTooltip() { this.tooltip().open(); }
202
+ hideTooltip() { this.tooltip().close(); }
203
+ ```
204
+
205
+ ## Drag and Drop
206
+
207
+ > **Docs:** [Drag and Drop](https://www.infragistics.com/products/ignite-ui-angular/angular/components/drag-drop)
208
+
209
+ ```typescript
210
+ import { IgxDragDirective, IgxDropDirective, IDragMoveEventArgs, IDropDroppedEventArgs } from 'igniteui-angular/directives';
211
+ ```
212
+
213
+ ### Basic drag and drop
214
+
215
+ ```html
216
+ <!-- Draggable source -->
217
+ <div igxDrag [dragData]="item" (dragMove)="onDragMove($event)" (dragEnd)="onDragEnd($event)">
218
+ <igx-icon>drag_indicator</igx-icon>
219
+ {{ item.name }}
220
+ </div>
221
+
222
+ <!-- Drop target -->
223
+ <div igxDrop (dropped)="onDrop($event)" (dragEnter)="onDragEnter($event)" (dragLeave)="onDragLeave($event)">
224
+ Drop here
225
+ </div>
226
+ ```
227
+
228
+ ```typescript
229
+ onDrop(event: IDropDroppedEventArgs) {
230
+ const draggedItem = event.drag.data;
231
+ // Move draggedItem to this drop zone
232
+ event.cancel = false; // allow the drop
233
+ }
234
+ ```
235
+
236
+ ### Ghost element (custom drag preview)
237
+
238
+ ```html
239
+ <div igxDrag [ghostTemplate]="ghostTmpl">Drag me</div>
240
+
241
+ <ng-template #ghostTmpl>
242
+ <div class="custom-ghost">
243
+ <igx-icon>content_copy</igx-icon> Moving...
244
+ </div>
245
+ </ng-template>
246
+ ```
247
+
248
+ ### Reorderable list
249
+
250
+ ```html
251
+ <igx-list>
252
+ @for (item of items; track item.id) {
253
+ <igx-list-item igxDrag [dragData]="item" igxDrop (dropped)="reorder($event, item)">
254
+ <igx-icon igxListAction>drag_handle</igx-icon>
255
+ <span igxListLine>{{ item.name }}</span>
256
+ </igx-list-item>
257
+ }
258
+ </igx-list>
259
+ ```
260
+
261
+ Key drag events: `(dragStart)`, `(dragMove)`, `(dragEnd)`, `(dragClick)`, `(transitioned)`.
262
+ Key drop events: `(dragEnter)`, `(dragLeave)`, `(dragOver)`, `(dropped)`.
263
+
264
+ > **NOTE:** For touch-based drag, add `importProvidersFrom(HammerModule)` to `app.config.ts` providers.
265
+
266
+ ## See Also
267
+
268
+ - [`setup.md`](./setup.md) — App providers, architecture, all entry points
269
+ - [`form-controls.md`](./form-controls.md) — Input Group, Combo, Select, Date/Time Pickers, Calendar, Checkbox, Radio, Switch, Slider
270
+ - [`layout.md`](./layout.md) — Tabs, Stepper, Accordion, Splitter, Navigation Drawer
271
+ - [`data-display.md`](./data-display.md) — List, Tree, Card and other display components
272
+ - [`feedback.md`](./feedback.md) — Dialog, Snackbar, Toast, Banner