Skip to content
This repository was archived by the owner on Dec 15, 2024. It is now read-only.

Commit 2998db9

Browse files
committed
Add conic gradients (fix #9)
1 parent 7069e2c commit 2998db9

File tree

4 files changed

+527
-45
lines changed

4 files changed

+527
-45
lines changed

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project mostly adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [2.3.0] - 2019-07-08
9+
10+
### Added
11+
- Added conic gradient utilities, both standard and repeating (see `README` for more info)
12+
813
## [2.2.0] - 2019-07-05
914

1015
### Added
@@ -74,7 +79,8 @@ and this project mostly adheres to [Semantic Versioning](https://semver.org/spec
7479

7580
Initial release
7681

77-
[Unreleased]: https://github.com/benface/tailwindcss-gradients/compare/v2.2.0...HEAD
82+
[Unreleased]: https://github.com/benface/tailwindcss-gradients/compare/v2.3.0...HEAD
83+
[2.3.0]: https://github.com/benface/tailwindcss-gradients/compare/v2.2.0...v2.3.0
7884
[2.2.0]: https://github.com/benface/tailwindcss-gradients/compare/v2.1.0...v2.2.0
7985
[2.1.0]: https://github.com/benface/tailwindcss-gradients/compare/v2.0.1...v2.1.0
8086
[2.0.1]: https://github.com/benface/tailwindcss-gradients/compare/v2.0.0...v2.0.1

README.md

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,28 @@ npm install tailwindcss-gradients
7979
'black-white-with-stops': ['#000', '#000 45%', '#fff 55%', '#fff'],
8080
},
8181
},
82+
conicGradients: {
83+
startingAngles: { // defaults to this value
84+
'default': '0',
85+
},
86+
positions: { // defaults to these values
87+
'default': 'center',
88+
't': 'top',
89+
'tr': 'top right',
90+
'r': 'right',
91+
'br': 'bottom right',
92+
'b': 'bottom',
93+
'bl': 'bottom left',
94+
'l': 'left',
95+
'tl': 'top left',
96+
},
97+
colors: { // defaults to {}
98+
'red': '#f00',
99+
'red-blue': ['#f00', '#00f'],
100+
'red-green-blue': ['#f00', '#0f0', '#00f'],
101+
'checkerboard': ['white 90deg', 'black 90deg 180deg', 'white 180deg 270deg', 'black 270deg'],
102+
},
103+
},
82104
repeatingLinearGradients: theme => ({
83105
directions: theme('linearGradients.directions'), // defaults to the same values as linearGradients’ directions
84106
colors: theme('linearGradients.colors'), // defaults to {}
@@ -89,9 +111,7 @@ npm install tailwindcss-gradients
89111
},
90112
}),
91113
repeatingRadialGradients: theme => ({
92-
shapes: { // defaults to this value
93-
'default': 'ellipse',
94-
},
114+
shapes: theme('radialGradients.shapes'), // defaults to the same value as radialGradients’ shapes
95115
sizes: { // defaults to this value
96116
'default': 'farthest-corner',
97117
},
@@ -103,13 +123,30 @@ npm install tailwindcss-gradients
103123
'lg': '100px',
104124
},
105125
}),
126+
repeatingConicGradients: {
127+
startingAngles: theme('conicGradients.startingAngles'), // defaults to the same value as conicGradients’ startingAngles
128+
positions: theme('conicGradients.positions'), // defaults to the same values as conicGradients’ positions
129+
colors: { // defaults to {}
130+
'red': '#f00',
131+
'red-blue': ['#f00', '#00f'],
132+
'red-green-blue': ['#f00', '#0f0', '#00f'],
133+
'starburst': ['white 0 5deg', 'blue 5deg'],
134+
},
135+
lengths: { // defaults to {}
136+
'sm': '10deg',
137+
'md': '20deg',
138+
'lg': '40deg',
139+
},
140+
},
106141
},
107142
variants: { // all the following default to ['responsive']
108143
backgroundImage: ['responsive'], // this is for the "bg-none" utility
109144
linearGradients: ['responsive'],
110145
radialGradients: ['responsive'],
146+
conicGradients: ['responsive'],
111147
repeatingLinearGradients: ['responsive'],
112148
repeatingRadialGradients: ['responsive'],
149+
repeatingConicGradients: ['responsive'],
113150
},
114151
plugins: [
115152
require('tailwindcss-gradients')(),
@@ -135,6 +172,12 @@ This plugin generates the following utilities:
135172
background-image: radial-gradient([shape-value] [size-value] at [position-value], [color-value-1], [color-value-2], [...]);
136173
}
137174

175+
/* configurable with the "conicGradients" theme object */
176+
/* note that the "default" [starting-angle-key] and [position-key] are omitted from the class */
177+
.bg-conic-[starting-angle-key]-[position-key]-[color-key] {
178+
background-image: conic-gradient(from [starting-angle-value] at [position-value], [color-value-1], [color-value-2], [...]);
179+
}
180+
138181
/* configurable with the "repeatingLinearGradients" theme object */
139182
.bg-gradient-[direction-key]-[color-key]-[length-key] {
140183
background-image: repeating-linear-gradient([direction-value], [color-value-1], [color-value-2], [...] [length-value]);
@@ -145,4 +188,10 @@ This plugin generates the following utilities:
145188
.bg-radial-[shape-key]-[size-key]-[position-key]-[color-key]-[length-key] {
146189
background-image: repeating-radial-gradient([shape-value] [size-value] at [position-value], [color-value-1], [color-value-2], [...] [length-value]);
147190
}
191+
192+
/* configurable with the "repeatingConicGradients" theme object */
193+
/* note that the "default" [starting-angle-key] and [position-key] are omitted from the class */
194+
.bg-conic-[starting-angle-key]-[position-key]-[color-key]-[length-key] {
195+
background-image: repeating-conic-gradient(from [starting-angle-value] at [position-value], [color-value-1], [color-value-2], [...] [length-value]);
196+
}
148197
```

index.js

Lines changed: 94 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,39 @@ module.exports = function() {
5555
};
5656
const defaultRadialGradientColors = {};
5757
const defaultRadialGradientVariants = ['responsive'];
58+
const defaultConicGradientStartingAngles = {
59+
'default': '0',
60+
};
61+
const defaultConicGradientPositions = {
62+
'default': 'center',
63+
't': 'top',
64+
'tr': 'top right',
65+
'r': 'right',
66+
'br': 'bottom right',
67+
'b': 'bottom',
68+
'bl': 'bottom left',
69+
'l': 'left',
70+
'tl': 'top left',
71+
};
72+
const defaultConicGradientColors = {};
73+
const defaultConicGradientVariants = ['responsive'];
5874
const defaultRepeatingLinearGradientDirections = defaultLinearGradientDirections;
59-
const defaultRepeatingLinearGradientColors = defaultLinearGradientColors;
75+
const defaultRepeatingLinearGradientColors = {};
6076
const defaultRepeatingLinearGradientLengths = {};
6177
const defaultRepeatingLinearGradientVariants = ['responsive'];
6278
const defaultRepeatingRadialGradientShapes = defaultRadialGradientShapes;
6379
const defaultRepeatingRadialGradientSizes = {
6480
'default': 'farthest-corner',
6581
};
6682
const defaultRepeatingRadialGradientPositions = defaultRadialGradientPositions;
67-
const defaultRepeatingRadialGradientColors = defaultRadialGradientColors;
83+
const defaultRepeatingRadialGradientColors = {};
6884
const defaultRepeatingRadialGradientLengths = {};
6985
const defaultRepeatingRadialGradientVariants = ['responsive'];
86+
const defaultRepeatingConicGradientStartingAngles = defaultConicGradientStartingAngles;
87+
const defaultRepeatingConicGradientPositions = defaultConicGradientPositions;
88+
const defaultRepeatingConicGradientColors = {};
89+
const defaultRepeatingConicGradientLengths = {};
90+
const defaultRepeatingConicGradientVariants = ['responsive'];
7091

7192
const backgroundImageVariants = variants('backgroundImage', defaultBackgroundImageVariants);
7293
const linearGradientDirections = theme('linearGradients.directions', defaultLinearGradientDirections);
@@ -77,6 +98,10 @@ module.exports = function() {
7798
const radialGradientPositions = theme('radialGradients.positions', defaultRadialGradientPositions);
7899
const radialGradientColors = theme('radialGradients.colors', defaultRadialGradientColors);
79100
const radialGradientVariants = variants('radialGradients', defaultRadialGradientVariants);
101+
const conicGradientStartingAngles = theme('conicGradients.startingAngles', defaultConicGradientStartingAngles);
102+
const conicGradientPositions = theme('conicGradients.positions', defaultConicGradientPositions);
103+
const conicGradientColors = theme('conicGradients.colors', defaultConicGradientColors);
104+
const conicGradientVariants = variants('conicGradients', defaultConicGradientVariants);
80105
const repeatingLinearGradientDirections = theme('repeatingLinearGradients.directions', defaultRepeatingLinearGradientDirections);
81106
const repeatingLinearGradientColors = theme('repeatingLinearGradients.colors', defaultRepeatingLinearGradientColors);
82107
const repeatingLinearGradientLengths = theme('repeatingLinearGradients.lengths', defaultRepeatingLinearGradientLengths);
@@ -87,6 +112,11 @@ module.exports = function() {
87112
const repeatingRadialGradientColors = theme('repeatingRadialGradients.colors', defaultRepeatingRadialGradientColors);
88113
const repeatingRadialGradientLengths = theme('repeatingRadialGradients.lengths', defaultRepeatingRadialGradientLengths);
89114
const repeatingRadialGradientVariants = variants('repeatingRadialGradients', defaultRepeatingRadialGradientVariants);
115+
const repeatingConicGradientStartingAngles = theme('repeatingConicGradients.startingAngles', defaultRepeatingConicGradientStartingAngles);
116+
const repeatingConicGradientPositions = theme('repeatingConicGradients.positions', defaultRepeatingConicGradientPositions);
117+
const repeatingConicGradientColors = theme('repeatingConicGradients.colors', defaultRepeatingConicGradientColors);
118+
const repeatingConicGradientLengths = theme('repeatingConicGradients.lengths', defaultRepeatingConicGradientLengths);
119+
const repeatingConicGradientVariants = variants('repeatingConicGradients', defaultRepeatingConicGradientVariants);
90120

91121
const linearGradientSelector = function(directionKey, colorKey, lengthKey) {
92122
return `.${e(`bg-gradient-${directionKey}-${colorKey}${lengthKey ? `-${lengthKey}` : ''}`)}`;
@@ -105,7 +135,7 @@ module.exports = function() {
105135
const cssDefaultRadialGradientShape = 'ellipse';
106136
const cssDefaultRadialGradientSize = 'farthest-corner';
107137
const cssDefaultRadialGradientPositions = ['center', 'center center', '50%', '50% 50%', 'center 50%', '50% center'];
108-
let firstArgumentValues = [];
138+
const firstArgumentValues = [];
109139
if (shape !== cssDefaultRadialGradientShape) {
110140
firstArgumentValues.push(shape);
111141
}
@@ -118,14 +148,31 @@ module.exports = function() {
118148
return `${!_.isNil(length) ? 'repeating-' : ''}radial-gradient(${firstArgumentValues.length > 0 ? `${firstArgumentValues.join(' ')}, ` : ''}${colors.join(', ')}${length ? ` ${length}` : ''})`;
119149
};
120150

151+
const conicGradientSelector = function(startingAngleKey, positionKey, colorKey, lengthKey) {
152+
return `.${e(`bg-conic${startingAngleKey === 'default' ? '' : `-${startingAngleKey}`}${positionKey === 'default' ? '' : `-${positionKey}`}-${colorKey}${lengthKey ? `-${lengthKey}` : ''}`)}`;
153+
};
154+
155+
const conicGradientValue = function(startingAngle, position, colors, length) {
156+
const cssDefaultConicGradientStartingAngles = ['0', '0deg', '0%', '0turn', '0grad', '0rad'];
157+
const cssDefaultConicGradientPositions = ['center', 'center center', '50%', '50% 50%', 'center 50%', '50% center'];
158+
const firstArgumentValues = [];
159+
if (!_.includes(cssDefaultConicGradientStartingAngles, startingAngle)) {
160+
firstArgumentValues.push(`from ${startingAngle}`);
161+
}
162+
if (!_.includes(cssDefaultConicGradientPositions, position)) {
163+
firstArgumentValues.push(`at ${position}`);
164+
}
165+
return `${!_.isNil(length) ? 'repeating-' : ''}conic-gradient(${firstArgumentValues.length > 0 ? `${firstArgumentValues.join(' ')}, ` : ''}${colors.join(', ')}${length ? ` ${length}` : ''})`;
166+
};
167+
121168
const backgroundImageUtilities = {
122169
'.bg-none': {
123170
backgroundImage: 'none',
124171
},
125172
};
126173

127174
const linearGradientUtilities = (function() {
128-
let utilities = {};
175+
const utilities = {};
129176
_.forEach(linearGradientColors, (colors, colorKey) => {
130177
colors = normalizeColors(colors, true);
131178
if (!colors) {
@@ -141,7 +188,7 @@ module.exports = function() {
141188
})();
142189

143190
const radialGradientUtilities = (function() {
144-
let utilities = {};
191+
const utilities = {};
145192
_.forEach(radialGradientColors, (colors, colorKey) => {
146193
colors = normalizeColors(colors, false);
147194
if (!colors) {
@@ -160,8 +207,26 @@ module.exports = function() {
160207
return utilities;
161208
})();
162209

210+
const conicGradientUtilities = (function() {
211+
const utilities = {};
212+
_.forEach(conicGradientColors, (colors, colorKey) => {
213+
colors = normalizeColors(colors, false);
214+
if (!colors) {
215+
return; // continue
216+
}
217+
_.forEach(conicGradientPositions, (position, positionKey) => {
218+
_.forEach(conicGradientStartingAngles, (startingAngle, startingAngleKey) => {
219+
utilities[conicGradientSelector(startingAngleKey, positionKey, colorKey)] = {
220+
backgroundImage: conicGradientValue(startingAngle, position, colors),
221+
};
222+
});
223+
});
224+
});
225+
return utilities;
226+
})();
227+
163228
const repeatingLinearGradientUtilities = (function() {
164-
let utilities = {};
229+
const utilities = {};
165230
_.forEach(repeatingLinearGradientLengths, (length, lengthKey) => {
166231
_.forEach(repeatingLinearGradientColors, (colors, colorKey) => {
167232
colors = normalizeColors(colors, true);
@@ -179,7 +244,7 @@ module.exports = function() {
179244
})();
180245

181246
const repeatingRadialGradientUtilities = (function() {
182-
let utilities = {};
247+
const utilities = {};
183248
_.forEach(repeatingRadialGradientLengths, (length, lengthKey) => {
184249
_.forEach(repeatingRadialGradientColors, (colors, colorKey) => {
185250
colors = normalizeColors(colors, false);
@@ -200,10 +265,32 @@ module.exports = function() {
200265
return utilities;
201266
})();
202267

268+
const repeatingConicGradientUtilities = (function() {
269+
const utilities = {};
270+
_.forEach(repeatingConicGradientLengths, (length, lengthKey) => {
271+
_.forEach(repeatingConicGradientColors, (colors, colorKey) => {
272+
colors = normalizeColors(colors, false);
273+
if (!colors) {
274+
return; // continue
275+
}
276+
_.forEach(repeatingConicGradientPositions, (position, positionKey) => {
277+
_.forEach(repeatingConicGradientStartingAngles, (startingAngle, startingAngleKey) => {
278+
utilities[conicGradientSelector(startingAngleKey, positionKey, colorKey, lengthKey)] = {
279+
backgroundImage: conicGradientValue(startingAngle, position, colors, length),
280+
};
281+
});
282+
});
283+
});
284+
});
285+
return utilities;
286+
})();
287+
203288
addUtilities(backgroundImageUtilities, backgroundImageVariants);
204289
addUtilities(linearGradientUtilities, linearGradientVariants);
205290
addUtilities(radialGradientUtilities, radialGradientVariants);
291+
addUtilities(conicGradientUtilities, conicGradientVariants);
206292
addUtilities(repeatingLinearGradientUtilities, repeatingLinearGradientVariants);
207293
addUtilities(repeatingRadialGradientUtilities, repeatingRadialGradientVariants);
294+
addUtilities(repeatingConicGradientUtilities, repeatingConicGradientVariants);
208295
};
209296
};

0 commit comments

Comments
 (0)