Agent-skills-standard angular-components
Build standalone Angular components with Signals inputs, OnPush change detection, Control Flow, and Smart/Dumb patterns. Use when building standalone Angular components, implementing @if/@for control flow, applying OnPush change detection, or implementing Signals in Angular components. (triggers: **/*.component.ts, **/*.component.html, angular component, standalone, input signal, output, @if, @for, ChangeDetectionStrategy, OnPush, Input, Output)
install
source · Clone the upstream repo
git clone https://github.com/HoangNguyen0403/agent-skills-standard
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/HoangNguyen0403/agent-skills-standard "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/angular/angular-components" ~/.claude/skills/hoangnguyen0403-agent-skills-standard-angular-components && rm -rf "$T"
manifest:
skills/angular/angular-components/SKILL.mdsource content
Angular Components
Priority: P0 (CRITICAL)
Standalone & Structure
- Standalone:
. Import all deps instandalone: true
array. No NgModule. (Angular 20+: standalone default.)imports - Smart/Dumb Split: Smart (Container) → inject services, manage state. Presentational (Dumb) → accept inputs and emit events via outputs only; no service dependencies.
- Host Bindings: Define in
onhost: { }
(e.g.,@Component
) — never use @HostBinding/@HostListener.'[class.active]': 'isActive()' - View Encapsulation: Default
. UseEmulated
carefully.None
Signals & Change Detection
- OnPush: ALWAYS use
. No exceptions.ChangeDetectionStrategy.OnPush - Signal Inputs:
orinput.required<T>()
notinput<T>()
. Access as functions:@Input()
. Use{{ userId() }}
/booleanAttribute
transforms.numberAttribute - Signal Outputs:
(v17.3+) notoutput<T>()
. Two-way binding:@Output() EventEmitter
.model() - State:
local,signal()
derived,computed()
side effects only.effect() - Cleanup:
(auto-unsubscribes),toSignal()
, ortakeUntilDestroyed()
. NeverDestroyRef
without cleanup.subscribe()
Control Flow
- Use
,@if (condition)
,@for (item of items; track item.id)
,@switch
instead of@empty { }
/*ngIf
(new control flow syntax, Angular 17+).*ngFor
Anti-Patterns
- No default CD: OnPush only — default re-checks every component every event.
- No functions in templates:
re-evaluates every cycle →{{ calculate() }}
instead.computed() - No manual subscribe:
pipe orasync
. NevertoSignal
without cleanup.subscribe() - No ElementRef mutation: Directives or Renderer2.
- No class inheritance: Compose with Directives and Services.