aliaset
Version:
twind monorepo
48 lines (38 loc) • 1.46 kB
text/typescript
import type { Variant } from '@twind/core'
import { normalize } from '@twind/core'
const variants: Variant[] = [
['hocus', '&:hover,&:focus-visible'],
[
'((group|peer)(~[^-]+)?)-hocus',
({ 1: $1 }, { e, h }) =>
// we could you `:is(:hover,:focus-visible)` but browser support is not so good ATM (2022-02)
// https://caniuse.com/css-matches-pseudo
['hover', 'focus-visible']
.map((state) => `:merge(.${e(h($1))}):${state}${$1[0] == 'p' ? '~' : ' '}&`)
.join(','),
],
// - `dir-rtl` -> `:dir(rtl)`
// - `lang-en` -> `:lang(en)`
['(dir|lang)-', ({ 1: $1, $$ }) => `&:${$1}(${$$})`],
// - `not-hover` -> `:not(:hover)`
// - `not-[lang]` -> `:not([lang])`
['not-([a-z-]+|\\[.+\\])', ({ 1: $1 }) => `&:not(${($1[0] == '[' ? '' : ':') + $1})`],
// Selectors
// - `children:underline` -> `children:underline > *`
['children', '&>*'],
['siblings', '&~*'],
['sibling', '&+*'],
['override', '&&'],
// Attribute selector
// `[lang]:underline` -> `[lang]:underline[lang]`
['\\[.+]', (match) => '&' + match.input],
// Pseudo Elements using double colon (`first-letter::underline`) as well
['([a-z-]+):', ({ 1: $1 }) => '&::' + $1],
// - `&~span:underline` -> `&~span:underline ~ span`
// - `&+span:underline`
// - `&>span:underline`
// - `&>*:underline`
// - `&_span:underline` -> `&_span:underline span`
[/&/, (match) => normalize(match.input)],
]
export default variants