* sync package-lock.json * reduce generated examples By default we use the default config when creating the quick tests for a given plugin. However, this can result in _a lot_ of changes. For example, when you update the opacity values, then these values will be generated for each color, and for each plugin that uses that color. You can see that behaviour in Adam's PR (https://github.com/tailwindlabs/tailwindcss/pull/11832). He added 6 values to the opacity configuration. This resulted in a diff that looked like this: ``` +219,436 −9 ``` This reduces the amount of examples for plugins that generate _a lot_ of output otherwise. * use `toMatchSnapshot` This way all the `quickPluginTest` and `quickVariantPluginTest` implementations are the same. This also allows us to update tests after config changes in an easier way because they use snapshot tests right now. * use real colors for reduced red This will make it a tiny bit easier to debug what's going on if we need it in the future since it's using the same values as the real colors.
266 lines
5.5 KiB
JavaScript
266 lines
5.5 KiB
JavaScript
import { run, html, css, quickPluginTest } from '../util/run'
|
|
|
|
quickPluginTest('animation', {
|
|
safelist: [
|
|
// Arbitrary values
|
|
'animate-[1s_infinite_example]',
|
|
'animate-[var(--my-value)]',
|
|
],
|
|
}).toMatchSnapshot()
|
|
|
|
test('custom', () => {
|
|
let config = {
|
|
content: [{ raw: html`<div class="animate-one"></div>` }],
|
|
theme: {
|
|
extend: {
|
|
keyframes: {
|
|
one: { to: { transform: 'rotate(360deg)' } },
|
|
},
|
|
animation: {
|
|
one: 'one 2s',
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
return run('@tailwind utilities', config).then((result) => {
|
|
expect(result.css).toMatchFormattedCss(css`
|
|
@keyframes one {
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
.animate-one {
|
|
animation: 2s one;
|
|
}
|
|
`)
|
|
})
|
|
})
|
|
|
|
test('custom prefixed', () => {
|
|
let config = {
|
|
prefix: 'tw-',
|
|
content: [{ raw: `<div class="tw-animate-one"></div>` }],
|
|
theme: {
|
|
extend: {
|
|
keyframes: {
|
|
one: { to: { transform: 'rotate(360deg)' } },
|
|
},
|
|
animation: {
|
|
one: 'one 2s',
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
return run('@tailwind utilities', config).then((result) => {
|
|
expect(result.css).toMatchFormattedCss(css`
|
|
@keyframes tw-one {
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
.tw-animate-one {
|
|
animation: 2s tw-one;
|
|
}
|
|
`)
|
|
})
|
|
})
|
|
|
|
test('multiple', () => {
|
|
let config = {
|
|
content: [{ raw: html`<div class="animate-multiple"></div>` }],
|
|
theme: {
|
|
extend: {
|
|
animation: {
|
|
multiple: 'bounce 2s linear, pulse 3s ease-in',
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
return run('@tailwind utilities', config).then((result) => {
|
|
expect(result.css).toMatchFormattedCss(css`
|
|
@keyframes bounce {
|
|
0%,
|
|
100% {
|
|
animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
|
|
transform: translateY(-25%);
|
|
}
|
|
50% {
|
|
animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
|
|
transform: none;
|
|
}
|
|
}
|
|
@keyframes pulse {
|
|
50% {
|
|
opacity: 0.5;
|
|
}
|
|
}
|
|
.animate-multiple {
|
|
animation: 2s linear bounce, 3s ease-in pulse;
|
|
}
|
|
`)
|
|
})
|
|
})
|
|
|
|
test('multiple custom', () => {
|
|
let config = {
|
|
content: [{ raw: html`<div class="animate-multiple"></div>` }],
|
|
theme: {
|
|
extend: {
|
|
keyframes: {
|
|
one: { to: { transform: 'rotate(360deg)' } },
|
|
two: { to: { transform: 'scale(1.23)' } },
|
|
},
|
|
animation: {
|
|
multiple: 'one 2s, two 3s',
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
return run('@tailwind utilities', config).then((result) => {
|
|
expect(result.css).toMatchFormattedCss(css`
|
|
@keyframes one {
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
@keyframes two {
|
|
to {
|
|
transform: scale(1.23);
|
|
}
|
|
}
|
|
.animate-multiple {
|
|
animation: 2s one, 3s two;
|
|
}
|
|
`)
|
|
})
|
|
})
|
|
|
|
test('with dots in the name', () => {
|
|
let config = {
|
|
content: [
|
|
{
|
|
raw: html`
|
|
<div class="animate-zoom-0.5"></div>
|
|
<div class="animate-zoom-1.5"></div>
|
|
`,
|
|
},
|
|
],
|
|
theme: {
|
|
extend: {
|
|
keyframes: {
|
|
'zoom-0.5': { to: { transform: 'scale(0.5)' } },
|
|
'zoom-1.5': { to: { transform: 'scale(1.5)' } },
|
|
},
|
|
animation: {
|
|
'zoom-0.5': 'zoom-0.5 2s',
|
|
'zoom-1.5': 'zoom-1.5 2s',
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
return run('@tailwind utilities', config).then((result) => {
|
|
expect(result.css).toMatchFormattedCss(css`
|
|
@keyframes zoom-0\.5 {
|
|
to {
|
|
transform: scale(0.5);
|
|
}
|
|
}
|
|
|
|
.animate-zoom-0\.5 {
|
|
animation: 2s zoom-0\.5;
|
|
}
|
|
|
|
@keyframes zoom-1\.5 {
|
|
to {
|
|
transform: scale(1.5);
|
|
}
|
|
}
|
|
|
|
.animate-zoom-1\.5 {
|
|
animation: 2s zoom-1\.5;
|
|
}
|
|
`)
|
|
})
|
|
})
|
|
|
|
test('with dots in the name and prefix', () => {
|
|
let config = {
|
|
prefix: 'tw-',
|
|
content: [
|
|
{
|
|
raw: html`
|
|
<div class="tw-animate-zoom-.5"></div>
|
|
<div class="tw-animate-zoom-1.5"></div>
|
|
`,
|
|
},
|
|
],
|
|
theme: {
|
|
extend: {
|
|
keyframes: {
|
|
'zoom-.5': { to: { transform: 'scale(0.5)' } },
|
|
'zoom-1.5': { to: { transform: 'scale(1.5)' } },
|
|
},
|
|
animation: {
|
|
'zoom-.5': 'zoom-.5 2s',
|
|
'zoom-1.5': 'zoom-1.5 2s',
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
return run('@tailwind utilities', config).then((result) => {
|
|
expect(result.css).toMatchFormattedCss(css`
|
|
@keyframes tw-zoom-\.5 {
|
|
to {
|
|
transform: scale(0.5);
|
|
}
|
|
}
|
|
.tw-animate-zoom-\.5 {
|
|
animation: 2s tw-zoom-\.5;
|
|
}
|
|
@keyframes tw-zoom-1\.5 {
|
|
to {
|
|
transform: scale(1.5);
|
|
}
|
|
}
|
|
.tw-animate-zoom-1\.5 {
|
|
animation: 2s tw-zoom-1\.5;
|
|
}
|
|
`)
|
|
})
|
|
})
|
|
|
|
test('special character prefixes are escaped in animation names', () => {
|
|
let config = {
|
|
prefix: '@',
|
|
content: [{ raw: `<div class="@animate-one"></div>` }],
|
|
theme: {
|
|
extend: {
|
|
keyframes: {
|
|
one: { to: { transform: 'rotate(360deg)' } },
|
|
},
|
|
animation: {
|
|
one: 'one 2s',
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
return run('@tailwind utilities', config).then((result) => {
|
|
expect(result.css).toMatchFormattedCss(css`
|
|
@keyframes \@one {
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
.\@animate-one {
|
|
animation: 2s \@one;
|
|
}
|
|
`)
|
|
})
|
|
})
|