AI Skill Report Card
Developing Angular Applications
YAML--- name: developing-angular-applications description: Develops frontend web applications using Angular, Angular Material, TypeScript, and SCSS. Use when building modern web UIs, component libraries, or single-page applications. ---
Developing Angular Applications
Quick Start14 / 15
TypeScript// Generate new Angular component with SCSS ng generate component user-profile --style=scss // Component with Angular Material import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; @Component({ selector: 'app-user-profile', standalone: true, imports: [MatButtonModule, MatCardModule], template: ` <mat-card class="profile-card"> <mat-card-header> <mat-card-title>{{user.name}}</mat-card-title> </mat-card-header> <mat-card-actions> <button mat-raised-button color="primary">Edit</button> </mat-card-actions> </mat-card> `, styleUrl: './user-profile.component.scss' }) export class UserProfileComponent { user = { name: 'John Doe' }; }
Recommendation▾
Add more concrete input/output examples showing different scenarios (data fetching, routing, state management)
Workflow13 / 15
Progress:
- Set up Angular project with Material:
ng new app-name && ng add @angular/material - Configure routing and lazy loading modules
- Create feature components with proper TypeScript interfaces
- Implement responsive SCSS with Material Design breakpoints
- Add form validation with Reactive Forms
- Set up services for HTTP communication
- Implement error handling and loading states
- Configure build optimization and deployment
Component Development Process
- Define interfaces for data models in TypeScript
- Create component structure with Angular CLI
- Build template using Angular Material components
- Style with SCSS using Material Design tokens
- Implement logic with proper TypeScript typing
- Add unit tests with Jasmine/Karma
Recommendation▾
Include specific error scenarios and their solutions in the examples section
Examples16 / 20
Example 1: Reactive Form with Validation Input: User registration form with email and password Output:
TypeScriptinterface UserForm { email: string; password: string; } @Component({ template: ` <form [formGroup]="userForm" (ngSubmit)="onSubmit()"> <mat-form-field> <mat-label>Email</mat-label> <input matInput formControlName="email" type="email"> <mat-error *ngIf="userForm.get('email')?.hasError('required')"> Email is required </mat-error> </mat-form-field> <button mat-raised-button type="submit" [disabled]="!userForm.valid"> Submit </button> </form> ` }) export class UserFormComponent { userForm = this.fb.group({ email: ['', [Validators.required, Validators.email]], password: ['', [Validators.required, Validators.minLength(8)]] }); constructor(private fb: FormBuilder) {} }
Example 2: SCSS with Material Theming Input: Custom component styling with Material Design Output:
SCSS@use '@angular/material' as mat; .profile-card { max-width: 400px; margin: mat.get-theme-spacing(2); .mat-mdc-card-header { background: mat.get-theme-color(primary, 50); @media (max-width: 768px) { padding: mat.get-theme-spacing(1); } } }
Recommendation▾
Provide a complete project structure template or starter configuration in the workflow
Best Practices
- Use standalone components for new projects (Angular 14+)
- Implement OnPush change detection for performance
- Follow Angular style guide naming conventions
- Use TypeScript strict mode with proper interfaces
- Leverage Angular Material CDK for custom components
- Implement lazy loading for feature modules
- Use SCSS mixins for reusable styles with Material Design tokens
- Set up proper folder structure: features, shared, core modules
Common Pitfalls
- Don't import entire Material library - import specific modules only
- Avoid any types - always define proper TypeScript interfaces
- Don't manipulate DOM directly - use Angular's data binding
- Don't subscribe without unsubscribing - use takeUntil or async pipe
- Avoid deep SCSS nesting - keep max 3 levels deep
- Don't mix template-driven and reactive forms in same component
- Don't forget to handle loading/error states in HTTP calls