It’s 16:00, and your day has been hijacked by a series of requests for changes on the internal UI library.

10:12 - Subject: “Small adjustments”

The designer starts the day with a few precise requests: reduce the padding on the modal by 0.5px for “a more balanced visual feel,” and increase the button’s shadow blur by 3% to make it “feel lighter.” Small changes, you think, nothing major. You comply, hoping that’s the end of it.

11:57 - Subject: “Minor tweaks, before lunch”

A few more requests roll in. The designer insists on changing the hover transition from 400ms to 500ms for a “smoother, more elegant feel”—you doubt anyone will notice the extra 100ms, but you make the change. Then comes a request for another shade of grey (#999A99) in the design tokens, because the existing greys “don’t quite cut it” and the new one has a “warmer, friendlier tone.” Oh, and could you add a spinner for the loading state on the submit button? “Just try something.”

15:05 - Subject: “Some ideas”

The final round of feedback escalates. The designer now wants slightly bolder font weights on hover to give the headings “more presence when interacted with,” and then suggests adjusting the line spacing on the paragraph component by exactly 3 pixels for “better readability.” After adding a spinner for the loading state, they come back with, “Hmm. Do you have any other suggestions?” By this point, you’ve tried multiple options, but now they want something else entirely. And just when you thought it couldn’t get more granular, they request a subtle gradient on our section component that only appears when the user scrolls halfway down the page—a “small, delightful detail.”

By now, your entire afternoon has been spent on “small changes”, and you can’t help but think about how much progress you could have made on that next big feature.

Choosing Simplicity: Existing Solutions

Designing and building a product shouldn’t mean getting lost in endless pixel tweaks. The real focus should be creating something functional, consistent, and easy to maintain. The solution? Choose a component library and stick with it. Adopting one frees you from pixel-perfect adjustments, allowing designers to work within a consistent framework and engineers to focus on how the product functions, all while reducing the need for custom solutions and keeping efficiency high.To maintain a cohesive product, designers should ensure their vision aligns with the chosen component library. Custom elements may look impressive, but they often miss crucial aspects like accessibility and waste valuable resources. Design is not a solitary task; it should be a collaborative process where engineers define technical limitations, and designers work within those boundaries to build visually appealing, technically sound solutions.

How to Choose A UI Library?

When choosing a UI library, prioritise one that allows you to own the code and easily adapt styles. Libraries like shadcn/ui take this a step further by providing components that are directly copied into your codebase rather than hidden in node_modules. This approach not only gives you full control over the styling and functionality of each component but also enables straightforward customisations to meet specific design needs. Additionally, headless component libraries like Radix UI and React Aria provide the core functionality without dictating a particular style, offering a flexible, unopinionated foundation. This way, you can apply your design system or custom styling without sacrificing accessibility or functionality.

Owning the component code in your project means you’re not limited by pre-set design choices, allowing for both agility in styling and confidence that your components will scale as the product grows, all while keeping accessibility and adaptability at the forefront.

Macro-Level Design, Where Designers Shine.

Delightful details, like subtle animations or playful interactions, can certainly enhance a product and give it character—but they have their place and time. Focusing too much on delight can lead to wasted time on minor details, when the priority should be delivering value through features and functionality. 

Where designers truly excel is at the macro level—ensuring that the product’s overall flow and experience make sense. It’s not about obsessing over individual pixels or shades of grey; it’s about making sure the user journey is intuitive, that the product feels cohesive, and that the design is consistent across the board.

Are users able to navigate the product easily? Does the design help or hinder the overall experience? These are the questions that matter.

By operating at macro level, designers help create products that not only look good but also work beautifully and are inclusive. When designers can focus on these aspects, engineers can spend less time pushing pixels and more time delivering features that make a difference.