Capabilitys Layer
Intent
Deliver independent capabilities as bounded contexts that interact only via events and the workspace context.
Structure Rules
-
Keep each capability cohesive: UI + application orchestration + domain model (if needed).
-
Do not create cross-capability imports for business logic; communicate via events.
State Management
-
Use @ngrx/signals stores as the source of truth for capability state.
-
Derive view state via computed signals; avoid mutable arrays/objects and avoid .push() .
-
Async side effects run through rxMethod
- tapResponse with explicit operator choice.
Event-Driven Interactions
-
Publish domain/application events after persistence (append-before-publish).
-
Subscribe to events in application stores/effects, not in presentation components.
UI Rules
-
Standalone, zone-less components.
-
Templates bind to signals only and use Angular control flow (@if , @for , @switch , @defer ).
-
Material Design 3 token usage only; no hardcoded colors.
Data Boundaries
-
Infrastructure returns Observables/Promises; convert to signals before templates.
-
Do not leak Firebase/DataConnect DTOs outside integration/infrastructure.
Testing Expectations
-
Cover critical flows with unit tests for store transitions and Playwright for happy paths.
-
Use stable selectors (data-testid , roles/labels).