import { run, html, css, defaults } from './util/run' test('custom user-land utilities', () => { let config = { content: [ { raw: html`
`, }, ], corePlugins: { preflight: false }, theme: {}, plugins: [], } let input = css` @layer utilities { .align-banana { text-align: banana; } } @tailwind base; @tailwind components; @tailwind utilities; @layer utilities { .align-chocolate { text-align: chocolate; } } ` return run(input, config).then((result) => { expect(result.css).toMatchFormattedCss(css` ${defaults} .uppercase { text-transform: uppercase; } .align-banana { text-align: banana; } .hover\:align-banana:hover { text-align: banana; } .focus\:hover\:align-chocolate:hover:focus { text-align: chocolate; } `) }) }) test('comments can be used inside layers without crashing', () => { let config = { content: [ { raw: html`
`, }, ], corePlugins: { preflight: false }, theme: {}, plugins: [], } let input = css` @tailwind base; @tailwind components; @tailwind utilities; @layer base { /* Important base */ div { background-color: #bada55; } } @layer utilities { /* Important utility */ .important-utility { text-align: banana; } } @layer components { /* Important component */ .important-component { text-align: banana; } } ` return run(input, config).then((result) => { expect(result.css).toMatchFormattedCss(css` /* Important base */ div { background-color: #bada55; } ${defaults} /* Important component */ .important-component { text-align: banana; } /* Important utility */ .important-utility { text-align: banana; } `) }) }) test('comments can be used inside layers (with important) without crashing', () => { let config = { important: true, content: [ { raw: html`
`, }, ], corePlugins: { preflight: false }, theme: {}, plugins: [], } let input = css` @tailwind base; @tailwind components; @tailwind utilities; @layer base { /* Important base */ div { background-color: #bada55; } } @layer utilities { /* Important utility */ .important-utility { text-align: banana; } } @layer components { /* Important component */ .important-component { text-align: banana; } } ` return run(input, config).then((result) => { expect(result.css).toMatchFormattedCss(css` /* Important base */ div { background-color: #bada55; } ${defaults} /* Important component */ .important-component { text-align: banana; } /* Important utility */ .important-utility { text-align: banana !important; } `) }) }) test('layers are grouped and inserted at the matching @tailwind rule', () => { let config = { content: [ { raw: html`
` }, ], plugins: [ function ({ addBase, addComponents, addUtilities }) { addBase({ body: { margin: 0 } }) addComponents({ '.input': { background: 'white' }, }) addUtilities({ '.float-squirrel': { float: 'squirrel' }, }) }, ], corePlugins: { preflight: false }, } let input = css` @layer vanilla { strong { font-weight: medium; } } @tailwind base; @tailwind components; @tailwind utilities; @layer components { .btn { background: blue; } } @layer utilities { .align-banana { text-align: banana; } } @layer base { h1 { font-weight: bold; } } @layer components { .card { border-radius: 12px; } } @layer base { p { font-weight: normal; } } @layer utilities { .align-sandwich { text-align: sandwich; } } @layer chocolate { a { text-decoration: underline; } } ` expect.assertions(2) return run(input, config).then((result) => { expect(result.warnings().length).toBe(0) expect(result.css).toMatchFormattedCss(css` @layer vanilla { strong { font-weight: medium; } } body { margin: 0; } h1 { font-weight: bold; } p { font-weight: normal; } ${defaults} .input { background: white; } .btn { background: blue; } .card { border-radius: 12px; } .float-squirrel { float: squirrel; } .align-banana { text-align: banana; } .align-sandwich { text-align: sandwich; } @layer chocolate { a { text-decoration: underline; } } `) }) }) it('should keep `@supports` rules inside `@layer`s', () => { let config = { content: [{ raw: html`
` }], plugins: [], } let input = css` @tailwind utilities; @layer utilities { .test { --tw-test: 1; } @supports (backdrop-filter: blur(1px)) { .test { --tw-test: 0.9; } } } ` return run(input, config).then((result) => { return expect(result.css).toMatchFormattedCss(css` .test { --tw-test: 1; } @supports (backdrop-filter: blur(1px)) { .test { --tw-test: 0.9; } } `) }) })