Why We Built Our Own CSS Framework
Basket CSS started as a frustration with bloated utility frameworks and grew into the foundation every Curve Media project is built on. Here's the philosophy behind it and why lightweight still matters.
Every studio that reaches a certain volume eventually faces the same CSS question: do you standardize on a utility framework and accept its constraints, reach for a component library and accept its aesthetic, or roll your own system and accept the maintenance burden? We chose the third path, and the resulting framework - Basket CSS - has become the quiet foundation underneath everything we ship.
The core frustration with Tailwind, and we used it for years before this, is that it optimizes for development speed at the cost of readability and semantic meaning. A className string that is forty characters long describing layout, spacing, color, and responsive behavior all at once is not easier to maintain than a well-named CSS class. It is faster to type the first time and slower every time after. Basket takes the opposite bet: a small set of utility classes for the truly common patterns, and CSS Modules for everything that has product-specific intent. Your stylesheet tells you what something is, not just what it looks like.
Dark mode was a first-class design requirement from the start, not a feature we added later. Basket uses a single data-theme attribute on the <html> element and CSS custom properties that cascade correctly in both directions. There is no JavaScript theme-provider tree to debug, no flash of unstyled content from hydration timing. The browser handles theme application in its first paint. For a studio building primarily dark-default interfaces - a deliberate brand choice for Curve Media - this architecture meant we were never fighting the framework.
Basket is open source and available via npm install getbasket. It is not trying to compete with Tailwind on feature count or Bootstrap on component breadth. It is a specific set of opinions about how production sites should be structured, tested across real client projects over two years, and sized to not make your Core Web Vitals cry. The CSS bundle comes in under 12KB gzipped. That is the whole point - fast by default, opinionated where it matters, invisible when it is working correctly.