aliaset
Version:
twind monorepo
218 lines (186 loc) • 7.96 kB
text/typescript
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;
}
-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 {
bg-white;
border: 3px solid red;
text-black;
}
html,
body,
#__next {
: 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`
components {
.select2-dropdown {
rounded-b-lg shadow-md;
}
.select2-search {
border border-gray-300 rounded;
}
.select2-results__group {
text-lg font-bold text-gray-900;
}
/* ... */
}
/* rules with base are not sorted */
h1 {
text-2xl;
}
h2 {
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`
url(//fonts.googleapis.com/css?family=Open+Sans);
url(https://fonts.googleapis.com/css?family=Tangerine:400,300italic,600);
-face {
font-family: 'MyWebFont';
src:
url('myfont.woff2') format('woff2'),
url('myfont.woff') format('woff'),
url('myfont.ttf') format('truetype');
}
-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(`
print {
main {
height: auto;
}
}
`)
assert.deepEqual(tw.target, ['/*!27wr28,v*/@media print{main{height:auto}}'])
})