Skip to content

Commit 39a79ae

Browse files
committed
feat: add css background pattern plugin
1 parent c54c24f commit 39a79ae

File tree

4 files changed

+278
-2
lines changed

4 files changed

+278
-2
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+
.DS_STORE

README.md

+59-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,59 @@
1-
# tailwind-patterns
2-
Background patterns for TailwindCSS
1+
<h2 align="center">TailwindCSS Background Patterns</h1>
2+
<p align="center">Inspired by [CSS Background Patterns by MagicPattern](https://www.magicpattern.design/tools/css-backgrounds)</p>
3+
4+
## Installation
5+
6+
Add the `tailwindcss-bg-patterns` plugin to your project:
7+
8+
```bash
9+
# Install using pnpm
10+
pnpm install --save-dev tailwindcss-bg-patterns
11+
12+
# Install using npm
13+
npm install --save-dev tailwindcss-bg-patterns
14+
15+
# Install using yarn
16+
yarn add -D tailwindcss-bg-patterns
17+
```
18+
19+
## Usage
20+
21+
```javascript
22+
// tailwind.config.js
23+
{
24+
theme: { // defaults to these values
25+
patterns: {
26+
opacities: {
27+
100: "1",
28+
80: ".80",
29+
60: ".60",
30+
40: ".40",
31+
20: ".20",
32+
10: ".10",
33+
5: ".05",
34+
},
35+
sizes: {
36+
1: "0.25rem",
37+
2: "0.5rem",
38+
4: "1rem",
39+
6: "1.5rem",
40+
8: "2rem",
41+
16: "4rem",
42+
20: "5rem",
43+
24: "6rem",
44+
32: "8rem",
45+
}
46+
}
47+
},
48+
plugins: [
49+
require('tailwindcss-bg-patterns'),
50+
],
51+
}
52+
```
53+
54+
## Example
55+
56+
Applying the isometric background pattern to a div:
57+
```html
58+
<div class="w-56 h-56 pattern-isometric pattern-indigo-600 pattern-bg-transparent pattern-opacity-60 pattern-size-8"></div>
59+
```

index.js

+195
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
const plugin = require("tailwindcss/plugin");
2+
3+
const patterns = [
4+
{
5+
name: "lines",
6+
styles: {
7+
opacity: "var(--pattern-opacity, 0.4)",
8+
backgroundColor: "var(--pattern-bg-color, transparent)",
9+
backgroundImage: `linear-gradient(0deg, var(--pattern-bg-color, transparent) 50%, var(--pattern-color) 50%)`,
10+
backgroundSize: `var(--pattern-size, 40px) var(--pattern-size, 40px)`,
11+
},
12+
},
13+
{
14+
name: "vertical-lines",
15+
styles: {
16+
opacity: "var(--pattern-opacity, 0.4)",
17+
backgroundColor: "var(--pattern-bg-color, transparent)",
18+
backgroundImage: `linear-gradient(to right, var(--pattern-color), var(--pattern-color) var(--pattern-size-half, 20px), var(--pattern-bg-color, transparent) var(--pattern-size-half, 20px), var(--pattern-bg-color, transparent))`,
19+
backgroundSize: `var(--pattern-size, 40px) var(--pattern-size, 40px)`,
20+
},
21+
},
22+
{
23+
name: "dots",
24+
styles: {
25+
opacity: "var(--pattern-opacity, 0.4)",
26+
backgroundColor: "var(--pattern-bg-color, transparent)",
27+
backgroundImage: `radial-gradient(var(--pattern-color) calc(var(--pattern-size, 40px) * 0.1), var(--pattern-bg-color) calc(var(--pattern-size, 40px) * 0.1))`,
28+
backgroundSize: "var(--pattern-size, 40px) var(--pattern-size, 40px)",
29+
},
30+
},
31+
{
32+
name: "rhombus",
33+
styles: {
34+
opacity: "var(--pattern-opacity, 0.4)",
35+
backgroundColor: "var(--pattern-bg-color, transparent)",
36+
backgroundImage: `linear-gradient(135deg, var(--pattern-color) 25%, transparent 25%), linear-gradient(225deg, var(--pattern-color) 25%, transparent 25%), linear-gradient(45deg, var(--pattern-color) 25%, transparent 25%), linear-gradient(315deg, var(--pattern-color) 25%, var(--pattern-bg-color) 25%)`,
37+
backgroundPosition:
38+
"var(--pattern-size, 40px) 0, var(--pattern-size, 40px) 0, 0 0, 0 0",
39+
backgroundSize: "var(--pattern-size, 40px) var(--pattern-size, 40px)",
40+
backgroundRepeat: "repeat",
41+
},
42+
},
43+
{
44+
name: "cross",
45+
styles: {
46+
opacity: "var(--pattern-opacity, 0.4)",
47+
backgroundColor: "var(--pattern-bg-color, transparent)",
48+
background: `radial-gradient(circle, transparent 20%, var(--pattern-bg-color) 20%, var(--pattern-bg-color) 80%, transparent 80%, transparent), radial-gradient(circle, transparent 20%, var(--pattern-bg-color) 20%, var(--pattern-bg-color) 80%, transparent 80%, transparent) var(--pattern-size-half, 20px) var(--pattern-size-half, 20px), linear-gradient(var(--pattern-color) calc(var(--pattern-size, 40px) * 0.04), transparent calc(var(--pattern-size, 40px) * 0.04)) 0 calc(var(--pattern-size, 40px) * -0.02), linear-gradient(90deg, var(--pattern-color) calc(var(--pattern-size, 40px) * 0.04), var(--pattern-bg-color) calc(var(--pattern-size, 100px) * 0.04)) calc(var(--pattern-size, 40px) * -0.02) 0`,
49+
backgroundSize: `var(--pattern-size, 40px) var(--pattern-size, 20px), var(--pattern-size, 40px) var(--pattern-size, 20px), var(--pattern-size-half, 20px) var(--pattern-size-half, 20px), var(--pattern-size-half, 20px) var(--pattern-size-half, 20px)`,
50+
},
51+
},
52+
{
53+
name: "wavy",
54+
styles: {
55+
opacity: "var(--pattern-opacity, 0.4)",
56+
backgroundColor: "var(--pattern-bg-color, transparent)",
57+
backgroundImage:
58+
"repeating-radial-gradient( circle at 0 0, transparent 0, var(--pattern-bg-color, transparent) var(--pattern-size, 40px) ), repeating-linear-gradient( var(--pattern-color-55), var(--pattern-color) )",
59+
},
60+
},
61+
{
62+
name: "zigzag",
63+
styles: {
64+
opacity: "var(--pattern-opacity, 0.4)",
65+
backgroundColor: "var(--pattern-bg-color, transparent)",
66+
backgroundImage:
67+
"linear-gradient(135deg, var(--pattern-color) 25%, transparent 25%), linear-gradient(225deg, var(--pattern-color) 25%, transparent 25%), linear-gradient(45deg, var(--pattern-color) 25%, transparent 25%), linear-gradient(315deg, var(--pattern-color) 25%, var(--pattern-bg-color, transparent) 25%)",
68+
backgroundPosition:
69+
"var(--pattern-size-half, 20px) 0, var(--pattern-size-half, 20px) 0, 0 0, 0 0",
70+
backgroundSize: "var(--pattern-size, 40px) var(--pattern-size, 40px)",
71+
backgroundRepeat: "repeat",
72+
},
73+
},
74+
{
75+
name: "zigzag-3d",
76+
styles: {
77+
opacity: "var(--pattern-opacity, 0.4)",
78+
backgroundColor: "var(--pattern-bg-color, transparent)",
79+
background:
80+
"linear-gradient(135deg, var(--pattern-color-55) 25%, transparent 25%) calc(var(--pattern-size, 40px) * -0.5) 0/ var(--pattern-size, 40px) var(--pattern-size, 40px), linear-gradient(225deg, var(--pattern-color) 25%, transparent 25%) calc(var(--pattern-size, 40px) * -0.5) 0/ var(--pattern-size, 40px) var(--pattern-size, 40px), linear-gradient(315deg, var(--pattern-color-55) 25%, transparent 25%) 0px 0/ var(--pattern-size, 40px) var(--pattern-size, 40px), linear-gradient(45deg, var(--pattern-color) 25%, var(--pattern-bg-color) 25%) 0px 0/ var(--pattern-size, 40px) var(--pattern-size, 40px)",
81+
},
82+
},
83+
{
84+
name: "isometric",
85+
styles: {
86+
opacity: "var(--pattern-opacity, 0.4)",
87+
backgroundColor: "var(--pattern-bg-color, transparent)",
88+
backgroundImage:
89+
"linear-gradient(30deg, var(--pattern-color) 12%, transparent 12.5%, transparent 87%, var(--pattern-color) 87.5%, var(--pattern-color)), linear-gradient(150deg, var(--pattern-color) 12%, transparent 12.5%, transparent 87%, var(--pattern-color) 87.5%, var(--pattern-color)), linear-gradient(30deg, var(--pattern-color) 12%, transparent 12.5%, transparent 87%, var(--pattern-color) 87.5%, var(--pattern-color)), linear-gradient(150deg, var(--pattern-color) 12%, transparent 12.5%, transparent 87%, var(--pattern-color) 87.5%, var(--pattern-color)), linear-gradient(60deg, var(--pattern-color-77) 25%, transparent 25.5%, transparent 75%, var(--pattern-color-77) 75%, var(--pattern-color-77)), linear-gradient(60deg, var(--pattern-color-77) 25%, transparent 25.5%, transparent 75%, var(--pattern-color-77) 75%, var(--pattern-color-77))",
90+
backgroundSize:
91+
"var(--pattern-size, 40px) calc(var(--pattern-size, 40px) * 1.75)",
92+
backgroundPosition:
93+
"0 0, 0 0, var(--pattern-size-half, 20px) calc(var(--pattern-size, 40px) * 0.875), var(--pattern-size-half, 20px) calc(var(--pattern-size, 40px) * 0.875), 0 0, var(--pattern-size-half, 20px) calc(var(--pattern-size, 40px) * 0.875)",
94+
},
95+
},
96+
{
97+
name: "boxes",
98+
styles: {
99+
opacity: "var(--pattern-opacity, 0.4)",
100+
backgroundColor: "var(--pattern-bg-color, transparent)",
101+
backgroundImage:
102+
"linear-gradient(var(--pattern-color) calc(var(--pattern-size, 40px) * 0.1), transparent calc(var(--pattern-size, 40px) * 0.1)), linear-gradient(to right, var(--pattern-color) calc(var(--pattern-size, 40px) * 0.1), var(--pattern-bg-color, transparent) calc(var(--pattern-size, 40px) * 0.1))",
103+
backgroundSize: "var(--pattern-size, 40px) var(--pattern-size, 40px)",
104+
},
105+
},
106+
{
107+
name: "rectangles",
108+
styles: {
109+
opacity: "var(--pattern-opacity, 0.4)",
110+
backgroundColor: "var(--pattern-bg-color, transparent)",
111+
backgroundImage:
112+
"repeating-linear-gradient(45deg, var(--pattern-color) 25%, transparent 25%, transparent 75%, var(--pattern-color) 75%, var(--pattern-color)), repeating-linear-gradient(45deg, var(--pattern-color) 25%, var(--pattern-bg-color, transparent) 25%, var(--pattern-bg-color, transparent) 75%, var(--pattern-color) 75%, var(--pattern-color))",
113+
backgroundPosition:
114+
"0 0, var(--pattern-size-half, 20px) var(--pattern-size-half, 20px)",
115+
backgroundSize: "var(--pattern-size, 40px) var(--pattern-size, 40px)",
116+
},
117+
},
118+
];
119+
120+
const defaultOpacities = {
121+
100: "1",
122+
80: ".80",
123+
60: ".60",
124+
40: ".40",
125+
20: ".20",
126+
10: ".10",
127+
5: ".05",
128+
};
129+
130+
const defaultSizes = {
131+
1: "0.25rem",
132+
2: "0.5rem",
133+
4: "1rem",
134+
6: "1.5rem",
135+
8: "2rem",
136+
16: "4rem",
137+
20: "5rem",
138+
24: "6rem",
139+
32: "8rem",
140+
};
141+
142+
module.exports = plugin(function ({ addComponents, addUtilities, theme }) {
143+
const colors = theme("colors", {});
144+
const allColors = Object.keys(colors).map((key) => ({
145+
name: key,
146+
values: colors[key],
147+
}));
148+
const opacities = theme("patterns.opacity", defaultOpacities);
149+
const sizes = theme("patterns.size", defaultSizes);
150+
151+
let utilities = {};
152+
let components = {};
153+
154+
allColors.forEach(({ name, values }) => {
155+
if (typeof values === "object") {
156+
Object.keys(values).forEach((value) => {
157+
utilities[`.pattern-${name}-${value}`] = {
158+
"--pattern-color": values[value],
159+
"--pattern-color-55": values[value] + "55",
160+
"--pattern-color-77": values[value] + "77",
161+
};
162+
utilities[`.pattern-bg-${name}-${value}`] = {
163+
"--pattern-bg-color": values[value],
164+
};
165+
});
166+
} else {
167+
utilities[`.pattern-${name}`] = {
168+
"--pattern-color": values,
169+
};
170+
utilities[`.pattern-bg-${name}`] = {
171+
"--pattern-bg-color": values,
172+
};
173+
}
174+
});
175+
176+
Object.keys(opacities).forEach((opacity) => {
177+
utilities[`.pattern-opacity-${opacity}`] = {
178+
"--pattern-opacity": opacities[opacity],
179+
};
180+
});
181+
182+
Object.keys(sizes).forEach((size) => {
183+
utilities[`.pattern-size-${size}`] = {
184+
"--pattern-size": sizes[size],
185+
"--pattern-size-half": `calc(${sizes[size]} / 2)`,
186+
};
187+
});
188+
189+
patterns.forEach(({ name: patternName, styles }) => {
190+
components[`.pattern-${patternName}`] = styles;
191+
});
192+
193+
addUtilities(utilities);
194+
addComponents(components);
195+
});

package.json

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"name": "tailwindcss-bg-patterns",
3+
"version": "0.1.0",
4+
"keywords": [
5+
"plugin",
6+
"tailwind",
7+
"tailwind css",
8+
"tailwindcss",
9+
"tailwindcss-plugin",
10+
"css background patterns",
11+
"background patterns"
12+
],
13+
"repository": "[email protected]:thillmann/tailwind-patterns.git",
14+
"license": "MIT",
15+
"author": "Timo Hillmann <[email protected]>",
16+
"main": "index.js",
17+
"scripts": {},
18+
"dependencies": {
19+
"tailwindcss": "2.0.3"
20+
},
21+
"devDependencies": {}
22+
}

0 commit comments

Comments
 (0)