diff --git a/README.md b/README.md index 3f657f71..6f358d69 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,46 @@ # next-yak -yet another CSS-in-JS library +![Yak At Work as Frontend Dev](https://github.com/jantimon/next-yak/assets/4113649/2dcaf443-7205-4ef3-ba44-fbbe3ef2807d) -a CSS-in-JS with the power of "dynamic at the speed and reliability of static" 🙃 +[![npm version](https://badge.fury.io/js/next-yak.svg)](https://www.npmjs.com/package/next-yak) +[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/jantimon/next-yak/blob/main/LICENSE) -the initial version of next-yak will only work for next.js +**next-yak** is a CSS-in-JS solution tailored for [Next.js](https://nextjs.org/) that seamlessly combines the expressive power of styled-components syntax with efficient build-time extraction of CSS using Next.js's built-in CSS configuration. -![Yak At Work as Frontend Dev](https://github.com/jantimon/next-yak/assets/4113649/2dcaf443-7205-4ef3-ba44-fbbe3ef2807d) +## Features +- **Build-time Extraction**: Minimize runtime overhead by extracting CSS at build time, leveraging Next.js CSS configuration. + +- **Minimal Runtime Footprint**: Enjoy a small runtime footprint as only CSS class names need to be applied during runtime, with no additional CSS added to the CSSOM. -## Example +- **Optimized for Production**: Benefit from optimized, minified, and vendor-prefixed CSS generated during build time, resulting in a highly performant solution. -Try it on [stackblitz](https://stackblitz.com/edit/stackblitz-starters-dfykqy?file=app%2Fpage.tsx) +- **Atomic CSS Integration**: Easily combine with existing atomic CSS solutions like Tailwind CSS for a customized and efficient styling approach. -```tsx -import { styled, css } from "next-yak"; +- **Inspired by the Best**: Incorporates ideas from Styled-Components, Linaria, Emotion, and Vanilla Extract to offer a powerful yet intuitive styling experience. -const Title = styled.h1<{ x: number; children: React.ReactNode }>` - display: block; - ${({ $x }) => $x % 2 === 0 && css`color: red`} - position: relative; - top: ${({ $x }) => `${$x * 100}px`}; -`; +## Installation -const App = () => ( - - Hello World - -); +```bash +npm install next-yak ``` -## Installation +or ```bash -npm install next-yak +yarn add next-yak ``` +## Getting Started + +Try it on [stackblitz](https://stackblitz.com/edit/stackblitz-starters-dfykqy?file=app%2Fpage.tsx) + +### Locally + +1. Install **next-yak** in your Next.js project. + +2. Add next-yak to your `nex.config.js`: + ```js // next.config.js const { withYak } = require("next-yak"); @@ -47,6 +52,105 @@ const nextConfig = { module.exports = withYak(nextConfig); ``` +3. Ready to go: + +```jsx +// pages/index.js +import { styled } from 'next-yak'; + +const StyledDiv = styled.div` + color: #333; + padding: 16px; + background-color: #f0f0f0; +`; + +function HomePage() { + return Hello, next-yak!; +} + +export default HomePage; +``` + +## More Examples + +### Dynamic Styles + +Dynamic Styles will only toggle the css class during runtime: + +```jsx +import { styled, css } from 'next-yak'; + +const ToggleButton = styled.button` + ${props => props.$active + ? css`background-color: green` + : css`background-color: lime` + }; + color: white; + padding: 10px 20px; +`; +``` + +### Dynamic Properties + +Dynamic Styles will use [custom properties (aka css variables)](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties) under the hood to extract the CSS at built time but modify properties at runtime: + +```jsx +import { styled } from 'next-yak'; + +const ProgressBar = styled.div` + width: ${props => `${props.$percent}%`}; + height: 20px; + background-color: #3498db; + transition: width 0.3s ease-in-out; +`; + +const ProgressBarContainer = styled.div` + border: 1px solid #ccc; +`; + +const ExampleComponent = () => { + const progress = 75; // You can dynamically set this value + + return ( + + + + ); +}; +``` + +### Targeting Components + +In next-yak, you can target other components directly using CSS selectors as long as they are **in the same file**: + +```jsx +import { styled, keyframes } from 'next-yak'; + +const flip = keyframes` + from { transform: rotateY(0deg); } + to { transform: rotateY(360deg); } +`; + +const Glow = styled.div` + /* Add your Glow component styles here */ +`; + +const Text = styled.span` + display: inline-block; + ${Glow}:hover & { + animation: 1.5s ${flip} ease-out; + } +`; + +const ExampleComponent = () => { + return ( + + This text will flip on hover. + + ); +}; +``` + ## Nesting `next-yak` supports nesting out of the box. @@ -127,7 +231,7 @@ const Button = styled.button` ## Todos: -This is a proof of concept. There are a lot of things that need to be done before this can be used in production: +next-yak is currently in the development phase, with several todos that must be completed before it is ready for production: - [ ] improve js parsing - right now it not reusing babel.. - [ ] better sourcemaps @@ -150,6 +254,22 @@ This is a proof of concept. There are a lot of things that need to be done befor -## Prior art +## Acknowledgments + +Special thanks to the contributors and the inspiring projects that influenced next-yak: + + - Styled-Components 💅: For pioneering the styled syntax and redefining styling in the React ecosystem. + - Linaria: For its innovative approach to zero-runtime CSS in JS and efficient styling solutions. + - Emotion: For pushing the boundaries of CSS-in-JS and providing a high-performance styling experience. + - Vanilla Extract: For its focus on type-safe, zero-runtime CSS and contributing to the evolution of styling techniques. + - Tailwind CSS 🌈: For its exceptional atomic CSS approach, enabling efficient and customizable styling solutions. + +## License + +**next-yak** is licensed under the [MIT License](link/to/LICENSE). + +--- + +Feel free to reach out with any questions, issues, or suggestions! -This POC is heavily inspried by [styled-components](https://styled-components.com/), [emotion](https://emotion.sh/docs/introduction) and [linaria](https://github.com/callstack/linaria). +[GitHub Repository](https://github.com/jantimon/next-yak)