import { assert, test, afterEach } from 'vitest' import presetTailwind from '@twind/preset-tailwind' import { setup, tw, twind, virtual, injectGlobal } from '..' setup({ presets: [presetTailwind({ disablePreflight: true })], }) afterEach(() => tw.clear()) test('inject global styles', () => { tw('underline') injectGlobal` * { box-sizing: border-box; } @font-face { font-family: 'Patrick Hand SC'; font-style: normal; font-weight: 400; src: local('Patrick Hand SC'), local('PatrickHandSC-Regular'), url(https://fonts.gstatic.com/s/patrickhandsc/v4/OYFWCgfCR-7uHIovjUZXsZ71Uis0Qeb9Gqo8IZV7ckE.woff2) format('woff2'); unicode-range: U+0100-024f, U+1-1eff, U+20a0-20ab, U+20ad-20cf, U+2c60-2c7f, U+A720-A7FF; } ` tw('shadow') assert.deepEqual(tw.target, [ "/*!0,0*/@font-face{font-family:'Patrick Hand SC';font-style:normal;font-weight:400;src:local('Patrick Hand SC'), local('PatrickHandSC-Regular'), url(https://fonts.gstatic.com/s/patrickhandsc/v4/OYFWCgfCR-7uHIovjUZXsZ71Uis0Qeb9Gqo8IZV7ckE.woff2) format('woff2');unicode-range:U+0100-024f, U+1-1eff, U+20a0-20ab, U+20ad-20cf, U+2c60-2c7f, U+A720-A7FF}", '/*!0,1v*/*,::before,::after,::backdrop{--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}', '/*!27wr28,y*/*{box-sizing:border-box}', '/*!dbgidc,u,shadow*/.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1), 0 1px 2px -1px rgba(0,0,0,0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}', '/*!dbgidc,11,underline*/.underline{text-decoration-line:underline}', ]) }) test('inject global styles using custom tw', () => { const tw$ = twind( { presets: [presetTailwind({ disablePreflight: true })], }, virtual(), ) tw$('underline') const inject = injectGlobal.bind(tw$) inject` :root > body { @apply bg-white; border: 3px solid red; @apply text-black; } html, body, #__next { @apply: h-screen w-screen p-0 m-0 overflow-x-hidden overflow-y-auto; font-size: 14px; } * { scrollbar-color: theme(colors.gray.500); &::-webkit-scrollbar, & scrollbar { width: 1rem; height: 1rem; } } ` tw$('shadow') assert.deepEqual(tw$.target, [ '*,::before,::after,::backdrop{--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}', ':root > body{border:3px solid red}', ':root > body{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}', ':root > body{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}', 'html,body,#__next{font-size:14px}', 'html,body,#__next{height:100vh;width:100vw;padding:0px;margin:0px;overflow-x:hidden;overflow-y:auto}', '*{scrollbar-color:#6b7280}', '*::-webkit-scrollbar,* scrollbar{width:1rem;height:1rem}', '.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1), 0 1px 2px -1px rgba(0,0,0,0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}', '.underline{text-decoration-line:underline}', ]) assert.lengthOf(tw.target as string[], 0) }) test('layers', () => { injectGlobal` @layer components { .select2-dropdown { @apply rounded-b-lg shadow-md; } .select2-search { @apply border border-gray-300 rounded; } .select2-results__group { @apply text-lg font-bold text-gray-900; } /* ... */ } /* rules with base are not sorted */ h1 { @apply text-2xl; } h2 { @apply text-xl; } /* ... */ ` assert.deepEqual(tw.target, [ '/*!0,1v*/*,::before,::after,::backdrop{--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}', '/*!27wr28,0*/h1{font-size:1.5rem;line-height:2rem}', '/*!27wr28,0*/h2{font-size:1.25rem;line-height:1.75rem}', '/*!4fti4g,0*/.select2-dropdown{border-bottom-left-radius:0.5rem;border-bottom-right-radius:0.5rem;--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}', '/*!4fti4g,0*/.select2-search{border-width:1px;--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity));border-radius:0.25rem}', '/*!4fti4g,0*/.select2-results__group{font-size:1.125rem;line-height:1.75rem;font-weight:700;--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}', ]) }) test('multiple @font-face and @import using template literal', () => { injectGlobal` @import url(//fonts.googleapis.com/css?family=Open+Sans); @import url(https://fonts.googleapis.com/css?family=Tangerine:400,300italic,600); @font-face { font-family: 'MyWebFont'; src: url('myfont.woff2') format('woff2'), url('myfont.woff') format('woff'), url('myfont.ttf') format('truetype'); } @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 400; src: local('Roboto'), local('Roboto-Regular'), url(fonts/roboto-v18-latin-regular.woff2) format('woff2'), url(fonts/roboto-v18-latin-regular.woff) format('woff'); } ` assert.deepEqual(tw.target, [ '/*!-1,0*/@import url(//fonts.googleapis.com/css?family=Open+Sans)', '/*!-1,0*/@import url(https://fonts.googleapis.com/css?family=Tangerine:400,300italic,600)', "/*!0,0*/@font-face{font-family:'MyWebFont';src:url('myfont.woff2') format('woff2'), url('myfont.woff') format('woff'), url('myfont.ttf') format('truetype')}", "/*!0,0*/@font-face{font-family:'Roboto';font-style:normal;font-weight:400;src:local('Roboto'), local('Roboto-Regular'), url(fonts/roboto-v18-latin-regular.woff2) format('woff2'), url(fonts/roboto-v18-latin-regular.woff) format('woff')}", ]) }) test('multiple @font-face and @import using object', () => { injectGlobal({ '@import': [ 'url(//fonts.googleapis.com/css?family=Open+Sans)', 'url(https://fonts.googleapis.com/css?family=Tangerine:400,300italic,600)', ], '@font-face': [ { fontFamily: "'MyWebFont'", src: [ "url('myfont.woff2') format('woff2')", "url('myfont.woff') format('woff')", "url('myfont.ttf') format('truetype')", ].join(','), }, { fontFamily: "'Roboto'", fontStyle: 'normal', fontWeight: '400', src: [ "local('Roboto')", "local('Roboto-Regular')", "url(fonts/roboto-v18-latin-regular.woff2) format('woff2')", "url(fonts/roboto-v18-latin-regular.woff) format('woff')", ].join(','), }, ], }) assert.deepEqual(tw.target, [ '/*!-1,0*/@import url(//fonts.googleapis.com/css?family=Open+Sans)', '/*!-1,0*/@import url(https://fonts.googleapis.com/css?family=Tangerine:400,300italic,600)', "/*!0,0*/@font-face{font-family:'MyWebFont';src:url('myfont.woff2') format('woff2'),url('myfont.woff') format('woff'),url('myfont.ttf') format('truetype')}", "/*!0,0*/@font-face{font-family:'Roboto';font-style:normal;font-weight:400;src:local('Roboto'),local('Roboto-Regular'),url(fonts/roboto-v18-latin-regular.woff2) format('woff2'),url(fonts/roboto-v18-latin-regular.woff) format('woff')}", ]) }) test('@media print', () => { injectGlobal(` @media print { main { height: auto; } } `) assert.deepEqual(tw.target, ['/*!27wr28,v*/@media print{main{height:auto}}']) })