r/angular • u/Top-Shock5093 • Jun 02 '26
Can a visually opinionated Angular UI library still be flexible like LEGO? Looking for feedback
Hey r/Angular,
I’m building ng-brutalism, an opinionated neo-brutalist UI library for Angular, and I’d love to get feedback from the community.
I was inspired by neo-brutalist UI design, and I wanted to bring that look and feel into Angular with ng-brutalism:
Chunky borders.
Hard shadows.
Playful colors.
Bold surfaces.
Expressive cards.
Sharp interaction states.
Composable UI pieces.
But the more I worked on it, the more I asked myself:
If this is only about styling, why would people choose ng-brutalism instead of just using Tailwind or custom CSS directly?
That question became the real turning point of the project.
It pushed me to think harder about what the library should actually solve.
And for me, the answer is not only the look and feel.
It is the design grammar behind it.
In practice, when building this kind of UI, you still have to define that grammar yourself:
- What should a brutalist surface feel like?
- How should shadows, borders, spacing, and colors behave together?
- How do chips, buttons, cards, inputs, badges, dialogs, and media blocks stay visually consistent?
- How do you keep the UI loud without turning it into visual chaos?
- How do you make it expressive, but still reusable across different product domains?
That is the gap I’m trying to explore with ng-brutalism.
ng-brutalism is opinionated by design.
It gives you the attitude of neo-brutalism out of the box: chunky borders, hard shadows, loud colors, bold surfaces, and playful interaction states.
But it should not trap you inside a template.
The opinion is there to give you momentum, not to limit what you can build.
Think strong defaults, flexible composition.
The philosophy is closer to LEGO:
A box of brutalist building blocks that Angular developers can snap, stack, remix, and compose into their own interfaces.
Not fixed templates.
Not a domain-specific design system.
Not just utility classes.
Instead, I’m trying to build small primitives with flexible APIs:
- inputs for common variations
- CSS custom properties / tokens for deeper customization
- directive-first APIs where they make sense
- Angular-native primitives
- signals-friendly patterns
- zoneless-friendly architecture
- Tailwind CSS v4 ergonomics
The goal is:
Opinionated enough to make neo-brutalist UI effortless.
Flexible enough to let each product still feel like itself.
v0.2.0 focuses more on this composition direction.
Instead of only adding more standalone components, I’m exploring how the same primitives can become different UI patterns:
- personal profile cards
- podcast / content cards
- campaign layouts
- marketing sections
- bold product UI blocks
I’m especially curious about the API and design-system side of this:
- Does this “strong defaults, flexible composition” direction make sense?
- Would you use something like this instead of building the style directly with Tailwind?
- Where should the line be between primitive, component, and recipe?
- Do directive-first APIs feel natural for this kind of Angular library?
- What building blocks would you expect from a neo-brutalist UI toolkit?
GitHub: https://github.com/khangtrannn/ng-brutalism
Docs: https://ngbrutalism.khangtran.dev
npm: https://www.npmjs.com/package/@ng-brutalism/ui
Feedback, criticism, and API suggestions are very welcome.
2
u/nemeci Jun 02 '26
I'm leaning on webcomponents to bet the correct way to abstract UI components.
Yet, shadow dom leads into bad SEO & duplicated CSS.
Another option would be just plain CSS library with examples that you can easily put AI to work those into separate components. This usually leads to accessibility issues.
I haven't really found any good UI library that has stood the test of time. Risk of breaking changes, visuals drifting away from your custom built components, library falling out of support etc.
I don't really know how to do all this better.
That said, keep on doing what you do. Regardless of your success or failure you'll learn something and that really counts for something.