How We Build App User Experiences
Given the range of complex experiences from managing third-party data and syncing alongside our CRUD feature set, we build UX with a mix of client-side views and server-side templates based on the needs of the feature, while making an effort to keep the source of truth for our modeling on the server.
Given a need to add interactivity that doesn’t replace the entire page at once, like reactive graphs and forms, we build interactions and behaviors with AJAX and unobtrusive JavaScript because they provide high-production-value user experiences with productivity and maintainability rivaling whole-page server-side templates.
Highly-interactive features are built using React components into isolated applications injected by the server-side framework. Those apps can sometimes take over the routing to provide a snappy experience when navigating between views, like with steps in a flow. The cost of this pattern means shipping more client-side code to our customers, even with the potential perceived performance bonus that comes from lazily-loading in data that can block server-side rendering for a significant amount of time.
We style all of our user experiences with StyleCloset because as an easy-to-use implementation of our style guide in code, it ensures UX consistency across our apps and workflows, reducing drift, and it works in both client and server-side contexts.
We render PDFs from HTML/CSS templates because it allows us to easily leverage StyleCloset and our existing HTML/CSS expertise.
We split test our consumer experiences with TestTrack experiments because it reduces friction enough that testing becomes the default way we introduce and evaluate new app behavior.