Scaffold, catalog, and manage UI components following project conventions. Provides component templates, composition patterns, and maintains the component inventory in project memory.
Create new Angular UI components following established patterns, maintain a consistent component catalog, and ensure every component is properly documented and tested.
Before creating anything, read .github/ui-wizard/memory.md → ## Component Inventory:
Ask the user (via vscode/askQuestions):
Create a colocated component directory under the relevant feature area:
src/app/{feature}/{component-name}/
├── {component-name}.component.ts # Component class + decorator
├── {component-name}.component.html # Template
├── {component-name}.component.css # Scoped styles
└── {component-name}.component.spec.ts # Unit tests
Component scaffold:
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
@Component({
selector: 'app-{component-name}',
standalone: true,
imports: [],
templateUrl: './{component-name}.component.html',
styleUrl: './{component-name}.component.css',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class {ComponentName}Component {
/** Description of input */
readonly label = input.required<string>();
/** Emitted when the primary action is triggered */
readonly actionTriggered = output<void>();
}
For every new component, verify:
ChangeDetectionStrategy.OnPushinput() / input.required() signal APIoutput() signal APIinject() — no constructor injectionreadonly modifier on all Angular-managed propertiesprotected access on template-only membersaria-label provided for icon-only variants@if control flowAfter creating the component, update .github/ui-wizard/memory.md:
## Component Inventory tablein-progress or completeSee references/composition.md for detailed patterns:
<ng-content> for flexible templates<ng-content select="[slot-name]"> for multi-slot layouts@if, @for, @switch in templatesinput() / output() / model() signalsSee references/components.md for the full API reference of existing components.
OnPush, template expressions must read signals synchronously; avoid async calls in templatesinput() outside Angular's reactive context