Page loaded: UI Architecture Notes for Angular Teams, Page 3

Writing

Notes on building, architecting, and maintaining front-end systems that no longer feel new.

I write about Angular, CSS, responsive design, accessibility, rendering, and long-lived UI decisions shaped by changing requirements, shifting teams, and real business pressure.

Miguel Carino
Focus
Front-end architecture, Angular, team leadership, and stakeholder communication
Experience
25+ years turning enterprise web complexity into maintainable products

Encapsulation and the Unstyled Button

The host-class bug that rendered a whole design system as bare browser defaults — and why the encapsulation mode was the real decision.

An attribute-host button looked perfect in isolation and shipped as a plain gray browser button. The fix wasn't more CSS; it was choosing the encapsulation boundary on purpose. read more...

The Assertion That Never Ran

A green suite hid a test whose expectation never executed — the async code had walked right past it. Coverage counts lines, not whether you actually checked anything.

A production bug 'had a test,' and the test was green. Its expect() lived inside a callback that never fired during the run, so it could never fail. The fix was making the async path finish where the test could see it. read more...

Two Frameworks, One Running App

The big-bang AngularJS rewrite was the plan nobody could afford — so I ran both frameworks in one app and migrated a route at a time until the old one was gone.

A quarter-long rewrite freeze was the proposal on the table. Running AngularJS and Angular together in a hybrid app turned a cliff into a sequence of shippable steps. read more...

The Chart That Blocked First Paint

A dashboard's heaviest widget was loading before anyone could see the page. @defer let the layout arrive first and the weight show up only when it was needed.

The whole page waited on a charting bundle that lived below the fold. Route-level lazy loading couldn't help — the chart was on the same route. @defer moved the boundary from the route to the component. read more...

The Typeahead That Answered Out of Order

Search-as-you-type is a concurrency problem wearing a data problem's clothes — and switchMap is what keeps the last keystroke honest.

A search box kept showing results for a query the user had already changed. The fix wasn't debounce or a faster API; it was choosing the flattening operator that cancels the request nobody is waiting for anymore. read more...