Dashboard UI Overhaul: From Emoji Chaos to SVG Zen šØ
What a marathon session! Just wrapped up a massive dashboard refactor that's been on my todo list for weeks. You know that feeling when your UI has grown organically and suddenly you realize you have 60+ emoji icons scattered everywhere? Yeah, that was me.
The Great Slug Migration
First up, I tackled something that's been bugging me forever ā inconsistent URL patterns across all our photo booth rental sites. We had these legacy -photo-booth-rental slugs everywhere that made URLs look like word soup.
Created 5 universal URL helpers that work across all 13 verticals:
bbs_service_urlbbs_job_urlbbs_venue_urlbbs_booth_urlbbs_event_url
Now everything follows a clean /booths/ and /services/ pattern. Had to fix routing across 39 hub pages and deal with 7 vertical-specific quirks (like barbershops using "at" vs "near" in URLs). The kind of tedious work that makes you question your life choices, but feels amazing when it's done.
Dashboard Gets a Proper UI System
The real fun was overhauling our dashboard UI. I've been running this thing on pure vanilla JS and inline styles like some kind of code cowboy. Time to grow up.
What I shipped:
- Built an SVG icon library with 30+ Heroicons (goodbye random emojis!)
- Added proper design tokens for colors, typography, and z-index hierarchy
- Migrated 125+ inline styles to actual CSS classes
- Added keyboard navigation to contact lists
- Created a proper two-panel contacts view
The best part? I can now edit contact details inline with a slick click-to-edit interface that feels like GoHighLevel. Much better than the janky modal I had before.
Client Portal DCC Editor
Also wired up the full DCC (Dynamic Content Creator) editor into our client portal. This was trickier than expected because of some race conditions with section toggles and polling re-renders. Nothing worse than your UI randomly closing sections while clients are trying to work.
Fixed it with some state preservation logic that maintains open sections across re-renders. The small details that users never notice but would definitely complain about if broken.
The Technical Bits
23 commits across 3 repos later, here's what's under the hood:
Design System:
- 7-level z-index hierarchy via CSS custom properties
- Proper color tokens (--fill-secondary, --text-quaternary, etc.)
- Component classes instead of style.cssText everywhere
Error Handling:
- GHL audit log with human-readable error messages
- 7-day TTL storage in Cloudflare KV
- Proper 401 token refresh handling
Architecture Decisions:
- SVG icons as global ICONS object (staying vanilla JS)
- CSS Grid with clamp() for responsive contact panels
- Universal URL helpers reading from verticals.json
The codebase feels so much cleaner now. No more hunting through inline styles or trying to decode what that š¢ emoji was supposed to represent.
What's Next
Time for the scary part ā testing everything visually to make sure I didn't break anything. You know how refactors go... fix 40 issues, introduce 3 new ones.
Then I'll tackle mobile responsiveness at 375px and 768px breakpoints, and maybe migrate to Plus Jakarta Sans if I'm feeling fancy.
Sometimes the unglamorous infrastructure work is the most satisfying. Having a proper design system feels like upgrading from a tent to a house. š (okay fine, one more emoji)