Skip to content

Commit 1029775

Browse files
thecrypticacemrinx
andauthoredJul 4, 2022
Add support for alpha values in safelist (#8774)
Co-authored-by: Petr Novak <petr.nmn.novak@gmail.com>
1 parent f135bfa commit 1029775

File tree

3 files changed

+121
-5
lines changed

3 files changed

+121
-5
lines changed
 

‎src/lib/setupContextUtils.js

+11
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,17 @@ function registerPlugins(plugins, context) {
762762
]
763763
}
764764

765+
if ([].concat(options?.type).includes('color')) {
766+
classes = [
767+
...classes,
768+
...classes.flatMap((cls) =>
769+
Object.keys(context.tailwindConfig.theme.opacity).map(
770+
(opacity) => `${cls}/${opacity}`
771+
)
772+
),
773+
]
774+
}
775+
765776
return classes
766777
})()
767778
: [util]

‎tests/getClassList.test.js

+23
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,26 @@ it('should generate every possible class while handling negatives and prefixes',
5959

6060
expect(classes).not.toContain('-tw-m-DEFAULT')
6161
})
62+
63+
it('should not generate utilities with opacity by default', () => {
64+
let config = {}
65+
let context = createContext(resolveConfig(config))
66+
let classes = context.getClassList()
67+
68+
expect(classes).not.toContain('bg-red-500/50')
69+
})
70+
71+
it('should not generate utilities with opacity even if safe-listed', () => {
72+
let config = {
73+
safelist: [
74+
{
75+
pattern: /^bg-red-(400|500)(\/(40|50))?$/,
76+
},
77+
],
78+
}
79+
80+
let context = createContext(resolveConfig(config))
81+
let classes = context.getClassList()
82+
83+
expect(classes).not.toContain('bg-red-500/50')
84+
})

‎tests/safelist.test.js

+87-5
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ it('should safelist based on a pattern regex', () => {
5151
content: [{ raw: html`<div class="uppercase"></div>` }],
5252
safelist: [
5353
{
54-
pattern: /bg-(red)-(100|200)/,
54+
pattern: /^bg-(red)-(100|200)$/,
5555
variants: ['hover'],
5656
},
5757
],
@@ -92,15 +92,15 @@ it('should not generate duplicates', () => {
9292
safelist: [
9393
'uppercase',
9494
{
95-
pattern: /bg-(red)-(100|200)/,
95+
pattern: /^bg-(red)-(100|200)$/,
9696
variants: ['hover'],
9797
},
9898
{
99-
pattern: /bg-(red)-(100|200)/,
99+
pattern: /^bg-(red)-(100|200)$/,
100100
variants: ['hover'],
101101
},
102102
{
103-
pattern: /bg-(red)-(100|200)/,
103+
pattern: /^bg-(red)-(100|200)$/,
104104
variants: ['hover'],
105105
},
106106
],
@@ -141,7 +141,7 @@ it('should safelist when using a custom prefix', () => {
141141
content: [{ raw: html`<div class="tw-uppercase"></div>` }],
142142
safelist: [
143143
{
144-
pattern: /tw-bg-red-(100|200)/g,
144+
pattern: /^tw-bg-red-(100|200)$/g,
145145
},
146146
],
147147
}
@@ -222,3 +222,85 @@ it('should safelist negatives based on a pattern regex', () => {
222222
`)
223223
})
224224
})
225+
226+
it('should safelist negatives based on a pattern regex', () => {
227+
let config = {
228+
content: [{ raw: html`<div class="uppercase"></div>` }],
229+
safelist: [
230+
{
231+
pattern: /^bg-red-(400|500)(\/(40|50))?$/,
232+
variants: ['hover'],
233+
},
234+
{
235+
pattern: /^(fill|ring|text)-red-200\/50$/,
236+
variants: ['hover'],
237+
},
238+
],
239+
}
240+
241+
return run('@tailwind utilities', config).then((result) => {
242+
return expect(result.css).toMatchCss(css`
243+
.bg-red-400 {
244+
--tw-bg-opacity: 1;
245+
background-color: rgb(248 113 113 / var(--tw-bg-opacity));
246+
}
247+
.bg-red-500 {
248+
--tw-bg-opacity: 1;
249+
background-color: rgb(239 68 68 / var(--tw-bg-opacity));
250+
}
251+
.bg-red-400\/40 {
252+
background-color: rgb(248 113 113 / 0.4);
253+
}
254+
.bg-red-400\/50 {
255+
background-color: rgb(248 113 113 / 0.5);
256+
}
257+
.bg-red-500\/40 {
258+
background-color: rgb(239 68 68 / 0.4);
259+
}
260+
.bg-red-500\/50 {
261+
background-color: rgb(239 68 68 / 0.5);
262+
}
263+
.fill-red-200\/50 {
264+
fill: rgb(254 202 202 / 0.5);
265+
}
266+
.uppercase {
267+
text-transform: uppercase;
268+
}
269+
.text-red-200\/50 {
270+
color: rgb(254 202 202 / 0.5);
271+
}
272+
.ring-red-200\/50 {
273+
--tw-ring-color: rgb(254 202 202 / 0.5);
274+
}
275+
.hover\:bg-red-400:hover {
276+
--tw-bg-opacity: 1;
277+
background-color: rgb(248 113 113 / var(--tw-bg-opacity));
278+
}
279+
.hover\:bg-red-500:hover {
280+
--tw-bg-opacity: 1;
281+
background-color: rgb(239 68 68 / var(--tw-bg-opacity));
282+
}
283+
.hover\:bg-red-400\/40:hover {
284+
background-color: rgb(248 113 113 / 0.4);
285+
}
286+
.hover\:bg-red-400\/50:hover {
287+
background-color: rgb(248 113 113 / 0.5);
288+
}
289+
.hover\:bg-red-500\/40:hover {
290+
background-color: rgb(239 68 68 / 0.4);
291+
}
292+
.hover\:bg-red-500\/50:hover {
293+
background-color: rgb(239 68 68 / 0.5);
294+
}
295+
.hover\:fill-red-200\/50:hover {
296+
fill: rgb(254 202 202 / 0.5);
297+
}
298+
.hover\:text-red-200\/50:hover {
299+
color: rgb(254 202 202 / 0.5);
300+
}
301+
.hover\:ring-red-200\/50:hover {
302+
--tw-ring-color: rgb(254 202 202 / 0.5);
303+
}
304+
`)
305+
})
306+
})

0 commit comments

Comments
 (0)
Please sign in to comment.