@igniteui/angular-templates 21.1.14100-alpha.2 → 21.1.14100-alpha.3
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.
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/SKILL.md +68 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/charts.md +457 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/data-display.md +360 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/directives.md +272 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/feedback.md +149 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/form-controls.md +313 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/layout-manager.md +420 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/layout.md +225 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/setup.md +166 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/SKILL.md +110 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/data-operations.md +445 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/editing.md +491 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/features.md +234 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/paging-remote.md +397 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/state.md +314 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/structure.md +299 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/types.md +507 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/SKILL.md +439 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/references/common-patterns.md +45 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/references/contributing.md +471 -0
- package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/references/mcp-setup.md +77 -0
- package/igx-ts/projects/_base/files/__dot__vscode/mcp.json +2 -2
- 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
|