vanilla-extractの調査
ドキュメントTOPで書かれているvanilla-extractの強み
- Type-safe theming
- Variables, the way they were intended
- Organise your styles with ease
- Generate real stylesheets
2個めのVariables, the way they were intended
の書き方がよく分からぬ・・・
import { style, createVar } from '@vanilla-extract/css';
const shadowColor = createVar();
export const shadow = style({
boxShadow: `0 0 10px ${shadowColor}`,
selectors: {
'.light &': {
vars: { [shadowColor]: 'black' }
},
'.dark &': {
vars: { [shadowColor]: 'white' }
},
}
});
一旦先に進む
vanilla-extractはスタイルをexport/importすることによってバンドル時に良い感じにcssファイルに変換されるようだ
ゼロランタイムのやつはだいたいそんな感じなのかな?
csstypeなんてものがあるのか
vanilla-extractのコードと変換後のコードの比較がこうやって並べてくれているのわかりやすい
そしてglobalStyleそんな感じで使えるのね。
CSS Variablesにも型を付けられるの便利〜
2個めのVariables, the way they were intendedの書き方のヒント1
後はselectorsさえ理解出来れば完全に理解できる
Selectorsでた
vanilla-extractにはシンプルなSelectorsと複雑なSelectorsの2種類があるようだ。
Variables, the way they were intendedの例は複雑なSelectorsが使用されていたのね
import { style } from '@vanilla-extract/css';
const link = style({
selectors: {
'&:hover:not(:active)': {
border: '2px solid aquamarine'
},
'nav li > &': {
textDecoration: 'underline'
}
}
});
ここの例はlinkを渡される(&で表現される)タグ自身の:hover:not(:active)
や直系の親がliでnavで括られていたらtextDecoration: 'underline'
を適用していたりするのね。
<nav>
<ul>
<li>
<a class={link}>sample</a>
</li>
</ul>
</nav>
完全に理解した(うまく説明は出来ない)
これでVariables, the way they were intendedのコードが理解できる?
import { style, createVar } from '@vanilla-extract/css';
const shadowColor = createVar();
export const shadow = style({
boxShadow: `0 0 10px ${shadowColor}`,
selectors: {
'.light &': {
vars: { [shadowColor]: 'black' }
},
'.dark &': {
vars: { [shadowColor]: 'white' }
},
}
});
本来はlightかdarkは固定値ではなくprospで渡したりする(と思われる)。
<div class={`.light ${shadow}`}></div>
.light .styles_myStyle__1hiof570 {
--global-variable__f1kfgw: white;
}
.styles_myStyle__1hiof570 {
boxShadow: '0 0 10px white',
}
的な感じかな?
import { style } from '@vanilla-extract/css';
const link = style({
selectors: {
'&:hover:not(:active)': {
border: '2px solid aquamarine'
},
'nav li > &': {
textDecoration: 'underline'
}
}
});
上の例はあくまでlinkが渡されるタグに対してのスタイリングになっている。
対して下の例ではlinkが渡されたタグの子に対してアプローチしようとしている。
それは駄目だよってことね。
const link = style({
selectors: {
'& a[href]': {
color: red
},
'& ~ div > .otherClass': {
color: blue
}
}
});
globalStyle
を使うとlinkが渡されたタグの子に対してアプローチできちまうのかーい
一貫してくれた方がわかりやすかったぞーい
やってることは理解できるが、自分で使おうってならなさそうw
あ、この時これ使えばいいや〜んってなれなさそう・・・どんな時に嬉しいんだろうか
vanilla-extractのドキュメントを構成しているスタイルの設計がとても勉強になる
特にcreateVarとcreateGlobalTheme
prefers-color-schemeなるものが・・・
これでダークモードとかも出来そう〜(vanilla-extract関係ないが)