Achieving Faster, Cleaner, and More Consistent UI of Fresh Proposal Software
Our Angular + TailwindCSS Migration Story
TL;DR
We migrated Fresh Proposals from a legacy Angular UI architecture to a modern Angular application styled with TailwindCSS. The result: a faster interface, dramatically improved visual consistency, reduced cognitive load for users, and a far more maintainable frontend codebase for our team.
This post explains why we made the change, how we executed it, the challenges we faced, and what changed for both users and developers.
Introduction
Fresh Proposals has evolved significantly over the years. While our backend logic, proposal engine, and integrations matured, parts of our UI remained rooted in an older Angular implementation with traditional global CSS styling.
Over time, we began noticing friction:
- Pages felt visually dense.
- Design consistency varied across modules.
- Adding new features required touching multiple CSS files.
- Minor UI updates sometimes caused unexpected regressions.
We didn’t want a cosmetic redesign. We wanted a structural modernization — one that improved:
- Performance
- Developer velocity
- Visual consistency
- Maintainability
- User clarity
So we upgraded from legacy Angular styling practices to a modern Angular architecture powered by TailwindCSS.
The result is visible in our Templates Listing page — compare the before and after screenshots. The difference isn’t just visual polish. It reflects architectural changes under the hood.
The Problem We Had
What Users Experienced
Looking at the “Before” Templates Listing:
- Cards felt visually heavier.
- Spacing was inconsistent.
- Filters and tabs didn’t feel clearly grouped.
- Hover interactions were limited.
- The interface required more visual scanning effort.
Nothing was “broken.” But the experience wasn’t effortless.
Over time, small inconsistencies add up:
- Slight variations in margins.
- Different font weights used in similar contexts.
- Inconsistent hover feedback.
- Visual noise competing for attention.
This increases cognitive load — the mental effort required to understand and navigate a page.
What Developers Experienced
Behind the scenes, the legacy UI had:
- Large global CSS files.
- Specificity conflicts (“CSS wars”).
- Overlapping selectors.
- Repeated component styling.
- Slow rebuild times.
- Hard-to-track visual bugs.
Changing a card layout could require updating multiple stylesheets. Adding a new filter meant ensuring it matched existing patterns manually.
Onboarding new developers required explaining where styles lived, why certain overrides existed, and which files not to touch.
We reached a point where UI improvements were becoming slower than feature development.
That was a signal.
Why TailwindCSS + Modern Angular?
We evaluated options carefully. We did not rewrite in React or another framework because:
- Our Angular ecosystem was mature.
- Business logic and services were stable.
- Rewriting would introduce unnecessary risk.
- The team was already proficient in Angular.
So we kept Angular — but modernized how we build the UI layer.
Why TailwindCSS?
TailwindCSS is a utility-first CSS framework. Instead of writing custom CSS classes for every component, you compose styles directly in markup using small, predictable utility classes.
Example (simplified):
Instead of:
.card {
background: white;
padding: 16px;
border-radius: 12px;
}
You use:
This approach offers major advantages:
1. Predictability
No more guessing which global style might override another. Utilities are explicit and composable.
2. Smaller CSS Bundles
Tailwind removes unused styles during build (via purge/JIT).
Only the classes we actually use are shipped.
This reduced our CSS payload significantly.
3. Consistent Spacing and Typography
We mapped our design tokens (colors, spacing, typography) into Tailwind’s configuration. Now:
- Spacing is standardized.
- Colors come from a shared config.
- Font scales are unified.
No more “14px here, 15px there.”
4. Faster Iteration
Developers can modify layout directly in the Angular template without context-switching into CSS files.
This reduced UI development time.
Migration Strategy
We did not do a big-bang rewrite.
Instead, we followed an incremental migration strategy.
Phase 1 – Audit
We cataloged:
- Components
- Shared styles
- Global CSS dependencies
- Frequently reused UI patterns (cards, buttons, tabs, filters)
Phase 2 – Design Token Alignment
We defined:
- Color palette
- Spacing scale
- Typography system
- Border radius rules
- Elevation and shadows
These were mapped into tailwind.config.js.
Phase 3 – Tooling Setup
We integrated Tailwind into Angular:
- PostCSS
- Autoprefixer
- JIT mode
- Production purge
- CI build verification
We ensured no disruption to business logic.
Phase 4 – Component Migration
We migrated in layers:
- Atoms (buttons, badges, labels)
- Molecules (filters, card footers, tabs)
- Templates/pages (Templates Listing, Proposals Listing, etc.)
The Templates Listing page became a key milestone.
Before vs After: Templates Listing
Visual Hierarchy
In the updated UI:
- Cards have clearer vertical rhythm.
- Padding is consistent.
- Tags (“Proposal”, “Marketing”, “Accounting”) use unified badge styling.
- Dates align cleanly.
- Hover states provide contextual actions.
In the hover screenshot, notice:
- Smooth elevation.
- Action icons appear clearly.
- Contextual menu is visually lightweight.
- Micro-interactions feel intentional.
This is not just styling — it’s interaction design.
Interaction Improvements
Hover Feedback
Previously:
- Limited visual feedback.
- Contextual actions felt secondary.
Now:
- Subtle shadow transitions.
- Icon grouping is intentional.
- Hover state clearly communicates “This card is interactive.”
Micro-Animations
We introduced:
- Transition durations aligned across components.
- Consistent easing.
- Smooth dropdown animations.
Animations are subtle — but they guide attention.
Event Handling
We optimized:
- Change detection strategies.
- Lazy loading of template lists.
- Reduced unnecessary DOM reflows.
This improved perceived speed.
Performance Improvements
Key measurable changes:
- Reduced CSS bundle size.
- Faster First Contentful Paint.
- Smoother scrolling in large template lists.
- Reduced UI regression bugs.
Because Tailwind purges unused styles, the final CSS footprint is lean.
Combined with Angular optimizations:
- Improved build times.
- Cleaner component encapsulation.
- Better cache utilization.
What this means for users:
The app feels snappier. Pages render faster. Hover interactions respond instantly.
Challenges We Faced
1. Legacy CSS Conflicts
Old global styles conflicted with new utility classes.
Solution:
- Scoped imports.
- Gradual CSS removal.
- Visual regression testing.
2. Large Components
Some pages were tightly coupled with legacy CSS.
Solution:
- Break down into smaller components.
- Replace styling layer first.
- Leave business logic untouched.
3. Developer Mindset Shift
Moving to utility-first styling required discipline.
We created:
- Internal guidelines.
- Reusable component patterns.
- Shared Tailwind config documentation.
Developer Experience Improvements
After migration:
- New developers can style components immediately.
- No hunting for CSS files.
- Reduced context switching.
- Faster prototyping.
- Fewer style regressions.
The card hover implementation you see in the screenshot is built with a handful of composable utilities — no fragile CSS overrides.
Maintenance is simpler. Updates are safer.
What We Didn’t Change
- Backend APIs
- Proposal engine
- Data models
- Business logic
This was a view-layer modernization.
We also intentionally left a few low-traffic legacy pages for later phases to minimize rollout risk.
Impact Summary
User Experience
- Reduced cognitive load
- Clearer navigation
- Better visual hierarchy
- More intuitive interactions
Performance
- Smaller CSS bundle
- Faster rendering
- Smoother scrolling
Developer Velocity
- Faster UI iteration
- Cleaner architecture
- Easier onboarding
- Reduced UI bug count
Conclusion
Modernizing our UI wasn’t about chasing trends. It was about building a sustainable frontend architecture that supports long-term product growth.
By combining modern Angular practices with TailwindCSS:
- We improved performance.
- We standardized design.
- We reduced complexity.
- We accelerated development.
The Templates Listing page is just one visible example. Underneath it lies a cleaner, modular, scalable UI foundation.
And we’re just getting started.
Next steps include:
- Expanding our internal design system
- Publishing reusable component documentation
- Continuing performance optimization
- Refining accessibility standards
Next set of posts will cover how we are going about redesigning pages, functions like
- High level navigation and proposal dashboard
- eSignature Flow
- Proposals Listing
- Integrations
- Settings
- Email Signature
- Bulk Send
- HubSpot Embed Flow
If you’re a SaaS team considering a similar migration, the key lesson is this:
Modernizing the UI layer pays dividends not just visually, but structurally.










0 Comments
Trackbacks/Pingbacks